Date: Thu, 14 Nov 1996 00:01:39 -0800 From: "Justin T. Gibbs" <gibbs@freefall.freebsd.org> To: Keith Mitchell <kmitch@unix.guru.org> Cc: ache, scsi Subject: Re: SCB paging is most dangerous option now! Message-ID: <199611140801.AAA21994@freefall.freebsd.org> In-Reply-To: Your message of "Wed, 13 Nov 1996 18:48:10 EST." <199611132348.SAA00360@unix.guru.org>
next in thread | previous in thread | raw e-mail | index | archive | help
>> Can you see if this patch to current affects that behavior at all? > >No change. > How about this one. You will have to back out the other diff I sent. -- Justin T. Gibbs =========================================== FreeBSD: Turning PCs into workstations =========================================== Index: dev/aic7xxx/aic7xxx.seq =================================================================== RCS file: /usr/cvs/src/sys/dev/aic7xxx/aic7xxx.seq,v retrieving revision 1.48 diff -c -r1.48 aic7xxx.seq *** aic7xxx.seq 1996/11/11 05:16:36 1.48 --- aic7xxx.seq 1996/11/14 07:25:49 *************** *** 540,546 **** mvi CLRSINT1,CLRATNO /* drop ATN */ p_mesgout_outb: dec DINDEX ! or CLRSINT1, CLRREQINIT mov SCSIDATL,SINDIR p_mesgout4: --- 540,546 ---- mvi CLRSINT1,CLRATNO /* drop ATN */ p_mesgout_outb: dec DINDEX ! mvi CLRSINT1, CLRREQINIT mov SCSIDATL,SINDIR p_mesgout4: *************** *** 839,850 **** /* * Bus free phase. It might be useful to interrupt the device ! * driver if we aren't expecting this. For now, make sure that ! * ATN isn't being asserted and look for a new command. */ p_busfree: ! mvi CLRSINT1,CLRATNO ! clr LASTPHASE /* * if this is an immediate command, perform a psuedo command complete to --- 839,848 ---- /* * Bus free phase. It might be useful to interrupt the device ! * driver if we aren't expecting this. */ p_busfree: ! mvi LASTPHASE, P_BUSFREE /* * if this is an immediate command, perform a psuedo command complete to *************** *** 901,916 **** */ inb_next: ! or CLRSINT1, CLRREQINIT mov NONE,SCSIDATL /*dummy read from latch to ACK*/ inb_next_wait: - test SSTAT1,REQINIT jz inb_next_wait /* wait for next byte */ - inb_first: test SSTAT1,PHASEMIS jnz mesgin_phasemis mov DINDEX,SINDEX mov DINDIR,SCSIBUSL ret /*read byte directly from bus*/ inb_last: - or CLRSINT1, CLRREQINIT mov NONE,SCSIDATL ret /*dummy read from latch to ACK*/ mesgin_phasemis: --- 899,913 ---- */ inb_next: ! mvi CLRSINT0, CLRSPIORDY mov NONE,SCSIDATL /*dummy read from latch to ACK*/ inb_next_wait: test SSTAT1,PHASEMIS jnz mesgin_phasemis + test SSTAT0, SPIORDY jz inb_next_wait + inb_first: mov DINDEX,SINDEX mov DINDIR,SCSIBUSL ret /*read byte directly from bus*/ inb_last: mov NONE,SCSIDATL ret /*dummy read from latch to ACK*/ mesgin_phasemis: Index: dev/aic7xxx/aic7xxx_reg.h =================================================================== RCS file: /usr/cvs/src/sys/dev/aic7xxx/aic7xxx_reg.h,v retrieving revision 1.16 diff -c -r1.16 aic7xxx_reg.h *** aic7xxx_reg.h 1996/11/11 05:16:41 1.16 --- aic7xxx_reg.h 1996/11/13 07:03:04 *************** *** 439,444 **** --- 439,446 ---- * beyond the bounds of its * command. */ + #define SCB_TRACE_POINT 0xf1 + #define BRKADRINT 0x08 #define SCSIINT 0x04 #define CMDCMPLT 0x02 *************** *** 530,535 **** --- 532,538 ---- #define MK_MESSAGE 0x80 #define DISCENB 0x40 #define TAG_ENB 0x20 + #define TRACE_SCB 0x10 #define ABORT_SCB 0x08 #define DISCONNECTED 0x04 #define SCB_TAG_TYPE 0x03 *************** *** 681,686 **** --- 684,691 ---- #define MSG5 0x03a #define LASTPHASE 0x03b + #define P_BUSFREE 0x01 + #define ARG_1 0x03c #define RETURN_1 0x03c #define SEND_MSG 0x80 Index: i386/scsi/aic7xxx.c =================================================================== RCS file: /usr/cvs/src/sys/i386/scsi/aic7xxx.c,v retrieving revision 1.85 diff -c -r1.85 aic7xxx.c *** aic7xxx.c 1996/11/11 05:24:44 1.85 --- aic7xxx.c 1996/11/13 05:38:59 *************** *** 1206,1227 **** if (xs->error == XS_NOERROR) xs->error = XS_DRIVER_STUFFUP; break; case SCSI_BUSY: xs->error = XS_BUSY; sc_print_addr(xs->sc_link); printf("Target Busy\n"); break; - case SCSI_QUEUE_FULL: - /* - * The upper level SCSI code will someday - * handle this properly. - */ - printf("Queue Full\n"); - /* - * XXX requeue this unconditionally. - */ - STAILQ_INSERT_HEAD(&ahc->waiting_scbs, scb, links); - break; default: sc_print_addr(xs->sc_link); printf("unexpected targ_status: %x\n", hscb->status); --- 1206,1243 ---- if (xs->error == XS_NOERROR) xs->error = XS_DRIVER_STUFFUP; break; + case SCSI_QUEUE_FULL: + if (scb->hscb->control & TAG_ENB) { + /* + * The upper level SCSI code in 3.0 + * handles this properly... + */ + struct scsi_link *sc_link; + + sc_link = xs->sc_link; + if (sc_link->active > 2 + && sc_link->opennings != 0) { + /* truncate the opennings */ + sc_link->opennings = 0; + sc_print_addr(sc_link); + printf("Tagged openings reduced to " + "%d\n", sc_link->active); + } + /* + * XXX requeue this unconditionally. + */ + STAILQ_INSERT_TAIL(&ahc->waiting_scbs, scb, + links); + break; + } + /* Else treat as if it is a BUSY condition */ + scb->hscb->status = SCSI_BUSY; + /* Fall Through... */ case SCSI_BUSY: xs->error = XS_BUSY; sc_print_addr(xs->sc_link); printf("Target Busy\n"); break; default: sc_print_addr(xs->sc_link); printf("unexpected targ_status: %x\n", hscb->status); *************** *** 1371,1376 **** --- 1387,1430 ---- case MSGIN_PHASEMIS: break; #endif + case SCB_TRACE_POINT: + { + /* + * Print out the bus phase + */ + char *phase; + u_int8_t scbindex = ahc_inb(ahc, SCB_TAG); + u_int8_t lastphase = ahc_inb(ahc, LASTPHASE); + + scb = ahc->scb_data->scbarray[scbindex]; + sc_print_addr(scb->xs->sc_link); + + switch (lastphase) { + case P_DATAOUT: + phase = "Data-Out"; + break; + case P_DATAIN: + phase = "Data-In"; + break; + case P_COMMAND: + phase = "Command"; + break; + case P_MESGOUT: + phase = "Message-Out"; + break; + case P_STATUS: + phase = "Status"; + break; + case P_MESGIN: + phase = "Message-In"; + break; + default: + phase = "busfree"; + break; + } + printf("- %s\n", phase); + break; + } default: printf("ahc_intr: seqint, " "intstat == 0x%x, scsisigi = 0x%x\n", *************** *** 2090,2095 **** --- 2144,2154 ---- if (ahc->tagenable & mask) hscb->control |= TAG_ENB; } + + /* Set the trace flag if this is the target we want to trace */ + if (ahc->unit == 2 && xs->sc_link->target == 3) + hscb->control |= TRACE_SCB; + hscb->tcl = ((xs->sc_link->target << 4) & 0xF0) | (IS_SCSIBUS_B(ahc,xs->sc_link)? SELBUSB : 0) | (xs->sc_link->lun & 0x07); *************** *** 2490,2496 **** */ bus_state = ahc_inb(ahc, LASTPHASE); ! switch(bus_state & PHASE_MASK) { case P_DATAOUT: printf("in dataout phase"); --- 2549,2555 ---- */ bus_state = ahc_inb(ahc, LASTPHASE); ! switch(bus_state) { case P_DATAOUT: printf("in dataout phase");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199611140801.AAA21994>