123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- From: Birger Koblitz <[email protected]>
- Date: Sun, 5 Sep 2021 15:13:10 +0200
- Subject: [PATCH] kernel: Add AQR113C and AQR813 support
- This hack adds support for the Aquantia 4th generation, 10GBit
- PHYs AQR113C and AQR813.
- Signed-off-by: Birger Koblitz <[email protected]>
- --- a/drivers/net/phy/aquantia_main.c
- +++ b/drivers/net/phy/aquantia_main.c
- @@ -23,6 +23,7 @@
- #define PHY_ID_AQCS109 0x03a1b5c2
- #define PHY_ID_AQR405 0x03a1b4b0
- #define PHY_ID_AQR113C 0x31c31c12
- +#define PHY_ID_AQR813 0x31c31cb2
-
- #define MDIO_PHYXS_VEND_IF_STATUS 0xe812
- #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
- @@ -415,6 +416,49 @@ static int aqr107_read_rate(struct phy_d
- return 0;
- }
-
- +static int aqr113c_read_status(struct phy_device *phydev)
- +{
- + int val, ret;
- +
- + ret = aqr_read_status(phydev);
- + if (ret)
- + return ret;
- +
- + if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
- + return 0;
- +
- + // On AQR113C, the speed returned by aqr_read_status is wrong
- + aqr107_read_rate(phydev);
- +
- + val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
- + if (val < 0)
- + return val;
- +
- + 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_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_SGMII:
- + phydev->interface = PHY_INTERFACE_MODE_SGMII;
- + break;
- + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
- + phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
- + break;
- + default:
- + phydev->interface = PHY_INTERFACE_MODE_NA;
- + break;
- + }
- +
- + /* Read downshifted rate from vendor register */
- + return aqr107_read_rate(phydev);
- +}
- +
- static int aqr107_read_status(struct phy_device *phydev)
- {
- int val, ret;
- @@ -554,7 +598,7 @@ static void aqr107_chip_info(struct phy_
- build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
- prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
-
- - phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
- + phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
- fw_major, fw_minor, build_id, prov_id);
- }
-
- @@ -809,7 +853,7 @@ static struct phy_driver aqr_driver[] =
- .config_aneg = aqr_config_aneg,
- .config_intr = aqr_config_intr,
- .handle_interrupt = aqr_handle_interrupt,
- - .read_status = aqr107_read_status,
- + .read_status = aqr113c_read_status,
- .get_tunable = aqr107_get_tunable,
- .set_tunable = aqr107_set_tunable,
- .suspend = aqr107_suspend,
- @@ -819,6 +863,24 @@ static struct phy_driver aqr_driver[] =
- .get_stats = aqr107_get_stats,
- .link_change_notify = aqr107_link_change_notify,
- },
- +{
- + PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
- + .name = "Aquantia AQR813",
- + .probe = aqr107_probe,
- + .config_init = aqr107_config_init,
- + .config_aneg = aqr_config_aneg,
- + .config_intr = aqr_config_intr,
- + .handle_interrupt = aqr_handle_interrupt,
- + .read_status = aqr113c_read_status,
- + .get_tunable = aqr107_get_tunable,
- + .set_tunable = aqr107_set_tunable,
- + .suspend = aqr107_suspend,
- + .resume = aqr107_resume,
- + .get_sset_count = aqr107_get_sset_count,
- + .get_strings = aqr107_get_strings,
- + .get_stats = aqr107_get_stats,
- + .link_change_notify = aqr107_link_change_notify,
- +},
- };
-
- module_phy_driver(aqr_driver);
- @@ -832,6 +894,7 @@ static struct mdio_device_id __maybe_unu
- { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
- { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
- { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
- + { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
- { }
- };
-
|