Module Name:    src
Committed By:   mrg
Date:           Fri Aug  9 01:17:33 UTC 2019

Modified Files:
        src/sys/dev/usb: if_axe.c if_axen.c if_cdce.c if_smsc.c if_udav.c
            if_ure.c usbnet.c usbnet.h
        src/sys/sys: param.h

Log Message:
update usbnet some:
- move rx/tx xfer flags into usbnet_cdata
- move the callbacks into usbnet_ops structure
- move rx/tx xfer flags arguments from usbnet_init_rx_tx()
  and move them all into usbnet_attach() arguments
- s/miibus/mii/ in some places for consistency

other clean up:
- create wrapper functions for callbacks, move knowledge about
  special handling (OK to be missing, error eating) there.
- use cdata pointer if already available
- provide some more macros (will be real functions later) for
  accessing usbnet members, use existing ones more

bump kernel version.


To generate a diff of this commit:
cvs rdiff -u -r1.106 -r1.107 src/sys/dev/usb/if_axe.c
cvs rdiff -u -r1.56 -r1.57 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.58 -r1.59 src/sys/dev/usb/if_cdce.c
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/usb/if_smsc.c
cvs rdiff -u -r1.62 -r1.63 src/sys/dev/usb/if_udav.c
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/usb/if_ure.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/usb/usbnet.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/usb/usbnet.h
cvs rdiff -u -r1.603 -r1.604 src/sys/sys/param.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/if_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.106 src/sys/dev/usb/if_axe.c:1.107
--- src/sys/dev/usb/if_axe.c:1.106	Tue Aug  6 01:42:22 2019
+++ src/sys/dev/usb/if_axe.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axe.c,v 1.106 2019/08/06 01:42:22 mrg Exp $	*/
+/*	$NetBSD: if_axe.c,v 1.107 2019/08/09 01:17:33 mrg Exp $	*/
 /*	$OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */
 
 /*
@@ -87,7 +87,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.106 2019/08/06 01:42:22 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.107 2019/08/09 01:17:33 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -261,19 +261,33 @@ void	axe_attach(device_t, device_t, void
 CFATTACH_DECL_NEW(axe, sizeof(struct axe_softc),
 	axe_match, axe_attach, usbnet_detach, usbnet_activate);
 
+static void	axe_stop_cb(struct ifnet *, int);
+static int	axe_ioctl_cb(struct ifnet *, u_long, void *);
+static int	axe_init(struct ifnet *);
+static usbd_status axe_mii_read_reg(struct usbnet *, int, int, uint16_t *);
+static usbd_status axe_mii_write_reg(struct usbnet *, int, int, uint16_t);
+static void	axe_mii_statchg_cb(struct ifnet *);
 static void	axe_rx_loop_cb(struct usbnet *, struct usbd_xfer *,
 			       struct usbnet_chain *, uint32_t);
 static unsigned axe_tx_prepare_cb(struct usbnet *, struct mbuf *,
 				  struct usbnet_chain *);
-static int	axe_init(struct ifnet *);
-static void	axe_stop_cb(struct ifnet *, int);
-static int	axe_ioctl_cb(struct ifnet *, u_long, void *);
 
 static void	axe_ax88178_init(struct axe_softc *);
 static void	axe_ax88772_init(struct axe_softc *);
 static void	axe_ax88772a_init(struct axe_softc *);
 static void	axe_ax88772b_init(struct axe_softc *);
 
+static struct usbnet_ops axe_ops = {
+	.uno_stop = axe_stop_cb,
+	.uno_ioctl = axe_ioctl_cb,
+	.uno_read_reg = axe_mii_read_reg,
+	.uno_write_reg = axe_mii_write_reg,
+	.uno_statchg = axe_mii_statchg_cb,
+	.uno_tx_prepare = axe_tx_prepare_cb,
+	.uno_rx_loop = axe_rx_loop_cb,
+	.uno_init = axe_init,
+};
+
 static usbd_status
 axe_cmd(struct axe_softc *sc, int cmd, int index, int val, void *buf)
 {
@@ -284,7 +298,7 @@ axe_cmd(struct axe_softc *sc, int cmd, i
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return -1;
 
 	DPRINTFN(20, "cmd %#jx index %#jx val %#jx", cmd, index, val, 0);
@@ -364,10 +378,10 @@ axe_mii_statchg_cb(struct ifnet *ifp)
 
 	struct usbnet * const un = ifp->if_softc;
 	struct axe_softc * const sc = usbnet_softc(un);
-	struct mii_data *mii = &un->un_mii;
+	struct mii_data *mii = usbnet_mii(un);
 	int val, err;
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	val = 0;
@@ -425,7 +439,7 @@ axe_setiff_locked(struct usbnet *un)
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	if (axe_cmd(sc, AXE_CMD_RXCTL_READ, 0, 0, &rxmode)) {
@@ -516,7 +530,7 @@ axe_reset(struct usbnet *un)
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	/*
@@ -871,16 +885,7 @@ axe_attach(device_t parent, device_t sel
 	un->un_dev = self;
 	un->un_udev = dev;
 	un->un_sc = sc;
-	un->un_stop_cb = axe_stop_cb;
-	un->un_ioctl_cb = axe_ioctl_cb;
-	un->un_read_reg_cb = axe_mii_read_reg;
-	un->un_write_reg_cb = axe_mii_write_reg;
-	un->un_statchg_cb = axe_mii_statchg_cb;
-	un->un_tx_prepare_cb = axe_tx_prepare_cb;
-	un->un_rx_loop_cb = axe_rx_loop_cb;
-	un->un_init_cb = axe_init;
-	un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
-	un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER;
+	un->un_ops = &axe_ops;
 
 	err = usbd_set_config_no(dev, AXE_CONFIG_NO, 1);
 	if (err) {
@@ -905,8 +910,6 @@ axe_attach(device_t parent, device_t sel
 		    AXE_178_MAX_BUFSZ : AXE_178_MIN_BUFSZ;
 	else
 		bufsz = AXE_172_BUFSZ;
-	un->un_cdata.uncd_rx_bufsz = bufsz;
-	un->un_cdata.uncd_tx_bufsz = bufsz;
 
 	un->un_ed[USBNET_ENDPT_RX] = 0;
 	un->un_ed[USBNET_ENDPT_TX] = 0;
@@ -934,7 +937,8 @@ axe_attach(device_t parent, device_t sel
 	}
 
 	/* Set these up now for axe_cmd().  */
-	usbnet_attach(un, "axedet", AXE_RX_LIST_CNT, AXE_TX_LIST_CNT);
+	usbnet_attach(un, "axedet", AXE_RX_LIST_CNT, AXE_TX_LIST_CNT,
+		      USBD_SHORT_XFER_OK, USBD_FORCE_SHORT_XFER, bufsz, bufsz);
 
 	/* We need the PHYID for init dance in some cases */
 	usbnet_lock_mii(un);
@@ -1245,7 +1249,7 @@ axe_init_locked(struct ifnet *ifp)
 
 	usbnet_isowned(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return EIO;
 
 	/* Cancel pending I/O */
@@ -1342,7 +1346,7 @@ axe_init_locked(struct ifnet *ifp)
 
 	usbnet_unlock_mii_un_locked(un);
 
-	return usbnet_init_rx_tx(un, 0, USBD_FORCE_SHORT_XFER);
+	return usbnet_init_rx_tx(un);
 }
 
 static int

Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.56 src/sys/dev/usb/if_axen.c:1.57
--- src/sys/dev/usb/if_axen.c:1.56	Tue Aug  6 01:42:22 2019
+++ src/sys/dev/usb/if_axen.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axen.c,v 1.56 2019/08/06 01:42:22 mrg Exp $	*/
+/*	$NetBSD: if_axen.c,v 1.57 2019/08/09 01:17:33 mrg Exp $	*/
 /*	$OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.56 2019/08/06 01:42:22 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.57 2019/08/09 01:17:33 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -79,19 +79,32 @@ static void	axen_attach(device_t, device
 CFATTACH_DECL_NEW(axen, sizeof(struct axen_softc),
 	axen_match, axen_attach, usbnet_detach, usbnet_activate);
 
-static unsigned	axen_tx_prepare(struct usbnet *, struct mbuf *,
-			        struct usbnet_chain *);
-static int	axen_init(struct ifnet *);
 static int	axen_cmd(struct axen_softc *, int, int, int, void *);
 static void	axen_reset(struct axen_softc *);
 static int	axen_get_eaddr(struct axen_softc *, void *);
-static void	axen_stop_cb(struct ifnet *, int);
 static void	axen_ax88179_init(struct axen_softc *);
 
+static void	axen_stop_cb(struct ifnet *, int);
+static int	axen_ioctl_cb(struct ifnet *, u_long, void *);
 static usbd_status axen_mii_read_reg(struct usbnet *, int, int, uint16_t *);
 static usbd_status axen_mii_write_reg(struct usbnet *, int, int, uint16_t);
+static void	axen_mii_statchg(struct ifnet *);
 static void	axen_rxeof_loop(struct usbnet *, struct usbd_xfer *,
 		    struct usbnet_chain *, uint32_t);
+static unsigned	axen_tx_prepare(struct usbnet *, struct mbuf *,
+			        struct usbnet_chain *);
+static int	axen_init(struct ifnet *);
+
+static struct usbnet_ops axen_ops = {
+	.uno_stop = axen_stop_cb,
+	.uno_ioctl = axen_ioctl_cb,
+	.uno_read_reg = axen_mii_read_reg,
+	.uno_write_reg = axen_mii_write_reg,
+	.uno_statchg = axen_mii_statchg,
+	.uno_tx_prepare = axen_tx_prepare,
+	.uno_rx_loop = axen_rxeof_loop,
+	.uno_init = axen_init,
+};
 
 static int
 axen_cmd(struct axen_softc *sc, int cmd, int index, int val, void *buf)
@@ -102,7 +115,7 @@ axen_cmd(struct axen_softc *sc, int cmd,
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	if (AXEN_CMD_DIR(cmd))
@@ -162,7 +175,7 @@ axen_mii_statchg(struct ifnet *ifp)
 	uint16_t val;
 	uint16_t wval;
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	un->un_link = false;
@@ -225,7 +238,7 @@ axen_setiff_locked(struct usbnet *un)
 	uint8_t hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
 	uint16_t wval;
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	usbnet_isowned_mii(un);
@@ -295,7 +308,7 @@ axen_reset(struct axen_softc *sc)
 	struct usbnet * const un = &sc->axen_un;
 
 	usbnet_isowned(un);
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 	/* XXX What to reset? */
 
@@ -501,18 +514,18 @@ axen_ax88179_init(struct axen_softc *sc)
 #define GMII_PHY_PAGE_SEL	0x1e
 #define GMII_PHY_PAGE_SEL	0x1f
 #define GMII_PAGE_EXT		0x0007
-	usbnet_miibus_writereg(un->un_dev, un->un_phyno, GMII_PHY_PAGE_SEL,
+	usbnet_mii_writereg(un->un_dev, un->un_phyno, GMII_PHY_PAGE_SEL,
 	    GMII_PAGE_EXT);
-	usbnet_miibus_writereg(un->un_dev, un->un_phyno, GMII_PHY_PAGE,
+	usbnet_mii_writereg(un->un_dev, un->un_phyno, GMII_PHY_PAGE,
 	    0x002c);
 #endif
 
 #if 1 /* XXX: phy hack ? */
-	usbnet_miibus_writereg(un->un_dev, un->un_phyno, 0x1F, 0x0005);
-	usbnet_miibus_writereg(un->un_dev, un->un_phyno, 0x0C, 0x0000);
-	usbnet_miibus_readreg(un->un_dev, un->un_phyno, 0x0001, &wval);
-	usbnet_miibus_writereg(un->un_dev, un->un_phyno, 0x01, wval | 0x0080);
-	usbnet_miibus_writereg(un->un_dev, un->un_phyno, 0x1F, 0x0000);
+	usbnet_mii_writereg(un->un_dev, un->un_phyno, 0x1F, 0x0005);
+	usbnet_mii_writereg(un->un_dev, un->un_phyno, 0x0C, 0x0000);
+	usbnet_mii_readreg(un->un_dev, un->un_phyno, 0x0001, &wval);
+	usbnet_mii_writereg(un->un_dev, un->un_phyno, 0x01, wval | 0x0080);
+	usbnet_mii_writereg(un->un_dev, un->un_phyno, 0x1F, 0x0000);
 #endif
 }
 
@@ -604,6 +617,7 @@ axen_attach(device_t parent, device_t se
 	usb_interface_descriptor_t *id;
 	usb_endpoint_descriptor_t *ed;
 	char *devinfop;
+	unsigned rx_bufsz, tx_bufsz;
 	uint16_t axen_flags;
 	int i;
 
@@ -619,16 +633,7 @@ axen_attach(device_t parent, device_t se
 	un->un_dev = self;
 	un->un_udev = dev;
 	un->un_sc = sc;
-	un->un_stop_cb = axen_stop_cb;
-	un->un_ioctl_cb = axen_ioctl_cb;
-	un->un_read_reg_cb = axen_mii_read_reg;
-	un->un_write_reg_cb = axen_mii_write_reg;
-	un->un_statchg_cb = axen_mii_statchg;
-	un->un_tx_prepare_cb = axen_tx_prepare;
-	un->un_rx_loop_cb = axen_rxeof_loop;
-	un->un_init_cb = axen_init;
-	un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
-	un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER;
+	un->un_ops = &axen_ops;
 
 	err = usbd_set_config_no(dev, AXEN_CONFIG_NO, 1);
 	if (err) {
@@ -648,19 +653,17 @@ axen_attach(device_t parent, device_t se
 	/* decide on what our bufsize will be */
 	switch (dev->ud_speed) {
 	case USB_SPEED_SUPER:
-		un->un_cdata.uncd_rx_bufsz = AXEN_BUFSZ_SS * 1024;
+		rx_bufsz = AXEN_BUFSZ_SS * 1024;
 		break;
 	case USB_SPEED_HIGH:
-		un->un_cdata.uncd_rx_bufsz = AXEN_BUFSZ_HS * 1024;
+		rx_bufsz = AXEN_BUFSZ_HS * 1024;
 		break;
 	default:
-		un->un_cdata.uncd_rx_bufsz = AXEN_BUFSZ_LS * 1024;
+		rx_bufsz = AXEN_BUFSZ_LS * 1024;
 		break;
 	}
-
-	un->un_cdata.uncd_tx_bufsz = IP_MAXPACKET +
-	    ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN +
-	    sizeof(struct axen_sframe_hdr);
+	tx_bufsz = IP_MAXPACKET + ETHER_HDR_LEN + ETHER_CRC_LEN +
+		   ETHER_VLAN_ENCAP_LEN + sizeof(struct axen_sframe_hdr);
 
 	/* Find endpoints. */
 	id = usbd_get_interface_descriptor(un->un_iface);
@@ -685,7 +688,9 @@ axen_attach(device_t parent, device_t se
 	}
 
 	/* Set these up now for axen_cmd().  */
-	usbnet_attach(un, "axendet", AXEN_RX_LIST_CNT, AXEN_TX_LIST_CNT);
+	usbnet_attach(un, "axendet", AXEN_RX_LIST_CNT, AXEN_TX_LIST_CNT,
+		      USBD_SHORT_XFER_OK, USBD_FORCE_SHORT_XFER,
+		      rx_bufsz, tx_bufsz);
 
 	un->un_phyno = AXEN_PHY_ID;
 	DPRINTF(("%s: phyno %d\n", device_xname(self), un->un_phyno));
@@ -828,7 +833,7 @@ axen_rxeof_loop(struct usbnet *un, struc
 #endif
 
 	if (pkt_count)
-		rnd_add_uint32(&un->un_rndsrc, pkt_count);
+		rnd_add_uint32(usbnet_rndsrc(un), pkt_count);
 
 	do {
 		if ((buf[0] != 0xee) || (buf[1] != 0xee)) {
@@ -921,7 +926,7 @@ axen_init_locked(struct ifnet *ifp)
 
 	usbnet_isowned(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return EIO;
 
 	/* Cancel pending I/O */
@@ -951,7 +956,7 @@ axen_init_locked(struct ifnet *ifp)
 
 	usbnet_unlock_mii_un_locked(un);
 
-	return usbnet_init_rx_tx(un, 0, USBD_FORCE_SHORT_XFER);
+	return usbnet_init_rx_tx(un);
 }
 
 static int

Index: src/sys/dev/usb/if_cdce.c
diff -u src/sys/dev/usb/if_cdce.c:1.58 src/sys/dev/usb/if_cdce.c:1.59
--- src/sys/dev/usb/if_cdce.c:1.58	Tue Aug  6 01:42:22 2019
+++ src/sys/dev/usb/if_cdce.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cdce.c,v 1.58 2019/08/06 01:42:22 mrg Exp $ */
+/*	$NetBSD: if_cdce.c,v 1.59 2019/08/09 01:17:33 mrg Exp $ */
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wp...@windriver.com>
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.58 2019/08/06 01:42:22 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.59 2019/08/09 01:17:33 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -80,14 +80,21 @@ static const struct cdce_type cdce_devs[
 
 static int	cdce_match(device_t, cfdata_t, void *);
 static void	cdce_attach(device_t, device_t, void *);
-static int	cdce_init(struct ifnet *);
+
+CFATTACH_DECL_NEW(cdce, sizeof(struct cdce_softc), cdce_match, cdce_attach,
+    usbnet_detach, usbnet_activate);
+
 static void	cdce_rx_loop(struct usbnet *, struct usbd_xfer *,
 			     struct usbnet_chain *, uint32_t);
 static unsigned	cdce_tx_prepare(struct usbnet *, struct mbuf *,
 				struct usbnet_chain *);
+static int	cdce_init(struct ifnet *);
 
-CFATTACH_DECL_NEW(cdce, sizeof(struct cdce_softc), cdce_match, cdce_attach,
-    usbnet_detach, usbnet_activate);
+static struct usbnet_ops cdce_ops = {
+	.uno_tx_prepare = cdce_tx_prepare,
+	.uno_rx_loop = cdce_rx_loop,
+	.uno_init = cdce_init,
+};
 
 static int
 cdce_match(device_t parent, cfdata_t match, void *aux)
@@ -134,13 +141,7 @@ cdce_attach(device_t parent, device_t se
 	un->un_dev = self;
 	un->un_udev = dev;
 	un->un_sc = sc;
-	un->un_init_cb = cdce_init;
-	un->un_tx_prepare_cb = cdce_tx_prepare;
-	un->un_rx_loop_cb = cdce_rx_loop;
-	un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
-	un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER;
-	un->un_cdata.uncd_rx_bufsz = CDCE_BUFSZ;
-	un->un_cdata.uncd_tx_bufsz = CDCE_BUFSZ;
+	un->un_ops = &cdce_ops;
 
 	t = cdce_lookup(uiaa->uiaa_vendor, uiaa->uiaa_product);
 	if (t)
@@ -250,7 +251,9 @@ cdce_attach(device_t parent, device_t se
 		un->un_eaddr[5] = (uint8_t)(device_unit(un->un_dev));
 	}
 
-	usbnet_attach(un, "cdcedet", CDCE_RX_LIST_CNT, CDCE_TX_LIST_CNT);
+	usbnet_attach(un, "cdcedet", CDCE_RX_LIST_CNT, CDCE_TX_LIST_CNT,
+		      USBD_SHORT_XFER_OK, USBD_FORCE_SHORT_XFER,
+		      CDCE_BUFSZ, CDCE_BUFSZ);
 	usbnet_attach_ifp(un, false, IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST,
             0, 0);
 }
@@ -262,11 +265,11 @@ cdce_init(struct ifnet *ifp)
 	int rv;
 
 	usbnet_lock(un);
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		rv = EIO;
 	else {
 		usbnet_stop(un, ifp, 1);
-		rv = usbnet_init_rx_tx(un, 0, 0);
+		rv = usbnet_init_rx_tx(un);
 		if (rv == 0)
 			un->un_link = true;
 	}

Index: src/sys/dev/usb/if_smsc.c
diff -u src/sys/dev/usb/if_smsc.c:1.48 src/sys/dev/usb/if_smsc.c:1.49
--- src/sys/dev/usb/if_smsc.c:1.48	Wed Aug  7 08:16:24 2019
+++ src/sys/dev/usb/if_smsc.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_smsc.c,v 1.48 2019/08/07 08:16:24 mrg Exp $	*/
+/*	$NetBSD: if_smsc.c,v 1.49 2019/08/09 01:17:33 mrg Exp $	*/
 
 /*	$OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.48 2019/08/07 08:16:24 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.49 2019/08/09 01:17:33 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -160,11 +160,23 @@ int		 smsc_wait_for_bits(struct usbnet *
 usbd_status	 smsc_miibus_readreg(struct usbnet *, int, int, uint16_t *);
 usbd_status	 smsc_miibus_writereg(struct usbnet *, int, int, uint16_t);
 
+static int	 smsc_ioctl_cb(struct ifnet *, u_long, void *);
 static unsigned	 smsc_tx_prepare(struct usbnet *, struct mbuf *,
 		     struct usbnet_chain *);
 static void	 smsc_rxeof_loop(struct usbnet *, struct usbd_xfer *,
 		    struct usbnet_chain *, uint32_t);
 
+static struct usbnet_ops smsc_ops = {
+	.uno_stop = smsc_stop_cb,
+	.uno_ioctl = smsc_ioctl_cb,
+	.uno_read_reg = smsc_miibus_readreg,
+	.uno_write_reg = smsc_miibus_writereg,
+	.uno_statchg = smsc_miibus_statchg,
+	.uno_tx_prepare = smsc_tx_prepare,
+	.uno_rx_loop = smsc_rxeof_loop,
+	.uno_init = smsc_init,
+};
+
 int
 smsc_readreg(struct usbnet *un, uint32_t off, uint32_t *data)
 {
@@ -174,7 +186,7 @@ smsc_readreg(struct usbnet *un, uint32_t
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
@@ -201,7 +213,7 @@ smsc_writereg(struct usbnet *un, uint32_
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	buf = htole32(data);
@@ -299,7 +311,7 @@ smsc_miibus_statchg(struct ifnet *ifp)
 {
 	struct usbnet * const un = ifp->if_softc;
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	struct smsc_softc * const sc = usbnet_softc(un);
@@ -390,7 +402,7 @@ smsc_setiff_locked(struct usbnet *un)
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	if (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) {
@@ -521,7 +533,7 @@ smsc_reset(struct smsc_softc *sc)
 	struct usbnet * const un = &sc->smsc_un;
 
 	usbnet_isowned(un);
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	/* Wait a little while for the chip to get its brains in order. */
@@ -549,7 +561,7 @@ smsc_init_locked(struct ifnet *ifp)
 	struct usbnet * const un = ifp->if_softc;
 	struct smsc_softc * const sc = usbnet_softc(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return EIO;
 
 	/* Cancel pending I/O */
@@ -568,7 +580,7 @@ smsc_init_locked(struct ifnet *ifp)
 
 	usbnet_unlock_mii_un_locked(un);
 
-	return usbnet_init_rx_tx(un, 0, USBD_FORCE_SHORT_XFER);;
+	return usbnet_init_rx_tx(un);
 }
 
 void
@@ -734,7 +746,6 @@ init_failed:
 	return err;
 }
 
-
 static int
 smsc_ioctl_cb(struct ifnet *ifp, u_long cmd, void *data)
 {
@@ -776,6 +787,7 @@ smsc_attach(device_t parent, device_t se
 	usb_interface_descriptor_t *id;
 	usb_endpoint_descriptor_t *ed;
 	char *devinfop;
+	unsigned bufsz;
 	int err, i;
 	uint32_t mac_h, mac_l;
 
@@ -788,16 +800,7 @@ smsc_attach(device_t parent, device_t se
 	un->un_dev = self;
 	un->un_udev = dev;
 	un->un_sc = sc;
-	un->un_stop_cb = smsc_stop_cb;
-	un->un_ioctl_cb = smsc_ioctl_cb;
-	un->un_read_reg_cb = smsc_miibus_readreg;
-	un->un_write_reg_cb = smsc_miibus_writereg;
-	un->un_statchg_cb = smsc_miibus_statchg;
-	un->un_tx_prepare_cb = smsc_tx_prepare;
-	un->un_rx_loop_cb = smsc_rxeof_loop;
-	un->un_init_cb = smsc_init;
-	un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
-	un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER;
+	un->un_ops = &smsc_ops;
 
 	devinfop = usbd_devinfo_alloc(un->un_udev, 0);
 	aprint_normal_dev(self, "%s\n", devinfop);
@@ -820,11 +823,9 @@ smsc_attach(device_t parent, device_t se
 	id = usbd_get_interface_descriptor(un->un_iface);
 
 	if (dev->ud_speed >= USB_SPEED_HIGH) {
-		un->un_cdata.uncd_rx_bufsz = SMSC_MAX_BUFSZ;
-		un->un_cdata.uncd_tx_bufsz = SMSC_MAX_BUFSZ;
+		bufsz = SMSC_MAX_BUFSZ;
 	} else {
-		un->un_cdata.uncd_rx_bufsz = SMSC_MIN_BUFSZ;
-		un->un_cdata.uncd_tx_bufsz = SMSC_MIN_BUFSZ;
+		bufsz = SMSC_MIN_BUFSZ;
 	}
 
 	/* Find endpoints. */
@@ -848,7 +849,8 @@ smsc_attach(device_t parent, device_t se
 		}
 	}
 
-	usbnet_attach(un, "smscdet", SMSC_RX_LIST_CNT, SMSC_TX_LIST_CNT);
+	usbnet_attach(un, "smscdet", SMSC_RX_LIST_CNT, SMSC_TX_LIST_CNT,
+		      USBD_SHORT_XFER_OK, USBD_FORCE_SHORT_XFER, bufsz, bufsz);
 
 #ifdef notyet
 	/*
@@ -860,7 +862,8 @@ smsc_attach(device_t parent, device_t se
 	    /*IFCAP_CSUM_TCPv4_Tx |*/ IFCAP_CSUM_TCPv4_Rx |
 	    /*IFCAP_CSUM_UDPv4_Tx |*/ IFCAP_CSUM_UDPv4_Rx;
 #endif
-	un->un_ec.ec_capabilities = ETHERCAP_VLAN_MTU;
+	struct ethercom *ec = usbnet_ec(un);
+	ec->ec_capabilities = ETHERCAP_VLAN_MTU;
 
 	/* Setup some of the basics */
 	un->un_phyno = 1;
@@ -907,7 +910,7 @@ smsc_rxeof_loop(struct usbnet * un, stru
 	struct ifnet *ifp = usbnet_ifp(un);
 	uint8_t *buf = c->unc_buf;
 
-	KASSERT(mutex_owned(&un->un_rxlock));
+	usbnet_isowned_rx(un);
 
 	while (total_len != 0) {
 		uint32_t rxhdr;
@@ -1052,7 +1055,7 @@ smsc_tx_prepare(struct usbnet *un, struc
 	uint32_t txhdr;
 	uint32_t frm_len = 0;
 
-	KASSERT(mutex_owned(&un->un_txlock));
+	usbnet_isowned_tx(un);
 
 	/*
 	 * Each frame is prefixed with two 32-bit values describing the

Index: src/sys/dev/usb/if_udav.c
diff -u src/sys/dev/usb/if_udav.c:1.62 src/sys/dev/usb/if_udav.c:1.63
--- src/sys/dev/usb/if_udav.c:1.62	Wed Aug  7 20:34:12 2019
+++ src/sys/dev/usb/if_udav.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_udav.c,v 1.62 2019/08/07 20:34:12 skrll Exp $	*/
+/*	$NetBSD: if_udav.c,v 1.63 2019/08/09 01:17:33 mrg Exp $	*/
 /*	$nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $	*/
 
 /*
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.62 2019/08/07 20:34:12 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.63 2019/08/09 01:17:33 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -140,6 +140,16 @@ static const struct udav_type {
 };
 #define udav_lookup(v, p) ((const struct udav_type *)usb_lookup(udav_devs, v, p))
 
+static struct usbnet_ops udav_ops = {
+	.uno_stop = udav_stop_cb,
+	.uno_ioctl = udav_ioctl_cb,
+	.uno_read_reg = udav_mii_read_reg,
+	.uno_write_reg = udav_mii_write_reg,
+	.uno_statchg = udav_mii_statchg,
+	.uno_tx_prepare = udav_tx_prepare,
+	.uno_rx_loop = udav_rxeof_loop,
+	.uno_init = udav_init,
+};
 
 /* Probe */
 int
@@ -178,16 +188,7 @@ udav_attach(device_t parent, device_t se
 	un->un_dev = self;
 	un->un_udev = dev;
 	un->un_sc = sc;
-	un->un_stop_cb = udav_stop_cb;
-	un->un_ioctl_cb = udav_ioctl_cb;
-	un->un_read_reg_cb = udav_mii_read_reg;
-	un->un_write_reg_cb = udav_mii_write_reg;
-	un->un_statchg_cb = udav_mii_statchg;
-	un->un_tx_prepare_cb = udav_tx_prepare;
-	un->un_rx_loop_cb = udav_rxeof_loop;
-	un->un_init_cb = udav_init;
-	un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
-	un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER;
+	un->un_ops = &udav_ops;
 
 	/* Move the device into the configured state. */
 	err = usbd_set_config_no(dev, UDAV_CONFIG_NO, 1); /* idx 0 */
@@ -242,12 +243,12 @@ udav_attach(device_t parent, device_t se
 	/* Not supported yet. */
 	un->un_ed[USBNET_ENDPT_INTR] = 0;
 
-	un->un_cdata.uncd_rx_bufsz = un->un_cdata.uncd_tx_bufsz = UDAV_BUFSZ;
-
 // 	/* reset the adapter */
 // 	udav_reset(un);
 
-	usbnet_attach(un, "udavdet", UDAV_RX_LIST_CNT, UDAV_TX_LIST_CNT);
+	usbnet_attach(un, "udavdet", UDAV_RX_LIST_CNT, UDAV_TX_LIST_CNT,
+		      USBD_SHORT_XFER_OK, USBD_FORCE_SHORT_XFER,
+		      UDAV_BUFSZ, UDAV_BUFSZ);
 
 	/* Get Ethernet Address */
 	usbnet_lock_mii(un);
@@ -283,7 +284,7 @@ udav_mem_read(struct udav_softc *sc, int
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	offset &= 0xffff;
@@ -317,7 +318,7 @@ udav_mem_write(struct udav_softc *sc, in
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	offset &= 0xffff;
@@ -351,7 +352,7 @@ udav_mem_write1(struct udav_softc *sc, i
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	offset &= 0xffff;
@@ -381,7 +382,7 @@ udav_csr_read(struct udav_softc *sc, int
 	usbd_status err;
 
 	usbnet_isowned_mii(un);
-	KASSERT(!un->un_dying);
+	KASSERT(!usbnet_isdying(un));
 
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
@@ -413,7 +414,7 @@ udav_csr_write(struct udav_softc *sc, in
 	usbd_status err;
 
 	usbnet_isowned_mii(un);
-	KASSERT(!un->un_dying);
+	KASSERT(!usbnet_isdying(un));
 
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
@@ -447,7 +448,7 @@ udav_csr_read1(struct udav_softc *sc, in
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	return udav_csr_read(sc, offset, &val, 1) ? 0 : val;
@@ -462,7 +463,7 @@ udav_csr_write1(struct udav_softc *sc, i
 	usbd_status err;
 
 	usbnet_isowned_mii(un);
-	KASSERT(!un->un_dying);
+	KASSERT(!usbnet_isdying(un));
 
 	DPRINTFN(0x200,
 		("%s: %s: enter\n", device_xname(un->un_dev), __func__));
@@ -497,7 +498,7 @@ udav_init_locked(struct ifnet *ifp)
 
 	usbnet_isowned(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return EIO;
 
 	/* Cancel pending I/O and free all TX/RX buffers */
@@ -543,7 +544,7 @@ udav_init_locked(struct ifnet *ifp)
 	if (rc != 0)
 		return rc;
 
-	return usbnet_init_rx_tx(un, 0, USBD_FORCE_SHORT_XFER);
+	return usbnet_init_rx_tx(un);
 }
 
 static int
@@ -563,7 +564,7 @@ udav_reset(struct usbnet *un)
 {
     	usbnet_isowned(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	DPRINTF(("%s: %s: enter\n", device_xname(un->un_dev), __func__));
@@ -625,7 +626,7 @@ udav_setiff_locked(struct usbnet *un)
 
 	usbnet_isowned_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	if (ISSET(sc->sc_flags, UDAV_NO_PHY)) {
@@ -799,7 +800,7 @@ udav_mii_read_reg(struct usbnet *un, int
 	DPRINTFN(0xff, ("%s: %s: enter, phy=%d reg=0x%04x\n",
 		 device_xname(un->un_dev), __func__, phy, reg));
 
-	if (un->un_dying) {
+	if (usbnet_isdying(un)) {
 #ifdef DIAGNOSTIC
 		printf("%s: %s: dying\n", device_xname(un->un_dev),
 		       __func__);
@@ -848,7 +849,7 @@ udav_mii_write_reg(struct usbnet *un, in
 	DPRINTFN(0xff, ("%s: %s: enter, phy=%d reg=0x%04x val=0x%04hx\n",
 		 device_xname(un->un_dev), __func__, phy, reg, val));
 
-	if (un->un_dying) {
+	if (usbnet_isdying(un)) {
 #ifdef DIAGNOSTIC
 		printf("%s: %s: dying\n", device_xname(un->un_dev),
 		       __func__);
@@ -891,7 +892,7 @@ udav_mii_statchg(struct ifnet *ifp)
 
 	DPRINTF(("%s: %s: enter\n", ifp->if_xname, __func__));
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	un->un_link = false;

Index: src/sys/dev/usb/if_ure.c
diff -u src/sys/dev/usb/if_ure.c:1.18 src/sys/dev/usb/if_ure.c:1.19
--- src/sys/dev/usb/if_ure.c:1.18	Tue Aug  6 01:42:22 2019
+++ src/sys/dev/usb/if_ure.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ure.c,v 1.18 2019/08/06 01:42:22 mrg Exp $	*/
+/*	$NetBSD: if_ure.c,v 1.19 2019/08/09 01:17:33 mrg Exp $	*/
 /*	$OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $	*/
 
 /*-
@@ -30,7 +30,7 @@
 /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.18 2019/08/06 01:42:22 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.19 2019/08/09 01:17:33 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -73,25 +73,44 @@ static const struct usb_devno ure_devs[]
 	{ USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_RTL8153 }
 };
 
-static int	ure_match(device_t, cfdata_t, void *);
-static void	ure_attach(device_t, device_t, void *);
-static int	ure_init(struct ifnet *);
+#define URE_BUFSZ	(16 * 1024)
+
 static void	ure_reset(struct usbnet *);
-static void	ure_miibus_statchg(struct ifnet *);
 static uint32_t	ure_txcsum(struct mbuf *);
 static int	ure_rxcsum(struct ifnet *, struct ure_rxpkt *);
-static unsigned ure_tx_prepare(struct usbnet *, struct mbuf *,
-			       struct usbnet_chain *);
-static void	ure_rxeof_loop(struct usbnet *, struct usbd_xfer *,
-			       struct usbnet_chain *, uint32_t);
 static void	ure_rtl8152_init(struct ure_softc *);
 static void	ure_rtl8153_init(struct ure_softc *);
 static void	ure_disable_teredo(struct ure_softc *);
 static void	ure_init_fifo(struct ure_softc *);
 
+static void	ure_stop_cb(struct ifnet *, int);
+static int	ure_ioctl_cb(struct ifnet *, u_long, void *);
+static usbd_status ure_mii_read_reg(struct usbnet *, int, int, uint16_t *);
+static usbd_status ure_mii_write_reg(struct usbnet *, int, int, uint16_t);
+static void	ure_miibus_statchg(struct ifnet *);
+static unsigned ure_tx_prepare(struct usbnet *, struct mbuf *,
+			       struct usbnet_chain *);
+static void	ure_rxeof_loop(struct usbnet *, struct usbd_xfer *,
+			       struct usbnet_chain *, uint32_t);
+static int	ure_init(struct ifnet *);
+
+static int	ure_match(device_t, cfdata_t, void *);
+static void	ure_attach(device_t, device_t, void *);
+
 CFATTACH_DECL_NEW(ure, sizeof(struct ure_softc), ure_match, ure_attach,
     usbnet_detach, usbnet_activate);
 
+static struct usbnet_ops ure_ops = {
+	.uno_stop = ure_stop_cb,
+	.uno_ioctl = ure_ioctl_cb,
+	.uno_read_reg = ure_mii_read_reg,
+	.uno_write_reg = ure_mii_write_reg,
+	.uno_statchg = ure_miibus_statchg,
+	.uno_tx_prepare = ure_tx_prepare,
+	.uno_rx_loop = ure_rxeof_loop,
+	.uno_init = ure_init,
+};
+
 static int
 ure_ctl(struct usbnet *un, uint8_t rw, uint16_t val, uint16_t index,
     void *buf, int len)
@@ -99,7 +118,7 @@ ure_ctl(struct usbnet *un, uint8_t rw, u
 	usb_device_request_t req;
 	usbd_status err;
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return 0;
 
 	if (rw == URE_CTL_WRITE)
@@ -281,7 +300,7 @@ ure_miibus_statchg(struct ifnet *ifp)
 	struct ure_softc * const sc = usbnet_softc(un);
 	struct mii_data * const mii = usbnet_mii(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	un->un_link = false;
@@ -316,7 +335,7 @@ ure_setiff_locked(struct usbnet *un)
 
 	usbnet_isowned(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return;
 
 	rxmode = ure_read_4(un, URE_PLA_RCR, URE_MCU_TYPE_PLA);
@@ -407,7 +426,7 @@ ure_init_locked(struct ifnet *ifp)
 
 	usbnet_isowned(un);
 
-	if (un->un_dying)
+	if (usbnet_isdying(un))
 		return EIO;
 
 	/* Cancel pending I/O. */
@@ -442,7 +461,7 @@ ure_init_locked(struct ifnet *ifp)
 	/* Load the multicast filter. */
 	ure_setiff_locked(un);
 
-	return usbnet_init_rx_tx(un, 0, 0);
+	return usbnet_init_rx_tx(un);
 }
 
 static int
@@ -842,16 +861,7 @@ ure_attach(device_t parent, device_t sel
 	un->un_dev = self;
 	un->un_udev = dev;
 	un->un_sc = sc;
-	un->un_stop_cb = ure_stop_cb;
-	un->un_ioctl_cb = ure_ioctl_cb;
-	un->un_read_reg_cb = ure_mii_read_reg;
-	un->un_write_reg_cb = ure_mii_write_reg;
-	un->un_statchg_cb = ure_miibus_statchg;
-	un->un_tx_prepare_cb = ure_tx_prepare;
-	un->un_rx_loop_cb = ure_rxeof_loop;
-	un->un_init_cb = ure_init;
-	un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
-	un->un_tx_xfer_flags = USBD_FORCE_SHORT_XFER;
+	un->un_ops = &ure_ops;
 
 #define URE_CONFIG_NO	1 /* XXX */
 	error = usbd_set_config_no(dev, URE_CONFIG_NO, 1);
@@ -872,8 +882,6 @@ ure_attach(device_t parent, device_t sel
 		return; /* XXX */
 	}
 
-	un->un_cdata.uncd_rx_bufsz = un->un_cdata.uncd_tx_bufsz = 16 * 1024;
-
 	id = usbd_get_interface_descriptor(un->un_iface);
 	for (i = 0; i < id->bNumEndpoints; i++) {
 		ed = usbd_interface2endpoint_descriptor(un->un_iface, i);
@@ -891,7 +899,9 @@ ure_attach(device_t parent, device_t sel
 	}
 
 	/* Set these up now for ure_ctl().  */
-	usbnet_attach(un, "uredet", URE_RX_LIST_CNT, URE_TX_LIST_CNT);
+	usbnet_attach(un, "uredet", URE_RX_LIST_CNT, URE_TX_LIST_CNT,
+		      USBD_SHORT_XFER_OK, USBD_FORCE_SHORT_XFER,
+		      URE_BUFSZ, URE_BUFSZ);
 
 	un->un_phyno = 0;
 
@@ -1008,7 +1018,7 @@ ure_rxeof_loop(struct usbnet *un, struct
 	} while (total_len > 0);
 
 	if (pkt_count)
-		rnd_add_uint32(&un->un_rndsrc, pkt_count);
+		rnd_add_uint32(usbnet_rndsrc(un), pkt_count);
 }
 
 static int

Index: src/sys/dev/usb/usbnet.c
diff -u src/sys/dev/usb/usbnet.c:1.9 src/sys/dev/usb/usbnet.c:1.10
--- src/sys/dev/usb/usbnet.c:1.9	Wed Aug  7 10:01:05 2019
+++ src/sys/dev/usb/usbnet.c	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbnet.c,v 1.9 2019/08/07 10:01:05 maya Exp $	*/
+/*	$NetBSD: usbnet.c,v 1.10 2019/08/09 01:17:33 mrg Exp $	*/
 
 /*
  * Copyright (c) 2019 Matthew R. Green
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.9 2019/08/07 10:01:05 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.10 2019/08/09 01:17:33 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -88,6 +88,73 @@ fail:
 #define USBNETHIST_FUNC()	USBHIST_FUNC()
 #define USBNETHIST_CALLED(name)	USBHIST_CALLED(usbnetdebug)
 
+/* Callback vectors. */
+
+static void
+uno_stop(struct usbnet *un, struct ifnet *ifp, int disable)
+{
+	if (un->un_ops->uno_stop)
+		(*un->un_ops->uno_stop)(ifp, disable);
+}
+
+static int
+uno_ioctl(struct usbnet *un, struct ifnet *ifp, u_long cmd, void *data)
+{
+	if (un->un_ops->uno_ioctl)
+		return (*un->un_ops->uno_ioctl)(ifp, cmd, data);
+	return 0;
+}
+
+static int
+uno_override_ioctl(struct usbnet *un, struct ifnet *ifp, u_long cmd, void *data)
+{
+	return (*un->un_ops->uno_override_ioctl)(ifp, cmd, data);
+}
+
+static int
+uno_init(struct usbnet *un, struct ifnet *ifp)
+{
+	return (*un->un_ops->uno_init)(ifp);
+}
+
+static int
+uno_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val)
+{
+	return (*un->un_ops->uno_read_reg)(un, phy, reg, val);
+}
+
+static int
+uno_write_reg(struct usbnet *un, int phy, int reg, uint16_t val)
+{
+	return (*un->un_ops->uno_write_reg)(un, phy, reg, val);
+}
+
+static void
+uno_mii_statchg(struct usbnet *un, struct ifnet *ifp)
+{
+	(*un->un_ops->uno_statchg)(ifp);
+}
+
+static unsigned
+uno_tx_prepare(struct usbnet *un, struct mbuf *m, struct usbnet_chain *c)
+{
+	return (*un->un_ops->uno_tx_prepare)(un, m, c);
+}
+
+static void
+uno_rx_loop(struct usbnet *un, struct usbd_xfer *xfer,
+	    struct usbnet_chain *c, uint32_t total_len)
+{
+	(*un->un_ops->uno_rx_loop)(un, xfer, c, total_len);
+}
+
+static void
+uno_intr(struct usbnet *un, usbd_status status)
+{
+	if (un->un_ops->uno_intr)
+		(*un->un_ops->uno_intr)(un, status);
+}
+
 /* Interrupt handling. */
 
 static struct mbuf *
@@ -178,6 +245,7 @@ usbnet_rxeof(struct usbd_xfer *xfer, voi
 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
 	struct usbnet_chain *c = priv;
 	struct usbnet * const un = c->unc_un;
+	struct usbnet_cdata *cd = &un->un_cdata;
 	struct ifnet * const ifp = usbnet_ifp(un);
 	uint32_t total_len;
 
@@ -199,14 +267,14 @@ usbnet_rxeof(struct usbd_xfer *xfer, voi
 
 	usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL);
 
-	if (total_len > un->un_cdata.uncd_rx_bufsz) {
+	if (total_len > cd->uncd_rx_bufsz) {
 		aprint_error_dev(un->un_dev,
 		    "rxeof: too large transfer (%u > %u)\n",
-		    total_len, un->un_cdata.uncd_rx_bufsz);
+		    total_len, cd->uncd_rx_bufsz);
 		goto done;
 	}
 
-	(*un->un_rx_loop_cb)(un, xfer, c, total_len);
+	uno_rx_loop(un, xfer, c, total_len);
 	KASSERT(mutex_owned(&un->un_rxlock));
 
 done:
@@ -216,8 +284,8 @@ done:
 	mutex_exit(&un->un_rxlock);
 
 	/* Setup new transfer. */
-	usbd_setup_xfer(xfer, c, c->unc_buf, un->un_cdata.uncd_rx_bufsz,
-	    un->un_rx_xfer_flags, USBD_NO_TIMEOUT, usbnet_rxeof);
+	usbd_setup_xfer(xfer, c, c->unc_buf, cd->uncd_rx_bufsz,
+	    cd->uncd_rx_xfer_flags, USBD_NO_TIMEOUT, usbnet_rxeof);
 	usbd_transfer(xfer);
 	return;
 
@@ -293,8 +361,7 @@ usbnet_intr(struct usbd_xfer *xfer, void
 		return;
 	}
 
-	if (un->un_intr_cb)
-		(*un->un_intr_cb)(un, status);
+	uno_intr(un, status);
 }
 
 static void
@@ -319,9 +386,9 @@ usbnet_start_locked(struct ifnet *ifp)
 		if (m == NULL)
 			break;
 
-		struct usbnet_chain *c = &un->un_cdata.uncd_tx_chain[idx];
+		struct usbnet_chain *c = &cd->uncd_tx_chain[idx];
 
-		length = (*un->un_tx_prepare_cb)(un, m, c);
+		length = uno_tx_prepare(un, m, c);
 		if (length == 0) {
 			ifp->if_oerrors++;
 			break;
@@ -333,7 +400,7 @@ usbnet_start_locked(struct ifnet *ifp)
 		}
 
 		usbd_setup_xfer(c->unc_xfer, c, c->unc_buf, length,
-		    un->un_tx_xfer_flags, 10000, usbnet_txeof);
+		    cd->uncd_tx_xfer_flags, 10000, usbnet_txeof);
 
 		/* Transmit */
 		usbd_status err = usbd_transfer(c->unc_xfer);
@@ -388,11 +455,10 @@ usbnet_rx_list_size(struct usbnet_cdata 
 }
 
 static void
-usbnet_rx_list_alloc(struct usbnet *un, unsigned cnt)
+usbnet_rx_list_alloc(struct usbnet *un)
 {
 	struct usbnet_cdata *cd = &un->un_cdata;
 
-	cd->uncd_rx_list_cnt = cnt;
 	cd->uncd_rx_chain = kmem_zalloc(usbnet_rx_list_size(cd), KM_SLEEP);
 }
 
@@ -408,7 +474,7 @@ usbnet_rx_list_free(struct usbnet *un)
 }
 
 static int
-usbnet_rx_list_init(struct usbnet *un, unsigned xfer_flags)
+usbnet_rx_list_init(struct usbnet *un)
 {
 	struct usbnet_cdata *cd = &un->un_cdata;
 
@@ -418,7 +484,8 @@ usbnet_rx_list_init(struct usbnet *un, u
 		c->unc_un = un;
 		if (c->unc_xfer == NULL) {
 			int err = usbd_create_xfer(un->un_ep[USBNET_ENDPT_RX],
-			    cd->uncd_rx_bufsz, xfer_flags, 0, &c->unc_xfer);
+			    cd->uncd_rx_bufsz, cd->uncd_rx_xfer_flags, 0,
+			    &c->unc_xfer);
 			if (err)
 				return err;
 			c->unc_buf = usbd_get_buffer(c->unc_xfer);
@@ -459,7 +526,7 @@ usbnet_rx_start_pipes(struct usbnet *un,
 		struct usbnet_chain *c = &cd->uncd_rx_chain[i];
 
 		usbd_setup_xfer(c->unc_xfer, c, c->unc_buf, cd->uncd_rx_bufsz,
-		    un->un_rx_xfer_flags, USBD_NO_TIMEOUT, cb);
+		    cd->uncd_rx_xfer_flags, USBD_NO_TIMEOUT, cb);
 		usbd_transfer(c->unc_xfer);
 	}
 
@@ -476,11 +543,10 @@ usbnet_tx_list_size(struct usbnet_cdata 
 }
 
 static void
-usbnet_tx_list_alloc(struct usbnet *un, unsigned cnt)
+usbnet_tx_list_alloc(struct usbnet *un)
 {
 	struct usbnet_cdata *cd = &un->un_cdata;
 
-	cd->uncd_tx_list_cnt = cnt;
 	cd->uncd_tx_chain = kmem_zalloc(usbnet_tx_list_size(cd), KM_SLEEP);
 }
 
@@ -496,7 +562,7 @@ usbnet_tx_list_free(struct usbnet *un)
 }
 
 static int
-usbnet_tx_list_init(struct usbnet *un, unsigned xfer_flags)
+usbnet_tx_list_init(struct usbnet *un)
 {
 	struct usbnet_cdata *cd = &un->un_cdata;
 
@@ -506,7 +572,8 @@ usbnet_tx_list_init(struct usbnet *un, u
 		c->unc_un = un;
 		if (c->unc_xfer == NULL) {
 			int err = usbd_create_xfer(un->un_ep[USBNET_ENDPT_TX],
-			    cd->uncd_tx_bufsz, xfer_flags, 0, &c->unc_xfer);
+			    cd->uncd_tx_bufsz, cd->uncd_tx_xfer_flags, 0,
+			    &c->unc_xfer);
 			if (err)
 				return err;
 			c->unc_buf = usbd_get_buffer(c->unc_xfer);
@@ -592,7 +659,7 @@ usbnet_ep_stop_pipes(struct usbnet *un)
 }
 
 int
-usbnet_init_rx_tx(struct usbnet * const un, unsigned rxflags, unsigned txflags)
+usbnet_init_rx_tx(struct usbnet * const un)
 {
 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
 	struct ifnet * const ifp = usbnet_ifp(un);
@@ -616,14 +683,14 @@ usbnet_init_rx_tx(struct usbnet * const 
 	}
 
 	/* Init RX ring. */
-	if (usbnet_rx_list_init(un, rxflags)) {
+	if (usbnet_rx_list_init(un)) {
 		aprint_error_dev(un->un_dev, "rx list init failed\n");
 		error = ENOBUFS;
 		goto out;
 	}
 
 	/* Init TX ring. */
-	if (usbnet_tx_list_init(un, txflags)) {
+	if (usbnet_tx_list_init(un)) {
 		aprint_error_dev(un->un_dev, "tx list init failed\n");
 		error = ENOBUFS;
 		goto out;
@@ -700,7 +767,7 @@ usbnet_unlock_mii_un_locked(struct usbne
 }
 
 int
-usbnet_miibus_readreg(device_t dev, int phy, int reg, uint16_t *val)
+usbnet_mii_readreg(device_t dev, int phy, int reg, uint16_t *val)
 {
 	struct usbnet * const un = device_private(dev);
 	usbd_status err;
@@ -713,7 +780,7 @@ usbnet_miibus_readreg(device_t dev, int 
 	mutex_exit(&un->un_lock);
 
 	usbnet_lock_mii(un);
-	err = (*un->un_read_reg_cb)(un, phy, reg, val);
+	err = uno_read_reg(un, phy, reg, val);
 	usbnet_unlock_mii(un);
 
 	if (err) {
@@ -725,7 +792,7 @@ usbnet_miibus_readreg(device_t dev, int 
 }
 
 int
-usbnet_miibus_writereg(device_t dev, int phy, int reg, uint16_t val)
+usbnet_mii_writereg(device_t dev, int phy, int reg, uint16_t val)
 {
 	struct usbnet * const un = device_private(dev);
 	usbd_status err;
@@ -738,7 +805,7 @@ usbnet_miibus_writereg(device_t dev, int
 	mutex_exit(&un->un_lock);
 
 	usbnet_lock_mii(un);
-	err = (*un->un_write_reg_cb)(un, phy, reg, val);
+	err = uno_write_reg(un, phy, reg, val);
 	usbnet_unlock_mii(un);
 
 	if (err) {
@@ -750,12 +817,12 @@ usbnet_miibus_writereg(device_t dev, int
 }
 
 void
-usbnet_miibus_statchg(struct ifnet *ifp)
+usbnet_mii_statchg(struct ifnet *ifp)
 {
 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
 	struct usbnet * const un = ifp->if_softc;
 
-	(*un->un_statchg_cb)(ifp);
+	uno_mii_statchg(un, ifp);
 }
 
 static int
@@ -813,16 +880,12 @@ usbnet_ioctl(struct ifnet *ifp, u_long c
 	struct usbnet * const un = ifp->if_softc;
 	int error;
 
-	if (un->un_override_ioctl_cb)
-		return (*un->un_override_ioctl_cb)(ifp, cmd, data);
+	if (un->un_ops->uno_override_ioctl)
+		return uno_override_ioctl(un, ifp, cmd, data);
 
 	error = ether_ioctl(ifp, cmd, data);
-	if (error == ENETRESET) {
-		if (un->un_ioctl_cb)
-			error = (*un->un_ioctl_cb)(ifp, cmd, data);
-		else
-			error = 0;
-	}
+	if (error == ENETRESET)
+		error = uno_ioctl(un, ifp, cmd, data);
 
 	return error;
 }
@@ -853,8 +916,7 @@ usbnet_stop(struct usbnet *un, struct if
 	mutex_exit(&un->un_txlock);
 	mutex_exit(&un->un_rxlock);
 
-	if (un->un_stop_cb)
-		(*un->un_stop_cb)(ifp, disable);
+	uno_stop(un, ifp, disable);
 
 	/*
 	 * XXXSMP Would like to
@@ -974,7 +1036,7 @@ usbnet_init(struct ifnet *ifp)
 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
 	struct usbnet * const un = ifp->if_softc;
 
-	return (*un->un_init_cb)(ifp);
+	return uno_init(un, ifp);
 }
 
 /* Autoconf management. */
@@ -1003,18 +1065,31 @@ void
 usbnet_attach(struct usbnet *un,
 	      const char *detname,	/* detach cv name */
 	      unsigned rx_list_cnt,	/* size of rx chain list */
-	      unsigned tx_list_cnt)	/* size of tx chain list */
+	      unsigned tx_list_cnt,	/* size of tx chain list */
+	      unsigned rx_flags,	/* flags for rx xfer */
+	      unsigned tx_flags,	/* flags for tx xfer */
+	      unsigned rx_bufsz,	/* size of rx buffers */
+	      unsigned tx_bufsz)	/* size of tx buffers */
 {
 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
+	struct usbnet_cdata *cd = &un->un_cdata;
 
-	KASSERT(un->un_tx_prepare_cb);
-	KASSERT(un->un_rx_loop_cb);
-	KASSERT(un->un_init_cb);
-	KASSERT(un->un_cdata.uncd_rx_bufsz);
-	KASSERT(un->un_cdata.uncd_tx_bufsz);
+	/* Required inputs.  */
+	KASSERT(un->un_ops->uno_tx_prepare);
+	KASSERT(un->un_ops->uno_rx_loop);
+	KASSERT(un->un_ops->uno_init);
+	KASSERT(rx_bufsz);
+	KASSERT(tx_bufsz);
 	KASSERT(rx_list_cnt);
 	KASSERT(tx_list_cnt);
 
+	cd->uncd_rx_xfer_flags = rx_flags;
+	cd->uncd_tx_xfer_flags = tx_flags;
+	cd->uncd_rx_list_cnt = rx_list_cnt;
+	cd->uncd_tx_list_cnt = tx_list_cnt;
+	cd->uncd_rx_bufsz = rx_bufsz;
+	cd->uncd_tx_bufsz = tx_bufsz;
+
 	ether_set_ifflags_cb(&un->un_ec, usbnet_ifflags_cb);
 
 	usb_init_task(&un->un_ticktask, usbnet_tick_task, un, USB_TASKQ_MPSAFE);
@@ -1030,8 +1105,8 @@ usbnet_attach(struct usbnet *un,
 	rnd_attach_source(&un->un_rndsrc, device_xname(un->un_dev),
 	    RND_TYPE_NET, RND_FLAG_DEFAULT);
 
-	usbnet_rx_list_alloc(un, rx_list_cnt);
-	usbnet_tx_list_alloc(un, tx_list_cnt);
+	usbnet_rx_list_alloc(un);
+	usbnet_tx_list_alloc(un);
 
 	un->un_attached = true;
 }
@@ -1043,10 +1118,14 @@ usbnet_attach_mii(struct usbnet *un, int
 	struct mii_data * const mii = &un->un_mii;
 	struct ifnet *ifp = usbnet_ifp(un);
 
+	KASSERT(un->un_ops->uno_read_reg);
+	KASSERT(un->un_ops->uno_write_reg);
+	KASSERT(un->un_ops->uno_statchg);
+
 	mii->mii_ifp = ifp;
-	mii->mii_readreg = usbnet_miibus_readreg;
-	mii->mii_writereg = usbnet_miibus_writereg;
-	mii->mii_statchg = usbnet_miibus_statchg;
+	mii->mii_readreg = usbnet_mii_readreg;
+	mii->mii_writereg = usbnet_mii_writereg;
+	mii->mii_statchg = usbnet_mii_statchg;
 	mii->mii_flags = MIIF_AUTOTSLEEP;
 
 	un->un_ec.ec_mii = mii;

Index: src/sys/dev/usb/usbnet.h
diff -u src/sys/dev/usb/usbnet.h:1.6 src/sys/dev/usb/usbnet.h:1.7
--- src/sys/dev/usb/usbnet.h:1.6	Wed Aug  7 07:25:50 2019
+++ src/sys/dev/usb/usbnet.h	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbnet.h,v 1.6 2019/08/07 07:25:50 skrll Exp $	*/
+/*	$NetBSD: usbnet.h,v 1.7 2019/08/09 01:17:33 mrg Exp $	*/
 
 /*
  * Copyright (c) 2019 Matthew R. Green
@@ -122,6 +122,9 @@ struct usbnet_cdata {
 	unsigned		uncd_rx_list_cnt;
 	unsigned		uncd_tx_list_cnt;
 
+	int			uncd_rx_xfer_flags;
+	int			uncd_tx_xfer_flags;
+
 	int			uncd_tx_prod;
 	int			uncd_tx_cnt;
 	int			uncd_rx_cnt;
@@ -163,6 +166,19 @@ typedef void (*usbnet_rx_loop_cb)(struct
 /* Interrupt pipe callback. */
 typedef void (*usbnet_intr_cb)(struct usbnet *, usbd_status);
 
+struct usbnet_ops {
+	usbnet_stop_cb		uno_stop;
+	usbnet_ioctl_cb		uno_ioctl;
+	usbnet_ioctl_cb		uno_override_ioctl;
+	usbnet_init_cb		uno_init;
+	usbnet_mii_read_reg_cb	uno_read_reg;
+	usbnet_mii_write_reg_cb uno_write_reg;
+	usbnet_mii_statchg_cb	uno_statchg;
+	usbnet_tx_prepare_cb	uno_tx_prepare;
+	usbnet_rx_loop_cb	uno_rx_loop;
+	usbnet_intr_cb		uno_intr;
+};
+
 /*
  * Generic USB ethernet structure.  Use this as ifp->if_softc and
  * set as device_private() in attach.
@@ -177,6 +193,7 @@ struct usbnet {
 	struct usbd_interface	*un_iface;
 	struct usbd_device *	un_udev;
 	krndsource_t		un_rndsrc;
+	struct usbnet_ops	*un_ops;
 
 	struct ethercom		un_ec;
 	struct mii_data		un_mii;
@@ -217,21 +234,6 @@ struct usbnet {
 	struct timeval		un_tx_notice;
 	struct timeval		un_intr_notice;
 
-	usbnet_stop_cb		un_stop_cb;
-	usbnet_ioctl_cb		un_ioctl_cb;
-	usbnet_ioctl_cb		un_override_ioctl_cb;
-	usbnet_init_cb		un_init_cb;
-	usbnet_mii_read_reg_cb	un_read_reg_cb;
-	usbnet_mii_write_reg_cb un_write_reg_cb;
-	usbnet_mii_statchg_cb	un_statchg_cb;
-	usbnet_tx_prepare_cb	un_tx_prepare_cb;
-	usbnet_rx_loop_cb	un_rx_loop_cb;
-	usbnet_intr_cb		un_intr_cb;
-
-	/* Passed to usbd_setup_xfer(). */
-	int			un_rx_xfer_flags;
-	int			un_tx_xfer_flags;
-
 	/*
 	 * if un_intr_buf is not NULL, use usbd_open_pipe_intr() not
 	 * usbd_open_pipe() for USBNET_ENDPT_INTR, with this buffer,
@@ -243,9 +245,11 @@ struct usbnet {
 };
 
 #define usbnet_ifp(un)		(&(un)->un_ec.ec_if)
-#define usbnet_mii(un)		(un->un_ec.ec_mii)
 #define usbnet_ec(un)		(&(un)->un_ec)
-#define usbnet_softc(un)	(un->un_sc)
+#define usbnet_rndsrc(un)	(&(un)->un_rndsrc)
+#define usbnet_mii(un)		((un)->un_ec.ec_mii)
+#define usbnet_softc(un)	((un)->un_sc)
+#define usbnet_isdying(un)	((un)->un_dying)
 
 /*
  * Endpoint / rx/tx chain management:
@@ -259,7 +263,7 @@ struct usbnet {
  * Setup un_ed[] with valid end points before calling usbnet_init_rx_tx().
  * Will return with un_ep[] initialised upon success.
  */
-int	usbnet_init_rx_tx(struct usbnet * const, unsigned, unsigned);
+int	usbnet_init_rx_tx(struct usbnet * const);
 
 /* locking */
 static __inline__ void
@@ -328,9 +332,9 @@ usbnet_isowned_mii(struct usbnet *un)
 	KASSERT(mutex_owned(&un->un_miilock));
 }
 
-int	usbnet_miibus_readreg(device_t, int, int, uint16_t *);
-int	usbnet_miibus_writereg(device_t, int, int, uint16_t);
-void	usbnet_miibus_statchg(struct ifnet *);
+int	usbnet_mii_readreg(device_t, int, int, uint16_t *);
+int	usbnet_mii_writereg(device_t, int, int, uint16_t);
+void	usbnet_mii_statchg(struct ifnet *);
 
 /* interrupt handling */
 void	usbnet_enqueue(struct usbnet * const, uint8_t *, size_t, int,
@@ -338,7 +342,8 @@ void	usbnet_enqueue(struct usbnet * cons
 void	usbnet_input(struct usbnet * const, uint8_t *, size_t);
 
 /* autoconf */
-void	usbnet_attach(struct usbnet *un, const char *, unsigned, unsigned);
+void	usbnet_attach(struct usbnet *un, const char *, unsigned, unsigned,
+		      unsigned, unsigned, unsigned, unsigned);
 void	usbnet_attach_ifp(struct usbnet *, bool, unsigned, unsigned, int);
 int	usbnet_detach(device_t, int);
 int	usbnet_activate(device_t, devact_t);

Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.603 src/sys/sys/param.h:1.604
--- src/sys/sys/param.h:1.603	Wed Aug  7 00:39:23 2019
+++ src/sys/sys/param.h	Fri Aug  9 01:17:33 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.603 2019/08/07 00:39:23 pgoyette Exp $	*/
+/*	$NetBSD: param.h,v 1.604 2019/08/09 01:17:33 mrg Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -67,7 +67,7 @@
  *	2.99.9		(299000900)
  */
 
-#define	__NetBSD_Version__	999000400	/* NetBSD 9.99.4 */
+#define	__NetBSD_Version__	999000500	/* NetBSD 9.99.5 */
 
 #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
     (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)

Reply via email to