Commit 2882b06d authored by David S. Miller's avatar David S. Miller

Merge branch 'ravb-Duplex-handling-update-V3'

Magnus Damm says:

====================
ravb: Duplex handling update V3

[PATCH v3 01/02] ravb: Do not announce HDX as supported
[PATCH v3 02/02] ravb: Clean up duplex handling

This series is V3 of duplex handling improvements for the Ethernet-AVB driver.

Previous versions of this series have been posted to linux-renesas-soc as RFC
so V3 is the first actual version to make it to netdev.

Based on the latest data sheet for R-Car Gen3 [1] and R-Car Gen2 [2]
the following information is part of the EthernetAVB-IF overview page:

Transfer speed: Supports transfer at 100 and 1000 Mbps
Mode: Full-duplex mode

It seems that the driver implementation is not matching the information
provided in the friendly data sheet, and on top of this during run-time
when changing PHY configuration of the link partner the Ethernet-AVB PHY
seems to want to announce unsupported modes.

[1] R-Car Series, 3rd Generation Rev.1.00 (Apr 2018)
[2] R-Car Series, 2nd Generation Rev.2.00 (Feb 2016)

Changes since V2:
- Updated patch 1/2 to make use of phy_remove_link_mode()
- Added Reviewed-by from Sergei - thanks!

Changes since V1:
- Updated patches to reflect input from Sergei and Geert - thanks!
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 02d805dc 08b43857
...@@ -1032,7 +1032,6 @@ struct ravb_private { ...@@ -1032,7 +1032,6 @@ struct ravb_private {
phy_interface_t phy_interface; phy_interface_t phy_interface;
int msg_enable; int msg_enable;
int speed; int speed;
int duplex;
int emac_irq; int emac_irq;
enum ravb_chip_id chip_id; enum ravb_chip_id chip_id;
int rx_irqs[NUM_RX_QUEUE]; int rx_irqs[NUM_RX_QUEUE];
......
...@@ -82,13 +82,6 @@ static int ravb_config(struct net_device *ndev) ...@@ -82,13 +82,6 @@ static int ravb_config(struct net_device *ndev)
return error; return error;
} }
static void ravb_set_duplex(struct net_device *ndev)
{
struct ravb_private *priv = netdev_priv(ndev);
ravb_modify(ndev, ECMR, ECMR_DM, priv->duplex ? ECMR_DM : 0);
}
static void ravb_set_rate(struct net_device *ndev) static void ravb_set_rate(struct net_device *ndev)
{ {
struct ravb_private *priv = netdev_priv(ndev); struct ravb_private *priv = netdev_priv(ndev);
...@@ -406,13 +399,11 @@ static int ravb_ring_init(struct net_device *ndev, int q) ...@@ -406,13 +399,11 @@ static int ravb_ring_init(struct net_device *ndev, int q)
/* E-MAC init function */ /* E-MAC init function */
static void ravb_emac_init(struct net_device *ndev) static void ravb_emac_init(struct net_device *ndev)
{ {
struct ravb_private *priv = netdev_priv(ndev);
/* Receive frame limit set register */ /* Receive frame limit set register */
ravb_write(ndev, ndev->mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN, RFLR); ravb_write(ndev, ndev->mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN, RFLR);
/* EMAC Mode: PAUSE prohibition; Duplex; RX Checksum; TX; RX */ /* EMAC Mode: PAUSE prohibition; Duplex; RX Checksum; TX; RX */
ravb_write(ndev, ECMR_ZPF | (priv->duplex ? ECMR_DM : 0) | ravb_write(ndev, ECMR_ZPF | ECMR_DM |
(ndev->features & NETIF_F_RXCSUM ? ECMR_RCSC : 0) | (ndev->features & NETIF_F_RXCSUM ? ECMR_RCSC : 0) |
ECMR_TE | ECMR_RE, ECMR); ECMR_TE | ECMR_RE, ECMR);
...@@ -995,12 +986,6 @@ static void ravb_adjust_link(struct net_device *ndev) ...@@ -995,12 +986,6 @@ static void ravb_adjust_link(struct net_device *ndev)
ravb_rcv_snd_disable(ndev); ravb_rcv_snd_disable(ndev);
if (phydev->link) { if (phydev->link) {
if (phydev->duplex != priv->duplex) {
new_state = true;
priv->duplex = phydev->duplex;
ravb_set_duplex(ndev);
}
if (phydev->speed != priv->speed) { if (phydev->speed != priv->speed) {
new_state = true; new_state = true;
priv->speed = phydev->speed; priv->speed = phydev->speed;
...@@ -1015,7 +1000,6 @@ static void ravb_adjust_link(struct net_device *ndev) ...@@ -1015,7 +1000,6 @@ static void ravb_adjust_link(struct net_device *ndev)
new_state = true; new_state = true;
priv->link = 0; priv->link = 0;
priv->speed = 0; priv->speed = 0;
priv->duplex = -1;
} }
/* Enable TX and RX right over here, if E-MAC change is ignored */ /* Enable TX and RX right over here, if E-MAC change is ignored */
...@@ -1045,7 +1029,6 @@ static int ravb_phy_init(struct net_device *ndev) ...@@ -1045,7 +1029,6 @@ static int ravb_phy_init(struct net_device *ndev)
priv->link = 0; priv->link = 0;
priv->speed = 0; priv->speed = 0;
priv->duplex = -1;
/* Try connecting to PHY */ /* Try connecting to PHY */
pn = of_parse_phandle(np, "phy-handle", 0); pn = of_parse_phandle(np, "phy-handle", 0);
...@@ -1088,6 +1071,10 @@ static int ravb_phy_init(struct net_device *ndev) ...@@ -1088,6 +1071,10 @@ static int ravb_phy_init(struct net_device *ndev)
phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Pause_BIT); phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Pause_BIT);
phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Asym_Pause_BIT); phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_Asym_Pause_BIT);
/* Half Duplex is not supported */
phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
phy_remove_link_mode(phydev, ETHTOOL_LINK_MODE_100baseT_Half_BIT);
phy_attached_info(phydev); phy_attached_info(phydev);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment