• Vladimir Oltean's avatar
    net: dsa: Add support for deferred xmit · 97a69a0d
    Vladimir Oltean authored
    Some hardware needs to take work to get convinced to receive frames on
    the CPU port (such as the sja1105 which takes temporary L2 forwarding
    rules over SPI that last for a single frame). Such work needs a
    sleepable context, and because the regular .ndo_start_xmit is atomic,
    this cannot be done in the tagger. So introduce a generic DSA mechanism
    that sets up a transmit skb queue and a workqueue for deferred
    transmission.
    
    The new driver callback (.port_deferred_xmit) is in dsa_switch and not
    in the tagger because the operations that require sleeping typically
    also involve interacting with the hardware, and not simply skb
    manipulations. Therefore having it there simplifies the structure a bit
    and makes it unnecessary to export functions from the driver to the
    tagger.
    
    The driver is responsible of calling dsa_enqueue_skb which transfers it
    to the master netdevice. This is so that it has a chance of performing
    some more work afterwards, such as cleanup or TX timestamping.
    
    To tell DSA that skb xmit deferral is required, I have thought about
    changing the return type of the tagger .xmit from struct sk_buff * into
    a enum dsa_tx_t that could potentially encode a DSA_XMIT_DEFER value.
    
    But the trailer tagger is reallocating every skb on xmit and therefore
    making a valid use of the pointer return value. So instead of reworking
    the API in complicated ways, right now a boolean property in the newly
    introduced DSA_SKB_CB is set.
    Signed-off-by: default avatarVladimir Oltean <olteanv@gmail.com>
    Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    97a69a0d
dsa.h 19.5 KB