diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice.h | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_common.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lag.c | 34 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 28 | 
5 files changed, 53 insertions, 16 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h index 4e16d185077d..a9fa701aaa95 100644 --- a/drivers/net/ethernet/intel/ice/ice.h +++ b/drivers/net/ethernet/intel/ice/ice.h @@ -483,6 +483,7 @@ enum ice_pf_flags {  	ICE_FLAG_VF_TRUE_PROMISC_ENA,  	ICE_FLAG_MDD_AUTO_RESET_VF,  	ICE_FLAG_LINK_LENIENT_MODE_ENA, +	ICE_FLAG_PLUG_AUX_DEV,  	ICE_PF_FLAGS_NBITS		/* must be last */  }; @@ -887,7 +888,7 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf)  	if (pf->hw.func_caps.common_cap.rdma && pf->num_rdma_msix) {  		set_bit(ICE_FLAG_RDMA_ENA, pf->flags);  		set_bit(ICE_FLAG_AUX_ENA, pf->flags); -		ice_plug_aux_dev(pf); +		set_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags);  	}  } diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c index 408d15a5b0e3..a6d7d3eff186 100644 --- a/drivers/net/ethernet/intel/ice/ice_common.c +++ b/drivers/net/ethernet/intel/ice/ice_common.c @@ -3342,7 +3342,8 @@ ice_cfg_phy_fec(struct ice_port_info *pi, struct ice_aqc_set_phy_cfg_data *cfg,  	    !ice_fw_supports_report_dflt_cfg(hw)) {  		struct ice_link_default_override_tlv tlv; -		if (ice_get_link_default_override(&tlv, pi)) +		status = ice_get_link_default_override(&tlv, pi); +		if (status)  			goto out;  		if (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE) && diff --git a/drivers/net/ethernet/intel/ice/ice_lag.c b/drivers/net/ethernet/intel/ice/ice_lag.c index e375ac849aec..4f954db01b92 100644 --- a/drivers/net/ethernet/intel/ice/ice_lag.c +++ b/drivers/net/ethernet/intel/ice/ice_lag.c @@ -204,11 +204,7 @@ ice_lag_unlink(struct ice_lag *lag,  		lag->upper_netdev = NULL;  	} -	if (lag->peer_netdev) { -		dev_put(lag->peer_netdev); -		lag->peer_netdev = NULL; -	} - +	lag->peer_netdev = NULL;  	ice_set_sriov_cap(pf);  	ice_set_rdma_cap(pf);  	lag->bonded = false; @@ -216,6 +212,32 @@ ice_lag_unlink(struct ice_lag *lag,  }  /** + * ice_lag_unregister - handle netdev unregister events + * @lag: LAG info struct + * @netdev: netdev reporting the event + */ +static void ice_lag_unregister(struct ice_lag *lag, struct net_device *netdev) +{ +	struct ice_pf *pf = lag->pf; + +	/* check to see if this event is for this netdev +	 * check that we are in an aggregate +	 */ +	if (netdev != lag->netdev || !lag->bonded) +		return; + +	if (lag->upper_netdev) { +		dev_put(lag->upper_netdev); +		lag->upper_netdev = NULL; +		ice_set_sriov_cap(pf); +		ice_set_rdma_cap(pf); +	} +	/* perform some cleanup in case we come back */ +	lag->bonded = false; +	lag->role = ICE_LAG_NONE; +} + +/**   * ice_lag_changeupper_event - handle LAG changeupper event   * @lag: LAG info struct   * @ptr: opaque pointer data @@ -307,7 +329,7 @@ ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event,  		ice_lag_info_event(lag, ptr);  		break;  	case NETDEV_UNREGISTER: -		ice_lag_unlink(lag, ptr); +		ice_lag_unregister(lag, netdev);  		break;  	default:  		break; diff --git a/drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h b/drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h index d981dc6f2323..85a612838a89 100644 --- a/drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h +++ b/drivers/net/ethernet/intel/ice/ice_lan_tx_rx.h @@ -568,6 +568,7 @@ struct ice_tx_ctx_desc {  			(0x3FFFFULL << ICE_TXD_CTX_QW1_TSO_LEN_S)  #define ICE_TXD_CTX_QW1_MSS_S	50 +#define ICE_TXD_CTX_MIN_MSS	64  #define ICE_TXD_CTX_QW1_VSI_S	50  #define ICE_TXD_CTX_QW1_VSI_M	(0x3FFULL << ICE_TXD_CTX_QW1_VSI_S) diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 30814435f779..17a9bb461dc3 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -2253,6 +2253,9 @@ static void ice_service_task(struct work_struct *work)  		return;  	} +	if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) +		ice_plug_aux_dev(pf); +  	ice_clean_adminq_subtask(pf);  	ice_check_media_subtask(pf);  	ice_check_for_hang_subtask(pf); @@ -8525,6 +8528,7 @@ ice_features_check(struct sk_buff *skb,  		   struct net_device __always_unused *netdev,  		   netdev_features_t features)  { +	bool gso = skb_is_gso(skb);  	size_t len;  	/* No point in doing any of this if neither checksum nor GSO are @@ -8537,24 +8541,32 @@ ice_features_check(struct sk_buff *skb,  	/* We cannot support GSO if the MSS is going to be less than  	 * 64 bytes. If it is then we need to drop support for GSO.  	 */ -	if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_size < 64)) +	if (gso && (skb_shinfo(skb)->gso_size < ICE_TXD_CTX_MIN_MSS))  		features &= ~NETIF_F_GSO_MASK; -	len = skb_network_header(skb) - skb->data; +	len = skb_network_offset(skb);  	if (len > ICE_TXD_MACLEN_MAX || len & 0x1)  		goto out_rm_features; -	len = skb_transport_header(skb) - skb_network_header(skb); +	len = skb_network_header_len(skb);  	if (len > ICE_TXD_IPLEN_MAX || len & 0x1)  		goto out_rm_features;  	if (skb->encapsulation) { -		len = skb_inner_network_header(skb) - skb_transport_header(skb); -		if (len > ICE_TXD_L4LEN_MAX || len & 0x1) -			goto out_rm_features; +		/* this must work for VXLAN frames AND IPIP/SIT frames, and in +		 * the case of IPIP frames, the transport header pointer is +		 * after the inner header! So check to make sure that this +		 * is a GRE or UDP_TUNNEL frame before doing that math. +		 */ +		if (gso && (skb_shinfo(skb)->gso_type & +			    (SKB_GSO_GRE | SKB_GSO_UDP_TUNNEL))) { +			len = skb_inner_network_header(skb) - +			      skb_transport_header(skb); +			if (len > ICE_TXD_L4LEN_MAX || len & 0x1) +				goto out_rm_features; +		} -		len = skb_inner_transport_header(skb) - -		      skb_inner_network_header(skb); +		len = skb_inner_network_header_len(skb);  		if (len > ICE_TXD_IPLEN_MAX || len & 0x1)  			goto out_rm_features;  	}  |