void DisablePhyComa(struct et131x_adapter *etdev) { u32 GlobalPmCSR; GlobalPmCSR = readl(&etdev->regs->global.pm_csr); GlobalPmCSR |= ET_PMCSR_INIT; GlobalPmCSR &= ~ET_PM_PHY_SW_COMA; writel(GlobalPmCSR, &etdev->regs->global.pm_csr); etdev->AiForceSpeed = etdev->PoMgmt.PowerDownSpeed; etdev->AiForceDpx = etdev->PoMgmt.PowerDownDuplex; et131x_init_send(etdev); et131x_reset_recv(etdev); et131x_soft_reset(etdev); et131x_adapter_setup(etdev); etdev->Flags &= ~fMP_ADAPTER_LOWER_POWER; et131x_rx_dma_enable(etdev); }
/** * DisablePhyComa - Disable the Phy Coma Mode * @pAdapter: pointer to our adapter structure */ void DisablePhyComa(struct et131x_adapter *pAdapter) { PM_CSR_t GlobalPmCSR; DBG_ENTER(et131x_dbginfo); GlobalPmCSR.value = readl(&pAdapter->CSRAddress->global.pm_csr.value); /* Disable phy_sw_coma register and re-enable JAGCore clocks */ GlobalPmCSR.bits.pm_sysclk_gate = 1; GlobalPmCSR.bits.pm_txclk_gate = 1; GlobalPmCSR.bits.pm_rxclk_gate = 1; GlobalPmCSR.bits.pm_phy_sw_coma = 0; writel(GlobalPmCSR.value, &pAdapter->CSRAddress->global.pm_csr.value); /* Restore the GbE PHY speed and duplex modes; * Reset JAGCore; re-configure and initialize JAGCore and gigE PHY */ pAdapter->AiForceSpeed = pAdapter->PoMgmt.PowerDownSpeed; pAdapter->AiForceDpx = pAdapter->PoMgmt.PowerDownDuplex; /* Re-initialize the send structures */ et131x_init_send(pAdapter); /* Reset the RFD list and re-start RU */ et131x_reset_recv(pAdapter); /* Bring the device back to the state it was during init prior to * autonegotiation being complete. This way, when we get the auto-neg * complete interrupt, we can complete init by calling ConfigMacREGS2. */ et131x_soft_reset(pAdapter); /* setup et1310 as per the documentation ?? */ et131x_adapter_setup(pAdapter); /* Allow Tx to restart */ MP_CLEAR_FLAG(pAdapter, fMP_ADAPTER_LOWER_POWER); /* Need to re-enable Rx. */ et131x_rx_dma_enable(pAdapter); DBG_LEAVE(et131x_dbginfo); }
void et131x_Mii_check(struct et131x_adapter *etdev, MI_BMSR_t bmsr, MI_BMSR_t bmsr_ints) { uint8_t link_status; uint32_t autoneg_status; uint32_t speed; uint32_t duplex; uint32_t mdi_mdix; uint32_t masterslave; uint32_t polarity; unsigned long flags; if (bmsr_ints.bits.link_status) { if (bmsr.bits.link_status) { etdev->PoMgmt.TransPhyComaModeOnBoot = 20; spin_lock_irqsave(&etdev->Lock, flags); etdev->MediaState = NETIF_STATUS_MEDIA_CONNECT; etdev->Flags &= ~fMP_ADAPTER_LINK_DETECTION; spin_unlock_irqrestore(&etdev->Lock, flags); if (etdev->RegistryPhyLoopbk == false) netif_carrier_on(etdev->netdev); } else { dev_warn(&etdev->pdev->dev, "Link down - cable problem ?\n"); if (etdev->linkspeed == TRUEPHY_SPEED_10MBPS) { uint16_t Register18; MiRead(etdev, 0x12, &Register18); MiWrite(etdev, 0x12, Register18 | 0x4); MiWrite(etdev, 0x10, Register18 | 0x8402); MiWrite(etdev, 0x11, Register18 | 511); MiWrite(etdev, 0x12, Register18); } if (!(etdev->Flags & fMP_ADAPTER_LINK_DETECTION) || (etdev->MediaState == NETIF_STATUS_MEDIA_DISCONNECT)) { spin_lock_irqsave(&etdev->Lock, flags); etdev->MediaState = NETIF_STATUS_MEDIA_DISCONNECT; spin_unlock_irqrestore(&etdev->Lock, flags); if (etdev->RegistryPhyLoopbk == false) netif_carrier_off(etdev->netdev); } etdev->linkspeed = 0; etdev->duplex_mode = 0; et131x_free_busy_send_packets(etdev); et131x_init_send(etdev); et131x_reset_recv(etdev); et131x_soft_reset(etdev); et131x_adapter_setup(etdev); if (etdev->RegistryPhyComa == 1) EnablePhyComa(etdev); } } if (bmsr_ints.bits.auto_neg_complete || (etdev->AiForceDpx == 3 && bmsr_ints.bits.link_status)) { if (bmsr.bits.auto_neg_complete || etdev->AiForceDpx == 3) { ET1310_PhyLinkStatus(etdev, &link_status, &autoneg_status, &speed, &duplex, &mdi_mdix, &masterslave, &polarity); etdev->linkspeed = speed; etdev->duplex_mode = duplex; etdev->PoMgmt.TransPhyComaModeOnBoot = 20; if (etdev->linkspeed == TRUEPHY_SPEED_10MBPS) { uint16_t Register18; MiRead(etdev, 0x12, &Register18); MiWrite(etdev, 0x12, Register18 | 0x4); MiWrite(etdev, 0x10, Register18 | 0x8402); MiWrite(etdev, 0x11, Register18 | 511); MiWrite(etdev, 0x12, Register18); } ConfigFlowControl(etdev); if (etdev->linkspeed == TRUEPHY_SPEED_1000MBPS && etdev->RegistryJumboPacket > 2048) ET1310_PhyAndOrReg(etdev, 0x16, 0xcfff, 0x2000); SetRxDmaTimer(etdev); ConfigMACRegs2(etdev); } } }
void et131x_Mii_check(struct et131x_adapter *etdev, MI_BMSR_t bmsr, MI_BMSR_t bmsr_ints) { uint8_t link_status; uint32_t autoneg_status; uint32_t speed; uint32_t duplex; uint32_t mdi_mdix; uint32_t masterslave; uint32_t polarity; unsigned long flags; if (bmsr_ints.bits.link_status) { if (bmsr.bits.link_status) { etdev->PoMgmt.TransPhyComaModeOnBoot = 20; /* Update our state variables and indicate the * connected state */ spin_lock_irqsave(&etdev->Lock, flags); etdev->MediaState = NETIF_STATUS_MEDIA_CONNECT; etdev->Flags &= ~fMP_ADAPTER_LINK_DETECTION; spin_unlock_irqrestore(&etdev->Lock, flags); /* Don't indicate state if we're in loopback mode */ if (etdev->RegistryPhyLoopbk == false) netif_carrier_on(etdev->netdev); } else { dev_warn(&etdev->pdev->dev, "Link down - cable problem ?\n"); if (etdev->linkspeed == TRUEPHY_SPEED_10MBPS) { /* NOTE - Is there a way to query this without * TruePHY? * && TRU_QueryCoreType(etdev->hTruePhy, 0) == EMI_TRUEPHY_A13O) { */ uint16_t Register18; MiRead(etdev, 0x12, &Register18); MiWrite(etdev, 0x12, Register18 | 0x4); MiWrite(etdev, 0x10, Register18 | 0x8402); MiWrite(etdev, 0x11, Register18 | 511); MiWrite(etdev, 0x12, Register18); } /* For the first N seconds of life, we are in "link * detection" When we are in this state, we should * only report "connected". When the LinkDetection * Timer expires, we can report disconnected (handled * in the LinkDetectionDPC). */ if (!(etdev->Flags & fMP_ADAPTER_LINK_DETECTION) || (etdev->MediaState == NETIF_STATUS_MEDIA_DISCONNECT)) { spin_lock_irqsave(&etdev->Lock, flags); etdev->MediaState = NETIF_STATUS_MEDIA_DISCONNECT; spin_unlock_irqrestore(&etdev->Lock, flags); /* Only indicate state if we're in loopback * mode */ if (etdev->RegistryPhyLoopbk == false) netif_carrier_off(etdev->netdev); } etdev->linkspeed = 0; etdev->duplex_mode = 0; /* Free the packets being actively sent & stopped */ et131x_free_busy_send_packets(etdev); /* Re-initialize the send structures */ et131x_init_send(etdev); /* Reset the RFD list and re-start RU */ et131x_reset_recv(etdev); /* * Bring the device back to the state it was during * init prior to autonegotiation being complete. This * way, when we get the auto-neg complete interrupt, * we can complete init by calling ConfigMacREGS2. */ et131x_soft_reset(etdev); /* Setup ET1310 as per the documentation */ et131x_adapter_setup(etdev); /* Setup the PHY into coma mode until the cable is * plugged back in */ if (etdev->RegistryPhyComa == 1) EnablePhyComa(etdev); } } if (bmsr_ints.bits.auto_neg_complete || (etdev->AiForceDpx == 3 && bmsr_ints.bits.link_status)) { if (bmsr.bits.auto_neg_complete || etdev->AiForceDpx == 3) { ET1310_PhyLinkStatus(etdev, &link_status, &autoneg_status, &speed, &duplex, &mdi_mdix, &masterslave, &polarity); etdev->linkspeed = speed; etdev->duplex_mode = duplex; etdev->PoMgmt.TransPhyComaModeOnBoot = 20; if (etdev->linkspeed == TRUEPHY_SPEED_10MBPS) { /* * NOTE - Is there a way to query this without * TruePHY? * && TRU_QueryCoreType(etdev->hTruePhy, 0)== EMI_TRUEPHY_A13O) { */ uint16_t Register18; MiRead(etdev, 0x12, &Register18); MiWrite(etdev, 0x12, Register18 | 0x4); MiWrite(etdev, 0x10, Register18 | 0x8402); MiWrite(etdev, 0x11, Register18 | 511); MiWrite(etdev, 0x12, Register18); } ConfigFlowControl(etdev); if (etdev->linkspeed == TRUEPHY_SPEED_1000MBPS && etdev->RegistryJumboPacket > 2048) ET1310_PhyAndOrReg(etdev, 0x16, 0xcfff, 0x2000); SetRxDmaTimer(etdev); ConfigMACRegs2(etdev); } } }