Messages in this thread | | | From | <> | Subject | Re: [PATCH 2/2] net: macb: Limit maximum GEM TX length in TSO | Date | Fri, 31 Jan 2020 14:57:44 +0000 |
| |
On 31.01.2020 12:27, Harini Katakam wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > GEM_MAX_TX_LEN currently resolves to 0x3FF8 for any IP version supporting > TSO with full 14bits of length field in payload descriptor. But an IP > errata causes false amba_error (bit 6 of ISR) when length in payload > descriptors is specified above 16387. The error occurs because the DMA > falsely concludes that there is not enough space in SRAM for incoming > payload. These errors were observed continuously under stress of large > packets using iperf on a version where SRAM was 16K for each queue. This > errata will be documented shortly and affects all versions since TSO > functionality was added. Hence limit the max length to 0x3FC0 (rounded). > > Signed-off-by: Harini Katakam <harini.katakam@xilinx.com> > --- > drivers/net/ethernet/cadence/macb_main.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c > index 2e418b8..994fe67 100644 > --- a/drivers/net/ethernet/cadence/macb_main.c > +++ b/drivers/net/ethernet/cadence/macb_main.c > @@ -74,6 +74,7 @@ struct sifive_fu540_macb_mgmt { > #define MACB_TX_LEN_ALIGN 8 > #define MACB_MAX_TX_LEN ((unsigned int)((1 << MACB_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) > #define GEM_MAX_TX_LEN ((unsigned int)((1 << GEM_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) > +#define GEM_MAX_TX_LEN_ERRATA (unsigned int)(0x3FC0) > > #define GEM_MTU_MIN_SIZE ETH_MIN_MTU > #define MACB_NETIF_LSO NETIF_F_TSO > @@ -3640,7 +3641,7 @@ static int macb_init(struct platform_device *pdev) > > /* setup appropriated routines according to adapter type */ > if (macb_is_gem(bp)) { > - bp->max_tx_length = GEM_MAX_TX_LEN; > + bp->max_tx_length = min(GEM_MAX_TX_LEN, GEM_MAX_TX_LEN_ERRATA);
Isn't this always resolved to GEM_MAX_TX_LEN_ERRATA?
> bp->macbgem_ops.mog_alloc_rx_buffers = gem_alloc_rx_buffers; > bp->macbgem_ops.mog_free_rx_buffers = gem_free_rx_buffers; > bp->macbgem_ops.mog_init_rings = gem_init_rings; > -- > 2.7.4 > >
| |