On Sun, Dec 03, 2023 at 06:02:03PM +0100, Jan Stary wrote:
> (please keep replies on the list)
> 
> On Dec 03 12:08:08, kolip...@exoticsilicon.com wrote:
> > On Sun, Dec 03, 2023 at 02:35:11PM +0100, Jan Stary wrote:
> > > This is current/amd64 on a HP 260 G2 mini PC (dmesg below).
> > > Everything works, except the wifi seems to be unsupported:
> > > 
> > > "Realtek 8723BE" rev 0x00 at pci2 dev 0 function 0 not configured
> > 
> > What does pcidump -v show?
> 
> First of all, pcidump -v (but not pcidump) fucks up re(4):
> 
> rgephy0 detached
> re0 detached
> re0 at pci1 dev 0 function 0 "Realtek 8168" rev 0x10: RTL8168GU/8111GU 
> (0x5080), msi, address 7c:d3:0a:21:eb:f5
> rgephy0 at re0 phy 7: RTL8251 PHY, rev. 0
> re0: cannot create re-stats kstat
> rgephy0 detached
> re0 detached
> re0 at pci1 dev 0 function 0 "Realtek 8168" rev 0x10: RTL8168GU/8111GU 
> (0x5080), msi, address 7c:d3:0a:21:eb:f5
> rgephy0 at re0 phy 7: RTL8251 PHY, rev. 0
> re0: cannot create re-stats kstat
> 
> Is anyone seeing that, i.e. devices detaching
> when they are being probed by pcidump?
> 
> After doing the pcidump -v localy and rebooting to upload, I get this.
> Note that the Realtek 8168 entry seems mangled (related to the above?).

pcidump causing a device to detach is a problem, but the kstat bit is a
separate problem too.

the diff below consolidates the detach code in re(4) and adds the code
to tear the kstat down when the device goes away.

Index: ic/re.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/re.c,v
retrieving revision 1.216
diff -u -p -r1.216 re.c
--- ic/re.c     10 Nov 2023 15:51:20 -0000      1.216
+++ ic/re.c     4 Dec 2023 01:03:30 -0000
@@ -199,6 +199,7 @@ int re_wol(struct ifnet*, int);
 #endif
 #if NKSTAT > 0
 void   re_kstat_attach(struct rl_softc *);
+void   re_kstat_detach(struct rl_softc *);
 #endif
 
 void   in_delayed_cksum(struct mbuf *);
@@ -1128,6 +1129,27 @@ fail_0:
        return (1);
 }
 
+void
+re_detach(struct rl_softc *sc)
+{
+       struct ifnet    *ifp = &sc->sc_arpcom.ac_if;
+
+#if NKSTAT > 0
+       re_kstat_detach(sc);
+#endif
+
+       /* Remove timeout handler */
+       timeout_del(&sc->timer_handle);
+
+       /* Detach PHY */
+       if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL)
+               mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
+
+       /* Delete media stuff */
+       ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
+       ether_ifdetach(ifp);
+       if_detach(ifp);
+}
 
 int
 re_newbuf(struct rl_softc *sc)
@@ -2608,6 +2630,27 @@ freedma:
 destroy:
        bus_dmamap_destroy(sc->sc_dmat, re_ks_sc->re_ks_sc_map);
 free:
+       free(re_ks_sc, M_DEVBUF, sizeof(*re_ks_sc));
+}
+
+void
+re_kstat_detach(struct rl_softc *sc)
+{
+       struct kstat *ks = sc->rl_kstat;
+       struct re_kstat_softc *re_ks_sc;
+
+       if (ks == NULL)
+               return;
+
+       kstat_remove(ks);
+       re_ks_sc = ks->ks_ptr;
+       kstat_destroy(ks);
+
+       bus_dmamap_unload(sc->sc_dmat, re_ks_sc->re_ks_sc_map);
+       bus_dmamem_unmap(sc->sc_dmat,
+           (caddr_t)re_ks_sc->re_ks_sc_stats, sizeof(struct re_stats));
+       bus_dmamem_free(sc->sc_dmat, &re_ks_sc->re_ks_sc_seg, 1);
+       bus_dmamap_destroy(sc->sc_dmat, re_ks_sc->re_ks_sc_map);
        free(re_ks_sc, M_DEVBUF, sizeof(*re_ks_sc));
 }
 #endif /* NKSTAT > 0 */
Index: ic/revar.h
===================================================================
RCS file: /cvs/src/sys/dev/ic/revar.h,v
retrieving revision 1.7
diff -u -p -r1.7 revar.h
--- ic/revar.h  27 Jul 2010 20:53:39 -0000      1.7
+++ ic/revar.h  4 Dec 2023 01:03:30 -0000
@@ -18,6 +18,7 @@
 
 int    re_intr(void *);
 int    re_attach(struct rl_softc *, const char *);
+void   re_detach(struct rl_softc *);
 void   re_reset(struct rl_softc *);
 int    re_init(struct ifnet *);
 void   re_stop(struct ifnet *);
Index: pci/if_re_pci.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_re_pci.c,v
retrieving revision 1.56
diff -u -p -r1.56 if_re_pci.c
--- pci/if_re_pci.c     11 Mar 2022 18:00:48 -0000      1.56
+++ pci/if_re_pci.c     4 Dec 2023 01:03:30 -0000
@@ -223,19 +223,8 @@ re_pci_detach(struct device *self, int f
 {
        struct re_pci_softc     *psc = (struct re_pci_softc *)self;
        struct rl_softc         *sc = &psc->sc_rl;
-       struct ifnet            *ifp = &sc->sc_arpcom.ac_if;
 
-       /* Remove timeout handler */
-       timeout_del(&sc->timer_handle);
-
-       /* Detach PHY */
-       if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL)
-               mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
-
-       /* Delete media stuff */
-       ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
-       ether_ifdetach(ifp);
-       if_detach(ifp);
+       re_detach(sc);
 
        /* Disable interrupts */
        if (sc->sc_ih != NULL)
Index: cardbus/if_re_cardbus.c
===================================================================
RCS file: /cvs/src/sys/dev/cardbus/if_re_cardbus.c,v
retrieving revision 1.30
diff -u -p -r1.30 if_re_cardbus.c
--- cardbus/if_re_cardbus.c     6 Apr 2022 18:59:28 -0000       1.30
+++ cardbus/if_re_cardbus.c     4 Dec 2023 01:03:30 -0000
@@ -232,19 +232,8 @@ re_cardbus_detach(struct device *self, i
        struct re_cardbus_softc *csc = (void *)self;
        struct rl_softc *sc = &csc->sc_rl;
        struct cardbus_devfunc *ct = csc->ct;
-       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
 
-       /* Remove timeout handler */
-       timeout_del(&sc->timer_handle);
-
-       /* Detach PHY */
-       if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL)
-               mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
-
-       /* Delete media stuff */
-       ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
-       ether_ifdetach(ifp);
-       if_detach(ifp);
+       re_detach(sc);
 
        /* Disable interrupts */
        if (sc->sc_ih != NULL)

Reply via email to