一、共享网口NCSI的初始化

1.注册ncsi驱动

linux-5.4.11\drivers\net\ethernet\faraday\ftgmac.c

系统起来时,ftgmac100_probe函数,根据dts文件里的ncsi节点是否存在,判断是否需要加载ncsi驱动设备

linux-5.4.11\linux-5.4.11\arch\arm\boot\dts\aspeed-ast2600-evb.dts

所有ncsi驱动相关的代码都在linux-5.4.11\linux-5.4.11\net\ncsi目录下

先介绍几个结构体:

struct ncsi_dev_priv *ndp;  这个是一个总的ncsi驱动设备信息

struct ncsi_channel *hot_channel;    /* Channel was ever active    */曾经使用过的通道channel 信息

struct ncsi_package *active_package; /* Currently handled package  */当前处理的package

struct ncsi_channel *active_channel; /* Currently handled channel  */当前处理的channel

struct ncsi_request requests[256];   /* Request table              */储存ncsi命令和结果

bool                multi_package;   /* Enable multiple packages   */是否允许多个package

u32                 package_whitelist; /* Packages to configure    */允许的package,package 白名单

struct ncsi_package *np;  这个是package的信息,package可以理解为支持的ncsi网卡

bool                 multi_channel; /* Enable multiple channels  */是否允许active多个channel

u32                  channel_whitelist; /* Channels to configure */允许构建active的channel,channel白名单

unsigned int         channel_num; /* Number of channels     */网卡的总端口数

struct ncsi_channel *nc;  这个是channel的信息,channel可以理解为支持的ncsi网卡端口

struct ncsi_channel_mode    modes[NCSI_MODE_MAX]  channnel端口的某些信息,比如端口连接状态 NCSI_MODE_LINK

struct ncsi_cmd_arg nca;  这个是发送ncsi命令,组包的结构体

unsigned char        package;     /* Destination package ID        */ncsi命令发往的package

unsigned char        channel;     /* Detination channel ID or 0x1f */ncsi命令发往的channel

unsigned char        type;        /* Command in the NCSI packet    */ncsi命令的命令字

unsigned char        *data;       /* NCSI OEM data                 */ncsi厂商命令的数据段放在这

struct ncsi_request *nr;  这个是储存ncsi命令和结果的结构体

struct ncsi_request requests[256];   /* Request table              */

ndp可以记录最近的256个ncsi命令及结果,以sk_buff的形式保存在*cmd,*rsp中

struct sk_buff       *cmd;    /* Associated NCSI command packet  */

ncsi命令sk_buff

struct sk_buff       *rsp;    /* Associated NCSI response packet */

ncsi命令结果 sk_buff

2.ncsi驱动注册函数

ncsi_register_dev

  1. 注册ncsi工作队列

ncsi_dev_work

根据当前的state状态,执行不同的功能

ncsi_probe_channel 探测网卡端口的功能,一般网口up起来,或者网卡端口插上网线触发

ncsi_suspend_channel暂停端口的功能,一般在拔网线触发

ncsi_configure_channel构建active网卡端口的功能,一般在probe以后触发,或者端口自适应下拔网线failover另一个端口

2)注册ncsi报文接收处理函数

ncsi_rcv_rsp

Ncsi驱动接收到的控制报文主要分两类:

  1. aen报文,主要是通过插拔网线引起,由网卡发送给系统内核驱动处理,控制网卡端口连接状态
  2. 系统内核驱动发出ncsi命令以后,网卡返回的ncsi命令的响应报文

判断是否是aen报文,Packet type为NCSI_PKT_AEN 0xff,调用aen报文处理函数,aen报文的处理流程后面会讲

Ncsi命令响应报文,根据Packet type,调用ncsi命令响应处理函数

ncsi_rsp_handler  结构体(报文类型,命令的返回有效长度,ncsi命令响应处理函数)

Ncsi命令响应处理函数

Ncsi协议中定义的Packet type和代码中的是一致的

查询网卡端口信息(连接状态,速率等)的ncsi命令举例:

Ncsi命令类型Command Type 0x0a    ncsi响应类型Response Type 0x8a

struct ncsi_pkt_hdr *hdr;  这个是ncsi命令头的结构体,和协议里面是一致的,16个字节

Ncsi命令响应处理函数

Ncsi命令响应包,代码里的结构体如下所示:

  1. 网口up起来,探测网卡package,构建active网卡端口channel

网口up,调用到linux-5.4.11\drivers\net\ethernet\faraday\ftgmac.c  ftgmac100_open函数

如果使用的是phy驱动,调用phy_start(netdev->phydev);

如果使用的是ncsi驱动,调用ncsi_start_dev(priv->ndev);

更新ncsi驱动state状态,调用上文中提到的工作队列,根据当前的state状态,执行探测网卡package的功能

ncsi_dev_work –>ncsi_probe_channel,探测网卡package是通过发送一系列ncsi命令来实现的。我们可以称之为ncsi状态机的变化,具体可以参照协议和代码分析。

ncsi_probe_channel探测网卡package

ncsi_choose_active_channel选择合适的网卡端口

ncsi_configure_channel构建active网卡端口

选择好package以后,就要继续选择channel,ncsi_probe_channel ->ncsi_choose_active_channel

选择合适的网卡端口默认策略是:从网卡第一个端口开始,判断网线是否连接,如果没有连接,继续遍历剩余端口;如果连接,便只构建active此端口;如果所有端口都没有连接网线,默认构建上次连接过网线的端口,之前没有连接过,active第一个端口。

选择好端口以后,就需要构建active网卡端口, ncsi_choose_active_channel-> ncsi_process_next_channel-> ncsi_configure_channel,channel的active也是通过发送一系列ncsi命令来实现的

记录hot_nc,之前连接过网线的端口的信息

至此,如果此端口连接着网线,网络就连通了。

Linux内核ncsi驱动源码分析(一)相关推荐

  1. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  2. (转)Linux设备驱动之HID驱动 源码分析

    //Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...

  3. linux网卡驱动源码分析(一)

    linux网卡驱动源码分析(一) linux struct linux内核 网络 descriptor resources 转自http://blog.csdn.net/ustc_dylan/arti ...

  4. linux打印源码,Linux打印机驱动源码分析.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsplinux/Unix相关 Linux打印机驱动源码分析.pdf1 ...

  5. LCD驱动源码分析(s3cfb.c)

    1.驱动源码分析大致思路 (1)分析LCD驱动首先需要分析内核的帧缓冲子系统,因为LCD驱动就是按照帧缓冲子系统提供的注册接口来注册的: (2)内核帧缓冲子系统参考博客:<Linux 帧缓冲子系 ...

  6. 通用USB设备驱动源码分析

    通用USB设备驱动源码分析 Author:aaron 前段时间写了篇<qualcomm usb modem驱动小结>的文章, 描述了自己如何为高通的一个usb modem设备写驱动的过程, ...

  7. linux显示启动logo源码分析以及修改显示logo

    1.linux显示启动logo整个流程分析 (1)logo图片在内核源码中是以ppm格式的文件保存,在编译内核时会把ppm格式的文件自动转换成.c文件,在c文件中会构造一个struct linux_l ...

  8. Linux brk(),mmap()系统调用源码分析3:brk()的内存申请流程

    Linux brk(),mmap()系统调用源码分析 brk()的内存申请流程 荣涛 2021年4月30日 内核版本:linux-5.10.13 注释版代码:https://github.com/Rt ...

  9. hisi3516dv300芯片基于hwmon驱动框架的温度获取驱动源码分析

    1.内核hwmon驱动框架 参考博客:<内核hwmon驱动框架详解以及海思芯片温度驱动分析>: 2.驱动实现的效果 /sys/devices/virtual/hwmon/hwmon0 # ...

  10. 鸿蒙轻内核M核源码分析:中断Hwi

    摘要:本文带领大家一起剖析了鸿蒙轻内核的中断模块的源代码,掌握中断相关的概念,中断初始化操作,中断创建.删除,开关中断操作等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列五 中断Hwi&g ...

最新文章

  1. 后端直接跳转前端页面_WEB前端开发中页面跳转等待时间过长如何解决?
  2. CLion 远程Linux服务器 开发调试
  3. boost::math模块非有限环回的基本测试
  4. xp和win 2003远程桌面强制进入命令_远程登录t人命令
  5. string 大小写转换
  6. android 增加触摸范围,android seekBar 增加点击和滑动范围
  7. 一题多解(二)—— 循环队列为空(满)的判断
  8. 机器学习决策树_机器学习-决策树 Decision Tree
  9. 下标随着页面链接的跳转
  10. 考研数学 - 初数基础整理09
  11. 阴险的codeproject
  12. 确定你的电脑是否支持安装64位操作系统
  13. mac vs 返回上一步_mac 后退一步 快捷键
  14. python星星闪烁_python实现while循环打印星星的四种形状
  15. 2023华为od面经~ (笔试 HR资面 技术面 一面 二面 综面)
  16. SIM7600连接MQTT流程
  17. WinForm登陆成功后跳转到主窗口
  18. php中的 -是什么
  19. Ruby for Rails 最佳实践十六
  20. Pycharm创建项目“New environment using“与“Existing interpreter“的区别

热门文章

  1. 如何成为优秀的程序员?
  2. 【解决方案】Ubuntu18.04 安装L2TP及相关设置
  3. mysql field in set_MySQL中的find_in_set()函数使用技巧心得与应用场景总结
  4. 低延迟视频传输 UDP JPEG图像压缩 opencv
  5. MySQL 5.7 + Navicat 下载安装教程(附安装包)
  6. GitHub 和 gitlab 的使用
  7. python小乌龟编程_Python案例——喝墨水的小乌龟
  8. Word目录怎么自动生成?Word文档怎么自动生成目录列表
  9. 考研数学:常见的的泰勒公式
  10. 浏览器 文本转语音播放 Demo [SpeechSynthesis]