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