编译网卡驱动出错

brookmill 2008-04-11 03:32:36
Redhat9, 2.4.20-8, gcc-3.2.2
从厂家网站下载的驱动,应该是2.6下写的,但从Makefile来看应该也支持2.4的内核。

gcc -DLINUX -D__KERNEL__ -DMODULE -O2 -pipe -Wall -DDBG=0 -I/lib/modules/2.4.20-8/build/include -I. -DMODVERSIONS -DEXPORT_SYMTAB -include /lib/modules/2.4.20-8/build/include/linux/modversions.h -c -o at_main.o at_main.c
at_main.c: In function `at_setup_pcicmd':
at_main.c:272: `PCI_COMMAND_INTX_DISABLE' undeclared (first use in this function)
at_main.c:272: (Each undeclared identifier is reported only once
at_main.c:272: for each function it appears in.)
at_main.c: In function `at_intr':
at_main.c:1895: warning: dereferencing `void *' pointer
at_main.c:1895: request for member `priv' in something not a structure or union
make: *** [at_main.o] Error 1
static void at_setup_pcicmd(struct pci_dev* pdev)
{
u16 cmd;
pci_read_config_word(pdev, PCI_COMMAND, &cmd);
if (cmd & PCI_COMMAND_INTX_DISABLE)
cmd &= ~PCI_COMMAND_INTX_DISABLE;
if (cmd & PCI_COMMAND_IO)
cmd &= ~PCI_COMMAND_IO;
......

static irqreturn_t
at_intr(int irq, void *data)
{
struct at_adapter *adapter = netdev_priv(data);
......

我改成
struct at_adapter *adapter = netdev_priv((struct net_device *)data);
居然报同样的错误。

请大家帮忙。谢谢。
...全文
214 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
strayboy123 2008-06-19
  • 打赏
  • 举报
回复
请问,你是如何解决该问题的。我的情况和你一样,使用redhat 9,但是网卡驱动是 Broadcom tg3 Linux Driver的。
brookmill 2008-04-15
  • 打赏
  • 举报
回复
解决了,网卡可以在2.4使用了。
驱动本身没问题,是内核配置的问题。
谢谢。
brookmill 2008-04-12
  • 打赏
  • 举报
回复
谢谢。

我确实对网卡驱动不熟悉。现在ifconfig看不见eth0,必须用ifconfig -a才能看到,IP地址全是0。在/etc/sysconfig/network-scripts/ifcfg-eth0里配置也不起作用。
随便做下边任何一个动作都会Segmentation fault:
ifconfig up
ifconfig eth0 192.168.31.31 netmask 255.255.255.0
dhclient

现在的问题是,除了这个网卡驱动是2.6,其它所有代码都是2.4的。除非网卡驱动彻底玩不转,不会考虑升级到2.6。
网卡驱动的Makefile有这么一段,所以我觉得还是有希望在2.4用
# 2.4.x & 2.6.x Specific rules
K_VERSION:=$(shell uname -r | cut -c1-3 | sed 's/2\.[56]/2\.6/')
ifeq ($(K_VERSION), 2.6)
# Makefile for 2.6.x kernel
......
else # ifeq ($(K_VERSION),2.6)
# Makefile for 2.4.x kernel
......
endif # ifeq ($(K_VERSION),2.6)
dxing_1983 2008-04-11
  • 打赏
  • 举报
回复
恭喜
hefuhua 2008-04-11
  • 打赏
  • 举报
回复
2.6移植到2.4如果你对网卡驱动不熟悉,成功不大

觉得这样做意义不大,还不如把你redhat内核升级到2.6
brookmill 2008-04-11
  • 打赏
  • 举报
回复
2.6的内核里有PCI_COMMAND_INTX_DISABLE的定义,在 include/linux/pci_regs.h
#define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */

现在我有几个选择:
1. 把驱动里有关PCI_COMMAND_INTX_DISABLE的两行代码删掉;
2. 把PCI_COMMAND_INTX_DISABLE的定义copy到内核头文件;
3. 把PCI_COMMAND_INTX_DISABLE的定义copy到驱动头文件;
4. 在用到PCI_COMMAND_INTX_DISABLE的c文件里直接定义。

大家有什么建议?
谢谢。
brookmill 2008-04-11
  • 打赏
  • 举报
回复
priv的问题貌似解决了,又多加了一层括号就编过去了:
struct at_adapter *adapter = netdev_priv(((struct net_device *)data));

把PCI_COMMAND_INTX_DISABLE的那两行代码删掉之后,整个驱动都编译成功了,不知道能不能凑合着用:)明天试试。然后还得把PCI的spec找来学习一下,看看这个关中断到底是怎么回事,为什么linux/pci.h里没有定义

4,437

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧