aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/pl2303.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2021-03-11 17:14:50 +0100
committerJohan Hovold <johan@kernel.org>2021-03-17 09:16:27 +0100
commit894758d0571de4675520540c9e093d7e0ed9aae6 (patch)
tree2d7b4392263e715c19285339b4af65c5c8daa39d /drivers/usb/serial/pl2303.c
parentUSB: serial: pl2303: rename legacy PL2303H type (diff)
downloadlinux-dev-894758d0571de4675520540c9e093d7e0ed9aae6.tar.xz
linux-dev-894758d0571de4675520540c9e093d7e0ed9aae6.zip
USB: serial: pl2303: tighten type HXN (G) detection
Tighten the detection of the new HXN (G) type instead of assuming that every device which doesn't support the old read request is an HXN. Signed-off-by: Johan Hovold <johan@kernel.org>
Diffstat (limited to 'drivers/usb/serial/pl2303.c')
-rw-r--r--drivers/usb/serial/pl2303.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index cd2acd8c5246..e742187c8a7f 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -374,12 +374,22 @@ static int pl2303_calc_num_ports(struct usb_serial *serial,
return 1;
}
+static bool pl2303_supports_hx_status(struct usb_serial *serial)
+{
+ int ret;
+ u8 buf;
+
+ ret = usb_control_msg_recv(serial->dev, 0, VENDOR_READ_REQUEST,
+ VENDOR_READ_REQUEST_TYPE, PL2303_READ_TYPE_HX_STATUS,
+ 0, &buf, 1, 100, GFP_KERNEL);
+
+ return ret == 0;
+}
+
static int pl2303_detect_type(struct usb_serial *serial)
{
struct usb_device_descriptor *desc = &serial->dev->descriptor;
u16 bcdDevice, bcdUSB;
- int ret;
- u8 buf;
/*
* Legacy PL2303H, variants 0 and 1 (difference unknown).
@@ -394,20 +404,18 @@ static int pl2303_detect_type(struct usb_serial *serial)
return TYPE_H; /* variant 0 */
}
- /*
- * Assume it's an HXN-type if the device doesn't support the old read
- * request value.
- */
- ret = usb_control_msg_recv(serial->dev, 0, VENDOR_READ_REQUEST,
- VENDOR_READ_REQUEST_TYPE, PL2303_READ_TYPE_HX_STATUS,
- 0, &buf, 1, 100, GFP_KERNEL);
- if (ret)
- return TYPE_HXN;
-
bcdDevice = le16_to_cpu(desc->bcdDevice);
bcdUSB = le16_to_cpu(desc->bcdUSB);
switch (bcdDevice) {
+ case 0x100:
+ /*
+ * Assume it's an HXN-type if the device doesn't support the old read
+ * request value.
+ */
+ if (bcdUSB == 0x200 && !pl2303_supports_hx_status(serial))
+ return TYPE_HXN;
+ break;
case 0x300:
if (bcdUSB == 0x200)
return TYPE_TA;