Skip to content

Commit

Permalink
DriverSAM: let gmac_dev_read() return the proper length (version 2) (F…
Browse files Browse the repository at this point in the history
…reeRTOS#1000)

* Atmel SAM driver: let gmac_dev_read() return the proper length (version 2)

* Running uncrustify

* A minor format change

* Added a comment about a min() test
  • Loading branch information
htibosch authored Aug 22, 2023
1 parent 169ae78 commit 20d30d9
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 11 deletions.
11 changes: 7 additions & 4 deletions source/portable/NetworkInterface/DriverSAM/NetworkInterface.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,8 +687,10 @@ static BaseType_t prvGMACInit( NetworkInterface_t * pxInterface )
GMAC->GMAC_NCR |= GMAC_NCR_MPE;

memset( &gmac_option, '\0', sizeof( gmac_option ) );
gmac_option.uc_copy_all_frame = 0;
gmac_option.uc_no_boardcast = 0;

/* Note that 'gmac_option.uc_copy_all_frame' is false, do not copy all frames.
* And 'gmac_option.uc_no_boardcast' is false, meaning that broadcast is received.
* 'boardcast' is a typo. */
memcpy( gmac_option.uc_mac_addr, pxEndPoint->xMACAddress.ucBytes, sizeof( gmac_option.uc_mac_addr ) );

gs_gmac_dev.p_hw = GMAC;
Expand All @@ -697,7 +699,8 @@ static BaseType_t prvGMACInit( NetworkInterface_t * pxInterface )
NVIC_SetPriority( GMAC_IRQn, configMAC_INTERRUPT_PRIORITY );
NVIC_EnableIRQ( GMAC_IRQn );

/* Clear the hash table for multicast MAC addresses. */
/* Clear the hash table for multicast MAC addresses.
* OR set both to ~0H to receive all multicast packets. */
GMAC->GMAC_HRB = 0U; /* Hash Register Bottom. */
GMAC->GMAC_HRT = 0U; /* Hash Register Top. */

Expand Down Expand Up @@ -1031,6 +1034,7 @@ static uint32_t prvEMACRxPoll( void )
if( xSendEventStructToIPTask( &xRxEvent, xBlockTime ) != pdTRUE )
{
/* xSendEventStructToIPTask() timed out. Release the descriptor. */
FreeRTOS_printf( ( "prvEMACRxPoll: Can not queue a packet!\n" ) );
xRelease = pdTRUE;
}
}
Expand All @@ -1042,7 +1046,6 @@ static uint32_t prvEMACRxPoll( void )
* again. */
vReleaseNetworkBufferAndDescriptor( pxNextNetworkBufferDescriptor );
iptraceETHERNET_RX_EVENT_LOST();
FreeRTOS_printf( ( "prvEMACRxPoll: Can not queue return packet!\n" ) );
}

/* Now the buffer has either been passed to the IP-task,
Expand Down
19 changes: 12 additions & 7 deletions source/portable/NetworkInterface/DriverSAM/gmac_SAM.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,29 +624,36 @@ uint32_t gmac_dev_read( gmac_device_t * p_gmac_dev,
return GMAC_RX_NO_DATA;
}

/* Return the number of bytes received. */
*p_rcv_size = bytesLeft;

/* gmac_dev_poll has confirmed that there is a complete frame at
* the current position 'ul_rx_idx'
*/
nextIdx = p_gmac_dev->ul_rx_idx;

/* Read +2 bytes because buffers are aligned at -2 bytes */
bytesLeft = min( bytesLeft + 2, ( int32_t ) ul_frame_size );

#if ( NETWORK_BUFFERS_CACHED != 0 ) && ( __DCACHE_PRESENT != 0 ) && defined( CONF_BOARD_ENABLE_CACHE )
SCB_InvalidateDCache();
#endif

#if ( ipconfigZERO_COPY_RX_DRIVER == 0 )
{
/* The frame will be copied in 1 or 2 memcpy's */
if( ( p_frame != NULL ) && ( bytesLeft != 0 ) )
if( p_frame != NULL )
{
const uint8_t * source;
int32_t left;
int32_t toCopy;

source = gs_uc_rx_buffer + nextIdx * GMAC_RX_UNITSIZE;
left = bytesLeft;

/* The driver receives frames up to 1514 bytes long.
* The actual value of ul_frame_size is 1536, so the
* following test is not really necessary:
*/

/* Read +2 bytes because buffers are aligned at -2 bytes */
left = min( bytesLeft + 2, ( int32_t ) ul_frame_size );
toCopy = ( GMAC_RX_BUFFERS - nextIdx ) * GMAC_RX_UNITSIZE;

if( toCopy > left )
Expand Down Expand Up @@ -696,8 +703,6 @@ uint32_t gmac_dev_read( gmac_device_t * p_gmac_dev,

p_gmac_dev->ul_rx_idx = nextIdx;

*p_rcv_size = bytesLeft;

return GMAC_OK;
}

Expand Down

0 comments on commit 20d30d9

Please sign in to comment.