diff options
Diffstat (limited to 'drivers/net/ethernet/intel')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/e1000.h | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 54 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_adminq.c | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 22 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_xsk.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_main.c | 17 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_82575.c | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_ethtool.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 44 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 | 
15 files changed, 122 insertions, 69 deletions
| diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 6c51b1bad8c4..37a2314d3e6b 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h @@ -185,13 +185,12 @@ struct e1000_phy_regs {  /* board specific private data structure */  struct e1000_adapter { +	struct timer_list watchdog_timer;  	struct timer_list phy_info_timer;  	struct timer_list blink_timer;  	struct work_struct reset_task; -	struct delayed_work watchdog_task; - -	struct workqueue_struct *e1000_workqueue; +	struct work_struct watchdog_task;  	const struct e1000_info *ei; diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index fe7997c18a10..7c5b18d87b49 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -1780,8 +1780,7 @@ static irqreturn_t e1000_intr_msi(int __always_unused irq, void *data)  		}  		/* guard against interrupt when we're going down */  		if (!test_bit(__E1000_DOWN, &adapter->state)) -			mod_delayed_work(adapter->e1000_workqueue, -					 &adapter->watchdog_task, HZ); +			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	}  	/* Reset on uncorrectable ECC error */ @@ -1861,8 +1860,7 @@ static irqreturn_t e1000_intr(int __always_unused irq, void *data)  		}  		/* guard against interrupt when we're going down */  		if (!test_bit(__E1000_DOWN, &adapter->state)) -			mod_delayed_work(adapter->e1000_workqueue, -					 &adapter->watchdog_task, HZ); +			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	}  	/* Reset on uncorrectable ECC error */ @@ -1907,8 +1905,7 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)  		hw->mac.get_link_status = true;  		/* guard against interrupt when we're going down */  		if (!test_bit(__E1000_DOWN, &adapter->state)) -			mod_delayed_work(adapter->e1000_workqueue, -					 &adapter->watchdog_task, HZ); +			mod_timer(&adapter->watchdog_timer, jiffies + 1);  	}  	if (!test_bit(__E1000_DOWN, &adapter->state)) @@ -4284,6 +4281,7 @@ void e1000e_down(struct e1000_adapter *adapter, bool reset)  	napi_synchronize(&adapter->napi); +	del_timer_sync(&adapter->watchdog_timer);  	del_timer_sync(&adapter->phy_info_timer);  	spin_lock(&adapter->stats64_lock); @@ -5155,11 +5153,25 @@ static void e1000e_check_82574_phy_workaround(struct e1000_adapter *adapter)  	}  } +/** + * e1000_watchdog - Timer Call-back + * @data: pointer to adapter cast into an unsigned long + **/ +static void e1000_watchdog(struct timer_list *t) +{ +	struct e1000_adapter *adapter = from_timer(adapter, t, watchdog_timer); + +	/* Do the rest outside of interrupt context */ +	schedule_work(&adapter->watchdog_task); + +	/* TODO: make this use queue_delayed_work() */ +} +  static void e1000_watchdog_task(struct work_struct *work)  {  	struct e1000_adapter *adapter = container_of(work,  						     struct e1000_adapter, -						     watchdog_task.work); +						     watchdog_task);  	struct net_device *netdev = adapter->netdev;  	struct e1000_mac_info *mac = &adapter->hw.mac;  	struct e1000_phy_info *phy = &adapter->hw.phy; @@ -5407,9 +5419,8 @@ link_up:  	/* Reset the timer */  	if (!test_bit(__E1000_DOWN, &adapter->state)) -		queue_delayed_work(adapter->e1000_workqueue, -				   &adapter->watchdog_task, -				   round_jiffies(2 * HZ)); +		mod_timer(&adapter->watchdog_timer, +			  round_jiffies(jiffies + 2 * HZ));  }  #define E1000_TX_FLAGS_CSUM		0x00000001 @@ -7449,21 +7460,11 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  		goto err_eeprom;  	} -	adapter->e1000_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, -						   e1000e_driver_name); - -	if (!adapter->e1000_workqueue) { -		err = -ENOMEM; -		goto err_workqueue; -	} - -	INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog_task); -	queue_delayed_work(adapter->e1000_workqueue, &adapter->watchdog_task, -			   0); - +	timer_setup(&adapter->watchdog_timer, e1000_watchdog, 0);  	timer_setup(&adapter->phy_info_timer, e1000_update_phy_info, 0);  	INIT_WORK(&adapter->reset_task, e1000_reset_task); +	INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);  	INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);  	INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);  	INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang); @@ -7557,9 +7558,6 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	return 0;  err_register: -	flush_workqueue(adapter->e1000_workqueue); -	destroy_workqueue(adapter->e1000_workqueue); -err_workqueue:  	if (!(adapter->flags & FLAG_HAS_AMT))  		e1000e_release_hw_control(adapter);  err_eeprom: @@ -7604,17 +7602,15 @@ static void e1000_remove(struct pci_dev *pdev)  	 * from being rescheduled.  	 */  	set_bit(__E1000_DOWN, &adapter->state); +	del_timer_sync(&adapter->watchdog_timer);  	del_timer_sync(&adapter->phy_info_timer);  	cancel_work_sync(&adapter->reset_task); +	cancel_work_sync(&adapter->watchdog_task);  	cancel_work_sync(&adapter->downshift_task);  	cancel_work_sync(&adapter->update_phy_task);  	cancel_work_sync(&adapter->print_hang_task); -	cancel_delayed_work(&adapter->watchdog_task); -	flush_workqueue(adapter->e1000_workqueue); -	destroy_workqueue(adapter->e1000_workqueue); -  	if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {  		cancel_work_sync(&adapter->tx_hwtstamp_work);  		if (adapter->tx_hwtstamp_skb) { diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index cb6367334ca7..4833187bd259 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -1152,7 +1152,7 @@ void i40e_set_fec_in_flags(u8 fec_cfg, u32 *flags);  static inline bool i40e_enabled_xdp_vsi(struct i40e_vsi *vsi)  { -	return !!vsi->xdp_prog; +	return !!READ_ONCE(vsi->xdp_prog);  }  int i40e_create_queue_channel(struct i40e_vsi *vsi, struct i40e_channel *ch); diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c index 9f0a4e92a231..37514a75f928 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c @@ -536,6 +536,11 @@ static void i40e_set_hw_flags(struct i40e_hw *hw)  		    (aq->api_maj_ver == 1 &&  		     aq->api_min_ver >= I40E_MINOR_VER_FW_LLDP_STOPPABLE_X722))  			hw->flags |= I40E_HW_FLAG_FW_LLDP_STOPPABLE; + +		if (aq->api_maj_ver > 1 || +		    (aq->api_maj_ver == 1 && +		     aq->api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_X722)) +			hw->flags |= I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE;  		/* fall through */  	default:  		break; diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 1ccabeafa44c..2c5af6d4a6b1 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -6823,8 +6823,8 @@ void i40e_down(struct i40e_vsi *vsi)  	for (i = 0; i < vsi->num_queue_pairs; i++) {  		i40e_clean_tx_ring(vsi->tx_rings[i]);  		if (i40e_enabled_xdp_vsi(vsi)) { -			/* Make sure that in-progress ndo_xdp_xmit -			 * calls are completed. +			/* Make sure that in-progress ndo_xdp_xmit and +			 * ndo_xsk_wakeup calls are completed.  			 */  			synchronize_rcu();  			i40e_clean_tx_ring(vsi->xdp_rings[i]); @@ -12546,8 +12546,12 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi,  	old_prog = xchg(&vsi->xdp_prog, prog); -	if (need_reset) +	if (need_reset) { +		if (!prog) +			/* Wait until ndo_xsk_wakeup completes. */ +			synchronize_rcu();  		i40e_reset_and_rebuild(pf, true, true); +	}  	for (i = 0; i < vsi->num_queue_pairs; i++)  		WRITE_ONCE(vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog); diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 6a3f0fc56c3b..69523ac85639 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -2322,6 +2322,22 @@ static int i40e_ctrl_vf_rx_rings(struct i40e_vsi *vsi, unsigned long q_map,  }  /** + * i40e_vc_validate_vqs_bitmaps - validate Rx/Tx queue bitmaps from VIRTHCHNL + * @vqs: virtchnl_queue_select structure containing bitmaps to validate + * + * Returns true if validation was successful, else false. + */ +static bool i40e_vc_validate_vqs_bitmaps(struct virtchnl_queue_select *vqs) +{ +	if ((!vqs->rx_queues && !vqs->tx_queues) || +	    vqs->rx_queues >= BIT(I40E_MAX_VF_QUEUES) || +	    vqs->tx_queues >= BIT(I40E_MAX_VF_QUEUES)) +		return false; + +	return true; +} + +/**   * i40e_vc_enable_queues_msg   * @vf: pointer to the VF info   * @msg: pointer to the msg buffer @@ -2346,7 +2362,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg)  		goto error_param;  	} -	if ((0 == vqs->rx_queues) && (0 == vqs->tx_queues)) { +	if (i40e_vc_validate_vqs_bitmaps(vqs)) {  		aq_ret = I40E_ERR_PARAM;  		goto error_param;  	} @@ -2408,9 +2424,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg)  		goto error_param;  	} -	if ((vqs->rx_queues == 0 && vqs->tx_queues == 0) || -	    vqs->rx_queues > I40E_MAX_VF_QUEUES || -	    vqs->tx_queues > I40E_MAX_VF_QUEUES) { +	if (i40e_vc_validate_vqs_bitmaps(vqs)) {  		aq_ret = I40E_ERR_PARAM;  		goto error_param;  	} diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c index d07e1a890428..f73cd917c44f 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c @@ -787,8 +787,12 @@ int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)  {  	struct i40e_netdev_priv *np = netdev_priv(dev);  	struct i40e_vsi *vsi = np->vsi; +	struct i40e_pf *pf = vsi->back;  	struct i40e_ring *ring; +	if (test_bit(__I40E_CONFIG_BUSY, pf->state)) +		return -ENETDOWN; +  	if (test_bit(__I40E_VSI_DOWN, vsi->state))  		return -ENETDOWN; diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h index 29de3ae96ef2..bd1b1ed323f4 100644 --- a/drivers/net/ethernet/intel/iavf/iavf.h +++ b/drivers/net/ethernet/intel/iavf/iavf.h @@ -415,4 +415,6 @@ void iavf_enable_channels(struct iavf_adapter *adapter);  void iavf_disable_channels(struct iavf_adapter *adapter);  void iavf_add_cloud_filter(struct iavf_adapter *adapter);  void iavf_del_cloud_filter(struct iavf_adapter *adapter); +struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, +					const u8 *macaddr);  #endif /* _IAVF_H_ */ diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index 821987da5698..8e16be960e96 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -743,9 +743,8 @@ iavf_mac_filter *iavf_find_filter(struct iavf_adapter *adapter,   *   * Returns ptr to the filter object or NULL when no memory available.   **/ -static struct -iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, -				 const u8 *macaddr) +struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter, +					const u8 *macaddr)  {  	struct iavf_mac_filter *f; @@ -2065,9 +2064,9 @@ static void iavf_reset_task(struct work_struct *work)  	struct virtchnl_vf_resource *vfres = adapter->vf_res;  	struct net_device *netdev = adapter->netdev;  	struct iavf_hw *hw = &adapter->hw; +	struct iavf_mac_filter *f, *ftmp;  	struct iavf_vlan_filter *vlf;  	struct iavf_cloud_filter *cf; -	struct iavf_mac_filter *f;  	u32 reg_val;  	int i = 0, err;  	bool running; @@ -2181,6 +2180,16 @@ continue_reset:  	spin_lock_bh(&adapter->mac_vlan_list_lock); +	/* Delete filter for the current MAC address, it could have +	 * been changed by the PF via administratively set MAC. +	 * Will be re-added via VIRTCHNL_OP_GET_VF_RESOURCES. +	 */ +	list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) { +		if (ether_addr_equal(f->macaddr, adapter->hw.mac.addr)) { +			list_del(&f->list); +			kfree(f); +		} +	}  	/* re-add all MAC filters */  	list_for_each_entry(f, &adapter->mac_filter_list, list) {  		f->add = true; diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c index c46770eba320..1ab9cb339acb 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c @@ -1359,6 +1359,9 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,  			ether_addr_copy(netdev->perm_addr,  					adapter->hw.mac.addr);  		} +		spin_lock_bh(&adapter->mac_vlan_list_lock); +		iavf_add_filter(adapter, adapter->hw.mac.addr); +		spin_unlock_bh(&adapter->mac_vlan_list_lock);  		iavf_process_config(adapter);  		}  		break; diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index 8a6ef3514129..438b42ce2cd9 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c @@ -530,7 +530,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw)  		dev_spec->module_plugged = true;  		if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) {  			hw->phy.media_type = e1000_media_type_internal_serdes; -		} else if (eth_flags->e100_base_fx) { +		} else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) {  			dev_spec->sgmii_active = true;  			hw->phy.media_type = e1000_media_type_internal_serdes;  		} else if (eth_flags->e1000_base_t) { @@ -657,14 +657,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)  			break;  		} -		/* do not change link mode for 100BaseFX */ -		if (dev_spec->eth_flags.e100_base_fx) -			break; -  		/* change current link mode setting */  		ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK; -		if (hw->phy.media_type == e1000_media_type_copper) +		if (dev_spec->sgmii_active)  			ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII;  		else  			ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c index 4690d6c87f39..445fbdce3e25 100644 --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c @@ -181,7 +181,7 @@ static int igb_get_link_ksettings(struct net_device *netdev,  				advertising &= ~ADVERTISED_1000baseKX_Full;  			}  		} -		if (eth_flags->e100_base_fx) { +		if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) {  			supported |= SUPPORTED_100baseT_Full;  			advertising |= ADVERTISED_100baseT_Full;  		} diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 25c097cd8100..a2b2ad1f60b1 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -5239,7 +5239,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)  	struct ixgbe_hw *hw = &adapter->hw;  	struct hlist_node *node2;  	struct ixgbe_fdir_filter *filter; -	u64 action; +	u8 queue;  	spin_lock(&adapter->fdir_perfect_lock); @@ -5248,17 +5248,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)  	hlist_for_each_entry_safe(filter, node2,  				  &adapter->fdir_filter_list, fdir_node) { -		action = filter->action; -		if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) -			action = -			(action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; +		if (filter->action == IXGBE_FDIR_DROP_QUEUE) { +			queue = IXGBE_FDIR_DROP_QUEUE; +		} else { +			u32 ring = ethtool_get_flow_spec_ring(filter->action); +			u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); + +			if (!vf && (ring >= adapter->num_rx_queues)) { +				e_err(drv, "FDIR restore failed without VF, ring: %u\n", +				      ring); +				continue; +			} else if (vf && +				   ((vf > adapter->num_vfs) || +				     ring >= adapter->num_rx_queues_per_pool)) { +				e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", +				      vf, ring); +				continue; +			} + +			/* Map the ring onto the absolute queue index */ +			if (!vf) +				queue = adapter->rx_ring[ring]->reg_idx; +			else +				queue = ((vf - 1) * +					adapter->num_rx_queues_per_pool) + ring; +		}  		ixgbe_fdir_write_perfect_filter_82599(hw, -				&filter->filter, -				filter->sw_idx, -				(action == IXGBE_FDIR_DROP_QUEUE) ? -				IXGBE_FDIR_DROP_QUEUE : -				adapter->rx_ring[action]->reg_idx); +				&filter->filter, filter->sw_idx, queue);  	}  	spin_unlock(&adapter->fdir_perfect_lock); @@ -10261,7 +10278,12 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)  	/* If transitioning XDP modes reconfigure rings */  	if (need_reset) { -		int err = ixgbe_setup_tc(dev, adapter->hw_tcs); +		int err; + +		if (!prog) +			/* Wait until ndo_xsk_wakeup completes. */ +			synchronize_rcu(); +		err = ixgbe_setup_tc(dev, adapter->hw_tcs);  		if (err) {  			rcu_assign_pointer(adapter->xdp_prog, old_prog); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c index d6feaacfbf89..b43be9f14105 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c @@ -709,10 +709,14 @@ int ixgbe_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)  	if (qid >= adapter->num_xdp_queues)  		return -ENXIO; -	if (!adapter->xdp_ring[qid]->xsk_umem) +	ring = adapter->xdp_ring[qid]; + +	if (test_bit(__IXGBE_TX_DISABLED, &ring->state)) +		return -ENETDOWN; + +	if (!ring->xsk_umem)  		return -ENXIO; -	ring = adapter->xdp_ring[qid];  	if (!napi_if_scheduled_mark_missed(&ring->q_vector->napi)) {  		u64 eics = BIT_ULL(ring->q_vector->v_idx); diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 076f2da36f27..64ec0e7c64b4 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c @@ -2081,11 +2081,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev)  	struct ixgbe_hw *hw = &adapter->hw;  	int count = 0; -	if ((netdev_uc_count(netdev)) > 10) { -		pr_err("Too many unicast filters - No Space\n"); -		return -ENOSPC; -	} -  	if (!netdev_uc_empty(netdev)) {  		struct netdev_hw_addr *ha; | 
