最近在做phy芯片的作業,其中驅動中phydev->supported 代表fiber copper的位是錯誤的, 該位始終為copper,我們的應該是fiber。
無論怎么修改都是copper,我想請教的是:
1. phydev->supported代表的是什么?
2. phydev->supported的值是怎么得到的?獲取的硬體資訊?還是在哪被賦值了?
3. 如果phydev->suppoerted錯誤說明什么?怎么修改?
uj5u.com熱心網友回復:
樓主,你好,大膽回復一下哈!1、phydev->supported代表的應該是phy設備的支持能力,比如支持10M、100M、1000M這種;
2、它的值是在初始化的時候得到的,具體幾下面的代碼貼圖;
3、修改的話可以在這個初始化的函式里面嘗試去修改。
通用phy
int genphy_config_init(struct phy_device *phydev)
{
int val;
u32 features;
features = (SUPPORTED_TP | SUPPORTED_MII
| SUPPORTED_AUI | SUPPORTED_FIBRE |
SUPPORTED_BNC);
/* Do we support autonegotiation? */
val = phy_read(phydev, MII_BMSR);
if (val < 0)
return val;
if (val & BMSR_ANEGCAPABLE)
features |= SUPPORTED_Autoneg;
if (val & BMSR_100FULL)
features |= SUPPORTED_100baseT_Full;
if (val & BMSR_100HALF)
features |= SUPPORTED_100baseT_Half;
if (val & BMSR_10FULL)
features |= SUPPORTED_10baseT_Full;
if (val & BMSR_10HALF)
features |= SUPPORTED_10baseT_Half;
if (val & BMSR_ESTATEN) {
val = phy_read(phydev, MII_ESTATUS);
if (val < 0)
return val;
if (val & ESTATUS_1000_TFULL)
features |= SUPPORTED_1000baseT_Full;
if (val & ESTATUS_1000_THALF)
features |= SUPPORTED_1000baseT_Half;
}
phydev->supported &= features;
phydev->advertising &= features;
return 0;
}
ar8035 phy:
static int at803x_config_init(struct phy_device *phydev)
{
int val;
int ret;
u32 features;
features = SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_AUI |
SUPPORTED_FIBRE | SUPPORTED_BNC;
val = phy_read(phydev, MII_BMSR);
if (val < 0)
return val;
if (val & BMSR_ANEGCAPABLE)
features |= SUPPORTED_Autoneg;
if (val & BMSR_100FULL)
features |= SUPPORTED_100baseT_Full;
if (val & BMSR_100HALF)
features |= SUPPORTED_100baseT_Half;
if (val & BMSR_10FULL)
features |= SUPPORTED_10baseT_Full;
if (val & BMSR_10HALF)
features |= SUPPORTED_10baseT_Half;
if (val & BMSR_ESTATEN) {
val = phy_read(phydev, MII_ESTATUS);
if (val < 0)
return val;
if (val & ESTATUS_1000_TFULL)
features |= SUPPORTED_1000baseT_Full;
if (val & ESTATUS_1000_THALF)
features |= SUPPORTED_1000baseT_Half;
}
phydev->supported = features;
phydev->advertising = features;
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
ret = phy_write(phydev, AT803X_DEBUG_ADDR,
AT803X_DEBUG_SYSTEM_MODE_CTRL);
if (ret)
return ret;
ret = phy_write(phydev, AT803X_DEBUG_DATA,
AT803X_DEBUG_RGMII_TX_CLK_DLY);
if (ret)
return ret;
}
return 0;
}
其它的phy應該也是在類似的函式中對phydev->supported這個欄位進行初始化的
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/16100.html
標籤:內核源代碼研究區
上一篇:升級macOS Big Sur 下載完顯示軟體包"%@"缺失或無效.怎么辦?
下一篇:arm接收資料錯誤
