• Thomas Petazzoni's avatar
    net: mvneta: fix usage as a module on RGMII configurations · e3a8786c
    Thomas Petazzoni authored
    Commit 5445eaf3 ('mvneta: Try to fix mvneta when compiled as
    module') fixed the mvneta driver to make it work properly when loaded
    as a module in SGMII configuration, which was tested successful by the
    author on the Armada XP OpenBlocks AX3, which uses SGMII.
    
    However, it turns out that the Armada XP GP, which uses RGMII, is
    affected by a similar problem: its SERDES configuration is lost when
    mvneta is loaded as a module, because this configuration is set by the
    bootloader, and then lost because the clock is gated by the clock
    framework until the mvneta driver is loaded again and the clock is
    re-enabled.
    
    However, it turns out that for the RGMII case, setting the SERDES
    configuration is not sufficient: the PCS enable bit in the
    MVNETA_GMAC_CTRL_2 register must also be set, like in the SGMII
    configuration.
    
    Therefore, this commit reworks the SGMII/RGMII initialization: the
    only difference between the two now is a different SERDES
    configuration, all the rest is identical.
    
    In detail, to achieve this, the commit:
    
     * Renames MVNETA_SGMII_SERDES_CFG to MVNETA_SERDES_CFG because it is
       not specific to SGMII, but also used on RGMII configurations.
    
     * Adds a MVNETA_RGMII_SERDES_PROTO definition, that must be used as
       the MVNETA_SERDES_CFG value in RGMII configurations.
    
     * Removes the mvneta_gmac_rgmii_set() and mvneta_port_sgmii_config()
       functions, and instead directly do the SGMII/RGMII configuration in
       mvneta_port_up(), from where those functions where called. It is
       worth mentioning that mvneta_gmac_rgmii_set() had an 'enable'
       parameter that was always passed as '1', so it was pretty useless.
    
     * Reworks the mvneta_port_up() function to set the MVNETA_SERDES_CFG
       register to the appropriate value depending on the RGMII vs. SGMII
       configuration. It also unconditionally set the PCS_ENABLE bit (was
       already done for SGMII, but is now also needed for RGMII), and sets
       the PORT_RGMII bit (which was already done for both SGMII and
       RGMII).
    
    This commit was successfully tested with mvneta compiled as a module,
    on both the OpenBlocks AX3 (SGMII configuration) and the Armada XP GP
    (RGMII configuration).
    Reported-by: default avatarSteve McIntyre <steve@einval.com>
    Cc: stable@vger.kernel.org # 3.11.x: 5445eaf3 mvneta: Try to fix mvneta when compiled as module
    Signed-off-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e3a8786c
mvneta.c 78.8 KB