Merge branch 'bnx2x-fixes'
Michal Schmidt says: ==================== bnx2x: PTP crash, VF VLAN fixes here are fixes for a crash with PTP, a crash in setting of VF multicast addresses, and non-working VLAN filters configuration from the VF side. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>zero-colors
commit
b73d2da8c7
|
@ -13292,17 +13292,15 @@ static int bnx2x_init_dev(struct bnx2x *bp, struct pci_dev *pdev,
|
||||||
dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||||
NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_HIGHDMA;
|
NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_HIGHDMA;
|
||||||
|
|
||||||
/* VF with OLD Hypervisor or old PF do not support filtering */
|
|
||||||
if (IS_PF(bp)) {
|
if (IS_PF(bp)) {
|
||||||
if (chip_is_e1x)
|
if (chip_is_e1x)
|
||||||
bp->accept_any_vlan = true;
|
bp->accept_any_vlan = true;
|
||||||
else
|
else
|
||||||
dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
#ifdef CONFIG_BNX2X_SRIOV
|
|
||||||
} else if (bp->acquire_resp.pfdev_info.pf_cap & PFVF_CAP_VLAN_FILTER) {
|
|
||||||
dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
/* For VF we'll know whether to enable VLAN filtering after
|
||||||
|
* getting a response to CHANNEL_TLV_ACQUIRE from PF.
|
||||||
|
*/
|
||||||
|
|
||||||
dev->features |= dev->hw_features | NETIF_F_HW_VLAN_CTAG_RX;
|
dev->features |= dev->hw_features | NETIF_F_HW_VLAN_CTAG_RX;
|
||||||
dev->features |= NETIF_F_HIGHDMA;
|
dev->features |= NETIF_F_HIGHDMA;
|
||||||
|
@ -13738,7 +13736,7 @@ static int bnx2x_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
|
||||||
if (!netif_running(bp->dev)) {
|
if (!netif_running(bp->dev)) {
|
||||||
DP(BNX2X_MSG_PTP,
|
DP(BNX2X_MSG_PTP,
|
||||||
"PTP adjfreq called while the interface is down\n");
|
"PTP adjfreq called while the interface is down\n");
|
||||||
return -EFAULT;
|
return -ENETDOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ppb < 0) {
|
if (ppb < 0) {
|
||||||
|
@ -13797,6 +13795,12 @@ static int bnx2x_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
|
||||||
{
|
{
|
||||||
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
|
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
|
||||||
|
|
||||||
|
if (!netif_running(bp->dev)) {
|
||||||
|
DP(BNX2X_MSG_PTP,
|
||||||
|
"PTP adjtime called while the interface is down\n");
|
||||||
|
return -ENETDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
DP(BNX2X_MSG_PTP, "PTP adjtime called, delta = %llx\n", delta);
|
DP(BNX2X_MSG_PTP, "PTP adjtime called, delta = %llx\n", delta);
|
||||||
|
|
||||||
timecounter_adjtime(&bp->timecounter, delta);
|
timecounter_adjtime(&bp->timecounter, delta);
|
||||||
|
@ -13809,6 +13813,12 @@ static int bnx2x_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
|
||||||
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
|
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
|
||||||
u64 ns;
|
u64 ns;
|
||||||
|
|
||||||
|
if (!netif_running(bp->dev)) {
|
||||||
|
DP(BNX2X_MSG_PTP,
|
||||||
|
"PTP gettime called while the interface is down\n");
|
||||||
|
return -ENETDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
ns = timecounter_read(&bp->timecounter);
|
ns = timecounter_read(&bp->timecounter);
|
||||||
|
|
||||||
DP(BNX2X_MSG_PTP, "PTP gettime called, ns = %llu\n", ns);
|
DP(BNX2X_MSG_PTP, "PTP gettime called, ns = %llu\n", ns);
|
||||||
|
@ -13824,6 +13834,12 @@ static int bnx2x_ptp_settime(struct ptp_clock_info *ptp,
|
||||||
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
|
struct bnx2x *bp = container_of(ptp, struct bnx2x, ptp_clock_info);
|
||||||
u64 ns;
|
u64 ns;
|
||||||
|
|
||||||
|
if (!netif_running(bp->dev)) {
|
||||||
|
DP(BNX2X_MSG_PTP,
|
||||||
|
"PTP settime called while the interface is down\n");
|
||||||
|
return -ENETDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
ns = timespec64_to_ns(ts);
|
ns = timespec64_to_ns(ts);
|
||||||
|
|
||||||
DP(BNX2X_MSG_PTP, "PTP settime called, ns = %llu\n", ns);
|
DP(BNX2X_MSG_PTP, "PTP settime called, ns = %llu\n", ns);
|
||||||
|
@ -13991,6 +14007,14 @@ static int bnx2x_init_one(struct pci_dev *pdev,
|
||||||
rc = bnx2x_vfpf_acquire(bp, tx_count, rx_count);
|
rc = bnx2x_vfpf_acquire(bp, tx_count, rx_count);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto init_one_freemem;
|
goto init_one_freemem;
|
||||||
|
|
||||||
|
#ifdef CONFIG_BNX2X_SRIOV
|
||||||
|
/* VF with OLD Hypervisor or old PF do not support filtering */
|
||||||
|
if (bp->acquire_resp.pfdev_info.pf_cap & PFVF_CAP_VLAN_FILTER) {
|
||||||
|
dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable SRIOV if capability found in configuration space */
|
/* Enable SRIOV if capability found in configuration space */
|
||||||
|
|
|
@ -434,7 +434,9 @@ static int bnx2x_vf_mac_vlan_config(struct bnx2x *bp,
|
||||||
|
|
||||||
/* Add/Remove the filter */
|
/* Add/Remove the filter */
|
||||||
rc = bnx2x_config_vlan_mac(bp, &ramrod);
|
rc = bnx2x_config_vlan_mac(bp, &ramrod);
|
||||||
if (rc && rc != -EEXIST) {
|
if (rc == -EEXIST)
|
||||||
|
return 0;
|
||||||
|
if (rc) {
|
||||||
BNX2X_ERR("Failed to %s %s\n",
|
BNX2X_ERR("Failed to %s %s\n",
|
||||||
filter->add ? "add" : "delete",
|
filter->add ? "add" : "delete",
|
||||||
(filter->type == BNX2X_VF_FILTER_VLAN_MAC) ?
|
(filter->type == BNX2X_VF_FILTER_VLAN_MAC) ?
|
||||||
|
@ -444,6 +446,8 @@ static int bnx2x_vf_mac_vlan_config(struct bnx2x *bp,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filter->applied = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,8 +473,10 @@ int bnx2x_vf_mac_vlan_config_list(struct bnx2x *bp, struct bnx2x_virtf *vf,
|
||||||
/* Rollback if needed */
|
/* Rollback if needed */
|
||||||
if (i != filters->count) {
|
if (i != filters->count) {
|
||||||
BNX2X_ERR("Managed only %d/%d filters - rolling back\n",
|
BNX2X_ERR("Managed only %d/%d filters - rolling back\n",
|
||||||
i, filters->count + 1);
|
i, filters->count);
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
|
if (!filters->filters[i].applied)
|
||||||
|
continue;
|
||||||
filters->filters[i].add = !filters->filters[i].add;
|
filters->filters[i].add = !filters->filters[i].add;
|
||||||
bnx2x_vf_mac_vlan_config(bp, vf, qid,
|
bnx2x_vf_mac_vlan_config(bp, vf, qid,
|
||||||
&filters->filters[i],
|
&filters->filters[i],
|
||||||
|
@ -1899,7 +1905,8 @@ void bnx2x_iov_adjust_stats_req(struct bnx2x *bp)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DP(BNX2X_MSG_IOV, "add addresses for vf %d\n", vf->abs_vfid);
|
DP_AND((BNX2X_MSG_IOV | BNX2X_MSG_STATS),
|
||||||
|
"add addresses for vf %d\n", vf->abs_vfid);
|
||||||
for_each_vfq(vf, j) {
|
for_each_vfq(vf, j) {
|
||||||
struct bnx2x_vf_queue *rxq = vfq_get(vf, j);
|
struct bnx2x_vf_queue *rxq = vfq_get(vf, j);
|
||||||
|
|
||||||
|
@ -1920,11 +1927,12 @@ void bnx2x_iov_adjust_stats_req(struct bnx2x *bp)
|
||||||
cpu_to_le32(U64_HI(q_stats_addr));
|
cpu_to_le32(U64_HI(q_stats_addr));
|
||||||
cur_query_entry->address.lo =
|
cur_query_entry->address.lo =
|
||||||
cpu_to_le32(U64_LO(q_stats_addr));
|
cpu_to_le32(U64_LO(q_stats_addr));
|
||||||
DP(BNX2X_MSG_IOV,
|
DP_AND((BNX2X_MSG_IOV | BNX2X_MSG_STATS),
|
||||||
"added address %x %x for vf %d queue %d client %d\n",
|
"added address %x %x for vf %d queue %d client %d\n",
|
||||||
cur_query_entry->address.hi,
|
cur_query_entry->address.hi,
|
||||||
cur_query_entry->address.lo, cur_query_entry->funcID,
|
cur_query_entry->address.lo,
|
||||||
j, cur_query_entry->index);
|
cur_query_entry->funcID,
|
||||||
|
j, cur_query_entry->index);
|
||||||
cur_query_entry++;
|
cur_query_entry++;
|
||||||
cur_data_offset += sizeof(struct per_queue_stats);
|
cur_data_offset += sizeof(struct per_queue_stats);
|
||||||
stats_count++;
|
stats_count++;
|
||||||
|
|
|
@ -114,6 +114,7 @@ struct bnx2x_vf_mac_vlan_filter {
|
||||||
(BNX2X_VF_FILTER_MAC | BNX2X_VF_FILTER_VLAN) /*shortcut*/
|
(BNX2X_VF_FILTER_MAC | BNX2X_VF_FILTER_VLAN) /*shortcut*/
|
||||||
|
|
||||||
bool add;
|
bool add;
|
||||||
|
bool applied;
|
||||||
u8 *mac;
|
u8 *mac;
|
||||||
u16 vid;
|
u16 vid;
|
||||||
};
|
};
|
||||||
|
|
|
@ -868,7 +868,7 @@ int bnx2x_vfpf_set_mcast(struct net_device *dev)
|
||||||
struct bnx2x *bp = netdev_priv(dev);
|
struct bnx2x *bp = netdev_priv(dev);
|
||||||
struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
|
struct vfpf_set_q_filters_tlv *req = &bp->vf2pf_mbox->req.set_q_filters;
|
||||||
struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
|
struct pfvf_general_resp_tlv *resp = &bp->vf2pf_mbox->resp.general_resp;
|
||||||
int rc, i = 0;
|
int rc = 0, i = 0;
|
||||||
struct netdev_hw_addr *ha;
|
struct netdev_hw_addr *ha;
|
||||||
|
|
||||||
if (bp->state != BNX2X_STATE_OPEN) {
|
if (bp->state != BNX2X_STATE_OPEN) {
|
||||||
|
@ -883,6 +883,15 @@ int bnx2x_vfpf_set_mcast(struct net_device *dev)
|
||||||
/* Get Rx mode requested */
|
/* Get Rx mode requested */
|
||||||
DP(NETIF_MSG_IFUP, "dev->flags = %x\n", dev->flags);
|
DP(NETIF_MSG_IFUP, "dev->flags = %x\n", dev->flags);
|
||||||
|
|
||||||
|
/* We support PFVF_MAX_MULTICAST_PER_VF mcast addresses tops */
|
||||||
|
if (netdev_mc_count(dev) > PFVF_MAX_MULTICAST_PER_VF) {
|
||||||
|
DP(NETIF_MSG_IFUP,
|
||||||
|
"VF supports not more than %d multicast MAC addresses\n",
|
||||||
|
PFVF_MAX_MULTICAST_PER_VF);
|
||||||
|
rc = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
netdev_for_each_mc_addr(ha, dev) {
|
netdev_for_each_mc_addr(ha, dev) {
|
||||||
DP(NETIF_MSG_IFUP, "Adding mcast MAC: %pM\n",
|
DP(NETIF_MSG_IFUP, "Adding mcast MAC: %pM\n",
|
||||||
bnx2x_mc_addr(ha));
|
bnx2x_mc_addr(ha));
|
||||||
|
@ -890,16 +899,6 @@ int bnx2x_vfpf_set_mcast(struct net_device *dev)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We support four PFVF_MAX_MULTICAST_PER_VF mcast
|
|
||||||
* addresses tops
|
|
||||||
*/
|
|
||||||
if (i >= PFVF_MAX_MULTICAST_PER_VF) {
|
|
||||||
DP(NETIF_MSG_IFUP,
|
|
||||||
"VF supports not more than %d multicast MAC addresses\n",
|
|
||||||
PFVF_MAX_MULTICAST_PER_VF);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
req->n_multicast = i;
|
req->n_multicast = i;
|
||||||
req->flags |= VFPF_SET_Q_FILTERS_MULTICAST_CHANGED;
|
req->flags |= VFPF_SET_Q_FILTERS_MULTICAST_CHANGED;
|
||||||
req->vf_qid = 0;
|
req->vf_qid = 0;
|
||||||
|
@ -924,7 +923,7 @@ int bnx2x_vfpf_set_mcast(struct net_device *dev)
|
||||||
out:
|
out:
|
||||||
bnx2x_vfpf_finalize(bp, &req->first_tlv);
|
bnx2x_vfpf_finalize(bp, &req->first_tlv);
|
||||||
|
|
||||||
return 0;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* request pf to add a vlan for the vf */
|
/* request pf to add a vlan for the vf */
|
||||||
|
@ -1778,6 +1777,23 @@ static int bnx2x_vf_mbx_qfilters(struct bnx2x *bp, struct bnx2x_virtf *vf)
|
||||||
goto op_err;
|
goto op_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* build vlan list */
|
||||||
|
fl = NULL;
|
||||||
|
|
||||||
|
rc = bnx2x_vf_mbx_macvlan_list(bp, vf, msg, &fl,
|
||||||
|
VFPF_VLAN_FILTER);
|
||||||
|
if (rc)
|
||||||
|
goto op_err;
|
||||||
|
|
||||||
|
if (fl) {
|
||||||
|
/* set vlan list */
|
||||||
|
rc = bnx2x_vf_mac_vlan_config_list(bp, vf, fl,
|
||||||
|
msg->vf_qid,
|
||||||
|
false);
|
||||||
|
if (rc)
|
||||||
|
goto op_err;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->flags & VFPF_SET_Q_FILTERS_RX_MASK_CHANGED) {
|
if (msg->flags & VFPF_SET_Q_FILTERS_RX_MASK_CHANGED) {
|
||||||
|
|
Loading…
Reference in New Issue