* [net-next-2.6 PATCH 1/5] pci: Add SR-IOV convenience functions and macros @ 2010-01-30 10:39 Jeff Kirsher 2010-01-30 10:39 ` [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods Jeff Kirsher ` (3 more replies) 0 siblings, 4 replies; 11+ messages in thread From: Jeff Kirsher @ 2010-01-30 10:39 UTC (permalink / raw) To: davem; +Cc: netdev, gospo, Mitch Williams, Jeff Kirsher From: Williams, Mitch A <mitch.a.williams@intel.com> Add and export pci_num_vf to allow other subsystems to determine how many virtual function devices are associated with an SR-IOV physical function device. Add macros dev_is_pci, dev_is_ps, and dev_num_vf to make it easier for non-PCI specific code to determine SR-IOV capabilities. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> --- drivers/pci/iov.c | 15 +++++++++++++++ include/linux/pci.h | 8 ++++++++ 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index b2a448e..3e5ab2b 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -706,6 +706,21 @@ irqreturn_t pci_sriov_migration(struct pci_dev *dev) } EXPORT_SYMBOL_GPL(pci_sriov_migration); +/** + * pci_num_vf - return number of VFs associated with a PF device_release_driver + * @dev: the PCI device + * + * Returns number of VFs, or 0 if SR-IOV is not enabled. + */ +int pci_num_vf(struct pci_dev *dev) +{ + if (!dev || !dev->is_physfn) + return 0; + else + return dev->sriov->nr_virtfn; +} +EXPORT_SYMBOL_GPL(pci_num_vf); + static int ats_alloc_one(struct pci_dev *dev, int ps) { int pos; diff --git a/include/linux/pci.h b/include/linux/pci.h index 174e539..db7706d 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -310,6 +310,9 @@ extern struct pci_dev *alloc_pci_dev(void); #define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list) #define to_pci_dev(n) container_of(n, struct pci_dev, dev) #define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL) +#define dev_is_pci(d) ((d)->bus == &pci_bus_type) +#define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false)) +#define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0)) static inline int pci_channel_offline(struct pci_dev *pdev) { @@ -1286,6 +1289,7 @@ void __iomem *pci_ioremap_bar(struct pci_dev *pdev, int bar); extern int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn); extern void pci_disable_sriov(struct pci_dev *dev); extern irqreturn_t pci_sriov_migration(struct pci_dev *dev); +extern int pci_num_vf(struct pci_dev *dev); #else static inline int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn) { @@ -1298,6 +1302,10 @@ static inline irqreturn_t pci_sriov_migration(struct pci_dev *dev) { return IRQ_NONE; } +static inline int pci_num_vf(struct pci_dev *dev) +{ + return 0; +} #endif #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods 2010-01-30 10:39 [net-next-2.6 PATCH 1/5] pci: Add SR-IOV convenience functions and macros Jeff Kirsher @ 2010-01-30 10:39 ` Jeff Kirsher 2010-01-31 14:25 ` Or Gerlitz 2010-01-30 10:40 ` [net-next-2.6 PATCH 3/5] net: Add netdev ops for SR-IOV configuration Jeff Kirsher ` (2 subsequent siblings) 3 siblings, 1 reply; 11+ messages in thread From: Jeff Kirsher @ 2010-01-30 10:39 UTC (permalink / raw) To: davem; +Cc: netdev, gospo, Mitch Williams, Jeff Kirsher From: Williams, Mitch A <mitch.a.williams@intel.com> Add SR-IOV VF management methods to IFLA_LINKINFO. This allows userspace to use rtnetlink to configure VF network devices. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> --- include/linux/if_link.h | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 6674791..7d0c687 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h @@ -78,6 +78,11 @@ enum { #define IFLA_LINKINFO IFLA_LINKINFO IFLA_NET_NS_PID, IFLA_IFALIAS, + IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ + IFLA_VF_MAC, /* Hardware queue specific attributes */ + IFLA_VF_VLAN, + IFLA_VF_TX_RATE, /* TX Bandwidth Allocation */ + IFLA_VFINFO, __IFLA_MAX }; @@ -196,4 +201,27 @@ enum macvlan_mode { MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ }; +/* SR-IOV virtual function managment section */ + +struct ifla_vf_mac { + __u32 vf; + __u8 mac[32]; /* MAX_ADDR_LEN */ +}; + +struct ifla_vf_vlan { + __u32 vf; + __s32 vlan; /* 0 - 4095, -1 disables VLAN filter */ +}; + +struct ifla_vf_tx_rate { + __u32 vf; + __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +}; + +struct ifla_vf_info { + __u32 vf; + __u8 mac[32]; + __s32 vlan; + __u32 tx_rate; +}; #endif /* _LINUX_IF_LINK_H */ ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods 2010-01-30 10:39 ` [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods Jeff Kirsher @ 2010-01-31 14:25 ` Or Gerlitz 2010-02-01 19:33 ` Williams, Mitch A 0 siblings, 1 reply; 11+ messages in thread From: Or Gerlitz @ 2010-01-31 14:25 UTC (permalink / raw) To: Jeff Kirsher; +Cc: davem, netdev, gospo, Mitch Williams, Or Gerlitz Jeff Kirsher wrote: > +struct ifla_vf_vlan { > + __u32 vf; > + __s32 vlan; /* 0 - 4095, -1 disables VLAN filter */ > +}; Jeff, In the same manner that vconfig does for 8021q devices, except for VID there's a need to let the user control on the egress qos mapping (vlan priority bits) per VF (I don't think it need to go per skb priority). Where for NIC HW which supports setting the VID only, the packets will be marked with a default priority. Or. ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods 2010-01-31 14:25 ` Or Gerlitz @ 2010-02-01 19:33 ` Williams, Mitch A 2010-02-02 5:16 ` Or Gerlitz 0 siblings, 1 reply; 11+ messages in thread From: Williams, Mitch A @ 2010-02-01 19:33 UTC (permalink / raw) To: Or Gerlitz, Kirsher, Jeffrey T Cc: davem@davemloft.net, netdev@vger.kernel.org, gospo@redhat.com, Or Gerlitz >From: Or Gerlitz [mailto:or.gerlitz@gmail.com] >Sent: Sunday, January 31, 2010 6:26 AM >In the same manner that vconfig does for 8021q devices, except for VID >there's a need >to let the user control on the egress qos mapping (vlan priority bits) >per VF (I don't think it >need to go per skb priority). Where for NIC HW which supports setting >the VID only, the >packets will be marked with a default priority. To be honest, Or, this completely slipped my mind. I'll add it to my to-do list. If it's OK with you, I'd prefer to get this set of patches in as-is and add the egress qos stuff later. A lot of people have been asking for these patches, so I'd rather not delay for this feature. -Mitch ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods 2010-02-01 19:33 ` Williams, Mitch A @ 2010-02-02 5:16 ` Or Gerlitz 2010-02-02 16:45 ` Williams, Mitch A 0 siblings, 1 reply; 11+ messages in thread From: Or Gerlitz @ 2010-02-02 5:16 UTC (permalink / raw) To: Williams, Mitch A Cc: Kirsher, Jeffrey T, davem@davemloft.net, netdev@vger.kernel.org, gospo@redhat.com, Or Gerlitz Williams, Mitch A <mitch.a.williams@intel.com> wrote: > To be honest, Or, this completely slipped my mind. I'll add it to my to-do list. > If it's OK with you, I'd prefer to get this set of patches in as-is and > add the egress qos stuff later. A lot of people have been asking for > these patches, so I'd rather not delay for this feature. Mitch, looking on the patch series I see that except for two patches ([PATCH 1/5] pci: Add SR-IOV convenience functions and macros and [PATCH 2/4] libnetlink: Modify parser to track the first duplicated attributes) seven other patches have to be changed/enhanced to incorporate the egress qos mapping. If you prefer to do that later rather then now I am fine with that, but lets not leave that a side. Or. ^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods 2010-02-02 5:16 ` Or Gerlitz @ 2010-02-02 16:45 ` Williams, Mitch A 2010-02-04 1:36 ` David Miller 0 siblings, 1 reply; 11+ messages in thread From: Williams, Mitch A @ 2010-02-02 16:45 UTC (permalink / raw) To: Or Gerlitz, shemminger@vyatta.com Cc: Kirsher, Jeffrey T, davem@davemloft.net, netdev@vger.kernel.org, gospo@redhat.com >From: Or Gerlitz [mailto:or.gerlitz@gmail.com] > >Williams, Mitch A <mitch.a.williams@intel.com> wrote: > >> To be honest, Or, this completely slipped my mind. I'll add it to my >to-do list. >> If it's OK with you, I'd prefer to get this set of patches in as-is and >> add the egress qos stuff later. A lot of people have been asking for >> these patches, so I'd rather not delay for this feature. > >Mitch, looking on the patch series I see that except for two patches >([PATCH 1/5] pci: Add SR-IOV convenience functions and macros and >[PATCH 2/4] libnetlink: Modify parser to track the first duplicated >attributes) seven other patches have to be changed/enhanced to >incorporate the egress qos mapping. If you prefer to do that later >rather then now I am fine with that, but lets not leave that a side. > >Or. Yeah, now that I've had a while to think about it, I agree. It's much less painful to make the change now. Dave and Stephen, please drop these patches. I'll update with the priority stuff and resubmit. Thanks for your help, Or. -Mitch ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods 2010-02-02 16:45 ` Williams, Mitch A @ 2010-02-04 1:36 ` David Miller 0 siblings, 0 replies; 11+ messages in thread From: David Miller @ 2010-02-04 1:36 UTC (permalink / raw) To: mitch.a.williams; +Cc: or.gerlitz, shemminger, jeffrey.t.kirsher, netdev, gospo From: "Williams, Mitch A" <mitch.a.williams@intel.com> Date: Tue, 2 Feb 2010 09:45:41 -0700 > Dave and Stephen, please drop these patches. I'll update with the priority > stuff and resubmit. Okie dokie. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [net-next-2.6 PATCH 3/5] net: Add netdev ops for SR-IOV configuration 2010-01-30 10:39 [net-next-2.6 PATCH 1/5] pci: Add SR-IOV convenience functions and macros Jeff Kirsher 2010-01-30 10:39 ` [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods Jeff Kirsher @ 2010-01-30 10:40 ` Jeff Kirsher 2010-02-03 22:00 ` Ben Hutchings 2010-01-30 10:40 ` [net-next-2.6 PATCH 4/5] rtnetlink: Add VF config code to rtnetlink Jeff Kirsher 2010-01-30 10:40 ` [net-next-2.6 PATCH 5/5] igb: support for VF configuration tools Jeff Kirsher 3 siblings, 1 reply; 11+ messages in thread From: Jeff Kirsher @ 2010-01-30 10:40 UTC (permalink / raw) To: davem; +Cc: netdev, gospo, Mitch Williams, Jeff Kirsher From: Williams, Mitch A <mitch.a.williams@intel.com> Add netdev ops for configuring SR-IOV VF devices through the PF driver. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> --- include/linux/netdevice.h | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 93a32a5..3e14066 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -28,6 +28,7 @@ #include <linux/if.h> #include <linux/if_ether.h> #include <linux/if_packet.h> +#include <linux/if_link.h> #ifdef __KERNEL__ #include <linux/timer.h> @@ -615,6 +616,13 @@ struct netdev_queue { * this function is called when a VLAN id is unregistered. * * void (*ndo_poll_controller)(struct net_device *dev); + * + * SR-IOV management functions. + * int (*ndo_set_vf_mac)(struct net_device *dev, int vf, u8* mac); + * int (*ndo_set_vf_vlan)(struct net_device *dev, int vf, u16 vlan); + * int (*ndo_set_vf_tx_rate)(struct net_device *dev, int vf, int rate); + * int (*ndo_get_vf_config)(struct net_device *dev, + * int vf, struct ifla_vf_info *ivf); */ #define HAVE_NET_DEVICE_OPS struct net_device_ops { @@ -654,6 +662,15 @@ struct net_device_ops { #ifdef CONFIG_NET_POLL_CONTROLLER void (*ndo_poll_controller)(struct net_device *dev); #endif + int (*ndo_set_vf_mac)(struct net_device *dev, + int queue, u8 *mac); + int (*ndo_set_vf_vlan)(struct net_device *dev, + int queue, u16 vlan); + int (*ndo_set_vf_tx_rate)(struct net_device *dev, + int vf, int rate); + int (*ndo_get_vf_config)(struct net_device *dev, + int vf, + struct ifla_vf_info *ivf); #if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE) int (*ndo_fcoe_enable)(struct net_device *dev); int (*ndo_fcoe_disable)(struct net_device *dev); ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [net-next-2.6 PATCH 3/5] net: Add netdev ops for SR-IOV configuration 2010-01-30 10:40 ` [net-next-2.6 PATCH 3/5] net: Add netdev ops for SR-IOV configuration Jeff Kirsher @ 2010-02-03 22:00 ` Ben Hutchings 0 siblings, 0 replies; 11+ messages in thread From: Ben Hutchings @ 2010-02-03 22:00 UTC (permalink / raw) To: Jeff Kirsher; +Cc: davem, netdev, gospo, Mitch Williams On Sat, 2010-01-30 at 02:40 -0800, Jeff Kirsher wrote: > From: Williams, Mitch A <mitch.a.williams@intel.com> > > Add netdev ops for configuring SR-IOV VF devices through the PF driver. [...] If this is going to be specific to SR-IOV then it doesn't belong in net_device_ops. Look again at Dave's comments in <http://article.gmane.org/gmane.linux.network/147158> and my question in <http://article.gmane.org/gmane.linux.network/147114>. Ben. -- Ben Hutchings, Senior Software Engineer, Solarflare Communications Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked. ^ permalink raw reply [flat|nested] 11+ messages in thread
* [net-next-2.6 PATCH 4/5] rtnetlink: Add VF config code to rtnetlink 2010-01-30 10:39 [net-next-2.6 PATCH 1/5] pci: Add SR-IOV convenience functions and macros Jeff Kirsher 2010-01-30 10:39 ` [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods Jeff Kirsher 2010-01-30 10:40 ` [net-next-2.6 PATCH 3/5] net: Add netdev ops for SR-IOV configuration Jeff Kirsher @ 2010-01-30 10:40 ` Jeff Kirsher 2010-01-30 10:40 ` [net-next-2.6 PATCH 5/5] igb: support for VF configuration tools Jeff Kirsher 3 siblings, 0 replies; 11+ messages in thread From: Jeff Kirsher @ 2010-01-30 10:40 UTC (permalink / raw) To: davem; +Cc: netdev, gospo, Mitch Williams, Jeff Kirsher From: Williams, Mitch A <mitch.a.williams@intel.com> Add code to allow rtnetlink clients to query and set VF information through the PF driver. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> --- net/core/rtnetlink.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 65 insertions(+), 0 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 62f3878..10c0d87 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -35,6 +35,7 @@ #include <linux/security.h> #include <linux/mutex.h> #include <linux/if_addr.h> +#include <linux/pci.h> #include <asm/uaccess.h> #include <asm/system.h> @@ -580,6 +581,15 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a, a->tx_compressed = b->tx_compressed; }; +static inline int rtnl_vfinfo_size(const struct net_device *dev) +{ + if (dev->dev.parent && dev_is_pci(dev->dev.parent)) + return dev_num_vf(dev->dev.parent) * + sizeof(struct ifla_vf_info); + else + return 0; +} + static inline size_t if_nlmsg_size(const struct net_device *dev) { return NLMSG_ALIGN(sizeof(struct ifinfomsg)) @@ -597,6 +607,8 @@ static inline size_t if_nlmsg_size(const struct net_device *dev) + nla_total_size(4) /* IFLA_MASTER */ + nla_total_size(1) /* IFLA_OPERSTATE */ + nla_total_size(1) /* IFLA_LINKMODE */ + + nla_total_size(4) /* IFLA_NUM_VF */ + + nla_total_size(rtnl_vfinfo_size(dev)) /* IFLA_VFINFO */ + rtnl_link_get_size(dev); /* IFLA_LINKINFO */ } @@ -665,6 +677,17 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, stats = dev_get_stats(dev); copy_rtnl_link_stats(nla_data(attr), stats); + if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent) { + int i; + struct ifla_vf_info ivi; + + NLA_PUT_U32(skb, IFLA_NUM_VF, dev_num_vf(dev->dev.parent)); + for (i = 0; i < dev_num_vf(dev->dev.parent); i++) { + if (dev->netdev_ops->ndo_get_vf_config(dev, i, &ivi)) + break; + NLA_PUT(skb, IFLA_VFINFO, sizeof(ivi), &ivi); + } + } if (dev->rtnl_link_ops) { if (rtnl_link_fill(skb, dev) < 0) goto nla_put_failure; @@ -725,6 +748,12 @@ const struct nla_policy ifla_policy[IFLA_MAX+1] = { [IFLA_LINKINFO] = { .type = NLA_NESTED }, [IFLA_NET_NS_PID] = { .type = NLA_U32 }, [IFLA_IFALIAS] = { .type = NLA_STRING, .len = IFALIASZ-1 }, + [IFLA_VF_MAC] = { .type = NLA_BINARY, + .len = sizeof(struct ifla_vf_mac) }, + [IFLA_VF_VLAN] = { .type = NLA_BINARY, + .len = sizeof(struct ifla_vf_vlan) }, + [IFLA_VF_TX_RATE] = { .type = NLA_BINARY, + .len = sizeof(struct ifla_vf_tx_rate) }, }; EXPORT_SYMBOL(ifla_policy); @@ -898,6 +927,42 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, write_unlock_bh(&dev_base_lock); } + if (tb[IFLA_VF_MAC]) { + struct ifla_vf_mac *ivm; + ivm = nla_data(tb[IFLA_VF_MAC]); + write_lock_bh(&dev_base_lock); + if (ops->ndo_set_vf_mac) + err = ops->ndo_set_vf_mac(dev, ivm->vf, ivm->mac); + write_unlock_bh(&dev_base_lock); + if (err < 0) + goto errout; + modified = 1; + } + + if (tb[IFLA_VF_VLAN]) { + struct ifla_vf_vlan *ivv; + ivv = nla_data(tb[IFLA_VF_VLAN]); + write_lock_bh(&dev_base_lock); + if (ops->ndo_set_vf_vlan) + err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan); + write_unlock_bh(&dev_base_lock); + if (err < 0) + goto errout; + modified = 1; + } + err = 0; + + if (tb[IFLA_VF_TX_RATE]) { + struct ifla_vf_tx_rate *ivt; + ivt = nla_data(tb[IFLA_VF_TX_RATE]); + write_lock_bh(&dev_base_lock); + if (ops->ndo_set_vf_tx_rate) + err = ops->ndo_set_vf_tx_rate(dev, ivt->vf, ivt->rate); + write_unlock_bh(&dev_base_lock); + if (err < 0) + goto errout; + modified = 1; + } err = 0; errout: ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [net-next-2.6 PATCH 5/5] igb: support for VF configuration tools 2010-01-30 10:39 [net-next-2.6 PATCH 1/5] pci: Add SR-IOV convenience functions and macros Jeff Kirsher ` (2 preceding siblings ...) 2010-01-30 10:40 ` [net-next-2.6 PATCH 4/5] rtnetlink: Add VF config code to rtnetlink Jeff Kirsher @ 2010-01-30 10:40 ` Jeff Kirsher 3 siblings, 0 replies; 11+ messages in thread From: Jeff Kirsher @ 2010-01-30 10:40 UTC (permalink / raw) To: davem; +Cc: netdev, gospo, Mitch Williams, Jeff Kirsher From: Williams, Mitch A <mitch.a.williams@intel.com> Add support to the igb driver for VF configuration mechanisms through the PF interface. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> --- drivers/net/igb/e1000_82575.h | 3 + drivers/net/igb/e1000_regs.h | 1 drivers/net/igb/igb.h | 2 + drivers/net/igb/igb_main.c | 122 ++++++++++++++++++++++++++++++++++++++--- 4 files changed, 119 insertions(+), 9 deletions(-) diff --git a/drivers/net/igb/e1000_82575.h b/drivers/net/igb/e1000_82575.h index d51c992..bb53083 100644 --- a/drivers/net/igb/e1000_82575.h +++ b/drivers/net/igb/e1000_82575.h @@ -219,6 +219,9 @@ struct e1000_adv_tx_context_desc { #define E1000_VLVF_LVLAN 0x00100000 #define E1000_VLVF_VLANID_ENABLE 0x80000000 +#define E1000_VMVIR_VLANA_DEFAULT 0x40000000 /* Always use default VLAN */ +#define E1000_VMVIR_VLANA_NEVER 0x80000000 /* Never insert VLAN tag */ + #define E1000_IOVCTL 0x05BBC #define E1000_IOVCTL_REUSE_VFQ 0x00000001 diff --git a/drivers/net/igb/e1000_regs.h b/drivers/net/igb/e1000_regs.h index dd4e6ff..abb7333 100644 --- a/drivers/net/igb/e1000_regs.h +++ b/drivers/net/igb/e1000_regs.h @@ -310,6 +310,7 @@ #define E1000_VMOLR(_n) (0x05AD0 + (4 * (_n))) #define E1000_VLVF(_n) (0x05D00 + (4 * (_n))) /* VLAN Virtual Machine * Filter - RW */ +#define E1000_VMVIR(_n) (0x03700 + (4 * (_n))) #define wr32(reg, value) (writel(value, hw->hw_addr + reg)) #define rd32(reg) (readl(hw->hw_addr + reg)) diff --git a/drivers/net/igb/igb.h b/drivers/net/igb/igb.h index b1c1eb8..92ca69c 100644 --- a/drivers/net/igb/igb.h +++ b/drivers/net/igb/igb.h @@ -75,11 +75,13 @@ struct vf_data_storage { u16 vlans_enabled; u32 flags; unsigned long last_nack; + u16 pf_vlan; /* When set, guest VLAN config not allowed. */ }; #define IGB_VF_FLAG_CTS 0x00000001 /* VF is clear to send data */ #define IGB_VF_FLAG_UNI_PROMISC 0x00000002 /* VF has unicast promisc */ #define IGB_VF_FLAG_MULTI_PROMISC 0x00000004 /* VF has multicast promisc */ +#define IGB_VF_FLAG_PF_SET_MAC 0x00000008 /* PF has set MAC address */ /* RX descriptor control thresholds. * PTHRESH - MAC will consider prefetch if it has fewer than this number of diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 0a064ce..09309aa 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c @@ -133,6 +133,11 @@ static void igb_msg_task(struct igb_adapter *); static void igb_vmm_control(struct igb_adapter *); static int igb_set_vf_mac(struct igb_adapter *, int, unsigned char *); static void igb_restore_vf_multicasts(struct igb_adapter *adapter); +static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac); +static int igb_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan); +static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate); +static int igb_ndo_get_vf_config(struct net_device *netdev, int vf, + struct ifla_vf_info *ivi); #ifdef CONFIG_PM static int igb_suspend(struct pci_dev *, pm_message_t); @@ -1362,6 +1367,10 @@ static const struct net_device_ops igb_netdev_ops = { .ndo_vlan_rx_register = igb_vlan_rx_register, .ndo_vlan_rx_add_vid = igb_vlan_rx_add_vid, .ndo_vlan_rx_kill_vid = igb_vlan_rx_kill_vid, + .ndo_set_vf_mac = igb_ndo_set_vf_mac, + .ndo_set_vf_vlan = igb_ndo_set_vf_vlan, + .ndo_set_vf_tx_rate = igb_ndo_set_vf_bw, + .ndo_get_vf_config = igb_ndo_get_vf_config, #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = igb_netpoll, #endif @@ -2489,7 +2498,8 @@ static void igb_rlpml_set(struct igb_adapter *adapter) wr32(E1000_RLPML, max_frame_size); } -static inline void igb_set_vmolr(struct igb_adapter *adapter, int vfn) +static inline void igb_set_vmolr(struct igb_adapter *adapter, + int vfn, bool aupe) { struct e1000_hw *hw = &adapter->hw; u32 vmolr; @@ -2502,8 +2512,11 @@ static inline void igb_set_vmolr(struct igb_adapter *adapter, int vfn) return; vmolr = rd32(E1000_VMOLR(vfn)); - vmolr |= E1000_VMOLR_AUPE | /* Accept untagged packets */ - E1000_VMOLR_STRVLAN; /* Strip vlan tags */ + vmolr |= E1000_VMOLR_STRVLAN; /* Strip vlan tags */ + if (aupe) + vmolr |= E1000_VMOLR_AUPE; /* Accept untagged packets */ + else + vmolr &= ~(E1000_VMOLR_AUPE); /* Tagged packets ONLY */ /* clear all bits that might not be set */ vmolr &= ~(E1000_VMOLR_BAM | E1000_VMOLR_RSSE); @@ -2574,7 +2587,7 @@ void igb_configure_rx_ring(struct igb_adapter *adapter, wr32(E1000_SRRCTL(reg_idx), srrctl); /* set filtering for VMDQ pools */ - igb_set_vmolr(adapter, reg_idx & 0x7); + igb_set_vmolr(adapter, reg_idx & 0x7, true); /* enable receive descriptor fetching */ rxdctl = rd32(E1000_RXDCTL(reg_idx)); @@ -4506,6 +4519,54 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf) return -1; } +static void igb_set_vmvir(struct igb_adapter *adapter, u32 vid, u32 vf) +{ + struct e1000_hw *hw = &adapter->hw; + + if (vid) + wr32(E1000_VMVIR(vf), (vid | E1000_VMVIR_VLANA_DEFAULT)); + else + wr32(E1000_VMVIR(vf), 0); +} + +static int igb_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan) +{ + int err = 0; + struct igb_adapter *adapter = netdev_priv(netdev); + + if ((vf >= adapter->vfs_allocated_count) || (vlan > 4095)) + return -EINVAL; + + if (vlan) { + err = igb_vlvf_set(adapter, vlan, true, vf); + if (err) + goto out; + igb_set_vmvir(adapter, vlan, vf); + igb_set_vmolr(adapter, vf, false); + adapter->vf_data[vf].pf_vlan = vlan; + dev_info(&adapter->pdev->dev, + "Setting VLAN %d on VF %d\n", vlan, vf); + if (test_bit(__IGB_DOWN, &adapter->state)) { + dev_warn(&adapter->pdev->dev, + "The VF VLAN has been set," + " but the PF device is not up.\n"); + dev_warn(&adapter->pdev->dev, + "Bring the PF device up before" + " attempting to use the VF device.\n"); + } + } else if (adapter->vf_data[vf].pf_vlan) { + err = igb_vlvf_set(adapter, adapter->vf_data[vf].pf_vlan, + false, vf); + if (err) + goto out; + igb_set_vmvir(adapter, vlan, vf); + igb_set_vmolr(adapter, vf, true); + adapter->vf_data[vf].pf_vlan = 0; + } +out: + return err; +} + static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf) { int add = (msgbuf[0] & E1000_VT_MSGINFO_MASK) >> E1000_VT_MSGINFO_SHIFT; @@ -4516,15 +4577,20 @@ static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf) static inline void igb_vf_reset(struct igb_adapter *adapter, u32 vf) { - /* clear all flags */ - adapter->vf_data[vf].flags = 0; + /* clear flags */ + adapter->vf_data[vf].flags &= ~(IGB_VF_FLAG_PF_SET_MAC); adapter->vf_data[vf].last_nack = jiffies; /* reset offloads to defaults */ - igb_set_vmolr(adapter, vf); + igb_set_vmolr(adapter, vf, true); /* reset vlans for device */ igb_clear_vf_vfta(adapter, vf); + if (adapter->vf_data[vf].pf_vlan) + igb_ndo_set_vf_vlan(adapter->netdev, + adapter->vf_data[vf].pf_vlan, vf); + else + igb_clear_vf_vfta(adapter, vf); /* reset multicast table array for vf */ adapter->vf_data[vf].num_vf_mc_hashes = 0; @@ -4538,7 +4604,8 @@ static void igb_vf_reset_event(struct igb_adapter *adapter, u32 vf) unsigned char *vf_mac = adapter->vf_data[vf].vf_mac_addresses; /* generate a new mac address as we were hotplug removed/added */ - random_ether_addr(vf_mac); + if (!(adapter->vf_data[vf].flags & IGB_VF_FLAG_PF_SET_MAC)) + random_ether_addr(vf_mac); /* process remaining reset events */ igb_vf_reset(adapter, vf); @@ -4651,7 +4718,10 @@ static void igb_rcv_msg_from_vf(struct igb_adapter *adapter, u32 vf) retval = igb_set_vf_rlpml(adapter, msgbuf[1], vf); break; case E1000_VF_SET_VLAN: - retval = igb_set_vf_vlan(adapter, msgbuf, vf); + if (adapter->vf_data[vf].pf_vlan) + retval = -1; + else + retval = igb_set_vf_vlan(adapter, msgbuf, vf); break; default: dev_err(&pdev->dev, "Unhandled Msg %08x\n", msgbuf[0]); @@ -6013,6 +6083,40 @@ static int igb_set_vf_mac(struct igb_adapter *adapter, return 0; } +static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) +{ + struct igb_adapter *adapter = netdev_priv(netdev); + if (!is_valid_ether_addr(mac) || (vf >= adapter->vfs_allocated_count)) + return -EINVAL; + adapter->vf_data[vf].flags |= IGB_VF_FLAG_PF_SET_MAC; + dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n", mac, vf); + if (test_bit(__IGB_DOWN, &adapter->state)) { + dev_warn(&adapter->pdev->dev, "The VF MAC address has been set," + " but the PF device is not up.\n"); + dev_warn(&adapter->pdev->dev, "Bring the PF device up before" + " attempting to use the VF device.\n"); + } + return igb_set_vf_mac(adapter, vf, mac); +} + +static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate) +{ + return -EOPNOTSUPP; +} + +static int igb_ndo_get_vf_config(struct net_device *netdev, + int vf, struct ifla_vf_info *ivi) +{ + struct igb_adapter *adapter = netdev_priv(netdev); + if (vf >= adapter->vfs_allocated_count) + return -EINVAL; + ivi->vf = vf; + memcpy(&ivi->mac, adapter->vf_data[vf].vf_mac_addresses, ETH_ALEN); + ivi->tx_rate = 0; + ivi->vlan = adapter->vf_data[vf].pf_vlan; + return 0; +} + static void igb_vmm_control(struct igb_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2010-02-04 1:36 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-01-30 10:39 [net-next-2.6 PATCH 1/5] pci: Add SR-IOV convenience functions and macros Jeff Kirsher 2010-01-30 10:39 ` [net-next-2.6 PATCH 2/5] if_link: Add SR-IOV configuration methods Jeff Kirsher 2010-01-31 14:25 ` Or Gerlitz 2010-02-01 19:33 ` Williams, Mitch A 2010-02-02 5:16 ` Or Gerlitz 2010-02-02 16:45 ` Williams, Mitch A 2010-02-04 1:36 ` David Miller 2010-01-30 10:40 ` [net-next-2.6 PATCH 3/5] net: Add netdev ops for SR-IOV configuration Jeff Kirsher 2010-02-03 22:00 ` Ben Hutchings 2010-01-30 10:40 ` [net-next-2.6 PATCH 4/5] rtnetlink: Add VF config code to rtnetlink Jeff Kirsher 2010-01-30 10:40 ` [net-next-2.6 PATCH 5/5] igb: support for VF configuration tools Jeff Kirsher
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).