|
@@ -39,7 +39,7 @@ static const char i40e_driver_string[] =
|
|
|
|
|
|
#define DRV_VERSION_MAJOR 0
|
|
#define DRV_VERSION_MAJOR 0
|
|
#define DRV_VERSION_MINOR 3
|
|
#define DRV_VERSION_MINOR 3
|
|
-#define DRV_VERSION_BUILD 36
|
|
|
|
|
|
+#define DRV_VERSION_BUILD 43
|
|
#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
|
|
#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
|
|
__stringify(DRV_VERSION_MINOR) "." \
|
|
__stringify(DRV_VERSION_MINOR) "." \
|
|
__stringify(DRV_VERSION_BUILD) DRV_KERN
|
|
__stringify(DRV_VERSION_BUILD) DRV_KERN
|
|
@@ -2312,6 +2312,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
|
|
rx_ctx.crcstrip = 1;
|
|
rx_ctx.crcstrip = 1;
|
|
rx_ctx.l2tsel = 1;
|
|
rx_ctx.l2tsel = 1;
|
|
rx_ctx.showiv = 1;
|
|
rx_ctx.showiv = 1;
|
|
|
|
+ /* set the prefena field to 1 because the manual says to */
|
|
|
|
+ rx_ctx.prefena = 1;
|
|
|
|
|
|
/* clear the context in the HMC */
|
|
/* clear the context in the HMC */
|
|
err = i40e_clear_lan_rx_queue_context(hw, pf_q);
|
|
err = i40e_clear_lan_rx_queue_context(hw, pf_q);
|
|
@@ -3163,9 +3165,7 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
|
|
usleep_range(1000, 2000);
|
|
usleep_range(1000, 2000);
|
|
}
|
|
}
|
|
/* Skip if the queue is already in the requested state */
|
|
/* Skip if the queue is already in the requested state */
|
|
- if (enable && (tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
|
|
|
- continue;
|
|
|
|
- if (!enable && !(tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
|
|
|
|
|
+ if (enable == !!(tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
/* turn on/off the queue */
|
|
/* turn on/off the queue */
|
|
@@ -3181,13 +3181,8 @@ static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable)
|
|
/* wait for the change to finish */
|
|
/* wait for the change to finish */
|
|
for (j = 0; j < 10; j++) {
|
|
for (j = 0; j < 10; j++) {
|
|
tx_reg = rd32(hw, I40E_QTX_ENA(pf_q));
|
|
tx_reg = rd32(hw, I40E_QTX_ENA(pf_q));
|
|
- if (enable) {
|
|
|
|
- if ((tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
|
|
|
- break;
|
|
|
|
- } else {
|
|
|
|
- if (!(tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ if (enable == !!(tx_reg & I40E_QTX_ENA_QENA_STAT_MASK))
|
|
|
|
+ break;
|
|
|
|
|
|
udelay(10);
|
|
udelay(10);
|
|
}
|
|
}
|
|
@@ -3226,15 +3221,9 @@ static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable)
|
|
usleep_range(1000, 2000);
|
|
usleep_range(1000, 2000);
|
|
}
|
|
}
|
|
|
|
|
|
- if (enable) {
|
|
|
|
- /* is STAT set ? */
|
|
|
|
- if ((rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
|
|
|
- continue;
|
|
|
|
- } else {
|
|
|
|
- /* is !STAT set ? */
|
|
|
|
- if (!(rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
|
|
+ /* Skip if the queue is already in the requested state */
|
|
|
|
+ if (enable == !!(rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
|
|
|
+ continue;
|
|
|
|
|
|
/* turn on/off the queue */
|
|
/* turn on/off the queue */
|
|
if (enable)
|
|
if (enable)
|
|
@@ -3247,13 +3236,8 @@ static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable)
|
|
for (j = 0; j < 10; j++) {
|
|
for (j = 0; j < 10; j++) {
|
|
rx_reg = rd32(hw, I40E_QRX_ENA(pf_q));
|
|
rx_reg = rd32(hw, I40E_QRX_ENA(pf_q));
|
|
|
|
|
|
- if (enable) {
|
|
|
|
- if ((rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
|
|
|
- break;
|
|
|
|
- } else {
|
|
|
|
- if (!(rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ if (enable == !!(rx_reg & I40E_QRX_ENA_QENA_STAT_MASK))
|
|
|
|
+ break;
|
|
|
|
|
|
udelay(10);
|
|
udelay(10);
|
|
}
|
|
}
|
|
@@ -3515,6 +3499,19 @@ static void i40e_napi_disable_all(struct i40e_vsi *vsi)
|
|
napi_disable(&vsi->q_vectors[q_idx]->napi);
|
|
napi_disable(&vsi->q_vectors[q_idx]->napi);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * i40e_vsi_close - Shut down a VSI
|
|
|
|
+ * @vsi: the vsi to be quelled
|
|
|
|
+ **/
|
|
|
|
+static void i40e_vsi_close(struct i40e_vsi *vsi)
|
|
|
|
+{
|
|
|
|
+ if (!test_and_set_bit(__I40E_DOWN, &vsi->state))
|
|
|
|
+ i40e_down(vsi);
|
|
|
|
+ i40e_vsi_free_irq(vsi);
|
|
|
|
+ i40e_vsi_free_tx_resources(vsi);
|
|
|
|
+ i40e_vsi_free_rx_resources(vsi);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* i40e_quiesce_vsi - Pause a given VSI
|
|
* i40e_quiesce_vsi - Pause a given VSI
|
|
* @vsi: the VSI being paused
|
|
* @vsi: the VSI being paused
|
|
@@ -3528,8 +3525,7 @@ static void i40e_quiesce_vsi(struct i40e_vsi *vsi)
|
|
if (vsi->netdev && netif_running(vsi->netdev)) {
|
|
if (vsi->netdev && netif_running(vsi->netdev)) {
|
|
vsi->netdev->netdev_ops->ndo_stop(vsi->netdev);
|
|
vsi->netdev->netdev_ops->ndo_stop(vsi->netdev);
|
|
} else {
|
|
} else {
|
|
- set_bit(__I40E_DOWN, &vsi->state);
|
|
|
|
- i40e_down(vsi);
|
|
|
|
|
|
+ i40e_vsi_close(vsi);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3546,7 +3542,7 @@ static void i40e_unquiesce_vsi(struct i40e_vsi *vsi)
|
|
if (vsi->netdev && netif_running(vsi->netdev))
|
|
if (vsi->netdev && netif_running(vsi->netdev))
|
|
vsi->netdev->netdev_ops->ndo_open(vsi->netdev);
|
|
vsi->netdev->netdev_ops->ndo_open(vsi->netdev);
|
|
else
|
|
else
|
|
- i40e_up(vsi); /* this clears the DOWN bit */
|
|
|
|
|
|
+ i40e_vsi_open(vsi); /* this clears the DOWN bit */
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -4304,24 +4300,32 @@ int i40e_vsi_open(struct i40e_vsi *vsi)
|
|
if (err)
|
|
if (err)
|
|
goto err_setup_rx;
|
|
goto err_setup_rx;
|
|
|
|
|
|
- if (!vsi->netdev) {
|
|
|
|
|
|
+ if (vsi->netdev) {
|
|
|
|
+ snprintf(int_name, sizeof(int_name) - 1, "%s-%s",
|
|
|
|
+ dev_driver_string(&pf->pdev->dev), vsi->netdev->name);
|
|
|
|
+ err = i40e_vsi_request_irq(vsi, int_name);
|
|
|
|
+ if (err)
|
|
|
|
+ goto err_setup_rx;
|
|
|
|
+
|
|
|
|
+ /* Notify the stack of the actual queue counts. */
|
|
|
|
+ err = netif_set_real_num_tx_queues(vsi->netdev,
|
|
|
|
+ vsi->num_queue_pairs);
|
|
|
|
+ if (err)
|
|
|
|
+ goto err_set_queues;
|
|
|
|
+
|
|
|
|
+ err = netif_set_real_num_rx_queues(vsi->netdev,
|
|
|
|
+ vsi->num_queue_pairs);
|
|
|
|
+ if (err)
|
|
|
|
+ goto err_set_queues;
|
|
|
|
+
|
|
|
|
+ } else if (vsi->type == I40E_VSI_FDIR) {
|
|
|
|
+ snprintf(int_name, sizeof(int_name) - 1, "%s-fdir",
|
|
|
|
+ dev_driver_string(&pf->pdev->dev));
|
|
|
|
+ err = i40e_vsi_request_irq(vsi, int_name);
|
|
|
|
+ } else {
|
|
err = EINVAL;
|
|
err = EINVAL;
|
|
goto err_setup_rx;
|
|
goto err_setup_rx;
|
|
}
|
|
}
|
|
- snprintf(int_name, sizeof(int_name) - 1, "%s-%s",
|
|
|
|
- dev_driver_string(&pf->pdev->dev), vsi->netdev->name);
|
|
|
|
- err = i40e_vsi_request_irq(vsi, int_name);
|
|
|
|
- if (err)
|
|
|
|
- goto err_setup_rx;
|
|
|
|
-
|
|
|
|
- /* Notify the stack of the actual queue counts. */
|
|
|
|
- err = netif_set_real_num_tx_queues(vsi->netdev, vsi->num_queue_pairs);
|
|
|
|
- if (err)
|
|
|
|
- goto err_set_queues;
|
|
|
|
-
|
|
|
|
- err = netif_set_real_num_rx_queues(vsi->netdev, vsi->num_queue_pairs);
|
|
|
|
- if (err)
|
|
|
|
- goto err_set_queues;
|
|
|
|
|
|
|
|
err = i40e_up_complete(vsi);
|
|
err = i40e_up_complete(vsi);
|
|
if (err)
|
|
if (err)
|
|
@@ -4378,14 +4382,7 @@ static int i40e_close(struct net_device *netdev)
|
|
struct i40e_netdev_priv *np = netdev_priv(netdev);
|
|
struct i40e_netdev_priv *np = netdev_priv(netdev);
|
|
struct i40e_vsi *vsi = np->vsi;
|
|
struct i40e_vsi *vsi = np->vsi;
|
|
|
|
|
|
- if (test_and_set_bit(__I40E_DOWN, &vsi->state))
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- i40e_down(vsi);
|
|
|
|
- i40e_vsi_free_irq(vsi);
|
|
|
|
-
|
|
|
|
- i40e_vsi_free_tx_resources(vsi);
|
|
|
|
- i40e_vsi_free_rx_resources(vsi);
|
|
|
|
|
|
+ i40e_vsi_close(vsi);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -5221,9 +5218,6 @@ static int i40e_get_capabilities(struct i40e_pf *pf)
|
|
}
|
|
}
|
|
} while (err);
|
|
} while (err);
|
|
|
|
|
|
- /* increment MSI-X count because current FW skips one */
|
|
|
|
- pf->hw.func_caps.num_msix_vectors++;
|
|
|
|
-
|
|
|
|
if (((pf->hw.aq.fw_maj_ver == 2) && (pf->hw.aq.fw_min_ver < 22)) ||
|
|
if (((pf->hw.aq.fw_maj_ver == 2) && (pf->hw.aq.fw_min_ver < 22)) ||
|
|
(pf->hw.aq.fw_maj_ver < 2)) {
|
|
(pf->hw.aq.fw_maj_ver < 2)) {
|
|
pf->hw.func_caps.num_msix_vectors++;
|
|
pf->hw.func_caps.num_msix_vectors++;
|
|
@@ -5262,8 +5256,7 @@ static int i40e_vsi_clear(struct i40e_vsi *vsi);
|
|
static void i40e_fdir_sb_setup(struct i40e_pf *pf)
|
|
static void i40e_fdir_sb_setup(struct i40e_pf *pf)
|
|
{
|
|
{
|
|
struct i40e_vsi *vsi;
|
|
struct i40e_vsi *vsi;
|
|
- bool new_vsi = false;
|
|
|
|
- int err, i;
|
|
|
|
|
|
+ int i;
|
|
|
|
|
|
if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED))
|
|
if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED))
|
|
return;
|
|
return;
|
|
@@ -5283,47 +5276,12 @@ static void i40e_fdir_sb_setup(struct i40e_pf *pf)
|
|
pf->vsi[pf->lan_vsi]->seid, 0);
|
|
pf->vsi[pf->lan_vsi]->seid, 0);
|
|
if (!vsi) {
|
|
if (!vsi) {
|
|
dev_info(&pf->pdev->dev, "Couldn't create FDir VSI\n");
|
|
dev_info(&pf->pdev->dev, "Couldn't create FDir VSI\n");
|
|
- goto err_vsi;
|
|
|
|
|
|
+ pf->flags &= ~I40E_FLAG_FD_SB_ENABLED;
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
- new_vsi = true;
|
|
|
|
- }
|
|
|
|
- i40e_vsi_setup_irqhandler(vsi, i40e_fdir_clean_ring);
|
|
|
|
-
|
|
|
|
- err = i40e_vsi_setup_tx_resources(vsi);
|
|
|
|
- if (err)
|
|
|
|
- goto err_setup_tx;
|
|
|
|
- err = i40e_vsi_setup_rx_resources(vsi);
|
|
|
|
- if (err)
|
|
|
|
- goto err_setup_rx;
|
|
|
|
-
|
|
|
|
- if (new_vsi) {
|
|
|
|
- char int_name[IFNAMSIZ + 9];
|
|
|
|
- err = i40e_vsi_configure(vsi);
|
|
|
|
- if (err)
|
|
|
|
- goto err_setup_rx;
|
|
|
|
- snprintf(int_name, sizeof(int_name) - 1, "%s-fdir",
|
|
|
|
- dev_driver_string(&pf->pdev->dev));
|
|
|
|
- err = i40e_vsi_request_irq(vsi, int_name);
|
|
|
|
- if (err)
|
|
|
|
- goto err_setup_rx;
|
|
|
|
- err = i40e_up_complete(vsi);
|
|
|
|
- if (err)
|
|
|
|
- goto err_up_complete;
|
|
|
|
- clear_bit(__I40E_NEEDS_RESTART, &vsi->state);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
-err_up_complete:
|
|
|
|
- i40e_down(vsi);
|
|
|
|
- i40e_vsi_free_irq(vsi);
|
|
|
|
-err_setup_rx:
|
|
|
|
- i40e_vsi_free_rx_resources(vsi);
|
|
|
|
-err_setup_tx:
|
|
|
|
- i40e_vsi_free_tx_resources(vsi);
|
|
|
|
-err_vsi:
|
|
|
|
- pf->flags &= ~I40E_FLAG_FD_SB_ENABLED;
|
|
|
|
- i40e_vsi_clear(vsi);
|
|
|
|
|
|
+ i40e_vsi_setup_irqhandler(vsi, i40e_fdir_clean_ring);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -6644,6 +6602,96 @@ static void i40e_del_vxlan_port(struct net_device *netdev,
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
+#ifdef HAVE_FDB_OPS
|
|
|
|
+#ifdef USE_CONST_DEV_UC_CHAR
|
|
|
|
+static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
|
|
|
|
+ struct net_device *dev,
|
|
|
|
+ const unsigned char *addr,
|
|
|
|
+ u16 flags)
|
|
|
|
+#else
|
|
|
|
+static int i40e_ndo_fdb_add(struct ndmsg *ndm,
|
|
|
|
+ struct net_device *dev,
|
|
|
|
+ unsigned char *addr,
|
|
|
|
+ u16 flags)
|
|
|
|
+#endif
|
|
|
|
+{
|
|
|
|
+ struct i40e_netdev_priv *np = netdev_priv(dev);
|
|
|
|
+ struct i40e_pf *pf = np->vsi->back;
|
|
|
|
+ int err = 0;
|
|
|
|
+
|
|
|
|
+ if (!(pf->flags & I40E_FLAG_SRIOV_ENABLED))
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+
|
|
|
|
+ /* Hardware does not support aging addresses so if a
|
|
|
|
+ * ndm_state is given only allow permanent addresses
|
|
|
|
+ */
|
|
|
|
+ if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) {
|
|
|
|
+ netdev_info(dev, "FDB only supports static addresses\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr))
|
|
|
|
+ err = dev_uc_add_excl(dev, addr);
|
|
|
|
+ else if (is_multicast_ether_addr(addr))
|
|
|
|
+ err = dev_mc_add_excl(dev, addr);
|
|
|
|
+ else
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+
|
|
|
|
+ /* Only return duplicate errors if NLM_F_EXCL is set */
|
|
|
|
+ if (err == -EEXIST && !(flags & NLM_F_EXCL))
|
|
|
|
+ err = 0;
|
|
|
|
+
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#ifndef USE_DEFAULT_FDB_DEL_DUMP
|
|
|
|
+#ifdef USE_CONST_DEV_UC_CHAR
|
|
|
|
+static int i40e_ndo_fdb_del(struct ndmsg *ndm,
|
|
|
|
+ struct net_device *dev,
|
|
|
|
+ const unsigned char *addr)
|
|
|
|
+#else
|
|
|
|
+static int i40e_ndo_fdb_del(struct ndmsg *ndm,
|
|
|
|
+ struct net_device *dev,
|
|
|
|
+ unsigned char *addr)
|
|
|
|
+#endif
|
|
|
|
+{
|
|
|
|
+ struct i40e_netdev_priv *np = netdev_priv(dev);
|
|
|
|
+ struct i40e_pf *pf = np->vsi->back;
|
|
|
|
+ int err = -EOPNOTSUPP;
|
|
|
|
+
|
|
|
|
+ if (ndm->ndm_state & NUD_PERMANENT) {
|
|
|
|
+ netdev_info(dev, "FDB only supports static addresses\n");
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (pf->flags & I40E_FLAG_SRIOV_ENABLED) {
|
|
|
|
+ if (is_unicast_ether_addr(addr))
|
|
|
|
+ err = dev_uc_del(dev, addr);
|
|
|
|
+ else if (is_multicast_ether_addr(addr))
|
|
|
|
+ err = dev_mc_del(dev, addr);
|
|
|
|
+ else
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int i40e_ndo_fdb_dump(struct sk_buff *skb,
|
|
|
|
+ struct netlink_callback *cb,
|
|
|
|
+ struct net_device *dev,
|
|
|
|
+ int idx)
|
|
|
|
+{
|
|
|
|
+ struct i40e_netdev_priv *np = netdev_priv(dev);
|
|
|
|
+ struct i40e_pf *pf = np->vsi->back;
|
|
|
|
+
|
|
|
|
+ if (pf->flags & I40E_FLAG_SRIOV_ENABLED)
|
|
|
|
+ idx = ndo_dflt_fdb_dump(skb, cb, dev, idx);
|
|
|
|
+
|
|
|
|
+ return idx;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif /* USE_DEFAULT_FDB_DEL_DUMP */
|
|
|
|
+#endif /* HAVE_FDB_OPS */
|
|
static const struct net_device_ops i40e_netdev_ops = {
|
|
static const struct net_device_ops i40e_netdev_ops = {
|
|
.ndo_open = i40e_open,
|
|
.ndo_open = i40e_open,
|
|
.ndo_stop = i40e_close,
|
|
.ndo_stop = i40e_close,
|
|
@@ -6671,6 +6719,13 @@ static const struct net_device_ops i40e_netdev_ops = {
|
|
.ndo_add_vxlan_port = i40e_add_vxlan_port,
|
|
.ndo_add_vxlan_port = i40e_add_vxlan_port,
|
|
.ndo_del_vxlan_port = i40e_del_vxlan_port,
|
|
.ndo_del_vxlan_port = i40e_del_vxlan_port,
|
|
#endif
|
|
#endif
|
|
|
|
+#ifdef HAVE_FDB_OPS
|
|
|
|
+ .ndo_fdb_add = i40e_ndo_fdb_add,
|
|
|
|
+#ifndef USE_DEFAULT_FDB_DEL_DUMP
|
|
|
|
+ .ndo_fdb_del = i40e_ndo_fdb_del,
|
|
|
|
+ .ndo_fdb_dump = i40e_ndo_fdb_dump,
|
|
|
|
+#endif
|
|
|
|
+#endif
|
|
};
|
|
};
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -6976,11 +7031,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
|
|
unregister_netdev(vsi->netdev);
|
|
unregister_netdev(vsi->netdev);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- if (!test_and_set_bit(__I40E_DOWN, &vsi->state))
|
|
|
|
- i40e_down(vsi);
|
|
|
|
- i40e_vsi_free_irq(vsi);
|
|
|
|
- i40e_vsi_free_tx_resources(vsi);
|
|
|
|
- i40e_vsi_free_rx_resources(vsi);
|
|
|
|
|
|
+ i40e_vsi_close(vsi);
|
|
}
|
|
}
|
|
i40e_vsi_disable_irq(vsi);
|
|
i40e_vsi_disable_irq(vsi);
|
|
}
|
|
}
|
|
@@ -8084,6 +8135,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
u16 link_status;
|
|
u16 link_status;
|
|
int err = 0;
|
|
int err = 0;
|
|
u32 len;
|
|
u32 len;
|
|
|
|
+ u32 i;
|
|
|
|
|
|
err = pci_enable_device_mem(pdev);
|
|
err = pci_enable_device_mem(pdev);
|
|
if (err)
|
|
if (err)
|
|
@@ -8273,6 +8325,13 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
dev_info(&pdev->dev, "setup_pf_switch failed: %d\n", err);
|
|
dev_info(&pdev->dev, "setup_pf_switch failed: %d\n", err);
|
|
goto err_vsis;
|
|
goto err_vsis;
|
|
}
|
|
}
|
|
|
|
+ /* if FDIR VSI was set up, start it now */
|
|
|
|
+ for (i = 0; i < pf->hw.func_caps.num_vsis; i++) {
|
|
|
|
+ if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) {
|
|
|
|
+ i40e_vsi_open(pf->vsi[i]);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
/* The main driver is (mostly) up and happy. We need to set this state
|
|
/* The main driver is (mostly) up and happy. We need to set this state
|
|
* before setting up the misc vector or we get a race and the vector
|
|
* before setting up the misc vector or we get a race and the vector
|