[SCSI] advansys: Remove `done' queue
[linux-2.6] / drivers / scsi / advansys.c
1 #define ASC_VERSION "3.4"       /* AdvanSys Driver Version */
2
3 /*
4  * advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
5  *
6  * Copyright (c) 1995-2000 Advanced System Products, Inc.
7  * Copyright (c) 2000-2001 ConnectCom Solutions, Inc.
8  * Copyright (c) 2007 Matthew Wilcox <matthew@wil.cx>
9  * All Rights Reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  */
16
17 /*
18  * As of March 8, 2000 Advanced System Products, Inc. (AdvanSys)
19  * changed its name to ConnectCom Solutions, Inc.
20  * On June 18, 2001 Initio Corp. acquired ConnectCom's SCSI assets
21  */
22
23 #include <linux/module.h>
24 #include <linux/string.h>
25 #include <linux/kernel.h>
26 #include <linux/types.h>
27 #include <linux/ioport.h>
28 #include <linux/interrupt.h>
29 #include <linux/delay.h>
30 #include <linux/slab.h>
31 #include <linux/mm.h>
32 #include <linux/proc_fs.h>
33 #include <linux/init.h>
34 #include <linux/blkdev.h>
35 #include <linux/isa.h>
36 #include <linux/eisa.h>
37 #include <linux/pci.h>
38 #include <linux/spinlock.h>
39 #include <linux/dma-mapping.h>
40
41 #include <asm/io.h>
42 #include <asm/system.h>
43 #include <asm/dma.h>
44
45 #include <scsi/scsi_cmnd.h>
46 #include <scsi/scsi_device.h>
47 #include <scsi/scsi_tcq.h>
48 #include <scsi/scsi.h>
49 #include <scsi/scsi_host.h>
50
51 /* FIXME:
52  *
53  *  1. Although all of the necessary command mapping places have the
54  *     appropriate dma_map.. APIs, the driver still processes its internal
55  *     queue using bus_to_virt() and virt_to_bus() which are illegal under
56  *     the API.  The entire queue processing structure will need to be
57  *     altered to fix this.
58  *  2. Need to add memory mapping workaround. Test the memory mapping.
59  *     If it doesn't work revert to I/O port access. Can a test be done
60  *     safely?
61  *  3. Handle an interrupt not working. Keep an interrupt counter in
62  *     the interrupt handler. In the timeout function if the interrupt
63  *     has not occurred then print a message and run in polled mode.
64  *  4. Need to add support for target mode commands, cf. CAM XPT.
65  *  5. check DMA mapping functions for failure
66  *  6. Remove internal queueing
67  *  7. Use scsi_transport_spi
68  *  8. advansys_info is not safe against multiple simultaneous callers
69  *  9. Kill boardp->id
70  * 10. Add module_param to override ISA/VLB ioport array
71  */
72 #warning this driver is still not properly converted to the DMA API
73
74 /* Enable driver assertions. */
75 #define ADVANSYS_ASSERT
76
77 /* Enable driver /proc statistics. */
78 #define ADVANSYS_STATS
79
80 /* Enable driver tracing. */
81 /* #define ADVANSYS_DEBUG */
82
83 /*
84  * --- Asc Library Constants and Macros
85  */
86
87 #define ASC_LIB_VERSION_MAJOR  1
88 #define ASC_LIB_VERSION_MINOR  24
89 #define ASC_LIB_SERIAL_NUMBER  123
90
91 /*
92  * Portable Data Types
93  *
94  * Any instance where a 32-bit long or pointer type is assumed
95  * for precision or HW defined structures, the following define
96  * types must be used. In Linux the char, short, and int types
97  * are all consistent at 8, 16, and 32 bits respectively. Pointers
98  * and long types are 64 bits on Alpha and UltraSPARC.
99  */
100 #define ASC_PADDR __u32         /* Physical/Bus address data type. */
101 #define ASC_VADDR __u32         /* Virtual address data type. */
102 #define ASC_DCNT  __u32         /* Unsigned Data count type. */
103 #define ASC_SDCNT __s32         /* Signed Data count type. */
104
105 /*
106  * These macros are used to convert a virtual address to a
107  * 32-bit value. This currently can be used on Linux Alpha
108  * which uses 64-bit virtual address but a 32-bit bus address.
109  * This is likely to break in the future, but doing this now
110  * will give us time to change the HW and FW to handle 64-bit
111  * addresses.
112  */
113 #define ASC_VADDR_TO_U32   virt_to_bus
114 #define ASC_U32_TO_VADDR   bus_to_virt
115
116 typedef unsigned char uchar;
117
118 #ifndef TRUE
119 #define TRUE     (1)
120 #endif
121 #ifndef FALSE
122 #define FALSE    (0)
123 #endif
124
125 #define EOF      (-1)
126 #define ERR      (-1)
127 #define UW_ERR   (uint)(0xFFFF)
128 #define isodd_word(val)   ((((uint)val) & (uint)0x0001) != 0)
129
130 #define  ASC_DVCLIB_CALL_DONE     (1)
131 #define  ASC_DVCLIB_CALL_FAILED   (0)
132 #define  ASC_DVCLIB_CALL_ERROR    (-1)
133
134 #define PCI_VENDOR_ID_ASP               0x10cd
135 #define PCI_DEVICE_ID_ASP_1200A         0x1100
136 #define PCI_DEVICE_ID_ASP_ABP940        0x1200
137 #define PCI_DEVICE_ID_ASP_ABP940U       0x1300
138 #define PCI_DEVICE_ID_ASP_ABP940UW      0x2300
139 #define PCI_DEVICE_ID_38C0800_REV1      0x2500
140 #define PCI_DEVICE_ID_38C1600_REV1      0x2700
141
142 /*
143  * Enable CC_VERY_LONG_SG_LIST to support up to 64K element SG lists.
144  * The SRB structure will have to be changed and the ASC_SRB2SCSIQ()
145  * macro re-defined to be able to obtain a ASC_SCSI_Q pointer from the
146  * SRB structure.
147  */
148 #define CC_VERY_LONG_SG_LIST 0
149 #define ASC_SRB2SCSIQ(srb_ptr)  (srb_ptr)
150
151 #define PortAddr                 unsigned short /* port address size  */
152 #define inp(port)                inb(port)
153 #define outp(port, byte)         outb((byte), (port))
154
155 #define inpw(port)               inw(port)
156 #define outpw(port, word)        outw((word), (port))
157
158 #define ASC_MAX_SG_QUEUE    7
159 #define ASC_MAX_SG_LIST     255
160
161 #define ASC_CS_TYPE  unsigned short
162
163 #define ASC_IS_ISA          (0x0001)
164 #define ASC_IS_ISAPNP       (0x0081)
165 #define ASC_IS_EISA         (0x0002)
166 #define ASC_IS_PCI          (0x0004)
167 #define ASC_IS_PCI_ULTRA    (0x0104)
168 #define ASC_IS_PCMCIA       (0x0008)
169 #define ASC_IS_MCA          (0x0020)
170 #define ASC_IS_VL           (0x0040)
171 #define ASC_ISA_PNP_PORT_ADDR  (0x279)
172 #define ASC_ISA_PNP_PORT_WRITE (ASC_ISA_PNP_PORT_ADDR+0x800)
173 #define ASC_IS_WIDESCSI_16  (0x0100)
174 #define ASC_IS_WIDESCSI_32  (0x0200)
175 #define ASC_IS_BIG_ENDIAN   (0x8000)
176 #define ASC_CHIP_MIN_VER_VL      (0x01)
177 #define ASC_CHIP_MAX_VER_VL      (0x07)
178 #define ASC_CHIP_MIN_VER_PCI     (0x09)
179 #define ASC_CHIP_MAX_VER_PCI     (0x0F)
180 #define ASC_CHIP_VER_PCI_BIT     (0x08)
181 #define ASC_CHIP_MIN_VER_ISA     (0x11)
182 #define ASC_CHIP_MIN_VER_ISA_PNP (0x21)
183 #define ASC_CHIP_MAX_VER_ISA     (0x27)
184 #define ASC_CHIP_VER_ISA_BIT     (0x30)
185 #define ASC_CHIP_VER_ISAPNP_BIT  (0x20)
186 #define ASC_CHIP_VER_ASYN_BUG    (0x21)
187 #define ASC_CHIP_VER_PCI             0x08
188 #define ASC_CHIP_VER_PCI_ULTRA_3150  (ASC_CHIP_VER_PCI | 0x02)
189 #define ASC_CHIP_VER_PCI_ULTRA_3050  (ASC_CHIP_VER_PCI | 0x03)
190 #define ASC_CHIP_MIN_VER_EISA (0x41)
191 #define ASC_CHIP_MAX_VER_EISA (0x47)
192 #define ASC_CHIP_VER_EISA_BIT (0x40)
193 #define ASC_CHIP_LATEST_VER_EISA   ((ASC_CHIP_MIN_VER_EISA - 1) + 3)
194 #define ASC_MAX_LIB_SUPPORTED_ISA_CHIP_VER   0x21
195 #define ASC_MAX_LIB_SUPPORTED_PCI_CHIP_VER   0x0A
196 #define ASC_MAX_VL_DMA_ADDR     (0x07FFFFFFL)
197 #define ASC_MAX_VL_DMA_COUNT    (0x07FFFFFFL)
198 #define ASC_MAX_PCI_DMA_ADDR    (0xFFFFFFFFL)
199 #define ASC_MAX_PCI_DMA_COUNT   (0xFFFFFFFFL)
200 #define ASC_MAX_ISA_DMA_ADDR    (0x00FFFFFFL)
201 #define ASC_MAX_ISA_DMA_COUNT   (0x00FFFFFFL)
202 #define ASC_MAX_EISA_DMA_ADDR   (0x07FFFFFFL)
203 #define ASC_MAX_EISA_DMA_COUNT  (0x07FFFFFFL)
204
205 #define ASC_SCSI_ID_BITS  3
206 #define ASC_SCSI_TIX_TYPE     uchar
207 #define ASC_ALL_DEVICE_BIT_SET  0xFF
208 #define ASC_SCSI_BIT_ID_TYPE  uchar
209 #define ASC_MAX_TID       7
210 #define ASC_MAX_LUN       7
211 #define ASC_SCSI_WIDTH_BIT_SET  0xFF
212 #define ASC_MAX_SENSE_LEN   32
213 #define ASC_MIN_SENSE_LEN   14
214 #define ASC_MAX_CDB_LEN     12
215 #define ASC_SCSI_RESET_HOLD_TIME_US  60
216
217 /*
218  * Inquiry SPC-2 SPI Byte 1 EVPD (Enable Vital Product Data)
219  * and CmdDt (Command Support Data) field bit definitions.
220  */
221 #define ADV_INQ_RTN_VPD_AND_CMDDT           0x3
222 #define ADV_INQ_RTN_CMDDT_FOR_OP_CODE       0x2
223 #define ADV_INQ_RTN_VPD_FOR_PG_CODE         0x1
224 #define ADV_INQ_RTN_STD_INQUIRY_DATA        0x0
225
226 #define ASC_SCSIDIR_NOCHK    0x00
227 #define ASC_SCSIDIR_T2H      0x08
228 #define ASC_SCSIDIR_H2T      0x10
229 #define ASC_SCSIDIR_NODATA   0x18
230 #define SCSI_ASC_NOMEDIA          0x3A
231 #define ASC_SRB_HOST(x)  ((uchar)((uchar)(x) >> 4))
232 #define ASC_SRB_TID(x)   ((uchar)((uchar)(x) & (uchar)0x0F))
233 #define ASC_SRB_LUN(x)   ((uchar)((uint)(x) >> 13))
234 #define PUT_CDB1(x)   ((uchar)((uint)(x) >> 8))
235 #define MS_SDTR_LEN    0x03
236 #define MS_WDTR_LEN    0x02
237
238 #define ASC_SG_LIST_PER_Q   7
239 #define QS_FREE        0x00
240 #define QS_READY       0x01
241 #define QS_DISC1       0x02
242 #define QS_DISC2       0x04
243 #define QS_BUSY        0x08
244 #define QS_ABORTED     0x40
245 #define QS_DONE        0x80
246 #define QC_NO_CALLBACK   0x01
247 #define QC_SG_SWAP_QUEUE 0x02
248 #define QC_SG_HEAD       0x04
249 #define QC_DATA_IN       0x08
250 #define QC_DATA_OUT      0x10
251 #define QC_URGENT        0x20
252 #define QC_MSG_OUT       0x40
253 #define QC_REQ_SENSE     0x80
254 #define QCSG_SG_XFER_LIST  0x02
255 #define QCSG_SG_XFER_MORE  0x04
256 #define QCSG_SG_XFER_END   0x08
257 #define QD_IN_PROGRESS       0x00
258 #define QD_NO_ERROR          0x01
259 #define QD_ABORTED_BY_HOST   0x02
260 #define QD_WITH_ERROR        0x04
261 #define QD_INVALID_REQUEST   0x80
262 #define QD_INVALID_HOST_NUM  0x81
263 #define QD_INVALID_DEVICE    0x82
264 #define QD_ERR_INTERNAL      0xFF
265 #define QHSTA_NO_ERROR               0x00
266 #define QHSTA_M_SEL_TIMEOUT          0x11
267 #define QHSTA_M_DATA_OVER_RUN        0x12
268 #define QHSTA_M_DATA_UNDER_RUN       0x12
269 #define QHSTA_M_UNEXPECTED_BUS_FREE  0x13
270 #define QHSTA_M_BAD_BUS_PHASE_SEQ    0x14
271 #define QHSTA_D_QDONE_SG_LIST_CORRUPTED 0x21
272 #define QHSTA_D_ASC_DVC_ERROR_CODE_SET  0x22
273 #define QHSTA_D_HOST_ABORT_FAILED       0x23
274 #define QHSTA_D_EXE_SCSI_Q_FAILED       0x24
275 #define QHSTA_D_EXE_SCSI_Q_BUSY_TIMEOUT 0x25
276 #define QHSTA_D_ASPI_NO_BUF_POOL        0x26
277 #define QHSTA_M_WTM_TIMEOUT         0x41
278 #define QHSTA_M_BAD_CMPL_STATUS_IN  0x42
279 #define QHSTA_M_NO_AUTO_REQ_SENSE   0x43
280 #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
281 #define QHSTA_M_TARGET_STATUS_BUSY  0x45
282 #define QHSTA_M_BAD_TAG_CODE        0x46
283 #define QHSTA_M_BAD_QUEUE_FULL_OR_BUSY  0x47
284 #define QHSTA_M_HUNG_REQ_SCSI_BUS_RESET 0x48
285 #define QHSTA_D_LRAM_CMP_ERROR        0x81
286 #define QHSTA_M_MICRO_CODE_ERROR_HALT 0xA1
287 #define ASC_FLAG_SCSIQ_REQ        0x01
288 #define ASC_FLAG_BIOS_SCSIQ_REQ   0x02
289 #define ASC_FLAG_BIOS_ASYNC_IO    0x04
290 #define ASC_FLAG_SRB_LINEAR_ADDR  0x08
291 #define ASC_FLAG_WIN16            0x10
292 #define ASC_FLAG_WIN32            0x20
293 #define ASC_FLAG_ISA_OVER_16MB    0x40
294 #define ASC_FLAG_DOS_VM_CALLBACK  0x80
295 #define ASC_TAG_FLAG_EXTRA_BYTES               0x10
296 #define ASC_TAG_FLAG_DISABLE_DISCONNECT        0x04
297 #define ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX  0x08
298 #define ASC_TAG_FLAG_DISABLE_CHK_COND_INT_HOST 0x40
299 #define ASC_SCSIQ_CPY_BEG              4
300 #define ASC_SCSIQ_SGHD_CPY_BEG         2
301 #define ASC_SCSIQ_B_FWD                0
302 #define ASC_SCSIQ_B_BWD                1
303 #define ASC_SCSIQ_B_STATUS             2
304 #define ASC_SCSIQ_B_QNO                3
305 #define ASC_SCSIQ_B_CNTL               4
306 #define ASC_SCSIQ_B_SG_QUEUE_CNT       5
307 #define ASC_SCSIQ_D_DATA_ADDR          8
308 #define ASC_SCSIQ_D_DATA_CNT          12
309 #define ASC_SCSIQ_B_SENSE_LEN         20
310 #define ASC_SCSIQ_DONE_INFO_BEG       22
311 #define ASC_SCSIQ_D_SRBPTR            22
312 #define ASC_SCSIQ_B_TARGET_IX         26
313 #define ASC_SCSIQ_B_CDB_LEN           28
314 #define ASC_SCSIQ_B_TAG_CODE          29
315 #define ASC_SCSIQ_W_VM_ID             30
316 #define ASC_SCSIQ_DONE_STATUS         32
317 #define ASC_SCSIQ_HOST_STATUS         33
318 #define ASC_SCSIQ_SCSI_STATUS         34
319 #define ASC_SCSIQ_CDB_BEG             36
320 #define ASC_SCSIQ_DW_REMAIN_XFER_ADDR 56
321 #define ASC_SCSIQ_DW_REMAIN_XFER_CNT  60
322 #define ASC_SCSIQ_B_FIRST_SG_WK_QP    48
323 #define ASC_SCSIQ_B_SG_WK_QP          49
324 #define ASC_SCSIQ_B_SG_WK_IX          50
325 #define ASC_SCSIQ_W_ALT_DC1           52
326 #define ASC_SCSIQ_B_LIST_CNT          6
327 #define ASC_SCSIQ_B_CUR_LIST_CNT      7
328 #define ASC_SGQ_B_SG_CNTL             4
329 #define ASC_SGQ_B_SG_HEAD_QP          5
330 #define ASC_SGQ_B_SG_LIST_CNT         6
331 #define ASC_SGQ_B_SG_CUR_LIST_CNT     7
332 #define ASC_SGQ_LIST_BEG              8
333 #define ASC_DEF_SCSI1_QNG    4
334 #define ASC_MAX_SCSI1_QNG    4
335 #define ASC_DEF_SCSI2_QNG    16
336 #define ASC_MAX_SCSI2_QNG    32
337 #define ASC_TAG_CODE_MASK    0x23
338 #define ASC_STOP_REQ_RISC_STOP      0x01
339 #define ASC_STOP_ACK_RISC_STOP      0x03
340 #define ASC_STOP_CLEAN_UP_BUSY_Q    0x10
341 #define ASC_STOP_CLEAN_UP_DISC_Q    0x20
342 #define ASC_STOP_HOST_REQ_RISC_HALT 0x40
343 #define ASC_TIDLUN_TO_IX(tid, lun)  (ASC_SCSI_TIX_TYPE)((tid) + ((lun)<<ASC_SCSI_ID_BITS))
344 #define ASC_TID_TO_TARGET_ID(tid)   (ASC_SCSI_BIT_ID_TYPE)(0x01 << (tid))
345 #define ASC_TIX_TO_TARGET_ID(tix)   (0x01 << ((tix) & ASC_MAX_TID))
346 #define ASC_TIX_TO_TID(tix)         ((tix) & ASC_MAX_TID)
347 #define ASC_TID_TO_TIX(tid)         ((tid) & ASC_MAX_TID)
348 #define ASC_TIX_TO_LUN(tix)         (((tix) >> ASC_SCSI_ID_BITS) & ASC_MAX_LUN)
349 #define ASC_QNO_TO_QADDR(q_no)      ((ASC_QADR_BEG)+((int)(q_no) << 6))
350
351 typedef struct asc_scsiq_1 {
352         uchar status;
353         uchar q_no;
354         uchar cntl;
355         uchar sg_queue_cnt;
356         uchar target_id;
357         uchar target_lun;
358         ASC_PADDR data_addr;
359         ASC_DCNT data_cnt;
360         ASC_PADDR sense_addr;
361         uchar sense_len;
362         uchar extra_bytes;
363 } ASC_SCSIQ_1;
364
365 typedef struct asc_scsiq_2 {
366         ASC_VADDR srb_ptr;
367         uchar target_ix;
368         uchar flag;
369         uchar cdb_len;
370         uchar tag_code;
371         ushort vm_id;
372 } ASC_SCSIQ_2;
373
374 typedef struct asc_scsiq_3 {
375         uchar done_stat;
376         uchar host_stat;
377         uchar scsi_stat;
378         uchar scsi_msg;
379 } ASC_SCSIQ_3;
380
381 typedef struct asc_scsiq_4 {
382         uchar cdb[ASC_MAX_CDB_LEN];
383         uchar y_first_sg_list_qp;
384         uchar y_working_sg_qp;
385         uchar y_working_sg_ix;
386         uchar y_res;
387         ushort x_req_count;
388         ushort x_reconnect_rtn;
389         ASC_PADDR x_saved_data_addr;
390         ASC_DCNT x_saved_data_cnt;
391 } ASC_SCSIQ_4;
392
393 typedef struct asc_q_done_info {
394         ASC_SCSIQ_2 d2;
395         ASC_SCSIQ_3 d3;
396         uchar q_status;
397         uchar q_no;
398         uchar cntl;
399         uchar sense_len;
400         uchar extra_bytes;
401         uchar res;
402         ASC_DCNT remain_bytes;
403 } ASC_QDONE_INFO;
404
405 typedef struct asc_sg_list {
406         ASC_PADDR addr;
407         ASC_DCNT bytes;
408 } ASC_SG_LIST;
409
410 typedef struct asc_sg_head {
411         ushort entry_cnt;
412         ushort queue_cnt;
413         ushort entry_to_copy;
414         ushort res;
415         ASC_SG_LIST sg_list[ASC_MAX_SG_LIST];
416 } ASC_SG_HEAD;
417
418 #define ASC_MIN_SG_LIST   2
419
420 typedef struct asc_min_sg_head {
421         ushort entry_cnt;
422         ushort queue_cnt;
423         ushort entry_to_copy;
424         ushort res;
425         ASC_SG_LIST sg_list[ASC_MIN_SG_LIST];
426 } ASC_MIN_SG_HEAD;
427
428 #define QCX_SORT        (0x0001)
429 #define QCX_COALEASE    (0x0002)
430
431 typedef struct asc_scsi_q {
432         ASC_SCSIQ_1 q1;
433         ASC_SCSIQ_2 q2;
434         uchar *cdbptr;
435         ASC_SG_HEAD *sg_head;
436         ushort remain_sg_entry_cnt;
437         ushort next_sg_index;
438 } ASC_SCSI_Q;
439
440 typedef struct asc_scsi_req_q {
441         ASC_SCSIQ_1 r1;
442         ASC_SCSIQ_2 r2;
443         uchar *cdbptr;
444         ASC_SG_HEAD *sg_head;
445         uchar *sense_ptr;
446         ASC_SCSIQ_3 r3;
447         uchar cdb[ASC_MAX_CDB_LEN];
448         uchar sense[ASC_MIN_SENSE_LEN];
449 } ASC_SCSI_REQ_Q;
450
451 typedef struct asc_scsi_bios_req_q {
452         ASC_SCSIQ_1 r1;
453         ASC_SCSIQ_2 r2;
454         uchar *cdbptr;
455         ASC_SG_HEAD *sg_head;
456         uchar *sense_ptr;
457         ASC_SCSIQ_3 r3;
458         uchar cdb[ASC_MAX_CDB_LEN];
459         uchar sense[ASC_MIN_SENSE_LEN];
460 } ASC_SCSI_BIOS_REQ_Q;
461
462 typedef struct asc_risc_q {
463         uchar fwd;
464         uchar bwd;
465         ASC_SCSIQ_1 i1;
466         ASC_SCSIQ_2 i2;
467         ASC_SCSIQ_3 i3;
468         ASC_SCSIQ_4 i4;
469 } ASC_RISC_Q;
470
471 typedef struct asc_sg_list_q {
472         uchar seq_no;
473         uchar q_no;
474         uchar cntl;
475         uchar sg_head_qp;
476         uchar sg_list_cnt;
477         uchar sg_cur_list_cnt;
478 } ASC_SG_LIST_Q;
479
480 typedef struct asc_risc_sg_list_q {
481         uchar fwd;
482         uchar bwd;
483         ASC_SG_LIST_Q sg;
484         ASC_SG_LIST sg_list[7];
485 } ASC_RISC_SG_LIST_Q;
486
487 #define ASC_EXE_SCSI_IO_MAX_IDLE_LOOP  0x1000000UL
488 #define ASC_EXE_SCSI_IO_MAX_WAIT_LOOP  1024
489 #define ASCQ_ERR_NO_ERROR             0
490 #define ASCQ_ERR_IO_NOT_FOUND         1
491 #define ASCQ_ERR_LOCAL_MEM            2
492 #define ASCQ_ERR_CHKSUM               3
493 #define ASCQ_ERR_START_CHIP           4
494 #define ASCQ_ERR_INT_TARGET_ID        5
495 #define ASCQ_ERR_INT_LOCAL_MEM        6
496 #define ASCQ_ERR_HALT_RISC            7
497 #define ASCQ_ERR_GET_ASPI_ENTRY       8
498 #define ASCQ_ERR_CLOSE_ASPI           9
499 #define ASCQ_ERR_HOST_INQUIRY         0x0A
500 #define ASCQ_ERR_SAVED_SRB_BAD        0x0B
501 #define ASCQ_ERR_QCNTL_SG_LIST        0x0C
502 #define ASCQ_ERR_Q_STATUS             0x0D
503 #define ASCQ_ERR_WR_SCSIQ             0x0E
504 #define ASCQ_ERR_PC_ADDR              0x0F
505 #define ASCQ_ERR_SYN_OFFSET           0x10
506 #define ASCQ_ERR_SYN_XFER_TIME        0x11
507 #define ASCQ_ERR_LOCK_DMA             0x12
508 #define ASCQ_ERR_UNLOCK_DMA           0x13
509 #define ASCQ_ERR_VDS_CHK_INSTALL      0x14
510 #define ASCQ_ERR_MICRO_CODE_HALT      0x15
511 #define ASCQ_ERR_SET_LRAM_ADDR        0x16
512 #define ASCQ_ERR_CUR_QNG              0x17
513 #define ASCQ_ERR_SG_Q_LINKS           0x18
514 #define ASCQ_ERR_SCSIQ_PTR            0x19
515 #define ASCQ_ERR_ISR_RE_ENTRY         0x1A
516 #define ASCQ_ERR_CRITICAL_RE_ENTRY    0x1B
517 #define ASCQ_ERR_ISR_ON_CRITICAL      0x1C
518 #define ASCQ_ERR_SG_LIST_ODD_ADDRESS  0x1D
519 #define ASCQ_ERR_XFER_ADDRESS_TOO_BIG 0x1E
520 #define ASCQ_ERR_SCSIQ_NULL_PTR       0x1F
521 #define ASCQ_ERR_SCSIQ_BAD_NEXT_PTR   0x20
522 #define ASCQ_ERR_GET_NUM_OF_FREE_Q    0x21
523 #define ASCQ_ERR_SEND_SCSI_Q          0x22
524 #define ASCQ_ERR_HOST_REQ_RISC_HALT   0x23
525 #define ASCQ_ERR_RESET_SDTR           0x24
526
527 /*
528  * Warning code values are set in ASC_DVC_VAR  'warn_code'.
529  */
530 #define ASC_WARN_NO_ERROR             0x0000
531 #define ASC_WARN_IO_PORT_ROTATE       0x0001
532 #define ASC_WARN_EEPROM_CHKSUM        0x0002
533 #define ASC_WARN_IRQ_MODIFIED         0x0004
534 #define ASC_WARN_AUTO_CONFIG          0x0008
535 #define ASC_WARN_CMD_QNG_CONFLICT     0x0010
536 #define ASC_WARN_EEPROM_RECOVER       0x0020
537 #define ASC_WARN_CFG_MSW_RECOVER      0x0040
538 #define ASC_WARN_SET_PCI_CONFIG_SPACE 0x0080
539
540 /*
541  * Error code values are set in ASC_DVC_VAR  'err_code'.
542  */
543 #define ASC_IERR_WRITE_EEPROM         0x0001
544 #define ASC_IERR_MCODE_CHKSUM         0x0002
545 #define ASC_IERR_SET_PC_ADDR          0x0004
546 #define ASC_IERR_START_STOP_CHIP      0x0008
547 #define ASC_IERR_IRQ_NO               0x0010
548 #define ASC_IERR_SET_IRQ_NO           0x0020
549 #define ASC_IERR_CHIP_VERSION         0x0040
550 #define ASC_IERR_SET_SCSI_ID          0x0080
551 #define ASC_IERR_GET_PHY_ADDR         0x0100
552 #define ASC_IERR_BAD_SIGNATURE        0x0200
553 #define ASC_IERR_NO_BUS_TYPE          0x0400
554 #define ASC_IERR_SCAM                 0x0800
555 #define ASC_IERR_SET_SDTR             0x1000
556 #define ASC_IERR_RW_LRAM              0x8000
557
558 #define ASC_DEF_IRQ_NO  10
559 #define ASC_MAX_IRQ_NO  15
560 #define ASC_MIN_IRQ_NO  10
561 #define ASC_MIN_REMAIN_Q        (0x02)
562 #define ASC_DEF_MAX_TOTAL_QNG   (0xF0)
563 #define ASC_MIN_TAG_Q_PER_DVC   (0x04)
564 #define ASC_DEF_TAG_Q_PER_DVC   (0x04)
565 #define ASC_MIN_FREE_Q        ASC_MIN_REMAIN_Q
566 #define ASC_MIN_TOTAL_QNG     ((ASC_MAX_SG_QUEUE)+(ASC_MIN_FREE_Q))
567 #define ASC_MAX_TOTAL_QNG 240
568 #define ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG 16
569 #define ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG   8
570 #define ASC_MAX_PCI_INRAM_TOTAL_QNG  20
571 #define ASC_MAX_INRAM_TAG_QNG   16
572 #define ASC_IOADR_TABLE_MAX_IX  11
573 #define ASC_IOADR_GAP   0x10
574 #define ASC_LIB_SCSIQ_WK_SP        256
575 #define ASC_MAX_SYN_XFER_NO        16
576 #define ASC_SYN_MAX_OFFSET         0x0F
577 #define ASC_DEF_SDTR_OFFSET        0x0F
578 #define ASC_DEF_SDTR_INDEX         0x00
579 #define ASC_SDTR_ULTRA_PCI_10MB_INDEX  0x02
580 #define SYN_XFER_NS_0  25
581 #define SYN_XFER_NS_1  30
582 #define SYN_XFER_NS_2  35
583 #define SYN_XFER_NS_3  40
584 #define SYN_XFER_NS_4  50
585 #define SYN_XFER_NS_5  60
586 #define SYN_XFER_NS_6  70
587 #define SYN_XFER_NS_7  85
588 #define SYN_ULTRA_XFER_NS_0    12
589 #define SYN_ULTRA_XFER_NS_1    19
590 #define SYN_ULTRA_XFER_NS_2    25
591 #define SYN_ULTRA_XFER_NS_3    32
592 #define SYN_ULTRA_XFER_NS_4    38
593 #define SYN_ULTRA_XFER_NS_5    44
594 #define SYN_ULTRA_XFER_NS_6    50
595 #define SYN_ULTRA_XFER_NS_7    57
596 #define SYN_ULTRA_XFER_NS_8    63
597 #define SYN_ULTRA_XFER_NS_9    69
598 #define SYN_ULTRA_XFER_NS_10   75
599 #define SYN_ULTRA_XFER_NS_11   82
600 #define SYN_ULTRA_XFER_NS_12   88
601 #define SYN_ULTRA_XFER_NS_13   94
602 #define SYN_ULTRA_XFER_NS_14  100
603 #define SYN_ULTRA_XFER_NS_15  107
604
605 typedef struct ext_msg {
606         uchar msg_type;
607         uchar msg_len;
608         uchar msg_req;
609         union {
610                 struct {
611                         uchar sdtr_xfer_period;
612                         uchar sdtr_req_ack_offset;
613                 } sdtr;
614                 struct {
615                         uchar wdtr_width;
616                 } wdtr;
617                 struct {
618                         uchar mdp_b3;
619                         uchar mdp_b2;
620                         uchar mdp_b1;
621                         uchar mdp_b0;
622                 } mdp;
623         } u_ext_msg;
624         uchar res;
625 } EXT_MSG;
626
627 #define xfer_period     u_ext_msg.sdtr.sdtr_xfer_period
628 #define req_ack_offset  u_ext_msg.sdtr.sdtr_req_ack_offset
629 #define wdtr_width      u_ext_msg.wdtr.wdtr_width
630 #define mdp_b3          u_ext_msg.mdp_b3
631 #define mdp_b2          u_ext_msg.mdp_b2
632 #define mdp_b1          u_ext_msg.mdp_b1
633 #define mdp_b0          u_ext_msg.mdp_b0
634
635 typedef struct asc_dvc_cfg {
636         ASC_SCSI_BIT_ID_TYPE can_tagged_qng;
637         ASC_SCSI_BIT_ID_TYPE cmd_qng_enabled;
638         ASC_SCSI_BIT_ID_TYPE disc_enable;
639         ASC_SCSI_BIT_ID_TYPE sdtr_enable;
640         uchar chip_scsi_id;
641         uchar isa_dma_speed;
642         uchar isa_dma_channel;
643         uchar chip_version;
644         ushort lib_serial_no;
645         ushort lib_version;
646         ushort mcode_date;
647         ushort mcode_version;
648         uchar max_tag_qng[ASC_MAX_TID + 1];
649         uchar *overrun_buf;
650         uchar sdtr_period_offset[ASC_MAX_TID + 1];
651         uchar adapter_info[6];
652 } ASC_DVC_CFG;
653
654 #define ASC_DEF_DVC_CNTL       0xFFFF
655 #define ASC_DEF_CHIP_SCSI_ID   7
656 #define ASC_DEF_ISA_DMA_SPEED  4
657 #define ASC_INIT_STATE_NULL          0x0000
658 #define ASC_INIT_STATE_BEG_GET_CFG   0x0001
659 #define ASC_INIT_STATE_END_GET_CFG   0x0002
660 #define ASC_INIT_STATE_BEG_SET_CFG   0x0004
661 #define ASC_INIT_STATE_END_SET_CFG   0x0008
662 #define ASC_INIT_STATE_BEG_LOAD_MC   0x0010
663 #define ASC_INIT_STATE_END_LOAD_MC   0x0020
664 #define ASC_INIT_STATE_BEG_INQUIRY   0x0040
665 #define ASC_INIT_STATE_END_INQUIRY   0x0080
666 #define ASC_INIT_RESET_SCSI_DONE     0x0100
667 #define ASC_INIT_STATE_WITHOUT_EEP   0x8000
668 #define ASC_BUG_FIX_IF_NOT_DWB       0x0001
669 #define ASC_BUG_FIX_ASYN_USE_SYN     0x0002
670 #define ASYN_SDTR_DATA_FIX_PCI_REV_AB 0x41
671 #define ASC_MIN_TAGGED_CMD  7
672 #define ASC_MAX_SCSI_RESET_WAIT      30
673
674 struct asc_dvc_var;             /* Forward Declaration. */
675
676 typedef struct asc_dvc_var {
677         PortAddr iop_base;
678         ushort err_code;
679         ushort dvc_cntl;
680         ushort bug_fix_cntl;
681         ushort bus_type;
682         ASC_SCSI_BIT_ID_TYPE init_sdtr;
683         ASC_SCSI_BIT_ID_TYPE sdtr_done;
684         ASC_SCSI_BIT_ID_TYPE use_tagged_qng;
685         ASC_SCSI_BIT_ID_TYPE unit_not_ready;
686         ASC_SCSI_BIT_ID_TYPE queue_full_or_busy;
687         ASC_SCSI_BIT_ID_TYPE start_motor;
688         uchar scsi_reset_wait;
689         uchar chip_no;
690         char is_in_int;
691         uchar max_total_qng;
692         uchar cur_total_qng;
693         uchar in_critical_cnt;
694         uchar irq_no;
695         uchar last_q_shortage;
696         ushort init_state;
697         uchar cur_dvc_qng[ASC_MAX_TID + 1];
698         uchar max_dvc_qng[ASC_MAX_TID + 1];
699         ASC_SCSI_Q *scsiq_busy_head[ASC_MAX_TID + 1];
700         ASC_SCSI_Q *scsiq_busy_tail[ASC_MAX_TID + 1];
701         uchar sdtr_period_tbl[ASC_MAX_SYN_XFER_NO];
702         ASC_DVC_CFG *cfg;
703         ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer_always;
704         char redo_scam;
705         ushort res2;
706         uchar dos_int13_table[ASC_MAX_TID + 1];
707         ASC_DCNT max_dma_count;
708         ASC_SCSI_BIT_ID_TYPE no_scam;
709         ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer;
710         uchar max_sdtr_index;
711         uchar host_init_sdtr_index;
712         struct asc_board *drv_ptr;
713         ASC_DCNT uc_break;
714 } ASC_DVC_VAR;
715
716 typedef struct asc_dvc_inq_info {
717         uchar type[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
718 } ASC_DVC_INQ_INFO;
719
720 typedef struct asc_cap_info {
721         ASC_DCNT lba;
722         ASC_DCNT blk_size;
723 } ASC_CAP_INFO;
724
725 typedef struct asc_cap_info_array {
726         ASC_CAP_INFO cap_info[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
727 } ASC_CAP_INFO_ARRAY;
728
729 #define ASC_MCNTL_NO_SEL_TIMEOUT  (ushort)0x0001
730 #define ASC_MCNTL_NULL_TARGET     (ushort)0x0002
731 #define ASC_CNTL_INITIATOR         (ushort)0x0001
732 #define ASC_CNTL_BIOS_GT_1GB       (ushort)0x0002
733 #define ASC_CNTL_BIOS_GT_2_DISK    (ushort)0x0004
734 #define ASC_CNTL_BIOS_REMOVABLE    (ushort)0x0008
735 #define ASC_CNTL_NO_SCAM           (ushort)0x0010
736 #define ASC_CNTL_INT_MULTI_Q       (ushort)0x0080
737 #define ASC_CNTL_NO_LUN_SUPPORT    (ushort)0x0040
738 #define ASC_CNTL_NO_VERIFY_COPY    (ushort)0x0100
739 #define ASC_CNTL_RESET_SCSI        (ushort)0x0200
740 #define ASC_CNTL_INIT_INQUIRY      (ushort)0x0400
741 #define ASC_CNTL_INIT_VERBOSE      (ushort)0x0800
742 #define ASC_CNTL_SCSI_PARITY       (ushort)0x1000
743 #define ASC_CNTL_BURST_MODE        (ushort)0x2000
744 #define ASC_CNTL_SDTR_ENABLE_ULTRA (ushort)0x4000
745 #define ASC_EEP_DVC_CFG_BEG_VL    2
746 #define ASC_EEP_MAX_DVC_ADDR_VL   15
747 #define ASC_EEP_DVC_CFG_BEG      32
748 #define ASC_EEP_MAX_DVC_ADDR     45
749 #define ASC_EEP_DEFINED_WORDS    10
750 #define ASC_EEP_MAX_ADDR         63
751 #define ASC_EEP_RES_WORDS         0
752 #define ASC_EEP_MAX_RETRY        20
753 #define ASC_MAX_INIT_BUSY_RETRY   8
754 #define ASC_EEP_ISA_PNP_WSIZE    16
755
756 /*
757  * These macros keep the chip SCSI id and ISA DMA speed
758  * bitfields in board order. C bitfields aren't portable
759  * between big and little-endian platforms so they are
760  * not used.
761  */
762
763 #define ASC_EEP_GET_CHIP_ID(cfg)    ((cfg)->id_speed & 0x0f)
764 #define ASC_EEP_GET_DMA_SPD(cfg)    (((cfg)->id_speed & 0xf0) >> 4)
765 #define ASC_EEP_SET_CHIP_ID(cfg, sid) \
766    ((cfg)->id_speed = ((cfg)->id_speed & 0xf0) | ((sid) & ASC_MAX_TID))
767 #define ASC_EEP_SET_DMA_SPD(cfg, spd) \
768    ((cfg)->id_speed = ((cfg)->id_speed & 0x0f) | ((spd) & 0x0f) << 4)
769
770 typedef struct asceep_config {
771         ushort cfg_lsw;
772         ushort cfg_msw;
773         uchar init_sdtr;
774         uchar disc_enable;
775         uchar use_cmd_qng;
776         uchar start_motor;
777         uchar max_total_qng;
778         uchar max_tag_qng;
779         uchar bios_scan;
780         uchar power_up_wait;
781         uchar no_scam;
782         uchar id_speed;         /* low order 4 bits is chip scsi id */
783         /* high order 4 bits is isa dma speed */
784         uchar dos_int13_table[ASC_MAX_TID + 1];
785         uchar adapter_info[6];
786         ushort cntl;
787         ushort chksum;
788 } ASCEEP_CONFIG;
789
790 #define ASC_PCI_CFG_LSW_SCSI_PARITY  0x0800
791 #define ASC_PCI_CFG_LSW_BURST_MODE   0x0080
792 #define ASC_PCI_CFG_LSW_INTR_ABLE    0x0020
793
794 #define ASC_EEP_CMD_READ          0x80
795 #define ASC_EEP_CMD_WRITE         0x40
796 #define ASC_EEP_CMD_WRITE_ABLE    0x30
797 #define ASC_EEP_CMD_WRITE_DISABLE 0x00
798 #define ASC_OVERRUN_BSIZE  0x00000048UL
799 #define ASC_CTRL_BREAK_ONCE        0x0001
800 #define ASC_CTRL_BREAK_STAY_IDLE   0x0002
801 #define ASCV_MSGOUT_BEG         0x0000
802 #define ASCV_MSGOUT_SDTR_PERIOD (ASCV_MSGOUT_BEG+3)
803 #define ASCV_MSGOUT_SDTR_OFFSET (ASCV_MSGOUT_BEG+4)
804 #define ASCV_BREAK_SAVED_CODE   (ushort)0x0006
805 #define ASCV_MSGIN_BEG          (ASCV_MSGOUT_BEG+8)
806 #define ASCV_MSGIN_SDTR_PERIOD  (ASCV_MSGIN_BEG+3)
807 #define ASCV_MSGIN_SDTR_OFFSET  (ASCV_MSGIN_BEG+4)
808 #define ASCV_SDTR_DATA_BEG      (ASCV_MSGIN_BEG+8)
809 #define ASCV_SDTR_DONE_BEG      (ASCV_SDTR_DATA_BEG+8)
810 #define ASCV_MAX_DVC_QNG_BEG    (ushort)0x0020
811 #define ASCV_BREAK_ADDR           (ushort)0x0028
812 #define ASCV_BREAK_NOTIFY_COUNT   (ushort)0x002A
813 #define ASCV_BREAK_CONTROL        (ushort)0x002C
814 #define ASCV_BREAK_HIT_COUNT      (ushort)0x002E
815
816 #define ASCV_ASCDVC_ERR_CODE_W  (ushort)0x0030
817 #define ASCV_MCODE_CHKSUM_W   (ushort)0x0032
818 #define ASCV_MCODE_SIZE_W     (ushort)0x0034
819 #define ASCV_STOP_CODE_B      (ushort)0x0036
820 #define ASCV_DVC_ERR_CODE_B   (ushort)0x0037
821 #define ASCV_OVERRUN_PADDR_D  (ushort)0x0038
822 #define ASCV_OVERRUN_BSIZE_D  (ushort)0x003C
823 #define ASCV_HALTCODE_W       (ushort)0x0040
824 #define ASCV_CHKSUM_W         (ushort)0x0042
825 #define ASCV_MC_DATE_W        (ushort)0x0044
826 #define ASCV_MC_VER_W         (ushort)0x0046
827 #define ASCV_NEXTRDY_B        (ushort)0x0048
828 #define ASCV_DONENEXT_B       (ushort)0x0049
829 #define ASCV_USE_TAGGED_QNG_B (ushort)0x004A
830 #define ASCV_SCSIBUSY_B       (ushort)0x004B
831 #define ASCV_Q_DONE_IN_PROGRESS_B  (ushort)0x004C
832 #define ASCV_CURCDB_B         (ushort)0x004D
833 #define ASCV_RCLUN_B          (ushort)0x004E
834 #define ASCV_BUSY_QHEAD_B     (ushort)0x004F
835 #define ASCV_DISC1_QHEAD_B    (ushort)0x0050
836 #define ASCV_DISC_ENABLE_B    (ushort)0x0052
837 #define ASCV_CAN_TAGGED_QNG_B (ushort)0x0053
838 #define ASCV_HOSTSCSI_ID_B    (ushort)0x0055
839 #define ASCV_MCODE_CNTL_B     (ushort)0x0056
840 #define ASCV_NULL_TARGET_B    (ushort)0x0057
841 #define ASCV_FREE_Q_HEAD_W    (ushort)0x0058
842 #define ASCV_DONE_Q_TAIL_W    (ushort)0x005A
843 #define ASCV_FREE_Q_HEAD_B    (ushort)(ASCV_FREE_Q_HEAD_W+1)
844 #define ASCV_DONE_Q_TAIL_B    (ushort)(ASCV_DONE_Q_TAIL_W+1)
845 #define ASCV_HOST_FLAG_B      (ushort)0x005D
846 #define ASCV_TOTAL_READY_Q_B  (ushort)0x0064
847 #define ASCV_VER_SERIAL_B     (ushort)0x0065
848 #define ASCV_HALTCODE_SAVED_W (ushort)0x0066
849 #define ASCV_WTM_FLAG_B       (ushort)0x0068
850 #define ASCV_RISC_FLAG_B      (ushort)0x006A
851 #define ASCV_REQ_SG_LIST_QP   (ushort)0x006B
852 #define ASC_HOST_FLAG_IN_ISR        0x01
853 #define ASC_HOST_FLAG_ACK_INT       0x02
854 #define ASC_RISC_FLAG_GEN_INT      0x01
855 #define ASC_RISC_FLAG_REQ_SG_LIST  0x02
856 #define IOP_CTRL         (0x0F)
857 #define IOP_STATUS       (0x0E)
858 #define IOP_INT_ACK      IOP_STATUS
859 #define IOP_REG_IFC      (0x0D)
860 #define IOP_SYN_OFFSET    (0x0B)
861 #define IOP_EXTRA_CONTROL (0x0D)
862 #define IOP_REG_PC        (0x0C)
863 #define IOP_RAM_ADDR      (0x0A)
864 #define IOP_RAM_DATA      (0x08)
865 #define IOP_EEP_DATA      (0x06)
866 #define IOP_EEP_CMD       (0x07)
867 #define IOP_VERSION       (0x03)
868 #define IOP_CONFIG_HIGH   (0x04)
869 #define IOP_CONFIG_LOW    (0x02)
870 #define IOP_SIG_BYTE      (0x01)
871 #define IOP_SIG_WORD      (0x00)
872 #define IOP_REG_DC1      (0x0E)
873 #define IOP_REG_DC0      (0x0C)
874 #define IOP_REG_SB       (0x0B)
875 #define IOP_REG_DA1      (0x0A)
876 #define IOP_REG_DA0      (0x08)
877 #define IOP_REG_SC       (0x09)
878 #define IOP_DMA_SPEED    (0x07)
879 #define IOP_REG_FLAG     (0x07)
880 #define IOP_FIFO_H       (0x06)
881 #define IOP_FIFO_L       (0x04)
882 #define IOP_REG_ID       (0x05)
883 #define IOP_REG_QP       (0x03)
884 #define IOP_REG_IH       (0x02)
885 #define IOP_REG_IX       (0x01)
886 #define IOP_REG_AX       (0x00)
887 #define IFC_REG_LOCK      (0x00)
888 #define IFC_REG_UNLOCK    (0x09)
889 #define IFC_WR_EN_FILTER  (0x10)
890 #define IFC_RD_NO_EEPROM  (0x10)
891 #define IFC_SLEW_RATE     (0x20)
892 #define IFC_ACT_NEG       (0x40)
893 #define IFC_INP_FILTER    (0x80)
894 #define IFC_INIT_DEFAULT  (IFC_ACT_NEG | IFC_REG_UNLOCK)
895 #define SC_SEL   (uchar)(0x80)
896 #define SC_BSY   (uchar)(0x40)
897 #define SC_ACK   (uchar)(0x20)
898 #define SC_REQ   (uchar)(0x10)
899 #define SC_ATN   (uchar)(0x08)
900 #define SC_IO    (uchar)(0x04)
901 #define SC_CD    (uchar)(0x02)
902 #define SC_MSG   (uchar)(0x01)
903 #define SEC_SCSI_CTL         (uchar)(0x80)
904 #define SEC_ACTIVE_NEGATE    (uchar)(0x40)
905 #define SEC_SLEW_RATE        (uchar)(0x20)
906 #define SEC_ENABLE_FILTER    (uchar)(0x10)
907 #define ASC_HALT_EXTMSG_IN     (ushort)0x8000
908 #define ASC_HALT_CHK_CONDITION (ushort)0x8100
909 #define ASC_HALT_SS_QUEUE_FULL (ushort)0x8200
910 #define ASC_HALT_DISABLE_ASYN_USE_SYN_FIX  (ushort)0x8300
911 #define ASC_HALT_ENABLE_ASYN_USE_SYN_FIX   (ushort)0x8400
912 #define ASC_HALT_SDTR_REJECTED (ushort)0x4000
913 #define ASC_HALT_HOST_COPY_SG_LIST_TO_RISC ( ushort )0x2000
914 #define ASC_MAX_QNO        0xF8
915 #define ASC_DATA_SEC_BEG   (ushort)0x0080
916 #define ASC_DATA_SEC_END   (ushort)0x0080
917 #define ASC_CODE_SEC_BEG   (ushort)0x0080
918 #define ASC_CODE_SEC_END   (ushort)0x0080
919 #define ASC_QADR_BEG       (0x4000)
920 #define ASC_QADR_USED      (ushort)(ASC_MAX_QNO * 64)
921 #define ASC_QADR_END       (ushort)0x7FFF
922 #define ASC_QLAST_ADR      (ushort)0x7FC0
923 #define ASC_QBLK_SIZE      0x40
924 #define ASC_BIOS_DATA_QBEG 0xF8
925 #define ASC_MIN_ACTIVE_QNO 0x01
926 #define ASC_QLINK_END      0xFF
927 #define ASC_EEPROM_WORDS   0x10
928 #define ASC_MAX_MGS_LEN    0x10
929 #define ASC_BIOS_ADDR_DEF  0xDC00
930 #define ASC_BIOS_SIZE      0x3800
931 #define ASC_BIOS_RAM_OFF   0x3800
932 #define ASC_BIOS_RAM_SIZE  0x800
933 #define ASC_BIOS_MIN_ADDR  0xC000
934 #define ASC_BIOS_MAX_ADDR  0xEC00
935 #define ASC_BIOS_BANK_SIZE 0x0400
936 #define ASC_MCODE_START_ADDR  0x0080
937 #define ASC_CFG0_HOST_INT_ON    0x0020
938 #define ASC_CFG0_BIOS_ON        0x0040
939 #define ASC_CFG0_VERA_BURST_ON  0x0080
940 #define ASC_CFG0_SCSI_PARITY_ON 0x0800
941 #define ASC_CFG1_SCSI_TARGET_ON 0x0080
942 #define ASC_CFG1_LRAM_8BITS_ON  0x0800
943 #define ASC_CFG_MSW_CLR_MASK    0x3080
944 #define CSW_TEST1             (ASC_CS_TYPE)0x8000
945 #define CSW_AUTO_CONFIG       (ASC_CS_TYPE)0x4000
946 #define CSW_RESERVED1         (ASC_CS_TYPE)0x2000
947 #define CSW_IRQ_WRITTEN       (ASC_CS_TYPE)0x1000
948 #define CSW_33MHZ_SELECTED    (ASC_CS_TYPE)0x0800
949 #define CSW_TEST2             (ASC_CS_TYPE)0x0400
950 #define CSW_TEST3             (ASC_CS_TYPE)0x0200
951 #define CSW_RESERVED2         (ASC_CS_TYPE)0x0100
952 #define CSW_DMA_DONE          (ASC_CS_TYPE)0x0080
953 #define CSW_FIFO_RDY          (ASC_CS_TYPE)0x0040
954 #define CSW_EEP_READ_DONE     (ASC_CS_TYPE)0x0020
955 #define CSW_HALTED            (ASC_CS_TYPE)0x0010
956 #define CSW_SCSI_RESET_ACTIVE (ASC_CS_TYPE)0x0008
957 #define CSW_PARITY_ERR        (ASC_CS_TYPE)0x0004
958 #define CSW_SCSI_RESET_LATCH  (ASC_CS_TYPE)0x0002
959 #define CSW_INT_PENDING       (ASC_CS_TYPE)0x0001
960 #define CIW_CLR_SCSI_RESET_INT (ASC_CS_TYPE)0x1000
961 #define CIW_INT_ACK      (ASC_CS_TYPE)0x0100
962 #define CIW_TEST1        (ASC_CS_TYPE)0x0200
963 #define CIW_TEST2        (ASC_CS_TYPE)0x0400
964 #define CIW_SEL_33MHZ    (ASC_CS_TYPE)0x0800
965 #define CIW_IRQ_ACT      (ASC_CS_TYPE)0x1000
966 #define CC_CHIP_RESET   (uchar)0x80
967 #define CC_SCSI_RESET   (uchar)0x40
968 #define CC_HALT         (uchar)0x20
969 #define CC_SINGLE_STEP  (uchar)0x10
970 #define CC_DMA_ABLE     (uchar)0x08
971 #define CC_TEST         (uchar)0x04
972 #define CC_BANK_ONE     (uchar)0x02
973 #define CC_DIAG         (uchar)0x01
974 #define ASC_1000_ID0W      0x04C1
975 #define ASC_1000_ID0W_FIX  0x00C1
976 #define ASC_1000_ID1B      0x25
977 #define ASC_EISA_REV_IOP_MASK  (0x0C83)
978 #define ASC_EISA_PID_IOP_MASK  (0x0C80)
979 #define ASC_EISA_CFG_IOP_MASK  (0x0C86)
980 #define ASC_GET_EISA_SLOT(iop)  (PortAddr)((iop) & 0xF000)
981 #define INS_HALTINT        (ushort)0x6281
982 #define INS_HALT           (ushort)0x6280
983 #define INS_SINT           (ushort)0x6200
984 #define INS_RFLAG_WTM      (ushort)0x7380
985 #define ASC_MC_SAVE_CODE_WSIZE  0x500
986 #define ASC_MC_SAVE_DATA_WSIZE  0x40
987
988 typedef struct asc_mc_saved {
989         ushort data[ASC_MC_SAVE_DATA_WSIZE];
990         ushort code[ASC_MC_SAVE_CODE_WSIZE];
991 } ASC_MC_SAVED;
992
993 #define AscGetQDoneInProgress(port)         AscReadLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B)
994 #define AscPutQDoneInProgress(port, val)    AscWriteLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B, val)
995 #define AscGetVarFreeQHead(port)            AscReadLramWord((port), ASCV_FREE_Q_HEAD_W)
996 #define AscGetVarDoneQTail(port)            AscReadLramWord((port), ASCV_DONE_Q_TAIL_W)
997 #define AscPutVarFreeQHead(port, val)       AscWriteLramWord((port), ASCV_FREE_Q_HEAD_W, val)
998 #define AscPutVarDoneQTail(port, val)       AscWriteLramWord((port), ASCV_DONE_Q_TAIL_W, val)
999 #define AscGetRiscVarFreeQHead(port)        AscReadLramByte((port), ASCV_NEXTRDY_B)
1000 #define AscGetRiscVarDoneQTail(port)        AscReadLramByte((port), ASCV_DONENEXT_B)
1001 #define AscPutRiscVarFreeQHead(port, val)   AscWriteLramByte((port), ASCV_NEXTRDY_B, val)
1002 #define AscPutRiscVarDoneQTail(port, val)   AscWriteLramByte((port), ASCV_DONENEXT_B, val)
1003 #define AscPutMCodeSDTRDoneAtID(port, id, data)  AscWriteLramByte((port), (ushort)((ushort)ASCV_SDTR_DONE_BEG+(ushort)id), (data));
1004 #define AscGetMCodeSDTRDoneAtID(port, id)        AscReadLramByte((port), (ushort)((ushort)ASCV_SDTR_DONE_BEG+(ushort)id));
1005 #define AscPutMCodeInitSDTRAtID(port, id, data)  AscWriteLramByte((port), (ushort)((ushort)ASCV_SDTR_DATA_BEG+(ushort)id), data);
1006 #define AscGetMCodeInitSDTRAtID(port, id)        AscReadLramByte((port), (ushort)((ushort)ASCV_SDTR_DATA_BEG+(ushort)id));
1007 #define AscSynIndexToPeriod(index)        (uchar)(asc_dvc->sdtr_period_tbl[ (index) ])
1008 #define AscGetChipSignatureByte(port)     (uchar)inp((port)+IOP_SIG_BYTE)
1009 #define AscGetChipSignatureWord(port)     (ushort)inpw((port)+IOP_SIG_WORD)
1010 #define AscGetChipVerNo(port)             (uchar)inp((port)+IOP_VERSION)
1011 #define AscGetChipCfgLsw(port)            (ushort)inpw((port)+IOP_CONFIG_LOW)
1012 #define AscGetChipCfgMsw(port)            (ushort)inpw((port)+IOP_CONFIG_HIGH)
1013 #define AscSetChipCfgLsw(port, data)      outpw((port)+IOP_CONFIG_LOW, data)
1014 #define AscSetChipCfgMsw(port, data)      outpw((port)+IOP_CONFIG_HIGH, data)
1015 #define AscGetChipEEPCmd(port)            (uchar)inp((port)+IOP_EEP_CMD)
1016 #define AscSetChipEEPCmd(port, data)      outp((port)+IOP_EEP_CMD, data)
1017 #define AscGetChipEEPData(port)           (ushort)inpw((port)+IOP_EEP_DATA)
1018 #define AscSetChipEEPData(port, data)     outpw((port)+IOP_EEP_DATA, data)
1019 #define AscGetChipLramAddr(port)          (ushort)inpw((PortAddr)((port)+IOP_RAM_ADDR))
1020 #define AscSetChipLramAddr(port, addr)    outpw((PortAddr)((port)+IOP_RAM_ADDR), addr)
1021 #define AscGetChipLramData(port)          (ushort)inpw((port)+IOP_RAM_DATA)
1022 #define AscSetChipLramData(port, data)    outpw((port)+IOP_RAM_DATA, data)
1023 #define AscGetChipIFC(port)               (uchar)inp((port)+IOP_REG_IFC)
1024 #define AscSetChipIFC(port, data)          outp((port)+IOP_REG_IFC, data)
1025 #define AscGetChipStatus(port)            (ASC_CS_TYPE)inpw((port)+IOP_STATUS)
1026 #define AscSetChipStatus(port, cs_val)    outpw((port)+IOP_STATUS, cs_val)
1027 #define AscGetChipControl(port)           (uchar)inp((port)+IOP_CTRL)
1028 #define AscSetChipControl(port, cc_val)   outp((port)+IOP_CTRL, cc_val)
1029 #define AscGetChipSyn(port)               (uchar)inp((port)+IOP_SYN_OFFSET)
1030 #define AscSetChipSyn(port, data)         outp((port)+IOP_SYN_OFFSET, data)
1031 #define AscSetPCAddr(port, data)          outpw((port)+IOP_REG_PC, data)
1032 #define AscGetPCAddr(port)                (ushort)inpw((port)+IOP_REG_PC)
1033 #define AscIsIntPending(port)             (AscGetChipStatus(port) & (CSW_INT_PENDING | CSW_SCSI_RESET_LATCH))
1034 #define AscGetChipScsiID(port)            ((AscGetChipCfgLsw(port) >> 8) & ASC_MAX_TID)
1035 #define AscGetExtraControl(port)          (uchar)inp((port)+IOP_EXTRA_CONTROL)
1036 #define AscSetExtraControl(port, data)    outp((port)+IOP_EXTRA_CONTROL, data)
1037 #define AscReadChipAX(port)               (ushort)inpw((port)+IOP_REG_AX)
1038 #define AscWriteChipAX(port, data)        outpw((port)+IOP_REG_AX, data)
1039 #define AscReadChipIX(port)               (uchar)inp((port)+IOP_REG_IX)
1040 #define AscWriteChipIX(port, data)        outp((port)+IOP_REG_IX, data)
1041 #define AscReadChipIH(port)               (ushort)inpw((port)+IOP_REG_IH)
1042 #define AscWriteChipIH(port, data)        outpw((port)+IOP_REG_IH, data)
1043 #define AscReadChipQP(port)               (uchar)inp((port)+IOP_REG_QP)
1044 #define AscWriteChipQP(port, data)        outp((port)+IOP_REG_QP, data)
1045 #define AscReadChipFIFO_L(port)           (ushort)inpw((port)+IOP_REG_FIFO_L)
1046 #define AscWriteChipFIFO_L(port, data)    outpw((port)+IOP_REG_FIFO_L, data)
1047 #define AscReadChipFIFO_H(port)           (ushort)inpw((port)+IOP_REG_FIFO_H)
1048 #define AscWriteChipFIFO_H(port, data)    outpw((port)+IOP_REG_FIFO_H, data)
1049 #define AscReadChipDmaSpeed(port)         (uchar)inp((port)+IOP_DMA_SPEED)
1050 #define AscWriteChipDmaSpeed(port, data)  outp((port)+IOP_DMA_SPEED, data)
1051 #define AscReadChipDA0(port)              (ushort)inpw((port)+IOP_REG_DA0)
1052 #define AscWriteChipDA0(port)             outpw((port)+IOP_REG_DA0, data)
1053 #define AscReadChipDA1(port)              (ushort)inpw((port)+IOP_REG_DA1)
1054 #define AscWriteChipDA1(port)             outpw((port)+IOP_REG_DA1, data)
1055 #define AscReadChipDC0(port)              (ushort)inpw((port)+IOP_REG_DC0)
1056 #define AscWriteChipDC0(port)             outpw((port)+IOP_REG_DC0, data)
1057 #define AscReadChipDC1(port)              (ushort)inpw((port)+IOP_REG_DC1)
1058 #define AscWriteChipDC1(port)             outpw((port)+IOP_REG_DC1, data)
1059 #define AscReadChipDvcID(port)            (uchar)inp((port)+IOP_REG_ID)
1060 #define AscWriteChipDvcID(port, data)     outp((port)+IOP_REG_ID, data)
1061
1062 static int AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg);
1063 static int AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg);
1064 static void AscWaitEEPRead(void);
1065 static void AscWaitEEPWrite(void);
1066 static ushort AscReadEEPWord(PortAddr, uchar);
1067 static ushort AscWriteEEPWord(PortAddr, uchar, ushort);
1068 static ushort AscGetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
1069 static int AscSetEEPConfigOnce(PortAddr, ASCEEP_CONFIG *, ushort);
1070 static int AscSetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
1071 static int AscStartChip(PortAddr);
1072 static int AscStopChip(PortAddr);
1073 static void AscSetChipIH(PortAddr, ushort);
1074 static int AscIsChipHalted(PortAddr);
1075 static void AscAckInterrupt(PortAddr);
1076 static void AscDisableInterrupt(PortAddr);
1077 static void AscEnableInterrupt(PortAddr);
1078 static void AscSetBank(PortAddr, uchar);
1079 static int AscResetChipAndScsiBus(ASC_DVC_VAR *);
1080 #ifdef CONFIG_ISA
1081 static uchar AscGetIsaDmaSpeed(PortAddr);
1082 #endif /* CONFIG_ISA */
1083 static uchar AscReadLramByte(PortAddr, ushort);
1084 static ushort AscReadLramWord(PortAddr, ushort);
1085 #if CC_VERY_LONG_SG_LIST
1086 static ASC_DCNT AscReadLramDWord(PortAddr, ushort);
1087 #endif /* CC_VERY_LONG_SG_LIST */
1088 static void AscWriteLramWord(PortAddr, ushort, ushort);
1089 static void AscWriteLramByte(PortAddr, ushort, uchar);
1090 static ASC_DCNT AscMemSumLramWord(PortAddr, ushort, int);
1091 static void AscMemWordSetLram(PortAddr, ushort, ushort, int);
1092 static void AscMemWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
1093 static void AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
1094 static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int);
1095 static ushort AscInitAscDvcVar(ASC_DVC_VAR *);
1096 static ushort AscInitFromEEP(ASC_DVC_VAR *);
1097 static ushort AscInitMicroCodeVar(ASC_DVC_VAR *);
1098 static int AscTestExternalLram(ASC_DVC_VAR *);
1099 static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar);
1100 static uchar AscCalSDTRData(ASC_DVC_VAR *, uchar, uchar);
1101 static void AscSetChipSDTR(PortAddr, uchar, uchar);
1102 static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *, uchar);
1103 static uchar AscAllocFreeQueue(PortAddr, uchar);
1104 static uchar AscAllocMultipleFreeQueue(PortAddr, uchar, uchar);
1105 static int AscHostReqRiscHalt(PortAddr);
1106 static int AscStopQueueExe(PortAddr);
1107 static int AscSendScsiQueue(ASC_DVC_VAR *,
1108                             ASC_SCSI_Q *scsiq, uchar n_q_required);
1109 static int AscPutReadyQueue(ASC_DVC_VAR *, ASC_SCSI_Q *, uchar);
1110 static int AscPutReadySgListQueue(ASC_DVC_VAR *, ASC_SCSI_Q *, uchar);
1111 static int AscSetChipSynRegAtID(PortAddr, uchar, uchar);
1112 static int AscSetRunChipSynRegAtID(PortAddr, uchar, uchar);
1113 static ushort AscInitLram(ASC_DVC_VAR *);
1114 static ushort AscInitQLinkVar(ASC_DVC_VAR *);
1115 static int AscSetLibErrorCode(ASC_DVC_VAR *, ushort);
1116 static int AscIsrChipHalted(ASC_DVC_VAR *);
1117 static uchar _AscCopyLramScsiDoneQ(PortAddr, ushort,
1118                                    ASC_QDONE_INFO *, ASC_DCNT);
1119 static int AscIsrQDone(ASC_DVC_VAR *);
1120 #ifdef CONFIG_ISA
1121 static ushort AscGetEisaChipCfg(PortAddr);
1122 #endif /* CONFIG_ISA */
1123 static uchar AscGetChipScsiCtrl(PortAddr);
1124 static uchar AscGetChipVersion(PortAddr, ushort);
1125 static ASC_DCNT AscLoadMicroCode(PortAddr, ushort, uchar *, ushort);
1126 static void AscToggleIRQAct(PortAddr);
1127 static inline ulong DvcEnterCritical(void);
1128 static inline void DvcLeaveCritical(ulong);
1129 static void DvcSleepMilliSecond(ASC_DCNT);
1130 static void DvcDelayNanoSecond(ASC_DVC_VAR *, ASC_DCNT);
1131 static void DvcPutScsiQ(PortAddr, ushort, uchar *, int);
1132 static void DvcGetQinfo(PortAddr, ushort, uchar *, int);
1133 static ushort AscInitAsc1000Driver(ASC_DVC_VAR *);
1134 static void AscAsyncFix(ASC_DVC_VAR *, struct scsi_device *);
1135 static int AscExeScsiQueue(ASC_DVC_VAR *, ASC_SCSI_Q *);
1136 static int AscISR(ASC_DVC_VAR *);
1137 static uint AscGetNumOfFreeQueue(ASC_DVC_VAR *, uchar, uchar);
1138 static int AscSgListToQueue(int);
1139 #ifdef CONFIG_ISA
1140 static void AscEnableIsaDma(uchar);
1141 #endif /* CONFIG_ISA */
1142 static const char *advansys_info(struct Scsi_Host *shost);
1143
1144 /*
1145  * --- Adv Library Constants and Macros
1146  */
1147
1148 #define ADV_LIB_VERSION_MAJOR  5
1149 #define ADV_LIB_VERSION_MINOR  14
1150
1151 /*
1152  * Define Adv Library required special types.
1153  */
1154
1155 /*
1156  * Portable Data Types
1157  *
1158  * Any instance where a 32-bit long or pointer type is assumed
1159  * for precision or HW defined structures, the following define
1160  * types must be used. In Linux the char, short, and int types
1161  * are all consistent at 8, 16, and 32 bits respectively. Pointers
1162  * and long types are 64 bits on Alpha and UltraSPARC.
1163  */
1164 #define ADV_PADDR __u32         /* Physical address data type. */
1165 #define ADV_VADDR __u32         /* Virtual address data type. */
1166 #define ADV_DCNT  __u32         /* Unsigned Data count type. */
1167 #define ADV_SDCNT __s32         /* Signed Data count type. */
1168
1169 /*
1170  * These macros are used to convert a virtual address to a
1171  * 32-bit value. This currently can be used on Linux Alpha
1172  * which uses 64-bit virtual address but a 32-bit bus address.
1173  * This is likely to break in the future, but doing this now
1174  * will give us time to change the HW and FW to handle 64-bit
1175  * addresses.
1176  */
1177 #define ADV_VADDR_TO_U32   virt_to_bus
1178 #define ADV_U32_TO_VADDR   bus_to_virt
1179
1180 #define AdvPortAddr  void __iomem *     /* Virtual memory address size */
1181
1182 /*
1183  * Define Adv Library required memory access macros.
1184  */
1185 #define ADV_MEM_READB(addr) readb(addr)
1186 #define ADV_MEM_READW(addr) readw(addr)
1187 #define ADV_MEM_WRITEB(addr, byte) writeb(byte, addr)
1188 #define ADV_MEM_WRITEW(addr, word) writew(word, addr)
1189 #define ADV_MEM_WRITEDW(addr, dword) writel(dword, addr)
1190
1191 #define ADV_CARRIER_COUNT (ASC_DEF_MAX_HOST_QNG + 15)
1192
1193 /*
1194  * For wide  boards a CDB length maximum of 16 bytes
1195  * is supported.
1196  */
1197 #define ADV_MAX_CDB_LEN     16
1198
1199 /*
1200  * Define total number of simultaneous maximum element scatter-gather
1201  * request blocks per wide adapter. ASC_DEF_MAX_HOST_QNG (253) is the
1202  * maximum number of outstanding commands per wide host adapter. Each
1203  * command uses one or more ADV_SG_BLOCK each with 15 scatter-gather
1204  * elements. Allow each command to have at least one ADV_SG_BLOCK structure.
1205  * This allows about 15 commands to have the maximum 17 ADV_SG_BLOCK
1206  * structures or 255 scatter-gather elements.
1207  *
1208  */
1209 #define ADV_TOT_SG_BLOCK        ASC_DEF_MAX_HOST_QNG
1210
1211 /*
1212  * Define Adv Library required maximum number of scatter-gather
1213  * elements per request.
1214  */
1215 #define ADV_MAX_SG_LIST         255
1216
1217 /* Number of SG blocks needed. */
1218 #define ADV_NUM_SG_BLOCK \
1219     ((ADV_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK)
1220
1221 /* Total contiguous memory needed for SG blocks. */
1222 #define ADV_SG_TOTAL_MEM_SIZE \
1223     (sizeof(ADV_SG_BLOCK) *  ADV_NUM_SG_BLOCK)
1224
1225 #define ADV_PAGE_SIZE PAGE_SIZE
1226
1227 #define ADV_NUM_PAGE_CROSSING \
1228     ((ADV_SG_TOTAL_MEM_SIZE + (ADV_PAGE_SIZE - 1))/ADV_PAGE_SIZE)
1229
1230 #define ADV_EEP_DVC_CFG_BEGIN           (0x00)
1231 #define ADV_EEP_DVC_CFG_END             (0x15)
1232 #define ADV_EEP_DVC_CTL_BEGIN           (0x16)  /* location of OEM name */
1233 #define ADV_EEP_MAX_WORD_ADDR           (0x1E)
1234
1235 #define ADV_EEP_DELAY_MS                100
1236
1237 #define ADV_EEPROM_BIG_ENDIAN          0x8000   /* EEPROM Bit 15 */
1238 #define ADV_EEPROM_BIOS_ENABLE         0x4000   /* EEPROM Bit 14 */
1239 /*
1240  * For the ASC3550 Bit 13 is Termination Polarity control bit.
1241  * For later ICs Bit 13 controls whether the CIS (Card Information
1242  * Service Section) is loaded from EEPROM.
1243  */
1244 #define ADV_EEPROM_TERM_POL            0x2000   /* EEPROM Bit 13 */
1245 #define ADV_EEPROM_CIS_LD              0x2000   /* EEPROM Bit 13 */
1246 /*
1247  * ASC38C1600 Bit 11
1248  *
1249  * If EEPROM Bit 11 is 0 for Function 0, then Function 0 will specify
1250  * INT A in the PCI Configuration Space Int Pin field. If it is 1, then
1251  * Function 0 will specify INT B.
1252  *
1253  * If EEPROM Bit 11 is 0 for Function 1, then Function 1 will specify
1254  * INT B in the PCI Configuration Space Int Pin field. If it is 1, then
1255  * Function 1 will specify INT A.
1256  */
1257 #define ADV_EEPROM_INTAB               0x0800   /* EEPROM Bit 11 */
1258
1259 typedef struct adveep_3550_config {
1260         /* Word Offset, Description */
1261
1262         ushort cfg_lsw;         /* 00 power up initialization */
1263         /*  bit 13 set - Term Polarity Control */
1264         /*  bit 14 set - BIOS Enable */
1265         /*  bit 15 set - Big Endian Mode */
1266         ushort cfg_msw;         /* 01 unused      */
1267         ushort disc_enable;     /* 02 disconnect enable */
1268         ushort wdtr_able;       /* 03 Wide DTR able */
1269         ushort sdtr_able;       /* 04 Synchronous DTR able */
1270         ushort start_motor;     /* 05 send start up motor */
1271         ushort tagqng_able;     /* 06 tag queuing able */
1272         ushort bios_scan;       /* 07 BIOS device control */
1273         ushort scam_tolerant;   /* 08 no scam */
1274
1275         uchar adapter_scsi_id;  /* 09 Host Adapter ID */
1276         uchar bios_boot_delay;  /*    power up wait */
1277
1278         uchar scsi_reset_delay; /* 10 reset delay */
1279         uchar bios_id_lun;      /*    first boot device scsi id & lun */
1280         /*    high nibble is lun */
1281         /*    low nibble is scsi id */
1282
1283         uchar termination;      /* 11 0 - automatic */
1284         /*    1 - low off / high off */
1285         /*    2 - low off / high on */
1286         /*    3 - low on  / high on */
1287         /*    There is no low on  / high off */
1288
1289         uchar reserved1;        /*    reserved byte (not used) */
1290
1291         ushort bios_ctrl;       /* 12 BIOS control bits */
1292         /*  bit 0  BIOS don't act as initiator. */
1293         /*  bit 1  BIOS > 1 GB support */
1294         /*  bit 2  BIOS > 2 Disk Support */
1295         /*  bit 3  BIOS don't support removables */
1296         /*  bit 4  BIOS support bootable CD */
1297         /*  bit 5  BIOS scan enabled */
1298         /*  bit 6  BIOS support multiple LUNs */
1299         /*  bit 7  BIOS display of message */
1300         /*  bit 8  SCAM disabled */
1301         /*  bit 9  Reset SCSI bus during init. */
1302         /*  bit 10 */
1303         /*  bit 11 No verbose initialization. */
1304         /*  bit 12 SCSI parity enabled */
1305         /*  bit 13 */
1306         /*  bit 14 */
1307         /*  bit 15 */
1308         ushort ultra_able;      /* 13 ULTRA speed able */
1309         ushort reserved2;       /* 14 reserved */
1310         uchar max_host_qng;     /* 15 maximum host queuing */
1311         uchar max_dvc_qng;      /*    maximum per device queuing */
1312         ushort dvc_cntl;        /* 16 control bit for driver */
1313         ushort bug_fix;         /* 17 control bit for bug fix */
1314         ushort serial_number_word1;     /* 18 Board serial number word 1 */
1315         ushort serial_number_word2;     /* 19 Board serial number word 2 */
1316         ushort serial_number_word3;     /* 20 Board serial number word 3 */
1317         ushort check_sum;       /* 21 EEP check sum */
1318         uchar oem_name[16];     /* 22 OEM name */
1319         ushort dvc_err_code;    /* 30 last device driver error code */
1320         ushort adv_err_code;    /* 31 last uc and Adv Lib error code */
1321         ushort adv_err_addr;    /* 32 last uc error address */
1322         ushort saved_dvc_err_code;      /* 33 saved last dev. driver error code   */
1323         ushort saved_adv_err_code;      /* 34 saved last uc and Adv Lib error code */
1324         ushort saved_adv_err_addr;      /* 35 saved last uc error address         */
1325         ushort num_of_err;      /* 36 number of error */
1326 } ADVEEP_3550_CONFIG;
1327
1328 typedef struct adveep_38C0800_config {
1329         /* Word Offset, Description */
1330
1331         ushort cfg_lsw;         /* 00 power up initialization */
1332         /*  bit 13 set - Load CIS */
1333         /*  bit 14 set - BIOS Enable */
1334         /*  bit 15 set - Big Endian Mode */
1335         ushort cfg_msw;         /* 01 unused      */
1336         ushort disc_enable;     /* 02 disconnect enable */
1337         ushort wdtr_able;       /* 03 Wide DTR able */
1338         ushort sdtr_speed1;     /* 04 SDTR Speed TID 0-3 */
1339         ushort start_motor;     /* 05 send start up motor */
1340         ushort tagqng_able;     /* 06 tag queuing able */
1341         ushort bios_scan;       /* 07 BIOS device control */
1342         ushort scam_tolerant;   /* 08 no scam */
1343
1344         uchar adapter_scsi_id;  /* 09 Host Adapter ID */
1345         uchar bios_boot_delay;  /*    power up wait */
1346
1347         uchar scsi_reset_delay; /* 10 reset delay */
1348         uchar bios_id_lun;      /*    first boot device scsi id & lun */
1349         /*    high nibble is lun */
1350         /*    low nibble is scsi id */
1351
1352         uchar termination_se;   /* 11 0 - automatic */
1353         /*    1 - low off / high off */
1354         /*    2 - low off / high on */
1355         /*    3 - low on  / high on */
1356         /*    There is no low on  / high off */
1357
1358         uchar termination_lvd;  /* 11 0 - automatic */
1359         /*    1 - low off / high off */
1360         /*    2 - low off / high on */
1361         /*    3 - low on  / high on */
1362         /*    There is no low on  / high off */
1363
1364         ushort bios_ctrl;       /* 12 BIOS control bits */
1365         /*  bit 0  BIOS don't act as initiator. */
1366         /*  bit 1  BIOS > 1 GB support */
1367         /*  bit 2  BIOS > 2 Disk Support */
1368         /*  bit 3  BIOS don't support removables */
1369         /*  bit 4  BIOS support bootable CD */
1370         /*  bit 5  BIOS scan enabled */
1371         /*  bit 6  BIOS support multiple LUNs */
1372         /*  bit 7  BIOS display of message */
1373         /*  bit 8  SCAM disabled */
1374         /*  bit 9  Reset SCSI bus during init. */
1375         /*  bit 10 */
1376         /*  bit 11 No verbose initialization. */
1377         /*  bit 12 SCSI parity enabled */
1378         /*  bit 13 */
1379         /*  bit 14 */
1380         /*  bit 15 */
1381         ushort sdtr_speed2;     /* 13 SDTR speed TID 4-7 */
1382         ushort sdtr_speed3;     /* 14 SDTR speed TID 8-11 */
1383         uchar max_host_qng;     /* 15 maximum host queueing */
1384         uchar max_dvc_qng;      /*    maximum per device queuing */
1385         ushort dvc_cntl;        /* 16 control bit for driver */
1386         ushort sdtr_speed4;     /* 17 SDTR speed 4 TID 12-15 */
1387         ushort serial_number_word1;     /* 18 Board serial number word 1 */
1388         ushort serial_number_word2;     /* 19 Board serial number word 2 */
1389         ushort serial_number_word3;     /* 20 Board serial number word 3 */
1390         ushort check_sum;       /* 21 EEP check sum */
1391         uchar oem_name[16];     /* 22 OEM name */
1392         ushort dvc_err_code;    /* 30 last device driver error code */
1393         ushort adv_err_code;    /* 31 last uc and Adv Lib error code */
1394         ushort adv_err_addr;    /* 32 last uc error address */
1395         ushort saved_dvc_err_code;      /* 33 saved last dev. driver error code   */
1396         ushort saved_adv_err_code;      /* 34 saved last uc and Adv Lib error code */
1397         ushort saved_adv_err_addr;      /* 35 saved last uc error address         */
1398         ushort reserved36;      /* 36 reserved */
1399         ushort reserved37;      /* 37 reserved */
1400         ushort reserved38;      /* 38 reserved */
1401         ushort reserved39;      /* 39 reserved */
1402         ushort reserved40;      /* 40 reserved */
1403         ushort reserved41;      /* 41 reserved */
1404         ushort reserved42;      /* 42 reserved */
1405         ushort reserved43;      /* 43 reserved */
1406         ushort reserved44;      /* 44 reserved */
1407         ushort reserved45;      /* 45 reserved */
1408         ushort reserved46;      /* 46 reserved */
1409         ushort reserved47;      /* 47 reserved */
1410         ushort reserved48;      /* 48 reserved */
1411         ushort reserved49;      /* 49 reserved */
1412         ushort reserved50;      /* 50 reserved */
1413         ushort reserved51;      /* 51 reserved */
1414         ushort reserved52;      /* 52 reserved */
1415         ushort reserved53;      /* 53 reserved */
1416         ushort reserved54;      /* 54 reserved */
1417         ushort reserved55;      /* 55 reserved */
1418         ushort cisptr_lsw;      /* 56 CIS PTR LSW */
1419         ushort cisprt_msw;      /* 57 CIS PTR MSW */
1420         ushort subsysvid;       /* 58 SubSystem Vendor ID */
1421         ushort subsysid;        /* 59 SubSystem ID */
1422         ushort reserved60;      /* 60 reserved */
1423         ushort reserved61;      /* 61 reserved */
1424         ushort reserved62;      /* 62 reserved */
1425         ushort reserved63;      /* 63 reserved */
1426 } ADVEEP_38C0800_CONFIG;
1427
1428 typedef struct adveep_38C1600_config {
1429         /* Word Offset, Description */
1430
1431         ushort cfg_lsw;         /* 00 power up initialization */
1432         /*  bit 11 set - Func. 0 INTB, Func. 1 INTA */
1433         /*       clear - Func. 0 INTA, Func. 1 INTB */
1434         /*  bit 13 set - Load CIS */
1435         /*  bit 14 set - BIOS Enable */
1436         /*  bit 15 set - Big Endian Mode */
1437         ushort cfg_msw;         /* 01 unused */
1438         ushort disc_enable;     /* 02 disconnect enable */
1439         ushort wdtr_able;       /* 03 Wide DTR able */
1440         ushort sdtr_speed1;     /* 04 SDTR Speed TID 0-3 */
1441         ushort start_motor;     /* 05 send start up motor */
1442         ushort tagqng_able;     /* 06 tag queuing able */
1443         ushort bios_scan;       /* 07 BIOS device control */
1444         ushort scam_tolerant;   /* 08 no scam */
1445
1446         uchar adapter_scsi_id;  /* 09 Host Adapter ID */
1447         uchar bios_boot_delay;  /*    power up wait */
1448
1449         uchar scsi_reset_delay; /* 10 reset delay */
1450         uchar bios_id_lun;      /*    first boot device scsi id & lun */
1451         /*    high nibble is lun */
1452         /*    low nibble is scsi id */
1453
1454         uchar termination_se;   /* 11 0 - automatic */
1455         /*    1 - low off / high off */
1456         /*    2 - low off / high on */
1457         /*    3 - low on  / high on */
1458         /*    There is no low on  / high off */
1459
1460         uchar termination_lvd;  /* 11 0 - automatic */
1461         /*    1 - low off / high off */
1462         /*    2 - low off / high on */
1463         /*    3 - low on  / high on */
1464         /*    There is no low on  / high off */
1465
1466         ushort bios_ctrl;       /* 12 BIOS control bits */
1467         /*  bit 0  BIOS don't act as initiator. */
1468         /*  bit 1  BIOS > 1 GB support */
1469         /*  bit 2  BIOS > 2 Disk Support */
1470         /*  bit 3  BIOS don't support removables */
1471         /*  bit 4  BIOS support bootable CD */
1472         /*  bit 5  BIOS scan enabled */
1473         /*  bit 6  BIOS support multiple LUNs */
1474         /*  bit 7  BIOS display of message */
1475         /*  bit 8  SCAM disabled */
1476         /*  bit 9  Reset SCSI bus during init. */
1477         /*  bit 10 Basic Integrity Checking disabled */
1478         /*  bit 11 No verbose initialization. */
1479         /*  bit 12 SCSI parity enabled */
1480         /*  bit 13 AIPP (Asyn. Info. Ph. Prot.) dis. */
1481         /*  bit 14 */
1482         /*  bit 15 */
1483         ushort sdtr_speed2;     /* 13 SDTR speed TID 4-7 */
1484         ushort sdtr_speed3;     /* 14 SDTR speed TID 8-11 */
1485         uchar max_host_qng;     /* 15 maximum host queueing */
1486         uchar max_dvc_qng;      /*    maximum per device queuing */
1487         ushort dvc_cntl;        /* 16 control bit for driver */
1488         ushort sdtr_speed4;     /* 17 SDTR speed 4 TID 12-15 */
1489         ushort serial_number_word1;     /* 18 Board serial number word 1 */
1490         ushort serial_number_word2;     /* 19 Board serial number word 2 */
1491         ushort serial_number_word3;     /* 20 Board serial number word 3 */
1492         ushort check_sum;       /* 21 EEP check sum */
1493         uchar oem_name[16];     /* 22 OEM name */
1494         ushort dvc_err_code;    /* 30 last device driver error code */
1495         ushort adv_err_code;    /* 31 last uc and Adv Lib error code */
1496         ushort adv_err_addr;    /* 32 last uc error address */
1497         ushort saved_dvc_err_code;      /* 33 saved last dev. driver error code   */
1498         ushort saved_adv_err_code;      /* 34 saved last uc and Adv Lib error code */
1499         ushort saved_adv_err_addr;      /* 35 saved last uc error address         */
1500         ushort reserved36;      /* 36 reserved */
1501         ushort reserved37;      /* 37 reserved */
1502         ushort reserved38;      /* 38 reserved */
1503         ushort reserved39;      /* 39 reserved */
1504         ushort reserved40;      /* 40 reserved */
1505         ushort reserved41;      /* 41 reserved */
1506         ushort reserved42;      /* 42 reserved */
1507         ushort reserved43;      /* 43 reserved */
1508         ushort reserved44;      /* 44 reserved */
1509         ushort reserved45;      /* 45 reserved */
1510         ushort reserved46;      /* 46 reserved */
1511         ushort reserved47;      /* 47 reserved */
1512         ushort reserved48;      /* 48 reserved */
1513         ushort reserved49;      /* 49 reserved */
1514         ushort reserved50;      /* 50 reserved */
1515         ushort reserved51;      /* 51 reserved */
1516         ushort reserved52;      /* 52 reserved */
1517         ushort reserved53;      /* 53 reserved */
1518         ushort reserved54;      /* 54 reserved */
1519         ushort reserved55;      /* 55 reserved */
1520         ushort cisptr_lsw;      /* 56 CIS PTR LSW */
1521         ushort cisprt_msw;      /* 57 CIS PTR MSW */
1522         ushort subsysvid;       /* 58 SubSystem Vendor ID */
1523         ushort subsysid;        /* 59 SubSystem ID */
1524         ushort reserved60;      /* 60 reserved */
1525         ushort reserved61;      /* 61 reserved */
1526         ushort reserved62;      /* 62 reserved */
1527         ushort reserved63;      /* 63 reserved */
1528 } ADVEEP_38C1600_CONFIG;
1529
1530 /*
1531  * EEPROM Commands
1532  */
1533 #define ASC_EEP_CMD_DONE             0x0200
1534 #define ASC_EEP_CMD_DONE_ERR         0x0001
1535
1536 /* cfg_word */
1537 #define EEP_CFG_WORD_BIG_ENDIAN      0x8000
1538
1539 /* bios_ctrl */
1540 #define BIOS_CTRL_BIOS               0x0001
1541 #define BIOS_CTRL_EXTENDED_XLAT      0x0002
1542 #define BIOS_CTRL_GT_2_DISK          0x0004
1543 #define BIOS_CTRL_BIOS_REMOVABLE     0x0008
1544 #define BIOS_CTRL_BOOTABLE_CD        0x0010
1545 #define BIOS_CTRL_MULTIPLE_LUN       0x0040
1546 #define BIOS_CTRL_DISPLAY_MSG        0x0080
1547 #define BIOS_CTRL_NO_SCAM            0x0100
1548 #define BIOS_CTRL_RESET_SCSI_BUS     0x0200
1549 #define BIOS_CTRL_INIT_VERBOSE       0x0800
1550 #define BIOS_CTRL_SCSI_PARITY        0x1000
1551 #define BIOS_CTRL_AIPP_DIS           0x2000
1552
1553 #define ADV_3550_MEMSIZE   0x2000       /* 8 KB Internal Memory */
1554
1555 #define ADV_38C0800_MEMSIZE  0x4000     /* 16 KB Internal Memory */
1556
1557 /*
1558  * XXX - Since ASC38C1600 Rev.3 has a local RAM failure issue, there is
1559  * a special 16K Adv Library and Microcode version. After the issue is
1560  * resolved, should restore 32K support.
1561  *
1562  * #define ADV_38C1600_MEMSIZE  0x8000L   * 32 KB Internal Memory *
1563  */
1564 #define ADV_38C1600_MEMSIZE  0x4000     /* 16 KB Internal Memory */
1565
1566 /*
1567  * Byte I/O register address from base of 'iop_base'.
1568  */
1569 #define IOPB_INTR_STATUS_REG    0x00
1570 #define IOPB_CHIP_ID_1          0x01
1571 #define IOPB_INTR_ENABLES       0x02
1572 #define IOPB_CHIP_TYPE_REV      0x03
1573 #define IOPB_RES_ADDR_4         0x04
1574 #define IOPB_RES_ADDR_5         0x05
1575 #define IOPB_RAM_DATA           0x06
1576 #define IOPB_RES_ADDR_7         0x07
1577 #define IOPB_FLAG_REG           0x08
1578 #define IOPB_RES_ADDR_9         0x09
1579 #define IOPB_RISC_CSR           0x0A
1580 #define IOPB_RES_ADDR_B         0x0B
1581 #define IOPB_RES_ADDR_C         0x0C
1582 #define IOPB_RES_ADDR_D         0x0D
1583 #define IOPB_SOFT_OVER_WR       0x0E
1584 #define IOPB_RES_ADDR_F         0x0F
1585 #define IOPB_MEM_CFG            0x10
1586 #define IOPB_RES_ADDR_11        0x11
1587 #define IOPB_GPIO_DATA          0x12
1588 #define IOPB_RES_ADDR_13        0x13
1589 #define IOPB_FLASH_PAGE         0x14
1590 #define IOPB_RES_ADDR_15        0x15
1591 #define IOPB_GPIO_CNTL          0x16
1592 #define IOPB_RES_ADDR_17        0x17
1593 #define IOPB_FLASH_DATA         0x18
1594 #define IOPB_RES_ADDR_19        0x19
1595 #define IOPB_RES_ADDR_1A        0x1A
1596 #define IOPB_RES_ADDR_1B        0x1B
1597 #define IOPB_RES_ADDR_1C        0x1C
1598 #define IOPB_RES_ADDR_1D        0x1D
1599 #define IOPB_RES_ADDR_1E        0x1E
1600 #define IOPB_RES_ADDR_1F        0x1F
1601 #define IOPB_DMA_CFG0           0x20
1602 #define IOPB_DMA_CFG1           0x21
1603 #define IOPB_TICKLE             0x22
1604 #define IOPB_DMA_REG_WR         0x23
1605 #define IOPB_SDMA_STATUS        0x24
1606 #define IOPB_SCSI_BYTE_CNT      0x25
1607 #define IOPB_HOST_BYTE_CNT      0x26
1608 #define IOPB_BYTE_LEFT_TO_XFER  0x27
1609 #define IOPB_BYTE_TO_XFER_0     0x28
1610 #define IOPB_BYTE_TO_XFER_1     0x29
1611 #define IOPB_BYTE_TO_XFER_2     0x2A
1612 #define IOPB_BYTE_TO_XFER_3     0x2B
1613 #define IOPB_ACC_GRP            0x2C
1614 #define IOPB_RES_ADDR_2D        0x2D
1615 #define IOPB_DEV_ID             0x2E
1616 #define IOPB_RES_ADDR_2F        0x2F
1617 #define IOPB_SCSI_DATA          0x30
1618 #define IOPB_RES_ADDR_31        0x31
1619 #define IOPB_RES_ADDR_32        0x32
1620 #define IOPB_SCSI_DATA_HSHK     0x33
1621 #define IOPB_SCSI_CTRL          0x34
1622 #define IOPB_RES_ADDR_35        0x35
1623 #define IOPB_RES_ADDR_36        0x36
1624 #define IOPB_RES_ADDR_37        0x37
1625 #define IOPB_RAM_BIST           0x38
1626 #define IOPB_PLL_TEST           0x39
1627 #define IOPB_PCI_INT_CFG        0x3A
1628 #define IOPB_RES_ADDR_3B        0x3B
1629 #define IOPB_RFIFO_CNT          0x3C
1630 #define IOPB_RES_ADDR_3D        0x3D
1631 #define IOPB_RES_ADDR_3E        0x3E
1632 #define IOPB_RES_ADDR_3F        0x3F
1633
1634 /*
1635  * Word I/O register address from base of 'iop_base'.
1636  */
1637 #define IOPW_CHIP_ID_0          0x00    /* CID0  */
1638 #define IOPW_CTRL_REG           0x02    /* CC    */
1639 #define IOPW_RAM_ADDR           0x04    /* LA    */
1640 #define IOPW_RAM_DATA           0x06    /* LD    */
1641 #define IOPW_RES_ADDR_08        0x08
1642 #define IOPW_RISC_CSR           0x0A    /* CSR   */
1643 #define IOPW_SCSI_CFG0          0x0C    /* CFG0  */
1644 #define IOPW_SCSI_CFG1          0x0E    /* CFG1  */
1645 #define IOPW_RES_ADDR_10        0x10
1646 #define IOPW_SEL_MASK           0x12    /* SM    */
1647 #define IOPW_RES_ADDR_14        0x14
1648 #define IOPW_FLASH_ADDR         0x16    /* FA    */
1649 #define IOPW_RES_ADDR_18        0x18
1650 #define IOPW_EE_CMD             0x1A    /* EC    */
1651 #define IOPW_EE_DATA            0x1C    /* ED    */
1652 #define IOPW_SFIFO_CNT          0x1E    /* SFC   */
1653 #define IOPW_RES_ADDR_20        0x20
1654 #define IOPW_Q_BASE             0x22    /* QB    */
1655 #define IOPW_QP                 0x24    /* QP    */
1656 #define IOPW_IX                 0x26    /* IX    */
1657 #define IOPW_SP                 0x28    /* SP    */
1658 #define IOPW_PC                 0x2A    /* PC    */
1659 #define IOPW_RES_ADDR_2C        0x2C
1660 #define IOPW_RES_ADDR_2E        0x2E
1661 #define IOPW_SCSI_DATA          0x30    /* SD    */
1662 #define IOPW_SCSI_DATA_HSHK     0x32    /* SDH   */
1663 #define IOPW_SCSI_CTRL          0x34    /* SC    */
1664 #define IOPW_HSHK_CFG           0x36    /* HCFG  */
1665 #define IOPW_SXFR_STATUS        0x36    /* SXS   */
1666 #define IOPW_SXFR_CNTL          0x38    /* SXL   */
1667 #define IOPW_SXFR_CNTH          0x3A    /* SXH   */
1668 #define IOPW_RES_ADDR_3C        0x3C
1669 #define IOPW_RFIFO_DATA         0x3E    /* RFD   */
1670
1671 /*
1672  * Doubleword I/O register address from base of 'iop_base'.
1673  */
1674 #define IOPDW_RES_ADDR_0         0x00
1675 #define IOPDW_RAM_DATA           0x04
1676 #define IOPDW_RES_ADDR_8         0x08
1677 #define IOPDW_RES_ADDR_C         0x0C
1678 #define IOPDW_RES_ADDR_10        0x10
1679 #define IOPDW_COMMA              0x14
1680 #define IOPDW_COMMB              0x18
1681 #define IOPDW_RES_ADDR_1C        0x1C
1682 #define IOPDW_SDMA_ADDR0         0x20
1683 #define IOPDW_SDMA_ADDR1         0x24
1684 #define IOPDW_SDMA_COUNT         0x28
1685 #define IOPDW_SDMA_ERROR         0x2C
1686 #define IOPDW_RDMA_ADDR0         0x30
1687 #define IOPDW_RDMA_ADDR1         0x34
1688 #define IOPDW_RDMA_COUNT         0x38
1689 #define IOPDW_RDMA_ERROR         0x3C
1690
1691 #define ADV_CHIP_ID_BYTE         0x25
1692 #define ADV_CHIP_ID_WORD         0x04C1
1693
1694 #define ADV_SC_SCSI_BUS_RESET    0x2000
1695
1696 #define ADV_INTR_ENABLE_HOST_INTR                   0x01
1697 #define ADV_INTR_ENABLE_SEL_INTR                    0x02
1698 #define ADV_INTR_ENABLE_DPR_INTR                    0x04
1699 #define ADV_INTR_ENABLE_RTA_INTR                    0x08
1700 #define ADV_INTR_ENABLE_RMA_INTR                    0x10
1701 #define ADV_INTR_ENABLE_RST_INTR                    0x20
1702 #define ADV_INTR_ENABLE_DPE_INTR                    0x40
1703 #define ADV_INTR_ENABLE_GLOBAL_INTR                 0x80
1704
1705 #define ADV_INTR_STATUS_INTRA            0x01
1706 #define ADV_INTR_STATUS_INTRB            0x02
1707 #define ADV_INTR_STATUS_INTRC            0x04
1708
1709 #define ADV_RISC_CSR_STOP           (0x0000)
1710 #define ADV_RISC_TEST_COND          (0x2000)
1711 #define ADV_RISC_CSR_RUN            (0x4000)
1712 #define ADV_RISC_CSR_SINGLE_STEP    (0x8000)
1713
1714 #define ADV_CTRL_REG_HOST_INTR      0x0100
1715 #define ADV_CTRL_REG_SEL_INTR       0x0200
1716 #define ADV_CTRL_REG_DPR_INTR       0x0400
1717 #define ADV_CTRL_REG_RTA_INTR       0x0800
1718 #define ADV_CTRL_REG_RMA_INTR       0x1000
1719 #define ADV_CTRL_REG_RES_BIT14      0x2000
1720 #define ADV_CTRL_REG_DPE_INTR       0x4000
1721 #define ADV_CTRL_REG_POWER_DONE     0x8000
1722 #define ADV_CTRL_REG_ANY_INTR       0xFF00
1723
1724 #define ADV_CTRL_REG_CMD_RESET             0x00C6
1725 #define ADV_CTRL_REG_CMD_WR_IO_REG         0x00C5
1726 #define ADV_CTRL_REG_CMD_RD_IO_REG         0x00C4
1727 #define ADV_CTRL_REG_CMD_WR_PCI_CFG_SPACE  0x00C3
1728 #define ADV_CTRL_REG_CMD_RD_PCI_CFG_SPACE  0x00C2
1729
1730 #define ADV_TICKLE_NOP                      0x00
1731 #define ADV_TICKLE_A                        0x01
1732 #define ADV_TICKLE_B                        0x02
1733 #define ADV_TICKLE_C                        0x03
1734
1735 #define ADV_SCSI_CTRL_RSTOUT        0x2000
1736
1737 #define AdvIsIntPending(port) \
1738     (AdvReadWordRegister(port, IOPW_CTRL_REG) & ADV_CTRL_REG_HOST_INTR)
1739
1740 /*
1741  * SCSI_CFG0 Register bit definitions
1742  */
1743 #define TIMER_MODEAB    0xC000  /* Watchdog, Second, and Select. Timer Ctrl. */
1744 #define PARITY_EN       0x2000  /* Enable SCSI Parity Error detection */
1745 #define EVEN_PARITY     0x1000  /* Select Even Parity */
1746 #define WD_LONG         0x0800  /* Watchdog Interval, 1: 57 min, 0: 13 sec */
1747 #define QUEUE_128       0x0400  /* Queue Size, 1: 128 byte, 0: 64 byte */
1748 #define PRIM_MODE       0x0100  /* Primitive SCSI mode */
1749 #define SCAM_EN         0x0080  /* Enable SCAM selection */
1750 #define SEL_TMO_LONG    0x0040  /* Sel/Resel Timeout, 1: 400 ms, 0: 1.6 ms */
1751 #define CFRM_ID         0x0020  /* SCAM id sel. confirm., 1: fast, 0: 6.4 ms */
1752 #define OUR_ID_EN       0x0010  /* Enable OUR_ID bits */
1753 #define OUR_ID          0x000F  /* SCSI ID */
1754
1755 /*
1756  * SCSI_CFG1 Register bit definitions
1757  */
1758 #define BIG_ENDIAN      0x8000  /* Enable Big Endian Mode MIO:15, EEP:15 */
1759 #define TERM_POL        0x2000  /* Terminator Polarity Ctrl. MIO:13, EEP:13 */
1760 #define SLEW_RATE       0x1000  /* SCSI output buffer slew rate */
1761 #define FILTER_SEL      0x0C00  /* Filter Period Selection */
1762 #define  FLTR_DISABLE    0x0000 /* Input Filtering Disabled */
1763 #define  FLTR_11_TO_20NS 0x0800 /* Input Filtering 11ns to 20ns */
1764 #define  FLTR_21_TO_39NS 0x0C00 /* Input Filtering 21ns to 39ns */
1765 #define ACTIVE_DBL      0x0200  /* Disable Active Negation */
1766 #define DIFF_MODE       0x0100  /* SCSI differential Mode (Read-Only) */
1767 #define DIFF_SENSE      0x0080  /* 1: No SE cables, 0: SE cable (Read-Only) */
1768 #define TERM_CTL_SEL    0x0040  /* Enable TERM_CTL_H and TERM_CTL_L */
1769 #define TERM_CTL        0x0030  /* External SCSI Termination Bits */
1770 #define  TERM_CTL_H      0x0020 /* Enable External SCSI Upper Termination */
1771 #define  TERM_CTL_L      0x0010 /* Enable External SCSI Lower Termination */
1772 #define CABLE_DETECT    0x000F  /* External SCSI Cable Connection Status */
1773
1774 /*
1775  * Addendum for ASC-38C0800 Chip
1776  *
1777  * The ASC-38C1600 Chip uses the same definitions except that the
1778  * bus mode override bits [12:10] have been moved to byte register
1779  * offset 0xE (IOPB_SOFT_OVER_WR) bits [12:10]. The [12:10] bits in
1780  * SCSI_CFG1 are read-only and always available. Bit 14 (DIS_TERM_DRV)
1781  * is not needed. The [12:10] bits in IOPB_SOFT_OVER_WR are write-only.
1782  * Also each ASC-38C1600 function or channel uses only cable bits [5:4]
1783  * and [1:0]. Bits [14], [7:6], [3:2] are unused.
1784  */
1785 #define DIS_TERM_DRV    0x4000  /* 1: Read c_det[3:0], 0: cannot read */
1786 #define HVD_LVD_SE      0x1C00  /* Device Detect Bits */
1787 #define  HVD             0x1000 /* HVD Device Detect */
1788 #define  LVD             0x0800 /* LVD Device Detect */
1789 #define  SE              0x0400 /* SE Device Detect */
1790 #define TERM_LVD        0x00C0  /* LVD Termination Bits */
1791 #define  TERM_LVD_HI     0x0080 /* Enable LVD Upper Termination */
1792 #define  TERM_LVD_LO     0x0040 /* Enable LVD Lower Termination */
1793 #define TERM_SE         0x0030  /* SE Termination Bits */
1794 #define  TERM_SE_HI      0x0020 /* Enable SE Upper Termination */
1795 #define  TERM_SE_LO      0x0010 /* Enable SE Lower Termination */
1796 #define C_DET_LVD       0x000C  /* LVD Cable Detect Bits */
1797 #define  C_DET3          0x0008 /* Cable Detect for LVD External Wide */
1798 #define  C_DET2          0x0004 /* Cable Detect for LVD Internal Wide */
1799 #define C_DET_SE        0x0003  /* SE Cable Detect Bits */
1800 #define  C_DET1          0x0002 /* Cable Detect for SE Internal Wide */
1801 #define  C_DET0          0x0001 /* Cable Detect for SE Internal Narrow */
1802
1803 #define CABLE_ILLEGAL_A 0x7
1804     /* x 0 0 0  | on  on | Illegal (all 3 connectors are used) */
1805
1806 #define CABLE_ILLEGAL_B 0xB
1807     /* 0 x 0 0  | on  on | Illegal (all 3 connectors are used) */
1808
1809 /*
1810  * MEM_CFG Register bit definitions
1811  */
1812 #define BIOS_EN         0x40    /* BIOS Enable MIO:14,EEP:14 */
1813 #define FAST_EE_CLK     0x20    /* Diagnostic Bit */
1814 #define RAM_SZ          0x1C    /* Specify size of RAM to RISC */
1815 #define  RAM_SZ_2KB      0x00   /* 2 KB */
1816 #define  RAM_SZ_4KB      0x04   /* 4 KB */
1817 #define  RAM_SZ_8KB      0x08   /* 8 KB */
1818 #define  RAM_SZ_16KB     0x0C   /* 16 KB */
1819 #define  RAM_SZ_32KB     0x10   /* 32 KB */
1820 #define  RAM_SZ_64KB     0x14   /* 64 KB */
1821
1822 /*
1823  * DMA_CFG0 Register bit definitions
1824  *
1825  * This register is only accessible to the host.
1826  */
1827 #define BC_THRESH_ENB   0x80    /* PCI DMA Start Conditions */
1828 #define FIFO_THRESH     0x70    /* PCI DMA FIFO Threshold */
1829 #define  FIFO_THRESH_16B  0x00  /* 16 bytes */
1830 #define  FIFO_THRESH_32B  0x20  /* 32 bytes */
1831 #define  FIFO_THRESH_48B  0x30  /* 48 bytes */
1832 #define  FIFO_THRESH_64B  0x40  /* 64 bytes */
1833 #define  FIFO_THRESH_80B  0x50  /* 80 bytes (default) */
1834 #define  FIFO_THRESH_96B  0x60  /* 96 bytes */
1835 #define  FIFO_THRESH_112B 0x70  /* 112 bytes */
1836 #define START_CTL       0x0C    /* DMA start conditions */
1837 #define  START_CTL_TH    0x00   /* Wait threshold level (default) */
1838 #define  START_CTL_ID    0x04   /* Wait SDMA/SBUS idle */
1839 #define  START_CTL_THID  0x08   /* Wait threshold and SDMA/SBUS idle */
1840 #define  START_CTL_EMFU  0x0C   /* Wait SDMA FIFO empty/full */
1841 #define READ_CMD        0x03    /* Memory Read Method */
1842 #define  READ_CMD_MR     0x00   /* Memory Read */
1843 #define  READ_CMD_MRL    0x02   /* Memory Read Long */
1844 #define  READ_CMD_MRM    0x03   /* Memory Read Multiple (default) */
1845
1846 /*
1847  * ASC-38C0800 RAM BIST Register bit definitions
1848  */
1849 #define RAM_TEST_MODE         0x80
1850 #define PRE_TEST_MODE         0x40
1851 #define NORMAL_MODE           0x00
1852 #define RAM_TEST_DONE         0x10
1853 #define RAM_TEST_STATUS       0x0F
1854 #define  RAM_TEST_HOST_ERROR   0x08
1855 #define  RAM_TEST_INTRAM_ERROR 0x04
1856 #define  RAM_TEST_RISC_ERROR   0x02
1857 #define  RAM_TEST_SCSI_ERROR   0x01
1858 #define  RAM_TEST_SUCCESS      0x00
1859 #define PRE_TEST_VALUE        0x05
1860 #define NORMAL_VALUE          0x00
1861
1862 /*
1863  * ASC38C1600 Definitions
1864  *
1865  * IOPB_PCI_INT_CFG Bit Field Definitions
1866  */
1867
1868 #define INTAB_LD        0x80    /* Value loaded from EEPROM Bit 11. */
1869
1870 /*
1871  * Bit 1 can be set to change the interrupt for the Function to operate in
1872  * Totem Pole mode. By default Bit 1 is 0 and the interrupt operates in
1873  * Open Drain mode. Both functions of the ASC38C1600 must be set to the same
1874  * mode, otherwise the operating mode is undefined.
1875  */
1876 #define TOTEMPOLE       0x02
1877
1878 /*
1879  * Bit 0 can be used to change the Int Pin for the Function. The value is
1880  * 0 by default for both Functions with Function 0 using INT A and Function
1881  * B using INT B. For Function 0 if set, INT B is used. For Function 1 if set,
1882  * INT A is used.
1883  *
1884  * EEPROM Word 0 Bit 11 for each Function may change the initial Int Pin
1885  * value specified in the PCI Configuration Space.
1886  */
1887 #define INTAB           0x01
1888
1889 /* a_advlib.h */
1890
1891 /*
1892  * Adv Library Status Definitions
1893  */
1894 #define ADV_TRUE        1
1895 #define ADV_FALSE       0
1896 #define ADV_NOERROR     1
1897 #define ADV_SUCCESS     1
1898 #define ADV_BUSY        0
1899 #define ADV_ERROR       (-1)
1900
1901 /*
1902  * ADV_DVC_VAR 'warn_code' values
1903  */
1904 #define ASC_WARN_BUSRESET_ERROR         0x0001  /* SCSI Bus Reset error */
1905 #define ASC_WARN_EEPROM_CHKSUM          0x0002  /* EEP check sum error */
1906 #define ASC_WARN_EEPROM_TERMINATION     0x0004  /* EEP termination bad field */
1907 #define ASC_WARN_SET_PCI_CONFIG_SPACE   0x0080  /* PCI config space set error */
1908 #define ASC_WARN_ERROR                  0xFFFF  /* ADV_ERROR return */
1909
1910 #define ADV_MAX_TID                     15      /* max. target identifier */
1911 #define ADV_MAX_LUN                     7       /* max. logical unit number */
1912
1913 /*
1914  * Error code values are set in ADV_DVC_VAR 'err_code'.
1915  */
1916 #define ASC_IERR_WRITE_EEPROM       0x0001      /* write EEPROM error */
1917 #define ASC_IERR_MCODE_CHKSUM       0x0002      /* micro code check sum error */
1918 #define ASC_IERR_NO_CARRIER         0x0004      /* No more carrier memory. */
1919 #define ASC_IERR_START_STOP_CHIP    0x0008      /* start/stop chip failed */
1920 #define ASC_IERR_CHIP_VERSION       0x0040      /* wrong chip version */
1921 #define ASC_IERR_SET_SCSI_ID        0x0080      /* set SCSI ID failed */
1922 #define ASC_IERR_HVD_DEVICE         0x0100      /* HVD attached to LVD connector. */
1923 #define ASC_IERR_BAD_SIGNATURE      0x0200      /* signature not found */
1924 #define ASC_IERR_ILLEGAL_CONNECTION 0x0400      /* Illegal cable connection */
1925 #define ASC_IERR_SINGLE_END_DEVICE  0x0800      /* Single-end used w/differential */
1926 #define ASC_IERR_REVERSED_CABLE     0x1000      /* Narrow flat cable reversed */
1927 #define ASC_IERR_BIST_PRE_TEST      0x2000      /* BIST pre-test error */
1928 #define ASC_IERR_BIST_RAM_TEST      0x4000      /* BIST RAM test error */
1929 #define ASC_IERR_BAD_CHIPTYPE       0x8000      /* Invalid 'chip_type' setting. */
1930
1931 /*
1932  * Fixed locations of microcode operating variables.
1933  */
1934 #define ASC_MC_CODE_BEGIN_ADDR          0x0028  /* microcode start address */
1935 #define ASC_MC_CODE_END_ADDR            0x002A  /* microcode end address */
1936 #define ASC_MC_CODE_CHK_SUM             0x002C  /* microcode code checksum */
1937 #define ASC_MC_VERSION_DATE             0x0038  /* microcode version */
1938 #define ASC_MC_VERSION_NUM              0x003A  /* microcode number */
1939 #define ASC_MC_BIOSMEM                  0x0040  /* BIOS RISC Memory Start */
1940 #define ASC_MC_BIOSLEN                  0x0050  /* BIOS RISC Memory Length */
1941 #define ASC_MC_BIOS_SIGNATURE           0x0058  /* BIOS Signature 0x55AA */
1942 #define ASC_MC_BIOS_VERSION             0x005A  /* BIOS Version (2 bytes) */
1943 #define ASC_MC_SDTR_SPEED1              0x0090  /* SDTR Speed for TID 0-3 */
1944 #define ASC_MC_SDTR_SPEED2              0x0092  /* SDTR Speed for TID 4-7 */
1945 #define ASC_MC_SDTR_SPEED3              0x0094  /* SDTR Speed for TID 8-11 */
1946 #define ASC_MC_SDTR_SPEED4              0x0096  /* SDTR Speed for TID 12-15 */
1947 #define ASC_MC_CHIP_TYPE                0x009A
1948 #define ASC_MC_INTRB_CODE               0x009B
1949 #define ASC_MC_WDTR_ABLE                0x009C
1950 #define ASC_MC_SDTR_ABLE                0x009E
1951 #define ASC_MC_TAGQNG_ABLE              0x00A0
1952 #define ASC_MC_DISC_ENABLE              0x00A2
1953 #define ASC_MC_IDLE_CMD_STATUS          0x00A4
1954 #define ASC_MC_IDLE_CMD                 0x00A6
1955 #define ASC_MC_IDLE_CMD_PARAMETER       0x00A8
1956 #define ASC_MC_DEFAULT_SCSI_CFG0        0x00AC
1957 #define ASC_MC_DEFAULT_SCSI_CFG1        0x00AE
1958 #define ASC_MC_DEFAULT_MEM_CFG          0x00B0
1959 #define ASC_MC_DEFAULT_SEL_MASK         0x00B2
1960 #define ASC_MC_SDTR_DONE                0x00B6
1961 #define ASC_MC_NUMBER_OF_QUEUED_CMD     0x00C0
1962 #define ASC_MC_NUMBER_OF_MAX_CMD        0x00D0
1963 #define ASC_MC_DEVICE_HSHK_CFG_TABLE    0x0100
1964 #define ASC_MC_CONTROL_FLAG             0x0122  /* Microcode control flag. */
1965 #define ASC_MC_WDTR_DONE                0x0124
1966 #define ASC_MC_CAM_MODE_MASK            0x015E  /* CAM mode TID bitmask. */
1967 #define ASC_MC_ICQ                      0x0160
1968 #define ASC_MC_IRQ                      0x0164
1969 #define ASC_MC_PPR_ABLE                 0x017A
1970
1971 /*
1972  * BIOS LRAM variable absolute offsets.
1973  */
1974 #define BIOS_CODESEG    0x54
1975 #define BIOS_CODELEN    0x56
1976 #define BIOS_SIGNATURE  0x58
1977 #define BIOS_VERSION    0x5A
1978
1979 /*
1980  * Microcode Control Flags
1981  *
1982  * Flags set by the Adv Library in RISC variable 'control_flag' (0x122)
1983  * and handled by the microcode.
1984  */
1985 #define CONTROL_FLAG_IGNORE_PERR        0x0001  /* Ignore DMA Parity Errors */
1986 #define CONTROL_FLAG_ENABLE_AIPP        0x0002  /* Enabled AIPP checking. */
1987
1988 /*
1989  * ASC_MC_DEVICE_HSHK_CFG_TABLE microcode table or HSHK_CFG register format
1990  */
1991 #define HSHK_CFG_WIDE_XFR       0x8000
1992 #define HSHK_CFG_RATE           0x0F00
1993 #define HSHK_CFG_OFFSET         0x001F
1994
1995 #define ASC_DEF_MAX_HOST_QNG    0xFD    /* Max. number of host commands (253) */
1996 #define ASC_DEF_MIN_HOST_QNG    0x10    /* Min. number of host commands (16) */
1997 #define ASC_DEF_MAX_DVC_QNG     0x3F    /* Max. number commands per device (63) */
1998 #define ASC_DEF_MIN_DVC_QNG     0x04    /* Min. number commands per device (4) */
1999
2000 #define ASC_QC_DATA_CHECK  0x01 /* Require ASC_QC_DATA_OUT set or clear. */
2001 #define ASC_QC_DATA_OUT    0x02 /* Data out DMA transfer. */
2002 #define ASC_QC_START_MOTOR 0x04 /* Send auto-start motor before request. */
2003 #define ASC_QC_NO_OVERRUN  0x08 /* Don't report overrun. */
2004 #define ASC_QC_FREEZE_TIDQ 0x10 /* Freeze TID queue after request. XXX TBD */
2005
2006 #define ASC_QSC_NO_DISC     0x01        /* Don't allow disconnect for request. */
2007 #define ASC_QSC_NO_TAGMSG   0x02        /* Don't allow tag queuing for request. */
2008 #define ASC_QSC_NO_SYNC     0x04        /* Don't use Synch. transfer on request. */
2009 #define ASC_QSC_NO_WIDE     0x08        /* Don't use Wide transfer on request. */
2010 #define ASC_QSC_REDO_DTR    0x10        /* Renegotiate WDTR/SDTR before request. */
2011 /*
2012  * Note: If a Tag Message is to be sent and neither ASC_QSC_HEAD_TAG or
2013  * ASC_QSC_ORDERED_TAG is set, then a Simple Tag Message (0x20) is used.
2014  */
2015 #define ASC_QSC_HEAD_TAG    0x40        /* Use Head Tag Message (0x21). */
2016 #define ASC_QSC_ORDERED_TAG 0x80        /* Use Ordered Tag Message (0x22). */
2017
2018 /*
2019  * All fields here are accessed by the board microcode and need to be
2020  * little-endian.
2021  */
2022 typedef struct adv_carr_t {
2023         ADV_VADDR carr_va;      /* Carrier Virtual Address */
2024         ADV_PADDR carr_pa;      /* Carrier Physical Address */
2025         ADV_VADDR areq_vpa;     /* ASC_SCSI_REQ_Q Virtual or Physical Address */
2026         /*
2027          * next_vpa [31:4]            Carrier Virtual or Physical Next Pointer
2028          *
2029          * next_vpa [3:1]             Reserved Bits
2030          * next_vpa [0]               Done Flag set in Response Queue.
2031          */
2032         ADV_VADDR next_vpa;
2033 } ADV_CARR_T;
2034
2035 /*
2036  * Mask used to eliminate low 4 bits of carrier 'next_vpa' field.
2037  */
2038 #define ASC_NEXT_VPA_MASK       0xFFFFFFF0
2039
2040 #define ASC_RQ_DONE             0x00000001
2041 #define ASC_RQ_GOOD             0x00000002
2042 #define ASC_CQ_STOPPER          0x00000000
2043
2044 #define ASC_GET_CARRP(carrp) ((carrp) & ASC_NEXT_VPA_MASK)
2045
2046 #define ADV_CARRIER_NUM_PAGE_CROSSING \
2047     (((ADV_CARRIER_COUNT * sizeof(ADV_CARR_T)) + \
2048         (ADV_PAGE_SIZE - 1))/ADV_PAGE_SIZE)
2049
2050 #define ADV_CARRIER_BUFSIZE \
2051     ((ADV_CARRIER_COUNT + ADV_CARRIER_NUM_PAGE_CROSSING) * sizeof(ADV_CARR_T))
2052
2053 /*
2054  * ASC_SCSI_REQ_Q 'a_flag' definitions
2055  *
2056  * The Adv Library should limit use to the lower nibble (4 bits) of
2057  * a_flag. Drivers are free to use the upper nibble (4 bits) of a_flag.
2058  */
2059 #define ADV_POLL_REQUEST                0x01    /* poll for request completion */
2060 #define ADV_SCSIQ_DONE                  0x02    /* request done */
2061 #define ADV_DONT_RETRY                  0x08    /* don't do retry */
2062
2063 #define ADV_CHIP_ASC3550          0x01  /* Ultra-Wide IC */
2064 #define ADV_CHIP_ASC38C0800       0x02  /* Ultra2-Wide/LVD IC */
2065 #define ADV_CHIP_ASC38C1600       0x03  /* Ultra3-Wide/LVD2 IC */
2066
2067 /*
2068  * Adapter temporary configuration structure
2069  *
2070  * This structure can be discarded after initialization. Don't add
2071  * fields here needed after initialization.
2072  *
2073  * Field naming convention:
2074  *
2075  *  *_enable indicates the field enables or disables a feature. The
2076  *  value of the field is never reset.
2077  */
2078 typedef struct adv_dvc_cfg {
2079         ushort disc_enable;     /* enable disconnection */
2080         uchar chip_version;     /* chip version */
2081         uchar termination;      /* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */
2082         ushort lib_version;     /* Adv Library version number */
2083         ushort control_flag;    /* Microcode Control Flag */
2084         ushort mcode_date;      /* Microcode date */
2085         ushort mcode_version;   /* Microcode version */
2086         ushort serial1;         /* EEPROM serial number word 1 */
2087         ushort serial2;         /* EEPROM serial number word 2 */
2088         ushort serial3;         /* EEPROM serial number word 3 */
2089 } ADV_DVC_CFG;
2090
2091 struct adv_dvc_var;
2092 struct adv_scsi_req_q;
2093
2094 /*
2095  * Adapter operation variable structure.
2096  *
2097  * One structure is required per host adapter.
2098  *
2099  * Field naming convention:
2100  *
2101  *  *_able indicates both whether a feature should be enabled or disabled
2102  *  and whether a device isi capable of the feature. At initialization
2103  *  this field may be set, but later if a device is found to be incapable
2104  *  of the feature, the field is cleared.
2105  */
2106 typedef struct adv_dvc_var {
2107         AdvPortAddr iop_base;   /* I/O port address */
2108         ushort err_code;        /* fatal error code */
2109         ushort bios_ctrl;       /* BIOS control word, EEPROM word 12 */
2110         ushort wdtr_able;       /* try WDTR for a device */
2111         ushort sdtr_able;       /* try SDTR for a device */
2112         ushort ultra_able;      /* try SDTR Ultra speed for a device */
2113         ushort sdtr_speed1;     /* EEPROM SDTR Speed for TID 0-3   */
2114         ushort sdtr_speed2;     /* EEPROM SDTR Speed for TID 4-7   */
2115         ushort sdtr_speed3;     /* EEPROM SDTR Speed for TID 8-11  */
2116         ushort sdtr_speed4;     /* EEPROM SDTR Speed for TID 12-15 */
2117         ushort tagqng_able;     /* try tagged queuing with a device */
2118         ushort ppr_able;        /* PPR message capable per TID bitmask. */
2119         uchar max_dvc_qng;      /* maximum number of tagged commands per device */
2120         ushort start_motor;     /* start motor command allowed */
2121         uchar scsi_reset_wait;  /* delay in seconds after scsi bus reset */
2122         uchar chip_no;          /* should be assigned by caller */
2123         uchar max_host_qng;     /* maximum number of Q'ed command allowed */
2124         uchar irq_no;           /* IRQ number */
2125         ushort no_scam;         /* scam_tolerant of EEPROM */
2126         struct asc_board *drv_ptr;      /* driver pointer to private structure */
2127         uchar chip_scsi_id;     /* chip SCSI target ID */
2128         uchar chip_type;
2129         uchar bist_err_code;
2130         ADV_CARR_T *carrier_buf;
2131         ADV_CARR_T *carr_freelist;      /* Carrier free list. */
2132         ADV_CARR_T *icq_sp;     /* Initiator command queue stopper pointer. */
2133         ADV_CARR_T *irq_sp;     /* Initiator response queue stopper pointer. */
2134         ushort carr_pending_cnt;        /* Count of pending carriers. */
2135         /*
2136          * Note: The following fields will not be used after initialization. The
2137          * driver may discard the buffer after initialization is done.
2138          */
2139         ADV_DVC_CFG *cfg;       /* temporary configuration structure  */
2140 } ADV_DVC_VAR;
2141
2142 #define NO_OF_SG_PER_BLOCK              15
2143
2144 typedef struct asc_sg_block {
2145         uchar reserved1;
2146         uchar reserved2;
2147         uchar reserved3;
2148         uchar sg_cnt;           /* Valid entries in block. */
2149         ADV_PADDR sg_ptr;       /* Pointer to next sg block. */
2150         struct {
2151                 ADV_PADDR sg_addr;      /* SG element address. */
2152                 ADV_DCNT sg_count;      /* SG element count. */
2153         } sg_list[NO_OF_SG_PER_BLOCK];
2154 } ADV_SG_BLOCK;
2155
2156 /*
2157  * ADV_SCSI_REQ_Q - microcode request structure
2158  *
2159  * All fields in this structure up to byte 60 are used by the microcode.
2160  * The microcode makes assumptions about the size and ordering of fields
2161  * in this structure. Do not change the structure definition here without
2162  * coordinating the change with the microcode.
2163  *
2164  * All fields accessed by microcode must be maintained in little_endian
2165  * order.
2166  */
2167 typedef struct adv_scsi_req_q {
2168         uchar cntl;             /* Ucode flags and state (ASC_MC_QC_*). */
2169         uchar target_cmd;
2170         uchar target_id;        /* Device target identifier. */
2171         uchar target_lun;       /* Device target logical unit number. */
2172         ADV_PADDR data_addr;    /* Data buffer physical address. */
2173         ADV_DCNT data_cnt;      /* Data count. Ucode sets to residual. */
2174         ADV_PADDR sense_addr;
2175         ADV_PADDR carr_pa;
2176         uchar mflag;
2177         uchar sense_len;
2178         uchar cdb_len;          /* SCSI CDB length. Must <= 16 bytes. */
2179         uchar scsi_cntl;
2180         uchar done_status;      /* Completion status. */
2181         uchar scsi_status;      /* SCSI status byte. */
2182         uchar host_status;      /* Ucode host status. */
2183         uchar sg_working_ix;
2184         uchar cdb[12];          /* SCSI CDB bytes 0-11. */
2185         ADV_PADDR sg_real_addr; /* SG list physical address. */
2186         ADV_PADDR scsiq_rptr;
2187         uchar cdb16[4];         /* SCSI CDB bytes 12-15. */
2188         ADV_VADDR scsiq_ptr;
2189         ADV_VADDR carr_va;
2190         /*
2191          * End of microcode structure - 60 bytes. The rest of the structure
2192          * is used by the Adv Library and ignored by the microcode.
2193          */
2194         ADV_VADDR srb_ptr;
2195         ADV_SG_BLOCK *sg_list_ptr;      /* SG list virtual address. */
2196         char *vdata_addr;       /* Data buffer virtual address. */
2197         uchar a_flag;
2198         uchar pad[2];           /* Pad out to a word boundary. */
2199 } ADV_SCSI_REQ_Q;
2200
2201 /*
2202  * Microcode idle loop commands
2203  */
2204 #define IDLE_CMD_COMPLETED           0
2205 #define IDLE_CMD_STOP_CHIP           0x0001
2206 #define IDLE_CMD_STOP_CHIP_SEND_INT  0x0002
2207 #define IDLE_CMD_SEND_INT            0x0004
2208 #define IDLE_CMD_ABORT               0x0008
2209 #define IDLE_CMD_DEVICE_RESET        0x0010
2210 #define IDLE_CMD_SCSI_RESET_START    0x0020     /* Assert SCSI Bus Reset */
2211 #define IDLE_CMD_SCSI_RESET_END      0x0040     /* Deassert SCSI Bus Reset */
2212 #define IDLE_CMD_SCSIREQ             0x0080
2213
2214 #define IDLE_CMD_STATUS_SUCCESS      0x0001
2215 #define IDLE_CMD_STATUS_FAILURE      0x0002
2216
2217 /*
2218  * AdvSendIdleCmd() flag definitions.
2219  */
2220 #define ADV_NOWAIT     0x01
2221
2222 /*
2223  * Wait loop time out values.
2224  */
2225 #define SCSI_WAIT_10_SEC             10UL       /* 10 seconds */
2226 #define SCSI_WAIT_100_MSEC           100UL      /* 100 milliseconds */
2227 #define SCSI_US_PER_MSEC             1000       /* microseconds per millisecond */
2228 #define SCSI_MS_PER_SEC              1000UL     /* milliseconds per second */
2229 #define SCSI_MAX_RETRY               10 /* retry count */
2230
2231 #define ADV_ASYNC_RDMA_FAILURE          0x01    /* Fatal RDMA failure. */
2232 #define ADV_ASYNC_SCSI_BUS_RESET_DET    0x02    /* Detected SCSI Bus Reset. */
2233 #define ADV_ASYNC_CARRIER_READY_FAILURE 0x03    /* Carrier Ready failure. */
2234 #define ADV_RDMA_IN_CARR_AND_Q_INVALID  0x04    /* RDMAed-in data invalid. */
2235
2236 #define ADV_HOST_SCSI_BUS_RESET      0x80       /* Host Initiated SCSI Bus Reset. */
2237
2238 /*
2239  * Device drivers must define the following functions.
2240  */
2241 static inline ulong DvcEnterCritical(void);
2242 static inline void DvcLeaveCritical(ulong);
2243 static void DvcSleepMilliSecond(ADV_DCNT);
2244 static ADV_PADDR DvcGetPhyAddr(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *,
2245                                uchar *, ASC_SDCNT *, int);
2246 static void DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
2247
2248 /*
2249  * Adv Library functions available to drivers.
2250  */
2251 static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
2252 static int AdvISR(ADV_DVC_VAR *);
2253 static int AdvInitAsc3550Driver(ADV_DVC_VAR *);
2254 static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
2255 static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
2256 static int AdvResetChipAndSB(ADV_DVC_VAR *);
2257 static int AdvResetSB(ADV_DVC_VAR *asc_dvc);
2258
2259 /*
2260  * Internal Adv Library functions.
2261  */
2262 static int AdvSendIdleCmd(ADV_DVC_VAR *, ushort, ADV_DCNT);
2263 static int AdvInitFrom3550EEP(ADV_DVC_VAR *);
2264 static int AdvInitFrom38C0800EEP(ADV_DVC_VAR *);
2265 static int AdvInitFrom38C1600EEP(ADV_DVC_VAR *);
2266 static ushort AdvGet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
2267 static void AdvSet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
2268 static ushort AdvGet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
2269 static void AdvSet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
2270 static ushort AdvGet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
2271 static void AdvSet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
2272 static void AdvWaitEEPCmd(AdvPortAddr);
2273 static ushort AdvReadEEPWord(AdvPortAddr, int);
2274
2275 /* Read byte from a register. */
2276 #define AdvReadByteRegister(iop_base, reg_off) \
2277      (ADV_MEM_READB((iop_base) + (reg_off)))
2278
2279 /* Write byte to a register. */
2280 #define AdvWriteByteRegister(iop_base, reg_off, byte) \
2281      (ADV_MEM_WRITEB((iop_base) + (reg_off), (byte)))
2282
2283 /* Read word (2 bytes) from a register. */
2284 #define AdvReadWordRegister(iop_base, reg_off) \
2285      (ADV_MEM_READW((iop_base) + (reg_off)))
2286
2287 /* Write word (2 bytes) to a register. */
2288 #define AdvWriteWordRegister(iop_base, reg_off, word) \
2289      (ADV_MEM_WRITEW((iop_base) + (reg_off), (word)))
2290
2291 /* Write dword (4 bytes) to a register. */
2292 #define AdvWriteDWordRegister(iop_base, reg_off, dword) \
2293      (ADV_MEM_WRITEDW((iop_base) + (reg_off), (dword)))
2294
2295 /* Read byte from LRAM. */
2296 #define AdvReadByteLram(iop_base, addr, byte) \
2297 do { \
2298     ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); \
2299     (byte) = ADV_MEM_READB((iop_base) + IOPB_RAM_DATA); \
2300 } while (0)
2301
2302 /* Write byte to LRAM. */
2303 #define AdvWriteByteLram(iop_base, addr, byte) \
2304     (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2305      ADV_MEM_WRITEB((iop_base) + IOPB_RAM_DATA, (byte)))
2306
2307 /* Read word (2 bytes) from LRAM. */
2308 #define AdvReadWordLram(iop_base, addr, word) \
2309 do { \
2310     ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); \
2311     (word) = (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA)); \
2312 } while (0)
2313
2314 /* Write word (2 bytes) to LRAM. */
2315 #define AdvWriteWordLram(iop_base, addr, word) \
2316     (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2317      ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
2318
2319 /* Write little-endian double word (4 bytes) to LRAM */
2320 /* Because of unspecified C language ordering don't use auto-increment. */
2321 #define AdvWriteDWordLramNoSwap(iop_base, addr, dword) \
2322     ((ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2323       ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, \
2324                      cpu_to_le16((ushort) ((dword) & 0xFFFF)))), \
2325      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr) + 2), \
2326       ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, \
2327                      cpu_to_le16((ushort) ((dword >> 16) & 0xFFFF)))))
2328
2329 /* Read word (2 bytes) from LRAM assuming that the address is already set. */
2330 #define AdvReadWordAutoIncLram(iop_base) \
2331      (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA))
2332
2333 /* Write word (2 bytes) to LRAM assuming that the address is already set. */
2334 #define AdvWriteWordAutoIncLram(iop_base, word) \
2335      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
2336
2337 /*
2338  * Define macro to check for Condor signature.
2339  *
2340  * Evaluate to ADV_TRUE if a Condor chip is found the specified port
2341  * address 'iop_base'. Otherwise evalue to ADV_FALSE.
2342  */
2343 #define AdvFindSignature(iop_base) \
2344     (((AdvReadByteRegister((iop_base), IOPB_CHIP_ID_1) == \
2345     ADV_CHIP_ID_BYTE) && \
2346      (AdvReadWordRegister((iop_base), IOPW_CHIP_ID_0) == \
2347     ADV_CHIP_ID_WORD)) ?  ADV_TRUE : ADV_FALSE)
2348
2349 /*
2350  * Define macro to Return the version number of the chip at 'iop_base'.
2351  *
2352  * The second parameter 'bus_type' is currently unused.
2353  */
2354 #define AdvGetChipVersion(iop_base, bus_type) \
2355     AdvReadByteRegister((iop_base), IOPB_CHIP_TYPE_REV)
2356
2357 /*
2358  * Abort an SRB in the chip's RISC Memory. The 'srb_ptr' argument must
2359  * match the ASC_SCSI_REQ_Q 'srb_ptr' field.
2360  *
2361  * If the request has not yet been sent to the device it will simply be
2362  * aborted from RISC memory. If the request is disconnected it will be
2363  * aborted on reselection by sending an Abort Message to the target ID.
2364  *
2365  * Return value:
2366  *      ADV_TRUE(1) - Queue was successfully aborted.
2367  *      ADV_FALSE(0) - Queue was not found on the active queue list.
2368  */
2369 #define AdvAbortQueue(asc_dvc, scsiq) \
2370         AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_ABORT, \
2371                        (ADV_DCNT) (scsiq))
2372
2373 /*
2374  * Send a Bus Device Reset Message to the specified target ID.
2375  *
2376  * All outstanding commands will be purged if sending the
2377  * Bus Device Reset Message is successful.
2378  *
2379  * Return Value:
2380  *      ADV_TRUE(1) - All requests on the target are purged.
2381  *      ADV_FALSE(0) - Couldn't issue Bus Device Reset Message; Requests
2382  *                     are not purged.
2383  */
2384 #define AdvResetDevice(asc_dvc, target_id) \
2385         AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_DEVICE_RESET, \
2386                     (ADV_DCNT) (target_id))
2387
2388 /*
2389  * SCSI Wide Type definition.
2390  */
2391 #define ADV_SCSI_BIT_ID_TYPE   ushort
2392
2393 /*
2394  * AdvInitScsiTarget() 'cntl_flag' options.
2395  */
2396 #define ADV_SCAN_LUN           0x01
2397 #define ADV_CAPINFO_NOLUN      0x02
2398
2399 /*
2400  * Convert target id to target id bit mask.
2401  */
2402 #define ADV_TID_TO_TIDMASK(tid)   (0x01 << ((tid) & ADV_MAX_TID))
2403
2404 /*
2405  * ASC_SCSI_REQ_Q 'done_status' and 'host_status' return values.
2406  */
2407
2408 #define QD_NO_STATUS         0x00       /* Request not completed yet. */
2409 #define QD_NO_ERROR          0x01
2410 #define QD_ABORTED_BY_HOST   0x02
2411 #define QD_WITH_ERROR        0x04
2412
2413 #define QHSTA_NO_ERROR              0x00
2414 #define QHSTA_M_SEL_TIMEOUT         0x11
2415 #define QHSTA_M_DATA_OVER_RUN       0x12
2416 #define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
2417 #define QHSTA_M_QUEUE_ABORTED       0x15
2418 #define QHSTA_M_SXFR_SDMA_ERR       0x16        /* SXFR_STATUS SCSI DMA Error */
2419 #define QHSTA_M_SXFR_SXFR_PERR      0x17        /* SXFR_STATUS SCSI Bus Parity Error */
2420 #define QHSTA_M_RDMA_PERR           0x18        /* RISC PCI DMA parity error */
2421 #define QHSTA_M_SXFR_OFF_UFLW       0x19        /* SXFR_STATUS Offset Underflow */
2422 #define QHSTA_M_SXFR_OFF_OFLW       0x20        /* SXFR_STATUS Offset Overflow */
2423 #define QHSTA_M_SXFR_WD_TMO         0x21        /* SXFR_STATUS Watchdog Timeout */
2424 #define QHSTA_M_SXFR_DESELECTED     0x22        /* SXFR_STATUS Deselected */
2425 /* Note: QHSTA_M_SXFR_XFR_OFLW is identical to QHSTA_M_DATA_OVER_RUN. */
2426 #define QHSTA_M_SXFR_XFR_OFLW       0x12        /* SXFR_STATUS Transfer Overflow */
2427 #define QHSTA_M_SXFR_XFR_PH_ERR     0x24        /* SXFR_STATUS Transfer Phase Error */
2428 #define QHSTA_M_SXFR_UNKNOWN_ERROR  0x25        /* SXFR_STATUS Unknown Error */
2429 #define QHSTA_M_SCSI_BUS_RESET      0x30        /* Request aborted from SBR */
2430 #define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31       /* Request aborted from unsol. SBR */
2431 #define QHSTA_M_BUS_DEVICE_RESET    0x32        /* Request aborted from BDR */
2432 #define QHSTA_M_DIRECTION_ERR       0x35        /* Data Phase mismatch */
2433 #define QHSTA_M_DIRECTION_ERR_HUNG  0x36        /* Data Phase mismatch and bus hang */
2434 #define QHSTA_M_WTM_TIMEOUT         0x41
2435 #define QHSTA_M_BAD_CMPL_STATUS_IN  0x42
2436 #define QHSTA_M_NO_AUTO_REQ_SENSE   0x43
2437 #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
2438 #define QHSTA_M_INVALID_DEVICE      0x45        /* Bad target ID */
2439 #define QHSTA_M_FROZEN_TIDQ         0x46        /* TID Queue frozen. */
2440 #define QHSTA_M_SGBACKUP_ERROR      0x47        /* Scatter-Gather backup error */
2441
2442 /*
2443  * DvcGetPhyAddr() flag arguments
2444  */
2445 #define ADV_IS_SCSIQ_FLAG       0x01    /* 'addr' is ASC_SCSI_REQ_Q pointer */
2446 #define ADV_ASCGETSGLIST_VADDR  0x02    /* 'addr' is AscGetSGList() virtual addr */
2447 #define ADV_IS_SENSE_FLAG       0x04    /* 'addr' is sense virtual pointer */
2448 #define ADV_IS_DATA_FLAG        0x08    /* 'addr' is data virtual pointer */
2449 #define ADV_IS_SGLIST_FLAG      0x10    /* 'addr' is sglist virtual pointer */
2450 #define ADV_IS_CARRIER_FLAG     0x20    /* 'addr' is ADV_CARR_T pointer */
2451
2452 /* Return the address that is aligned at the next doubleword >= to 'addr'. */
2453 #define ADV_8BALIGN(addr)      (((ulong) (addr) + 0x7) & ~0x7)
2454 #define ADV_16BALIGN(addr)     (((ulong) (addr) + 0xF) & ~0xF)
2455 #define ADV_32BALIGN(addr)     (((ulong) (addr) + 0x1F) & ~0x1F)
2456
2457 /*
2458  * Total contiguous memory needed for driver SG blocks.
2459  *
2460  * ADV_MAX_SG_LIST must be defined by a driver. It is the maximum
2461  * number of scatter-gather elements the driver supports in a
2462  * single request.
2463  */
2464
2465 #define ADV_SG_LIST_MAX_BYTE_SIZE \
2466          (sizeof(ADV_SG_BLOCK) * \
2467           ((ADV_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK))
2468
2469 /*
2470  * --- Driver Constants and Macros
2471  */
2472
2473 /* Reference Scsi_Host hostdata */
2474 #define ASC_BOARDP(host) ((asc_board_t *) &((host)->hostdata))
2475
2476 /* asc_board_t flags */
2477 #define ASC_HOST_IN_RESET       0x01
2478 #define ASC_IS_WIDE_BOARD       0x04    /* AdvanSys Wide Board */
2479 #define ASC_SELECT_QUEUE_DEPTHS 0x08
2480
2481 #define ASC_NARROW_BOARD(boardp) (((boardp)->flags & ASC_IS_WIDE_BOARD) == 0)
2482 #define ASC_WIDE_BOARD(boardp)   ((boardp)->flags & ASC_IS_WIDE_BOARD)
2483
2484 #define NO_ISA_DMA              0xff    /* No ISA DMA Channel Used */
2485
2486 #define ASC_INFO_SIZE           128     /* advansys_info() line size */
2487
2488 #ifdef CONFIG_PROC_FS
2489 /* /proc/scsi/advansys/[0...] related definitions */
2490 #define ASC_PRTBUF_SIZE         2048
2491 #define ASC_PRTLINE_SIZE        160
2492
2493 #define ASC_PRT_NEXT() \
2494     if (cp) { \
2495         totlen += len; \
2496         leftlen -= len; \
2497         if (leftlen == 0) { \
2498             return totlen; \
2499         } \
2500         cp += len; \
2501     }
2502 #endif /* CONFIG_PROC_FS */
2503
2504 /* Asc Library return codes */
2505 #define ASC_TRUE        1
2506 #define ASC_FALSE       0
2507 #define ASC_NOERROR     1
2508 #define ASC_BUSY        0
2509 #define ASC_ERROR       (-1)
2510
2511 /* struct scsi_cmnd function return codes */
2512 #define STATUS_BYTE(byte)   (byte)
2513 #define MSG_BYTE(byte)      ((byte) << 8)
2514 #define HOST_BYTE(byte)     ((byte) << 16)
2515 #define DRIVER_BYTE(byte)   ((byte) << 24)
2516
2517 /*
2518  * The following definitions and macros are OS independent interfaces to
2519  * the queue functions:
2520  *  REQ - SCSI request structure
2521  *  REQP - pointer to SCSI request structure
2522  *  REQPTID(reqp) - reqp's target id
2523  *  REQPNEXT(reqp) - reqp's next pointer
2524  *  REQPNEXTP(reqp) - pointer to reqp's next pointer
2525  *  REQPTIME(reqp) - reqp's time stamp value
2526  *  REQTIMESTAMP() - system time stamp value
2527  */
2528 typedef struct scsi_cmnd REQ, *REQP;
2529 #define REQPNEXT(reqp)       ((REQP) ((reqp)->host_scribble))
2530 #define REQPNEXTP(reqp)      ((REQP *) &((reqp)->host_scribble))
2531 #define REQPTID(reqp)        ((reqp)->device->id)
2532 #define REQPTIME(reqp)       ((reqp)->SCp.this_residual)
2533 #define REQTIMESTAMP()       (jiffies)
2534
2535 #define REQTIMESTAT(function, ascq, reqp, tid) \
2536 { \
2537     /*
2538      * If the request time stamp is less than the system time stamp, then \
2539      * maybe the system time stamp wrapped. Set the request time to zero.\
2540      */ \
2541     if (REQPTIME(reqp) <= REQTIMESTAMP()) { \
2542         REQPTIME(reqp) = REQTIMESTAMP() - REQPTIME(reqp); \
2543     } else { \
2544         /* Indicate an error occurred with the assertion. */ \
2545         ASC_ASSERT(REQPTIME(reqp) <= REQTIMESTAMP()); \
2546         REQPTIME(reqp) = 0; \
2547     } \
2548     /* Handle first minimum time case without external initialization. */ \
2549     if (((ascq)->q_tot_cnt[tid] == 1) ||  \
2550         (REQPTIME(reqp) < (ascq)->q_min_tim[tid])) { \
2551             (ascq)->q_min_tim[tid] = REQPTIME(reqp); \
2552             ASC_DBG3(1, "%s: new q_min_tim[%d] %u\n", \
2553                 (function), (tid), (ascq)->q_min_tim[tid]); \
2554         } \
2555     if (REQPTIME(reqp) > (ascq)->q_max_tim[tid]) { \
2556         (ascq)->q_max_tim[tid] = REQPTIME(reqp); \
2557         ASC_DBG3(1, "%s: new q_max_tim[%d] %u\n", \
2558             (function), tid, (ascq)->q_max_tim[tid]); \
2559     } \
2560     (ascq)->q_tot_tim[tid] += REQPTIME(reqp); \
2561     /* Reset the time stamp field. */ \
2562     REQPTIME(reqp) = 0; \
2563 }
2564
2565 /* asc_enqueue() flags */
2566 #define ASC_FRONT       1
2567 #define ASC_BACK        2
2568
2569 /* asc_dequeue_list() argument */
2570 #define ASC_TID_ALL        (-1)
2571
2572 /* Return non-zero, if the queue is empty. */
2573 #define ASC_QUEUE_EMPTY(ascq)    ((ascq)->q_tidmask == 0)
2574
2575 #ifndef ADVANSYS_STATS
2576 #define ASC_STATS(shost, counter)
2577 #define ASC_STATS_ADD(shost, counter, count)
2578 #else /* ADVANSYS_STATS */
2579 #define ASC_STATS(shost, counter) \
2580     (ASC_BOARDP(shost)->asc_stats.counter++)
2581
2582 #define ASC_STATS_ADD(shost, counter, count) \
2583     (ASC_BOARDP(shost)->asc_stats.counter += (count))
2584 #endif /* ADVANSYS_STATS */
2585
2586 #define ASC_CEILING(val, unit) (((val) + ((unit) - 1))/(unit))
2587
2588 /* If the result wraps when calculating tenths, return 0. */
2589 #define ASC_TENTHS(num, den) \
2590     (((10 * ((num)/(den))) > (((num) * 10)/(den))) ? \
2591     0 : ((((num) * 10)/(den)) - (10 * ((num)/(den)))))
2592
2593 /*
2594  * Display a message to the console.
2595  */
2596 #define ASC_PRINT(s) \
2597     { \
2598         printk("advansys: "); \
2599         printk(s); \
2600     }
2601
2602 #define ASC_PRINT1(s, a1) \
2603     { \
2604         printk("advansys: "); \
2605         printk((s), (a1)); \
2606     }
2607
2608 #define ASC_PRINT2(s, a1, a2) \
2609     { \
2610         printk("advansys: "); \
2611         printk((s), (a1), (a2)); \
2612     }
2613
2614 #define ASC_PRINT3(s, a1, a2, a3) \
2615     { \
2616         printk("advansys: "); \
2617         printk((s), (a1), (a2), (a3)); \
2618     }
2619
2620 #define ASC_PRINT4(s, a1, a2, a3, a4) \
2621     { \
2622         printk("advansys: "); \
2623         printk((s), (a1), (a2), (a3), (a4)); \
2624     }
2625
2626 #ifndef ADVANSYS_DEBUG
2627
2628 #define ASC_DBG(lvl, s)
2629 #define ASC_DBG1(lvl, s, a1)
2630 #define ASC_DBG2(lvl, s, a1, a2)
2631 #define ASC_DBG3(lvl, s, a1, a2, a3)
2632 #define ASC_DBG4(lvl, s, a1, a2, a3, a4)
2633 #define ASC_DBG_PRT_SCSI_HOST(lvl, s)
2634 #define ASC_DBG_PRT_SCSI_CMND(lvl, s)
2635 #define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp)
2636 #define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
2637 #define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone)
2638 #define ADV_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
2639 #define ASC_DBG_PRT_HEX(lvl, name, start, length)
2640 #define ASC_DBG_PRT_CDB(lvl, cdb, len)
2641 #define ASC_DBG_PRT_SENSE(lvl, sense, len)
2642 #define ASC_DBG_PRT_INQUIRY(lvl, inq, len)
2643
2644 #else /* ADVANSYS_DEBUG */
2645
2646 /*
2647  * Debugging Message Levels:
2648  * 0: Errors Only
2649  * 1: High-Level Tracing
2650  * 2-N: Verbose Tracing
2651  */
2652
2653 #define ASC_DBG(lvl, s) \
2654     { \
2655         if (asc_dbglvl >= (lvl)) { \
2656             printk(s); \
2657         } \
2658     }
2659
2660 #define ASC_DBG1(lvl, s, a1) \
2661     { \
2662         if (asc_dbglvl >= (lvl)) { \
2663             printk((s), (a1)); \
2664         } \
2665     }
2666
2667 #define ASC_DBG2(lvl, s, a1, a2) \
2668     { \
2669         if (asc_dbglvl >= (lvl)) { \
2670             printk((s), (a1), (a2)); \
2671         } \
2672     }
2673
2674 #define ASC_DBG3(lvl, s, a1, a2, a3) \
2675     { \
2676         if (asc_dbglvl >= (lvl)) { \
2677             printk((s), (a1), (a2), (a3)); \
2678         } \
2679     }
2680
2681 #define ASC_DBG4(lvl, s, a1, a2, a3, a4) \
2682     { \
2683         if (asc_dbglvl >= (lvl)) { \
2684             printk((s), (a1), (a2), (a3), (a4)); \
2685         } \
2686     }
2687
2688 #define ASC_DBG_PRT_SCSI_HOST(lvl, s) \
2689     { \
2690         if (asc_dbglvl >= (lvl)) { \
2691             asc_prt_scsi_host(s); \
2692         } \
2693     }
2694
2695 #define ASC_DBG_PRT_SCSI_CMND(lvl, s) \
2696     { \
2697         if (asc_dbglvl >= (lvl)) { \
2698             asc_prt_scsi_cmnd(s); \
2699         } \
2700     }
2701
2702 #define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp) \
2703     { \
2704         if (asc_dbglvl >= (lvl)) { \
2705             asc_prt_asc_scsi_q(scsiqp); \
2706         } \
2707     }
2708
2709 #define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone) \
2710     { \
2711         if (asc_dbglvl >= (lvl)) { \
2712             asc_prt_asc_qdone_info(qdone); \
2713         } \
2714     }
2715
2716 #define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp) \
2717     { \
2718         if (asc_dbglvl >= (lvl)) { \
2719             asc_prt_adv_scsi_req_q(scsiqp); \
2720         } \
2721     }
2722
2723 #define ASC_DBG_PRT_HEX(lvl, name, start, length) \
2724     { \
2725         if (asc_dbglvl >= (lvl)) { \
2726             asc_prt_hex((name), (start), (length)); \
2727         } \
2728     }
2729
2730 #define ASC_DBG_PRT_CDB(lvl, cdb, len) \
2731         ASC_DBG_PRT_HEX((lvl), "CDB", (uchar *) (cdb), (len));
2732
2733 #define ASC_DBG_PRT_SENSE(lvl, sense, len) \
2734         ASC_DBG_PRT_HEX((lvl), "SENSE", (uchar *) (sense), (len));
2735
2736 #define ASC_DBG_PRT_INQUIRY(lvl, inq, len) \
2737         ASC_DBG_PRT_HEX((lvl), "INQUIRY", (uchar *) (inq), (len));
2738 #endif /* ADVANSYS_DEBUG */
2739
2740 #ifndef ADVANSYS_ASSERT
2741 #define ASC_ASSERT(a)
2742 #else /* ADVANSYS_ASSERT */
2743
2744 #define ASC_ASSERT(a) \
2745     { \
2746         if (!(a)) { \
2747             printk("ASC_ASSERT() Failure: file %s, line %d\n", \
2748                 __FILE__, __LINE__); \
2749         } \
2750     }
2751
2752 #endif /* ADVANSYS_ASSERT */
2753
2754 /*
2755  * --- Driver Structures
2756  */
2757
2758 #ifdef ADVANSYS_STATS
2759
2760 /* Per board statistics structure */
2761 struct asc_stats {
2762         /* Driver Entrypoint Statistics */
2763         ADV_DCNT queuecommand;  /* # calls to advansys_queuecommand() */
2764         ADV_DCNT reset;         /* # calls to advansys_eh_bus_reset() */
2765         ADV_DCNT biosparam;     /* # calls to advansys_biosparam() */
2766         ADV_DCNT interrupt;     /* # advansys_interrupt() calls */
2767         ADV_DCNT callback;      /* # calls to asc/adv_isr_callback() */
2768         ADV_DCNT done;          /* # calls to request's scsi_done function */
2769         ADV_DCNT build_error;   /* # asc/adv_build_req() ASC_ERROR returns. */
2770         ADV_DCNT adv_build_noreq;       /* # adv_build_req() adv_req_t alloc. fail. */
2771         ADV_DCNT adv_build_nosg;        /* # adv_build_req() adv_sgblk_t alloc. fail. */
2772         /* AscExeScsiQueue()/AdvExeScsiQueue() Statistics */
2773         ADV_DCNT exe_noerror;   /* # ASC_NOERROR returns. */
2774         ADV_DCNT exe_busy;      /* # ASC_BUSY returns. */
2775         ADV_DCNT exe_error;     /* # ASC_ERROR returns. */
2776         ADV_DCNT exe_unknown;   /* # unknown returns. */
2777         /* Data Transfer Statistics */
2778         ADV_DCNT cont_cnt;      /* # non-scatter-gather I/O requests received */
2779         ADV_DCNT cont_xfer;     /* # contiguous transfer 512-bytes */
2780         ADV_DCNT sg_cnt;        /* # scatter-gather I/O requests received */
2781         ADV_DCNT sg_elem;       /* # scatter-gather elements */
2782         ADV_DCNT sg_xfer;       /* # scatter-gather transfer 512-bytes */
2783 };
2784 #endif /* ADVANSYS_STATS */
2785
2786 /*
2787  * Request queuing structure
2788  */
2789 typedef struct asc_queue {
2790         ADV_SCSI_BIT_ID_TYPE q_tidmask; /* queue mask */
2791         REQP q_first[ADV_MAX_TID + 1];  /* first queued request */
2792         REQP q_last[ADV_MAX_TID + 1];   /* last queued request */
2793 #ifdef ADVANSYS_STATS
2794         short q_cur_cnt[ADV_MAX_TID + 1];       /* current queue count */
2795         short q_max_cnt[ADV_MAX_TID + 1];       /* maximum queue count */
2796         ADV_DCNT q_tot_cnt[ADV_MAX_TID + 1];    /* total enqueue count */
2797         ADV_DCNT q_tot_tim[ADV_MAX_TID + 1];    /* total time queued */
2798         ushort q_max_tim[ADV_MAX_TID + 1];      /* maximum time queued */
2799         ushort q_min_tim[ADV_MAX_TID + 1];      /* minimum time queued */
2800 #endif                          /* ADVANSYS_STATS */
2801 } asc_queue_t;
2802
2803 /*
2804  * Adv Library Request Structures
2805  *
2806  * The following two structures are used to process Wide Board requests.
2807  *
2808  * The ADV_SCSI_REQ_Q structure in adv_req_t is passed to the Adv Library
2809  * and microcode with the ADV_SCSI_REQ_Q field 'srb_ptr' pointing to the
2810  * adv_req_t. The adv_req_t structure 'cmndp' field in turn points to the
2811  * Mid-Level SCSI request structure.
2812  *
2813  * Zero or more ADV_SG_BLOCK are used with each ADV_SCSI_REQ_Q. Each
2814  * ADV_SG_BLOCK structure holds 15 scatter-gather elements. Under Linux
2815  * up to 255 scatter-gather elements may be used per request or
2816  * ADV_SCSI_REQ_Q.
2817  *
2818  * Both structures must be 32 byte aligned.
2819  */
2820 typedef struct adv_sgblk {
2821         ADV_SG_BLOCK sg_block;  /* Sgblock structure. */
2822         uchar align[32];        /* Sgblock structure padding. */
2823         struct adv_sgblk *next_sgblkp;  /* Next scatter-gather structure. */
2824 } adv_sgblk_t;
2825
2826 typedef struct adv_req {
2827         ADV_SCSI_REQ_Q scsi_req_q;      /* Adv Library request structure. */
2828         uchar align[32];        /* Request structure padding. */
2829         struct scsi_cmnd *cmndp;        /* Mid-Level SCSI command pointer. */
2830         adv_sgblk_t *sgblkp;    /* Adv Library scatter-gather pointer. */
2831         struct adv_req *next_reqp;      /* Next Request Structure. */
2832 } adv_req_t;
2833
2834 /*
2835  * Structure allocated for each board.
2836  *
2837  * This structure is allocated by scsi_host_alloc() at the end
2838  * of the 'Scsi_Host' structure starting at the 'hostdata'
2839  * field. It is guaranteed to be allocated from DMA-able memory.
2840  */
2841 typedef struct asc_board {
2842         struct device *dev;
2843         int id;                 /* Board Id */
2844         uint flags;             /* Board flags */
2845         union {
2846                 ASC_DVC_VAR asc_dvc_var;        /* Narrow board */
2847                 ADV_DVC_VAR adv_dvc_var;        /* Wide board */
2848         } dvc_var;
2849         union {
2850                 ASC_DVC_CFG asc_dvc_cfg;        /* Narrow board */
2851                 ADV_DVC_CFG adv_dvc_cfg;        /* Wide board */
2852         } dvc_cfg;
2853         ushort asc_n_io_port;   /* Number I/O ports. */
2854         asc_queue_t active;     /* Active command queue */
2855         ADV_SCSI_BIT_ID_TYPE init_tidmask;      /* Target init./valid mask */
2856         struct scsi_device *device[ADV_MAX_TID + 1];    /* Mid-Level Scsi Device */
2857         ushort reqcnt[ADV_MAX_TID + 1]; /* Starvation request count */
2858         ADV_SCSI_BIT_ID_TYPE queue_full;        /* Queue full mask */
2859         ushort queue_full_cnt[ADV_MAX_TID + 1]; /* Queue full count */
2860         union {
2861                 ASCEEP_CONFIG asc_eep;  /* Narrow EEPROM config. */
2862                 ADVEEP_3550_CONFIG adv_3550_eep;        /* 3550 EEPROM config. */
2863                 ADVEEP_38C0800_CONFIG adv_38C0800_eep;  /* 38C0800 EEPROM config. */
2864                 ADVEEP_38C1600_CONFIG adv_38C1600_eep;  /* 38C1600 EEPROM config. */
2865         } eep_config;
2866         ulong last_reset;       /* Saved last reset time */
2867         spinlock_t lock;        /* Board spinlock */
2868         /* /proc/scsi/advansys/[0...] */
2869         char *prtbuf;           /* /proc print buffer */
2870 #ifdef ADVANSYS_STATS
2871         struct asc_stats asc_stats;     /* Board statistics */
2872 #endif                          /* ADVANSYS_STATS */
2873         /*
2874          * The following fields are used only for Narrow Boards.
2875          */
2876         uchar sdtr_data[ASC_MAX_TID + 1];       /* SDTR information */
2877         /*
2878          * The following fields are used only for Wide Boards.
2879          */
2880         void __iomem *ioremap_addr;     /* I/O Memory remap address. */
2881         ushort ioport;          /* I/O Port address. */
2882         ADV_CARR_T *carrp;      /* ADV_CARR_T memory block. */
2883         adv_req_t *orig_reqp;   /* adv_req_t memory block. */
2884         adv_req_t *adv_reqp;    /* Request structures. */
2885         adv_sgblk_t *adv_sgblkp;        /* Scatter-gather structures. */
2886         ushort bios_signature;  /* BIOS Signature. */
2887         ushort bios_version;    /* BIOS Version. */
2888         ushort bios_codeseg;    /* BIOS Code Segment. */
2889         ushort bios_codelen;    /* BIOS Code Segment Length. */
2890 } asc_board_t;
2891
2892 #define adv_dvc_to_board(adv_dvc) container_of(adv_dvc, struct asc_board, \
2893                                                         dvc_var.adv_dvc_var)
2894 #define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
2895
2896 /* Number of boards detected in system. */
2897 static int asc_board_count;
2898
2899 /* Overrun buffer used by all narrow boards. */
2900 static uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 };
2901
2902 /*
2903  * Global structures required to issue a command.
2904  */
2905 static ASC_SCSI_Q asc_scsi_q = { {0} };
2906 static ASC_SG_HEAD asc_sg_head = { 0 };
2907
2908 #ifdef ADVANSYS_DEBUG
2909 static int asc_dbglvl = 3;
2910 #endif /* ADVANSYS_DEBUG */
2911
2912 /*
2913  * --- Driver Function Prototypes
2914  */
2915
2916 static int advansys_slave_configure(struct scsi_device *);
2917 static void asc_scsi_done_list(struct scsi_cmnd *);
2918 static int asc_execute_scsi_cmnd(struct scsi_cmnd *);
2919 static int asc_build_req(asc_board_t *, struct scsi_cmnd *);
2920 static int adv_build_req(asc_board_t *, struct scsi_cmnd *, ADV_SCSI_REQ_Q **);
2921 static int adv_get_sglist(asc_board_t *, adv_req_t *, struct scsi_cmnd *, int);
2922 static void asc_enqueue(asc_queue_t *, REQP, int);
2923 static REQP asc_dequeue_list(asc_queue_t *, REQP *, int);
2924 static int asc_rmqueue(asc_queue_t *, REQP);
2925 #ifdef CONFIG_PROC_FS
2926 static int asc_proc_copy(off_t, off_t, char *, int, char *, int);
2927 static int asc_prt_board_devices(struct Scsi_Host *, char *, int);
2928 static int asc_prt_adv_bios(struct Scsi_Host *, char *, int);
2929 static int asc_get_eeprom_string(ushort *serialnum, uchar *cp);
2930 static int asc_prt_asc_board_eeprom(struct Scsi_Host *, char *, int);
2931 static int asc_prt_adv_board_eeprom(struct Scsi_Host *, char *, int);
2932 static int asc_prt_driver_conf(struct Scsi_Host *, char *, int);
2933 static int asc_prt_asc_board_info(struct Scsi_Host *, char *, int);
2934 static int asc_prt_adv_board_info(struct Scsi_Host *, char *, int);
2935 static int asc_prt_line(char *, int, char *fmt, ...);
2936 #endif /* CONFIG_PROC_FS */
2937
2938 /* Statistics function prototypes. */
2939 #ifdef ADVANSYS_STATS
2940 #ifdef CONFIG_PROC_FS
2941 static int asc_prt_board_stats(struct Scsi_Host *, char *, int);
2942 static int asc_prt_target_stats(struct Scsi_Host *, int, char *, int);
2943 #endif /* CONFIG_PROC_FS */
2944 #endif /* ADVANSYS_STATS */
2945
2946 /* Debug function prototypes. */
2947 #ifdef ADVANSYS_DEBUG
2948 static void asc_prt_scsi_host(struct Scsi_Host *);
2949 static void asc_prt_scsi_cmnd(struct scsi_cmnd *);
2950 static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *);
2951 static void asc_prt_asc_dvc_var(ASC_DVC_VAR *);
2952 static void asc_prt_asc_scsi_q(ASC_SCSI_Q *);
2953 static void asc_prt_asc_qdone_info(ASC_QDONE_INFO *);
2954 static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *);
2955 static void asc_prt_adv_dvc_var(ADV_DVC_VAR *);
2956 static void asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *);
2957 static void asc_prt_adv_sgblock(int, ADV_SG_BLOCK *);
2958 static void asc_prt_hex(char *f, uchar *, int);
2959 #endif /* ADVANSYS_DEBUG */
2960
2961 #ifdef CONFIG_PROC_FS
2962 /*
2963  * advansys_proc_info() - /proc/scsi/advansys/{0,1,2,3,...}
2964  *
2965  * *buffer: I/O buffer
2966  * **start: if inout == FALSE pointer into buffer where user read should start
2967  * offset: current offset into a /proc/scsi/advansys/[0...] file
2968  * length: length of buffer
2969  * hostno: Scsi_Host host_no
2970  * inout: TRUE - user is writing; FALSE - user is reading
2971  *
2972  * Return the number of bytes read from or written to a
2973  * /proc/scsi/advansys/[0...] file.
2974  *
2975  * Note: This function uses the per board buffer 'prtbuf' which is
2976  * allocated when the board is initialized in advansys_detect(). The
2977  * buffer is ASC_PRTBUF_SIZE bytes. The function asc_proc_copy() is
2978  * used to write to the buffer. The way asc_proc_copy() is written
2979  * if 'prtbuf' is too small it will not be overwritten. Instead the
2980  * user just won't get all the available statistics.
2981  */
2982 static int
2983 advansys_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
2984                    off_t offset, int length, int inout)
2985 {
2986         asc_board_t *boardp;
2987         char *cp;
2988         int cplen;
2989         int cnt;
2990         int totcnt;
2991         int leftlen;
2992         char *curbuf;
2993         off_t advoffset;
2994 #ifdef ADVANSYS_STATS
2995         int tgt_id;
2996 #endif /* ADVANSYS_STATS */
2997
2998         ASC_DBG(1, "advansys_proc_info: begin\n");
2999
3000         /*
3001          * User write not supported.
3002          */
3003         if (inout == TRUE) {
3004                 return (-ENOSYS);
3005         }
3006
3007         /*
3008          * User read of /proc/scsi/advansys/[0...] file.
3009          */
3010
3011         boardp = ASC_BOARDP(shost);
3012
3013         /* Copy read data starting at the beginning of the buffer. */
3014         *start = buffer;
3015         curbuf = buffer;
3016         advoffset = 0;
3017         totcnt = 0;
3018         leftlen = length;
3019
3020         /*
3021          * Get board configuration information.
3022          *
3023          * advansys_info() returns the board string from its own static buffer.
3024          */
3025         cp = (char *)advansys_info(shost);
3026         strcat(cp, "\n");
3027         cplen = strlen(cp);
3028         /* Copy board information. */
3029         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
3030         totcnt += cnt;
3031         leftlen -= cnt;
3032         if (leftlen == 0) {
3033                 ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3034                 return totcnt;
3035         }
3036         advoffset += cplen;
3037         curbuf += cnt;
3038
3039         /*
3040          * Display Wide Board BIOS Information.
3041          */
3042         if (ASC_WIDE_BOARD(boardp)) {
3043                 cp = boardp->prtbuf;
3044                 cplen = asc_prt_adv_bios(shost, cp, ASC_PRTBUF_SIZE);
3045                 ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
3046                 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
3047                                   cplen);
3048                 totcnt += cnt;
3049                 leftlen -= cnt;
3050                 if (leftlen == 0) {
3051                         ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3052                         return totcnt;
3053                 }
3054                 advoffset += cplen;
3055                 curbuf += cnt;
3056         }
3057
3058         /*
3059          * Display driver information for each device attached to the board.
3060          */
3061         cp = boardp->prtbuf;
3062         cplen = asc_prt_board_devices(shost, cp, ASC_PRTBUF_SIZE);
3063         ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
3064         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
3065         totcnt += cnt;
3066         leftlen -= cnt;
3067         if (leftlen == 0) {
3068                 ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3069                 return totcnt;
3070         }
3071         advoffset += cplen;
3072         curbuf += cnt;
3073
3074         /*
3075          * Display EEPROM configuration for the board.
3076          */
3077         cp = boardp->prtbuf;
3078         if (ASC_NARROW_BOARD(boardp)) {
3079                 cplen = asc_prt_asc_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
3080         } else {
3081                 cplen = asc_prt_adv_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
3082         }
3083         ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
3084         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
3085         totcnt += cnt;
3086         leftlen -= cnt;
3087         if (leftlen == 0) {
3088                 ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3089                 return totcnt;
3090         }
3091         advoffset += cplen;
3092         curbuf += cnt;
3093
3094         /*
3095          * Display driver configuration and information for the board.
3096          */
3097         cp = boardp->prtbuf;
3098         cplen = asc_prt_driver_conf(shost, cp, ASC_PRTBUF_SIZE);
3099         ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
3100         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
3101         totcnt += cnt;
3102         leftlen -= cnt;
3103         if (leftlen == 0) {
3104                 ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3105                 return totcnt;
3106         }
3107         advoffset += cplen;
3108         curbuf += cnt;
3109
3110 #ifdef ADVANSYS_STATS
3111         /*
3112          * Display driver statistics for the board.
3113          */
3114         cp = boardp->prtbuf;
3115         cplen = asc_prt_board_stats(shost, cp, ASC_PRTBUF_SIZE);
3116         ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
3117         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
3118         totcnt += cnt;
3119         leftlen -= cnt;
3120         if (leftlen == 0) {
3121                 ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3122                 return totcnt;
3123         }
3124         advoffset += cplen;
3125         curbuf += cnt;
3126
3127         /*
3128          * Display driver statistics for each target.
3129          */
3130         for (tgt_id = 0; tgt_id <= ADV_MAX_TID; tgt_id++) {
3131                 cp = boardp->prtbuf;
3132                 cplen = asc_prt_target_stats(shost, tgt_id, cp,
3133                                              ASC_PRTBUF_SIZE);
3134                 ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
3135                 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
3136                                     cplen);
3137                 totcnt += cnt;
3138                 leftlen -= cnt;
3139                 if (leftlen == 0) {
3140                         ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3141                         return totcnt;
3142                 }
3143                 advoffset += cplen;
3144                 curbuf += cnt;
3145         }
3146 #endif /* ADVANSYS_STATS */
3147
3148         /*
3149          * Display Asc Library dynamic configuration information
3150          * for the board.
3151          */
3152         cp = boardp->prtbuf;
3153         if (ASC_NARROW_BOARD(boardp)) {
3154                 cplen = asc_prt_asc_board_info(shost, cp, ASC_PRTBUF_SIZE);
3155         } else {
3156                 cplen = asc_prt_adv_board_info(shost, cp, ASC_PRTBUF_SIZE);
3157         }
3158         ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
3159         cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
3160         totcnt += cnt;
3161         leftlen -= cnt;
3162         if (leftlen == 0) {
3163                 ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3164                 return totcnt;
3165         }
3166         advoffset += cplen;
3167         curbuf += cnt;
3168
3169         ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
3170
3171         return totcnt;
3172 }
3173 #endif /* CONFIG_PROC_FS */
3174
3175 /*
3176  * advansys_info()
3177  *
3178  * Return suitable for printing on the console with the argument
3179  * adapter's configuration information.
3180  *
3181  * Note: The information line should not exceed ASC_INFO_SIZE bytes,
3182  * otherwise the static 'info' array will be overrun.
3183  */
3184 static const char *advansys_info(struct Scsi_Host *shost)
3185 {
3186         static char info[ASC_INFO_SIZE];
3187         asc_board_t *boardp;
3188         ASC_DVC_VAR *asc_dvc_varp;
3189         ADV_DVC_VAR *adv_dvc_varp;
3190         char *busname;
3191         char *widename = NULL;
3192
3193         boardp = ASC_BOARDP(shost);
3194         if (ASC_NARROW_BOARD(boardp)) {
3195                 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
3196                 ASC_DBG(1, "advansys_info: begin\n");
3197                 if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
3198                         if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) ==
3199                             ASC_IS_ISAPNP) {
3200                                 busname = "ISA PnP";
3201                         } else {
3202                                 busname = "ISA";
3203                         }
3204                         sprintf(info,
3205                                 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
3206                                 ASC_VERSION, busname,
3207                                 (ulong)shost->io_port,
3208                                 (ulong)shost->io_port + ASC_IOADR_GAP - 1,
3209                                 shost->irq, shost->dma_channel);
3210                 } else {
3211                         if (asc_dvc_varp->bus_type & ASC_IS_VL) {
3212                                 busname = "VL";
3213                         } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) {
3214                                 busname = "EISA";
3215                         } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) {
3216                                 if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA)
3217                                     == ASC_IS_PCI_ULTRA) {
3218                                         busname = "PCI Ultra";
3219                                 } else {
3220                                         busname = "PCI";
3221                                 }
3222                         } else {
3223                                 busname = "?";
3224                                 ASC_PRINT2("advansys_info: board %d: unknown "
3225                                            "bus type %d\n", boardp->id,
3226                                            asc_dvc_varp->bus_type);
3227                         }
3228                         sprintf(info,
3229                                 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
3230                                 ASC_VERSION, busname, (ulong)shost->io_port,
3231                                 (ulong)shost->io_port + ASC_IOADR_GAP - 1,
3232                                 shost->irq);
3233                 }
3234         } else {
3235                 /*
3236                  * Wide Adapter Information
3237                  *
3238                  * Memory-mapped I/O is used instead of I/O space to access
3239                  * the adapter, but display the I/O Port range. The Memory
3240                  * I/O address is displayed through the driver /proc file.
3241                  */
3242                 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
3243                 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3244                         widename = "Ultra-Wide";
3245                 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3246                         widename = "Ultra2-Wide";
3247                 } else {
3248                         widename = "Ultra3-Wide";
3249                 }
3250                 sprintf(info,
3251                         "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
3252                         ASC_VERSION, widename, (ulong)adv_dvc_varp->iop_base,
3253                         (ulong)adv_dvc_varp->iop_base + boardp->asc_n_io_port - 1, shost->irq);
3254         }
3255         ASC_ASSERT(strlen(info) < ASC_INFO_SIZE);
3256         ASC_DBG(1, "advansys_info: end\n");
3257         return info;
3258 }
3259
3260 static void asc_scsi_done(struct scsi_cmnd *scp)
3261 {
3262         struct asc_board *boardp = ASC_BOARDP(scp->device->host);
3263
3264         if (scp->use_sg)
3265                 dma_unmap_sg(boardp->dev,
3266                              (struct scatterlist *)scp->request_buffer,
3267                              scp->use_sg, scp->sc_data_direction);
3268         else if (scp->request_bufflen)
3269                 dma_unmap_single(boardp->dev, scp->SCp.dma_handle,
3270                                  scp->request_bufflen, scp->sc_data_direction);
3271
3272         ASC_STATS(scp->device->host, done);
3273
3274         scp->scsi_done(scp);
3275 }
3276
3277 /*
3278  * advansys_queuecommand() - interrupt-driven I/O entrypoint.
3279  *
3280  * This function always returns 0. Command return status is saved
3281  * in the 'scp' result field.
3282  */
3283 static int
3284 advansys_queuecommand(struct scsi_cmnd *scp, void (*done) (struct scsi_cmnd *))
3285 {
3286         struct Scsi_Host *shost;
3287         asc_board_t *boardp;
3288         ulong flags;
3289         int asc_res, result = 0;
3290
3291         shost = scp->device->host;
3292         boardp = ASC_BOARDP(shost);
3293         ASC_STATS(shost, queuecommand);
3294
3295         /* host_lock taken by mid-level prior to call but need to protect */
3296         /* against own ISR */
3297         spin_lock_irqsave(&boardp->lock, flags);
3298
3299         scp->scsi_done = done;
3300         asc_res = asc_execute_scsi_cmnd(scp);
3301         switch (asc_res) {
3302         case ASC_NOERROR:
3303                 break;
3304         case ASC_BUSY:
3305                 result = SCSI_MLQUEUE_HOST_BUSY;
3306                 break;
3307         case ASC_ERROR:
3308         default:
3309                 /* Interrupts could be enabled here. */
3310                 asc_scsi_done(scp);
3311                 break;
3312         }
3313         spin_unlock_irqrestore(&boardp->lock, flags);
3314
3315         return result;
3316 }
3317
3318 /*
3319  * advansys_reset()
3320  *
3321  * Reset the bus associated with the command 'scp'.
3322  *
3323  * This function runs its own thread. Interrupts must be blocked but
3324  * sleeping is allowed and no locking other than for host structures is
3325  * required. Returns SUCCESS or FAILED.
3326  */
3327 static int advansys_reset(struct scsi_cmnd *scp)
3328 {
3329         struct Scsi_Host *shost;
3330         asc_board_t *boardp;
3331         ASC_DVC_VAR *asc_dvc_varp;
3332         ADV_DVC_VAR *adv_dvc_varp;
3333         ulong flags;
3334         struct scsi_cmnd *done_scp = NULL, *last_scp = NULL;
3335         struct scsi_cmnd *tscp, *new_last_scp;
3336         int status;
3337         int ret = SUCCESS;
3338
3339         ASC_DBG1(1, "advansys_reset: 0x%lx\n", (ulong)scp);
3340
3341 #ifdef ADVANSYS_STATS
3342         if (scp->device->host != NULL) {
3343                 ASC_STATS(scp->device->host, reset);
3344         }
3345 #endif /* ADVANSYS_STATS */
3346
3347         if ((shost = scp->device->host) == NULL) {
3348                 scp->result = HOST_BYTE(DID_ERROR);
3349                 return FAILED;
3350         }
3351
3352         boardp = ASC_BOARDP(shost);
3353
3354         ASC_PRINT1("advansys_reset: board %d: SCSI bus reset started...\n",
3355                    boardp->id);
3356         /*
3357          * Check for re-entrancy.
3358          */
3359         spin_lock_irqsave(&boardp->lock, flags);
3360         if (boardp->flags & ASC_HOST_IN_RESET) {
3361                 spin_unlock_irqrestore(&boardp->lock, flags);
3362                 return FAILED;
3363         }
3364         boardp->flags |= ASC_HOST_IN_RESET;
3365         spin_unlock_irqrestore(&boardp->lock, flags);
3366
3367         if (ASC_NARROW_BOARD(boardp)) {
3368                 /*
3369                  * Narrow Board
3370                  */
3371                 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
3372
3373                 /*
3374                  * Reset the chip and SCSI bus.
3375                  */
3376                 ASC_DBG(1, "advansys_reset: before AscInitAsc1000Driver()\n");
3377                 status = AscInitAsc1000Driver(asc_dvc_varp);
3378
3379                 /* Refer to ASC_IERR_* defintions for meaning of 'err_code'. */
3380                 if (asc_dvc_varp->err_code) {
3381                         ASC_PRINT2("advansys_reset: board %d: SCSI bus reset "
3382                                    "error: 0x%x\n", boardp->id,
3383                                    asc_dvc_varp->err_code);
3384                         ret = FAILED;
3385                 } else if (status) {
3386                         ASC_PRINT2("advansys_reset: board %d: SCSI bus reset "
3387                                    "warning: 0x%x\n", boardp->id, status);
3388                 } else {
3389                         ASC_PRINT1("advansys_reset: board %d: SCSI bus reset "
3390                                    "successful.\n", boardp->id);
3391                 }
3392
3393                 ASC_DBG(1, "advansys_reset: after AscInitAsc1000Driver()\n");
3394                 spin_lock_irqsave(&boardp->lock, flags);
3395
3396         } else {
3397                 /*
3398                  * Wide Board
3399                  *
3400                  * If the suggest reset bus flags are set, then reset the bus.
3401                  * Otherwise only reset the device.
3402                  */
3403                 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
3404
3405                 /*
3406                  * Reset the target's SCSI bus.
3407                  */
3408                 ASC_DBG(1, "advansys_reset: before AdvResetChipAndSB()\n");
3409                 switch (AdvResetChipAndSB(adv_dvc_varp)) {
3410                 case ASC_TRUE:
3411                         ASC_PRINT1("advansys_reset: board %d: SCSI bus reset "
3412                                    "successful.\n", boardp->id);
3413                         break;
3414                 case ASC_FALSE:
3415                 default:
3416                         ASC_PRINT1("advansys_reset: board %d: SCSI bus reset "
3417                                    "error.\n", boardp->id);
3418                         ret = FAILED;
3419                         break;
3420                 }
3421                 spin_lock_irqsave(&boardp->lock, flags);
3422                 (void)AdvISR(adv_dvc_varp);
3423         }
3424         /* Board lock is held. */
3425
3426         /*
3427          * Dequeue all board 'active' requests for all devices and set
3428          * the request status to DID_RESET. A pointer to the last request
3429          * is returned in 'last_scp'.
3430          */
3431         if (done_scp == NULL) {
3432                 done_scp = asc_dequeue_list(&boardp->active, &last_scp,
3433                                             ASC_TID_ALL);
3434                 for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
3435                         tscp->result = HOST_BYTE(DID_RESET);
3436                 }
3437         } else {
3438                 /* Append to 'done_scp' at the end with 'last_scp'. */
3439                 ASC_ASSERT(last_scp != NULL);
3440                 last_scp->host_scribble =
3441                     (unsigned char *)asc_dequeue_list(&boardp->active,
3442                                                       &new_last_scp,
3443                                                       ASC_TID_ALL);
3444                 if (new_last_scp != NULL) {
3445                         ASC_ASSERT(REQPNEXT(last_scp) != NULL);
3446                         for (tscp = REQPNEXT(last_scp); tscp;
3447                              tscp = REQPNEXT(tscp)) {
3448                                 tscp->result = HOST_BYTE(DID_RESET);
3449                         }
3450                         last_scp = new_last_scp;
3451                 }
3452         }
3453
3454         /* Save the time of the most recently completed reset. */
3455         boardp->last_reset = jiffies;
3456
3457         /* Clear reset flag. */
3458         boardp->flags &= ~ASC_HOST_IN_RESET;
3459         spin_unlock_irqrestore(&boardp->lock, flags);
3460
3461         /*
3462          * Complete all the 'done_scp' requests.
3463          */
3464         if (done_scp)
3465                 asc_scsi_done_list(done_scp);
3466
3467         ASC_DBG1(1, "advansys_reset: ret %d\n", ret);
3468
3469         return ret;
3470 }
3471
3472 /*
3473  * advansys_biosparam()
3474  *
3475  * Translate disk drive geometry if the "BIOS greater than 1 GB"
3476  * support is enabled for a drive.
3477  *
3478  * ip (information pointer) is an int array with the following definition:
3479  * ip[0]: heads
3480  * ip[1]: sectors
3481  * ip[2]: cylinders
3482  */
3483 static int
3484 advansys_biosparam(struct scsi_device *sdev, struct block_device *bdev,
3485                    sector_t capacity, int ip[])
3486 {
3487         asc_board_t *boardp;
3488
3489         ASC_DBG(1, "advansys_biosparam: begin\n");
3490         ASC_STATS(sdev->host, biosparam);
3491         boardp = ASC_BOARDP(sdev->host);
3492         if (ASC_NARROW_BOARD(boardp)) {
3493                 if ((boardp->dvc_var.asc_dvc_var.dvc_cntl &
3494                      ASC_CNTL_BIOS_GT_1GB) && capacity > 0x200000) {
3495                         ip[0] = 255;
3496                         ip[1] = 63;
3497                 } else {
3498                         ip[0] = 64;
3499                         ip[1] = 32;
3500                 }
3501         } else {
3502                 if ((boardp->dvc_var.adv_dvc_var.bios_ctrl &
3503                      BIOS_CTRL_EXTENDED_XLAT) && capacity > 0x200000) {
3504                         ip[0] = 255;
3505                         ip[1] = 63;
3506                 } else {
3507                         ip[0] = 64;
3508                         ip[1] = 32;
3509                 }
3510         }
3511         ip[2] = (unsigned long)capacity / (ip[0] * ip[1]);
3512         ASC_DBG(1, "advansys_biosparam: end\n");
3513         return 0;
3514 }
3515
3516 static struct scsi_host_template advansys_template = {
3517         .proc_name = "advansys",
3518 #ifdef CONFIG_PROC_FS
3519         .proc_info = advansys_proc_info,
3520 #endif
3521         .name = "advansys",
3522         .info = advansys_info,
3523         .queuecommand = advansys_queuecommand,
3524         .eh_bus_reset_handler = advansys_reset,
3525         .bios_param = advansys_biosparam,
3526         .slave_configure = advansys_slave_configure,
3527         /*
3528          * Because the driver may control an ISA adapter 'unchecked_isa_dma'
3529          * must be set. The flag will be cleared in advansys_board_found
3530          * for non-ISA adapters.
3531          */
3532         .unchecked_isa_dma = 1,
3533         /*
3534          * All adapters controlled by this driver are capable of large
3535          * scatter-gather lists. According to the mid-level SCSI documentation
3536          * this obviates any performance gain provided by setting
3537          * 'use_clustering'. But empirically while CPU utilization is increased
3538          * by enabling clustering, I/O throughput increases as well.
3539          */
3540         .use_clustering = ENABLE_CLUSTERING,
3541 };
3542
3543 /*
3544  * --- Miscellaneous Driver Functions
3545  */
3546
3547 /*
3548  * First-level interrupt handler.
3549  *
3550  * 'dev_id' is a pointer to the interrupting adapter's asc_board_t. Because
3551  * all boards are currently checked for interrupts on each interrupt, 'dev_id'
3552  * is not referenced. 'dev_id' could be used to identify an interrupt passed
3553  * to the AdvanSys driver which is for a device sharing an interrupt with
3554  * an AdvanSys adapter.
3555  */
3556 static irqreturn_t advansys_interrupt(int irq, void *dev_id)
3557 {
3558         unsigned long flags;
3559         struct Scsi_Host *shost = dev_id;
3560         asc_board_t *boardp = ASC_BOARDP(shost);
3561         irqreturn_t result = IRQ_NONE;
3562
3563         ASC_DBG1(2, "advansys_interrupt: boardp 0x%p\n", boardp);
3564         spin_lock_irqsave(&boardp->lock, flags);
3565         if (ASC_NARROW_BOARD(boardp)) {
3566                 /*
3567                  * Narrow Board
3568                  */
3569                 if (AscIsIntPending(shost->io_port)) {
3570                         result = IRQ_HANDLED;
3571                         ASC_STATS(shost, interrupt);
3572                         ASC_DBG(1, "advansys_interrupt: before AscISR()\n");
3573                         AscISR(&boardp->dvc_var.asc_dvc_var);
3574                 }
3575         } else {
3576                 /*
3577                  * Wide Board
3578                  */
3579                 ASC_DBG(1, "advansys_interrupt: before AdvISR()\n");
3580                 if (AdvISR(&boardp->dvc_var.adv_dvc_var)) {
3581                         result = IRQ_HANDLED;
3582                         ASC_STATS(shost, interrupt);
3583                 }
3584         }
3585
3586         spin_unlock_irqrestore(&boardp->lock, flags);
3587
3588         /*
3589          * If interrupts were enabled on entry, then they
3590          * are now enabled here.
3591          */
3592
3593         ASC_DBG(1, "advansys_interrupt: end\n");
3594         return result;
3595 }
3596
3597 static void
3598 advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
3599 {
3600         ASC_SCSI_BIT_ID_TYPE tid_bit = 1 << sdev->id;
3601         ASC_SCSI_BIT_ID_TYPE orig_use_tagged_qng = asc_dvc->use_tagged_qng;
3602
3603         if (sdev->lun == 0) {
3604                 ASC_SCSI_BIT_ID_TYPE orig_init_sdtr = asc_dvc->init_sdtr;
3605                 if ((asc_dvc->cfg->sdtr_enable & tid_bit) && sdev->sdtr) {
3606                         asc_dvc->init_sdtr |= tid_bit;
3607                 } else {
3608                         asc_dvc->init_sdtr &= ~tid_bit;
3609                 }
3610
3611                 if (orig_init_sdtr != asc_dvc->init_sdtr)
3612                         AscAsyncFix(asc_dvc, sdev);
3613         }
3614
3615         if (sdev->tagged_supported) {
3616                 if (asc_dvc->cfg->cmd_qng_enabled & tid_bit) {
3617                         if (sdev->lun == 0) {
3618                                 asc_dvc->cfg->can_tagged_qng |= tid_bit;
3619                                 asc_dvc->use_tagged_qng |= tid_bit;
3620                         }
3621                         scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG,
3622                                                 asc_dvc->max_dvc_qng[sdev->id]);
3623                 }
3624         } else {
3625                 if (sdev->lun == 0) {
3626                         asc_dvc->cfg->can_tagged_qng &= ~tid_bit;
3627                         asc_dvc->use_tagged_qng &= ~tid_bit;
3628                 }
3629                 scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
3630         }
3631
3632         if ((sdev->lun == 0) &&
3633             (orig_use_tagged_qng != asc_dvc->use_tagged_qng)) {
3634                 AscWriteLramByte(asc_dvc->iop_base, ASCV_DISC_ENABLE_B,
3635                                  asc_dvc->cfg->disc_enable);
3636                 AscWriteLramByte(asc_dvc->iop_base, ASCV_USE_TAGGED_QNG_B,
3637                                  asc_dvc->use_tagged_qng);
3638                 AscWriteLramByte(asc_dvc->iop_base, ASCV_CAN_TAGGED_QNG_B,
3639                                  asc_dvc->cfg->can_tagged_qng);
3640
3641                 asc_dvc->max_dvc_qng[sdev->id] =
3642                                         asc_dvc->cfg->max_tag_qng[sdev->id];
3643                 AscWriteLramByte(asc_dvc->iop_base,
3644                                  (ushort)(ASCV_MAX_DVC_QNG_BEG + sdev->id),
3645                                  asc_dvc->max_dvc_qng[sdev->id]);
3646         }
3647 }
3648
3649 /*
3650  * Wide Transfers
3651  *
3652  * If the EEPROM enabled WDTR for the device and the device supports wide
3653  * bus (16 bit) transfers, then turn on the device's 'wdtr_able' bit and
3654  * write the new value to the microcode.
3655  */
3656 static void
3657 advansys_wide_enable_wdtr(AdvPortAddr iop_base, unsigned short tidmask)
3658 {
3659         unsigned short cfg_word;
3660         AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
3661         if ((cfg_word & tidmask) != 0)
3662                 return;
3663
3664         cfg_word |= tidmask;
3665         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
3666
3667         /*
3668          * Clear the microcode SDTR and WDTR negotiation done indicators for
3669          * the target to cause it to negotiate with the new setting set above.
3670          * WDTR when accepted causes the target to enter asynchronous mode, so
3671          * SDTR must be negotiated.
3672          */
3673         AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
3674         cfg_word &= ~tidmask;
3675         AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
3676         AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
3677         cfg_word &= ~tidmask;
3678         AdvWriteWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
3679 }
3680
3681 /*
3682  * Synchronous Transfers
3683  *
3684  * If the EEPROM enabled SDTR for the device and the device
3685  * supports synchronous transfers, then turn on the device's
3686  * 'sdtr_able' bit. Write the new value to the microcode.
3687  */
3688 static void
3689 advansys_wide_enable_sdtr(AdvPortAddr iop_base, unsigned short tidmask)
3690 {
3691         unsigned short cfg_word;
3692         AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
3693         if ((cfg_word & tidmask) != 0)
3694                 return;
3695
3696         cfg_word |= tidmask;
3697         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
3698
3699         /*
3700          * Clear the microcode "SDTR negotiation" done indicator for the
3701          * target to cause it to negotiate with the new setting set above.
3702          */
3703         AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
3704         cfg_word &= ~tidmask;
3705         AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
3706 }
3707
3708 /*
3709  * PPR (Parallel Protocol Request) Capable
3710  *
3711  * If the device supports DT mode, then it must be PPR capable.
3712  * The PPR message will be used in place of the SDTR and WDTR
3713  * messages to negotiate synchronous speed and offset, transfer
3714  * width, and protocol options.
3715  */
3716 static void advansys_wide_enable_ppr(ADV_DVC_VAR *adv_dvc,
3717                                 AdvPortAddr iop_base, unsigned short tidmask)
3718 {
3719         AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, adv_dvc->ppr_able);
3720         adv_dvc->ppr_able |= tidmask;
3721         AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, adv_dvc->ppr_able);
3722 }
3723
3724 static void
3725 advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc)
3726 {
3727         AdvPortAddr iop_base = adv_dvc->iop_base;
3728         unsigned short tidmask = 1 << sdev->id;
3729
3730         if (sdev->lun == 0) {
3731                 /*
3732                  * Handle WDTR, SDTR, and Tag Queuing. If the feature
3733                  * is enabled in the EEPROM and the device supports the
3734                  * feature, then enable it in the microcode.
3735                  */
3736
3737                 if ((adv_dvc->wdtr_able & tidmask) && sdev->wdtr)
3738                         advansys_wide_enable_wdtr(iop_base, tidmask);
3739                 if ((adv_dvc->sdtr_able & tidmask) && sdev->sdtr)
3740                         advansys_wide_enable_sdtr(iop_base, tidmask);
3741                 if (adv_dvc->chip_type == ADV_CHIP_ASC38C1600 && sdev->ppr)
3742                         advansys_wide_enable_ppr(adv_dvc, iop_base, tidmask);
3743
3744                 /*
3745                  * Tag Queuing is disabled for the BIOS which runs in polled
3746                  * mode and would see no benefit from Tag Queuing. Also by
3747                  * disabling Tag Queuing in the BIOS devices with Tag Queuing
3748                  * bugs will at least work with the BIOS.
3749                  */
3750                 if ((adv_dvc->tagqng_able & tidmask) &&
3751                     sdev->tagged_supported) {
3752                         unsigned short cfg_word;
3753                         AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
3754                         cfg_word |= tidmask;
3755                         AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
3756                                          cfg_word);
3757                         AdvWriteByteLram(iop_base,
3758                                          ASC_MC_NUMBER_OF_MAX_CMD + sdev->id,
3759                                          adv_dvc->max_dvc_qng);
3760                 }
3761         }
3762
3763         if ((adv_dvc->tagqng_able & tidmask) && sdev->tagged_supported) {
3764                 scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG,
3765                                         adv_dvc->max_dvc_qng);
3766         } else {
3767                 scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
3768         }
3769 }
3770
3771 /*
3772  * Set the number of commands to queue per device for the
3773  * specified host adapter.
3774  */
3775 static int advansys_slave_configure(struct scsi_device *sdev)
3776 {
3777         asc_board_t *boardp = ASC_BOARDP(sdev->host);
3778         boardp->flags |= ASC_SELECT_QUEUE_DEPTHS;
3779
3780         /*
3781          * Save a pointer to the sdev and set its initial/maximum
3782          * queue depth.  Only save the pointer for a lun0 dev though.
3783          */
3784         if (sdev->lun == 0)
3785                 boardp->device[sdev->id] = sdev;
3786
3787         if (ASC_NARROW_BOARD(boardp))
3788                 advansys_narrow_slave_configure(sdev,
3789                                                 &boardp->dvc_var.asc_dvc_var);
3790         else
3791                 advansys_wide_slave_configure(sdev,
3792                                                 &boardp->dvc_var.adv_dvc_var);
3793
3794         return 0;
3795 }
3796
3797 /*
3798  * Complete all requests on the singly linked list pointed
3799  * to by 'scp'.
3800  *
3801  * Interrupts can be enabled on entry.
3802  */
3803 static void asc_scsi_done_list(struct scsi_cmnd *scp)
3804 {
3805         struct scsi_cmnd *tscp;
3806
3807         ASC_DBG(2, "asc_scsi_done_list: begin\n");
3808         while (scp != NULL) {
3809                 ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp);
3810                 tscp = REQPNEXT(scp);
3811                 scp->host_scribble = NULL;
3812
3813                 asc_scsi_done(scp);
3814
3815                 scp = tscp;
3816         }
3817         ASC_DBG(2, "asc_scsi_done_list: done\n");
3818         return;
3819 }
3820
3821 /*
3822  * Execute a single 'Scsi_Cmnd'.
3823  *
3824  * The function 'done' is called when the request has been completed.
3825  *
3826  * Scsi_Cmnd:
3827  *
3828  *  host - board controlling device
3829  *  device - device to send command
3830  *  target - target of device
3831  *  lun - lun of device
3832  *  cmd_len - length of SCSI CDB
3833  *  cmnd - buffer for SCSI 8, 10, or 12 byte CDB
3834  *  use_sg - if non-zero indicates scatter-gather request with use_sg elements
3835  *
3836  *  if (use_sg == 0) {
3837  *    request_buffer - buffer address for request
3838  *    request_bufflen - length of request buffer
3839  *  } else {
3840  *    request_buffer - pointer to scatterlist structure
3841  *  }
3842  *
3843  *  sense_buffer - sense command buffer
3844  *
3845  *  result (4 bytes of an int):
3846  *    Byte Meaning
3847  *    0 SCSI Status Byte Code
3848  *    1 SCSI One Byte Message Code
3849  *    2 Host Error Code
3850  *    3 Mid-Level Error Code
3851  *
3852  *  host driver fields:
3853  *    SCp - Scsi_Pointer used for command processing status
3854  *    scsi_done - used to save caller's done function
3855  *    host_scribble - used for pointer to another struct scsi_cmnd
3856  *
3857  * If this function returns ASC_NOERROR the request has been enqueued
3858  * on the board's 'active' queue and will be completed from the
3859  * interrupt handler.
3860  *
3861  * If this function returns ASC_ERROR the host error code has been set,
3862  * and the called must call asc_scsi_done.
3863  *
3864  * If ASC_BUSY is returned the request will be returned to the midlayer
3865  * and re-tried later.
3866  */
3867 static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
3868 {
3869         asc_board_t *boardp;
3870         ASC_DVC_VAR *asc_dvc_varp;
3871         ADV_DVC_VAR *adv_dvc_varp;
3872         ADV_SCSI_REQ_Q *adv_scsiqp;
3873         struct scsi_device *device;
3874         int ret;
3875
3876         ASC_DBG2(1, "asc_execute_scsi_cmnd: scp 0x%lx, done 0x%lx\n",
3877                  (ulong)scp, (ulong)scp->scsi_done);
3878
3879         boardp = ASC_BOARDP(scp->device->host);
3880         device = boardp->device[scp->device->id];
3881
3882         if (ASC_NARROW_BOARD(boardp)) {
3883                 /*
3884                  * Build and execute Narrow Board request.
3885                  */
3886
3887                 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
3888
3889                 /*
3890                  * Build Asc Library request structure using the
3891                  * global structures 'asc_scsi_req' and 'asc_sg_head'.
3892                  *
3893                  * If an error is returned, then the request has been
3894                  * queued on the board done queue. It will be completed
3895                  * by the caller.
3896                  *
3897                  * asc_build_req() can not return ASC_BUSY.
3898                  */
3899                 if (asc_build_req(boardp, scp) == ASC_ERROR) {
3900                         ASC_STATS(scp->device->host, build_error);
3901                         return ASC_ERROR;
3902                 }
3903
3904                 /*
3905                  * Execute the command. If there is no error, add the command
3906                  * to the active queue.
3907                  */
3908                 switch (ret = AscExeScsiQueue(asc_dvc_varp, &asc_scsi_q)) {
3909                 case ASC_NOERROR:
3910                         ASC_STATS(scp->device->host, exe_noerror);
3911                         /*
3912                          * Increment monotonically increasing per device
3913                          * successful request counter. Wrapping doesn't matter.
3914                          */
3915                         boardp->reqcnt[scp->device->id]++;
3916                         asc_enqueue(&boardp->active, scp, ASC_BACK);
3917                         ASC_DBG(1, "asc_execute_scsi_cmnd: AscExeScsiQueue(), "
3918                                 "ASC_NOERROR\n");
3919                         break;
3920                 case ASC_BUSY:
3921                         ASC_STATS(scp->device->host, exe_busy);
3922                         break;
3923                 case ASC_ERROR:
3924                         ASC_PRINT2("asc_execute_scsi_cmnd: board %d: "
3925                                 "AscExeScsiQueue() ASC_ERROR, err_code 0x%x\n",
3926                                 boardp->id, asc_dvc_varp->err_code);
3927                         ASC_STATS(scp->device->host, exe_error);
3928                         scp->result = HOST_BYTE(DID_ERROR);
3929                         break;
3930                 default:
3931                         ASC_PRINT2("asc_execute_scsi_cmnd: board %d: "
3932                                 "AscExeScsiQueue() unknown, err_code 0x%x\n",
3933                                 boardp->id, asc_dvc_varp->err_code);
3934                         ASC_STATS(scp->device->host, exe_unknown);
3935                         scp->result = HOST_BYTE(DID_ERROR);
3936                         break;
3937                 }
3938         } else {
3939                 /*
3940                  * Build and execute Wide Board request.
3941                  */
3942                 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
3943
3944                 /*
3945                  * Build and get a pointer to an Adv Library request structure.
3946                  *
3947                  * If the request is successfully built then send it below,
3948                  * otherwise return with an error.
3949                  */
3950                 switch (adv_build_req(boardp, scp, &adv_scsiqp)) {
3951                 case ASC_NOERROR:
3952                         ASC_DBG(3, "asc_execute_scsi_cmnd: adv_build_req "
3953                                 "ASC_NOERROR\n");
3954                         break;
3955                 case ASC_BUSY:
3956                         ASC_DBG(1, "asc_execute_scsi_cmnd: adv_build_req "
3957                                 "ASC_BUSY\n");
3958                         /*
3959                          * The asc_stats fields 'adv_build_noreq' and
3960                          * 'adv_build_nosg' count wide board busy conditions.
3961                          * They are updated in adv_build_req and
3962                          * adv_get_sglist, respectively.
3963                          */
3964                         return ASC_BUSY;
3965                 case ASC_ERROR:
3966                 default:
3967                         ASC_DBG(1, "asc_execute_scsi_cmnd: adv_build_req "
3968                                 "ASC_ERROR\n");
3969                         ASC_STATS(scp->device->host, build_error);
3970                         return ASC_ERROR;
3971                 }
3972
3973                 /*
3974                  * Execute the command. If there is no error, add the command
3975                  * to the active queue.
3976                  */
3977                 switch (ret = AdvExeScsiQueue(adv_dvc_varp, adv_scsiqp)) {
3978                 case ASC_NOERROR:
3979                         ASC_STATS(scp->device->host, exe_noerror);
3980                         /*
3981                          * Increment monotonically increasing per device
3982                          * successful request counter. Wrapping doesn't matter.
3983                          */
3984                         boardp->reqcnt[scp->device->id]++;
3985                         asc_enqueue(&boardp->active, scp, ASC_BACK);
3986                         ASC_DBG(1, "asc_execute_scsi_cmnd: AdvExeScsiQueue(), "
3987                                 "ASC_NOERROR\n");
3988                         break;
3989                 case ASC_BUSY:
3990                         ASC_STATS(scp->device->host, exe_busy);
3991                         break;
3992                 case ASC_ERROR:
3993                         ASC_PRINT2("asc_execute_scsi_cmnd: board %d: "
3994                                 "AdvExeScsiQueue() ASC_ERROR, err_code 0x%x\n",
3995                                 boardp->id, adv_dvc_varp->err_code);
3996                         ASC_STATS(scp->device->host, exe_error);
3997                         scp->result = HOST_BYTE(DID_ERROR);
3998                         break;
3999                 default:
4000                         ASC_PRINT2("asc_execute_scsi_cmnd: board %d: "
4001                                 "AdvExeScsiQueue() unknown, err_code 0x%x\n",
4002                                 boardp->id, adv_dvc_varp->err_code);
4003                         ASC_STATS(scp->device->host, exe_unknown);
4004                         scp->result = HOST_BYTE(DID_ERROR);
4005                         break;
4006                 }
4007         }
4008
4009         ASC_DBG(1, "asc_execute_scsi_cmnd: end\n");
4010         return ret;
4011 }
4012
4013 /*
4014  * Build a request structure for the Asc Library (Narrow Board).
4015  *
4016  * The global structures 'asc_scsi_q' and 'asc_sg_head' are
4017  * used to build the request.
4018  *
4019  * If an error occurs, then return ASC_ERROR.
4020  */
4021 static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
4022 {
4023         /*
4024          * Mutually exclusive access is required to 'asc_scsi_q' and
4025          * 'asc_sg_head' until after the request is started.
4026          */
4027         memset(&asc_scsi_q, 0, sizeof(ASC_SCSI_Q));
4028
4029         /*
4030          * Point the ASC_SCSI_Q to the 'struct scsi_cmnd'.
4031          */
4032         asc_scsi_q.q2.srb_ptr = ASC_VADDR_TO_U32(scp);
4033
4034         /*
4035          * Build the ASC_SCSI_Q request.
4036          *
4037          * For narrow boards a CDB length maximum of 12 bytes
4038          * is supported.
4039          */
4040         if (scp->cmd_len > ASC_MAX_CDB_LEN) {
4041                 ASC_PRINT3("asc_build_req: board %d: cmd_len %d > "
4042                         "ASC_MAX_CDB_LEN %d\n", boardp->id, scp->cmd_len,
4043                         ASC_MAX_CDB_LEN);
4044                 scp->result = HOST_BYTE(DID_ERROR);
4045                 return ASC_ERROR;
4046         }
4047         asc_scsi_q.cdbptr = &scp->cmnd[0];
4048         asc_scsi_q.q2.cdb_len = scp->cmd_len;
4049         asc_scsi_q.q1.target_id = ASC_TID_TO_TARGET_ID(scp->device->id);
4050         asc_scsi_q.q1.target_lun = scp->device->lun;
4051         asc_scsi_q.q2.target_ix =
4052             ASC_TIDLUN_TO_IX(scp->device->id, scp->device->lun);
4053         asc_scsi_q.q1.sense_addr =
4054             cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
4055         asc_scsi_q.q1.sense_len = sizeof(scp->sense_buffer);
4056
4057         /*
4058          * If there are any outstanding requests for the current target,
4059          * then every 255th request send an ORDERED request. This heuristic
4060          * tries to retain the benefit of request sorting while preventing
4061          * request starvation. 255 is the max number of tags or pending commands
4062          * a device may have outstanding.
4063          *
4064          * The request count is incremented below for every successfully
4065          * started request.
4066          *
4067          */
4068         if ((boardp->dvc_var.asc_dvc_var.cur_dvc_qng[scp->device->id] > 0) &&
4069             (boardp->reqcnt[scp->device->id] % 255) == 0) {
4070                 asc_scsi_q.q2.tag_code = MSG_ORDERED_TAG;
4071         } else {
4072                 asc_scsi_q.q2.tag_code = MSG_SIMPLE_TAG;
4073         }
4074
4075         /*
4076          * Build ASC_SCSI_Q for a contiguous buffer or a scatter-gather
4077          * buffer command.
4078          */
4079         if (scp->use_sg == 0) {
4080                 /*
4081                  * CDB request of single contiguous buffer.
4082                  */
4083                 ASC_STATS(scp->device->host, cont_cnt);
4084                 scp->SCp.dma_handle = scp->request_bufflen ?
4085                     dma_map_single(boardp->dev, scp->request_buffer,
4086                                    scp->request_bufflen,
4087                                    scp->sc_data_direction) : 0;
4088                 asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
4089                 asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
4090                 ASC_STATS_ADD(scp->device->host, cont_xfer,
4091                               ASC_CEILING(scp->request_bufflen, 512));
4092                 asc_scsi_q.q1.sg_queue_cnt = 0;
4093                 asc_scsi_q.sg_head = NULL;
4094         } else {
4095                 /*
4096                  * CDB scatter-gather request list.
4097                  */
4098                 int sgcnt;
4099                 int use_sg;
4100                 struct scatterlist *slp;
4101
4102                 slp = (struct scatterlist *)scp->request_buffer;
4103                 use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
4104                                     scp->sc_data_direction);
4105
4106                 if (use_sg > scp->device->host->sg_tablesize) {
4107                         ASC_PRINT3("asc_build_req: board %d: use_sg %d > "
4108                                    "sg_tablesize %d\n", boardp->id, use_sg,
4109                                    scp->device->host->sg_tablesize);
4110                         dma_unmap_sg(boardp->dev, slp, scp->use_sg,
4111                                      scp->sc_data_direction);
4112                         scp->result = HOST_BYTE(DID_ERROR);
4113                         return ASC_ERROR;
4114                 }
4115
4116                 ASC_STATS(scp->device->host, sg_cnt);
4117
4118                 /*
4119                  * Use global ASC_SG_HEAD structure and set the ASC_SCSI_Q
4120                  * structure to point to it.
4121                  */
4122                 memset(&asc_sg_head, 0, sizeof(ASC_SG_HEAD));
4123
4124                 asc_scsi_q.q1.cntl |= QC_SG_HEAD;
4125                 asc_scsi_q.sg_head = &asc_sg_head;
4126                 asc_scsi_q.q1.data_cnt = 0;
4127                 asc_scsi_q.q1.data_addr = 0;
4128                 /* This is a byte value, otherwise it would need to be swapped. */
4129                 asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = use_sg;
4130                 ASC_STATS_ADD(scp->device->host, sg_elem,
4131                               asc_sg_head.entry_cnt);
4132
4133                 /*
4134                  * Convert scatter-gather list into ASC_SG_HEAD list.
4135                  */
4136                 for (sgcnt = 0; sgcnt < use_sg; sgcnt++, slp++) {
4137                         asc_sg_head.sg_list[sgcnt].addr =
4138                             cpu_to_le32(sg_dma_address(slp));
4139                         asc_sg_head.sg_list[sgcnt].bytes =
4140                             cpu_to_le32(sg_dma_len(slp));
4141                         ASC_STATS_ADD(scp->device->host, sg_xfer,
4142                                       ASC_CEILING(sg_dma_len(slp), 512));
4143                 }
4144         }
4145
4146         ASC_DBG_PRT_ASC_SCSI_Q(2, &asc_scsi_q);
4147         ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
4148
4149         return ASC_NOERROR;
4150 }
4151
4152 /*
4153  * Build a request structure for the Adv Library (Wide Board).
4154  *
4155  * If an adv_req_t can not be allocated to issue the request,
4156  * then return ASC_BUSY. If an error occurs, then return ASC_ERROR.
4157  *
4158  * Multi-byte fields in the ASC_SCSI_REQ_Q that are used by the
4159  * microcode for DMA addresses or math operations are byte swapped
4160  * to little-endian order.
4161  */
4162 static int
4163 adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
4164               ADV_SCSI_REQ_Q **adv_scsiqpp)
4165 {
4166         adv_req_t *reqp;
4167         ADV_SCSI_REQ_Q *scsiqp;
4168         int i;
4169         int ret;
4170
4171         /*
4172          * Allocate an adv_req_t structure from the board to execute
4173          * the command.
4174          */
4175         if (boardp->adv_reqp == NULL) {
4176                 ASC_DBG(1, "adv_build_req: no free adv_req_t\n");
4177                 ASC_STATS(scp->device->host, adv_build_noreq);
4178                 return ASC_BUSY;
4179         } else {
4180                 reqp = boardp->adv_reqp;
4181                 boardp->adv_reqp = reqp->next_reqp;
4182                 reqp->next_reqp = NULL;
4183         }
4184
4185         /*
4186          * Get 32-byte aligned ADV_SCSI_REQ_Q and ADV_SG_BLOCK pointers.
4187          */
4188         scsiqp = (ADV_SCSI_REQ_Q *)ADV_32BALIGN(&reqp->scsi_req_q);
4189
4190         /*
4191          * Initialize the structure.
4192          */
4193         scsiqp->cntl = scsiqp->scsi_cntl = scsiqp->done_status = 0;
4194
4195         /*
4196          * Set the ADV_SCSI_REQ_Q 'srb_ptr' to point to the adv_req_t structure.
4197          */
4198         scsiqp->srb_ptr = ASC_VADDR_TO_U32(reqp);
4199
4200         /*
4201          * Set the adv_req_t 'cmndp' to point to the struct scsi_cmnd structure.
4202          */
4203         reqp->cmndp = scp;
4204
4205         /*
4206          * Build the ADV_SCSI_REQ_Q request.
4207          */
4208
4209         /*
4210          * Set CDB length and copy it to the request structure.
4211          * For wide  boards a CDB length maximum of 16 bytes
4212          * is supported.
4213          */
4214         if (scp->cmd_len > ADV_MAX_CDB_LEN) {
4215                 ASC_PRINT3
4216                     ("adv_build_req: board %d: cmd_len %d > ADV_MAX_CDB_LEN  %d\n",
4217                      boardp->id, scp->cmd_len, ADV_MAX_CDB_LEN);
4218                 scp->result = HOST_BYTE(DID_ERROR);
4219                 return ASC_ERROR;
4220         }
4221         scsiqp->cdb_len = scp->cmd_len;
4222         /* Copy first 12 CDB bytes to cdb[]. */
4223         for (i = 0; i < scp->cmd_len && i < 12; i++) {
4224                 scsiqp->cdb[i] = scp->cmnd[i];
4225         }
4226         /* Copy last 4 CDB bytes, if present, to cdb16[]. */
4227         for (; i < scp->cmd_len; i++) {
4228                 scsiqp->cdb16[i - 12] = scp->cmnd[i];
4229         }
4230
4231         scsiqp->target_id = scp->device->id;
4232         scsiqp->target_lun = scp->device->lun;
4233
4234         scsiqp->sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
4235         scsiqp->sense_len = sizeof(scp->sense_buffer);
4236
4237         /*
4238          * Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
4239          * buffer command.
4240          */
4241
4242         scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
4243         scsiqp->vdata_addr = scp->request_buffer;
4244         scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
4245
4246         if (scp->use_sg == 0) {
4247                 /*
4248                  * CDB request of single contiguous buffer.
4249                  */
4250                 reqp->sgblkp = NULL;
4251                 scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
4252                 if (scp->request_bufflen) {
4253                         scsiqp->vdata_addr = scp->request_buffer;
4254                         scp->SCp.dma_handle =
4255                             dma_map_single(boardp->dev, scp->request_buffer,
4256                                            scp->request_bufflen,
4257                                            scp->sc_data_direction);
4258                 } else {
4259                         scsiqp->vdata_addr = NULL;
4260                         scp->SCp.dma_handle = 0;
4261                 }
4262                 scsiqp->data_addr = cpu_to_le32(scp->SCp.dma_handle);
4263                 scsiqp->sg_list_ptr = NULL;
4264                 scsiqp->sg_real_addr = 0;
4265                 ASC_STATS(scp->device->host, cont_cnt);
4266                 ASC_STATS_ADD(scp->device->host, cont_xfer,
4267                               ASC_CEILING(scp->request_bufflen, 512));
4268         } else {
4269                 /*
4270                  * CDB scatter-gather request list.
4271                  */
4272                 struct scatterlist *slp;
4273                 int use_sg;
4274
4275                 slp = (struct scatterlist *)scp->request_buffer;
4276                 use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
4277                                     scp->sc_data_direction);
4278
4279                 if (use_sg > ADV_MAX_SG_LIST) {
4280                         ASC_PRINT3("adv_build_req: board %d: use_sg %d > "
4281                                    "ADV_MAX_SG_LIST %d\n", boardp->id, use_sg,
4282                                    scp->device->host->sg_tablesize);
4283                         dma_unmap_sg(boardp->dev, slp, scp->use_sg,
4284                                      scp->sc_data_direction);
4285                         scp->result = HOST_BYTE(DID_ERROR);
4286
4287                         /*
4288                          * Free the 'adv_req_t' structure by adding it back
4289                          * to the board free list.
4290                          */
4291                         reqp->next_reqp = boardp->adv_reqp;
4292                         boardp->adv_reqp = reqp;
4293
4294                         return ASC_ERROR;
4295                 }
4296
4297                 ret = adv_get_sglist(boardp, reqp, scp, use_sg);
4298                 if (ret != ADV_SUCCESS) {
4299                         /*
4300                          * Free the adv_req_t structure by adding it back to
4301                          * the board free list.
4302                          */
4303                         reqp->next_reqp = boardp->adv_reqp;
4304                         boardp->adv_reqp = reqp;
4305
4306                         return ret;
4307                 }
4308
4309                 ASC_STATS(scp->device->host, sg_cnt);
4310                 ASC_STATS_ADD(scp->device->host, sg_elem, use_sg);
4311         }
4312
4313         ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
4314         ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
4315
4316         *adv_scsiqpp = scsiqp;
4317
4318         return ASC_NOERROR;
4319 }
4320
4321 /*
4322  * Build scatter-gather list for Adv Library (Wide Board).
4323  *
4324  * Additional ADV_SG_BLOCK structures will need to be allocated
4325  * if the total number of scatter-gather elements exceeds
4326  * NO_OF_SG_PER_BLOCK (15). The ADV_SG_BLOCK structures are
4327  * assumed to be physically contiguous.
4328  *
4329  * Return:
4330  *      ADV_SUCCESS(1) - SG List successfully created
4331  *      ADV_ERROR(-1) - SG List creation failed
4332  */
4333 static int
4334 adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, struct scsi_cmnd *scp,
4335                int use_sg)
4336 {
4337         adv_sgblk_t *sgblkp;
4338         ADV_SCSI_REQ_Q *scsiqp;
4339         struct scatterlist *slp;
4340         int sg_elem_cnt;
4341         ADV_SG_BLOCK *sg_block, *prev_sg_block;
4342         ADV_PADDR sg_block_paddr;
4343         int i;
4344
4345         scsiqp = (ADV_SCSI_REQ_Q *)ADV_32BALIGN(&reqp->scsi_req_q);
4346         slp = (struct scatterlist *)scp->request_buffer;
4347         sg_elem_cnt = use_sg;
4348         prev_sg_block = NULL;
4349         reqp->sgblkp = NULL;
4350
4351         do {
4352                 /*
4353                  * Allocate a 'adv_sgblk_t' structure from the board free
4354                  * list. One 'adv_sgblk_t' structure holds NO_OF_SG_PER_BLOCK
4355                  * (15) scatter-gather elements.
4356                  */
4357                 if ((sgblkp = boardp->adv_sgblkp) == NULL) {
4358                         ASC_DBG(1, "adv_get_sglist: no free adv_sgblk_t\n");
4359                         ASC_STATS(scp->device->host, adv_build_nosg);
4360
4361                         /*
4362                          * Allocation failed. Free 'adv_sgblk_t' structures already
4363                          * allocated for the request.
4364                          */
4365                         while ((sgblkp = reqp->sgblkp) != NULL) {
4366                                 /* Remove 'sgblkp' from the request list. */
4367                                 reqp->sgblkp = sgblkp->next_sgblkp;
4368
4369                                 /* Add 'sgblkp' to the board free list. */
4370                                 sgblkp->next_sgblkp = boardp->adv_sgblkp;
4371                                 boardp->adv_sgblkp = sgblkp;
4372                         }
4373                         return ASC_BUSY;
4374                 } else {
4375                         /* Complete 'adv_sgblk_t' board allocation. */
4376                         boardp->adv_sgblkp = sgblkp->next_sgblkp;
4377                         sgblkp->next_sgblkp = NULL;
4378
4379                         /*
4380                          * Get 8 byte aligned virtual and physical addresses for
4381                          * the allocated ADV_SG_BLOCK structure.
4382                          */
4383                         sg_block =
4384                             (ADV_SG_BLOCK *)ADV_8BALIGN(&sgblkp->sg_block);
4385                         sg_block_paddr = virt_to_bus(sg_block);
4386
4387                         /*
4388                          * Check if this is the first 'adv_sgblk_t' for the request.
4389                          */
4390                         if (reqp->sgblkp == NULL) {
4391                                 /* Request's first scatter-gather block. */
4392                                 reqp->sgblkp = sgblkp;
4393
4394                                 /*
4395                                  * Set ADV_SCSI_REQ_T ADV_SG_BLOCK virtual and physical
4396                                  * address pointers.
4397                                  */
4398                                 scsiqp->sg_list_ptr = sg_block;
4399                                 scsiqp->sg_real_addr =
4400                                     cpu_to_le32(sg_block_paddr);
4401                         } else {
4402                                 /* Request's second or later scatter-gather block. */
4403                                 sgblkp->next_sgblkp = reqp->sgblkp;
4404                                 reqp->sgblkp = sgblkp;
4405
4406                                 /*
4407                                  * Point the previous ADV_SG_BLOCK structure to
4408                                  * the newly allocated ADV_SG_BLOCK structure.
4409                                  */
4410                                 ASC_ASSERT(prev_sg_block != NULL);
4411                                 prev_sg_block->sg_ptr =
4412                                     cpu_to_le32(sg_block_paddr);
4413                         }
4414                 }
4415
4416                 for (i = 0; i < NO_OF_SG_PER_BLOCK; i++) {
4417                         sg_block->sg_list[i].sg_addr =
4418                             cpu_to_le32(sg_dma_address(slp));
4419                         sg_block->sg_list[i].sg_count =
4420                             cpu_to_le32(sg_dma_len(slp));
4421                         ASC_STATS_ADD(scp->device->host, sg_xfer,
4422                                       ASC_CEILING(sg_dma_len(slp), 512));
4423
4424                         if (--sg_elem_cnt == 0) {       /* Last ADV_SG_BLOCK and scatter-gather entry. */
4425                                 sg_block->sg_cnt = i + 1;
4426                                 sg_block->sg_ptr = 0L;  /* Last ADV_SG_BLOCK in list. */
4427                                 return ADV_SUCCESS;
4428                         }
4429                         slp++;
4430                 }
4431                 sg_block->sg_cnt = NO_OF_SG_PER_BLOCK;
4432                 prev_sg_block = sg_block;
4433         }
4434         while (1);
4435         /* NOTREACHED */
4436 }
4437
4438 /*
4439  * asc_isr_callback() - Second Level Interrupt Handler called by AscISR().
4440  *
4441  * Interrupt callback function for the Narrow SCSI Asc Library.
4442  */
4443 static void asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
4444 {
4445         asc_board_t *boardp;
4446         struct scsi_cmnd *scp;
4447         struct Scsi_Host *shost;
4448
4449         ASC_DBG2(1, "asc_isr_callback: asc_dvc_varp 0x%lx, qdonep 0x%lx\n",
4450                  (ulong)asc_dvc_varp, (ulong)qdonep);
4451         ASC_DBG_PRT_ASC_QDONE_INFO(2, qdonep);
4452
4453         /*
4454          * Get the struct scsi_cmnd structure and Scsi_Host structure for the
4455          * command that has been completed.
4456          */
4457         scp = (struct scsi_cmnd *)ASC_U32_TO_VADDR(qdonep->d2.srb_ptr);
4458         ASC_DBG1(1, "asc_isr_callback: scp 0x%lx\n", (ulong)scp);
4459
4460         if (scp == NULL) {
4461                 ASC_PRINT("asc_isr_callback: scp is NULL\n");
4462                 return;
4463         }
4464         ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
4465
4466         shost = scp->device->host;
4467         ASC_STATS(shost, callback);
4468         ASC_DBG1(1, "asc_isr_callback: shost 0x%lx\n", (ulong)shost);
4469
4470         /*
4471          * If the request isn't found on the active queue, it may
4472          * have been removed to handle a reset request.
4473          * Display a message and return.
4474          */
4475         boardp = ASC_BOARDP(shost);
4476         ASC_ASSERT(asc_dvc_varp == &boardp->dvc_var.asc_dvc_var);
4477         if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
4478                 ASC_PRINT2
4479                     ("asc_isr_callback: board %d: scp 0x%lx not on active queue\n",
4480                      boardp->id, (ulong)scp);
4481                 return;
4482         }
4483
4484         /*
4485          * 'qdonep' contains the command's ending status.
4486          */
4487         switch (qdonep->d3.done_stat) {
4488         case QD_NO_ERROR:
4489                 ASC_DBG(2, "asc_isr_callback: QD_NO_ERROR\n");
4490                 scp->result = 0;
4491
4492                 /*
4493                  * Check for an underrun condition.
4494                  *
4495                  * If there was no error and an underrun condition, then
4496                  * return the number of underrun bytes.
4497                  */
4498                 if (scp->request_bufflen != 0 && qdonep->remain_bytes != 0 &&
4499                     qdonep->remain_bytes <= scp->request_bufflen) {
4500                         ASC_DBG1(1,
4501                                  "asc_isr_callback: underrun condition %u bytes\n",
4502                                  (unsigned)qdonep->remain_bytes);
4503                         scp->resid = qdonep->remain_bytes;
4504                 }
4505                 break;
4506
4507         case QD_WITH_ERROR:
4508                 ASC_DBG(2, "asc_isr_callback: QD_WITH_ERROR\n");
4509                 switch (qdonep->d3.host_stat) {
4510                 case QHSTA_NO_ERROR:
4511                         if (qdonep->d3.scsi_stat == SAM_STAT_CHECK_CONDITION) {
4512                                 ASC_DBG(2,
4513                                         "asc_isr_callback: SAM_STAT_CHECK_CONDITION\n");
4514                                 ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
4515                                                   sizeof(scp->sense_buffer));
4516                                 /*
4517                                  * Note: The 'status_byte()' macro used by target drivers
4518                                  * defined in scsi.h shifts the status byte returned by
4519                                  * host drivers right by 1 bit. This is why target drivers
4520                                  * also use right shifted status byte definitions. For
4521                                  * instance target drivers use CHECK_CONDITION, defined to
4522                                  * 0x1, instead of the SCSI defined check condition value
4523                                  * of 0x2. Host drivers are supposed to return the status
4524                                  * byte as it is defined by SCSI.
4525                                  */
4526                                 scp->result = DRIVER_BYTE(DRIVER_SENSE) |
4527                                     STATUS_BYTE(qdonep->d3.scsi_stat);
4528                         } else {
4529                                 scp->result = STATUS_BYTE(qdonep->d3.scsi_stat);
4530                         }
4531                         break;
4532
4533                 default:
4534                         /* QHSTA error occurred */
4535                         ASC_DBG1(1, "asc_isr_callback: host_stat 0x%x\n",
4536                                  qdonep->d3.host_stat);
4537                         scp->result = HOST_BYTE(DID_BAD_TARGET);
4538                         break;
4539                 }
4540                 break;
4541
4542         case QD_ABORTED_BY_HOST:
4543                 ASC_DBG(1, "asc_isr_callback: QD_ABORTED_BY_HOST\n");
4544                 scp->result =
4545                     HOST_BYTE(DID_ABORT) | MSG_BYTE(qdonep->d3.
4546                                                     scsi_msg) |
4547                     STATUS_BYTE(qdonep->d3.scsi_stat);
4548                 break;
4549
4550         default:
4551                 ASC_DBG1(1, "asc_isr_callback: done_stat 0x%x\n",
4552                          qdonep->d3.done_stat);
4553                 scp->result =
4554                     HOST_BYTE(DID_ERROR) | MSG_BYTE(qdonep->d3.
4555                                                     scsi_msg) |
4556                     STATUS_BYTE(qdonep->d3.scsi_stat);
4557                 break;
4558         }
4559
4560         /*
4561          * If the 'init_tidmask' bit isn't already set for the target and the
4562          * current request finished normally, then set the bit for the target
4563          * to indicate that a device is present.
4564          */
4565         if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
4566             qdonep->d3.done_stat == QD_NO_ERROR &&
4567             qdonep->d3.host_stat == QHSTA_NO_ERROR) {
4568                 boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
4569         }
4570
4571         asc_scsi_done(scp);
4572
4573         return;
4574 }
4575
4576 /*
4577  * adv_isr_callback() - Second Level Interrupt Handler called by AdvISR().
4578  *
4579  * Callback function for the Wide SCSI Adv Library.
4580  */
4581 static void adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp, ADV_SCSI_REQ_Q *scsiqp)
4582 {
4583         asc_board_t *boardp;
4584         adv_req_t *reqp;
4585         adv_sgblk_t *sgblkp;
4586         struct scsi_cmnd *scp;
4587         struct Scsi_Host *shost;
4588         ADV_DCNT resid_cnt;
4589
4590         ASC_DBG2(1, "adv_isr_callback: adv_dvc_varp 0x%lx, scsiqp 0x%lx\n",
4591                  (ulong)adv_dvc_varp, (ulong)scsiqp);
4592         ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
4593
4594         /*
4595          * Get the adv_req_t structure for the command that has been
4596          * completed. The adv_req_t structure actually contains the
4597          * completed ADV_SCSI_REQ_Q structure.
4598          */
4599         reqp = (adv_req_t *)ADV_U32_TO_VADDR(scsiqp->srb_ptr);
4600         ASC_DBG1(1, "adv_isr_callback: reqp 0x%lx\n", (ulong)reqp);
4601         if (reqp == NULL) {
4602                 ASC_PRINT("adv_isr_callback: reqp is NULL\n");
4603                 return;
4604         }
4605
4606         /*
4607          * Get the struct scsi_cmnd structure and Scsi_Host structure for the
4608          * command that has been completed.
4609          *
4610          * Note: The adv_req_t request structure and adv_sgblk_t structure,
4611          * if any, are dropped, because a board structure pointer can not be
4612          * determined.
4613          */
4614         scp = reqp->cmndp;
4615         ASC_DBG1(1, "adv_isr_callback: scp 0x%lx\n", (ulong)scp);
4616         if (scp == NULL) {
4617                 ASC_PRINT
4618                     ("adv_isr_callback: scp is NULL; adv_req_t dropped.\n");
4619                 return;
4620         }
4621         ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
4622
4623         shost = scp->device->host;
4624         ASC_STATS(shost, callback);
4625         ASC_DBG1(1, "adv_isr_callback: shost 0x%lx\n", (ulong)shost);
4626
4627         /*
4628          * If the request isn't found on the active queue, it may have been
4629          * removed to handle a reset request. Display a message and return.
4630          *
4631          * Note: Because the structure may still be in use don't attempt
4632          * to free the adv_req_t and adv_sgblk_t, if any, structures.
4633          */
4634         boardp = ASC_BOARDP(shost);
4635         ASC_ASSERT(adv_dvc_varp == &boardp->dvc_var.adv_dvc_var);
4636         if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
4637                 ASC_PRINT2
4638                     ("adv_isr_callback: board %d: scp 0x%lx not on active queue\n",
4639                      boardp->id, (ulong)scp);
4640                 return;
4641         }
4642
4643         /*
4644          * 'done_status' contains the command's ending status.
4645          */
4646         switch (scsiqp->done_status) {
4647         case QD_NO_ERROR:
4648                 ASC_DBG(2, "adv_isr_callback: QD_NO_ERROR\n");
4649                 scp->result = 0;
4650
4651                 /*
4652                  * Check for an underrun condition.
4653                  *
4654                  * If there was no error and an underrun condition, then
4655                  * then return the number of underrun bytes.
4656                  */
4657                 resid_cnt = le32_to_cpu(scsiqp->data_cnt);
4658                 if (scp->request_bufflen != 0 && resid_cnt != 0 &&
4659                     resid_cnt <= scp->request_bufflen) {
4660                         ASC_DBG1(1,
4661                                  "adv_isr_callback: underrun condition %lu bytes\n",
4662                                  (ulong)resid_cnt);
4663                         scp->resid = resid_cnt;
4664                 }
4665                 break;
4666
4667         case QD_WITH_ERROR:
4668                 ASC_DBG(2, "adv_isr_callback: QD_WITH_ERROR\n");
4669                 switch (scsiqp->host_status) {
4670                 case QHSTA_NO_ERROR:
4671                         if (scsiqp->scsi_status == SAM_STAT_CHECK_CONDITION) {
4672                                 ASC_DBG(2,
4673                                         "adv_isr_callback: SAM_STAT_CHECK_CONDITION\n");
4674                                 ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
4675                                                   sizeof(scp->sense_buffer));
4676                                 /*
4677                                  * Note: The 'status_byte()' macro used by target drivers
4678                                  * defined in scsi.h shifts the status byte returned by
4679                                  * host drivers right by 1 bit. This is why target drivers
4680                                  * also use right shifted status byte definitions. For
4681                                  * instance target drivers use CHECK_CONDITION, defined to
4682                                  * 0x1, instead of the SCSI defined check condition value
4683                                  * of 0x2. Host drivers are supposed to return the status
4684                                  * byte as it is defined by SCSI.
4685                                  */
4686                                 scp->result = DRIVER_BYTE(DRIVER_SENSE) |
4687                                     STATUS_BYTE(scsiqp->scsi_status);
4688                         } else {
4689                                 scp->result = STATUS_BYTE(scsiqp->scsi_status);
4690                         }
4691                         break;
4692
4693                 default:
4694                         /* Some other QHSTA error occurred. */
4695                         ASC_DBG1(1, "adv_isr_callback: host_status 0x%x\n",
4696                                  scsiqp->host_status);
4697                         scp->result = HOST_BYTE(DID_BAD_TARGET);
4698                         break;
4699                 }
4700                 break;
4701
4702         case QD_ABORTED_BY_HOST:
4703                 ASC_DBG(1, "adv_isr_callback: QD_ABORTED_BY_HOST\n");
4704                 scp->result =
4705                     HOST_BYTE(DID_ABORT) | STATUS_BYTE(scsiqp->scsi_status);
4706                 break;
4707
4708         default:
4709                 ASC_DBG1(1, "adv_isr_callback: done_status 0x%x\n",
4710                          scsiqp->done_status);
4711                 scp->result =
4712                     HOST_BYTE(DID_ERROR) | STATUS_BYTE(scsiqp->scsi_status);
4713                 break;
4714         }
4715
4716         /*
4717          * If the 'init_tidmask' bit isn't already set for the target and the
4718          * current request finished normally, then set the bit for the target
4719          * to indicate that a device is present.
4720          */
4721         if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
4722             scsiqp->done_status == QD_NO_ERROR &&
4723             scsiqp->host_status == QHSTA_NO_ERROR) {
4724                 boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
4725         }
4726
4727         asc_scsi_done(scp);
4728
4729         /*
4730          * Free all 'adv_sgblk_t' structures allocated for the request.
4731          */
4732         while ((sgblkp = reqp->sgblkp) != NULL) {
4733                 /* Remove 'sgblkp' from the request list. */
4734                 reqp->sgblkp = sgblkp->next_sgblkp;
4735
4736                 /* Add 'sgblkp' to the board free list. */
4737                 sgblkp->next_sgblkp = boardp->adv_sgblkp;
4738                 boardp->adv_sgblkp = sgblkp;
4739         }
4740
4741         /*
4742          * Free the adv_req_t structure used with the command by adding
4743          * it back to the board free list.
4744          */
4745         reqp->next_reqp = boardp->adv_reqp;
4746         boardp->adv_reqp = reqp;
4747
4748         ASC_DBG(1, "adv_isr_callback: done\n");
4749
4750         return;
4751 }
4752
4753 /*
4754  * adv_async_callback() - Adv Library asynchronous event callback function.
4755  */
4756 static void adv_async_callback(ADV_DVC_VAR *adv_dvc_varp, uchar code)
4757 {
4758         switch (code) {
4759         case ADV_ASYNC_SCSI_BUS_RESET_DET:
4760                 /*
4761                  * The firmware detected a SCSI Bus reset.
4762                  */
4763                 ASC_DBG(0,
4764                         "adv_async_callback: ADV_ASYNC_SCSI_BUS_RESET_DET\n");
4765                 break;
4766
4767         case ADV_ASYNC_RDMA_FAILURE:
4768                 /*
4769                  * Handle RDMA failure by resetting the SCSI Bus and
4770                  * possibly the chip if it is unresponsive. Log the error
4771                  * with a unique code.
4772                  */
4773                 ASC_DBG(0, "adv_async_callback: ADV_ASYNC_RDMA_FAILURE\n");
4774                 AdvResetChipAndSB(adv_dvc_varp);
4775                 break;
4776
4777         case ADV_HOST_SCSI_BUS_RESET:
4778                 /*
4779                  * Host generated SCSI bus reset occurred.
4780                  */
4781                 ASC_DBG(0, "adv_async_callback: ADV_HOST_SCSI_BUS_RESET\n");
4782                 break;
4783
4784         default:
4785                 ASC_DBG1(0, "DvcAsyncCallBack: unknown code 0x%x\n", code);
4786                 break;
4787         }
4788 }
4789
4790 /*
4791  * Add a 'REQP' to the end of specified queue. Set 'tidmask'
4792  * to indicate a command is queued for the device.
4793  *
4794  * 'flag' may be either ASC_FRONT or ASC_BACK.
4795  *
4796  * 'REQPNEXT(reqp)' returns reqp's next pointer.
4797  */
4798 static void asc_enqueue(asc_queue_t *ascq, REQP reqp, int flag)
4799 {
4800         int tid;
4801
4802         ASC_DBG3(3, "asc_enqueue: ascq 0x%lx, reqp 0x%lx, flag %d\n",
4803                  (ulong)ascq, (ulong)reqp, flag);
4804         ASC_ASSERT(reqp != NULL);
4805         ASC_ASSERT(flag == ASC_FRONT || flag == ASC_BACK);
4806         tid = REQPTID(reqp);
4807         ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
4808         if (flag == ASC_FRONT) {
4809                 reqp->host_scribble = (unsigned char *)ascq->q_first[tid];
4810                 ascq->q_first[tid] = reqp;
4811                 /* If the queue was empty, set the last pointer. */
4812                 if (ascq->q_last[tid] == NULL) {
4813                         ascq->q_last[tid] = reqp;
4814                 }
4815         } else {                /* ASC_BACK */
4816                 if (ascq->q_last[tid] != NULL) {
4817                         ascq->q_last[tid]->host_scribble =
4818                             (unsigned char *)reqp;
4819                 }
4820                 ascq->q_last[tid] = reqp;
4821                 reqp->host_scribble = NULL;
4822                 /* If the queue was empty, set the first pointer. */
4823                 if (ascq->q_first[tid] == NULL) {
4824                         ascq->q_first[tid] = reqp;
4825                 }
4826         }
4827         /* The queue has at least one entry, set its bit. */
4828         ascq->q_tidmask |= ADV_TID_TO_TIDMASK(tid);
4829 #ifdef ADVANSYS_STATS
4830         /* Maintain request queue statistics. */
4831         ascq->q_tot_cnt[tid]++;
4832         ascq->q_cur_cnt[tid]++;
4833         if (ascq->q_cur_cnt[tid] > ascq->q_max_cnt[tid]) {
4834                 ascq->q_max_cnt[tid] = ascq->q_cur_cnt[tid];
4835                 ASC_DBG2(2, "asc_enqueue: new q_max_cnt[%d] %d\n",
4836                          tid, ascq->q_max_cnt[tid]);
4837         }
4838         REQPTIME(reqp) = REQTIMESTAMP();
4839 #endif /* ADVANSYS_STATS */
4840         ASC_DBG1(3, "asc_enqueue: reqp 0x%lx\n", (ulong)reqp);
4841         return;
4842 }
4843
4844 /*
4845  * Return a pointer to a singly linked list of all the requests queued
4846  * for 'tid' on the 'asc_queue_t' pointed to by 'ascq'.
4847  *
4848  * If 'lastpp' is not NULL, '*lastpp' will be set to point to the
4849  * the last request returned in the singly linked list.
4850  *
4851  * 'tid' should either be a valid target id or if it is ASC_TID_ALL,
4852  * then all queued requests are concatenated into one list and
4853  * returned.
4854  *
4855  * Note: If 'lastpp' is used to append a new list to the end of
4856  * an old list, only change the old list last pointer if '*lastpp'
4857  * (or the function return value) is not NULL, i.e. use a temporary
4858  * variable for 'lastpp' and check its value after the function return
4859  * before assigning it to the list last pointer.
4860  *
4861  * Unfortunately collecting queuing time statistics adds overhead to
4862  * the function that isn't inherent to the function's algorithm.
4863  */
4864 static REQP asc_dequeue_list(asc_queue_t *ascq, REQP *lastpp, int tid)
4865 {
4866         REQP firstp, lastp;
4867         int i;
4868
4869         ASC_DBG2(3, "asc_dequeue_list: ascq 0x%lx, tid %d\n", (ulong)ascq, tid);
4870         ASC_ASSERT((tid == ASC_TID_ALL) || (tid >= 0 && tid <= ADV_MAX_TID));
4871
4872         /*
4873          * If 'tid' is not ASC_TID_ALL, return requests only for
4874          * the specified 'tid'. If 'tid' is ASC_TID_ALL, return all
4875          * requests for all tids.
4876          */
4877         if (tid != ASC_TID_ALL) {
4878                 /* Return all requests for the specified 'tid'. */
4879                 if ((ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid)) == 0) {
4880                         /* List is empty; Set first and last return pointers to NULL. */
4881                         firstp = lastp = NULL;
4882                 } else {
4883                         firstp = ascq->q_first[tid];
4884                         lastp = ascq->q_last[tid];
4885                         ascq->q_first[tid] = ascq->q_last[tid] = NULL;
4886                         ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
4887 #ifdef ADVANSYS_STATS
4888                         {
4889                                 REQP reqp;
4890                                 ascq->q_cur_cnt[tid] = 0;
4891                                 for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
4892                                         REQTIMESTAT("asc_dequeue_list", ascq,
4893                                                     reqp, tid);
4894                                 }
4895                         }
4896 #endif /* ADVANSYS_STATS */
4897                 }
4898         } else {
4899                 /* Return all requests for all tids. */
4900                 firstp = lastp = NULL;
4901                 for (i = 0; i <= ADV_MAX_TID; i++) {
4902                         if (ascq->q_tidmask & ADV_TID_TO_TIDMASK(i)) {
4903                                 if (firstp == NULL) {
4904                                         firstp = ascq->q_first[i];
4905                                         lastp = ascq->q_last[i];
4906                                 } else {
4907                                         ASC_ASSERT(lastp != NULL);
4908                                         lastp->host_scribble =
4909                                             (unsigned char *)ascq->q_first[i];
4910                                         lastp = ascq->q_last[i];
4911                                 }
4912                                 ascq->q_first[i] = ascq->q_last[i] = NULL;
4913                                 ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(i);
4914 #ifdef ADVANSYS_STATS
4915                                 ascq->q_cur_cnt[i] = 0;
4916 #endif /* ADVANSYS_STATS */
4917                         }
4918                 }
4919 #ifdef ADVANSYS_STATS
4920                 {
4921                         REQP reqp;
4922                         for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
4923                                 REQTIMESTAT("asc_dequeue_list", ascq, reqp,
4924                                             reqp->device->id);
4925                         }
4926                 }
4927 #endif /* ADVANSYS_STATS */
4928         }
4929         if (lastpp) {
4930                 *lastpp = lastp;
4931         }
4932         ASC_DBG1(3, "asc_dequeue_list: firstp 0x%lx\n", (ulong)firstp);
4933         return firstp;
4934 }
4935
4936 /*
4937  * Remove the specified 'REQP' from the specified queue for
4938  * the specified target device. Clear the 'tidmask' bit for the
4939  * device if no more commands are left queued for it.
4940  *
4941  * 'REQPNEXT(reqp)' returns reqp's the next pointer.
4942  *
4943  * Return ASC_TRUE if the command was found and removed,
4944  * otherwise return ASC_FALSE.
4945  */
4946 static int asc_rmqueue(asc_queue_t *ascq, REQP reqp)
4947 {
4948         REQP currp, prevp;
4949         int tid;
4950         int ret = ASC_FALSE;
4951
4952         ASC_DBG2(3, "asc_rmqueue: ascq 0x%lx, reqp 0x%lx\n",
4953                  (ulong)ascq, (ulong)reqp);
4954         ASC_ASSERT(reqp != NULL);
4955
4956         tid = REQPTID(reqp);
4957         ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
4958
4959         /*
4960          * Handle the common case of 'reqp' being the first
4961          * entry on the queue.
4962          */
4963         if (reqp == ascq->q_first[tid]) {
4964                 ret = ASC_TRUE;
4965                 ascq->q_first[tid] = REQPNEXT(reqp);
4966                 /* If the queue is now empty, clear its bit and the last pointer. */
4967                 if (ascq->q_first[tid] == NULL) {
4968                         ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
4969                         ASC_ASSERT(ascq->q_last[tid] == reqp);
4970                         ascq->q_last[tid] = NULL;
4971                 }
4972         } else if (ascq->q_first[tid] != NULL) {
4973                 ASC_ASSERT(ascq->q_last[tid] != NULL);
4974                 /*
4975                  * Because the case of 'reqp' being the first entry has been
4976                  * handled above and it is known the queue is not empty, if
4977                  * 'reqp' is found on the queue it is guaranteed the queue will
4978                  * not become empty and that 'q_first[tid]' will not be changed.
4979                  *
4980                  * Set 'prevp' to the first entry, 'currp' to the second entry,
4981                  * and search for 'reqp'.
4982                  */
4983                 for (prevp = ascq->q_first[tid], currp = REQPNEXT(prevp);
4984                      currp; prevp = currp, currp = REQPNEXT(currp)) {
4985                         if (currp == reqp) {
4986                                 ret = ASC_TRUE;
4987                                 prevp->host_scribble =
4988                                     (unsigned char *)REQPNEXT(currp);
4989                                 reqp->host_scribble = NULL;
4990                                 if (ascq->q_last[tid] == reqp) {
4991                                         ascq->q_last[tid] = prevp;
4992                                 }
4993                                 break;
4994                         }
4995                 }
4996         }
4997 #ifdef ADVANSYS_STATS
4998         /* Maintain request queue statistics. */
4999         if (ret == ASC_TRUE) {
5000                 ascq->q_cur_cnt[tid]--;
5001                 REQTIMESTAT("asc_rmqueue", ascq, reqp, tid);
5002         }
5003         ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
5004 #endif /* ADVANSYS_STATS */
5005         ASC_DBG2(3, "asc_rmqueue: reqp 0x%lx, ret %d\n", (ulong)reqp, ret);
5006         return ret;
5007 }
5008
5009 #ifdef CONFIG_PROC_FS
5010 /*
5011  * asc_prt_board_devices()
5012  *
5013  * Print driver information for devices attached to the board.
5014  *
5015  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
5016  * cf. asc_prt_line().
5017  *
5018  * Return the number of characters copied into 'cp'. No more than
5019  * 'cplen' characters will be copied to 'cp'.
5020  */
5021 static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
5022 {
5023         asc_board_t *boardp;
5024         int leftlen;
5025         int totlen;
5026         int len;
5027         int chip_scsi_id;
5028         int i;
5029
5030         boardp = ASC_BOARDP(shost);
5031         leftlen = cplen;
5032         totlen = len = 0;
5033
5034         len = asc_prt_line(cp, leftlen,
5035                            "\nDevice Information for AdvanSys SCSI Host %d:\n",
5036                            shost->host_no);
5037         ASC_PRT_NEXT();
5038
5039         if (ASC_NARROW_BOARD(boardp)) {
5040                 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
5041         } else {
5042                 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
5043         }
5044
5045         len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
5046         ASC_PRT_NEXT();
5047         for (i = 0; i <= ADV_MAX_TID; i++) {
5048                 if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
5049                         len = asc_prt_line(cp, leftlen, " %X,", i);
5050                         ASC_PRT_NEXT();
5051                 }
5052         }
5053         len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id);
5054         ASC_PRT_NEXT();
5055
5056         return totlen;
5057 }
5058
5059 /*
5060  * Display Wide Board BIOS Information.
5061  */
5062 static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
5063 {
5064         asc_board_t *boardp;
5065         int leftlen;
5066         int totlen;
5067         int len;
5068         ushort major, minor, letter;
5069
5070         boardp = ASC_BOARDP(shost);
5071         leftlen = cplen;
5072         totlen = len = 0;
5073
5074         len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
5075         ASC_PRT_NEXT();
5076
5077         /*
5078          * If the BIOS saved a valid signature, then fill in
5079          * the BIOS code segment base address.
5080          */
5081         if (boardp->bios_signature != 0x55AA) {
5082                 len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n");
5083                 ASC_PRT_NEXT();
5084                 len = asc_prt_line(cp, leftlen,
5085                                    "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
5086                 ASC_PRT_NEXT();
5087                 len = asc_prt_line(cp, leftlen,
5088                                    "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
5089                 ASC_PRT_NEXT();
5090         } else {
5091                 major = (boardp->bios_version >> 12) & 0xF;
5092                 minor = (boardp->bios_version >> 8) & 0xF;
5093                 letter = (boardp->bios_version & 0xFF);
5094
5095                 len = asc_prt_line(cp, leftlen, "%d.%d%c\n",
5096                                    major, minor,
5097                                    letter >= 26 ? '?' : letter + 'A');
5098                 ASC_PRT_NEXT();
5099
5100                 /*
5101                  * Current available ROM BIOS release is 3.1I for UW
5102                  * and 3.2I for U2W. This code doesn't differentiate
5103                  * UW and U2W boards.
5104                  */
5105                 if (major < 3 || (major <= 3 && minor < 1) ||
5106                     (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) {
5107                         len = asc_prt_line(cp, leftlen,
5108                                            "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
5109                         ASC_PRT_NEXT();
5110                         len = asc_prt_line(cp, leftlen,
5111                                            "ftp://ftp.connectcom.net/pub\n");
5112                         ASC_PRT_NEXT();
5113                 }
5114         }
5115
5116         return totlen;
5117 }
5118
5119 /*
5120  * Add serial number to information bar if signature AAh
5121  * is found in at bit 15-9 (7 bits) of word 1.
5122  *
5123  * Serial Number consists fo 12 alpha-numeric digits.
5124  *
5125  *       1 - Product type (A,B,C,D..)  Word0: 15-13 (3 bits)
5126  *       2 - MFG Location (A,B,C,D..)  Word0: 12-10 (3 bits)
5127  *     3-4 - Product ID (0-99)         Word0: 9-0 (10 bits)
5128  *       5 - Product revision (A-J)    Word0:  "         "
5129  *
5130  *           Signature                 Word1: 15-9 (7 bits)
5131  *       6 - Year (0-9)                Word1: 8-6 (3 bits) & Word2: 15 (1 bit)
5132  *     7-8 - Week of the year (1-52)   Word1: 5-0 (6 bits)
5133  *
5134  *    9-12 - Serial Number (A001-Z999) Word2: 14-0 (15 bits)
5135  *
5136  * Note 1: Only production cards will have a serial number.
5137  *
5138  * Note 2: Signature is most significant 7 bits (0xFE).
5139  *
5140  * Returns ASC_TRUE if serial number found, otherwise returns ASC_FALSE.
5141  */
5142 static int asc_get_eeprom_string(ushort *serialnum, uchar *cp)
5143 {
5144         ushort w, num;
5145
5146         if ((serialnum[1] & 0xFE00) != ((ushort)0xAA << 8)) {
5147                 return ASC_FALSE;
5148         } else {
5149                 /*
5150                  * First word - 6 digits.
5151                  */
5152                 w = serialnum[0];
5153
5154                 /* Product type - 1st digit. */
5155                 if ((*cp = 'A' + ((w & 0xE000) >> 13)) == 'H') {
5156                         /* Product type is P=Prototype */
5157                         *cp += 0x8;
5158                 }
5159                 cp++;
5160
5161                 /* Manufacturing location - 2nd digit. */
5162                 *cp++ = 'A' + ((w & 0x1C00) >> 10);
5163
5164                 /* Product ID - 3rd, 4th digits. */
5165                 num = w & 0x3FF;
5166                 *cp++ = '0' + (num / 100);
5167                 num %= 100;
5168                 *cp++ = '0' + (num / 10);
5169
5170                 /* Product revision - 5th digit. */
5171                 *cp++ = 'A' + (num % 10);
5172
5173                 /*
5174                  * Second word
5175                  */
5176                 w = serialnum[1];
5177
5178                 /*
5179                  * Year - 6th digit.
5180                  *
5181                  * If bit 15 of third word is set, then the
5182                  * last digit of the year is greater than 7.
5183                  */
5184                 if (serialnum[2] & 0x8000) {
5185                         *cp++ = '8' + ((w & 0x1C0) >> 6);
5186                 } else {
5187                         *cp++ = '0' + ((w & 0x1C0) >> 6);
5188                 }
5189
5190                 /* Week of year - 7th, 8th digits. */
5191                 num = w & 0x003F;
5192                 *cp++ = '0' + num / 10;
5193                 num %= 10;
5194                 *cp++ = '0' + num;
5195
5196                 /*
5197                  * Third word
5198                  */
5199                 w = serialnum[2] & 0x7FFF;
5200
5201                 /* Serial number - 9th digit. */
5202                 *cp++ = 'A' + (w / 1000);
5203
5204                 /* 10th, 11th, 12th digits. */
5205                 num = w % 1000;
5206                 *cp++ = '0' + num / 100;
5207                 num %= 100;
5208                 *cp++ = '0' + num / 10;
5209                 num %= 10;
5210                 *cp++ = '0' + num;
5211
5212                 *cp = '\0';     /* Null Terminate the string. */
5213                 return ASC_TRUE;
5214         }
5215 }
5216
5217 /*
5218  * asc_prt_asc_board_eeprom()
5219  *
5220  * Print board EEPROM configuration.
5221  *
5222  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
5223  * cf. asc_prt_line().
5224  *
5225  * Return the number of characters copied into 'cp'. No more than
5226  * 'cplen' characters will be copied to 'cp'.
5227  */
5228 static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
5229 {
5230         asc_board_t *boardp;
5231         ASC_DVC_VAR *asc_dvc_varp;
5232         int leftlen;
5233         int totlen;
5234         int len;
5235         ASCEEP_CONFIG *ep;
5236         int i;
5237 #ifdef CONFIG_ISA
5238         int isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 };
5239 #endif /* CONFIG_ISA */
5240         uchar serialstr[13];
5241
5242         boardp = ASC_BOARDP(shost);
5243         asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
5244         ep = &boardp->eep_config.asc_eep;
5245
5246         leftlen = cplen;
5247         totlen = len = 0;
5248
5249         len = asc_prt_line(cp, leftlen,
5250                            "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
5251                            shost->host_no);
5252         ASC_PRT_NEXT();
5253
5254         if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr)
5255             == ASC_TRUE) {
5256                 len =
5257                     asc_prt_line(cp, leftlen, " Serial Number: %s\n",
5258                                  serialstr);
5259                 ASC_PRT_NEXT();
5260         } else {
5261                 if (ep->adapter_info[5] == 0xBB) {
5262                         len = asc_prt_line(cp, leftlen,
5263                                            " Default Settings Used for EEPROM-less Adapter.\n");
5264                         ASC_PRT_NEXT();
5265                 } else {
5266                         len = asc_prt_line(cp, leftlen,
5267                                            " Serial Number Signature Not Present.\n");
5268                         ASC_PRT_NEXT();
5269                 }
5270         }
5271
5272         len = asc_prt_line(cp, leftlen,
5273                            " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
5274                            ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
5275                            ep->max_tag_qng);
5276         ASC_PRT_NEXT();
5277
5278         len = asc_prt_line(cp, leftlen,
5279                            " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
5280         ASC_PRT_NEXT();
5281
5282         len = asc_prt_line(cp, leftlen, " Target ID:           ");
5283         ASC_PRT_NEXT();
5284         for (i = 0; i <= ASC_MAX_TID; i++) {
5285                 len = asc_prt_line(cp, leftlen, " %d", i);
5286                 ASC_PRT_NEXT();
5287         }
5288         len = asc_prt_line(cp, leftlen, "\n");
5289         ASC_PRT_NEXT();
5290
5291         len = asc_prt_line(cp, leftlen, " Disconnects:         ");
5292         ASC_PRT_NEXT();
5293         for (i = 0; i <= ASC_MAX_TID; i++) {
5294                 len = asc_prt_line(cp, leftlen, " %c",
5295                                    (ep->
5296                                     disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
5297                                    'N');
5298                 ASC_PRT_NEXT();
5299         }
5300         len = asc_prt_line(cp, leftlen, "\n");
5301         ASC_PRT_NEXT();
5302
5303         len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
5304         ASC_PRT_NEXT();
5305         for (i = 0; i <= ASC_MAX_TID; i++) {
5306                 len = asc_prt_line(cp, leftlen, " %c",
5307                                    (ep->
5308                                     use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
5309                                    'N');
5310                 ASC_PRT_NEXT();
5311         }
5312         len = asc_prt_line(cp, leftlen, "\n");
5313         ASC_PRT_NEXT();
5314
5315         len = asc_prt_line(cp, leftlen, " Start Motor:         ");
5316         ASC_PRT_NEXT();
5317         for (i = 0; i <= ASC_MAX_TID; i++) {
5318                 len = asc_prt_line(cp, leftlen, " %c",
5319                                    (ep->
5320                                     start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
5321                                    'N');
5322                 ASC_PRT_NEXT();
5323         }
5324         len = asc_prt_line(cp, leftlen, "\n");
5325         ASC_PRT_NEXT();
5326
5327         len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
5328         ASC_PRT_NEXT();
5329         for (i = 0; i <= ASC_MAX_TID; i++) {
5330                 len = asc_prt_line(cp, leftlen, " %c",
5331                                    (ep->
5332                                     init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
5333                                    'N');
5334                 ASC_PRT_NEXT();
5335         }
5336         len = asc_prt_line(cp, leftlen, "\n");
5337         ASC_PRT_NEXT();
5338
5339 #ifdef CONFIG_ISA
5340         if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
5341                 len = asc_prt_line(cp, leftlen,
5342                                    " Host ISA DMA speed:   %d MB/S\n",
5343                                    isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
5344                 ASC_PRT_NEXT();
5345         }
5346 #endif /* CONFIG_ISA */
5347
5348         return totlen;
5349 }
5350
5351 /*
5352  * asc_prt_adv_board_eeprom()
5353  *
5354  * Print board EEPROM configuration.
5355  *
5356  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
5357  * cf. asc_prt_line().
5358  *
5359  * Return the number of characters copied into 'cp'. No more than
5360  * 'cplen' characters will be copied to 'cp'.
5361  */
5362 static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
5363 {
5364         asc_board_t *boardp;
5365         ADV_DVC_VAR *adv_dvc_varp;
5366         int leftlen;
5367         int totlen;
5368         int len;
5369         int i;
5370         char *termstr;
5371         uchar serialstr[13];
5372         ADVEEP_3550_CONFIG *ep_3550 = NULL;
5373         ADVEEP_38C0800_CONFIG *ep_38C0800 = NULL;
5374         ADVEEP_38C1600_CONFIG *ep_38C1600 = NULL;
5375         ushort word;
5376         ushort *wordp;
5377         ushort sdtr_speed = 0;
5378
5379         boardp = ASC_BOARDP(shost);
5380         adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
5381         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5382                 ep_3550 = &boardp->eep_config.adv_3550_eep;
5383         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5384                 ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
5385         } else {
5386                 ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
5387         }
5388
5389         leftlen = cplen;
5390         totlen = len = 0;
5391
5392         len = asc_prt_line(cp, leftlen,
5393                            "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
5394                            shost->host_no);
5395         ASC_PRT_NEXT();
5396
5397         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5398                 wordp = &ep_3550->serial_number_word1;
5399         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5400                 wordp = &ep_38C0800->serial_number_word1;
5401         } else {
5402                 wordp = &ep_38C1600->serial_number_word1;
5403         }
5404
5405         if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
5406                 len =
5407                     asc_prt_line(cp, leftlen, " Serial Number: %s\n",
5408                                  serialstr);
5409                 ASC_PRT_NEXT();
5410         } else {
5411                 len = asc_prt_line(cp, leftlen,
5412                                    " Serial Number Signature Not Present.\n");
5413                 ASC_PRT_NEXT();
5414         }
5415
5416         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5417                 len = asc_prt_line(cp, leftlen,
5418                                    " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
5419                                    ep_3550->adapter_scsi_id,
5420                                    ep_3550->max_host_qng, ep_3550->max_dvc_qng);
5421                 ASC_PRT_NEXT();
5422         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5423                 len = asc_prt_line(cp, leftlen,
5424                                    " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
5425                                    ep_38C0800->adapter_scsi_id,
5426                                    ep_38C0800->max_host_qng,
5427                                    ep_38C0800->max_dvc_qng);
5428                 ASC_PRT_NEXT();
5429         } else {
5430                 len = asc_prt_line(cp, leftlen,
5431                                    " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
5432                                    ep_38C1600->adapter_scsi_id,
5433                                    ep_38C1600->max_host_qng,
5434                                    ep_38C1600->max_dvc_qng);
5435                 ASC_PRT_NEXT();
5436         }
5437         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5438                 word = ep_3550->termination;
5439         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5440                 word = ep_38C0800->termination_lvd;
5441         } else {
5442                 word = ep_38C1600->termination_lvd;
5443         }
5444         switch (word) {
5445         case 1:
5446                 termstr = "Low Off/High Off";
5447                 break;
5448         case 2:
5449                 termstr = "Low Off/High On";
5450                 break;
5451         case 3:
5452                 termstr = "Low On/High On";
5453                 break;
5454         default:
5455         case 0:
5456                 termstr = "Automatic";
5457                 break;
5458         }
5459
5460         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5461                 len = asc_prt_line(cp, leftlen,
5462                                    " termination: %u (%s), bios_ctrl: 0x%x\n",
5463                                    ep_3550->termination, termstr,
5464                                    ep_3550->bios_ctrl);
5465                 ASC_PRT_NEXT();
5466         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5467                 len = asc_prt_line(cp, leftlen,
5468                                    " termination: %u (%s), bios_ctrl: 0x%x\n",
5469                                    ep_38C0800->termination_lvd, termstr,
5470                                    ep_38C0800->bios_ctrl);
5471                 ASC_PRT_NEXT();
5472         } else {
5473                 len = asc_prt_line(cp, leftlen,
5474                                    " termination: %u (%s), bios_ctrl: 0x%x\n",
5475                                    ep_38C1600->termination_lvd, termstr,
5476                                    ep_38C1600->bios_ctrl);
5477                 ASC_PRT_NEXT();
5478         }
5479
5480         len = asc_prt_line(cp, leftlen, " Target ID:           ");
5481         ASC_PRT_NEXT();
5482         for (i = 0; i <= ADV_MAX_TID; i++) {
5483                 len = asc_prt_line(cp, leftlen, " %X", i);
5484                 ASC_PRT_NEXT();
5485         }
5486         len = asc_prt_line(cp, leftlen, "\n");
5487         ASC_PRT_NEXT();
5488
5489         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5490                 word = ep_3550->disc_enable;
5491         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5492                 word = ep_38C0800->disc_enable;
5493         } else {
5494                 word = ep_38C1600->disc_enable;
5495         }
5496         len = asc_prt_line(cp, leftlen, " Disconnects:         ");
5497         ASC_PRT_NEXT();
5498         for (i = 0; i <= ADV_MAX_TID; i++) {
5499                 len = asc_prt_line(cp, leftlen, " %c",
5500                                    (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
5501                 ASC_PRT_NEXT();
5502         }
5503         len = asc_prt_line(cp, leftlen, "\n");
5504         ASC_PRT_NEXT();
5505
5506         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5507                 word = ep_3550->tagqng_able;
5508         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5509                 word = ep_38C0800->tagqng_able;
5510         } else {
5511                 word = ep_38C1600->tagqng_able;
5512         }
5513         len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
5514         ASC_PRT_NEXT();
5515         for (i = 0; i <= ADV_MAX_TID; i++) {
5516                 len = asc_prt_line(cp, leftlen, " %c",
5517                                    (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
5518                 ASC_PRT_NEXT();
5519         }
5520         len = asc_prt_line(cp, leftlen, "\n");
5521         ASC_PRT_NEXT();
5522
5523         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5524                 word = ep_3550->start_motor;
5525         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5526                 word = ep_38C0800->start_motor;
5527         } else {
5528                 word = ep_38C1600->start_motor;
5529         }
5530         len = asc_prt_line(cp, leftlen, " Start Motor:         ");
5531         ASC_PRT_NEXT();
5532         for (i = 0; i <= ADV_MAX_TID; i++) {
5533                 len = asc_prt_line(cp, leftlen, " %c",
5534                                    (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
5535                 ASC_PRT_NEXT();
5536         }
5537         len = asc_prt_line(cp, leftlen, "\n");
5538         ASC_PRT_NEXT();
5539
5540         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5541                 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
5542                 ASC_PRT_NEXT();
5543                 for (i = 0; i <= ADV_MAX_TID; i++) {
5544                         len = asc_prt_line(cp, leftlen, " %c",
5545                                            (ep_3550->
5546                                             sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
5547                                            'Y' : 'N');
5548                         ASC_PRT_NEXT();
5549                 }
5550                 len = asc_prt_line(cp, leftlen, "\n");
5551                 ASC_PRT_NEXT();
5552         }
5553
5554         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5555                 len = asc_prt_line(cp, leftlen, " Ultra Transfer:      ");
5556                 ASC_PRT_NEXT();
5557                 for (i = 0; i <= ADV_MAX_TID; i++) {
5558                         len = asc_prt_line(cp, leftlen, " %c",
5559                                            (ep_3550->
5560                                             ultra_able & ADV_TID_TO_TIDMASK(i))
5561                                            ? 'Y' : 'N');
5562                         ASC_PRT_NEXT();
5563                 }
5564                 len = asc_prt_line(cp, leftlen, "\n");
5565                 ASC_PRT_NEXT();
5566         }
5567
5568         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
5569                 word = ep_3550->wdtr_able;
5570         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
5571                 word = ep_38C0800->wdtr_able;
5572         } else {
5573                 word = ep_38C1600->wdtr_able;
5574         }
5575         len = asc_prt_line(cp, leftlen, " Wide Transfer:       ");
5576         ASC_PRT_NEXT();
5577         for (i = 0; i <= ADV_MAX_TID; i++) {
5578                 len = asc_prt_line(cp, leftlen, " %c",
5579                                    (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
5580                 ASC_PRT_NEXT();
5581         }
5582         len = asc_prt_line(cp, leftlen, "\n");
5583         ASC_PRT_NEXT();
5584
5585         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
5586             adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) {
5587                 len = asc_prt_line(cp, leftlen,
5588                                    " Synchronous Transfer Speed (Mhz):\n  ");
5589                 ASC_PRT_NEXT();
5590                 for (i = 0; i <= ADV_MAX_TID; i++) {
5591                         char *speed_str;
5592
5593                         if (i == 0) {
5594                                 sdtr_speed = adv_dvc_varp->sdtr_speed1;
5595                         } else if (i == 4) {
5596                                 sdtr_speed = adv_dvc_varp->sdtr_speed2;
5597                         } else if (i == 8) {
5598                                 sdtr_speed = adv_dvc_varp->sdtr_speed3;
5599                         } else if (i == 12) {
5600                                 sdtr_speed = adv_dvc_varp->sdtr_speed4;
5601                         }
5602                         switch (sdtr_speed & ADV_MAX_TID) {
5603                         case 0:
5604                                 speed_str = "Off";
5605                                 break;
5606                         case 1:
5607                                 speed_str = "  5";
5608                                 break;
5609                         case 2:
5610                                 speed_str = " 10";
5611                                 break;
5612                         case 3:
5613                                 speed_str = " 20";
5614                                 break;
5615                         case 4:
5616                                 speed_str = " 40";
5617                                 break;
5618                         case 5:
5619                                 speed_str = " 80";
5620                                 break;
5621                         default:
5622                                 speed_str = "Unk";
5623                                 break;
5624                         }
5625                         len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
5626                         ASC_PRT_NEXT();
5627                         if (i == 7) {
5628                                 len = asc_prt_line(cp, leftlen, "\n  ");
5629                                 ASC_PRT_NEXT();
5630                         }
5631                         sdtr_speed >>= 4;
5632                 }
5633                 len = asc_prt_line(cp, leftlen, "\n");
5634                 ASC_PRT_NEXT();
5635         }
5636
5637         return totlen;
5638 }
5639
5640 /*
5641  * asc_prt_driver_conf()
5642  *
5643  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
5644  * cf. asc_prt_line().
5645  *
5646  * Return the number of characters copied into 'cp'. No more than
5647  * 'cplen' characters will be copied to 'cp'.
5648  */
5649 static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen)
5650 {
5651         asc_board_t *boardp;
5652         int leftlen;
5653         int totlen;
5654         int len;
5655         int chip_scsi_id;
5656
5657         boardp = ASC_BOARDP(shost);
5658
5659         leftlen = cplen;
5660         totlen = len = 0;
5661
5662         len = asc_prt_line(cp, leftlen,
5663                            "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
5664                            shost->host_no);
5665         ASC_PRT_NEXT();
5666
5667         len = asc_prt_line(cp, leftlen,
5668                            " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
5669                            shost->host_busy, shost->last_reset, shost->max_id,
5670                            shost->max_lun, shost->max_channel);
5671         ASC_PRT_NEXT();
5672
5673         len = asc_prt_line(cp, leftlen,
5674                            " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
5675                            shost->unique_id, shost->can_queue, shost->this_id,
5676                            shost->sg_tablesize, shost->cmd_per_lun);
5677         ASC_PRT_NEXT();
5678
5679         len = asc_prt_line(cp, leftlen,
5680                            " unchecked_isa_dma %d, use_clustering %d\n",
5681                            shost->unchecked_isa_dma, shost->use_clustering);
5682         ASC_PRT_NEXT();
5683
5684         len = asc_prt_line(cp, leftlen,
5685                            " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
5686                            boardp->flags, boardp->last_reset, jiffies,
5687                            boardp->asc_n_io_port);
5688         ASC_PRT_NEXT();
5689
5690         len = asc_prt_line(cp, leftlen, " io_port 0x%x\n", shost->io_port);
5691         ASC_PRT_NEXT();
5692
5693         if (ASC_NARROW_BOARD(boardp)) {
5694                 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
5695         } else {
5696                 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
5697         }
5698
5699         return totlen;
5700 }
5701
5702 /*
5703  * asc_prt_asc_board_info()
5704  *
5705  * Print dynamic board configuration information.
5706  *
5707  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
5708  * cf. asc_prt_line().
5709  *
5710  * Return the number of characters copied into 'cp'. No more than
5711  * 'cplen' characters will be copied to 'cp'.
5712  */
5713 static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
5714 {
5715         asc_board_t *boardp;
5716         int chip_scsi_id;
5717         int leftlen;
5718         int totlen;
5719         int len;
5720         ASC_DVC_VAR *v;
5721         ASC_DVC_CFG *c;
5722         int i;
5723         int renegotiate = 0;
5724
5725         boardp = ASC_BOARDP(shost);
5726         v = &boardp->dvc_var.asc_dvc_var;
5727         c = &boardp->dvc_cfg.asc_dvc_cfg;
5728         chip_scsi_id = c->chip_scsi_id;
5729
5730         leftlen = cplen;
5731         totlen = len = 0;
5732
5733         len = asc_prt_line(cp, leftlen,
5734                            "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
5735                            shost->host_no);
5736         ASC_PRT_NEXT();
5737
5738         len = asc_prt_line(cp, leftlen,
5739                            " chip_version %u, lib_version 0x%x, lib_serial_no %u, mcode_date 0x%x\n",
5740                            c->chip_version, c->lib_version, c->lib_serial_no,
5741                            c->mcode_date);
5742         ASC_PRT_NEXT();
5743
5744         len = asc_prt_line(cp, leftlen,
5745                            " mcode_version 0x%x, err_code %u\n",
5746                            c->mcode_version, v->err_code);
5747         ASC_PRT_NEXT();
5748
5749         /* Current number of commands waiting for the host. */
5750         len = asc_prt_line(cp, leftlen,
5751                            " Total Command Pending: %d\n", v->cur_total_qng);
5752         ASC_PRT_NEXT();
5753
5754         len = asc_prt_line(cp, leftlen, " Command Queuing:");
5755         ASC_PRT_NEXT();
5756         for (i = 0; i <= ASC_MAX_TID; i++) {
5757                 if ((chip_scsi_id == i) ||
5758                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5759                         continue;
5760                 }
5761                 len = asc_prt_line(cp, leftlen, " %X:%c",
5762                                    i,
5763                                    (v->
5764                                     use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ?
5765                                    'Y' : 'N');
5766                 ASC_PRT_NEXT();
5767         }
5768         len = asc_prt_line(cp, leftlen, "\n");
5769         ASC_PRT_NEXT();
5770
5771         /* Current number of commands waiting for a device. */
5772         len = asc_prt_line(cp, leftlen, " Command Queue Pending:");
5773         ASC_PRT_NEXT();
5774         for (i = 0; i <= ASC_MAX_TID; i++) {
5775                 if ((chip_scsi_id == i) ||
5776                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5777                         continue;
5778                 }
5779                 len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
5780                 ASC_PRT_NEXT();
5781         }
5782         len = asc_prt_line(cp, leftlen, "\n");
5783         ASC_PRT_NEXT();
5784
5785         /* Current limit on number of commands that can be sent to a device. */
5786         len = asc_prt_line(cp, leftlen, " Command Queue Limit:");
5787         ASC_PRT_NEXT();
5788         for (i = 0; i <= ASC_MAX_TID; i++) {
5789                 if ((chip_scsi_id == i) ||
5790                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5791                         continue;
5792                 }
5793                 len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
5794                 ASC_PRT_NEXT();
5795         }
5796         len = asc_prt_line(cp, leftlen, "\n");
5797         ASC_PRT_NEXT();
5798
5799         /* Indicate whether the device has returned queue full status. */
5800         len = asc_prt_line(cp, leftlen, " Command Queue Full:");
5801         ASC_PRT_NEXT();
5802         for (i = 0; i <= ASC_MAX_TID; i++) {
5803                 if ((chip_scsi_id == i) ||
5804                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5805                         continue;
5806                 }
5807                 if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
5808                         len = asc_prt_line(cp, leftlen, " %X:Y-%d",
5809                                            i, boardp->queue_full_cnt[i]);
5810                 } else {
5811                         len = asc_prt_line(cp, leftlen, " %X:N", i);
5812                 }
5813                 ASC_PRT_NEXT();
5814         }
5815         len = asc_prt_line(cp, leftlen, "\n");
5816         ASC_PRT_NEXT();
5817
5818         len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
5819         ASC_PRT_NEXT();
5820         for (i = 0; i <= ASC_MAX_TID; i++) {
5821                 if ((chip_scsi_id == i) ||
5822                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5823                         continue;
5824                 }
5825                 len = asc_prt_line(cp, leftlen, " %X:%c",
5826                                    i,
5827                                    (v->
5828                                     sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
5829                                    'N');
5830                 ASC_PRT_NEXT();
5831         }
5832         len = asc_prt_line(cp, leftlen, "\n");
5833         ASC_PRT_NEXT();
5834
5835         for (i = 0; i <= ASC_MAX_TID; i++) {
5836                 uchar syn_period_ix;
5837
5838                 if ((chip_scsi_id == i) ||
5839                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
5840                     ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) {
5841                         continue;
5842                 }
5843
5844                 len = asc_prt_line(cp, leftlen, "  %X:", i);
5845                 ASC_PRT_NEXT();
5846
5847                 if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) {
5848                         len = asc_prt_line(cp, leftlen, " Asynchronous");
5849                         ASC_PRT_NEXT();
5850                 } else {
5851                         syn_period_ix =
5852                             (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index -
5853                                                            1);
5854
5855                         len = asc_prt_line(cp, leftlen,
5856                                            " Transfer Period Factor: %d (%d.%d Mhz),",
5857                                            v->sdtr_period_tbl[syn_period_ix],
5858                                            250 /
5859                                            v->sdtr_period_tbl[syn_period_ix],
5860                                            ASC_TENTHS(250,
5861                                                       v->
5862                                                       sdtr_period_tbl
5863                                                       [syn_period_ix]));
5864                         ASC_PRT_NEXT();
5865
5866                         len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
5867                                            boardp->
5868                                            sdtr_data[i] & ASC_SYN_MAX_OFFSET);
5869                         ASC_PRT_NEXT();
5870                 }
5871
5872                 if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
5873                         len = asc_prt_line(cp, leftlen, "*\n");
5874                         renegotiate = 1;
5875                 } else {
5876                         len = asc_prt_line(cp, leftlen, "\n");
5877                 }
5878                 ASC_PRT_NEXT();
5879         }
5880
5881         if (renegotiate) {
5882                 len = asc_prt_line(cp, leftlen,
5883                                    " * = Re-negotiation pending before next command.\n");
5884                 ASC_PRT_NEXT();
5885         }
5886
5887         return totlen;
5888 }
5889
5890 /*
5891  * asc_prt_adv_board_info()
5892  *
5893  * Print dynamic board configuration information.
5894  *
5895  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
5896  * cf. asc_prt_line().
5897  *
5898  * Return the number of characters copied into 'cp'. No more than
5899  * 'cplen' characters will be copied to 'cp'.
5900  */
5901 static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
5902 {
5903         asc_board_t *boardp;
5904         int leftlen;
5905         int totlen;
5906         int len;
5907         int i;
5908         ADV_DVC_VAR *v;
5909         ADV_DVC_CFG *c;
5910         AdvPortAddr iop_base;
5911         ushort chip_scsi_id;
5912         ushort lramword;
5913         uchar lrambyte;
5914         ushort tagqng_able;
5915         ushort sdtr_able, wdtr_able;
5916         ushort wdtr_done, sdtr_done;
5917         ushort period = 0;
5918         int renegotiate = 0;
5919
5920         boardp = ASC_BOARDP(shost);
5921         v = &boardp->dvc_var.adv_dvc_var;
5922         c = &boardp->dvc_cfg.adv_dvc_cfg;
5923         iop_base = v->iop_base;
5924         chip_scsi_id = v->chip_scsi_id;
5925
5926         leftlen = cplen;
5927         totlen = len = 0;
5928
5929         len = asc_prt_line(cp, leftlen,
5930                            "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
5931                            shost->host_no);
5932         ASC_PRT_NEXT();
5933
5934         len = asc_prt_line(cp, leftlen,
5935                            " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
5936                            v->iop_base,
5937                            AdvReadWordRegister(iop_base,
5938                                                IOPW_SCSI_CFG1) & CABLE_DETECT,
5939                            v->err_code);
5940         ASC_PRT_NEXT();
5941
5942         len = asc_prt_line(cp, leftlen,
5943                            " chip_version %u, lib_version 0x%x, mcode_date 0x%x, mcode_version 0x%x\n",
5944                            c->chip_version, c->lib_version, c->mcode_date,
5945                            c->mcode_version);
5946         ASC_PRT_NEXT();
5947
5948         AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
5949         len = asc_prt_line(cp, leftlen, " Queuing Enabled:");
5950         ASC_PRT_NEXT();
5951         for (i = 0; i <= ADV_MAX_TID; i++) {
5952                 if ((chip_scsi_id == i) ||
5953                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5954                         continue;
5955                 }
5956
5957                 len = asc_prt_line(cp, leftlen, " %X:%c",
5958                                    i,
5959                                    (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
5960                                    'N');
5961                 ASC_PRT_NEXT();
5962         }
5963         len = asc_prt_line(cp, leftlen, "\n");
5964         ASC_PRT_NEXT();
5965
5966         len = asc_prt_line(cp, leftlen, " Queue Limit:");
5967         ASC_PRT_NEXT();
5968         for (i = 0; i <= ADV_MAX_TID; i++) {
5969                 if ((chip_scsi_id == i) ||
5970                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5971                         continue;
5972                 }
5973
5974                 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i,
5975                                 lrambyte);
5976
5977                 len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
5978                 ASC_PRT_NEXT();
5979         }
5980         len = asc_prt_line(cp, leftlen, "\n");
5981         ASC_PRT_NEXT();
5982
5983         len = asc_prt_line(cp, leftlen, " Command Pending:");
5984         ASC_PRT_NEXT();
5985         for (i = 0; i <= ADV_MAX_TID; i++) {
5986                 if ((chip_scsi_id == i) ||
5987                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
5988                         continue;
5989                 }
5990
5991                 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i,
5992                                 lrambyte);
5993
5994                 len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
5995                 ASC_PRT_NEXT();
5996         }
5997         len = asc_prt_line(cp, leftlen, "\n");
5998         ASC_PRT_NEXT();
5999
6000         AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
6001         len = asc_prt_line(cp, leftlen, " Wide Enabled:");
6002         ASC_PRT_NEXT();
6003         for (i = 0; i <= ADV_MAX_TID; i++) {
6004                 if ((chip_scsi_id == i) ||
6005                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
6006                         continue;
6007                 }
6008
6009                 len = asc_prt_line(cp, leftlen, " %X:%c",
6010                                    i,
6011                                    (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
6012                                    'N');
6013                 ASC_PRT_NEXT();
6014         }
6015         len = asc_prt_line(cp, leftlen, "\n");
6016         ASC_PRT_NEXT();
6017
6018         AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
6019         len = asc_prt_line(cp, leftlen, " Transfer Bit Width:");
6020         ASC_PRT_NEXT();
6021         for (i = 0; i <= ADV_MAX_TID; i++) {
6022                 if ((chip_scsi_id == i) ||
6023                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
6024                         continue;
6025                 }
6026
6027                 AdvReadWordLram(iop_base,
6028                                 ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
6029                                 lramword);
6030
6031                 len = asc_prt_line(cp, leftlen, " %X:%d",
6032                                    i, (lramword & 0x8000) ? 16 : 8);
6033                 ASC_PRT_NEXT();
6034
6035                 if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
6036                     (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
6037                         len = asc_prt_line(cp, leftlen, "*");
6038                         ASC_PRT_NEXT();
6039                         renegotiate = 1;
6040                 }
6041         }
6042         len = asc_prt_line(cp, leftlen, "\n");
6043         ASC_PRT_NEXT();
6044
6045         AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
6046         len = asc_prt_line(cp, leftlen, " Synchronous Enabled:");
6047         ASC_PRT_NEXT();
6048         for (i = 0; i <= ADV_MAX_TID; i++) {
6049                 if ((chip_scsi_id == i) ||
6050                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
6051                         continue;
6052                 }
6053
6054                 len = asc_prt_line(cp, leftlen, " %X:%c",
6055                                    i,
6056                                    (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
6057                                    'N');
6058                 ASC_PRT_NEXT();
6059         }
6060         len = asc_prt_line(cp, leftlen, "\n");
6061         ASC_PRT_NEXT();
6062
6063         AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
6064         for (i = 0; i <= ADV_MAX_TID; i++) {
6065
6066                 AdvReadWordLram(iop_base,
6067                                 ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
6068                                 lramword);
6069                 lramword &= ~0x8000;
6070
6071                 if ((chip_scsi_id == i) ||
6072                     ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
6073                     ((sdtr_able & ADV_TID_TO_TIDMASK(i)) == 0)) {
6074                         continue;
6075                 }
6076
6077                 len = asc_prt_line(cp, leftlen, "  %X:", i);
6078                 ASC_PRT_NEXT();
6079
6080                 if ((lramword & 0x1F) == 0) {   /* Check for REQ/ACK Offset 0. */
6081                         len = asc_prt_line(cp, leftlen, " Asynchronous");
6082                         ASC_PRT_NEXT();
6083                 } else {
6084                         len =
6085                             asc_prt_line(cp, leftlen,
6086                                          " Transfer Period Factor: ");
6087                         ASC_PRT_NEXT();
6088
6089                         if ((lramword & 0x1F00) == 0x1100) {    /* 80 Mhz */
6090                                 len =
6091                                     asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
6092                                 ASC_PRT_NEXT();
6093                         } else if ((lramword & 0x1F00) == 0x1000) {     /* 40 Mhz */
6094                                 len =
6095                                     asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
6096                                 ASC_PRT_NEXT();
6097                         } else {        /* 20 Mhz or below. */
6098
6099                                 period = (((lramword >> 8) * 25) + 50) / 4;
6100
6101                                 if (period == 0) {      /* Should never happen. */
6102                                         len =
6103                                             asc_prt_line(cp, leftlen,
6104                                                          "%d (? Mhz), ");
6105                                         ASC_PRT_NEXT();
6106                                 } else {
6107                                         len = asc_prt_line(cp, leftlen,
6108                                                            "%d (%d.%d Mhz),",
6109                                                            period, 250 / period,
6110                                                            ASC_TENTHS(250,
6111                                                                       period));
6112                                         ASC_PRT_NEXT();
6113                                 }
6114                         }
6115
6116                         len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
6117                                            lramword & 0x1F);
6118                         ASC_PRT_NEXT();
6119                 }
6120
6121                 if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
6122                         len = asc_prt_line(cp, leftlen, "*\n");
6123                         renegotiate = 1;
6124                 } else {
6125                         len = asc_prt_line(cp, leftlen, "\n");
6126                 }
6127                 ASC_PRT_NEXT();
6128         }
6129
6130         if (renegotiate) {
6131                 len = asc_prt_line(cp, leftlen,
6132                                    " * = Re-negotiation pending before next command.\n");
6133                 ASC_PRT_NEXT();
6134         }
6135
6136         return totlen;
6137 }
6138
6139 /*
6140  * asc_proc_copy()
6141  *
6142  * Copy proc information to a read buffer taking into account the current
6143  * read offset in the file and the remaining space in the read buffer.
6144  */
6145 static int
6146 asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
6147               char *cp, int cplen)
6148 {
6149         int cnt = 0;
6150
6151         ASC_DBG3(2, "asc_proc_copy: offset %d, advoffset %d, cplen %d\n",
6152                  (unsigned)offset, (unsigned)advoffset, cplen);
6153         if (offset <= advoffset) {
6154                 /* Read offset below current offset, copy everything. */
6155                 cnt = min(cplen, leftlen);
6156                 ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
6157                          (ulong)curbuf, (ulong)cp, cnt);
6158                 memcpy(curbuf, cp, cnt);
6159         } else if (offset < advoffset + cplen) {
6160                 /* Read offset within current range, partial copy. */
6161                 cnt = (advoffset + cplen) - offset;
6162                 cp = (cp + cplen) - cnt;
6163                 cnt = min(cnt, leftlen);
6164                 ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
6165                          (ulong)curbuf, (ulong)cp, cnt);
6166                 memcpy(curbuf, cp, cnt);
6167         }
6168         return cnt;
6169 }
6170
6171 /*
6172  * asc_prt_line()
6173  *
6174  * If 'cp' is NULL print to the console, otherwise print to a buffer.
6175  *
6176  * Return 0 if printing to the console, otherwise return the number of
6177  * bytes written to the buffer.
6178  *
6179  * Note: If any single line is greater than ASC_PRTLINE_SIZE bytes the stack
6180  * will be corrupted. 's[]' is defined to be ASC_PRTLINE_SIZE bytes.
6181  */
6182 static int asc_prt_line(char *buf, int buflen, char *fmt, ...)
6183 {
6184         va_list args;
6185         int ret;
6186         char s[ASC_PRTLINE_SIZE];
6187
6188         va_start(args, fmt);
6189         ret = vsprintf(s, fmt, args);
6190         ASC_ASSERT(ret < ASC_PRTLINE_SIZE);
6191         if (buf == NULL) {
6192                 (void)printk(s);
6193                 ret = 0;
6194         } else {
6195                 ret = min(buflen, ret);
6196                 memcpy(buf, s, ret);
6197         }
6198         va_end(args);
6199         return ret;
6200 }
6201 #endif /* CONFIG_PROC_FS */
6202
6203 /*
6204  * --- Functions Required by the Asc Library
6205  */
6206
6207 /*
6208  * Delay for 'n' milliseconds. Don't use the 'jiffies'
6209  * global variable which is incremented once every 5 ms
6210  * from a timer interrupt, because this function may be
6211  * called when interrupts are disabled.
6212  */
6213 static void DvcSleepMilliSecond(ADV_DCNT n)
6214 {
6215         ASC_DBG1(4, "DvcSleepMilliSecond: %lu\n", (ulong)n);
6216         mdelay(n);
6217 }
6218
6219 /*
6220  * Currently and inline noop but leave as a placeholder.
6221  * Leave DvcEnterCritical() as a noop placeholder.
6222  */
6223 static inline ulong DvcEnterCritical(void)
6224 {
6225         return 0;
6226 }
6227
6228 /*
6229  * Critical sections are all protected by the board spinlock.
6230  * Leave DvcLeaveCritical() as a noop placeholder.
6231  */
6232 static inline void DvcLeaveCritical(ulong flags)
6233 {
6234         return;
6235 }
6236
6237 /*
6238  * void
6239  * DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
6240  *
6241  * Calling/Exit State:
6242  *    none
6243  *
6244  * Description:
6245  *     Output an ASC_SCSI_Q structure to the chip
6246  */
6247 static void
6248 DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
6249 {
6250         int i;
6251
6252         ASC_DBG_PRT_HEX(2, "DvcPutScsiQ", outbuf, 2 * words);
6253         AscSetChipLramAddr(iop_base, s_addr);
6254         for (i = 0; i < 2 * words; i += 2) {
6255                 if (i == 4 || i == 20) {
6256                         continue;
6257                 }
6258                 outpw(iop_base + IOP_RAM_DATA,
6259                       ((ushort)outbuf[i + 1] << 8) | outbuf[i]);
6260         }
6261 }
6262
6263 /*
6264  * void
6265  * DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
6266  *
6267  * Calling/Exit State:
6268  *    none
6269  *
6270  * Description:
6271  *     Input an ASC_QDONE_INFO structure from the chip
6272  */
6273 static void
6274 DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
6275 {
6276         int i;
6277         ushort word;
6278
6279         AscSetChipLramAddr(iop_base, s_addr);
6280         for (i = 0; i < 2 * words; i += 2) {
6281                 if (i == 10) {
6282                         continue;
6283                 }
6284                 word = inpw(iop_base + IOP_RAM_DATA);
6285                 inbuf[i] = word & 0xff;
6286                 inbuf[i + 1] = (word >> 8) & 0xff;
6287         }
6288         ASC_DBG_PRT_HEX(2, "DvcGetQinfo", inbuf, 2 * words);
6289 }
6290
6291 /*
6292  * Return the BIOS address of the adapter at the specified
6293  * I/O port and with the specified bus type.
6294  */
6295 static unsigned short __devinit
6296 AscGetChipBiosAddress(PortAddr iop_base, unsigned short bus_type)
6297 {
6298         unsigned short cfg_lsw;
6299         unsigned short bios_addr;
6300
6301         /*
6302          * The PCI BIOS is re-located by the motherboard BIOS. Because
6303          * of this the driver can not determine where a PCI BIOS is
6304          * loaded and executes.
6305          */
6306         if (bus_type & ASC_IS_PCI)
6307                 return 0;
6308
6309 #ifdef CONFIG_ISA
6310         if ((bus_type & ASC_IS_EISA) != 0) {
6311                 cfg_lsw = AscGetEisaChipCfg(iop_base);
6312                 cfg_lsw &= 0x000F;
6313                 bios_addr = ASC_BIOS_MIN_ADDR + cfg_lsw * ASC_BIOS_BANK_SIZE;
6314                 return bios_addr;
6315         }
6316 #endif /* CONFIG_ISA */
6317
6318         cfg_lsw = AscGetChipCfgLsw(iop_base);
6319
6320         /*
6321          *  ISA PnP uses the top bit as the 32K BIOS flag
6322          */
6323         if (bus_type == ASC_IS_ISAPNP)
6324                 cfg_lsw &= 0x7FFF;
6325         bios_addr = ASC_BIOS_MIN_ADDR + (cfg_lsw >> 12) * ASC_BIOS_BANK_SIZE;
6326         return bios_addr;
6327 }
6328
6329 /*
6330  * --- Functions Required by the Adv Library
6331  */
6332
6333 /*
6334  * DvcGetPhyAddr()
6335  *
6336  * Return the physical address of 'vaddr' and set '*lenp' to the
6337  * number of physically contiguous bytes that follow 'vaddr'.
6338  * 'flag' indicates the type of structure whose physical address
6339  * is being translated.
6340  *
6341  * Note: Because Linux currently doesn't page the kernel and all
6342  * kernel buffers are physically contiguous, leave '*lenp' unchanged.
6343  */
6344 ADV_PADDR
6345 DvcGetPhyAddr(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq,
6346               uchar *vaddr, ADV_SDCNT *lenp, int flag)
6347 {
6348         ADV_PADDR paddr;
6349
6350         paddr = virt_to_bus(vaddr);
6351
6352         ASC_DBG4(4,
6353                  "DvcGetPhyAddr: vaddr 0x%lx, lenp 0x%lx *lenp %lu, paddr 0x%lx\n",
6354                  (ulong)vaddr, (ulong)lenp, (ulong)*((ulong *)lenp),
6355                  (ulong)paddr);
6356
6357         return paddr;
6358 }
6359
6360 /*
6361  * --- Tracing and Debugging Functions
6362  */
6363
6364 #ifdef ADVANSYS_STATS
6365 #ifdef CONFIG_PROC_FS
6366 /*
6367  * asc_prt_board_stats()
6368  *
6369  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
6370  * cf. asc_prt_line().
6371  *
6372  * Return the number of characters copied into 'cp'. No more than
6373  * 'cplen' characters will be copied to 'cp'.
6374  */
6375 static int asc_prt_board_stats(struct Scsi_Host *shost, char *cp, int cplen)
6376 {
6377         int leftlen;
6378         int totlen;
6379         int len;
6380         struct asc_stats *s;
6381         asc_board_t *boardp;
6382
6383         leftlen = cplen;
6384         totlen = len = 0;
6385
6386         boardp = ASC_BOARDP(shost);
6387         s = &boardp->asc_stats;
6388
6389         len = asc_prt_line(cp, leftlen,
6390                            "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
6391                            shost->host_no);
6392         ASC_PRT_NEXT();
6393
6394         len = asc_prt_line(cp, leftlen,
6395                            " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
6396                            s->queuecommand, s->reset, s->biosparam,
6397                            s->interrupt);
6398         ASC_PRT_NEXT();
6399
6400         len = asc_prt_line(cp, leftlen,
6401                            " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
6402                            s->callback, s->done, s->build_error,
6403                            s->adv_build_noreq, s->adv_build_nosg);
6404         ASC_PRT_NEXT();
6405
6406         len = asc_prt_line(cp, leftlen,
6407                            " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
6408                            s->exe_noerror, s->exe_busy, s->exe_error,
6409                            s->exe_unknown);
6410         ASC_PRT_NEXT();
6411
6412         /*
6413          * Display data transfer statistics.
6414          */
6415         if (s->cont_cnt > 0) {
6416                 len = asc_prt_line(cp, leftlen, " cont_cnt %lu, ", s->cont_cnt);
6417                 ASC_PRT_NEXT();
6418
6419                 len = asc_prt_line(cp, leftlen, "cont_xfer %lu.%01lu kb ",
6420                                    s->cont_xfer / 2,
6421                                    ASC_TENTHS(s->cont_xfer, 2));
6422                 ASC_PRT_NEXT();
6423
6424                 /* Contiguous transfer average size */
6425                 len = asc_prt_line(cp, leftlen, "avg_xfer %lu.%01lu kb\n",
6426                                    (s->cont_xfer / 2) / s->cont_cnt,
6427                                    ASC_TENTHS((s->cont_xfer / 2), s->cont_cnt));
6428                 ASC_PRT_NEXT();
6429         }
6430
6431         if (s->sg_cnt > 0) {
6432
6433                 len = asc_prt_line(cp, leftlen, " sg_cnt %lu, sg_elem %lu, ",
6434                                    s->sg_cnt, s->sg_elem);
6435                 ASC_PRT_NEXT();
6436
6437                 len = asc_prt_line(cp, leftlen, "sg_xfer %lu.%01lu kb\n",
6438                                    s->sg_xfer / 2, ASC_TENTHS(s->sg_xfer, 2));
6439                 ASC_PRT_NEXT();
6440
6441                 /* Scatter gather transfer statistics */
6442                 len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ",
6443                                    s->sg_elem / s->sg_cnt,
6444                                    ASC_TENTHS(s->sg_elem, s->sg_cnt));
6445                 ASC_PRT_NEXT();
6446
6447                 len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ",
6448                                    (s->sg_xfer / 2) / s->sg_elem,
6449                                    ASC_TENTHS((s->sg_xfer / 2), s->sg_elem));
6450                 ASC_PRT_NEXT();
6451
6452                 len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n",
6453                                    (s->sg_xfer / 2) / s->sg_cnt,
6454                                    ASC_TENTHS((s->sg_xfer / 2), s->sg_cnt));
6455                 ASC_PRT_NEXT();
6456         }
6457
6458         /*
6459          * Display request queuing statistics.
6460          */
6461         len = asc_prt_line(cp, leftlen,
6462                            " Active and Waiting Request Queues (Time Unit: %d HZ):\n",
6463                            HZ);
6464         ASC_PRT_NEXT();
6465
6466         return totlen;
6467 }
6468
6469 /*
6470  * asc_prt_target_stats()
6471  *
6472  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
6473  * cf. asc_prt_line().
6474  *
6475  * This is separated from asc_prt_board_stats because a full set
6476  * of targets will overflow ASC_PRTBUF_SIZE.
6477  *
6478  * Return the number of characters copied into 'cp'. No more than
6479  * 'cplen' characters will be copied to 'cp'.
6480  */
6481 static int
6482 asc_prt_target_stats(struct Scsi_Host *shost, int tgt_id, char *cp, int cplen)
6483 {
6484         int leftlen;
6485         int totlen;
6486         int len;
6487         struct asc_stats *s;
6488         ushort chip_scsi_id;
6489         asc_board_t *boardp;
6490         asc_queue_t *active;
6491
6492         leftlen = cplen;
6493         totlen = len = 0;
6494
6495         boardp = ASC_BOARDP(shost);
6496         s = &boardp->asc_stats;
6497
6498         active = &ASC_BOARDP(shost)->active;
6499
6500         if (ASC_NARROW_BOARD(boardp)) {
6501                 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
6502         } else {
6503                 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
6504         }
6505
6506         if ((chip_scsi_id == tgt_id) ||
6507             ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(tgt_id)) == 0)) {
6508                 return 0;
6509         }
6510
6511         do {
6512                 if (active->q_tot_cnt[tgt_id] > 0) {
6513                         len = asc_prt_line(cp, leftlen, " target %d\n", tgt_id);
6514                         ASC_PRT_NEXT();
6515
6516                         len = asc_prt_line(cp, leftlen,
6517                                            "   active: cnt [cur %d, max %d, tot %u], time [min %d, max %d, avg %lu.%01lu]\n",
6518                                            active->q_cur_cnt[tgt_id],
6519                                            active->q_max_cnt[tgt_id],
6520                                            active->q_tot_cnt[tgt_id],
6521                                            active->q_min_tim[tgt_id],
6522                                            active->q_max_tim[tgt_id],
6523                                            (active->q_tot_cnt[tgt_id] ==
6524                                             0) ? 0 : (active->
6525                                                       q_tot_tim[tgt_id] /
6526                                                       active->
6527                                                       q_tot_cnt[tgt_id]),
6528                                            (active->q_tot_cnt[tgt_id] ==
6529                                             0) ? 0 : ASC_TENTHS(active->
6530                                                                 q_tot_tim
6531                                                                 [tgt_id],
6532                                                                 active->
6533                                                                 q_tot_cnt
6534                                                                 [tgt_id]));
6535                         ASC_PRT_NEXT();
6536                 }
6537         } while (0);
6538
6539         return totlen;
6540 }
6541 #endif /* CONFIG_PROC_FS */
6542 #endif /* ADVANSYS_STATS */
6543
6544 #ifdef ADVANSYS_DEBUG
6545 /*
6546  * asc_prt_scsi_host()
6547  */
6548 static void asc_prt_scsi_host(struct Scsi_Host *s)
6549 {
6550         asc_board_t *boardp;
6551
6552         boardp = ASC_BOARDP(s);
6553
6554         printk("Scsi_Host at addr 0x%lx\n", (ulong)s);
6555         printk(" host_busy %u, host_no %d, last_reset %d,\n",
6556                s->host_busy, s->host_no, (unsigned)s->last_reset);
6557
6558         printk(" base 0x%lx, io_port 0x%lx, irq 0x%x,\n",
6559                (ulong)s->base, (ulong)s->io_port, s->irq);
6560
6561         printk(" dma_channel %d, this_id %d, can_queue %d,\n",
6562                s->dma_channel, s->this_id, s->can_queue);
6563
6564         printk(" cmd_per_lun %d, sg_tablesize %d, unchecked_isa_dma %d\n",
6565                s->cmd_per_lun, s->sg_tablesize, s->unchecked_isa_dma);
6566
6567         if (ASC_NARROW_BOARD(boardp)) {
6568                 asc_prt_asc_dvc_var(&ASC_BOARDP(s)->dvc_var.asc_dvc_var);
6569                 asc_prt_asc_dvc_cfg(&ASC_BOARDP(s)->dvc_cfg.asc_dvc_cfg);
6570         } else {
6571                 asc_prt_adv_dvc_var(&ASC_BOARDP(s)->dvc_var.adv_dvc_var);
6572                 asc_prt_adv_dvc_cfg(&ASC_BOARDP(s)->dvc_cfg.adv_dvc_cfg);
6573         }
6574 }
6575
6576 /*
6577  * asc_prt_scsi_cmnd()
6578  */
6579 static void asc_prt_scsi_cmnd(struct scsi_cmnd *s)
6580 {
6581         printk("struct scsi_cmnd at addr 0x%lx\n", (ulong)s);
6582
6583         printk(" host 0x%lx, device 0x%lx, target %u, lun %u, channel %u,\n",
6584                (ulong)s->device->host, (ulong)s->device, s->device->id,
6585                s->device->lun, s->device->channel);
6586
6587         asc_prt_hex(" CDB", s->cmnd, s->cmd_len);
6588
6589         printk("sc_data_direction %u, resid %d\n",
6590                s->sc_data_direction, s->resid);
6591
6592         printk(" use_sg %u, sglist_len %u\n", s->use_sg, s->sglist_len);
6593
6594         printk(" serial_number 0x%x, retries %d, allowed %d\n",
6595                (unsigned)s->serial_number, s->retries, s->allowed);
6596
6597         printk(" timeout_per_command %d\n", s->timeout_per_command);
6598
6599         printk(" scsi_done 0x%p, done 0x%p, host_scribble 0x%p, result 0x%x\n",
6600                 s->scsi_done, s->done, s->host_scribble, s->result);
6601
6602         printk(" tag %u, pid %u\n", (unsigned)s->tag, (unsigned)s->pid);
6603 }
6604
6605 /*
6606  * asc_prt_asc_dvc_var()
6607  */
6608 static void asc_prt_asc_dvc_var(ASC_DVC_VAR *h)
6609 {
6610         printk("ASC_DVC_VAR at addr 0x%lx\n", (ulong)h);
6611
6612         printk(" iop_base 0x%x, err_code 0x%x, dvc_cntl 0x%x, bug_fix_cntl "
6613                "%d,\n", h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl);
6614
6615         printk(" bus_type %d, init_sdtr 0x%x,\n", h->bus_type,
6616                 (unsigned)h->init_sdtr);
6617
6618         printk(" sdtr_done 0x%x, use_tagged_qng 0x%x, unit_not_ready 0x%x, "
6619                "chip_no 0x%x,\n", (unsigned)h->sdtr_done,
6620                (unsigned)h->use_tagged_qng, (unsigned)h->unit_not_ready,
6621                (unsigned)h->chip_no);
6622
6623         printk(" queue_full_or_busy 0x%x, start_motor 0x%x, scsi_reset_wait "
6624                "%u,\n", (unsigned)h->queue_full_or_busy,
6625                (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait);
6626
6627         printk(" is_in_int %u, max_total_qng %u, cur_total_qng %u, "
6628                "in_critical_cnt %u,\n", (unsigned)h->is_in_int,
6629                (unsigned)h->max_total_qng, (unsigned)h->cur_total_qng,
6630                (unsigned)h->in_critical_cnt);
6631
6632         printk(" last_q_shortage %u, init_state 0x%x, no_scam 0x%x, "
6633                "pci_fix_asyn_xfer 0x%x,\n", (unsigned)h->last_q_shortage,
6634                (unsigned)h->init_state, (unsigned)h->no_scam,
6635                (unsigned)h->pci_fix_asyn_xfer);
6636
6637         printk(" cfg 0x%lx, irq_no 0x%x\n", (ulong)h->cfg, (unsigned)h->irq_no);
6638 }
6639
6640 /*
6641  * asc_prt_asc_dvc_cfg()
6642  */
6643 static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h)
6644 {
6645         printk("ASC_DVC_CFG at addr 0x%lx\n", (ulong)h);
6646
6647         printk(" can_tagged_qng 0x%x, cmd_qng_enabled 0x%x,\n",
6648                h->can_tagged_qng, h->cmd_qng_enabled);
6649         printk(" disc_enable 0x%x, sdtr_enable 0x%x,\n",
6650                h->disc_enable, h->sdtr_enable);
6651
6652         printk
6653             (" chip_scsi_id %d, isa_dma_speed %d, isa_dma_channel %d, chip_version %d,\n",
6654              h->chip_scsi_id, h->isa_dma_speed, h->isa_dma_channel,
6655              h->chip_version);
6656
6657         printk
6658             (" pci_device_id %d, lib_serial_no %u, lib_version %u, mcode_date 0x%x,\n",
6659              to_pci_dev(h->dev)->device, h->lib_serial_no, h->lib_version,
6660              h->mcode_date);
6661
6662         printk(" mcode_version %d, overrun_buf 0x%lx\n",
6663                h->mcode_version, (ulong)h->overrun_buf);
6664 }
6665
6666 /*
6667  * asc_prt_asc_scsi_q()
6668  */
6669 static void asc_prt_asc_scsi_q(ASC_SCSI_Q *q)
6670 {
6671         ASC_SG_HEAD *sgp;
6672         int i;
6673
6674         printk("ASC_SCSI_Q at addr 0x%lx\n", (ulong)q);
6675
6676         printk
6677             (" target_ix 0x%x, target_lun %u, srb_ptr 0x%lx, tag_code 0x%x,\n",
6678              q->q2.target_ix, q->q1.target_lun, (ulong)q->q2.srb_ptr,
6679              q->q2.tag_code);
6680
6681         printk
6682             (" data_addr 0x%lx, data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
6683              (ulong)le32_to_cpu(q->q1.data_addr),
6684              (ulong)le32_to_cpu(q->q1.data_cnt),
6685              (ulong)le32_to_cpu(q->q1.sense_addr), q->q1.sense_len);
6686
6687         printk(" cdbptr 0x%lx, cdb_len %u, sg_head 0x%lx, sg_queue_cnt %u\n",
6688                (ulong)q->cdbptr, q->q2.cdb_len,
6689                (ulong)q->sg_head, q->q1.sg_queue_cnt);
6690
6691         if (q->sg_head) {
6692                 sgp = q->sg_head;
6693                 printk("ASC_SG_HEAD at addr 0x%lx\n", (ulong)sgp);
6694                 printk(" entry_cnt %u, queue_cnt %u\n", sgp->entry_cnt,
6695                        sgp->queue_cnt);
6696                 for (i = 0; i < sgp->entry_cnt; i++) {
6697                         printk(" [%u]: addr 0x%lx, bytes %lu\n",
6698                                i, (ulong)le32_to_cpu(sgp->sg_list[i].addr),
6699                                (ulong)le32_to_cpu(sgp->sg_list[i].bytes));
6700                 }
6701
6702         }
6703 }
6704
6705 /*
6706  * asc_prt_asc_qdone_info()
6707  */
6708 static void asc_prt_asc_qdone_info(ASC_QDONE_INFO *q)
6709 {
6710         printk("ASC_QDONE_INFO at addr 0x%lx\n", (ulong)q);
6711         printk(" srb_ptr 0x%lx, target_ix %u, cdb_len %u, tag_code %u,\n",
6712                (ulong)q->d2.srb_ptr, q->d2.target_ix, q->d2.cdb_len,
6713                q->d2.tag_code);
6714         printk
6715             (" done_stat 0x%x, host_stat 0x%x, scsi_stat 0x%x, scsi_msg 0x%x\n",
6716              q->d3.done_stat, q->d3.host_stat, q->d3.scsi_stat, q->d3.scsi_msg);
6717 }
6718
6719 /*
6720  * asc_prt_adv_dvc_var()
6721  *
6722  * Display an ADV_DVC_VAR structure.
6723  */
6724 static void asc_prt_adv_dvc_var(ADV_DVC_VAR *h)
6725 {
6726         printk(" ADV_DVC_VAR at addr 0x%lx\n", (ulong)h);
6727
6728         printk("  iop_base 0x%lx, err_code 0x%x, ultra_able 0x%x\n",
6729                (ulong)h->iop_base, h->err_code, (unsigned)h->ultra_able);
6730
6731         printk("  isr_callback 0x%lx, sdtr_able 0x%x, wdtr_able 0x%x\n",
6732                (ulong)h->isr_callback, (unsigned)h->sdtr_able,
6733                (unsigned)h->wdtr_able);
6734
6735         printk("  start_motor 0x%x, scsi_reset_wait 0x%x, irq_no 0x%x,\n",
6736                (unsigned)h->start_motor,
6737                (unsigned)h->scsi_reset_wait, (unsigned)h->irq_no);
6738
6739         printk("  max_host_qng %u, max_dvc_qng %u, carr_freelist 0x%lxn\n",
6740                (unsigned)h->max_host_qng, (unsigned)h->max_dvc_qng,
6741                (ulong)h->carr_freelist);
6742
6743         printk("  icq_sp 0x%lx, irq_sp 0x%lx\n",
6744                (ulong)h->icq_sp, (ulong)h->irq_sp);
6745
6746         printk("  no_scam 0x%x, tagqng_able 0x%x\n",
6747                (unsigned)h->no_scam, (unsigned)h->tagqng_able);
6748
6749         printk("  chip_scsi_id 0x%x, cfg 0x%lx\n",
6750                (unsigned)h->chip_scsi_id, (ulong)h->cfg);
6751 }
6752
6753 /*
6754  * asc_prt_adv_dvc_cfg()
6755  *
6756  * Display an ADV_DVC_CFG structure.
6757  */
6758 static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
6759 {
6760         printk(" ADV_DVC_CFG at addr 0x%lx\n", (ulong)h);
6761
6762         printk("  disc_enable 0x%x, termination 0x%x\n",
6763                h->disc_enable, h->termination);
6764
6765         printk("  chip_version 0x%x, mcode_date 0x%x\n",
6766                h->chip_version, h->mcode_date);
6767
6768         printk("  mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n",
6769                h->mcode_version, to_pci_dev(h->dev)->device, h->lib_version);
6770
6771         printk("  control_flag 0x%x\n", h->control_flag);
6772 }
6773
6774 /*
6775  * asc_prt_adv_scsi_req_q()
6776  *
6777  * Display an ADV_SCSI_REQ_Q structure.
6778  */
6779 static void asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *q)
6780 {
6781         int sg_blk_cnt;
6782         struct asc_sg_block *sg_ptr;
6783
6784         printk("ADV_SCSI_REQ_Q at addr 0x%lx\n", (ulong)q);
6785
6786         printk("  target_id %u, target_lun %u, srb_ptr 0x%lx, a_flag 0x%x\n",
6787                q->target_id, q->target_lun, (ulong)q->srb_ptr, q->a_flag);
6788
6789         printk("  cntl 0x%x, data_addr 0x%lx, vdata_addr 0x%lx\n",
6790                q->cntl, (ulong)le32_to_cpu(q->data_addr), (ulong)q->vdata_addr);
6791
6792         printk("  data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
6793                (ulong)le32_to_cpu(q->data_cnt),
6794                (ulong)le32_to_cpu(q->sense_addr), q->sense_len);
6795
6796         printk
6797             ("  cdb_len %u, done_status 0x%x, host_status 0x%x, scsi_status 0x%x\n",
6798              q->cdb_len, q->done_status, q->host_status, q->scsi_status);
6799
6800         printk("  sg_working_ix 0x%x, target_cmd %u\n",
6801                q->sg_working_ix, q->target_cmd);
6802
6803         printk("  scsiq_rptr 0x%lx, sg_real_addr 0x%lx, sg_list_ptr 0x%lx\n",
6804                (ulong)le32_to_cpu(q->scsiq_rptr),
6805                (ulong)le32_to_cpu(q->sg_real_addr), (ulong)q->sg_list_ptr);
6806
6807         /* Display the request's ADV_SG_BLOCK structures. */
6808         if (q->sg_list_ptr != NULL) {
6809                 sg_blk_cnt = 0;
6810                 while (1) {
6811                         /*
6812                          * 'sg_ptr' is a physical address. Convert it to a virtual
6813                          * address by indexing 'sg_blk_cnt' into the virtual address
6814                          * array 'sg_list_ptr'.
6815                          *
6816                          * XXX - Assumes all SG physical blocks are virtually contiguous.
6817                          */
6818                         sg_ptr =
6819                             &(((ADV_SG_BLOCK *)(q->sg_list_ptr))[sg_blk_cnt]);
6820                         asc_prt_adv_sgblock(sg_blk_cnt, sg_ptr);
6821                         if (sg_ptr->sg_ptr == 0) {
6822                                 break;
6823                         }
6824                         sg_blk_cnt++;
6825                 }
6826         }
6827 }
6828
6829 /*
6830  * asc_prt_adv_sgblock()
6831  *
6832  * Display an ADV_SG_BLOCK structure.
6833  */
6834 static void asc_prt_adv_sgblock(int sgblockno, ADV_SG_BLOCK *b)
6835 {
6836         int i;
6837
6838         printk(" ASC_SG_BLOCK at addr 0x%lx (sgblockno %d)\n",
6839                (ulong)b, sgblockno);
6840         printk("  sg_cnt %u, sg_ptr 0x%lx\n",
6841                b->sg_cnt, (ulong)le32_to_cpu(b->sg_ptr));
6842         ASC_ASSERT(b->sg_cnt <= NO_OF_SG_PER_BLOCK);
6843         if (b->sg_ptr != 0) {
6844                 ASC_ASSERT(b->sg_cnt == NO_OF_SG_PER_BLOCK);
6845         }
6846         for (i = 0; i < b->sg_cnt; i++) {
6847                 printk("  [%u]: sg_addr 0x%lx, sg_count 0x%lx\n",
6848                        i, (ulong)b->sg_list[i].sg_addr,
6849                        (ulong)b->sg_list[i].sg_count);
6850         }
6851 }
6852
6853 /*
6854  * asc_prt_hex()
6855  *
6856  * Print hexadecimal output in 4 byte groupings 32 bytes
6857  * or 8 double-words per line.
6858  */
6859 static void asc_prt_hex(char *f, uchar *s, int l)
6860 {
6861         int i;
6862         int j;
6863         int k;
6864         int m;
6865
6866         printk("%s: (%d bytes)\n", f, l);
6867
6868         for (i = 0; i < l; i += 32) {
6869
6870                 /* Display a maximum of 8 double-words per line. */
6871                 if ((k = (l - i) / 4) >= 8) {
6872                         k = 8;
6873                         m = 0;
6874                 } else {
6875                         m = (l - i) % 4;
6876                 }
6877
6878                 for (j = 0; j < k; j++) {
6879                         printk(" %2.2X%2.2X%2.2X%2.2X",
6880                                (unsigned)s[i + (j * 4)],
6881                                (unsigned)s[i + (j * 4) + 1],
6882                                (unsigned)s[i + (j * 4) + 2],
6883                                (unsigned)s[i + (j * 4) + 3]);
6884                 }
6885
6886                 switch (m) {
6887                 case 0:
6888                 default:
6889                         break;
6890                 case 1:
6891                         printk(" %2.2X", (unsigned)s[i + (j * 4)]);
6892                         break;
6893                 case 2:
6894                         printk(" %2.2X%2.2X",
6895                                (unsigned)s[i + (j * 4)],
6896                                (unsigned)s[i + (j * 4) + 1]);
6897                         break;
6898                 case 3:
6899                         printk(" %2.2X%2.2X%2.2X",
6900                                (unsigned)s[i + (j * 4) + 1],
6901                                (unsigned)s[i + (j * 4) + 2],
6902                                (unsigned)s[i + (j * 4) + 3]);
6903                         break;
6904                 }
6905
6906                 printk("\n");
6907         }
6908 }
6909 #endif /* ADVANSYS_DEBUG */
6910
6911 /*
6912  * --- Asc Library Functions
6913  */
6914
6915 static ushort __devinit AscGetEisaChipCfg(PortAddr iop_base)
6916 {
6917         PortAddr eisa_cfg_iop;
6918
6919         eisa_cfg_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
6920             (PortAddr) (ASC_EISA_CFG_IOP_MASK);
6921         return (inpw(eisa_cfg_iop));
6922 }
6923
6924 static uchar __devinit AscSetChipScsiID(PortAddr iop_base, uchar new_host_id)
6925 {
6926         ushort cfg_lsw;
6927
6928         if (AscGetChipScsiID(iop_base) == new_host_id) {
6929                 return (new_host_id);
6930         }
6931         cfg_lsw = AscGetChipCfgLsw(iop_base);
6932         cfg_lsw &= 0xF8FF;
6933         cfg_lsw |= (ushort)((new_host_id & ASC_MAX_TID) << 8);
6934         AscSetChipCfgLsw(iop_base, cfg_lsw);
6935         return (AscGetChipScsiID(iop_base));
6936 }
6937
6938 static unsigned char __devinit AscGetChipScsiCtrl(PortAddr iop_base)
6939 {
6940         unsigned char sc;
6941
6942         AscSetBank(iop_base, 1);
6943         sc = inp(iop_base + IOP_REG_SC);
6944         AscSetBank(iop_base, 0);
6945         return sc;
6946 }
6947
6948 static unsigned char __devinit
6949 AscGetChipVersion(PortAddr iop_base, unsigned short bus_type)
6950 {
6951         if (bus_type & ASC_IS_EISA) {
6952                 PortAddr eisa_iop;
6953                 unsigned char revision;
6954                 eisa_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
6955                     (PortAddr) ASC_EISA_REV_IOP_MASK;
6956                 revision = inp(eisa_iop);
6957                 return ASC_CHIP_MIN_VER_EISA - 1 + revision;
6958         }
6959         return AscGetChipVerNo(iop_base);
6960 }
6961
6962 static ASC_DCNT
6963 AscLoadMicroCode(PortAddr iop_base,
6964                  ushort s_addr, uchar *mcode_buf, ushort mcode_size)
6965 {
6966         ASC_DCNT chksum;
6967         ushort mcode_word_size;
6968         ushort mcode_chksum;
6969
6970         /* Write the microcode buffer starting at LRAM address 0. */
6971         mcode_word_size = (ushort)(mcode_size >> 1);
6972         AscMemWordSetLram(iop_base, s_addr, 0, mcode_word_size);
6973         AscMemWordCopyPtrToLram(iop_base, s_addr, mcode_buf, mcode_word_size);
6974
6975         chksum = AscMemSumLramWord(iop_base, s_addr, mcode_word_size);
6976         ASC_DBG1(1, "AscLoadMicroCode: chksum 0x%lx\n", (ulong)chksum);
6977         mcode_chksum = (ushort)AscMemSumLramWord(iop_base,
6978                                                  (ushort)ASC_CODE_SEC_BEG,
6979                                                  (ushort)((mcode_size -
6980                                                            s_addr - (ushort)
6981                                                            ASC_CODE_SEC_BEG) /
6982                                                           2));
6983         ASC_DBG1(1, "AscLoadMicroCode: mcode_chksum 0x%lx\n",
6984                  (ulong)mcode_chksum);
6985         AscWriteLramWord(iop_base, ASCV_MCODE_CHKSUM_W, mcode_chksum);
6986         AscWriteLramWord(iop_base, ASCV_MCODE_SIZE_W, mcode_size);
6987         return (chksum);
6988 }
6989
6990 static int AscFindSignature(PortAddr iop_base)
6991 {
6992         ushort sig_word;
6993
6994         ASC_DBG2(1, "AscFindSignature: AscGetChipSignatureByte(0x%x) 0x%x\n",
6995                  iop_base, AscGetChipSignatureByte(iop_base));
6996         if (AscGetChipSignatureByte(iop_base) == (uchar)ASC_1000_ID1B) {
6997                 ASC_DBG2(1,
6998                          "AscFindSignature: AscGetChipSignatureWord(0x%x) 0x%x\n",
6999                          iop_base, AscGetChipSignatureWord(iop_base));
7000                 sig_word = AscGetChipSignatureWord(iop_base);
7001                 if ((sig_word == (ushort)ASC_1000_ID0W) ||
7002                     (sig_word == (ushort)ASC_1000_ID0W_FIX)) {
7003                         return (1);
7004                 }
7005         }
7006         return (0);
7007 }
7008
7009 static void __devinit AscToggleIRQAct(PortAddr iop_base)
7010 {
7011         AscSetChipStatus(iop_base, CIW_IRQ_ACT);
7012         AscSetChipStatus(iop_base, 0);
7013         return;
7014 }
7015
7016 static uchar __devinit AscGetChipIRQ(PortAddr iop_base, ushort bus_type)
7017 {
7018         ushort cfg_lsw;
7019         uchar chip_irq;
7020
7021         if ((bus_type & ASC_IS_EISA) != 0) {
7022                 cfg_lsw = AscGetEisaChipCfg(iop_base);
7023                 chip_irq = (uchar)(((cfg_lsw >> 8) & 0x07) + 10);
7024                 if ((chip_irq == 13) || (chip_irq > 15)) {
7025                         return (0);
7026                 }
7027                 return (chip_irq);
7028         }
7029         if ((bus_type & ASC_IS_VL) != 0) {
7030                 cfg_lsw = AscGetChipCfgLsw(iop_base);
7031                 chip_irq = (uchar)(((cfg_lsw >> 2) & 0x07));
7032                 if ((chip_irq == 0) || (chip_irq == 4) || (chip_irq == 7)) {
7033                         return (0);
7034                 }
7035                 return ((uchar)(chip_irq + (ASC_MIN_IRQ_NO - 1)));
7036         }
7037         cfg_lsw = AscGetChipCfgLsw(iop_base);
7038         chip_irq = (uchar)(((cfg_lsw >> 2) & 0x03));
7039         if (chip_irq == 3)
7040                 chip_irq += (uchar)2;
7041         return ((uchar)(chip_irq + ASC_MIN_IRQ_NO));
7042 }
7043
7044 static uchar __devinit
7045 AscSetChipIRQ(PortAddr iop_base, uchar irq_no, ushort bus_type)
7046 {
7047         ushort cfg_lsw;
7048
7049         if ((bus_type & ASC_IS_VL) != 0) {
7050                 if (irq_no != 0) {
7051                         if ((irq_no < ASC_MIN_IRQ_NO)
7052                             || (irq_no > ASC_MAX_IRQ_NO)) {
7053                                 irq_no = 0;
7054                         } else {
7055                                 irq_no -= (uchar)((ASC_MIN_IRQ_NO - 1));
7056                         }
7057                 }
7058                 cfg_lsw = (ushort)(AscGetChipCfgLsw(iop_base) & 0xFFE3);
7059                 cfg_lsw |= (ushort)0x0010;
7060                 AscSetChipCfgLsw(iop_base, cfg_lsw);
7061                 AscToggleIRQAct(iop_base);
7062                 cfg_lsw = (ushort)(AscGetChipCfgLsw(iop_base) & 0xFFE0);
7063                 cfg_lsw |= (ushort)((irq_no & 0x07) << 2);
7064                 AscSetChipCfgLsw(iop_base, cfg_lsw);
7065                 AscToggleIRQAct(iop_base);
7066                 return (AscGetChipIRQ(iop_base, bus_type));
7067         }
7068         if ((bus_type & (ASC_IS_ISA)) != 0) {
7069                 if (irq_no == 15)
7070                         irq_no -= (uchar)2;
7071                 irq_no -= (uchar)ASC_MIN_IRQ_NO;
7072                 cfg_lsw = (ushort)(AscGetChipCfgLsw(iop_base) & 0xFFF3);
7073                 cfg_lsw |= (ushort)((irq_no & 0x03) << 2);
7074                 AscSetChipCfgLsw(iop_base, cfg_lsw);
7075                 return (AscGetChipIRQ(iop_base, bus_type));
7076         }
7077         return (0);
7078 }
7079
7080 #ifdef CONFIG_ISA
7081 static void __devinit AscEnableIsaDma(uchar dma_channel)
7082 {
7083         if (dma_channel < 4) {
7084                 outp(0x000B, (ushort)(0xC0 | dma_channel));
7085                 outp(0x000A, dma_channel);
7086         } else if (dma_channel < 8) {
7087                 outp(0x00D6, (ushort)(0xC0 | (dma_channel - 4)));
7088                 outp(0x00D4, (ushort)(dma_channel - 4));
7089         }
7090         return;
7091 }
7092 #endif /* CONFIG_ISA */
7093
7094 static int AscIsrChipHalted(ASC_DVC_VAR *asc_dvc)
7095 {
7096         EXT_MSG ext_msg;
7097         EXT_MSG out_msg;
7098         ushort halt_q_addr;
7099         int sdtr_accept;
7100         ushort int_halt_code;
7101         ASC_SCSI_BIT_ID_TYPE scsi_busy;
7102         ASC_SCSI_BIT_ID_TYPE target_id;
7103         PortAddr iop_base;
7104         uchar tag_code;
7105         uchar q_status;
7106         uchar halt_qp;
7107         uchar sdtr_data;
7108         uchar target_ix;
7109         uchar q_cntl, tid_no;
7110         uchar cur_dvc_qng;
7111         uchar asyn_sdtr;
7112         uchar scsi_status;
7113         asc_board_t *boardp;
7114
7115         ASC_ASSERT(asc_dvc->drv_ptr != NULL);
7116         boardp = asc_dvc->drv_ptr;
7117
7118         iop_base = asc_dvc->iop_base;
7119         int_halt_code = AscReadLramWord(iop_base, ASCV_HALTCODE_W);
7120
7121         halt_qp = AscReadLramByte(iop_base, ASCV_CURCDB_B);
7122         halt_q_addr = ASC_QNO_TO_QADDR(halt_qp);
7123         target_ix = AscReadLramByte(iop_base,
7124                                     (ushort)(halt_q_addr +
7125                                              (ushort)ASC_SCSIQ_B_TARGET_IX));
7126         q_cntl =
7127             AscReadLramByte(iop_base,
7128                             (ushort)(halt_q_addr + (ushort)ASC_SCSIQ_B_CNTL));
7129         tid_no = ASC_TIX_TO_TID(target_ix);
7130         target_id = (uchar)ASC_TID_TO_TARGET_ID(tid_no);
7131         if (asc_dvc->pci_fix_asyn_xfer & target_id) {
7132                 asyn_sdtr = ASYN_SDTR_DATA_FIX_PCI_REV_AB;
7133         } else {
7134                 asyn_sdtr = 0;
7135         }
7136         if (int_halt_code == ASC_HALT_DISABLE_ASYN_USE_SYN_FIX) {
7137                 if (asc_dvc->pci_fix_asyn_xfer & target_id) {
7138                         AscSetChipSDTR(iop_base, 0, tid_no);
7139                         boardp->sdtr_data[tid_no] = 0;
7140                 }
7141                 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7142                 return (0);
7143         } else if (int_halt_code == ASC_HALT_ENABLE_ASYN_USE_SYN_FIX) {
7144                 if (asc_dvc->pci_fix_asyn_xfer & target_id) {
7145                         AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
7146                         boardp->sdtr_data[tid_no] = asyn_sdtr;
7147                 }
7148                 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7149                 return (0);
7150         } else if (int_halt_code == ASC_HALT_EXTMSG_IN) {
7151
7152                 AscMemWordCopyPtrFromLram(iop_base,
7153                                           ASCV_MSGIN_BEG,
7154                                           (uchar *)&ext_msg,
7155                                           sizeof(EXT_MSG) >> 1);
7156
7157                 if (ext_msg.msg_type == EXTENDED_MESSAGE &&
7158                     ext_msg.msg_req == EXTENDED_SDTR &&
7159                     ext_msg.msg_len == MS_SDTR_LEN) {
7160                         sdtr_accept = TRUE;
7161                         if ((ext_msg.req_ack_offset > ASC_SYN_MAX_OFFSET)) {
7162
7163                                 sdtr_accept = FALSE;
7164                                 ext_msg.req_ack_offset = ASC_SYN_MAX_OFFSET;
7165                         }
7166                         if ((ext_msg.xfer_period <
7167                              asc_dvc->sdtr_period_tbl[asc_dvc->
7168                                                       host_init_sdtr_index])
7169                             || (ext_msg.xfer_period >
7170                                 asc_dvc->sdtr_period_tbl[asc_dvc->
7171                                                          max_sdtr_index])) {
7172                                 sdtr_accept = FALSE;
7173                                 ext_msg.xfer_period =
7174                                     asc_dvc->sdtr_period_tbl[asc_dvc->
7175                                                              host_init_sdtr_index];
7176                         }
7177                         if (sdtr_accept) {
7178                                 sdtr_data =
7179                                     AscCalSDTRData(asc_dvc, ext_msg.xfer_period,
7180                                                    ext_msg.req_ack_offset);
7181                                 if ((sdtr_data == 0xFF)) {
7182
7183                                         q_cntl |= QC_MSG_OUT;
7184                                         asc_dvc->init_sdtr &= ~target_id;
7185                                         asc_dvc->sdtr_done &= ~target_id;
7186                                         AscSetChipSDTR(iop_base, asyn_sdtr,
7187                                                        tid_no);
7188                                         boardp->sdtr_data[tid_no] = asyn_sdtr;
7189                                 }
7190                         }
7191                         if (ext_msg.req_ack_offset == 0) {
7192
7193                                 q_cntl &= ~QC_MSG_OUT;
7194                                 asc_dvc->init_sdtr &= ~target_id;
7195                                 asc_dvc->sdtr_done &= ~target_id;
7196                                 AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
7197                         } else {
7198                                 if (sdtr_accept && (q_cntl & QC_MSG_OUT)) {
7199
7200                                         q_cntl &= ~QC_MSG_OUT;
7201                                         asc_dvc->sdtr_done |= target_id;
7202                                         asc_dvc->init_sdtr |= target_id;
7203                                         asc_dvc->pci_fix_asyn_xfer &=
7204                                             ~target_id;
7205                                         sdtr_data =
7206                                             AscCalSDTRData(asc_dvc,
7207                                                            ext_msg.xfer_period,
7208                                                            ext_msg.
7209                                                            req_ack_offset);
7210                                         AscSetChipSDTR(iop_base, sdtr_data,
7211                                                        tid_no);
7212                                         boardp->sdtr_data[tid_no] = sdtr_data;
7213                                 } else {
7214
7215                                         q_cntl |= QC_MSG_OUT;
7216                                         AscMsgOutSDTR(asc_dvc,
7217                                                       ext_msg.xfer_period,
7218                                                       ext_msg.req_ack_offset);
7219                                         asc_dvc->pci_fix_asyn_xfer &=
7220                                             ~target_id;
7221                                         sdtr_data =
7222                                             AscCalSDTRData(asc_dvc,
7223                                                            ext_msg.xfer_period,
7224                                                            ext_msg.
7225                                                            req_ack_offset);
7226                                         AscSetChipSDTR(iop_base, sdtr_data,
7227                                                        tid_no);
7228                                         boardp->sdtr_data[tid_no] = sdtr_data;
7229                                         asc_dvc->sdtr_done |= target_id;
7230                                         asc_dvc->init_sdtr |= target_id;
7231                                 }
7232                         }
7233
7234                         AscWriteLramByte(iop_base,
7235                                          (ushort)(halt_q_addr +
7236                                                   (ushort)ASC_SCSIQ_B_CNTL),
7237                                          q_cntl);
7238                         AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7239                         return (0);
7240                 } else if (ext_msg.msg_type == EXTENDED_MESSAGE &&
7241                            ext_msg.msg_req == EXTENDED_WDTR &&
7242                            ext_msg.msg_len == MS_WDTR_LEN) {
7243
7244                         ext_msg.wdtr_width = 0;
7245                         AscMemWordCopyPtrToLram(iop_base,
7246                                                 ASCV_MSGOUT_BEG,
7247                                                 (uchar *)&ext_msg,
7248                                                 sizeof(EXT_MSG) >> 1);
7249                         q_cntl |= QC_MSG_OUT;
7250                         AscWriteLramByte(iop_base,
7251                                          (ushort)(halt_q_addr +
7252                                                   (ushort)ASC_SCSIQ_B_CNTL),
7253                                          q_cntl);
7254                         AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7255                         return (0);
7256                 } else {
7257
7258                         ext_msg.msg_type = MESSAGE_REJECT;
7259                         AscMemWordCopyPtrToLram(iop_base,
7260                                                 ASCV_MSGOUT_BEG,
7261                                                 (uchar *)&ext_msg,
7262                                                 sizeof(EXT_MSG) >> 1);
7263                         q_cntl |= QC_MSG_OUT;
7264                         AscWriteLramByte(iop_base,
7265                                          (ushort)(halt_q_addr +
7266                                                   (ushort)ASC_SCSIQ_B_CNTL),
7267                                          q_cntl);
7268                         AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7269                         return (0);
7270                 }
7271         } else if (int_halt_code == ASC_HALT_CHK_CONDITION) {
7272
7273                 q_cntl |= QC_REQ_SENSE;
7274
7275                 if ((asc_dvc->init_sdtr & target_id) != 0) {
7276
7277                         asc_dvc->sdtr_done &= ~target_id;
7278
7279                         sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
7280                         q_cntl |= QC_MSG_OUT;
7281                         AscMsgOutSDTR(asc_dvc,
7282                                       asc_dvc->
7283                                       sdtr_period_tbl[(sdtr_data >> 4) &
7284                                                       (uchar)(asc_dvc->
7285                                                               max_sdtr_index -
7286                                                               1)],
7287                                       (uchar)(sdtr_data & (uchar)
7288                                               ASC_SYN_MAX_OFFSET));
7289                 }
7290
7291                 AscWriteLramByte(iop_base,
7292                                  (ushort)(halt_q_addr +
7293                                           (ushort)ASC_SCSIQ_B_CNTL), q_cntl);
7294
7295                 tag_code = AscReadLramByte(iop_base,
7296                                            (ushort)(halt_q_addr + (ushort)
7297                                                     ASC_SCSIQ_B_TAG_CODE));
7298                 tag_code &= 0xDC;
7299                 if ((asc_dvc->pci_fix_asyn_xfer & target_id)
7300                     && !(asc_dvc->pci_fix_asyn_xfer_always & target_id)
7301                     ) {
7302
7303                         tag_code |= (ASC_TAG_FLAG_DISABLE_DISCONNECT
7304                                      | ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX);
7305
7306                 }
7307                 AscWriteLramByte(iop_base,
7308                                  (ushort)(halt_q_addr +
7309                                           (ushort)ASC_SCSIQ_B_TAG_CODE),
7310                                  tag_code);
7311
7312                 q_status = AscReadLramByte(iop_base,
7313                                            (ushort)(halt_q_addr + (ushort)
7314                                                     ASC_SCSIQ_B_STATUS));
7315                 q_status |= (QS_READY | QS_BUSY);
7316                 AscWriteLramByte(iop_base,
7317                                  (ushort)(halt_q_addr +
7318                                           (ushort)ASC_SCSIQ_B_STATUS),
7319                                  q_status);
7320
7321                 scsi_busy = AscReadLramByte(iop_base, (ushort)ASCV_SCSIBUSY_B);
7322                 scsi_busy &= ~target_id;
7323                 AscWriteLramByte(iop_base, (ushort)ASCV_SCSIBUSY_B, scsi_busy);
7324
7325                 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7326                 return (0);
7327         } else if (int_halt_code == ASC_HALT_SDTR_REJECTED) {
7328
7329                 AscMemWordCopyPtrFromLram(iop_base,
7330                                           ASCV_MSGOUT_BEG,
7331                                           (uchar *)&out_msg,
7332                                           sizeof(EXT_MSG) >> 1);
7333
7334                 if ((out_msg.msg_type == EXTENDED_MESSAGE) &&
7335                     (out_msg.msg_len == MS_SDTR_LEN) &&
7336                     (out_msg.msg_req == EXTENDED_SDTR)) {
7337
7338                         asc_dvc->init_sdtr &= ~target_id;
7339                         asc_dvc->sdtr_done &= ~target_id;
7340                         AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
7341                         boardp->sdtr_data[tid_no] = asyn_sdtr;
7342                 }
7343                 q_cntl &= ~QC_MSG_OUT;
7344                 AscWriteLramByte(iop_base,
7345                                  (ushort)(halt_q_addr +
7346                                           (ushort)ASC_SCSIQ_B_CNTL), q_cntl);
7347                 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7348                 return (0);
7349         } else if (int_halt_code == ASC_HALT_SS_QUEUE_FULL) {
7350
7351                 scsi_status = AscReadLramByte(iop_base,
7352                                               (ushort)((ushort)halt_q_addr +
7353                                                        (ushort)
7354                                                        ASC_SCSIQ_SCSI_STATUS));
7355                 cur_dvc_qng =
7356                     AscReadLramByte(iop_base,
7357                                     (ushort)((ushort)ASC_QADR_BEG +
7358                                              (ushort)target_ix));
7359                 if ((cur_dvc_qng > 0) && (asc_dvc->cur_dvc_qng[tid_no] > 0)) {
7360
7361                         scsi_busy = AscReadLramByte(iop_base,
7362                                                     (ushort)ASCV_SCSIBUSY_B);
7363                         scsi_busy |= target_id;
7364                         AscWriteLramByte(iop_base,
7365                                          (ushort)ASCV_SCSIBUSY_B, scsi_busy);
7366                         asc_dvc->queue_full_or_busy |= target_id;
7367
7368                         if (scsi_status == SAM_STAT_TASK_SET_FULL) {
7369                                 if (cur_dvc_qng > ASC_MIN_TAGGED_CMD) {
7370                                         cur_dvc_qng -= 1;
7371                                         asc_dvc->max_dvc_qng[tid_no] =
7372                                             cur_dvc_qng;
7373
7374                                         AscWriteLramByte(iop_base,
7375                                                          (ushort)((ushort)
7376                                                                   ASCV_MAX_DVC_QNG_BEG
7377                                                                   + (ushort)
7378                                                                   tid_no),
7379                                                          cur_dvc_qng);
7380
7381                                         /*
7382                                          * Set the device queue depth to the number of
7383                                          * active requests when the QUEUE FULL condition
7384                                          * was encountered.
7385                                          */
7386                                         boardp->queue_full |= target_id;
7387                                         boardp->queue_full_cnt[tid_no] =
7388                                             cur_dvc_qng;
7389                                 }
7390                         }
7391                 }
7392                 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7393                 return (0);
7394         }
7395 #if CC_VERY_LONG_SG_LIST
7396         else if (int_halt_code == ASC_HALT_HOST_COPY_SG_LIST_TO_RISC) {
7397                 uchar q_no;
7398                 ushort q_addr;
7399                 uchar sg_wk_q_no;
7400                 uchar first_sg_wk_q_no;
7401                 ASC_SCSI_Q *scsiq;      /* Ptr to driver request. */
7402                 ASC_SG_HEAD *sg_head;   /* Ptr to driver SG request. */
7403                 ASC_SG_LIST_Q scsi_sg_q;        /* Structure written to queue. */
7404                 ushort sg_list_dwords;
7405                 ushort sg_entry_cnt;
7406                 uchar next_qp;
7407                 int i;
7408
7409                 q_no = AscReadLramByte(iop_base, (ushort)ASCV_REQ_SG_LIST_QP);
7410                 if (q_no == ASC_QLINK_END) {
7411                         return (0);
7412                 }
7413
7414                 q_addr = ASC_QNO_TO_QADDR(q_no);
7415
7416                 /*
7417                  * Convert the request's SRB pointer to a host ASC_SCSI_REQ
7418                  * structure pointer using a macro provided by the driver.
7419                  * The ASC_SCSI_REQ pointer provides a pointer to the
7420                  * host ASC_SG_HEAD structure.
7421                  */
7422                 /* Read request's SRB pointer. */
7423                 scsiq = (ASC_SCSI_Q *)
7424                     ASC_SRB2SCSIQ(ASC_U32_TO_VADDR(AscReadLramDWord(iop_base,
7425                                                                     (ushort)
7426                                                                     (q_addr +
7427                                                                      ASC_SCSIQ_D_SRBPTR))));
7428
7429                 /*
7430                  * Get request's first and working SG queue.
7431                  */
7432                 sg_wk_q_no = AscReadLramByte(iop_base,
7433                                              (ushort)(q_addr +
7434                                                       ASC_SCSIQ_B_SG_WK_QP));
7435
7436                 first_sg_wk_q_no = AscReadLramByte(iop_base,
7437                                                    (ushort)(q_addr +
7438                                                             ASC_SCSIQ_B_FIRST_SG_WK_QP));
7439
7440                 /*
7441                  * Reset request's working SG queue back to the
7442                  * first SG queue.
7443                  */
7444                 AscWriteLramByte(iop_base,
7445                                  (ushort)(q_addr +
7446                                           (ushort)ASC_SCSIQ_B_SG_WK_QP),
7447                                  first_sg_wk_q_no);
7448
7449                 sg_head = scsiq->sg_head;
7450
7451                 /*
7452                  * Set sg_entry_cnt to the number of SG elements
7453                  * that will be completed on this interrupt.
7454                  *
7455                  * Note: The allocated SG queues contain ASC_MAX_SG_LIST - 1
7456                  * SG elements. The data_cnt and data_addr fields which
7457                  * add 1 to the SG element capacity are not used when
7458                  * restarting SG handling after a halt.
7459                  */
7460                 if (scsiq->remain_sg_entry_cnt > (ASC_MAX_SG_LIST - 1)) {
7461                         sg_entry_cnt = ASC_MAX_SG_LIST - 1;
7462
7463                         /*
7464                          * Keep track of remaining number of SG elements that will
7465                          * need to be handled on the next interrupt.
7466                          */
7467                         scsiq->remain_sg_entry_cnt -= (ASC_MAX_SG_LIST - 1);
7468                 } else {
7469                         sg_entry_cnt = scsiq->remain_sg_entry_cnt;
7470                         scsiq->remain_sg_entry_cnt = 0;
7471                 }
7472
7473                 /*
7474                  * Copy SG elements into the list of allocated SG queues.
7475                  *
7476                  * Last index completed is saved in scsiq->next_sg_index.
7477                  */
7478                 next_qp = first_sg_wk_q_no;
7479                 q_addr = ASC_QNO_TO_QADDR(next_qp);
7480                 scsi_sg_q.sg_head_qp = q_no;
7481                 scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
7482                 for (i = 0; i < sg_head->queue_cnt; i++) {
7483                         scsi_sg_q.seq_no = i + 1;
7484                         if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
7485                                 sg_list_dwords = (uchar)(ASC_SG_LIST_PER_Q * 2);
7486                                 sg_entry_cnt -= ASC_SG_LIST_PER_Q;
7487                                 /*
7488                                  * After very first SG queue RISC FW uses next
7489                                  * SG queue first element then checks sg_list_cnt
7490                                  * against zero and then decrements, so set
7491                                  * sg_list_cnt 1 less than number of SG elements
7492                                  * in each SG queue.
7493                                  */
7494                                 scsi_sg_q.sg_list_cnt = ASC_SG_LIST_PER_Q - 1;
7495                                 scsi_sg_q.sg_cur_list_cnt =
7496                                     ASC_SG_LIST_PER_Q - 1;
7497                         } else {
7498                                 /*
7499                                  * This is the last SG queue in the list of
7500                                  * allocated SG queues. If there are more
7501                                  * SG elements than will fit in the allocated
7502                                  * queues, then set the QCSG_SG_XFER_MORE flag.
7503                                  */
7504                                 if (scsiq->remain_sg_entry_cnt != 0) {
7505                                         scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
7506                                 } else {
7507                                         scsi_sg_q.cntl |= QCSG_SG_XFER_END;
7508                                 }
7509                                 /* equals sg_entry_cnt * 2 */
7510                                 sg_list_dwords = sg_entry_cnt << 1;
7511                                 scsi_sg_q.sg_list_cnt = sg_entry_cnt - 1;
7512                                 scsi_sg_q.sg_cur_list_cnt = sg_entry_cnt - 1;
7513                                 sg_entry_cnt = 0;
7514                         }
7515
7516                         scsi_sg_q.q_no = next_qp;
7517                         AscMemWordCopyPtrToLram(iop_base,
7518                                                 q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
7519                                                 (uchar *)&scsi_sg_q,
7520                                                 sizeof(ASC_SG_LIST_Q) >> 1);
7521
7522                         AscMemDWordCopyPtrToLram(iop_base,
7523                                                  q_addr + ASC_SGQ_LIST_BEG,
7524                                                  (uchar *)&sg_head->
7525                                                  sg_list[scsiq->next_sg_index],
7526                                                  sg_list_dwords);
7527
7528                         scsiq->next_sg_index += ASC_SG_LIST_PER_Q;
7529
7530                         /*
7531                          * If the just completed SG queue contained the
7532                          * last SG element, then no more SG queues need
7533                          * to be written.
7534                          */
7535                         if (scsi_sg_q.cntl & QCSG_SG_XFER_END) {
7536                                 break;
7537                         }
7538
7539                         next_qp = AscReadLramByte(iop_base,
7540                                                   (ushort)(q_addr +
7541                                                            ASC_SCSIQ_B_FWD));
7542                         q_addr = ASC_QNO_TO_QADDR(next_qp);
7543                 }
7544
7545                 /*
7546                  * Clear the halt condition so the RISC will be restarted
7547                  * after the return.
7548                  */
7549                 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
7550                 return (0);
7551         }
7552 #endif /* CC_VERY_LONG_SG_LIST */
7553         return (0);
7554 }
7555
7556 static uchar
7557 _AscCopyLramScsiDoneQ(PortAddr iop_base,
7558                       ushort q_addr,
7559                       ASC_QDONE_INFO *scsiq, ASC_DCNT max_dma_count)
7560 {
7561         ushort _val;
7562         uchar sg_queue_cnt;
7563
7564         DvcGetQinfo(iop_base,
7565                     q_addr + ASC_SCSIQ_DONE_INFO_BEG,
7566                     (uchar *)scsiq,
7567                     (sizeof(ASC_SCSIQ_2) + sizeof(ASC_SCSIQ_3)) / 2);
7568
7569         _val = AscReadLramWord(iop_base,
7570                                (ushort)(q_addr + (ushort)ASC_SCSIQ_B_STATUS));
7571         scsiq->q_status = (uchar)_val;
7572         scsiq->q_no = (uchar)(_val >> 8);
7573         _val = AscReadLramWord(iop_base,
7574                                (ushort)(q_addr + (ushort)ASC_SCSIQ_B_CNTL));
7575         scsiq->cntl = (uchar)_val;
7576         sg_queue_cnt = (uchar)(_val >> 8);
7577         _val = AscReadLramWord(iop_base,
7578                                (ushort)(q_addr +
7579                                         (ushort)ASC_SCSIQ_B_SENSE_LEN));
7580         scsiq->sense_len = (uchar)_val;
7581         scsiq->extra_bytes = (uchar)(_val >> 8);
7582
7583         /*
7584          * Read high word of remain bytes from alternate location.
7585          */
7586         scsiq->remain_bytes = (((ADV_DCNT)AscReadLramWord(iop_base,
7587                                                           (ushort)(q_addr +
7588                                                                    (ushort)
7589                                                                    ASC_SCSIQ_W_ALT_DC1)))
7590                                << 16);
7591         /*
7592          * Read low word of remain bytes from original location.
7593          */
7594         scsiq->remain_bytes += AscReadLramWord(iop_base,
7595                                                (ushort)(q_addr + (ushort)
7596                                                         ASC_SCSIQ_DW_REMAIN_XFER_CNT));
7597
7598         scsiq->remain_bytes &= max_dma_count;
7599         return (sg_queue_cnt);
7600 }
7601
7602 static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
7603 {
7604         uchar next_qp;
7605         uchar n_q_used;
7606         uchar sg_list_qp;
7607         uchar sg_queue_cnt;
7608         uchar q_cnt;
7609         uchar done_q_tail;
7610         uchar tid_no;
7611         ASC_SCSI_BIT_ID_TYPE scsi_busy;
7612         ASC_SCSI_BIT_ID_TYPE target_id;
7613         PortAddr iop_base;
7614         ushort q_addr;
7615         ushort sg_q_addr;
7616         uchar cur_target_qng;
7617         ASC_QDONE_INFO scsiq_buf;
7618         ASC_QDONE_INFO *scsiq;
7619         int false_overrun;
7620
7621         iop_base = asc_dvc->iop_base;
7622         n_q_used = 1;
7623         scsiq = (ASC_QDONE_INFO *)&scsiq_buf;
7624         done_q_tail = (uchar)AscGetVarDoneQTail(iop_base);
7625         q_addr = ASC_QNO_TO_QADDR(done_q_tail);
7626         next_qp = AscReadLramByte(iop_base,
7627                                   (ushort)(q_addr + (ushort)ASC_SCSIQ_B_FWD));
7628         if (next_qp != ASC_QLINK_END) {
7629                 AscPutVarDoneQTail(iop_base, next_qp);
7630                 q_addr = ASC_QNO_TO_QADDR(next_qp);
7631                 sg_queue_cnt = _AscCopyLramScsiDoneQ(iop_base, q_addr, scsiq,
7632                                                      asc_dvc->max_dma_count);
7633                 AscWriteLramByte(iop_base,
7634                                  (ushort)(q_addr +
7635                                           (ushort)ASC_SCSIQ_B_STATUS),
7636                                  (uchar)(scsiq->
7637                                          q_status & (uchar)~(QS_READY |
7638                                                              QS_ABORTED)));
7639                 tid_no = ASC_TIX_TO_TID(scsiq->d2.target_ix);
7640                 target_id = ASC_TIX_TO_TARGET_ID(scsiq->d2.target_ix);
7641                 if ((scsiq->cntl & QC_SG_HEAD) != 0) {
7642                         sg_q_addr = q_addr;
7643                         sg_list_qp = next_qp;
7644                         for (q_cnt = 0; q_cnt < sg_queue_cnt; q_cnt++) {
7645                                 sg_list_qp = AscReadLramByte(iop_base,
7646                                                              (ushort)(sg_q_addr
7647                                                                       + (ushort)
7648                                                                       ASC_SCSIQ_B_FWD));
7649                                 sg_q_addr = ASC_QNO_TO_QADDR(sg_list_qp);
7650                                 if (sg_list_qp == ASC_QLINK_END) {
7651                                         AscSetLibErrorCode(asc_dvc,
7652                                                            ASCQ_ERR_SG_Q_LINKS);
7653                                         scsiq->d3.done_stat = QD_WITH_ERROR;
7654                                         scsiq->d3.host_stat =
7655                                             QHSTA_D_QDONE_SG_LIST_CORRUPTED;
7656                                         goto FATAL_ERR_QDONE;
7657                                 }
7658                                 AscWriteLramByte(iop_base,
7659                                                  (ushort)(sg_q_addr + (ushort)
7660                                                           ASC_SCSIQ_B_STATUS),
7661                                                  QS_FREE);
7662                         }
7663                         n_q_used = sg_queue_cnt + 1;
7664                         AscPutVarDoneQTail(iop_base, sg_list_qp);
7665                 }
7666                 if (asc_dvc->queue_full_or_busy & target_id) {
7667                         cur_target_qng = AscReadLramByte(iop_base,
7668                                                          (ushort)((ushort)
7669                                                                   ASC_QADR_BEG
7670                                                                   + (ushort)
7671                                                                   scsiq->d2.
7672                                                                   target_ix));
7673                         if (cur_target_qng < asc_dvc->max_dvc_qng[tid_no]) {
7674                                 scsi_busy = AscReadLramByte(iop_base, (ushort)
7675                                                             ASCV_SCSIBUSY_B);
7676                                 scsi_busy &= ~target_id;
7677                                 AscWriteLramByte(iop_base,
7678                                                  (ushort)ASCV_SCSIBUSY_B,
7679                                                  scsi_busy);
7680                                 asc_dvc->queue_full_or_busy &= ~target_id;
7681                         }
7682                 }
7683                 if (asc_dvc->cur_total_qng >= n_q_used) {
7684                         asc_dvc->cur_total_qng -= n_q_used;
7685                         if (asc_dvc->cur_dvc_qng[tid_no] != 0) {
7686                                 asc_dvc->cur_dvc_qng[tid_no]--;
7687                         }
7688                 } else {
7689                         AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CUR_QNG);
7690                         scsiq->d3.done_stat = QD_WITH_ERROR;
7691                         goto FATAL_ERR_QDONE;
7692                 }
7693                 if ((scsiq->d2.srb_ptr == 0UL) ||
7694                     ((scsiq->q_status & QS_ABORTED) != 0)) {
7695                         return (0x11);
7696                 } else if (scsiq->q_status == QS_DONE) {
7697                         false_overrun = FALSE;
7698                         if (scsiq->extra_bytes != 0) {
7699                                 scsiq->remain_bytes +=
7700                                     (ADV_DCNT)scsiq->extra_bytes;
7701                         }
7702                         if (scsiq->d3.done_stat == QD_WITH_ERROR) {
7703                                 if (scsiq->d3.host_stat ==
7704                                     QHSTA_M_DATA_OVER_RUN) {
7705                                         if ((scsiq->
7706                                              cntl & (QC_DATA_IN | QC_DATA_OUT))
7707                                             == 0) {
7708                                                 scsiq->d3.done_stat =
7709                                                     QD_NO_ERROR;
7710                                                 scsiq->d3.host_stat =
7711                                                     QHSTA_NO_ERROR;
7712                                         } else if (false_overrun) {
7713                                                 scsiq->d3.done_stat =
7714                                                     QD_NO_ERROR;
7715                                                 scsiq->d3.host_stat =
7716                                                     QHSTA_NO_ERROR;
7717                                         }
7718                                 } else if (scsiq->d3.host_stat ==
7719                                            QHSTA_M_HUNG_REQ_SCSI_BUS_RESET) {
7720                                         AscStopChip(iop_base);
7721                                         AscSetChipControl(iop_base,
7722                                                           (uchar)(CC_SCSI_RESET
7723                                                                   | CC_HALT));
7724                                         DvcDelayNanoSecond(asc_dvc, 60000);
7725                                         AscSetChipControl(iop_base, CC_HALT);
7726                                         AscSetChipStatus(iop_base,
7727                                                          CIW_CLR_SCSI_RESET_INT);
7728                                         AscSetChipStatus(iop_base, 0);
7729                                         AscSetChipControl(iop_base, 0);
7730                                 }
7731                         }
7732                         if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
7733                                 asc_isr_callback(asc_dvc, scsiq);
7734                         } else {
7735                                 if ((AscReadLramByte(iop_base,
7736                                                      (ushort)(q_addr + (ushort)
7737                                                               ASC_SCSIQ_CDB_BEG))
7738                                      == START_STOP)) {
7739                                         asc_dvc->unit_not_ready &= ~target_id;
7740                                         if (scsiq->d3.done_stat != QD_NO_ERROR) {
7741                                                 asc_dvc->start_motor &=
7742                                                     ~target_id;
7743                                         }
7744                                 }
7745                         }
7746                         return (1);
7747                 } else {
7748                         AscSetLibErrorCode(asc_dvc, ASCQ_ERR_Q_STATUS);
7749  FATAL_ERR_QDONE:
7750                         if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
7751                                 asc_isr_callback(asc_dvc, scsiq);
7752                         }
7753                         return (0x80);
7754                 }
7755         }
7756         return (0);
7757 }
7758
7759 static int AscISR(ASC_DVC_VAR *asc_dvc)
7760 {
7761         ASC_CS_TYPE chipstat;
7762         PortAddr iop_base;
7763         ushort saved_ram_addr;
7764         uchar ctrl_reg;
7765         uchar saved_ctrl_reg;
7766         int int_pending;
7767         int status;
7768         uchar host_flag;
7769
7770         iop_base = asc_dvc->iop_base;
7771         int_pending = FALSE;
7772
7773         if (AscIsIntPending(iop_base) == 0) {
7774                 return int_pending;
7775         }
7776
7777         if ((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0) {
7778                 return (ERR);
7779         }
7780         if (asc_dvc->in_critical_cnt != 0) {
7781                 AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_ON_CRITICAL);
7782                 return (ERR);
7783         }
7784         if (asc_dvc->is_in_int) {
7785                 AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_RE_ENTRY);
7786                 return (ERR);
7787         }
7788         asc_dvc->is_in_int = TRUE;
7789         ctrl_reg = AscGetChipControl(iop_base);
7790         saved_ctrl_reg = ctrl_reg & (~(CC_SCSI_RESET | CC_CHIP_RESET |
7791                                        CC_SINGLE_STEP | CC_DIAG | CC_TEST));
7792         chipstat = AscGetChipStatus(iop_base);
7793         if (chipstat & CSW_SCSI_RESET_LATCH) {
7794                 if (!(asc_dvc->bus_type & (ASC_IS_VL | ASC_IS_EISA))) {
7795                         int i = 10;
7796                         int_pending = TRUE;
7797                         asc_dvc->sdtr_done = 0;
7798                         saved_ctrl_reg &= (uchar)(~CC_HALT);
7799                         while ((AscGetChipStatus(iop_base) &
7800                                 CSW_SCSI_RESET_ACTIVE) && (i-- > 0)) {
7801                                 DvcSleepMilliSecond(100);
7802                         }
7803                         AscSetChipControl(iop_base, (CC_CHIP_RESET | CC_HALT));
7804                         AscSetChipControl(iop_base, CC_HALT);
7805                         AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
7806                         AscSetChipStatus(iop_base, 0);
7807                         chipstat = AscGetChipStatus(iop_base);
7808                 }
7809         }
7810         saved_ram_addr = AscGetChipLramAddr(iop_base);
7811         host_flag = AscReadLramByte(iop_base,
7812                                     ASCV_HOST_FLAG_B) &
7813             (uchar)(~ASC_HOST_FLAG_IN_ISR);
7814         AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
7815                          (uchar)(host_flag | (uchar)ASC_HOST_FLAG_IN_ISR));
7816         if ((chipstat & CSW_INT_PENDING)
7817             || (int_pending)
7818             ) {
7819                 AscAckInterrupt(iop_base);
7820                 int_pending = TRUE;
7821                 if ((chipstat & CSW_HALTED) && (ctrl_reg & CC_SINGLE_STEP)) {
7822                         if (AscIsrChipHalted(asc_dvc) == ERR) {
7823                                 goto ISR_REPORT_QDONE_FATAL_ERROR;
7824                         } else {
7825                                 saved_ctrl_reg &= (uchar)(~CC_HALT);
7826                         }
7827                 } else {
7828  ISR_REPORT_QDONE_FATAL_ERROR:
7829                         if ((asc_dvc->dvc_cntl & ASC_CNTL_INT_MULTI_Q) != 0) {
7830                                 while (((status =
7831                                          AscIsrQDone(asc_dvc)) & 0x01) != 0) {
7832                                 }
7833                         } else {
7834                                 do {
7835                                         if ((status =
7836                                              AscIsrQDone(asc_dvc)) == 1) {
7837                                                 break;
7838                                         }
7839                                 } while (status == 0x11);
7840                         }
7841                         if ((status & 0x80) != 0)
7842                                 int_pending = ERR;
7843                 }
7844         }
7845         AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
7846         AscSetChipLramAddr(iop_base, saved_ram_addr);
7847         AscSetChipControl(iop_base, saved_ctrl_reg);
7848         asc_dvc->is_in_int = FALSE;
7849         return (int_pending);
7850 }
7851
7852 /* Microcode buffer is kept after initialization for error recovery. */
7853 static uchar _asc_mcode_buf[] = {
7854         0x01, 0x03, 0x01, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7855         0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
7856         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7857         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7858         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7859         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x12, 0x0D, 0x05,
7860         0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7861         0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7862         0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xFF,
7863         0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
7864         0x00, 0x00, 0xE4, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x73, 0x48, 0x04,
7865         0x36, 0x00, 0x00, 0xA2, 0xC2, 0x00, 0x80, 0x73, 0x03, 0x23, 0x36, 0x40,
7866         0xB6, 0x00, 0x36, 0x00, 0x05, 0xD6, 0x0C, 0xD2, 0x12, 0xDA, 0x00, 0xA2,
7867         0xC2, 0x00, 0x92, 0x80, 0x1E, 0x98, 0x50, 0x00, 0xF5, 0x00, 0x48, 0x98,
7868         0xDF, 0x23, 0x36, 0x60, 0xB6, 0x00, 0x92, 0x80, 0x4F, 0x00, 0xF5, 0x00,
7869         0x48, 0x98, 0xEF, 0x23, 0x36, 0x60, 0xB6, 0x00, 0x92, 0x80, 0x80, 0x62,
7870         0x92, 0x80, 0x00, 0x46, 0x15, 0xEE, 0x13, 0xEA, 0x02, 0x01, 0x09, 0xD8,
7871         0xCD, 0x04, 0x4D, 0x00, 0x00, 0xA3, 0xD6, 0x00, 0xA6, 0x97, 0x7F, 0x23,
7872         0x04, 0x61, 0x84, 0x01, 0xE6, 0x84, 0xD2, 0xC1, 0x80, 0x73, 0xCD, 0x04,
7873         0x4D, 0x00, 0x00, 0xA3, 0xDA, 0x01, 0xA6, 0x97, 0xC6, 0x81, 0xC2, 0x88,
7874         0x80, 0x73, 0x80, 0x77, 0x00, 0x01, 0x01, 0xA1, 0xFE, 0x00, 0x4F, 0x00,
7875         0x84, 0x97, 0x07, 0xA6, 0x08, 0x01, 0x00, 0x33, 0x03, 0x00, 0xC2, 0x88,
7876         0x03, 0x03, 0x01, 0xDE, 0xC2, 0x88, 0xCE, 0x00, 0x69, 0x60, 0xCE, 0x00,
7877         0x02, 0x03, 0x4A, 0x60, 0x00, 0xA2, 0x78, 0x01, 0x80, 0x63, 0x07, 0xA6,
7878         0x24, 0x01, 0x78, 0x81, 0x03, 0x03, 0x80, 0x63, 0xE2, 0x00, 0x07, 0xA6,
7879         0x34, 0x01, 0x00, 0x33, 0x04, 0x00, 0xC2, 0x88, 0x03, 0x07, 0x02, 0x01,
7880         0x04, 0xCA, 0x0D, 0x23, 0x68, 0x98, 0x4D, 0x04, 0x04, 0x85, 0x05, 0xD8,
7881         0x0D, 0x23, 0x68, 0x98, 0xCD, 0x04, 0x15, 0x23, 0xF8, 0x88, 0xFB, 0x23,
7882         0x02, 0x61, 0x82, 0x01, 0x80, 0x63, 0x02, 0x03, 0x06, 0xA3, 0x62, 0x01,
7883         0x00, 0x33, 0x0A, 0x00, 0xC2, 0x88, 0x4E, 0x00, 0x07, 0xA3, 0x6E, 0x01,
7884         0x00, 0x33, 0x0B, 0x00, 0xC2, 0x88, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33,
7885         0x1A, 0x00, 0xC2, 0x88, 0x50, 0x04, 0x88, 0x81, 0x06, 0xAB, 0x82, 0x01,
7886         0x88, 0x81, 0x4E, 0x00, 0x07, 0xA3, 0x92, 0x01, 0x50, 0x00, 0x00, 0xA3,
7887         0x3C, 0x01, 0x00, 0x05, 0x7C, 0x81, 0x46, 0x97, 0x02, 0x01, 0x05, 0xC6,
7888         0x04, 0x23, 0xA0, 0x01, 0x15, 0x23, 0xA1, 0x01, 0xBE, 0x81, 0xFD, 0x23,
7889         0x02, 0x61, 0x82, 0x01, 0x0A, 0xDA, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA0,
7890         0xB4, 0x01, 0x80, 0x63, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33, 0x1B, 0x00,
7891         0xC2, 0x88, 0x06, 0x23, 0x68, 0x98, 0xCD, 0x04, 0xE6, 0x84, 0x06, 0x01,
7892         0x00, 0xA2, 0xD4, 0x01, 0x57, 0x60, 0x00, 0xA0, 0xDA, 0x01, 0xE6, 0x84,
7893         0x80, 0x23, 0xA0, 0x01, 0xE6, 0x84, 0x80, 0x73, 0x4B, 0x00, 0x06, 0x61,
7894         0x00, 0xA2, 0x00, 0x02, 0x04, 0x01, 0x0C, 0xDE, 0x02, 0x01, 0x03, 0xCC,
7895         0x4F, 0x00, 0x84, 0x97, 0xFC, 0x81, 0x08, 0x23, 0x02, 0x41, 0x82, 0x01,
7896         0x4F, 0x00, 0x62, 0x97, 0x48, 0x04, 0x84, 0x80, 0xF0, 0x97, 0x00, 0x46,
7897         0x56, 0x00, 0x03, 0xC0, 0x01, 0x23, 0xE8, 0x00, 0x81, 0x73, 0x06, 0x29,
7898         0x03, 0x42, 0x06, 0xE2, 0x03, 0xEE, 0x6B, 0xEB, 0x11, 0x23, 0xF8, 0x88,
7899         0x04, 0x98, 0xF0, 0x80, 0x80, 0x73, 0x80, 0x77, 0x07, 0xA4, 0x2A, 0x02,
7900         0x7C, 0x95, 0x06, 0xA6, 0x34, 0x02, 0x03, 0xA6, 0x4C, 0x04, 0x46, 0x82,
7901         0x04, 0x01, 0x03, 0xD8, 0xB4, 0x98, 0x6A, 0x96, 0x46, 0x82, 0xFE, 0x95,
7902         0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0xB6, 0x2D, 0x02, 0xA6, 0x6C, 0x02,
7903         0x07, 0xA6, 0x5A, 0x02, 0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x62, 0x02,
7904         0xC2, 0x88, 0x7C, 0x95, 0x48, 0x82, 0x60, 0x96, 0x48, 0x82, 0x04, 0x23,
7905         0xA0, 0x01, 0x14, 0x23, 0xA1, 0x01, 0x3C, 0x84, 0x04, 0x01, 0x0C, 0xDC,
7906         0xE0, 0x23, 0x25, 0x61, 0xEF, 0x00, 0x14, 0x01, 0x4F, 0x04, 0xA8, 0x01,
7907         0x6F, 0x00, 0xA5, 0x01, 0x03, 0x23, 0xA4, 0x01, 0x06, 0x23, 0x9C, 0x01,
7908         0x24, 0x2B, 0x1C, 0x01, 0x02, 0xA6, 0xAA, 0x02, 0x07, 0xA6, 0x5A, 0x02,
7909         0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x20, 0x04, 0x01, 0xA6, 0xB4, 0x02,
7910         0x00, 0xA6, 0xB4, 0x02, 0x00, 0x33, 0x12, 0x00, 0xC2, 0x88, 0x00, 0x0E,
7911         0x80, 0x63, 0x00, 0x43, 0x00, 0xA0, 0x8C, 0x02, 0x4D, 0x04, 0x04, 0x01,
7912         0x0B, 0xDC, 0xE7, 0x23, 0x04, 0x61, 0x84, 0x01, 0x10, 0x31, 0x12, 0x35,
7913         0x14, 0x01, 0xEC, 0x00, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00, 0xEA, 0x82,
7914         0x18, 0x23, 0x04, 0x61, 0x18, 0xA0, 0xE2, 0x02, 0x04, 0x01, 0xA2, 0xC8,
7915         0x00, 0x33, 0x1F, 0x00, 0xC2, 0x88, 0x08, 0x31, 0x0A, 0x35, 0x0C, 0x39,
7916         0x0E, 0x3D, 0x7E, 0x98, 0xB6, 0x2D, 0x01, 0xA6, 0x14, 0x03, 0x00, 0xA6,
7917         0x14, 0x03, 0x07, 0xA6, 0x0C, 0x03, 0x06, 0xA6, 0x10, 0x03, 0x03, 0xA6,
7918         0x20, 0x04, 0x02, 0xA6, 0x6C, 0x02, 0x00, 0x33, 0x33, 0x00, 0xC2, 0x88,
7919         0x7C, 0x95, 0xEE, 0x82, 0x60, 0x96, 0xEE, 0x82, 0x82, 0x98, 0x80, 0x42,
7920         0x7E, 0x98, 0x64, 0xE4, 0x04, 0x01, 0x2D, 0xC8, 0x31, 0x05, 0x07, 0x01,
7921         0x00, 0xA2, 0x54, 0x03, 0x00, 0x43, 0x87, 0x01, 0x05, 0x05, 0x86, 0x98,
7922         0x7E, 0x98, 0x00, 0xA6, 0x16, 0x03, 0x07, 0xA6, 0x4C, 0x03, 0x03, 0xA6,
7923         0x3C, 0x04, 0x06, 0xA6, 0x50, 0x03, 0x01, 0xA6, 0x16, 0x03, 0x00, 0x33,
7924         0x25, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x32, 0x83, 0x60, 0x96, 0x32, 0x83,
7925         0x04, 0x01, 0x10, 0xCE, 0x07, 0xC8, 0x05, 0x05, 0xEB, 0x04, 0x00, 0x33,
7926         0x00, 0x20, 0xC0, 0x20, 0x81, 0x62, 0x72, 0x83, 0x00, 0x01, 0x05, 0x05,
7927         0xFF, 0xA2, 0x7A, 0x03, 0xB1, 0x01, 0x08, 0x23, 0xB2, 0x01, 0x2E, 0x83,
7928         0x05, 0x05, 0x15, 0x01, 0x00, 0xA2, 0x9A, 0x03, 0xEC, 0x00, 0x6E, 0x00,
7929         0x95, 0x01, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xA6, 0x96, 0x03,
7930         0x00, 0xA6, 0x96, 0x03, 0x10, 0x84, 0x80, 0x42, 0x7E, 0x98, 0x01, 0xA6,
7931         0xA4, 0x03, 0x00, 0xA6, 0xBC, 0x03, 0x10, 0x84, 0xA8, 0x98, 0x80, 0x42,
7932         0x01, 0xA6, 0xA4, 0x03, 0x07, 0xA6, 0xB2, 0x03, 0xD4, 0x83, 0x7C, 0x95,
7933         0xA8, 0x83, 0x00, 0x33, 0x2F, 0x00, 0xC2, 0x88, 0xA8, 0x98, 0x80, 0x42,
7934         0x00, 0xA6, 0xBC, 0x03, 0x07, 0xA6, 0xCA, 0x03, 0xD4, 0x83, 0x7C, 0x95,
7935         0xC0, 0x83, 0x00, 0x33, 0x26, 0x00, 0xC2, 0x88, 0x38, 0x2B, 0x80, 0x32,
7936         0x80, 0x36, 0x04, 0x23, 0xA0, 0x01, 0x12, 0x23, 0xA1, 0x01, 0x10, 0x84,
7937         0x07, 0xF0, 0x06, 0xA4, 0xF4, 0x03, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23,
7938         0x83, 0x03, 0x80, 0x63, 0x03, 0xA6, 0x0E, 0x04, 0x07, 0xA6, 0x06, 0x04,
7939         0x06, 0xA6, 0x0A, 0x04, 0x00, 0x33, 0x17, 0x00, 0xC2, 0x88, 0x7C, 0x95,
7940         0xF4, 0x83, 0x60, 0x96, 0xF4, 0x83, 0x20, 0x84, 0x07, 0xF0, 0x06, 0xA4,
7941         0x20, 0x04, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23, 0x83, 0x03, 0x80, 0x63,
7942         0xB6, 0x2D, 0x03, 0xA6, 0x3C, 0x04, 0x07, 0xA6, 0x34, 0x04, 0x06, 0xA6,
7943         0x38, 0x04, 0x00, 0x33, 0x30, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x20, 0x84,
7944         0x60, 0x96, 0x20, 0x84, 0x1D, 0x01, 0x06, 0xCC, 0x00, 0x33, 0x00, 0x84,
7945         0xC0, 0x20, 0x00, 0x23, 0xEA, 0x00, 0x81, 0x62, 0xA2, 0x0D, 0x80, 0x63,
7946         0x07, 0xA6, 0x5A, 0x04, 0x00, 0x33, 0x18, 0x00, 0xC2, 0x88, 0x03, 0x03,
7947         0x80, 0x63, 0xA3, 0x01, 0x07, 0xA4, 0x64, 0x04, 0x23, 0x01, 0x00, 0xA2,
7948         0x86, 0x04, 0x0A, 0xA0, 0x76, 0x04, 0xE0, 0x00, 0x00, 0x33, 0x1D, 0x00,
7949         0xC2, 0x88, 0x0B, 0xA0, 0x82, 0x04, 0xE0, 0x00, 0x00, 0x33, 0x1E, 0x00,
7950         0xC2, 0x88, 0x42, 0x23, 0xF8, 0x88, 0x00, 0x23, 0x22, 0xA3, 0xE6, 0x04,
7951         0x08, 0x23, 0x22, 0xA3, 0xA2, 0x04, 0x28, 0x23, 0x22, 0xA3, 0xAE, 0x04,
7952         0x02, 0x23, 0x22, 0xA3, 0xC4, 0x04, 0x42, 0x23, 0xF8, 0x88, 0x4A, 0x00,
7953         0x06, 0x61, 0x00, 0xA0, 0xAE, 0x04, 0x45, 0x23, 0xF8, 0x88, 0x04, 0x98,
7954         0x00, 0xA2, 0xC0, 0x04, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x82, 0xC0, 0x20,
7955         0x81, 0x62, 0xE8, 0x81, 0x47, 0x23, 0xF8, 0x88, 0x04, 0x01, 0x0B, 0xDE,
7956         0x04, 0x98, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x81, 0xC0, 0x20, 0x81, 0x62,
7957         0x14, 0x01, 0x00, 0xA0, 0x00, 0x02, 0x43, 0x23, 0xF8, 0x88, 0x04, 0x23,
7958         0xA0, 0x01, 0x44, 0x23, 0xA1, 0x01, 0x80, 0x73, 0x4D, 0x00, 0x03, 0xA3,
7959         0xF4, 0x04, 0x00, 0x33, 0x27, 0x00, 0xC2, 0x88, 0x04, 0x01, 0x04, 0xDC,
7960         0x02, 0x23, 0xA2, 0x01, 0x04, 0x23, 0xA0, 0x01, 0x04, 0x98, 0x26, 0x95,
7961         0x4B, 0x00, 0xF6, 0x00, 0x4F, 0x04, 0x4F, 0x00, 0x00, 0xA3, 0x22, 0x05,
7962         0x00, 0x05, 0x76, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x1C, 0x05, 0x0A, 0x85,
7963         0x46, 0x97, 0xCD, 0x04, 0x24, 0x85, 0x48, 0x04, 0x84, 0x80, 0x02, 0x01,
7964         0x03, 0xDA, 0x80, 0x23, 0x82, 0x01, 0x34, 0x85, 0x02, 0x23, 0xA0, 0x01,
7965         0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x40, 0x05, 0x1D, 0x01, 0x04, 0xD6,
7966         0xFF, 0x23, 0x86, 0x41, 0x4B, 0x60, 0xCB, 0x00, 0xFF, 0x23, 0x80, 0x01,
7967         0x49, 0x00, 0x81, 0x01, 0x04, 0x01, 0x02, 0xC8, 0x30, 0x01, 0x80, 0x01,
7968         0xF7, 0x04, 0x03, 0x01, 0x49, 0x04, 0x80, 0x01, 0xC9, 0x00, 0x00, 0x05,
7969         0x00, 0x01, 0xFF, 0xA0, 0x60, 0x05, 0x77, 0x04, 0x01, 0x23, 0xEA, 0x00,
7970         0x5D, 0x00, 0xFE, 0xC7, 0x00, 0x62, 0x00, 0x23, 0xEA, 0x00, 0x00, 0x63,
7971         0x07, 0xA4, 0xF8, 0x05, 0x03, 0x03, 0x02, 0xA0, 0x8E, 0x05, 0xF4, 0x85,
7972         0x00, 0x33, 0x2D, 0x00, 0xC2, 0x88, 0x04, 0xA0, 0xB8, 0x05, 0x80, 0x63,
7973         0x00, 0x23, 0xDF, 0x00, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0xA4, 0x05,
7974         0x1D, 0x01, 0x06, 0xD6, 0x02, 0x23, 0x02, 0x41, 0x82, 0x01, 0x50, 0x00,
7975         0x62, 0x97, 0x04, 0x85, 0x04, 0x23, 0x02, 0x41, 0x82, 0x01, 0x04, 0x85,
7976         0x08, 0xA0, 0xBE, 0x05, 0xF4, 0x85, 0x03, 0xA0, 0xC4, 0x05, 0xF4, 0x85,
7977         0x01, 0xA0, 0xCE, 0x05, 0x88, 0x00, 0x80, 0x63, 0xCC, 0x86, 0x07, 0xA0,
7978         0xEE, 0x05, 0x5F, 0x00, 0x00, 0x2B, 0xDF, 0x08, 0x00, 0xA2, 0xE6, 0x05,
7979         0x80, 0x67, 0x80, 0x63, 0x01, 0xA2, 0x7A, 0x06, 0x7C, 0x85, 0x06, 0x23,
7980         0x68, 0x98, 0x48, 0x23, 0xF8, 0x88, 0x07, 0x23, 0x80, 0x00, 0x06, 0x87,
7981         0x80, 0x63, 0x7C, 0x85, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63, 0x4A, 0x00,
7982         0x06, 0x61, 0x00, 0xA2, 0x36, 0x06, 0x1D, 0x01, 0x16, 0xD4, 0xC0, 0x23,
7983         0x07, 0x41, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6, 0x1C, 0x06, 0x00, 0x33,
7984         0x37, 0x00, 0xC2, 0x88, 0x1D, 0x01, 0x01, 0xD6, 0x20, 0x23, 0x63, 0x60,
7985         0x83, 0x03, 0x80, 0x63, 0x02, 0x23, 0xDF, 0x00, 0x07, 0xA6, 0x7C, 0x05,
7986         0xEF, 0x04, 0x6F, 0x00, 0x00, 0x63, 0x4B, 0x00, 0x06, 0x41, 0xCB, 0x00,
7987         0x52, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x4E, 0x06, 0x1D, 0x01, 0x03, 0xCA,
7988         0xC0, 0x23, 0x07, 0x41, 0x00, 0x63, 0x1D, 0x01, 0x04, 0xCC, 0x00, 0x33,
7989         0x00, 0x83, 0xC0, 0x20, 0x81, 0x62, 0x80, 0x23, 0x07, 0x41, 0x00, 0x63,
7990         0x80, 0x67, 0x08, 0x23, 0x83, 0x03, 0x80, 0x63, 0x00, 0x63, 0x01, 0x23,
7991         0xDF, 0x00, 0x06, 0xA6, 0x84, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67,
7992         0x80, 0x63, 0x00, 0x33, 0x00, 0x40, 0xC0, 0x20, 0x81, 0x62, 0x00, 0x63,
7993         0x00, 0x00, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6, 0x94, 0x06,
7994         0x07, 0xA6, 0x7C, 0x05, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x07, 0x00, 0x2B,
7995         0x40, 0x0E, 0x80, 0x63, 0x01, 0x00, 0x06, 0xA6, 0xAA, 0x06, 0x07, 0xA6,
7996         0x7C, 0x05, 0x40, 0x0E, 0x80, 0x63, 0x00, 0x43, 0x00, 0xA0, 0xA2, 0x06,
7997         0x06, 0xA6, 0xBC, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67, 0x40, 0x0E,
7998         0x80, 0x63, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63,
7999         0x07, 0xA6, 0xD6, 0x06, 0x00, 0x33, 0x2A, 0x00, 0xC2, 0x88, 0x03, 0x03,
8000         0x80, 0x63, 0x89, 0x00, 0x0A, 0x2B, 0x07, 0xA6, 0xE8, 0x06, 0x00, 0x33,
8001         0x29, 0x00, 0xC2, 0x88, 0x00, 0x43, 0x00, 0xA2, 0xF4, 0x06, 0xC0, 0x0E,
8002         0x80, 0x63, 0xDE, 0x86, 0xC0, 0x0E, 0x00, 0x33, 0x00, 0x80, 0xC0, 0x20,
8003         0x81, 0x62, 0x04, 0x01, 0x02, 0xDA, 0x80, 0x63, 0x7C, 0x85, 0x80, 0x7B,
8004         0x80, 0x63, 0x06, 0xA6, 0x8C, 0x06, 0x00, 0x33, 0x2C, 0x00, 0xC2, 0x88,
8005         0x0C, 0xA2, 0x2E, 0x07, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6,
8006         0x2C, 0x07, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x33, 0x3D, 0x00, 0xC2, 0x88,
8007         0x00, 0x00, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0x0C, 0xA0, 0x44, 0x07,
8008         0x07, 0xA6, 0x7C, 0x05, 0xBF, 0x23, 0x04, 0x61, 0x84, 0x01, 0xE6, 0x84,
8009         0x00, 0x63, 0xF0, 0x04, 0x01, 0x01, 0xF1, 0x00, 0x00, 0x01, 0xF2, 0x00,
8010         0x01, 0x05, 0x80, 0x01, 0x72, 0x04, 0x71, 0x00, 0x81, 0x01, 0x70, 0x04,
8011         0x80, 0x05, 0x81, 0x05, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04,
8012         0x01, 0x01, 0xF1, 0x00, 0x70, 0x00, 0x81, 0x01, 0x70, 0x04, 0x71, 0x00,
8013         0x81, 0x01, 0x72, 0x00, 0x80, 0x01, 0x71, 0x04, 0x70, 0x00, 0x80, 0x01,
8014         0x70, 0x04, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04, 0x00, 0x01,
8015         0xF1, 0x00, 0x70, 0x00, 0x80, 0x01, 0x70, 0x04, 0x71, 0x00, 0x80, 0x01,
8016         0x72, 0x00, 0x81, 0x01, 0x71, 0x04, 0x70, 0x00, 0x81, 0x01, 0x70, 0x04,
8017         0x00, 0x63, 0x00, 0x23, 0xB3, 0x01, 0x83, 0x05, 0xA3, 0x01, 0xA2, 0x01,
8018         0xA1, 0x01, 0x01, 0x23, 0xA0, 0x01, 0x00, 0x01, 0xC8, 0x00, 0x03, 0xA1,
8019         0xC4, 0x07, 0x00, 0x33, 0x07, 0x00, 0xC2, 0x88, 0x80, 0x05, 0x81, 0x05,
8020         0x04, 0x01, 0x11, 0xC8, 0x48, 0x00, 0xB0, 0x01, 0xB1, 0x01, 0x08, 0x23,
8021         0xB2, 0x01, 0x05, 0x01, 0x48, 0x04, 0x00, 0x43, 0x00, 0xA2, 0xE4, 0x07,
8022         0x00, 0x05, 0xDA, 0x87, 0x00, 0x01, 0xC8, 0x00, 0xFF, 0x23, 0x80, 0x01,
8023         0x05, 0x05, 0x00, 0x63, 0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04,
8024         0x00, 0x02, 0x80, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04, 0x00, 0x63,
8025         0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04, 0x00, 0x02, 0x00, 0xA0,
8026         0x14, 0x08, 0x16, 0x88, 0x00, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04,
8027         0x00, 0x63, 0xF3, 0x04, 0x00, 0x23, 0xF4, 0x00, 0x74, 0x00, 0x80, 0x43,
8028         0xF4, 0x00, 0xCF, 0x40, 0x00, 0xA2, 0x44, 0x08, 0x74, 0x04, 0x02, 0x01,
8029         0xF7, 0xC9, 0xF6, 0xD9, 0x00, 0x01, 0x01, 0xA1, 0x24, 0x08, 0x04, 0x98,
8030         0x26, 0x95, 0x24, 0x88, 0x73, 0x04, 0x00, 0x63, 0xF3, 0x04, 0x75, 0x04,
8031         0x5A, 0x88, 0x02, 0x01, 0x04, 0xD8, 0x46, 0x97, 0x04, 0x98, 0x26, 0x95,
8032         0x4A, 0x88, 0x75, 0x00, 0x00, 0xA3, 0x64, 0x08, 0x00, 0x05, 0x4E, 0x88,
8033         0x73, 0x04, 0x00, 0x63, 0x80, 0x7B, 0x80, 0x63, 0x06, 0xA6, 0x76, 0x08,
8034         0x00, 0x33, 0x3E, 0x00, 0xC2, 0x88, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63,
8035         0x00, 0x63, 0x38, 0x2B, 0x9C, 0x88, 0x38, 0x2B, 0x92, 0x88, 0x32, 0x09,
8036         0x31, 0x05, 0x92, 0x98, 0x05, 0x05, 0xB2, 0x09, 0x00, 0x63, 0x00, 0x32,
8037         0x00, 0x36, 0x00, 0x3A, 0x00, 0x3E, 0x00, 0x63, 0x80, 0x32, 0x80, 0x36,
8038         0x80, 0x3A, 0x80, 0x3E, 0xB4, 0x3D, 0x00, 0x63, 0x38, 0x2B, 0x40, 0x32,
8039         0x40, 0x36, 0x40, 0x3A, 0x40, 0x3E, 0x00, 0x63, 0x5A, 0x20, 0xC9, 0x40,
8040         0x00, 0xA0, 0xB4, 0x08, 0x5D, 0x00, 0xFE, 0xC3, 0x00, 0x63, 0x80, 0x73,
8041         0xE6, 0x20, 0x02, 0x23, 0xE8, 0x00, 0x82, 0x73, 0xFF, 0xFD, 0x80, 0x73,
8042         0x13, 0x23, 0xF8, 0x88, 0x66, 0x20, 0xC0, 0x20, 0x04, 0x23, 0xA0, 0x01,
8043         0xA1, 0x23, 0xA1, 0x01, 0x81, 0x62, 0xE2, 0x88, 0x80, 0x73, 0x80, 0x77,
8044         0x68, 0x00, 0x00, 0xA2, 0x80, 0x00, 0x03, 0xC2, 0xF1, 0xC7, 0x41, 0x23,
8045         0xF8, 0x88, 0x11, 0x23, 0xA1, 0x01, 0x04, 0x23, 0xA0, 0x01, 0xE6, 0x84,
8046 };
8047
8048 static ushort _asc_mcode_size = sizeof(_asc_mcode_buf);
8049 static ADV_DCNT _asc_mcode_chksum = 0x012C453FUL;
8050
8051 #define ASC_SYN_OFFSET_ONE_DISABLE_LIST  16
8052 static uchar _syn_offset_one_disable_cmd[ASC_SYN_OFFSET_ONE_DISABLE_LIST] = {
8053         INQUIRY,
8054         REQUEST_SENSE,
8055         READ_CAPACITY,
8056         READ_TOC,
8057         MODE_SELECT,
8058         MODE_SENSE,
8059         MODE_SELECT_10,
8060         MODE_SENSE_10,
8061         0xFF,
8062         0xFF,
8063         0xFF,
8064         0xFF,
8065         0xFF,
8066         0xFF,
8067         0xFF,
8068         0xFF
8069 };
8070
8071 static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
8072 {
8073         PortAddr iop_base;
8074         ulong last_int_level;
8075         int sta;
8076         int n_q_required;
8077         int disable_syn_offset_one_fix;
8078         int i;
8079         ASC_PADDR addr;
8080         ushort sg_entry_cnt = 0;
8081         ushort sg_entry_cnt_minus_one = 0;
8082         uchar target_ix;
8083         uchar tid_no;
8084         uchar sdtr_data;
8085         uchar extra_bytes;
8086         uchar scsi_cmd;
8087         uchar disable_cmd;
8088         ASC_SG_HEAD *sg_head;
8089         ASC_DCNT data_cnt;
8090
8091         iop_base = asc_dvc->iop_base;
8092         sg_head = scsiq->sg_head;
8093         if (asc_dvc->err_code != 0)
8094                 return (ERR);
8095         if (scsiq == (ASC_SCSI_Q *)0L) {
8096                 AscSetLibErrorCode(asc_dvc, ASCQ_ERR_SCSIQ_NULL_PTR);
8097                 return (ERR);
8098         }
8099         scsiq->q1.q_no = 0;
8100         if ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES) == 0) {
8101                 scsiq->q1.extra_bytes = 0;
8102         }
8103         sta = 0;
8104         target_ix = scsiq->q2.target_ix;
8105         tid_no = ASC_TIX_TO_TID(target_ix);
8106         n_q_required = 1;
8107         if (scsiq->cdbptr[0] == REQUEST_SENSE) {
8108                 if ((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) {
8109                         asc_dvc->sdtr_done &= ~scsiq->q1.target_id;
8110                         sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
8111                         AscMsgOutSDTR(asc_dvc,
8112                                       asc_dvc->
8113                                       sdtr_period_tbl[(sdtr_data >> 4) &
8114                                                       (uchar)(asc_dvc->
8115                                                               max_sdtr_index -
8116                                                               1)],
8117                                       (uchar)(sdtr_data & (uchar)
8118                                               ASC_SYN_MAX_OFFSET));
8119                         scsiq->q1.cntl |= (QC_MSG_OUT | QC_URGENT);
8120                 }
8121         }
8122         last_int_level = DvcEnterCritical();
8123         if (asc_dvc->in_critical_cnt != 0) {
8124                 DvcLeaveCritical(last_int_level);
8125                 AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CRITICAL_RE_ENTRY);
8126                 return (ERR);
8127         }
8128         asc_dvc->in_critical_cnt++;
8129         if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
8130                 if ((sg_entry_cnt = sg_head->entry_cnt) == 0) {
8131                         asc_dvc->in_critical_cnt--;
8132                         DvcLeaveCritical(last_int_level);
8133                         return (ERR);
8134                 }
8135 #if !CC_VERY_LONG_SG_LIST
8136                 if (sg_entry_cnt > ASC_MAX_SG_LIST) {
8137                         asc_dvc->in_critical_cnt--;
8138                         DvcLeaveCritical(last_int_level);
8139                         return (ERR);
8140                 }
8141 #endif /* !CC_VERY_LONG_SG_LIST */
8142                 if (sg_entry_cnt == 1) {
8143                         scsiq->q1.data_addr =
8144                             (ADV_PADDR)sg_head->sg_list[0].addr;
8145                         scsiq->q1.data_cnt =
8146                             (ADV_DCNT)sg_head->sg_list[0].bytes;
8147                         scsiq->q1.cntl &= ~(QC_SG_HEAD | QC_SG_SWAP_QUEUE);
8148                 }
8149                 sg_entry_cnt_minus_one = sg_entry_cnt - 1;
8150         }
8151         scsi_cmd = scsiq->cdbptr[0];
8152         disable_syn_offset_one_fix = FALSE;
8153         if ((asc_dvc->pci_fix_asyn_xfer & scsiq->q1.target_id) &&
8154             !(asc_dvc->pci_fix_asyn_xfer_always & scsiq->q1.target_id)) {
8155                 if (scsiq->q1.cntl & QC_SG_HEAD) {
8156                         data_cnt = 0;
8157                         for (i = 0; i < sg_entry_cnt; i++) {
8158                                 data_cnt +=
8159                                     (ADV_DCNT)le32_to_cpu(sg_head->sg_list[i].
8160                                                           bytes);
8161                         }
8162                 } else {
8163                         data_cnt = le32_to_cpu(scsiq->q1.data_cnt);
8164                 }
8165                 if (data_cnt != 0UL) {
8166                         if (data_cnt < 512UL) {
8167                                 disable_syn_offset_one_fix = TRUE;
8168                         } else {
8169                                 for (i = 0; i < ASC_SYN_OFFSET_ONE_DISABLE_LIST;
8170                                      i++) {
8171                                         disable_cmd =
8172                                             _syn_offset_one_disable_cmd[i];
8173                                         if (disable_cmd == 0xFF) {
8174                                                 break;
8175                                         }
8176                                         if (scsi_cmd == disable_cmd) {
8177                                                 disable_syn_offset_one_fix =
8178                                                     TRUE;
8179                                                 break;
8180                                         }
8181                                 }
8182                         }
8183                 }
8184         }
8185         if (disable_syn_offset_one_fix) {
8186                 scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
8187                 scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX |
8188                                        ASC_TAG_FLAG_DISABLE_DISCONNECT);
8189         } else {
8190                 scsiq->q2.tag_code &= 0x27;
8191         }
8192         if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
8193                 if (asc_dvc->bug_fix_cntl) {
8194                         if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
8195                                 if ((scsi_cmd == READ_6) ||
8196                                     (scsi_cmd == READ_10)) {
8197                                         addr =
8198                                             (ADV_PADDR)le32_to_cpu(sg_head->
8199                                                                    sg_list
8200                                                                    [sg_entry_cnt_minus_one].
8201                                                                    addr) +
8202                                             (ADV_DCNT)le32_to_cpu(sg_head->
8203                                                                   sg_list
8204                                                                   [sg_entry_cnt_minus_one].
8205                                                                   bytes);
8206                                         extra_bytes =
8207                                             (uchar)((ushort)addr & 0x0003);
8208                                         if ((extra_bytes != 0)
8209                                             &&
8210                                             ((scsiq->q2.
8211                                               tag_code &
8212                                               ASC_TAG_FLAG_EXTRA_BYTES)
8213                                              == 0)) {
8214                                                 scsiq->q2.tag_code |=
8215                                                     ASC_TAG_FLAG_EXTRA_BYTES;
8216                                                 scsiq->q1.extra_bytes =
8217                                                     extra_bytes;
8218                                                 data_cnt =
8219                                                     le32_to_cpu(sg_head->
8220                                                                 sg_list
8221                                                                 [sg_entry_cnt_minus_one].
8222                                                                 bytes);
8223                                                 data_cnt -=
8224                                                     (ASC_DCNT) extra_bytes;
8225                                                 sg_head->
8226                                                     sg_list
8227                                                     [sg_entry_cnt_minus_one].
8228                                                     bytes =
8229                                                     cpu_to_le32(data_cnt);
8230                                         }
8231                                 }
8232                         }
8233                 }
8234                 sg_head->entry_to_copy = sg_head->entry_cnt;
8235 #if CC_VERY_LONG_SG_LIST
8236                 /*
8237                  * Set the sg_entry_cnt to the maximum possible. The rest of
8238                  * the SG elements will be copied when the RISC completes the
8239                  * SG elements that fit and halts.
8240                  */
8241                 if (sg_entry_cnt > ASC_MAX_SG_LIST) {
8242                         sg_entry_cnt = ASC_MAX_SG_LIST;
8243                 }
8244 #endif /* CC_VERY_LONG_SG_LIST */
8245                 n_q_required = AscSgListToQueue(sg_entry_cnt);
8246                 if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, n_q_required) >=
8247                      (uint) n_q_required)
8248                     || ((scsiq->q1.cntl & QC_URGENT) != 0)) {
8249                         if ((sta =
8250                              AscSendScsiQueue(asc_dvc, scsiq,
8251                                               n_q_required)) == 1) {
8252                                 asc_dvc->in_critical_cnt--;
8253                                 DvcLeaveCritical(last_int_level);
8254                                 return (sta);
8255                         }
8256                 }
8257         } else {
8258                 if (asc_dvc->bug_fix_cntl) {
8259                         if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
8260                                 if ((scsi_cmd == READ_6) ||
8261                                     (scsi_cmd == READ_10)) {
8262                                         addr =
8263                                             le32_to_cpu(scsiq->q1.data_addr) +
8264                                             le32_to_cpu(scsiq->q1.data_cnt);
8265                                         extra_bytes =
8266                                             (uchar)((ushort)addr & 0x0003);
8267                                         if ((extra_bytes != 0)
8268                                             &&
8269                                             ((scsiq->q2.
8270                                               tag_code &
8271                                               ASC_TAG_FLAG_EXTRA_BYTES)
8272                                              == 0)) {
8273                                                 data_cnt =
8274                                                     le32_to_cpu(scsiq->q1.
8275                                                                 data_cnt);
8276                                                 if (((ushort)data_cnt & 0x01FF)
8277                                                     == 0) {
8278                                                         scsiq->q2.tag_code |=
8279                                                             ASC_TAG_FLAG_EXTRA_BYTES;
8280                                                         data_cnt -= (ASC_DCNT)
8281                                                             extra_bytes;
8282                                                         scsiq->q1.data_cnt =
8283                                                             cpu_to_le32
8284                                                             (data_cnt);
8285                                                         scsiq->q1.extra_bytes =
8286                                                             extra_bytes;
8287                                                 }
8288                                         }
8289                                 }
8290                         }
8291                 }
8292                 n_q_required = 1;
8293                 if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, 1) >= 1) ||
8294                     ((scsiq->q1.cntl & QC_URGENT) != 0)) {
8295                         if ((sta = AscSendScsiQueue(asc_dvc, scsiq,
8296                                                     n_q_required)) == 1) {
8297                                 asc_dvc->in_critical_cnt--;
8298                                 DvcLeaveCritical(last_int_level);
8299                                 return (sta);
8300                         }
8301                 }
8302         }
8303         asc_dvc->in_critical_cnt--;
8304         DvcLeaveCritical(last_int_level);
8305         return (sta);
8306 }
8307
8308 static int
8309 AscSendScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar n_q_required)
8310 {
8311         PortAddr iop_base;
8312         uchar free_q_head;
8313         uchar next_qp;
8314         uchar tid_no;
8315         uchar target_ix;
8316         int sta;
8317
8318         iop_base = asc_dvc->iop_base;
8319         target_ix = scsiq->q2.target_ix;
8320         tid_no = ASC_TIX_TO_TID(target_ix);
8321         sta = 0;
8322         free_q_head = (uchar)AscGetVarFreeQHead(iop_base);
8323         if (n_q_required > 1) {
8324                 if ((next_qp = AscAllocMultipleFreeQueue(iop_base,
8325                                                          free_q_head, (uchar)
8326                                                          (n_q_required)))
8327                     != (uchar)ASC_QLINK_END) {
8328                         asc_dvc->last_q_shortage = 0;
8329                         scsiq->sg_head->queue_cnt = n_q_required - 1;
8330                         scsiq->q1.q_no = free_q_head;
8331                         if ((sta = AscPutReadySgListQueue(asc_dvc, scsiq,
8332                                                           free_q_head)) == 1) {
8333                                 AscPutVarFreeQHead(iop_base, next_qp);
8334                                 asc_dvc->cur_total_qng += (uchar)(n_q_required);
8335                                 asc_dvc->cur_dvc_qng[tid_no]++;
8336                         }
8337                         return (sta);
8338                 }
8339         } else if (n_q_required == 1) {
8340                 if ((next_qp = AscAllocFreeQueue(iop_base,
8341                                                  free_q_head)) !=
8342                     ASC_QLINK_END) {
8343                         scsiq->q1.q_no = free_q_head;
8344                         if ((sta = AscPutReadyQueue(asc_dvc, scsiq,
8345                                                     free_q_head)) == 1) {
8346                                 AscPutVarFreeQHead(iop_base, next_qp);
8347                                 asc_dvc->cur_total_qng++;
8348                                 asc_dvc->cur_dvc_qng[tid_no]++;
8349                         }
8350                         return (sta);
8351                 }
8352         }
8353         return (sta);
8354 }
8355
8356 static int AscSgListToQueue(int sg_list)
8357 {
8358         int n_sg_list_qs;
8359
8360         n_sg_list_qs = ((sg_list - 1) / ASC_SG_LIST_PER_Q);
8361         if (((sg_list - 1) % ASC_SG_LIST_PER_Q) != 0)
8362                 n_sg_list_qs++;
8363         return (n_sg_list_qs + 1);
8364 }
8365
8366 static uint
8367 AscGetNumOfFreeQueue(ASC_DVC_VAR *asc_dvc, uchar target_ix, uchar n_qs)
8368 {
8369         uint cur_used_qs;
8370         uint cur_free_qs;
8371         ASC_SCSI_BIT_ID_TYPE target_id;
8372         uchar tid_no;
8373
8374         target_id = ASC_TIX_TO_TARGET_ID(target_ix);
8375         tid_no = ASC_TIX_TO_TID(target_ix);
8376         if ((asc_dvc->unit_not_ready & target_id) ||
8377             (asc_dvc->queue_full_or_busy & target_id)) {
8378                 return (0);
8379         }
8380         if (n_qs == 1) {
8381                 cur_used_qs = (uint) asc_dvc->cur_total_qng +
8382                     (uint) asc_dvc->last_q_shortage + (uint) ASC_MIN_FREE_Q;
8383         } else {
8384                 cur_used_qs = (uint) asc_dvc->cur_total_qng +
8385                     (uint) ASC_MIN_FREE_Q;
8386         }
8387         if ((uint) (cur_used_qs + n_qs) <= (uint) asc_dvc->max_total_qng) {
8388                 cur_free_qs = (uint) asc_dvc->max_total_qng - cur_used_qs;
8389                 if (asc_dvc->cur_dvc_qng[tid_no] >=
8390                     asc_dvc->max_dvc_qng[tid_no]) {
8391                         return (0);
8392                 }
8393                 return (cur_free_qs);
8394         }
8395         if (n_qs > 1) {
8396                 if ((n_qs > asc_dvc->last_q_shortage)
8397                     && (n_qs <= (asc_dvc->max_total_qng - ASC_MIN_FREE_Q))) {
8398                         asc_dvc->last_q_shortage = n_qs;
8399                 }
8400         }
8401         return (0);
8402 }
8403
8404 static int AscPutReadyQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no)
8405 {
8406         ushort q_addr;
8407         uchar tid_no;
8408         uchar sdtr_data;
8409         uchar syn_period_ix;
8410         uchar syn_offset;
8411         PortAddr iop_base;
8412
8413         iop_base = asc_dvc->iop_base;
8414         if (((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) &&
8415             ((asc_dvc->sdtr_done & scsiq->q1.target_id) == 0)) {
8416                 tid_no = ASC_TIX_TO_TID(scsiq->q2.target_ix);
8417                 sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
8418                 syn_period_ix =
8419                     (sdtr_data >> 4) & (asc_dvc->max_sdtr_index - 1);
8420                 syn_offset = sdtr_data & ASC_SYN_MAX_OFFSET;
8421                 AscMsgOutSDTR(asc_dvc,
8422                               asc_dvc->sdtr_period_tbl[syn_period_ix],
8423                               syn_offset);
8424                 scsiq->q1.cntl |= QC_MSG_OUT;
8425         }
8426         q_addr = ASC_QNO_TO_QADDR(q_no);
8427         if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) {
8428                 scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
8429         }
8430         scsiq->q1.status = QS_FREE;
8431         AscMemWordCopyPtrToLram(iop_base,
8432                                 q_addr + ASC_SCSIQ_CDB_BEG,
8433                                 (uchar *)scsiq->cdbptr, scsiq->q2.cdb_len >> 1);
8434
8435         DvcPutScsiQ(iop_base,
8436                     q_addr + ASC_SCSIQ_CPY_BEG,
8437                     (uchar *)&scsiq->q1.cntl,
8438                     ((sizeof(ASC_SCSIQ_1) + sizeof(ASC_SCSIQ_2)) / 2) - 1);
8439         AscWriteLramWord(iop_base,
8440                          (ushort)(q_addr + (ushort)ASC_SCSIQ_B_STATUS),
8441                          (ushort)(((ushort)scsiq->q1.
8442                                    q_no << 8) | (ushort)QS_READY));
8443         return (1);
8444 }
8445
8446 static int
8447 AscPutReadySgListQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no)
8448 {
8449         int sta;
8450         int i;
8451         ASC_SG_HEAD *sg_head;
8452         ASC_SG_LIST_Q scsi_sg_q;
8453         ASC_DCNT saved_data_addr;
8454         ASC_DCNT saved_data_cnt;
8455         PortAddr iop_base;
8456         ushort sg_list_dwords;
8457         ushort sg_index;
8458         ushort sg_entry_cnt;
8459         ushort q_addr;
8460         uchar next_qp;
8461
8462         iop_base = asc_dvc->iop_base;
8463         sg_head = scsiq->sg_head;
8464         saved_data_addr = scsiq->q1.data_addr;
8465         saved_data_cnt = scsiq->q1.data_cnt;
8466         scsiq->q1.data_addr = (ASC_PADDR) sg_head->sg_list[0].addr;
8467         scsiq->q1.data_cnt = (ASC_DCNT) sg_head->sg_list[0].bytes;
8468 #if CC_VERY_LONG_SG_LIST
8469         /*
8470          * If sg_head->entry_cnt is greater than ASC_MAX_SG_LIST
8471          * then not all SG elements will fit in the allocated queues.
8472          * The rest of the SG elements will be copied when the RISC
8473          * completes the SG elements that fit and halts.
8474          */
8475         if (sg_head->entry_cnt > ASC_MAX_SG_LIST) {
8476                 /*
8477                  * Set sg_entry_cnt to be the number of SG elements that
8478                  * will fit in the allocated SG queues. It is minus 1, because
8479                  * the first SG element is handled above. ASC_MAX_SG_LIST is
8480                  * already inflated by 1 to account for this. For example it
8481                  * may be 50 which is 1 + 7 queues * 7 SG elements.
8482                  */
8483                 sg_entry_cnt = ASC_MAX_SG_LIST - 1;
8484
8485                 /*
8486                  * Keep track of remaining number of SG elements that will
8487                  * need to be handled from a_isr.c.
8488                  */
8489                 scsiq->remain_sg_entry_cnt =
8490                     sg_head->entry_cnt - ASC_MAX_SG_LIST;
8491         } else {
8492 #endif /* CC_VERY_LONG_SG_LIST */
8493                 /*
8494                  * Set sg_entry_cnt to be the number of SG elements that
8495                  * will fit in the allocated SG queues. It is minus 1, because
8496                  * the first SG element is handled above.
8497                  */
8498                 sg_entry_cnt = sg_head->entry_cnt - 1;
8499 #if CC_VERY_LONG_SG_LIST
8500         }
8501 #endif /* CC_VERY_LONG_SG_LIST */
8502         if (sg_entry_cnt != 0) {
8503                 scsiq->q1.cntl |= QC_SG_HEAD;
8504                 q_addr = ASC_QNO_TO_QADDR(q_no);
8505                 sg_index = 1;
8506                 scsiq->q1.sg_queue_cnt = sg_head->queue_cnt;
8507                 scsi_sg_q.sg_head_qp = q_no;
8508                 scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
8509                 for (i = 0; i < sg_head->queue_cnt; i++) {
8510                         scsi_sg_q.seq_no = i + 1;
8511                         if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
8512                                 sg_list_dwords = (uchar)(ASC_SG_LIST_PER_Q * 2);
8513                                 sg_entry_cnt -= ASC_SG_LIST_PER_Q;
8514                                 if (i == 0) {
8515                                         scsi_sg_q.sg_list_cnt =
8516                                             ASC_SG_LIST_PER_Q;
8517                                         scsi_sg_q.sg_cur_list_cnt =
8518                                             ASC_SG_LIST_PER_Q;
8519                                 } else {
8520                                         scsi_sg_q.sg_list_cnt =
8521                                             ASC_SG_LIST_PER_Q - 1;
8522                                         scsi_sg_q.sg_cur_list_cnt =
8523                                             ASC_SG_LIST_PER_Q - 1;
8524                                 }
8525                         } else {
8526 #if CC_VERY_LONG_SG_LIST
8527                                 /*
8528                                  * This is the last SG queue in the list of
8529                                  * allocated SG queues. If there are more
8530                                  * SG elements than will fit in the allocated
8531                                  * queues, then set the QCSG_SG_XFER_MORE flag.
8532                                  */
8533                                 if (sg_head->entry_cnt > ASC_MAX_SG_LIST) {
8534                                         scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
8535                                 } else {
8536 #endif /* CC_VERY_LONG_SG_LIST */
8537                                         scsi_sg_q.cntl |= QCSG_SG_XFER_END;
8538 #if CC_VERY_LONG_SG_LIST
8539                                 }
8540 #endif /* CC_VERY_LONG_SG_LIST */
8541                                 sg_list_dwords = sg_entry_cnt << 1;
8542                                 if (i == 0) {
8543                                         scsi_sg_q.sg_list_cnt = sg_entry_cnt;
8544                                         scsi_sg_q.sg_cur_list_cnt =
8545                                             sg_entry_cnt;
8546                                 } else {
8547                                         scsi_sg_q.sg_list_cnt =
8548                                             sg_entry_cnt - 1;
8549                                         scsi_sg_q.sg_cur_list_cnt =
8550                                             sg_entry_cnt - 1;
8551                                 }
8552                                 sg_entry_cnt = 0;
8553                         }
8554                         next_qp = AscReadLramByte(iop_base,
8555                                                   (ushort)(q_addr +
8556                                                            ASC_SCSIQ_B_FWD));
8557                         scsi_sg_q.q_no = next_qp;
8558                         q_addr = ASC_QNO_TO_QADDR(next_qp);
8559                         AscMemWordCopyPtrToLram(iop_base,
8560                                                 q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
8561                                                 (uchar *)&scsi_sg_q,
8562                                                 sizeof(ASC_SG_LIST_Q) >> 1);
8563                         AscMemDWordCopyPtrToLram(iop_base,
8564                                                  q_addr + ASC_SGQ_LIST_BEG,
8565                                                  (uchar *)&sg_head->
8566                                                  sg_list[sg_index],
8567                                                  sg_list_dwords);
8568                         sg_index += ASC_SG_LIST_PER_Q;
8569                         scsiq->next_sg_index = sg_index;
8570                 }
8571         } else {
8572                 scsiq->q1.cntl &= ~QC_SG_HEAD;
8573         }
8574         sta = AscPutReadyQueue(asc_dvc, scsiq, q_no);
8575         scsiq->q1.data_addr = saved_data_addr;
8576         scsiq->q1.data_cnt = saved_data_cnt;
8577         return (sta);
8578 }
8579
8580 static int
8581 AscSetRunChipSynRegAtID(PortAddr iop_base, uchar tid_no, uchar sdtr_data)
8582 {
8583         int sta = FALSE;
8584
8585         if (AscHostReqRiscHalt(iop_base)) {
8586                 sta = AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
8587                 AscStartChip(iop_base);
8588                 return (sta);
8589         }
8590         return (sta);
8591 }
8592
8593 static int AscSetChipSynRegAtID(PortAddr iop_base, uchar id, uchar sdtr_data)
8594 {
8595         ASC_SCSI_BIT_ID_TYPE org_id;
8596         int i;
8597         int sta = TRUE;
8598
8599         AscSetBank(iop_base, 1);
8600         org_id = AscReadChipDvcID(iop_base);
8601         for (i = 0; i <= ASC_MAX_TID; i++) {
8602                 if (org_id == (0x01 << i))
8603                         break;
8604         }
8605         org_id = (ASC_SCSI_BIT_ID_TYPE) i;
8606         AscWriteChipDvcID(iop_base, id);
8607         if (AscReadChipDvcID(iop_base) == (0x01 << id)) {
8608                 AscSetBank(iop_base, 0);
8609                 AscSetChipSyn(iop_base, sdtr_data);
8610                 if (AscGetChipSyn(iop_base) != sdtr_data) {
8611                         sta = FALSE;
8612                 }
8613         } else {
8614                 sta = FALSE;
8615         }
8616         AscSetBank(iop_base, 1);
8617         AscWriteChipDvcID(iop_base, org_id);
8618         AscSetBank(iop_base, 0);
8619         return (sta);
8620 }
8621
8622 static ushort AscInitLram(ASC_DVC_VAR *asc_dvc)
8623 {
8624         uchar i;
8625         ushort s_addr;
8626         PortAddr iop_base;
8627         ushort warn_code;
8628
8629         iop_base = asc_dvc->iop_base;
8630         warn_code = 0;
8631         AscMemWordSetLram(iop_base, ASC_QADR_BEG, 0,
8632                           (ushort)(((int)(asc_dvc->max_total_qng + 2 + 1) *
8633                                     64) >> 1)
8634             );
8635         i = ASC_MIN_ACTIVE_QNO;
8636         s_addr = ASC_QADR_BEG + ASC_QBLK_SIZE;
8637         AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
8638                          (uchar)(i + 1));
8639         AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
8640                          (uchar)(asc_dvc->max_total_qng));
8641         AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
8642                          (uchar)i);
8643         i++;
8644         s_addr += ASC_QBLK_SIZE;
8645         for (; i < asc_dvc->max_total_qng; i++, s_addr += ASC_QBLK_SIZE) {
8646                 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
8647                                  (uchar)(i + 1));
8648                 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
8649                                  (uchar)(i - 1));
8650                 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
8651                                  (uchar)i);
8652         }
8653         AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
8654                          (uchar)ASC_QLINK_END);
8655         AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
8656                          (uchar)(asc_dvc->max_total_qng - 1));
8657         AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
8658                          (uchar)asc_dvc->max_total_qng);
8659         i++;
8660         s_addr += ASC_QBLK_SIZE;
8661         for (; i <= (uchar)(asc_dvc->max_total_qng + 3);
8662              i++, s_addr += ASC_QBLK_SIZE) {
8663                 AscWriteLramByte(iop_base,
8664                                  (ushort)(s_addr + (ushort)ASC_SCSIQ_B_FWD), i);
8665                 AscWriteLramByte(iop_base,
8666                                  (ushort)(s_addr + (ushort)ASC_SCSIQ_B_BWD), i);
8667                 AscWriteLramByte(iop_base,
8668                                  (ushort)(s_addr + (ushort)ASC_SCSIQ_B_QNO), i);
8669         }
8670         return (warn_code);
8671 }
8672
8673 static ushort AscInitQLinkVar(ASC_DVC_VAR *asc_dvc)
8674 {
8675         PortAddr iop_base;
8676         int i;
8677         ushort lram_addr;
8678
8679         iop_base = asc_dvc->iop_base;
8680         AscPutRiscVarFreeQHead(iop_base, 1);
8681         AscPutRiscVarDoneQTail(iop_base, asc_dvc->max_total_qng);
8682         AscPutVarFreeQHead(iop_base, 1);
8683         AscPutVarDoneQTail(iop_base, asc_dvc->max_total_qng);
8684         AscWriteLramByte(iop_base, ASCV_BUSY_QHEAD_B,
8685                          (uchar)((int)asc_dvc->max_total_qng + 1));
8686         AscWriteLramByte(iop_base, ASCV_DISC1_QHEAD_B,
8687                          (uchar)((int)asc_dvc->max_total_qng + 2));
8688         AscWriteLramByte(iop_base, (ushort)ASCV_TOTAL_READY_Q_B,
8689                          asc_dvc->max_total_qng);
8690         AscWriteLramWord(iop_base, ASCV_ASCDVC_ERR_CODE_W, 0);
8691         AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8692         AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, 0);
8693         AscWriteLramByte(iop_base, ASCV_SCSIBUSY_B, 0);
8694         AscWriteLramByte(iop_base, ASCV_WTM_FLAG_B, 0);
8695         AscPutQDoneInProgress(iop_base, 0);
8696         lram_addr = ASC_QADR_BEG;
8697         for (i = 0; i < 32; i++, lram_addr += 2) {
8698                 AscWriteLramWord(iop_base, lram_addr, 0);
8699         }
8700         return (0);
8701 }
8702
8703 static int AscSetLibErrorCode(ASC_DVC_VAR *asc_dvc, ushort err_code)
8704 {
8705         if (asc_dvc->err_code == 0) {
8706                 asc_dvc->err_code = err_code;
8707                 AscWriteLramWord(asc_dvc->iop_base, ASCV_ASCDVC_ERR_CODE_W,
8708                                  err_code);
8709         }
8710         return (err_code);
8711 }
8712
8713 static uchar
8714 AscMsgOutSDTR(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar sdtr_offset)
8715 {
8716         EXT_MSG sdtr_buf;
8717         uchar sdtr_period_index;
8718         PortAddr iop_base;
8719
8720         iop_base = asc_dvc->iop_base;
8721         sdtr_buf.msg_type = EXTENDED_MESSAGE;
8722         sdtr_buf.msg_len = MS_SDTR_LEN;
8723         sdtr_buf.msg_req = EXTENDED_SDTR;
8724         sdtr_buf.xfer_period = sdtr_period;
8725         sdtr_offset &= ASC_SYN_MAX_OFFSET;
8726         sdtr_buf.req_ack_offset = sdtr_offset;
8727         if ((sdtr_period_index =
8728              AscGetSynPeriodIndex(asc_dvc, sdtr_period)) <=
8729             asc_dvc->max_sdtr_index) {
8730                 AscMemWordCopyPtrToLram(iop_base,
8731                                         ASCV_MSGOUT_BEG,
8732                                         (uchar *)&sdtr_buf,
8733                                         sizeof(EXT_MSG) >> 1);
8734                 return ((sdtr_period_index << 4) | sdtr_offset);
8735         } else {
8736
8737                 sdtr_buf.req_ack_offset = 0;
8738                 AscMemWordCopyPtrToLram(iop_base,
8739                                         ASCV_MSGOUT_BEG,
8740                                         (uchar *)&sdtr_buf,
8741                                         sizeof(EXT_MSG) >> 1);
8742                 return (0);
8743         }
8744 }
8745
8746 static uchar
8747 AscCalSDTRData(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar syn_offset)
8748 {
8749         uchar byte;
8750         uchar sdtr_period_ix;
8751
8752         sdtr_period_ix = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
8753         if ((sdtr_period_ix > asc_dvc->max_sdtr_index)
8754             ) {
8755                 return (0xFF);
8756         }
8757         byte = (sdtr_period_ix << 4) | (syn_offset & ASC_SYN_MAX_OFFSET);
8758         return (byte);
8759 }
8760
8761 static void AscSetChipSDTR(PortAddr iop_base, uchar sdtr_data, uchar tid_no)
8762 {
8763         AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
8764         AscPutMCodeSDTRDoneAtID(iop_base, tid_no, sdtr_data);
8765         return;
8766 }
8767
8768 static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time)
8769 {
8770         uchar *period_table;
8771         int max_index;
8772         int min_index;
8773         int i;
8774
8775         period_table = asc_dvc->sdtr_period_tbl;
8776         max_index = (int)asc_dvc->max_sdtr_index;
8777         min_index = (int)asc_dvc->host_init_sdtr_index;
8778         if ((syn_time <= period_table[max_index])) {
8779                 for (i = min_index; i < (max_index - 1); i++) {
8780                         if (syn_time <= period_table[i]) {
8781                                 return ((uchar)i);
8782                         }
8783                 }
8784                 return ((uchar)max_index);
8785         } else {
8786                 return ((uchar)(max_index + 1));
8787         }
8788 }
8789
8790 static uchar AscAllocFreeQueue(PortAddr iop_base, uchar free_q_head)
8791 {
8792         ushort q_addr;
8793         uchar next_qp;
8794         uchar q_status;
8795
8796         q_addr = ASC_QNO_TO_QADDR(free_q_head);
8797         q_status = (uchar)AscReadLramByte(iop_base,
8798                                           (ushort)(q_addr +
8799                                                    ASC_SCSIQ_B_STATUS));
8800         next_qp = AscReadLramByte(iop_base, (ushort)(q_addr + ASC_SCSIQ_B_FWD));
8801         if (((q_status & QS_READY) == 0) && (next_qp != ASC_QLINK_END)) {
8802                 return (next_qp);
8803         }
8804         return (ASC_QLINK_END);
8805 }
8806
8807 static uchar
8808 AscAllocMultipleFreeQueue(PortAddr iop_base, uchar free_q_head, uchar n_free_q)
8809 {
8810         uchar i;
8811
8812         for (i = 0; i < n_free_q; i++) {
8813                 if ((free_q_head = AscAllocFreeQueue(iop_base, free_q_head))
8814                     == ASC_QLINK_END) {
8815                         return (ASC_QLINK_END);
8816                 }
8817         }
8818         return (free_q_head);
8819 }
8820
8821 static int AscHostReqRiscHalt(PortAddr iop_base)
8822 {
8823         int count = 0;
8824         int sta = 0;
8825         uchar saved_stop_code;
8826
8827         if (AscIsChipHalted(iop_base))
8828                 return (1);
8829         saved_stop_code = AscReadLramByte(iop_base, ASCV_STOP_CODE_B);
8830         AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
8831                          ASC_STOP_HOST_REQ_RISC_HALT | ASC_STOP_REQ_RISC_STOP);
8832         do {
8833                 if (AscIsChipHalted(iop_base)) {
8834                         sta = 1;
8835                         break;
8836                 }
8837                 DvcSleepMilliSecond(100);
8838         } while (count++ < 20);
8839         AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, saved_stop_code);
8840         return (sta);
8841 }
8842
8843 static int AscStopQueueExe(PortAddr iop_base)
8844 {
8845         int count = 0;
8846
8847         if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) == 0) {
8848                 AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
8849                                  ASC_STOP_REQ_RISC_STOP);
8850                 do {
8851                         if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) &
8852                             ASC_STOP_ACK_RISC_STOP) {
8853                                 return (1);
8854                         }
8855                         DvcSleepMilliSecond(100);
8856                 } while (count++ < 20);
8857         }
8858         return (0);
8859 }
8860
8861 static void DvcDelayMicroSecond(ADV_DVC_VAR *asc_dvc, ushort micro_sec)
8862 {
8863         udelay(micro_sec);
8864 }
8865
8866 static void DvcDelayNanoSecond(ASC_DVC_VAR *asc_dvc, ASC_DCNT nano_sec)
8867 {
8868         udelay((nano_sec + 999) / 1000);
8869 }
8870
8871 static int AscStartChip(PortAddr iop_base)
8872 {
8873         AscSetChipControl(iop_base, 0);
8874         if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
8875                 return (0);
8876         }
8877         return (1);
8878 }
8879
8880 static int AscStopChip(PortAddr iop_base)
8881 {
8882         uchar cc_val;
8883
8884         cc_val =
8885             AscGetChipControl(iop_base) &
8886             (~(CC_SINGLE_STEP | CC_TEST | CC_DIAG));
8887         AscSetChipControl(iop_base, (uchar)(cc_val | CC_HALT));
8888         AscSetChipIH(iop_base, INS_HALT);
8889         AscSetChipIH(iop_base, INS_RFLAG_WTM);
8890         if ((AscGetChipStatus(iop_base) & CSW_HALTED) == 0) {
8891                 return (0);
8892         }
8893         return (1);
8894 }
8895
8896 static int AscIsChipHalted(PortAddr iop_base)
8897 {
8898         if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
8899                 if ((AscGetChipControl(iop_base) & CC_HALT) != 0) {
8900                         return (1);
8901                 }
8902         }
8903         return (0);
8904 }
8905
8906 static void AscSetChipIH(PortAddr iop_base, ushort ins_code)
8907 {
8908         AscSetBank(iop_base, 1);
8909         AscWriteChipIH(iop_base, ins_code);
8910         AscSetBank(iop_base, 0);
8911         return;
8912 }
8913
8914 static void AscAckInterrupt(PortAddr iop_base)
8915 {
8916         uchar host_flag;
8917         uchar risc_flag;
8918         ushort loop;
8919
8920         loop = 0;
8921         do {
8922                 risc_flag = AscReadLramByte(iop_base, ASCV_RISC_FLAG_B);
8923                 if (loop++ > 0x7FFF) {
8924                         break;
8925                 }
8926         } while ((risc_flag & ASC_RISC_FLAG_GEN_INT) != 0);
8927         host_flag =
8928             AscReadLramByte(iop_base,
8929                             ASCV_HOST_FLAG_B) & (~ASC_HOST_FLAG_ACK_INT);
8930         AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
8931                          (uchar)(host_flag | ASC_HOST_FLAG_ACK_INT));
8932         AscSetChipStatus(iop_base, CIW_INT_ACK);
8933         loop = 0;
8934         while (AscGetChipStatus(iop_base) & CSW_INT_PENDING) {
8935                 AscSetChipStatus(iop_base, CIW_INT_ACK);
8936                 if (loop++ > 3) {
8937                         break;
8938                 }
8939         }
8940         AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
8941         return;
8942 }
8943
8944 static void AscDisableInterrupt(PortAddr iop_base)
8945 {
8946         ushort cfg;
8947
8948         cfg = AscGetChipCfgLsw(iop_base);
8949         AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON));
8950         return;
8951 }
8952
8953 static void AscEnableInterrupt(PortAddr iop_base)
8954 {
8955         ushort cfg;
8956
8957         cfg = AscGetChipCfgLsw(iop_base);
8958         AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON);
8959         return;
8960 }
8961
8962 static void AscSetBank(PortAddr iop_base, uchar bank)
8963 {
8964         uchar val;
8965
8966         val = AscGetChipControl(iop_base) &
8967             (~
8968              (CC_SINGLE_STEP | CC_TEST | CC_DIAG | CC_SCSI_RESET |
8969               CC_CHIP_RESET));
8970         if (bank == 1) {
8971                 val |= CC_BANK_ONE;
8972         } else if (bank == 2) {
8973                 val |= CC_DIAG | CC_BANK_ONE;
8974         } else {
8975                 val &= ~CC_BANK_ONE;
8976         }
8977         AscSetChipControl(iop_base, val);
8978         return;
8979 }
8980
8981 static int AscResetChipAndScsiBus(ASC_DVC_VAR *asc_dvc)
8982 {
8983         PortAddr iop_base;
8984         int i = 10;
8985
8986         iop_base = asc_dvc->iop_base;
8987         while ((AscGetChipStatus(iop_base) & CSW_SCSI_RESET_ACTIVE)
8988                && (i-- > 0)) {
8989                 DvcSleepMilliSecond(100);
8990         }
8991         AscStopChip(iop_base);
8992         AscSetChipControl(iop_base, CC_CHIP_RESET | CC_SCSI_RESET | CC_HALT);
8993         DvcDelayNanoSecond(asc_dvc, 60000);
8994         AscSetChipIH(iop_base, INS_RFLAG_WTM);
8995         AscSetChipIH(iop_base, INS_HALT);
8996         AscSetChipControl(iop_base, CC_CHIP_RESET | CC_HALT);
8997         AscSetChipControl(iop_base, CC_HALT);
8998         DvcSleepMilliSecond(200);
8999         AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
9000         AscSetChipStatus(iop_base, 0);
9001         return (AscIsChipHalted(iop_base));
9002 }
9003
9004 static ASC_DCNT __devinit AscGetMaxDmaCount(ushort bus_type)
9005 {
9006         if (bus_type & ASC_IS_ISA)
9007                 return (ASC_MAX_ISA_DMA_COUNT);
9008         else if (bus_type & (ASC_IS_EISA | ASC_IS_VL))
9009                 return (ASC_MAX_VL_DMA_COUNT);
9010         return (ASC_MAX_PCI_DMA_COUNT);
9011 }
9012
9013 #ifdef CONFIG_ISA
9014 static ushort __devinit AscGetIsaDmaChannel(PortAddr iop_base)
9015 {
9016         ushort channel;
9017
9018         channel = AscGetChipCfgLsw(iop_base) & 0x0003;
9019         if (channel == 0x03)
9020                 return (0);
9021         else if (channel == 0x00)
9022                 return (7);
9023         return (channel + 4);
9024 }
9025
9026 static ushort __devinit AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channel)
9027 {
9028         ushort cfg_lsw;
9029         uchar value;
9030
9031         if ((dma_channel >= 5) && (dma_channel <= 7)) {
9032                 if (dma_channel == 7)
9033                         value = 0x00;
9034                 else
9035                         value = dma_channel - 4;
9036                 cfg_lsw = AscGetChipCfgLsw(iop_base) & 0xFFFC;
9037                 cfg_lsw |= value;
9038                 AscSetChipCfgLsw(iop_base, cfg_lsw);
9039                 return (AscGetIsaDmaChannel(iop_base));
9040         }
9041         return (0);
9042 }
9043
9044 static uchar __devinit AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value)
9045 {
9046         speed_value &= 0x07;
9047         AscSetBank(iop_base, 1);
9048         AscWriteChipDmaSpeed(iop_base, speed_value);
9049         AscSetBank(iop_base, 0);
9050         return (AscGetIsaDmaSpeed(iop_base));
9051 }
9052
9053 static uchar __devinit AscGetIsaDmaSpeed(PortAddr iop_base)
9054 {
9055         uchar speed_value;
9056
9057         AscSetBank(iop_base, 1);
9058         speed_value = AscReadChipDmaSpeed(iop_base);
9059         speed_value &= 0x07;
9060         AscSetBank(iop_base, 0);
9061         return (speed_value);
9062 }
9063 #endif /* CONFIG_ISA */
9064
9065 static int __devinit AscInitGetConfig(asc_board_t *boardp)
9066 {
9067         ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var;
9068         unsigned short warn_code = 0;
9069
9070         asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG;
9071         if (asc_dvc->err_code != 0)
9072                 return asc_dvc->err_code;
9073
9074         if (AscFindSignature(asc_dvc->iop_base)) {
9075                 warn_code |= AscInitAscDvcVar(asc_dvc);
9076                 warn_code |= AscInitFromEEP(asc_dvc);
9077                 asc_dvc->init_state |= ASC_INIT_STATE_END_GET_CFG;
9078                 if (asc_dvc->scsi_reset_wait > ASC_MAX_SCSI_RESET_WAIT)
9079                         asc_dvc->scsi_reset_wait = ASC_MAX_SCSI_RESET_WAIT;
9080         } else {
9081                 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
9082         }
9083
9084         switch (warn_code) {
9085         case 0: /* No error */
9086                 break;
9087         case ASC_WARN_IO_PORT_ROTATE:
9088                 ASC_PRINT1("AscInitGetConfig: board %d: I/O port address "
9089                            "modified\n", boardp->id);
9090                 break;
9091         case ASC_WARN_AUTO_CONFIG:
9092                 ASC_PRINT1("AscInitGetConfig: board %d: I/O port increment "
9093                            "switch enabled\n", boardp->id);
9094                 break;
9095         case ASC_WARN_EEPROM_CHKSUM:
9096                 ASC_PRINT1("AscInitGetConfig: board %d: EEPROM checksum "
9097                            "error\n", boardp->id);
9098                 break;
9099         case ASC_WARN_IRQ_MODIFIED:
9100                 ASC_PRINT1("AscInitGetConfig: board %d: IRQ modified\n",
9101                            boardp->id);
9102                 break;
9103         case ASC_WARN_CMD_QNG_CONFLICT:
9104                 ASC_PRINT1("AscInitGetConfig: board %d: tag queuing enabled "
9105                            "w/o disconnects\n", boardp->id);
9106                 break;
9107         default:
9108                 ASC_PRINT2("AscInitGetConfig: board %d: unknown warning: "
9109                            "0x%x\n", boardp->id, warn_code);
9110                 break;
9111         }
9112
9113         if (asc_dvc->err_code != 0) {
9114                 ASC_PRINT3("AscInitGetConfig: board %d error: init_state 0x%x, "
9115                            "err_code 0x%x\n", boardp->id, asc_dvc->init_state,
9116                            asc_dvc->err_code);
9117         }
9118
9119         return asc_dvc->err_code;
9120 }
9121
9122 static int __devinit AscInitSetConfig(struct pci_dev *pdev, asc_board_t *boardp)
9123 {
9124         ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var;
9125         PortAddr iop_base = asc_dvc->iop_base;
9126         unsigned short cfg_msw;
9127         unsigned short warn_code = 0;
9128
9129         asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
9130         if (asc_dvc->err_code != 0)
9131                 return asc_dvc->err_code;
9132         if (!AscFindSignature(asc_dvc->iop_base)) {
9133                 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
9134                 return asc_dvc->err_code;
9135         }
9136
9137         cfg_msw = AscGetChipCfgMsw(iop_base);
9138         if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
9139                 cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
9140                 warn_code |= ASC_WARN_CFG_MSW_RECOVER;
9141                 AscSetChipCfgMsw(iop_base, cfg_msw);
9142         }
9143         if ((asc_dvc->cfg->cmd_qng_enabled & asc_dvc->cfg->disc_enable) !=
9144             asc_dvc->cfg->cmd_qng_enabled) {
9145                 asc_dvc->cfg->disc_enable = asc_dvc->cfg->cmd_qng_enabled;
9146                 warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
9147         }
9148         if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
9149                 warn_code |= ASC_WARN_AUTO_CONFIG;
9150         }
9151         if ((asc_dvc->bus_type & (ASC_IS_ISA | ASC_IS_VL)) != 0) {
9152                 if (AscSetChipIRQ(iop_base, asc_dvc->irq_no, asc_dvc->bus_type)
9153                     != asc_dvc->irq_no) {
9154                         asc_dvc->err_code |= ASC_IERR_SET_IRQ_NO;
9155                 }
9156         }
9157 #ifdef CONFIG_PCI
9158         if (asc_dvc->bus_type & ASC_IS_PCI) {
9159                 cfg_msw &= 0xFFC0;
9160                 AscSetChipCfgMsw(iop_base, cfg_msw);
9161                 if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) {
9162                 } else {
9163                         if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) ||
9164                             (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) {
9165                                 asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_IF_NOT_DWB;
9166                                 asc_dvc->bug_fix_cntl |=
9167                                     ASC_BUG_FIX_ASYN_USE_SYN;
9168                         }
9169                 }
9170         } else
9171 #endif /* CONFIG_PCI */
9172         if (asc_dvc->bus_type == ASC_IS_ISAPNP) {
9173                 if (AscGetChipVersion(iop_base, asc_dvc->bus_type)
9174                     == ASC_CHIP_VER_ASYN_BUG) {
9175                         asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_ASYN_USE_SYN;
9176                 }
9177         }
9178         if (AscSetChipScsiID(iop_base, asc_dvc->cfg->chip_scsi_id) !=
9179             asc_dvc->cfg->chip_scsi_id) {
9180                 asc_dvc->err_code |= ASC_IERR_SET_SCSI_ID;
9181         }
9182 #ifdef CONFIG_ISA
9183         if (asc_dvc->bus_type & ASC_IS_ISA) {
9184                 AscSetIsaDmaChannel(iop_base, asc_dvc->cfg->isa_dma_channel);
9185                 AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
9186         }
9187 #endif /* CONFIG_ISA */
9188
9189         asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
9190
9191         switch (warn_code) {
9192         case 0: /* No error. */
9193                 break;
9194         case ASC_WARN_IO_PORT_ROTATE:
9195                 ASC_PRINT1("AscInitSetConfig: board %d: I/O port address "
9196                            "modified\n", boardp->id);
9197                 break;
9198         case ASC_WARN_AUTO_CONFIG:
9199                 ASC_PRINT1("AscInitSetConfig: board %d: I/O port increment "
9200                            "switch enabled\n", boardp->id);
9201                 break;
9202         case ASC_WARN_EEPROM_CHKSUM:
9203                 ASC_PRINT1("AscInitSetConfig: board %d: EEPROM checksum "
9204                            "error\n", boardp->id);
9205                 break;
9206         case ASC_WARN_IRQ_MODIFIED:
9207                 ASC_PRINT1("AscInitSetConfig: board %d: IRQ modified\n",
9208                            boardp->id);
9209                 break;
9210         case ASC_WARN_CMD_QNG_CONFLICT:
9211                 ASC_PRINT1("AscInitSetConfig: board %d: tag queuing w/o "
9212                            "disconnects\n",
9213                      boardp->id);
9214                 break;
9215         default:
9216                 ASC_PRINT2("AscInitSetConfig: board %d: unknown warning: "
9217                            "0x%x\n", boardp->id, warn_code);
9218                 break;
9219         }
9220
9221         if (asc_dvc->err_code != 0) {
9222                 ASC_PRINT3("AscInitSetConfig: board %d error: init_state 0x%x, "
9223                            "err_code 0x%x\n", boardp->id, asc_dvc->init_state,
9224                            asc_dvc->err_code);
9225         }
9226
9227         return asc_dvc->err_code;
9228 }
9229
9230 static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
9231 {
9232         ushort warn_code;
9233         PortAddr iop_base;
9234
9235         iop_base = asc_dvc->iop_base;
9236         warn_code = 0;
9237         if ((asc_dvc->dvc_cntl & ASC_CNTL_RESET_SCSI) &&
9238             !(asc_dvc->init_state & ASC_INIT_RESET_SCSI_DONE)) {
9239                 AscResetChipAndScsiBus(asc_dvc);
9240                 DvcSleepMilliSecond((ASC_DCNT)
9241                                     ((ushort)asc_dvc->scsi_reset_wait * 1000));
9242         }
9243         asc_dvc->init_state |= ASC_INIT_STATE_BEG_LOAD_MC;
9244         if (asc_dvc->err_code != 0)
9245                 return (UW_ERR);
9246         if (!AscFindSignature(asc_dvc->iop_base)) {
9247                 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
9248                 return (warn_code);
9249         }
9250         AscDisableInterrupt(iop_base);
9251         warn_code |= AscInitLram(asc_dvc);
9252         if (asc_dvc->err_code != 0)
9253                 return (UW_ERR);
9254         ASC_DBG1(1, "AscInitAsc1000Driver: _asc_mcode_chksum 0x%lx\n",
9255                  (ulong)_asc_mcode_chksum);
9256         if (AscLoadMicroCode(iop_base, 0, _asc_mcode_buf,
9257                              _asc_mcode_size) != _asc_mcode_chksum) {
9258                 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
9259                 return (warn_code);
9260         }
9261         warn_code |= AscInitMicroCodeVar(asc_dvc);
9262         asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;
9263         AscEnableInterrupt(iop_base);
9264         return (warn_code);
9265 }
9266
9267 static ushort __devinit AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc)
9268 {
9269         int i;
9270         PortAddr iop_base;
9271         ushort warn_code;
9272         uchar chip_version;
9273
9274         iop_base = asc_dvc->iop_base;
9275         warn_code = 0;
9276         asc_dvc->err_code = 0;
9277         if ((asc_dvc->bus_type &
9278              (ASC_IS_ISA | ASC_IS_PCI | ASC_IS_EISA | ASC_IS_VL)) == 0) {
9279                 asc_dvc->err_code |= ASC_IERR_NO_BUS_TYPE;
9280         }
9281         AscSetChipControl(iop_base, CC_HALT);
9282         AscSetChipStatus(iop_base, 0);
9283         asc_dvc->bug_fix_cntl = 0;
9284         asc_dvc->pci_fix_asyn_xfer = 0;
9285         asc_dvc->pci_fix_asyn_xfer_always = 0;
9286         /* asc_dvc->init_state initalized in AscInitGetConfig(). */
9287         asc_dvc->sdtr_done = 0;
9288         asc_dvc->cur_total_qng = 0;
9289         asc_dvc->is_in_int = 0;
9290         asc_dvc->in_critical_cnt = 0;
9291         asc_dvc->last_q_shortage = 0;
9292         asc_dvc->use_tagged_qng = 0;
9293         asc_dvc->no_scam = 0;
9294         asc_dvc->unit_not_ready = 0;
9295         asc_dvc->queue_full_or_busy = 0;
9296         asc_dvc->redo_scam = 0;
9297         asc_dvc->res2 = 0;
9298         asc_dvc->host_init_sdtr_index = 0;
9299         asc_dvc->cfg->can_tagged_qng = 0;
9300         asc_dvc->cfg->cmd_qng_enabled = 0;
9301         asc_dvc->dvc_cntl = ASC_DEF_DVC_CNTL;
9302         asc_dvc->init_sdtr = 0;
9303         asc_dvc->max_total_qng = ASC_DEF_MAX_TOTAL_QNG;
9304         asc_dvc->scsi_reset_wait = 3;
9305         asc_dvc->start_motor = ASC_SCSI_WIDTH_BIT_SET;
9306         asc_dvc->max_dma_count = AscGetMaxDmaCount(asc_dvc->bus_type);
9307         asc_dvc->cfg->sdtr_enable = ASC_SCSI_WIDTH_BIT_SET;
9308         asc_dvc->cfg->disc_enable = ASC_SCSI_WIDTH_BIT_SET;
9309         asc_dvc->cfg->chip_scsi_id = ASC_DEF_CHIP_SCSI_ID;
9310         asc_dvc->cfg->lib_serial_no = ASC_LIB_SERIAL_NUMBER;
9311         asc_dvc->cfg->lib_version = (ASC_LIB_VERSION_MAJOR << 8) |
9312             ASC_LIB_VERSION_MINOR;
9313         chip_version = AscGetChipVersion(iop_base, asc_dvc->bus_type);
9314         asc_dvc->cfg->chip_version = chip_version;
9315         asc_dvc->sdtr_period_tbl[0] = SYN_XFER_NS_0;
9316         asc_dvc->sdtr_period_tbl[1] = SYN_XFER_NS_1;
9317         asc_dvc->sdtr_period_tbl[2] = SYN_XFER_NS_2;
9318         asc_dvc->sdtr_period_tbl[3] = SYN_XFER_NS_3;
9319         asc_dvc->sdtr_period_tbl[4] = SYN_XFER_NS_4;
9320         asc_dvc->sdtr_period_tbl[5] = SYN_XFER_NS_5;
9321         asc_dvc->sdtr_period_tbl[6] = SYN_XFER_NS_6;
9322         asc_dvc->sdtr_period_tbl[7] = SYN_XFER_NS_7;
9323         asc_dvc->max_sdtr_index = 7;
9324         if ((asc_dvc->bus_type & ASC_IS_PCI) &&
9325             (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3150)) {
9326                 asc_dvc->bus_type = ASC_IS_PCI_ULTRA;
9327                 asc_dvc->sdtr_period_tbl[0] = SYN_ULTRA_XFER_NS_0;
9328                 asc_dvc->sdtr_period_tbl[1] = SYN_ULTRA_XFER_NS_1;
9329                 asc_dvc->sdtr_period_tbl[2] = SYN_ULTRA_XFER_NS_2;
9330                 asc_dvc->sdtr_period_tbl[3] = SYN_ULTRA_XFER_NS_3;
9331                 asc_dvc->sdtr_period_tbl[4] = SYN_ULTRA_XFER_NS_4;
9332                 asc_dvc->sdtr_period_tbl[5] = SYN_ULTRA_XFER_NS_5;
9333                 asc_dvc->sdtr_period_tbl[6] = SYN_ULTRA_XFER_NS_6;
9334                 asc_dvc->sdtr_period_tbl[7] = SYN_ULTRA_XFER_NS_7;
9335                 asc_dvc->sdtr_period_tbl[8] = SYN_ULTRA_XFER_NS_8;
9336                 asc_dvc->sdtr_period_tbl[9] = SYN_ULTRA_XFER_NS_9;
9337                 asc_dvc->sdtr_period_tbl[10] = SYN_ULTRA_XFER_NS_10;
9338                 asc_dvc->sdtr_period_tbl[11] = SYN_ULTRA_XFER_NS_11;
9339                 asc_dvc->sdtr_period_tbl[12] = SYN_ULTRA_XFER_NS_12;
9340                 asc_dvc->sdtr_period_tbl[13] = SYN_ULTRA_XFER_NS_13;
9341                 asc_dvc->sdtr_period_tbl[14] = SYN_ULTRA_XFER_NS_14;
9342                 asc_dvc->sdtr_period_tbl[15] = SYN_ULTRA_XFER_NS_15;
9343                 asc_dvc->max_sdtr_index = 15;
9344                 if (chip_version == ASC_CHIP_VER_PCI_ULTRA_3150) {
9345                         AscSetExtraControl(iop_base,
9346                                            (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
9347                 } else if (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3050) {
9348                         AscSetExtraControl(iop_base,
9349                                            (SEC_ACTIVE_NEGATE |
9350                                             SEC_ENABLE_FILTER));
9351                 }
9352         }
9353         if (asc_dvc->bus_type == ASC_IS_PCI) {
9354                 AscSetExtraControl(iop_base,
9355                                    (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
9356         }
9357
9358         asc_dvc->cfg->isa_dma_speed = ASC_DEF_ISA_DMA_SPEED;
9359 #ifdef CONFIG_ISA
9360         if ((asc_dvc->bus_type & ASC_IS_ISA) != 0) {
9361                 if (chip_version >= ASC_CHIP_MIN_VER_ISA_PNP) {
9362                         AscSetChipIFC(iop_base, IFC_INIT_DEFAULT);
9363                         asc_dvc->bus_type = ASC_IS_ISAPNP;
9364                 }
9365                 asc_dvc->cfg->isa_dma_channel =
9366                     (uchar)AscGetIsaDmaChannel(iop_base);
9367         }
9368 #endif /* CONFIG_ISA */
9369         for (i = 0; i <= ASC_MAX_TID; i++) {
9370                 asc_dvc->cur_dvc_qng[i] = 0;
9371                 asc_dvc->max_dvc_qng[i] = ASC_MAX_SCSI1_QNG;
9372                 asc_dvc->scsiq_busy_head[i] = (ASC_SCSI_Q *)0L;
9373                 asc_dvc->scsiq_busy_tail[i] = (ASC_SCSI_Q *)0L;
9374                 asc_dvc->cfg->max_tag_qng[i] = ASC_MAX_INRAM_TAG_QNG;
9375         }
9376         return (warn_code);
9377 }
9378
9379 static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
9380 {
9381         ASCEEP_CONFIG eep_config_buf;
9382         ASCEEP_CONFIG *eep_config;
9383         PortAddr iop_base;
9384         ushort chksum;
9385         ushort warn_code;
9386         ushort cfg_msw, cfg_lsw;
9387         int i;
9388         int write_eep = 0;
9389
9390         iop_base = asc_dvc->iop_base;
9391         warn_code = 0;
9392         AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0x00FE);
9393         AscStopQueueExe(iop_base);
9394         if ((AscStopChip(iop_base) == FALSE) ||
9395             (AscGetChipScsiCtrl(iop_base) != 0)) {
9396                 asc_dvc->init_state |= ASC_INIT_RESET_SCSI_DONE;
9397                 AscResetChipAndScsiBus(asc_dvc);
9398                 DvcSleepMilliSecond((ASC_DCNT)
9399                                     ((ushort)asc_dvc->scsi_reset_wait * 1000));
9400         }
9401         if (AscIsChipHalted(iop_base) == FALSE) {
9402                 asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
9403                 return (warn_code);
9404         }
9405         AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
9406         if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
9407                 asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
9408                 return (warn_code);
9409         }
9410         eep_config = (ASCEEP_CONFIG *)&eep_config_buf;
9411         cfg_msw = AscGetChipCfgMsw(iop_base);
9412         cfg_lsw = AscGetChipCfgLsw(iop_base);
9413         if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
9414                 cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
9415                 warn_code |= ASC_WARN_CFG_MSW_RECOVER;
9416                 AscSetChipCfgMsw(iop_base, cfg_msw);
9417         }
9418         chksum = AscGetEEPConfig(iop_base, eep_config, asc_dvc->bus_type);
9419         ASC_DBG1(1, "AscInitFromEEP: chksum 0x%x\n", chksum);
9420         if (chksum == 0) {
9421                 chksum = 0xaa55;
9422         }
9423         if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
9424                 warn_code |= ASC_WARN_AUTO_CONFIG;
9425                 if (asc_dvc->cfg->chip_version == 3) {
9426                         if (eep_config->cfg_lsw != cfg_lsw) {
9427                                 warn_code |= ASC_WARN_EEPROM_RECOVER;
9428                                 eep_config->cfg_lsw =
9429                                     AscGetChipCfgLsw(iop_base);
9430                         }
9431                         if (eep_config->cfg_msw != cfg_msw) {
9432                                 warn_code |= ASC_WARN_EEPROM_RECOVER;
9433                                 eep_config->cfg_msw =
9434                                     AscGetChipCfgMsw(iop_base);
9435                         }
9436                 }
9437         }
9438         eep_config->cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
9439         eep_config->cfg_lsw |= ASC_CFG0_HOST_INT_ON;
9440         ASC_DBG1(1, "AscInitFromEEP: eep_config->chksum 0x%x\n",
9441                  eep_config->chksum);
9442         if (chksum != eep_config->chksum) {
9443                 if (AscGetChipVersion(iop_base, asc_dvc->bus_type) ==
9444                     ASC_CHIP_VER_PCI_ULTRA_3050) {
9445                         ASC_DBG(1,
9446                                 "AscInitFromEEP: chksum error ignored; EEPROM-less board\n");
9447                         eep_config->init_sdtr = 0xFF;
9448                         eep_config->disc_enable = 0xFF;
9449                         eep_config->start_motor = 0xFF;
9450                         eep_config->use_cmd_qng = 0;
9451                         eep_config->max_total_qng = 0xF0;
9452                         eep_config->max_tag_qng = 0x20;
9453                         eep_config->cntl = 0xBFFF;
9454                         ASC_EEP_SET_CHIP_ID(eep_config, 7);
9455                         eep_config->no_scam = 0;
9456                         eep_config->adapter_info[0] = 0;
9457                         eep_config->adapter_info[1] = 0;
9458                         eep_config->adapter_info[2] = 0;
9459                         eep_config->adapter_info[3] = 0;
9460                         eep_config->adapter_info[4] = 0;
9461                         /* Indicate EEPROM-less board. */
9462                         eep_config->adapter_info[5] = 0xBB;
9463                 } else {
9464                         ASC_PRINT
9465                             ("AscInitFromEEP: EEPROM checksum error; Will try to re-write EEPROM.\n");
9466                         write_eep = 1;
9467                         warn_code |= ASC_WARN_EEPROM_CHKSUM;
9468                 }
9469         }
9470         asc_dvc->cfg->sdtr_enable = eep_config->init_sdtr;
9471         asc_dvc->cfg->disc_enable = eep_config->disc_enable;
9472         asc_dvc->cfg->cmd_qng_enabled = eep_config->use_cmd_qng;
9473         asc_dvc->cfg->isa_dma_speed = ASC_EEP_GET_DMA_SPD(eep_config);
9474         asc_dvc->start_motor = eep_config->start_motor;
9475         asc_dvc->dvc_cntl = eep_config->cntl;
9476         asc_dvc->no_scam = eep_config->no_scam;
9477         asc_dvc->cfg->adapter_info[0] = eep_config->adapter_info[0];
9478         asc_dvc->cfg->adapter_info[1] = eep_config->adapter_info[1];
9479         asc_dvc->cfg->adapter_info[2] = eep_config->adapter_info[2];
9480         asc_dvc->cfg->adapter_info[3] = eep_config->adapter_info[3];
9481         asc_dvc->cfg->adapter_info[4] = eep_config->adapter_info[4];
9482         asc_dvc->cfg->adapter_info[5] = eep_config->adapter_info[5];
9483         if (!AscTestExternalLram(asc_dvc)) {
9484                 if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) ==
9485                      ASC_IS_PCI_ULTRA)) {
9486                         eep_config->max_total_qng =
9487                             ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG;
9488                         eep_config->max_tag_qng =
9489                             ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG;
9490                 } else {
9491                         eep_config->cfg_msw |= 0x0800;
9492                         cfg_msw |= 0x0800;
9493                         AscSetChipCfgMsw(iop_base, cfg_msw);
9494                         eep_config->max_total_qng = ASC_MAX_PCI_INRAM_TOTAL_QNG;
9495                         eep_config->max_tag_qng = ASC_MAX_INRAM_TAG_QNG;
9496                 }
9497         } else {
9498         }
9499         if (eep_config->max_total_qng < ASC_MIN_TOTAL_QNG) {
9500                 eep_config->max_total_qng = ASC_MIN_TOTAL_QNG;
9501         }
9502         if (eep_config->max_total_qng > ASC_MAX_TOTAL_QNG) {
9503                 eep_config->max_total_qng = ASC_MAX_TOTAL_QNG;
9504         }
9505         if (eep_config->max_tag_qng > eep_config->max_total_qng) {
9506                 eep_config->max_tag_qng = eep_config->max_total_qng;
9507         }
9508         if (eep_config->max_tag_qng < ASC_MIN_TAG_Q_PER_DVC) {
9509                 eep_config->max_tag_qng = ASC_MIN_TAG_Q_PER_DVC;
9510         }
9511         asc_dvc->max_total_qng = eep_config->max_total_qng;
9512         if ((eep_config->use_cmd_qng & eep_config->disc_enable) !=
9513             eep_config->use_cmd_qng) {
9514                 eep_config->disc_enable = eep_config->use_cmd_qng;
9515                 warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
9516         }
9517         if (asc_dvc->bus_type & (ASC_IS_ISA | ASC_IS_VL | ASC_IS_EISA)) {
9518                 asc_dvc->irq_no = AscGetChipIRQ(iop_base, asc_dvc->bus_type);
9519         }
9520         ASC_EEP_SET_CHIP_ID(eep_config,
9521                             ASC_EEP_GET_CHIP_ID(eep_config) & ASC_MAX_TID);
9522         asc_dvc->cfg->chip_scsi_id = ASC_EEP_GET_CHIP_ID(eep_config);
9523         if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) &&
9524             !(asc_dvc->dvc_cntl & ASC_CNTL_SDTR_ENABLE_ULTRA)) {
9525                 asc_dvc->host_init_sdtr_index = ASC_SDTR_ULTRA_PCI_10MB_INDEX;
9526         }
9527
9528         for (i = 0; i <= ASC_MAX_TID; i++) {
9529                 asc_dvc->dos_int13_table[i] = eep_config->dos_int13_table[i];
9530                 asc_dvc->cfg->max_tag_qng[i] = eep_config->max_tag_qng;
9531                 asc_dvc->cfg->sdtr_period_offset[i] =
9532                     (uchar)(ASC_DEF_SDTR_OFFSET |
9533                             (asc_dvc->host_init_sdtr_index << 4));
9534         }
9535         eep_config->cfg_msw = AscGetChipCfgMsw(iop_base);
9536         if (write_eep) {
9537                 if ((i =
9538                      AscSetEEPConfig(iop_base, eep_config,
9539                                      asc_dvc->bus_type)) != 0) {
9540                         ASC_PRINT1
9541                             ("AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n",
9542                              i);
9543                 } else {
9544                         ASC_PRINT
9545                             ("AscInitFromEEP: Successfully re-wrote EEPROM.\n");
9546                 }
9547         }
9548         return (warn_code);
9549 }
9550
9551 static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)
9552 {
9553         int i;
9554         ushort warn_code;
9555         PortAddr iop_base;
9556         ASC_PADDR phy_addr;
9557         ASC_DCNT phy_size;
9558
9559         iop_base = asc_dvc->iop_base;
9560         warn_code = 0;
9561         for (i = 0; i <= ASC_MAX_TID; i++) {
9562                 AscPutMCodeInitSDTRAtID(iop_base, i,
9563                                         asc_dvc->cfg->sdtr_period_offset[i]
9564                     );
9565         }
9566
9567         AscInitQLinkVar(asc_dvc);
9568         AscWriteLramByte(iop_base, ASCV_DISC_ENABLE_B,
9569                          asc_dvc->cfg->disc_enable);
9570         AscWriteLramByte(iop_base, ASCV_HOSTSCSI_ID_B,
9571                          ASC_TID_TO_TARGET_ID(asc_dvc->cfg->chip_scsi_id));
9572
9573         /* Align overrun buffer on an 8 byte boundary. */
9574         phy_addr = virt_to_bus(asc_dvc->cfg->overrun_buf);
9575         phy_addr = cpu_to_le32((phy_addr + 7) & ~0x7);
9576         AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_PADDR_D,
9577                                  (uchar *)&phy_addr, 1);
9578         phy_size = cpu_to_le32(ASC_OVERRUN_BSIZE - 8);
9579         AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_BSIZE_D,
9580                                  (uchar *)&phy_size, 1);
9581
9582         asc_dvc->cfg->mcode_date =
9583             AscReadLramWord(iop_base, (ushort)ASCV_MC_DATE_W);
9584         asc_dvc->cfg->mcode_version =
9585             AscReadLramWord(iop_base, (ushort)ASCV_MC_VER_W);
9586
9587         AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
9588         if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
9589                 asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
9590                 return (warn_code);
9591         }
9592         if (AscStartChip(iop_base) != 1) {
9593                 asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
9594                 return (warn_code);
9595         }
9596
9597         return (warn_code);
9598 }
9599
9600 static int __devinit AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
9601 {
9602         PortAddr iop_base;
9603         ushort q_addr;
9604         ushort saved_word;
9605         int sta;
9606
9607         iop_base = asc_dvc->iop_base;
9608         sta = 0;
9609         q_addr = ASC_QNO_TO_QADDR(241);
9610         saved_word = AscReadLramWord(iop_base, q_addr);
9611         AscSetChipLramAddr(iop_base, q_addr);
9612         AscSetChipLramData(iop_base, 0x55AA);
9613         DvcSleepMilliSecond(10);
9614         AscSetChipLramAddr(iop_base, q_addr);
9615         if (AscGetChipLramData(iop_base) == 0x55AA) {
9616                 sta = 1;
9617                 AscWriteLramWord(iop_base, q_addr, saved_word);
9618         }
9619         return (sta);
9620 }
9621
9622 static int __devinit AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg)
9623 {
9624         uchar read_back;
9625         int retry;
9626
9627         retry = 0;
9628         while (TRUE) {
9629                 AscSetChipEEPCmd(iop_base, cmd_reg);
9630                 DvcSleepMilliSecond(1);
9631                 read_back = AscGetChipEEPCmd(iop_base);
9632                 if (read_back == cmd_reg) {
9633                         return (1);
9634                 }
9635                 if (retry++ > ASC_EEP_MAX_RETRY) {
9636                         return (0);
9637                 }
9638         }
9639 }
9640
9641 static int __devinit AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
9642 {
9643         ushort read_back;
9644         int retry;
9645
9646         retry = 0;
9647         while (TRUE) {
9648                 AscSetChipEEPData(iop_base, data_reg);
9649                 DvcSleepMilliSecond(1);
9650                 read_back = AscGetChipEEPData(iop_base);
9651                 if (read_back == data_reg) {
9652                         return (1);
9653                 }
9654                 if (retry++ > ASC_EEP_MAX_RETRY) {
9655                         return (0);
9656                 }
9657         }
9658 }
9659
9660 static void __devinit AscWaitEEPRead(void)
9661 {
9662         DvcSleepMilliSecond(1);
9663         return;
9664 }
9665
9666 static void __devinit AscWaitEEPWrite(void)
9667 {
9668         DvcSleepMilliSecond(20);
9669         return;
9670 }
9671
9672 static ushort __devinit AscReadEEPWord(PortAddr iop_base, uchar addr)
9673 {
9674         ushort read_wval;
9675         uchar cmd_reg;
9676
9677         AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
9678         AscWaitEEPRead();
9679         cmd_reg = addr | ASC_EEP_CMD_READ;
9680         AscWriteEEPCmdReg(iop_base, cmd_reg);
9681         AscWaitEEPRead();
9682         read_wval = AscGetChipEEPData(iop_base);
9683         AscWaitEEPRead();
9684         return (read_wval);
9685 }
9686
9687 static ushort __devinit
9688 AscWriteEEPWord(PortAddr iop_base, uchar addr, ushort word_val)
9689 {
9690         ushort read_wval;
9691
9692         read_wval = AscReadEEPWord(iop_base, addr);
9693         if (read_wval != word_val) {
9694                 AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_ABLE);
9695                 AscWaitEEPRead();
9696                 AscWriteEEPDataReg(iop_base, word_val);
9697                 AscWaitEEPRead();
9698                 AscWriteEEPCmdReg(iop_base,
9699                                   (uchar)((uchar)ASC_EEP_CMD_WRITE | addr));
9700                 AscWaitEEPWrite();
9701                 AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
9702                 AscWaitEEPRead();
9703                 return (AscReadEEPWord(iop_base, addr));
9704         }
9705         return (read_wval);
9706 }
9707
9708 static ushort __devinit
9709 AscGetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
9710 {
9711         ushort wval;
9712         ushort sum;
9713         ushort *wbuf;
9714         int cfg_beg;
9715         int cfg_end;
9716         int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
9717         int s_addr;
9718
9719         wbuf = (ushort *)cfg_buf;
9720         sum = 0;
9721         /* Read two config words; Byte-swapping done by AscReadEEPWord(). */
9722         for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
9723                 *wbuf = AscReadEEPWord(iop_base, (uchar)s_addr);
9724                 sum += *wbuf;
9725         }
9726         if (bus_type & ASC_IS_VL) {
9727                 cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
9728                 cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
9729         } else {
9730                 cfg_beg = ASC_EEP_DVC_CFG_BEG;
9731                 cfg_end = ASC_EEP_MAX_DVC_ADDR;
9732         }
9733         for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
9734                 wval = AscReadEEPWord(iop_base, (uchar)s_addr);
9735                 if (s_addr <= uchar_end_in_config) {
9736                         /*
9737                          * Swap all char fields - must unswap bytes already swapped
9738                          * by AscReadEEPWord().
9739                          */
9740                         *wbuf = le16_to_cpu(wval);
9741                 } else {
9742                         /* Don't swap word field at the end - cntl field. */
9743                         *wbuf = wval;
9744                 }
9745                 sum += wval;    /* Checksum treats all EEPROM data as words. */
9746         }
9747         /*
9748          * Read the checksum word which will be compared against 'sum'
9749          * by the caller. Word field already swapped.
9750          */
9751         *wbuf = AscReadEEPWord(iop_base, (uchar)s_addr);
9752         return (sum);
9753 }
9754
9755 static int __devinit
9756 AscSetEEPConfigOnce(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
9757 {
9758         int n_error;
9759         ushort *wbuf;
9760         ushort word;
9761         ushort sum;
9762         int s_addr;
9763         int cfg_beg;
9764         int cfg_end;
9765         int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
9766
9767         wbuf = (ushort *)cfg_buf;
9768         n_error = 0;
9769         sum = 0;
9770         /* Write two config words; AscWriteEEPWord() will swap bytes. */
9771         for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
9772                 sum += *wbuf;
9773                 if (*wbuf != AscWriteEEPWord(iop_base, (uchar)s_addr, *wbuf)) {
9774                         n_error++;
9775                 }
9776         }
9777         if (bus_type & ASC_IS_VL) {
9778                 cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
9779                 cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
9780         } else {
9781                 cfg_beg = ASC_EEP_DVC_CFG_BEG;
9782                 cfg_end = ASC_EEP_MAX_DVC_ADDR;
9783         }
9784         for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
9785                 if (s_addr <= uchar_end_in_config) {
9786                         /*
9787                          * This is a char field. Swap char fields before they are
9788                          * swapped again by AscWriteEEPWord().
9789                          */
9790                         word = cpu_to_le16(*wbuf);
9791                         if (word !=
9792                             AscWriteEEPWord(iop_base, (uchar)s_addr, word)) {
9793                                 n_error++;
9794                         }
9795                 } else {
9796                         /* Don't swap word field at the end - cntl field. */
9797                         if (*wbuf !=
9798                             AscWriteEEPWord(iop_base, (uchar)s_addr, *wbuf)) {
9799                                 n_error++;
9800                         }
9801                 }
9802                 sum += *wbuf;   /* Checksum calculated from word values. */
9803         }
9804         /* Write checksum word. It will be swapped by AscWriteEEPWord(). */
9805         *wbuf = sum;
9806         if (sum != AscWriteEEPWord(iop_base, (uchar)s_addr, sum)) {
9807                 n_error++;
9808         }
9809
9810         /* Read EEPROM back again. */
9811         wbuf = (ushort *)cfg_buf;
9812         /*
9813          * Read two config words; Byte-swapping done by AscReadEEPWord().
9814          */
9815         for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
9816                 if (*wbuf != AscReadEEPWord(iop_base, (uchar)s_addr)) {
9817                         n_error++;
9818                 }
9819         }
9820         if (bus_type & ASC_IS_VL) {
9821                 cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
9822                 cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
9823         } else {
9824                 cfg_beg = ASC_EEP_DVC_CFG_BEG;
9825                 cfg_end = ASC_EEP_MAX_DVC_ADDR;
9826         }
9827         for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
9828                 if (s_addr <= uchar_end_in_config) {
9829                         /*
9830                          * Swap all char fields. Must unswap bytes already swapped
9831                          * by AscReadEEPWord().
9832                          */
9833                         word =
9834                             le16_to_cpu(AscReadEEPWord
9835                                         (iop_base, (uchar)s_addr));
9836                 } else {
9837                         /* Don't swap word field at the end - cntl field. */
9838                         word = AscReadEEPWord(iop_base, (uchar)s_addr);
9839                 }
9840                 if (*wbuf != word) {
9841                         n_error++;
9842                 }
9843         }
9844         /* Read checksum; Byte swapping not needed. */
9845         if (AscReadEEPWord(iop_base, (uchar)s_addr) != sum) {
9846                 n_error++;
9847         }
9848         return (n_error);
9849 }
9850
9851 static int __devinit
9852 AscSetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
9853 {
9854         int retry;
9855         int n_error;
9856
9857         retry = 0;
9858         while (TRUE) {
9859                 if ((n_error = AscSetEEPConfigOnce(iop_base, cfg_buf,
9860                                                    bus_type)) == 0) {
9861                         break;
9862                 }
9863                 if (++retry > ASC_EEP_MAX_RETRY) {
9864                         break;
9865                 }
9866         }
9867         return (n_error);
9868 }
9869
9870 static void AscAsyncFix(ASC_DVC_VAR *asc_dvc, struct scsi_device *sdev)
9871 {
9872         char type = sdev->type;
9873         ASC_SCSI_BIT_ID_TYPE tid_bits = 1 << sdev->id;
9874
9875         if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_ASYN_USE_SYN) {
9876                 if (!(asc_dvc->init_sdtr & tid_bits)) {
9877                         if ((type == TYPE_ROM) &&
9878                             (strncmp(sdev->vendor, "HP ", 3) == 0)) {
9879                                 asc_dvc->pci_fix_asyn_xfer_always |= tid_bits;
9880                         }
9881                         asc_dvc->pci_fix_asyn_xfer |= tid_bits;
9882                         if ((type == TYPE_PROCESSOR) ||
9883                             (type == TYPE_SCANNER) || (type == TYPE_ROM) ||
9884                             (type == TYPE_TAPE)) {
9885                                 asc_dvc->pci_fix_asyn_xfer &= ~tid_bits;
9886                         }
9887
9888                         if (asc_dvc->pci_fix_asyn_xfer & tid_bits) {
9889                                 AscSetRunChipSynRegAtID(asc_dvc->iop_base,
9890                                         sdev->id,
9891                                         ASYN_SDTR_DATA_FIX_PCI_REV_AB);
9892                         }
9893                 }
9894         }
9895 }
9896
9897 static uchar AscReadLramByte(PortAddr iop_base, ushort addr)
9898 {
9899         uchar byte_data;
9900         ushort word_data;
9901
9902         if (isodd_word(addr)) {
9903                 AscSetChipLramAddr(iop_base, addr - 1);
9904                 word_data = AscGetChipLramData(iop_base);
9905                 byte_data = (uchar)((word_data >> 8) & 0xFF);
9906         } else {
9907                 AscSetChipLramAddr(iop_base, addr);
9908                 word_data = AscGetChipLramData(iop_base);
9909                 byte_data = (uchar)(word_data & 0xFF);
9910         }
9911         return (byte_data);
9912 }
9913
9914 static ushort AscReadLramWord(PortAddr iop_base, ushort addr)
9915 {
9916         ushort word_data;
9917
9918         AscSetChipLramAddr(iop_base, addr);
9919         word_data = AscGetChipLramData(iop_base);
9920         return (word_data);
9921 }
9922
9923 #if CC_VERY_LONG_SG_LIST
9924 static ASC_DCNT AscReadLramDWord(PortAddr iop_base, ushort addr)
9925 {
9926         ushort val_low, val_high;
9927         ASC_DCNT dword_data;
9928
9929         AscSetChipLramAddr(iop_base, addr);
9930         val_low = AscGetChipLramData(iop_base);
9931         val_high = AscGetChipLramData(iop_base);
9932         dword_data = ((ASC_DCNT) val_high << 16) | (ASC_DCNT) val_low;
9933         return (dword_data);
9934 }
9935 #endif /* CC_VERY_LONG_SG_LIST */
9936
9937 static void AscWriteLramWord(PortAddr iop_base, ushort addr, ushort word_val)
9938 {
9939         AscSetChipLramAddr(iop_base, addr);
9940         AscSetChipLramData(iop_base, word_val);
9941         return;
9942 }
9943
9944 static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
9945 {
9946         ushort word_data;
9947
9948         if (isodd_word(addr)) {
9949                 addr--;
9950                 word_data = AscReadLramWord(iop_base, addr);
9951                 word_data &= 0x00FF;
9952                 word_data |= (((ushort)byte_val << 8) & 0xFF00);
9953         } else {
9954                 word_data = AscReadLramWord(iop_base, addr);
9955                 word_data &= 0xFF00;
9956                 word_data |= ((ushort)byte_val & 0x00FF);
9957         }
9958         AscWriteLramWord(iop_base, addr, word_data);
9959         return;
9960 }
9961
9962 /*
9963  * Copy 2 bytes to LRAM.
9964  *
9965  * The source data is assumed to be in little-endian order in memory
9966  * and is maintained in little-endian order when written to LRAM.
9967  */
9968 static void
9969 AscMemWordCopyPtrToLram(PortAddr iop_base,
9970                         ushort s_addr, uchar *s_buffer, int words)
9971 {
9972         int i;
9973
9974         AscSetChipLramAddr(iop_base, s_addr);
9975         for (i = 0; i < 2 * words; i += 2) {
9976                 /*
9977                  * On a little-endian system the second argument below
9978                  * produces a little-endian ushort which is written to
9979                  * LRAM in little-endian order. On a big-endian system
9980                  * the second argument produces a big-endian ushort which
9981                  * is "transparently" byte-swapped by outpw() and written
9982                  * in little-endian order to LRAM.
9983                  */
9984                 outpw(iop_base + IOP_RAM_DATA,
9985                       ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
9986         }
9987         return;
9988 }
9989
9990 /*
9991  * Copy 4 bytes to LRAM.
9992  *
9993  * The source data is assumed to be in little-endian order in memory
9994  * and is maintained in little-endian order when writen to LRAM.
9995  */
9996 static void
9997 AscMemDWordCopyPtrToLram(PortAddr iop_base,
9998                          ushort s_addr, uchar *s_buffer, int dwords)
9999 {
10000         int i;
10001
10002         AscSetChipLramAddr(iop_base, s_addr);
10003         for (i = 0; i < 4 * dwords; i += 4) {
10004                 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);   /* LSW */
10005                 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 3] << 8) | s_buffer[i + 2]);       /* MSW */
10006         }
10007         return;
10008 }
10009
10010 /*
10011  * Copy 2 bytes from LRAM.
10012  *
10013  * The source data is assumed to be in little-endian order in LRAM
10014  * and is maintained in little-endian order when written to memory.
10015  */
10016 static void
10017 AscMemWordCopyPtrFromLram(PortAddr iop_base,
10018                           ushort s_addr, uchar *d_buffer, int words)
10019 {
10020         int i;
10021         ushort word;
10022
10023         AscSetChipLramAddr(iop_base, s_addr);
10024         for (i = 0; i < 2 * words; i += 2) {
10025                 word = inpw(iop_base + IOP_RAM_DATA);
10026                 d_buffer[i] = word & 0xff;
10027                 d_buffer[i + 1] = (word >> 8) & 0xff;
10028         }
10029         return;
10030 }
10031
10032 static ASC_DCNT AscMemSumLramWord(PortAddr iop_base, ushort s_addr, int words)
10033 {
10034         ASC_DCNT sum;
10035         int i;
10036
10037         sum = 0L;
10038         for (i = 0; i < words; i++, s_addr += 2) {
10039                 sum += AscReadLramWord(iop_base, s_addr);
10040         }
10041         return (sum);
10042 }
10043
10044 static void
10045 AscMemWordSetLram(PortAddr iop_base, ushort s_addr, ushort set_wval, int words)
10046 {
10047         int i;
10048
10049         AscSetChipLramAddr(iop_base, s_addr);
10050         for (i = 0; i < words; i++) {
10051                 AscSetChipLramData(iop_base, set_wval);
10052         }
10053         return;
10054 }
10055
10056 /*
10057  * --- Adv Library Functions
10058  */
10059
10060 /* a_mcode.h */
10061
10062 /* Microcode buffer is kept after initialization for error recovery. */
10063 static unsigned char _adv_asc3550_buf[] = {
10064         0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0x16, 0x18, 0xe4, 0x00, 0xfc,
10065         0x01, 0x00, 0x48, 0xe4, 0xbe, 0x18, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00,
10066         0x00, 0xfa, 0xff, 0xff, 0x28, 0x0e, 0x9e, 0xe7, 0xff, 0x00, 0x82, 0xe7,
10067         0x00, 0xea, 0x00, 0xf6, 0x01, 0xe6, 0x09, 0xe7, 0x55, 0xf0, 0x01, 0xf6,
10068         0x01, 0xfa, 0x08, 0x00, 0x03, 0x00, 0x04, 0x00, 0x18, 0xf4, 0x10, 0x00,
10069         0x00, 0xec, 0x85, 0xf0, 0xbc, 0x00, 0xd5, 0xf0, 0x8e, 0x0c, 0x38, 0x54,
10070         0x00, 0xe6, 0x1e, 0xf0, 0x86, 0xf0, 0xb4, 0x00, 0x98, 0x57, 0xd0, 0x01,
10071         0x0c, 0x1c, 0x3e, 0x1c, 0x0c, 0x00, 0xbb, 0x00, 0xaa, 0x18, 0x02, 0x80,
10072         0x32, 0xf0, 0x01, 0xfc, 0x88, 0x0c, 0xc6, 0x12, 0x02, 0x13, 0x18, 0x40,
10073         0x00, 0x57, 0x01, 0xea, 0x3c, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
10074         0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00, 0xc0, 0x00, 0x01, 0x01,
10075         0x3e, 0x01, 0xda, 0x0f, 0x22, 0x10, 0x08, 0x12, 0x02, 0x4a, 0xb9, 0x54,
10076         0x03, 0x58, 0x1b, 0x80, 0x30, 0xe4, 0x4b, 0xe4, 0x20, 0x00, 0x32, 0x00,
10077         0x3e, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01,
10078         0x70, 0x01, 0x72, 0x01, 0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0x62, 0x0a,
10079         0x92, 0x0c, 0x2c, 0x10, 0x2e, 0x10, 0x06, 0x13, 0x4c, 0x1c, 0xbb, 0x55,
10080         0x3c, 0x56, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0, 0xb1, 0xf0,
10081         0x03, 0xf7, 0x06, 0xf7, 0x03, 0xfc, 0x0f, 0x00, 0x40, 0x00, 0xbe, 0x00,
10082         0x00, 0x01, 0xb0, 0x08, 0x30, 0x13, 0x64, 0x15, 0x32, 0x1c, 0x38, 0x1c,
10083         0x4e, 0x1c, 0x10, 0x44, 0x02, 0x48, 0x00, 0x4c, 0x04, 0xea, 0x5d, 0xf0,
10084         0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00,
10085         0xcc, 0x00, 0x20, 0x01, 0x4e, 0x01, 0x4e, 0x0b, 0x1e, 0x0e, 0x0c, 0x10,
10086         0x0a, 0x12, 0x04, 0x13, 0x40, 0x13, 0x30, 0x1c, 0x00, 0x4e, 0xbd, 0x56,
10087         0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0, 0x59, 0xf0, 0xa7, 0xf0,
10088         0xb8, 0xf0, 0x0e, 0xf7, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00,
10089         0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00,
10090         0xde, 0x03, 0x56, 0x0a, 0x14, 0x0e, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10,
10091         0x36, 0x10, 0x0a, 0x13, 0x12, 0x13, 0x52, 0x13, 0x10, 0x15, 0x14, 0x15,
10092         0xac, 0x16, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44,
10093         0x91, 0x44, 0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x83, 0x55,
10094         0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0, 0x0c, 0xf0,
10095         0x5c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8, 0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa,
10096         0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x1c, 0x00,
10097         0x9e, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0x22, 0x01,
10098         0x26, 0x01, 0x79, 0x01, 0x7a, 0x01, 0xc0, 0x01, 0xc2, 0x01, 0x7c, 0x02,
10099         0x5a, 0x03, 0xea, 0x04, 0xe8, 0x07, 0x68, 0x08, 0x69, 0x08, 0xba, 0x08,
10100         0xe9, 0x09, 0x06, 0x0b, 0x3a, 0x0e, 0x00, 0x10, 0x1a, 0x10, 0xed, 0x10,
10101         0xf1, 0x10, 0x06, 0x12, 0x0c, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x82, 0x13,
10102         0x42, 0x14, 0xd6, 0x14, 0x8a, 0x15, 0xc6, 0x17, 0xd2, 0x17, 0x6b, 0x18,
10103         0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40, 0x0e, 0x47, 0x48, 0x47,
10104         0x41, 0x48, 0x89, 0x48, 0x80, 0x4c, 0x00, 0x54, 0x44, 0x55, 0xe5, 0x55,
10105         0x14, 0x56, 0x77, 0x57, 0xbf, 0x57, 0x40, 0x5c, 0x06, 0x80, 0x08, 0x90,
10106         0x03, 0xa1, 0xfe, 0x9c, 0xf0, 0x29, 0x02, 0xfe, 0xb8, 0x0c, 0xff, 0x10,
10107         0x00, 0x00, 0xd0, 0xfe, 0xcc, 0x18, 0x00, 0xcf, 0xfe, 0x80, 0x01, 0xff,
10108         0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
10109         0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x48, 0x00, 0x4f, 0xff, 0x04, 0x00,
10110         0x00, 0x10, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
10111         0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x0f,
10112         0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
10113         0xfe, 0x04, 0xf7, 0xcf, 0x2a, 0x67, 0x0b, 0x01, 0xfe, 0xce, 0x0e, 0xfe,
10114         0x04, 0xf7, 0xcf, 0x67, 0x0b, 0x3c, 0x2a, 0xfe, 0x3d, 0xf0, 0xfe, 0x02,
10115         0x02, 0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x91, 0xf0, 0xfe, 0xf0, 0x01, 0xfe,
10116         0x90, 0xf0, 0xfe, 0xf0, 0x01, 0xfe, 0x8f, 0xf0, 0x9c, 0x05, 0x51, 0x3b,
10117         0x02, 0xfe, 0xd4, 0x0c, 0x01, 0xfe, 0x44, 0x0d, 0xfe, 0xdd, 0x12, 0xfe,
10118         0xfc, 0x10, 0xfe, 0x28, 0x1c, 0x05, 0xfe, 0xa6, 0x00, 0xfe, 0xd3, 0x12,
10119         0x47, 0x18, 0xfe, 0xa6, 0x00, 0xb5, 0xfe, 0x48, 0xf0, 0xfe, 0x86, 0x02,
10120         0xfe, 0x49, 0xf0, 0xfe, 0xa0, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xbe, 0x02,
10121         0xfe, 0x46, 0xf0, 0xfe, 0x50, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x56, 0x02,
10122         0xfe, 0x43, 0xf0, 0xfe, 0x44, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x48, 0x02,
10123         0xfe, 0x45, 0xf0, 0xfe, 0x4c, 0x02, 0x17, 0x0b, 0xa0, 0x17, 0x06, 0x18,
10124         0x96, 0x02, 0x29, 0xfe, 0x00, 0x1c, 0xde, 0xfe, 0x02, 0x1c, 0xdd, 0xfe,
10125         0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0xfe, 0x20, 0x17, 0xfe, 0xe7, 0x10,
10126         0xfe, 0x06, 0xfc, 0xc7, 0x0a, 0x6b, 0x01, 0x9e, 0x02, 0x29, 0x14, 0x4d,
10127         0x37, 0x97, 0x01, 0xfe, 0x64, 0x0f, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xbd,
10128         0x10, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
10129         0x58, 0x1c, 0x17, 0x06, 0x18, 0x96, 0x2a, 0x25, 0x29, 0xfe, 0x3d, 0xf0,
10130         0xfe, 0x02, 0x02, 0x21, 0xfe, 0x94, 0x02, 0xfe, 0x5a, 0x1c, 0xea, 0xfe,
10131         0x14, 0x1c, 0x14, 0xfe, 0x30, 0x00, 0x37, 0x97, 0x01, 0xfe, 0x54, 0x0f,
10132         0x17, 0x06, 0x18, 0x96, 0x02, 0xd0, 0x1e, 0x20, 0x07, 0x10, 0x34, 0xfe,
10133         0x69, 0x10, 0x17, 0x06, 0x18, 0x96, 0xfe, 0x04, 0xec, 0x20, 0x46, 0x3d,
10134         0x12, 0x20, 0xfe, 0x05, 0xf6, 0xc7, 0x01, 0xfe, 0x52, 0x16, 0x09, 0x4a,
10135         0x4c, 0x35, 0x11, 0x2d, 0x3c, 0x8a, 0x01, 0xe6, 0x02, 0x29, 0x0a, 0x40,
10136         0x01, 0x0e, 0x07, 0x00, 0x5d, 0x01, 0x6f, 0xfe, 0x18, 0x10, 0xfe, 0x41,
10137         0x58, 0x0a, 0x99, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x64, 0xfe, 0x0c, 0x03,
10138         0x01, 0xe6, 0x02, 0x29, 0x2a, 0x46, 0xfe, 0x02, 0xe8, 0x27, 0xf8, 0xfe,
10139         0x9e, 0x43, 0xf7, 0xfe, 0x27, 0xf0, 0xfe, 0xdc, 0x01, 0xfe, 0x07, 0x4b,
10140         0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x40, 0x1c, 0x25, 0xd2, 0xfe, 0x26, 0xf0,
10141         0xfe, 0x56, 0x03, 0xfe, 0xa0, 0xf0, 0xfe, 0x44, 0x03, 0xfe, 0x11, 0xf0,
10142         0x9c, 0xfe, 0xef, 0x10, 0xfe, 0x9f, 0xf0, 0xfe, 0x64, 0x03, 0xeb, 0x0f,
10143         0xfe, 0x11, 0x00, 0x02, 0x5a, 0x2a, 0xfe, 0x48, 0x1c, 0xeb, 0x09, 0x04,
10144         0x1d, 0xfe, 0x18, 0x13, 0x23, 0x1e, 0x98, 0xac, 0x12, 0x98, 0x0a, 0x40,
10145         0x01, 0x0e, 0xac, 0x75, 0x01, 0xfe, 0xbc, 0x15, 0x11, 0xca, 0x25, 0xd2,
10146         0xfe, 0x01, 0xf0, 0xd2, 0xfe, 0x82, 0xf0, 0xfe, 0x92, 0x03, 0xec, 0x11,
10147         0xfe, 0xe4, 0x00, 0x65, 0xfe, 0xa4, 0x03, 0x25, 0x32, 0x1f, 0xfe, 0xb4,
10148         0x03, 0x01, 0x43, 0xfe, 0x06, 0xf0, 0xfe, 0xc4, 0x03, 0x8d, 0x81, 0xfe,
10149         0x0a, 0xf0, 0xfe, 0x7a, 0x06, 0x02, 0x22, 0x05, 0x6b, 0x28, 0x16, 0xfe,
10150         0xf6, 0x04, 0x14, 0x2c, 0x01, 0x33, 0x8f, 0xfe, 0x66, 0x02, 0x02, 0xd1,
10151         0xeb, 0x2a, 0x67, 0x1a, 0xfe, 0x67, 0x1b, 0xf8, 0xf7, 0xfe, 0x48, 0x1c,
10152         0x70, 0x01, 0x6e, 0x87, 0x0a, 0x40, 0x01, 0x0e, 0x07, 0x00, 0x16, 0xd3,
10153         0x0a, 0xca, 0x01, 0x0e, 0x74, 0x60, 0x59, 0x76, 0x27, 0x05, 0x6b, 0x28,
10154         0xfe, 0x10, 0x12, 0x14, 0x2c, 0x01, 0x33, 0x8f, 0xfe, 0x66, 0x02, 0x02,
10155         0xd1, 0xbc, 0x7d, 0xbd, 0x7f, 0x25, 0x22, 0x65, 0xfe, 0x3c, 0x04, 0x1f,
10156         0xfe, 0x38, 0x04, 0x68, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
10157         0x12, 0x2b, 0xff, 0x02, 0x00, 0x10, 0x01, 0x08, 0x1f, 0xfe, 0xe0, 0x04,
10158         0x2b, 0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd5, 0xfe, 0x4c, 0x44, 0xfe,
10159         0x4c, 0x12, 0x60, 0xfe, 0x44, 0x48, 0x13, 0x2c, 0xfe, 0x4c, 0x54, 0x64,
10160         0xd3, 0x46, 0x76, 0x27, 0xfa, 0xef, 0xfe, 0x62, 0x13, 0x09, 0x04, 0x1d,
10161         0xfe, 0x2a, 0x13, 0x2f, 0x07, 0x7e, 0xa5, 0xfe, 0x20, 0x10, 0x13, 0x2c,
10162         0xfe, 0x4c, 0x54, 0x64, 0xd3, 0xfa, 0xef, 0x86, 0x09, 0x04, 0x1d, 0xfe,
10163         0x08, 0x13, 0x2f, 0x07, 0x7e, 0x6e, 0x09, 0x04, 0x1d, 0xfe, 0x1c, 0x12,
10164         0x14, 0x92, 0x09, 0x04, 0x06, 0x3b, 0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe,
10165         0x70, 0x0c, 0x02, 0x22, 0x2b, 0x11, 0xfe, 0xe6, 0x00, 0xfe, 0x1c, 0x90,
10166         0xf9, 0x03, 0x14, 0x92, 0x01, 0x33, 0x02, 0x29, 0xfe, 0x42, 0x5b, 0x67,
10167         0x1a, 0xfe, 0x46, 0x59, 0xf8, 0xf7, 0xfe, 0x87, 0x80, 0xfe, 0x31, 0xe4,
10168         0x4f, 0x09, 0x04, 0x0b, 0xfe, 0x78, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x1a,
10169         0xfe, 0x70, 0x12, 0x49, 0x04, 0x06, 0xfe, 0x60, 0x13, 0x05, 0xfe, 0xa2,
10170         0x00, 0x28, 0x16, 0xfe, 0x80, 0x05, 0xfe, 0x31, 0xe4, 0x6a, 0x49, 0x04,
10171         0x0b, 0xfe, 0x4a, 0x13, 0x05, 0xfe, 0xa0, 0x00, 0x28, 0xfe, 0x42, 0x12,
10172         0x5e, 0x01, 0x08, 0x25, 0x32, 0xf1, 0x01, 0x08, 0x26, 0xfe, 0x98, 0x05,
10173         0x11, 0xfe, 0xe3, 0x00, 0x23, 0x49, 0xfe, 0x4a, 0xf0, 0xfe, 0x6a, 0x05,
10174         0xfe, 0x49, 0xf0, 0xfe, 0x64, 0x05, 0x83, 0x24, 0xfe, 0x21, 0x00, 0xa1,
10175         0x24, 0xfe, 0x22, 0x00, 0xa0, 0x24, 0x4c, 0xfe, 0x09, 0x48, 0x01, 0x08,
10176         0x26, 0xfe, 0x98, 0x05, 0xfe, 0xe2, 0x08, 0x49, 0x04, 0xc5, 0x3b, 0x01,
10177         0x86, 0x24, 0x06, 0x12, 0xcc, 0x37, 0xfe, 0x27, 0x01, 0x09, 0x04, 0x1d,
10178         0xfe, 0x22, 0x12, 0x47, 0x01, 0xa7, 0x14, 0x92, 0x09, 0x04, 0x06, 0x3b,
10179         0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe, 0x70, 0x0c, 0x02, 0x22, 0x05, 0xfe,
10180         0x9c, 0x00, 0x28, 0xfe, 0x3e, 0x12, 0x05, 0x50, 0x28, 0xfe, 0x36, 0x13,
10181         0x47, 0x01, 0xa7, 0x26, 0xfe, 0x08, 0x06, 0x0a, 0x06, 0x49, 0x04, 0x19,
10182         0xfe, 0x02, 0x12, 0x5f, 0x01, 0xfe, 0xaa, 0x14, 0x1f, 0xfe, 0xfe, 0x05,
10183         0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x50, 0xb4, 0x0c,
10184         0x50, 0x05, 0xc6, 0x28, 0xfe, 0x62, 0x12, 0x05, 0x3f, 0x28, 0xfe, 0x5a,
10185         0x13, 0x01, 0xfe, 0x14, 0x18, 0x01, 0xfe, 0x66, 0x18, 0xfe, 0x43, 0x48,
10186         0xb7, 0x19, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0x1c, 0x3d,
10187         0x85, 0xb7, 0x69, 0x47, 0x01, 0xa7, 0x26, 0xfe, 0x72, 0x06, 0x49, 0x04,
10188         0x1b, 0xdf, 0x89, 0x0a, 0x4d, 0x01, 0xfe, 0xd8, 0x14, 0x1f, 0xfe, 0x68,
10189         0x06, 0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x3f, 0xb4,
10190         0x0c, 0x3f, 0x17, 0x06, 0x01, 0xa7, 0xec, 0x72, 0x70, 0x01, 0x6e, 0x87,
10191         0x11, 0xfe, 0xe2, 0x00, 0x01, 0x08, 0x25, 0x32, 0xfe, 0x0a, 0xf0, 0xfe,
10192         0xa6, 0x06, 0x8c, 0xfe, 0x5c, 0x07, 0xfe, 0x06, 0xf0, 0xfe, 0x64, 0x07,
10193         0x8d, 0x81, 0x02, 0x22, 0x09, 0x04, 0x0b, 0xfe, 0x2e, 0x12, 0x15, 0x1a,
10194         0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00,
10195         0x01, 0x08, 0xfe, 0x99, 0xa4, 0x01, 0x08, 0x15, 0x00, 0x02, 0xfe, 0x32,
10196         0x08, 0x61, 0x04, 0x1b, 0xfe, 0x38, 0x12, 0x09, 0x04, 0x1b, 0x6e, 0x15,
10197         0xfe, 0x1b, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01,
10198         0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x06, 0x01, 0x08, 0x15, 0x00, 0x02,
10199         0xd9, 0x66, 0x4c, 0xfe, 0x3a, 0x55, 0x5f, 0xfe, 0x9a, 0x81, 0x4b, 0x1d,
10200         0xba, 0xfe, 0x32, 0x07, 0x0a, 0x1d, 0xfe, 0x09, 0x6f, 0xaf, 0xfe, 0xca,
10201         0x45, 0xfe, 0x32, 0x12, 0x62, 0x2c, 0x85, 0x66, 0x7b, 0x01, 0x08, 0x25,
10202         0x32, 0xfe, 0x0a, 0xf0, 0xfe, 0x32, 0x07, 0x8d, 0x81, 0x8c, 0xfe, 0x5c,
10203         0x07, 0x02, 0x22, 0x01, 0x43, 0x02, 0xfe, 0x8a, 0x06, 0x15, 0x19, 0x02,
10204         0xfe, 0x8a, 0x06, 0xfe, 0x9c, 0xf7, 0xd4, 0xfe, 0x2c, 0x90, 0xfe, 0xae,
10205         0x90, 0x77, 0xfe, 0xca, 0x07, 0x0c, 0x54, 0x18, 0x55, 0x09, 0x4a, 0x6a,
10206         0x35, 0x1e, 0x20, 0x07, 0x10, 0xfe, 0x0e, 0x12, 0x74, 0xfe, 0x80, 0x80,
10207         0x37, 0x20, 0x63, 0x27, 0xfe, 0x06, 0x10, 0xfe, 0x83, 0xe7, 0xc4, 0xa1,
10208         0xfe, 0x03, 0x40, 0x09, 0x4a, 0x4f, 0x35, 0x01, 0xa8, 0xad, 0xfe, 0x1f,
10209         0x40, 0x12, 0x58, 0x01, 0xa5, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe,
10210         0x44, 0x51, 0xfe, 0xc6, 0x51, 0x83, 0xfb, 0xfe, 0x8a, 0x90, 0x0c, 0x52,
10211         0x18, 0x53, 0xfe, 0x0c, 0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe,
10212         0xc2, 0x50, 0x0c, 0x39, 0x18, 0x3a, 0xfe, 0x4a, 0x10, 0x09, 0x04, 0x6a,
10213         0xfe, 0x2a, 0x12, 0xfe, 0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x54, 0x18,
10214         0x55, 0x09, 0x04, 0x4f, 0x85, 0x01, 0xa8, 0xfe, 0x1f, 0x80, 0x12, 0x58,
10215         0xfe, 0x44, 0x90, 0xfe, 0xc6, 0x90, 0x0c, 0x56, 0x18, 0x57, 0xfb, 0xfe,
10216         0x8a, 0x90, 0x0c, 0x52, 0x18, 0x53, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90,
10217         0x0c, 0x39, 0x18, 0x3a, 0x0c, 0x38, 0x18, 0x4e, 0x09, 0x4a, 0x19, 0x35,
10218         0x2a, 0x13, 0xfe, 0x4e, 0x11, 0x65, 0xfe, 0x48, 0x08, 0xfe, 0x9e, 0xf0,
10219         0xfe, 0x5c, 0x08, 0xb1, 0x16, 0x32, 0x2a, 0x73, 0xdd, 0xb8, 0xfe, 0x80,
10220         0x08, 0xb9, 0xfe, 0x9e, 0x08, 0x8c, 0xfe, 0x74, 0x08, 0xfe, 0x06, 0xf0,
10221         0xfe, 0x7a, 0x08, 0x8d, 0x81, 0x02, 0x22, 0x01, 0x43, 0xfe, 0xc9, 0x10,
10222         0x15, 0x19, 0xfe, 0xc9, 0x10, 0x61, 0x04, 0x06, 0xfe, 0x10, 0x12, 0x61,
10223         0x04, 0x0b, 0x45, 0x09, 0x04, 0x0b, 0xfe, 0x68, 0x12, 0xfe, 0x2e, 0x1c,
10224         0x02, 0xfe, 0x24, 0x0a, 0x61, 0x04, 0x06, 0x45, 0x61, 0x04, 0x0b, 0xfe,
10225         0x52, 0x12, 0xfe, 0x2c, 0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0x1e, 0x09, 0xfe,
10226         0xac, 0xf0, 0xfe, 0xbe, 0x08, 0xfe, 0x8a, 0x10, 0xaa, 0xfe, 0xf3, 0x10,
10227         0xfe, 0xad, 0xf0, 0xfe, 0xca, 0x08, 0x02, 0xfe, 0x24, 0x0a, 0xab, 0xfe,
10228         0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0x9d, 0xe9, 0x1c, 0xfe, 0x00, 0xfe, 0xfe,
10229         0x1c, 0x12, 0xb5, 0xfe, 0xd2, 0xf0, 0x9d, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
10230         0x16, 0x9d, 0x05, 0xcb, 0x1c, 0x06, 0x16, 0x9d, 0xb8, 0x6d, 0xb9, 0x6d,
10231         0xaa, 0xab, 0xfe, 0xb1, 0x10, 0x70, 0x5e, 0x2b, 0x14, 0x92, 0x01, 0x33,
10232         0x0f, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x5a, 0x0f, 0x7c, 0x02, 0x5a,
10233         0xfe, 0x74, 0x18, 0x1c, 0xfe, 0x00, 0xf8, 0x16, 0x6d, 0x67, 0x1b, 0x01,
10234         0xfe, 0x44, 0x0d, 0x3b, 0x01, 0xe6, 0x1e, 0x27, 0x74, 0x67, 0x1a, 0x02,
10235         0x6d, 0x09, 0x04, 0x0b, 0x21, 0xfe, 0x06, 0x0a, 0x09, 0x04, 0x6a, 0xfe,
10236         0x82, 0x12, 0x09, 0x04, 0x19, 0xfe, 0x66, 0x13, 0x1e, 0x58, 0xac, 0xfc,
10237         0xfe, 0x83, 0x80, 0xfe, 0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91,
10238         0xfe, 0x86, 0x91, 0x63, 0x27, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x77,
10239         0xd7, 0x05, 0x54, 0x31, 0x55, 0x0c, 0x7b, 0x18, 0x7c, 0xbe, 0x54, 0xbf,
10240         0x55, 0x01, 0xa8, 0xad, 0x63, 0x27, 0x12, 0x58, 0xc0, 0x38, 0xc1, 0x4e,
10241         0x79, 0x56, 0x68, 0x57, 0xf4, 0xf5, 0xfe, 0x04, 0xfa, 0x38, 0xfe, 0x05,
10242         0xfa, 0x4e, 0x01, 0xa5, 0xa2, 0x23, 0x0c, 0x7b, 0x0c, 0x7c, 0x79, 0x56,
10243         0x68, 0x57, 0xfe, 0x12, 0x10, 0x09, 0x04, 0x19, 0x16, 0xd7, 0x79, 0x39,
10244         0x68, 0x3a, 0x09, 0x04, 0xfe, 0xf7, 0x00, 0x35, 0x05, 0x52, 0x31, 0x53,
10245         0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59,
10246         0x02, 0x6d, 0x09, 0x04, 0x19, 0x16, 0xd7, 0x09, 0x04, 0xfe, 0xf7, 0x00,
10247         0x35, 0xfe, 0x3a, 0x55, 0xfe, 0x19, 0x81, 0x5f, 0xfe, 0x10, 0x90, 0xfe,
10248         0x92, 0x90, 0xfe, 0xd7, 0x10, 0x2f, 0x07, 0x9b, 0x16, 0xfe, 0xc6, 0x08,
10249         0x11, 0x9b, 0x09, 0x04, 0x0b, 0xfe, 0x14, 0x13, 0x05, 0x39, 0x31, 0x3a,
10250         0x77, 0xfe, 0xc6, 0x08, 0xfe, 0x0c, 0x58, 0xfe, 0x8d, 0x58, 0x02, 0x6d,
10251         0x23, 0x47, 0xfe, 0x19, 0x80, 0xde, 0x09, 0x04, 0x0b, 0xfe, 0x1a, 0x12,
10252         0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41, 0xe9, 0xb5, 0xfe, 0xd1, 0xf0, 0xd9,
10253         0x14, 0x7a, 0x01, 0x33, 0x0f, 0xfe, 0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe,
10254         0x6c, 0x19, 0xbe, 0x39, 0xfe, 0xed, 0x19, 0xbf, 0x3a, 0xfe, 0x0c, 0x51,
10255         0xfe, 0x8e, 0x51, 0xe9, 0x1c, 0xfe, 0x00, 0xff, 0x34, 0xfe, 0x74, 0x10,
10256         0xb5, 0xfe, 0xd2, 0xf0, 0xfe, 0xb2, 0x0a, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
10257         0x84, 0x05, 0xcb, 0x1c, 0x06, 0xfe, 0x08, 0x13, 0x0f, 0xfe, 0x16, 0x00,
10258         0x02, 0x5a, 0xfe, 0xd1, 0xf0, 0xfe, 0xc4, 0x0a, 0x14, 0x7a, 0x01, 0x33,
10259         0x0f, 0xfe, 0x17, 0x00, 0xfe, 0x42, 0x10, 0xfe, 0xce, 0xf0, 0xfe, 0xca,
10260         0x0a, 0xfe, 0x3c, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xd6, 0x0a, 0x0f, 0xfe,
10261         0x22, 0x00, 0x02, 0x5a, 0xfe, 0xcb, 0xf0, 0xfe, 0xe2, 0x0a, 0x0f, 0xfe,
10262         0x24, 0x00, 0x02, 0x5a, 0xfe, 0xd0, 0xf0, 0xfe, 0xec, 0x0a, 0x0f, 0x93,
10263         0xdc, 0xfe, 0xcf, 0xf0, 0xfe, 0xf6, 0x0a, 0x0f, 0x4c, 0xfe, 0x10, 0x10,
10264         0xfe, 0xcc, 0xf0, 0xd9, 0x61, 0x04, 0x19, 0x3b, 0x0f, 0xfe, 0x12, 0x00,
10265         0x2a, 0x13, 0xfe, 0x4e, 0x11, 0x65, 0xfe, 0x0c, 0x0b, 0xfe, 0x9e, 0xf0,
10266         0xfe, 0x20, 0x0b, 0xb1, 0x16, 0x32, 0x2a, 0x73, 0xdd, 0xb8, 0x22, 0xb9,
10267         0x22, 0x2a, 0xec, 0x65, 0xfe, 0x2c, 0x0b, 0x25, 0x32, 0x8c, 0xfe, 0x48,
10268         0x0b, 0x8d, 0x81, 0xb8, 0xd4, 0xb9, 0xd4, 0x02, 0x22, 0x01, 0x43, 0xfe,
10269         0xdb, 0x10, 0x11, 0xfe, 0xe8, 0x00, 0xaa, 0xab, 0x70, 0xbc, 0x7d, 0xbd,
10270         0x7f, 0xfe, 0x89, 0xf0, 0x22, 0x30, 0x2e, 0xd8, 0xbc, 0x7d, 0xbd, 0x7f,
10271         0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd6, 0xb1, 0x45, 0x0f, 0xfe, 0x42,
10272         0x00, 0x02, 0x5a, 0x78, 0x06, 0xfe, 0x81, 0x49, 0x16, 0xfe, 0x38, 0x0c,
10273         0x09, 0x04, 0x0b, 0xfe, 0x44, 0x13, 0x0f, 0x00, 0x4b, 0x0b, 0xfe, 0x54,
10274         0x12, 0x4b, 0xfe, 0x28, 0x00, 0x21, 0xfe, 0xa6, 0x0c, 0x0a, 0x40, 0x01,
10275         0x0e, 0x07, 0x00, 0x5d, 0x3e, 0xfe, 0x28, 0x00, 0xfe, 0xe2, 0x10, 0x01,
10276         0xe7, 0x01, 0xe8, 0x0a, 0x99, 0x01, 0xfe, 0x32, 0x0e, 0x59, 0x11, 0x2d,
10277         0x01, 0x6f, 0x02, 0x29, 0x0f, 0xfe, 0x44, 0x00, 0x4b, 0x0b, 0xdf, 0x3e,
10278         0x0b, 0xfe, 0xb4, 0x10, 0x01, 0x86, 0x3e, 0x0b, 0xfe, 0xaa, 0x10, 0x01,
10279         0x86, 0xfe, 0x19, 0x82, 0xfe, 0x34, 0x46, 0xa3, 0x3e, 0x0b, 0x0f, 0xfe,
10280         0x43, 0x00, 0xfe, 0x96, 0x10, 0x09, 0x4a, 0x0b, 0x35, 0x01, 0xe7, 0x01,
10281         0xe8, 0x59, 0x11, 0x2d, 0x01, 0x6f, 0x67, 0x0b, 0x59, 0x3c, 0x8a, 0x02,
10282         0xfe, 0x2a, 0x03, 0x09, 0x04, 0x0b, 0x84, 0x3e, 0x0b, 0x0f, 0x00, 0xfe,
10283         0x5c, 0x10, 0x61, 0x04, 0x1b, 0xfe, 0x58, 0x12, 0x09, 0x04, 0x1b, 0xfe,
10284         0x50, 0x13, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x5c, 0x0c, 0xfe,
10285         0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x62, 0x0c, 0x09, 0x4a, 0x1b, 0x35,
10286         0xfe, 0xa9, 0x10, 0x0f, 0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0b, 0x5f,
10287         0x5c, 0x0f, 0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x0f, 0xfe, 0x47, 0x00,
10288         0xa1, 0x0f, 0xfe, 0x41, 0x00, 0xa0, 0x0f, 0xfe, 0x24, 0x00, 0x87, 0xaa,
10289         0xab, 0x70, 0x05, 0x6b, 0x28, 0x21, 0xd1, 0x5f, 0xfe, 0x04, 0xe6, 0x1b,
10290         0xfe, 0x9d, 0x41, 0xfe, 0x1c, 0x42, 0x59, 0x01, 0xda, 0x02, 0x29, 0xea,
10291         0x14, 0x0b, 0x37, 0x95, 0xa9, 0x14, 0xfe, 0x31, 0x00, 0x37, 0x97, 0x01,
10292         0xfe, 0x54, 0x0f, 0x02, 0xd0, 0x3c, 0xfe, 0x06, 0xec, 0xc9, 0xee, 0x3e,
10293         0x1d, 0xfe, 0xce, 0x45, 0x34, 0x3c, 0xfe, 0x06, 0xea, 0xc9, 0xfe, 0x47,
10294         0x4b, 0x89, 0xfe, 0x75, 0x57, 0x05, 0x51, 0xfe, 0x98, 0x56, 0xfe, 0x38,
10295         0x12, 0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x44, 0x48, 0x46, 0x09, 0x04, 0x1d,
10296         0xfe, 0x1a, 0x13, 0x0a, 0x40, 0x01, 0x0e, 0x47, 0xfe, 0x41, 0x58, 0x0a,
10297         0x99, 0x01, 0x0e, 0xfe, 0x49, 0x54, 0x8e, 0xfe, 0x2a, 0x0d, 0x02, 0xfe,
10298         0x2a, 0x03, 0x0a, 0x51, 0xfe, 0xee, 0x14, 0xee, 0x3e, 0x1d, 0xfe, 0xce,
10299         0x45, 0x34, 0x3c, 0xfe, 0xce, 0x47, 0xfe, 0xad, 0x13, 0x02, 0x29, 0x1e,
10300         0x20, 0x07, 0x10, 0xfe, 0x9e, 0x12, 0x23, 0x12, 0x4d, 0x12, 0x94, 0x12,
10301         0xce, 0x1e, 0x2d, 0x47, 0x37, 0x2d, 0xb1, 0xe0, 0xfe, 0xbc, 0xf0, 0xfe,
10302         0xec, 0x0d, 0x13, 0x06, 0x12, 0x4d, 0x01, 0xfe, 0xe2, 0x15, 0x05, 0xfe,
10303         0x38, 0x01, 0x31, 0xfe, 0x3a, 0x01, 0x77, 0xfe, 0xf0, 0x0d, 0xfe, 0x02,
10304         0xec, 0xce, 0x62, 0x00, 0x5d, 0xfe, 0x04, 0xec, 0x20, 0x46, 0xfe, 0x05,
10305         0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x52, 0x16, 0xfb, 0xfe, 0x48, 0xf4,
10306         0x0d, 0xfe, 0x18, 0x13, 0xaf, 0xfe, 0x02, 0xea, 0xce, 0x62, 0x7a, 0xfe,
10307         0xc5, 0x13, 0x14, 0x1b, 0x37, 0x95, 0xa9, 0x5c, 0x05, 0xfe, 0x38, 0x01,
10308         0x1c, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x05, 0xfe, 0x3a, 0x01,
10309         0x0c, 0xfe, 0x62, 0x01, 0x3d, 0x12, 0x20, 0x24, 0x06, 0x12, 0x2d, 0x11,
10310         0x2d, 0x8a, 0x13, 0x06, 0x03, 0x23, 0x03, 0x1e, 0x4d, 0xfe, 0xf7, 0x12,
10311         0x1e, 0x94, 0xac, 0x12, 0x94, 0x07, 0x7a, 0xfe, 0x71, 0x13, 0xfe, 0x24,
10312         0x1c, 0x14, 0x1a, 0x37, 0x95, 0xa9, 0xfe, 0xd9, 0x10, 0xb6, 0xfe, 0x03,
10313         0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x03, 0xb6, 0xfe, 0x03, 0xdc,
10314         0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x03, 0xfe, 0x03, 0x57, 0xb6, 0x23,
10315         0xfe, 0x00, 0xcc, 0x03, 0xfe, 0x03, 0x57, 0xb6, 0x75, 0x03, 0x09, 0x04,
10316         0x4c, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
10317         0xfe, 0x1e, 0x80, 0xe1, 0xfe, 0x1d, 0x80, 0xa4, 0xfe, 0x0c, 0x90, 0xfe,
10318         0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xa3, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
10319         0x0b, 0xfe, 0x3c, 0x50, 0xa0, 0x01, 0xfe, 0x82, 0x16, 0x2f, 0x07, 0x2d,
10320         0xe0, 0x01, 0xfe, 0xbc, 0x15, 0x09, 0x04, 0x1d, 0x45, 0x01, 0xe7, 0x01,
10321         0xe8, 0x11, 0xfe, 0xe9, 0x00, 0x09, 0x04, 0x4c, 0xfe, 0x2c, 0x13, 0x01,
10322         0xfe, 0x14, 0x16, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
10323         0x0c, 0xfe, 0x64, 0x01, 0x18, 0xfe, 0x66, 0x01, 0x09, 0x04, 0x4f, 0xfe,
10324         0x12, 0x12, 0xfe, 0x03, 0x80, 0x74, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
10325         0x40, 0x12, 0x20, 0x63, 0x27, 0x11, 0xc8, 0x59, 0x1e, 0x20, 0xed, 0x76,
10326         0x20, 0x03, 0xfe, 0x08, 0x1c, 0x05, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
10327         0x05, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x05, 0xfe, 0xb0, 0x00, 0xfe,
10328         0x08, 0x58, 0x05, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
10329         0x24, 0x69, 0x12, 0xc9, 0x23, 0x0c, 0x50, 0x0c, 0x3f, 0x13, 0x40, 0x48,
10330         0x5f, 0x17, 0x1d, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x21, 0xfe, 0x08,
10331         0x0f, 0x3e, 0x10, 0x13, 0x42, 0x48, 0x17, 0x4c, 0xfe, 0x90, 0x4d, 0xfe,
10332         0x91, 0x54, 0x21, 0xfe, 0x1e, 0x0f, 0x24, 0x10, 0x12, 0x20, 0x78, 0x2c,
10333         0x46, 0x1e, 0x20, 0xed, 0x76, 0x20, 0x11, 0xc8, 0xf6, 0xfe, 0xd6, 0xf0,
10334         0xfe, 0x32, 0x0f, 0xea, 0x70, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
10335         0x18, 0x1c, 0x03, 0x3c, 0xfe, 0x0c, 0x14, 0xee, 0xfe, 0x07, 0xe6, 0x1d,
10336         0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x03, 0x01, 0x86, 0x78, 0x2c, 0x46,
10337         0xfa, 0xef, 0xfe, 0x42, 0x13, 0x2f, 0x07, 0x2d, 0xfe, 0x34, 0x13, 0x0a,
10338         0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x36, 0x12, 0xf0, 0xfe, 0x45, 0x48, 0x01,
10339         0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13, 0x3d, 0x75, 0x07, 0x10,
10340         0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xfe, 0x80, 0x5c, 0x01, 0x6f, 0xfe, 0x0e,
10341         0x10, 0x07, 0x7e, 0x45, 0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x6c, 0x0f, 0x03,
10342         0xfe, 0x44, 0x58, 0x74, 0xfe, 0x01, 0xec, 0x97, 0xfe, 0x9e, 0x40, 0xfe,
10343         0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x1b, 0x76, 0x27, 0x01, 0xda, 0xfe,
10344         0xdd, 0x10, 0x2a, 0xbc, 0x7d, 0xbd, 0x7f, 0x30, 0x2e, 0xd5, 0x07, 0x1b,
10345         0xfe, 0x48, 0x12, 0x07, 0x0b, 0xfe, 0x56, 0x12, 0x07, 0x1a, 0xfe, 0x30,
10346         0x12, 0x07, 0xc2, 0x16, 0xfe, 0x3e, 0x11, 0x07, 0xfe, 0x23, 0x00, 0x16,
10347         0xfe, 0x4a, 0x11, 0x07, 0x06, 0x16, 0xfe, 0xa8, 0x11, 0x07, 0x19, 0xfe,
10348         0x12, 0x12, 0x07, 0x00, 0x16, 0x22, 0x14, 0xc2, 0x01, 0x33, 0x9f, 0x2b,
10349         0x01, 0x08, 0x8c, 0x43, 0x03, 0x2b, 0xfe, 0x62, 0x08, 0x0a, 0xca, 0x01,
10350         0xfe, 0x32, 0x0e, 0x11, 0x7e, 0x02, 0x29, 0x2b, 0x2f, 0x07, 0x9b, 0xfe,
10351         0xd9, 0x13, 0x79, 0x39, 0x68, 0x3a, 0x77, 0xfe, 0xfc, 0x10, 0x09, 0x04,
10352         0x6a, 0xfe, 0x72, 0x12, 0xc0, 0x38, 0xc1, 0x4e, 0xf4, 0xf5, 0x8e, 0xfe,
10353         0xc6, 0x10, 0x1e, 0x58, 0xfe, 0x26, 0x13, 0x05, 0x7b, 0x31, 0x7c, 0x77,
10354         0xfe, 0x82, 0x0c, 0x0c, 0x54, 0x18, 0x55, 0x23, 0x0c, 0x7b, 0x0c, 0x7c,
10355         0x01, 0xa8, 0x24, 0x69, 0x73, 0x12, 0x58, 0x01, 0xa5, 0xc0, 0x38, 0xc1,
10356         0x4e, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x38, 0xfe,
10357         0x05, 0xfa, 0x4e, 0xfe, 0x91, 0x10, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x40,
10358         0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x56, 0x18, 0x57, 0x83, 0xc0, 0x38, 0xc1,
10359         0x4e, 0xf4, 0xf5, 0x05, 0x52, 0x31, 0x53, 0xfe, 0x00, 0x56, 0xfe, 0xa1,
10360         0x56, 0x0c, 0x52, 0x18, 0x53, 0x09, 0x04, 0x6a, 0xfe, 0x1e, 0x12, 0x1e,
10361         0x58, 0xfe, 0x1f, 0x40, 0x05, 0x54, 0x31, 0x55, 0xfe, 0x2c, 0x50, 0xfe,
10362         0xae, 0x50, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x44, 0x50, 0xfe, 0xc6, 0x50,
10363         0x05, 0x52, 0x31, 0x53, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x05, 0x39,
10364         0x31, 0x3a, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x02, 0x5c, 0x24, 0x06,
10365         0x12, 0xcd, 0x02, 0x5b, 0x2b, 0x01, 0x08, 0x1f, 0x44, 0x30, 0x2e, 0xd5,
10366         0x07, 0x06, 0x21, 0x44, 0x2f, 0x07, 0x9b, 0x21, 0x5b, 0x01, 0x6e, 0x1c,
10367         0x3d, 0x16, 0x44, 0x09, 0x04, 0x0b, 0xe2, 0x79, 0x39, 0x68, 0x3a, 0xfe,
10368         0x0a, 0x55, 0x34, 0xfe, 0x8b, 0x55, 0xbe, 0x39, 0xbf, 0x3a, 0xfe, 0x0c,
10369         0x51, 0xfe, 0x8e, 0x51, 0x02, 0x5b, 0xfe, 0x19, 0x81, 0xaf, 0xfe, 0x19,
10370         0x41, 0x02, 0x5b, 0x2b, 0x01, 0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e,
10371         0xd8, 0x4b, 0x1a, 0xfe, 0xa6, 0x12, 0x4b, 0x0b, 0x3b, 0x02, 0x44, 0x01,
10372         0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e, 0xd6, 0x07, 0x1a, 0x21, 0x44,
10373         0x01, 0x08, 0x1f, 0xa2, 0x30, 0x2e, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49,
10374         0x60, 0x05, 0xfe, 0x9c, 0x00, 0x28, 0x84, 0x49, 0x04, 0x19, 0x34, 0x9f,
10375         0xfe, 0xbb, 0x45, 0x4b, 0x00, 0x45, 0x3e, 0x06, 0x78, 0x3d, 0xfe, 0xda,
10376         0x14, 0x01, 0x6e, 0x87, 0xfe, 0x4b, 0x45, 0xe2, 0x2f, 0x07, 0x9a, 0xe1,
10377         0x05, 0xc6, 0x28, 0x84, 0x05, 0x3f, 0x28, 0x34, 0x5e, 0x02, 0x5b, 0xfe,
10378         0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17, 0x05, 0x50, 0xb4, 0x0c,
10379         0x50, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe, 0xaa, 0x14, 0x02,
10380         0x5c, 0x01, 0x08, 0x25, 0x32, 0x1f, 0x44, 0x30, 0x2e, 0xd6, 0x07, 0x06,
10381         0x21, 0x44, 0x01, 0xfe, 0x8e, 0x13, 0xfe, 0x42, 0x58, 0xfe, 0x82, 0x14,
10382         0xfe, 0xa4, 0x14, 0x87, 0xfe, 0x4a, 0xf4, 0x0b, 0x16, 0x44, 0xfe, 0x4a,
10383         0xf4, 0x06, 0xfe, 0x0c, 0x12, 0x2f, 0x07, 0x9a, 0x85, 0x02, 0x5b, 0x05,
10384         0x3f, 0xb4, 0x0c, 0x3f, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe,
10385         0xd8, 0x14, 0x02, 0x5c, 0x13, 0x06, 0x65, 0xfe, 0xca, 0x12, 0x26, 0xfe,
10386         0xe0, 0x12, 0x72, 0xf1, 0x01, 0x08, 0x23, 0x72, 0x03, 0x8f, 0xfe, 0xdc,
10387         0x12, 0x25, 0xfe, 0xdc, 0x12, 0x1f, 0xfe, 0xca, 0x12, 0x5e, 0x2b, 0x01,
10388         0x08, 0xfe, 0xd5, 0x10, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
10389         0x1c, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x03, 0x13,
10390         0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0x1c, 0x3d, 0xfe, 0x30, 0x56,
10391         0xfe, 0x00, 0x5c, 0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
10392         0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0xfe, 0x0b, 0x58,
10393         0x03, 0x0a, 0x50, 0x01, 0x82, 0x0a, 0x3f, 0x01, 0x82, 0x03, 0xfc, 0x1c,
10394         0x10, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x19, 0x48, 0xfe, 0x00,
10395         0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c, 0x63, 0x27,
10396         0x0c, 0x52, 0x18, 0x53, 0xbe, 0x56, 0xbf, 0x57, 0x03, 0xfe, 0x62, 0x08,
10397         0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x74, 0x03, 0x01,
10398         0xfe, 0x14, 0x18, 0xfe, 0x42, 0x48, 0x5f, 0x60, 0x89, 0x01, 0x08, 0x1f,
10399         0xfe, 0xa2, 0x14, 0x30, 0x2e, 0xd8, 0x01, 0x08, 0x1f, 0xfe, 0xa2, 0x14,
10400         0x30, 0x2e, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x05, 0xc6, 0x28, 0xfe,
10401         0xcc, 0x12, 0x49, 0x04, 0x1b, 0xfe, 0xc4, 0x13, 0x23, 0x62, 0x1b, 0xe2,
10402         0x4b, 0xc3, 0x64, 0xfe, 0xe8, 0x13, 0x3b, 0x13, 0x06, 0x17, 0xc3, 0x78,
10403         0xdb, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xa1, 0xff, 0x02, 0x83,
10404         0x55, 0x62, 0x1a, 0xa4, 0xbb, 0xfe, 0x30, 0x00, 0x8e, 0xe4, 0x17, 0x2c,
10405         0x13, 0x06, 0xfe, 0x56, 0x10, 0x62, 0x0b, 0xe1, 0xbb, 0xfe, 0x64, 0x00,
10406         0x8e, 0xe4, 0x0a, 0xfe, 0x64, 0x00, 0x17, 0x93, 0x13, 0x06, 0xfe, 0x28,
10407         0x10, 0x62, 0x06, 0xfe, 0x60, 0x13, 0xbb, 0xfe, 0xc8, 0x00, 0x8e, 0xe4,
10408         0x0a, 0xfe, 0xc8, 0x00, 0x17, 0x4d, 0x13, 0x06, 0x83, 0xbb, 0xfe, 0x90,
10409         0x01, 0xba, 0xfe, 0x4e, 0x14, 0x89, 0xfe, 0x12, 0x10, 0xfe, 0x43, 0xf4,
10410         0x94, 0xfe, 0x56, 0xf0, 0xfe, 0x60, 0x14, 0xfe, 0x04, 0xf4, 0x6c, 0xfe,
10411         0x43, 0xf4, 0x93, 0xfe, 0xf3, 0x10, 0xf9, 0x01, 0xfe, 0x22, 0x13, 0x1c,
10412         0x3d, 0xfe, 0x10, 0x13, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x69, 0xba,
10413         0xfe, 0x9c, 0x14, 0xb7, 0x69, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe,
10414         0x4d, 0xe4, 0x19, 0xba, 0xfe, 0x9c, 0x14, 0xb7, 0x19, 0x83, 0x60, 0x23,
10415         0xfe, 0x4d, 0xf4, 0x00, 0xdf, 0x89, 0x13, 0x06, 0xfe, 0xb4, 0x56, 0xfe,
10416         0xc3, 0x58, 0x03, 0x60, 0x13, 0x0b, 0x03, 0x15, 0x06, 0x01, 0x08, 0x26,
10417         0xe5, 0x15, 0x0b, 0x01, 0x08, 0x26, 0xe5, 0x15, 0x1a, 0x01, 0x08, 0x26,
10418         0xe5, 0x72, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x03, 0x15, 0x06, 0x01, 0x08,
10419         0x26, 0xa6, 0x15, 0x1a, 0x01, 0x08, 0x26, 0xa6, 0x15, 0x06, 0x01, 0x08,
10420         0x26, 0xa6, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x26, 0xa6, 0x72, 0xfe, 0x89,
10421         0x4a, 0x01, 0x08, 0x03, 0x60, 0x03, 0x1e, 0xcc, 0x07, 0x06, 0xfe, 0x44,
10422         0x13, 0xad, 0x12, 0xcc, 0xfe, 0x49, 0xf4, 0x00, 0x3b, 0x72, 0x9f, 0x5e,
10423         0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xf1, 0x01, 0x08, 0x2f, 0x07, 0xfe,
10424         0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1f, 0xfe, 0x5a, 0x15, 0x23, 0x12, 0xcd,
10425         0x01, 0x43, 0x1e, 0xcd, 0x07, 0x06, 0x45, 0x09, 0x4a, 0x06, 0x35, 0x03,
10426         0x0a, 0x42, 0x01, 0x0e, 0xed, 0x88, 0x07, 0x10, 0xa4, 0x0a, 0x80, 0x01,
10427         0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03, 0x0a, 0x80, 0x01, 0x0e, 0x88,
10428         0xfe, 0x80, 0xe7, 0x10, 0x07, 0x10, 0x84, 0xfe, 0x45, 0x58, 0x01, 0xe3,
10429         0x88, 0x03, 0x0a, 0x42, 0x01, 0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03,
10430         0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x80, 0x80, 0xf2, 0xfe, 0x49, 0xe4, 0x10,
10431         0xa4, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x0a, 0x51, 0x01, 0x82, 0x03, 0x17,
10432         0x10, 0x71, 0x66, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde,
10433         0xfe, 0x24, 0x1c, 0xfe, 0x1d, 0xf7, 0x1d, 0x90, 0xfe, 0xf6, 0x15, 0x01,
10434         0xfe, 0xfc, 0x16, 0xe0, 0x91, 0x1d, 0x66, 0xfe, 0x2c, 0x01, 0xfe, 0x2f,
10435         0x19, 0x03, 0xae, 0x21, 0xfe, 0xe6, 0x15, 0xfe, 0xda, 0x10, 0x17, 0x10,
10436         0x71, 0x05, 0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x19, 0xfe, 0x18, 0x58,
10437         0x05, 0xfe, 0x66, 0x01, 0xfe, 0x19, 0x58, 0x91, 0x19, 0xfe, 0x3c, 0x90,
10438         0xfe, 0x30, 0xf4, 0x06, 0xfe, 0x3c, 0x50, 0x66, 0xfe, 0x38, 0x00, 0xfe,
10439         0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x19, 0x90, 0xfe, 0x40, 0x16, 0xfe, 0xb6,
10440         0x14, 0x34, 0x03, 0xae, 0x21, 0xfe, 0x18, 0x16, 0xfe, 0x9c, 0x10, 0x17,
10441         0x10, 0x71, 0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe,
10442         0x1d, 0xf7, 0x38, 0x90, 0xfe, 0x62, 0x16, 0xfe, 0x94, 0x14, 0xfe, 0x10,
10443         0x13, 0x91, 0x38, 0x66, 0x1b, 0xfe, 0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00,
10444         0x03, 0xae, 0x21, 0xfe, 0x56, 0x16, 0xfe, 0x6c, 0x10, 0x17, 0x10, 0x71,
10445         0xfe, 0x30, 0xbc, 0xfe, 0xb2, 0xbc, 0x91, 0xc5, 0x66, 0x1b, 0xfe, 0x0f,
10446         0x79, 0xfe, 0x1c, 0xf7, 0xc5, 0x90, 0xfe, 0x9a, 0x16, 0xfe, 0x5c, 0x14,
10447         0x34, 0x03, 0xae, 0x21, 0xfe, 0x86, 0x16, 0xfe, 0x42, 0x10, 0xfe, 0x02,
10448         0xf6, 0x10, 0x71, 0xfe, 0x18, 0xfe, 0x54, 0xfe, 0x19, 0xfe, 0x55, 0xfc,
10449         0xfe, 0x1d, 0xf7, 0x4f, 0x90, 0xfe, 0xc0, 0x16, 0xfe, 0x36, 0x14, 0xfe,
10450         0x1c, 0x13, 0x91, 0x4f, 0x47, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe,
10451         0x80, 0xe7, 0x10, 0xfe, 0x81, 0xe7, 0x10, 0x11, 0xfe, 0xdd, 0x00, 0x63,
10452         0x27, 0x03, 0x63, 0x27, 0xfe, 0x12, 0x45, 0x21, 0xfe, 0xb0, 0x16, 0x14,
10453         0x06, 0x37, 0x95, 0xa9, 0x02, 0x29, 0xfe, 0x39, 0xf0, 0xfe, 0x04, 0x17,
10454         0x23, 0x03, 0xfe, 0x7e, 0x18, 0x1c, 0x1a, 0x5d, 0x13, 0x0d, 0x03, 0x71,
10455         0x05, 0xcb, 0x1c, 0x06, 0xfe, 0xef, 0x12, 0xfe, 0xe1, 0x10, 0x78, 0x2c,
10456         0x46, 0x2f, 0x07, 0x2d, 0xfe, 0x3c, 0x13, 0xfe, 0x82, 0x14, 0xfe, 0x42,
10457         0x13, 0x3c, 0x8a, 0x0a, 0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x3e, 0x12, 0xf0,
10458         0xfe, 0x45, 0x48, 0x01, 0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13,
10459         0x3d, 0x75, 0x07, 0x10, 0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x01, 0x6f,
10460         0xfe, 0x16, 0x10, 0x07, 0x7e, 0x85, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12,
10461         0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x24, 0x17, 0x17, 0x0b, 0x03, 0xfe, 0x9c,
10462         0xe7, 0x0b, 0x0f, 0xfe, 0x15, 0x00, 0x59, 0x76, 0x27, 0x01, 0xda, 0x17,
10463         0x06, 0x03, 0x3c, 0x8a, 0x09, 0x4a, 0x1d, 0x35, 0x11, 0x2d, 0x01, 0x6f,
10464         0x17, 0x06, 0x03, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x79, 0xc7, 0x68,
10465         0xc8, 0xfe, 0x48, 0x55, 0x34, 0xfe, 0xc9, 0x55, 0x03, 0x1e, 0x98, 0x73,
10466         0x12, 0x98, 0x03, 0x0a, 0x99, 0x01, 0x0e, 0xf0, 0x0a, 0x40, 0x01, 0x0e,
10467         0xfe, 0x49, 0x44, 0x16, 0xfe, 0xf0, 0x17, 0x73, 0x75, 0x03, 0x0a, 0x42,
10468         0x01, 0x0e, 0x07, 0x10, 0x45, 0x0a, 0x51, 0x01, 0x9e, 0x0a, 0x40, 0x01,
10469         0x0e, 0x73, 0x75, 0x03, 0xfe, 0x4e, 0xe4, 0x1a, 0x64, 0xfe, 0x24, 0x18,
10470         0x05, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0x5b, 0xfe, 0x4e, 0xe4, 0xc2,
10471         0x64, 0xfe, 0x36, 0x18, 0x05, 0xfe, 0x92, 0x00, 0xfe, 0x02, 0xe6, 0x1b,
10472         0xdc, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x64, 0xfe, 0x48, 0x18, 0x05,
10473         0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x19, 0xfe, 0x08, 0x10, 0x05, 0xfe,
10474         0x96, 0x00, 0xfe, 0x02, 0xe6, 0x2c, 0xfe, 0x4e, 0x45, 0xfe, 0x0c, 0x12,
10475         0xaf, 0xff, 0x04, 0x68, 0x54, 0xde, 0x1c, 0x69, 0x03, 0x07, 0x7a, 0xfe,
10476         0x5a, 0xf0, 0xfe, 0x74, 0x18, 0x24, 0xfe, 0x09, 0x00, 0xfe, 0x34, 0x10,
10477         0x07, 0x1b, 0xfe, 0x5a, 0xf0, 0xfe, 0x82, 0x18, 0x24, 0xc3, 0xfe, 0x26,
10478         0x10, 0x07, 0x1a, 0x5d, 0x24, 0x2c, 0xdc, 0x07, 0x0b, 0x5d, 0x24, 0x93,
10479         0xfe, 0x0e, 0x10, 0x07, 0x06, 0x5d, 0x24, 0x4d, 0x9f, 0xad, 0x03, 0x14,
10480         0xfe, 0x09, 0x00, 0x01, 0x33, 0xfe, 0x04, 0xfe, 0x7d, 0x05, 0x7f, 0xf9,
10481         0x03, 0x25, 0xfe, 0xca, 0x18, 0xfe, 0x14, 0xf0, 0x08, 0x65, 0xfe, 0xc6,
10482         0x18, 0x03, 0xff, 0x1a, 0x00, 0x00,
10483 };
10484
10485 static unsigned short _adv_asc3550_size = sizeof(_adv_asc3550_buf);     /* 0x13AD */
10486 static ADV_DCNT _adv_asc3550_chksum = 0x04D52DDDUL;     /* Expanded little-endian checksum. */
10487
10488 /* Microcode buffer is kept after initialization for error recovery. */
10489 static unsigned char _adv_asc38C0800_buf[] = {
10490         0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x16, 0x18, 0xe4,
10491         0x01, 0x00, 0x48, 0xe4, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00, 0xce, 0x19,
10492         0x00, 0xfa, 0xff, 0xff, 0x1c, 0x0f, 0x00, 0xf6, 0x9e, 0xe7, 0xff, 0x00,
10493         0x82, 0xe7, 0x00, 0xea, 0x01, 0xfa, 0x01, 0xe6, 0x09, 0xe7, 0x55, 0xf0,
10494         0x01, 0xf6, 0x03, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1e, 0xf0, 0x85, 0xf0,
10495         0x18, 0xf4, 0x08, 0x00, 0xbc, 0x00, 0x38, 0x54, 0x00, 0xec, 0xd5, 0xf0,
10496         0x82, 0x0d, 0x00, 0xe6, 0x86, 0xf0, 0xb1, 0xf0, 0x98, 0x57, 0x01, 0xfc,
10497         0xb4, 0x00, 0xd4, 0x01, 0x0c, 0x1c, 0x3e, 0x1c, 0x3c, 0x00, 0xbb, 0x00,
10498         0x00, 0x10, 0xba, 0x19, 0x02, 0x80, 0x32, 0xf0, 0x7c, 0x0d, 0x02, 0x13,
10499         0xba, 0x13, 0x18, 0x40, 0x00, 0x57, 0x01, 0xea, 0x02, 0xfc, 0x03, 0xfc,
10500         0x3e, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x76, 0x01, 0xb9, 0x54,
10501         0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00, 0xc0, 0x00, 0x01, 0x01,
10502         0x3e, 0x01, 0x7a, 0x01, 0xca, 0x08, 0xce, 0x10, 0x16, 0x11, 0x04, 0x12,
10503         0x08, 0x12, 0x02, 0x4a, 0xbb, 0x55, 0x3c, 0x56, 0x03, 0x58, 0x1b, 0x80,
10504         0x30, 0xe4, 0x4b, 0xe4, 0x5d, 0xf0, 0x02, 0xfa, 0x20, 0x00, 0x32, 0x00,
10505         0x40, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01,
10506         0x70, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x62, 0x0a, 0x86, 0x0d,
10507         0x06, 0x13, 0x4c, 0x1c, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0,
10508         0x03, 0xf7, 0x0c, 0x00, 0x0f, 0x00, 0x47, 0x00, 0xbe, 0x00, 0x00, 0x01,
10509         0x20, 0x11, 0x5c, 0x16, 0x32, 0x1c, 0x38, 0x1c, 0x4e, 0x1c, 0x10, 0x44,
10510         0x00, 0x4c, 0x04, 0xea, 0x5c, 0xf0, 0xa7, 0xf0, 0x04, 0xf6, 0x03, 0xfa,
10511         0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00, 0xcc, 0x00, 0x20, 0x01,
10512         0x4e, 0x01, 0x4a, 0x0b, 0x42, 0x0c, 0x12, 0x0f, 0x0c, 0x10, 0x22, 0x11,
10513         0x0a, 0x12, 0x04, 0x13, 0x30, 0x1c, 0x02, 0x48, 0x00, 0x4e, 0x42, 0x54,
10514         0x44, 0x55, 0xbd, 0x56, 0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0,
10515         0x59, 0xf0, 0xb8, 0xf0, 0x4b, 0xf4, 0x06, 0xf7, 0x0e, 0xf7, 0x04, 0xfc,
10516         0x05, 0xfc, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00, 0xa4, 0x00,
10517         0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00, 0xe2, 0x03,
10518         0x08, 0x0f, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10, 0x0a, 0x13, 0x0c, 0x13,
10519         0x12, 0x13, 0x24, 0x14, 0x34, 0x14, 0x04, 0x16, 0x08, 0x16, 0xa4, 0x17,
10520         0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44, 0x91, 0x44,
10521         0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x3a, 0x55, 0x83, 0x55,
10522         0xe5, 0x55, 0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0,
10523         0x0c, 0xf0, 0x04, 0xf8, 0x05, 0xf8, 0x07, 0x00, 0x0a, 0x00, 0x1c, 0x00,
10524         0x1e, 0x00, 0x9e, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00,
10525         0x22, 0x01, 0x26, 0x01, 0x79, 0x01, 0x7e, 0x01, 0xc4, 0x01, 0xc6, 0x01,
10526         0x80, 0x02, 0x5e, 0x03, 0xee, 0x04, 0x9a, 0x06, 0xf8, 0x07, 0x62, 0x08,
10527         0x68, 0x08, 0x69, 0x08, 0xd6, 0x08, 0xe9, 0x09, 0xfa, 0x0b, 0x2e, 0x0f,
10528         0x12, 0x10, 0x1a, 0x10, 0xed, 0x10, 0xf1, 0x10, 0x2a, 0x11, 0x06, 0x12,
10529         0x0c, 0x12, 0x3e, 0x12, 0x10, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x46, 0x14,
10530         0x76, 0x14, 0x82, 0x14, 0x36, 0x15, 0xca, 0x15, 0x6b, 0x18, 0xbe, 0x18,
10531         0xca, 0x18, 0xe6, 0x19, 0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40,
10532         0x0e, 0x47, 0xfe, 0x9c, 0xf0, 0x2b, 0x02, 0xfe, 0xac, 0x0d, 0xff, 0x10,
10533         0x00, 0x00, 0xd7, 0xfe, 0xe8, 0x19, 0x00, 0xd6, 0xfe, 0x84, 0x01, 0xff,
10534         0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
10535         0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x4c, 0x00, 0x5b, 0xff, 0x04, 0x00,
10536         0x00, 0x11, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
10537         0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x11,
10538         0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
10539         0xfe, 0x04, 0xf7, 0xd6, 0x2c, 0x99, 0x0a, 0x01, 0xfe, 0xc2, 0x0f, 0xfe,
10540         0x04, 0xf7, 0xd6, 0x99, 0x0a, 0x42, 0x2c, 0xfe, 0x3d, 0xf0, 0xfe, 0x06,
10541         0x02, 0xfe, 0x20, 0xf0, 0xa7, 0xfe, 0x91, 0xf0, 0xfe, 0xf4, 0x01, 0xfe,
10542         0x90, 0xf0, 0xfe, 0xf4, 0x01, 0xfe, 0x8f, 0xf0, 0xa7, 0x03, 0x5d, 0x4d,
10543         0x02, 0xfe, 0xc8, 0x0d, 0x01, 0xfe, 0x38, 0x0e, 0xfe, 0xdd, 0x12, 0xfe,
10544         0xfc, 0x10, 0xfe, 0x28, 0x1c, 0x03, 0xfe, 0xa6, 0x00, 0xfe, 0xd3, 0x12,
10545         0x41, 0x14, 0xfe, 0xa6, 0x00, 0xc2, 0xfe, 0x48, 0xf0, 0xfe, 0x8a, 0x02,
10546         0xfe, 0x49, 0xf0, 0xfe, 0xa4, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc2, 0x02,
10547         0xfe, 0x46, 0xf0, 0xfe, 0x54, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x5a, 0x02,
10548         0xfe, 0x43, 0xf0, 0xfe, 0x48, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x4c, 0x02,
10549         0xfe, 0x45, 0xf0, 0xfe, 0x50, 0x02, 0x18, 0x0a, 0xaa, 0x18, 0x06, 0x14,
10550         0xa1, 0x02, 0x2b, 0xfe, 0x00, 0x1c, 0xe7, 0xfe, 0x02, 0x1c, 0xe6, 0xfe,
10551         0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0xfe, 0x18, 0x18, 0xfe, 0xe7, 0x10,
10552         0xfe, 0x06, 0xfc, 0xce, 0x09, 0x70, 0x01, 0xa8, 0x02, 0x2b, 0x15, 0x59,
10553         0x39, 0xa2, 0x01, 0xfe, 0x58, 0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xbd,
10554         0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
10555         0x58, 0x1c, 0x18, 0x06, 0x14, 0xa1, 0x2c, 0x1c, 0x2b, 0xfe, 0x3d, 0xf0,
10556         0xfe, 0x06, 0x02, 0x23, 0xfe, 0x98, 0x02, 0xfe, 0x5a, 0x1c, 0xf8, 0xfe,
10557         0x14, 0x1c, 0x15, 0xfe, 0x30, 0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10,
10558         0x18, 0x06, 0x14, 0xa1, 0x02, 0xd7, 0x22, 0x20, 0x07, 0x11, 0x35, 0xfe,
10559         0x69, 0x10, 0x18, 0x06, 0x14, 0xa1, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0x43,
10560         0x13, 0x20, 0xfe, 0x05, 0xf6, 0xce, 0x01, 0xfe, 0x4a, 0x17, 0x08, 0x54,
10561         0x58, 0x37, 0x12, 0x2f, 0x42, 0x92, 0x01, 0xfe, 0x82, 0x16, 0x02, 0x2b,
10562         0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66, 0x01, 0x73, 0xfe, 0x18, 0x10,
10563         0xfe, 0x41, 0x58, 0x09, 0xa4, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x6b, 0xfe,
10564         0x10, 0x03, 0x01, 0xfe, 0x82, 0x16, 0x02, 0x2b, 0x2c, 0x4f, 0xfe, 0x02,
10565         0xe8, 0x2a, 0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe,
10566         0x27, 0xf0, 0xfe, 0xe0, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xa7,
10567         0xfe, 0x40, 0x1c, 0x1c, 0xd9, 0xfe, 0x26, 0xf0, 0xfe, 0x5a, 0x03, 0xfe,
10568         0xa0, 0xf0, 0xfe, 0x48, 0x03, 0xfe, 0x11, 0xf0, 0xa7, 0xfe, 0xef, 0x10,
10569         0xfe, 0x9f, 0xf0, 0xfe, 0x68, 0x03, 0xf9, 0x10, 0xfe, 0x11, 0x00, 0x02,
10570         0x65, 0x2c, 0xfe, 0x48, 0x1c, 0xf9, 0x08, 0x05, 0x1b, 0xfe, 0x18, 0x13,
10571         0x21, 0x22, 0xa3, 0xb7, 0x13, 0xa3, 0x09, 0x46, 0x01, 0x0e, 0xb7, 0x78,
10572         0x01, 0xfe, 0xb4, 0x16, 0x12, 0xd1, 0x1c, 0xd9, 0xfe, 0x01, 0xf0, 0xd9,
10573         0xfe, 0x82, 0xf0, 0xfe, 0x96, 0x03, 0xfa, 0x12, 0xfe, 0xe4, 0x00, 0x27,
10574         0xfe, 0xa8, 0x03, 0x1c, 0x34, 0x1d, 0xfe, 0xb8, 0x03, 0x01, 0x4b, 0xfe,
10575         0x06, 0xf0, 0xfe, 0xc8, 0x03, 0x95, 0x86, 0xfe, 0x0a, 0xf0, 0xfe, 0x8a,
10576         0x06, 0x02, 0x24, 0x03, 0x70, 0x28, 0x17, 0xfe, 0xfa, 0x04, 0x15, 0x6d,
10577         0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02, 0xd8, 0xf9, 0x2c, 0x99, 0x19,
10578         0xfe, 0x67, 0x1b, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c,
10579         0x74, 0x01, 0xaf, 0x8c, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x17, 0xda,
10580         0x09, 0xd1, 0x01, 0x0e, 0x8d, 0x51, 0x64, 0x79, 0x2a, 0x03, 0x70, 0x28,
10581         0xfe, 0x10, 0x12, 0x15, 0x6d, 0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02,
10582         0xd8, 0xc7, 0x81, 0xc8, 0x83, 0x1c, 0x24, 0x27, 0xfe, 0x40, 0x04, 0x1d,
10583         0xfe, 0x3c, 0x04, 0x3b, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
10584         0x12, 0x2d, 0xff, 0x02, 0x00, 0x10, 0x01, 0x0b, 0x1d, 0xfe, 0xe4, 0x04,
10585         0x2d, 0x01, 0x0b, 0x1d, 0x24, 0x33, 0x31, 0xde, 0xfe, 0x4c, 0x44, 0xfe,
10586         0x4c, 0x12, 0x51, 0xfe, 0x44, 0x48, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b,
10587         0xda, 0x4f, 0x79, 0x2a, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x62,
10588         0x13, 0x08, 0x05, 0x1b, 0xfe, 0x2a, 0x13, 0x32, 0x07, 0x82, 0xfe, 0x52,
10589         0x13, 0xfe, 0x20, 0x10, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b, 0xda, 0xfe,
10590         0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x40, 0x13, 0x08, 0x05, 0x1b, 0xfe,
10591         0x08, 0x13, 0x32, 0x07, 0x82, 0xfe, 0x30, 0x13, 0x08, 0x05, 0x1b, 0xfe,
10592         0x1c, 0x12, 0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe, 0x0d, 0x00,
10593         0x01, 0x36, 0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x2d, 0x12, 0xfe, 0xe6,
10594         0x00, 0xfe, 0x1c, 0x90, 0xfe, 0x40, 0x5c, 0x04, 0x15, 0x9d, 0x01, 0x36,
10595         0x02, 0x2b, 0xfe, 0x42, 0x5b, 0x99, 0x19, 0xfe, 0x46, 0x59, 0xfe, 0xbf,
10596         0x57, 0xfe, 0x77, 0x57, 0xfe, 0x87, 0x80, 0xfe, 0x31, 0xe4, 0x5b, 0x08,
10597         0x05, 0x0a, 0xfe, 0x84, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x19, 0xfe, 0x7c,
10598         0x12, 0x53, 0x05, 0x06, 0xfe, 0x6c, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x28,
10599         0x17, 0xfe, 0x90, 0x05, 0xfe, 0x31, 0xe4, 0x5a, 0x53, 0x05, 0x0a, 0xfe,
10600         0x56, 0x13, 0x03, 0xfe, 0xa0, 0x00, 0x28, 0xfe, 0x4e, 0x12, 0x67, 0xff,
10601         0x02, 0x00, 0x10, 0x27, 0xfe, 0x48, 0x05, 0x1c, 0x34, 0xfe, 0x89, 0x48,
10602         0xff, 0x02, 0x00, 0x10, 0x27, 0xfe, 0x56, 0x05, 0x26, 0xfe, 0xa8, 0x05,
10603         0x12, 0xfe, 0xe3, 0x00, 0x21, 0x53, 0xfe, 0x4a, 0xf0, 0xfe, 0x76, 0x05,
10604         0xfe, 0x49, 0xf0, 0xfe, 0x70, 0x05, 0x88, 0x25, 0xfe, 0x21, 0x00, 0xab,
10605         0x25, 0xfe, 0x22, 0x00, 0xaa, 0x25, 0x58, 0xfe, 0x09, 0x48, 0xff, 0x02,
10606         0x00, 0x10, 0x27, 0xfe, 0x86, 0x05, 0x26, 0xfe, 0xa8, 0x05, 0xfe, 0xe2,
10607         0x08, 0x53, 0x05, 0xcb, 0x4d, 0x01, 0xb0, 0x25, 0x06, 0x13, 0xd3, 0x39,
10608         0xfe, 0x27, 0x01, 0x08, 0x05, 0x1b, 0xfe, 0x22, 0x12, 0x41, 0x01, 0xb2,
10609         0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe, 0x0d, 0x00, 0x01, 0x36,
10610         0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0xeb,
10611         0x03, 0x5c, 0x28, 0xfe, 0x36, 0x13, 0x41, 0x01, 0xb2, 0x26, 0xfe, 0x18,
10612         0x06, 0x09, 0x06, 0x53, 0x05, 0x1f, 0xfe, 0x02, 0x12, 0x50, 0x01, 0xfe,
10613         0x9e, 0x15, 0x1d, 0xfe, 0x0e, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12, 0xfe,
10614         0xe5, 0x00, 0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x03, 0xcd, 0x28, 0xfe, 0x62,
10615         0x12, 0x03, 0x45, 0x28, 0xfe, 0x5a, 0x13, 0x01, 0xfe, 0x0c, 0x19, 0x01,
10616         0xfe, 0x76, 0x19, 0xfe, 0x43, 0x48, 0xc4, 0xcc, 0x0f, 0x71, 0xff, 0x02,
10617         0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0x8b, 0xc4, 0x6e, 0x41, 0x01, 0xb2,
10618         0x26, 0xfe, 0x82, 0x06, 0x53, 0x05, 0x1a, 0xe9, 0x91, 0x09, 0x59, 0x01,
10619         0xfe, 0xcc, 0x15, 0x1d, 0xfe, 0x78, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12,
10620         0xfe, 0xe5, 0x00, 0x03, 0x45, 0xc1, 0x0c, 0x45, 0x18, 0x06, 0x01, 0xb2,
10621         0xfa, 0x76, 0x74, 0x01, 0xaf, 0x8c, 0x12, 0xfe, 0xe2, 0x00, 0x27, 0xdb,
10622         0x1c, 0x34, 0xfe, 0x0a, 0xf0, 0xfe, 0xb6, 0x06, 0x94, 0xfe, 0x6c, 0x07,
10623         0xfe, 0x06, 0xf0, 0xfe, 0x74, 0x07, 0x95, 0x86, 0x02, 0x24, 0x08, 0x05,
10624         0x0a, 0xfe, 0x2e, 0x12, 0x16, 0x19, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b,
10625         0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0xfe, 0x99, 0xa4, 0x01,
10626         0x0b, 0x16, 0x00, 0x02, 0xfe, 0x42, 0x08, 0x68, 0x05, 0x1a, 0xfe, 0x38,
10627         0x12, 0x08, 0x05, 0x1a, 0xfe, 0x30, 0x13, 0x16, 0xfe, 0x1b, 0x00, 0x01,
10628         0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01,
10629         0x0b, 0x16, 0x06, 0x01, 0x0b, 0x16, 0x00, 0x02, 0xe2, 0x6c, 0x58, 0xbe,
10630         0x50, 0xfe, 0x9a, 0x81, 0x55, 0x1b, 0x7a, 0xfe, 0x42, 0x07, 0x09, 0x1b,
10631         0xfe, 0x09, 0x6f, 0xba, 0xfe, 0xca, 0x45, 0xfe, 0x32, 0x12, 0x69, 0x6d,
10632         0x8b, 0x6c, 0x7f, 0x27, 0xfe, 0x54, 0x07, 0x1c, 0x34, 0xfe, 0x0a, 0xf0,
10633         0xfe, 0x42, 0x07, 0x95, 0x86, 0x94, 0xfe, 0x6c, 0x07, 0x02, 0x24, 0x01,
10634         0x4b, 0x02, 0xdb, 0x16, 0x1f, 0x02, 0xdb, 0xfe, 0x9c, 0xf7, 0xdc, 0xfe,
10635         0x2c, 0x90, 0xfe, 0xae, 0x90, 0x56, 0xfe, 0xda, 0x07, 0x0c, 0x60, 0x14,
10636         0x61, 0x08, 0x54, 0x5a, 0x37, 0x22, 0x20, 0x07, 0x11, 0xfe, 0x0e, 0x12,
10637         0x8d, 0xfe, 0x80, 0x80, 0x39, 0x20, 0x6a, 0x2a, 0xfe, 0x06, 0x10, 0xfe,
10638         0x83, 0xe7, 0xfe, 0x48, 0x00, 0xab, 0xfe, 0x03, 0x40, 0x08, 0x54, 0x5b,
10639         0x37, 0x01, 0xb3, 0xb8, 0xfe, 0x1f, 0x40, 0x13, 0x62, 0x01, 0xef, 0xfe,
10640         0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe, 0x44, 0x51, 0xfe, 0xc6, 0x51, 0x88,
10641         0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90, 0x0c, 0x5e, 0x14, 0x5f, 0xfe, 0x0c,
10642         0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x0c, 0x3d,
10643         0x14, 0x3e, 0xfe, 0x4a, 0x10, 0x08, 0x05, 0x5a, 0xfe, 0x2a, 0x12, 0xfe,
10644         0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x60, 0x14, 0x61, 0x08, 0x05, 0x5b,
10645         0x8b, 0x01, 0xb3, 0xfe, 0x1f, 0x80, 0x13, 0x62, 0xfe, 0x44, 0x90, 0xfe,
10646         0xc6, 0x90, 0x0c, 0x3f, 0x14, 0x40, 0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90,
10647         0x0c, 0x5e, 0x14, 0x5f, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90, 0x0c, 0x3d,
10648         0x14, 0x3e, 0x0c, 0x2e, 0x14, 0x3c, 0x21, 0x0c, 0x49, 0x0c, 0x63, 0x08,
10649         0x54, 0x1f, 0x37, 0x2c, 0x0f, 0xfe, 0x4e, 0x11, 0x27, 0xdd, 0xfe, 0x9e,
10650         0xf0, 0xfe, 0x76, 0x08, 0xbc, 0x17, 0x34, 0x2c, 0x77, 0xe6, 0xc5, 0xfe,
10651         0x9a, 0x08, 0xc6, 0xfe, 0xb8, 0x08, 0x94, 0xfe, 0x8e, 0x08, 0xfe, 0x06,
10652         0xf0, 0xfe, 0x94, 0x08, 0x95, 0x86, 0x02, 0x24, 0x01, 0x4b, 0xfe, 0xc9,
10653         0x10, 0x16, 0x1f, 0xfe, 0xc9, 0x10, 0x68, 0x05, 0x06, 0xfe, 0x10, 0x12,
10654         0x68, 0x05, 0x0a, 0x4e, 0x08, 0x05, 0x0a, 0xfe, 0x90, 0x12, 0xfe, 0x2e,
10655         0x1c, 0x02, 0xfe, 0x18, 0x0b, 0x68, 0x05, 0x06, 0x4e, 0x68, 0x05, 0x0a,
10656         0xfe, 0x7a, 0x12, 0xfe, 0x2c, 0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0xd2, 0x09,
10657         0xfe, 0xac, 0xf0, 0xfe, 0x00, 0x09, 0x02, 0xfe, 0xde, 0x09, 0xfe, 0xb7,
10658         0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0x02, 0xf6, 0x1a, 0x50, 0xfe, 0x70, 0x18,
10659         0xfe, 0xf1, 0x18, 0xfe, 0x40, 0x55, 0xfe, 0xe1, 0x55, 0xfe, 0x10, 0x58,
10660         0xfe, 0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x1c, 0x85, 0xfe,
10661         0x8c, 0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0xac, 0xf0, 0xfe, 0xf0, 0x08, 0xb5,
10662         0xfe, 0xcb, 0x10, 0xfe, 0xad, 0xf0, 0xfe, 0x0c, 0x09, 0x02, 0xfe, 0x18,
10663         0x0b, 0xb6, 0xfe, 0xbf, 0x10, 0xfe, 0x2b, 0xf0, 0x85, 0xf4, 0x1e, 0xfe,
10664         0x00, 0xfe, 0xfe, 0x1c, 0x12, 0xc2, 0xfe, 0xd2, 0xf0, 0x85, 0xfe, 0x76,
10665         0x18, 0x1e, 0x19, 0x17, 0x85, 0x03, 0xd2, 0x1e, 0x06, 0x17, 0x85, 0xc5,
10666         0x4a, 0xc6, 0x4a, 0xb5, 0xb6, 0xfe, 0x89, 0x10, 0x74, 0x67, 0x2d, 0x15,
10667         0x9d, 0x01, 0x36, 0x10, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x65, 0x10,
10668         0x80, 0x02, 0x65, 0xfe, 0x98, 0x80, 0xfe, 0x19, 0xe4, 0x0a, 0xfe, 0x1a,
10669         0x12, 0x51, 0xfe, 0x19, 0x82, 0xfe, 0x6c, 0x18, 0xfe, 0x44, 0x54, 0xbe,
10670         0xfe, 0x19, 0x81, 0xfe, 0x74, 0x18, 0x8f, 0x90, 0x17, 0xfe, 0xce, 0x08,
10671         0x02, 0x4a, 0x08, 0x05, 0x5a, 0xec, 0x03, 0x2e, 0x29, 0x3c, 0x0c, 0x3f,
10672         0x14, 0x40, 0x9b, 0x2e, 0x9c, 0x3c, 0xfe, 0x6c, 0x18, 0xfe, 0xed, 0x18,
10673         0xfe, 0x44, 0x54, 0xfe, 0xe5, 0x54, 0x3a, 0x3f, 0x3b, 0x40, 0x03, 0x49,
10674         0x29, 0x63, 0x8f, 0xfe, 0xe3, 0x54, 0xfe, 0x74, 0x18, 0xfe, 0xf5, 0x18,
10675         0x8f, 0xfe, 0xe3, 0x54, 0x90, 0xc0, 0x56, 0xfe, 0xce, 0x08, 0x02, 0x4a,
10676         0xfe, 0x37, 0xf0, 0xfe, 0xda, 0x09, 0xfe, 0x8b, 0xf0, 0xfe, 0x60, 0x09,
10677         0x02, 0x4a, 0x08, 0x05, 0x0a, 0x23, 0xfe, 0xfa, 0x0a, 0x3a, 0x49, 0x3b,
10678         0x63, 0x56, 0xfe, 0x3e, 0x0a, 0x0f, 0xfe, 0xc0, 0x07, 0x41, 0x98, 0x00,
10679         0xad, 0xfe, 0x01, 0x59, 0xfe, 0x52, 0xf0, 0xfe, 0x0c, 0x0a, 0x8f, 0x7a,
10680         0xfe, 0x24, 0x0a, 0x3a, 0x49, 0x8f, 0xfe, 0xe3, 0x54, 0x57, 0x49, 0x7d,
10681         0x63, 0xfe, 0x14, 0x58, 0xfe, 0x95, 0x58, 0x02, 0x4a, 0x3a, 0x49, 0x3b,
10682         0x63, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0xbe, 0x57, 0x49, 0x57, 0x63,
10683         0x02, 0x4a, 0x08, 0x05, 0x5a, 0xfe, 0x82, 0x12, 0x08, 0x05, 0x1f, 0xfe,
10684         0x66, 0x13, 0x22, 0x62, 0xb7, 0xfe, 0x03, 0xa1, 0xfe, 0x83, 0x80, 0xfe,
10685         0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91, 0xfe, 0x86, 0x91, 0x6a,
10686         0x2a, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x56, 0xe0, 0x03, 0x60, 0x29,
10687         0x61, 0x0c, 0x7f, 0x14, 0x80, 0x57, 0x60, 0x7d, 0x61, 0x01, 0xb3, 0xb8,
10688         0x6a, 0x2a, 0x13, 0x62, 0x9b, 0x2e, 0x9c, 0x3c, 0x3a, 0x3f, 0x3b, 0x40,
10689         0x90, 0xc0, 0xfe, 0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0x01, 0xef,
10690         0xfe, 0x36, 0x10, 0x21, 0x0c, 0x7f, 0x0c, 0x80, 0x3a, 0x3f, 0x3b, 0x40,
10691         0xe4, 0x08, 0x05, 0x1f, 0x17, 0xe0, 0x3a, 0x3d, 0x3b, 0x3e, 0x08, 0x05,
10692         0xfe, 0xf7, 0x00, 0x37, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x10, 0x58, 0xfe,
10693         0x91, 0x58, 0x57, 0x49, 0x7d, 0x63, 0x02, 0xfe, 0xf4, 0x09, 0x08, 0x05,
10694         0x1f, 0x17, 0xe0, 0x08, 0x05, 0xfe, 0xf7, 0x00, 0x37, 0xbe, 0xfe, 0x19,
10695         0x81, 0x50, 0xfe, 0x10, 0x90, 0xfe, 0x92, 0x90, 0xfe, 0xd3, 0x10, 0x32,
10696         0x07, 0xa6, 0x17, 0xfe, 0x08, 0x09, 0x12, 0xa6, 0x08, 0x05, 0x0a, 0xfe,
10697         0x14, 0x13, 0x03, 0x3d, 0x29, 0x3e, 0x56, 0xfe, 0x08, 0x09, 0xfe, 0x0c,
10698         0x58, 0xfe, 0x8d, 0x58, 0x02, 0x4a, 0x21, 0x41, 0xfe, 0x19, 0x80, 0xe7,
10699         0x08, 0x05, 0x0a, 0xfe, 0x1a, 0x12, 0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41,
10700         0xf4, 0xc2, 0xfe, 0xd1, 0xf0, 0xe2, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe,
10701         0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe, 0x6c, 0x19, 0x57, 0x3d, 0xfe, 0xed,
10702         0x19, 0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0xf4, 0x1e, 0xfe,
10703         0x00, 0xff, 0x35, 0xfe, 0x74, 0x10, 0xc2, 0xfe, 0xd2, 0xf0, 0xfe, 0xa6,
10704         0x0b, 0xfe, 0x76, 0x18, 0x1e, 0x19, 0x8a, 0x03, 0xd2, 0x1e, 0x06, 0xfe,
10705         0x08, 0x13, 0x10, 0xfe, 0x16, 0x00, 0x02, 0x65, 0xfe, 0xd1, 0xf0, 0xfe,
10706         0xb8, 0x0b, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe, 0x17, 0x00, 0xfe, 0x42,
10707         0x10, 0xfe, 0xce, 0xf0, 0xfe, 0xbe, 0x0b, 0xfe, 0x3c, 0x10, 0xfe, 0xcd,
10708         0xf0, 0xfe, 0xca, 0x0b, 0x10, 0xfe, 0x22, 0x00, 0x02, 0x65, 0xfe, 0xcb,
10709         0xf0, 0xfe, 0xd6, 0x0b, 0x10, 0xfe, 0x24, 0x00, 0x02, 0x65, 0xfe, 0xd0,
10710         0xf0, 0xfe, 0xe0, 0x0b, 0x10, 0x9e, 0xe5, 0xfe, 0xcf, 0xf0, 0xfe, 0xea,
10711         0x0b, 0x10, 0x58, 0xfe, 0x10, 0x10, 0xfe, 0xcc, 0xf0, 0xe2, 0x68, 0x05,
10712         0x1f, 0x4d, 0x10, 0xfe, 0x12, 0x00, 0x2c, 0x0f, 0xfe, 0x4e, 0x11, 0x27,
10713         0xfe, 0x00, 0x0c, 0xfe, 0x9e, 0xf0, 0xfe, 0x14, 0x0c, 0xbc, 0x17, 0x34,
10714         0x2c, 0x77, 0xe6, 0xc5, 0x24, 0xc6, 0x24, 0x2c, 0xfa, 0x27, 0xfe, 0x20,
10715         0x0c, 0x1c, 0x34, 0x94, 0xfe, 0x3c, 0x0c, 0x95, 0x86, 0xc5, 0xdc, 0xc6,
10716         0xdc, 0x02, 0x24, 0x01, 0x4b, 0xfe, 0xdb, 0x10, 0x12, 0xfe, 0xe8, 0x00,
10717         0xb5, 0xb6, 0x74, 0xc7, 0x81, 0xc8, 0x83, 0xfe, 0x89, 0xf0, 0x24, 0x33,
10718         0x31, 0xe1, 0xc7, 0x81, 0xc8, 0x83, 0x27, 0xfe, 0x66, 0x0c, 0x1d, 0x24,
10719         0x33, 0x31, 0xdf, 0xbc, 0x4e, 0x10, 0xfe, 0x42, 0x00, 0x02, 0x65, 0x7c,
10720         0x06, 0xfe, 0x81, 0x49, 0x17, 0xfe, 0x2c, 0x0d, 0x08, 0x05, 0x0a, 0xfe,
10721         0x44, 0x13, 0x10, 0x00, 0x55, 0x0a, 0xfe, 0x54, 0x12, 0x55, 0xfe, 0x28,
10722         0x00, 0x23, 0xfe, 0x9a, 0x0d, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66,
10723         0x44, 0xfe, 0x28, 0x00, 0xfe, 0xe2, 0x10, 0x01, 0xf5, 0x01, 0xf6, 0x09,
10724         0xa4, 0x01, 0xfe, 0x26, 0x0f, 0x64, 0x12, 0x2f, 0x01, 0x73, 0x02, 0x2b,
10725         0x10, 0xfe, 0x44, 0x00, 0x55, 0x0a, 0xe9, 0x44, 0x0a, 0xfe, 0xb4, 0x10,
10726         0x01, 0xb0, 0x44, 0x0a, 0xfe, 0xaa, 0x10, 0x01, 0xb0, 0xfe, 0x19, 0x82,
10727         0xfe, 0x34, 0x46, 0xac, 0x44, 0x0a, 0x10, 0xfe, 0x43, 0x00, 0xfe, 0x96,
10728         0x10, 0x08, 0x54, 0x0a, 0x37, 0x01, 0xf5, 0x01, 0xf6, 0x64, 0x12, 0x2f,
10729         0x01, 0x73, 0x99, 0x0a, 0x64, 0x42, 0x92, 0x02, 0xfe, 0x2e, 0x03, 0x08,
10730         0x05, 0x0a, 0x8a, 0x44, 0x0a, 0x10, 0x00, 0xfe, 0x5c, 0x10, 0x68, 0x05,
10731         0x1a, 0xfe, 0x58, 0x12, 0x08, 0x05, 0x1a, 0xfe, 0x50, 0x13, 0xfe, 0x1c,
10732         0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x50, 0x0d, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d,
10733         0xf0, 0xfe, 0x56, 0x0d, 0x08, 0x54, 0x1a, 0x37, 0xfe, 0xa9, 0x10, 0x10,
10734         0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0a, 0x50, 0xfe, 0x2e, 0x10, 0x10,
10735         0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x6f, 0xab, 0x10, 0xfe, 0x41,
10736         0x00, 0xaa, 0x10, 0xfe, 0x24, 0x00, 0x8c, 0xb5, 0xb6, 0x74, 0x03, 0x70,
10737         0x28, 0x23, 0xd8, 0x50, 0xfe, 0x04, 0xe6, 0x1a, 0xfe, 0x9d, 0x41, 0xfe,
10738         0x1c, 0x42, 0x64, 0x01, 0xe3, 0x02, 0x2b, 0xf8, 0x15, 0x0a, 0x39, 0xa0,
10739         0xb4, 0x15, 0xfe, 0x31, 0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10, 0x02,
10740         0xd7, 0x42, 0xfe, 0x06, 0xec, 0xd0, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45,
10741         0x35, 0x42, 0xfe, 0x06, 0xea, 0xd0, 0xfe, 0x47, 0x4b, 0x91, 0xfe, 0x75,
10742         0x57, 0x03, 0x5d, 0xfe, 0x98, 0x56, 0xfe, 0x38, 0x12, 0x09, 0x48, 0x01,
10743         0x0e, 0xfe, 0x44, 0x48, 0x4f, 0x08, 0x05, 0x1b, 0xfe, 0x1a, 0x13, 0x09,
10744         0x46, 0x01, 0x0e, 0x41, 0xfe, 0x41, 0x58, 0x09, 0xa4, 0x01, 0x0e, 0xfe,
10745         0x49, 0x54, 0x96, 0xfe, 0x1e, 0x0e, 0x02, 0xfe, 0x2e, 0x03, 0x09, 0x5d,
10746         0xfe, 0xee, 0x14, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45, 0x35, 0x42, 0xfe,
10747         0xce, 0x47, 0xfe, 0xad, 0x13, 0x02, 0x2b, 0x22, 0x20, 0x07, 0x11, 0xfe,
10748         0x9e, 0x12, 0x21, 0x13, 0x59, 0x13, 0x9f, 0x13, 0xd5, 0x22, 0x2f, 0x41,
10749         0x39, 0x2f, 0xbc, 0xad, 0xfe, 0xbc, 0xf0, 0xfe, 0xe0, 0x0e, 0x0f, 0x06,
10750         0x13, 0x59, 0x01, 0xfe, 0xda, 0x16, 0x03, 0xfe, 0x38, 0x01, 0x29, 0xfe,
10751         0x3a, 0x01, 0x56, 0xfe, 0xe4, 0x0e, 0xfe, 0x02, 0xec, 0xd5, 0x69, 0x00,
10752         0x66, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01,
10753         0x01, 0xfe, 0x4a, 0x17, 0xfe, 0x08, 0x90, 0xfe, 0x48, 0xf4, 0x0d, 0xfe,
10754         0x18, 0x13, 0xba, 0xfe, 0x02, 0xea, 0xd5, 0x69, 0x7e, 0xfe, 0xc5, 0x13,
10755         0x15, 0x1a, 0x39, 0xa0, 0xb4, 0xfe, 0x2e, 0x10, 0x03, 0xfe, 0x38, 0x01,
10756         0x1e, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x03, 0xfe, 0x3a, 0x01,
10757         0x0c, 0xfe, 0x62, 0x01, 0x43, 0x13, 0x20, 0x25, 0x06, 0x13, 0x2f, 0x12,
10758         0x2f, 0x92, 0x0f, 0x06, 0x04, 0x21, 0x04, 0x22, 0x59, 0xfe, 0xf7, 0x12,
10759         0x22, 0x9f, 0xb7, 0x13, 0x9f, 0x07, 0x7e, 0xfe, 0x71, 0x13, 0xfe, 0x24,
10760         0x1c, 0x15, 0x19, 0x39, 0xa0, 0xb4, 0xfe, 0xd9, 0x10, 0xc3, 0xfe, 0x03,
10761         0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xc3, 0xfe, 0x03, 0xdc,
10762         0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x21,
10763         0xfe, 0x00, 0xcc, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x78, 0x04, 0x08, 0x05,
10764         0x58, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
10765         0xfe, 0x1e, 0x80, 0xed, 0xfe, 0x1d, 0x80, 0xae, 0xfe, 0x0c, 0x90, 0xfe,
10766         0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xac, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
10767         0x0a, 0xfe, 0x3c, 0x50, 0xaa, 0x01, 0xfe, 0x7a, 0x17, 0x32, 0x07, 0x2f,
10768         0xad, 0x01, 0xfe, 0xb4, 0x16, 0x08, 0x05, 0x1b, 0x4e, 0x01, 0xf5, 0x01,
10769         0xf6, 0x12, 0xfe, 0xe9, 0x00, 0x08, 0x05, 0x58, 0xfe, 0x2c, 0x13, 0x01,
10770         0xfe, 0x0c, 0x17, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
10771         0x0c, 0xfe, 0x64, 0x01, 0x14, 0xfe, 0x66, 0x01, 0x08, 0x05, 0x5b, 0xfe,
10772         0x12, 0x12, 0xfe, 0x03, 0x80, 0x8d, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
10773         0x40, 0x13, 0x20, 0x6a, 0x2a, 0x12, 0xcf, 0x64, 0x22, 0x20, 0xfb, 0x79,
10774         0x20, 0x04, 0xfe, 0x08, 0x1c, 0x03, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
10775         0x03, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe,
10776         0x08, 0x58, 0x03, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
10777         0x25, 0x6e, 0x13, 0xd0, 0x21, 0x0c, 0x5c, 0x0c, 0x45, 0x0f, 0x46, 0x52,
10778         0x50, 0x18, 0x1b, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x23, 0xfe, 0xfc,
10779         0x0f, 0x44, 0x11, 0x0f, 0x48, 0x52, 0x18, 0x58, 0xfe, 0x90, 0x4d, 0xfe,
10780         0x91, 0x54, 0x23, 0xe4, 0x25, 0x11, 0x13, 0x20, 0x7c, 0x6f, 0x4f, 0x22,
10781         0x20, 0xfb, 0x79, 0x20, 0x12, 0xcf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0,
10782         0xfe, 0x26, 0x10, 0xf8, 0x74, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
10783         0x18, 0x1c, 0x04, 0x42, 0xfe, 0x0c, 0x14, 0xfc, 0xfe, 0x07, 0xe6, 0x1b,
10784         0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x04, 0x01, 0xb0, 0x7c, 0x6f, 0x4f,
10785         0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42, 0x13, 0x32, 0x07, 0x2f,
10786         0xfe, 0x34, 0x13, 0x09, 0x48, 0x01, 0x0e, 0xbb, 0xfe, 0x36, 0x12, 0xfe,
10787         0x41, 0x48, 0xfe, 0x45, 0x48, 0x01, 0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe,
10788         0xf3, 0x13, 0x43, 0x78, 0x07, 0x11, 0xac, 0x09, 0x84, 0x01, 0x0e, 0xfe,
10789         0x80, 0x5c, 0x01, 0x73, 0xfe, 0x0e, 0x10, 0x07, 0x82, 0x4e, 0xfe, 0x14,
10790         0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x60, 0x10, 0x04, 0xfe, 0x44, 0x58, 0x8d,
10791         0xfe, 0x01, 0xec, 0xa2, 0xfe, 0x9e, 0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe,
10792         0x9c, 0xe7, 0x1a, 0x79, 0x2a, 0x01, 0xe3, 0xfe, 0xdd, 0x10, 0x2c, 0xc7,
10793         0x81, 0xc8, 0x83, 0x33, 0x31, 0xde, 0x07, 0x1a, 0xfe, 0x48, 0x12, 0x07,
10794         0x0a, 0xfe, 0x56, 0x12, 0x07, 0x19, 0xfe, 0x30, 0x12, 0x07, 0xc9, 0x17,
10795         0xfe, 0x32, 0x12, 0x07, 0xfe, 0x23, 0x00, 0x17, 0xeb, 0x07, 0x06, 0x17,
10796         0xfe, 0x9c, 0x12, 0x07, 0x1f, 0xfe, 0x12, 0x12, 0x07, 0x00, 0x17, 0x24,
10797         0x15, 0xc9, 0x01, 0x36, 0xa9, 0x2d, 0x01, 0x0b, 0x94, 0x4b, 0x04, 0x2d,
10798         0xdd, 0x09, 0xd1, 0x01, 0xfe, 0x26, 0x0f, 0x12, 0x82, 0x02, 0x2b, 0x2d,
10799         0x32, 0x07, 0xa6, 0xfe, 0xd9, 0x13, 0x3a, 0x3d, 0x3b, 0x3e, 0x56, 0xfe,
10800         0xf0, 0x11, 0x08, 0x05, 0x5a, 0xfe, 0x72, 0x12, 0x9b, 0x2e, 0x9c, 0x3c,
10801         0x90, 0xc0, 0x96, 0xfe, 0xba, 0x11, 0x22, 0x62, 0xfe, 0x26, 0x13, 0x03,
10802         0x7f, 0x29, 0x80, 0x56, 0xfe, 0x76, 0x0d, 0x0c, 0x60, 0x14, 0x61, 0x21,
10803         0x0c, 0x7f, 0x0c, 0x80, 0x01, 0xb3, 0x25, 0x6e, 0x77, 0x13, 0x62, 0x01,
10804         0xef, 0x9b, 0x2e, 0x9c, 0x3c, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe,
10805         0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0xfe, 0x91, 0x10, 0x03, 0x3f,
10806         0x29, 0x40, 0xfe, 0x40, 0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x3f, 0x14, 0x40,
10807         0x88, 0x9b, 0x2e, 0x9c, 0x3c, 0x90, 0xc0, 0x03, 0x5e, 0x29, 0x5f, 0xfe,
10808         0x00, 0x56, 0xfe, 0xa1, 0x56, 0x0c, 0x5e, 0x14, 0x5f, 0x08, 0x05, 0x5a,
10809         0xfe, 0x1e, 0x12, 0x22, 0x62, 0xfe, 0x1f, 0x40, 0x03, 0x60, 0x29, 0x61,
10810         0xfe, 0x2c, 0x50, 0xfe, 0xae, 0x50, 0x03, 0x3f, 0x29, 0x40, 0xfe, 0x44,
10811         0x50, 0xfe, 0xc6, 0x50, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x08, 0x50, 0xfe,
10812         0x8a, 0x50, 0x03, 0x3d, 0x29, 0x3e, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50,
10813         0x02, 0x89, 0x25, 0x06, 0x13, 0xd4, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1d,
10814         0x4c, 0x33, 0x31, 0xde, 0x07, 0x06, 0x23, 0x4c, 0x32, 0x07, 0xa6, 0x23,
10815         0x72, 0x01, 0xaf, 0x1e, 0x43, 0x17, 0x4c, 0x08, 0x05, 0x0a, 0xee, 0x3a,
10816         0x3d, 0x3b, 0x3e, 0xfe, 0x0a, 0x55, 0x35, 0xfe, 0x8b, 0x55, 0x57, 0x3d,
10817         0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0x02, 0x72, 0xfe, 0x19,
10818         0x81, 0xba, 0xfe, 0x19, 0x41, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1c, 0x34,
10819         0x1d, 0xe8, 0x33, 0x31, 0xe1, 0x55, 0x19, 0xfe, 0xa6, 0x12, 0x55, 0x0a,
10820         0x4d, 0x02, 0x4c, 0x01, 0x0b, 0x1c, 0x34, 0x1d, 0xe8, 0x33, 0x31, 0xdf,
10821         0x07, 0x19, 0x23, 0x4c, 0x01, 0x0b, 0x1d, 0xe8, 0x33, 0x31, 0xfe, 0xe8,
10822         0x09, 0xfe, 0xc2, 0x49, 0x51, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0x8a, 0x53,
10823         0x05, 0x1f, 0x35, 0xa9, 0xfe, 0xbb, 0x45, 0x55, 0x00, 0x4e, 0x44, 0x06,
10824         0x7c, 0x43, 0xfe, 0xda, 0x14, 0x01, 0xaf, 0x8c, 0xfe, 0x4b, 0x45, 0xee,
10825         0x32, 0x07, 0xa5, 0xed, 0x03, 0xcd, 0x28, 0x8a, 0x03, 0x45, 0x28, 0x35,
10826         0x67, 0x02, 0x72, 0xfe, 0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17,
10827         0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01,
10828         0xfe, 0x9e, 0x15, 0x02, 0x89, 0x01, 0x0b, 0x1c, 0x34, 0x1d, 0x4c, 0x33,
10829         0x31, 0xdf, 0x07, 0x06, 0x23, 0x4c, 0x01, 0xf1, 0xfe, 0x42, 0x58, 0xf1,
10830         0xfe, 0xa4, 0x14, 0x8c, 0xfe, 0x4a, 0xf4, 0x0a, 0x17, 0x4c, 0xfe, 0x4a,
10831         0xf4, 0x06, 0xea, 0x32, 0x07, 0xa5, 0x8b, 0x02, 0x72, 0x03, 0x45, 0xc1,
10832         0x0c, 0x45, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01, 0xfe, 0xcc, 0x15,
10833         0x02, 0x89, 0x0f, 0x06, 0x27, 0xfe, 0xbe, 0x13, 0x26, 0xfe, 0xd4, 0x13,
10834         0x76, 0xfe, 0x89, 0x48, 0x01, 0x0b, 0x21, 0x76, 0x04, 0x7b, 0xfe, 0xd0,
10835         0x13, 0x1c, 0xfe, 0xd0, 0x13, 0x1d, 0xfe, 0xbe, 0x13, 0x67, 0x2d, 0x01,
10836         0x0b, 0xfe, 0xd5, 0x10, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93,
10837         0x1e, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x04, 0x0f,
10838         0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0xfe, 0x30, 0x56,
10839         0xfe, 0x00, 0x5c, 0x04, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93,
10840         0x04, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0xfe, 0x0b, 0x58,
10841         0x04, 0x09, 0x5c, 0x01, 0x87, 0x09, 0x45, 0x01, 0x87, 0x04, 0xfe, 0x03,
10842         0xa1, 0x1e, 0x11, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x1f, 0x52,
10843         0xfe, 0x00, 0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c,
10844         0x6a, 0x2a, 0x0c, 0x5e, 0x14, 0x5f, 0x57, 0x3f, 0x7d, 0x40, 0x04, 0xdd,
10845         0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x8d, 0x04, 0x01,
10846         0xfe, 0x0c, 0x19, 0xfe, 0x42, 0x48, 0x50, 0x51, 0x91, 0x01, 0x0b, 0x1d,
10847         0xfe, 0x96, 0x15, 0x33, 0x31, 0xe1, 0x01, 0x0b, 0x1d, 0xfe, 0x96, 0x15,
10848         0x33, 0x31, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x03, 0xcd, 0x28, 0xfe,
10849         0xcc, 0x12, 0x53, 0x05, 0x1a, 0xfe, 0xc4, 0x13, 0x21, 0x69, 0x1a, 0xee,
10850         0x55, 0xca, 0x6b, 0xfe, 0xdc, 0x14, 0x4d, 0x0f, 0x06, 0x18, 0xca, 0x7c,
10851         0x30, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xab, 0xff, 0x02, 0x83,
10852         0x55, 0x69, 0x19, 0xae, 0x98, 0xfe, 0x30, 0x00, 0x96, 0xf2, 0x18, 0x6d,
10853         0x0f, 0x06, 0xfe, 0x56, 0x10, 0x69, 0x0a, 0xed, 0x98, 0xfe, 0x64, 0x00,
10854         0x96, 0xf2, 0x09, 0xfe, 0x64, 0x00, 0x18, 0x9e, 0x0f, 0x06, 0xfe, 0x28,
10855         0x10, 0x69, 0x06, 0xfe, 0x60, 0x13, 0x98, 0xfe, 0xc8, 0x00, 0x96, 0xf2,
10856         0x09, 0xfe, 0xc8, 0x00, 0x18, 0x59, 0x0f, 0x06, 0x88, 0x98, 0xfe, 0x90,
10857         0x01, 0x7a, 0xfe, 0x42, 0x15, 0x91, 0xe4, 0xfe, 0x43, 0xf4, 0x9f, 0xfe,
10858         0x56, 0xf0, 0xfe, 0x54, 0x15, 0xfe, 0x04, 0xf4, 0x71, 0xfe, 0x43, 0xf4,
10859         0x9e, 0xfe, 0xf3, 0x10, 0xfe, 0x40, 0x5c, 0x01, 0xfe, 0x16, 0x14, 0x1e,
10860         0x43, 0xec, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x6e, 0x7a, 0xfe, 0x90,
10861         0x15, 0xc4, 0x6e, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4,
10862         0xcc, 0x7a, 0xfe, 0x90, 0x15, 0xc4, 0xcc, 0x88, 0x51, 0x21, 0xfe, 0x4d,
10863         0xf4, 0x00, 0xe9, 0x91, 0x0f, 0x06, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58,
10864         0x04, 0x51, 0x0f, 0x0a, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xf3, 0x16,
10865         0x0a, 0x01, 0x0b, 0x26, 0xf3, 0x16, 0x19, 0x01, 0x0b, 0x26, 0xf3, 0x76,
10866         0xfe, 0x89, 0x49, 0x01, 0x0b, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
10867         0x16, 0x19, 0x01, 0x0b, 0x26, 0xb1, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
10868         0xfe, 0x89, 0x49, 0x01, 0x0b, 0x26, 0xb1, 0x76, 0xfe, 0x89, 0x4a, 0x01,
10869         0x0b, 0x04, 0x51, 0x04, 0x22, 0xd3, 0x07, 0x06, 0xfe, 0x48, 0x13, 0xb8,
10870         0x13, 0xd3, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x76, 0xa9, 0x67, 0xfe, 0x01,
10871         0xec, 0xfe, 0x27, 0x01, 0xfe, 0x89, 0x48, 0xff, 0x02, 0x00, 0x10, 0x27,
10872         0xfe, 0x2e, 0x16, 0x32, 0x07, 0xfe, 0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1d,
10873         0xfe, 0x52, 0x16, 0x21, 0x13, 0xd4, 0x01, 0x4b, 0x22, 0xd4, 0x07, 0x06,
10874         0x4e, 0x08, 0x54, 0x06, 0x37, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfb, 0x8e,
10875         0x07, 0x11, 0xae, 0x09, 0x84, 0x01, 0x0e, 0x8e, 0x09, 0x5d, 0x01, 0xa8,
10876         0x04, 0x09, 0x84, 0x01, 0x0e, 0x8e, 0xfe, 0x80, 0xe7, 0x11, 0x07, 0x11,
10877         0x8a, 0xfe, 0x45, 0x58, 0x01, 0xf0, 0x8e, 0x04, 0x09, 0x48, 0x01, 0x0e,
10878         0x8e, 0x09, 0x5d, 0x01, 0xa8, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfe, 0x80,
10879         0x80, 0xfe, 0x80, 0x4c, 0xfe, 0x49, 0xe4, 0x11, 0xae, 0x09, 0x84, 0x01,
10880         0x0e, 0xfe, 0x80, 0x4c, 0x09, 0x5d, 0x01, 0x87, 0x04, 0x18, 0x11, 0x75,
10881         0x6c, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x24,
10882         0x1c, 0xfe, 0x1d, 0xf7, 0x1b, 0x97, 0xfe, 0xee, 0x16, 0x01, 0xfe, 0xf4,
10883         0x17, 0xad, 0x9a, 0x1b, 0x6c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x04,
10884         0xb9, 0x23, 0xfe, 0xde, 0x16, 0xfe, 0xda, 0x10, 0x18, 0x11, 0x75, 0x03,
10885         0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x1f, 0xfe, 0x18, 0x58, 0x03, 0xfe,
10886         0x66, 0x01, 0xfe, 0x19, 0x58, 0x9a, 0x1f, 0xfe, 0x3c, 0x90, 0xfe, 0x30,
10887         0xf4, 0x06, 0xfe, 0x3c, 0x50, 0x6c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79,
10888         0xfe, 0x1c, 0xf7, 0x1f, 0x97, 0xfe, 0x38, 0x17, 0xfe, 0xb6, 0x14, 0x35,
10889         0x04, 0xb9, 0x23, 0xfe, 0x10, 0x17, 0xfe, 0x9c, 0x10, 0x18, 0x11, 0x75,
10890         0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7,
10891         0x2e, 0x97, 0xfe, 0x5a, 0x17, 0xfe, 0x94, 0x14, 0xec, 0x9a, 0x2e, 0x6c,
10892         0x1a, 0xfe, 0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00, 0x04, 0xb9, 0x23, 0xfe,
10893         0x4e, 0x17, 0xfe, 0x6c, 0x10, 0x18, 0x11, 0x75, 0xfe, 0x30, 0xbc, 0xfe,
10894         0xb2, 0xbc, 0x9a, 0xcb, 0x6c, 0x1a, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7,
10895         0xcb, 0x97, 0xfe, 0x92, 0x17, 0xfe, 0x5c, 0x14, 0x35, 0x04, 0xb9, 0x23,
10896         0xfe, 0x7e, 0x17, 0xfe, 0x42, 0x10, 0xfe, 0x02, 0xf6, 0x11, 0x75, 0xfe,
10897         0x18, 0xfe, 0x60, 0xfe, 0x19, 0xfe, 0x61, 0xfe, 0x03, 0xa1, 0xfe, 0x1d,
10898         0xf7, 0x5b, 0x97, 0xfe, 0xb8, 0x17, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13,
10899         0x9a, 0x5b, 0x41, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7,
10900         0x11, 0xfe, 0x81, 0xe7, 0x11, 0x12, 0xfe, 0xdd, 0x00, 0x6a, 0x2a, 0x04,
10901         0x6a, 0x2a, 0xfe, 0x12, 0x45, 0x23, 0xfe, 0xa8, 0x17, 0x15, 0x06, 0x39,
10902         0xa0, 0xb4, 0x02, 0x2b, 0xfe, 0x39, 0xf0, 0xfe, 0xfc, 0x17, 0x21, 0x04,
10903         0xfe, 0x7e, 0x18, 0x1e, 0x19, 0x66, 0x0f, 0x0d, 0x04, 0x75, 0x03, 0xd2,
10904         0x1e, 0x06, 0xfe, 0xef, 0x12, 0xfe, 0xe1, 0x10, 0x7c, 0x6f, 0x4f, 0x32,
10905         0x07, 0x2f, 0xfe, 0x3c, 0x13, 0xf1, 0xfe, 0x42, 0x13, 0x42, 0x92, 0x09,
10906         0x48, 0x01, 0x0e, 0xbb, 0xeb, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
10907         0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe, 0xf3, 0x13, 0x43, 0x78, 0x07, 0x11,
10908         0xac, 0x09, 0x84, 0x01, 0x0e, 0xfe, 0x80, 0x4c, 0x01, 0x73, 0xfe, 0x16,
10909         0x10, 0x07, 0x82, 0x8b, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12, 0xfe, 0x14,
10910         0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x1c, 0x18, 0x18, 0x0a, 0x04, 0xfe, 0x9c,
10911         0xe7, 0x0a, 0x10, 0xfe, 0x15, 0x00, 0x64, 0x79, 0x2a, 0x01, 0xe3, 0x18,
10912         0x06, 0x04, 0x42, 0x92, 0x08, 0x54, 0x1b, 0x37, 0x12, 0x2f, 0x01, 0x73,
10913         0x18, 0x06, 0x04, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x3a, 0xce, 0x3b,
10914         0xcf, 0xfe, 0x48, 0x55, 0x35, 0xfe, 0xc9, 0x55, 0x04, 0x22, 0xa3, 0x77,
10915         0x13, 0xa3, 0x04, 0x09, 0xa4, 0x01, 0x0e, 0xfe, 0x41, 0x48, 0x09, 0x46,
10916         0x01, 0x0e, 0xfe, 0x49, 0x44, 0x17, 0xfe, 0xe8, 0x18, 0x77, 0x78, 0x04,
10917         0x09, 0x48, 0x01, 0x0e, 0x07, 0x11, 0x4e, 0x09, 0x5d, 0x01, 0xa8, 0x09,
10918         0x46, 0x01, 0x0e, 0x77, 0x78, 0x04, 0xfe, 0x4e, 0xe4, 0x19, 0x6b, 0xfe,
10919         0x1c, 0x19, 0x03, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10,
10920         0xfe, 0x4e, 0xe4, 0xc9, 0x6b, 0xfe, 0x2e, 0x19, 0x03, 0xfe, 0x92, 0x00,
10921         0xfe, 0x02, 0xe6, 0x1a, 0xe5, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x6b,
10922         0xfe, 0x40, 0x19, 0x03, 0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x1f, 0xfe,
10923         0x08, 0x10, 0x03, 0xfe, 0x96, 0x00, 0xfe, 0x02, 0xe6, 0x6d, 0xfe, 0x4e,
10924         0x45, 0xea, 0xba, 0xff, 0x04, 0x68, 0x54, 0xe7, 0x1e, 0x6e, 0xfe, 0x08,
10925         0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c, 0xfe, 0x1a, 0xf4, 0xfe, 0x00,
10926         0x04, 0xea, 0xfe, 0x48, 0xf4, 0x19, 0x7a, 0xfe, 0x74, 0x19, 0x0f, 0x19,
10927         0x04, 0x07, 0x7e, 0xfe, 0x5a, 0xf0, 0xfe, 0x84, 0x19, 0x25, 0xfe, 0x09,
10928         0x00, 0xfe, 0x34, 0x10, 0x07, 0x1a, 0xfe, 0x5a, 0xf0, 0xfe, 0x92, 0x19,
10929         0x25, 0xca, 0xfe, 0x26, 0x10, 0x07, 0x19, 0x66, 0x25, 0x6d, 0xe5, 0x07,
10930         0x0a, 0x66, 0x25, 0x9e, 0xfe, 0x0e, 0x10, 0x07, 0x06, 0x66, 0x25, 0x59,
10931         0xa9, 0xb8, 0x04, 0x15, 0xfe, 0x09, 0x00, 0x01, 0x36, 0xfe, 0x04, 0xfe,
10932         0x81, 0x03, 0x83, 0xfe, 0x40, 0x5c, 0x04, 0x1c, 0xf7, 0xfe, 0x14, 0xf0,
10933         0x0b, 0x27, 0xfe, 0xd6, 0x19, 0x1c, 0xf7, 0x7b, 0xf7, 0xfe, 0x82, 0xf0,
10934         0xfe, 0xda, 0x19, 0x04, 0xff, 0xcc, 0x00, 0x00,
10935 };
10936
10937 static unsigned short _adv_asc38C0800_size = sizeof(_adv_asc38C0800_buf);       /* 0x14E1 */
10938 static ADV_DCNT _adv_asc38C0800_chksum = 0x050D3FD8UL;  /* Expanded little-endian checksum. */
10939
10940 /* Microcode buffer is kept after initialization for error recovery. */
10941 static unsigned char _adv_asc38C1600_buf[] = {
10942         0x00, 0x00, 0x00, 0xf2, 0x00, 0x16, 0x00, 0xfc, 0x00, 0x10, 0x00, 0xf0,
10943         0x18, 0xe4, 0x01, 0x00, 0x04, 0x1e, 0x48, 0xe4, 0x03, 0xf6, 0xf7, 0x13,
10944         0x2e, 0x1e, 0x02, 0x00, 0x07, 0x17, 0xc0, 0x5f, 0x00, 0xfa, 0xff, 0xff,
10945         0x04, 0x00, 0x00, 0xf6, 0x09, 0xe7, 0x82, 0xe7, 0x85, 0xf0, 0x86, 0xf0,
10946         0x4e, 0x10, 0x9e, 0xe7, 0xff, 0x00, 0x55, 0xf0, 0x01, 0xf6, 0x03, 0x00,
10947         0x98, 0x57, 0x01, 0xe6, 0x00, 0xea, 0x00, 0xec, 0x01, 0xfa, 0x18, 0xf4,
10948         0x08, 0x00, 0xf0, 0x1d, 0x38, 0x54, 0x32, 0xf0, 0x10, 0x00, 0xc2, 0x0e,
10949         0x1e, 0xf0, 0xd5, 0xf0, 0xbc, 0x00, 0x4b, 0xe4, 0x00, 0xe6, 0xb1, 0xf0,
10950         0xb4, 0x00, 0x02, 0x13, 0x3e, 0x1c, 0xc8, 0x47, 0x3e, 0x00, 0xd8, 0x01,
10951         0x06, 0x13, 0x0c, 0x1c, 0x5e, 0x1e, 0x00, 0x57, 0xc8, 0x57, 0x01, 0xfc,
10952         0xbc, 0x0e, 0xa2, 0x12, 0xb9, 0x54, 0x00, 0x80, 0x62, 0x0a, 0x5a, 0x12,
10953         0xc8, 0x15, 0x3e, 0x1e, 0x18, 0x40, 0xbd, 0x56, 0x03, 0xe6, 0x01, 0xea,
10954         0x5c, 0xf0, 0x0f, 0x00, 0x20, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
10955         0x04, 0x13, 0xbb, 0x55, 0x3c, 0x56, 0x3e, 0x57, 0x03, 0x58, 0x4a, 0xe4,
10956         0x40, 0x00, 0xb6, 0x00, 0xbb, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x01, 0x01,
10957         0x3e, 0x01, 0x58, 0x0a, 0x44, 0x10, 0x0a, 0x12, 0x4c, 0x1c, 0x4e, 0x1c,
10958         0x02, 0x4a, 0x30, 0xe4, 0x05, 0xe6, 0x0c, 0x00, 0x3c, 0x00, 0x80, 0x00,
10959         0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x70, 0x01, 0x72, 0x01,
10960         0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0x7c, 0x01, 0xc6, 0x0e, 0x0c, 0x10,
10961         0xac, 0x12, 0xae, 0x12, 0x16, 0x1a, 0x32, 0x1c, 0x6e, 0x1e, 0x02, 0x48,
10962         0x3a, 0x55, 0xc9, 0x57, 0x02, 0xee, 0x5b, 0xf0, 0x03, 0xf7, 0x06, 0xf7,
10963         0x03, 0xfc, 0x06, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0xe1, 0x00, 0x0c, 0x12,
10964         0x18, 0x1a, 0x70, 0x1a, 0x30, 0x1c, 0x38, 0x1c, 0x10, 0x44, 0x00, 0x4c,
10965         0xb0, 0x57, 0x40, 0x5c, 0x4d, 0xe4, 0x04, 0xea, 0x5d, 0xf0, 0xa7, 0xf0,
10966         0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x09, 0x00, 0x19, 0x00, 0x32, 0x00,
10967         0x33, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xcc, 0x00,
10968         0x20, 0x01, 0x4e, 0x01, 0x79, 0x01, 0x3c, 0x09, 0x68, 0x0d, 0x02, 0x10,
10969         0x04, 0x10, 0x3a, 0x10, 0x08, 0x12, 0x0a, 0x13, 0x40, 0x16, 0x50, 0x16,
10970         0x00, 0x17, 0x4a, 0x19, 0x00, 0x4e, 0x00, 0x54, 0x01, 0x58, 0x00, 0xdc,
10971         0x05, 0xf0, 0x09, 0xf0, 0x59, 0xf0, 0xb8, 0xf0, 0x48, 0xf4, 0x0e, 0xf7,
10972         0x0a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00,
10973         0xd0, 0x00, 0xe7, 0x00, 0xf0, 0x03, 0x69, 0x08, 0xe9, 0x09, 0x5c, 0x0c,
10974         0xb6, 0x12, 0xbc, 0x19, 0xd8, 0x1b, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c,
10975         0x42, 0x1d, 0x08, 0x44, 0x38, 0x44, 0x91, 0x44, 0x0a, 0x45, 0x48, 0x46,
10976         0x89, 0x48, 0x68, 0x54, 0x83, 0x55, 0x83, 0x59, 0x31, 0xe4, 0x02, 0xe6,
10977         0x07, 0xf0, 0x08, 0xf0, 0x0b, 0xf0, 0x0c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8,
10978         0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa, 0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00,
10979         0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0xe5, 0x00, 0x22, 0x01,
10980         0x26, 0x01, 0x60, 0x01, 0x7a, 0x01, 0x82, 0x01, 0xc8, 0x01, 0xca, 0x01,
10981         0x86, 0x02, 0x6a, 0x03, 0x18, 0x05, 0xb2, 0x07, 0x68, 0x08, 0x10, 0x0d,
10982         0x06, 0x10, 0x0a, 0x10, 0x0e, 0x10, 0x12, 0x10, 0x60, 0x10, 0xed, 0x10,
10983         0xf3, 0x10, 0x06, 0x12, 0x10, 0x12, 0x1e, 0x12, 0x0c, 0x13, 0x0e, 0x13,
10984         0x10, 0x13, 0xfe, 0x9c, 0xf0, 0x35, 0x05, 0xfe, 0xec, 0x0e, 0xff, 0x10,
10985         0x00, 0x00, 0xe9, 0xfe, 0x34, 0x1f, 0x00, 0xe8, 0xfe, 0x88, 0x01, 0xff,
10986         0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
10987         0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x4c, 0x00, 0x65, 0xff, 0x04, 0x00,
10988         0x00, 0x1a, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
10989         0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x13,
10990         0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
10991         0xfe, 0x04, 0xf7, 0xe8, 0x37, 0x7d, 0x0d, 0x01, 0xfe, 0x4a, 0x11, 0xfe,
10992         0x04, 0xf7, 0xe8, 0x7d, 0x0d, 0x51, 0x37, 0xfe, 0x3d, 0xf0, 0xfe, 0x0c,
10993         0x02, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x91, 0xf0, 0xfe, 0xf8, 0x01, 0xfe,
10994         0x90, 0xf0, 0xfe, 0xf8, 0x01, 0xfe, 0x8f, 0xf0, 0xbc, 0x03, 0x67, 0x4d,
10995         0x05, 0xfe, 0x08, 0x0f, 0x01, 0xfe, 0x78, 0x0f, 0xfe, 0xdd, 0x12, 0x05,
10996         0xfe, 0x0e, 0x03, 0xfe, 0x28, 0x1c, 0x03, 0xfe, 0xa6, 0x00, 0xfe, 0xd1,
10997         0x12, 0x3e, 0x22, 0xfe, 0xa6, 0x00, 0xac, 0xfe, 0x48, 0xf0, 0xfe, 0x90,
10998         0x02, 0xfe, 0x49, 0xf0, 0xfe, 0xaa, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc8,
10999         0x02, 0xfe, 0x46, 0xf0, 0xfe, 0x5a, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x60,
11000         0x02, 0xfe, 0x43, 0xf0, 0xfe, 0x4e, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x52,
11001         0x02, 0xfe, 0x45, 0xf0, 0xfe, 0x56, 0x02, 0x1c, 0x0d, 0xa2, 0x1c, 0x07,
11002         0x22, 0xb7, 0x05, 0x35, 0xfe, 0x00, 0x1c, 0xfe, 0xf1, 0x10, 0xfe, 0x02,
11003         0x1c, 0xf5, 0xfe, 0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0x5f, 0xfe, 0xe7,
11004         0x10, 0xfe, 0x06, 0xfc, 0xde, 0x0a, 0x81, 0x01, 0xa3, 0x05, 0x35, 0x1f,
11005         0x95, 0x47, 0xb8, 0x01, 0xfe, 0xe4, 0x11, 0x0a, 0x81, 0x01, 0x5c, 0xfe,
11006         0xbd, 0x10, 0x0a, 0x81, 0x01, 0x5c, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c,
11007         0xfe, 0x58, 0x1c, 0x1c, 0x07, 0x22, 0xb7, 0x37, 0x2a, 0x35, 0xfe, 0x3d,
11008         0xf0, 0xfe, 0x0c, 0x02, 0x2b, 0xfe, 0x9e, 0x02, 0xfe, 0x5a, 0x1c, 0xfe,
11009         0x12, 0x1c, 0xfe, 0x14, 0x1c, 0x1f, 0xfe, 0x30, 0x00, 0x47, 0xb8, 0x01,
11010         0xfe, 0xd4, 0x11, 0x1c, 0x07, 0x22, 0xb7, 0x05, 0xe9, 0x21, 0x2c, 0x09,
11011         0x1a, 0x31, 0xfe, 0x69, 0x10, 0x1c, 0x07, 0x22, 0xb7, 0xfe, 0x04, 0xec,
11012         0x2c, 0x60, 0x01, 0xfe, 0x1e, 0x1e, 0x20, 0x2c, 0xfe, 0x05, 0xf6, 0xde,
11013         0x01, 0xfe, 0x62, 0x1b, 0x01, 0x0c, 0x61, 0x4a, 0x44, 0x15, 0x56, 0x51,
11014         0x01, 0xfe, 0x9e, 0x1e, 0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x0a, 0x57,
11015         0x01, 0x18, 0x09, 0x00, 0x36, 0x01, 0x85, 0xfe, 0x18, 0x10, 0xfe, 0x41,
11016         0x58, 0x0a, 0xba, 0x01, 0x18, 0xfe, 0xc8, 0x54, 0x7b, 0xfe, 0x1c, 0x03,
11017         0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x37, 0x60, 0xfe, 0x02, 0xe8, 0x30,
11018         0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe, 0x27, 0xf0,
11019         0xfe, 0xe4, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x40,
11020         0x1c, 0x2a, 0xeb, 0xfe, 0x26, 0xf0, 0xfe, 0x66, 0x03, 0xfe, 0xa0, 0xf0,
11021         0xfe, 0x54, 0x03, 0xfe, 0x11, 0xf0, 0xbc, 0xfe, 0xef, 0x10, 0xfe, 0x9f,
11022         0xf0, 0xfe, 0x74, 0x03, 0xfe, 0x46, 0x1c, 0x19, 0xfe, 0x11, 0x00, 0x05,
11023         0x70, 0x37, 0xfe, 0x48, 0x1c, 0xfe, 0x46, 0x1c, 0x01, 0x0c, 0x06, 0x28,
11024         0xfe, 0x18, 0x13, 0x26, 0x21, 0xb9, 0xc7, 0x20, 0xb9, 0x0a, 0x57, 0x01,
11025         0x18, 0xc7, 0x89, 0x01, 0xfe, 0xc8, 0x1a, 0x15, 0xe1, 0x2a, 0xeb, 0xfe,
11026         0x01, 0xf0, 0xeb, 0xfe, 0x82, 0xf0, 0xfe, 0xa4, 0x03, 0xfe, 0x9c, 0x32,
11027         0x15, 0xfe, 0xe4, 0x00, 0x2f, 0xfe, 0xb6, 0x03, 0x2a, 0x3c, 0x16, 0xfe,
11028         0xc6, 0x03, 0x01, 0x41, 0xfe, 0x06, 0xf0, 0xfe, 0xd6, 0x03, 0xaf, 0xa0,
11029         0xfe, 0x0a, 0xf0, 0xfe, 0xa2, 0x07, 0x05, 0x29, 0x03, 0x81, 0x1e, 0x1b,
11030         0xfe, 0x24, 0x05, 0x1f, 0x63, 0x01, 0x42, 0x8f, 0xfe, 0x70, 0x02, 0x05,
11031         0xea, 0xfe, 0x46, 0x1c, 0x37, 0x7d, 0x1d, 0xfe, 0x67, 0x1b, 0xfe, 0xbf,
11032         0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c, 0x75, 0x01, 0xa6, 0x86, 0x0a,
11033         0x57, 0x01, 0x18, 0x09, 0x00, 0x1b, 0xec, 0x0a, 0xe1, 0x01, 0x18, 0x77,
11034         0x50, 0x40, 0x8d, 0x30, 0x03, 0x81, 0x1e, 0xf8, 0x1f, 0x63, 0x01, 0x42,
11035         0x8f, 0xfe, 0x70, 0x02, 0x05, 0xea, 0xd7, 0x99, 0xd8, 0x9c, 0x2a, 0x29,
11036         0x2f, 0xfe, 0x4e, 0x04, 0x16, 0xfe, 0x4a, 0x04, 0x7e, 0xfe, 0xa0, 0x00,
11037         0xfe, 0x9b, 0x57, 0xfe, 0x54, 0x12, 0x32, 0xff, 0x02, 0x00, 0x10, 0x01,
11038         0x08, 0x16, 0xfe, 0x02, 0x05, 0x32, 0x01, 0x08, 0x16, 0x29, 0x27, 0x25,
11039         0xee, 0xfe, 0x4c, 0x44, 0xfe, 0x58, 0x12, 0x50, 0xfe, 0x44, 0x48, 0x13,
11040         0x34, 0xfe, 0x4c, 0x54, 0x7b, 0xec, 0x60, 0x8d, 0x30, 0x01, 0xfe, 0x4e,
11041         0x1e, 0xfe, 0x48, 0x47, 0xfe, 0x7c, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xfe,
11042         0x32, 0x13, 0x01, 0x43, 0x09, 0x9b, 0xfe, 0x68, 0x13, 0xfe, 0x26, 0x10,
11043         0x13, 0x34, 0xfe, 0x4c, 0x54, 0x7b, 0xec, 0x01, 0xfe, 0x4e, 0x1e, 0xfe,
11044         0x48, 0x47, 0xfe, 0x54, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xa5, 0x01, 0x43,
11045         0x09, 0x9b, 0xfe, 0x40, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xf9, 0x1f, 0x7f,
11046         0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42, 0x8f,
11047         0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x32, 0x15, 0xfe, 0xe6, 0x00, 0x0f, 0xfe,
11048         0x1c, 0x90, 0x04, 0xfe, 0x9c, 0x93, 0x3a, 0x0b, 0x0e, 0x8b, 0x02, 0x1f,
11049         0x7f, 0x01, 0x42, 0x05, 0x35, 0xfe, 0x42, 0x5b, 0x7d, 0x1d, 0xfe, 0x46,
11050         0x59, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0x0f, 0xfe, 0x87, 0x80, 0x04,
11051         0xfe, 0x87, 0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0xd0, 0x65, 0x01, 0x0c,
11052         0x06, 0x0d, 0xfe, 0x98, 0x13, 0x0f, 0xfe, 0x20, 0x80, 0x04, 0xfe, 0xa0,
11053         0x83, 0x33, 0x0b, 0x0e, 0x09, 0x1d, 0xfe, 0x84, 0x12, 0x01, 0x38, 0x06,
11054         0x07, 0xfe, 0x70, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x1e, 0x1b, 0xfe, 0xda,
11055         0x05, 0xd0, 0x54, 0x01, 0x38, 0x06, 0x0d, 0xfe, 0x58, 0x13, 0x03, 0xfe,
11056         0xa0, 0x00, 0x1e, 0xfe, 0x50, 0x12, 0x5e, 0xff, 0x02, 0x00, 0x10, 0x2f,
11057         0xfe, 0x90, 0x05, 0x2a, 0x3c, 0xcc, 0xff, 0x02, 0x00, 0x10, 0x2f, 0xfe,
11058         0x9e, 0x05, 0x17, 0xfe, 0xf4, 0x05, 0x15, 0xfe, 0xe3, 0x00, 0x26, 0x01,
11059         0x38, 0xfe, 0x4a, 0xf0, 0xfe, 0xc0, 0x05, 0xfe, 0x49, 0xf0, 0xfe, 0xba,
11060         0x05, 0x71, 0x2e, 0xfe, 0x21, 0x00, 0xf1, 0x2e, 0xfe, 0x22, 0x00, 0xa2,
11061         0x2e, 0x4a, 0xfe, 0x09, 0x48, 0xff, 0x02, 0x00, 0x10, 0x2f, 0xfe, 0xd0,
11062         0x05, 0x17, 0xfe, 0xf4, 0x05, 0xfe, 0xe2, 0x08, 0x01, 0x38, 0x06, 0xfe,
11063         0x1c, 0x00, 0x4d, 0x01, 0xa7, 0x2e, 0x07, 0x20, 0xe4, 0x47, 0xfe, 0x27,
11064         0x01, 0x01, 0x0c, 0x06, 0x28, 0xfe, 0x24, 0x12, 0x3e, 0x01, 0x84, 0x1f,
11065         0x7f, 0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42,
11066         0x8f, 0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x03, 0xe6, 0x1e, 0xfe, 0xca, 0x13,
11067         0x03, 0xb6, 0x1e, 0xfe, 0x40, 0x12, 0x03, 0x66, 0x1e, 0xfe, 0x38, 0x13,
11068         0x3e, 0x01, 0x84, 0x17, 0xfe, 0x72, 0x06, 0x0a, 0x07, 0x01, 0x38, 0x06,
11069         0x24, 0xfe, 0x02, 0x12, 0x4f, 0x01, 0xfe, 0x56, 0x19, 0x16, 0xfe, 0x68,
11070         0x06, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x03, 0x66, 0x8a, 0x10, 0x66,
11071         0x03, 0x9a, 0x1e, 0xfe, 0x70, 0x12, 0x03, 0x55, 0x1e, 0xfe, 0x68, 0x13,
11072         0x01, 0xc6, 0x09, 0x12, 0x48, 0xfe, 0x92, 0x06, 0x2e, 0x12, 0x01, 0xfe,
11073         0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0x13, 0x58, 0xff, 0x02, 0x00,
11074         0x57, 0x52, 0xad, 0x23, 0x3f, 0x4e, 0x62, 0x49, 0x3e, 0x01, 0x84, 0x17,
11075         0xfe, 0xea, 0x06, 0x01, 0x38, 0x06, 0x12, 0xf7, 0x45, 0x0a, 0x95, 0x01,
11076         0xfe, 0x84, 0x19, 0x16, 0xfe, 0xe0, 0x06, 0x15, 0x82, 0x01, 0x41, 0x15,
11077         0xe2, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x1c, 0x07, 0x01, 0x84, 0xfe, 0xae,
11078         0x10, 0x03, 0x6f, 0x1e, 0xfe, 0x9e, 0x13, 0x3e, 0x01, 0x84, 0x03, 0x9a,
11079         0x1e, 0xfe, 0x1a, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfc, 0x01, 0xc6, 0x01,
11080         0xfe, 0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0xf0, 0x45, 0x0a, 0x95,
11081         0x03, 0xb6, 0x1e, 0xf8, 0x01, 0x38, 0x06, 0x24, 0x36, 0xfe, 0x02, 0xf6,
11082         0x07, 0x71, 0x78, 0x8c, 0x00, 0x4d, 0x62, 0x49, 0x3e, 0x2d, 0x93, 0x4e,
11083         0xd0, 0x0d, 0x17, 0xfe, 0x9a, 0x07, 0x01, 0xfe, 0xc0, 0x19, 0x16, 0xfe,
11084         0x90, 0x07, 0x26, 0x20, 0x9e, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x21,
11085         0x9e, 0x09, 0x07, 0xfb, 0x03, 0xe6, 0xfe, 0x58, 0x57, 0x10, 0xe6, 0x05,
11086         0xfe, 0x2a, 0x06, 0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x1c, 0x07, 0x01, 0x84,
11087         0xfe, 0x9c, 0x32, 0x5f, 0x75, 0x01, 0xa6, 0x86, 0x15, 0xfe, 0xe2, 0x00,
11088         0x2f, 0xed, 0x2a, 0x3c, 0xfe, 0x0a, 0xf0, 0xfe, 0xce, 0x07, 0xae, 0xfe,
11089         0x96, 0x08, 0xfe, 0x06, 0xf0, 0xfe, 0x9e, 0x08, 0xaf, 0xa0, 0x05, 0x29,
11090         0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x2e, 0x12, 0x14, 0x1d, 0x01, 0x08, 0x14,
11091         0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0xfe,
11092         0x99, 0xa4, 0x01, 0x08, 0x14, 0x00, 0x05, 0xfe, 0xc6, 0x09, 0x01, 0x76,
11093         0x06, 0x12, 0xfe, 0x3a, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x30, 0x13,
11094         0x14, 0xfe, 0x1b, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00,
11095         0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x07, 0x01, 0x08, 0x14, 0x00,
11096         0x05, 0xef, 0x7c, 0x4a, 0x78, 0x4f, 0x0f, 0xfe, 0x9a, 0x81, 0x04, 0xfe,
11097         0x9a, 0x83, 0xfe, 0xcb, 0x47, 0x0b, 0x0e, 0x2d, 0x28, 0x48, 0xfe, 0x6c,
11098         0x08, 0x0a, 0x28, 0xfe, 0x09, 0x6f, 0xca, 0xfe, 0xca, 0x45, 0xfe, 0x32,
11099         0x12, 0x53, 0x63, 0x4e, 0x7c, 0x97, 0x2f, 0xfe, 0x7e, 0x08, 0x2a, 0x3c,
11100         0xfe, 0x0a, 0xf0, 0xfe, 0x6c, 0x08, 0xaf, 0xa0, 0xae, 0xfe, 0x96, 0x08,
11101         0x05, 0x29, 0x01, 0x41, 0x05, 0xed, 0x14, 0x24, 0x05, 0xed, 0xfe, 0x9c,
11102         0xf7, 0x9f, 0x01, 0xfe, 0xae, 0x1e, 0xfe, 0x18, 0x58, 0x01, 0xfe, 0xbe,
11103         0x1e, 0xfe, 0x99, 0x58, 0xfe, 0x78, 0x18, 0xfe, 0xf9, 0x18, 0x8e, 0xfe,
11104         0x16, 0x09, 0x10, 0x6a, 0x22, 0x6b, 0x01, 0x0c, 0x61, 0x54, 0x44, 0x21,
11105         0x2c, 0x09, 0x1a, 0xf8, 0x77, 0x01, 0xfe, 0x7e, 0x1e, 0x47, 0x2c, 0x7a,
11106         0x30, 0xf0, 0xfe, 0x83, 0xe7, 0xfe, 0x3f, 0x00, 0x71, 0xfe, 0x03, 0x40,
11107         0x01, 0x0c, 0x61, 0x65, 0x44, 0x01, 0xc2, 0xc8, 0xfe, 0x1f, 0x40, 0x20,
11108         0x6e, 0x01, 0xfe, 0x6a, 0x16, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe,
11109         0x44, 0x51, 0xfe, 0xc6, 0x51, 0xfe, 0x10, 0x10, 0x01, 0xfe, 0xce, 0x1e,
11110         0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x01, 0xfe, 0xee, 0x1e,
11111         0x01, 0xfe, 0xfe, 0x1e, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x10, 0x4b,
11112         0x22, 0x4c, 0xfe, 0x8a, 0x10, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0x50, 0x12,
11113         0x01, 0xfe, 0xae, 0x1e, 0x01, 0xfe, 0xbe, 0x1e, 0x10, 0x6a, 0x22, 0x6b,
11114         0x01, 0x0c, 0x06, 0x65, 0x4e, 0x01, 0xc2, 0x0f, 0xfe, 0x1f, 0x80, 0x04,
11115         0xfe, 0x9f, 0x83, 0x33, 0x0b, 0x0e, 0x20, 0x6e, 0x0f, 0xfe, 0x44, 0x90,
11116         0x04, 0xfe, 0xc4, 0x93, 0x3a, 0x0b, 0xfe, 0xc6, 0x90, 0x04, 0xfe, 0xc6,
11117         0x93, 0x79, 0x0b, 0x0e, 0x10, 0x6c, 0x22, 0x6d, 0x01, 0xfe, 0xce, 0x1e,
11118         0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x0f, 0xfe, 0x40, 0x90,
11119         0x04, 0xfe, 0xc0, 0x93, 0x3a, 0x0b, 0xfe, 0xc2, 0x90, 0x04, 0xfe, 0xc2,
11120         0x93, 0x79, 0x0b, 0x0e, 0x10, 0x4b, 0x22, 0x4c, 0x10, 0x64, 0x22, 0x34,
11121         0x01, 0x0c, 0x61, 0x24, 0x44, 0x37, 0x13, 0xfe, 0x4e, 0x11, 0x2f, 0xfe,
11122         0xde, 0x09, 0xfe, 0x9e, 0xf0, 0xfe, 0xf2, 0x09, 0xfe, 0x01, 0x48, 0x1b,
11123         0x3c, 0x37, 0x88, 0xf5, 0xd4, 0xfe, 0x1e, 0x0a, 0xd5, 0xfe, 0x42, 0x0a,
11124         0xd2, 0xfe, 0x1e, 0x0a, 0xd3, 0xfe, 0x42, 0x0a, 0xae, 0xfe, 0x12, 0x0a,
11125         0xfe, 0x06, 0xf0, 0xfe, 0x18, 0x0a, 0xaf, 0xa0, 0x05, 0x29, 0x01, 0x41,
11126         0xfe, 0xc1, 0x10, 0x14, 0x24, 0xfe, 0xc1, 0x10, 0x01, 0x76, 0x06, 0x07,
11127         0xfe, 0x14, 0x12, 0x01, 0x76, 0x06, 0x0d, 0x5d, 0x01, 0x0c, 0x06, 0x0d,
11128         0xfe, 0x74, 0x12, 0xfe, 0x2e, 0x1c, 0x05, 0xfe, 0x1a, 0x0c, 0x01, 0x76,
11129         0x06, 0x07, 0x5d, 0x01, 0x76, 0x06, 0x0d, 0x41, 0xfe, 0x2c, 0x1c, 0xfe,
11130         0xaa, 0xf0, 0xfe, 0xce, 0x0a, 0xfe, 0xac, 0xf0, 0xfe, 0x66, 0x0a, 0xfe,
11131         0x92, 0x10, 0xc4, 0xf6, 0xfe, 0xad, 0xf0, 0xfe, 0x72, 0x0a, 0x05, 0xfe,
11132         0x1a, 0x0c, 0xc5, 0xfe, 0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0xbf, 0xfe, 0x6b,
11133         0x18, 0x23, 0xfe, 0x00, 0xfe, 0xfe, 0x1c, 0x12, 0xac, 0xfe, 0xd2, 0xf0,
11134         0xbf, 0xfe, 0x76, 0x18, 0x23, 0x1d, 0x1b, 0xbf, 0x03, 0xe3, 0x23, 0x07,
11135         0x1b, 0xbf, 0xd4, 0x5b, 0xd5, 0x5b, 0xd2, 0x5b, 0xd3, 0x5b, 0xc4, 0xc5,
11136         0xfe, 0xa9, 0x10, 0x75, 0x5e, 0x32, 0x1f, 0x7f, 0x01, 0x42, 0x19, 0xfe,
11137         0x35, 0x00, 0xfe, 0x01, 0xf0, 0x70, 0x19, 0x98, 0x05, 0x70, 0xfe, 0x74,
11138         0x18, 0x23, 0xfe, 0x00, 0xf8, 0x1b, 0x5b, 0x7d, 0x12, 0x01, 0xfe, 0x78,
11139         0x0f, 0x4d, 0x01, 0xfe, 0x96, 0x1a, 0x21, 0x30, 0x77, 0x7d, 0x1d, 0x05,
11140         0x5b, 0x01, 0x0c, 0x06, 0x0d, 0x2b, 0xfe, 0xe2, 0x0b, 0x01, 0x0c, 0x06,
11141         0x54, 0xfe, 0xa6, 0x12, 0x01, 0x0c, 0x06, 0x24, 0xfe, 0x88, 0x13, 0x21,
11142         0x6e, 0xc7, 0x01, 0xfe, 0x1e, 0x1f, 0x0f, 0xfe, 0x83, 0x80, 0x04, 0xfe,
11143         0x83, 0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0xfe, 0xc8, 0x44, 0xfe, 0x42,
11144         0x13, 0x0f, 0xfe, 0x04, 0x91, 0x04, 0xfe, 0x84, 0x93, 0xfe, 0xca, 0x57,
11145         0x0b, 0xfe, 0x86, 0x91, 0x04, 0xfe, 0x86, 0x93, 0xfe, 0xcb, 0x57, 0x0b,
11146         0x0e, 0x7a, 0x30, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x8e, 0x40, 0x03,
11147         0x6a, 0x3b, 0x6b, 0x10, 0x97, 0x22, 0x98, 0xd9, 0x6a, 0xda, 0x6b, 0x01,
11148         0xc2, 0xc8, 0x7a, 0x30, 0x20, 0x6e, 0xdb, 0x64, 0xdc, 0x34, 0x91, 0x6c,
11149         0x7e, 0x6d, 0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55, 0xfe, 0x04, 0xfa, 0x64,
11150         0xfe, 0x05, 0xfa, 0x34, 0x01, 0xfe, 0x6a, 0x16, 0xa3, 0x26, 0x10, 0x97,
11151         0x10, 0x98, 0x91, 0x6c, 0x7e, 0x6d, 0xfe, 0x14, 0x10, 0x01, 0x0c, 0x06,
11152         0x24, 0x1b, 0x40, 0x91, 0x4b, 0x7e, 0x4c, 0x01, 0x0c, 0x06, 0xfe, 0xf7,
11153         0x00, 0x44, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58,
11154         0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x05, 0x5b, 0x01, 0x0c, 0x06, 0x24,
11155         0x1b, 0x40, 0x01, 0x0c, 0x06, 0xfe, 0xf7, 0x00, 0x44, 0x78, 0x01, 0xfe,
11156         0x8e, 0x1e, 0x4f, 0x0f, 0xfe, 0x10, 0x90, 0x04, 0xfe, 0x90, 0x93, 0x3a,
11157         0x0b, 0xfe, 0x92, 0x90, 0x04, 0xfe, 0x92, 0x93, 0x79, 0x0b, 0x0e, 0xfe,
11158         0xbd, 0x10, 0x01, 0x43, 0x09, 0xbb, 0x1b, 0xfe, 0x6e, 0x0a, 0x15, 0xbb,
11159         0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x14, 0x13, 0x03, 0x4b, 0x3b, 0x4c, 0x8e,
11160         0xfe, 0x6e, 0x0a, 0xfe, 0x0c, 0x58, 0xfe, 0x8d, 0x58, 0x05, 0x5b, 0x26,
11161         0x3e, 0x0f, 0xfe, 0x19, 0x80, 0x04, 0xfe, 0x99, 0x83, 0x33, 0x0b, 0x0e,
11162         0xfe, 0xe5, 0x10, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1a, 0x12, 0xfe, 0x6c,
11163         0x19, 0xfe, 0x19, 0x41, 0xfe, 0x6b, 0x18, 0xac, 0xfe, 0xd1, 0xf0, 0xef,
11164         0x1f, 0x92, 0x01, 0x42, 0x19, 0xfe, 0x44, 0x00, 0xfe, 0x90, 0x10, 0xfe,
11165         0x6c, 0x19, 0xd9, 0x4b, 0xfe, 0xed, 0x19, 0xda, 0x4c, 0xfe, 0x0c, 0x51,
11166         0xfe, 0x8e, 0x51, 0xfe, 0x6b, 0x18, 0x23, 0xfe, 0x00, 0xff, 0x31, 0xfe,
11167         0x76, 0x10, 0xac, 0xfe, 0xd2, 0xf0, 0xfe, 0xba, 0x0c, 0xfe, 0x76, 0x18,
11168         0x23, 0x1d, 0x5d, 0x03, 0xe3, 0x23, 0x07, 0xfe, 0x08, 0x13, 0x19, 0xfe,
11169         0x16, 0x00, 0x05, 0x70, 0xfe, 0xd1, 0xf0, 0xfe, 0xcc, 0x0c, 0x1f, 0x92,
11170         0x01, 0x42, 0x19, 0xfe, 0x17, 0x00, 0x5c, 0xfe, 0xce, 0xf0, 0xfe, 0xd2,
11171         0x0c, 0xfe, 0x3e, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xde, 0x0c, 0x19, 0xfe,
11172         0x22, 0x00, 0x05, 0x70, 0xfe, 0xcb, 0xf0, 0xfe, 0xea, 0x0c, 0x19, 0xfe,
11173         0x24, 0x00, 0x05, 0x70, 0xfe, 0xd0, 0xf0, 0xfe, 0xf4, 0x0c, 0x19, 0x94,
11174         0xfe, 0x1c, 0x10, 0xfe, 0xcf, 0xf0, 0xfe, 0xfe, 0x0c, 0x19, 0x4a, 0xf3,
11175         0xfe, 0xcc, 0xf0, 0xef, 0x01, 0x76, 0x06, 0x24, 0x4d, 0x19, 0xfe, 0x12,
11176         0x00, 0x37, 0x13, 0xfe, 0x4e, 0x11, 0x2f, 0xfe, 0x16, 0x0d, 0xfe, 0x9e,
11177         0xf0, 0xfe, 0x2a, 0x0d, 0xfe, 0x01, 0x48, 0x1b, 0x3c, 0x37, 0x88, 0xf5,
11178         0xd4, 0x29, 0xd5, 0x29, 0xd2, 0x29, 0xd3, 0x29, 0x37, 0xfe, 0x9c, 0x32,
11179         0x2f, 0xfe, 0x3e, 0x0d, 0x2a, 0x3c, 0xae, 0xfe, 0x62, 0x0d, 0xaf, 0xa0,
11180         0xd4, 0x9f, 0xd5, 0x9f, 0xd2, 0x9f, 0xd3, 0x9f, 0x05, 0x29, 0x01, 0x41,
11181         0xfe, 0xd3, 0x10, 0x15, 0xfe, 0xe8, 0x00, 0xc4, 0xc5, 0x75, 0xd7, 0x99,
11182         0xd8, 0x9c, 0xfe, 0x89, 0xf0, 0x29, 0x27, 0x25, 0xbe, 0xd7, 0x99, 0xd8,
11183         0x9c, 0x2f, 0xfe, 0x8c, 0x0d, 0x16, 0x29, 0x27, 0x25, 0xbd, 0xfe, 0x01,
11184         0x48, 0xa4, 0x19, 0xfe, 0x42, 0x00, 0x05, 0x70, 0x90, 0x07, 0xfe, 0x81,
11185         0x49, 0x1b, 0xfe, 0x64, 0x0e, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x44, 0x13,
11186         0x19, 0x00, 0x2d, 0x0d, 0xfe, 0x54, 0x12, 0x2d, 0xfe, 0x28, 0x00, 0x2b,
11187         0xfe, 0xda, 0x0e, 0x0a, 0x57, 0x01, 0x18, 0x09, 0x00, 0x36, 0x46, 0xfe,
11188         0x28, 0x00, 0xfe, 0xfa, 0x10, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe, 0x00,
11189         0x1d, 0x0a, 0xba, 0x01, 0xfe, 0x58, 0x10, 0x40, 0x15, 0x56, 0x01, 0x85,
11190         0x05, 0x35, 0x19, 0xfe, 0x44, 0x00, 0x2d, 0x0d, 0xf7, 0x46, 0x0d, 0xfe,
11191         0xcc, 0x10, 0x01, 0xa7, 0x46, 0x0d, 0xfe, 0xc2, 0x10, 0x01, 0xa7, 0x0f,
11192         0xfe, 0x19, 0x82, 0x04, 0xfe, 0x99, 0x83, 0xfe, 0xcc, 0x47, 0x0b, 0x0e,
11193         0xfe, 0x34, 0x46, 0xa5, 0x46, 0x0d, 0x19, 0xfe, 0x43, 0x00, 0xfe, 0xa2,
11194         0x10, 0x01, 0x0c, 0x61, 0x0d, 0x44, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe,
11195         0x00, 0x1d, 0x40, 0x15, 0x56, 0x01, 0x85, 0x7d, 0x0d, 0x40, 0x51, 0x01,
11196         0xfe, 0x9e, 0x1e, 0x05, 0xfe, 0x3a, 0x03, 0x01, 0x0c, 0x06, 0x0d, 0x5d,
11197         0x46, 0x0d, 0x19, 0x00, 0xfe, 0x62, 0x10, 0x01, 0x76, 0x06, 0x12, 0xfe,
11198         0x5c, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x52, 0x13, 0xfe, 0x1c, 0x1c,
11199         0xfe, 0x9d, 0xf0, 0xfe, 0x8e, 0x0e, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0,
11200         0xfe, 0x94, 0x0e, 0x01, 0x0c, 0x61, 0x12, 0x44, 0xfe, 0x9f, 0x10, 0x19,
11201         0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0d, 0x4f, 0xfe, 0x2e, 0x10, 0x19,
11202         0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x19, 0xfe, 0x47, 0x00, 0xf1, 0x19,
11203         0xfe, 0x41, 0x00, 0xa2, 0x19, 0xfe, 0x24, 0x00, 0x86, 0xc4, 0xc5, 0x75,
11204         0x03, 0x81, 0x1e, 0x2b, 0xea, 0x4f, 0xfe, 0x04, 0xe6, 0x12, 0xfe, 0x9d,
11205         0x41, 0xfe, 0x1c, 0x42, 0x40, 0x01, 0xf4, 0x05, 0x35, 0xfe, 0x12, 0x1c,
11206         0x1f, 0x0d, 0x47, 0xb5, 0xc3, 0x1f, 0xfe, 0x31, 0x00, 0x47, 0xb8, 0x01,
11207         0xfe, 0xd4, 0x11, 0x05, 0xe9, 0x51, 0xfe, 0x06, 0xec, 0xe0, 0xfe, 0x0e,
11208         0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0x06, 0xea, 0xe0,
11209         0xfe, 0x47, 0x4b, 0x45, 0xfe, 0x75, 0x57, 0x03, 0x67, 0xfe, 0x98, 0x56,
11210         0xfe, 0x38, 0x12, 0x0a, 0x5a, 0x01, 0x18, 0xfe, 0x44, 0x48, 0x60, 0x01,
11211         0x0c, 0x06, 0x28, 0xfe, 0x18, 0x13, 0x0a, 0x57, 0x01, 0x18, 0x3e, 0xfe,
11212         0x41, 0x58, 0x0a, 0xba, 0xfe, 0xfa, 0x14, 0xfe, 0x49, 0x54, 0xb0, 0xfe,
11213         0x5e, 0x0f, 0x05, 0xfe, 0x3a, 0x03, 0x0a, 0x67, 0xfe, 0xe0, 0x14, 0xfe,
11214         0x0e, 0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0xce, 0x47,
11215         0xfe, 0xad, 0x13, 0x05, 0x35, 0x21, 0x2c, 0x09, 0x1a, 0xfe, 0x98, 0x12,
11216         0x26, 0x20, 0x96, 0x20, 0xe7, 0xfe, 0x08, 0x1c, 0xfe, 0x7c, 0x19, 0xfe,
11217         0xfd, 0x19, 0xfe, 0x0a, 0x1c, 0x03, 0xe5, 0xfe, 0x48, 0x55, 0xa5, 0x3b,
11218         0xfe, 0x62, 0x01, 0xfe, 0xc9, 0x55, 0x31, 0xfe, 0x74, 0x10, 0x01, 0xfe,
11219         0xf0, 0x1a, 0x03, 0xfe, 0x38, 0x01, 0x3b, 0xfe, 0x3a, 0x01, 0x8e, 0xfe,
11220         0x1e, 0x10, 0xfe, 0x02, 0xec, 0xe7, 0x53, 0x00, 0x36, 0xfe, 0x04, 0xec,
11221         0x2c, 0x60, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x62, 0x1b,
11222         0x01, 0xfe, 0xce, 0x1e, 0xb2, 0x11, 0xfe, 0x18, 0x13, 0xca, 0xfe, 0x02,
11223         0xea, 0xe7, 0x53, 0x92, 0xfe, 0xc3, 0x13, 0x1f, 0x12, 0x47, 0xb5, 0xc3,
11224         0xfe, 0x2a, 0x10, 0x03, 0xfe, 0x38, 0x01, 0x23, 0xfe, 0xf0, 0xff, 0x10,
11225         0xe5, 0x03, 0xfe, 0x3a, 0x01, 0x10, 0xfe, 0x62, 0x01, 0x01, 0xfe, 0x1e,
11226         0x1e, 0x20, 0x2c, 0x15, 0x56, 0x01, 0xfe, 0x9e, 0x1e, 0x13, 0x07, 0x02,
11227         0x26, 0x02, 0x21, 0x96, 0xc7, 0x20, 0x96, 0x09, 0x92, 0xfe, 0x79, 0x13,
11228         0x1f, 0x1d, 0x47, 0xb5, 0xc3, 0xfe, 0xe1, 0x10, 0xcf, 0xfe, 0x03, 0xdc,
11229         0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xcf, 0xfe, 0x03, 0xdc, 0xfe,
11230         0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x26, 0xfe,
11231         0x00, 0xcc, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x89, 0x02, 0x01, 0x0c, 0x06,
11232         0x4a, 0xfe, 0x4e, 0x13, 0x0f, 0xfe, 0x1c, 0x80, 0x04, 0xfe, 0x9c, 0x83,
11233         0x33, 0x0b, 0x0e, 0x09, 0x07, 0xfe, 0x3a, 0x13, 0x0f, 0xfe, 0x1e, 0x80,
11234         0x04, 0xfe, 0x9e, 0x83, 0x33, 0x0b, 0x0e, 0xfe, 0x2a, 0x13, 0x0f, 0xfe,
11235         0x1d, 0x80, 0x04, 0xfe, 0x9d, 0x83, 0xfe, 0xf9, 0x13, 0x0e, 0xfe, 0x1c,
11236         0x13, 0x01, 0xfe, 0xee, 0x1e, 0xac, 0xfe, 0x14, 0x13, 0x01, 0xfe, 0xfe,
11237         0x1e, 0xfe, 0x81, 0x58, 0xfa, 0x01, 0xfe, 0x0e, 0x1f, 0xfe, 0x30, 0xf4,
11238         0x0d, 0xfe, 0x3c, 0x50, 0xa2, 0x01, 0xfe, 0x92, 0x1b, 0x01, 0x43, 0x09,
11239         0x56, 0xfb, 0x01, 0xfe, 0xc8, 0x1a, 0x01, 0x0c, 0x06, 0x28, 0xa4, 0x01,
11240         0xfe, 0xf4, 0x1c, 0x01, 0xfe, 0x00, 0x1d, 0x15, 0xfe, 0xe9, 0x00, 0x01,
11241         0x0c, 0x06, 0x4a, 0xfe, 0x4e, 0x13, 0x01, 0xfe, 0x22, 0x1b, 0xfe, 0x1e,
11242         0x1c, 0x0f, 0xfe, 0x14, 0x90, 0x04, 0xfe, 0x94, 0x93, 0x3a, 0x0b, 0xfe,
11243         0x96, 0x90, 0x04, 0xfe, 0x96, 0x93, 0x79, 0x0b, 0x0e, 0x10, 0xfe, 0x64,
11244         0x01, 0x22, 0xfe, 0x66, 0x01, 0x01, 0x0c, 0x06, 0x65, 0xf9, 0x0f, 0xfe,
11245         0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b, 0x0e, 0x77, 0xfe, 0x01,
11246         0xec, 0x2c, 0xfe, 0x80, 0x40, 0x20, 0x2c, 0x7a, 0x30, 0x15, 0xdf, 0x40,
11247         0x21, 0x2c, 0xfe, 0x00, 0x40, 0x8d, 0x2c, 0x02, 0xfe, 0x08, 0x1c, 0x03,
11248         0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58, 0x03, 0xfe, 0xae, 0x00, 0xfe, 0x07,
11249         0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe, 0x08, 0x58, 0x03, 0xfe, 0xb2, 0x00,
11250         0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c, 0x2e, 0x49, 0x20, 0xe0, 0x26, 0x10,
11251         0x66, 0x10, 0x55, 0x10, 0x6f, 0x13, 0x57, 0x52, 0x4f, 0x1c, 0x28, 0xfe,
11252         0x90, 0x4d, 0xfe, 0x91, 0x54, 0x2b, 0xfe, 0x88, 0x11, 0x46, 0x1a, 0x13,
11253         0x5a, 0x52, 0x1c, 0x4a, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x2b, 0xfe,
11254         0x9e, 0x11, 0x2e, 0x1a, 0x20, 0x2c, 0x90, 0x34, 0x60, 0x21, 0x2c, 0xfe,
11255         0x00, 0x40, 0x8d, 0x2c, 0x15, 0xdf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0,
11256         0xfe, 0xb2, 0x11, 0xfe, 0x12, 0x1c, 0x75, 0xfe, 0x14, 0x1c, 0xfe, 0x10,
11257         0x1c, 0xfe, 0x18, 0x1c, 0x02, 0x51, 0xfe, 0x0c, 0x14, 0xfe, 0x0e, 0x47,
11258         0xfe, 0x07, 0xe6, 0x28, 0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x02, 0x01,
11259         0xa7, 0x90, 0x34, 0x60, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42,
11260         0x13, 0xfe, 0x02, 0x80, 0x09, 0x56, 0xfe, 0x34, 0x13, 0x0a, 0x5a, 0x01,
11261         0x18, 0xcb, 0xfe, 0x36, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
11262         0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f, 0x89,
11263         0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18, 0xfe, 0x80, 0x5c, 0x01, 0x85,
11264         0xf2, 0x09, 0x9b, 0xa4, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0xec,
11265         0x11, 0x02, 0xfe, 0x44, 0x58, 0x77, 0xfe, 0x01, 0xec, 0xb8, 0xfe, 0x9e,
11266         0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x12, 0x8d, 0x30, 0x01,
11267         0xf4, 0xfe, 0xdd, 0x10, 0x37, 0xd7, 0x99, 0xd8, 0x9c, 0x27, 0x25, 0xee,
11268         0x09, 0x12, 0xfe, 0x48, 0x12, 0x09, 0x0d, 0xfe, 0x56, 0x12, 0x09, 0x1d,
11269         0xfe, 0x30, 0x12, 0x09, 0xdd, 0x1b, 0xfe, 0xc4, 0x13, 0x09, 0xfe, 0x23,
11270         0x00, 0x1b, 0xfe, 0xd0, 0x13, 0x09, 0x07, 0x1b, 0xfe, 0x34, 0x14, 0x09,
11271         0x24, 0xfe, 0x12, 0x12, 0x09, 0x00, 0x1b, 0x29, 0x1f, 0xdd, 0x01, 0x42,
11272         0xa1, 0x32, 0x01, 0x08, 0xae, 0x41, 0x02, 0x32, 0xfe, 0x62, 0x08, 0x0a,
11273         0xe1, 0x01, 0xfe, 0x58, 0x10, 0x15, 0x9b, 0x05, 0x35, 0x32, 0x01, 0x43,
11274         0x09, 0xbb, 0xfe, 0xd7, 0x13, 0x91, 0x4b, 0x7e, 0x4c, 0x8e, 0xfe, 0x80,
11275         0x13, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0x72, 0x12, 0xdb, 0x64, 0xdc, 0x34,
11276         0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55, 0xb0, 0xfe, 0x4a, 0x13, 0x21, 0x6e,
11277         0xfe, 0x26, 0x13, 0x03, 0x97, 0x3b, 0x98, 0x8e, 0xfe, 0xb6, 0x0e, 0x10,
11278         0x6a, 0x22, 0x6b, 0x26, 0x10, 0x97, 0x10, 0x98, 0x01, 0xc2, 0x2e, 0x49,
11279         0x88, 0x20, 0x6e, 0x01, 0xfe, 0x6a, 0x16, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
11280         0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x64, 0xfe, 0x05, 0xfa,
11281         0x34, 0xfe, 0x8f, 0x10, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x40, 0x56, 0xfe,
11282         0xe1, 0x56, 0x10, 0x6c, 0x22, 0x6d, 0x71, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
11283         0x44, 0x55, 0xfe, 0xe5, 0x55, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x00, 0x56,
11284         0xfe, 0xa1, 0x56, 0x10, 0x68, 0x22, 0x69, 0x01, 0x0c, 0x06, 0x54, 0xf9,
11285         0x21, 0x6e, 0xfe, 0x1f, 0x40, 0x03, 0x6a, 0x3b, 0x6b, 0xfe, 0x2c, 0x50,
11286         0xfe, 0xae, 0x50, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x44, 0x50, 0xfe, 0xc6,
11287         0x50, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x03,
11288         0x4b, 0x3b, 0x4c, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x05, 0x73, 0x2e,
11289         0x07, 0x20, 0x9e, 0x05, 0x72, 0x32, 0x01, 0x08, 0x16, 0x3d, 0x27, 0x25,
11290         0xee, 0x09, 0x07, 0x2b, 0x3d, 0x01, 0x43, 0x09, 0xbb, 0x2b, 0x72, 0x01,
11291         0xa6, 0x23, 0x3f, 0x1b, 0x3d, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1e, 0x13,
11292         0x91, 0x4b, 0x7e, 0x4c, 0xfe, 0x0a, 0x55, 0x31, 0xfe, 0x8b, 0x55, 0xd9,
11293         0x4b, 0xda, 0x4c, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0x05, 0x72, 0x01,
11294         0xfe, 0x8e, 0x1e, 0xca, 0xfe, 0x19, 0x41, 0x05, 0x72, 0x32, 0x01, 0x08,
11295         0x2a, 0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbe, 0x2d, 0x1d, 0xc0, 0x2d, 0x0d,
11296         0x83, 0x2d, 0x7f, 0x1b, 0xfe, 0x66, 0x15, 0x05, 0x3d, 0x01, 0x08, 0x2a,
11297         0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbd, 0x09, 0x1d, 0x2b, 0x3d, 0x01, 0x08,
11298         0x16, 0xc0, 0x27, 0x25, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49, 0x50, 0x03,
11299         0xb6, 0x1e, 0x83, 0x01, 0x38, 0x06, 0x24, 0x31, 0xa1, 0xfe, 0xbb, 0x45,
11300         0x2d, 0x00, 0xa4, 0x46, 0x07, 0x90, 0x3f, 0x01, 0xfe, 0xf8, 0x15, 0x01,
11301         0xa6, 0x86, 0xfe, 0x4b, 0x45, 0xfe, 0x20, 0x13, 0x01, 0x43, 0x09, 0x82,
11302         0xfe, 0x16, 0x13, 0x03, 0x9a, 0x1e, 0x5d, 0x03, 0x55, 0x1e, 0x31, 0x5e,
11303         0x05, 0x72, 0xfe, 0xc0, 0x5d, 0x01, 0xa7, 0xfe, 0x03, 0x17, 0x03, 0x66,
11304         0x8a, 0x10, 0x66, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01, 0xfe, 0x56,
11305         0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d, 0x27, 0x25, 0xbd,
11306         0x09, 0x07, 0x2b, 0x3d, 0x01, 0xfe, 0xbe, 0x16, 0xfe, 0x42, 0x58, 0xfe,
11307         0xe8, 0x14, 0x01, 0xa6, 0x86, 0xfe, 0x4a, 0xf4, 0x0d, 0x1b, 0x3d, 0xfe,
11308         0x4a, 0xf4, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09, 0x82, 0x4e, 0x05,
11309         0x72, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73,
11310         0x01, 0xfe, 0x84, 0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d,
11311         0x27, 0x25, 0xbd, 0x09, 0x12, 0x2b, 0x3d, 0x01, 0xfe, 0xe8, 0x17, 0x8b,
11312         0xfe, 0xaa, 0x14, 0xfe, 0xb6, 0x14, 0x86, 0xa8, 0xb2, 0x0d, 0x1b, 0x3d,
11313         0xb2, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09, 0x82, 0x4e, 0x05, 0x72,
11314         0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01,
11315         0xfe, 0xc0, 0x19, 0x05, 0x73, 0x13, 0x07, 0x2f, 0xfe, 0xcc, 0x15, 0x17,
11316         0xfe, 0xe2, 0x15, 0x5f, 0xcc, 0x01, 0x08, 0x26, 0x5f, 0x02, 0x8f, 0xfe,
11317         0xde, 0x15, 0x2a, 0xfe, 0xde, 0x15, 0x16, 0xfe, 0xcc, 0x15, 0x5e, 0x32,
11318         0x01, 0x08, 0xfe, 0xd5, 0x10, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
11319         0xad, 0x23, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x02,
11320         0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xad, 0x23, 0x3f, 0xfe, 0x30,
11321         0x56, 0xfe, 0x00, 0x5c, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
11322         0xad, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xfe, 0x00, 0x5e,
11323         0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xad, 0xfe, 0x0b, 0x58,
11324         0x02, 0x0a, 0x66, 0x01, 0x5c, 0x0a, 0x55, 0x01, 0x5c, 0x0a, 0x6f, 0x01,
11325         0x5c, 0x02, 0x01, 0xfe, 0x1e, 0x1f, 0x23, 0x1a, 0xff, 0x03, 0x00, 0x54,
11326         0xfe, 0x00, 0xf4, 0x24, 0x52, 0x0f, 0xfe, 0x00, 0x7c, 0x04, 0xfe, 0x07,
11327         0x7c, 0x3a, 0x0b, 0x0e, 0xfe, 0x00, 0x71, 0xfe, 0xf9, 0x18, 0xfe, 0x7a,
11328         0x19, 0xfe, 0xfb, 0x19, 0xfe, 0x1a, 0xf7, 0x00, 0xfe, 0x1b, 0xf7, 0x00,
11329         0x7a, 0x30, 0x10, 0x68, 0x22, 0x69, 0xd9, 0x6c, 0xda, 0x6d, 0x02, 0xfe,
11330         0x62, 0x08, 0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x77,
11331         0x02, 0x01, 0xc6, 0xfe, 0x42, 0x48, 0x4f, 0x50, 0x45, 0x01, 0x08, 0x16,
11332         0xfe, 0xe0, 0x17, 0x27, 0x25, 0xbe, 0x01, 0x08, 0x16, 0xfe, 0xe0, 0x17,
11333         0x27, 0x25, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x03, 0x9a, 0x1e, 0xfe,
11334         0xda, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfe, 0xd0, 0x13, 0x26, 0x53, 0x12,
11335         0x48, 0xfe, 0x08, 0x17, 0xd1, 0x12, 0x53, 0x12, 0xfe, 0x1e, 0x13, 0x2d,
11336         0xb4, 0x7b, 0xfe, 0x26, 0x17, 0x4d, 0x13, 0x07, 0x1c, 0xb4, 0x90, 0x04,
11337         0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xf1, 0xff, 0x02, 0x83, 0x55,
11338         0x53, 0x1d, 0xfe, 0x12, 0x13, 0xd6, 0xfe, 0x30, 0x00, 0xb0, 0xfe, 0x80,
11339         0x17, 0x1c, 0x63, 0x13, 0x07, 0xfe, 0x56, 0x10, 0x53, 0x0d, 0xfe, 0x16,
11340         0x13, 0xd6, 0xfe, 0x64, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0x64,
11341         0x00, 0x1c, 0x94, 0x13, 0x07, 0xfe, 0x28, 0x10, 0x53, 0x07, 0xfe, 0x60,
11342         0x13, 0xd6, 0xfe, 0xc8, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0xc8,
11343         0x00, 0x1c, 0x95, 0x13, 0x07, 0x71, 0xd6, 0xfe, 0x90, 0x01, 0x48, 0xfe,
11344         0x8c, 0x17, 0x45, 0xf3, 0xfe, 0x43, 0xf4, 0x96, 0xfe, 0x56, 0xf0, 0xfe,
11345         0x9e, 0x17, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x43, 0xf4, 0x94, 0xf6, 0x8b,
11346         0x01, 0xfe, 0x24, 0x16, 0x23, 0x3f, 0xfc, 0xa8, 0x8c, 0x49, 0x48, 0xfe,
11347         0xda, 0x17, 0x62, 0x49, 0xfe, 0x1c, 0x10, 0xa8, 0x8c, 0x80, 0x48, 0xfe,
11348         0xda, 0x17, 0x62, 0x80, 0x71, 0x50, 0x26, 0xfe, 0x4d, 0xf4, 0x00, 0xf7,
11349         0x45, 0x13, 0x07, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58, 0x02, 0x50, 0x13,
11350         0x0d, 0x02, 0x50, 0x3e, 0x78, 0x4f, 0x45, 0x01, 0x08, 0x16, 0xa9, 0x27,
11351         0x25, 0xbe, 0xfe, 0x03, 0xea, 0xfe, 0x7e, 0x01, 0x01, 0x08, 0x16, 0xa9,
11352         0x27, 0x25, 0xfe, 0xe9, 0x0a, 0x01, 0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe,
11353         0xe9, 0x0a, 0xfe, 0x05, 0xea, 0xfe, 0x7f, 0x01, 0x01, 0x08, 0x16, 0xa9,
11354         0x27, 0x25, 0xfe, 0x69, 0x09, 0xfe, 0x02, 0xea, 0xfe, 0x80, 0x01, 0x01,
11355         0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe, 0xe8, 0x08, 0x47, 0xfe, 0x81, 0x01,
11356         0x03, 0xb6, 0x1e, 0x83, 0x01, 0x38, 0x06, 0x24, 0x31, 0xa2, 0x78, 0xf2,
11357         0x53, 0x07, 0x36, 0xfe, 0x34, 0xf4, 0x3f, 0xa1, 0x78, 0x03, 0x9a, 0x1e,
11358         0x83, 0x01, 0x38, 0x06, 0x12, 0x31, 0xf0, 0x4f, 0x45, 0xfe, 0x90, 0x10,
11359         0xfe, 0x40, 0x5a, 0x23, 0x3f, 0xfb, 0x8c, 0x49, 0x48, 0xfe, 0xaa, 0x18,
11360         0x62, 0x49, 0x71, 0x8c, 0x80, 0x48, 0xfe, 0xaa, 0x18, 0x62, 0x80, 0xfe,
11361         0xb4, 0x56, 0xfe, 0x40, 0x5d, 0x01, 0xc6, 0x01, 0xfe, 0xac, 0x1d, 0xfe,
11362         0x02, 0x17, 0xfe, 0xc8, 0x45, 0xfe, 0x5a, 0xf0, 0xfe, 0xc0, 0x18, 0xfe,
11363         0x43, 0x48, 0x2d, 0x93, 0x36, 0xfe, 0x34, 0xf4, 0xfe, 0x00, 0x11, 0xfe,
11364         0x40, 0x10, 0x2d, 0xb4, 0x36, 0xfe, 0x34, 0xf4, 0x04, 0xfe, 0x34, 0x10,
11365         0x2d, 0xfe, 0x0b, 0x00, 0x36, 0x46, 0x63, 0xfe, 0x28, 0x10, 0xfe, 0xc0,
11366         0x49, 0xff, 0x02, 0x00, 0x54, 0xb2, 0xfe, 0x90, 0x01, 0x48, 0xfe, 0xfa,
11367         0x18, 0x45, 0xfe, 0x1c, 0xf4, 0x3f, 0xf3, 0xfe, 0x40, 0xf4, 0x96, 0xfe,
11368         0x56, 0xf0, 0xfe, 0x0c, 0x19, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x40, 0xf4,
11369         0x94, 0xf6, 0x3e, 0x2d, 0x93, 0x4e, 0xd0, 0x0d, 0x21, 0xfe, 0x7f, 0x01,
11370         0xfe, 0xc8, 0x46, 0xfe, 0x24, 0x13, 0x8c, 0x00, 0x5d, 0x26, 0x21, 0xfe,
11371         0x7e, 0x01, 0xfe, 0xc8, 0x45, 0xfe, 0x14, 0x13, 0x21, 0xfe, 0x80, 0x01,
11372         0xfe, 0x48, 0x45, 0xfa, 0x21, 0xfe, 0x81, 0x01, 0xfe, 0xc8, 0x44, 0x4e,
11373         0x26, 0x02, 0x13, 0x07, 0x02, 0x78, 0x45, 0x50, 0x13, 0x0d, 0x02, 0x14,
11374         0x07, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x14, 0x0d, 0x01, 0x08, 0x17,
11375         0xfe, 0x82, 0x19, 0x14, 0x1d, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x5f,
11376         0xfe, 0x89, 0x49, 0x01, 0x08, 0x02, 0x14, 0x07, 0x01, 0x08, 0x17, 0xc1,
11377         0x14, 0x1d, 0x01, 0x08, 0x17, 0xc1, 0x14, 0x07, 0x01, 0x08, 0x17, 0xc1,
11378         0xfe, 0x89, 0x49, 0x01, 0x08, 0x17, 0xc1, 0x5f, 0xfe, 0x89, 0x4a, 0x01,
11379         0x08, 0x02, 0x50, 0x02, 0x14, 0x07, 0x01, 0x08, 0x17, 0x74, 0x14, 0x7f,
11380         0x01, 0x08, 0x17, 0x74, 0x14, 0x12, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x89,
11381         0x49, 0x01, 0x08, 0x17, 0x74, 0x14, 0x00, 0x01, 0x08, 0x17, 0x74, 0xfe,
11382         0x89, 0x4a, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x09, 0x49, 0x01, 0x08, 0x17,
11383         0x74, 0x5f, 0xcc, 0x01, 0x08, 0x02, 0x21, 0xe4, 0x09, 0x07, 0xfe, 0x4c,
11384         0x13, 0xc8, 0x20, 0xe4, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x5f, 0xa1, 0x5e,
11385         0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xcc, 0xff, 0x02, 0x00, 0x10, 0x2f,
11386         0xfe, 0x3e, 0x1a, 0x01, 0x43, 0x09, 0xfe, 0xe3, 0x00, 0xfe, 0x22, 0x13,
11387         0x16, 0xfe, 0x64, 0x1a, 0x26, 0x20, 0x9e, 0x01, 0x41, 0x21, 0x9e, 0x09,
11388         0x07, 0x5d, 0x01, 0x0c, 0x61, 0x07, 0x44, 0x02, 0x0a, 0x5a, 0x01, 0x18,
11389         0xfe, 0x00, 0x40, 0xaa, 0x09, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01,
11390         0x18, 0xaa, 0x0a, 0x67, 0x01, 0xa3, 0x02, 0x0a, 0x9d, 0x01, 0x18, 0xaa,
11391         0xfe, 0x80, 0xe7, 0x1a, 0x09, 0x1a, 0x5d, 0xfe, 0x45, 0x58, 0x01, 0xfe,
11392         0xb2, 0x16, 0xaa, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0xaa, 0x0a, 0x67, 0x01,
11393         0xa3, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x01, 0xfe, 0x7e, 0x1e, 0xfe, 0x80,
11394         0x4c, 0xfe, 0x49, 0xe4, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01, 0x18,
11395         0xfe, 0x80, 0x4c, 0x0a, 0x67, 0x01, 0x5c, 0x02, 0x1c, 0x1a, 0x87, 0x7c,
11396         0xe5, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x24, 0x1c, 0xfe, 0x1d,
11397         0xf7, 0x28, 0xb1, 0xfe, 0x04, 0x1b, 0x01, 0xfe, 0x2a, 0x1c, 0xfa, 0xb3,
11398         0x28, 0x7c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x02, 0xc9, 0x2b, 0xfe,
11399         0xf4, 0x1a, 0xfe, 0xfa, 0x10, 0x1c, 0x1a, 0x87, 0x03, 0xfe, 0x64, 0x01,
11400         0xfe, 0x00, 0xf4, 0x24, 0xfe, 0x18, 0x58, 0x03, 0xfe, 0x66, 0x01, 0xfe,
11401         0x19, 0x58, 0xb3, 0x24, 0x01, 0xfe, 0x0e, 0x1f, 0xfe, 0x30, 0xf4, 0x07,
11402         0xfe, 0x3c, 0x50, 0x7c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79, 0xfe, 0x1c,
11403         0xf7, 0x24, 0xb1, 0xfe, 0x50, 0x1b, 0xfe, 0xd4, 0x14, 0x31, 0x02, 0xc9,
11404         0x2b, 0xfe, 0x26, 0x1b, 0xfe, 0xba, 0x10, 0x1c, 0x1a, 0x87, 0xfe, 0x83,
11405         0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7, 0x54, 0xb1,
11406         0xfe, 0x72, 0x1b, 0xfe, 0xb2, 0x14, 0xfc, 0xb3, 0x54, 0x7c, 0x12, 0xfe,
11407         0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00, 0x02, 0xc9, 0x2b, 0xfe, 0x66, 0x1b,
11408         0xfe, 0x8a, 0x10, 0x1c, 0x1a, 0x87, 0x8b, 0x0f, 0xfe, 0x30, 0x90, 0x04,
11409         0xfe, 0xb0, 0x93, 0x3a, 0x0b, 0xfe, 0x18, 0x58, 0xfe, 0x32, 0x90, 0x04,
11410         0xfe, 0xb2, 0x93, 0x3a, 0x0b, 0xfe, 0x19, 0x58, 0x0e, 0xa8, 0xb3, 0x4a,
11411         0x7c, 0x12, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x4a, 0xb1, 0xfe, 0xc6,
11412         0x1b, 0xfe, 0x5e, 0x14, 0x31, 0x02, 0xc9, 0x2b, 0xfe, 0x96, 0x1b, 0x5c,
11413         0xfe, 0x02, 0xf6, 0x1a, 0x87, 0xfe, 0x18, 0xfe, 0x6a, 0xfe, 0x19, 0xfe,
11414         0x6b, 0x01, 0xfe, 0x1e, 0x1f, 0xfe, 0x1d, 0xf7, 0x65, 0xb1, 0xfe, 0xee,
11415         0x1b, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13, 0xb3, 0x65, 0x3e, 0xfe, 0x83,
11416         0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7, 0x1a, 0xfe, 0x81, 0xe7, 0x1a,
11417         0x15, 0xfe, 0xdd, 0x00, 0x7a, 0x30, 0x02, 0x7a, 0x30, 0xfe, 0x12, 0x45,
11418         0x2b, 0xfe, 0xdc, 0x1b, 0x1f, 0x07, 0x47, 0xb5, 0xc3, 0x05, 0x35, 0xfe,
11419         0x39, 0xf0, 0x75, 0x26, 0x02, 0xfe, 0x7e, 0x18, 0x23, 0x1d, 0x36, 0x13,
11420         0x11, 0x02, 0x87, 0x03, 0xe3, 0x23, 0x07, 0xfe, 0xef, 0x12, 0xfe, 0xe1,
11421         0x10, 0x90, 0x34, 0x60, 0xfe, 0x02, 0x80, 0x09, 0x56, 0xfe, 0x3c, 0x13,
11422         0xfe, 0x82, 0x14, 0xfe, 0x42, 0x13, 0x51, 0xfe, 0x06, 0x83, 0x0a, 0x5a,
11423         0x01, 0x18, 0xcb, 0xfe, 0x3e, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48,
11424         0x01, 0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f,
11425         0x89, 0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18, 0xfe, 0x80, 0x4c, 0x01,
11426         0x85, 0xfe, 0x16, 0x10, 0x09, 0x9b, 0x4e, 0xfe, 0x40, 0x14, 0xfe, 0x24,
11427         0x12, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x52, 0x1c, 0x1c, 0x0d,
11428         0x02, 0xfe, 0x9c, 0xe7, 0x0d, 0x19, 0xfe, 0x15, 0x00, 0x40, 0x8d, 0x30,
11429         0x01, 0xf4, 0x1c, 0x07, 0x02, 0x51, 0xfe, 0x06, 0x83, 0xfe, 0x18, 0x80,
11430         0x61, 0x28, 0x44, 0x15, 0x56, 0x01, 0x85, 0x1c, 0x07, 0x02, 0xfe, 0x38,
11431         0x90, 0xfe, 0xba, 0x90, 0x91, 0xde, 0x7e, 0xdf, 0xfe, 0x48, 0x55, 0x31,
11432         0xfe, 0xc9, 0x55, 0x02, 0x21, 0xb9, 0x88, 0x20, 0xb9, 0x02, 0x0a, 0xba,
11433         0x01, 0x18, 0xfe, 0x41, 0x48, 0x0a, 0x57, 0x01, 0x18, 0xfe, 0x49, 0x44,
11434         0x1b, 0xfe, 0x1e, 0x1d, 0x88, 0x89, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x09,
11435         0x1a, 0xa4, 0x0a, 0x67, 0x01, 0xa3, 0x0a, 0x57, 0x01, 0x18, 0x88, 0x89,
11436         0x02, 0xfe, 0x4e, 0xe4, 0x1d, 0x7b, 0xfe, 0x52, 0x1d, 0x03, 0xfe, 0x90,
11437         0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10, 0xfe, 0x4e, 0xe4, 0xdd, 0x7b,
11438         0xfe, 0x64, 0x1d, 0x03, 0xfe, 0x92, 0x00, 0xd1, 0x12, 0xfe, 0x1a, 0x10,
11439         0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x7b, 0xfe, 0x76, 0x1d, 0x03, 0xfe,
11440         0x94, 0x00, 0xd1, 0x24, 0xfe, 0x08, 0x10, 0x03, 0xfe, 0x96, 0x00, 0xd1,
11441         0x63, 0xfe, 0x4e, 0x45, 0x83, 0xca, 0xff, 0x04, 0x68, 0x54, 0xfe, 0xf1,
11442         0x10, 0x23, 0x49, 0xfe, 0x08, 0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c,
11443         0xfe, 0x1a, 0xf4, 0xfe, 0x00, 0x04, 0x83, 0xb2, 0x1d, 0x48, 0xfe, 0xaa,
11444         0x1d, 0x13, 0x1d, 0x02, 0x09, 0x92, 0xfe, 0x5a, 0xf0, 0xfe, 0xba, 0x1d,
11445         0x2e, 0x93, 0xfe, 0x34, 0x10, 0x09, 0x12, 0xfe, 0x5a, 0xf0, 0xfe, 0xc8,
11446         0x1d, 0x2e, 0xb4, 0xfe, 0x26, 0x10, 0x09, 0x1d, 0x36, 0x2e, 0x63, 0xfe,
11447         0x1a, 0x10, 0x09, 0x0d, 0x36, 0x2e, 0x94, 0xf2, 0x09, 0x07, 0x36, 0x2e,
11448         0x95, 0xa1, 0xc8, 0x02, 0x1f, 0x93, 0x01, 0x42, 0xfe, 0x04, 0xfe, 0x99,
11449         0x03, 0x9c, 0x8b, 0x02, 0x2a, 0xfe, 0x1c, 0x1e, 0xfe, 0x14, 0xf0, 0x08,
11450         0x2f, 0xfe, 0x0c, 0x1e, 0x2a, 0xfe, 0x1c, 0x1e, 0x8f, 0xfe, 0x1c, 0x1e,
11451         0xfe, 0x82, 0xf0, 0xfe, 0x10, 0x1e, 0x02, 0x0f, 0x3f, 0x04, 0xfe, 0x80,
11452         0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x18, 0x80, 0x04, 0xfe, 0x98,
11453         0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x02, 0x80, 0x04, 0xfe, 0x82,
11454         0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06, 0x80, 0x04, 0xfe, 0x86,
11455         0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x1b, 0x80, 0x04, 0xfe, 0x9b,
11456         0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x04, 0x80, 0x04, 0xfe, 0x84,
11457         0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x80, 0x80, 0x04, 0xfe, 0x80,
11458         0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x19, 0x81, 0x04,
11459         0xfe, 0x99, 0x83, 0xfe, 0xca, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06,
11460         0x83, 0x04, 0xfe, 0x86, 0x83, 0xfe, 0xce, 0x47, 0x0b, 0x0e, 0x02, 0x0f,
11461         0xfe, 0x2c, 0x90, 0x04, 0xfe, 0xac, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
11462         0xfe, 0xae, 0x90, 0x04, 0xfe, 0xae, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
11463         0xfe, 0x08, 0x90, 0x04, 0xfe, 0x88, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
11464         0xfe, 0x8a, 0x90, 0x04, 0xfe, 0x8a, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
11465         0xfe, 0x0c, 0x90, 0x04, 0xfe, 0x8c, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
11466         0xfe, 0x8e, 0x90, 0x04, 0xfe, 0x8e, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
11467         0xfe, 0x3c, 0x90, 0x04, 0xfe, 0xbc, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x8b,
11468         0x0f, 0xfe, 0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b, 0x77, 0x0e,
11469         0xa8, 0x02, 0xff, 0x66, 0x00, 0x00,
11470 };
11471
11472 static unsigned short _adv_asc38C1600_size = sizeof(_adv_asc38C1600_buf);       /* 0x1673 */
11473 static ADV_DCNT _adv_asc38C1600_chksum = 0x0604EF77UL;  /* Expanded little-endian checksum. */
11474
11475 /*
11476  * EEPROM Configuration.
11477  *
11478  * All drivers should use this structure to set the default EEPROM
11479  * configuration. The BIOS now uses this structure when it is built.
11480  * Additional structure information can be found in a_condor.h where
11481  * the structure is defined.
11482  *
11483  * The *_Field_IsChar structs are needed to correct for endianness.
11484  * These values are read from the board 16 bits at a time directly
11485  * into the structs. Because some fields are char, the values will be
11486  * in the wrong order. The *_Field_IsChar tells when to flip the
11487  * bytes. Data read and written to PCI memory is automatically swapped
11488  * on big-endian platforms so char fields read as words are actually being
11489  * unswapped on big-endian platforms.
11490  */
11491 static ADVEEP_3550_CONFIG Default_3550_EEPROM_Config __devinitdata = {
11492         ADV_EEPROM_BIOS_ENABLE, /* cfg_lsw */
11493         0x0000,                 /* cfg_msw */
11494         0xFFFF,                 /* disc_enable */
11495         0xFFFF,                 /* wdtr_able */
11496         0xFFFF,                 /* sdtr_able */
11497         0xFFFF,                 /* start_motor */
11498         0xFFFF,                 /* tagqng_able */
11499         0xFFFF,                 /* bios_scan */
11500         0,                      /* scam_tolerant */
11501         7,                      /* adapter_scsi_id */
11502         0,                      /* bios_boot_delay */
11503         3,                      /* scsi_reset_delay */
11504         0,                      /* bios_id_lun */
11505         0,                      /* termination */
11506         0,                      /* reserved1 */
11507         0xFFE7,                 /* bios_ctrl */
11508         0xFFFF,                 /* ultra_able */
11509         0,                      /* reserved2 */
11510         ASC_DEF_MAX_HOST_QNG,   /* max_host_qng */
11511         ASC_DEF_MAX_DVC_QNG,    /* max_dvc_qng */
11512         0,                      /* dvc_cntl */
11513         0,                      /* bug_fix */
11514         0,                      /* serial_number_word1 */
11515         0,                      /* serial_number_word2 */
11516         0,                      /* serial_number_word3 */
11517         0,                      /* check_sum */
11518         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
11519         ,                       /* oem_name[16] */
11520         0,                      /* dvc_err_code */
11521         0,                      /* adv_err_code */
11522         0,                      /* adv_err_addr */
11523         0,                      /* saved_dvc_err_code */
11524         0,                      /* saved_adv_err_code */
11525         0,                      /* saved_adv_err_addr */
11526         0                       /* num_of_err */
11527 };
11528
11529 static ADVEEP_3550_CONFIG ADVEEP_3550_Config_Field_IsChar __devinitdata = {
11530         0,                      /* cfg_lsw */
11531         0,                      /* cfg_msw */
11532         0,                      /* -disc_enable */
11533         0,                      /* wdtr_able */
11534         0,                      /* sdtr_able */
11535         0,                      /* start_motor */
11536         0,                      /* tagqng_able */
11537         0,                      /* bios_scan */
11538         0,                      /* scam_tolerant */
11539         1,                      /* adapter_scsi_id */
11540         1,                      /* bios_boot_delay */
11541         1,                      /* scsi_reset_delay */
11542         1,                      /* bios_id_lun */
11543         1,                      /* termination */
11544         1,                      /* reserved1 */
11545         0,                      /* bios_ctrl */
11546         0,                      /* ultra_able */
11547         0,                      /* reserved2 */
11548         1,                      /* max_host_qng */
11549         1,                      /* max_dvc_qng */
11550         0,                      /* dvc_cntl */
11551         0,                      /* bug_fix */
11552         0,                      /* serial_number_word1 */
11553         0,                      /* serial_number_word2 */
11554         0,                      /* serial_number_word3 */
11555         0,                      /* check_sum */
11556         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
11557         ,                       /* oem_name[16] */
11558         0,                      /* dvc_err_code */
11559         0,                      /* adv_err_code */
11560         0,                      /* adv_err_addr */
11561         0,                      /* saved_dvc_err_code */
11562         0,                      /* saved_adv_err_code */
11563         0,                      /* saved_adv_err_addr */
11564         0                       /* num_of_err */
11565 };
11566
11567 static ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config __devinitdata = {
11568         ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
11569         0x0000,                 /* 01 cfg_msw */
11570         0xFFFF,                 /* 02 disc_enable */
11571         0xFFFF,                 /* 03 wdtr_able */
11572         0x4444,                 /* 04 sdtr_speed1 */
11573         0xFFFF,                 /* 05 start_motor */
11574         0xFFFF,                 /* 06 tagqng_able */
11575         0xFFFF,                 /* 07 bios_scan */
11576         0,                      /* 08 scam_tolerant */
11577         7,                      /* 09 adapter_scsi_id */
11578         0,                      /*    bios_boot_delay */
11579         3,                      /* 10 scsi_reset_delay */
11580         0,                      /*    bios_id_lun */
11581         0,                      /* 11 termination_se */
11582         0,                      /*    termination_lvd */
11583         0xFFE7,                 /* 12 bios_ctrl */
11584         0x4444,                 /* 13 sdtr_speed2 */
11585         0x4444,                 /* 14 sdtr_speed3 */
11586         ASC_DEF_MAX_HOST_QNG,   /* 15 max_host_qng */
11587         ASC_DEF_MAX_DVC_QNG,    /*    max_dvc_qng */
11588         0,                      /* 16 dvc_cntl */
11589         0x4444,                 /* 17 sdtr_speed4 */
11590         0,                      /* 18 serial_number_word1 */
11591         0,                      /* 19 serial_number_word2 */
11592         0,                      /* 20 serial_number_word3 */
11593         0,                      /* 21 check_sum */
11594         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
11595         ,                       /* 22-29 oem_name[16] */
11596         0,                      /* 30 dvc_err_code */
11597         0,                      /* 31 adv_err_code */
11598         0,                      /* 32 adv_err_addr */
11599         0,                      /* 33 saved_dvc_err_code */
11600         0,                      /* 34 saved_adv_err_code */
11601         0,                      /* 35 saved_adv_err_addr */
11602         0,                      /* 36 reserved */
11603         0,                      /* 37 reserved */
11604         0,                      /* 38 reserved */
11605         0,                      /* 39 reserved */
11606         0,                      /* 40 reserved */
11607         0,                      /* 41 reserved */
11608         0,                      /* 42 reserved */
11609         0,                      /* 43 reserved */
11610         0,                      /* 44 reserved */
11611         0,                      /* 45 reserved */
11612         0,                      /* 46 reserved */
11613         0,                      /* 47 reserved */
11614         0,                      /* 48 reserved */
11615         0,                      /* 49 reserved */
11616         0,                      /* 50 reserved */
11617         0,                      /* 51 reserved */
11618         0,                      /* 52 reserved */
11619         0,                      /* 53 reserved */
11620         0,                      /* 54 reserved */
11621         0,                      /* 55 reserved */
11622         0,                      /* 56 cisptr_lsw */
11623         0,                      /* 57 cisprt_msw */
11624         PCI_VENDOR_ID_ASP,      /* 58 subsysvid */
11625         PCI_DEVICE_ID_38C0800_REV1,     /* 59 subsysid */
11626         0,                      /* 60 reserved */
11627         0,                      /* 61 reserved */
11628         0,                      /* 62 reserved */
11629         0                       /* 63 reserved */
11630 };
11631
11632 static ADVEEP_38C0800_CONFIG ADVEEP_38C0800_Config_Field_IsChar __devinitdata = {
11633         0,                      /* 00 cfg_lsw */
11634         0,                      /* 01 cfg_msw */
11635         0,                      /* 02 disc_enable */
11636         0,                      /* 03 wdtr_able */
11637         0,                      /* 04 sdtr_speed1 */
11638         0,                      /* 05 start_motor */
11639         0,                      /* 06 tagqng_able */
11640         0,                      /* 07 bios_scan */
11641         0,                      /* 08 scam_tolerant */
11642         1,                      /* 09 adapter_scsi_id */
11643         1,                      /*    bios_boot_delay */
11644         1,                      /* 10 scsi_reset_delay */
11645         1,                      /*    bios_id_lun */
11646         1,                      /* 11 termination_se */
11647         1,                      /*    termination_lvd */
11648         0,                      /* 12 bios_ctrl */
11649         0,                      /* 13 sdtr_speed2 */
11650         0,                      /* 14 sdtr_speed3 */
11651         1,                      /* 15 max_host_qng */
11652         1,                      /*    max_dvc_qng */
11653         0,                      /* 16 dvc_cntl */
11654         0,                      /* 17 sdtr_speed4 */
11655         0,                      /* 18 serial_number_word1 */
11656         0,                      /* 19 serial_number_word2 */
11657         0,                      /* 20 serial_number_word3 */
11658         0,                      /* 21 check_sum */
11659         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
11660         ,                       /* 22-29 oem_name[16] */
11661         0,                      /* 30 dvc_err_code */
11662         0,                      /* 31 adv_err_code */
11663         0,                      /* 32 adv_err_addr */
11664         0,                      /* 33 saved_dvc_err_code */
11665         0,                      /* 34 saved_adv_err_code */
11666         0,                      /* 35 saved_adv_err_addr */
11667         0,                      /* 36 reserved */
11668         0,                      /* 37 reserved */
11669         0,                      /* 38 reserved */
11670         0,                      /* 39 reserved */
11671         0,                      /* 40 reserved */
11672         0,                      /* 41 reserved */
11673         0,                      /* 42 reserved */
11674         0,                      /* 43 reserved */
11675         0,                      /* 44 reserved */
11676         0,                      /* 45 reserved */
11677         0,                      /* 46 reserved */
11678         0,                      /* 47 reserved */
11679         0,                      /* 48 reserved */
11680         0,                      /* 49 reserved */
11681         0,                      /* 50 reserved */
11682         0,                      /* 51 reserved */
11683         0,                      /* 52 reserved */
11684         0,                      /* 53 reserved */
11685         0,                      /* 54 reserved */
11686         0,                      /* 55 reserved */
11687         0,                      /* 56 cisptr_lsw */
11688         0,                      /* 57 cisprt_msw */
11689         0,                      /* 58 subsysvid */
11690         0,                      /* 59 subsysid */
11691         0,                      /* 60 reserved */
11692         0,                      /* 61 reserved */
11693         0,                      /* 62 reserved */
11694         0                       /* 63 reserved */
11695 };
11696
11697 static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config __devinitdata = {
11698         ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
11699         0x0000,                 /* 01 cfg_msw */
11700         0xFFFF,                 /* 02 disc_enable */
11701         0xFFFF,                 /* 03 wdtr_able */
11702         0x5555,                 /* 04 sdtr_speed1 */
11703         0xFFFF,                 /* 05 start_motor */
11704         0xFFFF,                 /* 06 tagqng_able */
11705         0xFFFF,                 /* 07 bios_scan */
11706         0,                      /* 08 scam_tolerant */
11707         7,                      /* 09 adapter_scsi_id */
11708         0,                      /*    bios_boot_delay */
11709         3,                      /* 10 scsi_reset_delay */
11710         0,                      /*    bios_id_lun */
11711         0,                      /* 11 termination_se */
11712         0,                      /*    termination_lvd */
11713         0xFFE7,                 /* 12 bios_ctrl */
11714         0x5555,                 /* 13 sdtr_speed2 */
11715         0x5555,                 /* 14 sdtr_speed3 */
11716         ASC_DEF_MAX_HOST_QNG,   /* 15 max_host_qng */
11717         ASC_DEF_MAX_DVC_QNG,    /*    max_dvc_qng */
11718         0,                      /* 16 dvc_cntl */
11719         0x5555,                 /* 17 sdtr_speed4 */
11720         0,                      /* 18 serial_number_word1 */
11721         0,                      /* 19 serial_number_word2 */
11722         0,                      /* 20 serial_number_word3 */
11723         0,                      /* 21 check_sum */
11724         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
11725         ,                       /* 22-29 oem_name[16] */
11726         0,                      /* 30 dvc_err_code */
11727         0,                      /* 31 adv_err_code */
11728         0,                      /* 32 adv_err_addr */
11729         0,                      /* 33 saved_dvc_err_code */
11730         0,                      /* 34 saved_adv_err_code */
11731         0,                      /* 35 saved_adv_err_addr */
11732         0,                      /* 36 reserved */
11733         0,                      /* 37 reserved */
11734         0,                      /* 38 reserved */
11735         0,                      /* 39 reserved */
11736         0,                      /* 40 reserved */
11737         0,                      /* 41 reserved */
11738         0,                      /* 42 reserved */
11739         0,                      /* 43 reserved */
11740         0,                      /* 44 reserved */
11741         0,                      /* 45 reserved */
11742         0,                      /* 46 reserved */
11743         0,                      /* 47 reserved */
11744         0,                      /* 48 reserved */
11745         0,                      /* 49 reserved */
11746         0,                      /* 50 reserved */
11747         0,                      /* 51 reserved */
11748         0,                      /* 52 reserved */
11749         0,                      /* 53 reserved */
11750         0,                      /* 54 reserved */
11751         0,                      /* 55 reserved */
11752         0,                      /* 56 cisptr_lsw */
11753         0,                      /* 57 cisprt_msw */
11754         PCI_VENDOR_ID_ASP,      /* 58 subsysvid */
11755         PCI_DEVICE_ID_38C1600_REV1,     /* 59 subsysid */
11756         0,                      /* 60 reserved */
11757         0,                      /* 61 reserved */
11758         0,                      /* 62 reserved */
11759         0                       /* 63 reserved */
11760 };
11761
11762 static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata = {
11763         0,                      /* 00 cfg_lsw */
11764         0,                      /* 01 cfg_msw */
11765         0,                      /* 02 disc_enable */
11766         0,                      /* 03 wdtr_able */
11767         0,                      /* 04 sdtr_speed1 */
11768         0,                      /* 05 start_motor */
11769         0,                      /* 06 tagqng_able */
11770         0,                      /* 07 bios_scan */
11771         0,                      /* 08 scam_tolerant */
11772         1,                      /* 09 adapter_scsi_id */
11773         1,                      /*    bios_boot_delay */
11774         1,                      /* 10 scsi_reset_delay */
11775         1,                      /*    bios_id_lun */
11776         1,                      /* 11 termination_se */
11777         1,                      /*    termination_lvd */
11778         0,                      /* 12 bios_ctrl */
11779         0,                      /* 13 sdtr_speed2 */
11780         0,                      /* 14 sdtr_speed3 */
11781         1,                      /* 15 max_host_qng */
11782         1,                      /*    max_dvc_qng */
11783         0,                      /* 16 dvc_cntl */
11784         0,                      /* 17 sdtr_speed4 */
11785         0,                      /* 18 serial_number_word1 */
11786         0,                      /* 19 serial_number_word2 */
11787         0,                      /* 20 serial_number_word3 */
11788         0,                      /* 21 check_sum */
11789         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
11790         ,                       /* 22-29 oem_name[16] */
11791         0,                      /* 30 dvc_err_code */
11792         0,                      /* 31 adv_err_code */
11793         0,                      /* 32 adv_err_addr */
11794         0,                      /* 33 saved_dvc_err_code */
11795         0,                      /* 34 saved_adv_err_code */
11796         0,                      /* 35 saved_adv_err_addr */
11797         0,                      /* 36 reserved */
11798         0,                      /* 37 reserved */
11799         0,                      /* 38 reserved */
11800         0,                      /* 39 reserved */
11801         0,                      /* 40 reserved */
11802         0,                      /* 41 reserved */
11803         0,                      /* 42 reserved */
11804         0,                      /* 43 reserved */
11805         0,                      /* 44 reserved */
11806         0,                      /* 45 reserved */
11807         0,                      /* 46 reserved */
11808         0,                      /* 47 reserved */
11809         0,                      /* 48 reserved */
11810         0,                      /* 49 reserved */
11811         0,                      /* 50 reserved */
11812         0,                      /* 51 reserved */
11813         0,                      /* 52 reserved */
11814         0,                      /* 53 reserved */
11815         0,                      /* 54 reserved */
11816         0,                      /* 55 reserved */
11817         0,                      /* 56 cisptr_lsw */
11818         0,                      /* 57 cisprt_msw */
11819         0,                      /* 58 subsysvid */
11820         0,                      /* 59 subsysid */
11821         0,                      /* 60 reserved */
11822         0,                      /* 61 reserved */
11823         0,                      /* 62 reserved */
11824         0                       /* 63 reserved */
11825 };
11826
11827 #ifdef CONFIG_PCI
11828 /*
11829  * Initialize the ADV_DVC_VAR structure.
11830  *
11831  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
11832  *
11833  * For a non-fatal error return a warning code. If there are no warnings
11834  * then 0 is returned.
11835  */
11836 static int __devinit
11837 AdvInitGetConfig(struct pci_dev *pdev, asc_board_t *boardp)
11838 {
11839         ADV_DVC_VAR *asc_dvc = &boardp->dvc_var.adv_dvc_var;
11840         unsigned short warn_code = 0;
11841         AdvPortAddr iop_base = asc_dvc->iop_base;
11842         u16 cmd;
11843         int status;
11844
11845         asc_dvc->err_code = 0;
11846
11847         /*
11848          * Save the state of the PCI Configuration Command Register
11849          * "Parity Error Response Control" Bit. If the bit is clear (0),
11850          * in AdvInitAsc3550/38C0800Driver() tell the microcode to ignore
11851          * DMA parity errors.
11852          */
11853         asc_dvc->cfg->control_flag = 0;
11854         pci_read_config_word(pdev, PCI_COMMAND, &cmd);
11855         if ((cmd & PCI_COMMAND_PARITY) == 0)
11856                 asc_dvc->cfg->control_flag |= CONTROL_FLAG_IGNORE_PERR;
11857
11858         asc_dvc->cfg->lib_version = (ADV_LIB_VERSION_MAJOR << 8) |
11859             ADV_LIB_VERSION_MINOR;
11860         asc_dvc->cfg->chip_version =
11861             AdvGetChipVersion(iop_base, asc_dvc->bus_type);
11862
11863         ASC_DBG2(1, "AdvInitGetConfig: iopb_chip_id_1: 0x%x 0x%x\n",
11864                  (ushort)AdvReadByteRegister(iop_base, IOPB_CHIP_ID_1),
11865                  (ushort)ADV_CHIP_ID_BYTE);
11866
11867         ASC_DBG2(1, "AdvInitGetConfig: iopw_chip_id_0: 0x%x 0x%x\n",
11868                  (ushort)AdvReadWordRegister(iop_base, IOPW_CHIP_ID_0),
11869                  (ushort)ADV_CHIP_ID_WORD);
11870
11871         /*
11872          * Reset the chip to start and allow register writes.
11873          */
11874         if (AdvFindSignature(iop_base) == 0) {
11875                 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
11876                 return ADV_ERROR;
11877         } else {
11878                 /*
11879                  * The caller must set 'chip_type' to a valid setting.
11880                  */
11881                 if (asc_dvc->chip_type != ADV_CHIP_ASC3550 &&
11882                     asc_dvc->chip_type != ADV_CHIP_ASC38C0800 &&
11883                     asc_dvc->chip_type != ADV_CHIP_ASC38C1600) {
11884                         asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE;
11885                         return ADV_ERROR;
11886                 }
11887
11888                 /*
11889                  * Reset Chip.
11890                  */
11891                 AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
11892                                      ADV_CTRL_REG_CMD_RESET);
11893                 DvcSleepMilliSecond(100);
11894                 AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
11895                                      ADV_CTRL_REG_CMD_WR_IO_REG);
11896
11897                 if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
11898                         status = AdvInitFrom38C1600EEP(asc_dvc);
11899                 } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
11900                         status = AdvInitFrom38C0800EEP(asc_dvc);
11901                 } else {
11902                         status = AdvInitFrom3550EEP(asc_dvc);
11903                 }
11904                 warn_code |= status;
11905         }
11906
11907         if (warn_code != 0) {
11908                 ASC_PRINT2("AdvInitGetConfig: board %d: warning: 0x%x\n",
11909                            boardp->id, warn_code);
11910         }
11911
11912         if (asc_dvc->err_code) {
11913                 ASC_PRINT2("AdvInitGetConfig: board %d error: err_code 0x%x\n",
11914                      boardp->id, asc_dvc->err_code);
11915         }
11916
11917         return asc_dvc->err_code;
11918 }
11919 #endif
11920
11921 static void AdvBuildCarrierFreelist(struct adv_dvc_var *asc_dvc)
11922 {
11923         ADV_CARR_T *carrp;
11924         ADV_SDCNT buf_size;
11925         ADV_PADDR carr_paddr;
11926
11927         BUG_ON(!asc_dvc->carrier_buf);
11928
11929         carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
11930         asc_dvc->carr_freelist = NULL;
11931         if (carrp == asc_dvc->carrier_buf) {
11932                 buf_size = ADV_CARRIER_BUFSIZE;
11933         } else {
11934                 buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
11935         }
11936
11937         do {
11938                 /* Get physical address of the carrier 'carrp'. */
11939                 ADV_DCNT contig_len = sizeof(ADV_CARR_T);
11940                 carr_paddr = cpu_to_le32(DvcGetPhyAddr(asc_dvc, NULL,
11941                                                        (uchar *)carrp,
11942                                                        (ADV_SDCNT *)&contig_len,
11943                                                        ADV_IS_CARRIER_FLAG));
11944
11945                 buf_size -= sizeof(ADV_CARR_T);
11946
11947                 /*
11948                  * If the current carrier is not physically contiguous, then
11949                  * maybe there was a page crossing. Try the next carrier
11950                  * aligned start address.
11951                  */
11952                 if (contig_len < sizeof(ADV_CARR_T)) {
11953                         carrp++;
11954                         continue;
11955                 }
11956
11957                 carrp->carr_pa = carr_paddr;
11958                 carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
11959
11960                 /*
11961                  * Insert the carrier at the beginning of the freelist.
11962                  */
11963                 carrp->next_vpa =
11964                         cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
11965                 asc_dvc->carr_freelist = carrp;
11966
11967                 carrp++;
11968         } while (buf_size > 0);
11969 }
11970
11971 /*
11972  * Load the Microcode
11973  *
11974  * Write the microcode image to RISC memory starting at address 0.
11975  *
11976  * The microcode is stored compressed in the following format:
11977  *
11978  *  254 word (508 byte) table indexed by byte code followed
11979  *  by the following byte codes:
11980  *
11981  *    1-Byte Code:
11982  *      00: Emit word 0 in table.
11983  *      01: Emit word 1 in table.
11984  *      .
11985  *      FD: Emit word 253 in table.
11986  *
11987  *    Multi-Byte Code:
11988  *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
11989  *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
11990  *
11991  * Returns 0 or an error if the checksum doesn't match
11992  */
11993 static int AdvLoadMicrocode(AdvPortAddr iop_base, unsigned char *buf, int size,
11994                             int memsize, int chksum)
11995 {
11996         int i, j, end, len = 0;
11997         ADV_DCNT sum;
11998
11999         AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
12000
12001         for (i = 253 * 2; i < size; i++) {
12002                 if (buf[i] == 0xff) {
12003                         unsigned short word = (buf[i + 3] << 8) | buf[i + 2];
12004                         for (j = 0; j < buf[i + 1]; j++) {
12005                                 AdvWriteWordAutoIncLram(iop_base, word);
12006                                 len += 2;
12007                         }
12008                         i += 3;
12009                 } else if (buf[i] == 0xfe) {
12010                         unsigned short word = (buf[i + 2] << 8) | buf[i + 1];
12011                         AdvWriteWordAutoIncLram(iop_base, word);
12012                         i += 2;
12013                         len += 2;
12014                 } else {
12015                         unsigned char off = buf[i] * 2;
12016                         unsigned short word = (buf[off + 1] << 8) | buf[off];
12017                         AdvWriteWordAutoIncLram(iop_base, word);
12018                         len += 2;
12019                 }
12020         }
12021
12022         end = len;
12023
12024         while (len < memsize) {
12025                 AdvWriteWordAutoIncLram(iop_base, 0);
12026                 len += 2;
12027         }
12028
12029         /* Verify the microcode checksum. */
12030         sum = 0;
12031         AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
12032
12033         for (len = 0; len < end; len += 2) {
12034                 sum += AdvReadWordAutoIncLram(iop_base);
12035         }
12036
12037         if (sum != chksum)
12038                 return ASC_IERR_MCODE_CHKSUM;
12039
12040         return 0;
12041 }
12042
12043 /*
12044  * Initialize the ASC-3550.
12045  *
12046  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
12047  *
12048  * For a non-fatal error return a warning code. If there are no warnings
12049  * then 0 is returned.
12050  *
12051  * Needed after initialization for error recovery.
12052  */
12053 static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
12054 {
12055         AdvPortAddr iop_base;
12056         ushort warn_code;
12057         int begin_addr;
12058         int end_addr;
12059         ushort code_sum;
12060         int word;
12061         int i;
12062         ushort scsi_cfg1;
12063         uchar tid;
12064         ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
12065         ushort wdtr_able = 0, sdtr_able, tagqng_able;
12066         uchar max_cmd[ADV_MAX_TID + 1];
12067
12068         /* If there is already an error, don't continue. */
12069         if (asc_dvc->err_code != 0)
12070                 return ADV_ERROR;
12071
12072         /*
12073          * The caller must set 'chip_type' to ADV_CHIP_ASC3550.
12074          */
12075         if (asc_dvc->chip_type != ADV_CHIP_ASC3550) {
12076                 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
12077                 return ADV_ERROR;
12078         }
12079
12080         warn_code = 0;
12081         iop_base = asc_dvc->iop_base;
12082
12083         /*
12084          * Save the RISC memory BIOS region before writing the microcode.
12085          * The BIOS may already be loaded and using its RISC LRAM region
12086          * so its region must be saved and restored.
12087          *
12088          * Note: This code makes the assumption, which is currently true,
12089          * that a chip reset does not clear RISC LRAM.
12090          */
12091         for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
12092                 AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
12093                                 bios_mem[i]);
12094         }
12095
12096         /*
12097          * Save current per TID negotiated values.
12098          */
12099         if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == 0x55AA) {
12100                 ushort bios_version, major, minor;
12101
12102                 bios_version =
12103                     bios_mem[(ASC_MC_BIOS_VERSION - ASC_MC_BIOSMEM) / 2];
12104                 major = (bios_version >> 12) & 0xF;
12105                 minor = (bios_version >> 8) & 0xF;
12106                 if (major < 3 || (major == 3 && minor == 1)) {
12107                         /* BIOS 3.1 and earlier location of 'wdtr_able' variable. */
12108                         AdvReadWordLram(iop_base, 0x120, wdtr_able);
12109                 } else {
12110                         AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
12111                 }
12112         }
12113         AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
12114         AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
12115         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
12116                 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
12117                                 max_cmd[tid]);
12118         }
12119
12120         asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc3550_buf,
12121                                         _adv_asc3550_size, ADV_3550_MEMSIZE,
12122                                         _adv_asc3550_chksum);
12123         if (asc_dvc->err_code)
12124                 return ADV_ERROR;
12125
12126         /*
12127          * Restore the RISC memory BIOS region.
12128          */
12129         for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
12130                 AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
12131                                  bios_mem[i]);
12132         }
12133
12134         /*
12135          * Calculate and write the microcode code checksum to the microcode
12136          * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
12137          */
12138         AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
12139         AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
12140         code_sum = 0;
12141         AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
12142         for (word = begin_addr; word < end_addr; word += 2) {
12143                 code_sum += AdvReadWordAutoIncLram(iop_base);
12144         }
12145         AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
12146
12147         /*
12148          * Read and save microcode version and date.
12149          */
12150         AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
12151                         asc_dvc->cfg->mcode_date);
12152         AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
12153                         asc_dvc->cfg->mcode_version);
12154
12155         /*
12156          * Set the chip type to indicate the ASC3550.
12157          */
12158         AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC3550);
12159
12160         /*
12161          * If the PCI Configuration Command Register "Parity Error Response
12162          * Control" Bit was clear (0), then set the microcode variable
12163          * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
12164          * to ignore DMA parity errors.
12165          */
12166         if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
12167                 AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
12168                 word |= CONTROL_FLAG_IGNORE_PERR;
12169                 AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
12170         }
12171
12172         /*
12173          * For ASC-3550, setting the START_CTL_EMFU [3:2] bits sets a FIFO
12174          * threshold of 128 bytes. This register is only accessible to the host.
12175          */
12176         AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
12177                              START_CTL_EMFU | READ_CMD_MRM);
12178
12179         /*
12180          * Microcode operating variables for WDTR, SDTR, and command tag
12181          * queuing will be set in slave_configure() based on what a
12182          * device reports it is capable of in Inquiry byte 7.
12183          *
12184          * If SCSI Bus Resets have been disabled, then directly set
12185          * SDTR and WDTR from the EEPROM configuration. This will allow
12186          * the BIOS and warm boot to work without a SCSI bus hang on
12187          * the Inquiry caused by host and target mismatched DTR values.
12188          * Without the SCSI Bus Reset, before an Inquiry a device can't
12189          * be assumed to be in Asynchronous, Narrow mode.
12190          */
12191         if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
12192                 AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
12193                                  asc_dvc->wdtr_able);
12194                 AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
12195                                  asc_dvc->sdtr_able);
12196         }
12197
12198         /*
12199          * Set microcode operating variables for SDTR_SPEED1, SDTR_SPEED2,
12200          * SDTR_SPEED3, and SDTR_SPEED4 based on the ULTRA EEPROM per TID
12201          * bitmask. These values determine the maximum SDTR speed negotiated
12202          * with a device.
12203          *
12204          * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
12205          * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
12206          * without determining here whether the device supports SDTR.
12207          *
12208          * 4-bit speed  SDTR speed name
12209          * ===========  ===============
12210          * 0000b (0x0)  SDTR disabled
12211          * 0001b (0x1)  5 Mhz
12212          * 0010b (0x2)  10 Mhz
12213          * 0011b (0x3)  20 Mhz (Ultra)
12214          * 0100b (0x4)  40 Mhz (LVD/Ultra2)
12215          * 0101b (0x5)  80 Mhz (LVD2/Ultra3)
12216          * 0110b (0x6)  Undefined
12217          * .
12218          * 1111b (0xF)  Undefined
12219          */
12220         word = 0;
12221         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
12222                 if (ADV_TID_TO_TIDMASK(tid) & asc_dvc->ultra_able) {
12223                         /* Set Ultra speed for TID 'tid'. */
12224                         word |= (0x3 << (4 * (tid % 4)));
12225                 } else {
12226                         /* Set Fast speed for TID 'tid'. */
12227                         word |= (0x2 << (4 * (tid % 4)));
12228                 }
12229                 if (tid == 3) { /* Check if done with sdtr_speed1. */
12230                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, word);
12231                         word = 0;
12232                 } else if (tid == 7) {  /* Check if done with sdtr_speed2. */
12233                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, word);
12234                         word = 0;
12235                 } else if (tid == 11) { /* Check if done with sdtr_speed3. */
12236                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, word);
12237                         word = 0;
12238                 } else if (tid == 15) { /* Check if done with sdtr_speed4. */
12239                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, word);
12240                         /* End of loop. */
12241                 }
12242         }
12243
12244         /*
12245          * Set microcode operating variable for the disconnect per TID bitmask.
12246          */
12247         AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
12248                          asc_dvc->cfg->disc_enable);
12249
12250         /*
12251          * Set SCSI_CFG0 Microcode Default Value.
12252          *
12253          * The microcode will set the SCSI_CFG0 register using this value
12254          * after it is started below.
12255          */
12256         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
12257                          PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
12258                          asc_dvc->chip_scsi_id);
12259
12260         /*
12261          * Determine SCSI_CFG1 Microcode Default Value.
12262          *
12263          * The microcode will set the SCSI_CFG1 register using this value
12264          * after it is started below.
12265          */
12266
12267         /* Read current SCSI_CFG1 Register value. */
12268         scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
12269
12270         /*
12271          * If all three connectors are in use, return an error.
12272          */
12273         if ((scsi_cfg1 & CABLE_ILLEGAL_A) == 0 ||
12274             (scsi_cfg1 & CABLE_ILLEGAL_B) == 0) {
12275                 asc_dvc->err_code |= ASC_IERR_ILLEGAL_CONNECTION;
12276                 return ADV_ERROR;
12277         }
12278
12279         /*
12280          * If the internal narrow cable is reversed all of the SCSI_CTRL
12281          * register signals will be set. Check for and return an error if
12282          * this condition is found.
12283          */
12284         if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
12285                 asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
12286                 return ADV_ERROR;
12287         }
12288
12289         /*
12290          * If this is a differential board and a single-ended device
12291          * is attached to one of the connectors, return an error.
12292          */
12293         if ((scsi_cfg1 & DIFF_MODE) && (scsi_cfg1 & DIFF_SENSE) == 0) {
12294                 asc_dvc->err_code |= ASC_IERR_SINGLE_END_DEVICE;
12295                 return ADV_ERROR;
12296         }
12297
12298         /*
12299          * If automatic termination control is enabled, then set the
12300          * termination value based on a table listed in a_condor.h.
12301          *
12302          * If manual termination was specified with an EEPROM setting
12303          * then 'termination' was set-up in AdvInitFrom3550EEPROM() and
12304          * is ready to be 'ored' into SCSI_CFG1.
12305          */
12306         if (asc_dvc->cfg->termination == 0) {
12307                 /*
12308                  * The software always controls termination by setting TERM_CTL_SEL.
12309                  * If TERM_CTL_SEL were set to 0, the hardware would set termination.
12310                  */
12311                 asc_dvc->cfg->termination |= TERM_CTL_SEL;
12312
12313                 switch (scsi_cfg1 & CABLE_DETECT) {
12314                         /* TERM_CTL_H: on, TERM_CTL_L: on */
12315                 case 0x3:
12316                 case 0x7:
12317                 case 0xB:
12318                 case 0xD:
12319                 case 0xE:
12320                 case 0xF:
12321                         asc_dvc->cfg->termination |= (TERM_CTL_H | TERM_CTL_L);
12322                         break;
12323
12324                         /* TERM_CTL_H: on, TERM_CTL_L: off */
12325                 case 0x1:
12326                 case 0x5:
12327                 case 0x9:
12328                 case 0xA:
12329                 case 0xC:
12330                         asc_dvc->cfg->termination |= TERM_CTL_H;
12331                         break;
12332
12333                         /* TERM_CTL_H: off, TERM_CTL_L: off */
12334                 case 0x2:
12335                 case 0x6:
12336                         break;
12337                 }
12338         }
12339
12340         /*
12341          * Clear any set TERM_CTL_H and TERM_CTL_L bits.
12342          */
12343         scsi_cfg1 &= ~TERM_CTL;
12344
12345         /*
12346          * Invert the TERM_CTL_H and TERM_CTL_L bits and then
12347          * set 'scsi_cfg1'. The TERM_POL bit does not need to be
12348          * referenced, because the hardware internally inverts
12349          * the Termination High and Low bits if TERM_POL is set.
12350          */
12351         scsi_cfg1 |= (TERM_CTL_SEL | (~asc_dvc->cfg->termination & TERM_CTL));
12352
12353         /*
12354          * Set SCSI_CFG1 Microcode Default Value
12355          *
12356          * Set filter value and possibly modified termination control
12357          * bits in the Microcode SCSI_CFG1 Register Value.
12358          *
12359          * The microcode will set the SCSI_CFG1 register using this value
12360          * after it is started below.
12361          */
12362         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1,
12363                          FLTR_DISABLE | scsi_cfg1);
12364
12365         /*
12366          * Set MEM_CFG Microcode Default Value
12367          *
12368          * The microcode will set the MEM_CFG register using this value
12369          * after it is started below.
12370          *
12371          * MEM_CFG may be accessed as a word or byte, but only bits 0-7
12372          * are defined.
12373          *
12374          * ASC-3550 has 8KB internal memory.
12375          */
12376         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
12377                          BIOS_EN | RAM_SZ_8KB);
12378
12379         /*
12380          * Set SEL_MASK Microcode Default Value
12381          *
12382          * The microcode will set the SEL_MASK register using this value
12383          * after it is started below.
12384          */
12385         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
12386                          ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
12387
12388         AdvBuildCarrierFreelist(asc_dvc);
12389
12390         /*
12391          * Set-up the Host->RISC Initiator Command Queue (ICQ).
12392          */
12393
12394         if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
12395                 asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
12396                 return ADV_ERROR;
12397         }
12398         asc_dvc->carr_freelist = (ADV_CARR_T *)
12399             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
12400
12401         /*
12402          * The first command issued will be placed in the stopper carrier.
12403          */
12404         asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
12405
12406         /*
12407          * Set RISC ICQ physical address start value.
12408          */
12409         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
12410
12411         /*
12412          * Set-up the RISC->Host Initiator Response Queue (IRQ).
12413          */
12414         if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
12415                 asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
12416                 return ADV_ERROR;
12417         }
12418         asc_dvc->carr_freelist = (ADV_CARR_T *)
12419             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
12420
12421         /*
12422          * The first command completed by the RISC will be placed in
12423          * the stopper.
12424          *
12425          * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
12426          * completed the RISC will set the ASC_RQ_STOPPER bit.
12427          */
12428         asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
12429
12430         /*
12431          * Set RISC IRQ physical address start value.
12432          */
12433         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
12434         asc_dvc->carr_pending_cnt = 0;
12435
12436         AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
12437                              (ADV_INTR_ENABLE_HOST_INTR |
12438                               ADV_INTR_ENABLE_GLOBAL_INTR));
12439
12440         AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
12441         AdvWriteWordRegister(iop_base, IOPW_PC, word);
12442
12443         /* finally, finally, gentlemen, start your engine */
12444         AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
12445
12446         /*
12447          * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
12448          * Resets should be performed. The RISC has to be running
12449          * to issue a SCSI Bus Reset.
12450          */
12451         if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
12452                 /*
12453                  * If the BIOS Signature is present in memory, restore the
12454                  * BIOS Handshake Configuration Table and do not perform
12455                  * a SCSI Bus Reset.
12456                  */
12457                 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
12458                     0x55AA) {
12459                         /*
12460                          * Restore per TID negotiated values.
12461                          */
12462                         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
12463                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
12464                         AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
12465                                          tagqng_able);
12466                         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
12467                                 AdvWriteByteLram(iop_base,
12468                                                  ASC_MC_NUMBER_OF_MAX_CMD + tid,
12469                                                  max_cmd[tid]);
12470                         }
12471                 } else {
12472                         if (AdvResetSB(asc_dvc) != ADV_TRUE) {
12473                                 warn_code = ASC_WARN_BUSRESET_ERROR;
12474                         }
12475                 }
12476         }
12477
12478         return warn_code;
12479 }
12480
12481 /*
12482  * Initialize the ASC-38C0800.
12483  *
12484  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
12485  *
12486  * For a non-fatal error return a warning code. If there are no warnings
12487  * then 0 is returned.
12488  *
12489  * Needed after initialization for error recovery.
12490  */
12491 static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
12492 {
12493         AdvPortAddr iop_base;
12494         ushort warn_code;
12495         int begin_addr;
12496         int end_addr;
12497         ushort code_sum;
12498         int word;
12499         int i;
12500         ushort scsi_cfg1;
12501         uchar byte;
12502         uchar tid;
12503         ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
12504         ushort wdtr_able, sdtr_able, tagqng_able;
12505         uchar max_cmd[ADV_MAX_TID + 1];
12506
12507         /* If there is already an error, don't continue. */
12508         if (asc_dvc->err_code != 0)
12509                 return ADV_ERROR;
12510
12511         /*
12512          * The caller must set 'chip_type' to ADV_CHIP_ASC38C0800.
12513          */
12514         if (asc_dvc->chip_type != ADV_CHIP_ASC38C0800) {
12515                 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
12516                 return ADV_ERROR;
12517         }
12518
12519         warn_code = 0;
12520         iop_base = asc_dvc->iop_base;
12521
12522         /*
12523          * Save the RISC memory BIOS region before writing the microcode.
12524          * The BIOS may already be loaded and using its RISC LRAM region
12525          * so its region must be saved and restored.
12526          *
12527          * Note: This code makes the assumption, which is currently true,
12528          * that a chip reset does not clear RISC LRAM.
12529          */
12530         for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
12531                 AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
12532                                 bios_mem[i]);
12533         }
12534
12535         /*
12536          * Save current per TID negotiated values.
12537          */
12538         AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
12539         AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
12540         AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
12541         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
12542                 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
12543                                 max_cmd[tid]);
12544         }
12545
12546         /*
12547          * RAM BIST (RAM Built-In Self Test)
12548          *
12549          * Address : I/O base + offset 0x38h register (byte).
12550          * Function: Bit 7-6(RW) : RAM mode
12551          *                          Normal Mode   : 0x00
12552          *                          Pre-test Mode : 0x40
12553          *                          RAM Test Mode : 0x80
12554          *           Bit 5       : unused
12555          *           Bit 4(RO)   : Done bit
12556          *           Bit 3-0(RO) : Status
12557          *                          Host Error    : 0x08
12558          *                          Int_RAM Error : 0x04
12559          *                          RISC Error    : 0x02
12560          *                          SCSI Error    : 0x01
12561          *                          No Error      : 0x00
12562          *
12563          * Note: RAM BIST code should be put right here, before loading the
12564          * microcode and after saving the RISC memory BIOS region.
12565          */
12566
12567         /*
12568          * LRAM Pre-test
12569          *
12570          * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
12571          * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
12572          * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
12573          * to NORMAL_MODE, return an error too.
12574          */
12575         for (i = 0; i < 2; i++) {
12576                 AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
12577                 DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
12578                 byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
12579                 if ((byte & RAM_TEST_DONE) == 0
12580                     || (byte & 0x0F) != PRE_TEST_VALUE) {
12581                         asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
12582                         return ADV_ERROR;
12583                 }
12584
12585                 AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
12586                 DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
12587                 if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
12588                     != NORMAL_VALUE) {
12589                         asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
12590                         return ADV_ERROR;
12591                 }
12592         }
12593
12594         /*
12595          * LRAM Test - It takes about 1.5 ms to run through the test.
12596          *
12597          * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
12598          * If Done bit not set or Status not 0, save register byte, set the
12599          * err_code, and return an error.
12600          */
12601         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
12602         DvcSleepMilliSecond(10);        /* Wait for 10ms before checking status. */
12603
12604         byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
12605         if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
12606                 /* Get here if Done bit not set or Status not 0. */
12607                 asc_dvc->bist_err_code = byte;  /* for BIOS display message */
12608                 asc_dvc->err_code = ASC_IERR_BIST_RAM_TEST;
12609                 return ADV_ERROR;
12610         }
12611
12612         /* We need to reset back to normal mode after LRAM test passes. */
12613         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
12614
12615         asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc38C0800_buf,
12616                                  _adv_asc38C0800_size, ADV_38C0800_MEMSIZE,
12617                                  _adv_asc38C0800_chksum);
12618         if (asc_dvc->err_code)
12619                 return ADV_ERROR;
12620
12621         /*
12622          * Restore the RISC memory BIOS region.
12623          */
12624         for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
12625                 AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
12626                                  bios_mem[i]);
12627         }
12628
12629         /*
12630          * Calculate and write the microcode code checksum to the microcode
12631          * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
12632          */
12633         AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
12634         AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
12635         code_sum = 0;
12636         AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
12637         for (word = begin_addr; word < end_addr; word += 2) {
12638                 code_sum += AdvReadWordAutoIncLram(iop_base);
12639         }
12640         AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
12641
12642         /*
12643          * Read microcode version and date.
12644          */
12645         AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
12646                         asc_dvc->cfg->mcode_date);
12647         AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
12648                         asc_dvc->cfg->mcode_version);
12649
12650         /*
12651          * Set the chip type to indicate the ASC38C0800.
12652          */
12653         AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C0800);
12654
12655         /*
12656          * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
12657          * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
12658          * cable detection and then we are able to read C_DET[3:0].
12659          *
12660          * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
12661          * Microcode Default Value' section below.
12662          */
12663         scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
12664         AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1,
12665                              scsi_cfg1 | DIS_TERM_DRV);
12666
12667         /*
12668          * If the PCI Configuration Command Register "Parity Error Response
12669          * Control" Bit was clear (0), then set the microcode variable
12670          * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
12671          * to ignore DMA parity errors.
12672          */
12673         if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
12674                 AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
12675                 word |= CONTROL_FLAG_IGNORE_PERR;
12676                 AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
12677         }
12678
12679         /*
12680          * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2]
12681          * bits for the default FIFO threshold.
12682          *
12683          * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes.
12684          *
12685          * For DMA Errata #4 set the BC_THRESH_ENB bit.
12686          */
12687         AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
12688                              BC_THRESH_ENB | FIFO_THRESH_80B | START_CTL_TH |
12689                              READ_CMD_MRM);
12690
12691         /*
12692          * Microcode operating variables for WDTR, SDTR, and command tag
12693          * queuing will be set in slave_configure() based on what a
12694          * device reports it is capable of in Inquiry byte 7.
12695          *
12696          * If SCSI Bus Resets have been disabled, then directly set
12697          * SDTR and WDTR from the EEPROM configuration. This will allow
12698          * the BIOS and warm boot to work without a SCSI bus hang on
12699          * the Inquiry caused by host and target mismatched DTR values.
12700          * Without the SCSI Bus Reset, before an Inquiry a device can't
12701          * be assumed to be in Asynchronous, Narrow mode.
12702          */
12703         if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
12704                 AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
12705                                  asc_dvc->wdtr_able);
12706                 AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
12707                                  asc_dvc->sdtr_able);
12708         }
12709
12710         /*
12711          * Set microcode operating variables for DISC and SDTR_SPEED1,
12712          * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
12713          * configuration values.
12714          *
12715          * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
12716          * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
12717          * without determining here whether the device supports SDTR.
12718          */
12719         AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
12720                          asc_dvc->cfg->disc_enable);
12721         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
12722         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
12723         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
12724         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
12725
12726         /*
12727          * Set SCSI_CFG0 Microcode Default Value.
12728          *
12729          * The microcode will set the SCSI_CFG0 register using this value
12730          * after it is started below.
12731          */
12732         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
12733                          PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
12734                          asc_dvc->chip_scsi_id);
12735
12736         /*
12737          * Determine SCSI_CFG1 Microcode Default Value.
12738          *
12739          * The microcode will set the SCSI_CFG1 register using this value
12740          * after it is started below.
12741          */
12742
12743         /* Read current SCSI_CFG1 Register value. */
12744         scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
12745
12746         /*
12747          * If the internal narrow cable is reversed all of the SCSI_CTRL
12748          * register signals will be set. Check for and return an error if
12749          * this condition is found.
12750          */
12751         if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
12752                 asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
12753                 return ADV_ERROR;
12754         }
12755
12756         /*
12757          * All kind of combinations of devices attached to one of four
12758          * connectors are acceptable except HVD device attached. For example,
12759          * LVD device can be attached to SE connector while SE device attached
12760          * to LVD connector.  If LVD device attached to SE connector, it only
12761          * runs up to Ultra speed.
12762          *
12763          * If an HVD device is attached to one of LVD connectors, return an
12764          * error.  However, there is no way to detect HVD device attached to
12765          * SE connectors.
12766          */
12767         if (scsi_cfg1 & HVD) {
12768                 asc_dvc->err_code = ASC_IERR_HVD_DEVICE;
12769                 return ADV_ERROR;
12770         }
12771
12772         /*
12773          * If either SE or LVD automatic termination control is enabled, then
12774          * set the termination value based on a table listed in a_condor.h.
12775          *
12776          * If manual termination was specified with an EEPROM setting then
12777          * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready
12778          * to be 'ored' into SCSI_CFG1.
12779          */
12780         if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
12781                 /* SE automatic termination control is enabled. */
12782                 switch (scsi_cfg1 & C_DET_SE) {
12783                         /* TERM_SE_HI: on, TERM_SE_LO: on */
12784                 case 0x1:
12785                 case 0x2:
12786                 case 0x3:
12787                         asc_dvc->cfg->termination |= TERM_SE;
12788                         break;
12789
12790                         /* TERM_SE_HI: on, TERM_SE_LO: off */
12791                 case 0x0:
12792                         asc_dvc->cfg->termination |= TERM_SE_HI;
12793                         break;
12794                 }
12795         }
12796
12797         if ((asc_dvc->cfg->termination & TERM_LVD) == 0) {
12798                 /* LVD automatic termination control is enabled. */
12799                 switch (scsi_cfg1 & C_DET_LVD) {
12800                         /* TERM_LVD_HI: on, TERM_LVD_LO: on */
12801                 case 0x4:
12802                 case 0x8:
12803                 case 0xC:
12804                         asc_dvc->cfg->termination |= TERM_LVD;
12805                         break;
12806
12807                         /* TERM_LVD_HI: off, TERM_LVD_LO: off */
12808                 case 0x0:
12809                         break;
12810                 }
12811         }
12812
12813         /*
12814          * Clear any set TERM_SE and TERM_LVD bits.
12815          */
12816         scsi_cfg1 &= (~TERM_SE & ~TERM_LVD);
12817
12818         /*
12819          * Invert the TERM_SE and TERM_LVD bits and then set 'scsi_cfg1'.
12820          */
12821         scsi_cfg1 |= (~asc_dvc->cfg->termination & 0xF0);
12822
12823         /*
12824          * Clear BIG_ENDIAN, DIS_TERM_DRV, Terminator Polarity and HVD/LVD/SE
12825          * bits and set possibly modified termination control bits in the
12826          * Microcode SCSI_CFG1 Register Value.
12827          */
12828         scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL & ~HVD_LVD_SE);
12829
12830         /*
12831          * Set SCSI_CFG1 Microcode Default Value
12832          *
12833          * Set possibly modified termination control and reset DIS_TERM_DRV
12834          * bits in the Microcode SCSI_CFG1 Register Value.
12835          *
12836          * The microcode will set the SCSI_CFG1 register using this value
12837          * after it is started below.
12838          */
12839         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
12840
12841         /*
12842          * Set MEM_CFG Microcode Default Value
12843          *
12844          * The microcode will set the MEM_CFG register using this value
12845          * after it is started below.
12846          *
12847          * MEM_CFG may be accessed as a word or byte, but only bits 0-7
12848          * are defined.
12849          *
12850          * ASC-38C0800 has 16KB internal memory.
12851          */
12852         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
12853                          BIOS_EN | RAM_SZ_16KB);
12854
12855         /*
12856          * Set SEL_MASK Microcode Default Value
12857          *
12858          * The microcode will set the SEL_MASK register using this value
12859          * after it is started below.
12860          */
12861         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
12862                          ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
12863
12864         AdvBuildCarrierFreelist(asc_dvc);
12865
12866         /*
12867          * Set-up the Host->RISC Initiator Command Queue (ICQ).
12868          */
12869
12870         if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
12871                 asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
12872                 return ADV_ERROR;
12873         }
12874         asc_dvc->carr_freelist = (ADV_CARR_T *)
12875             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
12876
12877         /*
12878          * The first command issued will be placed in the stopper carrier.
12879          */
12880         asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
12881
12882         /*
12883          * Set RISC ICQ physical address start value.
12884          * carr_pa is LE, must be native before write
12885          */
12886         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
12887
12888         /*
12889          * Set-up the RISC->Host Initiator Response Queue (IRQ).
12890          */
12891         if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
12892                 asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
12893                 return ADV_ERROR;
12894         }
12895         asc_dvc->carr_freelist = (ADV_CARR_T *)
12896             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
12897
12898         /*
12899          * The first command completed by the RISC will be placed in
12900          * the stopper.
12901          *
12902          * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
12903          * completed the RISC will set the ASC_RQ_STOPPER bit.
12904          */
12905         asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
12906
12907         /*
12908          * Set RISC IRQ physical address start value.
12909          *
12910          * carr_pa is LE, must be native before write *
12911          */
12912         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
12913         asc_dvc->carr_pending_cnt = 0;
12914
12915         AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
12916                              (ADV_INTR_ENABLE_HOST_INTR |
12917                               ADV_INTR_ENABLE_GLOBAL_INTR));
12918
12919         AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
12920         AdvWriteWordRegister(iop_base, IOPW_PC, word);
12921
12922         /* finally, finally, gentlemen, start your engine */
12923         AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
12924
12925         /*
12926          * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
12927          * Resets should be performed. The RISC has to be running
12928          * to issue a SCSI Bus Reset.
12929          */
12930         if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
12931                 /*
12932                  * If the BIOS Signature is present in memory, restore the
12933                  * BIOS Handshake Configuration Table and do not perform
12934                  * a SCSI Bus Reset.
12935                  */
12936                 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
12937                     0x55AA) {
12938                         /*
12939                          * Restore per TID negotiated values.
12940                          */
12941                         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
12942                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
12943                         AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
12944                                          tagqng_able);
12945                         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
12946                                 AdvWriteByteLram(iop_base,
12947                                                  ASC_MC_NUMBER_OF_MAX_CMD + tid,
12948                                                  max_cmd[tid]);
12949                         }
12950                 } else {
12951                         if (AdvResetSB(asc_dvc) != ADV_TRUE) {
12952                                 warn_code = ASC_WARN_BUSRESET_ERROR;
12953                         }
12954                 }
12955         }
12956
12957         return warn_code;
12958 }
12959
12960 /*
12961  * Initialize the ASC-38C1600.
12962  *
12963  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
12964  *
12965  * For a non-fatal error return a warning code. If there are no warnings
12966  * then 0 is returned.
12967  *
12968  * Needed after initialization for error recovery.
12969  */
12970 static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
12971 {
12972         AdvPortAddr iop_base;
12973         ushort warn_code;
12974         int begin_addr;
12975         int end_addr;
12976         ushort code_sum;
12977         long word;
12978         int i;
12979         ushort scsi_cfg1;
12980         uchar byte;
12981         uchar tid;
12982         ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
12983         ushort wdtr_able, sdtr_able, ppr_able, tagqng_able;
12984         uchar max_cmd[ASC_MAX_TID + 1];
12985
12986         /* If there is already an error, don't continue. */
12987         if (asc_dvc->err_code != 0) {
12988                 return ADV_ERROR;
12989         }
12990
12991         /*
12992          * The caller must set 'chip_type' to ADV_CHIP_ASC38C1600.
12993          */
12994         if (asc_dvc->chip_type != ADV_CHIP_ASC38C1600) {
12995                 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
12996                 return ADV_ERROR;
12997         }
12998
12999         warn_code = 0;
13000         iop_base = asc_dvc->iop_base;
13001
13002         /*
13003          * Save the RISC memory BIOS region before writing the microcode.
13004          * The BIOS may already be loaded and using its RISC LRAM region
13005          * so its region must be saved and restored.
13006          *
13007          * Note: This code makes the assumption, which is currently true,
13008          * that a chip reset does not clear RISC LRAM.
13009          */
13010         for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
13011                 AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
13012                                 bios_mem[i]);
13013         }
13014
13015         /*
13016          * Save current per TID negotiated values.
13017          */
13018         AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
13019         AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
13020         AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
13021         AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
13022         for (tid = 0; tid <= ASC_MAX_TID; tid++) {
13023                 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
13024                                 max_cmd[tid]);
13025         }
13026
13027         /*
13028          * RAM BIST (Built-In Self Test)
13029          *
13030          * Address : I/O base + offset 0x38h register (byte).
13031          * Function: Bit 7-6(RW) : RAM mode
13032          *                          Normal Mode   : 0x00
13033          *                          Pre-test Mode : 0x40
13034          *                          RAM Test Mode : 0x80
13035          *           Bit 5       : unused
13036          *           Bit 4(RO)   : Done bit
13037          *           Bit 3-0(RO) : Status
13038          *                          Host Error    : 0x08
13039          *                          Int_RAM Error : 0x04
13040          *                          RISC Error    : 0x02
13041          *                          SCSI Error    : 0x01
13042          *                          No Error      : 0x00
13043          *
13044          * Note: RAM BIST code should be put right here, before loading the
13045          * microcode and after saving the RISC memory BIOS region.
13046          */
13047
13048         /*
13049          * LRAM Pre-test
13050          *
13051          * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
13052          * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
13053          * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
13054          * to NORMAL_MODE, return an error too.
13055          */
13056         for (i = 0; i < 2; i++) {
13057                 AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
13058                 DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
13059                 byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
13060                 if ((byte & RAM_TEST_DONE) == 0
13061                     || (byte & 0x0F) != PRE_TEST_VALUE) {
13062                         asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
13063                         return ADV_ERROR;
13064                 }
13065
13066                 AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
13067                 DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
13068                 if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
13069                     != NORMAL_VALUE) {
13070                         asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
13071                         return ADV_ERROR;
13072                 }
13073         }
13074
13075         /*
13076          * LRAM Test - It takes about 1.5 ms to run through the test.
13077          *
13078          * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
13079          * If Done bit not set or Status not 0, save register byte, set the
13080          * err_code, and return an error.
13081          */
13082         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
13083         DvcSleepMilliSecond(10);        /* Wait for 10ms before checking status. */
13084
13085         byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
13086         if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
13087                 /* Get here if Done bit not set or Status not 0. */
13088                 asc_dvc->bist_err_code = byte;  /* for BIOS display message */
13089                 asc_dvc->err_code = ASC_IERR_BIST_RAM_TEST;
13090                 return ADV_ERROR;
13091         }
13092
13093         /* We need to reset back to normal mode after LRAM test passes. */
13094         AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
13095
13096         asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc38C1600_buf,
13097                                  _adv_asc38C1600_size, ADV_38C1600_MEMSIZE,
13098                                  _adv_asc38C1600_chksum);
13099         if (asc_dvc->err_code)
13100                 return ADV_ERROR;
13101
13102         /*
13103          * Restore the RISC memory BIOS region.
13104          */
13105         for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
13106                 AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
13107                                  bios_mem[i]);
13108         }
13109
13110         /*
13111          * Calculate and write the microcode code checksum to the microcode
13112          * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
13113          */
13114         AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
13115         AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
13116         code_sum = 0;
13117         AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
13118         for (word = begin_addr; word < end_addr; word += 2) {
13119                 code_sum += AdvReadWordAutoIncLram(iop_base);
13120         }
13121         AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
13122
13123         /*
13124          * Read microcode version and date.
13125          */
13126         AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
13127                         asc_dvc->cfg->mcode_date);
13128         AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
13129                         asc_dvc->cfg->mcode_version);
13130
13131         /*
13132          * Set the chip type to indicate the ASC38C1600.
13133          */
13134         AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C1600);
13135
13136         /*
13137          * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
13138          * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
13139          * cable detection and then we are able to read C_DET[3:0].
13140          *
13141          * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
13142          * Microcode Default Value' section below.
13143          */
13144         scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
13145         AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1,
13146                              scsi_cfg1 | DIS_TERM_DRV);
13147
13148         /*
13149          * If the PCI Configuration Command Register "Parity Error Response
13150          * Control" Bit was clear (0), then set the microcode variable
13151          * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
13152          * to ignore DMA parity errors.
13153          */
13154         if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
13155                 AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
13156                 word |= CONTROL_FLAG_IGNORE_PERR;
13157                 AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
13158         }
13159
13160         /*
13161          * If the BIOS control flag AIPP (Asynchronous Information
13162          * Phase Protection) disable bit is not set, then set the firmware
13163          * 'control_flag' CONTROL_FLAG_ENABLE_AIPP bit to enable
13164          * AIPP checking and encoding.
13165          */
13166         if ((asc_dvc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0) {
13167                 AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
13168                 word |= CONTROL_FLAG_ENABLE_AIPP;
13169                 AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
13170         }
13171
13172         /*
13173          * For ASC-38C1600 use DMA_CFG0 default values: FIFO_THRESH_80B [6:4],
13174          * and START_CTL_TH [3:2].
13175          */
13176         AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
13177                              FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
13178
13179         /*
13180          * Microcode operating variables for WDTR, SDTR, and command tag
13181          * queuing will be set in slave_configure() based on what a
13182          * device reports it is capable of in Inquiry byte 7.
13183          *
13184          * If SCSI Bus Resets have been disabled, then directly set
13185          * SDTR and WDTR from the EEPROM configuration. This will allow
13186          * the BIOS and warm boot to work without a SCSI bus hang on
13187          * the Inquiry caused by host and target mismatched DTR values.
13188          * Without the SCSI Bus Reset, before an Inquiry a device can't
13189          * be assumed to be in Asynchronous, Narrow mode.
13190          */
13191         if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
13192                 AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
13193                                  asc_dvc->wdtr_able);
13194                 AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
13195                                  asc_dvc->sdtr_able);
13196         }
13197
13198         /*
13199          * Set microcode operating variables for DISC and SDTR_SPEED1,
13200          * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
13201          * configuration values.
13202          *
13203          * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
13204          * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
13205          * without determining here whether the device supports SDTR.
13206          */
13207         AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
13208                          asc_dvc->cfg->disc_enable);
13209         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
13210         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
13211         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
13212         AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
13213
13214         /*
13215          * Set SCSI_CFG0 Microcode Default Value.
13216          *
13217          * The microcode will set the SCSI_CFG0 register using this value
13218          * after it is started below.
13219          */
13220         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
13221                          PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
13222                          asc_dvc->chip_scsi_id);
13223
13224         /*
13225          * Calculate SCSI_CFG1 Microcode Default Value.
13226          *
13227          * The microcode will set the SCSI_CFG1 register using this value
13228          * after it is started below.
13229          *
13230          * Each ASC-38C1600 function has only two cable detect bits.
13231          * The bus mode override bits are in IOPB_SOFT_OVER_WR.
13232          */
13233         scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
13234
13235         /*
13236          * If the cable is reversed all of the SCSI_CTRL register signals
13237          * will be set. Check for and return an error if this condition is
13238          * found.
13239          */
13240         if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
13241                 asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
13242                 return ADV_ERROR;
13243         }
13244
13245         /*
13246          * Each ASC-38C1600 function has two connectors. Only an HVD device
13247          * can not be connected to either connector. An LVD device or SE device
13248          * may be connected to either connecor. If an SE device is connected,
13249          * then at most Ultra speed (20 Mhz) can be used on both connectors.
13250          *
13251          * If an HVD device is attached, return an error.
13252          */
13253         if (scsi_cfg1 & HVD) {
13254                 asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
13255                 return ADV_ERROR;
13256         }
13257
13258         /*
13259          * Each function in the ASC-38C1600 uses only the SE cable detect and
13260          * termination because there are two connectors for each function. Each
13261          * function may use either LVD or SE mode. Corresponding the SE automatic
13262          * termination control EEPROM bits are used for each function. Each
13263          * function has its own EEPROM. If SE automatic control is enabled for
13264          * the function, then set the termination value based on a table listed
13265          * in a_condor.h.
13266          *
13267          * If manual termination is specified in the EEPROM for the function,
13268          * then 'termination' was set-up in AscInitFrom38C1600EEPROM() and is
13269          * ready to be 'ored' into SCSI_CFG1.
13270          */
13271         if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
13272                 struct pci_dev *pdev = adv_dvc_to_pdev(asc_dvc);
13273                 /* SE automatic termination control is enabled. */
13274                 switch (scsi_cfg1 & C_DET_SE) {
13275                         /* TERM_SE_HI: on, TERM_SE_LO: on */
13276                 case 0x1:
13277                 case 0x2:
13278                 case 0x3:
13279                         asc_dvc->cfg->termination |= TERM_SE;
13280                         break;
13281
13282                 case 0x0:
13283                         if (PCI_FUNC(pdev->devfn) == 0) {
13284                                 /* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */
13285                         } else {
13286                                 /* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */
13287                                 asc_dvc->cfg->termination |= TERM_SE_HI;
13288                         }
13289                         break;
13290                 }
13291         }
13292
13293         /*
13294          * Clear any set TERM_SE bits.
13295          */
13296         scsi_cfg1 &= ~TERM_SE;
13297
13298         /*
13299          * Invert the TERM_SE bits and then set 'scsi_cfg1'.
13300          */
13301         scsi_cfg1 |= (~asc_dvc->cfg->termination & TERM_SE);
13302
13303         /*
13304          * Clear Big Endian and Terminator Polarity bits and set possibly
13305          * modified termination control bits in the Microcode SCSI_CFG1
13306          * Register Value.
13307          *
13308          * Big Endian bit is not used even on big endian machines.
13309          */
13310         scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL);
13311
13312         /*
13313          * Set SCSI_CFG1 Microcode Default Value
13314          *
13315          * Set possibly modified termination control bits in the Microcode
13316          * SCSI_CFG1 Register Value.
13317          *
13318          * The microcode will set the SCSI_CFG1 register using this value
13319          * after it is started below.
13320          */
13321         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
13322
13323         /*
13324          * Set MEM_CFG Microcode Default Value
13325          *
13326          * The microcode will set the MEM_CFG register using this value
13327          * after it is started below.
13328          *
13329          * MEM_CFG may be accessed as a word or byte, but only bits 0-7
13330          * are defined.
13331          *
13332          * ASC-38C1600 has 32KB internal memory.
13333          *
13334          * XXX - Since ASC38C1600 Rev.3 has a Local RAM failure issue, we come
13335          * out a special 16K Adv Library and Microcode version. After the issue
13336          * resolved, we should turn back to the 32K support. Both a_condor.h and
13337          * mcode.sas files also need to be updated.
13338          *
13339          * AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
13340          *  BIOS_EN | RAM_SZ_32KB);
13341          */
13342         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
13343                          BIOS_EN | RAM_SZ_16KB);
13344
13345         /*
13346          * Set SEL_MASK Microcode Default Value
13347          *
13348          * The microcode will set the SEL_MASK register using this value
13349          * after it is started below.
13350          */
13351         AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
13352                          ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
13353
13354         AdvBuildCarrierFreelist(asc_dvc);
13355
13356         /*
13357          * Set-up the Host->RISC Initiator Command Queue (ICQ).
13358          */
13359         if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
13360                 asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
13361                 return ADV_ERROR;
13362         }
13363         asc_dvc->carr_freelist = (ADV_CARR_T *)
13364             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
13365
13366         /*
13367          * The first command issued will be placed in the stopper carrier.
13368          */
13369         asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
13370
13371         /*
13372          * Set RISC ICQ physical address start value. Initialize the
13373          * COMMA register to the same value otherwise the RISC will
13374          * prematurely detect a command is available.
13375          */
13376         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
13377         AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
13378                               le32_to_cpu(asc_dvc->icq_sp->carr_pa));
13379
13380         /*
13381          * Set-up the RISC->Host Initiator Response Queue (IRQ).
13382          */
13383         if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
13384                 asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
13385                 return ADV_ERROR;
13386         }
13387         asc_dvc->carr_freelist = (ADV_CARR_T *)
13388             ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
13389
13390         /*
13391          * The first command completed by the RISC will be placed in
13392          * the stopper.
13393          *
13394          * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
13395          * completed the RISC will set the ASC_RQ_STOPPER bit.
13396          */
13397         asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
13398
13399         /*
13400          * Set RISC IRQ physical address start value.
13401          */
13402         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
13403         asc_dvc->carr_pending_cnt = 0;
13404
13405         AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
13406                              (ADV_INTR_ENABLE_HOST_INTR |
13407                               ADV_INTR_ENABLE_GLOBAL_INTR));
13408         AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
13409         AdvWriteWordRegister(iop_base, IOPW_PC, word);
13410
13411         /* finally, finally, gentlemen, start your engine */
13412         AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
13413
13414         /*
13415          * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
13416          * Resets should be performed. The RISC has to be running
13417          * to issue a SCSI Bus Reset.
13418          */
13419         if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
13420                 /*
13421                  * If the BIOS Signature is present in memory, restore the
13422                  * per TID microcode operating variables.
13423                  */
13424                 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
13425                     0x55AA) {
13426                         /*
13427                          * Restore per TID negotiated values.
13428                          */
13429                         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
13430                         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
13431                         AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
13432                         AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
13433                                          tagqng_able);
13434                         for (tid = 0; tid <= ASC_MAX_TID; tid++) {
13435                                 AdvWriteByteLram(iop_base,
13436                                                  ASC_MC_NUMBER_OF_MAX_CMD + tid,
13437                                                  max_cmd[tid]);
13438                         }
13439                 } else {
13440                         if (AdvResetSB(asc_dvc) != ADV_TRUE) {
13441                                 warn_code = ASC_WARN_BUSRESET_ERROR;
13442                         }
13443                 }
13444         }
13445
13446         return warn_code;
13447 }
13448
13449 /*
13450  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
13451  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
13452  * all of this is done.
13453  *
13454  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
13455  *
13456  * For a non-fatal error return a warning code. If there are no warnings
13457  * then 0 is returned.
13458  *
13459  * Note: Chip is stopped on entry.
13460  */
13461 static int __devinit AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
13462 {
13463         AdvPortAddr iop_base;
13464         ushort warn_code;
13465         ADVEEP_3550_CONFIG eep_config;
13466
13467         iop_base = asc_dvc->iop_base;
13468
13469         warn_code = 0;
13470
13471         /*
13472          * Read the board's EEPROM configuration.
13473          *
13474          * Set default values if a bad checksum is found.
13475          */
13476         if (AdvGet3550EEPConfig(iop_base, &eep_config) != eep_config.check_sum) {
13477                 warn_code |= ASC_WARN_EEPROM_CHKSUM;
13478
13479                 /*
13480                  * Set EEPROM default values.
13481                  */
13482                 memcpy(&eep_config, &Default_3550_EEPROM_Config,
13483                         sizeof(ADVEEP_3550_CONFIG));
13484
13485                 /*
13486                  * Assume the 6 byte board serial number that was read from
13487                  * EEPROM is correct even if the EEPROM checksum failed.
13488                  */
13489                 eep_config.serial_number_word3 =
13490                     AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
13491
13492                 eep_config.serial_number_word2 =
13493                     AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
13494
13495                 eep_config.serial_number_word1 =
13496                     AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
13497
13498                 AdvSet3550EEPConfig(iop_base, &eep_config);
13499         }
13500         /*
13501          * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
13502          * EEPROM configuration that was read.
13503          *
13504          * This is the mapping of EEPROM fields to Adv Library fields.
13505          */
13506         asc_dvc->wdtr_able = eep_config.wdtr_able;
13507         asc_dvc->sdtr_able = eep_config.sdtr_able;
13508         asc_dvc->ultra_able = eep_config.ultra_able;
13509         asc_dvc->tagqng_able = eep_config.tagqng_able;
13510         asc_dvc->cfg->disc_enable = eep_config.disc_enable;
13511         asc_dvc->max_host_qng = eep_config.max_host_qng;
13512         asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13513         asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
13514         asc_dvc->start_motor = eep_config.start_motor;
13515         asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
13516         asc_dvc->bios_ctrl = eep_config.bios_ctrl;
13517         asc_dvc->no_scam = eep_config.scam_tolerant;
13518         asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
13519         asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
13520         asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
13521
13522         /*
13523          * Set the host maximum queuing (max. 253, min. 16) and the per device
13524          * maximum queuing (max. 63, min. 4).
13525          */
13526         if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
13527                 eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13528         } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
13529                 /* If the value is zero, assume it is uninitialized. */
13530                 if (eep_config.max_host_qng == 0) {
13531                         eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13532                 } else {
13533                         eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
13534                 }
13535         }
13536
13537         if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
13538                 eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13539         } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
13540                 /* If the value is zero, assume it is uninitialized. */
13541                 if (eep_config.max_dvc_qng == 0) {
13542                         eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13543                 } else {
13544                         eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
13545                 }
13546         }
13547
13548         /*
13549          * If 'max_dvc_qng' is greater than 'max_host_qng', then
13550          * set 'max_dvc_qng' to 'max_host_qng'.
13551          */
13552         if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
13553                 eep_config.max_dvc_qng = eep_config.max_host_qng;
13554         }
13555
13556         /*
13557          * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
13558          * values based on possibly adjusted EEPROM values.
13559          */
13560         asc_dvc->max_host_qng = eep_config.max_host_qng;
13561         asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13562
13563         /*
13564          * If the EEPROM 'termination' field is set to automatic (0), then set
13565          * the ADV_DVC_CFG 'termination' field to automatic also.
13566          *
13567          * If the termination is specified with a non-zero 'termination'
13568          * value check that a legal value is set and set the ADV_DVC_CFG
13569          * 'termination' field appropriately.
13570          */
13571         if (eep_config.termination == 0) {
13572                 asc_dvc->cfg->termination = 0;  /* auto termination */
13573         } else {
13574                 /* Enable manual control with low off / high off. */
13575                 if (eep_config.termination == 1) {
13576                         asc_dvc->cfg->termination = TERM_CTL_SEL;
13577
13578                         /* Enable manual control with low off / high on. */
13579                 } else if (eep_config.termination == 2) {
13580                         asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H;
13581
13582                         /* Enable manual control with low on / high on. */
13583                 } else if (eep_config.termination == 3) {
13584                         asc_dvc->cfg->termination =
13585                             TERM_CTL_SEL | TERM_CTL_H | TERM_CTL_L;
13586                 } else {
13587                         /*
13588                          * The EEPROM 'termination' field contains a bad value. Use
13589                          * automatic termination instead.
13590                          */
13591                         asc_dvc->cfg->termination = 0;
13592                         warn_code |= ASC_WARN_EEPROM_TERMINATION;
13593                 }
13594         }
13595
13596         return warn_code;
13597 }
13598
13599 /*
13600  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
13601  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
13602  * all of this is done.
13603  *
13604  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
13605  *
13606  * For a non-fatal error return a warning code. If there are no warnings
13607  * then 0 is returned.
13608  *
13609  * Note: Chip is stopped on entry.
13610  */
13611 static int __devinit AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
13612 {
13613         AdvPortAddr iop_base;
13614         ushort warn_code;
13615         ADVEEP_38C0800_CONFIG eep_config;
13616         uchar tid, termination;
13617         ushort sdtr_speed = 0;
13618
13619         iop_base = asc_dvc->iop_base;
13620
13621         warn_code = 0;
13622
13623         /*
13624          * Read the board's EEPROM configuration.
13625          *
13626          * Set default values if a bad checksum is found.
13627          */
13628         if (AdvGet38C0800EEPConfig(iop_base, &eep_config) !=
13629             eep_config.check_sum) {
13630                 warn_code |= ASC_WARN_EEPROM_CHKSUM;
13631
13632                 /*
13633                  * Set EEPROM default values.
13634                  */
13635                 memcpy(&eep_config, &Default_38C0800_EEPROM_Config,
13636                         sizeof(ADVEEP_38C0800_CONFIG));
13637
13638                 /*
13639                  * Assume the 6 byte board serial number that was read from
13640                  * EEPROM is correct even if the EEPROM checksum failed.
13641                  */
13642                 eep_config.serial_number_word3 =
13643                     AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
13644
13645                 eep_config.serial_number_word2 =
13646                     AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
13647
13648                 eep_config.serial_number_word1 =
13649                     AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
13650
13651                 AdvSet38C0800EEPConfig(iop_base, &eep_config);
13652         }
13653         /*
13654          * Set ADV_DVC_VAR and ADV_DVC_CFG variables from the
13655          * EEPROM configuration that was read.
13656          *
13657          * This is the mapping of EEPROM fields to Adv Library fields.
13658          */
13659         asc_dvc->wdtr_able = eep_config.wdtr_able;
13660         asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
13661         asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
13662         asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
13663         asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
13664         asc_dvc->tagqng_able = eep_config.tagqng_able;
13665         asc_dvc->cfg->disc_enable = eep_config.disc_enable;
13666         asc_dvc->max_host_qng = eep_config.max_host_qng;
13667         asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13668         asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
13669         asc_dvc->start_motor = eep_config.start_motor;
13670         asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
13671         asc_dvc->bios_ctrl = eep_config.bios_ctrl;
13672         asc_dvc->no_scam = eep_config.scam_tolerant;
13673         asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
13674         asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
13675         asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
13676
13677         /*
13678          * For every Target ID if any of its 'sdtr_speed[1234]' bits
13679          * are set, then set an 'sdtr_able' bit for it.
13680          */
13681         asc_dvc->sdtr_able = 0;
13682         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
13683                 if (tid == 0) {
13684                         sdtr_speed = asc_dvc->sdtr_speed1;
13685                 } else if (tid == 4) {
13686                         sdtr_speed = asc_dvc->sdtr_speed2;
13687                 } else if (tid == 8) {
13688                         sdtr_speed = asc_dvc->sdtr_speed3;
13689                 } else if (tid == 12) {
13690                         sdtr_speed = asc_dvc->sdtr_speed4;
13691                 }
13692                 if (sdtr_speed & ADV_MAX_TID) {
13693                         asc_dvc->sdtr_able |= (1 << tid);
13694                 }
13695                 sdtr_speed >>= 4;
13696         }
13697
13698         /*
13699          * Set the host maximum queuing (max. 253, min. 16) and the per device
13700          * maximum queuing (max. 63, min. 4).
13701          */
13702         if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
13703                 eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13704         } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
13705                 /* If the value is zero, assume it is uninitialized. */
13706                 if (eep_config.max_host_qng == 0) {
13707                         eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13708                 } else {
13709                         eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
13710                 }
13711         }
13712
13713         if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
13714                 eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13715         } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
13716                 /* If the value is zero, assume it is uninitialized. */
13717                 if (eep_config.max_dvc_qng == 0) {
13718                         eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13719                 } else {
13720                         eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
13721                 }
13722         }
13723
13724         /*
13725          * If 'max_dvc_qng' is greater than 'max_host_qng', then
13726          * set 'max_dvc_qng' to 'max_host_qng'.
13727          */
13728         if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
13729                 eep_config.max_dvc_qng = eep_config.max_host_qng;
13730         }
13731
13732         /*
13733          * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
13734          * values based on possibly adjusted EEPROM values.
13735          */
13736         asc_dvc->max_host_qng = eep_config.max_host_qng;
13737         asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13738
13739         /*
13740          * If the EEPROM 'termination' field is set to automatic (0), then set
13741          * the ADV_DVC_CFG 'termination' field to automatic also.
13742          *
13743          * If the termination is specified with a non-zero 'termination'
13744          * value check that a legal value is set and set the ADV_DVC_CFG
13745          * 'termination' field appropriately.
13746          */
13747         if (eep_config.termination_se == 0) {
13748                 termination = 0;        /* auto termination for SE */
13749         } else {
13750                 /* Enable manual control with low off / high off. */
13751                 if (eep_config.termination_se == 1) {
13752                         termination = 0;
13753
13754                         /* Enable manual control with low off / high on. */
13755                 } else if (eep_config.termination_se == 2) {
13756                         termination = TERM_SE_HI;
13757
13758                         /* Enable manual control with low on / high on. */
13759                 } else if (eep_config.termination_se == 3) {
13760                         termination = TERM_SE;
13761                 } else {
13762                         /*
13763                          * The EEPROM 'termination_se' field contains a bad value.
13764                          * Use automatic termination instead.
13765                          */
13766                         termination = 0;
13767                         warn_code |= ASC_WARN_EEPROM_TERMINATION;
13768                 }
13769         }
13770
13771         if (eep_config.termination_lvd == 0) {
13772                 asc_dvc->cfg->termination = termination;        /* auto termination for LVD */
13773         } else {
13774                 /* Enable manual control with low off / high off. */
13775                 if (eep_config.termination_lvd == 1) {
13776                         asc_dvc->cfg->termination = termination;
13777
13778                         /* Enable manual control with low off / high on. */
13779                 } else if (eep_config.termination_lvd == 2) {
13780                         asc_dvc->cfg->termination = termination | TERM_LVD_HI;
13781
13782                         /* Enable manual control with low on / high on. */
13783                 } else if (eep_config.termination_lvd == 3) {
13784                         asc_dvc->cfg->termination = termination | TERM_LVD;
13785                 } else {
13786                         /*
13787                          * The EEPROM 'termination_lvd' field contains a bad value.
13788                          * Use automatic termination instead.
13789                          */
13790                         asc_dvc->cfg->termination = termination;
13791                         warn_code |= ASC_WARN_EEPROM_TERMINATION;
13792                 }
13793         }
13794
13795         return warn_code;
13796 }
13797
13798 /*
13799  * Read the board's EEPROM configuration. Set fields in ASC_DVC_VAR and
13800  * ASC_DVC_CFG based on the EEPROM settings. The chip is stopped while
13801  * all of this is done.
13802  *
13803  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
13804  *
13805  * For a non-fatal error return a warning code. If there are no warnings
13806  * then 0 is returned.
13807  *
13808  * Note: Chip is stopped on entry.
13809  */
13810 static int __devinit AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
13811 {
13812         AdvPortAddr iop_base;
13813         ushort warn_code;
13814         ADVEEP_38C1600_CONFIG eep_config;
13815         uchar tid, termination;
13816         ushort sdtr_speed = 0;
13817
13818         iop_base = asc_dvc->iop_base;
13819
13820         warn_code = 0;
13821
13822         /*
13823          * Read the board's EEPROM configuration.
13824          *
13825          * Set default values if a bad checksum is found.
13826          */
13827         if (AdvGet38C1600EEPConfig(iop_base, &eep_config) !=
13828             eep_config.check_sum) {
13829                 struct pci_dev *pdev = adv_dvc_to_pdev(asc_dvc);
13830                 warn_code |= ASC_WARN_EEPROM_CHKSUM;
13831
13832                 /*
13833                  * Set EEPROM default values.
13834                  */
13835                 memcpy(&eep_config, &Default_38C1600_EEPROM_Config,
13836                         sizeof(ADVEEP_38C1600_CONFIG));
13837
13838                 if (PCI_FUNC(pdev->devfn) != 0) {
13839                         u8 ints;
13840                         /*
13841                          * Disable Bit 14 (BIOS_ENABLE) to fix SPARC Ultra 60
13842                          * and old Mac system booting problem. The Expansion
13843                          * ROM must be disabled in Function 1 for these systems
13844                          */
13845                         eep_config.cfg_lsw &= ~ADV_EEPROM_BIOS_ENABLE;
13846                         /*
13847                          * Clear the INTAB (bit 11) if the GPIO 0 input
13848                          * indicates the Function 1 interrupt line is wired
13849                          * to INTB.
13850                          *
13851                          * Set/Clear Bit 11 (INTAB) from the GPIO bit 0 input:
13852                          *   1 - Function 1 interrupt line wired to INT A.
13853                          *   0 - Function 1 interrupt line wired to INT B.
13854                          *
13855                          * Note: Function 0 is always wired to INTA.
13856                          * Put all 5 GPIO bits in input mode and then read
13857                          * their input values.
13858                          */
13859                         AdvWriteByteRegister(iop_base, IOPB_GPIO_CNTL, 0);
13860                         ints = AdvReadByteRegister(iop_base, IOPB_GPIO_DATA);
13861                         if ((ints & 0x01) == 0)
13862                                 eep_config.cfg_lsw &= ~ADV_EEPROM_INTAB;
13863                 }
13864
13865                 /*
13866                  * Assume the 6 byte board serial number that was read from
13867                  * EEPROM is correct even if the EEPROM checksum failed.
13868                  */
13869                 eep_config.serial_number_word3 =
13870                         AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
13871                 eep_config.serial_number_word2 =
13872                         AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
13873                 eep_config.serial_number_word1 =
13874                         AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
13875
13876                 AdvSet38C1600EEPConfig(iop_base, &eep_config);
13877         }
13878
13879         /*
13880          * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
13881          * EEPROM configuration that was read.
13882          *
13883          * This is the mapping of EEPROM fields to Adv Library fields.
13884          */
13885         asc_dvc->wdtr_able = eep_config.wdtr_able;
13886         asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
13887         asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
13888         asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
13889         asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
13890         asc_dvc->ppr_able = 0;
13891         asc_dvc->tagqng_able = eep_config.tagqng_able;
13892         asc_dvc->cfg->disc_enable = eep_config.disc_enable;
13893         asc_dvc->max_host_qng = eep_config.max_host_qng;
13894         asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13895         asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ASC_MAX_TID);
13896         asc_dvc->start_motor = eep_config.start_motor;
13897         asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
13898         asc_dvc->bios_ctrl = eep_config.bios_ctrl;
13899         asc_dvc->no_scam = eep_config.scam_tolerant;
13900
13901         /*
13902          * For every Target ID if any of its 'sdtr_speed[1234]' bits
13903          * are set, then set an 'sdtr_able' bit for it.
13904          */
13905         asc_dvc->sdtr_able = 0;
13906         for (tid = 0; tid <= ASC_MAX_TID; tid++) {
13907                 if (tid == 0) {
13908                         sdtr_speed = asc_dvc->sdtr_speed1;
13909                 } else if (tid == 4) {
13910                         sdtr_speed = asc_dvc->sdtr_speed2;
13911                 } else if (tid == 8) {
13912                         sdtr_speed = asc_dvc->sdtr_speed3;
13913                 } else if (tid == 12) {
13914                         sdtr_speed = asc_dvc->sdtr_speed4;
13915                 }
13916                 if (sdtr_speed & ASC_MAX_TID) {
13917                         asc_dvc->sdtr_able |= (1 << tid);
13918                 }
13919                 sdtr_speed >>= 4;
13920         }
13921
13922         /*
13923          * Set the host maximum queuing (max. 253, min. 16) and the per device
13924          * maximum queuing (max. 63, min. 4).
13925          */
13926         if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
13927                 eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13928         } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
13929                 /* If the value is zero, assume it is uninitialized. */
13930                 if (eep_config.max_host_qng == 0) {
13931                         eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13932                 } else {
13933                         eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
13934                 }
13935         }
13936
13937         if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
13938                 eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13939         } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
13940                 /* If the value is zero, assume it is uninitialized. */
13941                 if (eep_config.max_dvc_qng == 0) {
13942                         eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13943                 } else {
13944                         eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
13945                 }
13946         }
13947
13948         /*
13949          * If 'max_dvc_qng' is greater than 'max_host_qng', then
13950          * set 'max_dvc_qng' to 'max_host_qng'.
13951          */
13952         if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
13953                 eep_config.max_dvc_qng = eep_config.max_host_qng;
13954         }
13955
13956         /*
13957          * Set ASC_DVC_VAR 'max_host_qng' and ASC_DVC_VAR 'max_dvc_qng'
13958          * values based on possibly adjusted EEPROM values.
13959          */
13960         asc_dvc->max_host_qng = eep_config.max_host_qng;
13961         asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13962
13963         /*
13964          * If the EEPROM 'termination' field is set to automatic (0), then set
13965          * the ASC_DVC_CFG 'termination' field to automatic also.
13966          *
13967          * If the termination is specified with a non-zero 'termination'
13968          * value check that a legal value is set and set the ASC_DVC_CFG
13969          * 'termination' field appropriately.
13970          */
13971         if (eep_config.termination_se == 0) {
13972                 termination = 0;        /* auto termination for SE */
13973         } else {
13974                 /* Enable manual control with low off / high off. */
13975                 if (eep_config.termination_se == 1) {
13976                         termination = 0;
13977
13978                         /* Enable manual control with low off / high on. */
13979                 } else if (eep_config.termination_se == 2) {
13980                         termination = TERM_SE_HI;
13981
13982                         /* Enable manual control with low on / high on. */
13983                 } else if (eep_config.termination_se == 3) {
13984                         termination = TERM_SE;
13985                 } else {
13986                         /*
13987                          * The EEPROM 'termination_se' field contains a bad value.
13988                          * Use automatic termination instead.
13989                          */
13990                         termination = 0;
13991                         warn_code |= ASC_WARN_EEPROM_TERMINATION;
13992                 }
13993         }
13994
13995         if (eep_config.termination_lvd == 0) {
13996                 asc_dvc->cfg->termination = termination;        /* auto termination for LVD */
13997         } else {
13998                 /* Enable manual control with low off / high off. */
13999                 if (eep_config.termination_lvd == 1) {
14000                         asc_dvc->cfg->termination = termination;
14001
14002                         /* Enable manual control with low off / high on. */
14003                 } else if (eep_config.termination_lvd == 2) {
14004                         asc_dvc->cfg->termination = termination | TERM_LVD_HI;
14005
14006                         /* Enable manual control with low on / high on. */
14007                 } else if (eep_config.termination_lvd == 3) {
14008                         asc_dvc->cfg->termination = termination | TERM_LVD;
14009                 } else {
14010                         /*
14011                          * The EEPROM 'termination_lvd' field contains a bad value.
14012                          * Use automatic termination instead.
14013                          */
14014                         asc_dvc->cfg->termination = termination;
14015                         warn_code |= ASC_WARN_EEPROM_TERMINATION;
14016                 }
14017         }
14018
14019         return warn_code;
14020 }
14021
14022 /*
14023  * Read EEPROM configuration into the specified buffer.
14024  *
14025  * Return a checksum based on the EEPROM configuration read.
14026  */
14027 static ushort __devinit
14028 AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
14029 {
14030         ushort wval, chksum;
14031         ushort *wbuf;
14032         int eep_addr;
14033         ushort *charfields;
14034
14035         charfields = (ushort *)&ADVEEP_3550_Config_Field_IsChar;
14036         wbuf = (ushort *)cfg_buf;
14037         chksum = 0;
14038
14039         for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
14040              eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
14041                 wval = AdvReadEEPWord(iop_base, eep_addr);
14042                 chksum += wval; /* Checksum is calculated from word values. */
14043                 if (*charfields++) {
14044                         *wbuf = le16_to_cpu(wval);
14045                 } else {
14046                         *wbuf = wval;
14047                 }
14048         }
14049         /* Read checksum word. */
14050         *wbuf = AdvReadEEPWord(iop_base, eep_addr);
14051         wbuf++;
14052         charfields++;
14053
14054         /* Read rest of EEPROM not covered by the checksum. */
14055         for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
14056              eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
14057                 *wbuf = AdvReadEEPWord(iop_base, eep_addr);
14058                 if (*charfields++) {
14059                         *wbuf = le16_to_cpu(*wbuf);
14060                 }
14061         }
14062         return chksum;
14063 }
14064
14065 /*
14066  * Read EEPROM configuration into the specified buffer.
14067  *
14068  * Return a checksum based on the EEPROM configuration read.
14069  */
14070 static ushort __devinit
14071 AdvGet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
14072 {
14073         ushort wval, chksum;
14074         ushort *wbuf;
14075         int eep_addr;
14076         ushort *charfields;
14077
14078         charfields = (ushort *)&ADVEEP_38C0800_Config_Field_IsChar;
14079         wbuf = (ushort *)cfg_buf;
14080         chksum = 0;
14081
14082         for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
14083              eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
14084                 wval = AdvReadEEPWord(iop_base, eep_addr);
14085                 chksum += wval; /* Checksum is calculated from word values. */
14086                 if (*charfields++) {
14087                         *wbuf = le16_to_cpu(wval);
14088                 } else {
14089                         *wbuf = wval;
14090                 }
14091         }
14092         /* Read checksum word. */
14093         *wbuf = AdvReadEEPWord(iop_base, eep_addr);
14094         wbuf++;
14095         charfields++;
14096
14097         /* Read rest of EEPROM not covered by the checksum. */
14098         for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
14099              eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
14100                 *wbuf = AdvReadEEPWord(iop_base, eep_addr);
14101                 if (*charfields++) {
14102                         *wbuf = le16_to_cpu(*wbuf);
14103                 }
14104         }
14105         return chksum;
14106 }
14107
14108 /*
14109  * Read EEPROM configuration into the specified buffer.
14110  *
14111  * Return a checksum based on the EEPROM configuration read.
14112  */
14113 static ushort __devinit
14114 AdvGet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
14115 {
14116         ushort wval, chksum;
14117         ushort *wbuf;
14118         int eep_addr;
14119         ushort *charfields;
14120
14121         charfields = (ushort *)&ADVEEP_38C1600_Config_Field_IsChar;
14122         wbuf = (ushort *)cfg_buf;
14123         chksum = 0;
14124
14125         for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
14126              eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
14127                 wval = AdvReadEEPWord(iop_base, eep_addr);
14128                 chksum += wval; /* Checksum is calculated from word values. */
14129                 if (*charfields++) {
14130                         *wbuf = le16_to_cpu(wval);
14131                 } else {
14132                         *wbuf = wval;
14133                 }
14134         }
14135         /* Read checksum word. */
14136         *wbuf = AdvReadEEPWord(iop_base, eep_addr);
14137         wbuf++;
14138         charfields++;
14139
14140         /* Read rest of EEPROM not covered by the checksum. */
14141         for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
14142              eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
14143                 *wbuf = AdvReadEEPWord(iop_base, eep_addr);
14144                 if (*charfields++) {
14145                         *wbuf = le16_to_cpu(*wbuf);
14146                 }
14147         }
14148         return chksum;
14149 }
14150
14151 /*
14152  * Read the EEPROM from specified location
14153  */
14154 static ushort __devinit AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
14155 {
14156         AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14157                              ASC_EEP_CMD_READ | eep_word_addr);
14158         AdvWaitEEPCmd(iop_base);
14159         return AdvReadWordRegister(iop_base, IOPW_EE_DATA);
14160 }
14161
14162 /*
14163  * Wait for EEPROM command to complete
14164  */
14165 static void __devinit AdvWaitEEPCmd(AdvPortAddr iop_base)
14166 {
14167         int eep_delay_ms;
14168
14169         for (eep_delay_ms = 0; eep_delay_ms < ADV_EEP_DELAY_MS; eep_delay_ms++) {
14170                 if (AdvReadWordRegister(iop_base, IOPW_EE_CMD) &
14171                     ASC_EEP_CMD_DONE) {
14172                         break;
14173                 }
14174                 DvcSleepMilliSecond(1);
14175         }
14176         if ((AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE) ==
14177             0) {
14178                 ASC_ASSERT(0);
14179         }
14180         return;
14181 }
14182
14183 /*
14184  * Write the EEPROM from 'cfg_buf'.
14185  */
14186 void __devinit
14187 AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
14188 {
14189         ushort *wbuf;
14190         ushort addr, chksum;
14191         ushort *charfields;
14192
14193         wbuf = (ushort *)cfg_buf;
14194         charfields = (ushort *)&ADVEEP_3550_Config_Field_IsChar;
14195         chksum = 0;
14196
14197         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
14198         AdvWaitEEPCmd(iop_base);
14199
14200         /*
14201          * Write EEPROM from word 0 to word 20.
14202          */
14203         for (addr = ADV_EEP_DVC_CFG_BEGIN;
14204              addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
14205                 ushort word;
14206
14207                 if (*charfields++) {
14208                         word = cpu_to_le16(*wbuf);
14209                 } else {
14210                         word = *wbuf;
14211                 }
14212                 chksum += *wbuf;        /* Checksum is calculated from word values. */
14213                 AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
14214                 AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14215                                      ASC_EEP_CMD_WRITE | addr);
14216                 AdvWaitEEPCmd(iop_base);
14217                 DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
14218         }
14219
14220         /*
14221          * Write EEPROM checksum at word 21.
14222          */
14223         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
14224         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
14225         AdvWaitEEPCmd(iop_base);
14226         wbuf++;
14227         charfields++;
14228
14229         /*
14230          * Write EEPROM OEM name at words 22 to 29.
14231          */
14232         for (addr = ADV_EEP_DVC_CTL_BEGIN;
14233              addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
14234                 ushort word;
14235
14236                 if (*charfields++) {
14237                         word = cpu_to_le16(*wbuf);
14238                 } else {
14239                         word = *wbuf;
14240                 }
14241                 AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
14242                 AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14243                                      ASC_EEP_CMD_WRITE | addr);
14244                 AdvWaitEEPCmd(iop_base);
14245         }
14246         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
14247         AdvWaitEEPCmd(iop_base);
14248         return;
14249 }
14250
14251 /*
14252  * Write the EEPROM from 'cfg_buf'.
14253  */
14254 void __devinit
14255 AdvSet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
14256 {
14257         ushort *wbuf;
14258         ushort *charfields;
14259         ushort addr, chksum;
14260
14261         wbuf = (ushort *)cfg_buf;
14262         charfields = (ushort *)&ADVEEP_38C0800_Config_Field_IsChar;
14263         chksum = 0;
14264
14265         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
14266         AdvWaitEEPCmd(iop_base);
14267
14268         /*
14269          * Write EEPROM from word 0 to word 20.
14270          */
14271         for (addr = ADV_EEP_DVC_CFG_BEGIN;
14272              addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
14273                 ushort word;
14274
14275                 if (*charfields++) {
14276                         word = cpu_to_le16(*wbuf);
14277                 } else {
14278                         word = *wbuf;
14279                 }
14280                 chksum += *wbuf;        /* Checksum is calculated from word values. */
14281                 AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
14282                 AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14283                                      ASC_EEP_CMD_WRITE | addr);
14284                 AdvWaitEEPCmd(iop_base);
14285                 DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
14286         }
14287
14288         /*
14289          * Write EEPROM checksum at word 21.
14290          */
14291         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
14292         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
14293         AdvWaitEEPCmd(iop_base);
14294         wbuf++;
14295         charfields++;
14296
14297         /*
14298          * Write EEPROM OEM name at words 22 to 29.
14299          */
14300         for (addr = ADV_EEP_DVC_CTL_BEGIN;
14301              addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
14302                 ushort word;
14303
14304                 if (*charfields++) {
14305                         word = cpu_to_le16(*wbuf);
14306                 } else {
14307                         word = *wbuf;
14308                 }
14309                 AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
14310                 AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14311                                      ASC_EEP_CMD_WRITE | addr);
14312                 AdvWaitEEPCmd(iop_base);
14313         }
14314         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
14315         AdvWaitEEPCmd(iop_base);
14316         return;
14317 }
14318
14319 /*
14320  * Write the EEPROM from 'cfg_buf'.
14321  */
14322 void __devinit
14323 AdvSet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
14324 {
14325         ushort *wbuf;
14326         ushort *charfields;
14327         ushort addr, chksum;
14328
14329         wbuf = (ushort *)cfg_buf;
14330         charfields = (ushort *)&ADVEEP_38C1600_Config_Field_IsChar;
14331         chksum = 0;
14332
14333         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
14334         AdvWaitEEPCmd(iop_base);
14335
14336         /*
14337          * Write EEPROM from word 0 to word 20.
14338          */
14339         for (addr = ADV_EEP_DVC_CFG_BEGIN;
14340              addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
14341                 ushort word;
14342
14343                 if (*charfields++) {
14344                         word = cpu_to_le16(*wbuf);
14345                 } else {
14346                         word = *wbuf;
14347                 }
14348                 chksum += *wbuf;        /* Checksum is calculated from word values. */
14349                 AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
14350                 AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14351                                      ASC_EEP_CMD_WRITE | addr);
14352                 AdvWaitEEPCmd(iop_base);
14353                 DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
14354         }
14355
14356         /*
14357          * Write EEPROM checksum at word 21.
14358          */
14359         AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
14360         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
14361         AdvWaitEEPCmd(iop_base);
14362         wbuf++;
14363         charfields++;
14364
14365         /*
14366          * Write EEPROM OEM name at words 22 to 29.
14367          */
14368         for (addr = ADV_EEP_DVC_CTL_BEGIN;
14369              addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
14370                 ushort word;
14371
14372                 if (*charfields++) {
14373                         word = cpu_to_le16(*wbuf);
14374                 } else {
14375                         word = *wbuf;
14376                 }
14377                 AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
14378                 AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
14379                                      ASC_EEP_CMD_WRITE | addr);
14380                 AdvWaitEEPCmd(iop_base);
14381         }
14382         AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
14383         AdvWaitEEPCmd(iop_base);
14384         return;
14385 }
14386
14387 /* a_advlib.c */
14388 /*
14389  * AdvExeScsiQueue() - Send a request to the RISC microcode program.
14390  *
14391  *   Allocate a carrier structure, point the carrier to the ADV_SCSI_REQ_Q,
14392  *   add the carrier to the ICQ (Initiator Command Queue), and tickle the
14393  *   RISC to notify it a new command is ready to be executed.
14394  *
14395  * If 'done_status' is not set to QD_DO_RETRY, then 'error_retry' will be
14396  * set to SCSI_MAX_RETRY.
14397  *
14398  * Multi-byte fields in the ASC_SCSI_REQ_Q that are used by the microcode
14399  * for DMA addresses or math operations are byte swapped to little-endian
14400  * order.
14401  *
14402  * Return:
14403  *      ADV_SUCCESS(1) - The request was successfully queued.
14404  *      ADV_BUSY(0) -    Resource unavailable; Retry again after pending
14405  *                       request completes.
14406  *      ADV_ERROR(-1) -  Invalid ADV_SCSI_REQ_Q request structure
14407  *                       host IC error.
14408  */
14409 static int AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq)
14410 {
14411         ulong last_int_level;
14412         AdvPortAddr iop_base;
14413         ADV_DCNT req_size;
14414         ADV_PADDR req_paddr;
14415         ADV_CARR_T *new_carrp;
14416
14417         ASC_ASSERT(scsiq != NULL);      /* 'scsiq' should never be NULL. */
14418
14419         /*
14420          * The ADV_SCSI_REQ_Q 'target_id' field should never exceed ADV_MAX_TID.
14421          */
14422         if (scsiq->target_id > ADV_MAX_TID) {
14423                 scsiq->host_status = QHSTA_M_INVALID_DEVICE;
14424                 scsiq->done_status = QD_WITH_ERROR;
14425                 return ADV_ERROR;
14426         }
14427
14428         iop_base = asc_dvc->iop_base;
14429
14430         last_int_level = DvcEnterCritical();
14431
14432         /*
14433          * Allocate a carrier ensuring at least one carrier always
14434          * remains on the freelist and initialize fields.
14435          */
14436         if ((new_carrp = asc_dvc->carr_freelist) == NULL) {
14437                 DvcLeaveCritical(last_int_level);
14438                 return ADV_BUSY;
14439         }
14440         asc_dvc->carr_freelist = (ADV_CARR_T *)
14441             ADV_U32_TO_VADDR(le32_to_cpu(new_carrp->next_vpa));
14442         asc_dvc->carr_pending_cnt++;
14443
14444         /*
14445          * Set the carrier to be a stopper by setting 'next_vpa'
14446          * to the stopper value. The current stopper will be changed
14447          * below to point to the new stopper.
14448          */
14449         new_carrp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
14450
14451         /*
14452          * Clear the ADV_SCSI_REQ_Q done flag.
14453          */
14454         scsiq->a_flag &= ~ADV_SCSIQ_DONE;
14455
14456         req_size = sizeof(ADV_SCSI_REQ_Q);
14457         req_paddr = DvcGetPhyAddr(asc_dvc, scsiq, (uchar *)scsiq,
14458                                   (ADV_SDCNT *)&req_size, ADV_IS_SCSIQ_FLAG);
14459
14460         ASC_ASSERT(ADV_32BALIGN(req_paddr) == req_paddr);
14461         ASC_ASSERT(req_size >= sizeof(ADV_SCSI_REQ_Q));
14462
14463         /* Wait for assertion before making little-endian */
14464         req_paddr = cpu_to_le32(req_paddr);
14465
14466         /* Save virtual and physical address of ADV_SCSI_REQ_Q and carrier. */
14467         scsiq->scsiq_ptr = cpu_to_le32(ADV_VADDR_TO_U32(scsiq));
14468         scsiq->scsiq_rptr = req_paddr;
14469
14470         scsiq->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->icq_sp));
14471         /*
14472          * Every ADV_CARR_T.carr_pa is byte swapped to little-endian
14473          * order during initialization.
14474          */
14475         scsiq->carr_pa = asc_dvc->icq_sp->carr_pa;
14476
14477         /*
14478          * Use the current stopper to send the ADV_SCSI_REQ_Q command to
14479          * the microcode. The newly allocated stopper will become the new
14480          * stopper.
14481          */
14482         asc_dvc->icq_sp->areq_vpa = req_paddr;
14483
14484         /*
14485          * Set the 'next_vpa' pointer for the old stopper to be the
14486          * physical address of the new stopper. The RISC can only
14487          * follow physical addresses.
14488          */
14489         asc_dvc->icq_sp->next_vpa = new_carrp->carr_pa;
14490
14491         /*
14492          * Set the host adapter stopper pointer to point to the new carrier.
14493          */
14494         asc_dvc->icq_sp = new_carrp;
14495
14496         if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
14497             asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
14498                 /*
14499                  * Tickle the RISC to tell it to read its Command Queue Head pointer.
14500                  */
14501                 AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
14502                 if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
14503                         /*
14504                          * Clear the tickle value. In the ASC-3550 the RISC flag
14505                          * command 'clr_tickle_a' does not work unless the host
14506                          * value is cleared.
14507                          */
14508                         AdvWriteByteRegister(iop_base, IOPB_TICKLE,
14509                                              ADV_TICKLE_NOP);
14510                 }
14511         } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
14512                 /*
14513                  * Notify the RISC a carrier is ready by writing the physical
14514                  * address of the new carrier stopper to the COMMA register.
14515                  */
14516                 AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
14517                                       le32_to_cpu(new_carrp->carr_pa));
14518         }
14519
14520         DvcLeaveCritical(last_int_level);
14521
14522         return ADV_SUCCESS;
14523 }
14524
14525 /*
14526  * Reset SCSI Bus and purge all outstanding requests.
14527  *
14528  * Return Value:
14529  *      ADV_TRUE(1) -   All requests are purged and SCSI Bus is reset.
14530  *      ADV_FALSE(0) -  Microcode command failed.
14531  *      ADV_ERROR(-1) - Microcode command timed-out. Microcode or IC
14532  *                      may be hung which requires driver recovery.
14533  */
14534 static int AdvResetSB(ADV_DVC_VAR *asc_dvc)
14535 {
14536         int status;
14537
14538         /*
14539          * Send the SCSI Bus Reset idle start idle command which asserts
14540          * the SCSI Bus Reset signal.
14541          */
14542         status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_START, 0L);
14543         if (status != ADV_TRUE) {
14544                 return status;
14545         }
14546
14547         /*
14548          * Delay for the specified SCSI Bus Reset hold time.
14549          *
14550          * The hold time delay is done on the host because the RISC has no
14551          * microsecond accurate timer.
14552          */
14553         DvcDelayMicroSecond(asc_dvc, (ushort)ASC_SCSI_RESET_HOLD_TIME_US);
14554
14555         /*
14556          * Send the SCSI Bus Reset end idle command which de-asserts
14557          * the SCSI Bus Reset signal and purges any pending requests.
14558          */
14559         status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_END, 0L);
14560         if (status != ADV_TRUE) {
14561                 return status;
14562         }
14563
14564         DvcSleepMilliSecond((ADV_DCNT)asc_dvc->scsi_reset_wait * 1000);
14565
14566         return status;
14567 }
14568
14569 /*
14570  * Reset chip and SCSI Bus.
14571  *
14572  * Return Value:
14573  *      ADV_TRUE(1) -   Chip re-initialization and SCSI Bus Reset successful.
14574  *      ADV_FALSE(0) -  Chip re-initialization and SCSI Bus Reset failure.
14575  */
14576 static int AdvResetChipAndSB(ADV_DVC_VAR *asc_dvc)
14577 {
14578         int status;
14579         ushort wdtr_able, sdtr_able, tagqng_able;
14580         ushort ppr_able = 0;
14581         uchar tid, max_cmd[ADV_MAX_TID + 1];
14582         AdvPortAddr iop_base;
14583         ushort bios_sig;
14584
14585         iop_base = asc_dvc->iop_base;
14586
14587         /*
14588          * Save current per TID negotiated values.
14589          */
14590         AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
14591         AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
14592         if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
14593                 AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
14594         }
14595         AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
14596         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
14597                 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
14598                                 max_cmd[tid]);
14599         }
14600
14601         /*
14602          * Force the AdvInitAsc3550/38C0800Driver() function to
14603          * perform a SCSI Bus Reset by clearing the BIOS signature word.
14604          * The initialization functions assumes a SCSI Bus Reset is not
14605          * needed if the BIOS signature word is present.
14606          */
14607         AdvReadWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
14608         AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, 0);
14609
14610         /*
14611          * Stop chip and reset it.
14612          */
14613         AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_STOP);
14614         AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_RESET);
14615         DvcSleepMilliSecond(100);
14616         AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
14617                              ADV_CTRL_REG_CMD_WR_IO_REG);
14618
14619         /*
14620          * Reset Adv Library error code, if any, and try
14621          * re-initializing the chip.
14622          */
14623         asc_dvc->err_code = 0;
14624         if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
14625                 status = AdvInitAsc38C1600Driver(asc_dvc);
14626         } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
14627                 status = AdvInitAsc38C0800Driver(asc_dvc);
14628         } else {
14629                 status = AdvInitAsc3550Driver(asc_dvc);
14630         }
14631
14632         /* Translate initialization return value to status value. */
14633         if (status == 0) {
14634                 status = ADV_TRUE;
14635         } else {
14636                 status = ADV_FALSE;
14637         }
14638
14639         /*
14640          * Restore the BIOS signature word.
14641          */
14642         AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
14643
14644         /*
14645          * Restore per TID negotiated values.
14646          */
14647         AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
14648         AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
14649         if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
14650                 AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
14651         }
14652         AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
14653         for (tid = 0; tid <= ADV_MAX_TID; tid++) {
14654                 AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
14655                                  max_cmd[tid]);
14656         }
14657
14658         return status;
14659 }
14660
14661 /*
14662  * Adv Library Interrupt Service Routine
14663  *
14664  *  This function is called by a driver's interrupt service routine.
14665  *  The function disables and re-enables interrupts.
14666  *
14667  *  When a microcode idle command is completed, the ADV_DVC_VAR
14668  *  'idle_cmd_done' field is set to ADV_TRUE.
14669  *
14670  *  Note: AdvISR() can be called when interrupts are disabled or even
14671  *  when there is no hardware interrupt condition present. It will
14672  *  always check for completed idle commands and microcode requests.
14673  *  This is an important feature that shouldn't be changed because it
14674  *  allows commands to be completed from polling mode loops.
14675  *
14676  * Return:
14677  *   ADV_TRUE(1) - interrupt was pending
14678  *   ADV_FALSE(0) - no interrupt was pending
14679  */
14680 static int AdvISR(ADV_DVC_VAR *asc_dvc)
14681 {
14682         AdvPortAddr iop_base;
14683         uchar int_stat;
14684         ushort target_bit;
14685         ADV_CARR_T *free_carrp;
14686         ADV_VADDR irq_next_vpa;
14687         int flags;
14688         ADV_SCSI_REQ_Q *scsiq;
14689
14690         flags = DvcEnterCritical();
14691
14692         iop_base = asc_dvc->iop_base;
14693
14694         /* Reading the register clears the interrupt. */
14695         int_stat = AdvReadByteRegister(iop_base, IOPB_INTR_STATUS_REG);
14696
14697         if ((int_stat & (ADV_INTR_STATUS_INTRA | ADV_INTR_STATUS_INTRB |
14698                          ADV_INTR_STATUS_INTRC)) == 0) {
14699                 DvcLeaveCritical(flags);
14700                 return ADV_FALSE;
14701         }
14702
14703         /*
14704          * Notify the driver of an asynchronous microcode condition by
14705          * calling the adv_async_callback function. The function
14706          * is passed the microcode ASC_MC_INTRB_CODE byte value.
14707          */
14708         if (int_stat & ADV_INTR_STATUS_INTRB) {
14709                 uchar intrb_code;
14710
14711                 AdvReadByteLram(iop_base, ASC_MC_INTRB_CODE, intrb_code);
14712
14713                 if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
14714                     asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
14715                         if (intrb_code == ADV_ASYNC_CARRIER_READY_FAILURE &&
14716                             asc_dvc->carr_pending_cnt != 0) {
14717                                 AdvWriteByteRegister(iop_base, IOPB_TICKLE,
14718                                                      ADV_TICKLE_A);
14719                                 if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
14720                                         AdvWriteByteRegister(iop_base,
14721                                                              IOPB_TICKLE,
14722                                                              ADV_TICKLE_NOP);
14723                                 }
14724                         }
14725                 }
14726
14727                 adv_async_callback(asc_dvc, intrb_code);
14728         }
14729
14730         /*
14731          * Check if the IRQ stopper carrier contains a completed request.
14732          */
14733         while (((irq_next_vpa =
14734                  le32_to_cpu(asc_dvc->irq_sp->next_vpa)) & ASC_RQ_DONE) != 0) {
14735                 /*
14736                  * Get a pointer to the newly completed ADV_SCSI_REQ_Q structure.
14737                  * The RISC will have set 'areq_vpa' to a virtual address.
14738                  *
14739                  * The firmware will have copied the ASC_SCSI_REQ_Q.scsiq_ptr
14740                  * field to the carrier ADV_CARR_T.areq_vpa field. The conversion
14741                  * below complements the conversion of ASC_SCSI_REQ_Q.scsiq_ptr'
14742                  * in AdvExeScsiQueue().
14743                  */
14744                 scsiq = (ADV_SCSI_REQ_Q *)
14745                     ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->areq_vpa));
14746
14747                 /*
14748                  * Request finished with good status and the queue was not
14749                  * DMAed to host memory by the firmware. Set all status fields
14750                  * to indicate good status.
14751                  */
14752                 if ((irq_next_vpa & ASC_RQ_GOOD) != 0) {
14753                         scsiq->done_status = QD_NO_ERROR;
14754                         scsiq->host_status = scsiq->scsi_status = 0;
14755                         scsiq->data_cnt = 0L;
14756                 }
14757
14758                 /*
14759                  * Advance the stopper pointer to the next carrier
14760                  * ignoring the lower four bits. Free the previous
14761                  * stopper carrier.
14762                  */
14763                 free_carrp = asc_dvc->irq_sp;
14764                 asc_dvc->irq_sp = (ADV_CARR_T *)
14765                     ADV_U32_TO_VADDR(ASC_GET_CARRP(irq_next_vpa));
14766
14767                 free_carrp->next_vpa =
14768                     cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
14769                 asc_dvc->carr_freelist = free_carrp;
14770                 asc_dvc->carr_pending_cnt--;
14771
14772                 ASC_ASSERT(scsiq != NULL);
14773                 target_bit = ADV_TID_TO_TIDMASK(scsiq->target_id);
14774
14775                 /*
14776                  * Clear request microcode control flag.
14777                  */
14778                 scsiq->cntl = 0;
14779
14780                 /*
14781                  * Notify the driver of the completed request by passing
14782                  * the ADV_SCSI_REQ_Q pointer to its callback function.
14783                  */
14784                 scsiq->a_flag |= ADV_SCSIQ_DONE;
14785                 adv_isr_callback(asc_dvc, scsiq);
14786                 /*
14787                  * Note: After the driver callback function is called, 'scsiq'
14788                  * can no longer be referenced.
14789                  *
14790                  * Fall through and continue processing other completed
14791                  * requests...
14792                  */
14793
14794                 /*
14795                  * Disable interrupts again in case the driver inadvertently
14796                  * enabled interrupts in its callback function.
14797                  *
14798                  * The DvcEnterCritical() return value is ignored, because
14799                  * the 'flags' saved when AdvISR() was first entered will be
14800                  * used to restore the interrupt flag on exit.
14801                  */
14802                 (void)DvcEnterCritical();
14803         }
14804         DvcLeaveCritical(flags);
14805         return ADV_TRUE;
14806 }
14807
14808 /*
14809  * Send an idle command to the chip and wait for completion.
14810  *
14811  * Command completion is polled for once per microsecond.
14812  *
14813  * The function can be called from anywhere including an interrupt handler.
14814  * But the function is not re-entrant, so it uses the DvcEnter/LeaveCritical()
14815  * functions to prevent reentrancy.
14816  *
14817  * Return Values:
14818  *   ADV_TRUE - command completed successfully
14819  *   ADV_FALSE - command failed
14820  *   ADV_ERROR - command timed out
14821  */
14822 static int
14823 AdvSendIdleCmd(ADV_DVC_VAR *asc_dvc,
14824                ushort idle_cmd, ADV_DCNT idle_cmd_parameter)
14825 {
14826         ulong last_int_level;
14827         int result;
14828         ADV_DCNT i, j;
14829         AdvPortAddr iop_base;
14830
14831         last_int_level = DvcEnterCritical();
14832
14833         iop_base = asc_dvc->iop_base;
14834
14835         /*
14836          * Clear the idle command status which is set by the microcode
14837          * to a non-zero value to indicate when the command is completed.
14838          * The non-zero result is one of the IDLE_CMD_STATUS_* values
14839          * defined in a_advlib.h.
14840          */
14841         AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, (ushort)0);
14842
14843         /*
14844          * Write the idle command value after the idle command parameter
14845          * has been written to avoid a race condition. If the order is not
14846          * followed, the microcode may process the idle command before the
14847          * parameters have been written to LRAM.
14848          */
14849         AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IDLE_CMD_PARAMETER,
14850                                 cpu_to_le32(idle_cmd_parameter));
14851         AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD, idle_cmd);
14852
14853         /*
14854          * Tickle the RISC to tell it to process the idle command.
14855          */
14856         AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_B);
14857         if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
14858                 /*
14859                  * Clear the tickle value. In the ASC-3550 the RISC flag
14860                  * command 'clr_tickle_b' does not work unless the host
14861                  * value is cleared.
14862                  */
14863                 AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
14864         }
14865
14866         /* Wait for up to 100 millisecond for the idle command to timeout. */
14867         for (i = 0; i < SCSI_WAIT_100_MSEC; i++) {
14868                 /* Poll once each microsecond for command completion. */
14869                 for (j = 0; j < SCSI_US_PER_MSEC; j++) {
14870                         AdvReadWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS,
14871                                         result);
14872                         if (result != 0) {
14873                                 DvcLeaveCritical(last_int_level);
14874                                 return result;
14875                         }
14876                         DvcDelayMicroSecond(asc_dvc, (ushort)1);
14877                 }
14878         }
14879
14880         ASC_ASSERT(0);          /* The idle command should never timeout. */
14881         DvcLeaveCritical(last_int_level);
14882         return ADV_ERROR;
14883 }
14884
14885 static int __devinit
14886 advansys_wide_init_chip(asc_board_t *boardp, ADV_DVC_VAR *adv_dvc_varp)
14887 {
14888         int req_cnt = 0;
14889         adv_req_t *reqp = NULL;
14890         int sg_cnt = 0;
14891         adv_sgblk_t *sgp;
14892         int warn_code, err_code;
14893
14894         /*
14895          * Allocate buffer carrier structures. The total size
14896          * is about 4 KB, so allocate all at once.
14897          */
14898         boardp->carrp = kmalloc(ADV_CARRIER_BUFSIZE, GFP_KERNEL);
14899         ASC_DBG1(1, "advansys_wide_init_chip: carrp 0x%p\n", boardp->carrp);
14900
14901         if (!boardp->carrp)
14902                 goto kmalloc_failed;
14903
14904         /*
14905          * Allocate up to 'max_host_qng' request structures for the Wide
14906          * board. The total size is about 16 KB, so allocate all at once.
14907          * If the allocation fails decrement and try again.
14908          */
14909         for (req_cnt = adv_dvc_varp->max_host_qng; req_cnt > 0; req_cnt--) {
14910                 reqp = kmalloc(sizeof(adv_req_t) * req_cnt, GFP_KERNEL);
14911
14912                 ASC_DBG3(1, "advansys_wide_init_chip: reqp 0x%p, req_cnt %d, "
14913                          "bytes %lu\n", reqp, req_cnt,
14914                          (ulong)sizeof(adv_req_t) * req_cnt);
14915
14916                 if (reqp)
14917                         break;
14918         }
14919
14920         if (!reqp)
14921                 goto kmalloc_failed;
14922
14923         boardp->orig_reqp = reqp;
14924
14925         /*
14926          * Allocate up to ADV_TOT_SG_BLOCK request structures for
14927          * the Wide board. Each structure is about 136 bytes.
14928          */
14929         boardp->adv_sgblkp = NULL;
14930         for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) {
14931                 sgp = kmalloc(sizeof(adv_sgblk_t), GFP_KERNEL);
14932
14933                 if (!sgp)
14934                         break;
14935
14936                 sgp->next_sgblkp = boardp->adv_sgblkp;
14937                 boardp->adv_sgblkp = sgp;
14938
14939         }
14940
14941         ASC_DBG3(1, "advansys_wide_init_chip: sg_cnt %d * %u = %u bytes\n",
14942                  sg_cnt, sizeof(adv_sgblk_t),
14943                  (unsigned)(sizeof(adv_sgblk_t) * sg_cnt));
14944
14945         if (!boardp->adv_sgblkp)
14946                 goto kmalloc_failed;
14947
14948         adv_dvc_varp->carrier_buf = boardp->carrp;
14949
14950         /*
14951          * Point 'adv_reqp' to the request structures and
14952          * link them together.
14953          */
14954         req_cnt--;
14955         reqp[req_cnt].next_reqp = NULL;
14956         for (; req_cnt > 0; req_cnt--) {
14957                 reqp[req_cnt - 1].next_reqp = &reqp[req_cnt];
14958         }
14959         boardp->adv_reqp = &reqp[0];
14960
14961         if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
14962                 ASC_DBG(2, "advansys_wide_init_chip: AdvInitAsc3550Driver()\n");
14963                 warn_code = AdvInitAsc3550Driver(adv_dvc_varp);
14964         } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
14965                 ASC_DBG(2, "advansys_wide_init_chip: AdvInitAsc38C0800Driver()"
14966                            "\n");
14967                 warn_code = AdvInitAsc38C0800Driver(adv_dvc_varp);
14968         } else {
14969                 ASC_DBG(2, "advansys_wide_init_chip: AdvInitAsc38C1600Driver()"
14970                            "\n");
14971                 warn_code = AdvInitAsc38C1600Driver(adv_dvc_varp);
14972         }
14973         err_code = adv_dvc_varp->err_code;
14974
14975         if (warn_code || err_code) {
14976                 ASC_PRINT3("advansys_wide_init_chip: board %d error: warn 0x%x,"
14977                            " error 0x%x\n", boardp->id, warn_code, err_code);
14978         }
14979
14980         goto exit;
14981
14982  kmalloc_failed:
14983         ASC_PRINT1("advansys_wide_init_chip: board %d error: kmalloc() "
14984                    "failed\n", boardp->id);
14985         err_code = ADV_ERROR;
14986  exit:
14987         return err_code;
14988 }
14989
14990 static void advansys_wide_free_mem(asc_board_t *boardp)
14991 {
14992         kfree(boardp->carrp);
14993         boardp->carrp = NULL;
14994         kfree(boardp->orig_reqp);
14995         boardp->orig_reqp = boardp->adv_reqp = NULL;
14996         while (boardp->adv_sgblkp) {
14997                 adv_sgblk_t *sgp = boardp->adv_sgblkp;
14998                 boardp->adv_sgblkp = sgp->next_sgblkp;
14999                 kfree(sgp);
15000         }
15001 }
15002
15003 static struct Scsi_Host *__devinit
15004 advansys_board_found(int iop, struct device *dev, int bus_type)
15005 {
15006         struct Scsi_Host *shost;
15007         struct pci_dev *pdev = bus_type == ASC_IS_PCI ? to_pci_dev(dev) : NULL;
15008         asc_board_t *boardp;
15009         ASC_DVC_VAR *asc_dvc_varp = NULL;
15010         ADV_DVC_VAR *adv_dvc_varp = NULL;
15011         int share_irq;
15012         int warn_code, err_code;
15013         int ret;
15014
15015         /*
15016          * Register the adapter, get its configuration, and
15017          * initialize it.
15018          */
15019         ASC_DBG(2, "advansys_board_found: scsi_host_alloc()\n");
15020         shost = scsi_host_alloc(&advansys_template, sizeof(asc_board_t));
15021         if (!shost)
15022                 return NULL;
15023
15024         /* Initialize private per board data */
15025         boardp = ASC_BOARDP(shost);
15026         memset(boardp, 0, sizeof(asc_board_t));
15027         boardp->id = asc_board_count++;
15028         spin_lock_init(&boardp->lock);
15029         boardp->dev = dev;
15030
15031         /*
15032          * Handle both narrow and wide boards.
15033          *
15034          * If a Wide board was detected, set the board structure
15035          * wide board flag. Set-up the board structure based on
15036          * the board type.
15037          */
15038 #ifdef CONFIG_PCI
15039         if (bus_type == ASC_IS_PCI &&
15040             (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW ||
15041              pdev->device == PCI_DEVICE_ID_38C0800_REV1 ||
15042              pdev->device == PCI_DEVICE_ID_38C1600_REV1)) {
15043                 boardp->flags |= ASC_IS_WIDE_BOARD;
15044         }
15045 #endif /* CONFIG_PCI */
15046
15047         if (ASC_NARROW_BOARD(boardp)) {
15048                 ASC_DBG(1, "advansys_board_found: narrow board\n");
15049                 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
15050                 asc_dvc_varp->bus_type = bus_type;
15051                 asc_dvc_varp->drv_ptr = boardp;
15052                 asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg;
15053                 asc_dvc_varp->cfg->overrun_buf = &overrun_buf[0];
15054                 asc_dvc_varp->iop_base = iop;
15055         } else {
15056 #ifdef CONFIG_PCI
15057                 ASC_DBG(1, "advansys_board_found: wide board\n");
15058                 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
15059                 adv_dvc_varp->drv_ptr = boardp;
15060                 adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg;
15061                 if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW) {
15062                         ASC_DBG(1, "advansys_board_found: ASC-3550\n");
15063                         adv_dvc_varp->chip_type = ADV_CHIP_ASC3550;
15064                 } else if (pdev->device == PCI_DEVICE_ID_38C0800_REV1) {
15065                         ASC_DBG(1, "advansys_board_found: ASC-38C0800\n");
15066                         adv_dvc_varp->chip_type = ADV_CHIP_ASC38C0800;
15067                 } else {
15068                         ASC_DBG(1, "advansys_board_found: ASC-38C1600\n");
15069                         adv_dvc_varp->chip_type = ADV_CHIP_ASC38C1600;
15070                 }
15071
15072                 boardp->asc_n_io_port = pci_resource_len(pdev, 1);
15073                 boardp->ioremap_addr = ioremap(pci_resource_start(pdev, 1),
15074                                                boardp->asc_n_io_port);
15075                 if (!boardp->ioremap_addr) {
15076                         ASC_PRINT3
15077                             ("advansys_board_found: board %d: ioremap(%x, %d) returned NULL\n",
15078                              boardp->id, pci_resource_start(pdev, 1),
15079                              boardp->asc_n_io_port);
15080                         goto err_shost;
15081                 }
15082                 adv_dvc_varp->iop_base = (AdvPortAddr)boardp->ioremap_addr
15083                 ASC_DBG1(1, "advansys_board_found: iop_base: 0x%lx\n",
15084                          adv_dvc_varp->iop_base);
15085
15086                 /*
15087                  * Even though it isn't used to access wide boards, other
15088                  * than for the debug line below, save I/O Port address so
15089                  * that it can be reported.
15090                  */
15091                 boardp->ioport = iop;
15092
15093                 ASC_DBG2(1, "advansys_board_found: iopb_chip_id_1 0x%x, "
15094                          "iopw_chip_id_0 0x%x\n", (ushort)inp(iop + 1),
15095                          (ushort)inpw(iop));
15096 #endif /* CONFIG_PCI */
15097         }
15098
15099 #ifdef CONFIG_PROC_FS
15100         /*
15101          * Allocate buffer for printing information from
15102          * /proc/scsi/advansys/[0...].
15103          */
15104         boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_KERNEL);
15105         if (!boardp->prtbuf) {
15106                 ASC_PRINT2("advansys_board_found: board %d: kmalloc(%d) "
15107                            "returned NULL\n", boardp->id, ASC_PRTBUF_SIZE);
15108                 goto err_unmap;
15109         }
15110 #endif /* CONFIG_PROC_FS */
15111
15112         if (ASC_NARROW_BOARD(boardp)) {
15113                 /*
15114                  * Set the board bus type and PCI IRQ before
15115                  * calling AscInitGetConfig().
15116                  */
15117                 switch (asc_dvc_varp->bus_type) {
15118 #ifdef CONFIG_ISA
15119                 case ASC_IS_ISA:
15120                         shost->unchecked_isa_dma = TRUE;
15121                         share_irq = 0;
15122                         break;
15123                 case ASC_IS_VL:
15124                         shost->unchecked_isa_dma = FALSE;
15125                         share_irq = 0;
15126                         break;
15127                 case ASC_IS_EISA:
15128                         shost->unchecked_isa_dma = FALSE;
15129                         share_irq = IRQF_SHARED;
15130                         break;
15131 #endif /* CONFIG_ISA */
15132 #ifdef CONFIG_PCI
15133                 case ASC_IS_PCI:
15134                         shost->irq = asc_dvc_varp->irq_no = pdev->irq;
15135                         shost->unchecked_isa_dma = FALSE;
15136                         share_irq = IRQF_SHARED;
15137                         break;
15138 #endif /* CONFIG_PCI */
15139                 default:
15140                         ASC_PRINT2
15141                             ("advansys_board_found: board %d: unknown adapter type: %d\n",
15142                              boardp->id, asc_dvc_varp->bus_type);
15143                         shost->unchecked_isa_dma = TRUE;
15144                         share_irq = 0;
15145                         break;
15146                 }
15147
15148                 /*
15149                  * NOTE: AscInitGetConfig() may change the board's
15150                  * bus_type value. The bus_type value should no
15151                  * longer be used. If the bus_type field must be
15152                  * referenced only use the bit-wise AND operator "&".
15153                  */
15154                 ASC_DBG(2, "advansys_board_found: AscInitGetConfig()\n");
15155                 err_code = AscInitGetConfig(boardp);
15156         } else {
15157 #ifdef CONFIG_PCI
15158                 /*
15159                  * For Wide boards set PCI information before calling
15160                  * AdvInitGetConfig().
15161                  */
15162                 shost->irq = adv_dvc_varp->irq_no = pdev->irq;
15163                 shost->unchecked_isa_dma = FALSE;
15164                 share_irq = IRQF_SHARED;
15165                 ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n");
15166
15167                 err_code = AdvInitGetConfig(pdev, boardp);
15168 #endif /* CONFIG_PCI */
15169         }
15170
15171         if (err_code != 0)
15172                 goto err_free_proc;
15173
15174         /*
15175          * Save the EEPROM configuration so that it can be displayed
15176          * from /proc/scsi/advansys/[0...].
15177          */
15178         if (ASC_NARROW_BOARD(boardp)) {
15179
15180                 ASCEEP_CONFIG *ep;
15181
15182                 /*
15183                  * Set the adapter's target id bit in the 'init_tidmask' field.
15184                  */
15185                 boardp->init_tidmask |=
15186                     ADV_TID_TO_TIDMASK(asc_dvc_varp->cfg->chip_scsi_id);
15187
15188                 /*
15189                  * Save EEPROM settings for the board.
15190                  */
15191                 ep = &boardp->eep_config.asc_eep;
15192
15193                 ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable;
15194                 ep->disc_enable = asc_dvc_varp->cfg->disc_enable;
15195                 ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled;
15196                 ASC_EEP_SET_DMA_SPD(ep, asc_dvc_varp->cfg->isa_dma_speed);
15197                 ep->start_motor = asc_dvc_varp->start_motor;
15198                 ep->cntl = asc_dvc_varp->dvc_cntl;
15199                 ep->no_scam = asc_dvc_varp->no_scam;
15200                 ep->max_total_qng = asc_dvc_varp->max_total_qng;
15201                 ASC_EEP_SET_CHIP_ID(ep, asc_dvc_varp->cfg->chip_scsi_id);
15202                 /* 'max_tag_qng' is set to the same value for every device. */
15203                 ep->max_tag_qng = asc_dvc_varp->cfg->max_tag_qng[0];
15204                 ep->adapter_info[0] = asc_dvc_varp->cfg->adapter_info[0];
15205                 ep->adapter_info[1] = asc_dvc_varp->cfg->adapter_info[1];
15206                 ep->adapter_info[2] = asc_dvc_varp->cfg->adapter_info[2];
15207                 ep->adapter_info[3] = asc_dvc_varp->cfg->adapter_info[3];
15208                 ep->adapter_info[4] = asc_dvc_varp->cfg->adapter_info[4];
15209                 ep->adapter_info[5] = asc_dvc_varp->cfg->adapter_info[5];
15210
15211                 /*
15212                  * Modify board configuration.
15213                  */
15214                 ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n");
15215                 err_code = AscInitSetConfig(pdev, boardp);
15216                 if (err_code)
15217                         goto err_free_proc;
15218
15219                 /*
15220                  * Finish initializing the 'Scsi_Host' structure.
15221                  */
15222                 /* AscInitSetConfig() will set the IRQ for non-PCI boards. */
15223                 if ((asc_dvc_varp->bus_type & ASC_IS_PCI) == 0) {
15224                         shost->irq = asc_dvc_varp->irq_no;
15225                 }
15226         } else {
15227                 ADVEEP_3550_CONFIG *ep_3550;
15228                 ADVEEP_38C0800_CONFIG *ep_38C0800;
15229                 ADVEEP_38C1600_CONFIG *ep_38C1600;
15230
15231                 /*
15232                  * Save Wide EEP Configuration Information.
15233                  */
15234                 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
15235                         ep_3550 = &boardp->eep_config.adv_3550_eep;
15236
15237                         ep_3550->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
15238                         ep_3550->max_host_qng = adv_dvc_varp->max_host_qng;
15239                         ep_3550->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
15240                         ep_3550->termination = adv_dvc_varp->cfg->termination;
15241                         ep_3550->disc_enable = adv_dvc_varp->cfg->disc_enable;
15242                         ep_3550->bios_ctrl = adv_dvc_varp->bios_ctrl;
15243                         ep_3550->wdtr_able = adv_dvc_varp->wdtr_able;
15244                         ep_3550->sdtr_able = adv_dvc_varp->sdtr_able;
15245                         ep_3550->ultra_able = adv_dvc_varp->ultra_able;
15246                         ep_3550->tagqng_able = adv_dvc_varp->tagqng_able;
15247                         ep_3550->start_motor = adv_dvc_varp->start_motor;
15248                         ep_3550->scsi_reset_delay =
15249                             adv_dvc_varp->scsi_reset_wait;
15250                         ep_3550->serial_number_word1 =
15251                             adv_dvc_varp->cfg->serial1;
15252                         ep_3550->serial_number_word2 =
15253                             adv_dvc_varp->cfg->serial2;
15254                         ep_3550->serial_number_word3 =
15255                             adv_dvc_varp->cfg->serial3;
15256                 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
15257                         ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
15258
15259                         ep_38C0800->adapter_scsi_id =
15260                             adv_dvc_varp->chip_scsi_id;
15261                         ep_38C0800->max_host_qng = adv_dvc_varp->max_host_qng;
15262                         ep_38C0800->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
15263                         ep_38C0800->termination_lvd =
15264                             adv_dvc_varp->cfg->termination;
15265                         ep_38C0800->disc_enable =
15266                             adv_dvc_varp->cfg->disc_enable;
15267                         ep_38C0800->bios_ctrl = adv_dvc_varp->bios_ctrl;
15268                         ep_38C0800->wdtr_able = adv_dvc_varp->wdtr_able;
15269                         ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
15270                         ep_38C0800->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
15271                         ep_38C0800->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
15272                         ep_38C0800->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
15273                         ep_38C0800->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
15274                         ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
15275                         ep_38C0800->start_motor = adv_dvc_varp->start_motor;
15276                         ep_38C0800->scsi_reset_delay =
15277                             adv_dvc_varp->scsi_reset_wait;
15278                         ep_38C0800->serial_number_word1 =
15279                             adv_dvc_varp->cfg->serial1;
15280                         ep_38C0800->serial_number_word2 =
15281                             adv_dvc_varp->cfg->serial2;
15282                         ep_38C0800->serial_number_word3 =
15283                             adv_dvc_varp->cfg->serial3;
15284                 } else {
15285                         ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
15286
15287                         ep_38C1600->adapter_scsi_id =
15288                             adv_dvc_varp->chip_scsi_id;
15289                         ep_38C1600->max_host_qng = adv_dvc_varp->max_host_qng;
15290                         ep_38C1600->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
15291                         ep_38C1600->termination_lvd =
15292                             adv_dvc_varp->cfg->termination;
15293                         ep_38C1600->disc_enable =
15294                             adv_dvc_varp->cfg->disc_enable;
15295                         ep_38C1600->bios_ctrl = adv_dvc_varp->bios_ctrl;
15296                         ep_38C1600->wdtr_able = adv_dvc_varp->wdtr_able;
15297                         ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
15298                         ep_38C1600->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
15299                         ep_38C1600->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
15300                         ep_38C1600->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
15301                         ep_38C1600->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
15302                         ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
15303                         ep_38C1600->start_motor = adv_dvc_varp->start_motor;
15304                         ep_38C1600->scsi_reset_delay =
15305                             adv_dvc_varp->scsi_reset_wait;
15306                         ep_38C1600->serial_number_word1 =
15307                             adv_dvc_varp->cfg->serial1;
15308                         ep_38C1600->serial_number_word2 =
15309                             adv_dvc_varp->cfg->serial2;
15310                         ep_38C1600->serial_number_word3 =
15311                             adv_dvc_varp->cfg->serial3;
15312                 }
15313
15314                 /*
15315                  * Set the adapter's target id bit in the 'init_tidmask' field.
15316                  */
15317                 boardp->init_tidmask |=
15318                     ADV_TID_TO_TIDMASK(adv_dvc_varp->chip_scsi_id);
15319         }
15320
15321         /*
15322          * Channels are numbered beginning with 0. For AdvanSys one host
15323          * structure supports one channel. Multi-channel boards have a
15324          * separate host structure for each channel.
15325          */
15326         shost->max_channel = 0;
15327         if (ASC_NARROW_BOARD(boardp)) {
15328                 shost->max_id = ASC_MAX_TID + 1;
15329                 shost->max_lun = ASC_MAX_LUN + 1;
15330
15331                 shost->io_port = asc_dvc_varp->iop_base;
15332                 boardp->asc_n_io_port = ASC_IOADR_GAP;
15333                 shost->this_id = asc_dvc_varp->cfg->chip_scsi_id;
15334
15335                 /* Set maximum number of queues the adapter can handle. */
15336                 shost->can_queue = asc_dvc_varp->max_total_qng;
15337         } else {
15338                 shost->max_id = ADV_MAX_TID + 1;
15339                 shost->max_lun = ADV_MAX_LUN + 1;
15340
15341                 /*
15342                  * Save the I/O Port address and length even though
15343                  * I/O ports are not used to access Wide boards.
15344                  * Instead the Wide boards are accessed with
15345                  * PCI Memory Mapped I/O.
15346                  */
15347                 shost->io_port = iop;
15348
15349                 shost->this_id = adv_dvc_varp->chip_scsi_id;
15350
15351                 /* Set maximum number of queues the adapter can handle. */
15352                 shost->can_queue = adv_dvc_varp->max_host_qng;
15353         }
15354
15355         /*
15356          * Following v1.3.89, 'cmd_per_lun' is no longer needed
15357          * and should be set to zero.
15358          *
15359          * But because of a bug introduced in v1.3.89 if the driver is
15360          * compiled as a module and 'cmd_per_lun' is zero, the Mid-Level
15361          * SCSI function 'allocate_device' will panic. To allow the driver
15362          * to work as a module in these kernels set 'cmd_per_lun' to 1.
15363          *
15364          * Note: This is wrong.  cmd_per_lun should be set to the depth
15365          * you want on untagged devices always.
15366          #ifdef MODULE
15367          */
15368         shost->cmd_per_lun = 1;
15369 /* #else
15370             shost->cmd_per_lun = 0;
15371 #endif */
15372
15373         /*
15374          * Set the maximum number of scatter-gather elements the
15375          * adapter can handle.
15376          */
15377         if (ASC_NARROW_BOARD(boardp)) {
15378                 /*
15379                  * Allow two commands with 'sg_tablesize' scatter-gather
15380                  * elements to be executed simultaneously. This value is
15381                  * the theoretical hardware limit. It may be decreased
15382                  * below.
15383                  */
15384                 shost->sg_tablesize =
15385                     (((asc_dvc_varp->max_total_qng - 2) / 2) *
15386                      ASC_SG_LIST_PER_Q) + 1;
15387         } else {
15388                 shost->sg_tablesize = ADV_MAX_SG_LIST;
15389         }
15390
15391         /*
15392          * The value of 'sg_tablesize' can not exceed the SCSI
15393          * mid-level driver definition of SG_ALL. SG_ALL also
15394          * must not be exceeded, because it is used to define the
15395          * size of the scatter-gather table in 'struct asc_sg_head'.
15396          */
15397         if (shost->sg_tablesize > SG_ALL) {
15398                 shost->sg_tablesize = SG_ALL;
15399         }
15400
15401         ASC_DBG1(1, "advansys_board_found: sg_tablesize: %d\n", shost->sg_tablesize);
15402
15403         /* BIOS start address. */
15404         if (ASC_NARROW_BOARD(boardp)) {
15405                 shost->base = AscGetChipBiosAddress(asc_dvc_varp->iop_base,
15406                                                     asc_dvc_varp->bus_type);
15407         } else {
15408                 /*
15409                  * Fill-in BIOS board variables. The Wide BIOS saves
15410                  * information in LRAM that is used by the driver.
15411                  */
15412                 AdvReadWordLram(adv_dvc_varp->iop_base,
15413                                 BIOS_SIGNATURE, boardp->bios_signature);
15414                 AdvReadWordLram(adv_dvc_varp->iop_base,
15415                                 BIOS_VERSION, boardp->bios_version);
15416                 AdvReadWordLram(adv_dvc_varp->iop_base,
15417                                 BIOS_CODESEG, boardp->bios_codeseg);
15418                 AdvReadWordLram(adv_dvc_varp->iop_base,
15419                                 BIOS_CODELEN, boardp->bios_codelen);
15420
15421                 ASC_DBG2(1,
15422                          "advansys_board_found: bios_signature 0x%x, bios_version 0x%x\n",
15423                          boardp->bios_signature, boardp->bios_version);
15424
15425                 ASC_DBG2(1,
15426                          "advansys_board_found: bios_codeseg 0x%x, bios_codelen 0x%x\n",
15427                          boardp->bios_codeseg, boardp->bios_codelen);
15428
15429                 /*
15430                  * If the BIOS saved a valid signature, then fill in
15431                  * the BIOS code segment base address.
15432                  */
15433                 if (boardp->bios_signature == 0x55AA) {
15434                         /*
15435                          * Convert x86 realmode code segment to a linear
15436                          * address by shifting left 4.
15437                          */
15438                         shost->base = ((ulong)boardp->bios_codeseg << 4);
15439                 } else {
15440                         shost->base = 0;
15441                 }
15442         }
15443
15444         /*
15445          * Register Board Resources - I/O Port, DMA, IRQ
15446          */
15447
15448         /* Register DMA Channel for Narrow boards. */
15449         shost->dma_channel = NO_ISA_DMA;        /* Default to no ISA DMA. */
15450 #ifdef CONFIG_ISA
15451         if (ASC_NARROW_BOARD(boardp)) {
15452                 /* Register DMA channel for ISA bus. */
15453                 if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
15454                         shost->dma_channel = asc_dvc_varp->cfg->isa_dma_channel;
15455                         ret = request_dma(shost->dma_channel, "advansys");
15456                         if (ret) {
15457                                 ASC_PRINT3
15458                                     ("advansys_board_found: board %d: request_dma() %d failed %d\n",
15459                                      boardp->id, shost->dma_channel, ret);
15460                                 goto err_free_proc;
15461                         }
15462                         AscEnableIsaDma(shost->dma_channel);
15463                 }
15464         }
15465 #endif /* CONFIG_ISA */
15466
15467         /* Register IRQ Number. */
15468         ASC_DBG1(2, "advansys_board_found: request_irq() %d\n", shost->irq);
15469
15470         ret = request_irq(shost->irq, advansys_interrupt, share_irq,
15471                           "advansys", shost);
15472
15473         if (ret) {
15474                 if (ret == -EBUSY) {
15475                         ASC_PRINT2
15476                             ("advansys_board_found: board %d: request_irq(): IRQ 0x%x already in use.\n",
15477                              boardp->id, shost->irq);
15478                 } else if (ret == -EINVAL) {
15479                         ASC_PRINT2
15480                             ("advansys_board_found: board %d: request_irq(): IRQ 0x%x not valid.\n",
15481                              boardp->id, shost->irq);
15482                 } else {
15483                         ASC_PRINT3
15484                             ("advansys_board_found: board %d: request_irq(): IRQ 0x%x failed with %d\n",
15485                              boardp->id, shost->irq, ret);
15486                 }
15487                 goto err_free_dma;
15488         }
15489
15490         /*
15491          * Initialize board RISC chip and enable interrupts.
15492          */
15493         if (ASC_NARROW_BOARD(boardp)) {
15494                 ASC_DBG(2, "advansys_board_found: AscInitAsc1000Driver()\n");
15495                 warn_code = AscInitAsc1000Driver(asc_dvc_varp);
15496                 err_code = asc_dvc_varp->err_code;
15497
15498                 if (warn_code || err_code) {
15499                         ASC_PRINT4
15500                             ("advansys_board_found: board %d error: init_state 0x%x, warn 0x%x, error 0x%x\n",
15501                              boardp->id,
15502                              asc_dvc_varp->init_state, warn_code, err_code);
15503                 }
15504         } else {
15505                 err_code = advansys_wide_init_chip(boardp, adv_dvc_varp);
15506         }
15507
15508         if (err_code != 0)
15509                 goto err_free_wide_mem;
15510
15511         ASC_DBG_PRT_SCSI_HOST(2, shost);
15512
15513         ret = scsi_add_host(shost, dev);
15514         if (ret)
15515                 goto err_free_wide_mem;
15516
15517         scsi_scan_host(shost);
15518         return shost;
15519
15520  err_free_wide_mem:
15521         advansys_wide_free_mem(boardp);
15522         free_irq(shost->irq, shost);
15523  err_free_dma:
15524         if (shost->dma_channel != NO_ISA_DMA)
15525                 free_dma(shost->dma_channel);
15526  err_free_proc:
15527         kfree(boardp->prtbuf);
15528  err_unmap:
15529         if (boardp->ioremap_addr)
15530                 iounmap(boardp->ioremap_addr);
15531  err_shost:
15532         scsi_host_put(shost);
15533         return NULL;
15534 }
15535
15536 /*
15537  * advansys_release()
15538  *
15539  * Release resources allocated for a single AdvanSys adapter.
15540  */
15541 static int advansys_release(struct Scsi_Host *shost)
15542 {
15543         asc_board_t *boardp;
15544
15545         ASC_DBG(1, "advansys_release: begin\n");
15546         scsi_remove_host(shost);
15547         boardp = ASC_BOARDP(shost);
15548         free_irq(shost->irq, shost);
15549         if (shost->dma_channel != NO_ISA_DMA) {
15550                 ASC_DBG(1, "advansys_release: free_dma()\n");
15551                 free_dma(shost->dma_channel);
15552         }
15553         if (ASC_WIDE_BOARD(boardp)) {
15554                 iounmap(boardp->ioremap_addr);
15555                 advansys_wide_free_mem(boardp);
15556         }
15557         kfree(boardp->prtbuf);
15558         scsi_host_put(shost);
15559         ASC_DBG(1, "advansys_release: end\n");
15560         return 0;
15561 }
15562
15563 static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] __devinitdata = {
15564         0x100, 0x0110, 0x120, 0x0130, 0x140, 0x0150, 0x0190,
15565         0x0210, 0x0230, 0x0250, 0x0330
15566 };
15567
15568 static int __devinit advansys_isa_probe(struct device *dev, unsigned int id)
15569 {
15570         PortAddr iop_base = _asc_def_iop_base[id];
15571         struct Scsi_Host *shost;
15572
15573         if (!request_region(iop_base, ASC_IOADR_GAP, "advansys")) {
15574                 ASC_DBG1(1, "advansys_isa_match: I/O port 0x%x busy\n",
15575                          iop_base);
15576                 return -ENODEV;
15577         }
15578         ASC_DBG1(1, "advansys_isa_match: probing I/O port 0x%x\n", iop_base);
15579         if (!AscFindSignature(iop_base))
15580                 goto nodev;
15581         if (!(AscGetChipVersion(iop_base, ASC_IS_ISA) & ASC_CHIP_VER_ISA_BIT))
15582                 goto nodev;
15583
15584         shost = advansys_board_found(iop_base, dev, ASC_IS_ISA);
15585         if (!shost)
15586                 goto nodev;
15587
15588         dev_set_drvdata(dev, shost);
15589         return 0;
15590
15591  nodev:
15592         release_region(iop_base, ASC_IOADR_GAP);
15593         return -ENODEV;
15594 }
15595
15596 static int __devexit advansys_isa_remove(struct device *dev, unsigned int id)
15597 {
15598         int ioport = _asc_def_iop_base[id];
15599         advansys_release(dev_get_drvdata(dev));
15600         release_region(ioport, ASC_IOADR_GAP);
15601         return 0;
15602 }
15603
15604 static struct isa_driver advansys_isa_driver = {
15605         .probe          = advansys_isa_probe,
15606         .remove         = __devexit_p(advansys_isa_remove),
15607         .driver = {
15608                 .owner  = THIS_MODULE,
15609                 .name   = "advansys",
15610         },
15611 };
15612
15613 static int __devinit advansys_vlb_probe(struct device *dev, unsigned int id)
15614 {
15615         PortAddr iop_base = _asc_def_iop_base[id];
15616         struct Scsi_Host *shost;
15617
15618         if (!request_region(iop_base, ASC_IOADR_GAP, "advansys")) {
15619                 ASC_DBG1(1, "advansys_vlb_match: I/O port 0x%x busy\n",
15620                          iop_base);
15621                 return -ENODEV;
15622         }
15623         ASC_DBG1(1, "advansys_vlb_match: probing I/O port 0x%x\n", iop_base);
15624         if (!AscFindSignature(iop_base))
15625                 goto nodev;
15626         /*
15627          * I don't think this condition can actually happen, but the old
15628          * driver did it, and the chances of finding a VLB setup in 2007
15629          * to do testing with is slight to none.
15630          */
15631         if (AscGetChipVersion(iop_base, ASC_IS_VL) > ASC_CHIP_MAX_VER_VL)
15632                 goto nodev;
15633
15634         shost = advansys_board_found(iop_base, dev, ASC_IS_VL);
15635         if (!shost)
15636                 goto nodev;
15637
15638         dev_set_drvdata(dev, shost);
15639         return 0;
15640
15641  nodev:
15642         release_region(iop_base, ASC_IOADR_GAP);
15643         return -ENODEV;
15644 }
15645
15646 static struct isa_driver advansys_vlb_driver = {
15647         .probe          = advansys_vlb_probe,
15648         .remove         = __devexit_p(advansys_isa_remove),
15649         .driver = {
15650                 .owner  = THIS_MODULE,
15651                 .name   = "advansys_vlb",
15652         },
15653 };
15654
15655 static struct eisa_device_id advansys_eisa_table[] __devinitdata = {
15656         { "ABP7401" },
15657         { "ABP7501" },
15658         { "" }
15659 };
15660
15661 MODULE_DEVICE_TABLE(eisa, advansys_eisa_table);
15662
15663 /*
15664  * EISA is a little more tricky than PCI; each EISA device may have two
15665  * channels, and this driver is written to make each channel its own Scsi_Host
15666  */
15667 struct eisa_scsi_data {
15668         struct Scsi_Host *host[2];
15669 };
15670
15671 static int __devinit advansys_eisa_probe(struct device *dev)
15672 {
15673         int i, ioport;
15674         int err;
15675         struct eisa_device *edev = to_eisa_device(dev);
15676         struct eisa_scsi_data *data;
15677
15678         err = -ENOMEM;
15679         data = kzalloc(sizeof(*data), GFP_KERNEL);
15680         if (!data)
15681                 goto fail;
15682         ioport = edev->base_addr + 0xc30;
15683
15684         err = -ENODEV;
15685         for (i = 0; i < 2; i++, ioport += 0x20) {
15686                 if (!request_region(ioport, ASC_IOADR_GAP, "advansys")) {
15687                         printk(KERN_WARNING "Region %x-%x busy\n", ioport,
15688                                ioport + ASC_IOADR_GAP - 1);
15689                         continue;
15690                 }
15691                 if (!AscFindSignature(ioport)) {
15692                         release_region(ioport, ASC_IOADR_GAP);
15693                         continue;
15694                 }
15695
15696                 /*
15697                  * I don't know why we need to do this for EISA chips, but
15698                  * not for any others.  It looks to be equivalent to
15699                  * AscGetChipCfgMsw, but I may have overlooked something,
15700                  * so I'm not converting it until I get an EISA board to
15701                  * test with.
15702                  */
15703                 inw(ioport + 4);
15704                 data->host[i] = advansys_board_found(ioport, dev, ASC_IS_EISA);
15705                 if (data->host[i]) {
15706                         err = 0;
15707                 } else {
15708                         release_region(ioport, ASC_IOADR_GAP);
15709                 }
15710         }
15711
15712         if (err) {
15713                 kfree(data);
15714         } else {
15715                 dev_set_drvdata(dev, data);
15716         }
15717
15718  fail:
15719         return err;
15720 }
15721
15722 static __devexit int advansys_eisa_remove(struct device *dev)
15723 {
15724         int i;
15725         struct eisa_scsi_data *data = dev_get_drvdata(dev);
15726
15727         for (i = 0; i < 2; i++) {
15728                 int ioport;
15729                 struct Scsi_Host *shost = data->host[i];
15730                 if (!shost)
15731                         continue;
15732                 ioport = shost->io_port;
15733                 advansys_release(shost);
15734                 release_region(ioport, ASC_IOADR_GAP);
15735         }
15736
15737         kfree(data);
15738         return 0;
15739 }
15740
15741 static struct eisa_driver advansys_eisa_driver = {
15742         .id_table =             advansys_eisa_table,
15743         .driver = {
15744                 .name =         "advansys",
15745                 .probe =        advansys_eisa_probe,
15746                 .remove =       __devexit_p(advansys_eisa_remove),
15747         }
15748 };
15749
15750 /* PCI Devices supported by this driver */
15751 static struct pci_device_id advansys_pci_tbl[] __devinitdata = {
15752         {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
15753          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
15754         {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940,
15755          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
15756         {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940U,
15757          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
15758         {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940UW,
15759          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
15760         {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C0800_REV1,
15761          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
15762         {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C1600_REV1,
15763          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
15764         {}
15765 };
15766
15767 MODULE_DEVICE_TABLE(pci, advansys_pci_tbl);
15768
15769 static void __devinit advansys_set_latency(struct pci_dev *pdev)
15770 {
15771         if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) ||
15772             (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) {
15773                 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0);
15774         } else {
15775                 u8 latency;
15776                 pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency);
15777                 if (latency < 0x20)
15778                         pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x20);
15779         }
15780 }
15781
15782 static int __devinit
15783 advansys_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
15784 {
15785         int err, ioport;
15786         struct Scsi_Host *shost;
15787
15788         err = pci_enable_device(pdev);
15789         if (err)
15790                 goto fail;
15791         err = pci_request_regions(pdev, "advansys");
15792         if (err)
15793                 goto disable_device;
15794         pci_set_master(pdev);
15795         advansys_set_latency(pdev);
15796
15797         if (pci_resource_len(pdev, 0) == 0)
15798                 goto nodev;
15799
15800         ioport = pci_resource_start(pdev, 0);
15801         shost = advansys_board_found(ioport, &pdev->dev, ASC_IS_PCI);
15802
15803         if (!shost)
15804                 goto nodev;
15805
15806         pci_set_drvdata(pdev, shost);
15807         return 0;
15808
15809  nodev:
15810         err = -ENODEV;
15811         pci_release_regions(pdev);
15812  disable_device:
15813         pci_disable_device(pdev);
15814  fail:
15815         return err;
15816 }
15817
15818 static void __devexit advansys_pci_remove(struct pci_dev *pdev)
15819 {
15820         advansys_release(pci_get_drvdata(pdev));
15821         pci_release_regions(pdev);
15822         pci_disable_device(pdev);
15823 }
15824
15825 static struct pci_driver advansys_pci_driver = {
15826         .name =         "advansys",
15827         .id_table =     advansys_pci_tbl,
15828         .probe =        advansys_pci_probe,
15829         .remove =       __devexit_p(advansys_pci_remove),
15830 };
15831
15832 static int __init advansys_init(void)
15833 {
15834         int error;
15835
15836         error = isa_register_driver(&advansys_isa_driver,
15837                                     ASC_IOADR_TABLE_MAX_IX);
15838         if (error)
15839                 goto fail;
15840
15841         error = isa_register_driver(&advansys_vlb_driver,
15842                                     ASC_IOADR_TABLE_MAX_IX);
15843         if (error)
15844                 goto unregister_isa;
15845
15846         error = eisa_driver_register(&advansys_eisa_driver);
15847         if (error)
15848                 goto unregister_vlb;
15849
15850         error = pci_register_driver(&advansys_pci_driver);
15851         if (error)
15852                 goto unregister_eisa;
15853
15854         return 0;
15855
15856  unregister_eisa:
15857         eisa_driver_unregister(&advansys_eisa_driver);
15858  unregister_vlb:
15859         isa_unregister_driver(&advansys_vlb_driver);
15860  unregister_isa:
15861         isa_unregister_driver(&advansys_isa_driver);
15862  fail:
15863         return error;
15864 }
15865
15866 static void __exit advansys_exit(void)
15867 {
15868         pci_unregister_driver(&advansys_pci_driver);
15869         eisa_driver_unregister(&advansys_eisa_driver);
15870         isa_unregister_driver(&advansys_vlb_driver);
15871         isa_unregister_driver(&advansys_isa_driver);
15872 }
15873
15874 module_init(advansys_init);
15875 module_exit(advansys_exit);
15876
15877 MODULE_LICENSE("GPL");