| 267 | } |
| 268 | |
| 269 | static int mmc_compare_ext_csds(struct rt_mmcsd_card *card, |
| 270 | rt_uint8_t *ext_csd, rt_uint32_t bus_width) |
| 271 | { |
| 272 | rt_uint8_t *bw_ext_csd; |
| 273 | int err; |
| 274 | |
| 275 | if (bus_width == MMCSD_BUS_WIDTH_1) |
| 276 | return 0; |
| 277 | |
| 278 | err = mmc_get_ext_csd(card, &bw_ext_csd); |
| 279 | |
| 280 | if (err || bw_ext_csd == RT_NULL) |
| 281 | { |
| 282 | err = -RT_ERROR; |
| 283 | goto out; |
| 284 | } |
| 285 | |
| 286 | /* only compare read only fields */ |
| 287 | err = !((ext_csd[EXT_CSD_PARTITION_SUPPORT] == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && |
| 288 | (ext_csd[EXT_CSD_ERASED_MEM_CONT] == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && |
| 289 | (ext_csd[EXT_CSD_REV] == bw_ext_csd[EXT_CSD_REV]) && |
| 290 | (ext_csd[EXT_CSD_STRUCTURE] == bw_ext_csd[EXT_CSD_STRUCTURE]) && |
| 291 | (ext_csd[EXT_CSD_CARD_TYPE] == bw_ext_csd[EXT_CSD_CARD_TYPE]) && |
| 292 | (ext_csd[EXT_CSD_S_A_TIMEOUT] == bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) && |
| 293 | (ext_csd[EXT_CSD_HC_WP_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) && |
| 294 | (ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] == bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) && |
| 295 | (ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) && |
| 296 | (ext_csd[EXT_CSD_SEC_TRIM_MULT] == bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) && |
| 297 | (ext_csd[EXT_CSD_SEC_ERASE_MULT] == bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) && |
| 298 | (ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] == bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) && |
| 299 | (ext_csd[EXT_CSD_TRIM_MULT] == bw_ext_csd[EXT_CSD_TRIM_MULT]) && |
| 300 | (ext_csd[EXT_CSD_SEC_CNT + 0] == bw_ext_csd[EXT_CSD_SEC_CNT + 0]) && |
| 301 | (ext_csd[EXT_CSD_SEC_CNT + 1] == bw_ext_csd[EXT_CSD_SEC_CNT + 1]) && |
| 302 | (ext_csd[EXT_CSD_SEC_CNT + 2] == bw_ext_csd[EXT_CSD_SEC_CNT + 2]) && |
| 303 | (ext_csd[EXT_CSD_SEC_CNT + 3] == bw_ext_csd[EXT_CSD_SEC_CNT + 3]) && |
| 304 | (ext_csd[EXT_CSD_PWR_CL_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_52_195]) && |
| 305 | (ext_csd[EXT_CSD_PWR_CL_26_195] == bw_ext_csd[EXT_CSD_PWR_CL_26_195]) && |
| 306 | (ext_csd[EXT_CSD_PWR_CL_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_52_360]) && |
| 307 | (ext_csd[EXT_CSD_PWR_CL_26_360] == bw_ext_csd[EXT_CSD_PWR_CL_26_360]) && |
| 308 | (ext_csd[EXT_CSD_PWR_CL_200_195] == bw_ext_csd[EXT_CSD_PWR_CL_200_195]) && |
| 309 | (ext_csd[EXT_CSD_PWR_CL_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_200_360]) && |
| 310 | (ext_csd[EXT_CSD_PWR_CL_DDR_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) && |
| 311 | (ext_csd[EXT_CSD_PWR_CL_DDR_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) && |
| 312 | (ext_csd[EXT_CSD_PWR_CL_DDR_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360])); |
| 313 | |
| 314 | if (err) |
| 315 | err = -RT_ERROR; |
| 316 | |
| 317 | out: |
| 318 | rt_free(bw_ext_csd); |
| 319 | return err; |
| 320 | } |
| 321 | |
| 322 | /* |
| 323 | * Select the bus width among 4-bit and 8-bit(SDR). |
no test coverage detected