aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid C Somayajulu <davidcs@FreeBSD.org>2018-08-09 00:56:40 +0000
committerDavid C Somayajulu <davidcs@FreeBSD.org>2018-08-09 00:56:40 +0000
commit4b509df4b3ec429ad943bf5a0edb60a51786777e (patch)
treece8a095a5180a72a8b745e7dfea8ab84b092c8d7
parentcf0b39f6047fcd4cb2f357a91253fb771a1b7df7 (diff)
downloadsrc-4b509df4b3ec429ad943bf5a0edb60a51786777e.tar.gz
src-4b509df4b3ec429ad943bf5a0edb60a51786777e.zip
MFC r336438
Fixes for the following issues: 1. Fix taskqueues drain/free to fix panic seen when interface is being bought down and in parallel asynchronous link events happening. 2. Fix bxe_ifmedia_status() Submitted by:Vaishali.Kulkarni@cavium.com and Anand.Khoje@cavium.com
Notes
Notes: svn path=/stable/8/; revision=337513
-rw-r--r--sys/dev/bxe/bxe.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/sys/dev/bxe/bxe.c b/sys/dev/bxe/bxe.c
index 50529c4bcec9..d117dc427bed 100644
--- a/sys/dev/bxe/bxe.c
+++ b/sys/dev/bxe/bxe.c
@@ -4396,6 +4396,8 @@ bxe_nic_unload(struct bxe_softc *sc,
BLOGD(sc, DBG_LOAD, "Ended NIC unload\n");
+ bxe_link_report(sc);
+
return (0);
}
@@ -4441,30 +4443,39 @@ bxe_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
{
struct bxe_softc *sc = ifp->if_softc;
+ /* Bug 165447: the 'ifconfig' tool skips printing of the "status: ..."
+ line if the IFM_AVALID flag is *NOT* set. So we need to set this
+ flag unconditionally (irrespective of the admininistrative
+ 'up/down' state of the interface) to ensure that that line is always
+ displayed.
+ */
+ ifmr->ifm_status = IFM_AVALID;
+
+ /* Setup the default interface info. */
+ ifmr->ifm_active = IFM_ETHER;
+
/* Report link down if the driver isn't running. */
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
ifmr->ifm_active |= IFM_NONE;
+ BLOGD(sc, DBG_PHY, "in %s : nic still not loaded fully\n", __func__);
+ BLOGD(sc, DBG_PHY, "in %s : link_up (1) : %d\n",
+ __func__, sc->link_vars.link_up);
return;
}
- /* Setup the default interface info. */
- ifmr->ifm_status = IFM_AVALID;
- ifmr->ifm_active = IFM_ETHER;
if (sc->link_vars.link_up) {
ifmr->ifm_status |= IFM_ACTIVE;
+ ifmr->ifm_active |= IFM_FDX;
} else {
ifmr->ifm_active |= IFM_NONE;
+ BLOGD(sc, DBG_PHY, "in %s : setting IFM_NONE\n",
+ __func__);
return;
}
ifmr->ifm_active |= sc->media;
-
- if (sc->link_vars.duplex == DUPLEX_FULL) {
- ifmr->ifm_active |= IFM_FDX;
- } else {
- ifmr->ifm_active |= IFM_HDX;
- }
+ return;
}
static void
@@ -7018,7 +7029,7 @@ bxe_link_attn(struct bxe_softc *sc)
/* Make sure that we are synced with the current statistics */
bxe_stats_handle(sc, STATS_EVENT_STOP);
- BLOGI(sc, "link_vars phy_flags : %x\n", sc->link_vars.phy_flags);
+ BLOGD(sc, DBG_LOAD, "link_vars phy_flags : %x\n", sc->link_vars.phy_flags);
elink_link_update(&sc->link_params, &sc->link_vars);
if (sc->link_vars.link_up) {
@@ -9097,11 +9108,16 @@ bxe_interrupt_detach(struct bxe_softc *sc)
fp = &sc->fp[i];
if (fp->tq) {
taskqueue_drain(fp->tq, &fp->tq_task);
- taskqueue_free(fp->tq);
- fp->tq = NULL;
}
- }
+ for (i = 0; i < sc->num_queues; i++) {
+ fp = &sc->fp[i];
+ if (fp->tq != NULL) {
+ taskqueue_free(fp->tq);
+ fp->tq = NULL;
+ }
+ }
+ }
if (sc->sp_tq) {
taskqueue_drain(sc->sp_tq, &sc->sp_tq_task);