Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net-next: Add multiqueue support to vmxnet3 driver

Add multiqueue support to vmxnet3 driver

This change adds multiqueue and thus receive side scaling support
to vmxnet3 device driver. Number of rx queues is limited to 1 in cases
where MSI is not configured or one MSIx vector is not available per rx
queue

Signed-off-by: Shreyas Bhatewara <sbhatewara@vmware.com>
Reviewed-by: Bhavesh Davda <bhavesh@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Shreyas Bhatewara and committed by
David S. Miller
09c5088e 24912420

+918 -271
+748 -197
drivers/net/vmxnet3/vmxnet3_drv.c
··· 44 44 45 45 static atomic_t devices_found; 46 46 47 + #define VMXNET3_MAX_DEVICES 10 48 + static int enable_mq = 1; 49 + static int irq_share_mode; 47 50 48 51 /* 49 52 * Enable/Disable the given intr ··· 102 99 static bool 103 100 vmxnet3_tq_stopped(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter) 104 101 { 105 - return netif_queue_stopped(adapter->netdev); 102 + return tq->stopped; 106 103 } 107 104 108 105 ··· 110 107 vmxnet3_tq_start(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter) 111 108 { 112 109 tq->stopped = false; 113 - netif_start_queue(adapter->netdev); 110 + netif_start_subqueue(adapter->netdev, tq - adapter->tx_queue); 114 111 } 115 112 116 113 ··· 118 115 vmxnet3_tq_wake(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter) 119 116 { 120 117 tq->stopped = false; 121 - netif_wake_queue(adapter->netdev); 118 + netif_wake_subqueue(adapter->netdev, (tq - adapter->tx_queue)); 122 119 } 123 120 124 121 ··· 127 124 { 128 125 tq->stopped = true; 129 126 tq->num_stop++; 130 - netif_stop_queue(adapter->netdev); 127 + netif_stop_subqueue(adapter->netdev, (tq - adapter->tx_queue)); 131 128 } 132 129 133 130 ··· 138 135 vmxnet3_check_link(struct vmxnet3_adapter *adapter, bool affectTxQueue) 139 136 { 140 137 u32 ret; 138 + int i; 141 139 142 140 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK); 143 141 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD); ··· 149 145 if (!netif_carrier_ok(adapter->netdev)) 150 146 netif_carrier_on(adapter->netdev); 151 147 152 - if (affectTxQueue) 153 - vmxnet3_tq_start(&adapter->tx_queue, adapter); 148 + if (affectTxQueue) { 149 + for (i = 0; i < adapter->num_tx_queues; i++) 150 + vmxnet3_tq_start(&adapter->tx_queue[i], 151 + adapter); 152 + } 154 153 } else { 155 154 printk(KERN_INFO "%s: NIC Link is Down\n", 156 155 adapter->netdev->name); 157 156 if (netif_carrier_ok(adapter->netdev)) 158 157 netif_carrier_off(adapter->netdev); 159 158 160 - if (affectTxQueue) 161 - vmxnet3_tq_stop(&adapter->tx_queue, adapter); 159 + if (affectTxQueue) { 160 + for (i = 0; i < adapter->num_tx_queues; i++) 161 + vmxnet3_tq_stop(&adapter->tx_queue[i], adapter); 162 + } 162 163 } 163 164 } 164 165 165 166 static void 166 167 vmxnet3_process_events(struct vmxnet3_adapter *adapter) 167 168 { 169 + int i; 168 170 u32 events = le32_to_cpu(adapter->shared->ecr); 169 171 if (!events) 170 172 return; ··· 186 176 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 187 177 VMXNET3_CMD_GET_QUEUE_STATUS); 188 178 189 - if (adapter->tqd_start->status.stopped) { 190 - printk(KERN_ERR "%s: tq error 0x%x\n", 191 - adapter->netdev->name, 192 - le32_to_cpu(adapter->tqd_start->status.error)); 193 - } 194 - if (adapter->rqd_start->status.stopped) { 195 - printk(KERN_ERR "%s: rq error 0x%x\n", 196 - adapter->netdev->name, 197 - adapter->rqd_start->status.error); 198 - } 179 + for (i = 0; i < adapter->num_tx_queues; i++) 180 + if (adapter->tqd_start[i].status.stopped) 181 + dev_err(&adapter->netdev->dev, 182 + "%s: tq[%d] error 0x%x\n", 183 + adapter->netdev->name, i, le32_to_cpu( 184 + adapter->tqd_start[i].status.error)); 185 + for (i = 0; i < adapter->num_rx_queues; i++) 186 + if (adapter->rqd_start[i].status.stopped) 187 + dev_err(&adapter->netdev->dev, 188 + "%s: rq[%d] error 0x%x\n", 189 + adapter->netdev->name, i, 190 + adapter->rqd_start[i].status.error); 199 191 200 192 schedule_work(&adapter->work); 201 193 } ··· 422 410 } 423 411 424 412 425 - void 413 + static void 426 414 vmxnet3_tq_destroy(struct vmxnet3_tx_queue *tq, 427 415 struct vmxnet3_adapter *adapter) 428 416 { ··· 446 434 } 447 435 kfree(tq->buf_info); 448 436 tq->buf_info = NULL; 437 + } 438 + 439 + 440 + /* Destroy all tx queues */ 441 + void 442 + vmxnet3_tq_destroy_all(struct vmxnet3_adapter *adapter) 443 + { 444 + int i; 445 + 446 + for (i = 0; i < adapter->num_tx_queues; i++) 447 + vmxnet3_tq_destroy(&adapter->tx_queue[i], adapter); 449 448 } 450 449 451 450 ··· 541 518 return -ENOMEM; 542 519 } 543 520 521 + static void 522 + vmxnet3_tq_cleanup_all(struct vmxnet3_adapter *adapter) 523 + { 524 + int i; 525 + 526 + for (i = 0; i < adapter->num_tx_queues; i++) 527 + vmxnet3_tq_cleanup(&adapter->tx_queue[i], adapter); 528 + } 544 529 545 530 /* 546 531 * starting from ring->next2fill, allocate rx buffers for the given ring ··· 763 732 } 764 733 765 734 735 + /* Init all tx queues */ 736 + static void 737 + vmxnet3_tq_init_all(struct vmxnet3_adapter *adapter) 738 + { 739 + int i; 740 + 741 + for (i = 0; i < adapter->num_tx_queues; i++) 742 + vmxnet3_tq_init(&adapter->tx_queue[i], adapter); 743 + } 744 + 745 + 766 746 /* 767 747 * parse and copy relevant protocol headers: 768 748 * For a tso pkt, relevant headers are L2/3/4 including options ··· 945 903 } 946 904 } 947 905 906 + spin_lock_irqsave(&tq->tx_lock, flags); 907 + 908 + if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) { 909 + tq->stats.tx_ring_full++; 910 + dev_dbg(&adapter->netdev->dev, 911 + "tx queue stopped on %s, next2comp %u" 912 + " next2fill %u\n", adapter->netdev->name, 913 + tq->tx_ring.next2comp, tq->tx_ring.next2fill); 914 + 915 + vmxnet3_tq_stop(tq, adapter); 916 + spin_unlock_irqrestore(&tq->tx_lock, flags); 917 + return NETDEV_TX_BUSY; 918 + } 919 + 920 + 948 921 ret = vmxnet3_parse_and_copy_hdr(skb, tq, &ctx, adapter); 949 922 if (ret >= 0) { 950 923 BUG_ON(ret <= 0 && ctx.copy_size != 0); ··· 981 924 } else { 982 925 tq->stats.drop_hdr_inspect_err++; 983 926 goto drop_pkt; 984 - } 985 - 986 - spin_lock_irqsave(&tq->tx_lock, flags); 987 - 988 - if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) { 989 - tq->stats.tx_ring_full++; 990 - dev_dbg(&adapter->netdev->dev, 991 - "tx queue stopped on %s, next2comp %u" 992 - " next2fill %u\n", adapter->netdev->name, 993 - tq->tx_ring.next2comp, tq->tx_ring.next2fill); 994 - 995 - vmxnet3_tq_stop(tq, adapter); 996 - spin_unlock_irqrestore(&tq->tx_lock, flags); 997 - return NETDEV_TX_BUSY; 998 927 } 999 928 1000 929 /* fill tx descs related to addr & len */ ··· 1043 1000 if (le32_to_cpu(tq->shared->txNumDeferred) >= 1044 1001 le32_to_cpu(tq->shared->txThreshold)) { 1045 1002 tq->shared->txNumDeferred = 0; 1046 - VMXNET3_WRITE_BAR0_REG(adapter, VMXNET3_REG_TXPROD, 1003 + VMXNET3_WRITE_BAR0_REG(adapter, 1004 + VMXNET3_REG_TXPROD + tq->qid * 8, 1047 1005 tq->tx_ring.next2fill); 1048 1006 } 1049 1007 ··· 1064 1020 { 1065 1021 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1066 1022 1067 - return vmxnet3_tq_xmit(skb, &adapter->tx_queue, adapter, netdev); 1023 + BUG_ON(skb->queue_mapping > adapter->num_tx_queues); 1024 + return vmxnet3_tq_xmit(skb, 1025 + &adapter->tx_queue[skb->queue_mapping], 1026 + adapter, netdev); 1068 1027 } 1069 1028 1070 1029 ··· 1153 1106 break; 1154 1107 } 1155 1108 num_rxd++; 1156 - 1109 + BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2); 1157 1110 idx = rcd->rxdIdx; 1158 - ring_idx = rcd->rqID == rq->qid ? 0 : 1; 1111 + ring_idx = rcd->rqID < adapter->num_rx_queues ? 0 : 1; 1159 1112 vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd, 1160 1113 &rxCmdDesc); 1161 1114 rbi = rq->buf_info[ring_idx] + idx; ··· 1307 1260 } 1308 1261 1309 1262 1263 + static void 1264 + vmxnet3_rq_cleanup_all(struct vmxnet3_adapter *adapter) 1265 + { 1266 + int i; 1267 + 1268 + for (i = 0; i < adapter->num_rx_queues; i++) 1269 + vmxnet3_rq_cleanup(&adapter->rx_queue[i], adapter); 1270 + } 1271 + 1272 + 1310 1273 void vmxnet3_rq_destroy(struct vmxnet3_rx_queue *rq, 1311 1274 struct vmxnet3_adapter *adapter) 1312 1275 { ··· 1408 1351 1409 1352 1410 1353 static int 1354 + vmxnet3_rq_init_all(struct vmxnet3_adapter *adapter) 1355 + { 1356 + int i, err = 0; 1357 + 1358 + for (i = 0; i < adapter->num_rx_queues; i++) { 1359 + err = vmxnet3_rq_init(&adapter->rx_queue[i], adapter); 1360 + if (unlikely(err)) { 1361 + dev_err(&adapter->netdev->dev, "%s: failed to " 1362 + "initialize rx queue%i\n", 1363 + adapter->netdev->name, i); 1364 + break; 1365 + } 1366 + } 1367 + return err; 1368 + 1369 + } 1370 + 1371 + 1372 + static int 1411 1373 vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter) 1412 1374 { 1413 1375 int i; ··· 1474 1398 1475 1399 1476 1400 static int 1401 + vmxnet3_rq_create_all(struct vmxnet3_adapter *adapter) 1402 + { 1403 + int i, err = 0; 1404 + 1405 + for (i = 0; i < adapter->num_rx_queues; i++) { 1406 + err = vmxnet3_rq_create(&adapter->rx_queue[i], adapter); 1407 + if (unlikely(err)) { 1408 + dev_err(&adapter->netdev->dev, 1409 + "%s: failed to create rx queue%i\n", 1410 + adapter->netdev->name, i); 1411 + goto err_out; 1412 + } 1413 + } 1414 + return err; 1415 + err_out: 1416 + vmxnet3_rq_destroy_all(adapter); 1417 + return err; 1418 + 1419 + } 1420 + 1421 + /* Multiple queue aware polling function for tx and rx */ 1422 + 1423 + static int 1477 1424 vmxnet3_do_poll(struct vmxnet3_adapter *adapter, int budget) 1478 1425 { 1426 + int rcd_done = 0, i; 1479 1427 if (unlikely(adapter->shared->ecr)) 1480 1428 vmxnet3_process_events(adapter); 1429 + for (i = 0; i < adapter->num_tx_queues; i++) 1430 + vmxnet3_tq_tx_complete(&adapter->tx_queue[i], adapter); 1481 1431 1482 - vmxnet3_tq_tx_complete(&adapter->tx_queue, adapter); 1483 - return vmxnet3_rq_rx_complete(&adapter->rx_queue, adapter, budget); 1432 + for (i = 0; i < adapter->num_rx_queues; i++) 1433 + rcd_done += vmxnet3_rq_rx_complete(&adapter->rx_queue[i], 1434 + adapter, budget); 1435 + return rcd_done; 1484 1436 } 1485 1437 1486 1438 1487 1439 static int 1488 1440 vmxnet3_poll(struct napi_struct *napi, int budget) 1489 1441 { 1490 - struct vmxnet3_adapter *adapter = container_of(napi, 1491 - struct vmxnet3_adapter, napi); 1442 + struct vmxnet3_rx_queue *rx_queue = container_of(napi, 1443 + struct vmxnet3_rx_queue, napi); 1492 1444 int rxd_done; 1493 1445 1494 - rxd_done = vmxnet3_do_poll(adapter, budget); 1446 + rxd_done = vmxnet3_do_poll(rx_queue->adapter, budget); 1495 1447 1496 1448 if (rxd_done < budget) { 1497 1449 napi_complete(napi); 1498 - vmxnet3_enable_intr(adapter, 0); 1450 + vmxnet3_enable_all_intrs(rx_queue->adapter); 1499 1451 } 1500 1452 return rxd_done; 1501 1453 } 1454 + 1455 + /* 1456 + * NAPI polling function for MSI-X mode with multiple Rx queues 1457 + * Returns the # of the NAPI credit consumed (# of rx descriptors processed) 1458 + */ 1459 + 1460 + static int 1461 + vmxnet3_poll_rx_only(struct napi_struct *napi, int budget) 1462 + { 1463 + struct vmxnet3_rx_queue *rq = container_of(napi, 1464 + struct vmxnet3_rx_queue, napi); 1465 + struct vmxnet3_adapter *adapter = rq->adapter; 1466 + int rxd_done; 1467 + 1468 + /* When sharing interrupt with corresponding tx queue, process 1469 + * tx completions in that queue as well 1470 + */ 1471 + if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE) { 1472 + struct vmxnet3_tx_queue *tq = 1473 + &adapter->tx_queue[rq - adapter->rx_queue]; 1474 + vmxnet3_tq_tx_complete(tq, adapter); 1475 + } 1476 + 1477 + rxd_done = vmxnet3_rq_rx_complete(rq, adapter, budget); 1478 + 1479 + if (rxd_done < budget) { 1480 + napi_complete(napi); 1481 + vmxnet3_enable_intr(adapter, rq->comp_ring.intr_idx); 1482 + } 1483 + return rxd_done; 1484 + } 1485 + 1486 + 1487 + #ifdef CONFIG_PCI_MSI 1488 + 1489 + /* 1490 + * Handle completion interrupts on tx queues 1491 + * Returns whether or not the intr is handled 1492 + */ 1493 + 1494 + static irqreturn_t 1495 + vmxnet3_msix_tx(int irq, void *data) 1496 + { 1497 + struct vmxnet3_tx_queue *tq = data; 1498 + struct vmxnet3_adapter *adapter = tq->adapter; 1499 + 1500 + if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) 1501 + vmxnet3_disable_intr(adapter, tq->comp_ring.intr_idx); 1502 + 1503 + /* Handle the case where only one irq is allocate for all tx queues */ 1504 + if (adapter->share_intr == VMXNET3_INTR_TXSHARE) { 1505 + int i; 1506 + for (i = 0; i < adapter->num_tx_queues; i++) { 1507 + struct vmxnet3_tx_queue *txq = &adapter->tx_queue[i]; 1508 + vmxnet3_tq_tx_complete(txq, adapter); 1509 + } 1510 + } else { 1511 + vmxnet3_tq_tx_complete(tq, adapter); 1512 + } 1513 + vmxnet3_enable_intr(adapter, tq->comp_ring.intr_idx); 1514 + 1515 + return IRQ_HANDLED; 1516 + } 1517 + 1518 + 1519 + /* 1520 + * Handle completion interrupts on rx queues. Returns whether or not the 1521 + * intr is handled 1522 + */ 1523 + 1524 + static irqreturn_t 1525 + vmxnet3_msix_rx(int irq, void *data) 1526 + { 1527 + struct vmxnet3_rx_queue *rq = data; 1528 + struct vmxnet3_adapter *adapter = rq->adapter; 1529 + 1530 + /* disable intr if needed */ 1531 + if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) 1532 + vmxnet3_disable_intr(adapter, rq->comp_ring.intr_idx); 1533 + napi_schedule(&rq->napi); 1534 + 1535 + return IRQ_HANDLED; 1536 + } 1537 + 1538 + /* 1539 + *---------------------------------------------------------------------------- 1540 + * 1541 + * vmxnet3_msix_event -- 1542 + * 1543 + * vmxnet3 msix event intr handler 1544 + * 1545 + * Result: 1546 + * whether or not the intr is handled 1547 + * 1548 + *---------------------------------------------------------------------------- 1549 + */ 1550 + 1551 + static irqreturn_t 1552 + vmxnet3_msix_event(int irq, void *data) 1553 + { 1554 + struct net_device *dev = data; 1555 + struct vmxnet3_adapter *adapter = netdev_priv(dev); 1556 + 1557 + /* disable intr if needed */ 1558 + if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) 1559 + vmxnet3_disable_intr(adapter, adapter->intr.event_intr_idx); 1560 + 1561 + if (adapter->shared->ecr) 1562 + vmxnet3_process_events(adapter); 1563 + 1564 + vmxnet3_enable_intr(adapter, adapter->intr.event_intr_idx); 1565 + 1566 + return IRQ_HANDLED; 1567 + } 1568 + 1569 + #endif /* CONFIG_PCI_MSI */ 1502 1570 1503 1571 1504 1572 /* Interrupt handler for vmxnet3 */ ··· 1652 1432 struct net_device *dev = dev_id; 1653 1433 struct vmxnet3_adapter *adapter = netdev_priv(dev); 1654 1434 1655 - if (unlikely(adapter->intr.type == VMXNET3_IT_INTX)) { 1435 + if (adapter->intr.type == VMXNET3_IT_INTX) { 1656 1436 u32 icr = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_ICR); 1657 1437 if (unlikely(icr == 0)) 1658 1438 /* not ours */ ··· 1662 1442 1663 1443 /* disable intr if needed */ 1664 1444 if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) 1665 - vmxnet3_disable_intr(adapter, 0); 1445 + vmxnet3_disable_all_intrs(adapter); 1666 1446 1667 - napi_schedule(&adapter->napi); 1447 + napi_schedule(&adapter->rx_queue[0].napi); 1668 1448 1669 1449 return IRQ_HANDLED; 1670 1450 } 1671 1451 1672 1452 #ifdef CONFIG_NET_POLL_CONTROLLER 1673 1453 1674 - 1675 1454 /* netpoll callback. */ 1676 1455 static void 1677 1456 vmxnet3_netpoll(struct net_device *netdev) 1678 1457 { 1679 1458 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 1680 - int irq; 1681 1459 1682 - #ifdef CONFIG_PCI_MSI 1683 - if (adapter->intr.type == VMXNET3_IT_MSIX) 1684 - irq = adapter->intr.msix_entries[0].vector; 1685 - else 1686 - #endif 1687 - irq = adapter->pdev->irq; 1460 + if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) 1461 + vmxnet3_disable_all_intrs(adapter); 1688 1462 1689 - disable_irq(irq); 1690 - vmxnet3_intr(irq, netdev); 1691 - enable_irq(irq); 1463 + vmxnet3_do_poll(adapter, adapter->rx_queue[0].rx_ring[0].size); 1464 + vmxnet3_enable_all_intrs(adapter); 1465 + 1692 1466 } 1693 - #endif 1467 + #endif /* CONFIG_NET_POLL_CONTROLLER */ 1694 1468 1695 1469 static int 1696 1470 vmxnet3_request_irqs(struct vmxnet3_adapter *adapter) 1697 1471 { 1698 - int err; 1472 + struct vmxnet3_intr *intr = &adapter->intr; 1473 + int err = 0, i; 1474 + int vector = 0; 1699 1475 1700 1476 #ifdef CONFIG_PCI_MSI 1701 1477 if (adapter->intr.type == VMXNET3_IT_MSIX) { 1702 - /* we only use 1 MSI-X vector */ 1703 - err = request_irq(adapter->intr.msix_entries[0].vector, 1704 - vmxnet3_intr, 0, adapter->netdev->name, 1705 - adapter->netdev); 1706 - } else if (adapter->intr.type == VMXNET3_IT_MSI) { 1478 + for (i = 0; i < adapter->num_tx_queues; i++) { 1479 + if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE) { 1480 + sprintf(adapter->tx_queue[i].name, "%s-tx-%d", 1481 + adapter->netdev->name, vector); 1482 + err = request_irq( 1483 + intr->msix_entries[vector].vector, 1484 + vmxnet3_msix_tx, 0, 1485 + adapter->tx_queue[i].name, 1486 + &adapter->tx_queue[i]); 1487 + } else { 1488 + sprintf(adapter->tx_queue[i].name, "%s-rxtx-%d", 1489 + adapter->netdev->name, vector); 1490 + } 1491 + if (err) { 1492 + dev_err(&adapter->netdev->dev, 1493 + "Failed to request irq for MSIX, %s, " 1494 + "error %d\n", 1495 + adapter->tx_queue[i].name, err); 1496 + return err; 1497 + } 1498 + 1499 + /* Handle the case where only 1 MSIx was allocated for 1500 + * all tx queues */ 1501 + if (adapter->share_intr == VMXNET3_INTR_TXSHARE) { 1502 + for (; i < adapter->num_tx_queues; i++) 1503 + adapter->tx_queue[i].comp_ring.intr_idx 1504 + = vector; 1505 + vector++; 1506 + break; 1507 + } else { 1508 + adapter->tx_queue[i].comp_ring.intr_idx 1509 + = vector++; 1510 + } 1511 + } 1512 + if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE) 1513 + vector = 0; 1514 + 1515 + for (i = 0; i < adapter->num_rx_queues; i++) { 1516 + if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE) 1517 + sprintf(adapter->rx_queue[i].name, "%s-rx-%d", 1518 + adapter->netdev->name, vector); 1519 + else 1520 + sprintf(adapter->rx_queue[i].name, "%s-rxtx-%d", 1521 + adapter->netdev->name, vector); 1522 + err = request_irq(intr->msix_entries[vector].vector, 1523 + vmxnet3_msix_rx, 0, 1524 + adapter->rx_queue[i].name, 1525 + &(adapter->rx_queue[i])); 1526 + if (err) { 1527 + printk(KERN_ERR "Failed to request irq for MSIX" 1528 + ", %s, error %d\n", 1529 + adapter->rx_queue[i].name, err); 1530 + return err; 1531 + } 1532 + 1533 + adapter->rx_queue[i].comp_ring.intr_idx = vector++; 1534 + } 1535 + 1536 + sprintf(intr->event_msi_vector_name, "%s-event-%d", 1537 + adapter->netdev->name, vector); 1538 + err = request_irq(intr->msix_entries[vector].vector, 1539 + vmxnet3_msix_event, 0, 1540 + intr->event_msi_vector_name, adapter->netdev); 1541 + intr->event_intr_idx = vector; 1542 + 1543 + } else if (intr->type == VMXNET3_IT_MSI) { 1544 + adapter->num_rx_queues = 1; 1707 1545 err = request_irq(adapter->pdev->irq, vmxnet3_intr, 0, 1708 1546 adapter->netdev->name, adapter->netdev); 1709 - } else 1547 + } else { 1710 1548 #endif 1711 - { 1549 + adapter->num_rx_queues = 1; 1712 1550 err = request_irq(adapter->pdev->irq, vmxnet3_intr, 1713 1551 IRQF_SHARED, adapter->netdev->name, 1714 1552 adapter->netdev); 1553 + #ifdef CONFIG_PCI_MSI 1715 1554 } 1716 - 1717 - if (err) 1555 + #endif 1556 + intr->num_intrs = vector + 1; 1557 + if (err) { 1718 1558 printk(KERN_ERR "Failed to request irq %s (intr type:%d), error" 1719 - ":%d\n", adapter->netdev->name, adapter->intr.type, err); 1559 + ":%d\n", adapter->netdev->name, intr->type, err); 1560 + } else { 1561 + /* Number of rx queues will not change after this */ 1562 + for (i = 0; i < adapter->num_rx_queues; i++) { 1563 + struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i]; 1564 + rq->qid = i; 1565 + rq->qid2 = i + adapter->num_rx_queues; 1566 + } 1720 1567 1721 1568 1722 - if (!err) { 1723 - int i; 1569 + 1724 1570 /* init our intr settings */ 1725 - for (i = 0; i < adapter->intr.num_intrs; i++) 1726 - adapter->intr.mod_levels[i] = UPT1_IML_ADAPTIVE; 1727 - 1728 - /* next setup intr index for all intr sources */ 1729 - adapter->tx_queue.comp_ring.intr_idx = 0; 1730 - adapter->rx_queue.comp_ring.intr_idx = 0; 1731 - adapter->intr.event_intr_idx = 0; 1571 + for (i = 0; i < intr->num_intrs; i++) 1572 + intr->mod_levels[i] = UPT1_IML_ADAPTIVE; 1573 + if (adapter->intr.type != VMXNET3_IT_MSIX) { 1574 + adapter->intr.event_intr_idx = 0; 1575 + for (i = 0; i < adapter->num_tx_queues; i++) 1576 + adapter->tx_queue[i].comp_ring.intr_idx = 0; 1577 + adapter->rx_queue[0].comp_ring.intr_idx = 0; 1578 + } 1732 1579 1733 1580 printk(KERN_INFO "%s: intr type %u, mode %u, %u vectors " 1734 - "allocated\n", adapter->netdev->name, adapter->intr.type, 1735 - adapter->intr.mask_mode, adapter->intr.num_intrs); 1581 + "allocated\n", adapter->netdev->name, intr->type, 1582 + intr->mask_mode, intr->num_intrs); 1736 1583 } 1737 1584 1738 1585 return err; ··· 1809 1522 static void 1810 1523 vmxnet3_free_irqs(struct vmxnet3_adapter *adapter) 1811 1524 { 1812 - BUG_ON(adapter->intr.type == VMXNET3_IT_AUTO || 1813 - adapter->intr.num_intrs <= 0); 1525 + struct vmxnet3_intr *intr = &adapter->intr; 1526 + BUG_ON(intr->type == VMXNET3_IT_AUTO || intr->num_intrs <= 0); 1814 1527 1815 - switch (adapter->intr.type) { 1528 + switch (intr->type) { 1816 1529 #ifdef CONFIG_PCI_MSI 1817 1530 case VMXNET3_IT_MSIX: 1818 1531 { 1819 - int i; 1532 + int i, vector = 0; 1820 1533 1821 - for (i = 0; i < adapter->intr.num_intrs; i++) 1822 - free_irq(adapter->intr.msix_entries[i].vector, 1823 - adapter->netdev); 1534 + if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE) { 1535 + for (i = 0; i < adapter->num_tx_queues; i++) { 1536 + free_irq(intr->msix_entries[vector++].vector, 1537 + &(adapter->tx_queue[i])); 1538 + if (adapter->share_intr == VMXNET3_INTR_TXSHARE) 1539 + break; 1540 + } 1541 + } 1542 + 1543 + for (i = 0; i < adapter->num_rx_queues; i++) { 1544 + free_irq(intr->msix_entries[vector++].vector, 1545 + &(adapter->rx_queue[i])); 1546 + } 1547 + 1548 + free_irq(intr->msix_entries[vector].vector, 1549 + adapter->netdev); 1550 + BUG_ON(vector >= intr->num_intrs); 1824 1551 break; 1825 1552 } 1826 1553 #endif ··· 2028 1727 kfree(new_table); 2029 1728 } 2030 1729 1730 + void 1731 + vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter) 1732 + { 1733 + int i; 1734 + 1735 + for (i = 0; i < adapter->num_rx_queues; i++) 1736 + vmxnet3_rq_destroy(&adapter->rx_queue[i], adapter); 1737 + } 1738 + 2031 1739 2032 1740 /* 2033 1741 * Set up driver_shared based on settings in adapter. ··· 2084 1774 devRead->misc.mtu = cpu_to_le32(adapter->netdev->mtu); 2085 1775 devRead->misc.queueDescPA = cpu_to_le64(adapter->queue_desc_pa); 2086 1776 devRead->misc.queueDescLen = cpu_to_le32( 2087 - sizeof(struct Vmxnet3_TxQueueDesc) + 2088 - sizeof(struct Vmxnet3_RxQueueDesc)); 1777 + adapter->num_tx_queues * sizeof(struct Vmxnet3_TxQueueDesc) + 1778 + adapter->num_rx_queues * sizeof(struct Vmxnet3_RxQueueDesc)); 2089 1779 2090 1780 /* tx queue settings */ 2091 - BUG_ON(adapter->tx_queue.tx_ring.base == NULL); 2092 - 2093 - devRead->misc.numTxQueues = 1; 2094 - tqc = &adapter->tqd_start->conf; 2095 - tqc->txRingBasePA = cpu_to_le64(adapter->tx_queue.tx_ring.basePA); 2096 - tqc->dataRingBasePA = cpu_to_le64(adapter->tx_queue.data_ring.basePA); 2097 - tqc->compRingBasePA = cpu_to_le64(adapter->tx_queue.comp_ring.basePA); 2098 - tqc->ddPA = cpu_to_le64(virt_to_phys( 2099 - adapter->tx_queue.buf_info)); 2100 - tqc->txRingSize = cpu_to_le32(adapter->tx_queue.tx_ring.size); 2101 - tqc->dataRingSize = cpu_to_le32(adapter->tx_queue.data_ring.size); 2102 - tqc->compRingSize = cpu_to_le32(adapter->tx_queue.comp_ring.size); 2103 - tqc->ddLen = cpu_to_le32(sizeof(struct vmxnet3_tx_buf_info) * 2104 - tqc->txRingSize); 2105 - tqc->intrIdx = adapter->tx_queue.comp_ring.intr_idx; 1781 + devRead->misc.numTxQueues = adapter->num_tx_queues; 1782 + for (i = 0; i < adapter->num_tx_queues; i++) { 1783 + struct vmxnet3_tx_queue *tq = &adapter->tx_queue[i]; 1784 + BUG_ON(adapter->tx_queue[i].tx_ring.base == NULL); 1785 + tqc = &adapter->tqd_start[i].conf; 1786 + tqc->txRingBasePA = cpu_to_le64(tq->tx_ring.basePA); 1787 + tqc->dataRingBasePA = cpu_to_le64(tq->data_ring.basePA); 1788 + tqc->compRingBasePA = cpu_to_le64(tq->comp_ring.basePA); 1789 + tqc->ddPA = cpu_to_le64(virt_to_phys(tq->buf_info)); 1790 + tqc->txRingSize = cpu_to_le32(tq->tx_ring.size); 1791 + tqc->dataRingSize = cpu_to_le32(tq->data_ring.size); 1792 + tqc->compRingSize = cpu_to_le32(tq->comp_ring.size); 1793 + tqc->ddLen = cpu_to_le32( 1794 + sizeof(struct vmxnet3_tx_buf_info) * 1795 + tqc->txRingSize); 1796 + tqc->intrIdx = tq->comp_ring.intr_idx; 1797 + } 2106 1798 2107 1799 /* rx queue settings */ 2108 - devRead->misc.numRxQueues = 1; 2109 - rqc = &adapter->rqd_start->conf; 2110 - rqc->rxRingBasePA[0] = cpu_to_le64(adapter->rx_queue.rx_ring[0].basePA); 2111 - rqc->rxRingBasePA[1] = cpu_to_le64(adapter->rx_queue.rx_ring[1].basePA); 2112 - rqc->compRingBasePA = cpu_to_le64(adapter->rx_queue.comp_ring.basePA); 2113 - rqc->ddPA = cpu_to_le64(virt_to_phys( 2114 - adapter->rx_queue.buf_info)); 2115 - rqc->rxRingSize[0] = cpu_to_le32(adapter->rx_queue.rx_ring[0].size); 2116 - rqc->rxRingSize[1] = cpu_to_le32(adapter->rx_queue.rx_ring[1].size); 2117 - rqc->compRingSize = cpu_to_le32(adapter->rx_queue.comp_ring.size); 2118 - rqc->ddLen = cpu_to_le32(sizeof(struct vmxnet3_rx_buf_info) * 2119 - (rqc->rxRingSize[0] + rqc->rxRingSize[1])); 2120 - rqc->intrIdx = adapter->rx_queue.comp_ring.intr_idx; 1800 + devRead->misc.numRxQueues = adapter->num_rx_queues; 1801 + for (i = 0; i < adapter->num_rx_queues; i++) { 1802 + struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i]; 1803 + rqc = &adapter->rqd_start[i].conf; 1804 + rqc->rxRingBasePA[0] = cpu_to_le64(rq->rx_ring[0].basePA); 1805 + rqc->rxRingBasePA[1] = cpu_to_le64(rq->rx_ring[1].basePA); 1806 + rqc->compRingBasePA = cpu_to_le64(rq->comp_ring.basePA); 1807 + rqc->ddPA = cpu_to_le64(virt_to_phys( 1808 + rq->buf_info)); 1809 + rqc->rxRingSize[0] = cpu_to_le32(rq->rx_ring[0].size); 1810 + rqc->rxRingSize[1] = cpu_to_le32(rq->rx_ring[1].size); 1811 + rqc->compRingSize = cpu_to_le32(rq->comp_ring.size); 1812 + rqc->ddLen = cpu_to_le32( 1813 + sizeof(struct vmxnet3_rx_buf_info) * 1814 + (rqc->rxRingSize[0] + 1815 + rqc->rxRingSize[1])); 1816 + rqc->intrIdx = rq->comp_ring.intr_idx; 1817 + } 1818 + 1819 + #ifdef VMXNET3_RSS 1820 + memset(adapter->rss_conf, 0, sizeof(*adapter->rss_conf)); 1821 + 1822 + if (adapter->rss) { 1823 + struct UPT1_RSSConf *rssConf = adapter->rss_conf; 1824 + devRead->misc.uptFeatures |= UPT1_F_RSS; 1825 + devRead->misc.numRxQueues = adapter->num_rx_queues; 1826 + rssConf->hashType = UPT1_RSS_HASH_TYPE_TCP_IPV4 | 1827 + UPT1_RSS_HASH_TYPE_IPV4 | 1828 + UPT1_RSS_HASH_TYPE_TCP_IPV6 | 1829 + UPT1_RSS_HASH_TYPE_IPV6; 1830 + rssConf->hashFunc = UPT1_RSS_HASH_FUNC_TOEPLITZ; 1831 + rssConf->hashKeySize = UPT1_RSS_MAX_KEY_SIZE; 1832 + rssConf->indTableSize = VMXNET3_RSS_IND_TABLE_SIZE; 1833 + get_random_bytes(&rssConf->hashKey[0], rssConf->hashKeySize); 1834 + for (i = 0; i < rssConf->indTableSize; i++) 1835 + rssConf->indTable[i] = i % adapter->num_rx_queues; 1836 + 1837 + devRead->rssConfDesc.confVer = 1; 1838 + devRead->rssConfDesc.confLen = sizeof(*rssConf); 1839 + devRead->rssConfDesc.confPA = virt_to_phys(rssConf); 1840 + } 1841 + 1842 + #endif /* VMXNET3_RSS */ 2121 1843 2122 1844 /* intr settings */ 2123 1845 devRead->intrConf.autoMask = adapter->intr.mask_mode == ··· 2171 1829 int 2172 1830 vmxnet3_activate_dev(struct vmxnet3_adapter *adapter) 2173 1831 { 2174 - int err; 1832 + int err, i; 2175 1833 u32 ret; 2176 1834 2177 - dev_dbg(&adapter->netdev->dev, 2178 - "%s: skb_buf_size %d, rx_buf_per_pkt %d, ring sizes" 2179 - " %u %u %u\n", adapter->netdev->name, adapter->skb_buf_size, 2180 - adapter->rx_buf_per_pkt, adapter->tx_queue.tx_ring.size, 2181 - adapter->rx_queue.rx_ring[0].size, 2182 - adapter->rx_queue.rx_ring[1].size); 1835 + dev_dbg(&adapter->netdev->dev, "%s: skb_buf_size %d, rx_buf_per_pkt %d," 1836 + " ring sizes %u %u %u\n", adapter->netdev->name, 1837 + adapter->skb_buf_size, adapter->rx_buf_per_pkt, 1838 + adapter->tx_queue[0].tx_ring.size, 1839 + adapter->rx_queue[0].rx_ring[0].size, 1840 + adapter->rx_queue[0].rx_ring[1].size); 2183 1841 2184 - vmxnet3_tq_init(&adapter->tx_queue, adapter); 2185 - err = vmxnet3_rq_init(&adapter->rx_queue, adapter); 1842 + vmxnet3_tq_init_all(adapter); 1843 + err = vmxnet3_rq_init_all(adapter); 2186 1844 if (err) { 2187 1845 printk(KERN_ERR "Failed to init rx queue for %s: error %d\n", 2188 1846 adapter->netdev->name, err); ··· 2212 1870 err = -EINVAL; 2213 1871 goto activate_err; 2214 1872 } 2215 - VMXNET3_WRITE_BAR0_REG(adapter, VMXNET3_REG_RXPROD, 2216 - adapter->rx_queue.rx_ring[0].next2fill); 2217 - VMXNET3_WRITE_BAR0_REG(adapter, VMXNET3_REG_RXPROD2, 2218 - adapter->rx_queue.rx_ring[1].next2fill); 1873 + 1874 + for (i = 0; i < adapter->num_rx_queues; i++) { 1875 + VMXNET3_WRITE_BAR0_REG(adapter, 1876 + VMXNET3_REG_RXPROD + i * VMXNET3_REG_ALIGN, 1877 + adapter->rx_queue[i].rx_ring[0].next2fill); 1878 + VMXNET3_WRITE_BAR0_REG(adapter, (VMXNET3_REG_RXPROD2 + 1879 + (i * VMXNET3_REG_ALIGN)), 1880 + adapter->rx_queue[i].rx_ring[1].next2fill); 1881 + } 2219 1882 2220 1883 /* Apply the rx filter settins last. */ 2221 1884 vmxnet3_set_mc(adapter->netdev); ··· 2230 1883 * tx queue if the link is up. 2231 1884 */ 2232 1885 vmxnet3_check_link(adapter, true); 2233 - 2234 - napi_enable(&adapter->napi); 1886 + for (i = 0; i < adapter->num_rx_queues; i++) 1887 + napi_enable(&adapter->rx_queue[i].napi); 2235 1888 vmxnet3_enable_all_intrs(adapter); 2236 1889 clear_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state); 2237 1890 return 0; ··· 2243 1896 irq_err: 2244 1897 rq_err: 2245 1898 /* free up buffers we allocated */ 2246 - vmxnet3_rq_cleanup(&adapter->rx_queue, adapter); 1899 + vmxnet3_rq_cleanup_all(adapter); 2247 1900 return err; 2248 1901 } 2249 1902 ··· 2258 1911 int 2259 1912 vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter) 2260 1913 { 1914 + int i; 2261 1915 if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state)) 2262 1916 return 0; 2263 1917 ··· 2267 1919 VMXNET3_CMD_QUIESCE_DEV); 2268 1920 vmxnet3_disable_all_intrs(adapter); 2269 1921 2270 - napi_disable(&adapter->napi); 1922 + for (i = 0; i < adapter->num_rx_queues; i++) 1923 + napi_disable(&adapter->rx_queue[i].napi); 2271 1924 netif_tx_disable(adapter->netdev); 2272 1925 adapter->link_speed = 0; 2273 1926 netif_carrier_off(adapter->netdev); 2274 1927 2275 - vmxnet3_tq_cleanup(&adapter->tx_queue, adapter); 2276 - vmxnet3_rq_cleanup(&adapter->rx_queue, adapter); 1928 + vmxnet3_tq_cleanup_all(adapter); 1929 + vmxnet3_rq_cleanup_all(adapter); 2277 1930 vmxnet3_free_irqs(adapter); 2278 1931 return 0; 2279 1932 } ··· 2396 2047 static void 2397 2048 vmxnet3_adjust_rx_ring_size(struct vmxnet3_adapter *adapter) 2398 2049 { 2399 - size_t sz; 2050 + size_t sz, i, ring0_size, ring1_size, comp_size; 2051 + struct vmxnet3_rx_queue *rq = &adapter->rx_queue[0]; 2052 + 2400 2053 2401 2054 if (adapter->netdev->mtu <= VMXNET3_MAX_SKB_BUF_SIZE - 2402 2055 VMXNET3_MAX_ETH_HDR_SIZE) { ··· 2420 2069 * rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN 2421 2070 */ 2422 2071 sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN; 2423 - adapter->rx_queue.rx_ring[0].size = (adapter->rx_queue.rx_ring[0].size + 2424 - sz - 1) / sz * sz; 2425 - adapter->rx_queue.rx_ring[0].size = min_t(u32, 2426 - adapter->rx_queue.rx_ring[0].size, 2427 - VMXNET3_RX_RING_MAX_SIZE / sz * sz); 2072 + ring0_size = adapter->rx_queue[0].rx_ring[0].size; 2073 + ring0_size = (ring0_size + sz - 1) / sz * sz; 2074 + ring0_size = min_t(u32, rq->rx_ring[0].size, VMXNET3_RX_RING_MAX_SIZE / 2075 + sz * sz); 2076 + ring1_size = adapter->rx_queue[0].rx_ring[1].size; 2077 + comp_size = ring0_size + ring1_size; 2078 + 2079 + for (i = 0; i < adapter->num_rx_queues; i++) { 2080 + rq = &adapter->rx_queue[i]; 2081 + rq->rx_ring[0].size = ring0_size; 2082 + rq->rx_ring[1].size = ring1_size; 2083 + rq->comp_ring.size = comp_size; 2084 + } 2428 2085 } 2429 2086 2430 2087 ··· 2440 2081 vmxnet3_create_queues(struct vmxnet3_adapter *adapter, u32 tx_ring_size, 2441 2082 u32 rx_ring_size, u32 rx_ring2_size) 2442 2083 { 2443 - int err; 2084 + int err = 0, i; 2444 2085 2445 - adapter->tx_queue.tx_ring.size = tx_ring_size; 2446 - adapter->tx_queue.data_ring.size = tx_ring_size; 2447 - adapter->tx_queue.comp_ring.size = tx_ring_size; 2448 - adapter->tx_queue.shared = &adapter->tqd_start->ctrl; 2449 - adapter->tx_queue.stopped = true; 2450 - err = vmxnet3_tq_create(&adapter->tx_queue, adapter); 2451 - if (err) 2452 - return err; 2086 + for (i = 0; i < adapter->num_tx_queues; i++) { 2087 + struct vmxnet3_tx_queue *tq = &adapter->tx_queue[i]; 2088 + tq->tx_ring.size = tx_ring_size; 2089 + tq->data_ring.size = tx_ring_size; 2090 + tq->comp_ring.size = tx_ring_size; 2091 + tq->shared = &adapter->tqd_start[i].ctrl; 2092 + tq->stopped = true; 2093 + tq->adapter = adapter; 2094 + tq->qid = i; 2095 + err = vmxnet3_tq_create(tq, adapter); 2096 + /* 2097 + * Too late to change num_tx_queues. We cannot do away with 2098 + * lesser number of queues than what we asked for 2099 + */ 2100 + if (err) 2101 + goto queue_err; 2102 + } 2453 2103 2454 - adapter->rx_queue.rx_ring[0].size = rx_ring_size; 2455 - adapter->rx_queue.rx_ring[1].size = rx_ring2_size; 2104 + adapter->rx_queue[0].rx_ring[0].size = rx_ring_size; 2105 + adapter->rx_queue[0].rx_ring[1].size = rx_ring2_size; 2456 2106 vmxnet3_adjust_rx_ring_size(adapter); 2457 - adapter->rx_queue.comp_ring.size = adapter->rx_queue.rx_ring[0].size + 2458 - adapter->rx_queue.rx_ring[1].size; 2459 - adapter->rx_queue.qid = 0; 2460 - adapter->rx_queue.qid2 = 1; 2461 - adapter->rx_queue.shared = &adapter->rqd_start->ctrl; 2462 - err = vmxnet3_rq_create(&adapter->rx_queue, adapter); 2463 - if (err) 2464 - vmxnet3_tq_destroy(&adapter->tx_queue, adapter); 2465 - 2107 + for (i = 0; i < adapter->num_rx_queues; i++) { 2108 + struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i]; 2109 + /* qid and qid2 for rx queues will be assigned later when num 2110 + * of rx queues is finalized after allocating intrs */ 2111 + rq->shared = &adapter->rqd_start[i].ctrl; 2112 + rq->adapter = adapter; 2113 + err = vmxnet3_rq_create(rq, adapter); 2114 + if (err) { 2115 + if (i == 0) { 2116 + printk(KERN_ERR "Could not allocate any rx" 2117 + "queues. Aborting.\n"); 2118 + goto queue_err; 2119 + } else { 2120 + printk(KERN_INFO "Number of rx queues changed " 2121 + "to : %d.\n", i); 2122 + adapter->num_rx_queues = i; 2123 + err = 0; 2124 + break; 2125 + } 2126 + } 2127 + } 2128 + return err; 2129 + queue_err: 2130 + vmxnet3_tq_destroy_all(adapter); 2466 2131 return err; 2467 2132 } 2468 2133 ··· 2494 2111 vmxnet3_open(struct net_device *netdev) 2495 2112 { 2496 2113 struct vmxnet3_adapter *adapter; 2497 - int err; 2114 + int err, i; 2498 2115 2499 2116 adapter = netdev_priv(netdev); 2500 2117 2501 - spin_lock_init(&adapter->tx_queue.tx_lock); 2118 + for (i = 0; i < adapter->num_tx_queues; i++) 2119 + spin_lock_init(&adapter->tx_queue[i].tx_lock); 2502 2120 2503 2121 err = vmxnet3_create_queues(adapter, VMXNET3_DEF_TX_RING_SIZE, 2504 2122 VMXNET3_DEF_RX_RING_SIZE, ··· 2514 2130 return 0; 2515 2131 2516 2132 activate_err: 2517 - vmxnet3_rq_destroy(&adapter->rx_queue, adapter); 2518 - vmxnet3_tq_destroy(&adapter->tx_queue, adapter); 2133 + vmxnet3_rq_destroy_all(adapter); 2134 + vmxnet3_tq_destroy_all(adapter); 2519 2135 queue_err: 2520 2136 return err; 2521 2137 } ··· 2535 2151 2536 2152 vmxnet3_quiesce_dev(adapter); 2537 2153 2538 - vmxnet3_rq_destroy(&adapter->rx_queue, adapter); 2539 - vmxnet3_tq_destroy(&adapter->tx_queue, adapter); 2154 + vmxnet3_rq_destroy_all(adapter); 2155 + vmxnet3_tq_destroy_all(adapter); 2540 2156 2541 2157 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); 2542 2158 ··· 2548 2164 void 2549 2165 vmxnet3_force_close(struct vmxnet3_adapter *adapter) 2550 2166 { 2167 + int i; 2168 + 2551 2169 /* 2552 2170 * we must clear VMXNET3_STATE_BIT_RESETTING, otherwise 2553 2171 * vmxnet3_close() will deadlock. ··· 2557 2171 BUG_ON(test_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state)); 2558 2172 2559 2173 /* we need to enable NAPI, otherwise dev_close will deadlock */ 2560 - napi_enable(&adapter->napi); 2174 + for (i = 0; i < adapter->num_rx_queues; i++) 2175 + napi_enable(&adapter->rx_queue[i].napi); 2561 2176 dev_close(adapter->netdev); 2562 2177 } 2563 2178 ··· 2589 2202 vmxnet3_reset_dev(adapter); 2590 2203 2591 2204 /* we need to re-create the rx queue based on the new mtu */ 2592 - vmxnet3_rq_destroy(&adapter->rx_queue, adapter); 2205 + vmxnet3_rq_destroy_all(adapter); 2593 2206 vmxnet3_adjust_rx_ring_size(adapter); 2594 - adapter->rx_queue.comp_ring.size = 2595 - adapter->rx_queue.rx_ring[0].size + 2596 - adapter->rx_queue.rx_ring[1].size; 2597 - err = vmxnet3_rq_create(&adapter->rx_queue, adapter); 2207 + err = vmxnet3_rq_create_all(adapter); 2598 2208 if (err) { 2599 - printk(KERN_ERR "%s: failed to re-create rx queue," 2209 + printk(KERN_ERR "%s: failed to re-create rx queues," 2600 2210 " error %d. Closing it.\n", netdev->name, err); 2601 2211 goto out; 2602 2212 } ··· 2658 2274 mac[5] = (tmp >> 8) & 0xff; 2659 2275 } 2660 2276 2277 + #ifdef CONFIG_PCI_MSI 2278 + 2279 + /* 2280 + * Enable MSIx vectors. 2281 + * Returns : 2282 + * 0 on successful enabling of required vectors, 2283 + * VMXNET3_LINUX_MIN_MSIX_VECT when only minumum number of vectors required 2284 + * could be enabled. 2285 + * number of vectors which can be enabled otherwise (this number is smaller 2286 + * than VMXNET3_LINUX_MIN_MSIX_VECT) 2287 + */ 2288 + 2289 + static int 2290 + vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, 2291 + int vectors) 2292 + { 2293 + int err = 0, vector_threshold; 2294 + vector_threshold = VMXNET3_LINUX_MIN_MSIX_VECT; 2295 + 2296 + while (vectors >= vector_threshold) { 2297 + err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries, 2298 + vectors); 2299 + if (!err) { 2300 + adapter->intr.num_intrs = vectors; 2301 + return 0; 2302 + } else if (err < 0) { 2303 + printk(KERN_ERR "Failed to enable MSI-X for %s, error" 2304 + " %d\n", adapter->netdev->name, err); 2305 + vectors = 0; 2306 + } else if (err < vector_threshold) { 2307 + break; 2308 + } else { 2309 + /* If fails to enable required number of MSI-x vectors 2310 + * try enabling 3 of them. One each for rx, tx and event 2311 + */ 2312 + vectors = vector_threshold; 2313 + printk(KERN_ERR "Failed to enable %d MSI-X for %s, try" 2314 + " %d instead\n", vectors, adapter->netdev->name, 2315 + vector_threshold); 2316 + } 2317 + } 2318 + 2319 + printk(KERN_INFO "Number of MSI-X interrupts which can be allocatedi" 2320 + " are lower than min threshold required.\n"); 2321 + return err; 2322 + } 2323 + 2324 + 2325 + #endif /* CONFIG_PCI_MSI */ 2661 2326 2662 2327 static void 2663 2328 vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter) ··· 2726 2293 2727 2294 #ifdef CONFIG_PCI_MSI 2728 2295 if (adapter->intr.type == VMXNET3_IT_MSIX) { 2729 - int err; 2296 + int vector, err = 0; 2730 2297 2731 - adapter->intr.msix_entries[0].entry = 0; 2732 - err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries, 2733 - VMXNET3_LINUX_MAX_MSIX_VECT); 2734 - if (!err) { 2735 - adapter->intr.num_intrs = 1; 2736 - adapter->intr.type = VMXNET3_IT_MSIX; 2298 + adapter->intr.num_intrs = (adapter->share_intr == 2299 + VMXNET3_INTR_TXSHARE) ? 1 : 2300 + adapter->num_tx_queues; 2301 + adapter->intr.num_intrs += (adapter->share_intr == 2302 + VMXNET3_INTR_BUDDYSHARE) ? 0 : 2303 + adapter->num_rx_queues; 2304 + adapter->intr.num_intrs += 1; /* for link event */ 2305 + 2306 + adapter->intr.num_intrs = (adapter->intr.num_intrs > 2307 + VMXNET3_LINUX_MIN_MSIX_VECT 2308 + ? adapter->intr.num_intrs : 2309 + VMXNET3_LINUX_MIN_MSIX_VECT); 2310 + 2311 + for (vector = 0; vector < adapter->intr.num_intrs; vector++) 2312 + adapter->intr.msix_entries[vector].entry = vector; 2313 + 2314 + err = vmxnet3_acquire_msix_vectors(adapter, 2315 + adapter->intr.num_intrs); 2316 + /* If we cannot allocate one MSIx vector per queue 2317 + * then limit the number of rx queues to 1 2318 + */ 2319 + if (err == VMXNET3_LINUX_MIN_MSIX_VECT) { 2320 + if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE 2321 + || adapter->num_rx_queues != 2) { 2322 + adapter->share_intr = VMXNET3_INTR_TXSHARE; 2323 + printk(KERN_ERR "Number of rx queues : 1\n"); 2324 + adapter->num_rx_queues = 1; 2325 + adapter->intr.num_intrs = 2326 + VMXNET3_LINUX_MIN_MSIX_VECT; 2327 + } 2737 2328 return; 2738 2329 } 2330 + if (!err) 2331 + return; 2332 + 2333 + /* If we cannot allocate MSIx vectors use only one rx queue */ 2334 + printk(KERN_INFO "Failed to enable MSI-X for %s, error %d." 2335 + "#rx queues : 1, try MSI\n", adapter->netdev->name, err); 2336 + 2739 2337 adapter->intr.type = VMXNET3_IT_MSI; 2740 2338 } 2741 2339 ··· 2774 2310 int err; 2775 2311 err = pci_enable_msi(adapter->pdev); 2776 2312 if (!err) { 2313 + adapter->num_rx_queues = 1; 2777 2314 adapter->intr.num_intrs = 1; 2778 2315 return; 2779 2316 } 2780 2317 } 2781 2318 #endif /* CONFIG_PCI_MSI */ 2782 2319 2320 + adapter->num_rx_queues = 1; 2321 + printk(KERN_INFO "Using INTx interrupt, #Rx queues: 1.\n"); 2783 2322 adapter->intr.type = VMXNET3_IT_INTX; 2784 2323 2785 2324 /* INT-X related setting */ ··· 2810 2343 2811 2344 printk(KERN_ERR "%s: tx hang\n", adapter->netdev->name); 2812 2345 schedule_work(&adapter->work); 2346 + netif_wake_queue(adapter->netdev); 2813 2347 } 2814 2348 2815 2349 ··· 2867 2399 struct net_device *netdev; 2868 2400 struct vmxnet3_adapter *adapter; 2869 2401 u8 mac[ETH_ALEN]; 2402 + int size; 2403 + int num_tx_queues; 2404 + int num_rx_queues; 2870 2405 2871 - netdev = alloc_etherdev(sizeof(struct vmxnet3_adapter)); 2406 + #ifdef VMXNET3_RSS 2407 + if (enable_mq) 2408 + num_rx_queues = min(VMXNET3_DEVICE_MAX_RX_QUEUES, 2409 + (int)num_online_cpus()); 2410 + else 2411 + #endif 2412 + num_rx_queues = 1; 2413 + 2414 + if (enable_mq) 2415 + num_tx_queues = min(VMXNET3_DEVICE_MAX_TX_QUEUES, 2416 + (int)num_online_cpus()); 2417 + else 2418 + num_tx_queues = 1; 2419 + 2420 + netdev = alloc_etherdev_mq(sizeof(struct vmxnet3_adapter), 2421 + max(num_tx_queues, num_rx_queues)); 2422 + printk(KERN_INFO "# of Tx queues : %d, # of Rx queues : %d\n", 2423 + num_tx_queues, num_rx_queues); 2424 + 2872 2425 if (!netdev) { 2873 2426 printk(KERN_ERR "Failed to alloc ethernet device for adapter " 2874 2427 "%s\n", pci_name(pdev)); ··· 2911 2422 goto err_alloc_shared; 2912 2423 } 2913 2424 2914 - adapter->tqd_start = pci_alloc_consistent(adapter->pdev, 2915 - sizeof(struct Vmxnet3_TxQueueDesc) + 2916 - sizeof(struct Vmxnet3_RxQueueDesc), 2425 + adapter->num_rx_queues = num_rx_queues; 2426 + adapter->num_tx_queues = num_tx_queues; 2427 + 2428 + size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues; 2429 + size += sizeof(struct Vmxnet3_RxQueueDesc) * adapter->num_rx_queues; 2430 + adapter->tqd_start = pci_alloc_consistent(adapter->pdev, size, 2917 2431 &adapter->queue_desc_pa); 2918 2432 2919 2433 if (!adapter->tqd_start) { ··· 2925 2433 err = -ENOMEM; 2926 2434 goto err_alloc_queue_desc; 2927 2435 } 2928 - adapter->rqd_start = (struct Vmxnet3_RxQueueDesc *)(adapter->tqd_start 2929 - + 1); 2436 + adapter->rqd_start = (struct Vmxnet3_RxQueueDesc *)(adapter->tqd_start + 2437 + adapter->num_tx_queues); 2930 2438 2931 2439 adapter->pm_conf = kmalloc(sizeof(struct Vmxnet3_PMConf), GFP_KERNEL); 2932 2440 if (adapter->pm_conf == NULL) { ··· 2935 2443 err = -ENOMEM; 2936 2444 goto err_alloc_pm; 2937 2445 } 2446 + 2447 + #ifdef VMXNET3_RSS 2448 + 2449 + adapter->rss_conf = kmalloc(sizeof(struct UPT1_RSSConf), GFP_KERNEL); 2450 + if (adapter->rss_conf == NULL) { 2451 + printk(KERN_ERR "Failed to allocate memory for %s\n", 2452 + pci_name(pdev)); 2453 + err = -ENOMEM; 2454 + goto err_alloc_rss; 2455 + } 2456 + #endif /* VMXNET3_RSS */ 2938 2457 2939 2458 err = vmxnet3_alloc_pci_resources(adapter, &dma64); 2940 2459 if (err < 0) ··· 2974 2471 vmxnet3_declare_features(adapter, dma64); 2975 2472 2976 2473 adapter->dev_number = atomic_read(&devices_found); 2474 + 2475 + adapter->share_intr = irq_share_mode; 2476 + if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE && 2477 + adapter->num_tx_queues != adapter->num_rx_queues) 2478 + adapter->share_intr = VMXNET3_INTR_DONTSHARE; 2479 + 2977 2480 vmxnet3_alloc_intr_resources(adapter); 2481 + 2482 + #ifdef VMXNET3_RSS 2483 + if (adapter->num_rx_queues > 1 && 2484 + adapter->intr.type == VMXNET3_IT_MSIX) { 2485 + adapter->rss = true; 2486 + printk(KERN_INFO "RSS is enabled.\n"); 2487 + } else { 2488 + adapter->rss = false; 2489 + } 2490 + #endif 2978 2491 2979 2492 vmxnet3_read_mac_addr(adapter, mac); 2980 2493 memcpy(netdev->dev_addr, mac, netdev->addr_len); 2981 2494 2982 2495 netdev->netdev_ops = &vmxnet3_netdev_ops; 2983 - netdev->watchdog_timeo = 5 * HZ; 2984 2496 vmxnet3_set_ethtool_ops(netdev); 2497 + netdev->watchdog_timeo = 5 * HZ; 2985 2498 2986 2499 INIT_WORK(&adapter->work, vmxnet3_reset_work); 2987 2500 2988 - netif_napi_add(netdev, &adapter->napi, vmxnet3_poll, 64); 2501 + if (adapter->intr.type == VMXNET3_IT_MSIX) { 2502 + int i; 2503 + for (i = 0; i < adapter->num_rx_queues; i++) { 2504 + netif_napi_add(adapter->netdev, 2505 + &adapter->rx_queue[i].napi, 2506 + vmxnet3_poll_rx_only, 64); 2507 + } 2508 + } else { 2509 + netif_napi_add(adapter->netdev, &adapter->rx_queue[0].napi, 2510 + vmxnet3_poll, 64); 2511 + } 2512 + 2513 + netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); 2514 + netif_set_real_num_rx_queues(adapter->netdev, adapter->num_rx_queues); 2515 + 2989 2516 SET_NETDEV_DEV(netdev, &pdev->dev); 2990 2517 err = register_netdev(netdev); 2991 2518 ··· 3035 2502 err_ver: 3036 2503 vmxnet3_free_pci_resources(adapter); 3037 2504 err_alloc_pci: 2505 + #ifdef VMXNET3_RSS 2506 + kfree(adapter->rss_conf); 2507 + err_alloc_rss: 2508 + #endif 3038 2509 kfree(adapter->pm_conf); 3039 2510 err_alloc_pm: 3040 - pci_free_consistent(adapter->pdev, sizeof(struct Vmxnet3_TxQueueDesc) + 3041 - sizeof(struct Vmxnet3_RxQueueDesc), 3042 - adapter->tqd_start, adapter->queue_desc_pa); 2511 + pci_free_consistent(adapter->pdev, size, adapter->tqd_start, 2512 + adapter->queue_desc_pa); 3043 2513 err_alloc_queue_desc: 3044 2514 pci_free_consistent(adapter->pdev, sizeof(struct Vmxnet3_DriverShared), 3045 2515 adapter->shared, adapter->shared_pa); ··· 3058 2522 { 3059 2523 struct net_device *netdev = pci_get_drvdata(pdev); 3060 2524 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 2525 + int size = 0; 2526 + int num_rx_queues; 2527 + 2528 + #ifdef VMXNET3_RSS 2529 + if (enable_mq) 2530 + num_rx_queues = min(VMXNET3_DEVICE_MAX_RX_QUEUES, 2531 + (int)num_online_cpus()); 2532 + else 2533 + #endif 2534 + num_rx_queues = 1; 3061 2535 3062 2536 flush_scheduled_work(); 3063 2537 ··· 3075 2529 3076 2530 vmxnet3_free_intr_resources(adapter); 3077 2531 vmxnet3_free_pci_resources(adapter); 2532 + #ifdef VMXNET3_RSS 2533 + kfree(adapter->rss_conf); 2534 + #endif 3078 2535 kfree(adapter->pm_conf); 3079 - pci_free_consistent(adapter->pdev, sizeof(struct Vmxnet3_TxQueueDesc) + 3080 - sizeof(struct Vmxnet3_RxQueueDesc), 3081 - adapter->tqd_start, adapter->queue_desc_pa); 2536 + 2537 + size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues; 2538 + size += sizeof(struct Vmxnet3_RxQueueDesc) * num_rx_queues; 2539 + pci_free_consistent(adapter->pdev, size, adapter->tqd_start, 2540 + adapter->queue_desc_pa); 3082 2541 pci_free_consistent(adapter->pdev, sizeof(struct Vmxnet3_DriverShared), 3083 2542 adapter->shared, adapter->shared_pa); 3084 2543 free_netdev(netdev); ··· 3114 2563 vmxnet3_free_intr_resources(adapter); 3115 2564 3116 2565 netif_device_detach(netdev); 3117 - netif_stop_queue(netdev); 2566 + netif_tx_stop_all_queues(netdev); 3118 2567 3119 2568 /* Create wake-up filters. */ 3120 2569 pmConf = adapter->pm_conf;
+119 -52
drivers/net/vmxnet3/vmxnet3_ethtool.c
··· 151 151 struct UPT1_TxStats *devTxStats; 152 152 struct UPT1_RxStats *devRxStats; 153 153 struct net_device_stats *net_stats = &netdev->stats; 154 + int i; 154 155 155 156 adapter = netdev_priv(netdev); 156 157 157 158 /* Collect the dev stats into the shared area */ 158 159 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); 159 160 160 - /* Assuming that we have a single queue device */ 161 - devTxStats = &adapter->tqd_start->stats; 162 - devRxStats = &adapter->rqd_start->stats; 163 - 164 - /* Get access to the driver stats per queue */ 165 - drvTxStats = &adapter->tx_queue.stats; 166 - drvRxStats = &adapter->rx_queue.stats; 167 - 168 161 memset(net_stats, 0, sizeof(*net_stats)); 162 + for (i = 0; i < adapter->num_tx_queues; i++) { 163 + devTxStats = &adapter->tqd_start[i].stats; 164 + drvTxStats = &adapter->tx_queue[i].stats; 165 + net_stats->tx_packets += devTxStats->ucastPktsTxOK + 166 + devTxStats->mcastPktsTxOK + 167 + devTxStats->bcastPktsTxOK; 168 + net_stats->tx_bytes += devTxStats->ucastBytesTxOK + 169 + devTxStats->mcastBytesTxOK + 170 + devTxStats->bcastBytesTxOK; 171 + net_stats->tx_errors += devTxStats->pktsTxError; 172 + net_stats->tx_dropped += drvTxStats->drop_total; 173 + } 169 174 170 - net_stats->rx_packets = devRxStats->ucastPktsRxOK + 171 - devRxStats->mcastPktsRxOK + 172 - devRxStats->bcastPktsRxOK; 175 + for (i = 0; i < adapter->num_rx_queues; i++) { 176 + devRxStats = &adapter->rqd_start[i].stats; 177 + drvRxStats = &adapter->rx_queue[i].stats; 178 + net_stats->rx_packets += devRxStats->ucastPktsRxOK + 179 + devRxStats->mcastPktsRxOK + 180 + devRxStats->bcastPktsRxOK; 173 181 174 - net_stats->tx_packets = devTxStats->ucastPktsTxOK + 175 - devTxStats->mcastPktsTxOK + 176 - devTxStats->bcastPktsTxOK; 182 + net_stats->rx_bytes += devRxStats->ucastBytesRxOK + 183 + devRxStats->mcastBytesRxOK + 184 + devRxStats->bcastBytesRxOK; 177 185 178 - net_stats->rx_bytes = devRxStats->ucastBytesRxOK + 179 - devRxStats->mcastBytesRxOK + 180 - devRxStats->bcastBytesRxOK; 181 - 182 - net_stats->tx_bytes = devTxStats->ucastBytesTxOK + 183 - devTxStats->mcastBytesTxOK + 184 - devTxStats->bcastBytesTxOK; 185 - 186 - net_stats->rx_errors = devRxStats->pktsRxError; 187 - net_stats->tx_errors = devTxStats->pktsTxError; 188 - net_stats->rx_dropped = drvRxStats->drop_total; 189 - net_stats->tx_dropped = drvTxStats->drop_total; 190 - net_stats->multicast = devRxStats->mcastPktsRxOK; 191 - 186 + net_stats->rx_errors += devRxStats->pktsRxError; 187 + net_stats->rx_dropped += drvRxStats->drop_total; 188 + net_stats->multicast += devRxStats->mcastPktsRxOK; 189 + } 192 190 return net_stats; 193 191 } 194 192 ··· 305 307 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 306 308 u8 *base; 307 309 int i; 310 + int j = 0; 308 311 309 312 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); 310 313 311 314 /* this does assume each counter is 64-bit wide */ 315 + /* TODO change this for multiple queues */ 312 316 313 - base = (u8 *)&adapter->tqd_start->stats; 317 + base = (u8 *)&adapter->tqd_start[j].stats; 314 318 for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++) 315 319 *buf++ = *(u64 *)(base + vmxnet3_tq_dev_stats[i].offset); 316 320 317 - base = (u8 *)&adapter->tx_queue.stats; 321 + base = (u8 *)&adapter->tx_queue[j].stats; 318 322 for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++) 319 323 *buf++ = *(u64 *)(base + vmxnet3_tq_driver_stats[i].offset); 320 324 321 - base = (u8 *)&adapter->rqd_start->stats; 325 + base = (u8 *)&adapter->rqd_start[j].stats; 322 326 for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++) 323 327 *buf++ = *(u64 *)(base + vmxnet3_rq_dev_stats[i].offset); 324 328 325 - base = (u8 *)&adapter->rx_queue.stats; 329 + base = (u8 *)&adapter->rx_queue[j].stats; 326 330 for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++) 327 331 *buf++ = *(u64 *)(base + vmxnet3_rq_driver_stats[i].offset); 328 332 ··· 339 339 { 340 340 struct vmxnet3_adapter *adapter = netdev_priv(netdev); 341 341 u32 *buf = p; 342 + int i = 0; 342 343 343 344 memset(p, 0, vmxnet3_get_regs_len(netdev)); 344 345 ··· 348 347 /* Update vmxnet3_get_regs_len if we want to dump more registers */ 349 348 350 349 /* make each ring use multiple of 16 bytes */ 351 - buf[0] = adapter->tx_queue.tx_ring.next2fill; 352 - buf[1] = adapter->tx_queue.tx_ring.next2comp; 353 - buf[2] = adapter->tx_queue.tx_ring.gen; 350 + /* TODO change this for multiple queues */ 351 + buf[0] = adapter->tx_queue[i].tx_ring.next2fill; 352 + buf[1] = adapter->tx_queue[i].tx_ring.next2comp; 353 + buf[2] = adapter->tx_queue[i].tx_ring.gen; 354 354 buf[3] = 0; 355 355 356 - buf[4] = adapter->tx_queue.comp_ring.next2proc; 357 - buf[5] = adapter->tx_queue.comp_ring.gen; 358 - buf[6] = adapter->tx_queue.stopped; 356 + buf[4] = adapter->tx_queue[i].comp_ring.next2proc; 357 + buf[5] = adapter->tx_queue[i].comp_ring.gen; 358 + buf[6] = adapter->tx_queue[i].stopped; 359 359 buf[7] = 0; 360 360 361 - buf[8] = adapter->rx_queue.rx_ring[0].next2fill; 362 - buf[9] = adapter->rx_queue.rx_ring[0].next2comp; 363 - buf[10] = adapter->rx_queue.rx_ring[0].gen; 361 + buf[8] = adapter->rx_queue[i].rx_ring[0].next2fill; 362 + buf[9] = adapter->rx_queue[i].rx_ring[0].next2comp; 363 + buf[10] = adapter->rx_queue[i].rx_ring[0].gen; 364 364 buf[11] = 0; 365 365 366 - buf[12] = adapter->rx_queue.rx_ring[1].next2fill; 367 - buf[13] = adapter->rx_queue.rx_ring[1].next2comp; 368 - buf[14] = adapter->rx_queue.rx_ring[1].gen; 366 + buf[12] = adapter->rx_queue[i].rx_ring[1].next2fill; 367 + buf[13] = adapter->rx_queue[i].rx_ring[1].next2comp; 368 + buf[14] = adapter->rx_queue[i].rx_ring[1].gen; 369 369 buf[15] = 0; 370 370 371 - buf[16] = adapter->rx_queue.comp_ring.next2proc; 372 - buf[17] = adapter->rx_queue.comp_ring.gen; 371 + buf[16] = adapter->rx_queue[i].comp_ring.next2proc; 372 + buf[17] = adapter->rx_queue[i].comp_ring.gen; 373 373 buf[18] = 0; 374 374 buf[19] = 0; 375 375 } ··· 437 435 param->rx_mini_max_pending = 0; 438 436 param->rx_jumbo_max_pending = 0; 439 437 440 - param->rx_pending = adapter->rx_queue.rx_ring[0].size; 441 - param->tx_pending = adapter->tx_queue.tx_ring.size; 438 + param->rx_pending = adapter->rx_queue[0].rx_ring[0].size * 439 + adapter->num_rx_queues; 440 + param->tx_pending = adapter->tx_queue[0].tx_ring.size * 441 + adapter->num_tx_queues; 442 442 param->rx_mini_pending = 0; 443 443 param->rx_jumbo_pending = 0; 444 444 } ··· 484 480 sz) != 0) 485 481 return -EINVAL; 486 482 487 - if (new_tx_ring_size == adapter->tx_queue.tx_ring.size && 488 - new_rx_ring_size == adapter->rx_queue.rx_ring[0].size) { 483 + if (new_tx_ring_size == adapter->tx_queue[0].tx_ring.size && 484 + new_rx_ring_size == adapter->rx_queue[0].rx_ring[0].size) { 489 485 return 0; 490 486 } 491 487 ··· 502 498 503 499 /* recreate the rx queue and the tx queue based on the 504 500 * new sizes */ 505 - vmxnet3_tq_destroy(&adapter->tx_queue, adapter); 506 - vmxnet3_rq_destroy(&adapter->rx_queue, adapter); 501 + vmxnet3_tq_destroy_all(adapter); 502 + vmxnet3_rq_destroy_all(adapter); 507 503 508 504 err = vmxnet3_create_queues(adapter, new_tx_ring_size, 509 505 new_rx_ring_size, VMXNET3_DEF_RX_RING_SIZE); 506 + 510 507 if (err) { 511 508 /* failed, most likely because of OOM, try default 512 509 * size */ ··· 540 535 } 541 536 542 537 538 + static int 539 + vmxnet3_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *info, 540 + void *rules) 541 + { 542 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 543 + switch (info->cmd) { 544 + case ETHTOOL_GRXRINGS: 545 + info->data = adapter->num_rx_queues; 546 + return 0; 547 + } 548 + return -EOPNOTSUPP; 549 + } 550 + 551 + 552 + static int 553 + vmxnet3_get_rss_indir(struct net_device *netdev, 554 + struct ethtool_rxfh_indir *p) 555 + { 556 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 557 + struct UPT1_RSSConf *rssConf = adapter->rss_conf; 558 + unsigned int n = min_t(unsigned int, p->size, rssConf->indTableSize); 559 + 560 + p->size = rssConf->indTableSize; 561 + while (n--) 562 + p->ring_index[n] = rssConf->indTable[n]; 563 + return 0; 564 + 565 + } 566 + 567 + static int 568 + vmxnet3_set_rss_indir(struct net_device *netdev, 569 + const struct ethtool_rxfh_indir *p) 570 + { 571 + unsigned int i; 572 + struct vmxnet3_adapter *adapter = netdev_priv(netdev); 573 + struct UPT1_RSSConf *rssConf = adapter->rss_conf; 574 + 575 + if (p->size != rssConf->indTableSize) 576 + return -EINVAL; 577 + for (i = 0; i < rssConf->indTableSize; i++) { 578 + /* 579 + * Return with error code if any of the queue indices 580 + * is out of range 581 + */ 582 + if (p->ring_index[i] < 0 || 583 + p->ring_index[i] >= adapter->num_rx_queues) 584 + return -EINVAL; 585 + } 586 + 587 + for (i = 0; i < rssConf->indTableSize; i++) 588 + rssConf->indTable[i] = p->ring_index[i]; 589 + 590 + VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, 591 + VMXNET3_CMD_UPDATE_RSSIDT); 592 + 593 + return 0; 594 + 595 + } 596 + 543 597 static struct ethtool_ops vmxnet3_ethtool_ops = { 544 598 .get_settings = vmxnet3_get_settings, 545 599 .get_drvinfo = vmxnet3_get_drvinfo, ··· 622 558 .get_ethtool_stats = vmxnet3_get_ethtool_stats, 623 559 .get_ringparam = vmxnet3_get_ringparam, 624 560 .set_ringparam = vmxnet3_set_ringparam, 561 + .get_rxnfc = vmxnet3_get_rxnfc, 562 + .get_rxfh_indir = vmxnet3_get_rss_indir, 563 + .set_rxfh_indir = vmxnet3_set_rss_indir, 625 564 }; 626 565 627 566 void vmxnet3_set_ethtool_ops(struct net_device *netdev)
+51 -22
drivers/net/vmxnet3/vmxnet3_int.h
··· 68 68 /* 69 69 * Version numbers 70 70 */ 71 - #define VMXNET3_DRIVER_VERSION_STRING "1.0.14.0-k" 71 + #define VMXNET3_DRIVER_VERSION_STRING "1.0.16.0-k" 72 72 73 73 /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ 74 - #define VMXNET3_DRIVER_VERSION_NUM 0x01000E00 74 + #define VMXNET3_DRIVER_VERSION_NUM 0x01001000 75 75 76 + #if defined(CONFIG_PCI_MSI) 77 + /* RSS only makes sense if MSI-X is supported. */ 78 + #define VMXNET3_RSS 79 + #endif 76 80 77 81 /* 78 82 * Capabilities ··· 222 218 }; 223 219 224 220 struct vmxnet3_tx_queue { 221 + char name[IFNAMSIZ+8]; /* To identify interrupt */ 222 + struct vmxnet3_adapter *adapter; 225 223 spinlock_t tx_lock; 226 224 struct vmxnet3_cmd_ring tx_ring; 227 - struct vmxnet3_tx_buf_info *buf_info; 225 + struct vmxnet3_tx_buf_info *buf_info; 228 226 struct vmxnet3_tx_data_ring data_ring; 229 227 struct vmxnet3_comp_ring comp_ring; 230 - struct Vmxnet3_TxQueueCtrl *shared; 228 + struct Vmxnet3_TxQueueCtrl *shared; 231 229 struct vmxnet3_tq_driver_stats stats; 232 230 bool stopped; 233 231 int num_stop; /* # of times the queue is 234 232 * stopped */ 233 + int qid; 235 234 } __attribute__((__aligned__(SMP_CACHE_BYTES))); 236 235 237 236 enum vmxnet3_rx_buf_type { ··· 266 259 }; 267 260 268 261 struct vmxnet3_rx_queue { 262 + char name[IFNAMSIZ + 8]; /* To identify interrupt */ 263 + struct vmxnet3_adapter *adapter; 264 + struct napi_struct napi; 269 265 struct vmxnet3_cmd_ring rx_ring[2]; 270 266 struct vmxnet3_comp_ring comp_ring; 271 267 struct vmxnet3_rx_ctx rx_ctx; ··· 281 271 struct vmxnet3_rq_driver_stats stats; 282 272 } __attribute__((__aligned__(SMP_CACHE_BYTES))); 283 273 284 - #define VMXNET3_LINUX_MAX_MSIX_VECT 1 274 + #define VMXNET3_DEVICE_MAX_TX_QUEUES 8 275 + #define VMXNET3_DEVICE_MAX_RX_QUEUES 8 /* Keep this value as a power of 2 */ 276 + 277 + /* Should be less than UPT1_RSS_MAX_IND_TABLE_SIZE */ 278 + #define VMXNET3_RSS_IND_TABLE_SIZE (VMXNET3_DEVICE_MAX_RX_QUEUES * 4) 279 + 280 + #define VMXNET3_LINUX_MAX_MSIX_VECT (VMXNET3_DEVICE_MAX_TX_QUEUES + \ 281 + VMXNET3_DEVICE_MAX_RX_QUEUES + 1) 282 + #define VMXNET3_LINUX_MIN_MSIX_VECT 3 /* 1 for each : tx, rx and event */ 283 + 285 284 286 285 struct vmxnet3_intr { 287 286 enum vmxnet3_intr_mask_mode mask_mode; ··· 298 279 u8 num_intrs; /* # of intr vectors */ 299 280 u8 event_intr_idx; /* idx of the intr vector for event */ 300 281 u8 mod_levels[VMXNET3_LINUX_MAX_MSIX_VECT]; /* moderation level */ 282 + char event_msi_vector_name[IFNAMSIZ+11]; 301 283 #ifdef CONFIG_PCI_MSI 302 284 struct msix_entry msix_entries[VMXNET3_LINUX_MAX_MSIX_VECT]; 303 285 #endif 304 286 }; 305 287 288 + /* Interrupt sharing schemes, share_intr */ 289 + #define VMXNET3_INTR_BUDDYSHARE 0 /* Corresponding tx,rx queues share irq */ 290 + #define VMXNET3_INTR_TXSHARE 1 /* All tx queues share one irq */ 291 + #define VMXNET3_INTR_DONTSHARE 2 /* each queue has its own irq */ 292 + 293 + 306 294 #define VMXNET3_STATE_BIT_RESETTING 0 307 295 #define VMXNET3_STATE_BIT_QUIESCED 1 308 296 struct vmxnet3_adapter { 309 - struct vmxnet3_tx_queue tx_queue; 310 - struct vmxnet3_rx_queue rx_queue; 311 - struct napi_struct napi; 312 - struct vlan_group *vlan_grp; 313 - 314 - struct vmxnet3_intr intr; 315 - 316 - struct Vmxnet3_DriverShared *shared; 317 - struct Vmxnet3_PMConf *pm_conf; 318 - struct Vmxnet3_TxQueueDesc *tqd_start; /* first tx queue desc */ 319 - struct Vmxnet3_RxQueueDesc *rqd_start; /* first rx queue desc */ 320 - struct net_device *netdev; 321 - struct pci_dev *pdev; 297 + struct vmxnet3_tx_queue tx_queue[VMXNET3_DEVICE_MAX_TX_QUEUES]; 298 + struct vmxnet3_rx_queue rx_queue[VMXNET3_DEVICE_MAX_RX_QUEUES]; 299 + struct vlan_group *vlan_grp; 300 + struct vmxnet3_intr intr; 301 + struct Vmxnet3_DriverShared *shared; 302 + struct Vmxnet3_PMConf *pm_conf; 303 + struct Vmxnet3_TxQueueDesc *tqd_start; /* all tx queue desc */ 304 + struct Vmxnet3_RxQueueDesc *rqd_start; /* all rx queue desc */ 305 + struct net_device *netdev; 306 + struct net_device_stats net_stats; 307 + struct pci_dev *pdev; 322 308 323 309 u8 __iomem *hw_addr0; /* for BAR 0 */ 324 310 u8 __iomem *hw_addr1; /* for BAR 1 */ ··· 332 308 bool rxcsum; 333 309 bool lro; 334 310 bool jumbo_frame; 311 + #ifdef VMXNET3_RSS 312 + struct UPT1_RSSConf *rss_conf; 313 + bool rss; 314 + #endif 315 + u32 num_rx_queues; 316 + u32 num_tx_queues; 335 317 336 318 /* rx buffer related */ 337 319 unsigned skb_buf_size; ··· 357 327 unsigned long state; /* VMXNET3_STATE_BIT_xxx */ 358 328 359 329 int dev_number; 330 + int share_intr; 360 331 }; 361 332 362 333 #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \ ··· 397 366 vmxnet3_reset_dev(struct vmxnet3_adapter *adapter); 398 367 399 368 void 400 - vmxnet3_tq_destroy(struct vmxnet3_tx_queue *tq, 401 - struct vmxnet3_adapter *adapter); 369 + vmxnet3_tq_destroy_all(struct vmxnet3_adapter *adapter); 402 370 403 371 void 404 - vmxnet3_rq_destroy(struct vmxnet3_rx_queue *rq, 405 - struct vmxnet3_adapter *adapter); 372 + vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter); 406 373 407 374 int 408 375 vmxnet3_create_queues(struct vmxnet3_adapter *adapter,