Merge branch 'bnx2x-enhancements'
Shahed Shaikh says: ==================== bnx2x: enhancements This series adds below changes - - support for VF spoof-check configuration through .ndo_set_vf_spoofchk. - workaround for MFW bug regarding unexpected bandwidth notifcation in single function mode. - supply VF link status as part of get VF config handling. ==================== Signed-off-by: Shahed Shaikh <shahed.shaikh@cavium.com> Signed-off-by: Ariel Elior <ariel.elior@cavium.com>
This commit is contained in:
commit
957b085c79
|
@ -494,6 +494,7 @@ int bnx2x_get_vf_config(struct net_device *dev, int vf,
|
||||||
int bnx2x_set_vf_mac(struct net_device *dev, int queue, u8 *mac);
|
int bnx2x_set_vf_mac(struct net_device *dev, int queue, u8 *mac);
|
||||||
int bnx2x_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos,
|
int bnx2x_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos,
|
||||||
__be16 vlan_proto);
|
__be16 vlan_proto);
|
||||||
|
int bnx2x_set_vf_spoofchk(struct net_device *dev, int idx, bool val);
|
||||||
|
|
||||||
/* select_queue callback */
|
/* select_queue callback */
|
||||||
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
|
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||||
|
|
|
@ -3536,6 +3536,16 @@ static void bnx2x_drv_info_iscsi_stat(struct bnx2x *bp)
|
||||||
*/
|
*/
|
||||||
static void bnx2x_config_mf_bw(struct bnx2x *bp)
|
static void bnx2x_config_mf_bw(struct bnx2x *bp)
|
||||||
{
|
{
|
||||||
|
/* Workaround for MFW bug.
|
||||||
|
* MFW is not supposed to generate BW attention in
|
||||||
|
* single function mode.
|
||||||
|
*/
|
||||||
|
if (!IS_MF(bp)) {
|
||||||
|
DP(BNX2X_MSG_MCP,
|
||||||
|
"Ignoring MF BW config in single function mode\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (bp->link_vars.link_up) {
|
if (bp->link_vars.link_up) {
|
||||||
bnx2x_cmng_fns_init(bp, true, CMNG_FNS_MINMAX);
|
bnx2x_cmng_fns_init(bp, true, CMNG_FNS_MINMAX);
|
||||||
bnx2x_link_sync_notify(bp);
|
bnx2x_link_sync_notify(bp);
|
||||||
|
@ -13121,6 +13131,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {
|
||||||
.ndo_set_vf_mac = bnx2x_set_vf_mac,
|
.ndo_set_vf_mac = bnx2x_set_vf_mac,
|
||||||
.ndo_set_vf_vlan = bnx2x_set_vf_vlan,
|
.ndo_set_vf_vlan = bnx2x_set_vf_vlan,
|
||||||
.ndo_get_vf_config = bnx2x_get_vf_config,
|
.ndo_get_vf_config = bnx2x_get_vf_config,
|
||||||
|
.ndo_set_vf_spoofchk = bnx2x_set_vf_spoofchk,
|
||||||
#endif
|
#endif
|
||||||
#ifdef NETDEV_FCOE_WWNN
|
#ifdef NETDEV_FCOE_WWNN
|
||||||
.ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn,
|
.ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn,
|
||||||
|
|
|
@ -209,7 +209,10 @@ void bnx2x_vfop_qctor_prep(struct bnx2x *bp,
|
||||||
*/
|
*/
|
||||||
__set_bit(BNX2X_Q_FLG_TX_SWITCH, &setup_p->flags);
|
__set_bit(BNX2X_Q_FLG_TX_SWITCH, &setup_p->flags);
|
||||||
__set_bit(BNX2X_Q_FLG_TX_SEC, &setup_p->flags);
|
__set_bit(BNX2X_Q_FLG_TX_SEC, &setup_p->flags);
|
||||||
|
if (vf->spoofchk)
|
||||||
__set_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
|
__set_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
|
||||||
|
else
|
||||||
|
__clear_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
|
||||||
|
|
||||||
/* Setup-op rx parameters */
|
/* Setup-op rx parameters */
|
||||||
if (test_bit(BNX2X_Q_TYPE_HAS_RX, &q_type)) {
|
if (test_bit(BNX2X_Q_TYPE_HAS_RX, &q_type)) {
|
||||||
|
@ -1269,6 +1272,8 @@ int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param,
|
||||||
bnx2x_vf(bp, i, state) = VF_FREE;
|
bnx2x_vf(bp, i, state) = VF_FREE;
|
||||||
mutex_init(&bnx2x_vf(bp, i, op_mutex));
|
mutex_init(&bnx2x_vf(bp, i, op_mutex));
|
||||||
bnx2x_vf(bp, i, op_current) = CHANNEL_TLV_NONE;
|
bnx2x_vf(bp, i, op_current) = CHANNEL_TLV_NONE;
|
||||||
|
/* enable spoofchk by default */
|
||||||
|
bnx2x_vf(bp, i, spoofchk) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* re-read the IGU CAM for VFs - index and abs_vfid must be set */
|
/* re-read the IGU CAM for VFs - index and abs_vfid must be set */
|
||||||
|
@ -2632,7 +2637,8 @@ int bnx2x_get_vf_config(struct net_device *dev, int vfidx,
|
||||||
ivi->qos = 0;
|
ivi->qos = 0;
|
||||||
ivi->max_tx_rate = 10000; /* always 10G. TBA take from link struct */
|
ivi->max_tx_rate = 10000; /* always 10G. TBA take from link struct */
|
||||||
ivi->min_tx_rate = 0;
|
ivi->min_tx_rate = 0;
|
||||||
ivi->spoofchk = 1; /*always enabled */
|
ivi->spoofchk = vf->spoofchk ? 1 : 0;
|
||||||
|
ivi->linkstate = vf->link_cfg;
|
||||||
if (vf->state == VF_ENABLED) {
|
if (vf->state == VF_ENABLED) {
|
||||||
/* mac and vlan are in vlan_mac objects */
|
/* mac and vlan are in vlan_mac objects */
|
||||||
if (bnx2x_validate_vf_sp_objs(bp, vf, false)) {
|
if (bnx2x_validate_vf_sp_objs(bp, vf, false)) {
|
||||||
|
@ -2950,6 +2956,77 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bnx2x_set_vf_spoofchk(struct net_device *dev, int idx, bool val)
|
||||||
|
{
|
||||||
|
struct bnx2x *bp = netdev_priv(dev);
|
||||||
|
struct bnx2x_virtf *vf;
|
||||||
|
int i, rc = 0;
|
||||||
|
|
||||||
|
vf = BP_VF(bp, idx);
|
||||||
|
if (!vf)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* nothing to do */
|
||||||
|
if (vf->spoofchk == val)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
vf->spoofchk = val ? 1 : 0;
|
||||||
|
|
||||||
|
DP(BNX2X_MSG_IOV, "%s spoofchk for VF %d\n",
|
||||||
|
val ? "enabling" : "disabling", idx);
|
||||||
|
|
||||||
|
/* is vf initialized and queue set up? */
|
||||||
|
if (vf->state != VF_ENABLED ||
|
||||||
|
bnx2x_get_q_logical_state(bp, &bnx2x_leading_vfq(vf, sp_obj)) !=
|
||||||
|
BNX2X_Q_LOGICAL_STATE_ACTIVE)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
/* User should be able to see error in system logs */
|
||||||
|
if (!bnx2x_validate_vf_sp_objs(bp, vf, true))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* send queue update ramrods to configure spoofchk */
|
||||||
|
for_each_vfq(vf, i) {
|
||||||
|
struct bnx2x_queue_state_params q_params = {NULL};
|
||||||
|
struct bnx2x_queue_update_params *update_params;
|
||||||
|
|
||||||
|
q_params.q_obj = &bnx2x_vfq(vf, i, sp_obj);
|
||||||
|
|
||||||
|
/* validate the Q is UP */
|
||||||
|
if (bnx2x_get_q_logical_state(bp, q_params.q_obj) !=
|
||||||
|
BNX2X_Q_LOGICAL_STATE_ACTIVE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
__set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags);
|
||||||
|
q_params.cmd = BNX2X_Q_CMD_UPDATE;
|
||||||
|
update_params = &q_params.params.update;
|
||||||
|
__set_bit(BNX2X_Q_UPDATE_ANTI_SPOOF_CHNG,
|
||||||
|
&update_params->update_flags);
|
||||||
|
if (val) {
|
||||||
|
__set_bit(BNX2X_Q_UPDATE_ANTI_SPOOF,
|
||||||
|
&update_params->update_flags);
|
||||||
|
} else {
|
||||||
|
__clear_bit(BNX2X_Q_UPDATE_ANTI_SPOOF,
|
||||||
|
&update_params->update_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the Queue state */
|
||||||
|
rc = bnx2x_queue_state_change(bp, &q_params);
|
||||||
|
if (rc) {
|
||||||
|
BNX2X_ERR("Failed to %s spoofchk on VF %d - vfq %d\n",
|
||||||
|
val ? "enable" : "disable", idx, i);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
if (!rc)
|
||||||
|
DP(BNX2X_MSG_IOV,
|
||||||
|
"%s spoofchk for VF[%d]\n", val ? "Enabled" : "Disabled",
|
||||||
|
idx);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/* crc is the first field in the bulletin board. Compute the crc over the
|
/* crc is the first field in the bulletin board. Compute the crc over the
|
||||||
* entire bulletin board excluding the crc field itself. Use the length field
|
* entire bulletin board excluding the crc field itself. Use the length field
|
||||||
* as the Bulletin Board was posted by a PF with possibly a different version
|
* as the Bulletin Board was posted by a PF with possibly a different version
|
||||||
|
|
|
@ -142,6 +142,8 @@ struct bnx2x_virtf {
|
||||||
|
|
||||||
bool flr_clnup_stage; /* true during flr cleanup */
|
bool flr_clnup_stage; /* true during flr cleanup */
|
||||||
bool malicious; /* true if FW indicated so, until FLR */
|
bool malicious; /* true if FW indicated so, until FLR */
|
||||||
|
/* 1(true) if spoof check is enabled */
|
||||||
|
u8 spoofchk;
|
||||||
|
|
||||||
/* dma */
|
/* dma */
|
||||||
dma_addr_t fw_stat_map;
|
dma_addr_t fw_stat_map;
|
||||||
|
|
Loading…
Reference in New Issue