Skip to content

Commit

Permalink
cxgb4: Add VF Link state support
Browse files Browse the repository at this point in the history
Use ndo_set_vf_link_state to control the link states associated
with the virtual interfaces.

Signed-off-by: Arjun Vynipadath <arjun@chelsio.com>
Signed-off-by: Vishal Kulkarni <vishal@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arjun Vynipadath authored and David S. Miller committed Mar 2, 2019
1 parent 3d78bfa commit 8b965f3
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 6 deletions.
1 change: 1 addition & 0 deletions drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,7 @@ struct vf_info {
unsigned int tx_rate;
bool pf_set_mac;
u16 vlan;
int link_state;
};

enum {
Expand Down
57 changes: 51 additions & 6 deletions drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2740,6 +2740,7 @@ static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
ivi->min_tx_rate = 0;
ether_addr_copy(ivi->mac, vfinfo->vf_mac_addr);
ivi->vlan = vfinfo->vlan;
ivi->linkstate = vfinfo->link_state;
return 0;
}

Expand Down Expand Up @@ -2879,6 +2880,49 @@ static int cxgb4_mgmt_set_vf_vlan(struct net_device *dev, int vf,
ret, (vlan ? "setting" : "clearing"), adap->pf, vf);
return ret;
}

static int cxgb4_mgmt_set_vf_link_state(struct net_device *dev, int vf,
int link)
{
struct port_info *pi = netdev_priv(dev);
struct adapter *adap = pi->adapter;
u32 param, val;
int ret = 0;

if (vf >= adap->num_vfs)
return -EINVAL;

switch (link) {
case IFLA_VF_LINK_STATE_AUTO:
val = FW_VF_LINK_STATE_AUTO;
break;

case IFLA_VF_LINK_STATE_ENABLE:
val = FW_VF_LINK_STATE_ENABLE;
break;

case IFLA_VF_LINK_STATE_DISABLE:
val = FW_VF_LINK_STATE_DISABLE;
break;

default:
return -EINVAL;
}

param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_PFVF) |
FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_PFVF_LINK_STATE));
ret = t4_set_params(adap, adap->mbox, adap->pf, vf + 1, 1,
&param, &val);
if (ret) {
dev_err(adap->pdev_dev,
"Error %d in setting PF %d VF %d link state\n",
ret, adap->pf, vf);
return -EINVAL;
}

adap->vfinfo[vf].link_state = link;
return ret;
}
#endif /* CONFIG_PCI_IOV */

static int cxgb_set_mac_addr(struct net_device *dev, void *p)
Expand Down Expand Up @@ -3294,12 +3338,13 @@ static const struct net_device_ops cxgb4_netdev_ops = {

#ifdef CONFIG_PCI_IOV
static const struct net_device_ops cxgb4_mgmt_netdev_ops = {
.ndo_open = cxgb4_mgmt_open,
.ndo_set_vf_mac = cxgb4_mgmt_set_vf_mac,
.ndo_get_vf_config = cxgb4_mgmt_get_vf_config,
.ndo_set_vf_rate = cxgb4_mgmt_set_vf_rate,
.ndo_get_phys_port_id = cxgb4_mgmt_get_phys_port_id,
.ndo_set_vf_vlan = cxgb4_mgmt_set_vf_vlan,
.ndo_open = cxgb4_mgmt_open,
.ndo_set_vf_mac = cxgb4_mgmt_set_vf_mac,
.ndo_get_vf_config = cxgb4_mgmt_get_vf_config,
.ndo_set_vf_rate = cxgb4_mgmt_set_vf_rate,
.ndo_get_phys_port_id = cxgb4_mgmt_get_phys_port_id,
.ndo_set_vf_vlan = cxgb4_mgmt_set_vf_vlan,
.ndo_set_vf_link_state = cxgb4_mgmt_set_vf_link_state,
};
#endif

Expand Down
8 changes: 8 additions & 0 deletions drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,14 @@ enum fw_params_param_pfvf {
FW_PARAMS_PARAM_PFVF_RAWF_END = 0x37,
FW_PARAMS_PARAM_PFVF_NCRYPTO_LOOKASIDE = 0x39,
FW_PARAMS_PARAM_PFVF_PORT_CAPS32 = 0x3A,
FW_PARAMS_PARAM_PFVF_LINK_STATE = 0x40,
};

/* Virtual link state as seen by the specified VF */
enum vf_link_states {
FW_VF_LINK_STATE_AUTO = 0x00,
FW_VF_LINK_STATE_ENABLE = 0x01,
FW_VF_LINK_STATE_DISABLE = 0x02,
};

/*
Expand Down

0 comments on commit 8b965f3

Please sign in to comment.