static void bcmgenet_internal_phy_setup(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); u32 reg; /* Power up EPHY */ bcmgenet_ephy_power_up(dev); /* enable APD */ reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); reg |= EXT_PWR_DN_EN_LD; bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); bcmgenet_mii_reset(dev); }
int bcmgenet_mii_init(struct net_device *dev) { struct BcmEnet_devctrl *pDevCtrl = netdev_priv(dev); volatile struct uniMacRegs *umac; char *phy_name; umac = pDevCtrl->umac; pDevCtrl->mii.phy_id = pDevCtrl->phyAddr; pDevCtrl->mii.phy_id_mask = 0x1f; pDevCtrl->mii.reg_num_mask = 0x1f; pDevCtrl->mii.dev = dev; pDevCtrl->mii.mdio_read = bcmgenet_mii_read; pDevCtrl->mii.mdio_write = bcmgenet_mii_write; pDevCtrl->mii.supports_gmii = 0; switch (pDevCtrl->phyType) { case BRCM_PHY_TYPE_INT: phy_name = "internal PHY"; pDevCtrl->sys->sys_port_ctrl = PORT_MODE_INT_EPHY; /* enable APD */ pDevCtrl->ext->ext_pwr_mgmt |= EXT_PWR_DN_EN_LD; bcmgenet_mii_reset(dev); break; case BRCM_PHY_TYPE_EXT_MII: phy_name = "external MII"; pDevCtrl->sys->sys_port_ctrl = PORT_MODE_EXT_EPHY; break; case BRCM_PHY_TYPE_EXT_RGMII: phy_name = "external RGMII"; GENET_RGMII_OOB_CTRL(pDevCtrl) |= RGMII_MODE_EN; /* Don't shift tx clock by 90 degree, does it still needed? */ GENET_RGMII_OOB_CTRL(pDevCtrl) |= (1 << 16); pDevCtrl->mii.supports_gmii = 1; pDevCtrl->sys->sys_port_ctrl = PORT_MODE_EXT_GPHY; break; case BRCM_PHY_TYPE_EXT_RGMII_IBS: phy_name = "external RGMII IBS"; GENET_RGMII_OOB_CTRL(pDevCtrl) |= RGMII_MODE_EN; GENET_RGMII_OOB_CTRL(pDevCtrl) |= (1 << 16); /* Use in-band signaling for auto config.*/ GENET_RGMII_OOB_CTRL(pDevCtrl) |= OOB_DISABLE; umac->cmd |= CMD_AUTO_CONFIG; pDevCtrl->mii.supports_gmii = 1; pDevCtrl->sys->sys_port_ctrl = PORT_MODE_EXT_GPHY; break; case BRCM_PHY_TYPE_MOCA: phy_name = "MoCA"; /* setup speed in umac->cmd for RGMII txclk set to 125MHz */ umac->cmd = umac->cmd | (UMAC_SPEED_1000 << CMD_SPEED_SHIFT); pDevCtrl->mii.force_media = 1; pDevCtrl->sys->sys_port_ctrl = PORT_MODE_INT_GPHY | LED_ACT_SOURCE_MAC; break; default: pr_err("unknown phy_type: %d\n", pDevCtrl->phyType); return -1; } pr_info("%s: configuring instance #%d for %s\n", CARDNAME, pDevCtrl->pdev->id, phy_name); return 0; }