mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'bugfix/iperf_tcp_performance_become_bad' into 'master'
emac: optimise performance regression introduced in hal refactor Closes IDF-3527 and IDFCI-795 See merge request espressif/esp-idf!14282
This commit is contained in:
commit
61299f879e
@ -129,7 +129,7 @@ example_test_002:
|
||||
- ESP32
|
||||
- Example_ShieldBox_Basic
|
||||
|
||||
example_test_enternet:
|
||||
example_test_ethernet:
|
||||
extends: .example_test_esp32_template
|
||||
tags:
|
||||
- ESP32
|
||||
|
@ -391,7 +391,7 @@ typedef struct {
|
||||
#define ETH_MAC_DEFAULT_CONFIG() \
|
||||
{ \
|
||||
.sw_reset_timeout_ms = 100, \
|
||||
.rx_task_stack_size = 4096, \
|
||||
.rx_task_stack_size = 2048, \
|
||||
.rx_task_prio = 15, \
|
||||
.smi_mdc_gpio_num = 23, \
|
||||
.smi_mdio_gpio_num = 18, \
|
||||
|
@ -141,16 +141,16 @@ void emac_hal_init(emac_hal_context_t *hal, void *descriptors,
|
||||
|
||||
void emac_hal_set_csr_clock_range(emac_hal_context_t *hal, int freq)
|
||||
{
|
||||
/* Tell MAC system clock Frequency, which will determine the frequency range of MDC(1MHz~2.5MHz) */
|
||||
if (freq >= 20 && freq < 35) {
|
||||
/* Tell MAC system clock Frequency in MHz, which will determine the frequency range of MDC(1MHz~2.5MHz) */
|
||||
if (freq >= 20000000 && freq < 35000000) {
|
||||
emac_ll_set_csr_clock_division(hal->mac_regs, 2); // CSR clock/16
|
||||
} else if (freq >= 35 && freq < 60) {
|
||||
} else if (freq >= 35000000 && freq < 60000000) {
|
||||
emac_ll_set_csr_clock_division(hal->mac_regs, 3); // CSR clock/26
|
||||
} else if (freq >= 60 && freq < 100) {
|
||||
} else if (freq >= 60000000 && freq < 100000000) {
|
||||
emac_ll_set_csr_clock_division(hal->mac_regs, 0); // CSR clock/42
|
||||
} else if (freq >= 100 && freq < 150) {
|
||||
} else if (freq >= 100000000 && freq < 150000000) {
|
||||
emac_ll_set_csr_clock_division(hal->mac_regs, 1); // CSR clock/62
|
||||
} else if (freq > 150 && freq < 250) {
|
||||
} else if (freq >= 150000000 && freq < 250000000) {
|
||||
emac_ll_set_csr_clock_division(hal->mac_regs, 4); // CSR clock/102
|
||||
} else {
|
||||
emac_ll_set_csr_clock_division(hal->mac_regs, 5); // CSR clock/124
|
||||
@ -281,8 +281,8 @@ void emac_hal_init_dma_default(emac_hal_context_t *hal)
|
||||
emac_ll_recv_store_forward_enable(hal->dma_regs, true);
|
||||
/* Enable Flushing of Received Frames because of the unavailability of receive descriptors or buffers */
|
||||
emac_ll_flush_recv_frame_enable(hal->dma_regs, true);
|
||||
/* Enable Transmit Store Forward */
|
||||
emac_ll_trans_store_forward_enable(hal->dma_regs, true);
|
||||
/* Disable Transmit Store Forward */
|
||||
emac_ll_trans_store_forward_enable(hal->dma_regs, false);
|
||||
/* Flush Transmit FIFO */
|
||||
emac_ll_flush_trans_fifo_enable(hal->dma_regs, true);
|
||||
/* Transmit Threshold Control */
|
||||
|
@ -137,7 +137,7 @@ extern "C" {
|
||||
#define EMAC_LL_INTR_OVERFLOW_ENABLE 0x00000010U
|
||||
#define EMAC_LL_INTR_UNDERFLOW_ENABLE 0x00000020U
|
||||
#define EMAC_LL_INTR_RECEIVE_ENABLE 0x00000040U
|
||||
#define EMAC_LL_INTR_REVEIVE_BUFF_UNAVAILABLE_ENABLE 0x00000080U
|
||||
#define EMAC_LL_INTR_RECEIVE_BUFF_UNAVAILABLE_ENABLE 0x00000080U
|
||||
#define EMAC_LL_INTR_RECEIVE_STOP_ENABLE 0x00000100U
|
||||
#define EMAC_LL_INTR_RECEIVE_TIMEOUT_ENABLE 0x00000200U
|
||||
#define EMAC_LL_INTR_TRANSMIT_FIRST_BYTE_ENABLE 0x00000400U
|
||||
@ -406,7 +406,7 @@ static inline void emac_ll_flush_recv_frame_enable(emac_dma_dev_t *dma_regs, boo
|
||||
|
||||
static inline void emac_ll_trans_store_forward_enable(emac_dma_dev_t *dma_regs, bool enable)
|
||||
{
|
||||
dma_regs->dmaoperation_mode.tx_str_fwd = !enable;
|
||||
dma_regs->dmaoperation_mode.tx_str_fwd = enable;
|
||||
}
|
||||
|
||||
static inline void emac_ll_flush_trans_fifo_enable(emac_dma_dev_t *dma_regs, bool enable)
|
||||
|
@ -10,6 +10,13 @@ CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv"
|
||||
CONFIG_FREERTOS_USE_TRACE_FACILITY=y
|
||||
CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y
|
||||
|
||||
# Run FreeRTOS only on the first core
|
||||
CONFIG_FREERTOS_UNICORE=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
|
||||
# Disable watch dog
|
||||
CONFIG_ESP_INT_WDT=n
|
||||
CONFIG_ESP_TASK_WDT=n
|
||||
|
||||
CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=n
|
||||
|
@ -14,7 +14,7 @@ except ImportError:
|
||||
pass
|
||||
|
||||
# configurations
|
||||
TEST_TIME = TEST_TIMEOUT = 60
|
||||
TEST_TIME = TEST_TIMEOUT = 66
|
||||
WAIT_AP_POWER_ON_TIMEOUT = 90
|
||||
SCAN_TIMEOUT = 3
|
||||
SCAN_RETRY_COUNT = 3
|
||||
@ -96,6 +96,7 @@ class TestResult(object):
|
||||
"""
|
||||
fall_to_0_recorded = 0
|
||||
throughput_list = []
|
||||
throughput = 0.0
|
||||
result_list = self.PC_BANDWIDTH_LOG_PATTERN.findall(raw_data)
|
||||
if not result_list:
|
||||
# failed to find raw data by PC pattern, it might be DUT pattern
|
||||
@ -106,6 +107,7 @@ class TestResult(object):
|
||||
# this could be summary, ignore this
|
||||
continue
|
||||
throughput_list.append(float(result[2]))
|
||||
throughput = (throughput if (throughput > float(result[2])) else float(result[2]))
|
||||
if float(result[2]) == 0 and rssi > self.ZERO_POINT_THRESHOLD \
|
||||
and fall_to_0_recorded < 1:
|
||||
# throughput fall to 0 error. we only record 1 records for one test
|
||||
@ -113,9 +115,7 @@ class TestResult(object):
|
||||
.format(ap_ssid, att, rssi, result[0], result[1]))
|
||||
fall_to_0_recorded += 1
|
||||
|
||||
if len(throughput_list) > self.THROUGHPUT_QUALIFY_COUNT:
|
||||
throughput = sum(throughput_list) / len(throughput_list)
|
||||
else:
|
||||
if len(throughput_list) < self.THROUGHPUT_QUALIFY_COUNT:
|
||||
throughput = 0.0
|
||||
|
||||
if throughput == 0 and rssi > self.ZERO_THROUGHPUT_THRESHOLD:
|
||||
@ -330,6 +330,12 @@ class IperfTestUtility(object):
|
||||
process = subprocess.Popen(['iperf', '-c', dut_ip,
|
||||
'-t', str(TEST_TIME), '-f', 'm'],
|
||||
stdout=f, stderr=f)
|
||||
for _ in range(TEST_TIMEOUT):
|
||||
if process.poll() is not None:
|
||||
break
|
||||
time.sleep(1)
|
||||
else:
|
||||
process.terminate()
|
||||
else:
|
||||
self.dut.write('iperf -s -u -i 1 -t {}'.format(TEST_TIME))
|
||||
# wait until DUT TCP server created
|
||||
@ -338,16 +344,15 @@ class IperfTestUtility(object):
|
||||
except DUT.ExpectTimeout:
|
||||
# compatible with old iperf example binary
|
||||
Utility.console_log('create iperf udp server fail')
|
||||
process = subprocess.Popen(['iperf', '-c', dut_ip, '-u', '-b', '100M',
|
||||
'-t', str(TEST_TIME), '-f', 'm'],
|
||||
stdout=f, stderr=f)
|
||||
|
||||
for _ in range(TEST_TIMEOUT):
|
||||
if process.poll() is not None:
|
||||
break
|
||||
time.sleep(1)
|
||||
else:
|
||||
process.terminate()
|
||||
for bandwidth in range(50, 101, 5):
|
||||
process = subprocess.Popen(['iperf', '-c', dut_ip, '-u', '-b', str(bandwidth) + 'm',
|
||||
'-t', str(TEST_TIME / 11), '-f', 'm'], stdout=f, stderr=f)
|
||||
for _ in range(TEST_TIMEOUT):
|
||||
if process.poll() is not None:
|
||||
break
|
||||
time.sleep(1)
|
||||
else:
|
||||
process.terminate()
|
||||
|
||||
server_raw_data = self.dut.read()
|
||||
with open(PC_IPERF_TEMP_LOG_FILE, 'r') as f:
|
||||
|
Loading…
x
Reference in New Issue
Block a user