/** * This function resets the device but preserves the options set by the user. * * The descriptor list could be reinitialized with the same calls to * XLlTemac_SgSetSpace() as used in main(). Doing this is a matter of preference. * In many cases, an OS may have resources tied up in the descriptors. * Reinitializing in this case may bad for the OS since its resources may be * permamently lost. * * @param TemacInstancePtr is a pointer to the instance of the Temac * component. * * @return XST_SUCCESS if successful, else XST_FAILURE. * * @note None. * ******************************************************************************/ static int TemacResetDevice(XLlTemac * TemacInstancePtr, XLlDma * DmaInstancePtr) { int Status; u8 MacSave[6]; u32 Options; //u32 RxThreshold = 1; //u32 TxThreshold = 1; //u32 RxWaitbound = 0; //u32 TxWaitbound = 0; //XLlDma_BdRing * RxRingPtr = &XLlDma_GetRxRing(DmaInstancePtr); //XLlDma_BdRing * TxRingPtr = &XLlDma_GetTxRing(DmaInstancePtr); /* * Stop LLTEMAC device */ XLlTemac_Stop(TemacInstancePtr); /* * Save the device state */ XLlTemac_GetMacAddress(TemacInstancePtr, MacSave); Options = XLlTemac_GetOptions(TemacInstancePtr); /* * Stop and reset the device */ XLlTemac_Reset(TemacInstancePtr, XTE_NORESET_HARD); /* * Restore the state */ Status = XLlTemac_SetMacAddress(TemacInstancePtr, MacSave); Status |= XLlTemac_SetOptions(TemacInstancePtr, Options); Status |= XLlTemac_ClearOptions(TemacInstancePtr, ~Options); if (Status != XST_SUCCESS) { TemacUtilErrorTrap("Error restoring state after reset"); return XST_FAILURE; } /* * Restart the device */ XLlTemac_Start(TemacInstancePtr); return XST_SUCCESS; }
/** * This function resets the device but preserves the options set by the user. * * @param None. * * @return XST_SUCCESS if successful, else XST_FAILURE. * * @note None. * ******************************************************************************/ int TemacResetDevice(void) { int Status; u8 MacSave[6]; u32 Options; /* * Stop device */ XLlTemac_Stop(&TemacInstance); /* * Save the device state */ XLlTemac_GetMacAddress(&TemacInstance, MacSave); Options = XLlTemac_GetOptions(&TemacInstance); /* * Stop and reset both the fifo and the temac the devices */ XLlFifo_Reset(&FifoInstance); XLlTemac_Reset(&TemacInstance, XTE_NORESET_HARD); /* * Restore the state */ Status = XLlTemac_SetMacAddress(&TemacInstance, MacSave); Status |= XLlTemac_SetOptions(&TemacInstance, Options); Status |= XLlTemac_ClearOptions(&TemacInstance, ~Options); if (Status != XST_SUCCESS) { TemacUtilErrorTrap("Error restoring state after reset"); return XST_FAILURE; } return XST_SUCCESS; }
void init_lltemac(xlltemacif_s *xlltemacif, struct netif *netif) { int rdy; unsigned mac_address = (unsigned)(netif->state); unsigned link_speed = 1000; unsigned options; unsigned lock_message_printed = 0; /* obtain config of this emac */ XLlTemac_Config *mac_config = lookup_config(mac_address); XLlTemac *xlltemacp = &xlltemacif->lltemac; XLlTemac_CfgInitialize(xlltemacp, mac_config, mac_config->BaseAddress); options = XLlTemac_GetOptions(xlltemacp); options |= XTE_FLOW_CONTROL_OPTION; options |= XTE_JUMBO_OPTION; options |= XTE_TRANSMITTER_ENABLE_OPTION; options |= XTE_RECEIVER_ENABLE_OPTION; options |= XTE_FCS_STRIP_OPTION; options |= XTE_MULTICAST_OPTION; XLlTemac_SetOptions(xlltemacp, options); XLlTemac_ClearOptions(xlltemacp, ~options); /* set mac address */ XLlTemac_SetMacAddress(xlltemacp, (Xuint8*)(netif->hwaddr)); /* make sure the hard TEMAC is ready */ rdy = XLlTemac_ReadReg(xlltemacp->Config.BaseAddress, XTE_RDY_OFFSET); while ((rdy & XTE_RDY_HARD_ACS_RDY_MASK) == 0) { rdy = XLlTemac_ReadReg(xlltemacp->Config.BaseAddress, XTE_RDY_OFFSET); } link_speed = Phy_Setup(xlltemacp); XLlTemac_SetOperatingSpeed(xlltemacp, link_speed); /* Setting the operating speed of the MAC needs a delay. */ { volatile int wait; for (wait=0; wait < 100000; wait++); for (wait=0; wait < 100000; wait++); } /* in a soft temac implementation, we need to explicitly make sure that * the RX DCM has been locked. See xps_ll_temac manual for details. * This bit is guaranteed to be 1 for hard temac's */ lock_message_printed = 0; while (!(XLlTemac_ReadReg(xlltemacp->Config.BaseAddress, XTE_IS_OFFSET) & XTE_INT_RXDCM_LOCK_MASK)) { int first = 1; if (first) { print("Waiting for RX DCM to lock.."); first = 0; lock_message_printed = 1; } } if (lock_message_printed) print("RX DCM locked.\r\n"); /* start the temac */ XLlTemac_Start(xlltemacp); /* enable TEMAC interrupts */ XLlTemac_IntEnable(xlltemacp, XTE_INT_RECV_ERROR_MASK); }