usb/110989: [patch] Handling of quirk IGNORE_RESIDUE is umass.c is broken

Michael Gmelin freebsdusb at bindone.de
Thu Mar 29 00:30:10 UTC 2007


>Number:         110989
>Category:       usb
>Synopsis:       [patch] Handling of quirk IGNORE_RESIDUE is umass.c is broken
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-usb
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 29 00:30:09 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Michael Gmelin
>Release:        FreeBSD 6.2-RELEASE-p3 i386
>Organization:
/bin/done digital solutions GmbH
>Environment:
FreeBSD bombat.bindone.de 6.2-RELEASE-p3 FreeBSD 6.2-RELEASE-p3 #21: Wed Mar 28 04:08:44 CEST 2007     root at bombat.bindone.de:/usr/src/sys/i386/compile/bombat  i386
>Description:
I had to add a new device to usbdevs/umass.c which requires the IGNORE_RESIDUE quirk to be set (extra PR will follow). It didn't work, because IGNORE_RESIDUE isn't handled properly in umass.c (it isn't really handled at all, since Residue is set in lines are 1668-1672 in
umass.c in the following was:

int Residue;
Residue = UGETDW(sc->csw.dCSWDataResidue);
if (Residue == 0 &&
	sc->transfer_datalen - sc->transfer_actlen != 0)
		Residue = sc->transfer_datalen - sc->transfer_actlen;

The patch below fixes this issue (tested and proven to work).
>How-To-Repeat:
Use a really broken USB device which returns "random" values for sc->csw.dCSWDataResidue (like devices that use the SuperTop IDEDEVICE USB controller, e.g. the ICY BOX IB-220U-Wh). Every attempt to use the device will lead to error messages, like:

dd if=/dev/zero of=/dev/da0 count=10
da0: end of device

or

disklabel da0
read: Unknown error
etc.

>Fix:
Apply the attached patch, which forces  residue to be calculated if IGNORE_RESIDUE is set.



Patch attached with submission follows:

--- umass.c.orig	Thu Mar 29 02:07:04 2007
+++ umass.c	Thu Mar 29 02:08:06 2007
@@ -1666,7 +1666,10 @@
 		}
 
 		int Residue;
-		Residue = UGETDW(sc->csw.dCSWDataResidue);
+		if (sc->quirks & IGNORE_RESIDUE)
+			Residue = 0;
+		else
+			Residue = UGETDW(sc->csw.dCSWDataResidue);
 		if (Residue == 0 &&
 		    sc->transfer_datalen - sc->transfer_actlen != 0)
 			Residue = sc->transfer_datalen - sc->transfer_actlen;

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-usb mailing list