When bus width detection procedure takes place, kernel cannot lock on correct bus width
Hi Elad, I'm forwarding your bug report to the linux-mmc@ list.
- Chris.
I've been working on a bringup of an new board in Harmonic Inc. This board uses Sandisk iNand eMMC flash.
I've noticed that the mmc driver keeps detecting 1 bit width although HW supports 4 bit, looked into it, and found the problem. In line 571 at mmc.c:
There is:
/* only compare read only fields */
err = !((card->ext_csd.raw_partition_support ==
bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
(card->ext_csd.raw_erased_mem_count ==
bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
(card->ext_csd.rev ==
bw_ext_csd[EXT_CSD_REV]) &&
(card->ext_csd.raw_ext_csd_structure ==
...The problem is that raw_partition_support is not the same when setting width of 4 bits instead of 1 bit, and shouldn't be compared at all although it is read only.
this should be changed to:
/* only compare read only fields */
err = !((card->ext_csd.raw_erased_mem_count ==
bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
(card->ext_csd.rev ==
bw_ext_csd[EXT_CSD_REV]) &&
(card->ext_csd.raw_ext_csd_structure ==
...Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child
Hi,
Quoted 19 lines · Chris Ball
I've been working on a bringup of an new board in Harmonic Inc. This board uses Sandisk iNand eMMC flash.
I've noticed that the mmc driver keeps detecting 1 bit width although HW supports 4 bit, looked into it, and found the problem. In line 571 atmmc.c:
There is:/* only compare read only fields */ err = !((card->ext_csd.raw_partition_support == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && (card->ext_csd.raw_erased_mem_count == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && (card->ext_csd.rev == bw_ext_csd[EXT_CSD_REV]) && (card->ext_csd.raw_ext_csd_structure == ...The problem is that
raw_partition_supportis not the same when setting width of 4 bits instead of 1 bit, and shouldn't be compared at all although it is read only.
this should be changed to:
Quoted 7 lines
/* only compare read only fields */
err = !((card->ext_csd.raw_erased_mem_count ==
bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
(card->ext_csd.rev ==
bw_ext_csd[EXT_CSD_REV]) &&
(card->ext_csd.raw_ext_csd_structure ==
...Philip, what do you think?
Thanks,
- Chris.
Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child
Elad,
Please supply the name of the spec which shows that this field is dependent on bit width.
I checked my sd / emmc specs and do not see this.
regards,
Philip
Quoted 35 lines · Chris Ball
Hi Elad, I'm forwarding your bug report to the linux-mmc@ list.
- Chris.
I've been working on a bringup of an new board in Harmonic Inc. This board uses Sandisk iNand eMMC flash.
I've noticed that the mmc driver keeps detecting 1 bit width although HW supports 4 bit, looked into it, and found the problem. In line 571 atmmc.c:
There is:/* only compare read only fields */ err = !((card->ext_csd.raw_partition_support == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && (card->ext_csd.raw_erased_mem_count == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && (card->ext_csd.rev == bw_ext_csd[EXT_CSD_REV]) && (card->ext_csd.raw_ext_csd_structure == ...The problem is that
raw_partition_supportis not the same when setting width of 4 bits instead of 1 bit, and shouldn't be compared at all although it is read only.
this should be changed to:/* only compare read only fields */ err = !((card->ext_csd.raw_erased_mem_count == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && (card->ext_csd.rev == bw_ext_csd[EXT_CSD_REV]) && (card->ext_csd.raw_ext_csd_structure == ...Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child
Elad,
I would like to discuss this problem with someone at sandisk. Could you let me know what part you are using.
Also, since you have managed to track down the problem this far perhaps you can print out the fields values in 1, 4, and 8 bit modes and let me know what is present.
regards,
Philip
Quoted 54 lines · Philip Rakity
Elad,
Please supply the name of the spec which shows that this field is dependent on bit width.
I checked my sd / emmc specs and do not see this.
regards,
Philip
Quoted 26 lines · Chris Ball
Hi Elad, I'm forwarding your bug report to the linux-mmc@ list.
- Chris.
I've been working on a bringup of an new board in Harmonic Inc. This board uses Sandisk iNand eMMC flash.
I've noticed that the mmc driver keeps detecting 1 bit width although HW supports 4 bit, looked into it, and found the problem. In line 571 atmmc.c:
There is:
/* only compare read only fields */
err = !((card->ext_csd.raw_partition_support ==bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) && (card->ext_csd.raw_erased_mem_count == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && (card->ext_csd.rev == bw_ext_csd[EXT_CSD_REV]) && (card->ext_csd.raw_ext_csd_structure == ...The problem is that
raw_partition_supportis not the same when setting width of 4 bits instead of 1 bit, and shouldn't be compared at all although it is read only.
this should be changed to:
/* only compare read only fields */
err = !((card->ext_csd.raw_erased_mem_count ==Quoted 9 lines
bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) && (card->ext_csd.rev == bw_ext_csd[EXT_CSD_REV]) && (card->ext_csd.raw_ext_csd_structure == ...Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Philip Rakity <[email protected]>
Subject: [PATCH] mmc: core: Fix bit width test failing on old eMMC cards
PARTITION_SUPPORT needs to be set before doing the compare on version number so the bit width test does not get invalid data. Before this patch, a Sandisk iNAND eMMC card would detect 1-bit width although the hardware supports 4-bit.
Only affects old emmc devices - pre 4.4 devices.
--- drivers/mmc/core/mmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/core/mmc.c +1 -1
@@ -369,13 +369,13 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT ]; card->ext_csd.raw_trim_mult = ext_csd[EXT_CSD_TRIM_MULT ]; + card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT ];if (card->ext_csd.rev >=4 ) {/* * Enhanced area feature support -- check whether the eMMC * card has the Enhanced area enabled. If so, export enhanced * area offset and size to user by adding sysfs interface. */ - card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT ];if ((ext_csd[EXT_CSD_PARTITION_SUPPORT ] &0x2 ) && (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE ] &0x1 )) { hc_erase_grp_sz =
Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child