@@ -284,73 +284,6 @@ enum gpio_cfg_bits_t{
284284 GPIO_CFG_GPIO2_LED_INDEX = 30U /*< GPIO2 set to LED3 */
285285};
286286
287-
288- static void fill_tx_fifo (const struct smsc9220_eth_dev_t * dev ,
289- uint8_t * data , uint32_t size_bytes )
290- {
291- struct smsc9220_eth_reg_map_t * register_map =
292- (struct smsc9220_eth_reg_map_t * )dev -> cfg -> base ;
293-
294- uint32_t tx_data_port_tmp = 0 ;
295- uint8_t * tx_data_port_tmp_ptr = (uint8_t * )& tx_data_port_tmp ;
296-
297- /*If the data length is not a multiple of 4, then the beginning of the first
298- * DWORD of the TX DATA FIFO gets filled up with zeros and a byte offset is
299- * set accordingly to guarantee proper transmission.*/
300- uint32_t remainder_bytes = (size_bytes % 4 );
301- uint32_t filler_bytes = (4 - remainder_bytes );
302- for (uint32_t i = 0 ; i < 4 ; i ++ ){
303- if (i < filler_bytes ){
304- tx_data_port_tmp_ptr [i ] = 0 ;
305- } else {
306- tx_data_port_tmp_ptr [i ] = data [i - filler_bytes ];
307- }
308- }
309- register_map -> tx_data_port = tx_data_port_tmp ;
310- size_bytes -= remainder_bytes ;
311- data += remainder_bytes ;
312-
313- while (size_bytes > 0 ) {
314- /* Keep the same endianness in data as in the temp variable */
315- tx_data_port_tmp_ptr [0 ] = data [0 ];
316- tx_data_port_tmp_ptr [1 ] = data [1 ];
317- tx_data_port_tmp_ptr [2 ] = data [2 ];
318- tx_data_port_tmp_ptr [3 ] = data [3 ];
319- register_map -> tx_data_port = tx_data_port_tmp ;
320- data += 4 ;
321- size_bytes -= 4 ;
322- }
323- }
324-
325- static void empty_rx_fifo (const struct smsc9220_eth_dev_t * dev ,
326- uint8_t * data , uint32_t size_bytes )
327- {
328- struct smsc9220_eth_reg_map_t * register_map =
329- (struct smsc9220_eth_reg_map_t * )dev -> cfg -> base ;
330-
331- uint32_t rx_data_port_tmp = 0 ;
332- uint8_t * rx_data_port_tmp_ptr = (uint8_t * )& rx_data_port_tmp ;
333-
334- uint32_t remainder_bytes = (size_bytes % 4 );
335- size_bytes -= remainder_bytes ;
336-
337- while (size_bytes > 0 ) {
338- /* Keep the same endianness in data as in the temp variable */
339- rx_data_port_tmp = register_map -> rx_data_port ;
340- data [0 ] = rx_data_port_tmp_ptr [0 ];
341- data [1 ] = rx_data_port_tmp_ptr [1 ];
342- data [2 ] = rx_data_port_tmp_ptr [2 ];
343- data [3 ] = rx_data_port_tmp_ptr [3 ];
344- data += 4 ;
345- size_bytes -= 4 ;
346- }
347-
348- rx_data_port_tmp = register_map -> rx_data_port ;
349- for (uint32_t i = 0 ; i < remainder_bytes ; i ++ ) {
350- data [i ] = rx_data_port_tmp_ptr [i ];
351- }
352- }
353-
354287enum smsc9220_error_t smsc9220_mac_regread (
355288 const struct smsc9220_eth_dev_t * dev ,
356289 enum smsc9220_mac_reg_offsets_t regoffset ,
@@ -949,77 +882,45 @@ enum smsc9220_error_t smsc9220_init(
949882 return SMSC9220_ERROR_NONE ;
950883}
951884
952- enum smsc9220_error_t smsc9220_send_by_chunks (
885+ enum smsc9220_error_t smsc9220_send_packet (
953886 const struct smsc9220_eth_dev_t * dev ,
954- uint32_t total_payload_length ,
955- bool is_new_packet ,
956- const char * data , uint32_t current_size )
887+ void * data , uint32_t dlen )
957888{
958889 struct smsc9220_eth_reg_map_t * register_map =
959890 (struct smsc9220_eth_reg_map_t * )dev -> cfg -> base ;
960- bool is_first_segment = false;
961- bool is_last_segment = false;
962- uint32_t txcmd_a , txcmd_b = 0 ;
891+ uint32_t txcmd_a = 0 , txcmd_b = 0 ;
963892 uint32_t tx_buffer_free_space = 0 ;
964- volatile uint32_t xmit_stat = 0 ;
965893
966894 if (!data ) {
967895 return SMSC9220_ERROR_PARAM ;
968896 }
969897
970- if (is_new_packet ) {
971- is_first_segment = true;
972- dev -> data -> ongoing_packet_length = total_payload_length ;
973- dev -> data -> ongoing_packet_length_sent = 0 ;
974- } else if (dev -> data -> ongoing_packet_length != total_payload_length ||
975- dev -> data -> ongoing_packet_length_sent >= total_payload_length ) {
976- return SMSC9220_ERROR_PARAM ;
977- }
978-
979898 /* Would next chunk fit into buffer? */
980899 tx_buffer_free_space = GET_BIT_FIELD (register_map -> tx_fifo_inf ,
981900 FIFO_USED_SPACE_MASK ,
982901 DATA_FIFO_USED_SPACE_POS );
983- if (current_size > tx_buffer_free_space ) {
902+ if (dlen > tx_buffer_free_space ) {
984903 return SMSC9220_ERROR_INTERNAL ; /* Not enough space in FIFO */
985904 }
986- if ((dev -> data -> ongoing_packet_length_sent + current_size ) ==
987- total_payload_length ) {
988- is_last_segment = true;
989- }
990-
991- txcmd_a = 0 ;
992- txcmd_b = 0 ;
993-
994- if (is_last_segment ) {
995- SET_BIT (txcmd_a , TX_COMMAND_A_LAST_SEGMENT_INDEX );
996- }
997- if (is_first_segment ) {
998- SET_BIT (txcmd_a , TX_COMMAND_A_FIRST_SEGMENT_INDEX );
999- }
1000-
1001- uint32_t data_start_offset_bytes = (4 - (current_size % 4 ));
1002-
1003- SET_BIT_FIELD (txcmd_a , TX_CMD_PKT_LEN_BYTES_MASK , 0 , current_size );
1004- SET_BIT_FIELD (txcmd_a , TX_CMD_DATA_START_OFFSET_BYTES_MASK ,
1005- TX_CMD_DATA_START_OFFSET_BYTES_POS ,
1006- data_start_offset_bytes );
1007-
1008- SET_BIT_FIELD (txcmd_b , TX_CMD_PKT_LEN_BYTES_MASK , 0 , current_size );
1009- SET_BIT_FIELD (txcmd_b , TX_CMD_PKT_TAG_MASK , TX_CMD_PKT_TAG_POS ,
1010- current_size );
1011905
906+ SET_BIT (txcmd_a , TX_COMMAND_A_LAST_SEGMENT_INDEX );
907+ SET_BIT (txcmd_a , TX_COMMAND_A_FIRST_SEGMENT_INDEX );
908+ SET_BIT_FIELD (txcmd_a , TX_CMD_PKT_LEN_BYTES_MASK , 0 , dlen );
909+ SET_BIT_FIELD (txcmd_b , TX_CMD_PKT_LEN_BYTES_MASK , 0 , dlen );
910+ SET_BIT_FIELD (txcmd_b , TX_CMD_PKT_TAG_MASK , TX_CMD_PKT_TAG_POS , dlen );
1012911 register_map -> tx_data_port = txcmd_a ;
1013912 register_map -> tx_data_port = txcmd_b ;
1014913
1015- fill_tx_fifo (dev , (uint8_t * )data , current_size );
1016-
1017- if (is_last_segment ) {
1018- /* Pop status port for error check */
1019- xmit_stat = register_map -> tx_status_port ;
1020- (void )xmit_stat ;
914+ /* Ethernet data port is padding to 32bit aligned data */
915+ uint32_t dwords_to_write = (dlen + 3 ) >> 2 ;
916+ uint32_t * data_ptr = (uint32_t * ) data ;
917+ for (uint32_t i = 0 ; i < dwords_to_write ; i ++ ) {
918+ register_map -> tx_data_port = data_ptr [i ];
1021919 }
1022- dev -> data -> ongoing_packet_length_sent += current_size ;
920+
921+ /* Pop status port for error check */
922+ (void ) (register_map -> tx_status_port );
923+
1023924 return SMSC9220_ERROR_NONE ;
1024925}
1025926
@@ -1033,10 +934,9 @@ uint32_t smsc9220_get_rxfifo_data_used_space(const struct
1033934 DATA_FIFO_USED_SPACE_POS );
1034935}
1035936
1036- uint32_t smsc9220_receive_by_chunks (const struct smsc9220_eth_dev_t * dev ,
1037- char * data , uint32_t dlen )
937+ uint32_t smsc9220_receive_packet (const struct smsc9220_eth_dev_t * dev ,
938+ void * data )
1038939{
1039- uint32_t rxfifo_inf = 0 ;
1040940 uint32_t rxfifo_stat = 0 ;
1041941 uint32_t packet_length_byte = 0 ;
1042942 struct smsc9220_eth_reg_map_t * register_map =
@@ -1045,23 +945,22 @@ uint32_t smsc9220_receive_by_chunks(const struct smsc9220_eth_dev_t* dev,
1045945 if (!data ) {
1046946 return 0 ; /* Invalid input parameter, cannot read */
1047947 }
1048- rxfifo_inf = register_map -> rx_fifo_inf ;
1049-
1050- if (rxfifo_inf & 0xFFFF ) { /* If there's data */
1051- rxfifo_stat = register_map -> rx_status_port ;
1052- if (rxfifo_stat != 0 ) { /* Fetch status of this packet */
1053- /* Ethernet controller is padding to 32bit aligned data */
1054- packet_length_byte = GET_BIT_FIELD (rxfifo_stat ,
1055- RX_FIFO_STATUS_PKT_LENGTH_MASK ,
1056- RX_FIFO_STATUS_PKT_LENGTH_POS );
1057- packet_length_byte -= 4 ;
1058- dev -> data -> current_rx_size_words = packet_length_byte ;
1059- }
1060- }
1061948
1062- empty_rx_fifo (dev , (uint8_t * )data , packet_length_byte );
949+ /* Status port not empty from smsc9220_peek_next_packet_size */
950+ rxfifo_stat = register_map -> rx_status_port ;
951+ packet_length_byte = GET_BIT_FIELD (rxfifo_stat ,
952+ RX_FIFO_STATUS_PKT_LENGTH_MASK ,
953+ RX_FIFO_STATUS_PKT_LENGTH_POS );
954+ packet_length_byte -= 4 ; /* Discard last word (CRC) */
955+
956+ /* Ethernet data port is padding to 32bit aligned data */
957+ uint32_t dwords_to_read = (packet_length_byte + 3 ) >> 2 ;
958+ uint32_t * data_ptr = (uint32_t * ) data ;
959+ for (uint32_t i = 0 ; i < dwords_to_read ; i ++ ) {
960+ data_ptr [i ] = register_map -> rx_data_port ;
961+ }
1063962 (void ) (register_map -> rx_data_port ); /* Discard last word (CRC) */
1064- dev -> data -> current_rx_size_words = 0 ;
963+
1065964 return packet_length_byte ;
1066965}
1067966
0 commit comments