FAILED: patch "[PATCH] serial: max310x: prevent infinite while() loop in port" failed to apply to 4.19-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y
git checkout FETCH_HEAD
git cherry-pick -x b35f8dbbce818b02c730dc85133dc7754266e084
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024021931-frisbee-commence-08ec@gregkh' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
b35f8dbbce81 ("serial: max310x: prevent infinite while() loop in port startup")93cd256ab224 ("serial: max310x: improve crystal stable clock detection")0419373333c2 ("serial: max310x: set default value when reading clock ready bit")6ef281daf020 ("serial: max310x: use a separate regmap for each port")285e76fc049c ("serial: max310x: use regmap methods for SPI batch operations")c808fab604ca ("serial: max310x: Make use of device properties")b7382c73b2d7 ("tty: max310x: Don't pass stacked buffers to SPI")3a10e3dd52e8 ("serial: max310x: Fix to avoid potential NULL pointer dereference")f233ea4327d7 ("serial: max310x: Correction of the initial setting of the MODE1 bits for various supported ICs.")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b35f8dbbce818b02c730dc85133dc7754266e084 Mon Sep 17 00:00:00 2001
From: Hugo Villeneuve <[email protected]>
Date: Tue, 16 Jan 2024 16:30:01 -0500
Subject: [PATCH] serial: max310x: prevent infinite while() loop in port
startup
If there is a problem after resetting a port, the do/while() loop that checks the default value of DIVLSB register may run forever and spam the I2C bus.
Add a delay before each read of DIVLSB, and a maximum number of tries to prevent that situation from happening.
Also fail probe if port reset is unsuccessful.
drivers/tty/serial/max310x.c +18 -2
@@ -237,6 +237,10 @@#define MAX310x_REV_MASK (0xf8)#define MAX310X_WRITE_BIT 0x80 +/* Port startup definitions */ +#define MAX310X_PORT_STARTUP_WAIT_RETRIES 20/* Number of retries */ +#define MAX310X_PORT_STARTUP_WAIT_DELAY_MS 10/* Delay between retries */ +/* Crystal-related definitions */ #define MAX310X_XTAL_WAIT_RETRIES 20/* Number of retries */ #define MAX310X_XTAL_WAIT_DELAY_MS 10/* Delay between retries */
@@ -1346,6 +1350,9 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty goto out_clk;for (i =0 ; i < devtype->nr; i++) { +bool started = false; +unsigned int try =0 , val =0 ; +/* Reset port */ regmap_write (regmaps[i],MAX310X_MODE2_REG ,MAX310X_MODE2_RST_BIT );
@@ -1354,8 +1361,17 @@ static int max310x_probe(struct device *dev, const struct max310x_devtype *devty/* Wait for port startup */ do { -regmap_read (regmaps[i],MAX310X_BRGDIVLSB_REG , &ret); - }while (ret !=0x01 ); +msleep (MAX310X_PORT_STARTUP_WAIT_DELAY_MS ); +regmap_read (regmaps[i],MAX310X_BRGDIVLSB_REG , &val); + +if (val ==0x01 ) + started = true; + }while (!started && (++try <MAX310X_PORT_STARTUP_WAIT_RETRIES )); + +if (!started) { + ret =dev_err_probe (dev, -EAGAIN ,"port reset failed\n" ); + goto out_uart; + }regmap_write (regmaps[i],MAX310X_MODE1_REG , devtype->mode1); }