Commit 1e9faef4 authored by Johan Hovold's avatar Johan Hovold
Browse files

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: default avatarChris <chris@cyber-anlage.de>
Fixes: 8a7bf751 ("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: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent 3c18e9ba
Loading
Loading
Loading
Loading
+25 −16
Original line number Diff line number Diff line
@@ -418,25 +418,34 @@ static int pl2303_detect_type(struct usb_serial *serial)
	bcdDevice = le16_to_cpu(desc->bcdDevice);
	bcdUSB = le16_to_cpu(desc->bcdUSB);

	switch (bcdUSB) {
	case 0x110:
		switch (bcdDevice) {
		case 0x300:
			return TYPE_HX;
		case 0x400:
			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.
			 * 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))
			if (!pl2303_supports_hx_status(serial))
				return TYPE_HXN;
			break;
		case 0x300:
		if (bcdUSB == 0x200)
			return TYPE_TA;

		return TYPE_HX;
	case 0x400:
		return TYPE_HXD;
		case 0x500:
			return TYPE_TB;
		}
		break;
	}

	dev_err(&serial->interface->dev,
			"unknown device type, please report to linux-usb@vger.kernel.org\n");