aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_main.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-08-24 19:46:45 -0400
committerDavid S. Miller <davem@davemloft.net>2019-08-24 19:46:45 -0400
commita914a84110354925afbae72d2ade97773e018abd (patch)
treeee4ae3e7745ca830e3e669946429af6e615ab84d /drivers/net/ethernet/intel/ice/ice_main.c
parentace4cedea934618024dec2f5664b1777b5dc56c6 (diff)
parent8b2c858240aca43c59fc7762f10754354406883d (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.c70
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;
34static void ice_rebuild(struct ice_pf *pf); 34static void ice_rebuild(struct ice_pf *pf);
35 35
36static void ice_vsi_release_all(struct ice_pf *pf); 36static void ice_vsi_release_all(struct ice_pf *pf);
37static void ice_update_vsi_stats(struct ice_vsi *vsi);
38static 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 */
119static int ice_init_mac_fltr(struct ice_pf *pf) 117static 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
153free_mac_list:
154 ice_free_fltr_list(&pf->pdev->dev, &tmp_add_list);
155 143
144 return 0;
156unregister: 145unregister:
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
2896free_lists: 2868err_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 */
3257static void ice_update_vsi_stats(struct ice_vsi *vsi) 3225void 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 */
3293static void ice_update_pf_stats(struct ice_pf *pf) 3261void 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;