xref: /openbmc/linux/drivers/scsi/aic7xxx/aic7xxx_inline.h (revision be0d67680d524981dd65c661efe3c9cbd52a684f)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * Inline routines shareable across OS platforms.
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * Copyright (c) 1994-2001 Justin T. Gibbs.
51da177e4SLinus Torvalds  * Copyright (c) 2000-2001 Adaptec Inc.
61da177e4SLinus Torvalds  * All rights reserved.
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  * Redistribution and use in source and binary forms, with or without
91da177e4SLinus Torvalds  * modification, are permitted provided that the following conditions
101da177e4SLinus Torvalds  * are met:
111da177e4SLinus Torvalds  * 1. Redistributions of source code must retain the above copyright
121da177e4SLinus Torvalds  *    notice, this list of conditions, and the following disclaimer,
131da177e4SLinus Torvalds  *    without modification.
141da177e4SLinus Torvalds  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
151da177e4SLinus Torvalds  *    substantially similar to the "NO WARRANTY" disclaimer below
161da177e4SLinus Torvalds  *    ("Disclaimer") and any redistribution must be conditioned upon
171da177e4SLinus Torvalds  *    including a substantially similar Disclaimer requirement for further
181da177e4SLinus Torvalds  *    binary redistribution.
191da177e4SLinus Torvalds  * 3. Neither the names of the above-listed copyright holders nor the names
201da177e4SLinus Torvalds  *    of any contributors may be used to endorse or promote products derived
211da177e4SLinus Torvalds  *    from this software without specific prior written permission.
221da177e4SLinus Torvalds  *
231da177e4SLinus Torvalds  * Alternatively, this software may be distributed under the terms of the
241da177e4SLinus Torvalds  * GNU General Public License ("GPL") version 2 as published by the Free
251da177e4SLinus Torvalds  * Software Foundation.
261da177e4SLinus Torvalds  *
271da177e4SLinus Torvalds  * NO WARRANTY
281da177e4SLinus Torvalds  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
291da177e4SLinus Torvalds  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
301da177e4SLinus Torvalds  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
311da177e4SLinus Torvalds  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
321da177e4SLinus Torvalds  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
331da177e4SLinus Torvalds  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
341da177e4SLinus Torvalds  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
351da177e4SLinus Torvalds  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
361da177e4SLinus Torvalds  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
371da177e4SLinus Torvalds  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
381da177e4SLinus Torvalds  * POSSIBILITY OF SUCH DAMAGES.
391da177e4SLinus Torvalds  *
401da177e4SLinus Torvalds  * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#43 $
411da177e4SLinus Torvalds  *
421da177e4SLinus Torvalds  * $FreeBSD$
431da177e4SLinus Torvalds  */
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds #ifndef _AIC7XXX_INLINE_H_
461da177e4SLinus Torvalds #define _AIC7XXX_INLINE_H_
471da177e4SLinus Torvalds 
481da177e4SLinus Torvalds /************************* Sequencer Execution Control ************************/
49*be0d6768SDenys Vlasenko void ahc_pause_bug_fix(struct ahc_softc *ahc);
50*be0d6768SDenys Vlasenko int  ahc_is_paused(struct ahc_softc *ahc);
51*be0d6768SDenys Vlasenko void ahc_pause(struct ahc_softc *ahc);
52*be0d6768SDenys Vlasenko void ahc_unpause(struct ahc_softc *ahc);
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds /*********************** Untagged Transaction Routines ************************/
551da177e4SLinus Torvalds static __inline void	ahc_freeze_untagged_queues(struct ahc_softc *ahc);
561da177e4SLinus Torvalds static __inline void	ahc_release_untagged_queues(struct ahc_softc *ahc);
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds /*
591da177e4SLinus Torvalds  * Block our completion routine from starting the next untagged
601da177e4SLinus Torvalds  * transaction for this target or target lun.
611da177e4SLinus Torvalds  */
621da177e4SLinus Torvalds static __inline void
631da177e4SLinus Torvalds ahc_freeze_untagged_queues(struct ahc_softc *ahc)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds 	if ((ahc->flags & AHC_SCB_BTT) == 0)
661da177e4SLinus Torvalds 		ahc->untagged_queue_lock++;
671da177e4SLinus Torvalds }
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds /*
701da177e4SLinus Torvalds  * Allow the next untagged transaction for this target or target lun
711da177e4SLinus Torvalds  * to be executed.  We use a counting semaphore to allow the lock
721da177e4SLinus Torvalds  * to be acquired recursively.  Once the count drops to zero, the
731da177e4SLinus Torvalds  * transaction queues will be run.
741da177e4SLinus Torvalds  */
751da177e4SLinus Torvalds static __inline void
761da177e4SLinus Torvalds ahc_release_untagged_queues(struct ahc_softc *ahc)
771da177e4SLinus Torvalds {
781da177e4SLinus Torvalds 	if ((ahc->flags & AHC_SCB_BTT) == 0) {
791da177e4SLinus Torvalds 		ahc->untagged_queue_lock--;
801da177e4SLinus Torvalds 		if (ahc->untagged_queue_lock == 0)
811da177e4SLinus Torvalds 			ahc_run_untagged_queues(ahc);
821da177e4SLinus Torvalds 	}
831da177e4SLinus Torvalds }
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds /************************** Memory mapping routines ***************************/
86*be0d6768SDenys Vlasenko struct ahc_dma_seg *
871da177e4SLinus Torvalds 	ahc_sg_bus_to_virt(struct scb *scb,
881da177e4SLinus Torvalds 			   uint32_t sg_busaddr);
89*be0d6768SDenys Vlasenko uint32_t
901da177e4SLinus Torvalds 	ahc_sg_virt_to_bus(struct scb *scb,
911da177e4SLinus Torvalds 			   struct ahc_dma_seg *sg);
92*be0d6768SDenys Vlasenko uint32_t
931da177e4SLinus Torvalds 	ahc_hscb_busaddr(struct ahc_softc *ahc, u_int index);
94*be0d6768SDenys Vlasenko void	ahc_sync_scb(struct ahc_softc *ahc,
951da177e4SLinus Torvalds 		     struct scb *scb, int op);
96*be0d6768SDenys Vlasenko void	ahc_sync_sglist(struct ahc_softc *ahc,
971da177e4SLinus Torvalds 			struct scb *scb, int op);
98*be0d6768SDenys Vlasenko uint32_t
991da177e4SLinus Torvalds 	ahc_targetcmd_offset(struct ahc_softc *ahc,
1001da177e4SLinus Torvalds 			     u_int index);
1011da177e4SLinus Torvalds 
1021da177e4SLinus Torvalds /******************************** Debugging ***********************************/
1031da177e4SLinus Torvalds static __inline char *ahc_name(struct ahc_softc *ahc);
1041da177e4SLinus Torvalds 
1051da177e4SLinus Torvalds static __inline char *
1061da177e4SLinus Torvalds ahc_name(struct ahc_softc *ahc)
1071da177e4SLinus Torvalds {
1081da177e4SLinus Torvalds 	return (ahc->name);
1091da177e4SLinus Torvalds }
1101da177e4SLinus Torvalds 
111b1c11812SJoe Perches /*********************** Miscellaneous Support Functions ***********************/
1121da177e4SLinus Torvalds 
113*be0d6768SDenys Vlasenko void	ahc_update_residual(struct ahc_softc *ahc,
1141da177e4SLinus Torvalds 			    struct scb *scb);
115*be0d6768SDenys Vlasenko struct ahc_initiator_tinfo *
1161da177e4SLinus Torvalds 	ahc_fetch_transinfo(struct ahc_softc *ahc,
1171da177e4SLinus Torvalds 			    char channel, u_int our_id,
1181da177e4SLinus Torvalds 			    u_int remote_id,
1191da177e4SLinus Torvalds 			    struct ahc_tmode_tstate **tstate);
120*be0d6768SDenys Vlasenko uint16_t
1211da177e4SLinus Torvalds 	ahc_inw(struct ahc_softc *ahc, u_int port);
122*be0d6768SDenys Vlasenko void	ahc_outw(struct ahc_softc *ahc, u_int port,
1231da177e4SLinus Torvalds 		 u_int value);
124*be0d6768SDenys Vlasenko uint32_t
1251da177e4SLinus Torvalds 	ahc_inl(struct ahc_softc *ahc, u_int port);
126*be0d6768SDenys Vlasenko void	ahc_outl(struct ahc_softc *ahc, u_int port,
1271da177e4SLinus Torvalds 		 uint32_t value);
128*be0d6768SDenys Vlasenko uint64_t
1291da177e4SLinus Torvalds 	ahc_inq(struct ahc_softc *ahc, u_int port);
130*be0d6768SDenys Vlasenko void	ahc_outq(struct ahc_softc *ahc, u_int port,
1311da177e4SLinus Torvalds 		 uint64_t value);
132*be0d6768SDenys Vlasenko struct scb*
1331da177e4SLinus Torvalds 	ahc_get_scb(struct ahc_softc *ahc);
134*be0d6768SDenys Vlasenko void	ahc_free_scb(struct ahc_softc *ahc, struct scb *scb);
135*be0d6768SDenys Vlasenko struct scb *
136*be0d6768SDenys Vlasenko 	ahc_lookup_scb(struct ahc_softc *ahc, u_int tag);
137*be0d6768SDenys Vlasenko void	ahc_swap_with_next_hscb(struct ahc_softc *ahc,
1381da177e4SLinus Torvalds 				struct scb *scb);
139*be0d6768SDenys Vlasenko void	ahc_queue_scb(struct ahc_softc *ahc, struct scb *scb);
140*be0d6768SDenys Vlasenko struct scsi_sense_data *
1411da177e4SLinus Torvalds 	ahc_get_sense_buf(struct ahc_softc *ahc,
1421da177e4SLinus Torvalds 			  struct scb *scb);
143*be0d6768SDenys Vlasenko uint32_t
1441da177e4SLinus Torvalds 	ahc_get_sense_bufaddr(struct ahc_softc *ahc,
1451da177e4SLinus Torvalds 			      struct scb *scb);
1461da177e4SLinus Torvalds 
1471da177e4SLinus Torvalds /************************** Interrupt Processing ******************************/
148*be0d6768SDenys Vlasenko void	ahc_sync_qoutfifo(struct ahc_softc *ahc, int op);
149*be0d6768SDenys Vlasenko void	ahc_sync_tqinfifo(struct ahc_softc *ahc, int op);
150*be0d6768SDenys Vlasenko u_int	ahc_check_cmdcmpltqueues(struct ahc_softc *ahc);
151*be0d6768SDenys Vlasenko int	ahc_intr(struct ahc_softc *ahc);
1521da177e4SLinus Torvalds 
1531da177e4SLinus Torvalds #endif  /* _AIC7XXX_INLINE_H_ */
154