[v1,net-next] stmmac: fix DMA channel hang in half-duplex mode

Message ID 1528864248-2246-1-git-send-email-vbhadram@nvidia.com
State Deferred
Delegated to: David Miller
Headers show
Series
  • [v1,net-next] stmmac: fix DMA channel hang in half-duplex mode
Related show

Commit Message

Bhadram Varka June 13, 2018, 4:30 a.m.
HW does not support Half-duplex mode in multi-queue
scenario. Fix it by not advertising the Half-Duplex
mode if multi-queue enabled.

Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

David Miller June 15, 2018, 12:06 a.m. | #1
From: Bhadram Varka <vbhadram@nvidia.com>
Date: Wed, 13 Jun 2018 10:00:48 +0530

> HW does not support Half-duplex mode in multi-queue
> scenario. Fix it by not advertising the Half-Duplex
> mode if multi-queue enabled.
> 
> Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>

Bug fixes should be submitted against net, not net-next.  And
net-next is closed for submissions at this time.

Thanks.
Bhadram Varka June 15, 2018, 3:32 p.m. | #2
Hi,

On 6/15/2018 5:36 AM, David Miller wrote:
> From: Bhadram Varka <vbhadram@nvidia.com>
> Date: Wed, 13 Jun 2018 10:00:48 +0530
>
>> HW does not support Half-duplex mode in multi-queue
>> scenario. Fix it by not advertising the Half-Duplex
>> mode if multi-queue enabled.
>>
>> Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>
> Bug fixes should be submitted against net, not net-next.  And
> net-next is closed for submissions at this time.
>
> Thanks.
Thanks David. Will submit patch against net.

Jose/Alexander/Peppe,
Please review this patch. Will submit patch to net if there is no concerns.

Thanks!

Patch

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 11fb7c7..07e748c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -928,6 +928,7 @@  static void stmmac_check_pcs_mode(struct stmmac_priv *priv)
 static int stmmac_init_phy(struct net_device *dev)
 {
 	struct stmmac_priv *priv = netdev_priv(dev);
+	u32 tx_cnt = priv->plat->tx_queues_to_use;
 	struct phy_device *phydev;
 	char phy_id_fmt[MII_BUS_ID_SIZE + 3];
 	char bus_id[MII_BUS_ID_SIZE];
@@ -969,6 +970,15 @@  static int stmmac_init_phy(struct net_device *dev)
 					 SUPPORTED_1000baseT_Full);
 
 	/*
+	 * Half-duplex mode not supported with multiqueue
+	 * half-duplex can only works with single queue
+	 */
+	if (tx_cnt > 1)
+		phydev->supported &= ~(SUPPORTED_1000baseT_Half |
+				       SUPPORTED_100baseT_Half |
+				       SUPPORTED_10baseT_Half);
+
+	/*
 	 * Broken HW is sometimes missing the pull-up resistor on the
 	 * MDIO line, which results in reads to non-existent devices returning
 	 * 0 rather than 0xffff. Catch this here and treat 0 as a non-existent