BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #3399同步于 2008/12/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

【求助】交换芯片驱动程序报错

hobby
2008/12/29镜像同步6 回复
系统环境: 目标机CPU是PPC405EP 内核版本:2.6.13 宿主机采用Linux+ELDK 问题: 交换芯片的驱动程序,目前模块的加载卸载(insmod/rmmod)、端口的启用禁用(up/down)都OK,中断处理函数也能被正常触发并执行。 但是,收到以太网包准备上交到操作系统协议栈的时候发生panic 更新:目前修改代码后不在发生panic,但是不知道报文交到上面没有。修改详细内容见1楼 问题描述: 问题的核心就是skb,目前好像有两种情况会发生panic: 一、skb_put时发生skb_over_panic; 二、中断处理函数已经执行完毕(通过printf已经判断要return了,不过发生panic时具体return没有不得而知。),但是在skb_realese时候发生错误,这部分好像是OS在做处理,已经不是驱动能够控制的了; 这部分主要的代码:(中断处理函数内的代码) skb = dev_alloc_skb(pkt->data_len + 2); if(NULL == skb) { printk(KERN_EMERG "VSC7398_rx: low on mem"); priv->stats.rx_dropped++; goto out; } memcpy(skb_put(skb, pkt->data_len), pkt->data, pkt->data_len); skb->dev = dev; skb->protocol = eth_type_trans(skb, dev); skb->ip_summed = CHECKSUM_UNNECESSARY; priv->stats.rx_packets++; priv->stats.rx_bytes += pkt->data_len; ret = netif_rx(skb); 运行打印 Oops: kernel access of bad area, sig: 11 [#1] NIP: C012E910 LR: C012ED50 SP: C7E67BF0 REGS: c7e67b40 TRAP: 0300 Not tainted MSR: 00029030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11 DAR: FFFFFFFF, DSISR: 00000000 TASK = c7d3d090[24] 'exe' THREAD: c7e66000 Last syscall: 54 GPR00: FFFFFFFF C7E67BF0 C7D3D090 FFFFFFFF C0371800 C7CAB800 C7CC42C8 C0220000 GPR08: C7E66000 C7CB3962 00000000 C7CB3962 24020022 100EC6B0 07FF5A00 00000001 GPR16: 00000001 07FF868C 00000000 FFFFFFFF 07F8D5D0 00000002 C01D0000 C0228D6C GPR24: FFFB9C2B C7E67C88 00000040 C7CEA280 0000CCD0 FFFFFFFF C7CEA200 00000000 NIP [c012e910] skb_release_data+0x7c/0x10c LR [c012ed50] kfree_skbmem+0x18/0x3c Call trace: [c012ed50] kfree_skbmem+0x18/0x3c [c013585c] netif_receive_skb+0x26c/0x2ac [c0135940] process_backlog+0xa4/0x18c [c0133178] net_rx_action+0x98/0x19c [c001c5e8] __do_softirq+0x7c/0x114 [c001c6d8] do_softirq+0x58/0x5c [c0004528] do_IRQ+0x7c/0x90 [c0003370] ret_from_except+0x0/0x18 [c0004d8c] __delay+0xc/0x14 [c0133e58] dev_open+0x84/0xd8 [c0132b84] dev_change_flags+0x130/0x15c [c01714e8] devinet_ioctl+0x694/0x778 [c0171890] inet_ioctl+0xec/0x120 [c0128d54] sock_ioctl+0x12c/0x318 [c006d174] do_ioctl+0x38/0x84
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
hobby机器人#1 · 2009/1/6
更新下,目前对代码做了如下修改,死机的情况是没有了,不过不知道报文到底上去了没有。 原来的代码: skb = dev_alloc_skb(pkt->data_len + 2); if(NULL == skb) { printk(KERN_EMERG "VSC7398_rx: low on mem"); priv->stats.rx_dropped++; goto out; } memcpy(skb_put(skb, pkt->data_len), pkt->data, pkt->data_len); skb->dev = dev; skb->protocol = eth_type_trans(skb, dev); skb->ip_summed = CHECKSUM_UNNECESSARY; priv->stats.rx_packets++; priv->stats.rx_bytes += pkt->data_len; ret = netif_rx(skb); 改后的代码: alloc_skb(pkt->data_len + 2, GFP_ATOMIC); if(NULL == skb) { printk(KERN_EMERG "VSC7398_rx: low on mem"); priv->stats.rx_dropped++; goto out; } memcpy(skb->data, pkt->data, pkt->data_len); skb->len += pkt->data_len; skb->dev = dev; skb->protocol = eth_type_trans(skb, dev); skb->ip_summed = CHECKSUM_UNNECESSARY; priv->stats.rx_packets++; priv->stats.rx_bytes += pkt->data_len; ret = netif_rx(skb);
lester98机器人#2 · 2009/1/7
赞 不过这样的代码缺乏上下文别人没法帮你看啊,就是想看也不一定能看明白呢
hobby机器人#3 · 2009/1/7
哦 我怕篇幅太长就没把代码整个贴上来 而且也怀疑就是这里的问题,所以就贴了这么一部分
hobby机器人#4 · 2009/1/7
我那个驱动还没做完就被我搞到3K多行了,贴上来应该很臃肿啊……
lester98机器人#5 · 2009/1/7
【 在 hobby 的大作中提到: 】 : 我那个驱动还没做完就被我搞到3K多行了,贴上来应该很臃肿啊…… 行啊,搞3k多行的驱动,锻炼很彻底!
hobby机器人#6 · 2009/1/8
【 在 lester98 的大作中提到: 】 : 行啊,搞3k多行的驱动,锻炼很彻底! …… 好吧