libsdhcdrivers: Improve card capacity calculation
* Integer overflow is now avoided.
* Switch case is more readable.
diff --git a/libsdhcdrivers/src/mmc.c b/libsdhcdrivers/src/mmc.c
index 50f2789..22d518d 100644
--- a/libsdhcdrivers/src/mmc.c
+++ b/libsdhcdrivers/src/mmc.c
@@ -538,7 +538,6 @@
long long mmc_card_capacity(mmc_card_t mmc_card)
{
int ret;
- long long capacity;
struct csd csd;
ret = mmc_decode_csd(mmc_card, &csd);
@@ -546,16 +545,19 @@
return -1;
}
- if (csd.structure == CSD_VERSION_1) {
- capacity = (csd.c_size + 1) * (1U << (csd.c_size_mult + 2));
- capacity *= (1U << csd.read_bl_len);
- } else if (csd.structure == CSD_VERSION_2_AND_3) {
- capacity = (csd.c_size + 1) * 512 * 1024;
- } else {
+ long long c_size = (long long)csd.c_size;
+ switch (csd.structure) {
+ case CSD_VERSION_1: {
+ return (c_size + 1) * (1U << (csd.c_size_mult + 2))
+ * (1U << csd.read_bl_len);
+ }
+ case CSD_VERSION_2_AND_3: {
+ return (c_size + 1) * 512 * 1024;
+ }
+ default: {
return -1;
}
-
- return capacity;
+ }
}