hi,
bge(4) is the last driver in the tree that is willing to call
if_link_state_change whenever, while others do so only when
the link state does change.
there should be no real change in functionality. ok?
diff --git sys/dev/pci/if_bge.c sys/dev/pci/if_bge.c
index 5cd56e2..233ccab 100644
--- sys/dev/pci/if_bge.c
+++ sys/dev/pci/if_bge.c
@@ -4512,22 +4512,27 @@ bge_link_upd(struct bge_softc *sc)
if (BGE_ASICREV(sc->bge_chipid) ==
BGE_ASICREV_BCM5704)
BGE_CLRBIT(sc, BGE_MAC_MODE,
BGE_MACMODE_TBI_SEND_CFGS);
CSR_WRITE_4(sc, BGE_MAC_STS, 0xFFFFFFFF);
status = CSR_READ_4(sc, BGE_MAC_MODE);
- ifp->if_link_state =
- (status & BGE_MACMODE_HALF_DUPLEX) ?
+ link = (status & BGE_MACMODE_HALF_DUPLEX) ?
LINK_STATE_HALF_DUPLEX :
LINK_STATE_FULL_DUPLEX;
- if_link_state_change(ifp);
ifp->if_baudrate = IF_Gbps(1);
+ if (ifp->if_link_state != link) {
+ ifp->if_link_state = link;
+ if_link_state_change(ifp);
+ }
}
} else if (BGE_STS_BIT(sc, BGE_STS_LINK)) {
BGE_STS_CLRBIT(sc, BGE_STS_LINK);
- ifp->if_link_state = LINK_STATE_DOWN;
- if_link_state_change(ifp);
+ link = LINK_STATE_DOWN;
ifp->if_baudrate = 0;
+ if (ifp->if_link_state != link) {
+ ifp->if_link_state = link;
+ if_link_state_change(ifp);
+ }
}
} else if (BGE_STS_BIT(sc, BGE_STS_AUTOPOLL)) {
/*
* Some broken BCM chips have BGE_STATFLAG_LINKSTATE_CHANGED bit
* in status word always set. Workaround this bug by reading