* am335x: cpsw: phy ignores max-speed setting
@ 2014-11-06 16:25 Yegor Yefremov
  2014-11-06 16:51 ` Dave Taht
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Yegor Yefremov @ 2014-11-06 16:25 UTC (permalink / raw)
  To: netdev; +Cc: N, Mugunthan V, mpa, lsorense, Daniel Mack
I' m trying to override max-speed setting for both CPSW connected
PHYs. This is my DTS section for configuring CPSW:
&mac {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&cpsw_default>;
        pinctrl-1 = <&cpsw_sleep>;
        dual_emac = <1>;
        status = "okay";
};
&davinci_mdio {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&davinci_mdio_default>;
        pinctrl-1 = <&davinci_mdio_sleep>;
        status = "okay";
};
&cpsw_emac0 {
        phy_id = <&davinci_mdio>, <0>;
        phy-mode = "rgmii-id";
        dual_emac_res_vlan = <1>;
        max-speed = <100>;
};
&cpsw_emac1 {
        phy_id = <&davinci_mdio>, <1>;
        phy-mode = "rgmii-id";
        dual_emac_res_vlan = <2>;
        max-speed = <100>;
};
But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
don't get through node check, i.e. node == NULL. Any idea why?
static void of_set_phy_supported(struct phy_device *phydev)
{
        struct device_node *node = phydev->dev.of_node;
        u32 max_speed;
        if (!IS_ENABLED(CONFIG_OF_MDIO))
                return;
        if (!node)
                return;
        if (!of_property_read_u32(node, "max-speed", &max_speed)) {
                /* The default values for phydev->supported are
provided by the PHY
                 * driver "features" member, we want to reset to sane
defaults fist
                 * before supporting higher speeds.
                 */
                phydev->supported &= PHY_DEFAULT_FEATURES;
                switch (max_speed) {
                default:
                        return;
                case SPEED_1000:
                        phydev->supported |= PHY_1000BT_FEATURES;
                case SPEED_100:
                        phydev->supported |= PHY_100BT_FEATURES;
                case SPEED_10:
                        phydev->supported |= PHY_10BT_FEATURES;
                }
        }
}
Yegor
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-06 16:25 am335x: cpsw: phy ignores max-speed setting Yegor Yefremov
@ 2014-11-06 16:51 ` Dave Taht
  2014-11-06 17:28   ` Eric Dumazet
  2014-11-06 19:19   ` Joe Perches
  2014-11-06 16:58 ` Florian Fainelli
  2014-11-06 19:20 ` Lennart Sorensen
  2 siblings, 2 replies; 10+ messages in thread
From: Dave Taht @ 2014-11-06 16:51 UTC (permalink / raw)
  To: Yegor Yefremov; +Cc: netdev, N, Mugunthan V, mpa, lsorense, Daniel Mack
[-- Attachment #1: Type: text/plain, Size: 2996 bytes --]
ooh! ooh! I have a BQL enablement patch for the cpsw that I have no
means of testing against multiple phys. Could
you give the attached very small patch a shot along the way?
The results I get on the beaglebone vs netperf-wrapper are pretty
spectacular - huge increase in throughput, big reduction in
latency.
http://snapon.lab.bufferbloat.net/~d/beagle_bql/bql_makes_a_difference.png
http://snapon.lab.bufferbloat.net/~d/beagle_bql/beaglebonewithbql.png
On Thu, Nov 6, 2014 at 8:25 AM, Yegor Yefremov
<yegorslists@googlemail.com> wrote:
> I' m trying to override max-speed setting for both CPSW connected
> PHYs. This is my DTS section for configuring CPSW:
>
> &mac {
>         pinctrl-names = "default", "sleep";
>         pinctrl-0 = <&cpsw_default>;
>         pinctrl-1 = <&cpsw_sleep>;
>         dual_emac = <1>;
>
>         status = "okay";
> };
>
> &davinci_mdio {
>         pinctrl-names = "default", "sleep";
>         pinctrl-0 = <&davinci_mdio_default>;
>         pinctrl-1 = <&davinci_mdio_sleep>;
>
>         status = "okay";
> };
>
> &cpsw_emac0 {
>         phy_id = <&davinci_mdio>, <0>;
>         phy-mode = "rgmii-id";
>         dual_emac_res_vlan = <1>;
>         max-speed = <100>;
> };
>
> &cpsw_emac1 {
>         phy_id = <&davinci_mdio>, <1>;
>         phy-mode = "rgmii-id";
>         dual_emac_res_vlan = <2>;
>         max-speed = <100>;
> };
>
> But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
> don't get through node check, i.e. node == NULL. Any idea why?
>
> static void of_set_phy_supported(struct phy_device *phydev)
> {
>         struct device_node *node = phydev->dev.of_node;
>         u32 max_speed;
>
>         if (!IS_ENABLED(CONFIG_OF_MDIO))
>                 return;
>
>         if (!node)
>                 return;
>
>         if (!of_property_read_u32(node, "max-speed", &max_speed)) {
>                 /* The default values for phydev->supported are
> provided by the PHY
>                  * driver "features" member, we want to reset to sane
> defaults fist
>                  * before supporting higher speeds.
>                  */
>                 phydev->supported &= PHY_DEFAULT_FEATURES;
>
>                 switch (max_speed) {
>                 default:
>                         return;
>
>                 case SPEED_1000:
>                         phydev->supported |= PHY_1000BT_FEATURES;
>                 case SPEED_100:
>                         phydev->supported |= PHY_100BT_FEATURES;
>                 case SPEED_10:
>                         phydev->supported |= PHY_10BT_FEATURES;
>                 }
>         }
> }
>
> Yegor
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
-- 
Dave Täht
thttp://www.bufferbloat.net/projects/bloat/wiki/Upcoming_Talks
[-- Attachment #2: 0001-Add-BQL-support-to-the-TI-cpsw-driver.patch --]
[-- Type: text/x-patch, Size: 2369 bytes --]
From 7eccb26dc8f6d09660b22fcbd868572d050df26f Mon Sep 17 00:00:00 2001
From: Dave Taht <dave.taht@bufferbloat.net>
Date: Thu, 6 Nov 2014 08:45:30 -0800
Subject: [PATCH] Add BQL support to the TI cpsw driver
Tested on the beaglebone black.
I get a huge improvement in both throughput and latency.
Latency goes from 60ms worst case with pfifo_fast, and 12ms worst case with
sch_fq to 2.5ms with BQL enabled.
Throughput improved also.
---
 drivers/net/ethernet/ti/cpsw.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index d879448..5934fbc 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -118,7 +118,7 @@ do {								\
 #define CPDMA_TXCP		0x40
 #define CPDMA_RXCP		0x60
 
-#define CPSW_POLL_WEIGHT	64
+#define CPSW_POLL_WEIGHT	16
 #define CPSW_MIN_PACKET_SIZE	60
 #define CPSW_MAX_PACKET_SIZE	(1500 + 14 + 4 + 4)
 
@@ -693,6 +693,7 @@ static void cpsw_tx_handler(void *token, int len, int status)
 	cpts_tx_timestamp(priv->cpts, skb);
 	ndev->stats.tx_packets++;
 	ndev->stats.tx_bytes += len;
+	netdev_completed_queue(ndev,1,len);
 	dev_kfree_skb_any(skb);
 }
 
@@ -1307,6 +1308,8 @@ static int cpsw_ndo_open(struct net_device *ndev)
 		cpsw_set_coalesce(ndev, &coal);
 	}
 
+	netdev_reset_queue(ndev);
+	dev_info(priv->dev, "BQL enabled\n");
 	napi_enable(&priv->napi);
 	cpdma_ctlr_start(priv->dma);
 	cpsw_intr_enable(priv);
@@ -1341,6 +1344,7 @@ static int cpsw_ndo_stop(struct net_device *ndev)
 	netif_stop_queue(priv->ndev);
 	napi_disable(&priv->napi);
 	netif_carrier_off(priv->ndev);
+	netdev_reset_queue(priv->ndev);
 
 	if (cpsw_common_res_usage_state(priv) <= 1) {
 		cpts_unregister(priv->cpts);
@@ -1361,6 +1365,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
 {
 	struct cpsw_priv *priv = netdev_priv(ndev);
 	int ret;
+	int len;
 
 	ndev->trans_start = jiffies;
 
@@ -1375,9 +1380,11 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
 		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 
 	skb_tx_timestamp(skb);
-
+	len = max(skb->len, CPSW_MIN_PACKET_SIZE);
+	netdev_sent_queue(ndev,len);
 	ret = cpsw_tx_packet_submit(ndev, priv, skb);
 	if (unlikely(ret != 0)) {
+		netdev_completed_queue(ndev,1,len);
 		cpsw_err(priv, tx_err, "desc submit failed\n");
 		goto fail;
 	}
-- 
1.9.1
^ permalink raw reply related	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-06 16:25 am335x: cpsw: phy ignores max-speed setting Yegor Yefremov
  2014-11-06 16:51 ` Dave Taht
@ 2014-11-06 16:58 ` Florian Fainelli
  2014-11-07  7:11   ` Yegor Yefremov
  2014-11-06 19:20 ` Lennart Sorensen
  2 siblings, 1 reply; 10+ messages in thread
From: Florian Fainelli @ 2014-11-06 16:58 UTC (permalink / raw)
  To: Yegor Yefremov, netdev; +Cc: N, Mugunthan V, mpa, lsorense, Daniel Mack
On 11/06/2014 08:25 AM, Yegor Yefremov wrote:
> I' m trying to override max-speed setting for both CPSW connected
> PHYs. This is my DTS section for configuring CPSW:
> 
> &mac {
>         pinctrl-names = "default", "sleep";
>         pinctrl-0 = <&cpsw_default>;
>         pinctrl-1 = <&cpsw_sleep>;
>         dual_emac = <1>;
> 
>         status = "okay";
> };
> 
> &davinci_mdio {
>         pinctrl-names = "default", "sleep";
>         pinctrl-0 = <&davinci_mdio_default>;
>         pinctrl-1 = <&davinci_mdio_sleep>;
> 
>         status = "okay";
> };
> 
> &cpsw_emac0 {
>         phy_id = <&davinci_mdio>, <0>;
>         phy-mode = "rgmii-id";
>         dual_emac_res_vlan = <1>;
>         max-speed = <100>;
> };
> 
> &cpsw_emac1 {
>         phy_id = <&davinci_mdio>, <1>;
>         phy-mode = "rgmii-id";
>         dual_emac_res_vlan = <2>;
>         max-speed = <100>;
> };
> 
> But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
> don't get through node check, i.e. node == NULL. Any idea why?
Yes, because the 'max-speed' property is placed at the Ethernet MAC node
level, not the PHY node as of_set_phy_supported() expect its.
This driver does not appear to use the standard Ethernet PHY device tree
node, so I am not sure what are your options here.
> 
> static void of_set_phy_supported(struct phy_device *phydev)
> {
>         struct device_node *node = phydev->dev.of_node;
>         u32 max_speed;
> 
>         if (!IS_ENABLED(CONFIG_OF_MDIO))
>                 return;
> 
>         if (!node)
>                 return;
> 
>         if (!of_property_read_u32(node, "max-speed", &max_speed)) {
>                 /* The default values for phydev->supported are
> provided by the PHY
>                  * driver "features" member, we want to reset to sane
> defaults fist
>                  * before supporting higher speeds.
>                  */
>                 phydev->supported &= PHY_DEFAULT_FEATURES;
> 
>                 switch (max_speed) {
>                 default:
>                         return;
> 
>                 case SPEED_1000:
>                         phydev->supported |= PHY_1000BT_FEATURES;
>                 case SPEED_100:
>                         phydev->supported |= PHY_100BT_FEATURES;
>                 case SPEED_10:
>                         phydev->supported |= PHY_10BT_FEATURES;
>                 }
>         }
> }
> 
> Yegor
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-06 16:51 ` Dave Taht
@ 2014-11-06 17:28   ` Eric Dumazet
  2014-11-06 19:19   ` Joe Perches
  1 sibling, 0 replies; 10+ messages in thread
From: Eric Dumazet @ 2014-11-06 17:28 UTC (permalink / raw)
  To: Dave Taht
  Cc: Yegor Yefremov, netdev, N, Mugunthan V, mpa, lsorense,
	Daniel Mack
On Thu, 2014-11-06 at 08:51 -0800, Dave Taht wrote:
> ooh! ooh! I have a BQL enablement patch for the cpsw that I have no
> means of testing against multiple phys. Could
> you give the attached very small patch a shot along the way?
> 
> The results I get on the beaglebone vs netperf-wrapper are pretty
> spectacular - huge increase in throughput, big reduction in
> latency.
Please send this patch inline, so that we can comment, and start a new
thread.
@@ -1375,9 +1380,11 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
                skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 
        skb_tx_timestamp(skb);
-
+       len = max(skb->len, CPSW_MIN_PACKET_SIZE);
+       netdev_sent_queue(ndev,len);
        ret = cpsw_tx_packet_submit(ndev, priv, skb);
        if (unlikely(ret != 0)) {
+               netdev_completed_queue(ndev,1,len);
<<you can not do that, its racy with other netdev_completed_queue() calls from TX completion >>
                cpsw_err(priv, tx_err, "desc submit failed\n");
                goto fail;
        }
You need to call netdev_sent_queue(ndev, len); at the correct place,
because we can not 'undo' it.
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-06 16:51 ` Dave Taht
  2014-11-06 17:28   ` Eric Dumazet
@ 2014-11-06 19:19   ` Joe Perches
       [not found]     ` <CAA93jw7PTOGdYrmFGSY5zat=MpVsdmESVwpK_tVO=sLeDSWpRA@mail.gmail.com>
  1 sibling, 1 reply; 10+ messages in thread
From: Joe Perches @ 2014-11-06 19:19 UTC (permalink / raw)
  To: Dave Taht
  Cc: Yegor Yefremov, netdev, N, Mugunthan V, mpa, lsorense,
	Daniel Mack
On Thu, 2014-11-06 at 08:51 -0800, Dave Taht wrote:
> ooh! ooh! I have a BQL enablement patch for the cpsw that I have no
> means of testing against multiple phys. Could
> you give the attached very small patch a shot along the way?
One trivial bit and another possible patch below it
this
+       dev_info(priv->dev, "BQL enabled\n");
might be better as:
+	cpsw_info(priv, link, "BQL enabled\n");
Is this the change that matters most?
-#define CPSW_POLL_WEIGHT       64
+#define CPSW_POLL_WEIGHT       16
If so, maybe this could be limited by a sysctl:
Something like:
 Documentation/sysctl/net.txt | 9 +++++++++
 include/linux/netdevice.h    | 1 +
 net/core/dev.c               | 7 +++++++
 net/core/sysctl_net_core.c   | 7 +++++++
 4 files changed, 24 insertions(+)
diff --git a/Documentation/sysctl/net.txt b/Documentation/sysctl/net.txt
index 04892b8..1fe0ebd 100644
--- a/Documentation/sysctl/net.txt
+++ b/Documentation/sysctl/net.txt
@@ -50,6 +50,15 @@ The maximum number of packets that kernel can handle on a NAPI interrupt,
 it's a Per-CPU variable.
 Default: 64
 
+napi_add_weight_max
+-------------------
+
+Limit the maximum number of packets that a device can register in a
+call to netif_napi_add.  This is disabled by default so the value in the
+specific device call is used, but it may be useful in throughput and
+latency testing.
+Default: 0 (off)
+
 default_qdisc
 --------------
 
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 68fe8a0..31857de 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3380,6 +3380,7 @@ void netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,
 extern int		netdev_max_backlog;
 extern int		netdev_tstamp_prequeue;
 extern int		weight_p;
+extern int		sysctl_napi_add_weight_max;
 extern int		bpf_jit_enable;
 
 bool netdev_has_upper_dev(struct net_device *dev, struct net_device *upper_dev);
diff --git a/net/core/dev.c b/net/core/dev.c
index c934680..aa9bd8d 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3016,6 +3016,7 @@ EXPORT_SYMBOL(netdev_max_backlog);
 int netdev_tstamp_prequeue __read_mostly = 1;
 int netdev_budget __read_mostly = 300;
 int weight_p __read_mostly = 64;            /* old backlog weight */
+int sysctl_napi_add_weight_max __read_mostly = 0; /* disabled by default */
 
 /* Called with irq disabled */
 static inline void ____napi_schedule(struct softnet_data *sd,
@@ -4506,6 +4507,12 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
 	if (weight > NAPI_POLL_WEIGHT)
 		pr_err_once("netif_napi_add() called with weight %d on device %s\n",
 			    weight, dev->name);
+	if (sysctl_napi_add_weight_max > 0 &&
+	    weight > sysctl_napi_add_weight_max) {
+		pr_notice("netif_napi_add() requested weight %d reduced to sysctl napi_add_weight_max limit %d on device %s\n",
+			  weight, sysctl_napi_add_weight_max, dev->name);
+		weight = sysctl_napi_add_weight_max;
+	}
 	napi->weight = weight;
 	list_add(&napi->dev_list, &dev->napi_list);
 	napi->dev = dev;
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index cf9cd13..c90e524 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -257,6 +257,13 @@ static struct ctl_table net_core_table[] = {
 		.proc_handler	= proc_dointvec
 	},
 	{
+		.procname	= "napi_add_weight_max",
+		.data		= &sysctl_napi_add_weight_max,
+		.maxlen		= sizeof(int),
+		.mode		= 0644,
+		.proc_handler	= proc_dointvec
+	},
+	{
 		.procname	= "netdev_max_backlog",
 		.data		= &netdev_max_backlog,
 		.maxlen		= sizeof(int),
^ permalink raw reply related	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-06 16:25 am335x: cpsw: phy ignores max-speed setting Yegor Yefremov
  2014-11-06 16:51 ` Dave Taht
  2014-11-06 16:58 ` Florian Fainelli
@ 2014-11-06 19:20 ` Lennart Sorensen
  2 siblings, 0 replies; 10+ messages in thread
From: Lennart Sorensen @ 2014-11-06 19:20 UTC (permalink / raw)
  To: Yegor Yefremov; +Cc: netdev, N, Mugunthan V, mpa, Daniel Mack
On Thu, Nov 06, 2014 at 05:25:13PM +0100, Yegor Yefremov wrote:
> I' m trying to override max-speed setting for both CPSW connected
> PHYs. This is my DTS section for configuring CPSW:
> 
> &mac {
>         pinctrl-names = "default", "sleep";
>         pinctrl-0 = <&cpsw_default>;
>         pinctrl-1 = <&cpsw_sleep>;
>         dual_emac = <1>;
> 
>         status = "okay";
> };
> 
> &davinci_mdio {
>         pinctrl-names = "default", "sleep";
>         pinctrl-0 = <&davinci_mdio_default>;
>         pinctrl-1 = <&davinci_mdio_sleep>;
> 
>         status = "okay";
> };
> 
> &cpsw_emac0 {
>         phy_id = <&davinci_mdio>, <0>;
>         phy-mode = "rgmii-id";
>         dual_emac_res_vlan = <1>;
>         max-speed = <100>;
> };
> 
> &cpsw_emac1 {
>         phy_id = <&davinci_mdio>, <1>;
>         phy-mode = "rgmii-id";
>         dual_emac_res_vlan = <2>;
>         max-speed = <100>;
> };
> 
> But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
> don't get through node check, i.e. node == NULL. Any idea why?
> 
> static void of_set_phy_supported(struct phy_device *phydev)
> {
>         struct device_node *node = phydev->dev.of_node;
>         u32 max_speed;
Did you try adding a printk here to make sure it is actually called?
>         if (!IS_ENABLED(CONFIG_OF_MDIO))
>                 return;
Do you have CONFIG_OF_MDIO on?  I would think so.
>         if (!node)
>                 return;
> 
>         if (!of_property_read_u32(node, "max-speed", &max_speed)) {
>                 /* The default values for phydev->supported are
> provided by the PHY
>                  * driver "features" member, we want to reset to sane
> defaults fist
>                  * before supporting higher speeds.
>                  */
>                 phydev->supported &= PHY_DEFAULT_FEATURES;
> 
>                 switch (max_speed) {
>                 default:
>                         return;
> 
>                 case SPEED_1000:
>                         phydev->supported |= PHY_1000BT_FEATURES;
>                 case SPEED_100:
>                         phydev->supported |= PHY_100BT_FEATURES;
>                 case SPEED_10:
>                         phydev->supported |= PHY_10BT_FEATURES;
>                 }
>         }
> }
-- 
Len Sorensen
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-06 16:58 ` Florian Fainelli
@ 2014-11-07  7:11   ` Yegor Yefremov
  2014-11-07 16:11     ` Mugunthan V N
  0 siblings, 1 reply; 10+ messages in thread
From: Yegor Yefremov @ 2014-11-07  7:11 UTC (permalink / raw)
  To: Florian Fainelli; +Cc: netdev, N, Mugunthan V, mpa, lsorense, Daniel Mack
On Thu, Nov 6, 2014 at 5:58 PM, Florian Fainelli <f.fainelli@gmail.com> wrote:
> On 11/06/2014 08:25 AM, Yegor Yefremov wrote:
>> I' m trying to override max-speed setting for both CPSW connected
>> PHYs. This is my DTS section for configuring CPSW:
>>
>> &mac {
>>         pinctrl-names = "default", "sleep";
>>         pinctrl-0 = <&cpsw_default>;
>>         pinctrl-1 = <&cpsw_sleep>;
>>         dual_emac = <1>;
>>
>>         status = "okay";
>> };
>>
>> &davinci_mdio {
>>         pinctrl-names = "default", "sleep";
>>         pinctrl-0 = <&davinci_mdio_default>;
>>         pinctrl-1 = <&davinci_mdio_sleep>;
>>
>>         status = "okay";
>> };
>>
>> &cpsw_emac0 {
>>         phy_id = <&davinci_mdio>, <0>;
>>         phy-mode = "rgmii-id";
>>         dual_emac_res_vlan = <1>;
>>         max-speed = <100>;
>> };
>>
>> &cpsw_emac1 {
>>         phy_id = <&davinci_mdio>, <1>;
>>         phy-mode = "rgmii-id";
>>         dual_emac_res_vlan = <2>;
>>         max-speed = <100>;
>> };
>>
>> But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
>> don't get through node check, i.e. node == NULL. Any idea why?
>
> Yes, because the 'max-speed' property is placed at the Ethernet MAC node
> level, not the PHY node as of_set_phy_supported() expect its.
>
> This driver does not appear to use the standard Ethernet PHY device tree
> node, so I am not sure what are your options here.
The SoC has a complex structure, i.e. Ethernet controller has a switch
inside with two slaves.
A workaround would be perhaps to handle this option in cpsw driver.
Mugunthan, what do you think about this?
>> static void of_set_phy_supported(struct phy_device *phydev)
>> {
>>         struct device_node *node = phydev->dev.of_node;
>>         u32 max_speed;
>>
>>         if (!IS_ENABLED(CONFIG_OF_MDIO))
>>                 return;
>>
>>         if (!node)
>>                 return;
>>
>>         if (!of_property_read_u32(node, "max-speed", &max_speed)) {
>>                 /* The default values for phydev->supported are
>> provided by the PHY
>>                  * driver "features" member, we want to reset to sane
>> defaults fist
>>                  * before supporting higher speeds.
>>                  */
>>                 phydev->supported &= PHY_DEFAULT_FEATURES;
>>
>>                 switch (max_speed) {
>>                 default:
>>                         return;
>>
>>                 case SPEED_1000:
>>                         phydev->supported |= PHY_1000BT_FEATURES;
>>                 case SPEED_100:
>>                         phydev->supported |= PHY_100BT_FEATURES;
>>                 case SPEED_10:
>>                         phydev->supported |= PHY_10BT_FEATURES;
>>                 }
>>         }
>> }
>>
>> Yegor
>> --
>> To unsubscribe from this list: send the line "unsubscribe netdev" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-07  7:11   ` Yegor Yefremov
@ 2014-11-07 16:11     ` Mugunthan V N
  2014-11-07 16:27       ` Yegor Yefremov
  0 siblings, 1 reply; 10+ messages in thread
From: Mugunthan V N @ 2014-11-07 16:11 UTC (permalink / raw)
  To: Yegor Yefremov, Florian Fainelli; +Cc: netdev, mpa, lsorense, Daniel Mack
On Friday 07 November 2014 12:41 PM, Yegor Yefremov wrote:
> On Thu, Nov 6, 2014 at 5:58 PM, Florian Fainelli <f.fainelli@gmail.com> wrote:
>> On 11/06/2014 08:25 AM, Yegor Yefremov wrote:
>>> I' m trying to override max-speed setting for both CPSW connected
>>> PHYs. This is my DTS section for configuring CPSW:
>>>
>>> &mac {
>>>         pinctrl-names = "default", "sleep";
>>>         pinctrl-0 = <&cpsw_default>;
>>>         pinctrl-1 = <&cpsw_sleep>;
>>>         dual_emac = <1>;
>>>
>>>         status = "okay";
>>> };
>>>
>>> &davinci_mdio {
>>>         pinctrl-names = "default", "sleep";
>>>         pinctrl-0 = <&davinci_mdio_default>;
>>>         pinctrl-1 = <&davinci_mdio_sleep>;
>>>
>>>         status = "okay";
>>> };
>>>
>>> &cpsw_emac0 {
>>>         phy_id = <&davinci_mdio>, <0>;
>>>         phy-mode = "rgmii-id";
>>>         dual_emac_res_vlan = <1>;
>>>         max-speed = <100>;
>>> };
>>>
>>> &cpsw_emac1 {
>>>         phy_id = <&davinci_mdio>, <1>;
>>>         phy-mode = "rgmii-id";
>>>         dual_emac_res_vlan = <2>;
>>>         max-speed = <100>;
>>> };
>>>
>>> But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
>>> don't get through node check, i.e. node == NULL. Any idea why?
>>
>> Yes, because the 'max-speed' property is placed at the Ethernet MAC node
>> level, not the PHY node as of_set_phy_supported() expect its.
>>
>> This driver does not appear to use the standard Ethernet PHY device tree
>> node, so I am not sure what are your options here.
> 
> The SoC has a complex structure, i.e. Ethernet controller has a switch
> inside with two slaves.
> 
> A workaround would be perhaps to handle this option in cpsw driver.
> 
> Mugunthan, what do you think about this?
Yes, CPSW is different from what linux networking is designed for, it
has two ethernet slave and acts as a Layer 2 switch.
* If you need on a run time basis you can change the supported speed via
ethtool advertise interface
* If needed on boot for nfs then need to think of how it can be achieved
in cpsw driver. Will have a look and update this thread.
Regards
Mugunthan V N
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
  2014-11-07 16:11     ` Mugunthan V N
@ 2014-11-07 16:27       ` Yegor Yefremov
  0 siblings, 0 replies; 10+ messages in thread
From: Yegor Yefremov @ 2014-11-07 16:27 UTC (permalink / raw)
  To: Mugunthan V N; +Cc: Florian Fainelli, netdev, mpa, lsorense, Daniel Mack
On Fri, Nov 7, 2014 at 5:11 PM, Mugunthan V N <mugunthanvnm@ti.com> wrote:
> On Friday 07 November 2014 12:41 PM, Yegor Yefremov wrote:
>> On Thu, Nov 6, 2014 at 5:58 PM, Florian Fainelli <f.fainelli@gmail.com> wrote:
>>> On 11/06/2014 08:25 AM, Yegor Yefremov wrote:
>>>> I' m trying to override max-speed setting for both CPSW connected
>>>> PHYs. This is my DTS section for configuring CPSW:
>>>>
>>>> &mac {
>>>>         pinctrl-names = "default", "sleep";
>>>>         pinctrl-0 = <&cpsw_default>;
>>>>         pinctrl-1 = <&cpsw_sleep>;
>>>>         dual_emac = <1>;
>>>>
>>>>         status = "okay";
>>>> };
>>>>
>>>> &davinci_mdio {
>>>>         pinctrl-names = "default", "sleep";
>>>>         pinctrl-0 = <&davinci_mdio_default>;
>>>>         pinctrl-1 = <&davinci_mdio_sleep>;
>>>>
>>>>         status = "okay";
>>>> };
>>>>
>>>> &cpsw_emac0 {
>>>>         phy_id = <&davinci_mdio>, <0>;
>>>>         phy-mode = "rgmii-id";
>>>>         dual_emac_res_vlan = <1>;
>>>>         max-speed = <100>;
>>>> };
>>>>
>>>> &cpsw_emac1 {
>>>>         phy_id = <&davinci_mdio>, <1>;
>>>>         phy-mode = "rgmii-id";
>>>>         dual_emac_res_vlan = <2>;
>>>>         max-speed = <100>;
>>>> };
>>>>
>>>> But in drivers/net/phy/phy_device.c->of_set_phy_supported() routine I
>>>> don't get through node check, i.e. node == NULL. Any idea why?
>>>
>>> Yes, because the 'max-speed' property is placed at the Ethernet MAC node
>>> level, not the PHY node as of_set_phy_supported() expect its.
>>>
>>> This driver does not appear to use the standard Ethernet PHY device tree
>>> node, so I am not sure what are your options here.
>>
>> The SoC has a complex structure, i.e. Ethernet controller has a switch
>> inside with two slaves.
>>
>> A workaround would be perhaps to handle this option in cpsw driver.
>>
>> Mugunthan, what do you think about this?
>
> Yes, CPSW is different from what linux networking is designed for, it
> has two ethernet slave and acts as a Layer 2 switch.
>
> * If you need on a run time basis you can change the supported speed via
> ethtool advertise interface
> * If needed on boot for nfs then need to think of how it can be achieved
> in cpsw driver. Will have a look and update this thread.
ethtool is working, but requires a custom script, so DTS solution
would suite better.
Thanks.
Yegor
^ permalink raw reply	[flat|nested] 10+ messages in thread
* Re: am335x: cpsw: phy ignores max-speed setting
       [not found]     ` <CAA93jw7PTOGdYrmFGSY5zat=MpVsdmESVwpK_tVO=sLeDSWpRA@mail.gmail.com>
@ 2014-11-11 19:08       ` Joe Perches
  0 siblings, 0 replies; 10+ messages in thread
From: Joe Perches @ 2014-11-11 19:08 UTC (permalink / raw)
  To: Dave Taht
  Cc: Mugunthan N V, mpa, lsorense, Yegor Yefremov, Daniel Mack, netdev
On Tue, 2014-11-11 at 10:44 -0800, Dave Taht wrote:
> On Nov 6, 2014 11:19 AM, "Joe Perches" <joe@perches.com> wrote:
[]
> > Is this the change that matters most?
> >
> > -#define CPSW_POLL_WEIGHT       64
> > +#define CPSW_POLL_WEIGHT       16
[]
> > If so, maybe this could be limited by a sysctl:
[]
> I'd like autotuning for the underlying rate somehow....
That might be difficult to achieve with variable rates.
^ permalink raw reply	[flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-11-11 19:08 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-06 16:25 am335x: cpsw: phy ignores max-speed setting Yegor Yefremov
2014-11-06 16:51 ` Dave Taht
2014-11-06 17:28   ` Eric Dumazet
2014-11-06 19:19   ` Joe Perches
     [not found]     ` <CAA93jw7PTOGdYrmFGSY5zat=MpVsdmESVwpK_tVO=sLeDSWpRA@mail.gmail.com>
2014-11-11 19:08       ` Joe Perches
2014-11-06 16:58 ` Florian Fainelli
2014-11-07  7:11   ` Yegor Yefremov
2014-11-07 16:11     ` Mugunthan V N
2014-11-07 16:27       ` Yegor Yefremov
2014-11-06 19:20 ` Lennart Sorensen
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).