All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/2] net: dsa: remove restriction on platform_device
@ 2015-03-09 19:02 Florian Fainelli
  2015-03-09 19:02 ` [PATCH net-next 1/2] net: core: add of_find_net_device_by_node() Florian Fainelli
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Florian Fainelli @ 2015-03-09 19:02 UTC (permalink / raw)
  To: netdev
  Cc: davem, Florian Fainelli, vivien.didelot, jerome.oufella, linux,
	andrew, cphealy, mathieu, jonasj76, andrey.volkov, Chris.Packham

Hi all,

This patch series removes the restriction in DSA to operate exclusively with
platform_device Ethernet MAC drivers when using Device Tree. This basically
allows arbitrary Ethernet MAC drivers to be used now in conjunction with
Device Tree.

The reason was that DSA was using a of_find_device_by_node() which limits
the device_node to device pointer search exclusively to platform_device,
in our case, we are interested in doing a "class" research and lookup the
net_device.

Thanks to Chris Packham for testing this on his platform.

Florian Fainelli (2):
  net: core: add of_find_net_device_by_node()
  net: dsa: utilize of_find_net_device_by_node

 include/linux/of_net.h |  8 ++++++++
 include/net/dsa.h      |  1 +
 net/core/net-sysfs.c   | 25 +++++++++++++++++++++++++
 net/dsa/dsa.c          | 16 +++++++++++-----
 4 files changed, 45 insertions(+), 5 deletions(-)

-- 
2.1.0

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH net-next 1/2] net: core: add of_find_net_device_by_node()
  2015-03-09 19:02 [PATCH net-next 0/2] net: dsa: remove restriction on platform_device Florian Fainelli
@ 2015-03-09 19:02 ` Florian Fainelli
  2015-03-09 19:22   ` Guenter Roeck
  2015-03-09 19:02 ` [PATCH net-next 2/2] net: dsa: utilize of_find_net_device_by_node Florian Fainelli
  2015-03-09 20:12 ` [PATCH net-next 0/2] net: dsa: remove restriction on platform_device David Miller
  2 siblings, 1 reply; 6+ messages in thread
From: Florian Fainelli @ 2015-03-09 19:02 UTC (permalink / raw)
  To: netdev
  Cc: davem, Florian Fainelli, vivien.didelot, jerome.oufella, linux,
	andrew, cphealy, mathieu, jonasj76, andrey.volkov, Chris.Packham

Add a helper function which allows getting the struct net_device pointer
associated with a given struct device_node pointer. This is useful for
instance for DSA Ethernet devices not backed by a platform_device, but a PCI
device.

Since we need to access net_class which is not accessible outside of
net/core/net-sysfs.c, this helper function is also added here and gated
with CONFIG_OF_NET.

Network devices initialized with SET_NETDEV_DEV() are also taken into
account by checking for dev->parent first and then falling back to
checking the device pointer within struct net_device.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 include/linux/of_net.h |  8 ++++++++
 net/core/net-sysfs.c   | 25 +++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/include/linux/of_net.h b/include/linux/of_net.h
index 34597c8c1a4c..395e2d55c16e 100644
--- a/include/linux/of_net.h
+++ b/include/linux/of_net.h
@@ -9,8 +9,11 @@
 
 #ifdef CONFIG_OF_NET
 #include <linux/of.h>
+
+struct net_device;
 extern int of_get_phy_mode(struct device_node *np);
 extern const void *of_get_mac_address(struct device_node *np);
+extern struct net_device *of_find_net_device_by_node(struct device_node *np);
 #else
 static inline int of_get_phy_mode(struct device_node *np)
 {
@@ -21,6 +24,11 @@ static inline const void *of_get_mac_address(struct device_node *np)
 {
 	return NULL;
 }
+
+static inline struct net_device *of_find_net_device_by_node(struct device_node *np)
+{
+	return NULL
+};
 #endif
 
 #endif /* __LINUX_OF_NET_H */
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index f2aa73bfb0e4..cf30620a88e1 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -23,6 +23,7 @@
 #include <linux/export.h>
 #include <linux/jiffies.h>
 #include <linux/pm_runtime.h>
+#include <linux/of.h>
 
 #include "net-sysfs.h"
 
@@ -1374,6 +1375,30 @@ static struct class net_class = {
 	.namespace = net_namespace,
 };
 
+#ifdef CONFIG_OF_NET
+static int of_dev_node_match(struct device *dev, const void *data)
+{
+	int ret = 0;
+
+	if (dev->parent)
+		ret = dev->parent->of_node == data;
+
+	return ret == 0 ? dev->of_node == data : ret;
+}
+
+struct net_device *of_find_net_device_by_node(struct device_node *np)
+{
+	struct device *dev;
+
+	dev = class_find_device(&net_class, NULL, np, of_dev_node_match);
+	if (!dev)
+		return NULL;
+
+	return to_net_dev(dev);
+}
+EXPORT_SYMBOL(of_find_net_device_by_node);
+#endif
+
 /* Delete sysfs entries but hold kobject reference until after all
  * netdev references are gone.
  */
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 2/2] net: dsa: utilize of_find_net_device_by_node
  2015-03-09 19:02 [PATCH net-next 0/2] net: dsa: remove restriction on platform_device Florian Fainelli
  2015-03-09 19:02 ` [PATCH net-next 1/2] net: core: add of_find_net_device_by_node() Florian Fainelli
@ 2015-03-09 19:02 ` Florian Fainelli
  2015-03-09 20:12 ` [PATCH net-next 0/2] net: dsa: remove restriction on platform_device David Miller
  2 siblings, 0 replies; 6+ messages in thread
From: Florian Fainelli @ 2015-03-09 19:02 UTC (permalink / raw)
  To: netdev
  Cc: davem, Florian Fainelli, vivien.didelot, jerome.oufella, linux,
	andrew, cphealy, mathieu, jonasj76, andrey.volkov, Chris.Packham

Using of_find_device_by_node() restricts the search to platform_device that
match the specified device_node pointer. This is not even remotely true for
network devices backed by a pci_device for instance.

of_find_net_device_by_node() allows us to do a more thorough lookup to find the
struct net_device corresponding to a particular device_node pointer.

For symetry with the non-OF code path, we hold the net_device pointer in
dsa_probe() just like what dev_to_net_dev() does when we call this
function.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 include/net/dsa.h |  1 +
 net/dsa/dsa.c     | 16 +++++++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/include/net/dsa.h b/include/net/dsa.h
index b525ac516559..47917e5e1e12 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -72,6 +72,7 @@ struct dsa_platform_data {
 	 * to the root switch chip of the tree.
 	 */
 	struct device	*netdev;
+	struct net_device *of_netdev;
 
 	/*
 	 * Info structs describing each of the switch chips
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index b40f11bb419c..899772108ee3 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -20,6 +20,7 @@
 #include <linux/of.h>
 #include <linux/of_mdio.h>
 #include <linux/of_platform.h>
+#include <linux/of_net.h>
 #include <linux/sysfs.h>
 #include "dsa_priv.h"
 
@@ -583,7 +584,7 @@ static int dsa_of_probe(struct device *dev)
 	struct device_node *np = dev->of_node;
 	struct device_node *child, *mdio, *ethernet, *port, *link;
 	struct mii_bus *mdio_bus;
-	struct platform_device *ethernet_dev;
+	struct net_device *ethernet_dev;
 	struct dsa_platform_data *pd;
 	struct dsa_chip_data *cd;
 	const char *port_name;
@@ -604,7 +605,7 @@ static int dsa_of_probe(struct device *dev)
 	if (!ethernet)
 		return -EINVAL;
 
-	ethernet_dev = of_find_device_by_node(ethernet);
+	ethernet_dev = of_find_net_device_by_node(ethernet);
 	if (!ethernet_dev)
 		return -EPROBE_DEFER;
 
@@ -613,7 +614,7 @@ static int dsa_of_probe(struct device *dev)
 		return -ENOMEM;
 
 	dev->platform_data = pd;
-	pd->netdev = &ethernet_dev->dev;
+	pd->of_netdev = ethernet_dev;
 	pd->nr_chips = of_get_available_child_count(np);
 	if (pd->nr_chips > DSA_MAX_SWITCHES)
 		pd->nr_chips = DSA_MAX_SWITCHES;
@@ -771,10 +772,15 @@ static int dsa_probe(struct platform_device *pdev)
 		pd = pdev->dev.platform_data;
 	}
 
-	if (pd == NULL || pd->netdev == NULL)
+	if (pd == NULL || (pd->netdev == NULL && pd->of_netdev == NULL))
 		return -EINVAL;
 
-	dev = dev_to_net_device(pd->netdev);
+	if (pd->of_netdev) {
+		dev = pd->of_netdev;
+		dev_hold(dev);
+	} else {
+		dev = dev_to_net_device(pd->netdev);
+	}
 	if (dev == NULL) {
 		ret = -EPROBE_DEFER;
 		goto out;
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 1/2] net: core: add of_find_net_device_by_node()
  2015-03-09 19:02 ` [PATCH net-next 1/2] net: core: add of_find_net_device_by_node() Florian Fainelli
@ 2015-03-09 19:22   ` Guenter Roeck
  2015-03-09 19:31     ` Florian Fainelli
  0 siblings, 1 reply; 6+ messages in thread
From: Guenter Roeck @ 2015-03-09 19:22 UTC (permalink / raw)
  To: Florian Fainelli, netdev
  Cc: davem, vivien.didelot, jerome.oufella, andrew, cphealy, mathieu,
	jonasj76, andrey.volkov, Chris.Packham

On 03/09/2015 12:02 PM, Florian Fainelli wrote:
> Add a helper function which allows getting the struct net_device pointer
> associated with a given struct device_node pointer. This is useful for
> instance for DSA Ethernet devices not backed by a platform_device, but a PCI
> device.
>
> Since we need to access net_class which is not accessible outside of
> net/core/net-sysfs.c, this helper function is also added here and gated
> with CONFIG_OF_NET.
>
> Network devices initialized with SET_NETDEV_DEV() are also taken into
> account by checking for dev->parent first and then falling back to
> checking the device pointer within struct net_device.
>
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
>   include/linux/of_net.h |  8 ++++++++
>   net/core/net-sysfs.c   | 25 +++++++++++++++++++++++++
>   2 files changed, 33 insertions(+)
>
> diff --git a/include/linux/of_net.h b/include/linux/of_net.h
> index 34597c8c1a4c..395e2d55c16e 100644
> --- a/include/linux/of_net.h
> +++ b/include/linux/of_net.h
> @@ -9,8 +9,11 @@
>
>   #ifdef CONFIG_OF_NET
>   #include <linux/of.h>
> +
> +struct net_device;
>   extern int of_get_phy_mode(struct device_node *np);
>   extern const void *of_get_mac_address(struct device_node *np);
> +extern struct net_device *of_find_net_device_by_node(struct device_node *np);
>   #else
>   static inline int of_get_phy_mode(struct device_node *np)
>   {
> @@ -21,6 +24,11 @@ static inline const void *of_get_mac_address(struct device_node *np)
>   {
>   	return NULL;
>   }
> +
> +static inline struct net_device *of_find_net_device_by_node(struct device_node *np)

Checkpatch warning (line too long)

> +{
> +	return NULL
> +};

; after } is unusual, and you need to add ; after NULL to get this to compile.

>   #endif
>
>   #endif /* __LINUX_OF_NET_H */
> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
> index f2aa73bfb0e4..cf30620a88e1 100644
> --- a/net/core/net-sysfs.c
> +++ b/net/core/net-sysfs.c
> @@ -23,6 +23,7 @@
>   #include <linux/export.h>
>   #include <linux/jiffies.h>
>   #include <linux/pm_runtime.h>
> +#include <linux/of.h>
>
>   #include "net-sysfs.h"
>
> @@ -1374,6 +1375,30 @@ static struct class net_class = {
>   	.namespace = net_namespace,
>   };
>
> +#ifdef CONFIG_OF_NET
> +static int of_dev_node_match(struct device *dev, const void *data)
> +{
> +	int ret = 0;
> +
> +	if (dev->parent)
> +		ret = dev->parent->of_node == data;
> +
> +	return ret == 0 ? dev->of_node == data : ret;

	return ret ? : dev->of_node == data;

but that is really a matter of personal preference.

Guenter

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 1/2] net: core: add of_find_net_device_by_node()
  2015-03-09 19:22   ` Guenter Roeck
@ 2015-03-09 19:31     ` Florian Fainelli
  0 siblings, 0 replies; 6+ messages in thread
From: Florian Fainelli @ 2015-03-09 19:31 UTC (permalink / raw)
  To: Guenter Roeck, netdev
  Cc: davem, vivien.didelot, jerome.oufella, andrew, cphealy, mathieu,
	jonasj76, andrey.volkov, Chris.Packham

On 09/03/15 12:22, Guenter Roeck wrote:
> On 03/09/2015 12:02 PM, Florian Fainelli wrote:
>> Add a helper function which allows getting the struct net_device pointer
>> associated with a given struct device_node pointer. This is useful for
>> instance for DSA Ethernet devices not backed by a platform_device, but
>> a PCI
>> device.
>>
>> Since we need to access net_class which is not accessible outside of
>> net/core/net-sysfs.c, this helper function is also added here and gated
>> with CONFIG_OF_NET.
>>
>> Network devices initialized with SET_NETDEV_DEV() are also taken into
>> account by checking for dev->parent first and then falling back to
>> checking the device pointer within struct net_device.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>> ---
>>   include/linux/of_net.h |  8 ++++++++
>>   net/core/net-sysfs.c   | 25 +++++++++++++++++++++++++
>>   2 files changed, 33 insertions(+)
>>
>> diff --git a/include/linux/of_net.h b/include/linux/of_net.h
>> index 34597c8c1a4c..395e2d55c16e 100644
>> --- a/include/linux/of_net.h
>> +++ b/include/linux/of_net.h
>> @@ -9,8 +9,11 @@
>>
>>   #ifdef CONFIG_OF_NET
>>   #include <linux/of.h>
>> +
>> +struct net_device;
>>   extern int of_get_phy_mode(struct device_node *np);
>>   extern const void *of_get_mac_address(struct device_node *np);
>> +extern struct net_device *of_find_net_device_by_node(struct
>> device_node *np);
>>   #else
>>   static inline int of_get_phy_mode(struct device_node *np)
>>   {
>> @@ -21,6 +24,11 @@ static inline const void *of_get_mac_address(struct
>> device_node *np)
>>   {
>>       return NULL;
>>   }
>> +
>> +static inline struct net_device *of_find_net_device_by_node(struct
>> device_node *np)
> 
> Checkpatch warning (line too long)
> 
>> +{
>> +    return NULL
>> +};
> 
> ; after } is unusual, and you need to add ; after NULL to get this to
> compile.

Good catch, thanks, I can't pretend I compiled the !OF_NET case, can I?

> 
>>   #endif
>>
>>   #endif /* __LINUX_OF_NET_H */
>> diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
>> index f2aa73bfb0e4..cf30620a88e1 100644
>> --- a/net/core/net-sysfs.c
>> +++ b/net/core/net-sysfs.c
>> @@ -23,6 +23,7 @@
>>   #include <linux/export.h>
>>   #include <linux/jiffies.h>
>>   #include <linux/pm_runtime.h>
>> +#include <linux/of.h>
>>
>>   #include "net-sysfs.h"
>>
>> @@ -1374,6 +1375,30 @@ static struct class net_class = {
>>       .namespace = net_namespace,
>>   };
>>
>> +#ifdef CONFIG_OF_NET
>> +static int of_dev_node_match(struct device *dev, const void *data)
>> +{
>> +    int ret = 0;
>> +
>> +    if (dev->parent)
>> +        ret = dev->parent->of_node == data;
>> +
>> +    return ret == 0 ? dev->of_node == data : ret;
> 
>     return ret ? : dev->of_node == data;
> 
> but that is really a matter of personal preference.

I kind of prefer treating the positive case as explicit, but either way
is fine.
-- 
Florian

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/2] net: dsa: remove restriction on platform_device
  2015-03-09 19:02 [PATCH net-next 0/2] net: dsa: remove restriction on platform_device Florian Fainelli
  2015-03-09 19:02 ` [PATCH net-next 1/2] net: core: add of_find_net_device_by_node() Florian Fainelli
  2015-03-09 19:02 ` [PATCH net-next 2/2] net: dsa: utilize of_find_net_device_by_node Florian Fainelli
@ 2015-03-09 20:12 ` David Miller
  2 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2015-03-09 20:12 UTC (permalink / raw)
  To: f.fainelli
  Cc: netdev, vivien.didelot, jerome.oufella, linux, andrew, cphealy,
	mathieu, jonasj76, andrey.volkov, Chris.Packham

From: Florian Fainelli <f.fainelli@gmail.com>
Date: Mon,  9 Mar 2015 12:02:28 -0700

> This patch series removes the restriction in DSA to operate exclusively with
> platform_device Ethernet MAC drivers when using Device Tree. This basically
> allows arbitrary Ethernet MAC drivers to be used now in conjunction with
> Device Tree.
> 
> The reason was that DSA was using a of_find_device_by_node() which limits
> the device_node to device pointer search exclusively to platform_device,
> in our case, we are interested in doing a "class" research and lookup the
> net_device.
> 
> Thanks to Chris Packham for testing this on his platform.

Looks like there is a V2 coming of this series based upon feedback.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-03-09 20:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-09 19:02 [PATCH net-next 0/2] net: dsa: remove restriction on platform_device Florian Fainelli
2015-03-09 19:02 ` [PATCH net-next 1/2] net: core: add of_find_net_device_by_node() Florian Fainelli
2015-03-09 19:22   ` Guenter Roeck
2015-03-09 19:31     ` Florian Fainelli
2015-03-09 19:02 ` [PATCH net-next 2/2] net: dsa: utilize of_find_net_device_by_node Florian Fainelli
2015-03-09 20:12 ` [PATCH net-next 0/2] net: dsa: remove restriction on platform_device David Miller

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.