本发明属于网络控制器领域,尤其是涉及一种gmac网络控制器的网口切换方法。
背景技术:
国产飞腾系列处理器是基于arm64体系结构,特别是ft-1500a处理器,它采用了soc架构,内部集成了pcie控制器以及千兆网络控制器(gmac),已经广泛地应用于桌面pc、便携式电脑和服务器领域。
一般情况下的千兆以太网卡都是pcie设备,而诸如显卡sata卡,usb卡等都是pcie设备,在硬件主板上pcie插槽有限的情况下,采用飞腾处理器内部集成gmac网卡的方法可以有效减少对pcie插槽的占用。
由于网络协议栈的限制,当同一台机器的多个网口或者多个网卡设置成同一网段ip地址接入同一个局域网通信的话,只有第一个建立通信连接的网口可以正常收发数据,其他的网口通信实际上也是通过第一个建立连接的网口进行数据收发。
一般的pcie网卡自带看门狗逻辑,实时监测网口链路状态变化,监测到链路状态变化就会通过写寄存器的方式更新网口的phy状态。但在gmac网卡驱动中并没有这个监测逻辑,在使用过程中拔插网线,网口的phy状态不能实时更新。
综上所述,现有的gmac驱动,并没有处理拔插网线实时更新网口状态的机制。倘若没有这种机制,用户在使用过程中,如果只有一根网线情况下,从第一个网口拔出插入第二个网口的时候,不做其他操作情况下,第二个网口是不能正常通信的,会给用户带来不好的用户使用体验。
中国发明专利“一种用于千兆以太网控制器的可切换接口电路”(申请号201710507253.1)该发明涉及高速网络通讯芯片设计与应用的技术领域,尤其是一种用于千兆以太网控制器的可切换接口电路。包括:gmii转rgmii电路;与gmii接口转rgmii接口电路连接的发送接口选择电路,根据gmii或rgmii选择信号,决定使用直接由gmac传递来的gmii信号或是由gmii转rgmii电路转换后的rgmii信号;rgmii转gmii电路;与rgmii转gmii电路连接的接收接口选择电路,根据gmii或rgmii选择信号,决定将来自ephy的数据直接传递给gmac或是由rgmii转gmii电路信号转换后再传递给gmac;该可切换接口电路可以增强千兆以太网控制器电路的通用性,简化外围电路结构,降低成本,提高效率,安全可靠。该发明从硬件层面简化了gmac外围电路,实现了gmac网卡的各种信号之间的切换,但不能解决本发明针对的网线即插即用的问题,本发明从软件层面解决了gmac网卡两个网口之间的网线拔插后网口即时可正常通信的问题。
中国发明专利“一种arm处理器的千兆网络和sata接口扩展装置”(申请号201520166103.5),该发明在arm处理器的1路usb接口通过usbhub芯片分出两路usb接口,其中一路连接1块usb千兆网卡,另一路通过usb转sata芯片与一个mini-sata接口连接,最终在mini-sata接口上连接一块sata固态硬盘。本发明实现高性能的扩展存储功能,并与处理器自带千兆gmac口连接的千兆网络口可实现双网冗余备份功能。但该专利并没有解决本发明涉及的gmac网络控制器网口状态的实时更新问题。
名词解释:
gmac:gmac(gigabitmediaacesscontrol)是一款千兆以太网控制器,硬件构架上,gmac控制器由核心层、mtl(mactransactionlayer)层、dma层和总线接口层构成。核心层连接phy芯片,管理和phy芯片之间的通信;mtl层建立物理层和内存之间的数据通道,调整帧传输结构,控制数据流,转换时钟域;dma层完成数据的传输任务;总线接口层负责与cpu交互。
phy:phy指物理层,osi的最底层,一般指与外部信号接口的芯片,以太网phy芯片,物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。
函数接口dev_change_flags:一种改变网卡控制器硬件状态寄存器的接口。
技术实现要素:
本发明要解决的问题是提供一种基于飞腾处理器内置gmac网络控制器的网口状态更新方法,通过以开启内核监测线程的方法来监测gmac网口phy的实时状态,并调用相关接口更新状态,以达到拔出一个已建立通信连接的网口网线插入另一个网口时,该网口状态即时可用的目的,提高用户体验。
为解决上述技术问题,本发明采用的技术方案是:开启一个内核监测线程,实时检测链路的状态变化,以及开启一个等待队列,一旦监测到拔出网线的情况就激活等待队列,调用相关接口更新phy的状态。
步骤如下:
s100.初始化一个等待队列并开启一个内核线程,所述内核线程用于监测网口状态的变化并修改phy的状态;
s200.循环等待直到满足检测条件;
s300.唤醒等待队列;
s400.修改phy状态。
为了排查故障方便,s200中的检测条件为网口中的网线被拔出。
通过以上方法,当判断满足检测条件时,等待序列被唤醒,内核线程执行对phy状态的修改,以达到即时更新网口状态的目的。
s100中开启内核线程的具体步骤为:
s101.声明并初始化一个内核线程执行函数;
s102.创建一个内核线程;
s103.唤醒所述内核线程;
s104.执行所述内核线程函数。
作为优选地,步骤s101在在驱动主函数外进行,对驱动其他功能没有影响。
s200时,所述内核线程的具体动作为:
s201.循环直至s300时等待队列被唤醒。
s400时,所述内核线程的具体动作为:
s401.调用函数接口dev_change_flags来修改被拔出网线网口对应phy的状态。
通过以上设置,实现了通过内核线程控制gmac网口状态的实时更新。
以及,一种用于上述方法的内核线程的工作方法,包括以下步骤:
a101.在驱动主函数外声明并初始化一个内核线程执行函数;
a102.在phy初始化函数里创建一个内核线程;
a103.唤醒该线程;
a104.执行内核线程函数体;
a105.循环,直至检测条件被满足;
a106.修改phy的状态。
通过以上技术方案,达到了如下有益效果:
1.实现方式具有独创性,解决了专门针对基于飞腾处理器内置gmac网络控制器的网口状态更新方法。
2.具有灵活可用性,采用专用函数接口,对驱动其他功能没有影响。
3.提高用户体验感。
附图说明
图1是本发明一实施例的gmac网口切换状态实现流程图
图2是本发明一实施例的内核监测线程实现流程图
图3是本发明一实施例的使用效果图
具体实施方式
如图1、本发明一实施例的gmac网口切换状态实现流程图所示,该实施例提供了一种基于飞腾处理器内置gmac网络控制器的网口状态更新方法:
s01.初始化一个等待队列,此步骤在初始化phy函数里面进行;
s02.创建并启动一个内核监测线程,此步骤在phy初始化函数里进行;
s03.循环等待;
s04.此步骤在判断连接状态函数中进行,判断条件是否满足,检测条件是网线拔出,若不满足则跳到步骤s03,满足跳到步骤s05;
s05.唤醒等待队列;
s06.调用函数接口dev_change_flags来修改被拔出网线网口对应phy的状态为down。
作为优选地,在本实施例中,s04中检测条件为网线是否拔出,逻辑直观,便于后续故障的排查。
通过以上设置,当某网口的网线被拔出时,可及时将该网口关闭。
如图2、本发明一实施例的内核监测线程实现流程图所示,该实施例在gmac驱动中采用内核线程的方式来监测网口状态的变化并修改phy的状态,
s101.在驱动主函数外声明并初始化一个内核线程执行函数;
s102.在phy初始化函数里创建一个内核线程;
s103.唤醒该线程;
s104.执行内核线程函数体;
s105.循环,直至检测条件被满足;本实施例中,检测条件为等待队列被唤醒;
s106.修改phy的状态。
作为优选地,该实施例在驱动主函数外进行内核线程执行函数的初始化,避免对驱动其他功能产生影响。
如图3、本发明一实施例的使用效果图所示,该实施例通过开启一个内核监测线程,实时监测链路的状态变化,同时开启一个等待队列,一旦监测到拔出网线的情况就激活等待队列,调用相关接口更新phy的状态。本实施例中,gmac上设置有eth0和eth1两个网口,当网口eth0的网线被拔出时,内核监测线程检测到网线被拔出,激活等待队列,调用函数接口dev_change_flags来修改网口eth0对应phy的状态为down。实现了网口状态的实时更新,关闭eth0网口使eth1网口可用。
以上对本发明的一个实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明申请范围所作的均等变化与改进等,均应仍归属于本发明的专利涵盖范围之内。