Commit c634700f authored by Edward Cree's avatar Edward Cree Committed by David S. Miller

sfc: get PIO buffer size from the NIC

The 8000 series SFC NICs have 4K PIO buffers, rather than the 2K of
 the 7000 series.  Rather than having a hard-coded PIO buffer size
 (ER_DZ_TX_PIOBUF_SIZE), read it from the GET_CAPABILITIES_V2 MCDI
 response.
Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent de1deff9
...@@ -197,11 +197,15 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx) ...@@ -197,11 +197,15 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
nic_data->datapath_caps = nic_data->datapath_caps =
MCDI_DWORD(outbuf, GET_CAPABILITIES_OUT_FLAGS1); MCDI_DWORD(outbuf, GET_CAPABILITIES_OUT_FLAGS1);
if (outlen >= MC_CMD_GET_CAPABILITIES_V2_OUT_LEN) if (outlen >= MC_CMD_GET_CAPABILITIES_V2_OUT_LEN) {
nic_data->datapath_caps2 = MCDI_DWORD(outbuf, nic_data->datapath_caps2 = MCDI_DWORD(outbuf,
GET_CAPABILITIES_V2_OUT_FLAGS2); GET_CAPABILITIES_V2_OUT_FLAGS2);
else nic_data->piobuf_size = MCDI_WORD(outbuf,
GET_CAPABILITIES_V2_OUT_SIZE_PIO_BUFF);
} else {
nic_data->datapath_caps2 = 0; nic_data->datapath_caps2 = 0;
nic_data->piobuf_size = ER_DZ_TX_PIOBUF_SIZE;
}
/* record the DPCPU firmware IDs to determine VEB vswitching support. /* record the DPCPU firmware IDs to determine VEB vswitching support.
*/ */
...@@ -823,8 +827,8 @@ static int efx_ef10_link_piobufs(struct efx_nic *efx) ...@@ -823,8 +827,8 @@ static int efx_ef10_link_piobufs(struct efx_nic *efx)
offset = ((efx->tx_channel_offset + efx->n_tx_channels - offset = ((efx->tx_channel_offset + efx->n_tx_channels -
tx_queue->channel->channel - 1) * tx_queue->channel->channel - 1) *
efx_piobuf_size); efx_piobuf_size);
index = offset / ER_DZ_TX_PIOBUF_SIZE; index = offset / nic_data->piobuf_size;
offset = offset % ER_DZ_TX_PIOBUF_SIZE; offset = offset % nic_data->piobuf_size;
/* When the host page size is 4K, the first /* When the host page size is 4K, the first
* host page in the WC mapping may be within * host page in the WC mapping may be within
...@@ -1159,11 +1163,11 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx) ...@@ -1159,11 +1163,11 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx)
* functions of the controller. * functions of the controller.
*/ */
if (efx_piobuf_size != 0 && if (efx_piobuf_size != 0 &&
ER_DZ_TX_PIOBUF_SIZE / efx_piobuf_size * EF10_TX_PIOBUF_COUNT >= nic_data->piobuf_size / efx_piobuf_size * EF10_TX_PIOBUF_COUNT >=
efx->n_tx_channels) { efx->n_tx_channels) {
unsigned int n_piobufs = unsigned int n_piobufs =
DIV_ROUND_UP(efx->n_tx_channels, DIV_ROUND_UP(efx->n_tx_channels,
ER_DZ_TX_PIOBUF_SIZE / efx_piobuf_size); nic_data->piobuf_size / efx_piobuf_size);
rc = efx_ef10_alloc_piobufs(efx, n_piobufs); rc = efx_ef10_alloc_piobufs(efx, n_piobufs);
if (rc) if (rc)
......
...@@ -343,6 +343,7 @@ enum { ...@@ -343,6 +343,7 @@ enum {
* @pio_write_base: Base address for writing PIO buffers * @pio_write_base: Base address for writing PIO buffers
* @pio_write_vi_base: Relative VI number for @pio_write_base * @pio_write_vi_base: Relative VI number for @pio_write_base
* @piobuf_handle: Handle of each PIO buffer allocated * @piobuf_handle: Handle of each PIO buffer allocated
* @piobuf_size: size of a single PIO buffer
* @must_restore_piobufs: Flag: PIO buffers have yet to be restored after MC * @must_restore_piobufs: Flag: PIO buffers have yet to be restored after MC
* reboot * reboot
* @rx_rss_context: Firmware handle for our RSS context * @rx_rss_context: Firmware handle for our RSS context
...@@ -380,6 +381,7 @@ struct efx_ef10_nic_data { ...@@ -380,6 +381,7 @@ struct efx_ef10_nic_data {
void __iomem *wc_membase, *pio_write_base; void __iomem *wc_membase, *pio_write_base;
unsigned int pio_write_vi_base; unsigned int pio_write_vi_base;
unsigned int piobuf_handle[EF10_TX_PIOBUF_COUNT]; unsigned int piobuf_handle[EF10_TX_PIOBUF_COUNT];
u16 piobuf_size;
bool must_restore_piobufs; bool must_restore_piobufs;
u32 rx_rss_context; u32 rx_rss_context;
bool rx_rss_context_exclusive; bool rx_rss_context_exclusive;
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#ifdef EFX_USE_PIO #ifdef EFX_USE_PIO
#define EFX_PIOBUF_SIZE_MAX ER_DZ_TX_PIOBUF_SIZE
#define EFX_PIOBUF_SIZE_DEF ALIGN(256, L1_CACHE_BYTES) #define EFX_PIOBUF_SIZE_DEF ALIGN(256, L1_CACHE_BYTES)
unsigned int efx_piobuf_size __read_mostly = EFX_PIOBUF_SIZE_DEF; unsigned int efx_piobuf_size __read_mostly = EFX_PIOBUF_SIZE_DEF;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment