|
|
1.1 root 1: *** aha1542.c.~1~ Sat Sep 12 15:29:26 1992
2: --- aha1542.c Thu Sep 17 22:11:55 1992
3: ***************
4: *** 72,77 ****
5: --- 72,90 ----
6: return 1;
7: }
8:
9: + static int aha1542_in(unchar *cmdp, int len)
10: + {
11: + while (len--)
12: + {
13: + WAIT(STATUS, DF, DF, 0);
14: + *cmdp++ = inb(DATA);
15: + }
16: + return 0;
17: + fail:
18: + printk("aha1542_in failed(%d): ", len+1); aha1542_stat();
19: + return 1;
20: + }
21: +
22: int makecode(unsigned hosterr, unsigned scsierr)
23: {
24: switch (hosterr) {
25: ***************
26: *** 259,264 ****
27: --- 272,278 ----
28: int aha1542_queuecommand(unchar target, const void *cmnd, void *buff, int bufflen, void (*done)(int, int))
29: {
30: unchar ahacmd = CMD_START_SCSI;
31: + unchar direction;
32: unchar *cmd = (unchar *) cmnd;
33: DEB(int i);
34:
35: ***************
36: *** 292,300 ****
37:
38: ccb.cdblen = (*cmd<=0x1f)?6:10; /* SCSI Command Descriptor Block Length */
39:
40: memcpy(ccb.cdb, cmd, ccb.cdblen);
41: ccb.op = 0; /* SCSI Initiator Command */
42: ! ccb.idlun = (target&7)<<5; /* SCSI Target Id */
43: ccb.rsalen = 12;
44: any2scsi(ccb.datalen, bufflen);
45: any2scsi(ccb.dataptr, buff);
46: --- 306,318 ----
47:
48: ccb.cdblen = (*cmd<=0x1f)?6:10; /* SCSI Command Descriptor Block Length */
49:
50: direction = 0;
51: if (*cmd == READ_10 || *cmd == READ_6) direction = 8;
52: else if (*cmd == WRITE_10 || *cmd == WRITE_6) direction = 16;
53:
54: memcpy(ccb.cdb, cmd, ccb.cdblen);
55: ccb.op = 0; /* SCSI Initiator Command */
56: ! ccb.idlun = (target&7)<<5 | direction; /* SCSI Target Id */
57: ccb.rsalen = 12;
58: any2scsi(ccb.datalen, bufflen);
59: any2scsi(ccb.dataptr, buff);
60: ***************
61: *** 369,374 ****
62: --- 387,416 ----
63: set_intr_gate(0x2b,&aha1542_interrupt);
64: }
65:
66: +
67: + /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
68: + static void aha1542_query()
69: + {
70: + static unchar inquiry_cmd[] = {CMD_INQUIRY };
71: + static unchar inquiry_result[4];
72: + int i;
73: + i = inb(STATUS);
74: + if (i & DF) {
75: + i = inb(DATA);
76: + printk("Stale data:%x ");
77: + };
78: + aha1542_out(inquiry_cmd, 1);
79: + aha1542_in(inquiry_result, 4);
80: + WAIT(INTRFLAGS, INTRMASK, HACC, 0);
81: + while (0) {
82: + fail:
83: + printk("aha1542_detect: query card type\n");
84: + }
85: + aha1542_intr_reset();
86: + printk("Inquiry:");
87: + for(i=0;i<4;i++) printk("%x ",inquiry_result[i]);
88: + }
89: +
90: /* return non-zero on detection */
91: int aha1542_detect(int hostnum)
92: {
93: ***************
94: *** 397,402 ****
95: --- 439,446 ----
96: }
97: aha1542_intr_reset();
98: }
99: +
100: + aha1542_query();
101:
102: DEB(aha1542_stat());
103: setup_mailboxes();
104: *** scsi.c.~1~ Sat Sep 12 15:29:26 1992
105: --- scsi.c Wed Sep 16 01:00:44 1992
106: ***************
107: *** 671,677 ****
108: --- 671,680 ----
109: sti();
110:
111: if (!(last_cmnd[host].flags & WAS_RESET))
112: + {
113: reset(host);
114: + return;
115: + }
116: else
117: {
118: exit = (DRIVER_HARD | SUGGEST_ABORT);
119: ***************
120: *** 768,773 ****
121: --- 771,777 ----
122:
123: case RESERVATION_CONFLICT:
124: reset(host);
125: + return;
126: exit = DRIVER_SOFT | SUGGEST_ABORT;
127: status = MAYREDO;
128: break;
129: ***************
130: *** 841,848 ****
131: --- 845,854 ----
132: {
133: if ((last_cmnd[host].retries >= (last_cmnd[host].allowed >> 1))
134: && !(last_cmnd[host].flags & WAS_RESET))
135: + {
136: reset(host);
137: break;
138: + };
139:
140: }
141: else
142: *** sd.c.~1~ Sat Sep 12 15:29:26 1992
143: --- sd.c Thu Sep 17 23:04:40 1992
144: ***************
145: *** 39,45 ****
146: int NR_SD=0;
147: Scsi_Disk rscsi_disks[MAX_SD];
148: static int sd_sizes[MAX_SD << 4] = {0, };
149: ! static int this_count;
150: static int the_result;
151:
152: static char sense_buffer[255];
153: --- 39,45 ----
154: int NR_SD=0;
155: Scsi_Disk rscsi_disks[MAX_SD];
156: static int sd_sizes[MAX_SD << 4] = {0, };
157: ! static int this_count, total_count = 0;
158: static int the_result;
159:
160: static char sense_buffer[255];
161: ***************
162: *** 108,113 ****
163: --- 108,120 ----
164:
165: if (!result) {
166: CURRENT->nr_sectors -= this_count;
167: + total_count -= this_count;
168: + if(total_count){
169: + CURRENT->sector += this_count;
170: + CURRENT->buffer += (this_count << 9);
171: + do_sd_request();
172: + return;
173: + };
174:
175: #ifdef DEBUG
176: printk("sd%d : %d sectors remain.\n", MINOR(CURRENT->dev), CURRENT->nr_sectors);
177: ***************
178: *** 248,253 ****
179: --- 255,266 ----
180: this_count = CURRENT->nr_sectors;
181: else
182: this_count = (BLOCK_SIZE / 512);
183: +
184: +
185: + /* This is a temporary hack for the AHA1742. */
186: + if(total_count == 0)
187: + total_count = this_count;
188: + this_count = 1; /* Take only 512 bytes at a time */
189:
190: #ifdef DEBUG
191: printk("sd%d : %s %d/%d 512 byte blocks.\n", MINOR(CURRENT->dev),
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.