Author: thompsa
Date: Wed May 13 18:03:23 2009
New Revision: 192052
URL: http://svn.freebsd.org/changeset/base/192052

Log:
  Sync to P4
  
  Add umass quirks for Alcor AU6390, Cypress PATA 6830XX and MPMan MPF400.
  
  Submitted by: Hans Petter Selasky

Modified:
  head/sys/dev/usb/storage/umass.c
  head/sys/dev/usb/usbdevs

Modified: head/sys/dev/usb/storage/umass.c
==============================================================================
--- head/sys/dev/usb/storage/umass.c    Wed May 13 17:58:37 2009        
(r192051)
+++ head/sys/dev/usb/storage/umass.c    Wed May 13 18:03:23 2009        
(r192052)
@@ -309,6 +309,7 @@ struct umass_devdescr {
 
        /* 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 @@ struct umass_devdescr {
 
 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,
@@ -395,6 +396,10 @@ static const struct umass_devdescr umass
                UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
                NO_QUIRKS
        },
+       {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_AU6390, RID_WILDCARD,
+               UMASS_PROTO_DEFAULT,
+               NO_SYNCHRONIZE_CACHE
+       },
        {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_UMCR_9361, RID_WILDCARD,
                UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
                NO_GETMAXLUN
@@ -427,6 +432,10 @@ static const struct umass_devdescr umass
                UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
                FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE
        },
+       {USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_XX6830XX, RID_WILDCARD,
+               UMASS_PROTO_DEFAULT,
+               NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE
+       },
        {USB_VENDOR_DESKNOTE, USB_PRODUCT_DESKNOTE_UCR_61S2B, RID_WILDCARD,
                UMASS_PROTO_SCSI | UMASS_PROTO_BBB,
                NO_QUIRKS
@@ -600,6 +609,10 @@ static const struct umass_devdescr umass
                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 +622,11 @@ static const struct umass_devdescr umass
                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 +862,7 @@ static const struct umass_devdescr umass
                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 +1294,58 @@ MODULE_DEPEND(umass, cam, 1, 1, 1);
  * 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 +1354,9 @@ static struct umass_probe_proto
 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 +1383,6 @@ umass_probe_proto(device_t dev, struct u
                        ret.quirks |= NO_TEST_UNIT_READY;
                }
                ret.quirks |= RS_NO_CLEAR_UA | FLOPPY_SPEED;
-               ret.error = 0;
                goto done;
        }
        /*
@@ -1327,13 +1390,6 @@ umass_probe_proto(device_t dev, struct u
         * 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 +1397,27 @@ umass_probe_proto(device_t dev, struct u
                        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)) {
-               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);
+default_proto:
+       ret.proto = umass_get_proto(uaa->iface);
+       if (ret.proto == 0)
                ret.error = ENXIO;
-               goto done;
-       }
-
-       ret.error = 0;
+       else
+               ret.error = 0;
 done:
        return (ret);
 }

Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs    Wed May 13 17:58:37 2009        (r192051)
+++ head/sys/dev/usb/usbdevs    Wed May 13 18:03:23 2009        (r192052)
@@ -624,6 +624,7 @@ vendor QCOM         0x18e8  Qcom
 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
@@ -817,6 +818,7 @@ product ALCOR AU9814                0x9215  AU9814 Hub
 product ALCOR UMCR_9361                0x9361  USB Multimedia Card Reader
 product ALCOR SM_KBD           0x9410  MicroConnectors/StrongMan Keyboard
 product ALCOR NEC_KBD_HUB      0x9472  NEC Kbd Hub
+product ALCOR AU6390   0x6390  AU6390 USB-IDE converter
 
 /* Altec Lansing products */
 product ALTEC ADA70            0x0070  ADA70 Speakers
@@ -1107,6 +1109,7 @@ product CYPRESS KBDHUB            0x0101  Keyboard/
 product CYPRESS FMRADIO                0x1002  FM Radio
 product CYPRESS USBRS232       0x5500  USB-RS232 Interface
 product CYPRESS SLIM_HUB       0x6560  Slim Hub
+product CYPRESS XX6830XX       0x6830  PATA Storage Device
 
 /* Daisy Technology products */
 product DAISY DMC              0x6901  USB MultiMedia Reader
@@ -2297,6 +2300,10 @@ product SPHAIRON UB801R          0x0110  UB801R
 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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to