MRI_POLL(9E)                 Driver Entry Points                MRI_POLL(9E)
NAME
     mri_poll - Poll a ring for received network data
SYNOPSIS
     #include <sys/mac_provider.h>     mblk_t *     prefix_ring_poll(
void *driver, 
int poll_bytes);
INTERFACE LEVEL
     Uncommitted - This interface is still evolving.  API and ABI stability
     is not guaranteed.
PARAMETERS
     driver        A pointer to the ring's private data that was passed in
                   via the 
mri_driver member of the 
mac_ring_info(9S)                   structure as part of the 
mr_rget(9E) entry point.     
poll_bytes    The maximum number of bytes that the driver should poll
                   in a given call.
DESCRIPTION
     The 
mri_poll() entry point is called by the MAC framework when it
     wishes to have the driver check the ring specified by 
driver for
     available data.
     The device driver should perform the same logic that it would when it's
     processing an interrupt and as described in the 
Receiving Data section
     of 
mac(9E).  The main difference is that instead of calling     
mac_rx_ring(9F), it should instead return that data as a 
mblk_t chain.
     Also, while an interrupt may map to more than one ring in some drivers,
     the driver should only process the ring indicated by 
driver.  The MAC
     framework can be polling some rings that are receiving a lot of traffic
     while still relying on interrupts for others.
     Drivers should exercise caution with the locking between the polling,
     interrupt disabling routines, and the interrupt handler.  This mutex is
     generally scoped to a receive ring and is used to synchronize the act
     of transitioning between polling and handling interrupts.  That means
     that in addition to the 
mri_poll() entry point, the 
mi_enable(9E) and     
mi_disable(9E) entry points should synchronize on the same mutex when
     transitioning the device.  This is the same mutex that would be used
     when processing this ring during an interrupt handler, though that
     mutex should only be used while processing a specific ring and not held
     for the duration of the entire interrupt handler.
     The driver should limit the number of frames it collects based on the
     size value present in the 
poll_bytes argument.  The driver should sum
     up the total size of each processed frame and compare that running
     total to 
poll_bytes.  If there are fewer frames than, 
poll_bytes, the
     driver should not wait and can instead return right away.  Similarly,
     if the driver has iterated around its entire descriptor ring and still
     does not have enough enough, it is OK to return early.  Importantly,
     the framework is 
not asking the driver to block until it has 
poll_bytes     available .
RETURN VALUES
     Upon successful completion, the device driver should return a message
     block chain of collected frames.  If no frames are available or it
     encountered an error while processing data, then it should return NULL.
SEE ALSO
     mac(9E), 
mac_capab_rings(9E), 
mi_disable(9E), 
mi_enable(9E),     
mr_rget(9E), 
mac_rx_ring(9F), 
mac_ring_info(9S)illumos                         July 17, 2023                        illumos