>I get now thousands of (looping) Queue Full lines, when trying to make
>a backup using dump(8).
Well, I can't fix it completely unless I change some unsigned variables
to signed in the scsi code, but I don't want to do that unless its
absolutely necessary as it may break more code then it fixes. This
should drop you down to at most 1 more tag than your drive can handle,
which should make the problem less of a problem. It also won't fill your
log file up. Let me know how this works out for you...
>--
>andreas@klemm.gtn.com /\/\___ Wiechers & Partner Datentechnik Gmb
>H
> Andreas Klemm ___/\/\/ Support Unix -- andreas.klemm@wup.d
>e
>pgp p-key http://www-swiss.ai.mit.edu/~bal/pks-toplev.html >>> powered by <<
><
>ftp://sunsite.unc.edu/pub/Linux/system/Printing/aps-491.tgz >>> FreeBSD <<
><
>
--
Justin T. Gibbs
===========================================
FreeBSD: Turning PCs into workstations
===========================================
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/12 04:19:04
***************
*** 1206,1226 ****
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);
--- 1206,1242 ----
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);