net: phy: Introduce PSGMII PHY interface mode
authorGabor Juhos <j4g8y7@gmail.com>
Fri, 11 Aug 2023 11:10:07 +0000 (13:10 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 14 Aug 2023 07:12:53 +0000 (08:12 +0100)
The PSGMII interface is similar to QSGMII. The main difference
is that the PSGMII interface combines five SGMII lines into a
single link while in QSGMII only four lines are combined.

Similarly to the QSGMII, this interface mode might also needs
special handling within the MAC driver.

It is commonly used by Qualcomm with their QCA807x PHY series and
modern WiSoC-s.

Add definitions for the PHY layer to allow to express this type
of connection between the MAC and PHY.

Signed-off-by: Gabor Juhos <j4g8y7@gmail.com>
Signed-off-by: Robert Marko <robert.marko@sartura.hr>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/phy.rst
drivers/net/phy/phy-core.c
drivers/net/phy/phylink.c
include/linux/phy.h

index b7ac4c64cf679b90d2f71a5881def625d6c27431..1283240d7620bd88fc7af11685752ab023686e43 100644 (file)
@@ -323,6 +323,10 @@ Some of the interface modes are described below:
     contrast with the 1000BASE-X phy mode used for Clause 38 and 39 PMDs, this
     interface mode has different autonegotiation and only supports full duplex.
 
+``PHY_INTERFACE_MODE_PSGMII``
+    This is the Penta SGMII mode, it is similar to QSGMII but it combines 5
+    SGMII lines into a single link compared to 4 on QSGMII.
+
 Pause frames / flow control
 ===========================
 
index a64186dc53f8b656eda335117ca45c126e62813b..966c93cbe61641c10c59a1b93c62d3a3ce47218e 100644 (file)
@@ -142,6 +142,8 @@ int phy_interface_num_ports(phy_interface_t interface)
        case PHY_INTERFACE_MODE_QSGMII:
        case PHY_INTERFACE_MODE_QUSGMII:
                return 4;
+       case PHY_INTERFACE_MODE_PSGMII:
+               return 5;
        case PHY_INTERFACE_MODE_MAX:
                WARN_ONCE(1, "PHY_INTERFACE_MODE_MAX isn't a valid interface mode");
                return 0;
index 4f1c8bb199e9f425fc2ae7b81e66810b596be1ec..160bce608c34326ef196bdc255cd24f7cc1156c9 100644 (file)
@@ -210,6 +210,7 @@ static int phylink_interface_max_speed(phy_interface_t interface)
        case PHY_INTERFACE_MODE_RGMII_RXID:
        case PHY_INTERFACE_MODE_RGMII_ID:
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_PSGMII:
        case PHY_INTERFACE_MODE_QSGMII:
        case PHY_INTERFACE_MODE_QUSGMII:
        case PHY_INTERFACE_MODE_SGMII:
@@ -475,6 +476,7 @@ unsigned long phylink_get_capabilities(phy_interface_t interface,
        case PHY_INTERFACE_MODE_RGMII_RXID:
        case PHY_INTERFACE_MODE_RGMII_ID:
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_PSGMII:
        case PHY_INTERFACE_MODE_QSGMII:
        case PHY_INTERFACE_MODE_QUSGMII:
        case PHY_INTERFACE_MODE_SGMII:
@@ -868,6 +870,7 @@ static int phylink_parse_mode(struct phylink *pl,
 
                switch (pl->link_config.interface) {
                case PHY_INTERFACE_MODE_SGMII:
+               case PHY_INTERFACE_MODE_PSGMII:
                case PHY_INTERFACE_MODE_QSGMII:
                case PHY_INTERFACE_MODE_QUSGMII:
                case PHY_INTERFACE_MODE_RGMII:
index 3c1ceedd1b7713838bf22b2b4545830c872f0eec..1351b802ffcff16969e73fe6e4be9a150035a43b 100644 (file)
@@ -110,6 +110,7 @@ extern const int phy_10gbit_features_array[1];
  * @PHY_INTERFACE_MODE_XGMII: 10 gigabit media-independent interface
  * @PHY_INTERFACE_MODE_XLGMII:40 gigabit media-independent interface
  * @PHY_INTERFACE_MODE_MOCA: Multimedia over Coax
+ * @PHY_INTERFACE_MODE_PSGMII: Penta SGMII
  * @PHY_INTERFACE_MODE_QSGMII: Quad SGMII
  * @PHY_INTERFACE_MODE_TRGMII: Turbo RGMII
  * @PHY_INTERFACE_MODE_100BASEX: 100 BaseX
@@ -147,6 +148,7 @@ typedef enum {
        PHY_INTERFACE_MODE_XGMII,
        PHY_INTERFACE_MODE_XLGMII,
        PHY_INTERFACE_MODE_MOCA,
+       PHY_INTERFACE_MODE_PSGMII,
        PHY_INTERFACE_MODE_QSGMII,
        PHY_INTERFACE_MODE_TRGMII,
        PHY_INTERFACE_MODE_100BASEX,
@@ -254,6 +256,8 @@ static inline const char *phy_modes(phy_interface_t interface)
                return "xlgmii";
        case PHY_INTERFACE_MODE_MOCA:
                return "moca";
+       case PHY_INTERFACE_MODE_PSGMII:
+               return "psgmii";
        case PHY_INTERFACE_MODE_QSGMII:
                return "qsgmii";
        case PHY_INTERFACE_MODE_TRGMII: