From: Rolf Manderscheid Date: Tue, 11 Dec 2007 17:12:43 +0000 (-0800) Subject: ib/ipoib: add broadcast_scope attribute to child devices X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=91831df7b42e49b71bce66b23301e2b5e7b1767c;p=~shefty%2Frdma-dev.git ib/ipoib: add broadcast_scope attribute to child devices This patch just makes child devices slightly more consistent with parent devices with respect to configuring the scope. It allows the administrator to correct the scope after the child has already been created. The scope argument to create_child is still needed to support a parent device with default scope and a child device within the same partition. Signed-off-by: Rolf Manderscheid --- diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 2802ad2af42..2262d868c5a 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h @@ -386,6 +386,7 @@ static inline void ipoib_put_ah(struct ipoib_ah *ah) int ipoib_open(struct net_device *dev); int ipoib_add_pkey_attr(struct net_device *dev); +int ipoib_add_broadcast_scope_attr(struct net_device *dev); int ipoib_add_umcast_attr(struct net_device *dev); void ipoib_send(struct net_device *dev, struct sk_buff *skb, diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 6ce0a8865ce..b52a84185ff 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -1098,6 +1098,11 @@ static ssize_t set_bcast_scope(struct device *dev, } static DEVICE_ATTR(broadcast_scope, S_IWUSR | S_IRUGO, show_bcast_scope, set_bcast_scope); +int ipoib_add_broadcast_scope_attr(struct net_device *dev) +{ + return device_create_file(&dev->dev, &dev_attr_broadcast_scope); +} + static ssize_t create_child(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -1156,6 +1161,11 @@ int ipoib_pkey_scope_in_use(struct net_device *dev, unsigned short pkey, unsigne struct ipoib_dev_priv *ppriv, *priv; ppriv = netdev_priv(dev); + if (ppriv->parent) { + dev = ppriv->parent; + ppriv = netdev_priv(dev); + } + /* * We check the parent device and then all of the child interfaces to make sure * the Pkey and scope don't match. @@ -1248,7 +1258,7 @@ static struct net_device *ipoib_add_port(const char *format, goto sysfs_failed; if (device_create_file(&priv->dev->dev, &dev_attr_delete_child)) goto sysfs_failed; - if (device_create_file(&priv->dev->dev, &dev_attr_broadcast_scope)) + if (ipoib_add_broadcast_scope_attr(priv->dev)) goto sysfs_failed; return priv->dev; diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c index 280556f22ad..317a79d59ce 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c @@ -116,6 +116,8 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey, if (device_create_file(&priv->dev->dev, &dev_attr_parent)) goto sysfs_failed; + if (ipoib_add_broadcast_scope_attr(priv->dev)) + goto sysfs_failed; list_add_tail(&priv->list, &ppriv->child_intfs);