@@ -99,6 +99,9 @@ static void update_read_buffer(uint8_t *buf)
9999 g_handle.rxBdCurrent [0 ]->buffer = buf;
100100 }
101101
102+ /* Ensures buffer pointer is written before control. */
103+ __DMB ();
104+
102105 /* Clears status. */
103106 g_handle.rxBdCurrent [0 ]->control &= ENET_BUFFDESCRIPTOR_RX_WRAP_MASK;
104107
@@ -112,6 +115,9 @@ static void update_read_buffer(uint8_t *buf)
112115 g_handle.rxBdCurrent [0 ]++;
113116 }
114117
118+ /* Ensures descriptor is written before kicking hardware. */
119+ __DSB ();
120+
115121 /* Actives the receive buffer descriptor. */
116122 ENET->RDAR = ENET_RDAR_RDAR_MASK;
117123}
@@ -195,6 +201,7 @@ bool Kinetis_EMAC::low_level_init_successful()
195201 return false ;
196202
197203 rx_ptr[i] = (uint32_t *)memory_manager->get_ptr (rx_buff[i]);
204+ SCB_InvalidateDCache_by_Addr (rx_ptr[i], ENET_ALIGN (ENET_ETH_MAX_FLEN, ENET_BUFF_ALIGNMENT));
198205 }
199206
200207 tx_consume_index = tx_produce_index = 0 ;
@@ -277,6 +284,7 @@ emac_mem_buf_t *Kinetis_EMAC::low_level_input(int idx)
277284
278285 /* Zero-copy */
279286 p = rx_buff[idx];
287+ SCB_InvalidateDCache_by_Addr (rx_ptr[idx], length);
280288 memory_manager->set_len (p, length);
281289
282290 /* Attempt to queue new buffer */
@@ -295,6 +303,7 @@ emac_mem_buf_t *Kinetis_EMAC::low_level_input(int idx)
295303
296304 rx_buff[idx] = temp_rxbuf;
297305 rx_ptr[idx] = (uint32_t *)memory_manager->get_ptr (rx_buff[idx]);
306+ SCB_InvalidateDCache_by_Addr (rx_ptr[idx], ENET_ALIGN (ENET_ETH_MAX_FLEN, ENET_BUFF_ALIGNMENT));
298307
299308 update_read_buffer ((uint8_t *)rx_ptr[idx]);
300309 }
@@ -399,6 +408,8 @@ bool Kinetis_EMAC::link_out(emac_mem_buf_t *buf)
399408 buf = copy_buf;
400409 }
401410
411+ SCB_CleanDCache_by_Addr (static_cast <uint32_t *>(memory_manager->get_ptr (buf)), memory_manager->get_len (buf));
412+
402413 /* Check if a descriptor is available for the transfer (wait 10ms before dropping the buffer) */
403414 if (xTXDCountSem.wait (10 ) == 0 ) {
404415 memory_manager->free (buf);
@@ -415,6 +426,8 @@ bool Kinetis_EMAC::link_out(emac_mem_buf_t *buf)
415426 /* Setup transfers */
416427 g_handle.txBdCurrent [0 ]->buffer = static_cast <uint8_t *>(memory_manager->get_ptr (buf));
417428 g_handle.txBdCurrent [0 ]->length = memory_manager->get_len (buf);
429+ /* Ensures buffer and length is written before control. */
430+ __DMB ();
418431 g_handle.txBdCurrent [0 ]->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK);
419432
420433 /* Increase the buffer descriptor address. */
@@ -424,6 +437,9 @@ bool Kinetis_EMAC::link_out(emac_mem_buf_t *buf)
424437 g_handle.txBdCurrent [0 ]++;
425438 }
426439
440+ /* Ensures descriptor is written before kicking hardware. */
441+ __DSB ();
442+
427443 /* Active the transmit buffer descriptor. */
428444 ENET->TDAR = ENET_TDAR_TDAR_MASK;
429445
0 commit comments