4578 lines · c
1/*2 * Linux driver for VMware's vmxnet3 ethernet NIC.3 *4 * Copyright (C) 2008-2024, VMware, Inc. All Rights Reserved.5 *6 * This program is free software; you can redistribute it and/or modify it7 * under the terms of the GNU General Public License as published by the8 * Free Software Foundation; version 2 of the License and no later version.9 *10 * This program is distributed in the hope that it will be useful, but11 * WITHOUT ANY WARRANTY; without even the implied warranty of12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or13 * NON INFRINGEMENT. See the GNU General Public License for more14 * details.15 *16 * You should have received a copy of the GNU General Public License17 * along with this program; if not, write to the Free Software18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19 *20 * The full GNU General Public License is included in this distribution in21 * the file called "COPYING".22 *23 * Maintained by: pv-drivers@vmware.com24 *25 */26 27#include <linux/module.h>28#include <net/ip6_checksum.h>29 30#include "vmxnet3_int.h"31#include "vmxnet3_xdp.h"32 33char vmxnet3_driver_name[] = "vmxnet3";34#define VMXNET3_DRIVER_DESC "VMware vmxnet3 virtual NIC driver"35 36/*37 * PCI Device ID Table38 * Last entry must be all 0s39 */40static const struct pci_device_id vmxnet3_pciid_table[] = {41 {PCI_VDEVICE(VMWARE, PCI_DEVICE_ID_VMWARE_VMXNET3)},42 {0}43};44 45MODULE_DEVICE_TABLE(pci, vmxnet3_pciid_table);46 47static int enable_mq = 1;48 49static void50vmxnet3_write_mac_addr(struct vmxnet3_adapter *adapter, const u8 *mac);51 52/*53 * Enable/Disable the given intr54 */55static void56vmxnet3_enable_intr(struct vmxnet3_adapter *adapter, unsigned intr_idx)57{58 VMXNET3_WRITE_BAR0_REG(adapter, VMXNET3_REG_IMR + intr_idx * 8, 0);59}60 61 62static void63vmxnet3_disable_intr(struct vmxnet3_adapter *adapter, unsigned intr_idx)64{65 VMXNET3_WRITE_BAR0_REG(adapter, VMXNET3_REG_IMR + intr_idx * 8, 1);66}67 68 69/*70 * Enable/Disable all intrs used by the device71 */72static void73vmxnet3_enable_all_intrs(struct vmxnet3_adapter *adapter)74{75 int i;76 77 for (i = 0; i < adapter->intr.num_intrs; i++)78 vmxnet3_enable_intr(adapter, i);79 if (!VMXNET3_VERSION_GE_6(adapter) ||80 !adapter->queuesExtEnabled) {81 adapter->shared->devRead.intrConf.intrCtrl &=82 cpu_to_le32(~VMXNET3_IC_DISABLE_ALL);83 } else {84 adapter->shared->devReadExt.intrConfExt.intrCtrl &=85 cpu_to_le32(~VMXNET3_IC_DISABLE_ALL);86 }87}88 89 90static void91vmxnet3_disable_all_intrs(struct vmxnet3_adapter *adapter)92{93 int i;94 95 if (!VMXNET3_VERSION_GE_6(adapter) ||96 !adapter->queuesExtEnabled) {97 adapter->shared->devRead.intrConf.intrCtrl |=98 cpu_to_le32(VMXNET3_IC_DISABLE_ALL);99 } else {100 adapter->shared->devReadExt.intrConfExt.intrCtrl |=101 cpu_to_le32(VMXNET3_IC_DISABLE_ALL);102 }103 for (i = 0; i < adapter->intr.num_intrs; i++)104 vmxnet3_disable_intr(adapter, i);105}106 107 108static void109vmxnet3_ack_events(struct vmxnet3_adapter *adapter, u32 events)110{111 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_ECR, events);112}113 114 115static bool116vmxnet3_tq_stopped(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter)117{118 return tq->stopped;119}120 121 122static void123vmxnet3_tq_start(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter)124{125 tq->stopped = false;126 netif_start_subqueue(adapter->netdev, tq - adapter->tx_queue);127}128 129 130static void131vmxnet3_tq_wake(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter)132{133 tq->stopped = false;134 netif_wake_subqueue(adapter->netdev, (tq - adapter->tx_queue));135}136 137 138static void139vmxnet3_tq_stop(struct vmxnet3_tx_queue *tq, struct vmxnet3_adapter *adapter)140{141 tq->stopped = true;142 tq->num_stop++;143 netif_stop_subqueue(adapter->netdev, (tq - adapter->tx_queue));144}145 146static u64147vmxnet3_get_cycles(int pmc)148{149#ifdef CONFIG_X86150 return native_read_pmc(pmc);151#else152 return 0;153#endif154}155 156static bool157vmxnet3_apply_timestamp(struct vmxnet3_tx_queue *tq, u16 rate)158{159#ifdef CONFIG_X86160 if (rate > 0) {161 if (tq->tsPktCount == 1) {162 if (rate != 1)163 tq->tsPktCount = rate;164 return true;165 }166 tq->tsPktCount--;167 }168#endif169 return false;170}171 172/* Check if capability is supported by UPT device or173 * UPT is even requested174 */175bool176vmxnet3_check_ptcapability(u32 cap_supported, u32 cap)177{178 if (cap_supported & (1UL << VMXNET3_DCR_ERROR) ||179 cap_supported & (1UL << cap)) {180 return true;181 }182 183 return false;184}185 186 187/*188 * Check the link state. This may start or stop the tx queue.189 */190static void191vmxnet3_check_link(struct vmxnet3_adapter *adapter, bool affectTxQueue)192{193 u32 ret;194 int i;195 unsigned long flags;196 197 spin_lock_irqsave(&adapter->cmd_lock, flags);198 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK);199 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);200 spin_unlock_irqrestore(&adapter->cmd_lock, flags);201 202 adapter->link_speed = ret >> 16;203 if (ret & 1) { /* Link is up. */204 netdev_info(adapter->netdev, "NIC Link is Up %d Mbps\n",205 adapter->link_speed);206 netif_carrier_on(adapter->netdev);207 208 if (affectTxQueue) {209 for (i = 0; i < adapter->num_tx_queues; i++)210 vmxnet3_tq_start(&adapter->tx_queue[i],211 adapter);212 }213 } else {214 netdev_info(adapter->netdev, "NIC Link is Down\n");215 netif_carrier_off(adapter->netdev);216 217 if (affectTxQueue) {218 for (i = 0; i < adapter->num_tx_queues; i++)219 vmxnet3_tq_stop(&adapter->tx_queue[i], adapter);220 }221 }222}223 224static void225vmxnet3_process_events(struct vmxnet3_adapter *adapter)226{227 int i;228 unsigned long flags;229 u32 events = le32_to_cpu(adapter->shared->ecr);230 if (!events)231 return;232 233 vmxnet3_ack_events(adapter, events);234 235 /* Check if link state has changed */236 if (events & VMXNET3_ECR_LINK)237 vmxnet3_check_link(adapter, true);238 239 /* Check if there is an error on xmit/recv queues */240 if (events & (VMXNET3_ECR_TQERR | VMXNET3_ECR_RQERR)) {241 spin_lock_irqsave(&adapter->cmd_lock, flags);242 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,243 VMXNET3_CMD_GET_QUEUE_STATUS);244 spin_unlock_irqrestore(&adapter->cmd_lock, flags);245 246 for (i = 0; i < adapter->num_tx_queues; i++)247 if (adapter->tqd_start[i].status.stopped)248 dev_err(&adapter->netdev->dev,249 "%s: tq[%d] error 0x%x\n",250 adapter->netdev->name, i, le32_to_cpu(251 adapter->tqd_start[i].status.error));252 for (i = 0; i < adapter->num_rx_queues; i++)253 if (adapter->rqd_start[i].status.stopped)254 dev_err(&adapter->netdev->dev,255 "%s: rq[%d] error 0x%x\n",256 adapter->netdev->name, i,257 adapter->rqd_start[i].status.error);258 259 schedule_work(&adapter->work);260 }261}262 263#ifdef __BIG_ENDIAN_BITFIELD264/*265 * The device expects the bitfields in shared structures to be written in266 * little endian. When CPU is big endian, the following routines are used to267 * correctly read and write into ABI.268 * The general technique used here is : double word bitfields are defined in269 * opposite order for big endian architecture. Then before reading them in270 * driver the complete double word is translated using le32_to_cpu. Similarly271 * After the driver writes into bitfields, cpu_to_le32 is used to translate the272 * double words into required format.273 * In order to avoid touching bits in shared structure more than once, temporary274 * descriptors are used. These are passed as srcDesc to following functions.275 */276static void vmxnet3_RxDescToCPU(const struct Vmxnet3_RxDesc *srcDesc,277 struct Vmxnet3_RxDesc *dstDesc)278{279 u32 *src = (u32 *)srcDesc + 2;280 u32 *dst = (u32 *)dstDesc + 2;281 dstDesc->addr = le64_to_cpu(srcDesc->addr);282 *dst = le32_to_cpu(*src);283 dstDesc->ext1 = le32_to_cpu(srcDesc->ext1);284}285 286static void vmxnet3_TxDescToLe(const struct Vmxnet3_TxDesc *srcDesc,287 struct Vmxnet3_TxDesc *dstDesc)288{289 int i;290 u32 *src = (u32 *)(srcDesc + 1);291 u32 *dst = (u32 *)(dstDesc + 1);292 293 /* Working backwards so that the gen bit is set at the end. */294 for (i = 2; i > 0; i--) {295 src--;296 dst--;297 *dst = cpu_to_le32(*src);298 }299}300 301 302static void vmxnet3_RxCompToCPU(const struct Vmxnet3_RxCompDesc *srcDesc,303 struct Vmxnet3_RxCompDesc *dstDesc)304{305 int i = 0;306 u32 *src = (u32 *)srcDesc;307 u32 *dst = (u32 *)dstDesc;308 for (i = 0; i < sizeof(struct Vmxnet3_RxCompDesc) / sizeof(u32); i++) {309 *dst = le32_to_cpu(*src);310 src++;311 dst++;312 }313}314 315 316/* Used to read bitfield values from double words. */317static u32 get_bitfield32(const __le32 *bitfield, u32 pos, u32 size)318{319 u32 temp = le32_to_cpu(*bitfield);320 u32 mask = ((1 << size) - 1) << pos;321 temp &= mask;322 temp >>= pos;323 return temp;324}325 326 327 328#endif /* __BIG_ENDIAN_BITFIELD */329 330#ifdef __BIG_ENDIAN_BITFIELD331 332# define VMXNET3_TXDESC_GET_GEN(txdesc) get_bitfield32(((const __le32 *) \333 txdesc) + VMXNET3_TXD_GEN_DWORD_SHIFT, \334 VMXNET3_TXD_GEN_SHIFT, VMXNET3_TXD_GEN_SIZE)335# define VMXNET3_TXDESC_GET_EOP(txdesc) get_bitfield32(((const __le32 *) \336 txdesc) + VMXNET3_TXD_EOP_DWORD_SHIFT, \337 VMXNET3_TXD_EOP_SHIFT, VMXNET3_TXD_EOP_SIZE)338# define VMXNET3_TCD_GET_GEN(tcd) get_bitfield32(((const __le32 *)tcd) + \339 VMXNET3_TCD_GEN_DWORD_SHIFT, VMXNET3_TCD_GEN_SHIFT, \340 VMXNET3_TCD_GEN_SIZE)341# define VMXNET3_TCD_GET_TXIDX(tcd) get_bitfield32((const __le32 *)tcd, \342 VMXNET3_TCD_TXIDX_SHIFT, VMXNET3_TCD_TXIDX_SIZE)343# define vmxnet3_getRxComp(dstrcd, rcd, tmp) do { \344 (dstrcd) = (tmp); \345 vmxnet3_RxCompToCPU((rcd), (tmp)); \346 } while (0)347# define vmxnet3_getRxDesc(dstrxd, rxd, tmp) do { \348 (dstrxd) = (tmp); \349 vmxnet3_RxDescToCPU((rxd), (tmp)); \350 } while (0)351 352#else353 354# define VMXNET3_TXDESC_GET_GEN(txdesc) ((txdesc)->gen)355# define VMXNET3_TXDESC_GET_EOP(txdesc) ((txdesc)->eop)356# define VMXNET3_TCD_GET_GEN(tcd) ((tcd)->gen)357# define VMXNET3_TCD_GET_TXIDX(tcd) ((tcd)->txdIdx)358# define vmxnet3_getRxComp(dstrcd, rcd, tmp) (dstrcd) = (rcd)359# define vmxnet3_getRxDesc(dstrxd, rxd, tmp) (dstrxd) = (rxd)360 361#endif /* __BIG_ENDIAN_BITFIELD */362 363 364static void365vmxnet3_unmap_tx_buf(struct vmxnet3_tx_buf_info *tbi,366 struct pci_dev *pdev)367{368 u32 map_type = tbi->map_type;369 370 if (map_type & VMXNET3_MAP_SINGLE)371 dma_unmap_single(&pdev->dev, tbi->dma_addr, tbi->len,372 DMA_TO_DEVICE);373 else if (map_type & VMXNET3_MAP_PAGE)374 dma_unmap_page(&pdev->dev, tbi->dma_addr, tbi->len,375 DMA_TO_DEVICE);376 else377 BUG_ON(map_type & ~VMXNET3_MAP_XDP);378 379 tbi->map_type = VMXNET3_MAP_NONE; /* to help debugging */380}381 382 383static int384vmxnet3_unmap_pkt(u32 eop_idx, struct vmxnet3_tx_queue *tq,385 struct pci_dev *pdev, struct vmxnet3_adapter *adapter,386 struct xdp_frame_bulk *bq)387{388 struct vmxnet3_tx_buf_info *tbi;389 int entries = 0;390 u32 map_type;391 392 /* no out of order completion */393 BUG_ON(tq->buf_info[eop_idx].sop_idx != tq->tx_ring.next2comp);394 BUG_ON(VMXNET3_TXDESC_GET_EOP(&(tq->tx_ring.base[eop_idx].txd)) != 1);395 396 tbi = &tq->buf_info[eop_idx];397 BUG_ON(!tbi->skb);398 map_type = tbi->map_type;399 VMXNET3_INC_RING_IDX_ONLY(eop_idx, tq->tx_ring.size);400 401 while (tq->tx_ring.next2comp != eop_idx) {402 vmxnet3_unmap_tx_buf(tq->buf_info + tq->tx_ring.next2comp,403 pdev);404 405 /* update next2comp w/o tx_lock. Since we are marking more,406 * instead of less, tx ring entries avail, the worst case is407 * that the tx routine incorrectly re-queues a pkt due to408 * insufficient tx ring entries.409 */410 vmxnet3_cmd_ring_adv_next2comp(&tq->tx_ring);411 entries++;412 }413 414 if (map_type & VMXNET3_MAP_XDP)415 xdp_return_frame_bulk(tbi->xdpf, bq);416 else417 dev_kfree_skb_any(tbi->skb);418 419 /* xdpf and skb are in an anonymous union. */420 tbi->skb = NULL;421 422 return entries;423}424 425 426static int427vmxnet3_tq_tx_complete(struct vmxnet3_tx_queue *tq,428 struct vmxnet3_adapter *adapter)429{430 union Vmxnet3_GenericDesc *gdesc;431 struct xdp_frame_bulk bq;432 int completed = 0;433 434 xdp_frame_bulk_init(&bq);435 rcu_read_lock();436 437 gdesc = tq->comp_ring.base + tq->comp_ring.next2proc;438 while (VMXNET3_TCD_GET_GEN(&gdesc->tcd) == tq->comp_ring.gen) {439 /* Prevent any &gdesc->tcd field from being (speculatively)440 * read before (&gdesc->tcd)->gen is read.441 */442 dma_rmb();443 444 completed += vmxnet3_unmap_pkt(VMXNET3_TCD_GET_TXIDX(445 &gdesc->tcd), tq, adapter->pdev,446 adapter, &bq);447 448 vmxnet3_comp_ring_adv_next2proc(&tq->comp_ring);449 gdesc = tq->comp_ring.base + tq->comp_ring.next2proc;450 }451 xdp_flush_frame_bulk(&bq);452 rcu_read_unlock();453 454 if (completed) {455 spin_lock(&tq->tx_lock);456 if (unlikely(vmxnet3_tq_stopped(tq, adapter) &&457 vmxnet3_cmd_ring_desc_avail(&tq->tx_ring) >458 VMXNET3_WAKE_QUEUE_THRESHOLD(tq) &&459 netif_carrier_ok(adapter->netdev))) {460 vmxnet3_tq_wake(tq, adapter);461 }462 spin_unlock(&tq->tx_lock);463 }464 return completed;465}466 467 468static void469vmxnet3_tq_cleanup(struct vmxnet3_tx_queue *tq,470 struct vmxnet3_adapter *adapter)471{472 struct xdp_frame_bulk bq;473 u32 map_type;474 int i;475 476 xdp_frame_bulk_init(&bq);477 rcu_read_lock();478 479 while (tq->tx_ring.next2comp != tq->tx_ring.next2fill) {480 struct vmxnet3_tx_buf_info *tbi;481 482 tbi = tq->buf_info + tq->tx_ring.next2comp;483 map_type = tbi->map_type;484 485 vmxnet3_unmap_tx_buf(tbi, adapter->pdev);486 if (tbi->skb) {487 if (map_type & VMXNET3_MAP_XDP)488 xdp_return_frame_bulk(tbi->xdpf, &bq);489 else490 dev_kfree_skb_any(tbi->skb);491 tbi->skb = NULL;492 }493 vmxnet3_cmd_ring_adv_next2comp(&tq->tx_ring);494 }495 496 xdp_flush_frame_bulk(&bq);497 rcu_read_unlock();498 499 /* sanity check, verify all buffers are indeed unmapped */500 for (i = 0; i < tq->tx_ring.size; i++)501 BUG_ON(tq->buf_info[i].map_type != VMXNET3_MAP_NONE);502 503 tq->tx_ring.gen = VMXNET3_INIT_GEN;504 tq->tx_ring.next2fill = tq->tx_ring.next2comp = 0;505 506 tq->comp_ring.gen = VMXNET3_INIT_GEN;507 tq->comp_ring.next2proc = 0;508}509 510 511static void512vmxnet3_tq_destroy(struct vmxnet3_tx_queue *tq,513 struct vmxnet3_adapter *adapter)514{515 if (tq->tx_ring.base) {516 dma_free_coherent(&adapter->pdev->dev, tq->tx_ring.size *517 sizeof(struct Vmxnet3_TxDesc),518 tq->tx_ring.base, tq->tx_ring.basePA);519 tq->tx_ring.base = NULL;520 }521 if (tq->data_ring.base) {522 dma_free_coherent(&adapter->pdev->dev,523 tq->data_ring.size * tq->txdata_desc_size,524 tq->data_ring.base, tq->data_ring.basePA);525 tq->data_ring.base = NULL;526 }527 if (tq->ts_ring.base) {528 dma_free_coherent(&adapter->pdev->dev,529 tq->tx_ring.size * tq->tx_ts_desc_size,530 tq->ts_ring.base, tq->ts_ring.basePA);531 tq->ts_ring.base = NULL;532 }533 if (tq->comp_ring.base) {534 dma_free_coherent(&adapter->pdev->dev, tq->comp_ring.size *535 sizeof(struct Vmxnet3_TxCompDesc),536 tq->comp_ring.base, tq->comp_ring.basePA);537 tq->comp_ring.base = NULL;538 }539 kfree(tq->buf_info);540 tq->buf_info = NULL;541}542 543 544/* Destroy all tx queues */545void546vmxnet3_tq_destroy_all(struct vmxnet3_adapter *adapter)547{548 int i;549 550 for (i = 0; i < adapter->num_tx_queues; i++)551 vmxnet3_tq_destroy(&adapter->tx_queue[i], adapter);552}553 554 555static void556vmxnet3_tq_init(struct vmxnet3_tx_queue *tq,557 struct vmxnet3_adapter *adapter)558{559 int i;560 561 /* reset the tx ring contents to 0 and reset the tx ring states */562 memset(tq->tx_ring.base, 0, tq->tx_ring.size *563 sizeof(struct Vmxnet3_TxDesc));564 tq->tx_ring.next2fill = tq->tx_ring.next2comp = 0;565 tq->tx_ring.gen = VMXNET3_INIT_GEN;566 567 memset(tq->data_ring.base, 0,568 tq->data_ring.size * tq->txdata_desc_size);569 570 if (tq->ts_ring.base)571 memset(tq->ts_ring.base, 0,572 tq->tx_ring.size * tq->tx_ts_desc_size);573 574 /* reset the tx comp ring contents to 0 and reset comp ring states */575 memset(tq->comp_ring.base, 0, tq->comp_ring.size *576 sizeof(struct Vmxnet3_TxCompDesc));577 tq->comp_ring.next2proc = 0;578 tq->comp_ring.gen = VMXNET3_INIT_GEN;579 580 /* reset the bookkeeping data */581 memset(tq->buf_info, 0, sizeof(tq->buf_info[0]) * tq->tx_ring.size);582 for (i = 0; i < tq->tx_ring.size; i++)583 tq->buf_info[i].map_type = VMXNET3_MAP_NONE;584 585 /* stats are not reset */586}587 588 589static int590vmxnet3_tq_create(struct vmxnet3_tx_queue *tq,591 struct vmxnet3_adapter *adapter)592{593 BUG_ON(tq->tx_ring.base || tq->data_ring.base ||594 tq->comp_ring.base || tq->buf_info);595 596 tq->tx_ring.base = dma_alloc_coherent(&adapter->pdev->dev,597 tq->tx_ring.size * sizeof(struct Vmxnet3_TxDesc),598 &tq->tx_ring.basePA, GFP_KERNEL);599 if (!tq->tx_ring.base) {600 netdev_err(adapter->netdev, "failed to allocate tx ring\n");601 goto err;602 }603 604 tq->data_ring.base = dma_alloc_coherent(&adapter->pdev->dev,605 tq->data_ring.size * tq->txdata_desc_size,606 &tq->data_ring.basePA, GFP_KERNEL);607 if (!tq->data_ring.base) {608 netdev_err(adapter->netdev, "failed to allocate tx data ring\n");609 goto err;610 }611 612 if (tq->tx_ts_desc_size != 0) {613 tq->ts_ring.base = dma_alloc_coherent(&adapter->pdev->dev,614 tq->tx_ring.size * tq->tx_ts_desc_size,615 &tq->ts_ring.basePA, GFP_KERNEL);616 if (!tq->ts_ring.base) {617 netdev_err(adapter->netdev, "failed to allocate tx ts ring\n");618 tq->tx_ts_desc_size = 0;619 }620 } else {621 tq->ts_ring.base = NULL;622 }623 624 tq->comp_ring.base = dma_alloc_coherent(&adapter->pdev->dev,625 tq->comp_ring.size * sizeof(struct Vmxnet3_TxCompDesc),626 &tq->comp_ring.basePA, GFP_KERNEL);627 if (!tq->comp_ring.base) {628 netdev_err(adapter->netdev, "failed to allocate tx comp ring\n");629 goto err;630 }631 632 tq->buf_info = kcalloc_node(tq->tx_ring.size, sizeof(tq->buf_info[0]),633 GFP_KERNEL,634 dev_to_node(&adapter->pdev->dev));635 if (!tq->buf_info)636 goto err;637 638 return 0;639 640err:641 vmxnet3_tq_destroy(tq, adapter);642 return -ENOMEM;643}644 645static void646vmxnet3_tq_cleanup_all(struct vmxnet3_adapter *adapter)647{648 int i;649 650 for (i = 0; i < adapter->num_tx_queues; i++)651 vmxnet3_tq_cleanup(&adapter->tx_queue[i], adapter);652}653 654/*655 * starting from ring->next2fill, allocate rx buffers for the given ring656 * of the rx queue and update the rx desc. stop after @num_to_alloc buffers657 * are allocated or allocation fails658 */659 660static int661vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx,662 int num_to_alloc, struct vmxnet3_adapter *adapter)663{664 int num_allocated = 0;665 struct vmxnet3_rx_buf_info *rbi_base = rq->buf_info[ring_idx];666 struct vmxnet3_cmd_ring *ring = &rq->rx_ring[ring_idx];667 u32 val;668 669 while (num_allocated <= num_to_alloc) {670 struct vmxnet3_rx_buf_info *rbi;671 union Vmxnet3_GenericDesc *gd;672 673 rbi = rbi_base + ring->next2fill;674 gd = ring->base + ring->next2fill;675 rbi->comp_state = VMXNET3_RXD_COMP_PENDING;676 677 if (rbi->buf_type == VMXNET3_RX_BUF_XDP) {678 void *data = vmxnet3_pp_get_buff(rq->page_pool,679 &rbi->dma_addr,680 GFP_KERNEL);681 if (!data) {682 rq->stats.rx_buf_alloc_failure++;683 break;684 }685 rbi->page = virt_to_page(data);686 val = VMXNET3_RXD_BTYPE_HEAD << VMXNET3_RXD_BTYPE_SHIFT;687 } else if (rbi->buf_type == VMXNET3_RX_BUF_SKB) {688 if (rbi->skb == NULL) {689 rbi->skb = __netdev_alloc_skb_ip_align(adapter->netdev,690 rbi->len,691 GFP_KERNEL);692 if (unlikely(rbi->skb == NULL)) {693 rq->stats.rx_buf_alloc_failure++;694 break;695 }696 697 rbi->dma_addr = dma_map_single(698 &adapter->pdev->dev,699 rbi->skb->data, rbi->len,700 DMA_FROM_DEVICE);701 if (dma_mapping_error(&adapter->pdev->dev,702 rbi->dma_addr)) {703 dev_kfree_skb_any(rbi->skb);704 rbi->skb = NULL;705 rq->stats.rx_buf_alloc_failure++;706 break;707 }708 } else {709 /* rx buffer skipped by the device */710 }711 val = VMXNET3_RXD_BTYPE_HEAD << VMXNET3_RXD_BTYPE_SHIFT;712 } else {713 BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_PAGE ||714 rbi->len != PAGE_SIZE);715 716 if (rbi->page == NULL) {717 rbi->page = alloc_page(GFP_ATOMIC);718 if (unlikely(rbi->page == NULL)) {719 rq->stats.rx_buf_alloc_failure++;720 break;721 }722 rbi->dma_addr = dma_map_page(723 &adapter->pdev->dev,724 rbi->page, 0, PAGE_SIZE,725 DMA_FROM_DEVICE);726 if (dma_mapping_error(&adapter->pdev->dev,727 rbi->dma_addr)) {728 put_page(rbi->page);729 rbi->page = NULL;730 rq->stats.rx_buf_alloc_failure++;731 break;732 }733 } else {734 /* rx buffers skipped by the device */735 }736 val = VMXNET3_RXD_BTYPE_BODY << VMXNET3_RXD_BTYPE_SHIFT;737 }738 739 gd->rxd.addr = cpu_to_le64(rbi->dma_addr);740 gd->dword[2] = cpu_to_le32((!ring->gen << VMXNET3_RXD_GEN_SHIFT)741 | val | rbi->len);742 743 /* Fill the last buffer but dont mark it ready, or else the744 * device will think that the queue is full */745 if (num_allocated == num_to_alloc) {746 rbi->comp_state = VMXNET3_RXD_COMP_DONE;747 break;748 }749 750 gd->dword[2] |= cpu_to_le32(ring->gen << VMXNET3_RXD_GEN_SHIFT);751 num_allocated++;752 vmxnet3_cmd_ring_adv_next2fill(ring);753 }754 755 netdev_dbg(adapter->netdev,756 "alloc_rx_buf: %d allocated, next2fill %u, next2comp %u\n",757 num_allocated, ring->next2fill, ring->next2comp);758 759 /* so that the device can distinguish a full ring and an empty ring */760 BUG_ON(num_allocated != 0 && ring->next2fill == ring->next2comp);761 762 return num_allocated;763}764 765 766static void767vmxnet3_append_frag(struct sk_buff *skb, struct Vmxnet3_RxCompDesc *rcd,768 struct vmxnet3_rx_buf_info *rbi)769{770 skb_frag_t *frag = skb_shinfo(skb)->frags + skb_shinfo(skb)->nr_frags;771 772 BUG_ON(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS);773 774 skb_frag_fill_page_desc(frag, rbi->page, 0, rcd->len);775 skb->data_len += rcd->len;776 skb->truesize += PAGE_SIZE;777 skb_shinfo(skb)->nr_frags++;778}779 780 781static int782vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx,783 struct vmxnet3_tx_queue *tq, struct pci_dev *pdev,784 struct vmxnet3_adapter *adapter)785{786 u32 dw2, len;787 unsigned long buf_offset;788 int i;789 union Vmxnet3_GenericDesc *gdesc;790 struct vmxnet3_tx_buf_info *tbi = NULL;791 792 BUG_ON(ctx->copy_size > skb_headlen(skb));793 794 /* use the previous gen bit for the SOP desc */795 dw2 = (tq->tx_ring.gen ^ 0x1) << VMXNET3_TXD_GEN_SHIFT;796 797 ctx->sop_txd = tq->tx_ring.base + tq->tx_ring.next2fill;798 gdesc = ctx->sop_txd; /* both loops below can be skipped */799 800 /* no need to map the buffer if headers are copied */801 if (ctx->copy_size) {802 ctx->sop_txd->txd.addr = cpu_to_le64(tq->data_ring.basePA +803 tq->tx_ring.next2fill *804 tq->txdata_desc_size);805 ctx->sop_txd->dword[2] = cpu_to_le32(dw2 | ctx->copy_size);806 ctx->sop_txd->dword[3] = 0;807 808 tbi = tq->buf_info + tq->tx_ring.next2fill;809 tbi->map_type = VMXNET3_MAP_NONE;810 811 netdev_dbg(adapter->netdev,812 "txd[%u]: 0x%Lx 0x%x 0x%x\n",813 tq->tx_ring.next2fill,814 le64_to_cpu(ctx->sop_txd->txd.addr),815 ctx->sop_txd->dword[2], ctx->sop_txd->dword[3]);816 vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring);817 818 /* use the right gen for non-SOP desc */819 dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT;820 }821 822 /* linear part can use multiple tx desc if it's big */823 len = skb_headlen(skb) - ctx->copy_size;824 buf_offset = ctx->copy_size;825 while (len) {826 u32 buf_size;827 828 if (len < VMXNET3_MAX_TX_BUF_SIZE) {829 buf_size = len;830 dw2 |= len;831 } else {832 buf_size = VMXNET3_MAX_TX_BUF_SIZE;833 /* spec says that for TxDesc.len, 0 == 2^14 */834 }835 836 tbi = tq->buf_info + tq->tx_ring.next2fill;837 tbi->map_type = VMXNET3_MAP_SINGLE;838 tbi->dma_addr = dma_map_single(&adapter->pdev->dev,839 skb->data + buf_offset, buf_size,840 DMA_TO_DEVICE);841 if (dma_mapping_error(&adapter->pdev->dev, tbi->dma_addr))842 return -EFAULT;843 844 tbi->len = buf_size;845 846 gdesc = tq->tx_ring.base + tq->tx_ring.next2fill;847 BUG_ON(gdesc->txd.gen == tq->tx_ring.gen);848 849 gdesc->txd.addr = cpu_to_le64(tbi->dma_addr);850 gdesc->dword[2] = cpu_to_le32(dw2);851 gdesc->dword[3] = 0;852 853 netdev_dbg(adapter->netdev,854 "txd[%u]: 0x%Lx 0x%x 0x%x\n",855 tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr),856 le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]);857 vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring);858 dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT;859 860 len -= buf_size;861 buf_offset += buf_size;862 }863 864 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {865 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];866 u32 buf_size;867 868 buf_offset = 0;869 len = skb_frag_size(frag);870 while (len) {871 tbi = tq->buf_info + tq->tx_ring.next2fill;872 if (len < VMXNET3_MAX_TX_BUF_SIZE) {873 buf_size = len;874 dw2 |= len;875 } else {876 buf_size = VMXNET3_MAX_TX_BUF_SIZE;877 /* spec says that for TxDesc.len, 0 == 2^14 */878 }879 tbi->map_type = VMXNET3_MAP_PAGE;880 tbi->dma_addr = skb_frag_dma_map(&adapter->pdev->dev, frag,881 buf_offset, buf_size,882 DMA_TO_DEVICE);883 if (dma_mapping_error(&adapter->pdev->dev, tbi->dma_addr))884 return -EFAULT;885 886 tbi->len = buf_size;887 888 gdesc = tq->tx_ring.base + tq->tx_ring.next2fill;889 BUG_ON(gdesc->txd.gen == tq->tx_ring.gen);890 891 gdesc->txd.addr = cpu_to_le64(tbi->dma_addr);892 gdesc->dword[2] = cpu_to_le32(dw2);893 gdesc->dword[3] = 0;894 895 netdev_dbg(adapter->netdev,896 "txd[%u]: 0x%llx %u %u\n",897 tq->tx_ring.next2fill, le64_to_cpu(gdesc->txd.addr),898 le32_to_cpu(gdesc->dword[2]), gdesc->dword[3]);899 vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring);900 dw2 = tq->tx_ring.gen << VMXNET3_TXD_GEN_SHIFT;901 902 len -= buf_size;903 buf_offset += buf_size;904 }905 }906 907 ctx->eop_txd = gdesc;908 909 /* set the last buf_info for the pkt */910 tbi->skb = skb;911 tbi->sop_idx = ctx->sop_txd - tq->tx_ring.base;912 if (tq->tx_ts_desc_size != 0) {913 ctx->ts_txd = (struct Vmxnet3_TxTSDesc *)((u8 *)tq->ts_ring.base +914 tbi->sop_idx * tq->tx_ts_desc_size);915 ctx->ts_txd->ts.tsi = 0;916 }917 918 return 0;919}920 921 922/* Init all tx queues */923static void924vmxnet3_tq_init_all(struct vmxnet3_adapter *adapter)925{926 int i;927 928 for (i = 0; i < adapter->num_tx_queues; i++)929 vmxnet3_tq_init(&adapter->tx_queue[i], adapter);930}931 932 933/*934 * parse relevant protocol headers:935 * For a tso pkt, relevant headers are L2/3/4 including options936 * For a pkt requesting csum offloading, they are L2/3 and may include L4937 * if it's a TCP/UDP pkt938 *939 * Returns:940 * -1: error happens during parsing941 * 0: protocol headers parsed, but too big to be copied942 * 1: protocol headers parsed and copied943 *944 * Other effects:945 * 1. related *ctx fields are updated.946 * 2. ctx->copy_size is # of bytes copied947 * 3. the portion to be copied is guaranteed to be in the linear part948 *949 */950static int951vmxnet3_parse_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,952 struct vmxnet3_tx_ctx *ctx,953 struct vmxnet3_adapter *adapter)954{955 u8 protocol = 0;956 957 if (ctx->mss) { /* TSO */958 if (VMXNET3_VERSION_GE_4(adapter) && skb->encapsulation) {959 ctx->l4_offset = skb_inner_transport_offset(skb);960 ctx->l4_hdr_size = inner_tcp_hdrlen(skb);961 ctx->copy_size = ctx->l4_offset + ctx->l4_hdr_size;962 } else {963 ctx->l4_offset = skb_transport_offset(skb);964 ctx->l4_hdr_size = tcp_hdrlen(skb);965 ctx->copy_size = ctx->l4_offset + ctx->l4_hdr_size;966 }967 } else {968 if (skb->ip_summed == CHECKSUM_PARTIAL) {969 /* For encap packets, skb_checksum_start_offset refers970 * to inner L4 offset. Thus, below works for encap as971 * well as non-encap case972 */973 ctx->l4_offset = skb_checksum_start_offset(skb);974 975 if (VMXNET3_VERSION_GE_4(adapter) &&976 skb->encapsulation) {977 struct iphdr *iph = inner_ip_hdr(skb);978 979 if (iph->version == 4) {980 protocol = iph->protocol;981 } else {982 const struct ipv6hdr *ipv6h;983 984 ipv6h = inner_ipv6_hdr(skb);985 protocol = ipv6h->nexthdr;986 }987 } else {988 if (ctx->ipv4) {989 const struct iphdr *iph = ip_hdr(skb);990 991 protocol = iph->protocol;992 } else if (ctx->ipv6) {993 const struct ipv6hdr *ipv6h;994 995 ipv6h = ipv6_hdr(skb);996 protocol = ipv6h->nexthdr;997 }998 }999 1000 switch (protocol) {1001 case IPPROTO_TCP:1002 ctx->l4_hdr_size = skb->encapsulation ? inner_tcp_hdrlen(skb) :1003 tcp_hdrlen(skb);1004 break;1005 case IPPROTO_UDP:1006 ctx->l4_hdr_size = sizeof(struct udphdr);1007 break;1008 default:1009 ctx->l4_hdr_size = 0;1010 break;1011 }1012 1013 ctx->copy_size = min(ctx->l4_offset +1014 ctx->l4_hdr_size, skb->len);1015 } else {1016 ctx->l4_offset = 0;1017 ctx->l4_hdr_size = 0;1018 /* copy as much as allowed */1019 ctx->copy_size = min_t(unsigned int,1020 tq->txdata_desc_size,1021 skb_headlen(skb));1022 }1023 1024 if (skb->len <= tq->txdata_desc_size)1025 ctx->copy_size = skb->len;1026 1027 /* make sure headers are accessible directly */1028 if (unlikely(!pskb_may_pull(skb, ctx->copy_size)))1029 goto err;1030 }1031 1032 if (unlikely(ctx->copy_size > tq->txdata_desc_size)) {1033 tq->stats.oversized_hdr++;1034 ctx->copy_size = 0;1035 return 0;1036 }1037 1038 return 1;1039err:1040 return -1;1041}1042 1043/*1044 * copy relevant protocol headers to the transmit ring:1045 * For a tso pkt, relevant headers are L2/3/4 including options1046 * For a pkt requesting csum offloading, they are L2/3 and may include L41047 * if it's a TCP/UDP pkt1048 *1049 *1050 * Note that this requires that vmxnet3_parse_hdr be called first to set the1051 * appropriate bits in ctx first1052 */1053static void1054vmxnet3_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,1055 struct vmxnet3_tx_ctx *ctx,1056 struct vmxnet3_adapter *adapter)1057{1058 struct Vmxnet3_TxDataDesc *tdd;1059 1060 tdd = (struct Vmxnet3_TxDataDesc *)((u8 *)tq->data_ring.base +1061 tq->tx_ring.next2fill *1062 tq->txdata_desc_size);1063 1064 memcpy(tdd->data, skb->data, ctx->copy_size);1065 netdev_dbg(adapter->netdev,1066 "copy %u bytes to dataRing[%u]\n",1067 ctx->copy_size, tq->tx_ring.next2fill);1068}1069 1070 1071static void1072vmxnet3_prepare_inner_tso(struct sk_buff *skb,1073 struct vmxnet3_tx_ctx *ctx)1074{1075 struct tcphdr *tcph = inner_tcp_hdr(skb);1076 struct iphdr *iph = inner_ip_hdr(skb);1077 1078 if (iph->version == 4) {1079 iph->check = 0;1080 tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, 0,1081 IPPROTO_TCP, 0);1082 } else {1083 struct ipv6hdr *iph = inner_ipv6_hdr(skb);1084 1085 tcph->check = ~csum_ipv6_magic(&iph->saddr, &iph->daddr, 0,1086 IPPROTO_TCP, 0);1087 }1088}1089 1090static void1091vmxnet3_prepare_tso(struct sk_buff *skb,1092 struct vmxnet3_tx_ctx *ctx)1093{1094 struct tcphdr *tcph = tcp_hdr(skb);1095 1096 if (ctx->ipv4) {1097 struct iphdr *iph = ip_hdr(skb);1098 1099 iph->check = 0;1100 tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, 0,1101 IPPROTO_TCP, 0);1102 } else if (ctx->ipv6) {1103 tcp_v6_gso_csum_prep(skb);1104 }1105}1106 1107static int txd_estimate(const struct sk_buff *skb)1108{1109 int count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + 1;1110 int i;1111 1112 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {1113 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];1114 1115 count += VMXNET3_TXD_NEEDED(skb_frag_size(frag));1116 }1117 return count;1118}1119 1120/*1121 * Transmits a pkt thru a given tq1122 * Returns:1123 * NETDEV_TX_OK: descriptors are setup successfully1124 * NETDEV_TX_OK: error occurred, the pkt is dropped1125 * NETDEV_TX_BUSY: tx ring is full, queue is stopped1126 *1127 * Side-effects:1128 * 1. tx ring may be changed1129 * 2. tq stats may be updated accordingly1130 * 3. shared->txNumDeferred may be updated1131 */1132 1133static int1134vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq,1135 struct vmxnet3_adapter *adapter, struct net_device *netdev)1136{1137 int ret;1138 u32 count;1139 int num_pkts;1140 int tx_num_deferred;1141 unsigned long flags;1142 struct vmxnet3_tx_ctx ctx;1143 union Vmxnet3_GenericDesc *gdesc;1144#ifdef __BIG_ENDIAN_BITFIELD1145 /* Use temporary descriptor to avoid touching bits multiple times */1146 union Vmxnet3_GenericDesc tempTxDesc;1147#endif1148 1149 count = txd_estimate(skb);1150 1151 ctx.ipv4 = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_IP));1152 ctx.ipv6 = (vlan_get_protocol(skb) == cpu_to_be16(ETH_P_IPV6));1153 1154 ctx.mss = skb_shinfo(skb)->gso_size;1155 if (ctx.mss) {1156 if (skb_header_cloned(skb)) {1157 if (unlikely(pskb_expand_head(skb, 0, 0,1158 GFP_ATOMIC) != 0)) {1159 tq->stats.drop_tso++;1160 goto drop_pkt;1161 }1162 tq->stats.copy_skb_header++;1163 }1164 if (unlikely(count > VMXNET3_MAX_TSO_TXD_PER_PKT)) {1165 /* tso pkts must not use more than1166 * VMXNET3_MAX_TSO_TXD_PER_PKT entries1167 */1168 if (skb_linearize(skb) != 0) {1169 tq->stats.drop_too_many_frags++;1170 goto drop_pkt;1171 }1172 tq->stats.linearized++;1173 1174 /* recalculate the # of descriptors to use */1175 count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + 1;1176 if (unlikely(count > VMXNET3_MAX_TSO_TXD_PER_PKT)) {1177 tq->stats.drop_too_many_frags++;1178 goto drop_pkt;1179 }1180 }1181 if (skb->encapsulation) {1182 vmxnet3_prepare_inner_tso(skb, &ctx);1183 } else {1184 vmxnet3_prepare_tso(skb, &ctx);1185 }1186 } else {1187 if (unlikely(count > VMXNET3_MAX_TXD_PER_PKT)) {1188 1189 /* non-tso pkts must not use more than1190 * VMXNET3_MAX_TXD_PER_PKT entries1191 */1192 if (skb_linearize(skb) != 0) {1193 tq->stats.drop_too_many_frags++;1194 goto drop_pkt;1195 }1196 tq->stats.linearized++;1197 1198 /* recalculate the # of descriptors to use */1199 count = VMXNET3_TXD_NEEDED(skb_headlen(skb)) + 1;1200 }1201 }1202 1203 ret = vmxnet3_parse_hdr(skb, tq, &ctx, adapter);1204 if (ret >= 0) {1205 BUG_ON(ret <= 0 && ctx.copy_size != 0);1206 /* hdrs parsed, check against other limits */1207 if (ctx.mss) {1208 if (unlikely(ctx.l4_offset + ctx.l4_hdr_size >1209 VMXNET3_MAX_TX_BUF_SIZE)) {1210 tq->stats.drop_oversized_hdr++;1211 goto drop_pkt;1212 }1213 } else {1214 if (skb->ip_summed == CHECKSUM_PARTIAL) {1215 if (unlikely(ctx.l4_offset +1216 skb->csum_offset >1217 VMXNET3_MAX_CSUM_OFFSET)) {1218 tq->stats.drop_oversized_hdr++;1219 goto drop_pkt;1220 }1221 }1222 }1223 } else {1224 tq->stats.drop_hdr_inspect_err++;1225 goto drop_pkt;1226 }1227 1228 spin_lock_irqsave(&tq->tx_lock, flags);1229 1230 if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) {1231 tq->stats.tx_ring_full++;1232 netdev_dbg(adapter->netdev,1233 "tx queue stopped on %s, next2comp %u"1234 " next2fill %u\n", adapter->netdev->name,1235 tq->tx_ring.next2comp, tq->tx_ring.next2fill);1236 1237 vmxnet3_tq_stop(tq, adapter);1238 spin_unlock_irqrestore(&tq->tx_lock, flags);1239 return NETDEV_TX_BUSY;1240 }1241 1242 1243 vmxnet3_copy_hdr(skb, tq, &ctx, adapter);1244 1245 /* fill tx descs related to addr & len */1246 if (vmxnet3_map_pkt(skb, &ctx, tq, adapter->pdev, adapter))1247 goto unlock_drop_pkt;1248 1249 /* setup the EOP desc */1250 ctx.eop_txd->dword[3] = cpu_to_le32(VMXNET3_TXD_CQ | VMXNET3_TXD_EOP);1251 1252 /* setup the SOP desc */1253#ifdef __BIG_ENDIAN_BITFIELD1254 gdesc = &tempTxDesc;1255 gdesc->dword[2] = ctx.sop_txd->dword[2];1256 gdesc->dword[3] = ctx.sop_txd->dword[3];1257#else1258 gdesc = ctx.sop_txd;1259#endif1260 tx_num_deferred = le32_to_cpu(tq->shared->txNumDeferred);1261 if (ctx.mss) {1262 if (VMXNET3_VERSION_GE_4(adapter) && skb->encapsulation) {1263 gdesc->txd.hlen = ctx.l4_offset + ctx.l4_hdr_size;1264 if (VMXNET3_VERSION_GE_7(adapter)) {1265 gdesc->txd.om = VMXNET3_OM_TSO;1266 gdesc->txd.ext1 = 1;1267 } else {1268 gdesc->txd.om = VMXNET3_OM_ENCAP;1269 }1270 gdesc->txd.msscof = ctx.mss;1271 1272 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL_CSUM)1273 gdesc->txd.oco = 1;1274 } else {1275 gdesc->txd.hlen = ctx.l4_offset + ctx.l4_hdr_size;1276 gdesc->txd.om = VMXNET3_OM_TSO;1277 gdesc->txd.msscof = ctx.mss;1278 }1279 num_pkts = (skb->len - gdesc->txd.hlen + ctx.mss - 1) / ctx.mss;1280 } else {1281 if (skb->ip_summed == CHECKSUM_PARTIAL) {1282 if (VMXNET3_VERSION_GE_4(adapter) &&1283 skb->encapsulation) {1284 gdesc->txd.hlen = ctx.l4_offset +1285 ctx.l4_hdr_size;1286 if (VMXNET3_VERSION_GE_7(adapter)) {1287 gdesc->txd.om = VMXNET3_OM_CSUM;1288 gdesc->txd.msscof = ctx.l4_offset +1289 skb->csum_offset;1290 gdesc->txd.ext1 = 1;1291 } else {1292 gdesc->txd.om = VMXNET3_OM_ENCAP;1293 gdesc->txd.msscof = 0; /* Reserved */1294 }1295 } else {1296 gdesc->txd.hlen = ctx.l4_offset;1297 gdesc->txd.om = VMXNET3_OM_CSUM;1298 gdesc->txd.msscof = ctx.l4_offset +1299 skb->csum_offset;1300 }1301 } else {1302 gdesc->txd.om = 0;1303 gdesc->txd.msscof = 0;1304 }1305 num_pkts = 1;1306 }1307 le32_add_cpu(&tq->shared->txNumDeferred, num_pkts);1308 tx_num_deferred += num_pkts;1309 1310 if (skb_vlan_tag_present(skb)) {1311 gdesc->txd.ti = 1;1312 gdesc->txd.tci = skb_vlan_tag_get(skb);1313 }1314 1315 if (tq->tx_ts_desc_size != 0 &&1316 adapter->latencyConf->sampleRate != 0) {1317 if (vmxnet3_apply_timestamp(tq, adapter->latencyConf->sampleRate)) {1318 ctx.ts_txd->ts.tsData = vmxnet3_get_cycles(VMXNET3_PMC_PSEUDO_TSC);1319 ctx.ts_txd->ts.tsi = 1;1320 }1321 }1322 1323 /* Ensure that the write to (&gdesc->txd)->gen will be observed after1324 * all other writes to &gdesc->txd.1325 */1326 dma_wmb();1327 1328 /* finally flips the GEN bit of the SOP desc. */1329 gdesc->dword[2] = cpu_to_le32(le32_to_cpu(gdesc->dword[2]) ^1330 VMXNET3_TXD_GEN);1331#ifdef __BIG_ENDIAN_BITFIELD1332 /* Finished updating in bitfields of Tx Desc, so write them in original1333 * place.1334 */1335 vmxnet3_TxDescToLe((struct Vmxnet3_TxDesc *)gdesc,1336 (struct Vmxnet3_TxDesc *)ctx.sop_txd);1337 gdesc = ctx.sop_txd;1338#endif1339 netdev_dbg(adapter->netdev,1340 "txd[%u]: SOP 0x%Lx 0x%x 0x%x\n",1341 (u32)(ctx.sop_txd -1342 tq->tx_ring.base), le64_to_cpu(gdesc->txd.addr),1343 le32_to_cpu(gdesc->dword[2]), le32_to_cpu(gdesc->dword[3]));1344 1345 spin_unlock_irqrestore(&tq->tx_lock, flags);1346 1347 if (tx_num_deferred >= le32_to_cpu(tq->shared->txThreshold)) {1348 tq->shared->txNumDeferred = 0;1349 VMXNET3_WRITE_BAR0_REG(adapter,1350 adapter->tx_prod_offset + tq->qid * 8,1351 tq->tx_ring.next2fill);1352 }1353 1354 return NETDEV_TX_OK;1355 1356unlock_drop_pkt:1357 spin_unlock_irqrestore(&tq->tx_lock, flags);1358drop_pkt:1359 tq->stats.drop_total++;1360 dev_kfree_skb_any(skb);1361 return NETDEV_TX_OK;1362}1363 1364static int1365vmxnet3_create_pp(struct vmxnet3_adapter *adapter,1366 struct vmxnet3_rx_queue *rq, int size)1367{1368 bool xdp_prog = vmxnet3_xdp_enabled(adapter);1369 const struct page_pool_params pp_params = {1370 .order = 0,1371 .flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV,1372 .pool_size = size,1373 .nid = NUMA_NO_NODE,1374 .dev = &adapter->pdev->dev,1375 .offset = VMXNET3_XDP_RX_OFFSET,1376 .max_len = VMXNET3_XDP_MAX_FRSIZE,1377 .dma_dir = xdp_prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE,1378 };1379 struct page_pool *pp;1380 int err;1381 1382 pp = page_pool_create(&pp_params);1383 if (IS_ERR(pp))1384 return PTR_ERR(pp);1385 1386 err = xdp_rxq_info_reg(&rq->xdp_rxq, adapter->netdev, rq->qid,1387 rq->napi.napi_id);1388 if (err < 0)1389 goto err_free_pp;1390 1391 err = xdp_rxq_info_reg_mem_model(&rq->xdp_rxq, MEM_TYPE_PAGE_POOL, pp);1392 if (err)1393 goto err_unregister_rxq;1394 1395 rq->page_pool = pp;1396 1397 return 0;1398 1399err_unregister_rxq:1400 xdp_rxq_info_unreg(&rq->xdp_rxq);1401err_free_pp:1402 page_pool_destroy(pp);1403 1404 return err;1405}1406 1407void *1408vmxnet3_pp_get_buff(struct page_pool *pp, dma_addr_t *dma_addr,1409 gfp_t gfp_mask)1410{1411 struct page *page;1412 1413 page = page_pool_alloc_pages(pp, gfp_mask | __GFP_NOWARN);1414 if (unlikely(!page))1415 return NULL;1416 1417 *dma_addr = page_pool_get_dma_addr(page) + pp->p.offset;1418 1419 return page_address(page);1420}1421 1422static netdev_tx_t1423vmxnet3_xmit_frame(struct sk_buff *skb, struct net_device *netdev)1424{1425 struct vmxnet3_adapter *adapter = netdev_priv(netdev);1426 1427 BUG_ON(skb->queue_mapping > adapter->num_tx_queues);1428 return vmxnet3_tq_xmit(skb,1429 &adapter->tx_queue[skb->queue_mapping],1430 adapter, netdev);1431}1432 1433 1434static void1435vmxnet3_rx_csum(struct vmxnet3_adapter *adapter,1436 struct sk_buff *skb,1437 union Vmxnet3_GenericDesc *gdesc)1438{1439 if (!gdesc->rcd.cnc && adapter->netdev->features & NETIF_F_RXCSUM) {1440 if (gdesc->rcd.v4 &&1441 (le32_to_cpu(gdesc->dword[3]) &1442 VMXNET3_RCD_CSUM_OK) == VMXNET3_RCD_CSUM_OK) {1443 skb->ip_summed = CHECKSUM_UNNECESSARY;1444 if ((le32_to_cpu(gdesc->dword[0]) &1445 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT))) {1446 skb->csum_level = 1;1447 }1448 WARN_ON_ONCE(!(gdesc->rcd.tcp || gdesc->rcd.udp) &&1449 !(le32_to_cpu(gdesc->dword[0]) &1450 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT)));1451 WARN_ON_ONCE(gdesc->rcd.frg &&1452 !(le32_to_cpu(gdesc->dword[0]) &1453 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT)));1454 } else if (gdesc->rcd.v6 && (le32_to_cpu(gdesc->dword[3]) &1455 (1 << VMXNET3_RCD_TUC_SHIFT))) {1456 skb->ip_summed = CHECKSUM_UNNECESSARY;1457 if ((le32_to_cpu(gdesc->dword[0]) &1458 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT))) {1459 skb->csum_level = 1;1460 }1461 WARN_ON_ONCE(!(gdesc->rcd.tcp || gdesc->rcd.udp) &&1462 !(le32_to_cpu(gdesc->dword[0]) &1463 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT)));1464 WARN_ON_ONCE(gdesc->rcd.frg &&1465 !(le32_to_cpu(gdesc->dword[0]) &1466 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT)));1467 } else {1468 if (gdesc->rcd.csum) {1469 skb->csum = htons(gdesc->rcd.csum);1470 skb->ip_summed = CHECKSUM_PARTIAL;1471 } else {1472 skb_checksum_none_assert(skb);1473 }1474 }1475 } else {1476 skb_checksum_none_assert(skb);1477 }1478}1479 1480 1481static void1482vmxnet3_rx_error(struct vmxnet3_rx_queue *rq, struct Vmxnet3_RxCompDesc *rcd,1483 struct vmxnet3_rx_ctx *ctx, struct vmxnet3_adapter *adapter)1484{1485 rq->stats.drop_err++;1486 if (!rcd->fcs)1487 rq->stats.drop_fcs++;1488 1489 rq->stats.drop_total++;1490 1491 /*1492 * We do not unmap and chain the rx buffer to the skb.1493 * We basically pretend this buffer is not used and will be recycled1494 * by vmxnet3_rq_alloc_rx_buf()1495 */1496 1497 /*1498 * ctx->skb may be NULL if this is the first and the only one1499 * desc for the pkt1500 */1501 if (ctx->skb)1502 dev_kfree_skb_irq(ctx->skb);1503 1504 ctx->skb = NULL;1505}1506 1507 1508static u321509vmxnet3_get_hdr_len(struct vmxnet3_adapter *adapter, struct sk_buff *skb,1510 union Vmxnet3_GenericDesc *gdesc)1511{1512 u32 hlen, maplen;1513 union {1514 void *ptr;1515 struct ethhdr *eth;1516 struct vlan_ethhdr *veth;1517 struct iphdr *ipv4;1518 struct ipv6hdr *ipv6;1519 struct tcphdr *tcp;1520 } hdr;1521 BUG_ON(gdesc->rcd.tcp == 0);1522 1523 maplen = skb_headlen(skb);1524 if (unlikely(sizeof(struct iphdr) + sizeof(struct tcphdr) > maplen))1525 return 0;1526 1527 if (skb->protocol == cpu_to_be16(ETH_P_8021Q) ||1528 skb->protocol == cpu_to_be16(ETH_P_8021AD))1529 hlen = sizeof(struct vlan_ethhdr);1530 else1531 hlen = sizeof(struct ethhdr);1532 1533 hdr.eth = eth_hdr(skb);1534 if (gdesc->rcd.v4) {1535 BUG_ON(hdr.eth->h_proto != htons(ETH_P_IP) &&1536 hdr.veth->h_vlan_encapsulated_proto != htons(ETH_P_IP));1537 hdr.ptr += hlen;1538 BUG_ON(hdr.ipv4->protocol != IPPROTO_TCP);1539 hlen = hdr.ipv4->ihl << 2;1540 hdr.ptr += hdr.ipv4->ihl << 2;1541 } else if (gdesc->rcd.v6) {1542 BUG_ON(hdr.eth->h_proto != htons(ETH_P_IPV6) &&1543 hdr.veth->h_vlan_encapsulated_proto != htons(ETH_P_IPV6));1544 hdr.ptr += hlen;1545 /* Use an estimated value, since we also need to handle1546 * TSO case.1547 */1548 if (hdr.ipv6->nexthdr != IPPROTO_TCP)1549 return sizeof(struct ipv6hdr) + sizeof(struct tcphdr);1550 hlen = sizeof(struct ipv6hdr);1551 hdr.ptr += sizeof(struct ipv6hdr);1552 } else {1553 /* Non-IP pkt, dont estimate header length */1554 return 0;1555 }1556 1557 if (hlen + sizeof(struct tcphdr) > maplen)1558 return 0;1559 1560 return (hlen + (hdr.tcp->doff << 2));1561}1562 1563static int1564vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,1565 struct vmxnet3_adapter *adapter, int quota)1566{1567 u32 rxprod_reg[2] = {1568 adapter->rx_prod_offset, adapter->rx_prod2_offset1569 };1570 u32 num_pkts = 0;1571 bool skip_page_frags = false;1572 bool encap_lro = false;1573 struct Vmxnet3_RxCompDesc *rcd;1574 struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx;1575 u16 segCnt = 0, mss = 0;1576 int comp_offset, fill_offset;1577#ifdef __BIG_ENDIAN_BITFIELD1578 struct Vmxnet3_RxDesc rxCmdDesc;1579 struct Vmxnet3_RxCompDesc rxComp;1580#endif1581 bool need_flush = false;1582 1583 vmxnet3_getRxComp(rcd, &rq->comp_ring.base[rq->comp_ring.next2proc].rcd,1584 &rxComp);1585 while (rcd->gen == rq->comp_ring.gen) {1586 struct vmxnet3_rx_buf_info *rbi;1587 struct sk_buff *skb, *new_skb = NULL;1588 struct page *new_page = NULL;1589 dma_addr_t new_dma_addr;1590 int num_to_alloc;1591 struct Vmxnet3_RxDesc *rxd;1592 u32 idx, ring_idx;1593 struct vmxnet3_cmd_ring *ring = NULL;1594 if (num_pkts >= quota) {1595 /* we may stop even before we see the EOP desc of1596 * the current pkt1597 */1598 break;1599 }1600 1601 /* Prevent any rcd field from being (speculatively) read before1602 * rcd->gen is read.1603 */1604 dma_rmb();1605 1606 BUG_ON(rcd->rqID != rq->qid && rcd->rqID != rq->qid2 &&1607 rcd->rqID != rq->dataRingQid);1608 idx = rcd->rxdIdx;1609 ring_idx = VMXNET3_GET_RING_IDX(adapter, rcd->rqID);1610 ring = rq->rx_ring + ring_idx;1611 vmxnet3_getRxDesc(rxd, &rq->rx_ring[ring_idx].base[idx].rxd,1612 &rxCmdDesc);1613 rbi = rq->buf_info[ring_idx] + idx;1614 1615 BUG_ON(rxd->addr != rbi->dma_addr ||1616 rxd->len != rbi->len);1617 1618 if (unlikely(rcd->eop && rcd->err)) {1619 vmxnet3_rx_error(rq, rcd, ctx, adapter);1620 goto rcd_done;1621 }1622 1623 if (rcd->sop && rcd->eop && vmxnet3_xdp_enabled(adapter)) {1624 struct sk_buff *skb_xdp_pass;1625 int act;1626 1627 if (VMXNET3_RX_DATA_RING(adapter, rcd->rqID)) {1628 ctx->skb = NULL;1629 goto skip_xdp; /* Handle it later. */1630 }1631 1632 if (rbi->buf_type != VMXNET3_RX_BUF_XDP)1633 goto rcd_done;1634 1635 act = vmxnet3_process_xdp(adapter, rq, rcd, rbi, rxd,1636 &skb_xdp_pass);1637 if (act == XDP_PASS) {1638 ctx->skb = skb_xdp_pass;1639 goto sop_done;1640 }1641 ctx->skb = NULL;1642 need_flush |= act == XDP_REDIRECT;1643 1644 goto rcd_done;1645 }1646skip_xdp:1647 1648 if (rcd->sop) { /* first buf of the pkt */1649 bool rxDataRingUsed;1650 u16 len;1651 1652 BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_HEAD ||1653 (rcd->rqID != rq->qid &&1654 rcd->rqID != rq->dataRingQid));1655 1656 BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_SKB &&1657 rbi->buf_type != VMXNET3_RX_BUF_XDP);1658 BUG_ON(ctx->skb != NULL || rbi->skb == NULL);1659 1660 if (unlikely(rcd->len == 0)) {1661 /* Pretend the rx buffer is skipped. */1662 BUG_ON(!(rcd->sop && rcd->eop));1663 netdev_dbg(adapter->netdev,1664 "rxRing[%u][%u] 0 length\n",1665 ring_idx, idx);1666 goto rcd_done;1667 }1668 1669 skip_page_frags = false;1670 ctx->skb = rbi->skb;1671 1672 if (rq->rx_ts_desc_size != 0 && rcd->ext2) {1673 struct Vmxnet3_RxTSDesc *ts_rxd;1674 1675 ts_rxd = (struct Vmxnet3_RxTSDesc *)((u8 *)rq->ts_ring.base +1676 idx * rq->rx_ts_desc_size);1677 ts_rxd->ts.tsData = vmxnet3_get_cycles(VMXNET3_PMC_PSEUDO_TSC);1678 ts_rxd->ts.tsi = 1;1679 }1680 1681 rxDataRingUsed =1682 VMXNET3_RX_DATA_RING(adapter, rcd->rqID);1683 len = rxDataRingUsed ? rcd->len : rbi->len;1684 1685 if (rxDataRingUsed && vmxnet3_xdp_enabled(adapter)) {1686 struct sk_buff *skb_xdp_pass;1687 size_t sz;1688 int act;1689 1690 sz = rcd->rxdIdx * rq->data_ring.desc_size;1691 act = vmxnet3_process_xdp_small(adapter, rq,1692 &rq->data_ring.base[sz],1693 rcd->len,1694 &skb_xdp_pass);1695 if (act == XDP_PASS) {1696 ctx->skb = skb_xdp_pass;1697 goto sop_done;1698 }1699 need_flush |= act == XDP_REDIRECT;1700 1701 goto rcd_done;1702 }1703 new_skb = netdev_alloc_skb_ip_align(adapter->netdev,1704 len);1705 if (new_skb == NULL) {1706 /* Skb allocation failed, do not handover this1707 * skb to stack. Reuse it. Drop the existing pkt1708 */1709 rq->stats.rx_buf_alloc_failure++;1710 ctx->skb = NULL;1711 rq->stats.drop_total++;1712 skip_page_frags = true;1713 goto rcd_done;1714 }1715 1716 if (rxDataRingUsed && adapter->rxdataring_enabled) {1717 size_t sz;1718 1719 BUG_ON(rcd->len > rq->data_ring.desc_size);1720 1721 ctx->skb = new_skb;1722 sz = rcd->rxdIdx * rq->data_ring.desc_size;1723 memcpy(new_skb->data,1724 &rq->data_ring.base[sz], rcd->len);1725 } else {1726 ctx->skb = rbi->skb;1727 1728 new_dma_addr =1729 dma_map_single(&adapter->pdev->dev,1730 new_skb->data, rbi->len,1731 DMA_FROM_DEVICE);1732 if (dma_mapping_error(&adapter->pdev->dev,1733 new_dma_addr)) {1734 dev_kfree_skb(new_skb);1735 /* Skb allocation failed, do not1736 * handover this skb to stack. Reuse1737 * it. Drop the existing pkt.1738 */1739 rq->stats.rx_buf_alloc_failure++;1740 ctx->skb = NULL;1741 rq->stats.drop_total++;1742 skip_page_frags = true;1743 goto rcd_done;1744 }1745 1746 dma_unmap_single(&adapter->pdev->dev,1747 rbi->dma_addr,1748 rbi->len,1749 DMA_FROM_DEVICE);1750 1751 /* Immediate refill */1752 rbi->skb = new_skb;1753 rbi->dma_addr = new_dma_addr;1754 rxd->addr = cpu_to_le64(rbi->dma_addr);1755 rxd->len = rbi->len;1756 }1757 1758 skb_record_rx_queue(ctx->skb, rq->qid);1759 skb_put(ctx->skb, rcd->len);1760 1761 if (VMXNET3_VERSION_GE_2(adapter) &&1762 rcd->type == VMXNET3_CDTYPE_RXCOMP_LRO) {1763 struct Vmxnet3_RxCompDescExt *rcdlro;1764 union Vmxnet3_GenericDesc *gdesc;1765 1766 rcdlro = (struct Vmxnet3_RxCompDescExt *)rcd;1767 gdesc = (union Vmxnet3_GenericDesc *)rcd;1768 1769 segCnt = rcdlro->segCnt;1770 WARN_ON_ONCE(segCnt == 0);1771 mss = rcdlro->mss;1772 if (unlikely(segCnt <= 1))1773 segCnt = 0;1774 encap_lro = (le32_to_cpu(gdesc->dword[0]) &1775 (1UL << VMXNET3_RCD_HDR_INNER_SHIFT));1776 } else {1777 segCnt = 0;1778 }1779 } else {1780 BUG_ON(ctx->skb == NULL && !skip_page_frags);1781 1782 /* non SOP buffer must be type 1 in most cases */1783 BUG_ON(rbi->buf_type != VMXNET3_RX_BUF_PAGE);1784 BUG_ON(rxd->btype != VMXNET3_RXD_BTYPE_BODY);1785 1786 /* If an sop buffer was dropped, skip all1787 * following non-sop fragments. They will be reused.1788 */1789 if (skip_page_frags)1790 goto rcd_done;1791 1792 if (rcd->len) {1793 new_page = alloc_page(GFP_ATOMIC);1794 /* Replacement page frag could not be allocated.1795 * Reuse this page. Drop the pkt and free the1796 * skb which contained this page as a frag. Skip1797 * processing all the following non-sop frags.1798 */1799 if (unlikely(!new_page)) {1800 rq->stats.rx_buf_alloc_failure++;1801 dev_kfree_skb(ctx->skb);1802 ctx->skb = NULL;1803 skip_page_frags = true;1804 goto rcd_done;1805 }1806 new_dma_addr = dma_map_page(&adapter->pdev->dev,1807 new_page,1808 0, PAGE_SIZE,1809 DMA_FROM_DEVICE);1810 if (dma_mapping_error(&adapter->pdev->dev,1811 new_dma_addr)) {1812 put_page(new_page);1813 rq->stats.rx_buf_alloc_failure++;1814 dev_kfree_skb(ctx->skb);1815 ctx->skb = NULL;1816 skip_page_frags = true;1817 goto rcd_done;1818 }1819 1820 dma_unmap_page(&adapter->pdev->dev,1821 rbi->dma_addr, rbi->len,1822 DMA_FROM_DEVICE);1823 1824 vmxnet3_append_frag(ctx->skb, rcd, rbi);1825 1826 /* Immediate refill */1827 rbi->page = new_page;1828 rbi->dma_addr = new_dma_addr;1829 rxd->addr = cpu_to_le64(rbi->dma_addr);1830 rxd->len = rbi->len;1831 }1832 }1833 1834 1835sop_done:1836 skb = ctx->skb;1837 if (rcd->eop) {1838 u32 mtu = adapter->netdev->mtu;1839 skb->len += skb->data_len;1840 1841#ifdef VMXNET3_RSS1842 if (rcd->rssType != VMXNET3_RCD_RSS_TYPE_NONE &&1843 (adapter->netdev->features & NETIF_F_RXHASH)) {1844 enum pkt_hash_types hash_type;1845 1846 switch (rcd->rssType) {1847 case VMXNET3_RCD_RSS_TYPE_IPV4:1848 case VMXNET3_RCD_RSS_TYPE_IPV6:1849 hash_type = PKT_HASH_TYPE_L3;1850 break;1851 case VMXNET3_RCD_RSS_TYPE_TCPIPV4:1852 case VMXNET3_RCD_RSS_TYPE_TCPIPV6:1853 case VMXNET3_RCD_RSS_TYPE_UDPIPV4:1854 case VMXNET3_RCD_RSS_TYPE_UDPIPV6:1855 hash_type = PKT_HASH_TYPE_L4;1856 break;1857 default:1858 hash_type = PKT_HASH_TYPE_L3;1859 break;1860 }1861 skb_set_hash(skb,1862 le32_to_cpu(rcd->rssHash),1863 hash_type);1864 }1865#endif1866 vmxnet3_rx_csum(adapter, skb,1867 (union Vmxnet3_GenericDesc *)rcd);1868 skb->protocol = eth_type_trans(skb, adapter->netdev);1869 if ((!rcd->tcp && !encap_lro) ||1870 !(adapter->netdev->features & NETIF_F_LRO))1871 goto not_lro;1872 1873 if (segCnt != 0 && mss != 0) {1874 skb_shinfo(skb)->gso_type = rcd->v4 ?1875 SKB_GSO_TCPV4 : SKB_GSO_TCPV6;1876 skb_shinfo(skb)->gso_size = mss;1877 skb_shinfo(skb)->gso_segs = segCnt;1878 } else if ((segCnt != 0 || skb->len > mtu) && !encap_lro) {1879 u32 hlen;1880 1881 hlen = vmxnet3_get_hdr_len(adapter, skb,1882 (union Vmxnet3_GenericDesc *)rcd);1883 if (hlen == 0)1884 goto not_lro;1885 1886 skb_shinfo(skb)->gso_type =1887 rcd->v4 ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6;1888 if (segCnt != 0) {1889 skb_shinfo(skb)->gso_segs = segCnt;1890 skb_shinfo(skb)->gso_size =1891 DIV_ROUND_UP(skb->len -1892 hlen, segCnt);1893 } else {1894 skb_shinfo(skb)->gso_size = mtu - hlen;1895 }1896 }1897not_lro:1898 if (unlikely(rcd->ts))1899 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), rcd->tci);1900 1901 /* Use GRO callback if UPT is enabled */1902 if ((adapter->netdev->features & NETIF_F_LRO) &&1903 !rq->shared->updateRxProd)1904 netif_receive_skb(skb);1905 else1906 napi_gro_receive(&rq->napi, skb);1907 1908 ctx->skb = NULL;1909 encap_lro = false;1910 num_pkts++;1911 }1912 1913rcd_done:1914 /* device may have skipped some rx descs */1915 ring = rq->rx_ring + ring_idx;1916 rbi->comp_state = VMXNET3_RXD_COMP_DONE;1917 1918 comp_offset = vmxnet3_cmd_ring_desc_avail(ring);1919 fill_offset = (idx > ring->next2fill ? 0 : ring->size) +1920 idx - ring->next2fill - 1;1921 if (!ring->isOutOfOrder || fill_offset >= comp_offset)1922 ring->next2comp = idx;1923 num_to_alloc = vmxnet3_cmd_ring_desc_avail(ring);1924 1925 /* Ensure that the writes to rxd->gen bits will be observed1926 * after all other writes to rxd objects.1927 */1928 dma_wmb();1929 1930 while (num_to_alloc) {1931 rbi = rq->buf_info[ring_idx] + ring->next2fill;1932 if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_OOORX_COMP)))1933 goto refill_buf;1934 if (ring_idx == 0) {1935 /* ring0 Type1 buffers can get skipped; re-fill them */1936 if (rbi->buf_type != VMXNET3_RX_BUF_SKB)1937 goto refill_buf;1938 }1939 if (rbi->comp_state == VMXNET3_RXD_COMP_DONE) {1940refill_buf:1941 vmxnet3_getRxDesc(rxd, &ring->base[ring->next2fill].rxd,1942 &rxCmdDesc);1943 WARN_ON(!rxd->addr);1944 1945 /* Recv desc is ready to be used by the device */1946 rxd->gen = ring->gen;1947 vmxnet3_cmd_ring_adv_next2fill(ring);1948 rbi->comp_state = VMXNET3_RXD_COMP_PENDING;1949 num_to_alloc--;1950 } else {1951 /* rx completion hasn't occurred */1952 ring->isOutOfOrder = 1;1953 break;1954 }1955 }1956 1957 if (num_to_alloc == 0) {1958 ring->isOutOfOrder = 0;1959 }1960 1961 /* if needed, update the register */1962 if (unlikely(rq->shared->updateRxProd) && (ring->next2fill & 0xf) == 0) {1963 VMXNET3_WRITE_BAR0_REG(adapter,1964 rxprod_reg[ring_idx] + rq->qid * 8,1965 ring->next2fill);1966 }1967 1968 vmxnet3_comp_ring_adv_next2proc(&rq->comp_ring);1969 vmxnet3_getRxComp(rcd,1970 &rq->comp_ring.base[rq->comp_ring.next2proc].rcd, &rxComp);1971 }1972 if (need_flush)1973 xdp_do_flush();1974 1975 return num_pkts;1976}1977 1978 1979static void1980vmxnet3_rq_cleanup(struct vmxnet3_rx_queue *rq,1981 struct vmxnet3_adapter *adapter)1982{1983 u32 i, ring_idx;1984 struct Vmxnet3_RxDesc *rxd;1985 1986 /* ring has already been cleaned up */1987 if (!rq->rx_ring[0].base)1988 return;1989 1990 for (ring_idx = 0; ring_idx < 2; ring_idx++) {1991 for (i = 0; i < rq->rx_ring[ring_idx].size; i++) {1992 struct vmxnet3_rx_buf_info *rbi;1993#ifdef __BIG_ENDIAN_BITFIELD1994 struct Vmxnet3_RxDesc rxDesc;1995#endif1996 1997 rbi = &rq->buf_info[ring_idx][i];1998 vmxnet3_getRxDesc(rxd,1999 &rq->rx_ring[ring_idx].base[i].rxd, &rxDesc);2000 2001 if (rxd->btype == VMXNET3_RXD_BTYPE_HEAD &&2002 rbi->page && rbi->buf_type == VMXNET3_RX_BUF_XDP) {2003 page_pool_recycle_direct(rq->page_pool,2004 rbi->page);2005 rbi->page = NULL;2006 } else if (rxd->btype == VMXNET3_RXD_BTYPE_HEAD &&2007 rbi->skb) {2008 dma_unmap_single(&adapter->pdev->dev, rxd->addr,2009 rxd->len, DMA_FROM_DEVICE);2010 dev_kfree_skb(rbi->skb);2011 rbi->skb = NULL;2012 } else if (rxd->btype == VMXNET3_RXD_BTYPE_BODY &&2013 rbi->page) {2014 dma_unmap_page(&adapter->pdev->dev, rxd->addr,2015 rxd->len, DMA_FROM_DEVICE);2016 put_page(rbi->page);2017 rbi->page = NULL;2018 }2019 }2020 2021 rq->rx_ring[ring_idx].gen = VMXNET3_INIT_GEN;2022 rq->rx_ring[ring_idx].next2fill =2023 rq->rx_ring[ring_idx].next2comp = 0;2024 }2025 2026 rq->comp_ring.gen = VMXNET3_INIT_GEN;2027 rq->comp_ring.next2proc = 0;2028}2029 2030 2031static void2032vmxnet3_rq_cleanup_all(struct vmxnet3_adapter *adapter)2033{2034 int i;2035 2036 for (i = 0; i < adapter->num_rx_queues; i++)2037 vmxnet3_rq_cleanup(&adapter->rx_queue[i], adapter);2038 rcu_assign_pointer(adapter->xdp_bpf_prog, NULL);2039}2040 2041 2042static void vmxnet3_rq_destroy(struct vmxnet3_rx_queue *rq,2043 struct vmxnet3_adapter *adapter)2044{2045 int i;2046 int j;2047 2048 /* all rx buffers must have already been freed */2049 for (i = 0; i < 2; i++) {2050 if (rq->buf_info[i]) {2051 for (j = 0; j < rq->rx_ring[i].size; j++)2052 BUG_ON(rq->buf_info[i][j].page != NULL);2053 }2054 }2055 2056 2057 for (i = 0; i < 2; i++) {2058 if (rq->rx_ring[i].base) {2059 dma_free_coherent(&adapter->pdev->dev,2060 rq->rx_ring[i].size2061 * sizeof(struct Vmxnet3_RxDesc),2062 rq->rx_ring[i].base,2063 rq->rx_ring[i].basePA);2064 rq->rx_ring[i].base = NULL;2065 }2066 }2067 2068 if (xdp_rxq_info_is_reg(&rq->xdp_rxq))2069 xdp_rxq_info_unreg(&rq->xdp_rxq);2070 page_pool_destroy(rq->page_pool);2071 rq->page_pool = NULL;2072 2073 if (rq->data_ring.base) {2074 dma_free_coherent(&adapter->pdev->dev,2075 rq->rx_ring[0].size * rq->data_ring.desc_size,2076 rq->data_ring.base, rq->data_ring.basePA);2077 rq->data_ring.base = NULL;2078 }2079 2080 if (rq->ts_ring.base) {2081 dma_free_coherent(&adapter->pdev->dev,2082 rq->rx_ring[0].size * rq->rx_ts_desc_size,2083 rq->ts_ring.base, rq->ts_ring.basePA);2084 rq->ts_ring.base = NULL;2085 }2086 2087 if (rq->comp_ring.base) {2088 dma_free_coherent(&adapter->pdev->dev, rq->comp_ring.size2089 * sizeof(struct Vmxnet3_RxCompDesc),2090 rq->comp_ring.base, rq->comp_ring.basePA);2091 rq->comp_ring.base = NULL;2092 }2093 2094 kfree(rq->buf_info[0]);2095 rq->buf_info[0] = NULL;2096 rq->buf_info[1] = NULL;2097}2098 2099static void2100vmxnet3_rq_destroy_all_rxdataring(struct vmxnet3_adapter *adapter)2101{2102 int i;2103 2104 for (i = 0; i < adapter->num_rx_queues; i++) {2105 struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i];2106 2107 if (rq->data_ring.base) {2108 dma_free_coherent(&adapter->pdev->dev,2109 (rq->rx_ring[0].size *2110 rq->data_ring.desc_size),2111 rq->data_ring.base,2112 rq->data_ring.basePA);2113 rq->data_ring.base = NULL;2114 }2115 rq->data_ring.desc_size = 0;2116 }2117}2118 2119static int2120vmxnet3_rq_init(struct vmxnet3_rx_queue *rq,2121 struct vmxnet3_adapter *adapter)2122{2123 int i, err;2124 2125 /* initialize buf_info */2126 for (i = 0; i < rq->rx_ring[0].size; i++) {2127 2128 /* 1st buf for a pkt is skbuff or xdp page */2129 if (i % adapter->rx_buf_per_pkt == 0) {2130 rq->buf_info[0][i].buf_type = vmxnet3_xdp_enabled(adapter) ?2131 VMXNET3_RX_BUF_XDP :2132 VMXNET3_RX_BUF_SKB;2133 rq->buf_info[0][i].len = adapter->skb_buf_size;2134 } else { /* subsequent bufs for a pkt is frag */2135 rq->buf_info[0][i].buf_type = VMXNET3_RX_BUF_PAGE;2136 rq->buf_info[0][i].len = PAGE_SIZE;2137 }2138 }2139 for (i = 0; i < rq->rx_ring[1].size; i++) {2140 rq->buf_info[1][i].buf_type = VMXNET3_RX_BUF_PAGE;2141 rq->buf_info[1][i].len = PAGE_SIZE;2142 }2143 2144 /* reset internal state and allocate buffers for both rings */2145 for (i = 0; i < 2; i++) {2146 rq->rx_ring[i].next2fill = rq->rx_ring[i].next2comp = 0;2147 2148 memset(rq->rx_ring[i].base, 0, rq->rx_ring[i].size *2149 sizeof(struct Vmxnet3_RxDesc));2150 rq->rx_ring[i].gen = VMXNET3_INIT_GEN;2151 rq->rx_ring[i].isOutOfOrder = 0;2152 }2153 2154 err = vmxnet3_create_pp(adapter, rq,2155 rq->rx_ring[0].size + rq->rx_ring[1].size);2156 if (err)2157 return err;2158 2159 if (vmxnet3_rq_alloc_rx_buf(rq, 0, rq->rx_ring[0].size - 1,2160 adapter) == 0) {2161 xdp_rxq_info_unreg(&rq->xdp_rxq);2162 page_pool_destroy(rq->page_pool);2163 rq->page_pool = NULL;2164 2165 /* at least has 1 rx buffer for the 1st ring */2166 return -ENOMEM;2167 }2168 vmxnet3_rq_alloc_rx_buf(rq, 1, rq->rx_ring[1].size - 1, adapter);2169 2170 if (rq->ts_ring.base)2171 memset(rq->ts_ring.base, 0,2172 rq->rx_ring[0].size * rq->rx_ts_desc_size);2173 2174 /* reset the comp ring */2175 rq->comp_ring.next2proc = 0;2176 memset(rq->comp_ring.base, 0, rq->comp_ring.size *2177 sizeof(struct Vmxnet3_RxCompDesc));2178 rq->comp_ring.gen = VMXNET3_INIT_GEN;2179 2180 /* reset rxctx */2181 rq->rx_ctx.skb = NULL;2182 2183 /* stats are not reset */2184 return 0;2185}2186 2187 2188static int2189vmxnet3_rq_init_all(struct vmxnet3_adapter *adapter)2190{2191 int i, err = 0;2192 2193 for (i = 0; i < adapter->num_rx_queues; i++) {2194 err = vmxnet3_rq_init(&adapter->rx_queue[i], adapter);2195 if (unlikely(err)) {2196 dev_err(&adapter->netdev->dev, "%s: failed to "2197 "initialize rx queue%i\n",2198 adapter->netdev->name, i);2199 break;2200 }2201 }2202 return err;2203 2204}2205 2206 2207static int2208vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter)2209{2210 int i;2211 size_t sz;2212 struct vmxnet3_rx_buf_info *bi;2213 2214 for (i = 0; i < 2; i++) {2215 2216 sz = rq->rx_ring[i].size * sizeof(struct Vmxnet3_RxDesc);2217 rq->rx_ring[i].base = dma_alloc_coherent(2218 &adapter->pdev->dev, sz,2219 &rq->rx_ring[i].basePA,2220 GFP_KERNEL);2221 if (!rq->rx_ring[i].base) {2222 netdev_err(adapter->netdev,2223 "failed to allocate rx ring %d\n", i);2224 goto err;2225 }2226 }2227 2228 if ((adapter->rxdataring_enabled) && (rq->data_ring.desc_size != 0)) {2229 sz = rq->rx_ring[0].size * rq->data_ring.desc_size;2230 rq->data_ring.base =2231 dma_alloc_coherent(&adapter->pdev->dev, sz,2232 &rq->data_ring.basePA,2233 GFP_KERNEL);2234 if (!rq->data_ring.base) {2235 netdev_err(adapter->netdev,2236 "rx data ring will be disabled\n");2237 adapter->rxdataring_enabled = false;2238 }2239 } else {2240 rq->data_ring.base = NULL;2241 rq->data_ring.desc_size = 0;2242 }2243 2244 if (rq->rx_ts_desc_size != 0) {2245 sz = rq->rx_ring[0].size * rq->rx_ts_desc_size;2246 rq->ts_ring.base =2247 dma_alloc_coherent(&adapter->pdev->dev, sz,2248 &rq->ts_ring.basePA,2249 GFP_KERNEL);2250 if (!rq->ts_ring.base) {2251 netdev_err(adapter->netdev,2252 "rx ts ring will be disabled\n");2253 rq->rx_ts_desc_size = 0;2254 }2255 } else {2256 rq->ts_ring.base = NULL;2257 }2258 2259 sz = rq->comp_ring.size * sizeof(struct Vmxnet3_RxCompDesc);2260 rq->comp_ring.base = dma_alloc_coherent(&adapter->pdev->dev, sz,2261 &rq->comp_ring.basePA,2262 GFP_KERNEL);2263 if (!rq->comp_ring.base) {2264 netdev_err(adapter->netdev, "failed to allocate rx comp ring\n");2265 goto err;2266 }2267 2268 bi = kcalloc_node(rq->rx_ring[0].size + rq->rx_ring[1].size,2269 sizeof(rq->buf_info[0][0]), GFP_KERNEL,2270 dev_to_node(&adapter->pdev->dev));2271 if (!bi)2272 goto err;2273 2274 rq->buf_info[0] = bi;2275 rq->buf_info[1] = bi + rq->rx_ring[0].size;2276 2277 return 0;2278 2279err:2280 vmxnet3_rq_destroy(rq, adapter);2281 return -ENOMEM;2282}2283 2284 2285int2286vmxnet3_rq_create_all(struct vmxnet3_adapter *adapter)2287{2288 int i, err = 0;2289 2290 adapter->rxdataring_enabled = VMXNET3_VERSION_GE_3(adapter);2291 2292 for (i = 0; i < adapter->num_rx_queues; i++) {2293 err = vmxnet3_rq_create(&adapter->rx_queue[i], adapter);2294 if (unlikely(err)) {2295 dev_err(&adapter->netdev->dev,2296 "%s: failed to create rx queue%i\n",2297 adapter->netdev->name, i);2298 goto err_out;2299 }2300 }2301 2302 if (!adapter->rxdataring_enabled)2303 vmxnet3_rq_destroy_all_rxdataring(adapter);2304 2305 return err;2306err_out:2307 vmxnet3_rq_destroy_all(adapter);2308 return err;2309 2310}2311 2312/* Multiple queue aware polling function for tx and rx */2313 2314static int2315vmxnet3_do_poll(struct vmxnet3_adapter *adapter, int budget)2316{2317 int rcd_done = 0, i;2318 if (unlikely(adapter->shared->ecr))2319 vmxnet3_process_events(adapter);2320 for (i = 0; i < adapter->num_tx_queues; i++)2321 vmxnet3_tq_tx_complete(&adapter->tx_queue[i], adapter);2322 2323 for (i = 0; i < adapter->num_rx_queues; i++)2324 rcd_done += vmxnet3_rq_rx_complete(&adapter->rx_queue[i],2325 adapter, budget);2326 return rcd_done;2327}2328 2329 2330static int2331vmxnet3_poll(struct napi_struct *napi, int budget)2332{2333 struct vmxnet3_rx_queue *rx_queue = container_of(napi,2334 struct vmxnet3_rx_queue, napi);2335 int rxd_done;2336 2337 rxd_done = vmxnet3_do_poll(rx_queue->adapter, budget);2338 2339 if (rxd_done < budget) {2340 napi_complete_done(napi, rxd_done);2341 vmxnet3_enable_all_intrs(rx_queue->adapter);2342 }2343 return rxd_done;2344}2345 2346/*2347 * NAPI polling function for MSI-X mode with multiple Rx queues2348 * Returns the # of the NAPI credit consumed (# of rx descriptors processed)2349 */2350 2351static int2352vmxnet3_poll_rx_only(struct napi_struct *napi, int budget)2353{2354 struct vmxnet3_rx_queue *rq = container_of(napi,2355 struct vmxnet3_rx_queue, napi);2356 struct vmxnet3_adapter *adapter = rq->adapter;2357 int rxd_done;2358 2359 /* When sharing interrupt with corresponding tx queue, process2360 * tx completions in that queue as well2361 */2362 if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE) {2363 struct vmxnet3_tx_queue *tq =2364 &adapter->tx_queue[rq - adapter->rx_queue];2365 vmxnet3_tq_tx_complete(tq, adapter);2366 }2367 2368 rxd_done = vmxnet3_rq_rx_complete(rq, adapter, budget);2369 2370 if (rxd_done < budget) {2371 napi_complete_done(napi, rxd_done);2372 vmxnet3_enable_intr(adapter, rq->comp_ring.intr_idx);2373 }2374 return rxd_done;2375}2376 2377 2378#ifdef CONFIG_PCI_MSI2379 2380/*2381 * Handle completion interrupts on tx queues2382 * Returns whether or not the intr is handled2383 */2384 2385static irqreturn_t2386vmxnet3_msix_tx(int irq, void *data)2387{2388 struct vmxnet3_tx_queue *tq = data;2389 struct vmxnet3_adapter *adapter = tq->adapter;2390 2391 if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE)2392 vmxnet3_disable_intr(adapter, tq->comp_ring.intr_idx);2393 2394 /* Handle the case where only one irq is allocate for all tx queues */2395 if (adapter->share_intr == VMXNET3_INTR_TXSHARE) {2396 int i;2397 for (i = 0; i < adapter->num_tx_queues; i++) {2398 struct vmxnet3_tx_queue *txq = &adapter->tx_queue[i];2399 vmxnet3_tq_tx_complete(txq, adapter);2400 }2401 } else {2402 vmxnet3_tq_tx_complete(tq, adapter);2403 }2404 vmxnet3_enable_intr(adapter, tq->comp_ring.intr_idx);2405 2406 return IRQ_HANDLED;2407}2408 2409 2410/*2411 * Handle completion interrupts on rx queues. Returns whether or not the2412 * intr is handled2413 */2414 2415static irqreturn_t2416vmxnet3_msix_rx(int irq, void *data)2417{2418 struct vmxnet3_rx_queue *rq = data;2419 struct vmxnet3_adapter *adapter = rq->adapter;2420 2421 /* disable intr if needed */2422 if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE)2423 vmxnet3_disable_intr(adapter, rq->comp_ring.intr_idx);2424 napi_schedule(&rq->napi);2425 2426 return IRQ_HANDLED;2427}2428 2429/*2430 *----------------------------------------------------------------------------2431 *2432 * vmxnet3_msix_event --2433 *2434 * vmxnet3 msix event intr handler2435 *2436 * Result:2437 * whether or not the intr is handled2438 *2439 *----------------------------------------------------------------------------2440 */2441 2442static irqreturn_t2443vmxnet3_msix_event(int irq, void *data)2444{2445 struct net_device *dev = data;2446 struct vmxnet3_adapter *adapter = netdev_priv(dev);2447 2448 /* disable intr if needed */2449 if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE)2450 vmxnet3_disable_intr(adapter, adapter->intr.event_intr_idx);2451 2452 if (adapter->shared->ecr)2453 vmxnet3_process_events(adapter);2454 2455 vmxnet3_enable_intr(adapter, adapter->intr.event_intr_idx);2456 2457 return IRQ_HANDLED;2458}2459 2460#endif /* CONFIG_PCI_MSI */2461 2462 2463/* Interrupt handler for vmxnet3 */2464static irqreturn_t2465vmxnet3_intr(int irq, void *dev_id)2466{2467 struct net_device *dev = dev_id;2468 struct vmxnet3_adapter *adapter = netdev_priv(dev);2469 2470 if (adapter->intr.type == VMXNET3_IT_INTX) {2471 u32 icr = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_ICR);2472 if (unlikely(icr == 0))2473 /* not ours */2474 return IRQ_NONE;2475 }2476 2477 2478 /* disable intr if needed */2479 if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE)2480 vmxnet3_disable_all_intrs(adapter);2481 2482 napi_schedule(&adapter->rx_queue[0].napi);2483 2484 return IRQ_HANDLED;2485}2486 2487#ifdef CONFIG_NET_POLL_CONTROLLER2488 2489/* netpoll callback. */2490static void2491vmxnet3_netpoll(struct net_device *netdev)2492{2493 struct vmxnet3_adapter *adapter = netdev_priv(netdev);2494 2495 switch (adapter->intr.type) {2496#ifdef CONFIG_PCI_MSI2497 case VMXNET3_IT_MSIX: {2498 int i;2499 for (i = 0; i < adapter->num_rx_queues; i++)2500 vmxnet3_msix_rx(0, &adapter->rx_queue[i]);2501 break;2502 }2503#endif2504 case VMXNET3_IT_MSI:2505 default:2506 vmxnet3_intr(0, adapter->netdev);2507 break;2508 }2509 2510}2511#endif /* CONFIG_NET_POLL_CONTROLLER */2512 2513static int2514vmxnet3_request_irqs(struct vmxnet3_adapter *adapter)2515{2516 struct vmxnet3_intr *intr = &adapter->intr;2517 int err = 0, i;2518 int vector = 0;2519 2520#ifdef CONFIG_PCI_MSI2521 if (adapter->intr.type == VMXNET3_IT_MSIX) {2522 for (i = 0; i < adapter->num_tx_queues; i++) {2523 if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE) {2524 sprintf(adapter->tx_queue[i].name, "%s-tx-%d",2525 adapter->netdev->name, vector);2526 err = request_irq(2527 intr->msix_entries[vector].vector,2528 vmxnet3_msix_tx, 0,2529 adapter->tx_queue[i].name,2530 &adapter->tx_queue[i]);2531 } else {2532 sprintf(adapter->tx_queue[i].name, "%s-rxtx-%d",2533 adapter->netdev->name, vector);2534 }2535 if (err) {2536 dev_err(&adapter->netdev->dev,2537 "Failed to request irq for MSIX, %s, "2538 "error %d\n",2539 adapter->tx_queue[i].name, err);2540 return err;2541 }2542 2543 /* Handle the case where only 1 MSIx was allocated for2544 * all tx queues */2545 if (adapter->share_intr == VMXNET3_INTR_TXSHARE) {2546 for (; i < adapter->num_tx_queues; i++)2547 adapter->tx_queue[i].comp_ring.intr_idx2548 = vector;2549 vector++;2550 break;2551 } else {2552 adapter->tx_queue[i].comp_ring.intr_idx2553 = vector++;2554 }2555 }2556 if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE)2557 vector = 0;2558 2559 for (i = 0; i < adapter->num_rx_queues; i++) {2560 if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE)2561 sprintf(adapter->rx_queue[i].name, "%s-rx-%d",2562 adapter->netdev->name, vector);2563 else2564 sprintf(adapter->rx_queue[i].name, "%s-rxtx-%d",2565 adapter->netdev->name, vector);2566 err = request_irq(intr->msix_entries[vector].vector,2567 vmxnet3_msix_rx, 0,2568 adapter->rx_queue[i].name,2569 &(adapter->rx_queue[i]));2570 if (err) {2571 netdev_err(adapter->netdev,2572 "Failed to request irq for MSIX, "2573 "%s, error %d\n",2574 adapter->rx_queue[i].name, err);2575 return err;2576 }2577 2578 adapter->rx_queue[i].comp_ring.intr_idx = vector++;2579 }2580 2581 sprintf(intr->event_msi_vector_name, "%s-event-%d",2582 adapter->netdev->name, vector);2583 err = request_irq(intr->msix_entries[vector].vector,2584 vmxnet3_msix_event, 0,2585 intr->event_msi_vector_name, adapter->netdev);2586 intr->event_intr_idx = vector;2587 2588 } else if (intr->type == VMXNET3_IT_MSI) {2589 adapter->num_rx_queues = 1;2590 err = request_irq(adapter->pdev->irq, vmxnet3_intr, 0,2591 adapter->netdev->name, adapter->netdev);2592 } else {2593#endif2594 adapter->num_rx_queues = 1;2595 err = request_irq(adapter->pdev->irq, vmxnet3_intr,2596 IRQF_SHARED, adapter->netdev->name,2597 adapter->netdev);2598#ifdef CONFIG_PCI_MSI2599 }2600#endif2601 intr->num_intrs = vector + 1;2602 if (err) {2603 netdev_err(adapter->netdev,2604 "Failed to request irq (intr type:%d), error %d\n",2605 intr->type, err);2606 } else {2607 /* Number of rx queues will not change after this */2608 for (i = 0; i < adapter->num_rx_queues; i++) {2609 struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i];2610 rq->qid = i;2611 rq->qid2 = i + adapter->num_rx_queues;2612 rq->dataRingQid = i + 2 * adapter->num_rx_queues;2613 }2614 2615 /* init our intr settings */2616 for (i = 0; i < intr->num_intrs; i++)2617 intr->mod_levels[i] = UPT1_IML_ADAPTIVE;2618 if (adapter->intr.type != VMXNET3_IT_MSIX) {2619 adapter->intr.event_intr_idx = 0;2620 for (i = 0; i < adapter->num_tx_queues; i++)2621 adapter->tx_queue[i].comp_ring.intr_idx = 0;2622 adapter->rx_queue[0].comp_ring.intr_idx = 0;2623 }2624 2625 netdev_info(adapter->netdev,2626 "intr type %u, mode %u, %u vectors allocated\n",2627 intr->type, intr->mask_mode, intr->num_intrs);2628 }2629 2630 return err;2631}2632 2633 2634static void2635vmxnet3_free_irqs(struct vmxnet3_adapter *adapter)2636{2637 struct vmxnet3_intr *intr = &adapter->intr;2638 BUG_ON(intr->type == VMXNET3_IT_AUTO || intr->num_intrs <= 0);2639 2640 switch (intr->type) {2641#ifdef CONFIG_PCI_MSI2642 case VMXNET3_IT_MSIX:2643 {2644 int i, vector = 0;2645 2646 if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE) {2647 for (i = 0; i < adapter->num_tx_queues; i++) {2648 free_irq(intr->msix_entries[vector++].vector,2649 &(adapter->tx_queue[i]));2650 if (adapter->share_intr == VMXNET3_INTR_TXSHARE)2651 break;2652 }2653 }2654 2655 for (i = 0; i < adapter->num_rx_queues; i++) {2656 free_irq(intr->msix_entries[vector++].vector,2657 &(adapter->rx_queue[i]));2658 }2659 2660 free_irq(intr->msix_entries[vector].vector,2661 adapter->netdev);2662 BUG_ON(vector >= intr->num_intrs);2663 break;2664 }2665#endif2666 case VMXNET3_IT_MSI:2667 free_irq(adapter->pdev->irq, adapter->netdev);2668 break;2669 case VMXNET3_IT_INTX:2670 free_irq(adapter->pdev->irq, adapter->netdev);2671 break;2672 default:2673 BUG();2674 }2675}2676 2677 2678static void2679vmxnet3_restore_vlan(struct vmxnet3_adapter *adapter)2680{2681 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;2682 u16 vid;2683 2684 /* allow untagged pkts */2685 VMXNET3_SET_VFTABLE_ENTRY(vfTable, 0);2686 2687 for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)2688 VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);2689}2690 2691 2692static int2693vmxnet3_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid)2694{2695 struct vmxnet3_adapter *adapter = netdev_priv(netdev);2696 2697 if (!(netdev->flags & IFF_PROMISC)) {2698 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;2699 unsigned long flags;2700 2701 VMXNET3_SET_VFTABLE_ENTRY(vfTable, vid);2702 spin_lock_irqsave(&adapter->cmd_lock, flags);2703 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,2704 VMXNET3_CMD_UPDATE_VLAN_FILTERS);2705 spin_unlock_irqrestore(&adapter->cmd_lock, flags);2706 }2707 2708 set_bit(vid, adapter->active_vlans);2709 2710 return 0;2711}2712 2713 2714static int2715vmxnet3_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid)2716{2717 struct vmxnet3_adapter *adapter = netdev_priv(netdev);2718 2719 if (!(netdev->flags & IFF_PROMISC)) {2720 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;2721 unsigned long flags;2722 2723 VMXNET3_CLEAR_VFTABLE_ENTRY(vfTable, vid);2724 spin_lock_irqsave(&adapter->cmd_lock, flags);2725 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,2726 VMXNET3_CMD_UPDATE_VLAN_FILTERS);2727 spin_unlock_irqrestore(&adapter->cmd_lock, flags);2728 }2729 2730 clear_bit(vid, adapter->active_vlans);2731 2732 return 0;2733}2734 2735 2736static u8 *2737vmxnet3_copy_mc(struct net_device *netdev)2738{2739 u8 *buf = NULL;2740 u32 sz = netdev_mc_count(netdev) * ETH_ALEN;2741 2742 /* struct Vmxnet3_RxFilterConf.mfTableLen is u16. */2743 if (sz <= 0xffff) {2744 /* We may be called with BH disabled */2745 buf = kmalloc(sz, GFP_ATOMIC);2746 if (buf) {2747 struct netdev_hw_addr *ha;2748 int i = 0;2749 2750 netdev_for_each_mc_addr(ha, netdev)2751 memcpy(buf + i++ * ETH_ALEN, ha->addr,2752 ETH_ALEN);2753 }2754 }2755 return buf;2756}2757 2758 2759static void2760vmxnet3_set_mc(struct net_device *netdev)2761{2762 struct vmxnet3_adapter *adapter = netdev_priv(netdev);2763 unsigned long flags;2764 struct Vmxnet3_RxFilterConf *rxConf =2765 &adapter->shared->devRead.rxFilterConf;2766 u8 *new_table = NULL;2767 dma_addr_t new_table_pa = 0;2768 bool new_table_pa_valid = false;2769 u32 new_mode = VMXNET3_RXM_UCAST;2770 2771 if (netdev->flags & IFF_PROMISC) {2772 u32 *vfTable = adapter->shared->devRead.rxFilterConf.vfTable;2773 memset(vfTable, 0, VMXNET3_VFT_SIZE * sizeof(*vfTable));2774 2775 new_mode |= VMXNET3_RXM_PROMISC;2776 } else {2777 vmxnet3_restore_vlan(adapter);2778 }2779 2780 if (netdev->flags & IFF_BROADCAST)2781 new_mode |= VMXNET3_RXM_BCAST;2782 2783 if (netdev->flags & IFF_ALLMULTI)2784 new_mode |= VMXNET3_RXM_ALL_MULTI;2785 else2786 if (!netdev_mc_empty(netdev)) {2787 new_table = vmxnet3_copy_mc(netdev);2788 if (new_table) {2789 size_t sz = netdev_mc_count(netdev) * ETH_ALEN;2790 2791 rxConf->mfTableLen = cpu_to_le16(sz);2792 new_table_pa = dma_map_single(2793 &adapter->pdev->dev,2794 new_table,2795 sz,2796 DMA_TO_DEVICE);2797 if (!dma_mapping_error(&adapter->pdev->dev,2798 new_table_pa)) {2799 new_mode |= VMXNET3_RXM_MCAST;2800 new_table_pa_valid = true;2801 rxConf->mfTablePA = cpu_to_le64(2802 new_table_pa);2803 }2804 }2805 if (!new_table_pa_valid) {2806 netdev_info(netdev,2807 "failed to copy mcast list, setting ALL_MULTI\n");2808 new_mode |= VMXNET3_RXM_ALL_MULTI;2809 }2810 }2811 2812 if (!(new_mode & VMXNET3_RXM_MCAST)) {2813 rxConf->mfTableLen = 0;2814 rxConf->mfTablePA = 0;2815 }2816 2817 spin_lock_irqsave(&adapter->cmd_lock, flags);2818 if (new_mode != rxConf->rxMode) {2819 rxConf->rxMode = cpu_to_le32(new_mode);2820 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,2821 VMXNET3_CMD_UPDATE_RX_MODE);2822 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,2823 VMXNET3_CMD_UPDATE_VLAN_FILTERS);2824 }2825 2826 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,2827 VMXNET3_CMD_UPDATE_MAC_FILTERS);2828 spin_unlock_irqrestore(&adapter->cmd_lock, flags);2829 2830 if (new_table_pa_valid)2831 dma_unmap_single(&adapter->pdev->dev, new_table_pa,2832 rxConf->mfTableLen, DMA_TO_DEVICE);2833 kfree(new_table);2834}2835 2836void2837vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter)2838{2839 int i;2840 2841 for (i = 0; i < adapter->num_rx_queues; i++)2842 vmxnet3_rq_destroy(&adapter->rx_queue[i], adapter);2843}2844 2845 2846/*2847 * Set up driver_shared based on settings in adapter.2848 */2849 2850static void2851vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter)2852{2853 struct Vmxnet3_DriverShared *shared = adapter->shared;2854 struct Vmxnet3_DSDevRead *devRead = &shared->devRead;2855 struct Vmxnet3_DSDevReadExt *devReadExt = &shared->devReadExt;2856 struct Vmxnet3_TxQueueConf *tqc;2857 struct Vmxnet3_RxQueueConf *rqc;2858 struct Vmxnet3_TxQueueTSConf *tqtsc;2859 struct Vmxnet3_RxQueueTSConf *rqtsc;2860 int i;2861 2862 memset(shared, 0, sizeof(*shared));2863 2864 /* driver settings */2865 shared->magic = cpu_to_le32(VMXNET3_REV1_MAGIC);2866 devRead->misc.driverInfo.version = cpu_to_le32(2867 VMXNET3_DRIVER_VERSION_NUM);2868 devRead->misc.driverInfo.gos.gosBits = (sizeof(void *) == 4 ?2869 VMXNET3_GOS_BITS_32 : VMXNET3_GOS_BITS_64);2870 devRead->misc.driverInfo.gos.gosType = VMXNET3_GOS_TYPE_LINUX;2871 *((u32 *)&devRead->misc.driverInfo.gos) = cpu_to_le32(2872 *((u32 *)&devRead->misc.driverInfo.gos));2873 devRead->misc.driverInfo.vmxnet3RevSpt = cpu_to_le32(1);2874 devRead->misc.driverInfo.uptVerSpt = cpu_to_le32(1);2875 2876 devRead->misc.ddPA = cpu_to_le64(adapter->adapter_pa);2877 devRead->misc.ddLen = cpu_to_le32(sizeof(struct vmxnet3_adapter));2878 2879 /* set up feature flags */2880 if (adapter->netdev->features & NETIF_F_RXCSUM)2881 devRead->misc.uptFeatures |= UPT1_F_RXCSUM;2882 2883 if (adapter->netdev->features & NETIF_F_LRO) {2884 devRead->misc.uptFeatures |= UPT1_F_LRO;2885 devRead->misc.maxNumRxSG = cpu_to_le16(1 + MAX_SKB_FRAGS);2886 }2887 if (adapter->netdev->features & NETIF_F_HW_VLAN_CTAG_RX)2888 devRead->misc.uptFeatures |= UPT1_F_RXVLAN;2889 2890 if (adapter->netdev->features & (NETIF_F_GSO_UDP_TUNNEL |2891 NETIF_F_GSO_UDP_TUNNEL_CSUM))2892 devRead->misc.uptFeatures |= UPT1_F_RXINNEROFLD;2893 2894 devRead->misc.mtu = cpu_to_le32(adapter->netdev->mtu);2895 devRead->misc.queueDescPA = cpu_to_le64(adapter->queue_desc_pa);2896 devRead->misc.queueDescLen = cpu_to_le32(2897 adapter->num_tx_queues * sizeof(struct Vmxnet3_TxQueueDesc) +2898 adapter->num_rx_queues * sizeof(struct Vmxnet3_RxQueueDesc));2899 2900 /* tx queue settings */2901 devRead->misc.numTxQueues = adapter->num_tx_queues;2902 for (i = 0; i < adapter->num_tx_queues; i++) {2903 struct vmxnet3_tx_queue *tq = &adapter->tx_queue[i];2904 BUG_ON(adapter->tx_queue[i].tx_ring.base == NULL);2905 tqc = &adapter->tqd_start[i].conf;2906 tqc->txRingBasePA = cpu_to_le64(tq->tx_ring.basePA);2907 tqc->dataRingBasePA = cpu_to_le64(tq->data_ring.basePA);2908 tqc->compRingBasePA = cpu_to_le64(tq->comp_ring.basePA);2909 tqc->ddPA = cpu_to_le64(~0ULL);2910 tqc->txRingSize = cpu_to_le32(tq->tx_ring.size);2911 tqc->dataRingSize = cpu_to_le32(tq->data_ring.size);2912 tqc->txDataRingDescSize = cpu_to_le32(tq->txdata_desc_size);2913 tqc->compRingSize = cpu_to_le32(tq->comp_ring.size);2914 tqc->ddLen = cpu_to_le32(0);2915 tqc->intrIdx = tq->comp_ring.intr_idx;2916 if (VMXNET3_VERSION_GE_9(adapter)) {2917 tqtsc = &adapter->tqd_start[i].tsConf;2918 tqtsc->txTSRingBasePA = cpu_to_le64(tq->ts_ring.basePA);2919 tqtsc->txTSRingDescSize = cpu_to_le16(tq->tx_ts_desc_size);2920 }2921 }2922 2923 /* rx queue settings */2924 devRead->misc.numRxQueues = adapter->num_rx_queues;2925 for (i = 0; i < adapter->num_rx_queues; i++) {2926 struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i];2927 rqc = &adapter->rqd_start[i].conf;2928 rqc->rxRingBasePA[0] = cpu_to_le64(rq->rx_ring[0].basePA);2929 rqc->rxRingBasePA[1] = cpu_to_le64(rq->rx_ring[1].basePA);2930 rqc->compRingBasePA = cpu_to_le64(rq->comp_ring.basePA);2931 rqc->ddPA = cpu_to_le64(~0ULL);2932 rqc->rxRingSize[0] = cpu_to_le32(rq->rx_ring[0].size);2933 rqc->rxRingSize[1] = cpu_to_le32(rq->rx_ring[1].size);2934 rqc->compRingSize = cpu_to_le32(rq->comp_ring.size);2935 rqc->ddLen = cpu_to_le32(0);2936 rqc->intrIdx = rq->comp_ring.intr_idx;2937 if (VMXNET3_VERSION_GE_3(adapter)) {2938 rqc->rxDataRingBasePA =2939 cpu_to_le64(rq->data_ring.basePA);2940 rqc->rxDataRingDescSize =2941 cpu_to_le16(rq->data_ring.desc_size);2942 }2943 if (VMXNET3_VERSION_GE_9(adapter)) {2944 rqtsc = &adapter->rqd_start[i].tsConf;2945 rqtsc->rxTSRingBasePA = cpu_to_le64(rq->ts_ring.basePA);2946 rqtsc->rxTSRingDescSize = cpu_to_le16(rq->rx_ts_desc_size);2947 }2948 }2949 2950#ifdef VMXNET3_RSS2951 memset(adapter->rss_conf, 0, sizeof(*adapter->rss_conf));2952 2953 if (adapter->rss) {2954 struct UPT1_RSSConf *rssConf = adapter->rss_conf;2955 2956 devRead->misc.uptFeatures |= UPT1_F_RSS;2957 devRead->misc.numRxQueues = adapter->num_rx_queues;2958 rssConf->hashType = UPT1_RSS_HASH_TYPE_TCP_IPV4 |2959 UPT1_RSS_HASH_TYPE_IPV4 |2960 UPT1_RSS_HASH_TYPE_TCP_IPV6 |2961 UPT1_RSS_HASH_TYPE_IPV6;2962 rssConf->hashFunc = UPT1_RSS_HASH_FUNC_TOEPLITZ;2963 rssConf->hashKeySize = UPT1_RSS_MAX_KEY_SIZE;2964 rssConf->indTableSize = VMXNET3_RSS_IND_TABLE_SIZE;2965 netdev_rss_key_fill(rssConf->hashKey, sizeof(rssConf->hashKey));2966 2967 for (i = 0; i < rssConf->indTableSize; i++)2968 rssConf->indTable[i] = ethtool_rxfh_indir_default(2969 i, adapter->num_rx_queues);2970 2971 devRead->rssConfDesc.confVer = 1;2972 devRead->rssConfDesc.confLen = cpu_to_le32(sizeof(*rssConf));2973 devRead->rssConfDesc.confPA =2974 cpu_to_le64(adapter->rss_conf_pa);2975 }2976 2977#endif /* VMXNET3_RSS */2978 2979 /* intr settings */2980 if (!VMXNET3_VERSION_GE_6(adapter) ||2981 !adapter->queuesExtEnabled) {2982 devRead->intrConf.autoMask = adapter->intr.mask_mode ==2983 VMXNET3_IMM_AUTO;2984 devRead->intrConf.numIntrs = adapter->intr.num_intrs;2985 for (i = 0; i < adapter->intr.num_intrs; i++)2986 devRead->intrConf.modLevels[i] = adapter->intr.mod_levels[i];2987 2988 devRead->intrConf.eventIntrIdx = adapter->intr.event_intr_idx;2989 devRead->intrConf.intrCtrl |= cpu_to_le32(VMXNET3_IC_DISABLE_ALL);2990 } else {2991 devReadExt->intrConfExt.autoMask = adapter->intr.mask_mode ==2992 VMXNET3_IMM_AUTO;2993 devReadExt->intrConfExt.numIntrs = adapter->intr.num_intrs;2994 for (i = 0; i < adapter->intr.num_intrs; i++)2995 devReadExt->intrConfExt.modLevels[i] = adapter->intr.mod_levels[i];2996 2997 devReadExt->intrConfExt.eventIntrIdx = adapter->intr.event_intr_idx;2998 devReadExt->intrConfExt.intrCtrl |= cpu_to_le32(VMXNET3_IC_DISABLE_ALL);2999 }3000 3001 /* rx filter settings */3002 devRead->rxFilterConf.rxMode = 0;3003 vmxnet3_restore_vlan(adapter);3004 vmxnet3_write_mac_addr(adapter, adapter->netdev->dev_addr);3005 3006 /* the rest are already zeroed */3007}3008 3009static void3010vmxnet3_init_bufsize(struct vmxnet3_adapter *adapter)3011{3012 struct Vmxnet3_DriverShared *shared = adapter->shared;3013 union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;3014 unsigned long flags;3015 3016 if (!VMXNET3_VERSION_GE_7(adapter))3017 return;3018 3019 cmdInfo->ringBufSize = adapter->ringBufSize;3020 spin_lock_irqsave(&adapter->cmd_lock, flags);3021 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3022 VMXNET3_CMD_SET_RING_BUFFER_SIZE);3023 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3024}3025 3026static void3027vmxnet3_init_coalesce(struct vmxnet3_adapter *adapter)3028{3029 struct Vmxnet3_DriverShared *shared = adapter->shared;3030 union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;3031 unsigned long flags;3032 3033 if (!VMXNET3_VERSION_GE_3(adapter))3034 return;3035 3036 spin_lock_irqsave(&adapter->cmd_lock, flags);3037 cmdInfo->varConf.confVer = 1;3038 cmdInfo->varConf.confLen =3039 cpu_to_le32(sizeof(*adapter->coal_conf));3040 cmdInfo->varConf.confPA = cpu_to_le64(adapter->coal_conf_pa);3041 3042 if (adapter->default_coal_mode) {3043 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3044 VMXNET3_CMD_GET_COALESCE);3045 } else {3046 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3047 VMXNET3_CMD_SET_COALESCE);3048 }3049 3050 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3051}3052 3053static void3054vmxnet3_init_rssfields(struct vmxnet3_adapter *adapter)3055{3056 struct Vmxnet3_DriverShared *shared = adapter->shared;3057 union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;3058 unsigned long flags;3059 3060 if (!VMXNET3_VERSION_GE_4(adapter))3061 return;3062 3063 spin_lock_irqsave(&adapter->cmd_lock, flags);3064 3065 if (adapter->default_rss_fields) {3066 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3067 VMXNET3_CMD_GET_RSS_FIELDS);3068 adapter->rss_fields =3069 VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3070 } else {3071 if (VMXNET3_VERSION_GE_7(adapter)) {3072 if ((adapter->rss_fields & VMXNET3_RSS_FIELDS_UDPIP4 ||3073 adapter->rss_fields & VMXNET3_RSS_FIELDS_UDPIP6) &&3074 vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3075 VMXNET3_CAP_UDP_RSS)) {3076 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_UDP_RSS;3077 } else {3078 adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_UDP_RSS);3079 }3080 3081 if ((adapter->rss_fields & VMXNET3_RSS_FIELDS_ESPIP4) &&3082 vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3083 VMXNET3_CAP_ESP_RSS_IPV4)) {3084 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_ESP_RSS_IPV4;3085 } else {3086 adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_ESP_RSS_IPV4);3087 }3088 3089 if ((adapter->rss_fields & VMXNET3_RSS_FIELDS_ESPIP6) &&3090 vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3091 VMXNET3_CAP_ESP_RSS_IPV6)) {3092 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_ESP_RSS_IPV6;3093 } else {3094 adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_ESP_RSS_IPV6);3095 }3096 3097 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR, adapter->dev_caps[0]);3098 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_DCR0_REG);3099 adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3100 }3101 cmdInfo->setRssFields = adapter->rss_fields;3102 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3103 VMXNET3_CMD_SET_RSS_FIELDS);3104 /* Not all requested RSS may get applied, so get and3105 * cache what was actually applied.3106 */3107 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3108 VMXNET3_CMD_GET_RSS_FIELDS);3109 adapter->rss_fields =3110 VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3111 }3112 3113 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3114}3115 3116int3117vmxnet3_activate_dev(struct vmxnet3_adapter *adapter)3118{3119 int err, i;3120 u32 ret;3121 unsigned long flags;3122 3123 netdev_dbg(adapter->netdev, "%s: skb_buf_size %d, rx_buf_per_pkt %d,"3124 " ring sizes %u %u %u\n", adapter->netdev->name,3125 adapter->skb_buf_size, adapter->rx_buf_per_pkt,3126 adapter->tx_queue[0].tx_ring.size,3127 adapter->rx_queue[0].rx_ring[0].size,3128 adapter->rx_queue[0].rx_ring[1].size);3129 3130 vmxnet3_tq_init_all(adapter);3131 err = vmxnet3_rq_init_all(adapter);3132 if (err) {3133 netdev_err(adapter->netdev,3134 "Failed to init rx queue error %d\n", err);3135 goto rq_err;3136 }3137 3138 err = vmxnet3_request_irqs(adapter);3139 if (err) {3140 netdev_err(adapter->netdev,3141 "Failed to setup irq for error %d\n", err);3142 goto irq_err;3143 }3144 3145 vmxnet3_setup_driver_shared(adapter);3146 3147 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAL, VMXNET3_GET_ADDR_LO(3148 adapter->shared_pa));3149 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAH, VMXNET3_GET_ADDR_HI(3150 adapter->shared_pa));3151 spin_lock_irqsave(&adapter->cmd_lock, flags);3152 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3153 VMXNET3_CMD_ACTIVATE_DEV);3154 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3155 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3156 3157 if (ret != 0) {3158 netdev_err(adapter->netdev,3159 "Failed to activate dev: error %u\n", ret);3160 err = -EINVAL;3161 goto activate_err;3162 }3163 3164 vmxnet3_init_bufsize(adapter);3165 vmxnet3_init_coalesce(adapter);3166 vmxnet3_init_rssfields(adapter);3167 3168 for (i = 0; i < adapter->num_rx_queues; i++) {3169 VMXNET3_WRITE_BAR0_REG(adapter,3170 adapter->rx_prod_offset + i * VMXNET3_REG_ALIGN,3171 adapter->rx_queue[i].rx_ring[0].next2fill);3172 VMXNET3_WRITE_BAR0_REG(adapter, (adapter->rx_prod2_offset +3173 (i * VMXNET3_REG_ALIGN)),3174 adapter->rx_queue[i].rx_ring[1].next2fill);3175 }3176 3177 /* Apply the rx filter settins last. */3178 vmxnet3_set_mc(adapter->netdev);3179 3180 /*3181 * Check link state when first activating device. It will start the3182 * tx queue if the link is up.3183 */3184 vmxnet3_check_link(adapter, true);3185 netif_tx_wake_all_queues(adapter->netdev);3186 for (i = 0; i < adapter->num_rx_queues; i++)3187 napi_enable(&adapter->rx_queue[i].napi);3188 vmxnet3_enable_all_intrs(adapter);3189 clear_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state);3190 return 0;3191 3192activate_err:3193 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAL, 0);3194 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DSAH, 0);3195 vmxnet3_free_irqs(adapter);3196irq_err:3197rq_err:3198 /* free up buffers we allocated */3199 vmxnet3_rq_cleanup_all(adapter);3200 return err;3201}3202 3203 3204void3205vmxnet3_reset_dev(struct vmxnet3_adapter *adapter)3206{3207 unsigned long flags;3208 spin_lock_irqsave(&adapter->cmd_lock, flags);3209 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);3210 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3211}3212 3213 3214int3215vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter)3216{3217 int i;3218 unsigned long flags;3219 if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state))3220 return 0;3221 3222 3223 spin_lock_irqsave(&adapter->cmd_lock, flags);3224 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3225 VMXNET3_CMD_QUIESCE_DEV);3226 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3227 vmxnet3_disable_all_intrs(adapter);3228 3229 for (i = 0; i < adapter->num_rx_queues; i++)3230 napi_disable(&adapter->rx_queue[i].napi);3231 netif_tx_disable(adapter->netdev);3232 adapter->link_speed = 0;3233 netif_carrier_off(adapter->netdev);3234 3235 vmxnet3_tq_cleanup_all(adapter);3236 vmxnet3_rq_cleanup_all(adapter);3237 vmxnet3_free_irqs(adapter);3238 return 0;3239}3240 3241 3242static void3243vmxnet3_write_mac_addr(struct vmxnet3_adapter *adapter, const u8 *mac)3244{3245 u32 tmp;3246 3247 tmp = *(u32 *)mac;3248 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_MACL, tmp);3249 3250 tmp = (mac[5] << 8) | mac[4];3251 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_MACH, tmp);3252}3253 3254 3255static int3256vmxnet3_set_mac_addr(struct net_device *netdev, void *p)3257{3258 struct sockaddr *addr = p;3259 struct vmxnet3_adapter *adapter = netdev_priv(netdev);3260 3261 dev_addr_set(netdev, addr->sa_data);3262 vmxnet3_write_mac_addr(adapter, addr->sa_data);3263 3264 return 0;3265}3266 3267 3268/* ==================== initialization and cleanup routines ============ */3269 3270static int3271vmxnet3_alloc_pci_resources(struct vmxnet3_adapter *adapter)3272{3273 int err;3274 unsigned long mmio_start, mmio_len;3275 struct pci_dev *pdev = adapter->pdev;3276 3277 err = pci_enable_device(pdev);3278 if (err) {3279 dev_err(&pdev->dev, "Failed to enable adapter: error %d\n", err);3280 return err;3281 }3282 3283 err = pci_request_selected_regions(pdev, (1 << 2) - 1,3284 vmxnet3_driver_name);3285 if (err) {3286 dev_err(&pdev->dev,3287 "Failed to request region for adapter: error %d\n", err);3288 goto err_enable_device;3289 }3290 3291 pci_set_master(pdev);3292 3293 mmio_start = pci_resource_start(pdev, 0);3294 mmio_len = pci_resource_len(pdev, 0);3295 adapter->hw_addr0 = ioremap(mmio_start, mmio_len);3296 if (!adapter->hw_addr0) {3297 dev_err(&pdev->dev, "Failed to map bar0\n");3298 err = -EIO;3299 goto err_ioremap;3300 }3301 3302 mmio_start = pci_resource_start(pdev, 1);3303 mmio_len = pci_resource_len(pdev, 1);3304 adapter->hw_addr1 = ioremap(mmio_start, mmio_len);3305 if (!adapter->hw_addr1) {3306 dev_err(&pdev->dev, "Failed to map bar1\n");3307 err = -EIO;3308 goto err_bar1;3309 }3310 return 0;3311 3312err_bar1:3313 iounmap(adapter->hw_addr0);3314err_ioremap:3315 pci_release_selected_regions(pdev, (1 << 2) - 1);3316err_enable_device:3317 pci_disable_device(pdev);3318 return err;3319}3320 3321 3322static void3323vmxnet3_free_pci_resources(struct vmxnet3_adapter *adapter)3324{3325 BUG_ON(!adapter->pdev);3326 3327 iounmap(adapter->hw_addr0);3328 iounmap(adapter->hw_addr1);3329 pci_release_selected_regions(adapter->pdev, (1 << 2) - 1);3330 pci_disable_device(adapter->pdev);3331}3332 3333 3334void3335vmxnet3_adjust_rx_ring_size(struct vmxnet3_adapter *adapter)3336{3337 size_t sz, i, ring0_size, ring1_size, comp_size;3338 /* With version7 ring1 will have only T0 buffers */3339 if (!VMXNET3_VERSION_GE_7(adapter)) {3340 if (adapter->netdev->mtu <= VMXNET3_MAX_SKB_BUF_SIZE -3341 VMXNET3_MAX_ETH_HDR_SIZE) {3342 adapter->skb_buf_size = adapter->netdev->mtu +3343 VMXNET3_MAX_ETH_HDR_SIZE;3344 if (adapter->skb_buf_size < VMXNET3_MIN_T0_BUF_SIZE)3345 adapter->skb_buf_size = VMXNET3_MIN_T0_BUF_SIZE;3346 3347 adapter->rx_buf_per_pkt = 1;3348 } else {3349 adapter->skb_buf_size = VMXNET3_MAX_SKB_BUF_SIZE;3350 sz = adapter->netdev->mtu - VMXNET3_MAX_SKB_BUF_SIZE +3351 VMXNET3_MAX_ETH_HDR_SIZE;3352 adapter->rx_buf_per_pkt = 1 + (sz + PAGE_SIZE - 1) / PAGE_SIZE;3353 }3354 } else {3355 adapter->skb_buf_size = min((int)adapter->netdev->mtu + VMXNET3_MAX_ETH_HDR_SIZE,3356 VMXNET3_MAX_SKB_BUF_SIZE);3357 adapter->rx_buf_per_pkt = 1;3358 adapter->ringBufSize.ring1BufSizeType0 = cpu_to_le16(adapter->skb_buf_size);3359 adapter->ringBufSize.ring1BufSizeType1 = 0;3360 adapter->ringBufSize.ring2BufSizeType1 = cpu_to_le16(PAGE_SIZE);3361 }3362 3363 /*3364 * for simplicity, force the ring0 size to be a multiple of3365 * rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN3366 */3367 sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN;3368 ring0_size = adapter->rx_queue[0].rx_ring[0].size;3369 ring0_size = (ring0_size + sz - 1) / sz * sz;3370 ring0_size = min_t(u32, ring0_size, VMXNET3_RX_RING_MAX_SIZE /3371 sz * sz);3372 ring1_size = adapter->rx_queue[0].rx_ring[1].size;3373 ring1_size = (ring1_size + sz - 1) / sz * sz;3374 ring1_size = min_t(u32, ring1_size, VMXNET3_RX_RING2_MAX_SIZE /3375 sz * sz);3376 /* For v7 and later, keep ring size power of 2 for UPT */3377 if (VMXNET3_VERSION_GE_7(adapter)) {3378 ring0_size = rounddown_pow_of_two(ring0_size);3379 ring1_size = rounddown_pow_of_two(ring1_size);3380 }3381 comp_size = ring0_size + ring1_size;3382 3383 for (i = 0; i < adapter->num_rx_queues; i++) {3384 struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i];3385 3386 rq->rx_ring[0].size = ring0_size;3387 rq->rx_ring[1].size = ring1_size;3388 rq->comp_ring.size = comp_size;3389 }3390}3391 3392 3393int3394vmxnet3_create_queues(struct vmxnet3_adapter *adapter, u32 tx_ring_size,3395 u32 rx_ring_size, u32 rx_ring2_size,3396 u16 txdata_desc_size, u16 rxdata_desc_size)3397{3398 int err = 0, i;3399 3400 for (i = 0; i < adapter->num_tx_queues; i++) {3401 struct vmxnet3_tx_queue *tq = &adapter->tx_queue[i];3402 tq->tx_ring.size = tx_ring_size;3403 tq->data_ring.size = tx_ring_size;3404 tq->comp_ring.size = tx_ring_size;3405 tq->txdata_desc_size = txdata_desc_size;3406 tq->shared = &adapter->tqd_start[i].ctrl;3407 tq->stopped = true;3408 tq->adapter = adapter;3409 tq->qid = i;3410 tq->tx_ts_desc_size = adapter->tx_ts_desc_size;3411 tq->tsPktCount = 1;3412 err = vmxnet3_tq_create(tq, adapter);3413 /*3414 * Too late to change num_tx_queues. We cannot do away with3415 * lesser number of queues than what we asked for3416 */3417 if (err)3418 goto queue_err;3419 }3420 3421 adapter->rx_queue[0].rx_ring[0].size = rx_ring_size;3422 adapter->rx_queue[0].rx_ring[1].size = rx_ring2_size;3423 vmxnet3_adjust_rx_ring_size(adapter);3424 3425 adapter->rxdataring_enabled = VMXNET3_VERSION_GE_3(adapter);3426 for (i = 0; i < adapter->num_rx_queues; i++) {3427 struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i];3428 /* qid and qid2 for rx queues will be assigned later when num3429 * of rx queues is finalized after allocating intrs */3430 rq->shared = &adapter->rqd_start[i].ctrl;3431 rq->adapter = adapter;3432 rq->data_ring.desc_size = rxdata_desc_size;3433 rq->rx_ts_desc_size = adapter->rx_ts_desc_size;3434 err = vmxnet3_rq_create(rq, adapter);3435 if (err) {3436 if (i == 0) {3437 netdev_err(adapter->netdev,3438 "Could not allocate any rx queues. "3439 "Aborting.\n");3440 goto queue_err;3441 } else {3442 netdev_info(adapter->netdev,3443 "Number of rx queues changed "3444 "to : %d.\n", i);3445 adapter->num_rx_queues = i;3446 err = 0;3447 break;3448 }3449 }3450 }3451 3452 if (!adapter->rxdataring_enabled)3453 vmxnet3_rq_destroy_all_rxdataring(adapter);3454 3455 return err;3456queue_err:3457 vmxnet3_tq_destroy_all(adapter);3458 return err;3459}3460 3461static int3462vmxnet3_open(struct net_device *netdev)3463{3464 struct vmxnet3_adapter *adapter;3465 int err, i;3466 3467 adapter = netdev_priv(netdev);3468 3469 for (i = 0; i < adapter->num_tx_queues; i++)3470 spin_lock_init(&adapter->tx_queue[i].tx_lock);3471 3472 if (VMXNET3_VERSION_GE_3(adapter)) {3473 unsigned long flags;3474 u16 txdata_desc_size;3475 u32 ret;3476 3477 spin_lock_irqsave(&adapter->cmd_lock, flags);3478 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3479 VMXNET3_CMD_GET_TXDATA_DESC_SIZE);3480 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3481 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3482 3483 txdata_desc_size = ret & 0xffff;3484 if ((txdata_desc_size < VMXNET3_TXDATA_DESC_MIN_SIZE) ||3485 (txdata_desc_size > VMXNET3_TXDATA_DESC_MAX_SIZE) ||3486 (txdata_desc_size & VMXNET3_TXDATA_DESC_SIZE_MASK)) {3487 adapter->txdata_desc_size =3488 sizeof(struct Vmxnet3_TxDataDesc);3489 } else {3490 adapter->txdata_desc_size = txdata_desc_size;3491 }3492 if (VMXNET3_VERSION_GE_9(adapter))3493 adapter->rxdata_desc_size = (ret >> 16) & 0xffff;3494 } else {3495 adapter->txdata_desc_size = sizeof(struct Vmxnet3_TxDataDesc);3496 }3497 3498 if (VMXNET3_VERSION_GE_9(adapter)) {3499 unsigned long flags;3500 u16 tx_ts_desc_size = 0;3501 u16 rx_ts_desc_size = 0;3502 u32 ret;3503 3504 spin_lock_irqsave(&adapter->cmd_lock, flags);3505 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3506 VMXNET3_CMD_GET_TSRING_DESC_SIZE);3507 ret = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3508 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3509 if (ret > 0) {3510 tx_ts_desc_size = (ret & 0xff);3511 rx_ts_desc_size = ((ret >> 16) & 0xff);3512 }3513 if (tx_ts_desc_size > VMXNET3_TXTS_DESC_MAX_SIZE ||3514 tx_ts_desc_size & VMXNET3_TXTS_DESC_SIZE_MASK)3515 tx_ts_desc_size = 0;3516 if (rx_ts_desc_size > VMXNET3_RXTS_DESC_MAX_SIZE ||3517 rx_ts_desc_size & VMXNET3_RXTS_DESC_SIZE_MASK)3518 rx_ts_desc_size = 0;3519 adapter->tx_ts_desc_size = tx_ts_desc_size;3520 adapter->rx_ts_desc_size = rx_ts_desc_size;3521 } else {3522 adapter->tx_ts_desc_size = 0;3523 adapter->rx_ts_desc_size = 0;3524 }3525 3526 err = vmxnet3_create_queues(adapter,3527 adapter->tx_ring_size,3528 adapter->rx_ring_size,3529 adapter->rx_ring2_size,3530 adapter->txdata_desc_size,3531 adapter->rxdata_desc_size);3532 if (err)3533 goto queue_err;3534 3535 err = vmxnet3_activate_dev(adapter);3536 if (err)3537 goto activate_err;3538 3539 return 0;3540 3541activate_err:3542 vmxnet3_rq_destroy_all(adapter);3543 vmxnet3_tq_destroy_all(adapter);3544queue_err:3545 return err;3546}3547 3548 3549static int3550vmxnet3_close(struct net_device *netdev)3551{3552 struct vmxnet3_adapter *adapter = netdev_priv(netdev);3553 3554 /*3555 * Reset_work may be in the middle of resetting the device, wait for its3556 * completion.3557 */3558 while (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state))3559 usleep_range(1000, 2000);3560 3561 vmxnet3_quiesce_dev(adapter);3562 3563 vmxnet3_rq_destroy_all(adapter);3564 vmxnet3_tq_destroy_all(adapter);3565 3566 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);3567 3568 3569 return 0;3570}3571 3572 3573void3574vmxnet3_force_close(struct vmxnet3_adapter *adapter)3575{3576 int i;3577 3578 /*3579 * we must clear VMXNET3_STATE_BIT_RESETTING, otherwise3580 * vmxnet3_close() will deadlock.3581 */3582 BUG_ON(test_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state));3583 3584 /* we need to enable NAPI, otherwise dev_close will deadlock */3585 for (i = 0; i < adapter->num_rx_queues; i++)3586 napi_enable(&adapter->rx_queue[i].napi);3587 /*3588 * Need to clear the quiesce bit to ensure that vmxnet3_close3589 * can quiesce the device properly3590 */3591 clear_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state);3592 dev_close(adapter->netdev);3593}3594 3595 3596static int3597vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)3598{3599 struct vmxnet3_adapter *adapter = netdev_priv(netdev);3600 int err = 0;3601 3602 WRITE_ONCE(netdev->mtu, new_mtu);3603 3604 /*3605 * Reset_work may be in the middle of resetting the device, wait for its3606 * completion.3607 */3608 while (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state))3609 usleep_range(1000, 2000);3610 3611 if (netif_running(netdev)) {3612 vmxnet3_quiesce_dev(adapter);3613 vmxnet3_reset_dev(adapter);3614 3615 /* we need to re-create the rx queue based on the new mtu */3616 vmxnet3_rq_destroy_all(adapter);3617 vmxnet3_adjust_rx_ring_size(adapter);3618 err = vmxnet3_rq_create_all(adapter);3619 if (err) {3620 netdev_err(netdev,3621 "failed to re-create rx queues, "3622 " error %d. Closing it.\n", err);3623 goto out;3624 }3625 3626 err = vmxnet3_activate_dev(adapter);3627 if (err) {3628 netdev_err(netdev,3629 "failed to re-activate, error %d. "3630 "Closing it\n", err);3631 goto out;3632 }3633 }3634 3635out:3636 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);3637 if (err)3638 vmxnet3_force_close(adapter);3639 3640 return err;3641}3642 3643 3644static void3645vmxnet3_declare_features(struct vmxnet3_adapter *adapter)3646{3647 struct net_device *netdev = adapter->netdev;3648 unsigned long flags;3649 3650 if (VMXNET3_VERSION_GE_9(adapter)) {3651 spin_lock_irqsave(&adapter->cmd_lock, flags);3652 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3653 VMXNET3_CMD_GET_DISABLED_OFFLOADS);3654 adapter->disabledOffloads = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3655 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3656 }3657 3658 netdev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM |3659 NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_TX |3660 NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_TSO | NETIF_F_TSO6 |3661 NETIF_F_LRO | NETIF_F_HIGHDMA;3662 3663 if (VMXNET3_VERSION_GE_4(adapter)) {3664 netdev->hw_features |= NETIF_F_GSO_UDP_TUNNEL |3665 NETIF_F_GSO_UDP_TUNNEL_CSUM;3666 3667 netdev->hw_enc_features = NETIF_F_SG | NETIF_F_RXCSUM |3668 NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_TX |3669 NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_TSO | NETIF_F_TSO6 |3670 NETIF_F_LRO | NETIF_F_GSO_UDP_TUNNEL |3671 NETIF_F_GSO_UDP_TUNNEL_CSUM;3672 }3673 3674 if (adapter->disabledOffloads & VMXNET3_OFFLOAD_TSO) {3675 netdev->hw_features &= ~(NETIF_F_TSO | NETIF_F_TSO6);3676 netdev->hw_enc_features &= ~(NETIF_F_TSO | NETIF_F_TSO6);3677 }3678 3679 if (adapter->disabledOffloads & VMXNET3_OFFLOAD_LRO) {3680 netdev->hw_features &= ~(NETIF_F_LRO);3681 netdev->hw_enc_features &= ~(NETIF_F_LRO);3682 }3683 3684 if (VMXNET3_VERSION_GE_7(adapter)) {3685 unsigned long flags;3686 3687 if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3688 VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD)) {3689 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD;3690 }3691 if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3692 VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD)) {3693 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD;3694 }3695 if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3696 VMXNET3_CAP_GENEVE_TSO)) {3697 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_GENEVE_TSO;3698 }3699 if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3700 VMXNET3_CAP_VXLAN_TSO)) {3701 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_VXLAN_TSO;3702 }3703 if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3704 VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD)) {3705 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD;3706 }3707 if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],3708 VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD)) {3709 adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD;3710 }3711 3712 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR, adapter->dev_caps[0]);3713 spin_lock_irqsave(&adapter->cmd_lock, flags);3714 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_DCR0_REG);3715 adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3716 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3717 3718 if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD)) &&3719 !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD)) &&3720 !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_TSO)) &&3721 !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_TSO))) {3722 netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL;3723 netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL;3724 }3725 if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD)) &&3726 !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD))) {3727 netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;3728 netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;3729 }3730 }3731 3732 netdev->vlan_features = netdev->hw_features &3733 ~(NETIF_F_HW_VLAN_CTAG_TX |3734 NETIF_F_HW_VLAN_CTAG_RX);3735 netdev->features = netdev->hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;3736}3737 3738 3739static void3740vmxnet3_read_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac)3741{3742 u32 tmp;3743 3744 tmp = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_MACL);3745 *(u32 *)mac = tmp;3746 3747 tmp = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_MACH);3748 mac[4] = tmp & 0xff;3749 mac[5] = (tmp >> 8) & 0xff;3750}3751 3752#ifdef CONFIG_PCI_MSI3753 3754/*3755 * Enable MSIx vectors.3756 * Returns :3757 * VMXNET3_LINUX_MIN_MSIX_VECT when only minimum number of vectors required3758 * were enabled.3759 * number of vectors which were enabled otherwise (this number is greater3760 * than VMXNET3_LINUX_MIN_MSIX_VECT)3761 */3762 3763static int3764vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, int nvec)3765{3766 int ret = pci_enable_msix_range(adapter->pdev,3767 adapter->intr.msix_entries, nvec, nvec);3768 3769 if (ret == -ENOSPC && nvec > VMXNET3_LINUX_MIN_MSIX_VECT) {3770 dev_err(&adapter->netdev->dev,3771 "Failed to enable %d MSI-X, trying %d\n",3772 nvec, VMXNET3_LINUX_MIN_MSIX_VECT);3773 3774 ret = pci_enable_msix_range(adapter->pdev,3775 adapter->intr.msix_entries,3776 VMXNET3_LINUX_MIN_MSIX_VECT,3777 VMXNET3_LINUX_MIN_MSIX_VECT);3778 }3779 3780 if (ret < 0) {3781 dev_err(&adapter->netdev->dev,3782 "Failed to enable MSI-X, error: %d\n", ret);3783 }3784 3785 return ret;3786}3787 3788 3789#endif /* CONFIG_PCI_MSI */3790 3791static void3792vmxnet3_alloc_intr_resources(struct vmxnet3_adapter *adapter)3793{3794 u32 cfg;3795 unsigned long flags;3796 3797 /* intr settings */3798 spin_lock_irqsave(&adapter->cmd_lock, flags);3799 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,3800 VMXNET3_CMD_GET_CONF_INTR);3801 cfg = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);3802 spin_unlock_irqrestore(&adapter->cmd_lock, flags);3803 adapter->intr.type = cfg & 0x3;3804 adapter->intr.mask_mode = (cfg >> 2) & 0x3;3805 3806 if (adapter->intr.type == VMXNET3_IT_AUTO) {3807 adapter->intr.type = VMXNET3_IT_MSIX;3808 }3809 3810#ifdef CONFIG_PCI_MSI3811 if (adapter->intr.type == VMXNET3_IT_MSIX) {3812 int i, nvec, nvec_allocated;3813 3814 nvec = adapter->share_intr == VMXNET3_INTR_TXSHARE ?3815 1 : adapter->num_tx_queues;3816 nvec += adapter->share_intr == VMXNET3_INTR_BUDDYSHARE ?3817 0 : adapter->num_rx_queues;3818 nvec += 1; /* for link event */3819 nvec = nvec > VMXNET3_LINUX_MIN_MSIX_VECT ?3820 nvec : VMXNET3_LINUX_MIN_MSIX_VECT;3821 3822 for (i = 0; i < nvec; i++)3823 adapter->intr.msix_entries[i].entry = i;3824 3825 nvec_allocated = vmxnet3_acquire_msix_vectors(adapter, nvec);3826 if (nvec_allocated < 0)3827 goto msix_err;3828 3829 /* If we cannot allocate one MSIx vector per queue3830 * then limit the number of rx queues to 13831 */3832 if (nvec_allocated == VMXNET3_LINUX_MIN_MSIX_VECT &&3833 nvec != VMXNET3_LINUX_MIN_MSIX_VECT) {3834 if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE3835 || adapter->num_rx_queues != 1) {3836 adapter->share_intr = VMXNET3_INTR_TXSHARE;3837 netdev_err(adapter->netdev,3838 "Number of rx queues : 1\n");3839 adapter->num_rx_queues = 1;3840 }3841 }3842 3843 adapter->intr.num_intrs = nvec_allocated;3844 return;3845 3846msix_err:3847 /* If we cannot allocate MSIx vectors use only one rx queue */3848 dev_info(&adapter->pdev->dev,3849 "Failed to enable MSI-X, error %d. "3850 "Limiting #rx queues to 1, try MSI.\n", nvec_allocated);3851 3852 adapter->intr.type = VMXNET3_IT_MSI;3853 }3854 3855 if (adapter->intr.type == VMXNET3_IT_MSI) {3856 if (!pci_enable_msi(adapter->pdev)) {3857 adapter->num_rx_queues = 1;3858 adapter->intr.num_intrs = 1;3859 return;3860 }3861 }3862#endif /* CONFIG_PCI_MSI */3863 3864 adapter->num_rx_queues = 1;3865 dev_info(&adapter->netdev->dev,3866 "Using INTx interrupt, #Rx queues: 1.\n");3867 adapter->intr.type = VMXNET3_IT_INTX;3868 3869 /* INT-X related setting */3870 adapter->intr.num_intrs = 1;3871}3872 3873 3874static void3875vmxnet3_free_intr_resources(struct vmxnet3_adapter *adapter)3876{3877 if (adapter->intr.type == VMXNET3_IT_MSIX)3878 pci_disable_msix(adapter->pdev);3879 else if (adapter->intr.type == VMXNET3_IT_MSI)3880 pci_disable_msi(adapter->pdev);3881 else3882 BUG_ON(adapter->intr.type != VMXNET3_IT_INTX);3883}3884 3885 3886static void3887vmxnet3_tx_timeout(struct net_device *netdev, unsigned int txqueue)3888{3889 struct vmxnet3_adapter *adapter = netdev_priv(netdev);3890 adapter->tx_timeout_count++;3891 3892 netdev_err(adapter->netdev, "tx hang\n");3893 schedule_work(&adapter->work);3894}3895 3896 3897static void3898vmxnet3_reset_work(struct work_struct *data)3899{3900 struct vmxnet3_adapter *adapter;3901 3902 adapter = container_of(data, struct vmxnet3_adapter, work);3903 3904 /* if another thread is resetting the device, no need to proceed */3905 if (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state))3906 return;3907 3908 /* if the device is closed, we must leave it alone */3909 rtnl_lock();3910 if (netif_running(adapter->netdev)) {3911 netdev_notice(adapter->netdev, "resetting\n");3912 vmxnet3_quiesce_dev(adapter);3913 vmxnet3_reset_dev(adapter);3914 vmxnet3_activate_dev(adapter);3915 } else {3916 netdev_info(adapter->netdev, "already closed\n");3917 }3918 rtnl_unlock();3919 3920 netif_wake_queue(adapter->netdev);3921 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);3922}3923 3924 3925static int3926vmxnet3_probe_device(struct pci_dev *pdev,3927 const struct pci_device_id *id)3928{3929 static const struct net_device_ops vmxnet3_netdev_ops = {3930 .ndo_open = vmxnet3_open,3931 .ndo_stop = vmxnet3_close,3932 .ndo_start_xmit = vmxnet3_xmit_frame,3933 .ndo_set_mac_address = vmxnet3_set_mac_addr,3934 .ndo_change_mtu = vmxnet3_change_mtu,3935 .ndo_fix_features = vmxnet3_fix_features,3936 .ndo_set_features = vmxnet3_set_features,3937 .ndo_features_check = vmxnet3_features_check,3938 .ndo_get_stats64 = vmxnet3_get_stats64,3939 .ndo_tx_timeout = vmxnet3_tx_timeout,3940 .ndo_set_rx_mode = vmxnet3_set_mc,3941 .ndo_vlan_rx_add_vid = vmxnet3_vlan_rx_add_vid,3942 .ndo_vlan_rx_kill_vid = vmxnet3_vlan_rx_kill_vid,3943#ifdef CONFIG_NET_POLL_CONTROLLER3944 .ndo_poll_controller = vmxnet3_netpoll,3945#endif3946 .ndo_bpf = vmxnet3_xdp,3947 .ndo_xdp_xmit = vmxnet3_xdp_xmit,3948 };3949 int err;3950 u32 ver;3951 struct net_device *netdev;3952 struct vmxnet3_adapter *adapter;3953 u8 mac[ETH_ALEN];3954 int size, i;3955 int num_tx_queues;3956 int num_rx_queues;3957 int queues;3958 unsigned long flags;3959 3960 if (!pci_msi_enabled())3961 enable_mq = 0;3962 3963#ifdef VMXNET3_RSS3964 if (enable_mq)3965 num_rx_queues = min(VMXNET3_DEVICE_MAX_RX_QUEUES,3966 (int)num_online_cpus());3967 else3968#endif3969 num_rx_queues = 1;3970 3971 if (enable_mq)3972 num_tx_queues = min(VMXNET3_DEVICE_MAX_TX_QUEUES,3973 (int)num_online_cpus());3974 else3975 num_tx_queues = 1;3976 3977 netdev = alloc_etherdev_mq(sizeof(struct vmxnet3_adapter),3978 max(num_tx_queues, num_rx_queues));3979 if (!netdev)3980 return -ENOMEM;3981 3982 pci_set_drvdata(pdev, netdev);3983 adapter = netdev_priv(netdev);3984 adapter->netdev = netdev;3985 adapter->pdev = pdev;3986 3987 adapter->tx_ring_size = VMXNET3_DEF_TX_RING_SIZE;3988 adapter->rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;3989 adapter->rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;3990 3991 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));3992 if (err) {3993 dev_err(&pdev->dev, "dma_set_mask failed\n");3994 goto err_set_mask;3995 }3996 3997 spin_lock_init(&adapter->cmd_lock);3998 adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter,3999 sizeof(struct vmxnet3_adapter),4000 DMA_TO_DEVICE);4001 if (dma_mapping_error(&adapter->pdev->dev, adapter->adapter_pa)) {4002 dev_err(&pdev->dev, "Failed to map dma\n");4003 err = -EFAULT;4004 goto err_set_mask;4005 }4006 adapter->shared = dma_alloc_coherent(4007 &adapter->pdev->dev,4008 sizeof(struct Vmxnet3_DriverShared),4009 &adapter->shared_pa, GFP_KERNEL);4010 if (!adapter->shared) {4011 dev_err(&pdev->dev, "Failed to allocate memory\n");4012 err = -ENOMEM;4013 goto err_alloc_shared;4014 }4015 4016 err = vmxnet3_alloc_pci_resources(adapter);4017 if (err < 0)4018 goto err_alloc_pci;4019 4020 ver = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_VRRS);4021 for (i = VMXNET3_REV_9; i >= VMXNET3_REV_1; i--) {4022 if (ver & (1 << i)) {4023 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_VRRS, 1 << i);4024 adapter->version = i + 1;4025 break;4026 }4027 }4028 if (i < VMXNET3_REV_1) {4029 dev_err(&pdev->dev,4030 "Incompatible h/w version (0x%x) for adapter\n", ver);4031 err = -EBUSY;4032 goto err_ver;4033 }4034 dev_dbg(&pdev->dev, "Using device version %d\n", adapter->version);4035 4036 ver = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_UVRS);4037 if (ver & 1) {4038 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_UVRS, 1);4039 } else {4040 dev_err(&pdev->dev,4041 "Incompatible upt version (0x%x) for adapter\n", ver);4042 err = -EBUSY;4043 goto err_ver;4044 }4045 4046 if (VMXNET3_VERSION_GE_7(adapter)) {4047 adapter->devcap_supported[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_DCR);4048 adapter->ptcap_supported[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_PTCR);4049 if (adapter->devcap_supported[0] & (1UL << VMXNET3_CAP_LARGE_BAR)) {4050 adapter->dev_caps[0] = adapter->devcap_supported[0] &4051 (1UL << VMXNET3_CAP_LARGE_BAR);4052 }4053 if (!(adapter->ptcap_supported[0] & (1UL << VMXNET3_DCR_ERROR)) &&4054 adapter->ptcap_supported[0] & (1UL << VMXNET3_CAP_OOORX_COMP) &&4055 adapter->devcap_supported[0] & (1UL << VMXNET3_CAP_OOORX_COMP)) {4056 adapter->dev_caps[0] |= adapter->devcap_supported[0] &4057 (1UL << VMXNET3_CAP_OOORX_COMP);4058 }4059 if (adapter->dev_caps[0])4060 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR, adapter->dev_caps[0]);4061 4062 spin_lock_irqsave(&adapter->cmd_lock, flags);4063 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_DCR0_REG);4064 adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);4065 spin_unlock_irqrestore(&adapter->cmd_lock, flags);4066 }4067 4068 if (VMXNET3_VERSION_GE_7(adapter) &&4069 adapter->dev_caps[0] & (1UL << VMXNET3_CAP_LARGE_BAR)) {4070 adapter->tx_prod_offset = VMXNET3_REG_LB_TXPROD;4071 adapter->rx_prod_offset = VMXNET3_REG_LB_RXPROD;4072 adapter->rx_prod2_offset = VMXNET3_REG_LB_RXPROD2;4073 } else {4074 adapter->tx_prod_offset = VMXNET3_REG_TXPROD;4075 adapter->rx_prod_offset = VMXNET3_REG_RXPROD;4076 adapter->rx_prod2_offset = VMXNET3_REG_RXPROD2;4077 }4078 4079 if (VMXNET3_VERSION_GE_6(adapter)) {4080 spin_lock_irqsave(&adapter->cmd_lock, flags);4081 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,4082 VMXNET3_CMD_GET_MAX_QUEUES_CONF);4083 queues = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);4084 spin_unlock_irqrestore(&adapter->cmd_lock, flags);4085 if (queues > 0) {4086 adapter->num_rx_queues = min(num_rx_queues, ((queues >> 8) & 0xff));4087 adapter->num_tx_queues = min(num_tx_queues, (queues & 0xff));4088 } else {4089 adapter->num_rx_queues = min(num_rx_queues,4090 VMXNET3_DEVICE_DEFAULT_RX_QUEUES);4091 adapter->num_tx_queues = min(num_tx_queues,4092 VMXNET3_DEVICE_DEFAULT_TX_QUEUES);4093 }4094 if (adapter->num_rx_queues > VMXNET3_MAX_RX_QUEUES ||4095 adapter->num_tx_queues > VMXNET3_MAX_TX_QUEUES) {4096 adapter->queuesExtEnabled = true;4097 } else {4098 adapter->queuesExtEnabled = false;4099 }4100 } else {4101 adapter->queuesExtEnabled = false;4102 num_rx_queues = rounddown_pow_of_two(num_rx_queues);4103 num_tx_queues = rounddown_pow_of_two(num_tx_queues);4104 adapter->num_rx_queues = min(num_rx_queues,4105 VMXNET3_DEVICE_DEFAULT_RX_QUEUES);4106 adapter->num_tx_queues = min(num_tx_queues,4107 VMXNET3_DEVICE_DEFAULT_TX_QUEUES);4108 }4109 dev_info(&pdev->dev,4110 "# of Tx queues : %d, # of Rx queues : %d\n",4111 adapter->num_tx_queues, adapter->num_rx_queues);4112 4113 adapter->rx_buf_per_pkt = 1;4114 4115 size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues;4116 size += sizeof(struct Vmxnet3_RxQueueDesc) * adapter->num_rx_queues;4117 adapter->tqd_start = dma_alloc_coherent(&adapter->pdev->dev, size,4118 &adapter->queue_desc_pa,4119 GFP_KERNEL);4120 4121 if (!adapter->tqd_start) {4122 dev_err(&pdev->dev, "Failed to allocate memory\n");4123 err = -ENOMEM;4124 goto err_ver;4125 }4126 adapter->rqd_start = (struct Vmxnet3_RxQueueDesc *)(adapter->tqd_start +4127 adapter->num_tx_queues);4128 if (VMXNET3_VERSION_GE_9(adapter))4129 adapter->latencyConf = &adapter->tqd_start->tsConf.latencyConf;4130 4131 adapter->pm_conf = dma_alloc_coherent(&adapter->pdev->dev,4132 sizeof(struct Vmxnet3_PMConf),4133 &adapter->pm_conf_pa,4134 GFP_KERNEL);4135 if (adapter->pm_conf == NULL) {4136 err = -ENOMEM;4137 goto err_alloc_pm;4138 }4139 4140#ifdef VMXNET3_RSS4141 4142 adapter->rss_conf = dma_alloc_coherent(&adapter->pdev->dev,4143 sizeof(struct UPT1_RSSConf),4144 &adapter->rss_conf_pa,4145 GFP_KERNEL);4146 if (adapter->rss_conf == NULL) {4147 err = -ENOMEM;4148 goto err_alloc_rss;4149 }4150#endif /* VMXNET3_RSS */4151 4152 if (VMXNET3_VERSION_GE_3(adapter)) {4153 adapter->coal_conf =4154 dma_alloc_coherent(&adapter->pdev->dev,4155 sizeof(struct Vmxnet3_CoalesceScheme)4156 ,4157 &adapter->coal_conf_pa,4158 GFP_KERNEL);4159 if (!adapter->coal_conf) {4160 err = -ENOMEM;4161 goto err_coal_conf;4162 }4163 adapter->coal_conf->coalMode = VMXNET3_COALESCE_DISABLED;4164 adapter->default_coal_mode = true;4165 }4166 4167 if (VMXNET3_VERSION_GE_4(adapter)) {4168 adapter->default_rss_fields = true;4169 adapter->rss_fields = VMXNET3_RSS_FIELDS_DEFAULT;4170 }4171 4172 SET_NETDEV_DEV(netdev, &pdev->dev);4173 vmxnet3_declare_features(adapter);4174 netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |4175 NETDEV_XDP_ACT_NDO_XMIT;4176 4177 adapter->rxdata_desc_size = VMXNET3_VERSION_GE_3(adapter) ?4178 VMXNET3_DEF_RXDATA_DESC_SIZE : 0;4179 4180 if (adapter->num_tx_queues == adapter->num_rx_queues)4181 adapter->share_intr = VMXNET3_INTR_BUDDYSHARE;4182 else4183 adapter->share_intr = VMXNET3_INTR_DONTSHARE;4184 4185 vmxnet3_alloc_intr_resources(adapter);4186 4187#ifdef VMXNET3_RSS4188 if (adapter->num_rx_queues > 1 &&4189 adapter->intr.type == VMXNET3_IT_MSIX) {4190 adapter->rss = true;4191 netdev->hw_features |= NETIF_F_RXHASH;4192 netdev->features |= NETIF_F_RXHASH;4193 dev_dbg(&pdev->dev, "RSS is enabled.\n");4194 } else {4195 adapter->rss = false;4196 }4197#endif4198 4199 vmxnet3_read_mac_addr(adapter, mac);4200 dev_addr_set(netdev, mac);4201 4202 netdev->netdev_ops = &vmxnet3_netdev_ops;4203 vmxnet3_set_ethtool_ops(netdev);4204 netdev->watchdog_timeo = 5 * HZ;4205 4206 /* MTU range: 60 - 9190 */4207 netdev->min_mtu = VMXNET3_MIN_MTU;4208 if (VMXNET3_VERSION_GE_6(adapter))4209 netdev->max_mtu = VMXNET3_V6_MAX_MTU;4210 else4211 netdev->max_mtu = VMXNET3_MAX_MTU;4212 4213 INIT_WORK(&adapter->work, vmxnet3_reset_work);4214 set_bit(VMXNET3_STATE_BIT_QUIESCED, &adapter->state);4215 4216 if (adapter->intr.type == VMXNET3_IT_MSIX) {4217 int i;4218 for (i = 0; i < adapter->num_rx_queues; i++) {4219 netif_napi_add(adapter->netdev,4220 &adapter->rx_queue[i].napi,4221 vmxnet3_poll_rx_only);4222 }4223 } else {4224 netif_napi_add(adapter->netdev, &adapter->rx_queue[0].napi,4225 vmxnet3_poll);4226 }4227 4228 netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues);4229 netif_set_real_num_rx_queues(adapter->netdev, adapter->num_rx_queues);4230 4231 netif_carrier_off(netdev);4232 err = register_netdev(netdev);4233 4234 if (err) {4235 dev_err(&pdev->dev, "Failed to register adapter\n");4236 goto err_register;4237 }4238 4239 vmxnet3_check_link(adapter, false);4240 return 0;4241 4242err_register:4243 if (VMXNET3_VERSION_GE_3(adapter)) {4244 dma_free_coherent(&adapter->pdev->dev,4245 sizeof(struct Vmxnet3_CoalesceScheme),4246 adapter->coal_conf, adapter->coal_conf_pa);4247 }4248 vmxnet3_free_intr_resources(adapter);4249err_coal_conf:4250#ifdef VMXNET3_RSS4251 dma_free_coherent(&adapter->pdev->dev, sizeof(struct UPT1_RSSConf),4252 adapter->rss_conf, adapter->rss_conf_pa);4253err_alloc_rss:4254#endif4255 dma_free_coherent(&adapter->pdev->dev, sizeof(struct Vmxnet3_PMConf),4256 adapter->pm_conf, adapter->pm_conf_pa);4257err_alloc_pm:4258 dma_free_coherent(&adapter->pdev->dev, size, adapter->tqd_start,4259 adapter->queue_desc_pa);4260err_ver:4261 vmxnet3_free_pci_resources(adapter);4262err_alloc_pci:4263 dma_free_coherent(&adapter->pdev->dev,4264 sizeof(struct Vmxnet3_DriverShared),4265 adapter->shared, adapter->shared_pa);4266err_alloc_shared:4267 dma_unmap_single(&adapter->pdev->dev, adapter->adapter_pa,4268 sizeof(struct vmxnet3_adapter), DMA_TO_DEVICE);4269err_set_mask:4270 free_netdev(netdev);4271 return err;4272}4273 4274 4275static void4276vmxnet3_remove_device(struct pci_dev *pdev)4277{4278 struct net_device *netdev = pci_get_drvdata(pdev);4279 struct vmxnet3_adapter *adapter = netdev_priv(netdev);4280 int size = 0;4281 int num_rx_queues, rx_queues;4282 unsigned long flags;4283 4284#ifdef VMXNET3_RSS4285 if (enable_mq)4286 num_rx_queues = min(VMXNET3_DEVICE_MAX_RX_QUEUES,4287 (int)num_online_cpus());4288 else4289#endif4290 num_rx_queues = 1;4291 if (!VMXNET3_VERSION_GE_6(adapter)) {4292 num_rx_queues = rounddown_pow_of_two(num_rx_queues);4293 }4294 if (VMXNET3_VERSION_GE_6(adapter)) {4295 spin_lock_irqsave(&adapter->cmd_lock, flags);4296 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,4297 VMXNET3_CMD_GET_MAX_QUEUES_CONF);4298 rx_queues = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);4299 spin_unlock_irqrestore(&adapter->cmd_lock, flags);4300 if (rx_queues > 0)4301 rx_queues = (rx_queues >> 8) & 0xff;4302 else4303 rx_queues = min(num_rx_queues, VMXNET3_DEVICE_DEFAULT_RX_QUEUES);4304 num_rx_queues = min(num_rx_queues, rx_queues);4305 } else {4306 num_rx_queues = min(num_rx_queues,4307 VMXNET3_DEVICE_DEFAULT_RX_QUEUES);4308 }4309 4310 cancel_work_sync(&adapter->work);4311 4312 unregister_netdev(netdev);4313 4314 vmxnet3_free_intr_resources(adapter);4315 vmxnet3_free_pci_resources(adapter);4316 if (VMXNET3_VERSION_GE_3(adapter)) {4317 dma_free_coherent(&adapter->pdev->dev,4318 sizeof(struct Vmxnet3_CoalesceScheme),4319 adapter->coal_conf, adapter->coal_conf_pa);4320 }4321#ifdef VMXNET3_RSS4322 dma_free_coherent(&adapter->pdev->dev, sizeof(struct UPT1_RSSConf),4323 adapter->rss_conf, adapter->rss_conf_pa);4324#endif4325 dma_free_coherent(&adapter->pdev->dev, sizeof(struct Vmxnet3_PMConf),4326 adapter->pm_conf, adapter->pm_conf_pa);4327 4328 size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues;4329 size += sizeof(struct Vmxnet3_RxQueueDesc) * num_rx_queues;4330 dma_free_coherent(&adapter->pdev->dev, size, adapter->tqd_start,4331 adapter->queue_desc_pa);4332 dma_free_coherent(&adapter->pdev->dev,4333 sizeof(struct Vmxnet3_DriverShared),4334 adapter->shared, adapter->shared_pa);4335 dma_unmap_single(&adapter->pdev->dev, adapter->adapter_pa,4336 sizeof(struct vmxnet3_adapter), DMA_TO_DEVICE);4337 free_netdev(netdev);4338}4339 4340static void vmxnet3_shutdown_device(struct pci_dev *pdev)4341{4342 struct net_device *netdev = pci_get_drvdata(pdev);4343 struct vmxnet3_adapter *adapter = netdev_priv(netdev);4344 unsigned long flags;4345 4346 /* Reset_work may be in the middle of resetting the device, wait for its4347 * completion.4348 */4349 while (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state))4350 usleep_range(1000, 2000);4351 4352 if (test_and_set_bit(VMXNET3_STATE_BIT_QUIESCED,4353 &adapter->state)) {4354 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);4355 return;4356 }4357 spin_lock_irqsave(&adapter->cmd_lock, flags);4358 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,4359 VMXNET3_CMD_QUIESCE_DEV);4360 spin_unlock_irqrestore(&adapter->cmd_lock, flags);4361 vmxnet3_disable_all_intrs(adapter);4362 4363 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);4364}4365 4366 4367#ifdef CONFIG_PM4368 4369static int4370vmxnet3_suspend(struct device *device)4371{4372 struct pci_dev *pdev = to_pci_dev(device);4373 struct net_device *netdev = pci_get_drvdata(pdev);4374 struct vmxnet3_adapter *adapter = netdev_priv(netdev);4375 struct Vmxnet3_PMConf *pmConf;4376 struct ethhdr *ehdr;4377 struct arphdr *ahdr;4378 u8 *arpreq;4379 struct in_device *in_dev;4380 struct in_ifaddr *ifa;4381 unsigned long flags;4382 int i = 0;4383 4384 if (!netif_running(netdev))4385 return 0;4386 4387 for (i = 0; i < adapter->num_rx_queues; i++)4388 napi_disable(&adapter->rx_queue[i].napi);4389 4390 vmxnet3_disable_all_intrs(adapter);4391 vmxnet3_free_irqs(adapter);4392 vmxnet3_free_intr_resources(adapter);4393 4394 netif_device_detach(netdev);4395 4396 /* Create wake-up filters. */4397 pmConf = adapter->pm_conf;4398 memset(pmConf, 0, sizeof(*pmConf));4399 4400 if (adapter->wol & WAKE_UCAST) {4401 pmConf->filters[i].patternSize = ETH_ALEN;4402 pmConf->filters[i].maskSize = 1;4403 memcpy(pmConf->filters[i].pattern, netdev->dev_addr, ETH_ALEN);4404 pmConf->filters[i].mask[0] = 0x3F; /* LSB ETH_ALEN bits */4405 4406 pmConf->wakeUpEvents |= VMXNET3_PM_WAKEUP_FILTER;4407 i++;4408 }4409 4410 if (adapter->wol & WAKE_ARP) {4411 rcu_read_lock();4412 4413 in_dev = __in_dev_get_rcu(netdev);4414 if (!in_dev) {4415 rcu_read_unlock();4416 goto skip_arp;4417 }4418 4419 ifa = rcu_dereference(in_dev->ifa_list);4420 if (!ifa) {4421 rcu_read_unlock();4422 goto skip_arp;4423 }4424 4425 pmConf->filters[i].patternSize = ETH_HLEN + /* Ethernet header*/4426 sizeof(struct arphdr) + /* ARP header */4427 2 * ETH_ALEN + /* 2 Ethernet addresses*/4428 2 * sizeof(u32); /*2 IPv4 addresses */4429 pmConf->filters[i].maskSize =4430 (pmConf->filters[i].patternSize - 1) / 8 + 1;4431 4432 /* ETH_P_ARP in Ethernet header. */4433 ehdr = (struct ethhdr *)pmConf->filters[i].pattern;4434 ehdr->h_proto = htons(ETH_P_ARP);4435 4436 /* ARPOP_REQUEST in ARP header. */4437 ahdr = (struct arphdr *)&pmConf->filters[i].pattern[ETH_HLEN];4438 ahdr->ar_op = htons(ARPOP_REQUEST);4439 arpreq = (u8 *)(ahdr + 1);4440 4441 /* The Unicast IPv4 address in 'tip' field. */4442 arpreq += 2 * ETH_ALEN + sizeof(u32);4443 *(__be32 *)arpreq = ifa->ifa_address;4444 4445 rcu_read_unlock();4446 4447 /* The mask for the relevant bits. */4448 pmConf->filters[i].mask[0] = 0x00;4449 pmConf->filters[i].mask[1] = 0x30; /* ETH_P_ARP */4450 pmConf->filters[i].mask[2] = 0x30; /* ARPOP_REQUEST */4451 pmConf->filters[i].mask[3] = 0x00;4452 pmConf->filters[i].mask[4] = 0xC0; /* IPv4 TIP */4453 pmConf->filters[i].mask[5] = 0x03; /* IPv4 TIP */4454 4455 pmConf->wakeUpEvents |= VMXNET3_PM_WAKEUP_FILTER;4456 i++;4457 }4458 4459skip_arp:4460 if (adapter->wol & WAKE_MAGIC)4461 pmConf->wakeUpEvents |= VMXNET3_PM_WAKEUP_MAGIC;4462 4463 pmConf->numFilters = i;4464 4465 adapter->shared->devRead.pmConfDesc.confVer = cpu_to_le32(1);4466 adapter->shared->devRead.pmConfDesc.confLen = cpu_to_le32(sizeof(4467 *pmConf));4468 adapter->shared->devRead.pmConfDesc.confPA =4469 cpu_to_le64(adapter->pm_conf_pa);4470 4471 spin_lock_irqsave(&adapter->cmd_lock, flags);4472 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,4473 VMXNET3_CMD_UPDATE_PMCFG);4474 spin_unlock_irqrestore(&adapter->cmd_lock, flags);4475 4476 pci_save_state(pdev);4477 pci_enable_wake(pdev, pci_choose_state(pdev, PMSG_SUSPEND),4478 adapter->wol);4479 pci_disable_device(pdev);4480 pci_set_power_state(pdev, pci_choose_state(pdev, PMSG_SUSPEND));4481 4482 return 0;4483}4484 4485 4486static int4487vmxnet3_resume(struct device *device)4488{4489 int err;4490 unsigned long flags;4491 struct pci_dev *pdev = to_pci_dev(device);4492 struct net_device *netdev = pci_get_drvdata(pdev);4493 struct vmxnet3_adapter *adapter = netdev_priv(netdev);4494 4495 if (!netif_running(netdev))4496 return 0;4497 4498 pci_set_power_state(pdev, PCI_D0);4499 pci_restore_state(pdev);4500 err = pci_enable_device_mem(pdev);4501 if (err != 0)4502 return err;4503 4504 pci_enable_wake(pdev, PCI_D0, 0);4505 4506 vmxnet3_alloc_intr_resources(adapter);4507 4508 /* During hibernate and suspend, device has to be reinitialized as the4509 * device state need not be preserved.4510 */4511 4512 /* Need not check adapter state as other reset tasks cannot run during4513 * device resume.4514 */4515 spin_lock_irqsave(&adapter->cmd_lock, flags);4516 VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,4517 VMXNET3_CMD_QUIESCE_DEV);4518 spin_unlock_irqrestore(&adapter->cmd_lock, flags);4519 vmxnet3_tq_cleanup_all(adapter);4520 vmxnet3_rq_cleanup_all(adapter);4521 4522 vmxnet3_reset_dev(adapter);4523 err = vmxnet3_activate_dev(adapter);4524 if (err != 0) {4525 netdev_err(netdev,4526 "failed to re-activate on resume, error: %d", err);4527 vmxnet3_force_close(adapter);4528 return err;4529 }4530 netif_device_attach(netdev);4531 4532 return 0;4533}4534 4535static const struct dev_pm_ops vmxnet3_pm_ops = {4536 .suspend = vmxnet3_suspend,4537 .resume = vmxnet3_resume,4538 .freeze = vmxnet3_suspend,4539 .restore = vmxnet3_resume,4540};4541#endif4542 4543static struct pci_driver vmxnet3_driver = {4544 .name = vmxnet3_driver_name,4545 .id_table = vmxnet3_pciid_table,4546 .probe = vmxnet3_probe_device,4547 .remove = vmxnet3_remove_device,4548 .shutdown = vmxnet3_shutdown_device,4549#ifdef CONFIG_PM4550 .driver.pm = &vmxnet3_pm_ops,4551#endif4552};4553 4554 4555static int __init4556vmxnet3_init_module(void)4557{4558 pr_info("%s - version %s\n", VMXNET3_DRIVER_DESC,4559 VMXNET3_DRIVER_VERSION_REPORT);4560 return pci_register_driver(&vmxnet3_driver);4561}4562 4563module_init(vmxnet3_init_module);4564 4565 4566static void4567vmxnet3_exit_module(void)4568{4569 pci_unregister_driver(&vmxnet3_driver);4570}4571 4572module_exit(vmxnet3_exit_module);4573 4574MODULE_AUTHOR("VMware, Inc.");4575MODULE_DESCRIPTION(VMXNET3_DRIVER_DESC);4576MODULE_LICENSE("GPL v2");4577MODULE_VERSION(VMXNET3_DRIVER_VERSION_STRING);4578