|
|
1.1 root 1: /************************************************************
2: * *
3: * Linux EATA SCSI driver *
4: * *
5: * based on the CAM document CAM/89-004 rev. 2.0c, *
6: * DPT's driver kit, some internal documents and source, *
7: * and several other Linux scsi drivers and kernel docs. *
8: * *
9: * The driver currently: *
10: * -supports all ISA based EATA-DMA boards *
11: * like PM2011, PM2021, PM2041, PM3021 *
12: * -supports all EISA based EATA-DMA boards *
13: * like PM2012B, PM2022, PM2122, PM2322, PM2042, *
14: * PM3122, PM3222, PM3332 *
15: * -supports all PCI based EATA-DMA boards *
16: * like PM2024, PM2124, PM2044, PM2144, PM3224, *
17: * PM3334 *
18: * -supports the Wide, Ultra Wide and Differential *
19: * versions of the boards *
20: * -supports multiple HBAs with & without IRQ sharing *
21: * -supports all SCSI channels on multi channel boards *
22: * -supports ix86 and MIPS, untested on ALPHA *
23: * -needs identical IDs on all channels of a HBA *
24: * -can be loaded as module *
25: * -displays statistical and hardware information *
26: * in /proc/scsi/eata_dma *
27: * -provides rudimentary latency measurement *
28: * possibilities via /proc/scsi/eata_dma/<hostnum> *
29: * *
30: * (c)1993-96 Michael Neuffer *
31: * [email protected] *
32: * [email protected] *
33: * *
34: * This program is free software; you can redistribute it *
35: * and/or modify it under the terms of the GNU General *
36: * Public License as published by the Free Software *
37: * Foundation; either version 2 of the License, or *
38: * (at your option) any later version. *
39: * *
40: * This program is distributed in the hope that it will be *
41: * useful, but WITHOUT ANY WARRANTY; without even the *
42: * implied warranty of MERCHANTABILITY or FITNESS FOR A *
43: * PARTICULAR PURPOSE. See the GNU General Public License *
44: * for more details. *
45: * *
46: * You should have received a copy of the GNU General *
47: * Public License along with this kernel; if not, write to *
48: * the Free Software Foundation, Inc., 675 Mass Ave, *
49: * Cambridge, MA 02139, USA. *
50: * *
51: * I have to thank DPT for their excellent support. I took *
52: * me almost a year and a stopover at their HQ, on my first *
53: * trip to the USA, to get it, but since then they've been *
54: * very helpful and tried to give me all the infos and *
55: * support I need. *
56: * *
57: * Thanks also to Simon Shapiro, Greg Hosler and Mike *
58: * Jagdis who did a lot of testing and found quite a number *
59: * of bugs during the development. *
60: ************************************************************
61: * last change: 96/10/21 OS: Linux 2.0.23 *
62: ************************************************************/
63:
64: /* Look in eata_dma.h for configuration and revision information */
65:
66: #include <linux/module.h>
67: #include <linux/kernel.h>
68: #include <linux/sched.h>
69: #include <linux/string.h>
70: #include <linux/ioport.h>
71: #include <linux/malloc.h>
72: #include <linux/in.h>
73: #include <linux/bios32.h>
74: #include <linux/pci.h>
75: #include <linux/proc_fs.h>
76: #include <linux/delay.h>
77: #include <asm/byteorder.h>
78: #include <asm/types.h>
79: #include <asm/io.h>
80: #include <asm/dma.h>
81: #include <asm/pgtable.h>
82: #ifdef __mips__
83: #include <asm/cachectl.h>
84: #endif
85: #include <linux/blk.h>
86: #include "scsi.h"
87: #include "sd.h"
88: #include "hosts.h"
89: #include "eata_dma.h"
90: #include "eata_dma_proc.h"
91:
92: #include <linux/stat.h>
93: #include <linux/config.h> /* for CONFIG_PCI */
94:
95: struct proc_dir_entry proc_scsi_eata_dma = {
96: PROC_SCSI_EATA, 8, "eata_dma",
97: S_IFDIR | S_IRUGO | S_IXUGO, 2
98: };
99:
100: static u32 ISAbases[] =
101: {0x1F0, 0x170, 0x330, 0x230};
102: static unchar EISAbases[] =
103: {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
104: static uint registered_HBAs = 0;
105: static struct Scsi_Host *last_HBA = NULL;
106: static struct Scsi_Host *first_HBA = NULL;
107: static unchar reg_IRQ[] =
108: {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
109: static unchar reg_IRQL[] =
110: {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
111: static struct eata_sp *status = 0; /* Statuspacket array */
112: static void *dma_scratch = 0;
113:
114: static struct eata_register *fake_int_base;
115: static int fake_int_result;
116: static int fake_int_happened;
117:
118: static ulong int_counter = 0;
119: static ulong queue_counter = 0;
120:
121: void eata_scsi_done (Scsi_Cmnd * scmd)
122: {
123: scmd->request.rq_status = RQ_SCSI_DONE;
124:
125: if (scmd->request.sem != NULL)
126: up(scmd->request.sem);
127:
128: return;
129: }
130:
131: void eata_fake_int_handler(s32 irq, void *dev_id, struct pt_regs * regs)
132: {
133: fake_int_result = inb((ulong)fake_int_base + HA_RSTATUS);
134: fake_int_happened = TRUE;
135: DBG(DBG_INTR3, printk("eata_fake_int_handler called irq%d base %p"
136: " res %#x\n", irq, fake_int_base, fake_int_result));
137: return;
138: }
139:
140: #include "eata_dma_proc.c"
141:
142: #ifdef MODULE
143: int eata_release(struct Scsi_Host *sh)
144: {
145: uint i;
146: if (sh->irq && reg_IRQ[sh->irq] == 1) free_irq(sh->irq, NULL);
147: else reg_IRQ[sh->irq]--;
148:
149: scsi_init_free((void *)status, 512);
150: scsi_init_free((void *)dma_scratch - 4, 1024);
151: for (i = 0; i < sh->can_queue; i++){ /* Free all SG arrays */
152: if(SD(sh)->ccb[i].sg_list != NULL)
153: scsi_init_free((void *) SD(sh)->ccb[i].sg_list,
154: sh->sg_tablesize * sizeof(struct eata_sg_list));
155: }
156:
157: if (SD(sh)->channel == 0) {
158: if (sh->dma_channel != BUSMASTER) free_dma(sh->dma_channel);
159: if (sh->io_port && sh->n_io_port)
160: release_region(sh->io_port, sh->n_io_port);
161: }
162: return(TRUE);
163: }
164: #endif
165:
166:
167: inline void eata_latency_in(struct eata_ccb *cp, hostdata *hd)
168: {
169: uint time;
170: time = jiffies - cp->timestamp;
171: if(hd->all_lat[1] > time)
172: hd->all_lat[1] = time;
173: if(hd->all_lat[2] < time)
174: hd->all_lat[2] = time;
175: hd->all_lat[3] += time;
176: hd->all_lat[0]++;
177: if((cp->rw_latency) == WRITE) { /* was WRITE */
178: if(hd->writes_lat[cp->sizeindex][1] > time)
179: hd->writes_lat[cp->sizeindex][1] = time;
180: if(hd->writes_lat[cp->sizeindex][2] < time)
181: hd->writes_lat[cp->sizeindex][2] = time;
182: hd->writes_lat[cp->sizeindex][3] += time;
183: hd->writes_lat[cp->sizeindex][0]++;
184: } else if((cp->rw_latency) == READ) {
185: if(hd->reads_lat[cp->sizeindex][1] > time)
186: hd->reads_lat[cp->sizeindex][1] = time;
187: if(hd->reads_lat[cp->sizeindex][2] < time)
188: hd->reads_lat[cp->sizeindex][2] = time;
189: hd->reads_lat[cp->sizeindex][3] += time;
190: hd->reads_lat[cp->sizeindex][0]++;
191: }
192: }
193:
194: inline void eata_latency_out(struct eata_ccb *cp, Scsi_Cmnd *cmd)
195: {
196: int x, z;
197: short *sho;
198: long *lon;
199: x = 0; /* just to keep GCC quiet */
200: cp->timestamp = jiffies; /* For latency measurements */
201: switch(cmd->cmnd[0]) {
202: case WRITE_6:
203: x = cmd->cmnd[4]/2;
204: cp->rw_latency = WRITE;
205: break;
206: case READ_6:
207: x = cmd->cmnd[4]/2;
208: cp->rw_latency = READ;
209: break;
210: case WRITE_10:
211: sho = (short *) &cmd->cmnd[7];
212: x = ntohs(*sho)/2;
213: cp->rw_latency = WRITE;
214: break;
215: case READ_10:
216: sho = (short *) &cmd->cmnd[7];
217: x = ntohs(*sho)/2;
218: cp->rw_latency = READ;
219: break;
220: case WRITE_12:
221: lon = (long *) &cmd->cmnd[6];
222: x = ntohl(*lon)/2;
223: cp->rw_latency = WRITE;
224: break;
225: case READ_12:
226: lon = (long *) &cmd->cmnd[6];
227: x = ntohl(*lon)/2;
228: cp->rw_latency = READ;
229: break;
230: default:
231: cp->rw_latency = OTHER;
232: break;
233: }
234: if (cmd->cmnd[0] == WRITE_6 || cmd->cmnd[0] == WRITE_10 ||
235: cmd->cmnd[0] == WRITE_12 || cmd->cmnd[0] == READ_6 ||
236: cmd->cmnd[0] == READ_10 || cmd->cmnd[0] == READ_12) {
237: for(z = 0; (x > (1 << z)) && (z <= 11); z++)
238: /* nothing */;
239: cp->sizeindex = z;
240: }
241: }
242:
243:
244: void eata_int_handler(int irq, void *dev_id, struct pt_regs * regs)
245: {
246: uint i, result = 0;
247: uint hba_stat, scsi_stat, eata_stat;
248: Scsi_Cmnd *cmd;
249: struct eata_ccb *ccb;
250: struct eata_sp *sp;
251: uint base;
252: uint x;
253: struct Scsi_Host *sh;
254:
255: for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) {
256: if (sh->irq != irq)
257: continue;
258:
259: while(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) {
260:
261: int_counter++;
262:
263: sp = &SD(sh)->sp;
264: #ifdef __mips__
265: sys_cacheflush(sp, sizeof(struct eata_sp), 2);
266: #endif
267: ccb = sp->ccb;
268:
269: if(ccb == NULL) {
270: eata_stat = inb((uint)sh->base + HA_RSTATUS);
271: printk("eata_dma: int_handler, Spurious IRQ %d "
272: "received. CCB pointer not set.\n", irq);
273: break;
274: }
275:
276: cmd = ccb->cmd;
277: base = (uint) cmd->host->base;
278: hba_stat = sp->hba_stat;
279:
280: scsi_stat = (sp->scsi_stat >> 1) & 0x1f;
281:
282: if (sp->EOC == FALSE) {
283: eata_stat = inb(base + HA_RSTATUS);
284: printk(KERN_WARNING "eata_dma: int_handler, board: %x cmd %lx "
285: "returned unfinished.\n"
286: "EATA: %x HBA: %x SCSI: %x spadr %lx spadrirq %lx, "
287: "irq%d\n", base, (long)ccb, eata_stat, hba_stat,
288: scsi_stat,(long)&status, (long)&status[irq], irq);
289: cmd->result = DID_ERROR << 16;
290: ccb->status = FREE;
291: cmd->scsi_done(cmd);
292: break;
293: }
294:
295: sp->EOC = FALSE; /* Clean out this flag */
296:
297: if (ccb->status == LOCKED || ccb->status == RESET) {
298: printk("eata_dma: int_handler, reseted command pid %ld returned"
299: "\n", cmd->pid);
300: DBG(DBG_INTR && DBG_DELAY, DELAY(1));
301: }
302:
303: eata_stat = inb(base + HA_RSTATUS);
304: DBG(DBG_INTR, printk("IRQ %d received, base %#.4x, pid %ld, "
305: "target: %x, lun: %x, ea_s: %#.2x, hba_s: "
306: "%#.2x \n", irq, base, cmd->pid, cmd->target,
307: cmd->lun, eata_stat, hba_stat));
308:
309: switch (hba_stat) {
310: case HA_NO_ERROR: /* NO Error */
311: if(HD(cmd)->do_latency == TRUE && ccb->timestamp)
312: eata_latency_in(ccb, HD(cmd));
313: result = DID_OK << 16;
314: break;
315: case HA_ERR_SEL_TO: /* Selection Timeout */
316: case HA_ERR_CMD_TO: /* Command Timeout */
317: result = DID_TIME_OUT << 16;
318: break;
319: case HA_BUS_RESET: /* SCSI Bus Reset Received */
320: result = DID_RESET << 16;
321: DBG(DBG_STATUS, printk(KERN_WARNING "scsi%d: BUS RESET "
322: "received on cmd %ld\n",
323: HD(cmd)->HBA_number, cmd->pid));
324: break;
325: case HA_INIT_POWERUP: /* Initial Controller Power-up */
326: if (cmd->device->type != TYPE_TAPE)
327: result = DID_BUS_BUSY << 16;
328: else
329: result = DID_ERROR << 16;
330:
331: for (i = 0; i < MAXTARGET; i++)
332: DBG(DBG_STATUS, printk(KERN_DEBUG "scsi%d: cmd pid %ld "
333: "returned with INIT_POWERUP\n",
334: HD(cmd)->HBA_number, cmd->pid));
335: break;
336: case HA_CP_ABORT_NA:
337: case HA_CP_ABORTED:
338: result = DID_ABORT << 16;
339: DBG(DBG_STATUS, printk(KERN_WARNING "scsi%d: aborted cmd "
340: "returned\n", HD(cmd)->HBA_number));
341: break;
342: case HA_CP_RESET_NA:
343: case HA_CP_RESET:
344: HD(cmd)->resetlevel[cmd->channel] = 0;
345: result = DID_RESET << 16;
346: DBG(DBG_STATUS, printk(KERN_WARNING "scsi%d: reseted cmd "
347: "pid %ldreturned\n",
348: HD(cmd)->HBA_number, cmd->pid));
349: case HA_SCSI_HUNG: /* SCSI Hung */
350: printk(KERN_ERR "scsi%d: SCSI hung\n", HD(cmd)->HBA_number);
351: result = DID_ERROR << 16;
352: break;
353: case HA_RSENSE_FAIL: /* Auto Request-Sense Failed */
354: DBG(DBG_STATUS, printk(KERN_ERR "scsi%d: Auto Request Sense "
355: "Failed\n", HD(cmd)->HBA_number));
356: result = DID_ERROR << 16;
357: break;
358: case HA_UNX_BUSPHASE: /* Unexpected Bus Phase */
359: case HA_UNX_BUS_FREE: /* Unexpected Bus Free */
360: case HA_BUS_PARITY: /* Bus Parity Error */
361: case HA_UNX_MSGRJCT: /* Unexpected Message Reject */
362: case HA_RESET_STUCK: /* SCSI Bus Reset Stuck */
363: case HA_PARITY_ERR: /* Controller Ram Parity */
364: default:
365: result = DID_ERROR << 16;
366: break;
367: }
368: cmd->result = result | (scsi_stat << 1);
369:
370: #if DBG_INTR2
371: if (scsi_stat || result || hba_stat || eata_stat != 0x50
372: || cmd->scsi_done == NULL || cmd->device->id == 7)
373: printk("HBA: %d, channel %d, id: %d, lun %d, pid %ld:\n"
374: "eata_stat %#x, hba_stat %#.2x, scsi_stat %#.2x, "
375: "sense_key: %#x, result: %#.8x\n", x,
376: cmd->device->channel, cmd->device->id, cmd->device->lun,
377: cmd->pid, eata_stat, hba_stat, scsi_stat,
378: cmd->sense_buffer[2] & 0xf, cmd->result);
379: DBG(DBG_INTR&&DBG_DELAY,DELAY(1));
380: #endif
381:
382: ccb->status = FREE; /* now we can release the slot */
383: cmd->scsi_done(cmd);
384: }
385: }
386:
387: return;
388: }
389:
390: inline int eata_send_command(u32 addr, u32 base, u8 command)
391: {
392: long loop = R_LIMIT;
393:
394: while (inb(base + HA_RAUXSTAT) & HA_ABUSY)
395: if (--loop == 0)
396: return(FALSE);
397:
398: if(addr != (u32) NULL)
399: addr = virt_to_bus((void *)addr);
400:
401: /*
402: * This is overkill.....but the MIPSen seem to need this
403: * and it will be optimized away for i86 and ALPHA machines.
404: */
405: flush_cache_all();
406:
407: /* And now the address in nice little byte chunks */
408: #ifdef __LITTLE_ENDIAN
409: outb(addr, base + HA_WDMAADDR);
410: outb(addr >> 8, base + HA_WDMAADDR + 1);
411: outb(addr >> 16, base + HA_WDMAADDR + 2);
412: outb(addr >> 24, base + HA_WDMAADDR + 3);
413: #else
414: outb(addr >> 24, base + HA_WDMAADDR);
415: outb(addr >> 16, base + HA_WDMAADDR + 1);
416: outb(addr >> 8, base + HA_WDMAADDR + 2);
417: outb(addr, base + HA_WDMAADDR + 3);
418: #endif
419: outb(command, base + HA_WCOMMAND);
420: return(TRUE);
421: }
422:
423: inline int eata_send_immediate(u32 base, u32 addr, u8 ifc, u8 code, u8 code2)
424: {
425: if(addr != (u32) NULL)
426: addr = virt_to_bus((void *)addr);
427:
428: /*
429: * This is overkill.....but the MIPSen seem to need this
430: * and it will be optimized away for i86 and ALPHA machines.
431: */
432: flush_cache_all();
433:
434: outb(0x0, base + HA_WDMAADDR - 1);
435: if(addr){
436: #ifdef __LITTLE_ENDIAN
437: outb(addr, base + HA_WDMAADDR);
438: outb(addr >> 8, base + HA_WDMAADDR + 1);
439: outb(addr >> 16, base + HA_WDMAADDR + 2);
440: outb(addr >> 24, base + HA_WDMAADDR + 3);
441: #else
442: outb(addr >> 24, base + HA_WDMAADDR);
443: outb(addr >> 16, base + HA_WDMAADDR + 1);
444: outb(addr >> 8, base + HA_WDMAADDR + 2);
445: outb(addr, base + HA_WDMAADDR + 3);
446: #endif
447: } else {
448: outb(0x0, base + HA_WDMAADDR);
449: outb(0x0, base + HA_WDMAADDR + 1);
450: outb(code2, base + HA_WCODE2);
451: outb(code, base + HA_WCODE);
452: }
453:
454: outb(ifc, base + HA_WIFC);
455: outb(EATA_CMD_IMMEDIATE, base + HA_WCOMMAND);
456: return(TRUE);
457: }
458:
459: int eata_queue(Scsi_Cmnd * cmd, void (* done) (Scsi_Cmnd *))
460: {
461: unsigned int i, x, y;
462: ulong flags;
463: hostdata *hd;
464: struct Scsi_Host *sh;
465: struct eata_ccb *ccb;
466: struct scatterlist *sl;
467:
468:
469: save_flags(flags);
470: cli();
471:
472: #if 0
473: for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) {
474: if(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) {
475: printk("eata_dma: scsi%d interrupt pending in eata_queue.\n"
476: " Calling interrupt handler.\n", sh->host_no);
477: eata_int_handler(sh->irq, 0, 0);
478: }
479: }
480: #endif
481:
482: queue_counter++;
483:
484: hd = HD(cmd);
485: sh = cmd->host;
486:
487: if (cmd->cmnd[0] == REQUEST_SENSE && cmd->sense_buffer[0] != 0) {
488: DBG(DBG_REQSENSE, printk(KERN_DEBUG "Tried to REQUEST SENSE\n"));
489: cmd->result = DID_OK << 16;
490: done(cmd);
491:
492: return(0);
493: }
494:
495: /* check for free slot */
496: for (y = hd->last_ccb + 1, x = 0; x < sh->can_queue; x++, y++) {
497: if (y >= sh->can_queue)
498: y = 0;
499: if (hd->ccb[y].status == FREE)
500: break;
501: }
502:
503: hd->last_ccb = y;
504:
505: if (x >= sh->can_queue) {
506: cmd->result = DID_BUS_BUSY << 16;
507: DBG(DBG_QUEUE && DBG_ABNORM,
508: printk(KERN_CRIT "eata_queue pid %ld, HBA QUEUE FULL..., "
509: "returning DID_BUS_BUSY\n", cmd->pid));
510: done(cmd);
511: restore_flags(flags);
512: return(0);
513: }
514: ccb = &hd->ccb[y];
515:
516: memset(ccb, 0, sizeof(struct eata_ccb) - sizeof(struct eata_sg_list *));
517:
518: ccb->status = USED; /* claim free slot */
519:
520: restore_flags(flags);
521:
522: DBG(DBG_QUEUE, printk("eata_queue pid %ld, target: %x, lun: %x, y %d\n",
523: cmd->pid, cmd->target, cmd->lun, y));
524: DBG(DBG_QUEUE && DBG_DELAY, DELAY(1));
525:
526: if(hd->do_latency == TRUE)
527: eata_latency_out(ccb, cmd);
528:
529: cmd->scsi_done = (void *)done;
530:
531: switch (cmd->cmnd[0]) {
532: case CHANGE_DEFINITION: case COMPARE: case COPY:
533: case COPY_VERIFY: case LOG_SELECT: case MODE_SELECT:
534: case MODE_SELECT_10: case SEND_DIAGNOSTIC: case WRITE_BUFFER:
535: case FORMAT_UNIT: case REASSIGN_BLOCKS: case RESERVE:
536: case SEARCH_EQUAL: case SEARCH_HIGH: case SEARCH_LOW:
537: case WRITE_6: case WRITE_10: case WRITE_VERIFY:
538: case UPDATE_BLOCK: case WRITE_LONG: case WRITE_SAME:
539: case SEARCH_HIGH_12: case SEARCH_EQUAL_12: case SEARCH_LOW_12:
540: case WRITE_12: case WRITE_VERIFY_12: case SET_WINDOW:
541: case MEDIUM_SCAN: case SEND_VOLUME_TAG:
542: case 0xea: /* alternate number for WRITE LONG */
543: ccb->DataOut = TRUE; /* Output mode */
544: break;
545: case TEST_UNIT_READY:
546: default:
547: ccb->DataIn = TRUE; /* Input mode */
548: }
549:
550: /* FIXME: This will have to be changed once the midlevel driver
551: * allows different HBA IDs on every channel.
552: */
553: if (cmd->target == sh->this_id)
554: ccb->Interpret = TRUE; /* Interpret command */
555:
556: if (cmd->use_sg) {
557: ccb->scatter = TRUE; /* SG mode */
558: if (ccb->sg_list == NULL) {
559: ccb->sg_list = kmalloc(sh->sg_tablesize * sizeof(struct eata_sg_list),
560: GFP_ATOMIC | GFP_DMA);
561: }
562: if (ccb->sg_list == NULL)
563: panic("eata_dma: Run out of DMA memory for SG lists !\n");
564: ccb->cp_dataDMA = htonl(virt_to_bus(ccb->sg_list));
565:
566: ccb->cp_datalen = htonl(cmd->use_sg * sizeof(struct eata_sg_list));
567: sl=(struct scatterlist *)cmd->request_buffer;
568: for(i = 0; i < cmd->use_sg; i++, sl++){
569: ccb->sg_list[i].data = htonl(virt_to_bus(sl->address));
570: ccb->sg_list[i].len = htonl((u32) sl->length);
571: }
572: } else {
573: ccb->scatter = FALSE;
574: ccb->cp_datalen = htonl(cmd->request_bufflen);
575: ccb->cp_dataDMA = htonl(virt_to_bus(cmd->request_buffer));
576: }
577:
578: ccb->Auto_Req_Sen = TRUE;
579: ccb->cp_reqDMA = htonl(virt_to_bus(cmd->sense_buffer));
580: ccb->reqlen = sizeof(cmd->sense_buffer);
581:
582: ccb->cp_id = cmd->target;
583: ccb->cp_channel = cmd->channel;
584: ccb->cp_lun = cmd->lun;
585: ccb->cp_dispri = TRUE;
586: ccb->cp_identify = TRUE;
587: memcpy(ccb->cp_cdb, cmd->cmnd, cmd->cmd_len);
588:
589: ccb->cp_statDMA = htonl(virt_to_bus(&(hd->sp)));
590:
591: ccb->cp_viraddr = ccb; /* This will be passed thru, so we don't need to
592: * convert it */
593: ccb->cmd = cmd;
594: cmd->host_scribble = (char *)&hd->ccb[y];
595:
596: if(eata_send_command((u32) ccb, (u32) sh->base, EATA_CMD_DMA_SEND_CP) == FALSE) {
597: cmd->result = DID_BUS_BUSY << 16;
598: DBG(DBG_QUEUE && DBG_ABNORM,
599: printk("eata_queue target %d, pid %ld, HBA busy, "
600: "returning DID_BUS_BUSY\n",cmd->target, cmd->pid));
601: ccb->status = FREE;
602: done(cmd);
603: return(0);
604: }
605: DBG(DBG_QUEUE, printk("Queued base %#.4x pid: %ld target: %x lun: %x "
606: "slot %d irq %d\n", (s32)sh->base, cmd->pid,
607: cmd->target, cmd->lun, y, sh->irq));
608: DBG(DBG_QUEUE && DBG_DELAY, DELAY(1));
609:
610: return(0);
611: }
612:
613:
614: int eata_abort(Scsi_Cmnd * cmd)
615: {
616: ulong loop = HZ / 2;
617: ulong flags;
618: int x;
619: struct Scsi_Host *sh;
620:
621: save_flags(flags);
622: cli();
623:
624: DBG(DBG_ABNORM, printk("eata_abort called pid: %ld target: %x lun: %x"
625: " reason %x\n", cmd->pid, cmd->target, cmd->lun,
626: cmd->abort_reason));
627: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
628:
629: /* Some interrupt controllers seem to loose interrupts */
630: for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) {
631: if(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) {
632: printk("eata_dma: scsi%d interrupt pending in eata_abort.\n"
633: " Calling interrupt handler.\n", sh->host_no);
634: eata_int_handler(sh->irq, 0, 0);
635: }
636: }
637:
638: while (inb((u32)(cmd->host->base) + HA_RAUXSTAT) & HA_ABUSY) {
639: if (--loop == 0) {
640: printk("eata_dma: abort, timeout error.\n");
641: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
642: restore_flags(flags);
643: return (SCSI_ABORT_ERROR);
644: }
645: }
646: if (CD(cmd)->status == RESET) {
647: printk("eata_dma: abort, command reset error.\n");
648: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
649: restore_flags(flags);
650: return (SCSI_ABORT_ERROR);
651: }
652: if (CD(cmd)->status == LOCKED) {
653: DBG(DBG_ABNORM, printk("eata_dma: abort, queue slot locked.\n"));
654: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
655: restore_flags(flags);
656: return (SCSI_ABORT_NOT_RUNNING);
657: }
658: if (CD(cmd)->status == USED) {
659: DBG(DBG_ABNORM, printk("Returning: SCSI_ABORT_BUSY\n"));
660: restore_flags(flags);
661: return (SCSI_ABORT_BUSY); /* SNOOZE */
662: }
663: if (CD(cmd)->status == FREE) {
664: DBG(DBG_ABNORM, printk("Returning: SCSI_ABORT_NOT_RUNNING\n"));
665: restore_flags(flags);
666: return (SCSI_ABORT_NOT_RUNNING);
667: }
668: restore_flags(flags);
669: panic("eata_dma: abort: invalid slot status\n");
670: }
671:
672: int eata_reset(Scsi_Cmnd * cmd, unsigned int resetflags)
673: {
674: uint x;
675: ulong loop = loops_per_sec / 3;
676: ulong flags;
677: unchar success = FALSE;
678: Scsi_Cmnd *sp;
679: struct Scsi_Host *sh;
680:
681: save_flags(flags);
682: cli();
683:
684: DBG(DBG_ABNORM, printk("eata_reset called pid:%ld target: %x lun: %x"
685: " reason %x\n", cmd->pid, cmd->target, cmd->lun,
686: cmd->abort_reason));
687:
688: for (x = 1, sh = first_HBA; x <= registered_HBAs; x++, sh = SD(sh)->next) {
689: if(inb((uint)sh->base + HA_RAUXSTAT) & HA_AIRQ) {
690: printk("eata_dma: scsi%d interrupt pending in eata_reset.\n"
691: " Calling interrupt handler.\n", sh->host_no);
692: eata_int_handler(sh->irq, 0, 0);
693: }
694: }
695:
696: if (HD(cmd)->state == RESET) {
697: printk("eata_reset: exit, already in reset.\n");
698: restore_flags(flags);
699: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
700: return (SCSI_RESET_ERROR);
701: }
702:
703: while (inb((u32)(cmd->host->base) + HA_RAUXSTAT) & HA_ABUSY)
704: if (--loop == 0) {
705: printk("eata_reset: exit, timeout error.\n");
706: restore_flags(flags);
707: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
708: return (SCSI_RESET_ERROR);
709: }
710:
711: for (x = 0; x < cmd->host->can_queue; x++) {
712: if (HD(cmd)->ccb[x].status == FREE)
713: continue;
714:
715: if (HD(cmd)->ccb[x].status == LOCKED) {
716: HD(cmd)->ccb[x].status = FREE;
717: printk("eata_reset: locked slot %d forced free.\n", x);
718: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
719: continue;
720: }
721:
722:
723: sp = HD(cmd)->ccb[x].cmd;
724: HD(cmd)->ccb[x].status = RESET;
725:
726: if (sp == NULL)
727: panic("eata_reset: slot %d, sp==NULL.\n", x);
728:
729: printk("eata_reset: slot %d in reset, pid %ld.\n", x, sp->pid);
730:
731: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
732:
733: if (sp == cmd)
734: success = TRUE;
735: }
736:
737: /* hard reset the HBA */
738: inb((u32) (cmd->host->base) + HA_RSTATUS); /* This might cause trouble */
739: eata_send_command(0, (u32) cmd->host->base, EATA_CMD_RESET);
740:
741: HD(cmd)->state = RESET;
742:
743: DBG(DBG_ABNORM, printk("eata_reset: board reset done, enabling "
744: "interrupts.\n"));
745:
746: DELAY(2); /* In theorie we should get interrupts and set free all
747: * used queueslots */
748:
749: DBG(DBG_ABNORM, printk("eata_reset: interrupts disabled again.\n"));
750: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
751:
752: for (x = 0; x < cmd->host->can_queue; x++) {
753:
754: /* Skip slots already set free by interrupt and those that
755: * are still LOCKED from the last reset */
756: if (HD(cmd)->ccb[x].status != RESET)
757: continue;
758:
759: sp = HD(cmd)->ccb[x].cmd;
760: sp->result = DID_RESET << 16;
761:
762: /* This mailbox is still waiting for its interrupt */
763: HD(cmd)->ccb[x].status = LOCKED;
764:
765: printk("eata_reset: slot %d locked, DID_RESET, pid %ld done.\n",
766: x, sp->pid);
767: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
768:
769: sp->scsi_done(sp);
770: }
771:
772: HD(cmd)->state = FALSE;
773: restore_flags(flags);
774:
775: if (success) {
776: DBG(DBG_ABNORM, printk("eata_reset: exit, pending.\n"));
777: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
778: return (SCSI_RESET_PENDING);
779: } else {
780: DBG(DBG_ABNORM, printk("eata_reset: exit, wakeup.\n"));
781: DBG(DBG_ABNORM && DBG_DELAY, DELAY(1));
782: return (SCSI_RESET_PUNT);
783: }
784: }
785:
786: /* Here we try to determine the optimum queue depth for
787: * each attached device.
788: *
789: * At the moment the algorithm is rather simple
790: */
791: static void eata_select_queue_depths(struct Scsi_Host *host,
792: Scsi_Device *devicelist)
793: {
794: Scsi_Device *device;
795: int devcount = 0;
796: int factor = 0;
797:
798: #if CRIPPLE_QUEUE
799: for(device = devicelist; device != NULL; device = device->next) {
800: if(device->host == host)
801: device->queue_depth = 2;
802: }
803: #else
804: /* First we do a sample run go find out what we have */
805: for(device = devicelist; device != NULL; device = device->next) {
806: if (device->host == host) {
807: devcount++;
808: switch(device->type) {
809: case TYPE_DISK:
810: case TYPE_MOD:
811: factor += TYPE_DISK_QUEUE;
812: break;
813: case TYPE_TAPE:
814: factor += TYPE_TAPE_QUEUE;
815: break;
816: case TYPE_WORM:
817: case TYPE_ROM:
818: factor += TYPE_ROM_QUEUE;
819: break;
820: case TYPE_PROCESSOR:
821: case TYPE_SCANNER:
822: default:
823: factor += TYPE_OTHER_QUEUE;
824: break;
825: }
826: }
827: }
828:
829: DBG(DBG_REGISTER, printk(KERN_DEBUG "scsi%d: needed queueslots %d\n",
830: host->host_no, factor));
831:
832: if(factor == 0) /* We don't want to get a DIV BY ZERO error */
833: factor = 1;
834:
835: factor = (SD(host)->queuesize * 10) / factor;
836:
837: DBG(DBG_REGISTER, printk(KERN_DEBUG "scsi%d: using factor %dE-1\n",
838: host->host_no, factor));
839:
840: /* Now that have the factor we can set the individual queuesizes */
841: for(device = devicelist; device != NULL; device = device->next) {
842: if(device->host == host) {
843: if(SD(device->host)->bustype != IS_ISA){
844: switch(device->type) {
845: case TYPE_DISK:
846: case TYPE_MOD:
847: device->queue_depth = (TYPE_DISK_QUEUE * factor) / 10;
848: break;
849: case TYPE_TAPE:
850: device->queue_depth = (TYPE_TAPE_QUEUE * factor) / 10;
851: break;
852: case TYPE_WORM:
853: case TYPE_ROM:
854: device->queue_depth = (TYPE_ROM_QUEUE * factor) / 10;
855: break;
856: case TYPE_PROCESSOR:
857: case TYPE_SCANNER:
858: default:
859: device->queue_depth = (TYPE_OTHER_QUEUE * factor) / 10;
860: break;
861: }
862: } else /* ISA forces us to limit the queue depth because of the
863: * bounce buffer memory overhead. I know this is cruel */
864: device->queue_depth = 2;
865:
866: /*
867: * It showed that we need to set an upper limit of commands
868: * we can allow to queue for a single device on the bus.
869: * If we get above that limit, the broken midlevel SCSI code
870: * will produce bogus timeouts and aborts en masse. :-(
871: */
872: if(device->queue_depth > UPPER_DEVICE_QUEUE_LIMIT)
873: device->queue_depth = UPPER_DEVICE_QUEUE_LIMIT;
874: if(device->queue_depth == 0)
875: device->queue_depth = 1;
876:
877: printk(KERN_INFO "scsi%d: queue depth for target %d on channel %d "
878: "set to %d\n", host->host_no, device->id, device->channel,
879: device->queue_depth);
880: }
881: }
882: #endif
883: }
884:
885: #if CHECK_BLINK
886: int check_blink_state(long base)
887: {
888: ushort loops = 10;
889: u32 blinkindicator;
890: u32 state = 0x12345678;
891: u32 oldstate = 0;
892:
893: blinkindicator = htonl(0x54504442);
894: while ((loops--) && (state != oldstate)) {
895: oldstate = state;
896: state = inl((uint) base + 1);
897: }
898:
899: DBG(DBG_BLINK, printk("Did Blink check. Status: %d\n",
900: (state == oldstate) && (state == blinkindicator)));
901:
902: if ((state == oldstate) && (state == blinkindicator))
903: return(TRUE);
904: else
905: return (FALSE);
906: }
907: #endif
908:
909: char * get_board_data(u32 base, u32 irq, u32 id)
910: {
911: struct eata_ccb *cp;
912: struct eata_sp *sp;
913: static char *buff;
914: ulong i;
915:
916: cp = (struct eata_ccb *) scsi_init_malloc(sizeof(struct eata_ccb),
917: GFP_ATOMIC | GFP_DMA);
918: sp = (struct eata_sp *) scsi_init_malloc(sizeof(struct eata_sp),
919: GFP_ATOMIC | GFP_DMA);
920:
921: buff = dma_scratch;
922:
923: memset(cp, 0, sizeof(struct eata_ccb));
924: memset(sp, 0, sizeof(struct eata_sp));
925: memset(buff, 0, 256);
926:
927: cp->DataIn = TRUE;
928: cp->Interpret = TRUE; /* Interpret command */
929: cp->cp_dispri = TRUE;
930: cp->cp_identify = TRUE;
931:
932: cp->cp_datalen = htonl(56);
933: cp->cp_dataDMA = htonl(virt_to_bus(buff));
934: cp->cp_statDMA = htonl(virt_to_bus(sp));
935: cp->cp_viraddr = cp;
936:
937: cp->cp_id = id;
938: cp->cp_lun = 0;
939:
940: cp->cp_cdb[0] = INQUIRY;
941: cp->cp_cdb[1] = 0;
942: cp->cp_cdb[2] = 0;
943: cp->cp_cdb[3] = 0;
944: cp->cp_cdb[4] = 56;
945: cp->cp_cdb[5] = 0;
946:
947: fake_int_base = (struct eata_register *) base;
948: fake_int_result = FALSE;
949: fake_int_happened = FALSE;
950:
951: eata_send_command((u32) cp, (u32) base, EATA_CMD_DMA_SEND_CP);
952:
953: i = jiffies + (3 * HZ);
954: while (fake_int_happened == FALSE && jiffies <= i)
955: barrier();
956:
957: DBG(DBG_INTR3, printk(KERN_DEBUG "fake_int_result: %#x hbastat %#x "
958: "scsistat %#x, buff %p sp %p\n",
959: fake_int_result, (u32) (sp->hba_stat /*& 0x7f*/),
960: (u32) sp->scsi_stat, buff, sp));
961:
962: scsi_init_free((void *)cp, sizeof(struct eata_ccb));
963: scsi_init_free((void *)sp, sizeof(struct eata_sp));
964:
965: if ((fake_int_result & HA_SERROR) || jiffies > i){
966: printk(KERN_WARNING "eata_dma: trying to reset HBA at %x to clear "
967: "possible blink state\n", base);
968: /* hard reset the HBA */
969: inb((u32) (base) + HA_RSTATUS);
970: eata_send_command(0, base, EATA_CMD_RESET);
971: DELAY(1);
972: return (NULL);
973: } else
974: return (buff);
975: }
976:
977:
978: int get_conf_PIO(u32 base, struct get_conf *buf)
979: {
980: ulong loop = R_LIMIT;
981: u16 *p;
982:
983: if(check_region(base, 9))
984: return (FALSE);
985:
986: memset(buf, 0, sizeof(struct get_conf));
987:
988: while (inb(base + HA_RSTATUS) & HA_SBUSY)
989: if (--loop == 0)
990: return (FALSE);
991:
992: fake_int_base = (struct eata_register *) base;
993: fake_int_result = FALSE;
994: fake_int_happened = FALSE;
995:
996: DBG(DBG_PIO && DBG_PROBE,
997: printk("Issuing PIO READ CONFIG to HBA at %#x\n", base));
998: eata_send_command(0, base, EATA_CMD_PIO_READ_CONFIG);
999:
1000: loop = R_LIMIT;
1001: for (p = (u16 *) buf;
1002: (long)p <= ((long)buf + (sizeof(struct get_conf) / 2)); p++) {
1003: while (!(inb(base + HA_RSTATUS) & HA_SDRQ))
1004: if (--loop == 0)
1005: return (FALSE);
1006:
1007: loop = R_LIMIT;
1008: *p = inw(base + HA_RDATA);
1009: }
1010:
1011: if (!(inb(base + HA_RSTATUS) & HA_SERROR)) { /* Error ? */
1012: if (htonl(EATA_SIGNATURE) == buf->signature) {
1013: DBG(DBG_PIO&&DBG_PROBE, printk("EATA Controller found at %x "
1014: "EATA Level: %x\n", (uint) base,
1015: (uint) (buf->version)));
1016:
1017: while (inb(base + HA_RSTATUS) & HA_SDRQ)
1018: inw(base + HA_RDATA);
1019: return (TRUE);
1020: }
1021: } else {
1022: DBG(DBG_PROBE, printk("eata_dma: get_conf_PIO, error during transfer "
1023: "for HBA at %lx\n", (long)base));
1024: }
1025: return (FALSE);
1026: }
1027:
1028:
1029: void print_config(struct get_conf *gc)
1030: {
1031: printk("LEN: %d ver:%d OCS:%d TAR:%d TRNXFR:%d MORES:%d DMAS:%d\n",
1032: (u32) ntohl(gc->len), gc->version,
1033: gc->OCS_enabled, gc->TAR_support, gc->TRNXFR, gc->MORE_support,
1034: gc->DMA_support);
1035: printk("DMAV:%d HAAV:%d SCSIID0:%d ID1:%d ID2:%d QUEUE:%d SG:%d SEC:%d\n",
1036: gc->DMA_valid, gc->HAA_valid, gc->scsi_id[3], gc->scsi_id[2],
1037: gc->scsi_id[1], ntohs(gc->queuesiz), ntohs(gc->SGsiz), gc->SECOND);
1038: printk("IRQ:%d IRQT:%d DMAC:%d FORCADR:%d SG_64K:%d SG_UAE:%d MID:%d "
1039: "MCH:%d MLUN:%d\n",
1040: gc->IRQ, gc->IRQ_TR, (8 - gc->DMA_channel) & 7, gc->FORCADR,
1041: gc->SG_64K, gc->SG_UAE, gc->MAX_ID, gc->MAX_CHAN, gc->MAX_LUN);
1042: printk("RIDQ:%d PCI:%d EISA:%d\n",
1043: gc->ID_qest, gc->is_PCI, gc->is_EISA);
1044: DBG(DPT_DEBUG, DELAY(14));
1045: }
1046:
1047: short register_HBA(u32 base, struct get_conf *gc, Scsi_Host_Template * tpnt,
1048: u8 bustype)
1049: {
1050: ulong size = 0;
1051: unchar dma_channel = 0;
1052: char *buff = 0;
1053: unchar bugs = 0;
1054: struct Scsi_Host *sh;
1055: hostdata *hd;
1056: int x;
1057:
1058:
1059: DBG(DBG_REGISTER, print_config(gc));
1060:
1061: if (gc->DMA_support == FALSE) {
1062: printk("The EATA HBA at %#.4x does not support DMA.\n"
1063: "Please use the EATA-PIO driver.\n", base);
1064: return (FALSE);
1065: }
1066: if(gc->HAA_valid == FALSE || ntohl(gc->len) < 0x22)
1067: gc->MAX_CHAN = 0;
1068:
1069: if (reg_IRQ[gc->IRQ] == FALSE) { /* Interrupt already registered ? */
1070: if (!request_irq(gc->IRQ, (void *) eata_fake_int_handler, SA_INTERRUPT,
1071: "eata_dma", NULL)){
1072: reg_IRQ[gc->IRQ]++;
1073: if (!gc->IRQ_TR)
1074: reg_IRQL[gc->IRQ] = TRUE; /* IRQ is edge triggered */
1075: } else {
1076: printk("Couldn't allocate IRQ %d, Sorry.", gc->IRQ);
1077: return (FALSE);
1078: }
1079: } else { /* More than one HBA on this IRQ */
1080: if (reg_IRQL[gc->IRQ] == TRUE) {
1081: printk("Can't support more than one HBA on this IRQ,\n"
1082: " if the IRQ is edge triggered. Sorry.\n");
1083: return (FALSE);
1084: } else
1085: reg_IRQ[gc->IRQ]++;
1086: }
1087:
1088:
1089: /* If DMA is supported but DMA_valid isn't set to indicate that
1090: * the channel number is given we must have pre 2.0 firmware (1.7?)
1091: * which leaves us to guess since the "newer ones" also don't set the
1092: * DMA_valid bit.
1093: */
1094: if (gc->DMA_support && !gc->DMA_valid && gc->DMA_channel) {
1095: printk(KERN_WARNING "eata_dma: If you are using a pre 2.0 firmware "
1096: "please update it !\n"
1097: " You can get new firmware releases from ftp.dpt.com\n");
1098: gc->DMA_channel = (base == 0x1f0 ? 3 /* DMA=5 */ : 2 /* DMA=6 */);
1099: gc->DMA_valid = TRUE;
1100: }
1101:
1102: /* if gc->DMA_valid it must be an ISA HBA and we have to register it */
1103: dma_channel = BUSMASTER;
1104: if (gc->DMA_valid) {
1105: if (request_dma(dma_channel = (8 - gc->DMA_channel) & 7, "eata_dma")) {
1106: printk(KERN_WARNING "Unable to allocate DMA channel %d for ISA HBA"
1107: " at %#.4x.\n", dma_channel, base);
1108: reg_IRQ[gc->IRQ]--;
1109: if (reg_IRQ[gc->IRQ] == 0)
1110: free_irq(gc->IRQ, NULL);
1111: if (gc->IRQ_TR == FALSE)
1112: reg_IRQL[gc->IRQ] = FALSE;
1113: return (FALSE);
1114: }
1115: }
1116:
1117: if (dma_channel != BUSMASTER) {
1118: disable_dma(dma_channel);
1119: clear_dma_ff(dma_channel);
1120: set_dma_mode(dma_channel, DMA_MODE_CASCADE);
1121: enable_dma(dma_channel);
1122: }
1123:
1124: if (bustype != IS_EISA && bustype != IS_ISA)
1125: buff = get_board_data(base, gc->IRQ, gc->scsi_id[3]);
1126:
1127: if (buff == NULL) {
1128: if (bustype == IS_EISA || bustype == IS_ISA) {
1129: bugs = bugs || BROKEN_INQUIRY;
1130: } else {
1131: if (gc->DMA_support == FALSE)
1132: printk(KERN_WARNING "HBA at %#.4x doesn't support DMA. "
1133: "Sorry\n", base);
1134: else
1135: printk(KERN_WARNING "HBA at %#.4x does not react on INQUIRY. "
1136: "Sorry.\n", base);
1137: if (gc->DMA_valid)
1138: free_dma(dma_channel);
1139: reg_IRQ[gc->IRQ]--;
1140: if (reg_IRQ[gc->IRQ] == 0)
1141: free_irq(gc->IRQ, NULL);
1142: if (gc->IRQ_TR == FALSE)
1143: reg_IRQL[gc->IRQ] = FALSE;
1144: return (FALSE);
1145: }
1146: }
1147:
1148: if (gc->DMA_support == FALSE && buff != NULL)
1149: printk(KERN_WARNING "HBA %.12sat %#.4x doesn't set the DMA_support "
1150: "flag correctly.\n", &buff[16], base);
1151:
1152: request_region(base, 9, "eata_dma"); /* We already checked the
1153: * availability, so this
1154: * should not fail.
1155: */
1156:
1157: if(ntohs(gc->queuesiz) == 0) {
1158: gc->queuesiz = ntohs(64);
1159: printk(KERN_WARNING "Warning: Queue size has to be corrected. Assuming"
1160: " 64 queueslots\n"
1161: " This might be a PM2012B with a defective Firmware\n"
1162: " Contact DPT [email protected] for an upgrade\n");
1163: }
1164:
1165: size = sizeof(hostdata) + ((sizeof(struct eata_ccb) + sizeof(long))
1166: * ntohs(gc->queuesiz));
1167:
1168: DBG(DBG_REGISTER, printk("scsi_register size: %ld\n", size));
1169:
1170: sh = scsi_register(tpnt, size);
1171:
1172: if(sh != NULL) {
1173:
1174: hd = SD(sh);
1175:
1176: memset(hd->reads, 0, sizeof(u32) * 26);
1177:
1178: sh->select_queue_depths = eata_select_queue_depths;
1179:
1180: hd->bustype = bustype;
1181:
1182: /*
1183: * If we are using a ISA board, we can't use extended SG,
1184: * because we would need excessive amounts of memory for
1185: * bounce buffers.
1186: */
1187: if (gc->SG_64K==TRUE && ntohs(gc->SGsiz)==64 && hd->bustype!=IS_ISA){
1188: sh->sg_tablesize = SG_SIZE_BIG;
1189: } else {
1190: sh->sg_tablesize = ntohs(gc->SGsiz);
1191: if (sh->sg_tablesize > SG_SIZE || sh->sg_tablesize == 0) {
1192: if (sh->sg_tablesize == 0)
1193: printk(KERN_WARNING "Warning: SG size had to be fixed.\n"
1194: "This might be a PM2012 with a defective Firmware"
1195: "\nContact DPT [email protected] for an upgrade\n");
1196: sh->sg_tablesize = SG_SIZE;
1197: }
1198: }
1199: hd->sgsize = sh->sg_tablesize;
1200: }
1201:
1202: if(sh != NULL) {
1203: sh->can_queue = hd->queuesize = ntohs(gc->queuesiz);
1204: sh->cmd_per_lun = 0;
1205: }
1206:
1207: if(sh == NULL) {
1208: DBG(DBG_REGISTER, printk(KERN_NOTICE "eata_dma: couldn't register HBA"
1209: " at%x \n", base));
1210: scsi_unregister(sh);
1211: if (gc->DMA_valid)
1212: free_dma(dma_channel);
1213:
1214: reg_IRQ[gc->IRQ]--;
1215: if (reg_IRQ[gc->IRQ] == 0)
1216: free_irq(gc->IRQ, NULL);
1217: if (gc->IRQ_TR == FALSE)
1218: reg_IRQL[gc->IRQ] = FALSE;
1219: return (FALSE);
1220: }
1221:
1222:
1223: hd->broken_INQUIRY = (bugs & BROKEN_INQUIRY);
1224:
1225: if(hd->broken_INQUIRY == TRUE) {
1226: strcpy(hd->vendor, "DPT");
1227: strcpy(hd->name, "??????????");
1228: strcpy(hd->revision, "???.?");
1229: hd->firmware_revision = 0;
1230: } else {
1231: strncpy(hd->vendor, &buff[8], 8);
1232: hd->vendor[8] = 0;
1233: strncpy(hd->name, &buff[16], 17);
1234: hd->name[17] = 0;
1235: hd->revision[0] = buff[32];
1236: hd->revision[1] = buff[33];
1237: hd->revision[2] = buff[34];
1238: hd->revision[3] = '.';
1239: hd->revision[4] = buff[35];
1240: hd->revision[5] = 0;
1241: hd->firmware_revision = (buff[32] << 24) + (buff[33] << 16)
1242: + (buff[34] << 8) + buff[35];
1243: }
1244:
1245: if (hd->firmware_revision >= (('0'<<24) + ('7'<<16) + ('G'<< 8) + '0'))
1246: hd->immediate_support = 1;
1247: else
1248: hd->immediate_support = 0;
1249:
1250: switch (ntohl(gc->len)) {
1251: case 0x1c:
1252: hd->EATA_revision = 'a';
1253: break;
1254: case 0x1e:
1255: hd->EATA_revision = 'b';
1256: break;
1257: case 0x22:
1258: hd->EATA_revision = 'c';
1259: break;
1260: case 0x24:
1261: hd->EATA_revision = 'z';
1262: default:
1263: hd->EATA_revision = '?';
1264: }
1265:
1266:
1267: if(ntohl(gc->len) >= 0x22) {
1268: sh->max_id = gc->MAX_ID + 1;
1269: sh->max_lun = gc->MAX_LUN + 1;
1270: } else {
1271: sh->max_id = 8;
1272: sh->max_lun = 8;
1273: }
1274:
1275: hd->HBA_number = sh->host_no;
1276: hd->channel = gc->MAX_CHAN;
1277: sh->max_channel = gc->MAX_CHAN;
1278: sh->unique_id = base;
1279: sh->base = (char *) base;
1280: sh->io_port = base;
1281: sh->n_io_port = 9;
1282: sh->irq = gc->IRQ;
1283: sh->dma_channel = dma_channel;
1284:
1285: /* FIXME:
1286: * SCSI midlevel code should support different HBA ids on every channel
1287: */
1288: sh->this_id = gc->scsi_id[3];
1289:
1290: if (gc->SECOND)
1291: hd->primary = FALSE;
1292: else
1293: hd->primary = TRUE;
1294:
1295: sh->wish_block = FALSE;
1296:
1297: if (hd->bustype != IS_ISA) {
1298: sh->unchecked_isa_dma = FALSE;
1299: } else {
1300: sh->unchecked_isa_dma = TRUE; /* We're doing ISA DMA */
1301: }
1302:
1303: for(x = 0; x <= 11; x++){ /* Initialize min. latency */
1304: hd->writes_lat[x][1] = 0xffffffff;
1305: hd->reads_lat[x][1] = 0xffffffff;
1306: }
1307: hd->all_lat[1] = 0xffffffff;
1308:
1309: hd->next = NULL; /* build a linked list of all HBAs */
1310: hd->prev = last_HBA;
1311: if(hd->prev != NULL)
1312: SD(hd->prev)->next = sh;
1313: last_HBA = sh;
1314: if (first_HBA == NULL)
1315: first_HBA = sh;
1316: registered_HBAs++;
1317:
1318: return (TRUE);
1319: }
1320:
1321:
1322:
1323: void find_EISA(struct get_conf *buf, Scsi_Host_Template * tpnt)
1324: {
1325: u32 base;
1326: int i;
1327:
1328: #if CHECKPAL
1329: u8 pal1, pal2, pal3;
1330: #endif
1331:
1332: for (i = 0; i < MAXEISA; i++) {
1333: if (EISAbases[i] == TRUE) { /* Still a possibility ? */
1334:
1335: base = 0x1c88 + (i * 0x1000);
1336: #if CHECKPAL
1337: pal1 = inb((u16)base - 8);
1338: pal2 = inb((u16)base - 7);
1339: pal3 = inb((u16)base - 6);
1340:
1341: if (((pal1 == DPT_ID1) && (pal2 == DPT_ID2)) ||
1342: ((pal1 == NEC_ID1) && (pal2 == NEC_ID2) && (pal3 == NEC_ID3))||
1343: ((pal1 == ATT_ID1) && (pal2 == ATT_ID2) && (pal3 == ATT_ID3))){
1344: DBG(DBG_PROBE, printk("EISA EATA id tags found: %x %x %x \n",
1345: (int)pal1, (int)pal2, (int)pal3));
1346: #endif
1347: if (get_conf_PIO(base, buf) == TRUE) {
1348: if (buf->IRQ) {
1349: DBG(DBG_EISA, printk("Registering EISA HBA\n"));
1350: register_HBA(base, buf, tpnt, IS_EISA);
1351: } else
1352: printk("eata_dma: No valid IRQ. HBA removed from list\n");
1353: }
1354: #if CHECK_BLINK
1355: else {
1356: if (check_blink_state(base))
1357: printk("HBA is in BLINK state. Consult your HBAs "
1358: "Manual to correct this.\n");
1359: }
1360: #endif
1361: /* Nothing found here so we take it from the list */
1362: EISAbases[i] = 0;
1363: #if CHECKPAL
1364: }
1365: #endif
1366: }
1367: }
1368: return;
1369: }
1370:
1371: void find_ISA(struct get_conf *buf, Scsi_Host_Template * tpnt)
1372: {
1373: int i;
1374:
1375: for (i = 0; i < MAXISA; i++) {
1376: if (ISAbases[i]) {
1377: if (get_conf_PIO(ISAbases[i],buf) == TRUE){
1378: DBG(DBG_ISA, printk("Registering ISA HBA\n"));
1379: register_HBA(ISAbases[i], buf, tpnt, IS_ISA);
1380: }
1381: #if CHECK_BLINK
1382: else {
1383: if (check_blink_state(ISAbases[i]))
1384: printk("HBA is in BLINK state. Consult your HBAs "
1385: "Manual to correct this.\n");
1386: }
1387: #endif
1388: ISAbases[i] = 0;
1389: }
1390: }
1391: return;
1392: }
1393:
1394: void find_PCI(struct get_conf *buf, Scsi_Host_Template * tpnt)
1395: {
1396:
1397: #ifndef CONFIG_PCI
1398: printk("eata_dma: kernel PCI support not enabled. Skipping scan for PCI HBAs.\n");
1399: #else
1400:
1401: u8 pci_bus, pci_device_fn;
1402: static s16 pci_index = 0; /* Device index to PCI BIOS calls */
1403: u32 base = 0;
1404: u16 com_adr;
1405: u16 rev_device;
1406: u32 error, i, x;
1407: u8 pal1, pal2, pal3;
1408:
1409: if (pcibios_present()) {
1410: for (i = 0; i <= MAXPCI; ++i, ++pci_index) {
1411: if (pcibios_find_device(PCI_VENDOR_ID_DPT, PCI_DEVICE_ID_DPT,
1412: pci_index, &pci_bus, &pci_device_fn))
1413: break;
1414: DBG(DBG_PROBE && DBG_PCI,
1415: printk("eata_dma: find_PCI, HBA at bus %d, device %d,"
1416: " function %d, index %d\n", (s32)pci_bus,
1417: (s32)((pci_device_fn & 0xf8) >> 3),
1418: (s32)(pci_device_fn & 7), pci_index));
1419:
1420: if (!(error = pcibios_read_config_word(pci_bus, pci_device_fn,
1421: PCI_CLASS_DEVICE, &rev_device))) {
1422: if (rev_device == PCI_CLASS_STORAGE_SCSI) {
1423: if (!(error = pcibios_read_config_word(pci_bus,
1424: pci_device_fn, PCI_COMMAND,
1425: (u16 *) & com_adr))) {
1426: if (!((com_adr & PCI_COMMAND_IO) &&
1427: (com_adr & PCI_COMMAND_MASTER))) {
1428: printk("eata_dma: find_PCI, HBA has IO or"
1429: " BUSMASTER mode disabled\n");
1430: continue;
1431: }
1432: } else
1433: printk("eata_dma: find_PCI, error %x while reading "
1434: "PCI_COMMAND\n", error);
1435: } else
1436: printk("eata_dma: find_PCI, DEVICECLASSID %x didn't match\n",
1437: rev_device);
1438: } else {
1439: printk("eata_dma: find_PCI, error %x while reading "
1440: "PCI_CLASS_BASE\n",
1441: error);
1442: continue;
1443: }
1444:
1445: if (!(error = pcibios_read_config_dword(pci_bus, pci_device_fn,
1446: PCI_BASE_ADDRESS_0, (int *) &base))){
1447:
1448: /* Check if the address is valid */
1449: if (base & 0x01) {
1450: base &= 0xfffffffe;
1451: /* EISA tag there ? */
1452: pal1 = inb(base);
1453: pal2 = inb(base + 1);
1454: pal3 = inb(base + 2);
1455: if (((pal1 == DPT_ID1) && (pal2 == DPT_ID2)) ||
1456: ((pal1 == NEC_ID1) && (pal2 == NEC_ID2) &&
1457: (pal3 == NEC_ID3)) ||
1458: ((pal1 == ATT_ID1) && (pal2 == ATT_ID2) &&
1459: (pal3 == ATT_ID3)))
1460: base += 0x08;
1461: else
1462: base += 0x10; /* Now, THIS is the real address */
1463:
1464: if (base != 0x1f8) {
1465: /* We didn't find it in the primary search */
1466: if (get_conf_PIO(base, buf) == TRUE) {
1467:
1468: /* OK. We made it till here, so we can go now
1469: * and register it. We only have to check and
1470: * eventually remove it from the EISA and ISA list
1471: */
1472: DBG(DBG_PCI, printk("Registering PCI HBA\n"));
1473: register_HBA(base, buf, tpnt, IS_PCI);
1474:
1475: if (base < 0x1000) {
1476: for (x = 0; x < MAXISA; ++x) {
1477: if (ISAbases[x] == base) {
1478: ISAbases[x] = 0;
1479: break;
1480: }
1481: }
1482: } else if ((base & 0x0fff) == 0x0c88)
1483: EISAbases[(base >> 12) & 0x0f] = 0;
1484: continue; /* break; */
1485: }
1486: #if CHECK_BLINK
1487: else if (check_blink_state(base) == TRUE) {
1488: printk("eata_dma: HBA is in BLINK state.\n"
1489: "Consult your HBAs manual to correct this.\n");
1490: }
1491: #endif
1492: }
1493: }
1494: } else {
1495: printk("eata_dma: error %x while reading "
1496: "PCI_BASE_ADDRESS_0\n", error);
1497: }
1498: }
1499: } else {
1500: printk("eata_dma: No BIOS32 extensions present. This driver release "
1501: "still depends on it.\n"
1502: " Skipping scan for PCI HBAs. \n");
1503: }
1504: #endif /* #ifndef CONFIG_PCI */
1505: return;
1506: }
1507:
1508: int eata_detect(Scsi_Host_Template * tpnt)
1509: {
1510: struct Scsi_Host *HBA_ptr;
1511: struct get_conf gc;
1512: int i;
1513:
1514: DBG((DBG_PROBE && DBG_DELAY) || DPT_DEBUG,
1515: printk("Using lots of delays to let you read the debugging output\n"));
1516:
1517: tpnt->proc_dir = &proc_scsi_eata_dma;
1518:
1519: status = scsi_init_malloc(512, GFP_ATOMIC | GFP_DMA);
1520: dma_scratch = scsi_init_malloc(1024, GFP_ATOMIC | GFP_DMA);
1521:
1522: if(status == NULL || dma_scratch == NULL) {
1523: printk("eata_dma: can't allocate enough memory to probe for hosts !\n");
1524: return(0);
1525: }
1526:
1527: dma_scratch += 4;
1528:
1529: find_PCI(&gc, tpnt);
1530:
1531: find_EISA(&gc, tpnt);
1532:
1533: find_ISA(&gc, tpnt);
1534:
1535: for (i = 0; i <= MAXIRQ; i++) { /* Now that we know what we have, we */
1536: if (reg_IRQ[i] >= 1){ /* exchange the interrupt handler which */
1537: free_irq(i, NULL); /* we used for probing with the real one */
1538: request_irq(i, (void *)(eata_int_handler), SA_INTERRUPT|SA_SHIRQ,
1539: "eata_dma", NULL);
1540: }
1541: }
1542:
1543: HBA_ptr = first_HBA;
1544:
1545: if (registered_HBAs != 0) {
1546: printk("EATA (Extended Attachment) driver version: %d.%d%s"
1547: "\ndeveloped in co-operation with DPT\n"
1548: "(c) 1993-96 Michael Neuffer, [email protected]\n",
1549: VER_MAJOR, VER_MINOR, VER_SUB);
1550: printk("Registered HBAs:");
1551: printk("\nHBA no. Boardtype Revis EATA Bus BaseIO IRQ"
1552: " DMA Ch ID Pr QS S/G IS\n");
1553: for (i = 1; i <= registered_HBAs; i++) {
1554: printk("scsi%-2d: %.12s v%s 2.0%c %s %#.4x %2d",
1555: HBA_ptr->host_no, SD(HBA_ptr)->name, SD(HBA_ptr)->revision,
1556: SD(HBA_ptr)->EATA_revision, (SD(HBA_ptr)->bustype == 'P')?
1557: "PCI ":(SD(HBA_ptr)->bustype == 'E')?"EISA":"ISA ",
1558: (u32) HBA_ptr->base, HBA_ptr->irq);
1559: if(HBA_ptr->dma_channel != BUSMASTER)
1560: printk(" %2x ", HBA_ptr->dma_channel);
1561: else
1562: printk(" %s", "BMST");
1563: printk(" %d %d %c %3d %3d %c\n",
1564: SD(HBA_ptr)->channel+1, HBA_ptr->this_id,
1565: (SD(HBA_ptr)->primary == TRUE)?'Y':'N',
1566: HBA_ptr->can_queue, HBA_ptr->sg_tablesize,
1567: (SD(HBA_ptr)->immediate_support == TRUE)?'Y':'N');
1568: HBA_ptr = SD(HBA_ptr)->next;
1569: }
1570: } else {
1571: scsi_init_free((void *)status, 512);
1572: }
1573:
1574: scsi_init_free((void *)dma_scratch - 4, 1024);
1575:
1576: DBG(DPT_DEBUG, DELAY(12));
1577:
1578: return(registered_HBAs);
1579: }
1580:
1581: #ifdef MODULE
1582: /* Eventually this will go into an include file, but this will be later */
1583: Scsi_Host_Template driver_template = EATA_DMA;
1584: #include "scsi_module.c"
1585: #endif
1586:
1587: /*
1588: * Overrides for Emacs so that we almost follow Linus's tabbing style.
1589: * Emacs will notice this stuff at the end of the file and automatically
1590: * adjust the settings for this buffer only. This must remain at the end
1591: * of the file.
1592: * ---------------------------------------------------------------------------
1593: * Local variables:
1594: * c-indent-level: 4
1595: * c-brace-imaginary-offset: 0
1596: * c-brace-offset: -4
1597: * c-argdecl-indent: 4
1598: * c-label-offset: -4
1599: * c-continued-statement-offset: 4
1600: * c-continued-brace-offset: 0
1601: * tab-width: 8
1602: * End:
1603: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.