1/* 2 * Driver for Adaptec AHA-1542 SCSI host adapters 3 * 4 * Copyright (C) 1992 Tommy Thorn 5 * Copyright (C) 1993, 1994, 1995 Eric Youngdale 6 * Copyright (C) 2015 Ondrej Zary 7 */ 8 9#include <linux/module.h> 10#include <linux/interrupt.h> 11#include <linux/kernel.h> 12#include <linux/types.h> 13#include <linux/string.h> 14#include <linux/delay.h> 15#include <linux/init.h> 16#include <linux/spinlock.h> 17#include <linux/isa.h> 18#include <linux/pnp.h> 19#include <linux/slab.h> 20#include <linux/io.h> 21#include <asm/dma.h> 22#include <scsi/scsi_cmnd.h> 23#include <scsi/scsi_device.h> 24#include <scsi/scsi_host.h> 25#include "aha1542.h" 26 27#define MAXBOARDS 4 28 29static bool isapnp = 1; 30module_param(isapnp, bool, 0); 31MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)"); 32 33static int io[MAXBOARDS] = { 0x330, 0x334, 0, 0 }; 34module_param_array(io, int, NULL, 0); 35MODULE_PARM_DESC(io, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)"); 36 37/* time AHA spends on the AT-bus during data transfer */ 38static int bus_on[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 11us */ 39module_param_array(bus_on, int, NULL, 0); 40MODULE_PARM_DESC(bus_on, "bus on time [us] (2-15, default=-1 [HW default: 11])"); 41 42/* time AHA spends off the bus (not to monopolize it) during data transfer */ 43static int bus_off[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 4us */ 44module_param_array(bus_off, int, NULL, 0); 45MODULE_PARM_DESC(bus_off, "bus off time [us] (1-64, default=-1 [HW default: 4])"); 46 47/* default is jumper selected (J1 on 1542A), factory default = 5 MB/s */ 48static int dma_speed[MAXBOARDS] = { -1, -1, -1, -1 }; 49module_param_array(dma_speed, int, NULL, 0); 50MODULE_PARM_DESC(dma_speed, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])"); 51 52#define BIOS_TRANSLATION_6432 1 /* Default case these days */ 53#define BIOS_TRANSLATION_25563 2 /* Big disk case */ 54 55struct aha1542_hostdata { 56 /* This will effectively start both of them at the first mailbox */ 57 int bios_translation; /* Mapping bios uses - for compatibility */ 58 int aha1542_last_mbi_used; 59 int aha1542_last_mbo_used; 60 struct scsi_cmnd *int_cmds[AHA1542_MAILBOXES]; 61 struct mailbox mb[2 * AHA1542_MAILBOXES]; 62 struct ccb ccb[AHA1542_MAILBOXES]; 63}; 64 65static inline void aha1542_intr_reset(u16 base) 66{ 67 outb(IRST, CONTROL(base)); 68} 69 70static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout) 71{ 72 bool delayed = true; 73 74 if (timeout == 0) { 75 timeout = 3000000; 76 delayed = false; 77 } 78 79 while (1) { 80 u8 bits = inb(port) & mask; 81 if ((bits & allof) == allof && ((bits & noneof) == 0)) 82 break; 83 if (delayed) 84 mdelay(1); 85 if (--timeout == 0) 86 return false; 87 } 88 89 return true; 90} 91 92static int aha1542_outb(unsigned int base, u8 val) 93{ 94 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) 95 return 1; 96 outb(val, DATA(base)); 97 98 return 0; 99} 100 101static int aha1542_out(unsigned int base, u8 *buf, int len) 102{ 103 while (len--) { 104 if (!wait_mask(STATUS(base), CDF, 0, CDF, 0)) 105 return 1; 106 outb(*buf++, DATA(base)); 107 } 108 if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0)) 109 return 1; 110 111 return 0; 112} 113 114/* Only used at boot time, so we do not need to worry about latency as much 115 here */ 116 117static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout) 118{ 119 while (len--) { 120 if (!wait_mask(STATUS(base), DF, DF, 0, timeout)) 121 return 1; 122 *buf++ = inb(DATA(base)); 123 } 124 return 0; 125} 126 127static int makecode(unsigned hosterr, unsigned scsierr) 128{ 129 switch (hosterr) { 130 case 0x0: 131 case 0xa: /* Linked command complete without error and linked normally */ 132 case 0xb: /* Linked command complete without error, interrupt generated */ 133 hosterr = 0; 134 break; 135 136 case 0x11: /* Selection time out-The initiator selection or target 137 reselection was not complete within the SCSI Time out period */ 138 hosterr = DID_TIME_OUT; 139 break; 140 141 case 0x12: /* Data overrun/underrun-The target attempted to transfer more data 142 than was allocated by the Data Length field or the sum of the 143 Scatter / Gather Data Length fields. */ 144 145 case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */ 146 147 case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was 148 invalid. This usually indicates a software failure. */ 149 150 case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid. 151 This usually indicates a software failure. */ 152 153 case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set 154 of linked CCB's does not specify the same logical unit number as 155 the first. */ 156 case 0x18: /* Invalid Target Direction received from Host-The direction of a 157 Target Mode CCB was invalid. */ 158 159 case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was 160 received to service data transfer between the same target LUN 161 and initiator SCSI ID in the same direction. */ 162 163 case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero 164 length segment or invalid segment list boundaries was received. 165 A CCB parameter was invalid. */ 166#ifdef DEBUG 167 printk("Aha1542: %x %x\n", hosterr, scsierr); 168#endif 169 hosterr = DID_ERROR; /* Couldn't find any better */ 170 break; 171 172 case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus 173 phase sequence was requested by the target. The host adapter 174 will generate a SCSI Reset Condition, notifying the host with 175 a SCRD interrupt */ 176 hosterr = DID_RESET; 177 break; 178 default: 179 printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr); 180 break; 181 } 182 return scsierr | (hosterr << 16); 183} 184 185static int aha1542_test_port(struct Scsi_Host *sh) 186{ 187 u8 inquiry_result[4]; 188 int i; 189 190 /* Quick and dirty test for presence of the card. */ 191 if (inb(STATUS(sh->io_port)) == 0xff) 192 return 0; 193 194 /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */ 195 196 /* In case some other card was probing here, reset interrupts */ 197 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */ 198 199 outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port)); 200 201 mdelay(20); /* Wait a little bit for things to settle down. */ 202 203 /* Expect INIT and IDLE, any of the others are bad */ 204 if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) 205 return 0; 206 207 /* Shouldn't have generated any interrupts during reset */ 208 if (inb(INTRFLAGS(sh->io_port)) & INTRMASK) 209 return 0; 210 211 /* Perform a host adapter inquiry instead so we do not need to set 212 up the mailboxes ahead of time */ 213 214 aha1542_outb(sh->io_port, CMD_INQUIRY); 215 216 for (i = 0; i < 4; i++) { 217 if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0)) 218 return 0; 219 inquiry_result[i] = inb(DATA(sh->io_port)); 220 } 221 222 /* Reading port should reset DF */ 223 if (inb(STATUS(sh->io_port)) & DF) 224 return 0; 225 226 /* When HACC, command is completed, and we're though testing */ 227 if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0)) 228 return 0; 229 230 /* Clear interrupts */ 231 outb(IRST, CONTROL(sh->io_port)); 232 233 return 1; 234} 235 236static irqreturn_t aha1542_interrupt(int irq, void *dev_id) 237{ 238 struct Scsi_Host *sh = dev_id; 239 struct aha1542_hostdata *aha1542 = shost_priv(sh); 240 void (*my_done)(struct scsi_cmnd *) = NULL; 241 int errstatus, mbi, mbo, mbistatus; 242 int number_serviced; 243 unsigned long flags; 244 struct scsi_cmnd *tmp_cmd; 245 int flag; 246 struct mailbox *mb = aha1542->mb; 247 struct ccb *ccb = aha1542->ccb; 248 249#ifdef DEBUG 250 { 251 flag = inb(INTRFLAGS(sh->io_port)); 252 shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: "); 253 if (!(flag & ANYINTR)) 254 printk("no interrupt?"); 255 if (flag & MBIF) 256 printk("MBIF "); 257 if (flag & MBOA) 258 printk("MBOF "); 259 if (flag & HACC) 260 printk("HACC "); 261 if (flag & SCRD) 262 printk("SCRD "); 263 printk("status %02x\n", inb(STATUS(sh->io_port))); 264 }; 265#endif 266 number_serviced = 0; 267 268 spin_lock_irqsave(sh->host_lock, flags); 269 while (1) { 270 flag = inb(INTRFLAGS(sh->io_port)); 271 272 /* Check for unusual interrupts. If any of these happen, we should 273 probably do something special, but for now just printing a message 274 is sufficient. A SCSI reset detected is something that we really 275 need to deal with in some way. */ 276 if (flag & ~MBIF) { 277 if (flag & MBOA) 278 printk("MBOF "); 279 if (flag & HACC) 280 printk("HACC "); 281 if (flag & SCRD) 282 printk("SCRD "); 283 } 284 aha1542_intr_reset(sh->io_port); 285 286 mbi = aha1542->aha1542_last_mbi_used + 1; 287 if (mbi >= 2 * AHA1542_MAILBOXES) 288 mbi = AHA1542_MAILBOXES; 289 290 do { 291 if (mb[mbi].status != 0) 292 break; 293 mbi++; 294 if (mbi >= 2 * AHA1542_MAILBOXES) 295 mbi = AHA1542_MAILBOXES; 296 } while (mbi != aha1542->aha1542_last_mbi_used); 297 298 if (mb[mbi].status == 0) { 299 spin_unlock_irqrestore(sh->host_lock, flags); 300 /* Hmm, no mail. Must have read it the last time around */ 301 if (!number_serviced) 302 shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n"); 303 return IRQ_HANDLED; 304 }; 305 306 mbo = (scsi2int(mb[mbi].ccbptr) - (isa_virt_to_bus(&ccb[0]))) / sizeof(struct ccb); 307 mbistatus = mb[mbi].status; 308 mb[mbi].status = 0; 309 aha1542->aha1542_last_mbi_used = mbi; 310 311#ifdef DEBUG 312 if (ccb[mbo].tarstat | ccb[mbo].hastat) 313 shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n", 314 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status); 315#endif 316 317 if (mbistatus == 3) 318 continue; /* Aborted command not found */ 319 320#ifdef DEBUG 321 shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi); 322#endif 323 324 tmp_cmd = aha1542->int_cmds[mbo]; 325 326 if (!tmp_cmd || !tmp_cmd->scsi_done) { 327 spin_unlock_irqrestore(sh->host_lock, flags); 328 shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n"); 329 shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat, 330 ccb[mbo].hastat, ccb[mbo].idlun, mbo); 331 return IRQ_HANDLED; 332 } 333 my_done = tmp_cmd->scsi_done; 334 kfree(tmp_cmd->host_scribble); 335 tmp_cmd->host_scribble = NULL; 336 /* Fetch the sense data, and tuck it away, in the required slot. The 337 Adaptec automatically fetches it, and there is no guarantee that 338 we will still have it in the cdb when we come back */ 339 if (ccb[mbo].tarstat == 2) 340 memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen], 341 SCSI_SENSE_BUFFERSIZE); 342 343 344 /* is there mail :-) */ 345 346 /* more error checking left out here */ 347 if (mbistatus != 1) 348 /* This is surely wrong, but I don't know what's right */ 349 errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat); 350 else 351 errstatus = 0; 352 353#ifdef DEBUG 354 if (errstatus) 355 shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus, 356 ccb[mbo].hastat, ccb[mbo].tarstat); 357 if (ccb[mbo].tarstat == 2) 358 print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE, &ccb[mbo].cdb[ccb[mbo].cdblen], 12); 359 if (errstatus) 360 printk("aha1542_intr_handle: returning %6x\n", errstatus); 361#endif 362 tmp_cmd->result = errstatus; 363 aha1542->int_cmds[mbo] = NULL; /* This effectively frees up the mailbox slot, as 364 far as queuecommand is concerned */ 365 my_done(tmp_cmd); 366 number_serviced++; 367 }; 368} 369 370static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd) 371{ 372 struct aha1542_hostdata *aha1542 = shost_priv(sh); 373 u8 direction; 374 u8 target = cmd->device->id; 375 u8 lun = cmd->device->lun; 376 unsigned long flags; 377 int bufflen = scsi_bufflen(cmd); 378 int mbo, sg_count; 379 struct mailbox *mb = aha1542->mb; 380 struct ccb *ccb = aha1542->ccb; 381 struct chain *cptr; 382 383 if (*cmd->cmnd == REQUEST_SENSE) { 384 /* Don't do the command - we have the sense data already */ 385 cmd->result = 0; 386 cmd->scsi_done(cmd); 387 return 0; 388 } 389#ifdef DEBUG 390 { 391 int i = -1; 392 if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10) 393 i = xscsi2int(cmd->cmnd + 2); 394 else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6) 395 i = scsi2int(cmd->cmnd + 2); 396 shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d", 397 target, *cmd->cmnd, i, bufflen); 398 print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len); 399 } 400#endif 401 if (bufflen) { /* allocate memory before taking host_lock */ 402 sg_count = scsi_sg_count(cmd); 403 cptr = kmalloc(sizeof(*cptr) * sg_count, GFP_KERNEL | GFP_DMA); 404 if (!cptr) 405 return SCSI_MLQUEUE_HOST_BUSY; 406 } 407 408 /* Use the outgoing mailboxes in a round-robin fashion, because this 409 is how the host adapter will scan for them */ 410 411 spin_lock_irqsave(sh->host_lock, flags); 412 mbo = aha1542->aha1542_last_mbo_used + 1; 413 if (mbo >= AHA1542_MAILBOXES) 414 mbo = 0; 415 416 do { 417 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL) 418 break; 419 mbo++; 420 if (mbo >= AHA1542_MAILBOXES) 421 mbo = 0; 422 } while (mbo != aha1542->aha1542_last_mbo_used); 423 424 if (mb[mbo].status || aha1542->int_cmds[mbo]) 425 panic("Unable to find empty mailbox for aha1542.\n"); 426 427 aha1542->int_cmds[mbo] = cmd; /* This will effectively prevent someone else from 428 screwing with this cdb. */ 429 430 aha1542->aha1542_last_mbo_used = mbo; 431 432#ifdef DEBUG 433 shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done); 434#endif 435 436 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */ 437 438 memset(&ccb[mbo], 0, sizeof(struct ccb)); 439 440 ccb[mbo].cdblen = cmd->cmd_len; 441 442 direction = 0; 443 if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6) 444 direction = 8; 445 else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6) 446 direction = 16; 447 448 memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen); 449 450 if (bufflen) { 451 struct scatterlist *sg; 452 int i; 453 454 ccb[mbo].op = 2; /* SCSI Initiator Command w/scatter-gather */ 455 cmd->host_scribble = (void *)cptr; 456 scsi_for_each_sg(cmd, sg, sg_count, i) { 457 any2scsi(cptr[i].dataptr, isa_page_to_bus(sg_page(sg)) 458 + sg->offset); 459 any2scsi(cptr[i].datalen, sg->length); 460 }; 461 any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain)); 462 any2scsi(ccb[mbo].dataptr, isa_virt_to_bus(cptr)); 463#ifdef DEBUG 464 shost_printk(KERN_DEBUG, sh, "cptr %p: ", cptr); 465 print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, cptr, 18); 466#endif 467 } else { 468 ccb[mbo].op = 0; /* SCSI Initiator Command */ 469 cmd->host_scribble = NULL; 470 any2scsi(ccb[mbo].datalen, 0); 471 any2scsi(ccb[mbo].dataptr, 0); 472 }; 473 ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7); /*SCSI Target Id */ 474 ccb[mbo].rsalen = 16; 475 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0; 476 ccb[mbo].commlinkid = 0; 477 478#ifdef DEBUG 479 print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10); 480 printk("aha1542_queuecommand: now waiting for interrupt "); 481#endif 482 mb[mbo].status = 1; 483 aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI); 484 spin_unlock_irqrestore(sh->host_lock, flags); 485 486 return 0; 487} 488 489/* Initialize mailboxes */ 490static void setup_mailboxes(struct Scsi_Host *sh) 491{ 492 struct aha1542_hostdata *aha1542 = shost_priv(sh); 493 int i; 494 struct mailbox *mb = aha1542->mb; 495 struct ccb *ccb = aha1542->ccb; 496 497 u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0}; 498 499 for (i = 0; i < AHA1542_MAILBOXES; i++) { 500 mb[i].status = mb[AHA1542_MAILBOXES + i].status = 0; 501 any2scsi(mb[i].ccbptr, isa_virt_to_bus(&ccb[i])); 502 }; 503 aha1542_intr_reset(sh->io_port); /* reset interrupts, so they don't block */ 504 any2scsi((mb_cmd + 2), isa_virt_to_bus(mb)); 505 if (aha1542_out(sh->io_port, mb_cmd, 5)) 506 shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n"); 507 aha1542_intr_reset(sh->io_port); 508} 509 510static int aha1542_getconfig(struct Scsi_Host *sh) 511{ 512 u8 inquiry_result[3]; 513 int i; 514 i = inb(STATUS(sh->io_port)); 515 if (i & DF) { 516 i = inb(DATA(sh->io_port)); 517 }; 518 aha1542_outb(sh->io_port, CMD_RETCONF); 519 aha1542_in(sh->io_port, inquiry_result, 3, 0); 520 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0)) 521 shost_printk(KERN_ERR, sh, "error querying board settings\n"); 522 aha1542_intr_reset(sh->io_port); 523 switch (inquiry_result[0]) { 524 case 0x80: 525 sh->dma_channel = 7; 526 break; 527 case 0x40: 528 sh->dma_channel = 6; 529 break; 530 case 0x20: 531 sh->dma_channel = 5; 532 break; 533 case 0x01: 534 sh->dma_channel = 0; 535 break; 536 case 0: 537 /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel. 538 Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */ 539 sh->dma_channel = 0xFF; 540 break; 541 default: 542 shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n"); 543 return -1; 544 }; 545 switch (inquiry_result[1]) { 546 case 0x40: 547 sh->irq = 15; 548 break; 549 case 0x20: 550 sh->irq = 14; 551 break; 552 case 0x8: 553 sh->irq = 12; 554 break; 555 case 0x4: 556 sh->irq = 11; 557 break; 558 case 0x2: 559 sh->irq = 10; 560 break; 561 case 0x1: 562 sh->irq = 9; 563 break; 564 default: 565 shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n"); 566 return -1; 567 }; 568 sh->this_id = inquiry_result[2] & 7; 569 return 0; 570} 571 572/* This function should only be called for 1542C boards - we can detect 573 the special firmware settings and unlock the board */ 574 575static int aha1542_mbenable(struct Scsi_Host *sh) 576{ 577 static u8 mbenable_cmd[3]; 578 static u8 mbenable_result[2]; 579 int retval; 580 581 retval = BIOS_TRANSLATION_6432; 582 583 aha1542_outb(sh->io_port, CMD_EXTBIOS); 584 if (aha1542_in(sh->io_port, mbenable_result, 2, 100)) 585 return retval; 586 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100)) 587 goto fail; 588 aha1542_intr_reset(sh->io_port); 589 590 if ((mbenable_result[0] & 0x08) || mbenable_result[1]) { 591 mbenable_cmd[0] = CMD_MBENABLE; 592 mbenable_cmd[1] = 0; 593 mbenable_cmd[2] = mbenable_result[1]; 594 595 if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03)) 596 retval = BIOS_TRANSLATION_25563; 597 598 if (aha1542_out(sh->io_port, mbenable_cmd, 3)) 599 goto fail; 600 }; 601 while (0) { 602fail: 603 shost_printk(KERN_ERR, sh, "Mailbox init failed\n"); 604 } 605 aha1542_intr_reset(sh->io_port); 606 return retval; 607} 608 609/* Query the board to find out if it is a 1542 or a 1740, or whatever. */ 610static int aha1542_query(struct Scsi_Host *sh) 611{ 612 struct aha1542_hostdata *aha1542 = shost_priv(sh); 613 u8 inquiry_result[4]; 614 int i; 615 i = inb(STATUS(sh->io_port)); 616 if (i & DF) { 617 i = inb(DATA(sh->io_port)); 618 }; 619 aha1542_outb(sh->io_port, CMD_INQUIRY); 620 aha1542_in(sh->io_port, inquiry_result, 4, 0); 621 if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0)) 622 shost_printk(KERN_ERR, sh, "error querying card type\n"); 623 aha1542_intr_reset(sh->io_port); 624 625 aha1542->bios_translation = BIOS_TRANSLATION_6432; /* Default case */ 626 627 /* For an AHA1740 series board, we ignore the board since there is a 628 hardware bug which can lead to wrong blocks being returned if the board 629 is operating in the 1542 emulation mode. Since there is an extended mode 630 driver, we simply ignore the board and let the 1740 driver pick it up. 631 */ 632 633 if (inquiry_result[0] == 0x43) { 634 shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n"); 635 return 1; 636 }; 637 638 /* Always call this - boards that do not support extended bios translation 639 will ignore the command, and we will set the proper default */ 640 641 aha1542->bios_translation = aha1542_mbenable(sh); 642 643 return 0; 644} 645 646static u8 dma_speed_hw(int dma_speed) 647{ 648 switch (dma_speed) { 649 case 5: 650 return 0x00; 651 case 6: 652 return 0x04; 653 case 7: 654 return 0x01; 655 case 8: 656 return 0x02; 657 case 10: 658 return 0x03; 659 } 660 661 return 0xff; /* invalid */ 662} 663 664/* Set the Bus on/off-times as not to ruin floppy performance */ 665static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed) 666{ 667 if (bus_on > 0) { 668 u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) }; 669 670 aha1542_intr_reset(sh->io_port); 671 if (aha1542_out(sh->io_port, oncmd, 2)) 672 goto fail; 673 } 674 675 if (bus_off > 0) { 676 u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) }; 677 678 aha1542_intr_reset(sh->io_port); 679 if (aha1542_out(sh->io_port, offcmd, 2)) 680 goto fail; 681 } 682 683 if (dma_speed_hw(dma_speed) != 0xff) { 684 u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) }; 685 686 aha1542_intr_reset(sh->io_port); 687 if (aha1542_out(sh->io_port, dmacmd, 2)) 688 goto fail; 689 } 690 aha1542_intr_reset(sh->io_port); 691 return; 692fail: 693 shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n"); 694 aha1542_intr_reset(sh->io_port); 695} 696 697/* return non-zero on detection */ 698static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx) 699{ 700 unsigned int base_io = io[indx]; 701 struct Scsi_Host *sh; 702 struct aha1542_hostdata *aha1542; 703 char dma_info[] = "no DMA"; 704 705 if (base_io == 0) 706 return NULL; 707 708 if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542")) 709 return NULL; 710 711 sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata)); 712 if (!sh) 713 goto release; 714 aha1542 = shost_priv(sh); 715 716 sh->unique_id = base_io; 717 sh->io_port = base_io; 718 sh->n_io_port = AHA1542_REGION_SIZE; 719 aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1; 720 aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1; 721 722 if (!aha1542_test_port(sh)) 723 goto unregister; 724 725 aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]); 726 if (aha1542_query(sh)) 727 goto unregister; 728 if (aha1542_getconfig(sh) == -1) 729 goto unregister; 730 731 if (sh->dma_channel != 0xFF) 732 snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel); 733 shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n", 734 sh->this_id, base_io, sh->irq, dma_info); 735 if (aha1542->bios_translation == BIOS_TRANSLATION_25563) 736 shost_printk(KERN_INFO, sh, "Using extended bios translation\n"); 737 738 setup_mailboxes(sh); 739 740 if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) { 741 shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n"); 742 goto unregister; 743 } 744 if (sh->dma_channel != 0xFF) { 745 if (request_dma(sh->dma_channel, "aha1542")) { 746 shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n"); 747 goto free_irq; 748 } 749 if (sh->dma_channel == 0 || sh->dma_channel >= 5) { 750 set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE); 751 enable_dma(sh->dma_channel); 752 } 753 } 754 755 if (scsi_add_host(sh, pdev)) 756 goto free_dma; 757 758 scsi_scan_host(sh); 759 760 return sh; 761free_dma: 762 if (sh->dma_channel != 0xff) 763 free_dma(sh->dma_channel); 764free_irq: 765 free_irq(sh->irq, sh); 766unregister: 767 scsi_host_put(sh); 768release: 769 release_region(base_io, AHA1542_REGION_SIZE); 770 771 return NULL; 772} 773 774static int aha1542_release(struct Scsi_Host *sh) 775{ 776 scsi_remove_host(sh); 777 if (sh->dma_channel != 0xff) 778 free_dma(sh->dma_channel); 779 if (sh->irq) 780 free_irq(sh->irq, sh); 781 if (sh->io_port && sh->n_io_port) 782 release_region(sh->io_port, sh->n_io_port); 783 scsi_host_put(sh); 784 return 0; 785} 786 787 788/* 789 * This is a device reset. This is handled by sending a special command 790 * to the device. 791 */ 792static int aha1542_dev_reset(struct scsi_cmnd *cmd) 793{ 794 struct Scsi_Host *sh = cmd->device->host; 795 struct aha1542_hostdata *aha1542 = shost_priv(sh); 796 unsigned long flags; 797 struct mailbox *mb = aha1542->mb; 798 u8 target = cmd->device->id; 799 u8 lun = cmd->device->lun; 800 int mbo; 801 struct ccb *ccb = aha1542->ccb; 802 803 spin_lock_irqsave(sh->host_lock, flags); 804 mbo = aha1542->aha1542_last_mbo_used + 1; 805 if (mbo >= AHA1542_MAILBOXES) 806 mbo = 0; 807 808 do { 809 if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL) 810 break; 811 mbo++; 812 if (mbo >= AHA1542_MAILBOXES) 813 mbo = 0; 814 } while (mbo != aha1542->aha1542_last_mbo_used); 815 816 if (mb[mbo].status || aha1542->int_cmds[mbo]) 817 panic("Unable to find empty mailbox for aha1542.\n"); 818 819 aha1542->int_cmds[mbo] = cmd; /* This will effectively 820 prevent someone else from 821 screwing with this cdb. */ 822 823 aha1542->aha1542_last_mbo_used = mbo; 824 825 any2scsi(mb[mbo].ccbptr, isa_virt_to_bus(&ccb[mbo])); /* This gets trashed for some reason */ 826 827 memset(&ccb[mbo], 0, sizeof(struct ccb)); 828 829 ccb[mbo].op = 0x81; /* BUS DEVICE RESET */ 830 831 ccb[mbo].idlun = (target & 7) << 5 | (lun & 7); /*SCSI Target Id */ 832 833 ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0; 834 ccb[mbo].commlinkid = 0; 835 836 /* 837 * Now tell the 1542 to flush all pending commands for this 838 * target 839 */ 840 aha1542_outb(sh->io_port, CMD_START_SCSI); 841 spin_unlock_irqrestore(sh->host_lock, flags); 842 843 scmd_printk(KERN_WARNING, cmd, 844 "Trying device reset for target\n"); 845 846 return SUCCESS; 847} 848 849static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd) 850{ 851 struct Scsi_Host *sh = cmd->device->host; 852 struct aha1542_hostdata *aha1542 = shost_priv(sh); 853 unsigned long flags; 854 int i; 855 856 spin_lock_irqsave(sh->host_lock, flags); 857 /* 858 * This does a scsi reset for all devices on the bus. 859 * In principle, we could also reset the 1542 - should 860 * we do this? Try this first, and we can add that later 861 * if it turns out to be useful. 862 */ 863 outb(reset_cmd, CONTROL(cmd->device->host->io_port)); 864 865 if (!wait_mask(STATUS(cmd->device->host->io_port), 866 STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) { 867 spin_unlock_irqrestore(sh->host_lock, flags); 868 return FAILED; 869 } 870 871 /* 872 * We need to do this too before the 1542 can interact with 873 * us again after host reset. 874 */ 875 if (reset_cmd & HRST) 876 setup_mailboxes(cmd->device->host); 877 878 /* 879 * Now try to pick up the pieces. For all pending commands, 880 * free any internal data structures, and basically clear things 881 * out. We do not try and restart any commands or anything - 882 * the strategy handler takes care of that crap. 883 */ 884 shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no); 885 886 for (i = 0; i < AHA1542_MAILBOXES; i++) { 887 if (aha1542->int_cmds[i] != NULL) { 888 struct scsi_cmnd *tmp_cmd; 889 tmp_cmd = aha1542->int_cmds[i]; 890 891 if (tmp_cmd->device->soft_reset) { 892 /* 893 * If this device implements the soft reset option, 894 * then it is still holding onto the command, and 895 * may yet complete it. In this case, we don't 896 * flush the data. 897 */ 898 continue; 899 } 900 kfree(tmp_cmd->host_scribble); 901 tmp_cmd->host_scribble = NULL; 902 aha1542->int_cmds[i] = NULL; 903 aha1542->mb[i].status = 0; 904 } 905 } 906 907 spin_unlock_irqrestore(sh->host_lock, flags); 908 return SUCCESS; 909} 910 911static int aha1542_bus_reset(struct scsi_cmnd *cmd) 912{ 913 return aha1542_reset(cmd, SCRST); 914} 915 916static int aha1542_host_reset(struct scsi_cmnd *cmd) 917{ 918 return aha1542_reset(cmd, HRST | SCRST); 919} 920 921static int aha1542_biosparam(struct scsi_device *sdev, 922 struct block_device *bdev, sector_t capacity, int geom[]) 923{ 924 struct aha1542_hostdata *aha1542 = shost_priv(sdev->host); 925 926 if (capacity >= 0x200000 && 927 aha1542->bios_translation == BIOS_TRANSLATION_25563) { 928 /* Please verify that this is the same as what DOS returns */ 929 geom[0] = 255; /* heads */ 930 geom[1] = 63; /* sectors */ 931 } else { 932 geom[0] = 64; /* heads */ 933 geom[1] = 32; /* sectors */ 934 } 935 geom[2] = sector_div(capacity, geom[0] * geom[1]); /* cylinders */ 936 937 return 0; 938} 939MODULE_LICENSE("GPL"); 940 941static struct scsi_host_template driver_template = { 942 .module = THIS_MODULE, 943 .proc_name = "aha1542", 944 .name = "Adaptec 1542", 945 .queuecommand = aha1542_queuecommand, 946 .eh_device_reset_handler= aha1542_dev_reset, 947 .eh_bus_reset_handler = aha1542_bus_reset, 948 .eh_host_reset_handler = aha1542_host_reset, 949 .bios_param = aha1542_biosparam, 950 .can_queue = AHA1542_MAILBOXES, 951 .this_id = 7, 952 .sg_tablesize = 16, 953 .cmd_per_lun = 1, 954 .unchecked_isa_dma = 1, 955 .use_clustering = ENABLE_CLUSTERING, 956}; 957 958static int aha1542_isa_match(struct device *pdev, unsigned int ndev) 959{ 960 struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev); 961 962 if (!sh) 963 return 0; 964 965 dev_set_drvdata(pdev, sh); 966 return 1; 967} 968 969static int aha1542_isa_remove(struct device *pdev, 970 unsigned int ndev) 971{ 972 aha1542_release(dev_get_drvdata(pdev)); 973 dev_set_drvdata(pdev, NULL); 974 return 0; 975} 976 977static struct isa_driver aha1542_isa_driver = { 978 .match = aha1542_isa_match, 979 .remove = aha1542_isa_remove, 980 .driver = { 981 .name = "aha1542" 982 }, 983}; 984static int isa_registered; 985 986#ifdef CONFIG_PNP 987static struct pnp_device_id aha1542_pnp_ids[] = { 988 { .id = "ADP1542" }, 989 { .id = "" } 990}; 991MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids); 992 993static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id) 994{ 995 int indx; 996 struct Scsi_Host *sh; 997 998 for (indx = 0; indx < ARRAY_SIZE(io); indx++) { 999 if (io[indx]) 1000 continue; 1001 1002 if (pnp_activate_dev(pdev) < 0) 1003 continue; 1004 1005 io[indx] = pnp_port_start(pdev, 0); 1006 1007 /* The card can be queried for its DMA, we have 1008 the DMA set up that is enough */ 1009 1010 dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]); 1011 } 1012 1013 sh = aha1542_hw_init(&driver_template, &pdev->dev, indx); 1014 if (!sh) 1015 return -ENODEV; 1016 1017 pnp_set_drvdata(pdev, sh); 1018 return 0; 1019} 1020 1021static void aha1542_pnp_remove(struct pnp_dev *pdev) 1022{ 1023 aha1542_release(pnp_get_drvdata(pdev)); 1024 pnp_set_drvdata(pdev, NULL); 1025} 1026 1027static struct pnp_driver aha1542_pnp_driver = { 1028 .name = "aha1542", 1029 .id_table = aha1542_pnp_ids, 1030 .probe = aha1542_pnp_probe, 1031 .remove = aha1542_pnp_remove, 1032}; 1033static int pnp_registered; 1034#endif /* CONFIG_PNP */ 1035 1036static int __init aha1542_init(void) 1037{ 1038 int ret = 0; 1039 1040#ifdef CONFIG_PNP 1041 if (isapnp) { 1042 ret = pnp_register_driver(&aha1542_pnp_driver); 1043 if (!ret) 1044 pnp_registered = 1; 1045 } 1046#endif 1047 ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS); 1048 if (!ret) 1049 isa_registered = 1; 1050 1051#ifdef CONFIG_PNP 1052 if (pnp_registered) 1053 ret = 0; 1054#endif 1055 if (isa_registered) 1056 ret = 0; 1057 1058 return ret; 1059} 1060 1061static void __exit aha1542_exit(void) 1062{ 1063#ifdef CONFIG_PNP 1064 if (pnp_registered) 1065 pnp_unregister_driver(&aha1542_pnp_driver); 1066#endif 1067 if (isa_registered) 1068 isa_unregister_driver(&aha1542_isa_driver); 1069} 1070 1071module_init(aha1542_init); 1072module_exit(aha1542_exit); 1073