Module Name: src
Committed By: ryo
Date: Sat Feb 15 12:20:35 UTC 2020
Modified Files:
src/sys/dev/pci: if_aq.c
Log Message:
return the ifmedia active status correctly even while the link is not up after
attach.
pointed out by msaitoh@. thanks.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/if_aq.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_aq.c
diff -u src/sys/dev/pci/if_aq.c:1.10 src/sys/dev/pci/if_aq.c:1.11
--- src/sys/dev/pci/if_aq.c:1.10 Mon Feb 10 05:53:12 2020
+++ src/sys/dev/pci/if_aq.c Sat Feb 15 12:20:35 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_aq.c,v 1.10 2020/02/10 05:53:12 ryo Exp $ */
+/* $NetBSD: if_aq.c,v 1.11 2020/02/15 12:20:35 ryo Exp $ */
/**
* aQuantia Corporation Network Driver
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aq.c,v 1.10 2020/02/10 05:53:12 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aq.c,v 1.11 2020/02/15 12:20:35 ryo Exp $");
#ifdef _KERNEL_OPT
#include "opt_if_aq.h"
@@ -1005,8 +1005,6 @@ struct aq_softc {
bool sc_intr_moderation_enable;
bool sc_rss_enable;
- int sc_media_active;
-
struct ethercom sc_ethercom;
struct ether_addr sc_enaddr;
struct ifmedia sc_media;
@@ -2717,39 +2715,6 @@ aq_set_filter(struct aq_softc *sc)
return error;
}
-static void
-aq_mediastatus_update(struct aq_softc *sc)
-{
- sc->sc_media_active = 0;
-
- if (sc->sc_link_fc & AQ_FC_RX)
- sc->sc_media_active |= IFM_ETH_RXPAUSE;
- if (sc->sc_link_fc & AQ_FC_TX)
- sc->sc_media_active |= IFM_ETH_TXPAUSE;
-
- switch (sc->sc_link_rate) {
- case AQ_LINK_100M:
- /* XXX: need to detect fulldup or halfdup */
- sc->sc_media_active |= IFM_100_TX | IFM_FDX;
- break;
- case AQ_LINK_1G:
- sc->sc_media_active |= IFM_1000_T | IFM_FDX;
- break;
- case AQ_LINK_2G5:
- sc->sc_media_active |= IFM_2500_T | IFM_FDX;
- break;
- case AQ_LINK_5G:
- sc->sc_media_active |= IFM_5000_T | IFM_FDX;
- break;
- case AQ_LINK_10G:
- sc->sc_media_active |= IFM_10G_T | IFM_FDX;
- break;
- default:
- sc->sc_media_active |= IFM_NONE;
- break;
- }
-}
-
static int
aq_ifmedia_change(struct ifnet * const ifp)
{
@@ -2805,13 +2770,39 @@ aq_ifmedia_status(struct ifnet * const i
{
struct aq_softc *sc = ifp->if_softc;
+ /* update ifm_active */
ifmr->ifm_active = IFM_ETHER;
- ifmr->ifm_status = IFM_AVALID;
+ if (sc->sc_link_fc & AQ_FC_RX)
+ ifmr->ifm_active |= IFM_ETH_RXPAUSE;
+ if (sc->sc_link_fc & AQ_FC_TX)
+ ifmr->ifm_active |= IFM_ETH_TXPAUSE;
+ switch (sc->sc_link_rate) {
+ case AQ_LINK_100M:
+ /* XXX: need to detect fulldup or halfdup */
+ ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
+ break;
+ case AQ_LINK_1G:
+ ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
+ break;
+ case AQ_LINK_2G5:
+ ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
+ break;
+ case AQ_LINK_5G:
+ ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
+ break;
+ case AQ_LINK_10G:
+ ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
+ break;
+ default:
+ ifmr->ifm_active |= IFM_NONE;
+ break;
+ }
+
+ /* update ifm_status */
+ ifmr->ifm_status = IFM_AVALID;
if (sc->sc_link_rate != AQ_LINK_NONE)
ifmr->ifm_status |= IFM_ACTIVE;
-
- ifmr->ifm_active |= sc->sc_media_active;
}
static void
@@ -3385,8 +3376,6 @@ aq_update_link_status(struct aq_softc *s
sc->sc_link_fc = fc;
sc->sc_link_eee = eee;
- aq_mediastatus_update(sc);
-
/* update interrupt timing according to new link speed */
aq_hw_interrupt_moderation_set(sc);
}