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

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

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

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會(huì)員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-4 08:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
3 }% O) h, f; {9 F8 i
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
# S# D( g8 \& z, o/ C來源于小伙伴提問:
- ?( g6 p5 I! ^6 g  d6 l) N5 E: }& J
8 T8 e7 r8 J! `; C6 k 2 W& D# \) X7 `% C! N8 v$ e
" f5 v( B. B1 w3 A1 _6 ^; Q
以太網(wǎng)驅(qū)動(dòng)開發(fā)中出現(xiàn)的問題通常涉及硬件、驅(qū)動(dòng)代碼、網(wǎng)絡(luò)協(xié)議棧等多個(gè)層面。6 _) c. s( t' F9 z5 x

: J& D/ Q; ^: p 8 T9 q% t& m& m
- D2 ^1 m" |7 {
1
0 t6 `1 H4 L2 j問題現(xiàn)象5 E& b  {- j) h- Q5 }" n
板卡有兩個(gè)網(wǎng)口。一個(gè)網(wǎng)口在拔掉另一個(gè)網(wǎng)口后,不再接收數(shù)據(jù)。通過打印發(fā)現(xiàn),沒有收到中斷信號。3 @; h* }2 V$ s5 m
1 g+ ]9 q3 V1 U! `
可能原因分析: L2 A3 P8 q; i1 R# b6 F
硬件連接問題
: [) N6 u9 ^4 R& f2 G
  • 兩個(gè)網(wǎng)口是否共享某些硬件資源,如中斷線、PHY地址或電源。
  • 是否存在硬件級的干擾或競爭。6 Y9 g; P( g/ [# o: y# i4 i6 `
    0 M2 Z; l8 V- u, l6 X

    * s: P& i# v$ [2 V5 _PHY管理與初始化問題( y! ]+ ]& {7 i& V& k
  • PHY可能被誤操作,導(dǎo)致一個(gè)網(wǎng)口拔掉另一個(gè)網(wǎng)口后,PHY狀態(tài)異常。
  • 網(wǎng)口的 PHY 地址沖突或配置問題可能會(huì)導(dǎo)致鏈路狀態(tài)檢測混亂。
    8 O0 x+ x3 d" C- C9 a
    + H8 t2 Y1 B+ k4 {
    驅(qū)動(dòng)代碼問題
    / g; b& A5 A+ s$ f9 r
  • 中斷配置問題:中斷可能被錯(cuò)誤屏蔽或未正確清理。
  • 驅(qū)動(dòng)初始化邏輯問題:拔掉一個(gè)網(wǎng)口后,另一個(gè)網(wǎng)口的中斷或數(shù)據(jù)路徑可能被異常清理或復(fù)位。
  • 驅(qū)動(dòng)對多網(wǎng)口的狀態(tài)管理不當(dāng),例如某些全局變量被錯(cuò)誤共享。
    1 g  h2 ^; y3 G; ]- r3 M2 b

    3 S. O1 O' o( |$ L. ]! I網(wǎng)絡(luò)協(xié)議棧問題
    % A8 F: N1 ?5 ?/ E/ E# f- M
  • 網(wǎng)絡(luò)棧是否正確處理了鏈路變化的通知。
  • 某些情況下,協(xié)議?赡苓M(jìn)入異常狀態(tài),導(dǎo)致收不到數(shù)據(jù)。, i: n: W  z3 J1 R
    % ~  z% |  ]0 Y9 @. R
    2
    ) i( O6 E- e- j* t! q3 J具體排查步驟7 s) v* @2 G* T
    1. 硬件層面
    # j$ B( S; K) F4 ?& E5 k檢查硬件共享資源:
    * P$ ]- r( Y/ Y3 z; X( J
  • 檢查網(wǎng)口是否使用獨(dú)立的 PHY 和中斷線。用萬用表測量中斷線是否獨(dú)立或在 PCB 上共享。
  • 確保 PHY 的電源、時(shí)鐘源等是獨(dú)立的。% o5 m9 S7 M6 i
    ' S# B0 F6 Q4 |7 Y2 e
    鏈路狀態(tài)檢查:0 n  X# ?0 W7 R' O6 {1 j$ I* E
  • 使用示波器觀察拔掉網(wǎng)口時(shí)的 MDIO(管理數(shù)據(jù)接口)總線通信情況,看是否有錯(cuò)誤信號或意外操作。
  • 網(wǎng)口拔插行為驗(yàn)證:測試單獨(dú)使用一個(gè)網(wǎng)口(不接另一個(gè)網(wǎng)口)是否能夠正常工作。1 o% b- @/ S  R5 e# ?) N3 U& Q0 A
    . |( w% K) c: \: _& f* t/ C
    2. 驅(qū)動(dòng)層面
    : {" a0 }+ L" a( j; p  N中斷管理0 I2 U% l% q! @- K9 l
    確認(rèn)中斷是否被觸發(fā):查看中斷處理函數(shù)是否被調(diào)用。, h" J' z2 o4 H! [5 R# |

      g+ r2 l' t/ n7 o在中斷服務(wù)程序(ISR)中加入統(tǒng)計(jì)計(jì)數(shù)和詳細(xì)打印,確認(rèn)拔插操作后是否仍能收到中斷信號。4 q/ i$ m( n2 J4 \6 k0 ~  o

    % e4 j; m4 a7 v8 T) a" V; e
  • static int irq_count = 0;6 X4 J. i2 \# D
    void eth_rx_irq_handler(void) {    irq_count++;    printk("IRQ triggered, count = %d
    , v: R% S. d6 B& ^; ~& I", irq_count);    ...}) X1 w: X% q7 L
    中斷綁定問題:確保每個(gè)網(wǎng)口的中斷綁定到正確的設(shè)備。檢查中斷號是否被其他設(shè)備錯(cuò)誤占用。( V+ E  O8 o1 ?5 x- f- c

    6 N3 Q1 `! Q) C# {PHY 狀態(tài)管理2 g/ h- Y6 [7 P' \
    檢查 PHY 鏈路狀態(tài):使用 MII/MDIO 接口讀取 PHY 狀態(tài)寄存器(如 BMSR 寄存器)。確保拔掉一個(gè)網(wǎng)口時(shí),另一個(gè)網(wǎng)口的 PHY 狀態(tài)未被錯(cuò)誤修改。; a' L5 B$ F  l4 |9 ^5 ?" B

    6 S* Q4 X8 v( R3 g
  • int phy_status = read_phy_register(PHY_ADDR, PHY_BMSR);printk("PHY status: 0x%x
    1 E8 R$ s% U* H& G2 P  h", phy_status);' U0 o* w' W- Y9 }
    在驅(qū)動(dòng)中打印 PHY 狀態(tài)的變化,確認(rèn)拔插時(shí)鏈路狀態(tài)是否異常變化。! X" p2 W: g! D: X
    3 w2 \, H9 }9 C) m3 t
    驅(qū)動(dòng)邏輯排查. X. `. Y8 ], R) R- t3 P0 d
    復(fù)用變量問題:檢查是否有共享變量影響了兩個(gè)網(wǎng)口的狀態(tài)。/ M$ q' K7 U/ H* S

    : C* D/ M4 M5 J$ S( }+ M- g確認(rèn)驅(qū)動(dòng)中是否有特定邏輯誤將兩個(gè)網(wǎng)口視為同一個(gè)設(shè)備。
    9 m6 Q9 t! g: o  p# N, p7 @7 @4 m" o7 J) e1 {, [
    確認(rèn)網(wǎng)口復(fù)位過程中沒有影響其他網(wǎng)口的硬件或軟件狀態(tài)。
    5 |7 j) T# g1 @6 U# T7 t37 k9 u* F5 ^0 W% M* W
    網(wǎng)絡(luò)協(xié)議棧層面3 t4 ?# [3 H  J# G+ p( C  S
  • 調(diào)試網(wǎng)絡(luò)棧接口:確認(rèn)網(wǎng)口數(shù)據(jù)路徑是否被正常處理(如 NAPI 機(jī)制或 Rx 描述符隊(duì)列)。
  • 鏈路通知事件:檢查拔掉一個(gè)網(wǎng)口后,另一個(gè)網(wǎng)口是否錯(cuò)誤地收到鏈路斷開通知。
      f* T- L& U0 a6 g3 a) z5 a1 Q; {8 h, o

    : }) m, B2 y, M" ?& b4' {0 w. q- T! W
    系統(tǒng)與調(diào)試工具
    + F, Y4 U9 [" F: U使用工具監(jiān)控流量:; ?- C: o" q0 P! i
  • 使用 Wireshark 或 tcpdump 捕獲數(shù)據(jù)包,觀察收發(fā)情況。
  • 查看是否有中斷丟失導(dǎo)致數(shù)據(jù)包未被正確處理。
    : z3 X' q3 p4 L! y

    * e. x6 D0 n% W. R) x使用寄存器對比狀態(tài):比較兩個(gè)網(wǎng)口的中斷寄存器、PHY 狀態(tài)寄存器、DMA 描述符等,找到差異。7 M4 [, O! ?5 B

    ; ^" I& \6 ?3 O+ Y# _
    & \4 K) K6 w4 X, h, c0 W& A  i, O1 a
    打印驅(qū)動(dòng)日志:在驅(qū)動(dòng)中添加詳細(xì)日志,包括中斷狀態(tài)、鏈路狀態(tài)、數(shù)據(jù)隊(duì)列狀態(tài)等。0 p" ^" W" a& h& E, ^% }+ R2 R
    5
    7 l# t* C. {; z, T4 M; \解決方向建議/ s6 k4 R; {6 h+ K3 I& i
  • 確保硬件設(shè)計(jì)沒有資源沖突,尤其是中斷線、PHY 地址等。
  • 在驅(qū)動(dòng)中分離兩個(gè)網(wǎng)口的狀態(tài)管理,避免復(fù)用變量或錯(cuò)誤邏輯干擾。
  • 優(yōu)化鏈路狀態(tài)管理邏輯,確保 PHY 和協(xié)議棧能正確處理鏈路變化。
  • 增加打印和調(diào)試工具的使用,定位問題根因。
    ; l  _. y" j# y6 I

    ' o8 J3 e5 W3 ~  f( ?如果有具體代碼片段或更詳細(xì)的硬件架構(gòu)描述,可以進(jìn)一步幫助分析。# _" R/ W3 n9 \: x( |  c
    2 Z0 e, {$ Z# j* u* c7 f% [+ L, \. m
    " A1 h& b' h$ X8 A- \5 {( h
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

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

    本版積分規(guī)則


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