|
@@ -39,7 +39,7 @@ static const char i40e_driver_string[] =
|
|
|
|
|
|
#define DRV_VERSION_MAJOR 0
|
|
|
#define DRV_VERSION_MINOR 4
|
|
|
-#define DRV_VERSION_BUILD 7
|
|
|
+#define DRV_VERSION_BUILD 10
|
|
|
#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \
|
|
|
__stringify(DRV_VERSION_MINOR) "." \
|
|
|
__stringify(DRV_VERSION_BUILD) DRV_KERN
|
|
@@ -1013,6 +1013,14 @@ static void i40e_update_pf_stats(struct i40e_pf *pf)
|
|
|
pf->stat_offsets_loaded,
|
|
|
&osd->rx_jabber, &nsd->rx_jabber);
|
|
|
|
|
|
+ /* FDIR stats */
|
|
|
+ i40e_stat_update32(hw, I40E_GLQF_PCNT(pf->fd_atr_cnt_idx),
|
|
|
+ pf->stat_offsets_loaded,
|
|
|
+ &osd->fd_atr_match, &nsd->fd_atr_match);
|
|
|
+ i40e_stat_update32(hw, I40E_GLQF_PCNT(pf->fd_sb_cnt_idx),
|
|
|
+ pf->stat_offsets_loaded,
|
|
|
+ &osd->fd_sb_match, &nsd->fd_sb_match);
|
|
|
+
|
|
|
val = rd32(hw, I40E_PRTPM_EEE_STAT);
|
|
|
nsd->tx_lpi_status =
|
|
|
(val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
|
|
@@ -1153,6 +1161,30 @@ struct i40e_mac_filter *i40e_put_mac_in_vlan(struct i40e_vsi *vsi, u8 *macaddr,
|
|
|
struct i40e_mac_filter, list);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * i40e_rm_default_mac_filter - Remove the default MAC filter set by NVM
|
|
|
+ * @vsi: the PF Main VSI - inappropriate for any other VSI
|
|
|
+ * @macaddr: the MAC address
|
|
|
+ **/
|
|
|
+static void i40e_rm_default_mac_filter(struct i40e_vsi *vsi, u8 *macaddr)
|
|
|
+{
|
|
|
+ struct i40e_aqc_remove_macvlan_element_data element;
|
|
|
+ struct i40e_pf *pf = vsi->back;
|
|
|
+ i40e_status aq_ret;
|
|
|
+
|
|
|
+ /* Only appropriate for the PF main VSI */
|
|
|
+ if (vsi->type != I40E_VSI_MAIN)
|
|
|
+ return;
|
|
|
+
|
|
|
+ ether_addr_copy(element.mac_addr, macaddr);
|
|
|
+ element.vlan_tag = 0;
|
|
|
+ element.flags = I40E_AQC_MACVLAN_DEL_PERFECT_MATCH |
|
|
|
+ I40E_AQC_MACVLAN_DEL_IGNORE_VLAN;
|
|
|
+ aq_ret = i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL);
|
|
|
+ if (aq_ret)
|
|
|
+ dev_err(&pf->pdev->dev, "Could not remove default MAC-VLAN\n");
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* i40e_add_filter - Add a mac/vlan filter to the VSI
|
|
|
* @vsi: the VSI to be searched
|
|
@@ -1178,7 +1210,7 @@ struct i40e_mac_filter *i40e_add_filter(struct i40e_vsi *vsi,
|
|
|
if (!f)
|
|
|
goto add_filter_out;
|
|
|
|
|
|
- memcpy(f->macaddr, macaddr, ETH_ALEN);
|
|
|
+ ether_addr_copy(f->macaddr, macaddr);
|
|
|
f->vlan = vlan;
|
|
|
f->changed = true;
|
|
|
|
|
@@ -1302,7 +1334,7 @@ static int i40e_set_mac(struct net_device *netdev, void *p)
|
|
|
return -EADDRNOTAVAIL;
|
|
|
}
|
|
|
|
|
|
- memcpy(vsi->back->hw.mac.addr, addr->sa_data, netdev->addr_len);
|
|
|
+ ether_addr_copy(vsi->back->hw.mac.addr, addr->sa_data);
|
|
|
}
|
|
|
|
|
|
/* In order to be sure to not drop any packets, add the new address
|
|
@@ -1316,7 +1348,7 @@ static int i40e_set_mac(struct net_device *netdev, void *p)
|
|
|
i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, false, false);
|
|
|
i40e_sync_vsi_filters(vsi);
|
|
|
|
|
|
- memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
|
|
|
+ ether_addr_copy(netdev->dev_addr, addr->sa_data);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1573,8 +1605,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
|
|
|
cmd_flags = 0;
|
|
|
|
|
|
/* add to delete list */
|
|
|
- memcpy(del_list[num_del].mac_addr,
|
|
|
- f->macaddr, ETH_ALEN);
|
|
|
+ ether_addr_copy(del_list[num_del].mac_addr, f->macaddr);
|
|
|
del_list[num_del].vlan_tag =
|
|
|
cpu_to_le16((u16)(f->vlan ==
|
|
|
I40E_VLAN_ANY ? 0 : f->vlan));
|
|
@@ -1639,8 +1670,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
|
|
|
cmd_flags = 0;
|
|
|
|
|
|
/* add to add array */
|
|
|
- memcpy(add_list[num_add].mac_addr,
|
|
|
- f->macaddr, ETH_ALEN);
|
|
|
+ ether_addr_copy(add_list[num_add].mac_addr, f->macaddr);
|
|
|
add_list[num_add].vlan_tag =
|
|
|
cpu_to_le16(
|
|
|
(u16)(f->vlan == I40E_VLAN_ANY ? 0 : f->vlan));
|
|
@@ -4130,7 +4160,11 @@ static int i40e_init_pf_dcb(struct i40e_pf *pf)
|
|
|
/* When status is not DISABLED then DCBX in FW */
|
|
|
pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED |
|
|
|
DCB_CAP_DCBX_VER_IEEE;
|
|
|
- pf->flags |= I40E_FLAG_DCB_ENABLED;
|
|
|
+
|
|
|
+ pf->flags |= I40E_FLAG_DCB_CAPABLE;
|
|
|
+ /* Enable DCB tagging only when more than one TC */
|
|
|
+ if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1)
|
|
|
+ pf->flags |= I40E_FLAG_DCB_ENABLED;
|
|
|
}
|
|
|
} else {
|
|
|
dev_info(&pf->pdev->dev, "AQ Querying DCB configuration failed: %d\n",
|
|
@@ -4685,6 +4719,10 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
|
|
|
int ret = 0;
|
|
|
u8 type;
|
|
|
|
|
|
+ /* Not DCB capable or capability disabled */
|
|
|
+ if (!(pf->flags & I40E_FLAG_DCB_CAPABLE))
|
|
|
+ return ret;
|
|
|
+
|
|
|
/* Ignore if event is not for Nearest Bridge */
|
|
|
type = ((mib->type >> I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT)
|
|
|
& I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
|
|
@@ -4726,6 +4764,12 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf,
|
|
|
if (!need_reconfig)
|
|
|
goto exit;
|
|
|
|
|
|
+ /* Enable DCB tagging only when more than one TC */
|
|
|
+ if (i40e_dcb_get_num_tc(dcbx_cfg) > 1)
|
|
|
+ pf->flags |= I40E_FLAG_DCB_ENABLED;
|
|
|
+ else
|
|
|
+ pf->flags &= ~I40E_FLAG_DCB_ENABLED;
|
|
|
+
|
|
|
/* Reconfiguration needed quiesce all VSIs */
|
|
|
i40e_pf_quiesce_all_vsi(pf);
|
|
|
|
|
@@ -6365,7 +6409,7 @@ static void i40e_init_interrupt_scheme(struct i40e_pf *pf)
|
|
|
if (err) {
|
|
|
pf->flags &= ~(I40E_FLAG_MSIX_ENABLED |
|
|
|
I40E_FLAG_RSS_ENABLED |
|
|
|
- I40E_FLAG_DCB_ENABLED |
|
|
|
+ I40E_FLAG_DCB_CAPABLE |
|
|
|
I40E_FLAG_SRIOV_ENABLED |
|
|
|
I40E_FLAG_FD_SB_ENABLED |
|
|
|
I40E_FLAG_FD_ATR_ENABLED |
|
|
@@ -6568,8 +6612,12 @@ static int i40e_sw_init(struct i40e_pf *pf)
|
|
|
(pf->hw.func_caps.fd_filters_best_effort > 0)) {
|
|
|
pf->flags |= I40E_FLAG_FD_ATR_ENABLED;
|
|
|
pf->atr_sample_rate = I40E_DEFAULT_ATR_SAMPLE_RATE;
|
|
|
+ /* Setup a counter for fd_atr per pf */
|
|
|
+ pf->fd_atr_cnt_idx = I40E_FD_ATR_STAT_IDX(pf->hw.pf_id);
|
|
|
if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) {
|
|
|
pf->flags |= I40E_FLAG_FD_SB_ENABLED;
|
|
|
+ /* Setup a counter for fd_sb per pf */
|
|
|
+ pf->fd_sb_cnt_idx = I40E_FD_SB_STAT_IDX(pf->hw.pf_id);
|
|
|
} else {
|
|
|
dev_info(&pf->pdev->dev,
|
|
|
"Flow Director Sideband mode Disabled in MFP mode\n");
|
|
@@ -6965,7 +7013,15 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
|
|
|
|
|
|
if (vsi->type == I40E_VSI_MAIN) {
|
|
|
SET_NETDEV_DEV(netdev, &pf->pdev->dev);
|
|
|
- memcpy(mac_addr, hw->mac.perm_addr, ETH_ALEN);
|
|
|
+ ether_addr_copy(mac_addr, hw->mac.perm_addr);
|
|
|
+ /* The following two steps are necessary to prevent reception
|
|
|
+ * of tagged packets - by default the NVM loads a MAC-VLAN
|
|
|
+ * filter that will accept any tagged packet. This is to
|
|
|
+ * prevent that during normal operations until a specific
|
|
|
+ * VLAN tag filter has been set.
|
|
|
+ */
|
|
|
+ i40e_rm_default_mac_filter(vsi, mac_addr);
|
|
|
+ i40e_add_filter(vsi, mac_addr, I40E_VLAN_ANY, false, true);
|
|
|
} else {
|
|
|
/* relate the VSI_VMDQ name to the VSI_MAIN name */
|
|
|
snprintf(netdev->name, IFNAMSIZ, "%sv%%d",
|
|
@@ -6975,8 +7031,8 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
|
|
|
}
|
|
|
i40e_add_filter(vsi, brdcast, I40E_VLAN_ANY, false, false);
|
|
|
|
|
|
- memcpy(netdev->dev_addr, mac_addr, ETH_ALEN);
|
|
|
- memcpy(netdev->perm_addr, mac_addr, ETH_ALEN);
|
|
|
+ ether_addr_copy(netdev->dev_addr, mac_addr);
|
|
|
+ ether_addr_copy(netdev->perm_addr, mac_addr);
|
|
|
/* vlan gets same features (except vlan offload)
|
|
|
* after any tweaks for specific VSI types
|
|
|
*/
|
|
@@ -8187,13 +8243,13 @@ static void i40e_determine_queue_usage(struct i40e_pf *pf)
|
|
|
pf->flags &= ~(I40E_FLAG_RSS_ENABLED |
|
|
|
I40E_FLAG_FD_SB_ENABLED |
|
|
|
I40E_FLAG_FD_ATR_ENABLED |
|
|
|
- I40E_FLAG_DCB_ENABLED |
|
|
|
+ I40E_FLAG_DCB_CAPABLE |
|
|
|
I40E_FLAG_SRIOV_ENABLED |
|
|
|
I40E_FLAG_VMDQ_ENABLED);
|
|
|
} else if (!(pf->flags & (I40E_FLAG_RSS_ENABLED |
|
|
|
I40E_FLAG_FD_SB_ENABLED |
|
|
|
I40E_FLAG_FD_ATR_ENABLED |
|
|
|
- I40E_FLAG_DCB_ENABLED))) {
|
|
|
+ I40E_FLAG_DCB_CAPABLE))) {
|
|
|
/* one qp for PF */
|
|
|
pf->rss_size = pf->num_lan_qps = 1;
|
|
|
queues_left -= pf->num_lan_qps;
|
|
@@ -8205,9 +8261,9 @@ static void i40e_determine_queue_usage(struct i40e_pf *pf)
|
|
|
I40E_FLAG_VMDQ_ENABLED);
|
|
|
} else {
|
|
|
/* Not enough queues for all TCs */
|
|
|
- if ((pf->flags & I40E_FLAG_DCB_ENABLED) &&
|
|
|
+ if ((pf->flags & I40E_FLAG_DCB_CAPABLE) &&
|
|
|
(queues_left < I40E_MAX_TRAFFIC_CLASS)) {
|
|
|
- pf->flags &= ~I40E_FLAG_DCB_ENABLED;
|
|
|
+ pf->flags &= ~I40E_FLAG_DCB_CAPABLE;
|
|
|
dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n");
|
|
|
}
|
|
|
pf->num_lan_qps = pf->rss_size_max;
|
|
@@ -8300,7 +8356,7 @@ static void i40e_print_features(struct i40e_pf *pf)
|
|
|
buf += sprintf(buf, "FD_SB ");
|
|
|
buf += sprintf(buf, "NTUPLE ");
|
|
|
}
|
|
|
- if (pf->flags & I40E_FLAG_DCB_ENABLED)
|
|
|
+ if (pf->flags & I40E_FLAG_DCB_CAPABLE)
|
|
|
buf += sprintf(buf, "DCB ");
|
|
|
if (pf->flags & I40E_FLAG_PTP)
|
|
|
buf += sprintf(buf, "PTP ");
|
|
@@ -8478,7 +8534,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
goto err_mac_addr;
|
|
|
}
|
|
|
dev_info(&pdev->dev, "MAC address: %pM\n", hw->mac.addr);
|
|
|
- memcpy(hw->mac.perm_addr, hw->mac.addr, ETH_ALEN);
|
|
|
+ ether_addr_copy(hw->mac.perm_addr, hw->mac.addr);
|
|
|
|
|
|
pci_set_drvdata(pdev, pf);
|
|
|
pci_save_state(pdev);
|
|
@@ -8486,7 +8542,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
err = i40e_init_pf_dcb(pf);
|
|
|
if (err) {
|
|
|
dev_info(&pdev->dev, "init_pf_dcb failed: %d\n", err);
|
|
|
- pf->flags &= ~I40E_FLAG_DCB_ENABLED;
|
|
|
+ pf->flags &= ~I40E_FLAG_DCB_CAPABLE;
|
|
|
/* Continue without DCB enabled */
|
|
|
}
|
|
|
#endif /* CONFIG_I40E_DCB */
|