Lines Matching refs:card
138 static inline int mmc_blk_part_switch(struct mmc_card *card,
140 static int get_card_status(struct mmc_card *card, u32 *status, int retries);
201 struct mmc_card *card = md->queue.card; in power_ro_lock_show() local
204 if (card->ext_csd.boot_ro_lock & EXT_CSD_BOOT_WP_B_PERM_WP_EN) in power_ro_lock_show()
206 else if (card->ext_csd.boot_ro_lock & EXT_CSD_BOOT_WP_B_PWR_WP_EN) in power_ro_lock_show()
221 struct mmc_card *card; in power_ro_lock_store() local
231 card = md->queue.card; in power_ro_lock_store()
233 mmc_get_card(card); in power_ro_lock_store()
235 ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP, in power_ro_lock_store()
236 card->ext_csd.boot_ro_lock | in power_ro_lock_store()
238 card->ext_csd.part_time); in power_ro_lock_store()
242 card->ext_csd.boot_ro_lock |= EXT_CSD_BOOT_WP_B_PWR_WP_EN; in power_ro_lock_store()
244 mmc_put_card(card); in power_ro_lock_store()
387 static int ioctl_rpmb_card_status_poll(struct mmc_card *card, u32 *status, in ioctl_rpmb_card_status_poll() argument
397 err = get_card_status(card, status, 5); in ioctl_rpmb_card_status_poll()
419 static int ioctl_do_sanitize(struct mmc_card *card) in ioctl_do_sanitize() argument
423 if (!mmc_can_sanitize(card)) { in ioctl_do_sanitize()
425 mmc_hostname(card->host), __func__); in ioctl_do_sanitize()
431 mmc_hostname(card->host), __func__); in ioctl_do_sanitize()
433 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in ioctl_do_sanitize()
439 mmc_hostname(card->host), __func__, err); in ioctl_do_sanitize()
441 pr_debug("%s: %s - SANITIZE COMPLETED\n", mmc_hostname(card->host), in ioctl_do_sanitize()
452 struct mmc_card *card; in mmc_blk_ioctl_cmd() local
482 card = md->queue.card; in mmc_blk_ioctl_cmd()
483 if (IS_ERR(card)) { in mmc_blk_ioctl_cmd()
484 err = PTR_ERR(card); in mmc_blk_ioctl_cmd()
506 mmc_set_data_timeout(&data, card); in mmc_blk_ioctl_cmd()
530 mmc_get_card(card); in mmc_blk_ioctl_cmd()
532 err = mmc_blk_part_switch(card, md); in mmc_blk_ioctl_cmd()
537 err = mmc_app_cmd(card->host, card); in mmc_blk_ioctl_cmd()
543 err = mmc_set_blockcount(card, data.blocks, in mmc_blk_ioctl_cmd()
551 err = ioctl_do_sanitize(card); in mmc_blk_ioctl_cmd()
560 mmc_wait_for_req(card->host, &mrq); in mmc_blk_ioctl_cmd()
563 dev_err(mmc_dev(card->host), "%s: cmd error %d\n", in mmc_blk_ioctl_cmd()
569 dev_err(mmc_dev(card->host), "%s: data error %d\n", in mmc_blk_ioctl_cmd()
600 err = ioctl_rpmb_card_status_poll(card, &status, 5); in mmc_blk_ioctl_cmd()
602 dev_err(mmc_dev(card->host), in mmc_blk_ioctl_cmd()
608 mmc_put_card(card); in mmc_blk_ioctl_cmd()
646 static inline int mmc_blk_part_switch(struct mmc_card *card, in mmc_blk_part_switch() argument
650 struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev); in mmc_blk_part_switch()
655 if (mmc_card_mmc(card)) { in mmc_blk_part_switch()
656 u8 part_config = card->ext_csd.part_config; in mmc_blk_part_switch()
661 ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_part_switch()
663 card->ext_csd.part_time); in mmc_blk_part_switch()
667 card->ext_csd.part_config = part_config; in mmc_blk_part_switch()
674 static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) in mmc_sd_num_wr_blocks() argument
687 cmd.arg = card->rca << 16; in mmc_sd_num_wr_blocks()
690 err = mmc_wait_for_cmd(card->host, &cmd, 0); in mmc_sd_num_wr_blocks()
693 if (!mmc_host_is_spi(card->host) && !(cmd.resp[0] & R1_APP_CMD)) in mmc_sd_num_wr_blocks()
707 mmc_set_data_timeout(&data, card); in mmc_sd_num_wr_blocks()
718 mmc_wait_for_req(card->host, &mrq); in mmc_sd_num_wr_blocks()
729 static int get_card_status(struct mmc_card *card, u32 *status, int retries) in get_card_status() argument
735 if (!mmc_host_is_spi(card->host)) in get_card_status()
736 cmd.arg = card->rca << 16; in get_card_status()
738 err = mmc_wait_for_cmd(card->host, &cmd, retries); in get_card_status()
744 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, in card_busy_detect() argument
752 err = get_card_status(card, &status, 5); in card_busy_detect()
766 if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) && in card_busy_detect()
776 mmc_hostname(card->host), in card_busy_detect()
792 static int send_stop(struct mmc_card *card, unsigned int timeout_ms, in send_stop() argument
795 struct mmc_host *host = card->host; in send_stop()
834 return card_busy_detect(card, timeout_ms, use_r1b_resp, req, gen_err); in send_stop()
898 static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req, in mmc_blk_cmd_recovery() argument
905 if (mmc_card_removed(card)) in mmc_blk_cmd_recovery()
914 err = get_card_status(card, &status, 0); in mmc_blk_cmd_recovery()
926 if (mmc_detect_card_removed(card->host)) in mmc_blk_cmd_recovery()
938 if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) in mmc_blk_cmd_recovery()
953 err = send_stop(card, in mmc_blk_cmd_recovery()
1013 dev_get_drvdata(&host->card->dev); in mmc_blk_reset()
1017 part_err = mmc_blk_part_switch(host->card, md); in mmc_blk_reset()
1049 struct mmc_card *card = md->queue.card; in mmc_blk_issue_discard_rq() local
1053 if (!mmc_can_erase(card)) { in mmc_blk_issue_discard_rq()
1061 if (mmc_can_discard(card)) in mmc_blk_issue_discard_rq()
1063 else if (mmc_can_trim(card)) in mmc_blk_issue_discard_rq()
1068 if (card->quirks & MMC_QUIRK_INAND_CMD38) { in mmc_blk_issue_discard_rq()
1069 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_issue_discard_rq()
1078 err = mmc_erase(card, from, nr, arg); in mmc_blk_issue_discard_rq()
1080 if (err == -EIO && !mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_discard_rq()
1093 struct mmc_card *card = md->queue.card; in mmc_blk_issue_secdiscard_rq() local
1097 if (!(mmc_can_secure_erase_trim(card))) { in mmc_blk_issue_secdiscard_rq()
1105 if (mmc_can_trim(card) && !mmc_erase_group_aligned(card, from, nr)) in mmc_blk_issue_secdiscard_rq()
1111 if (card->quirks & MMC_QUIRK_INAND_CMD38) { in mmc_blk_issue_secdiscard_rq()
1112 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_issue_secdiscard_rq()
1122 err = mmc_erase(card, from, nr, arg); in mmc_blk_issue_secdiscard_rq()
1129 if (card->quirks & MMC_QUIRK_INAND_CMD38) { in mmc_blk_issue_secdiscard_rq()
1130 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_issue_secdiscard_rq()
1138 err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG); in mmc_blk_issue_secdiscard_rq()
1146 if (err && !mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_secdiscard_rq()
1159 struct mmc_card *card = md->queue.card; in mmc_blk_issue_flush() local
1162 ret = mmc_flush_cache(card); in mmc_blk_issue_flush()
1179 struct mmc_card *card, in mmc_apply_rel_rw() argument
1182 if (!(card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN)) { in mmc_apply_rel_rw()
1184 if (!IS_ALIGNED(brq->cmd.arg, card->ext_csd.rel_sectors)) in mmc_apply_rel_rw()
1187 if (brq->data.blocks > card->ext_csd.rel_sectors) in mmc_apply_rel_rw()
1188 brq->data.blocks = card->ext_csd.rel_sectors; in mmc_apply_rel_rw()
1189 else if (brq->data.blocks < card->ext_csd.rel_sectors) in mmc_apply_rel_rw()
1202 static int mmc_blk_err_check(struct mmc_card *card, in mmc_blk_err_check() argument
1223 switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err, &gen_err)) { in mmc_blk_err_check()
1251 if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) { in mmc_blk_err_check()
1262 err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, false, req, in mmc_blk_err_check()
1307 static int mmc_blk_packed_err_check(struct mmc_card *card, in mmc_blk_packed_err_check() argument
1320 check = mmc_blk_err_check(card, areq); in mmc_blk_packed_err_check()
1321 err = get_card_status(card, &status, 0); in mmc_blk_packed_err_check()
1329 err = mmc_get_ext_csd(card, &ext_csd); in mmc_blk_packed_err_check()
1358 struct mmc_card *card, in mmc_blk_rw_rq_prep() argument
1385 if (!mmc_card_blockaddr(card)) in mmc_blk_rw_rq_prep()
1398 if (brq->data.blocks > card->host->max_blk_count) in mmc_blk_rw_rq_prep()
1399 brq->data.blocks = card->host->max_blk_count; in mmc_blk_rw_rq_prep()
1414 if (card->host->ops->multi_io_quirk) in mmc_blk_rw_rq_prep()
1415 brq->data.blocks = card->host->ops->multi_io_quirk(card, in mmc_blk_rw_rq_prep()
1425 if (!mmc_host_is_spi(card->host) || in mmc_blk_rw_rq_prep()
1450 mmc_apply_rel_rw(brq, card, req); in mmc_blk_rw_rq_prep()
1456 do_data_tag = (card->ext_csd.data_tag_unit_size) && in mmc_blk_rw_rq_prep()
1460 card->ext_csd.data_tag_unit_size); in mmc_blk_rw_rq_prep()
1481 (do_rel_wr || !(card->quirks & MMC_QUIRK_BLK_NO_CMD23) || in mmc_blk_rw_rq_prep()
1491 mmc_set_data_timeout(&brq->data, card); in mmc_blk_rw_rq_prep()
1522 struct mmc_card *card) in mmc_calc_packed_hdr_segs() argument
1524 unsigned int hdr_sz = mmc_large_sector(card) ? 4096 : 512; in mmc_calc_packed_hdr_segs()
1540 struct mmc_card *card = mq->card; in mmc_blk_prep_packed_list() local
1544 bool en_rel_wr = card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN; in mmc_blk_prep_packed_list()
1555 mmc_host_packed_wr(card->host)) in mmc_blk_prep_packed_list()
1556 max_packed_rw = card->ext_csd.max_packed_writes; in mmc_blk_prep_packed_list()
1565 if (mmc_large_sector(card) && in mmc_blk_prep_packed_list()
1571 max_blk_count = min(card->host->max_blk_count, in mmc_blk_prep_packed_list()
1572 card->host->max_req_size >> 9); in mmc_blk_prep_packed_list()
1581 req_sectors += mmc_large_sector(card) ? 8 : 1; in mmc_blk_prep_packed_list()
1582 phys_segments += mmc_calc_packed_hdr_segs(q, card); in mmc_blk_prep_packed_list()
1599 if (mmc_large_sector(card) && in mmc_blk_prep_packed_list()
1646 struct mmc_card *card, in mmc_blk_packed_hdr_wrq_prep() argument
1669 hdr_blocks = mmc_large_sector(card) ? 8 : 1; in mmc_blk_packed_hdr_wrq_prep()
1676 do_data_tag = (card->ext_csd.data_tag_unit_size) && in mmc_blk_packed_hdr_wrq_prep()
1680 card->ext_csd.data_tag_unit_size); in mmc_blk_packed_hdr_wrq_prep()
1688 mmc_card_blockaddr(card) ? in mmc_blk_packed_hdr_wrq_prep()
1706 if (!mmc_card_blockaddr(card)) in mmc_blk_packed_hdr_wrq_prep()
1718 mmc_set_data_timeout(&brq->data, card); in mmc_blk_packed_hdr_wrq_prep()
1729 static int mmc_blk_cmd_err(struct mmc_blk_data *md, struct mmc_card *card, in mmc_blk_cmd_err() argument
1744 if (mmc_card_sd(card)) { in mmc_blk_cmd_err()
1747 blocks = mmc_sd_num_wr_blocks(card); in mmc_blk_cmd_err()
1833 struct mmc_card *card = md->queue.card; in mmc_blk_issue_rw_rq() local
1856 (card->ext_csd.data_sector_size == 4096)) { in mmc_blk_issue_rw_rq()
1865 card, mq); in mmc_blk_issue_rw_rq()
1867 mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq); in mmc_blk_issue_rw_rq()
1871 areq = mmc_start_req(card->host, areq, (int *) &status); in mmc_blk_issue_rw_rq()
1914 ret = mmc_blk_cmd_err(md, card, brq, req, ret); in mmc_blk_issue_rw_rq()
1915 if (mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_rw_rq()
1925 if (!mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_rw_rq()
1931 err = mmc_blk_reset(md, card->host, type); in mmc_blk_issue_rw_rq()
1969 mmc_blk_packed_hdr_wrq_prep(mq_rq, card, mq); in mmc_blk_issue_rw_rq()
1970 mmc_start_req(card->host, in mmc_blk_issue_rw_rq()
1978 mmc_blk_rw_rq_prep(mq_rq, card, in mmc_blk_issue_rw_rq()
1980 mmc_start_req(card->host, in mmc_blk_issue_rw_rq()
1992 if (mmc_card_removed(card)) in mmc_blk_issue_rw_rq()
2001 if (mmc_card_removed(card)) { in mmc_blk_issue_rw_rq()
2011 mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq); in mmc_blk_issue_rw_rq()
2012 mmc_start_req(card->host, in mmc_blk_issue_rw_rq()
2024 struct mmc_card *card = md->queue.card; in mmc_blk_issue_rq() local
2025 struct mmc_host *host = card->host; in mmc_blk_issue_rq()
2031 mmc_get_card(card); in mmc_blk_issue_rq()
2033 ret = mmc_blk_part_switch(card, md); in mmc_blk_issue_rq()
2045 if (card->host->areq) in mmc_blk_issue_rq()
2053 if (card->host->areq) in mmc_blk_issue_rq()
2074 mmc_put_card(card); in mmc_blk_issue_rq()
2078 static inline int mmc_blk_readonly(struct mmc_card *card) in mmc_blk_readonly() argument
2080 return mmc_card_readonly(card) || in mmc_blk_readonly()
2081 !(card->csd.cmdclass & CCC_BLOCK_WRITE); in mmc_blk_readonly()
2084 static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, in mmc_blk_alloc_req() argument
2124 md->read_only = mmc_blk_readonly(card); in mmc_blk_alloc_req()
2136 ret = mmc_init_queue(&md->queue, card, &md->lock, subname); in mmc_blk_alloc_req()
2168 if (mmc_card_mmc(card)) in mmc_blk_alloc_req()
2170 card->ext_csd.data_sector_size); in mmc_blk_alloc_req()
2176 if (mmc_host_cmd23(card->host)) { in mmc_blk_alloc_req()
2177 if (mmc_card_mmc(card) || in mmc_blk_alloc_req()
2178 (mmc_card_sd(card) && in mmc_blk_alloc_req()
2179 card->scr.cmds & SD_SCR_CMD23_SUPPORT)) in mmc_blk_alloc_req()
2183 if (mmc_card_mmc(card) && in mmc_blk_alloc_req()
2185 ((card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN) || in mmc_blk_alloc_req()
2186 card->ext_csd.rel_sectors)) { in mmc_blk_alloc_req()
2191 if (mmc_card_mmc(card) && in mmc_blk_alloc_req()
2194 card->ext_csd.packed_event_en) { in mmc_blk_alloc_req()
2195 if (!mmc_packed_init(&md->queue, card)) in mmc_blk_alloc_req()
2209 static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) in mmc_blk_alloc() argument
2213 if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) { in mmc_blk_alloc()
2218 size = card->ext_csd.sectors; in mmc_blk_alloc()
2224 size = card->csd.capacity << (card->csd.read_blkbits - 9); in mmc_blk_alloc()
2227 return mmc_blk_alloc_req(card, &card->dev, size, false, NULL, in mmc_blk_alloc()
2231 static int mmc_blk_alloc_part(struct mmc_card *card, in mmc_blk_alloc_part() argument
2242 part_md = mmc_blk_alloc_req(card, disk_to_dev(md->disk), size, default_ro, in mmc_blk_alloc_part()
2252 part_md->disk->disk_name, mmc_card_id(card), in mmc_blk_alloc_part()
2253 mmc_card_name(card), part_md->part_type, cap_str); in mmc_blk_alloc_part()
2263 static int mmc_blk_alloc_parts(struct mmc_card *card, struct mmc_blk_data *md) in mmc_blk_alloc_parts() argument
2267 if (!mmc_card_mmc(card)) in mmc_blk_alloc_parts()
2270 for (idx = 0; idx < card->nr_parts; idx++) { in mmc_blk_alloc_parts()
2271 if (card->part[idx].size) { in mmc_blk_alloc_parts()
2272 ret = mmc_blk_alloc_part(card, md, in mmc_blk_alloc_parts()
2273 card->part[idx].part_cfg, in mmc_blk_alloc_parts()
2274 card->part[idx].size >> 9, in mmc_blk_alloc_parts()
2275 card->part[idx].force_ro, in mmc_blk_alloc_parts()
2276 card->part[idx].name, in mmc_blk_alloc_parts()
2277 card->part[idx].area_type); in mmc_blk_alloc_parts()
2288 struct mmc_card *card; in mmc_blk_remove_req() local
2296 card = md->queue.card; in mmc_blk_remove_req()
2303 card->ext_csd.boot_ro_lockable) in mmc_blk_remove_req()
2313 static void mmc_blk_remove_parts(struct mmc_card *card, in mmc_blk_remove_parts() argument
2330 struct mmc_card *card = md->queue.card; in mmc_add_disk() local
2343 card->ext_csd.boot_ro_lockable) { in mmc_add_disk()
2346 if (card->ext_csd.boot_ro_lock & EXT_CSD_BOOT_WP_B_PWR_WP_DIS) in mmc_add_disk()
2438 static int mmc_blk_probe(struct mmc_card *card) in mmc_blk_probe() argument
2446 if (!(card->csd.cmdclass & CCC_BLOCK_READ)) in mmc_blk_probe()
2449 mmc_fixup_device(card, blk_fixups); in mmc_blk_probe()
2451 md = mmc_blk_alloc(card); in mmc_blk_probe()
2458 md->disk->disk_name, mmc_card_id(card), mmc_card_name(card), in mmc_blk_probe()
2461 if (mmc_blk_alloc_parts(card, md)) in mmc_blk_probe()
2464 dev_set_drvdata(&card->dev, md); in mmc_blk_probe()
2474 pm_runtime_set_autosuspend_delay(&card->dev, 3000); in mmc_blk_probe()
2475 pm_runtime_use_autosuspend(&card->dev); in mmc_blk_probe()
2481 if (card->type != MMC_TYPE_SD_COMBO) { in mmc_blk_probe()
2482 pm_runtime_set_active(&card->dev); in mmc_blk_probe()
2483 pm_runtime_enable(&card->dev); in mmc_blk_probe()
2489 mmc_blk_remove_parts(card, md); in mmc_blk_probe()
2494 static void mmc_blk_remove(struct mmc_card *card) in mmc_blk_remove() argument
2496 struct mmc_blk_data *md = dev_get_drvdata(&card->dev); in mmc_blk_remove()
2498 mmc_blk_remove_parts(card, md); in mmc_blk_remove()
2499 pm_runtime_get_sync(&card->dev); in mmc_blk_remove()
2500 mmc_claim_host(card->host); in mmc_blk_remove()
2501 mmc_blk_part_switch(card, md); in mmc_blk_remove()
2502 mmc_release_host(card->host); in mmc_blk_remove()
2503 if (card->type != MMC_TYPE_SD_COMBO) in mmc_blk_remove()
2504 pm_runtime_disable(&card->dev); in mmc_blk_remove()
2505 pm_runtime_put_noidle(&card->dev); in mmc_blk_remove()
2507 dev_set_drvdata(&card->dev, NULL); in mmc_blk_remove()
2510 static int _mmc_blk_suspend(struct mmc_card *card) in _mmc_blk_suspend() argument
2513 struct mmc_blk_data *md = dev_get_drvdata(&card->dev); in _mmc_blk_suspend()
2524 static void mmc_blk_shutdown(struct mmc_card *card) in mmc_blk_shutdown() argument
2526 _mmc_blk_suspend(card); in mmc_blk_shutdown()
2532 struct mmc_card *card = mmc_dev_to_card(dev); in mmc_blk_suspend() local
2534 return _mmc_blk_suspend(card); in mmc_blk_suspend()