zoukankan      html  css  js  c++  java
  • 网卡驱动程序都做了些什么

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

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

  • 相关阅读:
    n维向量空间W中有子空间U,V,如果dim(U)=r dim(V)=n-r U交V !={0},那么U,V的任意2组基向量的组合必定线性相关
    生成相关矩阵
    线性变换与基变换
    关于基变换
    证明 U and V={0}时 dim(U+V)=dim(U)+dim(V)
    开发框架继承窗体添加按钮并授权
    线性方程组与基尔霍夫定律
    按绑定数据设置单元格风格
    威伦TK6070iQ触摸屏的使用
    s7-200 PID控位
  • 原文地址:https://www.cnblogs.com/cute/p/2131136.html
Copyright © 2011-2022 走看看