Message ID | aabd5205-0d9e-219f-2f0b-0029cd95a6cc@solarflare.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | sfc: driver for EF100 family NICs, part 2 | expand |
Hi Edward, I love your patch! Yet something to improve: [auto build test ERROR on net-next/master] url: https://github.com/0day-ci/linux/commits/Edward-Cree/sfc-driver-for-EF100-family-NICs-part-2/20200730-224221 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 41d707b7332f1386642c47eb078110ca368a46f5 config: xtensa-allyesconfig (attached as .config) compiler: xtensa-linux-gcc (GCC) 9.3.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): >> drivers/net/ethernet/sfc/ef100_nic.c:537:3: error: 'const struct efx_nic_type' has no member named 'filter_rfs_expire_one' 537 | .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one, | ^~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/sfc/ef100_nic.c:537:27: error: initialization of 'int (*)(struct efx_nic *)' from incompatible pointer type 'bool (*)(struct efx_nic *, u32, unsigned int)' {aka '_Bool (*)(struct efx_nic *, unsigned int, unsigned int)'} [-Werror=incompatible-pointer-types] 537 | .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/ethernet/sfc/ef100_nic.c:537:27: note: (near initialization for 'ef100_pf_nic_type.mtd_probe') cc1: some warnings being treated as errors vim +537 drivers/net/ethernet/sfc/ef100_nic.c 482 483 /* NIC level access functions 484 */ 485 #define EF100_OFFLOAD_FEATURES (NETIF_F_HW_CSUM | \ 486 NETIF_F_HIGHDMA | NETIF_F_SG | NETIF_F_FRAGLIST | \ 487 NETIF_F_TSO_ECN | NETIF_F_TSO_MANGLEID | NETIF_F_HW_VLAN_CTAG_TX) 488 489 const struct efx_nic_type ef100_pf_nic_type = { 490 .revision = EFX_REV_EF100, 491 .is_vf = false, 492 .probe = ef100_probe_pf, 493 .offload_features = EF100_OFFLOAD_FEATURES, 494 .mcdi_max_ver = 2, 495 .mcdi_request = ef100_mcdi_request, 496 .mcdi_poll_response = ef100_mcdi_poll_response, 497 .mcdi_read_response = ef100_mcdi_read_response, 498 .mcdi_poll_reboot = ef100_mcdi_poll_reboot, 499 .mcdi_reboot_detected = ef100_mcdi_reboot_detected, 500 .irq_enable_master = efx_port_dummy_op_void, 501 .irq_disable_non_ev = efx_port_dummy_op_void, 502 .push_irq_moderation = efx_channel_dummy_op_void, 503 .min_interrupt_mode = EFX_INT_MODE_MSIX, 504 .map_reset_reason = ef100_map_reset_reason, 505 .map_reset_flags = ef100_map_reset_flags, 506 .reset = ef100_reset, 507 508 .check_caps = ef100_check_caps, 509 510 .ev_probe = ef100_ev_probe, 511 .ev_init = ef100_ev_init, 512 .ev_fini = efx_mcdi_ev_fini, 513 .ev_remove = efx_mcdi_ev_remove, 514 .irq_handle_msi = ef100_msi_interrupt, 515 .ev_process = ef100_ev_process, 516 .ev_read_ack = ef100_ev_read_ack, 517 .tx_probe = ef100_tx_probe, 518 .tx_init = ef100_tx_init, 519 .tx_write = ef100_tx_write, 520 .tx_enqueue = ef100_enqueue_skb, 521 .rx_probe = efx_mcdi_rx_probe, 522 .rx_init = efx_mcdi_rx_init, 523 .rx_remove = efx_mcdi_rx_remove, 524 .rx_write = ef100_rx_write, 525 .rx_packet = __ef100_rx_packet, 526 .max_rx_ip_filters = EFX_MCDI_FILTER_TBL_ROWS, 527 .filter_table_probe = ef100_filter_table_up, 528 .filter_table_restore = efx_mcdi_filter_table_restore, 529 .filter_table_remove = ef100_filter_table_down, 530 .filter_insert = efx_mcdi_filter_insert, 531 .filter_remove_safe = efx_mcdi_filter_remove_safe, 532 .filter_get_safe = efx_mcdi_filter_get_safe, 533 .filter_clear_rx = efx_mcdi_filter_clear_rx, 534 .filter_count_rx_used = efx_mcdi_filter_count_rx_used, 535 .filter_get_rx_id_limit = efx_mcdi_filter_get_rx_id_limit, 536 .filter_get_rx_ids = efx_mcdi_filter_get_rx_ids, > 537 .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one, 538 539 .get_phys_port_id = efx_ef100_get_phys_port_id, 540 541 .reconfigure_mac = ef100_reconfigure_mac, 542 543 /* Per-type bar/size configuration not used on ef100. Location of 544 * registers is defined by extended capabilities. 545 */ 546 .mem_bar = NULL, 547 .mem_map_size = NULL, 548 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/net/ethernet/sfc/ef100_netdev.c b/drivers/net/ethernet/sfc/ef100_netdev.c index 4c3caac2c8cc..66ffb53e20a8 100644 --- a/drivers/net/ethernet/sfc/ef100_netdev.c +++ b/drivers/net/ethernet/sfc/ef100_netdev.c @@ -90,6 +90,7 @@ static int ef100_net_stop(struct net_device *net_dev) efx_disable_interrupts(efx); efx_clear_interrupt_affinity(efx); efx_nic_fini_interrupt(efx); + efx_remove_filters(efx); efx_fini_napi(efx); efx_remove_channels(efx); efx_mcdi_free_vis(efx); @@ -139,6 +140,10 @@ static int ef100_net_open(struct net_device *net_dev) efx_init_napi(efx); + rc = efx_probe_filters(efx); + if (rc) + goto fail; + rc = efx_nic_init_interrupt(efx); if (rc) goto fail; @@ -208,8 +213,13 @@ static const struct net_device_ops ef100_netdev_ops = { .ndo_open = ef100_net_open, .ndo_stop = ef100_net_stop, .ndo_start_xmit = ef100_hard_start_xmit, + .ndo_validate_addr = eth_validate_addr, + .ndo_set_rx_mode = efx_set_rx_mode, /* Lookout */ .ndo_get_phys_port_id = efx_get_phys_port_id, .ndo_get_phys_port_name = efx_get_phys_port_name, +#ifdef CONFIG_RFS_ACCEL + .ndo_rx_flow_steer = efx_filter_rfs, +#endif }; /* Netdev registration diff --git a/drivers/net/ethernet/sfc/ef100_nic.c b/drivers/net/ethernet/sfc/ef100_nic.c index 5d576bd99059..bf3c31faa7d7 100644 --- a/drivers/net/ethernet/sfc/ef100_nic.c +++ b/drivers/net/ethernet/sfc/ef100_nic.c @@ -347,6 +347,37 @@ static int ef100_phy_probe(struct efx_nic *efx) return 0; } +static int ef100_filter_table_probe(struct efx_nic *efx) +{ + return efx_mcdi_filter_table_probe(efx, true); +} + +static int ef100_filter_table_up(struct efx_nic *efx) +{ + int rc; + + rc = efx_mcdi_filter_add_vlan(efx, EFX_FILTER_VID_UNSPEC); + if (rc) { + efx_mcdi_filter_table_down(efx); + return rc; + } + + rc = efx_mcdi_filter_add_vlan(efx, 0); + if (rc) { + efx_mcdi_filter_del_vlan(efx, EFX_FILTER_VID_UNSPEC); + efx_mcdi_filter_table_down(efx); + } + + return rc; +} + +static void ef100_filter_table_down(struct efx_nic *efx) +{ + efx_mcdi_filter_del_vlan(efx, 0); + efx_mcdi_filter_del_vlan(efx, EFX_FILTER_VID_UNSPEC); + efx_mcdi_filter_table_down(efx); +} + /* Other */ static int ef100_reconfigure_mac(struct efx_nic *efx, bool mtu_only) @@ -393,12 +424,24 @@ static int ef100_reset(struct efx_nic *efx, enum reset_type reset_type) __clear_bit(reset_type, &efx->reset_pending); rc = dev_open(efx->net_dev, NULL); } else if (reset_type == RESET_TYPE_ALL) { + /* A RESET_TYPE_ALL will cause filters to be removed, so we remove filters + * and reprobe after reset to avoid removing filters twice + */ + down_read(&efx->filter_sem); + ef100_filter_table_down(efx); + up_read(&efx->filter_sem); rc = efx_mcdi_reset(efx, reset_type); if (rc) return rc; netif_device_attach(efx->net_dev); + down_read(&efx->filter_sem); + rc = ef100_filter_table_up(efx); + up_read(&efx->filter_sem); + if (rc) + return rc; + rc = dev_open(efx->net_dev, NULL); } else { rc = 1; /* Leave the device closed */ @@ -480,6 +523,18 @@ const struct efx_nic_type ef100_pf_nic_type = { .rx_remove = efx_mcdi_rx_remove, .rx_write = ef100_rx_write, .rx_packet = __ef100_rx_packet, + .max_rx_ip_filters = EFX_MCDI_FILTER_TBL_ROWS, + .filter_table_probe = ef100_filter_table_up, + .filter_table_restore = efx_mcdi_filter_table_restore, + .filter_table_remove = ef100_filter_table_down, + .filter_insert = efx_mcdi_filter_insert, + .filter_remove_safe = efx_mcdi_filter_remove_safe, + .filter_get_safe = efx_mcdi_filter_get_safe, + .filter_clear_rx = efx_mcdi_filter_clear_rx, + .filter_count_rx_used = efx_mcdi_filter_count_rx_used, + .filter_get_rx_id_limit = efx_mcdi_filter_get_rx_id_limit, + .filter_get_rx_ids = efx_mcdi_filter_get_rx_ids, + .filter_rfs_expire_one = efx_mcdi_filter_rfs_expire_one, .get_phys_port_id = efx_ef100_get_phys_port_id, @@ -825,6 +880,12 @@ static int ef100_probe_main(struct efx_nic *efx) if (rc) goto fail; + down_write(&efx->filter_sem); + rc = ef100_filter_table_probe(efx); + up_write(&efx->filter_sem); + if (rc) + goto fail; + rc = ef100_register_netdev(efx); if (rc) goto fail; @@ -862,6 +923,10 @@ void ef100_remove(struct efx_nic *efx) struct ef100_nic_data *nic_data = efx->nic_data; ef100_unregister_netdev(efx); + + down_write(&efx->filter_sem); + efx_mcdi_filter_table_remove(efx); + up_write(&efx->filter_sem); efx_fini_channels(efx); kfree(efx->phy_data); efx->phy_data = NULL;
Signed-off-by: Edward Cree <ecree@solarflare.com> --- drivers/net/ethernet/sfc/ef100_netdev.c | 10 ++++ drivers/net/ethernet/sfc/ef100_nic.c | 65 +++++++++++++++++++++++++ 2 files changed, 75 insertions(+)