From 7a23bf19be80d4f9b711340f294711f9c527a402 Mon Sep 17 00:00:00 2001 From: KonstantinKondrashov Date: Fri, 23 Dec 2022 21:31:39 +0800 Subject: [PATCH] esp_hw_support(esp32): If the MAC_FACTORY CRC check fails, then esp_efuse_mac_get_default returns INVALID_CRC instead of abort Closes https://github.com/espressif/esp-idf/issues/10401 --- components/esp_hw_support/Kconfig | 9 +++++++++ components/esp_hw_support/mac_addr.c | 10 +++++++++- components/esp_phy/src/phy_init.c | 6 +++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/esp_hw_support/Kconfig b/components/esp_hw_support/Kconfig index 80b07749744d..dc3d5ce44062 100644 --- a/components/esp_hw_support/Kconfig +++ b/components/esp_hw_support/Kconfig @@ -22,6 +22,15 @@ menu "Hardware Settings" # Insert chip-specific MAC config rsource "./port/$IDF_TARGET/Kconfig.mac" + + config ESP_MAC_IGNORE_MAC_CRC_ERROR + bool "Ignore MAC CRC error (not recommended)" + depends on IDF_TARGET_ESP32 + default n + help + If you have an invalid MAC CRC (ESP_ERR_INVALID_CRC) problem + and you still want to use this chip, you can enable this option to bypass such an error. + This applies to both MAC_FACTORY and CUSTOM_MAC efuses. endmenu menu "Sleep Config" diff --git a/components/esp_hw_support/mac_addr.c b/components/esp_hw_support/mac_addr.c index 803e1bdfaf8b..5322a792ae66 100644 --- a/components/esp_hw_support/mac_addr.c +++ b/components/esp_hw_support/mac_addr.c @@ -98,7 +98,11 @@ esp_err_t esp_efuse_mac_get_custom(uint8_t *mac) if (efuse_crc != calc_crc) { ESP_LOGE(TAG, "Base MAC address from BLK3 of EFUSE CRC error, efuse_crc = 0x%02x; calc_crc = 0x%02x", efuse_crc, calc_crc); +#ifdef CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR + ESP_LOGW(TAG, "Ignore MAC CRC error"); +#else return ESP_ERR_INVALID_CRC; +#endif } return ESP_OK; #endif @@ -134,7 +138,11 @@ esp_err_t esp_efuse_mac_get_default(uint8_t *mac) return ESP_OK; } else { ESP_LOGE(TAG, "Base MAC address from BLK0 of EFUSE CRC error, efuse_crc = 0x%02x; calc_crc = 0x%02x", efuse_crc, calc_crc); - abort(); +#ifdef CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR + ESP_LOGW(TAG, "Ignore MAC CRC error"); +#else + return ESP_ERR_INVALID_CRC; +#endif } } #endif // CONFIG_IDF_TARGET_ESP32 diff --git a/components/esp_phy/src/phy_init.c b/components/esp_phy/src/phy_init.c index 978c00f3c1cc..664e89b6a621 100644 --- a/components/esp_phy/src/phy_init.c +++ b/components/esp_phy/src/phy_init.c @@ -603,7 +603,7 @@ static esp_err_t load_cal_data_from_nvs_handle(nvs_handle_t handle, return ESP_ERR_INVALID_SIZE; } uint8_t sta_mac[6]; - esp_efuse_mac_get_default(sta_mac); + ESP_ERROR_CHECK(esp_efuse_mac_get_default(sta_mac)); if (memcmp(sta_mac, cal_data_mac, sizeof(sta_mac)) != 0) { ESP_LOGE(TAG, "%s: calibration data MAC check failed: expected " \ MACSTR ", found " MACSTR, @@ -635,7 +635,7 @@ static esp_err_t store_cal_data_to_nvs_handle(nvs_handle_t handle, } uint8_t sta_mac[6]; - esp_efuse_mac_get_default(sta_mac); + ESP_ERROR_CHECK(esp_efuse_mac_get_default(sta_mac)); err = nvs_set_blob(handle, PHY_CAL_MAC_KEY, sta_mac, sizeof(sta_mac)); if (err != ESP_OK) { ESP_LOGE(TAG, "%s: store calibration mac failed(0x%x)\n", __func__, err); @@ -726,7 +726,7 @@ void esp_phy_load_cal_and_init(void) calibration_mode = PHY_RF_CAL_FULL; } - esp_efuse_mac_get_default(sta_mac); + ESP_ERROR_CHECK(esp_efuse_mac_get_default(sta_mac)); memcpy(cal_data->mac, sta_mac, 6); esp_err_t ret = register_chipv7_phy(init_data, cal_data, calibration_mode); if (ret == ESP_CAL_DATA_CHECK_FAIL) {