|
@@ -69,16 +69,39 @@ static int uas_use_uas_driver(struct usb_interface *intf,
|
|
|
return 0;
|
|
|
|
|
|
/*
|
|
|
- * ASM1051 and older ASM1053 devices have the same usb-id, and UAS is
|
|
|
- * broken on the ASM1051, use the number of streams to differentiate.
|
|
|
- * New ASM1053-s also support 32 streams, but have a different prod-id.
|
|
|
+ * ASMedia has a number of usb3 to sata bridge chips, at the time of
|
|
|
+ * this writing the following versions exist:
|
|
|
+ * ASM1051 - no uas support version
|
|
|
+ * ASM1051 - with broken (*) uas support
|
|
|
+ * ASM1053 - with working uas support
|
|
|
+ * ASM1153 - with working uas support
|
|
|
+ *
|
|
|
+ * Devices with these chips re-use a number of device-ids over the
|
|
|
+ * entire line, so the device-id is useless to determine if we're
|
|
|
+ * dealing with an ASM1051 (which we want to avoid).
|
|
|
+ *
|
|
|
+ * The ASM1153 can be identified by config.MaxPower == 0,
|
|
|
+ * where as the ASM105x models have config.MaxPower == 36.
|
|
|
+ *
|
|
|
+ * Differentiating between the ASM1053 and ASM1051 is trickier, when
|
|
|
+ * connected over USB-3 we can look at the number of streams supported,
|
|
|
+ * ASM1051 supports 32 streams, where as early ASM1053 versions support
|
|
|
+ * 16 streams, newer ASM1053-s also support 32 streams, but have a
|
|
|
+ * different prod-id.
|
|
|
+ *
|
|
|
+ * (*) ASM1051 chips do work with UAS with some disks (with the
|
|
|
+ * US_FL_NO_REPORT_OPCODES quirk), but are broken with other disks
|
|
|
*/
|
|
|
if (le16_to_cpu(udev->descriptor.idVendor) == 0x174c &&
|
|
|
- le16_to_cpu(udev->descriptor.idProduct) == 0x55aa) {
|
|
|
- if (udev->speed < USB_SPEED_SUPER) {
|
|
|
+ (le16_to_cpu(udev->descriptor.idProduct) == 0x5106 ||
|
|
|
+ le16_to_cpu(udev->descriptor.idProduct) == 0x55aa)) {
|
|
|
+ if (udev->actconfig->desc.bMaxPower == 0) {
|
|
|
+ /* ASM1153, do nothing */
|
|
|
+ } else if (udev->speed < USB_SPEED_SUPER) {
|
|
|
/* No streams info, assume ASM1051 */
|
|
|
flags |= US_FL_IGNORE_UAS;
|
|
|
} else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) {
|
|
|
+ /* Possibly an ASM1051, disable uas */
|
|
|
flags |= US_FL_IGNORE_UAS;
|
|
|
}
|
|
|
}
|