Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 155456
b: refs/heads/master
c: adeab1a
h: refs/heads/master
v: v3
  • Loading branch information
Ralf Baechle authored and David S. Miller committed Jul 13, 2009
1 parent bc77a83 commit fd32c71
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 45 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 635ecaa70e862f85f652581305fe0074810893be
refs/heads/master: adeab1afb7de89555c69aab5ca21300c14af6369
10 changes: 6 additions & 4 deletions trunk/drivers/net/hamradio/6pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,13 +398,14 @@ static DEFINE_RWLOCK(disc_data_lock);

static struct sixpack *sp_get(struct tty_struct *tty)
{
unsigned long flags;
struct sixpack *sp;

read_lock(&disc_data_lock);
read_lock_irqsave(&disc_data_lock, flags);
sp = tty->disc_data;
if (sp)
atomic_inc(&sp->refcnt);
read_unlock(&disc_data_lock);
read_unlock_irqrestore(&disc_data_lock, flags);

return sp;
}
Expand Down Expand Up @@ -688,12 +689,13 @@ static int sixpack_open(struct tty_struct *tty)
*/
static void sixpack_close(struct tty_struct *tty)
{
unsigned long flags;
struct sixpack *sp;

write_lock(&disc_data_lock);
write_lock_irqsave(&disc_data_lock, flags);
sp = tty->disc_data;
tty->disc_data = NULL;
write_unlock(&disc_data_lock);
write_unlock_irqrestore(&disc_data_lock, flags);
if (!sp)
return;

Expand Down
41 changes: 24 additions & 17 deletions trunk/drivers/net/hamradio/mkiss.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,15 +244,16 @@ static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc,
/* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
static void ax_bump(struct mkiss *ax)
{
unsigned long flags;
struct sk_buff *skb;
int count;

spin_lock_bh(&ax->buflock);
spin_lock_irqsave(&ax->buflock, flags);
if (ax->rbuff[0] > 0x0f) {
if (ax->rbuff[0] & 0x80) {
if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
ax->dev->stats.rx_errors++;
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);

return;
}
Expand All @@ -267,7 +268,7 @@ static void ax_bump(struct mkiss *ax)
} else if (ax->rbuff[0] & 0x20) {
if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
ax->dev->stats.rx_errors++;
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);
return;
}
if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
Expand All @@ -294,7 +295,7 @@ static void ax_bump(struct mkiss *ax)
printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n",
ax->dev->name);
ax->dev->stats.rx_dropped++;
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);
return;
}

Expand All @@ -303,11 +304,13 @@ static void ax_bump(struct mkiss *ax)
netif_rx(skb);
ax->dev->stats.rx_packets++;
ax->dev->stats.rx_bytes += count;
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);
}

static void kiss_unesc(struct mkiss *ax, unsigned char s)
{
unsigned long flags;

switch (s) {
case END:
/* drop keeptest bit = VSV */
Expand All @@ -334,18 +337,18 @@ static void kiss_unesc(struct mkiss *ax, unsigned char s)
break;
}

spin_lock_bh(&ax->buflock);
spin_lock_irqsave(&ax->buflock, flags);
if (!test_bit(AXF_ERROR, &ax->flags)) {
if (ax->rcount < ax->buffsize) {
ax->rbuff[ax->rcount++] = s;
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);
return;
}

ax->dev->stats.rx_over_errors++;
set_bit(AXF_ERROR, &ax->flags);
}
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);
}

static int ax_set_mac_address(struct net_device *dev, void *addr)
Expand All @@ -367,6 +370,7 @@ static void ax_changedmtu(struct mkiss *ax)
{
struct net_device *dev = ax->dev;
unsigned char *xbuff, *rbuff, *oxbuff, *orbuff;
unsigned long flags;
int len;

len = dev->mtu * 2;
Expand All @@ -392,7 +396,7 @@ static void ax_changedmtu(struct mkiss *ax)
return;
}

spin_lock_bh(&ax->buflock);
spin_lock_irqsave(&ax->buflock, flags);

oxbuff = ax->xbuff;
ax->xbuff = xbuff;
Expand Down Expand Up @@ -423,7 +427,7 @@ static void ax_changedmtu(struct mkiss *ax)
ax->mtu = dev->mtu + 73;
ax->buffsize = len;

spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);

kfree(oxbuff);
kfree(orbuff);
Expand All @@ -433,6 +437,7 @@ static void ax_changedmtu(struct mkiss *ax)
static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
{
struct mkiss *ax = netdev_priv(dev);
unsigned long flags;
unsigned char *p;
int actual, count;

Expand All @@ -449,7 +454,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)

p = icp;

spin_lock_bh(&ax->buflock);
spin_lock_irqsave(&ax->buflock, flags);
if ((*p & 0x0f) != 0) {
/* Configuration Command (kissparms(1).
* Protocol spec says: never append CRC.
Expand Down Expand Up @@ -479,7 +484,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
ax->crcauto = (cmd ? 0 : 1);
printk(KERN_INFO "mkiss: %s: crc mode %s %d\n", ax->dev->name, (len) ? "set to" : "is", cmd);
}
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);
netif_start_queue(dev);

return;
Expand Down Expand Up @@ -512,7 +517,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
count = kiss_esc(p, (unsigned char *)ax->xbuff, len);
}
}
spin_unlock_bh(&ax->buflock);
spin_unlock_irqrestore(&ax->buflock, flags);

set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
Expand Down Expand Up @@ -704,13 +709,14 @@ static DEFINE_RWLOCK(disc_data_lock);

static struct mkiss *mkiss_get(struct tty_struct *tty)
{
unsigned long flags;
struct mkiss *ax;

read_lock(&disc_data_lock);
read_lock_irqsave(&disc_data_lock, flags);
ax = tty->disc_data;
if (ax)
atomic_inc(&ax->refcnt);
read_unlock(&disc_data_lock);
read_unlock_irqrestore(&disc_data_lock, flags);

return ax;
}
Expand Down Expand Up @@ -809,12 +815,13 @@ static int mkiss_open(struct tty_struct *tty)

static void mkiss_close(struct tty_struct *tty)
{
unsigned long flags;
struct mkiss *ax;

write_lock(&disc_data_lock);
write_lock_irqsave(&disc_data_lock, flags);
ax = tty->disc_data;
tty->disc_data = NULL;
write_unlock(&disc_data_lock);
write_unlock_irqrestore(&disc_data_lock, flags);

if (!ax)
return;
Expand Down
11 changes: 7 additions & 4 deletions trunk/drivers/net/ppp_async.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,15 @@ static DEFINE_RWLOCK(disc_data_lock);

static struct asyncppp *ap_get(struct tty_struct *tty)
{
unsigned long flags;
struct asyncppp *ap;

read_lock(&disc_data_lock);
read_lock_irqsave(&disc_data_lock, flags);
ap = tty->disc_data;
if (ap != NULL)
atomic_inc(&ap->refcnt);
read_unlock(&disc_data_lock);
read_unlock_irqrestore(&disc_data_lock, flags);

return ap;
}

Expand Down Expand Up @@ -215,12 +217,13 @@ ppp_asynctty_open(struct tty_struct *tty)
static void
ppp_asynctty_close(struct tty_struct *tty)
{
unsigned long flags;
struct asyncppp *ap;

write_lock_irq(&disc_data_lock);
write_lock_irqsave(&disc_data_lock, flags);
ap = tty->disc_data;
tty->disc_data = NULL;
write_unlock_irq(&disc_data_lock);
write_unlock_irqrestore(&disc_data_lock, flags);
if (!ap)
return;

Expand Down
11 changes: 7 additions & 4 deletions trunk/drivers/net/ppp_synctty.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,15 @@ static DEFINE_RWLOCK(disc_data_lock);

static struct syncppp *sp_get(struct tty_struct *tty)
{
unsigned long flags;
struct syncppp *ap;

read_lock(&disc_data_lock);
read_lock_irqsave(&disc_data_lock, flags);
ap = tty->disc_data;
if (ap != NULL)
atomic_inc(&ap->refcnt);
read_unlock(&disc_data_lock);
read_unlock_irqrestore(&disc_data_lock, flags);

return ap;
}

Expand Down Expand Up @@ -262,12 +264,13 @@ ppp_sync_open(struct tty_struct *tty)
static void
ppp_sync_close(struct tty_struct *tty)
{
unsigned long flags;
struct syncppp *ap;

write_lock_irq(&disc_data_lock);
write_lock_irqsave(&disc_data_lock, flags);
ap = tty->disc_data;
tty->disc_data = NULL;
write_unlock_irq(&disc_data_lock);
write_unlock_irqrestore(&disc_data_lock, flags);
if (!ap)
return;

Expand Down
Loading

0 comments on commit fd32c71

Please sign in to comment.