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

Reply via email to