Skip to contentSkip to conversation

"Card stuck in programming state! __mmc_switch" problem on i.MX6 + eMMC

DISCUSSION David Müller (ELSOFT AG) 3 participants 4 messages Sep 16, 2014 – Sep 30, 2014 MMC, SD and SDIO

lore
Share & tools
lore
#0 lore raw

Hello

I have a custom i.MX6Q based board with a Hynix eMMC chip attached to USDHC3. OS is a vanilla Linux 3.16 with some patches.

Loading the iMX SDHC driver results in the following error:

modprobe sdhci-esdhc-imx
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: no vqmmc regulator found
mmc0: SDHCI controller on 2198000.usdhc [2198000.usdhc] using ADMA
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card

Pin muxing looks ok nevertheless I played around with it to see if it makes a difference. I also tried the "Add delay between CMD6 and CMD13 for Sandisk eMMC cards" workaround previously mentioned on this list.

As the whole thing is working under U-Boot as shown below, I tend to rule out soldering problems and non-functional hardware.

=> ver
U-Boot 2014.07-00045-g0955ecc-dirty (Aug 26 2014 - 12:47:21) => mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 90
OEM: 14a
Name: H8G2d
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.41
High Capacity: Yes
Capacity: 7.2 GiB
Bus Width: 8-bit

Any idea what is going wrong?
Has anybody a Hynix eMMC working under Linux?

#1 lore raw

Hi David,

2014-09-16 16:37 GMT+02:00 David Müller (ELSOFT AG) <[email protected]>:

Quoted 27 lines

Hello

I have a custom i.MX6Q based board with a Hynix eMMC chip attached to USDHC3. OS is a vanilla Linux 3.16 with some patches.

Loading the iMX SDHC driver results in the following error:

modprobe sdhci-esdhc-imx
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: no vqmmc regulator found
mmc0: SDHCI controller on 2198000.usdhc [2198000.usdhc] using ADMA
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card

Quoted 3 lines

Pin muxing looks ok nevertheless I played around with it to see if it makes a difference. I also tried the "Add delay between CMD6 and CMD13 for Sandisk eMMC cards" workaround previously mentioned on this list.

Can you show your DT (at least pinmux part and usdhc3 node) ? -110 is a timeout error and I know there is some quirks in Freescale repository I don't know if this is your best bet...

JM
PS: Sorry for double posting, forgot linux-mmc in cc

#2 lore raw

Hi Jean-Michel

Quoted 1 line · Jean-Michel Hautbois

Can you show your DT (at least pinmux part and usdhc3 node) ?

	pinctrl_usdhc3: usdhc3grp {
		fsl,pins = <
			MX6QDL_PAD_SD3_CMD__SD3_CMD    0x1b0b1
			MX6QDL_PAD_SD3_CLK__SD3_CLK    0x100b1
			MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x1b0b1
			MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x1b0b1
			MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x1b0b1
			MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x1b0b1
			MX6QDL_PAD_SD3_DAT4__SD3_DATA4 0x1b0b1
			MX6QDL_PAD_SD3_DAT5__SD3_DATA5 0x1b0b1
			MX6QDL_PAD_SD3_DAT6__SD3_DATA6 0x1b0b1
			MX6QDL_PAD_SD3_DAT7__SD3_DATA7 0x1b0b1
			MX6QDL_PAD_SD3_RST__SD3_RESET  0x1b070
		>;
	};

&usdhc3 { /* eMMC */

	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_usdhc3>;
	vmmc-supply = <&reg_3v15>;
	non-removable;
	no-1-8-v;
	bus-width = <8>;
	status = "okay";
};

I've tracked the problem down to the point were the MMC code tries to switch the eMMC to 8bit bus width (mmc_select_bus_width()).

#3 lore raw
In reply to David Müller (ELSOFT AG)

Hi David,

Quoted 52 lines · David Müller (ELSOFT AG)

Hello

I have a custom i.MX6Q based board with a Hynix eMMC chip attached to USDHC3. OS is a vanilla Linux 3.16 with some patches.

Loading the iMX SDHC driver results in the following error:

modprobe sdhci-esdhc-imx
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
mmc0: no vqmmc regulator found
mmc0: SDHCI controller on 2198000.usdhc [2198000.usdhc] using ADMA
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card
mmc0: BKOPS_EN bit is not set
mmc0: Card stuck in programming state! __mmc_switch
mmc0: error -110 whilst initialising MMC card

Pin muxing looks ok nevertheless I played around with it to see if it makes a difference. I also tried the "Add delay between CMD6 and CMD13 for Sandisk eMMC cards" workaround previously mentioned on this list.

As the whole thing is working under U-Boot as shown below, I tend to rule out soldering problems and non-functional hardware.

=> ver
U-Boot 2014.07-00045-g0955ecc-dirty (Aug 26 2014 - 12:47:21) => mmc dev 1
switch to partitions #0, OK
mmc1(part 0) is current device
=> mmc info
Device: FSL_SDHC
Manufacturer ID: 90
OEM: 14a
Name: H8G2d
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.41
High Capacity: Yes
Capacity: 7.2 GiB
Bus Width: 8-bit

Quoted 2 lines

Any idea what is going wrong?
Has anybody a Hynix eMMC working under Linux?

I remember having similar issues and they were fixed by this series:
http://www.spinics.net/lists/linux-mmc/msg28260.html

You can try linux-next as this series is already applied there already.