b44: Unconditionally enable interrupt routing on reset
Unconditionally setup the IRQ routing on chip reset. It's safe to call ssb_pcicore_dev_irqvecs_enable() unconditionally, because it has internal checks for redundant calls. This fixes problems where hardware will not come up properly due to quirks in the enable-bit hardware. Reported-by: Pantelis Koukousoulas <pktoss@gmail.com> Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9b58027bc2
commit
f8af11af85
|
@ -1264,8 +1264,14 @@ static void b44_clear_stats(struct b44 *bp)
|
||||||
static void b44_chip_reset(struct b44 *bp, int reset_kind)
|
static void b44_chip_reset(struct b44 *bp, int reset_kind)
|
||||||
{
|
{
|
||||||
struct ssb_device *sdev = bp->sdev;
|
struct ssb_device *sdev = bp->sdev;
|
||||||
|
bool was_enabled;
|
||||||
|
|
||||||
if (ssb_device_is_enabled(bp->sdev)) {
|
was_enabled = ssb_device_is_enabled(bp->sdev);
|
||||||
|
|
||||||
|
ssb_device_enable(bp->sdev, 0);
|
||||||
|
ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
|
||||||
|
|
||||||
|
if (was_enabled) {
|
||||||
bw32(bp, B44_RCV_LAZY, 0);
|
bw32(bp, B44_RCV_LAZY, 0);
|
||||||
bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
|
bw32(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE);
|
||||||
b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
|
b44_wait_bit(bp, B44_ENET_CTRL, ENET_CTRL_DISABLE, 200, 1);
|
||||||
|
@ -1277,10 +1283,8 @@ static void b44_chip_reset(struct b44 *bp, int reset_kind)
|
||||||
}
|
}
|
||||||
bw32(bp, B44_DMARX_CTRL, 0);
|
bw32(bp, B44_DMARX_CTRL, 0);
|
||||||
bp->rx_prod = bp->rx_cons = 0;
|
bp->rx_prod = bp->rx_cons = 0;
|
||||||
} else
|
}
|
||||||
ssb_pcicore_dev_irqvecs_enable(&sdev->bus->pcicore, sdev);
|
|
||||||
|
|
||||||
ssb_device_enable(bp->sdev, 0);
|
|
||||||
b44_clear_stats(bp);
|
b44_clear_stats(bp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Reference in New Issue