Sync to P4

Add umass quirks for Alcor AU6390, Cypress PATA 6830XX and MPMan MPF400.

Submitted by:	Hans Petter Selasky
This commit is contained in:
Andrew Thompson 2009-05-13 18:03:23 +00:00
parent f1f8840814
commit 3a67e91430
2 changed files with 90 additions and 64 deletions

View file

@ -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_devdescr[] = {
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_devdescr[] = {
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_devdescr[] = {
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_devdescr[] = {
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_devdescr[] = {
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 usb2_attach_arg *uaa)
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 usb2_attach_arg *uaa)
* 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 usb2_attach_arg *uaa)
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)
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);
}

View file

@ -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/Hub
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