Commit 9c729e74 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-ipa-limit-special-reset-handling'

Alex Elder says:

====================
net: ipa: limit special reset handling

Some special handling done during channel reset should only be done
for IPA hardare version 3.5.1.  This series generalizes the meaning
of a flag passed to indicate special behavior, then has the special
handling be used only when appropriate.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ee733cd8 a3f2405b
...@@ -834,18 +834,18 @@ int gsi_channel_stop(struct gsi *gsi, u32 channel_id) ...@@ -834,18 +834,18 @@ int gsi_channel_stop(struct gsi *gsi, u32 channel_id)
} }
/* Reset and reconfigure a channel (possibly leaving doorbell disabled) */ /* Reset and reconfigure a channel (possibly leaving doorbell disabled) */
void gsi_channel_reset(struct gsi *gsi, u32 channel_id, bool db_enable) void gsi_channel_reset(struct gsi *gsi, u32 channel_id, bool legacy)
{ {
struct gsi_channel *channel = &gsi->channel[channel_id]; struct gsi_channel *channel = &gsi->channel[channel_id];
mutex_lock(&gsi->mutex); mutex_lock(&gsi->mutex);
/* Due to a hardware quirk we need to reset RX channels twice. */
gsi_channel_reset_command(channel); gsi_channel_reset_command(channel);
if (!channel->toward_ipa) /* Due to a hardware quirk we may need to reset RX channels twice. */
if (legacy && !channel->toward_ipa)
gsi_channel_reset_command(channel); gsi_channel_reset_command(channel);
gsi_channel_program(channel, db_enable); gsi_channel_program(channel, legacy);
gsi_channel_trans_cancel_pending(channel); gsi_channel_trans_cancel_pending(channel);
mutex_unlock(&gsi->mutex); mutex_unlock(&gsi->mutex);
...@@ -1455,7 +1455,7 @@ static void gsi_evt_ring_teardown(struct gsi *gsi) ...@@ -1455,7 +1455,7 @@ static void gsi_evt_ring_teardown(struct gsi *gsi)
/* Setup function for a single channel */ /* Setup function for a single channel */
static int gsi_channel_setup_one(struct gsi *gsi, u32 channel_id, static int gsi_channel_setup_one(struct gsi *gsi, u32 channel_id,
bool db_enable) bool legacy)
{ {
struct gsi_channel *channel = &gsi->channel[channel_id]; struct gsi_channel *channel = &gsi->channel[channel_id];
u32 evt_ring_id = channel->evt_ring_id; u32 evt_ring_id = channel->evt_ring_id;
...@@ -1474,7 +1474,7 @@ static int gsi_channel_setup_one(struct gsi *gsi, u32 channel_id, ...@@ -1474,7 +1474,7 @@ static int gsi_channel_setup_one(struct gsi *gsi, u32 channel_id,
if (ret) if (ret)
goto err_evt_ring_de_alloc; goto err_evt_ring_de_alloc;
gsi_channel_program(channel, db_enable); gsi_channel_program(channel, legacy);
if (channel->toward_ipa) if (channel->toward_ipa)
netif_tx_napi_add(&gsi->dummy_dev, &channel->napi, netif_tx_napi_add(&gsi->dummy_dev, &channel->napi,
...@@ -1545,7 +1545,7 @@ static void gsi_modem_channel_halt(struct gsi *gsi, u32 channel_id) ...@@ -1545,7 +1545,7 @@ static void gsi_modem_channel_halt(struct gsi *gsi, u32 channel_id)
} }
/* Setup function for channels */ /* Setup function for channels */
static int gsi_channel_setup(struct gsi *gsi, bool db_enable) static int gsi_channel_setup(struct gsi *gsi, bool legacy)
{ {
u32 channel_id = 0; u32 channel_id = 0;
u32 mask; u32 mask;
...@@ -1557,7 +1557,7 @@ static int gsi_channel_setup(struct gsi *gsi, bool db_enable) ...@@ -1557,7 +1557,7 @@ static int gsi_channel_setup(struct gsi *gsi, bool db_enable)
mutex_lock(&gsi->mutex); mutex_lock(&gsi->mutex);
do { do {
ret = gsi_channel_setup_one(gsi, channel_id, db_enable); ret = gsi_channel_setup_one(gsi, channel_id, legacy);
if (ret) if (ret)
goto err_unwind; goto err_unwind;
} while (++channel_id < gsi->channel_count); } while (++channel_id < gsi->channel_count);
...@@ -1643,7 +1643,7 @@ static void gsi_channel_teardown(struct gsi *gsi) ...@@ -1643,7 +1643,7 @@ static void gsi_channel_teardown(struct gsi *gsi)
} }
/* Setup function for GSI. GSI firmware must be loaded and initialized */ /* Setup function for GSI. GSI firmware must be loaded and initialized */
int gsi_setup(struct gsi *gsi, bool db_enable) int gsi_setup(struct gsi *gsi, bool legacy)
{ {
u32 val; u32 val;
...@@ -1686,7 +1686,7 @@ int gsi_setup(struct gsi *gsi, bool db_enable) ...@@ -1686,7 +1686,7 @@ int gsi_setup(struct gsi *gsi, bool db_enable)
/* Writing 1 indicates IRQ interrupts; 0 would be MSI */ /* Writing 1 indicates IRQ interrupts; 0 would be MSI */
iowrite32(1, gsi->virt + GSI_CNTXT_INTSET_OFFSET); iowrite32(1, gsi->virt + GSI_CNTXT_INTSET_OFFSET);
return gsi_channel_setup(gsi, db_enable); return gsi_channel_setup(gsi, legacy);
} }
/* Inverse of gsi_setup() */ /* Inverse of gsi_setup() */
......
...@@ -165,14 +165,14 @@ struct gsi { ...@@ -165,14 +165,14 @@ struct gsi {
/** /**
* gsi_setup() - Set up the GSI subsystem * gsi_setup() - Set up the GSI subsystem
* @gsi: Address of GSI structure embedded in an IPA structure * @gsi: Address of GSI structure embedded in an IPA structure
* @db_enable: Whether to use the GSI doorbell engine * @legacy: Set up for legacy hardware
* *
* @Return: 0 if successful, or a negative error code * @Return: 0 if successful, or a negative error code
* *
* Performs initialization that must wait until the GSI hardware is * Performs initialization that must wait until the GSI hardware is
* ready (including firmware loaded). * ready (including firmware loaded).
*/ */
int gsi_setup(struct gsi *gsi, bool db_enable); int gsi_setup(struct gsi *gsi, bool legacy);
/** /**
* gsi_teardown() - Tear down GSI subsystem * gsi_teardown() - Tear down GSI subsystem
...@@ -220,15 +220,15 @@ int gsi_channel_stop(struct gsi *gsi, u32 channel_id); ...@@ -220,15 +220,15 @@ int gsi_channel_stop(struct gsi *gsi, u32 channel_id);
* gsi_channel_reset() - Reset an allocated GSI channel * gsi_channel_reset() - Reset an allocated GSI channel
* @gsi: GSI pointer * @gsi: GSI pointer
* @channel_id: Channel to be reset * @channel_id: Channel to be reset
* @db_enable: Whether doorbell engine should be enabled * @legacy: Legacy behavior
* *
* Reset a channel and reconfigure it. The @db_enable flag indicates * Reset a channel and reconfigure it. The @legacy flag indicates
* whether the doorbell engine will be enabled following reconfiguration. * that some steps should be done differently for legacy hardware.
* *
* GSI hardware relinquishes ownership of all pending receive buffer * GSI hardware relinquishes ownership of all pending receive buffer
* transactions and they will complete with their cancelled flag set. * transactions and they will complete with their cancelled flag set.
*/ */
void gsi_channel_reset(struct gsi *gsi, u32 channel_id, bool db_enable); void gsi_channel_reset(struct gsi *gsi, u32 channel_id, bool legacy);
int gsi_channel_suspend(struct gsi *gsi, u32 channel_id, bool stop); int gsi_channel_suspend(struct gsi *gsi, u32 channel_id, bool stop);
int gsi_channel_resume(struct gsi *gsi, u32 channel_id, bool start); int gsi_channel_resume(struct gsi *gsi, u32 channel_id, bool start);
......
...@@ -1136,7 +1136,7 @@ static int ipa_endpoint_reset_rx_aggr(struct ipa_endpoint *endpoint) ...@@ -1136,7 +1136,7 @@ static int ipa_endpoint_reset_rx_aggr(struct ipa_endpoint *endpoint)
bool endpoint_suspended = false; bool endpoint_suspended = false;
struct gsi *gsi = &ipa->gsi; struct gsi *gsi = &ipa->gsi;
dma_addr_t addr; dma_addr_t addr;
bool db_enable; bool legacy;
u32 retries; u32 retries;
u32 len = 1; u32 len = 1;
void *virt; void *virt;
...@@ -1200,8 +1200,8 @@ static int ipa_endpoint_reset_rx_aggr(struct ipa_endpoint *endpoint) ...@@ -1200,8 +1200,8 @@ static int ipa_endpoint_reset_rx_aggr(struct ipa_endpoint *endpoint)
* complete the channel reset sequence. Finish by suspending the * complete the channel reset sequence. Finish by suspending the
* channel again (if necessary). * channel again (if necessary).
*/ */
db_enable = ipa->version == IPA_VERSION_3_5_1; legacy = ipa->version == IPA_VERSION_3_5_1;
gsi_channel_reset(gsi, endpoint->channel_id, db_enable); gsi_channel_reset(gsi, endpoint->channel_id, legacy);
msleep(1); msleep(1);
...@@ -1223,8 +1223,8 @@ static void ipa_endpoint_reset(struct ipa_endpoint *endpoint) ...@@ -1223,8 +1223,8 @@ static void ipa_endpoint_reset(struct ipa_endpoint *endpoint)
{ {
u32 channel_id = endpoint->channel_id; u32 channel_id = endpoint->channel_id;
struct ipa *ipa = endpoint->ipa; struct ipa *ipa = endpoint->ipa;
bool db_enable;
bool special; bool special;
bool legacy;
int ret = 0; int ret = 0;
/* On IPA v3.5.1, if an RX endpoint is reset while aggregation /* On IPA v3.5.1, if an RX endpoint is reset while aggregation
...@@ -1233,12 +1233,12 @@ static void ipa_endpoint_reset(struct ipa_endpoint *endpoint) ...@@ -1233,12 +1233,12 @@ static void ipa_endpoint_reset(struct ipa_endpoint *endpoint)
* *
* IPA v3.5.1 enables the doorbell engine. Newer versions do not. * IPA v3.5.1 enables the doorbell engine. Newer versions do not.
*/ */
db_enable = ipa->version == IPA_VERSION_3_5_1; legacy = ipa->version == IPA_VERSION_3_5_1;
special = !endpoint->toward_ipa && endpoint->data->aggregation; special = !endpoint->toward_ipa && endpoint->data->aggregation;
if (special && ipa_endpoint_aggr_active(endpoint)) if (special && ipa_endpoint_aggr_active(endpoint))
ret = ipa_endpoint_reset_rx_aggr(endpoint); ret = ipa_endpoint_reset_rx_aggr(endpoint);
else else
gsi_channel_reset(&ipa->gsi, channel_id, db_enable); gsi_channel_reset(&ipa->gsi, channel_id, legacy);
if (ret) if (ret)
dev_err(&ipa->pdev->dev, dev_err(&ipa->pdev->dev,
......
...@@ -108,7 +108,7 @@ int ipa_setup(struct ipa *ipa) ...@@ -108,7 +108,7 @@ int ipa_setup(struct ipa *ipa)
struct ipa_endpoint *command_endpoint; struct ipa_endpoint *command_endpoint;
int ret; int ret;
/* IPA v4.0 and above don't use the doorbell engine. */ /* Setup for IPA v3.5.1 has some slight differences */
ret = gsi_setup(&ipa->gsi, ipa->version == IPA_VERSION_3_5_1); ret = gsi_setup(&ipa->gsi, ipa->version == IPA_VERSION_3_5_1);
if (ret) if (ret)
return ret; return ret;
......
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