一、dm9000_probe函数为网卡初始化函数,在加载驱动模块时执行,完成设备初始化及网络设备注册到系统
dm9000_probe:
 ndev = alloc_etherdev(sizeof(struct board_info));   //net_device分配与初始化
 db = netdev_priv(ndev);          //网卡硬件信息初始化

db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);//地址资源获取
 db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 db->irq_res  = platform_get_resource(pdev, IORESOURCE_IRQ, 0);//中断号获取与初始化

db->addr_req = request_mem_region(db->addr_res->start, iosize, pdev->name);//向内核申请物理资源
 db->io_addr = ioremap(db->addr_res->start, iosize); //网卡中指令缓存(基地址)映射为虚拟地址

db->data_req = request_mem_region(db->data_res->start, iosize, pdev->name);
 db->io_data = ioremap(db->data_res->start, iosize); //网卡中数据缓存(网卡接收和发送暂存)映射为虚拟地址

ndev->netdev_ops    = &dm9000_netdev_ops; //初始化 如 ndo_open、ndo_stop、ndo_start_xmit= dm9000_start_xmit
 register_netdevice            //注册网络设备驱动

二、dm9000_open函数开启网卡 ifconfig eth0 up最终会执行此函数
dm9000_open:
  request_irq(dev->irq, &dm9000_interrupt, irqflags, dev->name, dev)  //注册中断处理函数
  netif_start_queue(dev);   //使能上层(协议栈)调用设备hard_start_xmit功能  ip层dev_queue_xmit调用dm9000_start_xmit

三、dm9000_start_xmit是网卡设备发送函数
dm9000_start_xmit:
  /* Move data to DM9000 TX RAM */
  writeb(DM9000_MWCMD, db->io_addr);                  //写入指令到io_addr
  (db->outblk)(db->io_data, skb->data, skb->len);     //发送data到io_data
  dm9000_send_packet
    iow(dm, DM9000_TXPLL, pkt_len);            //writeb(reg, db->io_addr); writeb(value, db->io_data); 设置发送大小低位
    iow(dm, DM9000_TXPLH, pkt_len >> 8);  //设置发送大小高位
    /* Issue TX polling command */
    iow(dm, DM9000_TCR, TCR_TXREQ);    //发送及清除

四、dm9000_interrupt   //接收中断处理函数 ,数据到来触发中断,cpu执行此函数
dm9000_interrupt
   dm9000_rx(dev)
     dev_alloc_skb  //分配sk_buff套接字缓冲区
     rdptr = (u8 *) skb_put(skb, RxLen - 4)
     (db->inblk)(db->io_data, rdptr, RxLen)//写入缓存 dm9000_inblk_16bit
     netif_rx(skb)   //传送到协议栈
        __skb_queue_tail(&queue->input_pkt_queue, skb);//softnet_data队列,是数据链路层中的数据结构,它是一个Per-CPU变量,每个CPU都有一个
        local_irq_restore(flags);  //恢复本地cpu中断
        napi_schedule(&queue->backlog);           //对软中断进行调度
          __raise_softirq_irqoff(NET_RX_SOFTIRQ); //主动唤起一个软中断

dm9000网卡驱动分析相关推荐

  1. arm平台linux的ethtool配置,ARM-Linux驱动--DM9000网卡驱动分析(四)

    原标题:ARM-Linux驱动--DM9000网卡驱动分析(四) 硬件平台:FL2440 (S3C2440) 内核版本:2.6.35 主机平台:Ubuntu 11.04 内核版本:2.6.39 交叉编 ...

  2. linux 网卡驱动分析,LINUX_网卡驱动分析

    LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...

  3. 以太网卡驱动程序移植linux,基于S3C2440的DM9000网卡驱动的移植

    摘  要: 主要研究了基于Linux内核的网卡驱动的移植.Linux网络设备驱动程序的体系结构可以分为4层,首先分析了各层的具体功能实现,并在此基础上充分利用S3C2440开发板完成DM9000网卡驱 ...

  4. Linux PCI网卡驱动分析

    http://www.uplinux.com/shizi/wenxian/4429.html Linux网卡驱动分析 学习应该是一个先把问题简单化,在把问题复杂化的过程.一开始就着手处理复杂的问题,难 ...

  5. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  6. linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx

    linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...

  7. 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通

    基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通 最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡 ...

  8. Linux网卡驱动分析之RTL8139(五)

    Linux网卡驱动分析之RTL8139(五) deliver_skb(dev.c) // 该函数就是调用个协议的接收函数处理该skb 包,进入第三层网络层处理 static __inline__ in ...

  9. linux x86 网卡 驱动 bd sbk dma,一支使用了DMA的网卡驱动分析

    一支使用了DMA的网卡驱动分析: 1.初始化 x540_priv->start_rx_ptr =(unsigned long)&x540_priv->rx_desc[0]; x54 ...

  10. 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)

    这里我们肯定不是要从零开始编写网卡驱动的. 因为编写网卡驱动时,需要网络基础知识,特别是网络底层的知识,目前还没学. 将来我可能选择在,网络,图像视屏,或USB这个三个方向,选择一个深入钻研. 这里主 ...

最新文章

  1. Visual studio 2005如何实现源码管理
  2. Java:取得当前日期一周之前/之后的日期,或者是一月之前/之后的日期
  3. move_uploaded_file()
  4. 删除远程桌面登陆痕迹
  5. leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
  6. 【小白学云计算】xmpp开源服务器的配置和安装图文详解
  7. PRML 模式识别与机器学习 1.绪论
  8. 谷歌地图api根据经纬度查询地名php,在线查询经纬度 google map查询地名返回经纬度 geocode geocoder的完整实例 代码下载...
  9. 通过httpurlconnection发带图片的文件
  10. 滑动鼠标滚轮后浏览器页面抖动
  11. html svg标签中插入img image标签不显示的问题
  12. gl.glenable()介绍
  13. 深度之眼(十七)——Python标准库
  14. 基于Redis+MySQL+MongoDB存储架构应用
  15. 解决Unity3D使用VRTK时,VR眼镜连接不上的问题
  16. 网页背景 css 黑色,这段让网页背景变成纯黑色的浏览器插件如何优化?
  17. python常识系列07-->python利用xlwt写入excel文件
  18. 用友U8案例教程采购报表
  19. 如何使用虚拟机改ip地址?
  20. 使用Diskpart磁盘管理中的clean命令,误删除了移动硬盘分区后,找回分区并恢复数据方法。(U盘启动盘)

热门文章

  1. c语言对整形indexing,C语言运算符另类分类法
  2. threejs 三面体_Three.js基础探寻五——正二十面体、圆环面等
  3. 10.16作业 如鹏
  4. 修改屏幕分辨率比例,4*3拼接屏 21:9 比例,大屏项目拼接适配屏解决方案
  5. 5款常用的数据可视化工具推荐!
  6. 解决启动eureka报错Unable to start web ... nested exception is org.springframework.boot.web.server.WebS
  7. 康佳电视软件测试工程师,康佳电视怎么样之康佳55吋曲面人工智能电视试用测评...
  8. 123页6万字XX市新型智慧城市顶层设计方案
  9. Java-幸运抽奖系统(综合练习)
  10. “头号电脑黑客” 凯文.米特尼克 与 中国台湾的”电脑鬼才“陈盈豪