A20 网卡驱动分析

网卡芯片为realteak 8201

1.  net_device结构体的分配和注册

     1) "/drivers/net/ethernet/sun7i/sun7i_wemac.c"

     wemac_probe()

             ndev = alloc_etherdev(sizeof(struct wemac_board_info));     分配

             ret = register_netdev(ndev);                                                   注册

     2) alloc_etherdev定义在 "/include/linux/etherdevice.h"

    #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
     #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count)


    3) alloc_etherdev_mqs定义在 "/net/ethernet/eth.c"

     struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs,
                      unsigned int rxqs)
     {
              return alloc_netdev_mqs(sizeof_priv, "eth%d", ether_setup, txqs, rxqs);
     }


2. 发包函数

   "/drivers/net/ethernet/sun7i/sun7i_wemac.c"

    /*
       *  Hardware start transmission.
       *  Send a packet to media from the upper layer.
    */
     static int wemac_start_xmit(struct sk_buff *skb, struct net_device *dev)

             1) dev->stats.tx_bytes += skb->len;              发包统计信息

             2)将skb数据写入网卡

             /* set TX len */
             writel(skb->len, db->emac_vbase + EMAC_TX_PL0_REG);
             /* start translate from fifo to phy */
            writel(readl(db->emac_vbase + EMAC_TX_CTL0_REG)
                | 1, db->emac_vbase + EMAC_TX_CTL0_REG);
             dev->trans_start = jiffies;    /* save the time stamp */

             3) 释放skb

             dev_kfree_skb(skb);                                   释放skb

             4) netif_stop_queue(dev);                         停止队列,数据发送完后由中断处理程序来唤醒队列

3. 中断处理程序

    static irqreturn_t wemac_interrupt(int irq, void *dev_id)

     1)  wemac_tx_done(dev, db, int_status)

          当数据发送完后,产生中断,此函数调用,然后调用netif_wake_queue(dev)来唤醒队列

    2)  wemac_rx(dev)

          接收数据包,最终调用netif_rx接收skb

4. MAC地址设置

   "/drivers/net/ethernet/sun7i/sun7i_wemac.c"

   static int wemac_set_mac_address(struct net_device *dev, void *p)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装用户debian7安装oracle11g

改章节笔者在北京游玩的时候突然想到的...这几周就有想写几篇关于安装用户的笔记,所以回家到之后就奋笔疾书的写出来发表了 apt-get install gcc g make binutils libc6 libc6-dev libstdc6 libstdc5 rpm gawk alien ksh lesstif2 libaio1 linux-headers elfutils…

python交互式编程客户端_【python】UDP网络编程:实现服务端与客户端的交互、简单的AI智能模式...

关于UDP网络编程UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。UDP是面向非连接的协议,它不与对方建立连接,而是直接把要发的数据发给对方。【UDP网络编程的特点】1,每个数据中都给出了完整的地址信息&#xff…

python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮

我有一个程序在画布中放置复选按钮,当选项(另一个复选按钮)被选中时。我有另一个选项(另一个复选按钮)来画线。为了画线,首先我应该选择checkbutton“draw a line”,然后单击放置在画布中的任何checkbutton,另一个单击画布上的任何…

各个层次的gcc警告

各个层次的gcc警告 从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attribute__ ((unused)); 指定该变量为"未使用的".即使这个变量没有被使用,编译时也会忽略则个警告输出. 文件级:在源代码文件中诊断(忽略/警告) 语法: #pragma GCC diagnostic [er…

【转】C++ GetLastError() 返回值对应表

〖0〗-操作成功完成。〖1〗-功能错误。〖2〗-系统找不到指定的文件。〖3〗-系统找不到指定的路径。〖4〗-系统无法打开文件。〖5〗-拒绝访问。〖6〗-句柄无效。〖7〗-存储控制块被损坏。〖8〗-存储空间不足,无法处理此命令。〖9〗-存储控制块地址无效。〖10〗-环境错…

hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...

今天梦翔儿,成功实现hadoop编程,将本地文件夹中多个文件,合并为一个文件并上传到hdfs中直接上代码:PutMerge.javaimport java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataIn…

js 获取鼠标在画布的位置_云凤蝶如何打造媲美 sketch 的自由画布

在 Design Tools 中,组件间的对齐与吸附功能是否好用是决定其画布是否可以高效进行产品设计的关键因素。云凤蝶作为一款快速制作高品质中后台应用的 hpaPaaS 平台,同样拥有自由拖拽的可视化画布。那么在云凤蝶的自由画布中,对齐规则是怎样的&…

GCC 使用摘记

1. 几个子程序和说明cc1C 的实际编译程序cc1plusC 的实际编译程序collect2在不使用 GNU连接程序的系统上,用来产生特定的全局初始化代码crt0.o为每个系统定制的初始化和结束代码libgcc默认连接的 gcc 例程库libstdc默认连接的 g 例程库 2. 几个重要的和 GCC 协同工作…

不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...

现在给个飞速发展的社会,在我们日常生活中交际表达能力非常的重要,但是还是有一部分人比较内向,不善于表达自己的内心,也不喜欢和别人接触,那么这一类人从事哪些行业比较合适呢?下面我就跟大家讨论一下。性…

python组合函数_Python---函数---参数组合

# 参数组合# 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数# 这5中都可以组合使用# 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数# 比如定义一个函数,包含上述若干…

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题。在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的,这次看AM335X的代码顺手写一下分析&#xf…

python生成验证码_python之验证码生成(gvcode与captcha)

今天向大家总结一下python在做项目时用到的验证码生成工具:gvcode与captchagvcode全称:graphic-verification-code安装:pip install gvcode使用:import gvcodes, v gvcode.generate() #序列解包s.show() #显示生成的验证码图片pr…

设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则

(3)单一职责原则 单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。例如,我们在写一个窗体应用程序,一般都会生成一个Form这样的类,于是我们就把各种各样的…

是网关吗_智能家居网关功能这么多,你都知道吗?

在科技发达的今天,我们的生活也开始趋向于智能化,智能家居已经迎来了新时代。电动窗帘、扫地机器人、电视、空调等电器都能智联wifi,可是使用的时候得一个个去控制,数量多的话懒癌们肯定嫌麻烦的。所以很多聪明的人都选择安装智能…

eventfd以及epoll原理分析

这两天公司代码中用到了epoll。然后在跟同事闲扯的过程中发现了Linux中有eventfd。两者虽然名字看起来差不多,但是相关性倒是不多。为了弄明白这两个东西到底在内核上是怎么实现的,这两天将内核这两个部分的相关代码看了下,也终于明白了这两个…

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

【题目描述】 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量(QoS,Qualityof Service)问题已越来越受到重视。网络中采用的数据包调度机制与网络的服务质量 QoS 有着密切的关系。研究表明传统的基于队列的调…

iOS vs. Android,应用设计该如何对症下药?

摘要:从iOS到Android,两大平台应用设计有何不同?又都存在什么样的问题?Android定制性太高,该如何进行UI设计?在CMDN CLUB第28期活动中,咕咚网高级产品经理王磊,从iOS、Android谈起&a…

postman数据保存在哪里_Postman 历史记录导出的解决方案

Postman 可以说是我在 CTF 中使用最多的工具了。它确实非常好用,但我并没有完全掌握它的使用之道,因此大量的历史请求堆在一起,显得环境无比混乱。 虽说是有想要改变的想法,但这些历史记录还是非常重要的,一时间难以割舍。于是便开始寻找导出的方案。 indexedDB 我们知道,…

cs8900a网卡驱动--寄存器

1. CS8900内部有一个4k的RAM用于访问其内部寄存器,称为PacketPage。 2. LineCTL 网卡状态设置 从上图看到,此寄存器的6,7位用于设置网卡的收发使能。8,9位用于设置网卡状态。是10BASE-T还是 AUI。下面这图更详细介绍了8&…

python输入序列语句_Python基础教程(一) - 序列:字符串、列表和元组

这一章我们主要研究这样一些类型,他们的成员是有序排列的,并且可以通过下标偏移量访问的,这类Python类型统称为序列,包括字符串、列表和元组。序列类型操作符成员关系操作符(in、not in):成员关系操作符是用来判断一个…