Download raw body.
ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling
ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling
ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling
On Thu, Jan 08, 2026 at 12:17:57PM -0500, George Koehler wrote:
> On Tue, 6 Jan 2026 04:20:05 +0300
> Vitaliy Makkoveev <mvs@openbsd.org> wrote:
>
> > This diff is mostly automatic replacement with some manual modifications.
> > I performed build test with i386, amd64 and arm64, but I need help with
> > other architectures like armv7, macppc and sparc64.
>
> Hi. Your diff compiles on macppc, and the rum(4) and gem(4) on my
> PowerBook G4 still work. I have not been using my bwi(4). About the
> drivers in arch/macppc, I have neither bm(4) nor mc(4) anywhere; I
> have not yet tried the wi(4) in my Cube G4.
> --gkoehler
>
> bwi0 at pci1 dev 18 function 0 "Broadcom BCM4306" rev 0x03: irq 52, address 00:0d:93:ef:83:58
> gem0 at pci2 dev 15 function 0 "Apple Uni-N2 GMAC" rev 0x80: irq 41, address 00:0d:93:b4:cc:d4
> eephy0 at gem0 phy 0: 88E1111, rev. 1
> rum0 at uhub4 port 4 configuration 1 interface 0 "Belkin Belkin 54g USB Network Adapter" rev 2.00/0.01 addr 7
> rum0: MAC/BBP RT2573 (rev 0x2573a), RF RT2528, address 00:17:3f:85:5f:81
>
Thanks!
> > Index: sys/arch/armv7/omap/if_cpsw.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/armv7/omap/if_cpsw.c,v
> > retrieving revision 1.53
> > diff -u -p -r1.53 if_cpsw.c
> > --- sys/arch/armv7/omap/if_cpsw.c 10 Nov 2023 15:51:19 -0000 1.53
> > +++ sys/arch/armv7/omap/if_cpsw.c 6 Jan 2026 00:38:40 -0000
> > @@ -609,7 +609,7 @@ cpsw_start(struct ifnet *ifp)
> > }
> >
> > if (txstart >= 0) {
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > /* terminate the new chain */
> > KASSERT(eopi == TXDESC_PREV(sc->sc_txnext));
> > cpsw_set_txdesc_next(sc, TXDESC_PREV(sc->sc_txnext), 0);
> > @@ -1006,7 +1006,7 @@ cpsw_stop(struct ifnet *ifp)
> > }
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > /* XXX Not sure what this is doing calling disable here
> > @@ -1226,7 +1226,7 @@ next:
> > }
> >
> > if (handled && sc->sc_txnext == sc->sc_txhead)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (handled)
> > cpsw_start(ifp);
> > Index: sys/arch/armv7/sunxi/sxie.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/armv7/sunxi/sxie.c,v
> > retrieving revision 1.34
> > diff -u -p -r1.34 sxie.c
> > --- sys/arch/armv7/sunxi/sxie.c 10 Nov 2023 15:51:19 -0000 1.34
> > +++ sys/arch/armv7/sunxi/sxie.c 6 Jan 2026 00:38:40 -0000
> > @@ -451,9 +451,9 @@ sxie_intr(void *arg)
> > if (pending & (SXIE_TX_FIFO0 | SXIE_TX_FIFO1)) {
> > sc->txf_inuse &= ~pending;
> > if (sc->txf_inuse == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > else
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > @@ -526,7 +526,7 @@ sxie_start(struct ifnet *ifp)
> >
> > /* transmit to PHY from fifo */
> > SXISET4(sc, SXIE_TXCR0 + (fifo * 4), 1);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > m_freem(m);
> > }
> > @@ -540,7 +540,7 @@ sxie_stop(struct sxie_softc *sc)
> > sxie_reset(sc);
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> > }
> >
> > @@ -559,7 +559,7 @@ sxie_watchdog(struct ifnet *ifp)
> > {
> > struct sxie_softc *sc = ifp->if_softc;
> > if (sc->pauseframe) {
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > return;
> > }
> > printf("%s: watchdog tx timeout\n", sc->sc_dev.dv_xname);
> > Index: sys/arch/macppc/dev/if_bm.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/macppc/dev/if_bm.c,v
> > retrieving revision 1.44
> > diff -u -p -r1.44 if_bm.c
> > --- sys/arch/macppc/dev/if_bm.c 13 Mar 2022 12:33:01 -0000 1.44
> > +++ sys/arch/macppc/dev/if_bm.c 6 Jan 2026 00:38:42 -0000
> > @@ -421,7 +421,7 @@ bmac_init(struct bmac_softc *sc)
> >
> > ifp->if_flags |= IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > data = sc->sc_txbuf;
> > eh = (struct ether_header *)data;
> > @@ -483,7 +483,7 @@ bmac_intr(void *v)
> >
> > if (stat & IntFrameSent) {
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > bmac_start(ifp);
> > }
> >
> > @@ -596,7 +596,7 @@ bmac_stop(struct bmac_softc *sc)
> > dbdma_stop(sc->sc_rxdma);
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > splx(s);
> > }
> > @@ -631,7 +631,7 @@ bmac_start(struct ifnet *ifp)
> > tlen = bmac_put(sc, sc->sc_txbuf, m);
> >
> > /* 5 seconds to watch for failing to transmit */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > bmac_transmit_packet(sc, sc->sc_txbuf_pa, tlen);
> > }
> > Index: sys/arch/macppc/dev/if_mc.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/macppc/dev/if_mc.c,v
> > retrieving revision 1.35
> > diff -u -p -r1.35 if_mc.c
> > --- sys/arch/macppc/dev/if_mc.c 6 Sep 2024 10:54:08 -0000 1.35
> > +++ sys/arch/macppc/dev/if_mc.c 6 Jan 2026 00:38:42 -0000
> > @@ -456,7 +456,7 @@ mc_attach(struct device *parent, struct
> > ifp->if_flags =
> > IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
> > ifp->if_watchdog = mc_watchdog;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if_attach(ifp);
> > ether_ifattach(ifp);
> > @@ -663,7 +663,7 @@ mc_stop(struct mc_softc *sc)
> > NIC_PUT(sc, MACE_BIUCC, SWRST);
> > DELAY(100);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -772,7 +772,7 @@ mc_tint(struct mc_softc *sc)
> > }
> >
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > mc_start(ifp);
> > }
> >
> > @@ -857,7 +857,7 @@ maceput(struct mc_softc *sc, struct mbuf
> >
> >
> > /* 5 seconds to watch for failing to transmit */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > mc_putpacket(sc, totlen);
> > return (totlen);
> > }
> > Index: sys/arch/macppc/dev/if_wi_obio.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/macppc/dev/if_wi_obio.c,v
> > retrieving revision 1.22
> > diff -u -p -r1.22 if_wi_obio.c
> > --- sys/arch/macppc/dev/if_wi_obio.c 28 Aug 2024 03:54:54 -0000 1.22
> > +++ sys/arch/macppc/dev/if_wi_obio.c 6 Jan 2026 00:38:42 -0000
> > @@ -158,7 +158,7 @@ wi_obio_activate(struct device *dev, int
> >
> > switch (act) {
> > case DVACT_DEACTIVATE:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING)
> > wi_stop(sc);
> > wi_obio_disable(sc);
> > Index: sys/arch/octeon/dev/if_cnmac.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/octeon/dev/if_cnmac.c,v
> > retrieving revision 1.86
> > diff -u -p -r1.86 if_cnmac.c
> > --- sys/arch/octeon/dev/if_cnmac.c 20 May 2024 23:13:33 -0000 1.86
> > +++ sys/arch/octeon/dev/if_cnmac.c 6 Jan 2026 00:38:42 -0000
> > @@ -972,7 +972,7 @@ cnmac_watchdog(struct ifnet *ifp)
> > cnmac_configure(sc);
> >
> > SET(ifp->if_flags, IFF_RUNNING);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > ifq_restart(&ifp->if_snd);
> > }
> > @@ -1030,7 +1030,7 @@ cnmac_stop(struct ifnet *ifp, int disabl
> > ifq_barrier(&ifp->if_snd);
> >
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return 0;
> > }
> > Index: sys/arch/sparc64/dev/vnet.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/sparc64/dev/vnet.c,v
> > retrieving revision 1.67
> > diff -u -p -r1.67 vnet.c
> > --- sys/arch/sparc64/dev/vnet.c 9 Mar 2023 10:29:04 -0000 1.67
> > +++ sys/arch/sparc64/dev/vnet.c 6 Jan 2026 00:38:43 -0000
> > @@ -909,7 +909,7 @@ vnet_rx_vio_dring_data(struct vnet_softc
> > if (count < (sc->sc_vd->vd_nentries - 1))
> > ifq_clr_oactive(&ifp->if_snd);
> > if (count == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > vnet_start(ifp);
> > KERNEL_UNLOCK();
> > @@ -1191,7 +1191,7 @@ vnet_start(struct ifnet *ifp)
> > sc->sc_vd->vd_desc[start].hdr.dstate = VIO_DESC_READY;
> > if (sc->sc_peer_state != VIO_DP_ACTIVE) {
> > vnet_send_dring_data(sc, start);
> > - ifp->if_timer = 10;
> > + if_watchdog_schedule(ifp, 10);
> > }
> > }
> > }
> > @@ -1464,7 +1464,7 @@ vnet_stop(struct ifnet *ifp)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > cbus_intr_setenabled(sc->sc_bustag, sc->sc_tx_ino, INTR_DISABLED);
> > cbus_intr_setenabled(sc->sc_bustag, sc->sc_rx_ino, INTR_DISABLED);
> > Index: sys/dev/fdt/if_cad.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/fdt/if_cad.c,v
> > retrieving revision 1.16
> > diff -u -p -r1.16 if_cad.c
> > --- sys/dev/fdt/if_cad.c 17 Sep 2025 09:17:12 -0000 1.16
> > +++ sys/dev/fdt/if_cad.c 6 Jan 2026 00:38:44 -0000
> > @@ -983,7 +983,7 @@ cad_down(struct cad_softc *sc)
> > ifp->if_flags &= ~IFF_RUNNING;
> >
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Avoid lock order issues with barriers. */
> > NET_UNLOCK();
> > @@ -1161,7 +1161,7 @@ cad_start(struct ifqueue *ifq)
> > bpf_mtap_ether(ifp->if_bpf, m, BPF_DIRECTION_OUT);
> > #endif
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > KASSERT(free >= used);
> > free -= used;
> > @@ -1175,7 +1175,7 @@ cad_watchdog(struct ifnet *ifp)
> > {
> > struct cad_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if ((ifp->if_flags & IFF_RUNNING) == 0)
> > return;
> > Index: sys/dev/fdt/if_dwge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/fdt/if_dwge.c,v
> > retrieving revision 1.22
> > diff -u -p -r1.22 if_dwge.c
> > --- sys/dev/fdt/if_dwge.c 8 Feb 2024 20:50:34 -0000 1.22
> > +++ sys/dev/fdt/if_dwge.c 6 Jan 2026 00:38:44 -0000
> > @@ -768,7 +768,7 @@ dwge_start(struct ifqueue *ifq)
> > sc->sc_tx_prod = idx;
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > dwge_write(sc, GMAC_TX_POLL_DEMAND, 0xffffffff);
> > }
> > @@ -1057,7 +1057,7 @@ dwge_tx_proc(struct dwge_softc *sc)
> > }
> >
> > if (sc->sc_tx_cons == sc->sc_tx_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (txfree) {
> > if (ifq_is_oactive(&ifp->if_snd))
> > @@ -1251,7 +1251,7 @@ dwge_down(struct dwge_softc *sc)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > dwge_stop_dma(sc);
> >
> > Index: sys/dev/fdt/if_dwxe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/fdt/if_dwxe.c,v
> > retrieving revision 1.24
> > diff -u -p -r1.24 if_dwxe.c
> > --- sys/dev/fdt/if_dwxe.c 27 Feb 2024 10:47:20 -0000 1.24
> > +++ sys/dev/fdt/if_dwxe.c 6 Jan 2026 00:38:44 -0000
> > @@ -680,7 +680,7 @@ dwxe_start(struct ifqueue *ifq)
> > sc->sc_tx_prod = idx;
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > dwxe_write(sc, DWXE_TX_CTL1, dwxe_read(sc,
> > DWXE_TX_CTL1) | DWXE_TX_CTL1_TX_DMA_START);
> > @@ -958,7 +958,7 @@ dwxe_tx_proc(struct dwxe_softc *sc)
> > }
> >
> > if (sc->sc_tx_cons == sc->sc_tx_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (txfree) {
> > if (ifq_is_oactive(&ifp->if_snd))
> > @@ -1136,7 +1136,7 @@ dwxe_down(struct dwxe_softc *sc)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > dwxe_stop_dma(sc);
> >
> > Index: sys/dev/fdt/if_fec.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/fdt/if_fec.c,v
> > retrieving revision 1.14
> > diff -u -p -r1.14 if_fec.c
> > --- sys/dev/fdt/if_fec.c 9 Jan 2022 05:42:37 -0000 1.14
> > +++ sys/dev/fdt/if_fec.c 6 Jan 2026 00:38:44 -0000
> > @@ -738,7 +738,7 @@ fec_stop(struct fec_softc *sc)
> > * Mark the interface down and cancel the watchdog timer.
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > timeout_del(&sc->sc_tick);
> > @@ -901,7 +901,7 @@ fec_start(struct ifnet *ifp)
> > sc->sc_tx_prod = idx;
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -1076,7 +1076,7 @@ fec_tx_proc(struct fec_softc *sc)
> > }
> >
> > if (sc->sc_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > else /* ERR006358 */
> > HWRITE4(sc, ENET_TDAR, ENET_TDAR_TDAR);
> > }
> > Index: sys/dev/ic/acx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/acx.c,v
> > retrieving revision 1.128
> > diff -u -p -r1.128 acx.c
> > --- sys/dev/ic/acx.c 10 Nov 2023 15:51:20 -0000 1.128
> > +++ sys/dev/ic/acx.c 6 Jan 2026 00:38:44 -0000
> > @@ -608,7 +608,7 @@ acx_stop(struct acx_softc *sc)
> > bzero(rd->rx_ring, ACX_RX_RING_SIZE);
> >
> > sc->sc_txtimer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1);
> > @@ -1059,7 +1059,7 @@ encapped:
> >
> > if (trans && sc->sc_txtimer == 0)
> > sc->sc_txtimer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > void
> > @@ -1067,7 +1067,7 @@ acx_watchdog(struct ifnet *ifp)
> > {
> > struct acx_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if ((ifp->if_flags & IFF_RUNNING) == 0)
> > return;
> > @@ -1079,7 +1079,7 @@ acx_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > } else
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > Index: sys/dev/ic/aic6915.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/aic6915.c,v
> > retrieving revision 1.25
> > diff -u -p -r1.25 aic6915.c
> > --- sys/dev/ic/aic6915.c 10 Nov 2023 15:51:20 -0000 1.25
> > +++ sys/dev/ic/aic6915.c 6 Jan 2026 00:38:45 -0000
> > @@ -478,7 +478,7 @@ sf_start(struct ifnet *ifp)
> > TDQPI_HiPrTxProducerIndex(SF_TXDINDEX_TO_CHIP(producer)));
> >
> > /* Set a watchdog timer in case the chip flakes out. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -692,7 +692,7 @@ sf_txintr(struct sf_softc *sc)
> >
> > /* If all packets are done, cancel the watchdog timer. */
> > if (sc->sc_txpending == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Update the consumer index. */
> > sf_funcreg_write(sc, SF_CompletionQueueConsumerIndex,
> > @@ -1109,7 +1109,7 @@ sf_init(struct ifnet *ifp)
> > if (error) {
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > printf("%s: interface not running\n", sc->sc_dev.dv_xname);
> > }
> > return (error);
> > @@ -1181,7 +1181,7 @@ sf_stop(struct ifnet *ifp, int disable)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > Index: sys/dev/ic/am7990.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/am7990.c,v
> > retrieving revision 1.54
> > diff -u -p -r1.54 am7990.c
> > --- sys/dev/ic/am7990.c 10 Jul 2020 13:22:19 -0000 1.54
> > +++ sys/dev/ic/am7990.c 6 Jan 2026 00:38:45 -0000
> > @@ -368,7 +368,7 @@ am7990_tint(struct lance_softc *sc)
> > am7990_start(ifp);
> >
> > if (sc->sc_no_td == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -506,7 +506,7 @@ am7990_start(struct ifnet *ifp)
> > printf("packet length %d\n", len);
> > #endif
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > /*
> > * Init transmit registers, and set transmit start flag.
> > Index: sys/dev/ic/am79900.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/am79900.c,v
> > retrieving revision 1.8
> > diff -u -p -r1.8 am79900.c
> > --- sys/dev/ic/am79900.c 10 Jul 2020 13:22:19 -0000 1.8
> > +++ sys/dev/ic/am79900.c 6 Jan 2026 00:38:45 -0000
> > @@ -395,7 +395,7 @@ am79900_tint(struct lance_softc *sc)
> > am79900_start(ifp);
> >
> > if (sc->sc_no_td == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -529,7 +529,7 @@ am79900_start(struct ifnet *ifp)
> > printf("packet length %d\n", len);
> > #endif
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > /*
> > * Init transmit registers, and set transmit start flag.
> > Index: sys/dev/ic/an.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/an.c,v
> > retrieving revision 1.80
> > diff -u -p -r1.80 an.c
> > --- sys/dev/ic/an.c 13 Apr 2024 23:44:11 -0000 1.80
> > +++ sys/dev/ic/an.c 6 Jan 2026 00:38:45 -0000
> > @@ -1210,7 +1210,7 @@ an_start(struct ifnet *ifp)
> > continue;
> > }
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > AN_INC(cur, AN_TX_RING_CNT);
> > sc->sc_txnext = cur;
> > }
> > @@ -1239,7 +1239,7 @@ an_stop(struct ifnet *ifp, int disable)
> > }
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -1266,7 +1266,7 @@ an_watchdog(struct ifnet *ifp)
> > an_init(ifp);
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > ieee80211_watchdog(ifp);
> > }
> > Index: sys/dev/ic/ath.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/ath.c,v
> > retrieving revision 1.126
> > diff -u -p -r1.126 ath.c
> > --- sys/dev/ic/ath.c 1 Aug 2025 20:39:26 -0000 1.126
> > +++ sys/dev/ic/ath.c 6 Jan 2026 00:38:45 -0000
> > @@ -716,7 +716,7 @@ ath_stop(struct ifnet *ifp)
> > * hardware is gone (invalid).
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (!sc->sc_invalid)
> > ath_hal_set_intr(ah, 0);
> > ath_draintxq(sc);
> > @@ -890,7 +890,7 @@ ath_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -914,7 +914,7 @@ ath_watchdog(struct ifnet *ifp)
> > {
> > struct ath_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if ((ifp->if_flags & IFF_RUNNING) == 0 || sc->sc_invalid)
> > return;
> > if (sc->sc_tx_timer) {
> > @@ -925,7 +925,7 @@ ath_watchdog(struct ifnet *ifp)
> > sc->sc_stats.ast_watchdog++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > Index: sys/dev/ic/athn.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/athn.c,v
> > retrieving revision 1.111
> > diff -u -p -r1.111 athn.c
> > --- sys/dev/ic/athn.c 15 Apr 2021 18:25:43 -0000 1.111
> > +++ sys/dev/ic/athn.c 6 Jan 2026 00:38:45 -0000
> > @@ -2861,7 +2861,7 @@ athn_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -2870,7 +2870,7 @@ athn_watchdog(struct ifnet *ifp)
> > {
> > struct athn_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -2880,7 +2880,7 @@ athn_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -3095,7 +3095,8 @@ athn_stop(struct ifnet *ifp, int disable
> > struct ieee80211com *ic = &sc->sc_ic;
> > int qid, i;
> >
> > - ifp->if_timer = sc->sc_tx_timer = 0;
> > + sc->sc_tx_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/atw.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/atw.c,v
> > retrieving revision 1.102
> > diff -u -p -r1.102 atw.c
> > --- sys/dev/ic/atw.c 6 Oct 2024 01:12:15 -0000 1.102
> > +++ sys/dev/ic/atw.c 6 Jan 2026 00:38:45 -0000
> > @@ -1439,7 +1439,7 @@ atw_init(struct ifnet *ifp)
> > if (error) {
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > printf("%s: interface not running\n", sc->sc_dev.dv_xname);
> > }
> > #ifdef ATW_DEBUG
> > @@ -2640,7 +2640,7 @@ atw_stop(struct ifnet *ifp, int disable)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Disable interrupts. */
> > ATW_WRITE(sc, ATW_IER, 0);
> > @@ -3000,7 +3000,7 @@ atw_linkintr(struct atw_softc *sc, u_int
> > if (ic->ic_opmode != IEEE80211_M_STA)
> > return;
> > sc->sc_rescan_timer = 3;
> > - ic->ic_if.if_timer = 1;
> > + if_watchdog_schedule(&ic->ic_if, 1);
> > }
> > }
> >
> > @@ -3312,7 +3312,7 @@ atw_watchdog(struct ifnet *ifp)
> > struct ieee80211com *ic = &sc->sc_ic;
> > uint32_t test1, rra, rwa;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ATW_IS_ENABLED(sc) == 0)
> > return;
> >
> > @@ -3330,7 +3330,7 @@ atw_watchdog(struct ifnet *ifp)
> > }
> > }
> > if (sc->sc_tx_timer != 0 || sc->sc_rescan_timer != 0)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> >
> > /*
> > * ADM8211B seems to stall every so often, check for this.
> > @@ -3954,7 +3954,7 @@ atw_start(struct ifnet *ifp)
> >
> > /* Set a watchdog timer in case the chip flakes out. */
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > Index: sys/dev/ic/bwfm.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/bwfm.c,v
> > retrieving revision 1.113
> > diff -u -p -r1.113 bwfm.c
> > --- sys/dev/ic/bwfm.c 21 Aug 2025 17:03:58 -0000 1.113
> > +++ sys/dev/ic/bwfm.c 6 Jan 2026 00:38:45 -0000
> > @@ -584,7 +584,7 @@ bwfm_stop(struct ifnet *ifp)
> > struct bwfm_join_params join;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -645,7 +645,7 @@ bwfm_watchdog(struct ifnet *ifp)
> > {
> > struct bwfm_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -653,7 +653,7 @@ bwfm_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > ieee80211_watchdog(ifp);
> > }
> > Index: sys/dev/ic/bwi.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/bwi.c,v
> > retrieving revision 1.135
> > diff -u -p -r1.135 bwi.c
> > --- sys/dev/ic/bwi.c 13 Apr 2024 23:44:11 -0000 1.135
> > +++ sys/dev/ic/bwi.c 6 Jan 2026 00:38:45 -0000
> > @@ -7256,7 +7256,7 @@ bwi_start(struct ifnet *ifp)
> >
> > if (trans)
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > void
> > @@ -7264,7 +7264,7 @@ bwi_watchdog(struct ifnet *ifp)
> > {
> > struct bwi_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if ((ifp->if_flags & IFF_RUNNING) == 0)
> > return;
> > @@ -7276,7 +7276,7 @@ bwi_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > /* TODO */
> > } else
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -7339,7 +7339,7 @@ bwi_stop(struct bwi_softc *sc, int state
> > bwi_bbp_power_off(sc);
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/dc.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/dc.c,v
> > retrieving revision 1.159
> > diff -u -p -r1.159 dc.c
> > --- sys/dev/ic/dc.c 5 Nov 2024 18:58:59 -0000 1.159
> > +++ sys/dev/ic/dc.c 6 Jan 2026 00:38:45 -0000
> > @@ -965,7 +965,7 @@ dc_setfilt_21143(struct dc_softc *sc)
> > */
> > DELAY(10000);
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1141,7 +1141,7 @@ dc_setfilt_xircom(struct dc_softc *sc)
> > */
> > DELAY(1000);
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -2286,7 +2286,7 @@ dc_txeof(struct dc_softc *sc)
> > if (DC_TX_LIST_CNT - sc->dc_cdata.dc_tx_cnt > 5)
> > ifq_clr_oactive(&ifp->if_snd);
> > if (sc->dc_cdata.dc_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > void
> > @@ -2656,7 +2656,7 @@ dc_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -2973,7 +2973,7 @@ dc_stop(struct dc_softc *sc, int softonl
> > int i;
> >
> > ifp = &sc->sc_arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->dc_tick_tmo);
> >
> > Index: sys/dev/ic/dp8390.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/dp8390.c,v
> > retrieving revision 1.63
> > diff -u -p -r1.63 dp8390.c
> > --- sys/dev/ic/dp8390.c 9 Jan 2022 05:42:38 -0000 1.63
> > +++ sys/dev/ic/dp8390.c 6 Jan 2026 00:38:45 -0000
> > @@ -244,7 +244,7 @@ dp8390_init(struct dp8390_softc *sc)
> > */
> >
> > /* Reset transmitter flags. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > sc->txb_inuse = 0;
> > sc->txb_new = 0;
> > @@ -407,7 +407,7 @@ dp8390_xmit(struct dp8390_softc *sc)
> > sc->txb_next_tx = 0;
> >
> > /* Set a timer just in case we never hear from the board again. */
> > - ifp->if_timer = 2;
> > + if_watchdog_schedule(ifp, 2);
> > }
> >
> > /*
> > @@ -695,7 +695,7 @@ dp8390_intr(void *arg)
> > }
> >
> > /* Clear watchdog timer. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > /*
> > Index: sys/dev/ic/dwqe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/dwqe.c,v
> > retrieving revision 1.23
> > diff -u -p -r1.23 dwqe.c
> > --- sys/dev/ic/dwqe.c 29 Dec 2025 22:53:32 -0000 1.23
> > +++ sys/dev/ic/dwqe.c 6 Jan 2026 00:38:45 -0000
> > @@ -410,7 +410,7 @@ dwqe_start(struct ifqueue *ifq)
> > sc->sc_tx_prod = idx;
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > /*
> > * Start the transmit process after the last in-use Tx
> > @@ -701,7 +701,7 @@ dwqe_tx_proc(struct dwqe_softc *sc)
> > }
> >
> > if (sc->sc_tx_cons == sc->sc_tx_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (txfree) {
> > if (ifq_is_oactive(&ifp->if_snd))
> > @@ -1031,7 +1031,7 @@ dwqe_down(struct dwqe_softc *sc)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Disable receiver */
> > reg = dwqe_read(sc, GMAC_MAC_CONF);
> > Index: sys/dev/ic/fxp.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/fxp.c,v
> > retrieving revision 1.135
> > diff -u -p -r1.135 fxp.c
> > --- sys/dev/ic/fxp.c 31 Aug 2024 16:23:09 -0000 1.135
> > +++ sys/dev/ic/fxp.c 6 Jan 2026 00:38:45 -0000
> > @@ -732,7 +732,7 @@ fxp_start(struct ifnet *ifp)
> >
> > if (cnt != sc->sc_cbt_cnt) {
> > /* We enqueued at least one. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > txs = sc->sc_cbt_prod;
> > txs = txs->tx_next;
> > @@ -827,7 +827,10 @@ fxp_intr(void *arg)
> > /* Did we transmit any packets? */
> > if (sc->sc_cbt_cons != txs)
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = sc->sc_cbt_cnt ? 5 : 0;
> > + if (sc->sc_cbt_cnt)
> > + if_watchdog_schedule(ifp, 5);
> > + else
> > + if_watchdog_disable(ifp);
> > sc->sc_cbt_cons = txs;
> >
> > if (!ifq_empty(&ifp->if_snd)) {
> > @@ -1052,7 +1055,7 @@ fxp_stop(struct fxp_softc *sc, int drain
> > * Turn down interface (done early to avoid bad interactions
> > * between panics, and the watchdog timer)
> > */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/gem.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/gem.c,v
> > retrieving revision 1.128
> > diff -u -p -r1.128 gem.c
> > --- sys/dev/ic/gem.c 10 Nov 2023 15:51:20 -0000 1.128
> > +++ sys/dev/ic/gem.c 6 Jan 2026 00:38:45 -0000
> > @@ -543,7 +543,7 @@ gem_stop(struct ifnet *ifp, int softonly
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (!softonly) {
> > mii_down(&sc->sc_mii);
> > @@ -1674,7 +1674,7 @@ gem_tint(struct gem_softc *sc, u_int32_t
> > sc->sc_tx_cons = cons;
> >
> > if (sc->sc_tx_prod == cons)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > @@ -1799,5 +1799,5 @@ gem_start(struct ifqueue *ifq)
> > bus_space_write_4(sc->sc_bustag, sc->sc_h1, GEM_TX_KICK, prod);
> >
> > /* Set timeout in case hardware has problems transmitting. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > Index: sys/dev/ic/hme.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/hme.c,v
> > retrieving revision 1.83
> > diff -u -p -r1.83 hme.c
> > --- sys/dev/ic/hme.c 12 Dec 2020 11:48:52 -0000 1.83
> > +++ sys/dev/ic/hme.c 6 Jan 2026 00:38:45 -0000
> > @@ -383,7 +383,7 @@ hme_stop(struct hme_softc *sc, int softo
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (!softonly) {
> > mii_down(&sc->sc_mii);
> > @@ -726,7 +726,7 @@ hme_start(struct ifnet *ifp)
> > HME_ETX_TP_DMAWAKEUP);
> > sc->sc_tx_prod = frag;
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > return;
> > @@ -781,7 +781,10 @@ hme_tint(struct hme_softc *sc)
> > }
> >
> > sc->sc_tx_cnt = cnt;
> > - ifp->if_timer = cnt > 0 ? 5 : 0;
> > + if (cnt > 0)
> > + if_watchdog_schedule(ifp, 5);
> > + else
> > + if_watchdog_disable(ifp);
> >
> > /* Update ring */
> > sc->sc_tx_cons = ri;
> > Index: sys/dev/ic/i82596.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/i82596.c,v
> > retrieving revision 1.56
> > diff -u -p -r1.56 i82596.c
> > --- sys/dev/ic/i82596.c 6 Apr 2025 00:37:07 -0000 1.56
> > +++ sys/dev/ic/i82596.c 6 Jan 2026 00:38:45 -0000
> > @@ -710,7 +710,7 @@ i82596_tint(struct ie_softc *sc, int scb
> > register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
> > register int off, status;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > #ifdef I82596_DEBUG
> > @@ -1168,7 +1168,7 @@ i82596_xmit(struct ie_softc *sc)
> > }
> > }
> >
> > - sc->sc_arpcom.ac_if.if_timer = 5;
> > + if_watchdog_schedule(&sc->sc_arpcom.ac_if, 5);
> > }
> >
> >
> > @@ -1323,7 +1323,7 @@ i82596_reset(struct ie_softc *sc, int ha
> > #endif
> >
> > /* Clear OACTIVE in case we're called from watchdog (frozen xmit). */
> > - sc->sc_arpcom.ac_if.if_timer = 0;
> > + if_watchdog_disable(&sc->sc_arpcom.ac_if);
> > ifq_clr_oactive(&sc->sc_arpcom.ac_if.if_snd);
> >
> > /*
> > Index: sys/dev/ic/if_wi.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/if_wi.c,v
> > retrieving revision 1.177
> > diff -u -p -r1.177 if_wi.c
> > --- sys/dev/ic/if_wi.c 14 Jul 2022 13:46:24 -0000 1.177
> > +++ sys/dev/ic/if_wi.c 6 Jan 2026 00:38:45 -0000
> > @@ -831,7 +831,7 @@ wi_txeof(struct wi_softc *sc, int status
> >
> > ifp = &sc->sc_ic.ic_if;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status & WI_EV_TX_EXC)
> > @@ -2463,7 +2463,7 @@ nextpkt:
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > if (wi_cmd(sc, WI_CMD_TX|WI_RECLAIM, id, 0, 0))
> > printf(WI_PRT_FMT ": wi_start: xmit failed\n", WI_PRT_ARG(sc));
> > @@ -2535,7 +2535,7 @@ wi_stop(struct wi_softc *sc)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return;
> > }
> > Index: sys/dev/ic/lance.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/lance.c,v
> > retrieving revision 1.13
> > diff -u -p -r1.13 lance.c
> > --- sys/dev/ic/lance.c 13 Apr 2016 10:49:26 -0000 1.13
> > +++ sys/dev/ic/lance.c 6 Jan 2026 00:38:45 -0000
> > @@ -309,7 +309,7 @@ lance_init(struct lance_softc *sc)
> > (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA | LE_C0_STRT);
> > ifp->if_flags |= IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > (*sc->sc_start)(ifp);
> > } else
> > printf("%s: controller failed to initialize\n",
> > Index: sys/dev/ic/mtd8xx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/mtd8xx.c,v
> > retrieving revision 1.36
> > diff -u -p -r1.36 mtd8xx.c
> > --- sys/dev/ic/mtd8xx.c 5 Nov 2024 18:58:59 -0000 1.36
> > +++ sys/dev/ic/mtd8xx.c 6 Jan 2026 00:38:45 -0000
> > @@ -729,7 +729,7 @@ mtd_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> >
> > @@ -739,7 +739,7 @@ mtd_stop(struct ifnet *ifp)
> > struct mtd_softc *sc = ifp->if_softc;
> > int i;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -990,7 +990,7 @@ mtd_txeof(struct mtd_softc *sc)
> > int idx;
> >
> > /* Clear the timeout timer. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /*
> > * Go through our tx list and free mbufs for those
> > @@ -1053,7 +1053,7 @@ mtd_txeof(struct mtd_softc *sc)
> > htole32(TSW_UNSENT)) {
> > sc->mtd_ldata->mtd_tx_list[idx].td_tsw =
> > htole32(TSW_OWN);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > CSR_WRITE_4(MTD_TXPDR, 0xffffffff);
> > }
> > }
> > Index: sys/dev/ic/pgt.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/pgt.c,v
> > retrieving revision 1.104
> > diff -u -p -r1.104 pgt.c
> > --- sys/dev/ic/pgt.c 10 Nov 2023 15:51:20 -0000 1.104
> > +++ sys/dev/ic/pgt.c 6 Jan 2026 00:38:46 -0000
> > @@ -744,7 +744,7 @@ pgt_update_intr(struct pgt_softc *sc, in
> > */
> > if (qdirty > npend) {
> > if (pgt_queue_is_data(pqs[i])) {
> > - sc->sc_ic.ic_if.if_timer = 0;
> > + if_watchdog_disable(&sc->sc_ic.ic_if);
> > ifq_clr_oactive(
> > &sc->sc_ic.ic_if.if_snd);
> > }
> > @@ -2182,7 +2182,7 @@ pgt_start(struct ifnet *ifp)
> > if (ifp->if_bpf != NULL)
> > bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
> > #endif
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > sc->sc_txtimer = 5;
> > ni = ieee80211_find_txnode(&sc->sc_ic,
> > mtod(m, struct ether_header *)->ether_dhost);
> > @@ -2446,7 +2446,7 @@ pgt_watchdog(struct ifnet *ifp)
> > if (sc->sc_dirtyq_count[PGT_QUEUE_DATA_LOW_TX] != 0) {
> > int count;
> >
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > if (sc->sc_txtimer && --sc->sc_txtimer == 0) {
> > count = pgt_drain_tx_queue(sc, PGT_QUEUE_DATA_LOW_TX);
> > if (sc->sc_debug & SC_DEBUG_UNEXPECTED)
> > @@ -2488,7 +2488,7 @@ pgt_watchdog(struct ifnet *ifp)
> > }
> > #endif
> > ieee80211_watchdog(ifp);
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > int
> > @@ -2931,14 +2931,14 @@ pgt_newstate(struct ieee80211com *ic, en
> > switch (nstate) {
> > case IEEE80211_S_INIT:
> > if (sc->sc_dirtyq_count[PGT_QUEUE_DATA_LOW_TX] == 0)
> > - ic->ic_if.if_timer = 0;
> > + if_watchdog_disable(&ic->ic_if);
> > ic->ic_mgt_timer = 0;
> > ic->ic_flags &= ~IEEE80211_F_SIBSS;
> > ieee80211_free_allnodes(ic, 1);
> > ieee80211_set_link_state(ic, LINK_STATE_DOWN);
> > break;
> > case IEEE80211_S_SCAN:
> > - ic->ic_if.if_timer = 1;
> > + if_watchdog_schedule(&ic->ic_if, 1);
> > ic->ic_mgt_timer = 0;
> > ieee80211_node_cleanup(ic, ic->ic_bss);
> > ieee80211_set_link_state(ic, LINK_STATE_DOWN);
> > @@ -2949,7 +2949,7 @@ pgt_newstate(struct ieee80211com *ic, en
> > #endif
> > break;
> > case IEEE80211_S_RUN:
> > - ic->ic_if.if_timer = 1;
> > + if_watchdog_schedule(&ic->ic_if, 1);
> > break;
> > default:
> > break;
> > Index: sys/dev/ic/qwx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/qwx.c,v
> > retrieving revision 1.97
> > diff -u -p -r1.97 qwx.c
> > --- sys/dev/ic/qwx.c 5 Jan 2026 21:07:12 -0000 1.97
> > +++ sys/dev/ic/qwx.c 6 Jan 2026 00:38:46 -0000
> > @@ -426,7 +426,8 @@ qwx_stop(struct ifnet *ifp)
> >
> > qwx_setkey_clear(sc);
> >
> > - ifp->if_timer = sc->sc_tx_timer = 0;
> > + sc->sc_tx_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > @@ -638,7 +639,7 @@ qwx_start(struct ifnet *ifp)
> > }
> >
> > if (ifp->if_flags & IFF_UP)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -647,7 +648,7 @@ qwx_watchdog(struct ifnet *ifp)
> > {
> > struct qwx_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -657,7 +658,7 @@ qwx_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > Index: sys/dev/ic/qwz.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/qwz.c,v
> > retrieving revision 1.21
> > diff -u -p -r1.21 qwz.c
> > --- sys/dev/ic/qwz.c 17 Apr 2025 09:51:55 -0000 1.21
> > +++ sys/dev/ic/qwz.c 6 Jan 2026 00:38:46 -0000
> > @@ -336,7 +336,8 @@ qwz_stop(struct ifnet *ifp)
> >
> > clear_bit(ATH12K_FLAG_CRASH_FLUSH, sc->sc_flags);
> >
> > - ifp->if_timer = sc->sc_tx_timer = 0;
> > + sc->sc_tx_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > @@ -501,7 +502,7 @@ qwz_start(struct ifnet *ifp)
> > }
> >
> > if (ifp->if_flags & IFF_UP)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -510,7 +511,7 @@ qwz_watchdog(struct ifnet *ifp)
> > {
> > struct qwz_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -520,7 +521,7 @@ qwz_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > Index: sys/dev/ic/re.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/re.c,v
> > retrieving revision 1.220
> > diff -u -p -r1.220 re.c
> > --- sys/dev/ic/re.c 10 May 2025 11:08:26 -0000 1.220
> > +++ sys/dev/ic/re.c 6 Jan 2026 00:38:46 -0000
> > @@ -1502,7 +1502,7 @@ re_txeof(struct rl_softc *sc)
> > else if (free == 2)
> > ifq_serialize(&ifp->if_snd, &sc->rl_start);
> > else
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return (1);
> > }
> > @@ -1867,7 +1867,7 @@ re_start(struct ifqueue *ifq)
> > if (post == 0)
> > return;
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > sc->rl_ldata.rl_txq_prodidx = idx;
> > ifq_serialize(ifq, &sc->rl_start);
> > }
> > @@ -2128,7 +2128,7 @@ re_stop(struct ifnet *ifp)
> >
> > sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > sc->rl_flags &= ~RL_FLAG_LINK;
> > sc->rl_timerintr = 0;
> >
> > Index: sys/dev/ic/rt2560.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/rt2560.c,v
> > retrieving revision 1.90
> > diff -u -p -r1.90 rt2560.c
> > --- sys/dev/ic/rt2560.c 21 Apr 2022 21:03:02 -0000 1.90
> > +++ sys/dev/ic/rt2560.c 6 Jan 2026 00:38:46 -0000
> > @@ -1966,7 +1966,7 @@ rt2560_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1975,7 +1975,7 @@ rt2560_watchdog(struct ifnet *ifp)
> > {
> > struct rt2560_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1984,7 +1984,7 @@ rt2560_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2671,7 +2671,7 @@ rt2560_stop(struct ifnet *ifp, int disab
> >
> > sc->sc_tx_timer = 0;
> > sc->sc_flags &= ~(RT2560_PRIO_OACTIVE|RT2560_DATA_OACTIVE);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/rt2661.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/rt2661.c,v
> > retrieving revision 1.100
> > diff -u -p -r1.100 rt2661.c
> > --- sys/dev/ic/rt2661.c 14 Apr 2024 03:26:25 -0000 1.100
> > +++ sys/dev/ic/rt2661.c 6 Jan 2026 00:38:46 -0000
> > @@ -1960,7 +1960,7 @@ rt2661_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1969,7 +1969,7 @@ rt2661_watchdog(struct ifnet *ifp)
> > {
> > struct rt2661_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1978,7 +1978,7 @@ rt2661_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2695,7 +2695,7 @@ rt2661_stop(struct ifnet *ifp, int disab
> > int ac;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/rt2860.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/rt2860.c,v
> > retrieving revision 1.104
> > diff -u -p -r1.104 rt2860.c
> > --- sys/dev/ic/rt2860.c 20 Sep 2024 02:00:46 -0000 1.104
> > +++ sys/dev/ic/rt2860.c 6 Jan 2026 00:38:46 -0000
> > @@ -1791,7 +1791,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1800,7 +1800,7 @@ rt2860_watchdog(struct ifnet *ifp)
> > {
> > struct rt2860_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1810,7 +1810,7 @@ rt2860_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -3963,7 +3963,7 @@ rt2860_stop(struct ifnet *ifp, int disab
> > rt2860_set_leds(sc, 0); /* turn all LEDs off */
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/rtl81x9.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/rtl81x9.c,v
> > retrieving revision 1.100
> > diff -u -p -r1.100 rtl81x9.c
> > --- sys/dev/ic/rtl81x9.c 5 Nov 2024 18:58:59 -0000 1.100
> > +++ sys/dev/ic/rtl81x9.c 6 Jan 2026 00:38:46 -0000
> > @@ -737,9 +737,9 @@ rl_txeof(struct rl_softc *sc)
> > } while (sc->rl_cdata.last_tx != sc->rl_cdata.cur_tx);
> >
> > if (RL_LAST_TXMBUF(sc) == NULL)
> > - ifp->if_timer = 0;
> > - else if (ifp->if_timer == 0)
> > - ifp->if_timer = 5;
> > + if_watchdog_disable(ifp);
> > + else
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > int
> > @@ -882,7 +882,7 @@ rl_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > if (pkts == 0)
> > @@ -1068,7 +1068,7 @@ rl_stop(struct rl_softc *sc)
> > struct ifnet *ifp = &sc->sc_arpcom.ac_if;
> > int i;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->sc_tick_tmo);
> >
> > Index: sys/dev/ic/rtw.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/rtw.c,v
> > retrieving revision 1.103
> > diff -u -p -r1.103 rtw.c
> > --- sys/dev/ic/rtw.c 21 Apr 2022 21:03:02 -0000 1.103
> > +++ sys/dev/ic/rtw.c 6 Jan 2026 00:38:46 -0000
> > @@ -1906,7 +1906,7 @@ rtw_stop(struct ifnet *ifp, int disable)
> > /* Mark the interface as not running. Cancel the watchdog timer. */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return;
> > }
> > @@ -2692,7 +2692,7 @@ rtw_80211_dequeue(struct rtw_softc *sc,
> > DPRINTF(sc, RTW_DEBUG_XMIT_RSRC, ("%s: no ring %d descriptor\n",
> > __func__, pri));
> > ifq_set_oactive(&sc->sc_if.if_snd);
> > - sc->sc_if.if_timer = 1;
> > + if_watchdog_schedule(&sc->sc_if, 1);
> > return NULL;
> > }
> > m = mq_dequeue(ifq);
> > @@ -2765,7 +2765,7 @@ rtw_dequeue(struct ifnet *ifp, struct rt
> > DPRINTF(sc, RTW_DEBUG_XMIT, ("%s: no descriptor\n", __func__));
> > ifq_deq_rollback(&ifp->if_snd, m0);
> > ifq_set_oactive(&ifp->if_snd);
> > - sc->sc_if.if_timer = 1;
> > + if_watchdog_schedule(&sc->sc_if, 1);
> > return 0;
> > }
> >
> > @@ -3267,7 +3267,7 @@ rtw_start(struct ifnet *ifp)
> > if (tsb != &sc->sc_txsoft_blk[RTW_TXPRIBCN])
> > sc->sc_led_state.ls_event |= RTW_LED_S_TX;
> > tsb->tsb_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > tppoll = RTW_READ8(&sc->sc_regs, RTW_TPPOLL);
> > tppoll &= ~RTW_TPPOLL_SALL;
> > tppoll |= tsb->tsb_poll & RTW_TPPOLL_ALL;
> > @@ -3311,7 +3311,7 @@ rtw_watchdog(struct ifnet *ifp)
> >
> > sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if ((sc->sc_flags & RTW_F_ENABLED) == 0)
> > return;
> > @@ -3330,7 +3330,7 @@ rtw_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > tx_timeouts++;
> > } else
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > if (tx_timeouts > 0) {
> > Index: sys/dev/ic/rtwn.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/rtwn.c,v
> > retrieving revision 1.61
> > diff -u -p -r1.61 rtwn.c
> > --- sys/dev/ic/rtwn.c 20 Aug 2025 14:24:05 -0000 1.61
> > +++ sys/dev/ic/rtwn.c 6 Jan 2026 00:38:46 -0000
> > @@ -1591,7 +1591,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1600,7 +1600,7 @@ rtwn_watchdog(struct ifnet *ifp)
> > {
> > struct rtwn_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1609,7 +1609,7 @@ rtwn_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > ieee80211_watchdog(ifp);
> > }
> > @@ -3401,7 +3401,7 @@ rtwn_stop(struct ifnet *ifp)
> > int s;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/ic/smc83c170.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/smc83c170.c,v
> > retrieving revision 1.32
> > diff -u -p -r1.32 smc83c170.c
> > --- sys/dev/ic/smc83c170.c 5 Nov 2024 18:58:59 -0000 1.32
> > +++ sys/dev/ic/smc83c170.c 6 Jan 2026 00:38:46 -0000
> > @@ -499,7 +499,7 @@ epic_start(struct ifnet *ifp)
> > COMMAND_TXQUEUED);
> >
> > /* Set a watchdog timer in case the chip flakes out. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -770,7 +770,7 @@ epic_intr(void *arg)
> > * transmissions.
> > */
> > if (sc->sc_txpending == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /*
> > * Kick the transmitter after a DMA underrun.
> > @@ -1071,7 +1071,7 @@ epic_stop(struct ifnet *ifp, int disable
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Down the MII. */
> > mii_down(&sc->sc_mii);
> > Index: sys/dev/ic/smc91cxx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/smc91cxx.c,v
> > retrieving revision 1.54
> > diff -u -p -r1.54 smc91cxx.c
> > --- sys/dev/ic/smc91cxx.c 25 Jun 2025 20:28:09 -0000 1.54
> > +++ sys/dev/ic/smc91cxx.c 6 Jan 2026 00:38:46 -0000
> > @@ -594,7 +594,7 @@ smc91cxx_start(struct ifnet *ifp)
> > bus_space_write_1(bst, bsh, INTR_MASK_REG_B,
> > bus_space_read_1(bst, bsh, INTR_MASK_REG_B) | IM_ALLOC_INT);
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > ifq_deq_rollback(&ifp->if_snd, m);
> > ifq_set_oactive(&ifp->if_snd);
> > return;
> > @@ -668,7 +668,7 @@ smc91cxx_start(struct ifnet *ifp)
> >
> > bus_space_write_2(bst, bsh, MMU_CMD_REG_W, MMUCR_ENQUEUE);
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > #if NBPFILTER > 0
> > if (ifp->if_bpf)
> > @@ -766,7 +766,7 @@ smc91cxx_intr(void *arg)
> > bus_space_write_2(bst, bsh, MMU_CMD_REG_W, MMUCR_FREEPKT);
> >
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -826,7 +826,7 @@ smc91cxx_intr(void *arg)
> > /* XXX bound this loop! */ ;
> > bus_space_write_2(bst, bsh, MMU_CMD_REG_W, MMUCR_FREEPKT);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -850,7 +850,7 @@ smc91cxx_intr(void *arg)
> >
> > SMC_SELECT_BANK(sc, 2);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -1106,7 +1106,7 @@ smc91cxx_stop(struct smc91cxx_softc *sc)
> > /*
> > * Cancel watchdog timer.
> > */
> > - sc->sc_arpcom.ac_if.if_timer = 0;
> > + if_watchdog_disable(&sc->sc_arpcom.ac_if);
> > }
> >
> > /*
> > Index: sys/dev/ic/ti.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/ti.c,v
> > retrieving revision 1.31
> > diff -u -p -r1.31 ti.c
> > --- sys/dev/ic/ti.c 20 Sep 2024 02:00:46 -0000 1.31
> > +++ sys/dev/ic/ti.c 6 Jan 2026 00:38:46 -0000
> > @@ -1653,7 +1653,7 @@ ti_txeof_tigon1(struct ti_softc *sc)
> > }
> > sc->ti_txcnt--;
> > TI_INC(sc->ti_tx_saved_considx, TI_TX_RING_CNT);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > active = 0;
> > }
> > @@ -1697,7 +1697,7 @@ ti_txeof_tigon2(struct ti_softc *sc)
> > }
> > sc->ti_txcnt--;
> > TI_INC(sc->ti_tx_saved_considx, TI_TX_RING_CNT);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > if (cur_tx != NULL)
> > @@ -1991,7 +1991,7 @@ ti_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > Index: sys/dev/ic/xl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/xl.c,v
> > retrieving revision 1.141
> > diff -u -p -r1.141 xl.c
> > --- sys/dev/ic/xl.c 5 Nov 2024 18:58:59 -0000 1.141
> > +++ sys/dev/ic/xl.c 6 Jan 2026 00:38:46 -0000
> > @@ -1284,7 +1284,7 @@ xl_txeof(struct xl_softc *sc)
> > if (sc->xl_cdata.xl_tx_head == NULL) {
> > ifq_clr_oactive(&ifp->if_snd);
> > /* Clear the timeout timer. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > sc->xl_cdata.xl_tx_tail = NULL;
> > } else {
> > if (CSR_READ_4(sc, XL_DMACTL) & XL_DMACTL_DOWN_STALLED ||
> > @@ -1336,7 +1336,7 @@ xl_txeof_90xB(struct xl_softc *sc)
> > if (cur_tx != NULL)
> > ifq_clr_oactive(&ifp->if_snd);
> > if (sc->xl_cdata.xl_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -1742,7 +1742,7 @@ xl_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > /*
> > * XXX Under certain conditions, usually on slower machines
> > @@ -1841,7 +1841,7 @@ xl_start_90xB(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -2289,7 +2289,7 @@ xl_stop(struct xl_softc *sc)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_DISABLE);
> > CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_STATS_DISABLE);
> > Index: sys/dev/isa/if_ef_isapnp.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/isa/if_ef_isapnp.c,v
> > retrieving revision 1.42
> > diff -u -p -r1.42 if_ef_isapnp.c
> > --- sys/dev/isa/if_ef_isapnp.c 11 Sep 2023 08:41:26 -0000 1.42
> > +++ sys/dev/isa/if_ef_isapnp.c 6 Jan 2026 00:38:46 -0000
> > @@ -452,7 +452,7 @@ efstop(struct ef_softc *sc)
> > bus_space_tag_t iot = sc->sc_iot;
> > bus_space_handle_t ioh = sc->sc_ioh;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/isa/if_ex.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/isa/if_ex.c,v
> > retrieving revision 1.50
> > diff -u -p -r1.50 if_ex.c
> > --- sys/dev/isa/if_ex.c 22 Jun 2024 10:22:29 -0000 1.50
> > +++ sys/dev/isa/if_ex.c 6 Jan 2026 00:38:46 -0000
> > @@ -293,7 +293,7 @@ ex_init(struct ex_softc *sc)
> > DODEBUG(Start_End, printf("ex_init: start\n"););
> >
> > s = splnet();
> > - sc->arpcom.ac_if.if_timer = 0;
> > + if_watchdog_disable(&sc->arpcom.ac_if);
> >
> > /*
> > * Load the ethernet address into the card.
> > @@ -514,7 +514,7 @@ ex_start(struct ifnet *ifp)
> > bpf_mtap(ifp->if_bpf, opkt,
> > BPF_DIRECTION_OUT);
> > #endif
> > - ifp->if_timer = 2;
> > + if_watchdog_schedule(ifp, 2);
> > m_freem(opkt);
> > } else {
> > ifq_deq_rollback(&ifp->if_snd, opkt);
> > @@ -613,7 +613,7 @@ ex_tx_intr(struct ex_softc *sc)
> > * - Advance chain pointer to next queued packet.
> > * - Update statistics.
> > */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > while (sc->tx_head != sc->tx_tail) {
> > CSR_WRITE_2(sc, HOST_ADDR_REG, sc->tx_head);
> > if (!(CSR_READ_2(sc, IO_PORT_REG) & Done_bit))
> > Index: sys/dev/isa/if_ie.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/isa/if_ie.c,v
> > retrieving revision 1.59
> > diff -u -p -r1.59 if_ie.c
> > --- sys/dev/isa/if_ie.c 6 Apr 2022 18:59:28 -0000 1.59
> > +++ sys/dev/isa/if_ie.c 6 Jan 2026 00:38:47 -0000
> > @@ -913,7 +913,7 @@ ietint(struct ie_softc *sc)
> > struct ifnet *ifp = &sc->sc_arpcom.ac_if;
> > int status;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > status = sc->xmit_cmds[sc->xctail]->ie_xmit_status;
> > @@ -1109,7 +1109,7 @@ iexmit(struct ie_softc *sc)
> > sc->scb->ie_command_list = MK_16(MEM, sc->xmit_cmds[sc->xctail]);
> > command_and_wait(sc, IE_CU_START, 0, 0);
> >
> > - sc->sc_arpcom.ac_if.if_timer = 5;
> > + if_watchdog_schedule(&sc->sc_arpcom.ac_if, 5);
> > }
> >
> > /*
> > Index: sys/dev/pci/if_age.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_age.c,v
> > retrieving revision 1.40
> > diff -u -p -r1.40 if_age.c
> > --- sys/dev/pci/if_age.c 24 May 2024 06:02:53 -0000 1.40
> > +++ sys/dev/pci/if_age.c 6 Jan 2026 00:38:47 -0000
> > @@ -998,7 +998,7 @@ age_start(struct ifnet *ifp)
> > /* Update mbox. */
> > AGE_COMMIT_MBOX(sc);
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = AGE_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, AGE_TX_TIMEOUT);
> > }
> > }
> >
> > @@ -1249,7 +1249,7 @@ age_txintr(struct age_softc *sc, int tpd
> > * Tx descriptors in queue.
> > */
> > if (sc->age_cdata.age_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > bus_dmamap_sync(sc->sc_dmat, sc->age_cdata.age_tx_ring_map, 0,
> > sc->age_cdata.age_tx_ring_map->dm_mapsize,
> > @@ -1795,7 +1795,7 @@ age_stop(struct age_softc *sc)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > sc->age_flags &= ~AGE_FLAG_LINK;
> > timeout_del(&sc->age_tick_ch);
> > Index: sys/dev/pci/if_alc.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_alc.c,v
> > retrieving revision 1.59
> > diff -u -p -r1.59 if_alc.c
> > --- sys/dev/pci/if_alc.c 31 Aug 2024 16:23:09 -0000 1.59
> > +++ sys/dev/pci/if_alc.c 6 Jan 2026 00:38:47 -0000
> > @@ -1944,7 +1944,7 @@ alc_start(struct ifnet *ifp)
> > MBOX_TD_PROD_LO_IDX_SHIFT) &
> > MBOX_TD_PROD_LO_IDX_MASK);
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = ALC_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, ALC_TX_TIMEOUT);
> > }
> > }
> >
> > @@ -2308,7 +2308,7 @@ alc_txeof(struct alc_softc *sc)
> > * frames in Tx queue.
> > */
> > if (sc->alc_cdata.alc_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > int
> > @@ -3076,7 +3076,7 @@ alc_stop(struct alc_softc *sc)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->alc_tick_ch);
> > sc->alc_flags &= ~ALC_FLAG_LINK;
> > Index: sys/dev/pci/if_ale.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ale.c,v
> > retrieving revision 1.52
> > diff -u -p -r1.52 if_ale.c
> > --- sys/dev/pci/if_ale.c 31 Aug 2024 16:23:09 -0000 1.52
> > +++ sys/dev/pci/if_ale.c 6 Jan 2026 00:38:47 -0000
> > @@ -1023,7 +1023,7 @@ ale_start(struct ifnet *ifp)
> > sc->ale_cdata.ale_tx_prod);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = ALE_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, ALE_TX_TIMEOUT);
> > }
> > }
> >
> > @@ -1326,7 +1326,7 @@ ale_txeof(struct ale_softc *sc)
> > * Tx descriptors in queue.
> > */
> > if (sc->ale_cdata.ale_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> > }
> >
> > @@ -1830,7 +1830,7 @@ ale_stop(struct ale_softc *sc)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->ale_tick_ch);
> > sc->ale_flags &= ~ALE_FLAG_LINK;
> > Index: sys/dev/pci/if_bce.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_bce.c,v
> > retrieving revision 1.60
> > diff -u -p -r1.60 if_bce.c
> > --- sys/dev/pci/if_bce.c 4 Sep 2025 15:45:56 -0000 1.60
> > +++ sys/dev/pci/if_bce.c 6 Jan 2026 00:38:47 -0000
> > @@ -587,7 +587,7 @@ bce_start(struct ifnet *ifp)
> > }
> > if (newpkts) {
> > /* Set a watchdog timer in case the chip flakes out. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -776,7 +776,7 @@ bce_txintr(struct bce_softc *sc)
> > * timer
> > */
> > if (sc->bce_txsnext == sc->bce_txin)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /* initialize the interface */
> > @@ -965,7 +965,7 @@ bce_stop(struct ifnet *ifp)
> > /* Mark the interface down and cancel the watchdog timer. */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Down the MII. */
> > mii_down(&sc->bce_mii);
> > Index: sys/dev/pci/if_bge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_bge.c,v
> > retrieving revision 1.408
> > diff -u -p -r1.408 if_bge.c
> > --- sys/dev/pci/if_bge.c 15 Jul 2025 13:40:02 -0000 1.408
> > +++ sys/dev/pci/if_bge.c 6 Jan 2026 00:38:47 -0000
> > @@ -3742,7 +3742,7 @@ bge_txeof(struct bge_softc *sc)
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > else if (txcnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > int
> > @@ -4255,7 +4255,7 @@ bge_start(struct ifqueue *ifq)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -4671,7 +4671,7 @@ bge_stop(struct bge_softc *sc, int softo
> > timeout_del(&sc->bge_rxtimeout_jumbo);
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (!softonly) {
> > /*
> > Index: sys/dev/pci/if_bnx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_bnx.c,v
> > retrieving revision 1.134
> > diff -u -p -r1.134 if_bnx.c
> > --- sys/dev/pci/if_bnx.c 19 Aug 2024 03:08:27 -0000 1.134
> > +++ sys/dev/pci/if_bnx.c 6 Jan 2026 00:38:47 -0000
> > @@ -3297,7 +3297,7 @@ bnx_stop(struct bnx_softc *sc)
> > ifm->ifm_media = mtmp;
> > ifp->if_flags = itmp;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > sc->bnx_link = 0;
> >
> > @@ -4577,7 +4577,7 @@ bnx_tx_intr(struct bnx_softc *sc)
> >
> > /* Clear the TX timeout timer. */
> > if (used == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > @@ -4942,7 +4942,7 @@ bnx_start(struct ifqueue *ifq)
> > REG_WR(sc, MB_TX_CID_ADDR + BNX_L2CTX_TX_HOST_BSEQ, sc->tx_prod_bseq);
> >
> > /* Set the tx timeout. */
> > - ifp->if_timer = BNX_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, BNX_TX_TIMEOUT);
> >
> > bnx_start_exit:
> > return;
> > Index: sys/dev/pci/if_cas.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_cas.c,v
> > retrieving revision 1.56
> > diff -u -p -r1.56 if_cas.c
> > --- sys/dev/pci/if_cas.c 24 May 2024 06:02:53 -0000 1.56
> > +++ sys/dev/pci/if_cas.c 6 Jan 2026 00:38:47 -0000
> > @@ -717,7 +717,7 @@ cas_stop(struct ifnet *ifp, int disable)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > mii_down(&sc->sc_mii);
> >
> > @@ -1068,7 +1068,7 @@ cas_init(struct ifnet *ifp)
> >
> > ifp->if_flags |= IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > splx(s);
> >
> > return (0);
> > @@ -1853,7 +1853,7 @@ cas_tint(struct cas_softc *sc, u_int32_t
> > if (used < CAS_NTXDESC - 2)
> > ifq_clr_oactive(&ifp->if_snd);
> > if (used == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (!ifq_empty(&ifp->if_snd)) {
> > KERNEL_LOCK();
> > @@ -1897,7 +1897,7 @@ cas_start(struct ifnet *ifp)
> > }
> >
> > if (used != 0) {
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > sc->sc_tx_prod = (sc->sc_tx_prod + used) % CAS_NTXDESC;
> > atomic_add_int(&sc->sc_tx_cnt, used);
> > }
> > Index: sys/dev/pci/if_de.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_de.c,v
> > retrieving revision 1.144
> > diff -u -p -r1.144 if_de.c
> > --- sys/dev/pci/if_de.c 20 Nov 2024 02:26:53 -0000 1.144
> > +++ sys/dev/pci/if_de.c 6 Jan 2026 00:38:47 -0000
> > @@ -4123,7 +4123,7 @@ tulip_ifwatchdog(struct ifnet *ifp)
> > sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs;
> > #endif /* TULIP_DEBUG */
> >
> > - sc->tulip_if.if_timer = 1;
> > + if_watchdog_schedule(&sc->tulip_if, 1);
> > /*
> > * These should be rare so do a bulk test up front so we can just skip
> > * them if needed.
> > @@ -4520,7 +4520,7 @@ tulip_attach(struct device * const paren
> > ifp->if_ioctl = tulip_ifioctl;
> > ifp->if_start = tulip_ifstart;
> > ifp->if_watchdog = tulip_ifwatchdog;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> >
> > (*sc->tulip_boardsw->bd_media_probe)(sc);
> > ifmedia_init(&sc->tulip_ifmedia, 0,
> > Index: sys/dev/pci/if_em.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_em.c,v
> > retrieving revision 1.379
> > diff -u -p -r1.379 if_em.c
> > --- sys/dev/pci/if_em.c 14 Jul 2025 11:52:43 -0000 1.379
> > +++ sys/dev/pci/if_em.c 6 Jan 2026 00:38:47 -0000
> > @@ -692,7 +692,7 @@ em_start(struct ifqueue *ifq)
> > #endif
> >
> > /* Set timeout in case hardware has problems transmitting */
> > - ifp->if_timer = EM_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, EM_TX_TIMEOUT);
> >
> > if (sc->hw.mac_type == em_82547) {
> > int len = m->m_pkthdr.len;
> > @@ -829,7 +829,7 @@ em_watchdog(struct ifnet *ifp)
> > * don't reset the hardware.
> > */
> > if (E1000_READ_REG(&sc->hw, STATUS) & E1000_STATUS_TXOFF) {
> > - ifp->if_timer = EM_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, EM_TX_TIMEOUT);
> > return;
> > }
> > printf("%s: watchdog: head %u tail %u TDH %u TDT %u\n",
> > @@ -1629,7 +1629,7 @@ em_stop(void *arg, int softonly)
> > KASSERT((ifp->if_flags & IFF_RUNNING) == 0);
> >
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > em_free_transmit_structures(sc);
> > em_free_receive_structures(sc);
> > @@ -2690,7 +2690,7 @@ em_txeof(struct em_queue *que)
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > else if (tail == head)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*********************************************************************
> > Index: sys/dev/pci/if_et.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_et.c,v
> > retrieving revision 1.45
> > diff -u -p -r1.45 if_et.c
> > --- sys/dev/pci/if_et.c 14 Jul 2025 23:49:08 -0000 1.45
> > +++ sys/dev/pci/if_et.c 6 Jan 2026 00:38:48 -0000
> > @@ -463,7 +463,7 @@ et_stop(struct et_softc *sc)
> > sc->sc_tx = 0;
> > sc->sc_tx_intr = 0;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > }
> > @@ -1091,7 +1091,7 @@ et_start(struct ifnet *ifp)
> >
> > if (trans) {
> > timeout_add_sec(&sc->sc_txtick, 1);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -1912,7 +1912,7 @@ et_txeof(struct et_softc *sc)
> >
> > if (tbd->tbd_used == 0) {
> > timeout_del(&sc->sc_txtick);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> > if (tbd->tbd_used + ET_NSEG_SPARE <= ET_TX_NDESC)
> > ifq_clr_oactive(&ifp->if_snd);
> > Index: sys/dev/pci/if_igc.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_igc.c,v
> > retrieving revision 1.30
> > diff -u -p -r1.30 if_igc.c
> > --- sys/dev/pci/if_igc.c 17 Dec 2025 01:14:42 -0000 1.30
> > +++ sys/dev/pci/if_igc.c 6 Jan 2026 00:38:48 -0000
> > @@ -1963,7 +1963,7 @@ igc_initialize_transmit_unit(struct igc_
> >
> > IGC_WRITE_REG(hw, IGC_TXDCTL(i), txdctl);
> > }
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Program the Transmit Control Register */
> > tctl = IGC_READ_REG(&sc->hw, IGC_TCTL);
> > Index: sys/dev/pci/if_ipw.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ipw.c,v
> > retrieving revision 1.134
> > diff -u -p -r1.134 if_ipw.c
> > --- sys/dev/pci/if_ipw.c 14 Apr 2024 03:26:25 -0000 1.134
> > +++ sys/dev/pci/if_ipw.c 6 Jan 2026 00:38:48 -0000
> > @@ -1322,7 +1322,7 @@ ipw_start(struct ifnet *ifp)
> >
> > /* start watchdog timer */
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1331,7 +1331,7 @@ ipw_watchdog(struct ifnet *ifp)
> > {
> > struct ipw_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1340,7 +1340,7 @@ ipw_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2022,7 +2022,7 @@ ipw_stop(struct ifnet *ifp, int disable)
> > ipw_stop_master(sc);
> > CSR_WRITE_4(sc, IPW_CSR_RST, IPW_RST_SW_RESET);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/pci/if_iwi.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_iwi.c,v
> > retrieving revision 1.149
> > diff -u -p -r1.149 if_iwi.c
> > --- sys/dev/pci/if_iwi.c 24 May 2024 06:02:53 -0000 1.149
> > +++ sys/dev/pci/if_iwi.c 6 Jan 2026 00:38:48 -0000
> > @@ -1418,7 +1418,7 @@ iwi_start(struct ifnet *ifp)
> >
> > /* start watchdog timer */
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1427,7 +1427,7 @@ iwi_watchdog(struct ifnet *ifp)
> > {
> > struct iwi_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1436,7 +1436,7 @@ iwi_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2288,7 +2288,7 @@ iwi_stop(struct ifnet *ifp, int disable)
> > int ac;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/pci/if_iwm.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> > retrieving revision 1.419
> > diff -u -p -r1.419 if_iwm.c
> > --- sys/dev/pci/if_iwm.c 1 Dec 2025 16:30:46 -0000 1.419
> > +++ sys/dev/pci/if_iwm.c 6 Jan 2026 00:38:48 -0000
> > @@ -10496,7 +10496,7 @@ iwm_start(struct ifnet *ifp)
> > }
> >
> > if (ifp->if_flags & IFF_UP)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > return;
> > @@ -10620,7 +10620,7 @@ iwm_stop(struct ifnet *ifp)
> > }
> > iwm_led_blink_stop(sc);
> > memset(sc->sc_tx_timer, 0, sizeof(sc->sc_tx_timer));
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > splx(s);
> > }
> > @@ -10631,7 +10631,7 @@ iwm_watchdog(struct ifnet *ifp)
> > struct iwm_softc *sc = ifp->if_softc;
> > int i;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /*
> > * We maintain a separate timer for each Tx queue because
> > @@ -10651,7 +10651,7 @@ iwm_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > Index: sys/dev/pci/if_iwn.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_iwn.c,v
> > retrieving revision 1.264
> > diff -u -p -r1.264 if_iwn.c
> > --- sys/dev/pci/if_iwn.c 4 Feb 2025 09:15:04 -0000 1.264
> > +++ sys/dev/pci/if_iwn.c 6 Jan 2026 00:38:48 -0000
> > @@ -3704,7 +3704,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -3713,7 +3713,7 @@ iwn_watchdog(struct ifnet *ifp)
> > {
> > struct iwn_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -3722,7 +3722,7 @@ iwn_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -7227,7 +7227,8 @@ iwn_stop(struct ifnet *ifp)
> > struct ieee80211com *ic = &sc->sc_ic;
> >
> > timeout_del(&sc->calib_to);
> > - ifp->if_timer = sc->sc_tx_timer = 0;
> > + sc->sc_tx_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/pci/if_iwx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_iwx.c,v
> > retrieving revision 1.194
> > diff -u -p -r1.194 if_iwx.c
> > --- sys/dev/pci/if_iwx.c 1 Dec 2025 16:44:13 -0000 1.194
> > +++ sys/dev/pci/if_iwx.c 6 Jan 2026 00:38:48 -0000
> > @@ -9766,7 +9766,7 @@ iwx_start(struct ifnet *ifp)
> > }
> >
> > if (ifp->if_flags & IFF_UP)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > return;
> > @@ -9890,7 +9890,7 @@ iwx_stop(struct ifnet *ifp)
> > iwx_clear_reorder_buffer(sc, rxba);
> > }
> > memset(sc->sc_tx_timer, 0, sizeof(sc->sc_tx_timer));
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > splx(s);
> > }
> > @@ -9901,7 +9901,7 @@ iwx_watchdog(struct ifnet *ifp)
> > struct iwx_softc *sc = ifp->if_softc;
> > int i;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /*
> > * We maintain a separate timer for each Tx queue because
> > @@ -9921,7 +9921,7 @@ iwx_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > Index: sys/dev/pci/if_ix.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ix.c,v
> > retrieving revision 1.222
> > diff -u -p -r1.222 if_ix.c
> > --- sys/dev/pci/if_ix.c 11 Nov 2025 17:43:18 -0000 1.222
> > +++ sys/dev/pci/if_ix.c 6 Jan 2026 00:38:48 -0000
> > @@ -496,7 +496,7 @@ ixgbe_start(struct ifqueue *ifq)
> >
> > /* Set timeout in case hardware has problems transmitting */
> > txr->watchdog_timer = IXGBE_TX_TIMEOUT;
> > - ifp->if_timer = IXGBE_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, IXGBE_TX_TIMEOUT);
> >
> > post = 1;
> > }
> > @@ -711,7 +711,7 @@ ixgbe_watchdog(struct ifnet * ifp)
> > if (!(IXGBE_READ_REG(hw, IXGBE_TFCS) & IXGBE_TFCS_TXON)) {
> > for (i = 0; i < sc->num_queues; i++, txr++)
> > txr->watchdog_timer = IXGBE_TX_TIMEOUT;
> > - ifp->if_timer = IXGBE_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, IXGBE_TX_TIMEOUT);
> > return;
> > }
> >
> > @@ -1651,7 +1651,7 @@ ixgbe_stop(void *arg)
> > #if NKSTAT > 0
> > timeout_del(&sc->sc_kstat_tmo);
> > #endif
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > INIT_DEBUGOUT("ixgbe_stop: begin\n");
> > ixgbe_disable_intr(sc);
> > @@ -1932,7 +1932,7 @@ ixgbe_setup_interface(struct ix_softc *s
> > ifp->if_xflags = IFXF_MPSAFE;
> > ifp->if_ioctl = ixgbe_ioctl;
> > ifp->if_qstart = ixgbe_start;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_watchdog = ixgbe_watchdog;
> > ifp->if_hardmtu = IXGBE_MAX_FRAME_SIZE -
> > ETHER_HDR_LEN - ETHER_CRC_LEN;
> > @@ -2423,7 +2423,7 @@ ixgbe_initialize_transmit_units(struct i
> > break;
> > }
> > }
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (hw->mac.type != ixgbe_mac_82598EB) {
> > uint32_t dmatxctl, rttdcs;
> > @@ -2684,7 +2684,7 @@ ixgbe_txeof(struct ix_txring *txr)
> > tail = 0;
> > if (head == tail) {
> > /* All clean, turn off the timer */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > break;
> > }
> > }
> > Index: sys/dev/pci/if_ixgb.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ixgb.c,v
> > retrieving revision 1.77
> > diff -u -p -r1.77 if_ixgb.c
> > --- sys/dev/pci/if_ixgb.c 29 Jun 2025 19:32:08 -0000 1.77
> > +++ sys/dev/pci/if_ixgb.c 6 Jan 2026 00:38:48 -0000
> > @@ -302,7 +302,7 @@ ixgb_start(struct ifnet *ifp)
> > #endif
> >
> > /* Set timeout in case hardware has problems transmitting */
> > - ifp->if_timer = IXGB_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, IXGB_TX_TIMEOUT);
> >
> > post = 1;
> > }
> > @@ -409,7 +409,7 @@ ixgb_watchdog(struct ifnet * ifp)
> > * reset the hardware.
> > */
> > if (IXGB_READ_REG(&sc->hw, STATUS) & IXGB_STATUS_TXOFF) {
> > - ifp->if_timer = IXGB_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, IXGB_TX_TIMEOUT);
> > return;
> > }
> >
> > @@ -1416,10 +1416,10 @@ ixgb_txeof(struct ixgb_softc *sc)
> >
> > /* All clean, turn off the timer */
> > if (num_avail == sc->num_tx_desc)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > /* Some cleaned, reset the timer */
> > else if (num_avail != sc->num_tx_desc_avail)
> > - ifp->if_timer = IXGB_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, IXGB_TX_TIMEOUT);
> >
> > sc->num_tx_desc_avail = num_avail;
> > }
> > Index: sys/dev/pci/if_ixv.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ixv.c,v
> > retrieving revision 1.2
> > diff -u -p -r1.2 if_ixv.c
> > --- sys/dev/pci/if_ixv.c 14 Jul 2025 23:49:08 -0000 1.2
> > +++ sys/dev/pci/if_ixv.c 6 Jan 2026 00:38:48 -0000
> > @@ -771,7 +771,7 @@ ixv_setup_interface(struct device *dev,
> > ifp->if_xflags = IFXF_MPSAFE;
> > ifp->if_ioctl = ixv_ioctl;
> > ifp->if_qstart = ixgbe_start;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_watchdog = ixv_watchdog;
> > ifp->if_hardmtu = IXGBE_MAX_FRAME_SIZE -
> > ETHER_HDR_LEN - ETHER_CRC_LEN;
> > @@ -871,7 +871,7 @@ ixv_initialize_transmit_units(struct ix_
> > txdctl |= IXGBE_TXDCTL_ENABLE;
> > IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
> > }
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return;
> > } /* ixv_initialize_transmit_units */
> > Index: sys/dev/pci/if_jme.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_jme.c,v
> > retrieving revision 1.58
> > diff -u -p -r1.58 if_jme.c
> > --- sys/dev/pci/if_jme.c 24 May 2024 06:02:53 -0000 1.58
> > +++ sys/dev/pci/if_jme.c 6 Jan 2026 00:38:48 -0000
> > @@ -247,7 +247,7 @@ jme_miibus_statchg(struct device *dev)
> > /* Stop driver */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > timeout_del(&sc->jme_tick_ch);
> >
> > /* Stop receiver/transmitter. */
> > @@ -1253,7 +1253,7 @@ jme_start(struct ifnet *ifp)
> > CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr | TXCSR_TX_ENB |
> > TXCSR_TXQ_N_START(TXCSR_TXQ0));
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = JME_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, JME_TX_TIMEOUT);
> > }
> > }
> >
> > @@ -1554,7 +1554,7 @@ jme_txeof(struct jme_softc *sc)
> > sc->jme_cdata.jme_tx_cons = cons;
> >
> > if (sc->jme_cdata.jme_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->jme_cdata.jme_tx_cnt + JME_TXD_RSVD <=
> > JME_TX_RING_CNT - JME_TXD_RSVD)
> > @@ -2015,7 +2015,7 @@ jme_stop(struct jme_softc *sc)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->jme_tick_ch);
> > sc->jme_flags &= ~JME_FLAG_LINK;
> > Index: sys/dev/pci/if_lge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_lge.c,v
> > retrieving revision 1.82
> > diff -u -p -r1.82 if_lge.c
> > --- sys/dev/pci/if_lge.c 6 Sep 2024 10:54:08 -0000 1.82
> > +++ sys/dev/pci/if_lge.c 6 Jan 2026 00:38:48 -0000
> > @@ -761,7 +761,7 @@ lge_txeof(struct lge_softc *sc)
> > ifp = &sc->arpcom.ac_if;
> >
> > /* Clear the timeout timer. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /*
> > * Go through our tx list and free mbufs for those
> > @@ -781,7 +781,7 @@ lge_txeof(struct lge_softc *sc)
> >
> > txdone--;
> > LGE_INC(idx, LGE_TX_LIST_CNT);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > sc->lge_cdata.lge_tx_cons = idx;
> > @@ -980,7 +980,7 @@ lge_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1238,7 +1238,7 @@ lge_stop(struct lge_softc *sc)
> > struct ifnet *ifp;
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > timeout_del(&sc->lge_timeout);
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > Index: sys/dev/pci/if_lii.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_lii.c,v
> > retrieving revision 1.48
> > diff -u -p -r1.48 if_lii.c
> > --- sys/dev/pci/if_lii.c 31 Aug 2024 16:23:09 -0000 1.48
> > +++ sys/dev/pci/if_lii.c 6 Jan 2026 00:38:48 -0000
> > @@ -827,7 +827,7 @@ lii_stop(struct ifnet *ifp)
> >
> > timeout_del(&sc->sc_tick);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/pci/if_msk.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_msk.c,v
> > retrieving revision 1.145
> > diff -u -p -r1.145 if_msk.c
> > --- sys/dev/pci/if_msk.c 31 Aug 2024 16:23:09 -0000 1.145
> > +++ sys/dev/pci/if_msk.c 6 Jan 2026 00:38:48 -0000
> > @@ -1679,7 +1679,7 @@ msk_start(struct ifnet *ifp)
> > SK_IF_WRITE_2(sc_if, 1, SK_TXQA1_Y2_PREF_PUTIDX, prod);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = MSK_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, MSK_TX_TIMEOUT);
> > }
> >
> > void
> > @@ -1797,7 +1797,7 @@ msk_txeof(struct sk_if_softc *sc_if, uns
> > SK_INC(cons, MSK_TX_RING_CNT);
> > }
> > if (cons == sc_if->sk_cdata.sk_tx_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > sc_if->sk_cdata.sk_tx_cons = cons;
> >
> > Index: sys/dev/pci/if_mwx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_mwx.c,v
> > retrieving revision 1.7
> > diff -u -p -r1.7 if_mwx.c
> > --- sys/dev/pci/if_mwx.c 1 Aug 2025 14:37:06 -0000 1.7
> > +++ sys/dev/pci/if_mwx.c 6 Jan 2026 00:38:48 -0000
> > @@ -639,7 +639,7 @@ mwx_stop(struct ifnet *ifp)
> > task_del(systq, &sc->sc_reset_task);
> > task_del(systq, &sc->sc_scan_task);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -656,7 +656,7 @@ mwx_stop(struct ifnet *ifp)
> > void
> > mwx_watchdog(struct ifnet *ifp)
> > {
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ieee80211_watchdog(ifp);
> > }
> >
> > @@ -717,7 +717,7 @@ mwx_start(struct ifnet *ifp)
> > }
> >
> > if (ifp->if_flags & IFF_UP)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > Index: sys/dev/pci/if_nep.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_nep.c,v
> > retrieving revision 1.35
> > diff -u -p -r1.35 if_nep.c
> > --- sys/dev/pci/if_nep.c 24 May 2024 06:02:56 -0000 1.35
> > +++ sys/dev/pci/if_nep.c 6 Jan 2026 00:38:48 -0000
> > @@ -1103,7 +1103,7 @@ nep_tx_proc(struct nep_softc *sc)
> > }
> >
> > if (sc->sc_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > void
> > @@ -1652,7 +1652,7 @@ nep_up(struct nep_softc *sc)
> >
> > ifp->if_flags |= IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Enable interrupts. */
> > nep_write(sc, LD_IM1(LDN_MAC(sc->sc_port)), 0);
> > @@ -1690,7 +1690,7 @@ nep_down(struct nep_softc *sc)
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > nep_disable_rx_mac(sc);
> >
> > @@ -1906,7 +1906,7 @@ nep_start(struct ifnet *ifp)
> > sc->sc_tx_prod = idx;
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > Index: sys/dev/pci/if_nfe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_nfe.c,v
> > retrieving revision 1.127
> > diff -u -p -r1.127 if_nfe.c
> > --- sys/dev/pci/if_nfe.c 31 Aug 2024 16:23:09 -0000 1.127
> > +++ sys/dev/pci/if_nfe.c 6 Jan 2026 00:38:48 -0000
> > @@ -834,7 +834,7 @@ nfe_txeof(struct nfe_softc *sc)
> > m_freem(data->m);
> > data->m = NULL;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > skip: sc->txq.queued--;
> > sc->txq.next = (sc->txq.next + 1) % NFE_TX_RING_COUNT;
> > @@ -994,7 +994,7 @@ nfe_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1121,7 +1121,7 @@ nfe_stop(struct ifnet *ifp, int disable)
> >
> > timeout_del(&sc->sc_tick_ch);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/pci/if_ngbe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ngbe.c,v
> > retrieving revision 1.8
> > diff -u -p -r1.8 if_ngbe.c
> > --- sys/dev/pci/if_ngbe.c 11 Nov 2025 17:43:18 -0000 1.8
> > +++ sys/dev/pci/if_ngbe.c 6 Jan 2026 00:38:48 -0000
> > @@ -734,7 +734,7 @@ ngbe_start(struct ifqueue *ifq)
> >
> > /* Set timeout in case hardware has problems transmitting */
> > txr->watchdog_timer = NGBE_TX_TIMEOUT;
> > - ifp->if_timer = NGBE_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, NGBE_TX_TIMEOUT);
> >
> > post = 1;
> > }
> > @@ -757,7 +757,7 @@ ngbe_stop(struct ngbe_softc *sc)
> >
> > /* Tell the stack that the interface is no longer active. */
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > ngbe_disable_pcie_master(sc);
> > /* Disable receives */
> > @@ -1753,7 +1753,7 @@ ngbe_initialize_transmit_unit(struct ngb
> > }
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > NGBE_WRITE_REG_MASK(hw, NGBE_TSEC_BUF_AE, 0x3ff, 0x10);
> > NGBE_WRITE_REG_MASK(hw, NGBE_TSEC_CTL, 0x2, 0);
> > @@ -4497,7 +4497,7 @@ ngbe_txeof(struct tx_ring *txr)
> > cons = 0;
> > if (prod == cons) {
> > /* All clean, turn off the timer */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > break;
> > }
> > }
> > Index: sys/dev/pci/if_nge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_nge.c,v
> > retrieving revision 1.99
> > diff -u -p -r1.99 if_nge.c
> > --- sys/dev/pci/if_nge.c 24 May 2024 06:02:56 -0000 1.99
> > +++ sys/dev/pci/if_nge.c 6 Jan 2026 00:38:48 -0000
> > @@ -1152,7 +1152,7 @@ nge_txeof(struct nge_softc *sc)
> > sc->nge_cdata.nge_tx_cons = idx;
> >
> > if (idx == sc->nge_cdata.nge_tx_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > void
> > @@ -1434,7 +1434,7 @@ nge_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1861,7 +1861,7 @@ nge_stop(struct nge_softc *sc)
> > struct mii_data *mii;
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (sc->nge_tbi) {
> > mii = NULL;
> > } else {
> > Index: sys/dev/pci/if_oce.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_oce.c,v
> > retrieving revision 1.109
> > diff -u -p -r1.109 if_oce.c
> > --- sys/dev/pci/if_oce.c 24 May 2024 06:02:56 -0000 1.109
> > +++ sys/dev/pci/if_oce.c 6 Jan 2026 00:38:48 -0000
> > @@ -1192,7 +1192,7 @@ oce_start(struct ifnet *ifp)
> >
> > /* Set a timeout in case the chip goes out to lunch */
> > if (pkts)
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > int
> > @@ -1446,7 +1446,7 @@ oce_intr_wq(void *arg)
> > }
> > }
> > if (wq->ring->nused == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (ncqe)
> > oce_arm_cq(cq, ncqe, FALSE);
> > Index: sys/dev/pci/if_pcn.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_pcn.c,v
> > retrieving revision 1.50
> > diff -u -p -r1.50 if_pcn.c
> > --- sys/dev/pci/if_pcn.c 24 May 2024 06:02:56 -0000 1.50
> > +++ sys/dev/pci/if_pcn.c 6 Jan 2026 00:38:48 -0000
> > @@ -953,7 +953,7 @@ pcn_start(struct ifnet *ifp)
> >
> > if (sc->sc_txfree != ofree) {
> > /* Set a watchdog timer in case the chip flakes out. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -1229,7 +1229,7 @@ pcn_txintr(struct pcn_softc *sc)
> > * timer.
> > */
> > if (sc->sc_txsfree == PCN_TXQUEUELEN)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > @@ -1683,7 +1683,7 @@ pcn_stop(struct ifnet *ifp, int disable)
> > /* Mark the interface as down and cancel the watchdog timer. */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Stop the chip. */
> > pcn_csr_write(sc, LE_CSR0, LE_C0_STOP);
> > Index: sys/dev/pci/if_rge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_rge.c,v
> > retrieving revision 1.41
> > diff -u -p -r1.41 if_rge.c
> > --- sys/dev/pci/if_rge.c 17 Nov 2025 08:59:22 -0000 1.41
> > +++ sys/dev/pci/if_rge.c 6 Jan 2026 00:38:48 -0000
> > @@ -652,7 +652,7 @@ rge_start(struct ifqueue *ifq)
> > return;
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > q->q_tx.rge_txq_prodidx = idx;
> > ifq_serialize(ifq, &sc->sc_task);
> > @@ -917,7 +917,7 @@ rge_stop(struct ifnet *ifp)
> >
> > timeout_del(&sc->sc_timeout);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > sc->rge_timerintr = 0;
> >
> > @@ -1508,7 +1508,7 @@ rge_txeof(struct rge_queues *q)
> > else if (free == 2)
> > ifq_serialize(&ifp->if_snd, &sc->sc_task);
> > else
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return (1);
> > }
> > Index: sys/dev/pci/if_se.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_se.c,v
> > retrieving revision 1.27
> > diff -u -p -r1.27 if_se.c
> > --- sys/dev/pci/if_se.c 5 Nov 2024 18:58:59 -0000 1.27
> > +++ sys/dev/pci/if_se.c 6 Jan 2026 00:38:48 -0000
> > @@ -1015,7 +1015,7 @@ se_txeof(struct se_softc *sc)
> >
> > cd->se_tx_cons = i;
> > if (cd->se_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > void
> > @@ -1232,7 +1232,7 @@ se_start(struct ifnet *ifp)
> > /* Transmit */
> > cd->se_tx_prod = i;
> > CSR_WRITE_4(sc, TX_CTL, 0x1a00 | TX_CTL_ENB | TX_CTL_POLL);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -1407,7 +1407,7 @@ se_stop(struct se_softc *sc)
> > {
> > struct ifnet *ifp = &sc->sc_ac.ac_if;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > timeout_del(&sc->sc_tick_tmo);
> > Index: sys/dev/pci/if_sis.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_sis.c,v
> > retrieving revision 1.146
> > diff -u -p -r1.146 if_sis.c
> > --- sys/dev/pci/if_sis.c 31 Aug 2024 16:23:09 -0000 1.146
> > +++ sys/dev/pci/if_sis.c 6 Jan 2026 00:38:48 -0000
> > @@ -1509,7 +1509,10 @@ sis_txeof(struct sis_softc *sc)
> > ifq_clr_oactive(&ifp->if_snd);
> > }
> >
> > - ifp->if_timer = (sc->sis_cdata.sis_tx_cnt == 0) ? 0 : 5;
> > + if (sc->sis_cdata.sis_tx_cnt == 0)
> > + if_watchdog_disable(ifp);
> > + else
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1710,7 +1713,7 @@ sis_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -1977,7 +1980,7 @@ sis_stop(struct sis_softc *sc)
> > return;
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->sis_timeout);
> >
> > Index: sys/dev/pci/if_sk.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_sk.c,v
> > retrieving revision 1.200
> > diff -u -p -r1.200 if_sk.c
> > --- sys/dev/pci/if_sk.c 5 Nov 2024 18:58:59 -0000 1.200
> > +++ sys/dev/pci/if_sk.c 6 Jan 2026 00:38:48 -0000
> > @@ -1527,7 +1527,7 @@ sk_start(struct ifnet *ifp)
> > CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_START);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = SK_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, SK_TX_TIMEOUT);
> > }
> >
> >
> > @@ -1685,7 +1685,10 @@ sk_txeof(struct sk_if_softc *sc_if)
> > sc_if->sk_cdata.sk_tx_cnt--;
> > SK_INC(idx, SK_TX_RING_CNT);
> > }
> > - ifp->if_timer = sc_if->sk_cdata.sk_tx_cnt > 0 ? SK_TX_TIMEOUT : 0;
> > + if (sc_if->sk_cdata.sk_tx_cnt > 0)
> > + if_watchdog_schedule(ifp, SK_TX_TIMEOUT);
> > + else
> > + if_watchdog_disable(ifp);
> >
> > if (sc_if->sk_cdata.sk_tx_cnt < SK_TX_RING_CNT - 2)
> > ifq_clr_oactive(&ifp->if_snd);
> > Index: sys/dev/pci/if_ste.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ste.c,v
> > retrieving revision 1.71
> > diff -u -p -r1.71 if_ste.c
> > --- sys/dev/pci/if_ste.c 24 May 2024 06:02:57 -0000 1.71
> > +++ sys/dev/pci/if_ste.c 6 Jan 2026 00:38:48 -0000
> > @@ -752,7 +752,7 @@ ste_txeof(struct ste_softc *sc)
> >
> > sc->ste_cdata.ste_tx_cons = idx;
> > if (idx == sc->ste_cdata.ste_tx_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > void
> > @@ -1366,7 +1366,7 @@ ste_start(struct ifnet *ifp)
> > #endif
> >
> > STE_INC(idx, STE_TX_LIST_CNT);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > sc->ste_cdata.ste_tx_prod = idx;
> > }
> > Index: sys/dev/pci/if_stge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_stge.c,v
> > retrieving revision 1.74
> > diff -u -p -r1.74 if_stge.c
> > --- sys/dev/pci/if_stge.c 24 May 2024 06:02:57 -0000 1.74
> > +++ sys/dev/pci/if_stge.c 6 Jan 2026 00:38:48 -0000
> > @@ -616,7 +616,7 @@ stge_start(struct ifnet *ifp)
> > sc->sc_txdirty = firsttx;
> >
> > /* Set a watchdog timer in case the chip flakes out. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -829,7 +829,7 @@ stge_txintr(struct stge_softc *sc)
> > * timer.
> > */
> > if (sc->sc_txpending == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -1335,7 +1335,7 @@ stge_stop(struct ifnet *ifp, int disable
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Down the MII. */
> > mii_down(&sc->sc_mii);
> > Index: sys/dev/pci/if_tl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_tl.c,v
> > retrieving revision 1.80
> > diff -u -p -r1.80 if_tl.c
> > --- sys/dev/pci/if_tl.c 15 Jul 2025 13:40:02 -0000 1.80
> > +++ sys/dev/pci/if_tl.c 6 Jan 2026 00:38:48 -0000
> > @@ -1170,7 +1170,7 @@ tl_intvec_txeoc(void *xsc, u_int32_t typ
> > ifp = &sc->arpcom.ac_if;
> >
> > /* Clear the timeout timer. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->tl_cdata.tl_tx_head == NULL) {
> > ifq_clr_oactive(&ifp->if_snd);
> > @@ -1526,7 +1526,7 @@ tl_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 10;
> > + if_watchdog_schedule(ifp, 10);
> > }
> >
> > void
> > Index: sys/dev/pci/if_txp.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_txp.c,v
> > retrieving revision 1.131
> > diff -u -p -r1.131 if_txp.c
> > --- sys/dev/pci/if_txp.c 24 May 2024 06:02:57 -0000 1.131
> > +++ sys/dev/pci/if_txp.c 6 Jan 2026 00:38:48 -0000
> > @@ -836,7 +836,7 @@ txp_tx_reclaim(struct txp_softc *sc, str
> > r->r_cons = cons;
> > r->r_cnt = cnt;
> > if (cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > int
> > @@ -1358,7 +1358,7 @@ txp_start(struct ifnet *ifp)
> >
> > }
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > #if NBPFILTER > 0
> > if (ifp->if_bpf)
> > @@ -1609,7 +1609,7 @@ txp_stop(struct txp_softc *sc)
> > /* Mark the interface as down and cancel the watchdog timer. */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > txp_command(sc, TXP_CMD_TX_DISABLE, 0, 0, 0, NULL, NULL, NULL, 1);
> > txp_command(sc, TXP_CMD_RX_DISABLE, 0, 0, 0, NULL, NULL, NULL, 1);
> > Index: sys/dev/pci/if_vge.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_vge.c,v
> > retrieving revision 1.78
> > diff -u -p -r1.78 if_vge.c
> > --- sys/dev/pci/if_vge.c 24 May 2024 06:02:57 -0000 1.78
> > +++ sys/dev/pci/if_vge.c 6 Jan 2026 00:38:48 -0000
> > @@ -1188,7 +1188,7 @@ vge_txeof(struct vge_softc *sc)
> > if (idx != sc->vge_ldata.vge_tx_considx) {
> > sc->vge_ldata.vge_tx_considx = idx;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > /*
> > @@ -1480,7 +1480,7 @@ vge_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > int
> > @@ -1799,7 +1799,7 @@ vge_stop(struct vge_softc *sc)
> > struct ifnet *ifp;
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->timer_handle);
> >
> > Index: sys/dev/pci/if_vmx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_vmx.c,v
> > retrieving revision 1.94
> > diff -u -p -r1.94 if_vmx.c
> > --- sys/dev/pci/if_vmx.c 11 Nov 2025 17:43:18 -0000 1.94
> > +++ sys/dev/pci/if_vmx.c 6 Jan 2026 00:38:49 -0000
> > @@ -1366,7 +1366,7 @@ vmxnet3_stop(struct ifnet *ifp)
> > int queue;
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > vmxnet3_disable_all_intrs(sc);
> >
> > Index: sys/dev/pci/if_vr.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_vr.c,v
> > retrieving revision 1.162
> > diff -u -p -r1.162 if_vr.c
> > --- sys/dev/pci/if_vr.c 31 Aug 2024 16:23:09 -0000 1.162
> > +++ sys/dev/pci/if_vr.c 6 Jan 2026 00:38:49 -0000
> > @@ -1040,7 +1040,7 @@ next:
> >
> > sc->vr_cdata.vr_tx_cons = cur_tx;
> > if (sc->vr_cdata.vr_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> >
> > void
> > @@ -1348,7 +1348,7 @@ vr_start(struct ifnet *ifp)
> > VR_SETBIT16(sc, VR_COMMAND, /*VR_CMD_TX_ON|*/VR_CMD_TX_GO);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -1593,7 +1593,7 @@ vr_stop(struct vr_softc *sc)
> > bus_dmamap_t map;
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->sc_to);
> > timeout_del(&sc->sc_rxto);
> > Index: sys/dev/pci/if_vte.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_vte.c,v
> > retrieving revision 1.28
> > diff -u -p -r1.28 if_vte.c
> > --- sys/dev/pci/if_vte.c 24 May 2024 06:02:57 -0000 1.28
> > +++ sys/dev/pci/if_vte.c 6 Jan 2026 00:38:49 -0000
> > @@ -693,7 +693,7 @@ vte_start(struct ifnet *ifp)
> > sc->vte_cdata.vte_tx_ring_map->dm_mapsize,
> > BUS_DMASYNC_PREWRITE);
> > CSR_WRITE_2(sc, VTE_TX_POLL, TX_POLL_START);
> > - ifp->if_timer = VTE_TX_TIMEOUT;
> > + if_watchdog_schedule(ifp, VTE_TX_TIMEOUT);
> > }
> > }
> >
> > @@ -921,7 +921,7 @@ vte_txeof(struct vte_softc *sc)
> > * frames in TX queue.
> > */
> > if (sc->vte_cdata.vte_tx_cnt == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > }
> > }
> >
> > @@ -1247,7 +1247,7 @@ vte_stop(struct vte_softc *sc)
> > */
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > sc->vte_flags &= ~VTE_FLAG_LINK;
> > timeout_del(&sc->vte_tick_ch);
> > vte_stats_update(sc);
> > Index: sys/dev/pci/if_wb.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_wb.c,v
> > retrieving revision 1.78
> > diff -u -p -r1.78 if_wb.c
> > --- sys/dev/pci/if_wb.c 6 Sep 2024 10:54:08 -0000 1.78
> > +++ sys/dev/pci/if_wb.c 6 Jan 2026 00:38:49 -0000
> > @@ -973,7 +973,7 @@ wb_txeof(struct wb_softc *sc)
> > ifp = &sc->arpcom.ac_if;
> >
> > /* Clear the timeout timer. */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->wb_cdata.wb_tx_head == NULL)
> > return;
> > @@ -1026,7 +1026,7 @@ wb_txeoc(struct wb_softc *sc)
> >
> > ifp = &sc->arpcom.ac_if;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->wb_cdata.wb_tx_head == NULL) {
> > ifq_clr_oactive(&ifp->if_snd);
> > @@ -1034,7 +1034,7 @@ wb_txeoc(struct wb_softc *sc)
> > } else {
> > if (WB_TXOWN(sc->wb_cdata.wb_tx_head) == WB_UNSENT) {
> > WB_TXOWN(sc->wb_cdata.wb_tx_head) = WB_TXSTAT_OWN;
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > CSR_WRITE_4(sc, WB_TXSTART, 0xFFFFFFFF);
> > }
> > }
> > @@ -1317,7 +1317,7 @@ wb_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > return;
> > }
> > @@ -1544,7 +1544,7 @@ wb_stop(struct wb_softc *sc)
> > struct ifnet *ifp;
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > timeout_del(&sc->wb_tick_tmo);
> >
> > Index: sys/dev/pci/if_wpi.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v
> > retrieving revision 1.158
> > diff -u -p -r1.158 if_wpi.c
> > --- sys/dev/pci/if_wpi.c 24 May 2024 06:02:57 -0000 1.158
> > +++ sys/dev/pci/if_wpi.c 6 Jan 2026 00:38:49 -0000
> > @@ -1926,7 +1926,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1935,7 +1935,7 @@ wpi_watchdog(struct ifnet *ifp)
> > {
> > struct wpi_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1944,7 +1944,7 @@ wpi_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -3298,7 +3298,8 @@ wpi_stop(struct ifnet *ifp, int disable)
> > struct wpi_softc *sc = ifp->if_softc;
> > struct ieee80211com *ic = &sc->sc_ic;
> >
> > - ifp->if_timer = sc->sc_tx_timer = 0;
> > + sc->sc_tx_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/pcmcia/if_an_pcmcia.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_an_pcmcia.c,v
> > retrieving revision 1.28
> > diff -u -p -r1.28 if_an_pcmcia.c
> > --- sys/dev/pcmcia/if_an_pcmcia.c 26 May 2024 08:46:28 -0000 1.28
> > +++ sys/dev/pcmcia/if_an_pcmcia.c 6 Jan 2026 00:39:00 -0000
> > @@ -172,7 +172,7 @@ an_pcmcia_activate(struct device *dev, i
> >
> > switch (act) {
> > case DVACT_DEACTIVATE:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING)
> > an_stop(ifp, 1);
> > if (sc->sc_ih)
> > Index: sys/dev/pcmcia/if_ep_pcmcia.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_ep_pcmcia.c,v
> > retrieving revision 1.52
> > diff -u -p -r1.52 if_ep_pcmcia.c
> > --- sys/dev/pcmcia/if_ep_pcmcia.c 26 May 2024 08:46:28 -0000 1.52
> > +++ sys/dev/pcmcia/if_ep_pcmcia.c 6 Jan 2026 00:39:00 -0000
> > @@ -375,7 +375,7 @@ ep_pcmcia_activate(struct device *dev, i
> >
> > switch (act) {
> > case DVACT_SUSPEND:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING)
> > epstop(esc);
> > if (sc->sc_ep.sc_ih)
> > Index: sys/dev/pcmcia/if_malo.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_malo.c,v
> > retrieving revision 1.100
> > diff -u -p -r1.100 if_malo.c
> > --- sys/dev/pcmcia/if_malo.c 26 May 2024 08:46:28 -0000 1.100
> > +++ sys/dev/pcmcia/if_malo.c 6 Jan 2026 00:39:00 -0000
> > @@ -729,7 +729,7 @@ cmalo_stop(struct malo_softc *sc)
> > /* reset device */
> > cmalo_cmd_set_reset(sc);
> > sc->sc_flags &= ~MALO_FW_LOADED;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > DPRINTF(1, "%s: device down\n", sc->sc_dev.dv_xname);
> > }
> > @@ -1034,7 +1034,7 @@ cmalo_tx(struct malo_softc *sc, struct m
> > MALO_WRITE_2(sc, MALO_REG_CARD_INTR_CAUSE, MALO_VAL_TX_DL_OVER);
> >
> > ifq_set_oactive(&ifp->if_snd);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > DPRINTF(2, "%s: TX status=%d, pkglen=%d, pkgoffset=%d\n",
> > sc->sc_dev.dv_xname, txdesc->status, letoh16(txdesc->pkglen),
> > @@ -1053,7 +1053,7 @@ cmalo_tx_done(struct malo_softc *sc)
> > DPRINTF(2, "%s: TX done\n", sc->sc_dev.dv_xname);
> >
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > cmalo_start(ifp);
> > }
> >
> > Index: sys/dev/pcmcia/if_ne_pcmcia.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_ne_pcmcia.c,v
> > retrieving revision 1.103
> > diff -u -p -r1.103 if_ne_pcmcia.c
> > --- sys/dev/pcmcia/if_ne_pcmcia.c 26 May 2024 08:46:28 -0000 1.103
> > +++ sys/dev/pcmcia/if_ne_pcmcia.c 6 Jan 2026 00:39:00 -0000
> > @@ -858,7 +858,7 @@ ne_pcmcia_activate(struct device *dev, i
> >
> > switch (act) {
> > case DVACT_SUSPEND:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING) {
> > dp8390_stop(esc);
> > ifp->if_flags &= ~IFF_RUNNING;
> > @@ -877,7 +877,7 @@ ne_pcmcia_activate(struct device *dev, i
> > dp8390_init(esc);
> > break;
> > case DVACT_DEACTIVATE:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING) {
> > dp8390_stop(esc);
> > ifp->if_flags &= ~IFF_RUNNING;
> > Index: sys/dev/pcmcia/if_sm_pcmcia.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_sm_pcmcia.c,v
> > retrieving revision 1.41
> > diff -u -p -r1.41 if_sm_pcmcia.c
> > --- sys/dev/pcmcia/if_sm_pcmcia.c 26 May 2024 08:46:28 -0000 1.41
> > +++ sys/dev/pcmcia/if_sm_pcmcia.c 6 Jan 2026 00:39:00 -0000
> > @@ -225,7 +225,7 @@ sm_pcmcia_activate(struct device *dev, i
> >
> > switch (act) {
> > case DVACT_DEACTIVATE:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING)
> > smc91cxx_stop(&sc->sc_smc);
> > if (sc->sc_ih)
> > Index: sys/dev/pcmcia/if_wi_pcmcia.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_wi_pcmcia.c,v
> > retrieving revision 1.77
> > diff -u -p -r1.77 if_wi_pcmcia.c
> > --- sys/dev/pcmcia/if_wi_pcmcia.c 26 May 2024 08:46:28 -0000 1.77
> > +++ sys/dev/pcmcia/if_wi_pcmcia.c 6 Jan 2026 00:39:00 -0000
> > @@ -470,7 +470,7 @@ wi_pcmcia_activate(struct device *dev, i
> >
> > switch (act) {
> > case DVACT_SUSPEND:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifp->if_flags & IFF_RUNNING)
> > wi_stop(sc);
> > sc->wi_flags &= ~WI_FLAGS_INITIALIZED;
> > Index: sys/dev/pcmcia/if_xe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pcmcia/if_xe.c,v
> > retrieving revision 1.64
> > diff -u -p -r1.64 if_xe.c
> > --- sys/dev/pcmcia/if_xe.c 26 May 2024 08:46:28 -0000 1.64
> > +++ sys/dev/pcmcia/if_xe.c 6 Jan 2026 00:39:00 -0000
> > @@ -464,7 +464,7 @@ xe_pcmcia_activate(struct device *dev, i
> > xe_stop(&sc->sc_xe);
> > break;
> > case DVACT_DEACTIVATE:
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > if (sc->sc_xe.sc_ih)
> > pcmcia_intr_disestablish(sc->sc_pf, sc->sc_xe.sc_ih);
> > @@ -615,7 +615,7 @@ xe_intr(void *arg)
> > u_int8_t esr, rsr, isr, rx_status, savedpage;
> > u_int16_t tx_status, recvcount = 0, tempint;
> >
> > - ifp->if_timer = 0; /* turn watchdog timer off */
> > + if_watchdog_disable(ifp); /* turn watchdog timer off */
> >
> > if (sc->sc_flags & XEF_MOHAWK) {
> > /* Disable interrupt (Linux does it). */
> > @@ -1003,7 +1003,7 @@ xe_stop(struct xe_softc *sc)
> > DELAY(40000);
> >
> > /* Cancel watchdog timer. */
> > - sc->sc_arpcom.ac_if.if_timer = 0;
> > + if_watchdog_disable(&sc->sc_arpcom.ac_if);
> > }
> >
> > void
> > @@ -1106,7 +1106,7 @@ xe_start(struct ifnet *ifp)
> >
> > splx(s);
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > int
> > Index: sys/dev/pv/if_xnf.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pv/if_xnf.c,v
> > retrieving revision 1.70
> > diff -u -p -r1.70 if_xnf.c
> > --- sys/dev/pv/if_xnf.c 24 May 2024 10:05:55 -0000 1.70
> > +++ sys/dev/pv/if_xnf.c 6 Jan 2026 00:39:00 -0000
> > @@ -467,7 +467,7 @@ xnf_stop(struct xnf_softc *sc)
> >
> > xen_intr_mask(sc->sc_xih);
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > ifq_barrier(&ifp->if_snd);
> > xen_intr_barrier(sc->sc_xih);
> > @@ -529,7 +529,7 @@ xnf_start(struct ifqueue *ifq)
> > BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
> > if (prod - txr->txr_prod_event < prod - oprod)
> > xen_intr_signal(sc->sc_xih);
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -735,7 +735,7 @@ xnf_txeof(struct xnf_softc *sc)
> > atomic_add_int(&sc->sc_tx_avail, done);
> >
> > if (sc->sc_tx_cons == txr->txr_prod)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > }
> > Index: sys/dev/sbus/be.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/sbus/be.c,v
> > retrieving revision 1.45
> > diff -u -p -r1.45 be.c
> > --- sys/dev/sbus/be.c 13 May 2024 01:15:53 -0000 1.45
> > +++ sys/dev/sbus/be.c 6 Jan 2026 00:39:00 -0000
> > @@ -861,7 +861,7 @@ betint(struct be_softc *sc)
> > bestart(ifp);
> >
> > if (sc->sc_rb.rb_td_nbusy == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > return (1);
> > }
> > Index: sys/dev/sbus/qe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/sbus/qe.c,v
> > retrieving revision 1.43
> > diff -u -p -r1.43 qe.c
> > --- sys/dev/sbus/qe.c 16 Oct 2022 01:22:40 -0000 1.43
> > +++ sys/dev/sbus/qe.c 6 Jan 2026 00:39:00 -0000
> > @@ -617,7 +617,7 @@ qe_tint(struct qe_softc *sc)
> > }
> >
> > if (sc->sc_rb.rb_td_nbusy == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_rb.rb_tdtail != bix) {
> > sc->sc_rb.rb_tdtail = bix;
> > Index: sys/dev/usb/if_athn_usb.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_athn_usb.c,v
> > retrieving revision 1.67
> > diff -u -p -r1.67 if_athn_usb.c
> > --- sys/dev/usb/if_athn_usb.c 29 May 2024 07:27:33 -0000 1.67
> > +++ sys/dev/usb/if_athn_usb.c 6 Jan 2026 00:39:00 -0000
> > @@ -2455,7 +2455,7 @@ athn_usb_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -2464,7 +2464,7 @@ athn_usb_watchdog(struct ifnet *ifp)
> > {
> > struct athn_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -2473,7 +2473,7 @@ athn_usb_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > ieee80211_watchdog(ifp);
> > }
> > @@ -2702,7 +2702,7 @@ athn_usb_stop(struct ifnet *ifp)
> > int s;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_atu.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_atu.c,v
> > retrieving revision 1.135
> > diff -u -p -r1.135 if_atu.c
> > --- sys/dev/usb/if_atu.c 23 May 2024 03:21:08 -0000 1.135
> > +++ sys/dev/usb/if_atu.c 6 Jan 2026 00:39:00 -0000
> > @@ -1791,7 +1791,7 @@ atu_txeof(struct usbd_xfer *xfer, void *
> > SLIST_INSERT_HEAD(&sc->atu_cdata.atu_tx_free, c, atu_list);
> > sc->atu_cdata.atu_tx_inuse--;
> > if (sc->atu_cdata.atu_tx_inuse == 0)
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> > splx(s);
> >
> > @@ -2002,7 +2002,7 @@ bad:
> > ieee80211_release_node(ic, ni);
> > continue;
> > }
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> > }
> >
> > @@ -2197,7 +2197,7 @@ atu_watchdog(struct ifnet *ifp)
> >
> > DPRINTF(("%s: atu_watchdog\n", sc->atu_dev.dv_xname));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if ((ifp->if_flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP))
> > return;
> > @@ -2245,7 +2245,7 @@ atu_stop(struct ifnet *ifp, int disable)
> > s = splnet();
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > /* Stop transfers. */
> > if (sc->atu_ep[ATU_ENDPT_RX] != NULL) {
> > Index: sys/dev/usb/if_aue.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_aue.c,v
> > retrieving revision 1.113
> > diff -u -p -r1.113 if_aue.c
> > --- sys/dev/usb/if_aue.c 23 May 2024 03:21:08 -0000 1.113
> > +++ sys/dev/usb/if_aue.c 6 Jan 2026 00:39:00 -0000
> > @@ -1092,7 +1092,7 @@ aue_txeof(struct usbd_xfer *xfer, void *
> > DPRINTFN(10,("%s: %s: enter status=%d\n", sc->aue_dev.dv_xname,
> > __func__, status));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -1263,7 +1263,7 @@ aue_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1505,7 +1505,7 @@ aue_stop(struct aue_softc *sc)
> > DPRINTFN(5,("%s: %s: enter\n", sc->aue_dev.dv_xname, __func__));
> >
> > ifp = GET_IFP(sc);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_axe.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_axe.c,v
> > retrieving revision 1.144
> > diff -u -p -r1.144 if_axe.c
> > --- sys/dev/usb/if_axe.c 4 Sep 2024 07:54:52 -0000 1.144
> > +++ sys/dev/usb/if_axe.c 6 Jan 2026 00:39:00 -0000
> > @@ -1115,7 +1115,7 @@ axe_txeof(struct usbd_xfer *xfer, void *
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > m_freem(c->axe_mbuf);
> > @@ -1269,7 +1269,7 @@ axe_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > return;
> > }
> > @@ -1463,7 +1463,7 @@ axe_stop(struct axe_softc *sc)
> > axe_reset(sc);
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_axen.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_axen.c,v
> > retrieving revision 1.34
> > diff -u -p -r1.34 if_axen.c
> > --- sys/dev/usb/if_axen.c 7 Oct 2024 07:35:40 -0000 1.34
> > +++ sys/dev/usb/if_axen.c 6 Jan 2026 00:39:00 -0000
> > @@ -1108,7 +1108,7 @@ axen_txeof(struct usbd_xfer *xfer, void
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > m_freem(c->axen_mbuf);
> > @@ -1265,7 +1265,7 @@ axen_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1449,7 +1449,7 @@ axen_stop(struct axen_softc *sc)
> > axen_reset(sc);
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_cdce.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_cdce.c,v
> > retrieving revision 1.83
> > diff -u -p -r1.83 if_cdce.c
> > --- sys/dev/usb/if_cdce.c 23 May 2024 03:21:08 -0000 1.83
> > +++ sys/dev/usb/if_cdce.c 6 Jan 2026 00:39:00 -0000
> > @@ -390,7 +390,7 @@ cdce_start(struct ifnet *ifp)
> >
> > ifq_set_oactive(&ifp->if_snd);
> >
> > - ifp->if_timer = 6;
> > + if_watchdog_schedule(ifp, 6);
> > }
> >
> > int
> > @@ -435,7 +435,7 @@ cdce_stop(struct cdce_softc *sc)
> > struct ifnet *ifp = GET_IFP(sc);
> > int i;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -780,7 +780,7 @@ cdce_txeof(struct usbd_xfer *xfer, void
> >
> > s = splnet();
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > Index: sys/dev/usb/if_cue.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_cue.c,v
> > retrieving revision 1.81
> > diff -u -p -r1.81 if_cue.c
> > --- sys/dev/usb/if_cue.c 23 May 2024 03:21:08 -0000 1.81
> > +++ sys/dev/usb/if_cue.c 6 Jan 2026 00:39:00 -0000
> > @@ -751,7 +751,7 @@ cue_txeof(struct usbd_xfer *xfer, void *
> > DPRINTFN(10,("%s: %s: enter status=%d\n", sc->cue_dev.dv_xname,
> > __func__, status));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -899,7 +899,7 @@ cue_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1117,7 +1117,7 @@ cue_stop(struct cue_softc *sc)
> > DPRINTFN(10,("%s: %s: enter\n", sc->cue_dev.dv_xname,__func__));
> >
> > ifp = GET_IFP(sc);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_kue.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_kue.c,v
> > retrieving revision 1.93
> > diff -u -p -r1.93 if_kue.c
> > --- sys/dev/usb/if_kue.c 23 May 2024 03:21:08 -0000 1.93
> > +++ sys/dev/usb/if_kue.c 6 Jan 2026 00:39:00 -0000
> > @@ -766,7 +766,7 @@ kue_txeof(struct usbd_xfer *xfer, void *
> > DPRINTFN(10,("%s: %s: enter status=%d\n", sc->kue_dev.dv_xname,
> > __func__, status));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -875,7 +875,7 @@ kue_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 6;
> > + if_watchdog_schedule(ifp, 6);
> > }
> >
> > void
> > @@ -1090,7 +1090,7 @@ kue_stop(struct kue_softc *sc)
> > DPRINTFN(5,("%s: %s: enter\n", sc->kue_dev.dv_xname,__func__));
> >
> > ifp = GET_IFP(sc);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_mos.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_mos.c,v
> > retrieving revision 1.44
> > diff -u -p -r1.44 if_mos.c
> > --- sys/dev/usb/if_mos.c 23 May 2024 03:21:08 -0000 1.44
> > +++ sys/dev/usb/if_mos.c 6 Jan 2026 00:39:00 -0000
> > @@ -1003,7 +1003,7 @@ mos_txeof(struct usbd_xfer *xfer, void *
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > m_freem(c->mos_mbuf);
> > @@ -1142,7 +1142,7 @@ mos_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > return;
> > }
> > @@ -1323,7 +1323,7 @@ mos_stop(struct mos_softc *sc)
> > mos_reset(sc);
> >
> > ifp = &sc->arpcom.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_mtw.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_mtw.c,v
> > retrieving revision 1.12
> > diff -u -p -r1.12 if_mtw.c
> > --- sys/dev/usb/if_mtw.c 28 Mar 2025 23:17:00 -0000 1.12
> > +++ sys/dev/usb/if_mtw.c 6 Jan 2026 00:39:00 -0000
> > @@ -2450,7 +2450,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -2459,7 +2459,7 @@ mtw_watchdog(struct ifnet *ifp)
> > {
> > struct mtw_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -2468,7 +2468,7 @@ mtw_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -3316,7 +3316,7 @@ mtw_stop(struct ifnet *ifp, int disable)
> > mtw_set_leds(sc, MTW_LED_MODE_ON);
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_mue.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_mue.c,v
> > retrieving revision 1.12
> > diff -u -p -r1.12 if_mue.c
> > --- sys/dev/usb/if_mue.c 23 May 2024 03:21:08 -0000 1.12
> > +++ sys/dev/usb/if_mue.c 6 Jan 2026 00:39:00 -0000
> > @@ -1168,7 +1168,7 @@ mue_txeof(struct usbd_xfer *xfer, void *
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > m_freem(c->mue_mbuf);
> > @@ -1333,7 +1333,7 @@ mue_start(struct ifnet *ifp)
> > ifq_set_oactive(&ifp->if_snd);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -1344,7 +1344,7 @@ mue_stop(struct mue_softc *sc)
> > int i;
> >
> > ifp = GET_IFP(sc);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_otus.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_otus.c,v
> > retrieving revision 1.73
> > diff -u -p -r1.73 if_otus.c
> > --- sys/dev/usb/if_otus.c 23 May 2024 03:21:08 -0000 1.73
> > +++ sys/dev/usb/if_otus.c 6 Jan 2026 00:39:00 -0000
> > @@ -1442,7 +1442,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1451,7 +1451,7 @@ otus_watchdog(struct ifnet *ifp)
> > {
> > struct otus_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1460,7 +1460,7 @@ otus_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > ieee80211_watchdog(ifp);
> > }
> > @@ -2309,7 +2309,7 @@ otus_stop(struct ifnet *ifp)
> > int s;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_ral.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_ral.c,v
> > retrieving revision 1.150
> > diff -u -p -r1.150 if_ral.c
> > --- sys/dev/usb/if_ral.c 23 May 2024 03:21:08 -0000 1.150
> > +++ sys/dev/usb/if_ral.c 6 Jan 2026 00:39:00 -0000
> > @@ -1252,7 +1252,7 @@ ural_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1261,7 +1261,7 @@ ural_watchdog(struct ifnet *ifp)
> > {
> > struct ural_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1270,7 +1270,7 @@ ural_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2040,7 +2040,7 @@ ural_stop(struct ifnet *ifp, int disable
> > struct ieee80211com *ic = &sc->sc_ic;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_rsu.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_rsu.c,v
> > retrieving revision 1.53
> > diff -u -p -r1.53 if_rsu.c
> > --- sys/dev/usb/if_rsu.c 23 May 2024 03:21:08 -0000 1.53
> > +++ sys/dev/usb/if_rsu.c 6 Jan 2026 00:39:00 -0000
> > @@ -1667,7 +1667,7 @@ rsu_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1676,7 +1676,7 @@ rsu_watchdog(struct ifnet *ifp)
> > {
> > struct rsu_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1685,7 +1685,7 @@ rsu_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > ieee80211_watchdog(ifp);
> > }
> > @@ -2319,7 +2319,7 @@ rsu_stop(struct ifnet *ifp)
> > int i, s;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_rum.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_rum.c,v
> > retrieving revision 1.129
> > diff -u -p -r1.129 if_rum.c
> > --- sys/dev/usb/if_rum.c 23 May 2024 03:21:08 -0000 1.129
> > +++ sys/dev/usb/if_rum.c 6 Jan 2026 00:39:00 -0000
> > @@ -1268,7 +1268,7 @@ rum_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1277,7 +1277,7 @@ rum_watchdog(struct ifnet *ifp)
> > {
> > struct rum_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1286,7 +1286,7 @@ rum_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2064,7 +2064,7 @@ rum_stop(struct ifnet *ifp, int disable)
> > uint32_t tmp;
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_run.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_run.c,v
> > retrieving revision 1.140
> > diff -u -p -r1.140 if_run.c
> > --- sys/dev/usb/if_run.c 23 May 2024 03:21:08 -0000 1.140
> > +++ sys/dev/usb/if_run.c 6 Jan 2026 00:39:00 -0000
> > @@ -2577,7 +2577,7 @@ sendit:
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -2586,7 +2586,7 @@ run_watchdog(struct ifnet *ifp)
> > {
> > struct run_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -2595,7 +2595,7 @@ run_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -4744,7 +4744,7 @@ run_stop(struct ifnet *ifp, int disable)
> > run_set_leds(sc, 0); /* turn all LEDs off */
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_smsc.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_smsc.c,v
> > retrieving revision 1.39
> > diff -u -p -r1.39 if_smsc.c
> > --- sys/dev/usb/if_smsc.c 23 May 2024 03:21:08 -0000 1.39
> > +++ sys/dev/usb/if_smsc.c 6 Jan 2026 00:39:00 -0000
> > @@ -688,7 +688,7 @@ smsc_stop(struct smsc_softc *sc)
> > smsc_reset(sc);
> >
> > ifp = &sc->sc_ac.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -1287,7 +1287,7 @@ smsc_txeof(struct usbd_xfer *xfer, void
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > m_freem(c->sc_mbuf);
> > Index: sys/dev/usb/if_uaq.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_uaq.c,v
> > retrieving revision 1.6
> > diff -u -p -r1.6 if_uaq.c
> > --- sys/dev/usb/if_uaq.c 23 May 2024 03:21:08 -0000 1.6
> > +++ sys/dev/usb/if_uaq.c 6 Jan 2026 00:39:00 -0000
> > @@ -895,7 +895,7 @@ uaq_stop(struct uaq_softc *sc)
> > usbd_status err;
> >
> > ifp = &sc->sc_ac.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -1200,7 +1200,7 @@ uaq_watchdog(struct ifnet *ifp)
> > usbd_status err;
> > int i, s;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (usbd_is_dying(sc->sc_udev))
> > return;
> > @@ -1273,7 +1273,7 @@ uaq_txeof(struct usbd_xfer *xfer, void *
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > splx(s);
> > @@ -1342,7 +1342,7 @@ uaq_start(struct ifnet *ifp)
> > }
> > c = SLIST_FIRST(&cd->uaq_tx_free);
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > if (c == NULL)
> > ifq_set_oactive(&ifp->if_snd);
> > }
> > Index: sys/dev/usb/if_uath.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_uath.c,v
> > retrieving revision 1.89
> > diff -u -p -r1.89 if_uath.c
> > --- sys/dev/usb/if_uath.c 23 May 2024 03:21:08 -0000 1.89
> > +++ sys/dev/usb/if_uath.c 6 Jan 2026 00:39:00 -0000
> > @@ -1500,7 +1500,7 @@ uath_start(struct ifnet *ifp)
> > }
> >
> > sc->sc_tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -1509,7 +1509,7 @@ uath_watchdog(struct ifnet *ifp)
> > {
> > struct uath_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_tx_timer > 0) {
> > if (--sc->sc_tx_timer == 0) {
> > @@ -1518,7 +1518,7 @@ uath_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -1931,7 +1931,7 @@ uath_stop(struct ifnet *ifp, int disable
> > s = splusb();
> >
> > sc->sc_tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_udav.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_udav.c,v
> > retrieving revision 1.86
> > diff -u -p -r1.86 if_udav.c
> > --- sys/dev/usb/if_udav.c 23 May 2024 03:21:09 -0000 1.86
> > +++ sys/dev/usb/if_udav.c 6 Jan 2026 00:39:00 -0000
> > @@ -932,7 +932,7 @@ udav_start(struct ifnet *ifp)
> > ifq_set_oactive(&ifp->if_snd);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > int
> > @@ -1002,7 +1002,7 @@ udav_txeof(struct usbd_xfer *xfer, void
> >
> > DPRINTF(("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -1213,7 +1213,7 @@ udav_stop(struct ifnet *ifp, int disable
> >
> > DPRINTF(("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_ugl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_ugl.c,v
> > retrieving revision 1.28
> > diff -u -p -r1.28 if_ugl.c
> > --- sys/dev/usb/if_ugl.c 23 May 2024 03:21:09 -0000 1.28
> > +++ sys/dev/usb/if_ugl.c 6 Jan 2026 00:39:00 -0000
> > @@ -505,7 +505,7 @@ ugl_txeof(struct usbd_xfer *xfer, void *
> > DPRINTFN(10,("%s: %s: enter status=%d\n", sc->sc_dev.dv_xname,
> > __func__, status));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -611,7 +611,7 @@ ugl_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -808,7 +808,7 @@ ugl_stop(struct ugl_softc *sc)
> > DPRINTFN(10,("%s: %s: enter\n", sc->sc_dev.dv_xname,__func__));
> >
> > ifp = GET_IFP(sc);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_umb.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_umb.c,v
> > retrieving revision 1.67
> > diff -u -p -r1.67 if_umb.c
> > --- sys/dev/usb/if_umb.c 17 Nov 2025 11:19:21 -0000 1.67
> > +++ sys/dev/usb/if_umb.c 6 Jan 2026 00:39:00 -0000
> > @@ -854,7 +854,7 @@ umb_close_bulkpipes(struct umb_softc *sc
> >
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (sc->sc_rx_pipe) {
> > usbd_close_pipe(sc->sc_rx_pipe);
> > sc->sc_rx_pipe = NULL;
> > @@ -1044,7 +1044,7 @@ umb_start(struct ifnet *ifp)
> > return;
> > if (umb_encap(sc, ndgram)) {
> > ifq_set_oactive(&ifp->if_snd);
> > - ifp->if_timer = (2 * umb_xfer_tout) / 1000;
> > + if_watchdog_schedule(ifp, (2 * umb_xfer_tout) / 1000);
> > }
> > }
> >
> > @@ -2408,7 +2408,7 @@ umb_txeof(struct usbd_xfer *xfer, void *
> > s = splnet();
> > ml_purge(&sc->sc_tx_ml);
> > ifq_clr_oactive(&ifp->if_snd);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > if (status != USBD_NOT_STARTED && status != USBD_CANCELLED) {
> > Index: sys/dev/usb/if_upgt.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_upgt.c,v
> > retrieving revision 1.90
> > diff -u -p -r1.90 if_upgt.c
> > --- sys/dev/usb/if_upgt.c 23 May 2024 03:21:09 -0000 1.90
> > +++ sys/dev/usb/if_upgt.c 6 Jan 2026 00:39:00 -0000
> > @@ -1209,7 +1209,7 @@ upgt_stop(struct upgt_softc *sc)
> > DPRINTF(1, "%s: %s\n", sc->sc_dev.dv_xname, __func__);
> >
> > /* device down */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -1400,7 +1400,7 @@ upgt_start(struct ifnet *ifp)
> > DPRINTF(2, "%s: tx_queued=%d\n",
> > sc->sc_dev.dv_xname, sc->tx_queued);
> > /* process the TX queue in process context */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > ifq_set_oactive(&ifp->if_snd);
> > usb_rem_task(sc->sc_udev, &sc->sc_task_tx);
> > usb_add_task(sc->sc_udev, &sc->sc_task_tx);
> > @@ -1601,7 +1601,7 @@ upgt_tx_done(struct upgt_softc *sc, uint
> >
> > if (sc->tx_queued == 0) {
> > /* TX queued was processed, continue */
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> > upgt_start(ifp);
> > }
> > Index: sys/dev/usb/if_upl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_upl.c,v
> > retrieving revision 1.80
> > diff -u -p -r1.80 if_upl.c
> > --- sys/dev/usb/if_upl.c 23 May 2024 03:21:09 -0000 1.80
> > +++ sys/dev/usb/if_upl.c 6 Jan 2026 00:39:00 -0000
> > @@ -487,7 +487,7 @@ upl_txeof(struct usbd_xfer *xfer, void *
> > DPRINTFN(10,("%s: %s: enter status=%d\n", sc->sc_dev.dv_xname,
> > __func__, status));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -591,7 +591,7 @@ upl_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > void
> > @@ -810,7 +810,7 @@ upl_stop(struct upl_softc *sc)
> > DPRINTFN(10,("%s: %s: enter\n", sc->sc_dev.dv_xname,__func__));
> >
> > ifp = &sc->sc_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_ure.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_ure.c,v
> > retrieving revision 1.37
> > diff -u -p -r1.37 if_ure.c
> > --- sys/dev/usb/if_ure.c 4 Jun 2025 00:06:17 -0000 1.37
> > +++ sys/dev/usb/if_ure.c 6 Jan 2026 00:39:00 -0000
> > @@ -973,7 +973,7 @@ ure_watchdog(struct ifnet *ifp)
> > usbd_status err;
> > int i, s;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (usbd_is_dying(sc->ure_udev))
> > return;
> > @@ -1179,7 +1179,7 @@ ure_start(struct ifnet *ifp)
> > }
> > }
> >
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > if (c == NULL)
> > ifq_set_oactive(&ifp->if_snd);
> > splx(s);
> > @@ -1209,7 +1209,7 @@ ure_stop(struct ure_softc *sc)
> > ure_reset(sc);
> >
> > ifp = &sc->ure_ac.ac_if;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -2503,7 +2503,7 @@ ure_txeof(struct usbd_xfer *xfer, void *
> > return;
> > }
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > if (ifq_is_oactive(&ifp->if_snd))
> > ifq_restart(&ifp->if_snd);
> > splx(s);
> > Index: sys/dev/usb/if_url.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_url.c,v
> > retrieving revision 1.90
> > diff -u -p -r1.90 if_url.c
> > --- sys/dev/usb/if_url.c 23 May 2024 03:21:09 -0000 1.90
> > +++ sys/dev/usb/if_url.c 6 Jan 2026 00:39:00 -0000
> > @@ -798,7 +798,7 @@ url_start(struct ifnet *ifp)
> > ifq_set_oactive(&ifp->if_snd);
> >
> > /* Set a timeout in case the chip goes out to lunch. */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> > }
> >
> > int
> > @@ -861,7 +861,7 @@ url_txeof(struct usbd_xfer *xfer, void *
> >
> > DPRINTF(("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > @@ -1073,7 +1073,7 @@ url_stop(struct ifnet *ifp, int disable)
> >
> > DPRINTF(("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__));
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/dev/usb/if_urndis.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_urndis.c,v
> > retrieving revision 1.74
> > diff -u -p -r1.74 if_urndis.c
> > --- sys/dev/usb/if_urndis.c 23 May 2024 03:21:09 -0000 1.74
> > +++ sys/dev/usb/if_urndis.c 6 Jan 2026 00:39:00 -0000
> > @@ -1129,7 +1129,7 @@ urndis_stop(struct urndis_softc *sc)
> > int i;
> >
> > ifp = GET_IFP(sc);
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > @@ -1207,7 +1207,7 @@ urndis_start(struct ifnet *ifp)
> > /*
> > * Set a timeout in case the chip goes out to lunch.
> > */
> > - ifp->if_timer = 5;
> > + if_watchdog_schedule(ifp, 5);
> >
> > return;
> > }
> > @@ -1277,7 +1277,7 @@ urndis_txeof(struct usbd_xfer *xfer,
> >
> > s = splnet();
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > if (status != USBD_NORMAL_COMPLETION) {
> > Index: sys/dev/usb/if_urtw.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_urtw.c,v
> > retrieving revision 1.74
> > diff -u -p -r1.74 if_urtw.c
> > --- sys/dev/usb/if_urtw.c 1 Sep 2024 03:09:00 -0000 1.74
> > +++ sys/dev/usb/if_urtw.c 6 Jan 2026 00:39:01 -0000
> > @@ -2291,7 +2291,7 @@ urtw_init(struct ifnet *ifp)
> > ifq_clr_oactive(&ifp->if_snd);
> > ifp->if_flags |= IFF_RUNNING;
> >
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> >
> > if (ic->ic_opmode == IEEE80211_M_MONITOR)
> > ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
> > @@ -2468,7 +2468,7 @@ urtw_watchdog(struct ifnet *ifp)
> > {
> > struct urtw_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->sc_txtimer > 0) {
> > if (--sc->sc_txtimer == 0) {
> > @@ -2476,7 +2476,7 @@ urtw_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -3692,7 +3692,7 @@ urtw_8187b_init(struct ifnet *ifp)
> > ifp->if_flags |= IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> >
> > if (ic->ic_opmode == IEEE80211_M_MONITOR)
> > ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
> > Index: sys/dev/usb/if_zyd.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/usb/if_zyd.c,v
> > retrieving revision 1.129
> > diff -u -p -r1.129 if_zyd.c
> > --- sys/dev/usb/if_zyd.c 23 May 2024 03:21:09 -0000 1.129
> > +++ sys/dev/usb/if_zyd.c 6 Jan 2026 00:39:01 -0000
> > @@ -2267,7 +2267,7 @@ sendit:
> > }
> >
> > sc->tx_timer = 5;
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> > }
> >
> > @@ -2276,7 +2276,7 @@ zyd_watchdog(struct ifnet *ifp)
> > {
> > struct zyd_softc *sc = ifp->if_softc;
> >
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> >
> > if (sc->tx_timer > 0) {
> > if (--sc->tx_timer == 0) {
> > @@ -2285,7 +2285,7 @@ zyd_watchdog(struct ifnet *ifp)
> > ifp->if_oerrors++;
> > return;
> > }
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > ieee80211_watchdog(ifp);
> > @@ -2473,7 +2473,7 @@ zyd_stop(struct ifnet *ifp, int disable)
> > struct ieee80211com *ic = &sc->sc_ic;
> >
> > sc->tx_timer = 0;
> > - ifp->if_timer = 0;
> > + if_watchdog_disable(ifp);
> > ifp->if_flags &= ~IFF_RUNNING;
> > ifq_clr_oactive(&ifp->if_snd);
> >
> > Index: sys/net/if_var.h
> > ===================================================================
> > RCS file: /cvs/src/sys/net/if_var.h,v
> > retrieving revision 1.147
> > diff -u -p -r1.147 if_var.h
> > --- sys/net/if_var.h 3 Jan 2026 14:10:04 -0000 1.147
> > +++ sys/net/if_var.h 6 Jan 2026 00:39:03 -0000
> > @@ -362,6 +362,18 @@ void p2p_rtrequest(struct ifnet *, int,
> > void p2p_input(struct ifnet *, struct mbuf *, struct netstack *);
> > int p2p_bpf_mtap(caddr_t, const struct mbuf *, u_int);
> >
> > +static inline void
> > +if_watchdog_schedule(struct ifnet *ifp, u_short timeout)
> > +{
> > + ifp->if_timer = timeout;
> > +}
> > +
> > +static inline void
> > +if_watchdog_disable(struct ifnet *ifp)
> > +{
> > + ifp->if_timer = 0;
> > +}
> > +
> > /* this is a helper for if_input_process and similar functions */
> > static inline void
> > if_input_process_proto(struct ifnet *ifp, struct mbuf *m, struct netstack *ns)
> > Index: sys/net80211/ieee80211.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net80211/ieee80211.c,v
> > retrieving revision 1.91
> > diff -u -p -r1.91 ieee80211.c
> > --- sys/net80211/ieee80211.c 1 Aug 2025 20:39:26 -0000 1.91
> > +++ sys/net80211/ieee80211.c 6 Jan 2026 00:39:03 -0000
> > @@ -812,7 +812,7 @@ ieee80211_watchdog(struct ifnet *ifp)
> > }
> >
> > if (ic->ic_mgt_timer != 0)
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > }
> >
> > const struct ieee80211_rateset ieee80211_std_rateset_11a =
> > Index: sys/net80211/ieee80211_output.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net80211/ieee80211_output.c,v
> > retrieving revision 1.145
> > diff -u -p -r1.145 ieee80211_output.c
> > --- sys/net80211/ieee80211_output.c 5 Jan 2026 13:41:03 -0000 1.145
> > +++ sys/net80211/ieee80211_output.c 6 Jan 2026 00:39:03 -0000
> > @@ -258,7 +258,7 @@ ieee80211_mgmt_output(struct ifnet *ifp,
> > return 0;
> > #endif
> > mq_enqueue(&ic->ic_mgtq, m);
> > - ifp->if_timer = 1;
> > + if_watchdog_schedule(ifp, 1);
> > if_start(ifp);
> > return 0;
> > }
> >
>
>
> --
> George Koehler <kernigh@gmail.com>
>
ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling
ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling
ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling