lkml.org 
[lkml]   [2022]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] net: sunhme: Fix packet reception for len < RX_COPY_THRESHOLD
    Date
    There is a separate receive path for small packets (under 256 bytes).
    Instead of allocating a new dma-capable skb to be used for the next packet,
    this path allocates a skb and copies the data into it (reusing the existing
    sbk for the next packet). There are two bytes of junk data at the beginning
    of every packet. I believe these are inserted in order to allow aligned
    DMA and IP headers. We skip over them using skb_reserve. Before copying
    over the data, we must use a barrier to ensure we see the whole packet. The
    current code only synchronizes len bytes, starting from the beginning of
    the packet, including the junk bytes. However, this leaves off the final
    two bytes in the packet. Synchronize the whole packet.

    To reproduce this problem, ping a HME with a payload size between 17 and 214

    $ ping -s 17 <hme_address>

    which will complain rather loudly about the data mismatch. Small packets
    (below 60 bytes on the wire) do not have this issue. I suspect this is
    related to the padding added to increase the minimum packet size.

    Signed-off-by: Sean Anderson <seanga2@gmail.com>
    Patch-prefix: net
    ---

    drivers/net/ethernet/sun/sunhme.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/net/ethernet/sun/sunhme.c b/drivers/net/ethernet/sun/sunhme.c
    index 8594ee839628..88aa0d310aee 100644
    --- a/drivers/net/ethernet/sun/sunhme.c
    +++ b/drivers/net/ethernet/sun/sunhme.c
    @@ -2020,9 +2020,9 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev)

    skb_reserve(copy_skb, 2);
    skb_put(copy_skb, len);
    - dma_sync_single_for_cpu(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE);
    + dma_sync_single_for_cpu(hp->dma_dev, dma_addr, len + 2, DMA_FROM_DEVICE);
    skb_copy_from_linear_data(skb, copy_skb->data, len);
    - dma_sync_single_for_device(hp->dma_dev, dma_addr, len, DMA_FROM_DEVICE);
    + dma_sync_single_for_device(hp->dma_dev, dma_addr, len + 2, DMA_FROM_DEVICE);
    /* Reuse original ring buffer. */
    hme_write_rxd(hp, this,
    (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)),
    --
    2.37.1
    \
     
     \ /
      Last update: 2022-09-18 23:56    [W:2.326 / U:0.404 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site