Merge tag 'usb-5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
[linux-2.6-microblaze.git] / drivers / tty / n_gsm.c
index 51dafc0..5fea02c 100644 (file)
@@ -50,6 +50,7 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/gsmmux.h>
+#include "tty.h"
 
 static int debug;
 module_param(debug, int, 0600);
@@ -266,7 +267,7 @@ struct gsm_mux {
 
 #define MAX_MUX                4                       /* 256 minors */
 static struct gsm_mux *gsm_mux[MAX_MUX];       /* GSM muxes */
-static spinlock_t gsm_mux_lock;
+static DEFINE_SPINLOCK(gsm_mux_lock);
 
 static struct tty_driver *gsm_tty_driver;
 
@@ -2384,8 +2385,18 @@ static int gsmld_attach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
                /* Don't register device 0 - this is the control channel and not
                   a usable tty interface */
                base = mux_num_to_base(gsm); /* Base for this MUX */
-               for (i = 1; i < NUM_DLCI; i++)
-                       tty_register_device(gsm_tty_driver, base + i, NULL);
+               for (i = 1; i < NUM_DLCI; i++) {
+                       struct device *dev;
+
+                       dev = tty_register_device(gsm_tty_driver,
+                                                       base + i, NULL);
+                       if (IS_ERR(dev)) {
+                               for (i--; i >= 1; i--)
+                                       tty_unregister_device(gsm_tty_driver,
+                                                               base + i);
+                               return PTR_ERR(dev);
+                       }
+               }
        }
        return ret;
 }
@@ -2416,27 +2427,24 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
                              char *fp, int count)
 {
        struct gsm_mux *gsm = tty->disc_data;
-       const unsigned char *dp;
-       char *f;
-       int i;
        char flags = TTY_NORMAL;
 
        if (debug & 4)
                print_hex_dump_bytes("gsmld_receive: ", DUMP_PREFIX_OFFSET,
                                     cp, count);
 
-       for (i = count, dp = cp, f = fp; i; i--, dp++) {
-               if (f)
-                       flags = *f++;
+       for (; count; count--, cp++) {
+               if (fp)
+                       flags = *fp++;
                switch (flags) {
                case TTY_NORMAL:
-                       gsm->receive(gsm, *dp);
+                       gsm->receive(gsm, *cp);
                        break;
                case TTY_OVERRUN:
                case TTY_BREAK:
                case TTY_PARITY:
                case TTY_FRAME:
-                       gsm_error(gsm, *dp, flags);
+                       gsm_error(gsm, *cp, flags);
                        break;
                default:
                        WARN_ONCE(1, "%s: unknown flag %d\n",
@@ -2849,7 +2857,6 @@ static int gsm_create_network(struct gsm_dlci *dlci, struct gsm_netconfig *nc)
 /* Line discipline for real tty */
 static struct tty_ldisc_ops tty_ldisc_packet = {
        .owner           = THIS_MODULE,
-       .magic           = TTY_LDISC_MAGIC,
        .name            = "n_gsm",
        .open            = gsmld_open,
        .close           = gsmld_close,
@@ -3052,7 +3059,7 @@ static int gsmtty_write_room(struct tty_struct *tty)
 {
        struct gsm_dlci *dlci = tty->driver_data;
        if (dlci->state == DLCI_CLOSED)
-               return -EINVAL;
+               return 0;
        return TX_SIZE - kfifo_len(&dlci->fifo);
 }
 
@@ -3060,7 +3067,7 @@ static int gsmtty_chars_in_buffer(struct tty_struct *tty)
 {
        struct gsm_dlci *dlci = tty->driver_data;
        if (dlci->state == DLCI_CLOSED)
-               return -EINVAL;
+               return 0;
        return kfifo_len(&dlci->fifo);
 }
 
@@ -3261,8 +3268,6 @@ static int __init gsm_init(void)
        gsm_tty_driver->init_termios.c_lflag &= ~ECHO;
        tty_set_operations(gsm_tty_driver, &gsmtty_ops);
 
-       spin_lock_init(&gsm_mux_lock);
-
        if (tty_register_driver(gsm_tty_driver)) {
                put_tty_driver(gsm_tty_driver);
                tty_unregister_ldisc(N_GSM0710);