mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-15 09:55:36 +00:00
sfc: Use the correct maximum TX DMA ring size for SFC9100
As part of a workaround for a hardware erratum in the SFC9100 family (SF bug 35388), the TX_DESC_UPD_DWORD register address is also used for communicating with the event block, and only descriptor pointer values < 2048 are valid. If the TX DMA ring size is increased to 4096 descriptors (which the firmware still allows) then we may write a descriptor pointer value >= 2048, which has entirely different and undesirable effects! Limit the TX DMA ring size correctly when this workaround is in effect. Fixes: 8127d661e77f ('sfc: Add support for Solarflare SFC9100 family') Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Shradha Shah <sshah@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8533ccf3e7
commit
d9317aea16
@ -66,6 +66,9 @@ void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue);
|
|||||||
#define EFX_RXQ_MIN_ENT 128U
|
#define EFX_RXQ_MIN_ENT 128U
|
||||||
#define EFX_TXQ_MIN_ENT(efx) (2 * efx_tx_max_skb_descs(efx))
|
#define EFX_TXQ_MIN_ENT(efx) (2 * efx_tx_max_skb_descs(efx))
|
||||||
|
|
||||||
|
#define EFX_TXQ_MAX_ENT(efx) (EFX_WORKAROUND_35388(efx) ? \
|
||||||
|
EFX_MAX_DMAQ_SIZE / 2 : EFX_MAX_DMAQ_SIZE)
|
||||||
|
|
||||||
/* Filters */
|
/* Filters */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -591,7 +591,7 @@ static void efx_ethtool_get_ringparam(struct net_device *net_dev,
|
|||||||
struct efx_nic *efx = netdev_priv(net_dev);
|
struct efx_nic *efx = netdev_priv(net_dev);
|
||||||
|
|
||||||
ring->rx_max_pending = EFX_MAX_DMAQ_SIZE;
|
ring->rx_max_pending = EFX_MAX_DMAQ_SIZE;
|
||||||
ring->tx_max_pending = EFX_MAX_DMAQ_SIZE;
|
ring->tx_max_pending = EFX_TXQ_MAX_ENT(efx);
|
||||||
ring->rx_pending = efx->rxq_entries;
|
ring->rx_pending = efx->rxq_entries;
|
||||||
ring->tx_pending = efx->txq_entries;
|
ring->tx_pending = efx->txq_entries;
|
||||||
}
|
}
|
||||||
@ -604,7 +604,7 @@ static int efx_ethtool_set_ringparam(struct net_device *net_dev,
|
|||||||
|
|
||||||
if (ring->rx_mini_pending || ring->rx_jumbo_pending ||
|
if (ring->rx_mini_pending || ring->rx_jumbo_pending ||
|
||||||
ring->rx_pending > EFX_MAX_DMAQ_SIZE ||
|
ring->rx_pending > EFX_MAX_DMAQ_SIZE ||
|
||||||
ring->tx_pending > EFX_MAX_DMAQ_SIZE)
|
ring->tx_pending > EFX_TXQ_MAX_ENT(efx))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (ring->rx_pending < EFX_RXQ_MIN_ENT) {
|
if (ring->rx_pending < EFX_RXQ_MIN_ENT) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user