USB: serial: pl2303: fix HX type detection

The device release number for HX-type devices is configurable in
EEPROM/OTPROM and cannot be used reliably for type detection.

Assume all (non-H) devices with bcdUSB 1.1 and unknown bcdDevice to be
of HX type while adding a bcdDevice check for HXD and TB (1.1 and 2.0,
respectively).

Reported-by: Chris <chris@cyber-anlage.de>
Fixes: 8a7bf7510d ("USB: serial: pl2303: amend and tighten type detection")
Cc: stable@vger.kernel.org	# 5.13
Link: https://lore.kernel.org/r/20210730122156.718-1-johan@kernel.org
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
Johan Hovold 2021-07-30 14:21:56 +02:00
parent 3c18e9baee
commit 1e9faef4d2

View File

@ -418,25 +418,34 @@ static int pl2303_detect_type(struct usb_serial *serial)
bcdDevice = le16_to_cpu(desc->bcdDevice); bcdDevice = le16_to_cpu(desc->bcdDevice);
bcdUSB = le16_to_cpu(desc->bcdUSB); bcdUSB = le16_to_cpu(desc->bcdUSB);
switch (bcdUSB) {
case 0x110:
switch (bcdDevice) { 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: case 0x300:
if (bcdUSB == 0x200)
return TYPE_TA;
return TYPE_HX; return TYPE_HX;
case 0x400: case 0x400:
return TYPE_HXD; return TYPE_HXD;
default:
return TYPE_HX;
}
break;
case 0x200:
switch (bcdDevice) {
case 0x100:
/*
* Assume it's an HXN-type if the device doesn't
* support the old read request value.
*/
if (!pl2303_supports_hx_status(serial))
return TYPE_HXN;
break;
case 0x300:
return TYPE_TA;
case 0x500: case 0x500:
return TYPE_TB; return TYPE_TB;
} }
break;
}
dev_err(&serial->interface->dev, dev_err(&serial->interface->dev,
"unknown device type, please report to linux-usb@vger.kernel.org\n"); "unknown device type, please report to linux-usb@vger.kernel.org\n");