热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网卡驱动程序都做了些什么

http:chxxxyg.blog.163.comblogstatic1502811932010528855546092010-06-2820:55:54|分类:armlin
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);

将该数据包递交给上层。

int (*open)(struct net_device *dev):
打开接口. 任何时候 ifconfig 激活它, 接口被打开. open 方法应当注册它需要的任何系统资源( I/O 口, IRQ, DMA, 等等), 打开硬件, 进行任何别的你的设备要求的设置.
void (*tx_timeout)(struct net_device *dev):
数据传输超时调用该方法,处理并恢复报文发送。
i这个超时时间由成员nt watchdog_timeo;来保存。
int (*stop)(struct net_device *dev):
停止接口. 接口停止当它被关闭. 这个函数应当恢复在打开时进行的操作.
void (*set_multicast_list)(struct net_device *dev):
  当设备的组播列表改变和当标志改变时调用的方法

ethtool_ops:

ethtool 是一个实用工具, 设计来给系统管理员以大量的控制网络接口的操作. 用 ethtool, 可能来控制各种接口参数, 包括速度, 介质类型, 双工模式, DMA 环设置, 硬件校验和, LAN 唤醒操作, 等等,

它的核心是一个 ethtool_ops 类型的结构, 里面包含一个全部 24 个不同方法来支持 ethtool. 大部分这些方法是相对直接地;

int (*do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd):

处理特定于接口的 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 标准, 描述以太网收发器如何与网络控制器接口;

这两个函数就是对媒介独立接口的寄存器进行操作的方法。


推荐阅读
author-avatar
SuperBaby蜜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有