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

嵌入式Linux

开发平台:

Unix_Linux

  1.   ushort sdtr_speed2;     /* EEPROM SDTR Speed for TID 4-7   */
  2.   ushort sdtr_speed3;     /* EEPROM SDTR Speed for TID 8-11  */
  3.   ushort sdtr_speed4;     /* EEPROM SDTR Speed for TID 12-15 */
  4.   ushort tagqng_able;     /* try tagged queuing with a device */
  5.   ushort ppr_able;        /* PPR message capable per TID bitmask. */
  6.   uchar  max_dvc_qng;     /* maximum number of tagged commands per device */
  7.   ushort start_motor;     /* start motor command allowed */
  8.   uchar  scsi_reset_wait; /* delay in seconds after scsi bus reset */
  9.   uchar  chip_no;         /* should be assigned by caller */
  10.   uchar  max_host_qng;    /* maximum number of Q'ed command allowed */
  11.   uchar  irq_no;          /* IRQ number */
  12.   ushort no_scam;         /* scam_tolerant of EEPROM */
  13.   struct asc_board *drv_ptr; /* driver pointer to private structure */
  14.   uchar  chip_scsi_id;    /* chip SCSI target ID */
  15.   uchar  chip_type;
  16.   uchar  bist_err_code;
  17.   ADV_CARR_T *carrier_buf;
  18.   ADV_CARR_T *carr_freelist; /* Carrier free list. */
  19.   ADV_CARR_T *icq_sp;  /* Initiator command queue stopper pointer. */
  20.   ADV_CARR_T *irq_sp;  /* Initiator response queue stopper pointer. */
  21.   ushort carr_pending_cnt;    /* Count of pending carriers. */
  22.  /*
  23.   * Note: The following fields will not be used after initialization. The
  24.   * driver may discard the buffer after initialization is done.
  25.   */
  26.   ADV_DVC_CFG *cfg; /* temporary configuration structure  */
  27. } ADV_DVC_VAR;
  28. #define NO_OF_SG_PER_BLOCK              15
  29. typedef struct asc_sg_block {
  30.     uchar reserved1;
  31.     uchar reserved2;
  32.     uchar reserved3;
  33.     uchar sg_cnt;                     /* Valid entries in block. */
  34.     ADV_PADDR sg_ptr;                 /* Pointer to next sg block. */
  35.     struct  {
  36.         ADV_PADDR sg_addr;                  /* SG element address. */
  37.         ADV_DCNT  sg_count;                 /* SG element count. */
  38.     } sg_list[NO_OF_SG_PER_BLOCK];
  39. } ADV_SG_BLOCK;
  40. /*
  41.  * ADV_SCSI_REQ_Q - microcode request structure
  42.  *
  43.  * All fields in this structure up to byte 60 are used by the microcode.
  44.  * The microcode makes assumptions about the size and ordering of fields
  45.  * in this structure. Do not change the structure definition here without
  46.  * coordinating the change with the microcode.
  47.  *
  48.  * All fields accessed by microcode must be maintained in little_endian
  49.  * order.
  50.  */
  51. typedef struct adv_scsi_req_q {
  52.     uchar       cntl;           /* Ucode flags and state (ASC_MC_QC_*). */
  53.     uchar       target_cmd;
  54.     uchar       target_id;      /* Device target identifier. */
  55.     uchar       target_lun;     /* Device target logical unit number. */
  56.     ADV_PADDR   data_addr;      /* Data buffer physical address. */
  57.     ADV_DCNT    data_cnt;       /* Data count. Ucode sets to residual. */
  58.     ADV_PADDR   sense_addr;
  59.     ADV_PADDR   carr_pa;
  60.     uchar       mflag;
  61.     uchar       sense_len;
  62.     uchar       cdb_len;        /* SCSI CDB length. Must <= 16 bytes. */
  63.     uchar       scsi_cntl;
  64.     uchar       done_status;    /* Completion status. */
  65.     uchar       scsi_status;    /* SCSI status byte. */
  66.     uchar       host_status;    /* Ucode host status. */
  67.     uchar       sg_working_ix;
  68.     uchar       cdb[12];        /* SCSI CDB bytes 0-11. */
  69.     ADV_PADDR   sg_real_addr;   /* SG list physical address. */
  70.     ADV_PADDR   scsiq_rptr;
  71.     uchar       cdb16[4];       /* SCSI CDB bytes 12-15. */
  72.     ADV_VADDR   scsiq_ptr;
  73.     ADV_VADDR   carr_va;
  74.     /*
  75.      * End of microcode structure - 60 bytes. The rest of the structure
  76.      * is used by the Adv Library and ignored by the microcode.
  77.      */
  78.     ADV_VADDR   srb_ptr;
  79.     ADV_SG_BLOCK *sg_list_ptr; /* SG list virtual address. */
  80.     char        *vdata_addr;   /* Data buffer virtual address. */
  81.     uchar       a_flag;
  82.     uchar       pad[2];        /* Pad out to a word boundary. */
  83. } ADV_SCSI_REQ_Q;
  84. /*
  85.  * Microcode idle loop commands
  86.  */
  87. #define IDLE_CMD_COMPLETED           0
  88. #define IDLE_CMD_STOP_CHIP           0x0001
  89. #define IDLE_CMD_STOP_CHIP_SEND_INT  0x0002
  90. #define IDLE_CMD_SEND_INT            0x0004
  91. #define IDLE_CMD_ABORT               0x0008
  92. #define IDLE_CMD_DEVICE_RESET        0x0010
  93. #define IDLE_CMD_SCSI_RESET_START    0x0020 /* Assert SCSI Bus Reset */
  94. #define IDLE_CMD_SCSI_RESET_END      0x0040 /* Deassert SCSI Bus Reset */
  95. #define IDLE_CMD_SCSIREQ             0x0080
  96. #define IDLE_CMD_STATUS_SUCCESS      0x0001
  97. #define IDLE_CMD_STATUS_FAILURE      0x0002
  98. /*
  99.  * AdvSendIdleCmd() flag definitions.
  100.  */
  101. #define ADV_NOWAIT     0x01
  102. /*
  103.  * Wait loop time out values.
  104.  */
  105. #define SCSI_WAIT_10_SEC             10UL    /* 10 seconds */
  106. #define SCSI_WAIT_100_MSEC           100UL   /* 100 milliseconds */
  107. #define SCSI_US_PER_MSEC             1000    /* microseconds per millisecond */
  108. #define SCSI_MS_PER_SEC              1000UL  /* milliseconds per second */
  109. #define SCSI_MAX_RETRY               10      /* retry count */
  110. #define ADV_ASYNC_RDMA_FAILURE          0x01 /* Fatal RDMA failure. */
  111. #define ADV_ASYNC_SCSI_BUS_RESET_DET    0x02 /* Detected SCSI Bus Reset. */
  112. #define ADV_ASYNC_CARRIER_READY_FAILURE 0x03 /* Carrier Ready failure. */
  113. #define ADV_RDMA_IN_CARR_AND_Q_INVALID  0x04 /* RDMAed-in data invalid. */
  114. #define ADV_HOST_SCSI_BUS_RESET      0x80 /* Host Initiated SCSI Bus Reset. */
  115. /*
  116.  * Device drivers must define the following functions.
  117.  */
  118. STATIC inline ulong DvcEnterCritical(void);
  119. STATIC inline void  DvcLeaveCritical(ulong);
  120. STATIC void  DvcSleepMilliSecond(ADV_DCNT);
  121. STATIC uchar DvcAdvReadPCIConfigByte(ADV_DVC_VAR *, ushort);
  122. STATIC void  DvcAdvWritePCIConfigByte(ADV_DVC_VAR *, ushort, uchar);
  123. STATIC ADV_PADDR DvcGetPhyAddr(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *,
  124.                 uchar *, ASC_SDCNT *, int);
  125. STATIC void  DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
  126. /*
  127.  * Adv Library functions available to drivers.
  128.  */
  129. STATIC int     AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
  130. STATIC int     AdvISR(ADV_DVC_VAR *);
  131. STATIC int     AdvInitGetConfig(ADV_DVC_VAR *);
  132. STATIC int     AdvInitAsc3550Driver(ADV_DVC_VAR *);
  133. STATIC int     AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
  134. STATIC int     AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
  135. STATIC int     AdvResetChipAndSB(ADV_DVC_VAR *);
  136. STATIC int     AdvResetSB(ADV_DVC_VAR *asc_dvc);
  137. /*
  138.  * Internal Adv Library functions.
  139.  */
  140. STATIC int    AdvSendIdleCmd(ADV_DVC_VAR *, ushort, ADV_DCNT);
  141. STATIC void   AdvInquiryHandling(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
  142. STATIC int    AdvInitFrom3550EEP(ADV_DVC_VAR *);
  143. STATIC int    AdvInitFrom38C0800EEP(ADV_DVC_VAR *);
  144. STATIC int    AdvInitFrom38C1600EEP(ADV_DVC_VAR *);
  145. STATIC ushort AdvGet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
  146. STATIC void   AdvSet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
  147. STATIC ushort AdvGet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
  148. STATIC void   AdvSet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
  149. STATIC ushort AdvGet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
  150. STATIC void   AdvSet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
  151. STATIC void   AdvWaitEEPCmd(AdvPortAddr);
  152. STATIC ushort AdvReadEEPWord(AdvPortAddr, int);
  153. /*
  154.  * PCI Bus Definitions
  155.  */
  156. #define AscPCICmdRegBits_BusMastering     0x0007
  157. #define AscPCICmdRegBits_ParErrRespCtrl   0x0040
  158. /* Read byte from a register. */
  159. #define AdvReadByteRegister(iop_base, reg_off) 
  160.      (ADV_MEM_READB((iop_base) + (reg_off)))
  161. /* Write byte to a register. */
  162. #define AdvWriteByteRegister(iop_base, reg_off, byte) 
  163.      (ADV_MEM_WRITEB((iop_base) + (reg_off), (byte)))
  164. /* Read word (2 bytes) from a register. */
  165. #define AdvReadWordRegister(iop_base, reg_off) 
  166.      (ADV_MEM_READW((iop_base) + (reg_off)))
  167. /* Write word (2 bytes) to a register. */
  168. #define AdvWriteWordRegister(iop_base, reg_off, word) 
  169.      (ADV_MEM_WRITEW((iop_base) + (reg_off), (word)))
  170. /* Write dword (4 bytes) to a register. */
  171. #define AdvWriteDWordRegister(iop_base, reg_off, dword) 
  172.      (ADV_MEM_WRITEDW((iop_base) + (reg_off), (dword)))
  173. /* Read byte from LRAM. */
  174. #define AdvReadByteLram(iop_base, addr, byte) 
  175. do { 
  176.     ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); 
  177.     (byte) = ADV_MEM_READB((iop_base) + IOPB_RAM_DATA); 
  178. } while (0)
  179. /* Write byte to LRAM. */
  180. #define AdvWriteByteLram(iop_base, addr, byte) 
  181.     (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), 
  182.      ADV_MEM_WRITEB((iop_base) + IOPB_RAM_DATA, (byte)))
  183. /* Read word (2 bytes) from LRAM. */
  184. #define AdvReadWordLram(iop_base, addr, word) 
  185. do { 
  186.     ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); 
  187.     (word) = (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA)); 
  188. } while (0)
  189. /* Write word (2 bytes) to LRAM. */
  190. #define AdvWriteWordLram(iop_base, addr, word) 
  191.     (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), 
  192.      ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
  193. /* Write little-endian double word (4 bytes) to LRAM */
  194. /* Because of unspecified C language ordering don't use auto-increment. */
  195. #define AdvWriteDWordLramNoSwap(iop_base, addr, dword) 
  196.     ((ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), 
  197.       ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, 
  198.                      cpu_to_le16((ushort) ((dword) & 0xFFFF)))), 
  199.      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr) + 2), 
  200.       ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, 
  201.                      cpu_to_le16((ushort) ((dword >> 16) & 0xFFFF)))))
  202. /* Read word (2 bytes) from LRAM assuming that the address is already set. */
  203. #define AdvReadWordAutoIncLram(iop_base) 
  204.      (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA))
  205. /* Write word (2 bytes) to LRAM assuming that the address is already set. */
  206. #define AdvWriteWordAutoIncLram(iop_base, word) 
  207.      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
  208. /*
  209.  * Define macro to check for Condor signature.
  210.  *
  211.  * Evaluate to ADV_TRUE if a Condor chip is found the specified port
  212.  * address 'iop_base'. Otherwise evalue to ADV_FALSE.
  213.  */
  214. #define AdvFindSignature(iop_base) 
  215.     (((AdvReadByteRegister((iop_base), IOPB_CHIP_ID_1) == 
  216.     ADV_CHIP_ID_BYTE) && 
  217.      (AdvReadWordRegister((iop_base), IOPW_CHIP_ID_0) == 
  218.     ADV_CHIP_ID_WORD)) ?  ADV_TRUE : ADV_FALSE)
  219. /*
  220.  * Define macro to Return the version number of the chip at 'iop_base'.
  221.  *
  222.  * The second parameter 'bus_type' is currently unused.
  223.  */
  224. #define AdvGetChipVersion(iop_base, bus_type) 
  225.     AdvReadByteRegister((iop_base), IOPB_CHIP_TYPE_REV)
  226. /*
  227.  * Abort an SRB in the chip's RISC Memory. The 'srb_ptr' argument must
  228.  * match the ASC_SCSI_REQ_Q 'srb_ptr' field.
  229.  *
  230.  * If the request has not yet been sent to the device it will simply be
  231.  * aborted from RISC memory. If the request is disconnected it will be
  232.  * aborted on reselection by sending an Abort Message to the target ID.
  233.  *
  234.  * Return value:
  235.  *      ADV_TRUE(1) - Queue was successfully aborted.
  236.  *      ADV_FALSE(0) - Queue was not found on the active queue list.
  237.  */
  238. #define AdvAbortQueue(asc_dvc, scsiq) 
  239.         AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_ABORT, 
  240.                        (ADV_DCNT) (scsiq))
  241. /*
  242.  * Send a Bus Device Reset Message to the specified target ID.
  243.  *
  244.  * All outstanding commands will be purged if sending the
  245.  * Bus Device Reset Message is successful.
  246.  *
  247.  * Return Value:
  248.  *      ADV_TRUE(1) - All requests on the target are purged.
  249.  *      ADV_FALSE(0) - Couldn't issue Bus Device Reset Message; Requests
  250.  *                     are not purged.
  251.  */
  252. #define AdvResetDevice(asc_dvc, target_id) 
  253.         AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_DEVICE_RESET, 
  254.                     (ADV_DCNT) (target_id))
  255. /*
  256.  * SCSI Wide Type definition.
  257.  */
  258. #define ADV_SCSI_BIT_ID_TYPE   ushort
  259. /*
  260.  * AdvInitScsiTarget() 'cntl_flag' options.
  261.  */
  262. #define ADV_SCAN_LUN           0x01
  263. #define ADV_CAPINFO_NOLUN      0x02
  264. /*
  265.  * Convert target id to target id bit mask.
  266.  */
  267. #define ADV_TID_TO_TIDMASK(tid)   (0x01 << ((tid) & ADV_MAX_TID))
  268. /*
  269.  * ASC_SCSI_REQ_Q 'done_status' and 'host_status' return values.
  270.  */
  271. #define QD_NO_STATUS         0x00       /* Request not completed yet. */
  272. #define QD_NO_ERROR          0x01
  273. #define QD_ABORTED_BY_HOST   0x02
  274. #define QD_WITH_ERROR        0x04
  275. #define QHSTA_NO_ERROR              0x00
  276. #define QHSTA_M_SEL_TIMEOUT         0x11
  277. #define QHSTA_M_DATA_OVER_RUN       0x12
  278. #define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
  279. #define QHSTA_M_QUEUE_ABORTED       0x15
  280. #define QHSTA_M_SXFR_SDMA_ERR       0x16 /* SXFR_STATUS SCSI DMA Error */
  281. #define QHSTA_M_SXFR_SXFR_PERR      0x17 /* SXFR_STATUS SCSI Bus Parity Error */
  282. #define QHSTA_M_RDMA_PERR           0x18 /* RISC PCI DMA parity error */
  283. #define QHSTA_M_SXFR_OFF_UFLW       0x19 /* SXFR_STATUS Offset Underflow */
  284. #define QHSTA_M_SXFR_OFF_OFLW       0x20 /* SXFR_STATUS Offset Overflow */
  285. #define QHSTA_M_SXFR_WD_TMO         0x21 /* SXFR_STATUS Watchdog Timeout */
  286. #define QHSTA_M_SXFR_DESELECTED     0x22 /* SXFR_STATUS Deselected */
  287. /* Note: QHSTA_M_SXFR_XFR_OFLW is identical to QHSTA_M_DATA_OVER_RUN. */
  288. #define QHSTA_M_SXFR_XFR_OFLW       0x12 /* SXFR_STATUS Transfer Overflow */
  289. #define QHSTA_M_SXFR_XFR_PH_ERR     0x24 /* SXFR_STATUS Transfer Phase Error */
  290. #define QHSTA_M_SXFR_UNKNOWN_ERROR  0x25 /* SXFR_STATUS Unknown Error */
  291. #define QHSTA_M_SCSI_BUS_RESET      0x30 /* Request aborted from SBR */
  292. #define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31 /* Request aborted from unsol. SBR */
  293. #define QHSTA_M_BUS_DEVICE_RESET    0x32 /* Request aborted from BDR */
  294. #define QHSTA_M_DIRECTION_ERR       0x35 /* Data Phase mismatch */
  295. #define QHSTA_M_DIRECTION_ERR_HUNG  0x36 /* Data Phase mismatch and bus hang */
  296. #define QHSTA_M_WTM_TIMEOUT         0x41
  297. #define QHSTA_M_BAD_CMPL_STATUS_IN  0x42
  298. #define QHSTA_M_NO_AUTO_REQ_SENSE   0x43
  299. #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
  300. #define QHSTA_M_INVALID_DEVICE      0x45 /* Bad target ID */
  301. #define QHSTA_M_FROZEN_TIDQ         0x46 /* TID Queue frozen. */
  302. #define QHSTA_M_SGBACKUP_ERROR      0x47 /* Scatter-Gather backup error */
  303. /*
  304.  * Default EEPROM Configuration structure defined in a_init.c.
  305.  */
  306. extern ADVEEP_3550_CONFIG Default_3550_EEPROM_Config;
  307. extern ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config;
  308. extern ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config;
  309. /*
  310.  * DvcGetPhyAddr() flag arguments
  311.  */
  312. #define ADV_IS_SCSIQ_FLAG       0x01 /* 'addr' is ASC_SCSI_REQ_Q pointer */
  313. #define ADV_ASCGETSGLIST_VADDR  0x02 /* 'addr' is AscGetSGList() virtual addr */
  314. #define ADV_IS_SENSE_FLAG       0x04 /* 'addr' is sense virtual pointer */
  315. #define ADV_IS_DATA_FLAG        0x08 /* 'addr' is data virtual pointer */
  316. #define ADV_IS_SGLIST_FLAG      0x10 /* 'addr' is sglist virtual pointer */
  317. #define ADV_IS_CARRIER_FLAG     0x20 /* 'addr' is ADV_CARR_T pointer */
  318. /* Return the address that is aligned at the next doubleword >= to 'addr'. */
  319. #define ADV_8BALIGN(addr)      (((ulong) (addr) + 0x7) & ~0x7)
  320. #define ADV_16BALIGN(addr)     (((ulong) (addr) + 0xF) & ~0xF)
  321. #define ADV_32BALIGN(addr)     (((ulong) (addr) + 0x1F) & ~0x1F)
  322. /*
  323.  * Total contiguous memory needed for driver SG blocks.
  324.  *
  325.  * ADV_MAX_SG_LIST must be defined by a driver. It is the maximum
  326.  * number of scatter-gather elements the driver supports in a
  327.  * single request.
  328.  */
  329. #define ADV_SG_LIST_MAX_BYTE_SIZE 
  330.          (sizeof(ADV_SG_BLOCK) * 
  331.           ((ADV_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK))
  332. /*
  333.  * Inquiry data structure and bitfield macros
  334.  *
  335.  * Using bitfields to access the subchar data isn't portable across
  336.  * endianness, so instead mask and shift. Only quantities of more
  337.  * than 1 bit are shifted, since the others are just tested for true
  338.  * or false.
  339.  */
  340. #define ADV_INQ_DVC_TYPE(inq)       ((inq)->periph & 0x1f)
  341. #define ADV_INQ_QUALIFIER(inq)      (((inq)->periph & 0xe0) >> 5)
  342. #define ADV_INQ_DVC_TYPE_MOD(inq)   ((inq)->devtype & 0x7f)
  343. #define ADV_INQ_REMOVABLE(inq)      ((inq)->devtype & 0x80)
  344. #define ADV_INQ_ANSI_VER(inq)       ((inq)->ver & 0x07)
  345. #define ADV_INQ_ECMA_VER(inq)       (((inq)->ver & 0x38) >> 3)
  346. #define ADV_INQ_ISO_VER(inq)        (((inq)->ver & 0xc0) >> 6)
  347. #define ADV_INQ_RESPONSE_FMT(inq)   ((inq)->byte3 & 0x0f)
  348. #define ADV_INQ_TERM_IO(inq)        ((inq)->byte3 & 0x40)
  349. #define ADV_INQ_ASYNC_NOTIF(inq)    ((inq)->byte3 & 0x80)
  350. #define ADV_INQ_SOFT_RESET(inq)     ((inq)->flags & 0x01)
  351. #define ADV_INQ_CMD_QUEUE(inq)      ((inq)->flags & 0x02)
  352. #define ADV_INQ_LINK_CMD(inq)       ((inq)->flags & 0x08)
  353. #define ADV_INQ_SYNC(inq)           ((inq)->flags & 0x10)
  354. #define ADV_INQ_WIDE16(inq)         ((inq)->flags & 0x20)
  355. #define ADV_INQ_WIDE32(inq)         ((inq)->flags & 0x40)
  356. #define ADV_INQ_REL_ADDR(inq)       ((inq)->flags & 0x80)
  357. #define ADV_INQ_INFO_UNIT(inq)      ((inq)->info & 0x01)
  358. #define ADV_INQ_QUICK_ARB(inq)      ((inq)->info & 0x02)
  359. #define ADV_INQ_CLOCKING(inq)       (((inq)->info & 0x0c) >> 2)
  360. typedef struct {
  361.   uchar periph;                 /* peripheral device type [0:4] */
  362.                                 /* peripheral qualifier [5:7] */
  363.   uchar devtype;                /* device type modifier (for SCSI I) [0:6] */
  364.                                 /* RMB - removable medium bit [7] */
  365.   uchar ver;                    /* ANSI approved version [0:2] */
  366.                                 /* ECMA version [3:5] */
  367.                                 /* ISO version [6:7] */
  368.   uchar byte3;                  /* response data format [0:3] */
  369.                                 /* 0 SCSI 1 */
  370.                                 /* 1 CCS */
  371.                                 /* 2 SCSI-2 */
  372.                                 /* 3-F reserved */
  373.                                 /* reserved [4:5] */
  374.                                 /* terminate I/O process bit (see 5.6.22) [6] */
  375.                                 /* asynch. event notification (processor) [7] */
  376.   uchar add_len;                /* additional length */
  377.   uchar res1;                   /* reserved */
  378.   uchar res2;                   /* reserved */
  379.   uchar flags;                  /* soft reset implemented [0] */
  380.                                 /* command queuing [1] */
  381.                                 /* reserved [2] */
  382.                                 /* linked command for this logical unit [3] */
  383.                                 /* synchronous data transfer [4] */
  384.                                 /* wide bus 16 bit data transfer [5] */
  385.                                 /* wide bus 32 bit data transfer [6] */
  386.                                 /* relative addressing mode [7] */
  387.   uchar vendor_id[8];           /* vendor identification */
  388.   uchar product_id[16];         /* product identification */
  389.   uchar product_rev_level[4];   /* product revision level */
  390.   uchar vendor_specific[20];    /* vendor specific */
  391.   uchar info;                   /* information unit supported [0] */
  392.                                 /* quick arbitrate supported [1] */
  393.                                 /* clocking field [2:3] */
  394.                                 /* reserved [4:7] */
  395.   uchar res3;                   /* reserved */
  396. } ADV_SCSI_INQUIRY; /* 58 bytes */
  397. /*
  398.  * --- Driver Constants and Macros
  399.  */
  400. #define ASC_NUM_BOARD_SUPPORTED 16
  401. #define ASC_NUM_IOPORT_PROBE    4
  402. #define ASC_NUM_BUS             4
  403. /* Reference Scsi_Host hostdata */
  404. #define ASC_BOARDP(host) ((asc_board_t *) &((host)->hostdata))
  405. /* asc_board_t flags */
  406. #define ASC_HOST_IN_RESET       0x01
  407. #define ASC_IS_WIDE_BOARD       0x04    /* AdvanSys Wide Board */
  408. #define ASC_SELECT_QUEUE_DEPTHS 0x08
  409. #define ASC_NARROW_BOARD(boardp) (((boardp)->flags & ASC_IS_WIDE_BOARD) == 0)
  410. #define ASC_WIDE_BOARD(boardp)   ((boardp)->flags & ASC_IS_WIDE_BOARD)
  411. #define NO_ISA_DMA              0xff        /* No ISA DMA Channel Used */
  412. /*
  413.  * If the Linux kernel version supports freeing initialization code
  414.  * and data after loading, define macros for this purpose. These macros
  415.  * are not used when the driver is built as a module, cf. linux/init.h.
  416.  */
  417. #if ASC_LINUX_KERNEL24
  418. #define ASC_INITFUNC(type, func)        type __init func
  419. #elif ASC_LINUX_KERNEL22
  420. #define ASC_INITFUNC(type, func)        __initfunc(type func)
  421. #endif
  422. #define ASC_INITDATA                    __initdata
  423. #define ASC_INIT                        __init
  424. #define ASC_INFO_SIZE           128            /* advansys_info() line size */
  425. #ifdef CONFIG_PROC_FS
  426. /* /proc/scsi/advansys/[0...] related definitions */
  427. #define ASC_PRTBUF_SIZE         2048
  428. #define ASC_PRTLINE_SIZE        160
  429. #define ASC_PRT_NEXT() 
  430.     if (cp) { 
  431.         totlen += len; 
  432.         leftlen -= len; 
  433.         if (leftlen == 0) { 
  434.             return totlen; 
  435.         } 
  436.         cp += len; 
  437.     }
  438. #define ASC_MIN(a, b) (((a) < (b)) ? (a) : (b))
  439. #endif /* CONFIG_PROC_FS */
  440. /*
  441.  * XXX - Release and acquire the io_request_lock. These macros are needed
  442.  * because the 2.4 kernel SCSI mid-level driver holds the 'io_request_lock'
  443.  * on entry to SCSI low-level drivers.
  444.  *
  445.  * These definitions and all code that uses code should be removed when the
  446.  * SCSI mid-level driver no longer holds the 'io_request_lock' on entry to
  447.  * SCSI low-level driver detect, queuecommand, and reset entrypoints.
  448.  *
  449.  * The interrupt flags values doesn't matter in the macros because the
  450.  * SCSI mid-level will save and restore the flags values before and after
  451.  * calling advansys_detect, advansys_queuecommand, and advansys_reset where
  452.  * these macros are used. We do want interrupts enabled after the lock is
  453.  * released so an explicit sti() is done. The driver only needs interrupts
  454.  * disabled when it acquires the per board lock.
  455.  */
  456. #define ASC_UNLOCK_IO_REQUEST_LOCK 
  457.     { 
  458.         ulong flags; /* flags value not needed, cf. comment above. */ 
  459.         save_flags(flags); 
  460.         spin_unlock_irqrestore(&io_request_lock, flags); 
  461.         sti(); /* enable interrupts */ 
  462.     }
  463. #define ASC_LOCK_IO_REQUEST_LOCK 
  464.     { 
  465.         ulong flags; /* flags value not needed, cf. comment above. */ 
  466.         spin_lock_irqsave(&io_request_lock, flags); 
  467.     }
  468. /* Asc Library return codes */
  469. #define ASC_TRUE        1
  470. #define ASC_FALSE       0
  471. #define ASC_NOERROR     1
  472. #define ASC_BUSY        0
  473. #define ASC_ERROR       (-1)
  474. /* Scsi_Cmnd function return codes */
  475. #define STATUS_BYTE(byte)   (byte)
  476. #define MSG_BYTE(byte)      ((byte) << 8)
  477. #define HOST_BYTE(byte)     ((byte) << 16)
  478. #define DRIVER_BYTE(byte)   ((byte) << 24)
  479. /*
  480.  * The following definitions and macros are OS independent interfaces to
  481.  * the queue functions:
  482.  *  REQ - SCSI request structure
  483.  *  REQP - pointer to SCSI request structure
  484.  *  REQPTID(reqp) - reqp's target id
  485.  *  REQPNEXT(reqp) - reqp's next pointer
  486.  *  REQPNEXTP(reqp) - pointer to reqp's next pointer
  487.  *  REQPTIME(reqp) - reqp's time stamp value
  488.  *  REQTIMESTAMP() - system time stamp value
  489.  */
  490. typedef Scsi_Cmnd            REQ, *REQP;
  491. #define REQPNEXT(reqp)       ((REQP) ((reqp)->host_scribble))
  492. #define REQPNEXTP(reqp)      ((REQP *) &((reqp)->host_scribble))
  493. #define REQPTID(reqp)        ((reqp)->target)
  494. #define REQPTIME(reqp)       ((reqp)->SCp.this_residual)
  495. #define REQTIMESTAMP()       (jiffies)
  496. #define REQTIMESTAT(function, ascq, reqp, tid) 
  497.     /*
  498.      * If the request time stamp is less than the system time stamp, then 
  499.      * maybe the system time stamp wrapped. Set the request time to zero.
  500.      */ 
  501.     if (REQPTIME(reqp) <= REQTIMESTAMP()) { 
  502.         REQPTIME(reqp) = REQTIMESTAMP() - REQPTIME(reqp); 
  503.     } else { 
  504.         /* Indicate an error occurred with the assertion. */ 
  505.         ASC_ASSERT(REQPTIME(reqp) <= REQTIMESTAMP()); 
  506.         REQPTIME(reqp) = 0; 
  507.     } 
  508.     /* Handle first minimum time case without external initialization. */ 
  509.     if (((ascq)->q_tot_cnt[tid] == 1) ||  
  510.         (REQPTIME(reqp) < (ascq)->q_min_tim[tid])) { 
  511.             (ascq)->q_min_tim[tid] = REQPTIME(reqp); 
  512.             ASC_DBG3(1, "%s: new q_min_tim[%d] %un", 
  513.                 (function), (tid), (ascq)->q_min_tim[tid]); 
  514.         } 
  515.     if (REQPTIME(reqp) > (ascq)->q_max_tim[tid]) { 
  516.         (ascq)->q_max_tim[tid] = REQPTIME(reqp); 
  517.         ASC_DBG3(1, "%s: new q_max_tim[%d] %un", 
  518.             (function), tid, (ascq)->q_max_tim[tid]); 
  519.     } 
  520.     (ascq)->q_tot_tim[tid] += REQPTIME(reqp); 
  521.     /* Reset the time stamp field. */ 
  522.     REQPTIME(reqp) = 0; 
  523. }
  524. /* asc_enqueue() flags */
  525. #define ASC_FRONT       1
  526. #define ASC_BACK        2
  527. /* asc_dequeue_list() argument */
  528. #define ASC_TID_ALL        (-1)
  529. /* Return non-zero, if the queue is empty. */
  530. #define ASC_QUEUE_EMPTY(ascq)    ((ascq)->q_tidmask == 0)
  531. /* PCI configuration declarations */
  532. #define PCI_BASE_CLASS_PREDEFINED               0x00
  533. #define PCI_BASE_CLASS_MASS_STORAGE             0x01
  534. #define PCI_BASE_CLASS_NETWORK                  0x02
  535. #define PCI_BASE_CLASS_DISPLAY                  0x03
  536. #define PCI_BASE_CLASS_MULTIMEDIA               0x04
  537. #define PCI_BASE_CLASS_MEMORY_CONTROLLER        0x05
  538. #define PCI_BASE_CLASS_BRIDGE_DEVICE            0x06
  539. /* MASS STORAGE */
  540. #define PCI_SUB_CLASS_SCSI_CONTROLLER           0x00
  541. #define PCI_SUB_CLASS_IDE_CONTROLLER            0x01
  542. #define PCI_SUB_CLASS_FLOPPY_DISK_CONTROLLER    0x02
  543. #define PCI_SUB_CLASS_IPI_BUS_CONTROLLER        0x03
  544. #define PCI_SUB_CLASS_OTHER_MASS_CONTROLLER     0x80
  545. /* NETWORK CONTROLLER */
  546. #define PCI_SUB_CLASS_ETHERNET_CONTROLLER       0x00
  547. #define PCI_SUB_CLASS_TOKEN_RING_CONTROLLER     0x01
  548. #define PCI_SUB_CLASS_FDDI_CONTROLLER           0x02
  549. #define PCI_SUB_CLASS_OTHER_NETWORK_CONTROLLER  0x80
  550. /* DISPLAY CONTROLLER */
  551. #define PCI_SUB_CLASS_VGA_CONTROLLER            0x00
  552. #define PCI_SUB_CLASS_XGA_CONTROLLER            0x01
  553. #define PCI_SUB_CLASS_OTHER_DISPLAY_CONTROLLER  0x80
  554. /* MULTIMEDIA CONTROLLER */
  555. #define PCI_SUB_CLASS_VIDEO_DEVICE              0x00
  556. #define PCI_SUB_CLASS_AUDIO_DEVICE              0x01
  557. #define PCI_SUB_CLASS_OTHER_MULTIMEDIA_DEVICE   0x80
  558. /* MEMORY CONTROLLER */
  559. #define PCI_SUB_CLASS_RAM_CONTROLLER            0x00
  560. #define PCI_SUB_CLASS_FLASH_CONTROLLER          0x01
  561. #define PCI_SUB_CLASS_OTHER_MEMORY_CONTROLLER   0x80
  562. /* BRIDGE CONTROLLER */
  563. #define PCI_SUB_CLASS_HOST_BRIDGE_CONTROLLER    0x00
  564. #define PCI_SUB_CLASS_ISA_BRIDGE_CONTROLLER     0x01
  565. #define PCI_SUB_CLASS_EISA_BRIDGE_CONTROLLER    0x02
  566. #define PCI_SUB_CLASS_MC_BRIDGE_CONTROLLER      0x03
  567. #define PCI_SUB_CLASS_PCI_TO_PCI_BRIDGE_CONTROLLER    0x04
  568. #define PCI_SUB_CLASS_PCMCIA_BRIDGE_CONTROLLER  0x05
  569. #define PCI_SUB_CLASS_OTHER_BRIDGE_CONTROLLER   0x80
  570. #define PCI_MAX_SLOT            0x1F
  571. #define PCI_MAX_BUS             0xFF
  572. #define PCI_IOADDRESS_MASK      0xFFFE
  573. #define ASC_PCI_VENDORID        0x10CD
  574. #define ASC_PCI_DEVICE_ID_CNT   6       /* PCI Device ID count. */
  575. #define ASC_PCI_DEVICE_ID_1100  0x1100
  576. #define ASC_PCI_DEVICE_ID_1200  0x1200
  577. #define ASC_PCI_DEVICE_ID_1300  0x1300
  578. #define ASC_PCI_DEVICE_ID_2300  0x2300  /* ASC-3550 */
  579. #define ASC_PCI_DEVICE_ID_2500  0x2500  /* ASC-38C0800 */
  580. #define ASC_PCI_DEVICE_ID_2700  0x2700  /* ASC-38C1600 */
  581. /* PCI IO Port Addresses to generate special cycle */
  582. #define PCI_CONFIG_ADDRESS_MECH1          0x0CF8
  583. #define PCI_CONFIG_DATA_MECH1             0x0CFC
  584. #define PCI_CONFIG_FORWARD_REGISTER       0x0CFA    /* 0=type 0; 1=type 1; */
  585. #define PCI_CONFIG_BUS_NUMBER_MASK        0x00FF0000
  586. #define PCI_CONFIG_DEVICE_FUNCTION_MASK   0x0000FF00
  587. #define PCI_CONFIG_REGISTER_NUMBER_MASK   0x000000F8
  588. #define PCI_DEVICE_FOUND                0x0000
  589. #define PCI_DEVICE_NOT_FOUND            0xffff
  590. #define SUBCLASS_OFFSET         0x0A
  591. #define CLASSCODE_OFFSET        0x0B
  592. #define VENDORID_OFFSET         0x00
  593. #define DEVICEID_OFFSET         0x02
  594. #ifndef ADVANSYS_STATS
  595. #define ASC_STATS(shp, counter)
  596. #define ASC_STATS_ADD(shp, counter, count)
  597. #else /* ADVANSYS_STATS */
  598. #define ASC_STATS(shp, counter) 
  599.     (ASC_BOARDP(shp)->asc_stats.counter++)
  600. #define ASC_STATS_ADD(shp, counter, count) 
  601.     (ASC_BOARDP(shp)->asc_stats.counter += (count))
  602. #endif /* ADVANSYS_STATS */
  603. #define ASC_CEILING(val, unit) (((val) + ((unit) - 1))/(unit))
  604. /* If the result wraps when calculating tenths, return 0. */
  605. #define ASC_TENTHS(num, den) 
  606.     (((10 * ((num)/(den))) > (((num) * 10)/(den))) ? 
  607.     0 : ((((num) * 10)/(den)) - (10 * ((num)/(den)))))
  608. /*
  609.  * Display a message to the console.
  610.  */
  611. #define ASC_PRINT(s) 
  612.     { 
  613.         printk("advansys: "); 
  614.         printk(s); 
  615.     }
  616. #define ASC_PRINT1(s, a1) 
  617.     { 
  618.         printk("advansys: "); 
  619.         printk((s), (a1)); 
  620.     }
  621. #define ASC_PRINT2(s, a1, a2) 
  622.     { 
  623.         printk("advansys: "); 
  624.         printk((s), (a1), (a2)); 
  625.     }
  626. #define ASC_PRINT3(s, a1, a2, a3) 
  627.     { 
  628.         printk("advansys: "); 
  629.         printk((s), (a1), (a2), (a3)); 
  630.     }
  631. #define ASC_PRINT4(s, a1, a2, a3, a4) 
  632.     { 
  633.         printk("advansys: "); 
  634.         printk((s), (a1), (a2), (a3), (a4)); 
  635.     }
  636. #ifndef ADVANSYS_DEBUG
  637. #define ASC_DBG(lvl, s)
  638. #define ASC_DBG1(lvl, s, a1)
  639. #define ASC_DBG2(lvl, s, a1, a2)
  640. #define ASC_DBG3(lvl, s, a1, a2, a3)
  641. #define ASC_DBG4(lvl, s, a1, a2, a3, a4)
  642. #define ASC_DBG_PRT_SCSI_HOST(lvl, s)
  643. #define ASC_DBG_PRT_SCSI_CMND(lvl, s)
  644. #define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp)
  645. #define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
  646. #define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone)
  647. #define ADV_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
  648. #define ASC_DBG_PRT_HEX(lvl, name, start, length)
  649. #define ASC_DBG_PRT_CDB(lvl, cdb, len)
  650. #define ASC_DBG_PRT_SENSE(lvl, sense, len)
  651. #define ASC_DBG_PRT_INQUIRY(lvl, inq, len)
  652. #else /* ADVANSYS_DEBUG */
  653. /*
  654.  * Debugging Message Levels:
  655.  * 0: Errors Only
  656.  * 1: High-Level Tracing
  657.  * 2-N: Verbose Tracing
  658.  */
  659. #define ASC_DBG(lvl, s) 
  660.     { 
  661.         if (asc_dbglvl >= (lvl)) { 
  662.             printk(s); 
  663.         } 
  664.     }
  665. #define ASC_DBG1(lvl, s, a1) 
  666.     { 
  667.         if (asc_dbglvl >= (lvl)) { 
  668.             printk((s), (a1)); 
  669.         } 
  670.     }
  671. #define ASC_DBG2(lvl, s, a1, a2) 
  672.     { 
  673.         if (asc_dbglvl >= (lvl)) { 
  674.             printk((s), (a1), (a2)); 
  675.         } 
  676.     }
  677. #define ASC_DBG3(lvl, s, a1, a2, a3) 
  678.     { 
  679.         if (asc_dbglvl >= (lvl)) { 
  680.             printk((s), (a1), (a2), (a3)); 
  681.         } 
  682.     }
  683. #define ASC_DBG4(lvl, s, a1, a2, a3, a4) 
  684.     { 
  685.         if (asc_dbglvl >= (lvl)) { 
  686.             printk((s), (a1), (a2), (a3), (a4)); 
  687.         } 
  688.     }
  689. #define ASC_DBG_PRT_SCSI_HOST(lvl, s) 
  690.     { 
  691.         if (asc_dbglvl >= (lvl)) { 
  692.             asc_prt_scsi_host(s); 
  693.         } 
  694.     }
  695. #define ASC_DBG_PRT_SCSI_CMND(lvl, s) 
  696.     { 
  697.         if (asc_dbglvl >= (lvl)) { 
  698.             asc_prt_scsi_cmnd(s); 
  699.         } 
  700.     }
  701. #define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp) 
  702.     { 
  703.         if (asc_dbglvl >= (lvl)) { 
  704.             asc_prt_asc_scsi_q(scsiqp); 
  705.         } 
  706.     }
  707. #define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone) 
  708.     { 
  709.         if (asc_dbglvl >= (lvl)) { 
  710.             asc_prt_asc_qdone_info(qdone); 
  711.         } 
  712.     }
  713. #define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp) 
  714.     { 
  715.         if (asc_dbglvl >= (lvl)) { 
  716.             asc_prt_adv_scsi_req_q(scsiqp); 
  717.         } 
  718.     }
  719. #define ASC_DBG_PRT_HEX(lvl, name, start, length) 
  720.     { 
  721.         if (asc_dbglvl >= (lvl)) { 
  722.             asc_prt_hex((name), (start), (length)); 
  723.         } 
  724.     }
  725. #define ASC_DBG_PRT_CDB(lvl, cdb, len) 
  726.         ASC_DBG_PRT_HEX((lvl), "CDB", (uchar *) (cdb), (len));
  727. #define ASC_DBG_PRT_SENSE(lvl, sense, len) 
  728.         ASC_DBG_PRT_HEX((lvl), "SENSE", (uchar *) (sense), (len));
  729. #define ASC_DBG_PRT_INQUIRY(lvl, inq, len) 
  730.         ASC_DBG_PRT_HEX((lvl), "INQUIRY", (uchar *) (inq), (len));
  731. #endif /* ADVANSYS_DEBUG */
  732. #ifndef ADVANSYS_ASSERT
  733. #define ASC_ASSERT(a)
  734. #else /* ADVANSYS_ASSERT */
  735. #define ASC_ASSERT(a) 
  736.     { 
  737.         if (!(a)) { 
  738.             printk("ASC_ASSERT() Failure: file %s, line %dn", 
  739.                 __FILE__, __LINE__); 
  740.         } 
  741.     }
  742. #endif /* ADVANSYS_ASSERT */
  743. /*
  744.  * --- Driver Structures
  745.  */
  746. #ifdef ADVANSYS_STATS
  747. /* Per board statistics structure */
  748. struct asc_stats {
  749.     /* Driver Entrypoint Statistics */
  750.     ADV_DCNT queuecommand;    /* # calls to advansys_queuecommand() */
  751.     ADV_DCNT reset;           /* # calls to advansys_eh_bus_reset() */
  752.     ADV_DCNT biosparam;       /* # calls to advansys_biosparam() */
  753.     ADV_DCNT interrupt;       /* # advansys_interrupt() calls */
  754.     ADV_DCNT callback;        /* # calls to asc/adv_isr_callback() */
  755.     ADV_DCNT done;            /* # calls to request's scsi_done function */
  756.     ADV_DCNT build_error;     /* # asc/adv_build_req() ASC_ERROR returns. */
  757.     ADV_DCNT adv_build_noreq; /* # adv_build_req() adv_req_t alloc. fail. */
  758.     ADV_DCNT adv_build_nosg;  /* # adv_build_req() adv_sgblk_t alloc. fail. */
  759.     /* AscExeScsiQueue()/AdvExeScsiQueue() Statistics */
  760.     ADV_DCNT exe_noerror;     /* # ASC_NOERROR returns. */
  761.     ADV_DCNT exe_busy;        /* # ASC_BUSY returns. */
  762.     ADV_DCNT exe_error;       /* # ASC_ERROR returns. */
  763.     ADV_DCNT exe_unknown;     /* # unknown returns. */
  764.     /* Data Transfer Statistics */
  765.     ADV_DCNT cont_cnt;        /* # non-scatter-gather I/O requests received */
  766.     ADV_DCNT cont_xfer;       /* # contiguous transfer 512-bytes */
  767.     ADV_DCNT sg_cnt;          /* # scatter-gather I/O requests received */
  768.     ADV_DCNT sg_elem;         /* # scatter-gather elements */
  769.     ADV_DCNT sg_xfer;         /* # scatter-gather transfer 512-bytes */
  770. };
  771. #endif /* ADVANSYS_STATS */
  772. /*
  773.  * Request queuing structure
  774.  */
  775. typedef struct asc_queue {
  776.     ADV_SCSI_BIT_ID_TYPE  q_tidmask;                /* queue mask */
  777.     REQP                  q_first[ADV_MAX_TID+1];   /* first queued request */
  778.     REQP                  q_last[ADV_MAX_TID+1];    /* last queued request */
  779. #ifdef ADVANSYS_STATS
  780.     short                 q_cur_cnt[ADV_MAX_TID+1]; /* current queue count */
  781.     short                 q_max_cnt[ADV_MAX_TID+1]; /* maximum queue count */
  782.     ADV_DCNT              q_tot_cnt[ADV_MAX_TID+1]; /* total enqueue count */
  783.     ADV_DCNT              q_tot_tim[ADV_MAX_TID+1]; /* total time queued */
  784.     ushort                q_max_tim[ADV_MAX_TID+1]; /* maximum time queued */
  785.     ushort                q_min_tim[ADV_MAX_TID+1]; /* minimum time queued */
  786. #endif /* ADVANSYS_STATS */
  787. } asc_queue_t;
  788. /*
  789.  * Adv Library Request Structures
  790.  *
  791.  * The following two structures are used to process Wide Board requests.
  792.  *
  793.  * The ADV_SCSI_REQ_Q structure in adv_req_t is passed to the Adv Library
  794.  * and microcode with the ADV_SCSI_REQ_Q field 'srb_ptr' pointing to the
  795.  * adv_req_t. The adv_req_t structure 'cmndp' field in turn points to the
  796.  * Mid-Level SCSI request structure.
  797.  *
  798.  * Zero or more ADV_SG_BLOCK are used with each ADV_SCSI_REQ_Q. Each
  799.  * ADV_SG_BLOCK structure holds 15 scatter-gather elements. Under Linux
  800.  * up to 255 scatter-gather elements may be used per request or
  801.  * ADV_SCSI_REQ_Q.
  802.  *
  803.  * Both structures must be 32 byte aligned.
  804.  */
  805. typedef struct adv_sgblk {
  806.     ADV_SG_BLOCK        sg_block;     /* Sgblock structure. */
  807.     uchar               align[32];    /* Sgblock structure padding. */
  808.     struct adv_sgblk    *next_sgblkp; /* Next scatter-gather structure. */
  809. } adv_sgblk_t;
  810. typedef struct adv_req {
  811.     ADV_SCSI_REQ_Q      scsi_req_q;   /* Adv Library request structure. */
  812.     uchar               align[32];    /* Request structure padding. */
  813.     Scsi_Cmnd           *cmndp;       /* Mid-Level SCSI command pointer. */
  814.     adv_sgblk_t         *sgblkp;      /* Adv Library scatter-gather pointer. */
  815.     struct adv_req      *next_reqp;   /* Next Request Structure. */
  816. } adv_req_t;
  817. /*
  818.  * Structure allocated for each board.
  819.  *
  820.  * This structure is allocated by scsi_register() at the end
  821.  * of the 'Scsi_Host' structure starting at the 'hostdata'
  822.  * field. It is guaranteed to be allocated from DMA-able memory.
  823.  */
  824. typedef struct asc_board {
  825.     int                  id;                    /* Board Id */
  826.     uint                 flags;                 /* Board flags */
  827.     union {
  828.         ASC_DVC_VAR      asc_dvc_var;           /* Narrow board */
  829.         ADV_DVC_VAR      adv_dvc_var;           /* Wide board */
  830.     } dvc_var;
  831.     union {
  832.         ASC_DVC_CFG      asc_dvc_cfg;           /* Narrow board */
  833.         ADV_DVC_CFG      adv_dvc_cfg;           /* Wide board */
  834.     } dvc_cfg;
  835.     ushort               asc_n_io_port;         /* Number I/O ports. */
  836.     asc_queue_t          active;                /* Active command queue */
  837.     asc_queue_t          waiting;               /* Waiting command queue */
  838.     asc_queue_t          done;                  /* Done command queue */
  839.     ADV_SCSI_BIT_ID_TYPE init_tidmask;          /* Target init./valid mask */
  840.     Scsi_Device          *device[ADV_MAX_TID+1]; /* Mid-Level Scsi Device */
  841.     ushort               reqcnt[ADV_MAX_TID+1]; /* Starvation request count */
  842.     ADV_SCSI_BIT_ID_TYPE queue_full;            /* Queue full mask */
  843.     ushort               queue_full_cnt[ADV_MAX_TID+1]; /* Queue full count */
  844.     union {
  845.         ASCEEP_CONFIG         asc_eep;          /* Narrow EEPROM config. */
  846.         ADVEEP_3550_CONFIG    adv_3550_eep;     /* 3550 EEPROM config. */
  847.         ADVEEP_38C0800_CONFIG adv_38C0800_eep;  /* 38C0800 EEPROM config. */
  848.         ADVEEP_38C1600_CONFIG adv_38C1600_eep;  /* 38C1600 EEPROM config. */
  849.     } eep_config;
  850.     ulong                last_reset;            /* Saved last reset time */
  851.     spinlock_t lock;                            /* Board spinlock */
  852. #ifdef CONFIG_PROC_FS
  853.     /* /proc/scsi/advansys/[0...] */
  854.     char                 *prtbuf;               /* /proc print buffer */
  855. #endif /* CONFIG_PROC_FS */
  856. #ifdef ADVANSYS_STATS
  857.     struct asc_stats     asc_stats;             /* Board statistics */
  858. #endif /* ADVANSYS_STATS */
  859.     /*
  860.      * The following fields are used only for Narrow Boards.
  861.      */
  862.     /* The following three structures must be in DMA-able memory. */
  863.     ASC_SCSI_REQ_Q       scsireqq;
  864.     ASC_CAP_INFO         cap_info;
  865.     ASC_SCSI_INQUIRY     inquiry;
  866.     uchar                sdtr_data[ASC_MAX_TID+1]; /* SDTR information */
  867.     /*
  868.      * The following fields are used only for Wide Boards.
  869.      */
  870.     void                 *ioremap_addr;         /* I/O Memory remap address. */
  871.     ushort               ioport;                /* I/O Port address. */
  872.     ADV_CARR_T           *orig_carrp;           /* ADV_CARR_T memory block. */
  873.     adv_req_t            *orig_reqp;            /* adv_req_t memory block. */
  874.     adv_req_t            *adv_reqp;             /* Request structures. */
  875.     adv_sgblk_t          *adv_sgblkp;           /* Scatter-gather structures. */
  876.     ushort               bios_signature;        /* BIOS Signature. */
  877.     ushort               bios_version;          /* BIOS Version. */
  878.     ushort               bios_codeseg;          /* BIOS Code Segment. */
  879.     ushort               bios_codelen;          /* BIOS Code Segment Length. */
  880. } asc_board_t;
  881. /*
  882.  * PCI configuration structures
  883.  */
  884. typedef struct _PCI_DATA_
  885. {
  886.     uchar    type;
  887.     uchar    bus;
  888.     uchar    slot;
  889.     uchar    func;
  890.     uchar    offset;
  891. } PCI_DATA;
  892. typedef struct _PCI_DEVICE_
  893. {
  894.     ushort   vendorID;
  895.     ushort   deviceID;
  896.     ushort   slotNumber;
  897.     ushort   slotFound;
  898.     uchar    busNumber;
  899.     uchar    maxBusNumber;
  900.     uchar    devFunc;
  901.     ushort   startSlot;
  902.     ushort   endSlot;
  903.     uchar    bridge;
  904.     uchar    type;
  905. } PCI_DEVICE;
  906. typedef struct _PCI_CONFIG_SPACE_
  907. {
  908.     ushort   vendorID;
  909.     ushort   deviceID;
  910.     ushort   command;
  911.     ushort   status;
  912.     uchar    revision;
  913.     uchar    classCode[3];
  914.     uchar    cacheSize;
  915.     uchar    latencyTimer;
  916.     uchar    headerType;
  917.     uchar    bist;
  918.     ADV_PADDR baseAddress[6];
  919.     ushort   reserved[4];
  920.     ADV_PADDR optionRomAddr;
  921.     ushort   reserved2[4];
  922.     uchar    irqLine;
  923.     uchar    irqPin;
  924.     uchar    minGnt;
  925.     uchar    maxLatency;
  926. } PCI_CONFIG_SPACE;
  927. /*
  928.  * --- Driver Data
  929.  */
  930. /* Note: All driver global data should be initialized. */
  931. #if ASC_LINUX_KERNEL22
  932. #ifdef CONFIG_PROC_FS
  933. struct proc_dir_entry proc_scsi_advansys =
  934. {
  935.     PROC_SCSI_ADVANSYS,              /* unsigned short low_ino */
  936.     8,                               /* unsigned short namelen */
  937.     "advansys",                      /* const char *name */
  938.     S_IFDIR | S_IRUGO | S_IXUGO,     /* mode_t mode */
  939.     2                                /* nlink_t nlink */
  940. };
  941. #endif /* CONFIG_PROC_FS */
  942. #endif /* ASC_LINUX_KERNEL22 */
  943. /* Number of boards detected in system. */
  944. STATIC int asc_board_count = 0;
  945. STATIC struct Scsi_Host    *asc_host[ASC_NUM_BOARD_SUPPORTED] = { 0 };
  946. /* Overrun buffer used by all narrow boards. */
  947. STATIC uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 };
  948. /*
  949.  * Global structures required to issue a command.
  950.  */
  951. STATIC ASC_SCSI_Q asc_scsi_q = { { 0 } };
  952. STATIC ASC_SG_HEAD asc_sg_head = { 0 };
  953. /* List of supported bus types. */
  954. STATIC ushort asc_bus[ASC_NUM_BUS] ASC_INITDATA = {
  955.     ASC_IS_ISA,
  956.     ASC_IS_VL,
  957.     ASC_IS_EISA,
  958.     ASC_IS_PCI,
  959. };
  960. /*
  961.  * Used with the LILO 'advansys' option to eliminate or
  962.  * limit I/O port probing at boot time, cf. advansys_setup().
  963.  */
  964. STATIC int asc_iopflag = ASC_FALSE;
  965. STATIC int asc_ioport[ASC_NUM_IOPORT_PROBE] = { 0, 0, 0, 0 };
  966. #ifdef ADVANSYS_DEBUG
  967. STATIC char *
  968. asc_bus_name[ASC_NUM_BUS] = {
  969.     "ASC_IS_ISA",
  970.     "ASC_IS_VL",
  971.     "ASC_IS_EISA",
  972.     "ASC_IS_PCI",
  973. };
  974. STATIC int          asc_dbglvl = 3;
  975. #endif /* ADVANSYS_DEBUG */
  976. /* Declaration for Asc Library internal data referenced by driver. */
  977. STATIC PortAddr     _asc_def_iop_base[];
  978. /*
  979.  * --- Driver Function Prototypes
  980.  *
  981.  * advansys.h contains function prototypes for functions global to Linux.
  982.  */
  983. STATIC void       advansys_interrupt(int, void *, struct pt_regs *);
  984. STATIC void       advansys_select_queue_depths(struct Scsi_Host *,
  985.                                                Scsi_Device *);
  986. STATIC void       asc_scsi_done_list(Scsi_Cmnd *);
  987. STATIC int        asc_execute_scsi_cmnd(Scsi_Cmnd *);
  988. STATIC int        asc_build_req(asc_board_t *, Scsi_Cmnd *);
  989. STATIC int        adv_build_req(asc_board_t *, Scsi_Cmnd *, ADV_SCSI_REQ_Q **);
  990. STATIC int        adv_get_sglist(asc_board_t *, adv_req_t *, Scsi_Cmnd *);
  991. STATIC void       asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
  992. STATIC void       adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
  993. STATIC void       adv_async_callback(ADV_DVC_VAR *, uchar);
  994. STATIC void       asc_enqueue(asc_queue_t *, REQP, int);
  995. STATIC REQP       asc_dequeue(asc_queue_t *, int);
  996. STATIC REQP       asc_dequeue_list(asc_queue_t *, REQP *, int);
  997. STATIC int        asc_rmqueue(asc_queue_t *, REQP);
  998. STATIC void       asc_execute_queue(asc_queue_t *);
  999. #ifdef CONFIG_PROC_FS
  1000. STATIC int        asc_proc_copy(off_t, off_t, char *, int , char *, int);
  1001. STATIC int        asc_prt_board_devices(struct Scsi_Host *, char *, int);
  1002. STATIC int        asc_prt_adv_bios(struct Scsi_Host *, char *, int);
  1003. STATIC int        asc_get_eeprom_string(ushort *serialnum, uchar *cp);
  1004. STATIC int        asc_prt_asc_board_eeprom(struct Scsi_Host *, char *, int);
  1005. STATIC int        asc_prt_adv_board_eeprom(struct Scsi_Host *, char *, int);
  1006. STATIC int        asc_prt_driver_conf(struct Scsi_Host *, char *, int);
  1007. STATIC int        asc_prt_asc_board_info(struct Scsi_Host *, char *, int);
  1008. STATIC int        asc_prt_adv_board_info(struct Scsi_Host *, char *, int);
  1009. STATIC int        asc_prt_line(char *, int, char *fmt, ...);
  1010. #endif /* CONFIG_PROC_FS */
  1011. /* Declaration for Asc Library internal functions referenced by driver. */
  1012. STATIC int          AscFindSignature(PortAddr);
  1013. STATIC ushort       AscGetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
  1014. /* Statistics function prototypes. */
  1015. #ifdef ADVANSYS_STATS
  1016. #ifdef CONFIG_PROC_FS
  1017. STATIC int          asc_prt_board_stats(struct Scsi_Host *, char *, int);
  1018. STATIC int          asc_prt_target_stats(struct Scsi_Host *, int, char *, int);
  1019. #endif /* CONFIG_PROC_FS */
  1020. #endif /* ADVANSYS_STATS */
  1021. /* Debug function prototypes. */
  1022. #ifdef ADVANSYS_DEBUG
  1023. STATIC void         asc_prt_scsi_host(struct Scsi_Host *);
  1024. STATIC void         asc_prt_scsi_cmnd(Scsi_Cmnd *);
  1025. STATIC void         asc_prt_asc_dvc_cfg(ASC_DVC_CFG *);
  1026. STATIC void         asc_prt_asc_dvc_var(ASC_DVC_VAR *);
  1027. STATIC void         asc_prt_asc_scsi_q(ASC_SCSI_Q *);
  1028. STATIC void         asc_prt_asc_qdone_info(ASC_QDONE_INFO *);
  1029. STATIC void         asc_prt_adv_dvc_cfg(ADV_DVC_CFG *);
  1030. STATIC void         asc_prt_adv_dvc_var(ADV_DVC_VAR *);
  1031. STATIC void         asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *);
  1032. STATIC void         asc_prt_adv_sgblock(int, ADV_SG_BLOCK *);
  1033. STATIC void         asc_prt_hex(char *f, uchar *, int);
  1034. #endif /* ADVANSYS_DEBUG */
  1035. /*
  1036.  * --- Linux 'Scsi_Host_Template' and advansys_setup() Functions
  1037.  */
  1038. #ifdef CONFIG_PROC_FS
  1039. /*
  1040.  * advansys_proc_info() - /proc/scsi/advansys/[0-(ASC_NUM_BOARD_SUPPORTED-1)]
  1041.  *
  1042.  * *buffer: I/O buffer
  1043.  * **start: if inout == FALSE pointer into buffer where user read should start
  1044.  * offset: current offset into a /proc/scsi/advansys/[0...] file
  1045.  * length: length of buffer
  1046.  * hostno: Scsi_Host host_no
  1047.  * inout: TRUE - user is writing; FALSE - user is reading
  1048.  *
  1049.  * Return the number of bytes read from or written to a
  1050.  * /proc/scsi/advansys/[0...] file.
  1051.  *
  1052.  * Note: This function uses the per board buffer 'prtbuf' which is
  1053.  * allocated when the board is initialized in advansys_detect(). The
  1054.  * buffer is ASC_PRTBUF_SIZE bytes. The function asc_proc_copy() is
  1055.  * used to write to the buffer. The way asc_proc_copy() is written
  1056.  * if 'prtbuf' is too small it will not be overwritten. Instead the
  1057.  * user just won't get all the available statistics.
  1058.  */
  1059. int
  1060. advansys_proc_info(char *buffer, char **start, off_t offset, int length,
  1061.                    int hostno, int inout)
  1062. {
  1063.     struct Scsi_Host    *shp;
  1064.     asc_board_t         *boardp;
  1065.     int                 i;
  1066.     char                *cp;
  1067.     int                 cplen;
  1068.     int                 cnt;
  1069.     int                 totcnt;
  1070.     int                 leftlen;
  1071.     char                *curbuf;
  1072.     off_t               advoffset;
  1073.     Scsi_Device         *scd;
  1074. #ifdef ADVANSYS_STATS
  1075.     int                 tgt_id;
  1076. #endif /* ADVANSYS_STATS */
  1077.     ASC_DBG(1, "advansys_proc_info: beginn");
  1078.     /*
  1079.      * User write not supported.
  1080.      */
  1081.     if (inout == TRUE) {
  1082.         return(-ENOSYS);
  1083.     }
  1084.     /*
  1085.      * User read of /proc/scsi/advansys/[0...] file.
  1086.      */
  1087.     /* Find the specified board. */
  1088.     for (i = 0; i < asc_board_count; i++) {
  1089.         if (asc_host[i]->host_no == hostno) {
  1090.             break;
  1091.         }
  1092.     }
  1093.     if (i == asc_board_count) {
  1094.         return(-ENOENT);
  1095.     }
  1096.     shp = asc_host[i];
  1097.     boardp = ASC_BOARDP(shp);
  1098.     /* Copy read data starting at the beginning of the buffer. */
  1099.     *start = buffer;
  1100.     curbuf = buffer;
  1101.     advoffset = 0;
  1102.     totcnt = 0;
  1103.     leftlen = length;
  1104.     /*
  1105.      * Get board configuration information.
  1106.      *
  1107.      * advansys_info() returns the board string from its own static buffer.
  1108.      */
  1109.     cp = (char *) advansys_info(shp);
  1110.     strcat(cp, "n");
  1111.     cplen = strlen(cp);
  1112.     /* Copy board information. */
  1113.     cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1114.     totcnt += cnt;
  1115.     leftlen -= cnt;
  1116.     if (leftlen == 0) {
  1117.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1118.         return totcnt;
  1119.     }
  1120.     advoffset += cplen;
  1121.     curbuf += cnt;
  1122.     /*
  1123.      * Display Wide Board BIOS Information.
  1124.      */
  1125.     if (ASC_WIDE_BOARD(boardp)) {
  1126.         cp = boardp->prtbuf;
  1127.         cplen = asc_prt_adv_bios(shp, cp, ASC_PRTBUF_SIZE);
  1128.         ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
  1129.         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1130.         totcnt += cnt;
  1131.         leftlen -= cnt;
  1132.         if (leftlen == 0) {
  1133.             ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1134.             return totcnt;
  1135.         }
  1136.         advoffset += cplen;
  1137.         curbuf += cnt;
  1138.     }
  1139.     /*
  1140.      * Display driver information for each device attached to the board.
  1141.      */
  1142.     cp = boardp->prtbuf;
  1143.     cplen = asc_prt_board_devices(shp, cp, ASC_PRTBUF_SIZE);
  1144.     ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
  1145.     cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1146.     totcnt += cnt;
  1147.     leftlen -= cnt;
  1148.     if (leftlen == 0) {
  1149.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1150.         return totcnt;
  1151.     }
  1152.     advoffset += cplen;
  1153.     curbuf += cnt;
  1154.     /*
  1155.      * Display target driver information for each device attached
  1156.      * to the board.
  1157.      */
  1158.     for (scd = shp->host_queue; scd; scd = scd->next)
  1159.     {
  1160.         if (scd->host == shp) {
  1161.             cp = boardp->prtbuf;
  1162.             /*
  1163.              * Note: If proc_print_scsidevice() writes more than
  1164.              * ASC_PRTBUF_SIZE bytes, it will overrun 'prtbuf'.
  1165.              */
  1166.             proc_print_scsidevice(scd, cp, &cplen, 0);
  1167.             ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
  1168.             cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1169.             totcnt += cnt;
  1170.             leftlen -= cnt;
  1171.             if (leftlen == 0) {
  1172.                 ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1173.                 return totcnt;
  1174.             }
  1175.             advoffset += cplen;
  1176.             curbuf += cnt;
  1177.         }
  1178.     }
  1179.     /*
  1180.      * Display EEPROM configuration for the board.
  1181.      */
  1182.     cp = boardp->prtbuf;
  1183.     if (ASC_NARROW_BOARD(boardp)) {
  1184.         cplen = asc_prt_asc_board_eeprom(shp, cp, ASC_PRTBUF_SIZE);
  1185.     } else {
  1186.         cplen = asc_prt_adv_board_eeprom(shp, cp, ASC_PRTBUF_SIZE);
  1187.     }
  1188.     ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
  1189.     cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1190.     totcnt += cnt;
  1191.     leftlen -= cnt;
  1192.     if (leftlen == 0) {
  1193.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1194.         return totcnt;
  1195.     }
  1196.     advoffset += cplen;
  1197.     curbuf += cnt;
  1198.     /*
  1199.      * Display driver configuration and information for the board.
  1200.      */
  1201.     cp = boardp->prtbuf;
  1202.     cplen = asc_prt_driver_conf(shp, cp, ASC_PRTBUF_SIZE);
  1203.     ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
  1204.     cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1205.     totcnt += cnt;
  1206.     leftlen -= cnt;
  1207.     if (leftlen == 0) {
  1208.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1209.         return totcnt;
  1210.     }
  1211.     advoffset += cplen;
  1212.     curbuf += cnt;
  1213. #ifdef ADVANSYS_STATS
  1214.     /*
  1215.      * Display driver statistics for the board.
  1216.      */
  1217.     cp = boardp->prtbuf;
  1218.     cplen = asc_prt_board_stats(shp, cp, ASC_PRTBUF_SIZE);
  1219.     ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
  1220.     cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1221.     totcnt += cnt;
  1222.     leftlen -= cnt;
  1223.     if (leftlen == 0) {
  1224.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1225.         return totcnt;
  1226.     }
  1227.     advoffset += cplen;
  1228.     curbuf += cnt;
  1229.     /*
  1230.      * Display driver statistics for each target.
  1231.      */
  1232.     for (tgt_id = 0; tgt_id <= ADV_MAX_TID; tgt_id++) {
  1233.       cp = boardp->prtbuf;
  1234.       cplen = asc_prt_target_stats(shp, tgt_id, cp, ASC_PRTBUF_SIZE);
  1235.       ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
  1236.       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1237.       totcnt += cnt;
  1238.       leftlen -= cnt;
  1239.       if (leftlen == 0) {
  1240.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1241.         return totcnt;
  1242.       }
  1243.       advoffset += cplen;
  1244.       curbuf += cnt;
  1245.     }
  1246. #endif /* ADVANSYS_STATS */
  1247.     /*
  1248.      * Display Asc Library dynamic configuration information
  1249.      * for the board.
  1250.      */
  1251.     cp = boardp->prtbuf;
  1252.     if (ASC_NARROW_BOARD(boardp)) {
  1253.         cplen = asc_prt_asc_board_info(shp, cp, ASC_PRTBUF_SIZE);
  1254.     } else {
  1255.         cplen = asc_prt_adv_board_info(shp, cp, ASC_PRTBUF_SIZE);
  1256.     }
  1257.     ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
  1258.     cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
  1259.     totcnt += cnt;
  1260.     leftlen -= cnt;
  1261.     if (leftlen == 0) {
  1262.         ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1263.         return totcnt;
  1264.     }
  1265.     advoffset += cplen;
  1266.     curbuf += cnt;
  1267.     ASC_DBG1(1, "advansys_proc_info: totcnt %dn", totcnt);
  1268.     return totcnt;
  1269. }
  1270. #endif /* CONFIG_PROC_FS */
  1271. /*
  1272.  * advansys_detect()
  1273.  *
  1274.  * Detect function for AdvanSys adapters.
  1275.  *
  1276.  * Argument is a pointer to the host driver's scsi_hosts entry.
  1277.  *
  1278.  * Return number of adapters found.
  1279.  *
  1280.  * Note: Because this function is called during system initialization
  1281.  * it must not call SCSI mid-level functions including scsi_malloc()
  1282.  * and scsi_free().
  1283.  */
  1284. ASC_INITFUNC(
  1285. int,
  1286. advansys_detect(Scsi_Host_Template *tpnt)
  1287. )
  1288. {
  1289.     static int          detect_called = ASC_FALSE;
  1290.     int                 iop;
  1291.     int                 bus;
  1292.     struct Scsi_Host    *shp = NULL;
  1293.     asc_board_t         *boardp = NULL;
  1294.     ASC_DVC_VAR         *asc_dvc_varp = NULL;
  1295.     ADV_DVC_VAR         *adv_dvc_varp = NULL;
  1296.     adv_sgblk_t         *sgp = NULL;
  1297.     int                 ioport = 0;
  1298.     int                 share_irq = FALSE;
  1299.     int                 iolen = 0;
  1300. #ifdef CONFIG_PCI
  1301.     int                 pci_init_search = 0;
  1302.     struct pci_dev      *pci_devicep[ASC_NUM_BOARD_SUPPORTED];
  1303.     int                 pci_card_cnt_max = 0;
  1304.     int                 pci_card_cnt = 0;
  1305.     struct pci_dev      *pci_devp = NULL;
  1306.     int                 pci_device_id_cnt = 0;
  1307.     unsigned int        pci_device_id[ASC_PCI_DEVICE_ID_CNT] = {
  1308.                                     ASC_PCI_DEVICE_ID_1100,
  1309.                                     ASC_PCI_DEVICE_ID_1200,
  1310.                                     ASC_PCI_DEVICE_ID_1300,
  1311.                                     ASC_PCI_DEVICE_ID_2300,
  1312.                                     ASC_PCI_DEVICE_ID_2500,
  1313.                                     ASC_PCI_DEVICE_ID_2700
  1314.                         };
  1315.     ADV_PADDR           pci_memory_address;
  1316. #endif /* CONFIG_PCI */
  1317.     int                 warn_code, err_code;
  1318.     int                 ret;
  1319.     if (detect_called == ASC_FALSE) {
  1320.         detect_called = ASC_TRUE;
  1321.     } else {
  1322.         printk("AdvanSys SCSI: advansys_detect() multiple calls ignoredn");
  1323.         return 0;
  1324.     }
  1325.     ASC_DBG(1, "advansys_detect: beginn");
  1326.     /*
  1327.      * XXX - Remove this comment and the next line when SCSI mid-level
  1328.      * no longer acquires 'io_request_lock' before calling the SCSI
  1329.      * low-level detect entrypoint.
  1330.      */
  1331.     ASC_UNLOCK_IO_REQUEST_LOCK
  1332. #if ASC_LINUX_KERNEL24
  1333.     tpnt->proc_name = "advansys";
  1334. #elif ASC_LINUX_KERNEL22
  1335.     tpnt->proc_dir = &proc_scsi_advansys;
  1336. #endif
  1337.     asc_board_count = 0;
  1338.     /*
  1339.      * If I/O port probing has been modified, then verify and
  1340.      * clean-up the 'asc_ioport' list.
  1341.      */
  1342.     if (asc_iopflag == ASC_TRUE) {
  1343.         for (ioport = 0; ioport < ASC_NUM_IOPORT_PROBE; ioport++) {
  1344.             ASC_DBG2(1, "advansys_detect: asc_ioport[%d] 0x%xn",
  1345.                 ioport, asc_ioport[ioport]);
  1346.             if (asc_ioport[ioport] != 0) {
  1347.                 for (iop = 0; iop < ASC_IOADR_TABLE_MAX_IX; iop++) {
  1348.                     if (_asc_def_iop_base[iop] == asc_ioport[ioport]) {
  1349.                         break;
  1350.                     }
  1351.                 }
  1352.                 if (iop == ASC_IOADR_TABLE_MAX_IX) {
  1353.                     printk(
  1354. "AdvanSys SCSI: specified I/O Port 0x%X is invalidn",
  1355.                         asc_ioport[ioport]);
  1356.                     asc_ioport[ioport] = 0;
  1357.                 }
  1358.             }
  1359.         }
  1360.         ioport = 0;
  1361.     }
  1362.     for (bus = 0; bus < ASC_NUM_BUS; bus++) {
  1363.         ASC_DBG2(1, "advansys_detect: bus search type %d (%s)n",
  1364.             bus, asc_bus_name[bus]);
  1365.         iop = 0;
  1366.         while (asc_board_count < ASC_NUM_BOARD_SUPPORTED) {
  1367.             ASC_DBG1(2, "advansys_detect: asc_board_count %dn",
  1368.                 asc_board_count);
  1369.             switch (asc_bus[bus]) {
  1370.             case ASC_IS_ISA:
  1371.             case ASC_IS_VL:
  1372. #ifdef CONFIG_ISA
  1373.                 if (asc_iopflag == ASC_FALSE) {
  1374.                     iop = AscSearchIOPortAddr(iop, asc_bus[bus]);
  1375.                 } else {
  1376.                     /*
  1377.                      * ISA and VL I/O port scanning has either been
  1378.                      * eliminated or limited to selected ports on
  1379.                      * the LILO command line, /etc/lilo.conf, or
  1380.                      * by setting variables when the module was loaded.
  1381.                      */
  1382.                     ASC_DBG(1, "advansys_detect: I/O port scanning modifiedn");
  1383.                 ioport_try_again:
  1384.                     iop = 0;
  1385.                     for (; ioport < ASC_NUM_IOPORT_PROBE; ioport++) {
  1386.                         if ((iop = asc_ioport[ioport]) != 0) {
  1387.                             break;
  1388.                         }
  1389.                     }
  1390.                     if (iop) {
  1391.                         ASC_DBG1(1,
  1392.                                 "advansys_detect: probing I/O port 0x%x...n",
  1393.                             iop);
  1394.                         if (check_region(iop, ASC_IOADR_GAP) != 0) {
  1395.                             printk(
  1396. "AdvanSys SCSI: specified I/O Port 0x%X is busyn", iop);
  1397.                             /* Don't try this I/O port twice. */
  1398.                             asc_ioport[ioport] = 0;
  1399.                             goto ioport_try_again;
  1400.                         } else if (AscFindSignature(iop) == ASC_FALSE) {
  1401.                             printk(
  1402. "AdvanSys SCSI: specified I/O Port 0x%X has no adaptern", iop);
  1403.                             /* Don't try this I/O port twice. */
  1404.                             asc_ioport[ioport] = 0;
  1405.                             goto ioport_try_again;
  1406.                         } else {
  1407.                             /*
  1408.                              * If this isn't an ISA board, then it must be
  1409.                              * a VL board. If currently looking an ISA
  1410.                              * board is being looked for then try for
  1411.                              * another ISA board in 'asc_ioport'.
  1412.                              */
  1413.                             if (asc_bus[bus] == ASC_IS_ISA &&
  1414.                                 (AscGetChipVersion(iop, ASC_IS_ISA) &
  1415.                                  ASC_CHIP_VER_ISA_BIT) == 0) {
  1416.                                  /*
  1417.                                   * Don't clear 'asc_ioport[ioport]'. Try
  1418.                                   * this board again for VL. Increment
  1419.                                   * 'ioport' past this board.
  1420.                                   */
  1421.                                  ioport++;
  1422.                                  goto ioport_try_again;
  1423.                             }
  1424.                         }
  1425.                         /*
  1426.                          * This board appears good, don't try the I/O port
  1427.                          * again by clearing its value. Increment 'ioport'
  1428.                          * for the next iteration.
  1429.                          */
  1430.                         asc_ioport[ioport++] = 0;
  1431.                     }
  1432.                 }
  1433. #endif /* CONFIG_ISA */
  1434.                 break;
  1435.             case ASC_IS_EISA:
  1436. #ifdef CONFIG_ISA
  1437.                 iop = AscSearchIOPortAddr(iop, asc_bus[bus]);
  1438. #endif /* CONFIG_ISA */
  1439.                 break;
  1440.             case ASC_IS_PCI:
  1441. #ifdef CONFIG_PCI
  1442.                 if (pci_init_search == 0) {
  1443.                     int i, j;
  1444.                     pci_init_search = 1;
  1445.                     /* Find all PCI cards. */
  1446.                     while (pci_device_id_cnt < ASC_PCI_DEVICE_ID_CNT) {
  1447.                         if ((pci_devp = pci_find_device(ASC_PCI_VENDORID,
  1448.                             pci_device_id[pci_device_id_cnt], pci_devp)) ==
  1449.                             NULL) {
  1450.                             pci_device_id_cnt++;
  1451.                         } else {
  1452. #if ASC_LINUX_KERNEL24
  1453.                             if (pci_enable_device(pci_devp) == 0) {
  1454.                                 pci_devicep[pci_card_cnt_max++] = pci_devp;
  1455.                             }
  1456. #elif ASC_LINUX_KERNEL22
  1457.                             pci_devicep[pci_card_cnt_max++] = pci_devp;
  1458. #endif
  1459.                         }
  1460.                     }
  1461.                     /*
  1462.                      * Sort PCI cards in ascending order by PCI Bus, Slot,
  1463.                      * and Device Number.
  1464.                      */
  1465.                     for (i = 0; i < pci_card_cnt_max - 1; i++)
  1466.                     {
  1467.                         for (j = i + 1; j < pci_card_cnt_max; j++) {
  1468.                             if ((pci_devicep[j]->bus->number <
  1469.                                  pci_devicep[i]->bus->number) ||
  1470.                                 ((pci_devicep[j]->bus->number ==
  1471.                                   pci_devicep[i]->bus->number) &&
  1472.                                   (pci_devicep[j]->devfn <
  1473.                                    pci_devicep[i]->devfn))) {
  1474.                                 pci_devp = pci_devicep[i];
  1475.                                 pci_devicep[i] = pci_devicep[j];
  1476.                                 pci_devicep[j] = pci_devp;
  1477.                             }
  1478.                         }
  1479.                     }
  1480.                     pci_card_cnt = 0;
  1481.                 } else {
  1482.                     pci_card_cnt++;
  1483.                 }
  1484.                 if (pci_card_cnt == pci_card_cnt_max) {
  1485.                     iop = 0;
  1486.                 } else {
  1487.                     pci_devp = pci_devicep[pci_card_cnt];
  1488.                     ASC_DBG2(2,
  1489.                         "advansys_detect: devfn %d, bus number %dn",
  1490.                         pci_devp->devfn, pci_devp->bus->number);
  1491. #if ASC_LINUX_KERNEL24
  1492.                     iop = pci_resource_start(pci_devp, 0);
  1493. #elif ASC_LINUX_KERNEL22
  1494.                     iop = pci_devp->base_address[0] & PCI_IOADDRESS_MASK;
  1495. #endif
  1496.                     ASC_DBG2(1,
  1497.                         "advansys_detect: vendorID %X, deviceID %Xn",
  1498.                         pci_devp->vendor, pci_devp->device);
  1499.                     ASC_DBG2(2, "advansys_detect: iop %X, irqLine %dn",
  1500.                         iop, pci_devp->irq);
  1501.                 }
  1502. #endif /* CONFIG_PCI */
  1503.                 break;
  1504.             default:
  1505.                 ASC_PRINT1("advansys_detect: unknown bus type: %dn",
  1506.                     asc_bus[bus]);
  1507.                 break;
  1508.             }
  1509.             ASC_DBG1(1, "advansys_detect: iop 0x%xn", iop);
  1510.             /*
  1511.              * Adapter not found, try next bus type.
  1512.              */
  1513.             if (iop == 0) {
  1514.                 break;
  1515.             }
  1516.             /*
  1517.              * Adapter found.
  1518.              *
  1519.              * Register the adapter, get its configuration, and
  1520.              * initialize it.
  1521.              */
  1522.             ASC_DBG(2, "advansys_detect: scsi_register()n");
  1523.             shp = scsi_register(tpnt, sizeof(asc_board_t));
  1524.             if (shp == NULL) {
  1525.                 continue;
  1526.             }
  1527. #ifdef CONFIG_PCI
  1528.     scsi_set_pci_device(shp, pci_devp);
  1529. #endif
  1530.             /* Save a pointer to the Scsi_host of each board found. */
  1531.             asc_host[asc_board_count++] = shp;
  1532.             /* Initialize private per board data */
  1533.             boardp = ASC_BOARDP(shp);
  1534.             memset(boardp, 0, sizeof(asc_board_t));
  1535.             boardp->id = asc_board_count - 1;
  1536.             /* Initialize spinlock. */
  1537.             boardp->lock = SPIN_LOCK_UNLOCKED;
  1538.             /*
  1539.              * Handle both narrow and wide boards.
  1540.              *
  1541.              * If a Wide board was detected, set the board structure
  1542.              * wide board flag. Set-up the board structure based on
  1543.              * the board type.
  1544.              */
  1545. #ifdef CONFIG_PCI
  1546.             if (asc_bus[bus] == ASC_IS_PCI &&
  1547.                 (pci_devp->device == ASC_PCI_DEVICE_ID_2300 ||
  1548.                  pci_devp->device == ASC_PCI_DEVICE_ID_2500 ||
  1549.                  pci_devp->device == ASC_PCI_DEVICE_ID_2700))
  1550.             {
  1551.                 boardp->flags |= ASC_IS_WIDE_BOARD;
  1552.             }
  1553. #endif /* CONFIG_PCI */
  1554.             if (ASC_NARROW_BOARD(boardp)) {
  1555.                 ASC_DBG(1, "advansys_detect: narrow boardn");
  1556.                 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
  1557.                 asc_dvc_varp->bus_type = asc_bus[bus];
  1558.                 asc_dvc_varp->drv_ptr = boardp;
  1559.                 asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg;
  1560.                 asc_dvc_varp->cfg->overrun_buf = &overrun_buf[0];
  1561.                 asc_dvc_varp->iop_base = iop;
  1562.                 asc_dvc_varp->isr_callback = asc_isr_callback;
  1563.             } else {
  1564.                 ASC_DBG(1, "advansys_detect: wide boardn");
  1565.                 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
  1566.                 adv_dvc_varp->drv_ptr = boardp;
  1567.                 adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg;
  1568.                 adv_dvc_varp->isr_callback = adv_isr_callback;
  1569.                 adv_dvc_varp->async_callback = adv_async_callback;
  1570. #ifdef CONFIG_PCI
  1571.                 if (pci_devp->device == ASC_PCI_DEVICE_ID_2300)
  1572.                 {
  1573.                     ASC_DBG(1, "advansys_detect: ASC-3550n");
  1574.                     adv_dvc_varp->chip_type = ADV_CHIP_ASC3550;
  1575.                 } else if (pci_devp->device == ASC_PCI_DEVICE_ID_2500)
  1576.                 {
  1577.                     ASC_DBG(1, "advansys_detect: ASC-38C0800n");
  1578.                     adv_dvc_varp->chip_type = ADV_CHIP_ASC38C0800;
  1579.                 } else
  1580.                 {
  1581.                     ASC_DBG(1, "advansys_detect: ASC-38C1600n");
  1582.                     adv_dvc_varp->chip_type = ADV_CHIP_ASC38C1600;
  1583.                 }
  1584. #endif /* CONFIG_PCI */
  1585.                 /*
  1586.                  * Map the board's registers into virtual memory for
  1587.                  * PCI slave access. Only memory accesses are used to
  1588.                  * access the board's registers.
  1589.                  *
  1590.                  * Note: The PCI register base address is not always
  1591.                  * page aligned, but the address passed to ioremap()
  1592.                  * must be page aligned. It is guaranteed that the
  1593.                  * PCI register base address will not cross a page
  1594.                  * boundary.
  1595.                  */
  1596.                 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1597.                 {
  1598.                     iolen = ADV_3550_IOLEN;
  1599.                 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1600.                 {
  1601.                     iolen = ADV_38C0800_IOLEN;
  1602.                 } else
  1603.                 {
  1604.                     iolen = ADV_38C1600_IOLEN;
  1605.                 }
  1606. #ifdef CONFIG_PCI
  1607. #if ASC_LINUX_KERNEL24
  1608.                 pci_memory_address = pci_resource_start(pci_devp, 1);
  1609. #elif ASC_LINUX_KERNEL22
  1610.                 pci_memory_address = pci_devp->base_address[1];
  1611. #endif
  1612.                 ASC_DBG1(1, "advansys_detect: pci_memory_address: 0x%lxn",
  1613.                     (ulong) pci_memory_address);
  1614.                 if ((boardp->ioremap_addr =
  1615.                     ioremap(pci_memory_address & PAGE_MASK,
  1616.                          PAGE_SIZE)) == 0) {
  1617.                    ASC_PRINT3(
  1618. "advansys_detect: board %d: ioremap(%x, %d) returned NULLn",
  1619.                        boardp->id, pci_memory_address, iolen);
  1620.                    scsi_unregister(shp);
  1621.                    asc_board_count--;
  1622.                    continue;
  1623.                 }
  1624.                 ASC_DBG1(1, "advansys_detect: ioremap_addr: 0x%lxn",
  1625.                     (ulong) boardp->ioremap_addr);
  1626.                 adv_dvc_varp->iop_base = (AdvPortAddr)
  1627.                     (boardp->ioremap_addr +
  1628.                      (pci_memory_address - (pci_memory_address & PAGE_MASK)));
  1629.                 ASC_DBG1(1, "advansys_detect: iop_base: 0x%lxn",
  1630.                     adv_dvc_varp->iop_base);
  1631. #endif /* CONFIG_PCI */
  1632.                 /*
  1633.                  * Even though it isn't used to access wide boards, other
  1634.                  * than for the debug line below, save I/O Port address so
  1635.                  * that it can be reported.
  1636.                  */
  1637.                 boardp->ioport = iop;
  1638.                 ASC_DBG2(1,
  1639. "advansys_detect: iopb_chip_id_1 0x%x, iopw_chip_id_0 0x%xn",
  1640.                     (ushort) inp(iop + 1), (ushort) inpw(iop));
  1641.             }
  1642. #ifdef CONFIG_PROC_FS
  1643.             /*
  1644.              * Allocate buffer for printing information from
  1645.              * /proc/scsi/advansys/[0...].
  1646.              */
  1647.             if ((boardp->prtbuf =
  1648.                 kmalloc(ASC_PRTBUF_SIZE, GFP_ATOMIC)) == NULL) {
  1649.                 ASC_PRINT3(
  1650. "advansys_detect: board %d: kmalloc(%d, %d) returned NULLn",
  1651.                     boardp->id, ASC_PRTBUF_SIZE, GFP_ATOMIC);
  1652.                 scsi_unregister(shp);
  1653.                 asc_board_count--;
  1654.                 continue;
  1655.             }
  1656. #endif /* CONFIG_PROC_FS */
  1657.             if (ASC_NARROW_BOARD(boardp)) {
  1658.                 /*
  1659.                  * Set the board bus type and PCI IRQ before
  1660.                  * calling AscInitGetConfig().
  1661.                  */
  1662.                 switch (asc_dvc_varp->bus_type) {
  1663. #ifdef CONFIG_ISA
  1664.                 case ASC_IS_ISA:
  1665.                     shp->unchecked_isa_dma = TRUE;
  1666.                     share_irq = FALSE;
  1667.                     break;
  1668.                 case ASC_IS_VL:
  1669.                     shp->unchecked_isa_dma = FALSE;
  1670.                     share_irq = FALSE;
  1671.                     break;
  1672.                 case ASC_IS_EISA:
  1673.                     shp->unchecked_isa_dma = FALSE;
  1674.                     share_irq = TRUE;
  1675.                     break;
  1676. #endif /* CONFIG_ISA */
  1677. #ifdef CONFIG_PCI
  1678.                 case ASC_IS_PCI:
  1679.                     shp->irq = asc_dvc_varp->irq_no = pci_devp->irq;
  1680.                     asc_dvc_varp->cfg->pci_device_id = pci_devp->device;
  1681.                     asc_dvc_varp->cfg->pci_slot_info =
  1682.                         ASC_PCI_MKID(pci_devp->bus->number,
  1683.                             PCI_SLOT(pci_devp->devfn),
  1684.                             PCI_FUNC(pci_devp->devfn));
  1685.                     shp->unchecked_isa_dma = FALSE;
  1686.                     share_irq = TRUE;
  1687.                     break;
  1688. #endif /* CONFIG_PCI */
  1689.                 default:
  1690.                     ASC_PRINT2(
  1691. "advansys_detect: board %d: unknown adapter type: %dn",
  1692.                         boardp->id, asc_dvc_varp->bus_type);
  1693.                     shp->unchecked_isa_dma = TRUE;
  1694.                     share_irq = FALSE;
  1695.                     break;
  1696.                 }
  1697.             } else {
  1698.                 /*
  1699.                  * For Wide boards set PCI information before calling
  1700.                  * AdvInitGetConfig().
  1701.                  */
  1702. #ifdef CONFIG_PCI
  1703.                 shp->irq = adv_dvc_varp->irq_no = pci_devp->irq;
  1704.                 adv_dvc_varp->cfg->pci_device_id = pci_devp->device;
  1705.                 adv_dvc_varp->cfg->pci_slot_info =
  1706.                     ASC_PCI_MKID(pci_devp->bus->number,
  1707.                         PCI_SLOT(pci_devp->devfn),
  1708.                         PCI_FUNC(pci_devp->devfn));
  1709.                 shp->unchecked_isa_dma = FALSE;
  1710.                 share_irq = TRUE;
  1711. #endif /* CONFIG_PCI */
  1712.             }
  1713.             /*
  1714.              * Read the board configuration.
  1715.              */
  1716.             if (ASC_NARROW_BOARD(boardp)) {
  1717.                  /*
  1718.                   * NOTE: AscInitGetConfig() may change the board's
  1719.                   * bus_type value. The asc_bus[bus] value should no
  1720.                   * longer be used. If the bus_type field must be
  1721.                   * referenced only use the bit-wise AND operator "&".
  1722.                   */
  1723.                 ASC_DBG(2, "advansys_detect: AscInitGetConfig()n");
  1724.                 switch(ret = AscInitGetConfig(asc_dvc_varp)) {
  1725.                 case 0:    /* No error */
  1726.                     break;
  1727.                 case ASC_WARN_IO_PORT_ROTATE:
  1728.                     ASC_PRINT1(
  1729. "AscInitGetConfig: board %d: I/O port address modifiedn",
  1730.                         boardp->id);
  1731.                     break;
  1732.                 case ASC_WARN_AUTO_CONFIG:
  1733.                     ASC_PRINT1(
  1734. "AscInitGetConfig: board %d: I/O port increment switch enabledn",
  1735.                         boardp->id);
  1736.                     break;
  1737.                 case ASC_WARN_EEPROM_CHKSUM:
  1738.                     ASC_PRINT1(
  1739. "AscInitGetConfig: board %d: EEPROM checksum errorn",
  1740.                         boardp->id);
  1741.                     break;
  1742.                 case ASC_WARN_IRQ_MODIFIED:
  1743.                     ASC_PRINT1(
  1744. "AscInitGetConfig: board %d: IRQ modifiedn",
  1745.                         boardp->id);
  1746.                     break;
  1747.                 case ASC_WARN_CMD_QNG_CONFLICT:
  1748.                     ASC_PRINT1(
  1749. "AscInitGetConfig: board %d: tag queuing enabled w/o disconnectsn",
  1750.                         boardp->id);
  1751.                     break;
  1752.                 default:
  1753.                     ASC_PRINT2(
  1754. "AscInitGetConfig: board %d: unknown warning: 0x%xn",
  1755.                         boardp->id, ret);
  1756.                     break;
  1757.                 }
  1758.                 if ((err_code = asc_dvc_varp->err_code) != 0) {
  1759.                     ASC_PRINT3(
  1760. "AscInitGetConfig: board %d error: init_state 0x%x, err_code 0x%xn",
  1761.                         boardp->id, asc_dvc_varp->init_state,
  1762.                         asc_dvc_varp->err_code);
  1763.                 }
  1764.             } else {
  1765.                 ASC_DBG(2, "advansys_detect: AdvInitGetConfig()n");
  1766.                 if ((ret = AdvInitGetConfig(adv_dvc_varp)) != 0) {
  1767.                     ASC_PRINT2("AdvInitGetConfig: board %d: warning: 0x%xn",
  1768.                         boardp->id, ret);
  1769.                 }
  1770.                 if ((err_code = adv_dvc_varp->err_code) != 0) {
  1771.                     ASC_PRINT2(
  1772. "AdvInitGetConfig: board %d error: err_code 0x%xn",
  1773.                         boardp->id, adv_dvc_varp->err_code);
  1774.                 }
  1775.             }
  1776.             if (err_code != 0) {
  1777. #ifdef CONFIG_PROC_FS
  1778.                 kfree(boardp->prtbuf);
  1779. #endif /* CONFIG_PROC_FS */
  1780.                 scsi_unregister(shp);
  1781.                 asc_board_count--;
  1782.                 continue;
  1783.             }
  1784.             /*
  1785.              * Save the EEPROM configuration so that it can be displayed
  1786.              * from /proc/scsi/advansys/[0...].
  1787.              */
  1788.             if (ASC_NARROW_BOARD(boardp)) {
  1789.                 ASCEEP_CONFIG *ep;
  1790.                 /*
  1791.                  * Set the adapter's target id bit in the 'init_tidmask' field.
  1792.                  */
  1793.                 boardp->init_tidmask |=
  1794.                     ADV_TID_TO_TIDMASK(asc_dvc_varp->cfg->chip_scsi_id);
  1795.                 /*
  1796.                  * Save EEPROM settings for the board.
  1797.                  */
  1798.                 ep = &boardp->eep_config.asc_eep;
  1799.                 ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable;
  1800.                 ep->disc_enable = asc_dvc_varp->cfg->disc_enable;
  1801.                 ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled;
  1802.                 ASC_EEP_SET_DMA_SPD(ep, asc_dvc_varp->cfg->isa_dma_speed);
  1803.                 ep->start_motor = asc_dvc_varp->start_motor;
  1804.                 ep->cntl = asc_dvc_varp->dvc_cntl;
  1805.                 ep->no_scam = asc_dvc_varp->no_scam;
  1806.                 ep->max_total_qng = asc_dvc_varp->max_total_qng;
  1807.                 ASC_EEP_SET_CHIP_ID(ep, asc_dvc_varp->cfg->chip_scsi_id);
  1808.                 /* 'max_tag_qng' is set to the same value for every device. */
  1809.                 ep->max_tag_qng = asc_dvc_varp->cfg->max_tag_qng[0];
  1810.                 ep->adapter_info[0] = asc_dvc_varp->cfg->adapter_info[0];
  1811.                 ep->adapter_info[1] = asc_dvc_varp->cfg->adapter_info[1];
  1812.                 ep->adapter_info[2] = asc_dvc_varp->cfg->adapter_info[2];
  1813.                 ep->adapter_info[3] = asc_dvc_varp->cfg->adapter_info[3];
  1814.                 ep->adapter_info[4] = asc_dvc_varp->cfg->adapter_info[4];
  1815.                 ep->adapter_info[5] = asc_dvc_varp->cfg->adapter_info[5];
  1816.                 ep->adapter_info[6] = asc_dvc_varp->cfg->adapter_info[6];
  1817.                /*
  1818.                 * Modify board configuration.
  1819.                 */
  1820.                 ASC_DBG(2, "advansys_detect: AscInitSetConfig()n");
  1821.                 switch (ret = AscInitSetConfig(asc_dvc_varp)) {
  1822.                 case 0:    /* No error. */
  1823.                     break;
  1824.                 case ASC_WARN_IO_PORT_ROTATE:
  1825.                     ASC_PRINT1(
  1826. "AscInitSetConfig: board %d: I/O port address modifiedn",
  1827.                         boardp->id);
  1828.                     break;
  1829.                 case ASC_WARN_AUTO_CONFIG:
  1830.                     ASC_PRINT1(
  1831. "AscInitSetConfig: board %d: I/O port increment switch enabledn",
  1832.                         boardp->id);
  1833.                     break;
  1834.                 case ASC_WARN_EEPROM_CHKSUM:
  1835.                     ASC_PRINT1(
  1836. "AscInitSetConfig: board %d: EEPROM checksum errorn",
  1837.                         boardp->id);
  1838.                     break;
  1839.                 case ASC_WARN_IRQ_MODIFIED:
  1840.                     ASC_PRINT1(
  1841. "AscInitSetConfig: board %d: IRQ modifiedn",
  1842.                         boardp->id);
  1843.                     break;
  1844.                 case ASC_WARN_CMD_QNG_CONFLICT:
  1845.                     ASC_PRINT1(
  1846. "AscInitSetConfig: board %d: tag queuing w/o disconnectsn",
  1847.                         boardp->id);
  1848.                     break;
  1849.                 default:
  1850.                     ASC_PRINT2(
  1851. "AscInitSetConfig: board %d: unknown warning: 0x%xn",
  1852.                         boardp->id, ret);
  1853.                     break;
  1854.                 }
  1855.                 if (asc_dvc_varp->err_code != 0) {
  1856.                     ASC_PRINT3(
  1857. "AscInitSetConfig: board %d error: init_state 0x%x, err_code 0x%xn",
  1858.                         boardp->id, asc_dvc_varp->init_state,
  1859.                         asc_dvc_varp->err_code);
  1860. #ifdef CONFIG_PROC_FS
  1861.                     kfree(boardp->prtbuf);
  1862. #endif /* CONFIG_PROC_FS */
  1863.                     scsi_unregister(shp);
  1864.                     asc_board_count--;
  1865.                     continue;
  1866.                 }
  1867.                 /*
  1868.                  * Finish initializing the 'Scsi_Host' structure.
  1869.                  */
  1870.                 /* AscInitSetConfig() will set the IRQ for non-PCI boards. */
  1871.                 if ((asc_dvc_varp->bus_type & ASC_IS_PCI) == 0) {
  1872.                     shp->irq = asc_dvc_varp->irq_no;
  1873.                 }
  1874.             } else {
  1875.                 ADVEEP_3550_CONFIG      *ep_3550;
  1876.                 ADVEEP_38C0800_CONFIG   *ep_38C0800;
  1877.                 ADVEEP_38C1600_CONFIG   *ep_38C1600;
  1878.                 /*
  1879.                  * Save Wide EEP Configuration Information.
  1880.                  */
  1881.                 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  1882.                 {
  1883.                     ep_3550 = &boardp->eep_config.adv_3550_eep;
  1884.                     ep_3550->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
  1885.                     ep_3550->max_host_qng = adv_dvc_varp->max_host_qng;
  1886.                     ep_3550->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
  1887.                     ep_3550->termination = adv_dvc_varp->cfg->termination;
  1888.                     ep_3550->disc_enable = adv_dvc_varp->cfg->disc_enable;
  1889.                     ep_3550->bios_ctrl = adv_dvc_varp->bios_ctrl;
  1890.                     ep_3550->wdtr_able = adv_dvc_varp->wdtr_able;
  1891.                     ep_3550->sdtr_able = adv_dvc_varp->sdtr_able;
  1892.                     ep_3550->ultra_able = adv_dvc_varp->ultra_able;
  1893.                     ep_3550->tagqng_able = adv_dvc_varp->tagqng_able;
  1894.                     ep_3550->start_motor = adv_dvc_varp->start_motor;
  1895.                     ep_3550->scsi_reset_delay = adv_dvc_varp->scsi_reset_wait;
  1896.                     ep_3550->serial_number_word1 =
  1897.                         adv_dvc_varp->cfg->serial1;
  1898.                     ep_3550->serial_number_word2 =
  1899.                         adv_dvc_varp->cfg->serial2;
  1900.                     ep_3550->serial_number_word3 =
  1901.                         adv_dvc_varp->cfg->serial3;
  1902.                 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  1903.                 {
  1904.                     ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
  1905.                     ep_38C0800->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
  1906.                     ep_38C0800->max_host_qng = adv_dvc_varp->max_host_qng;
  1907.                     ep_38C0800->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
  1908.                     ep_38C0800->termination_lvd =
  1909.                         adv_dvc_varp->cfg->termination;
  1910.                     ep_38C0800->disc_enable = adv_dvc_varp->cfg->disc_enable;
  1911.                     ep_38C0800->bios_ctrl = adv_dvc_varp->bios_ctrl;
  1912.                     ep_38C0800->wdtr_able = adv_dvc_varp->wdtr_able;
  1913.                     ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
  1914.                     ep_38C0800->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
  1915.                     ep_38C0800->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
  1916.                     ep_38C0800->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
  1917.                     ep_38C0800->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
  1918.                     ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
  1919.                     ep_38C0800->start_motor = adv_dvc_varp->start_motor;
  1920.                     ep_38C0800->scsi_reset_delay =
  1921.                         adv_dvc_varp->scsi_reset_wait;
  1922.                     ep_38C0800->serial_number_word1 =
  1923.                         adv_dvc_varp->cfg->serial1;
  1924.                     ep_38C0800->serial_number_word2 =
  1925.                         adv_dvc_varp->cfg->serial2;
  1926.                     ep_38C0800->serial_number_word3 =
  1927.                         adv_dvc_varp->cfg->serial3;
  1928.                 } else
  1929.                 {
  1930.                     ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
  1931.                     ep_38C1600->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
  1932.                     ep_38C1600->max_host_qng = adv_dvc_varp->max_host_qng;
  1933.                     ep_38C1600->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
  1934.                     ep_38C1600->termination_lvd =
  1935.                         adv_dvc_varp->cfg->termination;
  1936.                     ep_38C1600->disc_enable = adv_dvc_varp->cfg->disc_enable;
  1937.                     ep_38C1600->bios_ctrl = adv_dvc_varp->bios_ctrl;
  1938.                     ep_38C1600->wdtr_able = adv_dvc_varp->wdtr_able;
  1939.                     ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
  1940.                     ep_38C1600->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
  1941.                     ep_38C1600->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
  1942.                     ep_38C1600->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
  1943.                     ep_38C1600->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
  1944.                     ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
  1945.                     ep_38C1600->start_motor = adv_dvc_varp->start_motor;
  1946.                     ep_38C1600->scsi_reset_delay =
  1947.                         adv_dvc_varp->scsi_reset_wait;
  1948.                     ep_38C1600->serial_number_word1 =
  1949.                         adv_dvc_varp->cfg->serial1;
  1950.                     ep_38C1600->serial_number_word2 =
  1951.                         adv_dvc_varp->cfg->serial2;
  1952.                     ep_38C1600->serial_number_word3 =
  1953.                         adv_dvc_varp->cfg->serial3;
  1954.                 }
  1955.                 /*
  1956.                  * Set the adapter's target id bit in the 'init_tidmask' field.
  1957.                  */
  1958.                 boardp->init_tidmask |=
  1959.                     ADV_TID_TO_TIDMASK(adv_dvc_varp->chip_scsi_id);
  1960.                 /*
  1961.                  * Finish initializing the 'Scsi_Host' structure.
  1962.                  */
  1963.                 shp->irq = adv_dvc_varp->irq_no;
  1964.             }
  1965.             /*
  1966.              * Channels are numbered beginning with 0. For AdvanSys one host
  1967.              * structure supports one channel. Multi-channel boards have a
  1968.              * separate host structure for each channel.
  1969.              */
  1970.             shp->max_channel = 0;
  1971.             if (ASC_NARROW_BOARD(boardp)) {
  1972.                 shp->max_id = ASC_MAX_TID + 1;
  1973.                 shp->max_lun = ASC_MAX_LUN + 1;
  1974.                 shp->io_port = asc_dvc_varp->iop_base;
  1975.                 boardp->asc_n_io_port = ASC_IOADR_GAP;
  1976.                 shp->this_id = asc_dvc_varp->cfg->chip_scsi_id;
  1977.                 /* Set maximum number of queues the adapter can handle. */
  1978.                 shp->can_queue = asc_dvc_varp->max_total_qng;
  1979.             } else {
  1980.                 shp->max_id = ADV_MAX_TID + 1;
  1981.                 shp->max_lun = ADV_MAX_LUN + 1;
  1982.                 /*
  1983.                  * Save the I/O Port address and length even though
  1984.                  * I/O ports are not used to access Wide boards.
  1985.                  * Instead the Wide boards are accessed with
  1986.                  * PCI Memory Mapped I/O.
  1987.                  */
  1988.                 shp->io_port = iop;
  1989.                 boardp->asc_n_io_port = iolen;
  1990.                 shp->this_id = adv_dvc_varp->chip_scsi_id;
  1991.                 /* Set maximum number of queues the adapter can handle. */
  1992.                 shp->can_queue = adv_dvc_varp->max_host_qng;
  1993.             }
  1994.             /*
  1995.              * 'n_io_port' currently is one byte.
  1996.              *
  1997.              * Set a value to 'n_io_port', but never referenced it because
  1998.              * it may be truncated.
  1999.              */
  2000.             shp->n_io_port = boardp->asc_n_io_port <= 255 ?
  2001.                 boardp->asc_n_io_port : 255;
  2002.             /*
  2003.              * Following v1.3.89, 'cmd_per_lun' is no longer needed
  2004.              * and should be set to zero.
  2005.              *
  2006.              * But because of a bug introduced in v1.3.89 if the driver is
  2007.              * compiled as a module and 'cmd_per_lun' is zero, the Mid-Level
  2008.              * SCSI function 'allocate_device' will panic. To allow the driver
  2009.              * to work as a module in these kernels set 'cmd_per_lun' to 1.
  2010.              */
  2011. #ifdef MODULE
  2012.             shp->cmd_per_lun = 1;
  2013. #else /* MODULE */
  2014.             shp->cmd_per_lun = 0;
  2015. #endif /* MODULE */
  2016.             /*
  2017.              * Use the host 'select_queue_depths' function to determine
  2018.              * the number of commands to queue per device.
  2019.              */
  2020.             shp->select_queue_depths = advansys_select_queue_depths;
  2021.             /*
  2022.              * Set the maximum number of scatter-gather elements the
  2023.              * adapter can handle.
  2024.              */
  2025.             if (ASC_NARROW_BOARD(boardp)) {
  2026.                 /*
  2027.                  * Allow two commands with 'sg_tablesize' scatter-gather
  2028.                  * elements to be executed simultaneously. This value is
  2029.                  * the theoretical hardware limit. It may be decreased
  2030.                  * below.
  2031.                  */
  2032.                 shp->sg_tablesize =
  2033.                     (((asc_dvc_varp->max_total_qng - 2) / 2) *
  2034.                     ASC_SG_LIST_PER_Q) + 1;
  2035.             } else {
  2036.                 shp->sg_tablesize = ADV_MAX_SG_LIST;
  2037.             }
  2038.             /*
  2039.              * The value of 'sg_tablesize' can not exceed the SCSI
  2040.              * mid-level driver definition of SG_ALL. SG_ALL also
  2041.              * must not be exceeded, because it is used to define the
  2042.              * size of the scatter-gather table in 'struct asc_sg_head'.
  2043.              */
  2044.             if (shp->sg_tablesize > SG_ALL) {
  2045.                 shp->sg_tablesize = SG_ALL;
  2046.             }
  2047.             ASC_DBG1(1, "advansys_detect: sg_tablesize: %dn",
  2048.                 shp->sg_tablesize);
  2049.             /* BIOS start address. */
  2050.             if (ASC_NARROW_BOARD(boardp)) {
  2051. #if ASC_LINUX_KERNEL24
  2052.                 shp->base =
  2053. #elif ASC_LINUX_KERNEL22
  2054.                 shp->base = (char *)
  2055. #endif
  2056.                         ((ulong) AscGetChipBiosAddress(
  2057.                             asc_dvc_varp->iop_base,
  2058.                             asc_dvc_varp->bus_type));
  2059.             } else {
  2060.                 /*
  2061.                  * Fill-in BIOS board variables. The Wide BIOS saves
  2062.                  * information in LRAM that is used by the driver.
  2063.                  */
  2064.                 AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_SIGNATURE,
  2065.                     boardp->bios_signature);
  2066.                 AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_VERSION,
  2067.                     boardp->bios_version);
  2068.                 AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_CODESEG,
  2069.                     boardp->bios_codeseg);
  2070.                 AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_CODELEN,
  2071.                     boardp->bios_codelen);
  2072.                 ASC_DBG2(1,
  2073.                     "advansys_detect: bios_signature 0x%x, bios_version 0x%xn",
  2074.                     boardp->bios_signature, boardp->bios_version);
  2075.                 ASC_DBG2(1,
  2076.                     "advansys_detect: bios_codeseg 0x%x, bios_codelen 0x%xn",
  2077.                     boardp->bios_codeseg, boardp->bios_codelen);
  2078.                 /*
  2079.                  * If the BIOS saved a valid signature, then fill in
  2080.                  * the BIOS code segment base address.
  2081.                  */
  2082.                 if (boardp->bios_signature == 0x55AA) {
  2083.                     /*
  2084.                      * Convert x86 realmode code segment to a linear
  2085.                      * address by shifting left 4.
  2086.                      */
  2087.                     shp->base =
  2088. #if ASC_LINUX_KERNEL22
  2089.                         (char *)
  2090. #endif
  2091.                         ((ulong) boardp->bios_codeseg << 4);
  2092.                 } else {
  2093.                     shp->base = 0;
  2094.                 }
  2095.             }
  2096.             /*
  2097.              * Register Board Resources - I/O Port, DMA, IRQ
  2098.              */
  2099.             /*
  2100.              * Register I/O port range.
  2101.              *
  2102.              * For Wide boards the I/O ports are not used to access
  2103.              * the board, but request the region anyway.
  2104.              *
  2105.              * 'shp->n_io_port' is not referenced, because it may be truncated.
  2106.              */
  2107.             ASC_DBG2(2,
  2108.                 "advansys_detect: request_region port 0x%lx, len 0x%xn",
  2109.                 (ulong) shp->io_port, boardp->asc_n_io_port);
  2110. #if ASC_LINUX_KERNEL24
  2111.             if (request_region(shp->io_port, boardp->asc_n_io_port,
  2112.                                "advansys") == NULL) {
  2113.                 ASC_PRINT3(
  2114. "advansys_detect: board %d: request_region() failed, port 0x%lx, len 0x%xn",
  2115.                     boardp->id, (ulong) shp->io_port, boardp->asc_n_io_port);
  2116. #ifdef CONFIG_PROC_FS
  2117.                 kfree(boardp->prtbuf);
  2118. #endif /* CONFIG_PROC_FS */
  2119.                 scsi_unregister(shp);
  2120.                 asc_board_count--;
  2121.                 continue;
  2122.             }
  2123. #elif ASC_LINUX_KERNEL22
  2124.             request_region(shp->io_port, boardp->asc_n_io_port, "advansys");
  2125. #endif
  2126.             /* Register DMA Channel for Narrow boards. */
  2127.             shp->dma_channel = NO_ISA_DMA; /* Default to no ISA DMA. */
  2128. #ifdef CONFIG_ISA
  2129.             if (ASC_NARROW_BOARD(boardp)) {
  2130.                 /* Register DMA channel for ISA bus. */
  2131.                 if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
  2132.                     shp->dma_channel = asc_dvc_varp->cfg->isa_dma_channel;
  2133.                     if ((ret =
  2134.                          request_dma(shp->dma_channel, "advansys")) != 0) {
  2135.                         ASC_PRINT3(
  2136. "advansys_detect: board %d: request_dma() %d failed %dn",
  2137.                             boardp->id, shp->dma_channel, ret);
  2138.                         release_region(shp->io_port, boardp->asc_n_io_port);
  2139. #ifdef CONFIG_PROC_FS
  2140.                         kfree(boardp->prtbuf);
  2141. #endif /* CONFIG_PROC_FS */
  2142.                         scsi_unregister(shp);
  2143.                         asc_board_count--;
  2144.                         continue;
  2145.                     }
  2146.                     AscEnableIsaDma(shp->dma_channel);
  2147.                 }
  2148.             }
  2149. #endif /* CONFIG_ISA */
  2150.             /* Register IRQ Number. */
  2151.             ASC_DBG1(2, "advansys_detect: request_irq() %dn", shp->irq);
  2152.            /*
  2153.             * If request_irq() fails with the SA_INTERRUPT flag set,
  2154.             * then try again without the SA_INTERRUPT flag set. This
  2155.             * allows IRQ sharing to work even with other drivers that
  2156.             * do not set the SA_INTERRUPT flag.
  2157.             *
  2158.             * If SA_INTERRUPT is not set, then interrupts are enabled
  2159.             * before the driver interrupt function is called.
  2160.             */
  2161.             if (((ret = request_irq(shp->irq, advansys_interrupt,
  2162.                             SA_INTERRUPT | (share_irq == TRUE ? SA_SHIRQ : 0),
  2163.                             "advansys", boardp)) != 0) &&
  2164.                 ((ret = request_irq(shp->irq, advansys_interrupt,
  2165.                             (share_irq == TRUE ? SA_SHIRQ : 0),
  2166.                             "advansys", boardp)) != 0))
  2167.             {
  2168.                 if (ret == -EBUSY) {
  2169.                     ASC_PRINT2(
  2170. "advansys_detect: board %d: request_irq(): IRQ 0x%x already in use.n",
  2171.                         boardp->id, shp->irq);
  2172.                 } else if (ret == -EINVAL) {
  2173.                     ASC_PRINT2(
  2174. "advansys_detect: board %d: request_irq(): IRQ 0x%x not valid.n",
  2175.                         boardp->id, shp->irq);
  2176.                 } else {
  2177.                     ASC_PRINT3(
  2178. "advansys_detect: board %d: request_irq(): IRQ 0x%x failed with %dn",
  2179.                         boardp->id, shp->irq, ret);
  2180.                 }
  2181.                 release_region(shp->io_port, boardp->asc_n_io_port);
  2182.                 iounmap(boardp->ioremap_addr);
  2183.                 if (shp->dma_channel != NO_ISA_DMA) {
  2184.                     free_dma(shp->dma_channel);
  2185.                 }
  2186. #ifdef CONFIG_PROC_FS
  2187.                 kfree(boardp->prtbuf);
  2188. #endif /* CONFIG_PROC_FS */
  2189.                 scsi_unregister(shp);
  2190.                 asc_board_count--;
  2191.                 continue;
  2192.             }
  2193.             /*
  2194.              * Initialize board RISC chip and enable interrupts.
  2195.              */
  2196.             if (ASC_NARROW_BOARD(boardp)) {
  2197.                 ASC_DBG(2, "advansys_detect: AscInitAsc1000Driver()n");
  2198.                 warn_code = AscInitAsc1000Driver(asc_dvc_varp);
  2199.                 err_code = asc_dvc_varp->err_code;
  2200.                 if (warn_code || err_code) {
  2201.                     ASC_PRINT4(
  2202. "advansys_detect: board %d error: init_state 0x%x, warn 0x%x, error 0x%xn",
  2203.                         boardp->id, asc_dvc_varp->init_state,
  2204.                         warn_code, err_code);
  2205.                 }
  2206.             } else {
  2207.                 ADV_CARR_T      *carrp;
  2208.                 int             req_cnt;
  2209.                 adv_req_t       *reqp = NULL;
  2210.                 int             sg_cnt = 0;
  2211.                 /*
  2212.                  * Allocate buffer carrier structures. The total size
  2213.                  * is about 4 KB, so allocate all at once.
  2214.                  */
  2215.                 carrp =
  2216.                     (ADV_CARR_T *) kmalloc(ADV_CARRIER_BUFSIZE, GFP_ATOMIC);
  2217.                 ASC_DBG1(1, "advansys_detect: carrp 0x%lxn", (ulong) carrp);
  2218.                 if (carrp == NULL) {
  2219.                     goto kmalloc_error;
  2220.                 }
  2221.                 /*
  2222.                  * Allocate up to 'max_host_qng' request structures for
  2223.                  * the Wide board. The total size is about 16 KB, so
  2224.                  * allocate all at once. If the allocation fails decrement
  2225.                  * and try again.
  2226.                  */
  2227.                 for (req_cnt = adv_dvc_varp->max_host_qng;
  2228.                     req_cnt > 0; req_cnt--) {
  2229.                     reqp = (adv_req_t *)
  2230.                         kmalloc(sizeof(adv_req_t) * req_cnt, GFP_ATOMIC);
  2231.                     ASC_DBG3(1,
  2232.                         "advansys_detect: reqp 0x%lx, req_cnt %d, bytes %lun",
  2233.                         (ulong) reqp, req_cnt,
  2234.                         (ulong) sizeof(adv_req_t) * req_cnt);
  2235.                     if (reqp != NULL) {
  2236.                         break;
  2237.                     }
  2238.                 }
  2239.                 if (reqp == NULL)
  2240.                 {
  2241.                     goto kmalloc_error;
  2242.                 }
  2243.                 /*
  2244.                  * Allocate up to ADV_TOT_SG_BLOCK request structures for
  2245.                  * the Wide board. Each structure is about 136 bytes.
  2246.                  */
  2247.                 boardp->adv_sgblkp = NULL;
  2248.                 for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) {
  2249.                     sgp = (adv_sgblk_t *)
  2250.                         kmalloc(sizeof(adv_sgblk_t), GFP_ATOMIC);
  2251.                     if (sgp == NULL) {
  2252.                         break;
  2253.                     }
  2254.                     sgp->next_sgblkp = boardp->adv_sgblkp;
  2255.                     boardp->adv_sgblkp = sgp;
  2256.                 }
  2257.                 ASC_DBG3(1,
  2258.                     "advansys_detect: sg_cnt %d * %u = %u bytesn",
  2259.                     sg_cnt, sizeof(adv_sgblk_t),
  2260.                     (unsigned) (sizeof(adv_sgblk_t) * sg_cnt));
  2261.                 /*
  2262.                  * If no request structures or scatter-gather structures could
  2263.                  * be allocated, then return an error. Otherwise continue with
  2264.                  * initialization.
  2265.                  */
  2266.     kmalloc_error:
  2267.                 if (carrp == NULL)
  2268.                 {
  2269.                     ASC_PRINT1(
  2270. "advansys_detect: board %d error: failed to kmalloc() carrier buffer.n",
  2271.                         boardp->id);
  2272.                     err_code = ADV_ERROR;
  2273.                 } else if (reqp == NULL) {
  2274.                     kfree(carrp);
  2275.                     ASC_PRINT1(
  2276. "advansys_detect: board %d error: failed to kmalloc() adv_req_t buffer.n",
  2277.                         boardp->id);
  2278.                     err_code = ADV_ERROR;
  2279.                 } else if (boardp->adv_sgblkp == NULL) {
  2280.                     kfree(carrp);
  2281.                     kfree(reqp);
  2282.                     ASC_PRINT1(
  2283. "advansys_detect: board %d error: failed to kmalloc() adv_sgblk_t buffers.n",
  2284.                         boardp->id);
  2285.                     err_code = ADV_ERROR;
  2286.                 } else {
  2287.                     /* Save carrier buffer pointer. */
  2288.                     boardp->orig_carrp = carrp;
  2289.                     /*
  2290.                      * Save original pointer for kfree() in case the
  2291.                      * driver is built as a module and can be unloaded.
  2292.                      */
  2293.                     boardp->orig_reqp = reqp;
  2294.                     adv_dvc_varp->carrier_buf = carrp;
  2295.                     /*
  2296.                      * Point 'adv_reqp' to the request structures and
  2297.                      * link them together.
  2298.                      */
  2299.                     req_cnt--;
  2300.                     reqp[req_cnt].next_reqp = NULL;
  2301.                     for (; req_cnt > 0; req_cnt--) {
  2302.                         reqp[req_cnt - 1].next_reqp = &reqp[req_cnt];
  2303.                     }
  2304.                     boardp->adv_reqp = &reqp[0];
  2305.                     if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  2306.                     {
  2307.                         ASC_DBG(2,
  2308.                             "advansys_detect: AdvInitAsc3550Driver()n");
  2309.                         warn_code = AdvInitAsc3550Driver(adv_dvc_varp);
  2310.                     } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
  2311.                         ASC_DBG(2,
  2312.                             "advansys_detect: AdvInitAsc38C0800Driver()n");
  2313.                         warn_code = AdvInitAsc38C0800Driver(adv_dvc_varp);
  2314.                     } else {
  2315.                         ASC_DBG(2,
  2316.                             "advansys_detect: AdvInitAsc38C1600Driver()n");
  2317.                         warn_code = AdvInitAsc38C1600Driver(adv_dvc_varp);
  2318.                     }
  2319.                     err_code = adv_dvc_varp->err_code;
  2320.                     if (warn_code || err_code) {
  2321.                         ASC_PRINT3(
  2322. "advansys_detect: board %d error: warn 0x%x, error 0x%xn",
  2323.                             boardp->id, warn_code, err_code);
  2324.                     }
  2325.                 }
  2326.             }
  2327.             if (err_code != 0) {
  2328.                 release_region(shp->io_port, boardp->asc_n_io_port);
  2329.                 if (ASC_WIDE_BOARD(boardp)) {
  2330.                     iounmap(boardp->ioremap_addr);
  2331.                     if (boardp->orig_carrp) {
  2332.                         kfree(boardp->orig_carrp);
  2333.                         boardp->orig_carrp = NULL;
  2334.                     }
  2335.                     if (boardp->orig_reqp) {
  2336.                         kfree(boardp->orig_reqp);
  2337.                         boardp->orig_reqp = boardp->adv_reqp = NULL;
  2338.                     }
  2339.                     while ((sgp = boardp->adv_sgblkp) != NULL)
  2340.                     {
  2341.                         boardp->adv_sgblkp = sgp->next_sgblkp;
  2342.                         kfree(sgp);
  2343.                     }
  2344.                 }
  2345.                 if (shp->dma_channel != NO_ISA_DMA) {
  2346.                     free_dma(shp->dma_channel);
  2347.                 }
  2348. #ifdef CONFIG_PROC_FS
  2349.                 kfree(boardp->prtbuf);
  2350. #endif /* CONFIG_PROC_FS */
  2351.                 free_irq(shp->irq, boardp);
  2352.                 scsi_unregister(shp);
  2353.                 asc_board_count--;
  2354.                 continue;
  2355.             }
  2356.             ASC_DBG_PRT_SCSI_HOST(2, shp);
  2357.         }
  2358.     }
  2359.     /*
  2360.      * XXX - Remove this comment and the next line when SCSI mid-level
  2361.      * no longer acquires 'io_request_lock' before calling the SCSI
  2362.      * low-level detect entrypoint.
  2363.      */
  2364.     ASC_LOCK_IO_REQUEST_LOCK
  2365.     ASC_DBG1(1, "advansys_detect: done: asc_board_count %dn", asc_board_count);
  2366.     return asc_board_count;
  2367. }
  2368. /*
  2369.  * advansys_release()
  2370.  *
  2371.  * Release resources allocated for a single AdvanSys adapter.
  2372.  */
  2373. int
  2374. advansys_release(struct Scsi_Host *shp)
  2375. {
  2376.     asc_board_t    *boardp;
  2377.     ASC_DBG(1, "advansys_release: beginn");
  2378.     boardp = ASC_BOARDP(shp);
  2379.     free_irq(shp->irq, boardp);
  2380.     if (shp->dma_channel != NO_ISA_DMA) {
  2381.         ASC_DBG(1, "advansys_release: free_dma()n");
  2382.         free_dma(shp->dma_channel);
  2383.     }
  2384.     release_region(shp->io_port, boardp->asc_n_io_port);
  2385.     if (ASC_WIDE_BOARD(boardp)) {
  2386.         adv_sgblk_t    *sgp = NULL;
  2387.         iounmap(boardp->ioremap_addr);
  2388.         if (boardp->orig_carrp) {
  2389.             kfree(boardp->orig_carrp);
  2390.             boardp->orig_carrp = NULL;
  2391.         }
  2392.         if (boardp->orig_reqp) {
  2393.             kfree(boardp->orig_reqp);
  2394.             boardp->orig_reqp = boardp->adv_reqp = NULL;
  2395.         }
  2396.         while ((sgp = boardp->adv_sgblkp) != NULL)
  2397.         {
  2398.             boardp->adv_sgblkp = sgp->next_sgblkp;
  2399.             kfree(sgp);
  2400.         }
  2401.     }
  2402. #ifdef CONFIG_PROC_FS
  2403.     ASC_ASSERT(boardp->prtbuf != NULL);
  2404.     kfree(boardp->prtbuf);
  2405. #endif /* CONFIG_PROC_FS */
  2406.     scsi_unregister(shp);
  2407.     ASC_DBG(1, "advansys_release: endn");
  2408.     return 0;
  2409. }
  2410. /*
  2411.  * advansys_info()
  2412.  *
  2413.  * Return suitable for printing on the console with the argument
  2414.  * adapter's configuration information.
  2415.  *
  2416.  * Note: The information line should not exceed ASC_INFO_SIZE bytes,
  2417.  * otherwise the static 'info' array will be overrun.
  2418.  */
  2419. const char *
  2420. advansys_info(struct Scsi_Host *shp)
  2421. {
  2422.     static char     info[ASC_INFO_SIZE];
  2423.     asc_board_t     *boardp;
  2424.     ASC_DVC_VAR     *asc_dvc_varp;
  2425.     ADV_DVC_VAR     *adv_dvc_varp;
  2426.     char            *busname;
  2427.     int             iolen;
  2428.     char            *widename = NULL;
  2429.     boardp = ASC_BOARDP(shp);
  2430.     if (ASC_NARROW_BOARD(boardp)) {
  2431.         asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
  2432.         ASC_DBG(1, "advansys_info: beginn");
  2433.         if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
  2434.             if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) == ASC_IS_ISAPNP) {
  2435.                 busname = "ISA PnP";
  2436.             } else {
  2437.                 busname = "ISA";
  2438.             }
  2439.             /* Don't reference 'shp->n_io_port'; It may be truncated. */
  2440.             sprintf(info,
  2441. "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
  2442.                 ASC_VERSION, busname,
  2443.                 (ulong) shp->io_port,
  2444.                 (ulong) shp->io_port + boardp->asc_n_io_port - 1,
  2445.                 shp->irq, shp->dma_channel);
  2446.         } else {
  2447.             if (asc_dvc_varp->bus_type & ASC_IS_VL) {
  2448.                 busname = "VL";
  2449.             } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) {
  2450.                 busname = "EISA";
  2451.             } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) {
  2452.                 if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA)
  2453.                     == ASC_IS_PCI_ULTRA) {
  2454.                     busname = "PCI Ultra";
  2455.                 } else {
  2456.                     busname = "PCI";
  2457.                 }
  2458.             } else {
  2459.                 busname = "?";
  2460.                 ASC_PRINT2( "advansys_info: board %d: unknown bus type %dn",
  2461.                     boardp->id, asc_dvc_varp->bus_type);
  2462.             }
  2463.             /* Don't reference 'shp->n_io_port'; It may be truncated. */
  2464.             sprintf(info,
  2465.                 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
  2466.                 ASC_VERSION, busname,
  2467.                 (ulong) shp->io_port,
  2468.                 (ulong) shp->io_port + boardp->asc_n_io_port - 1,
  2469.                 shp->irq);
  2470.         }
  2471.     } else {
  2472.         /*
  2473.          * Wide Adapter Information
  2474.          *
  2475.          * Memory-mapped I/O is used instead of I/O space to access
  2476.          * the adapter, but display the I/O Port range. The Memory
  2477.          * I/O address is displayed through the driver /proc file.
  2478.          */
  2479.         adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
  2480.         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
  2481.         {
  2482.             iolen = ADV_3550_IOLEN;
  2483.             widename = "Ultra-Wide";
  2484.         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
  2485.         {
  2486.             iolen = ADV_38C0800_IOLEN;
  2487.             widename = "Ultra2-Wide";
  2488.         } else
  2489.         {
  2490.             iolen = ADV_38C1600_IOLEN;
  2491.             widename = "Ultra3-Wide";
  2492.         }
  2493.         sprintf(info, "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
  2494.             ASC_VERSION,
  2495.             widename,
  2496.             (ulong) adv_dvc_varp->iop_base,
  2497.             (ulong) adv_dvc_varp->iop_base + iolen - 1,
  2498.             shp->irq);
  2499.     }
  2500.     ASC_ASSERT(strlen(info) < ASC_INFO_SIZE);
  2501.     ASC_DBG(1, "advansys_info: endn");
  2502.     return info;
  2503. }
  2504. /*
  2505.  * advansys_queuecommand() - interrupt-driven I/O entrypoint.
  2506.  *
  2507.  * This function always returns 0. Command return status is saved
  2508.  * in the 'scp' result field.
  2509.  */
  2510. int
  2511. advansys_queuecommand(Scsi_Cmnd *scp, void (*done)(Scsi_Cmnd *))
  2512. {
  2513.     struct Scsi_Host    *shp;
  2514.     asc_board_t         *boardp;
  2515.     ulong               flags;
  2516.     Scsi_Cmnd           *done_scp;
  2517.     shp = scp->host;
  2518.     boardp = ASC_BOARDP(shp);
  2519.     ASC_STATS(shp, queuecommand);
  2520.     /*
  2521.      * XXX - Remove this comment and the next line when SCSI mid-level
  2522.      * no longer acquires 'io_request_lock' before calling the SCSI
  2523.      * low-level queuecommand entrypoint.
  2524.      */
  2525.     ASC_UNLOCK_IO_REQUEST_LOCK
  2526.     spin_lock_irqsave(&boardp->lock, flags);
  2527.     /*
  2528.      * Block new commands while handling a reset or abort request.
  2529.      */
  2530.     if (boardp->flags & ASC_HOST_IN_RESET) {
  2531.         ASC_DBG1(1,
  2532.             "advansys_queuecommand: scp 0x%lx blocked for reset requestn",
  2533.             (ulong) scp);
  2534.         scp->result = HOST_BYTE(DID_RESET);
  2535.         /*
  2536.          * Add blocked requests to the board's 'done' queue. The queued
  2537.          * requests will be completed at the end of the abort or reset
  2538.          * handling.
  2539.          */
  2540.         asc_enqueue(&boardp->done, scp, ASC_BACK);
  2541.         spin_unlock_irqrestore(&boardp->lock, flags);
  2542.         return 0;
  2543.     }
  2544.     /*
  2545.      * Attempt to execute any waiting commands for the board.
  2546.      */
  2547.     if (!ASC_QUEUE_EMPTY(&boardp->waiting)) {
  2548.         ASC_DBG(1,
  2549.             "advansys_queuecommand: before asc_execute_queue() waitingn");
  2550.         asc_execute_queue(&boardp->waiting);
  2551.     }
  2552.     /*
  2553.      * Save the function pointer to Linux mid-level 'done' function
  2554.      * and attempt to execute the command.
  2555.      *
  2556.      * If ASC_NOERROR is returned the request has been added to the
  2557.      * board's 'active' queue and will be completed by the interrupt
  2558.      * handler.
  2559.      *
  2560.      * If ASC_BUSY is returned add the request to the board's per
  2561.      * target waiting list. This is the first time the request has
  2562.      * been tried. Add it to the back of the waiting list. It will be
  2563.      * retried later.
  2564.      *
  2565.      * If an error occurred, the request will have been placed on the
  2566.      * board's 'done' queue and must be completed before returning.
  2567.      */
  2568.     scp->scsi_done = done;
  2569.     switch (asc_execute_scsi_cmnd(scp)) {
  2570.     case ASC_NOERROR:
  2571.         break;
  2572.     case ASC_BUSY:
  2573.         asc_enqueue(&boardp->waiting, scp, ASC_BACK);
  2574.         break;
  2575.     case ASC_ERROR:
  2576.     default:
  2577.         done_scp = asc_dequeue_list(&boardp->done, NULL, ASC_TID_ALL);
  2578.         /* Interrupts could be enabled here. */
  2579.         asc_scsi_done_list(done_scp);
  2580.         break;
  2581.     }
  2582.     spin_unlock_irqrestore(&boardp->lock, flags);
  2583.     /*
  2584.      * XXX - Remove this comment and the next line when SCSI mid-level
  2585.      * no longer acquires 'io_request_lock' before calling the SCSI
  2586.      * low-level queuecommand entrypoint.
  2587.      */
  2588.     ASC_LOCK_IO_REQUEST_LOCK
  2589.     return 0;
  2590. }
  2591. /*
  2592.  * advansys_reset()
  2593.  *
  2594.  * Reset the bus associated with the command 'scp'.
  2595.  *
  2596.  * This function runs its own thread. Interrupts must be blocked but
  2597.  * sleeping is allowed and no locking other than for host structures is
  2598.  * required. Returns SUCCESS or FAILED.
  2599.  */
  2600. int
  2601. advansys_reset(Scsi_Cmnd *scp)
  2602. {
  2603.     struct Scsi_Host     *shp;
  2604.     asc_board_t          *boardp;
  2605.     ASC_DVC_VAR          *asc_dvc_varp;
  2606.     ADV_DVC_VAR          *adv_dvc_varp;
  2607.     ulong                flags;
  2608.     Scsi_Cmnd            *done_scp = NULL, *last_scp = NULL;
  2609.     Scsi_Cmnd            *tscp, *new_last_scp;
  2610.     int                  status;
  2611.     int                  ret = SUCCESS;
  2612.     ASC_DBG1(1, "advansys_reset: 0x%lxn", (ulong) scp);
  2613. #ifdef ADVANSYS_STATS
  2614.     if (scp->host != NULL) {
  2615.         ASC_STATS(scp->host, reset);
  2616.     }
  2617. #endif /* ADVANSYS_STATS */
  2618.     if ((shp = scp->host) == NULL) {
  2619.         scp->result = HOST_BYTE(DID_ERROR);
  2620.         return FAILED;
  2621.     }
  2622.     boardp = ASC_BOARDP(shp);
  2623.     ASC_PRINT1("advansys_reset: board %d: SCSI bus reset started...n",
  2624.         boardp->id);
  2625.     /*
  2626.      * Check for re-entrancy.
  2627.      */
  2628.     spin_lock_irqsave(&boardp->lock, flags);
  2629.     if (boardp->flags & ASC_HOST_IN_RESET) {
  2630.         spin_unlock_irqrestore(&boardp->lock, flags);
  2631.         return FAILED;
  2632.     }
  2633.     boardp->flags |= ASC_HOST_IN_RESET;
  2634.     spin_unlock_irqrestore(&boardp->lock, flags);
  2635.     /*
  2636.      * XXX - Remove this comment and the next line when SCSI mid-level
  2637.      * no longer acquires 'io_request_lock' before calling the SCSI
  2638.      * low-level reset entrypoint.
  2639.      */
  2640.     ASC_UNLOCK_IO_REQUEST_LOCK
  2641.     if (ASC_NARROW_BOARD(boardp)) {
  2642.         /*
  2643.          * Narrow Board
  2644.          */
  2645.         asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
  2646.         /*
  2647.          * Reset the chip and SCSI bus.
  2648.          */
  2649.         ASC_DBG(1, "advansys_reset: before AscInitAsc1000Driver()n");
  2650.         status = AscInitAsc1000Driver(asc_dvc_varp);
  2651.         /* Refer to ASC_IERR_* defintions for meaning of 'err_code'. */
  2652.         if (asc_dvc_varp->err_code) {
  2653.             ASC_PRINT2(
  2654.                 "advansys_reset: board %d: SCSI bus reset error: 0x%xn",
  2655.                 boardp->id, asc_dvc_varp->err_code);
  2656.             ret = FAILED;
  2657.         } else if (status) {
  2658.             ASC_PRINT2(
  2659.                 "advansys_reset: board %d: SCSI bus reset warning: 0x%xn",
  2660.                 boardp->id, status);
  2661.         } else {
  2662.             ASC_PRINT1(
  2663.                 "advansys_reset: board %d: SCSI bus reset successful.n",
  2664.                 boardp->id);
  2665.         }
  2666.         ASC_DBG(1, "advansys_reset: after AscInitAsc1000Driver()n");
  2667.         /*
  2668.          * Acquire the board lock.
  2669.          */
  2670.         spin_lock_irqsave(&boardp->lock, flags);
  2671.     } else {
  2672.         /*
  2673.          * Wide Board
  2674.          *
  2675.          * If the suggest reset bus flags are set, then reset the bus.
  2676.          * Otherwise only reset the device.
  2677.          */
  2678.         adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
  2679.         /*
  2680.          * Reset the target's SCSI bus.
  2681.          */
  2682.         ASC_DBG(1, "advansys_reset: before AdvResetChipAndSB()n");
  2683.         switch (AdvResetChipAndSB(adv_dvc_varp)) {
  2684.         case ASC_TRUE:
  2685.             ASC_PRINT1("advansys_reset: board %d: SCSI bus reset successful.n",
  2686.                 boardp->id);
  2687.             break;
  2688.         case ASC_FALSE:
  2689.         default:
  2690.             ASC_PRINT1("advansys_reset: board %d: SCSI bus reset error.n",
  2691.                 boardp->id);
  2692.             ret = FAILED;
  2693.             break;
  2694.         }
  2695.         /*
  2696.          * Acquire the board lock and ensure all requests completed by the
  2697.          * microcode have been processed by calling AdvISR().
  2698.          */
  2699.         spin_lock_irqsave(&boardp->lock, flags);
  2700.         (void) AdvISR(adv_dvc_varp);
  2701.     }
  2702.     /* Board lock is held. */
  2703.     /*
  2704.      * Dequeue all board 'done' requests. A pointer to the last request
  2705.      * is returned in 'last_scp'.
  2706.      */
  2707.     done_scp = asc_dequeue_list(&boardp->done, &last_scp, ASC_TID_ALL);
  2708.     /*
  2709.      * Dequeue all board 'active' requests for all devices and set
  2710.      * the request status to DID_RESET. A pointer to the last request
  2711.      * is returned in 'last_scp'.
  2712.      */
  2713.     if (done_scp == NULL) {
  2714.         done_scp = asc_dequeue_list(&boardp->active, &last_scp, ASC_TID_ALL);
  2715.         for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
  2716.             tscp->result = HOST_BYTE(DID_RESET);
  2717.         }
  2718.     } else {
  2719.         /* Append to 'done_scp' at the end with 'last_scp'. */
  2720.         ASC_ASSERT(last_scp != NULL);
  2721.         REQPNEXT(last_scp) = asc_dequeue_list(&boardp->active,
  2722.             &new_last_scp, ASC_TID_ALL);
  2723.         if (new_last_scp != NULL) {
  2724.             ASC_ASSERT(REQPNEXT(last_scp) != NULL);
  2725.             for (tscp = REQPNEXT(last_scp); tscp; tscp = REQPNEXT(tscp)) {
  2726.                 tscp->result = HOST_BYTE(DID_RESET);
  2727.             }
  2728.             last_scp = new_last_scp;
  2729.         }
  2730.     }
  2731.     /*
  2732.      * Dequeue all 'waiting' requests and set the request status
  2733.      * to DID_RESET.
  2734.      */
  2735.     if (done_scp == NULL) {
  2736.         done_scp = asc_dequeue_list(&boardp->waiting, &last_scp, ASC_TID_ALL);
  2737.         for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
  2738.             tscp->result = HOST_BYTE(DID_RESET);
  2739.         }
  2740.     } else {
  2741.         /* Append to 'done_scp' at the end with 'last_scp'. */
  2742.         ASC_ASSERT(last_scp != NULL);
  2743.         REQPNEXT(last_scp) = asc_dequeue_list(&boardp->waiting,
  2744.             &new_last_scp, ASC_TID_ALL);
  2745.         if (new_last_scp != NULL) {
  2746.             ASC_ASSERT(REQPNEXT(last_scp) != NULL);
  2747.             for (tscp = REQPNEXT(last_scp); tscp; tscp = REQPNEXT(tscp)) {
  2748.                 tscp->result = HOST_BYTE(DID_RESET);
  2749.             }
  2750.             last_scp = new_last_scp;
  2751.         }
  2752.     }
  2753.     /* Save the time of the most recently completed reset. */
  2754.     boardp->last_reset = jiffies;
  2755.     /* Clear reset flag. */
  2756.     boardp->flags &= ~ASC_HOST_IN_RESET;
  2757.     /* Release the board. */
  2758.     spin_unlock_irqrestore(&boardp->lock, flags);
  2759.     /*
  2760.      * Complete all the 'done_scp' requests.
  2761.      */
  2762.     if (done_scp != NULL) {
  2763.         asc_scsi_done_list(done_scp);
  2764.     }
  2765.     /*
  2766.      * XXX - Remove this comment and the next line when SCSI mid-level
  2767.      * no longer acquires 'io_request_lock' before calling the SCSI
  2768.      * low-level reset entrypoint.
  2769.      */
  2770.     ASC_LOCK_IO_REQUEST_LOCK
  2771.     ASC_DBG1(1, "advansys_reset: ret %dn", ret);
  2772.     return ret;
  2773. }
  2774. /*
  2775.  * advansys_biosparam()
  2776.  *
  2777.  * Translate disk drive geometry if the "BIOS greater than 1 GB"
  2778.  * support is enabled for a drive.
  2779.  *
  2780.  * ip (information pointer) is an int array with the following definition:
  2781.  * ip[0]: heads
  2782.  * ip[1]: sectors
  2783.  * ip[2]: cylinders
  2784.  */
  2785. int
  2786. advansys_biosparam(Disk *dp, kdev_t dep, int ip[])
  2787. {
  2788.     asc_board_t     *boardp;
  2789.     ASC_DBG(1, "advansys_biosparam: beginn");
  2790.     ASC_STATS(dp->device->host, biosparam);
  2791.     boardp = ASC_BOARDP(dp->device->host);
  2792.     if (ASC_NARROW_BOARD(boardp)) {
  2793.         if ((boardp->dvc_var.asc_dvc_var.dvc_cntl &
  2794.              ASC_CNTL_BIOS_GT_1GB) && dp->capacity > 0x200000) {
  2795.                 ip[0] = 255;
  2796.                 ip[1] = 63;
  2797.         } else {
  2798.                 ip[0] = 64;
  2799.                 ip[1] = 32;
  2800.         }
  2801.     } else {
  2802.         if ((boardp->dvc_var.adv_dvc_var.bios_ctrl &
  2803.              BIOS_CTRL_EXTENDED_XLAT) && dp->capacity > 0x200000) {
  2804.                 ip[0] = 255;
  2805.                 ip[1] = 63;
  2806.         } else {
  2807.                 ip[0] = 64;
  2808.                 ip[1] = 32;
  2809.         }
  2810.     }
  2811.     ip[2] = dp->capacity / (ip[0] * ip[1]);
  2812.     ASC_DBG(1, "advansys_biosparam: endn");
  2813.     return 0;
  2814. }
  2815. /*
  2816.  * advansys_setup()