xref: /openbmc/linux/drivers/scsi/advansys.c (revision 9ac8d3fb)
1 #define DRV_NAME "advansys"
2 #define ASC_VERSION "3.4"	/* AdvanSys Driver Version */
3 
4 /*
5  * advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
6  *
7  * Copyright (c) 1995-2000 Advanced System Products, Inc.
8  * Copyright (c) 2000-2001 ConnectCom Solutions, Inc.
9  * Copyright (c) 2007 Matthew Wilcox <matthew@wil.cx>
10  * All Rights Reserved.
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  */
17 
18 /*
19  * As of March 8, 2000 Advanced System Products, Inc. (AdvanSys)
20  * changed its name to ConnectCom Solutions, Inc.
21  * On June 18, 2001 Initio Corp. acquired ConnectCom's SCSI assets
22  */
23 
24 #include <linux/module.h>
25 #include <linux/string.h>
26 #include <linux/kernel.h>
27 #include <linux/types.h>
28 #include <linux/ioport.h>
29 #include <linux/interrupt.h>
30 #include <linux/delay.h>
31 #include <linux/slab.h>
32 #include <linux/mm.h>
33 #include <linux/proc_fs.h>
34 #include <linux/init.h>
35 #include <linux/blkdev.h>
36 #include <linux/isa.h>
37 #include <linux/eisa.h>
38 #include <linux/pci.h>
39 #include <linux/spinlock.h>
40 #include <linux/dma-mapping.h>
41 
42 #include <asm/io.h>
43 #include <asm/system.h>
44 #include <asm/dma.h>
45 
46 #include <scsi/scsi_cmnd.h>
47 #include <scsi/scsi_device.h>
48 #include <scsi/scsi_tcq.h>
49 #include <scsi/scsi.h>
50 #include <scsi/scsi_host.h>
51 
52 /* FIXME:
53  *
54  *  1. Although all of the necessary command mapping places have the
55  *     appropriate dma_map.. APIs, the driver still processes its internal
56  *     queue using bus_to_virt() and virt_to_bus() which are illegal under
57  *     the API.  The entire queue processing structure will need to be
58  *     altered to fix this.
59  *  2. Need to add memory mapping workaround. Test the memory mapping.
60  *     If it doesn't work revert to I/O port access. Can a test be done
61  *     safely?
62  *  3. Handle an interrupt not working. Keep an interrupt counter in
63  *     the interrupt handler. In the timeout function if the interrupt
64  *     has not occurred then print a message and run in polled mode.
65  *  4. Need to add support for target mode commands, cf. CAM XPT.
66  *  5. check DMA mapping functions for failure
67  *  6. Use scsi_transport_spi
68  *  7. advansys_info is not safe against multiple simultaneous callers
69  *  8. Add module_param to override ISA/VLB ioport array
70  */
71 #warning this driver is still not properly converted to the DMA API
72 
73 /* Enable driver /proc statistics. */
74 #define ADVANSYS_STATS
75 
76 /* Enable driver tracing. */
77 #undef ADVANSYS_DEBUG
78 
79 /*
80  * Portable Data Types
81  *
82  * Any instance where a 32-bit long or pointer type is assumed
83  * for precision or HW defined structures, the following define
84  * types must be used. In Linux the char, short, and int types
85  * are all consistent at 8, 16, and 32 bits respectively. Pointers
86  * and long types are 64 bits on Alpha and UltraSPARC.
87  */
88 #define ASC_PADDR __u32		/* Physical/Bus address data type. */
89 #define ASC_VADDR __u32		/* Virtual address data type. */
90 #define ASC_DCNT  __u32		/* Unsigned Data count type. */
91 #define ASC_SDCNT __s32		/* Signed Data count type. */
92 
93 typedef unsigned char uchar;
94 
95 #ifndef TRUE
96 #define TRUE     (1)
97 #endif
98 #ifndef FALSE
99 #define FALSE    (0)
100 #endif
101 
102 #define ERR      (-1)
103 #define UW_ERR   (uint)(0xFFFF)
104 #define isodd_word(val)   ((((uint)val) & (uint)0x0001) != 0)
105 
106 #define PCI_VENDOR_ID_ASP		0x10cd
107 #define PCI_DEVICE_ID_ASP_1200A		0x1100
108 #define PCI_DEVICE_ID_ASP_ABP940	0x1200
109 #define PCI_DEVICE_ID_ASP_ABP940U	0x1300
110 #define PCI_DEVICE_ID_ASP_ABP940UW	0x2300
111 #define PCI_DEVICE_ID_38C0800_REV1	0x2500
112 #define PCI_DEVICE_ID_38C1600_REV1	0x2700
113 
114 /*
115  * Enable CC_VERY_LONG_SG_LIST to support up to 64K element SG lists.
116  * The SRB structure will have to be changed and the ASC_SRB2SCSIQ()
117  * macro re-defined to be able to obtain a ASC_SCSI_Q pointer from the
118  * SRB structure.
119  */
120 #define CC_VERY_LONG_SG_LIST 0
121 #define ASC_SRB2SCSIQ(srb_ptr)  (srb_ptr)
122 
123 #define PortAddr                 unsigned int	/* port address size  */
124 #define inp(port)                inb(port)
125 #define outp(port, byte)         outb((byte), (port))
126 
127 #define inpw(port)               inw(port)
128 #define outpw(port, word)        outw((word), (port))
129 
130 #define ASC_MAX_SG_QUEUE    7
131 #define ASC_MAX_SG_LIST     255
132 
133 #define ASC_CS_TYPE  unsigned short
134 
135 #define ASC_IS_ISA          (0x0001)
136 #define ASC_IS_ISAPNP       (0x0081)
137 #define ASC_IS_EISA         (0x0002)
138 #define ASC_IS_PCI          (0x0004)
139 #define ASC_IS_PCI_ULTRA    (0x0104)
140 #define ASC_IS_PCMCIA       (0x0008)
141 #define ASC_IS_MCA          (0x0020)
142 #define ASC_IS_VL           (0x0040)
143 #define ASC_IS_WIDESCSI_16  (0x0100)
144 #define ASC_IS_WIDESCSI_32  (0x0200)
145 #define ASC_IS_BIG_ENDIAN   (0x8000)
146 
147 #define ASC_CHIP_MIN_VER_VL      (0x01)
148 #define ASC_CHIP_MAX_VER_VL      (0x07)
149 #define ASC_CHIP_MIN_VER_PCI     (0x09)
150 #define ASC_CHIP_MAX_VER_PCI     (0x0F)
151 #define ASC_CHIP_VER_PCI_BIT     (0x08)
152 #define ASC_CHIP_MIN_VER_ISA     (0x11)
153 #define ASC_CHIP_MIN_VER_ISA_PNP (0x21)
154 #define ASC_CHIP_MAX_VER_ISA     (0x27)
155 #define ASC_CHIP_VER_ISA_BIT     (0x30)
156 #define ASC_CHIP_VER_ISAPNP_BIT  (0x20)
157 #define ASC_CHIP_VER_ASYN_BUG    (0x21)
158 #define ASC_CHIP_VER_PCI             0x08
159 #define ASC_CHIP_VER_PCI_ULTRA_3150  (ASC_CHIP_VER_PCI | 0x02)
160 #define ASC_CHIP_VER_PCI_ULTRA_3050  (ASC_CHIP_VER_PCI | 0x03)
161 #define ASC_CHIP_MIN_VER_EISA (0x41)
162 #define ASC_CHIP_MAX_VER_EISA (0x47)
163 #define ASC_CHIP_VER_EISA_BIT (0x40)
164 #define ASC_CHIP_LATEST_VER_EISA   ((ASC_CHIP_MIN_VER_EISA - 1) + 3)
165 #define ASC_MAX_VL_DMA_COUNT    (0x07FFFFFFL)
166 #define ASC_MAX_PCI_DMA_COUNT   (0xFFFFFFFFL)
167 #define ASC_MAX_ISA_DMA_COUNT   (0x00FFFFFFL)
168 
169 #define ASC_SCSI_ID_BITS  3
170 #define ASC_SCSI_TIX_TYPE     uchar
171 #define ASC_ALL_DEVICE_BIT_SET  0xFF
172 #define ASC_SCSI_BIT_ID_TYPE  uchar
173 #define ASC_MAX_TID       7
174 #define ASC_MAX_LUN       7
175 #define ASC_SCSI_WIDTH_BIT_SET  0xFF
176 #define ASC_MAX_SENSE_LEN   32
177 #define ASC_MIN_SENSE_LEN   14
178 #define ASC_SCSI_RESET_HOLD_TIME_US  60
179 
180 /*
181  * Narrow boards only support 12-byte commands, while wide boards
182  * extend to 16-byte commands.
183  */
184 #define ASC_MAX_CDB_LEN     12
185 #define ADV_MAX_CDB_LEN     16
186 
187 #define MS_SDTR_LEN    0x03
188 #define MS_WDTR_LEN    0x02
189 
190 #define ASC_SG_LIST_PER_Q   7
191 #define QS_FREE        0x00
192 #define QS_READY       0x01
193 #define QS_DISC1       0x02
194 #define QS_DISC2       0x04
195 #define QS_BUSY        0x08
196 #define QS_ABORTED     0x40
197 #define QS_DONE        0x80
198 #define QC_NO_CALLBACK   0x01
199 #define QC_SG_SWAP_QUEUE 0x02
200 #define QC_SG_HEAD       0x04
201 #define QC_DATA_IN       0x08
202 #define QC_DATA_OUT      0x10
203 #define QC_URGENT        0x20
204 #define QC_MSG_OUT       0x40
205 #define QC_REQ_SENSE     0x80
206 #define QCSG_SG_XFER_LIST  0x02
207 #define QCSG_SG_XFER_MORE  0x04
208 #define QCSG_SG_XFER_END   0x08
209 #define QD_IN_PROGRESS       0x00
210 #define QD_NO_ERROR          0x01
211 #define QD_ABORTED_BY_HOST   0x02
212 #define QD_WITH_ERROR        0x04
213 #define QD_INVALID_REQUEST   0x80
214 #define QD_INVALID_HOST_NUM  0x81
215 #define QD_INVALID_DEVICE    0x82
216 #define QD_ERR_INTERNAL      0xFF
217 #define QHSTA_NO_ERROR               0x00
218 #define QHSTA_M_SEL_TIMEOUT          0x11
219 #define QHSTA_M_DATA_OVER_RUN        0x12
220 #define QHSTA_M_DATA_UNDER_RUN       0x12
221 #define QHSTA_M_UNEXPECTED_BUS_FREE  0x13
222 #define QHSTA_M_BAD_BUS_PHASE_SEQ    0x14
223 #define QHSTA_D_QDONE_SG_LIST_CORRUPTED 0x21
224 #define QHSTA_D_ASC_DVC_ERROR_CODE_SET  0x22
225 #define QHSTA_D_HOST_ABORT_FAILED       0x23
226 #define QHSTA_D_EXE_SCSI_Q_FAILED       0x24
227 #define QHSTA_D_EXE_SCSI_Q_BUSY_TIMEOUT 0x25
228 #define QHSTA_D_ASPI_NO_BUF_POOL        0x26
229 #define QHSTA_M_WTM_TIMEOUT         0x41
230 #define QHSTA_M_BAD_CMPL_STATUS_IN  0x42
231 #define QHSTA_M_NO_AUTO_REQ_SENSE   0x43
232 #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
233 #define QHSTA_M_TARGET_STATUS_BUSY  0x45
234 #define QHSTA_M_BAD_TAG_CODE        0x46
235 #define QHSTA_M_BAD_QUEUE_FULL_OR_BUSY  0x47
236 #define QHSTA_M_HUNG_REQ_SCSI_BUS_RESET 0x48
237 #define QHSTA_D_LRAM_CMP_ERROR        0x81
238 #define QHSTA_M_MICRO_CODE_ERROR_HALT 0xA1
239 #define ASC_FLAG_SCSIQ_REQ        0x01
240 #define ASC_FLAG_BIOS_SCSIQ_REQ   0x02
241 #define ASC_FLAG_BIOS_ASYNC_IO    0x04
242 #define ASC_FLAG_SRB_LINEAR_ADDR  0x08
243 #define ASC_FLAG_WIN16            0x10
244 #define ASC_FLAG_WIN32            0x20
245 #define ASC_FLAG_ISA_OVER_16MB    0x40
246 #define ASC_FLAG_DOS_VM_CALLBACK  0x80
247 #define ASC_TAG_FLAG_EXTRA_BYTES               0x10
248 #define ASC_TAG_FLAG_DISABLE_DISCONNECT        0x04
249 #define ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX  0x08
250 #define ASC_TAG_FLAG_DISABLE_CHK_COND_INT_HOST 0x40
251 #define ASC_SCSIQ_CPY_BEG              4
252 #define ASC_SCSIQ_SGHD_CPY_BEG         2
253 #define ASC_SCSIQ_B_FWD                0
254 #define ASC_SCSIQ_B_BWD                1
255 #define ASC_SCSIQ_B_STATUS             2
256 #define ASC_SCSIQ_B_QNO                3
257 #define ASC_SCSIQ_B_CNTL               4
258 #define ASC_SCSIQ_B_SG_QUEUE_CNT       5
259 #define ASC_SCSIQ_D_DATA_ADDR          8
260 #define ASC_SCSIQ_D_DATA_CNT          12
261 #define ASC_SCSIQ_B_SENSE_LEN         20
262 #define ASC_SCSIQ_DONE_INFO_BEG       22
263 #define ASC_SCSIQ_D_SRBPTR            22
264 #define ASC_SCSIQ_B_TARGET_IX         26
265 #define ASC_SCSIQ_B_CDB_LEN           28
266 #define ASC_SCSIQ_B_TAG_CODE          29
267 #define ASC_SCSIQ_W_VM_ID             30
268 #define ASC_SCSIQ_DONE_STATUS         32
269 #define ASC_SCSIQ_HOST_STATUS         33
270 #define ASC_SCSIQ_SCSI_STATUS         34
271 #define ASC_SCSIQ_CDB_BEG             36
272 #define ASC_SCSIQ_DW_REMAIN_XFER_ADDR 56
273 #define ASC_SCSIQ_DW_REMAIN_XFER_CNT  60
274 #define ASC_SCSIQ_B_FIRST_SG_WK_QP    48
275 #define ASC_SCSIQ_B_SG_WK_QP          49
276 #define ASC_SCSIQ_B_SG_WK_IX          50
277 #define ASC_SCSIQ_W_ALT_DC1           52
278 #define ASC_SCSIQ_B_LIST_CNT          6
279 #define ASC_SCSIQ_B_CUR_LIST_CNT      7
280 #define ASC_SGQ_B_SG_CNTL             4
281 #define ASC_SGQ_B_SG_HEAD_QP          5
282 #define ASC_SGQ_B_SG_LIST_CNT         6
283 #define ASC_SGQ_B_SG_CUR_LIST_CNT     7
284 #define ASC_SGQ_LIST_BEG              8
285 #define ASC_DEF_SCSI1_QNG    4
286 #define ASC_MAX_SCSI1_QNG    4
287 #define ASC_DEF_SCSI2_QNG    16
288 #define ASC_MAX_SCSI2_QNG    32
289 #define ASC_TAG_CODE_MASK    0x23
290 #define ASC_STOP_REQ_RISC_STOP      0x01
291 #define ASC_STOP_ACK_RISC_STOP      0x03
292 #define ASC_STOP_CLEAN_UP_BUSY_Q    0x10
293 #define ASC_STOP_CLEAN_UP_DISC_Q    0x20
294 #define ASC_STOP_HOST_REQ_RISC_HALT 0x40
295 #define ASC_TIDLUN_TO_IX(tid, lun)  (ASC_SCSI_TIX_TYPE)((tid) + ((lun)<<ASC_SCSI_ID_BITS))
296 #define ASC_TID_TO_TARGET_ID(tid)   (ASC_SCSI_BIT_ID_TYPE)(0x01 << (tid))
297 #define ASC_TIX_TO_TARGET_ID(tix)   (0x01 << ((tix) & ASC_MAX_TID))
298 #define ASC_TIX_TO_TID(tix)         ((tix) & ASC_MAX_TID)
299 #define ASC_TID_TO_TIX(tid)         ((tid) & ASC_MAX_TID)
300 #define ASC_TIX_TO_LUN(tix)         (((tix) >> ASC_SCSI_ID_BITS) & ASC_MAX_LUN)
301 #define ASC_QNO_TO_QADDR(q_no)      ((ASC_QADR_BEG)+((int)(q_no) << 6))
302 
303 typedef struct asc_scsiq_1 {
304 	uchar status;
305 	uchar q_no;
306 	uchar cntl;
307 	uchar sg_queue_cnt;
308 	uchar target_id;
309 	uchar target_lun;
310 	ASC_PADDR data_addr;
311 	ASC_DCNT data_cnt;
312 	ASC_PADDR sense_addr;
313 	uchar sense_len;
314 	uchar extra_bytes;
315 } ASC_SCSIQ_1;
316 
317 typedef struct asc_scsiq_2 {
318 	ASC_VADDR srb_ptr;
319 	uchar target_ix;
320 	uchar flag;
321 	uchar cdb_len;
322 	uchar tag_code;
323 	ushort vm_id;
324 } ASC_SCSIQ_2;
325 
326 typedef struct asc_scsiq_3 {
327 	uchar done_stat;
328 	uchar host_stat;
329 	uchar scsi_stat;
330 	uchar scsi_msg;
331 } ASC_SCSIQ_3;
332 
333 typedef struct asc_scsiq_4 {
334 	uchar cdb[ASC_MAX_CDB_LEN];
335 	uchar y_first_sg_list_qp;
336 	uchar y_working_sg_qp;
337 	uchar y_working_sg_ix;
338 	uchar y_res;
339 	ushort x_req_count;
340 	ushort x_reconnect_rtn;
341 	ASC_PADDR x_saved_data_addr;
342 	ASC_DCNT x_saved_data_cnt;
343 } ASC_SCSIQ_4;
344 
345 typedef struct asc_q_done_info {
346 	ASC_SCSIQ_2 d2;
347 	ASC_SCSIQ_3 d3;
348 	uchar q_status;
349 	uchar q_no;
350 	uchar cntl;
351 	uchar sense_len;
352 	uchar extra_bytes;
353 	uchar res;
354 	ASC_DCNT remain_bytes;
355 } ASC_QDONE_INFO;
356 
357 typedef struct asc_sg_list {
358 	ASC_PADDR addr;
359 	ASC_DCNT bytes;
360 } ASC_SG_LIST;
361 
362 typedef struct asc_sg_head {
363 	ushort entry_cnt;
364 	ushort queue_cnt;
365 	ushort entry_to_copy;
366 	ushort res;
367 	ASC_SG_LIST sg_list[0];
368 } ASC_SG_HEAD;
369 
370 typedef struct asc_scsi_q {
371 	ASC_SCSIQ_1 q1;
372 	ASC_SCSIQ_2 q2;
373 	uchar *cdbptr;
374 	ASC_SG_HEAD *sg_head;
375 	ushort remain_sg_entry_cnt;
376 	ushort next_sg_index;
377 } ASC_SCSI_Q;
378 
379 typedef struct asc_scsi_req_q {
380 	ASC_SCSIQ_1 r1;
381 	ASC_SCSIQ_2 r2;
382 	uchar *cdbptr;
383 	ASC_SG_HEAD *sg_head;
384 	uchar *sense_ptr;
385 	ASC_SCSIQ_3 r3;
386 	uchar cdb[ASC_MAX_CDB_LEN];
387 	uchar sense[ASC_MIN_SENSE_LEN];
388 } ASC_SCSI_REQ_Q;
389 
390 typedef struct asc_scsi_bios_req_q {
391 	ASC_SCSIQ_1 r1;
392 	ASC_SCSIQ_2 r2;
393 	uchar *cdbptr;
394 	ASC_SG_HEAD *sg_head;
395 	uchar *sense_ptr;
396 	ASC_SCSIQ_3 r3;
397 	uchar cdb[ASC_MAX_CDB_LEN];
398 	uchar sense[ASC_MIN_SENSE_LEN];
399 } ASC_SCSI_BIOS_REQ_Q;
400 
401 typedef struct asc_risc_q {
402 	uchar fwd;
403 	uchar bwd;
404 	ASC_SCSIQ_1 i1;
405 	ASC_SCSIQ_2 i2;
406 	ASC_SCSIQ_3 i3;
407 	ASC_SCSIQ_4 i4;
408 } ASC_RISC_Q;
409 
410 typedef struct asc_sg_list_q {
411 	uchar seq_no;
412 	uchar q_no;
413 	uchar cntl;
414 	uchar sg_head_qp;
415 	uchar sg_list_cnt;
416 	uchar sg_cur_list_cnt;
417 } ASC_SG_LIST_Q;
418 
419 typedef struct asc_risc_sg_list_q {
420 	uchar fwd;
421 	uchar bwd;
422 	ASC_SG_LIST_Q sg;
423 	ASC_SG_LIST sg_list[7];
424 } ASC_RISC_SG_LIST_Q;
425 
426 #define ASCQ_ERR_Q_STATUS             0x0D
427 #define ASCQ_ERR_CUR_QNG              0x17
428 #define ASCQ_ERR_SG_Q_LINKS           0x18
429 #define ASCQ_ERR_ISR_RE_ENTRY         0x1A
430 #define ASCQ_ERR_CRITICAL_RE_ENTRY    0x1B
431 #define ASCQ_ERR_ISR_ON_CRITICAL      0x1C
432 
433 /*
434  * Warning code values are set in ASC_DVC_VAR  'warn_code'.
435  */
436 #define ASC_WARN_NO_ERROR             0x0000
437 #define ASC_WARN_IO_PORT_ROTATE       0x0001
438 #define ASC_WARN_EEPROM_CHKSUM        0x0002
439 #define ASC_WARN_IRQ_MODIFIED         0x0004
440 #define ASC_WARN_AUTO_CONFIG          0x0008
441 #define ASC_WARN_CMD_QNG_CONFLICT     0x0010
442 #define ASC_WARN_EEPROM_RECOVER       0x0020
443 #define ASC_WARN_CFG_MSW_RECOVER      0x0040
444 
445 /*
446  * Error code values are set in {ASC/ADV}_DVC_VAR  'err_code'.
447  */
448 #define ASC_IERR_NO_CARRIER		0x0001	/* No more carrier memory */
449 #define ASC_IERR_MCODE_CHKSUM		0x0002	/* micro code check sum error */
450 #define ASC_IERR_SET_PC_ADDR		0x0004
451 #define ASC_IERR_START_STOP_CHIP	0x0008	/* start/stop chip failed */
452 #define ASC_IERR_ILLEGAL_CONNECTION	0x0010	/* Illegal cable connection */
453 #define ASC_IERR_SINGLE_END_DEVICE	0x0020	/* SE device on DIFF bus */
454 #define ASC_IERR_REVERSED_CABLE		0x0040	/* Narrow flat cable reversed */
455 #define ASC_IERR_SET_SCSI_ID		0x0080	/* set SCSI ID failed */
456 #define ASC_IERR_HVD_DEVICE		0x0100	/* HVD device on LVD port */
457 #define ASC_IERR_BAD_SIGNATURE		0x0200	/* signature not found */
458 #define ASC_IERR_NO_BUS_TYPE		0x0400
459 #define ASC_IERR_BIST_PRE_TEST		0x0800	/* BIST pre-test error */
460 #define ASC_IERR_BIST_RAM_TEST		0x1000	/* BIST RAM test error */
461 #define ASC_IERR_BAD_CHIPTYPE		0x2000	/* Invalid chip_type setting */
462 
463 #define ASC_DEF_MAX_TOTAL_QNG   (0xF0)
464 #define ASC_MIN_TAG_Q_PER_DVC   (0x04)
465 #define ASC_MIN_FREE_Q        (0x02)
466 #define ASC_MIN_TOTAL_QNG     ((ASC_MAX_SG_QUEUE)+(ASC_MIN_FREE_Q))
467 #define ASC_MAX_TOTAL_QNG 240
468 #define ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG 16
469 #define ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG   8
470 #define ASC_MAX_PCI_INRAM_TOTAL_QNG  20
471 #define ASC_MAX_INRAM_TAG_QNG   16
472 #define ASC_IOADR_GAP   0x10
473 #define ASC_SYN_MAX_OFFSET         0x0F
474 #define ASC_DEF_SDTR_OFFSET        0x0F
475 #define ASC_SDTR_ULTRA_PCI_10MB_INDEX  0x02
476 #define ASYN_SDTR_DATA_FIX_PCI_REV_AB 0x41
477 
478 /* The narrow chip only supports a limited selection of transfer rates.
479  * These are encoded in the range 0..7 or 0..15 depending whether the chip
480  * is Ultra-capable or not.  These tables let us convert from one to the other.
481  */
482 static const unsigned char asc_syn_xfer_period[8] = {
483 	25, 30, 35, 40, 50, 60, 70, 85
484 };
485 
486 static const unsigned char asc_syn_ultra_xfer_period[16] = {
487 	12, 19, 25, 32, 38, 44, 50, 57, 63, 69, 75, 82, 88, 94, 100, 107
488 };
489 
490 typedef struct ext_msg {
491 	uchar msg_type;
492 	uchar msg_len;
493 	uchar msg_req;
494 	union {
495 		struct {
496 			uchar sdtr_xfer_period;
497 			uchar sdtr_req_ack_offset;
498 		} sdtr;
499 		struct {
500 			uchar wdtr_width;
501 		} wdtr;
502 		struct {
503 			uchar mdp_b3;
504 			uchar mdp_b2;
505 			uchar mdp_b1;
506 			uchar mdp_b0;
507 		} mdp;
508 	} u_ext_msg;
509 	uchar res;
510 } EXT_MSG;
511 
512 #define xfer_period     u_ext_msg.sdtr.sdtr_xfer_period
513 #define req_ack_offset  u_ext_msg.sdtr.sdtr_req_ack_offset
514 #define wdtr_width      u_ext_msg.wdtr.wdtr_width
515 #define mdp_b3          u_ext_msg.mdp_b3
516 #define mdp_b2          u_ext_msg.mdp_b2
517 #define mdp_b1          u_ext_msg.mdp_b1
518 #define mdp_b0          u_ext_msg.mdp_b0
519 
520 typedef struct asc_dvc_cfg {
521 	ASC_SCSI_BIT_ID_TYPE can_tagged_qng;
522 	ASC_SCSI_BIT_ID_TYPE cmd_qng_enabled;
523 	ASC_SCSI_BIT_ID_TYPE disc_enable;
524 	ASC_SCSI_BIT_ID_TYPE sdtr_enable;
525 	uchar chip_scsi_id;
526 	uchar isa_dma_speed;
527 	uchar isa_dma_channel;
528 	uchar chip_version;
529 	ushort mcode_date;
530 	ushort mcode_version;
531 	uchar max_tag_qng[ASC_MAX_TID + 1];
532 	uchar sdtr_period_offset[ASC_MAX_TID + 1];
533 	uchar adapter_info[6];
534 } ASC_DVC_CFG;
535 
536 #define ASC_DEF_DVC_CNTL       0xFFFF
537 #define ASC_DEF_CHIP_SCSI_ID   7
538 #define ASC_DEF_ISA_DMA_SPEED  4
539 #define ASC_INIT_STATE_BEG_GET_CFG   0x0001
540 #define ASC_INIT_STATE_END_GET_CFG   0x0002
541 #define ASC_INIT_STATE_BEG_SET_CFG   0x0004
542 #define ASC_INIT_STATE_END_SET_CFG   0x0008
543 #define ASC_INIT_STATE_BEG_LOAD_MC   0x0010
544 #define ASC_INIT_STATE_END_LOAD_MC   0x0020
545 #define ASC_INIT_STATE_BEG_INQUIRY   0x0040
546 #define ASC_INIT_STATE_END_INQUIRY   0x0080
547 #define ASC_INIT_RESET_SCSI_DONE     0x0100
548 #define ASC_INIT_STATE_WITHOUT_EEP   0x8000
549 #define ASC_BUG_FIX_IF_NOT_DWB       0x0001
550 #define ASC_BUG_FIX_ASYN_USE_SYN     0x0002
551 #define ASC_MIN_TAGGED_CMD  7
552 #define ASC_MAX_SCSI_RESET_WAIT      30
553 #define ASC_OVERRUN_BSIZE		64
554 
555 struct asc_dvc_var;		/* Forward Declaration. */
556 
557 typedef struct asc_dvc_var {
558 	PortAddr iop_base;
559 	ushort err_code;
560 	ushort dvc_cntl;
561 	ushort bug_fix_cntl;
562 	ushort bus_type;
563 	ASC_SCSI_BIT_ID_TYPE init_sdtr;
564 	ASC_SCSI_BIT_ID_TYPE sdtr_done;
565 	ASC_SCSI_BIT_ID_TYPE use_tagged_qng;
566 	ASC_SCSI_BIT_ID_TYPE unit_not_ready;
567 	ASC_SCSI_BIT_ID_TYPE queue_full_or_busy;
568 	ASC_SCSI_BIT_ID_TYPE start_motor;
569 	uchar *overrun_buf;
570 	dma_addr_t overrun_dma;
571 	uchar scsi_reset_wait;
572 	uchar chip_no;
573 	char is_in_int;
574 	uchar max_total_qng;
575 	uchar cur_total_qng;
576 	uchar in_critical_cnt;
577 	uchar last_q_shortage;
578 	ushort init_state;
579 	uchar cur_dvc_qng[ASC_MAX_TID + 1];
580 	uchar max_dvc_qng[ASC_MAX_TID + 1];
581 	ASC_SCSI_Q *scsiq_busy_head[ASC_MAX_TID + 1];
582 	ASC_SCSI_Q *scsiq_busy_tail[ASC_MAX_TID + 1];
583 	const uchar *sdtr_period_tbl;
584 	ASC_DVC_CFG *cfg;
585 	ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer_always;
586 	char redo_scam;
587 	ushort res2;
588 	uchar dos_int13_table[ASC_MAX_TID + 1];
589 	ASC_DCNT max_dma_count;
590 	ASC_SCSI_BIT_ID_TYPE no_scam;
591 	ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer;
592 	uchar min_sdtr_index;
593 	uchar max_sdtr_index;
594 	struct asc_board *drv_ptr;
595 	int ptr_map_count;
596 	void **ptr_map;
597 	ASC_DCNT uc_break;
598 } ASC_DVC_VAR;
599 
600 typedef struct asc_dvc_inq_info {
601 	uchar type[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
602 } ASC_DVC_INQ_INFO;
603 
604 typedef struct asc_cap_info {
605 	ASC_DCNT lba;
606 	ASC_DCNT blk_size;
607 } ASC_CAP_INFO;
608 
609 typedef struct asc_cap_info_array {
610 	ASC_CAP_INFO cap_info[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
611 } ASC_CAP_INFO_ARRAY;
612 
613 #define ASC_MCNTL_NO_SEL_TIMEOUT  (ushort)0x0001
614 #define ASC_MCNTL_NULL_TARGET     (ushort)0x0002
615 #define ASC_CNTL_INITIATOR         (ushort)0x0001
616 #define ASC_CNTL_BIOS_GT_1GB       (ushort)0x0002
617 #define ASC_CNTL_BIOS_GT_2_DISK    (ushort)0x0004
618 #define ASC_CNTL_BIOS_REMOVABLE    (ushort)0x0008
619 #define ASC_CNTL_NO_SCAM           (ushort)0x0010
620 #define ASC_CNTL_INT_MULTI_Q       (ushort)0x0080
621 #define ASC_CNTL_NO_LUN_SUPPORT    (ushort)0x0040
622 #define ASC_CNTL_NO_VERIFY_COPY    (ushort)0x0100
623 #define ASC_CNTL_RESET_SCSI        (ushort)0x0200
624 #define ASC_CNTL_INIT_INQUIRY      (ushort)0x0400
625 #define ASC_CNTL_INIT_VERBOSE      (ushort)0x0800
626 #define ASC_CNTL_SCSI_PARITY       (ushort)0x1000
627 #define ASC_CNTL_BURST_MODE        (ushort)0x2000
628 #define ASC_CNTL_SDTR_ENABLE_ULTRA (ushort)0x4000
629 #define ASC_EEP_DVC_CFG_BEG_VL    2
630 #define ASC_EEP_MAX_DVC_ADDR_VL   15
631 #define ASC_EEP_DVC_CFG_BEG      32
632 #define ASC_EEP_MAX_DVC_ADDR     45
633 #define ASC_EEP_MAX_RETRY        20
634 
635 /*
636  * These macros keep the chip SCSI id and ISA DMA speed
637  * bitfields in board order. C bitfields aren't portable
638  * between big and little-endian platforms so they are
639  * not used.
640  */
641 
642 #define ASC_EEP_GET_CHIP_ID(cfg)    ((cfg)->id_speed & 0x0f)
643 #define ASC_EEP_GET_DMA_SPD(cfg)    (((cfg)->id_speed & 0xf0) >> 4)
644 #define ASC_EEP_SET_CHIP_ID(cfg, sid) \
645    ((cfg)->id_speed = ((cfg)->id_speed & 0xf0) | ((sid) & ASC_MAX_TID))
646 #define ASC_EEP_SET_DMA_SPD(cfg, spd) \
647    ((cfg)->id_speed = ((cfg)->id_speed & 0x0f) | ((spd) & 0x0f) << 4)
648 
649 typedef struct asceep_config {
650 	ushort cfg_lsw;
651 	ushort cfg_msw;
652 	uchar init_sdtr;
653 	uchar disc_enable;
654 	uchar use_cmd_qng;
655 	uchar start_motor;
656 	uchar max_total_qng;
657 	uchar max_tag_qng;
658 	uchar bios_scan;
659 	uchar power_up_wait;
660 	uchar no_scam;
661 	uchar id_speed;		/* low order 4 bits is chip scsi id */
662 	/* high order 4 bits is isa dma speed */
663 	uchar dos_int13_table[ASC_MAX_TID + 1];
664 	uchar adapter_info[6];
665 	ushort cntl;
666 	ushort chksum;
667 } ASCEEP_CONFIG;
668 
669 #define ASC_EEP_CMD_READ          0x80
670 #define ASC_EEP_CMD_WRITE         0x40
671 #define ASC_EEP_CMD_WRITE_ABLE    0x30
672 #define ASC_EEP_CMD_WRITE_DISABLE 0x00
673 #define ASCV_MSGOUT_BEG         0x0000
674 #define ASCV_MSGOUT_SDTR_PERIOD (ASCV_MSGOUT_BEG+3)
675 #define ASCV_MSGOUT_SDTR_OFFSET (ASCV_MSGOUT_BEG+4)
676 #define ASCV_BREAK_SAVED_CODE   (ushort)0x0006
677 #define ASCV_MSGIN_BEG          (ASCV_MSGOUT_BEG+8)
678 #define ASCV_MSGIN_SDTR_PERIOD  (ASCV_MSGIN_BEG+3)
679 #define ASCV_MSGIN_SDTR_OFFSET  (ASCV_MSGIN_BEG+4)
680 #define ASCV_SDTR_DATA_BEG      (ASCV_MSGIN_BEG+8)
681 #define ASCV_SDTR_DONE_BEG      (ASCV_SDTR_DATA_BEG+8)
682 #define ASCV_MAX_DVC_QNG_BEG    (ushort)0x0020
683 #define ASCV_BREAK_ADDR           (ushort)0x0028
684 #define ASCV_BREAK_NOTIFY_COUNT   (ushort)0x002A
685 #define ASCV_BREAK_CONTROL        (ushort)0x002C
686 #define ASCV_BREAK_HIT_COUNT      (ushort)0x002E
687 
688 #define ASCV_ASCDVC_ERR_CODE_W  (ushort)0x0030
689 #define ASCV_MCODE_CHKSUM_W   (ushort)0x0032
690 #define ASCV_MCODE_SIZE_W     (ushort)0x0034
691 #define ASCV_STOP_CODE_B      (ushort)0x0036
692 #define ASCV_DVC_ERR_CODE_B   (ushort)0x0037
693 #define ASCV_OVERRUN_PADDR_D  (ushort)0x0038
694 #define ASCV_OVERRUN_BSIZE_D  (ushort)0x003C
695 #define ASCV_HALTCODE_W       (ushort)0x0040
696 #define ASCV_CHKSUM_W         (ushort)0x0042
697 #define ASCV_MC_DATE_W        (ushort)0x0044
698 #define ASCV_MC_VER_W         (ushort)0x0046
699 #define ASCV_NEXTRDY_B        (ushort)0x0048
700 #define ASCV_DONENEXT_B       (ushort)0x0049
701 #define ASCV_USE_TAGGED_QNG_B (ushort)0x004A
702 #define ASCV_SCSIBUSY_B       (ushort)0x004B
703 #define ASCV_Q_DONE_IN_PROGRESS_B  (ushort)0x004C
704 #define ASCV_CURCDB_B         (ushort)0x004D
705 #define ASCV_RCLUN_B          (ushort)0x004E
706 #define ASCV_BUSY_QHEAD_B     (ushort)0x004F
707 #define ASCV_DISC1_QHEAD_B    (ushort)0x0050
708 #define ASCV_DISC_ENABLE_B    (ushort)0x0052
709 #define ASCV_CAN_TAGGED_QNG_B (ushort)0x0053
710 #define ASCV_HOSTSCSI_ID_B    (ushort)0x0055
711 #define ASCV_MCODE_CNTL_B     (ushort)0x0056
712 #define ASCV_NULL_TARGET_B    (ushort)0x0057
713 #define ASCV_FREE_Q_HEAD_W    (ushort)0x0058
714 #define ASCV_DONE_Q_TAIL_W    (ushort)0x005A
715 #define ASCV_FREE_Q_HEAD_B    (ushort)(ASCV_FREE_Q_HEAD_W+1)
716 #define ASCV_DONE_Q_TAIL_B    (ushort)(ASCV_DONE_Q_TAIL_W+1)
717 #define ASCV_HOST_FLAG_B      (ushort)0x005D
718 #define ASCV_TOTAL_READY_Q_B  (ushort)0x0064
719 #define ASCV_VER_SERIAL_B     (ushort)0x0065
720 #define ASCV_HALTCODE_SAVED_W (ushort)0x0066
721 #define ASCV_WTM_FLAG_B       (ushort)0x0068
722 #define ASCV_RISC_FLAG_B      (ushort)0x006A
723 #define ASCV_REQ_SG_LIST_QP   (ushort)0x006B
724 #define ASC_HOST_FLAG_IN_ISR        0x01
725 #define ASC_HOST_FLAG_ACK_INT       0x02
726 #define ASC_RISC_FLAG_GEN_INT      0x01
727 #define ASC_RISC_FLAG_REQ_SG_LIST  0x02
728 #define IOP_CTRL         (0x0F)
729 #define IOP_STATUS       (0x0E)
730 #define IOP_INT_ACK      IOP_STATUS
731 #define IOP_REG_IFC      (0x0D)
732 #define IOP_SYN_OFFSET    (0x0B)
733 #define IOP_EXTRA_CONTROL (0x0D)
734 #define IOP_REG_PC        (0x0C)
735 #define IOP_RAM_ADDR      (0x0A)
736 #define IOP_RAM_DATA      (0x08)
737 #define IOP_EEP_DATA      (0x06)
738 #define IOP_EEP_CMD       (0x07)
739 #define IOP_VERSION       (0x03)
740 #define IOP_CONFIG_HIGH   (0x04)
741 #define IOP_CONFIG_LOW    (0x02)
742 #define IOP_SIG_BYTE      (0x01)
743 #define IOP_SIG_WORD      (0x00)
744 #define IOP_REG_DC1      (0x0E)
745 #define IOP_REG_DC0      (0x0C)
746 #define IOP_REG_SB       (0x0B)
747 #define IOP_REG_DA1      (0x0A)
748 #define IOP_REG_DA0      (0x08)
749 #define IOP_REG_SC       (0x09)
750 #define IOP_DMA_SPEED    (0x07)
751 #define IOP_REG_FLAG     (0x07)
752 #define IOP_FIFO_H       (0x06)
753 #define IOP_FIFO_L       (0x04)
754 #define IOP_REG_ID       (0x05)
755 #define IOP_REG_QP       (0x03)
756 #define IOP_REG_IH       (0x02)
757 #define IOP_REG_IX       (0x01)
758 #define IOP_REG_AX       (0x00)
759 #define IFC_REG_LOCK      (0x00)
760 #define IFC_REG_UNLOCK    (0x09)
761 #define IFC_WR_EN_FILTER  (0x10)
762 #define IFC_RD_NO_EEPROM  (0x10)
763 #define IFC_SLEW_RATE     (0x20)
764 #define IFC_ACT_NEG       (0x40)
765 #define IFC_INP_FILTER    (0x80)
766 #define IFC_INIT_DEFAULT  (IFC_ACT_NEG | IFC_REG_UNLOCK)
767 #define SC_SEL   (uchar)(0x80)
768 #define SC_BSY   (uchar)(0x40)
769 #define SC_ACK   (uchar)(0x20)
770 #define SC_REQ   (uchar)(0x10)
771 #define SC_ATN   (uchar)(0x08)
772 #define SC_IO    (uchar)(0x04)
773 #define SC_CD    (uchar)(0x02)
774 #define SC_MSG   (uchar)(0x01)
775 #define SEC_SCSI_CTL         (uchar)(0x80)
776 #define SEC_ACTIVE_NEGATE    (uchar)(0x40)
777 #define SEC_SLEW_RATE        (uchar)(0x20)
778 #define SEC_ENABLE_FILTER    (uchar)(0x10)
779 #define ASC_HALT_EXTMSG_IN     (ushort)0x8000
780 #define ASC_HALT_CHK_CONDITION (ushort)0x8100
781 #define ASC_HALT_SS_QUEUE_FULL (ushort)0x8200
782 #define ASC_HALT_DISABLE_ASYN_USE_SYN_FIX  (ushort)0x8300
783 #define ASC_HALT_ENABLE_ASYN_USE_SYN_FIX   (ushort)0x8400
784 #define ASC_HALT_SDTR_REJECTED (ushort)0x4000
785 #define ASC_HALT_HOST_COPY_SG_LIST_TO_RISC ( ushort )0x2000
786 #define ASC_MAX_QNO        0xF8
787 #define ASC_DATA_SEC_BEG   (ushort)0x0080
788 #define ASC_DATA_SEC_END   (ushort)0x0080
789 #define ASC_CODE_SEC_BEG   (ushort)0x0080
790 #define ASC_CODE_SEC_END   (ushort)0x0080
791 #define ASC_QADR_BEG       (0x4000)
792 #define ASC_QADR_USED      (ushort)(ASC_MAX_QNO * 64)
793 #define ASC_QADR_END       (ushort)0x7FFF
794 #define ASC_QLAST_ADR      (ushort)0x7FC0
795 #define ASC_QBLK_SIZE      0x40
796 #define ASC_BIOS_DATA_QBEG 0xF8
797 #define ASC_MIN_ACTIVE_QNO 0x01
798 #define ASC_QLINK_END      0xFF
799 #define ASC_EEPROM_WORDS   0x10
800 #define ASC_MAX_MGS_LEN    0x10
801 #define ASC_BIOS_ADDR_DEF  0xDC00
802 #define ASC_BIOS_SIZE      0x3800
803 #define ASC_BIOS_RAM_OFF   0x3800
804 #define ASC_BIOS_RAM_SIZE  0x800
805 #define ASC_BIOS_MIN_ADDR  0xC000
806 #define ASC_BIOS_MAX_ADDR  0xEC00
807 #define ASC_BIOS_BANK_SIZE 0x0400
808 #define ASC_MCODE_START_ADDR  0x0080
809 #define ASC_CFG0_HOST_INT_ON    0x0020
810 #define ASC_CFG0_BIOS_ON        0x0040
811 #define ASC_CFG0_VERA_BURST_ON  0x0080
812 #define ASC_CFG0_SCSI_PARITY_ON 0x0800
813 #define ASC_CFG1_SCSI_TARGET_ON 0x0080
814 #define ASC_CFG1_LRAM_8BITS_ON  0x0800
815 #define ASC_CFG_MSW_CLR_MASK    0x3080
816 #define CSW_TEST1             (ASC_CS_TYPE)0x8000
817 #define CSW_AUTO_CONFIG       (ASC_CS_TYPE)0x4000
818 #define CSW_RESERVED1         (ASC_CS_TYPE)0x2000
819 #define CSW_IRQ_WRITTEN       (ASC_CS_TYPE)0x1000
820 #define CSW_33MHZ_SELECTED    (ASC_CS_TYPE)0x0800
821 #define CSW_TEST2             (ASC_CS_TYPE)0x0400
822 #define CSW_TEST3             (ASC_CS_TYPE)0x0200
823 #define CSW_RESERVED2         (ASC_CS_TYPE)0x0100
824 #define CSW_DMA_DONE          (ASC_CS_TYPE)0x0080
825 #define CSW_FIFO_RDY          (ASC_CS_TYPE)0x0040
826 #define CSW_EEP_READ_DONE     (ASC_CS_TYPE)0x0020
827 #define CSW_HALTED            (ASC_CS_TYPE)0x0010
828 #define CSW_SCSI_RESET_ACTIVE (ASC_CS_TYPE)0x0008
829 #define CSW_PARITY_ERR        (ASC_CS_TYPE)0x0004
830 #define CSW_SCSI_RESET_LATCH  (ASC_CS_TYPE)0x0002
831 #define CSW_INT_PENDING       (ASC_CS_TYPE)0x0001
832 #define CIW_CLR_SCSI_RESET_INT (ASC_CS_TYPE)0x1000
833 #define CIW_INT_ACK      (ASC_CS_TYPE)0x0100
834 #define CIW_TEST1        (ASC_CS_TYPE)0x0200
835 #define CIW_TEST2        (ASC_CS_TYPE)0x0400
836 #define CIW_SEL_33MHZ    (ASC_CS_TYPE)0x0800
837 #define CIW_IRQ_ACT      (ASC_CS_TYPE)0x1000
838 #define CC_CHIP_RESET   (uchar)0x80
839 #define CC_SCSI_RESET   (uchar)0x40
840 #define CC_HALT         (uchar)0x20
841 #define CC_SINGLE_STEP  (uchar)0x10
842 #define CC_DMA_ABLE     (uchar)0x08
843 #define CC_TEST         (uchar)0x04
844 #define CC_BANK_ONE     (uchar)0x02
845 #define CC_DIAG         (uchar)0x01
846 #define ASC_1000_ID0W      0x04C1
847 #define ASC_1000_ID0W_FIX  0x00C1
848 #define ASC_1000_ID1B      0x25
849 #define ASC_EISA_REV_IOP_MASK  (0x0C83)
850 #define ASC_EISA_CFG_IOP_MASK  (0x0C86)
851 #define ASC_GET_EISA_SLOT(iop)  (PortAddr)((iop) & 0xF000)
852 #define INS_HALTINT        (ushort)0x6281
853 #define INS_HALT           (ushort)0x6280
854 #define INS_SINT           (ushort)0x6200
855 #define INS_RFLAG_WTM      (ushort)0x7380
856 #define ASC_MC_SAVE_CODE_WSIZE  0x500
857 #define ASC_MC_SAVE_DATA_WSIZE  0x40
858 
859 typedef struct asc_mc_saved {
860 	ushort data[ASC_MC_SAVE_DATA_WSIZE];
861 	ushort code[ASC_MC_SAVE_CODE_WSIZE];
862 } ASC_MC_SAVED;
863 
864 #define AscGetQDoneInProgress(port)         AscReadLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B)
865 #define AscPutQDoneInProgress(port, val)    AscWriteLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B, val)
866 #define AscGetVarFreeQHead(port)            AscReadLramWord((port), ASCV_FREE_Q_HEAD_W)
867 #define AscGetVarDoneQTail(port)            AscReadLramWord((port), ASCV_DONE_Q_TAIL_W)
868 #define AscPutVarFreeQHead(port, val)       AscWriteLramWord((port), ASCV_FREE_Q_HEAD_W, val)
869 #define AscPutVarDoneQTail(port, val)       AscWriteLramWord((port), ASCV_DONE_Q_TAIL_W, val)
870 #define AscGetRiscVarFreeQHead(port)        AscReadLramByte((port), ASCV_NEXTRDY_B)
871 #define AscGetRiscVarDoneQTail(port)        AscReadLramByte((port), ASCV_DONENEXT_B)
872 #define AscPutRiscVarFreeQHead(port, val)   AscWriteLramByte((port), ASCV_NEXTRDY_B, val)
873 #define AscPutRiscVarDoneQTail(port, val)   AscWriteLramByte((port), ASCV_DONENEXT_B, val)
874 #define AscPutMCodeSDTRDoneAtID(port, id, data)  AscWriteLramByte((port), (ushort)((ushort)ASCV_SDTR_DONE_BEG+(ushort)id), (data))
875 #define AscGetMCodeSDTRDoneAtID(port, id)        AscReadLramByte((port), (ushort)((ushort)ASCV_SDTR_DONE_BEG+(ushort)id))
876 #define AscPutMCodeInitSDTRAtID(port, id, data)  AscWriteLramByte((port), (ushort)((ushort)ASCV_SDTR_DATA_BEG+(ushort)id), data)
877 #define AscGetMCodeInitSDTRAtID(port, id)        AscReadLramByte((port), (ushort)((ushort)ASCV_SDTR_DATA_BEG+(ushort)id))
878 #define AscGetChipSignatureByte(port)     (uchar)inp((port)+IOP_SIG_BYTE)
879 #define AscGetChipSignatureWord(port)     (ushort)inpw((port)+IOP_SIG_WORD)
880 #define AscGetChipVerNo(port)             (uchar)inp((port)+IOP_VERSION)
881 #define AscGetChipCfgLsw(port)            (ushort)inpw((port)+IOP_CONFIG_LOW)
882 #define AscGetChipCfgMsw(port)            (ushort)inpw((port)+IOP_CONFIG_HIGH)
883 #define AscSetChipCfgLsw(port, data)      outpw((port)+IOP_CONFIG_LOW, data)
884 #define AscSetChipCfgMsw(port, data)      outpw((port)+IOP_CONFIG_HIGH, data)
885 #define AscGetChipEEPCmd(port)            (uchar)inp((port)+IOP_EEP_CMD)
886 #define AscSetChipEEPCmd(port, data)      outp((port)+IOP_EEP_CMD, data)
887 #define AscGetChipEEPData(port)           (ushort)inpw((port)+IOP_EEP_DATA)
888 #define AscSetChipEEPData(port, data)     outpw((port)+IOP_EEP_DATA, data)
889 #define AscGetChipLramAddr(port)          (ushort)inpw((PortAddr)((port)+IOP_RAM_ADDR))
890 #define AscSetChipLramAddr(port, addr)    outpw((PortAddr)((port)+IOP_RAM_ADDR), addr)
891 #define AscGetChipLramData(port)          (ushort)inpw((port)+IOP_RAM_DATA)
892 #define AscSetChipLramData(port, data)    outpw((port)+IOP_RAM_DATA, data)
893 #define AscGetChipIFC(port)               (uchar)inp((port)+IOP_REG_IFC)
894 #define AscSetChipIFC(port, data)          outp((port)+IOP_REG_IFC, data)
895 #define AscGetChipStatus(port)            (ASC_CS_TYPE)inpw((port)+IOP_STATUS)
896 #define AscSetChipStatus(port, cs_val)    outpw((port)+IOP_STATUS, cs_val)
897 #define AscGetChipControl(port)           (uchar)inp((port)+IOP_CTRL)
898 #define AscSetChipControl(port, cc_val)   outp((port)+IOP_CTRL, cc_val)
899 #define AscGetChipSyn(port)               (uchar)inp((port)+IOP_SYN_OFFSET)
900 #define AscSetChipSyn(port, data)         outp((port)+IOP_SYN_OFFSET, data)
901 #define AscSetPCAddr(port, data)          outpw((port)+IOP_REG_PC, data)
902 #define AscGetPCAddr(port)                (ushort)inpw((port)+IOP_REG_PC)
903 #define AscIsIntPending(port)             (AscGetChipStatus(port) & (CSW_INT_PENDING | CSW_SCSI_RESET_LATCH))
904 #define AscGetChipScsiID(port)            ((AscGetChipCfgLsw(port) >> 8) & ASC_MAX_TID)
905 #define AscGetExtraControl(port)          (uchar)inp((port)+IOP_EXTRA_CONTROL)
906 #define AscSetExtraControl(port, data)    outp((port)+IOP_EXTRA_CONTROL, data)
907 #define AscReadChipAX(port)               (ushort)inpw((port)+IOP_REG_AX)
908 #define AscWriteChipAX(port, data)        outpw((port)+IOP_REG_AX, data)
909 #define AscReadChipIX(port)               (uchar)inp((port)+IOP_REG_IX)
910 #define AscWriteChipIX(port, data)        outp((port)+IOP_REG_IX, data)
911 #define AscReadChipIH(port)               (ushort)inpw((port)+IOP_REG_IH)
912 #define AscWriteChipIH(port, data)        outpw((port)+IOP_REG_IH, data)
913 #define AscReadChipQP(port)               (uchar)inp((port)+IOP_REG_QP)
914 #define AscWriteChipQP(port, data)        outp((port)+IOP_REG_QP, data)
915 #define AscReadChipFIFO_L(port)           (ushort)inpw((port)+IOP_REG_FIFO_L)
916 #define AscWriteChipFIFO_L(port, data)    outpw((port)+IOP_REG_FIFO_L, data)
917 #define AscReadChipFIFO_H(port)           (ushort)inpw((port)+IOP_REG_FIFO_H)
918 #define AscWriteChipFIFO_H(port, data)    outpw((port)+IOP_REG_FIFO_H, data)
919 #define AscReadChipDmaSpeed(port)         (uchar)inp((port)+IOP_DMA_SPEED)
920 #define AscWriteChipDmaSpeed(port, data)  outp((port)+IOP_DMA_SPEED, data)
921 #define AscReadChipDA0(port)              (ushort)inpw((port)+IOP_REG_DA0)
922 #define AscWriteChipDA0(port)             outpw((port)+IOP_REG_DA0, data)
923 #define AscReadChipDA1(port)              (ushort)inpw((port)+IOP_REG_DA1)
924 #define AscWriteChipDA1(port)             outpw((port)+IOP_REG_DA1, data)
925 #define AscReadChipDC0(port)              (ushort)inpw((port)+IOP_REG_DC0)
926 #define AscWriteChipDC0(port)             outpw((port)+IOP_REG_DC0, data)
927 #define AscReadChipDC1(port)              (ushort)inpw((port)+IOP_REG_DC1)
928 #define AscWriteChipDC1(port)             outpw((port)+IOP_REG_DC1, data)
929 #define AscReadChipDvcID(port)            (uchar)inp((port)+IOP_REG_ID)
930 #define AscWriteChipDvcID(port, data)     outp((port)+IOP_REG_ID, data)
931 
932 /*
933  * Portable Data Types
934  *
935  * Any instance where a 32-bit long or pointer type is assumed
936  * for precision or HW defined structures, the following define
937  * types must be used. In Linux the char, short, and int types
938  * are all consistent at 8, 16, and 32 bits respectively. Pointers
939  * and long types are 64 bits on Alpha and UltraSPARC.
940  */
941 #define ADV_PADDR __u32		/* Physical address data type. */
942 #define ADV_VADDR __u32		/* Virtual address data type. */
943 #define ADV_DCNT  __u32		/* Unsigned Data count type. */
944 #define ADV_SDCNT __s32		/* Signed Data count type. */
945 
946 /*
947  * These macros are used to convert a virtual address to a
948  * 32-bit value. This currently can be used on Linux Alpha
949  * which uses 64-bit virtual address but a 32-bit bus address.
950  * This is likely to break in the future, but doing this now
951  * will give us time to change the HW and FW to handle 64-bit
952  * addresses.
953  */
954 #define ADV_VADDR_TO_U32   virt_to_bus
955 #define ADV_U32_TO_VADDR   bus_to_virt
956 
957 #define AdvPortAddr  void __iomem *	/* Virtual memory address size */
958 
959 /*
960  * Define Adv Library required memory access macros.
961  */
962 #define ADV_MEM_READB(addr) readb(addr)
963 #define ADV_MEM_READW(addr) readw(addr)
964 #define ADV_MEM_WRITEB(addr, byte) writeb(byte, addr)
965 #define ADV_MEM_WRITEW(addr, word) writew(word, addr)
966 #define ADV_MEM_WRITEDW(addr, dword) writel(dword, addr)
967 
968 #define ADV_CARRIER_COUNT (ASC_DEF_MAX_HOST_QNG + 15)
969 
970 /*
971  * Define total number of simultaneous maximum element scatter-gather
972  * request blocks per wide adapter. ASC_DEF_MAX_HOST_QNG (253) is the
973  * maximum number of outstanding commands per wide host adapter. Each
974  * command uses one or more ADV_SG_BLOCK each with 15 scatter-gather
975  * elements. Allow each command to have at least one ADV_SG_BLOCK structure.
976  * This allows about 15 commands to have the maximum 17 ADV_SG_BLOCK
977  * structures or 255 scatter-gather elements.
978  */
979 #define ADV_TOT_SG_BLOCK        ASC_DEF_MAX_HOST_QNG
980 
981 /*
982  * Define maximum number of scatter-gather elements per request.
983  */
984 #define ADV_MAX_SG_LIST         255
985 #define NO_OF_SG_PER_BLOCK              15
986 
987 #define ADV_EEP_DVC_CFG_BEGIN           (0x00)
988 #define ADV_EEP_DVC_CFG_END             (0x15)
989 #define ADV_EEP_DVC_CTL_BEGIN           (0x16)	/* location of OEM name */
990 #define ADV_EEP_MAX_WORD_ADDR           (0x1E)
991 
992 #define ADV_EEP_DELAY_MS                100
993 
994 #define ADV_EEPROM_BIG_ENDIAN          0x8000	/* EEPROM Bit 15 */
995 #define ADV_EEPROM_BIOS_ENABLE         0x4000	/* EEPROM Bit 14 */
996 /*
997  * For the ASC3550 Bit 13 is Termination Polarity control bit.
998  * For later ICs Bit 13 controls whether the CIS (Card Information
999  * Service Section) is loaded from EEPROM.
1000  */
1001 #define ADV_EEPROM_TERM_POL            0x2000	/* EEPROM Bit 13 */
1002 #define ADV_EEPROM_CIS_LD              0x2000	/* EEPROM Bit 13 */
1003 /*
1004  * ASC38C1600 Bit 11
1005  *
1006  * If EEPROM Bit 11 is 0 for Function 0, then Function 0 will specify
1007  * INT A in the PCI Configuration Space Int Pin field. If it is 1, then
1008  * Function 0 will specify INT B.
1009  *
1010  * If EEPROM Bit 11 is 0 for Function 1, then Function 1 will specify
1011  * INT B in the PCI Configuration Space Int Pin field. If it is 1, then
1012  * Function 1 will specify INT A.
1013  */
1014 #define ADV_EEPROM_INTAB               0x0800	/* EEPROM Bit 11 */
1015 
1016 typedef struct adveep_3550_config {
1017 	/* Word Offset, Description */
1018 
1019 	ushort cfg_lsw;		/* 00 power up initialization */
1020 	/*  bit 13 set - Term Polarity Control */
1021 	/*  bit 14 set - BIOS Enable */
1022 	/*  bit 15 set - Big Endian Mode */
1023 	ushort cfg_msw;		/* 01 unused      */
1024 	ushort disc_enable;	/* 02 disconnect enable */
1025 	ushort wdtr_able;	/* 03 Wide DTR able */
1026 	ushort sdtr_able;	/* 04 Synchronous DTR able */
1027 	ushort start_motor;	/* 05 send start up motor */
1028 	ushort tagqng_able;	/* 06 tag queuing able */
1029 	ushort bios_scan;	/* 07 BIOS device control */
1030 	ushort scam_tolerant;	/* 08 no scam */
1031 
1032 	uchar adapter_scsi_id;	/* 09 Host Adapter ID */
1033 	uchar bios_boot_delay;	/*    power up wait */
1034 
1035 	uchar scsi_reset_delay;	/* 10 reset delay */
1036 	uchar bios_id_lun;	/*    first boot device scsi id & lun */
1037 	/*    high nibble is lun */
1038 	/*    low nibble is scsi id */
1039 
1040 	uchar termination;	/* 11 0 - automatic */
1041 	/*    1 - low off / high off */
1042 	/*    2 - low off / high on */
1043 	/*    3 - low on  / high on */
1044 	/*    There is no low on  / high off */
1045 
1046 	uchar reserved1;	/*    reserved byte (not used) */
1047 
1048 	ushort bios_ctrl;	/* 12 BIOS control bits */
1049 	/*  bit 0  BIOS don't act as initiator. */
1050 	/*  bit 1  BIOS > 1 GB support */
1051 	/*  bit 2  BIOS > 2 Disk Support */
1052 	/*  bit 3  BIOS don't support removables */
1053 	/*  bit 4  BIOS support bootable CD */
1054 	/*  bit 5  BIOS scan enabled */
1055 	/*  bit 6  BIOS support multiple LUNs */
1056 	/*  bit 7  BIOS display of message */
1057 	/*  bit 8  SCAM disabled */
1058 	/*  bit 9  Reset SCSI bus during init. */
1059 	/*  bit 10 */
1060 	/*  bit 11 No verbose initialization. */
1061 	/*  bit 12 SCSI parity enabled */
1062 	/*  bit 13 */
1063 	/*  bit 14 */
1064 	/*  bit 15 */
1065 	ushort ultra_able;	/* 13 ULTRA speed able */
1066 	ushort reserved2;	/* 14 reserved */
1067 	uchar max_host_qng;	/* 15 maximum host queuing */
1068 	uchar max_dvc_qng;	/*    maximum per device queuing */
1069 	ushort dvc_cntl;	/* 16 control bit for driver */
1070 	ushort bug_fix;		/* 17 control bit for bug fix */
1071 	ushort serial_number_word1;	/* 18 Board serial number word 1 */
1072 	ushort serial_number_word2;	/* 19 Board serial number word 2 */
1073 	ushort serial_number_word3;	/* 20 Board serial number word 3 */
1074 	ushort check_sum;	/* 21 EEP check sum */
1075 	uchar oem_name[16];	/* 22 OEM name */
1076 	ushort dvc_err_code;	/* 30 last device driver error code */
1077 	ushort adv_err_code;	/* 31 last uc and Adv Lib error code */
1078 	ushort adv_err_addr;	/* 32 last uc error address */
1079 	ushort saved_dvc_err_code;	/* 33 saved last dev. driver error code   */
1080 	ushort saved_adv_err_code;	/* 34 saved last uc and Adv Lib error code */
1081 	ushort saved_adv_err_addr;	/* 35 saved last uc error address         */
1082 	ushort num_of_err;	/* 36 number of error */
1083 } ADVEEP_3550_CONFIG;
1084 
1085 typedef struct adveep_38C0800_config {
1086 	/* Word Offset, Description */
1087 
1088 	ushort cfg_lsw;		/* 00 power up initialization */
1089 	/*  bit 13 set - Load CIS */
1090 	/*  bit 14 set - BIOS Enable */
1091 	/*  bit 15 set - Big Endian Mode */
1092 	ushort cfg_msw;		/* 01 unused      */
1093 	ushort disc_enable;	/* 02 disconnect enable */
1094 	ushort wdtr_able;	/* 03 Wide DTR able */
1095 	ushort sdtr_speed1;	/* 04 SDTR Speed TID 0-3 */
1096 	ushort start_motor;	/* 05 send start up motor */
1097 	ushort tagqng_able;	/* 06 tag queuing able */
1098 	ushort bios_scan;	/* 07 BIOS device control */
1099 	ushort scam_tolerant;	/* 08 no scam */
1100 
1101 	uchar adapter_scsi_id;	/* 09 Host Adapter ID */
1102 	uchar bios_boot_delay;	/*    power up wait */
1103 
1104 	uchar scsi_reset_delay;	/* 10 reset delay */
1105 	uchar bios_id_lun;	/*    first boot device scsi id & lun */
1106 	/*    high nibble is lun */
1107 	/*    low nibble is scsi id */
1108 
1109 	uchar termination_se;	/* 11 0 - automatic */
1110 	/*    1 - low off / high off */
1111 	/*    2 - low off / high on */
1112 	/*    3 - low on  / high on */
1113 	/*    There is no low on  / high off */
1114 
1115 	uchar termination_lvd;	/* 11 0 - automatic */
1116 	/*    1 - low off / high off */
1117 	/*    2 - low off / high on */
1118 	/*    3 - low on  / high on */
1119 	/*    There is no low on  / high off */
1120 
1121 	ushort bios_ctrl;	/* 12 BIOS control bits */
1122 	/*  bit 0  BIOS don't act as initiator. */
1123 	/*  bit 1  BIOS > 1 GB support */
1124 	/*  bit 2  BIOS > 2 Disk Support */
1125 	/*  bit 3  BIOS don't support removables */
1126 	/*  bit 4  BIOS support bootable CD */
1127 	/*  bit 5  BIOS scan enabled */
1128 	/*  bit 6  BIOS support multiple LUNs */
1129 	/*  bit 7  BIOS display of message */
1130 	/*  bit 8  SCAM disabled */
1131 	/*  bit 9  Reset SCSI bus during init. */
1132 	/*  bit 10 */
1133 	/*  bit 11 No verbose initialization. */
1134 	/*  bit 12 SCSI parity enabled */
1135 	/*  bit 13 */
1136 	/*  bit 14 */
1137 	/*  bit 15 */
1138 	ushort sdtr_speed2;	/* 13 SDTR speed TID 4-7 */
1139 	ushort sdtr_speed3;	/* 14 SDTR speed TID 8-11 */
1140 	uchar max_host_qng;	/* 15 maximum host queueing */
1141 	uchar max_dvc_qng;	/*    maximum per device queuing */
1142 	ushort dvc_cntl;	/* 16 control bit for driver */
1143 	ushort sdtr_speed4;	/* 17 SDTR speed 4 TID 12-15 */
1144 	ushort serial_number_word1;	/* 18 Board serial number word 1 */
1145 	ushort serial_number_word2;	/* 19 Board serial number word 2 */
1146 	ushort serial_number_word3;	/* 20 Board serial number word 3 */
1147 	ushort check_sum;	/* 21 EEP check sum */
1148 	uchar oem_name[16];	/* 22 OEM name */
1149 	ushort dvc_err_code;	/* 30 last device driver error code */
1150 	ushort adv_err_code;	/* 31 last uc and Adv Lib error code */
1151 	ushort adv_err_addr;	/* 32 last uc error address */
1152 	ushort saved_dvc_err_code;	/* 33 saved last dev. driver error code   */
1153 	ushort saved_adv_err_code;	/* 34 saved last uc and Adv Lib error code */
1154 	ushort saved_adv_err_addr;	/* 35 saved last uc error address         */
1155 	ushort reserved36;	/* 36 reserved */
1156 	ushort reserved37;	/* 37 reserved */
1157 	ushort reserved38;	/* 38 reserved */
1158 	ushort reserved39;	/* 39 reserved */
1159 	ushort reserved40;	/* 40 reserved */
1160 	ushort reserved41;	/* 41 reserved */
1161 	ushort reserved42;	/* 42 reserved */
1162 	ushort reserved43;	/* 43 reserved */
1163 	ushort reserved44;	/* 44 reserved */
1164 	ushort reserved45;	/* 45 reserved */
1165 	ushort reserved46;	/* 46 reserved */
1166 	ushort reserved47;	/* 47 reserved */
1167 	ushort reserved48;	/* 48 reserved */
1168 	ushort reserved49;	/* 49 reserved */
1169 	ushort reserved50;	/* 50 reserved */
1170 	ushort reserved51;	/* 51 reserved */
1171 	ushort reserved52;	/* 52 reserved */
1172 	ushort reserved53;	/* 53 reserved */
1173 	ushort reserved54;	/* 54 reserved */
1174 	ushort reserved55;	/* 55 reserved */
1175 	ushort cisptr_lsw;	/* 56 CIS PTR LSW */
1176 	ushort cisprt_msw;	/* 57 CIS PTR MSW */
1177 	ushort subsysvid;	/* 58 SubSystem Vendor ID */
1178 	ushort subsysid;	/* 59 SubSystem ID */
1179 	ushort reserved60;	/* 60 reserved */
1180 	ushort reserved61;	/* 61 reserved */
1181 	ushort reserved62;	/* 62 reserved */
1182 	ushort reserved63;	/* 63 reserved */
1183 } ADVEEP_38C0800_CONFIG;
1184 
1185 typedef struct adveep_38C1600_config {
1186 	/* Word Offset, Description */
1187 
1188 	ushort cfg_lsw;		/* 00 power up initialization */
1189 	/*  bit 11 set - Func. 0 INTB, Func. 1 INTA */
1190 	/*       clear - Func. 0 INTA, Func. 1 INTB */
1191 	/*  bit 13 set - Load CIS */
1192 	/*  bit 14 set - BIOS Enable */
1193 	/*  bit 15 set - Big Endian Mode */
1194 	ushort cfg_msw;		/* 01 unused */
1195 	ushort disc_enable;	/* 02 disconnect enable */
1196 	ushort wdtr_able;	/* 03 Wide DTR able */
1197 	ushort sdtr_speed1;	/* 04 SDTR Speed TID 0-3 */
1198 	ushort start_motor;	/* 05 send start up motor */
1199 	ushort tagqng_able;	/* 06 tag queuing able */
1200 	ushort bios_scan;	/* 07 BIOS device control */
1201 	ushort scam_tolerant;	/* 08 no scam */
1202 
1203 	uchar adapter_scsi_id;	/* 09 Host Adapter ID */
1204 	uchar bios_boot_delay;	/*    power up wait */
1205 
1206 	uchar scsi_reset_delay;	/* 10 reset delay */
1207 	uchar bios_id_lun;	/*    first boot device scsi id & lun */
1208 	/*    high nibble is lun */
1209 	/*    low nibble is scsi id */
1210 
1211 	uchar termination_se;	/* 11 0 - automatic */
1212 	/*    1 - low off / high off */
1213 	/*    2 - low off / high on */
1214 	/*    3 - low on  / high on */
1215 	/*    There is no low on  / high off */
1216 
1217 	uchar termination_lvd;	/* 11 0 - automatic */
1218 	/*    1 - low off / high off */
1219 	/*    2 - low off / high on */
1220 	/*    3 - low on  / high on */
1221 	/*    There is no low on  / high off */
1222 
1223 	ushort bios_ctrl;	/* 12 BIOS control bits */
1224 	/*  bit 0  BIOS don't act as initiator. */
1225 	/*  bit 1  BIOS > 1 GB support */
1226 	/*  bit 2  BIOS > 2 Disk Support */
1227 	/*  bit 3  BIOS don't support removables */
1228 	/*  bit 4  BIOS support bootable CD */
1229 	/*  bit 5  BIOS scan enabled */
1230 	/*  bit 6  BIOS support multiple LUNs */
1231 	/*  bit 7  BIOS display of message */
1232 	/*  bit 8  SCAM disabled */
1233 	/*  bit 9  Reset SCSI bus during init. */
1234 	/*  bit 10 Basic Integrity Checking disabled */
1235 	/*  bit 11 No verbose initialization. */
1236 	/*  bit 12 SCSI parity enabled */
1237 	/*  bit 13 AIPP (Asyn. Info. Ph. Prot.) dis. */
1238 	/*  bit 14 */
1239 	/*  bit 15 */
1240 	ushort sdtr_speed2;	/* 13 SDTR speed TID 4-7 */
1241 	ushort sdtr_speed3;	/* 14 SDTR speed TID 8-11 */
1242 	uchar max_host_qng;	/* 15 maximum host queueing */
1243 	uchar max_dvc_qng;	/*    maximum per device queuing */
1244 	ushort dvc_cntl;	/* 16 control bit for driver */
1245 	ushort sdtr_speed4;	/* 17 SDTR speed 4 TID 12-15 */
1246 	ushort serial_number_word1;	/* 18 Board serial number word 1 */
1247 	ushort serial_number_word2;	/* 19 Board serial number word 2 */
1248 	ushort serial_number_word3;	/* 20 Board serial number word 3 */
1249 	ushort check_sum;	/* 21 EEP check sum */
1250 	uchar oem_name[16];	/* 22 OEM name */
1251 	ushort dvc_err_code;	/* 30 last device driver error code */
1252 	ushort adv_err_code;	/* 31 last uc and Adv Lib error code */
1253 	ushort adv_err_addr;	/* 32 last uc error address */
1254 	ushort saved_dvc_err_code;	/* 33 saved last dev. driver error code   */
1255 	ushort saved_adv_err_code;	/* 34 saved last uc and Adv Lib error code */
1256 	ushort saved_adv_err_addr;	/* 35 saved last uc error address         */
1257 	ushort reserved36;	/* 36 reserved */
1258 	ushort reserved37;	/* 37 reserved */
1259 	ushort reserved38;	/* 38 reserved */
1260 	ushort reserved39;	/* 39 reserved */
1261 	ushort reserved40;	/* 40 reserved */
1262 	ushort reserved41;	/* 41 reserved */
1263 	ushort reserved42;	/* 42 reserved */
1264 	ushort reserved43;	/* 43 reserved */
1265 	ushort reserved44;	/* 44 reserved */
1266 	ushort reserved45;	/* 45 reserved */
1267 	ushort reserved46;	/* 46 reserved */
1268 	ushort reserved47;	/* 47 reserved */
1269 	ushort reserved48;	/* 48 reserved */
1270 	ushort reserved49;	/* 49 reserved */
1271 	ushort reserved50;	/* 50 reserved */
1272 	ushort reserved51;	/* 51 reserved */
1273 	ushort reserved52;	/* 52 reserved */
1274 	ushort reserved53;	/* 53 reserved */
1275 	ushort reserved54;	/* 54 reserved */
1276 	ushort reserved55;	/* 55 reserved */
1277 	ushort cisptr_lsw;	/* 56 CIS PTR LSW */
1278 	ushort cisprt_msw;	/* 57 CIS PTR MSW */
1279 	ushort subsysvid;	/* 58 SubSystem Vendor ID */
1280 	ushort subsysid;	/* 59 SubSystem ID */
1281 	ushort reserved60;	/* 60 reserved */
1282 	ushort reserved61;	/* 61 reserved */
1283 	ushort reserved62;	/* 62 reserved */
1284 	ushort reserved63;	/* 63 reserved */
1285 } ADVEEP_38C1600_CONFIG;
1286 
1287 /*
1288  * EEPROM Commands
1289  */
1290 #define ASC_EEP_CMD_DONE             0x0200
1291 
1292 /* bios_ctrl */
1293 #define BIOS_CTRL_BIOS               0x0001
1294 #define BIOS_CTRL_EXTENDED_XLAT      0x0002
1295 #define BIOS_CTRL_GT_2_DISK          0x0004
1296 #define BIOS_CTRL_BIOS_REMOVABLE     0x0008
1297 #define BIOS_CTRL_BOOTABLE_CD        0x0010
1298 #define BIOS_CTRL_MULTIPLE_LUN       0x0040
1299 #define BIOS_CTRL_DISPLAY_MSG        0x0080
1300 #define BIOS_CTRL_NO_SCAM            0x0100
1301 #define BIOS_CTRL_RESET_SCSI_BUS     0x0200
1302 #define BIOS_CTRL_INIT_VERBOSE       0x0800
1303 #define BIOS_CTRL_SCSI_PARITY        0x1000
1304 #define BIOS_CTRL_AIPP_DIS           0x2000
1305 
1306 #define ADV_3550_MEMSIZE   0x2000	/* 8 KB Internal Memory */
1307 
1308 #define ADV_38C0800_MEMSIZE  0x4000	/* 16 KB Internal Memory */
1309 
1310 /*
1311  * XXX - Since ASC38C1600 Rev.3 has a local RAM failure issue, there is
1312  * a special 16K Adv Library and Microcode version. After the issue is
1313  * resolved, should restore 32K support.
1314  *
1315  * #define ADV_38C1600_MEMSIZE  0x8000L   * 32 KB Internal Memory *
1316  */
1317 #define ADV_38C1600_MEMSIZE  0x4000	/* 16 KB Internal Memory */
1318 
1319 /*
1320  * Byte I/O register address from base of 'iop_base'.
1321  */
1322 #define IOPB_INTR_STATUS_REG    0x00
1323 #define IOPB_CHIP_ID_1          0x01
1324 #define IOPB_INTR_ENABLES       0x02
1325 #define IOPB_CHIP_TYPE_REV      0x03
1326 #define IOPB_RES_ADDR_4         0x04
1327 #define IOPB_RES_ADDR_5         0x05
1328 #define IOPB_RAM_DATA           0x06
1329 #define IOPB_RES_ADDR_7         0x07
1330 #define IOPB_FLAG_REG           0x08
1331 #define IOPB_RES_ADDR_9         0x09
1332 #define IOPB_RISC_CSR           0x0A
1333 #define IOPB_RES_ADDR_B         0x0B
1334 #define IOPB_RES_ADDR_C         0x0C
1335 #define IOPB_RES_ADDR_D         0x0D
1336 #define IOPB_SOFT_OVER_WR       0x0E
1337 #define IOPB_RES_ADDR_F         0x0F
1338 #define IOPB_MEM_CFG            0x10
1339 #define IOPB_RES_ADDR_11        0x11
1340 #define IOPB_GPIO_DATA          0x12
1341 #define IOPB_RES_ADDR_13        0x13
1342 #define IOPB_FLASH_PAGE         0x14
1343 #define IOPB_RES_ADDR_15        0x15
1344 #define IOPB_GPIO_CNTL          0x16
1345 #define IOPB_RES_ADDR_17        0x17
1346 #define IOPB_FLASH_DATA         0x18
1347 #define IOPB_RES_ADDR_19        0x19
1348 #define IOPB_RES_ADDR_1A        0x1A
1349 #define IOPB_RES_ADDR_1B        0x1B
1350 #define IOPB_RES_ADDR_1C        0x1C
1351 #define IOPB_RES_ADDR_1D        0x1D
1352 #define IOPB_RES_ADDR_1E        0x1E
1353 #define IOPB_RES_ADDR_1F        0x1F
1354 #define IOPB_DMA_CFG0           0x20
1355 #define IOPB_DMA_CFG1           0x21
1356 #define IOPB_TICKLE             0x22
1357 #define IOPB_DMA_REG_WR         0x23
1358 #define IOPB_SDMA_STATUS        0x24
1359 #define IOPB_SCSI_BYTE_CNT      0x25
1360 #define IOPB_HOST_BYTE_CNT      0x26
1361 #define IOPB_BYTE_LEFT_TO_XFER  0x27
1362 #define IOPB_BYTE_TO_XFER_0     0x28
1363 #define IOPB_BYTE_TO_XFER_1     0x29
1364 #define IOPB_BYTE_TO_XFER_2     0x2A
1365 #define IOPB_BYTE_TO_XFER_3     0x2B
1366 #define IOPB_ACC_GRP            0x2C
1367 #define IOPB_RES_ADDR_2D        0x2D
1368 #define IOPB_DEV_ID             0x2E
1369 #define IOPB_RES_ADDR_2F        0x2F
1370 #define IOPB_SCSI_DATA          0x30
1371 #define IOPB_RES_ADDR_31        0x31
1372 #define IOPB_RES_ADDR_32        0x32
1373 #define IOPB_SCSI_DATA_HSHK     0x33
1374 #define IOPB_SCSI_CTRL          0x34
1375 #define IOPB_RES_ADDR_35        0x35
1376 #define IOPB_RES_ADDR_36        0x36
1377 #define IOPB_RES_ADDR_37        0x37
1378 #define IOPB_RAM_BIST           0x38
1379 #define IOPB_PLL_TEST           0x39
1380 #define IOPB_PCI_INT_CFG        0x3A
1381 #define IOPB_RES_ADDR_3B        0x3B
1382 #define IOPB_RFIFO_CNT          0x3C
1383 #define IOPB_RES_ADDR_3D        0x3D
1384 #define IOPB_RES_ADDR_3E        0x3E
1385 #define IOPB_RES_ADDR_3F        0x3F
1386 
1387 /*
1388  * Word I/O register address from base of 'iop_base'.
1389  */
1390 #define IOPW_CHIP_ID_0          0x00	/* CID0  */
1391 #define IOPW_CTRL_REG           0x02	/* CC    */
1392 #define IOPW_RAM_ADDR           0x04	/* LA    */
1393 #define IOPW_RAM_DATA           0x06	/* LD    */
1394 #define IOPW_RES_ADDR_08        0x08
1395 #define IOPW_RISC_CSR           0x0A	/* CSR   */
1396 #define IOPW_SCSI_CFG0          0x0C	/* CFG0  */
1397 #define IOPW_SCSI_CFG1          0x0E	/* CFG1  */
1398 #define IOPW_RES_ADDR_10        0x10
1399 #define IOPW_SEL_MASK           0x12	/* SM    */
1400 #define IOPW_RES_ADDR_14        0x14
1401 #define IOPW_FLASH_ADDR         0x16	/* FA    */
1402 #define IOPW_RES_ADDR_18        0x18
1403 #define IOPW_EE_CMD             0x1A	/* EC    */
1404 #define IOPW_EE_DATA            0x1C	/* ED    */
1405 #define IOPW_SFIFO_CNT          0x1E	/* SFC   */
1406 #define IOPW_RES_ADDR_20        0x20
1407 #define IOPW_Q_BASE             0x22	/* QB    */
1408 #define IOPW_QP                 0x24	/* QP    */
1409 #define IOPW_IX                 0x26	/* IX    */
1410 #define IOPW_SP                 0x28	/* SP    */
1411 #define IOPW_PC                 0x2A	/* PC    */
1412 #define IOPW_RES_ADDR_2C        0x2C
1413 #define IOPW_RES_ADDR_2E        0x2E
1414 #define IOPW_SCSI_DATA          0x30	/* SD    */
1415 #define IOPW_SCSI_DATA_HSHK     0x32	/* SDH   */
1416 #define IOPW_SCSI_CTRL          0x34	/* SC    */
1417 #define IOPW_HSHK_CFG           0x36	/* HCFG  */
1418 #define IOPW_SXFR_STATUS        0x36	/* SXS   */
1419 #define IOPW_SXFR_CNTL          0x38	/* SXL   */
1420 #define IOPW_SXFR_CNTH          0x3A	/* SXH   */
1421 #define IOPW_RES_ADDR_3C        0x3C
1422 #define IOPW_RFIFO_DATA         0x3E	/* RFD   */
1423 
1424 /*
1425  * Doubleword I/O register address from base of 'iop_base'.
1426  */
1427 #define IOPDW_RES_ADDR_0         0x00
1428 #define IOPDW_RAM_DATA           0x04
1429 #define IOPDW_RES_ADDR_8         0x08
1430 #define IOPDW_RES_ADDR_C         0x0C
1431 #define IOPDW_RES_ADDR_10        0x10
1432 #define IOPDW_COMMA              0x14
1433 #define IOPDW_COMMB              0x18
1434 #define IOPDW_RES_ADDR_1C        0x1C
1435 #define IOPDW_SDMA_ADDR0         0x20
1436 #define IOPDW_SDMA_ADDR1         0x24
1437 #define IOPDW_SDMA_COUNT         0x28
1438 #define IOPDW_SDMA_ERROR         0x2C
1439 #define IOPDW_RDMA_ADDR0         0x30
1440 #define IOPDW_RDMA_ADDR1         0x34
1441 #define IOPDW_RDMA_COUNT         0x38
1442 #define IOPDW_RDMA_ERROR         0x3C
1443 
1444 #define ADV_CHIP_ID_BYTE         0x25
1445 #define ADV_CHIP_ID_WORD         0x04C1
1446 
1447 #define ADV_INTR_ENABLE_HOST_INTR                   0x01
1448 #define ADV_INTR_ENABLE_SEL_INTR                    0x02
1449 #define ADV_INTR_ENABLE_DPR_INTR                    0x04
1450 #define ADV_INTR_ENABLE_RTA_INTR                    0x08
1451 #define ADV_INTR_ENABLE_RMA_INTR                    0x10
1452 #define ADV_INTR_ENABLE_RST_INTR                    0x20
1453 #define ADV_INTR_ENABLE_DPE_INTR                    0x40
1454 #define ADV_INTR_ENABLE_GLOBAL_INTR                 0x80
1455 
1456 #define ADV_INTR_STATUS_INTRA            0x01
1457 #define ADV_INTR_STATUS_INTRB            0x02
1458 #define ADV_INTR_STATUS_INTRC            0x04
1459 
1460 #define ADV_RISC_CSR_STOP           (0x0000)
1461 #define ADV_RISC_TEST_COND          (0x2000)
1462 #define ADV_RISC_CSR_RUN            (0x4000)
1463 #define ADV_RISC_CSR_SINGLE_STEP    (0x8000)
1464 
1465 #define ADV_CTRL_REG_HOST_INTR      0x0100
1466 #define ADV_CTRL_REG_SEL_INTR       0x0200
1467 #define ADV_CTRL_REG_DPR_INTR       0x0400
1468 #define ADV_CTRL_REG_RTA_INTR       0x0800
1469 #define ADV_CTRL_REG_RMA_INTR       0x1000
1470 #define ADV_CTRL_REG_RES_BIT14      0x2000
1471 #define ADV_CTRL_REG_DPE_INTR       0x4000
1472 #define ADV_CTRL_REG_POWER_DONE     0x8000
1473 #define ADV_CTRL_REG_ANY_INTR       0xFF00
1474 
1475 #define ADV_CTRL_REG_CMD_RESET             0x00C6
1476 #define ADV_CTRL_REG_CMD_WR_IO_REG         0x00C5
1477 #define ADV_CTRL_REG_CMD_RD_IO_REG         0x00C4
1478 #define ADV_CTRL_REG_CMD_WR_PCI_CFG_SPACE  0x00C3
1479 #define ADV_CTRL_REG_CMD_RD_PCI_CFG_SPACE  0x00C2
1480 
1481 #define ADV_TICKLE_NOP                      0x00
1482 #define ADV_TICKLE_A                        0x01
1483 #define ADV_TICKLE_B                        0x02
1484 #define ADV_TICKLE_C                        0x03
1485 
1486 #define AdvIsIntPending(port) \
1487     (AdvReadWordRegister(port, IOPW_CTRL_REG) & ADV_CTRL_REG_HOST_INTR)
1488 
1489 /*
1490  * SCSI_CFG0 Register bit definitions
1491  */
1492 #define TIMER_MODEAB    0xC000	/* Watchdog, Second, and Select. Timer Ctrl. */
1493 #define PARITY_EN       0x2000	/* Enable SCSI Parity Error detection */
1494 #define EVEN_PARITY     0x1000	/* Select Even Parity */
1495 #define WD_LONG         0x0800	/* Watchdog Interval, 1: 57 min, 0: 13 sec */
1496 #define QUEUE_128       0x0400	/* Queue Size, 1: 128 byte, 0: 64 byte */
1497 #define PRIM_MODE       0x0100	/* Primitive SCSI mode */
1498 #define SCAM_EN         0x0080	/* Enable SCAM selection */
1499 #define SEL_TMO_LONG    0x0040	/* Sel/Resel Timeout, 1: 400 ms, 0: 1.6 ms */
1500 #define CFRM_ID         0x0020	/* SCAM id sel. confirm., 1: fast, 0: 6.4 ms */
1501 #define OUR_ID_EN       0x0010	/* Enable OUR_ID bits */
1502 #define OUR_ID          0x000F	/* SCSI ID */
1503 
1504 /*
1505  * SCSI_CFG1 Register bit definitions
1506  */
1507 #define BIG_ENDIAN      0x8000	/* Enable Big Endian Mode MIO:15, EEP:15 */
1508 #define TERM_POL        0x2000	/* Terminator Polarity Ctrl. MIO:13, EEP:13 */
1509 #define SLEW_RATE       0x1000	/* SCSI output buffer slew rate */
1510 #define FILTER_SEL      0x0C00	/* Filter Period Selection */
1511 #define  FLTR_DISABLE    0x0000	/* Input Filtering Disabled */
1512 #define  FLTR_11_TO_20NS 0x0800	/* Input Filtering 11ns to 20ns */
1513 #define  FLTR_21_TO_39NS 0x0C00	/* Input Filtering 21ns to 39ns */
1514 #define ACTIVE_DBL      0x0200	/* Disable Active Negation */
1515 #define DIFF_MODE       0x0100	/* SCSI differential Mode (Read-Only) */
1516 #define DIFF_SENSE      0x0080	/* 1: No SE cables, 0: SE cable (Read-Only) */
1517 #define TERM_CTL_SEL    0x0040	/* Enable TERM_CTL_H and TERM_CTL_L */
1518 #define TERM_CTL        0x0030	/* External SCSI Termination Bits */
1519 #define  TERM_CTL_H      0x0020	/* Enable External SCSI Upper Termination */
1520 #define  TERM_CTL_L      0x0010	/* Enable External SCSI Lower Termination */
1521 #define CABLE_DETECT    0x000F	/* External SCSI Cable Connection Status */
1522 
1523 /*
1524  * Addendum for ASC-38C0800 Chip
1525  *
1526  * The ASC-38C1600 Chip uses the same definitions except that the
1527  * bus mode override bits [12:10] have been moved to byte register
1528  * offset 0xE (IOPB_SOFT_OVER_WR) bits [12:10]. The [12:10] bits in
1529  * SCSI_CFG1 are read-only and always available. Bit 14 (DIS_TERM_DRV)
1530  * is not needed. The [12:10] bits in IOPB_SOFT_OVER_WR are write-only.
1531  * Also each ASC-38C1600 function or channel uses only cable bits [5:4]
1532  * and [1:0]. Bits [14], [7:6], [3:2] are unused.
1533  */
1534 #define DIS_TERM_DRV    0x4000	/* 1: Read c_det[3:0], 0: cannot read */
1535 #define HVD_LVD_SE      0x1C00	/* Device Detect Bits */
1536 #define  HVD             0x1000	/* HVD Device Detect */
1537 #define  LVD             0x0800	/* LVD Device Detect */
1538 #define  SE              0x0400	/* SE Device Detect */
1539 #define TERM_LVD        0x00C0	/* LVD Termination Bits */
1540 #define  TERM_LVD_HI     0x0080	/* Enable LVD Upper Termination */
1541 #define  TERM_LVD_LO     0x0040	/* Enable LVD Lower Termination */
1542 #define TERM_SE         0x0030	/* SE Termination Bits */
1543 #define  TERM_SE_HI      0x0020	/* Enable SE Upper Termination */
1544 #define  TERM_SE_LO      0x0010	/* Enable SE Lower Termination */
1545 #define C_DET_LVD       0x000C	/* LVD Cable Detect Bits */
1546 #define  C_DET3          0x0008	/* Cable Detect for LVD External Wide */
1547 #define  C_DET2          0x0004	/* Cable Detect for LVD Internal Wide */
1548 #define C_DET_SE        0x0003	/* SE Cable Detect Bits */
1549 #define  C_DET1          0x0002	/* Cable Detect for SE Internal Wide */
1550 #define  C_DET0          0x0001	/* Cable Detect for SE Internal Narrow */
1551 
1552 #define CABLE_ILLEGAL_A 0x7
1553     /* x 0 0 0  | on  on | Illegal (all 3 connectors are used) */
1554 
1555 #define CABLE_ILLEGAL_B 0xB
1556     /* 0 x 0 0  | on  on | Illegal (all 3 connectors are used) */
1557 
1558 /*
1559  * MEM_CFG Register bit definitions
1560  */
1561 #define BIOS_EN         0x40	/* BIOS Enable MIO:14,EEP:14 */
1562 #define FAST_EE_CLK     0x20	/* Diagnostic Bit */
1563 #define RAM_SZ          0x1C	/* Specify size of RAM to RISC */
1564 #define  RAM_SZ_2KB      0x00	/* 2 KB */
1565 #define  RAM_SZ_4KB      0x04	/* 4 KB */
1566 #define  RAM_SZ_8KB      0x08	/* 8 KB */
1567 #define  RAM_SZ_16KB     0x0C	/* 16 KB */
1568 #define  RAM_SZ_32KB     0x10	/* 32 KB */
1569 #define  RAM_SZ_64KB     0x14	/* 64 KB */
1570 
1571 /*
1572  * DMA_CFG0 Register bit definitions
1573  *
1574  * This register is only accessible to the host.
1575  */
1576 #define BC_THRESH_ENB   0x80	/* PCI DMA Start Conditions */
1577 #define FIFO_THRESH     0x70	/* PCI DMA FIFO Threshold */
1578 #define  FIFO_THRESH_16B  0x00	/* 16 bytes */
1579 #define  FIFO_THRESH_32B  0x20	/* 32 bytes */
1580 #define  FIFO_THRESH_48B  0x30	/* 48 bytes */
1581 #define  FIFO_THRESH_64B  0x40	/* 64 bytes */
1582 #define  FIFO_THRESH_80B  0x50	/* 80 bytes (default) */
1583 #define  FIFO_THRESH_96B  0x60	/* 96 bytes */
1584 #define  FIFO_THRESH_112B 0x70	/* 112 bytes */
1585 #define START_CTL       0x0C	/* DMA start conditions */
1586 #define  START_CTL_TH    0x00	/* Wait threshold level (default) */
1587 #define  START_CTL_ID    0x04	/* Wait SDMA/SBUS idle */
1588 #define  START_CTL_THID  0x08	/* Wait threshold and SDMA/SBUS idle */
1589 #define  START_CTL_EMFU  0x0C	/* Wait SDMA FIFO empty/full */
1590 #define READ_CMD        0x03	/* Memory Read Method */
1591 #define  READ_CMD_MR     0x00	/* Memory Read */
1592 #define  READ_CMD_MRL    0x02	/* Memory Read Long */
1593 #define  READ_CMD_MRM    0x03	/* Memory Read Multiple (default) */
1594 
1595 /*
1596  * ASC-38C0800 RAM BIST Register bit definitions
1597  */
1598 #define RAM_TEST_MODE         0x80
1599 #define PRE_TEST_MODE         0x40
1600 #define NORMAL_MODE           0x00
1601 #define RAM_TEST_DONE         0x10
1602 #define RAM_TEST_STATUS       0x0F
1603 #define  RAM_TEST_HOST_ERROR   0x08
1604 #define  RAM_TEST_INTRAM_ERROR 0x04
1605 #define  RAM_TEST_RISC_ERROR   0x02
1606 #define  RAM_TEST_SCSI_ERROR   0x01
1607 #define  RAM_TEST_SUCCESS      0x00
1608 #define PRE_TEST_VALUE        0x05
1609 #define NORMAL_VALUE          0x00
1610 
1611 /*
1612  * ASC38C1600 Definitions
1613  *
1614  * IOPB_PCI_INT_CFG Bit Field Definitions
1615  */
1616 
1617 #define INTAB_LD        0x80	/* Value loaded from EEPROM Bit 11. */
1618 
1619 /*
1620  * Bit 1 can be set to change the interrupt for the Function to operate in
1621  * Totem Pole mode. By default Bit 1 is 0 and the interrupt operates in
1622  * Open Drain mode. Both functions of the ASC38C1600 must be set to the same
1623  * mode, otherwise the operating mode is undefined.
1624  */
1625 #define TOTEMPOLE       0x02
1626 
1627 /*
1628  * Bit 0 can be used to change the Int Pin for the Function. The value is
1629  * 0 by default for both Functions with Function 0 using INT A and Function
1630  * B using INT B. For Function 0 if set, INT B is used. For Function 1 if set,
1631  * INT A is used.
1632  *
1633  * EEPROM Word 0 Bit 11 for each Function may change the initial Int Pin
1634  * value specified in the PCI Configuration Space.
1635  */
1636 #define INTAB           0x01
1637 
1638 /*
1639  * Adv Library Status Definitions
1640  */
1641 #define ADV_TRUE        1
1642 #define ADV_FALSE       0
1643 #define ADV_SUCCESS     1
1644 #define ADV_BUSY        0
1645 #define ADV_ERROR       (-1)
1646 
1647 /*
1648  * ADV_DVC_VAR 'warn_code' values
1649  */
1650 #define ASC_WARN_BUSRESET_ERROR         0x0001	/* SCSI Bus Reset error */
1651 #define ASC_WARN_EEPROM_CHKSUM          0x0002	/* EEP check sum error */
1652 #define ASC_WARN_EEPROM_TERMINATION     0x0004	/* EEP termination bad field */
1653 #define ASC_WARN_ERROR                  0xFFFF	/* ADV_ERROR return */
1654 
1655 #define ADV_MAX_TID                     15	/* max. target identifier */
1656 #define ADV_MAX_LUN                     7	/* max. logical unit number */
1657 
1658 /*
1659  * Fixed locations of microcode operating variables.
1660  */
1661 #define ASC_MC_CODE_BEGIN_ADDR          0x0028	/* microcode start address */
1662 #define ASC_MC_CODE_END_ADDR            0x002A	/* microcode end address */
1663 #define ASC_MC_CODE_CHK_SUM             0x002C	/* microcode code checksum */
1664 #define ASC_MC_VERSION_DATE             0x0038	/* microcode version */
1665 #define ASC_MC_VERSION_NUM              0x003A	/* microcode number */
1666 #define ASC_MC_BIOSMEM                  0x0040	/* BIOS RISC Memory Start */
1667 #define ASC_MC_BIOSLEN                  0x0050	/* BIOS RISC Memory Length */
1668 #define ASC_MC_BIOS_SIGNATURE           0x0058	/* BIOS Signature 0x55AA */
1669 #define ASC_MC_BIOS_VERSION             0x005A	/* BIOS Version (2 bytes) */
1670 #define ASC_MC_SDTR_SPEED1              0x0090	/* SDTR Speed for TID 0-3 */
1671 #define ASC_MC_SDTR_SPEED2              0x0092	/* SDTR Speed for TID 4-7 */
1672 #define ASC_MC_SDTR_SPEED3              0x0094	/* SDTR Speed for TID 8-11 */
1673 #define ASC_MC_SDTR_SPEED4              0x0096	/* SDTR Speed for TID 12-15 */
1674 #define ASC_MC_CHIP_TYPE                0x009A
1675 #define ASC_MC_INTRB_CODE               0x009B
1676 #define ASC_MC_WDTR_ABLE                0x009C
1677 #define ASC_MC_SDTR_ABLE                0x009E
1678 #define ASC_MC_TAGQNG_ABLE              0x00A0
1679 #define ASC_MC_DISC_ENABLE              0x00A2
1680 #define ASC_MC_IDLE_CMD_STATUS          0x00A4
1681 #define ASC_MC_IDLE_CMD                 0x00A6
1682 #define ASC_MC_IDLE_CMD_PARAMETER       0x00A8
1683 #define ASC_MC_DEFAULT_SCSI_CFG0        0x00AC
1684 #define ASC_MC_DEFAULT_SCSI_CFG1        0x00AE
1685 #define ASC_MC_DEFAULT_MEM_CFG          0x00B0
1686 #define ASC_MC_DEFAULT_SEL_MASK         0x00B2
1687 #define ASC_MC_SDTR_DONE                0x00B6
1688 #define ASC_MC_NUMBER_OF_QUEUED_CMD     0x00C0
1689 #define ASC_MC_NUMBER_OF_MAX_CMD        0x00D0
1690 #define ASC_MC_DEVICE_HSHK_CFG_TABLE    0x0100
1691 #define ASC_MC_CONTROL_FLAG             0x0122	/* Microcode control flag. */
1692 #define ASC_MC_WDTR_DONE                0x0124
1693 #define ASC_MC_CAM_MODE_MASK            0x015E	/* CAM mode TID bitmask. */
1694 #define ASC_MC_ICQ                      0x0160
1695 #define ASC_MC_IRQ                      0x0164
1696 #define ASC_MC_PPR_ABLE                 0x017A
1697 
1698 /*
1699  * BIOS LRAM variable absolute offsets.
1700  */
1701 #define BIOS_CODESEG    0x54
1702 #define BIOS_CODELEN    0x56
1703 #define BIOS_SIGNATURE  0x58
1704 #define BIOS_VERSION    0x5A
1705 
1706 /*
1707  * Microcode Control Flags
1708  *
1709  * Flags set by the Adv Library in RISC variable 'control_flag' (0x122)
1710  * and handled by the microcode.
1711  */
1712 #define CONTROL_FLAG_IGNORE_PERR        0x0001	/* Ignore DMA Parity Errors */
1713 #define CONTROL_FLAG_ENABLE_AIPP        0x0002	/* Enabled AIPP checking. */
1714 
1715 /*
1716  * ASC_MC_DEVICE_HSHK_CFG_TABLE microcode table or HSHK_CFG register format
1717  */
1718 #define HSHK_CFG_WIDE_XFR       0x8000
1719 #define HSHK_CFG_RATE           0x0F00
1720 #define HSHK_CFG_OFFSET         0x001F
1721 
1722 #define ASC_DEF_MAX_HOST_QNG    0xFD	/* Max. number of host commands (253) */
1723 #define ASC_DEF_MIN_HOST_QNG    0x10	/* Min. number of host commands (16) */
1724 #define ASC_DEF_MAX_DVC_QNG     0x3F	/* Max. number commands per device (63) */
1725 #define ASC_DEF_MIN_DVC_QNG     0x04	/* Min. number commands per device (4) */
1726 
1727 #define ASC_QC_DATA_CHECK  0x01	/* Require ASC_QC_DATA_OUT set or clear. */
1728 #define ASC_QC_DATA_OUT    0x02	/* Data out DMA transfer. */
1729 #define ASC_QC_START_MOTOR 0x04	/* Send auto-start motor before request. */
1730 #define ASC_QC_NO_OVERRUN  0x08	/* Don't report overrun. */
1731 #define ASC_QC_FREEZE_TIDQ 0x10	/* Freeze TID queue after request. XXX TBD */
1732 
1733 #define ASC_QSC_NO_DISC     0x01	/* Don't allow disconnect for request. */
1734 #define ASC_QSC_NO_TAGMSG   0x02	/* Don't allow tag queuing for request. */
1735 #define ASC_QSC_NO_SYNC     0x04	/* Don't use Synch. transfer on request. */
1736 #define ASC_QSC_NO_WIDE     0x08	/* Don't use Wide transfer on request. */
1737 #define ASC_QSC_REDO_DTR    0x10	/* Renegotiate WDTR/SDTR before request. */
1738 /*
1739  * Note: If a Tag Message is to be sent and neither ASC_QSC_HEAD_TAG or
1740  * ASC_QSC_ORDERED_TAG is set, then a Simple Tag Message (0x20) is used.
1741  */
1742 #define ASC_QSC_HEAD_TAG    0x40	/* Use Head Tag Message (0x21). */
1743 #define ASC_QSC_ORDERED_TAG 0x80	/* Use Ordered Tag Message (0x22). */
1744 
1745 /*
1746  * All fields here are accessed by the board microcode and need to be
1747  * little-endian.
1748  */
1749 typedef struct adv_carr_t {
1750 	ADV_VADDR carr_va;	/* Carrier Virtual Address */
1751 	ADV_PADDR carr_pa;	/* Carrier Physical Address */
1752 	ADV_VADDR areq_vpa;	/* ASC_SCSI_REQ_Q Virtual or Physical Address */
1753 	/*
1754 	 * next_vpa [31:4]            Carrier Virtual or Physical Next Pointer
1755 	 *
1756 	 * next_vpa [3:1]             Reserved Bits
1757 	 * next_vpa [0]               Done Flag set in Response Queue.
1758 	 */
1759 	ADV_VADDR next_vpa;
1760 } ADV_CARR_T;
1761 
1762 /*
1763  * Mask used to eliminate low 4 bits of carrier 'next_vpa' field.
1764  */
1765 #define ASC_NEXT_VPA_MASK       0xFFFFFFF0
1766 
1767 #define ASC_RQ_DONE             0x00000001
1768 #define ASC_RQ_GOOD             0x00000002
1769 #define ASC_CQ_STOPPER          0x00000000
1770 
1771 #define ASC_GET_CARRP(carrp) ((carrp) & ASC_NEXT_VPA_MASK)
1772 
1773 #define ADV_CARRIER_NUM_PAGE_CROSSING \
1774     (((ADV_CARRIER_COUNT * sizeof(ADV_CARR_T)) + (PAGE_SIZE - 1))/PAGE_SIZE)
1775 
1776 #define ADV_CARRIER_BUFSIZE \
1777     ((ADV_CARRIER_COUNT + ADV_CARRIER_NUM_PAGE_CROSSING) * sizeof(ADV_CARR_T))
1778 
1779 /*
1780  * ASC_SCSI_REQ_Q 'a_flag' definitions
1781  *
1782  * The Adv Library should limit use to the lower nibble (4 bits) of
1783  * a_flag. Drivers are free to use the upper nibble (4 bits) of a_flag.
1784  */
1785 #define ADV_POLL_REQUEST                0x01	/* poll for request completion */
1786 #define ADV_SCSIQ_DONE                  0x02	/* request done */
1787 #define ADV_DONT_RETRY                  0x08	/* don't do retry */
1788 
1789 #define ADV_CHIP_ASC3550          0x01	/* Ultra-Wide IC */
1790 #define ADV_CHIP_ASC38C0800       0x02	/* Ultra2-Wide/LVD IC */
1791 #define ADV_CHIP_ASC38C1600       0x03	/* Ultra3-Wide/LVD2 IC */
1792 
1793 /*
1794  * Adapter temporary configuration structure
1795  *
1796  * This structure can be discarded after initialization. Don't add
1797  * fields here needed after initialization.
1798  *
1799  * Field naming convention:
1800  *
1801  *  *_enable indicates the field enables or disables a feature. The
1802  *  value of the field is never reset.
1803  */
1804 typedef struct adv_dvc_cfg {
1805 	ushort disc_enable;	/* enable disconnection */
1806 	uchar chip_version;	/* chip version */
1807 	uchar termination;	/* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */
1808 	ushort control_flag;	/* Microcode Control Flag */
1809 	ushort mcode_date;	/* Microcode date */
1810 	ushort mcode_version;	/* Microcode version */
1811 	ushort serial1;		/* EEPROM serial number word 1 */
1812 	ushort serial2;		/* EEPROM serial number word 2 */
1813 	ushort serial3;		/* EEPROM serial number word 3 */
1814 } ADV_DVC_CFG;
1815 
1816 struct adv_dvc_var;
1817 struct adv_scsi_req_q;
1818 
1819 typedef struct asc_sg_block {
1820 	uchar reserved1;
1821 	uchar reserved2;
1822 	uchar reserved3;
1823 	uchar sg_cnt;		/* Valid entries in block. */
1824 	ADV_PADDR sg_ptr;	/* Pointer to next sg block. */
1825 	struct {
1826 		ADV_PADDR sg_addr;	/* SG element address. */
1827 		ADV_DCNT sg_count;	/* SG element count. */
1828 	} sg_list[NO_OF_SG_PER_BLOCK];
1829 } ADV_SG_BLOCK;
1830 
1831 /*
1832  * ADV_SCSI_REQ_Q - microcode request structure
1833  *
1834  * All fields in this structure up to byte 60 are used by the microcode.
1835  * The microcode makes assumptions about the size and ordering of fields
1836  * in this structure. Do not change the structure definition here without
1837  * coordinating the change with the microcode.
1838  *
1839  * All fields accessed by microcode must be maintained in little_endian
1840  * order.
1841  */
1842 typedef struct adv_scsi_req_q {
1843 	uchar cntl;		/* Ucode flags and state (ASC_MC_QC_*). */
1844 	uchar target_cmd;
1845 	uchar target_id;	/* Device target identifier. */
1846 	uchar target_lun;	/* Device target logical unit number. */
1847 	ADV_PADDR data_addr;	/* Data buffer physical address. */
1848 	ADV_DCNT data_cnt;	/* Data count. Ucode sets to residual. */
1849 	ADV_PADDR sense_addr;
1850 	ADV_PADDR carr_pa;
1851 	uchar mflag;
1852 	uchar sense_len;
1853 	uchar cdb_len;		/* SCSI CDB length. Must <= 16 bytes. */
1854 	uchar scsi_cntl;
1855 	uchar done_status;	/* Completion status. */
1856 	uchar scsi_status;	/* SCSI status byte. */
1857 	uchar host_status;	/* Ucode host status. */
1858 	uchar sg_working_ix;
1859 	uchar cdb[12];		/* SCSI CDB bytes 0-11. */
1860 	ADV_PADDR sg_real_addr;	/* SG list physical address. */
1861 	ADV_PADDR scsiq_rptr;
1862 	uchar cdb16[4];		/* SCSI CDB bytes 12-15. */
1863 	ADV_VADDR scsiq_ptr;
1864 	ADV_VADDR carr_va;
1865 	/*
1866 	 * End of microcode structure - 60 bytes. The rest of the structure
1867 	 * is used by the Adv Library and ignored by the microcode.
1868 	 */
1869 	ADV_VADDR srb_ptr;
1870 	ADV_SG_BLOCK *sg_list_ptr;	/* SG list virtual address. */
1871 	char *vdata_addr;	/* Data buffer virtual address. */
1872 	uchar a_flag;
1873 	uchar pad[2];		/* Pad out to a word boundary. */
1874 } ADV_SCSI_REQ_Q;
1875 
1876 /*
1877  * The following two structures are used to process Wide Board requests.
1878  *
1879  * The ADV_SCSI_REQ_Q structure in adv_req_t is passed to the Adv Library
1880  * and microcode with the ADV_SCSI_REQ_Q field 'srb_ptr' pointing to the
1881  * adv_req_t. The adv_req_t structure 'cmndp' field in turn points to the
1882  * Mid-Level SCSI request structure.
1883  *
1884  * Zero or more ADV_SG_BLOCK are used with each ADV_SCSI_REQ_Q. Each
1885  * ADV_SG_BLOCK structure holds 15 scatter-gather elements. Under Linux
1886  * up to 255 scatter-gather elements may be used per request or
1887  * ADV_SCSI_REQ_Q.
1888  *
1889  * Both structures must be 32 byte aligned.
1890  */
1891 typedef struct adv_sgblk {
1892 	ADV_SG_BLOCK sg_block;	/* Sgblock structure. */
1893 	uchar align[32];	/* Sgblock structure padding. */
1894 	struct adv_sgblk *next_sgblkp;	/* Next scatter-gather structure. */
1895 } adv_sgblk_t;
1896 
1897 typedef struct adv_req {
1898 	ADV_SCSI_REQ_Q scsi_req_q;	/* Adv Library request structure. */
1899 	uchar align[32];	/* Request structure padding. */
1900 	struct scsi_cmnd *cmndp;	/* Mid-Level SCSI command pointer. */
1901 	adv_sgblk_t *sgblkp;	/* Adv Library scatter-gather pointer. */
1902 	struct adv_req *next_reqp;	/* Next Request Structure. */
1903 } adv_req_t;
1904 
1905 /*
1906  * Adapter operation variable structure.
1907  *
1908  * One structure is required per host adapter.
1909  *
1910  * Field naming convention:
1911  *
1912  *  *_able indicates both whether a feature should be enabled or disabled
1913  *  and whether a device isi capable of the feature. At initialization
1914  *  this field may be set, but later if a device is found to be incapable
1915  *  of the feature, the field is cleared.
1916  */
1917 typedef struct adv_dvc_var {
1918 	AdvPortAddr iop_base;	/* I/O port address */
1919 	ushort err_code;	/* fatal error code */
1920 	ushort bios_ctrl;	/* BIOS control word, EEPROM word 12 */
1921 	ushort wdtr_able;	/* try WDTR for a device */
1922 	ushort sdtr_able;	/* try SDTR for a device */
1923 	ushort ultra_able;	/* try SDTR Ultra speed for a device */
1924 	ushort sdtr_speed1;	/* EEPROM SDTR Speed for TID 0-3   */
1925 	ushort sdtr_speed2;	/* EEPROM SDTR Speed for TID 4-7   */
1926 	ushort sdtr_speed3;	/* EEPROM SDTR Speed for TID 8-11  */
1927 	ushort sdtr_speed4;	/* EEPROM SDTR Speed for TID 12-15 */
1928 	ushort tagqng_able;	/* try tagged queuing with a device */
1929 	ushort ppr_able;	/* PPR message capable per TID bitmask. */
1930 	uchar max_dvc_qng;	/* maximum number of tagged commands per device */
1931 	ushort start_motor;	/* start motor command allowed */
1932 	uchar scsi_reset_wait;	/* delay in seconds after scsi bus reset */
1933 	uchar chip_no;		/* should be assigned by caller */
1934 	uchar max_host_qng;	/* maximum number of Q'ed command allowed */
1935 	ushort no_scam;		/* scam_tolerant of EEPROM */
1936 	struct asc_board *drv_ptr;	/* driver pointer to private structure */
1937 	uchar chip_scsi_id;	/* chip SCSI target ID */
1938 	uchar chip_type;
1939 	uchar bist_err_code;
1940 	ADV_CARR_T *carrier_buf;
1941 	ADV_CARR_T *carr_freelist;	/* Carrier free list. */
1942 	ADV_CARR_T *icq_sp;	/* Initiator command queue stopper pointer. */
1943 	ADV_CARR_T *irq_sp;	/* Initiator response queue stopper pointer. */
1944 	ushort carr_pending_cnt;	/* Count of pending carriers. */
1945 	struct adv_req *orig_reqp;	/* adv_req_t memory block. */
1946 	/*
1947 	 * Note: The following fields will not be used after initialization. The
1948 	 * driver may discard the buffer after initialization is done.
1949 	 */
1950 	ADV_DVC_CFG *cfg;	/* temporary configuration structure  */
1951 } ADV_DVC_VAR;
1952 
1953 /*
1954  * Microcode idle loop commands
1955  */
1956 #define IDLE_CMD_COMPLETED           0
1957 #define IDLE_CMD_STOP_CHIP           0x0001
1958 #define IDLE_CMD_STOP_CHIP_SEND_INT  0x0002
1959 #define IDLE_CMD_SEND_INT            0x0004
1960 #define IDLE_CMD_ABORT               0x0008
1961 #define IDLE_CMD_DEVICE_RESET        0x0010
1962 #define IDLE_CMD_SCSI_RESET_START    0x0020	/* Assert SCSI Bus Reset */
1963 #define IDLE_CMD_SCSI_RESET_END      0x0040	/* Deassert SCSI Bus Reset */
1964 #define IDLE_CMD_SCSIREQ             0x0080
1965 
1966 #define IDLE_CMD_STATUS_SUCCESS      0x0001
1967 #define IDLE_CMD_STATUS_FAILURE      0x0002
1968 
1969 /*
1970  * AdvSendIdleCmd() flag definitions.
1971  */
1972 #define ADV_NOWAIT     0x01
1973 
1974 /*
1975  * Wait loop time out values.
1976  */
1977 #define SCSI_WAIT_100_MSEC           100UL	/* 100 milliseconds */
1978 #define SCSI_US_PER_MSEC             1000	/* microseconds per millisecond */
1979 #define SCSI_MAX_RETRY               10	/* retry count */
1980 
1981 #define ADV_ASYNC_RDMA_FAILURE          0x01	/* Fatal RDMA failure. */
1982 #define ADV_ASYNC_SCSI_BUS_RESET_DET    0x02	/* Detected SCSI Bus Reset. */
1983 #define ADV_ASYNC_CARRIER_READY_FAILURE 0x03	/* Carrier Ready failure. */
1984 #define ADV_RDMA_IN_CARR_AND_Q_INVALID  0x04	/* RDMAed-in data invalid. */
1985 
1986 #define ADV_HOST_SCSI_BUS_RESET      0x80	/* Host Initiated SCSI Bus Reset. */
1987 
1988 /* Read byte from a register. */
1989 #define AdvReadByteRegister(iop_base, reg_off) \
1990      (ADV_MEM_READB((iop_base) + (reg_off)))
1991 
1992 /* Write byte to a register. */
1993 #define AdvWriteByteRegister(iop_base, reg_off, byte) \
1994      (ADV_MEM_WRITEB((iop_base) + (reg_off), (byte)))
1995 
1996 /* Read word (2 bytes) from a register. */
1997 #define AdvReadWordRegister(iop_base, reg_off) \
1998      (ADV_MEM_READW((iop_base) + (reg_off)))
1999 
2000 /* Write word (2 bytes) to a register. */
2001 #define AdvWriteWordRegister(iop_base, reg_off, word) \
2002      (ADV_MEM_WRITEW((iop_base) + (reg_off), (word)))
2003 
2004 /* Write dword (4 bytes) to a register. */
2005 #define AdvWriteDWordRegister(iop_base, reg_off, dword) \
2006      (ADV_MEM_WRITEDW((iop_base) + (reg_off), (dword)))
2007 
2008 /* Read byte from LRAM. */
2009 #define AdvReadByteLram(iop_base, addr, byte) \
2010 do { \
2011     ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); \
2012     (byte) = ADV_MEM_READB((iop_base) + IOPB_RAM_DATA); \
2013 } while (0)
2014 
2015 /* Write byte to LRAM. */
2016 #define AdvWriteByteLram(iop_base, addr, byte) \
2017     (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2018      ADV_MEM_WRITEB((iop_base) + IOPB_RAM_DATA, (byte)))
2019 
2020 /* Read word (2 bytes) from LRAM. */
2021 #define AdvReadWordLram(iop_base, addr, word) \
2022 do { \
2023     ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); \
2024     (word) = (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA)); \
2025 } while (0)
2026 
2027 /* Write word (2 bytes) to LRAM. */
2028 #define AdvWriteWordLram(iop_base, addr, word) \
2029     (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2030      ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
2031 
2032 /* Write little-endian double word (4 bytes) to LRAM */
2033 /* Because of unspecified C language ordering don't use auto-increment. */
2034 #define AdvWriteDWordLramNoSwap(iop_base, addr, dword) \
2035     ((ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2036       ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, \
2037                      cpu_to_le16((ushort) ((dword) & 0xFFFF)))), \
2038      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr) + 2), \
2039       ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, \
2040                      cpu_to_le16((ushort) ((dword >> 16) & 0xFFFF)))))
2041 
2042 /* Read word (2 bytes) from LRAM assuming that the address is already set. */
2043 #define AdvReadWordAutoIncLram(iop_base) \
2044      (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA))
2045 
2046 /* Write word (2 bytes) to LRAM assuming that the address is already set. */
2047 #define AdvWriteWordAutoIncLram(iop_base, word) \
2048      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
2049 
2050 /*
2051  * Define macro to check for Condor signature.
2052  *
2053  * Evaluate to ADV_TRUE if a Condor chip is found the specified port
2054  * address 'iop_base'. Otherwise evalue to ADV_FALSE.
2055  */
2056 #define AdvFindSignature(iop_base) \
2057     (((AdvReadByteRegister((iop_base), IOPB_CHIP_ID_1) == \
2058     ADV_CHIP_ID_BYTE) && \
2059      (AdvReadWordRegister((iop_base), IOPW_CHIP_ID_0) == \
2060     ADV_CHIP_ID_WORD)) ?  ADV_TRUE : ADV_FALSE)
2061 
2062 /*
2063  * Define macro to Return the version number of the chip at 'iop_base'.
2064  *
2065  * The second parameter 'bus_type' is currently unused.
2066  */
2067 #define AdvGetChipVersion(iop_base, bus_type) \
2068     AdvReadByteRegister((iop_base), IOPB_CHIP_TYPE_REV)
2069 
2070 /*
2071  * Abort an SRB in the chip's RISC Memory. The 'srb_ptr' argument must
2072  * match the ASC_SCSI_REQ_Q 'srb_ptr' field.
2073  *
2074  * If the request has not yet been sent to the device it will simply be
2075  * aborted from RISC memory. If the request is disconnected it will be
2076  * aborted on reselection by sending an Abort Message to the target ID.
2077  *
2078  * Return value:
2079  *      ADV_TRUE(1) - Queue was successfully aborted.
2080  *      ADV_FALSE(0) - Queue was not found on the active queue list.
2081  */
2082 #define AdvAbortQueue(asc_dvc, scsiq) \
2083         AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_ABORT, \
2084                        (ADV_DCNT) (scsiq))
2085 
2086 /*
2087  * Send a Bus Device Reset Message to the specified target ID.
2088  *
2089  * All outstanding commands will be purged if sending the
2090  * Bus Device Reset Message is successful.
2091  *
2092  * Return Value:
2093  *      ADV_TRUE(1) - All requests on the target are purged.
2094  *      ADV_FALSE(0) - Couldn't issue Bus Device Reset Message; Requests
2095  *                     are not purged.
2096  */
2097 #define AdvResetDevice(asc_dvc, target_id) \
2098         AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_DEVICE_RESET, \
2099                     (ADV_DCNT) (target_id))
2100 
2101 /*
2102  * SCSI Wide Type definition.
2103  */
2104 #define ADV_SCSI_BIT_ID_TYPE   ushort
2105 
2106 /*
2107  * AdvInitScsiTarget() 'cntl_flag' options.
2108  */
2109 #define ADV_SCAN_LUN           0x01
2110 #define ADV_CAPINFO_NOLUN      0x02
2111 
2112 /*
2113  * Convert target id to target id bit mask.
2114  */
2115 #define ADV_TID_TO_TIDMASK(tid)   (0x01 << ((tid) & ADV_MAX_TID))
2116 
2117 /*
2118  * ASC_SCSI_REQ_Q 'done_status' and 'host_status' return values.
2119  */
2120 
2121 #define QD_NO_STATUS         0x00	/* Request not completed yet. */
2122 #define QD_NO_ERROR          0x01
2123 #define QD_ABORTED_BY_HOST   0x02
2124 #define QD_WITH_ERROR        0x04
2125 
2126 #define QHSTA_NO_ERROR              0x00
2127 #define QHSTA_M_SEL_TIMEOUT         0x11
2128 #define QHSTA_M_DATA_OVER_RUN       0x12
2129 #define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
2130 #define QHSTA_M_QUEUE_ABORTED       0x15
2131 #define QHSTA_M_SXFR_SDMA_ERR       0x16	/* SXFR_STATUS SCSI DMA Error */
2132 #define QHSTA_M_SXFR_SXFR_PERR      0x17	/* SXFR_STATUS SCSI Bus Parity Error */
2133 #define QHSTA_M_RDMA_PERR           0x18	/* RISC PCI DMA parity error */
2134 #define QHSTA_M_SXFR_OFF_UFLW       0x19	/* SXFR_STATUS Offset Underflow */
2135 #define QHSTA_M_SXFR_OFF_OFLW       0x20	/* SXFR_STATUS Offset Overflow */
2136 #define QHSTA_M_SXFR_WD_TMO         0x21	/* SXFR_STATUS Watchdog Timeout */
2137 #define QHSTA_M_SXFR_DESELECTED     0x22	/* SXFR_STATUS Deselected */
2138 /* Note: QHSTA_M_SXFR_XFR_OFLW is identical to QHSTA_M_DATA_OVER_RUN. */
2139 #define QHSTA_M_SXFR_XFR_OFLW       0x12	/* SXFR_STATUS Transfer Overflow */
2140 #define QHSTA_M_SXFR_XFR_PH_ERR     0x24	/* SXFR_STATUS Transfer Phase Error */
2141 #define QHSTA_M_SXFR_UNKNOWN_ERROR  0x25	/* SXFR_STATUS Unknown Error */
2142 #define QHSTA_M_SCSI_BUS_RESET      0x30	/* Request aborted from SBR */
2143 #define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31	/* Request aborted from unsol. SBR */
2144 #define QHSTA_M_BUS_DEVICE_RESET    0x32	/* Request aborted from BDR */
2145 #define QHSTA_M_DIRECTION_ERR       0x35	/* Data Phase mismatch */
2146 #define QHSTA_M_DIRECTION_ERR_HUNG  0x36	/* Data Phase mismatch and bus hang */
2147 #define QHSTA_M_WTM_TIMEOUT         0x41
2148 #define QHSTA_M_BAD_CMPL_STATUS_IN  0x42
2149 #define QHSTA_M_NO_AUTO_REQ_SENSE   0x43
2150 #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
2151 #define QHSTA_M_INVALID_DEVICE      0x45	/* Bad target ID */
2152 #define QHSTA_M_FROZEN_TIDQ         0x46	/* TID Queue frozen. */
2153 #define QHSTA_M_SGBACKUP_ERROR      0x47	/* Scatter-Gather backup error */
2154 
2155 /* Return the address that is aligned at the next doubleword >= to 'addr'. */
2156 #define ADV_8BALIGN(addr)      (((ulong) (addr) + 0x7) & ~0x7)
2157 #define ADV_16BALIGN(addr)     (((ulong) (addr) + 0xF) & ~0xF)
2158 #define ADV_32BALIGN(addr)     (((ulong) (addr) + 0x1F) & ~0x1F)
2159 
2160 /*
2161  * Total contiguous memory needed for driver SG blocks.
2162  *
2163  * ADV_MAX_SG_LIST must be defined by a driver. It is the maximum
2164  * number of scatter-gather elements the driver supports in a
2165  * single request.
2166  */
2167 
2168 #define ADV_SG_LIST_MAX_BYTE_SIZE \
2169          (sizeof(ADV_SG_BLOCK) * \
2170           ((ADV_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK))
2171 
2172 /* struct asc_board flags */
2173 #define ASC_IS_WIDE_BOARD       0x04	/* AdvanSys Wide Board */
2174 
2175 #define ASC_NARROW_BOARD(boardp) (((boardp)->flags & ASC_IS_WIDE_BOARD) == 0)
2176 
2177 #define NO_ISA_DMA              0xff	/* No ISA DMA Channel Used */
2178 
2179 #define ASC_INFO_SIZE           128	/* advansys_info() line size */
2180 
2181 #ifdef CONFIG_PROC_FS
2182 /* /proc/scsi/advansys/[0...] related definitions */
2183 #define ASC_PRTBUF_SIZE         2048
2184 #define ASC_PRTLINE_SIZE        160
2185 
2186 #define ASC_PRT_NEXT() \
2187     if (cp) { \
2188         totlen += len; \
2189         leftlen -= len; \
2190         if (leftlen == 0) { \
2191             return totlen; \
2192         } \
2193         cp += len; \
2194     }
2195 #endif /* CONFIG_PROC_FS */
2196 
2197 /* Asc Library return codes */
2198 #define ASC_TRUE        1
2199 #define ASC_FALSE       0
2200 #define ASC_NOERROR     1
2201 #define ASC_BUSY        0
2202 #define ASC_ERROR       (-1)
2203 
2204 /* struct scsi_cmnd function return codes */
2205 #define STATUS_BYTE(byte)   (byte)
2206 #define MSG_BYTE(byte)      ((byte) << 8)
2207 #define HOST_BYTE(byte)     ((byte) << 16)
2208 #define DRIVER_BYTE(byte)   ((byte) << 24)
2209 
2210 #define ASC_STATS(shost, counter) ASC_STATS_ADD(shost, counter, 1)
2211 #ifndef ADVANSYS_STATS
2212 #define ASC_STATS_ADD(shost, counter, count)
2213 #else /* ADVANSYS_STATS */
2214 #define ASC_STATS_ADD(shost, counter, count) \
2215 	(((struct asc_board *) shost_priv(shost))->asc_stats.counter += (count))
2216 #endif /* ADVANSYS_STATS */
2217 
2218 /* If the result wraps when calculating tenths, return 0. */
2219 #define ASC_TENTHS(num, den) \
2220     (((10 * ((num)/(den))) > (((num) * 10)/(den))) ? \
2221     0 : ((((num) * 10)/(den)) - (10 * ((num)/(den)))))
2222 
2223 /*
2224  * Display a message to the console.
2225  */
2226 #define ASC_PRINT(s) \
2227     { \
2228         printk("advansys: "); \
2229         printk(s); \
2230     }
2231 
2232 #define ASC_PRINT1(s, a1) \
2233     { \
2234         printk("advansys: "); \
2235         printk((s), (a1)); \
2236     }
2237 
2238 #define ASC_PRINT2(s, a1, a2) \
2239     { \
2240         printk("advansys: "); \
2241         printk((s), (a1), (a2)); \
2242     }
2243 
2244 #define ASC_PRINT3(s, a1, a2, a3) \
2245     { \
2246         printk("advansys: "); \
2247         printk((s), (a1), (a2), (a3)); \
2248     }
2249 
2250 #define ASC_PRINT4(s, a1, a2, a3, a4) \
2251     { \
2252         printk("advansys: "); \
2253         printk((s), (a1), (a2), (a3), (a4)); \
2254     }
2255 
2256 #ifndef ADVANSYS_DEBUG
2257 
2258 #define ASC_DBG(lvl, s...)
2259 #define ASC_DBG_PRT_SCSI_HOST(lvl, s)
2260 #define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp)
2261 #define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
2262 #define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone)
2263 #define ADV_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
2264 #define ASC_DBG_PRT_HEX(lvl, name, start, length)
2265 #define ASC_DBG_PRT_CDB(lvl, cdb, len)
2266 #define ASC_DBG_PRT_SENSE(lvl, sense, len)
2267 #define ASC_DBG_PRT_INQUIRY(lvl, inq, len)
2268 
2269 #else /* ADVANSYS_DEBUG */
2270 
2271 /*
2272  * Debugging Message Levels:
2273  * 0: Errors Only
2274  * 1: High-Level Tracing
2275  * 2-N: Verbose Tracing
2276  */
2277 
2278 #define ASC_DBG(lvl, format, arg...) {					\
2279 	if (asc_dbglvl >= (lvl))					\
2280 		printk(KERN_DEBUG "%s: %s: " format, DRV_NAME,		\
2281 			__func__ , ## arg);				\
2282 }
2283 
2284 #define ASC_DBG_PRT_SCSI_HOST(lvl, s) \
2285     { \
2286         if (asc_dbglvl >= (lvl)) { \
2287             asc_prt_scsi_host(s); \
2288         } \
2289     }
2290 
2291 #define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp) \
2292     { \
2293         if (asc_dbglvl >= (lvl)) { \
2294             asc_prt_asc_scsi_q(scsiqp); \
2295         } \
2296     }
2297 
2298 #define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone) \
2299     { \
2300         if (asc_dbglvl >= (lvl)) { \
2301             asc_prt_asc_qdone_info(qdone); \
2302         } \
2303     }
2304 
2305 #define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp) \
2306     { \
2307         if (asc_dbglvl >= (lvl)) { \
2308             asc_prt_adv_scsi_req_q(scsiqp); \
2309         } \
2310     }
2311 
2312 #define ASC_DBG_PRT_HEX(lvl, name, start, length) \
2313     { \
2314         if (asc_dbglvl >= (lvl)) { \
2315             asc_prt_hex((name), (start), (length)); \
2316         } \
2317     }
2318 
2319 #define ASC_DBG_PRT_CDB(lvl, cdb, len) \
2320         ASC_DBG_PRT_HEX((lvl), "CDB", (uchar *) (cdb), (len));
2321 
2322 #define ASC_DBG_PRT_SENSE(lvl, sense, len) \
2323         ASC_DBG_PRT_HEX((lvl), "SENSE", (uchar *) (sense), (len));
2324 
2325 #define ASC_DBG_PRT_INQUIRY(lvl, inq, len) \
2326         ASC_DBG_PRT_HEX((lvl), "INQUIRY", (uchar *) (inq), (len));
2327 #endif /* ADVANSYS_DEBUG */
2328 
2329 #ifdef ADVANSYS_STATS
2330 
2331 /* Per board statistics structure */
2332 struct asc_stats {
2333 	/* Driver Entrypoint Statistics */
2334 	ADV_DCNT queuecommand;	/* # calls to advansys_queuecommand() */
2335 	ADV_DCNT reset;		/* # calls to advansys_eh_bus_reset() */
2336 	ADV_DCNT biosparam;	/* # calls to advansys_biosparam() */
2337 	ADV_DCNT interrupt;	/* # advansys_interrupt() calls */
2338 	ADV_DCNT callback;	/* # calls to asc/adv_isr_callback() */
2339 	ADV_DCNT done;		/* # calls to request's scsi_done function */
2340 	ADV_DCNT build_error;	/* # asc/adv_build_req() ASC_ERROR returns. */
2341 	ADV_DCNT adv_build_noreq;	/* # adv_build_req() adv_req_t alloc. fail. */
2342 	ADV_DCNT adv_build_nosg;	/* # adv_build_req() adv_sgblk_t alloc. fail. */
2343 	/* AscExeScsiQueue()/AdvExeScsiQueue() Statistics */
2344 	ADV_DCNT exe_noerror;	/* # ASC_NOERROR returns. */
2345 	ADV_DCNT exe_busy;	/* # ASC_BUSY returns. */
2346 	ADV_DCNT exe_error;	/* # ASC_ERROR returns. */
2347 	ADV_DCNT exe_unknown;	/* # unknown returns. */
2348 	/* Data Transfer Statistics */
2349 	ADV_DCNT xfer_cnt;	/* # I/O requests received */
2350 	ADV_DCNT xfer_elem;	/* # scatter-gather elements */
2351 	ADV_DCNT xfer_sect;	/* # 512-byte blocks */
2352 };
2353 #endif /* ADVANSYS_STATS */
2354 
2355 /*
2356  * Structure allocated for each board.
2357  *
2358  * This structure is allocated by scsi_host_alloc() at the end
2359  * of the 'Scsi_Host' structure starting at the 'hostdata'
2360  * field. It is guaranteed to be allocated from DMA-able memory.
2361  */
2362 struct asc_board {
2363 	struct device *dev;
2364 	uint flags;		/* Board flags */
2365 	unsigned int irq;
2366 	union {
2367 		ASC_DVC_VAR asc_dvc_var;	/* Narrow board */
2368 		ADV_DVC_VAR adv_dvc_var;	/* Wide board */
2369 	} dvc_var;
2370 	union {
2371 		ASC_DVC_CFG asc_dvc_cfg;	/* Narrow board */
2372 		ADV_DVC_CFG adv_dvc_cfg;	/* Wide board */
2373 	} dvc_cfg;
2374 	ushort asc_n_io_port;	/* Number I/O ports. */
2375 	ADV_SCSI_BIT_ID_TYPE init_tidmask;	/* Target init./valid mask */
2376 	ushort reqcnt[ADV_MAX_TID + 1];	/* Starvation request count */
2377 	ADV_SCSI_BIT_ID_TYPE queue_full;	/* Queue full mask */
2378 	ushort queue_full_cnt[ADV_MAX_TID + 1];	/* Queue full count */
2379 	union {
2380 		ASCEEP_CONFIG asc_eep;	/* Narrow EEPROM config. */
2381 		ADVEEP_3550_CONFIG adv_3550_eep;	/* 3550 EEPROM config. */
2382 		ADVEEP_38C0800_CONFIG adv_38C0800_eep;	/* 38C0800 EEPROM config. */
2383 		ADVEEP_38C1600_CONFIG adv_38C1600_eep;	/* 38C1600 EEPROM config. */
2384 	} eep_config;
2385 	ulong last_reset;	/* Saved last reset time */
2386 	/* /proc/scsi/advansys/[0...] */
2387 	char *prtbuf;		/* /proc print buffer */
2388 #ifdef ADVANSYS_STATS
2389 	struct asc_stats asc_stats;	/* Board statistics */
2390 #endif				/* ADVANSYS_STATS */
2391 	/*
2392 	 * The following fields are used only for Narrow Boards.
2393 	 */
2394 	uchar sdtr_data[ASC_MAX_TID + 1];	/* SDTR information */
2395 	/*
2396 	 * The following fields are used only for Wide Boards.
2397 	 */
2398 	void __iomem *ioremap_addr;	/* I/O Memory remap address. */
2399 	ushort ioport;		/* I/O Port address. */
2400 	adv_req_t *adv_reqp;	/* Request structures. */
2401 	adv_sgblk_t *adv_sgblkp;	/* Scatter-gather structures. */
2402 	ushort bios_signature;	/* BIOS Signature. */
2403 	ushort bios_version;	/* BIOS Version. */
2404 	ushort bios_codeseg;	/* BIOS Code Segment. */
2405 	ushort bios_codelen;	/* BIOS Code Segment Length. */
2406 };
2407 
2408 #define asc_dvc_to_board(asc_dvc) container_of(asc_dvc, struct asc_board, \
2409 							dvc_var.asc_dvc_var)
2410 #define adv_dvc_to_board(adv_dvc) container_of(adv_dvc, struct asc_board, \
2411 							dvc_var.adv_dvc_var)
2412 #define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
2413 
2414 #ifdef ADVANSYS_DEBUG
2415 static int asc_dbglvl = 3;
2416 
2417 /*
2418  * asc_prt_asc_dvc_var()
2419  */
2420 static void asc_prt_asc_dvc_var(ASC_DVC_VAR *h)
2421 {
2422 	printk("ASC_DVC_VAR at addr 0x%lx\n", (ulong)h);
2423 
2424 	printk(" iop_base 0x%x, err_code 0x%x, dvc_cntl 0x%x, bug_fix_cntl "
2425 	       "%d,\n", h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl);
2426 
2427 	printk(" bus_type %d, init_sdtr 0x%x,\n", h->bus_type,
2428 		(unsigned)h->init_sdtr);
2429 
2430 	printk(" sdtr_done 0x%x, use_tagged_qng 0x%x, unit_not_ready 0x%x, "
2431 	       "chip_no 0x%x,\n", (unsigned)h->sdtr_done,
2432 	       (unsigned)h->use_tagged_qng, (unsigned)h->unit_not_ready,
2433 	       (unsigned)h->chip_no);
2434 
2435 	printk(" queue_full_or_busy 0x%x, start_motor 0x%x, scsi_reset_wait "
2436 	       "%u,\n", (unsigned)h->queue_full_or_busy,
2437 	       (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait);
2438 
2439 	printk(" is_in_int %u, max_total_qng %u, cur_total_qng %u, "
2440 	       "in_critical_cnt %u,\n", (unsigned)h->is_in_int,
2441 	       (unsigned)h->max_total_qng, (unsigned)h->cur_total_qng,
2442 	       (unsigned)h->in_critical_cnt);
2443 
2444 	printk(" last_q_shortage %u, init_state 0x%x, no_scam 0x%x, "
2445 	       "pci_fix_asyn_xfer 0x%x,\n", (unsigned)h->last_q_shortage,
2446 	       (unsigned)h->init_state, (unsigned)h->no_scam,
2447 	       (unsigned)h->pci_fix_asyn_xfer);
2448 
2449 	printk(" cfg 0x%lx\n", (ulong)h->cfg);
2450 }
2451 
2452 /*
2453  * asc_prt_asc_dvc_cfg()
2454  */
2455 static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h)
2456 {
2457 	printk("ASC_DVC_CFG at addr 0x%lx\n", (ulong)h);
2458 
2459 	printk(" can_tagged_qng 0x%x, cmd_qng_enabled 0x%x,\n",
2460 	       h->can_tagged_qng, h->cmd_qng_enabled);
2461 	printk(" disc_enable 0x%x, sdtr_enable 0x%x,\n",
2462 	       h->disc_enable, h->sdtr_enable);
2463 
2464 	printk(" chip_scsi_id %d, isa_dma_speed %d, isa_dma_channel %d, "
2465 		"chip_version %d,\n", h->chip_scsi_id, h->isa_dma_speed,
2466 		h->isa_dma_channel, h->chip_version);
2467 
2468 	printk(" mcode_date 0x%x, mcode_version %d\n",
2469 		h->mcode_date, h->mcode_version);
2470 }
2471 
2472 /*
2473  * asc_prt_adv_dvc_var()
2474  *
2475  * Display an ADV_DVC_VAR structure.
2476  */
2477 static void asc_prt_adv_dvc_var(ADV_DVC_VAR *h)
2478 {
2479 	printk(" ADV_DVC_VAR at addr 0x%lx\n", (ulong)h);
2480 
2481 	printk("  iop_base 0x%lx, err_code 0x%x, ultra_able 0x%x\n",
2482 	       (ulong)h->iop_base, h->err_code, (unsigned)h->ultra_able);
2483 
2484 	printk("  sdtr_able 0x%x, wdtr_able 0x%x\n",
2485 	       (unsigned)h->sdtr_able, (unsigned)h->wdtr_able);
2486 
2487 	printk("  start_motor 0x%x, scsi_reset_wait 0x%x\n",
2488 	       (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait);
2489 
2490 	printk("  max_host_qng %u, max_dvc_qng %u, carr_freelist 0x%lxn\n",
2491 	       (unsigned)h->max_host_qng, (unsigned)h->max_dvc_qng,
2492 	       (ulong)h->carr_freelist);
2493 
2494 	printk("  icq_sp 0x%lx, irq_sp 0x%lx\n",
2495 	       (ulong)h->icq_sp, (ulong)h->irq_sp);
2496 
2497 	printk("  no_scam 0x%x, tagqng_able 0x%x\n",
2498 	       (unsigned)h->no_scam, (unsigned)h->tagqng_able);
2499 
2500 	printk("  chip_scsi_id 0x%x, cfg 0x%lx\n",
2501 	       (unsigned)h->chip_scsi_id, (ulong)h->cfg);
2502 }
2503 
2504 /*
2505  * asc_prt_adv_dvc_cfg()
2506  *
2507  * Display an ADV_DVC_CFG structure.
2508  */
2509 static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
2510 {
2511 	printk(" ADV_DVC_CFG at addr 0x%lx\n", (ulong)h);
2512 
2513 	printk("  disc_enable 0x%x, termination 0x%x\n",
2514 	       h->disc_enable, h->termination);
2515 
2516 	printk("  chip_version 0x%x, mcode_date 0x%x\n",
2517 	       h->chip_version, h->mcode_date);
2518 
2519 	printk("  mcode_version 0x%x, control_flag 0x%x\n",
2520 	       h->mcode_version, h->control_flag);
2521 }
2522 
2523 /*
2524  * asc_prt_scsi_host()
2525  */
2526 static void asc_prt_scsi_host(struct Scsi_Host *s)
2527 {
2528 	struct asc_board *boardp = shost_priv(s);
2529 
2530 	printk("Scsi_Host at addr 0x%p, device %s\n", s, boardp->dev->bus_id);
2531 	printk(" host_busy %u, host_no %d, last_reset %d,\n",
2532 	       s->host_busy, s->host_no, (unsigned)s->last_reset);
2533 
2534 	printk(" base 0x%lx, io_port 0x%lx, irq %d,\n",
2535 	       (ulong)s->base, (ulong)s->io_port, boardp->irq);
2536 
2537 	printk(" dma_channel %d, this_id %d, can_queue %d,\n",
2538 	       s->dma_channel, s->this_id, s->can_queue);
2539 
2540 	printk(" cmd_per_lun %d, sg_tablesize %d, unchecked_isa_dma %d\n",
2541 	       s->cmd_per_lun, s->sg_tablesize, s->unchecked_isa_dma);
2542 
2543 	if (ASC_NARROW_BOARD(boardp)) {
2544 		asc_prt_asc_dvc_var(&boardp->dvc_var.asc_dvc_var);
2545 		asc_prt_asc_dvc_cfg(&boardp->dvc_cfg.asc_dvc_cfg);
2546 	} else {
2547 		asc_prt_adv_dvc_var(&boardp->dvc_var.adv_dvc_var);
2548 		asc_prt_adv_dvc_cfg(&boardp->dvc_cfg.adv_dvc_cfg);
2549 	}
2550 }
2551 
2552 /*
2553  * asc_prt_hex()
2554  *
2555  * Print hexadecimal output in 4 byte groupings 32 bytes
2556  * or 8 double-words per line.
2557  */
2558 static void asc_prt_hex(char *f, uchar *s, int l)
2559 {
2560 	int i;
2561 	int j;
2562 	int k;
2563 	int m;
2564 
2565 	printk("%s: (%d bytes)\n", f, l);
2566 
2567 	for (i = 0; i < l; i += 32) {
2568 
2569 		/* Display a maximum of 8 double-words per line. */
2570 		if ((k = (l - i) / 4) >= 8) {
2571 			k = 8;
2572 			m = 0;
2573 		} else {
2574 			m = (l - i) % 4;
2575 		}
2576 
2577 		for (j = 0; j < k; j++) {
2578 			printk(" %2.2X%2.2X%2.2X%2.2X",
2579 			       (unsigned)s[i + (j * 4)],
2580 			       (unsigned)s[i + (j * 4) + 1],
2581 			       (unsigned)s[i + (j * 4) + 2],
2582 			       (unsigned)s[i + (j * 4) + 3]);
2583 		}
2584 
2585 		switch (m) {
2586 		case 0:
2587 		default:
2588 			break;
2589 		case 1:
2590 			printk(" %2.2X", (unsigned)s[i + (j * 4)]);
2591 			break;
2592 		case 2:
2593 			printk(" %2.2X%2.2X",
2594 			       (unsigned)s[i + (j * 4)],
2595 			       (unsigned)s[i + (j * 4) + 1]);
2596 			break;
2597 		case 3:
2598 			printk(" %2.2X%2.2X%2.2X",
2599 			       (unsigned)s[i + (j * 4) + 1],
2600 			       (unsigned)s[i + (j * 4) + 2],
2601 			       (unsigned)s[i + (j * 4) + 3]);
2602 			break;
2603 		}
2604 
2605 		printk("\n");
2606 	}
2607 }
2608 
2609 /*
2610  * asc_prt_asc_scsi_q()
2611  */
2612 static void asc_prt_asc_scsi_q(ASC_SCSI_Q *q)
2613 {
2614 	ASC_SG_HEAD *sgp;
2615 	int i;
2616 
2617 	printk("ASC_SCSI_Q at addr 0x%lx\n", (ulong)q);
2618 
2619 	printk
2620 	    (" target_ix 0x%x, target_lun %u, srb_ptr 0x%lx, tag_code 0x%x,\n",
2621 	     q->q2.target_ix, q->q1.target_lun, (ulong)q->q2.srb_ptr,
2622 	     q->q2.tag_code);
2623 
2624 	printk
2625 	    (" data_addr 0x%lx, data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
2626 	     (ulong)le32_to_cpu(q->q1.data_addr),
2627 	     (ulong)le32_to_cpu(q->q1.data_cnt),
2628 	     (ulong)le32_to_cpu(q->q1.sense_addr), q->q1.sense_len);
2629 
2630 	printk(" cdbptr 0x%lx, cdb_len %u, sg_head 0x%lx, sg_queue_cnt %u\n",
2631 	       (ulong)q->cdbptr, q->q2.cdb_len,
2632 	       (ulong)q->sg_head, q->q1.sg_queue_cnt);
2633 
2634 	if (q->sg_head) {
2635 		sgp = q->sg_head;
2636 		printk("ASC_SG_HEAD at addr 0x%lx\n", (ulong)sgp);
2637 		printk(" entry_cnt %u, queue_cnt %u\n", sgp->entry_cnt,
2638 		       sgp->queue_cnt);
2639 		for (i = 0; i < sgp->entry_cnt; i++) {
2640 			printk(" [%u]: addr 0x%lx, bytes %lu\n",
2641 			       i, (ulong)le32_to_cpu(sgp->sg_list[i].addr),
2642 			       (ulong)le32_to_cpu(sgp->sg_list[i].bytes));
2643 		}
2644 
2645 	}
2646 }
2647 
2648 /*
2649  * asc_prt_asc_qdone_info()
2650  */
2651 static void asc_prt_asc_qdone_info(ASC_QDONE_INFO *q)
2652 {
2653 	printk("ASC_QDONE_INFO at addr 0x%lx\n", (ulong)q);
2654 	printk(" srb_ptr 0x%lx, target_ix %u, cdb_len %u, tag_code %u,\n",
2655 	       (ulong)q->d2.srb_ptr, q->d2.target_ix, q->d2.cdb_len,
2656 	       q->d2.tag_code);
2657 	printk
2658 	    (" done_stat 0x%x, host_stat 0x%x, scsi_stat 0x%x, scsi_msg 0x%x\n",
2659 	     q->d3.done_stat, q->d3.host_stat, q->d3.scsi_stat, q->d3.scsi_msg);
2660 }
2661 
2662 /*
2663  * asc_prt_adv_sgblock()
2664  *
2665  * Display an ADV_SG_BLOCK structure.
2666  */
2667 static void asc_prt_adv_sgblock(int sgblockno, ADV_SG_BLOCK *b)
2668 {
2669 	int i;
2670 
2671 	printk(" ASC_SG_BLOCK at addr 0x%lx (sgblockno %d)\n",
2672 	       (ulong)b, sgblockno);
2673 	printk("  sg_cnt %u, sg_ptr 0x%lx\n",
2674 	       b->sg_cnt, (ulong)le32_to_cpu(b->sg_ptr));
2675 	BUG_ON(b->sg_cnt > NO_OF_SG_PER_BLOCK);
2676 	if (b->sg_ptr != 0)
2677 		BUG_ON(b->sg_cnt != NO_OF_SG_PER_BLOCK);
2678 	for (i = 0; i < b->sg_cnt; i++) {
2679 		printk("  [%u]: sg_addr 0x%lx, sg_count 0x%lx\n",
2680 		       i, (ulong)b->sg_list[i].sg_addr,
2681 		       (ulong)b->sg_list[i].sg_count);
2682 	}
2683 }
2684 
2685 /*
2686  * asc_prt_adv_scsi_req_q()
2687  *
2688  * Display an ADV_SCSI_REQ_Q structure.
2689  */
2690 static void asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *q)
2691 {
2692 	int sg_blk_cnt;
2693 	struct asc_sg_block *sg_ptr;
2694 
2695 	printk("ADV_SCSI_REQ_Q at addr 0x%lx\n", (ulong)q);
2696 
2697 	printk("  target_id %u, target_lun %u, srb_ptr 0x%lx, a_flag 0x%x\n",
2698 	       q->target_id, q->target_lun, (ulong)q->srb_ptr, q->a_flag);
2699 
2700 	printk("  cntl 0x%x, data_addr 0x%lx, vdata_addr 0x%lx\n",
2701 	       q->cntl, (ulong)le32_to_cpu(q->data_addr), (ulong)q->vdata_addr);
2702 
2703 	printk("  data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
2704 	       (ulong)le32_to_cpu(q->data_cnt),
2705 	       (ulong)le32_to_cpu(q->sense_addr), q->sense_len);
2706 
2707 	printk
2708 	    ("  cdb_len %u, done_status 0x%x, host_status 0x%x, scsi_status 0x%x\n",
2709 	     q->cdb_len, q->done_status, q->host_status, q->scsi_status);
2710 
2711 	printk("  sg_working_ix 0x%x, target_cmd %u\n",
2712 	       q->sg_working_ix, q->target_cmd);
2713 
2714 	printk("  scsiq_rptr 0x%lx, sg_real_addr 0x%lx, sg_list_ptr 0x%lx\n",
2715 	       (ulong)le32_to_cpu(q->scsiq_rptr),
2716 	       (ulong)le32_to_cpu(q->sg_real_addr), (ulong)q->sg_list_ptr);
2717 
2718 	/* Display the request's ADV_SG_BLOCK structures. */
2719 	if (q->sg_list_ptr != NULL) {
2720 		sg_blk_cnt = 0;
2721 		while (1) {
2722 			/*
2723 			 * 'sg_ptr' is a physical address. Convert it to a virtual
2724 			 * address by indexing 'sg_blk_cnt' into the virtual address
2725 			 * array 'sg_list_ptr'.
2726 			 *
2727 			 * XXX - Assumes all SG physical blocks are virtually contiguous.
2728 			 */
2729 			sg_ptr =
2730 			    &(((ADV_SG_BLOCK *)(q->sg_list_ptr))[sg_blk_cnt]);
2731 			asc_prt_adv_sgblock(sg_blk_cnt, sg_ptr);
2732 			if (sg_ptr->sg_ptr == 0) {
2733 				break;
2734 			}
2735 			sg_blk_cnt++;
2736 		}
2737 	}
2738 }
2739 #endif /* ADVANSYS_DEBUG */
2740 
2741 /*
2742  * The advansys chip/microcode contains a 32-bit identifier for each command
2743  * known as the 'srb'.  I don't know what it stands for.  The driver used
2744  * to encode the scsi_cmnd pointer by calling virt_to_bus and retrieve it
2745  * with bus_to_virt.  Now the driver keeps a per-host map of integers to
2746  * pointers.  It auto-expands when full, unless it can't allocate memory.
2747  * Note that an srb of 0 is treated specially by the chip/firmware, hence
2748  * the return of i+1 in this routine, and the corresponding subtraction in
2749  * the inverse routine.
2750  */
2751 #define BAD_SRB 0
2752 static u32 advansys_ptr_to_srb(struct asc_dvc_var *asc_dvc, void *ptr)
2753 {
2754 	int i;
2755 	void **new_ptr;
2756 
2757 	for (i = 0; i < asc_dvc->ptr_map_count; i++) {
2758 		if (!asc_dvc->ptr_map[i])
2759 			goto out;
2760 	}
2761 
2762 	if (asc_dvc->ptr_map_count == 0)
2763 		asc_dvc->ptr_map_count = 1;
2764 	else
2765 		asc_dvc->ptr_map_count *= 2;
2766 
2767 	new_ptr = krealloc(asc_dvc->ptr_map,
2768 			asc_dvc->ptr_map_count * sizeof(void *), GFP_ATOMIC);
2769 	if (!new_ptr)
2770 		return BAD_SRB;
2771 	asc_dvc->ptr_map = new_ptr;
2772  out:
2773 	ASC_DBG(3, "Putting ptr %p into array offset %d\n", ptr, i);
2774 	asc_dvc->ptr_map[i] = ptr;
2775 	return i + 1;
2776 }
2777 
2778 static void * advansys_srb_to_ptr(struct asc_dvc_var *asc_dvc, u32 srb)
2779 {
2780 	void *ptr;
2781 
2782 	srb--;
2783 	if (srb >= asc_dvc->ptr_map_count) {
2784 		printk("advansys: bad SRB %u, max %u\n", srb,
2785 							asc_dvc->ptr_map_count);
2786 		return NULL;
2787 	}
2788 	ptr = asc_dvc->ptr_map[srb];
2789 	asc_dvc->ptr_map[srb] = NULL;
2790 	ASC_DBG(3, "Returning ptr %p from array offset %d\n", ptr, srb);
2791 	return ptr;
2792 }
2793 
2794 /*
2795  * advansys_info()
2796  *
2797  * Return suitable for printing on the console with the argument
2798  * adapter's configuration information.
2799  *
2800  * Note: The information line should not exceed ASC_INFO_SIZE bytes,
2801  * otherwise the static 'info' array will be overrun.
2802  */
2803 static const char *advansys_info(struct Scsi_Host *shost)
2804 {
2805 	static char info[ASC_INFO_SIZE];
2806 	struct asc_board *boardp = shost_priv(shost);
2807 	ASC_DVC_VAR *asc_dvc_varp;
2808 	ADV_DVC_VAR *adv_dvc_varp;
2809 	char *busname;
2810 	char *widename = NULL;
2811 
2812 	if (ASC_NARROW_BOARD(boardp)) {
2813 		asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
2814 		ASC_DBG(1, "begin\n");
2815 		if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
2816 			if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) ==
2817 			    ASC_IS_ISAPNP) {
2818 				busname = "ISA PnP";
2819 			} else {
2820 				busname = "ISA";
2821 			}
2822 			sprintf(info,
2823 				"AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
2824 				ASC_VERSION, busname,
2825 				(ulong)shost->io_port,
2826 				(ulong)shost->io_port + ASC_IOADR_GAP - 1,
2827 				boardp->irq, shost->dma_channel);
2828 		} else {
2829 			if (asc_dvc_varp->bus_type & ASC_IS_VL) {
2830 				busname = "VL";
2831 			} else if (asc_dvc_varp->bus_type & ASC_IS_EISA) {
2832 				busname = "EISA";
2833 			} else if (asc_dvc_varp->bus_type & ASC_IS_PCI) {
2834 				if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA)
2835 				    == ASC_IS_PCI_ULTRA) {
2836 					busname = "PCI Ultra";
2837 				} else {
2838 					busname = "PCI";
2839 				}
2840 			} else {
2841 				busname = "?";
2842 				shost_printk(KERN_ERR, shost, "unknown bus "
2843 					"type %d\n", asc_dvc_varp->bus_type);
2844 			}
2845 			sprintf(info,
2846 				"AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
2847 				ASC_VERSION, busname, (ulong)shost->io_port,
2848 				(ulong)shost->io_port + ASC_IOADR_GAP - 1,
2849 				boardp->irq);
2850 		}
2851 	} else {
2852 		/*
2853 		 * Wide Adapter Information
2854 		 *
2855 		 * Memory-mapped I/O is used instead of I/O space to access
2856 		 * the adapter, but display the I/O Port range. The Memory
2857 		 * I/O address is displayed through the driver /proc file.
2858 		 */
2859 		adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
2860 		if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
2861 			widename = "Ultra-Wide";
2862 		} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
2863 			widename = "Ultra2-Wide";
2864 		} else {
2865 			widename = "Ultra3-Wide";
2866 		}
2867 		sprintf(info,
2868 			"AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
2869 			ASC_VERSION, widename, (ulong)adv_dvc_varp->iop_base,
2870 			(ulong)adv_dvc_varp->iop_base + boardp->asc_n_io_port - 1, boardp->irq);
2871 	}
2872 	BUG_ON(strlen(info) >= ASC_INFO_SIZE);
2873 	ASC_DBG(1, "end\n");
2874 	return info;
2875 }
2876 
2877 #ifdef CONFIG_PROC_FS
2878 /*
2879  * asc_prt_line()
2880  *
2881  * If 'cp' is NULL print to the console, otherwise print to a buffer.
2882  *
2883  * Return 0 if printing to the console, otherwise return the number of
2884  * bytes written to the buffer.
2885  *
2886  * Note: If any single line is greater than ASC_PRTLINE_SIZE bytes the stack
2887  * will be corrupted. 's[]' is defined to be ASC_PRTLINE_SIZE bytes.
2888  */
2889 static int asc_prt_line(char *buf, int buflen, char *fmt, ...)
2890 {
2891 	va_list args;
2892 	int ret;
2893 	char s[ASC_PRTLINE_SIZE];
2894 
2895 	va_start(args, fmt);
2896 	ret = vsprintf(s, fmt, args);
2897 	BUG_ON(ret >= ASC_PRTLINE_SIZE);
2898 	if (buf == NULL) {
2899 		(void)printk(s);
2900 		ret = 0;
2901 	} else {
2902 		ret = min(buflen, ret);
2903 		memcpy(buf, s, ret);
2904 	}
2905 	va_end(args);
2906 	return ret;
2907 }
2908 
2909 /*
2910  * asc_prt_board_devices()
2911  *
2912  * Print driver information for devices attached to the board.
2913  *
2914  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
2915  * cf. asc_prt_line().
2916  *
2917  * Return the number of characters copied into 'cp'. No more than
2918  * 'cplen' characters will be copied to 'cp'.
2919  */
2920 static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
2921 {
2922 	struct asc_board *boardp = shost_priv(shost);
2923 	int leftlen;
2924 	int totlen;
2925 	int len;
2926 	int chip_scsi_id;
2927 	int i;
2928 
2929 	leftlen = cplen;
2930 	totlen = len = 0;
2931 
2932 	len = asc_prt_line(cp, leftlen,
2933 			   "\nDevice Information for AdvanSys SCSI Host %d:\n",
2934 			   shost->host_no);
2935 	ASC_PRT_NEXT();
2936 
2937 	if (ASC_NARROW_BOARD(boardp)) {
2938 		chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
2939 	} else {
2940 		chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
2941 	}
2942 
2943 	len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
2944 	ASC_PRT_NEXT();
2945 	for (i = 0; i <= ADV_MAX_TID; i++) {
2946 		if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
2947 			len = asc_prt_line(cp, leftlen, " %X,", i);
2948 			ASC_PRT_NEXT();
2949 		}
2950 	}
2951 	len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id);
2952 	ASC_PRT_NEXT();
2953 
2954 	return totlen;
2955 }
2956 
2957 /*
2958  * Display Wide Board BIOS Information.
2959  */
2960 static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
2961 {
2962 	struct asc_board *boardp = shost_priv(shost);
2963 	int leftlen;
2964 	int totlen;
2965 	int len;
2966 	ushort major, minor, letter;
2967 
2968 	leftlen = cplen;
2969 	totlen = len = 0;
2970 
2971 	len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
2972 	ASC_PRT_NEXT();
2973 
2974 	/*
2975 	 * If the BIOS saved a valid signature, then fill in
2976 	 * the BIOS code segment base address.
2977 	 */
2978 	if (boardp->bios_signature != 0x55AA) {
2979 		len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n");
2980 		ASC_PRT_NEXT();
2981 		len = asc_prt_line(cp, leftlen,
2982 				   "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
2983 		ASC_PRT_NEXT();
2984 		len = asc_prt_line(cp, leftlen,
2985 				   "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
2986 		ASC_PRT_NEXT();
2987 	} else {
2988 		major = (boardp->bios_version >> 12) & 0xF;
2989 		minor = (boardp->bios_version >> 8) & 0xF;
2990 		letter = (boardp->bios_version & 0xFF);
2991 
2992 		len = asc_prt_line(cp, leftlen, "%d.%d%c\n",
2993 				   major, minor,
2994 				   letter >= 26 ? '?' : letter + 'A');
2995 		ASC_PRT_NEXT();
2996 
2997 		/*
2998 		 * Current available ROM BIOS release is 3.1I for UW
2999 		 * and 3.2I for U2W. This code doesn't differentiate
3000 		 * UW and U2W boards.
3001 		 */
3002 		if (major < 3 || (major <= 3 && minor < 1) ||
3003 		    (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) {
3004 			len = asc_prt_line(cp, leftlen,
3005 					   "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
3006 			ASC_PRT_NEXT();
3007 			len = asc_prt_line(cp, leftlen,
3008 					   "ftp://ftp.connectcom.net/pub\n");
3009 			ASC_PRT_NEXT();
3010 		}
3011 	}
3012 
3013 	return totlen;
3014 }
3015 
3016 /*
3017  * Add serial number to information bar if signature AAh
3018  * is found in at bit 15-9 (7 bits) of word 1.
3019  *
3020  * Serial Number consists fo 12 alpha-numeric digits.
3021  *
3022  *       1 - Product type (A,B,C,D..)  Word0: 15-13 (3 bits)
3023  *       2 - MFG Location (A,B,C,D..)  Word0: 12-10 (3 bits)
3024  *     3-4 - Product ID (0-99)         Word0: 9-0 (10 bits)
3025  *       5 - Product revision (A-J)    Word0:  "         "
3026  *
3027  *           Signature                 Word1: 15-9 (7 bits)
3028  *       6 - Year (0-9)                Word1: 8-6 (3 bits) & Word2: 15 (1 bit)
3029  *     7-8 - Week of the year (1-52)   Word1: 5-0 (6 bits)
3030  *
3031  *    9-12 - Serial Number (A001-Z999) Word2: 14-0 (15 bits)
3032  *
3033  * Note 1: Only production cards will have a serial number.
3034  *
3035  * Note 2: Signature is most significant 7 bits (0xFE).
3036  *
3037  * Returns ASC_TRUE if serial number found, otherwise returns ASC_FALSE.
3038  */
3039 static int asc_get_eeprom_string(ushort *serialnum, uchar *cp)
3040 {
3041 	ushort w, num;
3042 
3043 	if ((serialnum[1] & 0xFE00) != ((ushort)0xAA << 8)) {
3044 		return ASC_FALSE;
3045 	} else {
3046 		/*
3047 		 * First word - 6 digits.
3048 		 */
3049 		w = serialnum[0];
3050 
3051 		/* Product type - 1st digit. */
3052 		if ((*cp = 'A' + ((w & 0xE000) >> 13)) == 'H') {
3053 			/* Product type is P=Prototype */
3054 			*cp += 0x8;
3055 		}
3056 		cp++;
3057 
3058 		/* Manufacturing location - 2nd digit. */
3059 		*cp++ = 'A' + ((w & 0x1C00) >> 10);
3060 
3061 		/* Product ID - 3rd, 4th digits. */
3062 		num = w & 0x3FF;
3063 		*cp++ = '0' + (num / 100);
3064 		num %= 100;
3065 		*cp++ = '0' + (num / 10);
3066 
3067 		/* Product revision - 5th digit. */
3068 		*cp++ = 'A' + (num % 10);
3069 
3070 		/*
3071 		 * Second word
3072 		 */
3073 		w = serialnum[1];
3074 
3075 		/*
3076 		 * Year - 6th digit.
3077 		 *
3078 		 * If bit 15 of third word is set, then the
3079 		 * last digit of the year is greater than 7.
3080 		 */
3081 		if (serialnum[2] & 0x8000) {
3082 			*cp++ = '8' + ((w & 0x1C0) >> 6);
3083 		} else {
3084 			*cp++ = '0' + ((w & 0x1C0) >> 6);
3085 		}
3086 
3087 		/* Week of year - 7th, 8th digits. */
3088 		num = w & 0x003F;
3089 		*cp++ = '0' + num / 10;
3090 		num %= 10;
3091 		*cp++ = '0' + num;
3092 
3093 		/*
3094 		 * Third word
3095 		 */
3096 		w = serialnum[2] & 0x7FFF;
3097 
3098 		/* Serial number - 9th digit. */
3099 		*cp++ = 'A' + (w / 1000);
3100 
3101 		/* 10th, 11th, 12th digits. */
3102 		num = w % 1000;
3103 		*cp++ = '0' + num / 100;
3104 		num %= 100;
3105 		*cp++ = '0' + num / 10;
3106 		num %= 10;
3107 		*cp++ = '0' + num;
3108 
3109 		*cp = '\0';	/* Null Terminate the string. */
3110 		return ASC_TRUE;
3111 	}
3112 }
3113 
3114 /*
3115  * asc_prt_asc_board_eeprom()
3116  *
3117  * Print board EEPROM configuration.
3118  *
3119  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3120  * cf. asc_prt_line().
3121  *
3122  * Return the number of characters copied into 'cp'. No more than
3123  * 'cplen' characters will be copied to 'cp'.
3124  */
3125 static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
3126 {
3127 	struct asc_board *boardp = shost_priv(shost);
3128 	ASC_DVC_VAR *asc_dvc_varp;
3129 	int leftlen;
3130 	int totlen;
3131 	int len;
3132 	ASCEEP_CONFIG *ep;
3133 	int i;
3134 #ifdef CONFIG_ISA
3135 	int isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 };
3136 #endif /* CONFIG_ISA */
3137 	uchar serialstr[13];
3138 
3139 	asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
3140 	ep = &boardp->eep_config.asc_eep;
3141 
3142 	leftlen = cplen;
3143 	totlen = len = 0;
3144 
3145 	len = asc_prt_line(cp, leftlen,
3146 			   "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3147 			   shost->host_no);
3148 	ASC_PRT_NEXT();
3149 
3150 	if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr)
3151 	    == ASC_TRUE) {
3152 		len =
3153 		    asc_prt_line(cp, leftlen, " Serial Number: %s\n",
3154 				 serialstr);
3155 		ASC_PRT_NEXT();
3156 	} else {
3157 		if (ep->adapter_info[5] == 0xBB) {
3158 			len = asc_prt_line(cp, leftlen,
3159 					   " Default Settings Used for EEPROM-less Adapter.\n");
3160 			ASC_PRT_NEXT();
3161 		} else {
3162 			len = asc_prt_line(cp, leftlen,
3163 					   " Serial Number Signature Not Present.\n");
3164 			ASC_PRT_NEXT();
3165 		}
3166 	}
3167 
3168 	len = asc_prt_line(cp, leftlen,
3169 			   " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3170 			   ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
3171 			   ep->max_tag_qng);
3172 	ASC_PRT_NEXT();
3173 
3174 	len = asc_prt_line(cp, leftlen,
3175 			   " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
3176 	ASC_PRT_NEXT();
3177 
3178 	len = asc_prt_line(cp, leftlen, " Target ID:           ");
3179 	ASC_PRT_NEXT();
3180 	for (i = 0; i <= ASC_MAX_TID; i++) {
3181 		len = asc_prt_line(cp, leftlen, " %d", i);
3182 		ASC_PRT_NEXT();
3183 	}
3184 	len = asc_prt_line(cp, leftlen, "\n");
3185 	ASC_PRT_NEXT();
3186 
3187 	len = asc_prt_line(cp, leftlen, " Disconnects:         ");
3188 	ASC_PRT_NEXT();
3189 	for (i = 0; i <= ASC_MAX_TID; i++) {
3190 		len = asc_prt_line(cp, leftlen, " %c",
3191 				   (ep->
3192 				    disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3193 				   'N');
3194 		ASC_PRT_NEXT();
3195 	}
3196 	len = asc_prt_line(cp, leftlen, "\n");
3197 	ASC_PRT_NEXT();
3198 
3199 	len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
3200 	ASC_PRT_NEXT();
3201 	for (i = 0; i <= ASC_MAX_TID; i++) {
3202 		len = asc_prt_line(cp, leftlen, " %c",
3203 				   (ep->
3204 				    use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3205 				   'N');
3206 		ASC_PRT_NEXT();
3207 	}
3208 	len = asc_prt_line(cp, leftlen, "\n");
3209 	ASC_PRT_NEXT();
3210 
3211 	len = asc_prt_line(cp, leftlen, " Start Motor:         ");
3212 	ASC_PRT_NEXT();
3213 	for (i = 0; i <= ASC_MAX_TID; i++) {
3214 		len = asc_prt_line(cp, leftlen, " %c",
3215 				   (ep->
3216 				    start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3217 				   'N');
3218 		ASC_PRT_NEXT();
3219 	}
3220 	len = asc_prt_line(cp, leftlen, "\n");
3221 	ASC_PRT_NEXT();
3222 
3223 	len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3224 	ASC_PRT_NEXT();
3225 	for (i = 0; i <= ASC_MAX_TID; i++) {
3226 		len = asc_prt_line(cp, leftlen, " %c",
3227 				   (ep->
3228 				    init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3229 				   'N');
3230 		ASC_PRT_NEXT();
3231 	}
3232 	len = asc_prt_line(cp, leftlen, "\n");
3233 	ASC_PRT_NEXT();
3234 
3235 #ifdef CONFIG_ISA
3236 	if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
3237 		len = asc_prt_line(cp, leftlen,
3238 				   " Host ISA DMA speed:   %d MB/S\n",
3239 				   isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
3240 		ASC_PRT_NEXT();
3241 	}
3242 #endif /* CONFIG_ISA */
3243 
3244 	return totlen;
3245 }
3246 
3247 /*
3248  * asc_prt_adv_board_eeprom()
3249  *
3250  * Print board EEPROM configuration.
3251  *
3252  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3253  * cf. asc_prt_line().
3254  *
3255  * Return the number of characters copied into 'cp'. No more than
3256  * 'cplen' characters will be copied to 'cp'.
3257  */
3258 static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
3259 {
3260 	struct asc_board *boardp = shost_priv(shost);
3261 	ADV_DVC_VAR *adv_dvc_varp;
3262 	int leftlen;
3263 	int totlen;
3264 	int len;
3265 	int i;
3266 	char *termstr;
3267 	uchar serialstr[13];
3268 	ADVEEP_3550_CONFIG *ep_3550 = NULL;
3269 	ADVEEP_38C0800_CONFIG *ep_38C0800 = NULL;
3270 	ADVEEP_38C1600_CONFIG *ep_38C1600 = NULL;
3271 	ushort word;
3272 	ushort *wordp;
3273 	ushort sdtr_speed = 0;
3274 
3275 	adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
3276 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3277 		ep_3550 = &boardp->eep_config.adv_3550_eep;
3278 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3279 		ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
3280 	} else {
3281 		ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
3282 	}
3283 
3284 	leftlen = cplen;
3285 	totlen = len = 0;
3286 
3287 	len = asc_prt_line(cp, leftlen,
3288 			   "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3289 			   shost->host_no);
3290 	ASC_PRT_NEXT();
3291 
3292 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3293 		wordp = &ep_3550->serial_number_word1;
3294 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3295 		wordp = &ep_38C0800->serial_number_word1;
3296 	} else {
3297 		wordp = &ep_38C1600->serial_number_word1;
3298 	}
3299 
3300 	if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
3301 		len =
3302 		    asc_prt_line(cp, leftlen, " Serial Number: %s\n",
3303 				 serialstr);
3304 		ASC_PRT_NEXT();
3305 	} else {
3306 		len = asc_prt_line(cp, leftlen,
3307 				   " Serial Number Signature Not Present.\n");
3308 		ASC_PRT_NEXT();
3309 	}
3310 
3311 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3312 		len = asc_prt_line(cp, leftlen,
3313 				   " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3314 				   ep_3550->adapter_scsi_id,
3315 				   ep_3550->max_host_qng, ep_3550->max_dvc_qng);
3316 		ASC_PRT_NEXT();
3317 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3318 		len = asc_prt_line(cp, leftlen,
3319 				   " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3320 				   ep_38C0800->adapter_scsi_id,
3321 				   ep_38C0800->max_host_qng,
3322 				   ep_38C0800->max_dvc_qng);
3323 		ASC_PRT_NEXT();
3324 	} else {
3325 		len = asc_prt_line(cp, leftlen,
3326 				   " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3327 				   ep_38C1600->adapter_scsi_id,
3328 				   ep_38C1600->max_host_qng,
3329 				   ep_38C1600->max_dvc_qng);
3330 		ASC_PRT_NEXT();
3331 	}
3332 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3333 		word = ep_3550->termination;
3334 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3335 		word = ep_38C0800->termination_lvd;
3336 	} else {
3337 		word = ep_38C1600->termination_lvd;
3338 	}
3339 	switch (word) {
3340 	case 1:
3341 		termstr = "Low Off/High Off";
3342 		break;
3343 	case 2:
3344 		termstr = "Low Off/High On";
3345 		break;
3346 	case 3:
3347 		termstr = "Low On/High On";
3348 		break;
3349 	default:
3350 	case 0:
3351 		termstr = "Automatic";
3352 		break;
3353 	}
3354 
3355 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3356 		len = asc_prt_line(cp, leftlen,
3357 				   " termination: %u (%s), bios_ctrl: 0x%x\n",
3358 				   ep_3550->termination, termstr,
3359 				   ep_3550->bios_ctrl);
3360 		ASC_PRT_NEXT();
3361 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3362 		len = asc_prt_line(cp, leftlen,
3363 				   " termination: %u (%s), bios_ctrl: 0x%x\n",
3364 				   ep_38C0800->termination_lvd, termstr,
3365 				   ep_38C0800->bios_ctrl);
3366 		ASC_PRT_NEXT();
3367 	} else {
3368 		len = asc_prt_line(cp, leftlen,
3369 				   " termination: %u (%s), bios_ctrl: 0x%x\n",
3370 				   ep_38C1600->termination_lvd, termstr,
3371 				   ep_38C1600->bios_ctrl);
3372 		ASC_PRT_NEXT();
3373 	}
3374 
3375 	len = asc_prt_line(cp, leftlen, " Target ID:           ");
3376 	ASC_PRT_NEXT();
3377 	for (i = 0; i <= ADV_MAX_TID; i++) {
3378 		len = asc_prt_line(cp, leftlen, " %X", i);
3379 		ASC_PRT_NEXT();
3380 	}
3381 	len = asc_prt_line(cp, leftlen, "\n");
3382 	ASC_PRT_NEXT();
3383 
3384 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3385 		word = ep_3550->disc_enable;
3386 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3387 		word = ep_38C0800->disc_enable;
3388 	} else {
3389 		word = ep_38C1600->disc_enable;
3390 	}
3391 	len = asc_prt_line(cp, leftlen, " Disconnects:         ");
3392 	ASC_PRT_NEXT();
3393 	for (i = 0; i <= ADV_MAX_TID; i++) {
3394 		len = asc_prt_line(cp, leftlen, " %c",
3395 				   (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3396 		ASC_PRT_NEXT();
3397 	}
3398 	len = asc_prt_line(cp, leftlen, "\n");
3399 	ASC_PRT_NEXT();
3400 
3401 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3402 		word = ep_3550->tagqng_able;
3403 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3404 		word = ep_38C0800->tagqng_able;
3405 	} else {
3406 		word = ep_38C1600->tagqng_able;
3407 	}
3408 	len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
3409 	ASC_PRT_NEXT();
3410 	for (i = 0; i <= ADV_MAX_TID; i++) {
3411 		len = asc_prt_line(cp, leftlen, " %c",
3412 				   (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3413 		ASC_PRT_NEXT();
3414 	}
3415 	len = asc_prt_line(cp, leftlen, "\n");
3416 	ASC_PRT_NEXT();
3417 
3418 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3419 		word = ep_3550->start_motor;
3420 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3421 		word = ep_38C0800->start_motor;
3422 	} else {
3423 		word = ep_38C1600->start_motor;
3424 	}
3425 	len = asc_prt_line(cp, leftlen, " Start Motor:         ");
3426 	ASC_PRT_NEXT();
3427 	for (i = 0; i <= ADV_MAX_TID; i++) {
3428 		len = asc_prt_line(cp, leftlen, " %c",
3429 				   (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3430 		ASC_PRT_NEXT();
3431 	}
3432 	len = asc_prt_line(cp, leftlen, "\n");
3433 	ASC_PRT_NEXT();
3434 
3435 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3436 		len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3437 		ASC_PRT_NEXT();
3438 		for (i = 0; i <= ADV_MAX_TID; i++) {
3439 			len = asc_prt_line(cp, leftlen, " %c",
3440 					   (ep_3550->
3441 					    sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
3442 					   'Y' : 'N');
3443 			ASC_PRT_NEXT();
3444 		}
3445 		len = asc_prt_line(cp, leftlen, "\n");
3446 		ASC_PRT_NEXT();
3447 	}
3448 
3449 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3450 		len = asc_prt_line(cp, leftlen, " Ultra Transfer:      ");
3451 		ASC_PRT_NEXT();
3452 		for (i = 0; i <= ADV_MAX_TID; i++) {
3453 			len = asc_prt_line(cp, leftlen, " %c",
3454 					   (ep_3550->
3455 					    ultra_able & ADV_TID_TO_TIDMASK(i))
3456 					   ? 'Y' : 'N');
3457 			ASC_PRT_NEXT();
3458 		}
3459 		len = asc_prt_line(cp, leftlen, "\n");
3460 		ASC_PRT_NEXT();
3461 	}
3462 
3463 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3464 		word = ep_3550->wdtr_able;
3465 	} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3466 		word = ep_38C0800->wdtr_able;
3467 	} else {
3468 		word = ep_38C1600->wdtr_able;
3469 	}
3470 	len = asc_prt_line(cp, leftlen, " Wide Transfer:       ");
3471 	ASC_PRT_NEXT();
3472 	for (i = 0; i <= ADV_MAX_TID; i++) {
3473 		len = asc_prt_line(cp, leftlen, " %c",
3474 				   (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3475 		ASC_PRT_NEXT();
3476 	}
3477 	len = asc_prt_line(cp, leftlen, "\n");
3478 	ASC_PRT_NEXT();
3479 
3480 	if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
3481 	    adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) {
3482 		len = asc_prt_line(cp, leftlen,
3483 				   " Synchronous Transfer Speed (Mhz):\n  ");
3484 		ASC_PRT_NEXT();
3485 		for (i = 0; i <= ADV_MAX_TID; i++) {
3486 			char *speed_str;
3487 
3488 			if (i == 0) {
3489 				sdtr_speed = adv_dvc_varp->sdtr_speed1;
3490 			} else if (i == 4) {
3491 				sdtr_speed = adv_dvc_varp->sdtr_speed2;
3492 			} else if (i == 8) {
3493 				sdtr_speed = adv_dvc_varp->sdtr_speed3;
3494 			} else if (i == 12) {
3495 				sdtr_speed = adv_dvc_varp->sdtr_speed4;
3496 			}
3497 			switch (sdtr_speed & ADV_MAX_TID) {
3498 			case 0:
3499 				speed_str = "Off";
3500 				break;
3501 			case 1:
3502 				speed_str = "  5";
3503 				break;
3504 			case 2:
3505 				speed_str = " 10";
3506 				break;
3507 			case 3:
3508 				speed_str = " 20";
3509 				break;
3510 			case 4:
3511 				speed_str = " 40";
3512 				break;
3513 			case 5:
3514 				speed_str = " 80";
3515 				break;
3516 			default:
3517 				speed_str = "Unk";
3518 				break;
3519 			}
3520 			len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
3521 			ASC_PRT_NEXT();
3522 			if (i == 7) {
3523 				len = asc_prt_line(cp, leftlen, "\n  ");
3524 				ASC_PRT_NEXT();
3525 			}
3526 			sdtr_speed >>= 4;
3527 		}
3528 		len = asc_prt_line(cp, leftlen, "\n");
3529 		ASC_PRT_NEXT();
3530 	}
3531 
3532 	return totlen;
3533 }
3534 
3535 /*
3536  * asc_prt_driver_conf()
3537  *
3538  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3539  * cf. asc_prt_line().
3540  *
3541  * Return the number of characters copied into 'cp'. No more than
3542  * 'cplen' characters will be copied to 'cp'.
3543  */
3544 static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen)
3545 {
3546 	struct asc_board *boardp = shost_priv(shost);
3547 	int leftlen;
3548 	int totlen;
3549 	int len;
3550 	int chip_scsi_id;
3551 
3552 	leftlen = cplen;
3553 	totlen = len = 0;
3554 
3555 	len = asc_prt_line(cp, leftlen,
3556 			   "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
3557 			   shost->host_no);
3558 	ASC_PRT_NEXT();
3559 
3560 	len = asc_prt_line(cp, leftlen,
3561 			   " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
3562 			   shost->host_busy, shost->last_reset, shost->max_id,
3563 			   shost->max_lun, shost->max_channel);
3564 	ASC_PRT_NEXT();
3565 
3566 	len = asc_prt_line(cp, leftlen,
3567 			   " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
3568 			   shost->unique_id, shost->can_queue, shost->this_id,
3569 			   shost->sg_tablesize, shost->cmd_per_lun);
3570 	ASC_PRT_NEXT();
3571 
3572 	len = asc_prt_line(cp, leftlen,
3573 			   " unchecked_isa_dma %d, use_clustering %d\n",
3574 			   shost->unchecked_isa_dma, shost->use_clustering);
3575 	ASC_PRT_NEXT();
3576 
3577 	len = asc_prt_line(cp, leftlen,
3578 			   " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
3579 			   boardp->flags, boardp->last_reset, jiffies,
3580 			   boardp->asc_n_io_port);
3581 	ASC_PRT_NEXT();
3582 
3583 	len = asc_prt_line(cp, leftlen, " io_port 0x%x\n", shost->io_port);
3584 	ASC_PRT_NEXT();
3585 
3586 	if (ASC_NARROW_BOARD(boardp)) {
3587 		chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
3588 	} else {
3589 		chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
3590 	}
3591 
3592 	return totlen;
3593 }
3594 
3595 /*
3596  * asc_prt_asc_board_info()
3597  *
3598  * Print dynamic board configuration information.
3599  *
3600  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3601  * cf. asc_prt_line().
3602  *
3603  * Return the number of characters copied into 'cp'. No more than
3604  * 'cplen' characters will be copied to 'cp'.
3605  */
3606 static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3607 {
3608 	struct asc_board *boardp = shost_priv(shost);
3609 	int chip_scsi_id;
3610 	int leftlen;
3611 	int totlen;
3612 	int len;
3613 	ASC_DVC_VAR *v;
3614 	ASC_DVC_CFG *c;
3615 	int i;
3616 	int renegotiate = 0;
3617 
3618 	v = &boardp->dvc_var.asc_dvc_var;
3619 	c = &boardp->dvc_cfg.asc_dvc_cfg;
3620 	chip_scsi_id = c->chip_scsi_id;
3621 
3622 	leftlen = cplen;
3623 	totlen = len = 0;
3624 
3625 	len = asc_prt_line(cp, leftlen,
3626 			   "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3627 			   shost->host_no);
3628 	ASC_PRT_NEXT();
3629 
3630 	len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
3631 			   "mcode_version 0x%x, err_code %u\n",
3632 			   c->chip_version, c->mcode_date, c->mcode_version,
3633 			   v->err_code);
3634 	ASC_PRT_NEXT();
3635 
3636 	/* Current number of commands waiting for the host. */
3637 	len = asc_prt_line(cp, leftlen,
3638 			   " Total Command Pending: %d\n", v->cur_total_qng);
3639 	ASC_PRT_NEXT();
3640 
3641 	len = asc_prt_line(cp, leftlen, " Command Queuing:");
3642 	ASC_PRT_NEXT();
3643 	for (i = 0; i <= ASC_MAX_TID; i++) {
3644 		if ((chip_scsi_id == i) ||
3645 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3646 			continue;
3647 		}
3648 		len = asc_prt_line(cp, leftlen, " %X:%c",
3649 				   i,
3650 				   (v->
3651 				    use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ?
3652 				   'Y' : 'N');
3653 		ASC_PRT_NEXT();
3654 	}
3655 	len = asc_prt_line(cp, leftlen, "\n");
3656 	ASC_PRT_NEXT();
3657 
3658 	/* Current number of commands waiting for a device. */
3659 	len = asc_prt_line(cp, leftlen, " Command Queue Pending:");
3660 	ASC_PRT_NEXT();
3661 	for (i = 0; i <= ASC_MAX_TID; i++) {
3662 		if ((chip_scsi_id == i) ||
3663 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3664 			continue;
3665 		}
3666 		len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
3667 		ASC_PRT_NEXT();
3668 	}
3669 	len = asc_prt_line(cp, leftlen, "\n");
3670 	ASC_PRT_NEXT();
3671 
3672 	/* Current limit on number of commands that can be sent to a device. */
3673 	len = asc_prt_line(cp, leftlen, " Command Queue Limit:");
3674 	ASC_PRT_NEXT();
3675 	for (i = 0; i <= ASC_MAX_TID; i++) {
3676 		if ((chip_scsi_id == i) ||
3677 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3678 			continue;
3679 		}
3680 		len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
3681 		ASC_PRT_NEXT();
3682 	}
3683 	len = asc_prt_line(cp, leftlen, "\n");
3684 	ASC_PRT_NEXT();
3685 
3686 	/* Indicate whether the device has returned queue full status. */
3687 	len = asc_prt_line(cp, leftlen, " Command Queue Full:");
3688 	ASC_PRT_NEXT();
3689 	for (i = 0; i <= ASC_MAX_TID; i++) {
3690 		if ((chip_scsi_id == i) ||
3691 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3692 			continue;
3693 		}
3694 		if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
3695 			len = asc_prt_line(cp, leftlen, " %X:Y-%d",
3696 					   i, boardp->queue_full_cnt[i]);
3697 		} else {
3698 			len = asc_prt_line(cp, leftlen, " %X:N", i);
3699 		}
3700 		ASC_PRT_NEXT();
3701 	}
3702 	len = asc_prt_line(cp, leftlen, "\n");
3703 	ASC_PRT_NEXT();
3704 
3705 	len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3706 	ASC_PRT_NEXT();
3707 	for (i = 0; i <= ASC_MAX_TID; i++) {
3708 		if ((chip_scsi_id == i) ||
3709 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3710 			continue;
3711 		}
3712 		len = asc_prt_line(cp, leftlen, " %X:%c",
3713 				   i,
3714 				   (v->
3715 				    sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3716 				   'N');
3717 		ASC_PRT_NEXT();
3718 	}
3719 	len = asc_prt_line(cp, leftlen, "\n");
3720 	ASC_PRT_NEXT();
3721 
3722 	for (i = 0; i <= ASC_MAX_TID; i++) {
3723 		uchar syn_period_ix;
3724 
3725 		if ((chip_scsi_id == i) ||
3726 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
3727 		    ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) {
3728 			continue;
3729 		}
3730 
3731 		len = asc_prt_line(cp, leftlen, "  %X:", i);
3732 		ASC_PRT_NEXT();
3733 
3734 		if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) {
3735 			len = asc_prt_line(cp, leftlen, " Asynchronous");
3736 			ASC_PRT_NEXT();
3737 		} else {
3738 			syn_period_ix =
3739 			    (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index -
3740 							   1);
3741 
3742 			len = asc_prt_line(cp, leftlen,
3743 					   " Transfer Period Factor: %d (%d.%d Mhz),",
3744 					   v->sdtr_period_tbl[syn_period_ix],
3745 					   250 /
3746 					   v->sdtr_period_tbl[syn_period_ix],
3747 					   ASC_TENTHS(250,
3748 						      v->
3749 						      sdtr_period_tbl
3750 						      [syn_period_ix]));
3751 			ASC_PRT_NEXT();
3752 
3753 			len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
3754 					   boardp->
3755 					   sdtr_data[i] & ASC_SYN_MAX_OFFSET);
3756 			ASC_PRT_NEXT();
3757 		}
3758 
3759 		if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
3760 			len = asc_prt_line(cp, leftlen, "*\n");
3761 			renegotiate = 1;
3762 		} else {
3763 			len = asc_prt_line(cp, leftlen, "\n");
3764 		}
3765 		ASC_PRT_NEXT();
3766 	}
3767 
3768 	if (renegotiate) {
3769 		len = asc_prt_line(cp, leftlen,
3770 				   " * = Re-negotiation pending before next command.\n");
3771 		ASC_PRT_NEXT();
3772 	}
3773 
3774 	return totlen;
3775 }
3776 
3777 /*
3778  * asc_prt_adv_board_info()
3779  *
3780  * Print dynamic board configuration information.
3781  *
3782  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3783  * cf. asc_prt_line().
3784  *
3785  * Return the number of characters copied into 'cp'. No more than
3786  * 'cplen' characters will be copied to 'cp'.
3787  */
3788 static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3789 {
3790 	struct asc_board *boardp = shost_priv(shost);
3791 	int leftlen;
3792 	int totlen;
3793 	int len;
3794 	int i;
3795 	ADV_DVC_VAR *v;
3796 	ADV_DVC_CFG *c;
3797 	AdvPortAddr iop_base;
3798 	ushort chip_scsi_id;
3799 	ushort lramword;
3800 	uchar lrambyte;
3801 	ushort tagqng_able;
3802 	ushort sdtr_able, wdtr_able;
3803 	ushort wdtr_done, sdtr_done;
3804 	ushort period = 0;
3805 	int renegotiate = 0;
3806 
3807 	v = &boardp->dvc_var.adv_dvc_var;
3808 	c = &boardp->dvc_cfg.adv_dvc_cfg;
3809 	iop_base = v->iop_base;
3810 	chip_scsi_id = v->chip_scsi_id;
3811 
3812 	leftlen = cplen;
3813 	totlen = len = 0;
3814 
3815 	len = asc_prt_line(cp, leftlen,
3816 			   "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3817 			   shost->host_no);
3818 	ASC_PRT_NEXT();
3819 
3820 	len = asc_prt_line(cp, leftlen,
3821 			   " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
3822 			   v->iop_base,
3823 			   AdvReadWordRegister(iop_base,
3824 					       IOPW_SCSI_CFG1) & CABLE_DETECT,
3825 			   v->err_code);
3826 	ASC_PRT_NEXT();
3827 
3828 	len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
3829 			   "mcode_version 0x%x\n", c->chip_version,
3830 			   c->mcode_date, c->mcode_version);
3831 	ASC_PRT_NEXT();
3832 
3833 	AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
3834 	len = asc_prt_line(cp, leftlen, " Queuing Enabled:");
3835 	ASC_PRT_NEXT();
3836 	for (i = 0; i <= ADV_MAX_TID; i++) {
3837 		if ((chip_scsi_id == i) ||
3838 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3839 			continue;
3840 		}
3841 
3842 		len = asc_prt_line(cp, leftlen, " %X:%c",
3843 				   i,
3844 				   (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3845 				   'N');
3846 		ASC_PRT_NEXT();
3847 	}
3848 	len = asc_prt_line(cp, leftlen, "\n");
3849 	ASC_PRT_NEXT();
3850 
3851 	len = asc_prt_line(cp, leftlen, " Queue Limit:");
3852 	ASC_PRT_NEXT();
3853 	for (i = 0; i <= ADV_MAX_TID; i++) {
3854 		if ((chip_scsi_id == i) ||
3855 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3856 			continue;
3857 		}
3858 
3859 		AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i,
3860 				lrambyte);
3861 
3862 		len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
3863 		ASC_PRT_NEXT();
3864 	}
3865 	len = asc_prt_line(cp, leftlen, "\n");
3866 	ASC_PRT_NEXT();
3867 
3868 	len = asc_prt_line(cp, leftlen, " Command Pending:");
3869 	ASC_PRT_NEXT();
3870 	for (i = 0; i <= ADV_MAX_TID; i++) {
3871 		if ((chip_scsi_id == i) ||
3872 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3873 			continue;
3874 		}
3875 
3876 		AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i,
3877 				lrambyte);
3878 
3879 		len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
3880 		ASC_PRT_NEXT();
3881 	}
3882 	len = asc_prt_line(cp, leftlen, "\n");
3883 	ASC_PRT_NEXT();
3884 
3885 	AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
3886 	len = asc_prt_line(cp, leftlen, " Wide Enabled:");
3887 	ASC_PRT_NEXT();
3888 	for (i = 0; i <= ADV_MAX_TID; i++) {
3889 		if ((chip_scsi_id == i) ||
3890 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3891 			continue;
3892 		}
3893 
3894 		len = asc_prt_line(cp, leftlen, " %X:%c",
3895 				   i,
3896 				   (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3897 				   'N');
3898 		ASC_PRT_NEXT();
3899 	}
3900 	len = asc_prt_line(cp, leftlen, "\n");
3901 	ASC_PRT_NEXT();
3902 
3903 	AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
3904 	len = asc_prt_line(cp, leftlen, " Transfer Bit Width:");
3905 	ASC_PRT_NEXT();
3906 	for (i = 0; i <= ADV_MAX_TID; i++) {
3907 		if ((chip_scsi_id == i) ||
3908 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3909 			continue;
3910 		}
3911 
3912 		AdvReadWordLram(iop_base,
3913 				ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
3914 				lramword);
3915 
3916 		len = asc_prt_line(cp, leftlen, " %X:%d",
3917 				   i, (lramword & 0x8000) ? 16 : 8);
3918 		ASC_PRT_NEXT();
3919 
3920 		if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
3921 		    (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
3922 			len = asc_prt_line(cp, leftlen, "*");
3923 			ASC_PRT_NEXT();
3924 			renegotiate = 1;
3925 		}
3926 	}
3927 	len = asc_prt_line(cp, leftlen, "\n");
3928 	ASC_PRT_NEXT();
3929 
3930 	AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
3931 	len = asc_prt_line(cp, leftlen, " Synchronous Enabled:");
3932 	ASC_PRT_NEXT();
3933 	for (i = 0; i <= ADV_MAX_TID; i++) {
3934 		if ((chip_scsi_id == i) ||
3935 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3936 			continue;
3937 		}
3938 
3939 		len = asc_prt_line(cp, leftlen, " %X:%c",
3940 				   i,
3941 				   (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3942 				   'N');
3943 		ASC_PRT_NEXT();
3944 	}
3945 	len = asc_prt_line(cp, leftlen, "\n");
3946 	ASC_PRT_NEXT();
3947 
3948 	AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
3949 	for (i = 0; i <= ADV_MAX_TID; i++) {
3950 
3951 		AdvReadWordLram(iop_base,
3952 				ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
3953 				lramword);
3954 		lramword &= ~0x8000;
3955 
3956 		if ((chip_scsi_id == i) ||
3957 		    ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
3958 		    ((sdtr_able & ADV_TID_TO_TIDMASK(i)) == 0)) {
3959 			continue;
3960 		}
3961 
3962 		len = asc_prt_line(cp, leftlen, "  %X:", i);
3963 		ASC_PRT_NEXT();
3964 
3965 		if ((lramword & 0x1F) == 0) {	/* Check for REQ/ACK Offset 0. */
3966 			len = asc_prt_line(cp, leftlen, " Asynchronous");
3967 			ASC_PRT_NEXT();
3968 		} else {
3969 			len =
3970 			    asc_prt_line(cp, leftlen,
3971 					 " Transfer Period Factor: ");
3972 			ASC_PRT_NEXT();
3973 
3974 			if ((lramword & 0x1F00) == 0x1100) {	/* 80 Mhz */
3975 				len =
3976 				    asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
3977 				ASC_PRT_NEXT();
3978 			} else if ((lramword & 0x1F00) == 0x1000) {	/* 40 Mhz */
3979 				len =
3980 				    asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
3981 				ASC_PRT_NEXT();
3982 			} else {	/* 20 Mhz or below. */
3983 
3984 				period = (((lramword >> 8) * 25) + 50) / 4;
3985 
3986 				if (period == 0) {	/* Should never happen. */
3987 					len =
3988 					    asc_prt_line(cp, leftlen,
3989 							 "%d (? Mhz), ");
3990 					ASC_PRT_NEXT();
3991 				} else {
3992 					len = asc_prt_line(cp, leftlen,
3993 							   "%d (%d.%d Mhz),",
3994 							   period, 250 / period,
3995 							   ASC_TENTHS(250,
3996 								      period));
3997 					ASC_PRT_NEXT();
3998 				}
3999 			}
4000 
4001 			len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
4002 					   lramword & 0x1F);
4003 			ASC_PRT_NEXT();
4004 		}
4005 
4006 		if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
4007 			len = asc_prt_line(cp, leftlen, "*\n");
4008 			renegotiate = 1;
4009 		} else {
4010 			len = asc_prt_line(cp, leftlen, "\n");
4011 		}
4012 		ASC_PRT_NEXT();
4013 	}
4014 
4015 	if (renegotiate) {
4016 		len = asc_prt_line(cp, leftlen,
4017 				   " * = Re-negotiation pending before next command.\n");
4018 		ASC_PRT_NEXT();
4019 	}
4020 
4021 	return totlen;
4022 }
4023 
4024 /*
4025  * asc_proc_copy()
4026  *
4027  * Copy proc information to a read buffer taking into account the current
4028  * read offset in the file and the remaining space in the read buffer.
4029  */
4030 static int
4031 asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
4032 	      char *cp, int cplen)
4033 {
4034 	int cnt = 0;
4035 
4036 	ASC_DBG(2, "offset %d, advoffset %d, cplen %d\n",
4037 		 (unsigned)offset, (unsigned)advoffset, cplen);
4038 	if (offset <= advoffset) {
4039 		/* Read offset below current offset, copy everything. */
4040 		cnt = min(cplen, leftlen);
4041 		ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
4042 			 (ulong)curbuf, (ulong)cp, cnt);
4043 		memcpy(curbuf, cp, cnt);
4044 	} else if (offset < advoffset + cplen) {
4045 		/* Read offset within current range, partial copy. */
4046 		cnt = (advoffset + cplen) - offset;
4047 		cp = (cp + cplen) - cnt;
4048 		cnt = min(cnt, leftlen);
4049 		ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
4050 			 (ulong)curbuf, (ulong)cp, cnt);
4051 		memcpy(curbuf, cp, cnt);
4052 	}
4053 	return cnt;
4054 }
4055 
4056 #ifdef ADVANSYS_STATS
4057 /*
4058  * asc_prt_board_stats()
4059  *
4060  * Note: no single line should be greater than ASC_PRTLINE_SIZE,
4061  * cf. asc_prt_line().
4062  *
4063  * Return the number of characters copied into 'cp'. No more than
4064  * 'cplen' characters will be copied to 'cp'.
4065  */
4066 static int asc_prt_board_stats(struct Scsi_Host *shost, char *cp, int cplen)
4067 {
4068 	struct asc_board *boardp = shost_priv(shost);
4069 	struct asc_stats *s = &boardp->asc_stats;
4070 
4071 	int leftlen = cplen;
4072 	int len, totlen = 0;
4073 
4074 	len = asc_prt_line(cp, leftlen,
4075 			   "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
4076 			   shost->host_no);
4077 	ASC_PRT_NEXT();
4078 
4079 	len = asc_prt_line(cp, leftlen,
4080 			   " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
4081 			   s->queuecommand, s->reset, s->biosparam,
4082 			   s->interrupt);
4083 	ASC_PRT_NEXT();
4084 
4085 	len = asc_prt_line(cp, leftlen,
4086 			   " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
4087 			   s->callback, s->done, s->build_error,
4088 			   s->adv_build_noreq, s->adv_build_nosg);
4089 	ASC_PRT_NEXT();
4090 
4091 	len = asc_prt_line(cp, leftlen,
4092 			   " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
4093 			   s->exe_noerror, s->exe_busy, s->exe_error,
4094 			   s->exe_unknown);
4095 	ASC_PRT_NEXT();
4096 
4097 	/*
4098 	 * Display data transfer statistics.
4099 	 */
4100 	if (s->xfer_cnt > 0) {
4101 		len = asc_prt_line(cp, leftlen, " xfer_cnt %lu, xfer_elem %lu, ",
4102 				   s->xfer_cnt, s->xfer_elem);
4103 		ASC_PRT_NEXT();
4104 
4105 		len = asc_prt_line(cp, leftlen, "xfer_bytes %lu.%01lu kb\n",
4106 				   s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2));
4107 		ASC_PRT_NEXT();
4108 
4109 		/* Scatter gather transfer statistics */
4110 		len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ",
4111 				   s->xfer_elem / s->xfer_cnt,
4112 				   ASC_TENTHS(s->xfer_elem, s->xfer_cnt));
4113 		ASC_PRT_NEXT();
4114 
4115 		len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ",
4116 				   (s->xfer_sect / 2) / s->xfer_elem,
4117 				   ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem));
4118 		ASC_PRT_NEXT();
4119 
4120 		len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n",
4121 				   (s->xfer_sect / 2) / s->xfer_cnt,
4122 				   ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt));
4123 		ASC_PRT_NEXT();
4124 	}
4125 
4126 	return totlen;
4127 }
4128 #endif /* ADVANSYS_STATS */
4129 
4130 /*
4131  * advansys_proc_info() - /proc/scsi/advansys/{0,1,2,3,...}
4132  *
4133  * *buffer: I/O buffer
4134  * **start: if inout == FALSE pointer into buffer where user read should start
4135  * offset: current offset into a /proc/scsi/advansys/[0...] file
4136  * length: length of buffer
4137  * hostno: Scsi_Host host_no
4138  * inout: TRUE - user is writing; FALSE - user is reading
4139  *
4140  * Return the number of bytes read from or written to a
4141  * /proc/scsi/advansys/[0...] file.
4142  *
4143  * Note: This function uses the per board buffer 'prtbuf' which is
4144  * allocated when the board is initialized in advansys_detect(). The
4145  * buffer is ASC_PRTBUF_SIZE bytes. The function asc_proc_copy() is
4146  * used to write to the buffer. The way asc_proc_copy() is written
4147  * if 'prtbuf' is too small it will not be overwritten. Instead the
4148  * user just won't get all the available statistics.
4149  */
4150 static int
4151 advansys_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
4152 		   off_t offset, int length, int inout)
4153 {
4154 	struct asc_board *boardp = shost_priv(shost);
4155 	char *cp;
4156 	int cplen;
4157 	int cnt;
4158 	int totcnt;
4159 	int leftlen;
4160 	char *curbuf;
4161 	off_t advoffset;
4162 
4163 	ASC_DBG(1, "begin\n");
4164 
4165 	/*
4166 	 * User write not supported.
4167 	 */
4168 	if (inout == TRUE)
4169 		return -ENOSYS;
4170 
4171 	/*
4172 	 * User read of /proc/scsi/advansys/[0...] file.
4173 	 */
4174 
4175 	/* Copy read data starting at the beginning of the buffer. */
4176 	*start = buffer;
4177 	curbuf = buffer;
4178 	advoffset = 0;
4179 	totcnt = 0;
4180 	leftlen = length;
4181 
4182 	/*
4183 	 * Get board configuration information.
4184 	 *
4185 	 * advansys_info() returns the board string from its own static buffer.
4186 	 */
4187 	cp = (char *)advansys_info(shost);
4188 	strcat(cp, "\n");
4189 	cplen = strlen(cp);
4190 	/* Copy board information. */
4191 	cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4192 	totcnt += cnt;
4193 	leftlen -= cnt;
4194 	if (leftlen == 0) {
4195 		ASC_DBG(1, "totcnt %d\n", totcnt);
4196 		return totcnt;
4197 	}
4198 	advoffset += cplen;
4199 	curbuf += cnt;
4200 
4201 	/*
4202 	 * Display Wide Board BIOS Information.
4203 	 */
4204 	if (!ASC_NARROW_BOARD(boardp)) {
4205 		cp = boardp->prtbuf;
4206 		cplen = asc_prt_adv_bios(shost, cp, ASC_PRTBUF_SIZE);
4207 		BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4208 		cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
4209 				  cplen);
4210 		totcnt += cnt;
4211 		leftlen -= cnt;
4212 		if (leftlen == 0) {
4213 			ASC_DBG(1, "totcnt %d\n", totcnt);
4214 			return totcnt;
4215 		}
4216 		advoffset += cplen;
4217 		curbuf += cnt;
4218 	}
4219 
4220 	/*
4221 	 * Display driver information for each device attached to the board.
4222 	 */
4223 	cp = boardp->prtbuf;
4224 	cplen = asc_prt_board_devices(shost, cp, ASC_PRTBUF_SIZE);
4225 	BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4226 	cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4227 	totcnt += cnt;
4228 	leftlen -= cnt;
4229 	if (leftlen == 0) {
4230 		ASC_DBG(1, "totcnt %d\n", totcnt);
4231 		return totcnt;
4232 	}
4233 	advoffset += cplen;
4234 	curbuf += cnt;
4235 
4236 	/*
4237 	 * Display EEPROM configuration for the board.
4238 	 */
4239 	cp = boardp->prtbuf;
4240 	if (ASC_NARROW_BOARD(boardp)) {
4241 		cplen = asc_prt_asc_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
4242 	} else {
4243 		cplen = asc_prt_adv_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
4244 	}
4245 	BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4246 	cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4247 	totcnt += cnt;
4248 	leftlen -= cnt;
4249 	if (leftlen == 0) {
4250 		ASC_DBG(1, "totcnt %d\n", totcnt);
4251 		return totcnt;
4252 	}
4253 	advoffset += cplen;
4254 	curbuf += cnt;
4255 
4256 	/*
4257 	 * Display driver configuration and information for the board.
4258 	 */
4259 	cp = boardp->prtbuf;
4260 	cplen = asc_prt_driver_conf(shost, cp, ASC_PRTBUF_SIZE);
4261 	BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4262 	cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4263 	totcnt += cnt;
4264 	leftlen -= cnt;
4265 	if (leftlen == 0) {
4266 		ASC_DBG(1, "totcnt %d\n", totcnt);
4267 		return totcnt;
4268 	}
4269 	advoffset += cplen;
4270 	curbuf += cnt;
4271 
4272 #ifdef ADVANSYS_STATS
4273 	/*
4274 	 * Display driver statistics for the board.
4275 	 */
4276 	cp = boardp->prtbuf;
4277 	cplen = asc_prt_board_stats(shost, cp, ASC_PRTBUF_SIZE);
4278 	BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4279 	cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4280 	totcnt += cnt;
4281 	leftlen -= cnt;
4282 	if (leftlen == 0) {
4283 		ASC_DBG(1, "totcnt %d\n", totcnt);
4284 		return totcnt;
4285 	}
4286 	advoffset += cplen;
4287 	curbuf += cnt;
4288 #endif /* ADVANSYS_STATS */
4289 
4290 	/*
4291 	 * Display Asc Library dynamic configuration information
4292 	 * for the board.
4293 	 */
4294 	cp = boardp->prtbuf;
4295 	if (ASC_NARROW_BOARD(boardp)) {
4296 		cplen = asc_prt_asc_board_info(shost, cp, ASC_PRTBUF_SIZE);
4297 	} else {
4298 		cplen = asc_prt_adv_board_info(shost, cp, ASC_PRTBUF_SIZE);
4299 	}
4300 	BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4301 	cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4302 	totcnt += cnt;
4303 	leftlen -= cnt;
4304 	if (leftlen == 0) {
4305 		ASC_DBG(1, "totcnt %d\n", totcnt);
4306 		return totcnt;
4307 	}
4308 	advoffset += cplen;
4309 	curbuf += cnt;
4310 
4311 	ASC_DBG(1, "totcnt %d\n", totcnt);
4312 
4313 	return totcnt;
4314 }
4315 #endif /* CONFIG_PROC_FS */
4316 
4317 static void asc_scsi_done(struct scsi_cmnd *scp)
4318 {
4319 	scsi_dma_unmap(scp);
4320 	ASC_STATS(scp->device->host, done);
4321 	scp->scsi_done(scp);
4322 }
4323 
4324 static void AscSetBank(PortAddr iop_base, uchar bank)
4325 {
4326 	uchar val;
4327 
4328 	val = AscGetChipControl(iop_base) &
4329 	    (~
4330 	     (CC_SINGLE_STEP | CC_TEST | CC_DIAG | CC_SCSI_RESET |
4331 	      CC_CHIP_RESET));
4332 	if (bank == 1) {
4333 		val |= CC_BANK_ONE;
4334 	} else if (bank == 2) {
4335 		val |= CC_DIAG | CC_BANK_ONE;
4336 	} else {
4337 		val &= ~CC_BANK_ONE;
4338 	}
4339 	AscSetChipControl(iop_base, val);
4340 }
4341 
4342 static void AscSetChipIH(PortAddr iop_base, ushort ins_code)
4343 {
4344 	AscSetBank(iop_base, 1);
4345 	AscWriteChipIH(iop_base, ins_code);
4346 	AscSetBank(iop_base, 0);
4347 }
4348 
4349 static int AscStartChip(PortAddr iop_base)
4350 {
4351 	AscSetChipControl(iop_base, 0);
4352 	if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
4353 		return (0);
4354 	}
4355 	return (1);
4356 }
4357 
4358 static int AscStopChip(PortAddr iop_base)
4359 {
4360 	uchar cc_val;
4361 
4362 	cc_val =
4363 	    AscGetChipControl(iop_base) &
4364 	    (~(CC_SINGLE_STEP | CC_TEST | CC_DIAG));
4365 	AscSetChipControl(iop_base, (uchar)(cc_val | CC_HALT));
4366 	AscSetChipIH(iop_base, INS_HALT);
4367 	AscSetChipIH(iop_base, INS_RFLAG_WTM);
4368 	if ((AscGetChipStatus(iop_base) & CSW_HALTED) == 0) {
4369 		return (0);
4370 	}
4371 	return (1);
4372 }
4373 
4374 static int AscIsChipHalted(PortAddr iop_base)
4375 {
4376 	if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
4377 		if ((AscGetChipControl(iop_base) & CC_HALT) != 0) {
4378 			return (1);
4379 		}
4380 	}
4381 	return (0);
4382 }
4383 
4384 static int AscResetChipAndScsiBus(ASC_DVC_VAR *asc_dvc)
4385 {
4386 	PortAddr iop_base;
4387 	int i = 10;
4388 
4389 	iop_base = asc_dvc->iop_base;
4390 	while ((AscGetChipStatus(iop_base) & CSW_SCSI_RESET_ACTIVE)
4391 	       && (i-- > 0)) {
4392 		mdelay(100);
4393 	}
4394 	AscStopChip(iop_base);
4395 	AscSetChipControl(iop_base, CC_CHIP_RESET | CC_SCSI_RESET | CC_HALT);
4396 	udelay(60);
4397 	AscSetChipIH(iop_base, INS_RFLAG_WTM);
4398 	AscSetChipIH(iop_base, INS_HALT);
4399 	AscSetChipControl(iop_base, CC_CHIP_RESET | CC_HALT);
4400 	AscSetChipControl(iop_base, CC_HALT);
4401 	mdelay(200);
4402 	AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
4403 	AscSetChipStatus(iop_base, 0);
4404 	return (AscIsChipHalted(iop_base));
4405 }
4406 
4407 static int AscFindSignature(PortAddr iop_base)
4408 {
4409 	ushort sig_word;
4410 
4411 	ASC_DBG(1, "AscGetChipSignatureByte(0x%x) 0x%x\n",
4412 		 iop_base, AscGetChipSignatureByte(iop_base));
4413 	if (AscGetChipSignatureByte(iop_base) == (uchar)ASC_1000_ID1B) {
4414 		ASC_DBG(1, "AscGetChipSignatureWord(0x%x) 0x%x\n",
4415 			 iop_base, AscGetChipSignatureWord(iop_base));
4416 		sig_word = AscGetChipSignatureWord(iop_base);
4417 		if ((sig_word == (ushort)ASC_1000_ID0W) ||
4418 		    (sig_word == (ushort)ASC_1000_ID0W_FIX)) {
4419 			return (1);
4420 		}
4421 	}
4422 	return (0);
4423 }
4424 
4425 static void AscEnableInterrupt(PortAddr iop_base)
4426 {
4427 	ushort cfg;
4428 
4429 	cfg = AscGetChipCfgLsw(iop_base);
4430 	AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON);
4431 }
4432 
4433 static void AscDisableInterrupt(PortAddr iop_base)
4434 {
4435 	ushort cfg;
4436 
4437 	cfg = AscGetChipCfgLsw(iop_base);
4438 	AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON));
4439 }
4440 
4441 static uchar AscReadLramByte(PortAddr iop_base, ushort addr)
4442 {
4443 	unsigned char byte_data;
4444 	unsigned short word_data;
4445 
4446 	if (isodd_word(addr)) {
4447 		AscSetChipLramAddr(iop_base, addr - 1);
4448 		word_data = AscGetChipLramData(iop_base);
4449 		byte_data = (word_data >> 8) & 0xFF;
4450 	} else {
4451 		AscSetChipLramAddr(iop_base, addr);
4452 		word_data = AscGetChipLramData(iop_base);
4453 		byte_data = word_data & 0xFF;
4454 	}
4455 	return byte_data;
4456 }
4457 
4458 static ushort AscReadLramWord(PortAddr iop_base, ushort addr)
4459 {
4460 	ushort word_data;
4461 
4462 	AscSetChipLramAddr(iop_base, addr);
4463 	word_data = AscGetChipLramData(iop_base);
4464 	return (word_data);
4465 }
4466 
4467 #if CC_VERY_LONG_SG_LIST
4468 static ASC_DCNT AscReadLramDWord(PortAddr iop_base, ushort addr)
4469 {
4470 	ushort val_low, val_high;
4471 	ASC_DCNT dword_data;
4472 
4473 	AscSetChipLramAddr(iop_base, addr);
4474 	val_low = AscGetChipLramData(iop_base);
4475 	val_high = AscGetChipLramData(iop_base);
4476 	dword_data = ((ASC_DCNT) val_high << 16) | (ASC_DCNT) val_low;
4477 	return (dword_data);
4478 }
4479 #endif /* CC_VERY_LONG_SG_LIST */
4480 
4481 static void
4482 AscMemWordSetLram(PortAddr iop_base, ushort s_addr, ushort set_wval, int words)
4483 {
4484 	int i;
4485 
4486 	AscSetChipLramAddr(iop_base, s_addr);
4487 	for (i = 0; i < words; i++) {
4488 		AscSetChipLramData(iop_base, set_wval);
4489 	}
4490 }
4491 
4492 static void AscWriteLramWord(PortAddr iop_base, ushort addr, ushort word_val)
4493 {
4494 	AscSetChipLramAddr(iop_base, addr);
4495 	AscSetChipLramData(iop_base, word_val);
4496 }
4497 
4498 static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
4499 {
4500 	ushort word_data;
4501 
4502 	if (isodd_word(addr)) {
4503 		addr--;
4504 		word_data = AscReadLramWord(iop_base, addr);
4505 		word_data &= 0x00FF;
4506 		word_data |= (((ushort)byte_val << 8) & 0xFF00);
4507 	} else {
4508 		word_data = AscReadLramWord(iop_base, addr);
4509 		word_data &= 0xFF00;
4510 		word_data |= ((ushort)byte_val & 0x00FF);
4511 	}
4512 	AscWriteLramWord(iop_base, addr, word_data);
4513 }
4514 
4515 /*
4516  * Copy 2 bytes to LRAM.
4517  *
4518  * The source data is assumed to be in little-endian order in memory
4519  * and is maintained in little-endian order when written to LRAM.
4520  */
4521 static void
4522 AscMemWordCopyPtrToLram(PortAddr iop_base,
4523 			ushort s_addr, uchar *s_buffer, int words)
4524 {
4525 	int i;
4526 
4527 	AscSetChipLramAddr(iop_base, s_addr);
4528 	for (i = 0; i < 2 * words; i += 2) {
4529 		/*
4530 		 * On a little-endian system the second argument below
4531 		 * produces a little-endian ushort which is written to
4532 		 * LRAM in little-endian order. On a big-endian system
4533 		 * the second argument produces a big-endian ushort which
4534 		 * is "transparently" byte-swapped by outpw() and written
4535 		 * in little-endian order to LRAM.
4536 		 */
4537 		outpw(iop_base + IOP_RAM_DATA,
4538 		      ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
4539 	}
4540 }
4541 
4542 /*
4543  * Copy 4 bytes to LRAM.
4544  *
4545  * The source data is assumed to be in little-endian order in memory
4546  * and is maintained in little-endian order when writen to LRAM.
4547  */
4548 static void
4549 AscMemDWordCopyPtrToLram(PortAddr iop_base,
4550 			 ushort s_addr, uchar *s_buffer, int dwords)
4551 {
4552 	int i;
4553 
4554 	AscSetChipLramAddr(iop_base, s_addr);
4555 	for (i = 0; i < 4 * dwords; i += 4) {
4556 		outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);	/* LSW */
4557 		outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 3] << 8) | s_buffer[i + 2]);	/* MSW */
4558 	}
4559 }
4560 
4561 /*
4562  * Copy 2 bytes from LRAM.
4563  *
4564  * The source data is assumed to be in little-endian order in LRAM
4565  * and is maintained in little-endian order when written to memory.
4566  */
4567 static void
4568 AscMemWordCopyPtrFromLram(PortAddr iop_base,
4569 			  ushort s_addr, uchar *d_buffer, int words)
4570 {
4571 	int i;
4572 	ushort word;
4573 
4574 	AscSetChipLramAddr(iop_base, s_addr);
4575 	for (i = 0; i < 2 * words; i += 2) {
4576 		word = inpw(iop_base + IOP_RAM_DATA);
4577 		d_buffer[i] = word & 0xff;
4578 		d_buffer[i + 1] = (word >> 8) & 0xff;
4579 	}
4580 }
4581 
4582 static ASC_DCNT AscMemSumLramWord(PortAddr iop_base, ushort s_addr, int words)
4583 {
4584 	ASC_DCNT sum;
4585 	int i;
4586 
4587 	sum = 0L;
4588 	for (i = 0; i < words; i++, s_addr += 2) {
4589 		sum += AscReadLramWord(iop_base, s_addr);
4590 	}
4591 	return (sum);
4592 }
4593 
4594 static ushort AscInitLram(ASC_DVC_VAR *asc_dvc)
4595 {
4596 	uchar i;
4597 	ushort s_addr;
4598 	PortAddr iop_base;
4599 	ushort warn_code;
4600 
4601 	iop_base = asc_dvc->iop_base;
4602 	warn_code = 0;
4603 	AscMemWordSetLram(iop_base, ASC_QADR_BEG, 0,
4604 			  (ushort)(((int)(asc_dvc->max_total_qng + 2 + 1) *
4605 				    64) >> 1));
4606 	i = ASC_MIN_ACTIVE_QNO;
4607 	s_addr = ASC_QADR_BEG + ASC_QBLK_SIZE;
4608 	AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
4609 			 (uchar)(i + 1));
4610 	AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
4611 			 (uchar)(asc_dvc->max_total_qng));
4612 	AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
4613 			 (uchar)i);
4614 	i++;
4615 	s_addr += ASC_QBLK_SIZE;
4616 	for (; i < asc_dvc->max_total_qng; i++, s_addr += ASC_QBLK_SIZE) {
4617 		AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
4618 				 (uchar)(i + 1));
4619 		AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
4620 				 (uchar)(i - 1));
4621 		AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
4622 				 (uchar)i);
4623 	}
4624 	AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
4625 			 (uchar)ASC_QLINK_END);
4626 	AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
4627 			 (uchar)(asc_dvc->max_total_qng - 1));
4628 	AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
4629 			 (uchar)asc_dvc->max_total_qng);
4630 	i++;
4631 	s_addr += ASC_QBLK_SIZE;
4632 	for (; i <= (uchar)(asc_dvc->max_total_qng + 3);
4633 	     i++, s_addr += ASC_QBLK_SIZE) {
4634 		AscWriteLramByte(iop_base,
4635 				 (ushort)(s_addr + (ushort)ASC_SCSIQ_B_FWD), i);
4636 		AscWriteLramByte(iop_base,
4637 				 (ushort)(s_addr + (ushort)ASC_SCSIQ_B_BWD), i);
4638 		AscWriteLramByte(iop_base,
4639 				 (ushort)(s_addr + (ushort)ASC_SCSIQ_B_QNO), i);
4640 	}
4641 	return warn_code;
4642 }
4643 
4644 static ASC_DCNT
4645 AscLoadMicroCode(PortAddr iop_base,
4646 		 ushort s_addr, uchar *mcode_buf, ushort mcode_size)
4647 {
4648 	ASC_DCNT chksum;
4649 	ushort mcode_word_size;
4650 	ushort mcode_chksum;
4651 
4652 	/* Write the microcode buffer starting at LRAM address 0. */
4653 	mcode_word_size = (ushort)(mcode_size >> 1);
4654 	AscMemWordSetLram(iop_base, s_addr, 0, mcode_word_size);
4655 	AscMemWordCopyPtrToLram(iop_base, s_addr, mcode_buf, mcode_word_size);
4656 
4657 	chksum = AscMemSumLramWord(iop_base, s_addr, mcode_word_size);
4658 	ASC_DBG(1, "chksum 0x%lx\n", (ulong)chksum);
4659 	mcode_chksum = (ushort)AscMemSumLramWord(iop_base,
4660 						 (ushort)ASC_CODE_SEC_BEG,
4661 						 (ushort)((mcode_size -
4662 							   s_addr - (ushort)
4663 							   ASC_CODE_SEC_BEG) /
4664 							  2));
4665 	ASC_DBG(1, "mcode_chksum 0x%lx\n", (ulong)mcode_chksum);
4666 	AscWriteLramWord(iop_base, ASCV_MCODE_CHKSUM_W, mcode_chksum);
4667 	AscWriteLramWord(iop_base, ASCV_MCODE_SIZE_W, mcode_size);
4668 	return chksum;
4669 }
4670 
4671 /* Microcode buffer is kept after initialization for error recovery. */
4672 static uchar _asc_mcode_buf[] = {
4673 	0x01, 0x03, 0x01, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4674 	0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
4675 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4676 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4677 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4678 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x12, 0x0D, 0x05,
4679 	0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4680 	0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4681 	0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xFF,
4682 	0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
4683 	0x00, 0x00, 0xE4, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x73, 0x48, 0x04,
4684 	0x36, 0x00, 0x00, 0xA2, 0xC2, 0x00, 0x80, 0x73, 0x03, 0x23, 0x36, 0x40,
4685 	0xB6, 0x00, 0x36, 0x00, 0x05, 0xD6, 0x0C, 0xD2, 0x12, 0xDA, 0x00, 0xA2,
4686 	0xC2, 0x00, 0x92, 0x80, 0x1E, 0x98, 0x50, 0x00, 0xF5, 0x00, 0x48, 0x98,
4687 	0xDF, 0x23, 0x36, 0x60, 0xB6, 0x00, 0x92, 0x80, 0x4F, 0x00, 0xF5, 0x00,
4688 	0x48, 0x98, 0xEF, 0x23, 0x36, 0x60, 0xB6, 0x00, 0x92, 0x80, 0x80, 0x62,
4689 	0x92, 0x80, 0x00, 0x46, 0x15, 0xEE, 0x13, 0xEA, 0x02, 0x01, 0x09, 0xD8,
4690 	0xCD, 0x04, 0x4D, 0x00, 0x00, 0xA3, 0xD6, 0x00, 0xA6, 0x97, 0x7F, 0x23,
4691 	0x04, 0x61, 0x84, 0x01, 0xE6, 0x84, 0xD2, 0xC1, 0x80, 0x73, 0xCD, 0x04,
4692 	0x4D, 0x00, 0x00, 0xA3, 0xDA, 0x01, 0xA6, 0x97, 0xC6, 0x81, 0xC2, 0x88,
4693 	0x80, 0x73, 0x80, 0x77, 0x00, 0x01, 0x01, 0xA1, 0xFE, 0x00, 0x4F, 0x00,
4694 	0x84, 0x97, 0x07, 0xA6, 0x08, 0x01, 0x00, 0x33, 0x03, 0x00, 0xC2, 0x88,
4695 	0x03, 0x03, 0x01, 0xDE, 0xC2, 0x88, 0xCE, 0x00, 0x69, 0x60, 0xCE, 0x00,
4696 	0x02, 0x03, 0x4A, 0x60, 0x00, 0xA2, 0x78, 0x01, 0x80, 0x63, 0x07, 0xA6,
4697 	0x24, 0x01, 0x78, 0x81, 0x03, 0x03, 0x80, 0x63, 0xE2, 0x00, 0x07, 0xA6,
4698 	0x34, 0x01, 0x00, 0x33, 0x04, 0x00, 0xC2, 0x88, 0x03, 0x07, 0x02, 0x01,
4699 	0x04, 0xCA, 0x0D, 0x23, 0x68, 0x98, 0x4D, 0x04, 0x04, 0x85, 0x05, 0xD8,
4700 	0x0D, 0x23, 0x68, 0x98, 0xCD, 0x04, 0x15, 0x23, 0xF8, 0x88, 0xFB, 0x23,
4701 	0x02, 0x61, 0x82, 0x01, 0x80, 0x63, 0x02, 0x03, 0x06, 0xA3, 0x62, 0x01,
4702 	0x00, 0x33, 0x0A, 0x00, 0xC2, 0x88, 0x4E, 0x00, 0x07, 0xA3, 0x6E, 0x01,
4703 	0x00, 0x33, 0x0B, 0x00, 0xC2, 0x88, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33,
4704 	0x1A, 0x00, 0xC2, 0x88, 0x50, 0x04, 0x88, 0x81, 0x06, 0xAB, 0x82, 0x01,
4705 	0x88, 0x81, 0x4E, 0x00, 0x07, 0xA3, 0x92, 0x01, 0x50, 0x00, 0x00, 0xA3,
4706 	0x3C, 0x01, 0x00, 0x05, 0x7C, 0x81, 0x46, 0x97, 0x02, 0x01, 0x05, 0xC6,
4707 	0x04, 0x23, 0xA0, 0x01, 0x15, 0x23, 0xA1, 0x01, 0xBE, 0x81, 0xFD, 0x23,
4708 	0x02, 0x61, 0x82, 0x01, 0x0A, 0xDA, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA0,
4709 	0xB4, 0x01, 0x80, 0x63, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33, 0x1B, 0x00,
4710 	0xC2, 0x88, 0x06, 0x23, 0x68, 0x98, 0xCD, 0x04, 0xE6, 0x84, 0x06, 0x01,
4711 	0x00, 0xA2, 0xD4, 0x01, 0x57, 0x60, 0x00, 0xA0, 0xDA, 0x01, 0xE6, 0x84,
4712 	0x80, 0x23, 0xA0, 0x01, 0xE6, 0x84, 0x80, 0x73, 0x4B, 0x00, 0x06, 0x61,
4713 	0x00, 0xA2, 0x00, 0x02, 0x04, 0x01, 0x0C, 0xDE, 0x02, 0x01, 0x03, 0xCC,
4714 	0x4F, 0x00, 0x84, 0x97, 0xFC, 0x81, 0x08, 0x23, 0x02, 0x41, 0x82, 0x01,
4715 	0x4F, 0x00, 0x62, 0x97, 0x48, 0x04, 0x84, 0x80, 0xF0, 0x97, 0x00, 0x46,
4716 	0x56, 0x00, 0x03, 0xC0, 0x01, 0x23, 0xE8, 0x00, 0x81, 0x73, 0x06, 0x29,
4717 	0x03, 0x42, 0x06, 0xE2, 0x03, 0xEE, 0x6B, 0xEB, 0x11, 0x23, 0xF8, 0x88,
4718 	0x04, 0x98, 0xF0, 0x80, 0x80, 0x73, 0x80, 0x77, 0x07, 0xA4, 0x2A, 0x02,
4719 	0x7C, 0x95, 0x06, 0xA6, 0x34, 0x02, 0x03, 0xA6, 0x4C, 0x04, 0x46, 0x82,
4720 	0x04, 0x01, 0x03, 0xD8, 0xB4, 0x98, 0x6A, 0x96, 0x46, 0x82, 0xFE, 0x95,
4721 	0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0xB6, 0x2D, 0x02, 0xA6, 0x6C, 0x02,
4722 	0x07, 0xA6, 0x5A, 0x02, 0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x62, 0x02,
4723 	0xC2, 0x88, 0x7C, 0x95, 0x48, 0x82, 0x60, 0x96, 0x48, 0x82, 0x04, 0x23,
4724 	0xA0, 0x01, 0x14, 0x23, 0xA1, 0x01, 0x3C, 0x84, 0x04, 0x01, 0x0C, 0xDC,
4725 	0xE0, 0x23, 0x25, 0x61, 0xEF, 0x00, 0x14, 0x01, 0x4F, 0x04, 0xA8, 0x01,
4726 	0x6F, 0x00, 0xA5, 0x01, 0x03, 0x23, 0xA4, 0x01, 0x06, 0x23, 0x9C, 0x01,
4727 	0x24, 0x2B, 0x1C, 0x01, 0x02, 0xA6, 0xAA, 0x02, 0x07, 0xA6, 0x5A, 0x02,
4728 	0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x20, 0x04, 0x01, 0xA6, 0xB4, 0x02,
4729 	0x00, 0xA6, 0xB4, 0x02, 0x00, 0x33, 0x12, 0x00, 0xC2, 0x88, 0x00, 0x0E,
4730 	0x80, 0x63, 0x00, 0x43, 0x00, 0xA0, 0x8C, 0x02, 0x4D, 0x04, 0x04, 0x01,
4731 	0x0B, 0xDC, 0xE7, 0x23, 0x04, 0x61, 0x84, 0x01, 0x10, 0x31, 0x12, 0x35,
4732 	0x14, 0x01, 0xEC, 0x00, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00, 0xEA, 0x82,
4733 	0x18, 0x23, 0x04, 0x61, 0x18, 0xA0, 0xE2, 0x02, 0x04, 0x01, 0xA2, 0xC8,
4734 	0x00, 0x33, 0x1F, 0x00, 0xC2, 0x88, 0x08, 0x31, 0x0A, 0x35, 0x0C, 0x39,
4735 	0x0E, 0x3D, 0x7E, 0x98, 0xB6, 0x2D, 0x01, 0xA6, 0x14, 0x03, 0x00, 0xA6,
4736 	0x14, 0x03, 0x07, 0xA6, 0x0C, 0x03, 0x06, 0xA6, 0x10, 0x03, 0x03, 0xA6,
4737 	0x20, 0x04, 0x02, 0xA6, 0x6C, 0x02, 0x00, 0x33, 0x33, 0x00, 0xC2, 0x88,
4738 	0x7C, 0x95, 0xEE, 0x82, 0x60, 0x96, 0xEE, 0x82, 0x82, 0x98, 0x80, 0x42,
4739 	0x7E, 0x98, 0x64, 0xE4, 0x04, 0x01, 0x2D, 0xC8, 0x31, 0x05, 0x07, 0x01,
4740 	0x00, 0xA2, 0x54, 0x03, 0x00, 0x43, 0x87, 0x01, 0x05, 0x05, 0x86, 0x98,
4741 	0x7E, 0x98, 0x00, 0xA6, 0x16, 0x03, 0x07, 0xA6, 0x4C, 0x03, 0x03, 0xA6,
4742 	0x3C, 0x04, 0x06, 0xA6, 0x50, 0x03, 0x01, 0xA6, 0x16, 0x03, 0x00, 0x33,
4743 	0x25, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x32, 0x83, 0x60, 0x96, 0x32, 0x83,
4744 	0x04, 0x01, 0x10, 0xCE, 0x07, 0xC8, 0x05, 0x05, 0xEB, 0x04, 0x00, 0x33,
4745 	0x00, 0x20, 0xC0, 0x20, 0x81, 0x62, 0x72, 0x83, 0x00, 0x01, 0x05, 0x05,
4746 	0xFF, 0xA2, 0x7A, 0x03, 0xB1, 0x01, 0x08, 0x23, 0xB2, 0x01, 0x2E, 0x83,
4747 	0x05, 0x05, 0x15, 0x01, 0x00, 0xA2, 0x9A, 0x03, 0xEC, 0x00, 0x6E, 0x00,
4748 	0x95, 0x01, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xA6, 0x96, 0x03,
4749 	0x00, 0xA6, 0x96, 0x03, 0x10, 0x84, 0x80, 0x42, 0x7E, 0x98, 0x01, 0xA6,
4750 	0xA4, 0x03, 0x00, 0xA6, 0xBC, 0x03, 0x10, 0x84, 0xA8, 0x98, 0x80, 0x42,
4751 	0x01, 0xA6, 0xA4, 0x03, 0x07, 0xA6, 0xB2, 0x03, 0xD4, 0x83, 0x7C, 0x95,
4752 	0xA8, 0x83, 0x00, 0x33, 0x2F, 0x00, 0xC2, 0x88, 0xA8, 0x98, 0x80, 0x42,
4753 	0x00, 0xA6, 0xBC, 0x03, 0x07, 0xA6, 0xCA, 0x03, 0xD4, 0x83, 0x7C, 0x95,
4754 	0xC0, 0x83, 0x00, 0x33, 0x26, 0x00, 0xC2, 0x88, 0x38, 0x2B, 0x80, 0x32,
4755 	0x80, 0x36, 0x04, 0x23, 0xA0, 0x01, 0x12, 0x23, 0xA1, 0x01, 0x10, 0x84,
4756 	0x07, 0xF0, 0x06, 0xA4, 0xF4, 0x03, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23,
4757 	0x83, 0x03, 0x80, 0x63, 0x03, 0xA6, 0x0E, 0x04, 0x07, 0xA6, 0x06, 0x04,
4758 	0x06, 0xA6, 0x0A, 0x04, 0x00, 0x33, 0x17, 0x00, 0xC2, 0x88, 0x7C, 0x95,
4759 	0xF4, 0x83, 0x60, 0x96, 0xF4, 0x83, 0x20, 0x84, 0x07, 0xF0, 0x06, 0xA4,
4760 	0x20, 0x04, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23, 0x83, 0x03, 0x80, 0x63,
4761 	0xB6, 0x2D, 0x03, 0xA6, 0x3C, 0x04, 0x07, 0xA6, 0x34, 0x04, 0x06, 0xA6,
4762 	0x38, 0x04, 0x00, 0x33, 0x30, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x20, 0x84,
4763 	0x60, 0x96, 0x20, 0x84, 0x1D, 0x01, 0x06, 0xCC, 0x00, 0x33, 0x00, 0x84,
4764 	0xC0, 0x20, 0x00, 0x23, 0xEA, 0x00, 0x81, 0x62, 0xA2, 0x0D, 0x80, 0x63,
4765 	0x07, 0xA6, 0x5A, 0x04, 0x00, 0x33, 0x18, 0x00, 0xC2, 0x88, 0x03, 0x03,
4766 	0x80, 0x63, 0xA3, 0x01, 0x07, 0xA4, 0x64, 0x04, 0x23, 0x01, 0x00, 0xA2,
4767 	0x86, 0x04, 0x0A, 0xA0, 0x76, 0x04, 0xE0, 0x00, 0x00, 0x33, 0x1D, 0x00,
4768 	0xC2, 0x88, 0x0B, 0xA0, 0x82, 0x04, 0xE0, 0x00, 0x00, 0x33, 0x1E, 0x00,
4769 	0xC2, 0x88, 0x42, 0x23, 0xF8, 0x88, 0x00, 0x23, 0x22, 0xA3, 0xE6, 0x04,
4770 	0x08, 0x23, 0x22, 0xA3, 0xA2, 0x04, 0x28, 0x23, 0x22, 0xA3, 0xAE, 0x04,
4771 	0x02, 0x23, 0x22, 0xA3, 0xC4, 0x04, 0x42, 0x23, 0xF8, 0x88, 0x4A, 0x00,
4772 	0x06, 0x61, 0x00, 0xA0, 0xAE, 0x04, 0x45, 0x23, 0xF8, 0x88, 0x04, 0x98,
4773 	0x00, 0xA2, 0xC0, 0x04, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x82, 0xC0, 0x20,
4774 	0x81, 0x62, 0xE8, 0x81, 0x47, 0x23, 0xF8, 0x88, 0x04, 0x01, 0x0B, 0xDE,
4775 	0x04, 0x98, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x81, 0xC0, 0x20, 0x81, 0x62,
4776 	0x14, 0x01, 0x00, 0xA0, 0x00, 0x02, 0x43, 0x23, 0xF8, 0x88, 0x04, 0x23,
4777 	0xA0, 0x01, 0x44, 0x23, 0xA1, 0x01, 0x80, 0x73, 0x4D, 0x00, 0x03, 0xA3,
4778 	0xF4, 0x04, 0x00, 0x33, 0x27, 0x00, 0xC2, 0x88, 0x04, 0x01, 0x04, 0xDC,
4779 	0x02, 0x23, 0xA2, 0x01, 0x04, 0x23, 0xA0, 0x01, 0x04, 0x98, 0x26, 0x95,
4780 	0x4B, 0x00, 0xF6, 0x00, 0x4F, 0x04, 0x4F, 0x00, 0x00, 0xA3, 0x22, 0x05,
4781 	0x00, 0x05, 0x76, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x1C, 0x05, 0x0A, 0x85,
4782 	0x46, 0x97, 0xCD, 0x04, 0x24, 0x85, 0x48, 0x04, 0x84, 0x80, 0x02, 0x01,
4783 	0x03, 0xDA, 0x80, 0x23, 0x82, 0x01, 0x34, 0x85, 0x02, 0x23, 0xA0, 0x01,
4784 	0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x40, 0x05, 0x1D, 0x01, 0x04, 0xD6,
4785 	0xFF, 0x23, 0x86, 0x41, 0x4B, 0x60, 0xCB, 0x00, 0xFF, 0x23, 0x80, 0x01,
4786 	0x49, 0x00, 0x81, 0x01, 0x04, 0x01, 0x02, 0xC8, 0x30, 0x01, 0x80, 0x01,
4787 	0xF7, 0x04, 0x03, 0x01, 0x49, 0x04, 0x80, 0x01, 0xC9, 0x00, 0x00, 0x05,
4788 	0x00, 0x01, 0xFF, 0xA0, 0x60, 0x05, 0x77, 0x04, 0x01, 0x23, 0xEA, 0x00,
4789 	0x5D, 0x00, 0xFE, 0xC7, 0x00, 0x62, 0x00, 0x23, 0xEA, 0x00, 0x00, 0x63,
4790 	0x07, 0xA4, 0xF8, 0x05, 0x03, 0x03, 0x02, 0xA0, 0x8E, 0x05, 0xF4, 0x85,
4791 	0x00, 0x33, 0x2D, 0x00, 0xC2, 0x88, 0x04, 0xA0, 0xB8, 0x05, 0x80, 0x63,
4792 	0x00, 0x23, 0xDF, 0x00, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0xA4, 0x05,
4793 	0x1D, 0x01, 0x06, 0xD6, 0x02, 0x23, 0x02, 0x41, 0x82, 0x01, 0x50, 0x00,
4794 	0x62, 0x97, 0x04, 0x85, 0x04, 0x23, 0x02, 0x41, 0x82, 0x01, 0x04, 0x85,
4795 	0x08, 0xA0, 0xBE, 0x05, 0xF4, 0x85, 0x03, 0xA0, 0xC4, 0x05, 0xF4, 0x85,
4796 	0x01, 0xA0, 0xCE, 0x05, 0x88, 0x00, 0x80, 0x63, 0xCC, 0x86, 0x07, 0xA0,
4797 	0xEE, 0x05, 0x5F, 0x00, 0x00, 0x2B, 0xDF, 0x08, 0x00, 0xA2, 0xE6, 0x05,
4798 	0x80, 0x67, 0x80, 0x63, 0x01, 0xA2, 0x7A, 0x06, 0x7C, 0x85, 0x06, 0x23,
4799 	0x68, 0x98, 0x48, 0x23, 0xF8, 0x88, 0x07, 0x23, 0x80, 0x00, 0x06, 0x87,
4800 	0x80, 0x63, 0x7C, 0x85, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63, 0x4A, 0x00,
4801 	0x06, 0x61, 0x00, 0xA2, 0x36, 0x06, 0x1D, 0x01, 0x16, 0xD4, 0xC0, 0x23,
4802 	0x07, 0x41, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6, 0x1C, 0x06, 0x00, 0x33,
4803 	0x37, 0x00, 0xC2, 0x88, 0x1D, 0x01, 0x01, 0xD6, 0x20, 0x23, 0x63, 0x60,
4804 	0x83, 0x03, 0x80, 0x63, 0x02, 0x23, 0xDF, 0x00, 0x07, 0xA6, 0x7C, 0x05,
4805 	0xEF, 0x04, 0x6F, 0x00, 0x00, 0x63, 0x4B, 0x00, 0x06, 0x41, 0xCB, 0x00,
4806 	0x52, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x4E, 0x06, 0x1D, 0x01, 0x03, 0xCA,
4807 	0xC0, 0x23, 0x07, 0x41, 0x00, 0x63, 0x1D, 0x01, 0x04, 0xCC, 0x00, 0x33,
4808 	0x00, 0x83, 0xC0, 0x20, 0x81, 0x62, 0x80, 0x23, 0x07, 0x41, 0x00, 0x63,
4809 	0x80, 0x67, 0x08, 0x23, 0x83, 0x03, 0x80, 0x63, 0x00, 0x63, 0x01, 0x23,
4810 	0xDF, 0x00, 0x06, 0xA6, 0x84, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67,
4811 	0x80, 0x63, 0x00, 0x33, 0x00, 0x40, 0xC0, 0x20, 0x81, 0x62, 0x00, 0x63,
4812 	0x00, 0x00, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6, 0x94, 0x06,
4813 	0x07, 0xA6, 0x7C, 0x05, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x07, 0x00, 0x2B,
4814 	0x40, 0x0E, 0x80, 0x63, 0x01, 0x00, 0x06, 0xA6, 0xAA, 0x06, 0x07, 0xA6,
4815 	0x7C, 0x05, 0x40, 0x0E, 0x80, 0x63, 0x00, 0x43, 0x00, 0xA0, 0xA2, 0x06,
4816 	0x06, 0xA6, 0xBC, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67, 0x40, 0x0E,
4817 	0x80, 0x63, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63,
4818 	0x07, 0xA6, 0xD6, 0x06, 0x00, 0x33, 0x2A, 0x00, 0xC2, 0x88, 0x03, 0x03,
4819 	0x80, 0x63, 0x89, 0x00, 0x0A, 0x2B, 0x07, 0xA6, 0xE8, 0x06, 0x00, 0x33,
4820 	0x29, 0x00, 0xC2, 0x88, 0x00, 0x43, 0x00, 0xA2, 0xF4, 0x06, 0xC0, 0x0E,
4821 	0x80, 0x63, 0xDE, 0x86, 0xC0, 0x0E, 0x00, 0x33, 0x00, 0x80, 0xC0, 0x20,
4822 	0x81, 0x62, 0x04, 0x01, 0x02, 0xDA, 0x80, 0x63, 0x7C, 0x85, 0x80, 0x7B,
4823 	0x80, 0x63, 0x06, 0xA6, 0x8C, 0x06, 0x00, 0x33, 0x2C, 0x00, 0xC2, 0x88,
4824 	0x0C, 0xA2, 0x2E, 0x07, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63, 0x06, 0xA6,
4825 	0x2C, 0x07, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x33, 0x3D, 0x00, 0xC2, 0x88,
4826 	0x00, 0x00, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0x0C, 0xA0, 0x44, 0x07,
4827 	0x07, 0xA6, 0x7C, 0x05, 0xBF, 0x23, 0x04, 0x61, 0x84, 0x01, 0xE6, 0x84,
4828 	0x00, 0x63, 0xF0, 0x04, 0x01, 0x01, 0xF1, 0x00, 0x00, 0x01, 0xF2, 0x00,
4829 	0x01, 0x05, 0x80, 0x01, 0x72, 0x04, 0x71, 0x00, 0x81, 0x01, 0x70, 0x04,
4830 	0x80, 0x05, 0x81, 0x05, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04,
4831 	0x01, 0x01, 0xF1, 0x00, 0x70, 0x00, 0x81, 0x01, 0x70, 0x04, 0x71, 0x00,
4832 	0x81, 0x01, 0x72, 0x00, 0x80, 0x01, 0x71, 0x04, 0x70, 0x00, 0x80, 0x01,
4833 	0x70, 0x04, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04, 0x00, 0x01,
4834 	0xF1, 0x00, 0x70, 0x00, 0x80, 0x01, 0x70, 0x04, 0x71, 0x00, 0x80, 0x01,
4835 	0x72, 0x00, 0x81, 0x01, 0x71, 0x04, 0x70, 0x00, 0x81, 0x01, 0x70, 0x04,
4836 	0x00, 0x63, 0x00, 0x23, 0xB3, 0x01, 0x83, 0x05, 0xA3, 0x01, 0xA2, 0x01,
4837 	0xA1, 0x01, 0x01, 0x23, 0xA0, 0x01, 0x00, 0x01, 0xC8, 0x00, 0x03, 0xA1,
4838 	0xC4, 0x07, 0x00, 0x33, 0x07, 0x00, 0xC2, 0x88, 0x80, 0x05, 0x81, 0x05,
4839 	0x04, 0x01, 0x11, 0xC8, 0x48, 0x00, 0xB0, 0x01, 0xB1, 0x01, 0x08, 0x23,
4840 	0xB2, 0x01, 0x05, 0x01, 0x48, 0x04, 0x00, 0x43, 0x00, 0xA2, 0xE4, 0x07,
4841 	0x00, 0x05, 0xDA, 0x87, 0x00, 0x01, 0xC8, 0x00, 0xFF, 0x23, 0x80, 0x01,
4842 	0x05, 0x05, 0x00, 0x63, 0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04,
4843 	0x00, 0x02, 0x80, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04, 0x00, 0x63,
4844 	0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04, 0x00, 0x02, 0x00, 0xA0,
4845 	0x14, 0x08, 0x16, 0x88, 0x00, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04,
4846 	0x00, 0x63, 0xF3, 0x04, 0x00, 0x23, 0xF4, 0x00, 0x74, 0x00, 0x80, 0x43,
4847 	0xF4, 0x00, 0xCF, 0x40, 0x00, 0xA2, 0x44, 0x08, 0x74, 0x04, 0x02, 0x01,
4848 	0xF7, 0xC9, 0xF6, 0xD9, 0x00, 0x01, 0x01, 0xA1, 0x24, 0x08, 0x04, 0x98,
4849 	0x26, 0x95, 0x24, 0x88, 0x73, 0x04, 0x00, 0x63, 0xF3, 0x04, 0x75, 0x04,
4850 	0x5A, 0x88, 0x02, 0x01, 0x04, 0xD8, 0x46, 0x97, 0x04, 0x98, 0x26, 0x95,
4851 	0x4A, 0x88, 0x75, 0x00, 0x00, 0xA3, 0x64, 0x08, 0x00, 0x05, 0x4E, 0x88,
4852 	0x73, 0x04, 0x00, 0x63, 0x80, 0x7B, 0x80, 0x63, 0x06, 0xA6, 0x76, 0x08,
4853 	0x00, 0x33, 0x3E, 0x00, 0xC2, 0x88, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63,
4854 	0x00, 0x63, 0x38, 0x2B, 0x9C, 0x88, 0x38, 0x2B, 0x92, 0x88, 0x32, 0x09,
4855 	0x31, 0x05, 0x92, 0x98, 0x05, 0x05, 0xB2, 0x09, 0x00, 0x63, 0x00, 0x32,
4856 	0x00, 0x36, 0x00, 0x3A, 0x00, 0x3E, 0x00, 0x63, 0x80, 0x32, 0x80, 0x36,
4857 	0x80, 0x3A, 0x80, 0x3E, 0xB4, 0x3D, 0x00, 0x63, 0x38, 0x2B, 0x40, 0x32,
4858 	0x40, 0x36, 0x40, 0x3A, 0x40, 0x3E, 0x00, 0x63, 0x5A, 0x20, 0xC9, 0x40,
4859 	0x00, 0xA0, 0xB4, 0x08, 0x5D, 0x00, 0xFE, 0xC3, 0x00, 0x63, 0x80, 0x73,
4860 	0xE6, 0x20, 0x02, 0x23, 0xE8, 0x00, 0x82, 0x73, 0xFF, 0xFD, 0x80, 0x73,
4861 	0x13, 0x23, 0xF8, 0x88, 0x66, 0x20, 0xC0, 0x20, 0x04, 0x23, 0xA0, 0x01,
4862 	0xA1, 0x23, 0xA1, 0x01, 0x81, 0x62, 0xE2, 0x88, 0x80, 0x73, 0x80, 0x77,
4863 	0x68, 0x00, 0x00, 0xA2, 0x80, 0x00, 0x03, 0xC2, 0xF1, 0xC7, 0x41, 0x23,
4864 	0xF8, 0x88, 0x11, 0x23, 0xA1, 0x01, 0x04, 0x23, 0xA0, 0x01, 0xE6, 0x84,
4865 };
4866 
4867 static unsigned short _asc_mcode_size = sizeof(_asc_mcode_buf);
4868 static ADV_DCNT _asc_mcode_chksum = 0x012C453FUL;
4869 
4870 /* Microcode buffer is kept after initialization for error recovery. */
4871 static unsigned char _adv_asc3550_buf[] = {
4872 	0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0x16, 0x18, 0xe4, 0x00, 0xfc,
4873 	0x01, 0x00, 0x48, 0xe4, 0xbe, 0x18, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00,
4874 	0x00, 0xfa, 0xff, 0xff, 0x28, 0x0e, 0x9e, 0xe7, 0xff, 0x00, 0x82, 0xe7,
4875 	0x00, 0xea, 0x00, 0xf6, 0x01, 0xe6, 0x09, 0xe7, 0x55, 0xf0, 0x01, 0xf6,
4876 	0x01, 0xfa, 0x08, 0x00, 0x03, 0x00, 0x04, 0x00, 0x18, 0xf4, 0x10, 0x00,
4877 	0x00, 0xec, 0x85, 0xf0, 0xbc, 0x00, 0xd5, 0xf0, 0x8e, 0x0c, 0x38, 0x54,
4878 	0x00, 0xe6, 0x1e, 0xf0, 0x86, 0xf0, 0xb4, 0x00, 0x98, 0x57, 0xd0, 0x01,
4879 	0x0c, 0x1c, 0x3e, 0x1c, 0x0c, 0x00, 0xbb, 0x00, 0xaa, 0x18, 0x02, 0x80,
4880 	0x32, 0xf0, 0x01, 0xfc, 0x88, 0x0c, 0xc6, 0x12, 0x02, 0x13, 0x18, 0x40,
4881 	0x00, 0x57, 0x01, 0xea, 0x3c, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
4882 	0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00, 0xc0, 0x00, 0x01, 0x01,
4883 	0x3e, 0x01, 0xda, 0x0f, 0x22, 0x10, 0x08, 0x12, 0x02, 0x4a, 0xb9, 0x54,
4884 	0x03, 0x58, 0x1b, 0x80, 0x30, 0xe4, 0x4b, 0xe4, 0x20, 0x00, 0x32, 0x00,
4885 	0x3e, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01,
4886 	0x70, 0x01, 0x72, 0x01, 0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0x62, 0x0a,
4887 	0x92, 0x0c, 0x2c, 0x10, 0x2e, 0x10, 0x06, 0x13, 0x4c, 0x1c, 0xbb, 0x55,
4888 	0x3c, 0x56, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0, 0xb1, 0xf0,
4889 	0x03, 0xf7, 0x06, 0xf7, 0x03, 0xfc, 0x0f, 0x00, 0x40, 0x00, 0xbe, 0x00,
4890 	0x00, 0x01, 0xb0, 0x08, 0x30, 0x13, 0x64, 0x15, 0x32, 0x1c, 0x38, 0x1c,
4891 	0x4e, 0x1c, 0x10, 0x44, 0x02, 0x48, 0x00, 0x4c, 0x04, 0xea, 0x5d, 0xf0,
4892 	0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00,
4893 	0xcc, 0x00, 0x20, 0x01, 0x4e, 0x01, 0x4e, 0x0b, 0x1e, 0x0e, 0x0c, 0x10,
4894 	0x0a, 0x12, 0x04, 0x13, 0x40, 0x13, 0x30, 0x1c, 0x00, 0x4e, 0xbd, 0x56,
4895 	0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0, 0x59, 0xf0, 0xa7, 0xf0,
4896 	0xb8, 0xf0, 0x0e, 0xf7, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00,
4897 	0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00,
4898 	0xde, 0x03, 0x56, 0x0a, 0x14, 0x0e, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10,
4899 	0x36, 0x10, 0x0a, 0x13, 0x12, 0x13, 0x52, 0x13, 0x10, 0x15, 0x14, 0x15,
4900 	0xac, 0x16, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44,
4901 	0x91, 0x44, 0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x83, 0x55,
4902 	0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0, 0x0c, 0xf0,
4903 	0x5c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8, 0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa,
4904 	0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x1c, 0x00,
4905 	0x9e, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0x22, 0x01,
4906 	0x26, 0x01, 0x79, 0x01, 0x7a, 0x01, 0xc0, 0x01, 0xc2, 0x01, 0x7c, 0x02,
4907 	0x5a, 0x03, 0xea, 0x04, 0xe8, 0x07, 0x68, 0x08, 0x69, 0x08, 0xba, 0x08,
4908 	0xe9, 0x09, 0x06, 0x0b, 0x3a, 0x0e, 0x00, 0x10, 0x1a, 0x10, 0xed, 0x10,
4909 	0xf1, 0x10, 0x06, 0x12, 0x0c, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x82, 0x13,
4910 	0x42, 0x14, 0xd6, 0x14, 0x8a, 0x15, 0xc6, 0x17, 0xd2, 0x17, 0x6b, 0x18,
4911 	0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40, 0x0e, 0x47, 0x48, 0x47,
4912 	0x41, 0x48, 0x89, 0x48, 0x80, 0x4c, 0x00, 0x54, 0x44, 0x55, 0xe5, 0x55,
4913 	0x14, 0x56, 0x77, 0x57, 0xbf, 0x57, 0x40, 0x5c, 0x06, 0x80, 0x08, 0x90,
4914 	0x03, 0xa1, 0xfe, 0x9c, 0xf0, 0x29, 0x02, 0xfe, 0xb8, 0x0c, 0xff, 0x10,
4915 	0x00, 0x00, 0xd0, 0xfe, 0xcc, 0x18, 0x00, 0xcf, 0xfe, 0x80, 0x01, 0xff,
4916 	0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
4917 	0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x48, 0x00, 0x4f, 0xff, 0x04, 0x00,
4918 	0x00, 0x10, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
4919 	0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x0f,
4920 	0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
4921 	0xfe, 0x04, 0xf7, 0xcf, 0x2a, 0x67, 0x0b, 0x01, 0xfe, 0xce, 0x0e, 0xfe,
4922 	0x04, 0xf7, 0xcf, 0x67, 0x0b, 0x3c, 0x2a, 0xfe, 0x3d, 0xf0, 0xfe, 0x02,
4923 	0x02, 0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x91, 0xf0, 0xfe, 0xf0, 0x01, 0xfe,
4924 	0x90, 0xf0, 0xfe, 0xf0, 0x01, 0xfe, 0x8f, 0xf0, 0x9c, 0x05, 0x51, 0x3b,
4925 	0x02, 0xfe, 0xd4, 0x0c, 0x01, 0xfe, 0x44, 0x0d, 0xfe, 0xdd, 0x12, 0xfe,
4926 	0xfc, 0x10, 0xfe, 0x28, 0x1c, 0x05, 0xfe, 0xa6, 0x00, 0xfe, 0xd3, 0x12,
4927 	0x47, 0x18, 0xfe, 0xa6, 0x00, 0xb5, 0xfe, 0x48, 0xf0, 0xfe, 0x86, 0x02,
4928 	0xfe, 0x49, 0xf0, 0xfe, 0xa0, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xbe, 0x02,
4929 	0xfe, 0x46, 0xf0, 0xfe, 0x50, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x56, 0x02,
4930 	0xfe, 0x43, 0xf0, 0xfe, 0x44, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x48, 0x02,
4931 	0xfe, 0x45, 0xf0, 0xfe, 0x4c, 0x02, 0x17, 0x0b, 0xa0, 0x17, 0x06, 0x18,
4932 	0x96, 0x02, 0x29, 0xfe, 0x00, 0x1c, 0xde, 0xfe, 0x02, 0x1c, 0xdd, 0xfe,
4933 	0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0xfe, 0x20, 0x17, 0xfe, 0xe7, 0x10,
4934 	0xfe, 0x06, 0xfc, 0xc7, 0x0a, 0x6b, 0x01, 0x9e, 0x02, 0x29, 0x14, 0x4d,
4935 	0x37, 0x97, 0x01, 0xfe, 0x64, 0x0f, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xbd,
4936 	0x10, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
4937 	0x58, 0x1c, 0x17, 0x06, 0x18, 0x96, 0x2a, 0x25, 0x29, 0xfe, 0x3d, 0xf0,
4938 	0xfe, 0x02, 0x02, 0x21, 0xfe, 0x94, 0x02, 0xfe, 0x5a, 0x1c, 0xea, 0xfe,
4939 	0x14, 0x1c, 0x14, 0xfe, 0x30, 0x00, 0x37, 0x97, 0x01, 0xfe, 0x54, 0x0f,
4940 	0x17, 0x06, 0x18, 0x96, 0x02, 0xd0, 0x1e, 0x20, 0x07, 0x10, 0x34, 0xfe,
4941 	0x69, 0x10, 0x17, 0x06, 0x18, 0x96, 0xfe, 0x04, 0xec, 0x20, 0x46, 0x3d,
4942 	0x12, 0x20, 0xfe, 0x05, 0xf6, 0xc7, 0x01, 0xfe, 0x52, 0x16, 0x09, 0x4a,
4943 	0x4c, 0x35, 0x11, 0x2d, 0x3c, 0x8a, 0x01, 0xe6, 0x02, 0x29, 0x0a, 0x40,
4944 	0x01, 0x0e, 0x07, 0x00, 0x5d, 0x01, 0x6f, 0xfe, 0x18, 0x10, 0xfe, 0x41,
4945 	0x58, 0x0a, 0x99, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x64, 0xfe, 0x0c, 0x03,
4946 	0x01, 0xe6, 0x02, 0x29, 0x2a, 0x46, 0xfe, 0x02, 0xe8, 0x27, 0xf8, 0xfe,
4947 	0x9e, 0x43, 0xf7, 0xfe, 0x27, 0xf0, 0xfe, 0xdc, 0x01, 0xfe, 0x07, 0x4b,
4948 	0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x40, 0x1c, 0x25, 0xd2, 0xfe, 0x26, 0xf0,
4949 	0xfe, 0x56, 0x03, 0xfe, 0xa0, 0xf0, 0xfe, 0x44, 0x03, 0xfe, 0x11, 0xf0,
4950 	0x9c, 0xfe, 0xef, 0x10, 0xfe, 0x9f, 0xf0, 0xfe, 0x64, 0x03, 0xeb, 0x0f,
4951 	0xfe, 0x11, 0x00, 0x02, 0x5a, 0x2a, 0xfe, 0x48, 0x1c, 0xeb, 0x09, 0x04,
4952 	0x1d, 0xfe, 0x18, 0x13, 0x23, 0x1e, 0x98, 0xac, 0x12, 0x98, 0x0a, 0x40,
4953 	0x01, 0x0e, 0xac, 0x75, 0x01, 0xfe, 0xbc, 0x15, 0x11, 0xca, 0x25, 0xd2,
4954 	0xfe, 0x01, 0xf0, 0xd2, 0xfe, 0x82, 0xf0, 0xfe, 0x92, 0x03, 0xec, 0x11,
4955 	0xfe, 0xe4, 0x00, 0x65, 0xfe, 0xa4, 0x03, 0x25, 0x32, 0x1f, 0xfe, 0xb4,
4956 	0x03, 0x01, 0x43, 0xfe, 0x06, 0xf0, 0xfe, 0xc4, 0x03, 0x8d, 0x81, 0xfe,
4957 	0x0a, 0xf0, 0xfe, 0x7a, 0x06, 0x02, 0x22, 0x05, 0x6b, 0x28, 0x16, 0xfe,
4958 	0xf6, 0x04, 0x14, 0x2c, 0x01, 0x33, 0x8f, 0xfe, 0x66, 0x02, 0x02, 0xd1,
4959 	0xeb, 0x2a, 0x67, 0x1a, 0xfe, 0x67, 0x1b, 0xf8, 0xf7, 0xfe, 0x48, 0x1c,
4960 	0x70, 0x01, 0x6e, 0x87, 0x0a, 0x40, 0x01, 0x0e, 0x07, 0x00, 0x16, 0xd3,
4961 	0x0a, 0xca, 0x01, 0x0e, 0x74, 0x60, 0x59, 0x76, 0x27, 0x05, 0x6b, 0x28,
4962 	0xfe, 0x10, 0x12, 0x14, 0x2c, 0x01, 0x33, 0x8f, 0xfe, 0x66, 0x02, 0x02,
4963 	0xd1, 0xbc, 0x7d, 0xbd, 0x7f, 0x25, 0x22, 0x65, 0xfe, 0x3c, 0x04, 0x1f,
4964 	0xfe, 0x38, 0x04, 0x68, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
4965 	0x12, 0x2b, 0xff, 0x02, 0x00, 0x10, 0x01, 0x08, 0x1f, 0xfe, 0xe0, 0x04,
4966 	0x2b, 0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd5, 0xfe, 0x4c, 0x44, 0xfe,
4967 	0x4c, 0x12, 0x60, 0xfe, 0x44, 0x48, 0x13, 0x2c, 0xfe, 0x4c, 0x54, 0x64,
4968 	0xd3, 0x46, 0x76, 0x27, 0xfa, 0xef, 0xfe, 0x62, 0x13, 0x09, 0x04, 0x1d,
4969 	0xfe, 0x2a, 0x13, 0x2f, 0x07, 0x7e, 0xa5, 0xfe, 0x20, 0x10, 0x13, 0x2c,
4970 	0xfe, 0x4c, 0x54, 0x64, 0xd3, 0xfa, 0xef, 0x86, 0x09, 0x04, 0x1d, 0xfe,
4971 	0x08, 0x13, 0x2f, 0x07, 0x7e, 0x6e, 0x09, 0x04, 0x1d, 0xfe, 0x1c, 0x12,
4972 	0x14, 0x92, 0x09, 0x04, 0x06, 0x3b, 0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe,
4973 	0x70, 0x0c, 0x02, 0x22, 0x2b, 0x11, 0xfe, 0xe6, 0x00, 0xfe, 0x1c, 0x90,
4974 	0xf9, 0x03, 0x14, 0x92, 0x01, 0x33, 0x02, 0x29, 0xfe, 0x42, 0x5b, 0x67,
4975 	0x1a, 0xfe, 0x46, 0x59, 0xf8, 0xf7, 0xfe, 0x87, 0x80, 0xfe, 0x31, 0xe4,
4976 	0x4f, 0x09, 0x04, 0x0b, 0xfe, 0x78, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x1a,
4977 	0xfe, 0x70, 0x12, 0x49, 0x04, 0x06, 0xfe, 0x60, 0x13, 0x05, 0xfe, 0xa2,
4978 	0x00, 0x28, 0x16, 0xfe, 0x80, 0x05, 0xfe, 0x31, 0xe4, 0x6a, 0x49, 0x04,
4979 	0x0b, 0xfe, 0x4a, 0x13, 0x05, 0xfe, 0xa0, 0x00, 0x28, 0xfe, 0x42, 0x12,
4980 	0x5e, 0x01, 0x08, 0x25, 0x32, 0xf1, 0x01, 0x08, 0x26, 0xfe, 0x98, 0x05,
4981 	0x11, 0xfe, 0xe3, 0x00, 0x23, 0x49, 0xfe, 0x4a, 0xf0, 0xfe, 0x6a, 0x05,
4982 	0xfe, 0x49, 0xf0, 0xfe, 0x64, 0x05, 0x83, 0x24, 0xfe, 0x21, 0x00, 0xa1,
4983 	0x24, 0xfe, 0x22, 0x00, 0xa0, 0x24, 0x4c, 0xfe, 0x09, 0x48, 0x01, 0x08,
4984 	0x26, 0xfe, 0x98, 0x05, 0xfe, 0xe2, 0x08, 0x49, 0x04, 0xc5, 0x3b, 0x01,
4985 	0x86, 0x24, 0x06, 0x12, 0xcc, 0x37, 0xfe, 0x27, 0x01, 0x09, 0x04, 0x1d,
4986 	0xfe, 0x22, 0x12, 0x47, 0x01, 0xa7, 0x14, 0x92, 0x09, 0x04, 0x06, 0x3b,
4987 	0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe, 0x70, 0x0c, 0x02, 0x22, 0x05, 0xfe,
4988 	0x9c, 0x00, 0x28, 0xfe, 0x3e, 0x12, 0x05, 0x50, 0x28, 0xfe, 0x36, 0x13,
4989 	0x47, 0x01, 0xa7, 0x26, 0xfe, 0x08, 0x06, 0x0a, 0x06, 0x49, 0x04, 0x19,
4990 	0xfe, 0x02, 0x12, 0x5f, 0x01, 0xfe, 0xaa, 0x14, 0x1f, 0xfe, 0xfe, 0x05,
4991 	0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x50, 0xb4, 0x0c,
4992 	0x50, 0x05, 0xc6, 0x28, 0xfe, 0x62, 0x12, 0x05, 0x3f, 0x28, 0xfe, 0x5a,
4993 	0x13, 0x01, 0xfe, 0x14, 0x18, 0x01, 0xfe, 0x66, 0x18, 0xfe, 0x43, 0x48,
4994 	0xb7, 0x19, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0x1c, 0x3d,
4995 	0x85, 0xb7, 0x69, 0x47, 0x01, 0xa7, 0x26, 0xfe, 0x72, 0x06, 0x49, 0x04,
4996 	0x1b, 0xdf, 0x89, 0x0a, 0x4d, 0x01, 0xfe, 0xd8, 0x14, 0x1f, 0xfe, 0x68,
4997 	0x06, 0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x3f, 0xb4,
4998 	0x0c, 0x3f, 0x17, 0x06, 0x01, 0xa7, 0xec, 0x72, 0x70, 0x01, 0x6e, 0x87,
4999 	0x11, 0xfe, 0xe2, 0x00, 0x01, 0x08, 0x25, 0x32, 0xfe, 0x0a, 0xf0, 0xfe,
5000 	0xa6, 0x06, 0x8c, 0xfe, 0x5c, 0x07, 0xfe, 0x06, 0xf0, 0xfe, 0x64, 0x07,
5001 	0x8d, 0x81, 0x02, 0x22, 0x09, 0x04, 0x0b, 0xfe, 0x2e, 0x12, 0x15, 0x1a,
5002 	0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00,
5003 	0x01, 0x08, 0xfe, 0x99, 0xa4, 0x01, 0x08, 0x15, 0x00, 0x02, 0xfe, 0x32,
5004 	0x08, 0x61, 0x04, 0x1b, 0xfe, 0x38, 0x12, 0x09, 0x04, 0x1b, 0x6e, 0x15,
5005 	0xfe, 0x1b, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01,
5006 	0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x06, 0x01, 0x08, 0x15, 0x00, 0x02,
5007 	0xd9, 0x66, 0x4c, 0xfe, 0x3a, 0x55, 0x5f, 0xfe, 0x9a, 0x81, 0x4b, 0x1d,
5008 	0xba, 0xfe, 0x32, 0x07, 0x0a, 0x1d, 0xfe, 0x09, 0x6f, 0xaf, 0xfe, 0xca,
5009 	0x45, 0xfe, 0x32, 0x12, 0x62, 0x2c, 0x85, 0x66, 0x7b, 0x01, 0x08, 0x25,
5010 	0x32, 0xfe, 0x0a, 0xf0, 0xfe, 0x32, 0x07, 0x8d, 0x81, 0x8c, 0xfe, 0x5c,
5011 	0x07, 0x02, 0x22, 0x01, 0x43, 0x02, 0xfe, 0x8a, 0x06, 0x15, 0x19, 0x02,
5012 	0xfe, 0x8a, 0x06, 0xfe, 0x9c, 0xf7, 0xd4, 0xfe, 0x2c, 0x90, 0xfe, 0xae,
5013 	0x90, 0x77, 0xfe, 0xca, 0x07, 0x0c, 0x54, 0x18, 0x55, 0x09, 0x4a, 0x6a,
5014 	0x35, 0x1e, 0x20, 0x07, 0x10, 0xfe, 0x0e, 0x12, 0x74, 0xfe, 0x80, 0x80,
5015 	0x37, 0x20, 0x63, 0x27, 0xfe, 0x06, 0x10, 0xfe, 0x83, 0xe7, 0xc4, 0xa1,
5016 	0xfe, 0x03, 0x40, 0x09, 0x4a, 0x4f, 0x35, 0x01, 0xa8, 0xad, 0xfe, 0x1f,
5017 	0x40, 0x12, 0x58, 0x01, 0xa5, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe,
5018 	0x44, 0x51, 0xfe, 0xc6, 0x51, 0x83, 0xfb, 0xfe, 0x8a, 0x90, 0x0c, 0x52,
5019 	0x18, 0x53, 0xfe, 0x0c, 0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe,
5020 	0xc2, 0x50, 0x0c, 0x39, 0x18, 0x3a, 0xfe, 0x4a, 0x10, 0x09, 0x04, 0x6a,
5021 	0xfe, 0x2a, 0x12, 0xfe, 0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x54, 0x18,
5022 	0x55, 0x09, 0x04, 0x4f, 0x85, 0x01, 0xa8, 0xfe, 0x1f, 0x80, 0x12, 0x58,
5023 	0xfe, 0x44, 0x90, 0xfe, 0xc6, 0x90, 0x0c, 0x56, 0x18, 0x57, 0xfb, 0xfe,
5024 	0x8a, 0x90, 0x0c, 0x52, 0x18, 0x53, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90,
5025 	0x0c, 0x39, 0x18, 0x3a, 0x0c, 0x38, 0x18, 0x4e, 0x09, 0x4a, 0x19, 0x35,
5026 	0x2a, 0x13, 0xfe, 0x4e, 0x11, 0x65, 0xfe, 0x48, 0x08, 0xfe, 0x9e, 0xf0,
5027 	0xfe, 0x5c, 0x08, 0xb1, 0x16, 0x32, 0x2a, 0x73, 0xdd, 0xb8, 0xfe, 0x80,
5028 	0x08, 0xb9, 0xfe, 0x9e, 0x08, 0x8c, 0xfe, 0x74, 0x08, 0xfe, 0x06, 0xf0,
5029 	0xfe, 0x7a, 0x08, 0x8d, 0x81, 0x02, 0x22, 0x01, 0x43, 0xfe, 0xc9, 0x10,
5030 	0x15, 0x19, 0xfe, 0xc9, 0x10, 0x61, 0x04, 0x06, 0xfe, 0x10, 0x12, 0x61,
5031 	0x04, 0x0b, 0x45, 0x09, 0x04, 0x0b, 0xfe, 0x68, 0x12, 0xfe, 0x2e, 0x1c,
5032 	0x02, 0xfe, 0x24, 0x0a, 0x61, 0x04, 0x06, 0x45, 0x61, 0x04, 0x0b, 0xfe,
5033 	0x52, 0x12, 0xfe, 0x2c, 0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0x1e, 0x09, 0xfe,
5034 	0xac, 0xf0, 0xfe, 0xbe, 0x08, 0xfe, 0x8a, 0x10, 0xaa, 0xfe, 0xf3, 0x10,
5035 	0xfe, 0xad, 0xf0, 0xfe, 0xca, 0x08, 0x02, 0xfe, 0x24, 0x0a, 0xab, 0xfe,
5036 	0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0x9d, 0xe9, 0x1c, 0xfe, 0x00, 0xfe, 0xfe,
5037 	0x1c, 0x12, 0xb5, 0xfe, 0xd2, 0xf0, 0x9d, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
5038 	0x16, 0x9d, 0x05, 0xcb, 0x1c, 0x06, 0x16, 0x9d, 0xb8, 0x6d, 0xb9, 0x6d,
5039 	0xaa, 0xab, 0xfe, 0xb1, 0x10, 0x70, 0x5e, 0x2b, 0x14, 0x92, 0x01, 0x33,
5040 	0x0f, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x5a, 0x0f, 0x7c, 0x02, 0x5a,
5041 	0xfe, 0x74, 0x18, 0x1c, 0xfe, 0x00, 0xf8, 0x16, 0x6d, 0x67, 0x1b, 0x01,
5042 	0xfe, 0x44, 0x0d, 0x3b, 0x01, 0xe6, 0x1e, 0x27, 0x74, 0x67, 0x1a, 0x02,
5043 	0x6d, 0x09, 0x04, 0x0b, 0x21, 0xfe, 0x06, 0x0a, 0x09, 0x04, 0x6a, 0xfe,
5044 	0x82, 0x12, 0x09, 0x04, 0x19, 0xfe, 0x66, 0x13, 0x1e, 0x58, 0xac, 0xfc,
5045 	0xfe, 0x83, 0x80, 0xfe, 0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91,
5046 	0xfe, 0x86, 0x91, 0x63, 0x27, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x77,
5047 	0xd7, 0x05, 0x54, 0x31, 0x55, 0x0c, 0x7b, 0x18, 0x7c, 0xbe, 0x54, 0xbf,
5048 	0x55, 0x01, 0xa8, 0xad, 0x63, 0x27, 0x12, 0x58, 0xc0, 0x38, 0xc1, 0x4e,
5049 	0x79, 0x56, 0x68, 0x57, 0xf4, 0xf5, 0xfe, 0x04, 0xfa, 0x38, 0xfe, 0x05,
5050 	0xfa, 0x4e, 0x01, 0xa5, 0xa2, 0x23, 0x0c, 0x7b, 0x0c, 0x7c, 0x79, 0x56,
5051 	0x68, 0x57, 0xfe, 0x12, 0x10, 0x09, 0x04, 0x19, 0x16, 0xd7, 0x79, 0x39,
5052 	0x68, 0x3a, 0x09, 0x04, 0xfe, 0xf7, 0x00, 0x35, 0x05, 0x52, 0x31, 0x53,
5053 	0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59,
5054 	0x02, 0x6d, 0x09, 0x04, 0x19, 0x16, 0xd7, 0x09, 0x04, 0xfe, 0xf7, 0x00,
5055 	0x35, 0xfe, 0x3a, 0x55, 0xfe, 0x19, 0x81, 0x5f, 0xfe, 0x10, 0x90, 0xfe,
5056 	0x92, 0x90, 0xfe, 0xd7, 0x10, 0x2f, 0x07, 0x9b, 0x16, 0xfe, 0xc6, 0x08,
5057 	0x11, 0x9b, 0x09, 0x04, 0x0b, 0xfe, 0x14, 0x13, 0x05, 0x39, 0x31, 0x3a,
5058 	0x77, 0xfe, 0xc6, 0x08, 0xfe, 0x0c, 0x58, 0xfe, 0x8d, 0x58, 0x02, 0x6d,
5059 	0x23, 0x47, 0xfe, 0x19, 0x80, 0xde, 0x09, 0x04, 0x0b, 0xfe, 0x1a, 0x12,
5060 	0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41, 0xe9, 0xb5, 0xfe, 0xd1, 0xf0, 0xd9,
5061 	0x14, 0x7a, 0x01, 0x33, 0x0f, 0xfe, 0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe,
5062 	0x6c, 0x19, 0xbe, 0x39, 0xfe, 0xed, 0x19, 0xbf, 0x3a, 0xfe, 0x0c, 0x51,
5063 	0xfe, 0x8e, 0x51, 0xe9, 0x1c, 0xfe, 0x00, 0xff, 0x34, 0xfe, 0x74, 0x10,
5064 	0xb5, 0xfe, 0xd2, 0xf0, 0xfe, 0xb2, 0x0a, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
5065 	0x84, 0x05, 0xcb, 0x1c, 0x06, 0xfe, 0x08, 0x13, 0x0f, 0xfe, 0x16, 0x00,
5066 	0x02, 0x5a, 0xfe, 0xd1, 0xf0, 0xfe, 0xc4, 0x0a, 0x14, 0x7a, 0x01, 0x33,
5067 	0x0f, 0xfe, 0x17, 0x00, 0xfe, 0x42, 0x10, 0xfe, 0xce, 0xf0, 0xfe, 0xca,
5068 	0x0a, 0xfe, 0x3c, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xd6, 0x0a, 0x0f, 0xfe,
5069 	0x22, 0x00, 0x02, 0x5a, 0xfe, 0xcb, 0xf0, 0xfe, 0xe2, 0x0a, 0x0f, 0xfe,
5070 	0x24, 0x00, 0x02, 0x5a, 0xfe, 0xd0, 0xf0, 0xfe, 0xec, 0x0a, 0x0f, 0x93,
5071 	0xdc, 0xfe, 0xcf, 0xf0, 0xfe, 0xf6, 0x0a, 0x0f, 0x4c, 0xfe, 0x10, 0x10,
5072 	0xfe, 0xcc, 0xf0, 0xd9, 0x61, 0x04, 0x19, 0x3b, 0x0f, 0xfe, 0x12, 0x00,
5073 	0x2a, 0x13, 0xfe, 0x4e, 0x11, 0x65, 0xfe, 0x0c, 0x0b, 0xfe, 0x9e, 0xf0,
5074 	0xfe, 0x20, 0x0b, 0xb1, 0x16, 0x32, 0x2a, 0x73, 0xdd, 0xb8, 0x22, 0xb9,
5075 	0x22, 0x2a, 0xec, 0x65, 0xfe, 0x2c, 0x0b, 0x25, 0x32, 0x8c, 0xfe, 0x48,
5076 	0x0b, 0x8d, 0x81, 0xb8, 0xd4, 0xb9, 0xd4, 0x02, 0x22, 0x01, 0x43, 0xfe,
5077 	0xdb, 0x10, 0x11, 0xfe, 0xe8, 0x00, 0xaa, 0xab, 0x70, 0xbc, 0x7d, 0xbd,
5078 	0x7f, 0xfe, 0x89, 0xf0, 0x22, 0x30, 0x2e, 0xd8, 0xbc, 0x7d, 0xbd, 0x7f,
5079 	0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd6, 0xb1, 0x45, 0x0f, 0xfe, 0x42,
5080 	0x00, 0x02, 0x5a, 0x78, 0x06, 0xfe, 0x81, 0x49, 0x16, 0xfe, 0x38, 0x0c,
5081 	0x09, 0x04, 0x0b, 0xfe, 0x44, 0x13, 0x0f, 0x00, 0x4b, 0x0b, 0xfe, 0x54,
5082 	0x12, 0x4b, 0xfe, 0x28, 0x00, 0x21, 0xfe, 0xa6, 0x0c, 0x0a, 0x40, 0x01,
5083 	0x0e, 0x07, 0x00, 0x5d, 0x3e, 0xfe, 0x28, 0x00, 0xfe, 0xe2, 0x10, 0x01,
5084 	0xe7, 0x01, 0xe8, 0x0a, 0x99, 0x01, 0xfe, 0x32, 0x0e, 0x59, 0x11, 0x2d,
5085 	0x01, 0x6f, 0x02, 0x29, 0x0f, 0xfe, 0x44, 0x00, 0x4b, 0x0b, 0xdf, 0x3e,
5086 	0x0b, 0xfe, 0xb4, 0x10, 0x01, 0x86, 0x3e, 0x0b, 0xfe, 0xaa, 0x10, 0x01,
5087 	0x86, 0xfe, 0x19, 0x82, 0xfe, 0x34, 0x46, 0xa3, 0x3e, 0x0b, 0x0f, 0xfe,
5088 	0x43, 0x00, 0xfe, 0x96, 0x10, 0x09, 0x4a, 0x0b, 0x35, 0x01, 0xe7, 0x01,
5089 	0xe8, 0x59, 0x11, 0x2d, 0x01, 0x6f, 0x67, 0x0b, 0x59, 0x3c, 0x8a, 0x02,
5090 	0xfe, 0x2a, 0x03, 0x09, 0x04, 0x0b, 0x84, 0x3e, 0x0b, 0x0f, 0x00, 0xfe,
5091 	0x5c, 0x10, 0x61, 0x04, 0x1b, 0xfe, 0x58, 0x12, 0x09, 0x04, 0x1b, 0xfe,
5092 	0x50, 0x13, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x5c, 0x0c, 0xfe,
5093 	0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x62, 0x0c, 0x09, 0x4a, 0x1b, 0x35,
5094 	0xfe, 0xa9, 0x10, 0x0f, 0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0b, 0x5f,
5095 	0x5c, 0x0f, 0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x0f, 0xfe, 0x47, 0x00,
5096 	0xa1, 0x0f, 0xfe, 0x41, 0x00, 0xa0, 0x0f, 0xfe, 0x24, 0x00, 0x87, 0xaa,
5097 	0xab, 0x70, 0x05, 0x6b, 0x28, 0x21, 0xd1, 0x5f, 0xfe, 0x04, 0xe6, 0x1b,
5098 	0xfe, 0x9d, 0x41, 0xfe, 0x1c, 0x42, 0x59, 0x01, 0xda, 0x02, 0x29, 0xea,
5099 	0x14, 0x0b, 0x37, 0x95, 0xa9, 0x14, 0xfe, 0x31, 0x00, 0x37, 0x97, 0x01,
5100 	0xfe, 0x54, 0x0f, 0x02, 0xd0, 0x3c, 0xfe, 0x06, 0xec, 0xc9, 0xee, 0x3e,
5101 	0x1d, 0xfe, 0xce, 0x45, 0x34, 0x3c, 0xfe, 0x06, 0xea, 0xc9, 0xfe, 0x47,
5102 	0x4b, 0x89, 0xfe, 0x75, 0x57, 0x05, 0x51, 0xfe, 0x98, 0x56, 0xfe, 0x38,
5103 	0x12, 0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x44, 0x48, 0x46, 0x09, 0x04, 0x1d,
5104 	0xfe, 0x1a, 0x13, 0x0a, 0x40, 0x01, 0x0e, 0x47, 0xfe, 0x41, 0x58, 0x0a,
5105 	0x99, 0x01, 0x0e, 0xfe, 0x49, 0x54, 0x8e, 0xfe, 0x2a, 0x0d, 0x02, 0xfe,
5106 	0x2a, 0x03, 0x0a, 0x51, 0xfe, 0xee, 0x14, 0xee, 0x3e, 0x1d, 0xfe, 0xce,
5107 	0x45, 0x34, 0x3c, 0xfe, 0xce, 0x47, 0xfe, 0xad, 0x13, 0x02, 0x29, 0x1e,
5108 	0x20, 0x07, 0x10, 0xfe, 0x9e, 0x12, 0x23, 0x12, 0x4d, 0x12, 0x94, 0x12,
5109 	0xce, 0x1e, 0x2d, 0x47, 0x37, 0x2d, 0xb1, 0xe0, 0xfe, 0xbc, 0xf0, 0xfe,
5110 	0xec, 0x0d, 0x13, 0x06, 0x12, 0x4d, 0x01, 0xfe, 0xe2, 0x15, 0x05, 0xfe,
5111 	0x38, 0x01, 0x31, 0xfe, 0x3a, 0x01, 0x77, 0xfe, 0xf0, 0x0d, 0xfe, 0x02,
5112 	0xec, 0xce, 0x62, 0x00, 0x5d, 0xfe, 0x04, 0xec, 0x20, 0x46, 0xfe, 0x05,
5113 	0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x52, 0x16, 0xfb, 0xfe, 0x48, 0xf4,
5114 	0x0d, 0xfe, 0x18, 0x13, 0xaf, 0xfe, 0x02, 0xea, 0xce, 0x62, 0x7a, 0xfe,
5115 	0xc5, 0x13, 0x14, 0x1b, 0x37, 0x95, 0xa9, 0x5c, 0x05, 0xfe, 0x38, 0x01,
5116 	0x1c, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x05, 0xfe, 0x3a, 0x01,
5117 	0x0c, 0xfe, 0x62, 0x01, 0x3d, 0x12, 0x20, 0x24, 0x06, 0x12, 0x2d, 0x11,
5118 	0x2d, 0x8a, 0x13, 0x06, 0x03, 0x23, 0x03, 0x1e, 0x4d, 0xfe, 0xf7, 0x12,
5119 	0x1e, 0x94, 0xac, 0x12, 0x94, 0x07, 0x7a, 0xfe, 0x71, 0x13, 0xfe, 0x24,
5120 	0x1c, 0x14, 0x1a, 0x37, 0x95, 0xa9, 0xfe, 0xd9, 0x10, 0xb6, 0xfe, 0x03,
5121 	0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x03, 0xb6, 0xfe, 0x03, 0xdc,
5122 	0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x03, 0xfe, 0x03, 0x57, 0xb6, 0x23,
5123 	0xfe, 0x00, 0xcc, 0x03, 0xfe, 0x03, 0x57, 0xb6, 0x75, 0x03, 0x09, 0x04,
5124 	0x4c, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
5125 	0xfe, 0x1e, 0x80, 0xe1, 0xfe, 0x1d, 0x80, 0xa4, 0xfe, 0x0c, 0x90, 0xfe,
5126 	0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xa3, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
5127 	0x0b, 0xfe, 0x3c, 0x50, 0xa0, 0x01, 0xfe, 0x82, 0x16, 0x2f, 0x07, 0x2d,
5128 	0xe0, 0x01, 0xfe, 0xbc, 0x15, 0x09, 0x04, 0x1d, 0x45, 0x01, 0xe7, 0x01,
5129 	0xe8, 0x11, 0xfe, 0xe9, 0x00, 0x09, 0x04, 0x4c, 0xfe, 0x2c, 0x13, 0x01,
5130 	0xfe, 0x14, 0x16, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
5131 	0x0c, 0xfe, 0x64, 0x01, 0x18, 0xfe, 0x66, 0x01, 0x09, 0x04, 0x4f, 0xfe,
5132 	0x12, 0x12, 0xfe, 0x03, 0x80, 0x74, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
5133 	0x40, 0x12, 0x20, 0x63, 0x27, 0x11, 0xc8, 0x59, 0x1e, 0x20, 0xed, 0x76,
5134 	0x20, 0x03, 0xfe, 0x08, 0x1c, 0x05, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
5135 	0x05, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x05, 0xfe, 0xb0, 0x00, 0xfe,
5136 	0x08, 0x58, 0x05, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
5137 	0x24, 0x69, 0x12, 0xc9, 0x23, 0x0c, 0x50, 0x0c, 0x3f, 0x13, 0x40, 0x48,
5138 	0x5f, 0x17, 0x1d, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x21, 0xfe, 0x08,
5139 	0x0f, 0x3e, 0x10, 0x13, 0x42, 0x48, 0x17, 0x4c, 0xfe, 0x90, 0x4d, 0xfe,
5140 	0x91, 0x54, 0x21, 0xfe, 0x1e, 0x0f, 0x24, 0x10, 0x12, 0x20, 0x78, 0x2c,
5141 	0x46, 0x1e, 0x20, 0xed, 0x76, 0x20, 0x11, 0xc8, 0xf6, 0xfe, 0xd6, 0xf0,
5142 	0xfe, 0x32, 0x0f, 0xea, 0x70, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
5143 	0x18, 0x1c, 0x03, 0x3c, 0xfe, 0x0c, 0x14, 0xee, 0xfe, 0x07, 0xe6, 0x1d,
5144 	0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x03, 0x01, 0x86, 0x78, 0x2c, 0x46,
5145 	0xfa, 0xef, 0xfe, 0x42, 0x13, 0x2f, 0x07, 0x2d, 0xfe, 0x34, 0x13, 0x0a,
5146 	0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x36, 0x12, 0xf0, 0xfe, 0x45, 0x48, 0x01,
5147 	0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13, 0x3d, 0x75, 0x07, 0x10,
5148 	0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xfe, 0x80, 0x5c, 0x01, 0x6f, 0xfe, 0x0e,
5149 	0x10, 0x07, 0x7e, 0x45, 0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x6c, 0x0f, 0x03,
5150 	0xfe, 0x44, 0x58, 0x74, 0xfe, 0x01, 0xec, 0x97, 0xfe, 0x9e, 0x40, 0xfe,
5151 	0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x1b, 0x76, 0x27, 0x01, 0xda, 0xfe,
5152 	0xdd, 0x10, 0x2a, 0xbc, 0x7d, 0xbd, 0x7f, 0x30, 0x2e, 0xd5, 0x07, 0x1b,
5153 	0xfe, 0x48, 0x12, 0x07, 0x0b, 0xfe, 0x56, 0x12, 0x07, 0x1a, 0xfe, 0x30,
5154 	0x12, 0x07, 0xc2, 0x16, 0xfe, 0x3e, 0x11, 0x07, 0xfe, 0x23, 0x00, 0x16,
5155 	0xfe, 0x4a, 0x11, 0x07, 0x06, 0x16, 0xfe, 0xa8, 0x11, 0x07, 0x19, 0xfe,
5156 	0x12, 0x12, 0x07, 0x00, 0x16, 0x22, 0x14, 0xc2, 0x01, 0x33, 0x9f, 0x2b,
5157 	0x01, 0x08, 0x8c, 0x43, 0x03, 0x2b, 0xfe, 0x62, 0x08, 0x0a, 0xca, 0x01,
5158 	0xfe, 0x32, 0x0e, 0x11, 0x7e, 0x02, 0x29, 0x2b, 0x2f, 0x07, 0x9b, 0xfe,
5159 	0xd9, 0x13, 0x79, 0x39, 0x68, 0x3a, 0x77, 0xfe, 0xfc, 0x10, 0x09, 0x04,
5160 	0x6a, 0xfe, 0x72, 0x12, 0xc0, 0x38, 0xc1, 0x4e, 0xf4, 0xf5, 0x8e, 0xfe,
5161 	0xc6, 0x10, 0x1e, 0x58, 0xfe, 0x26, 0x13, 0x05, 0x7b, 0x31, 0x7c, 0x77,
5162 	0xfe, 0x82, 0x0c, 0x0c, 0x54, 0x18, 0x55, 0x23, 0x0c, 0x7b, 0x0c, 0x7c,
5163 	0x01, 0xa8, 0x24, 0x69, 0x73, 0x12, 0x58, 0x01, 0xa5, 0xc0, 0x38, 0xc1,
5164 	0x4e, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x38, 0xfe,
5165 	0x05, 0xfa, 0x4e, 0xfe, 0x91, 0x10, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x40,
5166 	0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x56, 0x18, 0x57, 0x83, 0xc0, 0x38, 0xc1,
5167 	0x4e, 0xf4, 0xf5, 0x05, 0x52, 0x31, 0x53, 0xfe, 0x00, 0x56, 0xfe, 0xa1,
5168 	0x56, 0x0c, 0x52, 0x18, 0x53, 0x09, 0x04, 0x6a, 0xfe, 0x1e, 0x12, 0x1e,
5169 	0x58, 0xfe, 0x1f, 0x40, 0x05, 0x54, 0x31, 0x55, 0xfe, 0x2c, 0x50, 0xfe,
5170 	0xae, 0x50, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x44, 0x50, 0xfe, 0xc6, 0x50,
5171 	0x05, 0x52, 0x31, 0x53, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x05, 0x39,
5172 	0x31, 0x3a, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x02, 0x5c, 0x24, 0x06,
5173 	0x12, 0xcd, 0x02, 0x5b, 0x2b, 0x01, 0x08, 0x1f, 0x44, 0x30, 0x2e, 0xd5,
5174 	0x07, 0x06, 0x21, 0x44, 0x2f, 0x07, 0x9b, 0x21, 0x5b, 0x01, 0x6e, 0x1c,
5175 	0x3d, 0x16, 0x44, 0x09, 0x04, 0x0b, 0xe2, 0x79, 0x39, 0x68, 0x3a, 0xfe,
5176 	0x0a, 0x55, 0x34, 0xfe, 0x8b, 0x55, 0xbe, 0x39, 0xbf, 0x3a, 0xfe, 0x0c,
5177 	0x51, 0xfe, 0x8e, 0x51, 0x02, 0x5b, 0xfe, 0x19, 0x81, 0xaf, 0xfe, 0x19,
5178 	0x41, 0x02, 0x5b, 0x2b, 0x01, 0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e,
5179 	0xd8, 0x4b, 0x1a, 0xfe, 0xa6, 0x12, 0x4b, 0x0b, 0x3b, 0x02, 0x44, 0x01,
5180 	0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e, 0xd6, 0x07, 0x1a, 0x21, 0x44,
5181 	0x01, 0x08, 0x1f, 0xa2, 0x30, 0x2e, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49,
5182 	0x60, 0x05, 0xfe, 0x9c, 0x00, 0x28, 0x84, 0x49, 0x04, 0x19, 0x34, 0x9f,
5183 	0xfe, 0xbb, 0x45, 0x4b, 0x00, 0x45, 0x3e, 0x06, 0x78, 0x3d, 0xfe, 0xda,
5184 	0x14, 0x01, 0x6e, 0x87, 0xfe, 0x4b, 0x45, 0xe2, 0x2f, 0x07, 0x9a, 0xe1,
5185 	0x05, 0xc6, 0x28, 0x84, 0x05, 0x3f, 0x28, 0x34, 0x5e, 0x02, 0x5b, 0xfe,
5186 	0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17, 0x05, 0x50, 0xb4, 0x0c,
5187 	0x50, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe, 0xaa, 0x14, 0x02,
5188 	0x5c, 0x01, 0x08, 0x25, 0x32, 0x1f, 0x44, 0x30, 0x2e, 0xd6, 0x07, 0x06,
5189 	0x21, 0x44, 0x01, 0xfe, 0x8e, 0x13, 0xfe, 0x42, 0x58, 0xfe, 0x82, 0x14,
5190 	0xfe, 0xa4, 0x14, 0x87, 0xfe, 0x4a, 0xf4, 0x0b, 0x16, 0x44, 0xfe, 0x4a,
5191 	0xf4, 0x06, 0xfe, 0x0c, 0x12, 0x2f, 0x07, 0x9a, 0x85, 0x02, 0x5b, 0x05,
5192 	0x3f, 0xb4, 0x0c, 0x3f, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe,
5193 	0xd8, 0x14, 0x02, 0x5c, 0x13, 0x06, 0x65, 0xfe, 0xca, 0x12, 0x26, 0xfe,
5194 	0xe0, 0x12, 0x72, 0xf1, 0x01, 0x08, 0x23, 0x72, 0x03, 0x8f, 0xfe, 0xdc,
5195 	0x12, 0x25, 0xfe, 0xdc, 0x12, 0x1f, 0xfe, 0xca, 0x12, 0x5e, 0x2b, 0x01,
5196 	0x08, 0xfe, 0xd5, 0x10, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
5197 	0x1c, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x03, 0x13,
5198 	0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0x1c, 0x3d, 0xfe, 0x30, 0x56,
5199 	0xfe, 0x00, 0x5c, 0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
5200 	0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0xfe, 0x0b, 0x58,
5201 	0x03, 0x0a, 0x50, 0x01, 0x82, 0x0a, 0x3f, 0x01, 0x82, 0x03, 0xfc, 0x1c,
5202 	0x10, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x19, 0x48, 0xfe, 0x00,
5203 	0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c, 0x63, 0x27,
5204 	0x0c, 0x52, 0x18, 0x53, 0xbe, 0x56, 0xbf, 0x57, 0x03, 0xfe, 0x62, 0x08,
5205 	0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x74, 0x03, 0x01,
5206 	0xfe, 0x14, 0x18, 0xfe, 0x42, 0x48, 0x5f, 0x60, 0x89, 0x01, 0x08, 0x1f,
5207 	0xfe, 0xa2, 0x14, 0x30, 0x2e, 0xd8, 0x01, 0x08, 0x1f, 0xfe, 0xa2, 0x14,
5208 	0x30, 0x2e, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x05, 0xc6, 0x28, 0xfe,
5209 	0xcc, 0x12, 0x49, 0x04, 0x1b, 0xfe, 0xc4, 0x13, 0x23, 0x62, 0x1b, 0xe2,
5210 	0x4b, 0xc3, 0x64, 0xfe, 0xe8, 0x13, 0x3b, 0x13, 0x06, 0x17, 0xc3, 0x78,
5211 	0xdb, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xa1, 0xff, 0x02, 0x83,
5212 	0x55, 0x62, 0x1a, 0xa4, 0xbb, 0xfe, 0x30, 0x00, 0x8e, 0xe4, 0x17, 0x2c,
5213 	0x13, 0x06, 0xfe, 0x56, 0x10, 0x62, 0x0b, 0xe1, 0xbb, 0xfe, 0x64, 0x00,
5214 	0x8e, 0xe4, 0x0a, 0xfe, 0x64, 0x00, 0x17, 0x93, 0x13, 0x06, 0xfe, 0x28,
5215 	0x10, 0x62, 0x06, 0xfe, 0x60, 0x13, 0xbb, 0xfe, 0xc8, 0x00, 0x8e, 0xe4,
5216 	0x0a, 0xfe, 0xc8, 0x00, 0x17, 0x4d, 0x13, 0x06, 0x83, 0xbb, 0xfe, 0x90,
5217 	0x01, 0xba, 0xfe, 0x4e, 0x14, 0x89, 0xfe, 0x12, 0x10, 0xfe, 0x43, 0xf4,
5218 	0x94, 0xfe, 0x56, 0xf0, 0xfe, 0x60, 0x14, 0xfe, 0x04, 0xf4, 0x6c, 0xfe,
5219 	0x43, 0xf4, 0x93, 0xfe, 0xf3, 0x10, 0xf9, 0x01, 0xfe, 0x22, 0x13, 0x1c,
5220 	0x3d, 0xfe, 0x10, 0x13, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x69, 0xba,
5221 	0xfe, 0x9c, 0x14, 0xb7, 0x69, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe,
5222 	0x4d, 0xe4, 0x19, 0xba, 0xfe, 0x9c, 0x14, 0xb7, 0x19, 0x83, 0x60, 0x23,
5223 	0xfe, 0x4d, 0xf4, 0x00, 0xdf, 0x89, 0x13, 0x06, 0xfe, 0xb4, 0x56, 0xfe,
5224 	0xc3, 0x58, 0x03, 0x60, 0x13, 0x0b, 0x03, 0x15, 0x06, 0x01, 0x08, 0x26,
5225 	0xe5, 0x15, 0x0b, 0x01, 0x08, 0x26, 0xe5, 0x15, 0x1a, 0x01, 0x08, 0x26,
5226 	0xe5, 0x72, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x03, 0x15, 0x06, 0x01, 0x08,
5227 	0x26, 0xa6, 0x15, 0x1a, 0x01, 0x08, 0x26, 0xa6, 0x15, 0x06, 0x01, 0x08,
5228 	0x26, 0xa6, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x26, 0xa6, 0x72, 0xfe, 0x89,
5229 	0x4a, 0x01, 0x08, 0x03, 0x60, 0x03, 0x1e, 0xcc, 0x07, 0x06, 0xfe, 0x44,
5230 	0x13, 0xad, 0x12, 0xcc, 0xfe, 0x49, 0xf4, 0x00, 0x3b, 0x72, 0x9f, 0x5e,
5231 	0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xf1, 0x01, 0x08, 0x2f, 0x07, 0xfe,
5232 	0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1f, 0xfe, 0x5a, 0x15, 0x23, 0x12, 0xcd,
5233 	0x01, 0x43, 0x1e, 0xcd, 0x07, 0x06, 0x45, 0x09, 0x4a, 0x06, 0x35, 0x03,
5234 	0x0a, 0x42, 0x01, 0x0e, 0xed, 0x88, 0x07, 0x10, 0xa4, 0x0a, 0x80, 0x01,
5235 	0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03, 0x0a, 0x80, 0x01, 0x0e, 0x88,
5236 	0xfe, 0x80, 0xe7, 0x10, 0x07, 0x10, 0x84, 0xfe, 0x45, 0x58, 0x01, 0xe3,
5237 	0x88, 0x03, 0x0a, 0x42, 0x01, 0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03,
5238 	0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x80, 0x80, 0xf2, 0xfe, 0x49, 0xe4, 0x10,
5239 	0xa4, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x0a, 0x51, 0x01, 0x82, 0x03, 0x17,
5240 	0x10, 0x71, 0x66, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde,
5241 	0xfe, 0x24, 0x1c, 0xfe, 0x1d, 0xf7, 0x1d, 0x90, 0xfe, 0xf6, 0x15, 0x01,
5242 	0xfe, 0xfc, 0x16, 0xe0, 0x91, 0x1d, 0x66, 0xfe, 0x2c, 0x01, 0xfe, 0x2f,
5243 	0x19, 0x03, 0xae, 0x21, 0xfe, 0xe6, 0x15, 0xfe, 0xda, 0x10, 0x17, 0x10,
5244 	0x71, 0x05, 0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x19, 0xfe, 0x18, 0x58,
5245 	0x05, 0xfe, 0x66, 0x01, 0xfe, 0x19, 0x58, 0x91, 0x19, 0xfe, 0x3c, 0x90,
5246 	0xfe, 0x30, 0xf4, 0x06, 0xfe, 0x3c, 0x50, 0x66, 0xfe, 0x38, 0x00, 0xfe,
5247 	0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x19, 0x90, 0xfe, 0x40, 0x16, 0xfe, 0xb6,
5248 	0x14, 0x34, 0x03, 0xae, 0x21, 0xfe, 0x18, 0x16, 0xfe, 0x9c, 0x10, 0x17,
5249 	0x10, 0x71, 0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe,
5250 	0x1d, 0xf7, 0x38, 0x90, 0xfe, 0x62, 0x16, 0xfe, 0x94, 0x14, 0xfe, 0x10,
5251 	0x13, 0x91, 0x38, 0x66, 0x1b, 0xfe, 0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00,
5252 	0x03, 0xae, 0x21, 0xfe, 0x56, 0x16, 0xfe, 0x6c, 0x10, 0x17, 0x10, 0x71,
5253 	0xfe, 0x30, 0xbc, 0xfe, 0xb2, 0xbc, 0x91, 0xc5, 0x66, 0x1b, 0xfe, 0x0f,
5254 	0x79, 0xfe, 0x1c, 0xf7, 0xc5, 0x90, 0xfe, 0x9a, 0x16, 0xfe, 0x5c, 0x14,
5255 	0x34, 0x03, 0xae, 0x21, 0xfe, 0x86, 0x16, 0xfe, 0x42, 0x10, 0xfe, 0x02,
5256 	0xf6, 0x10, 0x71, 0xfe, 0x18, 0xfe, 0x54, 0xfe, 0x19, 0xfe, 0x55, 0xfc,
5257 	0xfe, 0x1d, 0xf7, 0x4f, 0x90, 0xfe, 0xc0, 0x16, 0xfe, 0x36, 0x14, 0xfe,
5258 	0x1c, 0x13, 0x91, 0x4f, 0x47, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe,
5259 	0x80, 0xe7, 0x10, 0xfe, 0x81, 0xe7, 0x10, 0x11, 0xfe, 0xdd, 0x00, 0x63,
5260 	0x27, 0x03, 0x63, 0x27, 0xfe, 0x12, 0x45, 0x21, 0xfe, 0xb0, 0x16, 0x14,
5261 	0x06, 0x37, 0x95, 0xa9, 0x02, 0x29, 0xfe, 0x39, 0xf0, 0xfe, 0x04, 0x17,
5262 	0x23, 0x03, 0xfe, 0x7e, 0x18, 0x1c, 0x1a, 0x5d, 0x13, 0x0d, 0x03, 0x71,
5263 	0x05, 0xcb, 0x1c, 0x06, 0xfe, 0xef, 0x12, 0xfe, 0xe1, 0x10, 0x78, 0x2c,
5264 	0x46, 0x2f, 0x07, 0x2d, 0xfe, 0x3c, 0x13, 0xfe, 0x82, 0x14, 0xfe, 0x42,
5265 	0x13, 0x3c, 0x8a, 0x0a, 0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x3e, 0x12, 0xf0,
5266 	0xfe, 0x45, 0x48, 0x01, 0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13,
5267 	0x3d, 0x75, 0x07, 0x10, 0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x01, 0x6f,
5268 	0xfe, 0x16, 0x10, 0x07, 0x7e, 0x85, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12,
5269 	0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x24, 0x17, 0x17, 0x0b, 0x03, 0xfe, 0x9c,
5270 	0xe7, 0x0b, 0x0f, 0xfe, 0x15, 0x00, 0x59, 0x76, 0x27, 0x01, 0xda, 0x17,
5271 	0x06, 0x03, 0x3c, 0x8a, 0x09, 0x4a, 0x1d, 0x35, 0x11, 0x2d, 0x01, 0x6f,
5272 	0x17, 0x06, 0x03, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x79, 0xc7, 0x68,
5273 	0xc8, 0xfe, 0x48, 0x55, 0x34, 0xfe, 0xc9, 0x55, 0x03, 0x1e, 0x98, 0x73,
5274 	0x12, 0x98, 0x03, 0x0a, 0x99, 0x01, 0x0e, 0xf0, 0x0a, 0x40, 0x01, 0x0e,
5275 	0xfe, 0x49, 0x44, 0x16, 0xfe, 0xf0, 0x17, 0x73, 0x75, 0x03, 0x0a, 0x42,
5276 	0x01, 0x0e, 0x07, 0x10, 0x45, 0x0a, 0x51, 0x01, 0x9e, 0x0a, 0x40, 0x01,
5277 	0x0e, 0x73, 0x75, 0x03, 0xfe, 0x4e, 0xe4, 0x1a, 0x64, 0xfe, 0x24, 0x18,
5278 	0x05, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0x5b, 0xfe, 0x4e, 0xe4, 0xc2,
5279 	0x64, 0xfe, 0x36, 0x18, 0x05, 0xfe, 0x92, 0x00, 0xfe, 0x02, 0xe6, 0x1b,
5280 	0xdc, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x64, 0xfe, 0x48, 0x18, 0x05,
5281 	0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x19, 0xfe, 0x08, 0x10, 0x05, 0xfe,
5282 	0x96, 0x00, 0xfe, 0x02, 0xe6, 0x2c, 0xfe, 0x4e, 0x45, 0xfe, 0x0c, 0x12,
5283 	0xaf, 0xff, 0x04, 0x68, 0x54, 0xde, 0x1c, 0x69, 0x03, 0x07, 0x7a, 0xfe,
5284 	0x5a, 0xf0, 0xfe, 0x74, 0x18, 0x24, 0xfe, 0x09, 0x00, 0xfe, 0x34, 0x10,
5285 	0x07, 0x1b, 0xfe, 0x5a, 0xf0, 0xfe, 0x82, 0x18, 0x24, 0xc3, 0xfe, 0x26,
5286 	0x10, 0x07, 0x1a, 0x5d, 0x24, 0x2c, 0xdc, 0x07, 0x0b, 0x5d, 0x24, 0x93,
5287 	0xfe, 0x0e, 0x10, 0x07, 0x06, 0x5d, 0x24, 0x4d, 0x9f, 0xad, 0x03, 0x14,
5288 	0xfe, 0x09, 0x00, 0x01, 0x33, 0xfe, 0x04, 0xfe, 0x7d, 0x05, 0x7f, 0xf9,
5289 	0x03, 0x25, 0xfe, 0xca, 0x18, 0xfe, 0x14, 0xf0, 0x08, 0x65, 0xfe, 0xc6,
5290 	0x18, 0x03, 0xff, 0x1a, 0x00, 0x00,
5291 };
5292 
5293 static unsigned short _adv_asc3550_size = sizeof(_adv_asc3550_buf);	/* 0x13AD */
5294 static ADV_DCNT _adv_asc3550_chksum = 0x04D52DDDUL;	/* Expanded little-endian checksum. */
5295 
5296 /* Microcode buffer is kept after initialization for error recovery. */
5297 static unsigned char _adv_asc38C0800_buf[] = {
5298 	0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x16, 0x18, 0xe4,
5299 	0x01, 0x00, 0x48, 0xe4, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00, 0xce, 0x19,
5300 	0x00, 0xfa, 0xff, 0xff, 0x1c, 0x0f, 0x00, 0xf6, 0x9e, 0xe7, 0xff, 0x00,
5301 	0x82, 0xe7, 0x00, 0xea, 0x01, 0xfa, 0x01, 0xe6, 0x09, 0xe7, 0x55, 0xf0,
5302 	0x01, 0xf6, 0x03, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1e, 0xf0, 0x85, 0xf0,
5303 	0x18, 0xf4, 0x08, 0x00, 0xbc, 0x00, 0x38, 0x54, 0x00, 0xec, 0xd5, 0xf0,
5304 	0x82, 0x0d, 0x00, 0xe6, 0x86, 0xf0, 0xb1, 0xf0, 0x98, 0x57, 0x01, 0xfc,
5305 	0xb4, 0x00, 0xd4, 0x01, 0x0c, 0x1c, 0x3e, 0x1c, 0x3c, 0x00, 0xbb, 0x00,
5306 	0x00, 0x10, 0xba, 0x19, 0x02, 0x80, 0x32, 0xf0, 0x7c, 0x0d, 0x02, 0x13,
5307 	0xba, 0x13, 0x18, 0x40, 0x00, 0x57, 0x01, 0xea, 0x02, 0xfc, 0x03, 0xfc,
5308 	0x3e, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x76, 0x01, 0xb9, 0x54,
5309 	0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00, 0xc0, 0x00, 0x01, 0x01,
5310 	0x3e, 0x01, 0x7a, 0x01, 0xca, 0x08, 0xce, 0x10, 0x16, 0x11, 0x04, 0x12,
5311 	0x08, 0x12, 0x02, 0x4a, 0xbb, 0x55, 0x3c, 0x56, 0x03, 0x58, 0x1b, 0x80,
5312 	0x30, 0xe4, 0x4b, 0xe4, 0x5d, 0xf0, 0x02, 0xfa, 0x20, 0x00, 0x32, 0x00,
5313 	0x40, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01,
5314 	0x70, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x62, 0x0a, 0x86, 0x0d,
5315 	0x06, 0x13, 0x4c, 0x1c, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0,
5316 	0x03, 0xf7, 0x0c, 0x00, 0x0f, 0x00, 0x47, 0x00, 0xbe, 0x00, 0x00, 0x01,
5317 	0x20, 0x11, 0x5c, 0x16, 0x32, 0x1c, 0x38, 0x1c, 0x4e, 0x1c, 0x10, 0x44,
5318 	0x00, 0x4c, 0x04, 0xea, 0x5c, 0xf0, 0xa7, 0xf0, 0x04, 0xf6, 0x03, 0xfa,
5319 	0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00, 0xcc, 0x00, 0x20, 0x01,
5320 	0x4e, 0x01, 0x4a, 0x0b, 0x42, 0x0c, 0x12, 0x0f, 0x0c, 0x10, 0x22, 0x11,
5321 	0x0a, 0x12, 0x04, 0x13, 0x30, 0x1c, 0x02, 0x48, 0x00, 0x4e, 0x42, 0x54,
5322 	0x44, 0x55, 0xbd, 0x56, 0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0,
5323 	0x59, 0xf0, 0xb8, 0xf0, 0x4b, 0xf4, 0x06, 0xf7, 0x0e, 0xf7, 0x04, 0xfc,
5324 	0x05, 0xfc, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00, 0xa4, 0x00,
5325 	0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00, 0xe2, 0x03,
5326 	0x08, 0x0f, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10, 0x0a, 0x13, 0x0c, 0x13,
5327 	0x12, 0x13, 0x24, 0x14, 0x34, 0x14, 0x04, 0x16, 0x08, 0x16, 0xa4, 0x17,
5328 	0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44, 0x91, 0x44,
5329 	0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x3a, 0x55, 0x83, 0x55,
5330 	0xe5, 0x55, 0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0,
5331 	0x0c, 0xf0, 0x04, 0xf8, 0x05, 0xf8, 0x07, 0x00, 0x0a, 0x00, 0x1c, 0x00,
5332 	0x1e, 0x00, 0x9e, 0x00, 0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00,
5333 	0x22, 0x01, 0x26, 0x01, 0x79, 0x01, 0x7e, 0x01, 0xc4, 0x01, 0xc6, 0x01,
5334 	0x80, 0x02, 0x5e, 0x03, 0xee, 0x04, 0x9a, 0x06, 0xf8, 0x07, 0x62, 0x08,
5335 	0x68, 0x08, 0x69, 0x08, 0xd6, 0x08, 0xe9, 0x09, 0xfa, 0x0b, 0x2e, 0x0f,
5336 	0x12, 0x10, 0x1a, 0x10, 0xed, 0x10, 0xf1, 0x10, 0x2a, 0x11, 0x06, 0x12,
5337 	0x0c, 0x12, 0x3e, 0x12, 0x10, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x46, 0x14,
5338 	0x76, 0x14, 0x82, 0x14, 0x36, 0x15, 0xca, 0x15, 0x6b, 0x18, 0xbe, 0x18,
5339 	0xca, 0x18, 0xe6, 0x19, 0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40,
5340 	0x0e, 0x47, 0xfe, 0x9c, 0xf0, 0x2b, 0x02, 0xfe, 0xac, 0x0d, 0xff, 0x10,
5341 	0x00, 0x00, 0xd7, 0xfe, 0xe8, 0x19, 0x00, 0xd6, 0xfe, 0x84, 0x01, 0xff,
5342 	0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
5343 	0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x4c, 0x00, 0x5b, 0xff, 0x04, 0x00,
5344 	0x00, 0x11, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
5345 	0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x11,
5346 	0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
5347 	0xfe, 0x04, 0xf7, 0xd6, 0x2c, 0x99, 0x0a, 0x01, 0xfe, 0xc2, 0x0f, 0xfe,
5348 	0x04, 0xf7, 0xd6, 0x99, 0x0a, 0x42, 0x2c, 0xfe, 0x3d, 0xf0, 0xfe, 0x06,
5349 	0x02, 0xfe, 0x20, 0xf0, 0xa7, 0xfe, 0x91, 0xf0, 0xfe, 0xf4, 0x01, 0xfe,
5350 	0x90, 0xf0, 0xfe, 0xf4, 0x01, 0xfe, 0x8f, 0xf0, 0xa7, 0x03, 0x5d, 0x4d,
5351 	0x02, 0xfe, 0xc8, 0x0d, 0x01, 0xfe, 0x38, 0x0e, 0xfe, 0xdd, 0x12, 0xfe,
5352 	0xfc, 0x10, 0xfe, 0x28, 0x1c, 0x03, 0xfe, 0xa6, 0x00, 0xfe, 0xd3, 0x12,
5353 	0x41, 0x14, 0xfe, 0xa6, 0x00, 0xc2, 0xfe, 0x48, 0xf0, 0xfe, 0x8a, 0x02,
5354 	0xfe, 0x49, 0xf0, 0xfe, 0xa4, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc2, 0x02,
5355 	0xfe, 0x46, 0xf0, 0xfe, 0x54, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x5a, 0x02,
5356 	0xfe, 0x43, 0xf0, 0xfe, 0x48, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x4c, 0x02,
5357 	0xfe, 0x45, 0xf0, 0xfe, 0x50, 0x02, 0x18, 0x0a, 0xaa, 0x18, 0x06, 0x14,
5358 	0xa1, 0x02, 0x2b, 0xfe, 0x00, 0x1c, 0xe7, 0xfe, 0x02, 0x1c, 0xe6, 0xfe,
5359 	0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0xfe, 0x18, 0x18, 0xfe, 0xe7, 0x10,
5360 	0xfe, 0x06, 0xfc, 0xce, 0x09, 0x70, 0x01, 0xa8, 0x02, 0x2b, 0x15, 0x59,
5361 	0x39, 0xa2, 0x01, 0xfe, 0x58, 0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xbd,
5362 	0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
5363 	0x58, 0x1c, 0x18, 0x06, 0x14, 0xa1, 0x2c, 0x1c, 0x2b, 0xfe, 0x3d, 0xf0,
5364 	0xfe, 0x06, 0x02, 0x23, 0xfe, 0x98, 0x02, 0xfe, 0x5a, 0x1c, 0xf8, 0xfe,
5365 	0x14, 0x1c, 0x15, 0xfe, 0x30, 0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10,
5366 	0x18, 0x06, 0x14, 0xa1, 0x02, 0xd7, 0x22, 0x20, 0x07, 0x11, 0x35, 0xfe,
5367 	0x69, 0x10, 0x18, 0x06, 0x14, 0xa1, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0x43,
5368 	0x13, 0x20, 0xfe, 0x05, 0xf6, 0xce, 0x01, 0xfe, 0x4a, 0x17, 0x08, 0x54,
5369 	0x58, 0x37, 0x12, 0x2f, 0x42, 0x92, 0x01, 0xfe, 0x82, 0x16, 0x02, 0x2b,
5370 	0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66, 0x01, 0x73, 0xfe, 0x18, 0x10,
5371 	0xfe, 0x41, 0x58, 0x09, 0xa4, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x6b, 0xfe,
5372 	0x10, 0x03, 0x01, 0xfe, 0x82, 0x16, 0x02, 0x2b, 0x2c, 0x4f, 0xfe, 0x02,
5373 	0xe8, 0x2a, 0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe,
5374 	0x27, 0xf0, 0xfe, 0xe0, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xa7,
5375 	0xfe, 0x40, 0x1c, 0x1c, 0xd9, 0xfe, 0x26, 0xf0, 0xfe, 0x5a, 0x03, 0xfe,
5376 	0xa0, 0xf0, 0xfe, 0x48, 0x03, 0xfe, 0x11, 0xf0, 0xa7, 0xfe, 0xef, 0x10,
5377 	0xfe, 0x9f, 0xf0, 0xfe, 0x68, 0x03, 0xf9, 0x10, 0xfe, 0x11, 0x00, 0x02,
5378 	0x65, 0x2c, 0xfe, 0x48, 0x1c, 0xf9, 0x08, 0x05, 0x1b, 0xfe, 0x18, 0x13,
5379 	0x21, 0x22, 0xa3, 0xb7, 0x13, 0xa3, 0x09, 0x46, 0x01, 0x0e, 0xb7, 0x78,
5380 	0x01, 0xfe, 0xb4, 0x16, 0x12, 0xd1, 0x1c, 0xd9, 0xfe, 0x01, 0xf0, 0xd9,
5381 	0xfe, 0x82, 0xf0, 0xfe, 0x96, 0x03, 0xfa, 0x12, 0xfe, 0xe4, 0x00, 0x27,
5382 	0xfe, 0xa8, 0x03, 0x1c, 0x34, 0x1d, 0xfe, 0xb8, 0x03, 0x01, 0x4b, 0xfe,
5383 	0x06, 0xf0, 0xfe, 0xc8, 0x03, 0x95, 0x86, 0xfe, 0x0a, 0xf0, 0xfe, 0x8a,
5384 	0x06, 0x02, 0x24, 0x03, 0x70, 0x28, 0x17, 0xfe, 0xfa, 0x04, 0x15, 0x6d,
5385 	0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02, 0xd8, 0xf9, 0x2c, 0x99, 0x19,
5386 	0xfe, 0x67, 0x1b, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c,
5387 	0x74, 0x01, 0xaf, 0x8c, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x17, 0xda,
5388 	0x09, 0xd1, 0x01, 0x0e, 0x8d, 0x51, 0x64, 0x79, 0x2a, 0x03, 0x70, 0x28,
5389 	0xfe, 0x10, 0x12, 0x15, 0x6d, 0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02,
5390 	0xd8, 0xc7, 0x81, 0xc8, 0x83, 0x1c, 0x24, 0x27, 0xfe, 0x40, 0x04, 0x1d,
5391 	0xfe, 0x3c, 0x04, 0x3b, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
5392 	0x12, 0x2d, 0xff, 0x02, 0x00, 0x10, 0x01, 0x0b, 0x1d, 0xfe, 0xe4, 0x04,
5393 	0x2d, 0x01, 0x0b, 0x1d, 0x24, 0x33, 0x31, 0xde, 0xfe, 0x4c, 0x44, 0xfe,
5394 	0x4c, 0x12, 0x51, 0xfe, 0x44, 0x48, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b,
5395 	0xda, 0x4f, 0x79, 0x2a, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x62,
5396 	0x13, 0x08, 0x05, 0x1b, 0xfe, 0x2a, 0x13, 0x32, 0x07, 0x82, 0xfe, 0x52,
5397 	0x13, 0xfe, 0x20, 0x10, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b, 0xda, 0xfe,
5398 	0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x40, 0x13, 0x08, 0x05, 0x1b, 0xfe,
5399 	0x08, 0x13, 0x32, 0x07, 0x82, 0xfe, 0x30, 0x13, 0x08, 0x05, 0x1b, 0xfe,
5400 	0x1c, 0x12, 0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe, 0x0d, 0x00,
5401 	0x01, 0x36, 0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x2d, 0x12, 0xfe, 0xe6,
5402 	0x00, 0xfe, 0x1c, 0x90, 0xfe, 0x40, 0x5c, 0x04, 0x15, 0x9d, 0x01, 0x36,
5403 	0x02, 0x2b, 0xfe, 0x42, 0x5b, 0x99, 0x19, 0xfe, 0x46, 0x59, 0xfe, 0xbf,
5404 	0x57, 0xfe, 0x77, 0x57, 0xfe, 0x87, 0x80, 0xfe, 0x31, 0xe4, 0x5b, 0x08,
5405 	0x05, 0x0a, 0xfe, 0x84, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x19, 0xfe, 0x7c,
5406 	0x12, 0x53, 0x05, 0x06, 0xfe, 0x6c, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x28,
5407 	0x17, 0xfe, 0x90, 0x05, 0xfe, 0x31, 0xe4, 0x5a, 0x53, 0x05, 0x0a, 0xfe,
5408 	0x56, 0x13, 0x03, 0xfe, 0xa0, 0x00, 0x28, 0xfe, 0x4e, 0x12, 0x67, 0xff,
5409 	0x02, 0x00, 0x10, 0x27, 0xfe, 0x48, 0x05, 0x1c, 0x34, 0xfe, 0x89, 0x48,
5410 	0xff, 0x02, 0x00, 0x10, 0x27, 0xfe, 0x56, 0x05, 0x26, 0xfe, 0xa8, 0x05,
5411 	0x12, 0xfe, 0xe3, 0x00, 0x21, 0x53, 0xfe, 0x4a, 0xf0, 0xfe, 0x76, 0x05,
5412 	0xfe, 0x49, 0xf0, 0xfe, 0x70, 0x05, 0x88, 0x25, 0xfe, 0x21, 0x00, 0xab,
5413 	0x25, 0xfe, 0x22, 0x00, 0xaa, 0x25, 0x58, 0xfe, 0x09, 0x48, 0xff, 0x02,
5414 	0x00, 0x10, 0x27, 0xfe, 0x86, 0x05, 0x26, 0xfe, 0xa8, 0x05, 0xfe, 0xe2,
5415 	0x08, 0x53, 0x05, 0xcb, 0x4d, 0x01, 0xb0, 0x25, 0x06, 0x13, 0xd3, 0x39,
5416 	0xfe, 0x27, 0x01, 0x08, 0x05, 0x1b, 0xfe, 0x22, 0x12, 0x41, 0x01, 0xb2,
5417 	0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe, 0x0d, 0x00, 0x01, 0x36,
5418 	0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0xeb,
5419 	0x03, 0x5c, 0x28, 0xfe, 0x36, 0x13, 0x41, 0x01, 0xb2, 0x26, 0xfe, 0x18,
5420 	0x06, 0x09, 0x06, 0x53, 0x05, 0x1f, 0xfe, 0x02, 0x12, 0x50, 0x01, 0xfe,
5421 	0x9e, 0x15, 0x1d, 0xfe, 0x0e, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12, 0xfe,
5422 	0xe5, 0x00, 0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x03, 0xcd, 0x28, 0xfe, 0x62,
5423 	0x12, 0x03, 0x45, 0x28, 0xfe, 0x5a, 0x13, 0x01, 0xfe, 0x0c, 0x19, 0x01,
5424 	0xfe, 0x76, 0x19, 0xfe, 0x43, 0x48, 0xc4, 0xcc, 0x0f, 0x71, 0xff, 0x02,
5425 	0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0x8b, 0xc4, 0x6e, 0x41, 0x01, 0xb2,
5426 	0x26, 0xfe, 0x82, 0x06, 0x53, 0x05, 0x1a, 0xe9, 0x91, 0x09, 0x59, 0x01,
5427 	0xfe, 0xcc, 0x15, 0x1d, 0xfe, 0x78, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12,
5428 	0xfe, 0xe5, 0x00, 0x03, 0x45, 0xc1, 0x0c, 0x45, 0x18, 0x06, 0x01, 0xb2,
5429 	0xfa, 0x76, 0x74, 0x01, 0xaf, 0x8c, 0x12, 0xfe, 0xe2, 0x00, 0x27, 0xdb,
5430 	0x1c, 0x34, 0xfe, 0x0a, 0xf0, 0xfe, 0xb6, 0x06, 0x94, 0xfe, 0x6c, 0x07,
5431 	0xfe, 0x06, 0xf0, 0xfe, 0x74, 0x07, 0x95, 0x86, 0x02, 0x24, 0x08, 0x05,
5432 	0x0a, 0xfe, 0x2e, 0x12, 0x16, 0x19, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b,
5433 	0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0xfe, 0x99, 0xa4, 0x01,
5434 	0x0b, 0x16, 0x00, 0x02, 0xfe, 0x42, 0x08, 0x68, 0x05, 0x1a, 0xfe, 0x38,
5435 	0x12, 0x08, 0x05, 0x1a, 0xfe, 0x30, 0x13, 0x16, 0xfe, 0x1b, 0x00, 0x01,
5436 	0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01,
5437 	0x0b, 0x16, 0x06, 0x01, 0x0b, 0x16, 0x00, 0x02, 0xe2, 0x6c, 0x58, 0xbe,
5438 	0x50, 0xfe, 0x9a, 0x81, 0x55, 0x1b, 0x7a, 0xfe, 0x42, 0x07, 0x09, 0x1b,
5439 	0xfe, 0x09, 0x6f, 0xba, 0xfe, 0xca, 0x45, 0xfe, 0x32, 0x12, 0x69, 0x6d,
5440 	0x8b, 0x6c, 0x7f, 0x27, 0xfe, 0x54, 0x07, 0x1c, 0x34, 0xfe, 0x0a, 0xf0,
5441 	0xfe, 0x42, 0x07, 0x95, 0x86, 0x94, 0xfe, 0x6c, 0x07, 0x02, 0x24, 0x01,
5442 	0x4b, 0x02, 0xdb, 0x16, 0x1f, 0x02, 0xdb, 0xfe, 0x9c, 0xf7, 0xdc, 0xfe,
5443 	0x2c, 0x90, 0xfe, 0xae, 0x90, 0x56, 0xfe, 0xda, 0x07, 0x0c, 0x60, 0x14,
5444 	0x61, 0x08, 0x54, 0x5a, 0x37, 0x22, 0x20, 0x07, 0x11, 0xfe, 0x0e, 0x12,
5445 	0x8d, 0xfe, 0x80, 0x80, 0x39, 0x20, 0x6a, 0x2a, 0xfe, 0x06, 0x10, 0xfe,
5446 	0x83, 0xe7, 0xfe, 0x48, 0x00, 0xab, 0xfe, 0x03, 0x40, 0x08, 0x54, 0x5b,
5447 	0x37, 0x01, 0xb3, 0xb8, 0xfe, 0x1f, 0x40, 0x13, 0x62, 0x01, 0xef, 0xfe,
5448 	0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe, 0x44, 0x51, 0xfe, 0xc6, 0x51, 0x88,
5449 	0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90, 0x0c, 0x5e, 0x14, 0x5f, 0xfe, 0x0c,
5450 	0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x0c, 0x3d,
5451 	0x14, 0x3e, 0xfe, 0x4a, 0x10, 0x08, 0x05, 0x5a, 0xfe, 0x2a, 0x12, 0xfe,
5452 	0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x60, 0x14, 0x61, 0x08, 0x05, 0x5b,
5453 	0x8b, 0x01, 0xb3, 0xfe, 0x1f, 0x80, 0x13, 0x62, 0xfe, 0x44, 0x90, 0xfe,
5454 	0xc6, 0x90, 0x0c, 0x3f, 0x14, 0x40, 0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90,
5455 	0x0c, 0x5e, 0x14, 0x5f, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90, 0x0c, 0x3d,
5456 	0x14, 0x3e, 0x0c, 0x2e, 0x14, 0x3c, 0x21, 0x0c, 0x49, 0x0c, 0x63, 0x08,
5457 	0x54, 0x1f, 0x37, 0x2c, 0x0f, 0xfe, 0x4e, 0x11, 0x27, 0xdd, 0xfe, 0x9e,
5458 	0xf0, 0xfe, 0x76, 0x08, 0xbc, 0x17, 0x34, 0x2c, 0x77, 0xe6, 0xc5, 0xfe,
5459 	0x9a, 0x08, 0xc6, 0xfe, 0xb8, 0x08, 0x94, 0xfe, 0x8e, 0x08, 0xfe, 0x06,
5460 	0xf0, 0xfe, 0x94, 0x08, 0x95, 0x86, 0x02, 0x24, 0x01, 0x4b, 0xfe, 0xc9,
5461 	0x10, 0x16, 0x1f, 0xfe, 0xc9, 0x10, 0x68, 0x05, 0x06, 0xfe, 0x10, 0x12,
5462 	0x68, 0x05, 0x0a, 0x4e, 0x08, 0x05, 0x0a, 0xfe, 0x90, 0x12, 0xfe, 0x2e,
5463 	0x1c, 0x02, 0xfe, 0x18, 0x0b, 0x68, 0x05, 0x06, 0x4e, 0x68, 0x05, 0x0a,
5464 	0xfe, 0x7a, 0x12, 0xfe, 0x2c, 0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0xd2, 0x09,
5465 	0xfe, 0xac, 0xf0, 0xfe, 0x00, 0x09, 0x02, 0xfe, 0xde, 0x09, 0xfe, 0xb7,
5466 	0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0x02, 0xf6, 0x1a, 0x50, 0xfe, 0x70, 0x18,
5467 	0xfe, 0xf1, 0x18, 0xfe, 0x40, 0x55, 0xfe, 0xe1, 0x55, 0xfe, 0x10, 0x58,
5468 	0xfe, 0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x1c, 0x85, 0xfe,
5469 	0x8c, 0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0xac, 0xf0, 0xfe, 0xf0, 0x08, 0xb5,
5470 	0xfe, 0xcb, 0x10, 0xfe, 0xad, 0xf0, 0xfe, 0x0c, 0x09, 0x02, 0xfe, 0x18,
5471 	0x0b, 0xb6, 0xfe, 0xbf, 0x10, 0xfe, 0x2b, 0xf0, 0x85, 0xf4, 0x1e, 0xfe,
5472 	0x00, 0xfe, 0xfe, 0x1c, 0x12, 0xc2, 0xfe, 0xd2, 0xf0, 0x85, 0xfe, 0x76,
5473 	0x18, 0x1e, 0x19, 0x17, 0x85, 0x03, 0xd2, 0x1e, 0x06, 0x17, 0x85, 0xc5,
5474 	0x4a, 0xc6, 0x4a, 0xb5, 0xb6, 0xfe, 0x89, 0x10, 0x74, 0x67, 0x2d, 0x15,
5475 	0x9d, 0x01, 0x36, 0x10, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x65, 0x10,
5476 	0x80, 0x02, 0x65, 0xfe, 0x98, 0x80, 0xfe, 0x19, 0xe4, 0x0a, 0xfe, 0x1a,
5477 	0x12, 0x51, 0xfe, 0x19, 0x82, 0xfe, 0x6c, 0x18, 0xfe, 0x44, 0x54, 0xbe,
5478 	0xfe, 0x19, 0x81, 0xfe, 0x74, 0x18, 0x8f, 0x90, 0x17, 0xfe, 0xce, 0x08,
5479 	0x02, 0x4a, 0x08, 0x05, 0x5a, 0xec, 0x03, 0x2e, 0x29, 0x3c, 0x0c, 0x3f,
5480 	0x14, 0x40, 0x9b, 0x2e, 0x9c, 0x3c, 0xfe, 0x6c, 0x18, 0xfe, 0xed, 0x18,
5481 	0xfe, 0x44, 0x54, 0xfe, 0xe5, 0x54, 0x3a, 0x3f, 0x3b, 0x40, 0x03, 0x49,
5482 	0x29, 0x63, 0x8f, 0xfe, 0xe3, 0x54, 0xfe, 0x74, 0x18, 0xfe, 0xf5, 0x18,
5483 	0x8f, 0xfe, 0xe3, 0x54, 0x90, 0xc0, 0x56, 0xfe, 0xce, 0x08, 0x02, 0x4a,
5484 	0xfe, 0x37, 0xf0, 0xfe, 0xda, 0x09, 0xfe, 0x8b, 0xf0, 0xfe, 0x60, 0x09,
5485 	0x02, 0x4a, 0x08, 0x05, 0x0a, 0x23, 0xfe, 0xfa, 0x0a, 0x3a, 0x49, 0x3b,
5486 	0x63, 0x56, 0xfe, 0x3e, 0x0a, 0x0f, 0xfe, 0xc0, 0x07, 0x41, 0x98, 0x00,
5487 	0xad, 0xfe, 0x01, 0x59, 0xfe, 0x52, 0xf0, 0xfe, 0x0c, 0x0a, 0x8f, 0x7a,
5488 	0xfe, 0x24, 0x0a, 0x3a, 0x49, 0x8f, 0xfe, 0xe3, 0x54, 0x57, 0x49, 0x7d,
5489 	0x63, 0xfe, 0x14, 0x58, 0xfe, 0x95, 0x58, 0x02, 0x4a, 0x3a, 0x49, 0x3b,
5490 	0x63, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0xbe, 0x57, 0x49, 0x57, 0x63,
5491 	0x02, 0x4a, 0x08, 0x05, 0x5a, 0xfe, 0x82, 0x12, 0x08, 0x05, 0x1f, 0xfe,
5492 	0x66, 0x13, 0x22, 0x62, 0xb7, 0xfe, 0x03, 0xa1, 0xfe, 0x83, 0x80, 0xfe,
5493 	0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91, 0xfe, 0x86, 0x91, 0x6a,
5494 	0x2a, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x56, 0xe0, 0x03, 0x60, 0x29,
5495 	0x61, 0x0c, 0x7f, 0x14, 0x80, 0x57, 0x60, 0x7d, 0x61, 0x01, 0xb3, 0xb8,
5496 	0x6a, 0x2a, 0x13, 0x62, 0x9b, 0x2e, 0x9c, 0x3c, 0x3a, 0x3f, 0x3b, 0x40,
5497 	0x90, 0xc0, 0xfe, 0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0x01, 0xef,
5498 	0xfe, 0x36, 0x10, 0x21, 0x0c, 0x7f, 0x0c, 0x80, 0x3a, 0x3f, 0x3b, 0x40,
5499 	0xe4, 0x08, 0x05, 0x1f, 0x17, 0xe0, 0x3a, 0x3d, 0x3b, 0x3e, 0x08, 0x05,
5500 	0xfe, 0xf7, 0x00, 0x37, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x10, 0x58, 0xfe,
5501 	0x91, 0x58, 0x57, 0x49, 0x7d, 0x63, 0x02, 0xfe, 0xf4, 0x09, 0x08, 0x05,
5502 	0x1f, 0x17, 0xe0, 0x08, 0x05, 0xfe, 0xf7, 0x00, 0x37, 0xbe, 0xfe, 0x19,
5503 	0x81, 0x50, 0xfe, 0x10, 0x90, 0xfe, 0x92, 0x90, 0xfe, 0xd3, 0x10, 0x32,
5504 	0x07, 0xa6, 0x17, 0xfe, 0x08, 0x09, 0x12, 0xa6, 0x08, 0x05, 0x0a, 0xfe,
5505 	0x14, 0x13, 0x03, 0x3d, 0x29, 0x3e, 0x56, 0xfe, 0x08, 0x09, 0xfe, 0x0c,
5506 	0x58, 0xfe, 0x8d, 0x58, 0x02, 0x4a, 0x21, 0x41, 0xfe, 0x19, 0x80, 0xe7,
5507 	0x08, 0x05, 0x0a, 0xfe, 0x1a, 0x12, 0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41,
5508 	0xf4, 0xc2, 0xfe, 0xd1, 0xf0, 0xe2, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe,
5509 	0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe, 0x6c, 0x19, 0x57, 0x3d, 0xfe, 0xed,
5510 	0x19, 0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0xf4, 0x1e, 0xfe,
5511 	0x00, 0xff, 0x35, 0xfe, 0x74, 0x10, 0xc2, 0xfe, 0xd2, 0xf0, 0xfe, 0xa6,
5512 	0x0b, 0xfe, 0x76, 0x18, 0x1e, 0x19, 0x8a, 0x03, 0xd2, 0x1e, 0x06, 0xfe,
5513 	0x08, 0x13, 0x10, 0xfe, 0x16, 0x00, 0x02, 0x65, 0xfe, 0xd1, 0xf0, 0xfe,
5514 	0xb8, 0x0b, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe, 0x17, 0x00, 0xfe, 0x42,
5515 	0x10, 0xfe, 0xce, 0xf0, 0xfe, 0xbe, 0x0b, 0xfe, 0x3c, 0x10, 0xfe, 0xcd,
5516 	0xf0, 0xfe, 0xca, 0x0b, 0x10, 0xfe, 0x22, 0x00, 0x02, 0x65, 0xfe, 0xcb,
5517 	0xf0, 0xfe, 0xd6, 0x0b, 0x10, 0xfe, 0x24, 0x00, 0x02, 0x65, 0xfe, 0xd0,
5518 	0xf0, 0xfe, 0xe0, 0x0b, 0x10, 0x9e, 0xe5, 0xfe, 0xcf, 0xf0, 0xfe, 0xea,
5519 	0x0b, 0x10, 0x58, 0xfe, 0x10, 0x10, 0xfe, 0xcc, 0xf0, 0xe2, 0x68, 0x05,
5520 	0x1f, 0x4d, 0x10, 0xfe, 0x12, 0x00, 0x2c, 0x0f, 0xfe, 0x4e, 0x11, 0x27,
5521 	0xfe, 0x00, 0x0c, 0xfe, 0x9e, 0xf0, 0xfe, 0x14, 0x0c, 0xbc, 0x17, 0x34,
5522 	0x2c, 0x77, 0xe6, 0xc5, 0x24, 0xc6, 0x24, 0x2c, 0xfa, 0x27, 0xfe, 0x20,
5523 	0x0c, 0x1c, 0x34, 0x94, 0xfe, 0x3c, 0x0c, 0x95, 0x86, 0xc5, 0xdc, 0xc6,
5524 	0xdc, 0x02, 0x24, 0x01, 0x4b, 0xfe, 0xdb, 0x10, 0x12, 0xfe, 0xe8, 0x00,
5525 	0xb5, 0xb6, 0x74, 0xc7, 0x81, 0xc8, 0x83, 0xfe, 0x89, 0xf0, 0x24, 0x33,
5526 	0x31, 0xe1, 0xc7, 0x81, 0xc8, 0x83, 0x27, 0xfe, 0x66, 0x0c, 0x1d, 0x24,
5527 	0x33, 0x31, 0xdf, 0xbc, 0x4e, 0x10, 0xfe, 0x42, 0x00, 0x02, 0x65, 0x7c,
5528 	0x06, 0xfe, 0x81, 0x49, 0x17, 0xfe, 0x2c, 0x0d, 0x08, 0x05, 0x0a, 0xfe,
5529 	0x44, 0x13, 0x10, 0x00, 0x55, 0x0a, 0xfe, 0x54, 0x12, 0x55, 0xfe, 0x28,
5530 	0x00, 0x23, 0xfe, 0x9a, 0x0d, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66,
5531 	0x44, 0xfe, 0x28, 0x00, 0xfe, 0xe2, 0x10, 0x01, 0xf5, 0x01, 0xf6, 0x09,
5532 	0xa4, 0x01, 0xfe, 0x26, 0x0f, 0x64, 0x12, 0x2f, 0x01, 0x73, 0x02, 0x2b,
5533 	0x10, 0xfe, 0x44, 0x00, 0x55, 0x0a, 0xe9, 0x44, 0x0a, 0xfe, 0xb4, 0x10,
5534 	0x01, 0xb0, 0x44, 0x0a, 0xfe, 0xaa, 0x10, 0x01, 0xb0, 0xfe, 0x19, 0x82,
5535 	0xfe, 0x34, 0x46, 0xac, 0x44, 0x0a, 0x10, 0xfe, 0x43, 0x00, 0xfe, 0x96,
5536 	0x10, 0x08, 0x54, 0x0a, 0x37, 0x01, 0xf5, 0x01, 0xf6, 0x64, 0x12, 0x2f,
5537 	0x01, 0x73, 0x99, 0x0a, 0x64, 0x42, 0x92, 0x02, 0xfe, 0x2e, 0x03, 0x08,
5538 	0x05, 0x0a, 0x8a, 0x44, 0x0a, 0x10, 0x00, 0xfe, 0x5c, 0x10, 0x68, 0x05,
5539 	0x1a, 0xfe, 0x58, 0x12, 0x08, 0x05, 0x1a, 0xfe, 0x50, 0x13, 0xfe, 0x1c,
5540 	0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x50, 0x0d, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d,
5541 	0xf0, 0xfe, 0x56, 0x0d, 0x08, 0x54, 0x1a, 0x37, 0xfe, 0xa9, 0x10, 0x10,
5542 	0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0a, 0x50, 0xfe, 0x2e, 0x10, 0x10,
5543 	0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x10, 0x6f, 0xab, 0x10, 0xfe, 0x41,
5544 	0x00, 0xaa, 0x10, 0xfe, 0x24, 0x00, 0x8c, 0xb5, 0xb6, 0x74, 0x03, 0x70,
5545 	0x28, 0x23, 0xd8, 0x50, 0xfe, 0x04, 0xe6, 0x1a, 0xfe, 0x9d, 0x41, 0xfe,
5546 	0x1c, 0x42, 0x64, 0x01, 0xe3, 0x02, 0x2b, 0xf8, 0x15, 0x0a, 0x39, 0xa0,
5547 	0xb4, 0x15, 0xfe, 0x31, 0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10, 0x02,
5548 	0xd7, 0x42, 0xfe, 0x06, 0xec, 0xd0, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45,
5549 	0x35, 0x42, 0xfe, 0x06, 0xea, 0xd0, 0xfe, 0x47, 0x4b, 0x91, 0xfe, 0x75,
5550 	0x57, 0x03, 0x5d, 0xfe, 0x98, 0x56, 0xfe, 0x38, 0x12, 0x09, 0x48, 0x01,
5551 	0x0e, 0xfe, 0x44, 0x48, 0x4f, 0x08, 0x05, 0x1b, 0xfe, 0x1a, 0x13, 0x09,
5552 	0x46, 0x01, 0x0e, 0x41, 0xfe, 0x41, 0x58, 0x09, 0xa4, 0x01, 0x0e, 0xfe,
5553 	0x49, 0x54, 0x96, 0xfe, 0x1e, 0x0e, 0x02, 0xfe, 0x2e, 0x03, 0x09, 0x5d,
5554 	0xfe, 0xee, 0x14, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45, 0x35, 0x42, 0xfe,
5555 	0xce, 0x47, 0xfe, 0xad, 0x13, 0x02, 0x2b, 0x22, 0x20, 0x07, 0x11, 0xfe,
5556 	0x9e, 0x12, 0x21, 0x13, 0x59, 0x13, 0x9f, 0x13, 0xd5, 0x22, 0x2f, 0x41,
5557 	0x39, 0x2f, 0xbc, 0xad, 0xfe, 0xbc, 0xf0, 0xfe, 0xe0, 0x0e, 0x0f, 0x06,
5558 	0x13, 0x59, 0x01, 0xfe, 0xda, 0x16, 0x03, 0xfe, 0x38, 0x01, 0x29, 0xfe,
5559 	0x3a, 0x01, 0x56, 0xfe, 0xe4, 0x0e, 0xfe, 0x02, 0xec, 0xd5, 0x69, 0x00,
5560 	0x66, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01,
5561 	0x01, 0xfe, 0x4a, 0x17, 0xfe, 0x08, 0x90, 0xfe, 0x48, 0xf4, 0x0d, 0xfe,
5562 	0x18, 0x13, 0xba, 0xfe, 0x02, 0xea, 0xd5, 0x69, 0x7e, 0xfe, 0xc5, 0x13,
5563 	0x15, 0x1a, 0x39, 0xa0, 0xb4, 0xfe, 0x2e, 0x10, 0x03, 0xfe, 0x38, 0x01,
5564 	0x1e, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x03, 0xfe, 0x3a, 0x01,
5565 	0x0c, 0xfe, 0x62, 0x01, 0x43, 0x13, 0x20, 0x25, 0x06, 0x13, 0x2f, 0x12,
5566 	0x2f, 0x92, 0x0f, 0x06, 0x04, 0x21, 0x04, 0x22, 0x59, 0xfe, 0xf7, 0x12,
5567 	0x22, 0x9f, 0xb7, 0x13, 0x9f, 0x07, 0x7e, 0xfe, 0x71, 0x13, 0xfe, 0x24,
5568 	0x1c, 0x15, 0x19, 0x39, 0xa0, 0xb4, 0xfe, 0xd9, 0x10, 0xc3, 0xfe, 0x03,
5569 	0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xc3, 0xfe, 0x03, 0xdc,
5570 	0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x21,
5571 	0xfe, 0x00, 0xcc, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x78, 0x04, 0x08, 0x05,
5572 	0x58, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
5573 	0xfe, 0x1e, 0x80, 0xed, 0xfe, 0x1d, 0x80, 0xae, 0xfe, 0x0c, 0x90, 0xfe,
5574 	0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xac, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
5575 	0x0a, 0xfe, 0x3c, 0x50, 0xaa, 0x01, 0xfe, 0x7a, 0x17, 0x32, 0x07, 0x2f,
5576 	0xad, 0x01, 0xfe, 0xb4, 0x16, 0x08, 0x05, 0x1b, 0x4e, 0x01, 0xf5, 0x01,
5577 	0xf6, 0x12, 0xfe, 0xe9, 0x00, 0x08, 0x05, 0x58, 0xfe, 0x2c, 0x13, 0x01,
5578 	0xfe, 0x0c, 0x17, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
5579 	0x0c, 0xfe, 0x64, 0x01, 0x14, 0xfe, 0x66, 0x01, 0x08, 0x05, 0x5b, 0xfe,
5580 	0x12, 0x12, 0xfe, 0x03, 0x80, 0x8d, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
5581 	0x40, 0x13, 0x20, 0x6a, 0x2a, 0x12, 0xcf, 0x64, 0x22, 0x20, 0xfb, 0x79,
5582 	0x20, 0x04, 0xfe, 0x08, 0x1c, 0x03, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
5583 	0x03, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe,
5584 	0x08, 0x58, 0x03, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
5585 	0x25, 0x6e, 0x13, 0xd0, 0x21, 0x0c, 0x5c, 0x0c, 0x45, 0x0f, 0x46, 0x52,
5586 	0x50, 0x18, 0x1b, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x23, 0xfe, 0xfc,
5587 	0x0f, 0x44, 0x11, 0x0f, 0x48, 0x52, 0x18, 0x58, 0xfe, 0x90, 0x4d, 0xfe,
5588 	0x91, 0x54, 0x23, 0xe4, 0x25, 0x11, 0x13, 0x20, 0x7c, 0x6f, 0x4f, 0x22,
5589 	0x20, 0xfb, 0x79, 0x20, 0x12, 0xcf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0,
5590 	0xfe, 0x26, 0x10, 0xf8, 0x74, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
5591 	0x18, 0x1c, 0x04, 0x42, 0xfe, 0x0c, 0x14, 0xfc, 0xfe, 0x07, 0xe6, 0x1b,
5592 	0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x04, 0x01, 0xb0, 0x7c, 0x6f, 0x4f,
5593 	0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42, 0x13, 0x32, 0x07, 0x2f,
5594 	0xfe, 0x34, 0x13, 0x09, 0x48, 0x01, 0x0e, 0xbb, 0xfe, 0x36, 0x12, 0xfe,
5595 	0x41, 0x48, 0xfe, 0x45, 0x48, 0x01, 0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe,
5596 	0xf3, 0x13, 0x43, 0x78, 0x07, 0x11, 0xac, 0x09, 0x84, 0x01, 0x0e, 0xfe,
5597 	0x80, 0x5c, 0x01, 0x73, 0xfe, 0x0e, 0x10, 0x07, 0x82, 0x4e, 0xfe, 0x14,
5598 	0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x60, 0x10, 0x04, 0xfe, 0x44, 0x58, 0x8d,
5599 	0xfe, 0x01, 0xec, 0xa2, 0xfe, 0x9e, 0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe,
5600 	0x9c, 0xe7, 0x1a, 0x79, 0x2a, 0x01, 0xe3, 0xfe, 0xdd, 0x10, 0x2c, 0xc7,
5601 	0x81, 0xc8, 0x83, 0x33, 0x31, 0xde, 0x07, 0x1a, 0xfe, 0x48, 0x12, 0x07,
5602 	0x0a, 0xfe, 0x56, 0x12, 0x07, 0x19, 0xfe, 0x30, 0x12, 0x07, 0xc9, 0x17,
5603 	0xfe, 0x32, 0x12, 0x07, 0xfe, 0x23, 0x00, 0x17, 0xeb, 0x07, 0x06, 0x17,
5604 	0xfe, 0x9c, 0x12, 0x07, 0x1f, 0xfe, 0x12, 0x12, 0x07, 0x00, 0x17, 0x24,
5605 	0x15, 0xc9, 0x01, 0x36, 0xa9, 0x2d, 0x01, 0x0b, 0x94, 0x4b, 0x04, 0x2d,
5606 	0xdd, 0x09, 0xd1, 0x01, 0xfe, 0x26, 0x0f, 0x12, 0x82, 0x02, 0x2b, 0x2d,
5607 	0x32, 0x07, 0xa6, 0xfe, 0xd9, 0x13, 0x3a, 0x3d, 0x3b, 0x3e, 0x56, 0xfe,
5608 	0xf0, 0x11, 0x08, 0x05, 0x5a, 0xfe, 0x72, 0x12, 0x9b, 0x2e, 0x9c, 0x3c,
5609 	0x90, 0xc0, 0x96, 0xfe, 0xba, 0x11, 0x22, 0x62, 0xfe, 0x26, 0x13, 0x03,
5610 	0x7f, 0x29, 0x80, 0x56, 0xfe, 0x76, 0x0d, 0x0c, 0x60, 0x14, 0x61, 0x21,
5611 	0x0c, 0x7f, 0x0c, 0x80, 0x01, 0xb3, 0x25, 0x6e, 0x77, 0x13, 0x62, 0x01,
5612 	0xef, 0x9b, 0x2e, 0x9c, 0x3c, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe,
5613 	0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0xfe, 0x91, 0x10, 0x03, 0x3f,
5614 	0x29, 0x40, 0xfe, 0x40, 0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x3f, 0x14, 0x40,
5615 	0x88, 0x9b, 0x2e, 0x9c, 0x3c, 0x90, 0xc0, 0x03, 0x5e, 0x29, 0x5f, 0xfe,
5616 	0x00, 0x56, 0xfe, 0xa1, 0x56, 0x0c, 0x5e, 0x14, 0x5f, 0x08, 0x05, 0x5a,
5617 	0xfe, 0x1e, 0x12, 0x22, 0x62, 0xfe, 0x1f, 0x40, 0x03, 0x60, 0x29, 0x61,
5618 	0xfe, 0x2c, 0x50, 0xfe, 0xae, 0x50, 0x03, 0x3f, 0x29, 0x40, 0xfe, 0x44,
5619 	0x50, 0xfe, 0xc6, 0x50, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x08, 0x50, 0xfe,
5620 	0x8a, 0x50, 0x03, 0x3d, 0x29, 0x3e, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50,
5621 	0x02, 0x89, 0x25, 0x06, 0x13, 0xd4, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1d,
5622 	0x4c, 0x33, 0x31, 0xde, 0x07, 0x06, 0x23, 0x4c, 0x32, 0x07, 0xa6, 0x23,
5623 	0x72, 0x01, 0xaf, 0x1e, 0x43, 0x17, 0x4c, 0x08, 0x05, 0x0a, 0xee, 0x3a,
5624 	0x3d, 0x3b, 0x3e, 0xfe, 0x0a, 0x55, 0x35, 0xfe, 0x8b, 0x55, 0x57, 0x3d,
5625 	0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0x02, 0x72, 0xfe, 0x19,
5626 	0x81, 0xba, 0xfe, 0x19, 0x41, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1c, 0x34,
5627 	0x1d, 0xe8, 0x33, 0x31, 0xe1, 0x55, 0x19, 0xfe, 0xa6, 0x12, 0x55, 0x0a,
5628 	0x4d, 0x02, 0x4c, 0x01, 0x0b, 0x1c, 0x34, 0x1d, 0xe8, 0x33, 0x31, 0xdf,
5629 	0x07, 0x19, 0x23, 0x4c, 0x01, 0x0b, 0x1d, 0xe8, 0x33, 0x31, 0xfe, 0xe8,
5630 	0x09, 0xfe, 0xc2, 0x49, 0x51, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0x8a, 0x53,
5631 	0x05, 0x1f, 0x35, 0xa9, 0xfe, 0xbb, 0x45, 0x55, 0x00, 0x4e, 0x44, 0x06,
5632 	0x7c, 0x43, 0xfe, 0xda, 0x14, 0x01, 0xaf, 0x8c, 0xfe, 0x4b, 0x45, 0xee,
5633 	0x32, 0x07, 0xa5, 0xed, 0x03, 0xcd, 0x28, 0x8a, 0x03, 0x45, 0x28, 0x35,
5634 	0x67, 0x02, 0x72, 0xfe, 0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17,
5635 	0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01,
5636 	0xfe, 0x9e, 0x15, 0x02, 0x89, 0x01, 0x0b, 0x1c, 0x34, 0x1d, 0x4c, 0x33,
5637 	0x31, 0xdf, 0x07, 0x06, 0x23, 0x4c, 0x01, 0xf1, 0xfe, 0x42, 0x58, 0xf1,
5638 	0xfe, 0xa4, 0x14, 0x8c, 0xfe, 0x4a, 0xf4, 0x0a, 0x17, 0x4c, 0xfe, 0x4a,
5639 	0xf4, 0x06, 0xea, 0x32, 0x07, 0xa5, 0x8b, 0x02, 0x72, 0x03, 0x45, 0xc1,
5640 	0x0c, 0x45, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01, 0xfe, 0xcc, 0x15,
5641 	0x02, 0x89, 0x0f, 0x06, 0x27, 0xfe, 0xbe, 0x13, 0x26, 0xfe, 0xd4, 0x13,
5642 	0x76, 0xfe, 0x89, 0x48, 0x01, 0x0b, 0x21, 0x76, 0x04, 0x7b, 0xfe, 0xd0,
5643 	0x13, 0x1c, 0xfe, 0xd0, 0x13, 0x1d, 0xfe, 0xbe, 0x13, 0x67, 0x2d, 0x01,
5644 	0x0b, 0xfe, 0xd5, 0x10, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93,
5645 	0x1e, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x04, 0x0f,
5646 	0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0xfe, 0x30, 0x56,
5647 	0xfe, 0x00, 0x5c, 0x04, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93,
5648 	0x04, 0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0xfe, 0x0b, 0x58,
5649 	0x04, 0x09, 0x5c, 0x01, 0x87, 0x09, 0x45, 0x01, 0x87, 0x04, 0xfe, 0x03,
5650 	0xa1, 0x1e, 0x11, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x1f, 0x52,
5651 	0xfe, 0x00, 0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c,
5652 	0x6a, 0x2a, 0x0c, 0x5e, 0x14, 0x5f, 0x57, 0x3f, 0x7d, 0x40, 0x04, 0xdd,
5653 	0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x8d, 0x04, 0x01,
5654 	0xfe, 0x0c, 0x19, 0xfe, 0x42, 0x48, 0x50, 0x51, 0x91, 0x01, 0x0b, 0x1d,
5655 	0xfe, 0x96, 0x15, 0x33, 0x31, 0xe1, 0x01, 0x0b, 0x1d, 0xfe, 0x96, 0x15,
5656 	0x33, 0x31, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x03, 0xcd, 0x28, 0xfe,
5657 	0xcc, 0x12, 0x53, 0x05, 0x1a, 0xfe, 0xc4, 0x13, 0x21, 0x69, 0x1a, 0xee,
5658 	0x55, 0xca, 0x6b, 0xfe, 0xdc, 0x14, 0x4d, 0x0f, 0x06, 0x18, 0xca, 0x7c,
5659 	0x30, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xab, 0xff, 0x02, 0x83,
5660 	0x55, 0x69, 0x19, 0xae, 0x98, 0xfe, 0x30, 0x00, 0x96, 0xf2, 0x18, 0x6d,
5661 	0x0f, 0x06, 0xfe, 0x56, 0x10, 0x69, 0x0a, 0xed, 0x98, 0xfe, 0x64, 0x00,
5662 	0x96, 0xf2, 0x09, 0xfe, 0x64, 0x00, 0x18, 0x9e, 0x0f, 0x06, 0xfe, 0x28,
5663 	0x10, 0x69, 0x06, 0xfe, 0x60, 0x13, 0x98, 0xfe, 0xc8, 0x00, 0x96, 0xf2,
5664 	0x09, 0xfe, 0xc8, 0x00, 0x18, 0x59, 0x0f, 0x06, 0x88, 0x98, 0xfe, 0x90,
5665 	0x01, 0x7a, 0xfe, 0x42, 0x15, 0x91, 0xe4, 0xfe, 0x43, 0xf4, 0x9f, 0xfe,
5666 	0x56, 0xf0, 0xfe, 0x54, 0x15, 0xfe, 0x04, 0xf4, 0x71, 0xfe, 0x43, 0xf4,
5667 	0x9e, 0xfe, 0xf3, 0x10, 0xfe, 0x40, 0x5c, 0x01, 0xfe, 0x16, 0x14, 0x1e,
5668 	0x43, 0xec, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x6e, 0x7a, 0xfe, 0x90,
5669 	0x15, 0xc4, 0x6e, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4,
5670 	0xcc, 0x7a, 0xfe, 0x90, 0x15, 0xc4, 0xcc, 0x88, 0x51, 0x21, 0xfe, 0x4d,
5671 	0xf4, 0x00, 0xe9, 0x91, 0x0f, 0x06, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58,
5672 	0x04, 0x51, 0x0f, 0x0a, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xf3, 0x16,
5673 	0x0a, 0x01, 0x0b, 0x26, 0xf3, 0x16, 0x19, 0x01, 0x0b, 0x26, 0xf3, 0x76,
5674 	0xfe, 0x89, 0x49, 0x01, 0x0b, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
5675 	0x16, 0x19, 0x01, 0x0b, 0x26, 0xb1, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
5676 	0xfe, 0x89, 0x49, 0x01, 0x0b, 0x26, 0xb1, 0x76, 0xfe, 0x89, 0x4a, 0x01,
5677 	0x0b, 0x04, 0x51, 0x04, 0x22, 0xd3, 0x07, 0x06, 0xfe, 0x48, 0x13, 0xb8,
5678 	0x13, 0xd3, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x76, 0xa9, 0x67, 0xfe, 0x01,
5679 	0xec, 0xfe, 0x27, 0x01, 0xfe, 0x89, 0x48, 0xff, 0x02, 0x00, 0x10, 0x27,
5680 	0xfe, 0x2e, 0x16, 0x32, 0x07, 0xfe, 0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1d,
5681 	0xfe, 0x52, 0x16, 0x21, 0x13, 0xd4, 0x01, 0x4b, 0x22, 0xd4, 0x07, 0x06,
5682 	0x4e, 0x08, 0x54, 0x06, 0x37, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfb, 0x8e,
5683 	0x07, 0x11, 0xae, 0x09, 0x84, 0x01, 0x0e, 0x8e, 0x09, 0x5d, 0x01, 0xa8,
5684 	0x04, 0x09, 0x84, 0x01, 0x0e, 0x8e, 0xfe, 0x80, 0xe7, 0x11, 0x07, 0x11,
5685 	0x8a, 0xfe, 0x45, 0x58, 0x01, 0xf0, 0x8e, 0x04, 0x09, 0x48, 0x01, 0x0e,
5686 	0x8e, 0x09, 0x5d, 0x01, 0xa8, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfe, 0x80,
5687 	0x80, 0xfe, 0x80, 0x4c, 0xfe, 0x49, 0xe4, 0x11, 0xae, 0x09, 0x84, 0x01,
5688 	0x0e, 0xfe, 0x80, 0x4c, 0x09, 0x5d, 0x01, 0x87, 0x04, 0x18, 0x11, 0x75,
5689 	0x6c, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x24,
5690 	0x1c, 0xfe, 0x1d, 0xf7, 0x1b, 0x97, 0xfe, 0xee, 0x16, 0x01, 0xfe, 0xf4,
5691 	0x17, 0xad, 0x9a, 0x1b, 0x6c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x04,
5692 	0xb9, 0x23, 0xfe, 0xde, 0x16, 0xfe, 0xda, 0x10, 0x18, 0x11, 0x75, 0x03,
5693 	0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x1f, 0xfe, 0x18, 0x58, 0x03, 0xfe,
5694 	0x66, 0x01, 0xfe, 0x19, 0x58, 0x9a, 0x1f, 0xfe, 0x3c, 0x90, 0xfe, 0x30,
5695 	0xf4, 0x06, 0xfe, 0x3c, 0x50, 0x6c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79,
5696 	0xfe, 0x1c, 0xf7, 0x1f, 0x97, 0xfe, 0x38, 0x17, 0xfe, 0xb6, 0x14, 0x35,
5697 	0x04, 0xb9, 0x23, 0xfe, 0x10, 0x17, 0xfe, 0x9c, 0x10, 0x18, 0x11, 0x75,
5698 	0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7,
5699 	0x2e, 0x97, 0xfe, 0x5a, 0x17, 0xfe, 0x94, 0x14, 0xec, 0x9a, 0x2e, 0x6c,
5700 	0x1a, 0xfe, 0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00, 0x04, 0xb9, 0x23, 0xfe,
5701 	0x4e, 0x17, 0xfe, 0x6c, 0x10, 0x18, 0x11, 0x75, 0xfe, 0x30, 0xbc, 0xfe,
5702 	0xb2, 0xbc, 0x9a, 0xcb, 0x6c, 0x1a, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7,
5703 	0xcb, 0x97, 0xfe, 0x92, 0x17, 0xfe, 0x5c, 0x14, 0x35, 0x04, 0xb9, 0x23,
5704 	0xfe, 0x7e, 0x17, 0xfe, 0x42, 0x10, 0xfe, 0x02, 0xf6, 0x11, 0x75, 0xfe,
5705 	0x18, 0xfe, 0x60, 0xfe, 0x19, 0xfe, 0x61, 0xfe, 0x03, 0xa1, 0xfe, 0x1d,
5706 	0xf7, 0x5b, 0x97, 0xfe, 0xb8, 0x17, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13,
5707 	0x9a, 0x5b, 0x41, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7,
5708 	0x11, 0xfe, 0x81, 0xe7, 0x11, 0x12, 0xfe, 0xdd, 0x00, 0x6a, 0x2a, 0x04,
5709 	0x6a, 0x2a, 0xfe, 0x12, 0x45, 0x23, 0xfe, 0xa8, 0x17, 0x15, 0x06, 0x39,
5710 	0xa0, 0xb4, 0x02, 0x2b, 0xfe, 0x39, 0xf0, 0xfe, 0xfc, 0x17, 0x21, 0x04,
5711 	0xfe, 0x7e, 0x18, 0x1e, 0x19, 0x66, 0x0f, 0x0d, 0x04, 0x75, 0x03, 0xd2,
5712 	0x1e, 0x06, 0xfe, 0xef, 0x12, 0xfe, 0xe1, 0x10, 0x7c, 0x6f, 0x4f, 0x32,
5713 	0x07, 0x2f, 0xfe, 0x3c, 0x13, 0xf1, 0xfe, 0x42, 0x13, 0x42, 0x92, 0x09,
5714 	0x48, 0x01, 0x0e, 0xbb, 0xeb, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
5715 	0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe, 0xf3, 0x13, 0x43, 0x78, 0x07, 0x11,
5716 	0xac, 0x09, 0x84, 0x01, 0x0e, 0xfe, 0x80, 0x4c, 0x01, 0x73, 0xfe, 0x16,
5717 	0x10, 0x07, 0x82, 0x8b, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12, 0xfe, 0x14,
5718 	0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x1c, 0x18, 0x18, 0x0a, 0x04, 0xfe, 0x9c,
5719 	0xe7, 0x0a, 0x10, 0xfe, 0x15, 0x00, 0x64, 0x79, 0x2a, 0x01, 0xe3, 0x18,
5720 	0x06, 0x04, 0x42, 0x92, 0x08, 0x54, 0x1b, 0x37, 0x12, 0x2f, 0x01, 0x73,
5721 	0x18, 0x06, 0x04, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x3a, 0xce, 0x3b,
5722 	0xcf, 0xfe, 0x48, 0x55, 0x35, 0xfe, 0xc9, 0x55, 0x04, 0x22, 0xa3, 0x77,
5723 	0x13, 0xa3, 0x04, 0x09, 0xa4, 0x01, 0x0e, 0xfe, 0x41, 0x48, 0x09, 0x46,
5724 	0x01, 0x0e, 0xfe, 0x49, 0x44, 0x17, 0xfe, 0xe8, 0x18, 0x77, 0x78, 0x04,
5725 	0x09, 0x48, 0x01, 0x0e, 0x07, 0x11, 0x4e, 0x09, 0x5d, 0x01, 0xa8, 0x09,
5726 	0x46, 0x01, 0x0e, 0x77, 0x78, 0x04, 0xfe, 0x4e, 0xe4, 0x19, 0x6b, 0xfe,
5727 	0x1c, 0x19, 0x03, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10,
5728 	0xfe, 0x4e, 0xe4, 0xc9, 0x6b, 0xfe, 0x2e, 0x19, 0x03, 0xfe, 0x92, 0x00,
5729 	0xfe, 0x02, 0xe6, 0x1a, 0xe5, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x6b,
5730 	0xfe, 0x40, 0x19, 0x03, 0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x1f, 0xfe,
5731 	0x08, 0x10, 0x03, 0xfe, 0x96, 0x00, 0xfe, 0x02, 0xe6, 0x6d, 0xfe, 0x4e,
5732 	0x45, 0xea, 0xba, 0xff, 0x04, 0x68, 0x54, 0xe7, 0x1e, 0x6e, 0xfe, 0x08,
5733 	0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c, 0xfe, 0x1a, 0xf4, 0xfe, 0x00,
5734 	0x04, 0xea, 0xfe, 0x48, 0xf4, 0x19, 0x7a, 0xfe, 0x74, 0x19, 0x0f, 0x19,
5735 	0x04, 0x07, 0x7e, 0xfe, 0x5a, 0xf0, 0xfe, 0x84, 0x19, 0x25, 0xfe, 0x09,
5736 	0x00, 0xfe, 0x34, 0x10, 0x07, 0x1a, 0xfe, 0x5a, 0xf0, 0xfe, 0x92, 0x19,
5737 	0x25, 0xca, 0xfe, 0x26, 0x10, 0x07, 0x19, 0x66, 0x25, 0x6d, 0xe5, 0x07,
5738 	0x0a, 0x66, 0x25, 0x9e, 0xfe, 0x0e, 0x10, 0x07, 0x06, 0x66, 0x25, 0x59,
5739 	0xa9, 0xb8, 0x04, 0x15, 0xfe, 0x09, 0x00, 0x01, 0x36, 0xfe, 0x04, 0xfe,
5740 	0x81, 0x03, 0x83, 0xfe, 0x40, 0x5c, 0x04, 0x1c, 0xf7, 0xfe, 0x14, 0xf0,
5741 	0x0b, 0x27, 0xfe, 0xd6, 0x19, 0x1c, 0xf7, 0x7b, 0xf7, 0xfe, 0x82, 0xf0,
5742 	0xfe, 0xda, 0x19, 0x04, 0xff, 0xcc, 0x00, 0x00,
5743 };
5744 
5745 static unsigned short _adv_asc38C0800_size = sizeof(_adv_asc38C0800_buf);	/* 0x14E1 */
5746 static ADV_DCNT _adv_asc38C0800_chksum = 0x050D3FD8UL;	/* Expanded little-endian checksum. */
5747 
5748 /* Microcode buffer is kept after initialization for error recovery. */
5749 static unsigned char _adv_asc38C1600_buf[] = {
5750 	0x00, 0x00, 0x00, 0xf2, 0x00, 0x16, 0x00, 0xfc, 0x00, 0x10, 0x00, 0xf0,
5751 	0x18, 0xe4, 0x01, 0x00, 0x04, 0x1e, 0x48, 0xe4, 0x03, 0xf6, 0xf7, 0x13,
5752 	0x2e, 0x1e, 0x02, 0x00, 0x07, 0x17, 0xc0, 0x5f, 0x00, 0xfa, 0xff, 0xff,
5753 	0x04, 0x00, 0x00, 0xf6, 0x09, 0xe7, 0x82, 0xe7, 0x85, 0xf0, 0x86, 0xf0,
5754 	0x4e, 0x10, 0x9e, 0xe7, 0xff, 0x00, 0x55, 0xf0, 0x01, 0xf6, 0x03, 0x00,
5755 	0x98, 0x57, 0x01, 0xe6, 0x00, 0xea, 0x00, 0xec, 0x01, 0xfa, 0x18, 0xf4,
5756 	0x08, 0x00, 0xf0, 0x1d, 0x38, 0x54, 0x32, 0xf0, 0x10, 0x00, 0xc2, 0x0e,
5757 	0x1e, 0xf0, 0xd5, 0xf0, 0xbc, 0x00, 0x4b, 0xe4, 0x00, 0xe6, 0xb1, 0xf0,
5758 	0xb4, 0x00, 0x02, 0x13, 0x3e, 0x1c, 0xc8, 0x47, 0x3e, 0x00, 0xd8, 0x01,
5759 	0x06, 0x13, 0x0c, 0x1c, 0x5e, 0x1e, 0x00, 0x57, 0xc8, 0x57, 0x01, 0xfc,
5760 	0xbc, 0x0e, 0xa2, 0x12, 0xb9, 0x54, 0x00, 0x80, 0x62, 0x0a, 0x5a, 0x12,
5761 	0xc8, 0x15, 0x3e, 0x1e, 0x18, 0x40, 0xbd, 0x56, 0x03, 0xe6, 0x01, 0xea,
5762 	0x5c, 0xf0, 0x0f, 0x00, 0x20, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
5763 	0x04, 0x13, 0xbb, 0x55, 0x3c, 0x56, 0x3e, 0x57, 0x03, 0x58, 0x4a, 0xe4,
5764 	0x40, 0x00, 0xb6, 0x00, 0xbb, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x01, 0x01,
5765 	0x3e, 0x01, 0x58, 0x0a, 0x44, 0x10, 0x0a, 0x12, 0x4c, 0x1c, 0x4e, 0x1c,
5766 	0x02, 0x4a, 0x30, 0xe4, 0x05, 0xe6, 0x0c, 0x00, 0x3c, 0x00, 0x80, 0x00,
5767 	0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x70, 0x01, 0x72, 0x01,
5768 	0x74, 0x01, 0x76, 0x01, 0x78, 0x01, 0x7c, 0x01, 0xc6, 0x0e, 0x0c, 0x10,
5769 	0xac, 0x12, 0xae, 0x12, 0x16, 0x1a, 0x32, 0x1c, 0x6e, 0x1e, 0x02, 0x48,
5770 	0x3a, 0x55, 0xc9, 0x57, 0x02, 0xee, 0x5b, 0xf0, 0x03, 0xf7, 0x06, 0xf7,
5771 	0x03, 0xfc, 0x06, 0x00, 0x1e, 0x00, 0xbe, 0x00, 0xe1, 0x00, 0x0c, 0x12,
5772 	0x18, 0x1a, 0x70, 0x1a, 0x30, 0x1c, 0x38, 0x1c, 0x10, 0x44, 0x00, 0x4c,
5773 	0xb0, 0x57, 0x40, 0x5c, 0x4d, 0xe4, 0x04, 0xea, 0x5d, 0xf0, 0xa7, 0xf0,
5774 	0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x09, 0x00, 0x19, 0x00, 0x32, 0x00,
5775 	0x33, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xcc, 0x00,
5776 	0x20, 0x01, 0x4e, 0x01, 0x79, 0x01, 0x3c, 0x09, 0x68, 0x0d, 0x02, 0x10,
5777 	0x04, 0x10, 0x3a, 0x10, 0x08, 0x12, 0x0a, 0x13, 0x40, 0x16, 0x50, 0x16,
5778 	0x00, 0x17, 0x4a, 0x19, 0x00, 0x4e, 0x00, 0x54, 0x01, 0x58, 0x00, 0xdc,
5779 	0x05, 0xf0, 0x09, 0xf0, 0x59, 0xf0, 0xb8, 0xf0, 0x48, 0xf4, 0x0e, 0xf7,
5780 	0x0a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00,
5781 	0xd0, 0x00, 0xe7, 0x00, 0xf0, 0x03, 0x69, 0x08, 0xe9, 0x09, 0x5c, 0x0c,
5782 	0xb6, 0x12, 0xbc, 0x19, 0xd8, 0x1b, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c,
5783 	0x42, 0x1d, 0x08, 0x44, 0x38, 0x44, 0x91, 0x44, 0x0a, 0x45, 0x48, 0x46,
5784 	0x89, 0x48, 0x68, 0x54, 0x83, 0x55, 0x83, 0x59, 0x31, 0xe4, 0x02, 0xe6,
5785 	0x07, 0xf0, 0x08, 0xf0, 0x0b, 0xf0, 0x0c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8,
5786 	0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa, 0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00,
5787 	0xa8, 0x00, 0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0xe5, 0x00, 0x22, 0x01,
5788 	0x26, 0x01, 0x60, 0x01, 0x7a, 0x01, 0x82, 0x01, 0xc8, 0x01, 0xca, 0x01,
5789 	0x86, 0x02, 0x6a, 0x03, 0x18, 0x05, 0xb2, 0x07, 0x68, 0x08, 0x10, 0x0d,
5790 	0x06, 0x10, 0x0a, 0x10, 0x0e, 0x10, 0x12, 0x10, 0x60, 0x10, 0xed, 0x10,
5791 	0xf3, 0x10, 0x06, 0x12, 0x10, 0x12, 0x1e, 0x12, 0x0c, 0x13, 0x0e, 0x13,
5792 	0x10, 0x13, 0xfe, 0x9c, 0xf0, 0x35, 0x05, 0xfe, 0xec, 0x0e, 0xff, 0x10,
5793 	0x00, 0x00, 0xe9, 0xfe, 0x34, 0x1f, 0x00, 0xe8, 0xfe, 0x88, 0x01, 0xff,
5794 	0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
5795 	0x00, 0xfe, 0x57, 0x24, 0x00, 0xfe, 0x4c, 0x00, 0x65, 0xff, 0x04, 0x00,
5796 	0x00, 0x1a, 0xff, 0x09, 0x00, 0x00, 0xff, 0x08, 0x01, 0x01, 0xff, 0x08,
5797 	0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10, 0xff, 0xff, 0xff, 0x13,
5798 	0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
5799 	0xfe, 0x04, 0xf7, 0xe8, 0x37, 0x7d, 0x0d, 0x01, 0xfe, 0x4a, 0x11, 0xfe,
5800 	0x04, 0xf7, 0xe8, 0x7d, 0x0d, 0x51, 0x37, 0xfe, 0x3d, 0xf0, 0xfe, 0x0c,
5801 	0x02, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x91, 0xf0, 0xfe, 0xf8, 0x01, 0xfe,
5802 	0x90, 0xf0, 0xfe, 0xf8, 0x01, 0xfe, 0x8f, 0xf0, 0xbc, 0x03, 0x67, 0x4d,
5803 	0x05, 0xfe, 0x08, 0x0f, 0x01, 0xfe, 0x78, 0x0f, 0xfe, 0xdd, 0x12, 0x05,
5804 	0xfe, 0x0e, 0x03, 0xfe, 0x28, 0x1c, 0x03, 0xfe, 0xa6, 0x00, 0xfe, 0xd1,
5805 	0x12, 0x3e, 0x22, 0xfe, 0xa6, 0x00, 0xac, 0xfe, 0x48, 0xf0, 0xfe, 0x90,
5806 	0x02, 0xfe, 0x49, 0xf0, 0xfe, 0xaa, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc8,
5807 	0x02, 0xfe, 0x46, 0xf0, 0xfe, 0x5a, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x60,
5808 	0x02, 0xfe, 0x43, 0xf0, 0xfe, 0x4e, 0x02, 0xfe, 0x44, 0xf0, 0xfe, 0x52,
5809 	0x02, 0xfe, 0x45, 0xf0, 0xfe, 0x56, 0x02, 0x1c, 0x0d, 0xa2, 0x1c, 0x07,
5810 	0x22, 0xb7, 0x05, 0x35, 0xfe, 0x00, 0x1c, 0xfe, 0xf1, 0x10, 0xfe, 0x02,
5811 	0x1c, 0xf5, 0xfe, 0x1e, 0x1c, 0xfe, 0xe9, 0x10, 0x01, 0x5f, 0xfe, 0xe7,
5812 	0x10, 0xfe, 0x06, 0xfc, 0xde, 0x0a, 0x81, 0x01, 0xa3, 0x05, 0x35, 0x1f,
5813 	0x95, 0x47, 0xb8, 0x01, 0xfe, 0xe4, 0x11, 0x0a, 0x81, 0x01, 0x5c, 0xfe,
5814 	0xbd, 0x10, 0x0a, 0x81, 0x01, 0x5c, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c,
5815 	0xfe, 0x58, 0x1c, 0x1c, 0x07, 0x22, 0xb7, 0x37, 0x2a, 0x35, 0xfe, 0x3d,
5816 	0xf0, 0xfe, 0x0c, 0x02, 0x2b, 0xfe, 0x9e, 0x02, 0xfe, 0x5a, 0x1c, 0xfe,
5817 	0x12, 0x1c, 0xfe, 0x14, 0x1c, 0x1f, 0xfe, 0x30, 0x00, 0x47, 0xb8, 0x01,
5818 	0xfe, 0xd4, 0x11, 0x1c, 0x07, 0x22, 0xb7, 0x05, 0xe9, 0x21, 0x2c, 0x09,
5819 	0x1a, 0x31, 0xfe, 0x69, 0x10, 0x1c, 0x07, 0x22, 0xb7, 0xfe, 0x04, 0xec,
5820 	0x2c, 0x60, 0x01, 0xfe, 0x1e, 0x1e, 0x20, 0x2c, 0xfe, 0x05, 0xf6, 0xde,
5821 	0x01, 0xfe, 0x62, 0x1b, 0x01, 0x0c, 0x61, 0x4a, 0x44, 0x15, 0x56, 0x51,
5822 	0x01, 0xfe, 0x9e, 0x1e, 0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x0a, 0x57,
5823 	0x01, 0x18, 0x09, 0x00, 0x36, 0x01, 0x85, 0xfe, 0x18, 0x10, 0xfe, 0x41,
5824 	0x58, 0x0a, 0xba, 0x01, 0x18, 0xfe, 0xc8, 0x54, 0x7b, 0xfe, 0x1c, 0x03,
5825 	0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x37, 0x60, 0xfe, 0x02, 0xe8, 0x30,
5826 	0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe, 0x27, 0xf0,
5827 	0xfe, 0xe4, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x40,
5828 	0x1c, 0x2a, 0xeb, 0xfe, 0x26, 0xf0, 0xfe, 0x66, 0x03, 0xfe, 0xa0, 0xf0,
5829 	0xfe, 0x54, 0x03, 0xfe, 0x11, 0xf0, 0xbc, 0xfe, 0xef, 0x10, 0xfe, 0x9f,
5830 	0xf0, 0xfe, 0x74, 0x03, 0xfe, 0x46, 0x1c, 0x19, 0xfe, 0x11, 0x00, 0x05,
5831 	0x70, 0x37, 0xfe, 0x48, 0x1c, 0xfe, 0x46, 0x1c, 0x01, 0x0c, 0x06, 0x28,
5832 	0xfe, 0x18, 0x13, 0x26, 0x21, 0xb9, 0xc7, 0x20, 0xb9, 0x0a, 0x57, 0x01,
5833 	0x18, 0xc7, 0x89, 0x01, 0xfe, 0xc8, 0x1a, 0x15, 0xe1, 0x2a, 0xeb, 0xfe,
5834 	0x01, 0xf0, 0xeb, 0xfe, 0x82, 0xf0, 0xfe, 0xa4, 0x03, 0xfe, 0x9c, 0x32,
5835 	0x15, 0xfe, 0xe4, 0x00, 0x2f, 0xfe, 0xb6, 0x03, 0x2a, 0x3c, 0x16, 0xfe,
5836 	0xc6, 0x03, 0x01, 0x41, 0xfe, 0x06, 0xf0, 0xfe, 0xd6, 0x03, 0xaf, 0xa0,
5837 	0xfe, 0x0a, 0xf0, 0xfe, 0xa2, 0x07, 0x05, 0x29, 0x03, 0x81, 0x1e, 0x1b,
5838 	0xfe, 0x24, 0x05, 0x1f, 0x63, 0x01, 0x42, 0x8f, 0xfe, 0x70, 0x02, 0x05,
5839 	0xea, 0xfe, 0x46, 0x1c, 0x37, 0x7d, 0x1d, 0xfe, 0x67, 0x1b, 0xfe, 0xbf,
5840 	0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c, 0x75, 0x01, 0xa6, 0x86, 0x0a,
5841 	0x57, 0x01, 0x18, 0x09, 0x00, 0x1b, 0xec, 0x0a, 0xe1, 0x01, 0x18, 0x77,
5842 	0x50, 0x40, 0x8d, 0x30, 0x03, 0x81, 0x1e, 0xf8, 0x1f, 0x63, 0x01, 0x42,
5843 	0x8f, 0xfe, 0x70, 0x02, 0x05, 0xea, 0xd7, 0x99, 0xd8, 0x9c, 0x2a, 0x29,
5844 	0x2f, 0xfe, 0x4e, 0x04, 0x16, 0xfe, 0x4a, 0x04, 0x7e, 0xfe, 0xa0, 0x00,
5845 	0xfe, 0x9b, 0x57, 0xfe, 0x54, 0x12, 0x32, 0xff, 0x02, 0x00, 0x10, 0x01,
5846 	0x08, 0x16, 0xfe, 0x02, 0x05, 0x32, 0x01, 0x08, 0x16, 0x29, 0x27, 0x25,
5847 	0xee, 0xfe, 0x4c, 0x44, 0xfe, 0x58, 0x12, 0x50, 0xfe, 0x44, 0x48, 0x13,
5848 	0x34, 0xfe, 0x4c, 0x54, 0x7b, 0xec, 0x60, 0x8d, 0x30, 0x01, 0xfe, 0x4e,
5849 	0x1e, 0xfe, 0x48, 0x47, 0xfe, 0x7c, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xfe,
5850 	0x32, 0x13, 0x01, 0x43, 0x09, 0x9b, 0xfe, 0x68, 0x13, 0xfe, 0x26, 0x10,
5851 	0x13, 0x34, 0xfe, 0x4c, 0x54, 0x7b, 0xec, 0x01, 0xfe, 0x4e, 0x1e, 0xfe,
5852 	0x48, 0x47, 0xfe, 0x54, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xa5, 0x01, 0x43,
5853 	0x09, 0x9b, 0xfe, 0x40, 0x13, 0x01, 0x0c, 0x06, 0x28, 0xf9, 0x1f, 0x7f,
5854 	0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42, 0x8f,
5855 	0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x32, 0x15, 0xfe, 0xe6, 0x00, 0x0f, 0xfe,
5856 	0x1c, 0x90, 0x04, 0xfe, 0x9c, 0x93, 0x3a, 0x0b, 0x0e, 0x8b, 0x02, 0x1f,
5857 	0x7f, 0x01, 0x42, 0x05, 0x35, 0xfe, 0x42, 0x5b, 0x7d, 0x1d, 0xfe, 0x46,
5858 	0x59, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0x0f, 0xfe, 0x87, 0x80, 0x04,
5859 	0xfe, 0x87, 0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0xd0, 0x65, 0x01, 0x0c,
5860 	0x06, 0x0d, 0xfe, 0x98, 0x13, 0x0f, 0xfe, 0x20, 0x80, 0x04, 0xfe, 0xa0,
5861 	0x83, 0x33, 0x0b, 0x0e, 0x09, 0x1d, 0xfe, 0x84, 0x12, 0x01, 0x38, 0x06,
5862 	0x07, 0xfe, 0x70, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x1e, 0x1b, 0xfe, 0xda,
5863 	0x05, 0xd0, 0x54, 0x01, 0x38, 0x06, 0x0d, 0xfe, 0x58, 0x13, 0x03, 0xfe,
5864 	0xa0, 0x00, 0x1e, 0xfe, 0x50, 0x12, 0x5e, 0xff, 0x02, 0x00, 0x10, 0x2f,
5865 	0xfe, 0x90, 0x05, 0x2a, 0x3c, 0xcc, 0xff, 0x02, 0x00, 0x10, 0x2f, 0xfe,
5866 	0x9e, 0x05, 0x17, 0xfe, 0xf4, 0x05, 0x15, 0xfe, 0xe3, 0x00, 0x26, 0x01,
5867 	0x38, 0xfe, 0x4a, 0xf0, 0xfe, 0xc0, 0x05, 0xfe, 0x49, 0xf0, 0xfe, 0xba,
5868 	0x05, 0x71, 0x2e, 0xfe, 0x21, 0x00, 0xf1, 0x2e, 0xfe, 0x22, 0x00, 0xa2,
5869 	0x2e, 0x4a, 0xfe, 0x09, 0x48, 0xff, 0x02, 0x00, 0x10, 0x2f, 0xfe, 0xd0,
5870 	0x05, 0x17, 0xfe, 0xf4, 0x05, 0xfe, 0xe2, 0x08, 0x01, 0x38, 0x06, 0xfe,
5871 	0x1c, 0x00, 0x4d, 0x01, 0xa7, 0x2e, 0x07, 0x20, 0xe4, 0x47, 0xfe, 0x27,
5872 	0x01, 0x01, 0x0c, 0x06, 0x28, 0xfe, 0x24, 0x12, 0x3e, 0x01, 0x84, 0x1f,
5873 	0x7f, 0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42,
5874 	0x8f, 0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x03, 0xe6, 0x1e, 0xfe, 0xca, 0x13,
5875 	0x03, 0xb6, 0x1e, 0xfe, 0x40, 0x12, 0x03, 0x66, 0x1e, 0xfe, 0x38, 0x13,
5876 	0x3e, 0x01, 0x84, 0x17, 0xfe, 0x72, 0x06, 0x0a, 0x07, 0x01, 0x38, 0x06,
5877 	0x24, 0xfe, 0x02, 0x12, 0x4f, 0x01, 0xfe, 0x56, 0x19, 0x16, 0xfe, 0x68,
5878 	0x06, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x03, 0x66, 0x8a, 0x10, 0x66,
5879 	0x03, 0x9a, 0x1e, 0xfe, 0x70, 0x12, 0x03, 0x55, 0x1e, 0xfe, 0x68, 0x13,
5880 	0x01, 0xc6, 0x09, 0x12, 0x48, 0xfe, 0x92, 0x06, 0x2e, 0x12, 0x01, 0xfe,
5881 	0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0x13, 0x58, 0xff, 0x02, 0x00,
5882 	0x57, 0x52, 0xad, 0x23, 0x3f, 0x4e, 0x62, 0x49, 0x3e, 0x01, 0x84, 0x17,
5883 	0xfe, 0xea, 0x06, 0x01, 0x38, 0x06, 0x12, 0xf7, 0x45, 0x0a, 0x95, 0x01,
5884 	0xfe, 0x84, 0x19, 0x16, 0xfe, 0xe0, 0x06, 0x15, 0x82, 0x01, 0x41, 0x15,
5885 	0xe2, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x1c, 0x07, 0x01, 0x84, 0xfe, 0xae,
5886 	0x10, 0x03, 0x6f, 0x1e, 0xfe, 0x9e, 0x13, 0x3e, 0x01, 0x84, 0x03, 0x9a,
5887 	0x1e, 0xfe, 0x1a, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfc, 0x01, 0xc6, 0x01,
5888 	0xfe, 0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0xf0, 0x45, 0x0a, 0x95,
5889 	0x03, 0xb6, 0x1e, 0xf8, 0x01, 0x38, 0x06, 0x24, 0x36, 0xfe, 0x02, 0xf6,
5890 	0x07, 0x71, 0x78, 0x8c, 0x00, 0x4d, 0x62, 0x49, 0x3e, 0x2d, 0x93, 0x4e,
5891 	0xd0, 0x0d, 0x17, 0xfe, 0x9a, 0x07, 0x01, 0xfe, 0xc0, 0x19, 0x16, 0xfe,
5892 	0x90, 0x07, 0x26, 0x20, 0x9e, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x21,
5893 	0x9e, 0x09, 0x07, 0xfb, 0x03, 0xe6, 0xfe, 0x58, 0x57, 0x10, 0xe6, 0x05,
5894 	0xfe, 0x2a, 0x06, 0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x1c, 0x07, 0x01, 0x84,
5895 	0xfe, 0x9c, 0x32, 0x5f, 0x75, 0x01, 0xa6, 0x86, 0x15, 0xfe, 0xe2, 0x00,
5896 	0x2f, 0xed, 0x2a, 0x3c, 0xfe, 0x0a, 0xf0, 0xfe, 0xce, 0x07, 0xae, 0xfe,
5897 	0x96, 0x08, 0xfe, 0x06, 0xf0, 0xfe, 0x9e, 0x08, 0xaf, 0xa0, 0x05, 0x29,
5898 	0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x2e, 0x12, 0x14, 0x1d, 0x01, 0x08, 0x14,
5899 	0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0xfe,
5900 	0x99, 0xa4, 0x01, 0x08, 0x14, 0x00, 0x05, 0xfe, 0xc6, 0x09, 0x01, 0x76,
5901 	0x06, 0x12, 0xfe, 0x3a, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x30, 0x13,
5902 	0x14, 0xfe, 0x1b, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00,
5903 	0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x07, 0x01, 0x08, 0x14, 0x00,
5904 	0x05, 0xef, 0x7c, 0x4a, 0x78, 0x4f, 0x0f, 0xfe, 0x9a, 0x81, 0x04, 0xfe,
5905 	0x9a, 0x83, 0xfe, 0xcb, 0x47, 0x0b, 0x0e, 0x2d, 0x28, 0x48, 0xfe, 0x6c,
5906 	0x08, 0x0a, 0x28, 0xfe, 0x09, 0x6f, 0xca, 0xfe, 0xca, 0x45, 0xfe, 0x32,
5907 	0x12, 0x53, 0x63, 0x4e, 0x7c, 0x97, 0x2f, 0xfe, 0x7e, 0x08, 0x2a, 0x3c,
5908 	0xfe, 0x0a, 0xf0, 0xfe, 0x6c, 0x08, 0xaf, 0xa0, 0xae, 0xfe, 0x96, 0x08,
5909 	0x05, 0x29, 0x01, 0x41, 0x05, 0xed, 0x14, 0x24, 0x05, 0xed, 0xfe, 0x9c,
5910 	0xf7, 0x9f, 0x01, 0xfe, 0xae, 0x1e, 0xfe, 0x18, 0x58, 0x01, 0xfe, 0xbe,
5911 	0x1e, 0xfe, 0x99, 0x58, 0xfe, 0x78, 0x18, 0xfe, 0xf9, 0x18, 0x8e, 0xfe,
5912 	0x16, 0x09, 0x10, 0x6a, 0x22, 0x6b, 0x01, 0x0c, 0x61, 0x54, 0x44, 0x21,
5913 	0x2c, 0x09, 0x1a, 0xf8, 0x77, 0x01, 0xfe, 0x7e, 0x1e, 0x47, 0x2c, 0x7a,
5914 	0x30, 0xf0, 0xfe, 0x83, 0xe7, 0xfe, 0x3f, 0x00, 0x71, 0xfe, 0x03, 0x40,
5915 	0x01, 0x0c, 0x61, 0x65, 0x44, 0x01, 0xc2, 0xc8, 0xfe, 0x1f, 0x40, 0x20,
5916 	0x6e, 0x01, 0xfe, 0x6a, 0x16, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe,
5917 	0x44, 0x51, 0xfe, 0xc6, 0x51, 0xfe, 0x10, 0x10, 0x01, 0xfe, 0xce, 0x1e,
5918 	0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x01, 0xfe, 0xee, 0x1e,
5919 	0x01, 0xfe, 0xfe, 0x1e, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x10, 0x4b,
5920 	0x22, 0x4c, 0xfe, 0x8a, 0x10, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0x50, 0x12,
5921 	0x01, 0xfe, 0xae, 0x1e, 0x01, 0xfe, 0xbe, 0x1e, 0x10, 0x6a, 0x22, 0x6b,
5922 	0x01, 0x0c, 0x06, 0x65, 0x4e, 0x01, 0xc2, 0x0f, 0xfe, 0x1f, 0x80, 0x04,
5923 	0xfe, 0x9f, 0x83, 0x33, 0x0b, 0x0e, 0x20, 0x6e, 0x0f, 0xfe, 0x44, 0x90,
5924 	0x04, 0xfe, 0xc4, 0x93, 0x3a, 0x0b, 0xfe, 0xc6, 0x90, 0x04, 0xfe, 0xc6,
5925 	0x93, 0x79, 0x0b, 0x0e, 0x10, 0x6c, 0x22, 0x6d, 0x01, 0xfe, 0xce, 0x1e,
5926 	0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x0f, 0xfe, 0x40, 0x90,
5927 	0x04, 0xfe, 0xc0, 0x93, 0x3a, 0x0b, 0xfe, 0xc2, 0x90, 0x04, 0xfe, 0xc2,
5928 	0x93, 0x79, 0x0b, 0x0e, 0x10, 0x4b, 0x22, 0x4c, 0x10, 0x64, 0x22, 0x34,
5929 	0x01, 0x0c, 0x61, 0x24, 0x44, 0x37, 0x13, 0xfe, 0x4e, 0x11, 0x2f, 0xfe,
5930 	0xde, 0x09, 0xfe, 0x9e, 0xf0, 0xfe, 0xf2, 0x09, 0xfe, 0x01, 0x48, 0x1b,
5931 	0x3c, 0x37, 0x88, 0xf5, 0xd4, 0xfe, 0x1e, 0x0a, 0xd5, 0xfe, 0x42, 0x0a,
5932 	0xd2, 0xfe, 0x1e, 0x0a, 0xd3, 0xfe, 0x42, 0x0a, 0xae, 0xfe, 0x12, 0x0a,
5933 	0xfe, 0x06, 0xf0, 0xfe, 0x18, 0x0a, 0xaf, 0xa0, 0x05, 0x29, 0x01, 0x41,
5934 	0xfe, 0xc1, 0x10, 0x14, 0x24, 0xfe, 0xc1, 0x10, 0x01, 0x76, 0x06, 0x07,
5935 	0xfe, 0x14, 0x12, 0x01, 0x76, 0x06, 0x0d, 0x5d, 0x01, 0x0c, 0x06, 0x0d,
5936 	0xfe, 0x74, 0x12, 0xfe, 0x2e, 0x1c, 0x05, 0xfe, 0x1a, 0x0c, 0x01, 0x76,
5937 	0x06, 0x07, 0x5d, 0x01, 0x76, 0x06, 0x0d, 0x41, 0xfe, 0x2c, 0x1c, 0xfe,
5938 	0xaa, 0xf0, 0xfe, 0xce, 0x0a, 0xfe, 0xac, 0xf0, 0xfe, 0x66, 0x0a, 0xfe,
5939 	0x92, 0x10, 0xc4, 0xf6, 0xfe, 0xad, 0xf0, 0xfe, 0x72, 0x0a, 0x05, 0xfe,
5940 	0x1a, 0x0c, 0xc5, 0xfe, 0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0xbf, 0xfe, 0x6b,
5941 	0x18, 0x23, 0xfe, 0x00, 0xfe, 0xfe, 0x1c, 0x12, 0xac, 0xfe, 0xd2, 0xf0,
5942 	0xbf, 0xfe, 0x76, 0x18, 0x23, 0x1d, 0x1b, 0xbf, 0x03, 0xe3, 0x23, 0x07,
5943 	0x1b, 0xbf, 0xd4, 0x5b, 0xd5, 0x5b, 0xd2, 0x5b, 0xd3, 0x5b, 0xc4, 0xc5,
5944 	0xfe, 0xa9, 0x10, 0x75, 0x5e, 0x32, 0x1f, 0x7f, 0x01, 0x42, 0x19, 0xfe,
5945 	0x35, 0x00, 0xfe, 0x01, 0xf0, 0x70, 0x19, 0x98, 0x05, 0x70, 0xfe, 0x74,
5946 	0x18, 0x23, 0xfe, 0x00, 0xf8, 0x1b, 0x5b, 0x7d, 0x12, 0x01, 0xfe, 0x78,
5947 	0x0f, 0x4d, 0x01, 0xfe, 0x96, 0x1a, 0x21, 0x30, 0x77, 0x7d, 0x1d, 0x05,
5948 	0x5b, 0x01, 0x0c, 0x06, 0x0d, 0x2b, 0xfe, 0xe2, 0x0b, 0x01, 0x0c, 0x06,
5949 	0x54, 0xfe, 0xa6, 0x12, 0x01, 0x0c, 0x06, 0x24, 0xfe, 0x88, 0x13, 0x21,
5950 	0x6e, 0xc7, 0x01, 0xfe, 0x1e, 0x1f, 0x0f, 0xfe, 0x83, 0x80, 0x04, 0xfe,
5951 	0x83, 0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0xfe, 0xc8, 0x44, 0xfe, 0x42,
5952 	0x13, 0x0f, 0xfe, 0x04, 0x91, 0x04, 0xfe, 0x84, 0x93, 0xfe, 0xca, 0x57,
5953 	0x0b, 0xfe, 0x86, 0x91, 0x04, 0xfe, 0x86, 0x93, 0xfe, 0xcb, 0x57, 0x0b,
5954 	0x0e, 0x7a, 0x30, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x8e, 0x40, 0x03,
5955 	0x6a, 0x3b, 0x6b, 0x10, 0x97, 0x22, 0x98, 0xd9, 0x6a, 0xda, 0x6b, 0x01,
5956 	0xc2, 0xc8, 0x7a, 0x30, 0x20, 0x6e, 0xdb, 0x64, 0xdc, 0x34, 0x91, 0x6c,
5957 	0x7e, 0x6d, 0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55, 0xfe, 0x04, 0xfa, 0x64,
5958 	0xfe, 0x05, 0xfa, 0x34, 0x01, 0xfe, 0x6a, 0x16, 0xa3, 0x26, 0x10, 0x97,
5959 	0x10, 0x98, 0x91, 0x6c, 0x7e, 0x6d, 0xfe, 0x14, 0x10, 0x01, 0x0c, 0x06,
5960 	0x24, 0x1b, 0x40, 0x91, 0x4b, 0x7e, 0x4c, 0x01, 0x0c, 0x06, 0xfe, 0xf7,
5961 	0x00, 0x44, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58,
5962 	0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x05, 0x5b, 0x01, 0x0c, 0x06, 0x24,
5963 	0x1b, 0x40, 0x01, 0x0c, 0x06, 0xfe, 0xf7, 0x00, 0x44, 0x78, 0x01, 0xfe,
5964 	0x8e, 0x1e, 0x4f, 0x0f, 0xfe, 0x10, 0x90, 0x04, 0xfe, 0x90, 0x93, 0x3a,
5965 	0x0b, 0xfe, 0x92, 0x90, 0x04, 0xfe, 0x92, 0x93, 0x79, 0x0b, 0x0e, 0xfe,
5966 	0xbd, 0x10, 0x01, 0x43, 0x09, 0xbb, 0x1b, 0xfe, 0x6e, 0x0a, 0x15, 0xbb,
5967 	0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x14, 0x13, 0x03, 0x4b, 0x3b, 0x4c, 0x8e,
5968 	0xfe, 0x6e, 0x0a, 0xfe, 0x0c, 0x58, 0xfe, 0x8d, 0x58, 0x05, 0x5b, 0x26,
5969 	0x3e, 0x0f, 0xfe, 0x19, 0x80, 0x04, 0xfe, 0x99, 0x83, 0x33, 0x0b, 0x0e,
5970 	0xfe, 0xe5, 0x10, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1a, 0x12, 0xfe, 0x6c,
5971 	0x19, 0xfe, 0x19, 0x41, 0xfe, 0x6b, 0x18, 0xac, 0xfe, 0xd1, 0xf0, 0xef,
5972 	0x1f, 0x92, 0x01, 0x42, 0x19, 0xfe, 0x44, 0x00, 0xfe, 0x90, 0x10, 0xfe,
5973 	0x6c, 0x19, 0xd9, 0x4b, 0xfe, 0xed, 0x19, 0xda, 0x4c, 0xfe, 0x0c, 0x51,
5974 	0xfe, 0x8e, 0x51, 0xfe, 0x6b, 0x18, 0x23, 0xfe, 0x00, 0xff, 0x31, 0xfe,
5975 	0x76, 0x10, 0xac, 0xfe, 0xd2, 0xf0, 0xfe, 0xba, 0x0c, 0xfe, 0x76, 0x18,
5976 	0x23, 0x1d, 0x5d, 0x03, 0xe3, 0x23, 0x07, 0xfe, 0x08, 0x13, 0x19, 0xfe,
5977 	0x16, 0x00, 0x05, 0x70, 0xfe, 0xd1, 0xf0, 0xfe, 0xcc, 0x0c, 0x1f, 0x92,
5978 	0x01, 0x42, 0x19, 0xfe, 0x17, 0x00, 0x5c, 0xfe, 0xce, 0xf0, 0xfe, 0xd2,
5979 	0x0c, 0xfe, 0x3e, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xde, 0x0c, 0x19, 0xfe,
5980 	0x22, 0x00, 0x05, 0x70, 0xfe, 0xcb, 0xf0, 0xfe, 0xea, 0x0c, 0x19, 0xfe,
5981 	0x24, 0x00, 0x05, 0x70, 0xfe, 0xd0, 0xf0, 0xfe, 0xf4, 0x0c, 0x19, 0x94,
5982 	0xfe, 0x1c, 0x10, 0xfe, 0xcf, 0xf0, 0xfe, 0xfe, 0x0c, 0x19, 0x4a, 0xf3,
5983 	0xfe, 0xcc, 0xf0, 0xef, 0x01, 0x76, 0x06, 0x24, 0x4d, 0x19, 0xfe, 0x12,
5984 	0x00, 0x37, 0x13, 0xfe, 0x4e, 0x11, 0x2f, 0xfe, 0x16, 0x0d, 0xfe, 0x9e,
5985 	0xf0, 0xfe, 0x2a, 0x0d, 0xfe, 0x01, 0x48, 0x1b, 0x3c, 0x37, 0x88, 0xf5,
5986 	0xd4, 0x29, 0xd5, 0x29, 0xd2, 0x29, 0xd3, 0x29, 0x37, 0xfe, 0x9c, 0x32,
5987 	0x2f, 0xfe, 0x3e, 0x0d, 0x2a, 0x3c, 0xae, 0xfe, 0x62, 0x0d, 0xaf, 0xa0,
5988 	0xd4, 0x9f, 0xd5, 0x9f, 0xd2, 0x9f, 0xd3, 0x9f, 0x05, 0x29, 0x01, 0x41,
5989 	0xfe, 0xd3, 0x10, 0x15, 0xfe, 0xe8, 0x00, 0xc4, 0xc5, 0x75, 0xd7, 0x99,
5990 	0xd8, 0x9c, 0xfe, 0x89, 0xf0, 0x29, 0x27, 0x25, 0xbe, 0xd7, 0x99, 0xd8,
5991 	0x9c, 0x2f, 0xfe, 0x8c, 0x0d, 0x16, 0x29, 0x27, 0x25, 0xbd, 0xfe, 0x01,
5992 	0x48, 0xa4, 0x19, 0xfe, 0x42, 0x00, 0x05, 0x70, 0x90, 0x07, 0xfe, 0x81,
5993 	0x49, 0x1b, 0xfe, 0x64, 0x0e, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x44, 0x13,
5994 	0x19, 0x00, 0x2d, 0x0d, 0xfe, 0x54, 0x12, 0x2d, 0xfe, 0x28, 0x00, 0x2b,
5995 	0xfe, 0xda, 0x0e, 0x0a, 0x57, 0x01, 0x18, 0x09, 0x00, 0x36, 0x46, 0xfe,
5996 	0x28, 0x00, 0xfe, 0xfa, 0x10, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe, 0x00,
5997 	0x1d, 0x0a, 0xba, 0x01, 0xfe, 0x58, 0x10, 0x40, 0x15, 0x56, 0x01, 0x85,
5998 	0x05, 0x35, 0x19, 0xfe, 0x44, 0x00, 0x2d, 0x0d, 0xf7, 0x46, 0x0d, 0xfe,
5999 	0xcc, 0x10, 0x01, 0xa7, 0x46, 0x0d, 0xfe, 0xc2, 0x10, 0x01, 0xa7, 0x0f,
6000 	0xfe, 0x19, 0x82, 0x04, 0xfe, 0x99, 0x83, 0xfe, 0xcc, 0x47, 0x0b, 0x0e,
6001 	0xfe, 0x34, 0x46, 0xa5, 0x46, 0x0d, 0x19, 0xfe, 0x43, 0x00, 0xfe, 0xa2,
6002 	0x10, 0x01, 0x0c, 0x61, 0x0d, 0x44, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe,
6003 	0x00, 0x1d, 0x40, 0x15, 0x56, 0x01, 0x85, 0x7d, 0x0d, 0x40, 0x51, 0x01,
6004 	0xfe, 0x9e, 0x1e, 0x05, 0xfe, 0x3a, 0x03, 0x01, 0x0c, 0x06, 0x0d, 0x5d,
6005 	0x46, 0x0d, 0x19, 0x00, 0xfe, 0x62, 0x10, 0x01, 0x76, 0x06, 0x12, 0xfe,
6006 	0x5c, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x52, 0x13, 0xfe, 0x1c, 0x1c,
6007 	0xfe, 0x9d, 0xf0, 0xfe, 0x8e, 0x0e, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0,
6008 	0xfe, 0x94, 0x0e, 0x01, 0x0c, 0x61, 0x12, 0x44, 0xfe, 0x9f, 0x10, 0x19,
6009 	0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0d, 0x4f, 0xfe, 0x2e, 0x10, 0x19,
6010 	0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x19, 0xfe, 0x47, 0x00, 0xf1, 0x19,
6011 	0xfe, 0x41, 0x00, 0xa2, 0x19, 0xfe, 0x24, 0x00, 0x86, 0xc4, 0xc5, 0x75,
6012 	0x03, 0x81, 0x1e, 0x2b, 0xea, 0x4f, 0xfe, 0x04, 0xe6, 0x12, 0xfe, 0x9d,
6013 	0x41, 0xfe, 0x1c, 0x42, 0x40, 0x01, 0xf4, 0x05, 0x35, 0xfe, 0x12, 0x1c,
6014 	0x1f, 0x0d, 0x47, 0xb5, 0xc3, 0x1f, 0xfe, 0x31, 0x00, 0x47, 0xb8, 0x01,
6015 	0xfe, 0xd4, 0x11, 0x05, 0xe9, 0x51, 0xfe, 0x06, 0xec, 0xe0, 0xfe, 0x0e,
6016 	0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0x06, 0xea, 0xe0,
6017 	0xfe, 0x47, 0x4b, 0x45, 0xfe, 0x75, 0x57, 0x03, 0x67, 0xfe, 0x98, 0x56,
6018 	0xfe, 0x38, 0x12, 0x0a, 0x5a, 0x01, 0x18, 0xfe, 0x44, 0x48, 0x60, 0x01,
6019 	0x0c, 0x06, 0x28, 0xfe, 0x18, 0x13, 0x0a, 0x57, 0x01, 0x18, 0x3e, 0xfe,
6020 	0x41, 0x58, 0x0a, 0xba, 0xfe, 0xfa, 0x14, 0xfe, 0x49, 0x54, 0xb0, 0xfe,
6021 	0x5e, 0x0f, 0x05, 0xfe, 0x3a, 0x03, 0x0a, 0x67, 0xfe, 0xe0, 0x14, 0xfe,
6022 	0x0e, 0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0xce, 0x47,
6023 	0xfe, 0xad, 0x13, 0x05, 0x35, 0x21, 0x2c, 0x09, 0x1a, 0xfe, 0x98, 0x12,
6024 	0x26, 0x20, 0x96, 0x20, 0xe7, 0xfe, 0x08, 0x1c, 0xfe, 0x7c, 0x19, 0xfe,
6025 	0xfd, 0x19, 0xfe, 0x0a, 0x1c, 0x03, 0xe5, 0xfe, 0x48, 0x55, 0xa5, 0x3b,
6026 	0xfe, 0x62, 0x01, 0xfe, 0xc9, 0x55, 0x31, 0xfe, 0x74, 0x10, 0x01, 0xfe,
6027 	0xf0, 0x1a, 0x03, 0xfe, 0x38, 0x01, 0x3b, 0xfe, 0x3a, 0x01, 0x8e, 0xfe,
6028 	0x1e, 0x10, 0xfe, 0x02, 0xec, 0xe7, 0x53, 0x00, 0x36, 0xfe, 0x04, 0xec,
6029 	0x2c, 0x60, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x62, 0x1b,
6030 	0x01, 0xfe, 0xce, 0x1e, 0xb2, 0x11, 0xfe, 0x18, 0x13, 0xca, 0xfe, 0x02,
6031 	0xea, 0xe7, 0x53, 0x92, 0xfe, 0xc3, 0x13, 0x1f, 0x12, 0x47, 0xb5, 0xc3,
6032 	0xfe, 0x2a, 0x10, 0x03, 0xfe, 0x38, 0x01, 0x23, 0xfe, 0xf0, 0xff, 0x10,
6033 	0xe5, 0x03, 0xfe, 0x3a, 0x01, 0x10, 0xfe, 0x62, 0x01, 0x01, 0xfe, 0x1e,
6034 	0x1e, 0x20, 0x2c, 0x15, 0x56, 0x01, 0xfe, 0x9e, 0x1e, 0x13, 0x07, 0x02,
6035 	0x26, 0x02, 0x21, 0x96, 0xc7, 0x20, 0x96, 0x09, 0x92, 0xfe, 0x79, 0x13,
6036 	0x1f, 0x1d, 0x47, 0xb5, 0xc3, 0xfe, 0xe1, 0x10, 0xcf, 0xfe, 0x03, 0xdc,
6037 	0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xcf, 0xfe, 0x03, 0xdc, 0xfe,
6038 	0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x26, 0xfe,
6039 	0x00, 0xcc, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x89, 0x02, 0x01, 0x0c, 0x06,
6040 	0x4a, 0xfe, 0x4e, 0x13, 0x0f, 0xfe, 0x1c, 0x80, 0x04, 0xfe, 0x9c, 0x83,
6041 	0x33, 0x0b, 0x0e, 0x09, 0x07, 0xfe, 0x3a, 0x13, 0x0f, 0xfe, 0x1e, 0x80,
6042 	0x04, 0xfe, 0x9e, 0x83, 0x33, 0x0b, 0x0e, 0xfe, 0x2a, 0x13, 0x0f, 0xfe,
6043 	0x1d, 0x80, 0x04, 0xfe, 0x9d, 0x83, 0xfe, 0xf9, 0x13, 0x0e, 0xfe, 0x1c,
6044 	0x13, 0x01, 0xfe, 0xee, 0x1e, 0xac, 0xfe, 0x14, 0x13, 0x01, 0xfe, 0xfe,
6045 	0x1e, 0xfe, 0x81, 0x58, 0xfa, 0x01, 0xfe, 0x0e, 0x1f, 0xfe, 0x30, 0xf4,
6046 	0x0d, 0xfe, 0x3c, 0x50, 0xa2, 0x01, 0xfe, 0x92, 0x1b, 0x01, 0x43, 0x09,
6047 	0x56, 0xfb, 0x01, 0xfe, 0xc8, 0x1a, 0x01, 0x0c, 0x06, 0x28, 0xa4, 0x01,
6048 	0xfe, 0xf4, 0x1c, 0x01, 0xfe, 0x00, 0x1d, 0x15, 0xfe, 0xe9, 0x00, 0x01,
6049 	0x0c, 0x06, 0x4a, 0xfe, 0x4e, 0x13, 0x01, 0xfe, 0x22, 0x1b, 0xfe, 0x1e,
6050 	0x1c, 0x0f, 0xfe, 0x14, 0x90, 0x04, 0xfe, 0x94, 0x93, 0x3a, 0x0b, 0xfe,
6051 	0x96, 0x90, 0x04, 0xfe, 0x96, 0x93, 0x79, 0x0b, 0x0e, 0x10, 0xfe, 0x64,
6052 	0x01, 0x22, 0xfe, 0x66, 0x01, 0x01, 0x0c, 0x06, 0x65, 0xf9, 0x0f, 0xfe,
6053 	0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b, 0x0e, 0x77, 0xfe, 0x01,
6054 	0xec, 0x2c, 0xfe, 0x80, 0x40, 0x20, 0x2c, 0x7a, 0x30, 0x15, 0xdf, 0x40,
6055 	0x21, 0x2c, 0xfe, 0x00, 0x40, 0x8d, 0x2c, 0x02, 0xfe, 0x08, 0x1c, 0x03,
6056 	0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58, 0x03, 0xfe, 0xae, 0x00, 0xfe, 0x07,
6057 	0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe, 0x08, 0x58, 0x03, 0xfe, 0xb2, 0x00,
6058 	0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c, 0x2e, 0x49, 0x20, 0xe0, 0x26, 0x10,
6059 	0x66, 0x10, 0x55, 0x10, 0x6f, 0x13, 0x57, 0x52, 0x4f, 0x1c, 0x28, 0xfe,
6060 	0x90, 0x4d, 0xfe, 0x91, 0x54, 0x2b, 0xfe, 0x88, 0x11, 0x46, 0x1a, 0x13,
6061 	0x5a, 0x52, 0x1c, 0x4a, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x2b, 0xfe,
6062 	0x9e, 0x11, 0x2e, 0x1a, 0x20, 0x2c, 0x90, 0x34, 0x60, 0x21, 0x2c, 0xfe,
6063 	0x00, 0x40, 0x8d, 0x2c, 0x15, 0xdf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0,
6064 	0xfe, 0xb2, 0x11, 0xfe, 0x12, 0x1c, 0x75, 0xfe, 0x14, 0x1c, 0xfe, 0x10,
6065 	0x1c, 0xfe, 0x18, 0x1c, 0x02, 0x51, 0xfe, 0x0c, 0x14, 0xfe, 0x0e, 0x47,
6066 	0xfe, 0x07, 0xe6, 0x28, 0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x02, 0x01,
6067 	0xa7, 0x90, 0x34, 0x60, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42,
6068 	0x13, 0xfe, 0x02, 0x80, 0x09, 0x56, 0xfe, 0x34, 0x13, 0x0a, 0x5a, 0x01,
6069 	0x18, 0xcb, 0xfe, 0x36, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
6070 	0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f, 0x89,
6071 	0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18, 0xfe, 0x80, 0x5c, 0x01, 0x85,
6072 	0xf2, 0x09, 0x9b, 0xa4, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0xec,
6073 	0x11, 0x02, 0xfe, 0x44, 0x58, 0x77, 0xfe, 0x01, 0xec, 0xb8, 0xfe, 0x9e,
6074 	0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x12, 0x8d, 0x30, 0x01,
6075 	0xf4, 0xfe, 0xdd, 0x10, 0x37, 0xd7, 0x99, 0xd8, 0x9c, 0x27, 0x25, 0xee,
6076 	0x09, 0x12, 0xfe, 0x48, 0x12, 0x09, 0x0d, 0xfe, 0x56, 0x12, 0x09, 0x1d,
6077 	0xfe, 0x30, 0x12, 0x09, 0xdd, 0x1b, 0xfe, 0xc4, 0x13, 0x09, 0xfe, 0x23,
6078 	0x00, 0x1b, 0xfe, 0xd0, 0x13, 0x09, 0x07, 0x1b, 0xfe, 0x34, 0x14, 0x09,
6079 	0x24, 0xfe, 0x12, 0x12, 0x09, 0x00, 0x1b, 0x29, 0x1f, 0xdd, 0x01, 0x42,
6080 	0xa1, 0x32, 0x01, 0x08, 0xae, 0x41, 0x02, 0x32, 0xfe, 0x62, 0x08, 0x0a,
6081 	0xe1, 0x01, 0xfe, 0x58, 0x10, 0x15, 0x9b, 0x05, 0x35, 0x32, 0x01, 0x43,
6082 	0x09, 0xbb, 0xfe, 0xd7, 0x13, 0x91, 0x4b, 0x7e, 0x4c, 0x8e, 0xfe, 0x80,
6083 	0x13, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0x72, 0x12, 0xdb, 0x64, 0xdc, 0x34,
6084 	0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55, 0xb0, 0xfe, 0x4a, 0x13, 0x21, 0x6e,
6085 	0xfe, 0x26, 0x13, 0x03, 0x97, 0x3b, 0x98, 0x8e, 0xfe, 0xb6, 0x0e, 0x10,
6086 	0x6a, 0x22, 0x6b, 0x26, 0x10, 0x97, 0x10, 0x98, 0x01, 0xc2, 0x2e, 0x49,
6087 	0x88, 0x20, 0x6e, 0x01, 0xfe, 0x6a, 0x16, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
6088 	0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x64, 0xfe, 0x05, 0xfa,
6089 	0x34, 0xfe, 0x8f, 0x10, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x40, 0x56, 0xfe,
6090 	0xe1, 0x56, 0x10, 0x6c, 0x22, 0x6d, 0x71, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
6091 	0x44, 0x55, 0xfe, 0xe5, 0x55, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x00, 0x56,
6092 	0xfe, 0xa1, 0x56, 0x10, 0x68, 0x22, 0x69, 0x01, 0x0c, 0x06, 0x54, 0xf9,
6093 	0x21, 0x6e, 0xfe, 0x1f, 0x40, 0x03, 0x6a, 0x3b, 0x6b, 0xfe, 0x2c, 0x50,
6094 	0xfe, 0xae, 0x50, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x44, 0x50, 0xfe, 0xc6,
6095 	0x50, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x03,
6096 	0x4b, 0x3b, 0x4c, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x05, 0x73, 0x2e,
6097 	0x07, 0x20, 0x9e, 0x05, 0x72, 0x32, 0x01, 0x08, 0x16, 0x3d, 0x27, 0x25,
6098 	0xee, 0x09, 0x07, 0x2b, 0x3d, 0x01, 0x43, 0x09, 0xbb, 0x2b, 0x72, 0x01,
6099 	0xa6, 0x23, 0x3f, 0x1b, 0x3d, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1e, 0x13,
6100 	0x91, 0x4b, 0x7e, 0x4c, 0xfe, 0x0a, 0x55, 0x31, 0xfe, 0x8b, 0x55, 0xd9,
6101 	0x4b, 0xda, 0x4c, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0x05, 0x72, 0x01,
6102 	0xfe, 0x8e, 0x1e, 0xca, 0xfe, 0x19, 0x41, 0x05, 0x72, 0x32, 0x01, 0x08,
6103 	0x2a, 0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbe, 0x2d, 0x1d, 0xc0, 0x2d, 0x0d,
6104 	0x83, 0x2d, 0x7f, 0x1b, 0xfe, 0x66, 0x15, 0x05, 0x3d, 0x01, 0x08, 0x2a,
6105 	0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbd, 0x09, 0x1d, 0x2b, 0x3d, 0x01, 0x08,
6106 	0x16, 0xc0, 0x27, 0x25, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49, 0x50, 0x03,
6107 	0xb6, 0x1e, 0x83, 0x01, 0x38, 0x06, 0x24, 0x31, 0xa1, 0xfe, 0xbb, 0x45,
6108 	0x2d, 0x00, 0xa4, 0x46, 0x07, 0x90, 0x3f, 0x01, 0xfe, 0xf8, 0x15, 0x01,
6109 	0xa6, 0x86, 0xfe, 0x4b, 0x45, 0xfe, 0x20, 0x13, 0x01, 0x43, 0x09, 0x82,
6110 	0xfe, 0x16, 0x13, 0x03, 0x9a, 0x1e, 0x5d, 0x03, 0x55, 0x1e, 0x31, 0x5e,
6111 	0x05, 0x72, 0xfe, 0xc0, 0x5d, 0x01, 0xa7, 0xfe, 0x03, 0x17, 0x03, 0x66,
6112 	0x8a, 0x10, 0x66, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01, 0xfe, 0x56,
6113 	0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d, 0x27, 0x25, 0xbd,
6114 	0x09, 0x07, 0x2b, 0x3d, 0x01, 0xfe, 0xbe, 0x16, 0xfe, 0x42, 0x58, 0xfe,
6115 	0xe8, 0x14, 0x01, 0xa6, 0x86, 0xfe, 0x4a, 0xf4, 0x0d, 0x1b, 0x3d, 0xfe,
6116 	0x4a, 0xf4, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09, 0x82, 0x4e, 0x05,
6117 	0x72, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73,
6118 	0x01, 0xfe, 0x84, 0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d,
6119 	0x27, 0x25, 0xbd, 0x09, 0x12, 0x2b, 0x3d, 0x01, 0xfe, 0xe8, 0x17, 0x8b,
6120 	0xfe, 0xaa, 0x14, 0xfe, 0xb6, 0x14, 0x86, 0xa8, 0xb2, 0x0d, 0x1b, 0x3d,
6121 	0xb2, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09, 0x82, 0x4e, 0x05, 0x72,
6122 	0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01,
6123 	0xfe, 0xc0, 0x19, 0x05, 0x73, 0x13, 0x07, 0x2f, 0xfe, 0xcc, 0x15, 0x17,
6124 	0xfe, 0xe2, 0x15, 0x5f, 0xcc, 0x01, 0x08, 0x26, 0x5f, 0x02, 0x8f, 0xfe,
6125 	0xde, 0x15, 0x2a, 0xfe, 0xde, 0x15, 0x16, 0xfe, 0xcc, 0x15, 0x5e, 0x32,
6126 	0x01, 0x08, 0xfe, 0xd5, 0x10, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
6127 	0xad, 0x23, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x02,
6128 	0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xad, 0x23, 0x3f, 0xfe, 0x30,
6129 	0x56, 0xfe, 0x00, 0x5c, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
6130 	0xad, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xfe, 0x00, 0x5e,
6131 	0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xad, 0xfe, 0x0b, 0x58,
6132 	0x02, 0x0a, 0x66, 0x01, 0x5c, 0x0a, 0x55, 0x01, 0x5c, 0x0a, 0x6f, 0x01,
6133 	0x5c, 0x02, 0x01, 0xfe, 0x1e, 0x1f, 0x23, 0x1a, 0xff, 0x03, 0x00, 0x54,
6134 	0xfe, 0x00, 0xf4, 0x24, 0x52, 0x0f, 0xfe, 0x00, 0x7c, 0x04, 0xfe, 0x07,
6135 	0x7c, 0x3a, 0x0b, 0x0e, 0xfe, 0x00, 0x71, 0xfe, 0xf9, 0x18, 0xfe, 0x7a,
6136 	0x19, 0xfe, 0xfb, 0x19, 0xfe, 0x1a, 0xf7, 0x00, 0xfe, 0x1b, 0xf7, 0x00,
6137 	0x7a, 0x30, 0x10, 0x68, 0x22, 0x69, 0xd9, 0x6c, 0xda, 0x6d, 0x02, 0xfe,
6138 	0x62, 0x08, 0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x77,
6139 	0x02, 0x01, 0xc6, 0xfe, 0x42, 0x48, 0x4f, 0x50, 0x45, 0x01, 0x08, 0x16,
6140 	0xfe, 0xe0, 0x17, 0x27, 0x25, 0xbe, 0x01, 0x08, 0x16, 0xfe, 0xe0, 0x17,
6141 	0x27, 0x25, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x03, 0x9a, 0x1e, 0xfe,
6142 	0xda, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfe, 0xd0, 0x13, 0x26, 0x53, 0x12,
6143 	0x48, 0xfe, 0x08, 0x17, 0xd1, 0x12, 0x53, 0x12, 0xfe, 0x1e, 0x13, 0x2d,
6144 	0xb4, 0x7b, 0xfe, 0x26, 0x17, 0x4d, 0x13, 0x07, 0x1c, 0xb4, 0x90, 0x04,
6145 	0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xf1, 0xff, 0x02, 0x83, 0x55,
6146 	0x53, 0x1d, 0xfe, 0x12, 0x13, 0xd6, 0xfe, 0x30, 0x00, 0xb0, 0xfe, 0x80,
6147 	0x17, 0x1c, 0x63, 0x13, 0x07, 0xfe, 0x56, 0x10, 0x53, 0x0d, 0xfe, 0x16,
6148 	0x13, 0xd6, 0xfe, 0x64, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0x64,
6149 	0x00, 0x1c, 0x94, 0x13, 0x07, 0xfe, 0x28, 0x10, 0x53, 0x07, 0xfe, 0x60,
6150 	0x13, 0xd6, 0xfe, 0xc8, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0xc8,
6151 	0x00, 0x1c, 0x95, 0x13, 0x07, 0x71, 0xd6, 0xfe, 0x90, 0x01, 0x48, 0xfe,
6152 	0x8c, 0x17, 0x45, 0xf3, 0xfe, 0x43, 0xf4, 0x96, 0xfe, 0x56, 0xf0, 0xfe,
6153 	0x9e, 0x17, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x43, 0xf4, 0x94, 0xf6, 0x8b,
6154 	0x01, 0xfe, 0x24, 0x16, 0x23, 0x3f, 0xfc, 0xa8, 0x8c, 0x49, 0x48, 0xfe,
6155 	0xda, 0x17, 0x62, 0x49, 0xfe, 0x1c, 0x10, 0xa8, 0x8c, 0x80, 0x48, 0xfe,
6156 	0xda, 0x17, 0x62, 0x80, 0x71, 0x50, 0x26, 0xfe, 0x4d, 0xf4, 0x00, 0xf7,
6157 	0x45, 0x13, 0x07, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58, 0x02, 0x50, 0x13,
6158 	0x0d, 0x02, 0x50, 0x3e, 0x78, 0x4f, 0x45, 0x01, 0x08, 0x16, 0xa9, 0x27,
6159 	0x25, 0xbe, 0xfe, 0x03, 0xea, 0xfe, 0x7e, 0x01, 0x01, 0x08, 0x16, 0xa9,
6160 	0x27, 0x25, 0xfe, 0xe9, 0x0a, 0x01, 0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe,
6161 	0xe9, 0x0a, 0xfe, 0x05, 0xea, 0xfe, 0x7f, 0x01, 0x01, 0x08, 0x16, 0xa9,
6162 	0x27, 0x25, 0xfe, 0x69, 0x09, 0xfe, 0x02, 0xea, 0xfe, 0x80, 0x01, 0x01,
6163 	0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe, 0xe8, 0x08, 0x47, 0xfe, 0x81, 0x01,
6164 	0x03, 0xb6, 0x1e, 0x83, 0x01, 0x38, 0x06, 0x24, 0x31, 0xa2, 0x78, 0xf2,
6165 	0x53, 0x07, 0x36, 0xfe, 0x34, 0xf4, 0x3f, 0xa1, 0x78, 0x03, 0x9a, 0x1e,
6166 	0x83, 0x01, 0x38, 0x06, 0x12, 0x31, 0xf0, 0x4f, 0x45, 0xfe, 0x90, 0x10,
6167 	0xfe, 0x40, 0x5a, 0x23, 0x3f, 0xfb, 0x8c, 0x49, 0x48, 0xfe, 0xaa, 0x18,
6168 	0x62, 0x49, 0x71, 0x8c, 0x80, 0x48, 0xfe, 0xaa, 0x18, 0x62, 0x80, 0xfe,
6169 	0xb4, 0x56, 0xfe, 0x40, 0x5d, 0x01, 0xc6, 0x01, 0xfe, 0xac, 0x1d, 0xfe,
6170 	0x02, 0x17, 0xfe, 0xc8, 0x45, 0xfe, 0x5a, 0xf0, 0xfe, 0xc0, 0x18, 0xfe,
6171 	0x43, 0x48, 0x2d, 0x93, 0x36, 0xfe, 0x34, 0xf4, 0xfe, 0x00, 0x11, 0xfe,
6172 	0x40, 0x10, 0x2d, 0xb4, 0x36, 0xfe, 0x34, 0xf4, 0x04, 0xfe, 0x34, 0x10,
6173 	0x2d, 0xfe, 0x0b, 0x00, 0x36, 0x46, 0x63, 0xfe, 0x28, 0x10, 0xfe, 0xc0,
6174 	0x49, 0xff, 0x02, 0x00, 0x54, 0xb2, 0xfe, 0x90, 0x01, 0x48, 0xfe, 0xfa,
6175 	0x18, 0x45, 0xfe, 0x1c, 0xf4, 0x3f, 0xf3, 0xfe, 0x40, 0xf4, 0x96, 0xfe,
6176 	0x56, 0xf0, 0xfe, 0x0c, 0x19, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x40, 0xf4,
6177 	0x94, 0xf6, 0x3e, 0x2d, 0x93, 0x4e, 0xd0, 0x0d, 0x21, 0xfe, 0x7f, 0x01,
6178 	0xfe, 0xc8, 0x46, 0xfe, 0x24, 0x13, 0x8c, 0x00, 0x5d, 0x26, 0x21, 0xfe,
6179 	0x7e, 0x01, 0xfe, 0xc8, 0x45, 0xfe, 0x14, 0x13, 0x21, 0xfe, 0x80, 0x01,
6180 	0xfe, 0x48, 0x45, 0xfa, 0x21, 0xfe, 0x81, 0x01, 0xfe, 0xc8, 0x44, 0x4e,
6181 	0x26, 0x02, 0x13, 0x07, 0x02, 0x78, 0x45, 0x50, 0x13, 0x0d, 0x02, 0x14,
6182 	0x07, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x14, 0x0d, 0x01, 0x08, 0x17,
6183 	0xfe, 0x82, 0x19, 0x14, 0x1d, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x5f,
6184 	0xfe, 0x89, 0x49, 0x01, 0x08, 0x02, 0x14, 0x07, 0x01, 0x08, 0x17, 0xc1,
6185 	0x14, 0x1d, 0x01, 0x08, 0x17, 0xc1, 0x14, 0x07, 0x01, 0x08, 0x17, 0xc1,
6186 	0xfe, 0x89, 0x49, 0x01, 0x08, 0x17, 0xc1, 0x5f, 0xfe, 0x89, 0x4a, 0x01,
6187 	0x08, 0x02, 0x50, 0x02, 0x14, 0x07, 0x01, 0x08, 0x17, 0x74, 0x14, 0x7f,
6188 	0x01, 0x08, 0x17, 0x74, 0x14, 0x12, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x89,
6189 	0x49, 0x01, 0x08, 0x17, 0x74, 0x14, 0x00, 0x01, 0x08, 0x17, 0x74, 0xfe,
6190 	0x89, 0x4a, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x09, 0x49, 0x01, 0x08, 0x17,
6191 	0x74, 0x5f, 0xcc, 0x01, 0x08, 0x02, 0x21, 0xe4, 0x09, 0x07, 0xfe, 0x4c,
6192 	0x13, 0xc8, 0x20, 0xe4, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x5f, 0xa1, 0x5e,
6193 	0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xcc, 0xff, 0x02, 0x00, 0x10, 0x2f,
6194 	0xfe, 0x3e, 0x1a, 0x01, 0x43, 0x09, 0xfe, 0xe3, 0x00, 0xfe, 0x22, 0x13,
6195 	0x16, 0xfe, 0x64, 0x1a, 0x26, 0x20, 0x9e, 0x01, 0x41, 0x21, 0x9e, 0x09,
6196 	0x07, 0x5d, 0x01, 0x0c, 0x61, 0x07, 0x44, 0x02, 0x0a, 0x5a, 0x01, 0x18,
6197 	0xfe, 0x00, 0x40, 0xaa, 0x09, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01,
6198 	0x18, 0xaa, 0x0a, 0x67, 0x01, 0xa3, 0x02, 0x0a, 0x9d, 0x01, 0x18, 0xaa,
6199 	0xfe, 0x80, 0xe7, 0x1a, 0x09, 0x1a, 0x5d, 0xfe, 0x45, 0x58, 0x01, 0xfe,
6200 	0xb2, 0x16, 0xaa, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0xaa, 0x0a, 0x67, 0x01,
6201 	0xa3, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x01, 0xfe, 0x7e, 0x1e, 0xfe, 0x80,
6202 	0x4c, 0xfe, 0x49, 0xe4, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01, 0x18,
6203 	0xfe, 0x80, 0x4c, 0x0a, 0x67, 0x01, 0x5c, 0x02, 0x1c, 0x1a, 0x87, 0x7c,
6204 	0xe5, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x24, 0x1c, 0xfe, 0x1d,
6205 	0xf7, 0x28, 0xb1, 0xfe, 0x04, 0x1b, 0x01, 0xfe, 0x2a, 0x1c, 0xfa, 0xb3,
6206 	0x28, 0x7c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x02, 0xc9, 0x2b, 0xfe,
6207 	0xf4, 0x1a, 0xfe, 0xfa, 0x10, 0x1c, 0x1a, 0x87, 0x03, 0xfe, 0x64, 0x01,
6208 	0xfe, 0x00, 0xf4, 0x24, 0xfe, 0x18, 0x58, 0x03, 0xfe, 0x66, 0x01, 0xfe,
6209 	0x19, 0x58, 0xb3, 0x24, 0x01, 0xfe, 0x0e, 0x1f, 0xfe, 0x30, 0xf4, 0x07,
6210 	0xfe, 0x3c, 0x50, 0x7c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79, 0xfe, 0x1c,
6211 	0xf7, 0x24, 0xb1, 0xfe, 0x50, 0x1b, 0xfe, 0xd4, 0x14, 0x31, 0x02, 0xc9,
6212 	0x2b, 0xfe, 0x26, 0x1b, 0xfe, 0xba, 0x10, 0x1c, 0x1a, 0x87, 0xfe, 0x83,
6213 	0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7, 0x54, 0xb1,
6214 	0xfe, 0x72, 0x1b, 0xfe, 0xb2, 0x14, 0xfc, 0xb3, 0x54, 0x7c, 0x12, 0xfe,
6215 	0xaf, 0x19, 0xfe, 0x98, 0xe7, 0x00, 0x02, 0xc9, 0x2b, 0xfe, 0x66, 0x1b,
6216 	0xfe, 0x8a, 0x10, 0x1c, 0x1a, 0x87, 0x8b, 0x0f, 0xfe, 0x30, 0x90, 0x04,
6217 	0xfe, 0xb0, 0x93, 0x3a, 0x0b, 0xfe, 0x18, 0x58, 0xfe, 0x32, 0x90, 0x04,
6218 	0xfe, 0xb2, 0x93, 0x3a, 0x0b, 0xfe, 0x19, 0x58, 0x0e, 0xa8, 0xb3, 0x4a,
6219 	0x7c, 0x12, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x4a, 0xb1, 0xfe, 0xc6,
6220 	0x1b, 0xfe, 0x5e, 0x14, 0x31, 0x02, 0xc9, 0x2b, 0xfe, 0x96, 0x1b, 0x5c,
6221 	0xfe, 0x02, 0xf6, 0x1a, 0x87, 0xfe, 0x18, 0xfe, 0x6a, 0xfe, 0x19, 0xfe,
6222 	0x6b, 0x01, 0xfe, 0x1e, 0x1f, 0xfe, 0x1d, 0xf7, 0x65, 0xb1, 0xfe, 0xee,
6223 	0x1b, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13, 0xb3, 0x65, 0x3e, 0xfe, 0x83,
6224 	0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7, 0x1a, 0xfe, 0x81, 0xe7, 0x1a,
6225 	0x15, 0xfe, 0xdd, 0x00, 0x7a, 0x30, 0x02, 0x7a, 0x30, 0xfe, 0x12, 0x45,
6226 	0x2b, 0xfe, 0xdc, 0x1b, 0x1f, 0x07, 0x47, 0xb5, 0xc3, 0x05, 0x35, 0xfe,
6227 	0x39, 0xf0, 0x75, 0x26, 0x02, 0xfe, 0x7e, 0x18, 0x23, 0x1d, 0x36, 0x13,
6228 	0x11, 0x02, 0x87, 0x03, 0xe3, 0x23, 0x07, 0xfe, 0xef, 0x12, 0xfe, 0xe1,
6229 	0x10, 0x90, 0x34, 0x60, 0xfe, 0x02, 0x80, 0x09, 0x56, 0xfe, 0x3c, 0x13,
6230 	0xfe, 0x82, 0x14, 0xfe, 0x42, 0x13, 0x51, 0xfe, 0x06, 0x83, 0x0a, 0x5a,
6231 	0x01, 0x18, 0xcb, 0xfe, 0x3e, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48,
6232 	0x01, 0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f,
6233 	0x89, 0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18, 0xfe, 0x80, 0x4c, 0x01,
6234 	0x85, 0xfe, 0x16, 0x10, 0x09, 0x9b, 0x4e, 0xfe, 0x40, 0x14, 0xfe, 0x24,
6235 	0x12, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x52, 0x1c, 0x1c, 0x0d,
6236 	0x02, 0xfe, 0x9c, 0xe7, 0x0d, 0x19, 0xfe, 0x15, 0x00, 0x40, 0x8d, 0x30,
6237 	0x01, 0xf4, 0x1c, 0x07, 0x02, 0x51, 0xfe, 0x06, 0x83, 0xfe, 0x18, 0x80,
6238 	0x61, 0x28, 0x44, 0x15, 0x56, 0x01, 0x85, 0x1c, 0x07, 0x02, 0xfe, 0x38,
6239 	0x90, 0xfe, 0xba, 0x90, 0x91, 0xde, 0x7e, 0xdf, 0xfe, 0x48, 0x55, 0x31,
6240 	0xfe, 0xc9, 0x55, 0x02, 0x21, 0xb9, 0x88, 0x20, 0xb9, 0x02, 0x0a, 0xba,
6241 	0x01, 0x18, 0xfe, 0x41, 0x48, 0x0a, 0x57, 0x01, 0x18, 0xfe, 0x49, 0x44,
6242 	0x1b, 0xfe, 0x1e, 0x1d, 0x88, 0x89, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x09,
6243 	0x1a, 0xa4, 0x0a, 0x67, 0x01, 0xa3, 0x0a, 0x57, 0x01, 0x18, 0x88, 0x89,
6244 	0x02, 0xfe, 0x4e, 0xe4, 0x1d, 0x7b, 0xfe, 0x52, 0x1d, 0x03, 0xfe, 0x90,
6245 	0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10, 0xfe, 0x4e, 0xe4, 0xdd, 0x7b,
6246 	0xfe, 0x64, 0x1d, 0x03, 0xfe, 0x92, 0x00, 0xd1, 0x12, 0xfe, 0x1a, 0x10,
6247 	0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x7b, 0xfe, 0x76, 0x1d, 0x03, 0xfe,
6248 	0x94, 0x00, 0xd1, 0x24, 0xfe, 0x08, 0x10, 0x03, 0xfe, 0x96, 0x00, 0xd1,
6249 	0x63, 0xfe, 0x4e, 0x45, 0x83, 0xca, 0xff, 0x04, 0x68, 0x54, 0xfe, 0xf1,
6250 	0x10, 0x23, 0x49, 0xfe, 0x08, 0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c,
6251 	0xfe, 0x1a, 0xf4, 0xfe, 0x00, 0x04, 0x83, 0xb2, 0x1d, 0x48, 0xfe, 0xaa,
6252 	0x1d, 0x13, 0x1d, 0x02, 0x09, 0x92, 0xfe, 0x5a, 0xf0, 0xfe, 0xba, 0x1d,
6253 	0x2e, 0x93, 0xfe, 0x34, 0x10, 0x09, 0x12, 0xfe, 0x5a, 0xf0, 0xfe, 0xc8,
6254 	0x1d, 0x2e, 0xb4, 0xfe, 0x26, 0x10, 0x09, 0x1d, 0x36, 0x2e, 0x63, 0xfe,
6255 	0x1a, 0x10, 0x09, 0x0d, 0x36, 0x2e, 0x94, 0xf2, 0x09, 0x07, 0x36, 0x2e,
6256 	0x95, 0xa1, 0xc8, 0x02, 0x1f, 0x93, 0x01, 0x42, 0xfe, 0x04, 0xfe, 0x99,
6257 	0x03, 0x9c, 0x8b, 0x02, 0x2a, 0xfe, 0x1c, 0x1e, 0xfe, 0x14, 0xf0, 0x08,
6258 	0x2f, 0xfe, 0x0c, 0x1e, 0x2a, 0xfe, 0x1c, 0x1e, 0x8f, 0xfe, 0x1c, 0x1e,
6259 	0xfe, 0x82, 0xf0, 0xfe, 0x10, 0x1e, 0x02, 0x0f, 0x3f, 0x04, 0xfe, 0x80,
6260 	0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x18, 0x80, 0x04, 0xfe, 0x98,
6261 	0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x02, 0x80, 0x04, 0xfe, 0x82,
6262 	0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06, 0x80, 0x04, 0xfe, 0x86,
6263 	0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x1b, 0x80, 0x04, 0xfe, 0x9b,
6264 	0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x04, 0x80, 0x04, 0xfe, 0x84,
6265 	0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x80, 0x80, 0x04, 0xfe, 0x80,
6266 	0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x19, 0x81, 0x04,
6267 	0xfe, 0x99, 0x83, 0xfe, 0xca, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06,
6268 	0x83, 0x04, 0xfe, 0x86, 0x83, 0xfe, 0xce, 0x47, 0x0b, 0x0e, 0x02, 0x0f,
6269 	0xfe, 0x2c, 0x90, 0x04, 0xfe, 0xac, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
6270 	0xfe, 0xae, 0x90, 0x04, 0xfe, 0xae, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
6271 	0xfe, 0x08, 0x90, 0x04, 0xfe, 0x88, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
6272 	0xfe, 0x8a, 0x90, 0x04, 0xfe, 0x8a, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
6273 	0xfe, 0x0c, 0x90, 0x04, 0xfe, 0x8c, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f,
6274 	0xfe, 0x8e, 0x90, 0x04, 0xfe, 0x8e, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
6275 	0xfe, 0x3c, 0x90, 0x04, 0xfe, 0xbc, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x8b,
6276 	0x0f, 0xfe, 0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b, 0x77, 0x0e,
6277 	0xa8, 0x02, 0xff, 0x66, 0x00, 0x00,
6278 };
6279 
6280 static unsigned short _adv_asc38C1600_size = sizeof(_adv_asc38C1600_buf);	/* 0x1673 */
6281 static ADV_DCNT _adv_asc38C1600_chksum = 0x0604EF77UL;	/* Expanded little-endian checksum. */
6282 
6283 static void AscInitQLinkVar(ASC_DVC_VAR *asc_dvc)
6284 {
6285 	PortAddr iop_base;
6286 	int i;
6287 	ushort lram_addr;
6288 
6289 	iop_base = asc_dvc->iop_base;
6290 	AscPutRiscVarFreeQHead(iop_base, 1);
6291 	AscPutRiscVarDoneQTail(iop_base, asc_dvc->max_total_qng);
6292 	AscPutVarFreeQHead(iop_base, 1);
6293 	AscPutVarDoneQTail(iop_base, asc_dvc->max_total_qng);
6294 	AscWriteLramByte(iop_base, ASCV_BUSY_QHEAD_B,
6295 			 (uchar)((int)asc_dvc->max_total_qng + 1));
6296 	AscWriteLramByte(iop_base, ASCV_DISC1_QHEAD_B,
6297 			 (uchar)((int)asc_dvc->max_total_qng + 2));
6298 	AscWriteLramByte(iop_base, (ushort)ASCV_TOTAL_READY_Q_B,
6299 			 asc_dvc->max_total_qng);
6300 	AscWriteLramWord(iop_base, ASCV_ASCDVC_ERR_CODE_W, 0);
6301 	AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
6302 	AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, 0);
6303 	AscWriteLramByte(iop_base, ASCV_SCSIBUSY_B, 0);
6304 	AscWriteLramByte(iop_base, ASCV_WTM_FLAG_B, 0);
6305 	AscPutQDoneInProgress(iop_base, 0);
6306 	lram_addr = ASC_QADR_BEG;
6307 	for (i = 0; i < 32; i++, lram_addr += 2) {
6308 		AscWriteLramWord(iop_base, lram_addr, 0);
6309 	}
6310 }
6311 
6312 static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)
6313 {
6314 	int i;
6315 	ushort warn_code;
6316 	PortAddr iop_base;
6317 	ASC_PADDR phy_addr;
6318 	ASC_DCNT phy_size;
6319 	struct asc_board *board = asc_dvc_to_board(asc_dvc);
6320 
6321 	iop_base = asc_dvc->iop_base;
6322 	warn_code = 0;
6323 	for (i = 0; i <= ASC_MAX_TID; i++) {
6324 		AscPutMCodeInitSDTRAtID(iop_base, i,
6325 					asc_dvc->cfg->sdtr_period_offset[i]);
6326 	}
6327 
6328 	AscInitQLinkVar(asc_dvc);
6329 	AscWriteLramByte(iop_base, ASCV_DISC_ENABLE_B,
6330 			 asc_dvc->cfg->disc_enable);
6331 	AscWriteLramByte(iop_base, ASCV_HOSTSCSI_ID_B,
6332 			 ASC_TID_TO_TARGET_ID(asc_dvc->cfg->chip_scsi_id));
6333 
6334 	/* Ensure overrun buffer is aligned on an 8 byte boundary. */
6335 	BUG_ON((unsigned long)asc_dvc->overrun_buf & 7);
6336 	asc_dvc->overrun_dma = dma_map_single(board->dev, asc_dvc->overrun_buf,
6337 					ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE);
6338 	phy_addr = cpu_to_le32(asc_dvc->overrun_dma);
6339 	AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_PADDR_D,
6340 				 (uchar *)&phy_addr, 1);
6341 	phy_size = cpu_to_le32(ASC_OVERRUN_BSIZE);
6342 	AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_BSIZE_D,
6343 				 (uchar *)&phy_size, 1);
6344 
6345 	asc_dvc->cfg->mcode_date =
6346 	    AscReadLramWord(iop_base, (ushort)ASCV_MC_DATE_W);
6347 	asc_dvc->cfg->mcode_version =
6348 	    AscReadLramWord(iop_base, (ushort)ASCV_MC_VER_W);
6349 
6350 	AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
6351 	if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
6352 		asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
6353 		return warn_code;
6354 	}
6355 	if (AscStartChip(iop_base) != 1) {
6356 		asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
6357 		return warn_code;
6358 	}
6359 
6360 	return warn_code;
6361 }
6362 
6363 static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
6364 {
6365 	ushort warn_code;
6366 	PortAddr iop_base;
6367 
6368 	iop_base = asc_dvc->iop_base;
6369 	warn_code = 0;
6370 	if ((asc_dvc->dvc_cntl & ASC_CNTL_RESET_SCSI) &&
6371 	    !(asc_dvc->init_state & ASC_INIT_RESET_SCSI_DONE)) {
6372 		AscResetChipAndScsiBus(asc_dvc);
6373 		mdelay(asc_dvc->scsi_reset_wait * 1000); /* XXX: msleep? */
6374 	}
6375 	asc_dvc->init_state |= ASC_INIT_STATE_BEG_LOAD_MC;
6376 	if (asc_dvc->err_code != 0)
6377 		return UW_ERR;
6378 	if (!AscFindSignature(asc_dvc->iop_base)) {
6379 		asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
6380 		return warn_code;
6381 	}
6382 	AscDisableInterrupt(iop_base);
6383 	warn_code |= AscInitLram(asc_dvc);
6384 	if (asc_dvc->err_code != 0)
6385 		return UW_ERR;
6386 	ASC_DBG(1, "_asc_mcode_chksum 0x%lx\n", (ulong)_asc_mcode_chksum);
6387 	if (AscLoadMicroCode(iop_base, 0, _asc_mcode_buf,
6388 			     _asc_mcode_size) != _asc_mcode_chksum) {
6389 		asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
6390 		return warn_code;
6391 	}
6392 	warn_code |= AscInitMicroCodeVar(asc_dvc);
6393 	asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;
6394 	AscEnableInterrupt(iop_base);
6395 	return warn_code;
6396 }
6397 
6398 /*
6399  * Load the Microcode
6400  *
6401  * Write the microcode image to RISC memory starting at address 0.
6402  *
6403  * The microcode is stored compressed in the following format:
6404  *
6405  *  254 word (508 byte) table indexed by byte code followed
6406  *  by the following byte codes:
6407  *
6408  *    1-Byte Code:
6409  *      00: Emit word 0 in table.
6410  *      01: Emit word 1 in table.
6411  *      .
6412  *      FD: Emit word 253 in table.
6413  *
6414  *    Multi-Byte Code:
6415  *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
6416  *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
6417  *
6418  * Returns 0 or an error if the checksum doesn't match
6419  */
6420 static int AdvLoadMicrocode(AdvPortAddr iop_base, unsigned char *buf, int size,
6421 			    int memsize, int chksum)
6422 {
6423 	int i, j, end, len = 0;
6424 	ADV_DCNT sum;
6425 
6426 	AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
6427 
6428 	for (i = 253 * 2; i < size; i++) {
6429 		if (buf[i] == 0xff) {
6430 			unsigned short word = (buf[i + 3] << 8) | buf[i + 2];
6431 			for (j = 0; j < buf[i + 1]; j++) {
6432 				AdvWriteWordAutoIncLram(iop_base, word);
6433 				len += 2;
6434 			}
6435 			i += 3;
6436 		} else if (buf[i] == 0xfe) {
6437 			unsigned short word = (buf[i + 2] << 8) | buf[i + 1];
6438 			AdvWriteWordAutoIncLram(iop_base, word);
6439 			i += 2;
6440 			len += 2;
6441 		} else {
6442 			unsigned int off = buf[i] * 2;
6443 			unsigned short word = (buf[off + 1] << 8) | buf[off];
6444 			AdvWriteWordAutoIncLram(iop_base, word);
6445 			len += 2;
6446 		}
6447 	}
6448 
6449 	end = len;
6450 
6451 	while (len < memsize) {
6452 		AdvWriteWordAutoIncLram(iop_base, 0);
6453 		len += 2;
6454 	}
6455 
6456 	/* Verify the microcode checksum. */
6457 	sum = 0;
6458 	AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
6459 
6460 	for (len = 0; len < end; len += 2) {
6461 		sum += AdvReadWordAutoIncLram(iop_base);
6462 	}
6463 
6464 	if (sum != chksum)
6465 		return ASC_IERR_MCODE_CHKSUM;
6466 
6467 	return 0;
6468 }
6469 
6470 static void AdvBuildCarrierFreelist(struct adv_dvc_var *asc_dvc)
6471 {
6472 	ADV_CARR_T *carrp;
6473 	ADV_SDCNT buf_size;
6474 	ADV_PADDR carr_paddr;
6475 
6476 	carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
6477 	asc_dvc->carr_freelist = NULL;
6478 	if (carrp == asc_dvc->carrier_buf) {
6479 		buf_size = ADV_CARRIER_BUFSIZE;
6480 	} else {
6481 		buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
6482 	}
6483 
6484 	do {
6485 		/* Get physical address of the carrier 'carrp'. */
6486 		carr_paddr = cpu_to_le32(virt_to_bus(carrp));
6487 
6488 		buf_size -= sizeof(ADV_CARR_T);
6489 
6490 		carrp->carr_pa = carr_paddr;
6491 		carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
6492 
6493 		/*
6494 		 * Insert the carrier at the beginning of the freelist.
6495 		 */
6496 		carrp->next_vpa =
6497 			cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
6498 		asc_dvc->carr_freelist = carrp;
6499 
6500 		carrp++;
6501 	} while (buf_size > 0);
6502 }
6503 
6504 /*
6505  * Send an idle command to the chip and wait for completion.
6506  *
6507  * Command completion is polled for once per microsecond.
6508  *
6509  * The function can be called from anywhere including an interrupt handler.
6510  * But the function is not re-entrant, so it uses the DvcEnter/LeaveCritical()
6511  * functions to prevent reentrancy.
6512  *
6513  * Return Values:
6514  *   ADV_TRUE - command completed successfully
6515  *   ADV_FALSE - command failed
6516  *   ADV_ERROR - command timed out
6517  */
6518 static int
6519 AdvSendIdleCmd(ADV_DVC_VAR *asc_dvc,
6520 	       ushort idle_cmd, ADV_DCNT idle_cmd_parameter)
6521 {
6522 	int result;
6523 	ADV_DCNT i, j;
6524 	AdvPortAddr iop_base;
6525 
6526 	iop_base = asc_dvc->iop_base;
6527 
6528 	/*
6529 	 * Clear the idle command status which is set by the microcode
6530 	 * to a non-zero value to indicate when the command is completed.
6531 	 * The non-zero result is one of the IDLE_CMD_STATUS_* values
6532 	 */
6533 	AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, (ushort)0);
6534 
6535 	/*
6536 	 * Write the idle command value after the idle command parameter
6537 	 * has been written to avoid a race condition. If the order is not
6538 	 * followed, the microcode may process the idle command before the
6539 	 * parameters have been written to LRAM.
6540 	 */
6541 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IDLE_CMD_PARAMETER,
6542 				cpu_to_le32(idle_cmd_parameter));
6543 	AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD, idle_cmd);
6544 
6545 	/*
6546 	 * Tickle the RISC to tell it to process the idle command.
6547 	 */
6548 	AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_B);
6549 	if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
6550 		/*
6551 		 * Clear the tickle value. In the ASC-3550 the RISC flag
6552 		 * command 'clr_tickle_b' does not work unless the host
6553 		 * value is cleared.
6554 		 */
6555 		AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
6556 	}
6557 
6558 	/* Wait for up to 100 millisecond for the idle command to timeout. */
6559 	for (i = 0; i < SCSI_WAIT_100_MSEC; i++) {
6560 		/* Poll once each microsecond for command completion. */
6561 		for (j = 0; j < SCSI_US_PER_MSEC; j++) {
6562 			AdvReadWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS,
6563 					result);
6564 			if (result != 0)
6565 				return result;
6566 			udelay(1);
6567 		}
6568 	}
6569 
6570 	BUG();		/* The idle command should never timeout. */
6571 	return ADV_ERROR;
6572 }
6573 
6574 /*
6575  * Reset SCSI Bus and purge all outstanding requests.
6576  *
6577  * Return Value:
6578  *      ADV_TRUE(1) -   All requests are purged and SCSI Bus is reset.
6579  *      ADV_FALSE(0) -  Microcode command failed.
6580  *      ADV_ERROR(-1) - Microcode command timed-out. Microcode or IC
6581  *                      may be hung which requires driver recovery.
6582  */
6583 static int AdvResetSB(ADV_DVC_VAR *asc_dvc)
6584 {
6585 	int status;
6586 
6587 	/*
6588 	 * Send the SCSI Bus Reset idle start idle command which asserts
6589 	 * the SCSI Bus Reset signal.
6590 	 */
6591 	status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_START, 0L);
6592 	if (status != ADV_TRUE) {
6593 		return status;
6594 	}
6595 
6596 	/*
6597 	 * Delay for the specified SCSI Bus Reset hold time.
6598 	 *
6599 	 * The hold time delay is done on the host because the RISC has no
6600 	 * microsecond accurate timer.
6601 	 */
6602 	udelay(ASC_SCSI_RESET_HOLD_TIME_US);
6603 
6604 	/*
6605 	 * Send the SCSI Bus Reset end idle command which de-asserts
6606 	 * the SCSI Bus Reset signal and purges any pending requests.
6607 	 */
6608 	status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_END, 0L);
6609 	if (status != ADV_TRUE) {
6610 		return status;
6611 	}
6612 
6613 	mdelay(asc_dvc->scsi_reset_wait * 1000);	/* XXX: msleep? */
6614 
6615 	return status;
6616 }
6617 
6618 /*
6619  * Initialize the ASC-3550.
6620  *
6621  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
6622  *
6623  * For a non-fatal error return a warning code. If there are no warnings
6624  * then 0 is returned.
6625  *
6626  * Needed after initialization for error recovery.
6627  */
6628 static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
6629 {
6630 	AdvPortAddr iop_base;
6631 	ushort warn_code;
6632 	int begin_addr;
6633 	int end_addr;
6634 	ushort code_sum;
6635 	int word;
6636 	int i;
6637 	ushort scsi_cfg1;
6638 	uchar tid;
6639 	ushort bios_mem[ASC_MC_BIOSLEN / 2];	/* BIOS RISC Memory 0x40-0x8F. */
6640 	ushort wdtr_able = 0, sdtr_able, tagqng_able;
6641 	uchar max_cmd[ADV_MAX_TID + 1];
6642 
6643 	/* If there is already an error, don't continue. */
6644 	if (asc_dvc->err_code != 0)
6645 		return ADV_ERROR;
6646 
6647 	/*
6648 	 * The caller must set 'chip_type' to ADV_CHIP_ASC3550.
6649 	 */
6650 	if (asc_dvc->chip_type != ADV_CHIP_ASC3550) {
6651 		asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
6652 		return ADV_ERROR;
6653 	}
6654 
6655 	warn_code = 0;
6656 	iop_base = asc_dvc->iop_base;
6657 
6658 	/*
6659 	 * Save the RISC memory BIOS region before writing the microcode.
6660 	 * The BIOS may already be loaded and using its RISC LRAM region
6661 	 * so its region must be saved and restored.
6662 	 *
6663 	 * Note: This code makes the assumption, which is currently true,
6664 	 * that a chip reset does not clear RISC LRAM.
6665 	 */
6666 	for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
6667 		AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
6668 				bios_mem[i]);
6669 	}
6670 
6671 	/*
6672 	 * Save current per TID negotiated values.
6673 	 */
6674 	if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == 0x55AA) {
6675 		ushort bios_version, major, minor;
6676 
6677 		bios_version =
6678 		    bios_mem[(ASC_MC_BIOS_VERSION - ASC_MC_BIOSMEM) / 2];
6679 		major = (bios_version >> 12) & 0xF;
6680 		minor = (bios_version >> 8) & 0xF;
6681 		if (major < 3 || (major == 3 && minor == 1)) {
6682 			/* BIOS 3.1 and earlier location of 'wdtr_able' variable. */
6683 			AdvReadWordLram(iop_base, 0x120, wdtr_able);
6684 		} else {
6685 			AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
6686 		}
6687 	}
6688 	AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
6689 	AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
6690 	for (tid = 0; tid <= ADV_MAX_TID; tid++) {
6691 		AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
6692 				max_cmd[tid]);
6693 	}
6694 
6695 	asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc3550_buf,
6696 					_adv_asc3550_size, ADV_3550_MEMSIZE,
6697 					_adv_asc3550_chksum);
6698 	if (asc_dvc->err_code)
6699 		return ADV_ERROR;
6700 
6701 	/*
6702 	 * Restore the RISC memory BIOS region.
6703 	 */
6704 	for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
6705 		AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
6706 				 bios_mem[i]);
6707 	}
6708 
6709 	/*
6710 	 * Calculate and write the microcode code checksum to the microcode
6711 	 * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
6712 	 */
6713 	AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
6714 	AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
6715 	code_sum = 0;
6716 	AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
6717 	for (word = begin_addr; word < end_addr; word += 2) {
6718 		code_sum += AdvReadWordAutoIncLram(iop_base);
6719 	}
6720 	AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
6721 
6722 	/*
6723 	 * Read and save microcode version and date.
6724 	 */
6725 	AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
6726 			asc_dvc->cfg->mcode_date);
6727 	AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
6728 			asc_dvc->cfg->mcode_version);
6729 
6730 	/*
6731 	 * Set the chip type to indicate the ASC3550.
6732 	 */
6733 	AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC3550);
6734 
6735 	/*
6736 	 * If the PCI Configuration Command Register "Parity Error Response
6737 	 * Control" Bit was clear (0), then set the microcode variable
6738 	 * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
6739 	 * to ignore DMA parity errors.
6740 	 */
6741 	if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
6742 		AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
6743 		word |= CONTROL_FLAG_IGNORE_PERR;
6744 		AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
6745 	}
6746 
6747 	/*
6748 	 * For ASC-3550, setting the START_CTL_EMFU [3:2] bits sets a FIFO
6749 	 * threshold of 128 bytes. This register is only accessible to the host.
6750 	 */
6751 	AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
6752 			     START_CTL_EMFU | READ_CMD_MRM);
6753 
6754 	/*
6755 	 * Microcode operating variables for WDTR, SDTR, and command tag
6756 	 * queuing will be set in slave_configure() based on what a
6757 	 * device reports it is capable of in Inquiry byte 7.
6758 	 *
6759 	 * If SCSI Bus Resets have been disabled, then directly set
6760 	 * SDTR and WDTR from the EEPROM configuration. This will allow
6761 	 * the BIOS and warm boot to work without a SCSI bus hang on
6762 	 * the Inquiry caused by host and target mismatched DTR values.
6763 	 * Without the SCSI Bus Reset, before an Inquiry a device can't
6764 	 * be assumed to be in Asynchronous, Narrow mode.
6765 	 */
6766 	if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
6767 		AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
6768 				 asc_dvc->wdtr_able);
6769 		AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
6770 				 asc_dvc->sdtr_able);
6771 	}
6772 
6773 	/*
6774 	 * Set microcode operating variables for SDTR_SPEED1, SDTR_SPEED2,
6775 	 * SDTR_SPEED3, and SDTR_SPEED4 based on the ULTRA EEPROM per TID
6776 	 * bitmask. These values determine the maximum SDTR speed negotiated
6777 	 * with a device.
6778 	 *
6779 	 * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
6780 	 * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
6781 	 * without determining here whether the device supports SDTR.
6782 	 *
6783 	 * 4-bit speed  SDTR speed name
6784 	 * ===========  ===============
6785 	 * 0000b (0x0)  SDTR disabled
6786 	 * 0001b (0x1)  5 Mhz
6787 	 * 0010b (0x2)  10 Mhz
6788 	 * 0011b (0x3)  20 Mhz (Ultra)
6789 	 * 0100b (0x4)  40 Mhz (LVD/Ultra2)
6790 	 * 0101b (0x5)  80 Mhz (LVD2/Ultra3)
6791 	 * 0110b (0x6)  Undefined
6792 	 * .
6793 	 * 1111b (0xF)  Undefined
6794 	 */
6795 	word = 0;
6796 	for (tid = 0; tid <= ADV_MAX_TID; tid++) {
6797 		if (ADV_TID_TO_TIDMASK(tid) & asc_dvc->ultra_able) {
6798 			/* Set Ultra speed for TID 'tid'. */
6799 			word |= (0x3 << (4 * (tid % 4)));
6800 		} else {
6801 			/* Set Fast speed for TID 'tid'. */
6802 			word |= (0x2 << (4 * (tid % 4)));
6803 		}
6804 		if (tid == 3) {	/* Check if done with sdtr_speed1. */
6805 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, word);
6806 			word = 0;
6807 		} else if (tid == 7) {	/* Check if done with sdtr_speed2. */
6808 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, word);
6809 			word = 0;
6810 		} else if (tid == 11) {	/* Check if done with sdtr_speed3. */
6811 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, word);
6812 			word = 0;
6813 		} else if (tid == 15) {	/* Check if done with sdtr_speed4. */
6814 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, word);
6815 			/* End of loop. */
6816 		}
6817 	}
6818 
6819 	/*
6820 	 * Set microcode operating variable for the disconnect per TID bitmask.
6821 	 */
6822 	AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
6823 			 asc_dvc->cfg->disc_enable);
6824 
6825 	/*
6826 	 * Set SCSI_CFG0 Microcode Default Value.
6827 	 *
6828 	 * The microcode will set the SCSI_CFG0 register using this value
6829 	 * after it is started below.
6830 	 */
6831 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
6832 			 PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
6833 			 asc_dvc->chip_scsi_id);
6834 
6835 	/*
6836 	 * Determine SCSI_CFG1 Microcode Default Value.
6837 	 *
6838 	 * The microcode will set the SCSI_CFG1 register using this value
6839 	 * after it is started below.
6840 	 */
6841 
6842 	/* Read current SCSI_CFG1 Register value. */
6843 	scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
6844 
6845 	/*
6846 	 * If all three connectors are in use, return an error.
6847 	 */
6848 	if ((scsi_cfg1 & CABLE_ILLEGAL_A) == 0 ||
6849 	    (scsi_cfg1 & CABLE_ILLEGAL_B) == 0) {
6850 		asc_dvc->err_code |= ASC_IERR_ILLEGAL_CONNECTION;
6851 		return ADV_ERROR;
6852 	}
6853 
6854 	/*
6855 	 * If the internal narrow cable is reversed all of the SCSI_CTRL
6856 	 * register signals will be set. Check for and return an error if
6857 	 * this condition is found.
6858 	 */
6859 	if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
6860 		asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
6861 		return ADV_ERROR;
6862 	}
6863 
6864 	/*
6865 	 * If this is a differential board and a single-ended device
6866 	 * is attached to one of the connectors, return an error.
6867 	 */
6868 	if ((scsi_cfg1 & DIFF_MODE) && (scsi_cfg1 & DIFF_SENSE) == 0) {
6869 		asc_dvc->err_code |= ASC_IERR_SINGLE_END_DEVICE;
6870 		return ADV_ERROR;
6871 	}
6872 
6873 	/*
6874 	 * If automatic termination control is enabled, then set the
6875 	 * termination value based on a table listed in a_condor.h.
6876 	 *
6877 	 * If manual termination was specified with an EEPROM setting
6878 	 * then 'termination' was set-up in AdvInitFrom3550EEPROM() and
6879 	 * is ready to be 'ored' into SCSI_CFG1.
6880 	 */
6881 	if (asc_dvc->cfg->termination == 0) {
6882 		/*
6883 		 * The software always controls termination by setting TERM_CTL_SEL.
6884 		 * If TERM_CTL_SEL were set to 0, the hardware would set termination.
6885 		 */
6886 		asc_dvc->cfg->termination |= TERM_CTL_SEL;
6887 
6888 		switch (scsi_cfg1 & CABLE_DETECT) {
6889 			/* TERM_CTL_H: on, TERM_CTL_L: on */
6890 		case 0x3:
6891 		case 0x7:
6892 		case 0xB:
6893 		case 0xD:
6894 		case 0xE:
6895 		case 0xF:
6896 			asc_dvc->cfg->termination |= (TERM_CTL_H | TERM_CTL_L);
6897 			break;
6898 
6899 			/* TERM_CTL_H: on, TERM_CTL_L: off */
6900 		case 0x1:
6901 		case 0x5:
6902 		case 0x9:
6903 		case 0xA:
6904 		case 0xC:
6905 			asc_dvc->cfg->termination |= TERM_CTL_H;
6906 			break;
6907 
6908 			/* TERM_CTL_H: off, TERM_CTL_L: off */
6909 		case 0x2:
6910 		case 0x6:
6911 			break;
6912 		}
6913 	}
6914 
6915 	/*
6916 	 * Clear any set TERM_CTL_H and TERM_CTL_L bits.
6917 	 */
6918 	scsi_cfg1 &= ~TERM_CTL;
6919 
6920 	/*
6921 	 * Invert the TERM_CTL_H and TERM_CTL_L bits and then
6922 	 * set 'scsi_cfg1'. The TERM_POL bit does not need to be
6923 	 * referenced, because the hardware internally inverts
6924 	 * the Termination High and Low bits if TERM_POL is set.
6925 	 */
6926 	scsi_cfg1 |= (TERM_CTL_SEL | (~asc_dvc->cfg->termination & TERM_CTL));
6927 
6928 	/*
6929 	 * Set SCSI_CFG1 Microcode Default Value
6930 	 *
6931 	 * Set filter value and possibly modified termination control
6932 	 * bits in the Microcode SCSI_CFG1 Register Value.
6933 	 *
6934 	 * The microcode will set the SCSI_CFG1 register using this value
6935 	 * after it is started below.
6936 	 */
6937 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1,
6938 			 FLTR_DISABLE | scsi_cfg1);
6939 
6940 	/*
6941 	 * Set MEM_CFG Microcode Default Value
6942 	 *
6943 	 * The microcode will set the MEM_CFG register using this value
6944 	 * after it is started below.
6945 	 *
6946 	 * MEM_CFG may be accessed as a word or byte, but only bits 0-7
6947 	 * are defined.
6948 	 *
6949 	 * ASC-3550 has 8KB internal memory.
6950 	 */
6951 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
6952 			 BIOS_EN | RAM_SZ_8KB);
6953 
6954 	/*
6955 	 * Set SEL_MASK Microcode Default Value
6956 	 *
6957 	 * The microcode will set the SEL_MASK register using this value
6958 	 * after it is started below.
6959 	 */
6960 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
6961 			 ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
6962 
6963 	AdvBuildCarrierFreelist(asc_dvc);
6964 
6965 	/*
6966 	 * Set-up the Host->RISC Initiator Command Queue (ICQ).
6967 	 */
6968 
6969 	if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
6970 		asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
6971 		return ADV_ERROR;
6972 	}
6973 	asc_dvc->carr_freelist = (ADV_CARR_T *)
6974 	    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
6975 
6976 	/*
6977 	 * The first command issued will be placed in the stopper carrier.
6978 	 */
6979 	asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
6980 
6981 	/*
6982 	 * Set RISC ICQ physical address start value.
6983 	 */
6984 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
6985 
6986 	/*
6987 	 * Set-up the RISC->Host Initiator Response Queue (IRQ).
6988 	 */
6989 	if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
6990 		asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
6991 		return ADV_ERROR;
6992 	}
6993 	asc_dvc->carr_freelist = (ADV_CARR_T *)
6994 	    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
6995 
6996 	/*
6997 	 * The first command completed by the RISC will be placed in
6998 	 * the stopper.
6999 	 *
7000 	 * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
7001 	 * completed the RISC will set the ASC_RQ_STOPPER bit.
7002 	 */
7003 	asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
7004 
7005 	/*
7006 	 * Set RISC IRQ physical address start value.
7007 	 */
7008 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
7009 	asc_dvc->carr_pending_cnt = 0;
7010 
7011 	AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
7012 			     (ADV_INTR_ENABLE_HOST_INTR |
7013 			      ADV_INTR_ENABLE_GLOBAL_INTR));
7014 
7015 	AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
7016 	AdvWriteWordRegister(iop_base, IOPW_PC, word);
7017 
7018 	/* finally, finally, gentlemen, start your engine */
7019 	AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
7020 
7021 	/*
7022 	 * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
7023 	 * Resets should be performed. The RISC has to be running
7024 	 * to issue a SCSI Bus Reset.
7025 	 */
7026 	if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
7027 		/*
7028 		 * If the BIOS Signature is present in memory, restore the
7029 		 * BIOS Handshake Configuration Table and do not perform
7030 		 * a SCSI Bus Reset.
7031 		 */
7032 		if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
7033 		    0x55AA) {
7034 			/*
7035 			 * Restore per TID negotiated values.
7036 			 */
7037 			AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
7038 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
7039 			AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
7040 					 tagqng_able);
7041 			for (tid = 0; tid <= ADV_MAX_TID; tid++) {
7042 				AdvWriteByteLram(iop_base,
7043 						 ASC_MC_NUMBER_OF_MAX_CMD + tid,
7044 						 max_cmd[tid]);
7045 			}
7046 		} else {
7047 			if (AdvResetSB(asc_dvc) != ADV_TRUE) {
7048 				warn_code = ASC_WARN_BUSRESET_ERROR;
7049 			}
7050 		}
7051 	}
7052 
7053 	return warn_code;
7054 }
7055 
7056 /*
7057  * Initialize the ASC-38C0800.
7058  *
7059  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
7060  *
7061  * For a non-fatal error return a warning code. If there are no warnings
7062  * then 0 is returned.
7063  *
7064  * Needed after initialization for error recovery.
7065  */
7066 static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
7067 {
7068 	AdvPortAddr iop_base;
7069 	ushort warn_code;
7070 	int begin_addr;
7071 	int end_addr;
7072 	ushort code_sum;
7073 	int word;
7074 	int i;
7075 	ushort scsi_cfg1;
7076 	uchar byte;
7077 	uchar tid;
7078 	ushort bios_mem[ASC_MC_BIOSLEN / 2];	/* BIOS RISC Memory 0x40-0x8F. */
7079 	ushort wdtr_able, sdtr_able, tagqng_able;
7080 	uchar max_cmd[ADV_MAX_TID + 1];
7081 
7082 	/* If there is already an error, don't continue. */
7083 	if (asc_dvc->err_code != 0)
7084 		return ADV_ERROR;
7085 
7086 	/*
7087 	 * The caller must set 'chip_type' to ADV_CHIP_ASC38C0800.
7088 	 */
7089 	if (asc_dvc->chip_type != ADV_CHIP_ASC38C0800) {
7090 		asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
7091 		return ADV_ERROR;
7092 	}
7093 
7094 	warn_code = 0;
7095 	iop_base = asc_dvc->iop_base;
7096 
7097 	/*
7098 	 * Save the RISC memory BIOS region before writing the microcode.
7099 	 * The BIOS may already be loaded and using its RISC LRAM region
7100 	 * so its region must be saved and restored.
7101 	 *
7102 	 * Note: This code makes the assumption, which is currently true,
7103 	 * that a chip reset does not clear RISC LRAM.
7104 	 */
7105 	for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
7106 		AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
7107 				bios_mem[i]);
7108 	}
7109 
7110 	/*
7111 	 * Save current per TID negotiated values.
7112 	 */
7113 	AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
7114 	AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
7115 	AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
7116 	for (tid = 0; tid <= ADV_MAX_TID; tid++) {
7117 		AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
7118 				max_cmd[tid]);
7119 	}
7120 
7121 	/*
7122 	 * RAM BIST (RAM Built-In Self Test)
7123 	 *
7124 	 * Address : I/O base + offset 0x38h register (byte).
7125 	 * Function: Bit 7-6(RW) : RAM mode
7126 	 *                          Normal Mode   : 0x00
7127 	 *                          Pre-test Mode : 0x40
7128 	 *                          RAM Test Mode : 0x80
7129 	 *           Bit 5       : unused
7130 	 *           Bit 4(RO)   : Done bit
7131 	 *           Bit 3-0(RO) : Status
7132 	 *                          Host Error    : 0x08
7133 	 *                          Int_RAM Error : 0x04
7134 	 *                          RISC Error    : 0x02
7135 	 *                          SCSI Error    : 0x01
7136 	 *                          No Error      : 0x00
7137 	 *
7138 	 * Note: RAM BIST code should be put right here, before loading the
7139 	 * microcode and after saving the RISC memory BIOS region.
7140 	 */
7141 
7142 	/*
7143 	 * LRAM Pre-test
7144 	 *
7145 	 * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
7146 	 * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
7147 	 * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
7148 	 * to NORMAL_MODE, return an error too.
7149 	 */
7150 	for (i = 0; i < 2; i++) {
7151 		AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
7152 		mdelay(10);	/* Wait for 10ms before reading back. */
7153 		byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
7154 		if ((byte & RAM_TEST_DONE) == 0
7155 		    || (byte & 0x0F) != PRE_TEST_VALUE) {
7156 			asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
7157 			return ADV_ERROR;
7158 		}
7159 
7160 		AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
7161 		mdelay(10);	/* Wait for 10ms before reading back. */
7162 		if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
7163 		    != NORMAL_VALUE) {
7164 			asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
7165 			return ADV_ERROR;
7166 		}
7167 	}
7168 
7169 	/*
7170 	 * LRAM Test - It takes about 1.5 ms to run through the test.
7171 	 *
7172 	 * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
7173 	 * If Done bit not set or Status not 0, save register byte, set the
7174 	 * err_code, and return an error.
7175 	 */
7176 	AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
7177 	mdelay(10);	/* Wait for 10ms before checking status. */
7178 
7179 	byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
7180 	if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
7181 		/* Get here if Done bit not set or Status not 0. */
7182 		asc_dvc->bist_err_code = byte;	/* for BIOS display message */
7183 		asc_dvc->err_code = ASC_IERR_BIST_RAM_TEST;
7184 		return ADV_ERROR;
7185 	}
7186 
7187 	/* We need to reset back to normal mode after LRAM test passes. */
7188 	AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
7189 
7190 	asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc38C0800_buf,
7191 				 _adv_asc38C0800_size, ADV_38C0800_MEMSIZE,
7192 				 _adv_asc38C0800_chksum);
7193 	if (asc_dvc->err_code)
7194 		return ADV_ERROR;
7195 
7196 	/*
7197 	 * Restore the RISC memory BIOS region.
7198 	 */
7199 	for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
7200 		AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
7201 				 bios_mem[i]);
7202 	}
7203 
7204 	/*
7205 	 * Calculate and write the microcode code checksum to the microcode
7206 	 * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
7207 	 */
7208 	AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
7209 	AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
7210 	code_sum = 0;
7211 	AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
7212 	for (word = begin_addr; word < end_addr; word += 2) {
7213 		code_sum += AdvReadWordAutoIncLram(iop_base);
7214 	}
7215 	AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
7216 
7217 	/*
7218 	 * Read microcode version and date.
7219 	 */
7220 	AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
7221 			asc_dvc->cfg->mcode_date);
7222 	AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
7223 			asc_dvc->cfg->mcode_version);
7224 
7225 	/*
7226 	 * Set the chip type to indicate the ASC38C0800.
7227 	 */
7228 	AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C0800);
7229 
7230 	/*
7231 	 * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
7232 	 * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
7233 	 * cable detection and then we are able to read C_DET[3:0].
7234 	 *
7235 	 * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
7236 	 * Microcode Default Value' section below.
7237 	 */
7238 	scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
7239 	AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1,
7240 			     scsi_cfg1 | DIS_TERM_DRV);
7241 
7242 	/*
7243 	 * If the PCI Configuration Command Register "Parity Error Response
7244 	 * Control" Bit was clear (0), then set the microcode variable
7245 	 * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
7246 	 * to ignore DMA parity errors.
7247 	 */
7248 	if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
7249 		AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
7250 		word |= CONTROL_FLAG_IGNORE_PERR;
7251 		AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
7252 	}
7253 
7254 	/*
7255 	 * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2]
7256 	 * bits for the default FIFO threshold.
7257 	 *
7258 	 * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes.
7259 	 *
7260 	 * For DMA Errata #4 set the BC_THRESH_ENB bit.
7261 	 */
7262 	AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
7263 			     BC_THRESH_ENB | FIFO_THRESH_80B | START_CTL_TH |
7264 			     READ_CMD_MRM);
7265 
7266 	/*
7267 	 * Microcode operating variables for WDTR, SDTR, and command tag
7268 	 * queuing will be set in slave_configure() based on what a
7269 	 * device reports it is capable of in Inquiry byte 7.
7270 	 *
7271 	 * If SCSI Bus Resets have been disabled, then directly set
7272 	 * SDTR and WDTR from the EEPROM configuration. This will allow
7273 	 * the BIOS and warm boot to work without a SCSI bus hang on
7274 	 * the Inquiry caused by host and target mismatched DTR values.
7275 	 * Without the SCSI Bus Reset, before an Inquiry a device can't
7276 	 * be assumed to be in Asynchronous, Narrow mode.
7277 	 */
7278 	if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
7279 		AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
7280 				 asc_dvc->wdtr_able);
7281 		AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
7282 				 asc_dvc->sdtr_able);
7283 	}
7284 
7285 	/*
7286 	 * Set microcode operating variables for DISC and SDTR_SPEED1,
7287 	 * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
7288 	 * configuration values.
7289 	 *
7290 	 * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
7291 	 * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
7292 	 * without determining here whether the device supports SDTR.
7293 	 */
7294 	AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
7295 			 asc_dvc->cfg->disc_enable);
7296 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
7297 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
7298 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
7299 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
7300 
7301 	/*
7302 	 * Set SCSI_CFG0 Microcode Default Value.
7303 	 *
7304 	 * The microcode will set the SCSI_CFG0 register using this value
7305 	 * after it is started below.
7306 	 */
7307 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
7308 			 PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
7309 			 asc_dvc->chip_scsi_id);
7310 
7311 	/*
7312 	 * Determine SCSI_CFG1 Microcode Default Value.
7313 	 *
7314 	 * The microcode will set the SCSI_CFG1 register using this value
7315 	 * after it is started below.
7316 	 */
7317 
7318 	/* Read current SCSI_CFG1 Register value. */
7319 	scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
7320 
7321 	/*
7322 	 * If the internal narrow cable is reversed all of the SCSI_CTRL
7323 	 * register signals will be set. Check for and return an error if
7324 	 * this condition is found.
7325 	 */
7326 	if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
7327 		asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
7328 		return ADV_ERROR;
7329 	}
7330 
7331 	/*
7332 	 * All kind of combinations of devices attached to one of four
7333 	 * connectors are acceptable except HVD device attached. For example,
7334 	 * LVD device can be attached to SE connector while SE device attached
7335 	 * to LVD connector.  If LVD device attached to SE connector, it only
7336 	 * runs up to Ultra speed.
7337 	 *
7338 	 * If an HVD device is attached to one of LVD connectors, return an
7339 	 * error.  However, there is no way to detect HVD device attached to
7340 	 * SE connectors.
7341 	 */
7342 	if (scsi_cfg1 & HVD) {
7343 		asc_dvc->err_code = ASC_IERR_HVD_DEVICE;
7344 		return ADV_ERROR;
7345 	}
7346 
7347 	/*
7348 	 * If either SE or LVD automatic termination control is enabled, then
7349 	 * set the termination value based on a table listed in a_condor.h.
7350 	 *
7351 	 * If manual termination was specified with an EEPROM setting then
7352 	 * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready
7353 	 * to be 'ored' into SCSI_CFG1.
7354 	 */
7355 	if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
7356 		/* SE automatic termination control is enabled. */
7357 		switch (scsi_cfg1 & C_DET_SE) {
7358 			/* TERM_SE_HI: on, TERM_SE_LO: on */
7359 		case 0x1:
7360 		case 0x2:
7361 		case 0x3:
7362 			asc_dvc->cfg->termination |= TERM_SE;
7363 			break;
7364 
7365 			/* TERM_SE_HI: on, TERM_SE_LO: off */
7366 		case 0x0:
7367 			asc_dvc->cfg->termination |= TERM_SE_HI;
7368 			break;
7369 		}
7370 	}
7371 
7372 	if ((asc_dvc->cfg->termination & TERM_LVD) == 0) {
7373 		/* LVD automatic termination control is enabled. */
7374 		switch (scsi_cfg1 & C_DET_LVD) {
7375 			/* TERM_LVD_HI: on, TERM_LVD_LO: on */
7376 		case 0x4:
7377 		case 0x8:
7378 		case 0xC:
7379 			asc_dvc->cfg->termination |= TERM_LVD;
7380 			break;
7381 
7382 			/* TERM_LVD_HI: off, TERM_LVD_LO: off */
7383 		case 0x0:
7384 			break;
7385 		}
7386 	}
7387 
7388 	/*
7389 	 * Clear any set TERM_SE and TERM_LVD bits.
7390 	 */
7391 	scsi_cfg1 &= (~TERM_SE & ~TERM_LVD);
7392 
7393 	/*
7394 	 * Invert the TERM_SE and TERM_LVD bits and then set 'scsi_cfg1'.
7395 	 */
7396 	scsi_cfg1 |= (~asc_dvc->cfg->termination & 0xF0);
7397 
7398 	/*
7399 	 * Clear BIG_ENDIAN, DIS_TERM_DRV, Terminator Polarity and HVD/LVD/SE
7400 	 * bits and set possibly modified termination control bits in the
7401 	 * Microcode SCSI_CFG1 Register Value.
7402 	 */
7403 	scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL & ~HVD_LVD_SE);
7404 
7405 	/*
7406 	 * Set SCSI_CFG1 Microcode Default Value
7407 	 *
7408 	 * Set possibly modified termination control and reset DIS_TERM_DRV
7409 	 * bits in the Microcode SCSI_CFG1 Register Value.
7410 	 *
7411 	 * The microcode will set the SCSI_CFG1 register using this value
7412 	 * after it is started below.
7413 	 */
7414 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
7415 
7416 	/*
7417 	 * Set MEM_CFG Microcode Default Value
7418 	 *
7419 	 * The microcode will set the MEM_CFG register using this value
7420 	 * after it is started below.
7421 	 *
7422 	 * MEM_CFG may be accessed as a word or byte, but only bits 0-7
7423 	 * are defined.
7424 	 *
7425 	 * ASC-38C0800 has 16KB internal memory.
7426 	 */
7427 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
7428 			 BIOS_EN | RAM_SZ_16KB);
7429 
7430 	/*
7431 	 * Set SEL_MASK Microcode Default Value
7432 	 *
7433 	 * The microcode will set the SEL_MASK register using this value
7434 	 * after it is started below.
7435 	 */
7436 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
7437 			 ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
7438 
7439 	AdvBuildCarrierFreelist(asc_dvc);
7440 
7441 	/*
7442 	 * Set-up the Host->RISC Initiator Command Queue (ICQ).
7443 	 */
7444 
7445 	if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
7446 		asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
7447 		return ADV_ERROR;
7448 	}
7449 	asc_dvc->carr_freelist = (ADV_CARR_T *)
7450 	    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
7451 
7452 	/*
7453 	 * The first command issued will be placed in the stopper carrier.
7454 	 */
7455 	asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
7456 
7457 	/*
7458 	 * Set RISC ICQ physical address start value.
7459 	 * carr_pa is LE, must be native before write
7460 	 */
7461 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
7462 
7463 	/*
7464 	 * Set-up the RISC->Host Initiator Response Queue (IRQ).
7465 	 */
7466 	if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
7467 		asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
7468 		return ADV_ERROR;
7469 	}
7470 	asc_dvc->carr_freelist = (ADV_CARR_T *)
7471 	    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
7472 
7473 	/*
7474 	 * The first command completed by the RISC will be placed in
7475 	 * the stopper.
7476 	 *
7477 	 * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
7478 	 * completed the RISC will set the ASC_RQ_STOPPER bit.
7479 	 */
7480 	asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
7481 
7482 	/*
7483 	 * Set RISC IRQ physical address start value.
7484 	 *
7485 	 * carr_pa is LE, must be native before write *
7486 	 */
7487 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
7488 	asc_dvc->carr_pending_cnt = 0;
7489 
7490 	AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
7491 			     (ADV_INTR_ENABLE_HOST_INTR |
7492 			      ADV_INTR_ENABLE_GLOBAL_INTR));
7493 
7494 	AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
7495 	AdvWriteWordRegister(iop_base, IOPW_PC, word);
7496 
7497 	/* finally, finally, gentlemen, start your engine */
7498 	AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
7499 
7500 	/*
7501 	 * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
7502 	 * Resets should be performed. The RISC has to be running
7503 	 * to issue a SCSI Bus Reset.
7504 	 */
7505 	if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
7506 		/*
7507 		 * If the BIOS Signature is present in memory, restore the
7508 		 * BIOS Handshake Configuration Table and do not perform
7509 		 * a SCSI Bus Reset.
7510 		 */
7511 		if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
7512 		    0x55AA) {
7513 			/*
7514 			 * Restore per TID negotiated values.
7515 			 */
7516 			AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
7517 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
7518 			AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
7519 					 tagqng_able);
7520 			for (tid = 0; tid <= ADV_MAX_TID; tid++) {
7521 				AdvWriteByteLram(iop_base,
7522 						 ASC_MC_NUMBER_OF_MAX_CMD + tid,
7523 						 max_cmd[tid]);
7524 			}
7525 		} else {
7526 			if (AdvResetSB(asc_dvc) != ADV_TRUE) {
7527 				warn_code = ASC_WARN_BUSRESET_ERROR;
7528 			}
7529 		}
7530 	}
7531 
7532 	return warn_code;
7533 }
7534 
7535 /*
7536  * Initialize the ASC-38C1600.
7537  *
7538  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
7539  *
7540  * For a non-fatal error return a warning code. If there are no warnings
7541  * then 0 is returned.
7542  *
7543  * Needed after initialization for error recovery.
7544  */
7545 static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
7546 {
7547 	AdvPortAddr iop_base;
7548 	ushort warn_code;
7549 	int begin_addr;
7550 	int end_addr;
7551 	ushort code_sum;
7552 	long word;
7553 	int i;
7554 	ushort scsi_cfg1;
7555 	uchar byte;
7556 	uchar tid;
7557 	ushort bios_mem[ASC_MC_BIOSLEN / 2];	/* BIOS RISC Memory 0x40-0x8F. */
7558 	ushort wdtr_able, sdtr_able, ppr_able, tagqng_able;
7559 	uchar max_cmd[ASC_MAX_TID + 1];
7560 
7561 	/* If there is already an error, don't continue. */
7562 	if (asc_dvc->err_code != 0) {
7563 		return ADV_ERROR;
7564 	}
7565 
7566 	/*
7567 	 * The caller must set 'chip_type' to ADV_CHIP_ASC38C1600.
7568 	 */
7569 	if (asc_dvc->chip_type != ADV_CHIP_ASC38C1600) {
7570 		asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
7571 		return ADV_ERROR;
7572 	}
7573 
7574 	warn_code = 0;
7575 	iop_base = asc_dvc->iop_base;
7576 
7577 	/*
7578 	 * Save the RISC memory BIOS region before writing the microcode.
7579 	 * The BIOS may already be loaded and using its RISC LRAM region
7580 	 * so its region must be saved and restored.
7581 	 *
7582 	 * Note: This code makes the assumption, which is currently true,
7583 	 * that a chip reset does not clear RISC LRAM.
7584 	 */
7585 	for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
7586 		AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
7587 				bios_mem[i]);
7588 	}
7589 
7590 	/*
7591 	 * Save current per TID negotiated values.
7592 	 */
7593 	AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
7594 	AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
7595 	AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
7596 	AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
7597 	for (tid = 0; tid <= ASC_MAX_TID; tid++) {
7598 		AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
7599 				max_cmd[tid]);
7600 	}
7601 
7602 	/*
7603 	 * RAM BIST (Built-In Self Test)
7604 	 *
7605 	 * Address : I/O base + offset 0x38h register (byte).
7606 	 * Function: Bit 7-6(RW) : RAM mode
7607 	 *                          Normal Mode   : 0x00
7608 	 *                          Pre-test Mode : 0x40
7609 	 *                          RAM Test Mode : 0x80
7610 	 *           Bit 5       : unused
7611 	 *           Bit 4(RO)   : Done bit
7612 	 *           Bit 3-0(RO) : Status
7613 	 *                          Host Error    : 0x08
7614 	 *                          Int_RAM Error : 0x04
7615 	 *                          RISC Error    : 0x02
7616 	 *                          SCSI Error    : 0x01
7617 	 *                          No Error      : 0x00
7618 	 *
7619 	 * Note: RAM BIST code should be put right here, before loading the
7620 	 * microcode and after saving the RISC memory BIOS region.
7621 	 */
7622 
7623 	/*
7624 	 * LRAM Pre-test
7625 	 *
7626 	 * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
7627 	 * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
7628 	 * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
7629 	 * to NORMAL_MODE, return an error too.
7630 	 */
7631 	for (i = 0; i < 2; i++) {
7632 		AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
7633 		mdelay(10);	/* Wait for 10ms before reading back. */
7634 		byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
7635 		if ((byte & RAM_TEST_DONE) == 0
7636 		    || (byte & 0x0F) != PRE_TEST_VALUE) {
7637 			asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
7638 			return ADV_ERROR;
7639 		}
7640 
7641 		AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
7642 		mdelay(10);	/* Wait for 10ms before reading back. */
7643 		if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
7644 		    != NORMAL_VALUE) {
7645 			asc_dvc->err_code = ASC_IERR_BIST_PRE_TEST;
7646 			return ADV_ERROR;
7647 		}
7648 	}
7649 
7650 	/*
7651 	 * LRAM Test - It takes about 1.5 ms to run through the test.
7652 	 *
7653 	 * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
7654 	 * If Done bit not set or Status not 0, save register byte, set the
7655 	 * err_code, and return an error.
7656 	 */
7657 	AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
7658 	mdelay(10);	/* Wait for 10ms before checking status. */
7659 
7660 	byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
7661 	if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
7662 		/* Get here if Done bit not set or Status not 0. */
7663 		asc_dvc->bist_err_code = byte;	/* for BIOS display message */
7664 		asc_dvc->err_code = ASC_IERR_BIST_RAM_TEST;
7665 		return ADV_ERROR;
7666 	}
7667 
7668 	/* We need to reset back to normal mode after LRAM test passes. */
7669 	AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
7670 
7671 	asc_dvc->err_code = AdvLoadMicrocode(iop_base, _adv_asc38C1600_buf,
7672 				 _adv_asc38C1600_size, ADV_38C1600_MEMSIZE,
7673 				 _adv_asc38C1600_chksum);
7674 	if (asc_dvc->err_code)
7675 		return ADV_ERROR;
7676 
7677 	/*
7678 	 * Restore the RISC memory BIOS region.
7679 	 */
7680 	for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
7681 		AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
7682 				 bios_mem[i]);
7683 	}
7684 
7685 	/*
7686 	 * Calculate and write the microcode code checksum to the microcode
7687 	 * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
7688 	 */
7689 	AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
7690 	AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
7691 	code_sum = 0;
7692 	AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
7693 	for (word = begin_addr; word < end_addr; word += 2) {
7694 		code_sum += AdvReadWordAutoIncLram(iop_base);
7695 	}
7696 	AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
7697 
7698 	/*
7699 	 * Read microcode version and date.
7700 	 */
7701 	AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
7702 			asc_dvc->cfg->mcode_date);
7703 	AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
7704 			asc_dvc->cfg->mcode_version);
7705 
7706 	/*
7707 	 * Set the chip type to indicate the ASC38C1600.
7708 	 */
7709 	AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C1600);
7710 
7711 	/*
7712 	 * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
7713 	 * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
7714 	 * cable detection and then we are able to read C_DET[3:0].
7715 	 *
7716 	 * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
7717 	 * Microcode Default Value' section below.
7718 	 */
7719 	scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
7720 	AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1,
7721 			     scsi_cfg1 | DIS_TERM_DRV);
7722 
7723 	/*
7724 	 * If the PCI Configuration Command Register "Parity Error Response
7725 	 * Control" Bit was clear (0), then set the microcode variable
7726 	 * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
7727 	 * to ignore DMA parity errors.
7728 	 */
7729 	if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
7730 		AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
7731 		word |= CONTROL_FLAG_IGNORE_PERR;
7732 		AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
7733 	}
7734 
7735 	/*
7736 	 * If the BIOS control flag AIPP (Asynchronous Information
7737 	 * Phase Protection) disable bit is not set, then set the firmware
7738 	 * 'control_flag' CONTROL_FLAG_ENABLE_AIPP bit to enable
7739 	 * AIPP checking and encoding.
7740 	 */
7741 	if ((asc_dvc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0) {
7742 		AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
7743 		word |= CONTROL_FLAG_ENABLE_AIPP;
7744 		AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
7745 	}
7746 
7747 	/*
7748 	 * For ASC-38C1600 use DMA_CFG0 default values: FIFO_THRESH_80B [6:4],
7749 	 * and START_CTL_TH [3:2].
7750 	 */
7751 	AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
7752 			     FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
7753 
7754 	/*
7755 	 * Microcode operating variables for WDTR, SDTR, and command tag
7756 	 * queuing will be set in slave_configure() based on what a
7757 	 * device reports it is capable of in Inquiry byte 7.
7758 	 *
7759 	 * If SCSI Bus Resets have been disabled, then directly set
7760 	 * SDTR and WDTR from the EEPROM configuration. This will allow
7761 	 * the BIOS and warm boot to work without a SCSI bus hang on
7762 	 * the Inquiry caused by host and target mismatched DTR values.
7763 	 * Without the SCSI Bus Reset, before an Inquiry a device can't
7764 	 * be assumed to be in Asynchronous, Narrow mode.
7765 	 */
7766 	if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
7767 		AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
7768 				 asc_dvc->wdtr_able);
7769 		AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
7770 				 asc_dvc->sdtr_able);
7771 	}
7772 
7773 	/*
7774 	 * Set microcode operating variables for DISC and SDTR_SPEED1,
7775 	 * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
7776 	 * configuration values.
7777 	 *
7778 	 * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
7779 	 * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
7780 	 * without determining here whether the device supports SDTR.
7781 	 */
7782 	AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
7783 			 asc_dvc->cfg->disc_enable);
7784 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
7785 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
7786 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
7787 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
7788 
7789 	/*
7790 	 * Set SCSI_CFG0 Microcode Default Value.
7791 	 *
7792 	 * The microcode will set the SCSI_CFG0 register using this value
7793 	 * after it is started below.
7794 	 */
7795 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
7796 			 PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
7797 			 asc_dvc->chip_scsi_id);
7798 
7799 	/*
7800 	 * Calculate SCSI_CFG1 Microcode Default Value.
7801 	 *
7802 	 * The microcode will set the SCSI_CFG1 register using this value
7803 	 * after it is started below.
7804 	 *
7805 	 * Each ASC-38C1600 function has only two cable detect bits.
7806 	 * The bus mode override bits are in IOPB_SOFT_OVER_WR.
7807 	 */
7808 	scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
7809 
7810 	/*
7811 	 * If the cable is reversed all of the SCSI_CTRL register signals
7812 	 * will be set. Check for and return an error if this condition is
7813 	 * found.
7814 	 */
7815 	if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
7816 		asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
7817 		return ADV_ERROR;
7818 	}
7819 
7820 	/*
7821 	 * Each ASC-38C1600 function has two connectors. Only an HVD device
7822 	 * can not be connected to either connector. An LVD device or SE device
7823 	 * may be connected to either connecor. If an SE device is connected,
7824 	 * then at most Ultra speed (20 Mhz) can be used on both connectors.
7825 	 *
7826 	 * If an HVD device is attached, return an error.
7827 	 */
7828 	if (scsi_cfg1 & HVD) {
7829 		asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
7830 		return ADV_ERROR;
7831 	}
7832 
7833 	/*
7834 	 * Each function in the ASC-38C1600 uses only the SE cable detect and
7835 	 * termination because there are two connectors for each function. Each
7836 	 * function may use either LVD or SE mode. Corresponding the SE automatic
7837 	 * termination control EEPROM bits are used for each function. Each
7838 	 * function has its own EEPROM. If SE automatic control is enabled for
7839 	 * the function, then set the termination value based on a table listed
7840 	 * in a_condor.h.
7841 	 *
7842 	 * If manual termination is specified in the EEPROM for the function,
7843 	 * then 'termination' was set-up in AscInitFrom38C1600EEPROM() and is
7844 	 * ready to be 'ored' into SCSI_CFG1.
7845 	 */
7846 	if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
7847 		struct pci_dev *pdev = adv_dvc_to_pdev(asc_dvc);
7848 		/* SE automatic termination control is enabled. */
7849 		switch (scsi_cfg1 & C_DET_SE) {
7850 			/* TERM_SE_HI: on, TERM_SE_LO: on */
7851 		case 0x1:
7852 		case 0x2:
7853 		case 0x3:
7854 			asc_dvc->cfg->termination |= TERM_SE;
7855 			break;
7856 
7857 		case 0x0:
7858 			if (PCI_FUNC(pdev->devfn) == 0) {
7859 				/* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */
7860 			} else {
7861 				/* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */
7862 				asc_dvc->cfg->termination |= TERM_SE_HI;
7863 			}
7864 			break;
7865 		}
7866 	}
7867 
7868 	/*
7869 	 * Clear any set TERM_SE bits.
7870 	 */
7871 	scsi_cfg1 &= ~TERM_SE;
7872 
7873 	/*
7874 	 * Invert the TERM_SE bits and then set 'scsi_cfg1'.
7875 	 */
7876 	scsi_cfg1 |= (~asc_dvc->cfg->termination & TERM_SE);
7877 
7878 	/*
7879 	 * Clear Big Endian and Terminator Polarity bits and set possibly
7880 	 * modified termination control bits in the Microcode SCSI_CFG1
7881 	 * Register Value.
7882 	 *
7883 	 * Big Endian bit is not used even on big endian machines.
7884 	 */
7885 	scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL);
7886 
7887 	/*
7888 	 * Set SCSI_CFG1 Microcode Default Value
7889 	 *
7890 	 * Set possibly modified termination control bits in the Microcode
7891 	 * SCSI_CFG1 Register Value.
7892 	 *
7893 	 * The microcode will set the SCSI_CFG1 register using this value
7894 	 * after it is started below.
7895 	 */
7896 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
7897 
7898 	/*
7899 	 * Set MEM_CFG Microcode Default Value
7900 	 *
7901 	 * The microcode will set the MEM_CFG register using this value
7902 	 * after it is started below.
7903 	 *
7904 	 * MEM_CFG may be accessed as a word or byte, but only bits 0-7
7905 	 * are defined.
7906 	 *
7907 	 * ASC-38C1600 has 32KB internal memory.
7908 	 *
7909 	 * XXX - Since ASC38C1600 Rev.3 has a Local RAM failure issue, we come
7910 	 * out a special 16K Adv Library and Microcode version. After the issue
7911 	 * resolved, we should turn back to the 32K support. Both a_condor.h and
7912 	 * mcode.sas files also need to be updated.
7913 	 *
7914 	 * AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
7915 	 *  BIOS_EN | RAM_SZ_32KB);
7916 	 */
7917 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
7918 			 BIOS_EN | RAM_SZ_16KB);
7919 
7920 	/*
7921 	 * Set SEL_MASK Microcode Default Value
7922 	 *
7923 	 * The microcode will set the SEL_MASK register using this value
7924 	 * after it is started below.
7925 	 */
7926 	AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
7927 			 ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
7928 
7929 	AdvBuildCarrierFreelist(asc_dvc);
7930 
7931 	/*
7932 	 * Set-up the Host->RISC Initiator Command Queue (ICQ).
7933 	 */
7934 	if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
7935 		asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
7936 		return ADV_ERROR;
7937 	}
7938 	asc_dvc->carr_freelist = (ADV_CARR_T *)
7939 	    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
7940 
7941 	/*
7942 	 * The first command issued will be placed in the stopper carrier.
7943 	 */
7944 	asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
7945 
7946 	/*
7947 	 * Set RISC ICQ physical address start value. Initialize the
7948 	 * COMMA register to the same value otherwise the RISC will
7949 	 * prematurely detect a command is available.
7950 	 */
7951 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
7952 	AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
7953 			      le32_to_cpu(asc_dvc->icq_sp->carr_pa));
7954 
7955 	/*
7956 	 * Set-up the RISC->Host Initiator Response Queue (IRQ).
7957 	 */
7958 	if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
7959 		asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
7960 		return ADV_ERROR;
7961 	}
7962 	asc_dvc->carr_freelist = (ADV_CARR_T *)
7963 	    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
7964 
7965 	/*
7966 	 * The first command completed by the RISC will be placed in
7967 	 * the stopper.
7968 	 *
7969 	 * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
7970 	 * completed the RISC will set the ASC_RQ_STOPPER bit.
7971 	 */
7972 	asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
7973 
7974 	/*
7975 	 * Set RISC IRQ physical address start value.
7976 	 */
7977 	AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
7978 	asc_dvc->carr_pending_cnt = 0;
7979 
7980 	AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
7981 			     (ADV_INTR_ENABLE_HOST_INTR |
7982 			      ADV_INTR_ENABLE_GLOBAL_INTR));
7983 	AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
7984 	AdvWriteWordRegister(iop_base, IOPW_PC, word);
7985 
7986 	/* finally, finally, gentlemen, start your engine */
7987 	AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
7988 
7989 	/*
7990 	 * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
7991 	 * Resets should be performed. The RISC has to be running
7992 	 * to issue a SCSI Bus Reset.
7993 	 */
7994 	if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
7995 		/*
7996 		 * If the BIOS Signature is present in memory, restore the
7997 		 * per TID microcode operating variables.
7998 		 */
7999 		if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
8000 		    0x55AA) {
8001 			/*
8002 			 * Restore per TID negotiated values.
8003 			 */
8004 			AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
8005 			AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
8006 			AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
8007 			AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
8008 					 tagqng_able);
8009 			for (tid = 0; tid <= ASC_MAX_TID; tid++) {
8010 				AdvWriteByteLram(iop_base,
8011 						 ASC_MC_NUMBER_OF_MAX_CMD + tid,
8012 						 max_cmd[tid]);
8013 			}
8014 		} else {
8015 			if (AdvResetSB(asc_dvc) != ADV_TRUE) {
8016 				warn_code = ASC_WARN_BUSRESET_ERROR;
8017 			}
8018 		}
8019 	}
8020 
8021 	return warn_code;
8022 }
8023 
8024 /*
8025  * Reset chip and SCSI Bus.
8026  *
8027  * Return Value:
8028  *      ADV_TRUE(1) -   Chip re-initialization and SCSI Bus Reset successful.
8029  *      ADV_FALSE(0) -  Chip re-initialization and SCSI Bus Reset failure.
8030  */
8031 static int AdvResetChipAndSB(ADV_DVC_VAR *asc_dvc)
8032 {
8033 	int status;
8034 	ushort wdtr_able, sdtr_able, tagqng_able;
8035 	ushort ppr_able = 0;
8036 	uchar tid, max_cmd[ADV_MAX_TID + 1];
8037 	AdvPortAddr iop_base;
8038 	ushort bios_sig;
8039 
8040 	iop_base = asc_dvc->iop_base;
8041 
8042 	/*
8043 	 * Save current per TID negotiated values.
8044 	 */
8045 	AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
8046 	AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
8047 	if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
8048 		AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
8049 	}
8050 	AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
8051 	for (tid = 0; tid <= ADV_MAX_TID; tid++) {
8052 		AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
8053 				max_cmd[tid]);
8054 	}
8055 
8056 	/*
8057 	 * Force the AdvInitAsc3550/38C0800Driver() function to
8058 	 * perform a SCSI Bus Reset by clearing the BIOS signature word.
8059 	 * The initialization functions assumes a SCSI Bus Reset is not
8060 	 * needed if the BIOS signature word is present.
8061 	 */
8062 	AdvReadWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
8063 	AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, 0);
8064 
8065 	/*
8066 	 * Stop chip and reset it.
8067 	 */
8068 	AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_STOP);
8069 	AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_RESET);
8070 	mdelay(100);
8071 	AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
8072 			     ADV_CTRL_REG_CMD_WR_IO_REG);
8073 
8074 	/*
8075 	 * Reset Adv Library error code, if any, and try
8076 	 * re-initializing the chip.
8077 	 */
8078 	asc_dvc->err_code = 0;
8079 	if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
8080 		status = AdvInitAsc38C1600Driver(asc_dvc);
8081 	} else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
8082 		status = AdvInitAsc38C0800Driver(asc_dvc);
8083 	} else {
8084 		status = AdvInitAsc3550Driver(asc_dvc);
8085 	}
8086 
8087 	/* Translate initialization return value to status value. */
8088 	if (status == 0) {
8089 		status = ADV_TRUE;
8090 	} else {
8091 		status = ADV_FALSE;
8092 	}
8093 
8094 	/*
8095 	 * Restore the BIOS signature word.
8096 	 */
8097 	AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
8098 
8099 	/*
8100 	 * Restore per TID negotiated values.
8101 	 */
8102 	AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
8103 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
8104 	if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
8105 		AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
8106 	}
8107 	AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
8108 	for (tid = 0; tid <= ADV_MAX_TID; tid++) {
8109 		AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
8110 				 max_cmd[tid]);
8111 	}
8112 
8113 	return status;
8114 }
8115 
8116 /*
8117  * adv_async_callback() - Adv Library asynchronous event callback function.
8118  */
8119 static void adv_async_callback(ADV_DVC_VAR *adv_dvc_varp, uchar code)
8120 {
8121 	switch (code) {
8122 	case ADV_ASYNC_SCSI_BUS_RESET_DET:
8123 		/*
8124 		 * The firmware detected a SCSI Bus reset.
8125 		 */
8126 		ASC_DBG(0, "ADV_ASYNC_SCSI_BUS_RESET_DET\n");
8127 		break;
8128 
8129 	case ADV_ASYNC_RDMA_FAILURE:
8130 		/*
8131 		 * Handle RDMA failure by resetting the SCSI Bus and
8132 		 * possibly the chip if it is unresponsive. Log the error
8133 		 * with a unique code.
8134 		 */
8135 		ASC_DBG(0, "ADV_ASYNC_RDMA_FAILURE\n");
8136 		AdvResetChipAndSB(adv_dvc_varp);
8137 		break;
8138 
8139 	case ADV_HOST_SCSI_BUS_RESET:
8140 		/*
8141 		 * Host generated SCSI bus reset occurred.
8142 		 */
8143 		ASC_DBG(0, "ADV_HOST_SCSI_BUS_RESET\n");
8144 		break;
8145 
8146 	default:
8147 		ASC_DBG(0, "unknown code 0x%x\n", code);
8148 		break;
8149 	}
8150 }
8151 
8152 /*
8153  * adv_isr_callback() - Second Level Interrupt Handler called by AdvISR().
8154  *
8155  * Callback function for the Wide SCSI Adv Library.
8156  */
8157 static void adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp, ADV_SCSI_REQ_Q *scsiqp)
8158 {
8159 	struct asc_board *boardp;
8160 	adv_req_t *reqp;
8161 	adv_sgblk_t *sgblkp;
8162 	struct scsi_cmnd *scp;
8163 	struct Scsi_Host *shost;
8164 	ADV_DCNT resid_cnt;
8165 
8166 	ASC_DBG(1, "adv_dvc_varp 0x%lx, scsiqp 0x%lx\n",
8167 		 (ulong)adv_dvc_varp, (ulong)scsiqp);
8168 	ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
8169 
8170 	/*
8171 	 * Get the adv_req_t structure for the command that has been
8172 	 * completed. The adv_req_t structure actually contains the
8173 	 * completed ADV_SCSI_REQ_Q structure.
8174 	 */
8175 	reqp = (adv_req_t *)ADV_U32_TO_VADDR(scsiqp->srb_ptr);
8176 	ASC_DBG(1, "reqp 0x%lx\n", (ulong)reqp);
8177 	if (reqp == NULL) {
8178 		ASC_PRINT("adv_isr_callback: reqp is NULL\n");
8179 		return;
8180 	}
8181 
8182 	/*
8183 	 * Get the struct scsi_cmnd structure and Scsi_Host structure for the
8184 	 * command that has been completed.
8185 	 *
8186 	 * Note: The adv_req_t request structure and adv_sgblk_t structure,
8187 	 * if any, are dropped, because a board structure pointer can not be
8188 	 * determined.
8189 	 */
8190 	scp = reqp->cmndp;
8191 	ASC_DBG(1, "scp 0x%p\n", scp);
8192 	if (scp == NULL) {
8193 		ASC_PRINT
8194 		    ("adv_isr_callback: scp is NULL; adv_req_t dropped.\n");
8195 		return;
8196 	}
8197 	ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
8198 
8199 	shost = scp->device->host;
8200 	ASC_STATS(shost, callback);
8201 	ASC_DBG(1, "shost 0x%p\n", shost);
8202 
8203 	boardp = shost_priv(shost);
8204 	BUG_ON(adv_dvc_varp != &boardp->dvc_var.adv_dvc_var);
8205 
8206 	/*
8207 	 * 'done_status' contains the command's ending status.
8208 	 */
8209 	switch (scsiqp->done_status) {
8210 	case QD_NO_ERROR:
8211 		ASC_DBG(2, "QD_NO_ERROR\n");
8212 		scp->result = 0;
8213 
8214 		/*
8215 		 * Check for an underrun condition.
8216 		 *
8217 		 * If there was no error and an underrun condition, then
8218 		 * then return the number of underrun bytes.
8219 		 */
8220 		resid_cnt = le32_to_cpu(scsiqp->data_cnt);
8221 		if (scsi_bufflen(scp) != 0 && resid_cnt != 0 &&
8222 		    resid_cnt <= scsi_bufflen(scp)) {
8223 			ASC_DBG(1, "underrun condition %lu bytes\n",
8224 				 (ulong)resid_cnt);
8225 			scsi_set_resid(scp, resid_cnt);
8226 		}
8227 		break;
8228 
8229 	case QD_WITH_ERROR:
8230 		ASC_DBG(2, "QD_WITH_ERROR\n");
8231 		switch (scsiqp->host_status) {
8232 		case QHSTA_NO_ERROR:
8233 			if (scsiqp->scsi_status == SAM_STAT_CHECK_CONDITION) {
8234 				ASC_DBG(2, "SAM_STAT_CHECK_CONDITION\n");
8235 				ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
8236 						  SCSI_SENSE_BUFFERSIZE);
8237 				/*
8238 				 * Note: The 'status_byte()' macro used by
8239 				 * target drivers defined in scsi.h shifts the
8240 				 * status byte returned by host drivers right
8241 				 * by 1 bit.  This is why target drivers also
8242 				 * use right shifted status byte definitions.
8243 				 * For instance target drivers use
8244 				 * CHECK_CONDITION, defined to 0x1, instead of
8245 				 * the SCSI defined check condition value of
8246 				 * 0x2. Host drivers are supposed to return
8247 				 * the status byte as it is defined by SCSI.
8248 				 */
8249 				scp->result = DRIVER_BYTE(DRIVER_SENSE) |
8250 				    STATUS_BYTE(scsiqp->scsi_status);
8251 			} else {
8252 				scp->result = STATUS_BYTE(scsiqp->scsi_status);
8253 			}
8254 			break;
8255 
8256 		default:
8257 			/* Some other QHSTA error occurred. */
8258 			ASC_DBG(1, "host_status 0x%x\n", scsiqp->host_status);
8259 			scp->result = HOST_BYTE(DID_BAD_TARGET);
8260 			break;
8261 		}
8262 		break;
8263 
8264 	case QD_ABORTED_BY_HOST:
8265 		ASC_DBG(1, "QD_ABORTED_BY_HOST\n");
8266 		scp->result =
8267 		    HOST_BYTE(DID_ABORT) | STATUS_BYTE(scsiqp->scsi_status);
8268 		break;
8269 
8270 	default:
8271 		ASC_DBG(1, "done_status 0x%x\n", scsiqp->done_status);
8272 		scp->result =
8273 		    HOST_BYTE(DID_ERROR) | STATUS_BYTE(scsiqp->scsi_status);
8274 		break;
8275 	}
8276 
8277 	/*
8278 	 * If the 'init_tidmask' bit isn't already set for the target and the
8279 	 * current request finished normally, then set the bit for the target
8280 	 * to indicate that a device is present.
8281 	 */
8282 	if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
8283 	    scsiqp->done_status == QD_NO_ERROR &&
8284 	    scsiqp->host_status == QHSTA_NO_ERROR) {
8285 		boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
8286 	}
8287 
8288 	asc_scsi_done(scp);
8289 
8290 	/*
8291 	 * Free all 'adv_sgblk_t' structures allocated for the request.
8292 	 */
8293 	while ((sgblkp = reqp->sgblkp) != NULL) {
8294 		/* Remove 'sgblkp' from the request list. */
8295 		reqp->sgblkp = sgblkp->next_sgblkp;
8296 
8297 		/* Add 'sgblkp' to the board free list. */
8298 		sgblkp->next_sgblkp = boardp->adv_sgblkp;
8299 		boardp->adv_sgblkp = sgblkp;
8300 	}
8301 
8302 	/*
8303 	 * Free the adv_req_t structure used with the command by adding
8304 	 * it back to the board free list.
8305 	 */
8306 	reqp->next_reqp = boardp->adv_reqp;
8307 	boardp->adv_reqp = reqp;
8308 
8309 	ASC_DBG(1, "done\n");
8310 }
8311 
8312 /*
8313  * Adv Library Interrupt Service Routine
8314  *
8315  *  This function is called by a driver's interrupt service routine.
8316  *  The function disables and re-enables interrupts.
8317  *
8318  *  When a microcode idle command is completed, the ADV_DVC_VAR
8319  *  'idle_cmd_done' field is set to ADV_TRUE.
8320  *
8321  *  Note: AdvISR() can be called when interrupts are disabled or even
8322  *  when there is no hardware interrupt condition present. It will
8323  *  always check for completed idle commands and microcode requests.
8324  *  This is an important feature that shouldn't be changed because it
8325  *  allows commands to be completed from polling mode loops.
8326  *
8327  * Return:
8328  *   ADV_TRUE(1) - interrupt was pending
8329  *   ADV_FALSE(0) - no interrupt was pending
8330  */
8331 static int AdvISR(ADV_DVC_VAR *asc_dvc)
8332 {
8333 	AdvPortAddr iop_base;
8334 	uchar int_stat;
8335 	ushort target_bit;
8336 	ADV_CARR_T *free_carrp;
8337 	ADV_VADDR irq_next_vpa;
8338 	ADV_SCSI_REQ_Q *scsiq;
8339 
8340 	iop_base = asc_dvc->iop_base;
8341 
8342 	/* Reading the register clears the interrupt. */
8343 	int_stat = AdvReadByteRegister(iop_base, IOPB_INTR_STATUS_REG);
8344 
8345 	if ((int_stat & (ADV_INTR_STATUS_INTRA | ADV_INTR_STATUS_INTRB |
8346 			 ADV_INTR_STATUS_INTRC)) == 0) {
8347 		return ADV_FALSE;
8348 	}
8349 
8350 	/*
8351 	 * Notify the driver of an asynchronous microcode condition by
8352 	 * calling the adv_async_callback function. The function
8353 	 * is passed the microcode ASC_MC_INTRB_CODE byte value.
8354 	 */
8355 	if (int_stat & ADV_INTR_STATUS_INTRB) {
8356 		uchar intrb_code;
8357 
8358 		AdvReadByteLram(iop_base, ASC_MC_INTRB_CODE, intrb_code);
8359 
8360 		if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
8361 		    asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
8362 			if (intrb_code == ADV_ASYNC_CARRIER_READY_FAILURE &&
8363 			    asc_dvc->carr_pending_cnt != 0) {
8364 				AdvWriteByteRegister(iop_base, IOPB_TICKLE,
8365 						     ADV_TICKLE_A);
8366 				if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
8367 					AdvWriteByteRegister(iop_base,
8368 							     IOPB_TICKLE,
8369 							     ADV_TICKLE_NOP);
8370 				}
8371 			}
8372 		}
8373 
8374 		adv_async_callback(asc_dvc, intrb_code);
8375 	}
8376 
8377 	/*
8378 	 * Check if the IRQ stopper carrier contains a completed request.
8379 	 */
8380 	while (((irq_next_vpa =
8381 		 le32_to_cpu(asc_dvc->irq_sp->next_vpa)) & ASC_RQ_DONE) != 0) {
8382 		/*
8383 		 * Get a pointer to the newly completed ADV_SCSI_REQ_Q structure.
8384 		 * The RISC will have set 'areq_vpa' to a virtual address.
8385 		 *
8386 		 * The firmware will have copied the ASC_SCSI_REQ_Q.scsiq_ptr
8387 		 * field to the carrier ADV_CARR_T.areq_vpa field. The conversion
8388 		 * below complements the conversion of ASC_SCSI_REQ_Q.scsiq_ptr'
8389 		 * in AdvExeScsiQueue().
8390 		 */
8391 		scsiq = (ADV_SCSI_REQ_Q *)
8392 		    ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->areq_vpa));
8393 
8394 		/*
8395 		 * Request finished with good status and the queue was not
8396 		 * DMAed to host memory by the firmware. Set all status fields
8397 		 * to indicate good status.
8398 		 */
8399 		if ((irq_next_vpa & ASC_RQ_GOOD) != 0) {
8400 			scsiq->done_status = QD_NO_ERROR;
8401 			scsiq->host_status = scsiq->scsi_status = 0;
8402 			scsiq->data_cnt = 0L;
8403 		}
8404 
8405 		/*
8406 		 * Advance the stopper pointer to the next carrier
8407 		 * ignoring the lower four bits. Free the previous
8408 		 * stopper carrier.
8409 		 */
8410 		free_carrp = asc_dvc->irq_sp;
8411 		asc_dvc->irq_sp = (ADV_CARR_T *)
8412 		    ADV_U32_TO_VADDR(ASC_GET_CARRP(irq_next_vpa));
8413 
8414 		free_carrp->next_vpa =
8415 		    cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
8416 		asc_dvc->carr_freelist = free_carrp;
8417 		asc_dvc->carr_pending_cnt--;
8418 
8419 		target_bit = ADV_TID_TO_TIDMASK(scsiq->target_id);
8420 
8421 		/*
8422 		 * Clear request microcode control flag.
8423 		 */
8424 		scsiq->cntl = 0;
8425 
8426 		/*
8427 		 * Notify the driver of the completed request by passing
8428 		 * the ADV_SCSI_REQ_Q pointer to its callback function.
8429 		 */
8430 		scsiq->a_flag |= ADV_SCSIQ_DONE;
8431 		adv_isr_callback(asc_dvc, scsiq);
8432 		/*
8433 		 * Note: After the driver callback function is called, 'scsiq'
8434 		 * can no longer be referenced.
8435 		 *
8436 		 * Fall through and continue processing other completed
8437 		 * requests...
8438 		 */
8439 	}
8440 	return ADV_TRUE;
8441 }
8442 
8443 static int AscSetLibErrorCode(ASC_DVC_VAR *asc_dvc, ushort err_code)
8444 {
8445 	if (asc_dvc->err_code == 0) {
8446 		asc_dvc->err_code = err_code;
8447 		AscWriteLramWord(asc_dvc->iop_base, ASCV_ASCDVC_ERR_CODE_W,
8448 				 err_code);
8449 	}
8450 	return err_code;
8451 }
8452 
8453 static void AscAckInterrupt(PortAddr iop_base)
8454 {
8455 	uchar host_flag;
8456 	uchar risc_flag;
8457 	ushort loop;
8458 
8459 	loop = 0;
8460 	do {
8461 		risc_flag = AscReadLramByte(iop_base, ASCV_RISC_FLAG_B);
8462 		if (loop++ > 0x7FFF) {
8463 			break;
8464 		}
8465 	} while ((risc_flag & ASC_RISC_FLAG_GEN_INT) != 0);
8466 	host_flag =
8467 	    AscReadLramByte(iop_base,
8468 			    ASCV_HOST_FLAG_B) & (~ASC_HOST_FLAG_ACK_INT);
8469 	AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
8470 			 (uchar)(host_flag | ASC_HOST_FLAG_ACK_INT));
8471 	AscSetChipStatus(iop_base, CIW_INT_ACK);
8472 	loop = 0;
8473 	while (AscGetChipStatus(iop_base) & CSW_INT_PENDING) {
8474 		AscSetChipStatus(iop_base, CIW_INT_ACK);
8475 		if (loop++ > 3) {
8476 			break;
8477 		}
8478 	}
8479 	AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
8480 }
8481 
8482 static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time)
8483 {
8484 	const uchar *period_table;
8485 	int max_index;
8486 	int min_index;
8487 	int i;
8488 
8489 	period_table = asc_dvc->sdtr_period_tbl;
8490 	max_index = (int)asc_dvc->max_sdtr_index;
8491 	min_index = (int)asc_dvc->min_sdtr_index;
8492 	if ((syn_time <= period_table[max_index])) {
8493 		for (i = min_index; i < (max_index - 1); i++) {
8494 			if (syn_time <= period_table[i]) {
8495 				return (uchar)i;
8496 			}
8497 		}
8498 		return (uchar)max_index;
8499 	} else {
8500 		return (uchar)(max_index + 1);
8501 	}
8502 }
8503 
8504 static uchar
8505 AscMsgOutSDTR(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar sdtr_offset)
8506 {
8507 	EXT_MSG sdtr_buf;
8508 	uchar sdtr_period_index;
8509 	PortAddr iop_base;
8510 
8511 	iop_base = asc_dvc->iop_base;
8512 	sdtr_buf.msg_type = EXTENDED_MESSAGE;
8513 	sdtr_buf.msg_len = MS_SDTR_LEN;
8514 	sdtr_buf.msg_req = EXTENDED_SDTR;
8515 	sdtr_buf.xfer_period = sdtr_period;
8516 	sdtr_offset &= ASC_SYN_MAX_OFFSET;
8517 	sdtr_buf.req_ack_offset = sdtr_offset;
8518 	sdtr_period_index = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
8519 	if (sdtr_period_index <= asc_dvc->max_sdtr_index) {
8520 		AscMemWordCopyPtrToLram(iop_base, ASCV_MSGOUT_BEG,
8521 					(uchar *)&sdtr_buf,
8522 					sizeof(EXT_MSG) >> 1);
8523 		return ((sdtr_period_index << 4) | sdtr_offset);
8524 	} else {
8525 		sdtr_buf.req_ack_offset = 0;
8526 		AscMemWordCopyPtrToLram(iop_base, ASCV_MSGOUT_BEG,
8527 					(uchar *)&sdtr_buf,
8528 					sizeof(EXT_MSG) >> 1);
8529 		return 0;
8530 	}
8531 }
8532 
8533 static uchar
8534 AscCalSDTRData(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar syn_offset)
8535 {
8536 	uchar byte;
8537 	uchar sdtr_period_ix;
8538 
8539 	sdtr_period_ix = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
8540 	if (sdtr_period_ix > asc_dvc->max_sdtr_index)
8541 		return 0xFF;
8542 	byte = (sdtr_period_ix << 4) | (syn_offset & ASC_SYN_MAX_OFFSET);
8543 	return byte;
8544 }
8545 
8546 static int AscSetChipSynRegAtID(PortAddr iop_base, uchar id, uchar sdtr_data)
8547 {
8548 	ASC_SCSI_BIT_ID_TYPE org_id;
8549 	int i;
8550 	int sta = TRUE;
8551 
8552 	AscSetBank(iop_base, 1);
8553 	org_id = AscReadChipDvcID(iop_base);
8554 	for (i = 0; i <= ASC_MAX_TID; i++) {
8555 		if (org_id == (0x01 << i))
8556 			break;
8557 	}
8558 	org_id = (ASC_SCSI_BIT_ID_TYPE) i;
8559 	AscWriteChipDvcID(iop_base, id);
8560 	if (AscReadChipDvcID(iop_base) == (0x01 << id)) {
8561 		AscSetBank(iop_base, 0);
8562 		AscSetChipSyn(iop_base, sdtr_data);
8563 		if (AscGetChipSyn(iop_base) != sdtr_data) {
8564 			sta = FALSE;
8565 		}
8566 	} else {
8567 		sta = FALSE;
8568 	}
8569 	AscSetBank(iop_base, 1);
8570 	AscWriteChipDvcID(iop_base, org_id);
8571 	AscSetBank(iop_base, 0);
8572 	return (sta);
8573 }
8574 
8575 static void AscSetChipSDTR(PortAddr iop_base, uchar sdtr_data, uchar tid_no)
8576 {
8577 	AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
8578 	AscPutMCodeSDTRDoneAtID(iop_base, tid_no, sdtr_data);
8579 }
8580 
8581 static int AscIsrChipHalted(ASC_DVC_VAR *asc_dvc)
8582 {
8583 	EXT_MSG ext_msg;
8584 	EXT_MSG out_msg;
8585 	ushort halt_q_addr;
8586 	int sdtr_accept;
8587 	ushort int_halt_code;
8588 	ASC_SCSI_BIT_ID_TYPE scsi_busy;
8589 	ASC_SCSI_BIT_ID_TYPE target_id;
8590 	PortAddr iop_base;
8591 	uchar tag_code;
8592 	uchar q_status;
8593 	uchar halt_qp;
8594 	uchar sdtr_data;
8595 	uchar target_ix;
8596 	uchar q_cntl, tid_no;
8597 	uchar cur_dvc_qng;
8598 	uchar asyn_sdtr;
8599 	uchar scsi_status;
8600 	struct asc_board *boardp;
8601 
8602 	BUG_ON(!asc_dvc->drv_ptr);
8603 	boardp = asc_dvc->drv_ptr;
8604 
8605 	iop_base = asc_dvc->iop_base;
8606 	int_halt_code = AscReadLramWord(iop_base, ASCV_HALTCODE_W);
8607 
8608 	halt_qp = AscReadLramByte(iop_base, ASCV_CURCDB_B);
8609 	halt_q_addr = ASC_QNO_TO_QADDR(halt_qp);
8610 	target_ix = AscReadLramByte(iop_base,
8611 				    (ushort)(halt_q_addr +
8612 					     (ushort)ASC_SCSIQ_B_TARGET_IX));
8613 	q_cntl = AscReadLramByte(iop_base,
8614 			    (ushort)(halt_q_addr + (ushort)ASC_SCSIQ_B_CNTL));
8615 	tid_no = ASC_TIX_TO_TID(target_ix);
8616 	target_id = (uchar)ASC_TID_TO_TARGET_ID(tid_no);
8617 	if (asc_dvc->pci_fix_asyn_xfer & target_id) {
8618 		asyn_sdtr = ASYN_SDTR_DATA_FIX_PCI_REV_AB;
8619 	} else {
8620 		asyn_sdtr = 0;
8621 	}
8622 	if (int_halt_code == ASC_HALT_DISABLE_ASYN_USE_SYN_FIX) {
8623 		if (asc_dvc->pci_fix_asyn_xfer & target_id) {
8624 			AscSetChipSDTR(iop_base, 0, tid_no);
8625 			boardp->sdtr_data[tid_no] = 0;
8626 		}
8627 		AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8628 		return (0);
8629 	} else if (int_halt_code == ASC_HALT_ENABLE_ASYN_USE_SYN_FIX) {
8630 		if (asc_dvc->pci_fix_asyn_xfer & target_id) {
8631 			AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
8632 			boardp->sdtr_data[tid_no] = asyn_sdtr;
8633 		}
8634 		AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8635 		return (0);
8636 	} else if (int_halt_code == ASC_HALT_EXTMSG_IN) {
8637 		AscMemWordCopyPtrFromLram(iop_base,
8638 					  ASCV_MSGIN_BEG,
8639 					  (uchar *)&ext_msg,
8640 					  sizeof(EXT_MSG) >> 1);
8641 
8642 		if (ext_msg.msg_type == EXTENDED_MESSAGE &&
8643 		    ext_msg.msg_req == EXTENDED_SDTR &&
8644 		    ext_msg.msg_len == MS_SDTR_LEN) {
8645 			sdtr_accept = TRUE;
8646 			if ((ext_msg.req_ack_offset > ASC_SYN_MAX_OFFSET)) {
8647 
8648 				sdtr_accept = FALSE;
8649 				ext_msg.req_ack_offset = ASC_SYN_MAX_OFFSET;
8650 			}
8651 			if ((ext_msg.xfer_period <
8652 			     asc_dvc->sdtr_period_tbl[asc_dvc->min_sdtr_index])
8653 			    || (ext_msg.xfer_period >
8654 				asc_dvc->sdtr_period_tbl[asc_dvc->
8655 							 max_sdtr_index])) {
8656 				sdtr_accept = FALSE;
8657 				ext_msg.xfer_period =
8658 				    asc_dvc->sdtr_period_tbl[asc_dvc->
8659 							     min_sdtr_index];
8660 			}
8661 			if (sdtr_accept) {
8662 				sdtr_data =
8663 				    AscCalSDTRData(asc_dvc, ext_msg.xfer_period,
8664 						   ext_msg.req_ack_offset);
8665 				if ((sdtr_data == 0xFF)) {
8666 
8667 					q_cntl |= QC_MSG_OUT;
8668 					asc_dvc->init_sdtr &= ~target_id;
8669 					asc_dvc->sdtr_done &= ~target_id;
8670 					AscSetChipSDTR(iop_base, asyn_sdtr,
8671 						       tid_no);
8672 					boardp->sdtr_data[tid_no] = asyn_sdtr;
8673 				}
8674 			}
8675 			if (ext_msg.req_ack_offset == 0) {
8676 
8677 				q_cntl &= ~QC_MSG_OUT;
8678 				asc_dvc->init_sdtr &= ~target_id;
8679 				asc_dvc->sdtr_done &= ~target_id;
8680 				AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
8681 			} else {
8682 				if (sdtr_accept && (q_cntl & QC_MSG_OUT)) {
8683 					q_cntl &= ~QC_MSG_OUT;
8684 					asc_dvc->sdtr_done |= target_id;
8685 					asc_dvc->init_sdtr |= target_id;
8686 					asc_dvc->pci_fix_asyn_xfer &=
8687 					    ~target_id;
8688 					sdtr_data =
8689 					    AscCalSDTRData(asc_dvc,
8690 							   ext_msg.xfer_period,
8691 							   ext_msg.
8692 							   req_ack_offset);
8693 					AscSetChipSDTR(iop_base, sdtr_data,
8694 						       tid_no);
8695 					boardp->sdtr_data[tid_no] = sdtr_data;
8696 				} else {
8697 					q_cntl |= QC_MSG_OUT;
8698 					AscMsgOutSDTR(asc_dvc,
8699 						      ext_msg.xfer_period,
8700 						      ext_msg.req_ack_offset);
8701 					asc_dvc->pci_fix_asyn_xfer &=
8702 					    ~target_id;
8703 					sdtr_data =
8704 					    AscCalSDTRData(asc_dvc,
8705 							   ext_msg.xfer_period,
8706 							   ext_msg.
8707 							   req_ack_offset);
8708 					AscSetChipSDTR(iop_base, sdtr_data,
8709 						       tid_no);
8710 					boardp->sdtr_data[tid_no] = sdtr_data;
8711 					asc_dvc->sdtr_done |= target_id;
8712 					asc_dvc->init_sdtr |= target_id;
8713 				}
8714 			}
8715 
8716 			AscWriteLramByte(iop_base,
8717 					 (ushort)(halt_q_addr +
8718 						  (ushort)ASC_SCSIQ_B_CNTL),
8719 					 q_cntl);
8720 			AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8721 			return (0);
8722 		} else if (ext_msg.msg_type == EXTENDED_MESSAGE &&
8723 			   ext_msg.msg_req == EXTENDED_WDTR &&
8724 			   ext_msg.msg_len == MS_WDTR_LEN) {
8725 
8726 			ext_msg.wdtr_width = 0;
8727 			AscMemWordCopyPtrToLram(iop_base,
8728 						ASCV_MSGOUT_BEG,
8729 						(uchar *)&ext_msg,
8730 						sizeof(EXT_MSG) >> 1);
8731 			q_cntl |= QC_MSG_OUT;
8732 			AscWriteLramByte(iop_base,
8733 					 (ushort)(halt_q_addr +
8734 						  (ushort)ASC_SCSIQ_B_CNTL),
8735 					 q_cntl);
8736 			AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8737 			return (0);
8738 		} else {
8739 
8740 			ext_msg.msg_type = MESSAGE_REJECT;
8741 			AscMemWordCopyPtrToLram(iop_base,
8742 						ASCV_MSGOUT_BEG,
8743 						(uchar *)&ext_msg,
8744 						sizeof(EXT_MSG) >> 1);
8745 			q_cntl |= QC_MSG_OUT;
8746 			AscWriteLramByte(iop_base,
8747 					 (ushort)(halt_q_addr +
8748 						  (ushort)ASC_SCSIQ_B_CNTL),
8749 					 q_cntl);
8750 			AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8751 			return (0);
8752 		}
8753 	} else if (int_halt_code == ASC_HALT_CHK_CONDITION) {
8754 
8755 		q_cntl |= QC_REQ_SENSE;
8756 
8757 		if ((asc_dvc->init_sdtr & target_id) != 0) {
8758 
8759 			asc_dvc->sdtr_done &= ~target_id;
8760 
8761 			sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
8762 			q_cntl |= QC_MSG_OUT;
8763 			AscMsgOutSDTR(asc_dvc,
8764 				      asc_dvc->
8765 				      sdtr_period_tbl[(sdtr_data >> 4) &
8766 						      (uchar)(asc_dvc->
8767 							      max_sdtr_index -
8768 							      1)],
8769 				      (uchar)(sdtr_data & (uchar)
8770 					      ASC_SYN_MAX_OFFSET));
8771 		}
8772 
8773 		AscWriteLramByte(iop_base,
8774 				 (ushort)(halt_q_addr +
8775 					  (ushort)ASC_SCSIQ_B_CNTL), q_cntl);
8776 
8777 		tag_code = AscReadLramByte(iop_base,
8778 					   (ushort)(halt_q_addr + (ushort)
8779 						    ASC_SCSIQ_B_TAG_CODE));
8780 		tag_code &= 0xDC;
8781 		if ((asc_dvc->pci_fix_asyn_xfer & target_id)
8782 		    && !(asc_dvc->pci_fix_asyn_xfer_always & target_id)
8783 		    ) {
8784 
8785 			tag_code |= (ASC_TAG_FLAG_DISABLE_DISCONNECT
8786 				     | ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX);
8787 
8788 		}
8789 		AscWriteLramByte(iop_base,
8790 				 (ushort)(halt_q_addr +
8791 					  (ushort)ASC_SCSIQ_B_TAG_CODE),
8792 				 tag_code);
8793 
8794 		q_status = AscReadLramByte(iop_base,
8795 					   (ushort)(halt_q_addr + (ushort)
8796 						    ASC_SCSIQ_B_STATUS));
8797 		q_status |= (QS_READY | QS_BUSY);
8798 		AscWriteLramByte(iop_base,
8799 				 (ushort)(halt_q_addr +
8800 					  (ushort)ASC_SCSIQ_B_STATUS),
8801 				 q_status);
8802 
8803 		scsi_busy = AscReadLramByte(iop_base, (ushort)ASCV_SCSIBUSY_B);
8804 		scsi_busy &= ~target_id;
8805 		AscWriteLramByte(iop_base, (ushort)ASCV_SCSIBUSY_B, scsi_busy);
8806 
8807 		AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8808 		return (0);
8809 	} else if (int_halt_code == ASC_HALT_SDTR_REJECTED) {
8810 
8811 		AscMemWordCopyPtrFromLram(iop_base,
8812 					  ASCV_MSGOUT_BEG,
8813 					  (uchar *)&out_msg,
8814 					  sizeof(EXT_MSG) >> 1);
8815 
8816 		if ((out_msg.msg_type == EXTENDED_MESSAGE) &&
8817 		    (out_msg.msg_len == MS_SDTR_LEN) &&
8818 		    (out_msg.msg_req == EXTENDED_SDTR)) {
8819 
8820 			asc_dvc->init_sdtr &= ~target_id;
8821 			asc_dvc->sdtr_done &= ~target_id;
8822 			AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
8823 			boardp->sdtr_data[tid_no] = asyn_sdtr;
8824 		}
8825 		q_cntl &= ~QC_MSG_OUT;
8826 		AscWriteLramByte(iop_base,
8827 				 (ushort)(halt_q_addr +
8828 					  (ushort)ASC_SCSIQ_B_CNTL), q_cntl);
8829 		AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8830 		return (0);
8831 	} else if (int_halt_code == ASC_HALT_SS_QUEUE_FULL) {
8832 
8833 		scsi_status = AscReadLramByte(iop_base,
8834 					      (ushort)((ushort)halt_q_addr +
8835 						       (ushort)
8836 						       ASC_SCSIQ_SCSI_STATUS));
8837 		cur_dvc_qng =
8838 		    AscReadLramByte(iop_base,
8839 				    (ushort)((ushort)ASC_QADR_BEG +
8840 					     (ushort)target_ix));
8841 		if ((cur_dvc_qng > 0) && (asc_dvc->cur_dvc_qng[tid_no] > 0)) {
8842 
8843 			scsi_busy = AscReadLramByte(iop_base,
8844 						    (ushort)ASCV_SCSIBUSY_B);
8845 			scsi_busy |= target_id;
8846 			AscWriteLramByte(iop_base,
8847 					 (ushort)ASCV_SCSIBUSY_B, scsi_busy);
8848 			asc_dvc->queue_full_or_busy |= target_id;
8849 
8850 			if (scsi_status == SAM_STAT_TASK_SET_FULL) {
8851 				if (cur_dvc_qng > ASC_MIN_TAGGED_CMD) {
8852 					cur_dvc_qng -= 1;
8853 					asc_dvc->max_dvc_qng[tid_no] =
8854 					    cur_dvc_qng;
8855 
8856 					AscWriteLramByte(iop_base,
8857 							 (ushort)((ushort)
8858 								  ASCV_MAX_DVC_QNG_BEG
8859 								  + (ushort)
8860 								  tid_no),
8861 							 cur_dvc_qng);
8862 
8863 					/*
8864 					 * Set the device queue depth to the
8865 					 * number of active requests when the
8866 					 * QUEUE FULL condition was encountered.
8867 					 */
8868 					boardp->queue_full |= target_id;
8869 					boardp->queue_full_cnt[tid_no] =
8870 					    cur_dvc_qng;
8871 				}
8872 			}
8873 		}
8874 		AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
8875 		return (0);
8876 	}
8877 #if CC_VERY_LONG_SG_LIST
8878 	else if (int_halt_code == ASC_HALT_HOST_COPY_SG_LIST_TO_RISC) {
8879 		uchar q_no;
8880 		ushort q_addr;
8881 		uchar sg_wk_q_no;
8882 		uchar first_sg_wk_q_no;
8883 		ASC_SCSI_Q *scsiq;	/* Ptr to driver request. */
8884 		ASC_SG_HEAD *sg_head;	/* Ptr to driver SG request. */
8885 		ASC_SG_LIST_Q scsi_sg_q;	/* Structure written to queue. */
8886 		ushort sg_list_dwords;
8887 		ushort sg_entry_cnt;
8888 		uchar next_qp;
8889 		int i;
8890 
8891 		q_no = AscReadLramByte(iop_base, (ushort)ASCV_REQ_SG_LIST_QP);
8892 		if (q_no == ASC_QLINK_END)
8893 			return 0;
8894 
8895 		q_addr = ASC_QNO_TO_QADDR(q_no);
8896 
8897 		/*
8898 		 * Convert the request's SRB pointer to a host ASC_SCSI_REQ
8899 		 * structure pointer using a macro provided by the driver.
8900 		 * The ASC_SCSI_REQ pointer provides a pointer to the
8901 		 * host ASC_SG_HEAD structure.
8902 		 */
8903 		/* Read request's SRB pointer. */
8904 		scsiq = (ASC_SCSI_Q *)
8905 		    ASC_SRB2SCSIQ(ASC_U32_TO_VADDR(AscReadLramDWord(iop_base,
8906 								    (ushort)
8907 								    (q_addr +
8908 								     ASC_SCSIQ_D_SRBPTR))));
8909 
8910 		/*
8911 		 * Get request's first and working SG queue.
8912 		 */
8913 		sg_wk_q_no = AscReadLramByte(iop_base,
8914 					     (ushort)(q_addr +
8915 						      ASC_SCSIQ_B_SG_WK_QP));
8916 
8917 		first_sg_wk_q_no = AscReadLramByte(iop_base,
8918 						   (ushort)(q_addr +
8919 							    ASC_SCSIQ_B_FIRST_SG_WK_QP));
8920 
8921 		/*
8922 		 * Reset request's working SG queue back to the
8923 		 * first SG queue.
8924 		 */
8925 		AscWriteLramByte(iop_base,
8926 				 (ushort)(q_addr +
8927 					  (ushort)ASC_SCSIQ_B_SG_WK_QP),
8928 				 first_sg_wk_q_no);
8929 
8930 		sg_head = scsiq->sg_head;
8931 
8932 		/*
8933 		 * Set sg_entry_cnt to the number of SG elements
8934 		 * that will be completed on this interrupt.
8935 		 *
8936 		 * Note: The allocated SG queues contain ASC_MAX_SG_LIST - 1
8937 		 * SG elements. The data_cnt and data_addr fields which
8938 		 * add 1 to the SG element capacity are not used when
8939 		 * restarting SG handling after a halt.
8940 		 */
8941 		if (scsiq->remain_sg_entry_cnt > (ASC_MAX_SG_LIST - 1)) {
8942 			sg_entry_cnt = ASC_MAX_SG_LIST - 1;
8943 
8944 			/*
8945 			 * Keep track of remaining number of SG elements that
8946 			 * will need to be handled on the next interrupt.
8947 			 */
8948 			scsiq->remain_sg_entry_cnt -= (ASC_MAX_SG_LIST - 1);
8949 		} else {
8950 			sg_entry_cnt = scsiq->remain_sg_entry_cnt;
8951 			scsiq->remain_sg_entry_cnt = 0;
8952 		}
8953 
8954 		/*
8955 		 * Copy SG elements into the list of allocated SG queues.
8956 		 *
8957 		 * Last index completed is saved in scsiq->next_sg_index.
8958 		 */
8959 		next_qp = first_sg_wk_q_no;
8960 		q_addr = ASC_QNO_TO_QADDR(next_qp);
8961 		scsi_sg_q.sg_head_qp = q_no;
8962 		scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
8963 		for (i = 0; i < sg_head->queue_cnt; i++) {
8964 			scsi_sg_q.seq_no = i + 1;
8965 			if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
8966 				sg_list_dwords = (uchar)(ASC_SG_LIST_PER_Q * 2);
8967 				sg_entry_cnt -= ASC_SG_LIST_PER_Q;
8968 				/*
8969 				 * After very first SG queue RISC FW uses next
8970 				 * SG queue first element then checks sg_list_cnt
8971 				 * against zero and then decrements, so set
8972 				 * sg_list_cnt 1 less than number of SG elements
8973 				 * in each SG queue.
8974 				 */
8975 				scsi_sg_q.sg_list_cnt = ASC_SG_LIST_PER_Q - 1;
8976 				scsi_sg_q.sg_cur_list_cnt =
8977 				    ASC_SG_LIST_PER_Q - 1;
8978 			} else {
8979 				/*
8980 				 * This is the last SG queue in the list of
8981 				 * allocated SG queues. If there are more
8982 				 * SG elements than will fit in the allocated
8983 				 * queues, then set the QCSG_SG_XFER_MORE flag.
8984 				 */
8985 				if (scsiq->remain_sg_entry_cnt != 0) {
8986 					scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
8987 				} else {
8988 					scsi_sg_q.cntl |= QCSG_SG_XFER_END;
8989 				}
8990 				/* equals sg_entry_cnt * 2 */
8991 				sg_list_dwords = sg_entry_cnt << 1;
8992 				scsi_sg_q.sg_list_cnt = sg_entry_cnt - 1;
8993 				scsi_sg_q.sg_cur_list_cnt = sg_entry_cnt - 1;
8994 				sg_entry_cnt = 0;
8995 			}
8996 
8997 			scsi_sg_q.q_no = next_qp;
8998 			AscMemWordCopyPtrToLram(iop_base,
8999 						q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
9000 						(uchar *)&scsi_sg_q,
9001 						sizeof(ASC_SG_LIST_Q) >> 1);
9002 
9003 			AscMemDWordCopyPtrToLram(iop_base,
9004 						 q_addr + ASC_SGQ_LIST_BEG,
9005 						 (uchar *)&sg_head->
9006 						 sg_list[scsiq->next_sg_index],
9007 						 sg_list_dwords);
9008 
9009 			scsiq->next_sg_index += ASC_SG_LIST_PER_Q;
9010 
9011 			/*
9012 			 * If the just completed SG queue contained the
9013 			 * last SG element, then no more SG queues need
9014 			 * to be written.
9015 			 */
9016 			if (scsi_sg_q.cntl & QCSG_SG_XFER_END) {
9017 				break;
9018 			}
9019 
9020 			next_qp = AscReadLramByte(iop_base,
9021 						  (ushort)(q_addr +
9022 							   ASC_SCSIQ_B_FWD));
9023 			q_addr = ASC_QNO_TO_QADDR(next_qp);
9024 		}
9025 
9026 		/*
9027 		 * Clear the halt condition so the RISC will be restarted
9028 		 * after the return.
9029 		 */
9030 		AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
9031 		return (0);
9032 	}
9033 #endif /* CC_VERY_LONG_SG_LIST */
9034 	return (0);
9035 }
9036 
9037 /*
9038  * void
9039  * DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
9040  *
9041  * Calling/Exit State:
9042  *    none
9043  *
9044  * Description:
9045  *     Input an ASC_QDONE_INFO structure from the chip
9046  */
9047 static void
9048 DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
9049 {
9050 	int i;
9051 	ushort word;
9052 
9053 	AscSetChipLramAddr(iop_base, s_addr);
9054 	for (i = 0; i < 2 * words; i += 2) {
9055 		if (i == 10) {
9056 			continue;
9057 		}
9058 		word = inpw(iop_base + IOP_RAM_DATA);
9059 		inbuf[i] = word & 0xff;
9060 		inbuf[i + 1] = (word >> 8) & 0xff;
9061 	}
9062 	ASC_DBG_PRT_HEX(2, "DvcGetQinfo", inbuf, 2 * words);
9063 }
9064 
9065 static uchar
9066 _AscCopyLramScsiDoneQ(PortAddr iop_base,
9067 		      ushort q_addr,
9068 		      ASC_QDONE_INFO *scsiq, ASC_DCNT max_dma_count)
9069 {
9070 	ushort _val;
9071 	uchar sg_queue_cnt;
9072 
9073 	DvcGetQinfo(iop_base,
9074 		    q_addr + ASC_SCSIQ_DONE_INFO_BEG,
9075 		    (uchar *)scsiq,
9076 		    (sizeof(ASC_SCSIQ_2) + sizeof(ASC_SCSIQ_3)) / 2);
9077 
9078 	_val = AscReadLramWord(iop_base,
9079 			       (ushort)(q_addr + (ushort)ASC_SCSIQ_B_STATUS));
9080 	scsiq->q_status = (uchar)_val;
9081 	scsiq->q_no = (uchar)(_val >> 8);
9082 	_val = AscReadLramWord(iop_base,
9083 			       (ushort)(q_addr + (ushort)ASC_SCSIQ_B_CNTL));
9084 	scsiq->cntl = (uchar)_val;
9085 	sg_queue_cnt = (uchar)(_val >> 8);
9086 	_val = AscReadLramWord(iop_base,
9087 			       (ushort)(q_addr +
9088 					(ushort)ASC_SCSIQ_B_SENSE_LEN));
9089 	scsiq->sense_len = (uchar)_val;
9090 	scsiq->extra_bytes = (uchar)(_val >> 8);
9091 
9092 	/*
9093 	 * Read high word of remain bytes from alternate location.
9094 	 */
9095 	scsiq->remain_bytes = (((ADV_DCNT)AscReadLramWord(iop_base,
9096 							  (ushort)(q_addr +
9097 								   (ushort)
9098 								   ASC_SCSIQ_W_ALT_DC1)))
9099 			       << 16);
9100 	/*
9101 	 * Read low word of remain bytes from original location.
9102 	 */
9103 	scsiq->remain_bytes += AscReadLramWord(iop_base,
9104 					       (ushort)(q_addr + (ushort)
9105 							ASC_SCSIQ_DW_REMAIN_XFER_CNT));
9106 
9107 	scsiq->remain_bytes &= max_dma_count;
9108 	return sg_queue_cnt;
9109 }
9110 
9111 /*
9112  * asc_isr_callback() - Second Level Interrupt Handler called by AscISR().
9113  *
9114  * Interrupt callback function for the Narrow SCSI Asc Library.
9115  */
9116 static void asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
9117 {
9118 	struct asc_board *boardp;
9119 	struct scsi_cmnd *scp;
9120 	struct Scsi_Host *shost;
9121 
9122 	ASC_DBG(1, "asc_dvc_varp 0x%p, qdonep 0x%p\n", asc_dvc_varp, qdonep);
9123 	ASC_DBG_PRT_ASC_QDONE_INFO(2, qdonep);
9124 
9125 	scp = advansys_srb_to_ptr(asc_dvc_varp, qdonep->d2.srb_ptr);
9126 	if (!scp)
9127 		return;
9128 
9129 	ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
9130 
9131 	shost = scp->device->host;
9132 	ASC_STATS(shost, callback);
9133 	ASC_DBG(1, "shost 0x%p\n", shost);
9134 
9135 	boardp = shost_priv(shost);
9136 	BUG_ON(asc_dvc_varp != &boardp->dvc_var.asc_dvc_var);
9137 
9138 	dma_unmap_single(boardp->dev, scp->SCp.dma_handle,
9139 			 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
9140 	/*
9141 	 * 'qdonep' contains the command's ending status.
9142 	 */
9143 	switch (qdonep->d3.done_stat) {
9144 	case QD_NO_ERROR:
9145 		ASC_DBG(2, "QD_NO_ERROR\n");
9146 		scp->result = 0;
9147 
9148 		/*
9149 		 * Check for an underrun condition.
9150 		 *
9151 		 * If there was no error and an underrun condition, then
9152 		 * return the number of underrun bytes.
9153 		 */
9154 		if (scsi_bufflen(scp) != 0 && qdonep->remain_bytes != 0 &&
9155 		    qdonep->remain_bytes <= scsi_bufflen(scp)) {
9156 			ASC_DBG(1, "underrun condition %u bytes\n",
9157 				 (unsigned)qdonep->remain_bytes);
9158 			scsi_set_resid(scp, qdonep->remain_bytes);
9159 		}
9160 		break;
9161 
9162 	case QD_WITH_ERROR:
9163 		ASC_DBG(2, "QD_WITH_ERROR\n");
9164 		switch (qdonep->d3.host_stat) {
9165 		case QHSTA_NO_ERROR:
9166 			if (qdonep->d3.scsi_stat == SAM_STAT_CHECK_CONDITION) {
9167 				ASC_DBG(2, "SAM_STAT_CHECK_CONDITION\n");
9168 				ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
9169 						  SCSI_SENSE_BUFFERSIZE);
9170 				/*
9171 				 * Note: The 'status_byte()' macro used by
9172 				 * target drivers defined in scsi.h shifts the
9173 				 * status byte returned by host drivers right
9174 				 * by 1 bit.  This is why target drivers also
9175 				 * use right shifted status byte definitions.
9176 				 * For instance target drivers use
9177 				 * CHECK_CONDITION, defined to 0x1, instead of
9178 				 * the SCSI defined check condition value of
9179 				 * 0x2. Host drivers are supposed to return
9180 				 * the status byte as it is defined by SCSI.
9181 				 */
9182 				scp->result = DRIVER_BYTE(DRIVER_SENSE) |
9183 				    STATUS_BYTE(qdonep->d3.scsi_stat);
9184 			} else {
9185 				scp->result = STATUS_BYTE(qdonep->d3.scsi_stat);
9186 			}
9187 			break;
9188 
9189 		default:
9190 			/* QHSTA error occurred */
9191 			ASC_DBG(1, "host_stat 0x%x\n", qdonep->d3.host_stat);
9192 			scp->result = HOST_BYTE(DID_BAD_TARGET);
9193 			break;
9194 		}
9195 		break;
9196 
9197 	case QD_ABORTED_BY_HOST:
9198 		ASC_DBG(1, "QD_ABORTED_BY_HOST\n");
9199 		scp->result =
9200 		    HOST_BYTE(DID_ABORT) | MSG_BYTE(qdonep->d3.
9201 						    scsi_msg) |
9202 		    STATUS_BYTE(qdonep->d3.scsi_stat);
9203 		break;
9204 
9205 	default:
9206 		ASC_DBG(1, "done_stat 0x%x\n", qdonep->d3.done_stat);
9207 		scp->result =
9208 		    HOST_BYTE(DID_ERROR) | MSG_BYTE(qdonep->d3.
9209 						    scsi_msg) |
9210 		    STATUS_BYTE(qdonep->d3.scsi_stat);
9211 		break;
9212 	}
9213 
9214 	/*
9215 	 * If the 'init_tidmask' bit isn't already set for the target and the
9216 	 * current request finished normally, then set the bit for the target
9217 	 * to indicate that a device is present.
9218 	 */
9219 	if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
9220 	    qdonep->d3.done_stat == QD_NO_ERROR &&
9221 	    qdonep->d3.host_stat == QHSTA_NO_ERROR) {
9222 		boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
9223 	}
9224 
9225 	asc_scsi_done(scp);
9226 }
9227 
9228 static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
9229 {
9230 	uchar next_qp;
9231 	uchar n_q_used;
9232 	uchar sg_list_qp;
9233 	uchar sg_queue_cnt;
9234 	uchar q_cnt;
9235 	uchar done_q_tail;
9236 	uchar tid_no;
9237 	ASC_SCSI_BIT_ID_TYPE scsi_busy;
9238 	ASC_SCSI_BIT_ID_TYPE target_id;
9239 	PortAddr iop_base;
9240 	ushort q_addr;
9241 	ushort sg_q_addr;
9242 	uchar cur_target_qng;
9243 	ASC_QDONE_INFO scsiq_buf;
9244 	ASC_QDONE_INFO *scsiq;
9245 	int false_overrun;
9246 
9247 	iop_base = asc_dvc->iop_base;
9248 	n_q_used = 1;
9249 	scsiq = (ASC_QDONE_INFO *)&scsiq_buf;
9250 	done_q_tail = (uchar)AscGetVarDoneQTail(iop_base);
9251 	q_addr = ASC_QNO_TO_QADDR(done_q_tail);
9252 	next_qp = AscReadLramByte(iop_base,
9253 				  (ushort)(q_addr + (ushort)ASC_SCSIQ_B_FWD));
9254 	if (next_qp != ASC_QLINK_END) {
9255 		AscPutVarDoneQTail(iop_base, next_qp);
9256 		q_addr = ASC_QNO_TO_QADDR(next_qp);
9257 		sg_queue_cnt = _AscCopyLramScsiDoneQ(iop_base, q_addr, scsiq,
9258 						     asc_dvc->max_dma_count);
9259 		AscWriteLramByte(iop_base,
9260 				 (ushort)(q_addr +
9261 					  (ushort)ASC_SCSIQ_B_STATUS),
9262 				 (uchar)(scsiq->
9263 					 q_status & (uchar)~(QS_READY |
9264 							     QS_ABORTED)));
9265 		tid_no = ASC_TIX_TO_TID(scsiq->d2.target_ix);
9266 		target_id = ASC_TIX_TO_TARGET_ID(scsiq->d2.target_ix);
9267 		if ((scsiq->cntl & QC_SG_HEAD) != 0) {
9268 			sg_q_addr = q_addr;
9269 			sg_list_qp = next_qp;
9270 			for (q_cnt = 0; q_cnt < sg_queue_cnt; q_cnt++) {
9271 				sg_list_qp = AscReadLramByte(iop_base,
9272 							     (ushort)(sg_q_addr
9273 								      + (ushort)
9274 								      ASC_SCSIQ_B_FWD));
9275 				sg_q_addr = ASC_QNO_TO_QADDR(sg_list_qp);
9276 				if (sg_list_qp == ASC_QLINK_END) {
9277 					AscSetLibErrorCode(asc_dvc,
9278 							   ASCQ_ERR_SG_Q_LINKS);
9279 					scsiq->d3.done_stat = QD_WITH_ERROR;
9280 					scsiq->d3.host_stat =
9281 					    QHSTA_D_QDONE_SG_LIST_CORRUPTED;
9282 					goto FATAL_ERR_QDONE;
9283 				}
9284 				AscWriteLramByte(iop_base,
9285 						 (ushort)(sg_q_addr + (ushort)
9286 							  ASC_SCSIQ_B_STATUS),
9287 						 QS_FREE);
9288 			}
9289 			n_q_used = sg_queue_cnt + 1;
9290 			AscPutVarDoneQTail(iop_base, sg_list_qp);
9291 		}
9292 		if (asc_dvc->queue_full_or_busy & target_id) {
9293 			cur_target_qng = AscReadLramByte(iop_base,
9294 							 (ushort)((ushort)
9295 								  ASC_QADR_BEG
9296 								  + (ushort)
9297 								  scsiq->d2.
9298 								  target_ix));
9299 			if (cur_target_qng < asc_dvc->max_dvc_qng[tid_no]) {
9300 				scsi_busy = AscReadLramByte(iop_base, (ushort)
9301 							    ASCV_SCSIBUSY_B);
9302 				scsi_busy &= ~target_id;
9303 				AscWriteLramByte(iop_base,
9304 						 (ushort)ASCV_SCSIBUSY_B,
9305 						 scsi_busy);
9306 				asc_dvc->queue_full_or_busy &= ~target_id;
9307 			}
9308 		}
9309 		if (asc_dvc->cur_total_qng >= n_q_used) {
9310 			asc_dvc->cur_total_qng -= n_q_used;
9311 			if (asc_dvc->cur_dvc_qng[tid_no] != 0) {
9312 				asc_dvc->cur_dvc_qng[tid_no]--;
9313 			}
9314 		} else {
9315 			AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CUR_QNG);
9316 			scsiq->d3.done_stat = QD_WITH_ERROR;
9317 			goto FATAL_ERR_QDONE;
9318 		}
9319 		if ((scsiq->d2.srb_ptr == 0UL) ||
9320 		    ((scsiq->q_status & QS_ABORTED) != 0)) {
9321 			return (0x11);
9322 		} else if (scsiq->q_status == QS_DONE) {
9323 			false_overrun = FALSE;
9324 			if (scsiq->extra_bytes != 0) {
9325 				scsiq->remain_bytes +=
9326 				    (ADV_DCNT)scsiq->extra_bytes;
9327 			}
9328 			if (scsiq->d3.done_stat == QD_WITH_ERROR) {
9329 				if (scsiq->d3.host_stat ==
9330 				    QHSTA_M_DATA_OVER_RUN) {
9331 					if ((scsiq->
9332 					     cntl & (QC_DATA_IN | QC_DATA_OUT))
9333 					    == 0) {
9334 						scsiq->d3.done_stat =
9335 						    QD_NO_ERROR;
9336 						scsiq->d3.host_stat =
9337 						    QHSTA_NO_ERROR;
9338 					} else if (false_overrun) {
9339 						scsiq->d3.done_stat =
9340 						    QD_NO_ERROR;
9341 						scsiq->d3.host_stat =
9342 						    QHSTA_NO_ERROR;
9343 					}
9344 				} else if (scsiq->d3.host_stat ==
9345 					   QHSTA_M_HUNG_REQ_SCSI_BUS_RESET) {
9346 					AscStopChip(iop_base);
9347 					AscSetChipControl(iop_base,
9348 							  (uchar)(CC_SCSI_RESET
9349 								  | CC_HALT));
9350 					udelay(60);
9351 					AscSetChipControl(iop_base, CC_HALT);
9352 					AscSetChipStatus(iop_base,
9353 							 CIW_CLR_SCSI_RESET_INT);
9354 					AscSetChipStatus(iop_base, 0);
9355 					AscSetChipControl(iop_base, 0);
9356 				}
9357 			}
9358 			if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
9359 				asc_isr_callback(asc_dvc, scsiq);
9360 			} else {
9361 				if ((AscReadLramByte(iop_base,
9362 						     (ushort)(q_addr + (ushort)
9363 							      ASC_SCSIQ_CDB_BEG))
9364 				     == START_STOP)) {
9365 					asc_dvc->unit_not_ready &= ~target_id;
9366 					if (scsiq->d3.done_stat != QD_NO_ERROR) {
9367 						asc_dvc->start_motor &=
9368 						    ~target_id;
9369 					}
9370 				}
9371 			}
9372 			return (1);
9373 		} else {
9374 			AscSetLibErrorCode(asc_dvc, ASCQ_ERR_Q_STATUS);
9375  FATAL_ERR_QDONE:
9376 			if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
9377 				asc_isr_callback(asc_dvc, scsiq);
9378 			}
9379 			return (0x80);
9380 		}
9381 	}
9382 	return (0);
9383 }
9384 
9385 static int AscISR(ASC_DVC_VAR *asc_dvc)
9386 {
9387 	ASC_CS_TYPE chipstat;
9388 	PortAddr iop_base;
9389 	ushort saved_ram_addr;
9390 	uchar ctrl_reg;
9391 	uchar saved_ctrl_reg;
9392 	int int_pending;
9393 	int status;
9394 	uchar host_flag;
9395 
9396 	iop_base = asc_dvc->iop_base;
9397 	int_pending = FALSE;
9398 
9399 	if (AscIsIntPending(iop_base) == 0)
9400 		return int_pending;
9401 
9402 	if ((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0) {
9403 		return ERR;
9404 	}
9405 	if (asc_dvc->in_critical_cnt != 0) {
9406 		AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_ON_CRITICAL);
9407 		return ERR;
9408 	}
9409 	if (asc_dvc->is_in_int) {
9410 		AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_RE_ENTRY);
9411 		return ERR;
9412 	}
9413 	asc_dvc->is_in_int = TRUE;
9414 	ctrl_reg = AscGetChipControl(iop_base);
9415 	saved_ctrl_reg = ctrl_reg & (~(CC_SCSI_RESET | CC_CHIP_RESET |
9416 				       CC_SINGLE_STEP | CC_DIAG | CC_TEST));
9417 	chipstat = AscGetChipStatus(iop_base);
9418 	if (chipstat & CSW_SCSI_RESET_LATCH) {
9419 		if (!(asc_dvc->bus_type & (ASC_IS_VL | ASC_IS_EISA))) {
9420 			int i = 10;
9421 			int_pending = TRUE;
9422 			asc_dvc->sdtr_done = 0;
9423 			saved_ctrl_reg &= (uchar)(~CC_HALT);
9424 			while ((AscGetChipStatus(iop_base) &
9425 				CSW_SCSI_RESET_ACTIVE) && (i-- > 0)) {
9426 				mdelay(100);
9427 			}
9428 			AscSetChipControl(iop_base, (CC_CHIP_RESET | CC_HALT));
9429 			AscSetChipControl(iop_base, CC_HALT);
9430 			AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
9431 			AscSetChipStatus(iop_base, 0);
9432 			chipstat = AscGetChipStatus(iop_base);
9433 		}
9434 	}
9435 	saved_ram_addr = AscGetChipLramAddr(iop_base);
9436 	host_flag = AscReadLramByte(iop_base,
9437 				    ASCV_HOST_FLAG_B) &
9438 	    (uchar)(~ASC_HOST_FLAG_IN_ISR);
9439 	AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
9440 			 (uchar)(host_flag | (uchar)ASC_HOST_FLAG_IN_ISR));
9441 	if ((chipstat & CSW_INT_PENDING) || (int_pending)) {
9442 		AscAckInterrupt(iop_base);
9443 		int_pending = TRUE;
9444 		if ((chipstat & CSW_HALTED) && (ctrl_reg & CC_SINGLE_STEP)) {
9445 			if (AscIsrChipHalted(asc_dvc) == ERR) {
9446 				goto ISR_REPORT_QDONE_FATAL_ERROR;
9447 			} else {
9448 				saved_ctrl_reg &= (uchar)(~CC_HALT);
9449 			}
9450 		} else {
9451  ISR_REPORT_QDONE_FATAL_ERROR:
9452 			if ((asc_dvc->dvc_cntl & ASC_CNTL_INT_MULTI_Q) != 0) {
9453 				while (((status =
9454 					 AscIsrQDone(asc_dvc)) & 0x01) != 0) {
9455 				}
9456 			} else {
9457 				do {
9458 					if ((status =
9459 					     AscIsrQDone(asc_dvc)) == 1) {
9460 						break;
9461 					}
9462 				} while (status == 0x11);
9463 			}
9464 			if ((status & 0x80) != 0)
9465 				int_pending = ERR;
9466 		}
9467 	}
9468 	AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
9469 	AscSetChipLramAddr(iop_base, saved_ram_addr);
9470 	AscSetChipControl(iop_base, saved_ctrl_reg);
9471 	asc_dvc->is_in_int = FALSE;
9472 	return int_pending;
9473 }
9474 
9475 /*
9476  * advansys_reset()
9477  *
9478  * Reset the bus associated with the command 'scp'.
9479  *
9480  * This function runs its own thread. Interrupts must be blocked but
9481  * sleeping is allowed and no locking other than for host structures is
9482  * required. Returns SUCCESS or FAILED.
9483  */
9484 static int advansys_reset(struct scsi_cmnd *scp)
9485 {
9486 	struct Scsi_Host *shost = scp->device->host;
9487 	struct asc_board *boardp = shost_priv(shost);
9488 	unsigned long flags;
9489 	int status;
9490 	int ret = SUCCESS;
9491 
9492 	ASC_DBG(1, "0x%p\n", scp);
9493 
9494 	ASC_STATS(shost, reset);
9495 
9496 	scmd_printk(KERN_INFO, scp, "SCSI bus reset started...\n");
9497 
9498 	if (ASC_NARROW_BOARD(boardp)) {
9499 		ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var;
9500 
9501 		/* Reset the chip and SCSI bus. */
9502 		ASC_DBG(1, "before AscInitAsc1000Driver()\n");
9503 		status = AscInitAsc1000Driver(asc_dvc);
9504 
9505 		/* Refer to ASC_IERR_* defintions for meaning of 'err_code'. */
9506 		if (asc_dvc->err_code) {
9507 			scmd_printk(KERN_INFO, scp, "SCSI bus reset error: "
9508 				    "0x%x\n", asc_dvc->err_code);
9509 			ret = FAILED;
9510 		} else if (status) {
9511 			scmd_printk(KERN_INFO, scp, "SCSI bus reset warning: "
9512 				    "0x%x\n", status);
9513 		} else {
9514 			scmd_printk(KERN_INFO, scp, "SCSI bus reset "
9515 				    "successful\n");
9516 		}
9517 
9518 		ASC_DBG(1, "after AscInitAsc1000Driver()\n");
9519 		spin_lock_irqsave(shost->host_lock, flags);
9520 	} else {
9521 		/*
9522 		 * If the suggest reset bus flags are set, then reset the bus.
9523 		 * Otherwise only reset the device.
9524 		 */
9525 		ADV_DVC_VAR *adv_dvc = &boardp->dvc_var.adv_dvc_var;
9526 
9527 		/*
9528 		 * Reset the target's SCSI bus.
9529 		 */
9530 		ASC_DBG(1, "before AdvResetChipAndSB()\n");
9531 		switch (AdvResetChipAndSB(adv_dvc)) {
9532 		case ASC_TRUE:
9533 			scmd_printk(KERN_INFO, scp, "SCSI bus reset "
9534 				    "successful\n");
9535 			break;
9536 		case ASC_FALSE:
9537 		default:
9538 			scmd_printk(KERN_INFO, scp, "SCSI bus reset error\n");
9539 			ret = FAILED;
9540 			break;
9541 		}
9542 		spin_lock_irqsave(shost->host_lock, flags);
9543 		AdvISR(adv_dvc);
9544 	}
9545 
9546 	/* Save the time of the most recently completed reset. */
9547 	boardp->last_reset = jiffies;
9548 	spin_unlock_irqrestore(shost->host_lock, flags);
9549 
9550 	ASC_DBG(1, "ret %d\n", ret);
9551 
9552 	return ret;
9553 }
9554 
9555 /*
9556  * advansys_biosparam()
9557  *
9558  * Translate disk drive geometry if the "BIOS greater than 1 GB"
9559  * support is enabled for a drive.
9560  *
9561  * ip (information pointer) is an int array with the following definition:
9562  * ip[0]: heads
9563  * ip[1]: sectors
9564  * ip[2]: cylinders
9565  */
9566 static int
9567 advansys_biosparam(struct scsi_device *sdev, struct block_device *bdev,
9568 		   sector_t capacity, int ip[])
9569 {
9570 	struct asc_board *boardp = shost_priv(sdev->host);
9571 
9572 	ASC_DBG(1, "begin\n");
9573 	ASC_STATS(sdev->host, biosparam);
9574 	if (ASC_NARROW_BOARD(boardp)) {
9575 		if ((boardp->dvc_var.asc_dvc_var.dvc_cntl &
9576 		     ASC_CNTL_BIOS_GT_1GB) && capacity > 0x200000) {
9577 			ip[0] = 255;
9578 			ip[1] = 63;
9579 		} else {
9580 			ip[0] = 64;
9581 			ip[1] = 32;
9582 		}
9583 	} else {
9584 		if ((boardp->dvc_var.adv_dvc_var.bios_ctrl &
9585 		     BIOS_CTRL_EXTENDED_XLAT) && capacity > 0x200000) {
9586 			ip[0] = 255;
9587 			ip[1] = 63;
9588 		} else {
9589 			ip[0] = 64;
9590 			ip[1] = 32;
9591 		}
9592 	}
9593 	ip[2] = (unsigned long)capacity / (ip[0] * ip[1]);
9594 	ASC_DBG(1, "end\n");
9595 	return 0;
9596 }
9597 
9598 /*
9599  * First-level interrupt handler.
9600  *
9601  * 'dev_id' is a pointer to the interrupting adapter's Scsi_Host.
9602  */
9603 static irqreturn_t advansys_interrupt(int irq, void *dev_id)
9604 {
9605 	struct Scsi_Host *shost = dev_id;
9606 	struct asc_board *boardp = shost_priv(shost);
9607 	irqreturn_t result = IRQ_NONE;
9608 
9609 	ASC_DBG(2, "boardp 0x%p\n", boardp);
9610 	spin_lock(shost->host_lock);
9611 	if (ASC_NARROW_BOARD(boardp)) {
9612 		if (AscIsIntPending(shost->io_port)) {
9613 			result = IRQ_HANDLED;
9614 			ASC_STATS(shost, interrupt);
9615 			ASC_DBG(1, "before AscISR()\n");
9616 			AscISR(&boardp->dvc_var.asc_dvc_var);
9617 		}
9618 	} else {
9619 		ASC_DBG(1, "before AdvISR()\n");
9620 		if (AdvISR(&boardp->dvc_var.adv_dvc_var)) {
9621 			result = IRQ_HANDLED;
9622 			ASC_STATS(shost, interrupt);
9623 		}
9624 	}
9625 	spin_unlock(shost->host_lock);
9626 
9627 	ASC_DBG(1, "end\n");
9628 	return result;
9629 }
9630 
9631 static int AscHostReqRiscHalt(PortAddr iop_base)
9632 {
9633 	int count = 0;
9634 	int sta = 0;
9635 	uchar saved_stop_code;
9636 
9637 	if (AscIsChipHalted(iop_base))
9638 		return (1);
9639 	saved_stop_code = AscReadLramByte(iop_base, ASCV_STOP_CODE_B);
9640 	AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
9641 			 ASC_STOP_HOST_REQ_RISC_HALT | ASC_STOP_REQ_RISC_STOP);
9642 	do {
9643 		if (AscIsChipHalted(iop_base)) {
9644 			sta = 1;
9645 			break;
9646 		}
9647 		mdelay(100);
9648 	} while (count++ < 20);
9649 	AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, saved_stop_code);
9650 	return (sta);
9651 }
9652 
9653 static int
9654 AscSetRunChipSynRegAtID(PortAddr iop_base, uchar tid_no, uchar sdtr_data)
9655 {
9656 	int sta = FALSE;
9657 
9658 	if (AscHostReqRiscHalt(iop_base)) {
9659 		sta = AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
9660 		AscStartChip(iop_base);
9661 	}
9662 	return sta;
9663 }
9664 
9665 static void AscAsyncFix(ASC_DVC_VAR *asc_dvc, struct scsi_device *sdev)
9666 {
9667 	char type = sdev->type;
9668 	ASC_SCSI_BIT_ID_TYPE tid_bits = 1 << sdev->id;
9669 
9670 	if (!(asc_dvc->bug_fix_cntl & ASC_BUG_FIX_ASYN_USE_SYN))
9671 		return;
9672 	if (asc_dvc->init_sdtr & tid_bits)
9673 		return;
9674 
9675 	if ((type == TYPE_ROM) && (strncmp(sdev->vendor, "HP ", 3) == 0))
9676 		asc_dvc->pci_fix_asyn_xfer_always |= tid_bits;
9677 
9678 	asc_dvc->pci_fix_asyn_xfer |= tid_bits;
9679 	if ((type == TYPE_PROCESSOR) || (type == TYPE_SCANNER) ||
9680 	    (type == TYPE_ROM) || (type == TYPE_TAPE))
9681 		asc_dvc->pci_fix_asyn_xfer &= ~tid_bits;
9682 
9683 	if (asc_dvc->pci_fix_asyn_xfer & tid_bits)
9684 		AscSetRunChipSynRegAtID(asc_dvc->iop_base, sdev->id,
9685 					ASYN_SDTR_DATA_FIX_PCI_REV_AB);
9686 }
9687 
9688 static void
9689 advansys_narrow_slave_configure(struct scsi_device *sdev, ASC_DVC_VAR *asc_dvc)
9690 {
9691 	ASC_SCSI_BIT_ID_TYPE tid_bit = 1 << sdev->id;
9692 	ASC_SCSI_BIT_ID_TYPE orig_use_tagged_qng = asc_dvc->use_tagged_qng;
9693 
9694 	if (sdev->lun == 0) {
9695 		ASC_SCSI_BIT_ID_TYPE orig_init_sdtr = asc_dvc->init_sdtr;
9696 		if ((asc_dvc->cfg->sdtr_enable & tid_bit) && sdev->sdtr) {
9697 			asc_dvc->init_sdtr |= tid_bit;
9698 		} else {
9699 			asc_dvc->init_sdtr &= ~tid_bit;
9700 		}
9701 
9702 		if (orig_init_sdtr != asc_dvc->init_sdtr)
9703 			AscAsyncFix(asc_dvc, sdev);
9704 	}
9705 
9706 	if (sdev->tagged_supported) {
9707 		if (asc_dvc->cfg->cmd_qng_enabled & tid_bit) {
9708 			if (sdev->lun == 0) {
9709 				asc_dvc->cfg->can_tagged_qng |= tid_bit;
9710 				asc_dvc->use_tagged_qng |= tid_bit;
9711 			}
9712 			scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG,
9713 						asc_dvc->max_dvc_qng[sdev->id]);
9714 		}
9715 	} else {
9716 		if (sdev->lun == 0) {
9717 			asc_dvc->cfg->can_tagged_qng &= ~tid_bit;
9718 			asc_dvc->use_tagged_qng &= ~tid_bit;
9719 		}
9720 		scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
9721 	}
9722 
9723 	if ((sdev->lun == 0) &&
9724 	    (orig_use_tagged_qng != asc_dvc->use_tagged_qng)) {
9725 		AscWriteLramByte(asc_dvc->iop_base, ASCV_DISC_ENABLE_B,
9726 				 asc_dvc->cfg->disc_enable);
9727 		AscWriteLramByte(asc_dvc->iop_base, ASCV_USE_TAGGED_QNG_B,
9728 				 asc_dvc->use_tagged_qng);
9729 		AscWriteLramByte(asc_dvc->iop_base, ASCV_CAN_TAGGED_QNG_B,
9730 				 asc_dvc->cfg->can_tagged_qng);
9731 
9732 		asc_dvc->max_dvc_qng[sdev->id] =
9733 					asc_dvc->cfg->max_tag_qng[sdev->id];
9734 		AscWriteLramByte(asc_dvc->iop_base,
9735 				 (ushort)(ASCV_MAX_DVC_QNG_BEG + sdev->id),
9736 				 asc_dvc->max_dvc_qng[sdev->id]);
9737 	}
9738 }
9739 
9740 /*
9741  * Wide Transfers
9742  *
9743  * If the EEPROM enabled WDTR for the device and the device supports wide
9744  * bus (16 bit) transfers, then turn on the device's 'wdtr_able' bit and
9745  * write the new value to the microcode.
9746  */
9747 static void
9748 advansys_wide_enable_wdtr(AdvPortAddr iop_base, unsigned short tidmask)
9749 {
9750 	unsigned short cfg_word;
9751 	AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
9752 	if ((cfg_word & tidmask) != 0)
9753 		return;
9754 
9755 	cfg_word |= tidmask;
9756 	AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
9757 
9758 	/*
9759 	 * Clear the microcode SDTR and WDTR negotiation done indicators for
9760 	 * the target to cause it to negotiate with the new setting set above.
9761 	 * WDTR when accepted causes the target to enter asynchronous mode, so
9762 	 * SDTR must be negotiated.
9763 	 */
9764 	AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
9765 	cfg_word &= ~tidmask;
9766 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
9767 	AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
9768 	cfg_word &= ~tidmask;
9769 	AdvWriteWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
9770 }
9771 
9772 /*
9773  * Synchronous Transfers
9774  *
9775  * If the EEPROM enabled SDTR for the device and the device
9776  * supports synchronous transfers, then turn on the device's
9777  * 'sdtr_able' bit. Write the new value to the microcode.
9778  */
9779 static void
9780 advansys_wide_enable_sdtr(AdvPortAddr iop_base, unsigned short tidmask)
9781 {
9782 	unsigned short cfg_word;
9783 	AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
9784 	if ((cfg_word & tidmask) != 0)
9785 		return;
9786 
9787 	cfg_word |= tidmask;
9788 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
9789 
9790 	/*
9791 	 * Clear the microcode "SDTR negotiation" done indicator for the
9792 	 * target to cause it to negotiate with the new setting set above.
9793 	 */
9794 	AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
9795 	cfg_word &= ~tidmask;
9796 	AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
9797 }
9798 
9799 /*
9800  * PPR (Parallel Protocol Request) Capable
9801  *
9802  * If the device supports DT mode, then it must be PPR capable.
9803  * The PPR message will be used in place of the SDTR and WDTR
9804  * messages to negotiate synchronous speed and offset, transfer
9805  * width, and protocol options.
9806  */
9807 static void advansys_wide_enable_ppr(ADV_DVC_VAR *adv_dvc,
9808 				AdvPortAddr iop_base, unsigned short tidmask)
9809 {
9810 	AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, adv_dvc->ppr_able);
9811 	adv_dvc->ppr_able |= tidmask;
9812 	AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, adv_dvc->ppr_able);
9813 }
9814 
9815 static void
9816 advansys_wide_slave_configure(struct scsi_device *sdev, ADV_DVC_VAR *adv_dvc)
9817 {
9818 	AdvPortAddr iop_base = adv_dvc->iop_base;
9819 	unsigned short tidmask = 1 << sdev->id;
9820 
9821 	if (sdev->lun == 0) {
9822 		/*
9823 		 * Handle WDTR, SDTR, and Tag Queuing. If the feature
9824 		 * is enabled in the EEPROM and the device supports the
9825 		 * feature, then enable it in the microcode.
9826 		 */
9827 
9828 		if ((adv_dvc->wdtr_able & tidmask) && sdev->wdtr)
9829 			advansys_wide_enable_wdtr(iop_base, tidmask);
9830 		if ((adv_dvc->sdtr_able & tidmask) && sdev->sdtr)
9831 			advansys_wide_enable_sdtr(iop_base, tidmask);
9832 		if (adv_dvc->chip_type == ADV_CHIP_ASC38C1600 && sdev->ppr)
9833 			advansys_wide_enable_ppr(adv_dvc, iop_base, tidmask);
9834 
9835 		/*
9836 		 * Tag Queuing is disabled for the BIOS which runs in polled
9837 		 * mode and would see no benefit from Tag Queuing. Also by
9838 		 * disabling Tag Queuing in the BIOS devices with Tag Queuing
9839 		 * bugs will at least work with the BIOS.
9840 		 */
9841 		if ((adv_dvc->tagqng_able & tidmask) &&
9842 		    sdev->tagged_supported) {
9843 			unsigned short cfg_word;
9844 			AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
9845 			cfg_word |= tidmask;
9846 			AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
9847 					 cfg_word);
9848 			AdvWriteByteLram(iop_base,
9849 					 ASC_MC_NUMBER_OF_MAX_CMD + sdev->id,
9850 					 adv_dvc->max_dvc_qng);
9851 		}
9852 	}
9853 
9854 	if ((adv_dvc->tagqng_able & tidmask) && sdev->tagged_supported) {
9855 		scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG,
9856 					adv_dvc->max_dvc_qng);
9857 	} else {
9858 		scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
9859 	}
9860 }
9861 
9862 /*
9863  * Set the number of commands to queue per device for the
9864  * specified host adapter.
9865  */
9866 static int advansys_slave_configure(struct scsi_device *sdev)
9867 {
9868 	struct asc_board *boardp = shost_priv(sdev->host);
9869 
9870 	if (ASC_NARROW_BOARD(boardp))
9871 		advansys_narrow_slave_configure(sdev,
9872 						&boardp->dvc_var.asc_dvc_var);
9873 	else
9874 		advansys_wide_slave_configure(sdev,
9875 						&boardp->dvc_var.adv_dvc_var);
9876 
9877 	return 0;
9878 }
9879 
9880 static __le32 advansys_get_sense_buffer_dma(struct scsi_cmnd *scp)
9881 {
9882 	struct asc_board *board = shost_priv(scp->device->host);
9883 	scp->SCp.dma_handle = dma_map_single(board->dev, scp->sense_buffer,
9884 					     SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
9885 	dma_cache_sync(board->dev, scp->sense_buffer,
9886 		       SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
9887 	return cpu_to_le32(scp->SCp.dma_handle);
9888 }
9889 
9890 static int asc_build_req(struct asc_board *boardp, struct scsi_cmnd *scp,
9891 			struct asc_scsi_q *asc_scsi_q)
9892 {
9893 	struct asc_dvc_var *asc_dvc = &boardp->dvc_var.asc_dvc_var;
9894 	int use_sg;
9895 
9896 	memset(asc_scsi_q, 0, sizeof(*asc_scsi_q));
9897 
9898 	/*
9899 	 * Point the ASC_SCSI_Q to the 'struct scsi_cmnd'.
9900 	 */
9901 	asc_scsi_q->q2.srb_ptr = advansys_ptr_to_srb(asc_dvc, scp);
9902 	if (asc_scsi_q->q2.srb_ptr == BAD_SRB) {
9903 		scp->result = HOST_BYTE(DID_SOFT_ERROR);
9904 		return ASC_ERROR;
9905 	}
9906 
9907 	/*
9908 	 * Build the ASC_SCSI_Q request.
9909 	 */
9910 	asc_scsi_q->cdbptr = &scp->cmnd[0];
9911 	asc_scsi_q->q2.cdb_len = scp->cmd_len;
9912 	asc_scsi_q->q1.target_id = ASC_TID_TO_TARGET_ID(scp->device->id);
9913 	asc_scsi_q->q1.target_lun = scp->device->lun;
9914 	asc_scsi_q->q2.target_ix =
9915 	    ASC_TIDLUN_TO_IX(scp->device->id, scp->device->lun);
9916 	asc_scsi_q->q1.sense_addr = advansys_get_sense_buffer_dma(scp);
9917 	asc_scsi_q->q1.sense_len = SCSI_SENSE_BUFFERSIZE;
9918 
9919 	/*
9920 	 * If there are any outstanding requests for the current target,
9921 	 * then every 255th request send an ORDERED request. This heuristic
9922 	 * tries to retain the benefit of request sorting while preventing
9923 	 * request starvation. 255 is the max number of tags or pending commands
9924 	 * a device may have outstanding.
9925 	 *
9926 	 * The request count is incremented below for every successfully
9927 	 * started request.
9928 	 *
9929 	 */
9930 	if ((asc_dvc->cur_dvc_qng[scp->device->id] > 0) &&
9931 	    (boardp->reqcnt[scp->device->id] % 255) == 0) {
9932 		asc_scsi_q->q2.tag_code = MSG_ORDERED_TAG;
9933 	} else {
9934 		asc_scsi_q->q2.tag_code = MSG_SIMPLE_TAG;
9935 	}
9936 
9937 	/* Build ASC_SCSI_Q */
9938 	use_sg = scsi_dma_map(scp);
9939 	if (use_sg != 0) {
9940 		int sgcnt;
9941 		struct scatterlist *slp;
9942 		struct asc_sg_head *asc_sg_head;
9943 
9944 		if (use_sg > scp->device->host->sg_tablesize) {
9945 			scmd_printk(KERN_ERR, scp, "use_sg %d > "
9946 				"sg_tablesize %d\n", use_sg,
9947 				scp->device->host->sg_tablesize);
9948 			scsi_dma_unmap(scp);
9949 			scp->result = HOST_BYTE(DID_ERROR);
9950 			return ASC_ERROR;
9951 		}
9952 
9953 		asc_sg_head = kzalloc(sizeof(asc_scsi_q->sg_head) +
9954 			use_sg * sizeof(struct asc_sg_list), GFP_ATOMIC);
9955 		if (!asc_sg_head) {
9956 			scsi_dma_unmap(scp);
9957 			scp->result = HOST_BYTE(DID_SOFT_ERROR);
9958 			return ASC_ERROR;
9959 		}
9960 
9961 		asc_scsi_q->q1.cntl |= QC_SG_HEAD;
9962 		asc_scsi_q->sg_head = asc_sg_head;
9963 		asc_scsi_q->q1.data_cnt = 0;
9964 		asc_scsi_q->q1.data_addr = 0;
9965 		/* This is a byte value, otherwise it would need to be swapped. */
9966 		asc_sg_head->entry_cnt = asc_scsi_q->q1.sg_queue_cnt = use_sg;
9967 		ASC_STATS_ADD(scp->device->host, xfer_elem,
9968 			      asc_sg_head->entry_cnt);
9969 
9970 		/*
9971 		 * Convert scatter-gather list into ASC_SG_HEAD list.
9972 		 */
9973 		scsi_for_each_sg(scp, slp, use_sg, sgcnt) {
9974 			asc_sg_head->sg_list[sgcnt].addr =
9975 			    cpu_to_le32(sg_dma_address(slp));
9976 			asc_sg_head->sg_list[sgcnt].bytes =
9977 			    cpu_to_le32(sg_dma_len(slp));
9978 			ASC_STATS_ADD(scp->device->host, xfer_sect,
9979 				      DIV_ROUND_UP(sg_dma_len(slp), 512));
9980 		}
9981 	}
9982 
9983 	ASC_STATS(scp->device->host, xfer_cnt);
9984 
9985 	ASC_DBG_PRT_ASC_SCSI_Q(2, asc_scsi_q);
9986 	ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
9987 
9988 	return ASC_NOERROR;
9989 }
9990 
9991 /*
9992  * Build scatter-gather list for Adv Library (Wide Board).
9993  *
9994  * Additional ADV_SG_BLOCK structures will need to be allocated
9995  * if the total number of scatter-gather elements exceeds
9996  * NO_OF_SG_PER_BLOCK (15). The ADV_SG_BLOCK structures are
9997  * assumed to be physically contiguous.
9998  *
9999  * Return:
10000  *      ADV_SUCCESS(1) - SG List successfully created
10001  *      ADV_ERROR(-1) - SG List creation failed
10002  */
10003 static int
10004 adv_get_sglist(struct asc_board *boardp, adv_req_t *reqp, struct scsi_cmnd *scp,
10005 	       int use_sg)
10006 {
10007 	adv_sgblk_t *sgblkp;
10008 	ADV_SCSI_REQ_Q *scsiqp;
10009 	struct scatterlist *slp;
10010 	int sg_elem_cnt;
10011 	ADV_SG_BLOCK *sg_block, *prev_sg_block;
10012 	ADV_PADDR sg_block_paddr;
10013 	int i;
10014 
10015 	scsiqp = (ADV_SCSI_REQ_Q *)ADV_32BALIGN(&reqp->scsi_req_q);
10016 	slp = scsi_sglist(scp);
10017 	sg_elem_cnt = use_sg;
10018 	prev_sg_block = NULL;
10019 	reqp->sgblkp = NULL;
10020 
10021 	for (;;) {
10022 		/*
10023 		 * Allocate a 'adv_sgblk_t' structure from the board free
10024 		 * list. One 'adv_sgblk_t' structure holds NO_OF_SG_PER_BLOCK
10025 		 * (15) scatter-gather elements.
10026 		 */
10027 		if ((sgblkp = boardp->adv_sgblkp) == NULL) {
10028 			ASC_DBG(1, "no free adv_sgblk_t\n");
10029 			ASC_STATS(scp->device->host, adv_build_nosg);
10030 
10031 			/*
10032 			 * Allocation failed. Free 'adv_sgblk_t' structures
10033 			 * already allocated for the request.
10034 			 */
10035 			while ((sgblkp = reqp->sgblkp) != NULL) {
10036 				/* Remove 'sgblkp' from the request list. */
10037 				reqp->sgblkp = sgblkp->next_sgblkp;
10038 
10039 				/* Add 'sgblkp' to the board free list. */
10040 				sgblkp->next_sgblkp = boardp->adv_sgblkp;
10041 				boardp->adv_sgblkp = sgblkp;
10042 			}
10043 			return ASC_BUSY;
10044 		}
10045 
10046 		/* Complete 'adv_sgblk_t' board allocation. */
10047 		boardp->adv_sgblkp = sgblkp->next_sgblkp;
10048 		sgblkp->next_sgblkp = NULL;
10049 
10050 		/*
10051 		 * Get 8 byte aligned virtual and physical addresses
10052 		 * for the allocated ADV_SG_BLOCK structure.
10053 		 */
10054 		sg_block = (ADV_SG_BLOCK *)ADV_8BALIGN(&sgblkp->sg_block);
10055 		sg_block_paddr = virt_to_bus(sg_block);
10056 
10057 		/*
10058 		 * Check if this is the first 'adv_sgblk_t' for the
10059 		 * request.
10060 		 */
10061 		if (reqp->sgblkp == NULL) {
10062 			/* Request's first scatter-gather block. */
10063 			reqp->sgblkp = sgblkp;
10064 
10065 			/*
10066 			 * Set ADV_SCSI_REQ_T ADV_SG_BLOCK virtual and physical
10067 			 * address pointers.
10068 			 */
10069 			scsiqp->sg_list_ptr = sg_block;
10070 			scsiqp->sg_real_addr = cpu_to_le32(sg_block_paddr);
10071 		} else {
10072 			/* Request's second or later scatter-gather block. */
10073 			sgblkp->next_sgblkp = reqp->sgblkp;
10074 			reqp->sgblkp = sgblkp;
10075 
10076 			/*
10077 			 * Point the previous ADV_SG_BLOCK structure to
10078 			 * the newly allocated ADV_SG_BLOCK structure.
10079 			 */
10080 			prev_sg_block->sg_ptr = cpu_to_le32(sg_block_paddr);
10081 		}
10082 
10083 		for (i = 0; i < NO_OF_SG_PER_BLOCK; i++) {
10084 			sg_block->sg_list[i].sg_addr =
10085 					cpu_to_le32(sg_dma_address(slp));
10086 			sg_block->sg_list[i].sg_count =
10087 					cpu_to_le32(sg_dma_len(slp));
10088 			ASC_STATS_ADD(scp->device->host, xfer_sect,
10089 				      DIV_ROUND_UP(sg_dma_len(slp), 512));
10090 
10091 			if (--sg_elem_cnt == 0) {	/* Last ADV_SG_BLOCK and scatter-gather entry. */
10092 				sg_block->sg_cnt = i + 1;
10093 				sg_block->sg_ptr = 0L;	/* Last ADV_SG_BLOCK in list. */
10094 				return ADV_SUCCESS;
10095 			}
10096 			slp++;
10097 		}
10098 		sg_block->sg_cnt = NO_OF_SG_PER_BLOCK;
10099 		prev_sg_block = sg_block;
10100 	}
10101 }
10102 
10103 /*
10104  * Build a request structure for the Adv Library (Wide Board).
10105  *
10106  * If an adv_req_t can not be allocated to issue the request,
10107  * then return ASC_BUSY. If an error occurs, then return ASC_ERROR.
10108  *
10109  * Multi-byte fields in the ASC_SCSI_REQ_Q that are used by the
10110  * microcode for DMA addresses or math operations are byte swapped
10111  * to little-endian order.
10112  */
10113 static int
10114 adv_build_req(struct asc_board *boardp, struct scsi_cmnd *scp,
10115 	      ADV_SCSI_REQ_Q **adv_scsiqpp)
10116 {
10117 	adv_req_t *reqp;
10118 	ADV_SCSI_REQ_Q *scsiqp;
10119 	int i;
10120 	int ret;
10121 	int use_sg;
10122 
10123 	/*
10124 	 * Allocate an adv_req_t structure from the board to execute
10125 	 * the command.
10126 	 */
10127 	if (boardp->adv_reqp == NULL) {
10128 		ASC_DBG(1, "no free adv_req_t\n");
10129 		ASC_STATS(scp->device->host, adv_build_noreq);
10130 		return ASC_BUSY;
10131 	} else {
10132 		reqp = boardp->adv_reqp;
10133 		boardp->adv_reqp = reqp->next_reqp;
10134 		reqp->next_reqp = NULL;
10135 	}
10136 
10137 	/*
10138 	 * Get 32-byte aligned ADV_SCSI_REQ_Q and ADV_SG_BLOCK pointers.
10139 	 */
10140 	scsiqp = (ADV_SCSI_REQ_Q *)ADV_32BALIGN(&reqp->scsi_req_q);
10141 
10142 	/*
10143 	 * Initialize the structure.
10144 	 */
10145 	scsiqp->cntl = scsiqp->scsi_cntl = scsiqp->done_status = 0;
10146 
10147 	/*
10148 	 * Set the ADV_SCSI_REQ_Q 'srb_ptr' to point to the adv_req_t structure.
10149 	 */
10150 	scsiqp->srb_ptr = ADV_VADDR_TO_U32(reqp);
10151 
10152 	/*
10153 	 * Set the adv_req_t 'cmndp' to point to the struct scsi_cmnd structure.
10154 	 */
10155 	reqp->cmndp = scp;
10156 
10157 	/*
10158 	 * Build the ADV_SCSI_REQ_Q request.
10159 	 */
10160 
10161 	/* Set CDB length and copy it to the request structure.  */
10162 	scsiqp->cdb_len = scp->cmd_len;
10163 	/* Copy first 12 CDB bytes to cdb[]. */
10164 	for (i = 0; i < scp->cmd_len && i < 12; i++) {
10165 		scsiqp->cdb[i] = scp->cmnd[i];
10166 	}
10167 	/* Copy last 4 CDB bytes, if present, to cdb16[]. */
10168 	for (; i < scp->cmd_len; i++) {
10169 		scsiqp->cdb16[i - 12] = scp->cmnd[i];
10170 	}
10171 
10172 	scsiqp->target_id = scp->device->id;
10173 	scsiqp->target_lun = scp->device->lun;
10174 
10175 	scsiqp->sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
10176 	scsiqp->sense_len = SCSI_SENSE_BUFFERSIZE;
10177 
10178 	/* Build ADV_SCSI_REQ_Q */
10179 
10180 	use_sg = scsi_dma_map(scp);
10181 	if (use_sg == 0) {
10182 		/* Zero-length transfer */
10183 		reqp->sgblkp = NULL;
10184 		scsiqp->data_cnt = 0;
10185 		scsiqp->vdata_addr = NULL;
10186 
10187 		scsiqp->data_addr = 0;
10188 		scsiqp->sg_list_ptr = NULL;
10189 		scsiqp->sg_real_addr = 0;
10190 	} else {
10191 		if (use_sg > ADV_MAX_SG_LIST) {
10192 			scmd_printk(KERN_ERR, scp, "use_sg %d > "
10193 				   "ADV_MAX_SG_LIST %d\n", use_sg,
10194 				   scp->device->host->sg_tablesize);
10195 			scsi_dma_unmap(scp);
10196 			scp->result = HOST_BYTE(DID_ERROR);
10197 
10198 			/*
10199 			 * Free the 'adv_req_t' structure by adding it back
10200 			 * to the board free list.
10201 			 */
10202 			reqp->next_reqp = boardp->adv_reqp;
10203 			boardp->adv_reqp = reqp;
10204 
10205 			return ASC_ERROR;
10206 		}
10207 
10208 		scsiqp->data_cnt = cpu_to_le32(scsi_bufflen(scp));
10209 
10210 		ret = adv_get_sglist(boardp, reqp, scp, use_sg);
10211 		if (ret != ADV_SUCCESS) {
10212 			/*
10213 			 * Free the adv_req_t structure by adding it back to
10214 			 * the board free list.
10215 			 */
10216 			reqp->next_reqp = boardp->adv_reqp;
10217 			boardp->adv_reqp = reqp;
10218 
10219 			return ret;
10220 		}
10221 
10222 		ASC_STATS_ADD(scp->device->host, xfer_elem, use_sg);
10223 	}
10224 
10225 	ASC_STATS(scp->device->host, xfer_cnt);
10226 
10227 	ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
10228 	ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
10229 
10230 	*adv_scsiqpp = scsiqp;
10231 
10232 	return ASC_NOERROR;
10233 }
10234 
10235 static int AscSgListToQueue(int sg_list)
10236 {
10237 	int n_sg_list_qs;
10238 
10239 	n_sg_list_qs = ((sg_list - 1) / ASC_SG_LIST_PER_Q);
10240 	if (((sg_list - 1) % ASC_SG_LIST_PER_Q) != 0)
10241 		n_sg_list_qs++;
10242 	return n_sg_list_qs + 1;
10243 }
10244 
10245 static uint
10246 AscGetNumOfFreeQueue(ASC_DVC_VAR *asc_dvc, uchar target_ix, uchar n_qs)
10247 {
10248 	uint cur_used_qs;
10249 	uint cur_free_qs;
10250 	ASC_SCSI_BIT_ID_TYPE target_id;
10251 	uchar tid_no;
10252 
10253 	target_id = ASC_TIX_TO_TARGET_ID(target_ix);
10254 	tid_no = ASC_TIX_TO_TID(target_ix);
10255 	if ((asc_dvc->unit_not_ready & target_id) ||
10256 	    (asc_dvc->queue_full_or_busy & target_id)) {
10257 		return 0;
10258 	}
10259 	if (n_qs == 1) {
10260 		cur_used_qs = (uint) asc_dvc->cur_total_qng +
10261 		    (uint) asc_dvc->last_q_shortage + (uint) ASC_MIN_FREE_Q;
10262 	} else {
10263 		cur_used_qs = (uint) asc_dvc->cur_total_qng +
10264 		    (uint) ASC_MIN_FREE_Q;
10265 	}
10266 	if ((uint) (cur_used_qs + n_qs) <= (uint) asc_dvc->max_total_qng) {
10267 		cur_free_qs = (uint) asc_dvc->max_total_qng - cur_used_qs;
10268 		if (asc_dvc->cur_dvc_qng[tid_no] >=
10269 		    asc_dvc->max_dvc_qng[tid_no]) {
10270 			return 0;
10271 		}
10272 		return cur_free_qs;
10273 	}
10274 	if (n_qs > 1) {
10275 		if ((n_qs > asc_dvc->last_q_shortage)
10276 		    && (n_qs <= (asc_dvc->max_total_qng - ASC_MIN_FREE_Q))) {
10277 			asc_dvc->last_q_shortage = n_qs;
10278 		}
10279 	}
10280 	return 0;
10281 }
10282 
10283 static uchar AscAllocFreeQueue(PortAddr iop_base, uchar free_q_head)
10284 {
10285 	ushort q_addr;
10286 	uchar next_qp;
10287 	uchar q_status;
10288 
10289 	q_addr = ASC_QNO_TO_QADDR(free_q_head);
10290 	q_status = (uchar)AscReadLramByte(iop_base,
10291 					  (ushort)(q_addr +
10292 						   ASC_SCSIQ_B_STATUS));
10293 	next_qp = AscReadLramByte(iop_base, (ushort)(q_addr + ASC_SCSIQ_B_FWD));
10294 	if (((q_status & QS_READY) == 0) && (next_qp != ASC_QLINK_END))
10295 		return next_qp;
10296 	return ASC_QLINK_END;
10297 }
10298 
10299 static uchar
10300 AscAllocMultipleFreeQueue(PortAddr iop_base, uchar free_q_head, uchar n_free_q)
10301 {
10302 	uchar i;
10303 
10304 	for (i = 0; i < n_free_q; i++) {
10305 		free_q_head = AscAllocFreeQueue(iop_base, free_q_head);
10306 		if (free_q_head == ASC_QLINK_END)
10307 			break;
10308 	}
10309 	return free_q_head;
10310 }
10311 
10312 /*
10313  * void
10314  * DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
10315  *
10316  * Calling/Exit State:
10317  *    none
10318  *
10319  * Description:
10320  *     Output an ASC_SCSI_Q structure to the chip
10321  */
10322 static void
10323 DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
10324 {
10325 	int i;
10326 
10327 	ASC_DBG_PRT_HEX(2, "DvcPutScsiQ", outbuf, 2 * words);
10328 	AscSetChipLramAddr(iop_base, s_addr);
10329 	for (i = 0; i < 2 * words; i += 2) {
10330 		if (i == 4 || i == 20) {
10331 			continue;
10332 		}
10333 		outpw(iop_base + IOP_RAM_DATA,
10334 		      ((ushort)outbuf[i + 1] << 8) | outbuf[i]);
10335 	}
10336 }
10337 
10338 static int AscPutReadyQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no)
10339 {
10340 	ushort q_addr;
10341 	uchar tid_no;
10342 	uchar sdtr_data;
10343 	uchar syn_period_ix;
10344 	uchar syn_offset;
10345 	PortAddr iop_base;
10346 
10347 	iop_base = asc_dvc->iop_base;
10348 	if (((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) &&
10349 	    ((asc_dvc->sdtr_done & scsiq->q1.target_id) == 0)) {
10350 		tid_no = ASC_TIX_TO_TID(scsiq->q2.target_ix);
10351 		sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
10352 		syn_period_ix =
10353 		    (sdtr_data >> 4) & (asc_dvc->max_sdtr_index - 1);
10354 		syn_offset = sdtr_data & ASC_SYN_MAX_OFFSET;
10355 		AscMsgOutSDTR(asc_dvc,
10356 			      asc_dvc->sdtr_period_tbl[syn_period_ix],
10357 			      syn_offset);
10358 		scsiq->q1.cntl |= QC_MSG_OUT;
10359 	}
10360 	q_addr = ASC_QNO_TO_QADDR(q_no);
10361 	if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) {
10362 		scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
10363 	}
10364 	scsiq->q1.status = QS_FREE;
10365 	AscMemWordCopyPtrToLram(iop_base,
10366 				q_addr + ASC_SCSIQ_CDB_BEG,
10367 				(uchar *)scsiq->cdbptr, scsiq->q2.cdb_len >> 1);
10368 
10369 	DvcPutScsiQ(iop_base,
10370 		    q_addr + ASC_SCSIQ_CPY_BEG,
10371 		    (uchar *)&scsiq->q1.cntl,
10372 		    ((sizeof(ASC_SCSIQ_1) + sizeof(ASC_SCSIQ_2)) / 2) - 1);
10373 	AscWriteLramWord(iop_base,
10374 			 (ushort)(q_addr + (ushort)ASC_SCSIQ_B_STATUS),
10375 			 (ushort)(((ushort)scsiq->q1.
10376 				   q_no << 8) | (ushort)QS_READY));
10377 	return 1;
10378 }
10379 
10380 static int
10381 AscPutReadySgListQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no)
10382 {
10383 	int sta;
10384 	int i;
10385 	ASC_SG_HEAD *sg_head;
10386 	ASC_SG_LIST_Q scsi_sg_q;
10387 	ASC_DCNT saved_data_addr;
10388 	ASC_DCNT saved_data_cnt;
10389 	PortAddr iop_base;
10390 	ushort sg_list_dwords;
10391 	ushort sg_index;
10392 	ushort sg_entry_cnt;
10393 	ushort q_addr;
10394 	uchar next_qp;
10395 
10396 	iop_base = asc_dvc->iop_base;
10397 	sg_head = scsiq->sg_head;
10398 	saved_data_addr = scsiq->q1.data_addr;
10399 	saved_data_cnt = scsiq->q1.data_cnt;
10400 	scsiq->q1.data_addr = (ASC_PADDR) sg_head->sg_list[0].addr;
10401 	scsiq->q1.data_cnt = (ASC_DCNT) sg_head->sg_list[0].bytes;
10402 #if CC_VERY_LONG_SG_LIST
10403 	/*
10404 	 * If sg_head->entry_cnt is greater than ASC_MAX_SG_LIST
10405 	 * then not all SG elements will fit in the allocated queues.
10406 	 * The rest of the SG elements will be copied when the RISC
10407 	 * completes the SG elements that fit and halts.
10408 	 */
10409 	if (sg_head->entry_cnt > ASC_MAX_SG_LIST) {
10410 		/*
10411 		 * Set sg_entry_cnt to be the number of SG elements that
10412 		 * will fit in the allocated SG queues. It is minus 1, because
10413 		 * the first SG element is handled above. ASC_MAX_SG_LIST is
10414 		 * already inflated by 1 to account for this. For example it
10415 		 * may be 50 which is 1 + 7 queues * 7 SG elements.
10416 		 */
10417 		sg_entry_cnt = ASC_MAX_SG_LIST - 1;
10418 
10419 		/*
10420 		 * Keep track of remaining number of SG elements that will
10421 		 * need to be handled from a_isr.c.
10422 		 */
10423 		scsiq->remain_sg_entry_cnt =
10424 		    sg_head->entry_cnt - ASC_MAX_SG_LIST;
10425 	} else {
10426 #endif /* CC_VERY_LONG_SG_LIST */
10427 		/*
10428 		 * Set sg_entry_cnt to be the number of SG elements that
10429 		 * will fit in the allocated SG queues. It is minus 1, because
10430 		 * the first SG element is handled above.
10431 		 */
10432 		sg_entry_cnt = sg_head->entry_cnt - 1;
10433 #if CC_VERY_LONG_SG_LIST
10434 	}
10435 #endif /* CC_VERY_LONG_SG_LIST */
10436 	if (sg_entry_cnt != 0) {
10437 		scsiq->q1.cntl |= QC_SG_HEAD;
10438 		q_addr = ASC_QNO_TO_QADDR(q_no);
10439 		sg_index = 1;
10440 		scsiq->q1.sg_queue_cnt = sg_head->queue_cnt;
10441 		scsi_sg_q.sg_head_qp = q_no;
10442 		scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
10443 		for (i = 0; i < sg_head->queue_cnt; i++) {
10444 			scsi_sg_q.seq_no = i + 1;
10445 			if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
10446 				sg_list_dwords = (uchar)(ASC_SG_LIST_PER_Q * 2);
10447 				sg_entry_cnt -= ASC_SG_LIST_PER_Q;
10448 				if (i == 0) {
10449 					scsi_sg_q.sg_list_cnt =
10450 					    ASC_SG_LIST_PER_Q;
10451 					scsi_sg_q.sg_cur_list_cnt =
10452 					    ASC_SG_LIST_PER_Q;
10453 				} else {
10454 					scsi_sg_q.sg_list_cnt =
10455 					    ASC_SG_LIST_PER_Q - 1;
10456 					scsi_sg_q.sg_cur_list_cnt =
10457 					    ASC_SG_LIST_PER_Q - 1;
10458 				}
10459 			} else {
10460 #if CC_VERY_LONG_SG_LIST
10461 				/*
10462 				 * This is the last SG queue in the list of
10463 				 * allocated SG queues. If there are more
10464 				 * SG elements than will fit in the allocated
10465 				 * queues, then set the QCSG_SG_XFER_MORE flag.
10466 				 */
10467 				if (sg_head->entry_cnt > ASC_MAX_SG_LIST) {
10468 					scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
10469 				} else {
10470 #endif /* CC_VERY_LONG_SG_LIST */
10471 					scsi_sg_q.cntl |= QCSG_SG_XFER_END;
10472 #if CC_VERY_LONG_SG_LIST
10473 				}
10474 #endif /* CC_VERY_LONG_SG_LIST */
10475 				sg_list_dwords = sg_entry_cnt << 1;
10476 				if (i == 0) {
10477 					scsi_sg_q.sg_list_cnt = sg_entry_cnt;
10478 					scsi_sg_q.sg_cur_list_cnt =
10479 					    sg_entry_cnt;
10480 				} else {
10481 					scsi_sg_q.sg_list_cnt =
10482 					    sg_entry_cnt - 1;
10483 					scsi_sg_q.sg_cur_list_cnt =
10484 					    sg_entry_cnt - 1;
10485 				}
10486 				sg_entry_cnt = 0;
10487 			}
10488 			next_qp = AscReadLramByte(iop_base,
10489 						  (ushort)(q_addr +
10490 							   ASC_SCSIQ_B_FWD));
10491 			scsi_sg_q.q_no = next_qp;
10492 			q_addr = ASC_QNO_TO_QADDR(next_qp);
10493 			AscMemWordCopyPtrToLram(iop_base,
10494 						q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
10495 						(uchar *)&scsi_sg_q,
10496 						sizeof(ASC_SG_LIST_Q) >> 1);
10497 			AscMemDWordCopyPtrToLram(iop_base,
10498 						 q_addr + ASC_SGQ_LIST_BEG,
10499 						 (uchar *)&sg_head->
10500 						 sg_list[sg_index],
10501 						 sg_list_dwords);
10502 			sg_index += ASC_SG_LIST_PER_Q;
10503 			scsiq->next_sg_index = sg_index;
10504 		}
10505 	} else {
10506 		scsiq->q1.cntl &= ~QC_SG_HEAD;
10507 	}
10508 	sta = AscPutReadyQueue(asc_dvc, scsiq, q_no);
10509 	scsiq->q1.data_addr = saved_data_addr;
10510 	scsiq->q1.data_cnt = saved_data_cnt;
10511 	return (sta);
10512 }
10513 
10514 static int
10515 AscSendScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar n_q_required)
10516 {
10517 	PortAddr iop_base;
10518 	uchar free_q_head;
10519 	uchar next_qp;
10520 	uchar tid_no;
10521 	uchar target_ix;
10522 	int sta;
10523 
10524 	iop_base = asc_dvc->iop_base;
10525 	target_ix = scsiq->q2.target_ix;
10526 	tid_no = ASC_TIX_TO_TID(target_ix);
10527 	sta = 0;
10528 	free_q_head = (uchar)AscGetVarFreeQHead(iop_base);
10529 	if (n_q_required > 1) {
10530 		next_qp = AscAllocMultipleFreeQueue(iop_base, free_q_head,
10531 						    (uchar)n_q_required);
10532 		if (next_qp != ASC_QLINK_END) {
10533 			asc_dvc->last_q_shortage = 0;
10534 			scsiq->sg_head->queue_cnt = n_q_required - 1;
10535 			scsiq->q1.q_no = free_q_head;
10536 			sta = AscPutReadySgListQueue(asc_dvc, scsiq,
10537 						     free_q_head);
10538 		}
10539 	} else if (n_q_required == 1) {
10540 		next_qp = AscAllocFreeQueue(iop_base, free_q_head);
10541 		if (next_qp != ASC_QLINK_END) {
10542 			scsiq->q1.q_no = free_q_head;
10543 			sta = AscPutReadyQueue(asc_dvc, scsiq, free_q_head);
10544 		}
10545 	}
10546 	if (sta == 1) {
10547 		AscPutVarFreeQHead(iop_base, next_qp);
10548 		asc_dvc->cur_total_qng += n_q_required;
10549 		asc_dvc->cur_dvc_qng[tid_no]++;
10550 	}
10551 	return sta;
10552 }
10553 
10554 #define ASC_SYN_OFFSET_ONE_DISABLE_LIST  16
10555 static uchar _syn_offset_one_disable_cmd[ASC_SYN_OFFSET_ONE_DISABLE_LIST] = {
10556 	INQUIRY,
10557 	REQUEST_SENSE,
10558 	READ_CAPACITY,
10559 	READ_TOC,
10560 	MODE_SELECT,
10561 	MODE_SENSE,
10562 	MODE_SELECT_10,
10563 	MODE_SENSE_10,
10564 	0xFF,
10565 	0xFF,
10566 	0xFF,
10567 	0xFF,
10568 	0xFF,
10569 	0xFF,
10570 	0xFF,
10571 	0xFF
10572 };
10573 
10574 static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
10575 {
10576 	PortAddr iop_base;
10577 	int sta;
10578 	int n_q_required;
10579 	int disable_syn_offset_one_fix;
10580 	int i;
10581 	ASC_PADDR addr;
10582 	ushort sg_entry_cnt = 0;
10583 	ushort sg_entry_cnt_minus_one = 0;
10584 	uchar target_ix;
10585 	uchar tid_no;
10586 	uchar sdtr_data;
10587 	uchar extra_bytes;
10588 	uchar scsi_cmd;
10589 	uchar disable_cmd;
10590 	ASC_SG_HEAD *sg_head;
10591 	ASC_DCNT data_cnt;
10592 
10593 	iop_base = asc_dvc->iop_base;
10594 	sg_head = scsiq->sg_head;
10595 	if (asc_dvc->err_code != 0)
10596 		return (ERR);
10597 	scsiq->q1.q_no = 0;
10598 	if ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES) == 0) {
10599 		scsiq->q1.extra_bytes = 0;
10600 	}
10601 	sta = 0;
10602 	target_ix = scsiq->q2.target_ix;
10603 	tid_no = ASC_TIX_TO_TID(target_ix);
10604 	n_q_required = 1;
10605 	if (scsiq->cdbptr[0] == REQUEST_SENSE) {
10606 		if ((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) {
10607 			asc_dvc->sdtr_done &= ~scsiq->q1.target_id;
10608 			sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
10609 			AscMsgOutSDTR(asc_dvc,
10610 				      asc_dvc->
10611 				      sdtr_period_tbl[(sdtr_data >> 4) &
10612 						      (uchar)(asc_dvc->
10613 							      max_sdtr_index -
10614 							      1)],
10615 				      (uchar)(sdtr_data & (uchar)
10616 					      ASC_SYN_MAX_OFFSET));
10617 			scsiq->q1.cntl |= (QC_MSG_OUT | QC_URGENT);
10618 		}
10619 	}
10620 	if (asc_dvc->in_critical_cnt != 0) {
10621 		AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CRITICAL_RE_ENTRY);
10622 		return (ERR);
10623 	}
10624 	asc_dvc->in_critical_cnt++;
10625 	if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
10626 		if ((sg_entry_cnt = sg_head->entry_cnt) == 0) {
10627 			asc_dvc->in_critical_cnt--;
10628 			return (ERR);
10629 		}
10630 #if !CC_VERY_LONG_SG_LIST
10631 		if (sg_entry_cnt > ASC_MAX_SG_LIST) {
10632 			asc_dvc->in_critical_cnt--;
10633 			return (ERR);
10634 		}
10635 #endif /* !CC_VERY_LONG_SG_LIST */
10636 		if (sg_entry_cnt == 1) {
10637 			scsiq->q1.data_addr =
10638 			    (ADV_PADDR)sg_head->sg_list[0].addr;
10639 			scsiq->q1.data_cnt =
10640 			    (ADV_DCNT)sg_head->sg_list[0].bytes;
10641 			scsiq->q1.cntl &= ~(QC_SG_HEAD | QC_SG_SWAP_QUEUE);
10642 		}
10643 		sg_entry_cnt_minus_one = sg_entry_cnt - 1;
10644 	}
10645 	scsi_cmd = scsiq->cdbptr[0];
10646 	disable_syn_offset_one_fix = FALSE;
10647 	if ((asc_dvc->pci_fix_asyn_xfer & scsiq->q1.target_id) &&
10648 	    !(asc_dvc->pci_fix_asyn_xfer_always & scsiq->q1.target_id)) {
10649 		if (scsiq->q1.cntl & QC_SG_HEAD) {
10650 			data_cnt = 0;
10651 			for (i = 0; i < sg_entry_cnt; i++) {
10652 				data_cnt +=
10653 				    (ADV_DCNT)le32_to_cpu(sg_head->sg_list[i].
10654 							  bytes);
10655 			}
10656 		} else {
10657 			data_cnt = le32_to_cpu(scsiq->q1.data_cnt);
10658 		}
10659 		if (data_cnt != 0UL) {
10660 			if (data_cnt < 512UL) {
10661 				disable_syn_offset_one_fix = TRUE;
10662 			} else {
10663 				for (i = 0; i < ASC_SYN_OFFSET_ONE_DISABLE_LIST;
10664 				     i++) {
10665 					disable_cmd =
10666 					    _syn_offset_one_disable_cmd[i];
10667 					if (disable_cmd == 0xFF) {
10668 						break;
10669 					}
10670 					if (scsi_cmd == disable_cmd) {
10671 						disable_syn_offset_one_fix =
10672 						    TRUE;
10673 						break;
10674 					}
10675 				}
10676 			}
10677 		}
10678 	}
10679 	if (disable_syn_offset_one_fix) {
10680 		scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
10681 		scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX |
10682 				       ASC_TAG_FLAG_DISABLE_DISCONNECT);
10683 	} else {
10684 		scsiq->q2.tag_code &= 0x27;
10685 	}
10686 	if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
10687 		if (asc_dvc->bug_fix_cntl) {
10688 			if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
10689 				if ((scsi_cmd == READ_6) ||
10690 				    (scsi_cmd == READ_10)) {
10691 					addr =
10692 					    (ADV_PADDR)le32_to_cpu(sg_head->
10693 								   sg_list
10694 								   [sg_entry_cnt_minus_one].
10695 								   addr) +
10696 					    (ADV_DCNT)le32_to_cpu(sg_head->
10697 								  sg_list
10698 								  [sg_entry_cnt_minus_one].
10699 								  bytes);
10700 					extra_bytes =
10701 					    (uchar)((ushort)addr & 0x0003);
10702 					if ((extra_bytes != 0)
10703 					    &&
10704 					    ((scsiq->q2.
10705 					      tag_code &
10706 					      ASC_TAG_FLAG_EXTRA_BYTES)
10707 					     == 0)) {
10708 						scsiq->q2.tag_code |=
10709 						    ASC_TAG_FLAG_EXTRA_BYTES;
10710 						scsiq->q1.extra_bytes =
10711 						    extra_bytes;
10712 						data_cnt =
10713 						    le32_to_cpu(sg_head->
10714 								sg_list
10715 								[sg_entry_cnt_minus_one].
10716 								bytes);
10717 						data_cnt -=
10718 						    (ASC_DCNT) extra_bytes;
10719 						sg_head->
10720 						    sg_list
10721 						    [sg_entry_cnt_minus_one].
10722 						    bytes =
10723 						    cpu_to_le32(data_cnt);
10724 					}
10725 				}
10726 			}
10727 		}
10728 		sg_head->entry_to_copy = sg_head->entry_cnt;
10729 #if CC_VERY_LONG_SG_LIST
10730 		/*
10731 		 * Set the sg_entry_cnt to the maximum possible. The rest of
10732 		 * the SG elements will be copied when the RISC completes the
10733 		 * SG elements that fit and halts.
10734 		 */
10735 		if (sg_entry_cnt > ASC_MAX_SG_LIST) {
10736 			sg_entry_cnt = ASC_MAX_SG_LIST;
10737 		}
10738 #endif /* CC_VERY_LONG_SG_LIST */
10739 		n_q_required = AscSgListToQueue(sg_entry_cnt);
10740 		if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, n_q_required) >=
10741 		     (uint) n_q_required)
10742 		    || ((scsiq->q1.cntl & QC_URGENT) != 0)) {
10743 			if ((sta =
10744 			     AscSendScsiQueue(asc_dvc, scsiq,
10745 					      n_q_required)) == 1) {
10746 				asc_dvc->in_critical_cnt--;
10747 				return (sta);
10748 			}
10749 		}
10750 	} else {
10751 		if (asc_dvc->bug_fix_cntl) {
10752 			if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
10753 				if ((scsi_cmd == READ_6) ||
10754 				    (scsi_cmd == READ_10)) {
10755 					addr =
10756 					    le32_to_cpu(scsiq->q1.data_addr) +
10757 					    le32_to_cpu(scsiq->q1.data_cnt);
10758 					extra_bytes =
10759 					    (uchar)((ushort)addr & 0x0003);
10760 					if ((extra_bytes != 0)
10761 					    &&
10762 					    ((scsiq->q2.
10763 					      tag_code &
10764 					      ASC_TAG_FLAG_EXTRA_BYTES)
10765 					     == 0)) {
10766 						data_cnt =
10767 						    le32_to_cpu(scsiq->q1.
10768 								data_cnt);
10769 						if (((ushort)data_cnt & 0x01FF)
10770 						    == 0) {
10771 							scsiq->q2.tag_code |=
10772 							    ASC_TAG_FLAG_EXTRA_BYTES;
10773 							data_cnt -= (ASC_DCNT)
10774 							    extra_bytes;
10775 							scsiq->q1.data_cnt =
10776 							    cpu_to_le32
10777 							    (data_cnt);
10778 							scsiq->q1.extra_bytes =
10779 							    extra_bytes;
10780 						}
10781 					}
10782 				}
10783 			}
10784 		}
10785 		n_q_required = 1;
10786 		if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, 1) >= 1) ||
10787 		    ((scsiq->q1.cntl & QC_URGENT) != 0)) {
10788 			if ((sta = AscSendScsiQueue(asc_dvc, scsiq,
10789 						    n_q_required)) == 1) {
10790 				asc_dvc->in_critical_cnt--;
10791 				return (sta);
10792 			}
10793 		}
10794 	}
10795 	asc_dvc->in_critical_cnt--;
10796 	return (sta);
10797 }
10798 
10799 /*
10800  * AdvExeScsiQueue() - Send a request to the RISC microcode program.
10801  *
10802  *   Allocate a carrier structure, point the carrier to the ADV_SCSI_REQ_Q,
10803  *   add the carrier to the ICQ (Initiator Command Queue), and tickle the
10804  *   RISC to notify it a new command is ready to be executed.
10805  *
10806  * If 'done_status' is not set to QD_DO_RETRY, then 'error_retry' will be
10807  * set to SCSI_MAX_RETRY.
10808  *
10809  * Multi-byte fields in the ASC_SCSI_REQ_Q that are used by the microcode
10810  * for DMA addresses or math operations are byte swapped to little-endian
10811  * order.
10812  *
10813  * Return:
10814  *      ADV_SUCCESS(1) - The request was successfully queued.
10815  *      ADV_BUSY(0) -    Resource unavailable; Retry again after pending
10816  *                       request completes.
10817  *      ADV_ERROR(-1) -  Invalid ADV_SCSI_REQ_Q request structure
10818  *                       host IC error.
10819  */
10820 static int AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq)
10821 {
10822 	AdvPortAddr iop_base;
10823 	ADV_PADDR req_paddr;
10824 	ADV_CARR_T *new_carrp;
10825 
10826 	/*
10827 	 * The ADV_SCSI_REQ_Q 'target_id' field should never exceed ADV_MAX_TID.
10828 	 */
10829 	if (scsiq->target_id > ADV_MAX_TID) {
10830 		scsiq->host_status = QHSTA_M_INVALID_DEVICE;
10831 		scsiq->done_status = QD_WITH_ERROR;
10832 		return ADV_ERROR;
10833 	}
10834 
10835 	iop_base = asc_dvc->iop_base;
10836 
10837 	/*
10838 	 * Allocate a carrier ensuring at least one carrier always
10839 	 * remains on the freelist and initialize fields.
10840 	 */
10841 	if ((new_carrp = asc_dvc->carr_freelist) == NULL) {
10842 		return ADV_BUSY;
10843 	}
10844 	asc_dvc->carr_freelist = (ADV_CARR_T *)
10845 	    ADV_U32_TO_VADDR(le32_to_cpu(new_carrp->next_vpa));
10846 	asc_dvc->carr_pending_cnt++;
10847 
10848 	/*
10849 	 * Set the carrier to be a stopper by setting 'next_vpa'
10850 	 * to the stopper value. The current stopper will be changed
10851 	 * below to point to the new stopper.
10852 	 */
10853 	new_carrp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
10854 
10855 	/*
10856 	 * Clear the ADV_SCSI_REQ_Q done flag.
10857 	 */
10858 	scsiq->a_flag &= ~ADV_SCSIQ_DONE;
10859 
10860 	req_paddr = virt_to_bus(scsiq);
10861 	BUG_ON(req_paddr & 31);
10862 	/* Wait for assertion before making little-endian */
10863 	req_paddr = cpu_to_le32(req_paddr);
10864 
10865 	/* Save virtual and physical address of ADV_SCSI_REQ_Q and carrier. */
10866 	scsiq->scsiq_ptr = cpu_to_le32(ADV_VADDR_TO_U32(scsiq));
10867 	scsiq->scsiq_rptr = req_paddr;
10868 
10869 	scsiq->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->icq_sp));
10870 	/*
10871 	 * Every ADV_CARR_T.carr_pa is byte swapped to little-endian
10872 	 * order during initialization.
10873 	 */
10874 	scsiq->carr_pa = asc_dvc->icq_sp->carr_pa;
10875 
10876 	/*
10877 	 * Use the current stopper to send the ADV_SCSI_REQ_Q command to
10878 	 * the microcode. The newly allocated stopper will become the new
10879 	 * stopper.
10880 	 */
10881 	asc_dvc->icq_sp->areq_vpa = req_paddr;
10882 
10883 	/*
10884 	 * Set the 'next_vpa' pointer for the old stopper to be the
10885 	 * physical address of the new stopper. The RISC can only
10886 	 * follow physical addresses.
10887 	 */
10888 	asc_dvc->icq_sp->next_vpa = new_carrp->carr_pa;
10889 
10890 	/*
10891 	 * Set the host adapter stopper pointer to point to the new carrier.
10892 	 */
10893 	asc_dvc->icq_sp = new_carrp;
10894 
10895 	if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
10896 	    asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
10897 		/*
10898 		 * Tickle the RISC to tell it to read its Command Queue Head pointer.
10899 		 */
10900 		AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
10901 		if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
10902 			/*
10903 			 * Clear the tickle value. In the ASC-3550 the RISC flag
10904 			 * command 'clr_tickle_a' does not work unless the host
10905 			 * value is cleared.
10906 			 */
10907 			AdvWriteByteRegister(iop_base, IOPB_TICKLE,
10908 					     ADV_TICKLE_NOP);
10909 		}
10910 	} else if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
10911 		/*
10912 		 * Notify the RISC a carrier is ready by writing the physical
10913 		 * address of the new carrier stopper to the COMMA register.
10914 		 */
10915 		AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
10916 				      le32_to_cpu(new_carrp->carr_pa));
10917 	}
10918 
10919 	return ADV_SUCCESS;
10920 }
10921 
10922 /*
10923  * Execute a single 'Scsi_Cmnd'.
10924  */
10925 static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
10926 {
10927 	int ret, err_code;
10928 	struct asc_board *boardp = shost_priv(scp->device->host);
10929 
10930 	ASC_DBG(1, "scp 0x%p\n", scp);
10931 
10932 	if (ASC_NARROW_BOARD(boardp)) {
10933 		ASC_DVC_VAR *asc_dvc = &boardp->dvc_var.asc_dvc_var;
10934 		struct asc_scsi_q asc_scsi_q;
10935 
10936 		/* asc_build_req() can not return ASC_BUSY. */
10937 		ret = asc_build_req(boardp, scp, &asc_scsi_q);
10938 		if (ret == ASC_ERROR) {
10939 			ASC_STATS(scp->device->host, build_error);
10940 			return ASC_ERROR;
10941 		}
10942 
10943 		ret = AscExeScsiQueue(asc_dvc, &asc_scsi_q);
10944 		kfree(asc_scsi_q.sg_head);
10945 		err_code = asc_dvc->err_code;
10946 	} else {
10947 		ADV_DVC_VAR *adv_dvc = &boardp->dvc_var.adv_dvc_var;
10948 		ADV_SCSI_REQ_Q *adv_scsiqp;
10949 
10950 		switch (adv_build_req(boardp, scp, &adv_scsiqp)) {
10951 		case ASC_NOERROR:
10952 			ASC_DBG(3, "adv_build_req ASC_NOERROR\n");
10953 			break;
10954 		case ASC_BUSY:
10955 			ASC_DBG(1, "adv_build_req ASC_BUSY\n");
10956 			/*
10957 			 * The asc_stats fields 'adv_build_noreq' and
10958 			 * 'adv_build_nosg' count wide board busy conditions.
10959 			 * They are updated in adv_build_req and
10960 			 * adv_get_sglist, respectively.
10961 			 */
10962 			return ASC_BUSY;
10963 		case ASC_ERROR:
10964 		default:
10965 			ASC_DBG(1, "adv_build_req ASC_ERROR\n");
10966 			ASC_STATS(scp->device->host, build_error);
10967 			return ASC_ERROR;
10968 		}
10969 
10970 		ret = AdvExeScsiQueue(adv_dvc, adv_scsiqp);
10971 		err_code = adv_dvc->err_code;
10972 	}
10973 
10974 	switch (ret) {
10975 	case ASC_NOERROR:
10976 		ASC_STATS(scp->device->host, exe_noerror);
10977 		/*
10978 		 * Increment monotonically increasing per device
10979 		 * successful request counter. Wrapping doesn't matter.
10980 		 */
10981 		boardp->reqcnt[scp->device->id]++;
10982 		ASC_DBG(1, "ExeScsiQueue() ASC_NOERROR\n");
10983 		break;
10984 	case ASC_BUSY:
10985 		ASC_STATS(scp->device->host, exe_busy);
10986 		break;
10987 	case ASC_ERROR:
10988 		scmd_printk(KERN_ERR, scp, "ExeScsiQueue() ASC_ERROR, "
10989 			"err_code 0x%x\n", err_code);
10990 		ASC_STATS(scp->device->host, exe_error);
10991 		scp->result = HOST_BYTE(DID_ERROR);
10992 		break;
10993 	default:
10994 		scmd_printk(KERN_ERR, scp, "ExeScsiQueue() unknown, "
10995 			"err_code 0x%x\n", err_code);
10996 		ASC_STATS(scp->device->host, exe_unknown);
10997 		scp->result = HOST_BYTE(DID_ERROR);
10998 		break;
10999 	}
11000 
11001 	ASC_DBG(1, "end\n");
11002 	return ret;
11003 }
11004 
11005 /*
11006  * advansys_queuecommand() - interrupt-driven I/O entrypoint.
11007  *
11008  * This function always returns 0. Command return status is saved
11009  * in the 'scp' result field.
11010  */
11011 static int
11012 advansys_queuecommand(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
11013 {
11014 	struct Scsi_Host *shost = scp->device->host;
11015 	int asc_res, result = 0;
11016 
11017 	ASC_STATS(shost, queuecommand);
11018 	scp->scsi_done = done;
11019 
11020 	asc_res = asc_execute_scsi_cmnd(scp);
11021 
11022 	switch (asc_res) {
11023 	case ASC_NOERROR:
11024 		break;
11025 	case ASC_BUSY:
11026 		result = SCSI_MLQUEUE_HOST_BUSY;
11027 		break;
11028 	case ASC_ERROR:
11029 	default:
11030 		asc_scsi_done(scp);
11031 		break;
11032 	}
11033 
11034 	return result;
11035 }
11036 
11037 static ushort __devinit AscGetEisaChipCfg(PortAddr iop_base)
11038 {
11039 	PortAddr eisa_cfg_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
11040 	    (PortAddr) (ASC_EISA_CFG_IOP_MASK);
11041 	return inpw(eisa_cfg_iop);
11042 }
11043 
11044 /*
11045  * Return the BIOS address of the adapter at the specified
11046  * I/O port and with the specified bus type.
11047  */
11048 static unsigned short __devinit
11049 AscGetChipBiosAddress(PortAddr iop_base, unsigned short bus_type)
11050 {
11051 	unsigned short cfg_lsw;
11052 	unsigned short bios_addr;
11053 
11054 	/*
11055 	 * The PCI BIOS is re-located by the motherboard BIOS. Because
11056 	 * of this the driver can not determine where a PCI BIOS is
11057 	 * loaded and executes.
11058 	 */
11059 	if (bus_type & ASC_IS_PCI)
11060 		return 0;
11061 
11062 	if ((bus_type & ASC_IS_EISA) != 0) {
11063 		cfg_lsw = AscGetEisaChipCfg(iop_base);
11064 		cfg_lsw &= 0x000F;
11065 		bios_addr = ASC_BIOS_MIN_ADDR + cfg_lsw * ASC_BIOS_BANK_SIZE;
11066 		return bios_addr;
11067 	}
11068 
11069 	cfg_lsw = AscGetChipCfgLsw(iop_base);
11070 
11071 	/*
11072 	 *  ISA PnP uses the top bit as the 32K BIOS flag
11073 	 */
11074 	if (bus_type == ASC_IS_ISAPNP)
11075 		cfg_lsw &= 0x7FFF;
11076 	bios_addr = ASC_BIOS_MIN_ADDR + (cfg_lsw >> 12) * ASC_BIOS_BANK_SIZE;
11077 	return bios_addr;
11078 }
11079 
11080 static uchar __devinit AscSetChipScsiID(PortAddr iop_base, uchar new_host_id)
11081 {
11082 	ushort cfg_lsw;
11083 
11084 	if (AscGetChipScsiID(iop_base) == new_host_id) {
11085 		return (new_host_id);
11086 	}
11087 	cfg_lsw = AscGetChipCfgLsw(iop_base);
11088 	cfg_lsw &= 0xF8FF;
11089 	cfg_lsw |= (ushort)((new_host_id & ASC_MAX_TID) << 8);
11090 	AscSetChipCfgLsw(iop_base, cfg_lsw);
11091 	return (AscGetChipScsiID(iop_base));
11092 }
11093 
11094 static unsigned char __devinit AscGetChipScsiCtrl(PortAddr iop_base)
11095 {
11096 	unsigned char sc;
11097 
11098 	AscSetBank(iop_base, 1);
11099 	sc = inp(iop_base + IOP_REG_SC);
11100 	AscSetBank(iop_base, 0);
11101 	return sc;
11102 }
11103 
11104 static unsigned char __devinit
11105 AscGetChipVersion(PortAddr iop_base, unsigned short bus_type)
11106 {
11107 	if (bus_type & ASC_IS_EISA) {
11108 		PortAddr eisa_iop;
11109 		unsigned char revision;
11110 		eisa_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
11111 		    (PortAddr) ASC_EISA_REV_IOP_MASK;
11112 		revision = inp(eisa_iop);
11113 		return ASC_CHIP_MIN_VER_EISA - 1 + revision;
11114 	}
11115 	return AscGetChipVerNo(iop_base);
11116 }
11117 
11118 #ifdef CONFIG_ISA
11119 static void __devinit AscEnableIsaDma(uchar dma_channel)
11120 {
11121 	if (dma_channel < 4) {
11122 		outp(0x000B, (ushort)(0xC0 | dma_channel));
11123 		outp(0x000A, dma_channel);
11124 	} else if (dma_channel < 8) {
11125 		outp(0x00D6, (ushort)(0xC0 | (dma_channel - 4)));
11126 		outp(0x00D4, (ushort)(dma_channel - 4));
11127 	}
11128 }
11129 #endif /* CONFIG_ISA */
11130 
11131 static int AscStopQueueExe(PortAddr iop_base)
11132 {
11133 	int count = 0;
11134 
11135 	if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) == 0) {
11136 		AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
11137 				 ASC_STOP_REQ_RISC_STOP);
11138 		do {
11139 			if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) &
11140 			    ASC_STOP_ACK_RISC_STOP) {
11141 				return (1);
11142 			}
11143 			mdelay(100);
11144 		} while (count++ < 20);
11145 	}
11146 	return (0);
11147 }
11148 
11149 static ASC_DCNT __devinit AscGetMaxDmaCount(ushort bus_type)
11150 {
11151 	if (bus_type & ASC_IS_ISA)
11152 		return ASC_MAX_ISA_DMA_COUNT;
11153 	else if (bus_type & (ASC_IS_EISA | ASC_IS_VL))
11154 		return ASC_MAX_VL_DMA_COUNT;
11155 	return ASC_MAX_PCI_DMA_COUNT;
11156 }
11157 
11158 #ifdef CONFIG_ISA
11159 static ushort __devinit AscGetIsaDmaChannel(PortAddr iop_base)
11160 {
11161 	ushort channel;
11162 
11163 	channel = AscGetChipCfgLsw(iop_base) & 0x0003;
11164 	if (channel == 0x03)
11165 		return (0);
11166 	else if (channel == 0x00)
11167 		return (7);
11168 	return (channel + 4);
11169 }
11170 
11171 static ushort __devinit AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channel)
11172 {
11173 	ushort cfg_lsw;
11174 	uchar value;
11175 
11176 	if ((dma_channel >= 5) && (dma_channel <= 7)) {
11177 		if (dma_channel == 7)
11178 			value = 0x00;
11179 		else
11180 			value = dma_channel - 4;
11181 		cfg_lsw = AscGetChipCfgLsw(iop_base) & 0xFFFC;
11182 		cfg_lsw |= value;
11183 		AscSetChipCfgLsw(iop_base, cfg_lsw);
11184 		return (AscGetIsaDmaChannel(iop_base));
11185 	}
11186 	return 0;
11187 }
11188 
11189 static uchar __devinit AscGetIsaDmaSpeed(PortAddr iop_base)
11190 {
11191 	uchar speed_value;
11192 
11193 	AscSetBank(iop_base, 1);
11194 	speed_value = AscReadChipDmaSpeed(iop_base);
11195 	speed_value &= 0x07;
11196 	AscSetBank(iop_base, 0);
11197 	return speed_value;
11198 }
11199 
11200 static uchar __devinit AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value)
11201 {
11202 	speed_value &= 0x07;
11203 	AscSetBank(iop_base, 1);
11204 	AscWriteChipDmaSpeed(iop_base, speed_value);
11205 	AscSetBank(iop_base, 0);
11206 	return AscGetIsaDmaSpeed(iop_base);
11207 }
11208 #endif /* CONFIG_ISA */
11209 
11210 static ushort __devinit AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc)
11211 {
11212 	int i;
11213 	PortAddr iop_base;
11214 	ushort warn_code;
11215 	uchar chip_version;
11216 
11217 	iop_base = asc_dvc->iop_base;
11218 	warn_code = 0;
11219 	asc_dvc->err_code = 0;
11220 	if ((asc_dvc->bus_type &
11221 	     (ASC_IS_ISA | ASC_IS_PCI | ASC_IS_EISA | ASC_IS_VL)) == 0) {
11222 		asc_dvc->err_code |= ASC_IERR_NO_BUS_TYPE;
11223 	}
11224 	AscSetChipControl(iop_base, CC_HALT);
11225 	AscSetChipStatus(iop_base, 0);
11226 	asc_dvc->bug_fix_cntl = 0;
11227 	asc_dvc->pci_fix_asyn_xfer = 0;
11228 	asc_dvc->pci_fix_asyn_xfer_always = 0;
11229 	/* asc_dvc->init_state initalized in AscInitGetConfig(). */
11230 	asc_dvc->sdtr_done = 0;
11231 	asc_dvc->cur_total_qng = 0;
11232 	asc_dvc->is_in_int = 0;
11233 	asc_dvc->in_critical_cnt = 0;
11234 	asc_dvc->last_q_shortage = 0;
11235 	asc_dvc->use_tagged_qng = 0;
11236 	asc_dvc->no_scam = 0;
11237 	asc_dvc->unit_not_ready = 0;
11238 	asc_dvc->queue_full_or_busy = 0;
11239 	asc_dvc->redo_scam = 0;
11240 	asc_dvc->res2 = 0;
11241 	asc_dvc->min_sdtr_index = 0;
11242 	asc_dvc->cfg->can_tagged_qng = 0;
11243 	asc_dvc->cfg->cmd_qng_enabled = 0;
11244 	asc_dvc->dvc_cntl = ASC_DEF_DVC_CNTL;
11245 	asc_dvc->init_sdtr = 0;
11246 	asc_dvc->max_total_qng = ASC_DEF_MAX_TOTAL_QNG;
11247 	asc_dvc->scsi_reset_wait = 3;
11248 	asc_dvc->start_motor = ASC_SCSI_WIDTH_BIT_SET;
11249 	asc_dvc->max_dma_count = AscGetMaxDmaCount(asc_dvc->bus_type);
11250 	asc_dvc->cfg->sdtr_enable = ASC_SCSI_WIDTH_BIT_SET;
11251 	asc_dvc->cfg->disc_enable = ASC_SCSI_WIDTH_BIT_SET;
11252 	asc_dvc->cfg->chip_scsi_id = ASC_DEF_CHIP_SCSI_ID;
11253 	chip_version = AscGetChipVersion(iop_base, asc_dvc->bus_type);
11254 	asc_dvc->cfg->chip_version = chip_version;
11255 	asc_dvc->sdtr_period_tbl = asc_syn_xfer_period;
11256 	asc_dvc->max_sdtr_index = 7;
11257 	if ((asc_dvc->bus_type & ASC_IS_PCI) &&
11258 	    (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3150)) {
11259 		asc_dvc->bus_type = ASC_IS_PCI_ULTRA;
11260 		asc_dvc->sdtr_period_tbl = asc_syn_ultra_xfer_period;
11261 		asc_dvc->max_sdtr_index = 15;
11262 		if (chip_version == ASC_CHIP_VER_PCI_ULTRA_3150) {
11263 			AscSetExtraControl(iop_base,
11264 					   (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
11265 		} else if (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3050) {
11266 			AscSetExtraControl(iop_base,
11267 					   (SEC_ACTIVE_NEGATE |
11268 					    SEC_ENABLE_FILTER));
11269 		}
11270 	}
11271 	if (asc_dvc->bus_type == ASC_IS_PCI) {
11272 		AscSetExtraControl(iop_base,
11273 				   (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
11274 	}
11275 
11276 	asc_dvc->cfg->isa_dma_speed = ASC_DEF_ISA_DMA_SPEED;
11277 #ifdef CONFIG_ISA
11278 	if ((asc_dvc->bus_type & ASC_IS_ISA) != 0) {
11279 		if (chip_version >= ASC_CHIP_MIN_VER_ISA_PNP) {
11280 			AscSetChipIFC(iop_base, IFC_INIT_DEFAULT);
11281 			asc_dvc->bus_type = ASC_IS_ISAPNP;
11282 		}
11283 		asc_dvc->cfg->isa_dma_channel =
11284 		    (uchar)AscGetIsaDmaChannel(iop_base);
11285 	}
11286 #endif /* CONFIG_ISA */
11287 	for (i = 0; i <= ASC_MAX_TID; i++) {
11288 		asc_dvc->cur_dvc_qng[i] = 0;
11289 		asc_dvc->max_dvc_qng[i] = ASC_MAX_SCSI1_QNG;
11290 		asc_dvc->scsiq_busy_head[i] = (ASC_SCSI_Q *)0L;
11291 		asc_dvc->scsiq_busy_tail[i] = (ASC_SCSI_Q *)0L;
11292 		asc_dvc->cfg->max_tag_qng[i] = ASC_MAX_INRAM_TAG_QNG;
11293 	}
11294 	return warn_code;
11295 }
11296 
11297 static int __devinit AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg)
11298 {
11299 	int retry;
11300 
11301 	for (retry = 0; retry < ASC_EEP_MAX_RETRY; retry++) {
11302 		unsigned char read_back;
11303 		AscSetChipEEPCmd(iop_base, cmd_reg);
11304 		mdelay(1);
11305 		read_back = AscGetChipEEPCmd(iop_base);
11306 		if (read_back == cmd_reg)
11307 			return 1;
11308 	}
11309 	return 0;
11310 }
11311 
11312 static void __devinit AscWaitEEPRead(void)
11313 {
11314 	mdelay(1);
11315 }
11316 
11317 static ushort __devinit AscReadEEPWord(PortAddr iop_base, uchar addr)
11318 {
11319 	ushort read_wval;
11320 	uchar cmd_reg;
11321 
11322 	AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
11323 	AscWaitEEPRead();
11324 	cmd_reg = addr | ASC_EEP_CMD_READ;
11325 	AscWriteEEPCmdReg(iop_base, cmd_reg);
11326 	AscWaitEEPRead();
11327 	read_wval = AscGetChipEEPData(iop_base);
11328 	AscWaitEEPRead();
11329 	return read_wval;
11330 }
11331 
11332 static ushort __devinit
11333 AscGetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
11334 {
11335 	ushort wval;
11336 	ushort sum;
11337 	ushort *wbuf;
11338 	int cfg_beg;
11339 	int cfg_end;
11340 	int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
11341 	int s_addr;
11342 
11343 	wbuf = (ushort *)cfg_buf;
11344 	sum = 0;
11345 	/* Read two config words; Byte-swapping done by AscReadEEPWord(). */
11346 	for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
11347 		*wbuf = AscReadEEPWord(iop_base, (uchar)s_addr);
11348 		sum += *wbuf;
11349 	}
11350 	if (bus_type & ASC_IS_VL) {
11351 		cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
11352 		cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
11353 	} else {
11354 		cfg_beg = ASC_EEP_DVC_CFG_BEG;
11355 		cfg_end = ASC_EEP_MAX_DVC_ADDR;
11356 	}
11357 	for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
11358 		wval = AscReadEEPWord(iop_base, (uchar)s_addr);
11359 		if (s_addr <= uchar_end_in_config) {
11360 			/*
11361 			 * Swap all char fields - must unswap bytes already swapped
11362 			 * by AscReadEEPWord().
11363 			 */
11364 			*wbuf = le16_to_cpu(wval);
11365 		} else {
11366 			/* Don't swap word field at the end - cntl field. */
11367 			*wbuf = wval;
11368 		}
11369 		sum += wval;	/* Checksum treats all EEPROM data as words. */
11370 	}
11371 	/*
11372 	 * Read the checksum word which will be compared against 'sum'
11373 	 * by the caller. Word field already swapped.
11374 	 */
11375 	*wbuf = AscReadEEPWord(iop_base, (uchar)s_addr);
11376 	return sum;
11377 }
11378 
11379 static int __devinit AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
11380 {
11381 	PortAddr iop_base;
11382 	ushort q_addr;
11383 	ushort saved_word;
11384 	int sta;
11385 
11386 	iop_base = asc_dvc->iop_base;
11387 	sta = 0;
11388 	q_addr = ASC_QNO_TO_QADDR(241);
11389 	saved_word = AscReadLramWord(iop_base, q_addr);
11390 	AscSetChipLramAddr(iop_base, q_addr);
11391 	AscSetChipLramData(iop_base, 0x55AA);
11392 	mdelay(10);
11393 	AscSetChipLramAddr(iop_base, q_addr);
11394 	if (AscGetChipLramData(iop_base) == 0x55AA) {
11395 		sta = 1;
11396 		AscWriteLramWord(iop_base, q_addr, saved_word);
11397 	}
11398 	return (sta);
11399 }
11400 
11401 static void __devinit AscWaitEEPWrite(void)
11402 {
11403 	mdelay(20);
11404 }
11405 
11406 static int __devinit AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
11407 {
11408 	ushort read_back;
11409 	int retry;
11410 
11411 	retry = 0;
11412 	while (TRUE) {
11413 		AscSetChipEEPData(iop_base, data_reg);
11414 		mdelay(1);
11415 		read_back = AscGetChipEEPData(iop_base);
11416 		if (read_back == data_reg) {
11417 			return (1);
11418 		}
11419 		if (retry++ > ASC_EEP_MAX_RETRY) {
11420 			return (0);
11421 		}
11422 	}
11423 }
11424 
11425 static ushort __devinit
11426 AscWriteEEPWord(PortAddr iop_base, uchar addr, ushort word_val)
11427 {
11428 	ushort read_wval;
11429 
11430 	read_wval = AscReadEEPWord(iop_base, addr);
11431 	if (read_wval != word_val) {
11432 		AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_ABLE);
11433 		AscWaitEEPRead();
11434 		AscWriteEEPDataReg(iop_base, word_val);
11435 		AscWaitEEPRead();
11436 		AscWriteEEPCmdReg(iop_base,
11437 				  (uchar)((uchar)ASC_EEP_CMD_WRITE | addr));
11438 		AscWaitEEPWrite();
11439 		AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
11440 		AscWaitEEPRead();
11441 		return (AscReadEEPWord(iop_base, addr));
11442 	}
11443 	return (read_wval);
11444 }
11445 
11446 static int __devinit
11447 AscSetEEPConfigOnce(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
11448 {
11449 	int n_error;
11450 	ushort *wbuf;
11451 	ushort word;
11452 	ushort sum;
11453 	int s_addr;
11454 	int cfg_beg;
11455 	int cfg_end;
11456 	int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
11457 
11458 	wbuf = (ushort *)cfg_buf;
11459 	n_error = 0;
11460 	sum = 0;
11461 	/* Write two config words; AscWriteEEPWord() will swap bytes. */
11462 	for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
11463 		sum += *wbuf;
11464 		if (*wbuf != AscWriteEEPWord(iop_base, (uchar)s_addr, *wbuf)) {
11465 			n_error++;
11466 		}
11467 	}
11468 	if (bus_type & ASC_IS_VL) {
11469 		cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
11470 		cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
11471 	} else {
11472 		cfg_beg = ASC_EEP_DVC_CFG_BEG;
11473 		cfg_end = ASC_EEP_MAX_DVC_ADDR;
11474 	}
11475 	for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
11476 		if (s_addr <= uchar_end_in_config) {
11477 			/*
11478 			 * This is a char field. Swap char fields before they are
11479 			 * swapped again by AscWriteEEPWord().
11480 			 */
11481 			word = cpu_to_le16(*wbuf);
11482 			if (word !=
11483 			    AscWriteEEPWord(iop_base, (uchar)s_addr, word)) {
11484 				n_error++;
11485 			}
11486 		} else {
11487 			/* Don't swap word field at the end - cntl field. */
11488 			if (*wbuf !=
11489 			    AscWriteEEPWord(iop_base, (uchar)s_addr, *wbuf)) {
11490 				n_error++;
11491 			}
11492 		}
11493 		sum += *wbuf;	/* Checksum calculated from word values. */
11494 	}
11495 	/* Write checksum word. It will be swapped by AscWriteEEPWord(). */
11496 	*wbuf = sum;
11497 	if (sum != AscWriteEEPWord(iop_base, (uchar)s_addr, sum)) {
11498 		n_error++;
11499 	}
11500 
11501 	/* Read EEPROM back again. */
11502 	wbuf = (ushort *)cfg_buf;
11503 	/*
11504 	 * Read two config words; Byte-swapping done by AscReadEEPWord().
11505 	 */
11506 	for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
11507 		if (*wbuf != AscReadEEPWord(iop_base, (uchar)s_addr)) {
11508 			n_error++;
11509 		}
11510 	}
11511 	if (bus_type & ASC_IS_VL) {
11512 		cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
11513 		cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
11514 	} else {
11515 		cfg_beg = ASC_EEP_DVC_CFG_BEG;
11516 		cfg_end = ASC_EEP_MAX_DVC_ADDR;
11517 	}
11518 	for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
11519 		if (s_addr <= uchar_end_in_config) {
11520 			/*
11521 			 * Swap all char fields. Must unswap bytes already swapped
11522 			 * by AscReadEEPWord().
11523 			 */
11524 			word =
11525 			    le16_to_cpu(AscReadEEPWord
11526 					(iop_base, (uchar)s_addr));
11527 		} else {
11528 			/* Don't swap word field at the end - cntl field. */
11529 			word = AscReadEEPWord(iop_base, (uchar)s_addr);
11530 		}
11531 		if (*wbuf != word) {
11532 			n_error++;
11533 		}
11534 	}
11535 	/* Read checksum; Byte swapping not needed. */
11536 	if (AscReadEEPWord(iop_base, (uchar)s_addr) != sum) {
11537 		n_error++;
11538 	}
11539 	return n_error;
11540 }
11541 
11542 static int __devinit
11543 AscSetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
11544 {
11545 	int retry;
11546 	int n_error;
11547 
11548 	retry = 0;
11549 	while (TRUE) {
11550 		if ((n_error = AscSetEEPConfigOnce(iop_base, cfg_buf,
11551 						   bus_type)) == 0) {
11552 			break;
11553 		}
11554 		if (++retry > ASC_EEP_MAX_RETRY) {
11555 			break;
11556 		}
11557 	}
11558 	return n_error;
11559 }
11560 
11561 static ushort __devinit AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
11562 {
11563 	ASCEEP_CONFIG eep_config_buf;
11564 	ASCEEP_CONFIG *eep_config;
11565 	PortAddr iop_base;
11566 	ushort chksum;
11567 	ushort warn_code;
11568 	ushort cfg_msw, cfg_lsw;
11569 	int i;
11570 	int write_eep = 0;
11571 
11572 	iop_base = asc_dvc->iop_base;
11573 	warn_code = 0;
11574 	AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0x00FE);
11575 	AscStopQueueExe(iop_base);
11576 	if ((AscStopChip(iop_base) == FALSE) ||
11577 	    (AscGetChipScsiCtrl(iop_base) != 0)) {
11578 		asc_dvc->init_state |= ASC_INIT_RESET_SCSI_DONE;
11579 		AscResetChipAndScsiBus(asc_dvc);
11580 		mdelay(asc_dvc->scsi_reset_wait * 1000); /* XXX: msleep? */
11581 	}
11582 	if (AscIsChipHalted(iop_base) == FALSE) {
11583 		asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
11584 		return (warn_code);
11585 	}
11586 	AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
11587 	if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
11588 		asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
11589 		return (warn_code);
11590 	}
11591 	eep_config = (ASCEEP_CONFIG *)&eep_config_buf;
11592 	cfg_msw = AscGetChipCfgMsw(iop_base);
11593 	cfg_lsw = AscGetChipCfgLsw(iop_base);
11594 	if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
11595 		cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
11596 		warn_code |= ASC_WARN_CFG_MSW_RECOVER;
11597 		AscSetChipCfgMsw(iop_base, cfg_msw);
11598 	}
11599 	chksum = AscGetEEPConfig(iop_base, eep_config, asc_dvc->bus_type);
11600 	ASC_DBG(1, "chksum 0x%x\n", chksum);
11601 	if (chksum == 0) {
11602 		chksum = 0xaa55;
11603 	}
11604 	if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
11605 		warn_code |= ASC_WARN_AUTO_CONFIG;
11606 		if (asc_dvc->cfg->chip_version == 3) {
11607 			if (eep_config->cfg_lsw != cfg_lsw) {
11608 				warn_code |= ASC_WARN_EEPROM_RECOVER;
11609 				eep_config->cfg_lsw =
11610 				    AscGetChipCfgLsw(iop_base);
11611 			}
11612 			if (eep_config->cfg_msw != cfg_msw) {
11613 				warn_code |= ASC_WARN_EEPROM_RECOVER;
11614 				eep_config->cfg_msw =
11615 				    AscGetChipCfgMsw(iop_base);
11616 			}
11617 		}
11618 	}
11619 	eep_config->cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
11620 	eep_config->cfg_lsw |= ASC_CFG0_HOST_INT_ON;
11621 	ASC_DBG(1, "eep_config->chksum 0x%x\n", eep_config->chksum);
11622 	if (chksum != eep_config->chksum) {
11623 		if (AscGetChipVersion(iop_base, asc_dvc->bus_type) ==
11624 		    ASC_CHIP_VER_PCI_ULTRA_3050) {
11625 			ASC_DBG(1, "chksum error ignored; EEPROM-less board\n");
11626 			eep_config->init_sdtr = 0xFF;
11627 			eep_config->disc_enable = 0xFF;
11628 			eep_config->start_motor = 0xFF;
11629 			eep_config->use_cmd_qng = 0;
11630 			eep_config->max_total_qng = 0xF0;
11631 			eep_config->max_tag_qng = 0x20;
11632 			eep_config->cntl = 0xBFFF;
11633 			ASC_EEP_SET_CHIP_ID(eep_config, 7);
11634 			eep_config->no_scam = 0;
11635 			eep_config->adapter_info[0] = 0;
11636 			eep_config->adapter_info[1] = 0;
11637 			eep_config->adapter_info[2] = 0;
11638 			eep_config->adapter_info[3] = 0;
11639 			eep_config->adapter_info[4] = 0;
11640 			/* Indicate EEPROM-less board. */
11641 			eep_config->adapter_info[5] = 0xBB;
11642 		} else {
11643 			ASC_PRINT
11644 			    ("AscInitFromEEP: EEPROM checksum error; Will try to re-write EEPROM.\n");
11645 			write_eep = 1;
11646 			warn_code |= ASC_WARN_EEPROM_CHKSUM;
11647 		}
11648 	}
11649 	asc_dvc->cfg->sdtr_enable = eep_config->init_sdtr;
11650 	asc_dvc->cfg->disc_enable = eep_config->disc_enable;
11651 	asc_dvc->cfg->cmd_qng_enabled = eep_config->use_cmd_qng;
11652 	asc_dvc->cfg->isa_dma_speed = ASC_EEP_GET_DMA_SPD(eep_config);
11653 	asc_dvc->start_motor = eep_config->start_motor;
11654 	asc_dvc->dvc_cntl = eep_config->cntl;
11655 	asc_dvc->no_scam = eep_config->no_scam;
11656 	asc_dvc->cfg->adapter_info[0] = eep_config->adapter_info[0];
11657 	asc_dvc->cfg->adapter_info[1] = eep_config->adapter_info[1];
11658 	asc_dvc->cfg->adapter_info[2] = eep_config->adapter_info[2];
11659 	asc_dvc->cfg->adapter_info[3] = eep_config->adapter_info[3];
11660 	asc_dvc->cfg->adapter_info[4] = eep_config->adapter_info[4];
11661 	asc_dvc->cfg->adapter_info[5] = eep_config->adapter_info[5];
11662 	if (!AscTestExternalLram(asc_dvc)) {
11663 		if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) ==
11664 		     ASC_IS_PCI_ULTRA)) {
11665 			eep_config->max_total_qng =
11666 			    ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG;
11667 			eep_config->max_tag_qng =
11668 			    ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG;
11669 		} else {
11670 			eep_config->cfg_msw |= 0x0800;
11671 			cfg_msw |= 0x0800;
11672 			AscSetChipCfgMsw(iop_base, cfg_msw);
11673 			eep_config->max_total_qng = ASC_MAX_PCI_INRAM_TOTAL_QNG;
11674 			eep_config->max_tag_qng = ASC_MAX_INRAM_TAG_QNG;
11675 		}
11676 	} else {
11677 	}
11678 	if (eep_config->max_total_qng < ASC_MIN_TOTAL_QNG) {
11679 		eep_config->max_total_qng = ASC_MIN_TOTAL_QNG;
11680 	}
11681 	if (eep_config->max_total_qng > ASC_MAX_TOTAL_QNG) {
11682 		eep_config->max_total_qng = ASC_MAX_TOTAL_QNG;
11683 	}
11684 	if (eep_config->max_tag_qng > eep_config->max_total_qng) {
11685 		eep_config->max_tag_qng = eep_config->max_total_qng;
11686 	}
11687 	if (eep_config->max_tag_qng < ASC_MIN_TAG_Q_PER_DVC) {
11688 		eep_config->max_tag_qng = ASC_MIN_TAG_Q_PER_DVC;
11689 	}
11690 	asc_dvc->max_total_qng = eep_config->max_total_qng;
11691 	if ((eep_config->use_cmd_qng & eep_config->disc_enable) !=
11692 	    eep_config->use_cmd_qng) {
11693 		eep_config->disc_enable = eep_config->use_cmd_qng;
11694 		warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
11695 	}
11696 	ASC_EEP_SET_CHIP_ID(eep_config,
11697 			    ASC_EEP_GET_CHIP_ID(eep_config) & ASC_MAX_TID);
11698 	asc_dvc->cfg->chip_scsi_id = ASC_EEP_GET_CHIP_ID(eep_config);
11699 	if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) &&
11700 	    !(asc_dvc->dvc_cntl & ASC_CNTL_SDTR_ENABLE_ULTRA)) {
11701 		asc_dvc->min_sdtr_index = ASC_SDTR_ULTRA_PCI_10MB_INDEX;
11702 	}
11703 
11704 	for (i = 0; i <= ASC_MAX_TID; i++) {
11705 		asc_dvc->dos_int13_table[i] = eep_config->dos_int13_table[i];
11706 		asc_dvc->cfg->max_tag_qng[i] = eep_config->max_tag_qng;
11707 		asc_dvc->cfg->sdtr_period_offset[i] =
11708 		    (uchar)(ASC_DEF_SDTR_OFFSET |
11709 			    (asc_dvc->min_sdtr_index << 4));
11710 	}
11711 	eep_config->cfg_msw = AscGetChipCfgMsw(iop_base);
11712 	if (write_eep) {
11713 		if ((i = AscSetEEPConfig(iop_base, eep_config,
11714 				     asc_dvc->bus_type)) != 0) {
11715 			ASC_PRINT1
11716 			    ("AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n",
11717 			     i);
11718 		} else {
11719 			ASC_PRINT
11720 			    ("AscInitFromEEP: Successfully re-wrote EEPROM.\n");
11721 		}
11722 	}
11723 	return (warn_code);
11724 }
11725 
11726 static int __devinit AscInitGetConfig(struct Scsi_Host *shost)
11727 {
11728 	struct asc_board *board = shost_priv(shost);
11729 	ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var;
11730 	unsigned short warn_code = 0;
11731 
11732 	asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG;
11733 	if (asc_dvc->err_code != 0)
11734 		return asc_dvc->err_code;
11735 
11736 	if (AscFindSignature(asc_dvc->iop_base)) {
11737 		warn_code |= AscInitAscDvcVar(asc_dvc);
11738 		warn_code |= AscInitFromEEP(asc_dvc);
11739 		asc_dvc->init_state |= ASC_INIT_STATE_END_GET_CFG;
11740 		if (asc_dvc->scsi_reset_wait > ASC_MAX_SCSI_RESET_WAIT)
11741 			asc_dvc->scsi_reset_wait = ASC_MAX_SCSI_RESET_WAIT;
11742 	} else {
11743 		asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
11744 	}
11745 
11746 	switch (warn_code) {
11747 	case 0:	/* No error */
11748 		break;
11749 	case ASC_WARN_IO_PORT_ROTATE:
11750 		shost_printk(KERN_WARNING, shost, "I/O port address "
11751 				"modified\n");
11752 		break;
11753 	case ASC_WARN_AUTO_CONFIG:
11754 		shost_printk(KERN_WARNING, shost, "I/O port increment switch "
11755 				"enabled\n");
11756 		break;
11757 	case ASC_WARN_EEPROM_CHKSUM:
11758 		shost_printk(KERN_WARNING, shost, "EEPROM checksum error\n");
11759 		break;
11760 	case ASC_WARN_IRQ_MODIFIED:
11761 		shost_printk(KERN_WARNING, shost, "IRQ modified\n");
11762 		break;
11763 	case ASC_WARN_CMD_QNG_CONFLICT:
11764 		shost_printk(KERN_WARNING, shost, "tag queuing enabled w/o "
11765 				"disconnects\n");
11766 		break;
11767 	default:
11768 		shost_printk(KERN_WARNING, shost, "unknown warning: 0x%x\n",
11769 				warn_code);
11770 		break;
11771 	}
11772 
11773 	if (asc_dvc->err_code != 0)
11774 		shost_printk(KERN_ERR, shost, "error 0x%x at init_state "
11775 			"0x%x\n", asc_dvc->err_code, asc_dvc->init_state);
11776 
11777 	return asc_dvc->err_code;
11778 }
11779 
11780 static int __devinit AscInitSetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
11781 {
11782 	struct asc_board *board = shost_priv(shost);
11783 	ASC_DVC_VAR *asc_dvc = &board->dvc_var.asc_dvc_var;
11784 	PortAddr iop_base = asc_dvc->iop_base;
11785 	unsigned short cfg_msw;
11786 	unsigned short warn_code = 0;
11787 
11788 	asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
11789 	if (asc_dvc->err_code != 0)
11790 		return asc_dvc->err_code;
11791 	if (!AscFindSignature(asc_dvc->iop_base)) {
11792 		asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
11793 		return asc_dvc->err_code;
11794 	}
11795 
11796 	cfg_msw = AscGetChipCfgMsw(iop_base);
11797 	if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
11798 		cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
11799 		warn_code |= ASC_WARN_CFG_MSW_RECOVER;
11800 		AscSetChipCfgMsw(iop_base, cfg_msw);
11801 	}
11802 	if ((asc_dvc->cfg->cmd_qng_enabled & asc_dvc->cfg->disc_enable) !=
11803 	    asc_dvc->cfg->cmd_qng_enabled) {
11804 		asc_dvc->cfg->disc_enable = asc_dvc->cfg->cmd_qng_enabled;
11805 		warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
11806 	}
11807 	if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
11808 		warn_code |= ASC_WARN_AUTO_CONFIG;
11809 	}
11810 #ifdef CONFIG_PCI
11811 	if (asc_dvc->bus_type & ASC_IS_PCI) {
11812 		cfg_msw &= 0xFFC0;
11813 		AscSetChipCfgMsw(iop_base, cfg_msw);
11814 		if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) {
11815 		} else {
11816 			if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) ||
11817 			    (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) {
11818 				asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_IF_NOT_DWB;
11819 				asc_dvc->bug_fix_cntl |=
11820 				    ASC_BUG_FIX_ASYN_USE_SYN;
11821 			}
11822 		}
11823 	} else
11824 #endif /* CONFIG_PCI */
11825 	if (asc_dvc->bus_type == ASC_IS_ISAPNP) {
11826 		if (AscGetChipVersion(iop_base, asc_dvc->bus_type)
11827 		    == ASC_CHIP_VER_ASYN_BUG) {
11828 			asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_ASYN_USE_SYN;
11829 		}
11830 	}
11831 	if (AscSetChipScsiID(iop_base, asc_dvc->cfg->chip_scsi_id) !=
11832 	    asc_dvc->cfg->chip_scsi_id) {
11833 		asc_dvc->err_code |= ASC_IERR_SET_SCSI_ID;
11834 	}
11835 #ifdef CONFIG_ISA
11836 	if (asc_dvc->bus_type & ASC_IS_ISA) {
11837 		AscSetIsaDmaChannel(iop_base, asc_dvc->cfg->isa_dma_channel);
11838 		AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
11839 	}
11840 #endif /* CONFIG_ISA */
11841 
11842 	asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
11843 
11844 	switch (warn_code) {
11845 	case 0:	/* No error. */
11846 		break;
11847 	case ASC_WARN_IO_PORT_ROTATE:
11848 		shost_printk(KERN_WARNING, shost, "I/O port address "
11849 				"modified\n");
11850 		break;
11851 	case ASC_WARN_AUTO_CONFIG:
11852 		shost_printk(KERN_WARNING, shost, "I/O port increment switch "
11853 				"enabled\n");
11854 		break;
11855 	case ASC_WARN_EEPROM_CHKSUM:
11856 		shost_printk(KERN_WARNING, shost, "EEPROM checksum error\n");
11857 		break;
11858 	case ASC_WARN_IRQ_MODIFIED:
11859 		shost_printk(KERN_WARNING, shost, "IRQ modified\n");
11860 		break;
11861 	case ASC_WARN_CMD_QNG_CONFLICT:
11862 		shost_printk(KERN_WARNING, shost, "tag queuing w/o "
11863 				"disconnects\n");
11864 		break;
11865 	default:
11866 		shost_printk(KERN_WARNING, shost, "unknown warning: 0x%x\n",
11867 				warn_code);
11868 		break;
11869 	}
11870 
11871 	if (asc_dvc->err_code != 0)
11872 		shost_printk(KERN_ERR, shost, "error 0x%x at init_state "
11873 			"0x%x\n", asc_dvc->err_code, asc_dvc->init_state);
11874 
11875 	return asc_dvc->err_code;
11876 }
11877 
11878 /*
11879  * EEPROM Configuration.
11880  *
11881  * All drivers should use this structure to set the default EEPROM
11882  * configuration. The BIOS now uses this structure when it is built.
11883  * Additional structure information can be found in a_condor.h where
11884  * the structure is defined.
11885  *
11886  * The *_Field_IsChar structs are needed to correct for endianness.
11887  * These values are read from the board 16 bits at a time directly
11888  * into the structs. Because some fields are char, the values will be
11889  * in the wrong order. The *_Field_IsChar tells when to flip the
11890  * bytes. Data read and written to PCI memory is automatically swapped
11891  * on big-endian platforms so char fields read as words are actually being
11892  * unswapped on big-endian platforms.
11893  */
11894 static ADVEEP_3550_CONFIG Default_3550_EEPROM_Config __devinitdata = {
11895 	ADV_EEPROM_BIOS_ENABLE,	/* cfg_lsw */
11896 	0x0000,			/* cfg_msw */
11897 	0xFFFF,			/* disc_enable */
11898 	0xFFFF,			/* wdtr_able */
11899 	0xFFFF,			/* sdtr_able */
11900 	0xFFFF,			/* start_motor */
11901 	0xFFFF,			/* tagqng_able */
11902 	0xFFFF,			/* bios_scan */
11903 	0,			/* scam_tolerant */
11904 	7,			/* adapter_scsi_id */
11905 	0,			/* bios_boot_delay */
11906 	3,			/* scsi_reset_delay */
11907 	0,			/* bios_id_lun */
11908 	0,			/* termination */
11909 	0,			/* reserved1 */
11910 	0xFFE7,			/* bios_ctrl */
11911 	0xFFFF,			/* ultra_able */
11912 	0,			/* reserved2 */
11913 	ASC_DEF_MAX_HOST_QNG,	/* max_host_qng */
11914 	ASC_DEF_MAX_DVC_QNG,	/* max_dvc_qng */
11915 	0,			/* dvc_cntl */
11916 	0,			/* bug_fix */
11917 	0,			/* serial_number_word1 */
11918 	0,			/* serial_number_word2 */
11919 	0,			/* serial_number_word3 */
11920 	0,			/* check_sum */
11921 	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
11922 	,			/* oem_name[16] */
11923 	0,			/* dvc_err_code */
11924 	0,			/* adv_err_code */
11925 	0,			/* adv_err_addr */
11926 	0,			/* saved_dvc_err_code */
11927 	0,			/* saved_adv_err_code */
11928 	0,			/* saved_adv_err_addr */
11929 	0			/* num_of_err */
11930 };
11931 
11932 static ADVEEP_3550_CONFIG ADVEEP_3550_Config_Field_IsChar __devinitdata = {
11933 	0,			/* cfg_lsw */
11934 	0,			/* cfg_msw */
11935 	0,			/* -disc_enable */
11936 	0,			/* wdtr_able */
11937 	0,			/* sdtr_able */
11938 	0,			/* start_motor */
11939 	0,			/* tagqng_able */
11940 	0,			/* bios_scan */
11941 	0,			/* scam_tolerant */
11942 	1,			/* adapter_scsi_id */
11943 	1,			/* bios_boot_delay */
11944 	1,			/* scsi_reset_delay */
11945 	1,			/* bios_id_lun */
11946 	1,			/* termination */
11947 	1,			/* reserved1 */
11948 	0,			/* bios_ctrl */
11949 	0,			/* ultra_able */
11950 	0,			/* reserved2 */
11951 	1,			/* max_host_qng */
11952 	1,			/* max_dvc_qng */
11953 	0,			/* dvc_cntl */
11954 	0,			/* bug_fix */
11955 	0,			/* serial_number_word1 */
11956 	0,			/* serial_number_word2 */
11957 	0,			/* serial_number_word3 */
11958 	0,			/* check_sum */
11959 	{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
11960 	,			/* oem_name[16] */
11961 	0,			/* dvc_err_code */
11962 	0,			/* adv_err_code */
11963 	0,			/* adv_err_addr */
11964 	0,			/* saved_dvc_err_code */
11965 	0,			/* saved_adv_err_code */
11966 	0,			/* saved_adv_err_addr */
11967 	0			/* num_of_err */
11968 };
11969 
11970 static ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config __devinitdata = {
11971 	ADV_EEPROM_BIOS_ENABLE,	/* 00 cfg_lsw */
11972 	0x0000,			/* 01 cfg_msw */
11973 	0xFFFF,			/* 02 disc_enable */
11974 	0xFFFF,			/* 03 wdtr_able */
11975 	0x4444,			/* 04 sdtr_speed1 */
11976 	0xFFFF,			/* 05 start_motor */
11977 	0xFFFF,			/* 06 tagqng_able */
11978 	0xFFFF,			/* 07 bios_scan */
11979 	0,			/* 08 scam_tolerant */
11980 	7,			/* 09 adapter_scsi_id */
11981 	0,			/*    bios_boot_delay */
11982 	3,			/* 10 scsi_reset_delay */
11983 	0,			/*    bios_id_lun */
11984 	0,			/* 11 termination_se */
11985 	0,			/*    termination_lvd */
11986 	0xFFE7,			/* 12 bios_ctrl */
11987 	0x4444,			/* 13 sdtr_speed2 */
11988 	0x4444,			/* 14 sdtr_speed3 */
11989 	ASC_DEF_MAX_HOST_QNG,	/* 15 max_host_qng */
11990 	ASC_DEF_MAX_DVC_QNG,	/*    max_dvc_qng */
11991 	0,			/* 16 dvc_cntl */
11992 	0x4444,			/* 17 sdtr_speed4 */
11993 	0,			/* 18 serial_number_word1 */
11994 	0,			/* 19 serial_number_word2 */
11995 	0,			/* 20 serial_number_word3 */
11996 	0,			/* 21 check_sum */
11997 	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
11998 	,			/* 22-29 oem_name[16] */
11999 	0,			/* 30 dvc_err_code */
12000 	0,			/* 31 adv_err_code */
12001 	0,			/* 32 adv_err_addr */
12002 	0,			/* 33 saved_dvc_err_code */
12003 	0,			/* 34 saved_adv_err_code */
12004 	0,			/* 35 saved_adv_err_addr */
12005 	0,			/* 36 reserved */
12006 	0,			/* 37 reserved */
12007 	0,			/* 38 reserved */
12008 	0,			/* 39 reserved */
12009 	0,			/* 40 reserved */
12010 	0,			/* 41 reserved */
12011 	0,			/* 42 reserved */
12012 	0,			/* 43 reserved */
12013 	0,			/* 44 reserved */
12014 	0,			/* 45 reserved */
12015 	0,			/* 46 reserved */
12016 	0,			/* 47 reserved */
12017 	0,			/* 48 reserved */
12018 	0,			/* 49 reserved */
12019 	0,			/* 50 reserved */
12020 	0,			/* 51 reserved */
12021 	0,			/* 52 reserved */
12022 	0,			/* 53 reserved */
12023 	0,			/* 54 reserved */
12024 	0,			/* 55 reserved */
12025 	0,			/* 56 cisptr_lsw */
12026 	0,			/* 57 cisprt_msw */
12027 	PCI_VENDOR_ID_ASP,	/* 58 subsysvid */
12028 	PCI_DEVICE_ID_38C0800_REV1,	/* 59 subsysid */
12029 	0,			/* 60 reserved */
12030 	0,			/* 61 reserved */
12031 	0,			/* 62 reserved */
12032 	0			/* 63 reserved */
12033 };
12034 
12035 static ADVEEP_38C0800_CONFIG ADVEEP_38C0800_Config_Field_IsChar __devinitdata = {
12036 	0,			/* 00 cfg_lsw */
12037 	0,			/* 01 cfg_msw */
12038 	0,			/* 02 disc_enable */
12039 	0,			/* 03 wdtr_able */
12040 	0,			/* 04 sdtr_speed1 */
12041 	0,			/* 05 start_motor */
12042 	0,			/* 06 tagqng_able */
12043 	0,			/* 07 bios_scan */
12044 	0,			/* 08 scam_tolerant */
12045 	1,			/* 09 adapter_scsi_id */
12046 	1,			/*    bios_boot_delay */
12047 	1,			/* 10 scsi_reset_delay */
12048 	1,			/*    bios_id_lun */
12049 	1,			/* 11 termination_se */
12050 	1,			/*    termination_lvd */
12051 	0,			/* 12 bios_ctrl */
12052 	0,			/* 13 sdtr_speed2 */
12053 	0,			/* 14 sdtr_speed3 */
12054 	1,			/* 15 max_host_qng */
12055 	1,			/*    max_dvc_qng */
12056 	0,			/* 16 dvc_cntl */
12057 	0,			/* 17 sdtr_speed4 */
12058 	0,			/* 18 serial_number_word1 */
12059 	0,			/* 19 serial_number_word2 */
12060 	0,			/* 20 serial_number_word3 */
12061 	0,			/* 21 check_sum */
12062 	{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
12063 	,			/* 22-29 oem_name[16] */
12064 	0,			/* 30 dvc_err_code */
12065 	0,			/* 31 adv_err_code */
12066 	0,			/* 32 adv_err_addr */
12067 	0,			/* 33 saved_dvc_err_code */
12068 	0,			/* 34 saved_adv_err_code */
12069 	0,			/* 35 saved_adv_err_addr */
12070 	0,			/* 36 reserved */
12071 	0,			/* 37 reserved */
12072 	0,			/* 38 reserved */
12073 	0,			/* 39 reserved */
12074 	0,			/* 40 reserved */
12075 	0,			/* 41 reserved */
12076 	0,			/* 42 reserved */
12077 	0,			/* 43 reserved */
12078 	0,			/* 44 reserved */
12079 	0,			/* 45 reserved */
12080 	0,			/* 46 reserved */
12081 	0,			/* 47 reserved */
12082 	0,			/* 48 reserved */
12083 	0,			/* 49 reserved */
12084 	0,			/* 50 reserved */
12085 	0,			/* 51 reserved */
12086 	0,			/* 52 reserved */
12087 	0,			/* 53 reserved */
12088 	0,			/* 54 reserved */
12089 	0,			/* 55 reserved */
12090 	0,			/* 56 cisptr_lsw */
12091 	0,			/* 57 cisprt_msw */
12092 	0,			/* 58 subsysvid */
12093 	0,			/* 59 subsysid */
12094 	0,			/* 60 reserved */
12095 	0,			/* 61 reserved */
12096 	0,			/* 62 reserved */
12097 	0			/* 63 reserved */
12098 };
12099 
12100 static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config __devinitdata = {
12101 	ADV_EEPROM_BIOS_ENABLE,	/* 00 cfg_lsw */
12102 	0x0000,			/* 01 cfg_msw */
12103 	0xFFFF,			/* 02 disc_enable */
12104 	0xFFFF,			/* 03 wdtr_able */
12105 	0x5555,			/* 04 sdtr_speed1 */
12106 	0xFFFF,			/* 05 start_motor */
12107 	0xFFFF,			/* 06 tagqng_able */
12108 	0xFFFF,			/* 07 bios_scan */
12109 	0,			/* 08 scam_tolerant */
12110 	7,			/* 09 adapter_scsi_id */
12111 	0,			/*    bios_boot_delay */
12112 	3,			/* 10 scsi_reset_delay */
12113 	0,			/*    bios_id_lun */
12114 	0,			/* 11 termination_se */
12115 	0,			/*    termination_lvd */
12116 	0xFFE7,			/* 12 bios_ctrl */
12117 	0x5555,			/* 13 sdtr_speed2 */
12118 	0x5555,			/* 14 sdtr_speed3 */
12119 	ASC_DEF_MAX_HOST_QNG,	/* 15 max_host_qng */
12120 	ASC_DEF_MAX_DVC_QNG,	/*    max_dvc_qng */
12121 	0,			/* 16 dvc_cntl */
12122 	0x5555,			/* 17 sdtr_speed4 */
12123 	0,			/* 18 serial_number_word1 */
12124 	0,			/* 19 serial_number_word2 */
12125 	0,			/* 20 serial_number_word3 */
12126 	0,			/* 21 check_sum */
12127 	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
12128 	,			/* 22-29 oem_name[16] */
12129 	0,			/* 30 dvc_err_code */
12130 	0,			/* 31 adv_err_code */
12131 	0,			/* 32 adv_err_addr */
12132 	0,			/* 33 saved_dvc_err_code */
12133 	0,			/* 34 saved_adv_err_code */
12134 	0,			/* 35 saved_adv_err_addr */
12135 	0,			/* 36 reserved */
12136 	0,			/* 37 reserved */
12137 	0,			/* 38 reserved */
12138 	0,			/* 39 reserved */
12139 	0,			/* 40 reserved */
12140 	0,			/* 41 reserved */
12141 	0,			/* 42 reserved */
12142 	0,			/* 43 reserved */
12143 	0,			/* 44 reserved */
12144 	0,			/* 45 reserved */
12145 	0,			/* 46 reserved */
12146 	0,			/* 47 reserved */
12147 	0,			/* 48 reserved */
12148 	0,			/* 49 reserved */
12149 	0,			/* 50 reserved */
12150 	0,			/* 51 reserved */
12151 	0,			/* 52 reserved */
12152 	0,			/* 53 reserved */
12153 	0,			/* 54 reserved */
12154 	0,			/* 55 reserved */
12155 	0,			/* 56 cisptr_lsw */
12156 	0,			/* 57 cisprt_msw */
12157 	PCI_VENDOR_ID_ASP,	/* 58 subsysvid */
12158 	PCI_DEVICE_ID_38C1600_REV1,	/* 59 subsysid */
12159 	0,			/* 60 reserved */
12160 	0,			/* 61 reserved */
12161 	0,			/* 62 reserved */
12162 	0			/* 63 reserved */
12163 };
12164 
12165 static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata = {
12166 	0,			/* 00 cfg_lsw */
12167 	0,			/* 01 cfg_msw */
12168 	0,			/* 02 disc_enable */
12169 	0,			/* 03 wdtr_able */
12170 	0,			/* 04 sdtr_speed1 */
12171 	0,			/* 05 start_motor */
12172 	0,			/* 06 tagqng_able */
12173 	0,			/* 07 bios_scan */
12174 	0,			/* 08 scam_tolerant */
12175 	1,			/* 09 adapter_scsi_id */
12176 	1,			/*    bios_boot_delay */
12177 	1,			/* 10 scsi_reset_delay */
12178 	1,			/*    bios_id_lun */
12179 	1,			/* 11 termination_se */
12180 	1,			/*    termination_lvd */
12181 	0,			/* 12 bios_ctrl */
12182 	0,			/* 13 sdtr_speed2 */
12183 	0,			/* 14 sdtr_speed3 */
12184 	1,			/* 15 max_host_qng */
12185 	1,			/*    max_dvc_qng */
12186 	0,			/* 16 dvc_cntl */
12187 	0,			/* 17 sdtr_speed4 */
12188 	0,			/* 18 serial_number_word1 */
12189 	0,			/* 19 serial_number_word2 */
12190 	0,			/* 20 serial_number_word3 */
12191 	0,			/* 21 check_sum */
12192 	{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
12193 	,			/* 22-29 oem_name[16] */
12194 	0,			/* 30 dvc_err_code */
12195 	0,			/* 31 adv_err_code */
12196 	0,			/* 32 adv_err_addr */
12197 	0,			/* 33 saved_dvc_err_code */
12198 	0,			/* 34 saved_adv_err_code */
12199 	0,			/* 35 saved_adv_err_addr */
12200 	0,			/* 36 reserved */
12201 	0,			/* 37 reserved */
12202 	0,			/* 38 reserved */
12203 	0,			/* 39 reserved */
12204 	0,			/* 40 reserved */
12205 	0,			/* 41 reserved */
12206 	0,			/* 42 reserved */
12207 	0,			/* 43 reserved */
12208 	0,			/* 44 reserved */
12209 	0,			/* 45 reserved */
12210 	0,			/* 46 reserved */
12211 	0,			/* 47 reserved */
12212 	0,			/* 48 reserved */
12213 	0,			/* 49 reserved */
12214 	0,			/* 50 reserved */
12215 	0,			/* 51 reserved */
12216 	0,			/* 52 reserved */
12217 	0,			/* 53 reserved */
12218 	0,			/* 54 reserved */
12219 	0,			/* 55 reserved */
12220 	0,			/* 56 cisptr_lsw */
12221 	0,			/* 57 cisprt_msw */
12222 	0,			/* 58 subsysvid */
12223 	0,			/* 59 subsysid */
12224 	0,			/* 60 reserved */
12225 	0,			/* 61 reserved */
12226 	0,			/* 62 reserved */
12227 	0			/* 63 reserved */
12228 };
12229 
12230 #ifdef CONFIG_PCI
12231 /*
12232  * Wait for EEPROM command to complete
12233  */
12234 static void __devinit AdvWaitEEPCmd(AdvPortAddr iop_base)
12235 {
12236 	int eep_delay_ms;
12237 
12238 	for (eep_delay_ms = 0; eep_delay_ms < ADV_EEP_DELAY_MS; eep_delay_ms++) {
12239 		if (AdvReadWordRegister(iop_base, IOPW_EE_CMD) &
12240 		    ASC_EEP_CMD_DONE) {
12241 			break;
12242 		}
12243 		mdelay(1);
12244 	}
12245 	if ((AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE) ==
12246 	    0)
12247 		BUG();
12248 }
12249 
12250 /*
12251  * Read the EEPROM from specified location
12252  */
12253 static ushort __devinit AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
12254 {
12255 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12256 			     ASC_EEP_CMD_READ | eep_word_addr);
12257 	AdvWaitEEPCmd(iop_base);
12258 	return AdvReadWordRegister(iop_base, IOPW_EE_DATA);
12259 }
12260 
12261 /*
12262  * Write the EEPROM from 'cfg_buf'.
12263  */
12264 static void __devinit
12265 AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
12266 {
12267 	ushort *wbuf;
12268 	ushort addr, chksum;
12269 	ushort *charfields;
12270 
12271 	wbuf = (ushort *)cfg_buf;
12272 	charfields = (ushort *)&ADVEEP_3550_Config_Field_IsChar;
12273 	chksum = 0;
12274 
12275 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
12276 	AdvWaitEEPCmd(iop_base);
12277 
12278 	/*
12279 	 * Write EEPROM from word 0 to word 20.
12280 	 */
12281 	for (addr = ADV_EEP_DVC_CFG_BEGIN;
12282 	     addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
12283 		ushort word;
12284 
12285 		if (*charfields++) {
12286 			word = cpu_to_le16(*wbuf);
12287 		} else {
12288 			word = *wbuf;
12289 		}
12290 		chksum += *wbuf;	/* Checksum is calculated from word values. */
12291 		AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
12292 		AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12293 				     ASC_EEP_CMD_WRITE | addr);
12294 		AdvWaitEEPCmd(iop_base);
12295 		mdelay(ADV_EEP_DELAY_MS);
12296 	}
12297 
12298 	/*
12299 	 * Write EEPROM checksum at word 21.
12300 	 */
12301 	AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
12302 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
12303 	AdvWaitEEPCmd(iop_base);
12304 	wbuf++;
12305 	charfields++;
12306 
12307 	/*
12308 	 * Write EEPROM OEM name at words 22 to 29.
12309 	 */
12310 	for (addr = ADV_EEP_DVC_CTL_BEGIN;
12311 	     addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
12312 		ushort word;
12313 
12314 		if (*charfields++) {
12315 			word = cpu_to_le16(*wbuf);
12316 		} else {
12317 			word = *wbuf;
12318 		}
12319 		AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
12320 		AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12321 				     ASC_EEP_CMD_WRITE | addr);
12322 		AdvWaitEEPCmd(iop_base);
12323 	}
12324 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
12325 	AdvWaitEEPCmd(iop_base);
12326 }
12327 
12328 /*
12329  * Write the EEPROM from 'cfg_buf'.
12330  */
12331 static void __devinit
12332 AdvSet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
12333 {
12334 	ushort *wbuf;
12335 	ushort *charfields;
12336 	ushort addr, chksum;
12337 
12338 	wbuf = (ushort *)cfg_buf;
12339 	charfields = (ushort *)&ADVEEP_38C0800_Config_Field_IsChar;
12340 	chksum = 0;
12341 
12342 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
12343 	AdvWaitEEPCmd(iop_base);
12344 
12345 	/*
12346 	 * Write EEPROM from word 0 to word 20.
12347 	 */
12348 	for (addr = ADV_EEP_DVC_CFG_BEGIN;
12349 	     addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
12350 		ushort word;
12351 
12352 		if (*charfields++) {
12353 			word = cpu_to_le16(*wbuf);
12354 		} else {
12355 			word = *wbuf;
12356 		}
12357 		chksum += *wbuf;	/* Checksum is calculated from word values. */
12358 		AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
12359 		AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12360 				     ASC_EEP_CMD_WRITE | addr);
12361 		AdvWaitEEPCmd(iop_base);
12362 		mdelay(ADV_EEP_DELAY_MS);
12363 	}
12364 
12365 	/*
12366 	 * Write EEPROM checksum at word 21.
12367 	 */
12368 	AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
12369 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
12370 	AdvWaitEEPCmd(iop_base);
12371 	wbuf++;
12372 	charfields++;
12373 
12374 	/*
12375 	 * Write EEPROM OEM name at words 22 to 29.
12376 	 */
12377 	for (addr = ADV_EEP_DVC_CTL_BEGIN;
12378 	     addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
12379 		ushort word;
12380 
12381 		if (*charfields++) {
12382 			word = cpu_to_le16(*wbuf);
12383 		} else {
12384 			word = *wbuf;
12385 		}
12386 		AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
12387 		AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12388 				     ASC_EEP_CMD_WRITE | addr);
12389 		AdvWaitEEPCmd(iop_base);
12390 	}
12391 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
12392 	AdvWaitEEPCmd(iop_base);
12393 }
12394 
12395 /*
12396  * Write the EEPROM from 'cfg_buf'.
12397  */
12398 static void __devinit
12399 AdvSet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
12400 {
12401 	ushort *wbuf;
12402 	ushort *charfields;
12403 	ushort addr, chksum;
12404 
12405 	wbuf = (ushort *)cfg_buf;
12406 	charfields = (ushort *)&ADVEEP_38C1600_Config_Field_IsChar;
12407 	chksum = 0;
12408 
12409 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
12410 	AdvWaitEEPCmd(iop_base);
12411 
12412 	/*
12413 	 * Write EEPROM from word 0 to word 20.
12414 	 */
12415 	for (addr = ADV_EEP_DVC_CFG_BEGIN;
12416 	     addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
12417 		ushort word;
12418 
12419 		if (*charfields++) {
12420 			word = cpu_to_le16(*wbuf);
12421 		} else {
12422 			word = *wbuf;
12423 		}
12424 		chksum += *wbuf;	/* Checksum is calculated from word values. */
12425 		AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
12426 		AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12427 				     ASC_EEP_CMD_WRITE | addr);
12428 		AdvWaitEEPCmd(iop_base);
12429 		mdelay(ADV_EEP_DELAY_MS);
12430 	}
12431 
12432 	/*
12433 	 * Write EEPROM checksum at word 21.
12434 	 */
12435 	AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
12436 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
12437 	AdvWaitEEPCmd(iop_base);
12438 	wbuf++;
12439 	charfields++;
12440 
12441 	/*
12442 	 * Write EEPROM OEM name at words 22 to 29.
12443 	 */
12444 	for (addr = ADV_EEP_DVC_CTL_BEGIN;
12445 	     addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
12446 		ushort word;
12447 
12448 		if (*charfields++) {
12449 			word = cpu_to_le16(*wbuf);
12450 		} else {
12451 			word = *wbuf;
12452 		}
12453 		AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
12454 		AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
12455 				     ASC_EEP_CMD_WRITE | addr);
12456 		AdvWaitEEPCmd(iop_base);
12457 	}
12458 	AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
12459 	AdvWaitEEPCmd(iop_base);
12460 }
12461 
12462 /*
12463  * Read EEPROM configuration into the specified buffer.
12464  *
12465  * Return a checksum based on the EEPROM configuration read.
12466  */
12467 static ushort __devinit
12468 AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
12469 {
12470 	ushort wval, chksum;
12471 	ushort *wbuf;
12472 	int eep_addr;
12473 	ushort *charfields;
12474 
12475 	charfields = (ushort *)&ADVEEP_3550_Config_Field_IsChar;
12476 	wbuf = (ushort *)cfg_buf;
12477 	chksum = 0;
12478 
12479 	for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
12480 	     eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
12481 		wval = AdvReadEEPWord(iop_base, eep_addr);
12482 		chksum += wval;	/* Checksum is calculated from word values. */
12483 		if (*charfields++) {
12484 			*wbuf = le16_to_cpu(wval);
12485 		} else {
12486 			*wbuf = wval;
12487 		}
12488 	}
12489 	/* Read checksum word. */
12490 	*wbuf = AdvReadEEPWord(iop_base, eep_addr);
12491 	wbuf++;
12492 	charfields++;
12493 
12494 	/* Read rest of EEPROM not covered by the checksum. */
12495 	for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
12496 	     eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
12497 		*wbuf = AdvReadEEPWord(iop_base, eep_addr);
12498 		if (*charfields++) {
12499 			*wbuf = le16_to_cpu(*wbuf);
12500 		}
12501 	}
12502 	return chksum;
12503 }
12504 
12505 /*
12506  * Read EEPROM configuration into the specified buffer.
12507  *
12508  * Return a checksum based on the EEPROM configuration read.
12509  */
12510 static ushort __devinit
12511 AdvGet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
12512 {
12513 	ushort wval, chksum;
12514 	ushort *wbuf;
12515 	int eep_addr;
12516 	ushort *charfields;
12517 
12518 	charfields = (ushort *)&ADVEEP_38C0800_Config_Field_IsChar;
12519 	wbuf = (ushort *)cfg_buf;
12520 	chksum = 0;
12521 
12522 	for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
12523 	     eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
12524 		wval = AdvReadEEPWord(iop_base, eep_addr);
12525 		chksum += wval;	/* Checksum is calculated from word values. */
12526 		if (*charfields++) {
12527 			*wbuf = le16_to_cpu(wval);
12528 		} else {
12529 			*wbuf = wval;
12530 		}
12531 	}
12532 	/* Read checksum word. */
12533 	*wbuf = AdvReadEEPWord(iop_base, eep_addr);
12534 	wbuf++;
12535 	charfields++;
12536 
12537 	/* Read rest of EEPROM not covered by the checksum. */
12538 	for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
12539 	     eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
12540 		*wbuf = AdvReadEEPWord(iop_base, eep_addr);
12541 		if (*charfields++) {
12542 			*wbuf = le16_to_cpu(*wbuf);
12543 		}
12544 	}
12545 	return chksum;
12546 }
12547 
12548 /*
12549  * Read EEPROM configuration into the specified buffer.
12550  *
12551  * Return a checksum based on the EEPROM configuration read.
12552  */
12553 static ushort __devinit
12554 AdvGet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
12555 {
12556 	ushort wval, chksum;
12557 	ushort *wbuf;
12558 	int eep_addr;
12559 	ushort *charfields;
12560 
12561 	charfields = (ushort *)&ADVEEP_38C1600_Config_Field_IsChar;
12562 	wbuf = (ushort *)cfg_buf;
12563 	chksum = 0;
12564 
12565 	for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
12566 	     eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
12567 		wval = AdvReadEEPWord(iop_base, eep_addr);
12568 		chksum += wval;	/* Checksum is calculated from word values. */
12569 		if (*charfields++) {
12570 			*wbuf = le16_to_cpu(wval);
12571 		} else {
12572 			*wbuf = wval;
12573 		}
12574 	}
12575 	/* Read checksum word. */
12576 	*wbuf = AdvReadEEPWord(iop_base, eep_addr);
12577 	wbuf++;
12578 	charfields++;
12579 
12580 	/* Read rest of EEPROM not covered by the checksum. */
12581 	for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
12582 	     eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
12583 		*wbuf = AdvReadEEPWord(iop_base, eep_addr);
12584 		if (*charfields++) {
12585 			*wbuf = le16_to_cpu(*wbuf);
12586 		}
12587 	}
12588 	return chksum;
12589 }
12590 
12591 /*
12592  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
12593  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
12594  * all of this is done.
12595  *
12596  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
12597  *
12598  * For a non-fatal error return a warning code. If there are no warnings
12599  * then 0 is returned.
12600  *
12601  * Note: Chip is stopped on entry.
12602  */
12603 static int __devinit AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
12604 {
12605 	AdvPortAddr iop_base;
12606 	ushort warn_code;
12607 	ADVEEP_3550_CONFIG eep_config;
12608 
12609 	iop_base = asc_dvc->iop_base;
12610 
12611 	warn_code = 0;
12612 
12613 	/*
12614 	 * Read the board's EEPROM configuration.
12615 	 *
12616 	 * Set default values if a bad checksum is found.
12617 	 */
12618 	if (AdvGet3550EEPConfig(iop_base, &eep_config) != eep_config.check_sum) {
12619 		warn_code |= ASC_WARN_EEPROM_CHKSUM;
12620 
12621 		/*
12622 		 * Set EEPROM default values.
12623 		 */
12624 		memcpy(&eep_config, &Default_3550_EEPROM_Config,
12625 			sizeof(ADVEEP_3550_CONFIG));
12626 
12627 		/*
12628 		 * Assume the 6 byte board serial number that was read from
12629 		 * EEPROM is correct even if the EEPROM checksum failed.
12630 		 */
12631 		eep_config.serial_number_word3 =
12632 		    AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
12633 
12634 		eep_config.serial_number_word2 =
12635 		    AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
12636 
12637 		eep_config.serial_number_word1 =
12638 		    AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
12639 
12640 		AdvSet3550EEPConfig(iop_base, &eep_config);
12641 	}
12642 	/*
12643 	 * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
12644 	 * EEPROM configuration that was read.
12645 	 *
12646 	 * This is the mapping of EEPROM fields to Adv Library fields.
12647 	 */
12648 	asc_dvc->wdtr_able = eep_config.wdtr_able;
12649 	asc_dvc->sdtr_able = eep_config.sdtr_able;
12650 	asc_dvc->ultra_able = eep_config.ultra_able;
12651 	asc_dvc->tagqng_able = eep_config.tagqng_able;
12652 	asc_dvc->cfg->disc_enable = eep_config.disc_enable;
12653 	asc_dvc->max_host_qng = eep_config.max_host_qng;
12654 	asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
12655 	asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
12656 	asc_dvc->start_motor = eep_config.start_motor;
12657 	asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
12658 	asc_dvc->bios_ctrl = eep_config.bios_ctrl;
12659 	asc_dvc->no_scam = eep_config.scam_tolerant;
12660 	asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
12661 	asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
12662 	asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
12663 
12664 	/*
12665 	 * Set the host maximum queuing (max. 253, min. 16) and the per device
12666 	 * maximum queuing (max. 63, min. 4).
12667 	 */
12668 	if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
12669 		eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
12670 	} else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
12671 		/* If the value is zero, assume it is uninitialized. */
12672 		if (eep_config.max_host_qng == 0) {
12673 			eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
12674 		} else {
12675 			eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
12676 		}
12677 	}
12678 
12679 	if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
12680 		eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
12681 	} else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
12682 		/* If the value is zero, assume it is uninitialized. */
12683 		if (eep_config.max_dvc_qng == 0) {
12684 			eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
12685 		} else {
12686 			eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
12687 		}
12688 	}
12689 
12690 	/*
12691 	 * If 'max_dvc_qng' is greater than 'max_host_qng', then
12692 	 * set 'max_dvc_qng' to 'max_host_qng'.
12693 	 */
12694 	if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
12695 		eep_config.max_dvc_qng = eep_config.max_host_qng;
12696 	}
12697 
12698 	/*
12699 	 * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
12700 	 * values based on possibly adjusted EEPROM values.
12701 	 */
12702 	asc_dvc->max_host_qng = eep_config.max_host_qng;
12703 	asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
12704 
12705 	/*
12706 	 * If the EEPROM 'termination' field is set to automatic (0), then set
12707 	 * the ADV_DVC_CFG 'termination' field to automatic also.
12708 	 *
12709 	 * If the termination is specified with a non-zero 'termination'
12710 	 * value check that a legal value is set and set the ADV_DVC_CFG
12711 	 * 'termination' field appropriately.
12712 	 */
12713 	if (eep_config.termination == 0) {
12714 		asc_dvc->cfg->termination = 0;	/* auto termination */
12715 	} else {
12716 		/* Enable manual control with low off / high off. */
12717 		if (eep_config.termination == 1) {
12718 			asc_dvc->cfg->termination = TERM_CTL_SEL;
12719 
12720 			/* Enable manual control with low off / high on. */
12721 		} else if (eep_config.termination == 2) {
12722 			asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H;
12723 
12724 			/* Enable manual control with low on / high on. */
12725 		} else if (eep_config.termination == 3) {
12726 			asc_dvc->cfg->termination =
12727 			    TERM_CTL_SEL | TERM_CTL_H | TERM_CTL_L;
12728 		} else {
12729 			/*
12730 			 * The EEPROM 'termination' field contains a bad value. Use
12731 			 * automatic termination instead.
12732 			 */
12733 			asc_dvc->cfg->termination = 0;
12734 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
12735 		}
12736 	}
12737 
12738 	return warn_code;
12739 }
12740 
12741 /*
12742  * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
12743  * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
12744  * all of this is done.
12745  *
12746  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
12747  *
12748  * For a non-fatal error return a warning code. If there are no warnings
12749  * then 0 is returned.
12750  *
12751  * Note: Chip is stopped on entry.
12752  */
12753 static int __devinit AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
12754 {
12755 	AdvPortAddr iop_base;
12756 	ushort warn_code;
12757 	ADVEEP_38C0800_CONFIG eep_config;
12758 	uchar tid, termination;
12759 	ushort sdtr_speed = 0;
12760 
12761 	iop_base = asc_dvc->iop_base;
12762 
12763 	warn_code = 0;
12764 
12765 	/*
12766 	 * Read the board's EEPROM configuration.
12767 	 *
12768 	 * Set default values if a bad checksum is found.
12769 	 */
12770 	if (AdvGet38C0800EEPConfig(iop_base, &eep_config) !=
12771 	    eep_config.check_sum) {
12772 		warn_code |= ASC_WARN_EEPROM_CHKSUM;
12773 
12774 		/*
12775 		 * Set EEPROM default values.
12776 		 */
12777 		memcpy(&eep_config, &Default_38C0800_EEPROM_Config,
12778 			sizeof(ADVEEP_38C0800_CONFIG));
12779 
12780 		/*
12781 		 * Assume the 6 byte board serial number that was read from
12782 		 * EEPROM is correct even if the EEPROM checksum failed.
12783 		 */
12784 		eep_config.serial_number_word3 =
12785 		    AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
12786 
12787 		eep_config.serial_number_word2 =
12788 		    AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
12789 
12790 		eep_config.serial_number_word1 =
12791 		    AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
12792 
12793 		AdvSet38C0800EEPConfig(iop_base, &eep_config);
12794 	}
12795 	/*
12796 	 * Set ADV_DVC_VAR and ADV_DVC_CFG variables from the
12797 	 * EEPROM configuration that was read.
12798 	 *
12799 	 * This is the mapping of EEPROM fields to Adv Library fields.
12800 	 */
12801 	asc_dvc->wdtr_able = eep_config.wdtr_able;
12802 	asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
12803 	asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
12804 	asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
12805 	asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
12806 	asc_dvc->tagqng_able = eep_config.tagqng_able;
12807 	asc_dvc->cfg->disc_enable = eep_config.disc_enable;
12808 	asc_dvc->max_host_qng = eep_config.max_host_qng;
12809 	asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
12810 	asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
12811 	asc_dvc->start_motor = eep_config.start_motor;
12812 	asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
12813 	asc_dvc->bios_ctrl = eep_config.bios_ctrl;
12814 	asc_dvc->no_scam = eep_config.scam_tolerant;
12815 	asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
12816 	asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
12817 	asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
12818 
12819 	/*
12820 	 * For every Target ID if any of its 'sdtr_speed[1234]' bits
12821 	 * are set, then set an 'sdtr_able' bit for it.
12822 	 */
12823 	asc_dvc->sdtr_able = 0;
12824 	for (tid = 0; tid <= ADV_MAX_TID; tid++) {
12825 		if (tid == 0) {
12826 			sdtr_speed = asc_dvc->sdtr_speed1;
12827 		} else if (tid == 4) {
12828 			sdtr_speed = asc_dvc->sdtr_speed2;
12829 		} else if (tid == 8) {
12830 			sdtr_speed = asc_dvc->sdtr_speed3;
12831 		} else if (tid == 12) {
12832 			sdtr_speed = asc_dvc->sdtr_speed4;
12833 		}
12834 		if (sdtr_speed & ADV_MAX_TID) {
12835 			asc_dvc->sdtr_able |= (1 << tid);
12836 		}
12837 		sdtr_speed >>= 4;
12838 	}
12839 
12840 	/*
12841 	 * Set the host maximum queuing (max. 253, min. 16) and the per device
12842 	 * maximum queuing (max. 63, min. 4).
12843 	 */
12844 	if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
12845 		eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
12846 	} else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
12847 		/* If the value is zero, assume it is uninitialized. */
12848 		if (eep_config.max_host_qng == 0) {
12849 			eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
12850 		} else {
12851 			eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
12852 		}
12853 	}
12854 
12855 	if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
12856 		eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
12857 	} else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
12858 		/* If the value is zero, assume it is uninitialized. */
12859 		if (eep_config.max_dvc_qng == 0) {
12860 			eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
12861 		} else {
12862 			eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
12863 		}
12864 	}
12865 
12866 	/*
12867 	 * If 'max_dvc_qng' is greater than 'max_host_qng', then
12868 	 * set 'max_dvc_qng' to 'max_host_qng'.
12869 	 */
12870 	if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
12871 		eep_config.max_dvc_qng = eep_config.max_host_qng;
12872 	}
12873 
12874 	/*
12875 	 * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
12876 	 * values based on possibly adjusted EEPROM values.
12877 	 */
12878 	asc_dvc->max_host_qng = eep_config.max_host_qng;
12879 	asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
12880 
12881 	/*
12882 	 * If the EEPROM 'termination' field is set to automatic (0), then set
12883 	 * the ADV_DVC_CFG 'termination' field to automatic also.
12884 	 *
12885 	 * If the termination is specified with a non-zero 'termination'
12886 	 * value check that a legal value is set and set the ADV_DVC_CFG
12887 	 * 'termination' field appropriately.
12888 	 */
12889 	if (eep_config.termination_se == 0) {
12890 		termination = 0;	/* auto termination for SE */
12891 	} else {
12892 		/* Enable manual control with low off / high off. */
12893 		if (eep_config.termination_se == 1) {
12894 			termination = 0;
12895 
12896 			/* Enable manual control with low off / high on. */
12897 		} else if (eep_config.termination_se == 2) {
12898 			termination = TERM_SE_HI;
12899 
12900 			/* Enable manual control with low on / high on. */
12901 		} else if (eep_config.termination_se == 3) {
12902 			termination = TERM_SE;
12903 		} else {
12904 			/*
12905 			 * The EEPROM 'termination_se' field contains a bad value.
12906 			 * Use automatic termination instead.
12907 			 */
12908 			termination = 0;
12909 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
12910 		}
12911 	}
12912 
12913 	if (eep_config.termination_lvd == 0) {
12914 		asc_dvc->cfg->termination = termination;	/* auto termination for LVD */
12915 	} else {
12916 		/* Enable manual control with low off / high off. */
12917 		if (eep_config.termination_lvd == 1) {
12918 			asc_dvc->cfg->termination = termination;
12919 
12920 			/* Enable manual control with low off / high on. */
12921 		} else if (eep_config.termination_lvd == 2) {
12922 			asc_dvc->cfg->termination = termination | TERM_LVD_HI;
12923 
12924 			/* Enable manual control with low on / high on. */
12925 		} else if (eep_config.termination_lvd == 3) {
12926 			asc_dvc->cfg->termination = termination | TERM_LVD;
12927 		} else {
12928 			/*
12929 			 * The EEPROM 'termination_lvd' field contains a bad value.
12930 			 * Use automatic termination instead.
12931 			 */
12932 			asc_dvc->cfg->termination = termination;
12933 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
12934 		}
12935 	}
12936 
12937 	return warn_code;
12938 }
12939 
12940 /*
12941  * Read the board's EEPROM configuration. Set fields in ASC_DVC_VAR and
12942  * ASC_DVC_CFG based on the EEPROM settings. The chip is stopped while
12943  * all of this is done.
12944  *
12945  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
12946  *
12947  * For a non-fatal error return a warning code. If there are no warnings
12948  * then 0 is returned.
12949  *
12950  * Note: Chip is stopped on entry.
12951  */
12952 static int __devinit AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
12953 {
12954 	AdvPortAddr iop_base;
12955 	ushort warn_code;
12956 	ADVEEP_38C1600_CONFIG eep_config;
12957 	uchar tid, termination;
12958 	ushort sdtr_speed = 0;
12959 
12960 	iop_base = asc_dvc->iop_base;
12961 
12962 	warn_code = 0;
12963 
12964 	/*
12965 	 * Read the board's EEPROM configuration.
12966 	 *
12967 	 * Set default values if a bad checksum is found.
12968 	 */
12969 	if (AdvGet38C1600EEPConfig(iop_base, &eep_config) !=
12970 	    eep_config.check_sum) {
12971 		struct pci_dev *pdev = adv_dvc_to_pdev(asc_dvc);
12972 		warn_code |= ASC_WARN_EEPROM_CHKSUM;
12973 
12974 		/*
12975 		 * Set EEPROM default values.
12976 		 */
12977 		memcpy(&eep_config, &Default_38C1600_EEPROM_Config,
12978 			sizeof(ADVEEP_38C1600_CONFIG));
12979 
12980 		if (PCI_FUNC(pdev->devfn) != 0) {
12981 			u8 ints;
12982 			/*
12983 			 * Disable Bit 14 (BIOS_ENABLE) to fix SPARC Ultra 60
12984 			 * and old Mac system booting problem. The Expansion
12985 			 * ROM must be disabled in Function 1 for these systems
12986 			 */
12987 			eep_config.cfg_lsw &= ~ADV_EEPROM_BIOS_ENABLE;
12988 			/*
12989 			 * Clear the INTAB (bit 11) if the GPIO 0 input
12990 			 * indicates the Function 1 interrupt line is wired
12991 			 * to INTB.
12992 			 *
12993 			 * Set/Clear Bit 11 (INTAB) from the GPIO bit 0 input:
12994 			 *   1 - Function 1 interrupt line wired to INT A.
12995 			 *   0 - Function 1 interrupt line wired to INT B.
12996 			 *
12997 			 * Note: Function 0 is always wired to INTA.
12998 			 * Put all 5 GPIO bits in input mode and then read
12999 			 * their input values.
13000 			 */
13001 			AdvWriteByteRegister(iop_base, IOPB_GPIO_CNTL, 0);
13002 			ints = AdvReadByteRegister(iop_base, IOPB_GPIO_DATA);
13003 			if ((ints & 0x01) == 0)
13004 				eep_config.cfg_lsw &= ~ADV_EEPROM_INTAB;
13005 		}
13006 
13007 		/*
13008 		 * Assume the 6 byte board serial number that was read from
13009 		 * EEPROM is correct even if the EEPROM checksum failed.
13010 		 */
13011 		eep_config.serial_number_word3 =
13012 			AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
13013 		eep_config.serial_number_word2 =
13014 			AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
13015 		eep_config.serial_number_word1 =
13016 			AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
13017 
13018 		AdvSet38C1600EEPConfig(iop_base, &eep_config);
13019 	}
13020 
13021 	/*
13022 	 * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
13023 	 * EEPROM configuration that was read.
13024 	 *
13025 	 * This is the mapping of EEPROM fields to Adv Library fields.
13026 	 */
13027 	asc_dvc->wdtr_able = eep_config.wdtr_able;
13028 	asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
13029 	asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
13030 	asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
13031 	asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
13032 	asc_dvc->ppr_able = 0;
13033 	asc_dvc->tagqng_able = eep_config.tagqng_able;
13034 	asc_dvc->cfg->disc_enable = eep_config.disc_enable;
13035 	asc_dvc->max_host_qng = eep_config.max_host_qng;
13036 	asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13037 	asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ASC_MAX_TID);
13038 	asc_dvc->start_motor = eep_config.start_motor;
13039 	asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
13040 	asc_dvc->bios_ctrl = eep_config.bios_ctrl;
13041 	asc_dvc->no_scam = eep_config.scam_tolerant;
13042 
13043 	/*
13044 	 * For every Target ID if any of its 'sdtr_speed[1234]' bits
13045 	 * are set, then set an 'sdtr_able' bit for it.
13046 	 */
13047 	asc_dvc->sdtr_able = 0;
13048 	for (tid = 0; tid <= ASC_MAX_TID; tid++) {
13049 		if (tid == 0) {
13050 			sdtr_speed = asc_dvc->sdtr_speed1;
13051 		} else if (tid == 4) {
13052 			sdtr_speed = asc_dvc->sdtr_speed2;
13053 		} else if (tid == 8) {
13054 			sdtr_speed = asc_dvc->sdtr_speed3;
13055 		} else if (tid == 12) {
13056 			sdtr_speed = asc_dvc->sdtr_speed4;
13057 		}
13058 		if (sdtr_speed & ASC_MAX_TID) {
13059 			asc_dvc->sdtr_able |= (1 << tid);
13060 		}
13061 		sdtr_speed >>= 4;
13062 	}
13063 
13064 	/*
13065 	 * Set the host maximum queuing (max. 253, min. 16) and the per device
13066 	 * maximum queuing (max. 63, min. 4).
13067 	 */
13068 	if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
13069 		eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13070 	} else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
13071 		/* If the value is zero, assume it is uninitialized. */
13072 		if (eep_config.max_host_qng == 0) {
13073 			eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
13074 		} else {
13075 			eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
13076 		}
13077 	}
13078 
13079 	if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
13080 		eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13081 	} else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
13082 		/* If the value is zero, assume it is uninitialized. */
13083 		if (eep_config.max_dvc_qng == 0) {
13084 			eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
13085 		} else {
13086 			eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
13087 		}
13088 	}
13089 
13090 	/*
13091 	 * If 'max_dvc_qng' is greater than 'max_host_qng', then
13092 	 * set 'max_dvc_qng' to 'max_host_qng'.
13093 	 */
13094 	if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
13095 		eep_config.max_dvc_qng = eep_config.max_host_qng;
13096 	}
13097 
13098 	/*
13099 	 * Set ASC_DVC_VAR 'max_host_qng' and ASC_DVC_VAR 'max_dvc_qng'
13100 	 * values based on possibly adjusted EEPROM values.
13101 	 */
13102 	asc_dvc->max_host_qng = eep_config.max_host_qng;
13103 	asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
13104 
13105 	/*
13106 	 * If the EEPROM 'termination' field is set to automatic (0), then set
13107 	 * the ASC_DVC_CFG 'termination' field to automatic also.
13108 	 *
13109 	 * If the termination is specified with a non-zero 'termination'
13110 	 * value check that a legal value is set and set the ASC_DVC_CFG
13111 	 * 'termination' field appropriately.
13112 	 */
13113 	if (eep_config.termination_se == 0) {
13114 		termination = 0;	/* auto termination for SE */
13115 	} else {
13116 		/* Enable manual control with low off / high off. */
13117 		if (eep_config.termination_se == 1) {
13118 			termination = 0;
13119 
13120 			/* Enable manual control with low off / high on. */
13121 		} else if (eep_config.termination_se == 2) {
13122 			termination = TERM_SE_HI;
13123 
13124 			/* Enable manual control with low on / high on. */
13125 		} else if (eep_config.termination_se == 3) {
13126 			termination = TERM_SE;
13127 		} else {
13128 			/*
13129 			 * The EEPROM 'termination_se' field contains a bad value.
13130 			 * Use automatic termination instead.
13131 			 */
13132 			termination = 0;
13133 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
13134 		}
13135 	}
13136 
13137 	if (eep_config.termination_lvd == 0) {
13138 		asc_dvc->cfg->termination = termination;	/* auto termination for LVD */
13139 	} else {
13140 		/* Enable manual control with low off / high off. */
13141 		if (eep_config.termination_lvd == 1) {
13142 			asc_dvc->cfg->termination = termination;
13143 
13144 			/* Enable manual control with low off / high on. */
13145 		} else if (eep_config.termination_lvd == 2) {
13146 			asc_dvc->cfg->termination = termination | TERM_LVD_HI;
13147 
13148 			/* Enable manual control with low on / high on. */
13149 		} else if (eep_config.termination_lvd == 3) {
13150 			asc_dvc->cfg->termination = termination | TERM_LVD;
13151 		} else {
13152 			/*
13153 			 * The EEPROM 'termination_lvd' field contains a bad value.
13154 			 * Use automatic termination instead.
13155 			 */
13156 			asc_dvc->cfg->termination = termination;
13157 			warn_code |= ASC_WARN_EEPROM_TERMINATION;
13158 		}
13159 	}
13160 
13161 	return warn_code;
13162 }
13163 
13164 /*
13165  * Initialize the ADV_DVC_VAR structure.
13166  *
13167  * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
13168  *
13169  * For a non-fatal error return a warning code. If there are no warnings
13170  * then 0 is returned.
13171  */
13172 static int __devinit
13173 AdvInitGetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
13174 {
13175 	struct asc_board *board = shost_priv(shost);
13176 	ADV_DVC_VAR *asc_dvc = &board->dvc_var.adv_dvc_var;
13177 	unsigned short warn_code = 0;
13178 	AdvPortAddr iop_base = asc_dvc->iop_base;
13179 	u16 cmd;
13180 	int status;
13181 
13182 	asc_dvc->err_code = 0;
13183 
13184 	/*
13185 	 * Save the state of the PCI Configuration Command Register
13186 	 * "Parity Error Response Control" Bit. If the bit is clear (0),
13187 	 * in AdvInitAsc3550/38C0800Driver() tell the microcode to ignore
13188 	 * DMA parity errors.
13189 	 */
13190 	asc_dvc->cfg->control_flag = 0;
13191 	pci_read_config_word(pdev, PCI_COMMAND, &cmd);
13192 	if ((cmd & PCI_COMMAND_PARITY) == 0)
13193 		asc_dvc->cfg->control_flag |= CONTROL_FLAG_IGNORE_PERR;
13194 
13195 	asc_dvc->cfg->chip_version =
13196 	    AdvGetChipVersion(iop_base, asc_dvc->bus_type);
13197 
13198 	ASC_DBG(1, "iopb_chip_id_1: 0x%x 0x%x\n",
13199 		 (ushort)AdvReadByteRegister(iop_base, IOPB_CHIP_ID_1),
13200 		 (ushort)ADV_CHIP_ID_BYTE);
13201 
13202 	ASC_DBG(1, "iopw_chip_id_0: 0x%x 0x%x\n",
13203 		 (ushort)AdvReadWordRegister(iop_base, IOPW_CHIP_ID_0),
13204 		 (ushort)ADV_CHIP_ID_WORD);
13205 
13206 	/*
13207 	 * Reset the chip to start and allow register writes.
13208 	 */
13209 	if (AdvFindSignature(iop_base) == 0) {
13210 		asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
13211 		return ADV_ERROR;
13212 	} else {
13213 		/*
13214 		 * The caller must set 'chip_type' to a valid setting.
13215 		 */
13216 		if (asc_dvc->chip_type != ADV_CHIP_ASC3550 &&
13217 		    asc_dvc->chip_type != ADV_CHIP_ASC38C0800 &&
13218 		    asc_dvc->chip_type != ADV_CHIP_ASC38C1600) {
13219 			asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE;
13220 			return ADV_ERROR;
13221 		}
13222 
13223 		/*
13224 		 * Reset Chip.
13225 		 */
13226 		AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
13227 				     ADV_CTRL_REG_CMD_RESET);
13228 		mdelay(100);
13229 		AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
13230 				     ADV_CTRL_REG_CMD_WR_IO_REG);
13231 
13232 		if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
13233 			status = AdvInitFrom38C1600EEP(asc_dvc);
13234 		} else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
13235 			status = AdvInitFrom38C0800EEP(asc_dvc);
13236 		} else {
13237 			status = AdvInitFrom3550EEP(asc_dvc);
13238 		}
13239 		warn_code |= status;
13240 	}
13241 
13242 	if (warn_code != 0)
13243 		shost_printk(KERN_WARNING, shost, "warning: 0x%x\n", warn_code);
13244 
13245 	if (asc_dvc->err_code)
13246 		shost_printk(KERN_ERR, shost, "error code 0x%x\n",
13247 				asc_dvc->err_code);
13248 
13249 	return asc_dvc->err_code;
13250 }
13251 #endif
13252 
13253 static struct scsi_host_template advansys_template = {
13254 	.proc_name = DRV_NAME,
13255 #ifdef CONFIG_PROC_FS
13256 	.proc_info = advansys_proc_info,
13257 #endif
13258 	.name = DRV_NAME,
13259 	.info = advansys_info,
13260 	.queuecommand = advansys_queuecommand,
13261 	.eh_bus_reset_handler = advansys_reset,
13262 	.bios_param = advansys_biosparam,
13263 	.slave_configure = advansys_slave_configure,
13264 	/*
13265 	 * Because the driver may control an ISA adapter 'unchecked_isa_dma'
13266 	 * must be set. The flag will be cleared in advansys_board_found
13267 	 * for non-ISA adapters.
13268 	 */
13269 	.unchecked_isa_dma = 1,
13270 	/*
13271 	 * All adapters controlled by this driver are capable of large
13272 	 * scatter-gather lists. According to the mid-level SCSI documentation
13273 	 * this obviates any performance gain provided by setting
13274 	 * 'use_clustering'. But empirically while CPU utilization is increased
13275 	 * by enabling clustering, I/O throughput increases as well.
13276 	 */
13277 	.use_clustering = ENABLE_CLUSTERING,
13278 };
13279 
13280 static int __devinit advansys_wide_init_chip(struct Scsi_Host *shost)
13281 {
13282 	struct asc_board *board = shost_priv(shost);
13283 	struct adv_dvc_var *adv_dvc = &board->dvc_var.adv_dvc_var;
13284 	int req_cnt = 0;
13285 	adv_req_t *reqp = NULL;
13286 	int sg_cnt = 0;
13287 	adv_sgblk_t *sgp;
13288 	int warn_code, err_code;
13289 
13290 	/*
13291 	 * Allocate buffer carrier structures. The total size
13292 	 * is about 4 KB, so allocate all at once.
13293 	 */
13294 	adv_dvc->carrier_buf = kmalloc(ADV_CARRIER_BUFSIZE, GFP_KERNEL);
13295 	ASC_DBG(1, "carrier_buf 0x%p\n", adv_dvc->carrier_buf);
13296 
13297 	if (!adv_dvc->carrier_buf)
13298 		goto kmalloc_failed;
13299 
13300 	/*
13301 	 * Allocate up to 'max_host_qng' request structures for the Wide
13302 	 * board. The total size is about 16 KB, so allocate all at once.
13303 	 * If the allocation fails decrement and try again.
13304 	 */
13305 	for (req_cnt = adv_dvc->max_host_qng; req_cnt > 0; req_cnt--) {
13306 		reqp = kmalloc(sizeof(adv_req_t) * req_cnt, GFP_KERNEL);
13307 
13308 		ASC_DBG(1, "reqp 0x%p, req_cnt %d, bytes %lu\n", reqp, req_cnt,
13309 			 (ulong)sizeof(adv_req_t) * req_cnt);
13310 
13311 		if (reqp)
13312 			break;
13313 	}
13314 
13315 	if (!reqp)
13316 		goto kmalloc_failed;
13317 
13318 	adv_dvc->orig_reqp = reqp;
13319 
13320 	/*
13321 	 * Allocate up to ADV_TOT_SG_BLOCK request structures for
13322 	 * the Wide board. Each structure is about 136 bytes.
13323 	 */
13324 	board->adv_sgblkp = NULL;
13325 	for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) {
13326 		sgp = kmalloc(sizeof(adv_sgblk_t), GFP_KERNEL);
13327 
13328 		if (!sgp)
13329 			break;
13330 
13331 		sgp->next_sgblkp = board->adv_sgblkp;
13332 		board->adv_sgblkp = sgp;
13333 
13334 	}
13335 
13336 	ASC_DBG(1, "sg_cnt %d * %lu = %lu bytes\n", sg_cnt, sizeof(adv_sgblk_t),
13337 		 sizeof(adv_sgblk_t) * sg_cnt);
13338 
13339 	if (!board->adv_sgblkp)
13340 		goto kmalloc_failed;
13341 
13342 	/*
13343 	 * Point 'adv_reqp' to the request structures and
13344 	 * link them together.
13345 	 */
13346 	req_cnt--;
13347 	reqp[req_cnt].next_reqp = NULL;
13348 	for (; req_cnt > 0; req_cnt--) {
13349 		reqp[req_cnt - 1].next_reqp = &reqp[req_cnt];
13350 	}
13351 	board->adv_reqp = &reqp[0];
13352 
13353 	if (adv_dvc->chip_type == ADV_CHIP_ASC3550) {
13354 		ASC_DBG(2, "AdvInitAsc3550Driver()\n");
13355 		warn_code = AdvInitAsc3550Driver(adv_dvc);
13356 	} else if (adv_dvc->chip_type == ADV_CHIP_ASC38C0800) {
13357 		ASC_DBG(2, "AdvInitAsc38C0800Driver()\n");
13358 		warn_code = AdvInitAsc38C0800Driver(adv_dvc);
13359 	} else {
13360 		ASC_DBG(2, "AdvInitAsc38C1600Driver()\n");
13361 		warn_code = AdvInitAsc38C1600Driver(adv_dvc);
13362 	}
13363 	err_code = adv_dvc->err_code;
13364 
13365 	if (warn_code || err_code) {
13366 		shost_printk(KERN_WARNING, shost, "error: warn 0x%x, error "
13367 			"0x%x\n", warn_code, err_code);
13368 	}
13369 
13370 	goto exit;
13371 
13372  kmalloc_failed:
13373 	shost_printk(KERN_ERR, shost, "error: kmalloc() failed\n");
13374 	err_code = ADV_ERROR;
13375  exit:
13376 	return err_code;
13377 }
13378 
13379 static void advansys_wide_free_mem(struct asc_board *board)
13380 {
13381 	struct adv_dvc_var *adv_dvc = &board->dvc_var.adv_dvc_var;
13382 	kfree(adv_dvc->carrier_buf);
13383 	adv_dvc->carrier_buf = NULL;
13384 	kfree(adv_dvc->orig_reqp);
13385 	adv_dvc->orig_reqp = board->adv_reqp = NULL;
13386 	while (board->adv_sgblkp) {
13387 		adv_sgblk_t *sgp = board->adv_sgblkp;
13388 		board->adv_sgblkp = sgp->next_sgblkp;
13389 		kfree(sgp);
13390 	}
13391 }
13392 
13393 static int __devinit advansys_board_found(struct Scsi_Host *shost,
13394 					  unsigned int iop, int bus_type)
13395 {
13396 	struct pci_dev *pdev;
13397 	struct asc_board *boardp = shost_priv(shost);
13398 	ASC_DVC_VAR *asc_dvc_varp = NULL;
13399 	ADV_DVC_VAR *adv_dvc_varp = NULL;
13400 	int share_irq, warn_code, ret;
13401 
13402 	pdev = (bus_type == ASC_IS_PCI) ? to_pci_dev(boardp->dev) : NULL;
13403 
13404 	if (ASC_NARROW_BOARD(boardp)) {
13405 		ASC_DBG(1, "narrow board\n");
13406 		asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
13407 		asc_dvc_varp->bus_type = bus_type;
13408 		asc_dvc_varp->drv_ptr = boardp;
13409 		asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg;
13410 		asc_dvc_varp->iop_base = iop;
13411 	} else {
13412 #ifdef CONFIG_PCI
13413 		adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
13414 		adv_dvc_varp->drv_ptr = boardp;
13415 		adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg;
13416 		if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW) {
13417 			ASC_DBG(1, "wide board ASC-3550\n");
13418 			adv_dvc_varp->chip_type = ADV_CHIP_ASC3550;
13419 		} else if (pdev->device == PCI_DEVICE_ID_38C0800_REV1) {
13420 			ASC_DBG(1, "wide board ASC-38C0800\n");
13421 			adv_dvc_varp->chip_type = ADV_CHIP_ASC38C0800;
13422 		} else {
13423 			ASC_DBG(1, "wide board ASC-38C1600\n");
13424 			adv_dvc_varp->chip_type = ADV_CHIP_ASC38C1600;
13425 		}
13426 
13427 		boardp->asc_n_io_port = pci_resource_len(pdev, 1);
13428 		boardp->ioremap_addr = ioremap(pci_resource_start(pdev, 1),
13429 					       boardp->asc_n_io_port);
13430 		if (!boardp->ioremap_addr) {
13431 			shost_printk(KERN_ERR, shost, "ioremap(%lx, %d) "
13432 					"returned NULL\n",
13433 					(long)pci_resource_start(pdev, 1),
13434 					boardp->asc_n_io_port);
13435 			ret = -ENODEV;
13436 			goto err_shost;
13437 		}
13438 		adv_dvc_varp->iop_base = (AdvPortAddr)boardp->ioremap_addr;
13439 		ASC_DBG(1, "iop_base: 0x%p\n", adv_dvc_varp->iop_base);
13440 
13441 		/*
13442 		 * Even though it isn't used to access wide boards, other
13443 		 * than for the debug line below, save I/O Port address so
13444 		 * that it can be reported.
13445 		 */
13446 		boardp->ioport = iop;
13447 
13448 		ASC_DBG(1, "iopb_chip_id_1 0x%x, iopw_chip_id_0 0x%x\n",
13449 				(ushort)inp(iop + 1), (ushort)inpw(iop));
13450 #endif /* CONFIG_PCI */
13451 	}
13452 
13453 #ifdef CONFIG_PROC_FS
13454 	/*
13455 	 * Allocate buffer for printing information from
13456 	 * /proc/scsi/advansys/[0...].
13457 	 */
13458 	boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_KERNEL);
13459 	if (!boardp->prtbuf) {
13460 		shost_printk(KERN_ERR, shost, "kmalloc(%d) returned NULL\n",
13461 				ASC_PRTBUF_SIZE);
13462 		ret = -ENOMEM;
13463 		goto err_unmap;
13464 	}
13465 #endif /* CONFIG_PROC_FS */
13466 
13467 	if (ASC_NARROW_BOARD(boardp)) {
13468 		/*
13469 		 * Set the board bus type and PCI IRQ before
13470 		 * calling AscInitGetConfig().
13471 		 */
13472 		switch (asc_dvc_varp->bus_type) {
13473 #ifdef CONFIG_ISA
13474 		case ASC_IS_ISA:
13475 			shost->unchecked_isa_dma = TRUE;
13476 			share_irq = 0;
13477 			break;
13478 		case ASC_IS_VL:
13479 			shost->unchecked_isa_dma = FALSE;
13480 			share_irq = 0;
13481 			break;
13482 		case ASC_IS_EISA:
13483 			shost->unchecked_isa_dma = FALSE;
13484 			share_irq = IRQF_SHARED;
13485 			break;
13486 #endif /* CONFIG_ISA */
13487 #ifdef CONFIG_PCI
13488 		case ASC_IS_PCI:
13489 			shost->unchecked_isa_dma = FALSE;
13490 			share_irq = IRQF_SHARED;
13491 			break;
13492 #endif /* CONFIG_PCI */
13493 		default:
13494 			shost_printk(KERN_ERR, shost, "unknown adapter type: "
13495 					"%d\n", asc_dvc_varp->bus_type);
13496 			shost->unchecked_isa_dma = TRUE;
13497 			share_irq = 0;
13498 			break;
13499 		}
13500 
13501 		/*
13502 		 * NOTE: AscInitGetConfig() may change the board's
13503 		 * bus_type value. The bus_type value should no
13504 		 * longer be used. If the bus_type field must be
13505 		 * referenced only use the bit-wise AND operator "&".
13506 		 */
13507 		ASC_DBG(2, "AscInitGetConfig()\n");
13508 		ret = AscInitGetConfig(shost) ? -ENODEV : 0;
13509 	} else {
13510 #ifdef CONFIG_PCI
13511 		/*
13512 		 * For Wide boards set PCI information before calling
13513 		 * AdvInitGetConfig().
13514 		 */
13515 		shost->unchecked_isa_dma = FALSE;
13516 		share_irq = IRQF_SHARED;
13517 		ASC_DBG(2, "AdvInitGetConfig()\n");
13518 
13519 		ret = AdvInitGetConfig(pdev, shost) ? -ENODEV : 0;
13520 #endif /* CONFIG_PCI */
13521 	}
13522 
13523 	if (ret)
13524 		goto err_free_proc;
13525 
13526 	/*
13527 	 * Save the EEPROM configuration so that it can be displayed
13528 	 * from /proc/scsi/advansys/[0...].
13529 	 */
13530 	if (ASC_NARROW_BOARD(boardp)) {
13531 
13532 		ASCEEP_CONFIG *ep;
13533 
13534 		/*
13535 		 * Set the adapter's target id bit in the 'init_tidmask' field.
13536 		 */
13537 		boardp->init_tidmask |=
13538 		    ADV_TID_TO_TIDMASK(asc_dvc_varp->cfg->chip_scsi_id);
13539 
13540 		/*
13541 		 * Save EEPROM settings for the board.
13542 		 */
13543 		ep = &boardp->eep_config.asc_eep;
13544 
13545 		ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable;
13546 		ep->disc_enable = asc_dvc_varp->cfg->disc_enable;
13547 		ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled;
13548 		ASC_EEP_SET_DMA_SPD(ep, asc_dvc_varp->cfg->isa_dma_speed);
13549 		ep->start_motor = asc_dvc_varp->start_motor;
13550 		ep->cntl = asc_dvc_varp->dvc_cntl;
13551 		ep->no_scam = asc_dvc_varp->no_scam;
13552 		ep->max_total_qng = asc_dvc_varp->max_total_qng;
13553 		ASC_EEP_SET_CHIP_ID(ep, asc_dvc_varp->cfg->chip_scsi_id);
13554 		/* 'max_tag_qng' is set to the same value for every device. */
13555 		ep->max_tag_qng = asc_dvc_varp->cfg->max_tag_qng[0];
13556 		ep->adapter_info[0] = asc_dvc_varp->cfg->adapter_info[0];
13557 		ep->adapter_info[1] = asc_dvc_varp->cfg->adapter_info[1];
13558 		ep->adapter_info[2] = asc_dvc_varp->cfg->adapter_info[2];
13559 		ep->adapter_info[3] = asc_dvc_varp->cfg->adapter_info[3];
13560 		ep->adapter_info[4] = asc_dvc_varp->cfg->adapter_info[4];
13561 		ep->adapter_info[5] = asc_dvc_varp->cfg->adapter_info[5];
13562 
13563 		/*
13564 		 * Modify board configuration.
13565 		 */
13566 		ASC_DBG(2, "AscInitSetConfig()\n");
13567 		ret = AscInitSetConfig(pdev, shost) ? -ENODEV : 0;
13568 		if (ret)
13569 			goto err_free_proc;
13570 	} else {
13571 		ADVEEP_3550_CONFIG *ep_3550;
13572 		ADVEEP_38C0800_CONFIG *ep_38C0800;
13573 		ADVEEP_38C1600_CONFIG *ep_38C1600;
13574 
13575 		/*
13576 		 * Save Wide EEP Configuration Information.
13577 		 */
13578 		if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
13579 			ep_3550 = &boardp->eep_config.adv_3550_eep;
13580 
13581 			ep_3550->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
13582 			ep_3550->max_host_qng = adv_dvc_varp->max_host_qng;
13583 			ep_3550->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
13584 			ep_3550->termination = adv_dvc_varp->cfg->termination;
13585 			ep_3550->disc_enable = adv_dvc_varp->cfg->disc_enable;
13586 			ep_3550->bios_ctrl = adv_dvc_varp->bios_ctrl;
13587 			ep_3550->wdtr_able = adv_dvc_varp->wdtr_able;
13588 			ep_3550->sdtr_able = adv_dvc_varp->sdtr_able;
13589 			ep_3550->ultra_able = adv_dvc_varp->ultra_able;
13590 			ep_3550->tagqng_able = adv_dvc_varp->tagqng_able;
13591 			ep_3550->start_motor = adv_dvc_varp->start_motor;
13592 			ep_3550->scsi_reset_delay =
13593 			    adv_dvc_varp->scsi_reset_wait;
13594 			ep_3550->serial_number_word1 =
13595 			    adv_dvc_varp->cfg->serial1;
13596 			ep_3550->serial_number_word2 =
13597 			    adv_dvc_varp->cfg->serial2;
13598 			ep_3550->serial_number_word3 =
13599 			    adv_dvc_varp->cfg->serial3;
13600 		} else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
13601 			ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
13602 
13603 			ep_38C0800->adapter_scsi_id =
13604 			    adv_dvc_varp->chip_scsi_id;
13605 			ep_38C0800->max_host_qng = adv_dvc_varp->max_host_qng;
13606 			ep_38C0800->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
13607 			ep_38C0800->termination_lvd =
13608 			    adv_dvc_varp->cfg->termination;
13609 			ep_38C0800->disc_enable =
13610 			    adv_dvc_varp->cfg->disc_enable;
13611 			ep_38C0800->bios_ctrl = adv_dvc_varp->bios_ctrl;
13612 			ep_38C0800->wdtr_able = adv_dvc_varp->wdtr_able;
13613 			ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
13614 			ep_38C0800->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
13615 			ep_38C0800->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
13616 			ep_38C0800->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
13617 			ep_38C0800->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
13618 			ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
13619 			ep_38C0800->start_motor = adv_dvc_varp->start_motor;
13620 			ep_38C0800->scsi_reset_delay =
13621 			    adv_dvc_varp->scsi_reset_wait;
13622 			ep_38C0800->serial_number_word1 =
13623 			    adv_dvc_varp->cfg->serial1;
13624 			ep_38C0800->serial_number_word2 =
13625 			    adv_dvc_varp->cfg->serial2;
13626 			ep_38C0800->serial_number_word3 =
13627 			    adv_dvc_varp->cfg->serial3;
13628 		} else {
13629 			ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
13630 
13631 			ep_38C1600->adapter_scsi_id =
13632 			    adv_dvc_varp->chip_scsi_id;
13633 			ep_38C1600->max_host_qng = adv_dvc_varp->max_host_qng;
13634 			ep_38C1600->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
13635 			ep_38C1600->termination_lvd =
13636 			    adv_dvc_varp->cfg->termination;
13637 			ep_38C1600->disc_enable =
13638 			    adv_dvc_varp->cfg->disc_enable;
13639 			ep_38C1600->bios_ctrl = adv_dvc_varp->bios_ctrl;
13640 			ep_38C1600->wdtr_able = adv_dvc_varp->wdtr_able;
13641 			ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
13642 			ep_38C1600->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
13643 			ep_38C1600->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
13644 			ep_38C1600->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
13645 			ep_38C1600->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
13646 			ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
13647 			ep_38C1600->start_motor = adv_dvc_varp->start_motor;
13648 			ep_38C1600->scsi_reset_delay =
13649 			    adv_dvc_varp->scsi_reset_wait;
13650 			ep_38C1600->serial_number_word1 =
13651 			    adv_dvc_varp->cfg->serial1;
13652 			ep_38C1600->serial_number_word2 =
13653 			    adv_dvc_varp->cfg->serial2;
13654 			ep_38C1600->serial_number_word3 =
13655 			    adv_dvc_varp->cfg->serial3;
13656 		}
13657 
13658 		/*
13659 		 * Set the adapter's target id bit in the 'init_tidmask' field.
13660 		 */
13661 		boardp->init_tidmask |=
13662 		    ADV_TID_TO_TIDMASK(adv_dvc_varp->chip_scsi_id);
13663 	}
13664 
13665 	/*
13666 	 * Channels are numbered beginning with 0. For AdvanSys one host
13667 	 * structure supports one channel. Multi-channel boards have a
13668 	 * separate host structure for each channel.
13669 	 */
13670 	shost->max_channel = 0;
13671 	if (ASC_NARROW_BOARD(boardp)) {
13672 		shost->max_id = ASC_MAX_TID + 1;
13673 		shost->max_lun = ASC_MAX_LUN + 1;
13674 		shost->max_cmd_len = ASC_MAX_CDB_LEN;
13675 
13676 		shost->io_port = asc_dvc_varp->iop_base;
13677 		boardp->asc_n_io_port = ASC_IOADR_GAP;
13678 		shost->this_id = asc_dvc_varp->cfg->chip_scsi_id;
13679 
13680 		/* Set maximum number of queues the adapter can handle. */
13681 		shost->can_queue = asc_dvc_varp->max_total_qng;
13682 	} else {
13683 		shost->max_id = ADV_MAX_TID + 1;
13684 		shost->max_lun = ADV_MAX_LUN + 1;
13685 		shost->max_cmd_len = ADV_MAX_CDB_LEN;
13686 
13687 		/*
13688 		 * Save the I/O Port address and length even though
13689 		 * I/O ports are not used to access Wide boards.
13690 		 * Instead the Wide boards are accessed with
13691 		 * PCI Memory Mapped I/O.
13692 		 */
13693 		shost->io_port = iop;
13694 
13695 		shost->this_id = adv_dvc_varp->chip_scsi_id;
13696 
13697 		/* Set maximum number of queues the adapter can handle. */
13698 		shost->can_queue = adv_dvc_varp->max_host_qng;
13699 	}
13700 
13701 	/*
13702 	 * Following v1.3.89, 'cmd_per_lun' is no longer needed
13703 	 * and should be set to zero.
13704 	 *
13705 	 * But because of a bug introduced in v1.3.89 if the driver is
13706 	 * compiled as a module and 'cmd_per_lun' is zero, the Mid-Level
13707 	 * SCSI function 'allocate_device' will panic. To allow the driver
13708 	 * to work as a module in these kernels set 'cmd_per_lun' to 1.
13709 	 *
13710 	 * Note: This is wrong.  cmd_per_lun should be set to the depth
13711 	 * you want on untagged devices always.
13712 	 #ifdef MODULE
13713 	 */
13714 	shost->cmd_per_lun = 1;
13715 /* #else
13716             shost->cmd_per_lun = 0;
13717 #endif */
13718 
13719 	/*
13720 	 * Set the maximum number of scatter-gather elements the
13721 	 * adapter can handle.
13722 	 */
13723 	if (ASC_NARROW_BOARD(boardp)) {
13724 		/*
13725 		 * Allow two commands with 'sg_tablesize' scatter-gather
13726 		 * elements to be executed simultaneously. This value is
13727 		 * the theoretical hardware limit. It may be decreased
13728 		 * below.
13729 		 */
13730 		shost->sg_tablesize =
13731 		    (((asc_dvc_varp->max_total_qng - 2) / 2) *
13732 		     ASC_SG_LIST_PER_Q) + 1;
13733 	} else {
13734 		shost->sg_tablesize = ADV_MAX_SG_LIST;
13735 	}
13736 
13737 	/*
13738 	 * The value of 'sg_tablesize' can not exceed the SCSI
13739 	 * mid-level driver definition of SG_ALL. SG_ALL also
13740 	 * must not be exceeded, because it is used to define the
13741 	 * size of the scatter-gather table in 'struct asc_sg_head'.
13742 	 */
13743 	if (shost->sg_tablesize > SG_ALL) {
13744 		shost->sg_tablesize = SG_ALL;
13745 	}
13746 
13747 	ASC_DBG(1, "sg_tablesize: %d\n", shost->sg_tablesize);
13748 
13749 	/* BIOS start address. */
13750 	if (ASC_NARROW_BOARD(boardp)) {
13751 		shost->base = AscGetChipBiosAddress(asc_dvc_varp->iop_base,
13752 						    asc_dvc_varp->bus_type);
13753 	} else {
13754 		/*
13755 		 * Fill-in BIOS board variables. The Wide BIOS saves
13756 		 * information in LRAM that is used by the driver.
13757 		 */
13758 		AdvReadWordLram(adv_dvc_varp->iop_base,
13759 				BIOS_SIGNATURE, boardp->bios_signature);
13760 		AdvReadWordLram(adv_dvc_varp->iop_base,
13761 				BIOS_VERSION, boardp->bios_version);
13762 		AdvReadWordLram(adv_dvc_varp->iop_base,
13763 				BIOS_CODESEG, boardp->bios_codeseg);
13764 		AdvReadWordLram(adv_dvc_varp->iop_base,
13765 				BIOS_CODELEN, boardp->bios_codelen);
13766 
13767 		ASC_DBG(1, "bios_signature 0x%x, bios_version 0x%x\n",
13768 			 boardp->bios_signature, boardp->bios_version);
13769 
13770 		ASC_DBG(1, "bios_codeseg 0x%x, bios_codelen 0x%x\n",
13771 			 boardp->bios_codeseg, boardp->bios_codelen);
13772 
13773 		/*
13774 		 * If the BIOS saved a valid signature, then fill in
13775 		 * the BIOS code segment base address.
13776 		 */
13777 		if (boardp->bios_signature == 0x55AA) {
13778 			/*
13779 			 * Convert x86 realmode code segment to a linear
13780 			 * address by shifting left 4.
13781 			 */
13782 			shost->base = ((ulong)boardp->bios_codeseg << 4);
13783 		} else {
13784 			shost->base = 0;
13785 		}
13786 	}
13787 
13788 	/*
13789 	 * Register Board Resources - I/O Port, DMA, IRQ
13790 	 */
13791 
13792 	/* Register DMA Channel for Narrow boards. */
13793 	shost->dma_channel = NO_ISA_DMA;	/* Default to no ISA DMA. */
13794 #ifdef CONFIG_ISA
13795 	if (ASC_NARROW_BOARD(boardp)) {
13796 		/* Register DMA channel for ISA bus. */
13797 		if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
13798 			shost->dma_channel = asc_dvc_varp->cfg->isa_dma_channel;
13799 			ret = request_dma(shost->dma_channel, DRV_NAME);
13800 			if (ret) {
13801 				shost_printk(KERN_ERR, shost, "request_dma() "
13802 						"%d failed %d\n",
13803 						shost->dma_channel, ret);
13804 				goto err_free_proc;
13805 			}
13806 			AscEnableIsaDma(shost->dma_channel);
13807 		}
13808 	}
13809 #endif /* CONFIG_ISA */
13810 
13811 	/* Register IRQ Number. */
13812 	ASC_DBG(2, "request_irq(%d, %p)\n", boardp->irq, shost);
13813 
13814 	ret = request_irq(boardp->irq, advansys_interrupt, share_irq,
13815 			  DRV_NAME, shost);
13816 
13817 	if (ret) {
13818 		if (ret == -EBUSY) {
13819 			shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x "
13820 					"already in use\n", boardp->irq);
13821 		} else if (ret == -EINVAL) {
13822 			shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x "
13823 					"not valid\n", boardp->irq);
13824 		} else {
13825 			shost_printk(KERN_ERR, shost, "request_irq(): IRQ 0x%x "
13826 					"failed with %d\n", boardp->irq, ret);
13827 		}
13828 		goto err_free_dma;
13829 	}
13830 
13831 	/*
13832 	 * Initialize board RISC chip and enable interrupts.
13833 	 */
13834 	if (ASC_NARROW_BOARD(boardp)) {
13835 		ASC_DBG(2, "AscInitAsc1000Driver()\n");
13836 
13837 		asc_dvc_varp->overrun_buf = kzalloc(ASC_OVERRUN_BSIZE, GFP_KERNEL);
13838 		if (!asc_dvc_varp->overrun_buf) {
13839 			ret = -ENOMEM;
13840 			goto err_free_wide_mem;
13841 		}
13842 		warn_code = AscInitAsc1000Driver(asc_dvc_varp);
13843 
13844 		if (warn_code || asc_dvc_varp->err_code) {
13845 			shost_printk(KERN_ERR, shost, "error: init_state 0x%x, "
13846 					"warn 0x%x, error 0x%x\n",
13847 					asc_dvc_varp->init_state, warn_code,
13848 					asc_dvc_varp->err_code);
13849 			if (asc_dvc_varp->err_code) {
13850 				ret = -ENODEV;
13851 				kfree(asc_dvc_varp->overrun_buf);
13852 			}
13853 		}
13854 	} else {
13855 		if (advansys_wide_init_chip(shost))
13856 			ret = -ENODEV;
13857 	}
13858 
13859 	if (ret)
13860 		goto err_free_wide_mem;
13861 
13862 	ASC_DBG_PRT_SCSI_HOST(2, shost);
13863 
13864 	ret = scsi_add_host(shost, boardp->dev);
13865 	if (ret)
13866 		goto err_free_wide_mem;
13867 
13868 	scsi_scan_host(shost);
13869 	return 0;
13870 
13871  err_free_wide_mem:
13872 	advansys_wide_free_mem(boardp);
13873 	free_irq(boardp->irq, shost);
13874  err_free_dma:
13875 	if (shost->dma_channel != NO_ISA_DMA)
13876 		free_dma(shost->dma_channel);
13877  err_free_proc:
13878 	kfree(boardp->prtbuf);
13879  err_unmap:
13880 	if (boardp->ioremap_addr)
13881 		iounmap(boardp->ioremap_addr);
13882  err_shost:
13883 	return ret;
13884 }
13885 
13886 /*
13887  * advansys_release()
13888  *
13889  * Release resources allocated for a single AdvanSys adapter.
13890  */
13891 static int advansys_release(struct Scsi_Host *shost)
13892 {
13893 	struct asc_board *board = shost_priv(shost);
13894 	ASC_DBG(1, "begin\n");
13895 	scsi_remove_host(shost);
13896 	free_irq(board->irq, shost);
13897 	if (shost->dma_channel != NO_ISA_DMA) {
13898 		ASC_DBG(1, "free_dma()\n");
13899 		free_dma(shost->dma_channel);
13900 	}
13901 	if (ASC_NARROW_BOARD(board)) {
13902 		dma_unmap_single(board->dev,
13903 					board->dvc_var.asc_dvc_var.overrun_dma,
13904 					ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE);
13905 		kfree(board->dvc_var.asc_dvc_var.overrun_buf);
13906 	} else {
13907 		iounmap(board->ioremap_addr);
13908 		advansys_wide_free_mem(board);
13909 	}
13910 	kfree(board->prtbuf);
13911 	scsi_host_put(shost);
13912 	ASC_DBG(1, "end\n");
13913 	return 0;
13914 }
13915 
13916 #define ASC_IOADR_TABLE_MAX_IX  11
13917 
13918 static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] = {
13919 	0x100, 0x0110, 0x120, 0x0130, 0x140, 0x0150, 0x0190,
13920 	0x0210, 0x0230, 0x0250, 0x0330
13921 };
13922 
13923 /*
13924  * The ISA IRQ number is found in bits 2 and 3 of the CfgLsw.  It decodes as:
13925  * 00: 10
13926  * 01: 11
13927  * 10: 12
13928  * 11: 15
13929  */
13930 static unsigned int __devinit advansys_isa_irq_no(PortAddr iop_base)
13931 {
13932 	unsigned short cfg_lsw = AscGetChipCfgLsw(iop_base);
13933 	unsigned int chip_irq = ((cfg_lsw >> 2) & 0x03) + 10;
13934 	if (chip_irq == 13)
13935 		chip_irq = 15;
13936 	return chip_irq;
13937 }
13938 
13939 static int __devinit advansys_isa_probe(struct device *dev, unsigned int id)
13940 {
13941 	int err = -ENODEV;
13942 	PortAddr iop_base = _asc_def_iop_base[id];
13943 	struct Scsi_Host *shost;
13944 	struct asc_board *board;
13945 
13946 	if (!request_region(iop_base, ASC_IOADR_GAP, DRV_NAME)) {
13947 		ASC_DBG(1, "I/O port 0x%x busy\n", iop_base);
13948 		return -ENODEV;
13949 	}
13950 	ASC_DBG(1, "probing I/O port 0x%x\n", iop_base);
13951 	if (!AscFindSignature(iop_base))
13952 		goto release_region;
13953 	if (!(AscGetChipVersion(iop_base, ASC_IS_ISA) & ASC_CHIP_VER_ISA_BIT))
13954 		goto release_region;
13955 
13956 	err = -ENOMEM;
13957 	shost = scsi_host_alloc(&advansys_template, sizeof(*board));
13958 	if (!shost)
13959 		goto release_region;
13960 
13961 	board = shost_priv(shost);
13962 	board->irq = advansys_isa_irq_no(iop_base);
13963 	board->dev = dev;
13964 
13965 	err = advansys_board_found(shost, iop_base, ASC_IS_ISA);
13966 	if (err)
13967 		goto free_host;
13968 
13969 	dev_set_drvdata(dev, shost);
13970 	return 0;
13971 
13972  free_host:
13973 	scsi_host_put(shost);
13974  release_region:
13975 	release_region(iop_base, ASC_IOADR_GAP);
13976 	return err;
13977 }
13978 
13979 static int __devexit advansys_isa_remove(struct device *dev, unsigned int id)
13980 {
13981 	int ioport = _asc_def_iop_base[id];
13982 	advansys_release(dev_get_drvdata(dev));
13983 	release_region(ioport, ASC_IOADR_GAP);
13984 	return 0;
13985 }
13986 
13987 static struct isa_driver advansys_isa_driver = {
13988 	.probe		= advansys_isa_probe,
13989 	.remove		= __devexit_p(advansys_isa_remove),
13990 	.driver = {
13991 		.owner	= THIS_MODULE,
13992 		.name	= DRV_NAME,
13993 	},
13994 };
13995 
13996 /*
13997  * The VLB IRQ number is found in bits 2 to 4 of the CfgLsw.  It decodes as:
13998  * 000: invalid
13999  * 001: 10
14000  * 010: 11
14001  * 011: 12
14002  * 100: invalid
14003  * 101: 14
14004  * 110: 15
14005  * 111: invalid
14006  */
14007 static unsigned int __devinit advansys_vlb_irq_no(PortAddr iop_base)
14008 {
14009 	unsigned short cfg_lsw = AscGetChipCfgLsw(iop_base);
14010 	unsigned int chip_irq = ((cfg_lsw >> 2) & 0x07) + 9;
14011 	if ((chip_irq < 10) || (chip_irq == 13) || (chip_irq > 15))
14012 		return 0;
14013 	return chip_irq;
14014 }
14015 
14016 static int __devinit advansys_vlb_probe(struct device *dev, unsigned int id)
14017 {
14018 	int err = -ENODEV;
14019 	PortAddr iop_base = _asc_def_iop_base[id];
14020 	struct Scsi_Host *shost;
14021 	struct asc_board *board;
14022 
14023 	if (!request_region(iop_base, ASC_IOADR_GAP, DRV_NAME)) {
14024 		ASC_DBG(1, "I/O port 0x%x busy\n", iop_base);
14025 		return -ENODEV;
14026 	}
14027 	ASC_DBG(1, "probing I/O port 0x%x\n", iop_base);
14028 	if (!AscFindSignature(iop_base))
14029 		goto release_region;
14030 	/*
14031 	 * I don't think this condition can actually happen, but the old
14032 	 * driver did it, and the chances of finding a VLB setup in 2007
14033 	 * to do testing with is slight to none.
14034 	 */
14035 	if (AscGetChipVersion(iop_base, ASC_IS_VL) > ASC_CHIP_MAX_VER_VL)
14036 		goto release_region;
14037 
14038 	err = -ENOMEM;
14039 	shost = scsi_host_alloc(&advansys_template, sizeof(*board));
14040 	if (!shost)
14041 		goto release_region;
14042 
14043 	board = shost_priv(shost);
14044 	board->irq = advansys_vlb_irq_no(iop_base);
14045 	board->dev = dev;
14046 
14047 	err = advansys_board_found(shost, iop_base, ASC_IS_VL);
14048 	if (err)
14049 		goto free_host;
14050 
14051 	dev_set_drvdata(dev, shost);
14052 	return 0;
14053 
14054  free_host:
14055 	scsi_host_put(shost);
14056  release_region:
14057 	release_region(iop_base, ASC_IOADR_GAP);
14058 	return -ENODEV;
14059 }
14060 
14061 static struct isa_driver advansys_vlb_driver = {
14062 	.probe		= advansys_vlb_probe,
14063 	.remove		= __devexit_p(advansys_isa_remove),
14064 	.driver = {
14065 		.owner	= THIS_MODULE,
14066 		.name	= "advansys_vlb",
14067 	},
14068 };
14069 
14070 static struct eisa_device_id advansys_eisa_table[] __devinitdata = {
14071 	{ "ABP7401" },
14072 	{ "ABP7501" },
14073 	{ "" }
14074 };
14075 
14076 MODULE_DEVICE_TABLE(eisa, advansys_eisa_table);
14077 
14078 /*
14079  * EISA is a little more tricky than PCI; each EISA device may have two
14080  * channels, and this driver is written to make each channel its own Scsi_Host
14081  */
14082 struct eisa_scsi_data {
14083 	struct Scsi_Host *host[2];
14084 };
14085 
14086 /*
14087  * The EISA IRQ number is found in bits 8 to 10 of the CfgLsw.  It decodes as:
14088  * 000: 10
14089  * 001: 11
14090  * 010: 12
14091  * 011: invalid
14092  * 100: 14
14093  * 101: 15
14094  * 110: invalid
14095  * 111: invalid
14096  */
14097 static unsigned int __devinit advansys_eisa_irq_no(struct eisa_device *edev)
14098 {
14099 	unsigned short cfg_lsw = inw(edev->base_addr + 0xc86);
14100 	unsigned int chip_irq = ((cfg_lsw >> 8) & 0x07) + 10;
14101 	if ((chip_irq == 13) || (chip_irq > 15))
14102 		return 0;
14103 	return chip_irq;
14104 }
14105 
14106 static int __devinit advansys_eisa_probe(struct device *dev)
14107 {
14108 	int i, ioport, irq = 0;
14109 	int err;
14110 	struct eisa_device *edev = to_eisa_device(dev);
14111 	struct eisa_scsi_data *data;
14112 
14113 	err = -ENOMEM;
14114 	data = kzalloc(sizeof(*data), GFP_KERNEL);
14115 	if (!data)
14116 		goto fail;
14117 	ioport = edev->base_addr + 0xc30;
14118 
14119 	err = -ENODEV;
14120 	for (i = 0; i < 2; i++, ioport += 0x20) {
14121 		struct asc_board *board;
14122 		struct Scsi_Host *shost;
14123 		if (!request_region(ioport, ASC_IOADR_GAP, DRV_NAME)) {
14124 			printk(KERN_WARNING "Region %x-%x busy\n", ioport,
14125 			       ioport + ASC_IOADR_GAP - 1);
14126 			continue;
14127 		}
14128 		if (!AscFindSignature(ioport)) {
14129 			release_region(ioport, ASC_IOADR_GAP);
14130 			continue;
14131 		}
14132 
14133 		/*
14134 		 * I don't know why we need to do this for EISA chips, but
14135 		 * not for any others.  It looks to be equivalent to
14136 		 * AscGetChipCfgMsw, but I may have overlooked something,
14137 		 * so I'm not converting it until I get an EISA board to
14138 		 * test with.
14139 		 */
14140 		inw(ioport + 4);
14141 
14142 		if (!irq)
14143 			irq = advansys_eisa_irq_no(edev);
14144 
14145 		err = -ENOMEM;
14146 		shost = scsi_host_alloc(&advansys_template, sizeof(*board));
14147 		if (!shost)
14148 			goto release_region;
14149 
14150 		board = shost_priv(shost);
14151 		board->irq = irq;
14152 		board->dev = dev;
14153 
14154 		err = advansys_board_found(shost, ioport, ASC_IS_EISA);
14155 		if (!err) {
14156 			data->host[i] = shost;
14157 			continue;
14158 		}
14159 
14160 		scsi_host_put(shost);
14161  release_region:
14162 		release_region(ioport, ASC_IOADR_GAP);
14163 		break;
14164 	}
14165 
14166 	if (err)
14167 		goto free_data;
14168 	dev_set_drvdata(dev, data);
14169 	return 0;
14170 
14171  free_data:
14172 	kfree(data->host[0]);
14173 	kfree(data->host[1]);
14174 	kfree(data);
14175  fail:
14176 	return err;
14177 }
14178 
14179 static __devexit int advansys_eisa_remove(struct device *dev)
14180 {
14181 	int i;
14182 	struct eisa_scsi_data *data = dev_get_drvdata(dev);
14183 
14184 	for (i = 0; i < 2; i++) {
14185 		int ioport;
14186 		struct Scsi_Host *shost = data->host[i];
14187 		if (!shost)
14188 			continue;
14189 		ioport = shost->io_port;
14190 		advansys_release(shost);
14191 		release_region(ioport, ASC_IOADR_GAP);
14192 	}
14193 
14194 	kfree(data);
14195 	return 0;
14196 }
14197 
14198 static struct eisa_driver advansys_eisa_driver = {
14199 	.id_table =		advansys_eisa_table,
14200 	.driver = {
14201 		.name =		DRV_NAME,
14202 		.probe =	advansys_eisa_probe,
14203 		.remove =	__devexit_p(advansys_eisa_remove),
14204 	}
14205 };
14206 
14207 /* PCI Devices supported by this driver */
14208 static struct pci_device_id advansys_pci_tbl[] __devinitdata = {
14209 	{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
14210 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
14211 	{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940,
14212 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
14213 	{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940U,
14214 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
14215 	{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940UW,
14216 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
14217 	{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C0800_REV1,
14218 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
14219 	{PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C1600_REV1,
14220 	 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
14221 	{}
14222 };
14223 
14224 MODULE_DEVICE_TABLE(pci, advansys_pci_tbl);
14225 
14226 static void __devinit advansys_set_latency(struct pci_dev *pdev)
14227 {
14228 	if ((pdev->device == PCI_DEVICE_ID_ASP_1200A) ||
14229 	    (pdev->device == PCI_DEVICE_ID_ASP_ABP940)) {
14230 		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0);
14231 	} else {
14232 		u8 latency;
14233 		pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency);
14234 		if (latency < 0x20)
14235 			pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x20);
14236 	}
14237 }
14238 
14239 static int __devinit
14240 advansys_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
14241 {
14242 	int err, ioport;
14243 	struct Scsi_Host *shost;
14244 	struct asc_board *board;
14245 
14246 	err = pci_enable_device(pdev);
14247 	if (err)
14248 		goto fail;
14249 	err = pci_request_regions(pdev, DRV_NAME);
14250 	if (err)
14251 		goto disable_device;
14252 	pci_set_master(pdev);
14253 	advansys_set_latency(pdev);
14254 
14255 	err = -ENODEV;
14256 	if (pci_resource_len(pdev, 0) == 0)
14257 		goto release_region;
14258 
14259 	ioport = pci_resource_start(pdev, 0);
14260 
14261 	err = -ENOMEM;
14262 	shost = scsi_host_alloc(&advansys_template, sizeof(*board));
14263 	if (!shost)
14264 		goto release_region;
14265 
14266 	board = shost_priv(shost);
14267 	board->irq = pdev->irq;
14268 	board->dev = &pdev->dev;
14269 
14270 	if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW ||
14271 	    pdev->device == PCI_DEVICE_ID_38C0800_REV1 ||
14272 	    pdev->device == PCI_DEVICE_ID_38C1600_REV1) {
14273 		board->flags |= ASC_IS_WIDE_BOARD;
14274 	}
14275 
14276 	err = advansys_board_found(shost, ioport, ASC_IS_PCI);
14277 	if (err)
14278 		goto free_host;
14279 
14280 	pci_set_drvdata(pdev, shost);
14281 	return 0;
14282 
14283  free_host:
14284 	scsi_host_put(shost);
14285  release_region:
14286 	pci_release_regions(pdev);
14287  disable_device:
14288 	pci_disable_device(pdev);
14289  fail:
14290 	return err;
14291 }
14292 
14293 static void __devexit advansys_pci_remove(struct pci_dev *pdev)
14294 {
14295 	advansys_release(pci_get_drvdata(pdev));
14296 	pci_release_regions(pdev);
14297 	pci_disable_device(pdev);
14298 }
14299 
14300 static struct pci_driver advansys_pci_driver = {
14301 	.name =		DRV_NAME,
14302 	.id_table =	advansys_pci_tbl,
14303 	.probe =	advansys_pci_probe,
14304 	.remove =	__devexit_p(advansys_pci_remove),
14305 };
14306 
14307 static int __init advansys_init(void)
14308 {
14309 	int error;
14310 
14311 	error = isa_register_driver(&advansys_isa_driver,
14312 				    ASC_IOADR_TABLE_MAX_IX);
14313 	if (error)
14314 		goto fail;
14315 
14316 	error = isa_register_driver(&advansys_vlb_driver,
14317 				    ASC_IOADR_TABLE_MAX_IX);
14318 	if (error)
14319 		goto unregister_isa;
14320 
14321 	error = eisa_driver_register(&advansys_eisa_driver);
14322 	if (error)
14323 		goto unregister_vlb;
14324 
14325 	error = pci_register_driver(&advansys_pci_driver);
14326 	if (error)
14327 		goto unregister_eisa;
14328 
14329 	return 0;
14330 
14331  unregister_eisa:
14332 	eisa_driver_unregister(&advansys_eisa_driver);
14333  unregister_vlb:
14334 	isa_unregister_driver(&advansys_vlb_driver);
14335  unregister_isa:
14336 	isa_unregister_driver(&advansys_isa_driver);
14337  fail:
14338 	return error;
14339 }
14340 
14341 static void __exit advansys_exit(void)
14342 {
14343 	pci_unregister_driver(&advansys_pci_driver);
14344 	eisa_driver_unregister(&advansys_eisa_driver);
14345 	isa_unregister_driver(&advansys_vlb_driver);
14346 	isa_unregister_driver(&advansys_isa_driver);
14347 }
14348 
14349 module_init(advansys_init);
14350 module_exit(advansys_exit);
14351 
14352 MODULE_LICENSE("GPL");
14353