4432 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/****************************************************************************3 * Driver for Solarflare network controllers and boards4 * Copyright 2012-2013 Solarflare Communications Inc.5 */6 7#include "net_driver.h"8#include "rx_common.h"9#include "tx_common.h"10#include "ef10_regs.h"11#include "io.h"12#include "mcdi.h"13#include "mcdi_pcol.h"14#include "mcdi_port.h"15#include "mcdi_port_common.h"16#include "mcdi_functions.h"17#include "nic.h"18#include "mcdi_filters.h"19#include "workarounds.h"20#include "selftest.h"21#include "ef10_sriov.h"22#include <linux/in.h>23#include <linux/jhash.h>24#include <linux/wait.h>25#include <linux/workqueue.h>26#include <net/udp_tunnel.h>27 28/* Hardware control for EF10 architecture including 'Huntington'. */29 30#define EFX_EF10_DRVGEN_EV 731enum {32 EFX_EF10_TEST = 1,33 EFX_EF10_REFILL,34};35 36/* VLAN list entry */37struct efx_ef10_vlan {38 struct list_head list;39 u16 vid;40};41 42static int efx_ef10_set_udp_tnl_ports(struct efx_nic *efx, bool unloading);43static const struct udp_tunnel_nic_info efx_ef10_udp_tunnels;44 45static int efx_ef10_get_warm_boot_count(struct efx_nic *efx)46{47 efx_dword_t reg;48 49 efx_readd(efx, ®, ER_DZ_BIU_MC_SFT_STATUS);50 return EFX_DWORD_FIELD(reg, EFX_WORD_1) == 0xb007 ?51 EFX_DWORD_FIELD(reg, EFX_WORD_0) : -EIO;52}53 54/* On all EF10s up to and including SFC9220 (Medford1), all PFs use BAR 0 for55 * I/O space and BAR 2(&3) for memory. On SFC9250 (Medford2), there is no I/O56 * bar; PFs use BAR 0/1 for memory.57 */58static unsigned int efx_ef10_pf_mem_bar(struct efx_nic *efx)59{60 switch (efx->pci_dev->device) {61 case 0x0b03: /* SFC9250 PF */62 return 0;63 default:64 return 2;65 }66}67 68/* All VFs use BAR 0/1 for memory */69static unsigned int efx_ef10_vf_mem_bar(struct efx_nic *efx)70{71 return 0;72}73 74static unsigned int efx_ef10_mem_map_size(struct efx_nic *efx)75{76 int bar;77 78 bar = efx->type->mem_bar(efx);79 return resource_size(&efx->pci_dev->resource[bar]);80}81 82static bool efx_ef10_is_vf(struct efx_nic *efx)83{84 return efx->type->is_vf;85}86 87#ifdef CONFIG_SFC_SRIOV88static int efx_ef10_get_vf_index(struct efx_nic *efx)89{90 MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_FUNCTION_INFO_OUT_LEN);91 struct efx_ef10_nic_data *nic_data = efx->nic_data;92 size_t outlen;93 int rc;94 95 rc = efx_mcdi_rpc(efx, MC_CMD_GET_FUNCTION_INFO, NULL, 0, outbuf,96 sizeof(outbuf), &outlen);97 if (rc)98 return rc;99 if (outlen < sizeof(outbuf))100 return -EIO;101 102 nic_data->vf_index = MCDI_DWORD(outbuf, GET_FUNCTION_INFO_OUT_VF);103 return 0;104}105#endif106 107static int efx_ef10_init_datapath_caps(struct efx_nic *efx)108{109 MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CAPABILITIES_V4_OUT_LEN);110 struct efx_ef10_nic_data *nic_data = efx->nic_data;111 size_t outlen;112 int rc;113 114 BUILD_BUG_ON(MC_CMD_GET_CAPABILITIES_IN_LEN != 0);115 116 rc = efx_mcdi_rpc(efx, MC_CMD_GET_CAPABILITIES, NULL, 0,117 outbuf, sizeof(outbuf), &outlen);118 if (rc)119 return rc;120 if (outlen < MC_CMD_GET_CAPABILITIES_OUT_LEN) {121 netif_err(efx, drv, efx->net_dev,122 "unable to read datapath firmware capabilities\n");123 return -EIO;124 }125 126 nic_data->datapath_caps =127 MCDI_DWORD(outbuf, GET_CAPABILITIES_OUT_FLAGS1);128 129 if (outlen >= MC_CMD_GET_CAPABILITIES_V2_OUT_LEN) {130 nic_data->datapath_caps2 = MCDI_DWORD(outbuf,131 GET_CAPABILITIES_V2_OUT_FLAGS2);132 nic_data->piobuf_size = MCDI_WORD(outbuf,133 GET_CAPABILITIES_V2_OUT_SIZE_PIO_BUFF);134 } else {135 nic_data->datapath_caps2 = 0;136 nic_data->piobuf_size = ER_DZ_TX_PIOBUF_SIZE;137 }138 139 /* record the DPCPU firmware IDs to determine VEB vswitching support.140 */141 nic_data->rx_dpcpu_fw_id =142 MCDI_WORD(outbuf, GET_CAPABILITIES_OUT_RX_DPCPU_FW_ID);143 nic_data->tx_dpcpu_fw_id =144 MCDI_WORD(outbuf, GET_CAPABILITIES_OUT_TX_DPCPU_FW_ID);145 146 if (!(nic_data->datapath_caps &147 (1 << MC_CMD_GET_CAPABILITIES_OUT_RX_PREFIX_LEN_14_LBN))) {148 netif_err(efx, probe, efx->net_dev,149 "current firmware does not support an RX prefix\n");150 return -ENODEV;151 }152 153 if (outlen >= MC_CMD_GET_CAPABILITIES_V3_OUT_LEN) {154 u8 vi_window_mode = MCDI_BYTE(outbuf,155 GET_CAPABILITIES_V3_OUT_VI_WINDOW_MODE);156 157 rc = efx_mcdi_window_mode_to_stride(efx, vi_window_mode);158 if (rc)159 return rc;160 } else {161 /* keep default VI stride */162 netif_dbg(efx, probe, efx->net_dev,163 "firmware did not report VI window mode, assuming vi_stride = %u\n",164 efx->vi_stride);165 }166 167 if (outlen >= MC_CMD_GET_CAPABILITIES_V4_OUT_LEN) {168 efx->num_mac_stats = MCDI_WORD(outbuf,169 GET_CAPABILITIES_V4_OUT_MAC_STATS_NUM_STATS);170 netif_dbg(efx, probe, efx->net_dev,171 "firmware reports num_mac_stats = %u\n",172 efx->num_mac_stats);173 } else {174 /* leave num_mac_stats as the default value, MC_CMD_MAC_NSTATS */175 netif_dbg(efx, probe, efx->net_dev,176 "firmware did not report num_mac_stats, assuming %u\n",177 efx->num_mac_stats);178 }179 180 return 0;181}182 183static void efx_ef10_read_licensed_features(struct efx_nic *efx)184{185 MCDI_DECLARE_BUF(inbuf, MC_CMD_LICENSING_V3_IN_LEN);186 MCDI_DECLARE_BUF(outbuf, MC_CMD_LICENSING_V3_OUT_LEN);187 struct efx_ef10_nic_data *nic_data = efx->nic_data;188 size_t outlen;189 int rc;190 191 MCDI_SET_DWORD(inbuf, LICENSING_V3_IN_OP,192 MC_CMD_LICENSING_V3_IN_OP_REPORT_LICENSE);193 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_LICENSING_V3, inbuf, sizeof(inbuf),194 outbuf, sizeof(outbuf), &outlen);195 if (rc || (outlen < MC_CMD_LICENSING_V3_OUT_LEN))196 return;197 198 nic_data->licensed_features = MCDI_QWORD(outbuf,199 LICENSING_V3_OUT_LICENSED_FEATURES);200}201 202static int efx_ef10_get_sysclk_freq(struct efx_nic *efx)203{204 MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_CLOCK_OUT_LEN);205 int rc;206 207 rc = efx_mcdi_rpc(efx, MC_CMD_GET_CLOCK, NULL, 0,208 outbuf, sizeof(outbuf), NULL);209 if (rc)210 return rc;211 rc = MCDI_DWORD(outbuf, GET_CLOCK_OUT_SYS_FREQ);212 return rc > 0 ? rc : -ERANGE;213}214 215static int efx_ef10_get_timer_workarounds(struct efx_nic *efx)216{217 struct efx_ef10_nic_data *nic_data = efx->nic_data;218 unsigned int implemented;219 unsigned int enabled;220 int rc;221 222 nic_data->workaround_35388 = false;223 nic_data->workaround_61265 = false;224 225 rc = efx_mcdi_get_workarounds(efx, &implemented, &enabled);226 227 if (rc == -ENOSYS) {228 /* Firmware without GET_WORKAROUNDS - not a problem. */229 rc = 0;230 } else if (rc == 0) {231 /* Bug61265 workaround is always enabled if implemented. */232 if (enabled & MC_CMD_GET_WORKAROUNDS_OUT_BUG61265)233 nic_data->workaround_61265 = true;234 235 if (enabled & MC_CMD_GET_WORKAROUNDS_OUT_BUG35388) {236 nic_data->workaround_35388 = true;237 } else if (implemented & MC_CMD_GET_WORKAROUNDS_OUT_BUG35388) {238 /* Workaround is implemented but not enabled.239 * Try to enable it.240 */241 rc = efx_mcdi_set_workaround(efx,242 MC_CMD_WORKAROUND_BUG35388,243 true, NULL);244 if (rc == 0)245 nic_data->workaround_35388 = true;246 /* If we failed to set the workaround just carry on. */247 rc = 0;248 }249 }250 251 netif_dbg(efx, probe, efx->net_dev,252 "workaround for bug 35388 is %sabled\n",253 nic_data->workaround_35388 ? "en" : "dis");254 netif_dbg(efx, probe, efx->net_dev,255 "workaround for bug 61265 is %sabled\n",256 nic_data->workaround_61265 ? "en" : "dis");257 258 return rc;259}260 261static void efx_ef10_process_timer_config(struct efx_nic *efx,262 const efx_dword_t *data)263{264 unsigned int max_count;265 266 if (EFX_EF10_WORKAROUND_61265(efx)) {267 efx->timer_quantum_ns = MCDI_DWORD(data,268 GET_EVQ_TMR_PROPERTIES_OUT_MCDI_TMR_STEP_NS);269 efx->timer_max_ns = MCDI_DWORD(data,270 GET_EVQ_TMR_PROPERTIES_OUT_MCDI_TMR_MAX_NS);271 } else if (EFX_EF10_WORKAROUND_35388(efx)) {272 efx->timer_quantum_ns = MCDI_DWORD(data,273 GET_EVQ_TMR_PROPERTIES_OUT_BUG35388_TMR_NS_PER_COUNT);274 max_count = MCDI_DWORD(data,275 GET_EVQ_TMR_PROPERTIES_OUT_BUG35388_TMR_MAX_COUNT);276 efx->timer_max_ns = max_count * efx->timer_quantum_ns;277 } else {278 efx->timer_quantum_ns = MCDI_DWORD(data,279 GET_EVQ_TMR_PROPERTIES_OUT_TMR_REG_NS_PER_COUNT);280 max_count = MCDI_DWORD(data,281 GET_EVQ_TMR_PROPERTIES_OUT_TMR_REG_MAX_COUNT);282 efx->timer_max_ns = max_count * efx->timer_quantum_ns;283 }284 285 netif_dbg(efx, probe, efx->net_dev,286 "got timer properties from MC: quantum %u ns; max %u ns\n",287 efx->timer_quantum_ns, efx->timer_max_ns);288}289 290static int efx_ef10_get_timer_config(struct efx_nic *efx)291{292 MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_EVQ_TMR_PROPERTIES_OUT_LEN);293 int rc;294 295 rc = efx_ef10_get_timer_workarounds(efx);296 if (rc)297 return rc;298 299 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_GET_EVQ_TMR_PROPERTIES, NULL, 0,300 outbuf, sizeof(outbuf), NULL);301 302 if (rc == 0) {303 efx_ef10_process_timer_config(efx, outbuf);304 } else if (rc == -ENOSYS || rc == -EPERM) {305 /* Not available - fall back to Huntington defaults. */306 unsigned int quantum;307 308 rc = efx_ef10_get_sysclk_freq(efx);309 if (rc < 0)310 return rc;311 312 quantum = 1536000 / rc; /* 1536 cycles */313 efx->timer_quantum_ns = quantum;314 efx->timer_max_ns = efx->type->timer_period_max * quantum;315 rc = 0;316 } else {317 efx_mcdi_display_error(efx, MC_CMD_GET_EVQ_TMR_PROPERTIES,318 MC_CMD_GET_EVQ_TMR_PROPERTIES_OUT_LEN,319 NULL, 0, rc);320 }321 322 return rc;323}324 325static int efx_ef10_get_mac_address_pf(struct efx_nic *efx, u8 *mac_address)326{327 MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_MAC_ADDRESSES_OUT_LEN);328 size_t outlen;329 int rc;330 331 BUILD_BUG_ON(MC_CMD_GET_MAC_ADDRESSES_IN_LEN != 0);332 333 rc = efx_mcdi_rpc(efx, MC_CMD_GET_MAC_ADDRESSES, NULL, 0,334 outbuf, sizeof(outbuf), &outlen);335 if (rc)336 return rc;337 if (outlen < MC_CMD_GET_MAC_ADDRESSES_OUT_LEN)338 return -EIO;339 340 ether_addr_copy(mac_address,341 MCDI_PTR(outbuf, GET_MAC_ADDRESSES_OUT_MAC_ADDR_BASE));342 return 0;343}344 345static int efx_ef10_get_mac_address_vf(struct efx_nic *efx, u8 *mac_address)346{347 MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_GET_MAC_ADDRESSES_IN_LEN);348 MCDI_DECLARE_BUF(outbuf, MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMAX);349 size_t outlen;350 int num_addrs, rc;351 352 MCDI_SET_DWORD(inbuf, VPORT_GET_MAC_ADDRESSES_IN_VPORT_ID,353 EVB_PORT_ID_ASSIGNED);354 rc = efx_mcdi_rpc(efx, MC_CMD_VPORT_GET_MAC_ADDRESSES, inbuf,355 sizeof(inbuf), outbuf, sizeof(outbuf), &outlen);356 357 if (rc)358 return rc;359 if (outlen < MC_CMD_VPORT_GET_MAC_ADDRESSES_OUT_LENMIN)360 return -EIO;361 362 num_addrs = MCDI_DWORD(outbuf,363 VPORT_GET_MAC_ADDRESSES_OUT_MACADDR_COUNT);364 365 WARN_ON(num_addrs != 1);366 367 ether_addr_copy(mac_address,368 MCDI_PTR(outbuf, VPORT_GET_MAC_ADDRESSES_OUT_MACADDR));369 370 return 0;371}372 373static ssize_t link_control_flag_show(struct device *dev,374 struct device_attribute *attr,375 char *buf)376{377 struct efx_nic *efx = dev_get_drvdata(dev);378 379 return sprintf(buf, "%d\n",380 ((efx->mcdi->fn_flags) &381 (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL))382 ? 1 : 0);383}384 385static ssize_t primary_flag_show(struct device *dev,386 struct device_attribute *attr,387 char *buf)388{389 struct efx_nic *efx = dev_get_drvdata(dev);390 391 return sprintf(buf, "%d\n",392 ((efx->mcdi->fn_flags) &393 (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_PRIMARY))394 ? 1 : 0);395}396 397static struct efx_ef10_vlan *efx_ef10_find_vlan(struct efx_nic *efx, u16 vid)398{399 struct efx_ef10_nic_data *nic_data = efx->nic_data;400 struct efx_ef10_vlan *vlan;401 402 WARN_ON(!mutex_is_locked(&nic_data->vlan_lock));403 404 list_for_each_entry(vlan, &nic_data->vlan_list, list) {405 if (vlan->vid == vid)406 return vlan;407 }408 409 return NULL;410}411 412static int efx_ef10_add_vlan(struct efx_nic *efx, u16 vid)413{414 struct efx_ef10_nic_data *nic_data = efx->nic_data;415 struct efx_ef10_vlan *vlan;416 int rc;417 418 mutex_lock(&nic_data->vlan_lock);419 420 vlan = efx_ef10_find_vlan(efx, vid);421 if (vlan) {422 /* We add VID 0 on init. 8021q adds it on module init423 * for all interfaces with VLAN filtring feature.424 */425 if (vid == 0)426 goto done_unlock;427 netif_warn(efx, drv, efx->net_dev,428 "VLAN %u already added\n", vid);429 rc = -EALREADY;430 goto fail_exist;431 }432 433 rc = -ENOMEM;434 vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);435 if (!vlan)436 goto fail_alloc;437 438 vlan->vid = vid;439 440 list_add_tail(&vlan->list, &nic_data->vlan_list);441 442 if (efx->filter_state) {443 mutex_lock(&efx->mac_lock);444 down_write(&efx->filter_sem);445 rc = efx_mcdi_filter_add_vlan(efx, vlan->vid);446 up_write(&efx->filter_sem);447 mutex_unlock(&efx->mac_lock);448 if (rc)449 goto fail_filter_add_vlan;450 }451 452done_unlock:453 mutex_unlock(&nic_data->vlan_lock);454 return 0;455 456fail_filter_add_vlan:457 list_del(&vlan->list);458 kfree(vlan);459fail_alloc:460fail_exist:461 mutex_unlock(&nic_data->vlan_lock);462 return rc;463}464 465static void efx_ef10_del_vlan_internal(struct efx_nic *efx,466 struct efx_ef10_vlan *vlan)467{468 struct efx_ef10_nic_data *nic_data = efx->nic_data;469 470 WARN_ON(!mutex_is_locked(&nic_data->vlan_lock));471 472 if (efx->filter_state) {473 down_write(&efx->filter_sem);474 efx_mcdi_filter_del_vlan(efx, vlan->vid);475 up_write(&efx->filter_sem);476 }477 478 list_del(&vlan->list);479 kfree(vlan);480}481 482static int efx_ef10_del_vlan(struct efx_nic *efx, u16 vid)483{484 struct efx_ef10_nic_data *nic_data = efx->nic_data;485 struct efx_ef10_vlan *vlan;486 int rc = 0;487 488 /* 8021q removes VID 0 on module unload for all interfaces489 * with VLAN filtering feature. We need to keep it to receive490 * untagged traffic.491 */492 if (vid == 0)493 return 0;494 495 mutex_lock(&nic_data->vlan_lock);496 497 vlan = efx_ef10_find_vlan(efx, vid);498 if (!vlan) {499 netif_err(efx, drv, efx->net_dev,500 "VLAN %u to be deleted not found\n", vid);501 rc = -ENOENT;502 } else {503 efx_ef10_del_vlan_internal(efx, vlan);504 }505 506 mutex_unlock(&nic_data->vlan_lock);507 508 return rc;509}510 511static void efx_ef10_cleanup_vlans(struct efx_nic *efx)512{513 struct efx_ef10_nic_data *nic_data = efx->nic_data;514 struct efx_ef10_vlan *vlan, *next_vlan;515 516 mutex_lock(&nic_data->vlan_lock);517 list_for_each_entry_safe(vlan, next_vlan, &nic_data->vlan_list, list)518 efx_ef10_del_vlan_internal(efx, vlan);519 mutex_unlock(&nic_data->vlan_lock);520}521 522static DEVICE_ATTR_RO(link_control_flag);523static DEVICE_ATTR_RO(primary_flag);524 525static int efx_ef10_probe(struct efx_nic *efx)526{527 struct efx_ef10_nic_data *nic_data;528 int i, rc;529 530 nic_data = kzalloc(sizeof(*nic_data), GFP_KERNEL);531 if (!nic_data)532 return -ENOMEM;533 efx->nic_data = nic_data;534 535 /* we assume later that we can copy from this buffer in dwords */536 BUILD_BUG_ON(MCDI_CTL_SDU_LEN_MAX_V2 % 4);537 538 rc = efx_nic_alloc_buffer(efx, &nic_data->mcdi_buf,539 8 + MCDI_CTL_SDU_LEN_MAX_V2, GFP_KERNEL);540 if (rc)541 goto fail1;542 543 /* Get the MC's warm boot count. In case it's rebooting right544 * now, be prepared to retry.545 */546 i = 0;547 for (;;) {548 rc = efx_ef10_get_warm_boot_count(efx);549 if (rc >= 0)550 break;551 if (++i == 5)552 goto fail2;553 ssleep(1);554 }555 nic_data->warm_boot_count = rc;556 557 /* In case we're recovering from a crash (kexec), we want to558 * cancel any outstanding request by the previous user of this559 * function. We send a special message using the least560 * significant bits of the 'high' (doorbell) register.561 */562 _efx_writed(efx, cpu_to_le32(1), ER_DZ_MC_DB_HWRD);563 564 rc = efx_mcdi_init(efx);565 if (rc)566 goto fail2;567 568 mutex_init(&nic_data->udp_tunnels_lock);569 for (i = 0; i < ARRAY_SIZE(nic_data->udp_tunnels); ++i)570 nic_data->udp_tunnels[i].type =571 TUNNEL_ENCAP_UDP_PORT_ENTRY_INVALID;572 573 /* Reset (most) configuration for this function */574 rc = efx_mcdi_reset(efx, RESET_TYPE_ALL);575 if (rc)576 goto fail3;577 578 /* Enable event logging */579 rc = efx_mcdi_log_ctrl(efx, true, false, 0);580 if (rc)581 goto fail3;582 583 rc = device_create_file(&efx->pci_dev->dev,584 &dev_attr_link_control_flag);585 if (rc)586 goto fail3;587 588 rc = device_create_file(&efx->pci_dev->dev, &dev_attr_primary_flag);589 if (rc)590 goto fail4;591 592 rc = efx_get_pf_index(efx, &nic_data->pf_index);593 if (rc)594 goto fail5;595 596 rc = efx_ef10_init_datapath_caps(efx);597 if (rc < 0)598 goto fail5;599 600 efx_ef10_read_licensed_features(efx);601 602 /* We can have one VI for each vi_stride-byte region.603 * However, until we use TX option descriptors we need up to four604 * TX queues per channel for different checksumming combinations.605 */606 if (nic_data->datapath_caps &607 (1 << MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN))608 efx->tx_queues_per_channel = 4;609 else610 efx->tx_queues_per_channel = 2;611 efx->max_vis = efx_ef10_mem_map_size(efx) / efx->vi_stride;612 if (!efx->max_vis) {613 netif_err(efx, drv, efx->net_dev, "error determining max VIs\n");614 rc = -EIO;615 goto fail5;616 }617 efx->max_channels = min_t(unsigned int, EFX_MAX_CHANNELS,618 efx->max_vis / efx->tx_queues_per_channel);619 efx->max_tx_channels = efx->max_channels;620 if (WARN_ON(efx->max_channels == 0)) {621 rc = -EIO;622 goto fail5;623 }624 625 efx->rx_packet_len_offset =626 ES_DZ_RX_PREFIX_PKTLEN_OFST - ES_DZ_RX_PREFIX_SIZE;627 628 if (nic_data->datapath_caps &629 (1 << MC_CMD_GET_CAPABILITIES_OUT_RX_INCLUDE_FCS_LBN))630 efx->net_dev->hw_features |= NETIF_F_RXFCS;631 632 rc = efx_mcdi_port_get_number(efx);633 if (rc < 0)634 goto fail5;635 efx->port_num = rc;636 637 rc = efx->type->get_mac_address(efx, efx->net_dev->perm_addr);638 if (rc)639 goto fail5;640 641 rc = efx_ef10_get_timer_config(efx);642 if (rc < 0)643 goto fail5;644 645 rc = efx_mcdi_mon_probe(efx);646 if (rc && rc != -EPERM)647 goto fail5;648 649 efx_ptp_defer_probe_with_channel(efx);650 651#ifdef CONFIG_SFC_SRIOV652 if ((efx->pci_dev->physfn) && (!efx->pci_dev->is_physfn)) {653 struct pci_dev *pci_dev_pf = efx->pci_dev->physfn;654 struct efx_nic *efx_pf = pci_get_drvdata(pci_dev_pf);655 656 efx_pf->type->get_mac_address(efx_pf, nic_data->port_id);657 } else658#endif659 ether_addr_copy(nic_data->port_id, efx->net_dev->perm_addr);660 661 INIT_LIST_HEAD(&nic_data->vlan_list);662 mutex_init(&nic_data->vlan_lock);663 664 /* Add unspecified VID to support VLAN filtering being disabled */665 rc = efx_ef10_add_vlan(efx, EFX_FILTER_VID_UNSPEC);666 if (rc)667 goto fail_add_vid_unspec;668 669 /* If VLAN filtering is enabled, we need VID 0 to get untagged670 * traffic. It is added automatically if 8021q module is loaded,671 * but we can't rely on it since module may be not loaded.672 */673 rc = efx_ef10_add_vlan(efx, 0);674 if (rc)675 goto fail_add_vid_0;676 677 if (nic_data->datapath_caps &678 (1 << MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN) &&679 efx->mcdi->fn_flags &680 (1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_TRUSTED))681 efx->net_dev->udp_tunnel_nic_info = &efx_ef10_udp_tunnels;682 683 return 0;684 685fail_add_vid_0:686 efx_ef10_cleanup_vlans(efx);687fail_add_vid_unspec:688 mutex_destroy(&nic_data->vlan_lock);689 efx_ptp_remove(efx);690 efx_mcdi_mon_remove(efx);691fail5:692 device_remove_file(&efx->pci_dev->dev, &dev_attr_primary_flag);693fail4:694 device_remove_file(&efx->pci_dev->dev, &dev_attr_link_control_flag);695fail3:696 efx_mcdi_detach(efx);697 698 mutex_lock(&nic_data->udp_tunnels_lock);699 memset(nic_data->udp_tunnels, 0, sizeof(nic_data->udp_tunnels));700 (void)efx_ef10_set_udp_tnl_ports(efx, true);701 mutex_unlock(&nic_data->udp_tunnels_lock);702 mutex_destroy(&nic_data->udp_tunnels_lock);703 704 efx_mcdi_fini(efx);705fail2:706 efx_nic_free_buffer(efx, &nic_data->mcdi_buf);707fail1:708 kfree(nic_data);709 efx->nic_data = NULL;710 return rc;711}712 713#ifdef EFX_USE_PIO714 715static void efx_ef10_free_piobufs(struct efx_nic *efx)716{717 struct efx_ef10_nic_data *nic_data = efx->nic_data;718 MCDI_DECLARE_BUF(inbuf, MC_CMD_FREE_PIOBUF_IN_LEN);719 unsigned int i;720 int rc;721 722 BUILD_BUG_ON(MC_CMD_FREE_PIOBUF_OUT_LEN != 0);723 724 for (i = 0; i < nic_data->n_piobufs; i++) {725 MCDI_SET_DWORD(inbuf, FREE_PIOBUF_IN_PIOBUF_HANDLE,726 nic_data->piobuf_handle[i]);727 rc = efx_mcdi_rpc(efx, MC_CMD_FREE_PIOBUF, inbuf, sizeof(inbuf),728 NULL, 0, NULL);729 WARN_ON(rc);730 }731 732 nic_data->n_piobufs = 0;733}734 735static int efx_ef10_alloc_piobufs(struct efx_nic *efx, unsigned int n)736{737 struct efx_ef10_nic_data *nic_data = efx->nic_data;738 MCDI_DECLARE_BUF(outbuf, MC_CMD_ALLOC_PIOBUF_OUT_LEN);739 unsigned int i;740 size_t outlen;741 int rc = 0;742 743 BUILD_BUG_ON(MC_CMD_ALLOC_PIOBUF_IN_LEN != 0);744 745 for (i = 0; i < n; i++) {746 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_ALLOC_PIOBUF, NULL, 0,747 outbuf, sizeof(outbuf), &outlen);748 if (rc) {749 /* Don't display the MC error if we didn't have space750 * for a VF.751 */752 if (!(efx_ef10_is_vf(efx) && rc == -ENOSPC))753 efx_mcdi_display_error(efx, MC_CMD_ALLOC_PIOBUF,754 0, outbuf, outlen, rc);755 break;756 }757 if (outlen < MC_CMD_ALLOC_PIOBUF_OUT_LEN) {758 rc = -EIO;759 break;760 }761 nic_data->piobuf_handle[i] =762 MCDI_DWORD(outbuf, ALLOC_PIOBUF_OUT_PIOBUF_HANDLE);763 netif_dbg(efx, probe, efx->net_dev,764 "allocated PIO buffer %u handle %x\n", i,765 nic_data->piobuf_handle[i]);766 }767 768 nic_data->n_piobufs = i;769 if (rc)770 efx_ef10_free_piobufs(efx);771 return rc;772}773 774static int efx_ef10_link_piobufs(struct efx_nic *efx)775{776 struct efx_ef10_nic_data *nic_data = efx->nic_data;777 MCDI_DECLARE_BUF(inbuf, MC_CMD_LINK_PIOBUF_IN_LEN);778 struct efx_channel *channel;779 struct efx_tx_queue *tx_queue;780 unsigned int offset, index;781 int rc;782 783 BUILD_BUG_ON(MC_CMD_LINK_PIOBUF_OUT_LEN != 0);784 BUILD_BUG_ON(MC_CMD_UNLINK_PIOBUF_OUT_LEN != 0);785 786 /* Link a buffer to each VI in the write-combining mapping */787 for (index = 0; index < nic_data->n_piobufs; ++index) {788 MCDI_SET_DWORD(inbuf, LINK_PIOBUF_IN_PIOBUF_HANDLE,789 nic_data->piobuf_handle[index]);790 MCDI_SET_DWORD(inbuf, LINK_PIOBUF_IN_TXQ_INSTANCE,791 nic_data->pio_write_vi_base + index);792 rc = efx_mcdi_rpc(efx, MC_CMD_LINK_PIOBUF,793 inbuf, MC_CMD_LINK_PIOBUF_IN_LEN,794 NULL, 0, NULL);795 if (rc) {796 netif_err(efx, drv, efx->net_dev,797 "failed to link VI %u to PIO buffer %u (%d)\n",798 nic_data->pio_write_vi_base + index, index,799 rc);800 goto fail;801 }802 netif_dbg(efx, probe, efx->net_dev,803 "linked VI %u to PIO buffer %u\n",804 nic_data->pio_write_vi_base + index, index);805 }806 807 /* Link a buffer to each TX queue */808 efx_for_each_channel(channel, efx) {809 /* Extra channels, even those with TXQs (PTP), do not require810 * PIO resources.811 */812 if (!channel->type->want_pio ||813 channel->channel >= efx->xdp_channel_offset)814 continue;815 816 efx_for_each_channel_tx_queue(tx_queue, channel) {817 /* We assign the PIO buffers to queues in818 * reverse order to allow for the following819 * special case.820 */821 offset = ((efx->tx_channel_offset + efx->n_tx_channels -822 tx_queue->channel->channel - 1) *823 efx_piobuf_size);824 index = offset / nic_data->piobuf_size;825 offset = offset % nic_data->piobuf_size;826 827 /* When the host page size is 4K, the first828 * host page in the WC mapping may be within829 * the same VI page as the last TX queue. We830 * can only link one buffer to each VI.831 */832 if (tx_queue->queue == nic_data->pio_write_vi_base) {833 BUG_ON(index != 0);834 rc = 0;835 } else {836 MCDI_SET_DWORD(inbuf,837 LINK_PIOBUF_IN_PIOBUF_HANDLE,838 nic_data->piobuf_handle[index]);839 MCDI_SET_DWORD(inbuf,840 LINK_PIOBUF_IN_TXQ_INSTANCE,841 tx_queue->queue);842 rc = efx_mcdi_rpc(efx, MC_CMD_LINK_PIOBUF,843 inbuf, MC_CMD_LINK_PIOBUF_IN_LEN,844 NULL, 0, NULL);845 }846 847 if (rc) {848 /* This is non-fatal; the TX path just849 * won't use PIO for this queue850 */851 netif_err(efx, drv, efx->net_dev,852 "failed to link VI %u to PIO buffer %u (%d)\n",853 tx_queue->queue, index, rc);854 tx_queue->piobuf = NULL;855 } else {856 tx_queue->piobuf =857 nic_data->pio_write_base +858 index * efx->vi_stride + offset;859 tx_queue->piobuf_offset = offset;860 netif_dbg(efx, probe, efx->net_dev,861 "linked VI %u to PIO buffer %u offset %x addr %p\n",862 tx_queue->queue, index,863 tx_queue->piobuf_offset,864 tx_queue->piobuf);865 }866 }867 }868 869 return 0;870 871fail:872 /* inbuf was defined for MC_CMD_LINK_PIOBUF. We can use the same873 * buffer for MC_CMD_UNLINK_PIOBUF because it's shorter.874 */875 BUILD_BUG_ON(MC_CMD_LINK_PIOBUF_IN_LEN < MC_CMD_UNLINK_PIOBUF_IN_LEN);876 while (index--) {877 MCDI_SET_DWORD(inbuf, UNLINK_PIOBUF_IN_TXQ_INSTANCE,878 nic_data->pio_write_vi_base + index);879 efx_mcdi_rpc(efx, MC_CMD_UNLINK_PIOBUF,880 inbuf, MC_CMD_UNLINK_PIOBUF_IN_LEN,881 NULL, 0, NULL);882 }883 return rc;884}885 886static void efx_ef10_forget_old_piobufs(struct efx_nic *efx)887{888 struct efx_channel *channel;889 struct efx_tx_queue *tx_queue;890 891 /* All our existing PIO buffers went away */892 efx_for_each_channel(channel, efx)893 efx_for_each_channel_tx_queue(tx_queue, channel)894 tx_queue->piobuf = NULL;895}896 897#else /* !EFX_USE_PIO */898 899static int efx_ef10_alloc_piobufs(struct efx_nic *efx, unsigned int n)900{901 return n == 0 ? 0 : -ENOBUFS;902}903 904static int efx_ef10_link_piobufs(struct efx_nic *efx)905{906 return 0;907}908 909static void efx_ef10_free_piobufs(struct efx_nic *efx)910{911}912 913static void efx_ef10_forget_old_piobufs(struct efx_nic *efx)914{915}916 917#endif /* EFX_USE_PIO */918 919static void efx_ef10_remove(struct efx_nic *efx)920{921 struct efx_ef10_nic_data *nic_data = efx->nic_data;922 int rc;923 924#ifdef CONFIG_SFC_SRIOV925 struct efx_ef10_nic_data *nic_data_pf;926 struct pci_dev *pci_dev_pf;927 struct efx_nic *efx_pf;928 struct ef10_vf *vf;929 930 if (efx->pci_dev->is_virtfn) {931 pci_dev_pf = efx->pci_dev->physfn;932 if (pci_dev_pf) {933 efx_pf = pci_get_drvdata(pci_dev_pf);934 nic_data_pf = efx_pf->nic_data;935 vf = nic_data_pf->vf + nic_data->vf_index;936 vf->efx = NULL;937 } else938 netif_info(efx, drv, efx->net_dev,939 "Could not get the PF id from VF\n");940 }941#endif942 943 efx_ef10_cleanup_vlans(efx);944 mutex_destroy(&nic_data->vlan_lock);945 946 efx_ptp_remove(efx);947 948 efx_mcdi_mon_remove(efx);949 950 efx_mcdi_rx_free_indir_table(efx);951 952 if (nic_data->wc_membase)953 iounmap(nic_data->wc_membase);954 955 rc = efx_mcdi_free_vis(efx);956 WARN_ON(rc != 0);957 958 if (!nic_data->must_restore_piobufs)959 efx_ef10_free_piobufs(efx);960 961 device_remove_file(&efx->pci_dev->dev, &dev_attr_primary_flag);962 device_remove_file(&efx->pci_dev->dev, &dev_attr_link_control_flag);963 964 efx_mcdi_detach(efx);965 966 memset(nic_data->udp_tunnels, 0, sizeof(nic_data->udp_tunnels));967 mutex_lock(&nic_data->udp_tunnels_lock);968 (void)efx_ef10_set_udp_tnl_ports(efx, true);969 mutex_unlock(&nic_data->udp_tunnels_lock);970 971 mutex_destroy(&nic_data->udp_tunnels_lock);972 973 efx_mcdi_fini(efx);974 efx_nic_free_buffer(efx, &nic_data->mcdi_buf);975 kfree(nic_data);976}977 978static int efx_ef10_probe_pf(struct efx_nic *efx)979{980 return efx_ef10_probe(efx);981}982 983int efx_ef10_vadaptor_query(struct efx_nic *efx, unsigned int port_id,984 u32 *port_flags, u32 *vadaptor_flags,985 unsigned int *vlan_tags)986{987 struct efx_ef10_nic_data *nic_data = efx->nic_data;988 MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_QUERY_IN_LEN);989 MCDI_DECLARE_BUF(outbuf, MC_CMD_VADAPTOR_QUERY_OUT_LEN);990 size_t outlen;991 int rc;992 993 if (nic_data->datapath_caps &994 (1 << MC_CMD_GET_CAPABILITIES_OUT_VADAPTOR_QUERY_LBN)) {995 MCDI_SET_DWORD(inbuf, VADAPTOR_QUERY_IN_UPSTREAM_PORT_ID,996 port_id);997 998 rc = efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_QUERY, inbuf, sizeof(inbuf),999 outbuf, sizeof(outbuf), &outlen);1000 if (rc)1001 return rc;1002 1003 if (outlen < sizeof(outbuf)) {1004 rc = -EIO;1005 return rc;1006 }1007 }1008 1009 if (port_flags)1010 *port_flags = MCDI_DWORD(outbuf, VADAPTOR_QUERY_OUT_PORT_FLAGS);1011 if (vadaptor_flags)1012 *vadaptor_flags =1013 MCDI_DWORD(outbuf, VADAPTOR_QUERY_OUT_VADAPTOR_FLAGS);1014 if (vlan_tags)1015 *vlan_tags =1016 MCDI_DWORD(outbuf,1017 VADAPTOR_QUERY_OUT_NUM_AVAILABLE_VLAN_TAGS);1018 1019 return 0;1020}1021 1022int efx_ef10_vadaptor_alloc(struct efx_nic *efx, unsigned int port_id)1023{1024 MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_ALLOC_IN_LEN);1025 1026 MCDI_SET_DWORD(inbuf, VADAPTOR_ALLOC_IN_UPSTREAM_PORT_ID, port_id);1027 return efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_ALLOC, inbuf, sizeof(inbuf),1028 NULL, 0, NULL);1029}1030 1031int efx_ef10_vadaptor_free(struct efx_nic *efx, unsigned int port_id)1032{1033 MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_FREE_IN_LEN);1034 1035 MCDI_SET_DWORD(inbuf, VADAPTOR_FREE_IN_UPSTREAM_PORT_ID, port_id);1036 return efx_mcdi_rpc(efx, MC_CMD_VADAPTOR_FREE, inbuf, sizeof(inbuf),1037 NULL, 0, NULL);1038}1039 1040int efx_ef10_vport_add_mac(struct efx_nic *efx,1041 unsigned int port_id, const u8 *mac)1042{1043 MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_ADD_MAC_ADDRESS_IN_LEN);1044 1045 MCDI_SET_DWORD(inbuf, VPORT_ADD_MAC_ADDRESS_IN_VPORT_ID, port_id);1046 ether_addr_copy(MCDI_PTR(inbuf, VPORT_ADD_MAC_ADDRESS_IN_MACADDR), mac);1047 1048 return efx_mcdi_rpc(efx, MC_CMD_VPORT_ADD_MAC_ADDRESS, inbuf,1049 sizeof(inbuf), NULL, 0, NULL);1050}1051 1052int efx_ef10_vport_del_mac(struct efx_nic *efx,1053 unsigned int port_id, const u8 *mac)1054{1055 MCDI_DECLARE_BUF(inbuf, MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN);1056 1057 MCDI_SET_DWORD(inbuf, VPORT_DEL_MAC_ADDRESS_IN_VPORT_ID, port_id);1058 ether_addr_copy(MCDI_PTR(inbuf, VPORT_DEL_MAC_ADDRESS_IN_MACADDR), mac);1059 1060 return efx_mcdi_rpc(efx, MC_CMD_VPORT_DEL_MAC_ADDRESS, inbuf,1061 sizeof(inbuf), NULL, 0, NULL);1062}1063 1064#ifdef CONFIG_SFC_SRIOV1065static int efx_ef10_probe_vf(struct efx_nic *efx)1066{1067 int rc;1068 struct pci_dev *pci_dev_pf;1069 1070 /* If the parent PF has no VF data structure, it doesn't know about this1071 * VF so fail probe. The VF needs to be re-created. This can happen1072 * if the PF driver was unloaded while any VF was assigned to a guest1073 * (using Xen, only).1074 */1075 pci_dev_pf = efx->pci_dev->physfn;1076 if (pci_dev_pf) {1077 struct efx_nic *efx_pf = pci_get_drvdata(pci_dev_pf);1078 struct efx_ef10_nic_data *nic_data_pf = efx_pf->nic_data;1079 1080 if (!nic_data_pf->vf) {1081 netif_info(efx, drv, efx->net_dev,1082 "The VF cannot link to its parent PF; "1083 "please destroy and re-create the VF\n");1084 return -EBUSY;1085 }1086 }1087 1088 rc = efx_ef10_probe(efx);1089 if (rc)1090 return rc;1091 1092 rc = efx_ef10_get_vf_index(efx);1093 if (rc)1094 goto fail;1095 1096 if (efx->pci_dev->is_virtfn) {1097 if (efx->pci_dev->physfn) {1098 struct efx_nic *efx_pf =1099 pci_get_drvdata(efx->pci_dev->physfn);1100 struct efx_ef10_nic_data *nic_data_p = efx_pf->nic_data;1101 struct efx_ef10_nic_data *nic_data = efx->nic_data;1102 1103 nic_data_p->vf[nic_data->vf_index].efx = efx;1104 nic_data_p->vf[nic_data->vf_index].pci_dev =1105 efx->pci_dev;1106 } else1107 netif_info(efx, drv, efx->net_dev,1108 "Could not get the PF id from VF\n");1109 }1110 1111 return 0;1112 1113fail:1114 efx_ef10_remove(efx);1115 return rc;1116}1117#else1118static int efx_ef10_probe_vf(struct efx_nic *efx __attribute__ ((unused)))1119{1120 return 0;1121}1122#endif1123 1124static int efx_ef10_alloc_vis(struct efx_nic *efx,1125 unsigned int min_vis, unsigned int max_vis)1126{1127 struct efx_ef10_nic_data *nic_data = efx->nic_data;1128 1129 return efx_mcdi_alloc_vis(efx, min_vis, max_vis, &nic_data->vi_base,1130 &nic_data->n_allocated_vis);1131}1132 1133/* Note that the failure path of this function does not free1134 * resources, as this will be done by efx_ef10_remove().1135 */1136static int efx_ef10_dimension_resources(struct efx_nic *efx)1137{1138 unsigned int min_vis = max_t(unsigned int, efx->tx_queues_per_channel,1139 efx_separate_tx_channels ? 2 : 1);1140 unsigned int channel_vis, pio_write_vi_base, max_vis;1141 struct efx_ef10_nic_data *nic_data = efx->nic_data;1142 unsigned int uc_mem_map_size, wc_mem_map_size;1143 void __iomem *membase;1144 int rc;1145 1146 channel_vis = max(efx->n_channels,1147 ((efx->n_tx_channels + efx->n_extra_tx_channels) *1148 efx->tx_queues_per_channel) +1149 efx->n_xdp_channels * efx->xdp_tx_per_channel);1150 if (efx->max_vis && efx->max_vis < channel_vis) {1151 netif_dbg(efx, drv, efx->net_dev,1152 "Reducing channel VIs from %u to %u\n",1153 channel_vis, efx->max_vis);1154 channel_vis = efx->max_vis;1155 }1156 1157#ifdef EFX_USE_PIO1158 /* Try to allocate PIO buffers if wanted and if the full1159 * number of PIO buffers would be sufficient to allocate one1160 * copy-buffer per TX channel. Failure is non-fatal, as there1161 * are only a small number of PIO buffers shared between all1162 * functions of the controller.1163 */1164 if (efx_piobuf_size != 0 &&1165 nic_data->piobuf_size / efx_piobuf_size * EF10_TX_PIOBUF_COUNT >=1166 efx->n_tx_channels) {1167 unsigned int n_piobufs =1168 DIV_ROUND_UP(efx->n_tx_channels,1169 nic_data->piobuf_size / efx_piobuf_size);1170 1171 rc = efx_ef10_alloc_piobufs(efx, n_piobufs);1172 if (rc == -ENOSPC)1173 netif_dbg(efx, probe, efx->net_dev,1174 "out of PIO buffers; cannot allocate more\n");1175 else if (rc == -EPERM)1176 netif_dbg(efx, probe, efx->net_dev,1177 "not permitted to allocate PIO buffers\n");1178 else if (rc)1179 netif_err(efx, probe, efx->net_dev,1180 "failed to allocate PIO buffers (%d)\n", rc);1181 else1182 netif_dbg(efx, probe, efx->net_dev,1183 "allocated %u PIO buffers\n", n_piobufs);1184 }1185#else1186 nic_data->n_piobufs = 0;1187#endif1188 1189 /* PIO buffers should be mapped with write-combining enabled,1190 * and we want to make single UC and WC mappings rather than1191 * several of each (in fact that's the only option if host1192 * page size is >4K). So we may allocate some extra VIs just1193 * for writing PIO buffers through.1194 *1195 * The UC mapping contains (channel_vis - 1) complete VIs and the1196 * first 4K of the next VI. Then the WC mapping begins with1197 * the remainder of this last VI.1198 */1199 uc_mem_map_size = PAGE_ALIGN((channel_vis - 1) * efx->vi_stride +1200 ER_DZ_TX_PIOBUF);1201 if (nic_data->n_piobufs) {1202 /* pio_write_vi_base rounds down to give the number of complete1203 * VIs inside the UC mapping.1204 */1205 pio_write_vi_base = uc_mem_map_size / efx->vi_stride;1206 wc_mem_map_size = (PAGE_ALIGN((pio_write_vi_base +1207 nic_data->n_piobufs) *1208 efx->vi_stride) -1209 uc_mem_map_size);1210 max_vis = pio_write_vi_base + nic_data->n_piobufs;1211 } else {1212 pio_write_vi_base = 0;1213 wc_mem_map_size = 0;1214 max_vis = channel_vis;1215 }1216 1217 /* In case the last attached driver failed to free VIs, do it now */1218 rc = efx_mcdi_free_vis(efx);1219 if (rc != 0)1220 return rc;1221 1222 rc = efx_ef10_alloc_vis(efx, min_vis, max_vis);1223 if (rc != 0)1224 return rc;1225 1226 if (nic_data->n_allocated_vis < channel_vis) {1227 netif_info(efx, drv, efx->net_dev,1228 "Could not allocate enough VIs to satisfy RSS"1229 " requirements. Performance may not be optimal.\n");1230 /* We didn't get the VIs to populate our channels.1231 * We could keep what we got but then we'd have more1232 * interrupts than we need.1233 * Instead calculate new max_channels and restart1234 */1235 efx->max_channels = nic_data->n_allocated_vis;1236 efx->max_tx_channels =1237 nic_data->n_allocated_vis / efx->tx_queues_per_channel;1238 1239 efx_mcdi_free_vis(efx);1240 return -EAGAIN;1241 }1242 1243 /* If we didn't get enough VIs to map all the PIO buffers, free the1244 * PIO buffers1245 */1246 if (nic_data->n_piobufs &&1247 nic_data->n_allocated_vis <1248 pio_write_vi_base + nic_data->n_piobufs) {1249 netif_dbg(efx, probe, efx->net_dev,1250 "%u VIs are not sufficient to map %u PIO buffers\n",1251 nic_data->n_allocated_vis, nic_data->n_piobufs);1252 efx_ef10_free_piobufs(efx);1253 }1254 1255 /* Shrink the original UC mapping of the memory BAR */1256 membase = ioremap(efx->membase_phys, uc_mem_map_size);1257 if (!membase) {1258 netif_err(efx, probe, efx->net_dev,1259 "could not shrink memory BAR to %x\n",1260 uc_mem_map_size);1261 return -ENOMEM;1262 }1263 iounmap(efx->membase);1264 efx->membase = membase;1265 1266 /* Set up the WC mapping if needed */1267 if (wc_mem_map_size) {1268 nic_data->wc_membase = ioremap_wc(efx->membase_phys +1269 uc_mem_map_size,1270 wc_mem_map_size);1271 if (!nic_data->wc_membase) {1272 netif_err(efx, probe, efx->net_dev,1273 "could not allocate WC mapping of size %x\n",1274 wc_mem_map_size);1275 return -ENOMEM;1276 }1277 nic_data->pio_write_vi_base = pio_write_vi_base;1278 nic_data->pio_write_base =1279 nic_data->wc_membase +1280 (pio_write_vi_base * efx->vi_stride + ER_DZ_TX_PIOBUF -1281 uc_mem_map_size);1282 1283 rc = efx_ef10_link_piobufs(efx);1284 if (rc)1285 efx_ef10_free_piobufs(efx);1286 }1287 1288 netif_dbg(efx, probe, efx->net_dev,1289 "memory BAR at %pa (virtual %p+%x UC, %p+%x WC)\n",1290 &efx->membase_phys, efx->membase, uc_mem_map_size,1291 nic_data->wc_membase, wc_mem_map_size);1292 1293 return 0;1294}1295 1296static void efx_ef10_fini_nic(struct efx_nic *efx)1297{1298 struct efx_ef10_nic_data *nic_data = efx->nic_data;1299 1300 spin_lock_bh(&efx->stats_lock);1301 kfree(nic_data->mc_stats);1302 nic_data->mc_stats = NULL;1303 spin_unlock_bh(&efx->stats_lock);1304}1305 1306static int efx_ef10_init_nic(struct efx_nic *efx)1307{1308 struct efx_ef10_nic_data *nic_data = efx->nic_data;1309 struct net_device *net_dev = efx->net_dev;1310 netdev_features_t tun_feats, tso_feats;1311 int rc;1312 1313 if (nic_data->must_check_datapath_caps) {1314 rc = efx_ef10_init_datapath_caps(efx);1315 if (rc)1316 return rc;1317 nic_data->must_check_datapath_caps = false;1318 }1319 1320 if (efx->must_realloc_vis) {1321 /* We cannot let the number of VIs change now */1322 rc = efx_ef10_alloc_vis(efx, nic_data->n_allocated_vis,1323 nic_data->n_allocated_vis);1324 if (rc)1325 return rc;1326 efx->must_realloc_vis = false;1327 }1328 1329 nic_data->mc_stats = kmalloc(efx->num_mac_stats * sizeof(__le64),1330 GFP_KERNEL);1331 if (!nic_data->mc_stats)1332 return -ENOMEM;1333 1334 if (nic_data->must_restore_piobufs && nic_data->n_piobufs) {1335 rc = efx_ef10_alloc_piobufs(efx, nic_data->n_piobufs);1336 if (rc == 0) {1337 rc = efx_ef10_link_piobufs(efx);1338 if (rc)1339 efx_ef10_free_piobufs(efx);1340 }1341 1342 /* Log an error on failure, but this is non-fatal.1343 * Permission errors are less important - we've presumably1344 * had the PIO buffer licence removed.1345 */1346 if (rc == -EPERM)1347 netif_dbg(efx, drv, efx->net_dev,1348 "not permitted to restore PIO buffers\n");1349 else if (rc)1350 netif_err(efx, drv, efx->net_dev,1351 "failed to restore PIO buffers (%d)\n", rc);1352 nic_data->must_restore_piobufs = false;1353 }1354 1355 /* encap features might change during reset if fw variant changed */1356 if (efx_has_cap(efx, VXLAN_NVGRE) && !efx_ef10_is_vf(efx))1357 net_dev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;1358 else1359 net_dev->hw_enc_features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);1360 1361 tun_feats = NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE |1362 NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_GSO_GRE_CSUM;1363 tso_feats = NETIF_F_TSO | NETIF_F_TSO6;1364 1365 if (efx_has_cap(efx, TX_TSO_V2_ENCAP)) {1366 /* If this is first nic_init, or if it is a reset and a new fw1367 * variant has added new features, enable them by default.1368 * If the features are not new, maintain their current value.1369 */1370 if (!(net_dev->hw_features & tun_feats))1371 net_dev->features |= tun_feats;1372 net_dev->hw_enc_features |= tun_feats | tso_feats;1373 net_dev->hw_features |= tun_feats;1374 } else {1375 net_dev->hw_enc_features &= ~(tun_feats | tso_feats);1376 net_dev->hw_features &= ~tun_feats;1377 net_dev->features &= ~tun_feats;1378 }1379 1380 /* don't fail init if RSS setup doesn't work */1381 rc = efx->type->rx_push_rss_config(efx, false,1382 efx->rss_context.rx_indir_table, NULL);1383 1384 return 0;1385}1386 1387static void efx_ef10_table_reset_mc_allocations(struct efx_nic *efx)1388{1389 struct efx_ef10_nic_data *nic_data = efx->nic_data;1390#ifdef CONFIG_SFC_SRIOV1391 unsigned int i;1392#endif1393 1394 /* All our allocations have been reset */1395 efx->must_realloc_vis = true;1396 efx_mcdi_filter_table_reset_mc_allocations(efx);1397 nic_data->must_restore_piobufs = true;1398 efx_ef10_forget_old_piobufs(efx);1399 efx->rss_context.priv.context_id = EFX_MCDI_RSS_CONTEXT_INVALID;1400 1401 /* Driver-created vswitches and vports must be re-created */1402 nic_data->must_probe_vswitching = true;1403 efx->vport_id = EVB_PORT_ID_ASSIGNED;1404#ifdef CONFIG_SFC_SRIOV1405 if (nic_data->vf)1406 for (i = 0; i < efx->vf_count; i++)1407 nic_data->vf[i].vport_id = 0;1408#endif1409}1410 1411static enum reset_type efx_ef10_map_reset_reason(enum reset_type reason)1412{1413 if (reason == RESET_TYPE_MC_FAILURE)1414 return RESET_TYPE_DATAPATH;1415 1416 return efx_mcdi_map_reset_reason(reason);1417}1418 1419static int efx_ef10_map_reset_flags(u32 *flags)1420{1421 enum {1422 EF10_RESET_PORT = ((ETH_RESET_MAC | ETH_RESET_PHY) <<1423 ETH_RESET_SHARED_SHIFT),1424 EF10_RESET_MC = ((ETH_RESET_DMA | ETH_RESET_FILTER |1425 ETH_RESET_OFFLOAD | ETH_RESET_MAC |1426 ETH_RESET_PHY | ETH_RESET_MGMT) <<1427 ETH_RESET_SHARED_SHIFT)1428 };1429 1430 /* We assume for now that our PCI function is permitted to1431 * reset everything.1432 */1433 1434 if ((*flags & EF10_RESET_MC) == EF10_RESET_MC) {1435 *flags &= ~EF10_RESET_MC;1436 return RESET_TYPE_WORLD;1437 }1438 1439 if ((*flags & EF10_RESET_PORT) == EF10_RESET_PORT) {1440 *flags &= ~EF10_RESET_PORT;1441 return RESET_TYPE_ALL;1442 }1443 1444 /* no invisible reset implemented */1445 1446 return -EINVAL;1447}1448 1449static int efx_ef10_reset(struct efx_nic *efx, enum reset_type reset_type)1450{1451 int rc = efx_mcdi_reset(efx, reset_type);1452 1453 /* Unprivileged functions return -EPERM, but need to return success1454 * here so that the datapath is brought back up.1455 */1456 if (reset_type == RESET_TYPE_WORLD && rc == -EPERM)1457 rc = 0;1458 1459 /* If it was a port reset, trigger reallocation of MC resources.1460 * Note that on an MC reset nothing needs to be done now because we'll1461 * detect the MC reset later and handle it then.1462 * For an FLR, we never get an MC reset event, but the MC has reset all1463 * resources assigned to us, so we have to trigger reallocation now.1464 */1465 if ((reset_type == RESET_TYPE_ALL ||1466 reset_type == RESET_TYPE_MCDI_TIMEOUT) && !rc)1467 efx_ef10_table_reset_mc_allocations(efx);1468 return rc;1469}1470 1471#define EF10_DMA_STAT(ext_name, mcdi_name) \1472 [EF10_STAT_ ## ext_name] = \1473 { #ext_name, 64, 8 * MC_CMD_MAC_ ## mcdi_name }1474#define EF10_DMA_INVIS_STAT(int_name, mcdi_name) \1475 [EF10_STAT_ ## int_name] = \1476 { NULL, 64, 8 * MC_CMD_MAC_ ## mcdi_name }1477#define EF10_OTHER_STAT(ext_name) \1478 [EF10_STAT_ ## ext_name] = { #ext_name, 0, 0 }1479 1480static const struct efx_hw_stat_desc efx_ef10_stat_desc[EF10_STAT_COUNT] = {1481 EF10_DMA_STAT(port_tx_bytes, TX_BYTES),1482 EF10_DMA_STAT(port_tx_packets, TX_PKTS),1483 EF10_DMA_STAT(port_tx_pause, TX_PAUSE_PKTS),1484 EF10_DMA_STAT(port_tx_control, TX_CONTROL_PKTS),1485 EF10_DMA_STAT(port_tx_unicast, TX_UNICAST_PKTS),1486 EF10_DMA_STAT(port_tx_multicast, TX_MULTICAST_PKTS),1487 EF10_DMA_STAT(port_tx_broadcast, TX_BROADCAST_PKTS),1488 EF10_DMA_STAT(port_tx_lt64, TX_LT64_PKTS),1489 EF10_DMA_STAT(port_tx_64, TX_64_PKTS),1490 EF10_DMA_STAT(port_tx_65_to_127, TX_65_TO_127_PKTS),1491 EF10_DMA_STAT(port_tx_128_to_255, TX_128_TO_255_PKTS),1492 EF10_DMA_STAT(port_tx_256_to_511, TX_256_TO_511_PKTS),1493 EF10_DMA_STAT(port_tx_512_to_1023, TX_512_TO_1023_PKTS),1494 EF10_DMA_STAT(port_tx_1024_to_15xx, TX_1024_TO_15XX_PKTS),1495 EF10_DMA_STAT(port_tx_15xx_to_jumbo, TX_15XX_TO_JUMBO_PKTS),1496 EF10_DMA_STAT(port_rx_bytes, RX_BYTES),1497 EF10_DMA_INVIS_STAT(port_rx_bytes_minus_good_bytes, RX_BAD_BYTES),1498 EF10_OTHER_STAT(port_rx_good_bytes),1499 EF10_OTHER_STAT(port_rx_bad_bytes),1500 EF10_DMA_STAT(port_rx_packets, RX_PKTS),1501 EF10_DMA_STAT(port_rx_good, RX_GOOD_PKTS),1502 EF10_DMA_STAT(port_rx_bad, RX_BAD_FCS_PKTS),1503 EF10_DMA_STAT(port_rx_pause, RX_PAUSE_PKTS),1504 EF10_DMA_STAT(port_rx_control, RX_CONTROL_PKTS),1505 EF10_DMA_STAT(port_rx_unicast, RX_UNICAST_PKTS),1506 EF10_DMA_STAT(port_rx_multicast, RX_MULTICAST_PKTS),1507 EF10_DMA_STAT(port_rx_broadcast, RX_BROADCAST_PKTS),1508 EF10_DMA_STAT(port_rx_lt64, RX_UNDERSIZE_PKTS),1509 EF10_DMA_STAT(port_rx_64, RX_64_PKTS),1510 EF10_DMA_STAT(port_rx_65_to_127, RX_65_TO_127_PKTS),1511 EF10_DMA_STAT(port_rx_128_to_255, RX_128_TO_255_PKTS),1512 EF10_DMA_STAT(port_rx_256_to_511, RX_256_TO_511_PKTS),1513 EF10_DMA_STAT(port_rx_512_to_1023, RX_512_TO_1023_PKTS),1514 EF10_DMA_STAT(port_rx_1024_to_15xx, RX_1024_TO_15XX_PKTS),1515 EF10_DMA_STAT(port_rx_15xx_to_jumbo, RX_15XX_TO_JUMBO_PKTS),1516 EF10_DMA_STAT(port_rx_gtjumbo, RX_GTJUMBO_PKTS),1517 EF10_DMA_STAT(port_rx_bad_gtjumbo, RX_JABBER_PKTS),1518 EF10_DMA_STAT(port_rx_overflow, RX_OVERFLOW_PKTS),1519 EF10_DMA_STAT(port_rx_align_error, RX_ALIGN_ERROR_PKTS),1520 EF10_DMA_STAT(port_rx_length_error, RX_LENGTH_ERROR_PKTS),1521 EF10_DMA_STAT(port_rx_nodesc_drops, RX_NODESC_DROPS),1522 EFX_GENERIC_SW_STAT(rx_nodesc_trunc),1523 EFX_GENERIC_SW_STAT(rx_noskb_drops),1524 EF10_DMA_STAT(port_rx_pm_trunc_bb_overflow, PM_TRUNC_BB_OVERFLOW),1525 EF10_DMA_STAT(port_rx_pm_discard_bb_overflow, PM_DISCARD_BB_OVERFLOW),1526 EF10_DMA_STAT(port_rx_pm_trunc_vfifo_full, PM_TRUNC_VFIFO_FULL),1527 EF10_DMA_STAT(port_rx_pm_discard_vfifo_full, PM_DISCARD_VFIFO_FULL),1528 EF10_DMA_STAT(port_rx_pm_trunc_qbb, PM_TRUNC_QBB),1529 EF10_DMA_STAT(port_rx_pm_discard_qbb, PM_DISCARD_QBB),1530 EF10_DMA_STAT(port_rx_pm_discard_mapping, PM_DISCARD_MAPPING),1531 EF10_DMA_STAT(port_rx_dp_q_disabled_packets, RXDP_Q_DISABLED_PKTS),1532 EF10_DMA_STAT(port_rx_dp_di_dropped_packets, RXDP_DI_DROPPED_PKTS),1533 EF10_DMA_STAT(port_rx_dp_streaming_packets, RXDP_STREAMING_PKTS),1534 EF10_DMA_STAT(port_rx_dp_hlb_fetch, RXDP_HLB_FETCH_CONDITIONS),1535 EF10_DMA_STAT(port_rx_dp_hlb_wait, RXDP_HLB_WAIT_CONDITIONS),1536 EF10_DMA_STAT(rx_unicast, VADAPTER_RX_UNICAST_PACKETS),1537 EF10_DMA_STAT(rx_unicast_bytes, VADAPTER_RX_UNICAST_BYTES),1538 EF10_DMA_STAT(rx_multicast, VADAPTER_RX_MULTICAST_PACKETS),1539 EF10_DMA_STAT(rx_multicast_bytes, VADAPTER_RX_MULTICAST_BYTES),1540 EF10_DMA_STAT(rx_broadcast, VADAPTER_RX_BROADCAST_PACKETS),1541 EF10_DMA_STAT(rx_broadcast_bytes, VADAPTER_RX_BROADCAST_BYTES),1542 EF10_DMA_STAT(rx_bad, VADAPTER_RX_BAD_PACKETS),1543 EF10_DMA_STAT(rx_bad_bytes, VADAPTER_RX_BAD_BYTES),1544 EF10_DMA_STAT(rx_overflow, VADAPTER_RX_OVERFLOW),1545 EF10_DMA_STAT(tx_unicast, VADAPTER_TX_UNICAST_PACKETS),1546 EF10_DMA_STAT(tx_unicast_bytes, VADAPTER_TX_UNICAST_BYTES),1547 EF10_DMA_STAT(tx_multicast, VADAPTER_TX_MULTICAST_PACKETS),1548 EF10_DMA_STAT(tx_multicast_bytes, VADAPTER_TX_MULTICAST_BYTES),1549 EF10_DMA_STAT(tx_broadcast, VADAPTER_TX_BROADCAST_PACKETS),1550 EF10_DMA_STAT(tx_broadcast_bytes, VADAPTER_TX_BROADCAST_BYTES),1551 EF10_DMA_STAT(tx_bad, VADAPTER_TX_BAD_PACKETS),1552 EF10_DMA_STAT(tx_bad_bytes, VADAPTER_TX_BAD_BYTES),1553 EF10_DMA_STAT(tx_overflow, VADAPTER_TX_OVERFLOW),1554 EF10_DMA_STAT(fec_uncorrected_errors, FEC_UNCORRECTED_ERRORS),1555 EF10_DMA_STAT(fec_corrected_errors, FEC_CORRECTED_ERRORS),1556 EF10_DMA_STAT(fec_corrected_symbols_lane0, FEC_CORRECTED_SYMBOLS_LANE0),1557 EF10_DMA_STAT(fec_corrected_symbols_lane1, FEC_CORRECTED_SYMBOLS_LANE1),1558 EF10_DMA_STAT(fec_corrected_symbols_lane2, FEC_CORRECTED_SYMBOLS_LANE2),1559 EF10_DMA_STAT(fec_corrected_symbols_lane3, FEC_CORRECTED_SYMBOLS_LANE3),1560 EF10_DMA_STAT(ctpio_vi_busy_fallback, CTPIO_VI_BUSY_FALLBACK),1561 EF10_DMA_STAT(ctpio_long_write_success, CTPIO_LONG_WRITE_SUCCESS),1562 EF10_DMA_STAT(ctpio_missing_dbell_fail, CTPIO_MISSING_DBELL_FAIL),1563 EF10_DMA_STAT(ctpio_overflow_fail, CTPIO_OVERFLOW_FAIL),1564 EF10_DMA_STAT(ctpio_underflow_fail, CTPIO_UNDERFLOW_FAIL),1565 EF10_DMA_STAT(ctpio_timeout_fail, CTPIO_TIMEOUT_FAIL),1566 EF10_DMA_STAT(ctpio_noncontig_wr_fail, CTPIO_NONCONTIG_WR_FAIL),1567 EF10_DMA_STAT(ctpio_frm_clobber_fail, CTPIO_FRM_CLOBBER_FAIL),1568 EF10_DMA_STAT(ctpio_invalid_wr_fail, CTPIO_INVALID_WR_FAIL),1569 EF10_DMA_STAT(ctpio_vi_clobber_fallback, CTPIO_VI_CLOBBER_FALLBACK),1570 EF10_DMA_STAT(ctpio_unqualified_fallback, CTPIO_UNQUALIFIED_FALLBACK),1571 EF10_DMA_STAT(ctpio_runt_fallback, CTPIO_RUNT_FALLBACK),1572 EF10_DMA_STAT(ctpio_success, CTPIO_SUCCESS),1573 EF10_DMA_STAT(ctpio_fallback, CTPIO_FALLBACK),1574 EF10_DMA_STAT(ctpio_poison, CTPIO_POISON),1575 EF10_DMA_STAT(ctpio_erase, CTPIO_ERASE),1576};1577 1578#define HUNT_COMMON_STAT_MASK ((1ULL << EF10_STAT_port_tx_bytes) | \1579 (1ULL << EF10_STAT_port_tx_packets) | \1580 (1ULL << EF10_STAT_port_tx_pause) | \1581 (1ULL << EF10_STAT_port_tx_unicast) | \1582 (1ULL << EF10_STAT_port_tx_multicast) | \1583 (1ULL << EF10_STAT_port_tx_broadcast) | \1584 (1ULL << EF10_STAT_port_rx_bytes) | \1585 (1ULL << \1586 EF10_STAT_port_rx_bytes_minus_good_bytes) | \1587 (1ULL << EF10_STAT_port_rx_good_bytes) | \1588 (1ULL << EF10_STAT_port_rx_bad_bytes) | \1589 (1ULL << EF10_STAT_port_rx_packets) | \1590 (1ULL << EF10_STAT_port_rx_good) | \1591 (1ULL << EF10_STAT_port_rx_bad) | \1592 (1ULL << EF10_STAT_port_rx_pause) | \1593 (1ULL << EF10_STAT_port_rx_control) | \1594 (1ULL << EF10_STAT_port_rx_unicast) | \1595 (1ULL << EF10_STAT_port_rx_multicast) | \1596 (1ULL << EF10_STAT_port_rx_broadcast) | \1597 (1ULL << EF10_STAT_port_rx_lt64) | \1598 (1ULL << EF10_STAT_port_rx_64) | \1599 (1ULL << EF10_STAT_port_rx_65_to_127) | \1600 (1ULL << EF10_STAT_port_rx_128_to_255) | \1601 (1ULL << EF10_STAT_port_rx_256_to_511) | \1602 (1ULL << EF10_STAT_port_rx_512_to_1023) |\1603 (1ULL << EF10_STAT_port_rx_1024_to_15xx) |\1604 (1ULL << EF10_STAT_port_rx_15xx_to_jumbo) |\1605 (1ULL << EF10_STAT_port_rx_gtjumbo) | \1606 (1ULL << EF10_STAT_port_rx_bad_gtjumbo) |\1607 (1ULL << EF10_STAT_port_rx_overflow) | \1608 (1ULL << EF10_STAT_port_rx_nodesc_drops) |\1609 (1ULL << GENERIC_STAT_rx_nodesc_trunc) | \1610 (1ULL << GENERIC_STAT_rx_noskb_drops))1611 1612/* On 7000 series NICs, these statistics are only provided by the 10G MAC.1613 * For a 10G/40G switchable port we do not expose these because they might1614 * not include all the packets they should.1615 * On 8000 series NICs these statistics are always provided.1616 */1617#define HUNT_10G_ONLY_STAT_MASK ((1ULL << EF10_STAT_port_tx_control) | \1618 (1ULL << EF10_STAT_port_tx_lt64) | \1619 (1ULL << EF10_STAT_port_tx_64) | \1620 (1ULL << EF10_STAT_port_tx_65_to_127) |\1621 (1ULL << EF10_STAT_port_tx_128_to_255) |\1622 (1ULL << EF10_STAT_port_tx_256_to_511) |\1623 (1ULL << EF10_STAT_port_tx_512_to_1023) |\1624 (1ULL << EF10_STAT_port_tx_1024_to_15xx) |\1625 (1ULL << EF10_STAT_port_tx_15xx_to_jumbo))1626 1627/* These statistics are only provided by the 40G MAC. For a 10G/40G1628 * switchable port we do expose these because the errors will otherwise1629 * be silent.1630 */1631#define HUNT_40G_EXTRA_STAT_MASK ((1ULL << EF10_STAT_port_rx_align_error) |\1632 (1ULL << EF10_STAT_port_rx_length_error))1633 1634/* These statistics are only provided if the firmware supports the1635 * capability PM_AND_RXDP_COUNTERS.1636 */1637#define HUNT_PM_AND_RXDP_STAT_MASK ( \1638 (1ULL << EF10_STAT_port_rx_pm_trunc_bb_overflow) | \1639 (1ULL << EF10_STAT_port_rx_pm_discard_bb_overflow) | \1640 (1ULL << EF10_STAT_port_rx_pm_trunc_vfifo_full) | \1641 (1ULL << EF10_STAT_port_rx_pm_discard_vfifo_full) | \1642 (1ULL << EF10_STAT_port_rx_pm_trunc_qbb) | \1643 (1ULL << EF10_STAT_port_rx_pm_discard_qbb) | \1644 (1ULL << EF10_STAT_port_rx_pm_discard_mapping) | \1645 (1ULL << EF10_STAT_port_rx_dp_q_disabled_packets) | \1646 (1ULL << EF10_STAT_port_rx_dp_di_dropped_packets) | \1647 (1ULL << EF10_STAT_port_rx_dp_streaming_packets) | \1648 (1ULL << EF10_STAT_port_rx_dp_hlb_fetch) | \1649 (1ULL << EF10_STAT_port_rx_dp_hlb_wait))1650 1651/* These statistics are only provided if the NIC supports MC_CMD_MAC_STATS_V2,1652 * indicated by returning a value >= MC_CMD_MAC_NSTATS_V2 in1653 * MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_NUM_STATS.1654 * These bits are in the second u64 of the raw mask.1655 */1656#define EF10_FEC_STAT_MASK ( \1657 (1ULL << (EF10_STAT_fec_uncorrected_errors - 64)) | \1658 (1ULL << (EF10_STAT_fec_corrected_errors - 64)) | \1659 (1ULL << (EF10_STAT_fec_corrected_symbols_lane0 - 64)) | \1660 (1ULL << (EF10_STAT_fec_corrected_symbols_lane1 - 64)) | \1661 (1ULL << (EF10_STAT_fec_corrected_symbols_lane2 - 64)) | \1662 (1ULL << (EF10_STAT_fec_corrected_symbols_lane3 - 64)))1663 1664/* These statistics are only provided if the NIC supports MC_CMD_MAC_STATS_V3,1665 * indicated by returning a value >= MC_CMD_MAC_NSTATS_V3 in1666 * MC_CMD_GET_CAPABILITIES_V4_OUT_MAC_STATS_NUM_STATS.1667 * These bits are in the second u64 of the raw mask.1668 */1669#define EF10_CTPIO_STAT_MASK ( \1670 (1ULL << (EF10_STAT_ctpio_vi_busy_fallback - 64)) | \1671 (1ULL << (EF10_STAT_ctpio_long_write_success - 64)) | \1672 (1ULL << (EF10_STAT_ctpio_missing_dbell_fail - 64)) | \1673 (1ULL << (EF10_STAT_ctpio_overflow_fail - 64)) | \1674 (1ULL << (EF10_STAT_ctpio_underflow_fail - 64)) | \1675 (1ULL << (EF10_STAT_ctpio_timeout_fail - 64)) | \1676 (1ULL << (EF10_STAT_ctpio_noncontig_wr_fail - 64)) | \1677 (1ULL << (EF10_STAT_ctpio_frm_clobber_fail - 64)) | \1678 (1ULL << (EF10_STAT_ctpio_invalid_wr_fail - 64)) | \1679 (1ULL << (EF10_STAT_ctpio_vi_clobber_fallback - 64)) | \1680 (1ULL << (EF10_STAT_ctpio_unqualified_fallback - 64)) | \1681 (1ULL << (EF10_STAT_ctpio_runt_fallback - 64)) | \1682 (1ULL << (EF10_STAT_ctpio_success - 64)) | \1683 (1ULL << (EF10_STAT_ctpio_fallback - 64)) | \1684 (1ULL << (EF10_STAT_ctpio_poison - 64)) | \1685 (1ULL << (EF10_STAT_ctpio_erase - 64)))1686 1687static u64 efx_ef10_raw_stat_mask(struct efx_nic *efx)1688{1689 u64 raw_mask = HUNT_COMMON_STAT_MASK;1690 u32 port_caps = efx_mcdi_phy_get_caps(efx);1691 struct efx_ef10_nic_data *nic_data = efx->nic_data;1692 1693 if (!(efx->mcdi->fn_flags &1694 1 << MC_CMD_DRV_ATTACH_EXT_OUT_FLAG_LINKCTRL))1695 return 0;1696 1697 if (port_caps & (1 << MC_CMD_PHY_CAP_40000FDX_LBN)) {1698 raw_mask |= HUNT_40G_EXTRA_STAT_MASK;1699 /* 8000 series have everything even at 40G */1700 if (nic_data->datapath_caps2 &1701 (1 << MC_CMD_GET_CAPABILITIES_V2_OUT_MAC_STATS_40G_TX_SIZE_BINS_LBN))1702 raw_mask |= HUNT_10G_ONLY_STAT_MASK;1703 } else {1704 raw_mask |= HUNT_10G_ONLY_STAT_MASK;1705 }1706 1707 if (nic_data->datapath_caps &1708 (1 << MC_CMD_GET_CAPABILITIES_OUT_PM_AND_RXDP_COUNTERS_LBN))1709 raw_mask |= HUNT_PM_AND_RXDP_STAT_MASK;1710 1711 return raw_mask;1712}1713 1714static void efx_ef10_get_stat_mask(struct efx_nic *efx, unsigned long *mask)1715{1716 struct efx_ef10_nic_data *nic_data = efx->nic_data;1717 u64 raw_mask[2];1718 1719 raw_mask[0] = efx_ef10_raw_stat_mask(efx);1720 1721 /* Only show vadaptor stats when EVB capability is present */1722 if (nic_data->datapath_caps &1723 (1 << MC_CMD_GET_CAPABILITIES_OUT_EVB_LBN)) {1724 raw_mask[0] |= ~((1ULL << EF10_STAT_rx_unicast) - 1);1725 raw_mask[1] = (1ULL << (EF10_STAT_V1_COUNT - 64)) - 1;1726 } else {1727 raw_mask[1] = 0;1728 }1729 /* Only show FEC stats when NIC supports MC_CMD_MAC_STATS_V2 */1730 if (efx->num_mac_stats >= MC_CMD_MAC_NSTATS_V2)1731 raw_mask[1] |= EF10_FEC_STAT_MASK;1732 1733 /* CTPIO stats appear in V3. Only show them on devices that actually1734 * support CTPIO. Although this driver doesn't use CTPIO others might,1735 * and we may be reporting the stats for the underlying port.1736 */1737 if (efx->num_mac_stats >= MC_CMD_MAC_NSTATS_V3 &&1738 (nic_data->datapath_caps2 &1739 (1 << MC_CMD_GET_CAPABILITIES_V4_OUT_CTPIO_LBN)))1740 raw_mask[1] |= EF10_CTPIO_STAT_MASK;1741 1742#if BITS_PER_LONG == 641743 BUILD_BUG_ON(BITS_TO_LONGS(EF10_STAT_COUNT) != 2);1744 mask[0] = raw_mask[0];1745 mask[1] = raw_mask[1];1746#else1747 BUILD_BUG_ON(BITS_TO_LONGS(EF10_STAT_COUNT) != 3);1748 mask[0] = raw_mask[0] & 0xffffffff;1749 mask[1] = raw_mask[0] >> 32;1750 mask[2] = raw_mask[1] & 0xffffffff;1751#endif1752}1753 1754static size_t efx_ef10_describe_stats(struct efx_nic *efx, u8 *names)1755{1756 DECLARE_BITMAP(mask, EF10_STAT_COUNT);1757 1758 efx_ef10_get_stat_mask(efx, mask);1759 return efx_nic_describe_stats(efx_ef10_stat_desc, EF10_STAT_COUNT,1760 mask, names);1761}1762 1763static void efx_ef10_get_fec_stats(struct efx_nic *efx,1764 struct ethtool_fec_stats *fec_stats)1765{1766 DECLARE_BITMAP(mask, EF10_STAT_COUNT);1767 struct efx_ef10_nic_data *nic_data = efx->nic_data;1768 u64 *stats = nic_data->stats;1769 1770 efx_ef10_get_stat_mask(efx, mask);1771 if (test_bit(EF10_STAT_fec_corrected_errors, mask))1772 fec_stats->corrected_blocks.total =1773 stats[EF10_STAT_fec_corrected_errors];1774 if (test_bit(EF10_STAT_fec_uncorrected_errors, mask))1775 fec_stats->uncorrectable_blocks.total =1776 stats[EF10_STAT_fec_uncorrected_errors];1777}1778 1779static size_t efx_ef10_update_stats_common(struct efx_nic *efx, u64 *full_stats,1780 struct rtnl_link_stats64 *core_stats)1781{1782 DECLARE_BITMAP(mask, EF10_STAT_COUNT);1783 struct efx_ef10_nic_data *nic_data = efx->nic_data;1784 u64 *stats = nic_data->stats;1785 size_t stats_count = 0, index;1786 1787 efx_ef10_get_stat_mask(efx, mask);1788 1789 if (full_stats) {1790 for_each_set_bit(index, mask, EF10_STAT_COUNT) {1791 if (efx_ef10_stat_desc[index].name) {1792 *full_stats++ = stats[index];1793 ++stats_count;1794 }1795 }1796 }1797 1798 if (!core_stats)1799 return stats_count;1800 1801 if (nic_data->datapath_caps &1802 1 << MC_CMD_GET_CAPABILITIES_OUT_EVB_LBN) {1803 /* Use vadaptor stats. */1804 core_stats->rx_packets = stats[EF10_STAT_rx_unicast] +1805 stats[EF10_STAT_rx_multicast] +1806 stats[EF10_STAT_rx_broadcast];1807 core_stats->tx_packets = stats[EF10_STAT_tx_unicast] +1808 stats[EF10_STAT_tx_multicast] +1809 stats[EF10_STAT_tx_broadcast];1810 core_stats->rx_bytes = stats[EF10_STAT_rx_unicast_bytes] +1811 stats[EF10_STAT_rx_multicast_bytes] +1812 stats[EF10_STAT_rx_broadcast_bytes];1813 core_stats->tx_bytes = stats[EF10_STAT_tx_unicast_bytes] +1814 stats[EF10_STAT_tx_multicast_bytes] +1815 stats[EF10_STAT_tx_broadcast_bytes];1816 core_stats->rx_dropped = stats[GENERIC_STAT_rx_nodesc_trunc] +1817 stats[GENERIC_STAT_rx_noskb_drops];1818 core_stats->multicast = stats[EF10_STAT_rx_multicast];1819 core_stats->rx_crc_errors = stats[EF10_STAT_rx_bad];1820 core_stats->rx_fifo_errors = stats[EF10_STAT_rx_overflow];1821 core_stats->rx_errors = core_stats->rx_crc_errors;1822 core_stats->tx_errors = stats[EF10_STAT_tx_bad];1823 } else {1824 /* Use port stats. */1825 core_stats->rx_packets = stats[EF10_STAT_port_rx_packets];1826 core_stats->tx_packets = stats[EF10_STAT_port_tx_packets];1827 core_stats->rx_bytes = stats[EF10_STAT_port_rx_bytes];1828 core_stats->tx_bytes = stats[EF10_STAT_port_tx_bytes];1829 core_stats->rx_dropped = stats[EF10_STAT_port_rx_nodesc_drops] +1830 stats[GENERIC_STAT_rx_nodesc_trunc] +1831 stats[GENERIC_STAT_rx_noskb_drops];1832 core_stats->multicast = stats[EF10_STAT_port_rx_multicast];1833 core_stats->rx_length_errors =1834 stats[EF10_STAT_port_rx_gtjumbo] +1835 stats[EF10_STAT_port_rx_length_error];1836 core_stats->rx_crc_errors = stats[EF10_STAT_port_rx_bad];1837 core_stats->rx_frame_errors =1838 stats[EF10_STAT_port_rx_align_error];1839 core_stats->rx_fifo_errors = stats[EF10_STAT_port_rx_overflow];1840 core_stats->rx_errors = (core_stats->rx_length_errors +1841 core_stats->rx_crc_errors +1842 core_stats->rx_frame_errors);1843 }1844 1845 return stats_count;1846}1847 1848static size_t efx_ef10_update_stats_pf(struct efx_nic *efx, u64 *full_stats,1849 struct rtnl_link_stats64 *core_stats)1850{1851 struct efx_ef10_nic_data *nic_data = efx->nic_data;1852 DECLARE_BITMAP(mask, EF10_STAT_COUNT);1853 u64 *stats = nic_data->stats;1854 1855 efx_ef10_get_stat_mask(efx, mask);1856 1857 /* If NIC was fini'd (probably resetting), then we can't read1858 * updated stats right now.1859 */1860 if (nic_data->mc_stats) {1861 efx_nic_copy_stats(efx, nic_data->mc_stats);1862 efx_nic_update_stats(efx_ef10_stat_desc, EF10_STAT_COUNT,1863 mask, stats, nic_data->mc_stats, false);1864 }1865 1866 /* Update derived statistics */1867 efx_nic_fix_nodesc_drop_stat(efx,1868 &stats[EF10_STAT_port_rx_nodesc_drops]);1869 /* MC Firmware reads RX_BYTES and RX_GOOD_BYTES from the MAC.1870 * It then calculates RX_BAD_BYTES and DMAs it to us with RX_BYTES.1871 * We report these as port_rx_ stats. We are not given RX_GOOD_BYTES.1872 * Here we calculate port_rx_good_bytes.1873 */1874 stats[EF10_STAT_port_rx_good_bytes] =1875 stats[EF10_STAT_port_rx_bytes] -1876 stats[EF10_STAT_port_rx_bytes_minus_good_bytes];1877 1878 /* The asynchronous reads used to calculate RX_BAD_BYTES in1879 * MC Firmware are done such that we should not see an increase in1880 * RX_BAD_BYTES when a good packet has arrived. Unfortunately this1881 * does mean that the stat can decrease at times. Here we do not1882 * update the stat unless it has increased or has gone to zero1883 * (In the case of the NIC rebooting).1884 * Please see Bug 33781 for a discussion of why things work this way.1885 */1886 efx_update_diff_stat(&stats[EF10_STAT_port_rx_bad_bytes],1887 stats[EF10_STAT_port_rx_bytes_minus_good_bytes]);1888 efx_update_sw_stats(efx, stats);1889 1890 return efx_ef10_update_stats_common(efx, full_stats, core_stats);1891}1892 1893static int efx_ef10_try_update_nic_stats_vf(struct efx_nic *efx)1894 __must_hold(&efx->stats_lock)1895{1896 MCDI_DECLARE_BUF(inbuf, MC_CMD_MAC_STATS_IN_LEN);1897 struct efx_ef10_nic_data *nic_data = efx->nic_data;1898 DECLARE_BITMAP(mask, EF10_STAT_COUNT);1899 __le64 generation_start, generation_end;1900 u64 *stats = nic_data->stats;1901 u32 dma_len = efx->num_mac_stats * sizeof(u64);1902 struct efx_buffer stats_buf;1903 __le64 *dma_stats;1904 int rc;1905 1906 spin_unlock_bh(&efx->stats_lock);1907 1908 efx_ef10_get_stat_mask(efx, mask);1909 1910 rc = efx_nic_alloc_buffer(efx, &stats_buf, dma_len, GFP_KERNEL);1911 if (rc) {1912 spin_lock_bh(&efx->stats_lock);1913 return rc;1914 }1915 1916 dma_stats = stats_buf.addr;1917 dma_stats[efx->num_mac_stats - 1] = EFX_MC_STATS_GENERATION_INVALID;1918 1919 MCDI_SET_QWORD(inbuf, MAC_STATS_IN_DMA_ADDR, stats_buf.dma_addr);1920 MCDI_POPULATE_DWORD_1(inbuf, MAC_STATS_IN_CMD,1921 MAC_STATS_IN_DMA, 1);1922 MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len);1923 MCDI_SET_DWORD(inbuf, MAC_STATS_IN_PORT_ID, EVB_PORT_ID_ASSIGNED);1924 1925 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf),1926 NULL, 0, NULL);1927 spin_lock_bh(&efx->stats_lock);1928 if (rc) {1929 /* Expect ENOENT if DMA queues have not been set up */1930 if (rc != -ENOENT || atomic_read(&efx->active_queues))1931 efx_mcdi_display_error(efx, MC_CMD_MAC_STATS,1932 sizeof(inbuf), NULL, 0, rc);1933 goto out;1934 }1935 1936 generation_end = dma_stats[efx->num_mac_stats - 1];1937 if (generation_end == EFX_MC_STATS_GENERATION_INVALID) {1938 WARN_ON_ONCE(1);1939 goto out;1940 }1941 rmb();1942 efx_nic_update_stats(efx_ef10_stat_desc, EF10_STAT_COUNT, mask,1943 stats, stats_buf.addr, false);1944 rmb();1945 generation_start = dma_stats[MC_CMD_MAC_GENERATION_START];1946 if (generation_end != generation_start) {1947 rc = -EAGAIN;1948 goto out;1949 }1950 1951 efx_update_sw_stats(efx, stats);1952out:1953 /* releasing a DMA coherent buffer with BH disabled can panic */1954 spin_unlock_bh(&efx->stats_lock);1955 efx_nic_free_buffer(efx, &stats_buf);1956 spin_lock_bh(&efx->stats_lock);1957 return rc;1958}1959 1960static size_t efx_ef10_update_stats_vf(struct efx_nic *efx, u64 *full_stats,1961 struct rtnl_link_stats64 *core_stats)1962{1963 if (efx_ef10_try_update_nic_stats_vf(efx))1964 return 0;1965 1966 return efx_ef10_update_stats_common(efx, full_stats, core_stats);1967}1968 1969static size_t efx_ef10_update_stats_atomic_vf(struct efx_nic *efx, u64 *full_stats,1970 struct rtnl_link_stats64 *core_stats)1971{1972 struct efx_ef10_nic_data *nic_data = efx->nic_data;1973 1974 /* In atomic context, cannot update HW stats. Just update the1975 * software stats and return so the caller can continue.1976 */1977 efx_update_sw_stats(efx, nic_data->stats);1978 return efx_ef10_update_stats_common(efx, full_stats, core_stats);1979}1980 1981static void efx_ef10_push_irq_moderation(struct efx_channel *channel)1982{1983 struct efx_nic *efx = channel->efx;1984 unsigned int mode, usecs;1985 efx_dword_t timer_cmd;1986 1987 if (channel->irq_moderation_us) {1988 mode = 3;1989 usecs = channel->irq_moderation_us;1990 } else {1991 mode = 0;1992 usecs = 0;1993 }1994 1995 if (EFX_EF10_WORKAROUND_61265(efx)) {1996 MCDI_DECLARE_BUF(inbuf, MC_CMD_SET_EVQ_TMR_IN_LEN);1997 unsigned int ns = usecs * 1000;1998 1999 MCDI_SET_DWORD(inbuf, SET_EVQ_TMR_IN_INSTANCE,2000 channel->channel);2001 MCDI_SET_DWORD(inbuf, SET_EVQ_TMR_IN_TMR_LOAD_REQ_NS, ns);2002 MCDI_SET_DWORD(inbuf, SET_EVQ_TMR_IN_TMR_RELOAD_REQ_NS, ns);2003 MCDI_SET_DWORD(inbuf, SET_EVQ_TMR_IN_TMR_MODE, mode);2004 2005 efx_mcdi_rpc_async(efx, MC_CMD_SET_EVQ_TMR,2006 inbuf, sizeof(inbuf), 0, NULL, 0);2007 } else if (EFX_EF10_WORKAROUND_35388(efx)) {2008 unsigned int ticks = efx_usecs_to_ticks(efx, usecs);2009 2010 EFX_POPULATE_DWORD_3(timer_cmd, ERF_DD_EVQ_IND_TIMER_FLAGS,2011 EFE_DD_EVQ_IND_TIMER_FLAGS,2012 ERF_DD_EVQ_IND_TIMER_MODE, mode,2013 ERF_DD_EVQ_IND_TIMER_VAL, ticks);2014 efx_writed_page(efx, &timer_cmd, ER_DD_EVQ_INDIRECT,2015 channel->channel);2016 } else {2017 unsigned int ticks = efx_usecs_to_ticks(efx, usecs);2018 2019 EFX_POPULATE_DWORD_3(timer_cmd, ERF_DZ_TC_TIMER_MODE, mode,2020 ERF_DZ_TC_TIMER_VAL, ticks,2021 ERF_FZ_TC_TMR_REL_VAL, ticks);2022 efx_writed_page(efx, &timer_cmd, ER_DZ_EVQ_TMR,2023 channel->channel);2024 }2025}2026 2027static void efx_ef10_get_wol_vf(struct efx_nic *efx,2028 struct ethtool_wolinfo *wol) {}2029 2030static int efx_ef10_set_wol_vf(struct efx_nic *efx, u32 type)2031{2032 return -EOPNOTSUPP;2033}2034 2035static void efx_ef10_get_wol(struct efx_nic *efx, struct ethtool_wolinfo *wol)2036{2037 wol->supported = 0;2038 wol->wolopts = 0;2039 memset(&wol->sopass, 0, sizeof(wol->sopass));2040}2041 2042static int efx_ef10_set_wol(struct efx_nic *efx, u32 type)2043{2044 if (type != 0)2045 return -EINVAL;2046 return 0;2047}2048 2049static void efx_ef10_mcdi_request(struct efx_nic *efx,2050 const efx_dword_t *hdr, size_t hdr_len,2051 const efx_dword_t *sdu, size_t sdu_len)2052{2053 struct efx_ef10_nic_data *nic_data = efx->nic_data;2054 u8 *pdu = nic_data->mcdi_buf.addr;2055 2056 memcpy(pdu, hdr, hdr_len);2057 memcpy(pdu + hdr_len, sdu, sdu_len);2058 wmb();2059 2060 /* The hardware provides 'low' and 'high' (doorbell) registers2061 * for passing the 64-bit address of an MCDI request to2062 * firmware. However the dwords are swapped by firmware. The2063 * least significant bits of the doorbell are then 0 for all2064 * MCDI requests due to alignment.2065 */2066 _efx_writed(efx, cpu_to_le32((u64)nic_data->mcdi_buf.dma_addr >> 32),2067 ER_DZ_MC_DB_LWRD);2068 _efx_writed(efx, cpu_to_le32((u32)nic_data->mcdi_buf.dma_addr),2069 ER_DZ_MC_DB_HWRD);2070}2071 2072static bool efx_ef10_mcdi_poll_response(struct efx_nic *efx)2073{2074 struct efx_ef10_nic_data *nic_data = efx->nic_data;2075 const efx_dword_t hdr = *(const efx_dword_t *)nic_data->mcdi_buf.addr;2076 2077 rmb();2078 return EFX_DWORD_FIELD(hdr, MCDI_HEADER_RESPONSE);2079}2080 2081static void2082efx_ef10_mcdi_read_response(struct efx_nic *efx, efx_dword_t *outbuf,2083 size_t offset, size_t outlen)2084{2085 struct efx_ef10_nic_data *nic_data = efx->nic_data;2086 const u8 *pdu = nic_data->mcdi_buf.addr;2087 2088 memcpy(outbuf, pdu + offset, outlen);2089}2090 2091static void efx_ef10_mcdi_reboot_detected(struct efx_nic *efx)2092{2093 struct efx_ef10_nic_data *nic_data = efx->nic_data;2094 2095 /* All our allocations have been reset */2096 efx_ef10_table_reset_mc_allocations(efx);2097 2098 /* The datapath firmware might have been changed */2099 nic_data->must_check_datapath_caps = true;2100 2101 /* MAC statistics have been cleared on the NIC; clear the local2102 * statistic that we update with efx_update_diff_stat().2103 */2104 nic_data->stats[EF10_STAT_port_rx_bad_bytes] = 0;2105}2106 2107static int efx_ef10_mcdi_poll_reboot(struct efx_nic *efx)2108{2109 struct efx_ef10_nic_data *nic_data = efx->nic_data;2110 int rc;2111 2112 rc = efx_ef10_get_warm_boot_count(efx);2113 if (rc < 0) {2114 /* The firmware is presumably in the process of2115 * rebooting. However, we are supposed to report each2116 * reboot just once, so we must only do that once we2117 * can read and store the updated warm boot count.2118 */2119 return 0;2120 }2121 2122 if (rc == nic_data->warm_boot_count)2123 return 0;2124 2125 nic_data->warm_boot_count = rc;2126 efx_ef10_mcdi_reboot_detected(efx);2127 2128 return -EIO;2129}2130 2131/* Handle an MSI interrupt2132 *2133 * Handle an MSI hardware interrupt. This routine schedules event2134 * queue processing. No interrupt acknowledgement cycle is necessary.2135 * Also, we never need to check that the interrupt is for us, since2136 * MSI interrupts cannot be shared.2137 */2138static irqreturn_t efx_ef10_msi_interrupt(int irq, void *dev_id)2139{2140 struct efx_msi_context *context = dev_id;2141 struct efx_nic *efx = context->efx;2142 2143 netif_vdbg(efx, intr, efx->net_dev,2144 "IRQ %d on CPU %d\n", irq, raw_smp_processor_id());2145 2146 if (likely(READ_ONCE(efx->irq_soft_enabled))) {2147 /* Note test interrupts */2148 if (context->index == efx->irq_level)2149 efx->last_irq_cpu = raw_smp_processor_id();2150 2151 /* Schedule processing of the channel */2152 efx_schedule_channel_irq(efx->channel[context->index]);2153 }2154 2155 return IRQ_HANDLED;2156}2157 2158static irqreturn_t efx_ef10_legacy_interrupt(int irq, void *dev_id)2159{2160 struct efx_nic *efx = dev_id;2161 bool soft_enabled = READ_ONCE(efx->irq_soft_enabled);2162 struct efx_channel *channel;2163 efx_dword_t reg;2164 u32 queues;2165 2166 /* Read the ISR which also ACKs the interrupts */2167 efx_readd(efx, ®, ER_DZ_BIU_INT_ISR);2168 queues = EFX_DWORD_FIELD(reg, ERF_DZ_ISR_REG);2169 2170 if (queues == 0)2171 return IRQ_NONE;2172 2173 if (likely(soft_enabled)) {2174 /* Note test interrupts */2175 if (queues & (1U << efx->irq_level))2176 efx->last_irq_cpu = raw_smp_processor_id();2177 2178 efx_for_each_channel(channel, efx) {2179 if (queues & 1)2180 efx_schedule_channel_irq(channel);2181 queues >>= 1;2182 }2183 }2184 2185 netif_vdbg(efx, intr, efx->net_dev,2186 "IRQ %d on CPU %d status " EFX_DWORD_FMT "\n",2187 irq, raw_smp_processor_id(), EFX_DWORD_VAL(reg));2188 2189 return IRQ_HANDLED;2190}2191 2192static int efx_ef10_irq_test_generate(struct efx_nic *efx)2193{2194 MCDI_DECLARE_BUF(inbuf, MC_CMD_TRIGGER_INTERRUPT_IN_LEN);2195 2196 if (efx_mcdi_set_workaround(efx, MC_CMD_WORKAROUND_BUG41750, true,2197 NULL) == 0)2198 return -ENOTSUPP;2199 2200 BUILD_BUG_ON(MC_CMD_TRIGGER_INTERRUPT_OUT_LEN != 0);2201 2202 MCDI_SET_DWORD(inbuf, TRIGGER_INTERRUPT_IN_INTR_LEVEL, efx->irq_level);2203 return efx_mcdi_rpc(efx, MC_CMD_TRIGGER_INTERRUPT,2204 inbuf, sizeof(inbuf), NULL, 0, NULL);2205}2206 2207static int efx_ef10_tx_probe(struct efx_tx_queue *tx_queue)2208{2209 /* low two bits of label are what we want for type */2210 BUILD_BUG_ON((EFX_TXQ_TYPE_OUTER_CSUM | EFX_TXQ_TYPE_INNER_CSUM) != 3);2211 tx_queue->type = tx_queue->label & 3;2212 return efx_nic_alloc_buffer(tx_queue->efx, &tx_queue->txd,2213 (tx_queue->ptr_mask + 1) *2214 sizeof(efx_qword_t),2215 GFP_KERNEL);2216}2217 2218/* This writes to the TX_DESC_WPTR and also pushes data */2219static inline void efx_ef10_push_tx_desc(struct efx_tx_queue *tx_queue,2220 const efx_qword_t *txd)2221{2222 unsigned int write_ptr;2223 efx_oword_t reg;2224 2225 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;2226 EFX_POPULATE_OWORD_1(reg, ERF_DZ_TX_DESC_WPTR, write_ptr);2227 reg.qword[0] = *txd;2228 efx_writeo_page(tx_queue->efx, ®,2229 ER_DZ_TX_DESC_UPD, tx_queue->queue);2230}2231 2232/* Add Firmware-Assisted TSO v2 option descriptors to a queue.2233 */2234int efx_ef10_tx_tso_desc(struct efx_tx_queue *tx_queue, struct sk_buff *skb,2235 bool *data_mapped)2236{2237 struct efx_tx_buffer *buffer;2238 u16 inner_ipv4_id = 0;2239 u16 outer_ipv4_id = 0;2240 struct tcphdr *tcp;2241 struct iphdr *ip;2242 u16 ip_tot_len;2243 u32 seqnum;2244 u32 mss;2245 2246 EFX_WARN_ON_ONCE_PARANOID(tx_queue->tso_version != 2);2247 2248 mss = skb_shinfo(skb)->gso_size;2249 2250 if (unlikely(mss < 4)) {2251 WARN_ONCE(1, "MSS of %u is too small for TSO v2\n", mss);2252 return -EINVAL;2253 }2254 2255 if (skb->encapsulation) {2256 if (!tx_queue->tso_encap)2257 return -EINVAL;2258 ip = ip_hdr(skb);2259 if (ip->version == 4)2260 outer_ipv4_id = ntohs(ip->id);2261 2262 ip = inner_ip_hdr(skb);2263 tcp = inner_tcp_hdr(skb);2264 } else {2265 ip = ip_hdr(skb);2266 tcp = tcp_hdr(skb);2267 }2268 2269 /* 8000-series EF10 hardware requires that IP Total Length be2270 * greater than or equal to the value it will have in each segment2271 * (which is at most mss + 208 + TCP header length), but also less2272 * than (0x10000 - inner_network_header). Otherwise the TCP2273 * checksum calculation will be broken for encapsulated packets.2274 * We fill in ip->tot_len with 0xff30, which should satisfy the2275 * first requirement unless the MSS is ridiculously large (which2276 * should be impossible as the driver max MTU is 9216); it is2277 * guaranteed to satisfy the second as we only attempt TSO if2278 * inner_network_header <= 208.2279 */2280 ip_tot_len = 0x10000 - EFX_TSO2_MAX_HDRLEN;2281 EFX_WARN_ON_ONCE_PARANOID(mss + EFX_TSO2_MAX_HDRLEN +2282 (tcp->doff << 2u) > ip_tot_len);2283 2284 if (ip->version == 4) {2285 ip->tot_len = htons(ip_tot_len);2286 ip->check = 0;2287 inner_ipv4_id = ntohs(ip->id);2288 } else {2289 ((struct ipv6hdr *)ip)->payload_len = htons(ip_tot_len);2290 }2291 2292 seqnum = ntohl(tcp->seq);2293 2294 buffer = efx_tx_queue_get_insert_buffer(tx_queue);2295 2296 buffer->flags = EFX_TX_BUF_OPTION;2297 buffer->len = 0;2298 buffer->unmap_len = 0;2299 EFX_POPULATE_QWORD_5(buffer->option,2300 ESF_DZ_TX_DESC_IS_OPT, 1,2301 ESF_DZ_TX_OPTION_TYPE, ESE_DZ_TX_OPTION_DESC_TSO,2302 ESF_DZ_TX_TSO_OPTION_TYPE,2303 ESE_DZ_TX_TSO_OPTION_DESC_FATSO2A,2304 ESF_DZ_TX_TSO_IP_ID, inner_ipv4_id,2305 ESF_DZ_TX_TSO_TCP_SEQNO, seqnum2306 );2307 ++tx_queue->insert_count;2308 2309 buffer = efx_tx_queue_get_insert_buffer(tx_queue);2310 2311 buffer->flags = EFX_TX_BUF_OPTION;2312 buffer->len = 0;2313 buffer->unmap_len = 0;2314 EFX_POPULATE_QWORD_5(buffer->option,2315 ESF_DZ_TX_DESC_IS_OPT, 1,2316 ESF_DZ_TX_OPTION_TYPE, ESE_DZ_TX_OPTION_DESC_TSO,2317 ESF_DZ_TX_TSO_OPTION_TYPE,2318 ESE_DZ_TX_TSO_OPTION_DESC_FATSO2B,2319 ESF_DZ_TX_TSO_OUTER_IPID, outer_ipv4_id,2320 ESF_DZ_TX_TSO_TCP_MSS, mss2321 );2322 ++tx_queue->insert_count;2323 2324 return 0;2325}2326 2327static u32 efx_ef10_tso_versions(struct efx_nic *efx)2328{2329 struct efx_ef10_nic_data *nic_data = efx->nic_data;2330 u32 tso_versions = 0;2331 2332 if (nic_data->datapath_caps &2333 (1 << MC_CMD_GET_CAPABILITIES_OUT_TX_TSO_LBN))2334 tso_versions |= BIT(1);2335 if (nic_data->datapath_caps2 &2336 (1 << MC_CMD_GET_CAPABILITIES_V2_OUT_TX_TSO_V2_LBN))2337 tso_versions |= BIT(2);2338 return tso_versions;2339}2340 2341static void efx_ef10_tx_init(struct efx_tx_queue *tx_queue)2342{2343 bool csum_offload = tx_queue->type & EFX_TXQ_TYPE_OUTER_CSUM;2344 bool inner_csum = tx_queue->type & EFX_TXQ_TYPE_INNER_CSUM;2345 struct efx_channel *channel = tx_queue->channel;2346 struct efx_nic *efx = tx_queue->efx;2347 struct efx_ef10_nic_data *nic_data;2348 efx_qword_t *txd;2349 int rc;2350 2351 nic_data = efx->nic_data;2352 2353 /* Only attempt to enable TX timestamping if we have the license for it,2354 * otherwise TXQ init will fail2355 */2356 if (!(nic_data->licensed_features &2357 (1 << LICENSED_V3_FEATURES_TX_TIMESTAMPS_LBN))) {2358 tx_queue->timestamping = false;2359 /* Disable sync events on this channel. */2360 if (efx->type->ptp_set_ts_sync_events)2361 efx->type->ptp_set_ts_sync_events(efx, false, false);2362 }2363 2364 /* TSOv2 is a limited resource that can only be configured on a limited2365 * number of queues. TSO without checksum offload is not really a thing,2366 * so we only enable it for those queues.2367 * TSOv2 cannot be used with Hardware timestamping, and is never needed2368 * for XDP tx.2369 */2370 if (efx_has_cap(efx, TX_TSO_V2)) {2371 if ((csum_offload || inner_csum) &&2372 !tx_queue->timestamping && !tx_queue->xdp_tx) {2373 tx_queue->tso_version = 2;2374 netif_dbg(efx, hw, efx->net_dev, "Using TSOv2 for channel %u\n",2375 channel->channel);2376 }2377 } else if (efx_has_cap(efx, TX_TSO)) {2378 tx_queue->tso_version = 1;2379 }2380 2381 rc = efx_mcdi_tx_init(tx_queue);2382 if (rc)2383 goto fail;2384 2385 /* A previous user of this TX queue might have set us up the2386 * bomb by writing a descriptor to the TX push collector but2387 * not the doorbell. (Each collector belongs to a port, not a2388 * queue or function, so cannot easily be reset.) We must2389 * attempt to push a no-op descriptor in its place.2390 */2391 tx_queue->buffer[0].flags = EFX_TX_BUF_OPTION;2392 tx_queue->insert_count = 1;2393 txd = efx_tx_desc(tx_queue, 0);2394 EFX_POPULATE_QWORD_7(*txd,2395 ESF_DZ_TX_DESC_IS_OPT, true,2396 ESF_DZ_TX_OPTION_TYPE,2397 ESE_DZ_TX_OPTION_DESC_CRC_CSUM,2398 ESF_DZ_TX_OPTION_UDP_TCP_CSUM, csum_offload,2399 ESF_DZ_TX_OPTION_IP_CSUM, csum_offload && tx_queue->tso_version != 2,2400 ESF_DZ_TX_OPTION_INNER_UDP_TCP_CSUM, inner_csum,2401 ESF_DZ_TX_OPTION_INNER_IP_CSUM, inner_csum && tx_queue->tso_version != 2,2402 ESF_DZ_TX_TIMESTAMP, tx_queue->timestamping);2403 tx_queue->write_count = 1;2404 2405 if (tx_queue->tso_version == 2 && efx_has_cap(efx, TX_TSO_V2_ENCAP))2406 tx_queue->tso_encap = true;2407 2408 wmb();2409 efx_ef10_push_tx_desc(tx_queue, txd);2410 2411 return;2412 2413fail:2414 netdev_WARN(efx->net_dev, "failed to initialise TXQ %d\n",2415 tx_queue->queue);2416}2417 2418/* This writes to the TX_DESC_WPTR; write pointer for TX descriptor ring */2419static inline void efx_ef10_notify_tx_desc(struct efx_tx_queue *tx_queue)2420{2421 unsigned int write_ptr;2422 efx_dword_t reg;2423 2424 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;2425 EFX_POPULATE_DWORD_1(reg, ERF_DZ_TX_DESC_WPTR_DWORD, write_ptr);2426 efx_writed_page(tx_queue->efx, ®,2427 ER_DZ_TX_DESC_UPD_DWORD, tx_queue->queue);2428}2429 2430#define EFX_EF10_MAX_TX_DESCRIPTOR_LEN 0x3fff2431 2432static unsigned int efx_ef10_tx_limit_len(struct efx_tx_queue *tx_queue,2433 dma_addr_t dma_addr, unsigned int len)2434{2435 if (len > EFX_EF10_MAX_TX_DESCRIPTOR_LEN) {2436 /* If we need to break across multiple descriptors we should2437 * stop at a page boundary. This assumes the length limit is2438 * greater than the page size.2439 */2440 dma_addr_t end = dma_addr + EFX_EF10_MAX_TX_DESCRIPTOR_LEN;2441 2442 BUILD_BUG_ON(EFX_EF10_MAX_TX_DESCRIPTOR_LEN < EFX_PAGE_SIZE);2443 len = (end & (~(EFX_PAGE_SIZE - 1))) - dma_addr;2444 }2445 2446 return len;2447}2448 2449static void efx_ef10_tx_write(struct efx_tx_queue *tx_queue)2450{2451 unsigned int old_write_count = tx_queue->write_count;2452 struct efx_tx_buffer *buffer;2453 unsigned int write_ptr;2454 efx_qword_t *txd;2455 2456 tx_queue->xmit_pending = false;2457 if (unlikely(tx_queue->write_count == tx_queue->insert_count))2458 return;2459 2460 do {2461 write_ptr = tx_queue->write_count & tx_queue->ptr_mask;2462 buffer = &tx_queue->buffer[write_ptr];2463 txd = efx_tx_desc(tx_queue, write_ptr);2464 ++tx_queue->write_count;2465 2466 /* Create TX descriptor ring entry */2467 if (buffer->flags & EFX_TX_BUF_OPTION) {2468 *txd = buffer->option;2469 if (EFX_QWORD_FIELD(*txd, ESF_DZ_TX_OPTION_TYPE) == 1)2470 /* PIO descriptor */2471 tx_queue->packet_write_count = tx_queue->write_count;2472 } else {2473 tx_queue->packet_write_count = tx_queue->write_count;2474 BUILD_BUG_ON(EFX_TX_BUF_CONT != 1);2475 EFX_POPULATE_QWORD_3(2476 *txd,2477 ESF_DZ_TX_KER_CONT,2478 buffer->flags & EFX_TX_BUF_CONT,2479 ESF_DZ_TX_KER_BYTE_CNT, buffer->len,2480 ESF_DZ_TX_KER_BUF_ADDR, buffer->dma_addr);2481 }2482 } while (tx_queue->write_count != tx_queue->insert_count);2483 2484 wmb(); /* Ensure descriptors are written before they are fetched */2485 2486 if (efx_nic_may_push_tx_desc(tx_queue, old_write_count)) {2487 txd = efx_tx_desc(tx_queue,2488 old_write_count & tx_queue->ptr_mask);2489 efx_ef10_push_tx_desc(tx_queue, txd);2490 ++tx_queue->pushes;2491 } else {2492 efx_ef10_notify_tx_desc(tx_queue);2493 }2494}2495 2496static int efx_ef10_probe_multicast_chaining(struct efx_nic *efx)2497{2498 struct efx_ef10_nic_data *nic_data = efx->nic_data;2499 unsigned int enabled, implemented;2500 bool want_workaround_26807;2501 int rc;2502 2503 rc = efx_mcdi_get_workarounds(efx, &implemented, &enabled);2504 if (rc == -ENOSYS) {2505 /* GET_WORKAROUNDS was implemented before this workaround,2506 * thus it must be unavailable in this firmware.2507 */2508 nic_data->workaround_26807 = false;2509 return 0;2510 }2511 if (rc)2512 return rc;2513 want_workaround_26807 =2514 implemented & MC_CMD_GET_WORKAROUNDS_OUT_BUG26807;2515 nic_data->workaround_26807 =2516 !!(enabled & MC_CMD_GET_WORKAROUNDS_OUT_BUG26807);2517 2518 if (want_workaround_26807 && !nic_data->workaround_26807) {2519 unsigned int flags;2520 2521 rc = efx_mcdi_set_workaround(efx,2522 MC_CMD_WORKAROUND_BUG26807,2523 true, &flags);2524 if (!rc) {2525 if (flags &2526 1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN) {2527 netif_info(efx, drv, efx->net_dev,2528 "other functions on NIC have been reset\n");2529 2530 /* With MCFW v4.6.x and earlier, the2531 * boot count will have incremented,2532 * so re-read the warm_boot_count2533 * value now to ensure this function2534 * doesn't think it has changed next2535 * time it checks.2536 */2537 rc = efx_ef10_get_warm_boot_count(efx);2538 if (rc >= 0) {2539 nic_data->warm_boot_count = rc;2540 rc = 0;2541 }2542 }2543 nic_data->workaround_26807 = true;2544 } else if (rc == -EPERM) {2545 rc = 0;2546 }2547 }2548 return rc;2549}2550 2551static int efx_ef10_filter_table_probe(struct efx_nic *efx)2552{2553 struct efx_ef10_nic_data *nic_data = efx->nic_data;2554 int rc = efx_ef10_probe_multicast_chaining(efx);2555 struct efx_mcdi_filter_vlan *vlan;2556 2557 if (rc)2558 return rc;2559 down_write(&efx->filter_sem);2560 rc = efx_mcdi_filter_table_probe(efx, nic_data->workaround_26807);2561 2562 if (rc)2563 goto out_unlock;2564 2565 list_for_each_entry(vlan, &nic_data->vlan_list, list) {2566 rc = efx_mcdi_filter_add_vlan(efx, vlan->vid);2567 if (rc)2568 goto fail_add_vlan;2569 }2570 goto out_unlock;2571 2572fail_add_vlan:2573 efx_mcdi_filter_table_remove(efx);2574out_unlock:2575 up_write(&efx->filter_sem);2576 return rc;2577}2578 2579static void efx_ef10_filter_table_remove(struct efx_nic *efx)2580{2581 down_write(&efx->filter_sem);2582 efx_mcdi_filter_table_remove(efx);2583 up_write(&efx->filter_sem);2584}2585 2586/* This creates an entry in the RX descriptor queue */2587static inline void2588efx_ef10_build_rx_desc(struct efx_rx_queue *rx_queue, unsigned int index)2589{2590 struct efx_rx_buffer *rx_buf;2591 efx_qword_t *rxd;2592 2593 rxd = efx_rx_desc(rx_queue, index);2594 rx_buf = efx_rx_buffer(rx_queue, index);2595 EFX_POPULATE_QWORD_2(*rxd,2596 ESF_DZ_RX_KER_BYTE_CNT, rx_buf->len,2597 ESF_DZ_RX_KER_BUF_ADDR, rx_buf->dma_addr);2598}2599 2600static void efx_ef10_rx_write(struct efx_rx_queue *rx_queue)2601{2602 struct efx_nic *efx = rx_queue->efx;2603 unsigned int write_count;2604 efx_dword_t reg;2605 2606 /* Firmware requires that RX_DESC_WPTR be a multiple of 8 */2607 write_count = rx_queue->added_count & ~7;2608 if (rx_queue->notified_count == write_count)2609 return;2610 2611 do2612 efx_ef10_build_rx_desc(2613 rx_queue,2614 rx_queue->notified_count & rx_queue->ptr_mask);2615 while (++rx_queue->notified_count != write_count);2616 2617 wmb();2618 EFX_POPULATE_DWORD_1(reg, ERF_DZ_RX_DESC_WPTR,2619 write_count & rx_queue->ptr_mask);2620 efx_writed_page(efx, ®, ER_DZ_RX_DESC_UPD,2621 efx_rx_queue_index(rx_queue));2622}2623 2624static efx_mcdi_async_completer efx_ef10_rx_defer_refill_complete;2625 2626static void efx_ef10_rx_defer_refill(struct efx_rx_queue *rx_queue)2627{2628 struct efx_channel *channel = efx_rx_queue_channel(rx_queue);2629 MCDI_DECLARE_BUF(inbuf, MC_CMD_DRIVER_EVENT_IN_LEN);2630 efx_qword_t event;2631 2632 EFX_POPULATE_QWORD_2(event,2633 ESF_DZ_EV_CODE, EFX_EF10_DRVGEN_EV,2634 ESF_DZ_EV_DATA, EFX_EF10_REFILL);2635 2636 MCDI_SET_DWORD(inbuf, DRIVER_EVENT_IN_EVQ, channel->channel);2637 2638 /* MCDI_SET_QWORD is not appropriate here since EFX_POPULATE_* has2639 * already swapped the data to little-endian order.2640 */2641 memcpy(MCDI_PTR(inbuf, DRIVER_EVENT_IN_DATA), &event.u64[0],2642 sizeof(efx_qword_t));2643 2644 efx_mcdi_rpc_async(channel->efx, MC_CMD_DRIVER_EVENT,2645 inbuf, sizeof(inbuf), 0,2646 efx_ef10_rx_defer_refill_complete, 0);2647}2648 2649static void2650efx_ef10_rx_defer_refill_complete(struct efx_nic *efx, unsigned long cookie,2651 int rc, efx_dword_t *outbuf,2652 size_t outlen_actual)2653{2654 /* nothing to do */2655}2656 2657static int efx_ef10_ev_init(struct efx_channel *channel)2658{2659 struct efx_nic *efx = channel->efx;2660 struct efx_ef10_nic_data *nic_data;2661 bool use_v2, cut_thru;2662 2663 nic_data = efx->nic_data;2664 use_v2 = nic_data->datapath_caps2 &2665 1 << MC_CMD_GET_CAPABILITIES_V2_OUT_INIT_EVQ_V2_LBN;2666 cut_thru = !(nic_data->datapath_caps &2667 1 << MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_LBN);2668 return efx_mcdi_ev_init(channel, cut_thru, use_v2);2669}2670 2671static void efx_ef10_handle_rx_wrong_queue(struct efx_rx_queue *rx_queue,2672 unsigned int rx_queue_label)2673{2674 struct efx_nic *efx = rx_queue->efx;2675 2676 netif_info(efx, hw, efx->net_dev,2677 "rx event arrived on queue %d labeled as queue %u\n",2678 efx_rx_queue_index(rx_queue), rx_queue_label);2679 2680 efx_schedule_reset(efx, RESET_TYPE_DISABLE);2681}2682 2683static void2684efx_ef10_handle_rx_bad_lbits(struct efx_rx_queue *rx_queue,2685 unsigned int actual, unsigned int expected)2686{2687 unsigned int dropped = (actual - expected) & rx_queue->ptr_mask;2688 struct efx_nic *efx = rx_queue->efx;2689 2690 netif_info(efx, hw, efx->net_dev,2691 "dropped %d events (index=%d expected=%d)\n",2692 dropped, actual, expected);2693 2694 efx_schedule_reset(efx, RESET_TYPE_DISABLE);2695}2696 2697/* partially received RX was aborted. clean up. */2698static void efx_ef10_handle_rx_abort(struct efx_rx_queue *rx_queue)2699{2700 unsigned int rx_desc_ptr;2701 2702 netif_dbg(rx_queue->efx, hw, rx_queue->efx->net_dev,2703 "scattered RX aborted (dropping %u buffers)\n",2704 rx_queue->scatter_n);2705 2706 rx_desc_ptr = rx_queue->removed_count & rx_queue->ptr_mask;2707 2708 efx_rx_packet(rx_queue, rx_desc_ptr, rx_queue->scatter_n,2709 0, EFX_RX_PKT_DISCARD);2710 2711 rx_queue->removed_count += rx_queue->scatter_n;2712 rx_queue->scatter_n = 0;2713 rx_queue->scatter_len = 0;2714 ++efx_rx_queue_channel(rx_queue)->n_rx_nodesc_trunc;2715}2716 2717static u16 efx_ef10_handle_rx_event_errors(struct efx_channel *channel,2718 unsigned int n_packets,2719 unsigned int rx_encap_hdr,2720 unsigned int rx_l3_class,2721 unsigned int rx_l4_class,2722 const efx_qword_t *event)2723{2724 struct efx_nic *efx = channel->efx;2725 bool handled = false;2726 2727 if (EFX_QWORD_FIELD(*event, ESF_DZ_RX_ECRC_ERR)) {2728 if (!(efx->net_dev->features & NETIF_F_RXALL)) {2729 if (!efx->loopback_selftest)2730 channel->n_rx_eth_crc_err += n_packets;2731 return EFX_RX_PKT_DISCARD;2732 }2733 handled = true;2734 }2735 if (EFX_QWORD_FIELD(*event, ESF_DZ_RX_IPCKSUM_ERR)) {2736 if (unlikely(rx_encap_hdr != ESE_EZ_ENCAP_HDR_VXLAN &&2737 rx_l3_class != ESE_DZ_L3_CLASS_IP4 &&2738 rx_l3_class != ESE_DZ_L3_CLASS_IP4_FRAG &&2739 rx_l3_class != ESE_DZ_L3_CLASS_IP6 &&2740 rx_l3_class != ESE_DZ_L3_CLASS_IP6_FRAG))2741 netdev_WARN(efx->net_dev,2742 "invalid class for RX_IPCKSUM_ERR: event="2743 EFX_QWORD_FMT "\n",2744 EFX_QWORD_VAL(*event));2745 if (!efx->loopback_selftest)2746 *(rx_encap_hdr ?2747 &channel->n_rx_outer_ip_hdr_chksum_err :2748 &channel->n_rx_ip_hdr_chksum_err) += n_packets;2749 return 0;2750 }2751 if (EFX_QWORD_FIELD(*event, ESF_DZ_RX_TCPUDP_CKSUM_ERR)) {2752 if (unlikely(rx_encap_hdr != ESE_EZ_ENCAP_HDR_VXLAN &&2753 ((rx_l3_class != ESE_DZ_L3_CLASS_IP4 &&2754 rx_l3_class != ESE_DZ_L3_CLASS_IP6) ||2755 (rx_l4_class != ESE_FZ_L4_CLASS_TCP &&2756 rx_l4_class != ESE_FZ_L4_CLASS_UDP))))2757 netdev_WARN(efx->net_dev,2758 "invalid class for RX_TCPUDP_CKSUM_ERR: event="2759 EFX_QWORD_FMT "\n",2760 EFX_QWORD_VAL(*event));2761 if (!efx->loopback_selftest)2762 *(rx_encap_hdr ?2763 &channel->n_rx_outer_tcp_udp_chksum_err :2764 &channel->n_rx_tcp_udp_chksum_err) += n_packets;2765 return 0;2766 }2767 if (EFX_QWORD_FIELD(*event, ESF_EZ_RX_IP_INNER_CHKSUM_ERR)) {2768 if (unlikely(!rx_encap_hdr))2769 netdev_WARN(efx->net_dev,2770 "invalid encapsulation type for RX_IP_INNER_CHKSUM_ERR: event="2771 EFX_QWORD_FMT "\n",2772 EFX_QWORD_VAL(*event));2773 else if (unlikely(rx_l3_class != ESE_DZ_L3_CLASS_IP4 &&2774 rx_l3_class != ESE_DZ_L3_CLASS_IP4_FRAG &&2775 rx_l3_class != ESE_DZ_L3_CLASS_IP6 &&2776 rx_l3_class != ESE_DZ_L3_CLASS_IP6_FRAG))2777 netdev_WARN(efx->net_dev,2778 "invalid class for RX_IP_INNER_CHKSUM_ERR: event="2779 EFX_QWORD_FMT "\n",2780 EFX_QWORD_VAL(*event));2781 if (!efx->loopback_selftest)2782 channel->n_rx_inner_ip_hdr_chksum_err += n_packets;2783 return 0;2784 }2785 if (EFX_QWORD_FIELD(*event, ESF_EZ_RX_TCP_UDP_INNER_CHKSUM_ERR)) {2786 if (unlikely(!rx_encap_hdr))2787 netdev_WARN(efx->net_dev,2788 "invalid encapsulation type for RX_TCP_UDP_INNER_CHKSUM_ERR: event="2789 EFX_QWORD_FMT "\n",2790 EFX_QWORD_VAL(*event));2791 else if (unlikely((rx_l3_class != ESE_DZ_L3_CLASS_IP4 &&2792 rx_l3_class != ESE_DZ_L3_CLASS_IP6) ||2793 (rx_l4_class != ESE_FZ_L4_CLASS_TCP &&2794 rx_l4_class != ESE_FZ_L4_CLASS_UDP)))2795 netdev_WARN(efx->net_dev,2796 "invalid class for RX_TCP_UDP_INNER_CHKSUM_ERR: event="2797 EFX_QWORD_FMT "\n",2798 EFX_QWORD_VAL(*event));2799 if (!efx->loopback_selftest)2800 channel->n_rx_inner_tcp_udp_chksum_err += n_packets;2801 return 0;2802 }2803 2804 WARN_ON(!handled); /* No error bits were recognised */2805 return 0;2806}2807 2808static int efx_ef10_handle_rx_event(struct efx_channel *channel,2809 const efx_qword_t *event)2810{2811 unsigned int rx_bytes, next_ptr_lbits, rx_queue_label;2812 unsigned int rx_l3_class, rx_l4_class, rx_encap_hdr;2813 unsigned int n_descs, n_packets, i;2814 struct efx_nic *efx = channel->efx;2815 struct efx_ef10_nic_data *nic_data = efx->nic_data;2816 struct efx_rx_queue *rx_queue;2817 efx_qword_t errors;2818 bool rx_cont;2819 u16 flags = 0;2820 2821 if (unlikely(READ_ONCE(efx->reset_pending)))2822 return 0;2823 2824 /* Basic packet information */2825 rx_bytes = EFX_QWORD_FIELD(*event, ESF_DZ_RX_BYTES);2826 next_ptr_lbits = EFX_QWORD_FIELD(*event, ESF_DZ_RX_DSC_PTR_LBITS);2827 rx_queue_label = EFX_QWORD_FIELD(*event, ESF_DZ_RX_QLABEL);2828 rx_l3_class = EFX_QWORD_FIELD(*event, ESF_DZ_RX_L3_CLASS);2829 rx_l4_class = EFX_QWORD_FIELD(*event, ESF_FZ_RX_L4_CLASS);2830 rx_cont = EFX_QWORD_FIELD(*event, ESF_DZ_RX_CONT);2831 rx_encap_hdr =2832 nic_data->datapath_caps &2833 (1 << MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN) ?2834 EFX_QWORD_FIELD(*event, ESF_EZ_RX_ENCAP_HDR) :2835 ESE_EZ_ENCAP_HDR_NONE;2836 2837 if (EFX_QWORD_FIELD(*event, ESF_DZ_RX_DROP_EVENT))2838 netdev_WARN(efx->net_dev, "saw RX_DROP_EVENT: event="2839 EFX_QWORD_FMT "\n",2840 EFX_QWORD_VAL(*event));2841 2842 rx_queue = efx_channel_get_rx_queue(channel);2843 2844 if (unlikely(rx_queue_label != efx_rx_queue_index(rx_queue)))2845 efx_ef10_handle_rx_wrong_queue(rx_queue, rx_queue_label);2846 2847 n_descs = ((next_ptr_lbits - rx_queue->removed_count) &2848 ((1 << ESF_DZ_RX_DSC_PTR_LBITS_WIDTH) - 1));2849 2850 if (n_descs != rx_queue->scatter_n + 1) {2851 struct efx_ef10_nic_data *nic_data = efx->nic_data;2852 2853 /* detect rx abort */2854 if (unlikely(n_descs == rx_queue->scatter_n)) {2855 if (rx_queue->scatter_n == 0 || rx_bytes != 0)2856 netdev_WARN(efx->net_dev,2857 "invalid RX abort: scatter_n=%u event="2858 EFX_QWORD_FMT "\n",2859 rx_queue->scatter_n,2860 EFX_QWORD_VAL(*event));2861 efx_ef10_handle_rx_abort(rx_queue);2862 return 0;2863 }2864 2865 /* Check that RX completion merging is valid, i.e.2866 * the current firmware supports it and this is a2867 * non-scattered packet.2868 */2869 if (!(nic_data->datapath_caps &2870 (1 << MC_CMD_GET_CAPABILITIES_OUT_RX_BATCHING_LBN)) ||2871 rx_queue->scatter_n != 0 || rx_cont) {2872 efx_ef10_handle_rx_bad_lbits(2873 rx_queue, next_ptr_lbits,2874 (rx_queue->removed_count +2875 rx_queue->scatter_n + 1) &2876 ((1 << ESF_DZ_RX_DSC_PTR_LBITS_WIDTH) - 1));2877 return 0;2878 }2879 2880 /* Merged completion for multiple non-scattered packets */2881 rx_queue->scatter_n = 1;2882 rx_queue->scatter_len = 0;2883 n_packets = n_descs;2884 ++channel->n_rx_merge_events;2885 channel->n_rx_merge_packets += n_packets;2886 flags |= EFX_RX_PKT_PREFIX_LEN;2887 } else {2888 ++rx_queue->scatter_n;2889 rx_queue->scatter_len += rx_bytes;2890 if (rx_cont)2891 return 0;2892 n_packets = 1;2893 }2894 2895 EFX_POPULATE_QWORD_5(errors, ESF_DZ_RX_ECRC_ERR, 1,2896 ESF_DZ_RX_IPCKSUM_ERR, 1,2897 ESF_DZ_RX_TCPUDP_CKSUM_ERR, 1,2898 ESF_EZ_RX_IP_INNER_CHKSUM_ERR, 1,2899 ESF_EZ_RX_TCP_UDP_INNER_CHKSUM_ERR, 1);2900 EFX_AND_QWORD(errors, *event, errors);2901 if (unlikely(!EFX_QWORD_IS_ZERO(errors))) {2902 flags |= efx_ef10_handle_rx_event_errors(channel, n_packets,2903 rx_encap_hdr,2904 rx_l3_class, rx_l4_class,2905 event);2906 } else {2907 bool tcpudp = rx_l4_class == ESE_FZ_L4_CLASS_TCP ||2908 rx_l4_class == ESE_FZ_L4_CLASS_UDP;2909 2910 switch (rx_encap_hdr) {2911 case ESE_EZ_ENCAP_HDR_VXLAN: /* VxLAN or GENEVE */2912 flags |= EFX_RX_PKT_CSUMMED; /* outer UDP csum */2913 if (tcpudp)2914 flags |= EFX_RX_PKT_CSUM_LEVEL; /* inner L4 */2915 break;2916 case ESE_EZ_ENCAP_HDR_GRE:2917 case ESE_EZ_ENCAP_HDR_NONE:2918 if (tcpudp)2919 flags |= EFX_RX_PKT_CSUMMED;2920 break;2921 default:2922 netdev_WARN(efx->net_dev,2923 "unknown encapsulation type: event="2924 EFX_QWORD_FMT "\n",2925 EFX_QWORD_VAL(*event));2926 }2927 }2928 2929 if (rx_l4_class == ESE_FZ_L4_CLASS_TCP)2930 flags |= EFX_RX_PKT_TCP;2931 2932 channel->irq_mod_score += 2 * n_packets;2933 2934 /* Handle received packet(s) */2935 for (i = 0; i < n_packets; i++) {2936 efx_rx_packet(rx_queue,2937 rx_queue->removed_count & rx_queue->ptr_mask,2938 rx_queue->scatter_n, rx_queue->scatter_len,2939 flags);2940 rx_queue->removed_count += rx_queue->scatter_n;2941 }2942 2943 rx_queue->scatter_n = 0;2944 rx_queue->scatter_len = 0;2945 2946 return n_packets;2947}2948 2949static u32 efx_ef10_extract_event_ts(efx_qword_t *event)2950{2951 u32 tstamp;2952 2953 tstamp = EFX_QWORD_FIELD(*event, TX_TIMESTAMP_EVENT_TSTAMP_DATA_HI);2954 tstamp <<= 16;2955 tstamp |= EFX_QWORD_FIELD(*event, TX_TIMESTAMP_EVENT_TSTAMP_DATA_LO);2956 2957 return tstamp;2958}2959 2960static int2961efx_ef10_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)2962{2963 struct efx_nic *efx = channel->efx;2964 struct efx_tx_queue *tx_queue;2965 unsigned int tx_ev_desc_ptr;2966 unsigned int tx_ev_q_label;2967 unsigned int tx_ev_type;2968 int work_done;2969 u64 ts_part;2970 2971 if (unlikely(READ_ONCE(efx->reset_pending)))2972 return 0;2973 2974 if (unlikely(EFX_QWORD_FIELD(*event, ESF_DZ_TX_DROP_EVENT)))2975 return 0;2976 2977 /* Get the transmit queue */2978 tx_ev_q_label = EFX_QWORD_FIELD(*event, ESF_DZ_TX_QLABEL);2979 tx_queue = channel->tx_queue + (tx_ev_q_label % EFX_MAX_TXQ_PER_CHANNEL);2980 2981 if (!tx_queue->timestamping) {2982 /* Transmit completion */2983 tx_ev_desc_ptr = EFX_QWORD_FIELD(*event, ESF_DZ_TX_DESCR_INDX);2984 return efx_xmit_done(tx_queue, tx_ev_desc_ptr & tx_queue->ptr_mask);2985 }2986 2987 /* Transmit timestamps are only available for 8XXX series. They result2988 * in up to three events per packet. These occur in order, and are:2989 * - the normal completion event (may be omitted)2990 * - the low part of the timestamp2991 * - the high part of the timestamp2992 *2993 * It's possible for multiple completion events to appear before the2994 * corresponding timestamps. So we can for example get:2995 * COMP N2996 * COMP N+12997 * TS_LO N2998 * TS_HI N2999 * TS_LO N+13000 * TS_HI N+13001 *3002 * In addition it's also possible for the adjacent completions to be3003 * merged, so we may not see COMP N above. As such, the completion3004 * events are not very useful here.3005 *3006 * Each part of the timestamp is itself split across two 16 bit3007 * fields in the event.3008 */3009 tx_ev_type = EFX_QWORD_FIELD(*event, ESF_EZ_TX_SOFT1);3010 work_done = 0;3011 3012 switch (tx_ev_type) {3013 case TX_TIMESTAMP_EVENT_TX_EV_COMPLETION:3014 /* Ignore this event - see above. */3015 break;3016 3017 case TX_TIMESTAMP_EVENT_TX_EV_TSTAMP_LO:3018 ts_part = efx_ef10_extract_event_ts(event);3019 tx_queue->completed_timestamp_minor = ts_part;3020 break;3021 3022 case TX_TIMESTAMP_EVENT_TX_EV_TSTAMP_HI:3023 ts_part = efx_ef10_extract_event_ts(event);3024 tx_queue->completed_timestamp_major = ts_part;3025 3026 efx_xmit_done_single(tx_queue);3027 work_done = 1;3028 break;3029 3030 default:3031 netif_err(efx, hw, efx->net_dev,3032 "channel %d unknown tx event type %d (data "3033 EFX_QWORD_FMT ")\n",3034 channel->channel, tx_ev_type,3035 EFX_QWORD_VAL(*event));3036 break;3037 }3038 3039 return work_done;3040}3041 3042static void3043efx_ef10_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)3044{3045 struct efx_nic *efx = channel->efx;3046 int subcode;3047 3048 subcode = EFX_QWORD_FIELD(*event, ESF_DZ_DRV_SUB_CODE);3049 3050 switch (subcode) {3051 case ESE_DZ_DRV_TIMER_EV:3052 case ESE_DZ_DRV_WAKE_UP_EV:3053 break;3054 case ESE_DZ_DRV_START_UP_EV:3055 /* event queue init complete. ok. */3056 break;3057 default:3058 netif_err(efx, hw, efx->net_dev,3059 "channel %d unknown driver event type %d"3060 " (data " EFX_QWORD_FMT ")\n",3061 channel->channel, subcode,3062 EFX_QWORD_VAL(*event));3063 3064 }3065}3066 3067static void efx_ef10_handle_driver_generated_event(struct efx_channel *channel,3068 efx_qword_t *event)3069{3070 struct efx_nic *efx = channel->efx;3071 u32 subcode;3072 3073 subcode = EFX_QWORD_FIELD(*event, EFX_DWORD_0);3074 3075 switch (subcode) {3076 case EFX_EF10_TEST:3077 channel->event_test_cpu = raw_smp_processor_id();3078 break;3079 case EFX_EF10_REFILL:3080 /* The queue must be empty, so we won't receive any rx3081 * events, so efx_process_channel() won't refill the3082 * queue. Refill it here3083 */3084 efx_fast_push_rx_descriptors(&channel->rx_queue, true);3085 break;3086 default:3087 netif_err(efx, hw, efx->net_dev,3088 "channel %d unknown driver event type %u"3089 " (data " EFX_QWORD_FMT ")\n",3090 channel->channel, (unsigned) subcode,3091 EFX_QWORD_VAL(*event));3092 }3093}3094 3095#define EFX_NAPI_MAX_TX 5123096 3097static int efx_ef10_ev_process(struct efx_channel *channel, int quota)3098{3099 struct efx_nic *efx = channel->efx;3100 efx_qword_t event, *p_event;3101 unsigned int read_ptr;3102 int spent_tx = 0;3103 int spent = 0;3104 int ev_code;3105 3106 if (quota <= 0)3107 return spent;3108 3109 read_ptr = channel->eventq_read_ptr;3110 3111 for (;;) {3112 p_event = efx_event(channel, read_ptr);3113 event = *p_event;3114 3115 if (!efx_event_present(&event))3116 break;3117 3118 EFX_SET_QWORD(*p_event);3119 3120 ++read_ptr;3121 3122 ev_code = EFX_QWORD_FIELD(event, ESF_DZ_EV_CODE);3123 3124 netif_vdbg(efx, drv, efx->net_dev,3125 "processing event on %d " EFX_QWORD_FMT "\n",3126 channel->channel, EFX_QWORD_VAL(event));3127 3128 switch (ev_code) {3129 case ESE_DZ_EV_CODE_MCDI_EV:3130 efx_mcdi_process_event(channel, &event);3131 break;3132 case ESE_DZ_EV_CODE_RX_EV:3133 spent += efx_ef10_handle_rx_event(channel, &event);3134 if (spent >= quota) {3135 /* XXX can we split a merged event to3136 * avoid going over-quota?3137 */3138 spent = quota;3139 goto out;3140 }3141 break;3142 case ESE_DZ_EV_CODE_TX_EV:3143 spent_tx += efx_ef10_handle_tx_event(channel, &event);3144 if (spent_tx >= EFX_NAPI_MAX_TX) {3145 spent = quota;3146 goto out;3147 }3148 break;3149 case ESE_DZ_EV_CODE_DRIVER_EV:3150 efx_ef10_handle_driver_event(channel, &event);3151 if (++spent == quota)3152 goto out;3153 break;3154 case EFX_EF10_DRVGEN_EV:3155 efx_ef10_handle_driver_generated_event(channel, &event);3156 break;3157 default:3158 netif_err(efx, hw, efx->net_dev,3159 "channel %d unknown event type %d"3160 " (data " EFX_QWORD_FMT ")\n",3161 channel->channel, ev_code,3162 EFX_QWORD_VAL(event));3163 }3164 }3165 3166out:3167 channel->eventq_read_ptr = read_ptr;3168 return spent;3169}3170 3171static void efx_ef10_ev_read_ack(struct efx_channel *channel)3172{3173 struct efx_nic *efx = channel->efx;3174 efx_dword_t rptr;3175 3176 if (EFX_EF10_WORKAROUND_35388(efx)) {3177 BUILD_BUG_ON(EFX_MIN_EVQ_SIZE <3178 (1 << ERF_DD_EVQ_IND_RPTR_WIDTH));3179 BUILD_BUG_ON(EFX_MAX_EVQ_SIZE >3180 (1 << 2 * ERF_DD_EVQ_IND_RPTR_WIDTH));3181 3182 EFX_POPULATE_DWORD_2(rptr, ERF_DD_EVQ_IND_RPTR_FLAGS,3183 EFE_DD_EVQ_IND_RPTR_FLAGS_HIGH,3184 ERF_DD_EVQ_IND_RPTR,3185 (channel->eventq_read_ptr &3186 channel->eventq_mask) >>3187 ERF_DD_EVQ_IND_RPTR_WIDTH);3188 efx_writed_page(efx, &rptr, ER_DD_EVQ_INDIRECT,3189 channel->channel);3190 EFX_POPULATE_DWORD_2(rptr, ERF_DD_EVQ_IND_RPTR_FLAGS,3191 EFE_DD_EVQ_IND_RPTR_FLAGS_LOW,3192 ERF_DD_EVQ_IND_RPTR,3193 channel->eventq_read_ptr &3194 ((1 << ERF_DD_EVQ_IND_RPTR_WIDTH) - 1));3195 efx_writed_page(efx, &rptr, ER_DD_EVQ_INDIRECT,3196 channel->channel);3197 } else {3198 EFX_POPULATE_DWORD_1(rptr, ERF_DZ_EVQ_RPTR,3199 channel->eventq_read_ptr &3200 channel->eventq_mask);3201 efx_writed_page(efx, &rptr, ER_DZ_EVQ_RPTR, channel->channel);3202 }3203}3204 3205static void efx_ef10_ev_test_generate(struct efx_channel *channel)3206{3207 MCDI_DECLARE_BUF(inbuf, MC_CMD_DRIVER_EVENT_IN_LEN);3208 struct efx_nic *efx = channel->efx;3209 efx_qword_t event;3210 int rc;3211 3212 EFX_POPULATE_QWORD_2(event,3213 ESF_DZ_EV_CODE, EFX_EF10_DRVGEN_EV,3214 ESF_DZ_EV_DATA, EFX_EF10_TEST);3215 3216 MCDI_SET_DWORD(inbuf, DRIVER_EVENT_IN_EVQ, channel->channel);3217 3218 /* MCDI_SET_QWORD is not appropriate here since EFX_POPULATE_* has3219 * already swapped the data to little-endian order.3220 */3221 memcpy(MCDI_PTR(inbuf, DRIVER_EVENT_IN_DATA), &event.u64[0],3222 sizeof(efx_qword_t));3223 3224 rc = efx_mcdi_rpc(efx, MC_CMD_DRIVER_EVENT, inbuf, sizeof(inbuf),3225 NULL, 0, NULL);3226 if (rc != 0)3227 goto fail;3228 3229 return;3230 3231fail:3232 WARN_ON(true);3233 netif_err(efx, hw, efx->net_dev, "%s: failed rc=%d\n", __func__, rc);3234}3235 3236static void efx_ef10_prepare_flr(struct efx_nic *efx)3237{3238 atomic_set(&efx->active_queues, 0);3239}3240 3241static int efx_ef10_vport_set_mac_address(struct efx_nic *efx)3242{3243 struct efx_ef10_nic_data *nic_data = efx->nic_data;3244 u8 mac_old[ETH_ALEN];3245 int rc, rc2;3246 3247 /* Only reconfigure a PF-created vport */3248 if (is_zero_ether_addr(nic_data->vport_mac))3249 return 0;3250 3251 efx_device_detach_sync(efx);3252 efx_net_stop(efx->net_dev);3253 efx_ef10_filter_table_remove(efx);3254 3255 rc = efx_ef10_vadaptor_free(efx, efx->vport_id);3256 if (rc)3257 goto restore_filters;3258 3259 ether_addr_copy(mac_old, nic_data->vport_mac);3260 rc = efx_ef10_vport_del_mac(efx, efx->vport_id,3261 nic_data->vport_mac);3262 if (rc)3263 goto restore_vadaptor;3264 3265 rc = efx_ef10_vport_add_mac(efx, efx->vport_id,3266 efx->net_dev->dev_addr);3267 if (!rc) {3268 ether_addr_copy(nic_data->vport_mac, efx->net_dev->dev_addr);3269 } else {3270 rc2 = efx_ef10_vport_add_mac(efx, efx->vport_id, mac_old);3271 if (rc2) {3272 /* Failed to add original MAC, so clear vport_mac */3273 eth_zero_addr(nic_data->vport_mac);3274 goto reset_nic;3275 }3276 }3277 3278restore_vadaptor:3279 rc2 = efx_ef10_vadaptor_alloc(efx, efx->vport_id);3280 if (rc2)3281 goto reset_nic;3282restore_filters:3283 rc2 = efx_ef10_filter_table_probe(efx);3284 if (rc2)3285 goto reset_nic;3286 3287 rc2 = efx_net_open(efx->net_dev);3288 if (rc2)3289 goto reset_nic;3290 3291 efx_device_attach_if_not_resetting(efx);3292 3293 return rc;3294 3295reset_nic:3296 netif_err(efx, drv, efx->net_dev,3297 "Failed to restore when changing MAC address - scheduling reset\n");3298 efx_schedule_reset(efx, RESET_TYPE_DATAPATH);3299 3300 return rc ? rc : rc2;3301}3302 3303static int efx_ef10_set_mac_address(struct efx_nic *efx)3304{3305 MCDI_DECLARE_BUF(inbuf, MC_CMD_VADAPTOR_SET_MAC_IN_LEN);3306 bool was_enabled = efx->port_enabled;3307 int rc;3308 3309#ifdef CONFIG_SFC_SRIOV3310 /* If this function is a VF and we have access to the parent PF,3311 * then use the PF control path to attempt to change the VF MAC address.3312 */3313 if (efx->pci_dev->is_virtfn && efx->pci_dev->physfn) {3314 struct efx_nic *efx_pf = pci_get_drvdata(efx->pci_dev->physfn);3315 struct efx_ef10_nic_data *nic_data = efx->nic_data;3316 u8 mac[ETH_ALEN];3317 3318 /* net_dev->dev_addr can be zeroed by efx_net_stop in3319 * efx_ef10_sriov_set_vf_mac, so pass in a copy.3320 */3321 ether_addr_copy(mac, efx->net_dev->dev_addr);3322 3323 rc = efx_ef10_sriov_set_vf_mac(efx_pf, nic_data->vf_index, mac);3324 if (!rc)3325 return 0;3326 3327 netif_dbg(efx, drv, efx->net_dev,3328 "Updating VF mac via PF failed (%d), setting directly\n",3329 rc);3330 }3331#endif3332 3333 efx_device_detach_sync(efx);3334 efx_net_stop(efx->net_dev);3335 3336 mutex_lock(&efx->mac_lock);3337 efx_ef10_filter_table_remove(efx);3338 3339 ether_addr_copy(MCDI_PTR(inbuf, VADAPTOR_SET_MAC_IN_MACADDR),3340 efx->net_dev->dev_addr);3341 MCDI_SET_DWORD(inbuf, VADAPTOR_SET_MAC_IN_UPSTREAM_PORT_ID,3342 efx->vport_id);3343 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_VADAPTOR_SET_MAC, inbuf,3344 sizeof(inbuf), NULL, 0, NULL);3345 3346 efx_ef10_filter_table_probe(efx);3347 mutex_unlock(&efx->mac_lock);3348 3349 if (was_enabled)3350 efx_net_open(efx->net_dev);3351 efx_device_attach_if_not_resetting(efx);3352 3353 if (rc == -EPERM) {3354 netif_err(efx, drv, efx->net_dev,3355 "Cannot change MAC address; use sfboot to enable"3356 " mac-spoofing on this interface\n");3357 } else if (rc == -ENOSYS && !efx_ef10_is_vf(efx)) {3358 /* If the active MCFW does not support MC_CMD_VADAPTOR_SET_MAC3359 * fall-back to the method of changing the MAC address on the3360 * vport. This only applies to PFs because such versions of3361 * MCFW do not support VFs.3362 */3363 rc = efx_ef10_vport_set_mac_address(efx);3364 } else if (rc) {3365 efx_mcdi_display_error(efx, MC_CMD_VADAPTOR_SET_MAC,3366 sizeof(inbuf), NULL, 0, rc);3367 }3368 3369 return rc;3370}3371 3372static int efx_ef10_mac_reconfigure(struct efx_nic *efx, bool mtu_only)3373{3374 WARN_ON(!mutex_is_locked(&efx->mac_lock));3375 3376 efx_mcdi_filter_sync_rx_mode(efx);3377 3378 if (mtu_only && efx_has_cap(efx, SET_MAC_ENHANCED))3379 return efx_mcdi_set_mtu(efx);3380 return efx_mcdi_set_mac(efx);3381}3382 3383static int efx_ef10_start_bist(struct efx_nic *efx, u32 bist_type)3384{3385 MCDI_DECLARE_BUF(inbuf, MC_CMD_START_BIST_IN_LEN);3386 3387 MCDI_SET_DWORD(inbuf, START_BIST_IN_TYPE, bist_type);3388 return efx_mcdi_rpc(efx, MC_CMD_START_BIST, inbuf, sizeof(inbuf),3389 NULL, 0, NULL);3390}3391 3392/* MC BISTs follow a different poll mechanism to phy BISTs.3393 * The BIST is done in the poll handler on the MC, and the MCDI command3394 * will block until the BIST is done.3395 */3396static int efx_ef10_poll_bist(struct efx_nic *efx)3397{3398 int rc;3399 MCDI_DECLARE_BUF(outbuf, MC_CMD_POLL_BIST_OUT_LEN);3400 size_t outlen;3401 u32 result;3402 3403 rc = efx_mcdi_rpc(efx, MC_CMD_POLL_BIST, NULL, 0,3404 outbuf, sizeof(outbuf), &outlen);3405 if (rc != 0)3406 return rc;3407 3408 if (outlen < MC_CMD_POLL_BIST_OUT_LEN)3409 return -EIO;3410 3411 result = MCDI_DWORD(outbuf, POLL_BIST_OUT_RESULT);3412 switch (result) {3413 case MC_CMD_POLL_BIST_PASSED:3414 netif_dbg(efx, hw, efx->net_dev, "BIST passed.\n");3415 return 0;3416 case MC_CMD_POLL_BIST_TIMEOUT:3417 netif_err(efx, hw, efx->net_dev, "BIST timed out\n");3418 return -EIO;3419 case MC_CMD_POLL_BIST_FAILED:3420 netif_err(efx, hw, efx->net_dev, "BIST failed.\n");3421 return -EIO;3422 default:3423 netif_err(efx, hw, efx->net_dev,3424 "BIST returned unknown result %u", result);3425 return -EIO;3426 }3427}3428 3429static int efx_ef10_run_bist(struct efx_nic *efx, u32 bist_type)3430{3431 int rc;3432 3433 netif_dbg(efx, drv, efx->net_dev, "starting BIST type %u\n", bist_type);3434 3435 rc = efx_ef10_start_bist(efx, bist_type);3436 if (rc != 0)3437 return rc;3438 3439 return efx_ef10_poll_bist(efx);3440}3441 3442static int3443efx_ef10_test_chip(struct efx_nic *efx, struct efx_self_tests *tests)3444{3445 int rc, rc2;3446 3447 efx_reset_down(efx, RESET_TYPE_WORLD);3448 3449 rc = efx_mcdi_rpc(efx, MC_CMD_ENABLE_OFFLINE_BIST,3450 NULL, 0, NULL, 0, NULL);3451 if (rc != 0)3452 goto out;3453 3454 tests->memory = efx_ef10_run_bist(efx, MC_CMD_MC_MEM_BIST) ? -1 : 1;3455 tests->registers = efx_ef10_run_bist(efx, MC_CMD_REG_BIST) ? -1 : 1;3456 3457 rc = efx_mcdi_reset(efx, RESET_TYPE_WORLD);3458 3459out:3460 if (rc == -EPERM)3461 rc = 0;3462 rc2 = efx_reset_up(efx, RESET_TYPE_WORLD, rc == 0);3463 return rc ? rc : rc2;3464}3465 3466#ifdef CONFIG_SFC_MTD3467 3468struct efx_ef10_nvram_type_info {3469 u16 type, type_mask;3470 u8 port;3471 const char *name;3472};3473 3474static const struct efx_ef10_nvram_type_info efx_ef10_nvram_types[] = {3475 { NVRAM_PARTITION_TYPE_MC_FIRMWARE, 0, 0, "sfc_mcfw" },3476 { NVRAM_PARTITION_TYPE_MC_FIRMWARE_BACKUP, 0, 0, "sfc_mcfw_backup" },3477 { NVRAM_PARTITION_TYPE_EXPANSION_ROM, 0, 0, "sfc_exp_rom" },3478 { NVRAM_PARTITION_TYPE_STATIC_CONFIG, 0, 0, "sfc_static_cfg" },3479 { NVRAM_PARTITION_TYPE_DYNAMIC_CONFIG, 0, 0, "sfc_dynamic_cfg" },3480 { NVRAM_PARTITION_TYPE_EXPROM_CONFIG_PORT0, 0, 0, "sfc_exp_rom_cfg" },3481 { NVRAM_PARTITION_TYPE_EXPROM_CONFIG_PORT1, 0, 1, "sfc_exp_rom_cfg" },3482 { NVRAM_PARTITION_TYPE_EXPROM_CONFIG_PORT2, 0, 2, "sfc_exp_rom_cfg" },3483 { NVRAM_PARTITION_TYPE_EXPROM_CONFIG_PORT3, 0, 3, "sfc_exp_rom_cfg" },3484 { NVRAM_PARTITION_TYPE_LICENSE, 0, 0, "sfc_license" },3485 { NVRAM_PARTITION_TYPE_PHY_MIN, 0xff, 0, "sfc_phy_fw" },3486 { NVRAM_PARTITION_TYPE_MUM_FIRMWARE, 0, 0, "sfc_mumfw" },3487 { NVRAM_PARTITION_TYPE_EXPANSION_UEFI, 0, 0, "sfc_uefi" },3488 { NVRAM_PARTITION_TYPE_DYNCONFIG_DEFAULTS, 0, 0, "sfc_dynamic_cfg_dflt" },3489 { NVRAM_PARTITION_TYPE_ROMCONFIG_DEFAULTS, 0, 0, "sfc_exp_rom_cfg_dflt" },3490 { NVRAM_PARTITION_TYPE_STATUS, 0, 0, "sfc_status" },3491 { NVRAM_PARTITION_TYPE_BUNDLE, 0, 0, "sfc_bundle" },3492 { NVRAM_PARTITION_TYPE_BUNDLE_METADATA, 0, 0, "sfc_bundle_metadata" },3493};3494#define EF10_NVRAM_PARTITION_COUNT ARRAY_SIZE(efx_ef10_nvram_types)3495 3496static int efx_ef10_mtd_probe_partition(struct efx_nic *efx,3497 struct efx_mcdi_mtd_partition *part,3498 unsigned int type,3499 unsigned long *found)3500{3501 MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_METADATA_IN_LEN);3502 MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_METADATA_OUT_LENMAX);3503 const struct efx_ef10_nvram_type_info *info;3504 size_t size, erase_size, outlen;3505 int type_idx = 0;3506 bool protected;3507 int rc;3508 3509 for (type_idx = 0; ; type_idx++) {3510 if (type_idx == EF10_NVRAM_PARTITION_COUNT)3511 return -ENODEV;3512 info = efx_ef10_nvram_types + type_idx;3513 if ((type & ~info->type_mask) == info->type)3514 break;3515 }3516 if (info->port != efx_port_num(efx))3517 return -ENODEV;3518 3519 rc = efx_mcdi_nvram_info(efx, type, &size, &erase_size, &protected);3520 if (rc)3521 return rc;3522 if (protected &&3523 (type != NVRAM_PARTITION_TYPE_DYNCONFIG_DEFAULTS &&3524 type != NVRAM_PARTITION_TYPE_ROMCONFIG_DEFAULTS))3525 /* Hide protected partitions that don't provide defaults. */3526 return -ENODEV;3527 3528 if (protected)3529 /* Protected partitions are read only. */3530 erase_size = 0;3531 3532 /* If we've already exposed a partition of this type, hide this3533 * duplicate. All operations on MTDs are keyed by the type anyway,3534 * so we can't act on the duplicate.3535 */3536 if (__test_and_set_bit(type_idx, found))3537 return -EEXIST;3538 3539 part->nvram_type = type;3540 3541 MCDI_SET_DWORD(inbuf, NVRAM_METADATA_IN_TYPE, type);3542 rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_METADATA, inbuf, sizeof(inbuf),3543 outbuf, sizeof(outbuf), &outlen);3544 if (rc)3545 return rc;3546 if (outlen < MC_CMD_NVRAM_METADATA_OUT_LENMIN)3547 return -EIO;3548 if (MCDI_DWORD(outbuf, NVRAM_METADATA_OUT_FLAGS) &3549 (1 << MC_CMD_NVRAM_METADATA_OUT_SUBTYPE_VALID_LBN))3550 part->fw_subtype = MCDI_DWORD(outbuf,3551 NVRAM_METADATA_OUT_SUBTYPE);3552 3553 part->common.dev_type_name = "EF10 NVRAM manager";3554 part->common.type_name = info->name;3555 3556 part->common.mtd.type = MTD_NORFLASH;3557 part->common.mtd.flags = MTD_CAP_NORFLASH;3558 part->common.mtd.size = size;3559 part->common.mtd.erasesize = erase_size;3560 /* sfc_status is read-only */3561 if (!erase_size)3562 part->common.mtd.flags |= MTD_NO_ERASE;3563 3564 return 0;3565}3566 3567static int efx_ef10_mtd_probe(struct efx_nic *efx)3568{3569 MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX);3570 DECLARE_BITMAP(found, EF10_NVRAM_PARTITION_COUNT) = { 0 };3571 struct efx_mcdi_mtd_partition *parts;3572 size_t outlen, n_parts_total, i, n_parts;3573 unsigned int type;3574 int rc;3575 3576 ASSERT_RTNL();3577 3578 BUILD_BUG_ON(MC_CMD_NVRAM_PARTITIONS_IN_LEN != 0);3579 rc = efx_mcdi_rpc(efx, MC_CMD_NVRAM_PARTITIONS, NULL, 0,3580 outbuf, sizeof(outbuf), &outlen);3581 if (rc)3582 return rc;3583 if (outlen < MC_CMD_NVRAM_PARTITIONS_OUT_LENMIN)3584 return -EIO;3585 3586 n_parts_total = MCDI_DWORD(outbuf, NVRAM_PARTITIONS_OUT_NUM_PARTITIONS);3587 if (n_parts_total >3588 MCDI_VAR_ARRAY_LEN(outlen, NVRAM_PARTITIONS_OUT_TYPE_ID))3589 return -EIO;3590 3591 parts = kcalloc(n_parts_total, sizeof(*parts), GFP_KERNEL);3592 if (!parts)3593 return -ENOMEM;3594 3595 n_parts = 0;3596 for (i = 0; i < n_parts_total; i++) {3597 type = MCDI_ARRAY_DWORD(outbuf, NVRAM_PARTITIONS_OUT_TYPE_ID,3598 i);3599 rc = efx_ef10_mtd_probe_partition(efx, &parts[n_parts], type,3600 found);3601 if (rc == -EEXIST || rc == -ENODEV)3602 continue;3603 if (rc)3604 goto fail;3605 n_parts++;3606 }3607 3608 if (!n_parts) {3609 kfree(parts);3610 return 0;3611 }3612 3613 rc = efx_mtd_add(efx, &parts[0].common, n_parts, sizeof(*parts));3614fail:3615 if (rc)3616 kfree(parts);3617 return rc;3618}3619 3620#endif /* CONFIG_SFC_MTD */3621 3622static void efx_ef10_ptp_write_host_time(struct efx_nic *efx, u32 host_time)3623{3624 _efx_writed(efx, cpu_to_le32(host_time), ER_DZ_MC_DB_LWRD);3625}3626 3627static void efx_ef10_ptp_write_host_time_vf(struct efx_nic *efx,3628 u32 host_time) {}3629 3630static int efx_ef10_rx_enable_timestamping(struct efx_channel *channel,3631 bool temp)3632{3633 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_TIME_EVENT_SUBSCRIBE_LEN);3634 int rc;3635 3636 if (channel->sync_events_state == SYNC_EVENTS_REQUESTED ||3637 channel->sync_events_state == SYNC_EVENTS_VALID ||3638 (temp && channel->sync_events_state == SYNC_EVENTS_DISABLED))3639 return 0;3640 channel->sync_events_state = SYNC_EVENTS_REQUESTED;3641 3642 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_TIME_EVENT_SUBSCRIBE);3643 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);3644 MCDI_SET_DWORD(inbuf, PTP_IN_TIME_EVENT_SUBSCRIBE_QUEUE,3645 channel->channel);3646 3647 rc = efx_mcdi_rpc(channel->efx, MC_CMD_PTP,3648 inbuf, sizeof(inbuf), NULL, 0, NULL);3649 3650 if (rc != 0)3651 channel->sync_events_state = temp ? SYNC_EVENTS_QUIESCENT :3652 SYNC_EVENTS_DISABLED;3653 3654 return rc;3655}3656 3657static int efx_ef10_rx_disable_timestamping(struct efx_channel *channel,3658 bool temp)3659{3660 MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_TIME_EVENT_UNSUBSCRIBE_LEN);3661 int rc;3662 3663 if (channel->sync_events_state == SYNC_EVENTS_DISABLED ||3664 (temp && channel->sync_events_state == SYNC_EVENTS_QUIESCENT))3665 return 0;3666 if (channel->sync_events_state == SYNC_EVENTS_QUIESCENT) {3667 channel->sync_events_state = SYNC_EVENTS_DISABLED;3668 return 0;3669 }3670 channel->sync_events_state = temp ? SYNC_EVENTS_QUIESCENT :3671 SYNC_EVENTS_DISABLED;3672 3673 MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_TIME_EVENT_UNSUBSCRIBE);3674 MCDI_SET_DWORD(inbuf, PTP_IN_PERIPH_ID, 0);3675 MCDI_SET_DWORD(inbuf, PTP_IN_TIME_EVENT_UNSUBSCRIBE_CONTROL,3676 MC_CMD_PTP_IN_TIME_EVENT_UNSUBSCRIBE_SINGLE);3677 MCDI_SET_DWORD(inbuf, PTP_IN_TIME_EVENT_UNSUBSCRIBE_QUEUE,3678 channel->channel);3679 3680 rc = efx_mcdi_rpc(channel->efx, MC_CMD_PTP,3681 inbuf, sizeof(inbuf), NULL, 0, NULL);3682 3683 return rc;3684}3685 3686static int efx_ef10_ptp_set_ts_sync_events(struct efx_nic *efx, bool en,3687 bool temp)3688{3689 int (*set)(struct efx_channel *channel, bool temp);3690 struct efx_channel *channel;3691 3692 set = en ?3693 efx_ef10_rx_enable_timestamping :3694 efx_ef10_rx_disable_timestamping;3695 3696 channel = efx_ptp_channel(efx);3697 if (channel) {3698 int rc = set(channel, temp);3699 if (en && rc != 0) {3700 efx_ef10_ptp_set_ts_sync_events(efx, false, temp);3701 return rc;3702 }3703 }3704 3705 return 0;3706}3707 3708static int efx_ef10_ptp_set_ts_config_vf(struct efx_nic *efx,3709 struct kernel_hwtstamp_config *init)3710{3711 return -EOPNOTSUPP;3712}3713 3714static int efx_ef10_ptp_set_ts_config(struct efx_nic *efx,3715 struct kernel_hwtstamp_config *init)3716{3717 int rc;3718 3719 switch (init->rx_filter) {3720 case HWTSTAMP_FILTER_NONE:3721 efx_ef10_ptp_set_ts_sync_events(efx, false, false);3722 /* if TX timestamping is still requested then leave PTP on */3723 return efx_ptp_change_mode(efx,3724 init->tx_type != HWTSTAMP_TX_OFF, 0);3725 case HWTSTAMP_FILTER_ALL:3726 case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:3727 case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:3728 case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:3729 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:3730 case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:3731 case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:3732 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:3733 case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:3734 case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:3735 case HWTSTAMP_FILTER_PTP_V2_EVENT:3736 case HWTSTAMP_FILTER_PTP_V2_SYNC:3737 case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:3738 case HWTSTAMP_FILTER_NTP_ALL:3739 init->rx_filter = HWTSTAMP_FILTER_ALL;3740 rc = efx_ptp_change_mode(efx, true, 0);3741 if (!rc)3742 rc = efx_ef10_ptp_set_ts_sync_events(efx, true, false);3743 if (rc)3744 efx_ptp_change_mode(efx, false, 0);3745 return rc;3746 default:3747 return -ERANGE;3748 }3749}3750 3751static int efx_ef10_get_phys_port_id(struct efx_nic *efx,3752 struct netdev_phys_item_id *ppid)3753{3754 struct efx_ef10_nic_data *nic_data = efx->nic_data;3755 3756 if (!is_valid_ether_addr(nic_data->port_id))3757 return -EOPNOTSUPP;3758 3759 ppid->id_len = ETH_ALEN;3760 memcpy(ppid->id, nic_data->port_id, ppid->id_len);3761 3762 return 0;3763}3764 3765static int efx_ef10_vlan_rx_add_vid(struct efx_nic *efx, __be16 proto, u16 vid)3766{3767 if (proto != htons(ETH_P_8021Q))3768 return -EINVAL;3769 3770 return efx_ef10_add_vlan(efx, vid);3771}3772 3773static int efx_ef10_vlan_rx_kill_vid(struct efx_nic *efx, __be16 proto, u16 vid)3774{3775 if (proto != htons(ETH_P_8021Q))3776 return -EINVAL;3777 3778 return efx_ef10_del_vlan(efx, vid);3779}3780 3781/* We rely on the MCDI wiping out our TX rings if it made any changes to the3782 * ports table, ensuring that any TSO descriptors that were made on a now-3783 * removed tunnel port will be blown away and won't break things when we try3784 * to transmit them using the new ports table.3785 */3786static int efx_ef10_set_udp_tnl_ports(struct efx_nic *efx, bool unloading)3787{3788 struct efx_ef10_nic_data *nic_data = efx->nic_data;3789 MCDI_DECLARE_BUF(inbuf, MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_LENMAX);3790 MCDI_DECLARE_BUF(outbuf, MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_LEN);3791 bool will_reset = false;3792 size_t num_entries = 0;3793 size_t inlen, outlen;3794 size_t i;3795 int rc;3796 efx_dword_t flags_and_num_entries;3797 3798 WARN_ON(!mutex_is_locked(&nic_data->udp_tunnels_lock));3799 3800 nic_data->udp_tunnels_dirty = false;3801 3802 if (!(nic_data->datapath_caps &3803 (1 << MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN))) {3804 efx_device_attach_if_not_resetting(efx);3805 return 0;3806 }3807 3808 BUILD_BUG_ON(ARRAY_SIZE(nic_data->udp_tunnels) >3809 MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES_MAXNUM);3810 3811 for (i = 0; i < ARRAY_SIZE(nic_data->udp_tunnels); ++i) {3812 if (nic_data->udp_tunnels[i].type !=3813 TUNNEL_ENCAP_UDP_PORT_ENTRY_INVALID) {3814 efx_dword_t entry;3815 3816 EFX_POPULATE_DWORD_2(entry,3817 TUNNEL_ENCAP_UDP_PORT_ENTRY_UDP_PORT,3818 ntohs(nic_data->udp_tunnels[i].port),3819 TUNNEL_ENCAP_UDP_PORT_ENTRY_PROTOCOL,3820 nic_data->udp_tunnels[i].type);3821 *_MCDI_ARRAY_DWORD(inbuf,3822 SET_TUNNEL_ENCAP_UDP_PORTS_IN_ENTRIES,3823 num_entries++) = entry;3824 }3825 }3826 3827 BUILD_BUG_ON((MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_NUM_ENTRIES_OFST -3828 MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS_OFST) * 8 !=3829 EFX_WORD_1_LBN);3830 BUILD_BUG_ON(MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_NUM_ENTRIES_LEN * 8 !=3831 EFX_WORD_1_WIDTH);3832 EFX_POPULATE_DWORD_2(flags_and_num_entries,3833 MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_UNLOADING,3834 !!unloading,3835 EFX_WORD_1, num_entries);3836 *_MCDI_DWORD(inbuf, SET_TUNNEL_ENCAP_UDP_PORTS_IN_FLAGS) =3837 flags_and_num_entries;3838 3839 inlen = MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_IN_LEN(num_entries);3840 3841 rc = efx_mcdi_rpc_quiet(efx, MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS,3842 inbuf, inlen, outbuf, sizeof(outbuf), &outlen);3843 if (rc == -EIO) {3844 /* Most likely the MC rebooted due to another function also3845 * setting its tunnel port list. Mark the tunnel port list as3846 * dirty, so it will be pushed upon coming up from the reboot.3847 */3848 nic_data->udp_tunnels_dirty = true;3849 return 0;3850 }3851 3852 if (rc) {3853 /* expected not available on unprivileged functions */3854 if (rc != -EPERM)3855 netif_warn(efx, drv, efx->net_dev,3856 "Unable to set UDP tunnel ports; rc=%d.\n", rc);3857 } else if (MCDI_DWORD(outbuf, SET_TUNNEL_ENCAP_UDP_PORTS_OUT_FLAGS) &3858 (1 << MC_CMD_SET_TUNNEL_ENCAP_UDP_PORTS_OUT_RESETTING_LBN)) {3859 netif_info(efx, drv, efx->net_dev,3860 "Rebooting MC due to UDP tunnel port list change\n");3861 will_reset = true;3862 if (unloading)3863 /* Delay for the MC reset to complete. This will make3864 * unloading other functions a bit smoother. This is a3865 * race, but the other unload will work whichever way3866 * it goes, this just avoids an unnecessary error3867 * message.3868 */3869 msleep(100);3870 }3871 if (!will_reset && !unloading) {3872 /* The caller will have detached, relying on the MC reset to3873 * trigger a re-attach. Since there won't be an MC reset, we3874 * have to do the attach ourselves.3875 */3876 efx_device_attach_if_not_resetting(efx);3877 }3878 3879 return rc;3880}3881 3882static int efx_ef10_udp_tnl_push_ports(struct efx_nic *efx)3883{3884 struct efx_ef10_nic_data *nic_data = efx->nic_data;3885 int rc = 0;3886 3887 mutex_lock(&nic_data->udp_tunnels_lock);3888 if (nic_data->udp_tunnels_dirty) {3889 /* Make sure all TX are stopped while we modify the table, else3890 * we might race against an efx_features_check().3891 */3892 efx_device_detach_sync(efx);3893 rc = efx_ef10_set_udp_tnl_ports(efx, false);3894 }3895 mutex_unlock(&nic_data->udp_tunnels_lock);3896 return rc;3897}3898 3899static int efx_ef10_udp_tnl_set_port(struct net_device *dev,3900 unsigned int table, unsigned int entry,3901 struct udp_tunnel_info *ti)3902{3903 struct efx_nic *efx = efx_netdev_priv(dev);3904 struct efx_ef10_nic_data *nic_data;3905 int efx_tunnel_type, rc;3906 3907 if (ti->type == UDP_TUNNEL_TYPE_VXLAN)3908 efx_tunnel_type = TUNNEL_ENCAP_UDP_PORT_ENTRY_VXLAN;3909 else3910 efx_tunnel_type = TUNNEL_ENCAP_UDP_PORT_ENTRY_GENEVE;3911 3912 nic_data = efx->nic_data;3913 if (!(nic_data->datapath_caps &3914 (1 << MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN)))3915 return -EOPNOTSUPP;3916 3917 mutex_lock(&nic_data->udp_tunnels_lock);3918 /* Make sure all TX are stopped while we add to the table, else we3919 * might race against an efx_features_check().3920 */3921 efx_device_detach_sync(efx);3922 nic_data->udp_tunnels[entry].type = efx_tunnel_type;3923 nic_data->udp_tunnels[entry].port = ti->port;3924 rc = efx_ef10_set_udp_tnl_ports(efx, false);3925 mutex_unlock(&nic_data->udp_tunnels_lock);3926 3927 return rc;3928}3929 3930/* Called under the TX lock with the TX queue running, hence no-one can be3931 * in the middle of updating the UDP tunnels table. However, they could3932 * have tried and failed the MCDI, in which case they'll have set the dirty3933 * flag before dropping their locks.3934 */3935static bool efx_ef10_udp_tnl_has_port(struct efx_nic *efx, __be16 port)3936{3937 struct efx_ef10_nic_data *nic_data = efx->nic_data;3938 size_t i;3939 3940 if (!(nic_data->datapath_caps &3941 (1 << MC_CMD_GET_CAPABILITIES_OUT_VXLAN_NVGRE_LBN)))3942 return false;3943 3944 if (nic_data->udp_tunnels_dirty)3945 /* SW table may not match HW state, so just assume we can't3946 * use any UDP tunnel offloads.3947 */3948 return false;3949 3950 for (i = 0; i < ARRAY_SIZE(nic_data->udp_tunnels); ++i)3951 if (nic_data->udp_tunnels[i].type !=3952 TUNNEL_ENCAP_UDP_PORT_ENTRY_INVALID &&3953 nic_data->udp_tunnels[i].port == port)3954 return true;3955 3956 return false;3957}3958 3959static int efx_ef10_udp_tnl_unset_port(struct net_device *dev,3960 unsigned int table, unsigned int entry,3961 struct udp_tunnel_info *ti)3962{3963 struct efx_nic *efx = efx_netdev_priv(dev);3964 struct efx_ef10_nic_data *nic_data;3965 int rc;3966 3967 nic_data = efx->nic_data;3968 3969 mutex_lock(&nic_data->udp_tunnels_lock);3970 /* Make sure all TX are stopped while we remove from the table, else we3971 * might race against an efx_features_check().3972 */3973 efx_device_detach_sync(efx);3974 nic_data->udp_tunnels[entry].type = TUNNEL_ENCAP_UDP_PORT_ENTRY_INVALID;3975 nic_data->udp_tunnels[entry].port = 0;3976 rc = efx_ef10_set_udp_tnl_ports(efx, false);3977 mutex_unlock(&nic_data->udp_tunnels_lock);3978 3979 return rc;3980}3981 3982static const struct udp_tunnel_nic_info efx_ef10_udp_tunnels = {3983 .set_port = efx_ef10_udp_tnl_set_port,3984 .unset_port = efx_ef10_udp_tnl_unset_port,3985 .flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP,3986 .tables = {3987 {3988 .n_entries = 16,3989 .tunnel_types = UDP_TUNNEL_TYPE_VXLAN |3990 UDP_TUNNEL_TYPE_GENEVE,3991 },3992 },3993};3994 3995/* EF10 may have multiple datapath firmware variants within a3996 * single version. Report which variants are running.3997 */3998static size_t efx_ef10_print_additional_fwver(struct efx_nic *efx, char *buf,3999 size_t len)4000{4001 struct efx_ef10_nic_data *nic_data = efx->nic_data;4002 4003 return scnprintf(buf, len, " rx%x tx%x",4004 nic_data->rx_dpcpu_fw_id,4005 nic_data->tx_dpcpu_fw_id);4006}4007 4008static unsigned int ef10_check_caps(const struct efx_nic *efx,4009 u8 flag,4010 u32 offset)4011{4012 const struct efx_ef10_nic_data *nic_data = efx->nic_data;4013 4014 switch (offset) {4015 case(MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS1_OFST):4016 return nic_data->datapath_caps & BIT_ULL(flag);4017 case(MC_CMD_GET_CAPABILITIES_V4_OUT_FLAGS2_OFST):4018 return nic_data->datapath_caps2 & BIT_ULL(flag);4019 default:4020 return 0;4021 }4022}4023 4024static unsigned int efx_ef10_recycle_ring_size(const struct efx_nic *efx)4025{4026 unsigned int ret = EFX_RECYCLE_RING_SIZE_10G;4027 4028 /* There is no difference between PFs and VFs. The side is based on4029 * the maximum link speed of a given NIC.4030 */4031 switch (efx->pci_dev->device & 0xfff) {4032 case 0x0903: /* Farmingdale can do up to 10G */4033 break;4034 case 0x0923: /* Greenport can do up to 40G */4035 case 0x0a03: /* Medford can do up to 40G */4036 ret *= 4;4037 break;4038 default: /* Medford2 can do up to 100G */4039 ret *= 10;4040 }4041 4042 if (IS_ENABLED(CONFIG_PPC64))4043 ret *= 4;4044 4045 return ret;4046}4047 4048#define EF10_OFFLOAD_FEATURES \4049 (NETIF_F_IP_CSUM | \4050 NETIF_F_HW_VLAN_CTAG_FILTER | \4051 NETIF_F_IPV6_CSUM | \4052 NETIF_F_RXHASH | \4053 NETIF_F_NTUPLE | \4054 NETIF_F_SG | \4055 NETIF_F_RXCSUM | \4056 NETIF_F_RXALL)4057 4058const struct efx_nic_type efx_hunt_a0_vf_nic_type = {4059 .is_vf = true,4060 .mem_bar = efx_ef10_vf_mem_bar,4061 .mem_map_size = efx_ef10_mem_map_size,4062 .probe = efx_ef10_probe_vf,4063 .remove = efx_ef10_remove,4064 .dimension_resources = efx_ef10_dimension_resources,4065 .init = efx_ef10_init_nic,4066 .fini = efx_ef10_fini_nic,4067 .map_reset_reason = efx_ef10_map_reset_reason,4068 .map_reset_flags = efx_ef10_map_reset_flags,4069 .reset = efx_ef10_reset,4070 .probe_port = efx_mcdi_port_probe,4071 .remove_port = efx_mcdi_port_remove,4072 .fini_dmaq = efx_fini_dmaq,4073 .prepare_flr = efx_ef10_prepare_flr,4074 .finish_flr = efx_port_dummy_op_void,4075 .describe_stats = efx_ef10_describe_stats,4076 .update_stats = efx_ef10_update_stats_vf,4077 .update_stats_atomic = efx_ef10_update_stats_atomic_vf,4078 .start_stats = efx_port_dummy_op_void,4079 .pull_stats = efx_port_dummy_op_void,4080 .stop_stats = efx_port_dummy_op_void,4081 .push_irq_moderation = efx_ef10_push_irq_moderation,4082 .reconfigure_mac = efx_ef10_mac_reconfigure,4083 .check_mac_fault = efx_mcdi_mac_check_fault,4084 .reconfigure_port = efx_mcdi_port_reconfigure,4085 .get_wol = efx_ef10_get_wol_vf,4086 .set_wol = efx_ef10_set_wol_vf,4087 .resume_wol = efx_port_dummy_op_void,4088 .mcdi_request = efx_ef10_mcdi_request,4089 .mcdi_poll_response = efx_ef10_mcdi_poll_response,4090 .mcdi_read_response = efx_ef10_mcdi_read_response,4091 .mcdi_poll_reboot = efx_ef10_mcdi_poll_reboot,4092 .mcdi_reboot_detected = efx_ef10_mcdi_reboot_detected,4093 .irq_enable_master = efx_port_dummy_op_void,4094 .irq_test_generate = efx_ef10_irq_test_generate,4095 .irq_disable_non_ev = efx_port_dummy_op_void,4096 .irq_handle_msi = efx_ef10_msi_interrupt,4097 .irq_handle_legacy = efx_ef10_legacy_interrupt,4098 .tx_probe = efx_ef10_tx_probe,4099 .tx_init = efx_ef10_tx_init,4100 .tx_remove = efx_mcdi_tx_remove,4101 .tx_write = efx_ef10_tx_write,4102 .tx_limit_len = efx_ef10_tx_limit_len,4103 .tx_enqueue = __efx_enqueue_skb,4104 .rx_push_rss_config = efx_mcdi_vf_rx_push_rss_config,4105 .rx_pull_rss_config = efx_mcdi_rx_pull_rss_config,4106 .rx_probe = efx_mcdi_rx_probe,4107 .rx_init = efx_mcdi_rx_init,4108 .rx_remove = efx_mcdi_rx_remove,4109 .rx_write = efx_ef10_rx_write,4110 .rx_defer_refill = efx_ef10_rx_defer_refill,4111 .rx_packet = __efx_rx_packet,4112 .ev_probe = efx_mcdi_ev_probe,4113 .ev_init = efx_ef10_ev_init,4114 .ev_fini = efx_mcdi_ev_fini,4115 .ev_remove = efx_mcdi_ev_remove,4116 .ev_process = efx_ef10_ev_process,4117 .ev_read_ack = efx_ef10_ev_read_ack,4118 .ev_test_generate = efx_ef10_ev_test_generate,4119 .filter_table_probe = efx_ef10_filter_table_probe,4120 .filter_table_restore = efx_mcdi_filter_table_restore,4121 .filter_table_remove = efx_ef10_filter_table_remove,4122 .filter_update_rx_scatter = efx_mcdi_update_rx_scatter,4123 .filter_insert = efx_mcdi_filter_insert,4124 .filter_remove_safe = efx_mcdi_filter_remove_safe,4125 .filter_get_safe = efx_mcdi_filter_get_safe,4126 .filter_clear_rx = efx_mcdi_filter_clear_rx,4127 .filter_count_rx_used = efx_mcdi_filter_count_rx_used,4128 .filter_get_rx_id_limit = efx_mcdi_filter_get_rx_id_limit,4129 .filter_get_rx_ids = efx_mcdi_filter_get_rx_ids,4130#ifdef CONFIG_RFS_ACCEL4131 .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one,4132#endif4133#ifdef CONFIG_SFC_MTD4134 .mtd_probe = efx_port_dummy_op_int,4135#endif4136 .ptp_write_host_time = efx_ef10_ptp_write_host_time_vf,4137 .ptp_set_ts_config = efx_ef10_ptp_set_ts_config_vf,4138 .vlan_rx_add_vid = efx_ef10_vlan_rx_add_vid,4139 .vlan_rx_kill_vid = efx_ef10_vlan_rx_kill_vid,4140#ifdef CONFIG_SFC_SRIOV4141 .vswitching_probe = efx_ef10_vswitching_probe_vf,4142 .vswitching_restore = efx_ef10_vswitching_restore_vf,4143 .vswitching_remove = efx_ef10_vswitching_remove_vf,4144#endif4145 .get_mac_address = efx_ef10_get_mac_address_vf,4146 .set_mac_address = efx_ef10_set_mac_address,4147 4148 .get_phys_port_id = efx_ef10_get_phys_port_id,4149 .revision = EFX_REV_HUNT_A0,4150 .max_dma_mask = DMA_BIT_MASK(ESF_DZ_TX_KER_BUF_ADDR_WIDTH),4151 .rx_prefix_size = ES_DZ_RX_PREFIX_SIZE,4152 .rx_hash_offset = ES_DZ_RX_PREFIX_HASH_OFST,4153 .rx_ts_offset = ES_DZ_RX_PREFIX_TSTAMP_OFST,4154 .can_rx_scatter = true,4155 .always_rx_scatter = true,4156 .min_interrupt_mode = EFX_INT_MODE_MSIX,4157 .timer_period_max = 1 << ERF_DD_EVQ_IND_TIMER_VAL_WIDTH,4158 .offload_features = EF10_OFFLOAD_FEATURES,4159 .mcdi_max_ver = 2,4160 .max_rx_ip_filters = EFX_MCDI_FILTER_TBL_ROWS,4161 .hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |4162 1 << HWTSTAMP_FILTER_ALL,4163 .rx_hash_key_size = 40,4164 .check_caps = ef10_check_caps,4165 .print_additional_fwver = efx_ef10_print_additional_fwver,4166 .sensor_event = efx_mcdi_sensor_event,4167 .rx_recycle_ring_size = efx_ef10_recycle_ring_size,4168};4169 4170const struct efx_nic_type efx_hunt_a0_nic_type = {4171 .is_vf = false,4172 .mem_bar = efx_ef10_pf_mem_bar,4173 .mem_map_size = efx_ef10_mem_map_size,4174 .probe = efx_ef10_probe_pf,4175 .remove = efx_ef10_remove,4176 .dimension_resources = efx_ef10_dimension_resources,4177 .init = efx_ef10_init_nic,4178 .fini = efx_ef10_fini_nic,4179 .map_reset_reason = efx_ef10_map_reset_reason,4180 .map_reset_flags = efx_ef10_map_reset_flags,4181 .reset = efx_ef10_reset,4182 .probe_port = efx_mcdi_port_probe,4183 .remove_port = efx_mcdi_port_remove,4184 .fini_dmaq = efx_fini_dmaq,4185 .prepare_flr = efx_ef10_prepare_flr,4186 .finish_flr = efx_port_dummy_op_void,4187 .describe_stats = efx_ef10_describe_stats,4188 .update_stats = efx_ef10_update_stats_pf,4189 .start_stats = efx_mcdi_mac_start_stats,4190 .pull_stats = efx_mcdi_mac_pull_stats,4191 .stop_stats = efx_mcdi_mac_stop_stats,4192 .push_irq_moderation = efx_ef10_push_irq_moderation,4193 .reconfigure_mac = efx_ef10_mac_reconfigure,4194 .check_mac_fault = efx_mcdi_mac_check_fault,4195 .reconfigure_port = efx_mcdi_port_reconfigure,4196 .get_wol = efx_ef10_get_wol,4197 .set_wol = efx_ef10_set_wol,4198 .resume_wol = efx_port_dummy_op_void,4199 .get_fec_stats = efx_ef10_get_fec_stats,4200 .test_chip = efx_ef10_test_chip,4201 .test_nvram = efx_mcdi_nvram_test_all,4202 .mcdi_request = efx_ef10_mcdi_request,4203 .mcdi_poll_response = efx_ef10_mcdi_poll_response,4204 .mcdi_read_response = efx_ef10_mcdi_read_response,4205 .mcdi_poll_reboot = efx_ef10_mcdi_poll_reboot,4206 .mcdi_reboot_detected = efx_ef10_mcdi_reboot_detected,4207 .irq_enable_master = efx_port_dummy_op_void,4208 .irq_test_generate = efx_ef10_irq_test_generate,4209 .irq_disable_non_ev = efx_port_dummy_op_void,4210 .irq_handle_msi = efx_ef10_msi_interrupt,4211 .irq_handle_legacy = efx_ef10_legacy_interrupt,4212 .tx_probe = efx_ef10_tx_probe,4213 .tx_init = efx_ef10_tx_init,4214 .tx_remove = efx_mcdi_tx_remove,4215 .tx_write = efx_ef10_tx_write,4216 .tx_limit_len = efx_ef10_tx_limit_len,4217 .tx_enqueue = __efx_enqueue_skb,4218 .rx_push_rss_config = efx_mcdi_pf_rx_push_rss_config,4219 .rx_pull_rss_config = efx_mcdi_rx_pull_rss_config,4220 .rx_push_rss_context_config = efx_mcdi_rx_push_rss_context_config,4221 .rx_pull_rss_context_config = efx_mcdi_rx_pull_rss_context_config,4222 .rx_restore_rss_contexts = efx_mcdi_rx_restore_rss_contexts,4223 .rx_probe = efx_mcdi_rx_probe,4224 .rx_init = efx_mcdi_rx_init,4225 .rx_remove = efx_mcdi_rx_remove,4226 .rx_write = efx_ef10_rx_write,4227 .rx_defer_refill = efx_ef10_rx_defer_refill,4228 .rx_packet = __efx_rx_packet,4229 .ev_probe = efx_mcdi_ev_probe,4230 .ev_init = efx_ef10_ev_init,4231 .ev_fini = efx_mcdi_ev_fini,4232 .ev_remove = efx_mcdi_ev_remove,4233 .ev_process = efx_ef10_ev_process,4234 .ev_read_ack = efx_ef10_ev_read_ack,4235 .ev_test_generate = efx_ef10_ev_test_generate,4236 .filter_table_probe = efx_ef10_filter_table_probe,4237 .filter_table_restore = efx_mcdi_filter_table_restore,4238 .filter_table_remove = efx_ef10_filter_table_remove,4239 .filter_update_rx_scatter = efx_mcdi_update_rx_scatter,4240 .filter_insert = efx_mcdi_filter_insert,4241 .filter_remove_safe = efx_mcdi_filter_remove_safe,4242 .filter_get_safe = efx_mcdi_filter_get_safe,4243 .filter_clear_rx = efx_mcdi_filter_clear_rx,4244 .filter_count_rx_used = efx_mcdi_filter_count_rx_used,4245 .filter_get_rx_id_limit = efx_mcdi_filter_get_rx_id_limit,4246 .filter_get_rx_ids = efx_mcdi_filter_get_rx_ids,4247#ifdef CONFIG_RFS_ACCEL4248 .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one,4249#endif4250#ifdef CONFIG_SFC_MTD4251 .mtd_probe = efx_ef10_mtd_probe,4252 .mtd_rename = efx_mcdi_mtd_rename,4253 .mtd_read = efx_mcdi_mtd_read,4254 .mtd_erase = efx_mcdi_mtd_erase,4255 .mtd_write = efx_mcdi_mtd_write,4256 .mtd_sync = efx_mcdi_mtd_sync,4257#endif4258 .ptp_write_host_time = efx_ef10_ptp_write_host_time,4259 .ptp_set_ts_sync_events = efx_ef10_ptp_set_ts_sync_events,4260 .ptp_set_ts_config = efx_ef10_ptp_set_ts_config,4261 .vlan_rx_add_vid = efx_ef10_vlan_rx_add_vid,4262 .vlan_rx_kill_vid = efx_ef10_vlan_rx_kill_vid,4263 .udp_tnl_push_ports = efx_ef10_udp_tnl_push_ports,4264 .udp_tnl_has_port = efx_ef10_udp_tnl_has_port,4265#ifdef CONFIG_SFC_SRIOV4266 .sriov_configure = efx_ef10_sriov_configure,4267 .sriov_init = efx_ef10_sriov_init,4268 .sriov_fini = efx_ef10_sriov_fini,4269 .sriov_wanted = efx_ef10_sriov_wanted,4270 .sriov_set_vf_mac = efx_ef10_sriov_set_vf_mac,4271 .sriov_set_vf_vlan = efx_ef10_sriov_set_vf_vlan,4272 .sriov_set_vf_spoofchk = efx_ef10_sriov_set_vf_spoofchk,4273 .sriov_get_vf_config = efx_ef10_sriov_get_vf_config,4274 .sriov_set_vf_link_state = efx_ef10_sriov_set_vf_link_state,4275 .vswitching_probe = efx_ef10_vswitching_probe_pf,4276 .vswitching_restore = efx_ef10_vswitching_restore_pf,4277 .vswitching_remove = efx_ef10_vswitching_remove_pf,4278#endif4279 .get_mac_address = efx_ef10_get_mac_address_pf,4280 .set_mac_address = efx_ef10_set_mac_address,4281 .tso_versions = efx_ef10_tso_versions,4282 4283 .get_phys_port_id = efx_ef10_get_phys_port_id,4284 .revision = EFX_REV_HUNT_A0,4285 .max_dma_mask = DMA_BIT_MASK(ESF_DZ_TX_KER_BUF_ADDR_WIDTH),4286 .rx_prefix_size = ES_DZ_RX_PREFIX_SIZE,4287 .rx_hash_offset = ES_DZ_RX_PREFIX_HASH_OFST,4288 .rx_ts_offset = ES_DZ_RX_PREFIX_TSTAMP_OFST,4289 .can_rx_scatter = true,4290 .always_rx_scatter = true,4291 .option_descriptors = true,4292 .min_interrupt_mode = EFX_INT_MODE_LEGACY,4293 .timer_period_max = 1 << ERF_DD_EVQ_IND_TIMER_VAL_WIDTH,4294 .offload_features = EF10_OFFLOAD_FEATURES,4295 .mcdi_max_ver = 2,4296 .max_rx_ip_filters = EFX_MCDI_FILTER_TBL_ROWS,4297 .hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |4298 1 << HWTSTAMP_FILTER_ALL,4299 .rx_hash_key_size = 40,4300 .check_caps = ef10_check_caps,4301 .print_additional_fwver = efx_ef10_print_additional_fwver,4302 .sensor_event = efx_mcdi_sensor_event,4303 .rx_recycle_ring_size = efx_ef10_recycle_ring_size,4304};4305 4306const struct efx_nic_type efx_x4_nic_type = {4307 .is_vf = false,4308 .mem_bar = efx_ef10_pf_mem_bar,4309 .mem_map_size = efx_ef10_mem_map_size,4310 .probe = efx_ef10_probe_pf,4311 .remove = efx_ef10_remove,4312 .dimension_resources = efx_ef10_dimension_resources,4313 .init = efx_ef10_init_nic,4314 .fini = efx_ef10_fini_nic,4315 .map_reset_reason = efx_ef10_map_reset_reason,4316 .map_reset_flags = efx_ef10_map_reset_flags,4317 .reset = efx_ef10_reset,4318 .probe_port = efx_mcdi_port_probe,4319 .remove_port = efx_mcdi_port_remove,4320 .fini_dmaq = efx_fini_dmaq,4321 .prepare_flr = efx_ef10_prepare_flr,4322 .finish_flr = efx_port_dummy_op_void,4323 .describe_stats = efx_ef10_describe_stats,4324 .update_stats = efx_ef10_update_stats_pf,4325 .start_stats = efx_mcdi_mac_start_stats,4326 .pull_stats = efx_mcdi_mac_pull_stats,4327 .stop_stats = efx_mcdi_mac_stop_stats,4328 .push_irq_moderation = efx_ef10_push_irq_moderation,4329 .reconfigure_mac = efx_ef10_mac_reconfigure,4330 .check_mac_fault = efx_mcdi_mac_check_fault,4331 .reconfigure_port = efx_mcdi_port_reconfigure,4332 .get_wol = efx_ef10_get_wol,4333 .set_wol = efx_ef10_set_wol,4334 .resume_wol = efx_port_dummy_op_void,4335 .get_fec_stats = efx_ef10_get_fec_stats,4336 .test_chip = efx_ef10_test_chip,4337 .test_nvram = efx_mcdi_nvram_test_all,4338 .mcdi_request = efx_ef10_mcdi_request,4339 .mcdi_poll_response = efx_ef10_mcdi_poll_response,4340 .mcdi_read_response = efx_ef10_mcdi_read_response,4341 .mcdi_poll_reboot = efx_ef10_mcdi_poll_reboot,4342 .mcdi_reboot_detected = efx_ef10_mcdi_reboot_detected,4343 .irq_enable_master = efx_port_dummy_op_void,4344 .irq_test_generate = efx_ef10_irq_test_generate,4345 .irq_disable_non_ev = efx_port_dummy_op_void,4346 .irq_handle_msi = efx_ef10_msi_interrupt,4347 .tx_probe = efx_ef10_tx_probe,4348 .tx_init = efx_ef10_tx_init,4349 .tx_write = efx_ef10_tx_write,4350 .tx_limit_len = efx_ef10_tx_limit_len,4351 .tx_enqueue = __efx_enqueue_skb,4352 .rx_push_rss_config = efx_mcdi_pf_rx_push_rss_config,4353 .rx_pull_rss_config = efx_mcdi_rx_pull_rss_config,4354 .rx_push_rss_context_config = efx_mcdi_rx_push_rss_context_config,4355 .rx_pull_rss_context_config = efx_mcdi_rx_pull_rss_context_config,4356 .rx_restore_rss_contexts = efx_mcdi_rx_restore_rss_contexts,4357 .rx_probe = efx_mcdi_rx_probe,4358 .rx_init = efx_mcdi_rx_init,4359 .rx_remove = efx_mcdi_rx_remove,4360 .rx_write = efx_ef10_rx_write,4361 .rx_defer_refill = efx_ef10_rx_defer_refill,4362 .rx_packet = __efx_rx_packet,4363 .ev_probe = efx_mcdi_ev_probe,4364 .ev_init = efx_ef10_ev_init,4365 .ev_fini = efx_mcdi_ev_fini,4366 .ev_remove = efx_mcdi_ev_remove,4367 .ev_process = efx_ef10_ev_process,4368 .ev_read_ack = efx_ef10_ev_read_ack,4369 .ev_test_generate = efx_ef10_ev_test_generate,4370 .filter_table_probe = efx_ef10_filter_table_probe,4371 .filter_table_restore = efx_mcdi_filter_table_restore,4372 .filter_table_remove = efx_ef10_filter_table_remove,4373 .filter_insert = efx_mcdi_filter_insert,4374 .filter_remove_safe = efx_mcdi_filter_remove_safe,4375 .filter_get_safe = efx_mcdi_filter_get_safe,4376 .filter_clear_rx = efx_mcdi_filter_clear_rx,4377 .filter_count_rx_used = efx_mcdi_filter_count_rx_used,4378 .filter_get_rx_id_limit = efx_mcdi_filter_get_rx_id_limit,4379 .filter_get_rx_ids = efx_mcdi_filter_get_rx_ids,4380#ifdef CONFIG_RFS_ACCEL4381 .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one,4382#endif4383#ifdef CONFIG_SFC_MTD4384 .mtd_probe = efx_ef10_mtd_probe,4385 .mtd_rename = efx_mcdi_mtd_rename,4386 .mtd_read = efx_mcdi_mtd_read,4387 .mtd_erase = efx_mcdi_mtd_erase,4388 .mtd_write = efx_mcdi_mtd_write,4389 .mtd_sync = efx_mcdi_mtd_sync,4390#endif4391 .ptp_write_host_time = efx_ef10_ptp_write_host_time,4392 .ptp_set_ts_sync_events = efx_ef10_ptp_set_ts_sync_events,4393 .ptp_set_ts_config = efx_ef10_ptp_set_ts_config,4394 .vlan_rx_add_vid = efx_ef10_vlan_rx_add_vid,4395 .vlan_rx_kill_vid = efx_ef10_vlan_rx_kill_vid,4396 .udp_tnl_push_ports = efx_ef10_udp_tnl_push_ports,4397 .udp_tnl_has_port = efx_ef10_udp_tnl_has_port,4398#ifdef CONFIG_SFC_SRIOV4399 /* currently set to the VF versions of these functions4400 * because SRIOV will be reimplemented later.4401 */4402 .vswitching_probe = efx_ef10_vswitching_probe_vf,4403 .vswitching_restore = efx_ef10_vswitching_restore_vf,4404 .vswitching_remove = efx_ef10_vswitching_remove_vf,4405#endif4406 .get_mac_address = efx_ef10_get_mac_address_pf,4407 .set_mac_address = efx_ef10_set_mac_address,4408 .tso_versions = efx_ef10_tso_versions,4409 4410 .get_phys_port_id = efx_ef10_get_phys_port_id,4411 .revision = EFX_REV_X4,4412 .max_dma_mask = DMA_BIT_MASK(ESF_DZ_TX_KER_BUF_ADDR_WIDTH),4413 .rx_prefix_size = ES_DZ_RX_PREFIX_SIZE,4414 .rx_hash_offset = ES_DZ_RX_PREFIX_HASH_OFST,4415 .rx_ts_offset = ES_DZ_RX_PREFIX_TSTAMP_OFST,4416 .can_rx_scatter = true,4417 .always_rx_scatter = true,4418 .option_descriptors = true,4419 .min_interrupt_mode = EFX_INT_MODE_MSIX,4420 .timer_period_max = 1 << ERF_DD_EVQ_IND_TIMER_VAL_WIDTH,4421 .offload_features = EF10_OFFLOAD_FEATURES,4422 .mcdi_max_ver = 2,4423 .max_rx_ip_filters = EFX_MCDI_FILTER_TBL_ROWS,4424 .hwtstamp_filters = 1 << HWTSTAMP_FILTER_NONE |4425 1 << HWTSTAMP_FILTER_ALL,4426 .check_caps = ef10_check_caps,4427 .print_additional_fwver = efx_ef10_print_additional_fwver,4428 .sensor_event = efx_mcdi_sensor_event,4429 .rx_recycle_ring_size = efx_ef10_recycle_ring_size,4430};4431 4432