http://chxxxyg.blog.163.com/blog/static/150281193201052885554609/
2010-06-28 20:55:54| 分类: arm linux设备驱|字号 订阅
网卡驱动程序主要是实现了结构体struct net_device *ndev 中的一些方法,和中断处理函数:
ndev->open = &dm9000_open;
ndev->hard_start_xmit = &dm9000_start_xmit;
ndev->tx_timeout = &dm9000_timeout;
ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
ndev->stop = &dm9000_stop;
ndev->set_multicast_list = &dm9000_hash_table;/////p531
ndev->ethtool_ops = &dm9000_ethtool_ops;
ndev->do_ioctl = &dm9000_ioctl;
ndev->poll_controller = &dm9000_poll_controller;
db->mii.mdio_read = dm9000_phy_read;
db->mii.mdio_write = dm9000_phy_write;
中断处理函数:static irqreturn_t dm9000_interrupt(int irq, void *dev_id)
其中最重要的是:dm9000_start_xmit和中断处理函数dm9000_interrupt。
dm9000_start_xmit:
初始化数据包的传输. 完整的报文(协议头和所有)包含在一个 socket 缓存区( sk_buff ) 结构.
整个网络系统的数据传输最终都是通过调用该函数来实现的。该函数把数据包写入网卡的SRAM中,并发出数据传输请求。
dm9000_interrupt:
在一个数据包发送完,一个数据包接收到,网络链路状态改变,触发中断,调用该中断处理函数。
在非中断模式下,被函数dm9000_poll_controller调用。
如果是接收到数据包触发了中断,则该中断函数调用函数dm9000_rx(dev);接收数据包,并调用函数netif_rx(skb);
将该数据包递交给上层。
ethtool_ops:
ethtool 是一个实用工具, 设计来给系统管理员以大量的控制网络接口的操作. 用 ethtool, 可能来控制各种接口参数, 包括速度, 介质类型, 双工模式, DMA 环设置, 硬件校验和, LAN 唤醒操作, 等等,
它的核心是一个 ethtool_ops 类型的结构, 里面包含一个全部 24 个不同方法来支持 ethtool. 大部分这些方法是相对直接地;
处理特定于接口的 ioctl 命令. 相应的 net_device 结构中的成员可留为 NULL, 如果接口不需要任何特定于接口的命令.
int (*mdio_read) (struct net_device *dev, int phy_id, int location);
void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val);
媒介独立接口(或 MII) 是一个 IEEE 802.3 标准, 描述以太网收发器如何与网络控制器接口;
这两个函数就是对媒介独立接口的寄存器进行操作的方法。