diff options
author | Lino Sanfilippo <LinoSanfilippo@gmx.de> | 2014-11-30 06:56:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-12-06 00:33:20 -0500 |
commit | ea589e9b7838f5d1c3d4998f9fe08854872187fc (patch) | |
tree | 71a9c11f313c8d5e67f056c9330c882e1e15ce69 /drivers/net/ethernet | |
parent | 6276288a4c1f755e6b65b0f2e1177855b0340e31 (diff) |
sky2: avoid pci write posting after disabling irqs
In sky2_change_mtu setting B0_IMSK to 0 may be delayed due to PCI write posting
which could result in irqs being still active when synchronize_irq is called.
Since we are not prepared to handle any further irqs after synchronize_irq
(our resources are freed after that) force the write by a consecutive read from
the same register.
Similar situation in sky2_all_down: Here we disabled irqs by a write to B0_IMSK
but did not ensure that this write took place before synchronize_irq. Fix that
too.
Signed-off-by: Lino Sanfilippo <LinoSanfilippo@gmx.de>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/marvell/sky2.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index bd3366267039..f14544c8d73f 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c | |||
@@ -2419,6 +2419,7 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) | |||
2419 | 2419 | ||
2420 | imask = sky2_read32(hw, B0_IMSK); | 2420 | imask = sky2_read32(hw, B0_IMSK); |
2421 | sky2_write32(hw, B0_IMSK, 0); | 2421 | sky2_write32(hw, B0_IMSK, 0); |
2422 | sky2_read32(hw, B0_IMSK); | ||
2422 | 2423 | ||
2423 | dev->trans_start = jiffies; /* prevent tx timeout */ | 2424 | dev->trans_start = jiffies; /* prevent tx timeout */ |
2424 | napi_disable(&hw->napi); | 2425 | napi_disable(&hw->napi); |
@@ -3487,8 +3488,8 @@ static void sky2_all_down(struct sky2_hw *hw) | |||
3487 | int i; | 3488 | int i; |
3488 | 3489 | ||
3489 | if (hw->flags & SKY2_HW_IRQ_SETUP) { | 3490 | if (hw->flags & SKY2_HW_IRQ_SETUP) { |
3490 | sky2_read32(hw, B0_IMSK); | ||
3491 | sky2_write32(hw, B0_IMSK, 0); | 3491 | sky2_write32(hw, B0_IMSK, 0); |
3492 | sky2_read32(hw, B0_IMSK); | ||
3492 | 3493 | ||
3493 | synchronize_irq(hw->pdev->irq); | 3494 | synchronize_irq(hw->pdev->irq); |
3494 | napi_disable(&hw->napi); | 3495 | napi_disable(&hw->napi); |