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

Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue

Tony Nguyen says:

====================
40GbE Intel Wired LAN Driver Updates 2021-07-19

This series contains updates to iavf and i40e drivers.

Stefan Assmann adds locking to a path that does not acquire a spinlock
where needed for i40e. He also adjusts locking of critical sections to
help avoid races and removes overriding of the adapter state during
pending reset for iavf driver.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+73 -16
+20 -3
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
··· 1160 1160 } 1161 1161 1162 1162 /** 1163 - * i40e_getnum_vf_vsi_vlan_filters 1163 + * __i40e_getnum_vf_vsi_vlan_filters 1164 1164 * @vsi: pointer to the vsi 1165 1165 * 1166 1166 * called to get the number of VLANs offloaded on this VF 1167 1167 **/ 1168 - static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi) 1168 + static int __i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi) 1169 1169 { 1170 1170 struct i40e_mac_filter *f; 1171 1171 u16 num_vlans = 0, bkt; ··· 1174 1174 if (f->vlan >= 0 && f->vlan <= I40E_MAX_VLANID) 1175 1175 num_vlans++; 1176 1176 } 1177 + 1178 + return num_vlans; 1179 + } 1180 + 1181 + /** 1182 + * i40e_getnum_vf_vsi_vlan_filters 1183 + * @vsi: pointer to the vsi 1184 + * 1185 + * wrapper for __i40e_getnum_vf_vsi_vlan_filters() with spinlock held 1186 + **/ 1187 + static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi) 1188 + { 1189 + int num_vlans; 1190 + 1191 + spin_lock_bh(&vsi->mac_filter_hash_lock); 1192 + num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi); 1193 + spin_unlock_bh(&vsi->mac_filter_hash_lock); 1177 1194 1178 1195 return num_vlans; 1179 1196 } ··· 1212 1195 int bkt; 1213 1196 1214 1197 spin_lock_bh(&vsi->mac_filter_hash_lock); 1215 - *num_vlans = i40e_getnum_vf_vsi_vlan_filters(vsi); 1198 + *num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi); 1216 1199 *vlan_list = kcalloc(*num_vlans, sizeof(**vlan_list), GFP_ATOMIC); 1217 1200 if (!(*vlan_list)) 1218 1201 goto err;
+50 -8
drivers/net/ethernet/intel/iavf/iavf_main.c
··· 132 132 } 133 133 134 134 /** 135 + * iavf_lock_timeout - try to set bit but give up after timeout 136 + * @adapter: board private structure 137 + * @bit: bit to set 138 + * @msecs: timeout in msecs 139 + * 140 + * Returns 0 on success, negative on failure 141 + **/ 142 + static int iavf_lock_timeout(struct iavf_adapter *adapter, 143 + enum iavf_critical_section_t bit, 144 + unsigned int msecs) 145 + { 146 + unsigned int wait, delay = 10; 147 + 148 + for (wait = 0; wait < msecs; wait += delay) { 149 + if (!test_and_set_bit(bit, &adapter->crit_section)) 150 + return 0; 151 + 152 + msleep(delay); 153 + } 154 + 155 + return -1; 156 + } 157 + 158 + /** 135 159 * iavf_schedule_reset - Set the flags and schedule a reset event 136 160 * @adapter: board private structure 137 161 **/ ··· 2012 1988 /* check for hw reset */ 2013 1989 reg_val = rd32(hw, IAVF_VF_ARQLEN1) & IAVF_VF_ARQLEN1_ARQENABLE_MASK; 2014 1990 if (!reg_val) { 2015 - adapter->state = __IAVF_RESETTING; 2016 1991 adapter->flags |= IAVF_FLAG_RESET_PENDING; 2017 1992 adapter->aq_required = 0; 2018 1993 adapter->current_op = VIRTCHNL_OP_UNKNOWN; ··· 2125 2102 if (test_bit(__IAVF_IN_REMOVE_TASK, &adapter->crit_section)) 2126 2103 return; 2127 2104 2105 + if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 200)) { 2106 + schedule_work(&adapter->reset_task); 2107 + return; 2108 + } 2128 2109 while (test_and_set_bit(__IAVF_IN_CLIENT_TASK, 2129 2110 &adapter->crit_section)) 2130 2111 usleep_range(500, 1000); ··· 2335 2308 if (!event.msg_buf) 2336 2309 goto out; 2337 2310 2311 + if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 200)) 2312 + goto freedom; 2338 2313 do { 2339 2314 ret = iavf_clean_arq_element(hw, &event, &pending); 2340 2315 v_op = (enum virtchnl_ops)le32_to_cpu(event.desc.cookie_high); ··· 2350 2321 if (pending != 0) 2351 2322 memset(event.msg_buf, 0, IAVF_MAX_AQ_BUF_SIZE); 2352 2323 } while (pending); 2324 + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section); 2353 2325 2354 2326 if ((adapter->flags & 2355 2327 (IAVF_FLAG_RESET_PENDING | IAVF_FLAG_RESET_NEEDED)) || ··· 3655 3625 init_task.work); 3656 3626 struct iavf_hw *hw = &adapter->hw; 3657 3627 3628 + if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 5000)) { 3629 + dev_warn(&adapter->pdev->dev, "failed to set __IAVF_IN_CRITICAL_TASK in %s\n", __FUNCTION__); 3630 + return; 3631 + } 3658 3632 switch (adapter->state) { 3659 3633 case __IAVF_STARTUP: 3660 3634 if (iavf_startup(adapter) < 0) ··· 3671 3637 case __IAVF_INIT_GET_RESOURCES: 3672 3638 if (iavf_init_get_resources(adapter) < 0) 3673 3639 goto init_failed; 3674 - return; 3640 + goto out; 3675 3641 default: 3676 3642 goto init_failed; 3677 3643 } 3678 3644 3679 3645 queue_delayed_work(iavf_wq, &adapter->init_task, 3680 3646 msecs_to_jiffies(30)); 3681 - return; 3647 + goto out; 3682 3648 init_failed: 3683 3649 if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) { 3684 3650 dev_err(&adapter->pdev->dev, ··· 3687 3653 iavf_shutdown_adminq(hw); 3688 3654 adapter->state = __IAVF_STARTUP; 3689 3655 queue_delayed_work(iavf_wq, &adapter->init_task, HZ * 5); 3690 - return; 3656 + goto out; 3691 3657 } 3692 3658 queue_delayed_work(iavf_wq, &adapter->init_task, HZ); 3659 + out: 3660 + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section); 3693 3661 } 3694 3662 3695 3663 /** ··· 3708 3672 if (netif_running(netdev)) 3709 3673 iavf_close(netdev); 3710 3674 3675 + if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 5000)) 3676 + dev_warn(&adapter->pdev->dev, "failed to set __IAVF_IN_CRITICAL_TASK in %s\n", __FUNCTION__); 3711 3677 /* Prevent the watchdog from running. */ 3712 3678 adapter->state = __IAVF_REMOVE; 3713 3679 adapter->aq_required = 0; 3680 + clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section); 3714 3681 3715 3682 #ifdef CONFIG_PM 3716 3683 pci_save_state(pdev); ··· 3947 3908 err); 3948 3909 } 3949 3910 3950 - /* Shut down all the garbage mashers on the detention level */ 3951 - adapter->state = __IAVF_REMOVE; 3952 - adapter->aq_required = 0; 3953 - adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED; 3954 3911 iavf_request_reset(adapter); 3955 3912 msleep(50); 3956 3913 /* If the FW isn't responding, kick it once, but only once. */ ··· 3954 3919 iavf_request_reset(adapter); 3955 3920 msleep(50); 3956 3921 } 3922 + if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 5000)) 3923 + dev_warn(&adapter->pdev->dev, "failed to set __IAVF_IN_CRITICAL_TASK in %s\n", __FUNCTION__); 3924 + 3925 + /* Shut down all the garbage mashers on the detention level */ 3926 + adapter->state = __IAVF_REMOVE; 3927 + adapter->aq_required = 0; 3928 + adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED; 3957 3929 iavf_free_all_tx_resources(adapter); 3958 3930 iavf_free_all_rx_resources(adapter); 3959 3931 iavf_misc_irq_disable(adapter);
+3 -5
drivers/net/phy/dp83822.c
··· 326 326 327 327 static int dp8382x_disable_wol(struct phy_device *phydev) 328 328 { 329 - int value = DP83822_WOL_EN | DP83822_WOL_MAGIC_EN | 330 - DP83822_WOL_SECURE_ON; 331 - 332 - return phy_clear_bits_mmd(phydev, DP83822_DEVADDR, 333 - MII_DP83822_WOL_CFG, value); 329 + return phy_clear_bits_mmd(phydev, DP83822_DEVADDR, MII_DP83822_WOL_CFG, 330 + DP83822_WOL_EN | DP83822_WOL_MAGIC_EN | 331 + DP83822_WOL_SECURE_ON); 334 332 } 335 333 336 334 static int dp83822_read_status(struct phy_device *phydev)