首先,向大家推荐一些文章。

http://blog.chinaunix.net/uid-24148050-id-131084.html

http://hi.baidu.com/lds102/item/eae3262c77b897de0f37f966

http://blog.csdn.net/zyboy2000/article/details/4525726

这上面说了MII、RMII、SMII、GMII等一系列的接口。

网口一般是这样

MacàPhyà网络变压器àRJ45口

但是只是从电路上不一定看得这么清楚,应为有些是集成的,例如DM9000就是mac+phy,还有很多网络变压器和RJ45口在一起。对于我们写驱动,要知道的是Mac和Pht之间的接口,其他的还是比较透明的。而它们的接口就是上面提的一些。

MII是(Medium Independent Interface)的意思,是指不用考虑媒体是铜轴、光纤、电缆等,因为这些媒体处理的相关工作都有PHY或者叫做MAC的芯片完成。 MII支持10兆和100兆的操作,不支持1000兆。

我们看一下MII的接口图(分别相对于mac和 phy)

前16位是数据传输,MDC和MDIO是SMI总线的东西,用于管理phy。这篇文章主要就是看linux内核对SMI总线的使用。

上面有篇文章是这么说的:

Mac对Phy的管理是使用SMI(SerialManagement Interface)总线通过读写PHY的寄存器来完成的。PHY里面的部分寄存器是IEEE定义的,这样PHY把自己的目前的状态反映到寄存器里面,MAC通过SMI总线不断的读取PHY的状态寄存器以得知目前PHY的状态,例如连接速度,双工的能力等。

上面让我在意的是PHY里面的部分寄存器是IEEE定义的。那我们看看内核里的定义吧.linux-3.0.8

include/linux/mii.h

/* Generic MII registers. */

#define MII_BMCR 0x00 /* Basic mode control register */

#define MII_BMSR 0x01 /* Basic mode status register */

#define MII_PHYSID1 0x02 /* PHYS ID 1 */

#define MII_PHYSID2 0x03 /* PHYS ID 2 */

#define MII_ADVERTISE 0x04 /* Advertisement control reg */

#define MII_LPA 0x05 /* Link partner ability reg */

#define MII_EXPANSION 0x06 /* Expansion register */

#define MII_CTRL1000 0x09 /* 1000BASE-T control */

#define MII_STAT1000 0x0a /* 1000BASE-T status */

#define MII_ESTATUS 0x0f /* Extended Status */

#define MII_DCOUNTER 0x12 /* Disconnect counter */

#define MII_FCSCOUNTER 0x13 /* False carrier counter */

#define MII_NWAYTEST 0x14 /* N-way auto-neg test reg */

#define MII_RERRCOUNTER 0x15 /* Receive error counter */

#define MII_SREVISION 0x16 /* Silicon revision */

#define MII_RESV1 0x17 /* Reserved... */

#define MII_LBRERROR 0x18 /* Lpback, rx, bypass error */

#define MII_PHYADDR 0x19 /* PHY address */

#define MII_RESV2 0x1a /* Reserved... */

#define MII_TPISTATUS 0x1b /* TPI status for 10mbps */

#define MII_NCONFIG 0x1c /* Network interface config */

我们在看看DM9000的定义:

不是所有都支持。

例如我们要启动自动协商机制,只要把control寄存器的的第12位置1就可以了。

现在摆在我们的面前有两个问题

1. DM9000如何操作去写或读。

2. linux提供了什么样的接口。

先看第一个问题:下面是DM9000的几个寄存器

上面可以看成是4个寄存器

EPCR: phy控制寄存器

EPAR: phy地址寄存器

EPDRL:phy数据寄存器低8位

EPDRH:phy数据寄存器高8位

读:

1. 先写入寄存器的地址(就是上面的MII Register Description上面的。你可以在mii.h中看到定义)到EPAR寄存器。

2. 把EPCR的ERPRR位(读命令)和EPOS(选择PHY)置位。

3. 读EEPROM用的是等待EPCR的ERRE变为0,为1表示正在进行。读PHY用的是延时1m秒。看一下uboot,都是用延时等待。

4. 清除EPCR的ERPRR位。

5. 读EPDRL和EPDRH。

写:

1. 先写入寄存器的地址到EPAR寄存器。

2. 写数据到ERDRL和EPDRH。

3. 把EPCR的ERPRW(写命令)和EPOS(选择PHY)置位。

4. 延时1m秒,等待完成。

5. 清除EPCR的ERPRR位。

下面我们看linux内核提供的接口。

struct mii_if_info {

int phy_id;

int advertising;

int phy_id_mask;

int reg_num_mask;

unsigned int full_duplex : 1;/* is full duplex? */

unsigned int force_media : 1;/* is autoneg. disabled? */

unsigned int supports_gmii : 1; /* are GMII registers supported? */

struct net_device *dev;

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);

};

看一下dm9000网卡的初始化:

db->mii.phy_id_mask = 0x1f;//这个给驱动用,dm9000没用,是考虑smi总线上有多个phy时。

db->mii.reg_num_mask = 0x1f;//寄存器mask

db->mii.force_media = 0;

db->mii.full_duplex = 0;

db->mii.dev = ndev;

db->mii.mdio_read = dm9000_phy_read;

db->mii.mdio_write = dm9000_phy_write;

dm9000不支持gmii,所以没对它初始化

如果你提供了这些,对phy的操作就可以同drivers/net/mii.c中的函数去操作,不用再去看那些mii的寄存器了(当然有些非标准的要自己写)。我看看mii.c提供的

EXPORT_SYMBOL(mii_link_ok);

EXPORT_SYMBOL(mii_nway_restart);

EXPORT_SYMBOL(mii_ethtool_gset);

EXPORT_SYMBOL(mii_ethtool_sset);

EXPORT_SYMBOL(mii_check_link);

EXPORT_SYMBOL(mii_check_media);

EXPORT_SYMBOL(mii_check_gmii_support);

EXPORT_SYMBOL(generic_mii_ioctl);

我们上次说的ethtool很多要依赖它们。

mii_link_ok:读链接状态

mii_nway_restart: 重启接口的自动协商机制

mii_ethtool_gset:获取接口设置。查看结构体struct ethtool_cmd有什么设置,上篇文章说过。

mii_ethtool_sset:设置接口设置。

mii_check_link:检测MII链接状态。这个会调用netif_carrier_on/off上报内核。

mii_check_media:检查双工改变。Full or Half

mii_check_gmii_support:是否支持gmii,这个是1000M的支持

generic_mii_ioctl:ioctl接口。这个可以放在驱动的ioctl里面,用户可以通过socket的ioctl调用。

下次我们说一个千兆的网卡,对phy的控制。

Linux网卡驱动适配各个内核,网卡驱动8 MII接口以及linux内核对MII的支持相关推荐

  1. linux mii 网卡驱动,网卡驱动8-MII接口以及linux内核对MII的支持

    首先,向大家推荐一些文章. 这上面说了MII.RMII.SMII.GMII等一系列的接口. 网口一般是这样 MacàPhyà网络变压器àRJ45口 但是只是从电路上不一定看得这么清楚,应为有些是集成的 ...

  2. 驱动开发: 封装内核级驱动读写

    内核级别的内存读写可用于绕过各类驱动保护,从而达到强制读写对端内存的目的,本人闲暇之余封装了一个驱动级的内核读写接口,使用此接口可实现对远程字节,字节集,整数,浮点数,多级偏移读写等. 项目地址:Gi ...

  3. 统信国产操作系统UOS升级内核——解决12代及以上cpu驱动适配问题,网卡驱动问题

    由于条件有限,uos家庭版均在vm虚拟机中运行. 第一步:查看本机的version版本 cat /proc/version 上面的图片就可以看到,内核的version是5.10. 第二部:下载最新的v ...

  4. linux内核带usb驱动,Linux3.4内核USB驱动的移植

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:李老师,华清远见嵌入式学院讲师. [实验目的] USB接口是现在计算机系统中最通用的一种接口,通过移植USB驱动,了解Linux3.4内核与Linu ...

  5. 华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动

    定制Android之4G-LTE模块驱动 一.        简介 本文讲述在Android内核中,添加中国移动4G-LTE制式华为MU909模块驱动,实现通过4G上网业务,电话业务,短信业务. CP ...

  6. linux编译安装网卡驱动详解(网卡丢包)

    安装编译网卡驱动 这两天发现一台server丢包很严重,使用cacti监控工具时能获得snmp包,时常又不能,丢包严重,导致使用ssh工具连接过慢,连接数据库访问超时,此时要先确定是中病毒还是网卡问题 ...

  7. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...

    2.检查网卡是否加载: 驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和Windows系统不同Linux内核目前采用可加载的模块化设计(LKMs Loadable Kerne ...

  8. linux usb网卡驱动 ko,qf9700 USB网卡在x86 linux和arm linux上的驱动安装以及配置

    最近要在一块老板子上面移植openwrt,需要扩展网口,于是选择了qf9700这款USB网卡,附赠的光盘里面有提供在linux下面安装的驱动源代码,所以我们要自己编译驱动源代码生成内核加载模块,加载模 ...

  9. 瑞昱网卡支持linux吗,Linux 上安装Realtek瑞昱网卡驱动

    新买了个笔记本,安装了Ubuntu 16.04,发现笔记本的Realtek瑞昱无线网卡不能自动被linux识别.上网查找原因为驱动问题,也有很多人抱怨过Realtek瑞昱网卡在linux上驱动难弄. ...

最新文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案
  2. Matlab中的算术运算和数学函数
  3. java ajax 获取headers_jquery ajax 怎么获得返回的response headers
  4. linux中here文档,Linux下Bash Heredoc(Here document)的用法及基本示例
  5. flex的12个属性
  6. php读取csv指定行_PHP快速读取CSV大文件指定行
  7. 【JSOI2007】【BZOJ1029】【codevs2913】建筑抢修,贪心与堆
  8. 你不是一个人在战斗!
  9. mysql索引条件下推_MySQL 索引条件下推优化
  10. c++基础:继承与组合!
  11. 康奈尔笔记法,早点认识你我可能去北大了
  12. 5种方式实现 Java 单例模式
  13. ModifyStyle()
  14. 机器视觉之表面缺陷检测
  15. 嵌入式课程设计 —— GPIO接口编程
  16. Racket编程指南——1 欢迎来到Racket!
  17. 作为技术人员,写博客对我们到底有什么好处?为什么要写博客?
  18. 在企业中应用的区块链应能够扩容以满足业务条线的需求
  19. 单链表创建以及头插、尾插
  20. 数据结构与算法--哈夫曼树应用

热门文章

  1. GitHub怎么用 GitHub是什么 新手怎么用GitHub 图文并茂,不看都不行
  2. 使用memcpy函数时要注意拷贝数据的长度
  3. 推荐学习的EXCEL网址
  4. 操作系统如何管理CPU资源?细说操作系统进程与多任务模型问题
  5. 今天下午参加了dudu的广州见面会,毫无收获
  6. xp系统打开计算机配置文件,xp电脑重启后所有设置都还原了。
  7. jmeter下载安装及使用-MAC
  8. 如何将ROS1和ROS2安装到同一个ubuntu系统中
  9. 【神经网络】小样本学习
  10. 联想电脑欲重返手机市场,首款机型揭秘