|
|
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.