/** * \brief Initialize the GMAC with the Gmac controller address * \param gmacd Pointer to GMAC Driver instance. * \param gmac Pointer to HW address for registers. * \param enableCAF Enable/Disable CopyAllFrame. * \param enableNBC Enable/Disable NoBroadCast. */ void gmacd_configure(struct _gmacd * gmacd, Gmac * gmac, uint8_t enableCAF, uint8_t enableNBC) { uint32_t ncfgr; int i; /* Initialize struct */ gmacd->gmac = gmac; gmac_configure(gmac); uint32_t id = get_gmac_id_from_addr(gmac); for (i = 0; i < ARRAY_SIZE(_gmacd_irq_handlers); i++) { if (_gmacd_irq_handlers[i].addr == gmac) { *_gmacd_irq_handlers[i].gmacd = gmacd; aic_set_source_vector(_gmacd_irq_handlers[i].irq, _gmacd_irq_handlers[i].handler); } } aic_enable(id); /* Enable the copy of data into the buffers ignore broadcasts, and don't copy FCS. */ ncfgr = gmac_get_network_config_register(gmac); ncfgr |= GMAC_NCFGR_FD; if (enableCAF) { ncfgr |= GMAC_NCFGR_CAF; } if (enableNBC) { ncfgr |= GMAC_NCFGR_NBC; } gmac_set_network_config_register(gmac, ncfgr); for (i = 0; i < GMAC_NUM_QUEUES; i++) { gmacd_setup_queue(gmacd, i, DUMMY_BUFFERS, dummy_buffer, dummy_rx_desc, DUMMY_BUFFERS, dummy_buffer, dummy_tx_desc, NULL); } }
bool gmac_configure(Gmac* gmac) { pmc_enable_peripheral(get_gmac_id_from_addr(gmac)); /* Disable TX & RX and more */ gmac_set_network_control_register(gmac, 0); gmac_set_network_config_register(gmac, GMAC_NCFGR_DBW_DBW32); /* Disable interrupts */ gmac_disable_it(gmac, 0, ~0u); #ifdef CONFIG_HAVE_GMAC_QUEUES gmac_disable_it(gmac, 1, ~0u); gmac_disable_it(gmac, 2, ~0u); #endif /* Clear statistics */ gmac_clear_statistics(gmac); /* Clear all status bits in the receive status register. */ gmac_clear_rx_status(gmac, GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA | GMAC_RSR_HNO); /* Clear all status bits in the transmit status register */ gmac_clear_tx_status(gmac, GMAC_TSR_UBR | GMAC_TSR_COL | GMAC_TSR_RLE | GMAC_TSR_TXGO | GMAC_TSR_TFC | GMAC_TSR_TXCOMP | GMAC_TSR_UND | GMAC_TSR_HRESP); /* Clear interrupts */ gmac_get_it_status(gmac, 0); #ifdef CONFIG_HAVE_GMAC_QUEUES gmac_get_it_status(gmac, 1); gmac_get_it_status(gmac, 2); #endif return _gmac_configure_mdc_clock(gmac); }