Hi,
using the MMC_SWITCH command via the ioctl to write registers of the
EXT_CSD, it looks to us that in this case the internal ext_csd data
structure isn't updated. Resulting in a mismatch of what the ext_csd
data structure contains and what's written to the real hardware.
We are using the mmc utils [1] to e.g. enable the bootpart
mmc bootpart enable 1 0 /dev/mmcblk1
This correctly writes to the EXT_CSD structure of the device, but
doesn't update
card->ext_csd.part_config
Issuing additional MMC_SWITCH commands afterwards use the then (wrong)
card->ext_csd.part_config. Resulting in a undo of the mmc bootpart enable.
What we think might be necessary here is anything like
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -542,11 +544,17 @@ static int mmc_blk_ioctl_cmd(struct block_device
*bdev,
__func__, status, err);
}
+ if ((cmd.opcode == MMC_SWITCH) && ((cmd.arg >> 24) & 0x3)) {
+ /* In case the IOCTL has modified the EXT_CSD, update
it, i.e. re-read the EXT_CSD */
+ mmc_update_ext_csd(card->ext_csd);
+ }
+
cmd_rel_host:
mmc_release_host(card->host);
?
Opinions?
Best regards
Dirk
[1] https://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html