38
38
#include " cmsis_os.h"
39
39
40
40
#include " mbed_interface.h"
41
- #include " emac_stack_mem.h"
42
41
#include " mbed_assert.h"
43
42
#include " netsocket/nsapi_types.h"
44
43
#include " mbed_shared_queues.h"
@@ -56,9 +55,9 @@ uint8_t *tx_desc_start_addr;
56
55
// RX Buffer descriptors
57
56
uint8_t *rx_desc_start_addr;
58
57
// RX packet buffer pointers
59
- emac_stack_mem_t *rx_buff[ENET_RX_RING_LEN];
58
+ emac_mem_buf_t *rx_buff[ENET_RX_RING_LEN];
60
59
// TX packet buffer pointers
61
- emac_stack_mem_t *tx_buff[ENET_RX_RING_LEN];
60
+ emac_mem_buf_t *tx_buff[ENET_RX_RING_LEN];
62
61
// RX packet payload pointers
63
62
uint32_t *rx_ptr[ENET_RX_RING_LEN];
64
63
@@ -138,7 +137,7 @@ void K64F_EMAC::tx_reclaim()
138
137
// Traverse all descriptors, looking for the ones modified by the uDMA
139
138
while ((tx_consume_index != tx_produce_index) &&
140
139
(!(g_handle.txBdDirty ->control & ENET_BUFFDESCRIPTOR_TX_READY_MASK))) {
141
- emac_stack_mem_free (tx_buff[tx_consume_index % ENET_TX_RING_LEN]);
140
+ memory_manager-> free (tx_buff[tx_consume_index % ENET_TX_RING_LEN]);
142
141
if (g_handle.txBdDirty ->control & ENET_BUFFDESCRIPTOR_TX_WRAP_MASK)
143
142
g_handle.txBdDirty = g_handle.txBdBase ;
144
143
else
@@ -212,11 +211,11 @@ bool K64F_EMAC::low_level_init_successful()
212
211
213
212
/* Create buffers for each receive BD */
214
213
for (i = 0 ; i < ENET_RX_RING_LEN; i++) {
215
- rx_buff[i] = emac_stack_mem_alloc (ENET_ETH_MAX_FLEN, ENET_BUFF_ALIGNMENT);
214
+ rx_buff[i] = memory_manager-> alloc_heap (ENET_ETH_MAX_FLEN, ENET_BUFF_ALIGNMENT);
216
215
if (NULL == rx_buff[i])
217
216
return false ;
218
217
219
- rx_ptr[i] = (uint32_t *)emac_stack_mem_ptr (rx_buff[i]);
218
+ rx_ptr[i] = (uint32_t *)memory_manager-> get_ptr (rx_buff[i]);
220
219
}
221
220
222
221
tx_consume_index = tx_produce_index = 0 ;
@@ -277,16 +276,16 @@ bool K64F_EMAC::low_level_init_successful()
277
276
}
278
277
279
278
280
- /* * \brief Allocates a emac_stack_mem_t and returns the data from the incoming packet.
279
+ /* * \brief Allocates a emac_mem_buf_t and returns the data from the incoming packet.
281
280
*
282
281
* \param[in] idx index of packet to be read
283
- * \return a emac_stack_mem_t filled with the received packet (including MAC header)
282
+ * \return a emac_mem_buf_t filled with the received packet (including MAC header)
284
283
*/
285
- emac_stack_mem_t *K64F_EMAC::low_level_input (int idx)
284
+ emac_mem_buf_t *K64F_EMAC::low_level_input (int idx)
286
285
{
287
286
volatile enet_rx_bd_struct_t *bdPtr = g_handle.rxBdCurrent ;
288
- emac_stack_mem_t *p = NULL ;
289
- emac_stack_mem_t *temp_rxbuf = NULL ;
287
+ emac_mem_buf_t *p = NULL ;
288
+ emac_mem_buf_t *temp_rxbuf = NULL ;
290
289
uint32_t length = 0 ;
291
290
const uint16_t err_mask = ENET_BUFFDESCRIPTOR_RX_TRUNC_MASK | ENET_BUFFDESCRIPTOR_RX_CRC_MASK |
292
291
ENET_BUFFDESCRIPTOR_RX_NOOCTET_MASK | ENET_BUFFDESCRIPTOR_RX_LENVLIOLATE_MASK;
@@ -306,10 +305,10 @@ emac_stack_mem_t *K64F_EMAC::low_level_input(int idx)
306
305
307
306
/* Zero-copy */
308
307
p = rx_buff[idx];
309
- emac_stack_mem_set_len (p, length);
308
+ memory_manager-> set_len (p, length);
310
309
311
310
/* Attempt to queue new buffer */
312
- temp_rxbuf = emac_stack_mem_alloc (ENET_ETH_MAX_FLEN, ENET_BUFF_ALIGNMENT);
311
+ temp_rxbuf = memory_manager-> alloc_heap (ENET_ETH_MAX_FLEN, ENET_BUFF_ALIGNMENT);
313
312
if (NULL == temp_rxbuf) {
314
313
/* Re-queue the same buffer */
315
314
update_read_buffer (NULL );
@@ -322,12 +321,9 @@ emac_stack_mem_t *K64F_EMAC::low_level_input(int idx)
322
321
}
323
322
324
323
rx_buff[idx] = temp_rxbuf;
325
- rx_ptr[idx] = (uint32_t *)emac_stack_mem_ptr (rx_buff[idx]);
324
+ rx_ptr[idx] = (uint32_t *)memory_manager-> get_ptr (rx_buff[idx]);
326
325
327
326
update_read_buffer ((uint8_t *)rx_ptr[idx]);
328
-
329
- /* Save size */
330
- emac_stack_mem_set_chain_len (p, length);
331
327
}
332
328
333
329
#ifdef LOCK_RX_THREAD
@@ -343,7 +339,7 @@ emac_stack_mem_t *K64F_EMAC::low_level_input(int idx)
343
339
*/
344
340
void K64F_EMAC::input (int idx)
345
341
{
346
- emac_stack_mem_t *p;
342
+ emac_mem_buf_t *p;
347
343
348
344
/* move received packet into a new buf */
349
345
p = low_level_input (idx);
@@ -412,21 +408,17 @@ void K64F_EMAC::packet_tx()
412
408
* \param[in] buf the MAC packet to send (e.g. IP packet including MAC addresses and type)
413
409
* \return ERR_OK if the packet could be sent or an err_t value if the packet couldn't be sent
414
410
*/
415
- bool K64F_EMAC::link_out (emac_stack_mem_chain_t *chain )
411
+ bool K64F_EMAC::link_out (emac_mem_buf_t *buf )
416
412
{
417
- emac_stack_mem_t *q;
418
- emac_stack_mem_t *temp_pbuf;
419
- uint8_t *psend = NULL , *dst;
413
+ emac_mem_buf_t *temp_pbuf;
420
414
421
- temp_pbuf = emac_stack_mem_alloc ( emac_stack_mem_chain_len (chain ), ENET_BUFF_ALIGNMENT);
415
+ temp_pbuf = memory_manager-> alloc_heap (memory_manager-> get_total_len (buf ), ENET_BUFF_ALIGNMENT);
422
416
if (NULL == temp_pbuf)
423
417
return false ;
424
418
425
- psend = (uint8_t *)emac_stack_mem_ptr (temp_pbuf);
426
- for (q = emac_stack_mem_chain_dequeue (&chain), dst = psend; q != NULL ; q = emac_stack_mem_chain_dequeue (&chain)) {
427
- memcpy (dst, emac_stack_mem_ptr (q), emac_stack_mem_len (q));
428
- dst += emac_stack_mem_len (q);
429
- }
419
+ // Copy to new buffer and free original
420
+ memory_manager->copy (temp_pbuf, buf);
421
+ memory_manager->free (buf);
430
422
431
423
/* Check if a descriptor is available for the transfer. */
432
424
if (xTXDCountSem.wait (0 ) == 0 )
@@ -440,8 +432,8 @@ bool K64F_EMAC::link_out(emac_stack_mem_chain_t *chain)
440
432
tx_produce_index += 1 ;
441
433
442
434
/* Setup transfers */
443
- g_handle.txBdCurrent ->buffer = psend ;
444
- g_handle.txBdCurrent ->length = emac_stack_mem_len (temp_pbuf);
435
+ g_handle.txBdCurrent ->buffer = static_cast < uint8_t *>(memory_manager-> get_ptr (temp_pbuf)) ;
436
+ g_handle.txBdCurrent ->length = memory_manager-> get_len (temp_pbuf);
445
437
g_handle.txBdCurrent ->control |= (ENET_BUFFDESCRIPTOR_TX_READY_MASK | ENET_BUFFDESCRIPTOR_TX_LAST_MASK);
446
438
447
439
/* Increase the buffer descriptor address. */
@@ -545,7 +537,7 @@ uint8_t K64F_EMAC::get_hwaddr_size() const
545
537
546
538
bool K64F_EMAC::get_hwaddr (uint8_t *addr) const
547
539
{
548
- return false ;
540
+ return false ;
549
541
}
550
542
551
543
void K64F_EMAC::set_hwaddr (const uint8_t *addr)
@@ -574,6 +566,11 @@ void K64F_EMAC::power_down()
574
566
/* No-op at this stage */
575
567
}
576
568
569
+ void K64F_EMAC::set_memory_manager (EMACMemoryManager &mem_mngr)
570
+ {
571
+ memory_manager = &mem_mngr;
572
+ }
573
+
577
574
578
575
K64F_EMAC &K64F_EMAC::get_instance () {
579
576
static K64F_EMAC emac;
0 commit comments