This source file includes following definitions.
- append_SC
- remove_first_SC
- remove_SC
- make_acklow
- getphase
- aha152x_setup
- aha152x_porttest
- aha152x_detect
- aha152x_info
- aha152x_queue
- aha152x_command
- aha152x_abort
- aha152x_reset_ports
- aha152x_reset
- aha152x_biosparam
- aha152x_done
- aha152x_intr
- aha152x_panic
- disp_ports
- disp_enintr
- enter_driver
- leave_driver
- show_command
- show_queues
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158 #include "aha152x.h"
159
160 #include <linux/sched.h>
161 #include <asm/io.h>
162 #include "../block/blk.h"
163 #include "scsi.h"
164 #include "hosts.h"
165 #include "constants.h"
166 #include <asm/system.h>
167 #include <linux/errno.h>
168 #include <linux/string.h>
169 #include <linux/wait.h>
170 #include <linux/ioport.h>
171
172
173
174
175
176
177 #if !defined(AUTOCONF)
178 #if !defined(IRQ)
179 #error undefined IRQ; define AUTOCONF or IRQ
180 #endif
181 #if !defined(SCSI_ID)
182 #error undefined SCSI_ID; define AUTOCONF or SCSI_ID
183 #endif
184 #if !defined(RECONNECT)
185 #error undefined RECONNECT; define AUTOCONF or RECONNECT
186 #endif
187 #endif
188
189
190 #define DEBUG_TIMING
191
192 #if defined(DEBUG)
193
194 #undef SKIP_PORTS
195
196 #undef DEBUG_QUEUE
197 #undef DEBUG_RESET
198 #undef DEBUG_INTR
199 #undef DEBUG_SELECTION
200 #undef DEBUG_MSGO
201 #undef DEBUG_MSGI
202 #undef DEBUG_STATUS
203 #undef DEBUG_CMD
204 #undef DEBUG_DATAI
205 #undef DEBUG_DATAO
206 #undef DEBUG_ABORT
207 #undef DEBUG_DONE
208 #undef DEBUG_BIOSPARAM
209
210 #undef DEBUG_RACE
211 #undef DEBUG_PHASES
212 #undef DEBUG_QUEUES
213
214
215 #if 0
216 #define DEBUG_PHASES
217 #define DEBUG_DATAI
218 #endif
219
220 #endif
221
222 #define DEBUG_RESET
223 #define DEBUG_ABORT
224
225
226
227
228 #define P_BUSFREE 1
229 #define P_PARITY 2
230
231 char *aha152x_id = "Adaptec 152x SCSI driver; $Revision: 0.101 $\n";
232
233 static int port_base = 0;
234 static int this_host = 0;
235 static int can_disconnect = 0;
236 static int commands = 0;
237
238
239 static int setup_called = 0;
240 static int setup_portbase = 0;
241 static int setup_irq = 0;
242 static int setup_scsiid = 0;
243 static int setup_reconnect = 0;
244
245 static char *setup_str = (char *)NULL;
246
247 enum {
248 not_issued = 0x01,
249 in_selection = 0x02,
250 disconnected = 0x04,
251 aborted = 0x08,
252 sent_ident = 0x10,
253 in_other = 0x20,
254 };
255
256
257
258
259
260
261
262 static Scsi_Cmnd *issue_SC = NULL;
263 static Scsi_Cmnd *current_SC = NULL;
264 static Scsi_Cmnd *disconnected_SC = NULL;
265
266 static struct wait_queue *abortion_complete;
267 static int abort_result;
268
269 void aha152x_intr( int irqno );
270 void aha152x_done( int error );
271 void aha152x_setup( char *str, int *ints );
272
273 static void aha152x_reset_ports(void);
274 static void aha152x_panic(char *msg);
275
276 static void disp_ports(void);
277 static void show_command(Scsi_Cmnd *ptr);
278 static void show_queues(void);
279 static void disp_enintr(void);
280
281 #if defined(DEBUG_RACE)
282 static void enter_driver(const char *);
283 static void leave_driver(const char *);
284 #endif
285
286
287 static void *addresses[] =
288 {
289 (void *) 0xdc000,
290 (void *) 0xc8000,
291 (void *) 0xcc000,
292 (void *) 0xd0000,
293 (void *) 0xd4000,
294 (void *) 0xd8000,
295 (void *) 0xe0000,
296 (void *) 0xf0000,
297 };
298 #define ADDRESS_COUNT (sizeof( addresses ) / sizeof( unsigned ))
299
300
301 static unsigned short ports[] =
302 {
303 0x340,
304 0x140
305 };
306 #define PORT_COUNT (sizeof( ports ) / sizeof( unsigned short ))
307
308
309 static unsigned short ints[] = { 9, 10, 11, 12 };
310
311
312 static struct signature {
313 char *signature;
314 int sig_offset;
315 int sig_length;
316 } signatures[] =
317 {
318 {
319 "Adaptec AHA-1520 BIOS\r\n\0\
320 Version 1.4 \r\n\0\
321 Copyright 1990 Adaptec, Inc.\r\n\
322 All Rights Reserved\r\n \r\n \r\n", 0x102e, 101
323 },
324 {
325 "Adaptec ASW-B626 BIOS\r\n\0\
326 Version 1.0 \r\n\0\
327 Copyright 1990 Adaptec, Inc.\r\n\
328 All Rights Reserved\r\n\0 \r\n \r\n", 0x1029, 102
329 },
330 { "Adaptec BIOS: ASW-B626", 0x0F, 22},
331 { "Adaptec ASW-B626 S2 BIOS", 0x2e6c, 24},
332 };
333 #define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature ))
334
335
336 static void do_pause( unsigned amount )
337 {
338 unsigned long the_time = jiffies + amount;
339
340 while (jiffies < the_time)
341 ;
342 }
343
344
345
346
347 static inline void append_SC( Scsi_Cmnd **SC, Scsi_Cmnd *new_SC)
348 {
349 Scsi_Cmnd *end;
350
351 new_SC->host_scribble = (unsigned char *) NULL;
352 if(!*SC)
353 *SC=new_SC;
354 else
355 {
356 for( end=*SC;
357 end->host_scribble;
358 end = (Scsi_Cmnd *) end->host_scribble )
359 ;
360 end->host_scribble = (unsigned char *) new_SC;
361 }
362 }
363
364 static inline Scsi_Cmnd *remove_first_SC( Scsi_Cmnd **SC )
365 {
366 Scsi_Cmnd *ptr;
367
368 ptr=*SC;
369 if(ptr)
370 *SC= (Scsi_Cmnd *) (*SC)->host_scribble;
371 return ptr;
372 }
373
374 static inline Scsi_Cmnd *remove_SC( Scsi_Cmnd **SC, int target, int lun )
375 {
376 Scsi_Cmnd *ptr, *prev;
377
378 for( ptr=*SC, prev=NULL;
379 ptr && ((ptr->target!=target) || (ptr->lun!=lun));
380 prev = ptr, ptr = (Scsi_Cmnd *) ptr->host_scribble )
381 ;
382
383 if(ptr)
384 if(prev)
385 prev->host_scribble = ptr->host_scribble;
386 else
387 *SC= (Scsi_Cmnd *) ptr->host_scribble;
388 return ptr;
389 }
390
391
392
393
394 static void make_acklow(void)
395 {
396 SETPORT( SXFRCTL0, CH1|SPIOEN );
397 GETPORT(SCSIDAT);
398 SETPORT( SXFRCTL0, CH1 );
399
400 while( TESTHI( SCSISIG, ACKI ) )
401 ;
402 }
403
404
405
406
407
408
409
410
411
412
413
414 static int getphase(void)
415 {
416 int phase, sstat1;
417
418 while( 1 )
419 {
420 do
421 {
422 while( !( ( sstat1 = GETPORT( SSTAT1 ) ) & (BUSFREE|SCSIRSTI|REQINIT ) ) )
423 ;
424 if( sstat1 & BUSFREE )
425 return P_BUSFREE;
426 if( sstat1 & SCSIRSTI )
427 {
428
429 printk("aha152x: RESET IN\n");
430 SETPORT( SSTAT1, SCSIRSTI );
431 }
432 }
433 while( TESTHI( SCSISIG, ACKI ) || TESTLO( SSTAT1, REQINIT ) );
434
435 SETPORT( SSTAT1, CLRSCSIPERR );
436
437 phase = GETPORT( SCSISIG ) & P_MASK ;
438
439 if( TESTHI( SSTAT1, SCSIPERR ) )
440 {
441 if( (phase & (CDO|MSGO))==0 )
442 return P_PARITY;
443
444 make_acklow();
445 }
446 else
447 return phase;
448 }
449 }
450
451
452 void aha152x_setup( char *str, int *ints)
453 {
454 if(setup_called)
455 panic("aha152x: aha152x_setup called twice.\n");
456
457 setup_called=ints[0];
458 setup_str=str;
459
460 if(ints[0] != 4)
461 return;
462
463 setup_portbase = ints[1];
464 setup_irq = ints[2];
465 setup_scsiid = ints[3];
466 setup_reconnect = ints[4];
467 }
468
469
470
471
472 static int aha152x_porttest(int port_base)
473 {
474 int i;
475
476 if(check_region(port_base, TEST-SCSISEQ))
477 return 0;
478
479 SETPORT( DMACNTRL1, 0 );
480 for(i=0; i<16; i++)
481 SETPORT( STACK, i );
482
483 SETPORT( DMACNTRL1, 0 );
484 for(i=0; i<16 && GETPORT(STACK)==i; i++)
485 ;
486
487 return(i==16);
488 }
489
490 int aha152x_detect(int hostno)
491 {
492 int i, j, ok;
493 aha152x_config conf;
494 struct sigaction sa;
495 int interrupt_level;
496
497 #if defined(DEBUG_RACE)
498 enter_driver("detect");
499 #endif
500
501 printk("aha152x: Probing: ");
502
503 if(setup_called)
504 {
505 printk("processing commandline: ");
506
507 if(setup_called!=4)
508 {
509 printk("\naha152x: %s\n", setup_str );
510 printk("aha152x: usage: aha152x=<PORTBASE>,<IRQ>,<SCSI ID>,<RECONNECT>\n");
511 panic("aha152x panics in line %d", __LINE__);
512 }
513
514 port_base = setup_portbase;
515 interrupt_level = setup_irq;
516 this_host = setup_scsiid;
517 can_disconnect = setup_reconnect;
518
519 for( i=0; i<PORT_COUNT && (port_base != ports[i]); i++)
520 ;
521
522 if(i==PORT_COUNT)
523 {
524 printk("unknown portbase 0x%03x\n", port_base);
525 panic("aha152x panics in line %d", __LINE__);
526 }
527
528 if(!aha152x_porttest(port_base))
529 {
530 printk("portbase 0x%03x fails probe\n", port_base);
531 panic("aha152x panics in line %d", __LINE__);
532 }
533
534 i=0;
535 while(ints[i] && (interrupt_level!=ints[i]))
536 i++;
537 if(!ints[i])
538 {
539 printk("illegal IRQ %d\n", interrupt_level);
540 panic("aha152x panics in line %d", __LINE__);
541 }
542
543 if( (this_host < 0) || (this_host > 7) )
544 {
545 printk("illegal SCSI ID %d\n", this_host);
546 panic("aha152x panics in line %d", __LINE__);
547 }
548
549 if( (can_disconnect < 0) || (can_disconnect > 1) )
550 {
551 printk("reconnect %d should be 0 or 1\n", can_disconnect);
552 panic("aha152x panics in line %d", __LINE__);
553 }
554 printk("ok, ");
555 }
556 else
557 {
558 #if !defined(SKIP_BIOSTEST)
559 printk("BIOS test: ");
560 ok=0;
561 for( i=0; i < ADDRESS_COUNT && !ok; i++)
562 for( j=0; (j < SIGNATURE_COUNT) && !ok; j++)
563 ok=!memcmp((void *) addresses[i]+signatures[j].sig_offset,
564 (void *) signatures[j].signature,
565 (int) signatures[j].sig_length);
566
567 if(!ok)
568 {
569 #if defined(DEBUG_RACE)
570 leave_driver("(1) detect");
571 #endif
572 printk("failed\n");
573 return 0;
574 }
575 printk("ok, ");
576 #endif
577
578 #if !defined(PORTBASE)
579 printk("porttest: ");
580 for( i=0; i<PORT_COUNT && !aha152x_porttest(ports[i]); i++)
581 ;
582
583 if(i==PORT_COUNT)
584 {
585 printk("failed\n");
586 #if defined(DEBUG_RACE)
587 leave_driver("(2) detect");
588 #endif
589 return 0;
590 }
591 else
592 port_base=ports[i];
593 printk("ok, ");
594 #else
595 port_base=PORTBASE;
596 #endif
597
598 #if defined(AUTOCONF)
599
600 conf.cf_port = (GETPORT(PORTA)<<8) + GETPORT(PORTB);
601
602 interrupt_level = ints[conf.cf_irq];
603 this_host = conf.cf_id;
604 can_disconnect = conf.cf_tardisc;
605
606 printk("auto configuration: ok, ");
607
608 #endif
609
610 #if defined(IRQ)
611 interrupt_level = IRQ;
612 #endif
613
614 #if defined(SCSI_ID)
615 this_host = SCSI_ID;
616 #endif
617
618 #if defined(RECONNECT)
619 can_disconnect=RECONNECT;
620 #endif
621 }
622
623 printk("detection complete\n");
624
625 sa.sa_handler = aha152x_intr;
626 sa.sa_flags = SA_INTERRUPT;
627 sa.sa_mask = 0;
628 sa.sa_restorer = NULL;
629
630 ok = irqaction( interrupt_level, &sa);
631
632 if(ok<0)
633 {
634 if(ok == -EINVAL)
635 {
636 printk("aha152x: bad IRQ %d.\n", interrupt_level);
637 printk(" Contact author.\n");
638 }
639 else
640 if( ok == -EBUSY)
641 printk( "aha152x: IRQ %d already in use. Configure another.\n",
642 interrupt_level);
643 else
644 {
645 printk( "\naha152x: Unexpected error code on requesting IRQ %d.\n",
646 interrupt_level);
647 printk(" Contact author.\n");
648 }
649 panic("aha152x: driver needs an IRQ.\n");
650 }
651
652 SETPORT( SCSIID, this_host << 4 );
653 scsi_hosts[hostno].this_id=this_host;
654
655 if(can_disconnect)
656 scsi_hosts[hostno].can_queue=AHA152X_MAXQUEUE;
657
658
659 SETBITS(SCSISEQ, SCSIRSTO );
660 do_pause(5);
661 CLRBITS(SCSISEQ, SCSIRSTO );
662 do_pause(10);
663
664 aha152x_reset(NULL);
665
666 printk("aha152x: vital data: PORTBASE=0x%03x, IRQ=%d, SCSI ID=%d, reconnect=%s, parity=enabled\n",
667 port_base, interrupt_level, this_host, can_disconnect ? "enabled" : "disabled" );
668
669 snarf_region(port_base, TEST-SCSISEQ);
670
671
672 SETPORT(SIMODE0, 0);
673 SETPORT(SIMODE1, 0);
674
675 #if defined(DEBUG_RACE)
676 leave_driver("(3) detect");
677 #endif
678
679 SETBITS( DMACNTRL0, INTEN);
680 return 1;
681 }
682
683
684
685
686 const char *aha152x_info(void)
687 {
688 #if defined(DEBUG_RACE)
689 enter_driver("info");
690 leave_driver("info");
691 #else
692 #if defined(DEBUG_INFO)
693 printk("\naha152x: info()\n");
694 #endif
695 #endif
696 return(aha152x_id);
697 }
698
699
700
701
702 int aha152x_queue( Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
703 {
704 #if defined(DEBUG_RACE)
705 enter_driver("queue");
706 #else
707 #if defined(DEBUG_QUEUE)
708 printk("aha152x: queue(), ");
709 #endif
710 #endif
711
712
713 #if defined(DEBUG_QUEUE)
714 printk( "SCpnt (target = %d lun = %d cmnd = 0x%02x pieces = %d size = %u), ",
715 SCpnt->target,
716 SCpnt->lun,
717 *(unsigned char *)SCpnt->cmnd,
718 SCpnt->use_sg,
719 SCpnt->request_bufflen );
720 disp_ports();
721 #endif
722
723 SCpnt->scsi_done = done;
724
725
726
727
728
729
730
731 SCpnt->SCp.phase = not_issued;
732 if (SCpnt->use_sg)
733 {
734 SCpnt->SCp.buffer = (struct scatterlist *)SCpnt->request_buffer;
735 SCpnt->SCp.ptr = SCpnt->SCp.buffer->address;
736 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
737 SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
738 }
739 else
740 {
741 SCpnt->SCp.ptr = (char *)SCpnt->request_buffer;
742 SCpnt->SCp.this_residual = SCpnt->request_bufflen;
743 SCpnt->SCp.buffer = NULL;
744 SCpnt->SCp.buffers_residual = 0;
745 }
746
747 SCpnt->SCp.Status = CHECK_CONDITION;
748 SCpnt->SCp.Message = 0;
749 SCpnt->SCp.have_data_in = 0;
750 SCpnt->SCp.sent_command = 0;
751
752
753 cli();
754 commands++;
755 if(commands==1)
756 SETPORT( PORTA, 1 );
757
758 #if defined(DEBUG_QUEUES)
759 printk("i+ (%d), ", commands );
760 #endif
761 append_SC( &issue_SC, SCpnt);
762
763
764 if(!current_SC)
765 {
766 SETPORT(SIMODE0, disconnected_SC ? ENSELDI : 0 );
767 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
768 }
769 sti();
770
771 return 0;
772 }
773
774
775
776
777 int aha152x_command( Scsi_Cmnd *SCpnt )
778 {
779 printk( "aha152x: interrupt driven driver; use aha152x_queue()\n" );
780 return -1;
781 }
782
783
784
785
786
787 int aha152x_abort( Scsi_Cmnd *SCpnt, int code )
788 {
789 Scsi_Cmnd *ptr, *prev;
790
791 cli();
792
793 #if defined(DEBUG_ABORT)
794 printk("aha152x: abort(), SCpnt=0x%08x, ", (unsigned long) SCpnt );
795 #endif
796
797 show_queues();
798
799
800 for( ptr=issue_SC, prev=NULL;
801 ptr && ptr!=SCpnt;
802 prev=ptr, ptr=(Scsi_Cmnd *) ptr->host_scribble)
803 ;
804
805 if(ptr)
806 {
807
808 if(prev)
809 prev->host_scribble = ptr->host_scribble;
810 else
811 issue_SC = (Scsi_Cmnd *) ptr->host_scribble;
812 sti();
813
814 ptr->host_scribble = NULL;
815 ptr->result = (code ? code : DID_ABORT ) << 16;
816 ptr->done(ptr);
817 return 0;
818 }
819
820
821 if (current_SC)
822 {
823 sti();
824 return -1;
825 }
826
827
828 for( ptr=disconnected_SC, prev=NULL;
829 ptr && ptr!=SCpnt;
830 prev=ptr, ptr=(Scsi_Cmnd *) ptr->host_scribble)
831 ;
832
833 if(ptr && TESTLO(SSTAT1, BUSFREE) )
834 printk("bus busy but no current command, ");
835
836 if(ptr && TESTHI(SSTAT1, BUSFREE) )
837 {
838
839 if(prev)
840 prev->host_scribble = ptr->host_scribble;
841 else
842 issue_SC = (Scsi_Cmnd *) ptr->host_scribble;
843
844
845
846 current_SC = ptr;
847 ptr->SCp.phase = in_selection|aborted;
848 SETPORT( SCSIID, (this_host << OID_) | current_SC->target );
849
850
851 SETPORT( SIMODE0, ENSELDO | (disconnected_SC ? ENSELDI : 0) );
852 SETPORT( SIMODE1, ENSELTIMO );
853
854
855 SETBITS(SCSISEQ, ENSELO | ENAUTOATNO );
856
857 SETBITS( DMACNTRL0, INTEN );
858 abort_result=0;
859 sti();
860
861
862 sleep_on( &abortion_complete );
863 return abort_result;
864 }
865 else
866 printk("aha152x: bus busy but no current command\n");
867
868
869 sti();
870 return 0;
871 }
872
873
874
875
876 static void aha152x_reset_ports(void)
877 {
878
879 SETPORT(DMACNTRL0, RSTFIFO);
880
881 SETPORT(SCSISEQ, 0);
882
883 SETPORT(SXFRCTL1, 0);
884 SETPORT( SCSISIG, 0);
885 SETPORT(SCSIRATE, 0);
886
887
888 SETPORT(SSTAT0, 0x7f);
889 SETPORT(SSTAT1, 0xef);
890
891 SETPORT(SSTAT4, SYNCERR|FWERR|FRERR);
892
893 SETPORT(DMACNTRL0, 0);
894 SETPORT(DMACNTRL1, 0);
895
896 SETPORT(BRSTCNTRL, 0xf1);
897
898
899 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
900 SETPORT(SXFRCTL0, CH1);
901
902
903 SETPORT(SIMODE0, disconnected_SC ? ENSELDI : 0 );
904 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
905 }
906
907
908
909
910
911 int aha152x_reset(Scsi_Cmnd * __unused)
912 {
913 Scsi_Cmnd *ptr;
914
915 aha152x_reset_ports();
916
917
918 if( TESTLO( SSTAT1, BUSFREE ) )
919 {
920 CLRBITS( DMACNTRL0, INTEN );
921
922 #if defined( DEBUG_RESET )
923 printk("aha152x: reset(), bus not free: SCSI RESET OUT\n");
924 #endif
925
926 show_queues();
927
928 if(current_SC)
929 {
930 current_SC->host_scribble = NULL;
931 current_SC->result = DID_RESET << 16;
932 current_SC->done(current_SC);
933 current_SC=NULL;
934 }
935
936 while(disconnected_SC)
937 {
938 ptr = disconnected_SC;
939 disconnected_SC = (Scsi_Cmnd *) ptr->host_scribble;
940 ptr->host_scribble = NULL;
941 ptr->result = DID_RESET << 16;
942 ptr->done(ptr);
943 }
944
945
946 SETPORT(SCSISEQ, SCSIRSTO);
947 do_pause(5);
948 SETPORT(SCSISEQ, 0);
949 do_pause(10);
950
951 SETPORT(SIMODE0, 0 );
952 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
953
954 SETPORT( DMACNTRL0, INTEN );
955 }
956
957 return 0;
958 }
959
960
961
962
963 int aha152x_biosparam( int size, int dev, int *info_array )
964 {
965 #if defined(DEBUG_RACE)
966 enter_driver("biosparam");
967 #else
968 #if defined(DEBUG_BIOSPARAM)
969 printk("\naha152x: biosparam(), ");
970 #endif
971 #endif
972
973 #if defined(DEBUG_BIOSPARAM)
974 printk("dev=%x, size=%d, ", dev, size);
975 #endif
976
977
978
979 info_array[0]=64;
980 info_array[1]=32;
981 info_array[2]=size>>11;
982
983 #if defined(DEBUG_BIOSPARAM)
984 printk("bios geometry: head=%d, sec=%d, cyl=%d\n",
985 info_array[0], info_array[1], info_array[2]);
986 printk("WARNING: check, if the bios geometry is correct.\n");
987 #endif
988
989 #if defined(DEBUG_RACE)
990 leave_driver("biosparam");
991 #endif
992 return 0;
993 }
994
995
996
997
998 void aha152x_done( int error )
999 {
1000 Scsi_Cmnd *done_SC;
1001
1002 #if defined(DEBUG_DONE)
1003 printk("\naha152x: done(), ");
1004 disp_ports();
1005 #endif
1006
1007 if (current_SC)
1008 {
1009 #if defined(DEBUG_DONE)
1010 printk("done(%x), ", error);
1011 #endif
1012
1013 cli();
1014
1015 done_SC = current_SC;
1016 current_SC = NULL;
1017
1018
1019 commands--;
1020 if(!commands)
1021 SETPORT( PORTA, 0 );
1022
1023 #if defined(DEBUG_QUEUES)
1024 printk("ok (%d), ", commands);
1025 #endif
1026 sti();
1027
1028 SETPORT(SIMODE0, disconnected_SC ? ENSELDI : 0 );
1029 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
1030
1031 #if defined(DEBUG_PHASES)
1032 printk("BUS FREE loop, ");
1033 #endif
1034 while( TESTLO( SSTAT1, BUSFREE ) )
1035 ;
1036 #if defined(DEBUG_PHASES)
1037 printk("BUS FREE\n");
1038 #endif
1039
1040 done_SC->result = error;
1041 if(done_SC->scsi_done)
1042 {
1043 #if defined(DEBUG_DONE)
1044 printk("calling scsi_done, ");
1045 #endif
1046 done_SC->scsi_done( done_SC );
1047 #if defined(DEBUG_DONE)
1048 printk("done returned, ");
1049 #endif
1050 }
1051 else
1052 panic( "aha152x: current_SC->scsi_done() == NULL" );
1053 }
1054 else
1055 aha152x_panic( "done() called outside of command" );
1056 }
1057
1058
1059
1060
1061 void aha152x_intr( int irqno )
1062 {
1063 int done=0, phase;
1064
1065 #if defined(DEBUG_RACE)
1066 enter_driver("intr");
1067 #else
1068 #if defined(DEBUG_INTR)
1069 printk("\naha152x: intr(), ");
1070 #endif
1071 #endif
1072
1073
1074
1075
1076
1077 CLRBITS( DMACNTRL0, INTEN);
1078 sti();
1079
1080
1081
1082
1083
1084 if( TESTHI( SSTAT0, SELDI ) &&
1085 disconnected_SC &&
1086 ( !current_SC || ( current_SC->SCp.phase & in_selection ) )
1087 )
1088 {
1089 int identify_msg, target, i;
1090
1091
1092
1093 if(current_SC)
1094 {
1095 #if defined(DEBUG_QUEUES)
1096 printk("i+, ");
1097 #endif
1098 cli();
1099 append_SC( &issue_SC, current_SC);
1100 current_SC=NULL;
1101 sti();
1102 }
1103
1104
1105 SETPORT( SCSISEQ, 0 );
1106 SETPORT( SSTAT0, CLRSELDI );
1107 SETPORT( SSTAT1, CLRBUSFREE );
1108
1109 #if defined(DEBUG_QUEUES) || defined(DEBUG_PHASES)
1110 printk("reselected, ");
1111 #endif
1112
1113 i = GETPORT(SELID) & ~(1 << this_host);
1114 target=0;
1115 if(i)
1116 for( ; (i & 1)==0; target++, i>>=1)
1117 ;
1118 else
1119 aha152x_panic("reconnecting target unknown");
1120
1121 #if defined(DEBUG_QUEUES)
1122 printk("SELID=%02x, target=%d, ", GETPORT(SELID), target );
1123 #endif
1124 SETPORT( SCSIID, (this_host << OID_) | target );
1125 SETPORT( SCSISEQ, ENRESELI );
1126
1127 if(TESTLO( SSTAT0, SELDI ))
1128 aha152x_panic("RESELI failed");
1129
1130 SETPORT( SCSISIG, P_MSGI );
1131
1132
1133 if((i=getphase())!=P_MSGI)
1134 {
1135 printk("target doesn't enter MSGI to identify (phase=%02x)\n", i);
1136 aha152x_panic("unknown lun");
1137 }
1138 SETPORT( SCSISEQ, 0 );
1139
1140 SETPORT( SXFRCTL0, CH1);
1141
1142 identify_msg = GETPORT(SCSIBUS);
1143
1144 if(!(identify_msg & IDENTIFY_BASE))
1145 {
1146 printk("target=%d, inbound message (%02x) != IDENTIFY\n",
1147 target, identify_msg);
1148 aha152x_panic("unknown lun");
1149 }
1150
1151 make_acklow();
1152 getphase();
1153
1154 #if defined(DEBUG_QUEUES)
1155 printk("identify=%02x, lun=%d, ", identify_msg, identify_msg & 0x3f );
1156 #endif
1157
1158 cli();
1159 #if defined(DEBUG_QUEUES)
1160 printk("d-, ");
1161 #endif
1162 current_SC = remove_SC( &disconnected_SC,
1163 target,
1164 identify_msg & 0x3f );
1165
1166 if(!current_SC)
1167 {
1168 printk("lun=%d, ", identify_msg & 0x3f );
1169 aha152x_panic("no disconnected command for that lun");
1170 }
1171
1172 current_SC->SCp.phase &= ~disconnected;
1173 sti();
1174
1175 SETPORT( SIMODE0, 0 );
1176 SETPORT( SIMODE1, ENPHASEMIS );
1177 #if defined(DEBUG_RACE)
1178 leave_driver("(reselected) intr");
1179 #endif
1180 SETBITS( DMACNTRL0, INTEN);
1181 return;
1182 }
1183
1184
1185 if(!current_SC)
1186 {
1187
1188 if(TESTHI( SSTAT1, BUSFREE) && issue_SC)
1189 {
1190 cli();
1191 #if defined(DEBUG_QUEUES)
1192 printk("i-, ");
1193 #endif
1194 current_SC = remove_first_SC( &issue_SC );
1195 sti();
1196
1197 #if defined(DEBUG_INTR) || defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1198 printk("issueing command, ");
1199 #endif
1200 current_SC->SCp.phase = in_selection;
1201
1202 #if defined(DEBUG_INTR) || defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1203 printk("selecting %d, ", current_SC->target);
1204 #endif
1205 SETPORT( SCSIID, (this_host << OID_) | current_SC->target );
1206
1207
1208 SETPORT( SXFRCTL1, ENSPCHK|ENSTIMER);
1209
1210
1211 SETPORT( SIMODE0, ENSELDO | (disconnected_SC ? ENSELDI : 0) );
1212 SETPORT( SIMODE1, ENSELTIMO );
1213
1214
1215 SETBITS(SCSISEQ, ENSELO | ENAUTOATNO );
1216
1217 #if defined(DEBUG_RACE)
1218 leave_driver("(selecting) intr");
1219 #endif
1220 SETBITS( DMACNTRL0, INTEN );
1221 return;
1222 }
1223
1224
1225 printk("aha152x: ignoring spurious interrupt, nothing to do\n");
1226 return;
1227 }
1228
1229
1230
1231 #if defined(DEBUG_INTR)
1232 disp_ports();
1233 #endif
1234
1235
1236 if(current_SC->SCp.phase & in_selection)
1237 {
1238 if( TESTLO( SSTAT1, SELTO ) )
1239
1240 if( TESTHI( SSTAT0, SELDO ) )
1241 {
1242
1243 SETPORT( SSTAT1, CLRBUSFREE);
1244
1245
1246 CLRBITS(SCSISEQ, ENSELO|ENAUTOATNO );
1247
1248
1249 CLRBITS(SIMODE0, ENSELDO);
1250 CLRBITS(SIMODE1, ENSELTIMO);
1251
1252 if( TESTLO(SSTAT0, SELDO) )
1253 {
1254 printk("aha152x: passing bus free condition\n");
1255
1256 #if defined(DEBUG_RACE)
1257 leave_driver("(passing bus free) intr");
1258 #endif
1259 SETBITS( DMACNTRL0, INTEN);
1260
1261 if(current_SC->SCp.phase & aborted)
1262 {
1263 abort_result=1;
1264 wake_up( &abortion_complete );
1265 }
1266
1267 aha152x_done( DID_NO_CONNECT << 16 );
1268 return;
1269 }
1270 #if defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1271 printk("SELDO (SELID=%x), ", GETPORT(SELID));
1272 #endif
1273
1274
1275 SETPORT( SSTAT0, CLRSELDO );
1276
1277 #if defined(DEBUG_ABORT)
1278 if(current_SC->SCp.phase & aborted)
1279 printk("(ABORT) target selected, ");
1280 #endif
1281
1282 current_SC->SCp.phase &= ~in_selection;
1283 current_SC->SCp.phase |= in_other;
1284
1285 #if defined(DEBUG_RACE)
1286 leave_driver("(SELDO) intr");
1287 #endif
1288
1289 SETPORT( SCSISIG, P_MSGO );
1290
1291 SETPORT( SIMODE0, 0 );
1292 SETPORT( SIMODE1, ENREQINIT );
1293 SETBITS( DMACNTRL0, INTEN);
1294 return;
1295 }
1296 else
1297 aha152x_panic("neither timeout nor selection\007");
1298 else
1299 {
1300 #if defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1301 printk("SELTO, ");
1302 #endif
1303
1304 CLRBITS(SCSISEQ, ENSELO|ENAUTOATNO );
1305
1306
1307 SETPORT( SSTAT1, CLRSELTIMO );
1308
1309 SETPORT(SIMODE0, disconnected_SC ? ENSELDI : 0 );
1310 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
1311 SETBITS( DMACNTRL0, INTEN );
1312 #if defined(DEBUG_RACE)
1313 leave_driver("(SELTO) intr");
1314 #endif
1315
1316 if(current_SC->SCp.phase & aborted)
1317 {
1318 #if defined(DEBUG_ABORT)
1319 printk("(ABORT) selection timeout, ");
1320 #endif
1321 abort_result=1;
1322 wake_up( &abortion_complete );
1323 }
1324
1325 if( TESTLO( SSTAT0, SELINGO ) )
1326
1327 aha152x_done( DID_BUS_BUSY << 16 );
1328 else
1329
1330 aha152x_done( DID_NO_CONNECT << 16 );
1331 return;
1332 }
1333 }
1334
1335
1336 phase = getphase();
1337 if(!(phase & ~P_MASK))
1338 SETPORT(SCSISIG, phase);
1339 SETPORT(SSTAT1, CLRPHASECHG);
1340 current_SC->SCp.phase =
1341 (current_SC->SCp.phase & ~((P_MASK|1)<<16)) | (phase << 16 );
1342
1343
1344 switch( phase )
1345 {
1346 case P_MSGO:
1347 {
1348 unsigned char message;
1349
1350 #if defined(DEBUG_INTR) || defined(DEBUG_MSGO) || defined(DEBUG_PHASES)
1351 printk("MESSAGE OUT, ");
1352 #endif
1353
1354 if( current_SC->SCp.phase & aborted )
1355 {
1356 #if defined(DEBUG_MSGO) || defined(DEBUG_ABORT)
1357 printk("ABORT, ");
1358 #endif
1359 message=ABORT;
1360 }
1361 else
1362
1363
1364
1365 if( !(current_SC->SCp.phase & sent_ident))
1366 {
1367 message=IDENTIFY(can_disconnect,current_SC->lun);
1368 #if defined(DEBUG_MSGO)
1369 printk("IDENTIFY (reconnect=%s;lun=%d), ",
1370 can_disconnect ? "enabled" : "disabled", current_SC->lun);
1371 #endif
1372 }
1373 else
1374 {
1375 message=MESSAGE_REJECT;
1376 #if defined(DEBUG_MSGO)
1377 printk("REJECT, ");
1378 #endif
1379 }
1380
1381 CLRBITS( SXFRCTL0, ENDMA);
1382
1383 SETPORT( SIMODE0, 0 );
1384 SETPORT( SIMODE1, ENPHASEMIS|ENREQINIT );
1385
1386
1387 while( TESTLO( DMASTAT, INTSTAT ) )
1388 ;
1389
1390 if( TESTHI( SSTAT1, PHASEMIS ) )
1391 aha152x_panic("unable to send message");
1392
1393
1394 SETPORT( SSTAT1, CLRATNO);
1395
1396 SETPORT( SCSIDAT, message );
1397
1398 make_acklow();
1399 getphase();
1400
1401 if(message==IDENTIFY(can_disconnect,current_SC->lun))
1402 current_SC->SCp.phase |= sent_ident;
1403
1404 if(message==ABORT)
1405 {
1406
1407 abort_result=0;
1408 wake_up( &abortion_complete );
1409
1410 current_SC->SCp.phase = (current_SC->SCp.phase & ~(P_MASK<<16));
1411
1412
1413 SETBITS( DMACNTRL0, INTEN );
1414 #if defined(DEBUG_RACE)
1415 leave_driver("(ABORT) intr");
1416 #endif
1417 aha152x_done(DID_ABORT<<16);
1418 return;
1419 }
1420 }
1421 break;
1422
1423 case P_CMD:
1424 #if defined(DEBUG_INTR) || defined(DEBUG_CMD) || defined(DEBUG_PHASES)
1425 printk("COMMAND, ");
1426 #endif
1427 if( !(current_SC->SCp.sent_command) )
1428 {
1429 if(GETPORT(FIFOSTAT) || GETPORT(SSTAT2) & (SFULL|SFCNT))
1430 printk("aha152x: P_CMD: %d(%d) bytes left in FIFO, resetting\n",
1431 GETPORT(FIFOSTAT), GETPORT(SSTAT2) & (SFULL|SFCNT));
1432
1433
1434 SETPORT(DMACNTRL0, WRITE_READ|RSTFIFO);
1435 SETPORT(DMACNTRL0, ENDMA|WRITE_READ);
1436
1437
1438 SETPORT(SXFRCTL0, CH1|CLRSTCNT|CLRCH1 );
1439 SETPORT(SXFRCTL0, SCSIEN|DMAEN|CH1);
1440
1441
1442 SETPORT( SIMODE0, 0 );
1443 SETPORT( SIMODE1, ENPHASEMIS );
1444
1445 #if defined(DEBUG_CMD)
1446 printk("waiting, ");
1447 #endif
1448
1449 while( TESTLO ( DMASTAT, DFIFOEMP|INTSTAT ) )
1450 ;
1451
1452 if( TESTHI( SSTAT1, PHASEMIS ) )
1453 aha152x_panic("target left COMMAND phase");
1454
1455 #if defined(DEBUG_CMD)
1456 printk("DFIFOEMP, outsw (%d words), ",
1457 COMMAND_SIZE(current_SC->cmnd[0])>>1);
1458 disp_ports();
1459 #endif
1460
1461 outsw( DATAPORT,
1462 ¤t_SC->cmnd,
1463 COMMAND_SIZE(current_SC->cmnd[0])>>1 );
1464
1465 #if defined(DEBUG_CMD)
1466 printk("FCNT=%d, STCNT=%d, ", GETPORT(FIFOSTAT), GETSTCNT() );
1467 disp_ports();
1468 #endif
1469
1470
1471
1472 while( TESTLO ( SSTAT2, SEMPTY ) )
1473 ;
1474
1475 CLRBITS(SXFRCTL0, SCSIEN|DMAEN);
1476
1477 while( TESTHI( SXFRCTL0, SCSIEN ) )
1478 ;
1479
1480 CLRBITS(DMACNTRL0, ENDMA);
1481
1482 #if defined(DEBUG_CMD) || defined(DEBUG_INTR)
1483 printk("sent %d/%d command bytes, ", GETSTCNT(),
1484 COMMAND_SIZE(current_SC->cmnd[0]));
1485 #endif
1486
1487 }
1488 else
1489 aha152x_panic("Nothing to sent while in COMMAND OUT");
1490 break;
1491
1492 case P_MSGI:
1493 #if defined(DEBUG_INTR) || defined(DEBUG_MSGI) || defined(DEBUG_PHASES)
1494 printk("MESSAGE IN, ");
1495 #endif
1496 SETPORT( SXFRCTL0, CH1);
1497
1498 SETPORT( SIMODE0, 0);
1499 SETPORT( SIMODE1, ENBUSFREE);
1500
1501 while( phase == P_MSGI )
1502 {
1503 current_SC->SCp.Message = GETPORT( SCSIBUS );
1504 switch(current_SC->SCp.Message)
1505 {
1506 case DISCONNECT:
1507 #if defined(DEBUG_MSGI) || defined(DEBUG_PHASES)
1508 printk("target disconnected, ");
1509 #endif
1510 current_SC->SCp.Message = 0;
1511 current_SC->SCp.phase |= disconnected;
1512 if(!can_disconnect)
1513 aha152x_panic("target was not allowed to disconnect");
1514 break;
1515
1516 case COMMAND_COMPLETE:
1517 #if defined(DEBUG_MSGI) || defined(DEBUG_PHASES)
1518 printk("inbound message ( COMMAND COMPLETE ), ");
1519 #endif
1520 done++;
1521 break;
1522
1523 case MESSAGE_REJECT:
1524 #if defined(DEBUG_MSGI) || defined(DEBUG_TIMING)
1525 printk("inbound message ( MESSAGE REJECT ), ");
1526 #endif
1527 break;
1528
1529 case SAVE_POINTERS:
1530 #if defined(DEBUG_MSGI)
1531 printk("inbound message ( SAVE DATA POINTERS ), ");
1532 #endif
1533 break;
1534
1535 case EXTENDED_MESSAGE:
1536 {
1537 int i, code;
1538
1539 #if defined(DEBUG_MSGI)
1540 printk("inbound message ( EXTENDED MESSAGE ), ");
1541 #endif
1542 make_acklow();
1543 if(getphase()!=P_MSGI)
1544 break;
1545
1546 i=GETPORT(SCSIBUS);
1547
1548 #if defined(DEBUG_MSGI)
1549 printk("length (%d), ", i);
1550 #endif
1551
1552 #if defined(DEBUG_MSGI)
1553 printk("code ( ");
1554 #endif
1555
1556 make_acklow();
1557 if(getphase()!=P_MSGI)
1558 break;
1559
1560 code = GETPORT(SCSIBUS);
1561
1562 switch( code )
1563 {
1564 case 0x00:
1565 #if defined(DEBUG_MSGI)
1566 printk("MODIFY DATA POINTER ");
1567 #endif
1568 SETPORT(SCSISIG, P_MSGI|ATNO);
1569 break;
1570 case 0x01:
1571 #if defined(DEBUG_MSGI)
1572 printk("SYNCHRONOUS DATA TRANSFER REQUEST ");
1573 #endif
1574 SETPORT(SCSISIG, P_MSGI|ATNO);
1575 break;
1576 case 0x02:
1577 #if defined(DEBUG_MSGI)
1578 printk("EXTENDED IDENTIFY ");
1579 #endif
1580 break;
1581 case 0x03:
1582 #if defined(DEBUG_MSGI)
1583 printk("WIDE DATA TRANSFER REQUEST ");
1584 #endif
1585 SETPORT(SCSISIG, P_MSGI|ATNO);
1586 break;
1587 default:
1588 #if defined(DEBUG_MSGI)
1589 if( code & 0x80 )
1590 printk("reserved (%d) ", code );
1591 else
1592 printk("vendor specific (%d) ", code);
1593 #endif
1594 SETPORT(SCSISIG, P_MSGI|ATNO);
1595 break;
1596 }
1597 #if defined(DEBUG_MSGI)
1598 printk(" ), data ( ");
1599 #endif
1600 while( --i && (make_acklow(), getphase()==P_MSGI))
1601 {
1602 #if defined(DEBUG_MSGI)
1603 printk("%x ", GETPORT(SCSIBUS) );
1604 #else
1605 GETPORT(SCSIBUS);
1606 #endif
1607 }
1608 #if defined(DEBUG_MSGI)
1609 printk(" ), ");
1610 #endif
1611
1612
1613
1614
1615 SETPORT(SCSISIG, P_MSGI|ATNO);
1616 }
1617 break;
1618
1619 default:
1620 printk("unsupported inbound message %x, ", current_SC->SCp.Message);
1621 break;
1622
1623 }
1624
1625 make_acklow();
1626 phase=getphase();
1627 }
1628
1629
1630 if(phase==P_BUSFREE)
1631 SETPORT(SXFRCTL0, CH1|CLRCH1);
1632
1633 if(current_SC->SCp.phase & disconnected)
1634 {
1635 cli();
1636 #if defined(DEBUG_QUEUES)
1637 printk("d+, ");
1638 #endif
1639 append_SC( &disconnected_SC, current_SC);
1640 current_SC = NULL;
1641 sti();
1642
1643 SETBITS( SCSISEQ, ENRESELI );
1644
1645 SETPORT(SIMODE0, disconnected_SC ? ENSELDI : 0 );
1646 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
1647
1648 SETBITS( DMACNTRL0, INTEN );
1649 return;
1650 }
1651 break;
1652
1653 case P_STATUS:
1654 #if defined(DEBUG_STATUS) || defined(DEBUG_INTR) || defined(DEBUG_PHASES)
1655 printk("STATUS, ");
1656 #endif
1657 SETPORT( SXFRCTL0, CH1);
1658
1659 SETPORT( SIMODE0, 0 );
1660 SETPORT( SIMODE1, ENREQINIT );
1661
1662 if( TESTHI( SSTAT1, PHASEMIS ) )
1663 printk("aha152x: passing STATUS phase");
1664
1665 current_SC->SCp.Status = GETPORT( SCSIBUS );
1666 make_acklow();
1667 getphase();
1668
1669 #if defined(DEBUG_STATUS)
1670 printk("inbound status ");
1671 print_status( current_SC->SCp.Status );
1672 printk(", ");
1673 #endif
1674 break;
1675
1676 case P_DATAI:
1677 {
1678 int fifodata, data_count, done;
1679
1680 #if defined(DEBUG_DATAI) || defined(DEBUG_INTR) || defined(DEBUG_PHASES)
1681 printk("DATA IN, ");
1682 #endif
1683
1684 if(GETPORT(FIFOSTAT) || GETPORT(SSTAT2) & (SFULL|SFCNT))
1685 printk("aha152x: P_DATAI: %d(%d) bytes left in FIFO, resetting\n",
1686 GETPORT(FIFOSTAT), GETPORT(SSTAT2) & (SFULL|SFCNT));
1687
1688
1689 SETPORT(DMACNTRL0, RSTFIFO);
1690 SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
1691
1692 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN );
1693
1694 SETPORT( SIMODE0, 0 );
1695 SETPORT( SIMODE1, ENPHASEMIS|ENBUSFREE );
1696
1697
1698 done=0;
1699
1700
1701 while ( !done )
1702 {
1703 #if defined(DEBUG_DATAI)
1704 printk("expecting data, ");
1705 #endif
1706
1707 while( TESTLO ( DMASTAT, DFIFOFULL|INTSTAT ) )
1708 ;
1709
1710 if( TESTHI( DMASTAT, DFIFOFULL ) )
1711 fifodata=132;
1712 else
1713 {
1714
1715 while( TESTLO( SSTAT2, SEMPTY ) )
1716 ;
1717
1718
1719 fifodata=GETPORT(FIFOSTAT);
1720 #if defined(DEBUG_DATAI)
1721 printk("last transfer, ");
1722 #endif
1723 done=1;
1724 }
1725
1726 #if defined(DEBUG_DATAI)
1727 printk("fifodata=%d, ", fifodata);
1728 #endif
1729
1730 while( fifodata && current_SC->SCp.this_residual )
1731 {
1732 data_count=fifodata;
1733
1734
1735 if (data_count > current_SC->SCp.this_residual)
1736 data_count = current_SC->SCp.this_residual;
1737
1738 fifodata -= data_count;
1739
1740 #if defined(DEBUG_DATAI)
1741 printk("data_count=%d, ", data_count);
1742 #endif
1743
1744 if(data_count == 1)
1745 {
1746
1747 SETBITS(DMACNTRL0, _8BIT );
1748 *current_SC->SCp.ptr++ = GETPORT( DATAPORT );
1749 current_SC->SCp.this_residual--;
1750 }
1751 else
1752 {
1753 CLRBITS(DMACNTRL0, _8BIT );
1754 data_count >>= 1;
1755 insw( DATAPORT, current_SC->SCp.ptr, data_count );
1756 #if defined(DEBUG_DATAI)
1757
1758 if(done)
1759 {
1760 int i;
1761 unsigned char *data;
1762
1763 printk("data on last transfer (%d bytes: ",
1764 2*data_count);
1765 data = (unsigned char *) current_SC->SCp.ptr;
1766 for( i=0; i<2*data_count; i++)
1767 printk("%2x ", *data++);
1768 printk("), ");
1769 }
1770 #endif
1771 current_SC->SCp.ptr += 2 * data_count;
1772 current_SC->SCp.this_residual -= 2 * data_count;
1773 }
1774
1775
1776 if (!current_SC->SCp.this_residual &&
1777 current_SC->SCp.buffers_residual)
1778 {
1779
1780 current_SC->SCp.buffers_residual--;
1781 current_SC->SCp.buffer++;
1782 current_SC->SCp.ptr =
1783 current_SC->SCp.buffer->address;
1784 current_SC->SCp.this_residual =
1785 current_SC->SCp.buffer->length;
1786 }
1787 }
1788
1789
1790
1791
1792 if(fifodata>1)
1793 {
1794 printk("aha152x: more data than expected (%d bytes)\n",
1795 GETPORT(FIFOSTAT));
1796 }
1797
1798 #if defined(DEBUG_DATAI)
1799 if(!fifodata)
1800 printk("fifo empty, ");
1801 else
1802 printk("something left in fifo, ");
1803 #endif
1804 }
1805
1806 #if defined(DEBUG_DATAI)
1807 if(current_SC->SCp.buffers_residual || current_SC->SCp.this_residual)
1808 printk("left buffers (buffers=%d, bytes=%d), ",
1809 current_SC->SCp.buffers_residual,
1810 current_SC->SCp.this_residual);
1811 #endif
1812
1813 CLRBITS(SXFRCTL0, SCSIEN|DMAEN);
1814 while( TESTHI( SXFRCTL0, SCSIEN ) )
1815 ;
1816 CLRBITS(DMACNTRL0, ENDMA );
1817
1818 #if defined(DEBUG_DATAI) || defined(DEBUG_INTR)
1819 printk("got %d bytes, ", GETSTCNT());
1820 #endif
1821
1822 current_SC->SCp.have_data_in++;
1823 }
1824 break;
1825
1826 case P_DATAO:
1827 {
1828 int data_count;
1829
1830 #if defined(DEBUG_DATAO) || defined(DEBUG_INTR) || defined(DEBUG_PHASES)
1831 printk("DATA OUT, ");
1832 #endif
1833 #if defined(DEBUG_DATAO)
1834 printk("got data to send (bytes=%d, buffers=%d), ",
1835 current_SC->SCp.this_residual,
1836 current_SC->SCp.buffers_residual );
1837 #endif
1838
1839 if(GETPORT(FIFOSTAT) || GETPORT(SSTAT2) & (SFULL|SFCNT) )
1840 {
1841 printk("%d(%d) left in FIFO, ", GETPORT(FIFOSTAT), GETPORT(SSTAT2) & (SFULL|SFCNT) );
1842 aha152x_panic("FIFO should be empty");
1843 }
1844
1845 SETPORT(DMACNTRL0, WRITE_READ|RSTFIFO);
1846 SETPORT(DMACNTRL0, ENDMA|WRITE_READ);
1847
1848 SETPORT(SXFRCTL0, CH1|CLRSTCNT|CLRCH1 );
1849 SETPORT(SXFRCTL0, SCSIEN|DMAEN|CH1);
1850
1851 SETPORT( SIMODE0, 0 );
1852 SETPORT( SIMODE1, ENPHASEMIS );
1853
1854
1855
1856 while( TESTLO( SSTAT1, PHASEMIS ) &&
1857 (current_SC->SCp.this_residual ||
1858 current_SC->SCp.buffers_residual) )
1859 {
1860 #if defined(DEBUG_DATAO)
1861 printk("sending data (left: bytes=%d, buffers=%d), waiting, ",
1862 current_SC->SCp.this_residual,
1863 current_SC->SCp.buffers_residual);
1864 #endif
1865
1866 data_count = current_SC->SCp.this_residual > 128 ?
1867 128 : current_SC->SCp.this_residual ;
1868
1869 #if defined(DEBUG_DATAO)
1870 printk("data_count=%d, ", data_count);
1871 #endif
1872
1873 if(data_count == 1)
1874 {
1875
1876 SETBITS(DMACNTRL0, _8BIT );
1877 SETPORT(DATAPORT, *current_SC->SCp.ptr++);
1878 current_SC->SCp.this_residual--;
1879 }
1880 else
1881 {
1882 CLRBITS(DMACNTRL0, _8BIT );
1883 data_count >>= 1;
1884 outsw( DATAPORT, current_SC->SCp.ptr, data_count );
1885 current_SC->SCp.ptr += 2 * data_count;
1886 current_SC->SCp.this_residual -= 2 * data_count;
1887 }
1888
1889
1890 while( TESTLO ( DMASTAT, DFIFOEMP|INTSTAT ) )
1891 ;
1892
1893 #if defined(DEBUG_DATAO)
1894 printk("fifo (%d bytes), transfered (%d bytes), ",
1895 GETPORT(FIFOSTAT), GETSTCNT() );
1896 #endif
1897
1898
1899 if ( TESTLO( SSTAT1, PHASEMIS ) &&
1900 !current_SC->SCp.this_residual &&
1901 current_SC->SCp.buffers_residual)
1902 {
1903
1904 current_SC->SCp.buffers_residual--;
1905 current_SC->SCp.buffer++;
1906 current_SC->SCp.ptr =
1907 current_SC->SCp.buffer->address;
1908 current_SC->SCp.this_residual =
1909 current_SC->SCp.buffer->length;
1910 }
1911 }
1912
1913 if ( current_SC->SCp.this_residual ||
1914 current_SC->SCp.buffers_residual )
1915 {
1916
1917
1918
1919
1920 data_count = GETPORT(SSTAT2) & (SFULL|SFCNT);
1921
1922 data_count += GETPORT(FIFOSTAT) ;
1923 current_SC->SCp.ptr -= data_count;
1924 current_SC->SCp.this_residual += data_count;
1925 #if defined(DEBUG_DATAO)
1926 printk("left data (bytes=%d, buffers=%d), fifos (bytes=%d), transfer incomplete, resetting fifo, ",
1927 current_SC->SCp.this_residual,
1928 current_SC->SCp.buffers_residual,
1929 data_count );
1930 #endif
1931 SETPORT(DMACNTRL0, WRITE_READ|RSTFIFO);
1932 CLRBITS(SXFRCTL0, SCSIEN|DMAEN );
1933 CLRBITS(DMACNTRL0, ENDMA);
1934 }
1935 else
1936 {
1937 #if defined(DEBUG_DATAO)
1938 printk("waiting for SCSI fifo to get empty, ");
1939 #endif
1940
1941 while( TESTLO( SSTAT2, SEMPTY ) )
1942 ;
1943 #if defined(DEBUG_DATAO)
1944 printk("ok, ");
1945 #endif
1946
1947 #if defined(DEBUG_DATAO)
1948 printk("left data (bytes=%d, buffers=%d) ",
1949 current_SC->SCp.this_residual,
1950 current_SC->SCp.buffers_residual);
1951 #endif
1952 CLRBITS(SXFRCTL0, SCSIEN|DMAEN);
1953
1954
1955 while( TESTHI( SXFRCTL0, SCSIEN ) )
1956 ;
1957
1958 CLRBITS(DMACNTRL0, ENDMA);
1959 }
1960
1961 #if defined(DEBUG_DATAO) || defined(DEBUG_INTR)
1962 printk("sent %d data bytes, ", GETSTCNT() );
1963 #endif
1964 }
1965 break;
1966
1967 case P_BUSFREE:
1968 #if defined(DEBUG_RACE)
1969 leave_driver("(BUSFREE) intr");
1970 #endif
1971 #if defined(DEBUG_PHASES)
1972 printk("unexpected BUS FREE, ");
1973 #endif
1974 current_SC->SCp.phase = (current_SC->SCp.phase & ~(P_MASK<<16));
1975
1976 aha152x_done( DID_ERROR << 16 );
1977 return;
1978 break;
1979
1980 case P_PARITY:
1981 #if defined(DEBUG_RACE)
1982 leave_driver("(DID_PARITY) intr");
1983 #endif
1984 printk("PARITY error in DATA phase, ");
1985
1986 current_SC->SCp.phase = (current_SC->SCp.phase & ~(P_MASK<<16));
1987
1988 SETBITS( DMACNTRL0, INTEN );
1989 aha152x_done( DID_PARITY << 16 );
1990 return;
1991 break;
1992
1993 default:
1994 printk("aha152x: unexpected phase\n");
1995 break;
1996 }
1997
1998 if(done)
1999 {
2000 #if defined(DEBUG_INTR)
2001 printk("command done.\n");
2002 #endif
2003 #if defined(DEBUG_RACE)
2004 leave_driver("(done) intr");
2005 #endif
2006
2007 SETPORT(SIMODE0, disconnected_SC ? ENSELDI : 0 );
2008 SETPORT(SIMODE1, issue_SC ? ENBUSFREE : 0);
2009 SETPORT( SCSISEQ, disconnected_SC ? ENRESELI : 0 );
2010
2011 SETBITS( DMACNTRL0, INTEN );
2012
2013 aha152x_done( (current_SC->SCp.Status & 0xff)
2014 | ( (current_SC->SCp.Message & 0xff) << 8)
2015 | ( DID_OK << 16) );
2016
2017 #if defined(DEBUG_RACE)
2018 printk("done returned (DID_OK: Status=%x; Message=%x).\n",
2019 current_SC->SCp.Status, current_SC->SCp.Message);
2020 #endif
2021 return;
2022 }
2023
2024 if(current_SC)
2025 current_SC->SCp.phase |= 1<<16 ;
2026
2027 SETPORT( SIMODE0, 0 );
2028 SETPORT( SIMODE1, ENPHASEMIS );
2029 #if defined(DEBUG_INTR)
2030 disp_enintr();
2031 #endif
2032 #if defined(DEBUG_RACE)
2033 leave_driver("(PHASEEND) intr");
2034 #endif
2035
2036 SETBITS( DMACNTRL0, INTEN);
2037 return;
2038 }
2039
2040
2041
2042
2043 static void aha152x_panic(char *msg)
2044 {
2045 printk("\naha152x_panic: %s\n", msg);
2046 show_queues();
2047 panic("aha152x panic");
2048 }
2049
2050
2051
2052
2053 static void disp_ports(void)
2054 {
2055 #if !defined(SKIP_PORTS)
2056 int s;
2057
2058 printk("\n%s: ", current_SC ? "on bus" : "waiting");
2059
2060 s=GETPORT(SCSISEQ);
2061 printk("SCSISEQ ( ");
2062 if( s & TEMODEO ) printk("TARGET MODE ");
2063 if( s & ENSELO ) printk("SELO ");
2064 if( s & ENSELI ) printk("SELI ");
2065 if( s & ENRESELI ) printk("RESELI ");
2066 if( s & ENAUTOATNO ) printk("AUTOATNO ");
2067 if( s & ENAUTOATNI ) printk("AUTOATNI ");
2068 if( s & ENAUTOATNP ) printk("AUTOATNP ");
2069 if( s & SCSIRSTO ) printk("SCSIRSTO ");
2070 printk(");");
2071
2072 printk(" SCSISIG ( ");
2073 s=GETPORT(SCSISIG);
2074 switch(s & P_MASK)
2075 {
2076 case P_DATAO:
2077 printk("DATA OUT");
2078 break;
2079 case P_DATAI:
2080 printk("DATA IN");
2081 break;
2082 case P_CMD:
2083 printk("COMMAND");
2084 break;
2085 case P_STATUS:
2086 printk("STATUS");
2087 break;
2088 case P_MSGO:
2089 printk("MESSAGE OUT");
2090 break;
2091 case P_MSGI:
2092 printk("MESSAGE IN");
2093 break;
2094 default:
2095 printk("*illegal*");
2096 break;
2097 }
2098
2099 printk(" ); ");
2100
2101 printk("INTSTAT ( %s ); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2102
2103 printk("SSTAT ( ");
2104 s=GETPORT(SSTAT0);
2105 if( s & TARGET ) printk("TARGET ");
2106 if( s & SELDO ) printk("SELDO ");
2107 if( s & SELDI ) printk("SELDI ");
2108 if( s & SELINGO ) printk("SELINGO ");
2109 if( s & SWRAP ) printk("SWRAP ");
2110 if( s & SDONE ) printk("SDONE ");
2111 if( s & SPIORDY ) printk("SPIORDY ");
2112 if( s & DMADONE ) printk("DMADONE ");
2113
2114 s=GETPORT(SSTAT1);
2115 if( s & SELTO ) printk("SELTO ");
2116 if( s & ATNTARG ) printk("ATNTARG ");
2117 if( s & SCSIRSTI ) printk("SCSIRSTI ");
2118 if( s & PHASEMIS ) printk("PHASEMIS ");
2119 if( s & BUSFREE ) printk("BUSFREE ");
2120 if( s & SCSIPERR ) printk("SCSIPERR ");
2121 if( s & PHASECHG ) printk("PHASECHG ");
2122 if( s & REQINIT ) printk("REQINIT ");
2123 printk("); ");
2124
2125
2126 printk("SSTAT ( ");
2127
2128 s=GETPORT(SSTAT0) & GETPORT(SIMODE0);
2129
2130 if( s & TARGET ) printk("TARGET ");
2131 if( s & SELDO ) printk("SELDO ");
2132 if( s & SELDI ) printk("SELDI ");
2133 if( s & SELINGO ) printk("SELINGO ");
2134 if( s & SWRAP ) printk("SWRAP ");
2135 if( s & SDONE ) printk("SDONE ");
2136 if( s & SPIORDY ) printk("SPIORDY ");
2137 if( s & DMADONE ) printk("DMADONE ");
2138
2139 s=GETPORT(SSTAT1) & GETPORT(SIMODE1);
2140
2141 if( s & SELTO ) printk("SELTO ");
2142 if( s & ATNTARG ) printk("ATNTARG ");
2143 if( s & SCSIRSTI ) printk("SCSIRSTI ");
2144 if( s & PHASEMIS ) printk("PHASEMIS ");
2145 if( s & BUSFREE ) printk("BUSFREE ");
2146 if( s & SCSIPERR ) printk("SCSIPERR ");
2147 if( s & PHASECHG ) printk("PHASECHG ");
2148 if( s & REQINIT ) printk("REQINIT ");
2149 printk("); ");
2150
2151 printk("SXFRCTL0 ( ");
2152
2153 s=GETPORT(SXFRCTL0);
2154 if( s & SCSIEN ) printk("SCSIEN ");
2155 if( s & DMAEN ) printk("DMAEN ");
2156 if( s & CH1 ) printk("CH1 ");
2157 if( s & CLRSTCNT ) printk("CLRSTCNT ");
2158 if( s & SPIOEN ) printk("SPIOEN ");
2159 if( s & CLRCH1 ) printk("CLRCH1 ");
2160 printk("); ");
2161
2162 printk("SIGNAL ( ");
2163
2164 s=GETPORT(SCSISIG);
2165 if( s & ATNI ) printk("ATNI ");
2166 if( s & SELI ) printk("SELI ");
2167 if( s & BSYI ) printk("BSYI ");
2168 if( s & REQI ) printk("REQI ");
2169 if( s & ACKI ) printk("ACKI ");
2170 printk("); ");
2171
2172 printk("SELID ( %02x ), ", GETPORT(SELID) );
2173
2174 printk("SSTAT2 ( ");
2175
2176 s=GETPORT(SSTAT2);
2177 if( s & SOFFSET) printk("SOFFSET ");
2178 if( s & SEMPTY) printk("SEMPTY ");
2179 if( s & SFULL) printk("SFULL ");
2180 printk("); SFCNT ( %d ); ", s & (SFULL|SFCNT) );
2181
2182 #if 0
2183 printk("SSTAT4 ( ");
2184 s=GETPORT(SSTAT4);
2185 if( s & SYNCERR) printk("SYNCERR ");
2186 if( s & FWERR) printk("FWERR ");
2187 if( s & FRERR) printk("FRERR ");
2188 printk("); ");
2189 #endif
2190
2191 printk("FCNT ( %d ); ", GETPORT(FIFOSTAT) );
2192
2193 printk("DMACNTRL0 ( ");
2194 s=GETPORT(DMACNTRL0);
2195 printk( "%s ", s & _8BIT ? "8BIT" : "16BIT" );
2196 printk( "%s ", s & DMA ? "DMA" : "PIO" );
2197 printk( "%s ", s & WRITE_READ ? "WRITE" : "READ" );
2198 if( s & ENDMA ) printk("ENDMA ");
2199 if( s & INTEN ) printk("INTEN ");
2200 if( s & RSTFIFO ) printk("RSTFIFO ");
2201 if( s & SWINT ) printk("SWINT ");
2202 printk("); ");
2203
2204
2205 #if 0
2206 printk("DMACNTRL1 ( ");
2207
2208 s=GETPORT(DMACNTRL1);
2209 if( s & PWRDWN ) printk("PWRDN ");
2210 printk("); ");
2211
2212
2213 printk("STK ( %d ); ", s & 0xf);
2214
2215 printk("DMASTAT (");
2216 s=GETPORT(DMASTAT);
2217 if( s & ATDONE ) printk("ATDONE ");
2218 if( s & WORDRDY ) printk("WORDRDY ");
2219 if( s & DFIFOFULL ) printk("DFIFOFULL ");
2220 if( s & DFIFOEMP ) printk("DFIFOEMP ");
2221 printk(")");
2222
2223 #endif
2224
2225 printk("\n");
2226 #endif
2227 }
2228
2229
2230
2231
2232 static void disp_enintr(void)
2233 {
2234 int s;
2235
2236 printk("enabled interrupts ( ");
2237
2238 s=GETPORT(SIMODE0);
2239 if( s & ENSELDO ) printk("ENSELDO ");
2240 if( s & ENSELDI ) printk("ENSELDI ");
2241 if( s & ENSELINGO ) printk("ENSELINGO ");
2242 if( s & ENSWRAP ) printk("ENSWRAP ");
2243 if( s & ENSDONE ) printk("ENSDONE ");
2244 if( s & ENSPIORDY ) printk("ENSPIORDY ");
2245 if( s & ENDMADONE ) printk("ENDMADONE ");
2246
2247 s=GETPORT(SIMODE1);
2248 if( s & ENSELTIMO ) printk("ENSELTIMO ");
2249 if( s & ENATNTARG ) printk("ENATNTARG ");
2250 if( s & ENPHASEMIS ) printk("ENPHASEMIS ");
2251 if( s & ENBUSFREE ) printk("ENBUSFREE ");
2252 if( s & ENSCSIPERR ) printk("ENSCSIPERR ");
2253 if( s & ENPHASECHG ) printk("ENPHASECHG ");
2254 if( s & ENREQINIT ) printk("ENREQINIT ");
2255 printk(")\n");
2256 }
2257
2258 #if defined(DEBUG_RACE)
2259
2260 static const char *should_leave;
2261 static int in_driver=0;
2262
2263
2264
2265
2266 static void enter_driver(const char *func)
2267 {
2268 cli();
2269 printk("aha152x: entering %s() (%x)\n", func, jiffies);
2270 if(in_driver)
2271 {
2272 printk("%s should leave first.\n", should_leave);
2273 panic("aha152x: already in driver\n");
2274 }
2275
2276 in_driver++;
2277 should_leave=func;
2278 sti();
2279 }
2280
2281 static void leave_driver(const char *func)
2282 {
2283 cli();
2284 printk("\naha152x: leaving %s() (%x)\n", func, jiffies);
2285 if(!in_driver)
2286 {
2287 printk("aha152x: %s already left.\n", should_leave);
2288 panic("aha152x: %s already left driver.\n");
2289 }
2290
2291 in_driver--;
2292 should_leave=func;
2293 sti();
2294 }
2295 #endif
2296
2297
2298
2299
2300 static void show_command(Scsi_Cmnd *ptr)
2301 {
2302 int i;
2303
2304 printk("0x%08x: target=%d; lun=%d; cmnd=( ",
2305 (unsigned long) ptr, ptr->target, ptr->lun);
2306
2307 for(i=0; i<COMMAND_SIZE(ptr->cmnd[0]); i++)
2308 printk("%02x ", ptr->cmnd[i]);
2309
2310 printk("); residual=%d; buffers=%d; phase |",
2311 ptr->SCp.this_residual, ptr->SCp.buffers_residual);
2312
2313 if( ptr->SCp.phase & not_issued ) printk("not issued|");
2314 if( ptr->SCp.phase & in_selection ) printk("in selection|");
2315 if( ptr->SCp.phase & disconnected ) printk("disconnected|");
2316 if( ptr->SCp.phase & aborted ) printk("aborted|");
2317 if( ptr->SCp.phase & sent_ident ) printk("send_ident|");
2318 if( ptr->SCp.phase & in_other )
2319 {
2320 printk("; in other(");
2321 switch( (ptr->SCp.phase >> 16) & P_MASK )
2322 {
2323 case P_DATAO:
2324 printk("DATA OUT");
2325 break;
2326 case P_DATAI:
2327 printk("DATA IN");
2328 break;
2329 case P_CMD:
2330 printk("COMMAND");
2331 break;
2332 case P_STATUS:
2333 printk("STATUS");
2334 break;
2335 case P_MSGO:
2336 printk("MESSAGE OUT");
2337 break;
2338 case P_MSGI:
2339 printk("MESSAGE IN");
2340 break;
2341 default:
2342 printk("*illegal*");
2343 break;
2344 }
2345 printk(")");
2346 if(ptr->SCp.phase & (1<<16))
2347 printk("; phaseend");
2348 }
2349 printk("; next=0x%08x\n", (unsigned long) ptr->host_scribble);
2350 }
2351
2352
2353
2354
2355 static void show_queues(void)
2356 {
2357 Scsi_Cmnd *ptr;
2358
2359 cli();
2360 printk("QUEUE STATUS:\nissue_SC:\n");
2361 for(ptr=issue_SC; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble )
2362 show_command(ptr);
2363
2364 printk("current_SC:\n");
2365 if(current_SC)
2366 show_command(current_SC);
2367 else
2368 printk("none\n");
2369
2370 printk("disconnected_SC:\n");
2371 for(ptr=disconnected_SC; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble )
2372 show_command(ptr);
2373
2374 disp_ports();
2375 disp_enintr();
2376 sti();
2377 }