Commit 4d945663 authored by Tom Lendacky's avatar Tom Lendacky Committed by David S. Miller

amd-xgbe: Add pre/post auto-negotiation phy hooks

Add hooks to the driver auto-negotiation (AN) flow to allow the different
phy implementations to perform any steps necessary to improve AN.
Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a49e2f5d
...@@ -437,6 +437,9 @@ static void xgbe_an73_disable(struct xgbe_prv_data *pdata) ...@@ -437,6 +437,9 @@ static void xgbe_an73_disable(struct xgbe_prv_data *pdata)
static void xgbe_an_restart(struct xgbe_prv_data *pdata) static void xgbe_an_restart(struct xgbe_prv_data *pdata)
{ {
if (pdata->phy_if.phy_impl.an_pre)
pdata->phy_if.phy_impl.an_pre(pdata);
switch (pdata->an_mode) { switch (pdata->an_mode) {
case XGBE_AN_MODE_CL73: case XGBE_AN_MODE_CL73:
case XGBE_AN_MODE_CL73_REDRV: case XGBE_AN_MODE_CL73_REDRV:
...@@ -453,6 +456,9 @@ static void xgbe_an_restart(struct xgbe_prv_data *pdata) ...@@ -453,6 +456,9 @@ static void xgbe_an_restart(struct xgbe_prv_data *pdata)
static void xgbe_an_disable(struct xgbe_prv_data *pdata) static void xgbe_an_disable(struct xgbe_prv_data *pdata)
{ {
if (pdata->phy_if.phy_impl.an_post)
pdata->phy_if.phy_impl.an_post(pdata);
switch (pdata->an_mode) { switch (pdata->an_mode) {
case XGBE_AN_MODE_CL73: case XGBE_AN_MODE_CL73:
case XGBE_AN_MODE_CL73_REDRV: case XGBE_AN_MODE_CL73_REDRV:
...@@ -637,11 +643,11 @@ static enum xgbe_an xgbe_an73_incompat_link(struct xgbe_prv_data *pdata) ...@@ -637,11 +643,11 @@ static enum xgbe_an xgbe_an73_incompat_link(struct xgbe_prv_data *pdata)
return XGBE_AN_NO_LINK; return XGBE_AN_NO_LINK;
} }
xgbe_an73_disable(pdata); xgbe_an_disable(pdata);
xgbe_switch_mode(pdata); xgbe_switch_mode(pdata);
xgbe_an73_restart(pdata); xgbe_an_restart(pdata);
return XGBE_AN_INCOMPAT_LINK; return XGBE_AN_INCOMPAT_LINK;
} }
...@@ -820,6 +826,9 @@ static void xgbe_an37_state_machine(struct xgbe_prv_data *pdata) ...@@ -820,6 +826,9 @@ static void xgbe_an37_state_machine(struct xgbe_prv_data *pdata)
pdata->an_result = pdata->an_state; pdata->an_result = pdata->an_state;
pdata->an_state = XGBE_AN_READY; pdata->an_state = XGBE_AN_READY;
if (pdata->phy_if.phy_impl.an_post)
pdata->phy_if.phy_impl.an_post(pdata);
netif_dbg(pdata, link, pdata->netdev, "CL37 AN result: %s\n", netif_dbg(pdata, link, pdata->netdev, "CL37 AN result: %s\n",
xgbe_state_as_string(pdata->an_result)); xgbe_state_as_string(pdata->an_result));
} }
...@@ -903,6 +912,9 @@ static void xgbe_an73_state_machine(struct xgbe_prv_data *pdata) ...@@ -903,6 +912,9 @@ static void xgbe_an73_state_machine(struct xgbe_prv_data *pdata)
pdata->kx_state = XGBE_RX_BPA; pdata->kx_state = XGBE_RX_BPA;
pdata->an_start = 0; pdata->an_start = 0;
if (pdata->phy_if.phy_impl.an_post)
pdata->phy_if.phy_impl.an_post(pdata);
netif_dbg(pdata, link, pdata->netdev, "CL73 AN result: %s\n", netif_dbg(pdata, link, pdata->netdev, "CL73 AN result: %s\n",
xgbe_state_as_string(pdata->an_result)); xgbe_state_as_string(pdata->an_result));
} }
......
...@@ -833,6 +833,7 @@ struct xgbe_hw_if { ...@@ -833,6 +833,7 @@ struct xgbe_hw_if {
/* This structure represents implementation specific routines for an /* This structure represents implementation specific routines for an
* implementation of a PHY. All routines are required unless noted below. * implementation of a PHY. All routines are required unless noted below.
* Optional routines: * Optional routines:
* an_pre, an_post
* kr_training_pre, kr_training_post * kr_training_pre, kr_training_post
*/ */
struct xgbe_phy_impl_if { struct xgbe_phy_impl_if {
...@@ -875,6 +876,10 @@ struct xgbe_phy_impl_if { ...@@ -875,6 +876,10 @@ struct xgbe_phy_impl_if {
/* Process results of auto-negotiation */ /* Process results of auto-negotiation */
enum xgbe_mode (*an_outcome)(struct xgbe_prv_data *); enum xgbe_mode (*an_outcome)(struct xgbe_prv_data *);
/* Pre/Post auto-negotiation support */
void (*an_pre)(struct xgbe_prv_data *);
void (*an_post)(struct xgbe_prv_data *);
/* Pre/Post KR training enablement support */ /* Pre/Post KR training enablement support */
void (*kr_training_pre)(struct xgbe_prv_data *); void (*kr_training_pre)(struct xgbe_prv_data *);
void (*kr_training_post)(struct xgbe_prv_data *); void (*kr_training_post)(struct xgbe_prv_data *);
......
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