aic7xxx.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:40k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Core definitions and data structures shareable across OS platforms.
  3.  *
  4.  * Copyright (c) 1994-2001 Justin T. Gibbs.
  5.  * Copyright (c) 2000-2001 Adaptec Inc.
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions, and the following disclaimer,
  13.  *    without modification.
  14.  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  15.  *    substantially similar to the "NO WARRANTY" disclaimer below
  16.  *    ("Disclaimer") and any redistribution must be conditioned upon
  17.  *    including a substantially similar Disclaimer requirement for further
  18.  *    binary redistribution.
  19.  * 3. Neither the names of the above-listed copyright holders nor the names
  20.  *    of any contributors may be used to endorse or promote products derived
  21.  *    from this software without specific prior written permission.
  22.  *
  23.  * Alternatively, this software may be distributed under the terms of the
  24.  * GNU General Public License ("GPL") version 2 as published by the Free
  25.  * Software Foundation.
  26.  *
  27.  * NO WARRANTY
  28.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  29.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  30.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  31.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  32.  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  36.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  37.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  38.  * POSSIBILITY OF SUCH DAMAGES.
  39.  *
  40.  * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#34 $
  41.  *
  42.  * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.h,v 1.30 2000/11/10 20:13:40 gibbs Exp $
  43.  */
  44. #ifndef _AIC7XXX_H_
  45. #define _AIC7XXX_H_
  46. /* Register Definitions */
  47. #include "aic7xxx_reg.h"
  48. /************************* Forward Declarations *******************************/
  49. struct ahc_platform_data;
  50. struct scb_platform_data;
  51. /****************************** Useful Macros *********************************/
  52. #ifndef MAX
  53. #define MAX(a,b) (((a) > (b)) ? (a) : (b))
  54. #endif
  55. #ifndef MIN
  56. #define MIN(a,b) (((a) < (b)) ? (a) : (b))
  57. #endif
  58. #ifndef TRUE
  59. #define TRUE 1
  60. #endif
  61. #ifndef FALSE
  62. #define FALSE 0
  63. #endif
  64. #define NUM_ELEMENTS(array) (sizeof(array) / sizeof(*array))
  65. #define ALL_CHANNELS ''
  66. #define ALL_TARGETS_MASK 0xFFFF
  67. #define INITIATOR_WILDCARD (~0)
  68. #define SCSIID_TARGET(ahc, scsiid) 
  69. (((scsiid) & ((((ahc)->features & AHC_TWIN) != 0) ? TWIN_TID : TID)) 
  70. >> TID_SHIFT)
  71. #define SCSIID_OUR_ID(scsiid) 
  72. ((scsiid) & OID)
  73. #define SCSIID_CHANNEL(ahc, scsiid) 
  74. ((((ahc)->features & AHC_TWIN) != 0) 
  75.         ? ((((scsiid) & TWIN_CHNLB) != 0) ? 'B' : 'A') 
  76.        : 'A')
  77. #define SCB_IS_SCSIBUS_B(ahc, scb) 
  78. (SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid) == 'B')
  79. #define SCB_GET_OUR_ID(scb) 
  80. SCSIID_OUR_ID((scb)->hscb->scsiid)
  81. #define SCB_GET_TARGET(ahc, scb) 
  82. SCSIID_TARGET((ahc), (scb)->hscb->scsiid)
  83. #define SCB_GET_CHANNEL(ahc, scb) 
  84. SCSIID_CHANNEL(ahc, (scb)->hscb->scsiid)
  85. #define SCB_GET_LUN(scb) 
  86. ((scb)->hscb->lun)
  87. #define SCB_GET_TARGET_OFFSET(ahc, scb)
  88. (SCB_GET_TARGET(ahc, scb) + (SCB_IS_SCSIBUS_B(ahc, scb) ? 8 : 0))
  89. #define SCB_GET_TARGET_MASK(ahc, scb) 
  90. (0x01 << (SCB_GET_TARGET_OFFSET(ahc, scb)))
  91. #define TCL_TARGET_OFFSET(tcl) 
  92. ((((tcl) >> 4) & TID) >> 4)
  93. #define TCL_LUN(tcl) 
  94. (tcl & (AHC_NUM_LUNS - 1))
  95. #define BUILD_TCL(scsiid, lun) 
  96. ((lun) | (((scsiid) & TID) << 4))
  97. #ifndef AHC_TARGET_MODE
  98. #undef AHC_TMODE_ENABLE
  99. #define AHC_TMODE_ENABLE 0
  100. #endif
  101. /**************************** Driver Constants ********************************/
  102. /*
  103.  * The maximum number of supported targets.
  104.  */
  105. #define AHC_NUM_TARGETS 16
  106. /*
  107.  * The maximum number of supported luns.
  108.  * The identify message only supports 64 luns in SPI3.
  109.  * You can have 2^64 luns when information unit transfers are enabled,
  110.  * but it is doubtful this driver will ever support IUTs.
  111.  */
  112. #define AHC_NUM_LUNS 64
  113. /*
  114.  * The maximum transfer per S/G segment.
  115.  */
  116. #define AHC_MAXTRANSFER_SIZE  0x00ffffff /* limited by 24bit counter */
  117. /*
  118.  * The maximum amount of SCB storage in hardware on a controller.
  119.  * This value represents an upper bound.  Controllers vary in the number
  120.  * they actually support.
  121.  */
  122. #define AHC_SCB_MAX 255
  123. /*
  124.  * The maximum number of concurrent transactions supported per driver instance.
  125.  * Sequencer Control Blocks (SCBs) store per-transaction information.  Although
  126.  * the space for SCBs on the host adapter varies by model, the driver will
  127.  * page the SCBs between host and controller memory as needed.  We are limited
  128.  * to 253 because:
  129.  *  1) The 8bit nature of the RISC engine holds us to an 8bit value.
  130.  *  2) We reserve one value, 255, to represent the invalid element.
  131.  * 3) Our input queue scheme requires one SCB to always be reserved
  132.  *    in advance of queuing any SCBs.  This takes us down to 254.
  133.  * 4) To handle our output queue correctly on machines that only
  134.  *     support 32bit stores, we must clear the array 4 bytes at a
  135.  *    time.  To avoid colliding with a DMA write from the sequencer,
  136.  *    we must be sure that 4 slots are empty when we write to clear
  137.  *    the queue.  This reduces us to 253 SCBs: 1 that just completed
  138.  *    and the known three additional empty slots in the queue that
  139.  *    precede it.
  140.  */
  141. #define AHC_MAX_QUEUE 253
  142. /*
  143.  * The maximum amount of SCB storage we allocate in host memory.  This
  144.  * number should reflect the 1 additional SCB we require to handle our
  145.  * qinfifo mechanism.
  146.  */
  147. #define AHC_SCB_MAX_ALLOC (AHC_MAX_QUEUE+1)
  148. /*
  149.  * Ring Buffer of incoming target commands.
  150.  * We allocate 256 to simplify the logic in the sequencer
  151.  * by using the natural wrap point of an 8bit counter.
  152.  */
  153. #define AHC_TMODE_CMDS 256
  154. /* Reset line assertion time in us */
  155. #define AHC_BUSRESET_DELAY 250
  156. /******************* Chip Characteristics/Operating Settings  *****************/
  157. /*
  158.  * Chip Type
  159.  * The chip order is from least sophisticated to most sophisticated.
  160.  */
  161. typedef enum {
  162. AHC_NONE = 0x0000,
  163. AHC_CHIPID_MASK = 0x00FF,
  164. AHC_AIC7770 = 0x0001,
  165. AHC_AIC7850 = 0x0002,
  166. AHC_AIC7855 = 0x0003,
  167. AHC_AIC7859 = 0x0004,
  168. AHC_AIC7860 = 0x0005,
  169. AHC_AIC7870 = 0x0006,
  170. AHC_AIC7880 = 0x0007,
  171. AHC_AIC7895 = 0x0008,
  172. AHC_AIC7895C = 0x0009,
  173. AHC_AIC7890 = 0x000a,
  174. AHC_AIC7896 = 0x000b,
  175. AHC_AIC7892 = 0x000c,
  176. AHC_AIC7899 = 0x000d,
  177. AHC_VL = 0x0100, /* Bus type VL */
  178. AHC_EISA = 0x0200, /* Bus type EISA */
  179. AHC_PCI = 0x0400, /* Bus type PCI */
  180. AHC_BUS_MASK = 0x0F00
  181. } ahc_chip;
  182. /*
  183.  * Features available in each chip type.
  184.  */
  185. typedef enum {
  186. AHC_FENONE = 0x00000,
  187. AHC_ULTRA = 0x00001, /* Supports 20MHz Transfers */
  188. AHC_ULTRA2 = 0x00002, /* Supports 40MHz Transfers */
  189. AHC_WIDE   = 0x00004, /* Wide Channel */
  190. AHC_TWIN = 0x00008, /* Twin Channel */
  191. AHC_MORE_SRAM = 0x00010, /* 80 bytes instead of 64 */
  192. AHC_CMD_CHAN = 0x00020, /* Has a Command DMA Channel */
  193. AHC_QUEUE_REGS = 0x00040, /* Has Queue management registers */
  194. AHC_SG_PRELOAD = 0x00080, /* Can perform auto-SG preload */
  195. AHC_SPIOCAP = 0x00100, /* Has a Serial Port I/O Cap Register */
  196. AHC_MULTI_TID = 0x00200, /* Has bitmask of TIDs for select-in */
  197. AHC_HS_MAILBOX = 0x00400, /* Has HS_MAILBOX register */
  198. AHC_DT = 0x00800, /* Double Transition transfers */
  199. AHC_NEW_TERMCTL = 0x01000, /* Newer termination scheme */
  200. AHC_MULTI_FUNC = 0x02000, /* Multi-Function Twin Channel Device */
  201. AHC_LARGE_SCBS = 0x04000, /* 64byte SCBs */
  202. AHC_AUTORATE = 0x08000, /* Automatic update of SCSIRATE/OFFSET*/
  203. AHC_AUTOPAUSE = 0x10000, /* Automatic pause on register access */
  204. AHC_TARGETMODE = 0x20000, /* Has tested target mode support */
  205. AHC_MULTIROLE = 0x40000, /* Space for two roles at a time */
  206. AHC_REMOVABLE = 0x80000, /* Hot-Swap supported */
  207. AHC_AIC7770_FE = AHC_FENONE,
  208. /*
  209.  * The real 7850 does not support Ultra modes, but there are
  210.  * several cards that use the generic 7850 PCI ID even though
  211.  * they are using an Ultra capable chip (7859/7860).  We start
  212.  * out with the AHC_ULTRA feature set and then check the DEVSTATUS
  213.  * register to determine if the capability is really present.
  214.  */
  215. AHC_AIC7850_FE = AHC_SPIOCAP|AHC_AUTOPAUSE|AHC_TARGETMODE|AHC_ULTRA,
  216. AHC_AIC7860_FE = AHC_AIC7850_FE,
  217. AHC_AIC7870_FE = AHC_TARGETMODE,
  218. AHC_AIC7880_FE = AHC_AIC7870_FE|AHC_ULTRA,
  219. /*
  220.  * Although we have space for both the initiator and
  221.  * target roles on ULTRA2 chips, we currently disable
  222.  * the initiator role to allow multi-scsi-id target mode
  223.  * configurations.  We can only respond on the same SCSI
  224.  * ID as our initiator role if we allow initiator operation.
  225.  * At some point, we should add a configuration knob to
  226.  * allow both roles to be loaded.
  227.  */
  228. AHC_AIC7890_FE = AHC_MORE_SRAM|AHC_CMD_CHAN|AHC_ULTRA2
  229.   |AHC_QUEUE_REGS|AHC_SG_PRELOAD|AHC_MULTI_TID
  230.   |AHC_HS_MAILBOX|AHC_NEW_TERMCTL|AHC_LARGE_SCBS
  231.   |AHC_TARGETMODE,
  232. AHC_AIC7892_FE = AHC_AIC7890_FE|AHC_DT|AHC_AUTORATE|AHC_AUTOPAUSE,
  233. AHC_AIC7895_FE = AHC_AIC7880_FE|AHC_MORE_SRAM|AHC_AUTOPAUSE
  234.   |AHC_CMD_CHAN|AHC_MULTI_FUNC|AHC_LARGE_SCBS,
  235. AHC_AIC7895C_FE = AHC_AIC7895_FE|AHC_MULTI_TID,
  236. AHC_AIC7896_FE = AHC_AIC7890_FE|AHC_MULTI_FUNC,
  237. AHC_AIC7899_FE = AHC_AIC7892_FE|AHC_MULTI_FUNC
  238. } ahc_feature;
  239. /*
  240.  * Bugs in the silicon that we work around in software.
  241.  */
  242. typedef enum {
  243. AHC_BUGNONE = 0x00,
  244. /*
  245.  * On all chips prior to the U2 product line,
  246.  * the WIDEODD S/G segment feature does not
  247.  * work during scsi->HostBus transfers.
  248.  */
  249. AHC_TMODE_WIDEODD_BUG = 0x01,
  250. /*
  251.  * On the aic7890/91 Rev 0 chips, the autoflush
  252.  * feature does not work.  A manual flush of
  253.  * the DMA FIFO is required.
  254.  */
  255. AHC_AUTOFLUSH_BUG = 0x02,
  256. /*
  257.  * On many chips, cacheline streaming does not work.
  258.  */
  259. AHC_CACHETHEN_BUG = 0x04,
  260. /*
  261.  * On the aic7896/97 chips, cacheline
  262.  * streaming must be enabled.
  263.  */
  264. AHC_CACHETHEN_DIS_BUG = 0x08,
  265. /*
  266.  * PCI 2.1 Retry failure on non-empty data fifo.
  267.  */
  268. AHC_PCI_2_1_RETRY_BUG = 0x10,
  269. /*
  270.  * Controller does not handle cacheline residuals
  271.  * properly on S/G segments if PCI MWI instructions
  272.  * are allowed.
  273.  */
  274. AHC_PCI_MWI_BUG = 0x20,
  275. /*
  276.  * An SCB upload using the SCB channel's
  277.  * auto array entry copy feature may 
  278.  * corrupt data.  This appears to only
  279.  * occur on 66MHz systems.
  280.  */
  281. AHC_SCBCHAN_UPLOAD_BUG = 0x40
  282. } ahc_bug;
  283. /*
  284.  * Configuration specific settings.
  285.  * The driver determines these settings by probing the
  286.  * chip/controller's configuration.
  287.  */
  288. typedef enum {
  289. AHC_FNONE       = 0x000,
  290. AHC_PRIMARY_CHANNEL   = 0x003,/*
  291.  * The channel that should
  292.  * be probed first.
  293.  */
  294. AHC_USEDEFAULTS       = 0x004,/*
  295.  * For cards without an seeprom
  296.  * or a BIOS to initialize the chip's
  297.  * SRAM, we use the default target
  298.  * settings.
  299.  */
  300. AHC_SEQUENCER_DEBUG   = 0x008,
  301. AHC_SHARED_SRAM       = 0x010,
  302. AHC_LARGE_SEEPROM     = 0x020,/* Uses C56_66 not C46 */
  303. AHC_RESET_BUS_A       = 0x040,
  304. AHC_RESET_BUS_B       = 0x080,
  305. AHC_EXTENDED_TRANS_A  = 0x100,
  306. AHC_EXTENDED_TRANS_B  = 0x200,
  307. AHC_TERM_ENB_A       = 0x400,
  308. AHC_TERM_ENB_B       = 0x800,
  309. AHC_INITIATORROLE     = 0x1000,/*
  310.   * Allow initiator operations on
  311.   * this controller.
  312.   */
  313. AHC_TARGETROLE       = 0x2000,/*
  314.   * Allow target operations on this
  315.   * controller.
  316.   */
  317. AHC_NEWEEPROM_FMT     = 0x4000,
  318. AHC_RESOURCE_SHORTAGE = 0x8000,
  319. AHC_TQINFIFO_BLOCKED  = 0x10000,/* Blocked waiting for ATIOs */
  320. AHC_INT50_SPEEDFLEX   = 0x20000,/*
  321.    * Internal 50pin connector
  322.    * sits behind an aic3860
  323.    */
  324. AHC_SCB_BTT       = 0x40000,/*
  325.    * The busy targets table is
  326.    * stored in SCB space rather
  327.    * than SRAM.
  328.    */
  329. AHC_BIOS_ENABLED      = 0x80000,
  330. AHC_ALL_INTERRUPTS    = 0x100000,
  331. AHC_PAGESCBS       = 0x400000, /* Enable SCB paging */
  332. AHC_EDGE_INTERRUPT    = 0x800000, /* Device uses edge triggered ints */
  333. AHC_39BIT_ADDRESSING  = 0x1000000 /* Use 39 bit addressing scheme. */
  334. } ahc_flag;
  335. /************************* Hardware  SCB Definition ***************************/
  336. /*
  337.  * The driver keeps up to MAX_SCB scb structures per card in memory.  The SCB
  338.  * consists of a "hardware SCB" mirroring the fields availible on the card
  339.  * and additional information the kernel stores for each transaction.
  340.  *
  341.  * To minimize space utilization, a portion of the hardware scb stores
  342.  * different data during different portions of a SCSI transaction.
  343.  * As initialized by the host driver for the initiator role, this area
  344.  * contains the SCSI cdb (or a pointer to the  cdb) to be executed.  After
  345.  * the cdb has been presented to the target, this area serves to store
  346.  * residual transfer information and the SCSI status byte.
  347.  * For the target role, the contents of this area do not change, but
  348.  * still serve a different purpose than for the initiator role.  See
  349.  * struct target_data for details.
  350.  */
  351. /*
  352.  * Status information embedded in the shared poriton of
  353.  * an SCB after passing the cdb to the target.  The kernel
  354.  * driver will only read this data for transactions that
  355.  * complete abnormally (non-zero status byte).
  356.  */
  357. struct status_pkt {
  358. uint32_t residual_datacnt; /* Residual in the current S/G seg */
  359. uint32_t residual_sg_ptr; /* The next S/G for this transfer */
  360. uint8_t  scsi_status; /* Standard SCSI status byte */
  361. };
  362. /*
  363.  * Target mode version of the shared data SCB segment.
  364.  */
  365. struct target_data {
  366. uint32_t residual_datacnt; /* Residual in the current S/G seg */
  367. uint32_t residual_sg_ptr; /* The next S/G for this transfer */
  368. uint8_t  scsi_status; /* SCSI status to give to initiator */
  369. uint8_t  target_phases; /* Bitmap of phases to execute */
  370. uint8_t  data_phase; /* Data-In or Data-Out */
  371. uint8_t  initiator_tag; /* Initiator's transaction tag */
  372. };
  373. struct hardware_scb {
  374. /*0*/ union {
  375. /*
  376.  * If the cdb is 12 bytes or less, we embed it directly
  377.  * in the SCB.  For longer cdbs, we embed the address
  378.  * of the cdb payload as seen by the chip and a DMA
  379.  * is used to pull it in.
  380.  */
  381. uint8_t  cdb[12];
  382. uint32_t cdb_ptr;
  383. struct  status_pkt status;
  384. struct  target_data tdata;
  385. } shared_data;
  386. /*
  387.  * A word about residuals.
  388.  * The scb is presented to the sequencer with the dataptr and datacnt
  389.  * fields initialized to the contents of the first S/G element to
  390.  * transfer.  The sgptr field is initialized to the bus address for
  391.  * the S/G element that follows the first in the in core S/G array
  392.  * or'ed with the SG_FULL_RESID flag.  Sgptr may point to an invalid
  393.  * S/G entry for this transfer (single S/G element transfer with the
  394.  * first elements address and length preloaded in the dataptr/datacnt
  395.  * fields).  If no transfer is to occur, sgptr is set to SG_LIST_NULL.
  396.  * The SG_FULL_RESID flag ensures that the residual will be correctly
  397.  * noted even if no data transfers occur.  Once the data phase is entered,
  398.  * the residual sgptr and datacnt are loaded from the sgptr and the
  399.  * datacnt fields.  After each S/G element's dataptr and length are
  400.  * loaded into the hardware, the residual sgptr is advanced.  After
  401.  * each S/G element is expired, its datacnt field is checked to see
  402.  * if the LAST_SEG flag is set.  If so, SG_LIST_NULL is set in the
  403.  * residual sg ptr and the transfer is considered complete.  If the
  404.  * sequencer determines that there is a residual in the tranfer, it
  405.  * will set the SG_RESID_VALID flag in sgptr and dma the scb back into
  406.  * host memory.  To sumarize:
  407.  *
  408.  * Sequencer:
  409.  * o A residual has occurred if SG_FULL_RESID is set in sgptr,
  410.  *   or residual_sgptr does not have SG_LIST_NULL set.
  411.  *
  412.  * o We are transfering the last segment if residual_datacnt has
  413.  *   the SG_LAST_SEG flag set.
  414.  *
  415.  * Host:
  416.  * o A residual has occurred if a completed scb has the
  417.  *   SG_RESID_VALID flag set.
  418.  *
  419.  * o residual_sgptr and sgptr refer to the "next" sg entry
  420.  *   and so may point beyond the last valid sg entry for the
  421.  *   transfer.
  422.  */ 
  423. /*12*/ uint32_t dataptr;
  424. /*16*/ uint32_t datacnt; /*
  425.  * Byte 3 (numbered from 0) of
  426.  * the datacnt is really the
  427.  * 4th byte in that data address.
  428.  */
  429. /*20*/ uint32_t sgptr;
  430. #define SG_PTR_MASK 0xFFFFFFF8
  431. /*24*/ uint8_t  control; /* See SCB_CONTROL in aic7xxx.reg for details */
  432. /*25*/ uint8_t  scsiid; /* what to load in the SCSIID register */
  433. /*26*/ uint8_t  lun;
  434. /*27*/ uint8_t  tag; /*
  435.  * Index into our kernel SCB array.
  436.  * Also used as the tag for tagged I/O
  437.  */
  438. /*28*/ uint8_t  cdb_len;
  439. /*29*/ uint8_t  scsirate; /* Value for SCSIRATE register */
  440. /*30*/ uint8_t  scsioffset; /* Value for SCSIOFFSET register */
  441. /*31*/ uint8_t  next; /*
  442.  * Used for threading SCBs in the
  443.  * "Waiting for Selection" and
  444.  * "Disconnected SCB" lists down
  445.  * in the sequencer.
  446.  */
  447. /*32*/ uint8_t  cdb32[32]; /*
  448.  * CDB storage for cdbs of size
  449.  * 13->32.  We store them here
  450.  * because hardware scbs are
  451.  * allocated from DMA safe
  452.  * memory so we are guaranteed
  453.  * the controller can access
  454.  * this data.
  455.  */
  456. };
  457. /************************ Kernel SCB Definitions ******************************/
  458. /*
  459.  * Some fields of the SCB are OS dependent.  Here we collect the
  460.  * definitions for elements that all OS platforms need to include
  461.  * in there SCB definition.
  462.  */
  463. /*
  464.  * Definition of a scatter/gather element as transfered to the controller.
  465.  * The aic7xxx chips only support a 24bit length.  We use the top byte of
  466.  * the length to store additional address bits and a flag to indicate
  467.  * that a given segment terminates the transfer.  This gives us an
  468.  * addressable range of 512GB on machines with 64bit PCI or with chips
  469.  * that can support dual address cycles on 32bit PCI busses.
  470.  */
  471. struct ahc_dma_seg {
  472. uint32_t addr;
  473. uint32_t len;
  474. #define AHC_DMA_LAST_SEG 0x80000000
  475. #define AHC_SG_HIGH_ADDR_MASK 0x7F000000
  476. #define AHC_SG_LEN_MASK 0x00FFFFFF
  477. };
  478. struct sg_map_node {
  479. bus_dmamap_t  sg_dmamap;
  480. bus_addr_t  sg_physaddr;
  481. struct ahc_dma_seg*  sg_vaddr;
  482. SLIST_ENTRY(sg_map_node) links;
  483. };
  484. /*
  485.  * The current state of this SCB.
  486.  */
  487. typedef enum {
  488. SCB_FREE = 0x0000,
  489. SCB_OTHERTCL_TIMEOUT = 0x0002,/*
  490.   * Another device was active
  491.   * during the first timeout for
  492.   * this SCB so we gave ourselves
  493.   * an additional timeout period
  494.   * in case it was hogging the
  495.   * bus.
  496.           */
  497. SCB_DEVICE_RESET = 0x0004,
  498. SCB_SENSE = 0x0008,
  499. SCB_CDB32_PTR = 0x0010,
  500. SCB_RECOVERY_SCB = 0x0020,
  501. SCB_AUTO_NEGOTIATE = 0x0040,/* Negotiate to achieve goal. */
  502. SCB_NEGOTIATE = 0x0080,/* Negotiation forced for command. */
  503. SCB_ABORT = 0x1000,
  504. SCB_UNTAGGEDQ = 0x2000,
  505. SCB_ACTIVE = 0x4000,
  506. SCB_TARGET_IMMEDIATE = 0x8000
  507. } scb_flag;
  508. struct scb {
  509. struct hardware_scb  *hscb;
  510. union {
  511. SLIST_ENTRY(scb)  sle;
  512. TAILQ_ENTRY(scb)  tqe;
  513. } links;
  514. LIST_ENTRY(scb)   pending_links;
  515. ahc_io_ctx_t   io_ctx;
  516. struct ahc_softc  *ahc_softc;
  517. scb_flag   flags;
  518. #ifndef __linux__
  519. bus_dmamap_t   dmamap;
  520. #endif
  521. struct scb_platform_data *platform_data;
  522. struct sg_map_node  *sg_map;
  523. struct ahc_dma_seg   *sg_list;
  524. bus_addr_t   sg_list_phys;
  525. u_int   sg_count;/* How full ahc_dma_seg is */
  526. };
  527. struct scb_data {
  528. SLIST_HEAD(, scb) free_scbs; /*
  529.  * Pool of SCBs ready to be assigned
  530.  * commands to execute.
  531.  */
  532. struct scb *scbindex[256]; /*
  533.  * Mapping from tag to SCB.
  534.  * As tag identifiers are an
  535.  * 8bit value, we provide space
  536.  * for all possible tag values.
  537.  * Any lookups to entries at or
  538.  * above AHC_SCB_MAX_ALLOC will
  539.  * always fail.
  540.  */
  541. struct hardware_scb *hscbs; /* Array of hardware SCBs */
  542. struct scb *scbarray; /* Array of kernel SCBs */
  543. struct scsi_sense_data *sense; /* Per SCB sense data */
  544. /*
  545.  * "Bus" addresses of our data structures.
  546.  */
  547. bus_dma_tag_t  hscb_dmat; /* dmat for our hardware SCB array */
  548. bus_dmamap_t  hscb_dmamap;
  549. bus_addr_t  hscb_busaddr;
  550. bus_dma_tag_t  sense_dmat;
  551. bus_dmamap_t  sense_dmamap;
  552. bus_addr_t  sense_busaddr;
  553. bus_dma_tag_t  sg_dmat; /* dmat for our sg segments */
  554. SLIST_HEAD(, sg_map_node) sg_maps;
  555. uint8_t numscbs;
  556. uint8_t maxhscbs; /* Number of SCBs on the card */
  557. uint8_t init_level; /*
  558.  * How far we've initialized
  559.  * this structure.
  560.  */
  561. };
  562. /************************ Target Mode Definitions *****************************/
  563. /*
  564.  * Connection desciptor for select-in requests in target mode.
  565.  */
  566. struct target_cmd {
  567. uint8_t scsiid; /* Our ID and the initiator's ID */
  568. uint8_t identify; /* Identify message */
  569. uint8_t bytes[22]; /* 
  570.  * Bytes contains any additional message
  571.  * bytes terminated by 0xFF.  The remainder
  572.  * is the cdb to execute.
  573.  */
  574. uint8_t cmd_valid; /*
  575.  * When a command is complete, the firmware
  576.  * will set cmd_valid to all bits set.
  577.  * After the host has seen the command,
  578.  * the bits are cleared.  This allows us
  579.  * to just peek at host memory to determine
  580.  * if more work is complete. cmd_valid is on
  581.  * an 8 byte boundary to simplify setting
  582.  * it on aic7880 hardware which only has
  583.  * limited direct access to the DMA FIFO.
  584.  */
  585. uint8_t pad[7];
  586. };
  587. /*
  588.  * Number of events we can buffer up if we run out
  589.  * of immediate notify ccbs.
  590.  */
  591. #define AHC_TMODE_EVENT_BUFFER_SIZE 8
  592. struct ahc_tmode_event {
  593. uint8_t initiator_id;
  594. uint8_t event_type; /* MSG type or EVENT_TYPE_BUS_RESET */
  595. #define EVENT_TYPE_BUS_RESET 0xFF
  596. uint8_t event_arg;
  597. };
  598. /*
  599.  * Per enabled lun target mode state.
  600.  * As this state is directly influenced by the host OS'es target mode
  601.  * environment, we let the OS module define it.  Forward declare the
  602.  * structure here so we can store arrays of them, etc. in OS neutral
  603.  * data structures.
  604.  */
  605. #ifdef AHC_TARGET_MODE 
  606. struct ahc_tmode_lstate {
  607. struct cam_path *path;
  608. struct ccb_hdr_slist accept_tios;
  609. struct ccb_hdr_slist immed_notifies;
  610. struct ahc_tmode_event event_buffer[AHC_TMODE_EVENT_BUFFER_SIZE];
  611. uint8_t event_r_idx;
  612. uint8_t event_w_idx;
  613. };
  614. #else
  615. struct ahc_tmode_lstate;
  616. #endif
  617. /******************** Transfer Negotiation Datastructures *********************/
  618. #define AHC_TRANS_CUR 0x01 /* Modify current neogtiation status */
  619. #define AHC_TRANS_ACTIVE 0x03 /* Assume this target is on the bus */
  620. #define AHC_TRANS_GOAL 0x04 /* Modify negotiation goal */
  621. #define AHC_TRANS_USER 0x08 /* Modify user negotiation settings */
  622. /*
  623.  * Transfer Negotiation Information.
  624.  */
  625. struct ahc_transinfo {
  626. uint8_t protocol_version; /* SCSI Revision level */
  627. uint8_t transport_version; /* SPI Revision level */
  628. uint8_t width; /* Bus width */
  629. uint8_t period; /* Sync rate factor */
  630. uint8_t offset; /* Sync offset */
  631. uint8_t ppr_options; /* Parallel Protocol Request options */
  632. };
  633. /*
  634.  * Per-initiator current, goal and user transfer negotiation information. */
  635. struct ahc_initiator_tinfo {
  636. uint8_t scsirate; /* Computed value for SCSIRATE reg */
  637. struct ahc_transinfo curr;
  638. struct ahc_transinfo goal;
  639. struct ahc_transinfo user;
  640. };
  641. /*
  642.  * Per enabled target ID state.
  643.  * Pointers to lun target state as well as sync/wide negotiation information
  644.  * for each initiator<->target mapping.  For the initiator role we pretend
  645.  * that we are the target and the targets are the initiators since the
  646.  * negotiation is the same regardless of role.
  647.  */
  648. struct ahc_tmode_tstate {
  649. struct ahc_tmode_lstate* enabled_luns[AHC_NUM_LUNS];
  650. struct ahc_initiator_tinfo transinfo[AHC_NUM_TARGETS];
  651. /*
  652.  * Per initiator state bitmasks.
  653.  */
  654. uint16_t  auto_negotiate;/* Auto Negotiation Required */
  655. uint16_t  ultraenb; /* Using ultra sync rate  */
  656. uint16_t  discenable; /* Disconnection allowed  */
  657. uint16_t  tagenable; /* Tagged Queuing allowed */
  658. };
  659. /*
  660.  * Data structure for our table of allowed synchronous transfer rates.
  661.  */
  662. struct ahc_syncrate {
  663. u_int sxfr_u2; /* Value of the SXFR parameter for Ultra2+ Chips */
  664. u_int sxfr; /* Value of the SXFR parameter for <= Ultra Chips */
  665. #define ULTRA_SXFR 0x100 /* Rate Requires Ultra Mode set */
  666. #define ST_SXFR    0x010 /* Rate Single Transition Only */
  667. #define DT_SXFR    0x040 /* Rate Double Transition Only */
  668. uint8_t period; /* Period to send to SCSI target */
  669. char *rate;
  670. };
  671. /*
  672.  * The synchronouse transfer rate table.
  673.  */
  674. extern struct ahc_syncrate ahc_syncrates[];
  675. /*
  676.  * Indexes into our table of syncronous transfer rates.
  677.  */
  678. #define AHC_SYNCRATE_DT 0
  679. #define AHC_SYNCRATE_ULTRA2 1
  680. #define AHC_SYNCRATE_ULTRA 3
  681. #define AHC_SYNCRATE_FAST 6
  682. /***************************** Lookup Tables **********************************/
  683. /*
  684.  * Phase -> name and message out response
  685.  * to parity errors in each phase table. 
  686.  */
  687. struct ahc_phase_table_entry {
  688.         uint8_t phase;
  689.         uint8_t mesg_out; /* Message response to parity errors */
  690. char *phasemsg;
  691. };
  692. /************************** Serial EEPROM Format ******************************/
  693. struct seeprom_config {
  694. /*
  695.  * Per SCSI ID Configuration Flags
  696.  */
  697. uint16_t device_flags[16]; /* words 0-15 */
  698. #define CFXFER 0x0007 /* synchronous transfer rate */
  699. #define CFSYNCH 0x0008 /* enable synchronous transfer */
  700. #define CFDISC 0x0010 /* enable disconnection */
  701. #define CFWIDEB 0x0020 /* wide bus device */
  702. #define CFSYNCHISULTRA 0x0040 /* CFSYNCH is an ultra offset (2940AU)*/
  703. #define CFSYNCSINGLE 0x0080 /* Single-Transition signalling */
  704. #define CFSTART 0x0100 /* send start unit SCSI command */
  705. #define CFINCBIOS 0x0200 /* include in BIOS scan */
  706. #define CFRNFOUND 0x0400 /* report even if not found */
  707. #define CFMULTILUNDEV 0x0800 /* Probe multiple luns in BIOS scan */
  708. #define CFWBCACHEENB 0x4000 /* Enable W-Behind Cache on disks */
  709. #define CFWBCACHENOP 0xc000 /* Don't touch W-Behind Cache */
  710. /*
  711.  * BIOS Control Bits
  712.  */
  713. uint16_t bios_control; /* word 16 */
  714. #define CFSUPREM 0x0001 /* support all removeable drives */
  715. #define CFSUPREMB 0x0002 /* support removeable boot drives */
  716. #define CFBIOSEN 0x0004 /* BIOS enabled */
  717. #define CFBIOS_BUSSCAN 0x0008 /* Have the BIOS Scan the Bus */
  718. #define CFSM2DRV 0x0010 /* support more than two drives */
  719. #define CFSTPWLEVEL 0x0010 /* Termination level control */
  720. #define CF284XEXTEND 0x0020 /* extended translation (284x cards) */
  721. #define CFCTRL_A 0x0020 /* BIOS displays Ctrl-A message */
  722. #define CFTERM_MENU 0x0040 /* BIOS displays termination menu */
  723. #define CFEXTEND 0x0080 /* extended translation enabled */
  724. #define CFSCAMEN 0x0100 /* SCAM enable */
  725. #define CFMSG_LEVEL 0x0600 /* BIOS Message Level */
  726. #define CFMSG_VERBOSE 0x0000
  727. #define CFMSG_SILENT 0x0200
  728. #define CFMSG_DIAG 0x0400
  729. #define CFBOOTCD 0x0800  /* Support Bootable CD-ROM */
  730. /* UNUSED 0xff00 */
  731. /*
  732.  * Host Adapter Control Bits
  733.  */
  734. uint16_t adapter_control; /* word 17 */
  735. #define CFAUTOTERM 0x0001 /* Perform Auto termination */
  736. #define CFULTRAEN 0x0002 /* Ultra SCSI speed enable */
  737. #define CF284XSELTO     0x0003 /* Selection timeout (284x cards) */
  738. #define CF284XFIFO      0x000C /* FIFO Threshold (284x cards) */
  739. #define CFSTERM 0x0004 /* SCSI low byte termination */
  740. #define CFWSTERM 0x0008 /* SCSI high byte termination */
  741. #define CFSPARITY 0x0010 /* SCSI parity */
  742. #define CF284XSTERM     0x0020 /* SCSI low byte term (284x cards) */
  743. #define CFMULTILUN 0x0020
  744. #define CFRESETB 0x0040 /* reset SCSI bus at boot */
  745. #define CFCLUSTERENB 0x0080 /* Cluster Enable */
  746. #define CFBOOTCHAN 0x0300 /* probe this channel first */
  747. #define CFBOOTCHANSHIFT 8
  748. #define CFSEAUTOTERM 0x0400 /* Ultra2 Perform secondary Auto Term*/
  749. #define CFSELOWTERM 0x0800 /* Ultra2 secondary low term */
  750. #define CFSEHIGHTERM 0x1000 /* Ultra2 secondary high term */
  751. #define CFDOMAINVAL 0x4000 /* Perform Domain Validation*/
  752. /*
  753.  * Bus Release Time, Host Adapter ID
  754.  */
  755. uint16_t brtime_id; /* word 18 */
  756. #define CFSCSIID 0x000f /* host adapter SCSI ID */
  757. /* UNUSED 0x00f0 */
  758. #define CFBRTIME 0xff00 /* bus release time */
  759. /*
  760.  * Maximum targets
  761.  */
  762. uint16_t max_targets; /* word 19 */
  763. #define CFMAXTARG 0x00ff /* maximum targets */
  764. #define CFBOOTLUN 0x0f00 /* Lun to boot from */
  765. #define CFBOOTID 0xf000 /* Target to boot from */
  766. uint16_t res_1[10]; /* words 20-29 */
  767. uint16_t signature; /* Signature == 0x250 */
  768. #define CFSIGNATURE 0x250
  769. #define CFSIGNATURE2 0x300
  770. uint16_t checksum; /* word 31 */
  771. };
  772. /****************************  Message Buffer *********************************/
  773. typedef enum {
  774. MSG_TYPE_NONE = 0x00,
  775. MSG_TYPE_INITIATOR_MSGOUT = 0x01,
  776. MSG_TYPE_INITIATOR_MSGIN = 0x02,
  777. MSG_TYPE_TARGET_MSGOUT = 0x03,
  778. MSG_TYPE_TARGET_MSGIN = 0x04
  779. } ahc_msg_type;
  780. typedef enum {
  781. MSGLOOP_IN_PROG,
  782. MSGLOOP_MSGCOMPLETE,
  783. MSGLOOP_TERMINATED
  784. } msg_loop_stat;
  785. /*********************** Software Configuration Structure *********************/
  786. TAILQ_HEAD(scb_tailq, scb);
  787. struct ahc_suspend_channel_state {
  788. uint8_t scsiseq;
  789. uint8_t sxfrctl0;
  790. uint8_t sxfrctl1;
  791. uint8_t simode0;
  792. uint8_t simode1;
  793. uint8_t seltimer;
  794. uint8_t seqctl;
  795. };
  796. struct ahc_suspend_state {
  797. struct ahc_suspend_channel_state channel[2];
  798. uint8_t optionmode;
  799. uint8_t dscommand0;
  800. uint8_t dspcistatus;
  801. /* hsmailbox */
  802. uint8_t crccontrol1;
  803. uint8_t scbbaddr;
  804. /* Host and sequencer SCB counts */
  805. uint8_t dff_thrsh;
  806. uint8_t *scratch_ram;
  807. uint8_t *btt;
  808. };
  809. typedef void (*ahc_bus_intr_t)(struct ahc_softc *);
  810. struct ahc_softc {
  811. bus_space_tag_t           tag;
  812. bus_space_handle_t        bsh;
  813. #ifndef __linux__
  814. bus_dma_tag_t   buffer_dmat;   /* dmat for buffer I/O */
  815. #endif
  816. struct scb_data  *scb_data;
  817. struct scb  *next_queued_scb;
  818. /*
  819.  * SCBs that have been sent to the controller
  820.  */
  821. LIST_HEAD(, scb)   pending_scbs;
  822. /*
  823.  * Counting lock for deferring the release of additional
  824.  * untagged transactions from the untagged_queues.  When
  825.  * the lock is decremented to 0, all queues in the
  826.  * untagged_queues array are run.
  827.  */
  828. u_int   untagged_queue_lock;
  829. /*
  830.  * Per-target queue of untagged-transactions.  The
  831.  * transaction at the head of the queue is the
  832.  * currently pending untagged transaction for the
  833.  * target.  The driver only allows a single untagged
  834.  * transaction per target.
  835.  */
  836. struct scb_tailq   untagged_queues[AHC_NUM_TARGETS];
  837. /*
  838.  * Platform specific data.
  839.  */
  840. struct ahc_platform_data *platform_data;
  841. /*
  842.  * Platform specific device information.
  843.  */
  844. ahc_dev_softc_t   dev_softc;
  845. /*
  846.  * Bus specific device information.
  847.  */
  848. ahc_bus_intr_t   bus_intr;
  849. /*
  850.  * Target mode related state kept on a per enabled lun basis.
  851.  * Targets that are not enabled will have null entries.
  852.  * As an initiator, we keep one target entry for our initiator
  853.  * ID to store our sync/wide transfer settings.
  854.  */
  855. struct ahc_tmode_tstate  *enabled_targets[AHC_NUM_TARGETS];
  856. /*
  857.  * The black hole device responsible for handling requests for
  858.  * disabled luns on enabled targets.
  859.  */
  860. struct ahc_tmode_lstate  *black_hole;
  861. /*
  862.  * Device instance currently on the bus awaiting a continue TIO
  863.  * for a command that was not given the disconnect priveledge.
  864.  */
  865. struct ahc_tmode_lstate  *pending_device;
  866. /*
  867.  * Card characteristics
  868.  */
  869. ahc_chip   chip;
  870. ahc_feature   features;
  871. ahc_bug   bugs;
  872. ahc_flag   flags;
  873. /* Values to store in the SEQCTL register for pause and unpause */
  874. uint8_t   unpause;
  875. uint8_t   pause;
  876. /* Command Queues */
  877. uint8_t   qoutfifonext;
  878. uint8_t   qinfifonext;
  879. uint8_t  *qoutfifo;
  880. uint8_t  *qinfifo;
  881. /* Critical Section Data */
  882. struct cs  *critical_sections;
  883. u_int   num_critical_sections;
  884. /* Links for chaining softcs */
  885. TAILQ_ENTRY(ahc_softc)   links;
  886. /* Channel Names ('A', 'B', etc.) */
  887. char   channel;
  888. char   channel_b;
  889. /* Initiator Bus ID */
  890. uint8_t   our_id;
  891. uint8_t   our_id_b;
  892. /*
  893.  * PCI error detection.
  894.  */
  895. int   unsolicited_ints;
  896. /*
  897.  * Target incoming command FIFO.
  898.  */
  899. struct target_cmd  *targetcmds;
  900. uint8_t   tqinfifonext;
  901. /*
  902.  * Incoming and outgoing message handling.
  903.  */
  904. uint8_t   send_msg_perror;
  905. ahc_msg_type   msg_type;
  906. uint8_t   msgout_buf[12];/* Message we are sending */
  907. uint8_t   msgin_buf[12];/* Message we are receiving */
  908. u_int   msgout_len; /* Length of message to send */
  909. u_int   msgout_index; /* Current index in msgout */
  910. u_int   msgin_index; /* Current index in msgin */
  911. /*
  912.  * Mapping information for data structures shared
  913.  * between the sequencer and kernel.
  914.  */
  915. bus_dma_tag_t   parent_dmat;
  916. bus_dma_tag_t   shared_data_dmat;
  917. bus_dmamap_t   shared_data_dmamap;
  918. bus_addr_t   shared_data_busaddr;
  919. /*
  920.  * Bus address of the one byte buffer used to
  921.  * work-around a DMA bug for chips <= aic7880
  922.  * in target mode.
  923.  */
  924. bus_addr_t   dma_bug_buf;
  925. /* Information saved through suspend/resume cycles */
  926. struct ahc_suspend_state  suspend_state;
  927. /* Number of enabled target mode device on this card */
  928. u_int   enabled_luns;
  929. /* Initialization level of this data structure */
  930. u_int   init_level;
  931. /* PCI cacheline size. */
  932. u_int   pci_cachesize;
  933. /* Per-Unit descriptive information */
  934. const char  *description;
  935. char  *name;
  936. int   unit;
  937. /* Selection Timer settings */
  938. int   seltime;
  939. int   seltime_b;
  940. uint16_t     user_discenable;/* Disconnection allowed  */
  941. uint16_t   user_tagenable;/* Tagged Queuing allowed */
  942. };
  943. TAILQ_HEAD(ahc_softc_tailq, ahc_softc);
  944. extern struct ahc_softc_tailq ahc_tailq;
  945. /************************ Active Device Information ***************************/
  946. typedef enum {
  947. ROLE_UNKNOWN,
  948. ROLE_INITIATOR,
  949. ROLE_TARGET
  950. } role_t;
  951. struct ahc_devinfo {
  952. int  our_scsiid;
  953. int  target_offset;
  954. uint16_t target_mask;
  955. u_int  target;
  956. u_int  lun;
  957. char  channel;
  958. role_t  role; /*
  959.  * Only guaranteed to be correct if not
  960.  * in the busfree state.
  961.  */
  962. };
  963. /****************************** PCI Structures ********************************/
  964. typedef int (ahc_device_setup_t)(struct ahc_softc *);
  965. struct ahc_pci_identity {
  966. uint64_t  full_id;
  967. uint64_t  id_mask;
  968. char *name;
  969. ahc_device_setup_t *setup;
  970. };
  971. extern struct ahc_pci_identity ahc_pci_ident_table [];
  972. extern const u_int ahc_num_pci_devs;
  973. /***************************** VL/EISA Declarations ***************************/
  974. struct aic7770_identity {
  975. uint32_t  full_id;
  976. uint32_t  id_mask;
  977. char *name;
  978. ahc_device_setup_t *setup;
  979. };
  980. extern struct aic7770_identity aic7770_ident_table [];
  981. extern const int ahc_num_aic7770_devs;
  982. #define AHC_EISA_SLOT_OFFSET 0xc00
  983. #define AHC_EISA_IOSIZE 0x100
  984. /*************************** Function Declarations ****************************/
  985. /******************************************************************************/
  986. u_int ahc_index_busy_tcl(struct ahc_softc *ahc, u_int tcl);
  987. void ahc_unbusy_tcl(struct ahc_softc *ahc, u_int tcl);
  988. void ahc_busy_tcl(struct ahc_softc *ahc,
  989.      u_int tcl, u_int busyid);
  990. /***************************** PCI Front End *********************************/
  991. struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t);
  992. int  ahc_pci_config(struct ahc_softc *,
  993. struct ahc_pci_identity *);
  994. /*************************** EISA/VL Front End ********************************/
  995. struct aic7770_identity *aic7770_find_device(uint32_t);
  996. int  aic7770_config(struct ahc_softc *ahc,
  997. struct aic7770_identity *);
  998. /************************** SCB and SCB queue management **********************/
  999. int ahc_probe_scbs(struct ahc_softc *);
  1000. void ahc_run_untagged_queues(struct ahc_softc *ahc);
  1001. void ahc_run_untagged_queue(struct ahc_softc *ahc,
  1002.        struct scb_tailq *queue);
  1003. void ahc_qinfifo_requeue_tail(struct ahc_softc *ahc,
  1004.  struct scb *scb);
  1005. int ahc_match_scb(struct ahc_softc *ahc, struct scb *scb,
  1006.       int target, char channel, int lun,
  1007.       u_int tag, role_t role);
  1008. /****************************** Initialization ********************************/
  1009. struct ahc_softc *ahc_alloc(void *platform_arg, char *name);
  1010. int  ahc_softc_init(struct ahc_softc *);
  1011. void  ahc_controller_info(struct ahc_softc *ahc, char *buf);
  1012. int  ahc_init(struct ahc_softc *ahc);
  1013. void  ahc_intr_enable(struct ahc_softc *ahc, int enable);
  1014. void  ahc_pause_and_flushwork(struct ahc_softc *ahc);
  1015. int  ahc_suspend(struct ahc_softc *ahc); 
  1016. int  ahc_resume(struct ahc_softc *ahc);
  1017. void  ahc_softc_insert(struct ahc_softc *);
  1018. void  ahc_set_unit(struct ahc_softc *, int);
  1019. void  ahc_set_name(struct ahc_softc *, char *);
  1020. void  ahc_alloc_scbs(struct ahc_softc *ahc);
  1021. void  ahc_free(struct ahc_softc *ahc);
  1022. int  ahc_reset(struct ahc_softc *ahc);
  1023. void  ahc_shutdown(void *arg);
  1024. /*************************** Interrupt Services *******************************/
  1025. void ahc_pci_intr(struct ahc_softc *ahc);
  1026. void ahc_clear_intstat(struct ahc_softc *ahc);
  1027. void ahc_run_qoutfifo(struct ahc_softc *ahc);
  1028. #ifdef AHC_TARGET_MODE
  1029. void ahc_run_tqinfifo(struct ahc_softc *ahc, int paused);
  1030. #endif
  1031. void ahc_handle_brkadrint(struct ahc_softc *ahc);
  1032. void ahc_handle_seqint(struct ahc_softc *ahc, u_int intstat);
  1033. void ahc_handle_scsiint(struct ahc_softc *ahc,
  1034.    u_int intstat);
  1035. void ahc_clear_critical_section(struct ahc_softc *ahc);
  1036. /***************************** Error Recovery *********************************/
  1037. typedef enum {
  1038. SEARCH_COMPLETE,
  1039. SEARCH_COUNT,
  1040. SEARCH_REMOVE
  1041. } ahc_search_action;
  1042. int ahc_search_qinfifo(struct ahc_softc *ahc, int target,
  1043.    char channel, int lun, u_int tag,
  1044.    role_t role, uint32_t status,
  1045.    ahc_search_action action);
  1046. int ahc_search_disc_list(struct ahc_softc *ahc, int target,
  1047.      char channel, int lun, u_int tag,
  1048.      int stop_on_first, int remove,
  1049.      int save_state);
  1050. void ahc_freeze_devq(struct ahc_softc *ahc, struct scb *scb);
  1051. int ahc_reset_channel(struct ahc_softc *ahc, char channel,
  1052.   int initiate_reset);
  1053. int ahc_abort_scbs(struct ahc_softc *ahc, int target,
  1054.        char channel, int lun, u_int tag,
  1055.        role_t role, uint32_t status);
  1056. void ahc_restart(struct ahc_softc *ahc);
  1057. void ahc_calc_residual(struct scb *scb);
  1058. /*************************** Utility Functions ********************************/
  1059. struct ahc_phase_table_entry*
  1060. ahc_lookup_phase_entry(int phase);
  1061. void ahc_compile_devinfo(struct ahc_devinfo *devinfo,
  1062.     u_int our_id, u_int target,
  1063.     u_int lun, char channel,
  1064.     role_t role);
  1065. /************************** Transfer Negotiation ******************************/
  1066. struct ahc_syncrate* ahc_find_syncrate(struct ahc_softc *ahc, u_int *period,
  1067.   u_int *ppr_options, u_int maxsync);
  1068. u_int ahc_find_period(struct ahc_softc *ahc,
  1069. u_int scsirate, u_int maxsync);
  1070. void ahc_validate_offset(struct ahc_softc *ahc,
  1071.     struct ahc_initiator_tinfo *tinfo,
  1072.     struct ahc_syncrate *syncrate,
  1073.     u_int *offset, int wide,
  1074.     role_t role);
  1075. void ahc_validate_width(struct ahc_softc *ahc,
  1076.    struct ahc_initiator_tinfo *tinfo,
  1077.    u_int *bus_width,
  1078.    role_t role);
  1079. int ahc_update_neg_request(struct ahc_softc*,
  1080.        struct ahc_devinfo*,
  1081.        struct ahc_tmode_tstate*,
  1082.        struct ahc_initiator_tinfo*,
  1083.        int /*force*/);
  1084. void ahc_set_width(struct ahc_softc *ahc,
  1085.       struct ahc_devinfo *devinfo,
  1086.       u_int width, u_int type, int paused);
  1087. void ahc_set_syncrate(struct ahc_softc *ahc,
  1088.  struct ahc_devinfo *devinfo,
  1089.  struct ahc_syncrate *syncrate,
  1090.  u_int period, u_int offset,
  1091.  u_int ppr_options,
  1092.  u_int type, int paused);
  1093. typedef enum {
  1094. AHC_QUEUE_NONE,
  1095. AHC_QUEUE_BASIC,
  1096. AHC_QUEUE_TAGGED
  1097. } ahc_queue_alg;
  1098. void ahc_set_tags(struct ahc_softc *ahc,
  1099.      struct ahc_devinfo *devinfo,
  1100.      ahc_queue_alg alg);
  1101. /**************************** Target Mode *************************************/
  1102. #ifdef AHC_TARGET_MODE
  1103. void ahc_send_lstate_events(struct ahc_softc *,
  1104.        struct ahc_tmode_lstate *);
  1105. void ahc_handle_en_lun(struct ahc_softc *ahc,
  1106.   struct cam_sim *sim, union ccb *ccb);
  1107. cam_status ahc_find_tmode_devs(struct ahc_softc *ahc,
  1108.     struct cam_sim *sim, union ccb *ccb,
  1109.     struct ahc_tmode_tstate **tstate,
  1110.     struct ahc_tmode_lstate **lstate,
  1111.     int notfound_failure);
  1112. #ifndef AHC_TMODE_ENABLE
  1113. #define AHC_TMODE_ENABLE 0
  1114. #endif
  1115. #endif
  1116. /******************************* Debug ***************************************/
  1117. void ahc_print_scb(struct scb *scb);
  1118. void ahc_dump_card_state(struct ahc_softc *ahc);
  1119. #endif /* _AIC7XXX_H_ */