Date: Wed, 27 Jun 2012 17:36:46 +0200 From: Hans Petter Selasky <hselasky@c2i.net> To: Alexander Motin <mav@freebsd.org> Cc: freebsd-usb@freebsd.org Subject: Re: [usb] Kingston 8Gb is not usable Message-ID: <201206271736.46305.hselasky@c2i.net> In-Reply-To: <4FEB27D9.9030408@FreeBSD.org> References: <4FE9AB28.3070704@passap.ru> <201206271731.08298.hselasky@c2i.net> <4FEB27D9.9030408@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday 27 June 2012 17:33:45 Alexander Motin wrote: > On 06/27/12 18:31, Hans Petter Selasky wrote: > > On Wednesday 27 June 2012 17:28:30 Alexander Motin wrote: > >> On 06/27/12 18:17, Hans Petter Selasky wrote: > >>> On Wednesday 27 June 2012 17:08:29 Alexander Motin wrote: > >>>> umass problem > >>> > >>> Hi, > >>> > >>> Are you verifying the received data length for the SCSI commands > >>> reading out various data? > >> > >> Mentioned revision beyond others adds check for the sense data length in > >> case of error. It won't even look into the sense data if reported amount > >> (sense_len - sense_resid) is zero or less then needed. I have no idea > >> how USB calculates resid, but it may be a problem in this case. I think > >> it could be useful to get USB packets trace to see whether it is device > >> doesn't return any sense data, or umass improperly interprets them in > >> this case for some reason. > > > > Hi, > > > > The residue is part of the 13 status bytes in the SCSI BOT protocol. If > > this field is zero, the umass driver will compute the residue from the > > actual data transferred as a workaround. > > Can't there be an opposite bug -- residue field is equal to the transfer > size in which case CAM will think there is no sense data? Hi, Then you need to check using "usbdump -i usbusX -s 65536 -vvvv" what is actually going on there. Usually the USB device does not zero-pad any SCSI data. Code looks like this: residue = UGETDW(sc->csw.dCSWDataResidue); if ((!residue) || (sc->sc_quirks & IGNORE_RESIDUE)) { residue = (sc->sc_transfer.data_len - sc->sc_transfer.actlen); } if (residue > sc->sc_transfer.data_len) { DPRINTF(sc, UDMASS_BBB, "truncating residue from %d " "to %d bytes\n", residue, sc- >sc_transfer.data_len); residue = sc->sc_transfer.data_len; } --HPS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206271736.46305.hselasky>