linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org
Cc: Jiri Slaby <jirislaby@kernel.org>, Hugo Villeneuve <hugo@hugovil.com>
Subject: [PATCH v2 02/16] serial: max3100: Update uart_driver_registered on driver removal
Date: Tue,  2 Apr 2024 22:50:29 +0300	[thread overview]
Message-ID: <20240402195306.269276-3-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20240402195306.269276-1-andriy.shevchenko@linux.intel.com>

The removal of the last MAX3100 device triggers the removal of
the driver. However, code doesn't update the respective global
variable and after insmod — rmmod — insmod cycle the kernel
oopses:

  max3100 spi-PRP0001:01: max3100_probe: adding port 0
  BUG: kernel NULL pointer dereference, address: 0000000000000408
  ...
  RIP: 0010:serial_core_register_port+0xa0/0x840
  ...
   max3100_probe+0x1b6/0x280 [max3100]
   spi_probe+0x8d/0xb0

Update the actual state so next time UART driver will be registered
again.

Hugo also noticed, that the error path in the probe also affected
by having the variable set, and not cleared. Instead of clearing it
move the assignment after the successfull uart_register_driver() call.

Fixes: 7831d56b0a35 ("tty: MAX3100")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/tty/serial/max3100.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c
index 45022f2909f0..b3e63b6a402e 100644
--- a/drivers/tty/serial/max3100.c
+++ b/drivers/tty/serial/max3100.c
@@ -749,13 +749,14 @@ static int max3100_probe(struct spi_device *spi)
 	mutex_lock(&max3100s_lock);
 
 	if (!uart_driver_registered) {
-		uart_driver_registered = 1;
 		retval = uart_register_driver(&max3100_uart_driver);
 		if (retval) {
 			printk(KERN_ERR "Couldn't register max3100 uart driver\n");
 			mutex_unlock(&max3100s_lock);
 			return retval;
 		}
+
+		uart_driver_registered = 1;
 	}
 
 	for (i = 0; i < MAX_MAX3100; i++)
@@ -841,6 +842,7 @@ static void max3100_remove(struct spi_device *spi)
 		}
 	pr_debug("removing max3100 driver\n");
 	uart_unregister_driver(&max3100_uart_driver);
+	uart_driver_registered = 0;
 
 	mutex_unlock(&max3100s_lock);
 }
-- 
2.43.0.rc1.1.gbec44491f096


  parent reply	other threads:[~2024-04-02 19:53 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-02 19:50 [PATCH v2 00/16] serial: max3100: Put into shape Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 01/16] serial: max3100: Lock port->lock when calling uart_handle_cts_change() Andy Shevchenko
2024-04-02 19:50 ` Andy Shevchenko [this message]
2024-04-02 20:11   ` [PATCH v2 02/16] serial: max3100: Update uart_driver_registered on driver removal Hugo Villeneuve
2024-04-02 19:50 ` [PATCH v2 03/16] serial: max3100: Fix bitwise types Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 04/16] serial: max3100: Make struct plat_max3100 local Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 05/16] serial: max3100: Remove custom HW shutdown support Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 06/16] serial: max3100: Replace custom polling timeout with standard one Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 07/16] serial: max3100: Enable TIOCM_LOOP Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 08/16] serial: max3100: Get crystal frequency via device property Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 09/16] serial: max3100: Remove duplicating irq field Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 10/16] serial: max3100: Switch to use dev_err_probe() Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 11/16] serial: max3100: Replace MODULE_ALIAS() with respective ID tables Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 12/16] serial: max3100: Switch to DEFINE_SIMPLE_DEV_PM_OPS() Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 13/16] serial: max3100: Extract to_max3100_port() helper macro Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 14/16] serial: max3100: Remove unneeded forward declaration Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 15/16] serial: max3100: Sort headers Andy Shevchenko
2024-04-02 19:50 ` [PATCH v2 16/16] serial: max3100: Update Kconfig entry Andy Shevchenko
2024-04-09 13:52 ` [PATCH v2 00/16] serial: max3100: Put into shape Greg Kroah-Hartman
2024-04-09 13:55   ` Andy Shevchenko
2024-04-09 14:48     ` Andy Shevchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240402195306.269276-3-andriy.shevchenko@linux.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hugo@hugovil.com \
    --cc=jirislaby@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).