• Claudiu Manoil's avatar
    gianfar: Fix and cleanup Rx FCB indication · ba779711
    Claudiu Manoil authored
    This fixes a less obvious error on one hand, and prevents futher
    similar errors by disambiguating and optimizing RxFCB indication,
    on the other hand.
    
    The error consists in NETIF_F_HW_VLAN_TX flag being used as an
    indication of Rx FCB insertion. This happened as soon gfar_uses_fcb(),
    which despite its name indicates Rx FCB insertion, started
    incorporating is_vlan_on().
    is_vlan_on(), on the other hand, is also a misleading construct because
    we need to differentiate b/w hw VLAN extraction/VLEX (marked by VLAN_RX
    flag) and hw VLAN insertion/VLINS (VLAN_TX flag), which are different
    mechanisms using different types of FCBs.
    
    The hw spec for the RxFCB feature is as follows:
    In the case of RxBD rings, FCBs (Frame Control Block) are inserted by
    the eTSEC whenever RCTRL[PRSDEP] is set to a non-zero value. Only one
    FCB is inserted per frame (in the buffer pointed to by the RxBD with
    bit F set). TOE acceleration for receive is enabled for all rx frames
    in this case.
    
    This patch introduces priv->uses_rxfcb field to quickly signal RxFCB
    insertion in accordance with the specification above.
    
    The dependency on FSL_GIANFAR_DEV_HAS_TIMER was also eliminated as
    another source of confusion. The actual dependency is to priv->hwts_rx_en.
    Upon changing priv->hwts_rx_en via IOCTL, the gfar device is being
    restarted and on init_mac() the priv->hwts_rx_en flag determines RxFCB
    insertion, and rctrl is programmed accordingly. The patch takes care
    of this case too.
    
    Though maybe not as self documenting as the inlining version uses_fcb(),
    priv->uses_rxfcb has the main purpose to quickly signal, on the hot path,
    that the incoming frame has a *Rx* FCB block inserted which needs to be
    pulled out before passing the skb to the stack. This is a performance
    critical operation, it needs to happen fast, that's why uses_rxfcb is
    placed in the first cacheline of gfar_private.
    This is also why a cached rctrl cannot be used instead: 1) because
    we don't have 32 bits available in the first cacheline of gfar_priv
    (but only 16); 2) bit operations are expensive on the hot path.
    Signed-off-by: default avatarClaudiu Manoil <claudiu.manoil@freescale.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ba779711
gianfar.c 86.1 KB