1
1
/****************************************************************************
2
2
* Driver for Solarflare Solarstorm network controllers and boards
3
3
* Copyright 2005-2006 Fen Systems Ltd.
4
* Copyright 2005-2009 Solarflare Communications Inc.
4
* Copyright 2005-2010 Solarflare Communications Inc.
6
6
* This program is free software; you can redistribute it and/or modify it
7
7
* under the terms of the GNU General Public License version 2 as published
337
339
struct efx_nic *efx = netdev_priv(net_dev);
338
340
struct efx_tx_queue *tx_queue;
340
if (unlikely(efx->port_inhibited))
341
return NETDEV_TX_BUSY;
343
tx_queue = efx_get_tx_queue(efx, skb_get_queue_mapping(skb),
344
skb->ip_summed == CHECKSUM_PARTIAL ?
345
EFX_TXQ_TYPE_OFFLOAD : 0);
341
unsigned index, type;
343
EFX_WARN_ON_PARANOID(!netif_device_present(net_dev));
345
index = skb_get_queue_mapping(skb);
346
type = skb->ip_summed == CHECKSUM_PARTIAL ? EFX_TXQ_TYPE_OFFLOAD : 0;
347
if (index >= efx->n_tx_channels) {
348
index -= efx->n_tx_channels;
349
type |= EFX_TXQ_TYPE_HIGHPRI;
351
tx_queue = efx_get_tx_queue(efx, index, type);
347
353
return efx_enqueue_skb(tx_queue, skb);
356
void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue)
358
struct efx_nic *efx = tx_queue->efx;
360
/* Must be inverse of queue lookup in efx_hard_start_xmit() */
362
netdev_get_tx_queue(efx->net_dev,
363
tx_queue->queue / EFX_TXQ_TYPES +
364
((tx_queue->queue & EFX_TXQ_TYPE_HIGHPRI) ?
365
efx->n_tx_channels : 0));
368
int efx_setup_tc(struct net_device *net_dev, u8 num_tc)
370
struct efx_nic *efx = netdev_priv(net_dev);
371
struct efx_channel *channel;
372
struct efx_tx_queue *tx_queue;
376
if (efx_nic_rev(efx) < EFX_REV_FALCON_B0 || num_tc > EFX_MAX_TX_TC)
379
if (num_tc == net_dev->num_tc)
382
for (tc = 0; tc < num_tc; tc++) {
383
net_dev->tc_to_txq[tc].offset = tc * efx->n_tx_channels;
384
net_dev->tc_to_txq[tc].count = efx->n_tx_channels;
387
if (num_tc > net_dev->num_tc) {
388
/* Initialise high-priority queues as necessary */
389
efx_for_each_channel(channel, efx) {
390
efx_for_each_possible_channel_tx_queue(tx_queue,
392
if (!(tx_queue->queue & EFX_TXQ_TYPE_HIGHPRI))
394
if (!tx_queue->buffer) {
395
rc = efx_probe_tx_queue(tx_queue);
399
if (!tx_queue->initialised)
400
efx_init_tx_queue(tx_queue);
401
efx_init_tx_queue_core_txq(tx_queue);
405
/* Reduce number of classes before number of queues */
406
net_dev->num_tc = num_tc;
409
rc = netif_set_real_num_tx_queues(net_dev,
410
max_t(int, num_tc, 1) *
415
/* Do not destroy high-priority queues when they become
416
* unused. We would have to flush them first, and it is
417
* fairly difficult to flush a subset of TX queues. Leave
418
* it to efx_fini_channels().
421
net_dev->num_tc = num_tc;
350
425
void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index)
352
427
unsigned fill_level;
453
531
void efx_fini_tx_queue(struct efx_tx_queue *tx_queue)
533
if (!tx_queue->initialised)
455
536
netif_dbg(tx_queue->efx, drv, tx_queue->efx->net_dev,
456
537
"shutting down TX queue %d\n", tx_queue->queue);
539
tx_queue->initialised = false;
458
541
/* Flush TX queue, remove descriptor ring */
459
542
efx_nic_fini_tx(tx_queue);