From: Greg Kroah-Hartman Date: Sun, 22 Mar 2026 07:39:43 +0000 (+0100) Subject: 6.12-stable patches X-Git-Tag: v6.1.167~32 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=db51023ebe656c4ca5752ca96c7bdae1ba3d6459;p=thirdparty%2Fkernel%2Fstable-queue.git 6.12-stable patches added patches: usb-serial-f81232-fix-incomplete-serial-port-generation.patch --- diff --git a/queue-6.12/series b/queue-6.12/series index 92ecc1059a..59975aa6c8 100644 --- a/queue-6.12/series +++ b/queue-6.12/series @@ -434,3 +434,4 @@ icmp-fix-null-pointer-dereference-in-icmp_tag_valida.patch hwmon-pmbus-mp2975-add-error-check-for-pmbus_read_word_data-return-value.patch hwmon-pmbus-isl68137-fix-unchecked-return-value-and-use-sysfs_emit.patch drm-i915-psr-compute-psr-entry_setup_frames-into-intel_crtc_state.patch +usb-serial-f81232-fix-incomplete-serial-port-generation.patch diff --git a/queue-6.12/usb-serial-f81232-fix-incomplete-serial-port-generation.patch b/queue-6.12/usb-serial-f81232-fix-incomplete-serial-port-generation.patch new file mode 100644 index 0000000000..8722a6de03 --- /dev/null +++ b/queue-6.12/usb-serial-f81232-fix-incomplete-serial-port-generation.patch @@ -0,0 +1,133 @@ +From cd644b805da8a253198718741bf363c4c58862ff Mon Sep 17 00:00:00 2001 +From: "Ji-Ze Hong (Peter Hong)" +Date: Fri, 12 Dec 2025 15:08:31 +0800 +Subject: USB: serial: f81232: fix incomplete serial port generation + +From: Ji-Ze Hong (Peter Hong) + +commit cd644b805da8a253198718741bf363c4c58862ff upstream. + +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. + +This patch also removes the retry loop in f81534a_ctrl_set_register() +because the stale state has been fixed. + +Tested on: HygonDM1SLT(Hygon C86 3250 8-core Processor) + +Signed-off-by: Ji-Ze Hong (Peter Hong) +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/serial/f81232.c | 77 ++++++++++++++++++++++++++------------------ + 1 file changed, 47 insertions(+), 30 deletions(-) + +--- a/drivers/usb/serial/f81232.c ++++ b/drivers/usb/serial/f81232.c +@@ -70,7 +70,6 @@ MODULE_DEVICE_TABLE(usb, combined_id_tab + #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 wor + 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, +- 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 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); ++} + +- 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 + * 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; + }