|
|
1.1 ! root 1: /* ! 2: * hosts.c Copyright (C) 1992 Drew Eckhardt ! 3: * Copyright (C) 1993, 1994, 1995 Eric Youngdale ! 4: * ! 5: * mid to lowlevel SCSI driver interface ! 6: * Initial versions: Drew Eckhardt ! 7: * Subsequent revisions: Eric Youngdale ! 8: * ! 9: * <[email protected]> ! 10: */ ! 11: ! 12: ! 13: /* ! 14: * This file contains the medium level SCSI ! 15: * host interface initialization, as well as the scsi_hosts array of SCSI ! 16: * hosts currently present in the system. ! 17: */ ! 18: ! 19: /* ! 20: * Don't import our own symbols, as this would severely mess up our ! 21: * symbol tables. ! 22: */ ! 23: #define _SCSI_SYMS_VER_ ! 24: #define __NO_VERSION__ ! 25: #include <linux/module.h> ! 26: ! 27: #include <linux/config.h> ! 28: #include <linux/blk.h> ! 29: #include <linux/kernel.h> ! 30: #include <linux/string.h> ! 31: #include <linux/mm.h> ! 32: #include <linux/proc_fs.h> ! 33: ! 34: #include "scsi.h" ! 35: ! 36: #ifndef NULL ! 37: #define NULL 0L ! 38: #endif ! 39: ! 40: #define HOSTS_C ! 41: ! 42: #include "hosts.h" ! 43: ! 44: #ifdef CONFIG_A3000_SCSI ! 45: #include "a3000.h" ! 46: #endif ! 47: ! 48: #ifdef CONFIG_A2091_SCSI ! 49: #include "a2091.h" ! 50: #endif ! 51: ! 52: #ifdef CONFIG_GVP11_SCSI ! 53: #include "gvp11.h" ! 54: #endif ! 55: ! 56: #ifdef CONFIG_ATARI_SCSI ! 57: #include "atari_scsi.h" ! 58: #endif ! 59: ! 60: #ifdef CONFIG_SCSI_ADVANSYS ! 61: #include "advansys.h" ! 62: #endif ! 63: ! 64: #ifdef CONFIG_SCSI_AHA152X ! 65: #include "aha152x.h" ! 66: #endif ! 67: ! 68: #ifdef CONFIG_SCSI_AHA1542 ! 69: #include "aha1542.h" ! 70: #endif ! 71: ! 72: #ifdef CONFIG_SCSI_AHA1740 ! 73: #include "aha1740.h" ! 74: #endif ! 75: ! 76: #ifdef CONFIG_SCSI_AIC7XXX ! 77: #include "aic7xxx.h" ! 78: #endif ! 79: ! 80: #ifdef CONFIG_SCSI_BUSLOGIC ! 81: #include "BusLogic.h" ! 82: #endif ! 83: ! 84: #ifdef CONFIG_SCSI_EATA_DMA ! 85: #include "eata_dma.h" ! 86: #endif ! 87: ! 88: #ifdef CONFIG_SCSI_EATA_PIO ! 89: #include "eata_pio.h" ! 90: #endif ! 91: ! 92: #ifdef CONFIG_SCSI_U14_34F ! 93: #include "u14-34f.h" ! 94: #endif ! 95: ! 96: #ifdef CONFIG_SCSI_FUTURE_DOMAIN ! 97: #include "fdomain.h" ! 98: #endif ! 99: ! 100: #ifdef CONFIG_SCSI_GENERIC_NCR5380 ! 101: #include "g_NCR5380.h" ! 102: #endif ! 103: ! 104: #ifdef CONFIG_SCSI_IN2000 ! 105: #include "in2000.h" ! 106: #endif ! 107: ! 108: #ifdef CONFIG_SCSI_PAS16 ! 109: #include "pas16.h" ! 110: #endif ! 111: ! 112: #ifdef CONFIG_SCSI_QLOGIC_FAS ! 113: #include "qlogicfas.h" ! 114: #endif ! 115: ! 116: #ifdef CONFIG_SCSI_QLOGIC_ISP ! 117: #include "qlogicisp.h" ! 118: #endif ! 119: ! 120: #ifdef CONFIG_SCSI_SEAGATE ! 121: #include "seagate.h" ! 122: #endif ! 123: ! 124: #ifdef CONFIG_SCSI_T128 ! 125: #include "t128.h" ! 126: #endif ! 127: ! 128: #ifdef CONFIG_SCSI_DTC3280 ! 129: #include "dtc.h" ! 130: #endif ! 131: ! 132: #ifdef CONFIG_SCSI_NCR53C7xx ! 133: #include "53c7,8xx.h" ! 134: #endif ! 135: ! 136: #ifdef CONFIG_SCSI_NCR53C8XX ! 137: #include "ncr53c8xx.h" ! 138: #endif ! 139: ! 140: #ifdef CONFIG_SCSI_ULTRASTOR ! 141: #include "ultrastor.h" ! 142: #endif ! 143: ! 144: #ifdef CONFIG_SCSI_7000FASST ! 145: #include "wd7000.h" ! 146: #endif ! 147: ! 148: #ifdef CONFIG_SCSI_EATA ! 149: #include "eata.h" ! 150: #endif ! 151: ! 152: #ifdef CONFIG_SCSI_NCR53C406A ! 153: #include "NCR53c406a.h" ! 154: #endif ! 155: ! 156: #ifdef CONFIG_SCSI_DC390W ! 157: #include "dc390w.h" ! 158: #endif ! 159: ! 160: #ifdef CONFIG_SCSI_DC390T ! 161: #include "dc390.h" ! 162: #endif ! 163: ! 164: #ifdef CONFIG_SCSI_AM53C974 ! 165: #include "AM53C974.h" ! 166: #endif ! 167: ! 168: #ifdef CONFIG_SCSI_MEGARAID ! 169: #include "megaraid.h" ! 170: #endif ! 171: ! 172: #ifdef CONFIG_SCSI_PPA ! 173: #include "ppa.h" ! 174: #endif ! 175: ! 176: #ifdef CONFIG_SCSI_SUNESP ! 177: #include "esp.h" ! 178: #endif ! 179: ! 180: #ifdef CONFIG_BLK_DEV_IDESCSI ! 181: #include "ide-scsi.h" ! 182: #endif ! 183: ! 184: #ifdef CONFIG_SCSI_GDTH ! 185: #include "gdth.h" ! 186: #endif ! 187: ! 188: #ifdef CONFIG_SCSI_DEBUG ! 189: #include "scsi_debug.h" ! 190: #endif ! 191: ! 192: ! 193: /* ! 194: static const char RCSid[] = "$Header: /afs/sipb.mit.edu/project/hurddev/cvsroot/gnumach/linux/dev/drivers/scsi/hosts.c,v 1.1 1999/04/26 05:44:25 tb Exp $"; ! 195: */ ! 196: ! 197: /* ! 198: * The scsi host entries should be in the order you wish the ! 199: * cards to be detected. A driver may appear more than once IFF ! 200: * it can deal with being detected (and therefore initialized) ! 201: * with more than one simultaneous host number, can handle being ! 202: * reentrant, etc. ! 203: * ! 204: * They may appear in any order, as each SCSI host is told which host ! 205: * number it is during detection. ! 206: */ ! 207: ! 208: /* This is a placeholder for controllers that are not configured into ! 209: * the system - we do this to ensure that the controller numbering is ! 210: * always consistent, no matter how the kernel is configured. */ ! 211: ! 212: #define NO_CONTROLLER {NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ ! 213: NULL, NULL, 0, 0, 0, 0, 0, 0} ! 214: ! 215: /* ! 216: * When figure is run, we don't want to link to any object code. Since ! 217: * the macro for each host will contain function pointers, we cannot ! 218: * use it and instead must use a "blank" that does no such ! 219: * idiocy. ! 220: */ ! 221: ! 222: Scsi_Host_Template * scsi_hosts = NULL; ! 223: ! 224: static Scsi_Host_Template builtin_scsi_hosts[] = ! 225: { ! 226: #ifdef CONFIG_AMIGA ! 227: #ifdef CONFIG_A3000_SCSI ! 228: A3000_SCSI, ! 229: #endif ! 230: #ifdef CONFIG_A2091_SCSI ! 231: A2091_SCSI, ! 232: #endif ! 233: #ifdef CONFIG_GVP11_SCSI ! 234: GVP11_SCSI, ! 235: #endif ! 236: #endif ! 237: ! 238: #ifdef CONFIG_ATARI ! 239: #ifdef CONFIG_ATARI_SCSI ! 240: ATARI_SCSI, ! 241: #endif ! 242: #endif ! 243: ! 244: #ifdef CONFIG_SCSI_ADVANSYS ! 245: ADVANSYS, ! 246: #endif ! 247: /* BusLogic must come before aha1542.c */ ! 248: #ifdef CONFIG_SCSI_BUSLOGIC ! 249: BUSLOGIC, ! 250: #endif ! 251: #ifdef CONFIG_SCSI_U14_34F ! 252: ULTRASTOR_14_34F, ! 253: #endif ! 254: #ifdef CONFIG_SCSI_ULTRASTOR ! 255: ULTRASTOR_14F, ! 256: #endif ! 257: #ifdef CONFIG_SCSI_AHA152X ! 258: AHA152X, ! 259: #endif ! 260: #ifdef CONFIG_SCSI_AHA1542 ! 261: AHA1542, ! 262: #endif ! 263: #ifdef CONFIG_SCSI_AHA1740 ! 264: AHA1740, ! 265: #endif ! 266: #ifdef CONFIG_SCSI_AIC7XXX ! 267: AIC7XXX, ! 268: #endif ! 269: #ifdef CONFIG_SCSI_FUTURE_DOMAIN ! 270: FDOMAIN_16X0, ! 271: #endif ! 272: #ifdef CONFIG_SCSI_IN2000 ! 273: IN2000, ! 274: #endif ! 275: #ifdef CONFIG_SCSI_GENERIC_NCR5380 ! 276: GENERIC_NCR5380, ! 277: #endif ! 278: #ifdef CONFIG_SCSI_NCR53C406A /* 53C406A should come before QLOGIC */ ! 279: NCR53c406a, ! 280: #endif ! 281: #ifdef CONFIG_SCSI_QLOGIC_FAS ! 282: QLOGICFAS, ! 283: #endif ! 284: #ifdef CONFIG_SCSI_QLOGIC_ISP ! 285: QLOGICISP, ! 286: #endif ! 287: #ifdef CONFIG_SCSI_PAS16 ! 288: MV_PAS16, ! 289: #endif ! 290: #ifdef CONFIG_SCSI_SEAGATE ! 291: SEAGATE_ST0X, ! 292: #endif ! 293: #ifdef CONFIG_SCSI_T128 ! 294: TRANTOR_T128, ! 295: #endif ! 296: #ifdef CONFIG_SCSI_DTC3280 ! 297: DTC3x80, ! 298: #endif ! 299: #ifdef CONFIG_SCSI_DC390T ! 300: DC390_T, ! 301: #endif ! 302: #ifdef CONFIG_SCSI_NCR53C7xx ! 303: NCR53c7xx, ! 304: #endif ! 305: #ifdef CONFIG_SCSI_NCR53C8XX ! 306: NCR53C8XX, ! 307: #endif ! 308: #ifdef CONFIG_SCSI_EATA_DMA ! 309: EATA_DMA, ! 310: #endif ! 311: #ifdef CONFIG_SCSI_EATA_PIO ! 312: EATA_PIO, ! 313: #endif ! 314: #ifdef CONFIG_SCSI_7000FASST ! 315: WD7000, ! 316: #endif ! 317: #ifdef CONFIG_SCSI_EATA ! 318: EATA, ! 319: #endif ! 320: #ifdef CONFIG_SCSI_AM53C974 ! 321: AM53C974, ! 322: #endif ! 323: #ifdef CONFIG_SCSI_MEGARAID ! 324: MEGARAID, ! 325: #endif ! 326: #ifdef CONFIG_SCSI_PPA ! 327: PPA, ! 328: #endif ! 329: #ifdef CONFIG_SCSI_SUNESP ! 330: SCSI_SPARC_ESP, ! 331: #endif ! 332: #ifdef CONFIG_SCSI_GDTH ! 333: GDTH, ! 334: #endif ! 335: #ifdef CONFIG_BLK_DEV_IDESCSI ! 336: IDESCSI, ! 337: #endif ! 338: #ifdef CONFIG_SCSI_DEBUG ! 339: SCSI_DEBUG, ! 340: #endif ! 341: }; ! 342: ! 343: #define MAX_SCSI_HOSTS (sizeof(builtin_scsi_hosts) / sizeof(Scsi_Host_Template)) ! 344: ! 345: ! 346: /* ! 347: * Our semaphores and timeout counters, where size depends on ! 348: * MAX_SCSI_HOSTS here. ! 349: */ ! 350: ! 351: struct Scsi_Host * scsi_hostlist = NULL; ! 352: struct Scsi_Device_Template * scsi_devicelist = NULL; ! 353: ! 354: int max_scsi_hosts = 0; ! 355: int next_scsi_host = 0; ! 356: ! 357: void ! 358: scsi_unregister(struct Scsi_Host * sh){ ! 359: struct Scsi_Host * shpnt; ! 360: ! 361: if(scsi_hostlist == sh) ! 362: scsi_hostlist = sh->next; ! 363: else { ! 364: shpnt = scsi_hostlist; ! 365: while(shpnt->next != sh) shpnt = shpnt->next; ! 366: shpnt->next = shpnt->next->next; ! 367: } ! 368: ! 369: /* If we are removing the last host registered, it is safe to reuse ! 370: * its host number (this avoids "holes" at boot time) (DB) ! 371: * It is also safe to reuse those of numbers directly below which have ! 372: * been released earlier (to avoid some holes in numbering). ! 373: */ ! 374: if(sh->host_no == max_scsi_hosts - 1) { ! 375: while(--max_scsi_hosts >= next_scsi_host) { ! 376: shpnt = scsi_hostlist; ! 377: while(shpnt && shpnt->host_no != max_scsi_hosts - 1) ! 378: shpnt = shpnt->next; ! 379: if(shpnt) ! 380: break; ! 381: } ! 382: } ! 383: next_scsi_host--; ! 384: scsi_init_free((char *) sh, sizeof(struct Scsi_Host) + sh->extra_bytes); ! 385: } ! 386: ! 387: /* We call this when we come across a new host adapter. We only do this ! 388: * once we are 100% sure that we want to use this host adapter - it is a ! 389: * pain to reverse this, so we try to avoid it ! 390: */ ! 391: ! 392: struct Scsi_Host * scsi_register(Scsi_Host_Template * tpnt, int j){ ! 393: struct Scsi_Host * retval, *shpnt; ! 394: retval = (struct Scsi_Host *)scsi_init_malloc(sizeof(struct Scsi_Host) + j, ! 395: (tpnt->unchecked_isa_dma && j ? GFP_DMA : 0) | GFP_ATOMIC); ! 396: retval->host_busy = 0; ! 397: retval->block = NULL; ! 398: retval->wish_block = 0; ! 399: if(j > 0xffff) panic("Too many extra bytes requested\n"); ! 400: retval->extra_bytes = j; ! 401: retval->loaded_as_module = scsi_loadable_module_flag; ! 402: retval->host_no = max_scsi_hosts++; /* never reuse host_no (DB) */ ! 403: next_scsi_host++; ! 404: retval->host_queue = NULL; ! 405: retval->host_wait = NULL; ! 406: retval->last_reset = 0; ! 407: retval->irq = 0; ! 408: retval->dma_channel = 0xff; ! 409: ! 410: /* These three are default values which can be overridden */ ! 411: retval->max_channel = 0; ! 412: retval->max_id = 8; ! 413: retval->max_lun = 8; ! 414: ! 415: retval->unique_id = 0; ! 416: retval->io_port = 0; ! 417: retval->hostt = tpnt; ! 418: retval->next = NULL; ! 419: #ifdef DEBUG ! 420: printk("Register %x %x: %d\n", (int)retval, (int)retval->hostt, j); ! 421: #endif ! 422: ! 423: /* The next six are the default values which can be overridden ! 424: * if need be */ ! 425: retval->this_id = tpnt->this_id; ! 426: retval->can_queue = tpnt->can_queue; ! 427: retval->sg_tablesize = tpnt->sg_tablesize; ! 428: retval->cmd_per_lun = tpnt->cmd_per_lun; ! 429: retval->unchecked_isa_dma = tpnt->unchecked_isa_dma; ! 430: retval->use_clustering = tpnt->use_clustering; ! 431: ! 432: retval->select_queue_depths = NULL; ! 433: ! 434: if(!scsi_hostlist) ! 435: scsi_hostlist = retval; ! 436: else ! 437: { ! 438: shpnt = scsi_hostlist; ! 439: while(shpnt->next) shpnt = shpnt->next; ! 440: shpnt->next = retval; ! 441: } ! 442: ! 443: return retval; ! 444: } ! 445: ! 446: int ! 447: scsi_register_device(struct Scsi_Device_Template * sdpnt) ! 448: { ! 449: if(sdpnt->next) panic("Device already registered"); ! 450: sdpnt->next = scsi_devicelist; ! 451: scsi_devicelist = sdpnt; ! 452: return 0; ! 453: } ! 454: ! 455: unsigned int scsi_init() ! 456: { ! 457: static int called = 0; ! 458: int i, pcount; ! 459: Scsi_Host_Template * tpnt; ! 460: struct Scsi_Host * shpnt; ! 461: const char * name; ! 462: ! 463: if(called) return 0; ! 464: ! 465: called = 1; ! 466: for (tpnt = &builtin_scsi_hosts[0], i = 0; i < MAX_SCSI_HOSTS; ++i, tpnt++) ! 467: { ! 468: /* ! 469: * Initialize our semaphores. -1 is interpreted to mean ! 470: * "inactive" - where as 0 will indicate a time out condition. ! 471: */ ! 472: ! 473: pcount = next_scsi_host; ! 474: if ((tpnt->detect) && ! 475: (tpnt->present = ! 476: tpnt->detect(tpnt))) ! 477: { ! 478: /* The only time this should come up is when people use ! 479: * some kind of patched driver of some kind or another. */ ! 480: if(pcount == next_scsi_host) { ! 481: if(tpnt->present > 1) ! 482: panic("Failure to register low-level scsi driver"); ! 483: /* The low-level driver failed to register a driver. We ! 484: * can do this now. */ ! 485: scsi_register(tpnt,0); ! 486: } ! 487: tpnt->next = scsi_hosts; ! 488: scsi_hosts = tpnt; ! 489: ! 490: /* Add the driver to /proc/scsi */ ! 491: #if CONFIG_PROC_FS ! 492: build_proc_dir_entries(tpnt); ! 493: #endif ! 494: } ! 495: } ! 496: ! 497: for(shpnt=scsi_hostlist; shpnt; shpnt = shpnt->next) ! 498: { ! 499: if(shpnt->hostt->info) ! 500: name = shpnt->hostt->info(shpnt); ! 501: else ! 502: name = shpnt->hostt->name; ! 503: printk ("scsi%d : %s\n", /* And print a little message */ ! 504: shpnt->host_no, name); ! 505: } ! 506: ! 507: printk ("scsi : %d host%s.\n", next_scsi_host, ! 508: (next_scsi_host == 1) ? "" : "s"); ! 509: ! 510: scsi_make_blocked_list(); ! 511: ! 512: /* Now attach the high level drivers */ ! 513: #ifdef CONFIG_BLK_DEV_SD ! 514: scsi_register_device(&sd_template); ! 515: #endif ! 516: #ifdef CONFIG_BLK_DEV_SR ! 517: scsi_register_device(&sr_template); ! 518: #endif ! 519: #ifdef CONFIG_CHR_DEV_ST ! 520: scsi_register_device(&st_template); ! 521: #endif ! 522: #ifdef CONFIG_CHR_DEV_SG ! 523: scsi_register_device(&sg_template); ! 524: #endif ! 525: ! 526: #if 0 ! 527: max_scsi_hosts = next_scsi_host; ! 528: #endif ! 529: return 0; ! 530: } ! 531: ! 532: /* ! 533: * Overrides for Emacs so that we follow Linus's tabbing style. ! 534: * Emacs will notice this stuff at the end of the file and automatically ! 535: * adjust the settings for this buffer only. This must remain at the end ! 536: * of the file. ! 537: * --------------------------------------------------------------------------- ! 538: * Local variables: ! 539: * c-indent-level: 4 ! 540: * c-brace-imaginary-offset: 0 ! 541: * c-brace-offset: -4 ! 542: * c-argdecl-indent: 4 ! 543: * c-label-offset: -4 ! 544: * c-continued-statement-offset: 4 ! 545: * c-continued-brace-offset: 0 ! 546: * indent-tabs-mode: nil ! 547: * tab-width: 8 ! 548: * End: ! 549: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.