Module Name: src Committed By: mrg Date: Sat Aug 10 20:35:36 UTC 2019
Modified Files: src/distrib/sets/lists/comp: mi src/share/man/man9: Makefile Added Files: src/share/man/man9: usbnet.9 Log Message: usbnet may be stable now. document it. To generate a diff of this commit: cvs rdiff -u -r1.2278 -r1.2279 src/distrib/sets/lists/comp/mi cvs rdiff -u -r1.437 -r1.438 src/share/man/man9/Makefile cvs rdiff -u -r0 -r1.1 src/share/man/man9/usbnet.9 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/comp/mi diff -u src/distrib/sets/lists/comp/mi:1.2278 src/distrib/sets/lists/comp/mi:1.2279 --- src/distrib/sets/lists/comp/mi:1.2278 Wed Jul 24 14:07:16 2019 +++ src/distrib/sets/lists/comp/mi Sat Aug 10 20:35:35 2019 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.2278 2019/07/24 14:07:16 joerg Exp $ +# $NetBSD: mi,v 1.2279 2019/08/10 20:35:35 mrg Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. ./etc/mtree/set.comp comp-sys-root @@ -11952,6 +11952,7 @@ ./usr/share/man/cat9/uprintf.0 comp-sys-catman .cat ./usr/share/man/cat9/usbd_status.0 comp-sys-catman .cat ./usr/share/man/cat9/usbdi.0 comp-sys-catman .cat +./usr/share/man/cat9/usbnet.0 comp-sys-catman .cat ./usr/share/man/cat9/useracc.0 comp-obsolete obsolete ./usr/share/man/cat9/userret.0 comp-sys-catman .cat ./usr/share/man/cat9/ustore.0 comp-sys-catman .cat @@ -19839,6 +19840,7 @@ ./usr/share/man/html9/uprintf.html comp-sys-htmlman html ./usr/share/man/html9/usbd_status.html comp-sys-htmlman html ./usr/share/man/html9/usbdi.html comp-sys-htmlman html +./usr/share/man/html9/usbnet.html comp-sys-htmlman html ./usr/share/man/html9/userret.html comp-sys-htmlman html ./usr/share/man/html9/ustore.html comp-sys-htmlman html ./usr/share/man/html9/ustore_16.html comp-sys-htmlman html @@ -27933,6 +27935,7 @@ ./usr/share/man/man9/uprintf.9 comp-sys-man .man ./usr/share/man/man9/usbd_status.9 comp-sys-man .man ./usr/share/man/man9/usbdi.9 comp-sys-man .man +./usr/share/man/man9/usbnet.9 comp-sys-man .man ./usr/share/man/man9/useracc.9 comp-obsolete obsolete ./usr/share/man/man9/userret.9 comp-sys-man .man ./usr/share/man/man9/ustore.9 comp-sys-man .man Index: src/share/man/man9/Makefile diff -u src/share/man/man9/Makefile:1.437 src/share/man/man9/Makefile:1.438 --- src/share/man/man9/Makefile:1.437 Wed May 8 14:25:39 2019 +++ src/share/man/man9/Makefile Sat Aug 10 20:35:35 2019 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.437 2019/05/08 14:25:39 isaki Exp $ +# $NetBSD: Makefile,v 1.438 2019/08/10 20:35:35 mrg Exp $ # Makefile for section 9 (kernel function and variable) manual pages. @@ -53,17 +53,18 @@ MAN= accept_filter.9 accf_data.9 accf_ht SET.9 setbit.9 setjmp.9 shutdownhook_establish.9 \ signal.9 skpc.9 sockopt.9 softintr.9 spl.9 specificdata.9 \ spi.9 splraiseipl.9 \ + store.9 \ suspendsched.9 \ sysctl.9 sysmon_envsys.9 sysmon_pswitch.9 sysmon_taskq.9 tc.9 \ tcp_congctl.9 threadpool.9 timecounter.9 time_second.9 todr.9 \ ts2timo.9 tvtohz.9 \ - ucas.9 uiomove.9 ucom.9 userret.9 \ + ubc.9 ucas.9 ucom.9 ufetch.9 uiomove.9 \ + usbd_status.9 usbdi.9 usbnet.9 \ + userret.9 \ + uvm.9 uvm_hotplug.9 uvm_km.9 uvm_map.9 \ vattr.9 veriexec.9 vcons.9 vfs.9 vfs_hooks.9 vfsops.9 vfssubr.9 \ - video.9 vme.9 \ - vnfileops.9 vnode.9 vnodeops.9 vnsubr.9 \ - ubc.9 ufetch.9 usbd_status.9 usbdi.9 ustore.9 uvm.9 uvm_hotplug.9 \ - uvm_km.9 uvm_map.9 \ - vmem.9 wapbl.9 wdc.9 workqueue.9 \ + video.9 vme.9 vnfileops.9 vnode.9 vnodeops.9 vnsubr.9 vmem.9 \ + wapbl.9 wdc.9 workqueue.9 \ wsbell.9 wscons.9 wsdisplay.9 wsfont.9 wskbd.9 wsmouse.9 \ xcall.9 Added files: Index: src/share/man/man9/usbnet.9 diff -u /dev/null src/share/man/man9/usbnet.9:1.1 --- /dev/null Sat Aug 10 20:35:36 2019 +++ src/share/man/man9/usbnet.9 Sat Aug 10 20:35:35 2019 @@ -0,0 +1,663 @@ +.\" $NetBSD: usbnet.9,v 1.1 2019/08/10 20:35:35 mrg 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. +.\" 3. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission. +.\" +.\" 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 August 10, 2019 +.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 void +.Fn usbnet_set_dying "struct usbnet *un" "bool dying" +.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 bool +.Fn usbnet_isdying "struct usbnet *un" +.Ft void +.Fn usbnet_lock "struct usbnet *un" +.Ft void +.Fn usbnet_unlock "struct usbnet *un" +.Ft kmutex_t * +.Fn usbnet_mutex "struct usbnet *un" +.Ft void +.Fn usbnet_isowned "struct usbnet *un" +.Ft void +.Fn usbnet_lock_rx "struct usbnet *un" +.Ft void +.Fn usbnet_unlock_rx "struct usbnet *un" +.Ft kmutex_t * +.Fn usbnet_mutex_rx "struct usbnet *un" +.Ft void +.Fn usbnet_isowned_rx "struct usbnet *un" +.Ft void +.Fn usbnet_lock_tx "struct usbnet *un" +.Ft void +.Fn usbnet_unlock_tx "struct usbnet *un" +.Ft kmutex_t * +.Fn usbnet_mutex_tx "struct usbnet *un" +.Ft void +.Fn usbnet_isowned_tx "struct usbnet *un" +.Ft int +.Fn usbnet_init_rx_tx "struct usbnet *un" "unsigned rxflags" "unsigned txflags" +.Ft void +.Fn usbnet_lock_mii "struct usbnet *un" +.Ft void +.Fn usbnet_lock_mii_un_locked "struct usbnet *un" +.Ft void +.Fn usbnet_unlock_mii "struct usbnet *un" +.Ft void +.Fn usbnet_unlock_mii_un_locked "struct usbnet *un" +.Ft kmutex_t * +.Fn usbnet_mutex_mii "struct usbnet *un" +.Ft void +.Fn usbnet_isowned_mii "struct usbnet *un" +.Ft int +.Fn usbnet_miibus_readreg "device_t dev" "int phy" "int reg" "uint16_t *val" +.Ft int +.Fn usbnet_miibus_writereg "device_t dev" "int phy" "int reg" "uint16_t val" +.Ft void +.Fn usbnet_miibus_statchg "struct ifnet *" +.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" "const char *detname" +.Ft void +.Fn usbnet_attach_ifp "struct usbnet *un" "bool have_mii" "unsigned if_flags" "unsigned if_extflags" "int mii_flags" +.Ft int +.Fn usbnet_detach "device_t dev" "int flags" +.Ft int +.Fn usbnet_activate "device_t dev" "devact_t act" +.Ft void +.Fn usbnet_stop "struct usbnet *un" "struct ifnet *ifp" "int disable" +.Sh DESCRIPTION +The +.Nm +framework provides methods usable for USB ethernet drivers. +The framework has support for these features: +.Pp +.Bl -tag -width "123456" +.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 +MII bus locking +.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. +An 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 slot, 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 set to the device +.Fa dv_private , +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 , +setup 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 +To manage all Rx and Tx chains the +.Dq uno_init +callback of +.Va struct usbnet_ops +should perform any device specific initialisation and then call +.Fn usbnet_init_rx_tx +which will allocate chains, setup and open pipes, and start the +Rx transfers so that packets can arrived. +These allocations and pipes can be closed and destroyed by calling +.Fn usbnet_stop . +Both of +.Fn usbnet_init_rx_tx +and +.Fn usbnet_stop +must be called with the +.Nm +lock held, see +.Fn usbnet_lock +and +.Fn usbnet_unlock . +See the +.Sx RECEIVE AND SEND +section for details on using the chains. +.Pp +The interface init, ioctl, start, and stop, routines are handled by the +framework with callbacks for device-specific handling. +For interface init (ie, when bringing the interface up), the +.Dq uno_init +callback should perform any device specific initialisation and then call +.Fn usbnet_init_rx_tx +to finalise Rx and Tx queue initialisation. +For interface ioctl, most of the handling is in the framework and the +optional +.Dq uno_ioctl +callback should be used to program special settings +like multicast filters or offload handling. +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 interface start, the +.Dq uno_tx_prepare +callback must be used to convert +an mbuf into a chain buffer ready for transmission. +For interface stop, there is an optional +.Dq uno_stop +callback to turn off any chipset specific values if required. +.Pp +For devices requiring MII handling there are callbacks for reading and +writing registers, and for status change events. +The framework provides an MII-specific lock per interface which will be +held when calling these functions, and these locks should be used by +internal code that also requires serialised access to registers with the +.Fn usbnet_lock_mii , +.Fn usbnet_unlock_mii , +.Fn usbnet_lock_mii_un_locked , +and +.Fn usbnet_unlock_mii_un_locked +functions. +These functions handle device detach events safely, and as such take +and release a reference on this device and use the usbnet lock for +this. +Sometimes the usbnet lock is already held and instead the +.Dq un_locked +versions should be used. +.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_set_dying un dying +Set the dying status for this +.Fa un +to +.Fa dying . +.It Fn usbnet_ifp un +Returns pointer to this +.Fa un's +.Va struct ifnet . +.It Fn usbnet_ec un +Returns pointer to this +.Fa un's +.Va struct ethercom . +.It Fn usbnet_mii un +Returns pointer to this +.Fa un's +.Va struct mii_data . +.It Fn usbnet_rndsrc un +Returns pointer to this +.Fa un's +.Va krndsource_t . +.It Fn usbnet_softc un +Returns pointer to this +.Fa un's +device softc. +.It Fn bool usbnet_havelink un +Returns true if link is active. +.It Fn bool usbnet_isdying un +Returns true if device is dying (has been pulled or deactivated, +pending detach.) +.El +.Pp + +Lock handling functions for +.Fa struct usbnet : +.Pp +.Bl -compact -tag -width 4n +.It Fn usbnet_lock un +.It Fn usbnet_unlock un +.It Fn usbnet_isowned un +.It Fn usbnet_lock_rx un +.It Fn usbnet_unlock_rx un +.It Fn usbnet_isowned_rx un +.It Fn usbnet_lock_tx un +.It Fn usbnet_unlock_tx un +.It Fn usbnet_isowned_tx un +.It Fn usbnet_lock_mii un +.It Fn usbnet_lock_mii_un_locked un +.It Fn usbnet_unlock_mii un +.It Fn usbnet_unlock_mii_un_locked un +.It Fn usbnet_isowned_mii un +These groups of three or five functions provide methods to lock, +unlock, and assert ownership of one of the four locks provided by +.Nm . +The four locks are the +.Dq softc +lock, the +.Dq Tx +lock, the +.Dq Rx +lock, and the +.Dq MII +lock. +The MII lock is special in that it blocks device detach using +an internal reference count and is frequently required when +both the +.Dq softc +lock is held or unheld, and two versions are provided that +either hold the +.Dq softc +lock while increasing or decreasing the reference count, or +assume (and in debug builds, assert) the lock is held for +the +.Dq un_locked +versions. +.El +.Pp +MII access functions for +.Fa struct usbnet : +.Pp +.Bl -tag -width 4n +.It Fn usbnet_mii_readreg dev phy reg valp +Read register +.Fa reg +on PHY number +.Fa phy +and return the value in +.Fa valp . +.It Fn usbnet_mii_writereg dev phy reg val +Write register +.Fa reg +on PHY number +.Fa phy +with +.Fa val . +.It Fn usbnet_mii_statchg ifp +Trigger a status change update for interface +.Fa ifp +.El +.Pp +Buffer enqueue handling for +.Fa struct usbnet : +.Pp +.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. +.Pp +.Bl -tag -width 4n +.It Fn usbnet_attach un detachname +Initial stage attach of a usb network device. +The +.Fa detachname +will be used while waiting for final references to drain when detaching. +.It Fn usbnet_attach_ifp un have_mii if_flags if_extflags mii_flags +Final stage attach of usb network device. +If +.Fa have_mii +is true then an MII interface will be created and +.Fa mii_flags +added. +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. +Usable as actual device method. +.It Fn usbnet_activate dev act +Device activate (deactivate) method. +Usable as actual device method. +.It Fn usbnet_stop un ifp disable +Interface stop routine. +.Pp +.Sh AUTOCONFIGURATION +The framework expects the usbnet structure to have these members +filled in with valid values or functions: +.Bl -tag +.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 uno_stop +Stop interface (optional.) +.It uno_ioctl +Simple ioctl callback (optional.) +.It uno_override_ioctl +Full ioctl callback (optional.) +.It uno_init +Initialise (bring up) interface. +Required. +Must call +.Fn usbnet_rx_tx_init . +.It uno_read_reg +Read MII register. +Required with MII. +.It uno_write_reg +Write MII register. +Required with MII. +.It uno_statchg +Handle MII status change. +Required with MII. +.It uno_tx_prepare +Prepare an mbuf for transmit. Required. +.It uno_rx_loop +Prepare one or more chain for enqueue. Required. +.It uno_intr +Process periodic interrupt (optional.) +.El +.It un_intr +Points to a +.Va struct usbnet_intr +structure which should have these members set: +.Bl -tag -width 4n +.It uni_intr_buf +If non-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_intr_bufsz +Size of interrupt pipe buffer. +.It uni_intr_interval +Frequency of the interrupt in milliseconds. +.El +.It un_ed +Array of endpoint descriptors. +There indexes are provded: +.Dq USBNET_ENDPT_RX , +.Dq USBNET_ENDPT_TX , +and +.Dq USBNET_ENDPT_INTR . +The Rx and Tx endpoints are required. +.It un_phyno +MII phy number. +.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 usbd_setup_xfer() for receiving packets. +.It un_tx_xfer_flags +Passed to 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 a the +.Va usbnet_cdata +and +.Va usbnet_chain +structures, then +.Dv un_ed , +.Dv un_rx_xfer_flags , +and +.Dv un_tx_xfer_flags , +members, and the +.Fn uno_stop , +.Fn uno_init , +.Fn uno_tx_prepare , +and +.Fn uno_rx_loop +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 +.Fn un_ed +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 optional +.Fn uno_stop +callback performs device-specific operations to shutdown the +transmit or receive handling. +.Pp +The +.Fn uno_init +callback both performs device-specific enablement and then calls +.Fn usbnet_rx_tx_init , +which sets up the receieve, transmit, and, optionally, the interrupt +pipes, as well as starting the receive pipes. +All USB transfer setup is handled internally to the framework, and +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 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 currently use +.Fn if_input. +.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. +This callback is only called once per packet. +.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 +.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 +.Fr usbd_status . +.It uno_write_reg +Write an MII register for a particular PHY. +Returns +.Fr usbd_status . +.It uno_statchg +Handle a status change event for this interface. +.El +.Pp +.Pp +.Sh INTERRUPT PIPE +The interrupt speicifc 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.) +To enable the +.Dq uno_intr +callback the +.Va struct usbnet +member +.Dq un_intr +must point to a +.Va struct usbnet_intr +structure that has the data buffer, size and interval to be passed to +.Fn usbd_open_pipe_intr . +.Pp +.Sh SEE ALSO +.Xr usb 4 , +.Xr driver 9 +.Xr usbdi 9 +.Xr usbd_status 9 +.Sh AUTHORS +.An Matthew R. Green Mt m...@eterna.com.au +.Sh HISTORY +This +.Nm +interface first appeared in +.Nx 9.0 .