* [PATCH 2/6] pch_gbe: Add module parameter for RGMII/GMII PHY mode selection
2014-05-26 13:40 [PATCH 1/6] pch_gbe: print invalid MAC address during probe Alexander Stein
@ 2014-05-26 13:40 ` Alexander Stein
2014-05-26 13:40 ` [PATCH 3/6] pch_gbe: change order of PHY address discovering Alexander Stein
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Alexander Stein @ 2014-05-26 13:40 UTC (permalink / raw)
To: David S. Miller; +Cc: Alexander Stein, netdev, Daniel Krueger
The mode register has to be set even in GMII mode. Otherwise the 125 MHz
RXCLK is not detected after MAC reset.
Signed-off-by: Daniel Krueger <daniel.krueger@systec-electronic.com>
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h | 1 +
.../net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c | 6 +--
.../net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 47 ++++++++++++----------
.../net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h | 1 -
4 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h
index 2a55d6d..956dc68 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h
@@ -390,6 +390,7 @@ struct pch_gbe_phy_info {
u32 revision;
u32 reset_delay_us;
u16 autoneg_advertised;
+ bool is_rgmii;
};
/*!
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c
index 5125036..c97e738 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_api.c
@@ -77,9 +77,9 @@ static s32 pch_gbe_plat_init_hw(struct pch_gbe_hw *hw)
}
pch_gbe_phy_init_setting(hw);
/* Setup Mac interface option RGMII */
-#ifdef PCH_GBE_MAC_IFOP_RGMII
- pch_gbe_phy_set_rgmii(hw);
-#endif
+ if (hw->phy.is_rgmii)
+ pch_gbe_phy_set_rgmii(hw);
+
return ret_val;
}
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
index 42fa431..693ee50 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
@@ -114,6 +114,7 @@ const char pch_driver_version[] = DRV_VERSION;
#define MINNOW_PHY_RESET_GPIO 13
static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT;
+static bool is_rgmii __read_mostly = 1;
static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
@@ -369,9 +370,7 @@ static void pch_gbe_mac_reset_hw(struct pch_gbe_hw *hw)
/* Read the MAC address. and store to the private data */
pch_gbe_mac_read_mac_addr(hw);
iowrite32(PCH_GBE_ALL_RST, &hw->reg->RESET);
-#ifdef PCH_GBE_MAC_IFOP_RGMII
iowrite32(PCH_GBE_MODE_GMII_ETHER, &hw->reg->MODE);
-#endif
pch_gbe_wait_clr_bit(&hw->reg->RESET, PCH_GBE_ALL_RST);
/* Setup the receive addresses */
pch_gbe_mac_mar_set(hw, hw->mac.addr, 0);
@@ -1039,26 +1038,26 @@ static void pch_gbe_set_rgmii_ctrl(struct pch_gbe_adapter *adapter, u16 speed,
unsigned long rgmii = 0;
/* Set the RGMII control. */
-#ifdef PCH_GBE_MAC_IFOP_RGMII
- switch (speed) {
- case SPEED_10:
- rgmii = (PCH_GBE_RGMII_RATE_2_5M |
- PCH_GBE_MAC_RGMII_CTRL_SETTING);
- break;
- case SPEED_100:
- rgmii = (PCH_GBE_RGMII_RATE_25M |
- PCH_GBE_MAC_RGMII_CTRL_SETTING);
- break;
- case SPEED_1000:
- rgmii = (PCH_GBE_RGMII_RATE_125M |
- PCH_GBE_MAC_RGMII_CTRL_SETTING);
- break;
- }
- iowrite32(rgmii, &hw->reg->RGMII_CTRL);
-#else /* GMII */
- rgmii = 0;
+ if (hw->phy.is_rgmii) {
+ switch (speed) {
+ case SPEED_10:
+ rgmii = (PCH_GBE_RGMII_RATE_2_5M |
+ PCH_GBE_MAC_RGMII_CTRL_SETTING);
+ break;
+ case SPEED_100:
+ rgmii = (PCH_GBE_RGMII_RATE_25M |
+ PCH_GBE_MAC_RGMII_CTRL_SETTING);
+ break;
+ case SPEED_1000:
+ rgmii = (PCH_GBE_RGMII_RATE_125M |
+ PCH_GBE_MAC_RGMII_CTRL_SETTING);
+ break;
+ }
+ } else
+ /* GMII */
+ rgmii = 0;
+
iowrite32(rgmii, &hw->reg->RGMII_CTRL);
-#endif
}
static void pch_gbe_set_mode(struct pch_gbe_adapter *adapter, u16 speed,
u16 duplex)
@@ -2629,6 +2628,8 @@ static int pch_gbe_probe(struct pci_dev *pdev,
if (adapter->pdata && adapter->pdata->platform_init)
adapter->pdata->platform_init(pdev);
+ adapter->hw.phy.is_rgmii = is_rgmii;
+
adapter->ptp_pdev = pci_get_bus_and_slot(adapter->pdev->bus->number,
PCI_DEVFN(12, 4));
@@ -2843,4 +2844,8 @@ module_param(copybreak, uint, 0644);
MODULE_PARM_DESC(copybreak,
"Maximum size of packet that is copied to a new buffer on receive");
+module_param(is_rgmii, bool, 0644);
+MODULE_PARM_DESC(is_rgmii,
+ "Selection of RGMII/GMII PHY mode. true: RGMII (default). false: GMII");
+
/* pch_gbe_main.c */
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h
index 95ad015..1c1e711 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.h
@@ -21,7 +21,6 @@
#define PCH_GBE_PHY_REGS_LEN 32
#define PCH_GBE_PHY_RESET_DELAY_US 10
-#define PCH_GBE_MAC_IFOP_RGMII
s32 pch_gbe_phy_get_id(struct pch_gbe_hw *hw);
s32 pch_gbe_phy_read_reg_miic(struct pch_gbe_hw *hw, u32 offset, u16 *data);
--
1.8.5.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/6] pch_gbe: change order of PHY address discovering
2014-05-26 13:40 [PATCH 1/6] pch_gbe: print invalid MAC address during probe Alexander Stein
2014-05-26 13:40 ` [PATCH 2/6] pch_gbe: Add module parameter for RGMII/GMII PHY mode selection Alexander Stein
@ 2014-05-26 13:40 ` Alexander Stein
2014-05-26 13:40 ` [PATCH 4/6] pch_gbe: remove unnecessary PHY resets Alexander Stein
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Alexander Stein @ 2014-05-26 13:40 UTC (permalink / raw)
To: David S. Miller; +Cc: Daniel Krueger, netdev, Alexander Stein
From: Daniel Krueger <daniel.krueger@systec-electronic.com>
Scan PHY address 0 after all other addresses. Address 0 is a multicast
address which unfortunately does not work properly with Micrel KSZ9021.
Our board uses PHY address 2.
Signed-off-by: Daniel Krueger <daniel.krueger@systec-electronic.com>
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
index 693ee50..52e6cbd 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
@@ -662,9 +662,9 @@ static int pch_gbe_init_phy(struct pch_gbe_adapter *adapter)
u32 addr;
u16 bmcr, stat;
- /* Discover phy addr by searching addrs in order {1,0,2,..., 31} */
+ /* Discover phy addr by searching addrs in order {1,2,...,31,0} */
for (addr = 0; addr < PCH_GBE_PHY_REGS_LEN; addr++) {
- adapter->mii.phy_id = (addr == 0) ? 1 : (addr == 1) ? 0 : addr;
+ adapter->mii.phy_id = (addr == 31) ? 0 : (addr + 1);
bmcr = pch_gbe_mdio_read(netdev, adapter->mii.phy_id, MII_BMCR);
stat = pch_gbe_mdio_read(netdev, adapter->mii.phy_id, MII_BMSR);
stat = pch_gbe_mdio_read(netdev, adapter->mii.phy_id, MII_BMSR);
--
1.8.5.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/6] pch_gbe: remove unnecessary PHY resets
2014-05-26 13:40 [PATCH 1/6] pch_gbe: print invalid MAC address during probe Alexander Stein
2014-05-26 13:40 ` [PATCH 2/6] pch_gbe: Add module parameter for RGMII/GMII PHY mode selection Alexander Stein
2014-05-26 13:40 ` [PATCH 3/6] pch_gbe: change order of PHY address discovering Alexander Stein
@ 2014-05-26 13:40 ` Alexander Stein
2014-05-26 13:40 ` [PATCH 5/6] pch_gbe: reset PHY before first configuration Alexander Stein
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Alexander Stein @ 2014-05-26 13:40 UTC (permalink / raw)
To: David S. Miller; +Cc: Daniel Krueger, netdev, Alexander Stein
From: Daniel Krueger <daniel.krueger@systec-electronic.com>
Those PHY software resets destroy the painfully made PHY settings.
Signed-off-by: Daniel Krueger <daniel.krueger@systec-electronic.com>
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c | 2 --
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c | 1 -
2 files changed, 3 deletions(-)
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
index 826f0cc..fbfac98 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
@@ -111,8 +111,6 @@ static int pch_gbe_set_settings(struct net_device *netdev,
u32 speed = ethtool_cmd_speed(ecmd);
int ret;
- pch_gbe_hal_write_phy_reg(hw, MII_BMCR, BMCR_RESET);
-
/* when set_settings() is called with a ethtool_cmd previously
* filled by get_settings() on a down link, speed is -1: */
if (speed == UINT_MAX) {
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c
index a5cad5e..3fa9a8f 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c
@@ -320,7 +320,6 @@ void pch_gbe_phy_init_setting(struct pch_gbe_hw *hw)
cmd.duplex = hw->mac.link_duplex;
cmd.advertising = hw->phy.autoneg_advertised;
cmd.autoneg = hw->mac.autoneg;
- pch_gbe_phy_write_reg_miic(hw, MII_BMCR, BMCR_RESET);
ret = mii_ethtool_sset(&adapter->mii, &cmd);
if (ret)
netdev_err(adapter->netdev, "Error: mii_ethtool_sset\n");
--
1.8.5.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/6] pch_gbe: reset PHY before first configuration
2014-05-26 13:40 [PATCH 1/6] pch_gbe: print invalid MAC address during probe Alexander Stein
` (2 preceding siblings ...)
2014-05-26 13:40 ` [PATCH 4/6] pch_gbe: remove unnecessary PHY resets Alexander Stein
@ 2014-05-26 13:40 ` Alexander Stein
2014-05-26 13:40 ` [PATCH 6/6] pch_gbe: remove shutdown and restart of interface after PHY settings change Alexander Stein
2014-05-26 16:24 ` [PATCH 1/6] pch_gbe: print invalid MAC address during probe Joe Perches
5 siblings, 0 replies; 8+ messages in thread
From: Alexander Stein @ 2014-05-26 13:40 UTC (permalink / raw)
To: David S. Miller; +Cc: Daniel Krueger, netdev, Alexander Stein
From: Daniel Krueger <daniel.krueger@systec-electronic.com>
It is a good idea to perform a PHY software reset, but is should be done
before performing the first configuration.
Signed-off-by: Daniel Krueger <daniel.krueger@systec-electronic.com>
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c
index 3fa9a8f..dc9f0d3 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_phy.c
@@ -316,6 +316,8 @@ void pch_gbe_phy_init_setting(struct pch_gbe_hw *hw)
if (ret)
netdev_err(adapter->netdev, "Error: mii_ethtool_gset\n");
+ pch_gbe_phy_sw_reset(hw);
+
ethtool_cmd_speed_set(&cmd, hw->mac.link_speed);
cmd.duplex = hw->mac.link_duplex;
cmd.advertising = hw->phy.autoneg_advertised;
@@ -324,8 +326,6 @@ void pch_gbe_phy_init_setting(struct pch_gbe_hw *hw)
if (ret)
netdev_err(adapter->netdev, "Error: mii_ethtool_sset\n");
- pch_gbe_phy_sw_reset(hw);
-
pch_gbe_phy_read_reg_miic(hw, PHY_PHYSP_CONTROL, &mii_reg);
mii_reg |= PHYSP_CTRL_ASSERT_CRS_TX;
pch_gbe_phy_write_reg_miic(hw, PHY_PHYSP_CONTROL, mii_reg);
--
1.8.5.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 6/6] pch_gbe: remove shutdown and restart of interface after PHY settings change
2014-05-26 13:40 [PATCH 1/6] pch_gbe: print invalid MAC address during probe Alexander Stein
` (3 preceding siblings ...)
2014-05-26 13:40 ` [PATCH 5/6] pch_gbe: reset PHY before first configuration Alexander Stein
@ 2014-05-26 13:40 ` Alexander Stein
2014-05-26 16:24 ` [PATCH 1/6] pch_gbe: print invalid MAC address during probe Joe Perches
5 siblings, 0 replies; 8+ messages in thread
From: Alexander Stein @ 2014-05-26 13:40 UTC (permalink / raw)
To: David S. Miller; +Cc: Daniel Krueger, netdev, Alexander Stein
From: Daniel Krueger <daniel.krueger@systec-electronic.com>
This is not necessary. mii_ethtool_sset retriggers the autonegociation if
necessary automatically.
Signed-off-by: Daniel Krueger <daniel.krueger@systec-electronic.com>
Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
---
drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
index fbfac98..2284042 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
@@ -128,13 +128,6 @@ static int pch_gbe_set_settings(struct net_device *netdev,
hw->phy.autoneg_advertised = ecmd->advertising;
hw->mac.autoneg = ecmd->autoneg;
- /* reset the link */
- if (netif_running(adapter->netdev)) {
- pch_gbe_down(adapter);
- ret = pch_gbe_up(adapter);
- } else {
- pch_gbe_reset(adapter);
- }
return ret;
}
--
1.8.5.5
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/6] pch_gbe: print invalid MAC address during probe
2014-05-26 13:40 [PATCH 1/6] pch_gbe: print invalid MAC address during probe Alexander Stein
` (4 preceding siblings ...)
2014-05-26 13:40 ` [PATCH 6/6] pch_gbe: remove shutdown and restart of interface after PHY settings change Alexander Stein
@ 2014-05-26 16:24 ` Joe Perches
2014-05-28 9:34 ` Alexander Stein
5 siblings, 1 reply; 8+ messages in thread
From: Joe Perches @ 2014-05-26 16:24 UTC (permalink / raw)
To: Alexander Stein; +Cc: David S. Miller, Daniel Krueger, netdev
On Mon, 2014-05-26 at 15:40 +0200, Alexander Stein wrote:
> show the actual offending MAC address instead of just
> rejecting it
[]
> diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
[]
> @@ -2674,6 +2674,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
> */
> dev_err(&pdev->dev, "Invalid MAC address, "
> "interface disabled.\n");
> + dev_err(&pdev->dev, "%pM\n", adapter->hw.mac.addr);
Nicer I think on a single line
using just one dev_err
dev_err(&pdev->dev, "Invalid MAC %pM - interface disabled\n",
adapter->hw.mac.addr);
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/6] pch_gbe: print invalid MAC address during probe
2014-05-26 16:24 ` [PATCH 1/6] pch_gbe: print invalid MAC address during probe Joe Perches
@ 2014-05-28 9:34 ` Alexander Stein
0 siblings, 0 replies; 8+ messages in thread
From: Alexander Stein @ 2014-05-28 9:34 UTC (permalink / raw)
To: Joe Perches; +Cc: David S. Miller, Daniel Krueger, netdev
On Monday 26 May 2014 09:24:28, Joe Perches wrote:
> On Mon, 2014-05-26 at 15:40 +0200, Alexander Stein wrote:
> > show the actual offending MAC address instead of just
> > rejecting it
> []
> > diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
> []
> > @@ -2674,6 +2674,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
> > */
> > dev_err(&pdev->dev, "Invalid MAC address, "
> > "interface disabled.\n");
> > + dev_err(&pdev->dev, "%pM\n", adapter->hw.mac.addr);
>
> Nicer I think on a single line
> using just one dev_err
>
> dev_err(&pdev->dev, "Invalid MAC %pM - interface disabled\n",
> adapter->hw.mac.addr);
Yep, I'll send a v2 if there is some more feedback on the other patches.
Best regards,
Alexander
^ permalink raw reply [flat|nested] 8+ messages in thread