1#define DRV_NAME "advansys"
2#define ASC_VERSION "3.4"
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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#include <linux/firmware.h>
42
43#include <asm/io.h>
44#include <asm/system.h>
45#include <asm/dma.h>
46
47#include <scsi/scsi_cmnd.h>
48#include <scsi/scsi_device.h>
49#include <scsi/scsi_tcq.h>
50#include <scsi/scsi.h>
51#include <scsi/scsi_host.h>
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72#warning this driver is still not properly converted to the DMA API
73
74
75#define ADVANSYS_STATS
76
77
78#undef ADVANSYS_DEBUG
79
80
81
82
83
84
85
86
87
88
89#define ASC_PADDR __u32
90#define ASC_VADDR __u32
91#define ASC_DCNT __u32
92#define ASC_SDCNT __s32
93
94typedef unsigned char uchar;
95
96#ifndef TRUE
97#define TRUE (1)
98#endif
99#ifndef FALSE
100#define FALSE (0)
101#endif
102
103#define ERR (-1)
104#define UW_ERR (uint)(0xFFFF)
105#define isodd_word(val) ((((uint)val) & (uint)0x0001) != 0)
106
107#define PCI_VENDOR_ID_ASP 0x10cd
108#define PCI_DEVICE_ID_ASP_1200A 0x1100
109#define PCI_DEVICE_ID_ASP_ABP940 0x1200
110#define PCI_DEVICE_ID_ASP_ABP940U 0x1300
111#define PCI_DEVICE_ID_ASP_ABP940UW 0x2300
112#define PCI_DEVICE_ID_38C0800_REV1 0x2500
113#define PCI_DEVICE_ID_38C1600_REV1 0x2700
114
115
116
117
118
119
120
121#define CC_VERY_LONG_SG_LIST 0
122#define ASC_SRB2SCSIQ(srb_ptr) (srb_ptr)
123
124#define PortAddr unsigned int
125#define inp(port) inb(port)
126#define outp(port, byte) outb((byte), (port))
127
128#define inpw(port) inw(port)
129#define outpw(port, word) outw((word), (port))
130
131#define ASC_MAX_SG_QUEUE 7
132#define ASC_MAX_SG_LIST 255
133
134#define ASC_CS_TYPE unsigned short
135
136#define ASC_IS_ISA (0x0001)
137#define ASC_IS_ISAPNP (0x0081)
138#define ASC_IS_EISA (0x0002)
139#define ASC_IS_PCI (0x0004)
140#define ASC_IS_PCI_ULTRA (0x0104)
141#define ASC_IS_PCMCIA (0x0008)
142#define ASC_IS_MCA (0x0020)
143#define ASC_IS_VL (0x0040)
144#define ASC_IS_WIDESCSI_16 (0x0100)
145#define ASC_IS_WIDESCSI_32 (0x0200)
146#define ASC_IS_BIG_ENDIAN (0x8000)
147
148#define ASC_CHIP_MIN_VER_VL (0x01)
149#define ASC_CHIP_MAX_VER_VL (0x07)
150#define ASC_CHIP_MIN_VER_PCI (0x09)
151#define ASC_CHIP_MAX_VER_PCI (0x0F)
152#define ASC_CHIP_VER_PCI_BIT (0x08)
153#define ASC_CHIP_MIN_VER_ISA (0x11)
154#define ASC_CHIP_MIN_VER_ISA_PNP (0x21)
155#define ASC_CHIP_MAX_VER_ISA (0x27)
156#define ASC_CHIP_VER_ISA_BIT (0x30)
157#define ASC_CHIP_VER_ISAPNP_BIT (0x20)
158#define ASC_CHIP_VER_ASYN_BUG (0x21)
159#define ASC_CHIP_VER_PCI 0x08
160#define ASC_CHIP_VER_PCI_ULTRA_3150 (ASC_CHIP_VER_PCI | 0x02)
161#define ASC_CHIP_VER_PCI_ULTRA_3050 (ASC_CHIP_VER_PCI | 0x03)
162#define ASC_CHIP_MIN_VER_EISA (0x41)
163#define ASC_CHIP_MAX_VER_EISA (0x47)
164#define ASC_CHIP_VER_EISA_BIT (0x40)
165#define ASC_CHIP_LATEST_VER_EISA ((ASC_CHIP_MIN_VER_EISA - 1) + 3)
166#define ASC_MAX_VL_DMA_COUNT (0x07FFFFFFL)
167#define ASC_MAX_PCI_DMA_COUNT (0xFFFFFFFFL)
168#define ASC_MAX_ISA_DMA_COUNT (0x00FFFFFFL)
169
170#define ASC_SCSI_ID_BITS 3
171#define ASC_SCSI_TIX_TYPE uchar
172#define ASC_ALL_DEVICE_BIT_SET 0xFF
173#define ASC_SCSI_BIT_ID_TYPE uchar
174#define ASC_MAX_TID 7
175#define ASC_MAX_LUN 7
176#define ASC_SCSI_WIDTH_BIT_SET 0xFF
177#define ASC_MAX_SENSE_LEN 32
178#define ASC_MIN_SENSE_LEN 14
179#define ASC_SCSI_RESET_HOLD_TIME_US 60
180
181
182
183
184
185#define ASC_MAX_CDB_LEN 12
186#define ADV_MAX_CDB_LEN 16
187
188#define MS_SDTR_LEN 0x03
189#define MS_WDTR_LEN 0x02
190
191#define ASC_SG_LIST_PER_Q 7
192#define QS_FREE 0x00
193#define QS_READY 0x01
194#define QS_DISC1 0x02
195#define QS_DISC2 0x04
196#define QS_BUSY 0x08
197#define QS_ABORTED 0x40
198#define QS_DONE 0x80
199#define QC_NO_CALLBACK 0x01
200#define QC_SG_SWAP_QUEUE 0x02
201#define QC_SG_HEAD 0x04
202#define QC_DATA_IN 0x08
203#define QC_DATA_OUT 0x10
204#define QC_URGENT 0x20
205#define QC_MSG_OUT 0x40
206#define QC_REQ_SENSE 0x80
207#define QCSG_SG_XFER_LIST 0x02
208#define QCSG_SG_XFER_MORE 0x04
209#define QCSG_SG_XFER_END 0x08
210#define QD_IN_PROGRESS 0x00
211#define QD_NO_ERROR 0x01
212#define QD_ABORTED_BY_HOST 0x02
213#define QD_WITH_ERROR 0x04
214#define QD_INVALID_REQUEST 0x80
215#define QD_INVALID_HOST_NUM 0x81
216#define QD_INVALID_DEVICE 0x82
217#define QD_ERR_INTERNAL 0xFF
218#define QHSTA_NO_ERROR 0x00
219#define QHSTA_M_SEL_TIMEOUT 0x11
220#define QHSTA_M_DATA_OVER_RUN 0x12
221#define QHSTA_M_DATA_UNDER_RUN 0x12
222#define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
223#define QHSTA_M_BAD_BUS_PHASE_SEQ 0x14
224#define QHSTA_D_QDONE_SG_LIST_CORRUPTED 0x21
225#define QHSTA_D_ASC_DVC_ERROR_CODE_SET 0x22
226#define QHSTA_D_HOST_ABORT_FAILED 0x23
227#define QHSTA_D_EXE_SCSI_Q_FAILED 0x24
228#define QHSTA_D_EXE_SCSI_Q_BUSY_TIMEOUT 0x25
229#define QHSTA_D_ASPI_NO_BUF_POOL 0x26
230#define QHSTA_M_WTM_TIMEOUT 0x41
231#define QHSTA_M_BAD_CMPL_STATUS_IN 0x42
232#define QHSTA_M_NO_AUTO_REQ_SENSE 0x43
233#define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
234#define QHSTA_M_TARGET_STATUS_BUSY 0x45
235#define QHSTA_M_BAD_TAG_CODE 0x46
236#define QHSTA_M_BAD_QUEUE_FULL_OR_BUSY 0x47
237#define QHSTA_M_HUNG_REQ_SCSI_BUS_RESET 0x48
238#define QHSTA_D_LRAM_CMP_ERROR 0x81
239#define QHSTA_M_MICRO_CODE_ERROR_HALT 0xA1
240#define ASC_FLAG_SCSIQ_REQ 0x01
241#define ASC_FLAG_BIOS_SCSIQ_REQ 0x02
242#define ASC_FLAG_BIOS_ASYNC_IO 0x04
243#define ASC_FLAG_SRB_LINEAR_ADDR 0x08
244#define ASC_FLAG_WIN16 0x10
245#define ASC_FLAG_WIN32 0x20
246#define ASC_FLAG_ISA_OVER_16MB 0x40
247#define ASC_FLAG_DOS_VM_CALLBACK 0x80
248#define ASC_TAG_FLAG_EXTRA_BYTES 0x10
249#define ASC_TAG_FLAG_DISABLE_DISCONNECT 0x04
250#define ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX 0x08
251#define ASC_TAG_FLAG_DISABLE_CHK_COND_INT_HOST 0x40
252#define ASC_SCSIQ_CPY_BEG 4
253#define ASC_SCSIQ_SGHD_CPY_BEG 2
254#define ASC_SCSIQ_B_FWD 0
255#define ASC_SCSIQ_B_BWD 1
256#define ASC_SCSIQ_B_STATUS 2
257#define ASC_SCSIQ_B_QNO 3
258#define ASC_SCSIQ_B_CNTL 4
259#define ASC_SCSIQ_B_SG_QUEUE_CNT 5
260#define ASC_SCSIQ_D_DATA_ADDR 8
261#define ASC_SCSIQ_D_DATA_CNT 12
262#define ASC_SCSIQ_B_SENSE_LEN 20
263#define ASC_SCSIQ_DONE_INFO_BEG 22
264#define ASC_SCSIQ_D_SRBPTR 22
265#define ASC_SCSIQ_B_TARGET_IX 26
266#define ASC_SCSIQ_B_CDB_LEN 28
267#define ASC_SCSIQ_B_TAG_CODE 29
268#define ASC_SCSIQ_W_VM_ID 30
269#define ASC_SCSIQ_DONE_STATUS 32
270#define ASC_SCSIQ_HOST_STATUS 33
271#define ASC_SCSIQ_SCSI_STATUS 34
272#define ASC_SCSIQ_CDB_BEG 36
273#define ASC_SCSIQ_DW_REMAIN_XFER_ADDR 56
274#define ASC_SCSIQ_DW_REMAIN_XFER_CNT 60
275#define ASC_SCSIQ_B_FIRST_SG_WK_QP 48
276#define ASC_SCSIQ_B_SG_WK_QP 49
277#define ASC_SCSIQ_B_SG_WK_IX 50
278#define ASC_SCSIQ_W_ALT_DC1 52
279#define ASC_SCSIQ_B_LIST_CNT 6
280#define ASC_SCSIQ_B_CUR_LIST_CNT 7
281#define ASC_SGQ_B_SG_CNTL 4
282#define ASC_SGQ_B_SG_HEAD_QP 5
283#define ASC_SGQ_B_SG_LIST_CNT 6
284#define ASC_SGQ_B_SG_CUR_LIST_CNT 7
285#define ASC_SGQ_LIST_BEG 8
286#define ASC_DEF_SCSI1_QNG 4
287#define ASC_MAX_SCSI1_QNG 4
288#define ASC_DEF_SCSI2_QNG 16
289#define ASC_MAX_SCSI2_QNG 32
290#define ASC_TAG_CODE_MASK 0x23
291#define ASC_STOP_REQ_RISC_STOP 0x01
292#define ASC_STOP_ACK_RISC_STOP 0x03
293#define ASC_STOP_CLEAN_UP_BUSY_Q 0x10
294#define ASC_STOP_CLEAN_UP_DISC_Q 0x20
295#define ASC_STOP_HOST_REQ_RISC_HALT 0x40
296#define ASC_TIDLUN_TO_IX(tid, lun) (ASC_SCSI_TIX_TYPE)((tid) + ((lun)<<ASC_SCSI_ID_BITS))
297#define ASC_TID_TO_TARGET_ID(tid) (ASC_SCSI_BIT_ID_TYPE)(0x01 << (tid))
298#define ASC_TIX_TO_TARGET_ID(tix) (0x01 << ((tix) & ASC_MAX_TID))
299#define ASC_TIX_TO_TID(tix) ((tix) & ASC_MAX_TID)
300#define ASC_TID_TO_TIX(tid) ((tid) & ASC_MAX_TID)
301#define ASC_TIX_TO_LUN(tix) (((tix) >> ASC_SCSI_ID_BITS) & ASC_MAX_LUN)
302#define ASC_QNO_TO_QADDR(q_no) ((ASC_QADR_BEG)+((int)(q_no) << 6))
303
304typedef struct asc_scsiq_1 {
305 uchar status;
306 uchar q_no;
307 uchar cntl;
308 uchar sg_queue_cnt;
309 uchar target_id;
310 uchar target_lun;
311 ASC_PADDR data_addr;
312 ASC_DCNT data_cnt;
313 ASC_PADDR sense_addr;
314 uchar sense_len;
315 uchar extra_bytes;
316} ASC_SCSIQ_1;
317
318typedef struct asc_scsiq_2 {
319 ASC_VADDR srb_ptr;
320 uchar target_ix;
321 uchar flag;
322 uchar cdb_len;
323 uchar tag_code;
324 ushort vm_id;
325} ASC_SCSIQ_2;
326
327typedef struct asc_scsiq_3 {
328 uchar done_stat;
329 uchar host_stat;
330 uchar scsi_stat;
331 uchar scsi_msg;
332} ASC_SCSIQ_3;
333
334typedef struct asc_scsiq_4 {
335 uchar cdb[ASC_MAX_CDB_LEN];
336 uchar y_first_sg_list_qp;
337 uchar y_working_sg_qp;
338 uchar y_working_sg_ix;
339 uchar y_res;
340 ushort x_req_count;
341 ushort x_reconnect_rtn;
342 ASC_PADDR x_saved_data_addr;
343 ASC_DCNT x_saved_data_cnt;
344} ASC_SCSIQ_4;
345
346typedef struct asc_q_done_info {
347 ASC_SCSIQ_2 d2;
348 ASC_SCSIQ_3 d3;
349 uchar q_status;
350 uchar q_no;
351 uchar cntl;
352 uchar sense_len;
353 uchar extra_bytes;
354 uchar res;
355 ASC_DCNT remain_bytes;
356} ASC_QDONE_INFO;
357
358typedef struct asc_sg_list {
359 ASC_PADDR addr;
360 ASC_DCNT bytes;
361} ASC_SG_LIST;
362
363typedef struct asc_sg_head {
364 ushort entry_cnt;
365 ushort queue_cnt;
366 ushort entry_to_copy;
367 ushort res;
368 ASC_SG_LIST sg_list[0];
369} ASC_SG_HEAD;
370
371typedef struct asc_scsi_q {
372 ASC_SCSIQ_1 q1;
373 ASC_SCSIQ_2 q2;
374 uchar *cdbptr;
375 ASC_SG_HEAD *sg_head;
376 ushort remain_sg_entry_cnt;
377 ushort next_sg_index;
378} ASC_SCSI_Q;
379
380typedef struct asc_scsi_req_q {
381 ASC_SCSIQ_1 r1;
382 ASC_SCSIQ_2 r2;
383 uchar *cdbptr;
384 ASC_SG_HEAD *sg_head;
385 uchar *sense_ptr;
386 ASC_SCSIQ_3 r3;
387 uchar cdb[ASC_MAX_CDB_LEN];
388 uchar sense[ASC_MIN_SENSE_LEN];
389} ASC_SCSI_REQ_Q;
390
391typedef struct asc_scsi_bios_req_q {
392 ASC_SCSIQ_1 r1;
393 ASC_SCSIQ_2 r2;
394 uchar *cdbptr;
395 ASC_SG_HEAD *sg_head;
396 uchar *sense_ptr;
397 ASC_SCSIQ_3 r3;
398 uchar cdb[ASC_MAX_CDB_LEN];
399 uchar sense[ASC_MIN_SENSE_LEN];
400} ASC_SCSI_BIOS_REQ_Q;
401
402typedef struct asc_risc_q {
403 uchar fwd;
404 uchar bwd;
405 ASC_SCSIQ_1 i1;
406 ASC_SCSIQ_2 i2;
407 ASC_SCSIQ_3 i3;
408 ASC_SCSIQ_4 i4;
409} ASC_RISC_Q;
410
411typedef struct asc_sg_list_q {
412 uchar seq_no;
413 uchar q_no;
414 uchar cntl;
415 uchar sg_head_qp;
416 uchar sg_list_cnt;
417 uchar sg_cur_list_cnt;
418} ASC_SG_LIST_Q;
419
420typedef struct asc_risc_sg_list_q {
421 uchar fwd;
422 uchar bwd;
423 ASC_SG_LIST_Q sg;
424 ASC_SG_LIST sg_list[7];
425} ASC_RISC_SG_LIST_Q;
426
427#define ASCQ_ERR_Q_STATUS 0x0D
428#define ASCQ_ERR_CUR_QNG 0x17
429#define ASCQ_ERR_SG_Q_LINKS 0x18
430#define ASCQ_ERR_ISR_RE_ENTRY 0x1A
431#define ASCQ_ERR_CRITICAL_RE_ENTRY 0x1B
432#define ASCQ_ERR_ISR_ON_CRITICAL 0x1C
433
434
435
436
437#define ASC_WARN_NO_ERROR 0x0000
438#define ASC_WARN_IO_PORT_ROTATE 0x0001
439#define ASC_WARN_EEPROM_CHKSUM 0x0002
440#define ASC_WARN_IRQ_MODIFIED 0x0004
441#define ASC_WARN_AUTO_CONFIG 0x0008
442#define ASC_WARN_CMD_QNG_CONFLICT 0x0010
443#define ASC_WARN_EEPROM_RECOVER 0x0020
444#define ASC_WARN_CFG_MSW_RECOVER 0x0040
445
446
447
448
449#define ASC_IERR_NO_CARRIER 0x0001
450#define ASC_IERR_MCODE_CHKSUM 0x0002
451#define ASC_IERR_SET_PC_ADDR 0x0004
452#define ASC_IERR_START_STOP_CHIP 0x0008
453#define ASC_IERR_ILLEGAL_CONNECTION 0x0010
454#define ASC_IERR_SINGLE_END_DEVICE 0x0020
455#define ASC_IERR_REVERSED_CABLE 0x0040
456#define ASC_IERR_SET_SCSI_ID 0x0080
457#define ASC_IERR_HVD_DEVICE 0x0100
458#define ASC_IERR_BAD_SIGNATURE 0x0200
459#define ASC_IERR_NO_BUS_TYPE 0x0400
460#define ASC_IERR_BIST_PRE_TEST 0x0800
461#define ASC_IERR_BIST_RAM_TEST 0x1000
462#define ASC_IERR_BAD_CHIPTYPE 0x2000
463
464#define ASC_DEF_MAX_TOTAL_QNG (0xF0)
465#define ASC_MIN_TAG_Q_PER_DVC (0x04)
466#define ASC_MIN_FREE_Q (0x02)
467#define ASC_MIN_TOTAL_QNG ((ASC_MAX_SG_QUEUE)+(ASC_MIN_FREE_Q))
468#define ASC_MAX_TOTAL_QNG 240
469#define ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG 16
470#define ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG 8
471#define ASC_MAX_PCI_INRAM_TOTAL_QNG 20
472#define ASC_MAX_INRAM_TAG_QNG 16
473#define ASC_IOADR_GAP 0x10
474#define ASC_SYN_MAX_OFFSET 0x0F
475#define ASC_DEF_SDTR_OFFSET 0x0F
476#define ASC_SDTR_ULTRA_PCI_10MB_INDEX 0x02
477#define ASYN_SDTR_DATA_FIX_PCI_REV_AB 0x41
478
479
480
481
482
483static const unsigned char asc_syn_xfer_period[8] = {
484 25, 30, 35, 40, 50, 60, 70, 85
485};
486
487static const unsigned char asc_syn_ultra_xfer_period[16] = {
488 12, 19, 25, 32, 38, 44, 50, 57, 63, 69, 75, 82, 88, 94, 100, 107
489};
490
491typedef struct ext_msg {
492 uchar msg_type;
493 uchar msg_len;
494 uchar msg_req;
495 union {
496 struct {
497 uchar sdtr_xfer_period;
498 uchar sdtr_req_ack_offset;
499 } sdtr;
500 struct {
501 uchar wdtr_width;
502 } wdtr;
503 struct {
504 uchar mdp_b3;
505 uchar mdp_b2;
506 uchar mdp_b1;
507 uchar mdp_b0;
508 } mdp;
509 } u_ext_msg;
510 uchar res;
511} EXT_MSG;
512
513#define xfer_period u_ext_msg.sdtr.sdtr_xfer_period
514#define req_ack_offset u_ext_msg.sdtr.sdtr_req_ack_offset
515#define wdtr_width u_ext_msg.wdtr.wdtr_width
516#define mdp_b3 u_ext_msg.mdp_b3
517#define mdp_b2 u_ext_msg.mdp_b2
518#define mdp_b1 u_ext_msg.mdp_b1
519#define mdp_b0 u_ext_msg.mdp_b0
520
521typedef struct asc_dvc_cfg {
522 ASC_SCSI_BIT_ID_TYPE can_tagged_qng;
523 ASC_SCSI_BIT_ID_TYPE cmd_qng_enabled;
524 ASC_SCSI_BIT_ID_TYPE disc_enable;
525 ASC_SCSI_BIT_ID_TYPE sdtr_enable;
526 uchar chip_scsi_id;
527 uchar isa_dma_speed;
528 uchar isa_dma_channel;
529 uchar chip_version;
530 ushort mcode_date;
531 ushort mcode_version;
532 uchar max_tag_qng[ASC_MAX_TID + 1];
533 uchar sdtr_period_offset[ASC_MAX_TID + 1];
534 uchar adapter_info[6];
535} ASC_DVC_CFG;
536
537#define ASC_DEF_DVC_CNTL 0xFFFF
538#define ASC_DEF_CHIP_SCSI_ID 7
539#define ASC_DEF_ISA_DMA_SPEED 4
540#define ASC_INIT_STATE_BEG_GET_CFG 0x0001
541#define ASC_INIT_STATE_END_GET_CFG 0x0002
542#define ASC_INIT_STATE_BEG_SET_CFG 0x0004
543#define ASC_INIT_STATE_END_SET_CFG 0x0008
544#define ASC_INIT_STATE_BEG_LOAD_MC 0x0010
545#define ASC_INIT_STATE_END_LOAD_MC 0x0020
546#define ASC_INIT_STATE_BEG_INQUIRY 0x0040
547#define ASC_INIT_STATE_END_INQUIRY 0x0080
548#define ASC_INIT_RESET_SCSI_DONE 0x0100
549#define ASC_INIT_STATE_WITHOUT_EEP 0x8000
550#define ASC_BUG_FIX_IF_NOT_DWB 0x0001
551#define ASC_BUG_FIX_ASYN_USE_SYN 0x0002
552#define ASC_MIN_TAGGED_CMD 7
553#define ASC_MAX_SCSI_RESET_WAIT 30
554#define ASC_OVERRUN_BSIZE 64
555
556struct asc_dvc_var;
557
558typedef struct asc_dvc_var {
559 PortAddr iop_base;
560 ushort err_code;
561 ushort dvc_cntl;
562 ushort bug_fix_cntl;
563 ushort bus_type;
564 ASC_SCSI_BIT_ID_TYPE init_sdtr;
565 ASC_SCSI_BIT_ID_TYPE sdtr_done;
566 ASC_SCSI_BIT_ID_TYPE use_tagged_qng;
567 ASC_SCSI_BIT_ID_TYPE unit_not_ready;
568 ASC_SCSI_BIT_ID_TYPE queue_full_or_busy;
569 ASC_SCSI_BIT_ID_TYPE start_motor;
570 uchar *overrun_buf;
571 dma_addr_t overrun_dma;
572 uchar scsi_reset_wait;
573 uchar chip_no;
574 char is_in_int;
575 uchar max_total_qng;
576 uchar cur_total_qng;
577 uchar in_critical_cnt;
578 uchar last_q_shortage;
579 ushort init_state;
580 uchar cur_dvc_qng[ASC_MAX_TID + 1];
581 uchar max_dvc_qng[ASC_MAX_TID + 1];
582 ASC_SCSI_Q *scsiq_busy_head[ASC_MAX_TID + 1];
583 ASC_SCSI_Q *scsiq_busy_tail[ASC_MAX_TID + 1];
584 const uchar *sdtr_period_tbl;
585 ASC_DVC_CFG *cfg;
586 ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer_always;
587 char redo_scam;
588 ushort res2;
589 uchar dos_int13_table[ASC_MAX_TID + 1];
590 ASC_DCNT max_dma_count;
591 ASC_SCSI_BIT_ID_TYPE no_scam;
592 ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer;
593 uchar min_sdtr_index;
594 uchar max_sdtr_index;
595 struct asc_board *drv_ptr;
596 int ptr_map_count;
597 void **ptr_map;
598 ASC_DCNT uc_break;
599} ASC_DVC_VAR;
600
601typedef struct asc_dvc_inq_info {
602 uchar type[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
603} ASC_DVC_INQ_INFO;
604
605typedef struct asc_cap_info {
606 ASC_DCNT lba;
607 ASC_DCNT blk_size;
608} ASC_CAP_INFO;
609
610typedef struct asc_cap_info_array {
611 ASC_CAP_INFO cap_info[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
612} ASC_CAP_INFO_ARRAY;
613
614#define ASC_MCNTL_NO_SEL_TIMEOUT (ushort)0x0001
615#define ASC_MCNTL_NULL_TARGET (ushort)0x0002
616#define ASC_CNTL_INITIATOR (ushort)0x0001
617#define ASC_CNTL_BIOS_GT_1GB (ushort)0x0002
618#define ASC_CNTL_BIOS_GT_2_DISK (ushort)0x0004
619#define ASC_CNTL_BIOS_REMOVABLE (ushort)0x0008
620#define ASC_CNTL_NO_SCAM (ushort)0x0010
621#define ASC_CNTL_INT_MULTI_Q (ushort)0x0080
622#define ASC_CNTL_NO_LUN_SUPPORT (ushort)0x0040
623#define ASC_CNTL_NO_VERIFY_COPY (ushort)0x0100
624#define ASC_CNTL_RESET_SCSI (ushort)0x0200
625#define ASC_CNTL_INIT_INQUIRY (ushort)0x0400
626#define ASC_CNTL_INIT_VERBOSE (ushort)0x0800
627#define ASC_CNTL_SCSI_PARITY (ushort)0x1000
628#define ASC_CNTL_BURST_MODE (ushort)0x2000
629#define ASC_CNTL_SDTR_ENABLE_ULTRA (ushort)0x4000
630#define ASC_EEP_DVC_CFG_BEG_VL 2
631#define ASC_EEP_MAX_DVC_ADDR_VL 15
632#define ASC_EEP_DVC_CFG_BEG 32
633#define ASC_EEP_MAX_DVC_ADDR 45
634#define ASC_EEP_MAX_RETRY 20
635
636
637
638
639
640
641
642
643#define ASC_EEP_GET_CHIP_ID(cfg) ((cfg)->id_speed & 0x0f)
644#define ASC_EEP_GET_DMA_SPD(cfg) (((cfg)->id_speed & 0xf0) >> 4)
645#define ASC_EEP_SET_CHIP_ID(cfg, sid) \
646 ((cfg)->id_speed = ((cfg)->id_speed & 0xf0) | ((sid) & ASC_MAX_TID))
647#define ASC_EEP_SET_DMA_SPD(cfg, spd) \
648 ((cfg)->id_speed = ((cfg)->id_speed & 0x0f) | ((spd) & 0x0f) << 4)
649
650typedef struct asceep_config {
651 ushort cfg_lsw;
652 ushort cfg_msw;
653 uchar init_sdtr;
654 uchar disc_enable;
655 uchar use_cmd_qng;
656 uchar start_motor;
657 uchar max_total_qng;
658 uchar max_tag_qng;
659 uchar bios_scan;
660 uchar power_up_wait;
661 uchar no_scam;
662 uchar id_speed;
663
664 uchar dos_int13_table[ASC_MAX_TID + 1];
665 uchar adapter_info[6];
666 ushort cntl;
667 ushort chksum;
668} ASCEEP_CONFIG;
669
670#define ASC_EEP_CMD_READ 0x80
671#define ASC_EEP_CMD_WRITE 0x40
672#define ASC_EEP_CMD_WRITE_ABLE 0x30
673#define ASC_EEP_CMD_WRITE_DISABLE 0x00
674#define ASCV_MSGOUT_BEG 0x0000
675#define ASCV_MSGOUT_SDTR_PERIOD (ASCV_MSGOUT_BEG+3)
676#define ASCV_MSGOUT_SDTR_OFFSET (ASCV_MSGOUT_BEG+4)
677#define ASCV_BREAK_SAVED_CODE (ushort)0x0006
678#define ASCV_MSGIN_BEG (ASCV_MSGOUT_BEG+8)
679#define ASCV_MSGIN_SDTR_PERIOD (ASCV_MSGIN_BEG+3)
680#define ASCV_MSGIN_SDTR_OFFSET (ASCV_MSGIN_BEG+4)
681#define ASCV_SDTR_DATA_BEG (ASCV_MSGIN_BEG+8)
682#define ASCV_SDTR_DONE_BEG (ASCV_SDTR_DATA_BEG+8)
683#define ASCV_MAX_DVC_QNG_BEG (ushort)0x0020
684#define ASCV_BREAK_ADDR (ushort)0x0028
685#define ASCV_BREAK_NOTIFY_COUNT (ushort)0x002A
686#define ASCV_BREAK_CONTROL (ushort)0x002C
687#define ASCV_BREAK_HIT_COUNT (ushort)0x002E
688
689#define ASCV_ASCDVC_ERR_CODE_W (ushort)0x0030
690#define ASCV_MCODE_CHKSUM_W (ushort)0x0032
691#define ASCV_MCODE_SIZE_W (ushort)0x0034
692#define ASCV_STOP_CODE_B (ushort)0x0036
693#define ASCV_DVC_ERR_CODE_B (ushort)0x0037
694#define ASCV_OVERRUN_PADDR_D (ushort)0x0038
695#define ASCV_OVERRUN_BSIZE_D (ushort)0x003C
696#define ASCV_HALTCODE_W (ushort)0x0040
697#define ASCV_CHKSUM_W (ushort)0x0042
698#define ASCV_MC_DATE_W (ushort)0x0044
699#define ASCV_MC_VER_W (ushort)0x0046
700#define ASCV_NEXTRDY_B (ushort)0x0048
701#define ASCV_DONENEXT_B (ushort)0x0049
702#define ASCV_USE_TAGGED_QNG_B (ushort)0x004A
703#define ASCV_SCSIBUSY_B (ushort)0x004B
704#define ASCV_Q_DONE_IN_PROGRESS_B (ushort)0x004C
705#define ASCV_CURCDB_B (ushort)0x004D
706#define ASCV_RCLUN_B (ushort)0x004E
707#define ASCV_BUSY_QHEAD_B (ushort)0x004F
708#define ASCV_DISC1_QHEAD_B (ushort)0x0050
709#define ASCV_DISC_ENABLE_B (ushort)0x0052
710#define ASCV_CAN_TAGGED_QNG_B (ushort)0x0053
711#define ASCV_HOSTSCSI_ID_B (ushort)0x0055
712#define ASCV_MCODE_CNTL_B (ushort)0x0056
713#define ASCV_NULL_TARGET_B (ushort)0x0057
714#define ASCV_FREE_Q_HEAD_W (ushort)0x0058
715#define ASCV_DONE_Q_TAIL_W (ushort)0x005A
716#define ASCV_FREE_Q_HEAD_B (ushort)(ASCV_FREE_Q_HEAD_W+1)
717#define ASCV_DONE_Q_TAIL_B (ushort)(ASCV_DONE_Q_TAIL_W+1)
718#define ASCV_HOST_FLAG_B (ushort)0x005D
719#define ASCV_TOTAL_READY_Q_B (ushort)0x0064
720#define ASCV_VER_SERIAL_B (ushort)0x0065
721#define ASCV_HALTCODE_SAVED_W (ushort)0x0066
722#define ASCV_WTM_FLAG_B (ushort)0x0068
723#define ASCV_RISC_FLAG_B (ushort)0x006A
724#define ASCV_REQ_SG_LIST_QP (ushort)0x006B
725#define ASC_HOST_FLAG_IN_ISR 0x01
726#define ASC_HOST_FLAG_ACK_INT 0x02
727#define ASC_RISC_FLAG_GEN_INT 0x01
728#define ASC_RISC_FLAG_REQ_SG_LIST 0x02
729#define IOP_CTRL (0x0F)
730#define IOP_STATUS (0x0E)
731#define IOP_INT_ACK IOP_STATUS
732#define IOP_REG_IFC (0x0D)
733#define IOP_SYN_OFFSET (0x0B)
734#define IOP_EXTRA_CONTROL (0x0D)
735#define IOP_REG_PC (0x0C)
736#define IOP_RAM_ADDR (0x0A)
737#define IOP_RAM_DATA (0x08)
738#define IOP_EEP_DATA (0x06)
739#define IOP_EEP_CMD (0x07)
740#define IOP_VERSION (0x03)
741#define IOP_CONFIG_HIGH (0x04)
742#define IOP_CONFIG_LOW (0x02)
743#define IOP_SIG_BYTE (0x01)
744#define IOP_SIG_WORD (0x00)
745#define IOP_REG_DC1 (0x0E)
746#define IOP_REG_DC0 (0x0C)
747#define IOP_REG_SB (0x0B)
748#define IOP_REG_DA1 (0x0A)
749#define IOP_REG_DA0 (0x08)
750#define IOP_REG_SC (0x09)
751#define IOP_DMA_SPEED (0x07)
752#define IOP_REG_FLAG (0x07)
753#define IOP_FIFO_H (0x06)
754#define IOP_FIFO_L (0x04)
755#define IOP_REG_ID (0x05)
756#define IOP_REG_QP (0x03)
757#define IOP_REG_IH (0x02)
758#define IOP_REG_IX (0x01)
759#define IOP_REG_AX (0x00)
760#define IFC_REG_LOCK (0x00)
761#define IFC_REG_UNLOCK (0x09)
762#define IFC_WR_EN_FILTER (0x10)
763#define IFC_RD_NO_EEPROM (0x10)
764#define IFC_SLEW_RATE (0x20)
765#define IFC_ACT_NEG (0x40)
766#define IFC_INP_FILTER (0x80)
767#define IFC_INIT_DEFAULT (IFC_ACT_NEG | IFC_REG_UNLOCK)
768#define SC_SEL (uchar)(0x80)
769#define SC_BSY (uchar)(0x40)
770#define SC_ACK (uchar)(0x20)
771#define SC_REQ (uchar)(0x10)
772#define SC_ATN (uchar)(0x08)
773#define SC_IO (uchar)(0x04)
774#define SC_CD (uchar)(0x02)
775#define SC_MSG (uchar)(0x01)
776#define SEC_SCSI_CTL (uchar)(0x80)
777#define SEC_ACTIVE_NEGATE (uchar)(0x40)
778#define SEC_SLEW_RATE (uchar)(0x20)
779#define SEC_ENABLE_FILTER (uchar)(0x10)
780#define ASC_HALT_EXTMSG_IN (ushort)0x8000
781#define ASC_HALT_CHK_CONDITION (ushort)0x8100
782#define ASC_HALT_SS_QUEUE_FULL (ushort)0x8200
783#define ASC_HALT_DISABLE_ASYN_USE_SYN_FIX (ushort)0x8300
784#define ASC_HALT_ENABLE_ASYN_USE_SYN_FIX (ushort)0x8400
785#define ASC_HALT_SDTR_REJECTED (ushort)0x4000
786#define ASC_HALT_HOST_COPY_SG_LIST_TO_RISC ( ushort )0x2000
787#define ASC_MAX_QNO 0xF8
788#define ASC_DATA_SEC_BEG (ushort)0x0080
789#define ASC_DATA_SEC_END (ushort)0x0080
790#define ASC_CODE_SEC_BEG (ushort)0x0080
791#define ASC_CODE_SEC_END (ushort)0x0080
792#define ASC_QADR_BEG (0x4000)
793#define ASC_QADR_USED (ushort)(ASC_MAX_QNO * 64)
794#define ASC_QADR_END (ushort)0x7FFF
795#define ASC_QLAST_ADR (ushort)0x7FC0
796#define ASC_QBLK_SIZE 0x40
797#define ASC_BIOS_DATA_QBEG 0xF8
798#define ASC_MIN_ACTIVE_QNO 0x01
799#define ASC_QLINK_END 0xFF
800#define ASC_EEPROM_WORDS 0x10
801#define ASC_MAX_MGS_LEN 0x10
802#define ASC_BIOS_ADDR_DEF 0xDC00
803#define ASC_BIOS_SIZE 0x3800
804#define ASC_BIOS_RAM_OFF 0x3800
805#define ASC_BIOS_RAM_SIZE 0x800
806#define ASC_BIOS_MIN_ADDR 0xC000
807#define ASC_BIOS_MAX_ADDR 0xEC00
808#define ASC_BIOS_BANK_SIZE 0x0400
809#define ASC_MCODE_START_ADDR 0x0080
810#define ASC_CFG0_HOST_INT_ON 0x0020
811#define ASC_CFG0_BIOS_ON 0x0040
812#define ASC_CFG0_VERA_BURST_ON 0x0080
813#define ASC_CFG0_SCSI_PARITY_ON 0x0800
814#define ASC_CFG1_SCSI_TARGET_ON 0x0080
815#define ASC_CFG1_LRAM_8BITS_ON 0x0800
816#define ASC_CFG_MSW_CLR_MASK 0x3080
817#define CSW_TEST1 (ASC_CS_TYPE)0x8000
818#define CSW_AUTO_CONFIG (ASC_CS_TYPE)0x4000
819#define CSW_RESERVED1 (ASC_CS_TYPE)0x2000
820#define CSW_IRQ_WRITTEN (ASC_CS_TYPE)0x1000
821#define CSW_33MHZ_SELECTED (ASC_CS_TYPE)0x0800
822#define CSW_TEST2 (ASC_CS_TYPE)0x0400
823#define CSW_TEST3 (ASC_CS_TYPE)0x0200
824#define CSW_RESERVED2 (ASC_CS_TYPE)0x0100
825#define CSW_DMA_DONE (ASC_CS_TYPE)0x0080
826#define CSW_FIFO_RDY (ASC_CS_TYPE)0x0040
827#define CSW_EEP_READ_DONE (ASC_CS_TYPE)0x0020
828#define CSW_HALTED (ASC_CS_TYPE)0x0010
829#define CSW_SCSI_RESET_ACTIVE (ASC_CS_TYPE)0x0008
830#define CSW_PARITY_ERR (ASC_CS_TYPE)0x0004
831#define CSW_SCSI_RESET_LATCH (ASC_CS_TYPE)0x0002
832#define CSW_INT_PENDING (ASC_CS_TYPE)0x0001
833#define CIW_CLR_SCSI_RESET_INT (ASC_CS_TYPE)0x1000
834#define CIW_INT_ACK (ASC_CS_TYPE)0x0100
835#define CIW_TEST1 (ASC_CS_TYPE)0x0200
836#define CIW_TEST2 (ASC_CS_TYPE)0x0400
837#define CIW_SEL_33MHZ (ASC_CS_TYPE)0x0800
838#define CIW_IRQ_ACT (ASC_CS_TYPE)0x1000
839#define CC_CHIP_RESET (uchar)0x80
840#define CC_SCSI_RESET (uchar)0x40
841#define CC_HALT (uchar)0x20
842#define CC_SINGLE_STEP (uchar)0x10
843#define CC_DMA_ABLE (uchar)0x08
844#define CC_TEST (uchar)0x04
845#define CC_BANK_ONE (uchar)0x02
846#define CC_DIAG (uchar)0x01
847#define ASC_1000_ID0W 0x04C1
848#define ASC_1000_ID0W_FIX 0x00C1
849#define ASC_1000_ID1B 0x25
850#define ASC_EISA_REV_IOP_MASK (0x0C83)
851#define ASC_EISA_CFG_IOP_MASK (0x0C86)
852#define ASC_GET_EISA_SLOT(iop) (PortAddr)((iop) & 0xF000)
853#define INS_HALTINT (ushort)0x6281
854#define INS_HALT (ushort)0x6280
855#define INS_SINT (ushort)0x6200
856#define INS_RFLAG_WTM (ushort)0x7380
857#define ASC_MC_SAVE_CODE_WSIZE 0x500
858#define ASC_MC_SAVE_DATA_WSIZE 0x40
859
860typedef struct asc_mc_saved {
861 ushort data[ASC_MC_SAVE_DATA_WSIZE];
862 ushort code[ASC_MC_SAVE_CODE_WSIZE];
863} ASC_MC_SAVED;
864
865#define AscGetQDoneInProgress(port) AscReadLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B)
866#define AscPutQDoneInProgress(port, val) AscWriteLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B, val)
867#define AscGetVarFreeQHead(port) AscReadLramWord((port), ASCV_FREE_Q_HEAD_W)
868#define AscGetVarDoneQTail(port) AscReadLramWord((port), ASCV_DONE_Q_TAIL_W)
869#define AscPutVarFreeQHead(port, val) AscWriteLramWord((port), ASCV_FREE_Q_HEAD_W, val)
870#define AscPutVarDoneQTail(port, val) AscWriteLramWord((port), ASCV_DONE_Q_TAIL_W, val)
871#define AscGetRiscVarFreeQHead(port) AscReadLramByte((port), ASCV_NEXTRDY_B)
872#define AscGetRiscVarDoneQTail(port) AscReadLramByte((port), ASCV_DONENEXT_B)
873#define AscPutRiscVarFreeQHead(port, val) AscWriteLramByte((port), ASCV_NEXTRDY_B, val)
874#define AscPutRiscVarDoneQTail(port, val) AscWriteLramByte((port), ASCV_DONENEXT_B, val)
875#define AscPutMCodeSDTRDoneAtID(port, id, data) AscWriteLramByte((port), (ushort)((ushort)ASCV_SDTR_DONE_BEG+(ushort)id), (data))
876#define AscGetMCodeSDTRDoneAtID(port, id) AscReadLramByte((port), (ushort)((ushort)ASCV_SDTR_DONE_BEG+(ushort)id))
877#define AscPutMCodeInitSDTRAtID(port, id, data) AscWriteLramByte((port), (ushort)((ushort)ASCV_SDTR_DATA_BEG+(ushort)id), data)
878#define AscGetMCodeInitSDTRAtID(port, id) AscReadLramByte((port), (ushort)((ushort)ASCV_SDTR_DATA_BEG+(ushort)id))
879#define AscGetChipSignatureByte(port) (uchar)inp((port)+IOP_SIG_BYTE)
880#define AscGetChipSignatureWord(port) (ushort)inpw((port)+IOP_SIG_WORD)
881#define AscGetChipVerNo(port) (uchar)inp((port)+IOP_VERSION)
882#define AscGetChipCfgLsw(port) (ushort)inpw((port)+IOP_CONFIG_LOW)
883#define AscGetChipCfgMsw(port) (ushort)inpw((port)+IOP_CONFIG_HIGH)
884#define AscSetChipCfgLsw(port, data) outpw((port)+IOP_CONFIG_LOW, data)
885#define AscSetChipCfgMsw(port, data) outpw((port)+IOP_CONFIG_HIGH, data)
886#define AscGetChipEEPCmd(port) (uchar)inp((port)+IOP_EEP_CMD)
887#define AscSetChipEEPCmd(port, data) outp((port)+IOP_EEP_CMD, data)
888#define AscGetChipEEPData(port) (ushort)inpw((port)+IOP_EEP_DATA)
889#define AscSetChipEEPData(port, data) outpw((port)+IOP_EEP_DATA, data)
890#define AscGetChipLramAddr(port) (ushort)inpw((PortAddr)((port)+IOP_RAM_ADDR))
891#define AscSetChipLramAddr(port, addr) outpw((PortAddr)((port)+IOP_RAM_ADDR), addr)
892#define AscGetChipLramData(port) (ushort)inpw((port)+IOP_RAM_DATA)
893#define AscSetChipLramData(port, data) outpw((port)+IOP_RAM_DATA, data)
894#define AscGetChipIFC(port) (uchar)inp((port)+IOP_REG_IFC)
895#define AscSetChipIFC(port, data) outp((port)+IOP_REG_IFC, data)
896#define AscGetChipStatus(port) (ASC_CS_TYPE)inpw((port)+IOP_STATUS)
897#define AscSetChipStatus(port, cs_val) outpw((port)+IOP_STATUS, cs_val)
898#define AscGetChipControl(port) (uchar)inp((port)+IOP_CTRL)
899#define AscSetChipControl(port, cc_val) outp((port)+IOP_CTRL, cc_val)
900#define AscGetChipSyn(port) (uchar)inp((port)+IOP_SYN_OFFSET)
901#define AscSetChipSyn(port, data) outp((port)+IOP_SYN_OFFSET, data)
902#define AscSetPCAddr(port, data) outpw((port)+IOP_REG_PC, data)
903#define AscGetPCAddr(port) (ushort)inpw((port)+IOP_REG_PC)
904#define AscIsIntPending(port) (AscGetChipStatus(port) & (CSW_INT_PENDING | CSW_SCSI_RESET_LATCH))
905#define AscGetChipScsiID(port) ((AscGetChipCfgLsw(port) >> 8) & ASC_MAX_TID)
906#define AscGetExtraControl(port) (uchar)inp((port)+IOP_EXTRA_CONTROL)
907#define AscSetExtraControl(port, data) outp((port)+IOP_EXTRA_CONTROL, data)
908#define AscReadChipAX(port) (ushort)inpw((port)+IOP_REG_AX)
909#define AscWriteChipAX(port, data) outpw((port)+IOP_REG_AX, data)
910#define AscReadChipIX(port) (uchar)inp((port)+IOP_REG_IX)
911#define AscWriteChipIX(port, data) outp((port)+IOP_REG_IX, data)
912#define AscReadChipIH(port) (ushort)inpw((port)+IOP_REG_IH)
913#define AscWriteChipIH(port, data) outpw((port)+IOP_REG_IH, data)
914#define AscReadChipQP(port) (uchar)inp((port)+IOP_REG_QP)
915#define AscWriteChipQP(port, data) outp((port)+IOP_REG_QP, data)
916#define AscReadChipFIFO_L(port) (ushort)inpw((port)+IOP_REG_FIFO_L)
917#define AscWriteChipFIFO_L(port, data) outpw((port)+IOP_REG_FIFO_L, data)
918#define AscReadChipFIFO_H(port) (ushort)inpw((port)+IOP_REG_FIFO_H)
919#define AscWriteChipFIFO_H(port, data) outpw((port)+IOP_REG_FIFO_H, data)
920#define AscReadChipDmaSpeed(port) (uchar)inp((port)+IOP_DMA_SPEED)
921#define AscWriteChipDmaSpeed(port, data) outp((port)+IOP_DMA_SPEED, data)
922#define AscReadChipDA0(port) (ushort)inpw((port)+IOP_REG_DA0)
923#define AscWriteChipDA0(port) outpw((port)+IOP_REG_DA0, data)
924#define AscReadChipDA1(port) (ushort)inpw((port)+IOP_REG_DA1)
925#define AscWriteChipDA1(port) outpw((port)+IOP_REG_DA1, data)
926#define AscReadChipDC0(port) (ushort)inpw((port)+IOP_REG_DC0)
927#define AscWriteChipDC0(port) outpw((port)+IOP_REG_DC0, data)
928#define AscReadChipDC1(port) (ushort)inpw((port)+IOP_REG_DC1)
929#define AscWriteChipDC1(port) outpw((port)+IOP_REG_DC1, data)
930#define AscReadChipDvcID(port) (uchar)inp((port)+IOP_REG_ID)
931#define AscWriteChipDvcID(port, data) outp((port)+IOP_REG_ID, data)
932
933
934
935
936
937
938
939
940
941
942#define ADV_PADDR __u32
943#define ADV_VADDR __u32
944#define ADV_DCNT __u32
945#define ADV_SDCNT __s32
946
947
948
949
950
951
952
953
954
955#define ADV_VADDR_TO_U32 virt_to_bus
956#define ADV_U32_TO_VADDR bus_to_virt
957
958#define AdvPortAddr void __iomem *
959
960
961
962
963#define ADV_MEM_READB(addr) readb(addr)
964#define ADV_MEM_READW(addr) readw(addr)
965#define ADV_MEM_WRITEB(addr, byte) writeb(byte, addr)
966#define ADV_MEM_WRITEW(addr, word) writew(word, addr)
967#define ADV_MEM_WRITEDW(addr, dword) writel(dword, addr)
968
969#define ADV_CARRIER_COUNT (ASC_DEF_MAX_HOST_QNG + 15)
970
971
972
973
974
975
976
977
978
979
980#define ADV_TOT_SG_BLOCK ASC_DEF_MAX_HOST_QNG
981
982
983
984
985#define ADV_MAX_SG_LIST 255
986#define NO_OF_SG_PER_BLOCK 15
987
988#define ADV_EEP_DVC_CFG_BEGIN (0x00)
989#define ADV_EEP_DVC_CFG_END (0x15)
990#define ADV_EEP_DVC_CTL_BEGIN (0x16)
991#define ADV_EEP_MAX_WORD_ADDR (0x1E)
992
993#define ADV_EEP_DELAY_MS 100
994
995#define ADV_EEPROM_BIG_ENDIAN 0x8000
996#define ADV_EEPROM_BIOS_ENABLE 0x4000
997
998
999
1000
1001
1002#define ADV_EEPROM_TERM_POL 0x2000
1003#define ADV_EEPROM_CIS_LD 0x2000
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015#define ADV_EEPROM_INTAB 0x0800
1016
1017typedef struct adveep_3550_config {
1018
1019
1020 ushort cfg_lsw;
1021
1022
1023
1024 ushort cfg_msw;
1025 ushort disc_enable;
1026 ushort wdtr_able;
1027 ushort sdtr_able;
1028 ushort start_motor;
1029 ushort tagqng_able;
1030 ushort bios_scan;
1031 ushort scam_tolerant;
1032
1033 uchar adapter_scsi_id;
1034 uchar bios_boot_delay;
1035
1036 uchar scsi_reset_delay;
1037 uchar bios_id_lun;
1038
1039
1040
1041 uchar termination;
1042
1043
1044
1045
1046
1047 uchar reserved1;
1048
1049 ushort bios_ctrl;
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066 ushort ultra_able;
1067 ushort reserved2;
1068 uchar max_host_qng;
1069 uchar max_dvc_qng;
1070 ushort dvc_cntl;
1071 ushort bug_fix;
1072 ushort serial_number_word1;
1073 ushort serial_number_word2;
1074 ushort serial_number_word3;
1075 ushort check_sum;
1076 uchar oem_name[16];
1077 ushort dvc_err_code;
1078 ushort adv_err_code;
1079 ushort adv_err_addr;
1080 ushort saved_dvc_err_code;
1081 ushort saved_adv_err_code;
1082 ushort saved_adv_err_addr;
1083 ushort num_of_err;
1084} ADVEEP_3550_CONFIG;
1085
1086typedef struct adveep_38C0800_config {
1087
1088
1089 ushort cfg_lsw;
1090
1091
1092
1093 ushort cfg_msw;
1094 ushort disc_enable;
1095 ushort wdtr_able;
1096 ushort sdtr_speed1;
1097 ushort start_motor;
1098 ushort tagqng_able;
1099 ushort bios_scan;
1100 ushort scam_tolerant;
1101
1102 uchar adapter_scsi_id;
1103 uchar bios_boot_delay;
1104
1105 uchar scsi_reset_delay;
1106 uchar bios_id_lun;
1107
1108
1109
1110 uchar termination_se;
1111
1112
1113
1114
1115
1116 uchar termination_lvd;
1117
1118
1119
1120
1121
1122 ushort bios_ctrl;
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139 ushort sdtr_speed2;
1140 ushort sdtr_speed3;
1141 uchar max_host_qng;
1142 uchar max_dvc_qng;
1143 ushort dvc_cntl;
1144 ushort sdtr_speed4;
1145 ushort serial_number_word1;
1146 ushort serial_number_word2;
1147 ushort serial_number_word3;
1148 ushort check_sum;
1149 uchar oem_name[16];
1150 ushort dvc_err_code;
1151 ushort adv_err_code;
1152 ushort adv_err_addr;
1153 ushort saved_dvc_err_code;
1154 ushort saved_adv_err_code;
1155 ushort saved_adv_err_addr;
1156 ushort reserved36;
1157 ushort reserved37;
1158 ushort reserved38;
1159 ushort reserved39;
1160 ushort reserved40;
1161 ushort reserved41;
1162 ushort reserved42;
1163 ushort reserved43;
1164 ushort reserved44;
1165 ushort reserved45;
1166 ushort reserved46;
1167 ushort reserved47;
1168 ushort reserved48;
1169 ushort reserved49;
1170 ushort reserved50;
1171 ushort reserved51;
1172 ushort reserved52;
1173 ushort reserved53;
1174 ushort reserved54;
1175 ushort reserved55;
1176 ushort cisptr_lsw;
1177 ushort cisprt_msw;
1178 ushort subsysvid;
1179 ushort subsysid;
1180 ushort reserved60;
1181 ushort reserved61;
1182 ushort reserved62;
1183 ushort reserved63;
1184} ADVEEP_38C0800_CONFIG;
1185
1186typedef struct adveep_38C1600_config {
1187
1188
1189 ushort cfg_lsw;
1190
1191
1192
1193
1194
1195 ushort cfg_msw;
1196 ushort disc_enable;
1197 ushort wdtr_able;
1198 ushort sdtr_speed1;
1199 ushort start_motor;
1200 ushort tagqng_able;
1201 ushort bios_scan;
1202 ushort scam_tolerant;
1203
1204 uchar adapter_scsi_id;
1205 uchar bios_boot_delay;
1206
1207 uchar scsi_reset_delay;
1208 uchar bios_id_lun;
1209
1210
1211
1212 uchar termination_se;
1213
1214
1215
1216
1217
1218 uchar termination_lvd;
1219
1220
1221
1222
1223
1224 ushort bios_ctrl;
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 ushort sdtr_speed2;
1242 ushort sdtr_speed3;
1243 uchar max_host_qng;
1244 uchar max_dvc_qng;
1245 ushort dvc_cntl;
1246 ushort sdtr_speed4;
1247 ushort serial_number_word1;
1248 ushort serial_number_word2;
1249 ushort serial_number_word3;
1250 ushort check_sum;
1251 uchar oem_name[16];
1252 ushort dvc_err_code;
1253 ushort adv_err_code;
1254 ushort adv_err_addr;
1255 ushort saved_dvc_err_code;
1256 ushort saved_adv_err_code;
1257 ushort saved_adv_err_addr;
1258 ushort reserved36;
1259 ushort reserved37;
1260 ushort reserved38;
1261 ushort reserved39;
1262 ushort reserved40;
1263 ushort reserved41;
1264 ushort reserved42;
1265 ushort reserved43;
1266 ushort reserved44;
1267 ushort reserved45;
1268 ushort reserved46;
1269 ushort reserved47;
1270 ushort reserved48;
1271 ushort reserved49;
1272 ushort reserved50;
1273 ushort reserved51;
1274 ushort reserved52;
1275 ushort reserved53;
1276 ushort reserved54;
1277 ushort reserved55;
1278 ushort cisptr_lsw;
1279 ushort cisprt_msw;
1280 ushort subsysvid;
1281 ushort subsysid;
1282 ushort reserved60;
1283 ushort reserved61;
1284 ushort reserved62;
1285 ushort reserved63;
1286} ADVEEP_38C1600_CONFIG;
1287
1288
1289
1290
1291#define ASC_EEP_CMD_DONE 0x0200
1292
1293
1294#define BIOS_CTRL_BIOS 0x0001
1295#define BIOS_CTRL_EXTENDED_XLAT 0x0002
1296#define BIOS_CTRL_GT_2_DISK 0x0004
1297#define BIOS_CTRL_BIOS_REMOVABLE 0x0008
1298#define BIOS_CTRL_BOOTABLE_CD 0x0010
1299#define BIOS_CTRL_MULTIPLE_LUN 0x0040
1300#define BIOS_CTRL_DISPLAY_MSG 0x0080
1301#define BIOS_CTRL_NO_SCAM 0x0100
1302#define BIOS_CTRL_RESET_SCSI_BUS 0x0200
1303#define BIOS_CTRL_INIT_VERBOSE 0x0800
1304#define BIOS_CTRL_SCSI_PARITY 0x1000
1305#define BIOS_CTRL_AIPP_DIS 0x2000
1306
1307#define ADV_3550_MEMSIZE 0x2000
1308
1309#define ADV_38C0800_MEMSIZE 0x4000
1310
1311
1312
1313
1314
1315
1316
1317
1318#define ADV_38C1600_MEMSIZE 0x4000
1319
1320
1321
1322
1323#define IOPB_INTR_STATUS_REG 0x00
1324#define IOPB_CHIP_ID_1 0x01
1325#define IOPB_INTR_ENABLES 0x02
1326#define IOPB_CHIP_TYPE_REV 0x03
1327#define IOPB_RES_ADDR_4 0x04
1328#define IOPB_RES_ADDR_5 0x05
1329#define IOPB_RAM_DATA 0x06
1330#define IOPB_RES_ADDR_7 0x07
1331#define IOPB_FLAG_REG 0x08
1332#define IOPB_RES_ADDR_9 0x09
1333#define IOPB_RISC_CSR 0x0A
1334#define IOPB_RES_ADDR_B 0x0B
1335#define IOPB_RES_ADDR_C 0x0C
1336#define IOPB_RES_ADDR_D 0x0D
1337#define IOPB_SOFT_OVER_WR 0x0E
1338#define IOPB_RES_ADDR_F 0x0F
1339#define IOPB_MEM_CFG 0x10
1340#define IOPB_RES_ADDR_11 0x11
1341#define IOPB_GPIO_DATA 0x12
1342#define IOPB_RES_ADDR_13 0x13
1343#define IOPB_FLASH_PAGE 0x14
1344#define IOPB_RES_ADDR_15 0x15
1345#define IOPB_GPIO_CNTL 0x16
1346#define IOPB_RES_ADDR_17 0x17
1347#define IOPB_FLASH_DATA 0x18
1348#define IOPB_RES_ADDR_19 0x19
1349#define IOPB_RES_ADDR_1A 0x1A
1350#define IOPB_RES_ADDR_1B 0x1B
1351#define IOPB_RES_ADDR_1C 0x1C
1352#define IOPB_RES_ADDR_1D 0x1D
1353#define IOPB_RES_ADDR_1E 0x1E
1354#define IOPB_RES_ADDR_1F 0x1F
1355#define IOPB_DMA_CFG0 0x20
1356#define IOPB_DMA_CFG1 0x21
1357#define IOPB_TICKLE 0x22
1358#define IOPB_DMA_REG_WR 0x23
1359#define IOPB_SDMA_STATUS 0x24
1360#define IOPB_SCSI_BYTE_CNT 0x25
1361#define IOPB_HOST_BYTE_CNT 0x26
1362#define IOPB_BYTE_LEFT_TO_XFER 0x27
1363#define IOPB_BYTE_TO_XFER_0 0x28
1364#define IOPB_BYTE_TO_XFER_1 0x29
1365#define IOPB_BYTE_TO_XFER_2 0x2A
1366#define IOPB_BYTE_TO_XFER_3 0x2B
1367#define IOPB_ACC_GRP 0x2C
1368#define IOPB_RES_ADDR_2D 0x2D
1369#define IOPB_DEV_ID 0x2E
1370#define IOPB_RES_ADDR_2F 0x2F
1371#define IOPB_SCSI_DATA 0x30
1372#define IOPB_RES_ADDR_31 0x31
1373#define IOPB_RES_ADDR_32 0x32
1374#define IOPB_SCSI_DATA_HSHK 0x33
1375#define IOPB_SCSI_CTRL 0x34
1376#define IOPB_RES_ADDR_35 0x35
1377#define IOPB_RES_ADDR_36 0x36
1378#define IOPB_RES_ADDR_37 0x37
1379#define IOPB_RAM_BIST 0x38
1380#define IOPB_PLL_TEST 0x39
1381#define IOPB_PCI_INT_CFG 0x3A
1382#define IOPB_RES_ADDR_3B 0x3B
1383#define IOPB_RFIFO_CNT 0x3C
1384#define IOPB_RES_ADDR_3D 0x3D
1385#define IOPB_RES_ADDR_3E 0x3E
1386#define IOPB_RES_ADDR_3F 0x3F
1387
1388
1389
1390
1391#define IOPW_CHIP_ID_0 0x00
1392#define IOPW_CTRL_REG 0x02
1393#define IOPW_RAM_ADDR 0x04
1394#define IOPW_RAM_DATA 0x06
1395#define IOPW_RES_ADDR_08 0x08
1396#define IOPW_RISC_CSR 0x0A
1397#define IOPW_SCSI_CFG0 0x0C
1398#define IOPW_SCSI_CFG1 0x0E
1399#define IOPW_RES_ADDR_10 0x10
1400#define IOPW_SEL_MASK 0x12
1401#define IOPW_RES_ADDR_14 0x14
1402#define IOPW_FLASH_ADDR 0x16
1403#define IOPW_RES_ADDR_18 0x18
1404#define IOPW_EE_CMD 0x1A
1405#define IOPW_EE_DATA 0x1C
1406#define IOPW_SFIFO_CNT 0x1E
1407#define IOPW_RES_ADDR_20 0x20
1408#define IOPW_Q_BASE 0x22
1409#define IOPW_QP 0x24
1410#define IOPW_IX 0x26
1411#define IOPW_SP 0x28
1412#define IOPW_PC 0x2A
1413#define IOPW_RES_ADDR_2C 0x2C
1414#define IOPW_RES_ADDR_2E 0x2E
1415#define IOPW_SCSI_DATA 0x30
1416#define IOPW_SCSI_DATA_HSHK 0x32
1417#define IOPW_SCSI_CTRL 0x34
1418#define IOPW_HSHK_CFG 0x36
1419#define IOPW_SXFR_STATUS 0x36
1420#define IOPW_SXFR_CNTL 0x38
1421#define IOPW_SXFR_CNTH 0x3A
1422#define IOPW_RES_ADDR_3C 0x3C
1423#define IOPW_RFIFO_DATA 0x3E
1424
1425
1426
1427
1428#define IOPDW_RES_ADDR_0 0x00
1429#define IOPDW_RAM_DATA 0x04
1430#define IOPDW_RES_ADDR_8 0x08
1431#define IOPDW_RES_ADDR_C 0x0C
1432#define IOPDW_RES_ADDR_10 0x10
1433#define IOPDW_COMMA 0x14
1434#define IOPDW_COMMB 0x18
1435#define IOPDW_RES_ADDR_1C 0x1C
1436#define IOPDW_SDMA_ADDR0 0x20
1437#define IOPDW_SDMA_ADDR1 0x24
1438#define IOPDW_SDMA_COUNT 0x28
1439#define IOPDW_SDMA_ERROR 0x2C
1440#define IOPDW_RDMA_ADDR0 0x30
1441#define IOPDW_RDMA_ADDR1 0x34
1442#define IOPDW_RDMA_COUNT 0x38
1443#define IOPDW_RDMA_ERROR 0x3C
1444
1445#define ADV_CHIP_ID_BYTE 0x25
1446#define ADV_CHIP_ID_WORD 0x04C1
1447
1448#define ADV_INTR_ENABLE_HOST_INTR 0x01
1449#define ADV_INTR_ENABLE_SEL_INTR 0x02
1450#define ADV_INTR_ENABLE_DPR_INTR 0x04
1451#define ADV_INTR_ENABLE_RTA_INTR 0x08
1452#define ADV_INTR_ENABLE_RMA_INTR 0x10
1453#define ADV_INTR_ENABLE_RST_INTR 0x20
1454#define ADV_INTR_ENABLE_DPE_INTR 0x40
1455#define ADV_INTR_ENABLE_GLOBAL_INTR 0x80
1456
1457#define ADV_INTR_STATUS_INTRA 0x01
1458#define ADV_INTR_STATUS_INTRB 0x02
1459#define ADV_INTR_STATUS_INTRC 0x04
1460
1461#define ADV_RISC_CSR_STOP (0x0000)
1462#define ADV_RISC_TEST_COND (0x2000)
1463#define ADV_RISC_CSR_RUN (0x4000)
1464#define ADV_RISC_CSR_SINGLE_STEP (0x8000)
1465
1466#define ADV_CTRL_REG_HOST_INTR 0x0100
1467#define ADV_CTRL_REG_SEL_INTR 0x0200
1468#define ADV_CTRL_REG_DPR_INTR 0x0400
1469#define ADV_CTRL_REG_RTA_INTR 0x0800
1470#define ADV_CTRL_REG_RMA_INTR 0x1000
1471#define ADV_CTRL_REG_RES_BIT14 0x2000
1472#define ADV_CTRL_REG_DPE_INTR 0x4000
1473#define ADV_CTRL_REG_POWER_DONE 0x8000
1474#define ADV_CTRL_REG_ANY_INTR 0xFF00
1475
1476#define ADV_CTRL_REG_CMD_RESET 0x00C6
1477#define ADV_CTRL_REG_CMD_WR_IO_REG 0x00C5
1478#define ADV_CTRL_REG_CMD_RD_IO_REG 0x00C4
1479#define ADV_CTRL_REG_CMD_WR_PCI_CFG_SPACE 0x00C3
1480#define ADV_CTRL_REG_CMD_RD_PCI_CFG_SPACE 0x00C2
1481
1482#define ADV_TICKLE_NOP 0x00
1483#define ADV_TICKLE_A 0x01
1484#define ADV_TICKLE_B 0x02
1485#define ADV_TICKLE_C 0x03
1486
1487#define AdvIsIntPending(port) \
1488 (AdvReadWordRegister(port, IOPW_CTRL_REG) & ADV_CTRL_REG_HOST_INTR)
1489
1490
1491
1492
1493#define TIMER_MODEAB 0xC000
1494#define PARITY_EN 0x2000
1495#define EVEN_PARITY 0x1000
1496#define WD_LONG 0x0800
1497#define QUEUE_128 0x0400
1498#define PRIM_MODE 0x0100
1499#define SCAM_EN 0x0080
1500#define SEL_TMO_LONG 0x0040
1501#define CFRM_ID 0x0020
1502#define OUR_ID_EN 0x0010
1503#define OUR_ID 0x000F
1504
1505
1506
1507
1508#define BIG_ENDIAN 0x8000
1509#define TERM_POL 0x2000
1510#define SLEW_RATE 0x1000
1511#define FILTER_SEL 0x0C00
1512#define FLTR_DISABLE 0x0000
1513#define FLTR_11_TO_20NS 0x0800
1514#define FLTR_21_TO_39NS 0x0C00
1515#define ACTIVE_DBL 0x0200
1516#define DIFF_MODE 0x0100
1517#define DIFF_SENSE 0x0080
1518#define TERM_CTL_SEL 0x0040
1519#define TERM_CTL 0x0030
1520#define TERM_CTL_H 0x0020
1521#define TERM_CTL_L 0x0010
1522#define CABLE_DETECT 0x000F
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535#define DIS_TERM_DRV 0x4000
1536#define HVD_LVD_SE 0x1C00
1537#define HVD 0x1000
1538#define LVD 0x0800
1539#define SE 0x0400
1540#define TERM_LVD 0x00C0
1541#define TERM_LVD_HI 0x0080
1542#define TERM_LVD_LO 0x0040
1543#define TERM_SE 0x0030
1544#define TERM_SE_HI 0x0020
1545#define TERM_SE_LO 0x0010
1546#define C_DET_LVD 0x000C
1547#define C_DET3 0x0008
1548#define C_DET2 0x0004
1549#define C_DET_SE 0x0003
1550#define C_DET1 0x0002
1551#define C_DET0 0x0001
1552
1553#define CABLE_ILLEGAL_A 0x7
1554
1555
1556#define CABLE_ILLEGAL_B 0xB
1557
1558
1559
1560
1561
1562#define BIOS_EN 0x40
1563#define FAST_EE_CLK 0x20
1564#define RAM_SZ 0x1C
1565#define RAM_SZ_2KB 0x00
1566#define RAM_SZ_4KB 0x04
1567#define RAM_SZ_8KB 0x08
1568#define RAM_SZ_16KB 0x0C
1569#define RAM_SZ_32KB 0x10
1570#define RAM_SZ_64KB 0x14
1571
1572
1573
1574
1575
1576
1577#define BC_THRESH_ENB 0x80
1578#define FIFO_THRESH 0x70
1579#define FIFO_THRESH_16B 0x00
1580#define FIFO_THRESH_32B 0x20
1581#define FIFO_THRESH_48B 0x30
1582#define FIFO_THRESH_64B 0x40
1583#define FIFO_THRESH_80B 0x50
1584#define FIFO_THRESH_96B 0x60
1585#define FIFO_THRESH_112B 0x70
1586#define START_CTL 0x0C
1587#define START_CTL_TH 0x00
1588#define START_CTL_ID 0x04
1589#define START_CTL_THID 0x08
1590#define START_CTL_EMFU 0x0C
1591#define READ_CMD 0x03
1592#define READ_CMD_MR 0x00
1593#define READ_CMD_MRL 0x02
1594#define READ_CMD_MRM 0x03
1595
1596
1597
1598
1599#define RAM_TEST_MODE 0x80
1600#define PRE_TEST_MODE 0x40
1601#define NORMAL_MODE 0x00
1602#define RAM_TEST_DONE 0x10
1603#define RAM_TEST_STATUS 0x0F
1604#define RAM_TEST_HOST_ERROR 0x08
1605#define RAM_TEST_INTRAM_ERROR 0x04
1606#define RAM_TEST_RISC_ERROR 0x02
1607#define RAM_TEST_SCSI_ERROR 0x01
1608#define RAM_TEST_SUCCESS 0x00
1609#define PRE_TEST_VALUE 0x05
1610#define NORMAL_VALUE 0x00
1611
1612
1613
1614
1615
1616
1617
1618#define INTAB_LD 0x80
1619
1620
1621
1622
1623
1624
1625
1626#define TOTEMPOLE 0x02
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637#define INTAB 0x01
1638
1639
1640
1641
1642#define ADV_TRUE 1
1643#define ADV_FALSE 0
1644#define ADV_SUCCESS 1
1645#define ADV_BUSY 0
1646#define ADV_ERROR (-1)
1647
1648
1649
1650
1651#define ASC_WARN_BUSRESET_ERROR 0x0001
1652#define ASC_WARN_EEPROM_CHKSUM 0x0002
1653#define ASC_WARN_EEPROM_TERMINATION 0x0004
1654#define ASC_WARN_ERROR 0xFFFF
1655
1656#define ADV_MAX_TID 15
1657#define ADV_MAX_LUN 7
1658
1659
1660
1661
1662#define ASC_MC_CODE_BEGIN_ADDR 0x0028
1663#define ASC_MC_CODE_END_ADDR 0x002A
1664#define ASC_MC_CODE_CHK_SUM 0x002C
1665#define ASC_MC_VERSION_DATE 0x0038
1666#define ASC_MC_VERSION_NUM 0x003A
1667#define ASC_MC_BIOSMEM 0x0040
1668#define ASC_MC_BIOSLEN 0x0050
1669#define ASC_MC_BIOS_SIGNATURE 0x0058
1670#define ASC_MC_BIOS_VERSION 0x005A
1671#define ASC_MC_SDTR_SPEED1 0x0090
1672#define ASC_MC_SDTR_SPEED2 0x0092
1673#define ASC_MC_SDTR_SPEED3 0x0094
1674#define ASC_MC_SDTR_SPEED4 0x0096
1675#define ASC_MC_CHIP_TYPE 0x009A
1676#define ASC_MC_INTRB_CODE 0x009B
1677#define ASC_MC_WDTR_ABLE 0x009C
1678#define ASC_MC_SDTR_ABLE 0x009E
1679#define ASC_MC_TAGQNG_ABLE 0x00A0
1680#define ASC_MC_DISC_ENABLE 0x00A2
1681#define ASC_MC_IDLE_CMD_STATUS 0x00A4
1682#define ASC_MC_IDLE_CMD 0x00A6
1683#define ASC_MC_IDLE_CMD_PARAMETER 0x00A8
1684#define ASC_MC_DEFAULT_SCSI_CFG0 0x00AC
1685#define ASC_MC_DEFAULT_SCSI_CFG1 0x00AE
1686#define ASC_MC_DEFAULT_MEM_CFG 0x00B0
1687#define ASC_MC_DEFAULT_SEL_MASK 0x00B2
1688#define ASC_MC_SDTR_DONE 0x00B6
1689#define ASC_MC_NUMBER_OF_QUEUED_CMD 0x00C0
1690#define ASC_MC_NUMBER_OF_MAX_CMD 0x00D0
1691#define ASC_MC_DEVICE_HSHK_CFG_TABLE 0x0100
1692#define ASC_MC_CONTROL_FLAG 0x0122
1693#define ASC_MC_WDTR_DONE 0x0124
1694#define ASC_MC_CAM_MODE_MASK 0x015E
1695#define ASC_MC_ICQ 0x0160
1696#define ASC_MC_IRQ 0x0164
1697#define ASC_MC_PPR_ABLE 0x017A
1698
1699
1700
1701
1702#define BIOS_CODESEG 0x54
1703#define BIOS_CODELEN 0x56
1704#define BIOS_SIGNATURE 0x58
1705#define BIOS_VERSION 0x5A
1706
1707
1708
1709
1710
1711
1712
1713#define CONTROL_FLAG_IGNORE_PERR 0x0001
1714#define CONTROL_FLAG_ENABLE_AIPP 0x0002
1715
1716
1717
1718
1719#define HSHK_CFG_WIDE_XFR 0x8000
1720#define HSHK_CFG_RATE 0x0F00
1721#define HSHK_CFG_OFFSET 0x001F
1722
1723#define ASC_DEF_MAX_HOST_QNG 0xFD
1724#define ASC_DEF_MIN_HOST_QNG 0x10
1725#define ASC_DEF_MAX_DVC_QNG 0x3F
1726#define ASC_DEF_MIN_DVC_QNG 0x04
1727
1728#define ASC_QC_DATA_CHECK 0x01
1729#define ASC_QC_DATA_OUT 0x02
1730#define ASC_QC_START_MOTOR 0x04
1731#define ASC_QC_NO_OVERRUN 0x08
1732#define ASC_QC_FREEZE_TIDQ 0x10
1733
1734#define ASC_QSC_NO_DISC 0x01
1735#define ASC_QSC_NO_TAGMSG 0x02
1736#define ASC_QSC_NO_SYNC 0x04
1737#define ASC_QSC_NO_WIDE 0x08
1738#define ASC_QSC_REDO_DTR 0x10
1739
1740
1741
1742
1743#define ASC_QSC_HEAD_TAG 0x40
1744#define ASC_QSC_ORDERED_TAG 0x80
1745
1746
1747
1748
1749
1750typedef struct adv_carr_t {
1751 ADV_VADDR carr_va;
1752 ADV_PADDR carr_pa;
1753 ADV_VADDR areq_vpa;
1754
1755
1756
1757
1758
1759
1760 ADV_VADDR next_vpa;
1761} ADV_CARR_T;
1762
1763
1764
1765
1766#define ASC_NEXT_VPA_MASK 0xFFFFFFF0
1767
1768#define ASC_RQ_DONE 0x00000001
1769#define ASC_RQ_GOOD 0x00000002
1770#define ASC_CQ_STOPPER 0x00000000
1771
1772#define ASC_GET_CARRP(carrp) ((carrp) & ASC_NEXT_VPA_MASK)
1773
1774#define ADV_CARRIER_NUM_PAGE_CROSSING \
1775 (((ADV_CARRIER_COUNT * sizeof(ADV_CARR_T)) + (PAGE_SIZE - 1))/PAGE_SIZE)
1776
1777#define ADV_CARRIER_BUFSIZE \
1778 ((ADV_CARRIER_COUNT + ADV_CARRIER_NUM_PAGE_CROSSING) * sizeof(ADV_CARR_T))
1779
1780
1781
1782
1783
1784
1785
1786#define ADV_POLL_REQUEST 0x01
1787#define ADV_SCSIQ_DONE 0x02
1788#define ADV_DONT_RETRY 0x08
1789
1790#define ADV_CHIP_ASC3550 0x01
1791#define ADV_CHIP_ASC38C0800 0x02
1792#define ADV_CHIP_ASC38C1600 0x03
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805typedef struct adv_dvc_cfg {
1806 ushort disc_enable;
1807 uchar chip_version;
1808 uchar termination;
1809 ushort control_flag;
1810 ushort mcode_date;
1811 ushort mcode_version;
1812 ushort serial1;
1813 ushort serial2;
1814 ushort serial3;
1815} ADV_DVC_CFG;
1816
1817struct adv_dvc_var;
1818struct adv_scsi_req_q;
1819
1820typedef struct asc_sg_block {
1821 uchar reserved1;
1822 uchar reserved2;
1823 uchar reserved3;
1824 uchar sg_cnt;
1825 ADV_PADDR sg_ptr;
1826 struct {
1827 ADV_PADDR sg_addr;
1828 ADV_DCNT sg_count;
1829 } sg_list[NO_OF_SG_PER_BLOCK];
1830} ADV_SG_BLOCK;
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843typedef struct adv_scsi_req_q {
1844 uchar cntl;
1845 uchar target_cmd;
1846 uchar target_id;
1847 uchar target_lun;
1848 ADV_PADDR data_addr;
1849 ADV_DCNT data_cnt;
1850 ADV_PADDR sense_addr;
1851 ADV_PADDR carr_pa;
1852 uchar mflag;
1853 uchar sense_len;
1854 uchar cdb_len;
1855 uchar scsi_cntl;
1856 uchar done_status;
1857 uchar scsi_status;
1858 uchar host_status;
1859 uchar sg_working_ix;
1860 uchar cdb[12];
1861 ADV_PADDR sg_real_addr;
1862 ADV_PADDR scsiq_rptr;
1863 uchar cdb16[4];
1864 ADV_VADDR scsiq_ptr;
1865 ADV_VADDR carr_va;
1866
1867
1868
1869
1870 ADV_VADDR srb_ptr;
1871 ADV_SG_BLOCK *sg_list_ptr;
1872 char *vdata_addr;
1873 uchar a_flag;
1874 uchar pad[2];
1875} ADV_SCSI_REQ_Q;
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892typedef struct adv_sgblk {
1893 ADV_SG_BLOCK sg_block;
1894 uchar align[32];
1895 struct adv_sgblk *next_sgblkp;
1896} adv_sgblk_t;
1897
1898typedef struct adv_req {
1899 ADV_SCSI_REQ_Q scsi_req_q;
1900 uchar align[32];
1901 struct scsi_cmnd *cmndp;
1902 adv_sgblk_t *sgblkp;
1903 struct adv_req *next_reqp;
1904} adv_req_t;
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918typedef struct adv_dvc_var {
1919 AdvPortAddr iop_base;
1920 ushort err_code;
1921 ushort bios_ctrl;
1922 ushort wdtr_able;
1923 ushort sdtr_able;
1924 ushort ultra_able;
1925 ushort sdtr_speed1;
1926 ushort sdtr_speed2;
1927 ushort sdtr_speed3;
1928 ushort sdtr_speed4;
1929 ushort tagqng_able;
1930 ushort ppr_able;
1931 uchar max_dvc_qng;
1932 ushort start_motor;
1933 uchar scsi_reset_wait;
1934 uchar chip_no;
1935 uchar max_host_qng;
1936 ushort no_scam;
1937 struct asc_board *drv_ptr;
1938 uchar chip_scsi_id;
1939 uchar chip_type;
1940 uchar bist_err_code;
1941 ADV_CARR_T *carrier_buf;
1942 ADV_CARR_T *carr_freelist;
1943 ADV_CARR_T *icq_sp;
1944 ADV_CARR_T *irq_sp;
1945 ushort carr_pending_cnt;
1946 struct adv_req *orig_reqp;
1947
1948
1949
1950
1951 ADV_DVC_CFG *cfg;
1952} ADV_DVC_VAR;
1953
1954
1955
1956
1957#define IDLE_CMD_COMPLETED 0
1958#define IDLE_CMD_STOP_CHIP 0x0001
1959#define IDLE_CMD_STOP_CHIP_SEND_INT 0x0002
1960#define IDLE_CMD_SEND_INT 0x0004
1961#define IDLE_CMD_ABORT 0x0008
1962#define IDLE_CMD_DEVICE_RESET 0x0010
1963#define IDLE_CMD_SCSI_RESET_START 0x0020
1964#define IDLE_CMD_SCSI_RESET_END 0x0040
1965#define IDLE_CMD_SCSIREQ 0x0080
1966
1967#define IDLE_CMD_STATUS_SUCCESS 0x0001
1968#define IDLE_CMD_STATUS_FAILURE 0x0002
1969
1970
1971
1972
1973#define ADV_NOWAIT 0x01
1974
1975
1976
1977
1978#define SCSI_WAIT_100_MSEC 100UL
1979#define SCSI_US_PER_MSEC 1000
1980#define SCSI_MAX_RETRY 10
1981
1982#define ADV_ASYNC_RDMA_FAILURE 0x01
1983#define ADV_ASYNC_SCSI_BUS_RESET_DET 0x02
1984#define ADV_ASYNC_CARRIER_READY_FAILURE 0x03
1985#define ADV_RDMA_IN_CARR_AND_Q_INVALID 0x04
1986
1987#define ADV_HOST_SCSI_BUS_RESET 0x80
1988
1989
1990#define AdvReadByteRegister(iop_base, reg_off) \
1991 (ADV_MEM_READB((iop_base) + (reg_off)))
1992
1993
1994#define AdvWriteByteRegister(iop_base, reg_off, byte) \
1995 (ADV_MEM_WRITEB((iop_base) + (reg_off), (byte)))
1996
1997
1998#define AdvReadWordRegister(iop_base, reg_off) \
1999 (ADV_MEM_READW((iop_base) + (reg_off)))
2000
2001
2002#define AdvWriteWordRegister(iop_base, reg_off, word) \
2003 (ADV_MEM_WRITEW((iop_base) + (reg_off), (word)))
2004
2005
2006#define AdvWriteDWordRegister(iop_base, reg_off, dword) \
2007 (ADV_MEM_WRITEDW((iop_base) + (reg_off), (dword)))
2008
2009
2010#define AdvReadByteLram(iop_base, addr, byte) \
2011do { \
2012 ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); \
2013 (byte) = ADV_MEM_READB((iop_base) + IOPB_RAM_DATA); \
2014} while (0)
2015
2016
2017#define AdvWriteByteLram(iop_base, addr, byte) \
2018 (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2019 ADV_MEM_WRITEB((iop_base) + IOPB_RAM_DATA, (byte)))
2020
2021
2022#define AdvReadWordLram(iop_base, addr, word) \
2023do { \
2024 ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)); \
2025 (word) = (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA)); \
2026} while (0)
2027
2028
2029#define AdvWriteWordLram(iop_base, addr, word) \
2030 (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2031 ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
2032
2033
2034
2035#define AdvWriteDWordLramNoSwap(iop_base, addr, dword) \
2036 ((ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr)), \
2037 ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, \
2038 cpu_to_le16((ushort) ((dword) & 0xFFFF)))), \
2039 (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_ADDR, (addr) + 2), \
2040 ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, \
2041 cpu_to_le16((ushort) ((dword >> 16) & 0xFFFF)))))
2042
2043
2044#define AdvReadWordAutoIncLram(iop_base) \
2045 (ADV_MEM_READW((iop_base) + IOPW_RAM_DATA))
2046
2047
2048#define AdvWriteWordAutoIncLram(iop_base, word) \
2049 (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
2050
2051
2052
2053
2054
2055
2056
2057#define AdvFindSignature(iop_base) \
2058 (((AdvReadByteRegister((iop_base), IOPB_CHIP_ID_1) == \
2059 ADV_CHIP_ID_BYTE) && \
2060 (AdvReadWordRegister((iop_base), IOPW_CHIP_ID_0) == \
2061 ADV_CHIP_ID_WORD)) ? ADV_TRUE : ADV_FALSE)
2062
2063
2064
2065
2066
2067
2068#define AdvGetChipVersion(iop_base, bus_type) \
2069 AdvReadByteRegister((iop_base), IOPB_CHIP_TYPE_REV)
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083#define AdvAbortQueue(asc_dvc, scsiq) \
2084 AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_ABORT, \
2085 (ADV_DCNT) (scsiq))
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098#define AdvResetDevice(asc_dvc, target_id) \
2099 AdvSendIdleCmd((asc_dvc), (ushort) IDLE_CMD_DEVICE_RESET, \
2100 (ADV_DCNT) (target_id))
2101
2102
2103
2104
2105#define ADV_SCSI_BIT_ID_TYPE ushort
2106
2107
2108
2109
2110#define ADV_SCAN_LUN 0x01
2111#define ADV_CAPINFO_NOLUN 0x02
2112
2113
2114
2115
2116#define ADV_TID_TO_TIDMASK(tid) (0x01 << ((tid) & ADV_MAX_TID))
2117
2118
2119
2120
2121
2122#define QD_NO_STATUS 0x00
2123#define QD_NO_ERROR 0x01
2124#define QD_ABORTED_BY_HOST 0x02
2125#define QD_WITH_ERROR 0x04
2126
2127#define QHSTA_NO_ERROR 0x00
2128#define QHSTA_M_SEL_TIMEOUT 0x11
2129#define QHSTA_M_DATA_OVER_RUN 0x12
2130#define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
2131#define QHSTA_M_QUEUE_ABORTED 0x15
2132#define QHSTA_M_SXFR_SDMA_ERR 0x16
2133#define QHSTA_M_SXFR_SXFR_PERR 0x17
2134#define QHSTA_M_RDMA_PERR 0x18
2135#define QHSTA_M_SXFR_OFF_UFLW 0x19
2136#define QHSTA_M_SXFR_OFF_OFLW 0x20
2137#define QHSTA_M_SXFR_WD_TMO 0x21
2138#define QHSTA_M_SXFR_DESELECTED 0x22
2139
2140#define QHSTA_M_SXFR_XFR_OFLW 0x12
2141#define QHSTA_M_SXFR_XFR_PH_ERR 0x24
2142#define QHSTA_M_SXFR_UNKNOWN_ERROR 0x25
2143#define QHSTA_M_SCSI_BUS_RESET 0x30
2144#define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31
2145#define QHSTA_M_BUS_DEVICE_RESET 0x32
2146#define QHSTA_M_DIRECTION_ERR 0x35
2147#define QHSTA_M_DIRECTION_ERR_HUNG 0x36
2148#define QHSTA_M_WTM_TIMEOUT 0x41
2149#define QHSTA_M_BAD_CMPL_STATUS_IN 0x42
2150#define QHSTA_M_NO_AUTO_REQ_SENSE 0x43
2151#define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
2152#define QHSTA_M_INVALID_DEVICE 0x45
2153#define QHSTA_M_FROZEN_TIDQ 0x46
2154#define QHSTA_M_SGBACKUP_ERROR 0x47
2155
2156
2157#define ADV_8BALIGN(addr) (((ulong) (addr) + 0x7) & ~0x7)
2158#define ADV_16BALIGN(addr) (((ulong) (addr) + 0xF) & ~0xF)
2159#define ADV_32BALIGN(addr) (((ulong) (addr) + 0x1F) & ~0x1F)
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169#define ADV_SG_LIST_MAX_BYTE_SIZE \
2170 (sizeof(ADV_SG_BLOCK) * \
2171 ((ADV_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK))
2172
2173
2174#define ASC_IS_WIDE_BOARD 0x04
2175
2176#define ASC_NARROW_BOARD(boardp) (((boardp)->flags & ASC_IS_WIDE_BOARD) == 0)
2177
2178#define NO_ISA_DMA 0xff
2179
2180#define ASC_INFO_SIZE 128
2181
2182#ifdef CONFIG_PROC_FS
2183
2184#define ASC_PRTBUF_SIZE 2048
2185#define ASC_PRTLINE_SIZE 160
2186
2187#define ASC_PRT_NEXT() \
2188 if (cp) { \
2189 totlen += len; \
2190 leftlen -= len; \
2191 if (leftlen == 0) { \
2192 return totlen; \
2193 } \
2194 cp += len; \
2195 }
2196#endif
2197
2198
2199#define ASC_TRUE 1
2200#define ASC_FALSE 0
2201#define ASC_NOERROR 1
2202#define ASC_BUSY 0
2203#define ASC_ERROR (-1)
2204
2205
2206#define STATUS_BYTE(byte) (byte)
2207#define MSG_BYTE(byte) ((byte) << 8)
2208#define HOST_BYTE(byte) ((byte) << 16)
2209#define DRIVER_BYTE(byte) ((byte) << 24)
2210
2211#define ASC_STATS(shost, counter) ASC_STATS_ADD(shost, counter, 1)
2212#ifndef ADVANSYS_STATS
2213#define ASC_STATS_ADD(shost, counter, count)
2214#else
2215#define ASC_STATS_ADD(shost, counter, count) \
2216 (((struct asc_board *) shost_priv(shost))->asc_stats.counter += (count))
2217#endif
2218
2219
2220#define ASC_TENTHS(num, den) \
2221 (((10 * ((num)/(den))) > (((num) * 10)/(den))) ? \
2222 0 : ((((num) * 10)/(den)) - (10 * ((num)/(den)))))
2223
2224
2225
2226
2227#define ASC_PRINT(s) \
2228 { \
2229 printk("advansys: "); \
2230 printk(s); \
2231 }
2232
2233#define ASC_PRINT1(s, a1) \
2234 { \
2235 printk("advansys: "); \
2236 printk((s), (a1)); \
2237 }
2238
2239#define ASC_PRINT2(s, a1, a2) \
2240 { \
2241 printk("advansys: "); \
2242 printk((s), (a1), (a2)); \
2243 }
2244
2245#define ASC_PRINT3(s, a1, a2, a3) \
2246 { \
2247 printk("advansys: "); \
2248 printk((s), (a1), (a2), (a3)); \
2249 }
2250
2251#define ASC_PRINT4(s, a1, a2, a3, a4) \
2252 { \
2253 printk("advansys: "); \
2254 printk((s), (a1), (a2), (a3), (a4)); \
2255 }
2256
2257#ifndef ADVANSYS_DEBUG
2258
2259#define ASC_DBG(lvl, s...)
2260#define ASC_DBG_PRT_SCSI_HOST(lvl, s)
2261#define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp)
2262#define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
2263#define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone)
2264#define ADV_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp)
2265#define ASC_DBG_PRT_HEX(lvl, name, start, length)
2266#define ASC_DBG_PRT_CDB(lvl, cdb, len)
2267#define ASC_DBG_PRT_SENSE(lvl, sense, len)
2268#define ASC_DBG_PRT_INQUIRY(lvl, inq, len)
2269
2270#else
2271
2272
2273
2274
2275
2276
2277
2278
2279#define ASC_DBG(lvl, format, arg...) { \
2280 if (asc_dbglvl >= (lvl)) \
2281 printk(KERN_DEBUG "%s: %s: " format, DRV_NAME, \
2282 __func__ , ## arg); \
2283}
2284
2285#define ASC_DBG_PRT_SCSI_HOST(lvl, s) \
2286 { \
2287 if (asc_dbglvl >= (lvl)) { \
2288 asc_prt_scsi_host(s); \
2289 } \
2290 }
2291
2292#define ASC_DBG_PRT_ASC_SCSI_Q(lvl, scsiqp) \
2293 { \
2294 if (asc_dbglvl >= (lvl)) { \
2295 asc_prt_asc_scsi_q(scsiqp); \
2296 } \
2297 }
2298
2299#define ASC_DBG_PRT_ASC_QDONE_INFO(lvl, qdone) \
2300 { \
2301 if (asc_dbglvl >= (lvl)) { \
2302 asc_prt_asc_qdone_info(qdone); \
2303 } \
2304 }
2305
2306#define ASC_DBG_PRT_ADV_SCSI_REQ_Q(lvl, scsiqp) \
2307 { \
2308 if (asc_dbglvl >= (lvl)) { \
2309 asc_prt_adv_scsi_req_q(scsiqp); \
2310 } \
2311 }
2312
2313#define ASC_DBG_PRT_HEX(lvl, name, start, length) \
2314 { \
2315 if (asc_dbglvl >= (lvl)) { \
2316 asc_prt_hex((name), (start), (length)); \
2317 } \
2318 }
2319
2320#define ASC_DBG_PRT_CDB(lvl, cdb, len) \
2321 ASC_DBG_PRT_HEX((lvl), "CDB", (uchar *) (cdb), (len));
2322
2323#define ASC_DBG_PRT_SENSE(lvl, sense, len) \
2324 ASC_DBG_PRT_HEX((lvl), "SENSE", (uchar *) (sense), (len));
2325
2326#define ASC_DBG_PRT_INQUIRY(lvl, inq, len) \
2327 ASC_DBG_PRT_HEX((lvl), "INQUIRY", (uchar *) (inq), (len));
2328#endif
2329
2330#ifdef ADVANSYS_STATS
2331
2332
2333struct asc_stats {
2334
2335 ADV_DCNT queuecommand;
2336 ADV_DCNT reset;
2337 ADV_DCNT biosparam;
2338 ADV_DCNT interrupt;
2339 ADV_DCNT callback;
2340 ADV_DCNT done;
2341 ADV_DCNT build_error;
2342 ADV_DCNT adv_build_noreq;
2343 ADV_DCNT adv_build_nosg;
2344
2345 ADV_DCNT exe_noerror;
2346 ADV_DCNT exe_busy;
2347 ADV_DCNT exe_error;
2348 ADV_DCNT exe_unknown;
2349
2350 ADV_DCNT xfer_cnt;
2351 ADV_DCNT xfer_elem;
2352 ADV_DCNT xfer_sect;
2353};
2354#endif
2355
2356
2357
2358
2359
2360
2361
2362
2363struct asc_board {
2364 struct device *dev;
2365 uint flags;
2366 unsigned int irq;
2367 union {
2368 ASC_DVC_VAR asc_dvc_var;
2369 ADV_DVC_VAR adv_dvc_var;
2370 } dvc_var;
2371 union {
2372 ASC_DVC_CFG asc_dvc_cfg;
2373 ADV_DVC_CFG adv_dvc_cfg;
2374 } dvc_cfg;
2375 ushort asc_n_io_port;
2376 ADV_SCSI_BIT_ID_TYPE init_tidmask;
2377 ushort reqcnt[ADV_MAX_TID + 1];
2378 ADV_SCSI_BIT_ID_TYPE queue_full;
2379 ushort queue_full_cnt[ADV_MAX_TID + 1];
2380 union {
2381 ASCEEP_CONFIG asc_eep;
2382 ADVEEP_3550_CONFIG adv_3550_eep;
2383 ADVEEP_38C0800_CONFIG adv_38C0800_eep;
2384 ADVEEP_38C1600_CONFIG adv_38C1600_eep;
2385 } eep_config;
2386 ulong last_reset;
2387
2388 char *prtbuf;
2389#ifdef ADVANSYS_STATS
2390 struct asc_stats asc_stats;
2391#endif
2392
2393
2394
2395 uchar sdtr_data[ASC_MAX_TID + 1];
2396
2397
2398
2399 void __iomem *ioremap_addr;
2400 ushort ioport;
2401 adv_req_t *adv_reqp;
2402 adv_sgblk_t *adv_sgblkp;
2403 ushort bios_signature;
2404 ushort bios_version;
2405 ushort bios_codeseg;
2406 ushort bios_codelen;
2407};
2408
2409#define asc_dvc_to_board(asc_dvc) container_of(asc_dvc, struct asc_board, \
2410 dvc_var.asc_dvc_var)
2411#define adv_dvc_to_board(adv_dvc) container_of(adv_dvc, struct asc_board, \
2412 dvc_var.adv_dvc_var)
2413#define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
2414
2415#ifdef ADVANSYS_DEBUG
2416static int asc_dbglvl = 3;
2417
2418
2419
2420
2421static void asc_prt_asc_dvc_var(ASC_DVC_VAR *h)
2422{
2423 printk("ASC_DVC_VAR at addr 0x%lx\n", (ulong)h);
2424
2425 printk(" iop_base 0x%x, err_code 0x%x, dvc_cntl 0x%x, bug_fix_cntl "
2426 "%d,\n", h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl);
2427
2428 printk(" bus_type %d, init_sdtr 0x%x,\n", h->bus_type,
2429 (unsigned)h->init_sdtr);
2430
2431 printk(" sdtr_done 0x%x, use_tagged_qng 0x%x, unit_not_ready 0x%x, "
2432 "chip_no 0x%x,\n", (unsigned)h->sdtr_done,
2433 (unsigned)h->use_tagged_qng, (unsigned)h->unit_not_ready,
2434 (unsigned)h->chip_no);
2435
2436 printk(" queue_full_or_busy 0x%x, start_motor 0x%x, scsi_reset_wait "
2437 "%u,\n", (unsigned)h->queue_full_or_busy,
2438 (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait);
2439
2440 printk(" is_in_int %u, max_total_qng %u, cur_total_qng %u, "
2441 "in_critical_cnt %u,\n", (unsigned)h->is_in_int,
2442 (unsigned)h->max_total_qng, (unsigned)h->cur_total_qng,
2443 (unsigned)h->in_critical_cnt);
2444
2445 printk(" last_q_shortage %u, init_state 0x%x, no_scam 0x%x, "
2446 "pci_fix_asyn_xfer 0x%x,\n", (unsigned)h->last_q_shortage,
2447 (unsigned)h->init_state, (unsigned)h->no_scam,
2448 (unsigned)h->pci_fix_asyn_xfer);
2449
2450 printk(" cfg 0x%lx\n", (ulong)h->cfg);
2451}
2452
2453
2454
2455
2456static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h)
2457{
2458 printk("ASC_DVC_CFG at addr 0x%lx\n", (ulong)h);
2459
2460 printk(" can_tagged_qng 0x%x, cmd_qng_enabled 0x%x,\n",
2461 h->can_tagged_qng, h->cmd_qng_enabled);
2462 printk(" disc_enable 0x%x, sdtr_enable 0x%x,\n",
2463 h->disc_enable, h->sdtr_enable);
2464
2465 printk(" chip_scsi_id %d, isa_dma_speed %d, isa_dma_channel %d, "
2466 "chip_version %d,\n", h->chip_scsi_id, h->isa_dma_speed,
2467 h->isa_dma_channel, h->chip_version);
2468
2469 printk(" mcode_date 0x%x, mcode_version %d\n",
2470 h->mcode_date, h->mcode_version);
2471}
2472
2473
2474
2475
2476
2477
2478static void asc_prt_adv_dvc_var(ADV_DVC_VAR *h)
2479{
2480 printk(" ADV_DVC_VAR at addr 0x%lx\n", (ulong)h);
2481
2482 printk(" iop_base 0x%lx, err_code 0x%x, ultra_able 0x%x\n",
2483 (ulong)h->iop_base, h->err_code, (unsigned)h->ultra_able);
2484
2485 printk(" sdtr_able 0x%x, wdtr_able 0x%x\n",
2486 (unsigned)h->sdtr_able, (unsigned)h->wdtr_able);
2487
2488 printk(" start_motor 0x%x, scsi_reset_wait 0x%x\n",
2489 (unsigned)h->start_motor, (unsigned)h->scsi_reset_wait);
2490
2491 printk(" max_host_qng %u, max_dvc_qng %u, carr_freelist 0x%lxn\n",
2492 (unsigned)h->max_host_qng, (unsigned)h->max_dvc_qng,
2493 (ulong)h->carr_freelist);
2494
2495 printk(" icq_sp 0x%lx, irq_sp 0x%lx\n",
2496 (ulong)h->icq_sp, (ulong)h->irq_sp);
2497
2498 printk(" no_scam 0x%x, tagqng_able 0x%x\n",
2499 (unsigned)h->no_scam, (unsigned)h->tagqng_able);
2500
2501 printk(" chip_scsi_id 0x%x, cfg 0x%lx\n",
2502 (unsigned)h->chip_scsi_id, (ulong)h->cfg);
2503}
2504
2505
2506
2507
2508
2509
2510static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
2511{
2512 printk(" ADV_DVC_CFG at addr 0x%lx\n", (ulong)h);
2513
2514 printk(" disc_enable 0x%x, termination 0x%x\n",
2515 h->disc_enable, h->termination);
2516
2517 printk(" chip_version 0x%x, mcode_date 0x%x\n",
2518 h->chip_version, h->mcode_date);
2519
2520 printk(" mcode_version 0x%x, control_flag 0x%x\n",
2521 h->mcode_version, h->control_flag);
2522}
2523
2524
2525
2526
2527static void asc_prt_scsi_host(struct Scsi_Host *s)
2528{
2529 struct asc_board *boardp = shost_priv(s);
2530
2531 printk("Scsi_Host at addr 0x%p, device %s\n", s, dev_name(boardp->dev));
2532 printk(" host_busy %u, host_no %d, last_reset %d,\n",
2533 s->host_busy, s->host_no, (unsigned)s->last_reset);
2534
2535 printk(" base 0x%lx, io_port 0x%lx, irq %d,\n",
2536 (ulong)s->base, (ulong)s->io_port, boardp->irq);
2537
2538 printk(" dma_channel %d, this_id %d, can_queue %d,\n",
2539 s->dma_channel, s->this_id, s->can_queue);
2540
2541 printk(" cmd_per_lun %d, sg_tablesize %d, unchecked_isa_dma %d\n",
2542 s->cmd_per_lun, s->sg_tablesize, s->unchecked_isa_dma);
2543
2544 if (ASC_NARROW_BOARD(boardp)) {
2545 asc_prt_asc_dvc_var(&boardp->dvc_var.asc_dvc_var);
2546 asc_prt_asc_dvc_cfg(&boardp->dvc_cfg.asc_dvc_cfg);
2547 } else {
2548 asc_prt_adv_dvc_var(&boardp->dvc_var.adv_dvc_var);
2549 asc_prt_adv_dvc_cfg(&boardp->dvc_cfg.adv_dvc_cfg);
2550 }
2551}
2552
2553
2554
2555
2556
2557
2558
2559static void asc_prt_hex(char *f, uchar *s, int l)
2560{
2561 int i;
2562 int j;
2563 int k;
2564 int m;
2565
2566 printk("%s: (%d bytes)\n", f, l);
2567
2568 for (i = 0; i < l; i += 32) {
2569
2570
2571 if ((k = (l - i) / 4) >= 8) {
2572 k = 8;
2573 m = 0;
2574 } else {
2575 m = (l - i) % 4;
2576 }
2577
2578 for (j = 0; j < k; j++) {
2579 printk(" %2.2X%2.2X%2.2X%2.2X",
2580 (unsigned)s[i + (j * 4)],
2581 (unsigned)s[i + (j * 4) + 1],
2582 (unsigned)s[i + (j * 4) + 2],
2583 (unsigned)s[i + (j * 4) + 3]);
2584 }
2585
2586 switch (m) {
2587 case 0:
2588 default:
2589 break;
2590 case 1:
2591 printk(" %2.2X", (unsigned)s[i + (j * 4)]);
2592 break;
2593 case 2:
2594 printk(" %2.2X%2.2X",
2595 (unsigned)s[i + (j * 4)],
2596 (unsigned)s[i + (j * 4) + 1]);
2597 break;
2598 case 3:
2599 printk(" %2.2X%2.2X%2.2X",
2600 (unsigned)s[i + (j * 4) + 1],
2601 (unsigned)s[i + (j * 4) + 2],
2602 (unsigned)s[i + (j * 4) + 3]);
2603 break;
2604 }
2605
2606 printk("\n");
2607 }
2608}
2609
2610
2611
2612
2613static void asc_prt_asc_scsi_q(ASC_SCSI_Q *q)
2614{
2615 ASC_SG_HEAD *sgp;
2616 int i;
2617
2618 printk("ASC_SCSI_Q at addr 0x%lx\n", (ulong)q);
2619
2620 printk
2621 (" target_ix 0x%x, target_lun %u, srb_ptr 0x%lx, tag_code 0x%x,\n",
2622 q->q2.target_ix, q->q1.target_lun, (ulong)q->q2.srb_ptr,
2623 q->q2.tag_code);
2624
2625 printk
2626 (" data_addr 0x%lx, data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
2627 (ulong)le32_to_cpu(q->q1.data_addr),
2628 (ulong)le32_to_cpu(q->q1.data_cnt),
2629 (ulong)le32_to_cpu(q->q1.sense_addr), q->q1.sense_len);
2630
2631 printk(" cdbptr 0x%lx, cdb_len %u, sg_head 0x%lx, sg_queue_cnt %u\n",
2632 (ulong)q->cdbptr, q->q2.cdb_len,
2633 (ulong)q->sg_head, q->q1.sg_queue_cnt);
2634
2635 if (q->sg_head) {
2636 sgp = q->sg_head;
2637 printk("ASC_SG_HEAD at addr 0x%lx\n", (ulong)sgp);
2638 printk(" entry_cnt %u, queue_cnt %u\n", sgp->entry_cnt,
2639 sgp->queue_cnt);
2640 for (i = 0; i < sgp->entry_cnt; i++) {
2641 printk(" [%u]: addr 0x%lx, bytes %lu\n",
2642 i, (ulong)le32_to_cpu(sgp->sg_list[i].addr),
2643 (ulong)le32_to_cpu(sgp->sg_list[i].bytes));
2644 }
2645
2646 }
2647}
2648
2649
2650
2651
2652static void asc_prt_asc_qdone_info(ASC_QDONE_INFO *q)
2653{
2654 printk("ASC_QDONE_INFO at addr 0x%lx\n", (ulong)q);
2655 printk(" srb_ptr 0x%lx, target_ix %u, cdb_len %u, tag_code %u,\n",
2656 (ulong)q->d2.srb_ptr, q->d2.target_ix, q->d2.cdb_len,
2657 q->d2.tag_code);
2658 printk
2659 (" done_stat 0x%x, host_stat 0x%x, scsi_stat 0x%x, scsi_msg 0x%x\n",
2660 q->d3.done_stat, q->d3.host_stat, q->d3.scsi_stat, q->d3.scsi_msg);
2661}
2662
2663
2664
2665
2666
2667
2668static void asc_prt_adv_sgblock(int sgblockno, ADV_SG_BLOCK *b)
2669{
2670 int i;
2671
2672 printk(" ASC_SG_BLOCK at addr 0x%lx (sgblockno %d)\n",
2673 (ulong)b, sgblockno);
2674 printk(" sg_cnt %u, sg_ptr 0x%lx\n",
2675 b->sg_cnt, (ulong)le32_to_cpu(b->sg_ptr));
2676 BUG_ON(b->sg_cnt > NO_OF_SG_PER_BLOCK);
2677 if (b->sg_ptr != 0)
2678 BUG_ON(b->sg_cnt != NO_OF_SG_PER_BLOCK);
2679 for (i = 0; i < b->sg_cnt; i++) {
2680 printk(" [%u]: sg_addr 0x%lx, sg_count 0x%lx\n",
2681 i, (ulong)b->sg_list[i].sg_addr,
2682 (ulong)b->sg_list[i].sg_count);
2683 }
2684}
2685
2686
2687
2688
2689
2690
2691static void asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *q)
2692{
2693 int sg_blk_cnt;
2694 struct asc_sg_block *sg_ptr;
2695
2696 printk("ADV_SCSI_REQ_Q at addr 0x%lx\n", (ulong)q);
2697
2698 printk(" target_id %u, target_lun %u, srb_ptr 0x%lx, a_flag 0x%x\n",
2699 q->target_id, q->target_lun, (ulong)q->srb_ptr, q->a_flag);
2700
2701 printk(" cntl 0x%x, data_addr 0x%lx, vdata_addr 0x%lx\n",
2702 q->cntl, (ulong)le32_to_cpu(q->data_addr), (ulong)q->vdata_addr);
2703
2704 printk(" data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
2705 (ulong)le32_to_cpu(q->data_cnt),
2706 (ulong)le32_to_cpu(q->sense_addr), q->sense_len);
2707
2708 printk
2709 (" cdb_len %u, done_status 0x%x, host_status 0x%x, scsi_status 0x%x\n",
2710 q->cdb_len, q->done_status, q->host_status, q->scsi_status);
2711
2712 printk(" sg_working_ix 0x%x, target_cmd %u\n",
2713 q->sg_working_ix, q->target_cmd);
2714
2715 printk(" scsiq_rptr 0x%lx, sg_real_addr 0x%lx, sg_list_ptr 0x%lx\n",
2716 (ulong)le32_to_cpu(q->scsiq_rptr),
2717 (ulong)le32_to_cpu(q->sg_real_addr), (ulong)q->sg_list_ptr);
2718
2719
2720 if (q->sg_list_ptr != NULL) {
2721 sg_blk_cnt = 0;
2722 while (1) {
2723
2724
2725
2726
2727
2728
2729
2730 sg_ptr =
2731 &(((ADV_SG_BLOCK *)(q->sg_list_ptr))[sg_blk_cnt]);
2732 asc_prt_adv_sgblock(sg_blk_cnt, sg_ptr);
2733 if (sg_ptr->sg_ptr == 0) {
2734 break;
2735 }
2736 sg_blk_cnt++;
2737 }
2738 }
2739}
2740#endif
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752#define BAD_SRB 0
2753static u32 advansys_ptr_to_srb(struct asc_dvc_var *asc_dvc, void *ptr)
2754{
2755 int i;
2756 void **new_ptr;
2757
2758 for (i = 0; i < asc_dvc->ptr_map_count; i++) {
2759 if (!asc_dvc->ptr_map[i])
2760 goto out;
2761 }
2762
2763 if (asc_dvc->ptr_map_count == 0)
2764 asc_dvc->ptr_map_count = 1;
2765 else
2766 asc_dvc->ptr_map_count *= 2;
2767
2768 new_ptr = krealloc(asc_dvc->ptr_map,
2769 asc_dvc->ptr_map_count * sizeof(void *), GFP_ATOMIC);
2770 if (!new_ptr)
2771 return BAD_SRB;
2772 asc_dvc->ptr_map = new_ptr;
2773 out:
2774 ASC_DBG(3, "Putting ptr %p into array offset %d\n", ptr, i);
2775 asc_dvc->ptr_map[i] = ptr;
2776 return i + 1;
2777}
2778
2779static void * advansys_srb_to_ptr(struct asc_dvc_var *asc_dvc, u32 srb)
2780{
2781 void *ptr;
2782
2783 srb--;
2784 if (srb >= asc_dvc->ptr_map_count) {
2785 printk("advansys: bad SRB %u, max %u\n", srb,
2786 asc_dvc->ptr_map_count);
2787 return NULL;
2788 }
2789 ptr = asc_dvc->ptr_map[srb];
2790 asc_dvc->ptr_map[srb] = NULL;
2791 ASC_DBG(3, "Returning ptr %p from array offset %d\n", ptr, srb);
2792 return ptr;
2793}
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804static const char *advansys_info(struct Scsi_Host *shost)
2805{
2806 static char info[ASC_INFO_SIZE];
2807 struct asc_board *boardp = shost_priv(shost);
2808 ASC_DVC_VAR *asc_dvc_varp;
2809 ADV_DVC_VAR *adv_dvc_varp;
2810 char *busname;
2811 char *widename = NULL;
2812
2813 if (ASC_NARROW_BOARD(boardp)) {
2814 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
2815 ASC_DBG(1, "begin\n");
2816 if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
2817 if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) ==
2818 ASC_IS_ISAPNP) {
2819 busname = "ISA PnP";
2820 } else {
2821 busname = "ISA";
2822 }
2823 sprintf(info,
2824 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
2825 ASC_VERSION, busname,
2826 (ulong)shost->io_port,
2827 (ulong)shost->io_port + ASC_IOADR_GAP - 1,
2828 boardp->irq, shost->dma_channel);
2829 } else {
2830 if (asc_dvc_varp->bus_type & ASC_IS_VL) {
2831 busname = "VL";
2832 } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) {
2833 busname = "EISA";
2834 } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) {
2835 if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA)
2836 == ASC_IS_PCI_ULTRA) {
2837 busname = "PCI Ultra";
2838 } else {
2839 busname = "PCI";
2840 }
2841 } else {
2842 busname = "?";
2843 shost_printk(KERN_ERR, shost, "unknown bus "
2844 "type %d\n", asc_dvc_varp->bus_type);
2845 }
2846 sprintf(info,
2847 "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
2848 ASC_VERSION, busname, (ulong)shost->io_port,
2849 (ulong)shost->io_port + ASC_IOADR_GAP - 1,
2850 boardp->irq);
2851 }
2852 } else {
2853
2854
2855
2856
2857
2858
2859
2860 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
2861 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
2862 widename = "Ultra-Wide";
2863 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
2864 widename = "Ultra2-Wide";
2865 } else {
2866 widename = "Ultra3-Wide";
2867 }
2868 sprintf(info,
2869 "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
2870 ASC_VERSION, widename, (ulong)adv_dvc_varp->iop_base,
2871 (ulong)adv_dvc_varp->iop_base + boardp->asc_n_io_port - 1, boardp->irq);
2872 }
2873 BUG_ON(strlen(info) >= ASC_INFO_SIZE);
2874 ASC_DBG(1, "end\n");
2875 return info;
2876}
2877
2878#ifdef CONFIG_PROC_FS
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890static int asc_prt_line(char *buf, int buflen, char *fmt, ...)
2891{
2892 va_list args;
2893 int ret;
2894 char s[ASC_PRTLINE_SIZE];
2895
2896 va_start(args, fmt);
2897 ret = vsprintf(s, fmt, args);
2898 BUG_ON(ret >= ASC_PRTLINE_SIZE);
2899 if (buf == NULL) {
2900 (void)printk(s);
2901 ret = 0;
2902 } else {
2903 ret = min(buflen, ret);
2904 memcpy(buf, s, ret);
2905 }
2906 va_end(args);
2907 return ret;
2908}
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
2922{
2923 struct asc_board *boardp = shost_priv(shost);
2924 int leftlen;
2925 int totlen;
2926 int len;
2927 int chip_scsi_id;
2928 int i;
2929
2930 leftlen = cplen;
2931 totlen = len = 0;
2932
2933 len = asc_prt_line(cp, leftlen,
2934 "\nDevice Information for AdvanSys SCSI Host %d:\n",
2935 shost->host_no);
2936 ASC_PRT_NEXT();
2937
2938 if (ASC_NARROW_BOARD(boardp)) {
2939 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
2940 } else {
2941 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
2942 }
2943
2944 len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
2945 ASC_PRT_NEXT();
2946 for (i = 0; i <= ADV_MAX_TID; i++) {
2947 if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
2948 len = asc_prt_line(cp, leftlen, " %X,", i);
2949 ASC_PRT_NEXT();
2950 }
2951 }
2952 len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id);
2953 ASC_PRT_NEXT();
2954
2955 return totlen;
2956}
2957
2958
2959
2960
2961static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
2962{
2963 struct asc_board *boardp = shost_priv(shost);
2964 int leftlen;
2965 int totlen;
2966 int len;
2967 ushort major, minor, letter;
2968
2969 leftlen = cplen;
2970 totlen = len = 0;
2971
2972 len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
2973 ASC_PRT_NEXT();
2974
2975
2976
2977
2978
2979 if (boardp->bios_signature != 0x55AA) {
2980 len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n");
2981 ASC_PRT_NEXT();
2982 len = asc_prt_line(cp, leftlen,
2983 "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
2984 ASC_PRT_NEXT();
2985 len = asc_prt_line(cp, leftlen,
2986 "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
2987 ASC_PRT_NEXT();
2988 } else {
2989 major = (boardp->bios_version >> 12) & 0xF;
2990 minor = (boardp->bios_version >> 8) & 0xF;
2991 letter = (boardp->bios_version & 0xFF);
2992
2993 len = asc_prt_line(cp, leftlen, "%d.%d%c\n",
2994 major, minor,
2995 letter >= 26 ? '?' : letter + 'A');
2996 ASC_PRT_NEXT();
2997
2998
2999
3000
3001
3002
3003 if (major < 3 || (major <= 3 && minor < 1) ||
3004 (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) {
3005 len = asc_prt_line(cp, leftlen,
3006 "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
3007 ASC_PRT_NEXT();
3008 len = asc_prt_line(cp, leftlen,
3009 "ftp://ftp.connectcom.net/pub\n");
3010 ASC_PRT_NEXT();
3011 }
3012 }
3013
3014 return totlen;
3015}
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040static int asc_get_eeprom_string(ushort *serialnum, uchar *cp)
3041{
3042 ushort w, num;
3043
3044 if ((serialnum[1] & 0xFE00) != ((ushort)0xAA << 8)) {
3045 return ASC_FALSE;
3046 } else {
3047
3048
3049
3050 w = serialnum[0];
3051
3052
3053 if ((*cp = 'A' + ((w & 0xE000) >> 13)) == 'H') {
3054
3055 *cp += 0x8;
3056 }
3057 cp++;
3058
3059
3060 *cp++ = 'A' + ((w & 0x1C00) >> 10);
3061
3062
3063 num = w & 0x3FF;
3064 *cp++ = '0' + (num / 100);
3065 num %= 100;
3066 *cp++ = '0' + (num / 10);
3067
3068
3069 *cp++ = 'A' + (num % 10);
3070
3071
3072
3073
3074 w = serialnum[1];
3075
3076
3077
3078
3079
3080
3081
3082 if (serialnum[2] & 0x8000) {
3083 *cp++ = '8' + ((w & 0x1C0) >> 6);
3084 } else {
3085 *cp++ = '0' + ((w & 0x1C0) >> 6);
3086 }
3087
3088
3089 num = w & 0x003F;
3090 *cp++ = '0' + num / 10;
3091 num %= 10;
3092 *cp++ = '0' + num;
3093
3094
3095
3096
3097 w = serialnum[2] & 0x7FFF;
3098
3099
3100 *cp++ = 'A' + (w / 1000);
3101
3102
3103 num = w % 1000;
3104 *cp++ = '0' + num / 100;
3105 num %= 100;
3106 *cp++ = '0' + num / 10;
3107 num %= 10;
3108 *cp++ = '0' + num;
3109
3110 *cp = '\0';
3111 return ASC_TRUE;
3112 }
3113}
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
3127{
3128 struct asc_board *boardp = shost_priv(shost);
3129 ASC_DVC_VAR *asc_dvc_varp;
3130 int leftlen;
3131 int totlen;
3132 int len;
3133 ASCEEP_CONFIG *ep;
3134 int i;
3135#ifdef CONFIG_ISA
3136 int isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 };
3137#endif
3138 uchar serialstr[13];
3139
3140 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
3141 ep = &boardp->eep_config.asc_eep;
3142
3143 leftlen = cplen;
3144 totlen = len = 0;
3145
3146 len = asc_prt_line(cp, leftlen,
3147 "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3148 shost->host_no);
3149 ASC_PRT_NEXT();
3150
3151 if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr)
3152 == ASC_TRUE) {
3153 len =
3154 asc_prt_line(cp, leftlen, " Serial Number: %s\n",
3155 serialstr);
3156 ASC_PRT_NEXT();
3157 } else {
3158 if (ep->adapter_info[5] == 0xBB) {
3159 len = asc_prt_line(cp, leftlen,
3160 " Default Settings Used for EEPROM-less Adapter.\n");
3161 ASC_PRT_NEXT();
3162 } else {
3163 len = asc_prt_line(cp, leftlen,
3164 " Serial Number Signature Not Present.\n");
3165 ASC_PRT_NEXT();
3166 }
3167 }
3168
3169 len = asc_prt_line(cp, leftlen,
3170 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3171 ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
3172 ep->max_tag_qng);
3173 ASC_PRT_NEXT();
3174
3175 len = asc_prt_line(cp, leftlen,
3176 " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
3177 ASC_PRT_NEXT();
3178
3179 len = asc_prt_line(cp, leftlen, " Target ID: ");
3180 ASC_PRT_NEXT();
3181 for (i = 0; i <= ASC_MAX_TID; i++) {
3182 len = asc_prt_line(cp, leftlen, " %d", i);
3183 ASC_PRT_NEXT();
3184 }
3185 len = asc_prt_line(cp, leftlen, "\n");
3186 ASC_PRT_NEXT();
3187
3188 len = asc_prt_line(cp, leftlen, " Disconnects: ");
3189 ASC_PRT_NEXT();
3190 for (i = 0; i <= ASC_MAX_TID; i++) {
3191 len = asc_prt_line(cp, leftlen, " %c",
3192 (ep->
3193 disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3194 'N');
3195 ASC_PRT_NEXT();
3196 }
3197 len = asc_prt_line(cp, leftlen, "\n");
3198 ASC_PRT_NEXT();
3199
3200 len = asc_prt_line(cp, leftlen, " Command Queuing: ");
3201 ASC_PRT_NEXT();
3202 for (i = 0; i <= ASC_MAX_TID; i++) {
3203 len = asc_prt_line(cp, leftlen, " %c",
3204 (ep->
3205 use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3206 'N');
3207 ASC_PRT_NEXT();
3208 }
3209 len = asc_prt_line(cp, leftlen, "\n");
3210 ASC_PRT_NEXT();
3211
3212 len = asc_prt_line(cp, leftlen, " Start Motor: ");
3213 ASC_PRT_NEXT();
3214 for (i = 0; i <= ASC_MAX_TID; i++) {
3215 len = asc_prt_line(cp, leftlen, " %c",
3216 (ep->
3217 start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3218 'N');
3219 ASC_PRT_NEXT();
3220 }
3221 len = asc_prt_line(cp, leftlen, "\n");
3222 ASC_PRT_NEXT();
3223
3224 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3225 ASC_PRT_NEXT();
3226 for (i = 0; i <= ASC_MAX_TID; i++) {
3227 len = asc_prt_line(cp, leftlen, " %c",
3228 (ep->
3229 init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3230 'N');
3231 ASC_PRT_NEXT();
3232 }
3233 len = asc_prt_line(cp, leftlen, "\n");
3234 ASC_PRT_NEXT();
3235
3236#ifdef CONFIG_ISA
3237 if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
3238 len = asc_prt_line(cp, leftlen,
3239 " Host ISA DMA speed: %d MB/S\n",
3240 isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
3241 ASC_PRT_NEXT();
3242 }
3243#endif
3244
3245 return totlen;
3246}
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
3260{
3261 struct asc_board *boardp = shost_priv(shost);
3262 ADV_DVC_VAR *adv_dvc_varp;
3263 int leftlen;
3264 int totlen;
3265 int len;
3266 int i;
3267 char *termstr;
3268 uchar serialstr[13];
3269 ADVEEP_3550_CONFIG *ep_3550 = NULL;
3270 ADVEEP_38C0800_CONFIG *ep_38C0800 = NULL;
3271 ADVEEP_38C1600_CONFIG *ep_38C1600 = NULL;
3272 ushort word;
3273 ushort *wordp;
3274 ushort sdtr_speed = 0;
3275
3276 adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
3277 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3278 ep_3550 = &boardp->eep_config.adv_3550_eep;
3279 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3280 ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
3281 } else {
3282 ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
3283 }
3284
3285 leftlen = cplen;
3286 totlen = len = 0;
3287
3288 len = asc_prt_line(cp, leftlen,
3289 "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3290 shost->host_no);
3291 ASC_PRT_NEXT();
3292
3293 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3294 wordp = &ep_3550->serial_number_word1;
3295 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3296 wordp = &ep_38C0800->serial_number_word1;
3297 } else {
3298 wordp = &ep_38C1600->serial_number_word1;
3299 }
3300
3301 if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
3302 len =
3303 asc_prt_line(cp, leftlen, " Serial Number: %s\n",
3304 serialstr);
3305 ASC_PRT_NEXT();
3306 } else {
3307 len = asc_prt_line(cp, leftlen,
3308 " Serial Number Signature Not Present.\n");
3309 ASC_PRT_NEXT();
3310 }
3311
3312 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3313 len = asc_prt_line(cp, leftlen,
3314 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3315 ep_3550->adapter_scsi_id,
3316 ep_3550->max_host_qng, ep_3550->max_dvc_qng);
3317 ASC_PRT_NEXT();
3318 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3319 len = asc_prt_line(cp, leftlen,
3320 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3321 ep_38C0800->adapter_scsi_id,
3322 ep_38C0800->max_host_qng,
3323 ep_38C0800->max_dvc_qng);
3324 ASC_PRT_NEXT();
3325 } else {
3326 len = asc_prt_line(cp, leftlen,
3327 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3328 ep_38C1600->adapter_scsi_id,
3329 ep_38C1600->max_host_qng,
3330 ep_38C1600->max_dvc_qng);
3331 ASC_PRT_NEXT();
3332 }
3333 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3334 word = ep_3550->termination;
3335 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3336 word = ep_38C0800->termination_lvd;
3337 } else {
3338 word = ep_38C1600->termination_lvd;
3339 }
3340 switch (word) {
3341 case 1:
3342 termstr = "Low Off/High Off";
3343 break;
3344 case 2:
3345 termstr = "Low Off/High On";
3346 break;
3347 case 3:
3348 termstr = "Low On/High On";
3349 break;
3350 default:
3351 case 0:
3352 termstr = "Automatic";
3353 break;
3354 }
3355
3356 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3357 len = asc_prt_line(cp, leftlen,
3358 " termination: %u (%s), bios_ctrl: 0x%x\n",
3359 ep_3550->termination, termstr,
3360 ep_3550->bios_ctrl);
3361 ASC_PRT_NEXT();
3362 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3363 len = asc_prt_line(cp, leftlen,
3364 " termination: %u (%s), bios_ctrl: 0x%x\n",
3365 ep_38C0800->termination_lvd, termstr,
3366 ep_38C0800->bios_ctrl);
3367 ASC_PRT_NEXT();
3368 } else {
3369 len = asc_prt_line(cp, leftlen,
3370 " termination: %u (%s), bios_ctrl: 0x%x\n",
3371 ep_38C1600->termination_lvd, termstr,
3372 ep_38C1600->bios_ctrl);
3373 ASC_PRT_NEXT();
3374 }
3375
3376 len = asc_prt_line(cp, leftlen, " Target ID: ");
3377 ASC_PRT_NEXT();
3378 for (i = 0; i <= ADV_MAX_TID; i++) {
3379 len = asc_prt_line(cp, leftlen, " %X", i);
3380 ASC_PRT_NEXT();
3381 }
3382 len = asc_prt_line(cp, leftlen, "\n");
3383 ASC_PRT_NEXT();
3384
3385 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3386 word = ep_3550->disc_enable;
3387 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3388 word = ep_38C0800->disc_enable;
3389 } else {
3390 word = ep_38C1600->disc_enable;
3391 }
3392 len = asc_prt_line(cp, leftlen, " Disconnects: ");
3393 ASC_PRT_NEXT();
3394 for (i = 0; i <= ADV_MAX_TID; i++) {
3395 len = asc_prt_line(cp, leftlen, " %c",
3396 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3397 ASC_PRT_NEXT();
3398 }
3399 len = asc_prt_line(cp, leftlen, "\n");
3400 ASC_PRT_NEXT();
3401
3402 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3403 word = ep_3550->tagqng_able;
3404 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3405 word = ep_38C0800->tagqng_able;
3406 } else {
3407 word = ep_38C1600->tagqng_able;
3408 }
3409 len = asc_prt_line(cp, leftlen, " Command Queuing: ");
3410 ASC_PRT_NEXT();
3411 for (i = 0; i <= ADV_MAX_TID; i++) {
3412 len = asc_prt_line(cp, leftlen, " %c",
3413 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3414 ASC_PRT_NEXT();
3415 }
3416 len = asc_prt_line(cp, leftlen, "\n");
3417 ASC_PRT_NEXT();
3418
3419 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3420 word = ep_3550->start_motor;
3421 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3422 word = ep_38C0800->start_motor;
3423 } else {
3424 word = ep_38C1600->start_motor;
3425 }
3426 len = asc_prt_line(cp, leftlen, " Start Motor: ");
3427 ASC_PRT_NEXT();
3428 for (i = 0; i <= ADV_MAX_TID; i++) {
3429 len = asc_prt_line(cp, leftlen, " %c",
3430 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3431 ASC_PRT_NEXT();
3432 }
3433 len = asc_prt_line(cp, leftlen, "\n");
3434 ASC_PRT_NEXT();
3435
3436 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3437 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3438 ASC_PRT_NEXT();
3439 for (i = 0; i <= ADV_MAX_TID; i++) {
3440 len = asc_prt_line(cp, leftlen, " %c",
3441 (ep_3550->
3442 sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
3443 'Y' : 'N');
3444 ASC_PRT_NEXT();
3445 }
3446 len = asc_prt_line(cp, leftlen, "\n");
3447 ASC_PRT_NEXT();
3448 }
3449
3450 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3451 len = asc_prt_line(cp, leftlen, " Ultra Transfer: ");
3452 ASC_PRT_NEXT();
3453 for (i = 0; i <= ADV_MAX_TID; i++) {
3454 len = asc_prt_line(cp, leftlen, " %c",
3455 (ep_3550->
3456 ultra_able & ADV_TID_TO_TIDMASK(i))
3457 ? 'Y' : 'N');
3458 ASC_PRT_NEXT();
3459 }
3460 len = asc_prt_line(cp, leftlen, "\n");
3461 ASC_PRT_NEXT();
3462 }
3463
3464 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3465 word = ep_3550->wdtr_able;
3466 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
3467 word = ep_38C0800->wdtr_able;
3468 } else {
3469 word = ep_38C1600->wdtr_able;
3470 }
3471 len = asc_prt_line(cp, leftlen, " Wide Transfer: ");
3472 ASC_PRT_NEXT();
3473 for (i = 0; i <= ADV_MAX_TID; i++) {
3474 len = asc_prt_line(cp, leftlen, " %c",
3475 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3476 ASC_PRT_NEXT();
3477 }
3478 len = asc_prt_line(cp, leftlen, "\n");
3479 ASC_PRT_NEXT();
3480
3481 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
3482 adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) {
3483 len = asc_prt_line(cp, leftlen,
3484 " Synchronous Transfer Speed (Mhz):\n ");
3485 ASC_PRT_NEXT();
3486 for (i = 0; i <= ADV_MAX_TID; i++) {
3487 char *speed_str;
3488
3489 if (i == 0) {
3490 sdtr_speed = adv_dvc_varp->sdtr_speed1;
3491 } else if (i == 4) {
3492 sdtr_speed = adv_dvc_varp->sdtr_speed2;
3493 } else if (i == 8) {
3494 sdtr_speed = adv_dvc_varp->sdtr_speed3;
3495 } else if (i == 12) {
3496 sdtr_speed = adv_dvc_varp->sdtr_speed4;
3497 }
3498 switch (sdtr_speed & ADV_MAX_TID) {
3499 case 0:
3500 speed_str = "Off";
3501 break;
3502 case 1:
3503 speed_str = " 5";
3504 break;
3505 case 2:
3506 speed_str = " 10";
3507 break;
3508 case 3:
3509 speed_str = " 20";
3510 break;
3511 case 4:
3512 speed_str = " 40";
3513 break;
3514 case 5:
3515 speed_str = " 80";
3516 break;
3517 default:
3518 speed_str = "Unk";
3519 break;
3520 }
3521 len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
3522 ASC_PRT_NEXT();
3523 if (i == 7) {
3524 len = asc_prt_line(cp, leftlen, "\n ");
3525 ASC_PRT_NEXT();
3526 }
3527 sdtr_speed >>= 4;
3528 }
3529 len = asc_prt_line(cp, leftlen, "\n");
3530 ASC_PRT_NEXT();
3531 }
3532
3533 return totlen;
3534}
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen)
3546{
3547 struct asc_board *boardp = shost_priv(shost);
3548 int leftlen;
3549 int totlen;
3550 int len;
3551 int chip_scsi_id;
3552
3553 leftlen = cplen;
3554 totlen = len = 0;
3555
3556 len = asc_prt_line(cp, leftlen,
3557 "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
3558 shost->host_no);
3559 ASC_PRT_NEXT();
3560
3561 len = asc_prt_line(cp, leftlen,
3562 " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
3563 shost->host_busy, shost->last_reset, shost->max_id,
3564 shost->max_lun, shost->max_channel);
3565 ASC_PRT_NEXT();
3566
3567 len = asc_prt_line(cp, leftlen,
3568 " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
3569 shost->unique_id, shost->can_queue, shost->this_id,
3570 shost->sg_tablesize, shost->cmd_per_lun);
3571 ASC_PRT_NEXT();
3572
3573 len = asc_prt_line(cp, leftlen,
3574 " unchecked_isa_dma %d, use_clustering %d\n",
3575 shost->unchecked_isa_dma, shost->use_clustering);
3576 ASC_PRT_NEXT();
3577
3578 len = asc_prt_line(cp, leftlen,
3579 " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
3580 boardp->flags, boardp->last_reset, jiffies,
3581 boardp->asc_n_io_port);
3582 ASC_PRT_NEXT();
3583
3584 len = asc_prt_line(cp, leftlen, " io_port 0x%x\n", shost->io_port);
3585 ASC_PRT_NEXT();
3586
3587 if (ASC_NARROW_BOARD(boardp)) {
3588 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
3589 } else {
3590 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
3591 }
3592
3593 return totlen;
3594}
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3608{
3609 struct asc_board *boardp = shost_priv(shost);
3610 int chip_scsi_id;
3611 int leftlen;
3612 int totlen;
3613 int len;
3614 ASC_DVC_VAR *v;
3615 ASC_DVC_CFG *c;
3616 int i;
3617 int renegotiate = 0;
3618
3619 v = &boardp->dvc_var.asc_dvc_var;
3620 c = &boardp->dvc_cfg.asc_dvc_cfg;
3621 chip_scsi_id = c->chip_scsi_id;
3622
3623 leftlen = cplen;
3624 totlen = len = 0;
3625
3626 len = asc_prt_line(cp, leftlen,
3627 "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3628 shost->host_no);
3629 ASC_PRT_NEXT();
3630
3631 len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
3632 "mcode_version 0x%x, err_code %u\n",
3633 c->chip_version, c->mcode_date, c->mcode_version,
3634 v->err_code);
3635 ASC_PRT_NEXT();
3636
3637
3638 len = asc_prt_line(cp, leftlen,
3639 " Total Command Pending: %d\n", v->cur_total_qng);
3640 ASC_PRT_NEXT();
3641
3642 len = asc_prt_line(cp, leftlen, " Command Queuing:");
3643 ASC_PRT_NEXT();
3644 for (i = 0; i <= ASC_MAX_TID; i++) {
3645 if ((chip_scsi_id == i) ||
3646 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3647 continue;
3648 }
3649 len = asc_prt_line(cp, leftlen, " %X:%c",
3650 i,
3651 (v->
3652 use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ?
3653 'Y' : 'N');
3654 ASC_PRT_NEXT();
3655 }
3656 len = asc_prt_line(cp, leftlen, "\n");
3657 ASC_PRT_NEXT();
3658
3659
3660 len = asc_prt_line(cp, leftlen, " Command Queue Pending:");
3661 ASC_PRT_NEXT();
3662 for (i = 0; i <= ASC_MAX_TID; i++) {
3663 if ((chip_scsi_id == i) ||
3664 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3665 continue;
3666 }
3667 len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
3668 ASC_PRT_NEXT();
3669 }
3670 len = asc_prt_line(cp, leftlen, "\n");
3671 ASC_PRT_NEXT();
3672
3673
3674 len = asc_prt_line(cp, leftlen, " Command Queue Limit:");
3675 ASC_PRT_NEXT();
3676 for (i = 0; i <= ASC_MAX_TID; i++) {
3677 if ((chip_scsi_id == i) ||
3678 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3679 continue;
3680 }
3681 len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
3682 ASC_PRT_NEXT();
3683 }
3684 len = asc_prt_line(cp, leftlen, "\n");
3685 ASC_PRT_NEXT();
3686
3687
3688 len = asc_prt_line(cp, leftlen, " Command Queue Full:");
3689 ASC_PRT_NEXT();
3690 for (i = 0; i <= ASC_MAX_TID; i++) {
3691 if ((chip_scsi_id == i) ||
3692 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3693 continue;
3694 }
3695 if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
3696 len = asc_prt_line(cp, leftlen, " %X:Y-%d",
3697 i, boardp->queue_full_cnt[i]);
3698 } else {
3699 len = asc_prt_line(cp, leftlen, " %X:N", i);
3700 }
3701 ASC_PRT_NEXT();
3702 }
3703 len = asc_prt_line(cp, leftlen, "\n");
3704 ASC_PRT_NEXT();
3705
3706 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3707 ASC_PRT_NEXT();
3708 for (i = 0; i <= ASC_MAX_TID; i++) {
3709 if ((chip_scsi_id == i) ||
3710 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3711 continue;
3712 }
3713 len = asc_prt_line(cp, leftlen, " %X:%c",
3714 i,
3715 (v->
3716 sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3717 'N');
3718 ASC_PRT_NEXT();
3719 }
3720 len = asc_prt_line(cp, leftlen, "\n");
3721 ASC_PRT_NEXT();
3722
3723 for (i = 0; i <= ASC_MAX_TID; i++) {
3724 uchar syn_period_ix;
3725
3726 if ((chip_scsi_id == i) ||
3727 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
3728 ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) {
3729 continue;
3730 }
3731
3732 len = asc_prt_line(cp, leftlen, " %X:", i);
3733 ASC_PRT_NEXT();
3734
3735 if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) {
3736 len = asc_prt_line(cp, leftlen, " Asynchronous");
3737 ASC_PRT_NEXT();
3738 } else {
3739 syn_period_ix =
3740 (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index -
3741 1);
3742
3743 len = asc_prt_line(cp, leftlen,
3744 " Transfer Period Factor: %d (%d.%d Mhz),",
3745 v->sdtr_period_tbl[syn_period_ix],
3746 250 /
3747 v->sdtr_period_tbl[syn_period_ix],
3748 ASC_TENTHS(250,
3749 v->
3750 sdtr_period_tbl
3751 [syn_period_ix]));
3752 ASC_PRT_NEXT();
3753
3754 len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
3755 boardp->
3756 sdtr_data[i] & ASC_SYN_MAX_OFFSET);
3757 ASC_PRT_NEXT();
3758 }
3759
3760 if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
3761 len = asc_prt_line(cp, leftlen, "*\n");
3762 renegotiate = 1;
3763 } else {
3764 len = asc_prt_line(cp, leftlen, "\n");
3765 }
3766 ASC_PRT_NEXT();
3767 }
3768
3769 if (renegotiate) {
3770 len = asc_prt_line(cp, leftlen,
3771 " * = Re-negotiation pending before next command.\n");
3772 ASC_PRT_NEXT();
3773 }
3774
3775 return totlen;
3776}
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3790{
3791 struct asc_board *boardp = shost_priv(shost);
3792 int leftlen;
3793 int totlen;
3794 int len;
3795 int i;
3796 ADV_DVC_VAR *v;
3797 ADV_DVC_CFG *c;
3798 AdvPortAddr iop_base;
3799 ushort chip_scsi_id;
3800 ushort lramword;
3801 uchar lrambyte;
3802 ushort tagqng_able;
3803 ushort sdtr_able, wdtr_able;
3804 ushort wdtr_done, sdtr_done;
3805 ushort period = 0;
3806 int renegotiate = 0;
3807
3808 v = &boardp->dvc_var.adv_dvc_var;
3809 c = &boardp->dvc_cfg.adv_dvc_cfg;
3810 iop_base = v->iop_base;
3811 chip_scsi_id = v->chip_scsi_id;
3812
3813 leftlen = cplen;
3814 totlen = len = 0;
3815
3816 len = asc_prt_line(cp, leftlen,
3817 "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3818 shost->host_no);
3819 ASC_PRT_NEXT();
3820
3821 len = asc_prt_line(cp, leftlen,
3822 " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
3823 v->iop_base,
3824 AdvReadWordRegister(iop_base,
3825 IOPW_SCSI_CFG1) & CABLE_DETECT,
3826 v->err_code);
3827 ASC_PRT_NEXT();
3828
3829 len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
3830 "mcode_version 0x%x\n", c->chip_version,
3831 c->mcode_date, c->mcode_version);
3832 ASC_PRT_NEXT();
3833
3834 AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
3835 len = asc_prt_line(cp, leftlen, " Queuing Enabled:");
3836 ASC_PRT_NEXT();
3837 for (i = 0; i <= ADV_MAX_TID; i++) {
3838 if ((chip_scsi_id == i) ||
3839 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3840 continue;
3841 }
3842
3843 len = asc_prt_line(cp, leftlen, " %X:%c",
3844 i,
3845 (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3846 'N');
3847 ASC_PRT_NEXT();
3848 }
3849 len = asc_prt_line(cp, leftlen, "\n");
3850 ASC_PRT_NEXT();
3851
3852 len = asc_prt_line(cp, leftlen, " Queue Limit:");
3853 ASC_PRT_NEXT();
3854 for (i = 0; i <= ADV_MAX_TID; i++) {
3855 if ((chip_scsi_id == i) ||
3856 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3857 continue;
3858 }
3859
3860 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i,
3861 lrambyte);
3862
3863 len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
3864 ASC_PRT_NEXT();
3865 }
3866 len = asc_prt_line(cp, leftlen, "\n");
3867 ASC_PRT_NEXT();
3868
3869 len = asc_prt_line(cp, leftlen, " Command Pending:");
3870 ASC_PRT_NEXT();
3871 for (i = 0; i <= ADV_MAX_TID; i++) {
3872 if ((chip_scsi_id == i) ||
3873 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3874 continue;
3875 }
3876
3877 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i,
3878 lrambyte);
3879
3880 len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
3881 ASC_PRT_NEXT();
3882 }
3883 len = asc_prt_line(cp, leftlen, "\n");
3884 ASC_PRT_NEXT();
3885
3886 AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
3887 len = asc_prt_line(cp, leftlen, " Wide Enabled:");
3888 ASC_PRT_NEXT();
3889 for (i = 0; i <= ADV_MAX_TID; i++) {
3890 if ((chip_scsi_id == i) ||
3891 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3892 continue;
3893 }
3894
3895 len = asc_prt_line(cp, leftlen, " %X:%c",
3896 i,
3897 (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3898 'N');
3899 ASC_PRT_NEXT();
3900 }
3901 len = asc_prt_line(cp, leftlen, "\n");
3902 ASC_PRT_NEXT();
3903
3904 AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
3905 len = asc_prt_line(cp, leftlen, " Transfer Bit Width:");
3906 ASC_PRT_NEXT();
3907 for (i = 0; i <= ADV_MAX_TID; i++) {
3908 if ((chip_scsi_id == i) ||
3909 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3910 continue;
3911 }
3912
3913 AdvReadWordLram(iop_base,
3914 ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
3915 lramword);
3916
3917 len = asc_prt_line(cp, leftlen, " %X:%d",
3918 i, (lramword & 0x8000) ? 16 : 8);
3919 ASC_PRT_NEXT();
3920
3921 if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
3922 (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
3923 len = asc_prt_line(cp, leftlen, "*");
3924 ASC_PRT_NEXT();
3925 renegotiate = 1;
3926 }
3927 }
3928 len = asc_prt_line(cp, leftlen, "\n");
3929 ASC_PRT_NEXT();
3930
3931 AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
3932 len = asc_prt_line(cp, leftlen, " Synchronous Enabled:");
3933 ASC_PRT_NEXT();
3934 for (i = 0; i <= ADV_MAX_TID; i++) {
3935 if ((chip_scsi_id == i) ||
3936 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3937 continue;
3938 }
3939
3940 len = asc_prt_line(cp, leftlen, " %X:%c",
3941 i,
3942 (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3943 'N');
3944 ASC_PRT_NEXT();
3945 }
3946 len = asc_prt_line(cp, leftlen, "\n");
3947 ASC_PRT_NEXT();
3948
3949 AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
3950 for (i = 0; i <= ADV_MAX_TID; i++) {
3951
3952 AdvReadWordLram(iop_base,
3953 ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
3954 lramword);
3955 lramword &= ~0x8000;
3956
3957 if ((chip_scsi_id == i) ||
3958 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
3959 ((sdtr_able & ADV_TID_TO_TIDMASK(i)) == 0)) {
3960 continue;
3961 }
3962
3963 len = asc_prt_line(cp, leftlen, " %X:", i);
3964 ASC_PRT_NEXT();
3965
3966 if ((lramword & 0x1F) == 0) {
3967 len = asc_prt_line(cp, leftlen, " Asynchronous");
3968 ASC_PRT_NEXT();
3969 } else {
3970 len =
3971 asc_prt_line(cp, leftlen,
3972 " Transfer Period Factor: ");
3973 ASC_PRT_NEXT();
3974
3975 if ((lramword & 0x1F00) == 0x1100) {
3976 len =
3977 asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
3978 ASC_PRT_NEXT();
3979 } else if ((lramword & 0x1F00) == 0x1000) {
3980 len =
3981 asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
3982 ASC_PRT_NEXT();
3983 } else {
3984
3985 period = (((lramword >> 8) * 25) + 50) / 4;
3986
3987 if (period == 0) {
3988 len =
3989 asc_prt_line(cp, leftlen,
3990 "%d (? Mhz), ");
3991 ASC_PRT_NEXT();
3992 } else {
3993 len = asc_prt_line(cp, leftlen,
3994 "%d (%d.%d Mhz),",
3995 period, 250 / period,
3996 ASC_TENTHS(250,
3997 period));
3998 ASC_PRT_NEXT();
3999 }
4000 }
4001
4002 len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
4003 lramword & 0x1F);
4004 ASC_PRT_NEXT();
4005 }
4006
4007 if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
4008 len = asc_prt_line(cp, leftlen, "*\n");
4009 renegotiate = 1;
4010 } else {
4011 len = asc_prt_line(cp, leftlen, "\n");
4012 }
4013 ASC_PRT_NEXT();
4014 }
4015
4016 if (renegotiate) {
4017 len = asc_prt_line(cp, leftlen,
4018 " * = Re-negotiation pending before next command.\n");
4019 ASC_PRT_NEXT();
4020 }
4021
4022 return totlen;
4023}
4024
4025
4026
4027
4028
4029
4030
4031static int
4032asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
4033 char *cp, int cplen)
4034{
4035 int cnt = 0;
4036
4037 ASC_DBG(2, "offset %d, advoffset %d, cplen %d\n",
4038 (unsigned)offset, (unsigned)advoffset, cplen);
4039 if (offset <= advoffset) {
4040
4041 cnt = min(cplen, leftlen);
4042 ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
4043 (ulong)curbuf, (ulong)cp, cnt);
4044 memcpy(curbuf, cp, cnt);
4045 } else if (offset < advoffset + cplen) {
4046
4047 cnt = (advoffset + cplen) - offset;
4048 cp = (cp + cplen) - cnt;
4049 cnt = min(cnt, leftlen);
4050 ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
4051 (ulong)curbuf, (ulong)cp, cnt);
4052 memcpy(curbuf, cp, cnt);
4053 }
4054 return cnt;
4055}
4056
4057#ifdef ADVANSYS_STATS
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067static int asc_prt_board_stats(struct Scsi_Host *shost, char *cp, int cplen)
4068{
4069 struct asc_board *boardp = shost_priv(shost);
4070 struct asc_stats *s = &boardp->asc_stats;
4071
4072 int leftlen = cplen;
4073 int len, totlen = 0;
4074
4075 len = asc_prt_line(cp, leftlen,
4076 "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
4077 shost->host_no);
4078 ASC_PRT_NEXT();
4079
4080 len = asc_prt_line(cp, leftlen,
4081 " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
4082 s->queuecommand, s->reset, s->biosparam,
4083 s->interrupt);
4084 ASC_PRT_NEXT();
4085
4086 len = asc_prt_line(cp, leftlen,
4087 " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
4088 s->callback, s->done, s->build_error,
4089 s->adv_build_noreq, s->adv_build_nosg);
4090 ASC_PRT_NEXT();
4091
4092 len = asc_prt_line(cp, leftlen,
4093 " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
4094 s->exe_noerror, s->exe_busy, s->exe_error,
4095 s->exe_unknown);
4096 ASC_PRT_NEXT();
4097
4098
4099
4100
4101 if (s->xfer_cnt > 0) {
4102 len = asc_prt_line(cp, leftlen, " xfer_cnt %lu, xfer_elem %lu, ",
4103 s->xfer_cnt, s->xfer_elem);
4104 ASC_PRT_NEXT();
4105
4106 len = asc_prt_line(cp, leftlen, "xfer_bytes %lu.%01lu kb\n",
4107 s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2));
4108 ASC_PRT_NEXT();
4109
4110
4111 len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ",
4112 s->xfer_elem / s->xfer_cnt,
4113 ASC_TENTHS(s->xfer_elem, s->xfer_cnt));
4114 ASC_PRT_NEXT();
4115
4116 len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ",
4117 (s->xfer_sect / 2) / s->xfer_elem,
4118 ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem));
4119 ASC_PRT_NEXT();
4120
4121 len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n",
4122 (s->xfer_sect / 2) / s->xfer_cnt,
4123 ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt));
4124 ASC_PRT_NEXT();
4125 }
4126
4127 return totlen;
4128}
4129#endif
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151static int
4152advansys_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
4153 off_t offset, int length, int inout)
4154{
4155 struct asc_board *boardp = shost_priv(shost);
4156 char *cp;
4157 int cplen;
4158 int cnt;
4159 int totcnt;
4160 int leftlen;
4161 char *curbuf;
4162 off_t advoffset;
4163
4164 ASC_DBG(1, "begin\n");
4165
4166
4167
4168
4169 if (inout == TRUE)
4170 return -ENOSYS;
4171
4172
4173
4174
4175
4176
4177 *start = buffer;
4178 curbuf = buffer;
4179 advoffset = 0;
4180 totcnt = 0;
4181 leftlen = length;
4182
4183
4184
4185
4186
4187
4188 cp = (char *)advansys_info(shost);
4189 strcat(cp, "\n");
4190 cplen = strlen(cp);
4191
4192 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4193 totcnt += cnt;
4194 leftlen -= cnt;
4195 if (leftlen == 0) {
4196 ASC_DBG(1, "totcnt %d\n", totcnt);
4197 return totcnt;
4198 }
4199 advoffset += cplen;
4200 curbuf += cnt;
4201
4202
4203
4204
4205 if (!ASC_NARROW_BOARD(boardp)) {
4206 cp = boardp->prtbuf;
4207 cplen = asc_prt_adv_bios(shost, cp, ASC_PRTBUF_SIZE);
4208 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4209 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
4210 cplen);
4211 totcnt += cnt;
4212 leftlen -= cnt;
4213 if (leftlen == 0) {
4214 ASC_DBG(1, "totcnt %d\n", totcnt);
4215 return totcnt;
4216 }
4217 advoffset += cplen;
4218 curbuf += cnt;
4219 }
4220
4221
4222
4223
4224 cp = boardp->prtbuf;
4225 cplen = asc_prt_board_devices(shost, cp, ASC_PRTBUF_SIZE);
4226 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4227 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4228 totcnt += cnt;
4229 leftlen -= cnt;
4230 if (leftlen == 0) {
4231 ASC_DBG(1, "totcnt %d\n", totcnt);
4232 return totcnt;
4233 }
4234 advoffset += cplen;
4235 curbuf += cnt;
4236
4237
4238
4239
4240 cp = boardp->prtbuf;
4241 if (ASC_NARROW_BOARD(boardp)) {
4242 cplen = asc_prt_asc_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
4243 } else {
4244 cplen = asc_prt_adv_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
4245 }
4246 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4247 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4248 totcnt += cnt;
4249 leftlen -= cnt;
4250 if (leftlen == 0) {
4251 ASC_DBG(1, "totcnt %d\n", totcnt);
4252 return totcnt;
4253 }
4254 advoffset += cplen;
4255 curbuf += cnt;
4256
4257
4258
4259
4260 cp = boardp->prtbuf;
4261 cplen = asc_prt_driver_conf(shost, cp, ASC_PRTBUF_SIZE);
4262 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4263 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4264 totcnt += cnt;
4265 leftlen -= cnt;
4266 if (leftlen == 0) {
4267 ASC_DBG(1, "totcnt %d\n", totcnt);
4268 return totcnt;
4269 }
4270 advoffset += cplen;
4271 curbuf += cnt;
4272
4273#ifdef ADVANSYS_STATS
4274
4275
4276
4277 cp = boardp->prtbuf;
4278 cplen = asc_prt_board_stats(shost, cp, ASC_PRTBUF_SIZE);
4279 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4280 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4281 totcnt += cnt;
4282 leftlen -= cnt;
4283 if (leftlen == 0) {
4284 ASC_DBG(1, "totcnt %d\n", totcnt);
4285 return totcnt;
4286 }
4287 advoffset += cplen;
4288 curbuf += cnt;
4289#endif
4290
4291
4292
4293
4294
4295 cp = boardp->prtbuf;
4296 if (ASC_NARROW_BOARD(boardp)) {
4297 cplen = asc_prt_asc_board_info(shost, cp, ASC_PRTBUF_SIZE);
4298 } else {
4299 cplen = asc_prt_adv_board_info(shost, cp, ASC_PRTBUF_SIZE);
4300 }
4301 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4302 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4303 totcnt += cnt;
4304 leftlen -= cnt;
4305 if (leftlen == 0) {
4306 ASC_DBG(1, "totcnt %d\n", totcnt);
4307 return totcnt;
4308 }
4309 advoffset += cplen;
4310 curbuf += cnt;
4311
4312 ASC_DBG(1, "totcnt %d\n", totcnt);
4313
4314 return totcnt;
4315}
4316#endif
4317
4318static void asc_scsi_done(struct scsi_cmnd *scp)
4319{
4320 scsi_dma_unmap(scp);
4321 ASC_STATS(scp->device->host, done);
4322 scp->scsi_done(scp);
4323}
4324
4325static void AscSetBank(PortAddr iop_base, uchar bank)
4326{
4327 uchar val;
4328
4329 val = AscGetChipControl(iop_base) &
4330 (~
4331 (CC_SINGLE_STEP | CC_TEST | CC_DIAG | CC_SCSI_RESET |
4332 CC_CHIP_RESET));
4333 if (bank == 1) {
4334 val |= CC_BANK_ONE;
4335 } else if (bank == 2) {
4336 val |= CC_DIAG | CC_BANK_ONE;
4337 } else {
4338 val &= ~CC_BANK_ONE;
4339 }
4340 AscSetChipControl(iop_base, val);
4341}
4342
4343static void AscSetChipIH(PortAddr iop_base, ushort ins_code)
4344{
4345 AscSetBank(iop_base, 1);
4346 AscWriteChipIH(iop_base, ins_code);
4347 AscSetBank(iop_base, 0);
4348}
4349
4350static int AscStartChip(PortAddr iop_base)
4351{
4352 AscSetChipControl(iop_base, 0);
4353 if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
4354 return (0);
4355 }
4356 return (1);
4357}
4358
4359static int AscStopChip(PortAddr iop_base)
4360{
4361 uchar cc_val;
4362
4363 cc_val =
4364 AscGetChipControl(iop_base) &
4365 (~(CC_SINGLE_STEP | CC_TEST | CC_DIAG));
4366 AscSetChipControl(iop_base, (uchar)(cc_val | CC_HALT));
4367 AscSetChipIH(iop_base, INS_HALT);
4368 AscSetChipIH(iop_base, INS_RFLAG_WTM);
4369 if ((AscGetChipStatus(iop_base) & CSW_HALTED) == 0) {
4370 return (0);
4371 }
4372 return (1);
4373}
4374
4375static int AscIsChipHalted(PortAddr iop_base)
4376{
4377 if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
4378 if ((AscGetChipControl(iop_base) & CC_HALT) != 0) {
4379 return (1);
4380 }
4381 }
4382 return (0);
4383}
4384
4385static int AscResetChipAndScsiBus(ASC_DVC_VAR *asc_dvc)
4386{
4387 PortAddr iop_base;
4388 int i = 10;
4389
4390 iop_base = asc_dvc->iop_base;
4391 while ((AscGetChipStatus(iop_base) & CSW_SCSI_RESET_ACTIVE)
4392 && (i-- > 0)) {
4393 mdelay(100);
4394 }
4395 AscStopChip(iop_base);
4396 AscSetChipControl(iop_base, CC_CHIP_RESET | CC_SCSI_RESET | CC_HALT);
4397 udelay(60);
4398 AscSetChipIH(iop_base, INS_RFLAG_WTM);
4399 AscSetChipIH(iop_base, INS_HALT);
4400 AscSetChipControl(iop_base, CC_CHIP_RESET | CC_HALT);
4401 AscSetChipControl(iop_base, CC_HALT);
4402 mdelay(200);
4403 AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
4404 AscSetChipStatus(iop_base, 0);
4405 return (AscIsChipHalted(iop_base));
4406}
4407
4408static int AscFindSignature(PortAddr iop_base)
4409{
4410 ushort sig_word;
4411
4412 ASC_DBG(1, "AscGetChipSignatureByte(0x%x) 0x%x\n",
4413 iop_base, AscGetChipSignatureByte(iop_base));
4414 if (AscGetChipSignatureByte(iop_base) == (uchar)ASC_1000_ID1B) {
4415 ASC_DBG(1, "AscGetChipSignatureWord(0x%x) 0x%x\n",
4416 iop_base, AscGetChipSignatureWord(iop_base));
4417 sig_word = AscGetChipSignatureWord(iop_base);
4418 if ((sig_word == (ushort)ASC_1000_ID0W) ||
4419 (sig_word == (ushort)ASC_1000_ID0W_FIX)) {
4420 return (1);
4421 }
4422 }
4423 return (0);
4424}
4425
4426static void AscEnableInterrupt(PortAddr iop_base)
4427{
4428 ushort cfg;
4429
4430 cfg = AscGetChipCfgLsw(iop_base);
4431 AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON);
4432}
4433
4434static void AscDisableInterrupt(PortAddr iop_base)
4435{
4436 ushort cfg;
4437
4438 cfg = AscGetChipCfgLsw(iop_base);
4439 AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON));
4440}
4441
4442static uchar AscReadLramByte(PortAddr iop_base, ushort addr)
4443{
4444 unsigned char byte_data;
4445 unsigned short word_data;
4446
4447 if (isodd_word(addr)) {
4448 AscSetChipLramAddr(iop_base, addr - 1);
4449 word_data = AscGetChipLramData(iop_base);
4450 byte_data = (word_data >> 8) & 0xFF;
4451 } else {
4452 AscSetChipLramAddr(iop_base, addr);
4453 word_data = AscGetChipLramData(iop_base);
4454 byte_data = word_data & 0xFF;
4455 }
4456 return byte_data;
4457}
4458
4459static ushort AscReadLramWord(PortAddr iop_base, ushort addr)
4460{
4461 ushort word_data;
4462
4463 AscSetChipLramAddr(iop_base, addr);
4464 word_data = AscGetChipLramData(iop_base);
4465 return (word_data);
4466}
4467
4468#if CC_VERY_LONG_SG_LIST
4469static ASC_DCNT AscReadLramDWord(PortAddr iop_base, ushort addr)
4470{
4471 ushort val_low, val_high;
4472 ASC_DCNT dword_data;
4473
4474 AscSetChipLramAddr(iop_base, addr);
4475 val_low = AscGetChipLramData(iop_base);
4476 val_high = AscGetChipLramData(iop_base);
4477 dword_data = ((ASC_DCNT) val_high << 16) | (ASC_DCNT) val_low;
4478 return (dword_data);
4479}
4480#endif
4481
4482static void
4483AscMemWordSetLram(PortAddr iop_base, ushort s_addr, ushort set_wval, int words)
4484{
4485 int i;
4486
4487 AscSetChipLramAddr(iop_base, s_addr);
4488 for (i = 0; i < words; i++) {
4489 AscSetChipLramData(iop_base, set_wval);
4490 }
4491}
4492
4493static void AscWriteLramWord(PortAddr iop_base, ushort addr, ushort word_val)
4494{
4495 AscSetChipLramAddr(iop_base, addr);
4496 AscSetChipLramData(iop_base, word_val);
4497}
4498
4499static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
4500{
4501 ushort word_data;
4502
4503 if (isodd_word(addr)) {
4504 addr--;
4505 word_data = AscReadLramWord(iop_base, addr);
4506 word_data &= 0x00FF;
4507 word_data |= (((ushort)byte_val << 8) & 0xFF00);
4508 } else {
4509 word_data = AscReadLramWord(iop_base, addr);
4510 word_data &= 0xFF00;
4511 word_data |= ((ushort)byte_val & 0x00FF);
4512 }
4513 AscWriteLramWord(iop_base, addr, word_data);
4514}
4515
4516
4517
4518
4519
4520
4521
4522static void
4523AscMemWordCopyPtrToLram(PortAddr iop_base, ushort s_addr,
4524 const uchar *s_buffer, int words)
4525{
4526 int i;
4527
4528 AscSetChipLramAddr(iop_base, s_addr);
4529 for (i = 0; i < 2 * words; i += 2) {
4530
4531
4532
4533
4534
4535
4536
4537
4538 outpw(iop_base + IOP_RAM_DATA,
4539 ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
4540 }
4541}
4542
4543
4544
4545
4546
4547
4548
4549static void
4550AscMemDWordCopyPtrToLram(PortAddr iop_base,
4551 ushort s_addr, uchar *s_buffer, int dwords)
4552{
4553 int i;
4554
4555 AscSetChipLramAddr(iop_base, s_addr);
4556 for (i = 0; i < 4 * dwords; i += 4) {
4557 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
4558 outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 3] << 8) | s_buffer[i + 2]);
4559 }
4560}
4561
4562
4563
4564
4565
4566
4567
4568static void
4569AscMemWordCopyPtrFromLram(PortAddr iop_base,
4570 ushort s_addr, uchar *d_buffer, int words)
4571{
4572 int i;
4573 ushort word;
4574
4575 AscSetChipLramAddr(iop_base, s_addr);
4576 for (i = 0; i < 2 * words; i += 2) {
4577 word = inpw(iop_base + IOP_RAM_DATA);
4578 d_buffer[i] = word & 0xff;
4579 d_buffer[i + 1] = (word >> 8) & 0xff;
4580 }
4581}
4582
4583static ASC_DCNT AscMemSumLramWord(PortAddr iop_base, ushort s_addr, int words)
4584{
4585 ASC_DCNT sum;
4586 int i;
4587
4588 sum = 0L;
4589 for (i = 0; i < words; i++, s_addr += 2) {
4590 sum += AscReadLramWord(iop_base, s_addr);
4591 }
4592 return (sum);
4593}
4594
4595static ushort AscInitLram(ASC_DVC_VAR *asc_dvc)
4596{
4597 uchar i;
4598 ushort s_addr;
4599 PortAddr iop_base;
4600 ushort warn_code;
4601
4602 iop_base = asc_dvc->iop_base;
4603 warn_code = 0;
4604 AscMemWordSetLram(iop_base, ASC_QADR_BEG, 0,
4605 (ushort)(((int)(asc_dvc->max_total_qng + 2 + 1) *
4606 64) >> 1));
4607 i = ASC_MIN_ACTIVE_QNO;
4608 s_addr = ASC_QADR_BEG + ASC_QBLK_SIZE;
4609 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
4610 (uchar)(i + 1));
4611 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
4612 (uchar)(asc_dvc->max_total_qng));
4613 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
4614 (uchar)i);
4615 i++;
4616 s_addr += ASC_QBLK_SIZE;
4617 for (; i < asc_dvc->max_total_qng; i++, s_addr += ASC_QBLK_SIZE) {
4618 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
4619 (uchar)(i + 1));
4620 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
4621 (uchar)(i - 1));
4622 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
4623 (uchar)i);
4624 }
4625 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
4626 (uchar)ASC_QLINK_END);
4627 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
4628 (uchar)(asc_dvc->max_total_qng - 1));
4629 AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
4630 (uchar)asc_dvc->max_total_qng);
4631 i++;
4632 s_addr += ASC_QBLK_SIZE;
4633 for (; i <= (uchar)(asc_dvc->max_total_qng + 3);
4634 i++, s_addr += ASC_QBLK_SIZE) {
4635 AscWriteLramByte(iop_base,
4636 (ushort)(s_addr + (ushort)ASC_SCSIQ_B_FWD), i);
4637 AscWriteLramByte(iop_base,
4638 (ushort)(s_addr + (ushort)ASC_SCSIQ_B_BWD), i);
4639 AscWriteLramByte(iop_base,
4640 (ushort)(s_addr + (ushort)ASC_SCSIQ_B_QNO), i);
4641 }
4642 return warn_code;
4643}
4644
4645static ASC_DCNT
4646AscLoadMicroCode(PortAddr iop_base, ushort s_addr,
4647 const uchar *mcode_buf, ushort mcode_size)
4648{
4649 ASC_DCNT chksum;
4650 ushort mcode_word_size;
4651 ushort mcode_chksum;
4652
4653
4654 mcode_word_size = (ushort)(mcode_size >> 1);
4655 AscMemWordSetLram(iop_base, s_addr, 0, mcode_word_size);
4656 AscMemWordCopyPtrToLram(iop_base, s_addr, mcode_buf, mcode_word_size);
4657
4658 chksum = AscMemSumLramWord(iop_base, s_addr, mcode_word_size);
4659 ASC_DBG(1, "chksum 0x%lx\n", (ulong)chksum);
4660 mcode_chksum = (ushort)AscMemSumLramWord(iop_base,
4661 (ushort)ASC_CODE_SEC_BEG,
4662 (ushort)((mcode_size -
4663 s_addr - (ushort)
4664 ASC_CODE_SEC_BEG) /
4665 2));
4666 ASC_DBG(1, "mcode_chksum 0x%lx\n", (ulong)mcode_chksum);
4667 AscWriteLramWord(iop_base, ASCV_MCODE_CHKSUM_W, mcode_chksum);
4668 AscWriteLramWord(iop_base, ASCV_MCODE_SIZE_W, mcode_size);
4669 return chksum;
4670}
4671
4672static void AscInitQLinkVar(ASC_DVC_VAR *asc_dvc)
4673{
4674 PortAddr iop_base;
4675 int i;
4676 ushort lram_addr;
4677
4678 iop_base = asc_dvc->iop_base;
4679 AscPutRiscVarFreeQHead(iop_base, 1);
4680 AscPutRiscVarDoneQTail(iop_base, asc_dvc->max_total_qng);
4681 AscPutVarFreeQHead(iop_base, 1);
4682 AscPutVarDoneQTail(iop_base, asc_dvc->max_total_qng);
4683 AscWriteLramByte(iop_base, ASCV_BUSY_QHEAD_B,
4684 (uchar)((int)asc_dvc->max_total_qng + 1));
4685 AscWriteLramByte(iop_base, ASCV_DISC1_QHEAD_B,
4686 (uchar)((int)asc_dvc->max_total_qng + 2));
4687 AscWriteLramByte(iop_base, (ushort)ASCV_TOTAL_READY_Q_B,
4688 asc_dvc->max_total_qng);
4689 AscWriteLramWord(iop_base, ASCV_ASCDVC_ERR_CODE_W, 0);
4690 AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
4691 AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, 0);
4692 AscWriteLramByte(iop_base, ASCV_SCSIBUSY_B, 0);
4693 AscWriteLramByte(iop_base, ASCV_WTM_FLAG_B, 0);
4694 AscPutQDoneInProgress(iop_base, 0);
4695 lram_addr = ASC_QADR_BEG;
4696 for (i = 0; i < 32; i++, lram_addr += 2) {
4697 AscWriteLramWord(iop_base, lram_addr, 0);
4698 }
4699}
4700
4701static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)
4702{
4703 int i;
4704 ushort warn_code;
4705 PortAddr iop_base;
4706 ASC_PADDR phy_addr;
4707 ASC_DCNT phy_size;
4708 struct asc_board *board = asc_dvc_to_board(asc_dvc);
4709
4710 iop_base = asc_dvc->iop_base;
4711 warn_code = 0;
4712 for (i = 0; i <= ASC_MAX_TID; i++) {
4713 AscPutMCodeInitSDTRAtID(iop_base, i,
4714 asc_dvc->cfg->sdtr_period_offset[i]);
4715 }
4716
4717 AscInitQLinkVar(asc_dvc);
4718 AscWriteLramByte(iop_base, ASCV_DISC_ENABLE_B,
4719 asc_dvc->cfg->disc_enable);
4720 AscWriteLramByte(iop_base, ASCV_HOSTSCSI_ID_B,
4721 ASC_TID_TO_TARGET_ID(asc_dvc->cfg->chip_scsi_id));
4722
4723
4724 BUG_ON((unsigned long)asc_dvc->overrun_buf & 7);
4725 asc_dvc->overrun_dma = dma_map_single(board->dev, asc_dvc->overrun_buf,
4726 ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE);
4727 if (dma_mapping_error(board->dev, asc_dvc->overrun_dma)) {
4728 warn_code = -ENOMEM;
4729 goto err_dma_map;
4730 }
4731 phy_addr = cpu_to_le32(asc_dvc->overrun_dma);
4732 AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_PADDR_D,
4733 (uchar *)&phy_addr, 1);
4734 phy_size = cpu_to_le32(ASC_OVERRUN_BSIZE);
4735 AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_BSIZE_D,
4736 (uchar *)&phy_size, 1);
4737
4738 asc_dvc->cfg->mcode_date =
4739 AscReadLramWord(iop_base, (ushort)ASCV_MC_DATE_W);
4740 asc_dvc->cfg->mcode_version =
4741 AscReadLramWord(iop_base, (ushort)ASCV_MC_VER_W);
4742
4743 AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
4744 if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
4745 asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
4746 warn_code = UW_ERR;
4747 goto err_mcode_start;
4748 }
4749 if (AscStartChip(iop_base) != 1) {
4750 asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
4751 warn_code = UW_ERR;
4752 goto err_mcode_start;
4753 }
4754
4755 return warn_code;
4756
4757err_mcode_start:
4758 dma_unmap_single(board->dev, asc_dvc->overrun_dma,
4759 ASC_OVERRUN_BSIZE, DMA_FROM_DEVICE);
4760err_dma_map:
4761 asc_dvc->overrun_dma = 0;
4762 return warn_code;
4763}
4764
4765static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
4766{
4767 const struct firmware *fw;
4768 const char fwname[] = "advansys/mcode.bin";
4769 int err;
4770 unsigned long chksum;
4771 ushort warn_code;
4772 PortAddr iop_base;
4773
4774 iop_base = asc_dvc->iop_base;
4775 warn_code = 0;
4776 if ((asc_dvc->dvc_cntl & ASC_CNTL_RESET_SCSI) &&
4777 !(asc_dvc->init_state & ASC_INIT_RESET_SCSI_DONE)) {
4778 AscResetChipAndScsiBus(asc_dvc);
4779 mdelay(asc_dvc->scsi_reset_wait * 1000);
4780 }
4781 asc_dvc->init_state |= ASC_INIT_STATE_BEG_LOAD_MC;
4782 if (asc_dvc->err_code != 0)
4783 return UW_ERR;
4784 if (!AscFindSignature(asc_dvc->iop_base)) {
4785 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
4786 return warn_code;
4787 }
4788 AscDisableInterrupt(iop_base);
4789 warn_code |= AscInitLram(asc_dvc);
4790 if (asc_dvc->err_code != 0)
4791 return UW_ERR;
4792
4793 err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
4794 if (err) {
4795 printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
4796 fwname, err);
4797 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
4798 return err;
4799 }
4800 if (fw->size < 4) {
4801 printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
4802 fw->size, fwname);
4803 release_firmware(fw);
4804 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
4805 return -EINVAL;
4806 }
4807 chksum = (fw->data[3] << 24) | (fw->data[2] << 16) |
4808 (fw->data[1] << 8) | fw->data[0];
4809 ASC_DBG(1, "_asc_mcode_chksum 0x%lx\n", (ulong)chksum);
4810 if (AscLoadMicroCode(iop_base, 0, &fw->data[4],
4811 fw->size - 4) != chksum) {
4812 asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
4813 release_firmware(fw);
4814 return warn_code;
4815 }
4816 release_firmware(fw);
4817 warn_code |= AscInitMicroCodeVar(asc_dvc);
4818 if (!asc_dvc->overrun_dma)
4819 return warn_code;
4820 asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;
4821 AscEnableInterrupt(iop_base);
4822 return warn_code;
4823}
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847static int AdvLoadMicrocode(AdvPortAddr iop_base, const unsigned char *buf,
4848 int size, int memsize, int chksum)
4849{
4850 int i, j, end, len = 0;
4851 ADV_DCNT sum;
4852
4853 AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
4854
4855 for (i = 253 * 2; i < size; i++) {
4856 if (buf[i] == 0xff) {
4857 unsigned short word = (buf[i + 3] << 8) | buf[i + 2];
4858 for (j = 0; j < buf[i + 1]; j++) {
4859 AdvWriteWordAutoIncLram(iop_base, word);
4860 len += 2;
4861 }
4862 i += 3;
4863 } else if (buf[i] == 0xfe) {
4864 unsigned short word = (buf[i + 2] << 8) | buf[i + 1];
4865 AdvWriteWordAutoIncLram(iop_base, word);
4866 i += 2;
4867 len += 2;
4868 } else {
4869 unsigned int off = buf[i] * 2;
4870 unsigned short word = (buf[off + 1] << 8) | buf[off];
4871 AdvWriteWordAutoIncLram(iop_base, word);
4872 len += 2;
4873 }
4874 }
4875
4876 end = len;
4877
4878 while (len < memsize) {
4879 AdvWriteWordAutoIncLram(iop_base, 0);
4880 len += 2;
4881 }
4882
4883
4884 sum = 0;
4885 AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
4886
4887 for (len = 0; len < end; len += 2) {
4888 sum += AdvReadWordAutoIncLram(iop_base);
4889 }
4890
4891 if (sum != chksum)
4892 return ASC_IERR_MCODE_CHKSUM;
4893
4894 return 0;
4895}
4896
4897static void AdvBuildCarrierFreelist(struct adv_dvc_var *asc_dvc)
4898{
4899 ADV_CARR_T *carrp;
4900 ADV_SDCNT buf_size;
4901 ADV_PADDR carr_paddr;
4902
4903 carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
4904 asc_dvc->carr_freelist = NULL;
4905 if (carrp == asc_dvc->carrier_buf) {
4906 buf_size = ADV_CARRIER_BUFSIZE;
4907 } else {
4908 buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
4909 }
4910
4911 do {
4912
4913 carr_paddr = cpu_to_le32(virt_to_bus(carrp));
4914
4915 buf_size -= sizeof(ADV_CARR_T);
4916
4917 carrp->carr_pa = carr_paddr;
4918 carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
4919
4920
4921
4922
4923 carrp->next_vpa =
4924 cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
4925 asc_dvc->carr_freelist = carrp;
4926
4927 carrp++;
4928 } while (buf_size > 0);
4929}
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945static int
4946AdvSendIdleCmd(ADV_DVC_VAR *asc_dvc,
4947 ushort idle_cmd, ADV_DCNT idle_cmd_parameter)
4948{
4949 int result;
4950 ADV_DCNT i, j;
4951 AdvPortAddr iop_base;
4952
4953 iop_base = asc_dvc->iop_base;
4954
4955
4956
4957
4958
4959
4960 AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, (ushort)0);
4961
4962
4963
4964
4965
4966
4967
4968 AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IDLE_CMD_PARAMETER,
4969 cpu_to_le32(idle_cmd_parameter));
4970 AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD, idle_cmd);
4971
4972
4973
4974
4975 AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_B);
4976 if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
4977
4978
4979
4980
4981
4982 AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
4983 }
4984
4985
4986 for (i = 0; i < SCSI_WAIT_100_MSEC; i++) {
4987
4988 for (j = 0; j < SCSI_US_PER_MSEC; j++) {
4989 AdvReadWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS,
4990 result);
4991 if (result != 0)
4992 return result;
4993 udelay(1);
4994 }
4995 }
4996
4997 BUG();
4998 return ADV_ERROR;
4999}
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010static int AdvResetSB(ADV_DVC_VAR *asc_dvc)
5011{
5012 int status;
5013
5014
5015
5016
5017
5018 status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_START, 0L);
5019 if (status != ADV_TRUE) {
5020 return status;
5021 }
5022
5023
5024
5025
5026
5027
5028
5029 udelay(ASC_SCSI_RESET_HOLD_TIME_US);
5030
5031
5032
5033
5034
5035 status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_END, 0L);
5036 if (status != ADV_TRUE) {
5037 return status;
5038 }
5039
5040 mdelay(asc_dvc->scsi_reset_wait * 1000);
5041
5042 return status;
5043}
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
5056{
5057 const struct firmware *fw;
5058 const char fwname[] = "advansys/3550.bin";
5059 AdvPortAddr iop_base;
5060 ushort warn_code;
5061 int begin_addr;
5062 int end_addr;
5063 ushort code_sum;
5064 int word;
5065 int i;
5066 int err;
5067 unsigned long chksum;
5068 ushort scsi_cfg1;
5069 uchar tid;
5070 ushort bios_mem[ASC_MC_BIOSLEN / 2];
5071 ushort wdtr_able = 0, sdtr_able, tagqng_able;
5072 uchar max_cmd[ADV_MAX_TID + 1];
5073
5074
5075 if (asc_dvc->err_code != 0)
5076 return ADV_ERROR;
5077
5078
5079
5080
5081 if (asc_dvc->chip_type != ADV_CHIP_ASC3550) {
5082 asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
5083 return ADV_ERROR;
5084 }
5085
5086 warn_code = 0;
5087 iop_base = asc_dvc->iop_base;
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097 for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
5098 AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
5099 bios_mem[i]);
5100 }
5101
5102
5103
5104
5105 if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == 0x55AA) {
5106 ushort bios_version, major, minor;
5107
5108 bios_version =
5109 bios_mem[(ASC_MC_BIOS_VERSION - ASC_MC_BIOSMEM) / 2];
5110 major = (bios_version >> 12) & 0xF;
5111 minor = (bios_version >> 8) & 0xF;
5112 if (major < 3 || (major == 3 && minor == 1)) {
5113
5114 AdvReadWordLram(iop_base, 0x120, wdtr_able);
5115 } else {
5116 AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
5117 }
5118 }
5119 AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
5120 AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
5121 for (tid = 0; tid <= ADV_MAX_TID; tid++) {
5122 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
5123 max_cmd[tid]);
5124 }
5125
5126 err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
5127 if (err) {
5128 printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
5129 fwname, err);
5130 asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
5131 return err;
5132 }
5133 if (fw->size < 4) {
5134 printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
5135 fw->size, fwname<