diff options
Diffstat (limited to 'drivers/tty/n_gsm.c')
| -rw-r--r-- | drivers/tty/n_gsm.c | 37 | 
1 files changed, 21 insertions, 16 deletions
| diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 51dafc06f541..5fea02cfb0cc 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -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); | 
