Skip to content

Commit 822473b

Browse files
govindarajuludavem330
authored andcommitted
driver/net: enic: Add multi tx support for enic
The following patch adds multi tx support for enic. Signed-off-by: Nishank Trivedi <nistrive@cisco.com> Signed-off-by: Christian Benvenuti <benve@cisco.com> Signed-off-by: Govindarajulu Varadarajan <govindarajulu90@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3c3769e commit 822473b

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

drivers/net/ethernet/cisco/enic/enic.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
#define ENIC_BARS_MAX 6
3939

40-
#define ENIC_WQ_MAX 1
40+
#define ENIC_WQ_MAX 8
4141
#define ENIC_RQ_MAX 8
4242
#define ENIC_CQ_MAX (ENIC_WQ_MAX + ENIC_RQ_MAX)
4343
#define ENIC_INTR_MAX (ENIC_CQ_MAX + 2)

drivers/net/ethernet/cisco/enic/enic_main.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ static int enic_wq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc,
128128
completed_index, enic_wq_free_buf,
129129
opaque);
130130

131-
if (netif_queue_stopped(enic->netdev) &&
131+
if (netif_tx_queue_stopped(netdev_get_tx_queue(enic->netdev, q_number)) &&
132132
vnic_wq_desc_avail(&enic->wq[q_number]) >=
133133
(MAX_SKB_FRAGS + ENIC_DESC_MAX_SPLITS))
134-
netif_wake_queue(enic->netdev);
134+
netif_wake_subqueue(enic->netdev, q_number);
135135

136136
spin_unlock(&enic->wq_lock[q_number]);
137137

@@ -292,10 +292,15 @@ static irqreturn_t enic_isr_msix_rq(int irq, void *data)
292292
static irqreturn_t enic_isr_msix_wq(int irq, void *data)
293293
{
294294
struct enic *enic = data;
295-
unsigned int cq = enic_cq_wq(enic, 0);
296-
unsigned int intr = enic_msix_wq_intr(enic, 0);
295+
unsigned int cq;
296+
unsigned int intr;
297297
unsigned int wq_work_to_do = -1; /* no limit */
298298
unsigned int wq_work_done;
299+
unsigned int wq_irq;
300+
301+
wq_irq = (u32)irq - enic->msix_entry[enic_msix_wq_intr(enic, 0)].vector;
302+
cq = enic_cq_wq(enic, wq_irq);
303+
intr = enic_msix_wq_intr(enic, wq_irq);
299304

300305
wq_work_done = vnic_cq_service(&enic->cq[cq],
301306
wq_work_to_do, enic_wq_service, NULL);
@@ -511,14 +516,18 @@ static netdev_tx_t enic_hard_start_xmit(struct sk_buff *skb,
511516
struct net_device *netdev)
512517
{
513518
struct enic *enic = netdev_priv(netdev);
514-
struct vnic_wq *wq = &enic->wq[0];
519+
struct vnic_wq *wq;
515520
unsigned long flags;
521+
unsigned int txq_map;
516522

517523
if (skb->len <= 0) {
518524
dev_kfree_skb(skb);
519525
return NETDEV_TX_OK;
520526
}
521527

528+
txq_map = skb_get_queue_mapping(skb) % enic->wq_count;
529+
wq = &enic->wq[txq_map];
530+
522531
/* Non-TSO sends must fit within ENIC_NON_TSO_MAX_DESC descs,
523532
* which is very likely. In the off chance it's going to take
524533
* more than * ENIC_NON_TSO_MAX_DESC, linearize the skb.
@@ -531,23 +540,23 @@ static netdev_tx_t enic_hard_start_xmit(struct sk_buff *skb,
531540
return NETDEV_TX_OK;
532541
}
533542

534-
spin_lock_irqsave(&enic->wq_lock[0], flags);
543+
spin_lock_irqsave(&enic->wq_lock[txq_map], flags);
535544

536545
if (vnic_wq_desc_avail(wq) <
537546
skb_shinfo(skb)->nr_frags + ENIC_DESC_MAX_SPLITS) {
538-
netif_stop_queue(netdev);
547+
netif_tx_stop_queue(netdev_get_tx_queue(netdev, txq_map));
539548
/* This is a hard error, log it */
540549
netdev_err(netdev, "BUG! Tx ring full when queue awake!\n");
541-
spin_unlock_irqrestore(&enic->wq_lock[0], flags);
550+
spin_unlock_irqrestore(&enic->wq_lock[txq_map], flags);
542551
return NETDEV_TX_BUSY;
543552
}
544553

545554
enic_queue_wq_skb(enic, wq, skb);
546555

547556
if (vnic_wq_desc_avail(wq) < MAX_SKB_FRAGS + ENIC_DESC_MAX_SPLITS)
548-
netif_stop_queue(netdev);
557+
netif_tx_stop_queue(netdev_get_tx_queue(netdev, txq_map));
549558

550-
spin_unlock_irqrestore(&enic->wq_lock[0], flags);
559+
spin_unlock_irqrestore(&enic->wq_lock[txq_map], flags);
551560

552561
return NETDEV_TX_OK;
553562
}
@@ -1369,7 +1378,7 @@ static int enic_open(struct net_device *netdev)
13691378

13701379
enic_set_rx_mode(netdev);
13711380

1372-
netif_wake_queue(netdev);
1381+
netif_tx_wake_all_queues(netdev);
13731382

13741383
for (i = 0; i < enic->rq_count; i++)
13751384
napi_enable(&enic->napi[i]);
@@ -2032,7 +2041,8 @@ static int enic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
20322041
* instance data is initialized to zero.
20332042
*/
20342043

2035-
netdev = alloc_etherdev(sizeof(struct enic));
2044+
netdev = alloc_etherdev_mqs(sizeof(struct enic),
2045+
ENIC_RQ_MAX, ENIC_WQ_MAX);
20362046
if (!netdev)
20372047
return -ENOMEM;
20382048

@@ -2198,6 +2208,8 @@ static int enic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
21982208
goto err_out_dev_close;
21992209
}
22002210

2211+
netif_set_real_num_tx_queues(netdev, enic->wq_count);
2212+
22012213
/* Setup notification timer, HW reset task, and wq locks
22022214
*/
22032215

0 commit comments

Comments
 (0)