mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 09:01:34 +00:00
sfc: move MCDI receive queue management code
One function's prototype was changed in the header. Signed-off-by: Alexandru-Mihai Maftei <amaftei@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8ee4c90772
commit
8da9264205
@ -2967,91 +2967,6 @@ static int efx_ef10_vf_rx_push_rss_config(struct efx_nic *efx, bool user,
|
||||
return efx_ef10_rx_push_shared_rss_config(efx, NULL);
|
||||
}
|
||||
|
||||
static int efx_ef10_rx_probe(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
return efx_nic_alloc_buffer(rx_queue->efx, &rx_queue->rxd.buf,
|
||||
(rx_queue->ptr_mask + 1) *
|
||||
sizeof(efx_qword_t),
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
static void efx_ef10_rx_init(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf,
|
||||
MC_CMD_INIT_RXQ_IN_LEN(EFX_MAX_DMAQ_SIZE * 8 /
|
||||
EFX_BUF_SIZE));
|
||||
struct efx_channel *channel = efx_rx_queue_channel(rx_queue);
|
||||
size_t entries = rx_queue->rxd.buf.len / EFX_BUF_SIZE;
|
||||
struct efx_nic *efx = rx_queue->efx;
|
||||
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||
size_t inlen;
|
||||
dma_addr_t dma_addr;
|
||||
int rc;
|
||||
int i;
|
||||
BUILD_BUG_ON(MC_CMD_INIT_RXQ_OUT_LEN != 0);
|
||||
|
||||
rx_queue->scatter_n = 0;
|
||||
rx_queue->scatter_len = 0;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_SIZE, rx_queue->ptr_mask + 1);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_TARGET_EVQ, channel->channel);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_LABEL, efx_rx_queue_index(rx_queue));
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_INSTANCE,
|
||||
efx_rx_queue_index(rx_queue));
|
||||
MCDI_POPULATE_DWORD_2(inbuf, INIT_RXQ_IN_FLAGS,
|
||||
INIT_RXQ_IN_FLAG_PREFIX, 1,
|
||||
INIT_RXQ_IN_FLAG_TIMESTAMP, 1);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_OWNER_ID, 0);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_PORT_ID, nic_data->vport_id);
|
||||
|
||||
dma_addr = rx_queue->rxd.buf.dma_addr;
|
||||
|
||||
netif_dbg(efx, hw, efx->net_dev, "pushing RXQ %d. %zu entries (%llx)\n",
|
||||
efx_rx_queue_index(rx_queue), entries, (u64)dma_addr);
|
||||
|
||||
for (i = 0; i < entries; ++i) {
|
||||
MCDI_SET_ARRAY_QWORD(inbuf, INIT_RXQ_IN_DMA_ADDR, i, dma_addr);
|
||||
dma_addr += EFX_BUF_SIZE;
|
||||
}
|
||||
|
||||
inlen = MC_CMD_INIT_RXQ_IN_LEN(entries);
|
||||
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_INIT_RXQ, inbuf, inlen,
|
||||
NULL, 0, NULL);
|
||||
if (rc)
|
||||
netdev_WARN(efx->net_dev, "failed to initialise RXQ %d\n",
|
||||
efx_rx_queue_index(rx_queue));
|
||||
}
|
||||
|
||||
static void efx_ef10_rx_fini(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_FINI_RXQ_IN_LEN);
|
||||
MCDI_DECLARE_BUF_ERR(outbuf);
|
||||
struct efx_nic *efx = rx_queue->efx;
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, FINI_RXQ_IN_INSTANCE,
|
||||
efx_rx_queue_index(rx_queue));
|
||||
|
||||
rc = efx_mcdi_rpc_quiet(efx, MC_CMD_FINI_RXQ, inbuf, sizeof(inbuf),
|
||||
outbuf, sizeof(outbuf), &outlen);
|
||||
|
||||
if (rc && rc != -EALREADY)
|
||||
goto fail;
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
efx_mcdi_display_error(efx, MC_CMD_FINI_RXQ, MC_CMD_FINI_RXQ_IN_LEN,
|
||||
outbuf, outlen, rc);
|
||||
}
|
||||
|
||||
static void efx_ef10_rx_remove(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
efx_nic_free_buffer(rx_queue->efx, &rx_queue->rxd.buf);
|
||||
}
|
||||
|
||||
/* This creates an entry in the RX descriptor queue */
|
||||
static inline void
|
||||
efx_ef10_build_rx_desc(struct efx_rx_queue *rx_queue, unsigned int index)
|
||||
@ -3779,7 +3694,7 @@ static int efx_ef10_fini_dmaq(struct efx_nic *efx)
|
||||
if (efx->state != STATE_RECOVERY) {
|
||||
efx_for_each_channel(channel, efx) {
|
||||
efx_for_each_channel_rx_queue(rx_queue, channel)
|
||||
efx_ef10_rx_fini(rx_queue);
|
||||
efx_mcdi_rx_fini(rx_queue);
|
||||
efx_for_each_channel_tx_queue(tx_queue, channel)
|
||||
efx_mcdi_tx_fini(tx_queue);
|
||||
}
|
||||
@ -6458,9 +6373,9 @@ const struct efx_nic_type efx_hunt_a0_vf_nic_type = {
|
||||
.tx_limit_len = efx_ef10_tx_limit_len,
|
||||
.rx_push_rss_config = efx_ef10_vf_rx_push_rss_config,
|
||||
.rx_pull_rss_config = efx_ef10_rx_pull_rss_config,
|
||||
.rx_probe = efx_ef10_rx_probe,
|
||||
.rx_init = efx_ef10_rx_init,
|
||||
.rx_remove = efx_ef10_rx_remove,
|
||||
.rx_probe = efx_mcdi_rx_probe,
|
||||
.rx_init = efx_mcdi_rx_init,
|
||||
.rx_remove = efx_mcdi_rx_remove,
|
||||
.rx_write = efx_ef10_rx_write,
|
||||
.rx_defer_refill = efx_ef10_rx_defer_refill,
|
||||
.ev_probe = efx_mcdi_ev_probe,
|
||||
@ -6570,9 +6485,9 @@ const struct efx_nic_type efx_hunt_a0_nic_type = {
|
||||
.rx_push_rss_context_config = efx_ef10_rx_push_rss_context_config,
|
||||
.rx_pull_rss_context_config = efx_ef10_rx_pull_rss_context_config,
|
||||
.rx_restore_rss_contexts = efx_ef10_rx_restore_rss_contexts,
|
||||
.rx_probe = efx_ef10_rx_probe,
|
||||
.rx_init = efx_ef10_rx_init,
|
||||
.rx_remove = efx_ef10_rx_remove,
|
||||
.rx_probe = efx_mcdi_rx_probe,
|
||||
.rx_init = efx_mcdi_rx_init,
|
||||
.rx_remove = efx_mcdi_rx_remove,
|
||||
.rx_write = efx_ef10_rx_write,
|
||||
.rx_defer_refill = efx_ef10_rx_defer_refill,
|
||||
.ev_probe = efx_mcdi_ev_probe,
|
||||
|
@ -262,3 +262,88 @@ fail:
|
||||
efx_mcdi_display_error(efx, MC_CMD_FINI_TXQ, MC_CMD_FINI_TXQ_IN_LEN,
|
||||
outbuf, outlen, rc);
|
||||
}
|
||||
|
||||
int efx_mcdi_rx_probe(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
return efx_nic_alloc_buffer(rx_queue->efx, &rx_queue->rxd.buf,
|
||||
(rx_queue->ptr_mask + 1) *
|
||||
sizeof(efx_qword_t),
|
||||
GFP_KERNEL);
|
||||
}
|
||||
|
||||
void efx_mcdi_rx_init(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf,
|
||||
MC_CMD_INIT_RXQ_IN_LEN(EFX_MAX_DMAQ_SIZE * 8 /
|
||||
EFX_BUF_SIZE));
|
||||
struct efx_channel *channel = efx_rx_queue_channel(rx_queue);
|
||||
size_t entries = rx_queue->rxd.buf.len / EFX_BUF_SIZE;
|
||||
struct efx_nic *efx = rx_queue->efx;
|
||||
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
||||
dma_addr_t dma_addr;
|
||||
size_t inlen;
|
||||
int rc;
|
||||
int i;
|
||||
BUILD_BUG_ON(MC_CMD_INIT_RXQ_OUT_LEN != 0);
|
||||
|
||||
rx_queue->scatter_n = 0;
|
||||
rx_queue->scatter_len = 0;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_SIZE, rx_queue->ptr_mask + 1);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_TARGET_EVQ, channel->channel);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_LABEL, efx_rx_queue_index(rx_queue));
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_INSTANCE,
|
||||
efx_rx_queue_index(rx_queue));
|
||||
MCDI_POPULATE_DWORD_2(inbuf, INIT_RXQ_IN_FLAGS,
|
||||
INIT_RXQ_IN_FLAG_PREFIX, 1,
|
||||
INIT_RXQ_IN_FLAG_TIMESTAMP, 1);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_OWNER_ID, 0);
|
||||
MCDI_SET_DWORD(inbuf, INIT_RXQ_IN_PORT_ID, nic_data->vport_id);
|
||||
|
||||
dma_addr = rx_queue->rxd.buf.dma_addr;
|
||||
|
||||
netif_dbg(efx, hw, efx->net_dev, "pushing RXQ %d. %zu entries (%llx)\n",
|
||||
efx_rx_queue_index(rx_queue), entries, (u64)dma_addr);
|
||||
|
||||
for (i = 0; i < entries; ++i) {
|
||||
MCDI_SET_ARRAY_QWORD(inbuf, INIT_RXQ_IN_DMA_ADDR, i, dma_addr);
|
||||
dma_addr += EFX_BUF_SIZE;
|
||||
}
|
||||
|
||||
inlen = MC_CMD_INIT_RXQ_IN_LEN(entries);
|
||||
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_INIT_RXQ, inbuf, inlen,
|
||||
NULL, 0, NULL);
|
||||
if (rc)
|
||||
netdev_WARN(efx->net_dev, "failed to initialise RXQ %d\n",
|
||||
efx_rx_queue_index(rx_queue));
|
||||
}
|
||||
|
||||
void efx_mcdi_rx_remove(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
efx_nic_free_buffer(rx_queue->efx, &rx_queue->rxd.buf);
|
||||
}
|
||||
|
||||
void efx_mcdi_rx_fini(struct efx_rx_queue *rx_queue)
|
||||
{
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_FINI_RXQ_IN_LEN);
|
||||
MCDI_DECLARE_BUF_ERR(outbuf);
|
||||
struct efx_nic *efx = rx_queue->efx;
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, FINI_RXQ_IN_INSTANCE,
|
||||
efx_rx_queue_index(rx_queue));
|
||||
|
||||
rc = efx_mcdi_rpc_quiet(efx, MC_CMD_FINI_RXQ, inbuf, sizeof(inbuf),
|
||||
outbuf, sizeof(outbuf), &outlen);
|
||||
|
||||
if (rc && rc != -EALREADY)
|
||||
goto fail;
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
efx_mcdi_display_error(efx, MC_CMD_FINI_RXQ, MC_CMD_FINI_RXQ_IN_LEN,
|
||||
outbuf, outlen, rc);
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ int efx_mcdi_tx_init(struct efx_tx_queue *tx_queue, bool tso_v2);
|
||||
void efx_mcdi_tx_remove(struct efx_tx_queue *tx_queue);
|
||||
void efx_mcdi_tx_fini(struct efx_tx_queue *tx_queue);
|
||||
int efx_mcdi_rx_probe(struct efx_rx_queue *rx_queue);
|
||||
int efx_mcdi_rx_init(struct efx_rx_queue *rx_queue, bool want_outer_classes);
|
||||
void efx_mcdi_rx_init(struct efx_rx_queue *rx_queue);
|
||||
void efx_mcdi_rx_remove(struct efx_rx_queue *rx_queue);
|
||||
void efx_mcdi_rx_fini(struct efx_rx_queue *rx_queue);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user