|
@@ -7536,6 +7536,7 @@ static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)
|
|
|
{
|
|
|
struct ixgbe_fwd_adapter *fwd_adapter = NULL;
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(pdev);
|
|
|
+ unsigned int limit;
|
|
|
int pool, err;
|
|
|
|
|
|
#ifdef CONFIG_RPS
|
|
@@ -7566,10 +7567,11 @@ static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)
|
|
|
pool = find_first_zero_bit(&adapter->fwd_bitmask, 32);
|
|
|
adapter->num_rx_pools++;
|
|
|
set_bit(pool, &adapter->fwd_bitmask);
|
|
|
+ limit = find_last_bit(&adapter->fwd_bitmask, 32);
|
|
|
|
|
|
/* Enable VMDq flag so device will be set in VM mode */
|
|
|
adapter->flags |= IXGBE_FLAG_VMDQ_ENABLED | IXGBE_FLAG_SRIOV_ENABLED;
|
|
|
- adapter->ring_feature[RING_F_VMDQ].limit = adapter->num_rx_pools;
|
|
|
+ adapter->ring_feature[RING_F_VMDQ].limit = limit + 1;
|
|
|
adapter->ring_feature[RING_F_RSS].limit = vdev->num_tx_queues;
|
|
|
|
|
|
/* Force reinit of ring allocation with VMDQ enabled */
|
|
@@ -7597,11 +7599,13 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv)
|
|
|
{
|
|
|
struct ixgbe_fwd_adapter *fwd_adapter = priv;
|
|
|
struct ixgbe_adapter *adapter = fwd_adapter->real_adapter;
|
|
|
+ unsigned int limit;
|
|
|
|
|
|
clear_bit(fwd_adapter->pool, &adapter->fwd_bitmask);
|
|
|
adapter->num_rx_pools--;
|
|
|
|
|
|
- adapter->ring_feature[RING_F_VMDQ].limit = adapter->num_rx_pools;
|
|
|
+ limit = find_last_bit(&adapter->fwd_bitmask, 32);
|
|
|
+ adapter->ring_feature[RING_F_VMDQ].limit = limit + 1;
|
|
|
ixgbe_fwd_ring_down(fwd_adapter->netdev, fwd_adapter);
|
|
|
ixgbe_setup_tc(pdev, netdev_get_num_tc(pdev));
|
|
|
netdev_dbg(pdev, "pool %i:%i queues %i:%i VSI bitmask %lx\n",
|