乙太網驅動的流程淺析(四)-乙太網驅動probe流程【原創】

来源:https://www.cnblogs.com/sky-heaven/archive/2019/11/27/11942133.html
-Advertisement-
Play Games

乙太網驅動的流程淺析(四) 乙太網驅動probe流程 Author:張昺華 Email:[email protected] Time:2019年3月23日星期六 此文也在我的個人公眾號以及《Linux內核之旅》上有發表: "乙太網驅動的流程淺析(四) 乙太網驅動probe流程" 乙太網驅動probe流 ...


乙太網驅動的流程淺析(四)-乙太網驅動probe流程

Author:張昺華
Email:[email protected]
Time:2019年3月23日星期六

此文也在我的個人公眾號以及《Linux內核之旅》上有發表:乙太網驅動的流程淺析(四)-乙太網驅動probe流程

很喜歡一群人在研究技術,一起做有意思的東西,一起分享技術帶給我們的快樂,也希望中國有更多的人熱愛技術,喜歡一起研究、分享技術,然後可以一起用我們的技術來做一些好玩的東西,可以為這個社會創造一些東西來改善人們的生活。

如下是本人調試過程中的一點經驗分享,乙太網驅動架構畢竟涉及的東西太多,如下僅僅是針對載入流程和圍繞這個問題產生的分析過程和驅動載入流程部分,並不涉及乙太網協議層的數據流程分析。

【硬體環境】 Imx6ul

【Linux kernel版本】 Linux4.1.15

【乙太網phy】 Realtek8201f

1.1. 乙太網驅動probe流程

1.1 乙太網初始化

fec_main.c   fec_probe
=>fec_enet_mii_init

   =>of_get_child_by_name(pdev->dev.of_node, "mdio");
     of_mdiobus_register(fep->mii_bus, node);

               =>rc = of_mdiobus_register_phy(mdio, child, addr);

                 => phy = get_phy_device(mdio, addr, is_c45);
                    rc = phy_device_register(phy);

搞驅動的都知道,probe是drvier的入口函數:

這個 probe中主要做了哪些事情呢?以下我只寫主要的一些,不是全部的。
struct net_device *ndev;這裡對net_device進行初始化,分配記憶體

接下來做如下動作,註釋都很明顯,我就不解釋了,
struct fec_enet_private *fep;

獲取時鐘:

使能clk,fec_enet_clk_enable(ndev, true);
複位phy,硬體複位,具體取決於不同phy的datasheet的reset時序,fec_reset_phy(pdev);
一些初始化動作,fec_enet_init(ndev);由於代碼註釋寫的很好,上代碼:

1.2 獲取乙太網mac地址

這裡獲取mac 地址的流程我要說一下,之前有講過流程,我這裡再提一下:
1) 模塊化參數設置,如果沒有跳到步驟2

2) device tree中設置,如果沒有跳到步驟3;

3) from flash / fuse / via platform data,如果沒有跳到步驟4;

4) FEC mac registers set by bootloader===》即靠usb方式下載mac address ,如果沒有跳到步驟5;

5) 靠kernel算一個隨機數mac address出來,然後寫入mac

所以最後一種方式就是kernel會自己算一個mac地址出來,我這裡有個前提是這個是freescale(現在被nxp收購了)的控制器代碼這樣寫的,我不確定其他廠商的控制器是否也是這樣的流程,技術講究嚴謹,所以這裡不能一概而論。當然這個mac 地址也是可以用戶自己在dts中進行自行配置的。

這裡就是kernel隨機數的介面了,會總隨機池中獲取一個隨機數並返回。

大家看到那些獲取mac address的步驟中有這樣的函數
is_valid_ether_addr,用來檢測乙太網地址是否正確的

因此我們從代碼中可以看出,內核認為全0或者是全FF的乙太網地址是不正確的,
獲取了mac 地址後,就會通過寄存器寫入mac中

CONFIG_ARCH_MXC因為我們使用的是這個巨集,因此:

否則:

設置buffer傳輸的基地址

提供一些乙太網控制器的操作介面,應用層調用socket通信最終的實現介面方式,並且提供開源工具ethtool工具的底層操作介面支持


所以有些人用ethtool工具發現不同平臺可能不一樣,同樣的命令有些可能返回不同,或者功能不支持,就可以猜想一下可能是因為不同廠商的控制器驅動這裡的實現問題導致,部分介面可能沒有實現或者有bug等等,這些就要具體問題具體分析了,有些板子可能某些介面根本都沒實現,自然ethtool的一些命令就無法正常使用了。

最後進行控制器對phy的複位動作
fec_restart(ndev);

流程如下:
1) Whack a reset. We should wait for this. For i.MX6SX SOC, enet use AXI bus, we use disable MAC , instead of reset MAC itself.
2)enet-mac reset will reset mac address registers too, so need to reconfigure it.
3) Clear any outstanding interrupt.
4) Reset tx SKB buffers.
5) Enable MII mode
6) The phy interface and speed need to get configured,
7) configure the gasket: RMII, 50 MHz, no loopback, no echo; MII, 25 MHz, no loopback, no echo
8) Setup multicast filter.
9) And last, enable the transmit and receive processing
10) Enable interrupts we wish to service
11) Init the interrupt coalescing
fec_enet_init函數的流程到此結束
我們繼續回歸到fec_probe函數,然後是註冊中斷處理函數

4. 網址分享

http://stackoverflow.com/questions/5308090/set-ip-address-using-siocsifaddr-ioctl
http://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.commtrf2/ioctl_socket_control_operations.htm
https://lkml.org/lkml/2017/2/3/396
linux PHY驅動
http://www.latelee.org/programming-under-linux/linux-phy-driver.html
Linux PHY幾個狀態的跟蹤
http://www.latelee.org/programming-under-linux/linux-phy-state.html
第十六章PHY -基於Linux3.10
https://blog.csdn.net/shichaog/article/details/44682931

```

End


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

-Advertisement-
Play Games
更多相關文章
  • 本文主要為0基礎的小白準備,有一定經驗的大神請忽略。因為最近剛接觸linux,在其中也是遇到無數的彎路,本著互惠互利原則,特寫這個博客,希望後來人能少走點彎路,更快的進入狀態。話不多說,上貨。 一,首先下載安裝vmware-pro15虛擬機。(相關軟體下載地址請看結尾) 二,安裝CentOS-7-M ...
  • http://nginx.org/ NGINX官網 創建文件夾mkdir nginx進入創建的文件夾 根據自己需要下載合適版本 通過 wget http://nginx.org/download/nginx-1.17.6.tar.gz 下載文件 安裝必要插件yum -y install gcc pc ...
  • 1. 前言 本文繼續“Linux電源管理(6)_Generic PM之Suspend功能”中有關suspend同步以及PM wakeup的話題。這個話題,是近幾年Linux kernel最具爭議的話題之一,在國外Linux開發論壇,經常可以看到圍繞該話題的辯論。辯論的時間跨度和空間跨度可以持續很長, ...
  • 回到: "Linux系列文章" "Shell系列文章" "Awk系列文章" 介紹 這些案例是我收集起來的,大多都是我自己遇到過的,有些比較經典,有些比較具有代表性。 這些awk案例我也錄了相關視頻的講解 "awk 18個經典實戰案例精講" ,歡迎大家去瞅瞅。 插入幾個新欄位 在"a b c d"的b ...
  • crontab 預設編輯器為vi,不支持foldenable 將預設編輯器改為vim即可解決 將這句話加入/root/.bashrc ...
  • 故障現象 解決方案(失敗) 無效,date命令顯示正常,但是放在腳本中的date命令依然報錯,並且日誌時間依然延後8小時 無效 依然沒有什麼鳥用 最後網上看了一篇文章大概是說可能是升級libc.so.6導致,嘗試以下方法總算成功了 解決方案(成功!) ...
  • 常見的FTP伺服器程式 IIS、Serv-U (windwards中) wu-ftpd(淘汰了)、Proftpd (Linux中) vsftpd(Very Secure FTP Daemon) (Linux中) 安裝 yum install vsftp –y 相關文件 主配置文件 /etc/vsft ...
  • 乙太網驅動流程淺析(三) ifconfig的 19錯誤最底層分析 Author:張昺華 Email:[email protected] Time:2019年3月23日星期六 此文也在我的個人公眾號以及《Linux內核之旅》上有發表: "乙太網驅動流程淺析(三) ifconfig的 19錯誤最底層分析" ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...