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

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

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

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

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級(jí)會(huì)員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-4 08:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
+ ~6 i: }' V. w4 ]# ?( Y
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們8 b: `+ {  k4 V% \3 v! _
來(lái)源于小伙伴提問(wèn):
$ a6 {) D. Y# {; p
; ^- r5 ~' V; J' C
! [. `# H8 {! A( `7 ]" W1 X2 a# C  h" Z, o+ {. ^) S$ q
以太網(wǎng)驅(qū)動(dòng)開(kāi)發(fā)中出現(xiàn)的問(wèn)題通常涉及硬件、驅(qū)動(dòng)代碼、網(wǎng)絡(luò)協(xié)議棧等多個(gè)層面。4 k+ [7 i0 N; o0 K" l' c
0 M+ g- @$ r& `2 u
. g; I$ {6 K7 w( K5 R4 {% y' I
5 u( }) K; B* l6 V6 _
1
. m" P9 Q% j. g( d" l問(wèn)題現(xiàn)象0 p0 y, v; T9 R3 S
板卡有兩個(gè)網(wǎng)口。一個(gè)網(wǎng)口在拔掉另一個(gè)網(wǎng)口后,不再接收數(shù)據(jù)。通過(guò)打印發(fā)現(xiàn),沒(méi)有收到中斷信號(hào)。9 P/ P6 r) ?2 Y2 ~

" [, |) y) y8 Y4 y8 _可能原因分析
' e% s+ u0 J  V" j6 s/ \4 l硬件連接問(wèn)題
- W7 [" k5 {) N6 V; V# Q; U3 P
  • 兩個(gè)網(wǎng)口是否共享某些硬件資源,如中斷線、PHY地址或電源。
  • 是否存在硬件級(jí)的干擾或競(jìng)爭(zhēng)。( ]! v, ~2 @2 k" L0 B) w3 B) I

    1 t: M" ]2 c/ `% K4 I
    ) d* n# J3 p+ l% v6 K
    PHY管理與初始化問(wèn)題
    + r0 Y5 _; N0 ]
  • PHY可能被誤操作,導(dǎo)致一個(gè)網(wǎng)口拔掉另一個(gè)網(wǎng)口后,PHY狀態(tài)異常。
  • 網(wǎng)口的 PHY 地址沖突或配置問(wèn)題可能會(huì)導(dǎo)致鏈路狀態(tài)檢測(cè)混亂。4 _: b: t+ h' ~% K& L
    - v' ~$ T7 g* D3 k4 ~* i
    驅(qū)動(dòng)代碼問(wèn)題/ O- u: B+ C  Y* P
  • 中斷配置問(wèn)題:中斷可能被錯(cuò)誤屏蔽或未正確清理。
  • 驅(qū)動(dòng)初始化邏輯問(wèn)題:拔掉一個(gè)網(wǎng)口后,另一個(gè)網(wǎng)口的中斷或數(shù)據(jù)路徑可能被異常清理或復(fù)位。
  • 驅(qū)動(dòng)對(duì)多網(wǎng)口的狀態(tài)管理不當(dāng),例如某些全局變量被錯(cuò)誤共享。8 C3 J6 r3 Y, J" ]

    / k, e; Q& K3 I& B9 S! C網(wǎng)絡(luò)協(xié)議棧問(wèn)題
    1 ~7 s! G+ l. c
  • 網(wǎng)絡(luò)棧是否正確處理了鏈路變化的通知。
  • 某些情況下,協(xié)議?赡苓M(jìn)入異常狀態(tài),導(dǎo)致收不到數(shù)據(jù)。' q$ {& R* j7 R0 n6 D: b& @

    1 ^$ v# Y5 h0 s* n( d, q4 b* G; l29 z; O1 {' R  Q' W& T( s3 g
    具體排查步驟
    2 X8 N% J7 \6 Z: a1. 硬件層面. ~' }5 j% v( j" l- ]# y5 H- N
    檢查硬件共享資源:
    ' q3 z! E  V5 k) p' l' u5 r
  • 檢查網(wǎng)口是否使用獨(dú)立的 PHY 和中斷線。用萬(wàn)用表測(cè)量中斷線是否獨(dú)立或在 PCB 上共享。
  • 確保 PHY 的電源、時(shí)鐘源等是獨(dú)立的。8 v- y/ h, |) q. i3 v& v
    : v5 \9 c. }, i! H
    鏈路狀態(tài)檢查:
    ' ]& Q* j' `+ C+ |# Y1 O
  • 使用示波器觀察拔掉網(wǎng)口時(shí)的 MDIO(管理數(shù)據(jù)接口)總線通信情況,看是否有錯(cuò)誤信號(hào)或意外操作。
  • 網(wǎng)口拔插行為驗(yàn)證:測(cè)試單獨(dú)使用一個(gè)網(wǎng)口(不接另一個(gè)網(wǎng)口)是否能夠正常工作。4 z" X& g4 ~5 @9 H- c1 O3 Y% c

    $ V* K* N: l9 e2. 驅(qū)動(dòng)層面
    8 J7 x- m1 }& b0 E/ g4 [中斷管理
    9 d0 W. O1 I" z6 F5 K6 |4 G確認(rèn)中斷是否被觸發(fā):查看中斷處理函數(shù)是否被調(diào)用。& M) F7 t- r0 L
    # D( F1 a( ?$ X* C2 N2 [% w0 i
    在中斷服務(wù)程序(ISR)中加入統(tǒng)計(jì)計(jì)數(shù)和詳細(xì)打印,確認(rèn)拔插操作后是否仍能收到中斷信號(hào)。% C) C8 p- }, y, _8 C/ a

      L+ ^& v, `+ f6 ^* [6 d$ A4 M
  • static int irq_count = 0;6 [+ M- ]6 x6 Q" \2 L+ `" k
    void eth_rx_irq_handler(void) {    irq_count++;    printk("IRQ triggered, count = %d  k9 @8 ?+ P$ b, |4 P8 W
    ", irq_count);    ...}
    - U0 k/ V# y/ W中斷綁定問(wèn)題:確保每個(gè)網(wǎng)口的中斷綁定到正確的設(shè)備。檢查中斷號(hào)是否被其他設(shè)備錯(cuò)誤占用。
    / J5 `, B8 r6 n: L! {8 ~& E- _9 a- o: j) T
    PHY 狀態(tài)管理
    + N4 T$ R* s- y, @/ l- E檢查 PHY 鏈路狀態(tài):使用 MII/MDIO 接口讀取 PHY 狀態(tài)寄存器(如 BMSR 寄存器)。確保拔掉一個(gè)網(wǎng)口時(shí),另一個(gè)網(wǎng)口的 PHY 狀態(tài)未被錯(cuò)誤修改。8 }/ Y( _3 e! b) {" W( X# |

    # \# `7 z* n$ y+ a2 i
  • int phy_status = read_phy_register(PHY_ADDR, PHY_BMSR);printk("PHY status: 0x%x
    , B  R- p& w% b", phy_status);1 u8 p  S" s$ L# w- _
    在驅(qū)動(dòng)中打印 PHY 狀態(tài)的變化,確認(rèn)拔插時(shí)鏈路狀態(tài)是否異常變化。/ C. `( _* C9 x6 h2 W- t5 h

    : F# R- v. C) W) o  U& n: t0 Z驅(qū)動(dòng)邏輯排查
    - E5 T( Q6 o3 [( G/ n& n復(fù)用變量問(wèn)題:檢查是否有共享變量影響了兩個(gè)網(wǎng)口的狀態(tài)。, O$ x4 z/ l" Z9 X! q$ a& d( _

    9 @0 M/ V  ^+ e; N# B確認(rèn)驅(qū)動(dòng)中是否有特定邏輯誤將兩個(gè)網(wǎng)口視為同一個(gè)設(shè)備。+ C3 A& v# t( v9 I9 T
    9 r4 x% [3 a/ M' f1 M/ b
    確認(rèn)網(wǎng)口復(fù)位過(guò)程中沒(méi)有影響其他網(wǎng)口的硬件或軟件狀態(tài)。
    $ K0 \$ A0 b3 {% t4 r' J3
    ( B+ L1 q7 N9 ~& \, Q' E" p網(wǎng)絡(luò)協(xié)議棧層面2 {4 l' _. H% J+ @8 e
  • 調(diào)試網(wǎng)絡(luò)棧接口:確認(rèn)網(wǎng)口數(shù)據(jù)路徑是否被正常處理(如 NAPI 機(jī)制或 Rx 描述符隊(duì)列)。
  • 鏈路通知事件:檢查拔掉一個(gè)網(wǎng)口后,另一個(gè)網(wǎng)口是否錯(cuò)誤地收到鏈路斷開(kāi)通知。
    1 n3 U# d; P0 X0 R$ U( q

    6 u% t$ v* t1 N9 R+ u) t4; R6 P- ]: W% S
    系統(tǒng)與調(diào)試工具3 B& V( U9 q$ e" |
    使用工具監(jiān)控流量:
    % u3 f% n4 y4 e/ E. j' Z( |2 K9 F( _
  • 使用 Wireshark 或 tcpdump 捕獲數(shù)據(jù)包,觀察收發(fā)情況。
  • 查看是否有中斷丟失導(dǎo)致數(shù)據(jù)包未被正確處理。' g; J4 S! u( D+ R$ e! {

    1 X- Y# ^* {) P* y- t* `使用寄存器對(duì)比狀態(tài):比較兩個(gè)網(wǎng)口的中斷寄存器、PHY 狀態(tài)寄存器、DMA 描述符等,找到差異。
    ! Z$ z3 n* X! n$ q
    1 ^' ~: z4 y8 X; ~7 N" }

    9 l; y2 n( O4 b6 r打印驅(qū)動(dòng)日志:在驅(qū)動(dòng)中添加詳細(xì)日志,包括中斷狀態(tài)、鏈路狀態(tài)、數(shù)據(jù)隊(duì)列狀態(tài)等。
    ! ^8 E( r/ y# `* V! |5  {; V2 Z! _/ f% N' S/ M8 K* X
    解決方向建議" s' d: M: ^$ U/ q/ A
  • 確保硬件設(shè)計(jì)沒(méi)有資源沖突,尤其是中斷線、PHY 地址等。
  • 在驅(qū)動(dòng)中分離兩個(gè)網(wǎng)口的狀態(tài)管理,避免復(fù)用變量或錯(cuò)誤邏輯干擾。
  • 優(yōu)化鏈路狀態(tài)管理邏輯,確保 PHY 和協(xié)議棧能正確處理鏈路變化。
  • 增加打印和調(diào)試工具的使用,定位問(wèn)題根因。
    1 {8 h0 C# V$ D! c; S

    8 Z& @; L! K; f如果有具體代碼片段或更詳細(xì)的硬件架構(gòu)描述,可以進(jìn)一步幫助分析。  Q1 W* w1 k: A; u% C. w
    - o; i& N9 u6 z1 U  E

    * d1 J7 e% `" v) h! W點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


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