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
This commit is contained in:
@@ -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,36 +823,31 @@ 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;
|
||||
return usb_control_msg_send(interface_to_usbdev(intf),
|
||||
0,
|
||||
F81232_REGISTER_REQUEST,
|
||||
F81232_SET_REGISTER,
|
||||
reg,
|
||||
0,
|
||||
val,
|
||||
size,
|
||||
USB_CTRL_SET_TIMEOUT,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
while (retry--) {
|
||||
status = usb_control_msg_send(dev,
|
||||
0,
|
||||
F81232_REGISTER_REQUEST,
|
||||
F81232_SET_REGISTER,
|
||||
reg,
|
||||
0,
|
||||
val,
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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) },
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user