@@ -284,73 +284,6 @@ enum gpio_cfg_bits_t{
284
284
GPIO_CFG_GPIO2_LED_INDEX = 30U /*< GPIO2 set to LED3 */
285
285
};
286
286
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
-
354
287
enum smsc9220_error_t smsc9220_mac_regread (
355
288
const struct smsc9220_eth_dev_t * dev ,
356
289
enum smsc9220_mac_reg_offsets_t regoffset ,
@@ -949,77 +882,45 @@ enum smsc9220_error_t smsc9220_init(
949
882
return SMSC9220_ERROR_NONE ;
950
883
}
951
884
952
- enum smsc9220_error_t smsc9220_send_by_chunks (
885
+ enum smsc9220_error_t smsc9220_send_packet (
953
886
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 )
957
888
{
958
889
struct smsc9220_eth_reg_map_t * register_map =
959
890
(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 ;
963
892
uint32_t tx_buffer_free_space = 0 ;
964
- volatile uint32_t xmit_stat = 0 ;
965
893
966
894
if (!data ) {
967
895
return SMSC9220_ERROR_PARAM ;
968
896
}
969
897
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
-
979
898
/* Would next chunk fit into buffer? */
980
899
tx_buffer_free_space = GET_BIT_FIELD (register_map -> tx_fifo_inf ,
981
900
FIFO_USED_SPACE_MASK ,
982
901
DATA_FIFO_USED_SPACE_POS );
983
- if (current_size > tx_buffer_free_space ) {
902
+ if (dlen > tx_buffer_free_space ) {
984
903
return SMSC9220_ERROR_INTERNAL ; /* Not enough space in FIFO */
985
904
}
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 );
1011
905
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 );
1012
911
register_map -> tx_data_port = txcmd_a ;
1013
912
register_map -> tx_data_port = txcmd_b ;
1014
913
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 ];
1021
919
}
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
+
1023
924
return SMSC9220_ERROR_NONE ;
1024
925
}
1025
926
@@ -1033,10 +934,9 @@ uint32_t smsc9220_get_rxfifo_data_used_space(const struct
1033
934
DATA_FIFO_USED_SPACE_POS );
1034
935
}
1035
936
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 )
1038
939
{
1039
- uint32_t rxfifo_inf = 0 ;
1040
940
uint32_t rxfifo_stat = 0 ;
1041
941
uint32_t packet_length_byte = 0 ;
1042
942
struct smsc9220_eth_reg_map_t * register_map =
@@ -1045,22 +945,22 @@ uint32_t smsc9220_receive_by_chunks(const struct smsc9220_eth_dev_t* dev,
1045
945
if (!data ) {
1046
946
return 0 ; /* Invalid input parameter, cannot read */
1047
947
}
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
- }
948
+
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 ;
1060
961
}
962
+ (void ) (register_map -> rx_data_port ); /* Discard last word (CRC) */
1061
963
1062
- empty_rx_fifo (dev , (uint8_t * )data , packet_length_byte );
1063
- dev -> data -> current_rx_size_words = 0 ;
1064
964
return packet_length_byte ;
1065
965
}
1066
966
0 commit comments