diff options
Diffstat (limited to 'drivers/net/hamradio/6pack.c')
| -rw-r--r-- | drivers/net/hamradio/6pack.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 45c3c4a1101b..9fb567524220 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c @@ -99,6 +99,7 @@ struct sixpack {  	unsigned int		rx_count;  	unsigned int		rx_count_cooked; +	spinlock_t		rxlock;  	int			mtu;		/* Our mtu (to spot changes!) */  	int			buffsize;       /* Max buffers sizes */ @@ -565,6 +566,7 @@ static int sixpack_open(struct tty_struct *tty)  	sp->dev = dev;  	spin_lock_init(&sp->lock); +	spin_lock_init(&sp->rxlock);  	refcount_set(&sp->refcnt, 1);  	init_completion(&sp->dead); @@ -913,6 +915,7 @@ static void decode_std_command(struct sixpack *sp, unsigned char cmd)  			sp->led_state = 0x60;  			/* fill trailing bytes with zeroes */  			sp->tty->ops->write(sp->tty, &sp->led_state, 1); +			spin_lock_bh(&sp->rxlock);  			rest = sp->rx_count;  			if (rest != 0)  				 for (i = rest; i <= 3; i++) @@ -930,6 +933,7 @@ static void decode_std_command(struct sixpack *sp, unsigned char cmd)  				sp_bump(sp, 0);  			}  			sp->rx_count_cooked = 0; +			spin_unlock_bh(&sp->rxlock);  		}  		break;  	case SIXP_TX_URUN: printk(KERN_DEBUG "6pack: TX underrun\n"); @@ -959,8 +963,11 @@ sixpack_decode(struct sixpack *sp, const unsigned char *pre_rbuff, int count)  			decode_prio_command(sp, inbyte);  		else if ((inbyte & SIXP_STD_CMD_MASK) != 0)  			decode_std_command(sp, inbyte); -		else if ((sp->status & SIXP_RX_DCD_MASK) == SIXP_RX_DCD_MASK) +		else if ((sp->status & SIXP_RX_DCD_MASK) == SIXP_RX_DCD_MASK) { +			spin_lock_bh(&sp->rxlock);  			decode_data(sp, inbyte); +			spin_unlock_bh(&sp->rxlock); +		}  	}  }  |