lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 1019/1039] net: cpsw: avoid alignment faults by taking NET_IP_ALIGN into account
    Date
    From: Ard Biesheuvel <ardb@kernel.org>

    commit 1771afd47430f5e95c9c3a2e3a8a63e67402d3fe upstream.

    Both versions of the CPSW driver declare a CPSW_HEADROOM_NA macro that
    takes NET_IP_ALIGN into account, but fail to use it appropriately when
    storing incoming packets in memory. This results in the IPv4 source and
    destination addresses to appear misaligned in memory, which causes
    aligment faults that need to be fixed up in software.

    So let's switch from CPSW_HEADROOM to CPSW_HEADROOM_NA where needed.
    This gets rid of any alignment faults on the RX path on a Beaglebone
    White.

    Fixes: 9ed4050c0d75 ("net: ethernet: ti: cpsw: add XDP support")
    Cc: Grygorii Strashko <grygorii.strashko@ti.com>
    Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>
    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/ti/cpsw.c | 6 +++---
    drivers/net/ethernet/ti/cpsw_new.c | 6 +++---
    drivers/net/ethernet/ti/cpsw_priv.c | 2 +-
    3 files changed, 7 insertions(+), 7 deletions(-)

    --- a/drivers/net/ethernet/ti/cpsw.c
    +++ b/drivers/net/ethernet/ti/cpsw.c
    @@ -349,7 +349,7 @@ static void cpsw_rx_handler(void *token,
    struct cpsw_common *cpsw = ndev_to_cpsw(xmeta->ndev);
    int pkt_size = cpsw->rx_packet_max;
    int ret = 0, port, ch = xmeta->ch;
    - int headroom = CPSW_HEADROOM;
    + int headroom = CPSW_HEADROOM_NA;
    struct net_device *ndev = xmeta->ndev;
    struct cpsw_priv *priv;
    struct page_pool *pool;
    @@ -392,7 +392,7 @@ static void cpsw_rx_handler(void *token,
    }

    if (priv->xdp_prog) {
    - int headroom = CPSW_HEADROOM, size = len;
    + int size = len;

    xdp_init_buff(&xdp, PAGE_SIZE, &priv->xdp_rxq[ch]);
    if (status & CPDMA_RX_VLAN_ENCAP) {
    @@ -442,7 +442,7 @@ requeue:
    xmeta->ndev = ndev;
    xmeta->ch = ch;

    - dma = page_pool_get_dma_addr(new_page) + CPSW_HEADROOM;
    + dma = page_pool_get_dma_addr(new_page) + CPSW_HEADROOM_NA;
    ret = cpdma_chan_submit_mapped(cpsw->rxv[ch].ch, new_page, dma,
    pkt_size, 0);
    if (ret < 0) {
    --- a/drivers/net/ethernet/ti/cpsw_new.c
    +++ b/drivers/net/ethernet/ti/cpsw_new.c
    @@ -283,7 +283,7 @@ static void cpsw_rx_handler(void *token,
    {
    struct page *new_page, *page = token;
    void *pa = page_address(page);
    - int headroom = CPSW_HEADROOM;
    + int headroom = CPSW_HEADROOM_NA;
    struct cpsw_meta_xdp *xmeta;
    struct cpsw_common *cpsw;
    struct net_device *ndev;
    @@ -336,7 +336,7 @@ static void cpsw_rx_handler(void *token,
    }

    if (priv->xdp_prog) {
    - int headroom = CPSW_HEADROOM, size = len;
    + int size = len;

    xdp_init_buff(&xdp, PAGE_SIZE, &priv->xdp_rxq[ch]);
    if (status & CPDMA_RX_VLAN_ENCAP) {
    @@ -386,7 +386,7 @@ requeue:
    xmeta->ndev = ndev;
    xmeta->ch = ch;

    - dma = page_pool_get_dma_addr(new_page) + CPSW_HEADROOM;
    + dma = page_pool_get_dma_addr(new_page) + CPSW_HEADROOM_NA;
    ret = cpdma_chan_submit_mapped(cpsw->rxv[ch].ch, new_page, dma,
    pkt_size, 0);
    if (ret < 0) {
    --- a/drivers/net/ethernet/ti/cpsw_priv.c
    +++ b/drivers/net/ethernet/ti/cpsw_priv.c
    @@ -1120,7 +1120,7 @@ int cpsw_fill_rx_channels(struct cpsw_pr
    xmeta->ndev = priv->ndev;
    xmeta->ch = ch;

    - dma = page_pool_get_dma_addr(page) + CPSW_HEADROOM;
    + dma = page_pool_get_dma_addr(page) + CPSW_HEADROOM_NA;
    ret = cpdma_chan_idle_submit_mapped(cpsw->rxv[ch].ch,
    page, dma,
    cpsw->rx_packet_max,

    \
     
     \ /
      Last update: 2022-01-25 04:09    [W:2.631 / U:1.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site