All of lore.kernel.org
 help / color / mirror / Atom feed
* [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

* [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

* [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

* 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, netdev, gospo, 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, netdev, gospo, 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; +Cc: Kirsher, Jeffrey T, davem, netdev, gospo

>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 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

* 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

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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.