mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
net: stmmac: socfpga: call set_phy_mode() before registration
Initialisation/setup after registration is a bug. This is the second of two patches fixing this in socfpga. The set_phy_mode() functions do various hardware setup that would interfere with a netdev that has been published, and thus available to be opened by the kernel/userspace. However, set_phy_mode() relies upon the netdev having been initialised to get at the plat_stmmacenet_data structure, which is probably why it was placed after stmmac_drv_probe(). We can remove that need by storing a pointer to struct plat_stmmacenet_data in struct socfpga_dwmac. Move the call to set_phy_mode() before calling stmmac_dvr_probe(). This also simplifies the probe function as there is no need to unregister the netdev if set_phy_mode() fails. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Tested-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Link: https://patch.msgid.link/E1u5Snn-001IJq-L0@rmk-PC.armlinux.org.uk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
6bf70d999a
commit
91255347bb
|
|
@ -50,6 +50,7 @@ struct socfpga_dwmac {
|
|||
u32 reg_offset;
|
||||
u32 reg_shift;
|
||||
struct device *dev;
|
||||
struct plat_stmmacenet_data *plat_dat;
|
||||
struct regmap *sys_mgr_base_addr;
|
||||
struct reset_control *stmmac_rst;
|
||||
struct reset_control *stmmac_ocp_rst;
|
||||
|
|
@ -233,10 +234,7 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *
|
|||
|
||||
static int socfpga_get_plat_phymode(struct socfpga_dwmac *dwmac)
|
||||
{
|
||||
struct net_device *ndev = dev_get_drvdata(dwmac->dev);
|
||||
struct stmmac_priv *priv = netdev_priv(ndev);
|
||||
|
||||
return priv->plat->mac_interface;
|
||||
return dwmac->plat_dat->mac_interface;
|
||||
}
|
||||
|
||||
static void socfpga_sgmii_config(struct socfpga_dwmac *dwmac, bool enable)
|
||||
|
|
@ -490,6 +488,7 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
|||
*/
|
||||
dwmac->stmmac_rst = plat_dat->stmmac_rst;
|
||||
dwmac->ops = ops;
|
||||
dwmac->plat_dat = plat_dat;
|
||||
|
||||
plat_dat->bsp_priv = dwmac;
|
||||
plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed;
|
||||
|
|
@ -501,20 +500,11 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
|
|||
|
||||
plat_dat->riwt_off = 1;
|
||||
|
||||
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
ret = socfpga_dwmac_init(pdev, dwmac);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = socfpga_dwmac_init(pdev, dwmac);
|
||||
if (ret)
|
||||
goto err_dvr_remove;
|
||||
|
||||
return 0;
|
||||
|
||||
err_dvr_remove:
|
||||
stmmac_dvr_remove(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
|
||||
}
|
||||
|
||||
static const struct socfpga_dwmac_ops socfpga_gen5_ops = {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user