Linux stmac网卡代码分析 -- open

Open

stmmac_open是在stmmac_netdev_ops结构体里的,这个ops在probe时就已经注册到了net_device结构体里,在网卡对于stmmac_open函数调用的时间我还不确定是否是在网卡link up时

下面看看stmmac_open函数,文件位置: drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
在这里插入图片描述

在open函数中主要完成了以下操作

  • 连接到PHY,设置好合适的速率

  • 申请、初始化dma 描述符资源和队列,在后面初始化网卡的dma 引擎时会将用到

  • 初始化DMA

  • 初始化MAC

  • 申请、初始化中断资源

  • enable、start队列

下面来实际看看代码

static int stmmac_open(struct net_device *dev)
{struct stmmac_priv *priv = netdev_priv(dev);u32 chan;int ret;if (priv->hw->pcs != STMMAC_PCS_RGMII &&priv->hw->pcs != STMMAC_PCS_TBI &&priv->hw->pcs != STMMAC_PCS_RTBI) {ret = stmmac_init_phy(dev);if (ret) {netdev_err(priv->dev,"%s: Cannot attach to PHY (error: %d)\n",__func__, ret);return ret;}}/* Extra statistics */memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats));priv->xstats.threshold = tc;priv->dma_buf_sz = STMMAC_ALIGN(buf_sz);priv->rx_copybreak = STMMAC_RX_COPYBREAK;//分配描述符资源放到priv->rx_queue[queue] priv->tx_queue[queue]ret = alloc_dma_desc_resources(priv);if (ret < 0) {netdev_err(priv->dev, "%s: DMA descriptors allocation failed\n",__func__);goto dma_desc_error;}//初始化接收和发送描述符资源队列ret = init_dma_desc_rings(dev, GFP_KERNEL);if (ret < 0) {netdev_err(priv->dev, "%s: DMA descriptors initialization failed\n",__func__);goto init_error;}//初始化DMA、MACret = stmmac_hw_setup(dev, true);if (ret < 0) {netdev_err(priv->dev, "%s: Hw setup failed\n", __func__);goto init_error;}stmmac_init_tx_coalesce(priv);//if (dev->phydev)phy_start(dev->phydev);/* Request the IRQ lines */ret = request_irq(dev->irq, stmmac_interrupt,IRQF_SHARED, dev->name, dev);if (unlikely(ret < 0)) {netdev_err(priv->dev,"%s: ERROR: allocating the IRQ %d (error: %d)\n",__func__, dev->irq, ret);goto irq_error;}/* Request the Wake IRQ in case of another line is used for WoL */if (priv->wol_irq != dev->irq) {ret = request_irq(priv->wol_irq, stmmac_interrupt,IRQF_SHARED, dev->name, dev);if (unlikely(ret < 0)) {netdev_err(priv->dev,"%s: ERROR: allocating the WoL IRQ %d (%d)\n",__func__, priv->wol_irq, ret);goto wolirq_error;}}/* Request the IRQ lines */if (priv->lpi_irq > 0) {ret = request_irq(priv->lpi_irq, stmmac_interrupt, IRQF_SHARED,dev->name, dev);if (unlikely(ret < 0)) {netdev_err(priv->dev,"%s: ERROR: allocating the LPI IRQ %d (%d)\n",__func__, priv->lpi_irq, ret);goto lpiirq_error;}}stmmac_enable_all_queues(priv);stmmac_start_all_queues(priv);return 0;

再看看对硬件操作比较多的stmmac_hw_setup(dev, true); 这个函数中主要初始化了DMA和MAC,并使能了DMA

static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)-> ret = stmmac_init_dma_engine(priv);-> stmmac_reset(priv, priv->ioaddr);-> stmmac_dma_init(priv, priv->ioaddr, priv->plat->dma_cfg, atds);-> stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);-> stmmac_init_rx/tx_chan()-> stmmac_set_rx/tx_tail_ptr(priv, priv->ioaddr,rx_q->rx_tail_addr, chan) 把收发队列地址配置到网卡-> stmmac_core_init(priv, priv->hw, dev); //这是个回调函数 对应的是 dwmac1000_dma_init(),在probe时注册的-> stmmac_mac_set(priv, priv->ioaddr, true);-> stmmac_dma_operation_mode(priv);-> stmmac_set_rings_length(priv);-> stmmac_start_all_dma(priv);

对于DMA和MAC的初始化我整理成了流程图表

在这里插入图片描述

下面是对MAC的初始化流程

在这里插入图片描述

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

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

相关文章

g++ linux 编译开栈_方舟编译器编译hello world踩坑全记录

闲来无事&#xff0c;看到方舟编译器完整开源&#xff0c;于是打算拿来试着编译一个东西来&#xff0c;接下来把踩过的一些坑记录一下。参考文档方舟编译器的官网是OpenArkCompiler​www.openarkcompiler.cn但是这个网站上的文档其实是过时的&#xff0c;没有更新过的&#xff…

绘制自定义键盘

先看下微信当中的自带的数字键盘 这种实现方式比较简单&#xff0c;可以直接用inline-block标签&#xff0c;设置每行平均宽度&#xff0c;比如一行要放4个按钮&#xff0c;可以那么宽度就可以设为25%&#xff0c;同时要注意设置css样式为box-sizing: border-box,这样在设置边框…

配置管理小报100329:脚本中ftp命令无法自动输入密码怎么办?

为什么80%的码农都做不了架构师&#xff1f;>>> 知识点&#xff1a; 作者&#xff1a;王&#xff08;zbwangjian.cn&#xff09; 脚本中ftp命令无法自动输入密码怎么办&#xff1f;参考&#xff1a; http://www.linji.cn/post/1620/ http://www.hamo…

linux下使用网易邮箱发邮件

0x0 最近要写个脚本监视系统运行情况&#xff0c;有异常及时通过邮件通知我。 本次测试中使用网易的邮箱作为邮件发送服务器&#xff08;邮箱账号需要开启smtp服务如下图&#xff09;&#xff0c;由于网易邮箱验证比较严格&#xff0c;需要进行一些额外操作才可以正常发送邮件…

ubuntu下网易云音乐适配高分辨率屏幕

0x0 环境 ubuntu20处理器 AMD 我主流工作环境是Ubuntu20&#xff0c;而且很依赖音乐&#xff0c;网易云音乐适配了Ubuntu&#xff0c;而最近我换了个4K屏幕 开机启动网易云音乐后发现界面文字变得很小完全没法看&#xff0c;如下图 分析发现网易云音乐是通过 /opt/netease/ne…

Java基础 —— 异常

目录异常的概念及分类异常的处理try-catch-finally异常抛出throw(s)自定义异常异常的概念及分类 什么是异常 异常是指在程序的运行过程中发生的一些不正常事件。比如&#xff1a;除0溢出、数组下标越界、所要读取的文件不存在。 异常导致的后果 项目JAVA程序的执行过程中如出现…

解决网站请求速度慢的一些方法

开门见山&#xff0c;网站请求反应速度慢首先考虑服务器问题。 我在开发中遇到的就是服务器实例限制cpu占用10%以内访问正常&#xff0c;超出则限制访问速度&#xff0c;也就是网站请求速度慢 具体和阿里工程师聊天截图如下&#xff1a; 按照对方说的&#xff0c;升级了相关配置…

Windows Server 2012 在个人终端上使用的推荐设置

Windows Server 2012&#xff0c;也就是 Windows 8 的服务器版本&#xff0c;相对于 Windows 8 企业版而言&#xff0c;增强了作为服务器的功能&#xff0c;弱化了作为终端系统的功能。   目前微软官方提供了 Windows 8 企业版&#xff08;90 天评估期&#xff09;和 Windows…

Java高级 —— 泛型

目录泛型概念泛型可设置多个类型参数泛型继承泛型接口限制泛型可用类型泛型通配声明泛型方法泛型方法限制泛型可用类型泛型概念 问题引入&#xff1a;如果我们需要产生多个对象&#xff0c;每个对象的逻辑完全一样&#xff0c;只是对象内的成员啊变量的类型不同。那我们如何去…

wopihost

项目介绍 基于wopi协议开发的WopiHost, 支持word, excel&#xff0c;ppt(仅支持预览)等文档的预览和编辑。 运行环境 需要安装Office online 2016才可以使用&#xff0c;基于jdk 1.8&#xff0c;spring boot开发。 使用案例 word文档预览 http://[owas.domain]/wv/wordviewerfr…

java 人物属性

写代码&#xff0c;可以浏览人物的属性&#xff1a;package day14; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JComboBox; im…

安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动翻页

摘自&#xff1a;安卓APP_ Fragment&#xff08;5&#xff09;—— Fragment ViewPager2 模拟微信首页 &#xff08;2&#xff09;两者联动实现翻页 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-22 00:11:43 网址&#xff1a;https://blog.csdn.net/weixin_4474…

stmmac描述符的结构和初始化

stmmac 描述符&#xff08;Descriptors&#xff09; stmmac的描述符有两个个模式&#xff0c;分别是ring模式和chain模式&#xff0c;根据特性的不同支持&#xff0c;描述符又有以下3个形式norm、Alternate 、 Enhanced。下面主要讲下ring模式下的Enhanced描述符结构&#xff…

Android中利用productFlavors配置多渠道

build.gradle(app)设置 android {flavorDimensions "default"productFlavors{//不同渠道360{dimension "default"//替换AndroidManifest中的值manifestPlaceholders [channel_value:"360"]}qq{dimension "default"//替换AndroidManif…

Ubuntu服务器安装snmpd(用于监控宝)

2019独角兽企业重金招聘Python工程师标准>>> 一、安装snmpd&#xff1a; sudo apt-get install snmpd 二、修改配置文件 vi /etc/snmp/snmpd.conf 找到这样的两行 agentAddress udp:127.0.0.1:161 #agentAddress udp:161,udp6:[::1]:161 将他们的注释交换一下 #…

安卓APP_ 四大基本组件(1)—— Activity

摘自&#xff1a;安卓APP_ 四大基本组件&#xff08;1&#xff09;—— Activity 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-22 15:56:18 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/116006048 配合菜鸟教程食用效果更佳&#xf…

radare2 常用操作总结

radare2 简介 radare2是一个用C语言编写的跨平台的二进制分析工具&#xff0c;支持ARM、MIPS、X86等平台&#xff0c;支持分析多种格式的二进制文件如ELF、Mach-O、Fatmach-O, PE、PE、 MZ、 COFF等&#xff0c;同时也支持多种操作系统如Windows (since XP)、GNU/Linux、GNU/D…

序列化与反序列化(1)Serializable —— Java原生态方法

摘自&#xff1a;序列化与反序列化&#xff08;1&#xff09;Serializable —— Java原生态方法 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-05-08 19:20:21 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/116503261 本文为学习笔记&…

极路由4刷机

准备工作 https://www.right.com.cn/forum/thread-161906-1-1.html https://breed.hackpascal.net/ 在第二个链接里下载路由器对应的breed固件&#xff0c;固件的说明见第一个链接&#xff0c;下文以极路由4为例演示 由于极路由官方挂了&#xff0c;无法进行root&#xff0…

评论安装_评论送|机电安装监理质量控制要点130页

来源&#xff1a;网络整理&#xff0c; 如有侵权请联系删除因本文篇幅有限&#xff0c;只能展示60页&#xff0c;全部130页需要您对本文进行精彩评论或者转发分享&#xff0c;加微信dahe0608送给您本文的ppt原件因本文篇幅有限&#xff0c;只能展示60页&#xff0c;全部130页需…