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