This source file includes following definitions.
- blacklisted
- scsi_make_blocked_list
- scan_scsis_done
- scsi_luns_setup
- scan_scsis
- scsi_times_out
- request_queueable
- allocate_device
- internal_cmnd
- scsi_request_sense
- scsi_do_cmd
- reset
- check_sense
- scsi_done
- scsi_abort
- scsi_reset
- scsi_main_timeout
- update_timeout
- scsi_malloc
- scsi_free
- scsi_init_malloc
- scsi_init_free
- scsi_dev_init
- print_inquiry
- scsi_register_host
- scsi_unregister_host
- scsi_register_module
- scsi_unregister_module
- scsi_dump_status
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <asm/system.h>
22 #include <linux/sched.h>
23 #include <linux/timer.h>
24 #include <linux/string.h>
25 #include <linux/malloc.h>
26 #include <asm/irq.h>
27 #include <asm/dma.h>
28 #include <linux/ioport.h>
29
30 #include "../block/blk.h"
31 #include "scsi.h"
32 #include "hosts.h"
33 #include "constants.h"
34
35 #undef USE_STATIC_SCSI_MEMORY
36
37
38
39
40
41
42 const unsigned char scsi_command_size[8] = { 6, 10, 10, 12, 12, 12, 10, 10 };
43
44 #define INTERNAL_ERROR (panic ("Internal error in file %s, line %d.\n", __FILE__, __LINE__))
45
46 static void scsi_done (Scsi_Cmnd *SCpnt);
47 static int update_timeout (Scsi_Cmnd *, int);
48 static void print_inquiry(unsigned char *data);
49 static void scsi_times_out (Scsi_Cmnd * SCpnt, int pid);
50
51 static int time_start;
52 static int time_elapsed;
53 static volatile struct Scsi_Host * host_active = NULL;
54 #define SCSI_BLOCK(HOST) ((HOST->block && host_active && HOST != host_active) \
55 || (HOST->can_queue && HOST->host_busy >= HOST->can_queue))
56
57 #define MAX_SCSI_DEVICE_CODE 10
58 const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE] =
59 {
60 "Direct-Access ",
61 "Sequential-Access",
62 "Printer ",
63 "Processor ",
64 "WORM ",
65 "CD-ROM ",
66 "Scanner ",
67 "Optical Device ",
68 "Medium Changer ",
69 "Communications "
70 };
71
72
73
74
75
76
77
78
79 Scsi_Device * scsi_devices = NULL;
80
81
82 unsigned long scsi_pid = 0;
83
84 static unsigned char generic_sense[6] = {REQUEST_SENSE, 0,0,0, 255, 0};
85
86
87 Scsi_Cmnd * last_cmnd = NULL;
88
89
90
91
92
93
94
95 #define WAS_RESET 0x01
96 #define WAS_TIMEDOUT 0x02
97 #define WAS_SENSE 0x04
98 #define IS_RESETTING 0x08
99 #define IS_ABORTING 0x10
100 #define ASKED_FOR_SENSE 0x20
101
102
103
104
105
106
107
108
109
110
111
112 #ifdef DEBUG_TIMEOUT
113 static void scsi_dump_status(void);
114 #endif
115
116
117 #ifdef DEBUG
118 #define SCSI_TIMEOUT 500
119 #else
120 #define SCSI_TIMEOUT 100
121 #endif
122
123 #ifdef DEBUG
124 #define SENSE_TIMEOUT SCSI_TIMEOUT
125 #define ABORT_TIMEOUT SCSI_TIMEOUT
126 #define RESET_TIMEOUT SCSI_TIMEOUT
127 #else
128 #define SENSE_TIMEOUT 50
129 #define RESET_TIMEOUT 50
130 #define ABORT_TIMEOUT 50
131 #endif
132
133 #define MIN_RESET_DELAY 100
134
135
136 #define MIN_RESET_PERIOD 1000
137
138
139
140
141
142 struct blist{
143 char * vendor;
144 char * model;
145 char * revision;
146 };
147
148 static struct blist blacklist[] =
149 {
150 {"CHINON","CD-ROM CDS-431","H42"},
151 {"CHINON","CD-ROM CDS-535","Q14"},
152 {"DENON","DRD-25X","V"},
153 {"HITACHI","DK312C","CM81"},
154 {"HITACHI","DK314C","CR21" },
155 {"IMS", "CDD521/10","2.06"},
156 {"MAXTOR","XT-3280","PR02"},
157 {"MAXTOR","XT-4380S","B3C"},
158 {"MAXTOR","MXT-1240S","I1.2"},
159 {"MAXTOR","XT-4170S","B5A"},
160 {"MAXTOR","XT-8760S","B7B"},
161 {"NEC","CD-ROM DRIVE:841","1.0"},
162 {"RODIME","RO3000S","2.33"},
163 {"SEAGATE", "ST157N", "\004|j"},
164
165 {"SEAGATE", "ST296","921"},
166 {"SONY","CD-ROM CDU-541","4.3d"},
167 {"SONY","CD-ROM CDU-55S","1.0i"},
168 {"TANDBERG","TDC 3600","U07"},
169 {"TEAC","CD-ROM","1.06"},
170
171 {"TEXEL","CD-ROM","1.06"},
172
173 {"QUANTUM","LPS525S","3110"},
174 {"QUANTUM","PD1225S","3110"},
175 {"MEDIAVIS","CDR-H93MV","1.31"},
176 {"SANKYO", "CP525","6.64"},
177 {"HP", "C1750A", "3226"},
178 {"HP", "C1790A", ""},
179 {"HP", "C2500A", ""},
180 {NULL, NULL, NULL}};
181
182 static int blacklisted(unsigned char * response_data){
183 int i = 0;
184 unsigned char * pnt;
185 for(i=0; 1; i++){
186 if(blacklist[i].vendor == NULL) return 0;
187 pnt = &response_data[8];
188 while(*pnt && *pnt == ' ') pnt++;
189 if(memcmp(blacklist[i].vendor, pnt,
190 strlen(blacklist[i].vendor))) continue;
191 pnt = &response_data[16];
192 while(*pnt && *pnt == ' ') pnt++;
193 if(memcmp(blacklist[i].model, pnt,
194 strlen(blacklist[i].model))) continue;
195 return 1;
196 }
197 }
198
199
200
201
202
203
204
205
206
207
208 volatile int in_scan_scsis = 0;
209 static int the_result;
210
211 void scsi_make_blocked_list(void) {
212 int block_count = 0, index;
213 unsigned int flags;
214 struct Scsi_Host * sh[128], * shpnt;
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234 save_flags(flags);
235 cli();
236 host_active = NULL;
237
238 for(shpnt=scsi_hostlist; shpnt; shpnt = shpnt->next) {
239
240 #if 0
241
242
243
244
245
246 if (shpnt->unchecked_isa_dma) shpnt->wish_block = 1;
247 #endif
248
249 if (shpnt->wish_block) sh[block_count++] = shpnt;
250 }
251
252 if (block_count == 1) sh[0]->block = NULL;
253
254 else if (block_count > 1) {
255
256 for(index = 0; index < block_count - 1; index++) {
257 sh[index]->block = sh[index + 1];
258 printk("scsi%d : added to blocked host list.\n",
259 sh[index]->host_no);
260 }
261
262 sh[block_count - 1]->block = sh[0];
263 printk("scsi%d : added to blocked host list.\n",
264 sh[index]->host_no);
265 }
266
267 restore_flags(flags);
268 }
269
270 static void scan_scsis_done (Scsi_Cmnd * SCpnt)
271 {
272
273 #ifdef DEBUG
274 printk ("scan_scsis_done(%d, %06x)\n", SCpnt->host, SCpnt->result);
275 #endif
276 SCpnt->request.dev = 0xfffe;
277
278 if (SCpnt->request.sem != NULL)
279 up(SCpnt->request.sem);
280 }
281
282 #ifdef CONFIG_SCSI_MULTI_LUN
283 static int max_scsi_luns = 8;
284 #else
285 static int max_scsi_luns = 1;
286 #endif
287
288 void scsi_luns_setup(char *str, int *ints) {
289 if (ints[0] != 1)
290 printk("scsi_luns_setup : usage max_scsi_luns=n (n should be between 1 and 8)\n");
291 else
292 max_scsi_luns = ints[1];
293 }
294
295
296
297
298
299
300
301
302
303 void scan_scsis (struct Scsi_Host * shpnt)
304 {
305 int dev, lun, type;
306 unsigned char scsi_cmd [12];
307 unsigned char scsi_result0 [256];
308 unsigned char * scsi_result;
309 Scsi_Device * SDpnt, *SDtail;
310 struct Scsi_Device_Template * sdtpnt;
311 Scsi_Cmnd *SCpnt;
312
313 ++in_scan_scsis;
314 lun = 0;
315 type = -1;
316 SCpnt = (Scsi_Cmnd *) scsi_init_malloc(sizeof(Scsi_Cmnd), GFP_ATOMIC|GFP_DMA);
317 SDpnt = (Scsi_Device *) scsi_init_malloc(sizeof (Scsi_Device), GFP_ATOMIC);
318 SDtail = scsi_devices;
319
320 if(scsi_devices) while(SDtail->next) SDtail = SDtail->next;
321
322
323 scsi_result = ((current == task[0] || !shpnt->unchecked_isa_dma)
324 ? &scsi_result0[0] : scsi_malloc(512));
325
326
327 shpnt->host_queue = SCpnt;
328
329 for (dev = 0; dev < 8; ++dev)
330 if (shpnt->this_id != dev)
331
332
333
334
335 for (lun = 0; lun < max_scsi_luns; ++lun)
336 {
337 memset(SDpnt, 0, sizeof(Scsi_Device));
338 SDpnt->host = shpnt;
339 SDpnt->id = dev;
340 SDpnt->lun = lun;
341
342
343 SDpnt->type = -1;
344
345
346
347
348 SDpnt->borken = 1;
349
350 scsi_cmd[0] = TEST_UNIT_READY;
351 scsi_cmd[1] = lun << 5;
352 scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[4] = scsi_cmd[5] = 0;
353
354 memset(SCpnt, 0, sizeof(Scsi_Cmnd));
355 SCpnt->host = SDpnt->host;
356 SCpnt->device = SDpnt;
357 SCpnt->target = SDpnt->id;
358 SCpnt->lun = SDpnt->lun;
359
360
361 SCpnt->request.sem = NULL;
362
363 SCpnt->request.dev = 0xffff;
364
365 scsi_do_cmd (SCpnt, (void *) scsi_cmd, (void *) scsi_result,
366 256, scan_scsis_done, SCSI_TIMEOUT + 400, 5);
367
368
369
370
371 if (current == task[0])
372 while (SCpnt->request.dev != 0xfffe);
373 else if (SCpnt->request.dev != 0xfffe) {
374 struct semaphore sem = MUTEX_LOCKED;
375
376 SCpnt->request.sem = &sem;
377 down(&sem);
378
379
380 while (SCpnt->request.dev != 0xfffe) schedule();
381 }
382
383 #if defined(DEBUG) || defined(DEBUG_INIT)
384 printk("scsi: scan SCSIS id %d lun %d\n", dev, lun);
385 printk("scsi: return code %08x\n", SCpnt->result);
386 #endif
387
388
389 if(SCpnt->result) {
390 if ((driver_byte(SCpnt->result) & DRIVER_SENSE) &&
391 ((SCpnt->sense_buffer[0] & 0x70) >> 4) == 7) {
392 if (SCpnt->sense_buffer[2] &0xe0)
393 continue;
394 if(((SCpnt->sense_buffer[2] & 0xf) != NOT_READY) &&
395 ((SCpnt->sense_buffer[2] & 0xf) != UNIT_ATTENTION))
396 continue;
397 }
398 else
399 break;
400 }
401
402 #if defined (DEBUG) || defined(DEBUG_INIT)
403 printk("scsi: performing INQUIRY\n");
404 #endif
405
406
407
408
409 scsi_cmd[0] = INQUIRY;
410 scsi_cmd[1] = (lun << 5) & 0xe0;
411 scsi_cmd[2] = 0;
412 scsi_cmd[3] = 0;
413 scsi_cmd[4] = 255;
414 scsi_cmd[5] = 0;
415
416 SCpnt->request.dev = 0xffff;
417 SCpnt->cmd_len = 0;
418
419 scsi_do_cmd (SCpnt, (void *) scsi_cmd, (void *) scsi_result,
420 256, scan_scsis_done, SCSI_TIMEOUT, 3);
421
422 if (current == task[0])
423 while (SCpnt->request.dev != 0xfffe);
424 else if (SCpnt->request.dev != 0xfffe) {
425 struct semaphore sem = MUTEX_LOCKED;
426
427 SCpnt->request.sem = &sem;
428 down(&sem);
429
430
431 while (SCpnt->request.dev != 0xfffe) schedule();
432 }
433
434 the_result = SCpnt->result;
435
436 #if defined(DEBUG) || defined(DEBUG_INIT)
437 if (!the_result)
438 printk("scsi: INQUIRY successful\n");
439 else
440 printk("scsi: INQUIRY failed with code %08x\n", the_result);
441 #endif
442
443 if(the_result) break;
444
445
446
447 if (!the_result)
448 {
449
450 if (!strncmp(scsi_result+8,"TOSHIBA",7) &&
451 !strncmp(scsi_result+16,"CD-ROM",6) &&
452 scsi_result[0] == TYPE_DISK) {
453 scsi_result[0] = TYPE_ROM;
454 scsi_result[1] |= 0x80;
455 }
456
457 SDpnt->manufacturer = SCSI_MAN_UNKNOWN;
458 if (!strncmp(scsi_result+8,"NEC",3))
459 SDpnt->manufacturer = SCSI_MAN_NEC;
460 if (!strncmp(scsi_result+8,"TOSHIBA",7))
461 SDpnt->manufacturer = SCSI_MAN_TOSHIBA;
462
463 SDpnt->removable = (0x80 &
464 scsi_result[1]) >> 7;
465 SDpnt->lockable = SDpnt->removable;
466 SDpnt->changed = 0;
467 SDpnt->access_count = 0;
468 SDpnt->busy = 0;
469
470
471
472
473
474
475 switch (type = (scsi_result[0] & 0x1f))
476 {
477 case TYPE_TAPE :
478 case TYPE_DISK :
479 case TYPE_MOD :
480 case TYPE_PROCESSOR :
481 case TYPE_SCANNER :
482 SDpnt->writeable = 1;
483 break;
484 case TYPE_WORM :
485 case TYPE_ROM :
486 SDpnt->writeable = 0;
487 break;
488 default :
489 #if 0
490 #ifdef DEBUG
491 printk("scsi: unknown type %d\n", type);
492 print_inquiry(scsi_result);
493 #endif
494 type = -1;
495 #endif
496 }
497
498 SDpnt->soft_reset =
499 (scsi_result[7] & 1) && ((scsi_result[3] & 7) == 2);
500 SDpnt->random = (type == TYPE_TAPE) ? 0 : 1;
501 SDpnt->type = (type & 0x1f);
502
503 if (type != -1)
504 {
505 print_inquiry(scsi_result);
506
507 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
508 if(sdtpnt->detect) SDpnt->attached +=
509 (*sdtpnt->detect)(SDpnt);
510
511 SDpnt->scsi_level = scsi_result[2] & 0x07;
512 if (SDpnt->scsi_level >= 2 ||
513 (SDpnt->scsi_level == 1 &&
514 (scsi_result[3] & 0x0f) == 1))
515 SDpnt->scsi_level++;
516
517
518
519
520
521 SDpnt->tagged_queue = 0;
522
523 if ((SDpnt->scsi_level >= SCSI_2) &&
524 (scsi_result[7] & 2)) {
525 SDpnt->tagged_supported = 1;
526 SDpnt->current_tag = 0;
527 }
528
529
530
531
532
533
534 SDpnt->disconnect = 0;
535
536
537
538
539
540
541
542
543
544 if(strncmp("TEXEL", (char *) &scsi_result[8], 5) != 0 ||
545 strncmp("CD-ROM", (char *) &scsi_result[16], 6) != 0
546
547
548
549
550
551
552 #ifdef notyet
553 || (strncmp("1.06", (char *) &scsi_result[[, 4) != 0)))
554 #endif
555 )
556 SDpnt->borken = 0;
557
558
559
560
561 if(memcmp("INSITE", &scsi_result[8], 6) == 0 &&
562 (memcmp("Floptical F*8I", &scsi_result[16], 16) == 0
563 || memcmp("I325VM", &scsi_result[16], 6) == 0)) {
564 printk("Unlocked floptical drive.\n");
565 SDpnt->lockable = 0;
566 scsi_cmd[0] = MODE_SENSE;
567 scsi_cmd[1] = (lun << 5) & 0xe0;
568 scsi_cmd[2] = 0x2e;
569 scsi_cmd[3] = 0;
570 scsi_cmd[4] = 0x2a;
571 scsi_cmd[5] = 0;
572
573 SCpnt->request.dev = 0xffff;
574 SCpnt->cmd_len = 0;
575
576 scsi_do_cmd (SCpnt, (void *) scsi_cmd,
577 (void *) scsi_result, 0x2a, scan_scsis_done,
578 SCSI_TIMEOUT, 3);
579
580 if (current == task[0])
581 while (SCpnt->request.dev != 0xfffe);
582 else if (SCpnt->request.dev != 0xfffe) {
583 struct semaphore sem = MUTEX_LOCKED;
584
585 SCpnt->request.sem = &sem;
586 down(&sem);
587
588
589 while (SCpnt->request.dev != 0xfffe) schedule();
590 }
591 }
592
593 if(SDtail)
594 SDtail->next = SDpnt;
595 else
596 scsi_devices = SDpnt;
597 SDtail = SDpnt;
598
599 SDpnt = (Scsi_Device *) scsi_init_malloc(sizeof (Scsi_Device), GFP_ATOMIC);
600
601
602 if(blacklisted(scsi_result)) break;
603
604 if ((scsi_result[2] & 0x07) == 0)
605 break;
606
607
608 if((scsi_result[2] & 0x07) == 1 &&
609 (scsi_result[3] & 0x0f) == 0) break;
610 }
611 }
612 }
613
614 shpnt->host_queue = NULL;
615
616
617 scsi_init_free((char *) SDpnt, sizeof(Scsi_Device));
618
619 scsi_init_free((char *) SCpnt, sizeof(Scsi_Cmnd));
620
621
622
623 if (scsi_result != &scsi_result0[0]) scsi_free(scsi_result, 512);
624
625 in_scan_scsis = 0;
626 }
627
628
629
630
631
632 #define NORMAL_TIMEOUT 0
633 #define IN_ABORT 1
634 #define IN_RESET 2
635
636
637
638
639
640
641 static void scsi_times_out (Scsi_Cmnd * SCpnt, int pid)
642 {
643
644 switch (SCpnt->internal_timeout & (IN_ABORT | IN_RESET))
645 {
646 case NORMAL_TIMEOUT:
647 if (!in_scan_scsis) {
648 #ifdef DEBUG_TIMEOUT
649 scsi_dump_status();
650 #endif
651 }
652
653 if (!scsi_abort (SCpnt, DID_TIME_OUT, pid))
654 return;
655 case IN_ABORT:
656 printk("SCSI host %d abort() timed out - resetting\n",
657 SCpnt->host->host_no);
658 if (!scsi_reset (SCpnt))
659 return;
660 case IN_RESET:
661 case (IN_ABORT | IN_RESET):
662
663
664
665 printk("Unable to reset scsi host %d - ",SCpnt->host->host_no);
666 printk("probably a SCSI bus hang.\n");
667 return;
668
669 default:
670 INTERNAL_ERROR;
671 }
672
673 }
674
675
676
677
678
679
680
681
682 Scsi_Cmnd * request_queueable (struct request * req, Scsi_Device * device)
683 {
684 Scsi_Cmnd * SCpnt = NULL;
685 int tablesize;
686 struct buffer_head * bh, *bhp;
687
688 if (!device)
689 panic ("No device passed to request_queueable().\n");
690
691 if (req && req->dev <= 0)
692 panic("Invalid device in request_queueable");
693
694 SCpnt = device->host->host_queue;
695 while(SCpnt){
696 if(SCpnt->target == device->id &&
697 SCpnt->lun == device->lun)
698 if(SCpnt->request.dev < 0) break;
699 SCpnt = SCpnt->next;
700 }
701
702 if (!SCpnt) return NULL;
703
704 if (SCSI_BLOCK(device->host)) return NULL;
705
706 if (req) {
707 memcpy(&SCpnt->request, req, sizeof(struct request));
708 tablesize = device->host->sg_tablesize;
709 bhp = bh = req->bh;
710 if(!tablesize) bh = NULL;
711
712
713 while(req->nr_sectors && bh){
714 bhp = bhp->b_reqnext;
715 if(!bhp || !CONTIGUOUS_BUFFERS(bh,bhp)) tablesize--;
716 req->nr_sectors -= bh->b_size >> 9;
717 req->sector += bh->b_size >> 9;
718 if(!tablesize) break;
719 bh = bhp;
720 }
721 if(req->nr_sectors && bh && bh->b_reqnext){
722 SCpnt->request.bhtail = bh;
723 req->bh = bh->b_reqnext;
724 bh->b_reqnext = NULL;
725 bh = req->bh;
726
727
728 SCpnt->request.nr_sectors -= req->nr_sectors;
729 req->current_nr_sectors = bh->b_size >> 9;
730 req->buffer = bh->b_data;
731 SCpnt->request.sem = NULL;
732 } else {
733 req->dev = -1;
734 wake_up(&wait_for_request);
735 }
736 } else {
737 SCpnt->request.dev = 0xffff;
738 SCpnt->request.sem = NULL;
739 }
740
741 SCpnt->use_sg = 0;
742 SCpnt->old_use_sg = 0;
743 SCpnt->transfersize = 0;
744 SCpnt->underflow = 0;
745 SCpnt->cmd_len = 0;
746 return SCpnt;
747 }
748
749
750
751
752
753
754
755
756
757
758 Scsi_Cmnd * allocate_device (struct request ** reqp, Scsi_Device * device,
759 int wait)
760 {
761 int dev = -1;
762 struct request * req = NULL;
763 int tablesize;
764 unsigned int flags;
765 struct buffer_head * bh, *bhp;
766 struct Scsi_Host * host;
767 Scsi_Cmnd * SCpnt = NULL;
768 Scsi_Cmnd * SCwait = NULL;
769
770 if (!device)
771 panic ("No device passed to allocate_device().\n");
772
773 if (reqp) req = *reqp;
774
775
776 if (req && (dev = req->dev) <= 0) return NULL;
777
778 host = device->host;
779
780 if (intr_count && SCSI_BLOCK(host)) return NULL;
781
782 while (1==1){
783 SCpnt = host->host_queue;
784 while(SCpnt){
785 if(SCpnt->target == device->id &&
786 SCpnt->lun == device->lun) {
787 SCwait = SCpnt;
788 if(SCpnt->request.dev < 0) break;
789 }
790 SCpnt = SCpnt->next;
791 }
792 save_flags(flags);
793 cli();
794
795 if (req && ((req->dev < 0) || (req->dev != dev))) {
796 restore_flags(flags);
797 return NULL;
798 }
799 if (!SCpnt || SCpnt->request.dev >= 0)
800 {
801 restore_flags(flags);
802 if(!wait) return NULL;
803 if (!SCwait) {
804 printk("Attempt to allocate device target %d, lun %d\n",
805 device->id ,device->lun);
806 panic("No device found in allocate_device\n");
807 }
808 SCSI_SLEEP(&device->device_wait,
809 (SCwait->request.dev > 0));
810 } else {
811 if (req) {
812 memcpy(&SCpnt->request, req, sizeof(struct request));
813 tablesize = device->host->sg_tablesize;
814 bhp = bh = req->bh;
815 if(!tablesize) bh = NULL;
816
817
818 while(req->nr_sectors && bh){
819 bhp = bhp->b_reqnext;
820 if(!bhp || !CONTIGUOUS_BUFFERS(bh,bhp)) tablesize--;
821 req->nr_sectors -= bh->b_size >> 9;
822 req->sector += bh->b_size >> 9;
823 if(!tablesize) break;
824 bh = bhp;
825 }
826 if(req->nr_sectors && bh && bh->b_reqnext){
827 SCpnt->request.bhtail = bh;
828 req->bh = bh->b_reqnext;
829 bh->b_reqnext = NULL;
830 bh = req->bh;
831
832 SCpnt->request.nr_sectors -= req->nr_sectors;
833 req->current_nr_sectors = bh->b_size >> 9;
834 req->buffer = bh->b_data;
835 SCpnt->request.sem = NULL;
836 }
837 else
838 {
839 req->dev = -1;
840 *reqp = req->next;
841 wake_up(&wait_for_request);
842 }
843 } else {
844 SCpnt->request.dev = 0xffff;
845 SCpnt->request.sem = NULL;
846 }
847 restore_flags(flags);
848 break;
849 }
850 }
851
852 SCpnt->use_sg = 0;
853 SCpnt->old_use_sg = 0;
854 SCpnt->transfersize = 0;
855 SCpnt->cmd_len = 0;
856 SCpnt->underflow = 0;
857 return SCpnt;
858 }
859
860
861
862
863
864 inline void internal_cmnd (Scsi_Cmnd * SCpnt)
865 {
866 int temp;
867 struct Scsi_Host * host;
868 unsigned int flags;
869 #ifdef DEBUG_DELAY
870 int clock;
871 #endif
872
873 if ((unsigned long) &SCpnt < current->kernel_stack_page)
874 panic("Kernel stack overflow.");
875
876 host = SCpnt->host;
877
878
879
880
881
882 save_flags(flags);
883 sti();
884 temp = host->last_reset + MIN_RESET_DELAY;
885 while (jiffies < temp);
886 restore_flags(flags);
887
888 update_timeout(SCpnt, SCpnt->timeout_per_command);
889
890
891
892
893
894 #ifdef DEBUG
895 printk("internal_cmnd (host = %d, target = %d, command = %08x, buffer = %08x, \n"
896 "bufflen = %d, done = %08x)\n", SCpnt->host->host_no, SCpnt->target, SCpnt->cmnd, SCpnt->buffer, SCpnt->bufflen, SCpnt->done);
897 #endif
898
899 if (host->can_queue)
900 {
901 #ifdef DEBUG
902 printk("queuecommand : routine at %08x\n",
903 host->hostt->queuecommand);
904 #endif
905
906
907
908
909
910
911
912
913 if(!intr_count && SCpnt->host->irq)
914 disable_irq(SCpnt->host->irq);
915
916 host->hostt->queuecommand (SCpnt, scsi_done);
917
918 if(!intr_count && SCpnt->host->irq)
919 enable_irq(SCpnt->host->irq);
920 }
921 else
922 {
923
924 #ifdef DEBUG
925 printk("command() : routine at %08x\n", host->hostt->command);
926 #endif
927 temp=host->hostt->command (SCpnt);
928 SCpnt->result = temp;
929 #ifdef DEBUG_DELAY
930 clock = jiffies + 400;
931 while (jiffies < clock);
932 printk("done(host = %d, result = %04x) : routine at %08x\n", host->host_no, temp);
933 #endif
934 scsi_done(SCpnt);
935 }
936 #ifdef DEBUG
937 printk("leaving internal_cmnd()\n");
938 #endif
939 }
940
941 static void scsi_request_sense (Scsi_Cmnd * SCpnt)
942 {
943 unsigned int flags;
944
945 save_flags(flags);
946 cli();
947 SCpnt->flags |= WAS_SENSE | ASKED_FOR_SENSE;
948 update_timeout(SCpnt, SENSE_TIMEOUT);
949 restore_flags(flags);
950
951
952 memcpy ((void *) SCpnt->cmnd , (void *) generic_sense,
953 sizeof(generic_sense));
954
955 SCpnt->cmnd[1] = SCpnt->lun << 5;
956 SCpnt->cmnd[4] = sizeof(SCpnt->sense_buffer);
957
958 SCpnt->request_buffer = &SCpnt->sense_buffer;
959 SCpnt->request_bufflen = sizeof(SCpnt->sense_buffer);
960 SCpnt->use_sg = 0;
961 SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]);
962 internal_cmnd (SCpnt);
963 }
964
965
966
967
968
969
970
971
972
973
974 void scsi_do_cmd (Scsi_Cmnd * SCpnt, const void *cmnd ,
975 void *buffer, unsigned bufflen, void (*done)(Scsi_Cmnd *),
976 int timeout, int retries
977 )
978 {
979 unsigned long flags;
980 struct Scsi_Host * host = SCpnt->host;
981
982 #ifdef DEBUG
983 {
984 int i;
985 int target = SCpnt->target;
986 printk ("scsi_do_cmd (host = %d, target = %d, buffer =%08x, "
987 "bufflen = %d, done = %08x, timeout = %d, retries = %d)\n"
988 "command : " , host->host_no, target, buffer, bufflen, done, timeout, retries);
989 for (i = 0; i < 10; ++i)
990 printk ("%02x ", ((unsigned char *) cmnd)[i]);
991 printk("\n");
992 }
993 #endif
994
995 if (!host)
996 {
997 panic ("Invalid or not present host.\n");
998 }
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009 save_flags(flags);
1010 cli();
1011 SCpnt->pid = scsi_pid++;
1012
1013 while (SCSI_BLOCK(host)) {
1014 restore_flags(flags);
1015 SCSI_SLEEP(&host->host_wait, SCSI_BLOCK(host));
1016 cli();
1017 }
1018
1019 if (host->block) host_active = host;
1020
1021 host->host_busy++;
1022 restore_flags(flags);
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032 memcpy ((void *) SCpnt->data_cmnd , (void *) cmnd, 12);
1033 #if 0
1034 SCpnt->host = host;
1035 SCpnt->target = target;
1036 SCpnt->lun = (SCpnt->data_cmnd[1] >> 5);
1037 #endif
1038 SCpnt->bufflen = bufflen;
1039 SCpnt->buffer = buffer;
1040 SCpnt->flags=0;
1041 SCpnt->retries=0;
1042 SCpnt->allowed=retries;
1043 SCpnt->done = done;
1044 SCpnt->timeout_per_command = timeout;
1045
1046 memcpy ((void *) SCpnt->cmnd , (void *) cmnd, 12);
1047
1048
1049 memset ((void *) SCpnt->sense_buffer, 0, sizeof SCpnt->sense_buffer);
1050 SCpnt->request_buffer = buffer;
1051 SCpnt->request_bufflen = bufflen;
1052 SCpnt->old_use_sg = SCpnt->use_sg;
1053 if (SCpnt->cmd_len == 0)
1054 SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]);
1055 SCpnt->old_cmd_len = SCpnt->cmd_len;
1056
1057
1058
1059 SCpnt->internal_timeout = 0;
1060 SCpnt->abort_reason = 0;
1061 internal_cmnd (SCpnt);
1062
1063 #ifdef DEBUG
1064 printk ("Leaving scsi_do_cmd()\n");
1065 #endif
1066 }
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076 static void reset (Scsi_Cmnd * SCpnt)
1077 {
1078 #ifdef DEBUG
1079 printk("scsi: reset(%d)\n", SCpnt->host->host_no);
1080 #endif
1081
1082 SCpnt->flags |= (WAS_RESET | IS_RESETTING);
1083 scsi_reset(SCpnt);
1084
1085 #ifdef DEBUG
1086 printk("performing request sense\n");
1087 #endif
1088
1089 #if 0
1090 if(SCpnt->flags & NEEDS_JUMPSTART) {
1091 SCpnt->flags &= ~NEEDS_JUMPSTART;
1092 scsi_request_sense (SCpnt);
1093 }
1094 #endif
1095 }
1096
1097
1098
1099 static int check_sense (Scsi_Cmnd * SCpnt)
1100 {
1101
1102
1103
1104 if (((SCpnt->sense_buffer[0] & 0x70) >> 4) != 7) {
1105 if(!(SCpnt->flags & ASKED_FOR_SENSE))
1106 return SUGGEST_SENSE;
1107 else
1108 return SUGGEST_RETRY;
1109 }
1110
1111 SCpnt->flags &= ~ASKED_FOR_SENSE;
1112
1113 #ifdef DEBUG_INIT
1114 printk("scsi%d : ", SCpnt->host->host_no);
1115 print_sense("", SCpnt);
1116 printk("\n");
1117 #endif
1118 if (SCpnt->sense_buffer[2] &0xe0)
1119 return SUGGEST_ABORT;
1120
1121 switch (SCpnt->sense_buffer[2] & 0xf)
1122 {
1123 case NO_SENSE:
1124 return 0;
1125 case RECOVERED_ERROR:
1126 return SUGGEST_IS_OK;
1127
1128 case ABORTED_COMMAND:
1129 return SUGGEST_RETRY;
1130 case NOT_READY:
1131 case UNIT_ATTENTION:
1132 return SUGGEST_ABORT;
1133
1134
1135 case COPY_ABORTED:
1136 case VOLUME_OVERFLOW:
1137 case MISCOMPARE:
1138
1139 case MEDIUM_ERROR:
1140 return SUGGEST_REMAP;
1141 case BLANK_CHECK:
1142 case DATA_PROTECT:
1143 case HARDWARE_ERROR:
1144 case ILLEGAL_REQUEST:
1145 default:
1146 return SUGGEST_ABORT;
1147 }
1148 }
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 static void scsi_done (Scsi_Cmnd * SCpnt)
1172 {
1173 int status=0;
1174 int exit=0;
1175 int checked;
1176 int oldto;
1177 struct Scsi_Host * host = SCpnt->host;
1178 int result = SCpnt->result;
1179 oldto = update_timeout(SCpnt, 0);
1180
1181 #ifdef DEBUG_TIMEOUT
1182 if(result) printk("Non-zero result in scsi_done %x %d:%d\n",
1183 result, SCpnt->target, SCpnt->lun);
1184 #endif
1185
1186
1187
1188 if(host_byte(result) == DID_ABORT && SCpnt->abort_reason)
1189 SCpnt->result = result = (result & 0xff00ffff) |
1190 (SCpnt->abort_reason << 16);
1191
1192
1193 #define FINISHED 0
1194 #define MAYREDO 1
1195 #define REDO 3
1196 #define PENDING 4
1197
1198 #ifdef DEBUG
1199 printk("In scsi_done(host = %d, result = %06x)\n", host->host_no, result);
1200 #endif
1201
1202 if(SCpnt->flags & WAS_SENSE)
1203 {
1204 SCpnt->use_sg = SCpnt->old_use_sg;
1205 SCpnt->cmd_len = SCpnt->old_cmd_len;
1206 }
1207
1208 switch (host_byte(result))
1209 {
1210 case DID_OK:
1211 if (status_byte(result) && (SCpnt->flags & WAS_SENSE))
1212
1213 {
1214 SCpnt->flags &= ~WAS_SENSE;
1215 SCpnt->internal_timeout &= ~SENSE_TIMEOUT;
1216
1217 if (!(SCpnt->flags & WAS_RESET))
1218 {
1219 printk("scsi%d : target %d lun %d request sense failed, performing reset.\n",
1220 SCpnt->host->host_no, SCpnt->target, SCpnt->lun);
1221 reset(SCpnt);
1222 return;
1223 }
1224 else
1225 {
1226 exit = (DRIVER_HARD | SUGGEST_ABORT);
1227 status = FINISHED;
1228 }
1229 }
1230 else switch(msg_byte(result))
1231 {
1232 case COMMAND_COMPLETE:
1233 switch (status_byte(result))
1234 {
1235 case GOOD:
1236 if (SCpnt->flags & WAS_SENSE)
1237 {
1238 #ifdef DEBUG
1239 printk ("In scsi_done, GOOD status, COMMAND COMPLETE, parsing sense information.\n");
1240 #endif
1241
1242 SCpnt->flags &= ~WAS_SENSE;
1243 SCpnt->internal_timeout &= ~SENSE_TIMEOUT;
1244
1245 switch (checked = check_sense(SCpnt))
1246 {
1247 case SUGGEST_SENSE:
1248 case 0:
1249 #ifdef DEBUG
1250 printk("NO SENSE. status = REDO\n");
1251 #endif
1252
1253 update_timeout(SCpnt, oldto);
1254 status = REDO;
1255 break;
1256 case SUGGEST_IS_OK:
1257 break;
1258 case SUGGEST_REMAP:
1259 case SUGGEST_RETRY:
1260 #ifdef DEBUG
1261 printk("SENSE SUGGEST REMAP or SUGGEST RETRY - status = MAYREDO\n");
1262 #endif
1263
1264 status = MAYREDO;
1265 exit = DRIVER_SENSE | SUGGEST_RETRY;
1266 break;
1267 case SUGGEST_ABORT:
1268 #ifdef DEBUG
1269 printk("SENSE SUGGEST ABORT - status = FINISHED");
1270 #endif
1271
1272 status = FINISHED;
1273 exit = DRIVER_SENSE | SUGGEST_ABORT;
1274 break;
1275 default:
1276 printk ("Internal error %s %d \n", __FILE__,
1277 __LINE__);
1278 }
1279 }
1280 else
1281 {
1282 #ifdef DEBUG
1283 printk("COMMAND COMPLETE message returned, status = FINISHED. \n");
1284 #endif
1285
1286 exit = DRIVER_OK;
1287 status = FINISHED;
1288 }
1289 break;
1290
1291 case CHECK_CONDITION:
1292 switch (check_sense(SCpnt))
1293 {
1294 case 0:
1295 update_timeout(SCpnt, oldto);
1296 status = REDO;
1297 break;
1298 case SUGGEST_REMAP:
1299 case SUGGEST_RETRY:
1300 status = MAYREDO;
1301 exit = DRIVER_SENSE | SUGGEST_RETRY;
1302 break;
1303 case SUGGEST_ABORT:
1304 status = FINISHED;
1305 exit = DRIVER_SENSE | SUGGEST_ABORT;
1306 break;
1307 case SUGGEST_SENSE:
1308 scsi_request_sense (SCpnt);
1309 status = PENDING;
1310 break;
1311 }
1312 break;
1313
1314 case CONDITION_GOOD:
1315 case INTERMEDIATE_GOOD:
1316 case INTERMEDIATE_C_GOOD:
1317 break;
1318
1319 case BUSY:
1320 update_timeout(SCpnt, oldto);
1321 status = REDO;
1322 break;
1323
1324 case RESERVATION_CONFLICT:
1325 printk("scsi%d : RESERVATION CONFLICT performing reset.\n",
1326 SCpnt->host->host_no);
1327 reset(SCpnt);
1328 return;
1329 #if 0
1330 exit = DRIVER_SOFT | SUGGEST_ABORT;
1331 status = MAYREDO;
1332 break;
1333 #endif
1334 default:
1335 printk ("Internal error %s %d \n"
1336 "status byte = %d \n", __FILE__,
1337 __LINE__, status_byte(result));
1338
1339 }
1340 break;
1341 default:
1342 panic("scsi: unsupported message byte %d received\n", msg_byte(result));
1343 }
1344 break;
1345 case DID_TIME_OUT:
1346 #ifdef DEBUG
1347 printk("Host returned DID_TIME_OUT - ");
1348 #endif
1349
1350 if (SCpnt->flags & WAS_TIMEDOUT)
1351 {
1352 #ifdef DEBUG
1353 printk("Aborting\n");
1354 #endif
1355 exit = (DRIVER_TIMEOUT | SUGGEST_ABORT);
1356 }
1357 else
1358 {
1359 #ifdef DEBUG
1360 printk ("Retrying.\n");
1361 #endif
1362 SCpnt->flags |= WAS_TIMEDOUT;
1363 SCpnt->internal_timeout &= ~IN_ABORT;
1364 status = REDO;
1365 }
1366 break;
1367 case DID_BUS_BUSY:
1368 case DID_PARITY:
1369 status = REDO;
1370 break;
1371 case DID_NO_CONNECT:
1372 #ifdef DEBUG
1373 printk("Couldn't connect.\n");
1374 #endif
1375 exit = (DRIVER_HARD | SUGGEST_ABORT);
1376 break;
1377 case DID_ERROR:
1378 status = MAYREDO;
1379 exit = (DRIVER_HARD | SUGGEST_ABORT);
1380 break;
1381 case DID_BAD_TARGET:
1382 case DID_ABORT:
1383 exit = (DRIVER_INVALID | SUGGEST_ABORT);
1384 break;
1385 case DID_RESET:
1386 if (SCpnt->flags & IS_RESETTING)
1387 {
1388 SCpnt->flags &= ~IS_RESETTING;
1389 status = REDO;
1390 break;
1391 }
1392
1393 if(msg_byte(result) == GOOD &&
1394 status_byte(result) == CHECK_CONDITION) {
1395 switch (check_sense(SCpnt)) {
1396 case 0:
1397 update_timeout(SCpnt, oldto);
1398 status = REDO;
1399 break;
1400 case SUGGEST_REMAP:
1401 case SUGGEST_RETRY:
1402 status = MAYREDO;
1403 exit = DRIVER_SENSE | SUGGEST_RETRY;
1404 break;
1405 case SUGGEST_ABORT:
1406 status = FINISHED;
1407 exit = DRIVER_SENSE | SUGGEST_ABORT;
1408 break;
1409 case SUGGEST_SENSE:
1410 scsi_request_sense (SCpnt);
1411 status = PENDING;
1412 break;
1413 }
1414 } else {
1415 status=REDO;
1416 exit = SUGGEST_RETRY;
1417 }
1418 break;
1419 default :
1420 exit = (DRIVER_ERROR | SUGGEST_DIE);
1421 }
1422
1423 switch (status)
1424 {
1425 case FINISHED:
1426 case PENDING:
1427 break;
1428 case MAYREDO:
1429
1430 #ifdef DEBUG
1431 printk("In MAYREDO, allowing %d retries, have %d\n",
1432 SCpnt->allowed, SCpnt->retries);
1433 #endif
1434
1435 if ((++SCpnt->retries) < SCpnt->allowed)
1436 {
1437 if ((SCpnt->retries >= (SCpnt->allowed >> 1))
1438 && !(jiffies < SCpnt->host->last_reset + MIN_RESET_PERIOD)
1439 && !(SCpnt->flags & WAS_RESET))
1440 {
1441 printk("scsi%d : resetting for second half of retries.\n",
1442 SCpnt->host->host_no);
1443 reset(SCpnt);
1444 break;
1445 }
1446
1447 }
1448 else
1449 {
1450 status = FINISHED;
1451 break;
1452 }
1453
1454
1455 case REDO:
1456
1457 if (SCpnt->flags & WAS_SENSE)
1458 scsi_request_sense(SCpnt);
1459 else
1460 {
1461 memcpy ((void *) SCpnt->cmnd,
1462 (void*) SCpnt->data_cmnd,
1463 sizeof(SCpnt->data_cmnd));
1464 SCpnt->request_buffer = SCpnt->buffer;
1465 SCpnt->request_bufflen = SCpnt->bufflen;
1466 SCpnt->use_sg = SCpnt->old_use_sg;
1467 SCpnt->cmd_len = SCpnt->old_cmd_len;
1468 internal_cmnd (SCpnt);
1469 }
1470 break;
1471 default:
1472 INTERNAL_ERROR;
1473 }
1474
1475
1476 if (status == FINISHED) {
1477 #ifdef DEBUG
1478 printk("Calling done function - at address %08x\n", SCpnt->done);
1479 #endif
1480 host->host_busy--;
1481
1482 if (host->block && host->host_busy == 0) {
1483 host_active = NULL;
1484
1485
1486 if (MAJOR(SCpnt->request.dev) != SCSI_DISK_MAJOR &&
1487 MAJOR(SCpnt->request.dev) != SCSI_CDROM_MAJOR) {
1488 struct Scsi_Host * next;
1489
1490 for (next = host->block; next != host; next = next->block)
1491 wake_up(&next->host_wait);
1492 }
1493
1494 }
1495
1496 wake_up(&host->host_wait);
1497 SCpnt->result = result | ((exit & 0xff) << 24);
1498 SCpnt->use_sg = SCpnt->old_use_sg;
1499 SCpnt->cmd_len = SCpnt->old_cmd_len;
1500 SCpnt->done (SCpnt);
1501 }
1502
1503 #undef FINISHED
1504 #undef REDO
1505 #undef MAYREDO
1506 #undef PENDING
1507 }
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525 int scsi_abort (Scsi_Cmnd * SCpnt, int why, int pid)
1526 {
1527 int oldto;
1528 unsigned long flags;
1529 struct Scsi_Host * host = SCpnt->host;
1530
1531 while(1)
1532 {
1533 save_flags(flags);
1534 cli();
1535
1536
1537
1538
1539
1540 if (SCpnt->request.dev == -1 || pid != SCpnt->pid) {
1541 restore_flags(flags);
1542 return 0;
1543 }
1544
1545 if (SCpnt->internal_timeout & IN_ABORT)
1546 {
1547 restore_flags(flags);
1548 while (SCpnt->internal_timeout & IN_ABORT);
1549 }
1550 else
1551 {
1552 SCpnt->internal_timeout |= IN_ABORT;
1553 oldto = update_timeout(SCpnt, ABORT_TIMEOUT);
1554
1555 if ((SCpnt->flags & IS_RESETTING) &&
1556 SCpnt->device->soft_reset) {
1557
1558
1559 printk("Stale command on %d:%d appears to have died when"
1560 " the bus was reset\n", SCpnt->target, SCpnt->lun);
1561 }
1562
1563 restore_flags(flags);
1564 if (!host->host_busy) {
1565 SCpnt->internal_timeout &= ~IN_ABORT;
1566 update_timeout(SCpnt, oldto);
1567 return 0;
1568 }
1569 printk("scsi : aborting command due to timeout : pid %lu, scsi%d, id %d, lun %d ",
1570 SCpnt->pid, SCpnt->host->host_no, (int) SCpnt->target, (int)
1571 SCpnt->lun);
1572 print_command (SCpnt->cmnd);
1573 if (SCpnt->request.dev == -1 || pid != SCpnt->pid)
1574 return 0;
1575 SCpnt->abort_reason = why;
1576 switch(host->hostt->abort(SCpnt)) {
1577
1578
1579
1580
1581 case SCSI_ABORT_BUSY:
1582
1583 case SCSI_ABORT_SNOOZE:
1584 if(why == DID_TIME_OUT) {
1585 save_flags(flags);
1586 cli();
1587 SCpnt->internal_timeout &= ~IN_ABORT;
1588 if(SCpnt->flags & WAS_TIMEDOUT) {
1589 restore_flags(flags);
1590 return 1;
1591
1592
1593 } else {
1594 SCpnt->flags |= WAS_TIMEDOUT;
1595 oldto = SCpnt->timeout_per_command;
1596 update_timeout(SCpnt, oldto);
1597 }
1598 restore_flags(flags);
1599 }
1600 return 0;
1601 case SCSI_ABORT_PENDING:
1602 if(why != DID_TIME_OUT) {
1603 save_flags(flags);
1604 cli();
1605 update_timeout(SCpnt, oldto);
1606 restore_flags(flags);
1607 }
1608 return 0;
1609 case SCSI_ABORT_SUCCESS:
1610
1611
1612 case SCSI_ABORT_NOT_RUNNING:
1613 SCpnt->internal_timeout &= ~IN_ABORT;
1614 update_timeout(SCpnt, 0);
1615 return 0;
1616 case SCSI_ABORT_ERROR:
1617 default:
1618 SCpnt->internal_timeout &= ~IN_ABORT;
1619 return 1;
1620 }
1621 }
1622 }
1623 }
1624
1625 int scsi_reset (Scsi_Cmnd * SCpnt)
1626 {
1627 int temp, oldto;
1628 unsigned long flags;
1629 Scsi_Cmnd * SCpnt1;
1630 struct Scsi_Host * host = SCpnt->host;
1631
1632 #ifdef DEBUG
1633 printk("Danger Will Robinson! - SCSI bus for host %d is being reset.\n",host->host_no);
1634 #endif
1635 while (1) {
1636 save_flags(flags);
1637 cli();
1638 if (SCpnt->internal_timeout & IN_RESET)
1639 {
1640 restore_flags(flags);
1641 while (SCpnt->internal_timeout & IN_RESET);
1642 }
1643 else
1644 {
1645 SCpnt->internal_timeout |= IN_RESET;
1646 oldto = update_timeout(SCpnt, RESET_TIMEOUT);
1647
1648 if (host->host_busy)
1649 {
1650 restore_flags(flags);
1651 SCpnt1 = host->host_queue;
1652 while(SCpnt1) {
1653 if (SCpnt1->request.dev > 0) {
1654 #if 0
1655 if (!(SCpnt1->flags & IS_RESETTING) &&
1656 !(SCpnt1->internal_timeout & IN_ABORT))
1657 scsi_abort(SCpnt1, DID_RESET, SCpnt->pid);
1658 #endif
1659 SCpnt1->flags |= IS_RESETTING;
1660 }
1661 SCpnt1 = SCpnt1->next;
1662 }
1663
1664 host->last_reset = jiffies;
1665 temp = host->hostt->reset(SCpnt);
1666 host->last_reset = jiffies;
1667 }
1668 else
1669 {
1670 if (!host->block) host->host_busy++;
1671 restore_flags(flags);
1672 host->last_reset = jiffies;
1673 temp = host->hostt->reset(SCpnt);
1674 host->last_reset = jiffies;
1675 if (!host->block) host->host_busy--;
1676 }
1677
1678 #ifdef DEBUG
1679 printk("scsi reset function returned %d\n", temp);
1680 #endif
1681 switch(temp) {
1682 case SCSI_RESET_SUCCESS:
1683 save_flags(flags);
1684 cli();
1685 SCpnt->internal_timeout &= ~IN_RESET;
1686 update_timeout(SCpnt, oldto);
1687 restore_flags(flags);
1688 return 0;
1689 case SCSI_RESET_PENDING:
1690 return 0;
1691 case SCSI_RESET_PUNT:
1692 case SCSI_RESET_WAKEUP:
1693 SCpnt->internal_timeout &= ~IN_RESET;
1694 scsi_request_sense (SCpnt);
1695 return 0;
1696 case SCSI_RESET_SNOOZE:
1697
1698
1699
1700
1701 save_flags(flags);
1702 cli();
1703 SCpnt->internal_timeout &= ~IN_RESET;
1704 update_timeout(SCpnt, 0);
1705 restore_flags(flags);
1706
1707 case SCSI_RESET_ERROR:
1708 default:
1709 return 1;
1710 }
1711
1712 return temp;
1713 }
1714 }
1715 }
1716
1717
1718 static void scsi_main_timeout(void)
1719 {
1720
1721
1722
1723
1724 int timed_out, pid;
1725 unsigned long flags;
1726 struct Scsi_Host * host;
1727 Scsi_Cmnd * SCpnt = NULL;
1728
1729 do {
1730 save_flags(flags);
1731 cli();
1732
1733 update_timeout(NULL, 0);
1734
1735
1736
1737
1738
1739 timed_out = 0;
1740 for(host = scsi_hostlist; host; host = host->next) {
1741 for(SCpnt = host->host_queue; SCpnt; SCpnt = SCpnt->next)
1742 if (SCpnt->timeout == -1)
1743 {
1744 SCpnt->timeout = 0;
1745 pid = SCpnt->pid;
1746 restore_flags(flags);
1747 scsi_times_out(SCpnt, pid);
1748 ++timed_out;
1749 save_flags(flags);
1750 cli();
1751 }
1752 }
1753 } while (timed_out);
1754 restore_flags(flags);
1755 }
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765 static int update_timeout(Scsi_Cmnd * SCset, int timeout)
1766 {
1767 unsigned int least, used;
1768 unsigned int oldto;
1769 unsigned long flags;
1770 struct Scsi_Host * host;
1771 Scsi_Cmnd * SCpnt = NULL;
1772
1773 save_flags(flags);
1774 cli();
1775
1776
1777
1778
1779
1780 used = (time_start) ? (jiffies - time_start) : 0;
1781
1782
1783
1784
1785
1786
1787
1788 oldto = 0;
1789
1790 if(SCset){
1791 oldto = SCset->timeout - used;
1792 SCset->timeout = timeout + used;
1793 }
1794
1795 least = 0xffffffff;
1796
1797 for(host = scsi_hostlist; host; host = host->next)
1798 for(SCpnt = host->host_queue; SCpnt; SCpnt = SCpnt->next)
1799 if (SCpnt->timeout > 0) {
1800 SCpnt->timeout -= used;
1801 if(SCpnt->timeout <= 0) SCpnt->timeout = -1;
1802 if(SCpnt->timeout > 0 && SCpnt->timeout < least)
1803 least = SCpnt->timeout;
1804 }
1805
1806
1807
1808
1809
1810
1811 if (least != 0xffffffff)
1812 {
1813 time_start = jiffies;
1814 timer_table[SCSI_TIMER].expires = (time_elapsed = least) + jiffies;
1815 timer_active |= 1 << SCSI_TIMER;
1816 }
1817 else
1818 {
1819 timer_table[SCSI_TIMER].expires = time_start = time_elapsed = 0;
1820 timer_active &= ~(1 << SCSI_TIMER);
1821 }
1822 restore_flags(flags);
1823 return oldto;
1824 }
1825
1826
1827 static unsigned char * dma_malloc_freelist = NULL;
1828 static int scsi_need_isa_bounce_buffers;
1829 static unsigned int dma_sectors = 0;
1830 unsigned int dma_free_sectors = 0;
1831 unsigned int need_isa_buffer = 0;
1832 static unsigned char ** dma_malloc_pages = NULL;
1833 #define MALLOC_PAGEBITS 12
1834
1835 static int scsi_register_host(Scsi_Host_Template *);
1836 static void scsi_unregister_host(Scsi_Host_Template *);
1837
1838 void *scsi_malloc(unsigned int len)
1839 {
1840 unsigned int nbits, mask;
1841 unsigned long flags;
1842 int i, j;
1843 if((len & 0x1ff) || len > (1<<MALLOC_PAGEBITS))
1844 return NULL;
1845
1846 save_flags(flags);
1847 cli();
1848 nbits = len >> 9;
1849 mask = (1 << nbits) - 1;
1850
1851 for(i=0;i < (dma_sectors >> (MALLOC_PAGEBITS - 9)); i++)
1852 for(j=0; j<=(sizeof(*dma_malloc_freelist) * 8) - nbits; j++){
1853 if ((dma_malloc_freelist[i] & (mask << j)) == 0){
1854 dma_malloc_freelist[i] |= (mask << j);
1855 restore_flags(flags);
1856 dma_free_sectors -= nbits;
1857 #ifdef DEBUG
1858 printk("SMalloc: %d %x ",len, dma_malloc_pages[i] + (j << 9));
1859 #endif
1860 return (void *) ((unsigned long) dma_malloc_pages[i] + (j << 9));
1861 }
1862 }
1863 restore_flags(flags);
1864 return NULL;
1865 }
1866
1867 int scsi_free(void *obj, unsigned int len)
1868 {
1869 int page, sector, nbits, mask;
1870 long offset;
1871 unsigned long flags;
1872
1873 #ifdef DEBUG
1874 printk("Sfree %x %d\n",obj, len);
1875 #endif
1876
1877 offset = -1;
1878 for (page = 0; page < (dma_sectors >> 3); page++)
1879 if ((unsigned long) obj >= (unsigned long) dma_malloc_pages[page] &&
1880 (unsigned long) obj < (unsigned long) dma_malloc_pages[page] + (1 << MALLOC_PAGEBITS))
1881 {
1882 offset = ((unsigned long) obj) - ((unsigned long)dma_malloc_pages[page]);
1883 break;
1884 }
1885
1886 if (page == (dma_sectors >> 3)) panic("Bad offset");
1887 sector = offset >> 9;
1888 if(sector >= dma_sectors) panic ("Bad page");
1889
1890 sector = (offset >> 9) & (sizeof(*dma_malloc_freelist) * 8 - 1);
1891 nbits = len >> 9;
1892 mask = (1 << nbits) - 1;
1893
1894 if ((mask << sector) > 0xffff) panic ("Bad memory alignment");
1895
1896 save_flags(flags);
1897 cli();
1898 if(dma_malloc_freelist[page] & (mask << sector) != (mask<<sector))
1899 panic("Trying to free unused memory");
1900
1901 dma_free_sectors += nbits;
1902 dma_malloc_freelist[page] &= ~(mask << sector);
1903 restore_flags(flags);
1904 return 0;
1905 }
1906
1907
1908
1909
1910
1911
1912 static unsigned long scsi_init_memory_start = 0;
1913 static unsigned long scsi_memory_lower_value = 0;
1914 static unsigned long scsi_memory_upper_value = 0;
1915 int scsi_loadable_module_flag;
1916
1917 void * scsi_init_malloc(unsigned int size, int priority)
1918 {
1919 unsigned long retval;
1920
1921
1922 #if defined(USE_STATIC_SCSI_MEMORY)
1923 if(scsi_loadable_module_flag && !(priority & GFP_DMA))
1924 #else
1925 if(scsi_loadable_module_flag)
1926 #endif
1927 retval = (unsigned long) kmalloc(size, priority);
1928 else {
1929
1930
1931
1932
1933 size = (size + 15) & ~15;
1934
1935 if(scsi_loadable_module_flag &&
1936 (scsi_init_memory_start + size) > scsi_memory_upper_value) {
1937 retval = 0;
1938 printk("scsi_init_malloc: no more statically allocated memory.\n");
1939 }
1940 else {
1941 retval = scsi_init_memory_start;
1942 scsi_init_memory_start += size;
1943 }
1944 }
1945 memset((void *) retval, 0, size);
1946 return (void *) retval;
1947 }
1948
1949
1950 void scsi_init_free(char * ptr, unsigned int size)
1951 {
1952
1953 if((unsigned long) ptr >= scsi_init_memory_start ||
1954 (unsigned long) ptr < scsi_memory_lower_value) kfree(ptr);
1955 else {
1956 size = (size + 15) & ~15;
1957
1958 if(((unsigned long) ptr) + size == scsi_init_memory_start)
1959 scsi_init_memory_start = (unsigned long) ptr;
1960 }
1961 }
1962
1963
1964
1965
1966
1967
1968
1969 unsigned long scsi_dev_init (unsigned long memory_start,unsigned long memory_end)
1970 {
1971 struct Scsi_Host * host = NULL;
1972 Scsi_Device * SDpnt;
1973 struct Scsi_Host * shpnt;
1974 struct Scsi_Device_Template * sdtpnt;
1975 Scsi_Cmnd * SCpnt;
1976 int i;
1977 #ifdef FOO_ON_YOU
1978 return;
1979 #endif
1980
1981
1982 scsi_loadable_module_flag = 0;
1983
1984 scsi_init_memory_start = (memory_start + 15) & ~ 15;
1985 scsi_memory_lower_value = scsi_init_memory_start;
1986
1987 timer_table[SCSI_TIMER].fn = scsi_main_timeout;
1988 timer_table[SCSI_TIMER].expires = 0;
1989
1990
1991 scsi_init();
1992
1993 scsi_devices = (Scsi_Device *) NULL;
1994
1995 for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next)
1996 scan_scsis(shpnt);
1997
1998 printk("scsi : detected ");
1999 for (sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2000 if (sdtpnt->dev_noticed && sdtpnt->name)
2001 printk("%d SCSI %s%s ", sdtpnt->dev_noticed, sdtpnt->name,
2002 (sdtpnt->dev_noticed != 1) ? "s" : "");
2003 printk("total.\n");
2004
2005 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2006 if(sdtpnt->init && sdtpnt->dev_noticed) (*sdtpnt->init)();
2007
2008 for (SDpnt=scsi_devices; SDpnt; SDpnt = SDpnt->next) {
2009 int j;
2010 SDpnt->scsi_request_fn = NULL;
2011 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2012 if(sdtpnt->attach) (*sdtpnt->attach)(SDpnt);
2013
2014 if(SDpnt->attached){
2015 for(j=0;j<SDpnt->host->cmd_per_lun;j++){
2016 SCpnt = (Scsi_Cmnd *) scsi_init_malloc(sizeof(Scsi_Cmnd), GFP_ATOMIC);
2017 SCpnt->host = SDpnt->host;
2018 SCpnt->device = SDpnt;
2019 SCpnt->target = SDpnt->id;
2020 SCpnt->lun = SDpnt->lun;
2021 SCpnt->request.dev = -1;
2022 SCpnt->use_sg = 0;
2023 SCpnt->old_use_sg = 0;
2024 SCpnt->old_cmd_len = 0;
2025 SCpnt->timeout = 0;
2026 SCpnt->underflow = 0;
2027 SCpnt->transfersize = 0;
2028 SCpnt->host_scribble = NULL;
2029 host = SDpnt->host;
2030 if(host->host_queue)
2031 host->host_queue->prev = SCpnt;
2032 SCpnt->next = host->host_queue;
2033 SCpnt->prev = NULL;
2034 host->host_queue = SCpnt;
2035 }
2036 }
2037 }
2038
2039 if (scsi_devicelist)
2040 dma_sectors = 16;
2041
2042 if (memory_end-1 > ISA_DMA_THRESHOLD)
2043 scsi_need_isa_bounce_buffers = 1;
2044 else
2045 scsi_need_isa_bounce_buffers = 0;
2046
2047 for (SDpnt=scsi_devices; SDpnt; SDpnt = SDpnt->next) {
2048 host = SDpnt->host;
2049
2050 if(SDpnt->type != TYPE_TAPE)
2051 dma_sectors += ((host->sg_tablesize *
2052 sizeof(struct scatterlist) + 511) >> 9) *
2053 host->cmd_per_lun;
2054
2055 if(host->unchecked_isa_dma &&
2056 memory_end - 1 > ISA_DMA_THRESHOLD &&
2057 SDpnt->type != TYPE_TAPE) {
2058 dma_sectors += (PAGE_SIZE >> 9) * host->sg_tablesize *
2059 host->cmd_per_lun;
2060 need_isa_buffer++;
2061 }
2062 }
2063
2064 dma_sectors = (dma_sectors + 15) & 0xfff0;
2065 dma_free_sectors = dma_sectors;
2066
2067 dma_malloc_freelist = (unsigned char *)
2068 scsi_init_malloc(dma_sectors >> 3, GFP_ATOMIC);
2069 memset(dma_malloc_freelist, 0, dma_sectors >> 3);
2070
2071 dma_malloc_pages = (unsigned char **)
2072 scsi_init_malloc(dma_sectors >> 1, GFP_ATOMIC);
2073 memset(dma_malloc_pages, 0, dma_sectors >> 1);
2074
2075 for(i=0; i< dma_sectors >> 3; i++)
2076 dma_malloc_pages[i] = (unsigned char *)
2077 scsi_init_malloc(PAGE_SIZE, GFP_ATOMIC | GFP_DMA);
2078
2079
2080
2081
2082 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2083 if(sdtpnt->finish && sdtpnt->nr_dev)
2084 (*sdtpnt->finish)();
2085
2086 scsi_loadable_module_flag = 1;
2087
2088
2089
2090
2091
2092 #if defined(USE_STATIC_SCSI_MEMORY)
2093 scsi_memory_upper_value = scsi_init_memory_start + 256 * 1024;
2094 printk ("SCSI memory: total %ldKb, used %ldKb, free %ldKb.\n",
2095 (scsi_memory_upper_value - scsi_memory_lower_value) / 1024,
2096 (scsi_init_memory_start - scsi_memory_lower_value) / 1024,
2097 (scsi_memory_upper_value - scsi_init_memory_start) / 1024);
2098 return scsi_memory_upper_value;
2099 #else
2100 return scsi_init_memory_start;
2101 #endif
2102 }
2103
2104 static void print_inquiry(unsigned char *data)
2105 {
2106 int i;
2107
2108 printk(" Vendor: ");
2109 for (i = 8; i < 16; i++)
2110 {
2111 if (data[i] >= 0x20 && i < data[4] + 5)
2112 printk("%c", data[i]);
2113 else
2114 printk(" ");
2115 }
2116
2117 printk(" Model: ");
2118 for (i = 16; i < 32; i++)
2119 {
2120 if (data[i] >= 0x20 && i < data[4] + 5)
2121 printk("%c", data[i]);
2122 else
2123 printk(" ");
2124 }
2125
2126 printk(" Rev: ");
2127 for (i = 32; i < 36; i++)
2128 {
2129 if (data[i] >= 0x20 && i < data[4] + 5)
2130 printk("%c", data[i]);
2131 else
2132 printk(" ");
2133 }
2134
2135 printk("\n");
2136
2137 i = data[0] & 0x1f;
2138
2139 printk(" Type: %s ",
2140 i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] : "Unknown " );
2141 printk(" ANSI SCSI revision: %02x", data[2] & 0x07);
2142 if ((data[2] & 0x07) == 1 && (data[3] & 0x0f) == 1)
2143 printk(" CCS\n");
2144 else
2145 printk("\n");
2146 }
2147
2148
2149
2150
2151
2152 static int scsi_register_host(Scsi_Host_Template * tpnt)
2153 {
2154 int pcount;
2155 struct Scsi_Host * shpnt;
2156 struct Scsi_Host * host = NULL;
2157 unsigned long flags;
2158 Scsi_Device * SDpnt;
2159 Scsi_Cmnd * SCpnt;
2160 struct Scsi_Device_Template * sdtpnt;
2161 int j, i;
2162 const char * name;
2163
2164 if (tpnt->next || !tpnt->detect) return 1;
2165
2166 pcount = next_scsi_host;
2167 if ((tpnt->present = tpnt->detect(tpnt)))
2168 {
2169 if(pcount == next_scsi_host) {
2170 if(tpnt->present > 1) {
2171 printk("Failure to register low-level scsi driver");
2172 scsi_unregister_host(tpnt);
2173 return 1;
2174 }
2175
2176
2177 scsi_register(tpnt,0);
2178 }
2179 tpnt->next = scsi_hosts;
2180 scsi_hosts = tpnt;
2181
2182 for(shpnt=scsi_hostlist; shpnt; shpnt = shpnt->next)
2183 if(shpnt->hostt == tpnt)
2184 {
2185 if(tpnt->info)
2186 name = tpnt->info(shpnt);
2187 else
2188 name = tpnt->name;
2189 printk ("scsi%d : %s\n",
2190 shpnt->host_no, name);
2191 }
2192
2193 printk ("scsi : %d host%s.\n", next_scsi_host,
2194 (next_scsi_host == 1) ? "" : "s");
2195
2196 scsi_make_blocked_list();
2197
2198
2199
2200
2201 for(shpnt=scsi_hostlist; shpnt; shpnt = shpnt->next)
2202 if(shpnt->hostt == tpnt) scan_scsis(shpnt);
2203
2204 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2205 if(sdtpnt->init && sdtpnt->dev_noticed) (*sdtpnt->init)();
2206
2207
2208
2209 for(SDpnt = scsi_devices; SDpnt; SDpnt = SDpnt->next)
2210 if(SDpnt->host->hostt == tpnt)
2211 {
2212 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2213 if(sdtpnt->attach) (*sdtpnt->attach)(SDpnt);
2214 if(SDpnt->attached){
2215 for(j=0;j<SDpnt->host->cmd_per_lun;j++){
2216 SCpnt = (Scsi_Cmnd *) scsi_init_malloc(sizeof(Scsi_Cmnd), GFP_ATOMIC);
2217 SCpnt->host = SDpnt->host;
2218 SCpnt->device = SDpnt;
2219 SCpnt->target = SDpnt->id;
2220 SCpnt->lun = SDpnt->lun;
2221 SCpnt->request.dev = -1;
2222 SCpnt->request.sem = NULL;
2223 SCpnt->use_sg = 0;
2224 SCpnt->old_use_sg = 0;
2225 SCpnt->underflow = 0;
2226 SCpnt->timeout = 0;
2227 SCpnt->transfersize = 0;
2228 SCpnt->host_scribble = NULL;
2229 host = SDpnt->host;
2230 SCpnt->next = host->host_queue;
2231 SCpnt->prev = NULL;
2232 host->host_queue = SCpnt;
2233 if(host->host_queue)
2234 host->host_queue->prev = SCpnt;
2235 }
2236 }
2237 }
2238
2239 {
2240 unsigned char * new_dma_malloc_freelist = NULL;
2241 unsigned int new_dma_sectors = 0;
2242 unsigned int new_need_isa_buffer = 0;
2243 unsigned char ** new_dma_malloc_pages = NULL;
2244
2245 if (scsi_devicelist)
2246 new_dma_sectors = 16;
2247
2248 for (SDpnt=scsi_devices; SDpnt; SDpnt = SDpnt->next) {
2249 host = SDpnt->host;
2250
2251 if(SDpnt->type != TYPE_TAPE)
2252 new_dma_sectors += ((host->sg_tablesize *
2253 sizeof(struct scatterlist) + 511) >> 9) *
2254 host->cmd_per_lun;
2255
2256 if(host->unchecked_isa_dma &&
2257 scsi_need_isa_bounce_buffers &&
2258 SDpnt->type != TYPE_TAPE) {
2259 new_dma_sectors += (PAGE_SIZE >> 9) * host->sg_tablesize *
2260 host->cmd_per_lun;
2261 new_need_isa_buffer++;
2262 }
2263 }
2264
2265 new_dma_sectors = (new_dma_sectors + 15) & 0xfff0;
2266
2267 new_dma_malloc_freelist = (unsigned char *)
2268 scsi_init_malloc(new_dma_sectors >> 3, GFP_ATOMIC);
2269 memset(new_dma_malloc_freelist, 0, new_dma_sectors >> 3);
2270
2271 new_dma_malloc_pages = (unsigned char **)
2272 scsi_init_malloc(new_dma_sectors >> 1, GFP_ATOMIC);
2273 memset(new_dma_malloc_pages, 0, new_dma_sectors >> 1);
2274
2275 for(i=dma_sectors >> 3; i< new_dma_sectors >> 3; i++)
2276 new_dma_malloc_pages[i] = (unsigned char *)
2277 scsi_init_malloc(PAGE_SIZE, GFP_ATOMIC | GFP_DMA);
2278
2279
2280
2281
2282 save_flags(flags);
2283 cli();
2284 memcpy(new_dma_malloc_freelist, dma_malloc_freelist, dma_sectors >> 3);
2285 scsi_init_free(dma_malloc_freelist, dma_sectors>>3);
2286 dma_malloc_freelist = new_dma_malloc_freelist;
2287
2288 memcpy(new_dma_malloc_pages, dma_malloc_pages, dma_sectors >> 1);
2289 scsi_init_free((char *) dma_malloc_pages, dma_sectors>>1);
2290
2291 dma_free_sectors += new_dma_sectors - dma_sectors;
2292 dma_malloc_pages = new_dma_malloc_pages;
2293 dma_sectors = new_dma_sectors;
2294 need_isa_buffer = new_need_isa_buffer;
2295 restore_flags(flags);
2296
2297
2298 }
2299
2300 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2301 if(sdtpnt->finish && sdtpnt->nr_dev)
2302 (*sdtpnt->finish)();
2303 }
2304
2305 #if defined(USE_STATIC_SCSI_MEMORY)
2306 printk ("SCSI memory: total %ldKb, used %ldKb, free %ldKb.\n",
2307 (scsi_memory_upper_value - scsi_memory_lower_value) / 1024,
2308 (scsi_init_memory_start - scsi_memory_lower_value) / 1024,
2309 (scsi_memory_upper_value - scsi_init_memory_start) / 1024);
2310 #endif
2311
2312 return 0;
2313 }
2314
2315
2316
2317
2318
2319 static void scsi_unregister_host(Scsi_Host_Template * tpnt)
2320 {
2321 Scsi_Host_Template * SHT, *SHTp;
2322 Scsi_Device *sdpnt, * sdppnt, * sdpnt1;
2323 Scsi_Cmnd * SCpnt;
2324 unsigned long flags;
2325 struct Scsi_Device_Template * sdtpnt;
2326 struct Scsi_Host * shpnt, *sh1;
2327 int pcount;
2328
2329
2330
2331
2332 for(sdpnt = scsi_devices; sdpnt; sdpnt = sdpnt->next)
2333 if(sdpnt->host->hostt == tpnt && sdpnt->host->hostt->usage_count
2334 && *sdpnt->host->hostt->usage_count) return;
2335
2336 for(shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next)
2337 {
2338 if (shpnt->hostt != tpnt) continue;
2339 for(SCpnt = shpnt->host_queue; SCpnt; SCpnt = SCpnt->next)
2340 {
2341 save_flags(flags);
2342 cli();
2343 if(SCpnt->request.dev != -1) {
2344 restore_flags(flags);
2345 for(SCpnt = shpnt->host_queue; SCpnt; SCpnt = SCpnt->next)
2346 if(SCpnt->request.dev == 0xffe0) SCpnt->request.dev = -1;
2347 printk("Device busy???\n");
2348 return;
2349 }
2350 SCpnt->request.dev = 0xffe0;
2351 restore_flags(flags);
2352 }
2353 }
2354
2355
2356 for(sdpnt = scsi_devices; sdpnt; sdpnt = sdpnt->next)
2357 if(sdpnt->host->hostt == tpnt)
2358 {
2359 for(sdtpnt = scsi_devicelist; sdtpnt; sdtpnt = sdtpnt->next)
2360 if(sdtpnt->detach) (*sdtpnt->detach)(sdpnt);
2361
2362 if (sdpnt->attached) {
2363 printk("Attached usage count = %d\n", sdpnt->attached);
2364 return;
2365 }
2366 }
2367
2368
2369
2370 for(sdpnt = scsi_devices; sdpnt; sdpnt = sdpnt->next)
2371 if(sdpnt->host->hostt == tpnt)
2372 while (sdpnt->host->host_queue) {
2373 SCpnt = sdpnt->host->host_queue->next;
2374 scsi_init_free((char *) sdpnt->host->host_queue, sizeof(Scsi_Cmnd));
2375 sdpnt->host->host_queue = SCpnt;
2376 if (SCpnt) SCpnt->prev = NULL;
2377 }
2378
2379
2380
2381 sdppnt = NULL;
2382 for(sdpnt = scsi_devices; sdpnt; sdpnt = sdpnt1)
2383 {
2384 sdpnt1 = sdpnt->next;
2385 if (sdpnt->host->hostt == tpnt) {
2386 if (sdppnt)
2387 sdppnt->next = sdpnt->next;
2388 else
2389 scsi_devices = sdpnt->next;
2390 scsi_init_free((char *) sdpnt, sizeof (Scsi_Device));
2391 } else
2392 sdppnt = sdpnt;
2393 }
2394
2395
2396
2397
2398 shpnt = scsi_hostlist;
2399 while(shpnt) {
2400 sh1 = shpnt->next;
2401 if(shpnt->hostt == tpnt) {
2402 if(shpnt->loaded_as_module) {
2403 pcount = next_scsi_host;
2404 if(tpnt->release)
2405 (*tpnt->release)(shpnt);
2406 else {
2407
2408
2409 if (shpnt->irq) free_irq(shpnt->irq);
2410 if (shpnt->dma_channel != 0xff) free_dma(shpnt->dma_channel);
2411 if (shpnt->io_port && shpnt->n_io_port)
2412 release_region(shpnt->io_port, shpnt->n_io_port);
2413 }
2414 if(pcount == next_scsi_host) scsi_unregister(shpnt);
2415 tpnt->present--;
2416 }
2417 }
2418 shpnt = sh1;
2419 }
2420
2421 printk ("scsi : %d host%s.\n", next_scsi_host,
2422 (next_scsi_host == 1) ? "" : "s");
2423
2424 #if defined(USE_STATIC_SCSI_MEMORY)
2425 printk ("SCSI memory: total %ldKb, used %ldKb, free %ldKb.\n",
2426 (scsi_memory_upper_value - scsi_memory_lower_value) / 1024,
2427 (scsi_init_memory_start - scsi_memory_lower_value) / 1024,
2428 (scsi_memory_upper_value - scsi_init_memory_start) / 1024);
2429 #endif
2430
2431 scsi_make_blocked_list();
2432
2433
2434
2435 if (tpnt->present) return;
2436
2437
2438
2439 for(SHTp=NULL, SHT=scsi_hosts; SHT; SHTp=SHT, SHT=SHT->next)
2440 if(SHT == tpnt) {
2441 if(SHTp)
2442 SHTp->next = SHT->next;
2443 else
2444 scsi_hosts = SHT->next;
2445 SHT->next = NULL;
2446 break;
2447 }
2448 }
2449
2450 int scsi_register_module(int module_type, void * ptr)
2451 {
2452 switch(module_type){
2453 case MODULE_SCSI_HA:
2454 return scsi_register_host((Scsi_Host_Template *) ptr);
2455
2456
2457
2458 case MODULE_SCSI_CONST:
2459
2460
2461
2462 case MODULE_SCSI_IOCTL:
2463
2464
2465 case MODULE_SCSI_DEV:
2466 default:
2467 return 1;
2468 }
2469 }
2470
2471 void scsi_unregister_module(int module_type, void * ptr)
2472 {
2473 switch(module_type) {
2474 case MODULE_SCSI_HA:
2475 scsi_unregister_host((Scsi_Host_Template *) ptr);
2476 break;
2477
2478 case MODULE_SCSI_CONST:
2479 case MODULE_SCSI_IOCTL:
2480 case MODULE_SCSI_DEV:
2481 default:
2482 }
2483 return;
2484 }
2485
2486 #ifdef DEBUG_TIMEOUT
2487 static void
2488 scsi_dump_status(void)
2489 {
2490 int i;
2491 struct Scsi_Host * shpnt;
2492 Scsi_Cmnd * SCpnt;
2493 printk("Dump of scsi parameters:\n");
2494 i = 0;
2495 for(shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next)
2496 for(SCpnt=shpnt->host_queue; SCpnt; SCpnt = SCpnt->next)
2497 {
2498
2499 printk("(%d) %d:%d:%d (%4.4x %ld %ld %ld %ld) (%d %d %x) (%d %d %d) %x %x %x\n",
2500 i++, SCpnt->host->host_no,
2501 SCpnt->target,
2502 SCpnt->lun,
2503 SCpnt->request.dev,
2504 SCpnt->request.sector,
2505 SCpnt->request.nr_sectors,
2506 SCpnt->request.current_nr_sectors,
2507 SCpnt->use_sg,
2508 SCpnt->retries,
2509 SCpnt->allowed,
2510 SCpnt->flags,
2511 SCpnt->timeout_per_command,
2512 SCpnt->timeout,
2513 SCpnt->internal_timeout,
2514 SCpnt->cmnd[0],
2515 SCpnt->sense_buffer[2],
2516 SCpnt->result);
2517 }
2518 printk("wait_for_request = %p\n", wait_for_request);
2519
2520 printk("Dump of pending block device requests\n");
2521 for(i=0; i<MAX_BLKDEV; i++)
2522 if(blk_dev[i].current_request)
2523 {
2524 struct request * req;
2525 printk("%d: ", i);
2526 req = blk_dev[i].current_request;
2527 while(req) {
2528 printk("(%x %d %ld %ld %ld) ",
2529 req->dev,
2530 req->cmd,
2531 req->sector,
2532 req->nr_sectors,
2533 req->current_nr_sectors);
2534 req = req->next;
2535 }
2536 printk("\n");
2537 }
2538 }
2539 #endif
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556