Commit 9fa015bd authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'usb-serial-6.19-rc6' of...

Merge tag 'usb-serial-6.19-rc6' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial into usb-linus

Johan writes:

USB serial fix for 6.19-rc6

Here's a fix for an f81232 enumeration issue that could prevent some
ports from being enabled (e.g. during driver rebind).

Included are also some new device ids.

All have been in linux-next with no reported issues.

* tag 'usb-serial-6.19-rc6' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial:
  USB: serial: f81232: fix incomplete serial port generation
  USB: serial: ftdi_sio: add support for PICAXE AXE027 cable
  USB: serial: option: add Telit LE910 MBIM composition
parents 9bcb4c4c cd644b80
Loading
Loading
Loading
Loading
+47 −30
Original line number Diff line number Diff line
@@ -70,7 +70,6 @@ MODULE_DEVICE_TABLE(usb, combined_id_table);
#define F81232_REGISTER_REQUEST		0xa0
#define F81232_GET_REGISTER		0xc0
#define F81232_SET_REGISTER		0x40
#define F81534A_ACCESS_REG_RETRY	2

#define SERIAL_BASE_ADDRESS		0x0120
#define RECEIVE_BUFFER_REGISTER		(0x00 + SERIAL_BASE_ADDRESS)
@@ -824,12 +823,7 @@ static void f81232_lsr_worker(struct work_struct *work)
static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
					u16 size, void *val)
{
	struct usb_device *dev = interface_to_usbdev(intf);
	int retry = F81534A_ACCESS_REG_RETRY;
	int status;

	while (retry--) {
		status = usb_control_msg_send(dev,
	return usb_control_msg_send(interface_to_usbdev(intf),
						0,
						F81232_REGISTER_REQUEST,
						F81232_SET_REGISTER,
@@ -839,21 +833,21 @@ static int f81534a_ctrl_set_register(struct usb_interface *intf, u16 reg,
						size,
						USB_CTRL_SET_TIMEOUT,
						GFP_KERNEL);
		if (status) {
			status = usb_translate_errors(status);
			if (status == -EIO)
				continue;
		}

		break;
	}

	if (status) {
		dev_err(&intf->dev, "failed to set register 0x%x: %d\n",
				reg, status);
}

	return status;
static int f81534a_ctrl_get_register(struct usb_interface *intf, u16 reg,
					u16 size, void *val)
{
	return usb_control_msg_recv(interface_to_usbdev(intf),
						0,
						F81232_REGISTER_REQUEST,
						F81232_GET_REGISTER,
						reg,
						0,
						val,
						size,
						USB_CTRL_GET_TIMEOUT,
						GFP_KERNEL);
}

static int f81534a_ctrl_enable_all_ports(struct usb_interface *intf, bool en)
@@ -869,6 +863,29 @@ static int f81534a_ctrl_enable_all_ports(struct usb_interface *intf, bool en)
	 * bit 0~11	: Serial port enable bit.
	 */
	if (en) {
		/*
		 * The Fintek F81532A/534A/535/536 family relies on the
		 * F81534A_CTRL_CMD_ENABLE_PORT (116h) register during
		 * initialization to both determine serial port status and
		 * control port creation.
		 *
		 * If the driver experiences fast load/unload cycles, the
		 * device state may becomes unstable, resulting in the
		 * incomplete generation of serial ports.
		 *
		 * Performing a dummy read operation on the register prior
		 * to the initial write command resolves the issue.
		 *
		 * This clears the device's stale internal state. Subsequent
		 * write operations will correctly generate all serial ports.
		 */
		status = f81534a_ctrl_get_register(intf,
						F81534A_CTRL_CMD_ENABLE_PORT,
						sizeof(enable),
						enable);
		if (status)
			return status;

		enable[0] = 0xff;
		enable[1] = 0x8f;
	}
+1 −0
Original line number Diff line number Diff line
@@ -848,6 +848,7 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID, 1) },
	{ USB_DEVICE(FTDI_VID, FTDI_AXE027_PID) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_TURTELIZER_PID, 1) },
	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_SCU18) },
+2 −0
Original line number Diff line number Diff line
@@ -96,6 +96,8 @@
#define LMI_LM3S_EVAL_BOARD_PID		0xbcd9
#define LMI_LM3S_ICDI_BOARD_PID		0xbcda

#define FTDI_AXE027_PID		0xBD90 /* PICAXE AXE027 USB download cable */

#define FTDI_TURTELIZER_PID	0xBDC8 /* JTAG/RS-232 adapter by egnite GmbH */

/* OpenDCC (www.opendcc.de) product id */
+1 −0
Original line number Diff line number Diff line
@@ -1505,6 +1505,7 @@ static const struct usb_device_id option_ids[] = {
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1231, 0xff),	/* Telit LE910Cx (RNDIS) */
	  .driver_info = NCTRL(2) | RSVD(3) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x1250, 0xff, 0x00, 0x00) },	/* Telit LE910Cx (rmnet) */
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1252, 0xff) },	/* Telit LE910Cx (MBIM) */
	{ USB_DEVICE(TELIT_VENDOR_ID, 0x1260),
	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
	{ USB_DEVICE(TELIT_VENDOR_ID, 0x1261),