800
800
struct mmc_blk_data *md = mq->data;
801
801
struct mmc_card *card = md->queue.card;
802
unsigned int from, nr, arg;
802
unsigned int from, nr, arg, trim_arg, erase_arg;
803
803
int err = 0, type = MMC_BLK_SECDISCARD;
805
805
if (!(mmc_can_secure_erase_trim(card) || mmc_can_sanitize(card))) {
810
from = blk_rq_pos(req);
811
nr = blk_rq_sectors(req);
810
813
/* The sanitize operation is supported at v4.5 only */
811
814
if (mmc_can_sanitize(card)) {
812
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
813
EXT_CSD_SANITIZE_START, 1, 0);
815
erase_arg = MMC_ERASE_ARG;
816
trim_arg = MMC_TRIM_ARG;
818
erase_arg = MMC_SECURE_ERASE_ARG;
819
trim_arg = MMC_SECURE_TRIM1_ARG;
822
if (mmc_erase_group_aligned(card, from, nr))
824
else if (mmc_can_trim(card))
817
from = blk_rq_pos(req);
818
nr = blk_rq_sectors(req);
820
if (mmc_can_trim(card) && !mmc_erase_group_aligned(card, from, nr))
821
arg = MMC_SECURE_TRIM1_ARG;
823
arg = MMC_SECURE_ERASE_ARG;
825
831
if (card->quirks & MMC_QUIRK_INAND_CMD38) {
826
832
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
830
836
INAND_CMD38_ARG_SECERASE,
835
842
err = mmc_erase(card, from, nr, arg);
836
if (!err && arg == MMC_SECURE_TRIM1_ARG) {
848
if (arg == MMC_SECURE_TRIM1_ARG) {
837
849
if (card->quirks & MMC_QUIRK_INAND_CMD38) {
838
850
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
839
851
INAND_CMD38_ARG_EXT_CSD,
840
852
INAND_CMD38_ARG_SECTRIM2,
845
858
err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG);
848
if (err == -EIO && !mmc_blk_reset(md, card->host, type))
865
if (mmc_can_sanitize(card))
866
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
867
EXT_CSD_SANITIZE_START, 1, 0);
869
if (err && !mmc_blk_reset(md, card->host, type))
851
872
mmc_blk_reset_success(md, type);
852
874
spin_lock_irq(&md->lock);
853
875
__blk_end_request(req, err, blk_rq_bytes(req));
854
876
spin_unlock_irq(&md->lock);