summaryrefslogtreecommitdiffstats
path: root/sys/dev/msk
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2010-05-04 17:12:36 +0000
committeryongari <yongari@FreeBSD.org>2010-05-04 17:12:36 +0000
commit44093d908838f41371b4160ac664abdab7dd5f97 (patch)
treef29c903aa0cd22f414520f64454be818dae1a71a /sys/dev/msk
parent9c1accad5ee5f0c2a36c06f921ac77ec31cd246a (diff)
downloadFreeBSD-src-44093d908838f41371b4160ac664abdab7dd5f97.zip
FreeBSD-src-44093d908838f41371b4160ac664abdab7dd5f97.tar.gz
Make sure to check whether driver is running before processing
received frames. Also check driver has valid ifp pointer before calling msk_stop() in device_shutdown handler. While I'm here remove unnecessary accesses to interrupt mask registers in device_shutdown handler because driver puts the controller into reset state. With these changes, msk(4) now survive from heavy RX traffic(1byte UDP frame) while reboot is in progress. Reported by: Mark Atkinson < atkin901 <> gmail dot com >
Diffstat (limited to 'sys/dev/msk')
-rw-r--r--sys/dev/msk/if_msk.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c
index 1c871a8..af977bf 100644
--- a/sys/dev/msk/if_msk.c
+++ b/sys/dev/msk/if_msk.c
@@ -2904,20 +2904,15 @@ mskc_shutdown(device_t dev)
sc = device_get_softc(dev);
MSK_LOCK(sc);
for (i = 0; i < sc->msk_num_port; i++) {
- if (sc->msk_if[i] != NULL)
+ if (sc->msk_if[i] != NULL && sc->msk_if[i]->msk_ifp != NULL &&
+ ((sc->msk_if[i]->msk_ifp->if_drv_flags &
+ IFF_DRV_RUNNING) != 0))
msk_stop(sc->msk_if[i]);
}
-
- /* Disable all interrupts. */
- CSR_WRITE_4(sc, B0_IMSK, 0);
- CSR_READ_4(sc, B0_IMSK);
- CSR_WRITE_4(sc, B0_HWE_IMSK, 0);
- CSR_READ_4(sc, B0_HWE_IMSK);
+ MSK_UNLOCK(sc);
/* Put hardware reset. */
CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
-
- MSK_UNLOCK(sc);
return (0);
}
@@ -3525,6 +3520,8 @@ msk_handle_events(struct msk_softc *sc)
sc_if->msk_csum = status;
break;
case OP_RXSTAT:
+ if (!(sc_if->msk_ifp->if_drv_flags & IFF_DRV_RUNNING))
+ break;
if (sc_if->msk_framesize >
(MCLBYTES - MSK_RX_BUF_ALIGN))
msk_jumbo_rxeof(sc_if, status, control, len);
OpenPOWER on IntegriCloud