Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tty: n_gsm: Modify gsmtty driver register method when config requester

As requester,because n_gsm has no uevent report for application,the
application can't know dlci connect or disconnect.

The application will control every dlcl dev by uevent,when application
receive gsmtty0 dev remove uevent,it will close mux function,and change to
normal mode.

Example:

Before modify:

gsmld receive DLC0 DISC,no event report to application
gsmld receive DLC1 SABM,no event report to application
gsmld receive DLC1 DISC,no event report to application

After modify:

Receive DLC0 DISC,report "/devices/virtual/tty/gsmtty0" remove uevent

Receive DLC1 SABM,report "/devices/virtual/tty/gsmtty1" add uevent
Receive DLC1 DISC,report "/devices/virtual/tty/gsmtty1" remove uevent

Signed-off-by: Zhenguo Zhao <Zhenguo.Zhao1@unisoc.com>
Link: https://lore.kernel.org/r/1629461872-26965-7-git-send-email-zhenguo6858@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Zhenguo Zhao and committed by
Greg Kroah-Hartman
5b87686e cbff2b32

+19 -11
+19 -11
drivers/tty/n_gsm.c
··· 1433 1433 kfifo_reset(&dlci->fifo); 1434 1434 } else 1435 1435 dlci->gsm->dead = true; 1436 + /* Unregister gsmtty driver,report gsmtty dev remove uevent for user */ 1437 + tty_unregister_device(gsm_tty_driver, dlci->addr); 1436 1438 wake_up(&dlci->gsm->event); 1437 1439 /* A DLCI 0 close is a MUX termination so we need to kick that 1438 1440 back to userspace somehow */ ··· 1456 1454 dlci->state = DLCI_OPEN; 1457 1455 if (debug & 8) 1458 1456 pr_debug("DLCI %d goes open.\n", dlci->addr); 1457 + /* Register gsmtty driver,report gsmtty dev add uevent for user */ 1458 + tty_register_device(gsm_tty_driver, dlci->addr, NULL); 1459 1459 wake_up(&dlci->gsm->event); 1460 1460 } 1461 1461 ··· 2392 2388 else { 2393 2389 /* Don't register device 0 - this is the control channel and not 2394 2390 a usable tty interface */ 2395 - base = mux_num_to_base(gsm); /* Base for this MUX */ 2396 - for (i = 1; i < NUM_DLCI; i++) { 2397 - struct device *dev; 2391 + if (gsm->initiator) { 2392 + base = mux_num_to_base(gsm); /* Base for this MUX */ 2393 + for (i = 1; i < NUM_DLCI; i++) { 2394 + struct device *dev; 2398 2395 2399 - dev = tty_register_device(gsm_tty_driver, 2396 + dev = tty_register_device(gsm_tty_driver, 2400 2397 base + i, NULL); 2401 - if (IS_ERR(dev)) { 2402 - for (i--; i >= 1; i--) 2403 - tty_unregister_device(gsm_tty_driver, 2404 - base + i); 2405 - return PTR_ERR(dev); 2398 + if (IS_ERR(dev)) { 2399 + for (i--; i >= 1; i--) 2400 + tty_unregister_device(gsm_tty_driver, 2401 + base + i); 2402 + return PTR_ERR(dev); 2403 + } 2406 2404 } 2407 2405 } 2408 2406 } ··· 2426 2420 int i; 2427 2421 2428 2422 WARN_ON(tty != gsm->tty); 2429 - for (i = 1; i < NUM_DLCI; i++) 2430 - tty_unregister_device(gsm_tty_driver, base + i); 2423 + if (gsm->initiator) { 2424 + for (i = 1; i < NUM_DLCI; i++) 2425 + tty_unregister_device(gsm_tty_driver, base + i); 2426 + } 2431 2427 gsm_cleanup_mux(gsm); 2432 2428 tty_kref_put(gsm->tty); 2433 2429 gsm->tty = NULL;