Skip to contentSkip to conversation

When bus width detection procedure takes place, kernel cannot lock on correct bus width

DISCUSSION Chris Ball 2 participants 5 messages Mar 17, 2013 – Apr 4, 2013 MMC, SD and SDIO

lore
Share & tools
lore

Chris Ball

author
#0 lore raw

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
author
#1 lore raw

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 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:

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
#2 lore raw
In reply to Chris Ball

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 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
#3 lore raw

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 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 ==

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

author
#4 lore raw
In reply to Chris Ball

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
index d584f7c..0cbd1ef 100644
@@ -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