/* Initialisation entry point for this PHY driver */ static int txc43128_phy_init(struct efx_nic *efx) { u32 devid; int rc; devid = efx_mdio_read_id(efx, MDIO_MMD_PHYXS); EFX_INFO(efx, ""TXCNAME ": PHY ID reg %x (OUI %06x model %02x " "revision %x)\n", devid, efx_mdio_id_oui(devid), efx_mdio_id_model(devid), efx_mdio_id_rev(devid)); EFX_INFO(efx, ""TXCNAME ": Silicon ID %x\n", efx_mdio_read(efx, MDIO_MMD_PHYXS, TXC_GLRGS_SLID) & TXC_GLRGS_SLID_MASK); rc = txc_reset_phy(efx); if (rc < 0) return rc; rc = txc_bist(efx); if (rc < 0) return rc; txc_apply_defaults(efx); return 0; }
static int txc43128_phy_reconfigure(struct efx_nic *efx) { struct txc43128_data *phy_data = efx->phy_data; enum efx_phy_mode mode_change = efx->phy_mode ^ phy_data->phy_mode; bool loop_change = LOOPBACK_CHANGED(phy_data, efx, TXC_LOOPBACKS); if (efx->phy_mode & mode_change & PHY_MODE_TX_DISABLED) { txc_reset_phy(efx); txc_apply_defaults(efx); falcon_reset_xaui(efx); mode_change &= ~PHY_MODE_TX_DISABLED; } efx_mdio_transmit_disable(efx); efx_mdio_phy_reconfigure(efx); if (mode_change & PHY_MODE_LOW_POWER) txc_set_power(efx); /* The data sheet claims this is required after every reconfiguration * (note at end of 7.1), but we mustn't do it when nothing changes as * it glitches the link, and reconfigure gets called on link change, * so we get an IRQ storm on link up. */ if (loop_change || mode_change) txc_reset_logic(efx); phy_data->phy_mode = efx->phy_mode; phy_data->loopback_mode = efx->loopback_mode; return 0; }
static int txc43128_run_tests(struct efx_nic *efx, int *results, unsigned flags) { int rc; if (!(flags & ETH_TEST_FL_OFFLINE)) return 0; rc = txc_reset_phy(efx); if (rc < 0) return rc; rc = txc_bist(efx); txc_apply_defaults(efx); results[0] = rc ? -1 : 1; return rc; }
/* Initialisation entry point for this PHY driver */ static int txc43128_phy_init(struct efx_nic *efx) { int rc; rc = txc_reset_phy(efx); if (rc < 0) return rc; rc = txc_bist(efx); if (rc < 0) return rc; txc_apply_defaults(efx); return 0; }