* [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards
@ 2025-02-22 9:49 Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 1/7] net: phy: Add swnode support to mdiobus_scan Hans-Frieder Vogt via B4 Relay
` (6 more replies)
0 siblings, 7 replies; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
This patch series adds support to the Tehuti tn40xx driver for TN9510 cards
which combine a TN4010 MAC with an Aquantia AQR105.
It is an update of the patch series "net: tn40xx: add support for AQR105
based cards", addressing review comments and generally cleaning up the series.
The patch was tested on a Tehuti TN9510 card (1fc9:4025:1fc9:3015).
---
Changes in v5:
- changed version because "b4 send --resend v4" did not succeed
- used opportunity to rebaseline to net-next
- only source code change is merging a split string in tn40_mdio.c, removing
a warning from b4 prep --check
- changed format of cover letter in line with b4 (sequence of changes from
latest to oldest)
- Link to v4: https://lore.kernel.org/r/20241221-tn9510-v3a-v4-0-dafff89ba7a7@gmx.net
Changes in v4:
- use separate aqr105 specific functions instead of adding aqr105 functionality
in common functions, with need of "chip generation" parameter
(suggested by Andrew Lunn <andrew@lunn.ch>)
- make generation and cleanup of swnodes more symmetric
(suggested by Andrew Lunn <andrew@lunn.ch>)
- add MDIO/PHY software nodes only for devices that have an aqr105 PHY
(suggested by FUJITA Tomonori <fujita.tomonori@gmail.com>)
- Link to v3: https://lore.kernel.org/r/20241217-tn9510-v3a-v3-0-4d5ef6f686e0@gmx.net
Changes in v3:
- aquantia_firmware: remove call to of_property_read_string. It should be
called from the more generic function device_property_read_string
- add more AQR105-specific function, to support proper advertising and auto-
negotiation
- re-organize the patches about the mdio speed and TN40_REG_MDIO_CMD_STAT,
skipping the 1MHz intermediate speed step
- re-organized the sequence of the patches:
1. changes to the general support functions (net/phy/mdio_bus.c)
2. changes to the aquantia PHY driver
3. changes to the tn40xx MAC driver, required to support the TN9510 cards
- Link to v2: https://lore.kernel.org/netdev/trinity-602c050f-bc76-4557-9824-252b0de48659-1726429697171@3c-app-gmx-bap07/
Changes in v2:
- simplify the check for a firmware-name in a swnode in the aquantia PHY driver
(comment from Andrew Lunn)
- changed the software node definition to an mdio node with phy child nodes, to
be more in line with a typical device tree definition (also comment from
Andrew Lunn)
This also solves the problem with several TN4010-based cards that FUJITA
Tomonori reported
- clarified the cleanup calls, now calling fwnode_handle_put instead of
software_node_unregister (comment by FUJITA Tomonori)
- updated the function mdiobus_scan to support swnodes (following hint of
Andrew Lunn)
- remove the small patch to avoid failing after aqr_wait_reset_complete, now
that a proper patch by Vladimir Oltean is available
- replace setting of bit 3 in TN40_REG_MDIO_CMD_STAT by calling of
tn40_mdio_set_speed (suggestion by FUJITA Tomonori)
- cleaning up the distributed calls to set the MDIO speed in the tn40xx driver
- define supported PCI-IDs including subvendor IDs to prevent loading on
unsupported card
- Link to v1: https://lore.kernel.org/netdev/trinity-33332a4a-1c44-46b7-8526-b53b1a94ffc2-1726082106356@3c-app-gmx-bs04/
---
Hans-Frieder Vogt (7):
net: phy: Add swnode support to mdiobus_scan
net: phy: aquantia: add probe function to aqr105 for firmware loading
net: phy: aquantia: search for firmware-name in fwnode
net: phy: aquantia: add essential functions to aqr105 driver
net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus
net: tn40xx: prepare tn40xx driver to find phy of the TN9510 card
net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards
drivers/net/ethernet/tehuti/tn40.c | 9 +-
drivers/net/ethernet/tehuti/tn40.h | 31 ++++
drivers/net/ethernet/tehuti/tn40_mdio.c | 80 ++++++++-
drivers/net/phy/aquantia/aquantia_firmware.c | 7 +-
drivers/net/phy/aquantia/aquantia_main.c | 243 ++++++++++++++++++++++++++-
drivers/net/phy/mdio_bus.c | 14 ++
6 files changed, 375 insertions(+), 9 deletions(-)
---
base-commit: bb3bb6c92e5719c0f5d7adb9d34db7e76705ac33
change-id: 20241216-tn9510-v3a-2cfc185d680f
Best regards,
--
Hans-Frieder Vogt <hfdevel@gmx.net>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next v5 1/7] net: phy: Add swnode support to mdiobus_scan
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 2/7] net: phy: aquantia: add probe function to aqr105 for firmware loading Hans-Frieder Vogt via B4 Relay
` (5 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
This patch will allow to use a swnode/fwnode defined for a phy_device. The
MDIO bus (mii_bus) needs to contain nodes for the PHY devices, named
"ethernet-phy@i", with i being the MDIO address (0 .. PHY_MAX_ADDR - 1).
The fwnode is only attached to the phy_device if there isn't already an
fwnode attached.
fwnode_get_named_child_node will increase the usage counter of the fwnode.
However, no new code is needed to decrease the counter again, since this is
already implemented in the phy_device_release function.
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
---
drivers/net/phy/mdio_bus.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 7e2f10182c0cf37bef4cea1820863f047b5cb466..ede596c1a69d1b2b986e9eef51c3beb4a5fbc805 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -551,6 +551,8 @@ static int mdiobus_create_device(struct mii_bus *bus,
static struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr, bool c45)
{
struct phy_device *phydev = ERR_PTR(-ENODEV);
+ struct fwnode_handle *fwnode;
+ char node_name[16];
int err;
phydev = get_phy_device(bus, addr, c45);
@@ -562,6 +564,18 @@ static struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr, bool c45)
*/
of_mdiobus_link_mdiodev(bus, &phydev->mdio);
+ /* Search for a swnode for the phy in the swnode hierarchy of the bus.
+ * If there is no swnode for the phy provided, just ignore it.
+ */
+ if (dev_fwnode(&bus->dev) && !dev_fwnode(&phydev->mdio.dev)) {
+ snprintf(node_name, sizeof(node_name), "ethernet-phy@%d",
+ addr);
+ fwnode = fwnode_get_named_child_node(dev_fwnode(&bus->dev),
+ node_name);
+ if (fwnode)
+ device_set_node(&phydev->mdio.dev, fwnode);
+ }
+
err = phy_device_register(phydev);
if (err) {
phy_device_free(phydev);
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next v5 2/7] net: phy: aquantia: add probe function to aqr105 for firmware loading
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 1/7] net: phy: Add swnode support to mdiobus_scan Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 3/7] net: phy: aquantia: search for firmware-name in fwnode Hans-Frieder Vogt via B4 Relay
` (4 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
Re-use the AQR107 probe function to load the firmware on the AQR105 (and
to probe the HWMON).
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/phy/aquantia/aquantia_main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
index e42ace4e682aacf56199b7fdb9613d20f240fa27..86b0e63de5d88fa1050919a8826bdbec4bbcf8ba 100644
--- a/drivers/net/phy/aquantia/aquantia_main.c
+++ b/drivers/net/phy/aquantia/aquantia_main.c
@@ -912,6 +912,7 @@ static struct phy_driver aqr_driver[] = {
PHY_ID_MATCH_MODEL(PHY_ID_AQR105),
.name = "Aquantia AQR105",
.config_aneg = aqr_config_aneg,
+ .probe = aqr107_probe,
.config_intr = aqr_config_intr,
.handle_interrupt = aqr_handle_interrupt,
.read_status = aqr_read_status,
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next v5 3/7] net: phy: aquantia: search for firmware-name in fwnode
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 1/7] net: phy: Add swnode support to mdiobus_scan Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 2/7] net: phy: aquantia: add probe function to aqr105 for firmware loading Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver Hans-Frieder Vogt via B4 Relay
` (3 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
Allow the firmware name of an Aquantia PHY alternatively be provided by the
property "firmware-name" of a swnode. This software node may be provided by
the MAC or MDIO driver.
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/phy/aquantia/aquantia_firmware.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/phy/aquantia/aquantia_firmware.c b/drivers/net/phy/aquantia/aquantia_firmware.c
index dab3af80593f51ff6dc670dfb54ae358c2458c40..bbbcc9736b00e1cfa193f4398889a4c172ca27a4 100644
--- a/drivers/net/phy/aquantia/aquantia_firmware.c
+++ b/drivers/net/phy/aquantia/aquantia_firmware.c
@@ -328,10 +328,11 @@ static int aqr_firmware_load_fs(struct phy_device *phydev)
const char *fw_name;
int ret;
- ret = of_property_read_string(dev->of_node, "firmware-name",
- &fw_name);
- if (ret)
+ ret = device_property_read_string(dev, "firmware-name", &fw_name);
+ if (ret) {
+ phydev_err(phydev, "failed to read firmware-name: %d\n", ret);
return ret;
+ }
ret = request_firmware(&fw, fw_name, dev);
if (ret) {
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
` (2 preceding siblings ...)
2025-02-22 9:49 ` [PATCH net-next v5 3/7] net: phy: aquantia: search for firmware-name in fwnode Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
2025-02-23 10:32 ` Maxime Chevallier
2025-02-22 9:49 ` [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus Hans-Frieder Vogt via B4 Relay
` (2 subsequent siblings)
6 siblings, 1 reply; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
This patch makes functions that were provided for aqr107 applicable to
aqr105, or replaces generic functions with specific ones. Since the aqr105
was introduced before NBASE-T was defined (or 802.3bz), there are a number
of vendor specific registers involved in the definition of the
advertisement, in auto-negotiation and in the setting of the speed. The
functions have been written following the downstream driver for TN4010
cards with aqr105 PHY, and use code from aqr107 functions wherever it
seemed to make sense.
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
---
drivers/net/phy/aquantia/aquantia_main.c | 242 ++++++++++++++++++++++++++++++-
1 file changed, 240 insertions(+), 2 deletions(-)
diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
index 86b0e63de5d88fa1050919a8826bdbec4bbcf8ba..38c6cf7814da1fb9a4e715f242249eee15a3cc85 100644
--- a/drivers/net/phy/aquantia/aquantia_main.c
+++ b/drivers/net/phy/aquantia/aquantia_main.c
@@ -33,6 +33,9 @@
#define PHY_ID_AQR115C 0x31c31c33
#define PHY_ID_AQR813 0x31c31cb2
+#define MDIO_AN_10GBT_CTRL_ADV_LTIM BIT(0)
+#define ADVERTISE_XNP BIT(12)
+
#define MDIO_PHYXS_VEND_IF_STATUS 0xe812
#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR 0
@@ -50,6 +53,7 @@
#define MDIO_AN_VEND_PROV_1000BASET_HALF BIT(14)
#define MDIO_AN_VEND_PROV_5000BASET_FULL BIT(11)
#define MDIO_AN_VEND_PROV_2500BASET_FULL BIT(10)
+#define MDIO_AN_VEND_PROV_EXC_PHYID_INFO BIT(6)
#define MDIO_AN_VEND_PROV_DOWNSHIFT_EN BIT(4)
#define MDIO_AN_VEND_PROV_DOWNSHIFT_MASK GENMASK(3, 0)
#define MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT 4
@@ -333,6 +337,238 @@ static int aqr_read_status(struct phy_device *phydev)
return genphy_c45_read_status(phydev);
}
+static int aqr105_get_features(struct phy_device *phydev)
+{
+ int ret;
+
+ /* Normal feature discovery */
+ ret = genphy_c45_pma_read_abilities(phydev);
+ if (ret)
+ return ret;
+
+ /* The AQR105 PHY misses to indicate the 2.5G and 5G modes, so add them
+ * here
+ */
+ linkmode_set_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
+ phydev->supported);
+ linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
+ phydev->supported);
+
+ /* The AQR105 PHY suppports both RJ45 and SFP+ interfaces */
+ linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, phydev->supported);
+ linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported);
+
+ return 0;
+}
+
+static int aqr105_config_speed(struct phy_device *phydev)
+{
+ int vend = MDIO_AN_VEND_PROV_EXC_PHYID_INFO;
+ int ctrl10 = MDIO_AN_10GBT_CTRL_ADV_LTIM;
+ int adv = ADVERTISE_CSMA;
+ int ret;
+
+ switch (phydev->speed) {
+ case SPEED_100:
+ adv |= ADVERTISE_100FULL;
+ break;
+ case SPEED_1000:
+ adv |= ADVERTISE_NPAGE;
+ if (phydev->duplex == DUPLEX_FULL)
+ vend |= MDIO_AN_VEND_PROV_1000BASET_FULL;
+ else
+ vend |= MDIO_AN_VEND_PROV_1000BASET_HALF;
+ break;
+ case SPEED_2500:
+ adv |= (ADVERTISE_NPAGE | ADVERTISE_XNP);
+ vend |= MDIO_AN_VEND_PROV_2500BASET_FULL;
+ break;
+ case SPEED_5000:
+ adv |= (ADVERTISE_NPAGE | ADVERTISE_XNP);
+ vend |= MDIO_AN_VEND_PROV_5000BASET_FULL;
+ break;
+ case SPEED_10000:
+ adv |= (ADVERTISE_NPAGE | ADVERTISE_XNP);
+ ctrl10 |= MDIO_AN_10GBT_CTRL_ADV10G;
+ break;
+ default:
+ return -EINVAL;
+ }
+ ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, adv);
+ if (ret < 0)
+ return ret;
+ ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV, vend);
+ if (ret < 0)
+ return ret;
+ ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, ctrl10);
+ if (ret < 0)
+ return ret;
+
+ /* set by vendor driver, but should be on by default */
+ ret = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1,
+ MDIO_AN_CTRL1_XNP);
+ if (ret < 0)
+ return ret;
+
+ return genphy_c45_an_disable_aneg(phydev);
+}
+
+static int aqr105_config_aneg(struct phy_device *phydev)
+{
+ bool changed = false;
+ u16 reg;
+ int ret;
+
+ ret = aqr_set_mdix(phydev, phydev->mdix_ctrl);
+ if (ret < 0)
+ return ret;
+ if (ret > 0)
+ changed = true;
+
+ if (phydev->autoneg == AUTONEG_DISABLE)
+ return aqr105_config_speed(phydev);
+
+ ret = genphy_c45_an_config_aneg(phydev);
+ if (ret < 0)
+ return ret;
+ if (ret > 0)
+ changed = true;
+
+ /* Clause 45 has no standardized support for 1000BaseT, therefore
+ * use vendor registers for this mode.
+ */
+ reg = 0;
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
+ phydev->advertising))
+ reg |= MDIO_AN_VEND_PROV_1000BASET_FULL;
+
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
+ phydev->advertising))
+ reg |= MDIO_AN_VEND_PROV_1000BASET_HALF;
+
+ /* Handle the case when the 2.5G and 5G speeds are not advertised */
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
+ phydev->advertising))
+ reg |= MDIO_AN_VEND_PROV_2500BASET_FULL;
+
+ if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
+ phydev->advertising))
+ reg |= MDIO_AN_VEND_PROV_5000BASET_FULL;
+
+ ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV,
+ MDIO_AN_VEND_PROV_1000BASET_HALF |
+ MDIO_AN_VEND_PROV_1000BASET_FULL |
+ MDIO_AN_VEND_PROV_2500BASET_FULL |
+ MDIO_AN_VEND_PROV_5000BASET_FULL, reg);
+ if (ret < 0)
+ return ret;
+ if (ret > 0)
+ changed = true;
+
+ return genphy_c45_check_and_restart_aneg(phydev, changed);
+}
+
+static int aqr105_read_rate(struct phy_device *phydev)
+{
+ int val;
+
+ val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_STATUS1);
+ if (val < 0)
+ return val;
+
+ if (val & MDIO_AN_TX_VEND_STATUS1_FULL_DUPLEX)
+ phydev->duplex = DUPLEX_FULL;
+ else
+ phydev->duplex = DUPLEX_HALF;
+
+ switch (FIELD_GET(MDIO_AN_TX_VEND_STATUS1_RATE_MASK, val)) {
+ case MDIO_AN_TX_VEND_STATUS1_10BASET:
+ phydev->speed = SPEED_10;
+ break;
+ case MDIO_AN_TX_VEND_STATUS1_100BASETX:
+ phydev->speed = SPEED_100;
+ break;
+ case MDIO_AN_TX_VEND_STATUS1_1000BASET:
+ phydev->speed = SPEED_1000;
+ break;
+ case MDIO_AN_TX_VEND_STATUS1_2500BASET:
+ phydev->speed = SPEED_2500;
+ break;
+ case MDIO_AN_TX_VEND_STATUS1_5000BASET:
+ phydev->speed = SPEED_5000;
+ break;
+ case MDIO_AN_TX_VEND_STATUS1_10GBASET:
+ phydev->speed = SPEED_10000;
+ break;
+ default:
+ phydev->speed = SPEED_UNKNOWN;
+ }
+
+ return 0;
+}
+
+static int aqr105_read_status(struct phy_device *phydev)
+{
+ int ret;
+ int val;
+
+ ret = aqr_read_status(phydev);
+ if (ret)
+ return ret;
+
+ if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
+ return 0;
+
+ /**
+ * The status register is not immediately correct on line side link up.
+ * Poll periodically until it reflects the correct ON state.
+ * Only return fail for read error, timeout defaults to OFF state.
+ */
+ ret = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_PHYXS,
+ MDIO_PHYXS_VEND_IF_STATUS, val,
+ (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val) !=
+ MDIO_PHYXS_VEND_IF_STATUS_TYPE_OFF),
+ AQR107_OP_IN_PROG_SLEEP,
+ AQR107_OP_IN_PROG_TIMEOUT, false);
+ if (ret && ret != -ETIMEDOUT)
+ return ret;
+
+ switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
+ phydev->interface = PHY_INTERFACE_MODE_10GKR;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KX:
+ phydev->interface = PHY_INTERFACE_MODE_1000BASEKX;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
+ phydev->interface = PHY_INTERFACE_MODE_10GBASER;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
+ phydev->interface = PHY_INTERFACE_MODE_USXGMII;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XAUI:
+ phydev->interface = PHY_INTERFACE_MODE_XAUI;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
+ phydev->interface = PHY_INTERFACE_MODE_SGMII;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_RXAUI:
+ phydev->interface = PHY_INTERFACE_MODE_RXAUI;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
+ phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
+ break;
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OFF:
+ default:
+ phydev->link = false;
+ phydev->interface = PHY_INTERFACE_MODE_NA;
+ break;
+ }
+
+ /* Read rate from vendor register */
+ return aqr105_read_rate(phydev);
+}
+
static int aqr107_read_rate(struct phy_device *phydev)
{
u32 config_reg;
@@ -911,11 +1147,13 @@ static struct phy_driver aqr_driver[] = {
{
PHY_ID_MATCH_MODEL(PHY_ID_AQR105),
.name = "Aquantia AQR105",
- .config_aneg = aqr_config_aneg,
+ .get_features = aqr105_get_features,
.probe = aqr107_probe,
+ .config_init = aqr107_config_init,
+ .config_aneg = aqr105_config_aneg,
.config_intr = aqr_config_intr,
.handle_interrupt = aqr_handle_interrupt,
- .read_status = aqr_read_status,
+ .read_status = aqr105_read_status,
.suspend = aqr107_suspend,
.resume = aqr107_resume,
},
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
` (3 preceding siblings ...)
2025-02-22 9:49 ` [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
2025-02-24 4:08 ` Ratheesh Kannoth
2025-02-22 9:49 ` [PATCH net-next v5 6/7] net: tn40xx: prepare tn40xx driver to find phy of the TN9510 card Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 7/7] net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards Hans-Frieder Vogt via B4 Relay
6 siblings, 1 reply; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
In case of an AQR105-based device, create a software node for the mdio
function, with a child node for the Aquantia AQR105 PHY, providing a
firmware-name (and a bit more, which may be used for future checks) to
allow the PHY to load a MAC specific firmware from the file system.
The name of the PHY software node follows the naming convention suggested
in the patch for the mdiobus_scan function (in the same patch series).
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
---
drivers/net/ethernet/tehuti/tn40.c | 5 ++-
drivers/net/ethernet/tehuti/tn40.h | 31 +++++++++++++
drivers/net/ethernet/tehuti/tn40_mdio.c | 78 ++++++++++++++++++++++++++++++++-
3 files changed, 111 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/tehuti/tn40.c b/drivers/net/ethernet/tehuti/tn40.c
index 259bdac24cf211113b8f80934feb093d61e46f2d..a4dd04fc6d89e7f7efd77145a5dd883884b30c4b 100644
--- a/drivers/net/ethernet/tehuti/tn40.c
+++ b/drivers/net/ethernet/tehuti/tn40.c
@@ -1778,7 +1778,7 @@ static int tn40_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
ret = tn40_phy_register(priv);
if (ret) {
dev_err(&pdev->dev, "failed to set up PHY.\n");
- goto err_free_irq;
+ goto err_cleanup_swnodes;
}
ret = tn40_priv_init(priv);
@@ -1795,6 +1795,8 @@ static int tn40_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return 0;
err_unregister_phydev:
tn40_phy_unregister(priv);
+err_cleanup_swnodes:
+ tn40_swnodes_cleanup(priv);
err_free_irq:
pci_free_irq_vectors(pdev);
err_unset_drvdata:
@@ -1816,6 +1818,7 @@ static void tn40_remove(struct pci_dev *pdev)
unregister_netdev(ndev);
tn40_phy_unregister(priv);
+ tn40_swnodes_cleanup(priv);
pci_free_irq_vectors(priv->pdev);
pci_set_drvdata(pdev, NULL);
iounmap(priv->regs);
diff --git a/drivers/net/ethernet/tehuti/tn40.h b/drivers/net/ethernet/tehuti/tn40.h
index 490781fe512053d0d2cf0d6e819fc11d078a6733..ac48c1dc555480ccea41b6815bcfafb150b0a47c 100644
--- a/drivers/net/ethernet/tehuti/tn40.h
+++ b/drivers/net/ethernet/tehuti/tn40.h
@@ -4,6 +4,7 @@
#ifndef _TN40_H_
#define _TN40_H_
+#include <linux/property.h>
#include "tn40_regs.h"
#define TN40_DRV_NAME "tn40xx"
@@ -102,10 +103,39 @@ struct tn40_txdb {
int size; /* Number of elements in the db */
};
+#define NODE_PROP(_NAME, _PROP) ( \
+ (const struct software_node) { \
+ .name = _NAME, \
+ .properties = _PROP, \
+ })
+
+#define NODE_PAR_PROP(_NAME, _PAR, _PROP) ( \
+ (const struct software_node) { \
+ .name = _NAME, \
+ .parent = _PAR, \
+ .properties = _PROP, \
+ })
+
+enum tn40_swnodes {
+ SWNODE_MDIO,
+ SWNODE_PHY,
+ SWNODE_MAX
+};
+
+struct tn40_nodes {
+ char phy_name[32];
+ char mdio_name[32];
+ struct property_entry phy_props[3];
+ struct software_node swnodes[SWNODE_MAX];
+ const struct software_node *group[SWNODE_MAX + 1];
+};
+
struct tn40_priv {
struct net_device *ndev;
struct pci_dev *pdev;
+ struct tn40_nodes nodes;
+
struct napi_struct napi;
/* RX FIFOs: 1 for data (full) descs, and 2 for free descs */
struct tn40_rxd_fifo rxd_fifo0;
@@ -225,6 +255,7 @@ static inline void tn40_write_reg(struct tn40_priv *priv, u32 reg, u32 val)
int tn40_set_link_speed(struct tn40_priv *priv, u32 speed);
+void tn40_swnodes_cleanup(struct tn40_priv *priv);
int tn40_mdiobus_init(struct tn40_priv *priv);
int tn40_phy_register(struct tn40_priv *priv);
diff --git a/drivers/net/ethernet/tehuti/tn40_mdio.c b/drivers/net/ethernet/tehuti/tn40_mdio.c
index af18615d64a8a290c7f79e56260b9aacf82c0386..173551ace1941bf825c9b3d1acd16be24b35eb84 100644
--- a/drivers/net/ethernet/tehuti/tn40_mdio.c
+++ b/drivers/net/ethernet/tehuti/tn40_mdio.c
@@ -14,6 +14,8 @@
(FIELD_PREP(TN40_MDIO_PRTAD_MASK, (port))))
#define TN40_MDIO_CMD_READ BIT(15)
+#define AQR105_FIRMWARE "tehuti/aqr105-tn40xx.cld"
+
static void tn40_mdio_set_speed(struct tn40_priv *priv, u32 speed)
{
void __iomem *regs = priv->regs;
@@ -111,6 +113,56 @@ static int tn40_mdio_write_c45(struct mii_bus *mii_bus, int addr, int devnum,
return tn40_mdio_write(mii_bus->priv, addr, devnum, regnum, val);
}
+/* registers an mdio node and an aqr105 PHY at address 1
+ * tn40_mdio-%id {
+ * ethernet-phy@1 {
+ * compatible = "ethernet-phy-id03a1.b4a3";
+ * reg = <1>;
+ * firmware-name = AQR105_FIRMWARE;
+ * };
+ * };
+ */
+static int tn40_swnodes_register(struct tn40_priv *priv)
+{
+ struct tn40_nodes *nodes = &priv->nodes;
+ struct pci_dev *pdev = priv->pdev;
+ struct software_node *swnodes;
+ u32 id;
+
+ id = pci_dev_id(pdev);
+
+ snprintf(nodes->phy_name, sizeof(nodes->phy_name), "ethernet-phy@1");
+ snprintf(nodes->mdio_name, sizeof(nodes->mdio_name), "tn40_mdio-%x",
+ id);
+
+ swnodes = nodes->swnodes;
+
+ swnodes[SWNODE_MDIO] = NODE_PROP(nodes->mdio_name, NULL);
+
+ nodes->phy_props[0] = PROPERTY_ENTRY_STRING("compatible",
+ "ethernet-phy-id03a1.b4a3");
+ nodes->phy_props[1] = PROPERTY_ENTRY_U32("reg", 1);
+ nodes->phy_props[2] = PROPERTY_ENTRY_STRING("firmware-name",
+ AQR105_FIRMWARE);
+ swnodes[SWNODE_PHY] = NODE_PAR_PROP(nodes->phy_name,
+ &swnodes[SWNODE_MDIO],
+ nodes->phy_props);
+
+ nodes->group[SWNODE_PHY] = &swnodes[SWNODE_PHY];
+ nodes->group[SWNODE_MDIO] = &swnodes[SWNODE_MDIO];
+ return software_node_register_node_group(nodes->group);
+}
+
+void tn40_swnodes_cleanup(struct tn40_priv *priv)
+{
+ /* cleanup of swnodes is only needed for AQR105-based cards */
+ if (priv->pdev->device == 0x4025) {
+ fwnode_handle_put(dev_fwnode(&priv->mdio->dev));
+ device_remove_software_node(&priv->mdio->dev);
+ software_node_unregister_node_group(priv->nodes.group);
+ }
+}
+
int tn40_mdiobus_init(struct tn40_priv *priv)
{
struct pci_dev *pdev = priv->pdev;
@@ -129,14 +181,36 @@ int tn40_mdiobus_init(struct tn40_priv *priv)
bus->read_c45 = tn40_mdio_read_c45;
bus->write_c45 = tn40_mdio_write_c45;
+ priv->mdio = bus;
+
+ /* provide swnodes for AQR105-based cards only */
+ if (pdev->device == 0x4025) {
+ ret = tn40_swnodes_register(priv);
+ if (ret) {
+ pr_err("swnodes failed\n");
+ return ret;
+ }
+
+ ret = device_add_software_node(&bus->dev,
+ priv->nodes.group[SWNODE_MDIO]);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "device_add_software_node failed: %d\n", ret);
+ }
+ }
ret = devm_mdiobus_register(&pdev->dev, bus);
if (ret) {
dev_err(&pdev->dev, "failed to register mdiobus %d %u %u\n",
ret, bus->state, MDIOBUS_UNREGISTERED);
- return ret;
+ goto err_swnodes_cleanup;
}
tn40_mdio_set_speed(priv, TN40_MDIO_SPEED_6MHZ);
- priv->mdio = bus;
return 0;
+
+err_swnodes_cleanup:
+ tn40_swnodes_cleanup(priv);
+ return ret;
}
+
+MODULE_FIRMWARE(AQR105_FIRMWARE);
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next v5 6/7] net: tn40xx: prepare tn40xx driver to find phy of the TN9510 card
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
` (4 preceding siblings ...)
2025-02-22 9:49 ` [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 7/7] net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards Hans-Frieder Vogt via B4 Relay
6 siblings, 0 replies; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
Prepare the tn40xx driver to load for Tehuti TN9510 cards, which require
bit 3 in the register TN40_REG_MDIO_CMD_STAT to be set. The function of bit
3 is unclear, but may have something to do with the length of the preamble
in the MDIO communication. If bit 3 is not set, the PHY will not be found
when performing a scan for PHYs. Use the available tn40_mdio_set_speed
function which includes setting bit 3. Just move the function to before the
devm_mdio_register function, which scans the mdio bus for PHYs.
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
---
drivers/net/ethernet/tehuti/tn40_mdio.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/tehuti/tn40_mdio.c b/drivers/net/ethernet/tehuti/tn40_mdio.c
index 173551ace1941bf825c9b3d1acd16be24b35eb84..f08e6d5cf2bb0091e209214ef6aca186503c48de 100644
--- a/drivers/net/ethernet/tehuti/tn40_mdio.c
+++ b/drivers/net/ethernet/tehuti/tn40_mdio.c
@@ -199,13 +199,13 @@ int tn40_mdiobus_init(struct tn40_priv *priv)
}
}
+ tn40_mdio_set_speed(priv, TN40_MDIO_SPEED_6MHZ);
ret = devm_mdiobus_register(&pdev->dev, bus);
if (ret) {
dev_err(&pdev->dev, "failed to register mdiobus %d %u %u\n",
ret, bus->state, MDIOBUS_UNREGISTERED);
goto err_swnodes_cleanup;
}
- tn40_mdio_set_speed(priv, TN40_MDIO_SPEED_6MHZ);
return 0;
err_swnodes_cleanup:
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH net-next v5 7/7] net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
` (5 preceding siblings ...)
2025-02-22 9:49 ` [PATCH net-next v5 6/7] net: tn40xx: prepare tn40xx driver to find phy of the TN9510 card Hans-Frieder Vogt via B4 Relay
@ 2025-02-22 9:49 ` Hans-Frieder Vogt via B4 Relay
6 siblings, 0 replies; 13+ messages in thread
From: Hans-Frieder Vogt via B4 Relay @ 2025-02-22 9:49 UTC (permalink / raw)
To: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn
Cc: netdev, linux-kernel, Hans-Frieder Vogt
From: Hans-Frieder Vogt <hfdevel@gmx.net>
Add the PCI-ID of the AQR105-based Tehuti TN4010 cards to allow loading
of the tn40xx driver on these cards. Here, I chose the detailed definition
with the subvendor ID similar to the QT2025 cards with the PCI-ID
TEHUTI:0x4022, because there is a card with an AQ2104 hiding amongst the
AQR105 cards, and they all come with the same PCI-ID (TEHUTI:0x4025). But
the AQ2104 is currently not supported.
Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: FUJITA Tomonori <fujita.tomonori@gmail.com>
---
drivers/net/ethernet/tehuti/tn40.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/net/ethernet/tehuti/tn40.c b/drivers/net/ethernet/tehuti/tn40.c
index a4dd04fc6d89e7f7efd77145a5dd883884b30c4b..aaad40c916ef83f457e1b5983c01dff2de148fea 100644
--- a/drivers/net/ethernet/tehuti/tn40.c
+++ b/drivers/net/ethernet/tehuti/tn40.c
@@ -1835,6 +1835,10 @@ static const struct pci_device_id tn40_id_table[] = {
PCI_VENDOR_ID_ASUSTEK, 0x8709) },
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_TEHUTI, 0x4022,
PCI_VENDOR_ID_EDIMAX, 0x8103) },
+ { PCI_DEVICE_SUB(PCI_VENDOR_ID_TEHUTI, 0x4025,
+ PCI_VENDOR_ID_TEHUTI, 0x3015) },
+ { PCI_DEVICE_SUB(PCI_VENDOR_ID_TEHUTI, 0x4025,
+ PCI_VENDOR_ID_EDIMAX, 0x8102) },
{ }
};
--
2.47.2
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver
2025-02-22 9:49 ` [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver Hans-Frieder Vogt via B4 Relay
@ 2025-02-23 10:32 ` Maxime Chevallier
2025-02-23 22:26 ` Hans-Frieder Vogt
0 siblings, 1 reply; 13+ messages in thread
From: Maxime Chevallier @ 2025-02-23 10:32 UTC (permalink / raw)
To: Hans-Frieder Vogt via B4 Relay
Cc: hfdevel, Andrew Lunn, Heiner Kallweit, Russell King,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
FUJITA Tomonori, Andrew Lunn, netdev, linux-kernel
Hi,
On Sat, 22 Feb 2025 10:49:31 +0100
Hans-Frieder Vogt via B4 Relay <devnull+hfdevel.gmx.net@kernel.org>
wrote:
> From: Hans-Frieder Vogt <hfdevel@gmx.net>
>
> This patch makes functions that were provided for aqr107 applicable to
> aqr105, or replaces generic functions with specific ones. Since the aqr105
> was introduced before NBASE-T was defined (or 802.3bz), there are a number
> of vendor specific registers involved in the definition of the
> advertisement, in auto-negotiation and in the setting of the speed. The
> functions have been written following the downstream driver for TN4010
> cards with aqr105 PHY, and use code from aqr107 functions wherever it
> seemed to make sense.
>
> Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
> ---
> drivers/net/phy/aquantia/aquantia_main.c | 242 ++++++++++++++++++++++++++++++-
> 1 file changed, 240 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
> index 86b0e63de5d88fa1050919a8826bdbec4bbcf8ba..38c6cf7814da1fb9a4e715f242249eee15a3cc85 100644
> --- a/drivers/net/phy/aquantia/aquantia_main.c
> +++ b/drivers/net/phy/aquantia/aquantia_main.c
> @@ -33,6 +33,9 @@
> #define PHY_ID_AQR115C 0x31c31c33
> #define PHY_ID_AQR813 0x31c31cb2
>
> +#define MDIO_AN_10GBT_CTRL_ADV_LTIM BIT(0)
This is a standard C45 definition, from :
45.2.7.10.15 10GBASE-T LD loop timing ability (7.32.0)
So if you need this advertising capability, you should add that in the
generic definitions for C45 registers in include/uapi/linux/mdio.h
That being said, as it looks this is the first driver using this
feature, do you actually need to advertise Loop Timing ability here ?
I guess it comes from the vendor driver ?
Thanks,
Maxime
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver
2025-02-23 10:32 ` Maxime Chevallier
@ 2025-02-23 22:26 ` Hans-Frieder Vogt
2025-02-25 9:38 ` Maxime Chevallier
0 siblings, 1 reply; 13+ messages in thread
From: Hans-Frieder Vogt @ 2025-02-23 22:26 UTC (permalink / raw)
To: Maxime Chevallier, Hans-Frieder Vogt via B4 Relay
Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn, netdev, linux-kernel
Hi Maxime,
On 23.02.2025 11.32, Maxime Chevallier wrote:
> Hi,
>
> On Sat, 22 Feb 2025 10:49:31 +0100
> Hans-Frieder Vogt via B4 Relay <devnull+hfdevel.gmx.net@kernel.org>
> wrote:
>
>> From: Hans-Frieder Vogt <hfdevel@gmx.net>
>>
>> This patch makes functions that were provided for aqr107 applicable to
>> aqr105, or replaces generic functions with specific ones. Since the aqr105
>> was introduced before NBASE-T was defined (or 802.3bz), there are a number
>> of vendor specific registers involved in the definition of the
>> advertisement, in auto-negotiation and in the setting of the speed. The
>> functions have been written following the downstream driver for TN4010
>> cards with aqr105 PHY, and use code from aqr107 functions wherever it
>> seemed to make sense.
>>
>> Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
>> ---
>> drivers/net/phy/aquantia/aquantia_main.c | 242 ++++++++++++++++++++++++++++++-
>> 1 file changed, 240 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
>> index 86b0e63de5d88fa1050919a8826bdbec4bbcf8ba..38c6cf7814da1fb9a4e715f242249eee15a3cc85 100644
>> --- a/drivers/net/phy/aquantia/aquantia_main.c
>> +++ b/drivers/net/phy/aquantia/aquantia_main.c
>> @@ -33,6 +33,9 @@
>> #define PHY_ID_AQR115C 0x31c31c33
>> #define PHY_ID_AQR813 0x31c31cb2
>>
>> +#define MDIO_AN_10GBT_CTRL_ADV_LTIM BIT(0)
> This is a standard C45 definition, from :
> 45.2.7.10.15 10GBASE-T LD loop timing ability (7.32.0)
>
> So if you need this advertising capability, you should add that in the
> generic definitions for C45 registers in include/uapi/linux/mdio.h
Thanks. Wasn't aware this being a standard definition.
Wouldn't the definition
#define ADVERTISE_XNP BIT(12)
then need to go to include/uapi/linux/mii.h accordingly?
There, bit 12 is currently named ADVERTISE_RESV and commented as unused
(which it obviously is not, because it is used in
drivers/net/ethernet/sfc/falcon/mdio_10g.c
I think, for now, I will just do the same as in the falcon driver and
use ADVERTISE_RESV instead. Then it may be renamed later in all places.
>
> That being said, as it looks this is the first driver using this
> feature, do you actually need to advertise Loop Timing ability here ?
> I guess it comes from the vendor driver ?
you are right. The code just tries to replicate the vendor code.
However, I have now tested the driver without this flag and haven't
noticed any unusual behavior. So, I guess, it works indeed without.
I'll remove the flag in the next revision of the patch.
> Thanks,
>
> Maxime
Thanks as well,
Hans-Frieder
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus
2025-02-22 9:49 ` [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus Hans-Frieder Vogt via B4 Relay
@ 2025-02-24 4:08 ` Ratheesh Kannoth
2025-02-24 18:11 ` Hans-Frieder Vogt
0 siblings, 1 reply; 13+ messages in thread
From: Ratheesh Kannoth @ 2025-02-24 4:08 UTC (permalink / raw)
To: hfdevel
Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn, netdev, linux-kernel
On 2025-02-22 at 15:19:32, Hans-Frieder Vogt via B4 Relay (devnull+hfdevel.gmx.net@kernel.org) wrote:
> From: Hans-Frieder Vogt <hfdevel@gmx.net>
> int tn40_mdiobus_init(struct tn40_priv *priv)
> {
> struct pci_dev *pdev = priv->pdev;
> @@ -129,14 +181,36 @@ int tn40_mdiobus_init(struct tn40_priv *priv)
>
> bus->read_c45 = tn40_mdio_read_c45;
> bus->write_c45 = tn40_mdio_write_c45;
> + priv->mdio = bus;
> +
> + /* provide swnodes for AQR105-based cards only */
> + if (pdev->device == 0x4025) {
> + ret = tn40_swnodes_register(priv);
> + if (ret) {
> + pr_err("swnodes failed\n");
> + return ret;
> + }
> +
> + ret = device_add_software_node(&bus->dev,
> + priv->nodes.group[SWNODE_MDIO]);
> + if (ret) {
> + dev_err(&pdev->dev,
> + "device_add_software_node failed: %d\n", ret);
No need to return on this error ?
> + }
> + }
>
> ret = devm_mdiobus_register(&pdev->dev, bus);
> if (ret) {
> dev_err(&pdev->dev, "failed to register mdiobus %d %u %u\n",
> ret, bus->state, MDIOBUS_UNREGISTERED);
> - return ret;
> + goto err_swnodes_cleanup;
> }
> tn40_mdio_set_speed(priv, TN40_MDIO_SPEED_6MHZ);
> - priv->mdio = bus;
> return 0;
> +
> +err_swnodes_cleanup:
No need to call device_remove_software_node() ?
> + tn40_swnodes_cleanup(priv);
> + return ret;
> }
> +
> +MODULE_FIRMWARE(AQR105_FIRMWARE);
>
> --
> 2.47.2
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus
2025-02-24 4:08 ` Ratheesh Kannoth
@ 2025-02-24 18:11 ` Hans-Frieder Vogt
0 siblings, 0 replies; 13+ messages in thread
From: Hans-Frieder Vogt @ 2025-02-24 18:11 UTC (permalink / raw)
To: Ratheesh Kannoth
Cc: Andrew Lunn, Heiner Kallweit, Russell King, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, FUJITA Tomonori,
Andrew Lunn, netdev, linux-kernel
Hi Kannoth,
On 24.02.2025 05.08, Ratheesh Kannoth wrote:
> On 2025-02-22 at 15:19:32, Hans-Frieder Vogt via B4 Relay (devnull+hfdevel.gmx.net@kernel.org) wrote:
>> From: Hans-Frieder Vogt <hfdevel@gmx.net>
>> int tn40_mdiobus_init(struct tn40_priv *priv)
>> {
>> struct pci_dev *pdev = priv->pdev;
>> @@ -129,14 +181,36 @@ int tn40_mdiobus_init(struct tn40_priv *priv)
>>
>> bus->read_c45 = tn40_mdio_read_c45;
>> bus->write_c45 = tn40_mdio_write_c45;
>> + priv->mdio = bus;
>> +
>> + /* provide swnodes for AQR105-based cards only */
>> + if (pdev->device == 0x4025) {
>> + ret = tn40_swnodes_register(priv);
>> + if (ret) {
>> + pr_err("swnodes failed\n");
>> + return ret;
>> + }
>> +
>> + ret = device_add_software_node(&bus->dev,
>> + priv->nodes.group[SWNODE_MDIO]);
>> + if (ret) {
>> + dev_err(&pdev->dev,
>> + "device_add_software_node failed: %d\n", ret);
> No need to return on this error ?
Good catch. Yes, indeed, all TN4010-based cards that I know of need to
load the firmware from
the filesystem. And this will only work if the software node is
available to provide a file
name.
I'll add a
return ret;
in the next version.
>> + }
>> + }
>>
>> ret = devm_mdiobus_register(&pdev->dev, bus);
>> if (ret) {
>> dev_err(&pdev->dev, "failed to register mdiobus %d %u %u\n",
>> ret, bus->state, MDIOBUS_UNREGISTERED);
>> - return ret;
>> + goto err_swnodes_cleanup;
>> }
>> tn40_mdio_set_speed(priv, TN40_MDIO_SPEED_6MHZ);
>> - priv->mdio = bus;
>> return 0;
>> +
>> +err_swnodes_cleanup:
> No need to call device_remove_software_node() ?
It is called from tn40_swnodes_cleanup.
>> + tn40_swnodes_cleanup(priv);
>> + return ret;
>> }
>> +
>> +MODULE_FIRMWARE(AQR105_FIRMWARE);
>>
>> --
>> 2.47.2
>>
>>
Thanks,
Hans-Frieder
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver
2025-02-23 22:26 ` Hans-Frieder Vogt
@ 2025-02-25 9:38 ` Maxime Chevallier
0 siblings, 0 replies; 13+ messages in thread
From: Maxime Chevallier @ 2025-02-25 9:38 UTC (permalink / raw)
To: Hans-Frieder Vogt
Cc: Hans-Frieder Vogt via B4 Relay, Andrew Lunn, Heiner Kallweit,
Russell King, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, FUJITA Tomonori, Andrew Lunn, netdev, linux-kernel
On Sun, 23 Feb 2025 23:26:49 +0100
Hans-Frieder Vogt <hfdevel@gmx.net> wrote:
> Hi Maxime,
>
> On 23.02.2025 11.32, Maxime Chevallier wrote:
> > Hi,
> >
> > On Sat, 22 Feb 2025 10:49:31 +0100
> > Hans-Frieder Vogt via B4 Relay <devnull+hfdevel.gmx.net@kernel.org>
> > wrote:
> >
> >> From: Hans-Frieder Vogt <hfdevel@gmx.net>
> >>
> >> This patch makes functions that were provided for aqr107 applicable to
> >> aqr105, or replaces generic functions with specific ones. Since the aqr105
> >> was introduced before NBASE-T was defined (or 802.3bz), there are a number
> >> of vendor specific registers involved in the definition of the
> >> advertisement, in auto-negotiation and in the setting of the speed. The
> >> functions have been written following the downstream driver for TN4010
> >> cards with aqr105 PHY, and use code from aqr107 functions wherever it
> >> seemed to make sense.
> >>
> >> Signed-off-by: Hans-Frieder Vogt <hfdevel@gmx.net>
> >> ---
> >> drivers/net/phy/aquantia/aquantia_main.c | 242 ++++++++++++++++++++++++++++++-
> >> 1 file changed, 240 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
> >> index 86b0e63de5d88fa1050919a8826bdbec4bbcf8ba..38c6cf7814da1fb9a4e715f242249eee15a3cc85 100644
> >> --- a/drivers/net/phy/aquantia/aquantia_main.c
> >> +++ b/drivers/net/phy/aquantia/aquantia_main.c
> >> @@ -33,6 +33,9 @@
> >> #define PHY_ID_AQR115C 0x31c31c33
> >> #define PHY_ID_AQR813 0x31c31cb2
> >>
> >> +#define MDIO_AN_10GBT_CTRL_ADV_LTIM BIT(0)
> > This is a standard C45 definition, from :
> > 45.2.7.10.15 10GBASE-T LD loop timing ability (7.32.0)
> >
> > So if you need this advertising capability, you should add that in the
> > generic definitions for C45 registers in include/uapi/linux/mdio.h
> Thanks. Wasn't aware this being a standard definition.
>
> Wouldn't the definition
> #define ADVERTISE_XNP BIT(12)
> then need to go to include/uapi/linux/mii.h accordingly?
Looks like this is indeed part of the standard now, in
28.2.4.1.3 Auto-Negotiation advertisement register (Register 4), so it seems
to be the right move to modify ADVERTISE_RESV into ADVERTISE_XNP.
> There, bit 12 is currently named ADVERTISE_RESV and commented as unused
> (which it obviously is not, because it is used in
> drivers/net/ethernet/sfc/falcon/mdio_10g.c
One note is that this driver uses the C45 MMD 7 AN register layout :
45.2.7.1 AN control register (Register 7.0)
in which the eXtended Next Page bit is BIT(13).
That actually leads to an interesting point, as it appears the at803x.c
driver mixes both, which looks incorrect to me :
/* Ar803x extended next page bit is enabled by default. Cisco
* multigig switches read this bit and attempt to negotiate 10Gbps
* rates even if the next page bit is disabled. This is incorrect
* behaviour but we still need to accommodate it. XNP is only needed
* for 10Gbps support, so disable XNP.
*/
return phy_modify(phydev, MII_ADVERTISE, MDIO_AN_CTRL1_XNP, 0);
In such case, BIT(13) fot MII_ADVERTISE is ADVERTISE_RFAULT, if my
understanding of the spec is correct.
> I think, for now, I will just do the same as in the falcon driver and
> use ADVERTISE_RESV instead. Then it may be renamed later in all places.
Make sure you use the BIT(12) in your case indeed, looks to be the
right way in that case.
> >
> > That being said, as it looks this is the first driver using this
> > feature, do you actually need to advertise Loop Timing ability here ?
> > I guess it comes from the vendor driver ?
> you are right. The code just tries to replicate the vendor code.
> However, I have now tested the driver without this flag and haven't
> noticed any unusual behavior. So, I guess, it works indeed without.
> I'll remove the flag in the next revision of the patch.
So in that case, no need to define MDIO_AN_10GBT_CTRL_ADV_LTIM at all :)
Thanks,
Maxime
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-02-25 9:38 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-22 9:49 [PATCH net-next v5 0/7] net: tn40xx: add support for AQR105 based cards Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 1/7] net: phy: Add swnode support to mdiobus_scan Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 2/7] net: phy: aquantia: add probe function to aqr105 for firmware loading Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 3/7] net: phy: aquantia: search for firmware-name in fwnode Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 4/7] net: phy: aquantia: add essential functions to aqr105 driver Hans-Frieder Vogt via B4 Relay
2025-02-23 10:32 ` Maxime Chevallier
2025-02-23 22:26 ` Hans-Frieder Vogt
2025-02-25 9:38 ` Maxime Chevallier
2025-02-22 9:49 ` [PATCH net-next v5 5/7] net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus Hans-Frieder Vogt via B4 Relay
2025-02-24 4:08 ` Ratheesh Kannoth
2025-02-24 18:11 ` Hans-Frieder Vogt
2025-02-22 9:49 ` [PATCH net-next v5 6/7] net: tn40xx: prepare tn40xx driver to find phy of the TN9510 card Hans-Frieder Vogt via B4 Relay
2025-02-22 9:49 ` [PATCH net-next v5 7/7] net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards Hans-Frieder Vogt via B4 Relay
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).