|
mhsxbbxr04l64066433858.gif
4 |/ q) e; s( V) V8 {' F
点击上方蓝色字体,关注我们
# D4 e" w/ b. E5 j$ f来源于小伙伴提问:
! A# w6 ~7 \) r
! \, S, H: D* Q& f- O: E& _; |
ocsbogin2pq64066433958.png
! O; S/ m0 u2 y& |* e( b- z; c2 h3 ~' a! a7 @. j; L4 ?
以太网驱动开发中出现的问题通常涉及硬件、驱动代码、网络协议栈等多个层面。& T5 D% x1 H( }+ u4 c
- r* l+ i9 m, F. L* p. V& ?5 Z3 P) T
npxh0z05dno64066434059.png
7 t" |) G; Y; ?/ N, O
; o( n8 m5 o2 w* S( M9 w
1
& W1 W% @; k; n. ]2 [3 L$ p" h b. L问题现象
# J( U. `2 |( d7 z板卡有两个网口。一个网口在拔掉另一个网口后,不再接收数据。通过打印发现,没有收到中断信号。9 I0 z3 B, V/ M, J$ a* T* O+ M
* X9 l$ L! n2 Q6 N. H可能原因分析
" T5 l2 e8 P9 ?8 q/ V! i% S硬件连接问题/ x* @6 A+ J+ c
两个网口是否共享某些硬件资源,如中断线、PHY地址或电源。是否存在硬件级的干扰或竞争。
6 m/ y- f4 X" s
0 u/ n( x7 P- ]* E
9 K* ]0 g7 g2 U, i, D8 g' g5 YPHY管理与初始化问题
! n5 r! o# S! s, d9 v4 r) p/ J, YPHY可能被误操作,导致一个网口拔掉另一个网口后,PHY状态异常。网口的 PHY 地址冲突或配置问题可能会导致链路状态检测混乱。
% d/ q/ F }2 K
7 \0 s0 K4 B; }* S* l驱动代码问题
3 t; {0 ?; Q% o; y7 v中断配置问题:中断可能被错误屏蔽或未正确清理。驱动初始化逻辑问题:拔掉一个网口后,另一个网口的中断或数据路径可能被异常清理或复位。驱动对多网口的状态管理不当,例如某些全局变量被错误共享。
& ]5 v; t/ j% J; R, x
; m' g0 m1 q* W c# G/ r网络协议栈问题. S2 g) i5 {- O+ F. ]% v
网络栈是否正确处理了链路变化的通知。某些情况下,协议栈可能进入异常状态,导致收不到数据。& u2 T5 f$ X9 k8 v
1 F# b2 t9 J! b+ K
2: j& H& M2 A/ V7 P1 r
具体排查步骤, ]6 ^8 `1 t% f+ w: |, i, I" C# \
1. 硬件层面
8 z% ^) n) |) v; f8 X检查硬件共享资源: L2 b3 V* P2 C& b
检查网口是否使用独立的 PHY 和中断线。用万用表测量中断线是否独立或在 PCB 上共享。确保 PHY 的电源、时钟源等是独立的。: T0 \$ d" o; R. Y
$ `8 E6 t- ~3 h1 m" h3 _
链路状态检查:
- x2 t; u' m( F& ?使用示波器观察拔掉网口时的 MDIO(管理数据接口)总线通信情况,看是否有错误信号或意外操作。网口拔插行为验证:测试单独使用一个网口(不接另一个网口)是否能够正常工作。
3 b6 Z8 I$ l4 n. y+ N
1 e% c5 O7 d' d, t6 I i2. 驱动层面
: M) n( B6 y" S! V* O5 E中断管理: l) J, L' R* x- q2 E
确认中断是否被触发:查看中断处理函数是否被调用。1 S) s/ W) e3 a; T, S6 r
% [2 q7 e( n& C0 Z; Y/ z
在中断服务程序(ISR)中加入统计计数和详细打印,确认拔插操作后是否仍能收到中断信号。
5 Y0 k; u, p3 X( _0 F3 ?, I( A7 i. L$ }, e" W3 G9 F& }/ O0 N
static int irq_count = 0;
3 T2 L0 a" W/ V( i T) bvoid eth_rx_irq_handler(void) { irq_count++; printk("IRQ triggered, count = %d. t; _ `3 d( j8 o
", irq_count); ...}3 U( ]) j2 Q1 h9 r& y6 ?0 y
中断绑定问题:确保每个网口的中断绑定到正确的设备。检查中断号是否被其他设备错误占用。
7 |8 U( L9 f' N6 k! E( O. w- ]
4 n/ A! p) A' s. _4 B7 O7 hPHY 状态管理
! @+ g, P1 P% W5 F: v检查 PHY 链路状态:使用 MII/MDIO 接口读取 PHY 状态寄存器(如 BMSR 寄存器)。确保拔掉一个网口时,另一个网口的 PHY 状态未被错误修改。
- J* P# ~6 p' l- \& Y
9 w; b2 { N: Z8 o' Dint phy_status = read_phy_register(PHY_ADDR, PHY_BMSR);printk("PHY status: 0x%x
, s6 r _5 A& Z8 u7 T/ T8 b7 c", phy_status);
( |4 ]! l2 d: m5 m$ }5 j在驱动中打印 PHY 状态的变化,确认拔插时链路状态是否异常变化。( n5 R1 _' w" _# l7 y$ @( c* D
) ~, A/ ~9 `$ `, u+ l+ G: q4 @
驱动逻辑排查
8 r" o% y9 S8 I3 X% X; |& ~* q复用变量问题:检查是否有共享变量影响了两个网口的状态。
6 N0 @ D5 u6 b- H2 i! G4 ]% y' O2 L/ Y2 m
确认驱动中是否有特定逻辑误将两个网口视为同一个设备。$ c0 {! E- O) E% |' p
0 D. l+ M- X2 U4 W确认网口复位过程中没有影响其他网口的硬件或软件状态。
+ R8 Y# z8 E. m* V* [3
5 [- J( v2 u7 n( j. i \网络协议栈层面/ U; U* @$ Z, N8 ~ W
调试网络栈接口:确认网口数据路径是否被正常处理(如 NAPI 机制或 Rx 描述符队列)。链路通知事件:检查拔掉一个网口后,另一个网口是否错误地收到链路断开通知。
9 [! H+ Z, \# W, D3 O" z! }4 Y7 @% `( g# S# g) o
4
, v# I" s& J I/ J系统与调试工具% {; H: Y0 J! c* n/ I; M
使用工具监控流量:( A0 @: A; y* y0 I7 |; W N
使用 Wireshark 或 tcpdump 捕获数据包,观察收发情况。查看是否有中断丢失导致数据包未被正确处理。* G1 K4 A5 ^* l
8 k7 a3 F# ^- F( h7 g$ W0 y
使用寄存器对比状态:比较两个网口的中断寄存器、PHY 状态寄存器、DMA 描述符等,找到差异。
~; a7 l. H9 v/ E, c
; ^3 y# d9 m" H" \5 T% w, A: [' v) Q) I0 G7 m8 [$ {4 B. Q: M
打印驱动日志:在驱动中添加详细日志,包括中断状态、链路状态、数据队列状态等。 Q* A0 v; Y3 B8 z( r
5
' E s" d3 C. B解决方向建议
/ R& L; W7 L' B$ ]0 F; o确保硬件设计没有资源冲突,尤其是中断线、PHY 地址等。在驱动中分离两个网口的状态管理,避免复用变量或错误逻辑干扰。优化链路状态管理逻辑,确保 PHY 和协议栈能正确处理链路变化。增加打印和调试工具的使用,定位问题根因。! P/ P& |6 F p$ u. Z& \' j
) m8 x7 p, N2 Y/ b" r如果有具体代码片段或更详细的硬件架构描述,可以进一步帮助分析。
) i- {# q5 J* a( G2 p4 E/ m$ A4 n
dmeyqqztjtf64066434159.jpg
9 u" Q# L/ I h! T% J+ p
isnlxj5an4564066434259.gif
$ N5 Y9 S; c5 Y点击阅读原文,更精彩~ |
|