使用ioctl命令时,可以看到上述两个命令的存在,

在头文件 include/linux/sockios.h,定义如下:

#define SIOCETHTOOL    0x8946        /* Ethtool interface        */     ethtool 接口

#define SIOCGMIIPHY    0x8947        /* Get address of MII PHY in use. */    获取MII phy的地址
#define SIOCGMIIREG    0x8948        /* Read MII PHY register.    */     读取 MII phy 寄存器
#define SIOCSMIIREG    0x8949        /* Write MII PHY register.    */      写MII phy 寄存器

内核中对于上述两个命令的处理定义在文件  /drivers/net/phy/phy.c 的函数 phy_mii_ioctl中,

函数原型如下:

/**
 * phy_mii_ioctl - generic PHY MII ioctl interface
 * @phydev: the phy_device struct
 * @ifr: &struct ifreq for socket ioctl's
 * @cmd: ioctl cmd to execute
 *
 * Note that this function is currently incompatible with the
 * PHYCONTROL layer.  It changes registers without regard to
 * current state.  Use at own risk.
 */
int phy_mii_ioctl(struct phy_device *phydev,
        struct ifreq *ifr, int cmd)
{
    struct mii_ioctl_data *mii_data = if_mii(ifr);
    u16 val = mii_data->val_in;

switch (cmd) {
    case SIOCGMIIPHY:     // 获取phy的地址
        mii_data->phy_id = phydev->addr;
        /* fall through */

    case SIOCGMIIREG:
        mii_data->val_out = mdiobus_read(phydev->bus,  mii_data->phy_id, mii_data->reg_num);
        break;

    case SIOCSMIIREG:
        if (mii_data->phy_id == phydev->addr) {
            switch(mii_data->reg_num) {
                case MII_BMCR:
                    if ((val & (BMCR_RESET|BMCR_ANENABLE)) == 0)
                        phydev->autoneg = AUTONEG_DISABLE;
                    else
                        phydev->autoneg = AUTONEG_ENABLE;
                    if ((!phydev->autoneg) && (val & BMCR_FULLDPLX))
                        phydev->duplex = DUPLEX_FULL;
                    else
                        phydev->duplex = DUPLEX_HALF;
                    if ((!phydev->autoneg) &&
                            (val & BMCR_SPEED1000))
                        phydev->speed = SPEED_1000;
                    else if ((!phydev->autoneg) &&
                            (val & BMCR_SPEED100))
                        phydev->speed = SPEED_100;
                    break;
                case MII_ADVERTISE:
                    phydev->advertising = val;
                    break;
                default:
                    /* do nothing */
                    break;
            }
        }

mdiobus_write(phydev->bus, mii_data->phy_id,
                  mii_data->reg_num, val);

if (mii_data->reg_num == MII_BMCR &&
            val & BMCR_RESET &&
            phydev->drv->config_init) {
            phy_scan_fixups(phydev);
            phydev->drv->config_init(phydev);
        }
        break;

case SIOCSHWTSTAMP:
        if (phydev->drv->hwtstamp)
            return phydev->drv->hwtstamp(phydev, ifr);
        /* fall through */

default:
        return -EOPNOTSUPP;
    }

return 0;
}
EXPORT_SYMBOL(phy_mii_ioctl);

补充:

关于MII,百度内容如下:

MII即“媒体独立接口”,也叫“独立于介质的接口”。它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口

RMII全称为“简化的媒体独立接口”,是IEEE-802.3u标准中除MII接口之外的另一种实现。

独立于介质的接口(MII) 用于MAC与外接的PHY互联,支持10Mbit/s和100Mbit/s数据传输模式。

SIOCGMIIPHY 和 SIOCSMIIREG 命令的更多相关文章

  1. LINUX命令总结 -------来自 水滴娃娃 的CSDN

    LINUX命令总结 标签: LINUX命令总结 2014-01-27 15:54 41039人阅读 评论(1) 收藏 举报  分类: linux(1)  版权声明:本文为博主原创文章,未经博主允许不得 ...

  2. linux 命令总结(转载)

    linux 命令总结(转载) 1. 永久更改ip ifconfig eth0 新ip 然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0,修改ip 2.从Lin ...

  3. Linux系统网络设备启动和禁止“ifconfig eth0 up/down”命令的跟踪

    前面文章讲了Linux系统的ethtool框架的一些东西,是从用户空间可以直观认识到的地方入手.同样,本文从Linux系统绝大部分人都熟悉的“ifconfig eth0 up”命令来跟踪一下此命令在内 ...

  4. Linux网络相关命令firewalld和netfilter、iptables 使用(6/22)

    iptables和netfilter的关系: netfilter在内核空间的代码根据table中的rules,完成对packet的分析和处置.但是这些table中的具体的防火墙rules,还是必须由系 ...

  5. Cmder--Windows下命令行利器

    cmder cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令. 安装包 安装包链接 下载后,直接解压即用. 修改命令提示符λ为 ...

  6. 【每日一linux命令4】常用参数:

     下面所列的是常见的参数(选项)义: --help,-h                              显示帮助信息 --version,-V                        ...

  7. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  8. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  9. SQLServer执行命令出现“目录无效的提示”

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...

随机推荐

  1. Git(使用码云)

    使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况(原因你懂的). 如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——码云(gitee.com) ...

  2. js拼接HTML页面元素a标签遇到的问题

    业务,如下图需要做一个广告轮播的图片链接 使用了ajax请求后台,在js拼接html,关键代码: $("#scroll_img").html(""); for ...

  3. bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)

    前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进入主题介绍 ...

  5. java位运算(&、|、 ~、>>、>>> 、 ^)

    1.& 与 数字按位进行与运算 101101 110111 100101 2.| 或 数字按位进行或运算 3.~ 非 数字按位取反 4.>> 右移 数字按位进行右移 正数右移高位补 ...

  6. docker 系列 - Docker 安装和Hub Mirror地址设置

    ======================为什么要使用Docker?======================= 容器真是个好东西, (1)容器能提供隔离性; (2)容器能打包环境, 简化部署难度 ...

  7. spring注解第02课 包扫描@ComponentScan、@ComponentScans

    1.配置文件形式: <context:component-scan base-package="com.atguigu" /> spring会扫描此包下的@Servic ...

  8. [C++]头文件<algorithm>

    本博文仅示例一些常用的函数: sort.for_each. 1. sort /* STL - <algorithm> - sort template< class RandomIt, ...

  9. Spring+thymeleaf

    1.导入jar包 2.配置 3.标签使用 th:text th:utext th:object th:if th:switch th:case th:each="person:userlis ...

  10. DOM操作插入新的子节点

    appendChid.insertBefore首先这两个方法都是添加子节点. append(追加),appendChid:给父节点的子节点末尾添加子节点. insertBefore(newNode, ...