Commit 0960004b authored by David S. Miller's avatar David S. Miller

Merge branch 'cxgb4-vf-link-state'

Arjun Vynipadath says:

====================
cxgb4/cxgb4vf: VF link state support

This series of patches adds support for ndo_set_vf_link_state in
cxgb4 driver.

Patch 1 implements ndo_set_vf_link_state
Patch 2 reverts the existing force_link_up behaviour for cxgb4vf driver.

v2:
- Using reverse christmas tree for variable declaration in Patch 1
- Patch 2 has no change
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 3d78bfaa 502c1a16
...@@ -885,6 +885,7 @@ struct vf_info { ...@@ -885,6 +885,7 @@ struct vf_info {
unsigned int tx_rate; unsigned int tx_rate;
bool pf_set_mac; bool pf_set_mac;
u16 vlan; u16 vlan;
int link_state;
}; };
enum { enum {
......
...@@ -2740,6 +2740,7 @@ static int cxgb4_mgmt_get_vf_config(struct net_device *dev, ...@@ -2740,6 +2740,7 @@ static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
ivi->min_tx_rate = 0; ivi->min_tx_rate = 0;
ether_addr_copy(ivi->mac, vfinfo->vf_mac_addr); ether_addr_copy(ivi->mac, vfinfo->vf_mac_addr);
ivi->vlan = vfinfo->vlan; ivi->vlan = vfinfo->vlan;
ivi->linkstate = vfinfo->link_state;
return 0; return 0;
} }
...@@ -2879,6 +2880,49 @@ static int cxgb4_mgmt_set_vf_vlan(struct net_device *dev, int vf, ...@@ -2879,6 +2880,49 @@ static int cxgb4_mgmt_set_vf_vlan(struct net_device *dev, int vf,
ret, (vlan ? "setting" : "clearing"), adap->pf, vf); ret, (vlan ? "setting" : "clearing"), adap->pf, vf);
return ret; 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 */ #endif /* CONFIG_PCI_IOV */
static int cxgb_set_mac_addr(struct net_device *dev, void *p) static int cxgb_set_mac_addr(struct net_device *dev, void *p)
...@@ -3294,12 +3338,13 @@ static const struct net_device_ops cxgb4_netdev_ops = { ...@@ -3294,12 +3338,13 @@ static const struct net_device_ops cxgb4_netdev_ops = {
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
static const struct net_device_ops cxgb4_mgmt_netdev_ops = { static const struct net_device_ops cxgb4_mgmt_netdev_ops = {
.ndo_open = cxgb4_mgmt_open, .ndo_open = cxgb4_mgmt_open,
.ndo_set_vf_mac = cxgb4_mgmt_set_vf_mac, .ndo_set_vf_mac = cxgb4_mgmt_set_vf_mac,
.ndo_get_vf_config = cxgb4_mgmt_get_vf_config, .ndo_get_vf_config = cxgb4_mgmt_get_vf_config,
.ndo_set_vf_rate = cxgb4_mgmt_set_vf_rate, .ndo_set_vf_rate = cxgb4_mgmt_set_vf_rate,
.ndo_get_phys_port_id = cxgb4_mgmt_get_phys_port_id, .ndo_get_phys_port_id = cxgb4_mgmt_get_phys_port_id,
.ndo_set_vf_vlan = cxgb4_mgmt_set_vf_vlan, .ndo_set_vf_vlan = cxgb4_mgmt_set_vf_vlan,
.ndo_set_vf_link_state = cxgb4_mgmt_set_vf_link_state,
}; };
#endif #endif
......
...@@ -1312,6 +1312,14 @@ enum fw_params_param_pfvf { ...@@ -1312,6 +1312,14 @@ enum fw_params_param_pfvf {
FW_PARAMS_PARAM_PFVF_RAWF_END = 0x37, FW_PARAMS_PARAM_PFVF_RAWF_END = 0x37,
FW_PARAMS_PARAM_PFVF_NCRYPTO_LOOKASIDE = 0x39, FW_PARAMS_PARAM_PFVF_NCRYPTO_LOOKASIDE = 0x39,
FW_PARAMS_PARAM_PFVF_PORT_CAPS32 = 0x3A, 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,
}; };
/* /*
......
...@@ -155,6 +155,8 @@ void t4vf_os_link_changed(struct adapter *adapter, int pidx, int link_ok) ...@@ -155,6 +155,8 @@ void t4vf_os_link_changed(struct adapter *adapter, int pidx, int link_ok)
const char *fc; const char *fc;
const struct port_info *pi = netdev_priv(dev); const struct port_info *pi = netdev_priv(dev);
netif_carrier_on(dev);
switch (pi->link_cfg.speed) { switch (pi->link_cfg.speed) {
case 100: case 100:
s = "100Mbps"; s = "100Mbps";
...@@ -200,6 +202,7 @@ void t4vf_os_link_changed(struct adapter *adapter, int pidx, int link_ok) ...@@ -200,6 +202,7 @@ void t4vf_os_link_changed(struct adapter *adapter, int pidx, int link_ok)
netdev_info(dev, "link up, %s, full-duplex, %s PAUSE\n", s, fc); netdev_info(dev, "link up, %s, full-duplex, %s PAUSE\n", s, fc);
} else { } else {
netif_carrier_off(dev);
netdev_info(dev, "link down\n"); netdev_info(dev, "link down\n");
} }
} }
...@@ -339,16 +342,6 @@ static int link_start(struct net_device *dev) ...@@ -339,16 +342,6 @@ static int link_start(struct net_device *dev)
if (ret == 0) if (ret == 0)
ret = t4vf_enable_pi(pi->adapter, pi, true, true); ret = t4vf_enable_pi(pi->adapter, pi, true, true);
/* The Virtual Interfaces are connected to an internal switch on the
* chip which allows VIs attached to the same port to talk to each
* other even when the port link is down. As a result, we generally
* want to always report a VI's link as being "up", provided there are
* no errors in enabling vi.
*/
if (ret == 0)
netif_carrier_on(dev);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment