cxgb3: allow for PHY reset status
First step towards overall PHY layering re-organization. Allow a status return when a PHY is reset. Signed-off-by: Divy Le Ray <divy@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8c26376112
commit
78e4689e90
4 changed files with 37 additions and 27 deletions
|
@ -119,11 +119,12 @@ static struct cphy_ops ael1002_ops = {
|
||||||
.power_down = ael1002_power_down,
|
.power_down = ael1002_power_down,
|
||||||
};
|
};
|
||||||
|
|
||||||
void t3_ael1002_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_ael1002_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops)
|
int phy_addr, const struct mdio_ops *mdio_ops)
|
||||||
{
|
{
|
||||||
cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops);
|
cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops);
|
||||||
ael100x_txon(phy);
|
ael100x_txon(phy);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ael1006_reset(struct cphy *phy, int wait)
|
static int ael1006_reset(struct cphy *phy, int wait)
|
||||||
|
@ -174,11 +175,12 @@ static struct cphy_ops ael1006_ops = {
|
||||||
.power_down = ael1006_power_down,
|
.power_down = ael1006_power_down,
|
||||||
};
|
};
|
||||||
|
|
||||||
void t3_ael1006_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_ael1006_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops)
|
int phy_addr, const struct mdio_ops *mdio_ops)
|
||||||
{
|
{
|
||||||
cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops);
|
cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops);
|
||||||
ael100x_txon(phy);
|
ael100x_txon(phy);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cphy_ops qt2045_ops = {
|
static struct cphy_ops qt2045_ops = {
|
||||||
|
@ -191,8 +193,8 @@ static struct cphy_ops qt2045_ops = {
|
||||||
.power_down = ael1006_power_down,
|
.power_down = ael1006_power_down,
|
||||||
};
|
};
|
||||||
|
|
||||||
void t3_qt2045_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_qt2045_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops)
|
int phy_addr, const struct mdio_ops *mdio_ops)
|
||||||
{
|
{
|
||||||
unsigned int stat;
|
unsigned int stat;
|
||||||
|
|
||||||
|
@ -205,6 +207,7 @@ void t3_qt2045_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
|
if (!phy_addr && !mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMSR, &stat) &&
|
||||||
stat == 0xffff)
|
stat == 0xffff)
|
||||||
phy->addr = 1;
|
phy->addr = 1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xaui_direct_reset(struct cphy *phy, int wait)
|
static int xaui_direct_reset(struct cphy *phy, int wait)
|
||||||
|
@ -250,8 +253,9 @@ static struct cphy_ops xaui_direct_ops = {
|
||||||
.power_down = xaui_direct_power_down,
|
.power_down = xaui_direct_power_down,
|
||||||
};
|
};
|
||||||
|
|
||||||
void t3_xaui_direct_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_xaui_direct_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops)
|
int phy_addr, const struct mdio_ops *mdio_ops)
|
||||||
{
|
{
|
||||||
cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops);
|
cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -203,8 +203,8 @@ struct adapter_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct port_type_info {
|
struct port_type_info {
|
||||||
void (*phy_prep)(struct cphy *phy, struct adapter *adapter,
|
int (*phy_prep)(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *ops);
|
int phy_addr, const struct mdio_ops *ops);
|
||||||
unsigned int caps;
|
unsigned int caps;
|
||||||
const char *desc;
|
const char *desc;
|
||||||
};
|
};
|
||||||
|
@ -776,14 +776,14 @@ int t3_sge_read_rspq(struct adapter *adapter, unsigned int id, u32 data[4]);
|
||||||
int t3_sge_cqcntxt_op(struct adapter *adapter, unsigned int id, unsigned int op,
|
int t3_sge_cqcntxt_op(struct adapter *adapter, unsigned int id, unsigned int op,
|
||||||
unsigned int credits);
|
unsigned int credits);
|
||||||
|
|
||||||
void t3_vsc8211_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_vsc8211_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops);
|
int phy_addr, const struct mdio_ops *mdio_ops);
|
||||||
void t3_ael1002_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_ael1002_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops);
|
int phy_addr, const struct mdio_ops *mdio_ops);
|
||||||
void t3_ael1006_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_ael1006_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops);
|
int phy_addr, const struct mdio_ops *mdio_ops);
|
||||||
void t3_qt2045_phy_prep(struct cphy *phy, struct adapter *adapter, int phy_addr,
|
int t3_qt2045_phy_prep(struct cphy *phy, struct adapter *adapter, int phy_addr,
|
||||||
const struct mdio_ops *mdio_ops);
|
const struct mdio_ops *mdio_ops);
|
||||||
void t3_xaui_direct_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_xaui_direct_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops);
|
int phy_addr, const struct mdio_ops *mdio_ops);
|
||||||
#endif /* __CHELSIO_COMMON_H */
|
#endif /* __CHELSIO_COMMON_H */
|
||||||
|
|
|
@ -3626,8 +3626,11 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
|
||||||
++j;
|
++j;
|
||||||
|
|
||||||
p->port_type = &port_types[adapter->params.vpd.port_type[j]];
|
p->port_type = &port_types[adapter->params.vpd.port_type[j]];
|
||||||
p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j,
|
ret = p->port_type->phy_prep(&p->phy, adapter,
|
||||||
ai->mdio_ops);
|
ai->phy_base_addr + j,
|
||||||
|
ai->mdio_ops);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
mac_prep(&p->mac, adapter, j);
|
mac_prep(&p->mac, adapter, j);
|
||||||
++j;
|
++j;
|
||||||
|
|
||||||
|
@ -3674,9 +3677,11 @@ int t3_replay_prep_adapter(struct adapter *adapter)
|
||||||
while (!adapter->params.vpd.port_type[j])
|
while (!adapter->params.vpd.port_type[j])
|
||||||
++j;
|
++j;
|
||||||
|
|
||||||
p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j,
|
ret = p->port_type->phy_prep(&p->phy, adapter,
|
||||||
ai->mdio_ops);
|
ai->phy_base_addr + j,
|
||||||
|
ai->mdio_ops);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
p->phy.ops->power_down(&p->phy, 1);
|
p->phy.ops->power_down(&p->phy, 1);
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,8 +221,9 @@ static struct cphy_ops vsc8211_ops = {
|
||||||
.power_down = vsc8211_power_down,
|
.power_down = vsc8211_power_down,
|
||||||
};
|
};
|
||||||
|
|
||||||
void t3_vsc8211_phy_prep(struct cphy *phy, struct adapter *adapter,
|
int t3_vsc8211_phy_prep(struct cphy *phy, struct adapter *adapter,
|
||||||
int phy_addr, const struct mdio_ops *mdio_ops)
|
int phy_addr, const struct mdio_ops *mdio_ops)
|
||||||
{
|
{
|
||||||
cphy_init(phy, adapter, phy_addr, &vsc8211_ops, mdio_ops);
|
cphy_init(phy, adapter, phy_addr, &vsc8211_ops, mdio_ops);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue