Skip to content

Commit

Permalink
8139cp: set intr mask after its handler is registered
Browse files Browse the repository at this point in the history
We set intr mask before its handler is registered, this does not work well when
8139cp is sharing irq line with other devices. As the irq could be enabled by
the device before 8139cp's hander is registered which may lead unhandled
irq. Fix this by introducing an helper cp_irq_enable() and call it after
request_irq().

Signed-off-by: Jason Wang <jasowang@redhat.com>
Reviewed-by: Flavio Leitner <fbl@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jason Wang authored and David S. Miller committed Apr 13, 2012
1 parent 03662e4 commit a8c9cb1
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions drivers/net/ethernet/realtek/8139cp.c
Original file line number Diff line number Diff line change
Expand Up @@ -958,6 +958,11 @@ static inline void cp_start_hw (struct cp_private *cp)
cpw8(Cmd, RxOn | TxOn);
}

static void cp_enable_irq(struct cp_private *cp)
{
cpw16_f(IntrMask, cp_intr_mask);
}

static void cp_init_hw (struct cp_private *cp)
{
struct net_device *dev = cp->dev;
Expand Down Expand Up @@ -997,8 +1002,6 @@ static void cp_init_hw (struct cp_private *cp)

cpw16(MultiIntr, 0);

cpw16_f(IntrMask, cp_intr_mask);

cpw8_f(Cfg9346, Cfg9346_Lock);
}

Expand Down Expand Up @@ -1130,6 +1133,8 @@ static int cp_open (struct net_device *dev)
if (rc)
goto err_out_hw;

cp_enable_irq(cp);

netif_carrier_off(dev);
mii_check_media(&cp->mii_if, netif_msg_link(cp), true);
netif_start_queue(dev);
Expand Down Expand Up @@ -2031,6 +2036,7 @@ static int cp_resume (struct pci_dev *pdev)
/* FIXME: sh*t may happen if the Rx ring buffer is depleted */
cp_init_rings_index (cp);
cp_init_hw (cp);
cp_enable_irq(cp);
netif_start_queue (dev);

spin_lock_irqsave (&cp->lock, flags);
Expand Down

0 comments on commit a8c9cb1

Please sign in to comment.