* [RFC PATCH v2 1/6] pci: Add pci_num_vf function
@ 2009-12-18 1:33 Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 2/6] net: Add netif_num_vf function Jeff Kirsher
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Jeff Kirsher @ 2009-12-18 1:33 UTC (permalink / raw)
To: netdev; +Cc: 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.
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 | 5 +++++
2 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index b2a448e..52ee6d3 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->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 04771b9..c44d6e0 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1282,6 +1282,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)
{
@@ -1294,6 +1295,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] 10+ messages in thread
* [RFC PATCH v2 2/6] net: Add netif_num_vf function
2009-12-18 1:33 [RFC PATCH v2 1/6] pci: Add pci_num_vf function Jeff Kirsher
@ 2009-12-18 1:34 ` Jeff Kirsher
2009-12-18 17:37 ` Ben Hutchings
2009-12-19 4:05 ` David Miller
2009-12-18 1:34 ` [RFC PATCH v2 3/6] if_link: Add SR-IOV configuration methods Jeff Kirsher
` (3 subsequent siblings)
4 siblings, 2 replies; 10+ messages in thread
From: Jeff Kirsher @ 2009-12-18 1:34 UTC (permalink / raw)
To: netdev; +Cc: gospo, Mitch Williams, Jeff Kirsher
From: Williams, Mitch A <mitch.a.williams@intel.com>
Add a convenience function to determine how many VF devices are associated
with a given PF network interface. If the device is not an SR-IOV physical
function device, the function returns 0.
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
include/linux/netdevice.h | 27 +++++++++++++++++++++++++++
1 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index a3fccc8..f6e521e 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -38,6 +38,7 @@
#include <asm/byteorder.h>
#include <linux/device.h>
+#include <linux/pci.h>
#include <linux/percpu.h>
#include <linux/rculist.h>
#include <linux/dmaengine.h>
@@ -1509,6 +1510,32 @@ static inline int netif_is_multiqueue(const struct net_device *dev)
{
return (dev->num_tx_queues > 1);
}
+/**
+ * netif_num_vf - return number of SR-IOV VFs
+ * @dev: network device
+ *
+ * Return the number of SR-IOV virtual function devices that are
+ * associated with this physical function device. Returns 0 if
+ * device is not a PF device, or if SR-IOV not enabled.
+ */
+static inline int netif_num_vf(const struct net_device *dev)
+{
+ struct pci_dev *pdev;
+ int retval = 0;
+
+ if (!dev)
+ goto out;
+
+ if (!dev->dev.parent)
+ goto out;
+
+ if (dev->dev.parent->bus == &pci_bus_type) {
+ pdev = to_pci_dev(dev->dev.parent);
+ retval = pci_num_vf(pdev);
+ }
+out:
+ return retval;
+}
/* Use this variant when it is known for sure that it
* is executing from hardware interrupt context or with hardware interrupts
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [RFC PATCH v2 3/6] if_link: Add SR-IOV configuration methods
2009-12-18 1:33 [RFC PATCH v2 1/6] pci: Add pci_num_vf function Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 2/6] net: Add netif_num_vf function Jeff Kirsher
@ 2009-12-18 1:34 ` Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 4/6] net: Add netdev ops for SR-IOV configuration Jeff Kirsher
` (2 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Jeff Kirsher @ 2009-12-18 1:34 UTC (permalink / raw)
To: netdev; +Cc: 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] 10+ messages in thread
* [RFC PATCH v2 4/6] net: Add netdev ops for SR-IOV configuration
2009-12-18 1:33 [RFC PATCH v2 1/6] pci: Add pci_num_vf function Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 2/6] net: Add netif_num_vf function Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 3/6] if_link: Add SR-IOV configuration methods Jeff Kirsher
@ 2009-12-18 1:34 ` Jeff Kirsher
2009-12-18 18:19 ` Ben Hutchings
2009-12-18 1:35 ` [RFC PATCH v2 5/6] rtnetlink: Add VF config code to rtnetlink Jeff Kirsher
2009-12-18 1:35 ` [RFC PATCH v2 6/6] igb: add support for VF configuration tools Jeff Kirsher
4 siblings, 1 reply; 10+ messages in thread
From: Jeff Kirsher @ 2009-12-18 1:34 UTC (permalink / raw)
To: netdev; +Cc: 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 f6e521e..0e42077 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>
@@ -611,6 +612,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 {
@@ -660,6 +668,15 @@ struct net_device_ops {
#define HAVE_NETDEV_POLL
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] 10+ messages in thread
* [RFC PATCH v2 5/6] rtnetlink: Add VF config code to rtnetlink
2009-12-18 1:33 [RFC PATCH v2 1/6] pci: Add pci_num_vf function Jeff Kirsher
` (2 preceding siblings ...)
2009-12-18 1:34 ` [RFC PATCH v2 4/6] net: Add netdev ops for SR-IOV configuration Jeff Kirsher
@ 2009-12-18 1:35 ` Jeff Kirsher
2009-12-18 1:35 ` [RFC PATCH v2 6/6] igb: add support for VF configuration tools Jeff Kirsher
4 siblings, 0 replies; 10+ messages in thread
From: Jeff Kirsher @ 2009-12-18 1:35 UTC (permalink / raw)
To: netdev; +Cc: 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 | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 794bcb8..090b9fc 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -580,6 +580,11 @@ 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)
+{
+ return netif_num_vf(dev) * sizeof(struct ifla_vf_info);
+}
+
static inline size_t if_nlmsg_size(const struct net_device *dev)
{
return NLMSG_ALIGN(sizeof(struct ifinfomsg))
@@ -597,6 +602,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 +672,16 @@ 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) && netif_num_vf(dev)) {
+ int i;
+ struct ifla_vf_info ivi;
+ NLA_PUT_U32(skb, IFLA_NUM_VF, netif_num_vf(dev));
+ for (i = 0; i < netif_num_vf(dev); 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 +742,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 +921,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] 10+ messages in thread
* [RFC PATCH v2 6/6] igb: add support for VF configuration tools
2009-12-18 1:33 [RFC PATCH v2 1/6] pci: Add pci_num_vf function Jeff Kirsher
` (3 preceding siblings ...)
2009-12-18 1:35 ` [RFC PATCH v2 5/6] rtnetlink: Add VF config code to rtnetlink Jeff Kirsher
@ 2009-12-18 1:35 ` Jeff Kirsher
4 siblings, 0 replies; 10+ messages in thread
From: Jeff Kirsher @ 2009-12-18 1:35 UTC (permalink / raw)
To: netdev; +Cc: 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 | 105 +++++++++++++++++++++++++++++++++++++----
4 files changed, 102 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 78963a0..bb8b602 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);
@@ -1367,6 +1372,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
@@ -2494,7 +2503,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;
@@ -2507,8 +2517,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);
@@ -2579,7 +2592,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));
@@ -4507,6 +4520,44 @@ 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;
+ } 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;
@@ -4517,15 +4568,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;
@@ -4539,7 +4595,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);
@@ -4652,7 +4709,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]);
@@ -6008,6 +6068,33 @@ 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;
+ 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 -ENOTSUPP;
+}
+
+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] 10+ messages in thread
* Re: [RFC PATCH v2 2/6] net: Add netif_num_vf function
2009-12-18 1:34 ` [RFC PATCH v2 2/6] net: Add netif_num_vf function Jeff Kirsher
@ 2009-12-18 17:37 ` Ben Hutchings
2009-12-19 4:05 ` David Miller
1 sibling, 0 replies; 10+ messages in thread
From: Ben Hutchings @ 2009-12-18 17:37 UTC (permalink / raw)
To: Jeff Kirsher; +Cc: netdev, gospo, Mitch Williams
On Thu, 2009-12-17 at 17:34 -0800, Jeff Kirsher wrote:
> From: Williams, Mitch A <mitch.a.williams@intel.com>
>
> Add a convenience function to determine how many VF devices are associated
> with a given PF network interface. If the device is not an SR-IOV physical
> function device, the function returns 0.
[...]
> +/**
> + * netif_num_vf - return number of SR-IOV VFs
> + * @dev: network device
> + *
> + * Return the number of SR-IOV virtual function devices that are
> + * associated with this physical function device. Returns 0 if
> + * device is not a PF device, or if SR-IOV not enabled.
> + */
> +static inline int netif_num_vf(const struct net_device *dev)
> +{
> + struct pci_dev *pdev;
> + int retval = 0;
> +
> + if (!dev)
> + goto out;
Why should this function allow dev == NULL?
> + if (!dev->dev.parent)
> + goto out;
> +
> + if (dev->dev.parent->bus == &pci_bus_type) {
> + pdev = to_pci_dev(dev->dev.parent);
> + retval = pci_num_vf(pdev);
> + }
> +out:
> + return retval;
[...]
It would be much clearer to write:
struct pci_dev *pdev;
if (dev && dev->dev.parent &&
dev->dev.parent->bus == &pci_bus_type) {
pdev = to_pci_dev(dev->dev.parent);
return pci_num_vf(pdev);
} else {
return 0;
}
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] 10+ messages in thread
* Re: [RFC PATCH v2 4/6] net: Add netdev ops for SR-IOV configuration
2009-12-18 1:34 ` [RFC PATCH v2 4/6] net: Add netdev ops for SR-IOV configuration Jeff Kirsher
@ 2009-12-18 18:19 ` Ben Hutchings
0 siblings, 0 replies; 10+ messages in thread
From: Ben Hutchings @ 2009-12-18 18:19 UTC (permalink / raw)
To: Jeff Kirsher; +Cc: netdev, gospo, Mitch Williams
On Thu, 2009-12-17 at 17:34 -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.
Though this be restricted to VFs, though?
It is possible to have virtualised interfaces appear as PFs, so they can
easily be passed-through to guests with no IOV support. HP's 'Virtual
Connect Flex-10' NICs do this, but I'm not sure how they are configured
and whether it is possible to do so from Linux as opposed to firmware.
Solarstorm controllers also have an on-NIC page table and page-
segregated queues that can be mapped into PV guests, which could perhaps
be made configurable in the same way.
[...]
> @@ -660,6 +668,15 @@ struct net_device_ops {
> #define HAVE_NETDEV_POLL
> 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 these remain specific to IOV, presumably they should be guarded by
#ifdef CONFIG_PCI_IOV.
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] 10+ messages in thread
* Re: [RFC PATCH v2 2/6] net: Add netif_num_vf function
2009-12-18 1:34 ` [RFC PATCH v2 2/6] net: Add netif_num_vf function Jeff Kirsher
2009-12-18 17:37 ` Ben Hutchings
@ 2009-12-19 4:05 ` David Miller
2009-12-21 18:34 ` Williams, Mitch A
1 sibling, 1 reply; 10+ messages in thread
From: David Miller @ 2009-12-19 4:05 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, gospo, mitch.a.williams
Well, first of all this won't build without CONFIG_PCI
defined.
Second of all, we're not putting PCI crap into netdevice.h
Create a generic device layer abstraction by which you can
fetch these values.
Thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [RFC PATCH v2 2/6] net: Add netif_num_vf function
2009-12-19 4:05 ` David Miller
@ 2009-12-21 18:34 ` Williams, Mitch A
0 siblings, 0 replies; 10+ messages in thread
From: Williams, Mitch A @ 2009-12-21 18:34 UTC (permalink / raw)
To: David Miller, Kirsher, Jeffrey T; +Cc: netdev@vger.kernel.org, gospo@redhat.com
>Subject: Re: [RFC PATCH v2 2/6] net: Add netif_num_vf function
>
>
>Well, first of all this won't build without CONFIG_PCI
>defined.
>
>Second of all, we're not putting PCI crap into netdevice.h
>
>Create a generic device layer abstraction by which you can
>fetch these values.
>
>Thanks.
OK, I'll respin this and resubmit after the new year.
-Mitch
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-12-21 18:34 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-18 1:33 [RFC PATCH v2 1/6] pci: Add pci_num_vf function Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 2/6] net: Add netif_num_vf function Jeff Kirsher
2009-12-18 17:37 ` Ben Hutchings
2009-12-19 4:05 ` David Miller
2009-12-21 18:34 ` Williams, Mitch A
2009-12-18 1:34 ` [RFC PATCH v2 3/6] if_link: Add SR-IOV configuration methods Jeff Kirsher
2009-12-18 1:34 ` [RFC PATCH v2 4/6] net: Add netdev ops for SR-IOV configuration Jeff Kirsher
2009-12-18 18:19 ` Ben Hutchings
2009-12-18 1:35 ` [RFC PATCH v2 5/6] rtnetlink: Add VF config code to rtnetlink Jeff Kirsher
2009-12-18 1:35 ` [RFC PATCH v2 6/6] igb: add 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).