Commit 07445f3c authored by Raju Rangoju's avatar Raju Rangoju Committed by Paolo Abeni

amd-xgbe: Add support for 10 Mbps speed

Add the necessary changes to support 10 Mbps speed for BaseT and SFP
port modes. This is supported in MAC ver >= 30H.
Signed-off-by: default avatarRaju Rangoju <Raju.Rangoju@amd.com>
Link: https://lore.kernel.org/r/20230109101819.747572-1-Raju.Rangoju@amd.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent cbdbb58b
...@@ -807,6 +807,9 @@ static int xgbe_set_speed(struct xgbe_prv_data *pdata, int speed) ...@@ -807,6 +807,9 @@ static int xgbe_set_speed(struct xgbe_prv_data *pdata, int speed)
unsigned int ss; unsigned int ss;
switch (speed) { switch (speed) {
case SPEED_10:
ss = 0x07;
break;
case SPEED_1000: case SPEED_1000:
ss = 0x03; ss = 0x03;
break; break;
......
...@@ -274,6 +274,15 @@ static void xgbe_sgmii_1000_mode(struct xgbe_prv_data *pdata) ...@@ -274,6 +274,15 @@ static void xgbe_sgmii_1000_mode(struct xgbe_prv_data *pdata)
pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_1000); pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_1000);
} }
static void xgbe_sgmii_10_mode(struct xgbe_prv_data *pdata)
{
/* Set MAC to 10M speed */
pdata->hw_if.set_speed(pdata, SPEED_10);
/* Call PHY implementation support to complete rate change */
pdata->phy_if.phy_impl.set_mode(pdata, XGBE_MODE_SGMII_10);
}
static void xgbe_sgmii_100_mode(struct xgbe_prv_data *pdata) static void xgbe_sgmii_100_mode(struct xgbe_prv_data *pdata)
{ {
/* Set MAC to 1G speed */ /* Set MAC to 1G speed */
...@@ -306,6 +315,9 @@ static void xgbe_change_mode(struct xgbe_prv_data *pdata, ...@@ -306,6 +315,9 @@ static void xgbe_change_mode(struct xgbe_prv_data *pdata,
case XGBE_MODE_KR: case XGBE_MODE_KR:
xgbe_kr_mode(pdata); xgbe_kr_mode(pdata);
break; break;
case XGBE_MODE_SGMII_10:
xgbe_sgmii_10_mode(pdata);
break;
case XGBE_MODE_SGMII_100: case XGBE_MODE_SGMII_100:
xgbe_sgmii_100_mode(pdata); xgbe_sgmii_100_mode(pdata);
break; break;
...@@ -1074,6 +1086,8 @@ static const char *xgbe_phy_fc_string(struct xgbe_prv_data *pdata) ...@@ -1074,6 +1086,8 @@ static const char *xgbe_phy_fc_string(struct xgbe_prv_data *pdata)
static const char *xgbe_phy_speed_string(int speed) static const char *xgbe_phy_speed_string(int speed)
{ {
switch (speed) { switch (speed) {
case SPEED_10:
return "10Mbps";
case SPEED_100: case SPEED_100:
return "100Mbps"; return "100Mbps";
case SPEED_1000: case SPEED_1000:
...@@ -1161,6 +1175,7 @@ static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata) ...@@ -1161,6 +1175,7 @@ static int xgbe_phy_config_fixed(struct xgbe_prv_data *pdata)
case XGBE_MODE_KX_1000: case XGBE_MODE_KX_1000:
case XGBE_MODE_KX_2500: case XGBE_MODE_KX_2500:
case XGBE_MODE_KR: case XGBE_MODE_KR:
case XGBE_MODE_SGMII_10:
case XGBE_MODE_SGMII_100: case XGBE_MODE_SGMII_100:
case XGBE_MODE_SGMII_1000: case XGBE_MODE_SGMII_1000:
case XGBE_MODE_X: case XGBE_MODE_X:
...@@ -1222,6 +1237,8 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode) ...@@ -1222,6 +1237,8 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode)
xgbe_set_mode(pdata, XGBE_MODE_SGMII_1000); xgbe_set_mode(pdata, XGBE_MODE_SGMII_1000);
} else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) { } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) {
xgbe_set_mode(pdata, XGBE_MODE_SGMII_100); xgbe_set_mode(pdata, XGBE_MODE_SGMII_100);
} else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_10)) {
xgbe_set_mode(pdata, XGBE_MODE_SGMII_10);
} else { } else {
enable_irq(pdata->an_irq); enable_irq(pdata->an_irq);
ret = -EINVAL; ret = -EINVAL;
...@@ -1301,6 +1318,9 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) ...@@ -1301,6 +1318,9 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata)
mode = xgbe_phy_status_aneg(pdata); mode = xgbe_phy_status_aneg(pdata);
switch (mode) { switch (mode) {
case XGBE_MODE_SGMII_10:
pdata->phy.speed = SPEED_10;
break;
case XGBE_MODE_SGMII_100: case XGBE_MODE_SGMII_100:
pdata->phy.speed = SPEED_100; pdata->phy.speed = SPEED_100;
break; break;
...@@ -1443,6 +1463,8 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata) ...@@ -1443,6 +1463,8 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata)
xgbe_sgmii_1000_mode(pdata); xgbe_sgmii_1000_mode(pdata);
} else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) { } else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_100)) {
xgbe_sgmii_100_mode(pdata); xgbe_sgmii_100_mode(pdata);
} else if (xgbe_use_mode(pdata, XGBE_MODE_SGMII_10)) {
xgbe_sgmii_10_mode(pdata);
} else { } else {
ret = -EINVAL; ret = -EINVAL;
goto err_irq; goto err_irq;
...@@ -1540,6 +1562,8 @@ static int xgbe_phy_best_advertised_speed(struct xgbe_prv_data *pdata) ...@@ -1540,6 +1562,8 @@ static int xgbe_phy_best_advertised_speed(struct xgbe_prv_data *pdata)
return SPEED_1000; return SPEED_1000;
else if (XGBE_ADV(lks, 100baseT_Full)) else if (XGBE_ADV(lks, 100baseT_Full))
return SPEED_100; return SPEED_100;
else if (XGBE_ADV(lks, 10baseT_Full))
return SPEED_10;
return SPEED_UNKNOWN; return SPEED_UNKNOWN;
} }
......
This diff is collapsed.
...@@ -293,6 +293,7 @@ ...@@ -293,6 +293,7 @@
#define XGBE_SGMII_AN_LINK_STATUS BIT(1) #define XGBE_SGMII_AN_LINK_STATUS BIT(1)
#define XGBE_SGMII_AN_LINK_SPEED (BIT(2) | BIT(3)) #define XGBE_SGMII_AN_LINK_SPEED (BIT(2) | BIT(3))
#define XGBE_SGMII_AN_LINK_SPEED_10 0x00
#define XGBE_SGMII_AN_LINK_SPEED_100 0x04 #define XGBE_SGMII_AN_LINK_SPEED_100 0x04
#define XGBE_SGMII_AN_LINK_SPEED_1000 0x08 #define XGBE_SGMII_AN_LINK_SPEED_1000 0x08
#define XGBE_SGMII_AN_LINK_DUPLEX BIT(4) #define XGBE_SGMII_AN_LINK_DUPLEX BIT(4)
...@@ -594,6 +595,7 @@ enum xgbe_mode { ...@@ -594,6 +595,7 @@ enum xgbe_mode {
XGBE_MODE_KX_2500, XGBE_MODE_KX_2500,
XGBE_MODE_KR, XGBE_MODE_KR,
XGBE_MODE_X, XGBE_MODE_X,
XGBE_MODE_SGMII_10,
XGBE_MODE_SGMII_100, XGBE_MODE_SGMII_100,
XGBE_MODE_SGMII_1000, XGBE_MODE_SGMII_1000,
XGBE_MODE_SFI, XGBE_MODE_SFI,
......
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