cxgb4: Add VF Link state support
authorArjun Vynipadath <arjun@chelsio.com>
Fri, 1 Mar 2019 10:14:47 +0000 (15:44 +0530)
committerDavid S. Miller <davem@davemloft.net>
Sat, 2 Mar 2019 07:20:20 +0000 (23:20 -0800)
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>
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h

index b7b0eb1044307cfce63213d95ae2cb7ea1258cb4..dd6379809c74d2d75f4228a1be563c7686a5ab31 100644 (file)
@@ -885,6 +885,7 @@ struct vf_info {
        unsigned int tx_rate;
        bool pf_set_mac;
        u16 vlan;
+       int link_state;
 };
 
 enum {
index 1754ff79436074575875073ea8a74526e55137d4..45093a620c3fad2564898dc7662433d2e1478cf5 100644 (file)
@@ -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;
 }
 
@@ -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)
@@ -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
 
index 631f1663f4e0a582cc3a045b14ba3792312eb214..b2a618e72fcfdcf468e98ecfd0ec5c00be5ac0a3 100644 (file)
@@ -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,
 };
 
 /*