Index | Thread | Search

From:
George Koehler <kernigh@gmail.com>
Subject:
Re: ifnet: Introduce if_watchdog*() API instead of manual `if_timer' handrolling
To:
Vitaliy Makkoveev <mvs@openbsd.org>
Cc:
tech@openbsd.org, Alexander Bluhm <bluhm@openbsd.org>
Date:
Thu, 8 Jan 2026 12:17:57 -0500

Download raw body.

Thread
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

> 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>