電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 33|回復(fù): 0
收起左側(cè)

以太網(wǎng)驅(qū)動怪事:拔掉一個網(wǎng)口后另一個網(wǎng)口收不到數(shù)據(jù)?

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-4 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
! ]( m% Q* G* @5 T
點擊上方藍色字體,關(guān)注我們+ T4 w. F4 A! @/ g( Q3 j- ^
來源于小伙伴提問:- x: d5 ^0 Y7 C# V

% K) t" v9 m. F! V6 D6 Z! \
- K2 z% Z+ j- f5 W% y4 W6 v. M) y7 m- \$ s0 S
以太網(wǎng)驅(qū)動開發(fā)中出現(xiàn)的問題通常涉及硬件、驅(qū)動代碼、網(wǎng)絡(luò)協(xié)議棧等多個層面。1 z5 K4 e5 b: a9 S1 N
+ g& t1 j- u6 k2 |

, r4 |+ z5 k0 c3 _( f
6 B% B( D& D' p13 C+ U  z+ w' ?1 F  V* p& B' E; n; I
問題現(xiàn)象7 X, B+ h+ k$ |! ?0 I
板卡有兩個網(wǎng)口。一個網(wǎng)口在拔掉另一個網(wǎng)口后,不再接收數(shù)據(jù)。通過打印發(fā)現(xiàn),沒有收到中斷信號。' q  a8 A9 w( u

9 f! g8 E, C% W$ c可能原因分析
- n2 d4 u; B: ]硬件連接問題
* G9 c7 }- U3 {, Y" P
  • 兩個網(wǎng)口是否共享某些硬件資源,如中斷線、PHY地址或電源。
  • 是否存在硬件級的干擾或競爭。* B" P" o, ]4 j5 n

    ; D, X+ T: p" J7 T& m

    / S. J1 D+ i+ X8 k2 QPHY管理與初始化問題
    $ f( `' ^- j# j. I5 N( T: @( F# b7 k3 A
  • PHY可能被誤操作,導(dǎo)致一個網(wǎng)口拔掉另一個網(wǎng)口后,PHY狀態(tài)異常。
  • 網(wǎng)口的 PHY 地址沖突或配置問題可能會導(dǎo)致鏈路狀態(tài)檢測混亂。
      f0 T8 g6 q" ?! J

    0 b9 l+ ?9 G5 ~5 J5 t& k! N* t驅(qū)動代碼問題% N+ _+ I' [2 h( f3 h3 b+ X9 i
  • 中斷配置問題:中斷可能被錯誤屏蔽或未正確清理。
  • 驅(qū)動初始化邏輯問題:拔掉一個網(wǎng)口后,另一個網(wǎng)口的中斷或數(shù)據(jù)路徑可能被異常清理或復(fù)位。
  • 驅(qū)動對多網(wǎng)口的狀態(tài)管理不當,例如某些全局變量被錯誤共享。( u0 E$ Q# {' r$ q4 e! W% E* F

    0 n& @6 o! P6 K# X2 C7 ]網(wǎng)絡(luò)協(xié)議棧問題& ^8 s9 ~% B" l
  • 網(wǎng)絡(luò)棧是否正確處理了鏈路變化的通知。
  • 某些情況下,協(xié)議?赡苓M入異常狀態(tài),導(dǎo)致收不到數(shù)據(jù)。. n, I" A' H8 p7 m9 R
    + ^5 f3 O) D% C* I7 O+ v2 K
    2( n# m) Z: Q! X8 c
    具體排查步驟: e! [; j! g! b" t2 I2 z
    1. 硬件層面
    % P6 O$ v( e) m* N; `檢查硬件共享資源:. ]7 d3 N8 h, P& T  _3 L9 O
  • 檢查網(wǎng)口是否使用獨立的 PHY 和中斷線。用萬用表測量中斷線是否獨立或在 PCB 上共享。
  • 確保 PHY 的電源、時鐘源等是獨立的。# q. ?+ R& y$ ^

    2 e2 o  s2 i4 A3 `0 I7 F鏈路狀態(tài)檢查:: g: s  n' {4 ]' o
  • 使用示波器觀察拔掉網(wǎng)口時的 MDIO(管理數(shù)據(jù)接口)總線通信情況,看是否有錯誤信號或意外操作。
  • 網(wǎng)口拔插行為驗證:測試單獨使用一個網(wǎng)口(不接另一個網(wǎng)口)是否能夠正常工作。: X8 T  k' r  j# t
    * L' u# M5 Z3 ^- F% T! V9 {' t
    2. 驅(qū)動層面" p  a  ]+ X1 f+ D4 o. \! C! k
    中斷管理
    9 T$ g9 Q: B2 C# }! }: n. D確認中斷是否被觸發(fā):查看中斷處理函數(shù)是否被調(diào)用。$ O# [  y5 @& D- L+ w! }% A
    8 w6 b5 P) P2 P
    在中斷服務(wù)程序(ISR)中加入統(tǒng)計計數(shù)和詳細打印,確認拔插操作后是否仍能收到中斷信號。
    8 E, w- C! e3 l% R: Z5 B
    ; D' e; M5 p, z. R% L' a
  • static int irq_count = 0;
    $ ~/ H6 U4 z1 H1 L$ wvoid eth_rx_irq_handler(void) {    irq_count++;    printk("IRQ triggered, count = %d
    0 ?5 A( F3 k% Z8 Z" V0 b2 K", irq_count);    ...}7 p' H5 S* G. n5 e2 ~3 e2 z1 ~6 _
    中斷綁定問題:確保每個網(wǎng)口的中斷綁定到正確的設(shè)備。檢查中斷號是否被其他設(shè)備錯誤占用。* M" B# a: a9 p0 L; g4 I5 O) g: b. e
    * n) O, {+ G% J" V3 z
    PHY 狀態(tài)管理
    7 i8 {2 r8 g$ j/ A$ a檢查 PHY 鏈路狀態(tài):使用 MII/MDIO 接口讀取 PHY 狀態(tài)寄存器(如 BMSR 寄存器)。確保拔掉一個網(wǎng)口時,另一個網(wǎng)口的 PHY 狀態(tài)未被錯誤修改。% H5 ^. _& c$ g6 a: R. r( q+ }& ?; x
    2 r0 W8 l  J7 j
  • int phy_status = read_phy_register(PHY_ADDR, PHY_BMSR);printk("PHY status: 0x%x
    2 G2 ~3 v# e0 H0 _  I% ]+ J1 h", phy_status);
    & ?7 ~2 `. G! o( v5 g5 X在驅(qū)動中打印 PHY 狀態(tài)的變化,確認拔插時鏈路狀態(tài)是否異常變化。  r" B1 ]& ^8 y! Z1 y

    1 z( R  L7 ~$ J3 {, @) ]4 G驅(qū)動邏輯排查
    * ^  p8 z% }/ h. U. j* ^/ z復(fù)用變量問題:檢查是否有共享變量影響了兩個網(wǎng)口的狀態(tài)。
    6 f/ n& `5 x  U$ ~: v, V- g- z8 Q; M/ O- u9 Z. I
    確認驅(qū)動中是否有特定邏輯誤將兩個網(wǎng)口視為同一個設(shè)備。8 E1 c8 H3 J- t% x8 @$ `* C

    * ^* `/ z, u$ o, @! J6 Q6 ~& F確認網(wǎng)口復(fù)位過程中沒有影響其他網(wǎng)口的硬件或軟件狀態(tài)。
    0 ~5 [7 N( j0 V- w30 X' s: t" n& N. P
    網(wǎng)絡(luò)協(xié)議棧層面
    4 @& X( K% U. k- s
  • 調(diào)試網(wǎng)絡(luò)棧接口:確認網(wǎng)口數(shù)據(jù)路徑是否被正常處理(如 NAPI 機制或 Rx 描述符隊列)。
  • 鏈路通知事件:檢查拔掉一個網(wǎng)口后,另一個網(wǎng)口是否錯誤地收到鏈路斷開通知。
    $ C% S6 l. T6 i% v

    $ K2 h* |/ y8 j4
    ) T& y' w, B( l5 x% x: y系統(tǒng)與調(diào)試工具8 }: x+ f& z8 u! |$ t0 V
    使用工具監(jiān)控流量:
    + ]! f" X( h  \: g6 h# @5 M
  • 使用 Wireshark 或 tcpdump 捕獲數(shù)據(jù)包,觀察收發(fā)情況。
  • 查看是否有中斷丟失導(dǎo)致數(shù)據(jù)包未被正確處理。
    + J: G, E4 [/ o& E- R

    0 p: X. B' @  h7 z9 f& d$ ^使用寄存器對比狀態(tài):比較兩個網(wǎng)口的中斷寄存器、PHY 狀態(tài)寄存器、DMA 描述符等,找到差異。
      T2 K% o& W* G. I8 T" ~: t
    2 Y) W; v4 S" O# V$ S' M2 I0 n

    ; s2 d  z( C4 Y' t0 h打印驅(qū)動日志:在驅(qū)動中添加詳細日志,包括中斷狀態(tài)、鏈路狀態(tài)、數(shù)據(jù)隊列狀態(tài)等。
    + Y: |4 Z: a0 S8 O+ A; a: p55 n/ ^$ X" O5 M! P1 U5 }2 N+ k& u2 U
    解決方向建議
    % f" c# W9 i" ~6 {
  • 確保硬件設(shè)計沒有資源沖突,尤其是中斷線、PHY 地址等。
  • 在驅(qū)動中分離兩個網(wǎng)口的狀態(tài)管理,避免復(fù)用變量或錯誤邏輯干擾。
  • 優(yōu)化鏈路狀態(tài)管理邏輯,確保 PHY 和協(xié)議棧能正確處理鏈路變化。
  • 增加打印和調(diào)試工具的使用,定位問題根因。, E' t, B1 M6 v$ y! V, W

    " p# v/ D% u; R  B) Z7 X" ]+ P7 u如果有具體代碼片段或更詳細的硬件架構(gòu)描述,可以進一步幫助分析。$ \) i) P9 `$ p' W& F

    ( A7 t! F" v; t8 S2 M: g* j- _1 t
    ' e2 s, j1 v* b. Z1 B0 V4 G# d6 w點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表