Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 May 2009 08:13:20 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 161533 for review
Message-ID:  <200905040813.n448DKFL007822@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=161533

Change 161533 by hselasky@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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905040813.n448DKFL007822>