diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2011-02-07 18:04:38 -0500 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2011-02-15 14:45:34 -0500 |
commit | 525da9072c28df815bff64bf00f3b11ab88face8 (patch) | |
tree | 0649a1fff4d110796dd7f22168c9413cd8eb5caa /drivers/net/sfc/efx.c | |
parent | 60031fcc17057e21566ed34ba23e93fffda1aa27 (diff) |
sfc: Distinguish queue lookup from test for queue existence
efx_channel_get_{rx,tx}_queue() currently return NULL if the channel
isn't used for traffic in that direction. In most cases this is a
bug, but some callers rely on it as an existence test.
Add existence test functions efx_channel_has_{rx_queue,tx_queues}()
and use them as appropriate.
Change efx_channel_get_{rx,tx}_queue() to assert that the requested
queue exists.
Remove now-redundant initialisation from efx_set_channels().
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/sfc/efx.c')
-rw-r--r-- | drivers/net/sfc/efx.c | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index c559bc372fc1..6189d3066018 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
@@ -1271,21 +1271,8 @@ static void efx_remove_interrupts(struct efx_nic *efx) | |||
1271 | 1271 | ||
1272 | static void efx_set_channels(struct efx_nic *efx) | 1272 | static void efx_set_channels(struct efx_nic *efx) |
1273 | { | 1273 | { |
1274 | struct efx_channel *channel; | ||
1275 | struct efx_tx_queue *tx_queue; | ||
1276 | |||
1277 | efx->tx_channel_offset = | 1274 | efx->tx_channel_offset = |
1278 | separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0; | 1275 | separate_tx_channels ? efx->n_channels - efx->n_tx_channels : 0; |
1279 | |||
1280 | /* Channel pointers were set in efx_init_struct() but we now | ||
1281 | * need to clear them for TX queues in any RX-only channels. */ | ||
1282 | efx_for_each_channel(channel, efx) { | ||
1283 | if (channel->channel - efx->tx_channel_offset >= | ||
1284 | efx->n_tx_channels) { | ||
1285 | efx_for_each_channel_tx_queue(tx_queue, channel) | ||
1286 | tx_queue->channel = NULL; | ||
1287 | } | ||
1288 | } | ||
1289 | } | 1276 | } |
1290 | 1277 | ||
1291 | static int efx_probe_nic(struct efx_nic *efx) | 1278 | static int efx_probe_nic(struct efx_nic *efx) |
@@ -1531,9 +1518,9 @@ void efx_init_irq_moderation(struct efx_nic *efx, int tx_usecs, int rx_usecs, | |||
1531 | efx->irq_rx_adaptive = rx_adaptive; | 1518 | efx->irq_rx_adaptive = rx_adaptive; |
1532 | efx->irq_rx_moderation = rx_ticks; | 1519 | efx->irq_rx_moderation = rx_ticks; |
1533 | efx_for_each_channel(channel, efx) { | 1520 | efx_for_each_channel(channel, efx) { |
1534 | if (efx_channel_get_rx_queue(channel)) | 1521 | if (efx_channel_has_rx_queue(channel)) |
1535 | channel->irq_moderation = rx_ticks; | 1522 | channel->irq_moderation = rx_ticks; |
1536 | else if (efx_channel_get_tx_queue(channel, 0)) | 1523 | else if (efx_channel_has_tx_queues(channel)) |
1537 | channel->irq_moderation = tx_ticks; | 1524 | channel->irq_moderation = tx_ticks; |
1538 | } | 1525 | } |
1539 | } | 1526 | } |