PERFORCE change 161533 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Mon May 4 08:13:21 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=161533
Change 161533 by hselasky at hselasky_laptop001 on 2009/05/04 08:12:22
USB storage: Add quirk from "Henri-Pierre Charles". Add new quirk flag to
UMASS, UMASS_PROTO_DEFAULT, which shall be used when the protocol indicated by
the USB descriptors is correct.
PR: usb/134193
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/storage/umass.c#13 edit
.. //depot/projects/usb/src/sys/dev/usb/usbdevs#54 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/storage/umass.c#13 (text+ko) ====
@@ -309,6 +309,7 @@
/* wire and command protocol */
uint16_t proto;
+#define UMASS_PROTO_DEFAULT 0x0000 /* use protocol indicated by USB descriptors */
#define UMASS_PROTO_BBB 0x0001 /* USB wire protocol */
#define UMASS_PROTO_CBI 0x0002
#define UMASS_PROTO_CBI_I 0x0004
@@ -372,7 +373,7 @@
static const struct umass_devdescr umass_devdescr[] = {
{USB_VENDOR_ASAHIOPTICAL, PID_WILDCARD, RID_WILDCARD,
- UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I,
+ UMASS_PROTO_DEFAULT,
RS_NO_CLEAR_UA
},
{USB_VENDOR_ADDON, USB_PRODUCT_ADDON_ATTACHE, RID_WILDCARD,
@@ -600,6 +601,10 @@
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
FORCE_SHORT_INQUIRY | NO_INQUIRY_EVPD | NO_GETMAXLUN
},
+ {USB_VENDOR_MPMAN, PID_WILDCARD, RID_WILDCARD,
+ UMASS_PROTO_DEFAULT,
+ NO_SYNCHRONIZE_CACHE
+ },
{USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY, RID_WILDCARD,
UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
IGNORE_RESIDUE | NO_GETMAXLUN | RS_NO_CLEAR_UA
@@ -609,11 +614,11 @@
NO_QUIRKS
},
{USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN, RID_WILDCARD,
- UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
+ UMASS_PROTO_DEFAULT,
IGNORE_RESIDUE | NO_SYNCHRONIZE_CACHE
},
{USB_VENDOR_MYSON, USB_PRODUCT_MYSON_STARREADER, RID_WILDCARD,
- UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
+ UMASS_PROTO_DEFAULT,
NO_SYNCHRONIZE_CACHE
},
{USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3260, RID_WILDCARD,
@@ -849,7 +854,7 @@
NO_QUIRKS
},
{USB_VENDOR_SUPERTOP, USB_PRODUCT_SUPERTOP_IDE, RID_WILDCARD,
- UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
+ UMASS_PROTO_DEFAULT,
IGNORE_RESIDUE | NO_SYNCHRONIZE_CACHE
},
{USB_VENDOR_TAUGA, USB_PRODUCT_TAUGA_CAMERAMATE, RID_WILDCARD,
@@ -1281,6 +1286,58 @@
* USB device probe/attach/detach
*/
+static uint16_t
+umass_get_proto(struct usb2_interface *iface)
+{
+ struct usb2_interface_descriptor *id;
+ uint16_t retval;
+
+ retval = 0;
+
+ /* Check for a standards compliant device */
+ id = usb2_get_interface_descriptor(iface);
+ if ((id == NULL) ||
+ (id->bInterfaceClass != UICLASS_MASS)) {
+ goto done;
+ }
+ switch (id->bInterfaceSubClass) {
+ case UISUBCLASS_SCSI:
+ retval |= UMASS_PROTO_SCSI;
+ break;
+ case UISUBCLASS_UFI:
+ retval |= UMASS_PROTO_UFI;
+ break;
+ case UISUBCLASS_RBC:
+ retval |= UMASS_PROTO_RBC;
+ break;
+ case UISUBCLASS_SFF8020I:
+ case UISUBCLASS_SFF8070I:
+ retval |= UMASS_PROTO_ATAPI;
+ break;
+ default:
+ retval = 0;
+ goto done;
+ }
+
+ switch (id->bInterfaceProtocol) {
+ case UIPROTO_MASS_CBI:
+ retval |= UMASS_PROTO_CBI;
+ break;
+ case UIPROTO_MASS_CBI_I:
+ retval |= UMASS_PROTO_CBI_I;
+ break;
+ case UIPROTO_MASS_BBB_OLD:
+ case UIPROTO_MASS_BBB:
+ retval |= UMASS_PROTO_BBB;
+ break;
+ default:
+ retval = 0;
+ goto done;
+ }
+done:
+ return (retval);
+}
+
/*
* Match the device we are seeing with the
* devices supported.
@@ -1289,10 +1346,9 @@
umass_probe_proto(device_t dev, struct usb2_attach_arg *uaa)
{
const struct umass_devdescr *udd = umass_devdescr;
- struct usb2_interface_descriptor *id;
struct umass_probe_proto ret;
- bzero(&ret, sizeof(ret));
+ memset(&ret, 0, sizeof(ret));
/*
* An entry specifically for Y-E Data devices as they don't fit in
@@ -1319,7 +1375,6 @@
ret.quirks |= NO_TEST_UNIT_READY;
}
ret.quirks |= RS_NO_CLEAR_UA | FLOPPY_SPEED;
- ret.error = 0;
goto done;
}
/*
@@ -1327,13 +1382,6 @@
* check for wildcarded and fully matched. First match wins.
*/
for (; udd->vid != VID_EOT; udd++) {
- if ((udd->vid == VID_WILDCARD) &&
- (udd->pid == PID_WILDCARD) &&
- (udd->rid == RID_WILDCARD)) {
- device_printf(dev, "ignoring invalid "
- "wildcard quirk\n");
- continue;
- }
if (((udd->vid == uaa->info.idVendor) ||
(udd->vid == VID_WILDCARD)) &&
((udd->pid == uaa->info.idProduct) ||
@@ -1341,64 +1389,28 @@
if (udd->rid == RID_WILDCARD) {
ret.proto = udd->proto;
ret.quirks = udd->quirks;
- ret.error = 0;
- goto done;
+ if (ret.proto == UMASS_PROTO_DEFAULT)
+ goto default_proto;
+ else
+ goto done;
} else if (udd->rid == uaa->info.bcdDevice) {
ret.proto = udd->proto;
ret.quirks = udd->quirks;
- ret.error = 0;
- goto done;
+ if (ret.proto == UMASS_PROTO_DEFAULT)
+ goto default_proto;
+ else
+ goto done;
} /* else RID does not match */
}
}
- /* Check for a standards compliant device */
- id = usb2_get_interface_descriptor(uaa->iface);
- if ((id == NULL) ||
- (id->bInterfaceClass != UICLASS_MASS)) {
+default_proto:
+ ret.proto = umass_get_proto(uaa->iface);
+ if (ret.proto == 0) {
+ device_printf(dev, "Unsupported protocol.\n");
ret.error = ENXIO;
- goto done;
- }
- switch (id->bInterfaceSubClass) {
- case UISUBCLASS_SCSI:
- ret.proto |= UMASS_PROTO_SCSI;
- break;
- case UISUBCLASS_UFI:
- ret.proto |= UMASS_PROTO_UFI;
- break;
- case UISUBCLASS_RBC:
- ret.proto |= UMASS_PROTO_RBC;
- break;
- case UISUBCLASS_SFF8020I:
- case UISUBCLASS_SFF8070I:
- ret.proto |= UMASS_PROTO_ATAPI;
- break;
- default:
- device_printf(dev, "unsupported command "
- "protocol %d\n", id->bInterfaceSubClass);
- ret.error = ENXIO;
- goto done;
- }
-
- switch (id->bInterfaceProtocol) {
- case UIPROTO_MASS_CBI:
- ret.proto |= UMASS_PROTO_CBI;
- break;
- case UIPROTO_MASS_CBI_I:
- ret.proto |= UMASS_PROTO_CBI_I;
- break;
- case UIPROTO_MASS_BBB_OLD:
- case UIPROTO_MASS_BBB:
- ret.proto |= UMASS_PROTO_BBB;
- break;
- default:
- device_printf(dev, "unsupported wire "
- "protocol %d\n", id->bInterfaceProtocol);
- ret.error = ENXIO;
- goto done;
- }
-
- ret.error = 0;
+ } else
+ ret.error = 0;
done:
return (ret);
}
==== //depot/projects/usb/src/sys/dev/usb/usbdevs#54 (text+ko) ====
@@ -624,6 +624,7 @@
vendor LINKSYS3 0x1915 Linksys
vendor QUALCOMMINC 0x19d2 Qualcomm, Incorporated
vendor STELERA 0x1a8d Stelera Wireless
+vendor MPMAN 0x1cae MpMan
vendor DRESDENELEKTRONIK 0x1cf1 dresden elektronik
vendor DLINK 0x2001 D-Link
vendor PLANEX2 0x2019 Planex Communications
@@ -2296,6 +2297,10 @@
product STELERA ZEROCD 0x1000 Zerocd Installer
product STELERA C105 0x1002 Stelera/Bandrish C105 USB
+/* MpMan products */
+product MPMAN MPF400_1 0x36d0 MPF400 Music Player 1Go
+product MPMAN MPF400_2 0x25a8 MPF400 Music Player 2Go
+
/* STMicroelectronics products */
product STMICRO BIOCPU 0x2016 Biometric Coprocessor
product STMICRO COMMUNICATOR 0x7554 USB Communicator
More information about the p4-projects
mailing list