diff options
author | David S. Miller <davem@davemloft.net> | 2019-08-24 19:46:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-08-24 19:46:45 -0400 |
commit | a914a84110354925afbae72d2ade97773e018abd (patch) | |
tree | ee4ae3e7745ca830e3e669946429af6e615ab84d /drivers/net/ethernet/intel/ice/ice_main.c | |
parent | ace4cedea934618024dec2f5664b1777b5dc56c6 (diff) | |
parent | 8b2c858240aca43c59fc7762f10754354406883d (diff) |
Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue
Jeff Kirsher says:
====================
100GbE Intel Wired LAN Driver Updates 2019-08-23
This series contains updates to ice driver only.
Dave adds logic for the necessary bits to be set in the VSI context for
the PF_VSI and the TX_descriptors for control packets egressing the
PF_VSI. Updated the logic to detect both DCBx and LLDP states in the
firmware engine to account for situations where DCBx is enabled and LLDP
is disabled. Fixed the driver to treat the DCBx state of "NOT_STARTED"
as a valid state and should not assume "is_fw_lldp" true automatically.
Since "enable-fw-lldp" flag was confusing and cumbersome, change the
flag to "fw-lldp-agent" with a value of on or off to help clarify
whether the LLDP agent is running or not.
Brett fixes an issue where synchronize_irq() was being called from the
host of VF's, which should not be done.
Michal fixed an issue when rebuilding the DCBx configuration while in
IEEE mode versus CEE mode, so add a check before copying the
configuration value to ensure we are only in CEE mode.
Jake fixes the PF to reject any VF request to setup head writeback since
the support has been deprecated.
Mitch adds an additional check to ensure the VF is active before sending
out an error message that a message was unable to be sent to a
particular VF.
Chinh updates the driver to use "topology" mode when checking the PHY
for status, since this mode provides us the current module type that is
available. Fixes the driver from clearing the auto_fec_enable bit which
was blocking a user from forcing non-spec compliant FEC configurations.
Amruth does a refactor on the code to first check, then assign in the
virtual channel space.
Bruce updates the driver to actually update the stats when a user runs
the ethtool command 'ethtool -S <iface>' instead of providing a snapshot
of the stats that maybe from a second ago.
Akeem fixes up the adding/removing of VSI MAC filters for VFs, so that
VFs cannot add/remove a filter from another VSI. We now track the
number of filters added right from when the VF resources get allocated
and won't get into MAC filter mis-match issue in the switch.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 70 |
1 files changed, 19 insertions, 51 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index a0d148f590c2..f3923dec32b7 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c | |||
@@ -34,8 +34,6 @@ static const struct net_device_ops ice_netdev_ops; | |||
34 | static void ice_rebuild(struct ice_pf *pf); | 34 | static void ice_rebuild(struct ice_pf *pf); |
35 | 35 | ||
36 | static void ice_vsi_release_all(struct ice_pf *pf); | 36 | static void ice_vsi_release_all(struct ice_pf *pf); |
37 | static void ice_update_vsi_stats(struct ice_vsi *vsi); | ||
38 | static void ice_update_pf_stats(struct ice_pf *pf); | ||
39 | 37 | ||
40 | /** | 38 | /** |
41 | * ice_get_tx_pending - returns number of Tx descriptors not processed | 39 | * ice_get_tx_pending - returns number of Tx descriptors not processed |
@@ -118,10 +116,9 @@ static void ice_check_for_hang_subtask(struct ice_pf *pf) | |||
118 | */ | 116 | */ |
119 | static int ice_init_mac_fltr(struct ice_pf *pf) | 117 | static int ice_init_mac_fltr(struct ice_pf *pf) |
120 | { | 118 | { |
121 | LIST_HEAD(tmp_add_list); | 119 | enum ice_status status; |
122 | u8 broadcast[ETH_ALEN]; | 120 | u8 broadcast[ETH_ALEN]; |
123 | struct ice_vsi *vsi; | 121 | struct ice_vsi *vsi; |
124 | int status; | ||
125 | 122 | ||
126 | vsi = ice_find_vsi_by_type(pf, ICE_VSI_PF); | 123 | vsi = ice_find_vsi_by_type(pf, ICE_VSI_PF); |
127 | if (!vsi) | 124 | if (!vsi) |
@@ -132,8 +129,7 @@ static int ice_init_mac_fltr(struct ice_pf *pf) | |||
132 | */ | 129 | */ |
133 | 130 | ||
134 | /* Add a unicast MAC filter so the VSI can get its packets */ | 131 | /* Add a unicast MAC filter so the VSI can get its packets */ |
135 | status = ice_add_mac_to_list(vsi, &tmp_add_list, | 132 | status = ice_vsi_cfg_mac_fltr(vsi, vsi->port_info->mac.perm_addr, true); |
136 | vsi->port_info->mac.perm_addr); | ||
137 | if (status) | 133 | if (status) |
138 | goto unregister; | 134 | goto unregister; |
139 | 135 | ||
@@ -141,18 +137,11 @@ static int ice_init_mac_fltr(struct ice_pf *pf) | |||
141 | * MAC address to the list as well. | 137 | * MAC address to the list as well. |
142 | */ | 138 | */ |
143 | eth_broadcast_addr(broadcast); | 139 | eth_broadcast_addr(broadcast); |
144 | status = ice_add_mac_to_list(vsi, &tmp_add_list, broadcast); | 140 | status = ice_vsi_cfg_mac_fltr(vsi, broadcast, true); |
145 | if (status) | ||
146 | goto free_mac_list; | ||
147 | |||
148 | /* Program MAC filters for entries in tmp_add_list */ | ||
149 | status = ice_add_mac(&pf->hw, &tmp_add_list); | ||
150 | if (status) | 141 | if (status) |
151 | status = -ENOMEM; | 142 | goto unregister; |
152 | |||
153 | free_mac_list: | ||
154 | ice_free_fltr_list(&pf->pdev->dev, &tmp_add_list); | ||
155 | 143 | ||
144 | return 0; | ||
156 | unregister: | 145 | unregister: |
157 | /* We aren't useful with no MAC filters, so unregister if we | 146 | /* We aren't useful with no MAC filters, so unregister if we |
158 | * had an error | 147 | * had an error |
@@ -166,7 +155,7 @@ unregister: | |||
166 | vsi->netdev = NULL; | 155 | vsi->netdev = NULL; |
167 | } | 156 | } |
168 | 157 | ||
169 | return status; | 158 | return -EIO; |
170 | } | 159 | } |
171 | 160 | ||
172 | /** | 161 | /** |
@@ -2836,10 +2825,8 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) | |||
2836 | struct ice_hw *hw = &pf->hw; | 2825 | struct ice_hw *hw = &pf->hw; |
2837 | struct sockaddr *addr = pi; | 2826 | struct sockaddr *addr = pi; |
2838 | enum ice_status status; | 2827 | enum ice_status status; |
2839 | LIST_HEAD(a_mac_list); | ||
2840 | LIST_HEAD(r_mac_list); | ||
2841 | u8 flags = 0; | 2828 | u8 flags = 0; |
2842 | int err; | 2829 | int err = 0; |
2843 | u8 *mac; | 2830 | u8 *mac; |
2844 | 2831 | ||
2845 | mac = (u8 *)addr->sa_data; | 2832 | mac = (u8 *)addr->sa_data; |
@@ -2862,42 +2849,23 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) | |||
2862 | /* When we change the MAC address we also have to change the MAC address | 2849 | /* When we change the MAC address we also have to change the MAC address |
2863 | * based filter rules that were created previously for the old MAC | 2850 | * based filter rules that were created previously for the old MAC |
2864 | * address. So first, we remove the old filter rule using ice_remove_mac | 2851 | * address. So first, we remove the old filter rule using ice_remove_mac |
2865 | * and then create a new filter rule using ice_add_mac. Note that for | 2852 | * and then create a new filter rule using ice_add_mac via |
2866 | * both these operations, we first need to form a "list" of MAC | 2853 | * ice_vsi_cfg_mac_fltr function call for both add and/or remove |
2867 | * addresses (even though in this case, we have only 1 MAC address to be | 2854 | * filters. |
2868 | * added/removed) and this done using ice_add_mac_to_list. Depending on | ||
2869 | * the ensuing operation this "list" of MAC addresses is either to be | ||
2870 | * added or removed from the filter. | ||
2871 | */ | 2855 | */ |
2872 | err = ice_add_mac_to_list(vsi, &r_mac_list, netdev->dev_addr); | 2856 | status = ice_vsi_cfg_mac_fltr(vsi, netdev->dev_addr, false); |
2873 | if (err) { | ||
2874 | err = -EADDRNOTAVAIL; | ||
2875 | goto free_lists; | ||
2876 | } | ||
2877 | |||
2878 | status = ice_remove_mac(hw, &r_mac_list); | ||
2879 | if (status) { | 2857 | if (status) { |
2880 | err = -EADDRNOTAVAIL; | 2858 | err = -EADDRNOTAVAIL; |
2881 | goto free_lists; | 2859 | goto err_update_filters; |
2882 | } | ||
2883 | |||
2884 | err = ice_add_mac_to_list(vsi, &a_mac_list, mac); | ||
2885 | if (err) { | ||
2886 | err = -EADDRNOTAVAIL; | ||
2887 | goto free_lists; | ||
2888 | } | 2860 | } |
2889 | 2861 | ||
2890 | status = ice_add_mac(hw, &a_mac_list); | 2862 | status = ice_vsi_cfg_mac_fltr(vsi, mac, true); |
2891 | if (status) { | 2863 | if (status) { |
2892 | err = -EADDRNOTAVAIL; | 2864 | err = -EADDRNOTAVAIL; |
2893 | goto free_lists; | 2865 | goto err_update_filters; |
2894 | } | 2866 | } |
2895 | 2867 | ||
2896 | free_lists: | 2868 | err_update_filters: |
2897 | /* free list entries */ | ||
2898 | ice_free_fltr_list(&pf->pdev->dev, &r_mac_list); | ||
2899 | ice_free_fltr_list(&pf->pdev->dev, &a_mac_list); | ||
2900 | |||
2901 | if (err) { | 2869 | if (err) { |
2902 | netdev_err(netdev, "can't set MAC %pM. filter update failed\n", | 2870 | netdev_err(netdev, "can't set MAC %pM. filter update failed\n", |
2903 | mac); | 2871 | mac); |
@@ -2913,8 +2881,8 @@ free_lists: | |||
2913 | flags = ICE_AQC_MAN_MAC_UPDATE_LAA_WOL; | 2881 | flags = ICE_AQC_MAN_MAC_UPDATE_LAA_WOL; |
2914 | status = ice_aq_manage_mac_write(hw, mac, flags, NULL); | 2882 | status = ice_aq_manage_mac_write(hw, mac, flags, NULL); |
2915 | if (status) { | 2883 | if (status) { |
2916 | netdev_err(netdev, "can't set MAC %pM. write to firmware failed.\n", | 2884 | netdev_err(netdev, "can't set MAC %pM. write to firmware failed error %d\n", |
2917 | mac); | 2885 | mac, status); |
2918 | } | 2886 | } |
2919 | return 0; | 2887 | return 0; |
2920 | } | 2888 | } |
@@ -3254,7 +3222,7 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi) | |||
3254 | * ice_update_vsi_stats - Update VSI stats counters | 3222 | * ice_update_vsi_stats - Update VSI stats counters |
3255 | * @vsi: the VSI to be updated | 3223 | * @vsi: the VSI to be updated |
3256 | */ | 3224 | */ |
3257 | static void ice_update_vsi_stats(struct ice_vsi *vsi) | 3225 | void ice_update_vsi_stats(struct ice_vsi *vsi) |
3258 | { | 3226 | { |
3259 | struct rtnl_link_stats64 *cur_ns = &vsi->net_stats; | 3227 | struct rtnl_link_stats64 *cur_ns = &vsi->net_stats; |
3260 | struct ice_eth_stats *cur_es = &vsi->eth_stats; | 3228 | struct ice_eth_stats *cur_es = &vsi->eth_stats; |
@@ -3290,7 +3258,7 @@ static void ice_update_vsi_stats(struct ice_vsi *vsi) | |||
3290 | * ice_update_pf_stats - Update PF port stats counters | 3258 | * ice_update_pf_stats - Update PF port stats counters |
3291 | * @pf: PF whose stats needs to be updated | 3259 | * @pf: PF whose stats needs to be updated |
3292 | */ | 3260 | */ |
3293 | static void ice_update_pf_stats(struct ice_pf *pf) | 3261 | void ice_update_pf_stats(struct ice_pf *pf) |
3294 | { | 3262 | { |
3295 | struct ice_hw_port_stats *prev_ps, *cur_ps; | 3263 | struct ice_hw_port_stats *prev_ps, *cur_ps; |
3296 | struct ice_hw *hw = &pf->hw; | 3264 | struct ice_hw *hw = &pf->hw; |