|
mhsxbbxr04l64066433858.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
mhsxbbxr04l64066433858.gif
2024-12-5 22:02 上傳
+ ~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
ocsbogin2pq64066433958.png (45.49 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
ocsbogin2pq64066433958.png
2024-12-5 22:02 上傳
! [. `# 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
npxh0z05dno64066434059.png (971.29 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
npxh0z05dno64066434059.png
2024-12-5 22:02 上傳
. 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 Mstatic 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 iint 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
dmeyqqztjtf64066434159.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
dmeyqqztjtf64066434159.jpg
2024-12-5 22:02 上傳
- o; i& N9 u6 z1 U E
isnlxj5an4564066434259.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
isnlxj5an4564066434259.gif
2024-12-5 22:02 上傳
* d1 J7 e% `" v) h! W點(diǎn)擊閱讀原文,更精彩~ |
|