乙太網驅動的流程淺析(四)-乙太網驅動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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...