2953 lines · c
1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)2/* Copyright (C) 2015-2019 Netronome Systems, Inc. */3 4/*5 * nfp_net_common.c6 * Netronome network device driver: Common functions between PF and VF7 * Authors: Jakub Kicinski <jakub.kicinski@netronome.com>8 * Jason McMullan <jason.mcmullan@netronome.com>9 * Rolf Neugebauer <rolf.neugebauer@netronome.com>10 * Brad Petrus <brad.petrus@netronome.com>11 * Chris Telfer <chris.telfer@netronome.com>12 */13 14#include <linux/bitfield.h>15#include <linux/bpf.h>16#include <linux/module.h>17#include <linux/kernel.h>18#include <linux/init.h>19#include <linux/fs.h>20#include <linux/netdevice.h>21#include <linux/etherdevice.h>22#include <linux/interrupt.h>23#include <linux/ip.h>24#include <linux/ipv6.h>25#include <linux/mm.h>26#include <linux/overflow.h>27#include <linux/page_ref.h>28#include <linux/pci.h>29#include <linux/pci_regs.h>30#include <linux/ethtool.h>31#include <linux/log2.h>32#include <linux/if_vlan.h>33#include <linux/if_bridge.h>34#include <linux/random.h>35#include <linux/vmalloc.h>36#include <linux/ktime.h>37 38#include <net/tls.h>39#include <net/vxlan.h>40#include <net/xdp_sock_drv.h>41#include <net/xfrm.h>42 43#include "nfpcore/nfp_dev.h"44#include "nfpcore/nfp_nsp.h"45#include "ccm.h"46#include "nfp_app.h"47#include "nfp_net_ctrl.h"48#include "nfp_net.h"49#include "nfp_net_dp.h"50#include "nfp_net_sriov.h"51#include "nfp_net_xsk.h"52#include "nfp_port.h"53#include "crypto/crypto.h"54#include "crypto/fw.h"55 56static int nfp_net_mc_unsync(struct net_device *netdev, const unsigned char *addr);57 58/**59 * nfp_net_get_fw_version() - Read and parse the FW version60 * @fw_ver: Output fw_version structure to read to61 * @ctrl_bar: Mapped address of the control BAR62 */63void nfp_net_get_fw_version(struct nfp_net_fw_version *fw_ver,64 void __iomem *ctrl_bar)65{66 u32 reg;67 68 reg = readl(ctrl_bar + NFP_NET_CFG_VERSION);69 put_unaligned_le32(reg, fw_ver);70}71 72u32 nfp_qcp_queue_offset(const struct nfp_dev_info *dev_info, u16 queue)73{74 queue &= dev_info->qc_idx_mask;75 return dev_info->qc_addr_offset + NFP_QCP_QUEUE_ADDR_SZ * queue;76}77 78/* Firmware reconfig79 *80 * Firmware reconfig may take a while so we have two versions of it -81 * synchronous and asynchronous (posted). All synchronous callers are holding82 * RTNL so we don't have to worry about serializing them.83 */84static void nfp_net_reconfig_start(struct nfp_net *nn, u32 update)85{86 nn_writel(nn, NFP_NET_CFG_UPDATE, update);87 /* ensure update is written before pinging HW */88 nn_pci_flush(nn);89 nfp_qcp_wr_ptr_add(nn->qcp_cfg, 1);90 nn->reconfig_in_progress_update = update;91}92 93/* Pass 0 as update to run posted reconfigs. */94static void nfp_net_reconfig_start_async(struct nfp_net *nn, u32 update)95{96 update |= nn->reconfig_posted;97 nn->reconfig_posted = 0;98 99 nfp_net_reconfig_start(nn, update);100 101 nn->reconfig_timer_active = true;102 mod_timer(&nn->reconfig_timer, jiffies + NFP_NET_POLL_TIMEOUT * HZ);103}104 105static bool nfp_net_reconfig_check_done(struct nfp_net *nn, bool last_check)106{107 u32 reg;108 109 reg = nn_readl(nn, NFP_NET_CFG_UPDATE);110 if (reg == 0)111 return true;112 if (reg & NFP_NET_CFG_UPDATE_ERR) {113 nn_err(nn, "Reconfig error (status: 0x%08x update: 0x%08x ctrl: 0x%08x)\n",114 reg, nn->reconfig_in_progress_update,115 nn_readl(nn, NFP_NET_CFG_CTRL));116 return true;117 } else if (last_check) {118 nn_err(nn, "Reconfig timeout (status: 0x%08x update: 0x%08x ctrl: 0x%08x)\n",119 reg, nn->reconfig_in_progress_update,120 nn_readl(nn, NFP_NET_CFG_CTRL));121 return true;122 }123 124 return false;125}126 127static bool __nfp_net_reconfig_wait(struct nfp_net *nn, unsigned long deadline)128{129 bool timed_out = false;130 int i;131 132 /* Poll update field, waiting for NFP to ack the config.133 * Do an opportunistic wait-busy loop, afterward sleep.134 */135 for (i = 0; i < 50; i++) {136 if (nfp_net_reconfig_check_done(nn, false))137 return false;138 udelay(4);139 }140 141 while (!nfp_net_reconfig_check_done(nn, timed_out)) {142 usleep_range(250, 500);143 timed_out = time_is_before_eq_jiffies(deadline);144 }145 146 return timed_out;147}148 149static int nfp_net_reconfig_wait(struct nfp_net *nn, unsigned long deadline)150{151 if (__nfp_net_reconfig_wait(nn, deadline))152 return -EIO;153 154 if (nn_readl(nn, NFP_NET_CFG_UPDATE) & NFP_NET_CFG_UPDATE_ERR)155 return -EIO;156 157 return 0;158}159 160static void nfp_net_reconfig_timer(struct timer_list *t)161{162 struct nfp_net *nn = from_timer(nn, t, reconfig_timer);163 164 spin_lock_bh(&nn->reconfig_lock);165 166 nn->reconfig_timer_active = false;167 168 /* If sync caller is present it will take over from us */169 if (nn->reconfig_sync_present)170 goto done;171 172 /* Read reconfig status and report errors */173 nfp_net_reconfig_check_done(nn, true);174 175 if (nn->reconfig_posted)176 nfp_net_reconfig_start_async(nn, 0);177done:178 spin_unlock_bh(&nn->reconfig_lock);179}180 181/**182 * nfp_net_reconfig_post() - Post async reconfig request183 * @nn: NFP Net device to reconfigure184 * @update: The value for the update field in the BAR config185 *186 * Record FW reconfiguration request. Reconfiguration will be kicked off187 * whenever reconfiguration machinery is idle. Multiple requests can be188 * merged together!189 */190static void nfp_net_reconfig_post(struct nfp_net *nn, u32 update)191{192 spin_lock_bh(&nn->reconfig_lock);193 194 /* Sync caller will kick off async reconf when it's done, just post */195 if (nn->reconfig_sync_present) {196 nn->reconfig_posted |= update;197 goto done;198 }199 200 /* Opportunistically check if the previous command is done */201 if (!nn->reconfig_timer_active ||202 nfp_net_reconfig_check_done(nn, false))203 nfp_net_reconfig_start_async(nn, update);204 else205 nn->reconfig_posted |= update;206done:207 spin_unlock_bh(&nn->reconfig_lock);208}209 210static void nfp_net_reconfig_sync_enter(struct nfp_net *nn)211{212 bool cancelled_timer = false;213 u32 pre_posted_requests;214 215 spin_lock_bh(&nn->reconfig_lock);216 217 WARN_ON(nn->reconfig_sync_present);218 nn->reconfig_sync_present = true;219 220 if (nn->reconfig_timer_active) {221 nn->reconfig_timer_active = false;222 cancelled_timer = true;223 }224 pre_posted_requests = nn->reconfig_posted;225 nn->reconfig_posted = 0;226 227 spin_unlock_bh(&nn->reconfig_lock);228 229 if (cancelled_timer) {230 del_timer_sync(&nn->reconfig_timer);231 nfp_net_reconfig_wait(nn, nn->reconfig_timer.expires);232 }233 234 /* Run the posted reconfigs which were issued before we started */235 if (pre_posted_requests) {236 nfp_net_reconfig_start(nn, pre_posted_requests);237 nfp_net_reconfig_wait(nn, jiffies + HZ * NFP_NET_POLL_TIMEOUT);238 }239}240 241static void nfp_net_reconfig_wait_posted(struct nfp_net *nn)242{243 nfp_net_reconfig_sync_enter(nn);244 245 spin_lock_bh(&nn->reconfig_lock);246 nn->reconfig_sync_present = false;247 spin_unlock_bh(&nn->reconfig_lock);248}249 250/**251 * __nfp_net_reconfig() - Reconfigure the firmware252 * @nn: NFP Net device to reconfigure253 * @update: The value for the update field in the BAR config254 *255 * Write the update word to the BAR and ping the reconfig queue. The256 * poll until the firmware has acknowledged the update by zeroing the257 * update word.258 *259 * Return: Negative errno on error, 0 on success260 */261int __nfp_net_reconfig(struct nfp_net *nn, u32 update)262{263 int ret;264 265 nfp_net_reconfig_sync_enter(nn);266 267 nfp_net_reconfig_start(nn, update);268 ret = nfp_net_reconfig_wait(nn, jiffies + HZ * NFP_NET_POLL_TIMEOUT);269 270 spin_lock_bh(&nn->reconfig_lock);271 272 if (nn->reconfig_posted)273 nfp_net_reconfig_start_async(nn, 0);274 275 nn->reconfig_sync_present = false;276 277 spin_unlock_bh(&nn->reconfig_lock);278 279 return ret;280}281 282int nfp_net_reconfig(struct nfp_net *nn, u32 update)283{284 int ret;285 286 nn_ctrl_bar_lock(nn);287 ret = __nfp_net_reconfig(nn, update);288 nn_ctrl_bar_unlock(nn);289 290 return ret;291}292 293int nfp_net_mbox_lock(struct nfp_net *nn, unsigned int data_size)294{295 if (nn->tlv_caps.mbox_len < NFP_NET_CFG_MBOX_SIMPLE_VAL + data_size) {296 nn_err(nn, "mailbox too small for %u of data (%u)\n",297 data_size, nn->tlv_caps.mbox_len);298 return -EIO;299 }300 301 nn_ctrl_bar_lock(nn);302 return 0;303}304 305/**306 * nfp_net_mbox_reconfig() - Reconfigure the firmware via the mailbox307 * @nn: NFP Net device to reconfigure308 * @mbox_cmd: The value for the mailbox command309 *310 * Helper function for mailbox updates311 *312 * Return: Negative errno on error, 0 on success313 */314int nfp_net_mbox_reconfig(struct nfp_net *nn, u32 mbox_cmd)315{316 u32 mbox = nn->tlv_caps.mbox_off;317 int ret;318 319 nn_writeq(nn, mbox + NFP_NET_CFG_MBOX_SIMPLE_CMD, mbox_cmd);320 321 ret = __nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_MBOX);322 if (ret) {323 nn_err(nn, "Mailbox update error\n");324 return ret;325 }326 327 return -nn_readl(nn, mbox + NFP_NET_CFG_MBOX_SIMPLE_RET);328}329 330void nfp_net_mbox_reconfig_post(struct nfp_net *nn, u32 mbox_cmd)331{332 u32 mbox = nn->tlv_caps.mbox_off;333 334 nn_writeq(nn, mbox + NFP_NET_CFG_MBOX_SIMPLE_CMD, mbox_cmd);335 336 nfp_net_reconfig_post(nn, NFP_NET_CFG_UPDATE_MBOX);337}338 339int nfp_net_mbox_reconfig_wait_posted(struct nfp_net *nn)340{341 u32 mbox = nn->tlv_caps.mbox_off;342 343 nfp_net_reconfig_wait_posted(nn);344 345 return -nn_readl(nn, mbox + NFP_NET_CFG_MBOX_SIMPLE_RET);346}347 348int nfp_net_mbox_reconfig_and_unlock(struct nfp_net *nn, u32 mbox_cmd)349{350 int ret;351 352 ret = nfp_net_mbox_reconfig(nn, mbox_cmd);353 nn_ctrl_bar_unlock(nn);354 return ret;355}356 357/* Interrupt configuration and handling358 */359 360/**361 * nfp_net_irqs_alloc() - allocates MSI-X irqs362 * @pdev: PCI device structure363 * @irq_entries: Array to be initialized and used to hold the irq entries364 * @min_irqs: Minimal acceptable number of interrupts365 * @wanted_irqs: Target number of interrupts to allocate366 *367 * Return: Number of irqs obtained or 0 on error.368 */369unsigned int370nfp_net_irqs_alloc(struct pci_dev *pdev, struct msix_entry *irq_entries,371 unsigned int min_irqs, unsigned int wanted_irqs)372{373 unsigned int i;374 int got_irqs;375 376 for (i = 0; i < wanted_irqs; i++)377 irq_entries[i].entry = i;378 379 got_irqs = pci_enable_msix_range(pdev, irq_entries,380 min_irqs, wanted_irqs);381 if (got_irqs < 0) {382 dev_err(&pdev->dev, "Failed to enable %d-%d MSI-X (err=%d)\n",383 min_irqs, wanted_irqs, got_irqs);384 return 0;385 }386 387 if (got_irqs < wanted_irqs)388 dev_warn(&pdev->dev, "Unable to allocate %d IRQs got only %d\n",389 wanted_irqs, got_irqs);390 391 return got_irqs;392}393 394/**395 * nfp_net_irqs_assign() - Assign interrupts allocated externally to netdev396 * @nn: NFP Network structure397 * @irq_entries: Table of allocated interrupts398 * @n: Size of @irq_entries (number of entries to grab)399 *400 * After interrupts are allocated with nfp_net_irqs_alloc() this function401 * should be called to assign them to a specific netdev (port).402 */403void404nfp_net_irqs_assign(struct nfp_net *nn, struct msix_entry *irq_entries,405 unsigned int n)406{407 struct nfp_net_dp *dp = &nn->dp;408 409 nn->max_r_vecs = n - NFP_NET_NON_Q_VECTORS;410 dp->num_r_vecs = nn->max_r_vecs;411 412 memcpy(nn->irq_entries, irq_entries, sizeof(*irq_entries) * n);413 414 if (dp->num_rx_rings > dp->num_r_vecs ||415 dp->num_tx_rings > dp->num_r_vecs)416 dev_warn(nn->dp.dev, "More rings (%d,%d) than vectors (%d).\n",417 dp->num_rx_rings, dp->num_tx_rings,418 dp->num_r_vecs);419 420 dp->num_rx_rings = min(dp->num_r_vecs, dp->num_rx_rings);421 dp->num_tx_rings = min(dp->num_r_vecs, dp->num_tx_rings);422 dp->num_stack_tx_rings = dp->num_tx_rings;423}424 425/**426 * nfp_net_irqs_disable() - Disable interrupts427 * @pdev: PCI device structure428 *429 * Undoes what @nfp_net_irqs_alloc() does.430 */431void nfp_net_irqs_disable(struct pci_dev *pdev)432{433 pci_disable_msix(pdev);434}435 436/**437 * nfp_net_irq_rxtx() - Interrupt service routine for RX/TX rings.438 * @irq: Interrupt439 * @data: Opaque data structure440 *441 * Return: Indicate if the interrupt has been handled.442 */443static irqreturn_t nfp_net_irq_rxtx(int irq, void *data)444{445 struct nfp_net_r_vector *r_vec = data;446 447 /* Currently we cannot tell if it's a rx or tx interrupt,448 * since dim does not need accurate event_ctr to calculate,449 * we just use this counter for both rx and tx dim.450 */451 r_vec->event_ctr++;452 453 napi_schedule_irqoff(&r_vec->napi);454 455 /* The FW auto-masks any interrupt, either via the MASK bit in456 * the MSI-X table or via the per entry ICR field. So there457 * is no need to disable interrupts here.458 */459 return IRQ_HANDLED;460}461 462static irqreturn_t nfp_ctrl_irq_rxtx(int irq, void *data)463{464 struct nfp_net_r_vector *r_vec = data;465 466 tasklet_schedule(&r_vec->tasklet);467 468 return IRQ_HANDLED;469}470 471/**472 * nfp_net_read_link_status() - Reread link status from control BAR473 * @nn: NFP Network structure474 */475static void nfp_net_read_link_status(struct nfp_net *nn)476{477 unsigned long flags;478 bool link_up;479 u16 sts;480 481 spin_lock_irqsave(&nn->link_status_lock, flags);482 483 sts = nn_readw(nn, NFP_NET_CFG_STS);484 link_up = !!(sts & NFP_NET_CFG_STS_LINK);485 486 if (nn->link_up == link_up)487 goto out;488 489 nn->link_up = link_up;490 if (nn->port) {491 set_bit(NFP_PORT_CHANGED, &nn->port->flags);492 if (nn->port->link_cb)493 nn->port->link_cb(nn->port);494 }495 496 if (nn->link_up) {497 netif_carrier_on(nn->dp.netdev);498 netdev_info(nn->dp.netdev, "NIC Link is Up\n");499 } else {500 netif_carrier_off(nn->dp.netdev);501 netdev_info(nn->dp.netdev, "NIC Link is Down\n");502 }503out:504 spin_unlock_irqrestore(&nn->link_status_lock, flags);505}506 507/**508 * nfp_net_irq_lsc() - Interrupt service routine for link state changes509 * @irq: Interrupt510 * @data: Opaque data structure511 *512 * Return: Indicate if the interrupt has been handled.513 */514static irqreturn_t nfp_net_irq_lsc(int irq, void *data)515{516 struct nfp_net *nn = data;517 struct msix_entry *entry;518 519 entry = &nn->irq_entries[NFP_NET_IRQ_LSC_IDX];520 521 nfp_net_read_link_status(nn);522 523 nfp_net_irq_unmask(nn, entry->entry);524 525 return IRQ_HANDLED;526}527 528/**529 * nfp_net_irq_exn() - Interrupt service routine for exceptions530 * @irq: Interrupt531 * @data: Opaque data structure532 *533 * Return: Indicate if the interrupt has been handled.534 */535static irqreturn_t nfp_net_irq_exn(int irq, void *data)536{537 struct nfp_net *nn = data;538 539 nn_err(nn, "%s: UNIMPLEMENTED.\n", __func__);540 /* XXX TO BE IMPLEMENTED */541 return IRQ_HANDLED;542}543 544/**545 * nfp_net_aux_irq_request() - Request an auxiliary interrupt (LSC or EXN)546 * @nn: NFP Network structure547 * @ctrl_offset: Control BAR offset where IRQ configuration should be written548 * @format: printf-style format to construct the interrupt name549 * @name: Pointer to allocated space for interrupt name550 * @name_sz: Size of space for interrupt name551 * @vector_idx: Index of MSI-X vector used for this interrupt552 * @handler: IRQ handler to register for this interrupt553 */554static int555nfp_net_aux_irq_request(struct nfp_net *nn, u32 ctrl_offset,556 const char *format, char *name, size_t name_sz,557 unsigned int vector_idx, irq_handler_t handler)558{559 struct msix_entry *entry;560 int err;561 562 entry = &nn->irq_entries[vector_idx];563 564 snprintf(name, name_sz, format, nfp_net_name(nn));565 err = request_irq(entry->vector, handler, 0, name, nn);566 if (err) {567 nn_err(nn, "Failed to request IRQ %d (err=%d).\n",568 entry->vector, err);569 return err;570 }571 nn_writeb(nn, ctrl_offset, entry->entry);572 nfp_net_irq_unmask(nn, entry->entry);573 574 return 0;575}576 577/**578 * nfp_net_aux_irq_free() - Free an auxiliary interrupt (LSC or EXN)579 * @nn: NFP Network structure580 * @ctrl_offset: Control BAR offset where IRQ configuration should be written581 * @vector_idx: Index of MSI-X vector used for this interrupt582 */583static void nfp_net_aux_irq_free(struct nfp_net *nn, u32 ctrl_offset,584 unsigned int vector_idx)585{586 nn_writeb(nn, ctrl_offset, 0xff);587 nn_pci_flush(nn);588 free_irq(nn->irq_entries[vector_idx].vector, nn);589}590 591struct sk_buff *592nfp_net_tls_tx(struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec,593 struct sk_buff *skb, u64 *tls_handle, int *nr_frags)594{595#ifdef CONFIG_TLS_DEVICE596 struct nfp_net_tls_offload_ctx *ntls;597 struct sk_buff *nskb;598 bool resync_pending;599 u32 datalen, seq;600 601 if (likely(!dp->ktls_tx))602 return skb;603 if (!tls_is_skb_tx_device_offloaded(skb))604 return skb;605 606 datalen = skb->len - skb_tcp_all_headers(skb);607 seq = ntohl(tcp_hdr(skb)->seq);608 ntls = tls_driver_ctx(skb->sk, TLS_OFFLOAD_CTX_DIR_TX);609 resync_pending = tls_offload_tx_resync_pending(skb->sk);610 if (unlikely(resync_pending || ntls->next_seq != seq)) {611 /* Pure ACK out of order already */612 if (!datalen)613 return skb;614 615 u64_stats_update_begin(&r_vec->tx_sync);616 r_vec->tls_tx_fallback++;617 u64_stats_update_end(&r_vec->tx_sync);618 619 nskb = tls_encrypt_skb(skb);620 if (!nskb) {621 u64_stats_update_begin(&r_vec->tx_sync);622 r_vec->tls_tx_no_fallback++;623 u64_stats_update_end(&r_vec->tx_sync);624 return NULL;625 }626 /* encryption wasn't necessary */627 if (nskb == skb)628 return skb;629 /* we don't re-check ring space */630 if (unlikely(skb_is_nonlinear(nskb))) {631 nn_dp_warn(dp, "tls_encrypt_skb() produced fragmented frame\n");632 u64_stats_update_begin(&r_vec->tx_sync);633 r_vec->tx_errors++;634 u64_stats_update_end(&r_vec->tx_sync);635 dev_kfree_skb_any(nskb);636 return NULL;637 }638 639 /* jump forward, a TX may have gotten lost, need to sync TX */640 if (!resync_pending && seq - ntls->next_seq < U32_MAX / 4)641 tls_offload_tx_resync_request(nskb->sk, seq,642 ntls->next_seq);643 644 *nr_frags = 0;645 return nskb;646 }647 648 if (datalen) {649 u64_stats_update_begin(&r_vec->tx_sync);650 if (!skb_is_gso(skb))651 r_vec->hw_tls_tx++;652 else653 r_vec->hw_tls_tx += skb_shinfo(skb)->gso_segs;654 u64_stats_update_end(&r_vec->tx_sync);655 }656 657 memcpy(tls_handle, ntls->fw_handle, sizeof(ntls->fw_handle));658 ntls->next_seq += datalen;659#endif660 return skb;661}662 663void nfp_net_tls_tx_undo(struct sk_buff *skb, u64 tls_handle)664{665#ifdef CONFIG_TLS_DEVICE666 struct nfp_net_tls_offload_ctx *ntls;667 u32 datalen, seq;668 669 if (!tls_handle)670 return;671 if (WARN_ON_ONCE(!tls_is_skb_tx_device_offloaded(skb)))672 return;673 674 datalen = skb->len - skb_tcp_all_headers(skb);675 seq = ntohl(tcp_hdr(skb)->seq);676 677 ntls = tls_driver_ctx(skb->sk, TLS_OFFLOAD_CTX_DIR_TX);678 if (ntls->next_seq == seq + datalen)679 ntls->next_seq = seq;680 else681 WARN_ON_ONCE(1);682#endif683}684 685static void nfp_net_tx_timeout(struct net_device *netdev, unsigned int txqueue)686{687 struct nfp_net *nn = netdev_priv(netdev);688 689 nn_warn(nn, "TX watchdog timeout on ring: %u\n", txqueue);690}691 692/* Receive processing */693static unsigned int694nfp_net_calc_fl_bufsz_data(struct nfp_net_dp *dp)695{696 unsigned int fl_bufsz = 0;697 698 if (dp->rx_offset == NFP_NET_CFG_RX_OFFSET_DYNAMIC)699 fl_bufsz += NFP_NET_MAX_PREPEND;700 else701 fl_bufsz += dp->rx_offset;702 fl_bufsz += ETH_HLEN + VLAN_HLEN * 2 + dp->mtu;703 704 return fl_bufsz;705}706 707static unsigned int nfp_net_calc_fl_bufsz(struct nfp_net_dp *dp)708{709 unsigned int fl_bufsz;710 711 fl_bufsz = NFP_NET_RX_BUF_HEADROOM;712 fl_bufsz += dp->rx_dma_off;713 fl_bufsz += nfp_net_calc_fl_bufsz_data(dp);714 715 fl_bufsz = SKB_DATA_ALIGN(fl_bufsz);716 fl_bufsz += SKB_DATA_ALIGN(sizeof(struct skb_shared_info));717 718 return fl_bufsz;719}720 721static unsigned int nfp_net_calc_fl_bufsz_xsk(struct nfp_net_dp *dp)722{723 unsigned int fl_bufsz;724 725 fl_bufsz = XDP_PACKET_HEADROOM;726 fl_bufsz += nfp_net_calc_fl_bufsz_data(dp);727 728 return fl_bufsz;729}730 731/* Setup and Configuration732 */733 734/**735 * nfp_net_vecs_init() - Assign IRQs and setup rvecs.736 * @nn: NFP Network structure737 */738static void nfp_net_vecs_init(struct nfp_net *nn)739{740 int numa_node = dev_to_node(&nn->pdev->dev);741 struct nfp_net_r_vector *r_vec;742 unsigned int r;743 744 nn->lsc_handler = nfp_net_irq_lsc;745 nn->exn_handler = nfp_net_irq_exn;746 747 for (r = 0; r < nn->max_r_vecs; r++) {748 struct msix_entry *entry;749 750 entry = &nn->irq_entries[NFP_NET_NON_Q_VECTORS + r];751 752 r_vec = &nn->r_vecs[r];753 r_vec->nfp_net = nn;754 r_vec->irq_entry = entry->entry;755 r_vec->irq_vector = entry->vector;756 757 if (nn->dp.netdev) {758 r_vec->handler = nfp_net_irq_rxtx;759 } else {760 r_vec->handler = nfp_ctrl_irq_rxtx;761 762 __skb_queue_head_init(&r_vec->queue);763 spin_lock_init(&r_vec->lock);764 tasklet_setup(&r_vec->tasklet, nn->dp.ops->ctrl_poll);765 tasklet_disable(&r_vec->tasklet);766 }767 768 cpumask_set_cpu(cpumask_local_spread(r, numa_node), &r_vec->affinity_mask);769 }770}771 772static void773nfp_net_napi_add(struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec, int idx)774{775 if (dp->netdev)776 netif_napi_add(dp->netdev, &r_vec->napi,777 nfp_net_has_xsk_pool_slow(dp, idx) ? dp->ops->xsk_poll : dp->ops->poll);778 else779 tasklet_enable(&r_vec->tasklet);780}781 782static void783nfp_net_napi_del(struct nfp_net_dp *dp, struct nfp_net_r_vector *r_vec)784{785 if (dp->netdev)786 netif_napi_del(&r_vec->napi);787 else788 tasklet_disable(&r_vec->tasklet);789}790 791static void792nfp_net_vector_assign_rings(struct nfp_net_dp *dp,793 struct nfp_net_r_vector *r_vec, int idx)794{795 r_vec->rx_ring = idx < dp->num_rx_rings ? &dp->rx_rings[idx] : NULL;796 r_vec->tx_ring =797 idx < dp->num_stack_tx_rings ? &dp->tx_rings[idx] : NULL;798 799 r_vec->xdp_ring = idx < dp->num_tx_rings - dp->num_stack_tx_rings ?800 &dp->tx_rings[dp->num_stack_tx_rings + idx] : NULL;801 802 if (nfp_net_has_xsk_pool_slow(dp, idx) || r_vec->xsk_pool) {803 r_vec->xsk_pool = dp->xdp_prog ? dp->xsk_pools[idx] : NULL;804 805 if (r_vec->xsk_pool)806 xsk_pool_set_rxq_info(r_vec->xsk_pool,807 &r_vec->rx_ring->xdp_rxq);808 809 nfp_net_napi_del(dp, r_vec);810 nfp_net_napi_add(dp, r_vec, idx);811 }812}813 814static int815nfp_net_prepare_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,816 int idx)817{818 int err;819 820 nfp_net_napi_add(&nn->dp, r_vec, idx);821 822 snprintf(r_vec->name, sizeof(r_vec->name),823 "%s-rxtx-%d", nfp_net_name(nn), idx);824 err = request_irq(r_vec->irq_vector, r_vec->handler, IRQF_NO_AUTOEN,825 r_vec->name, r_vec);826 if (err) {827 nfp_net_napi_del(&nn->dp, r_vec);828 nn_err(nn, "Error requesting IRQ %d\n", r_vec->irq_vector);829 return err;830 }831 832 irq_set_affinity_hint(r_vec->irq_vector, &r_vec->affinity_mask);833 834 nn_dbg(nn, "RV%02d: irq=%03d/%03d\n", idx, r_vec->irq_vector,835 r_vec->irq_entry);836 837 return 0;838}839 840static void841nfp_net_cleanup_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec)842{843 irq_set_affinity_hint(r_vec->irq_vector, NULL);844 nfp_net_napi_del(&nn->dp, r_vec);845 free_irq(r_vec->irq_vector, r_vec);846}847 848/**849 * nfp_net_rss_write_itbl() - Write RSS indirection table to device850 * @nn: NFP Net device to reconfigure851 */852void nfp_net_rss_write_itbl(struct nfp_net *nn)853{854 int i;855 856 for (i = 0; i < NFP_NET_CFG_RSS_ITBL_SZ; i += 4)857 nn_writel(nn, NFP_NET_CFG_RSS_ITBL + i,858 get_unaligned_le32(nn->rss_itbl + i));859}860 861/**862 * nfp_net_rss_write_key() - Write RSS hash key to device863 * @nn: NFP Net device to reconfigure864 */865void nfp_net_rss_write_key(struct nfp_net *nn)866{867 int i;868 869 for (i = 0; i < nfp_net_rss_key_sz(nn); i += 4)870 nn_writel(nn, NFP_NET_CFG_RSS_KEY + i,871 get_unaligned_le32(nn->rss_key + i));872}873 874/**875 * nfp_net_coalesce_write_cfg() - Write irq coalescence configuration to HW876 * @nn: NFP Net device to reconfigure877 */878void nfp_net_coalesce_write_cfg(struct nfp_net *nn)879{880 u8 i;881 u32 factor;882 u32 value;883 884 /* Compute factor used to convert coalesce '_usecs' parameters to885 * ME timestamp ticks. There are 16 ME clock cycles for each timestamp886 * count.887 */888 factor = nn->tlv_caps.me_freq_mhz / 16;889 890 /* copy RX interrupt coalesce parameters */891 value = (nn->rx_coalesce_max_frames << 16) |892 (factor * nn->rx_coalesce_usecs);893 for (i = 0; i < nn->dp.num_rx_rings; i++)894 nn_writel(nn, NFP_NET_CFG_RXR_IRQ_MOD(i), value);895 896 /* copy TX interrupt coalesce parameters */897 value = (nn->tx_coalesce_max_frames << 16) |898 (factor * nn->tx_coalesce_usecs);899 for (i = 0; i < nn->dp.num_tx_rings; i++)900 nn_writel(nn, NFP_NET_CFG_TXR_IRQ_MOD(i), value);901}902 903/**904 * nfp_net_write_mac_addr() - Write mac address to the device control BAR905 * @nn: NFP Net device to reconfigure906 * @addr: MAC address to write907 *908 * Writes the MAC address from the netdev to the device control BAR. Does not909 * perform the required reconfig. We do a bit of byte swapping dance because910 * firmware is LE.911 */912static void nfp_net_write_mac_addr(struct nfp_net *nn, const u8 *addr)913{914 nn_writel(nn, NFP_NET_CFG_MACADDR + 0, get_unaligned_be32(addr));915 nn_writew(nn, NFP_NET_CFG_MACADDR + 6, get_unaligned_be16(addr + 4));916}917 918/**919 * nfp_net_clear_config_and_disable() - Clear control BAR and disable NFP920 * @nn: NFP Net device to reconfigure921 *922 * Warning: must be fully idempotent.923 */924static void nfp_net_clear_config_and_disable(struct nfp_net *nn)925{926 u32 new_ctrl, new_ctrl_w1, update;927 unsigned int r;928 int err;929 930 new_ctrl = nn->dp.ctrl;931 new_ctrl &= ~NFP_NET_CFG_CTRL_ENABLE;932 update = NFP_NET_CFG_UPDATE_GEN;933 update |= NFP_NET_CFG_UPDATE_MSIX;934 update |= NFP_NET_CFG_UPDATE_RING;935 936 if (nn->cap & NFP_NET_CFG_CTRL_RINGCFG)937 new_ctrl &= ~NFP_NET_CFG_CTRL_RINGCFG;938 939 if (!(nn->cap_w1 & NFP_NET_CFG_CTRL_FREELIST_EN)) {940 nn_writeq(nn, NFP_NET_CFG_TXRS_ENABLE, 0);941 nn_writeq(nn, NFP_NET_CFG_RXRS_ENABLE, 0);942 }943 944 nn_writel(nn, NFP_NET_CFG_CTRL, new_ctrl);945 err = nfp_net_reconfig(nn, update);946 if (err)947 nn_err(nn, "Could not disable device: %d\n", err);948 949 if (nn->cap_w1 & NFP_NET_CFG_CTRL_FREELIST_EN) {950 new_ctrl_w1 = nn->dp.ctrl_w1;951 new_ctrl_w1 &= ~NFP_NET_CFG_CTRL_FREELIST_EN;952 nn_writeq(nn, NFP_NET_CFG_TXRS_ENABLE, 0);953 nn_writeq(nn, NFP_NET_CFG_RXRS_ENABLE, 0);954 955 nn_writel(nn, NFP_NET_CFG_CTRL_WORD1, new_ctrl_w1);956 err = nfp_net_reconfig(nn, update);957 if (err)958 nn_err(nn, "Could not disable FREELIST_EN: %d\n", err);959 nn->dp.ctrl_w1 = new_ctrl_w1;960 }961 962 for (r = 0; r < nn->dp.num_rx_rings; r++) {963 nfp_net_rx_ring_reset(&nn->dp.rx_rings[r]);964 if (nfp_net_has_xsk_pool_slow(&nn->dp, nn->dp.rx_rings[r].idx))965 nfp_net_xsk_rx_bufs_free(&nn->dp.rx_rings[r]);966 }967 for (r = 0; r < nn->dp.num_tx_rings; r++)968 nfp_net_tx_ring_reset(&nn->dp, &nn->dp.tx_rings[r]);969 for (r = 0; r < nn->dp.num_r_vecs; r++)970 nfp_net_vec_clear_ring_data(nn, r);971 972 nn->dp.ctrl = new_ctrl;973}974 975/**976 * nfp_net_set_config_and_enable() - Write control BAR and enable NFP977 * @nn: NFP Net device to reconfigure978 */979static int nfp_net_set_config_and_enable(struct nfp_net *nn)980{981 u32 bufsz, new_ctrl, new_ctrl_w1, update = 0;982 unsigned int r;983 int err;984 985 new_ctrl = nn->dp.ctrl;986 new_ctrl_w1 = nn->dp.ctrl_w1;987 988 if (nn->dp.ctrl & NFP_NET_CFG_CTRL_RSS_ANY) {989 nfp_net_rss_write_key(nn);990 nfp_net_rss_write_itbl(nn);991 nn_writel(nn, NFP_NET_CFG_RSS_CTRL, nn->rss_cfg);992 update |= NFP_NET_CFG_UPDATE_RSS;993 }994 995 if (nn->dp.ctrl & NFP_NET_CFG_CTRL_IRQMOD) {996 nfp_net_coalesce_write_cfg(nn);997 update |= NFP_NET_CFG_UPDATE_IRQMOD;998 }999 1000 for (r = 0; r < nn->dp.num_tx_rings; r++)1001 nfp_net_tx_ring_hw_cfg_write(nn, &nn->dp.tx_rings[r], r);1002 for (r = 0; r < nn->dp.num_rx_rings; r++)1003 nfp_net_rx_ring_hw_cfg_write(nn, &nn->dp.rx_rings[r], r);1004 1005 nn_writeq(nn, NFP_NET_CFG_TXRS_ENABLE,1006 U64_MAX >> (64 - nn->dp.num_tx_rings));1007 1008 nn_writeq(nn, NFP_NET_CFG_RXRS_ENABLE,1009 U64_MAX >> (64 - nn->dp.num_rx_rings));1010 1011 if (nn->dp.netdev)1012 nfp_net_write_mac_addr(nn, nn->dp.netdev->dev_addr);1013 1014 nn_writel(nn, NFP_NET_CFG_MTU, nn->dp.mtu);1015 1016 bufsz = nn->dp.fl_bufsz - nn->dp.rx_dma_off - NFP_NET_RX_BUF_NON_DATA;1017 nn_writel(nn, NFP_NET_CFG_FLBUFSZ, bufsz);1018 1019 /* Enable device1020 * Step 1: Replace the CTRL_ENABLE by NFP_NET_CFG_CTRL_FREELIST_EN if1021 * FREELIST_EN exits.1022 */1023 if (nn->cap_w1 & NFP_NET_CFG_CTRL_FREELIST_EN)1024 new_ctrl_w1 |= NFP_NET_CFG_CTRL_FREELIST_EN;1025 else1026 new_ctrl |= NFP_NET_CFG_CTRL_ENABLE;1027 update |= NFP_NET_CFG_UPDATE_GEN;1028 update |= NFP_NET_CFG_UPDATE_MSIX;1029 update |= NFP_NET_CFG_UPDATE_RING;1030 if (nn->cap & NFP_NET_CFG_CTRL_RINGCFG)1031 new_ctrl |= NFP_NET_CFG_CTRL_RINGCFG;1032 1033 /* Step 2: Send the configuration and write the freelist.1034 * - The freelist only need to be written once.1035 */1036 nn_writel(nn, NFP_NET_CFG_CTRL, new_ctrl);1037 nn_writel(nn, NFP_NET_CFG_CTRL_WORD1, new_ctrl_w1);1038 err = nfp_net_reconfig(nn, update);1039 if (err) {1040 nfp_net_clear_config_and_disable(nn);1041 return err;1042 }1043 1044 nn->dp.ctrl = new_ctrl;1045 nn->dp.ctrl_w1 = new_ctrl_w1;1046 1047 for (r = 0; r < nn->dp.num_rx_rings; r++)1048 nfp_net_rx_ring_fill_freelist(&nn->dp, &nn->dp.rx_rings[r]);1049 1050 /* Step 3: Do the NFP_NET_CFG_CTRL_ENABLE. Send the configuration.1051 */1052 if (nn->cap_w1 & NFP_NET_CFG_CTRL_FREELIST_EN) {1053 new_ctrl |= NFP_NET_CFG_CTRL_ENABLE;1054 nn_writel(nn, NFP_NET_CFG_CTRL, new_ctrl);1055 1056 err = nfp_net_reconfig(nn, update);1057 if (err) {1058 nfp_net_clear_config_and_disable(nn);1059 return err;1060 }1061 nn->dp.ctrl = new_ctrl;1062 }1063 1064 return 0;1065}1066 1067/**1068 * nfp_net_close_stack() - Quiesce the stack (part of close)1069 * @nn: NFP Net device to reconfigure1070 */1071static void nfp_net_close_stack(struct nfp_net *nn)1072{1073 struct nfp_net_r_vector *r_vec;1074 unsigned int r;1075 1076 disable_irq(nn->irq_entries[NFP_NET_IRQ_LSC_IDX].vector);1077 netif_carrier_off(nn->dp.netdev);1078 nn->link_up = false;1079 1080 for (r = 0; r < nn->dp.num_r_vecs; r++) {1081 r_vec = &nn->r_vecs[r];1082 1083 disable_irq(r_vec->irq_vector);1084 napi_disable(&r_vec->napi);1085 1086 if (r_vec->rx_ring)1087 cancel_work_sync(&r_vec->rx_dim.work);1088 1089 if (r_vec->tx_ring)1090 cancel_work_sync(&r_vec->tx_dim.work);1091 }1092 1093 netif_tx_disable(nn->dp.netdev);1094}1095 1096/**1097 * nfp_net_close_free_all() - Free all runtime resources1098 * @nn: NFP Net device to reconfigure1099 */1100static void nfp_net_close_free_all(struct nfp_net *nn)1101{1102 unsigned int r;1103 1104 nfp_net_tx_rings_free(&nn->dp);1105 nfp_net_rx_rings_free(&nn->dp);1106 1107 for (r = 0; r < nn->dp.num_r_vecs; r++)1108 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);1109 1110 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);1111 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);1112}1113 1114/**1115 * nfp_net_netdev_close() - Called when the device is downed1116 * @netdev: netdev structure1117 */1118static int nfp_net_netdev_close(struct net_device *netdev)1119{1120 struct nfp_net *nn = netdev_priv(netdev);1121 1122 /* Step 1: Disable RX and TX rings from the Linux kernel perspective1123 */1124 nfp_net_close_stack(nn);1125 1126 /* Step 2: Tell NFP1127 */1128 if (nn->cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER)1129 __dev_mc_unsync(netdev, nfp_net_mc_unsync);1130 1131 nfp_net_clear_config_and_disable(nn);1132 nfp_port_configure(netdev, false);1133 1134 /* Step 3: Free resources1135 */1136 nfp_net_close_free_all(nn);1137 1138 nn_dbg(nn, "%s down", netdev->name);1139 return 0;1140}1141 1142void nfp_ctrl_close(struct nfp_net *nn)1143{1144 int r;1145 1146 rtnl_lock();1147 1148 for (r = 0; r < nn->dp.num_r_vecs; r++) {1149 disable_irq(nn->r_vecs[r].irq_vector);1150 tasklet_disable(&nn->r_vecs[r].tasklet);1151 }1152 1153 nfp_net_clear_config_and_disable(nn);1154 1155 nfp_net_close_free_all(nn);1156 1157 rtnl_unlock();1158}1159 1160static void nfp_net_rx_dim_work(struct work_struct *work)1161{1162 struct nfp_net_r_vector *r_vec;1163 unsigned int factor, value;1164 struct dim_cq_moder moder;1165 struct nfp_net *nn;1166 struct dim *dim;1167 1168 dim = container_of(work, struct dim, work);1169 moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix);1170 r_vec = container_of(dim, struct nfp_net_r_vector, rx_dim);1171 nn = r_vec->nfp_net;1172 1173 /* Compute factor used to convert coalesce '_usecs' parameters to1174 * ME timestamp ticks. There are 16 ME clock cycles for each timestamp1175 * count.1176 */1177 factor = nn->tlv_caps.me_freq_mhz / 16;1178 if (nfp_net_coalesce_para_check(factor * moder.usec) ||1179 nfp_net_coalesce_para_check(moder.pkts))1180 return;1181 1182 /* copy RX interrupt coalesce parameters */1183 value = (moder.pkts << 16) | (factor * moder.usec);1184 nn_writel(nn, NFP_NET_CFG_RXR_IRQ_MOD(r_vec->rx_ring->idx), value);1185 (void)nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_IRQMOD);1186 1187 dim->state = DIM_START_MEASURE;1188}1189 1190static void nfp_net_tx_dim_work(struct work_struct *work)1191{1192 struct nfp_net_r_vector *r_vec;1193 unsigned int factor, value;1194 struct dim_cq_moder moder;1195 struct nfp_net *nn;1196 struct dim *dim;1197 1198 dim = container_of(work, struct dim, work);1199 moder = net_dim_get_tx_moderation(dim->mode, dim->profile_ix);1200 r_vec = container_of(dim, struct nfp_net_r_vector, tx_dim);1201 nn = r_vec->nfp_net;1202 1203 /* Compute factor used to convert coalesce '_usecs' parameters to1204 * ME timestamp ticks. There are 16 ME clock cycles for each timestamp1205 * count.1206 */1207 factor = nn->tlv_caps.me_freq_mhz / 16;1208 if (nfp_net_coalesce_para_check(factor * moder.usec) ||1209 nfp_net_coalesce_para_check(moder.pkts))1210 return;1211 1212 /* copy TX interrupt coalesce parameters */1213 value = (moder.pkts << 16) | (factor * moder.usec);1214 nn_writel(nn, NFP_NET_CFG_TXR_IRQ_MOD(r_vec->tx_ring->idx), value);1215 (void)nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_IRQMOD);1216 1217 dim->state = DIM_START_MEASURE;1218}1219 1220/**1221 * nfp_net_open_stack() - Start the device from stack's perspective1222 * @nn: NFP Net device to reconfigure1223 */1224static void nfp_net_open_stack(struct nfp_net *nn)1225{1226 struct nfp_net_r_vector *r_vec;1227 unsigned int r;1228 1229 for (r = 0; r < nn->dp.num_r_vecs; r++) {1230 r_vec = &nn->r_vecs[r];1231 1232 if (r_vec->rx_ring) {1233 INIT_WORK(&r_vec->rx_dim.work, nfp_net_rx_dim_work);1234 r_vec->rx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;1235 }1236 1237 if (r_vec->tx_ring) {1238 INIT_WORK(&r_vec->tx_dim.work, nfp_net_tx_dim_work);1239 r_vec->tx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;1240 }1241 1242 napi_enable(&r_vec->napi);1243 enable_irq(r_vec->irq_vector);1244 }1245 1246 netif_tx_wake_all_queues(nn->dp.netdev);1247 1248 enable_irq(nn->irq_entries[NFP_NET_IRQ_LSC_IDX].vector);1249 nfp_net_read_link_status(nn);1250}1251 1252static int nfp_net_open_alloc_all(struct nfp_net *nn)1253{1254 int err, r;1255 1256 err = nfp_net_aux_irq_request(nn, NFP_NET_CFG_EXN, "%s-exn",1257 nn->exn_name, sizeof(nn->exn_name),1258 NFP_NET_IRQ_EXN_IDX, nn->exn_handler);1259 if (err)1260 return err;1261 err = nfp_net_aux_irq_request(nn, NFP_NET_CFG_LSC, "%s-lsc",1262 nn->lsc_name, sizeof(nn->lsc_name),1263 NFP_NET_IRQ_LSC_IDX, nn->lsc_handler);1264 if (err)1265 goto err_free_exn;1266 disable_irq(nn->irq_entries[NFP_NET_IRQ_LSC_IDX].vector);1267 1268 for (r = 0; r < nn->dp.num_r_vecs; r++) {1269 err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r);1270 if (err)1271 goto err_cleanup_vec_p;1272 }1273 1274 err = nfp_net_rx_rings_prepare(nn, &nn->dp);1275 if (err)1276 goto err_cleanup_vec;1277 1278 err = nfp_net_tx_rings_prepare(nn, &nn->dp);1279 if (err)1280 goto err_free_rx_rings;1281 1282 for (r = 0; r < nn->max_r_vecs; r++)1283 nfp_net_vector_assign_rings(&nn->dp, &nn->r_vecs[r], r);1284 1285 return 0;1286 1287err_free_rx_rings:1288 nfp_net_rx_rings_free(&nn->dp);1289err_cleanup_vec:1290 r = nn->dp.num_r_vecs;1291err_cleanup_vec_p:1292 while (r--)1293 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);1294 nfp_net_aux_irq_free(nn, NFP_NET_CFG_LSC, NFP_NET_IRQ_LSC_IDX);1295err_free_exn:1296 nfp_net_aux_irq_free(nn, NFP_NET_CFG_EXN, NFP_NET_IRQ_EXN_IDX);1297 return err;1298}1299 1300static int nfp_net_netdev_open(struct net_device *netdev)1301{1302 struct nfp_net *nn = netdev_priv(netdev);1303 int err;1304 1305 /* Step 1: Allocate resources for rings and the like1306 * - Request interrupts1307 * - Allocate RX and TX ring resources1308 * - Setup initial RSS table1309 */1310 err = nfp_net_open_alloc_all(nn);1311 if (err)1312 return err;1313 1314 err = netif_set_real_num_tx_queues(netdev, nn->dp.num_stack_tx_rings);1315 if (err)1316 goto err_free_all;1317 1318 err = netif_set_real_num_rx_queues(netdev, nn->dp.num_rx_rings);1319 if (err)1320 goto err_free_all;1321 1322 /* Step 2: Configure the NFP1323 * - Ifup the physical interface if it exists1324 * - Enable rings from 0 to tx_rings/rx_rings - 1.1325 * - Write MAC address (in case it changed)1326 * - Set the MTU1327 * - Set the Freelist buffer size1328 * - Enable the FW1329 */1330 err = nfp_port_configure(netdev, true);1331 if (err)1332 goto err_free_all;1333 1334 err = nfp_net_set_config_and_enable(nn);1335 if (err)1336 goto err_port_disable;1337 1338 /* Step 3: Enable for kernel1339 * - put some freelist descriptors on each RX ring1340 * - enable NAPI on each ring1341 * - enable all TX queues1342 * - set link state1343 */1344 nfp_net_open_stack(nn);1345 1346 return 0;1347 1348err_port_disable:1349 nfp_port_configure(netdev, false);1350err_free_all:1351 nfp_net_close_free_all(nn);1352 return err;1353}1354 1355int nfp_ctrl_open(struct nfp_net *nn)1356{1357 int err, r;1358 1359 /* ring dumping depends on vNICs being opened/closed under rtnl */1360 rtnl_lock();1361 1362 err = nfp_net_open_alloc_all(nn);1363 if (err)1364 goto err_unlock;1365 1366 err = nfp_net_set_config_and_enable(nn);1367 if (err)1368 goto err_free_all;1369 1370 for (r = 0; r < nn->dp.num_r_vecs; r++)1371 enable_irq(nn->r_vecs[r].irq_vector);1372 1373 rtnl_unlock();1374 1375 return 0;1376 1377err_free_all:1378 nfp_net_close_free_all(nn);1379err_unlock:1380 rtnl_unlock();1381 return err;1382}1383 1384int nfp_net_sched_mbox_amsg_work(struct nfp_net *nn, u32 cmd, const void *data, size_t len,1385 int (*cb)(struct nfp_net *, struct nfp_mbox_amsg_entry *))1386{1387 struct nfp_mbox_amsg_entry *entry;1388 1389 entry = kmalloc(sizeof(*entry) + len, GFP_ATOMIC);1390 if (!entry)1391 return -ENOMEM;1392 1393 memcpy(entry->msg, data, len);1394 entry->cmd = cmd;1395 entry->cfg = cb;1396 1397 spin_lock_bh(&nn->mbox_amsg.lock);1398 list_add_tail(&entry->list, &nn->mbox_amsg.list);1399 spin_unlock_bh(&nn->mbox_amsg.lock);1400 1401 schedule_work(&nn->mbox_amsg.work);1402 1403 return 0;1404}1405 1406static void nfp_net_mbox_amsg_work(struct work_struct *work)1407{1408 struct nfp_net *nn = container_of(work, struct nfp_net, mbox_amsg.work);1409 struct nfp_mbox_amsg_entry *entry, *tmp;1410 struct list_head tmp_list;1411 1412 INIT_LIST_HEAD(&tmp_list);1413 1414 spin_lock_bh(&nn->mbox_amsg.lock);1415 list_splice_init(&nn->mbox_amsg.list, &tmp_list);1416 spin_unlock_bh(&nn->mbox_amsg.lock);1417 1418 list_for_each_entry_safe(entry, tmp, &tmp_list, list) {1419 int err = entry->cfg(nn, entry);1420 1421 if (err)1422 nn_err(nn, "Config cmd %d to HW failed %d.\n", entry->cmd, err);1423 1424 list_del(&entry->list);1425 kfree(entry);1426 }1427}1428 1429static int nfp_net_mc_cfg(struct nfp_net *nn, struct nfp_mbox_amsg_entry *entry)1430{1431 unsigned char *addr = entry->msg;1432 int ret;1433 1434 ret = nfp_net_mbox_lock(nn, NFP_NET_CFG_MULTICAST_SZ);1435 if (ret)1436 return ret;1437 1438 nn_writel(nn, nn->tlv_caps.mbox_off + NFP_NET_CFG_MULTICAST_MAC_HI,1439 get_unaligned_be32(addr));1440 nn_writew(nn, nn->tlv_caps.mbox_off + NFP_NET_CFG_MULTICAST_MAC_LO,1441 get_unaligned_be16(addr + 4));1442 1443 return nfp_net_mbox_reconfig_and_unlock(nn, entry->cmd);1444}1445 1446static int nfp_net_mc_sync(struct net_device *netdev, const unsigned char *addr)1447{1448 struct nfp_net *nn = netdev_priv(netdev);1449 1450 if (netdev_mc_count(netdev) > NFP_NET_CFG_MAC_MC_MAX) {1451 nn_err(nn, "Requested number of MC addresses (%d) exceeds maximum (%d).\n",1452 netdev_mc_count(netdev), NFP_NET_CFG_MAC_MC_MAX);1453 return -EINVAL;1454 }1455 1456 return nfp_net_sched_mbox_amsg_work(nn, NFP_NET_CFG_MBOX_CMD_MULTICAST_ADD, addr,1457 NFP_NET_CFG_MULTICAST_SZ, nfp_net_mc_cfg);1458}1459 1460static int nfp_net_mc_unsync(struct net_device *netdev, const unsigned char *addr)1461{1462 struct nfp_net *nn = netdev_priv(netdev);1463 1464 return nfp_net_sched_mbox_amsg_work(nn, NFP_NET_CFG_MBOX_CMD_MULTICAST_DEL, addr,1465 NFP_NET_CFG_MULTICAST_SZ, nfp_net_mc_cfg);1466}1467 1468static void nfp_net_set_rx_mode(struct net_device *netdev)1469{1470 struct nfp_net *nn = netdev_priv(netdev);1471 u32 new_ctrl, new_ctrl_w1;1472 1473 new_ctrl = nn->dp.ctrl;1474 new_ctrl_w1 = nn->dp.ctrl_w1;1475 1476 if (!netdev_mc_empty(netdev) || netdev->flags & IFF_ALLMULTI)1477 new_ctrl |= nn->cap & NFP_NET_CFG_CTRL_L2MC;1478 else1479 new_ctrl &= ~NFP_NET_CFG_CTRL_L2MC;1480 1481 if (netdev->flags & IFF_ALLMULTI)1482 new_ctrl_w1 &= ~NFP_NET_CFG_CTRL_MCAST_FILTER;1483 else1484 new_ctrl_w1 |= nn->cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER;1485 1486 if (netdev->flags & IFF_PROMISC) {1487 if (nn->cap & NFP_NET_CFG_CTRL_PROMISC)1488 new_ctrl |= NFP_NET_CFG_CTRL_PROMISC;1489 else1490 nn_warn(nn, "FW does not support promiscuous mode\n");1491 } else {1492 new_ctrl &= ~NFP_NET_CFG_CTRL_PROMISC;1493 }1494 1495 if ((nn->cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER) &&1496 __dev_mc_sync(netdev, nfp_net_mc_sync, nfp_net_mc_unsync))1497 netdev_err(netdev, "Sync mc address failed\n");1498 1499 if (new_ctrl == nn->dp.ctrl && new_ctrl_w1 == nn->dp.ctrl_w1)1500 return;1501 1502 if (new_ctrl != nn->dp.ctrl)1503 nn_writel(nn, NFP_NET_CFG_CTRL, new_ctrl);1504 if (new_ctrl_w1 != nn->dp.ctrl_w1)1505 nn_writel(nn, NFP_NET_CFG_CTRL_WORD1, new_ctrl_w1);1506 nfp_net_reconfig_post(nn, NFP_NET_CFG_UPDATE_GEN);1507 1508 nn->dp.ctrl = new_ctrl;1509 nn->dp.ctrl_w1 = new_ctrl_w1;1510}1511 1512static void nfp_net_rss_init_itbl(struct nfp_net *nn)1513{1514 int i;1515 1516 for (i = 0; i < sizeof(nn->rss_itbl); i++)1517 nn->rss_itbl[i] =1518 ethtool_rxfh_indir_default(i, nn->dp.num_rx_rings);1519}1520 1521static void nfp_net_dp_swap(struct nfp_net *nn, struct nfp_net_dp *dp)1522{1523 struct nfp_net_dp new_dp = *dp;1524 1525 *dp = nn->dp;1526 nn->dp = new_dp;1527 1528 WRITE_ONCE(nn->dp.netdev->mtu, new_dp.mtu);1529 1530 if (!netif_is_rxfh_configured(nn->dp.netdev))1531 nfp_net_rss_init_itbl(nn);1532}1533 1534static int nfp_net_dp_swap_enable(struct nfp_net *nn, struct nfp_net_dp *dp)1535{1536 unsigned int r;1537 int err;1538 1539 nfp_net_dp_swap(nn, dp);1540 1541 for (r = 0; r < nn->max_r_vecs; r++)1542 nfp_net_vector_assign_rings(&nn->dp, &nn->r_vecs[r], r);1543 1544 err = netif_set_real_num_queues(nn->dp.netdev,1545 nn->dp.num_stack_tx_rings,1546 nn->dp.num_rx_rings);1547 if (err)1548 return err;1549 1550 return nfp_net_set_config_and_enable(nn);1551}1552 1553struct nfp_net_dp *nfp_net_clone_dp(struct nfp_net *nn)1554{1555 struct nfp_net_dp *new;1556 1557 new = kmalloc(sizeof(*new), GFP_KERNEL);1558 if (!new)1559 return NULL;1560 1561 *new = nn->dp;1562 1563 new->xsk_pools = kmemdup(new->xsk_pools,1564 array_size(nn->max_r_vecs,1565 sizeof(new->xsk_pools)),1566 GFP_KERNEL);1567 if (!new->xsk_pools) {1568 kfree(new);1569 return NULL;1570 }1571 1572 /* Clear things which need to be recomputed */1573 new->fl_bufsz = 0;1574 new->tx_rings = NULL;1575 new->rx_rings = NULL;1576 new->num_r_vecs = 0;1577 new->num_stack_tx_rings = 0;1578 new->txrwb = NULL;1579 new->txrwb_dma = 0;1580 1581 return new;1582}1583 1584static void nfp_net_free_dp(struct nfp_net_dp *dp)1585{1586 kfree(dp->xsk_pools);1587 kfree(dp);1588}1589 1590static int1591nfp_net_check_config(struct nfp_net *nn, struct nfp_net_dp *dp,1592 struct netlink_ext_ack *extack)1593{1594 unsigned int r, xsk_min_fl_bufsz;1595 1596 /* XDP-enabled tests */1597 if (!dp->xdp_prog)1598 return 0;1599 if (dp->fl_bufsz > PAGE_SIZE) {1600 NL_SET_ERR_MSG_MOD(extack, "MTU too large w/ XDP enabled");1601 return -EINVAL;1602 }1603 if (dp->num_tx_rings > nn->max_tx_rings) {1604 NL_SET_ERR_MSG_MOD(extack, "Insufficient number of TX rings w/ XDP enabled");1605 return -EINVAL;1606 }1607 1608 xsk_min_fl_bufsz = nfp_net_calc_fl_bufsz_xsk(dp);1609 for (r = 0; r < nn->max_r_vecs; r++) {1610 if (!dp->xsk_pools[r])1611 continue;1612 1613 if (xsk_pool_get_rx_frame_size(dp->xsk_pools[r]) < xsk_min_fl_bufsz) {1614 NL_SET_ERR_MSG_MOD(extack,1615 "XSK buffer pool chunk size too small");1616 return -EINVAL;1617 }1618 }1619 1620 return 0;1621}1622 1623int nfp_net_ring_reconfig(struct nfp_net *nn, struct nfp_net_dp *dp,1624 struct netlink_ext_ack *extack)1625{1626 int r, err;1627 1628 dp->fl_bufsz = nfp_net_calc_fl_bufsz(dp);1629 1630 dp->num_stack_tx_rings = dp->num_tx_rings;1631 if (dp->xdp_prog)1632 dp->num_stack_tx_rings -= dp->num_rx_rings;1633 1634 dp->num_r_vecs = max(dp->num_rx_rings, dp->num_stack_tx_rings);1635 1636 err = nfp_net_check_config(nn, dp, extack);1637 if (err)1638 goto exit_free_dp;1639 1640 if (!netif_running(dp->netdev)) {1641 nfp_net_dp_swap(nn, dp);1642 err = 0;1643 goto exit_free_dp;1644 }1645 1646 /* Prepare new rings */1647 for (r = nn->dp.num_r_vecs; r < dp->num_r_vecs; r++) {1648 err = nfp_net_prepare_vector(nn, &nn->r_vecs[r], r);1649 if (err) {1650 dp->num_r_vecs = r;1651 goto err_cleanup_vecs;1652 }1653 }1654 1655 err = nfp_net_rx_rings_prepare(nn, dp);1656 if (err)1657 goto err_cleanup_vecs;1658 1659 err = nfp_net_tx_rings_prepare(nn, dp);1660 if (err)1661 goto err_free_rx;1662 1663 /* Stop device, swap in new rings, try to start the firmware */1664 nfp_net_close_stack(nn);1665 nfp_net_clear_config_and_disable(nn);1666 1667 err = nfp_net_dp_swap_enable(nn, dp);1668 if (err) {1669 int err2;1670 1671 nfp_net_clear_config_and_disable(nn);1672 1673 /* Try with old configuration and old rings */1674 err2 = nfp_net_dp_swap_enable(nn, dp);1675 if (err2)1676 nn_err(nn, "Can't restore ring config - FW communication failed (%d,%d)\n",1677 err, err2);1678 }1679 for (r = dp->num_r_vecs - 1; r >= nn->dp.num_r_vecs; r--)1680 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);1681 1682 nfp_net_rx_rings_free(dp);1683 nfp_net_tx_rings_free(dp);1684 1685 nfp_net_open_stack(nn);1686exit_free_dp:1687 nfp_net_free_dp(dp);1688 1689 return err;1690 1691err_free_rx:1692 nfp_net_rx_rings_free(dp);1693err_cleanup_vecs:1694 for (r = dp->num_r_vecs - 1; r >= nn->dp.num_r_vecs; r--)1695 nfp_net_cleanup_vector(nn, &nn->r_vecs[r]);1696 nfp_net_free_dp(dp);1697 return err;1698}1699 1700static int nfp_net_change_mtu(struct net_device *netdev, int new_mtu)1701{1702 struct nfp_net *nn = netdev_priv(netdev);1703 struct nfp_net_dp *dp;1704 int err;1705 1706 err = nfp_app_check_mtu(nn->app, netdev, new_mtu);1707 if (err)1708 return err;1709 1710 dp = nfp_net_clone_dp(nn);1711 if (!dp)1712 return -ENOMEM;1713 1714 dp->mtu = new_mtu;1715 1716 return nfp_net_ring_reconfig(nn, dp, NULL);1717}1718 1719static int1720nfp_net_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid)1721{1722 const u32 cmd = NFP_NET_CFG_MBOX_CMD_CTAG_FILTER_ADD;1723 struct nfp_net *nn = netdev_priv(netdev);1724 int err;1725 1726 /* Priority tagged packets with vlan id 0 are processed by the1727 * NFP as untagged packets1728 */1729 if (!vid)1730 return 0;1731 1732 err = nfp_net_mbox_lock(nn, NFP_NET_CFG_VLAN_FILTER_SZ);1733 if (err)1734 return err;1735 1736 nn_writew(nn, nn->tlv_caps.mbox_off + NFP_NET_CFG_VLAN_FILTER_VID, vid);1737 nn_writew(nn, nn->tlv_caps.mbox_off + NFP_NET_CFG_VLAN_FILTER_PROTO,1738 ETH_P_8021Q);1739 1740 return nfp_net_mbox_reconfig_and_unlock(nn, cmd);1741}1742 1743static int1744nfp_net_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid)1745{1746 const u32 cmd = NFP_NET_CFG_MBOX_CMD_CTAG_FILTER_KILL;1747 struct nfp_net *nn = netdev_priv(netdev);1748 int err;1749 1750 /* Priority tagged packets with vlan id 0 are processed by the1751 * NFP as untagged packets1752 */1753 if (!vid)1754 return 0;1755 1756 err = nfp_net_mbox_lock(nn, NFP_NET_CFG_VLAN_FILTER_SZ);1757 if (err)1758 return err;1759 1760 nn_writew(nn, nn->tlv_caps.mbox_off + NFP_NET_CFG_VLAN_FILTER_VID, vid);1761 nn_writew(nn, nn->tlv_caps.mbox_off + NFP_NET_CFG_VLAN_FILTER_PROTO,1762 ETH_P_8021Q);1763 1764 return nfp_net_mbox_reconfig_and_unlock(nn, cmd);1765}1766 1767static void1768nfp_net_fs_fill_v4(struct nfp_net *nn, struct nfp_fs_entry *entry, u32 op, u32 *addr)1769{1770 unsigned int i;1771 1772 union {1773 struct {1774 __be16 loc;1775 u8 k_proto, m_proto;1776 __be32 k_sip, m_sip, k_dip, m_dip;1777 __be16 k_sport, m_sport, k_dport, m_dport;1778 };1779 __be32 val[7];1780 } v4_rule;1781 1782 nn_writel(nn, *addr, op);1783 *addr += sizeof(u32);1784 1785 v4_rule.loc = cpu_to_be16(entry->loc);1786 v4_rule.k_proto = entry->key.l4_proto;1787 v4_rule.m_proto = entry->msk.l4_proto;1788 v4_rule.k_sip = entry->key.sip4;1789 v4_rule.m_sip = entry->msk.sip4;1790 v4_rule.k_dip = entry->key.dip4;1791 v4_rule.m_dip = entry->msk.dip4;1792 v4_rule.k_sport = entry->key.sport;1793 v4_rule.m_sport = entry->msk.sport;1794 v4_rule.k_dport = entry->key.dport;1795 v4_rule.m_dport = entry->msk.dport;1796 1797 for (i = 0; i < ARRAY_SIZE(v4_rule.val); i++, *addr += sizeof(__be32))1798 nn_writel(nn, *addr, be32_to_cpu(v4_rule.val[i]));1799}1800 1801static void1802nfp_net_fs_fill_v6(struct nfp_net *nn, struct nfp_fs_entry *entry, u32 op, u32 *addr)1803{1804 unsigned int i;1805 1806 union {1807 struct {1808 __be16 loc;1809 u8 k_proto, m_proto;1810 __be32 k_sip[4], m_sip[4], k_dip[4], m_dip[4];1811 __be16 k_sport, m_sport, k_dport, m_dport;1812 };1813 __be32 val[19];1814 } v6_rule;1815 1816 nn_writel(nn, *addr, op);1817 *addr += sizeof(u32);1818 1819 v6_rule.loc = cpu_to_be16(entry->loc);1820 v6_rule.k_proto = entry->key.l4_proto;1821 v6_rule.m_proto = entry->msk.l4_proto;1822 for (i = 0; i < 4; i++) {1823 v6_rule.k_sip[i] = entry->key.sip6[i];1824 v6_rule.m_sip[i] = entry->msk.sip6[i];1825 v6_rule.k_dip[i] = entry->key.dip6[i];1826 v6_rule.m_dip[i] = entry->msk.dip6[i];1827 }1828 v6_rule.k_sport = entry->key.sport;1829 v6_rule.m_sport = entry->msk.sport;1830 v6_rule.k_dport = entry->key.dport;1831 v6_rule.m_dport = entry->msk.dport;1832 1833 for (i = 0; i < ARRAY_SIZE(v6_rule.val); i++, *addr += sizeof(__be32))1834 nn_writel(nn, *addr, be32_to_cpu(v6_rule.val[i]));1835}1836 1837#define NFP_FS_QUEUE_ID GENMASK(22, 16)1838#define NFP_FS_ACT GENMASK(15, 0)1839#define NFP_FS_ACT_DROP BIT(0)1840#define NFP_FS_ACT_Q BIT(1)1841static void1842nfp_net_fs_fill_act(struct nfp_net *nn, struct nfp_fs_entry *entry, u32 addr)1843{1844 u32 action = 0; /* 0 means default passthrough */1845 1846 if (entry->action == RX_CLS_FLOW_DISC)1847 action = NFP_FS_ACT_DROP;1848 else if (!(entry->flow_type & FLOW_RSS))1849 action = FIELD_PREP(NFP_FS_QUEUE_ID, entry->action) | NFP_FS_ACT_Q;1850 1851 nn_writel(nn, addr, action);1852}1853 1854int nfp_net_fs_add_hw(struct nfp_net *nn, struct nfp_fs_entry *entry)1855{1856 u32 addr = nn->tlv_caps.mbox_off + NFP_NET_CFG_MBOX_SIMPLE_VAL;1857 int err;1858 1859 err = nfp_net_mbox_lock(nn, NFP_NET_CFG_FS_SZ);1860 if (err)1861 return err;1862 1863 switch (entry->flow_type & ~FLOW_RSS) {1864 case TCP_V4_FLOW:1865 case UDP_V4_FLOW:1866 case SCTP_V4_FLOW:1867 case IPV4_USER_FLOW:1868 nfp_net_fs_fill_v4(nn, entry, NFP_NET_CFG_MBOX_CMD_FS_ADD_V4, &addr);1869 break;1870 case TCP_V6_FLOW:1871 case UDP_V6_FLOW:1872 case SCTP_V6_FLOW:1873 case IPV6_USER_FLOW:1874 nfp_net_fs_fill_v6(nn, entry, NFP_NET_CFG_MBOX_CMD_FS_ADD_V6, &addr);1875 break;1876 case ETHER_FLOW:1877 nn_writel(nn, addr, NFP_NET_CFG_MBOX_CMD_FS_ADD_ETHTYPE);1878 addr += sizeof(u32);1879 nn_writew(nn, addr, be16_to_cpu(entry->key.l3_proto));1880 addr += sizeof(u32);1881 break;1882 }1883 1884 nfp_net_fs_fill_act(nn, entry, addr);1885 1886 err = nfp_net_mbox_reconfig_and_unlock(nn, NFP_NET_CFG_MBOX_CMD_FLOW_STEER);1887 if (err) {1888 nn_err(nn, "Add new fs rule failed with %d\n", err);1889 return -EIO;1890 }1891 1892 return 0;1893}1894 1895int nfp_net_fs_del_hw(struct nfp_net *nn, struct nfp_fs_entry *entry)1896{1897 u32 addr = nn->tlv_caps.mbox_off + NFP_NET_CFG_MBOX_SIMPLE_VAL;1898 int err;1899 1900 err = nfp_net_mbox_lock(nn, NFP_NET_CFG_FS_SZ);1901 if (err)1902 return err;1903 1904 switch (entry->flow_type & ~FLOW_RSS) {1905 case TCP_V4_FLOW:1906 case UDP_V4_FLOW:1907 case SCTP_V4_FLOW:1908 case IPV4_USER_FLOW:1909 nfp_net_fs_fill_v4(nn, entry, NFP_NET_CFG_MBOX_CMD_FS_DEL_V4, &addr);1910 break;1911 case TCP_V6_FLOW:1912 case UDP_V6_FLOW:1913 case SCTP_V6_FLOW:1914 case IPV6_USER_FLOW:1915 nfp_net_fs_fill_v6(nn, entry, NFP_NET_CFG_MBOX_CMD_FS_DEL_V6, &addr);1916 break;1917 case ETHER_FLOW:1918 nn_writel(nn, addr, NFP_NET_CFG_MBOX_CMD_FS_DEL_ETHTYPE);1919 addr += sizeof(u32);1920 nn_writew(nn, addr, be16_to_cpu(entry->key.l3_proto));1921 addr += sizeof(u32);1922 break;1923 }1924 1925 nfp_net_fs_fill_act(nn, entry, addr);1926 1927 err = nfp_net_mbox_reconfig_and_unlock(nn, NFP_NET_CFG_MBOX_CMD_FLOW_STEER);1928 if (err) {1929 nn_err(nn, "Delete fs rule failed with %d\n", err);1930 return -EIO;1931 }1932 1933 return 0;1934}1935 1936static void nfp_net_fs_clean(struct nfp_net *nn)1937{1938 struct nfp_fs_entry *entry, *tmp;1939 1940 list_for_each_entry_safe(entry, tmp, &nn->fs.list, node) {1941 nfp_net_fs_del_hw(nn, entry);1942 list_del(&entry->node);1943 kfree(entry);1944 }1945}1946 1947static void nfp_net_stat64(struct net_device *netdev,1948 struct rtnl_link_stats64 *stats)1949{1950 struct nfp_net *nn = netdev_priv(netdev);1951 int r;1952 1953 /* Collect software stats */1954 for (r = 0; r < nn->max_r_vecs; r++) {1955 struct nfp_net_r_vector *r_vec = &nn->r_vecs[r];1956 u64 data[3];1957 unsigned int start;1958 1959 do {1960 start = u64_stats_fetch_begin(&r_vec->rx_sync);1961 data[0] = r_vec->rx_pkts;1962 data[1] = r_vec->rx_bytes;1963 data[2] = r_vec->rx_drops;1964 } while (u64_stats_fetch_retry(&r_vec->rx_sync, start));1965 stats->rx_packets += data[0];1966 stats->rx_bytes += data[1];1967 stats->rx_dropped += data[2];1968 1969 do {1970 start = u64_stats_fetch_begin(&r_vec->tx_sync);1971 data[0] = r_vec->tx_pkts;1972 data[1] = r_vec->tx_bytes;1973 data[2] = r_vec->tx_errors;1974 } while (u64_stats_fetch_retry(&r_vec->tx_sync, start));1975 stats->tx_packets += data[0];1976 stats->tx_bytes += data[1];1977 stats->tx_errors += data[2];1978 }1979 1980 /* Add in device stats */1981 stats->multicast += nn_readq(nn, NFP_NET_CFG_STATS_RX_MC_FRAMES);1982 stats->rx_dropped += nn_readq(nn, NFP_NET_CFG_STATS_RX_DISCARDS);1983 stats->rx_errors += nn_readq(nn, NFP_NET_CFG_STATS_RX_ERRORS);1984 1985 stats->tx_dropped += nn_readq(nn, NFP_NET_CFG_STATS_TX_DISCARDS);1986 stats->tx_errors += nn_readq(nn, NFP_NET_CFG_STATS_TX_ERRORS);1987}1988 1989static int nfp_net_set_features(struct net_device *netdev,1990 netdev_features_t features)1991{1992 netdev_features_t changed = netdev->features ^ features;1993 struct nfp_net *nn = netdev_priv(netdev);1994 u32 new_ctrl;1995 int err;1996 1997 /* Assume this is not called with features we have not advertised */1998 1999 new_ctrl = nn->dp.ctrl;2000 2001 if (changed & NETIF_F_RXCSUM) {2002 if (features & NETIF_F_RXCSUM)2003 new_ctrl |= nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY;2004 else2005 new_ctrl &= ~NFP_NET_CFG_CTRL_RXCSUM_ANY;2006 }2007 2008 if (changed & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) {2009 if (features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM))2010 new_ctrl |= NFP_NET_CFG_CTRL_TXCSUM;2011 else2012 new_ctrl &= ~NFP_NET_CFG_CTRL_TXCSUM;2013 }2014 2015 if (changed & (NETIF_F_TSO | NETIF_F_TSO6)) {2016 if (features & (NETIF_F_TSO | NETIF_F_TSO6))2017 new_ctrl |= nn->cap & NFP_NET_CFG_CTRL_LSO2 ?:2018 NFP_NET_CFG_CTRL_LSO;2019 else2020 new_ctrl &= ~NFP_NET_CFG_CTRL_LSO_ANY;2021 }2022 2023 if (changed & NETIF_F_HW_VLAN_CTAG_RX) {2024 if (features & NETIF_F_HW_VLAN_CTAG_RX)2025 new_ctrl |= nn->cap & NFP_NET_CFG_CTRL_RXVLAN_V2 ?:2026 NFP_NET_CFG_CTRL_RXVLAN;2027 else2028 new_ctrl &= ~NFP_NET_CFG_CTRL_RXVLAN_ANY;2029 }2030 2031 if (changed & NETIF_F_HW_VLAN_CTAG_TX) {2032 if (features & NETIF_F_HW_VLAN_CTAG_TX)2033 new_ctrl |= nn->cap & NFP_NET_CFG_CTRL_TXVLAN_V2 ?:2034 NFP_NET_CFG_CTRL_TXVLAN;2035 else2036 new_ctrl &= ~NFP_NET_CFG_CTRL_TXVLAN_ANY;2037 }2038 2039 if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) {2040 if (features & NETIF_F_HW_VLAN_CTAG_FILTER)2041 new_ctrl |= NFP_NET_CFG_CTRL_CTAG_FILTER;2042 else2043 new_ctrl &= ~NFP_NET_CFG_CTRL_CTAG_FILTER;2044 }2045 2046 if (changed & NETIF_F_HW_VLAN_STAG_RX) {2047 if (features & NETIF_F_HW_VLAN_STAG_RX)2048 new_ctrl |= NFP_NET_CFG_CTRL_RXQINQ;2049 else2050 new_ctrl &= ~NFP_NET_CFG_CTRL_RXQINQ;2051 }2052 2053 if (changed & NETIF_F_SG) {2054 if (features & NETIF_F_SG)2055 new_ctrl |= NFP_NET_CFG_CTRL_GATHER;2056 else2057 new_ctrl &= ~NFP_NET_CFG_CTRL_GATHER;2058 }2059 2060 err = nfp_port_set_features(netdev, features);2061 if (err)2062 return err;2063 2064 nn_dbg(nn, "Feature change 0x%llx -> 0x%llx (changed=0x%llx)\n",2065 netdev->features, features, changed);2066 2067 if (new_ctrl == nn->dp.ctrl)2068 return 0;2069 2070 nn_dbg(nn, "NIC ctrl: 0x%x -> 0x%x\n", nn->dp.ctrl, new_ctrl);2071 nn_writel(nn, NFP_NET_CFG_CTRL, new_ctrl);2072 err = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_GEN);2073 if (err)2074 return err;2075 2076 nn->dp.ctrl = new_ctrl;2077 2078 return 0;2079}2080 2081static netdev_features_t2082nfp_net_fix_features(struct net_device *netdev,2083 netdev_features_t features)2084{2085 if ((features & NETIF_F_HW_VLAN_CTAG_RX) &&2086 (features & NETIF_F_HW_VLAN_STAG_RX)) {2087 if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {2088 features &= ~NETIF_F_HW_VLAN_CTAG_RX;2089 netdev->wanted_features &= ~NETIF_F_HW_VLAN_CTAG_RX;2090 netdev_warn(netdev,2091 "S-tag and C-tag stripping can't be enabled at the same time. Enabling S-tag stripping and disabling C-tag stripping\n");2092 } else if (netdev->features & NETIF_F_HW_VLAN_STAG_RX) {2093 features &= ~NETIF_F_HW_VLAN_STAG_RX;2094 netdev->wanted_features &= ~NETIF_F_HW_VLAN_STAG_RX;2095 netdev_warn(netdev,2096 "S-tag and C-tag stripping can't be enabled at the same time. Enabling C-tag stripping and disabling S-tag stripping\n");2097 }2098 }2099 return features;2100}2101 2102static netdev_features_t2103nfp_net_features_check(struct sk_buff *skb, struct net_device *dev,2104 netdev_features_t features)2105{2106 u8 l4_hdr;2107 2108 /* We can't do TSO over double tagged packets (802.1AD) */2109 features &= vlan_features_check(skb, features);2110 2111 if (!skb->encapsulation)2112 return features;2113 2114 /* Ensure that inner L4 header offset fits into TX descriptor field */2115 if (skb_is_gso(skb)) {2116 u32 hdrlen;2117 2118 if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)2119 hdrlen = skb_inner_transport_offset(skb) + sizeof(struct udphdr);2120 else2121 hdrlen = skb_inner_tcp_all_headers(skb);2122 2123 /* Assume worst case scenario of having longest possible2124 * metadata prepend - 8B2125 */2126 if (unlikely(hdrlen > NFP_NET_LSO_MAX_HDR_SZ - 8))2127 features &= ~NETIF_F_GSO_MASK;2128 }2129 2130 if (xfrm_offload(skb))2131 return features;2132 2133 /* VXLAN/GRE check */2134 switch (vlan_get_protocol(skb)) {2135 case htons(ETH_P_IP):2136 l4_hdr = ip_hdr(skb)->protocol;2137 break;2138 case htons(ETH_P_IPV6):2139 l4_hdr = ipv6_hdr(skb)->nexthdr;2140 break;2141 default:2142 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);2143 }2144 2145 if (skb->inner_protocol_type != ENCAP_TYPE_ETHER ||2146 skb->inner_protocol != htons(ETH_P_TEB) ||2147 (l4_hdr != IPPROTO_UDP && l4_hdr != IPPROTO_GRE) ||2148 (l4_hdr == IPPROTO_UDP &&2149 (skb_inner_mac_header(skb) - skb_transport_header(skb) !=2150 sizeof(struct udphdr) + sizeof(struct vxlanhdr))))2151 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);2152 2153 return features;2154}2155 2156static int2157nfp_net_get_phys_port_name(struct net_device *netdev, char *name, size_t len)2158{2159 struct nfp_net *nn = netdev_priv(netdev);2160 int n;2161 2162 /* If port is defined, devlink_port is registered and devlink core2163 * is taking care of name formatting.2164 */2165 if (nn->port)2166 return -EOPNOTSUPP;2167 2168 if (nn->dp.is_vf || nn->vnic_no_name)2169 return -EOPNOTSUPP;2170 2171 n = snprintf(name, len, "n%d", nn->id);2172 if (n >= len)2173 return -EINVAL;2174 2175 return 0;2176}2177 2178static int nfp_net_xdp_setup_drv(struct nfp_net *nn, struct netdev_bpf *bpf)2179{2180 struct bpf_prog *prog = bpf->prog;2181 struct nfp_net_dp *dp;2182 int err;2183 2184 if (!prog == !nn->dp.xdp_prog) {2185 WRITE_ONCE(nn->dp.xdp_prog, prog);2186 xdp_attachment_setup(&nn->xdp, bpf);2187 return 0;2188 }2189 2190 dp = nfp_net_clone_dp(nn);2191 if (!dp)2192 return -ENOMEM;2193 2194 dp->xdp_prog = prog;2195 dp->num_tx_rings += prog ? nn->dp.num_rx_rings : -nn->dp.num_rx_rings;2196 dp->rx_dma_dir = prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE;2197 dp->rx_dma_off = prog ? XDP_PACKET_HEADROOM - nn->dp.rx_offset : 0;2198 2199 /* We need RX reconfig to remap the buffers (BIDIR vs FROM_DEV) */2200 err = nfp_net_ring_reconfig(nn, dp, bpf->extack);2201 if (err)2202 return err;2203 2204 xdp_attachment_setup(&nn->xdp, bpf);2205 return 0;2206}2207 2208static int nfp_net_xdp_setup_hw(struct nfp_net *nn, struct netdev_bpf *bpf)2209{2210 int err;2211 2212 err = nfp_app_xdp_offload(nn->app, nn, bpf->prog, bpf->extack);2213 if (err)2214 return err;2215 2216 xdp_attachment_setup(&nn->xdp_hw, bpf);2217 return 0;2218}2219 2220static int nfp_net_xdp(struct net_device *netdev, struct netdev_bpf *xdp)2221{2222 struct nfp_net *nn = netdev_priv(netdev);2223 2224 switch (xdp->command) {2225 case XDP_SETUP_PROG:2226 return nfp_net_xdp_setup_drv(nn, xdp);2227 case XDP_SETUP_PROG_HW:2228 return nfp_net_xdp_setup_hw(nn, xdp);2229 case XDP_SETUP_XSK_POOL:2230 return nfp_net_xsk_setup_pool(netdev, xdp->xsk.pool,2231 xdp->xsk.queue_id);2232 default:2233 return nfp_app_bpf(nn->app, nn, xdp);2234 }2235}2236 2237static int nfp_net_set_mac_address(struct net_device *netdev, void *addr)2238{2239 struct nfp_net *nn = netdev_priv(netdev);2240 struct sockaddr *saddr = addr;2241 int err;2242 2243 err = eth_prepare_mac_addr_change(netdev, addr);2244 if (err)2245 return err;2246 2247 nfp_net_write_mac_addr(nn, saddr->sa_data);2248 2249 err = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_MACADDR);2250 if (err)2251 return err;2252 2253 eth_commit_mac_addr_change(netdev, addr);2254 2255 return 0;2256}2257 2258static int nfp_net_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,2259 struct net_device *dev, u32 filter_mask,2260 int nlflags)2261{2262 struct nfp_net *nn = netdev_priv(dev);2263 u16 mode;2264 2265 if (!(nn->cap & NFP_NET_CFG_CTRL_VEPA))2266 return -EOPNOTSUPP;2267 2268 mode = (nn->dp.ctrl & NFP_NET_CFG_CTRL_VEPA) ?2269 BRIDGE_MODE_VEPA : BRIDGE_MODE_VEB;2270 2271 return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode, 0, 0,2272 nlflags, filter_mask, NULL);2273}2274 2275static int nfp_net_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,2276 u16 flags, struct netlink_ext_ack *extack)2277{2278 struct nfp_net *nn = netdev_priv(dev);2279 struct nlattr *attr, *br_spec;2280 int rem, err;2281 u32 new_ctrl;2282 u16 mode;2283 2284 if (!(nn->cap & NFP_NET_CFG_CTRL_VEPA))2285 return -EOPNOTSUPP;2286 2287 br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);2288 if (!br_spec)2289 return -EINVAL;2290 2291 nla_for_each_nested_type(attr, IFLA_BRIDGE_MODE, br_spec, rem) {2292 new_ctrl = nn->dp.ctrl;2293 mode = nla_get_u16(attr);2294 if (mode == BRIDGE_MODE_VEPA)2295 new_ctrl |= NFP_NET_CFG_CTRL_VEPA;2296 else if (mode == BRIDGE_MODE_VEB)2297 new_ctrl &= ~NFP_NET_CFG_CTRL_VEPA;2298 else2299 return -EOPNOTSUPP;2300 2301 if (new_ctrl == nn->dp.ctrl)2302 return 0;2303 2304 nn_writel(nn, NFP_NET_CFG_CTRL, new_ctrl);2305 err = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_GEN);2306 if (!err)2307 nn->dp.ctrl = new_ctrl;2308 2309 return err;2310 }2311 2312 return -EINVAL;2313}2314 2315const struct net_device_ops nfp_nfd3_netdev_ops = {2316 .ndo_init = nfp_app_ndo_init,2317 .ndo_uninit = nfp_app_ndo_uninit,2318 .ndo_open = nfp_net_netdev_open,2319 .ndo_stop = nfp_net_netdev_close,2320 .ndo_start_xmit = nfp_net_tx,2321 .ndo_get_stats64 = nfp_net_stat64,2322 .ndo_vlan_rx_add_vid = nfp_net_vlan_rx_add_vid,2323 .ndo_vlan_rx_kill_vid = nfp_net_vlan_rx_kill_vid,2324 .ndo_set_vf_mac = nfp_app_set_vf_mac,2325 .ndo_set_vf_vlan = nfp_app_set_vf_vlan,2326 .ndo_set_vf_rate = nfp_app_set_vf_rate,2327 .ndo_set_vf_spoofchk = nfp_app_set_vf_spoofchk,2328 .ndo_set_vf_trust = nfp_app_set_vf_trust,2329 .ndo_get_vf_config = nfp_app_get_vf_config,2330 .ndo_set_vf_link_state = nfp_app_set_vf_link_state,2331 .ndo_setup_tc = nfp_port_setup_tc,2332 .ndo_tx_timeout = nfp_net_tx_timeout,2333 .ndo_set_rx_mode = nfp_net_set_rx_mode,2334 .ndo_change_mtu = nfp_net_change_mtu,2335 .ndo_set_mac_address = nfp_net_set_mac_address,2336 .ndo_set_features = nfp_net_set_features,2337 .ndo_fix_features = nfp_net_fix_features,2338 .ndo_features_check = nfp_net_features_check,2339 .ndo_get_phys_port_name = nfp_net_get_phys_port_name,2340 .ndo_bpf = nfp_net_xdp,2341 .ndo_xsk_wakeup = nfp_net_xsk_wakeup,2342 .ndo_bridge_getlink = nfp_net_bridge_getlink,2343 .ndo_bridge_setlink = nfp_net_bridge_setlink,2344};2345 2346const struct net_device_ops nfp_nfdk_netdev_ops = {2347 .ndo_init = nfp_app_ndo_init,2348 .ndo_uninit = nfp_app_ndo_uninit,2349 .ndo_open = nfp_net_netdev_open,2350 .ndo_stop = nfp_net_netdev_close,2351 .ndo_start_xmit = nfp_net_tx,2352 .ndo_get_stats64 = nfp_net_stat64,2353 .ndo_vlan_rx_add_vid = nfp_net_vlan_rx_add_vid,2354 .ndo_vlan_rx_kill_vid = nfp_net_vlan_rx_kill_vid,2355 .ndo_set_vf_mac = nfp_app_set_vf_mac,2356 .ndo_set_vf_vlan = nfp_app_set_vf_vlan,2357 .ndo_set_vf_rate = nfp_app_set_vf_rate,2358 .ndo_set_vf_spoofchk = nfp_app_set_vf_spoofchk,2359 .ndo_set_vf_trust = nfp_app_set_vf_trust,2360 .ndo_get_vf_config = nfp_app_get_vf_config,2361 .ndo_set_vf_link_state = nfp_app_set_vf_link_state,2362 .ndo_setup_tc = nfp_port_setup_tc,2363 .ndo_tx_timeout = nfp_net_tx_timeout,2364 .ndo_set_rx_mode = nfp_net_set_rx_mode,2365 .ndo_change_mtu = nfp_net_change_mtu,2366 .ndo_set_mac_address = nfp_net_set_mac_address,2367 .ndo_set_features = nfp_net_set_features,2368 .ndo_fix_features = nfp_net_fix_features,2369 .ndo_features_check = nfp_net_features_check,2370 .ndo_get_phys_port_name = nfp_net_get_phys_port_name,2371 .ndo_bpf = nfp_net_xdp,2372 .ndo_bridge_getlink = nfp_net_bridge_getlink,2373 .ndo_bridge_setlink = nfp_net_bridge_setlink,2374};2375 2376static int nfp_udp_tunnel_sync(struct net_device *netdev, unsigned int table)2377{2378 struct nfp_net *nn = netdev_priv(netdev);2379 int i;2380 2381 BUILD_BUG_ON(NFP_NET_N_VXLAN_PORTS & 1);2382 for (i = 0; i < NFP_NET_N_VXLAN_PORTS; i += 2) {2383 struct udp_tunnel_info ti0, ti1;2384 2385 udp_tunnel_nic_get_port(netdev, table, i, &ti0);2386 udp_tunnel_nic_get_port(netdev, table, i + 1, &ti1);2387 2388 nn_writel(nn, NFP_NET_CFG_VXLAN_PORT + i * sizeof(ti0.port),2389 be16_to_cpu(ti1.port) << 16 | be16_to_cpu(ti0.port));2390 }2391 2392 return nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_VXLAN);2393}2394 2395static const struct udp_tunnel_nic_info nfp_udp_tunnels = {2396 .sync_table = nfp_udp_tunnel_sync,2397 .flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP |2398 UDP_TUNNEL_NIC_INFO_OPEN_ONLY,2399 .tables = {2400 {2401 .n_entries = NFP_NET_N_VXLAN_PORTS,2402 .tunnel_types = UDP_TUNNEL_TYPE_VXLAN,2403 },2404 },2405};2406 2407/**2408 * nfp_net_info() - Print general info about the NIC2409 * @nn: NFP Net device to reconfigure2410 */2411void nfp_net_info(struct nfp_net *nn)2412{2413 nn_info(nn, "NFP-6xxx %sNetdev: TxQs=%d/%d RxQs=%d/%d\n",2414 nn->dp.is_vf ? "VF " : "",2415 nn->dp.num_tx_rings, nn->max_tx_rings,2416 nn->dp.num_rx_rings, nn->max_rx_rings);2417 nn_info(nn, "VER: %d.%d.%d.%d, Maximum supported MTU: %d\n",2418 nn->fw_ver.extend, nn->fw_ver.class,2419 nn->fw_ver.major, nn->fw_ver.minor,2420 nn->max_mtu);2421 nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",2422 nn->cap,2423 nn->cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",2424 nn->cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "",2425 nn->cap & NFP_NET_CFG_CTRL_L2MC ? "L2MCFILT " : "",2426 nn->cap & NFP_NET_CFG_CTRL_RXCSUM ? "RXCSUM " : "",2427 nn->cap & NFP_NET_CFG_CTRL_TXCSUM ? "TXCSUM " : "",2428 nn->cap & NFP_NET_CFG_CTRL_RXVLAN ? "RXVLAN " : "",2429 nn->cap & NFP_NET_CFG_CTRL_TXVLAN ? "TXVLAN " : "",2430 nn->cap & NFP_NET_CFG_CTRL_RXQINQ ? "RXQINQ " : "",2431 nn->cap & NFP_NET_CFG_CTRL_RXVLAN_V2 ? "RXVLANv2 " : "",2432 nn->cap & NFP_NET_CFG_CTRL_TXVLAN_V2 ? "TXVLANv2 " : "",2433 nn->cap & NFP_NET_CFG_CTRL_SCATTER ? "SCATTER " : "",2434 nn->cap & NFP_NET_CFG_CTRL_GATHER ? "GATHER " : "",2435 nn->cap & NFP_NET_CFG_CTRL_LSO ? "TSO1 " : "",2436 nn->cap & NFP_NET_CFG_CTRL_LSO2 ? "TSO2 " : "",2437 nn->cap & NFP_NET_CFG_CTRL_RSS ? "RSS1 " : "",2438 nn->cap & NFP_NET_CFG_CTRL_RSS2 ? "RSS2 " : "",2439 nn->cap & NFP_NET_CFG_CTRL_CTAG_FILTER ? "CTAG_FILTER " : "",2440 nn->cap & NFP_NET_CFG_CTRL_MSIXAUTO ? "AUTOMASK " : "",2441 nn->cap & NFP_NET_CFG_CTRL_IRQMOD ? "IRQMOD " : "",2442 nn->cap & NFP_NET_CFG_CTRL_TXRWB ? "TXRWB " : "",2443 nn->cap & NFP_NET_CFG_CTRL_VEPA ? "VEPA " : "",2444 nn->cap & NFP_NET_CFG_CTRL_VXLAN ? "VXLAN " : "",2445 nn->cap & NFP_NET_CFG_CTRL_NVGRE ? "NVGRE " : "",2446 nn->cap & NFP_NET_CFG_CTRL_CSUM_COMPLETE ?2447 "RXCSUM_COMPLETE " : "",2448 nn->cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR " : "",2449 nn->cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER ? "MULTICAST_FILTER " : "",2450 nn->cap_w1 & NFP_NET_CFG_CTRL_USO ? "USO " : "",2451 nfp_app_extra_cap(nn->app, nn));2452}2453 2454/**2455 * nfp_net_alloc() - Allocate netdev and related structure2456 * @pdev: PCI device2457 * @dev_info: NFP ASIC params2458 * @ctrl_bar: PCI IOMEM with vNIC config memory2459 * @needs_netdev: Whether to allocate a netdev for this vNIC2460 * @max_tx_rings: Maximum number of TX rings supported by device2461 * @max_rx_rings: Maximum number of RX rings supported by device2462 *2463 * This function allocates a netdev device and fills in the initial2464 * part of the @struct nfp_net structure. In case of control device2465 * nfp_net structure is allocated without the netdev.2466 *2467 * Return: NFP Net device structure, or ERR_PTR on error.2468 */2469struct nfp_net *2470nfp_net_alloc(struct pci_dev *pdev, const struct nfp_dev_info *dev_info,2471 void __iomem *ctrl_bar, bool needs_netdev,2472 unsigned int max_tx_rings, unsigned int max_rx_rings)2473{2474 u64 dma_mask = dma_get_mask(&pdev->dev);2475 struct nfp_net *nn;2476 int err;2477 2478 if (needs_netdev) {2479 struct net_device *netdev;2480 2481 netdev = alloc_etherdev_mqs(sizeof(struct nfp_net),2482 max_tx_rings, max_rx_rings);2483 if (!netdev)2484 return ERR_PTR(-ENOMEM);2485 2486 SET_NETDEV_DEV(netdev, &pdev->dev);2487 nn = netdev_priv(netdev);2488 nn->dp.netdev = netdev;2489 } else {2490 nn = vzalloc(sizeof(*nn));2491 if (!nn)2492 return ERR_PTR(-ENOMEM);2493 }2494 2495 nn->dp.dev = &pdev->dev;2496 nn->dp.ctrl_bar = ctrl_bar;2497 nn->dev_info = dev_info;2498 nn->pdev = pdev;2499 nfp_net_get_fw_version(&nn->fw_ver, ctrl_bar);2500 2501 switch (FIELD_GET(NFP_NET_CFG_VERSION_DP_MASK, nn->fw_ver.extend)) {2502 case NFP_NET_CFG_VERSION_DP_NFD3:2503 nn->dp.ops = &nfp_nfd3_ops;2504 break;2505 case NFP_NET_CFG_VERSION_DP_NFDK:2506 if (nn->fw_ver.major < 5) {2507 dev_err(&pdev->dev,2508 "NFDK must use ABI 5 or newer, found: %d\n",2509 nn->fw_ver.major);2510 err = -EINVAL;2511 goto err_free_nn;2512 }2513 nn->dp.ops = &nfp_nfdk_ops;2514 break;2515 default:2516 err = -EINVAL;2517 goto err_free_nn;2518 }2519 2520 if ((dma_mask & nn->dp.ops->dma_mask) != dma_mask) {2521 dev_err(&pdev->dev,2522 "DMA mask of loaded firmware: %llx, required DMA mask: %llx\n",2523 nn->dp.ops->dma_mask, dma_mask);2524 err = -EINVAL;2525 goto err_free_nn;2526 }2527 2528 nn->max_tx_rings = max_tx_rings;2529 nn->max_rx_rings = max_rx_rings;2530 2531 nn->dp.num_tx_rings = min_t(unsigned int,2532 max_tx_rings, num_online_cpus());2533 nn->dp.num_rx_rings = min_t(unsigned int, max_rx_rings,2534 netif_get_num_default_rss_queues());2535 2536 nn->dp.num_r_vecs = max(nn->dp.num_tx_rings, nn->dp.num_rx_rings);2537 nn->dp.num_r_vecs = min_t(unsigned int,2538 nn->dp.num_r_vecs, num_online_cpus());2539 nn->max_r_vecs = nn->dp.num_r_vecs;2540 2541 nn->dp.xsk_pools = kcalloc(nn->max_r_vecs, sizeof(nn->dp.xsk_pools),2542 GFP_KERNEL);2543 if (!nn->dp.xsk_pools) {2544 err = -ENOMEM;2545 goto err_free_nn;2546 }2547 2548 nn->dp.txd_cnt = NFP_NET_TX_DESCS_DEFAULT;2549 nn->dp.rxd_cnt = NFP_NET_RX_DESCS_DEFAULT;2550 2551 sema_init(&nn->bar_lock, 1);2552 2553 spin_lock_init(&nn->reconfig_lock);2554 spin_lock_init(&nn->link_status_lock);2555 2556 timer_setup(&nn->reconfig_timer, nfp_net_reconfig_timer, 0);2557 2558 err = nfp_net_tlv_caps_parse(&nn->pdev->dev, nn->dp.ctrl_bar,2559 &nn->tlv_caps);2560 if (err)2561 goto err_free_nn;2562 2563 err = nfp_ccm_mbox_alloc(nn);2564 if (err)2565 goto err_free_nn;2566 2567 return nn;2568 2569err_free_nn:2570 if (nn->dp.netdev)2571 free_netdev(nn->dp.netdev);2572 else2573 vfree(nn);2574 return ERR_PTR(err);2575}2576 2577/**2578 * nfp_net_free() - Undo what @nfp_net_alloc() did2579 * @nn: NFP Net device to reconfigure2580 */2581void nfp_net_free(struct nfp_net *nn)2582{2583 WARN_ON(timer_pending(&nn->reconfig_timer) || nn->reconfig_posted);2584 nfp_ccm_mbox_free(nn);2585 2586 kfree(nn->dp.xsk_pools);2587 if (nn->dp.netdev)2588 free_netdev(nn->dp.netdev);2589 else2590 vfree(nn);2591}2592 2593/**2594 * nfp_net_rss_key_sz() - Get current size of the RSS key2595 * @nn: NFP Net device instance2596 *2597 * Return: size of the RSS key for currently selected hash function.2598 */2599unsigned int nfp_net_rss_key_sz(struct nfp_net *nn)2600{2601 switch (nn->rss_hfunc) {2602 case ETH_RSS_HASH_TOP:2603 return NFP_NET_CFG_RSS_KEY_SZ;2604 case ETH_RSS_HASH_XOR:2605 return 0;2606 case ETH_RSS_HASH_CRC32:2607 return 4;2608 }2609 2610 nn_warn(nn, "Unknown hash function: %u\n", nn->rss_hfunc);2611 return 0;2612}2613 2614/**2615 * nfp_net_rss_init() - Set the initial RSS parameters2616 * @nn: NFP Net device to reconfigure2617 */2618static void nfp_net_rss_init(struct nfp_net *nn)2619{2620 unsigned long func_bit, rss_cap_hfunc;2621 u32 reg;2622 2623 /* Read the RSS function capability and select first supported func */2624 reg = nn_readl(nn, NFP_NET_CFG_RSS_CAP);2625 rss_cap_hfunc = FIELD_GET(NFP_NET_CFG_RSS_CAP_HFUNC, reg);2626 if (!rss_cap_hfunc)2627 rss_cap_hfunc = FIELD_GET(NFP_NET_CFG_RSS_CAP_HFUNC,2628 NFP_NET_CFG_RSS_TOEPLITZ);2629 2630 func_bit = find_first_bit(&rss_cap_hfunc, NFP_NET_CFG_RSS_HFUNCS);2631 if (func_bit == NFP_NET_CFG_RSS_HFUNCS) {2632 dev_warn(nn->dp.dev,2633 "Bad RSS config, defaulting to Toeplitz hash\n");2634 func_bit = ETH_RSS_HASH_TOP_BIT;2635 }2636 nn->rss_hfunc = 1 << func_bit;2637 2638 netdev_rss_key_fill(nn->rss_key, nfp_net_rss_key_sz(nn));2639 2640 nfp_net_rss_init_itbl(nn);2641 2642 /* Enable IPv4/IPv6 TCP by default */2643 nn->rss_cfg = NFP_NET_CFG_RSS_IPV4_TCP |2644 NFP_NET_CFG_RSS_IPV6_TCP |2645 NFP_NET_CFG_RSS_IPV4_UDP |2646 NFP_NET_CFG_RSS_IPV6_UDP |2647 FIELD_PREP(NFP_NET_CFG_RSS_HFUNC, nn->rss_hfunc) |2648 NFP_NET_CFG_RSS_MASK;2649}2650 2651/**2652 * nfp_net_irqmod_init() - Set the initial IRQ moderation parameters2653 * @nn: NFP Net device to reconfigure2654 */2655static void nfp_net_irqmod_init(struct nfp_net *nn)2656{2657 nn->rx_coalesce_usecs = 50;2658 nn->rx_coalesce_max_frames = 64;2659 nn->tx_coalesce_usecs = 50;2660 nn->tx_coalesce_max_frames = 64;2661 2662 nn->rx_coalesce_adapt_on = true;2663 nn->tx_coalesce_adapt_on = true;2664}2665 2666static void nfp_net_netdev_init(struct nfp_net *nn)2667{2668 struct net_device *netdev = nn->dp.netdev;2669 2670 nfp_net_write_mac_addr(nn, nn->dp.netdev->dev_addr);2671 2672 netdev->mtu = nn->dp.mtu;2673 2674 /* Advertise/enable offloads based on capabilities2675 *2676 * Note: netdev->features show the currently enabled features2677 * and netdev->hw_features advertises which features are2678 * supported. By default we enable most features.2679 */2680 if (nn->cap & NFP_NET_CFG_CTRL_LIVE_ADDR)2681 netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE;2682 2683 netdev->hw_features = NETIF_F_HIGHDMA;2684 if (nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY) {2685 netdev->hw_features |= NETIF_F_RXCSUM;2686 nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY;2687 }2688 if (nn->cap & NFP_NET_CFG_CTRL_TXCSUM) {2689 netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;2690 nn->dp.ctrl |= NFP_NET_CFG_CTRL_TXCSUM;2691 }2692 if (nn->cap & NFP_NET_CFG_CTRL_GATHER) {2693 netdev->hw_features |= NETIF_F_SG;2694 nn->dp.ctrl |= NFP_NET_CFG_CTRL_GATHER;2695 }2696 if ((nn->cap & NFP_NET_CFG_CTRL_LSO && nn->fw_ver.major > 2) ||2697 nn->cap & NFP_NET_CFG_CTRL_LSO2) {2698 netdev->hw_features |= NETIF_F_TSO | NETIF_F_TSO6;2699 if (nn->cap_w1 & NFP_NET_CFG_CTRL_USO)2700 netdev->hw_features |= NETIF_F_GSO_UDP_L4;2701 nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_LSO2 ?:2702 NFP_NET_CFG_CTRL_LSO;2703 }2704 if (nn->cap & NFP_NET_CFG_CTRL_RSS_ANY)2705 netdev->hw_features |= NETIF_F_RXHASH;2706 2707#ifdef CONFIG_NFP_NET_IPSEC2708 if (nn->cap_w1 & NFP_NET_CFG_CTRL_IPSEC)2709 netdev->hw_features |= NETIF_F_HW_ESP | NETIF_F_HW_ESP_TX_CSUM;2710#endif2711 2712 if (nn->cap & NFP_NET_CFG_CTRL_VXLAN) {2713 if (nn->cap & NFP_NET_CFG_CTRL_LSO) {2714 netdev->hw_features |= NETIF_F_GSO_UDP_TUNNEL |2715 NETIF_F_GSO_UDP_TUNNEL_CSUM |2716 NETIF_F_GSO_PARTIAL;2717 netdev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM;2718 }2719 netdev->udp_tunnel_nic_info = &nfp_udp_tunnels;2720 nn->dp.ctrl |= NFP_NET_CFG_CTRL_VXLAN;2721 }2722 if (nn->cap & NFP_NET_CFG_CTRL_NVGRE) {2723 if (nn->cap & NFP_NET_CFG_CTRL_LSO)2724 netdev->hw_features |= NETIF_F_GSO_GRE;2725 nn->dp.ctrl |= NFP_NET_CFG_CTRL_NVGRE;2726 }2727 if (nn->cap & (NFP_NET_CFG_CTRL_VXLAN | NFP_NET_CFG_CTRL_NVGRE))2728 netdev->hw_enc_features = netdev->hw_features;2729 2730 netdev->vlan_features = netdev->hw_features;2731 2732 if (nn->cap & NFP_NET_CFG_CTRL_RXVLAN_ANY) {2733 netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_RX;2734 nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_RXVLAN_V2 ?:2735 NFP_NET_CFG_CTRL_RXVLAN;2736 }2737 if (nn->cap & NFP_NET_CFG_CTRL_TXVLAN_ANY) {2738 if (nn->cap & NFP_NET_CFG_CTRL_LSO2) {2739 nn_warn(nn, "Device advertises both TSO2 and TXVLAN. Refusing to enable TXVLAN.\n");2740 } else {2741 netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX;2742 nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_TXVLAN_V2 ?:2743 NFP_NET_CFG_CTRL_TXVLAN;2744 }2745 }2746 if (nn->cap & NFP_NET_CFG_CTRL_CTAG_FILTER) {2747 netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;2748 nn->dp.ctrl |= NFP_NET_CFG_CTRL_CTAG_FILTER;2749 }2750 if (nn->cap & NFP_NET_CFG_CTRL_RXQINQ) {2751 netdev->hw_features |= NETIF_F_HW_VLAN_STAG_RX;2752 nn->dp.ctrl |= NFP_NET_CFG_CTRL_RXQINQ;2753 }2754 2755 netdev->features = netdev->hw_features;2756 2757 if (nfp_app_has_tc(nn->app) && nn->port)2758 netdev->hw_features |= NETIF_F_HW_TC;2759 2760 /* C-Tag strip and S-Tag strip can't be supported simultaneously,2761 * so enable C-Tag strip and disable S-Tag strip by default.2762 */2763 netdev->features &= ~NETIF_F_HW_VLAN_STAG_RX;2764 nn->dp.ctrl &= ~NFP_NET_CFG_CTRL_RXQINQ;2765 2766 netdev->xdp_features = NETDEV_XDP_ACT_BASIC;2767 if (nn->app && nn->app->type->id == NFP_APP_BPF_NIC)2768 netdev->xdp_features |= NETDEV_XDP_ACT_HW_OFFLOAD;2769 2770 /* Finalise the netdev setup */2771 switch (nn->dp.ops->version) {2772 case NFP_NFD_VER_NFD3:2773 netdev->netdev_ops = &nfp_nfd3_netdev_ops;2774 netdev->xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY;2775 netdev->xdp_features |= NETDEV_XDP_ACT_REDIRECT;2776 break;2777 case NFP_NFD_VER_NFDK:2778 netdev->netdev_ops = &nfp_nfdk_netdev_ops;2779 break;2780 }2781 2782 netdev->watchdog_timeo = msecs_to_jiffies(5 * 1000);2783 2784 /* MTU range: 68 - hw-specific max */2785 netdev->min_mtu = ETH_MIN_MTU;2786 netdev->max_mtu = nn->max_mtu;2787 2788 netif_set_tso_max_segs(netdev, NFP_NET_LSO_MAX_SEGS);2789 2790 netif_carrier_off(netdev);2791 2792 nfp_net_set_ethtool_ops(netdev);2793}2794 2795static int nfp_net_read_caps(struct nfp_net *nn)2796{2797 /* Get some of the read-only fields from the BAR */2798 nn->cap = nn_readl(nn, NFP_NET_CFG_CAP);2799 nn->cap_w1 = nn_readl(nn, NFP_NET_CFG_CAP_WORD1);2800 nn->max_mtu = nn_readl(nn, NFP_NET_CFG_MAX_MTU);2801 2802 /* ABI 4.x and ctrl vNIC always use chained metadata, in other cases2803 * we allow use of non-chained metadata if RSS(v1) is the only2804 * advertised capability requiring metadata.2805 */2806 nn->dp.chained_metadata_format = nn->fw_ver.major == 4 ||2807 !nn->dp.netdev ||2808 !(nn->cap & NFP_NET_CFG_CTRL_RSS) ||2809 nn->cap & NFP_NET_CFG_CTRL_CHAIN_META;2810 /* RSS(v1) uses non-chained metadata format, except in ABI 4.x where2811 * it has the same meaning as RSSv2.2812 */2813 if (nn->dp.chained_metadata_format && nn->fw_ver.major != 4)2814 nn->cap &= ~NFP_NET_CFG_CTRL_RSS;2815 2816 /* Determine RX packet/metadata boundary offset */2817 if (nn->fw_ver.major >= 2) {2818 u32 reg;2819 2820 reg = nn_readl(nn, NFP_NET_CFG_RX_OFFSET);2821 if (reg > NFP_NET_MAX_PREPEND) {2822 nn_err(nn, "Invalid rx offset: %d\n", reg);2823 return -EINVAL;2824 }2825 nn->dp.rx_offset = reg;2826 } else {2827 nn->dp.rx_offset = NFP_NET_RX_OFFSET;2828 }2829 2830 /* Mask out NFD-version-specific features */2831 nn->cap &= nn->dp.ops->cap_mask;2832 2833 /* For control vNICs mask out the capabilities app doesn't want. */2834 if (!nn->dp.netdev)2835 nn->cap &= nn->app->type->ctrl_cap_mask;2836 2837 return 0;2838}2839 2840/**2841 * nfp_net_init() - Initialise/finalise the nfp_net structure2842 * @nn: NFP Net device structure2843 *2844 * Return: 0 on success or negative errno on error.2845 */2846int nfp_net_init(struct nfp_net *nn)2847{2848 int err;2849 2850 nn->dp.rx_dma_dir = DMA_FROM_DEVICE;2851 2852 err = nfp_net_read_caps(nn);2853 if (err)2854 return err;2855 2856 /* Set default MTU and Freelist buffer size */2857 if (!nfp_net_is_data_vnic(nn) && nn->app->ctrl_mtu) {2858 nn->dp.mtu = min(nn->app->ctrl_mtu, nn->max_mtu);2859 } else if (nn->max_mtu < NFP_NET_DEFAULT_MTU) {2860 nn->dp.mtu = nn->max_mtu;2861 } else {2862 nn->dp.mtu = NFP_NET_DEFAULT_MTU;2863 }2864 nn->dp.fl_bufsz = nfp_net_calc_fl_bufsz(&nn->dp);2865 2866 if (nfp_app_ctrl_uses_data_vnics(nn->app))2867 nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_CMSG_DATA;2868 2869 if (nn->cap & NFP_NET_CFG_CTRL_RSS_ANY) {2870 nfp_net_rss_init(nn);2871 nn->dp.ctrl |= nn->cap & NFP_NET_CFG_CTRL_RSS2 ?:2872 NFP_NET_CFG_CTRL_RSS;2873 }2874 2875 /* Allow L2 Broadcast and Multicast through by default, if supported */2876 if (nn->cap & NFP_NET_CFG_CTRL_L2BC)2877 nn->dp.ctrl |= NFP_NET_CFG_CTRL_L2BC;2878 2879 /* Allow IRQ moderation, if supported */2880 if (nn->cap & NFP_NET_CFG_CTRL_IRQMOD) {2881 nfp_net_irqmod_init(nn);2882 nn->dp.ctrl |= NFP_NET_CFG_CTRL_IRQMOD;2883 }2884 2885 /* Enable TX pointer writeback, if supported */2886 if (nn->cap & NFP_NET_CFG_CTRL_TXRWB)2887 nn->dp.ctrl |= NFP_NET_CFG_CTRL_TXRWB;2888 2889 if (nn->cap_w1 & NFP_NET_CFG_CTRL_MCAST_FILTER)2890 nn->dp.ctrl_w1 |= NFP_NET_CFG_CTRL_MCAST_FILTER;2891 2892 /* Stash the re-configuration queue away. First odd queue in TX Bar */2893 nn->qcp_cfg = nn->tx_bar + NFP_QCP_QUEUE_ADDR_SZ;2894 2895 /* Make sure the FW knows the netdev is supposed to be disabled here */2896 nn_writel(nn, NFP_NET_CFG_CTRL, 0);2897 nn_writeq(nn, NFP_NET_CFG_TXRS_ENABLE, 0);2898 nn_writeq(nn, NFP_NET_CFG_RXRS_ENABLE, 0);2899 nn_writel(nn, NFP_NET_CFG_CTRL_WORD1, 0);2900 err = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_RING |2901 NFP_NET_CFG_UPDATE_GEN);2902 if (err)2903 return err;2904 2905 if (nn->dp.netdev) {2906 nfp_net_netdev_init(nn);2907 2908 err = nfp_ccm_mbox_init(nn);2909 if (err)2910 return err;2911 2912 err = nfp_net_tls_init(nn);2913 if (err)2914 goto err_clean_mbox;2915 2916 nfp_net_ipsec_init(nn);2917 }2918 2919 nfp_net_vecs_init(nn);2920 2921 if (!nn->dp.netdev)2922 return 0;2923 2924 spin_lock_init(&nn->mbox_amsg.lock);2925 INIT_LIST_HEAD(&nn->mbox_amsg.list);2926 INIT_WORK(&nn->mbox_amsg.work, nfp_net_mbox_amsg_work);2927 2928 INIT_LIST_HEAD(&nn->fs.list);2929 2930 return register_netdev(nn->dp.netdev);2931 2932err_clean_mbox:2933 nfp_ccm_mbox_clean(nn);2934 return err;2935}2936 2937/**2938 * nfp_net_clean() - Undo what nfp_net_init() did.2939 * @nn: NFP Net device structure2940 */2941void nfp_net_clean(struct nfp_net *nn)2942{2943 if (!nn->dp.netdev)2944 return;2945 2946 unregister_netdev(nn->dp.netdev);2947 nfp_net_ipsec_clean(nn);2948 nfp_ccm_mbox_clean(nn);2949 nfp_net_fs_clean(nn);2950 flush_work(&nn->mbox_amsg.work);2951 nfp_net_reconfig_wait_posted(nn);2952}2953