summaryrefslogtreecommitdiff
path: root/static/netbsd/man9/usbnet.9
diff options
context:
space:
mode:
authorJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-25 15:32:58 -0400
committerJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-25 15:32:58 -0400
commit5cb84ec742fd33f78c8022863fadaa8d0d93e176 (patch)
tree1a81ca3665e6153923e40db7b0d988f8573ab59c /static/netbsd/man9/usbnet.9
parenta59214f344567c037d5776879bcfc5fcc1d4d5f6 (diff)
feat: Added NetBSD man pages
Diffstat (limited to 'static/netbsd/man9/usbnet.9')
-rw-r--r--static/netbsd/man9/usbnet.9827
1 files changed, 827 insertions, 0 deletions
diff --git a/static/netbsd/man9/usbnet.9 b/static/netbsd/man9/usbnet.9
new file mode 100644
index 00000000..f87f2a0f
--- /dev/null
+++ b/static/netbsd/man9/usbnet.9
@@ -0,0 +1,827 @@
+.\" $NetBSD: usbnet.9,v 1.23 2026/01/26 00:19:29 gutteridge Exp $
+.\"
+.\" Copyright (c) 2019 Matthew R. Green
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd March 15, 2020
+.Dt USBNET 9
+.Os
+.Sh NAME
+.Nm usbnet
+.Nd common USB Ethernet driver framework
+.Sh SYNOPSIS
+.In dev/usb/usbnet.h
+.Ss Functions offered by usbnet.h
+.Ft void
+.Fn usbnet_set_link "struct usbnet *un" "bool link"
+.Ft struct ifnet *
+.Fn usbnet_ifp "struct usbnet *un"
+.Ft struct ethercom *
+.Fn usbnet_ec "struct usbnet *un"
+.Ft struct mii_data *
+.Fn usbnet_mii "struct usbnet *un"
+.Ft krndsource_t *
+.Fn usbnet_rndsrc "struct usbnet *un"
+.Ft void *
+.Fn usbnet_softc "struct usbnet *un"
+.Ft bool
+.Fn usbnet_havelink "struct usbnet *un"
+.Ft int
+.Fn usbnet_ispromisc "struct usbnet *un"
+.Ft bool
+.Fn usbnet_isdying "struct usbnet *un"
+.Ft void
+.Fn usbnet_enqueue "struct usbnet *un" "uint8_t *buf" "size_t buflen" "int csum_flags" "uint32_t csum_data" "int mbuf_flags"
+.Ft void
+.Fn usbnet_input "struct usbnet *un" "uint8_t *buf" "size_t buflen"
+.Ft void
+.Fn usbnet_attach "struct usbnet *un"
+.Ft void
+.Fn usbnet_attach_ifp "struct usbnet *un" "unsigned if_flags" "unsigned if_extflags" "const struct usbnet_mii *unm"
+.Ft int
+.Fn usbnet_detach "device_t dev" "int flags"
+.Ft int
+.Fn usbnet_activate "device_t dev" "devact_t act"
+.Sh DESCRIPTION
+The
+.Nm
+framework provides methods usable for USB Ethernet drivers.
+The framework has support for these features:
+.Bl -bullet -offset 8n
+.It
+Partial autoconf handling
+.It
+USB endpoint pipe handling
+.It
+Rx and Tx chain handling
+.It
+Generic handlers or support for several struct ifnet callbacks
+.It
+Network stack locking protocol
+.It
+Interrupt handling
+.El
+.Pp
+.Nm
+provides many or all of the traditional
+.Dq softc
+members inside
+.Va struct usbnet ,
+which can be used directly as the device softc structure if
+no additional storage is required.
+A structure exists for receive and transmit chain management,
+.Va struct usbnet_chain ,
+that tracks the metadata for each transfer descriptor available,
+minimum of one each for Rx and Tx slots, and will be passed
+to the Rx and Tx callbacks.
+.Pp
+There is a
+.Va struct usbnet_ops
+structure that provides a number of optional and required callbacks
+that will be described below.
+.Pp
+For autoconfiguration the device attach routine is expected to
+ensure that this device's
+.Va struct usbnet
+is the first member of the device softc, if it can not be used directly
+as the device softc, as well as set up the necessary structure members,
+find end-points, find the Ethernet address if relevant, call
+.Fn usbnet_attach ,
+set up interface, Ethernet, and MII capabilities, and finally call
+.Fn usbnet_attach_ifp .
+The device detach routine should free any resources allocated
+by attach and then call
+.Fn usbnet_detach ,
+possibly directly using
+.Fn usbnet_detach
+as most consumers have no additional resources not owned and
+released by the
+.Nm
+framework itself.
+The device activate function should be set to
+.Fn usbnet_activate .
+.Pp
+When bringing an interface up from
+.Xr if_init 9 ,
+which happens under
+.Xr IFNET_LOCK 9 ,
+.Nm
+will:
+.Bl -enum
+.It
+call
+.Dq uno_init
+to initialize the hardware for sending and receiving packets,
+.It
+open the USB pipes,
+.It
+allocate Rx and Tx buffers for transfers,
+.It
+call
+.Dq uno_mcast
+to initially program the hardware multicast filter, and finally
+.It
+start the Rx transfers so packets can be received.
+.El
+.Pp
+See the
+.Sx RECEIVE AND SEND
+section for details on using the chains.
+.Pp
+When bringing an interface down from
+.Xr if_stop 9 ,
+which happens under
+.Xr IFNET_LOCK 9 ,
+.Nm
+will:
+.Bl -enum
+.It
+abort the USB pipes,
+.It
+call
+.Dq uno_stop
+to stop the hardware from receiving packets (unless the device is
+detaching),
+.It
+free Rx and Tx buffers for transfers, and
+.It
+close the USB pipes.
+.El
+.Pp
+For interface ioctl, most of the handling is in the framework.
+While the interface is running, the optional
+.Dq uno_mcast
+callback is invoked after handling the
+.Dv SIOCADDMULTI
+and
+.Dv SIOCDELMULTI
+ioctl commands to update the hardware's multicast filter from the
+.Xr ethersubr 9
+lists.
+The optional
+.Dq uno_ioctl
+callback, which is invoked under
+.Xr IFNET_LOCK 9 ,
+can be used to program special settings like offload handling.
+.Pp
+If ioctl handling requires capturing device-specific ioctls then the
+.Dq uno_override_ioctl
+callback may be used instead to replace the framework's
+ioctl handler completely (i.e., the replacement should call any generic
+ioctl handlers such as
+.Fn ether_ioctl
+as required).
+For sending packets, the
+.Dq uno_tx_prepare
+callback must be used to convert
+an mbuf into a chain buffer ready for transmission.
+.Pp
+For devices requiring MII handling there are callbacks for reading and
+writing registers, and for status change events.
+Access to all the MII functions is serialized by
+.Nm .
+.Pp
+As receive must handle the case of multiple packets in one buffer,
+the support is split between the driver and the framework.
+A
+.Dq uno_rx_loop
+callback must be provided that loops over the incoming
+packet data found in a chain, performs necessary checking, and passes
+the network frame up the stack via either
+.Fn usbnet_enqueue
+or
+.Fn usbnet_input .
+Typically Ethernet devices prefer
+.Fn usbnet_enqueue .
+.Pp
+General accessor functions for
+.Fa struct usbnet :
+.Bl -tag -width 4n
+.It Fn usbnet_set_link un link
+Set the link status for this
+.Fa un
+to
+.Fa link .
+.It Fn usbnet_ifp un
+Returns pointer to this
+.Fa un Ns 's
+.Va struct ifnet .
+.It Fn usbnet_ec un
+Returns pointer to this
+.Fa un Ns 's
+.Va struct ethercom .
+.It Fn usbnet_mii un
+Returns pointer to this
+.Fa un Ns 's
+.Va struct mii_data .
+.It Fn usbnet_rndsrc un
+Returns pointer to this
+.Fa un Ns 's
+.Va krndsource_t .
+.It Fn usbnet_softc un
+Returns pointer to this
+.Fa un Ns 's
+device softc.
+.It Fn usbnet_havelink un
+Returns true if link is active.
+.It Fn usbnet_ispromisc un
+True if
+.Dv IFF_PROMISC
+is enabled, false if not.
+.Pp
+May be used only in
+.Dq uno_init
+and
+.Dq uno_mcast .
+.Pp
+Drivers must use this in
+.Dq uno_mcast
+instead of reading
+.Li ifp->if_flags .
+.It Fn usbnet_isdying un
+Returns true if device is dying (has been pulled or deactivated,
+pending detach).
+This should be used only to abort timeout loops early.
+.El
+.Pp
+Buffer enqueue handling for
+.Fa struct usbnet :
+.Bl -tag -width 4n
+.It Fn usbnet_enqueue un buf buflen csum_flags csum_data mbuf_flags
+Enqueue buffer
+.Fa buf
+for length
+.Fa buflen
+with higher layers, using the provided
+.Fa csum_flags ,
+and
+.Fa csum_data ,
+which are written directly to the mbuf packet header, and
+.Fa mbuf_flags ,
+which is or-ed into the mbuf flags for the created mbuf.
+.It Fn usbnet_input un buf buflen
+Enqueue buffer
+.Fa buf
+for length
+.Fa buflen
+with higher layers.
+.El
+.Pp
+Autoconfiguration handling for
+.Fa struct usbnet .
+See the
+.Sx AUTOCONFIGURATION
+section for more details about these functions.
+.Bl -tag -width 4n
+.It Fn usbnet_attach un
+Initial stage attach of a USB network device.
+Performs internal initialization and memory allocation only \(em
+nothing is published yet.
+.It Fn usbnet_attach_ifp un if_flags if_extflags unm
+Final stage attach of a USB network device.
+Publishes the network interface to the rest of the system.
+.Pp
+If the passed in
+.Fa unm
+is
+.Pf non- Dv NULL
+then an MII interface will be created using the values
+provided in the
+.Fa struct usbnet_mii
+structure, which has these members passed to
+.Fn mii_attach :
+.Bl -tag -width "un_mii_capmask"
+.It un_mii_flags
+Flags.
+.It un_mii_capmask
+Capability mask.
+.It un_mii_phyloc
+PHY location.
+.It un_mii_offset
+PHY offset.
+.El
+.Pp
+A default
+.Fa unm
+can be set using the
+.Fn USBNET_MII_DECL_DEFAULT
+macro.
+The
+.Fa if_flags
+and
+.Fa if_extflags
+will be or-ed into the interface flags and extflags.
+.It Fn usbnet_detach dev flags
+Device detach.
+Stops all activity and frees memory.
+Usable as
+.Xr driver 9
+detach method.
+.It Fn usbnet_activate dev act
+Device activate (deactivate) method.
+Usable as
+.Xr driver 9
+activate method.
+.El
+.Sh AUTOCONFIGURATION
+The framework expects the usbnet structure to have these members
+filled in with valid values or functions:
+.Bl -tag -width 6n
+.It un_sc
+Real softc allocated by autoconf and provided to attach, should be
+set to the usbnet structure if no device-specific softc is needed.
+.It un_dev
+device_t saved in attach, used for messages mostly.
+.It un_iface
+The USB iface handle for data interactions, see
+.Fn usbd_device2interface_handle
+for more details.
+.It un_udev
+The struct usbd_device for this device, provided as the usb_attach_arg's
+.Va uaa_device
+member.
+.It un_ops
+Points to a
+.Va struct usbnet_ops
+structure which contains these members:
+.Bl -tag -width 4n
+.It Ft void Fn (*uno_stop) "struct ifnet *ifp" "int disable"
+Stop hardware activity
+.Pq optional .
+Called under
+.Xr IFNET_LOCK 9
+when bringing the interface down, but skipped when the device is
+detaching.
+.It Ft int Fn (*uno_ioctl) "struct ifnet *ifp" "u_long cmd" "void *data"
+Handle driver-specific ioctls
+.Pq optional .
+Called under
+.Xr IFNET_LOCK 9 .
+.It Ft void Fn (*uno_mcast) "struct ifnet *"
+Program hardware multicast filters from
+.Xr ethersubr 9
+lists
+.Pq optional .
+Called between, and not during,
+.Dq uno_init
+and
+.Dq uno_stop .
+.It Ft int Fn (*uno_override_ioctl) "struct ifnet *ifp" "u_long cmd" "void *data"
+Handle all ioctls, including standard ethernet ioctls normally handled
+internally by
+.Nm
+.Pq optional .
+May or may not be called under
+.Xr IFNET_LOCK 9 .
+.It Ft int Fn (*uno_init) "struct ifnet *ifp"
+Initialize hardware activity
+.Pq optional .
+Called under
+.Xr IFNET_LOCK 9
+when bringing the interface up.
+.It Ft int Fn (*uno_read_reg) "struct usbnet *un" "int phy" "int reg" "uint16_t *val"
+Read MII register.
+Required with MII.
+Serialized with other MII functions, and only called after
+.Dq uno_init
+and before
+.Dq uno_stop .
+.It Ft int Fn (*uno_write_reg) "struct usbnet *un" "int phy" "int reg" "uint16_t val"
+Write MII register.
+Required with MII.
+Serialized with other MII functions, and only called after
+.Dq uno_init
+and before
+.Dq uno_stop .
+.It Ft usbd_status Fn (*uno_statchg) "struct ifnet *ifp"
+Handle MII status change.
+Required with MII.
+Serialized with other MII functions, and only called after
+.Dq uno_init
+and before
+.Dq uno_stop .
+.It Ft unsigned Fn (*uno_tx_prepare) "struct usbnet *un" "struct mbuf *m" "struct usbnet_chain *c"
+Prepare an mbuf for transmit.
+Required.
+Called sequentially between, and not during,
+.Dq uno_init
+and
+.Dq uno_stop .
+.It Ft void Fn (*uno_rx_loop) "struct usbnet *un" "struct usbnet_chain *c" "uint32_t total_len"
+Prepare one or more chain for enqueue.
+Required.
+Called sequentially between, and not during,
+.Dq uno_init
+and
+.Dq uno_stop .
+.It Ft void Fn (*uno_intr) "struct usbnet *un" "usbd_status status"
+Process periodic interrupt
+.Pq optional .
+Called sequentially between, and not during,
+.Dq uno_init
+and
+.Dq uno_stop .
+.It Ft void Fn (*uno_tick) "struct usbnet *un"
+Called every second with USB task thread context
+.Pq optional .
+Called sequentially between, and not during,
+.Dq uno_init
+and
+.Dq uno_stop .
+.El
+.It un_intr
+Points to a
+.Va struct usbnet_intr
+structure which should have these members set:
+.Bl -tag -width 4n
+.It uni_buf
+If
+.Pf non- Dv NULL ,
+points to a buffer passed to
+.Fn usbd_open_pipe_intr
+in the device init callback, along with the size and interval.
+.It uni_bufsz
+Size of interrupt pipe buffer.
+.It uni_interval
+Frequency of the interrupt in milliseconds.
+.El
+.It un_ed
+Array of endpoint descriptors.
+There indexes are provided:
+.Dv USBNET_ENDPT_RX ,
+.Dv USBNET_ENDPT_TX ,
+and
+.Dv USBNET_ENDPT_INTR .
+The Rx and Tx endpoints are required.
+.It un_phyno
+MII phy number.
+Not used by
+.Nm .
+.It un_eaddr
+6 bytes of Ethernet address that must be provided before calling
+.Fn usbnet_attach_ifp
+if the device has Ethernet.
+.It un_flags
+Device owned flags word.
+The
+.Nm
+framework will not touch this value.
+.It un_rx_xfer_flags
+Passed to
+.Fn usbd_setup_xfer
+for receiving packets.
+.It un_tx_xfer_flags
+Passed to
+.Fn usbd_setup_xfer
+for sending packets.
+.It un_rx_list_cnt
+Number of chain elements to allocate for Rx.
+.It un_tx_list_cnt
+Number of chain elements to allocate for Tx.
+.It un_rx_bufsz
+Rx buffer size.
+.It un_tx_bufsz
+Tx buffer size.
+.El
+.Pp
+The device detach and activate callbacks can typically be set to
+.Fn usbnet_detach
+and
+.Fn usbnet_activate
+unless device-specific handling is required, in which case, they
+can be called before or after such handling.
+.Pp
+The capabilities described in both
+.Va struct ifp
+and
+.Va struct ethercom
+must be set before calling
+.Fn usbnet_attach_ifp .
+.Sh RECEIVE AND SEND
+Receive and send routines are structured around the
+.Va usbnet_cdata
+and
+.Va usbnet_chain
+structures, the
+.Dv un_ed ,
+.Dv un_rx_xfer_flags ,
+and
+.Dv un_tx_xfer_flags
+members, and the
+.Fn uno_init ,
+.Fn uno_tx_prepare ,
+.Fn uno_rx_loop ,
+and
+.Fn uno_stop
+callbacks of
+.Va usbnet_ops .
+.Pp
+Typically, the device attach routine will fill in members of the
+.Va usbnet
+structure, as listed in
+.Sx AUTOCONFIGURATION .
+The
+.Dv un_ed
+array should have the
+.Dv USBNET_ENDPT_RX
+and
+.Dv USBNET_ENDPT_TX
+array entries filled in, and optionally the
+.Dv USBNET_ENDPT_INTR
+entry filled in if applicable.
+.Pp
+The
+.Fn uno_init
+callback enables the hardware, and if necessary reprograms the hardware
+multicast filter, before the framework initiates USB Tx/Rx transfers.
+All USB transfer setup is handled by the framework.
+The driver callbacks merely copy data in or out of a chain entry using
+what is typically a device-specific method.
+.Pp
+The
+.Fn uno_rx_loop
+callback, called sequentially, converts the provided
+.Va usbnet_chain
+data and length into a series (one or more) of packets that are
+enqueued with the higher layers using either
+.Fn usbnet_enqueue
+(for most devices) or
+.Fn usbnet_input
+for devices that use
+.Fn if_input .
+(This currently relies upon the
+.Va struct ifnet
+having the
+.Dq _if_input
+member set as well, which is true for current consumers.)
+.Pp
+The
+.Fn uno_tx_prepare
+callback must convert the provided
+.Va struct mbuf
+into the provided
+.Va struct usbnet_chain
+performing any device-specific padding, checksum, header or other.
+Note that this callback must check that it is not attempting to copy
+more than the chain buffer size, as set in the
+.Va usbnet
+.Dq un_tx_bufsz
+member.
+This callback is only called once per packet, sequentially.
+.Pp
+The
+.Fa struct usbnet_chain
+structure which contains a
+.Dq unc_buf
+member which has the chain buffer allocated where data should be
+copied to or from for receive or transmit operations.
+It also contains pointers back to the owning
+.Fa struct usbnet ,
+and the
+.Va struct usbd_xfer
+associated with this transfer.
+.Pp
+After aborting all USB Tx/Rx transfers when bringing an interface down,
+the framework calls the optional
+.Fn uno_stop
+callback to disable the hardware.
+.Sh MII
+For devices that have MII support these callbacks in
+.Fa struct usbnet_ops
+must be provided:
+.Bl -tag -width 4n
+.It uno_read_reg
+Read an MII register for a particular PHY.
+Returns standard
+.Xr errno 2 .
+Must initialize the result even on failure.
+.It uno_write_reg
+Write an MII register for a particular PHY.
+Returns standard
+.Xr errno 2 .
+.It uno_statchg
+Handle a status change event for this interface.
+.El
+.Sh INTERRUPT PIPE
+The interrupt-specific callback,
+.Dq uno_intr ,
+is an optional callback that can be called periodically, registered by
+.Nm
+using the
+.Fn usbd_open_pipe_intr
+function (instead of the
+.Fn usbd_open_pipe
+function).
+The
+.Nm
+framework provides most of the interrupt handling and the callback
+simply inspects the returned buffer as necessary.
+To enable this callback point the
+.Va struct usbnet
+member
+.Dq un_intr
+to a
+.Va struct usbnet_intr
+structure with these members set:
+.Bl -tag -width 4n
+.It uni_buf
+Data buffer for interrupt status replies.
+.It uni_bufsz
+Size of the above buffer.
+.It uni_interval
+Interval in millieconds.
+.El
+.Pp
+These values will be passed to
+.Fn usbd_open_pipe_intr .
+.Sh CONVERTING OLD-STYLE DRIVERS
+The porting of an older driver to the
+.Nm
+framework is largely an effort in deleting code.
+The process involves making these changes:
+.Bl -tag -width 4n
+.It Headers
+Many headers are included in
+.Pa usbnet.h
+and can be removed from the driver, as well as headers no longer used,
+such as
+.Pa callout.h
+and
+.Pa rndsource.h ,
+etc.
+.It Device softc
+The majority of the driver's existing
+.Dq softc
+structure can likely be replaced with usage of
+.Va struct usbnet
+and its related functionality.
+This includes at least the device_t pointer, Ethernet address, the
+ethercom and mii_data structures, end point descriptors, usbd device,
+interface, and task and callout structures (both these probably go
+away entirely) and all the associated watchdog handling,
+timevals, list size, buffer size and xfer flags for
+both Rx, and Tx, and interrupt notices, interface flags, device link,
+PHY number, chain data, locks including Rx, Tx, and MII.
+There is a driver-only
+.Dq un_flags
+in the
+.Va usbnet
+structure available for drivers to use.
+.Pp
+Many drivers can use the
+.Va usbnet
+structure as the device private storage passed to
+.Dv CFATTACH_DECL_NEW .
+Many internal functions to the driver may look better if switched to
+operate on the device's
+.Va usbnet
+as, for example, the
+.Va usbd_device
+value is now available (and must be set by the driver) in the
+.Va usbnet ,
+which may be needed for any call to
+.Fn usbd_do_request .
+The standard endpoint values must be stored in the
+.Nm
+.Dq un_ed[]
+array.
+.Pp
+As
+.Nm
+manages xfer chains all code related to the opening, closing, aborting
+and transferring of data on pipes is performed by the framework based
+upon the buffer size and more provided in
+.Va subnet ,
+so all code related to them should be deleted.
+.It Interface setup
+The vast majority of interface-specific code should be deleted.
+For device-specific interface values, the
+.Va ifnet
+flags and exflags can be set, as well as the
+.Va ethercom
+.Dq ec_capabilities
+member, before calling
+.Fn usbnet_attach_ifp .
+All calls to
+.Fn ifmedia_init ,
+.Fn mii_attach ,
+.Fn ifmedia_add ,
+.Fn ifmedia_set ,
+.Fn if_attach ,
+.Fn ether_ifattach ,
+.Fn rnd_attach_source ,
+and
+.Fn usbd_add_drv_event
+should be eliminated.
+The device
+.Dq ioctl
+routine can use the default handling with a callback for additional
+device-specific programming (multicast filters, etc.), which can be
+empty, or, the override ioctl can be used for heavier requirements.
+The device
+.Dq stop
+routine is replaced with a simple call that turns off the
+device-specific transmitter and receiver if necessary, as the
+framework handles pipes and transfers and buffers.
+.It MII handling
+For devices with MII support the three normal callbacks
+.Pq read, write, and status change
+must be converted to
+.Va usbnet .
+Local
+.Dq link
+variables need to be replaced with accesses to
+.Fn usbnet_set_link
+and
+.Fn usbnet_havelink .
+Other ifmedia callbacks that were passed to
+.Fn ifmedia_init
+should be deleted and any work moved into
+.Dq uno_statchg .
+.It Receive and Transmit
+The
+.Nm
+framework handles the majority of handling of both network directions.
+The interface init routine should keep all of the device-specific setup
+but replace all pipe management with a call to
+.Fn usbnet_init_rx_tx .
+The typical receive handling will normally be replaced with a receive
+loop function that can accept one or more packets,
+.Dq uno_rx_loop ,
+which can use either
+.Fn usbnet_enqueue
+or
+.Fn usbnet_input
+to pass the packets up to higher layers.
+The typical interface
+.Dq if_start
+function and any additional functions used will normally be replaced
+with a relatively simple
+.Dq uno_tx_prepare
+function that simply converts an
+.Va mbuf
+into a
+.Va usbnet_chain
+useful for this device that will be passed onto
+.Fn usbd_transfer .
+The framework's handling of the Tx interrupt is all internal.
+.It Interrupt pipe handling
+For devices requiring special handling of the interrupt pipe (i.e.,
+they use the
+.Fn usbd_open_pipe_intr
+method), most of the interrupt handler should be deleted, leaving
+only code that inspects the result of the interrupt transfer.
+.It Common errors
+It's common to forget to set link active on devices with MII.
+Be sure to call
+.Fn usbnet_set_link
+during any status change event.
+.Pp
+Many locking issues are hidden without
+.Dv LOCKDEBUG ,
+including hard-hangs.
+It's highly recommended to develop with
+.Dv LOCKDEBUG .
+.Pp
+The
+.Va usbnet
+.Dq un_ed
+array is unsigned and should use
+.Dq 0
+as the no-endpoint value.
+.El
+.Sh SEE ALSO
+.Xr usb 4 ,
+.Xr driver 9 ,
+.Xr usbd_status 9 ,
+.Xr usbdi 9
+.Sh HISTORY
+This
+.Nm
+interface first appeared in
+.Nx 9.0 .
+Portions of the original design are based upon ideas from
+.An Nick Hudson Aq Mt skrll@NetBSD.org .
+.Sh AUTHORS
+.An Matthew R. Green Aq Mt mrg@eterna23.net