Date: Sat, 9 Sep 2006 20:10:24 GMT From: "James E. Flemer" <jflemer@uvm.edu> To: freebsd-usb@FreeBSD.org Subject: Re: usb/95173: [usb] cannot mount external usb harddisk VIA Technologies Inc. USB 2.0 IDE Bridge Message-ID: <200609092010.k89KAOpC034796@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR usb/95173; it has been noted by GNATS. From: "James E. Flemer" <jflemer@uvm.edu> To: diazepam@gmx.net Cc: bug-followup@FreeBSD.org Subject: Re: usb/95173: [usb] cannot mount external usb harddisk VIA Technologies Inc. USB 2.0 IDE Bridge Date: Sat, 09 Sep 2006 14:02:21 -0600 This is a multi-part message in MIME format. --------------090805000301020904040608 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I have a USB enclosure with the same chip set as the submitter, but a different drive inside: umass0: VIA Technologies Inc. USB 2.0 IDE Bridge, rev 2.00/0.03, addr 2 da0 at umass-sim0 bus 0 target 0 lun 0 da0: <HITACHI_ DK23DA-40 00J0> Fixed Direct Access SCSI-2 device da0: 40.000MB/s transfers da0: 38154MB (78140160 512 byte sectors: 255H 63S/T 4864C) The device hangs on the SCSI SYNCHRONIZE_CACHE command, though I'm not sure if it is the VIA bridge or the hard drive inside. The underlying SCSI da(4) driver has a DA_Q_NO_SYNC_CACHE quirk to handle devices without working SYNC_CACHE, but I don't know how to get to the da softc from the umass driver to set the quirk flag. A quirk could be added to the scsi_da.c quirks table for the drive, but that would be a poor solution if the problem is really in the bridge. There is a interesting and related patch proposed in this email: http://lists.freebsd.org/pipermail/freebsd-current/2005-January/045779.html With the patch in that email, plus the attached umass patch to add a NO_SYNCHRONIZE_CACHE quirk, my USB enclosure works. (Note, the attached patch includes some other unrelated umass patches, use at your own risk.) -James --------------090805000301020904040608 Content-Type: text/plain; name="umass_no_sync_cache.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="umass_no_sync_cache.diff" Index: sys/dev/usb/umass.c =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/umass.c,v retrieving revision 1.122.2.10 diff -b -u -r1.122.2.10 umass.c --- sys/dev/usb/umass.c 26 Jun 2006 00:31:25 -0000 1.122.2.10 +++ sys/dev/usb/umass.c 9 Sep 2006 19:57:06 -0000 @@ -113,8 +113,11 @@ #include <sys/bus.h> #include <sys/sysctl.h> +#include <machine/bus.h> + #include <dev/usb/usb.h> #include <dev/usb/usbdi.h> +#include <dev/usb/usbdivar.h> #include <dev/usb/usbdi_util.h> #include "usbdevs.h" @@ -317,6 +320,10 @@ # define NO_INQUIRY_EVPD 0x0800 /* Pad all RBC requests to 12 bytes. */ # define RBC_PAD_TO_12 0x1000 + /* The device returns wrong CSWTAG. */ +# define WRONG_CSWTAG 0x2000 + /* Device cannot handle SYNCHRONIZE_CACHE. */ +# define NO_SYNCHRONIZE_CACHE 0x4000 }; Static struct umass_devdescr_t umass_devdescrs[] = { @@ -426,6 +433,10 @@ UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, NO_INQUIRY | NO_GETMAXLUN }, + { USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXL840AN, RID_WILDCARD, + UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, + NO_GETMAXLUN + }, { USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB20AN, RID_WILDCARD, UMASS_PROTO_SCSI | UMASS_PROTO_BBB, NO_QUIRKS @@ -502,6 +513,10 @@ UMASS_PROTO_SCSI | UMASS_PROTO_BBB, NO_QUIRKS }, + { USB_VENDOR_VIA, USB_PRODUCT_VIA_IDE_BRIDGE, RID_WILDCARD, + UMASS_PROTO_SCSI | UMASS_PROTO_BBB, + NO_SYNCHRONIZE_CACHE + }, { USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_EXTHDD, RID_WILDCARD, UMASS_PROTO_SCSI | UMASS_PROTO_BBB, FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE @@ -635,6 +650,7 @@ int timeout; /* in msecs */ int maxlun; /* maximum LUN number */ + int port; /* port on the parent hub */ }; #ifdef USB_DEBUG @@ -928,6 +944,7 @@ sc->iface = uaa->iface; sc->ifaceno = uaa->ifaceno; + sc->port = uaa->port; usb_callout_init(sc->cam_scsi_rescan_ch); /* initialise the proto and drive values in the umass_softc (again) */ @@ -1661,6 +1678,10 @@ USETDW(sc->csw.dCSWSignature, CSWSIGNATURE); } + /* Translate invalid command-status tags. */ + if (sc->quirks & WRONG_CSWTAG) + USETDW(sc->csw.dCSWTag, UGETDW(sc->cbw.dCBWTag)); + int Residue; Residue = UGETDW(sc->csw.dCSWDataResidue); if (Residue == 0 && @@ -1779,6 +1800,7 @@ usbd_device_handle udev; usb_device_request_t req; usbd_status err; + usb_port_status_t ps; usb_interface_descriptor_t *id; int maxlun = 0; u_int8_t buf = 0; @@ -1806,7 +1828,8 @@ /* Device doesn't support Get Max Lun request. */ printf("%s: Get Max Lun not supported (%s)\n", USBDEVNAME(sc->sc_dev), usbd_errstr(err)); - /* XXX Should we port_reset the device? */ + /* Reset the port on the hub for the device. */ + usbd_reset_port(sc->sc_udev, sc->port, &ps); break; } @@ -1886,6 +1909,8 @@ umass_cbi_adsc(sc, sc->cbl, SEND_DIAGNOSTIC_CMDLEN, sc->transfer_xfer[XFER_CBI_RESET1]); /* XXX if the command fails we should reset the port on the hub */ + /* Reset the port on the hub for the device. */ + /* usbd_reset_port(sc->sc_udev, sc->port, &ps); */ } Static void @@ -2896,6 +2921,15 @@ umass_scsi_transform(struct umass_softc *sc, unsigned char *cmd, int cmdlen, unsigned char **rcmd, int *rcmdlen) { + if (sc->quirks & NO_SYNCHRONIZE_CACHE + && cmd[0] == SYNCHRONIZE_CACHE) + { + printf("%s: Unsupported SCSI command 0x%02x", + USBDEVNAME(sc->sc_dev), cmd[0]); + printf("\n"); + return 0; /* failure */ + } + switch (cmd[0]) { case TEST_UNIT_READY: if (sc->quirks & NO_TEST_UNIT_READY) { Index: sys/dev/usb/usbdevs =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/usbdevs,v retrieving revision 1.232.2.16 diff -b -u -r1.232.2.16 usbdevs --- sys/dev/usb/usbdevs 20 Aug 2006 05:20:07 -0000 1.232.2.16 +++ sys/dev/usb/usbdevs 9 Sep 2006 19:57:08 -0000 @@ -1343,6 +1343,7 @@ product PALM ZIRE 0x0070 Palm Zire /* Panasonic products */ +product PANASONIC KXL840AN 0x0d01 CD-R Drive KXL-840AN product PANASONIC KXLRW32AN 0x0d09 CD-R Drive KXL-RW32AN product PANASONIC KXLCB20AN 0x0d0a CD-R Drive KXL-CB20AN product PANASONIC KXLCB35AN 0x0d0e DVD-ROM & CD-R/RW @@ -1633,6 +1634,9 @@ /* Universal Access products */ product UNIACCESS PANACHE 0x0101 Panache Surf USB ISDN Adapter +/* VIA products */ +product VIA IDE_BRIDGE 0x6204 USB 2.0 IDE Bridge + /* VidzMedia products */ product VIDZMEDIA MONSTERTV 0x4fb1 MonsterTV P2H --------------090805000301020904040608--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200609092010.k89KAOpC034796>