Skip to contentSkip to conversation

driver:net:stmmac: Disable DMA store and forward mode if platform data force_thresh_dma_mode is set.

PATCH Superseded Sonic Zhang 2 participants 4 messages Aug 28, 2013

Subsystems (6)

v3 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 driver:net:stmmac: Disable DMA store and forward mode if platform data force_thresh_dma_mode is set.

From: Sonic Zhang <[email protected]>

Some synopsys ip implementation doesn't support DMA store and forward mode, such as BF60x. So, set force_thresh_dma_mode to use DMA thresholds only. Update document and devicetree as well.

---
 Documentation/devicetree/bindings/net/stmmac.txt      | 2 ++
 Documentation/networking/stmmac.txt                   | 3 +++
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 +++-
 drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 3 +++
 include/linux/stmmac.h                                | 1 +
 5 files changed, 12 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/net/stmmac.txt +2 -0
index 261c563..56fbcb5 100644
@@ -22,6 +22,8 @@ Required properties:
 - snps,pbl		Programmable Burst Length
 - snps,fixed-burst	Program the DMA to use the fixed burst mode
 - snps,mixed-burst	Program the DMA to use the mixed burst mode
+- snps,force_thresh_dma_mode	Force DMA to use the Shreshold mode other than
+				the Store and Forward mode.
 
 Optional properties:
 - mac-address: 6 bytes, mac address
Documentation/networking/stmmac.txt +3 -0
index 654d2e5..457b8bb 100644
@@ -123,6 +123,7 @@ struct plat_stmmacenet_data {
 	int bugged_jumbo;
 	int pmt;
 	int force_sf_dma_mode;
+	int force_thresh_dma_mode;
 	int riwt_off;
 	void (*fix_mac_speed)(void *priv, unsigned int speed);
 	void (*bus_setup)(void __iomem *ioaddr);
@@ -159,6 +160,8 @@ Where:
  o pmt: core has the embedded power module (optional).
  o force_sf_dma_mode: force DMA to use the Store and Forward mode
 		     instead of the Threshold.
+ o force_thresh_dma_mode: force DMA to use the Shreshold mode other than
+		     the Store and Forward mode.
  o riwt_off: force to disable the RX watchdog feature and switch to NAPI mode.
  o fix_mac_speed: this callback is used for modifying some syscfg registers
 		 (on ST SoCs) according to the link speed negotiated by the
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -1
index be40691..8d4ccd3 100644
@@ -1224,7 +1224,9 @@ static void free_dma_desc_resources(struct stmmac_priv *priv)
  */
 static void stmmac_dma_operation_mode(struct stmmac_priv *priv)
 {
-	if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
+	if (priv->plat->force_thresh_dma_mode)
+		priv->hw->dma->dma_mode(priv->ioaddr, tc, tc);
+	else if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
 		/*
 		 * In case of GMAC, SF mode can be enabled
 		 * to perform the TX COE in HW. This depends on:
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +3 -0
index da8be6e..865c944 100644
@@ -79,6 +79,9 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
 	of_property_read_u32(np, "snps,pbl", &dma_cfg->pbl);
 	dma_cfg->fixed_burst = of_property_read_bool(np, "snps,fixed-burst");
 	dma_cfg->mixed_burst = of_property_read_bool(np, "snps,mixed-burst");
+	plat->force_thresh_dma_mode = of_property_read_bool(np, "snps,force_thresh_dma_mode");
+	if (plat->force_thresh_dma_mode)
+		plat->force_sf_dma_mode = 0;
 
 	return 0;
 }
include/linux/stmmac.h +1 -0
index 9e495d31..bb5deb0 100644
@@ -108,6 +108,7 @@ struct plat_stmmacenet_data {
 	int bugged_jumbo;
 	int pmt;
 	int force_sf_dma_mode;
+	int force_thresh_dma_mode;
 	int riwt_off;
 	void (*fix_mac_speed)(void *priv, unsigned int speed);
 	void (*bus_setup)(void __iomem *ioaddr);
Signature · 1 line
1.8.2.3
#1 lore raw

hello some comments below

Quoted 20 lines · Sonic Zhang

From: Sonic Zhang <[email protected]>

Some synopsys ip implementation doesn't support DMA store and forward mode, such as BF60x. So, set force_thresh_dma_mode to use DMA thresholds only. Update document and devicetree as well.

---
  Documentation/devicetree/bindings/net/stmmac.txt      | 2 ++
  Documentation/networking/stmmac.txt                   | 3 +++
  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 +++-
  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 3 +++
  include/linux/stmmac.h                                | 1 +
  5 files changed, 12 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/net/stmmac.txt +0 -0
index 261c563..56fbcb5 100644

Documentation/devicetree/bindings/net/stmmac.txt Required properties: · line 25

Quoted 4 lines
Documentation/devicetree/bindings/net/stmmac.txt +1 -0
@@ -22,6 +22,8 @@ Required properties:
  - snps,pbl		Programmable Burst Length
  - snps,fixed-burst	Program the DMA to use the fixed burst mode
  - snps,mixed-burst	Program the DMA to use the mixed burst mode
+- snps,force_thresh_dma_mode	Force DMA to use the Shreshold mode other than
                                                     ^^^^^^^^^ typo

Documentation/devicetree/bindings/net/stmmac.txt Required properties: · line 26

Quoted 1 line
Documentation/devicetree/bindings/net/stmmac.txt +1 -0
+				the Store and Forward mode.

if we use this approach you should document that the force_thresh_dma_mode and force_sf_dma_mode will force the mode for both tx and rx.

I am wondering now what happens if these are passed together from the platform? is your code covering this scenario?

we could have a unique force_dma_mode that can be:

rx_force_threshold
tx_force_threshold
rx_force_sf
tx_force_sf
( these can be defined in the stmmac.h platform header )

but this an impact on all the platforms that already use the force_sf_dma_mode as we said

In this case you should fix this and maybe the patch should be for net-next (add it in the subject next time).

Quoted 66 lines
Documentation/devicetree/bindings/net/stmmac.txt +0 -0
  Optional properties:
  - mac-address: 6 bytes, mac address
Documentation/networking/stmmac.txt +3 -0
index 654d2e5..457b8bb 100644
@@ -123,6 +123,7 @@ struct plat_stmmacenet_data {
  	int bugged_jumbo;
  	int pmt;
  	int force_sf_dma_mode;
+	int force_thresh_dma_mode;
  	int riwt_off;
  	void (*fix_mac_speed)(void *priv, unsigned int speed);
  	void (*bus_setup)(void __iomem *ioaddr);
@@ -159,6 +160,8 @@ Where:
   o pmt: core has the embedded power module (optional).
   o force_sf_dma_mode: force DMA to use the Store and Forward mode
  		     instead of the Threshold.
+ o force_thresh_dma_mode: force DMA to use the Shreshold mode other than
+		     the Store and Forward mode.
   o riwt_off: force to disable the RX watchdog feature and switch to NAPI mode.
   o fix_mac_speed: this callback is used for modifying some syscfg registers
  		 (on ST SoCs) according to the link speed negotiated by the
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -1
index be40691..8d4ccd3 100644
@@ -1224,7 +1224,9 @@ static void free_dma_desc_resources(struct stmmac_priv *priv)
   */
  static void stmmac_dma_operation_mode(struct stmmac_priv *priv)
  {
-	if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
+	if (priv->plat->force_thresh_dma_mode)
+		priv->hw->dma->dma_mode(priv->ioaddr, tc, tc);
+	else if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
  		/*
  		 * In case of GMAC, SF mode can be enabled
  		 * to perform the TX COE in HW. This depends on:
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +3 -0
index da8be6e..865c944 100644
@@ -79,6 +79,9 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
  	of_property_read_u32(np, "snps,pbl", &dma_cfg->pbl);
  	dma_cfg->fixed_burst = of_property_read_bool(np, "snps,fixed-burst");
  	dma_cfg->mixed_burst = of_property_read_bool(np, "snps,mixed-burst");
+	plat->force_thresh_dma_mode = of_property_read_bool(np, "snps,force_thresh_dma_mode");
+	if (plat->force_thresh_dma_mode)
+		plat->force_sf_dma_mode = 0;
 
  	return 0;
  }
include/linux/stmmac.h +1 -0
index 9e495d31..bb5deb0 100644
@@ -108,6 +108,7 @@ struct plat_stmmacenet_data {
  	int bugged_jumbo;
  	int pmt;
  	int force_sf_dma_mode;
+	int force_thresh_dma_mode;
  	int riwt_off;
  	void (*fix_mac_speed)(void *priv, unsigned int speed);
  	void (*bus_setup)(void __iomem *ioaddr);
#2 lore raw
In reply to Sonic Zhang

hello some comments below

Quoted 20 lines · Sonic Zhang

From: Sonic Zhang <[email protected]>

Some synopsys ip implementation doesn't support DMA store and forward mode, such as BF60x. So, set force_thresh_dma_mode to use DMA thresholds only. Update document and devicetree as well.

---
  Documentation/devicetree/bindings/net/stmmac.txt      | 2 ++
  Documentation/networking/stmmac.txt                   | 3 +++
  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 +++-
  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 3 +++
  include/linux/stmmac.h                                | 1 +
  5 files changed, 12 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/net/stmmac.txt +0 -0
index 261c563..56fbcb5 100644

Documentation/devicetree/bindings/net/stmmac.txt Required properties: · line 25

Quoted 4 lines
Documentation/devicetree/bindings/net/stmmac.txt +1 -0
@@ -22,6 +22,8 @@ Required properties:
  - snps,pbl		Programmable Burst Length
  - snps,fixed-burst	Program the DMA to use the fixed burst mode
  - snps,mixed-burst	Program the DMA to use the mixed burst mode
+- snps,force_thresh_dma_mode	Force DMA to use the Shreshold mode other than
                                                     ^^^^^^^^^ typo

Documentation/devicetree/bindings/net/stmmac.txt Required properties: · line 26

Quoted 1 line
Documentation/devicetree/bindings/net/stmmac.txt +1 -0
+				the Store and Forward mode.

if we use this approach you should document that the force_thresh_dma_mode and force_sf_dma_mode will force the mode for both tx and rx.

I am wondering now what happens if these are passed together from the platform? is your code covering this scenario?

we could have a unique force_dma_mode that can be:

rx_force_threshold
tx_force_threshold
rx_force_sf
tx_force_sf
( these can be defined in the stmmac.h platform header )

but this an impact on all the platforms that already use the force_sf_dma_mode as we said

In this case you should fix this and maybe the patch should be for net-next (add it in the subject next time).

peppe

Quoted 66 lines
Documentation/devicetree/bindings/net/stmmac.txt +0 -0
  Optional properties:
  - mac-address: 6 bytes, mac address
Documentation/networking/stmmac.txt +3 -0
index 654d2e5..457b8bb 100644
@@ -123,6 +123,7 @@ struct plat_stmmacenet_data {
  	int bugged_jumbo;
  	int pmt;
  	int force_sf_dma_mode;
+	int force_thresh_dma_mode;
  	int riwt_off;
  	void (*fix_mac_speed)(void *priv, unsigned int speed);
  	void (*bus_setup)(void __iomem *ioaddr);
@@ -159,6 +160,8 @@ Where:
   o pmt: core has the embedded power module (optional).
   o force_sf_dma_mode: force DMA to use the Store and Forward mode
  		     instead of the Threshold.
+ o force_thresh_dma_mode: force DMA to use the Shreshold mode other than
+		     the Store and Forward mode.
   o riwt_off: force to disable the RX watchdog feature and switch to NAPI mode.
   o fix_mac_speed: this callback is used for modifying some syscfg registers
  		 (on ST SoCs) according to the link speed negotiated by the
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -1
index be40691..8d4ccd3 100644
@@ -1224,7 +1224,9 @@ static void free_dma_desc_resources(struct stmmac_priv *priv)
   */
  static void stmmac_dma_operation_mode(struct stmmac_priv *priv)
  {
-	if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
+	if (priv->plat->force_thresh_dma_mode)
+		priv->hw->dma->dma_mode(priv->ioaddr, tc, tc);
+	else if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
  		/*
  		 * In case of GMAC, SF mode can be enabled
  		 * to perform the TX COE in HW. This depends on:
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +3 -0
index da8be6e..865c944 100644
@@ -79,6 +79,9 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
  	of_property_read_u32(np, "snps,pbl", &dma_cfg->pbl);
  	dma_cfg->fixed_burst = of_property_read_bool(np, "snps,fixed-burst");
  	dma_cfg->mixed_burst = of_property_read_bool(np, "snps,mixed-burst");
+	plat->force_thresh_dma_mode = of_property_read_bool(np, "snps,force_thresh_dma_mode");
+	if (plat->force_thresh_dma_mode)
+		plat->force_sf_dma_mode = 0;
 
  	return 0;
  }
include/linux/stmmac.h +1 -0
index 9e495d31..bb5deb0 100644
@@ -108,6 +108,7 @@ struct plat_stmmacenet_data {
  	int bugged_jumbo;
  	int pmt;
  	int force_sf_dma_mode;
+	int force_thresh_dma_mode;
  	int riwt_off;
  	void (*fix_mac_speed)(void *priv, unsigned int speed);
  	void (*bus_setup)(void __iomem *ioaddr);
#3 lore raw

Hi Peppe,

Quoted 37 lines · Giuseppe CAVALLARO

hello some comments below

Quoted 27 lines · Sonic Zhang

From: Sonic Zhang <[email protected]>

Some synopsys ip implementation doesn't support DMA store and forward mode,
such as BF60x. So, set force_thresh_dma_mode to use DMA thresholds only. Update document and devicetree as well.

---
  Documentation/devicetree/bindings/net/stmmac.txt      | 2 ++
  Documentation/networking/stmmac.txt                   | 3 +++
  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 +++-
  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 3 +++
  include/linux/stmmac.h                                | 1 +
  5 files changed, 12 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/net/stmmac.txt +1 -0
index 261c563..56fbcb5 100644
@@ -22,6 +22,8 @@ Required properties:
  - snps,pbl            Programmable Burst Length
  - snps,fixed-burst    Program the DMA to use the fixed burst mode
  - snps,mixed-burst    Program the DMA to use the mixed burst mode
+- snps,force_thresh_dma_mode   Force DMA to use the Shreshold mode other
Quoted 1 line

than

                                                     ^^^^^^^^^ typo
Quoted 5 lines
Quoted 1 line

+ the Store and Forward mode.

if we use this approach you should document that the force_thresh_dma_mode and force_sf_dma_mode will force the mode for both tx and rx.

OK

Quoted 3 lines

I am wondering now what happens if these are passed together from the platform? is your code covering this scenario?

Yes, in case both are set, I unset flag force_sf_dma_mode. So, only force_thresh_dma_mode takes effect.

Quoted 11 lines

we could have a unique force_dma_mode that can be:

rx_force_threshold
tx_force_threshold
rx_force_sf
tx_force_sf
( these can be defined in the stmmac.h platform header )

but this an impact on all the platforms that already use the force_sf_dma_mode as we said

So, I prefer current 2-flag solution.

Quoted 3 lines

In this case you should fix this and maybe the patch should be for net-next (add it in the subject next time).

I will add "for net-next" to the subject.

Quoted 82 lines

peppe

Quoted 77 lines

Optional properties:
- mac-address: 6 bytes, mac address

Documentation/networking/stmmac.txt +3 -0
index 654d2e5..457b8bb 100644
@@ -123,6 +123,7 @@ struct plat_stmmacenet_data {
        int bugged_jumbo;
        int pmt;
        int force_sf_dma_mode;
+       int force_thresh_dma_mode;
        int riwt_off;
        void (*fix_mac_speed)(void *priv, unsigned int speed);
        void (*bus_setup)(void __iomem *ioaddr);
@@ -159,6 +160,8 @@ Where:
   o pmt: core has the embedded power module (optional).
   o force_sf_dma_mode: force DMA to use the Store and Forward mode
                     instead of the Threshold.
+ o force_thresh_dma_mode: force DMA to use the Shreshold mode other than
+                    the Store and Forward mode.
   o riwt_off: force to disable the RX watchdog feature and switch to NAPI

mode.
o fix_mac_speed: this callback is used for modifying some syscfg
registers
(on ST SoCs) according to the link speed negotiated by
the

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -1
index be40691..8d4ccd3 100644
@@ -1224,7 +1224,9 @@ static void free_dma_desc_resources(struct
 stmmac_priv *priv)
   */
  static void stmmac_dma_operation_mode(struct stmmac_priv *priv)
  {
-       if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
+       if (priv->plat->force_thresh_dma_mode)
+               priv->hw->dma->dma_mode(priv->ioaddr, tc, tc);
+       else if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
                /*
                 * In case of GMAC, SF mode can be enabled

* to perform the TX COE in HW. This depends on:

drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +1 -0
index da8be6e..865c944 100644
@@ -79,6 +79,9 @@ static int stmmac_probe_config_dt(struct platform_device
 *pdev,
        of_property_read_u32(np, "snps,pbl", &dma_cfg->pbl);
        dma_cfg->fixed_burst = of_property_read_bool(np,
 "snps,fixed-burst");
        dma_cfg->mixed_burst = of_property_read_bool(np,
 "snps,mixed-burst");
+       plat->force_thresh_dma_mode = of_property_read_bool(np,

"snps,force_thresh_dma_mode");

drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +2 -0
+       if (plat->force_thresh_dma_mode)
+               plat->force_sf_dma_mode = 0;
 
        return 0;
  }
include/linux/stmmac.h +1 -0
index 9e495d31..bb5deb0 100644
@@ -108,6 +108,7 @@ struct plat_stmmacenet_data {
        int bugged_jumbo;
        int pmt;
        int force_sf_dma_mode;
+       int force_thresh_dma_mode;
        int riwt_off;
        void (*fix_mac_speed)(void *priv, unsigned int speed);
        void (*bus_setup)(void __iomem *ioaddr);