gestion Linux Mii / analyse du sous-système MDIO Six analyse fixe mii_bus (analyse mac2mac)

     Les chapitres précédents ont introduit la plupart du module MDIO pour mii_bus, mdio_bus, phy_device, phy_driver l'enregistrement concerné, annulation ont été introduites. Fondamentalement, le contenu de l'introduction module MDIO est terminée, et le contenu de cette introduction, principalement pour le mii_bus virtuel obtenir et enregistrer phy_device virtuel au mii_bus. (L'analyse du contenu en fonction noyau LINUX3.10)

 

Cette pièce fixe mii_bus quel rôle? Le scénario d'application suit comme (schéma ci-dessous):

  1. cpu mac entre deux connectés directement à travers RGMII / SGMII similaire (pas dispositif PHY), planche à noyau qui est présent en deux un seul bord, sans l'utilisation de la puce PHY.
  2. mac entre le FPGA cpu directement connectée par l'intermédiaire RGMII / SGMII similaire (pas dispositif PHY), planche à noyau qui est présent en deux un seul bord, sans l'utilisation de la puce PHY.

 

 

 

      Pour ces deux scénarios, il n'a pas utilisé la puce PHY, mais le mac pilote est toujours nécessaire pour maintenir l'enregistrement de mii_bus universel et dispositif net et phy-dispositif de connexion. Ainsi MDIO un mii_bus de conception modulaire virtuel (désigné-mii_bus fixe), des copeaux de Mac sans connexion de puce PHY. Aux fins de ce qui précède, car par l'intermédiaire d'un bus de données entre deux mac (RGMII / SGMII / qsgmii etc.) est directement connecté, il est en mode nécessaire (full duplex) pour configurer manuellement le taux de puce MAC (GE / FE / Gigabit etc. ).

 

des structures de données associées aux fixed_mii_bus décrits

fixed_mdio_bus struct principalement définie, fixed_phy struct deux structures. Qui contient une fixed_mdio_bus struct

struct types de mii_bus des membres et fixed_phy struct comprenaient des membres du type struct phydev.

struct fixed_mdio_bus

La caractérisation de la structure d'un mii_bus virtuel, et contient des informations relatives fixe, dans lequel:

  1. Phys tête de liste pour les liens logiques sur tous les appareils phy enregistré à fixed_mii_bus ensemble;
  2. irqs représentent chacun phy virtuel correspondant d'interruption (ont très rarement utiliser cette variable dans mii_bus chapitres d'introduction a également dit que l'interruption peut être réalisée phy lien Devic haut / bas déclencheur d'interruption ici sans base à)

fixed_mdio_bus struct {

int IRQ [PHY_MAX_ADDR];

struct mii_bus * mii_bus;

struct LIST_HEAD phys;

};

 

fixed_phy struct

La caractérisation de la structure d'un appareil de phy virtuel, dans lequel:

  1. id représente la phy addr, la plage [0-31];
  2. regs valeur registre indique que le dispositif PHY virtuel (car un phy virtuel, de sorte que la valeur de registre virtuel phy est déterminée par la valeur de fxied_phy_status)
  3. les valeurs d'état sont définies dans chaque état de l'appareil de phy virtuel, y compris l'état de la liaison, la vitesse, duplex, pause, asym_pause analogues, à savoir, la valeur regs sont fixés en fonction du contenu de la variable;
  4. interfaces de liaison link_update pour la mise à jour de l'état de la PHY virtuelle. L'interface est similaire à la struct phydev adjust_link. La différence entre eux est:
    1. L'état de liaison de l'interface adjust_link dispositif PHY, l'état de la liaison est net_device mise à jour;
    2. Le lien est l'interface link_update état net_device, l'état de la liaison virtuelle sur le dispositif est mis à jour phy.

  Pour le pointeur d'interface, fondamentalement, vous n'avez pas besoin d'utiliser, le cas échéant, lorsque vous créez un périphériques phy virtuels, l'affectation peut être.

  1. La structure de noeud est principalement utilisé pour la liste liée de fixed_mdio_bus des phys.

 

fixed_phy struct {

id int;

regs U16 [MII_REGS_NUM];

struct phy_device * phydev;

struct état de fixed_phy_status;

int (* link_update) (struct net_device *, struct fixed_phy_status *);

struct noeud list_head;

};

 

fixed_phy_status struct {

lien int;

vitesse int;

int duplex;

pause int;

int asym_pause;

};

 

 

 

processus de mise en œuvre fixed_mii_bus

 

Dans le « analyse le module LINUX MDIO (trois) enregistrement mii_bus, annulation et conduire le processus de développement », nous avons décrit comment développer un lecteur mii_bus, citer ici:

      la structure Mii_bus est définie comme suit, nous obtenons un lecteur mii_bus est la réalisation des types de structure des variables et appeler l'interface mdiobus_register ci-dessus pour terminer l'enregistrement mii_bus. Des mesures spécifiques sont les suivantes:

  1. Mii_bus nécessité de définir le nom de l'identifiant, le système peut rechercher une valeur en fonction de l'identifiant mii_bus;
  2. Procéder à la lecture, l'écriture, la méthode remise à zéro, dans lequel la lecture, commande d'écriture est utilisé principalement pour des interactions avec le dispositif dans la mii_bus et méthode reset est principalement utilisé pour mii_bus réinitialisation réalisé sur ces trois procédés, le révélateur selon l'entraînement mac DESCRIPTION DETAILLEE puce manuel opération de développement correspondant.
  3. PHY adr phy_mask principalement utilisé pour définir à ignorer, car nous devons ignorer regard phy adr, phy_mask alors 0 est réglé sur 0x01.
  4. Irq et un réseau de point principal, qui est mémorisée correspondant à chaque phy IRQ addr, principalement utilisé pour chaque phy addr correspondante d'interruption, l'interruption est principalement utilisé pour la liaison vers le haut / vers le bas, dont une partie se rapporte à phy machine d'état, nous allons détailler dans les sections suivantes de la partie (plus mii_bus ne fournissent généralement pas le irq, mais la machine d'état phy fournit mécanisme de phy_poll, qui n'est pas irq, peut aussi être lien phy haut / bas, semblable à mmc mmc carte sous-module du mécanisme de sondage).

 

Le processus de mise en œuvre de fixed_mii_bus la même. Analysons fixed_mii_bus Avec processus de mise en œuvre mii_bus.

  1. nom Fixed_mii_bus est fixe-0;
  2. Fournit lecture, la méthode d'écriture (que la nécessité de mettre en œuvre la méthode reset, en fait, la méthode d'écriture ne sont pas mis en œuvre, parce que le montage sur les mii_bus sont des dispositifs phy virtuels ne ont pas besoin de mettre en place des opérations). La fonction de l'interface est lue afin de trouver la liste fixed_mii_bus dispositif PHY addr phy virtuel phys correspondant, le type et les membres du fixed_phy_status struct dispositif PHY virtuelle, mettre à jour la valeur de son registre, et retourne.
  3. fixed_mii_bus lors de l'initialisation et n'est pas réglé pour être ignoré phy adr;
  4. Le tableau de irq des types de fixed_mdio_bus struct des variables globales dans platform_fmb affectées à platform_fmb.mii_bus-> irq.
  5. Appel mdiobus_register terminer l'enregistrement de fixed_mii_bus.

     fixed_mii_bus essentiellement en stricte conformité avec le procédé décrit dans l'article précédent, nous avons créé mii_bus. Et pour les besoins de dispositifs phy virtuels, besoins de chaque module pour ajouter leurs propres périphériques virtuels, de sorte que le module de fixed_mii_bus fournit une interface pour ajouter fixed_phy_add (noyau 3.10, ne fournit l'interface, ce qui limite le moment de l'ajout de périphériques phy virtuels fixed_mii_bus , décrit en détail ci-après. dans le linux4.x ci-dessus a augmenté fixed_phy_register d'interface noyau).

 

fixed_mdio_bus_init Analyse Interface

L'interface est principalement d'atteindre mentionné ci-dessus processus de mise en œuvre de fixed_mii_bus:

  1. l'application Fixed_mii_bus correspondant à mii_bus, et définir sa lecture, l'écriture, la variable IRQ;
  2. Appel fixed_mii_bus d'enregistrement d'interface de mdiobus_register. on dit aussi ceci ici:
    1. interfaces mdiobus_register nous avons couvert avant que le processus, il cherchera à créer phy_device si tel est l'équipement phy virtuel pour la gamme adr phy [0-31] de l'équipement phy, appelez dispositif de recherche phy mdiobus_scan et enregistrés dans mdio_bus (lors de la recherche dispositif PHY, à savoir les appels fixed_mii_bus l'interface de lecture si l'appareil a été ajouté à la fixed_mii_bus phy virtuelle, puis retourné phyid adr est la valeur des dispositifs phy virtuels, est ainsi créé dispositif PHY appel interface phy_device_create et lors de l'enregistrement à mdio_bus. Par conséquent, si avant l'appel de fixed_mdio_bus_init, pas les dispositifs phy virtuels sont ajoutés à la fixed_mii_bus, est effectuée mdiobus_register, recherche pas le dispositif PHY virtuel).

 

 

 

 

 

fixed_mdio_read Analyse Interface

      该接口用于获取一个虚拟phy设备的寄存器值,而针对虚拟phy设备,其各寄存器的值即根据fixed_phy的struct fixed_phy_status 类型的成员变量status进行设置(即根据在虚拟phy设备的添加时,会通过struct fixed_phy_status 类型的变量,设置该虚拟phy设备的工作模式等信息)。该接口的实现流程图如下,主要功能为:

  1. 根据输入的phy addr,查找该phy addr对应的虚拟设备是否已添加至fixed_mii_bus,若没有则返回失败;否则进入步骤b;
  2. 若查找的fixed_phy提供link_update接口,则调用该接口更新该fixed_phy->status变量中各成员的值;
  3. 调用fixed_phy_update_regs接口,根据fixed_phy->status更新该fixed_phy各寄存器的值;
  4. 返回该fixed_phy对应寄存器的值。

 

 

 

fixed_phy_add接口分析

该接口主要将一个fixed_phy添加至fixed_mii_bus中,该接口的实现流程如下所示。主要功能:

  1. 申请struct fixed_phy类型大小的内存空间;
  2. 若申请成功,则设置该fixed_phy的status成员,并更新其regs值;
  3. 将该fixed_phy添加至fixed_mii_bus的成员phys链表中。

 

       该接口主要是将一个fixed_phy添加至fixed_mii_bus的成员phys中,并没有为之创建对应的phy_device。而针对fixed_mii_bus上的成员phys链表上的fixed_phy链表成员,仅在fixed_mdio_bus_init中注册fixed_mii_bus时,通过mdiobus_register时,完成将该链表上的所有链表成员,均为其注册对应的phy_device至mdio_bus上。因此若各驱动模块想通过fixed_phy_add接口添加一个fixed_phy,则必须保证其在接口fixed_mdio_bus_init调用之前被调用到,否则该添加操作不起作用(因没有创建对应的phy_device)。而在linux3.10中,仅提供了这一个接口进行fixed_phy的添加。这也是这个接口的缺陷,即必须保证调用该接口(fixed_phy_add)的代码片段在fixed_mdio_bus_init执行之前调用。

 

 

fixed_phy_register接口分析

     上面分析fixed_phy_add接口的调用有所限制,必须保证其在fixed_mdio_bus_init执行之前调用。因此在 linux4.x的内核中,增加了接口fixed_phy_register,该接口弥补了fixed_phy_add的不足。接口fixed_phy_register在调用fixed_phy_add之后,调用phy_register,实现phy_device的注册,弥补了fixed_phy_add的不足。该接口的实现流程图如下:

  1. 获取一个可用的phy addr,若获取不到返回失败;
  2. 调用fixed_phy_add将该fixed_phy添加至fixed_mii_bus;
  3. 调用phy_register将该phy_device注册至mdio_bus上。

 

 

 

        在linux3.10及之前的版本,并没有提供该接口,若要使用则可以自己添加该接口。以上基本上完成了fixed_mii_bus模块相关接口的介绍,下面我们主要介绍如何使用fixed_mii_bus的接口。

 

Mac2mac驱动程序修改流程

上面介绍了fixed_mii_bus模块的接口,下面我们说明一下如何修改一个mac的驱动,实现对fixed_phy的支持。我们从两方面说明(支持设备树、不支持设备树)

 

不支持设备树模式的修改流程

  1. 在mac驱动对应的platform driver的probe接口中,调用fixed_phy_register,完成fixed_phy的注册;
  2. 在该net_device的ndo_open接口中,调用phy_connect接口进行phy_device、net_device的绑定时,可根据"fixed-0:phy_addr",在mdio_bus上查找对应的phy_device,从而完成phy_device与net_device的绑定。

 

 

 

支持设备树模式的修改流程

 

  1. 在mac驱动对应的platform driver的probe接口中,通过获取设备树中针对phy-device的定义(如定义了fixed-link,则说明使用fixed_phy,则调用fixed_phy_register,完成fixed_phy的注册;在4.x的内核提供了接口of_phy_register_fixed_link进行fixed_phy的注册);
  2. 在在该net_device的ndo_open接口中,调用phy_connect接口进行phy_device、net_device的绑定时,可根据"fixed-0:phy_addr",在mdio_bus上查找对应的phy_device,从而完成phy_device与net_device的绑定。

 

通过进行以上的修改,即可让mac驱动支持fixed-phy的支持。

 

     本章完成了fixed-phy的分析,也基本上完成了mdio子系统的介绍,我们分析了mii_bus相关的实现流程以及具体mii_bus驱动的实现步骤;也分析了phy_device、phy_driver、mdio_bus的实现流程,以及net_device与phy_device的绑定(phy_connect);介绍了phy_device的状态机流转相关的内容;fixed_mii_bus与fixed_phy的实现以及如何修改mac驱动支持fixed_phy。

发布了145 篇原创文章 · 获赞 30 · 访问量 46万+

Je suppose que tu aimes

Origine blog.csdn.net/lickylin/article/details/104718463
conseillé
Classement