From owner-freebsd-current@FreeBSD.ORG Thu Mar 24 23:46:45 2005 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2B20A16A4CF for ; Thu, 24 Mar 2005 23:46:45 +0000 (GMT) Received: from ss.eunet.cz (ss.eunet.cz [193.85.228.13]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3F67E43D2F for ; Thu, 24 Mar 2005 23:46:42 +0000 (GMT) (envelope-from mime@traveller.cz) Received: from localhost.i.cz (ss.eunet.cz [193.85.228.13]) by ss.eunet.cz (8.13.1/8.13.1) with ESMTP id j2ONkdev018004 for ; Fri, 25 Mar 2005 00:46:40 +0100 (CET) (envelope-from mime@traveller.cz) From: Michal Mertl To: current@freebsd.org Content-Type: multipart/mixed; boundary="=-RH/Gcw+2JLJqZi/bhsS5" Date: Fri, 25 Mar 2005 00:46:39 +0100 Message-Id: <1111707999.640.26.camel@genius2.i.cz> Mime-Version: 1.0 X-Mailer: Evolution 2.0.4 FreeBSD GNOME Team Port Subject: problem with usb memory stick (with patch) X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Mar 2005 23:46:45 -0000 --=-RH/Gcw+2JLJqZi/bhsS5 Content-Type: text/plain Content-Transfer-Encoding: 7bit Hello all, I've got a USB 2.0 memory stick which doesn't attach correctly. On failed attach I get the following in the messages: -------- Mar 24 23:44:13 genius2 kernel: umass0: M-SysT5 Dell Memory Key, rev 2.00/2.00, addr 2 Mar 24 23:44:13 genius2 kernel: umass0: SCSI over Bulk-Only; quirks = 0x0 Mar 24 23:44:13 genius2 kernel: umass0:0:0:-1: Attached to scbus0 Mar 24 23:44:14 genius2 kernel: pass0 at umass-sim0 bus 0 target 0 lun 0 Mar 24 23:44:14 genius2 kernel: pass0: Removable Direct Access SCSI-0 device Mar 24 23:44:14 genius2 kernel: pass0: Serial Number u Mar 24 23:44:14 genius2 kernel: pass0: 40.000MB/s transfers Mar 24 23:44:14 genius2 kernel: GEOM: new disk da0 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): Retrying Command Mar 24 23:44:14 genius2 last message repeated 3 times Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): error 6 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): Unretryable Error Mar 24 23:44:14 genius2 kernel: da0 at umass-sim0 bus 0 target 0 lun 0 Mar 24 23:44:14 genius2 kernel: da0: Removable Direct Access SCSI-0 device Mar 24 23:44:14 genius2 kernel: da0: Serial Number u Mar 24 23:44:14 genius2 kernel: da0: 40.000MB/s transfers Mar 24 23:44:14 genius2 kernel: da0: Attempt to query device size failed: UNIT ATTENTION, Medium not present Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): READ CAPACITY. CDB: 25 0 0 0 0 0 0 0 0 0 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): CAM Status: SCSI Status Error Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): SCSI Status: Check Condition Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): UNIT ATTENTION asc:3a,0 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): Medium not present Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): (da0:umass-sim0:0:0:0): READ CAPACITY. CDB: 25 0 0 0 0 0 0 0 0 0 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): UNIT ATTENTION asc:3a,0 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): Medium not present . . . Mar 24 23:44:14 genius2 kernel: Retries Exhausted Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): error 6 Mar 24 23:44:14 genius2 kernel: (da0:umass-sim0:0:0:0): Unretryable Error Mar 24 23:44:14 genius2 kernel: Opened disk da0 -> 6 --------- Quite a long time ago I found out that the stick works when I delay the attachment a bit - increasing USB_PORT_POWERUP_DELAY (in src/sys/dev/usb/usb.h) from 300 to 1000 helps. I found another, probably a bit more elegant, solution - I invented a new quirk and put it into use in umass.c which delays the scsi attachment in umass_cam_attach. There's a comment just above the callout (which firing after longer delay is the main part of the "fix") which reads: /* Notify CAM of the new device after a short delay. Any * failure is benign, as the user can still do it byhand * (camcontrol rescan ). Only do this if we are not * booting, because CAM does a scan after booting has * completed, when interrupts have been enabled. */ The comment isn't probably correct - no 'eject', 'stop', 'rescan' or 'reset' will ever fix the stick for me. I don't know if the problem is specific to my USB device. If it is than the quirk might be appropriate solution but if other devices need the pause too (and maybe even much longer) than fixing the code some other way (to make the comment true?) might be better. Michal Mertl --=-RH/Gcw+2JLJqZi/bhsS5 Content-Disposition: attachment; filename=usb-umass.patch Content-Type: text/x-patch; name=usb-umass.patch; charset=ISO-8859-2 Content-Transfer-Encoding: 7bit Index: umass.c =================================================================== RCS file: /home/fcvs/cvs/src/sys/dev/usb/umass.c,v retrieving revision 1.119 diff -u -3 -r1.119 umass.c --- umass.c 14 Feb 2005 02:17:53 -0000 1.119 +++ umass.c 24 Mar 2005 23:17:55 -0000 @@ -314,6 +314,8 @@ # define NO_INQUIRY 0x0400 /* Device cannot handle INQUIRY EVPD, return CHECK CONDITION */ # define NO_INQUIRY_EVPD 0x0800 + /* Device needs time to settle down /2s/ XXX */ +# define UMASS_ADD_DELAY 0x1000 }; Static struct umass_devdescr_t umass_devdescrs[] = { @@ -387,6 +389,10 @@ UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, NO_QUIRKS }, + { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DELLMEMKEY, RID_WILDCARD, + UMASS_PROTO_SCSI | UMASS_PROTO_BBB, + UMASS_ADD_DELAY + }, { USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3260, RID_WILDCARD, UMASS_PROTO_SCSI | UMASS_PROTO_BBB, FORCE_SHORT_INQUIRY @@ -891,6 +897,7 @@ (void) umass_match_proto(sc, sc->iface, uaa->device); id = usbd_get_interface_descriptor(sc->iface); + #ifdef USB_DEBUG printf("%s: ", USBDEVNAME(sc->sc_dev)); switch (sc->proto&UMASS_PROTO_COMMAND) { @@ -2262,6 +2269,7 @@ Static int umass_cam_attach(struct umass_softc *sc) { + int delay_len; #ifndef USB_DEBUG if (bootverbose) #endif @@ -2278,7 +2286,11 @@ * completed, when interrupts have been enabled. */ - usb_callout(sc->cam_scsi_rescan_ch, MS_TO_TICKS(200), + if (sc->quirks && UMASS_ADD_DELAY) + delay_len = 2000; + else + delay_len = 200; + usb_callout(sc->cam_scsi_rescan_ch, MS_TO_TICKS(delay_len), umass_cam_rescan, sc); } Index: usbdevs =================================================================== RCS file: /home/fcvs/cvs/src/sys/dev/usb/usbdevs,v retrieving revision 1.226 diff -u -3 -r1.226 usbdevs --- usbdevs 21 Mar 2005 08:43:54 -0000 1.226 +++ usbdevs 24 Mar 2005 22:39:48 -0000 @@ -1188,6 +1188,7 @@ /* M-Systems products */ product MSYSTEMS DISKONKEY 0x0010 DiskOnKey product MSYSTEMS DISKONKEY2 0x0011 DiskOnKey +product MSYSTEMS DELLMEMKEY 0x0015 Dell Memory Key /* National Semiconductor */ product NATIONAL BEARPAW1200 0x1000 BearPaw 1200 --=-RH/Gcw+2JLJqZi/bhsS5--