Skip to content

Commit

Permalink
jme: Protect vlgrp structure by pause RX actions.
Browse files Browse the repository at this point in the history
Temporary stop the RX IRQ, and disable (sync) tasklet or napi.
And restore it after finished the vlgrp pointer assignment.

Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
Cc: stable@kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Guo-Fu Tseng authored and David S. Miller committed Mar 19, 2010
1 parent 17da69b commit bf5e536
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions drivers/net/jme.c
Original file line number Diff line number Diff line change
Expand Up @@ -2083,12 +2083,45 @@ jme_tx_timeout(struct net_device *netdev)
jme_reset_link(jme);
}

static inline void jme_pause_rx(struct jme_adapter *jme)
{
atomic_dec(&jme->link_changing);

jme_set_rx_pcc(jme, PCC_OFF);
if (test_bit(JME_FLAG_POLL, &jme->flags)) {
JME_NAPI_DISABLE(jme);
} else {
tasklet_disable(&jme->rxclean_task);
tasklet_disable(&jme->rxempty_task);
}
}

static inline void jme_resume_rx(struct jme_adapter *jme)
{
struct dynpcc_info *dpi = &(jme->dpi);

if (test_bit(JME_FLAG_POLL, &jme->flags)) {
JME_NAPI_ENABLE(jme);
} else {
tasklet_hi_enable(&jme->rxclean_task);
tasklet_hi_enable(&jme->rxempty_task);
}
dpi->cur = PCC_P1;
dpi->attempt = PCC_P1;
dpi->cnt = 0;
jme_set_rx_pcc(jme, PCC_P1);

atomic_inc(&jme->link_changing);
}

static void
jme_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
{
struct jme_adapter *jme = netdev_priv(netdev);

jme_pause_rx(jme);
jme->vlgrp = grp;
jme_resume_rx(jme);
}

static void
Expand Down

0 comments on commit bf5e536

Please sign in to comment.