1 /* $Id$ 2 * 1993/03/31 3 * linux/kernel/aha1740.c 4 * 5 * Based loosely on aha1542.c which is 6 * Copyright (C) 1992 Tommy Thorn and 7 * Modified by Eric Youngdale 8 * 9 * This file is aha1740.c, written and 10 * Copyright (C) 1992,1993 Brad McLean 11 * brad@saturn.gaylord.com or brad@bradpc.gaylord.com. 12 * 13 * Modifications to makecode and queuecommand 14 * for proper handling of multiple devices courteously 15 * provided by Michael Weller, March, 1993 16 * 17 * Multiple adapter support, extended translation detection, 18 * update to current scsi subsystem changes, proc fs support, 19 * working (!) module support based on patches from Andreas Arens, 20 * by Andreas Degert <ad@papyrus.hamburg.com>, 2/1997 21 * 22 * aha1740_makecode may still need even more work 23 * if it doesn't work for your devices, take a look. 24 * 25 * Reworked for new_eh and new locking by Alan Cox <alan@redhat.com> 26 * 27 * Converted to EISA and generic DMA APIs by Marc Zyngier 28 * <maz@wild-wind.fr.eu.org>, 4/2003. 29 * 30 * Shared interrupt support added by Rask Ingemann Lambertsen 31 * <rask@sygehus.dk>, 10/2003 32 * 33 * For the avoidance of doubt the "preferred form" of this code is one which 34 * is in an open non patent encumbered format. Where cryptographic key signing 35 * forms part of the process of creating an executable the information 36 * including keys needed to generate an equivalently functional executable 37 * are deemed to be part of the source code. 38 */ 39 40 #include <linux/blkdev.h> 41 #include <linux/interrupt.h> 42 #include <linux/module.h> 43 #include <linux/kernel.h> 44 #include <linux/types.h> 45 #include <linux/string.h> 46 #include <linux/ioport.h> 47 #include <linux/proc_fs.h> 48 #include <linux/stat.h> 49 #include <linux/init.h> 50 #include <linux/device.h> 51 #include <linux/eisa.h> 52 #include <linux/dma-mapping.h> 53 54 #include <asm/dma.h> 55 #include <asm/system.h> 56 #include <asm/io.h> 57 58 #include "scsi.h" 59 #include <scsi/scsi_host.h> 60 #include "aha1740.h" 61 62 /* IF YOU ARE HAVING PROBLEMS WITH THIS DRIVER, AND WANT TO WATCH 63 IT WORK, THEN: 64 #define DEBUG 65 */ 66 #ifdef DEBUG 67 #define DEB(x) x 68 #else 69 #define DEB(x) 70 #endif 71 72 struct aha1740_hostdata { 73 struct eisa_device *edev; 74 unsigned int translation; 75 unsigned int last_ecb_used; 76 dma_addr_t ecb_dma_addr; 77 struct ecb ecb[AHA1740_ECBS]; 78 }; 79 80 struct aha1740_sg { 81 struct aha1740_chain sg_chain[AHA1740_SCATTER]; 82 dma_addr_t sg_dma_addr; 83 dma_addr_t buf_dma_addr; 84 }; 85 86 #define HOSTDATA(host) ((struct aha1740_hostdata *) &host->hostdata) 87 88 static inline struct ecb *ecb_dma_to_cpu (struct Scsi_Host *host, 89 dma_addr_t dma) 90 { 91 struct aha1740_hostdata *hdata = HOSTDATA (host); 92 dma_addr_t offset; 93 94 offset = dma - hdata->ecb_dma_addr; 95 96 return (struct ecb *)(((char *) hdata->ecb) + (unsigned int) offset); 97 } 98 99 static inline dma_addr_t ecb_cpu_to_dma (struct Scsi_Host *host, void *cpu) 100 { 101 struct aha1740_hostdata *hdata = HOSTDATA (host); 102 dma_addr_t offset; 103 104 offset = (char *) cpu - (char *) hdata->ecb; 105 106 return hdata->ecb_dma_addr + offset; 107 } 108 109 static int aha1740_proc_info(struct Scsi_Host *shpnt, char *buffer, 110 char **start, off_t offset, 111 int length, int inout) 112 { 113 int len; 114 struct aha1740_hostdata *host; 115 116 if (inout) 117 return-ENOSYS; 118 119 host = HOSTDATA(shpnt); 120 121 len = sprintf(buffer, "aha174x at IO:%lx, IRQ %d, SLOT %d.\n" 122 "Extended translation %sabled.\n", 123 shpnt->io_port, shpnt->irq, host->edev->slot, 124 host->translation ? "en" : "dis"); 125 126 if (offset > len) { 127 *start = buffer; 128 return 0; 129 } 130 131 *start = buffer + offset; 132 len -= offset; 133 if (len > length) 134 len = length; 135 return len; 136 } 137 138 static int aha1740_makecode(unchar *sense, unchar *status) 139 { 140 struct statusword 141 { 142 ushort don:1, /* Command Done - No Error */ 143 du:1, /* Data underrun */ 144 :1, qf:1, /* Queue full */ 145 sc:1, /* Specification Check */ 146 dor:1, /* Data overrun */ 147 ch:1, /* Chaining Halted */ 148 intr:1, /* Interrupt issued */ 149 asa:1, /* Additional Status Available */ 150 sns:1, /* Sense information Stored */ 151 :1, ini:1, /* Initialization Required */ 152 me:1, /* Major error or exception */ 153 :1, eca:1, /* Extended Contingent alliance */ 154 :1; 155 } status_word; 156 int retval = DID_OK; 157 158 status_word = * (struct statusword *) status; 159 #ifdef DEBUG 160 printk("makecode from %x,%x,%x,%x %x,%x,%x,%x", 161 status[0], status[1], status[2], status[3], 162 sense[0], sense[1], sense[2], sense[3]); 163 #endif 164 if (!status_word.don) { /* Anything abnormal was detected */ 165 if ( (status[1]&0x18) || status_word.sc ) { 166 /*Additional info available*/ 167 /* Use the supplied info for further diagnostics */ 168 switch ( status[2] ) { 169 case 0x12: 170 if ( status_word.dor ) 171 retval=DID_ERROR; /* It's an Overrun */ 172 /* If not overrun, assume underrun and 173 * ignore it! */ 174 case 0x00: /* No info, assume no error, should 175 * not occur */ 176 break; 177 case 0x11: 178 case 0x21: 179 retval=DID_TIME_OUT; 180 break; 181 case 0x0a: 182 retval=DID_BAD_TARGET; 183 break; 184 case 0x04: 185 case 0x05: 186 retval=DID_ABORT; 187 /* Either by this driver or the 188 * AHA1740 itself */ 189 break; 190 default: 191 retval=DID_ERROR; /* No further 192 * diagnostics 193 * possible */ 194 } 195 } else { 196 /* Michael suggests, and Brad concurs: */ 197 if ( status_word.qf ) { 198 retval = DID_TIME_OUT; /* forces a redo */ 199 /* I think this specific one should 200 * not happen -Brad */ 201 printk("aha1740.c: WARNING: AHA1740 queue overflow!\n"); 202 } else 203 if ( status[0]&0x60 ) { 204 /* Didn't find a better error */ 205 retval = DID_ERROR; 206 } 207 /* In any other case return DID_OK so for example 208 CONDITION_CHECKS make it through to the appropriate 209 device driver */ 210 } 211 } 212 /* Under all circumstances supply the target status -Michael */ 213 return status[3] | retval << 16; 214 } 215 216 static int aha1740_test_port(unsigned int base) 217 { 218 if ( inb(PORTADR(base)) & PORTADDR_ENH ) 219 return 1; /* Okay, we're all set */ 220 221 printk("aha174x: Board detected, but not in enhanced mode, so disabled it.\n"); 222 return 0; 223 } 224 225 /* A "high" level interrupt handler */ 226 static irqreturn_t aha1740_intr_handle(int irq, void *dev_id, 227 struct pt_regs *regs) 228 { 229 struct Scsi_Host *host = (struct Scsi_Host *) dev_id; 230 void (*my_done)(Scsi_Cmnd *); 231 int errstatus, adapstat; 232 int number_serviced; 233 struct ecb *ecbptr; 234 Scsi_Cmnd *SCtmp; 235 unsigned int base; 236 unsigned long flags; 237 int handled = 0; 238 struct aha1740_sg *sgptr; 239 struct eisa_device *edev; 240 241 if (!host) 242 panic("aha1740.c: Irq from unknown host!\n"); 243 spin_lock_irqsave(host->host_lock, flags); 244 base = host->io_port; 245 number_serviced = 0; 246 edev = HOSTDATA(host)->edev; 247 248 while(inb(G2STAT(base)) & G2STAT_INTPEND) { 249 handled = 1; 250 DEB(printk("aha1740_intr top of loop.\n")); 251 adapstat = inb(G2INTST(base)); 252 ecbptr = ecb_dma_to_cpu (host, inl(MBOXIN0(base))); 253 outb(G2CNTRL_IRST,G2CNTRL(base)); /* interrupt reset */ 254 255 switch ( adapstat & G2INTST_MASK ) { 256 case G2INTST_CCBRETRY: 257 case G2INTST_CCBERROR: 258 case G2INTST_CCBGOOD: 259 /* Host Ready -> Mailbox in complete */ 260 outb(G2CNTRL_HRDY,G2CNTRL(base)); 261 if (!ecbptr) { 262 printk("Aha1740 null ecbptr in interrupt (%x,%x,%x,%d)\n", 263 inb(G2STAT(base)),adapstat, 264 inb(G2INTST(base)), number_serviced++); 265 continue; 266 } 267 SCtmp = ecbptr->SCpnt; 268 if (!SCtmp) { 269 printk("Aha1740 null SCtmp in interrupt (%x,%x,%x,%d)\n", 270 inb(G2STAT(base)),adapstat, 271 inb(G2INTST(base)), number_serviced++); 272 continue; 273 } 274 sgptr = (struct aha1740_sg *) SCtmp->host_scribble; 275 if (SCtmp->use_sg) { 276 /* We used scatter-gather. 277 Do the unmapping dance. */ 278 dma_unmap_sg (&edev->dev, 279 (struct scatterlist *) SCtmp->request_buffer, 280 SCtmp->use_sg, 281 SCtmp->sc_data_direction); 282 } else { 283 dma_unmap_single (&edev->dev, 284 sgptr->buf_dma_addr, 285 SCtmp->request_bufflen, 286 DMA_BIDIRECTIONAL); 287 } 288 289 /* Free the sg block */ 290 dma_free_coherent (&edev->dev, 291 sizeof (struct aha1740_sg), 292 SCtmp->host_scribble, 293 sgptr->sg_dma_addr); 294 295 /* Fetch the sense data, and tuck it away, in 296 the required slot. The Adaptec 297 automatically fetches it, and there is no 298 guarantee that we will still have it in the 299 cdb when we come back */ 300 if ( (adapstat & G2INTST_MASK) == G2INTST_CCBERROR ) { 301 memcpy(SCtmp->sense_buffer, ecbptr->sense, 302 sizeof(SCtmp->sense_buffer)); 303 errstatus = aha1740_makecode(ecbptr->sense,ecbptr->status); 304 } else 305 errstatus = 0; 306 DEB(if (errstatus) 307 printk("aha1740_intr_handle: returning %6x\n", 308 errstatus)); 309 SCtmp->result = errstatus; 310 my_done = ecbptr->done; 311 memset(ecbptr,0,sizeof(struct ecb)); 312 if ( my_done ) 313 my_done(SCtmp); 314 break; 315 316 case G2INTST_HARDFAIL: 317 printk(KERN_ALERT "aha1740 hardware failure!\n"); 318 panic("aha1740.c"); /* Goodbye */ 319 320 case G2INTST_ASNEVENT: 321 printk("aha1740 asynchronous event: %02x %02x %02x %02x %02x\n", 322 adapstat, 323 inb(MBOXIN0(base)), 324 inb(MBOXIN1(base)), 325 inb(MBOXIN2(base)), 326 inb(MBOXIN3(base))); /* Say What? */ 327 /* Host Ready -> Mailbox in complete */ 328 outb(G2CNTRL_HRDY,G2CNTRL(base)); 329 break; 330 331 case G2INTST_CMDGOOD: 332 /* set immediate command success flag here: */ 333 break; 334 335 case G2INTST_CMDERROR: 336 /* Set immediate command failure flag here: */ 337 break; 338 } 339 number_serviced++; 340 } 341 342 spin_unlock_irqrestore(host->host_lock, flags); 343 return IRQ_RETVAL(handled); 344 } 345 346 static int aha1740_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *)) 347 { 348 unchar direction; 349 unchar *cmd = (unchar *) SCpnt->cmnd; 350 unchar target = scmd_id(SCpnt); 351 struct aha1740_hostdata *host = HOSTDATA(SCpnt->device->host); 352 unsigned long flags; 353 void *buff = SCpnt->request_buffer; 354 int bufflen = SCpnt->request_bufflen; 355 dma_addr_t sg_dma; 356 struct aha1740_sg *sgptr; 357 int ecbno; 358 DEB(int i); 359 360 if(*cmd == REQUEST_SENSE) { 361 SCpnt->result = 0; 362 done(SCpnt); 363 return 0; 364 } 365 366 #ifdef DEBUG 367 if (*cmd == READ_10 || *cmd == WRITE_10) 368 i = xscsi2int(cmd+2); 369 else if (*cmd == READ_6 || *cmd == WRITE_6) 370 i = scsi2int(cmd+2); 371 else 372 i = -1; 373 printk("aha1740_queuecommand: dev %d cmd %02x pos %d len %d ", 374 target, *cmd, i, bufflen); 375 printk("scsi cmd:"); 376 for (i = 0; i < SCpnt->cmd_len; i++) printk("%02x ", cmd[i]); 377 printk("\n"); 378 #endif 379 380 /* locate an available ecb */ 381 spin_lock_irqsave(SCpnt->device->host->host_lock, flags); 382 ecbno = host->last_ecb_used + 1; /* An optimization */ 383 if (ecbno >= AHA1740_ECBS) 384 ecbno = 0; 385 do { 386 if (!host->ecb[ecbno].cmdw) 387 break; 388 ecbno++; 389 if (ecbno >= AHA1740_ECBS) 390 ecbno = 0; 391 } while (ecbno != host->last_ecb_used); 392 393 if (host->ecb[ecbno].cmdw) 394 panic("Unable to find empty ecb for aha1740.\n"); 395 396 host->ecb[ecbno].cmdw = AHA1740CMD_INIT; /* SCSI Initiator Command 397 doubles as reserved flag */ 398 399 host->last_ecb_used = ecbno; 400 spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags); 401 402 #ifdef DEBUG 403 printk("Sending command (%d %x)...", ecbno, done); 404 #endif 405 406 host->ecb[ecbno].cdblen = SCpnt->cmd_len; /* SCSI Command 407 * Descriptor Block 408 * Length */ 409 410 direction = 0; 411 if (*cmd == READ_10 || *cmd == READ_6) 412 direction = 1; 413 else if (*cmd == WRITE_10 || *cmd == WRITE_6) 414 direction = 0; 415 416 memcpy(host->ecb[ecbno].cdb, cmd, SCpnt->cmd_len); 417 418 SCpnt->host_scribble = dma_alloc_coherent (&host->edev->dev, 419 sizeof (struct aha1740_sg), 420 &sg_dma, GFP_ATOMIC); 421 if(SCpnt->host_scribble == NULL) { 422 printk(KERN_WARNING "aha1740: out of memory in queuecommand!\n"); 423 return 1; 424 } 425 sgptr = (struct aha1740_sg *) SCpnt->host_scribble; 426 sgptr->sg_dma_addr = sg_dma; 427 428 if (SCpnt->use_sg) { 429 struct scatterlist * sgpnt; 430 struct aha1740_chain * cptr; 431 int i, count; 432 DEB(unsigned char * ptr); 433 434 host->ecb[ecbno].sg = 1; /* SCSI Initiator Command 435 * w/scatter-gather*/ 436 sgpnt = (struct scatterlist *) SCpnt->request_buffer; 437 cptr = sgptr->sg_chain; 438 count = dma_map_sg (&host->edev->dev, sgpnt, SCpnt->use_sg, 439 SCpnt->sc_data_direction); 440 for(i=0; i < count; i++) { 441 cptr[i].datalen = sg_dma_len (sgpnt + i); 442 cptr[i].dataptr = sg_dma_address (sgpnt + i); 443 } 444 host->ecb[ecbno].datalen = count*sizeof(struct aha1740_chain); 445 host->ecb[ecbno].dataptr = sg_dma; 446 #ifdef DEBUG 447 printk("cptr %x: ",cptr); 448 ptr = (unsigned char *) cptr; 449 for(i=0;i<24;i++) printk("%02x ", ptr[i]); 450 #endif 451 } else { 452 host->ecb[ecbno].datalen = bufflen; 453 sgptr->buf_dma_addr = dma_map_single (&host->edev->dev, 454 buff, bufflen, 455 DMA_BIDIRECTIONAL); 456 host->ecb[ecbno].dataptr = sgptr->buf_dma_addr; 457 } 458 host->ecb[ecbno].lun = SCpnt->device->lun; 459 host->ecb[ecbno].ses = 1; /* Suppress underrun errors */ 460 host->ecb[ecbno].dir = direction; 461 host->ecb[ecbno].ars = 1; /* Yes, get the sense on an error */ 462 host->ecb[ecbno].senselen = 12; 463 host->ecb[ecbno].senseptr = ecb_cpu_to_dma (SCpnt->device->host, 464 host->ecb[ecbno].sense); 465 host->ecb[ecbno].statusptr = ecb_cpu_to_dma (SCpnt->device->host, 466 host->ecb[ecbno].status); 467 host->ecb[ecbno].done = done; 468 host->ecb[ecbno].SCpnt = SCpnt; 469 #ifdef DEBUG 470 { 471 int i; 472 printk("aha1740_command: sending.. "); 473 for (i = 0; i < sizeof(host->ecb[ecbno]) - 10; i++) 474 printk("%02x ", ((unchar *)&host->ecb[ecbno])[i]); 475 } 476 printk("\n"); 477 #endif 478 if (done) { 479 /* The Adaptec Spec says the card is so fast that the loops 480 will only be executed once in the code below. Even if this 481 was true with the fastest processors when the spec was 482 written, it doesn't seem to be true with todays fast 483 processors. We print a warning if the code is executed more 484 often than LOOPCNT_WARN. If this happens, it should be 485 investigated. If the count reaches LOOPCNT_MAX, we assume 486 something is broken; since there is no way to return an 487 error (the return value is ignored by the mid-level scsi 488 layer) we have to panic (and maybe that's the best thing we 489 can do then anyhow). */ 490 491 #define LOOPCNT_WARN 10 /* excessive mbxout wait -> syslog-msg */ 492 #define LOOPCNT_MAX 1000000 /* mbxout deadlock -> panic() after ~ 2 sec. */ 493 int loopcnt; 494 unsigned int base = SCpnt->device->host->io_port; 495 DEB(printk("aha1740[%d] critical section\n",ecbno)); 496 497 spin_lock_irqsave(SCpnt->device->host->host_lock, flags); 498 for (loopcnt = 0; ; loopcnt++) { 499 if (inb(G2STAT(base)) & G2STAT_MBXOUT) break; 500 if (loopcnt == LOOPCNT_WARN) { 501 printk("aha1740[%d]_mbxout wait!\n",ecbno); 502 } 503 if (loopcnt == LOOPCNT_MAX) 504 panic("aha1740.c: mbxout busy!\n"); 505 } 506 outl (ecb_cpu_to_dma (SCpnt->device->host, host->ecb + ecbno), 507 MBOXOUT0(base)); 508 for (loopcnt = 0; ; loopcnt++) { 509 if (! (inb(G2STAT(base)) & G2STAT_BUSY)) break; 510 if (loopcnt == LOOPCNT_WARN) { 511 printk("aha1740[%d]_attn wait!\n",ecbno); 512 } 513 if (loopcnt == LOOPCNT_MAX) 514 panic("aha1740.c: attn wait failed!\n"); 515 } 516 outb(ATTN_START | (target & 7), ATTN(base)); /* Start it up */ 517 spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags); 518 DEB(printk("aha1740[%d] request queued.\n",ecbno)); 519 } else 520 printk(KERN_ALERT "aha1740_queuecommand: done can't be NULL\n"); 521 return 0; 522 } 523 524 /* Query the board for its irq_level and irq_type. Nothing else matters 525 in enhanced mode on an EISA bus. */ 526 527 static void aha1740_getconfig(unsigned int base, unsigned int *irq_level, 528 unsigned int *irq_type, 529 unsigned int *translation) 530 { 531 static int intab[] = { 9, 10, 11, 12, 0, 14, 15, 0 }; 532 533 *irq_level = intab[inb(INTDEF(base)) & 0x7]; 534 *irq_type = (inb(INTDEF(base)) & 0x8) >> 3; 535 *translation = inb(RESV1(base)) & 0x1; 536 outb(inb(INTDEF(base)) | 0x10, INTDEF(base)); 537 } 538 539 static int aha1740_biosparam(struct scsi_device *sdev, 540 struct block_device *dev, 541 sector_t capacity, int* ip) 542 { 543 int size = capacity; 544 int extended = HOSTDATA(sdev->host)->translation; 545 546 DEB(printk("aha1740_biosparam\n")); 547 if (extended && (ip[2] > 1024)) { 548 ip[0] = 255; 549 ip[1] = 63; 550 ip[2] = size / (255 * 63); 551 } else { 552 ip[0] = 64; 553 ip[1] = 32; 554 ip[2] = size >> 11; 555 } 556 return 0; 557 } 558 559 static int aha1740_eh_abort_handler (Scsi_Cmnd *dummy) 560 { 561 /* 562 * From Alan Cox : 563 * The AHA1740 has firmware handled abort/reset handling. The "head in 564 * sand" kernel code is correct for once 8) 565 * 566 * So we define a dummy handler just to keep the kernel SCSI code as 567 * quiet as possible... 568 */ 569 570 return 0; 571 } 572 573 static struct scsi_host_template aha1740_template = { 574 .module = THIS_MODULE, 575 .proc_name = "aha1740", 576 .proc_info = aha1740_proc_info, 577 .name = "Adaptec 174x (EISA)", 578 .queuecommand = aha1740_queuecommand, 579 .bios_param = aha1740_biosparam, 580 .can_queue = AHA1740_ECBS, 581 .this_id = 7, 582 .sg_tablesize = AHA1740_SCATTER, 583 .cmd_per_lun = AHA1740_CMDLUN, 584 .use_clustering = ENABLE_CLUSTERING, 585 .eh_abort_handler = aha1740_eh_abort_handler, 586 }; 587 588 static int aha1740_probe (struct device *dev) 589 { 590 int slotbase; 591 unsigned int irq_level, irq_type, translation; 592 struct Scsi_Host *shpnt; 593 struct aha1740_hostdata *host; 594 struct eisa_device *edev = to_eisa_device (dev); 595 596 DEB(printk("aha1740_probe: \n")); 597 598 slotbase = edev->base_addr + EISA_VENDOR_ID_OFFSET; 599 if (!request_region(slotbase, SLOTSIZE, "aha1740")) /* See if in use */ 600 return -EBUSY; 601 if (!aha1740_test_port(slotbase)) 602 goto err_release_region; 603 aha1740_getconfig(slotbase,&irq_level,&irq_type,&translation); 604 if ((inb(G2STAT(slotbase)) & 605 (G2STAT_MBXOUT|G2STAT_BUSY)) != G2STAT_MBXOUT) { 606 /* If the card isn't ready, hard reset it */ 607 outb(G2CNTRL_HRST, G2CNTRL(slotbase)); 608 outb(0, G2CNTRL(slotbase)); 609 } 610 printk(KERN_INFO "Configuring slot %d at IO:%x, IRQ %u (%s)\n", 611 edev->slot, slotbase, irq_level, irq_type ? "edge" : "level"); 612 printk(KERN_INFO "aha174x: Extended translation %sabled.\n", 613 translation ? "en" : "dis"); 614 shpnt = scsi_host_alloc(&aha1740_template, 615 sizeof(struct aha1740_hostdata)); 616 if(shpnt == NULL) 617 goto err_release_region; 618 619 shpnt->base = 0; 620 shpnt->io_port = slotbase; 621 shpnt->n_io_port = SLOTSIZE; 622 shpnt->irq = irq_level; 623 shpnt->dma_channel = 0xff; 624 host = HOSTDATA(shpnt); 625 host->edev = edev; 626 host->translation = translation; 627 host->ecb_dma_addr = dma_map_single (&edev->dev, host->ecb, 628 sizeof (host->ecb), 629 DMA_BIDIRECTIONAL); 630 if (!host->ecb_dma_addr) { 631 printk (KERN_ERR "aha1740_probe: Couldn't map ECB, giving up\n"); 632 scsi_unregister (shpnt); 633 goto err_host_put; 634 } 635 636 DEB(printk("aha1740_probe: enable interrupt channel %d\n",irq_level)); 637 if (request_irq(irq_level,aha1740_intr_handle,irq_type ? 0 : SA_SHIRQ, 638 "aha1740",shpnt)) { 639 printk(KERN_ERR "aha1740_probe: Unable to allocate IRQ %d.\n", 640 irq_level); 641 goto err_unmap; 642 } 643 644 eisa_set_drvdata (edev, shpnt); 645 scsi_add_host (shpnt, dev); /* XXX handle failure */ 646 scsi_scan_host (shpnt); 647 return 0; 648 649 err_unmap: 650 dma_unmap_single (&edev->dev, host->ecb_dma_addr, 651 sizeof (host->ecb), DMA_BIDIRECTIONAL); 652 err_host_put: 653 scsi_host_put (shpnt); 654 err_release_region: 655 release_region(slotbase, SLOTSIZE); 656 657 return -ENODEV; 658 } 659 660 static __devexit int aha1740_remove (struct device *dev) 661 { 662 struct Scsi_Host *shpnt = dev->driver_data; 663 struct aha1740_hostdata *host = HOSTDATA (shpnt); 664 665 scsi_remove_host(shpnt); 666 667 free_irq (shpnt->irq, shpnt); 668 dma_unmap_single (dev, host->ecb_dma_addr, 669 sizeof (host->ecb), DMA_BIDIRECTIONAL); 670 release_region (shpnt->io_port, SLOTSIZE); 671 672 scsi_host_put (shpnt); 673 674 return 0; 675 } 676 677 static struct eisa_device_id aha1740_ids[] = { 678 { "ADP0000" }, /* 1740 */ 679 { "ADP0001" }, /* 1740A */ 680 { "ADP0002" }, /* 1742A */ 681 { "ADP0400" }, /* 1744 */ 682 { "" } 683 }; 684 685 static struct eisa_driver aha1740_driver = { 686 .id_table = aha1740_ids, 687 .driver = { 688 .name = "aha1740", 689 .probe = aha1740_probe, 690 .remove = __devexit_p (aha1740_remove), 691 }, 692 }; 693 694 static __init int aha1740_init (void) 695 { 696 return eisa_driver_register (&aha1740_driver); 697 } 698 699 static __exit void aha1740_exit (void) 700 { 701 eisa_driver_unregister (&aha1740_driver); 702 } 703 704 module_init (aha1740_init); 705 module_exit (aha1740_exit); 706 707 MODULE_LICENSE("GPL"); 708