[SRU][Vivid][PATCH 1/3] i40e: Add support for getlink, setlink ndo ops

Joseph Salisbury joseph.salisbury at canonical.com
Fri Oct 2 15:13:22 UTC 2015


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Thanks for the review, Stefan.  I'll take a look at all of your
suggestions and have a new test kernel tested with any changes.

On 10/02/2015 06:20 AM, Stefan Bader wrote:
> On a second glance... sorry should probably have compared against the original
> commit in more detail before...
>
>
> On 01.10.2015 18:37, Joseph Salisbury wrote:
>> From: Neerav Parikh <neerav.parikh at intel.com>
>>
>> BugLink: http://bugs.launchpad.net/bugs/1497812
>>
>> Add support for bridge offload ndo_ops getlink and setlink to
>> enable bridge hardware mode as per the mode set via IFLA_BRIDGE_MODE.
>> The support is only enabled in case of a PF VSI and not available for
>> any other VSI type.
>>
>> By default the i40e driver inserts a bridge as part of the bring-up
>> when a FDIR type VSI and/or a FCoE VSI is created. This bridge is
>> created in VEB mode by default i.e. after creating the bridge using
>> "Add VEB" AQ command the loopback for the PF's default VSI is enabled.
>>
>> The patch adds capability where all the VSIs created as downlink to
>> the bridge inherits the loopback property and enables loopback only
>> if the uplink bridge is operating in VEB mode.
>> Hence, there is no need to explicitly enable loopback as part of
>> allocating resources for SR-IOV VFs and call to do that has been
>> removed.
>>
>> In case a user-request is made either via "bridge" utility or using
>> the bridge netlink interface that requires to change the hardware
>> bridge mode then that would require a PF reset and rebuild of the
>> switch hierarchy.
>>
>> Also update the copyright year.
>>
>> Change-ID: I4d78fc1c83158efda29ba7be92239b74f75d6d25
>> Signed-off-by: Neerav Parikh <neerav.parikh at intel.com>
>> Tested-By: Jim Young <james.m.young at intel.com>
>> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
>> (backported from commit 51616018dd1b49d4974fff92669606e97080f954)
>> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
>> ---
>>  drivers/net/ethernet/intel/i40e/i40e.h             |  10 ++
>>  drivers/net/ethernet/intel/i40e/i40e_debugfs.c     |   5 +-
>>  drivers/net/ethernet/intel/i40e/i40e_fcoe.c        |  11 +-
>>  drivers/net/ethernet/intel/i40e/i40e_main.c        | 192
+++++++++++++++++++--
>>  drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |   5 +-
>>  drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h |   3 +-
>>  6 files changed, 204 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h
b/drivers/net/ethernet/intel/i40e/i40e.h
>> index fc50f64..984e697 100644
>> --- a/drivers/net/ethernet/intel/i40e/i40e.h
>> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
>> @@ -49,6 +49,7 @@
>>  #include <net/ip6_checksum.h>
>>  #include <linux/ethtool.h>
>>  #include <linux/if_vlan.h>
>> +#include <linux/if_bridge.h>
>>  #include <linux/clocksource.h>
>>  #include <linux/net_tstamp.h>
>>  #include <linux/ptp_clock_kernel.h>
>> @@ -403,6 +404,7 @@ struct i40e_veb {
>>      u16 uplink_seid;
>>      u16 stats_idx;           /* index of VEB parent */
>>      u8  enabled_tc;
>> +    u16 bridge_mode;    /* Bridge Mode (VEB/VEPA) */
>>      u16 flags;
>>      u16 bw_limit;
>>      u8  bw_max_quanta;
>> @@ -725,4 +727,12 @@ int i40e_ptp_set_ts_config(struct i40e_pf *pf,
struct ifreq *ifr);
>>  int i40e_ptp_get_ts_config(struct i40e_pf *pf, struct ifreq *ifr);
>>  void i40e_ptp_init(struct i40e_pf *pf);
>>  void i40e_ptp_stop(struct i40e_pf *pf);
>
>> +int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi);
>> +#if IS_ENABLED(CONFIG_CONFIGFS_FS)
>> +int i40e_configfs_init(void);
>> +void i40e_configfs_exit(void);
>> +#endif /* CONFIG_CONFIGFS_FS */
>> +i40e_status i40e_get_npar_bw_setting(struct i40e_pf *pf);
>> +i40e_status i40e_set_npar_bw_setting(struct i40e_pf *pf);
>> +i40e_status i40e_commit_npar_bw_setting(struct i40e_pf *pf);
>>  #endif /* _I40E_H_ */
>
> Hm, actually that hunk ^, is that really necessary? The original
upstream commit
> only added i440e_is_vsi_uplink mode_veb which also gets used below.
> But at least i40e_configfs_init and the i40e_get_npar_bw_setting
functions are
> nowhere used.
>
>> diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
>> index cb0de45..60cae87 100644
>> --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
>> +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
>> @@ -921,9 +921,10 @@ static void i40e_dbg_dump_veb_seid(struct
i40e_pf *pf, int seid)
>>          return;
>>      }
>>      dev_info(&pf->pdev->dev,
>> -         "veb idx=%d,%d stats_ic=%d  seid=%d uplink=%d\n",
>> +         "veb idx=%d,%d stats_ic=%d  seid=%d uplink=%d mode=%s\n",
>>           veb->idx, veb->veb_idx, veb->stats_idx, veb->seid,
>> -         veb->uplink_seid);
>> +         veb->uplink_seid,
>> +         veb->bridge_mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
>>      i40e_dbg_dump_eth_stats(pf, &veb->stats);
>>  }
>> 
>> diff --git a/drivers/net/ethernet/intel/i40e/i40e_fcoe.c
b/drivers/net/ethernet/intel/i40e/i40e_fcoe.c
>> index a8b8bd9..2123859 100644
>> --- a/drivers/net/ethernet/intel/i40e/i40e_fcoe.c
>> +++ b/drivers/net/ethernet/intel/i40e/i40e_fcoe.c
>> @@ -1,7 +1,7 @@
>> 
/*******************************************************************************
>>   *
>>   * Intel Ethernet Controller XL710 Family Linux Driver
>> - * Copyright(c) 2013 - 2014 Intel Corporation.
>> + * Copyright(c) 2013 - 2015 Intel Corporation.
>>   *
>>   * This program is free software; you can redistribute it and/or
modify it
>>   * under the terms and conditions of the GNU General Public License,
>> @@ -394,8 +394,7 @@ int i40e_fcoe_vsi_init(struct i40e_vsi *vsi,
struct i40e_vsi_context *ctxt)
>>      ctxt->flags = I40E_AQ_VSI_TYPE_PF;
>> 
>>      /* FCoE VSI would need the following sections */
>> -    info->valid_sections |= cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID |
>> -                        I40E_AQ_VSI_PROP_QUEUE_OPT_VALID);
>> +    info->valid_sections |=
cpu_to_le16(I40E_AQ_VSI_PROP_QUEUE_OPT_VALID);
>> 
>>      /* FCoE VSI does not need these sections */
>>      info->valid_sections &=
cpu_to_le16(~(I40E_AQ_VSI_PROP_SECURITY_VALID |
>> @@ -404,6 +403,12 @@ int i40e_fcoe_vsi_init(struct i40e_vsi *vsi,
struct i40e_vsi_context *ctxt)
>>                          I40E_AQ_VSI_PROP_INGRESS_UP_VALID |
>>                          I40E_AQ_VSI_PROP_EGRESS_UP_VALID));
>> 
>
>> +    if (i40e_is_vsi_uplink_mode_veb(vsi)) {
>> +        info->valid_sections |=
>> +                cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
>> +        info->switch_id =
>> +                cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
>> +    }
>
> Compared to the upstream change this will now set the switch_id in
some cases.
> Before it was not set here while the upstream commit changes it from being
> unconditionally set to conditionally being set. This is not
necessarily bad but
> may indicate some other prereq may be needed or at least careful checking.
>
>>      enabled_tc = i40e_get_fcoe_tc_map(pf);
>>      i40e_vsi_setup_queue_map(vsi, ctxt, enabled_tc, true);
>> 
>> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
b/drivers/net/ethernet/intel/i40e/i40e_main.c
>> index a5f2660..f4ec9a4 100644
>> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
>> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
>> @@ -5843,6 +5843,26 @@ static void i40e_verify_eeprom(struct i40e_pf *pf)
>>  }
>> 
>>  /**
>> + * i40e_config_bridge_mode - Configure the HW bridge mode
>> + * @veb: pointer to the bridge instance
>> + *
>> + * Configure the loop back mode for the LAN VSI that is downlink to the
>> + * specified HW bridge instance. It is expected this function is called
>> + * when a new HW bridge is instantiated.
>> + **/
>> +static void i40e_config_bridge_mode(struct i40e_veb *veb)
>> +{
>> +    struct i40e_pf *pf = veb->pf;
>> +
>> +    dev_info(&pf->pdev->dev, "enabling bridge mode: %s\n",
>> +         veb->bridge_mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB");
>> +    if (veb->bridge_mode & BRIDGE_MODE_VEPA)
>> +        i40e_disable_pf_switch_lb(pf);
>> +    else
>> +        i40e_enable_pf_switch_lb(pf);
>> +}
>> +
>> +/**
>>   * i40e_reconstitute_veb - rebuild the VEB and anything connected to it
>>   * @veb: pointer to the VEB instance
>>   *
>> @@ -5888,8 +5908,7 @@ static int i40e_reconstitute_veb(struct
i40e_veb *veb)
>>      if (ret)
>>          goto end_reconstitute;
>> 
>> -    /* Enable LB mode for the main VSI now that it is on a VEB */
>> -    i40e_enable_pf_switch_lb(pf);
>> +    i40e_config_bridge_mode(veb);
>> 
>>      /* create the remaining VSIs attached to this VEB */
>>      for (v = 0; v < pf->num_alloc_vsi; v++) {
>> @@ -7576,7 +7595,119 @@ static int i40e_ndo_fdb_add(struct ndmsg
*ndm, struct nlattr *tb[],
>>      return err;
>>  }
>> 
>
>> -static const struct net_device_ops i40e_netdev_ops = {
>
> ^Here you change the struct from static to non-static. This is not static
> upstream but maybe would need other changes.
>
>> +#ifdef HAVE_BRIDGE_ATTRIBS
>> +/**
>> + * i40e_ndo_bridge_setlink - Set the hardware bridge mode
>> + * @dev: the netdev being configured
>> + * @nlh: RTNL message
>> + *
>> + * Inserts a new hardware bridge if not already created and
>> + * enables the bridging mode requested (VEB or VEPA). If the
>> + * hardware bridge has already been inserted and the request
>> + * is to change the mode then that requires a PF reset to
>> + * allow rebuild of the components with required hardware
>> + * bridge mode enabled.
>> + **/
>> +static int i40e_ndo_bridge_setlink(struct net_device *dev,
>> +                   struct nlmsghdr *nlh)
>> +{
>> +    struct i40e_netdev_priv *np = netdev_priv(dev);
>> +    struct i40e_vsi *vsi = np->vsi;
>> +    struct i40e_pf *pf = vsi->back;
>> +    struct i40e_veb *veb = NULL;
>> +    struct nlattr *attr, *br_spec;
>> +    int i, rem;
>> +
>> +    /* Only for PF VSI for now */
>> +    if (vsi->seid != pf->vsi[pf->lan_vsi]->seid)
>> +        return -EOPNOTSUPP;
>> +
>> +    /* Find the HW bridge for PF VSI */
>> +    for (i = 0; i < I40E_MAX_VEB && !veb; i++) {
>> +        if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid)
>> +            veb = pf->veb[i];
>> +    }
>> +
>> +    br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg),
IFLA_AF_SPEC);
>> +
>> +    nla_for_each_nested(attr, br_spec, rem) {
>> +        __u16 mode;
>> +
>> +        if (nla_type(attr) != IFLA_BRIDGE_MODE)
>> +            continue;
>> +
>> +        mode = nla_get_u16(attr);
>> +        if ((mode != BRIDGE_MODE_VEPA) &&
>> +            (mode != BRIDGE_MODE_VEB))
>> +            return -EINVAL;
>> +
>> +        /* Insert a new HW bridge */
>> +        if (!veb) {
>> +            veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid,
>> +                         vsi->tc_config.enabled_tc);
>> +            if (veb) {
>> +                veb->bridge_mode = mode;
>> +                i40e_config_bridge_mode(veb);
>> +            } else {
>> +                /* No Bridge HW offload available */
>> +                return -ENOENT;
>> +            }
>> +            break;
>> +        } else if (mode != veb->bridge_mode) {
>> +            /* Existing HW bridge but different mode needs reset */
>> +            veb->bridge_mode = mode;
>> +            i40e_do_reset(pf, (1 << __I40E_PF_RESET_REQUESTED));
>> +            break;
>> +        }
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>> +/**
>> + * i40e_ndo_bridge_getlink - Get the hardware bridge mode
>> + * @skb: skb buff
>> + * @pid: process id
>> + * @seq: RTNL message seq #
>> + * @dev: the netdev being configured
>> + * @filter_mask: unused
>> + *
>> + * Return the mode in which the hardware bridge is operating in
>> + * i.e VEB or VEPA.
>> + **/
>> +#ifdef HAVE_BRIDGE_FILTER
>> +static int i40e_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32
seq,
>> +                   struct net_device *dev,
>> +                   u32 __always_unused filter_mask)
>> +#else
>> +static int i40e_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32
seq,
>> +                   struct net_device *dev)
>> +#endif /* HAVE_BRIDGE_FILTER */
>> +{
>> +    struct i40e_netdev_priv *np = netdev_priv(dev);
>> +    struct i40e_vsi *vsi = np->vsi;
>> +    struct i40e_pf *pf = vsi->back;
>> +    struct i40e_veb *veb = NULL;
>> +    int i;
>> +
>> +    /* Only for PF VSI for now */
>> +    if (vsi->seid != pf->vsi[pf->lan_vsi]->seid)
>> +        return -EOPNOTSUPP;
>> +
>> +    /* Find the HW bridge for the PF VSI */
>> +    for (i = 0; i < I40E_MAX_VEB && !veb; i++) {
>> +        if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid)
>> +            veb = pf->veb[i];
>> +    }
>> +
>> +    if (!veb)
>> +        return 0;
>> +
>> +    return ndo_dflt_bridge_getlink(skb, pid, seq, dev,
veb->bridge_mode);
>> +}
>> +#endif /* HAVE_BRIDGE_ATTRIBS */
>> +
>> +const struct net_device_ops i40e_netdev_ops = {
>>      .ndo_open        = i40e_open,
>>      .ndo_stop        = i40e_close,
>>      .ndo_start_xmit        = i40e_lan_xmit_frame,
>> @@ -7610,6 +7741,10 @@ static const struct net_device_ops
i40e_netdev_ops = {
>>  #endif
>>      .ndo_get_phys_port_id    = i40e_get_phys_port_id,
>>      .ndo_fdb_add        = i40e_ndo_fdb_add,
>> +#ifdef HAVE_BRIDGE_ATTRIBS
>> +    .ndo_bridge_getlink    = i40e_ndo_bridge_getlink,
>> +    .ndo_bridge_setlink    = i40e_ndo_bridge_setlink,
>> +#endif /* HAVE_BRIDGE_ATTRIBS */
>>  };
>> 
>>  /**
>> @@ -7722,6 +7857,30 @@ static void i40e_vsi_delete(struct i40e_vsi *vsi)
>>  }
>> 
>>  /**
>> + * i40e_is_vsi_uplink_mode_veb - Check if the VSI's uplink bridge
mode is VEB
>> + * @vsi: the VSI being queried
>> + *
>> + * Returns 1 if HW bridge mode is VEB and return 0 in case of VEPA mode
>> + **/
>> +int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi)
>> +{
>> +    struct i40e_veb *veb;
>> +    struct i40e_pf *pf = vsi->back;
>> +
>> +    /* Uplink is not a bridge so default to VEB */
>> +    if (vsi->veb_idx == I40E_NO_VEB)
>> +        return 1;
>> +
>> +    veb = pf->veb[vsi->veb_idx];
>> +    /* Uplink is a bridge in VEPA mode */
>> +    if (veb && (veb->bridge_mode & BRIDGE_MODE_VEPA))
>> +        return 0;
>> +
>> +    /* Uplink is a bridge in VEB mode */
>> +    return 1;
>> +}
>> +
>> +/**
>>   * i40e_add_vsi - Add a VSI to the switch
>>   * @vsi: the VSI being configured
>>   *
>> @@ -7805,10 +7964,12 @@ static int i40e_add_vsi(struct i40e_vsi *vsi)
>>          ctxt.uplink_seid = vsi->uplink_seid;
>>          ctxt.connection_type = 0x1;     /* regular data port */
>>          ctxt.flags = I40E_AQ_VSI_TYPE_PF;
>> -        ctxt.info.valid_sections |=
>> +        if (i40e_is_vsi_uplink_mode_veb(vsi)) {
>> +            ctxt.info.valid_sections |=
>>                  cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
>> -        ctxt.info.switch_id =
>> +            ctxt.info.switch_id =
>>                  cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
>> +        }
>>          i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true);
>>          break;
>> 
>> @@ -7819,13 +7980,15 @@ static int i40e_add_vsi(struct i40e_vsi *vsi)
>>          ctxt.connection_type = 0x1;     /* regular data port */
>>          ctxt.flags = I40E_AQ_VSI_TYPE_VMDQ2;
>> 
>> -        ctxt.info.valid_sections |=
cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
>> -
>>          /* This VSI is connected to VEB so the switch_id
>>           * should be set to zero by default.
>>           */
>> -        ctxt.info.switch_id = 0;
>> -        ctxt.info.switch_id |=
cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
>> +        if (i40e_is_vsi_uplink_mode_veb(vsi)) {
>> +            ctxt.info.valid_sections |=
>> +                cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
>> +            ctxt.info.switch_id =
>> +                cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
>> +        }
>> 
>>          /* Setup the VSI tx/rx queue map for TC0 only for now */
>>          i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true);
>> @@ -7838,12 +8001,15 @@ static int i40e_add_vsi(struct i40e_vsi *vsi)
>>          ctxt.connection_type = 0x1;     /* regular data port */
>>          ctxt.flags = I40E_AQ_VSI_TYPE_VF;
>> 
>> -        ctxt.info.valid_sections |=
cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
>> -
>>          /* This VSI is connected to VEB so the switch_id
>>           * should be set to zero by default.
>>           */
>> -        ctxt.info.switch_id =
cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
>> +        if (i40e_is_vsi_uplink_mode_veb(vsi)) {
>> +            ctxt.info.valid_sections |=
>> +                cpu_to_le16(I40E_AQ_VSI_PROP_SWITCH_VALID);
>> +            ctxt.info.switch_id =
>> +                cpu_to_le16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
>> +        }
>> 
>>          ctxt.info.valid_sections |=
cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID);
>>          ctxt.info.port_vlan_flags |= I40E_AQ_VSI_PVLAN_MODE_ALL;
>> @@ -8201,7 +8367,7 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf
*pf, u8 type,
>>                       __func__);
>>                  return NULL;
>>              }
>> -            i40e_enable_pf_switch_lb(pf);
>> +            i40e_config_bridge_mode(veb);
>>          }
>>          for (i = 0; i < I40E_MAX_VEB && !veb; i++) {
>>              if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid)
>> diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
>> index 5bae895..0afbf43 100644
>> --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
>> +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
>> @@ -1,7 +1,7 @@
>> 
/*******************************************************************************
>>   *
>>   * Intel Ethernet Controller XL710 Family Linux Driver
>> - * Copyright(c) 2013 - 2014 Intel Corporation.
>> + * Copyright(c) 2013 - 2015 Intel Corporation.
>>   *
>>   * This program is free software; you can redistribute it and/or
modify it
>>   * under the terms and conditions of the GNU General Public License,
>> @@ -748,7 +748,7 @@ void i40e_enable_pf_switch_lb(struct i40e_pf *pf)
>>   *
>>   * disable switch loop back or die - no point in a return value
>>   **/
>> -static void i40e_disable_pf_switch_lb(struct i40e_pf *pf)
>> +void i40e_disable_pf_switch_lb(struct i40e_pf *pf)
>>  {
>>      struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
>>      struct i40e_vsi_context ctxt;
>> @@ -883,7 +883,6 @@ int i40e_alloc_vfs(struct i40e_pf *pf, u16
num_alloc_vfs)
>>      }
>>      pf->num_alloc_vfs = num_alloc_vfs;
>> 
>> -    i40e_enable_pf_switch_lb(pf);
>>  err_alloc:
>>      if (ret)
>>          i40e_free_vfs(pf);
>> diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
>> index 9452f52..ef777a6 100644
>> --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
>> +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
>> @@ -1,7 +1,7 @@
>> 
/*******************************************************************************
>>   *
>>   * Intel Ethernet Controller XL710 Family Linux Driver
>> - * Copyright(c) 2013 - 2014 Intel Corporation.
>> + * Copyright(c) 2013 - 2015 Intel Corporation.
>>   *
>>   * This program is free software; you can redistribute it and/or
modify it
>>   * under the terms and conditions of the GNU General Public License,
>> @@ -127,5 +127,6 @@ int i40e_ndo_set_vf_spoofchk(struct net_device
*netdev, int vf_id, bool enable);
>>  void i40e_vc_notify_link_state(struct i40e_pf *pf);
>>  void i40e_vc_notify_reset(struct i40e_pf *pf);
>>  void i40e_enable_pf_switch_lb(struct i40e_pf *pf);
>> +void i40e_disable_pf_switch_lb(struct i40e_pf *pf);
>> 
>>  #endif /* _I40E_VIRTCHNL_PF_H_ */
>>
>
> The rest seemed fine if I did not miss anything more...
>
>
>
>

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJWDp8SAAoJEGzvPSfKWxQeBLMP/1kq5dAsasOHkATW8bckONrC
7Ac3XZro+jlOWEtiMI15OV0EWZPzTpl4Wd6MKpLvLMOFoZQCxWrk3797fIcXjgb9
XArxiXBIYLhiBdeDUgtNK8QTZgwJnPbk/r9v96zfXfO91ugYzJWNHqvHHom0YHl1
zn6Qjql1K6cBaBWJvfQGTzh0Vs9XE7iC0FismJdex2AoKXfsaxQJOcT44mynX+IQ
j0pfgPCYB8pqwxxFoR2rHhK6CUdKop2/kgJLgtNURMfwT01so+ozEL7tBThF1TvI
d2r8UPOOTIXDKh+lKNyIcOfUK2hUaUtNAifvHHWmiX+fmfAwCfXE3wtbuGm+8q6g
YrE/M1BZRCUBe+qhERx7VYWLmMH14H5KX7P/5I7cDyIoX7a7dTKkLu/DrC783SIn
7lPJW/pM0eBUue/gJpbDjOXgRvNL2QVTOOhXPEXBXHOBOxf3OM4OQsoc5x4d2hsy
GbZ+KTXeMHjUIMdV3r2ePF0M+I8fDE952/icwfy+EzKCeO99zIXDodaStI1coUfs
ckfL4OPsNH4LRHLYvdXgLpgEwgh2+UbH+dqSds+MdO2es08Sub9KDaZkbCGypCpq
70idJ/mILKjeYiMMSCnAVTVcu+PMiK8DN0g5kAwYM7T9QaIbKctu8BmM3JIhVpwe
mDhtVBg8tUFDPYnDxgzO
=mUhp
-----END PGP SIGNATURE-----





More information about the kernel-team mailing list