* int (*ndo_set_vf_spoofchk)(struct net_device *dev, int vf, bool setting);
  * int (*ndo_get_vf_config)(struct net_device *dev,
  *                         int vf, struct ifla_vf_info *ivf);
+ * int (*ndo_set_vf_link_state)(struct net_device *dev, int vf, int link_state);
  * int (*ndo_set_vf_port)(struct net_device *dev, int vf,
  *                       struct nlattr *port[]);
  * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);
        int                     (*ndo_get_vf_config)(struct net_device *dev,
                                                     int vf,
                                                     struct ifla_vf_info *ivf);
+       int                     (*ndo_set_vf_link_state)(struct net_device *dev,
+                                                        int vf, int link_state);
        int                     (*ndo_set_vf_port)(struct net_device *dev,
                                                   int vf,
                                                   struct nlattr *port[]);
 
        IFLA_VF_VLAN,
        IFLA_VF_TX_RATE,        /* TX Bandwidth Allocation */
        IFLA_VF_SPOOFCHK,       /* Spoof Checking on/off switch */
+       IFLA_VF_LINK_STATE,     /* link state enable/disable/auto switch */
        __IFLA_VF_MAX,
 };
 
        __u32 setting;
 };
 
+enum {
+       IFLA_VF_LINK_STATE_AUTO,        /* link state of the uplink */
+       IFLA_VF_LINK_STATE_ENABLE,      /* link always up */
+       IFLA_VF_LINK_STATE_DISABLE,     /* link always down */
+       __IFLA_VF_LINK_STATE_MAX,
+};
+
+struct ifla_vf_link_state {
+       __u32 vf;
+       __u32 link_state;
+};
+
 /* VF ports management section
  *
  *     Nested layout of set/get msg is:
 
                        struct ifla_vf_vlan vf_vlan;
                        struct ifla_vf_tx_rate vf_tx_rate;
                        struct ifla_vf_spoofchk vf_spoofchk;
+                       struct ifla_vf_link_state vf_linkstate;
 
                        /*
                         * Not all SR-IOV capable drivers support the
                         */
                        ivi.spoofchk = -1;
                        memset(ivi.mac, 0, sizeof(ivi.mac));
+                       /* The default value for VF link state is "auto"
+                        * IFLA_VF_LINK_STATE_AUTO which equals zero
+                        */
+                       ivi.linkstate = 0;
                        if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi))
                                break;
                        vf_mac.vf =
                                vf_vlan.vf =
                                vf_tx_rate.vf =
-                               vf_spoofchk.vf = ivi.vf;
+                               vf_spoofchk.vf =
+                               vf_linkstate.vf = ivi.vf;
 
                        memcpy(vf_mac.mac, ivi.mac, sizeof(ivi.mac));
                        vf_vlan.vlan = ivi.vlan;
                        vf_vlan.qos = ivi.qos;
                        vf_tx_rate.rate = ivi.tx_rate;
                        vf_spoofchk.setting = ivi.spoofchk;
+                       vf_linkstate.link_state = ivi.linkstate;
                        vf = nla_nest_start(skb, IFLA_VF_INFO);
                        if (!vf) {
                                nla_nest_cancel(skb, vfinfo);
                            nla_put(skb, IFLA_VF_TX_RATE, sizeof(vf_tx_rate),
                                    &vf_tx_rate) ||
                            nla_put(skb, IFLA_VF_SPOOFCHK, sizeof(vf_spoofchk),
-                                   &vf_spoofchk))
+                                   &vf_spoofchk) ||
+                           nla_put(skb, IFLA_VF_LINK_STATE, sizeof(vf_linkstate),
+                                   &vf_linkstate))
                                goto nla_put_failure;
                        nla_nest_end(skb, vf);
                }
                                                               ivs->setting);
                        break;
                }
+               case IFLA_VF_LINK_STATE: {
+                       struct ifla_vf_link_state *ivl;
+                       ivl = nla_data(vf);
+                       err = -EOPNOTSUPP;
+                       if (ops->ndo_set_vf_link_state)
+                               err = ops->ndo_set_vf_link_state(dev, ivl->vf,
+                                                                ivl->link_state);
+                       break;
+               }
                default:
                        err = -EINVAL;
                        break;