GMAC網卡Fixed-Link模式

来源:https://www.cnblogs.com/forwards/archive/2023/11/27/17859265.html
-Advertisement-
Play Games

GMAC網卡Fixed-Link模式GMACfixed-link固定鏈接模式,mac與對端的連接方式是寫死的,通常用於mac to mac(不排除mac to phy的情況)。內核要支持fixed-link模式,需要打開CONFIG_FIXED_PHY配置。 社區版linux的gmac網卡platf ...


GMAC網卡Fixed-Link模式

GMAC

fixed-link固定鏈接模式,mac與對端的連接方式是寫死的,通常用於mac to mac(不排除mac to phy的情況)。內核要支持fixed-link模式,需要打開CONFIG_FIXED_PHY配置。

社區版linux的gmac網卡platform平臺驅動中,在設備樹預設下支持fixed-link,gmac網卡platform平臺驅動預設不支持ACPI模式。

fixed-link模式的實現,概括起來就兩步,

  • 通過fixed_phy_register創建phy device
  • 連接phy device

fixed-link的link狀態通常是固定的,但也可以通過gpio GPIOF_DIR_IN寄存器獲取。

設備樹Fixed-Link實現

以4.19.90內核版本為例其實現方式如下(內核版本5.3之後使用phylink替代了phy lib,實現介面有所不同):

設備樹配置中定義fixed-link屬性

設備樹fixed-link配置
設備樹fixed-link配置

stmac驅動實現of_phy_register_fixed_link函數讀取設備樹fixed-link屬性並通過fixed_phy_register創建phy device,of_phy_connect連接phy device。

stmmac_platform.c:
static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,
             struct device_node *np, struct device *dev)
{
... ...
    /* If phy-handle is not specified, check if we have a fixed-phy */
    if (!plat->phy_node && of_phy_is_fixed_link(np)) {
		if ((of_phy_register_fixed_link(np) < 0))
            return -ENODEV;

        dev_dbg(dev, "Found fixed-link subnode\n");
        plat->phy_node = of_node_get(np);
        mdio = false;
    }
... ...
}

stmmac_main.c:
static int stmmac_init_phy(struct net_device *dev)
{
... ...
	if (priv->plat->phy_node) {
		phydev = of_phy_connect(dev, priv->plat->phy_node,
					&stmmac_adjust_link, 0, interface);
... ...
}

通過of_phy_register_fixed_link函數可知,fixed-link的配置方式不只一種

/drivers/of/of_mdio.c:
int of_phy_register_fixed_link(struct device_node *np)
{
	struct fixed_phy_status status = {};
	struct device_node *fixed_link_node;
	u32 fixed_link_prop[5];
	const char *managed;
	int link_gpio = -1;

	if (of_property_read_string(np, "managed", &managed) == 0 &&
	    strcmp(managed, "in-band-status") == 0) {
		/* status is zeroed, namely its .link member */
		goto register_phy;
	}

	/* New binding */
	fixed_link_node = of_get_child_by_name(np, "fixed-link");
	if (fixed_link_node) {
		status.link = 1;
		status.duplex = of_property_read_bool(fixed_link_node,
						      "full-duplex");
		if (of_property_read_u32(fixed_link_node, "speed",
					 &status.speed)) {
			of_node_put(fixed_link_node);
			return -EINVAL;
		}
		status.pause = of_property_read_bool(fixed_link_node, "pause");
		status.asym_pause = of_property_read_bool(fixed_link_node,
							  "asym-pause");
		link_gpio = of_get_named_gpio_flags(fixed_link_node,
						    "link-gpios", 0, NULL);
		of_node_put(fixed_link_node);
		if (link_gpio == -EPROBE_DEFER)
			return -EPROBE_DEFER;

		goto register_phy;
	}

	/* Old binding */
	if (of_property_read_u32_array(np, "fixed-link", fixed_link_prop,
				       ARRAY_SIZE(fixed_link_prop)) == 0) {
		status.link = 1;
		status.duplex = fixed_link_prop[1];
		status.speed  = fixed_link_prop[2];
		status.pause  = fixed_link_prop[3];
		status.asym_pause = fixed_link_prop[4];
		goto register_phy;
	}

	return -ENODEV;

register_phy:
	return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, link_gpio,
						  np));
}
EXPORT_SYMBOL(of_phy_register_fixed_link);

ACPI Fixed-Link實現

本質上ACPI和設備樹fixed-link實現是一致的,只是部分介面函數不同,ACPI下可以使用phy_connect_direct進行連接(5.3之後的內核版本使用phylink模式,連接函數是phylink_connect_phy)。

stmmac_platform.c:
int fw_phy_register_fixed_link(struct fwnode_handle *np,
			       struct plat_stmmacenet_data *plat)
{
	struct fixed_phy_status status = {};
	u32 fixed_link_prop[5];
	int size = 5, err;
	int link_gpio = -1;
	struct phy_device *phydev = NULL;

	if (FORCE_FIXED_LINK) {
		status.link = 1;
		status.duplex = DUPLEX_FULL;
		status.speed = SPEED_1000;
		pr_info("force fixed-link busid %d\n", plat->bus_id);
	} else {
		err = fwnode_property_read_u32_array(np, "fixed-link", fixed_link_prop, size);
		if (err) {
			pr_err("----there is no fixed-link property in DSD--\n");
			return 0;
		}
		status.link = 1;
		status.duplex = fixed_link_prop[1];
		status.speed = fixed_link_prop[2];
		status.pause  = fixed_link_prop[3];
		status.asym_pause = fixed_link_prop[4];
	}

	phydev = fixed_phy_register(PHY_POLL, &status, link_gpio, 0);
	if (IS_ERR(phydev)) {
		pr_err("fixed_phy_register failed\n");
		return -1;
	}
	plat->fixedphydev = phydev;
	return 0;
}

stmmac_main.c:
static int stmmac_init_phy(struct net_device *dev)
{
... ...
if (priv->plat->fixedphydev) {
		phydev = priv->plat->fixedphydev;
		if (phy_connect_direct(dev, phydev, &stmmac_adjust_link,
				       interface)) {
			netdev_err(priv->dev, "phy_connect_direct failed\n");
			phydev = NULL;
}
... ...
}

本文來自博客園,作者:StepForwards,轉載請註明原文鏈接:https://www.cnblogs.com/forwards/p/17859265.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MVC 的過濾器(Filters)也翻譯為“篩選器”。但是老周更喜歡翻譯為“過濾器”,意思上更好理解。 既然都叫過濾器了,就是在MVC的操作方法調用前後進行特殊處理的類型。比如: a、此調用是否已授權? b、在模型綁定之前要不要修改數據源?(可能含有兒童不宜的數據) c、在調用MVC方法前要不要改一 ...
  • 需要有的知識點: c# 基礎以及c#高級基礎 Ado.net 基礎 SqlServer 以及MySQL (都需要高級部分) Asp.net Mvc Core 基礎 1. 新手的煩惱 (1) SQL 拼不對,錯還不會找 (2) 開發效率低 (3) 如果發現欄位需要重命名,得挨個地方去修改 (4) 老闆 ...
  • 在 .NET Core 中,日誌是一個非常重要的組件,它可以幫助我們記錄應用程式的運行情況,以便在出現問題時進行排查。在本文中,我們將介紹五個優秀的 .NET Core 日誌框架,它們分別是 Serilog、NLog、Log4Net、Microsoft.Extensions.Logging 和 Lo ...
  • 1. 平均負載 平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和CPU使用率並沒有直接關係。 可運行狀態的進程是指正在使用CPU或者等待CPU資源的進程。當我們使用類似於"ps"命令時,這些進程通常以"R"狀態(Running或Runnable)顯示。 ...
  • 哈嘍大家好,我是鹹魚 今天我們繼續來講一講 Kafka 當有消息被生產出來的時候,如果沒有指定分區或者指定 key ,那麼消費會按照【輪詢】的方式均勻地分配到所有可用分區中,但不一定按照分區順序來分配 我們知道,在 Kafka 中消費者可以訂閱一個或多個主題,並被分配一個或多個分區 如果一個消費者消 ...
  • Linux 內核從 2.5 版本開始針對 NUMA 架構做了大量優化工作,同時也提供了豐富的工具和介面,可以幫助我們很容易的完成訪問本地記憶體的設置。所以,通過適當的性能調優,可以提供更高的計算能力。 性能優化通常可以通過五個步驟完成 ...
  • Proj4:改進LiteOS中物理記憶體分配演算法 實驗目的 掌握LiteOS系統調用的自定義方法 實驗環境 Ubantu和IMX6ULL mini 實驗內容 (從代碼角度詳細描述實驗的步驟和過程) 原先代碼: 1 /* 2 3 * Description : find suitable free bl ...
  • Shell使用 在圖標和視窗占據電腦屏幕之前。需要輸入命令與大多數電腦進行交互。在UNIX系統(Linux系統派生自該系統)中,用來解釋和管理命令的程式稱為shell。 Shell類型: Bash shell,Bourne Again Shell,預設shell。 BSD UNIX用戶中流行的C ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...