计划,把这个3c501自己看完后,再看一下潘刚的文章, 应该可以对整个网络的流程有个更清晰的认识了. 周五前把这个代码看完,周五开始看潘刚
6.21
这个驱动是3c501芯片的驱动。 是作为模块插入的。
模块的开始在
一
init_module()开始 其中:
首先,net_device的结构 的中断请求编号irq赋值,这个值默认为5,可以在插入模块的时候指定;设定 i/o地址,默认为0x280,也可以在加入模块的时候指定。
其次,register_netdev(&net_device)注册这个设备。这个函数做的事情就是调用net_device 的init定义的函数入口:el1_probe()
二 el1_probe(struct net_device *dev)函数
首先 设置为内核模块的设备。
SET_MODULE_OWER(dev) ;//equal to dev->owner=THIS_MODULE;
而后 根据设置的i/o地址范围 调用el1_probe1(dev,base_addr)
三 el1_probe1
首先request_region(ioaddr,16 ,dev->name) 为设备请求一个从ioaddr开始,16个端口数目的I/O端口。
而后 向el1_dataptr写入0――5 , 端口地址el2_saprom 读取字节。保存在sataion_addr中//这个是做什么呢?给不同的地址写入,然后看saprom的值?
再根据station_addr的前3个参数来确定vender的值 。如果没有信息则 释放所占用的i/o端口 release_region(ioaddr,El1_IO_EXTENT);
接下来 对dev->irq进行判断,主要是考虑用户指定irq小于2的情况。
Autoirq_setup(2) 自动设定中断探测
Inb(RX_STATUS) //程序中注释为清楚未决的中断 ,inb除了读出还有清空?
Inb(TX_STATUS) 读出i/o地址的信息?可是为什么没有保存给一个变量呢?
然后给ax寄存器分别写入一些值,具体值的含义也许和芯片有关系吧,
再调用autoirq_report(1) 表示1个 jiffies之后 调用autoirq_setup返回irq数量。如 为零则表示无法分配中断号了,则释放先前申请的I/O地址
void autoirq_setup(int waittime); 该函数设置中断探测,在这里忽略了waittime参数。
int autoirq_report(int waittime); 该函数延迟给定的时间(以jiffies计算),然后返回自调用autoirq_setup以后产生的IRQ数量。 这些函数最初是在网络驱动程序的代码中使用,由于历史原因,它们现在用probe_irq_on和probe_irq_off实现。通常没有必要使用 autoirq_ 函数,而应该使用 probe_irq_。
如果dev->irq>2,