From owner-freebsd-usb@FreeBSD.ORG Thu Mar 29 00:20:03 2007 Return-Path: X-Original-To: freebsd-usb@hub.freebsd.org Delivered-To: freebsd-usb@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 515AC16A409 for ; Thu, 29 Mar 2007 00:20:03 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [69.147.83.40]) by mx1.freebsd.org (Postfix) with ESMTP id 3284013C44B for ; Thu, 29 Mar 2007 00:20:03 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id l2T0K3Nj010141 for ; Thu, 29 Mar 2007 00:20:03 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id l2T0K2pa010139; Thu, 29 Mar 2007 00:20:02 GMT (envelope-from gnats) Resent-Date: Thu, 29 Mar 2007 00:20:02 GMT Resent-Message-Id: <200703290020.l2T0K2pa010139@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-usb@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Michael Gmelin Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id DF1B716A401 for ; Thu, 29 Mar 2007 00:16:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [69.147.83.33]) by mx1.freebsd.org (Postfix) with ESMTP id D0EBE13C459 for ; Thu, 29 Mar 2007 00:16:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.13.1/8.13.1) with ESMTP id l2T0GBUA037127 for ; Thu, 29 Mar 2007 00:16:11 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.13.1/8.13.1/Submit) id l2T0BAKa035949; Thu, 29 Mar 2007 00:11:10 GMT (envelope-from nobody) Message-Id: <200703290011.l2T0BAKa035949@www.freebsd.org> Date: Thu, 29 Mar 2007 00:11:10 GMT From: Michael Gmelin To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.0 Cc: Subject: usb/110988: [patch] Handling of quirk IGNORE_RESIDUE is umass.c is broken X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Mar 2007 00:20:03 -0000 >Number: 110988 >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:20:02 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@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: