Lines Matching refs:card

140 static inline int mmc_blk_part_switch(struct mmc_card *card,
142 static int get_card_status(struct mmc_card *card, u32 *status, int retries);
203 struct mmc_card *card = md->queue.card; in power_ro_lock_show() local
206 if (card->ext_csd.boot_ro_lock & EXT_CSD_BOOT_WP_B_PERM_WP_EN) in power_ro_lock_show()
208 else if (card->ext_csd.boot_ro_lock & EXT_CSD_BOOT_WP_B_PWR_WP_EN) in power_ro_lock_show()
223 struct mmc_card *card; in power_ro_lock_store() local
233 card = md->queue.card; in power_ro_lock_store()
235 mmc_get_card(card); in power_ro_lock_store()
237 ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP, in power_ro_lock_store()
238 card->ext_csd.boot_ro_lock | in power_ro_lock_store()
240 card->ext_csd.part_time); in power_ro_lock_store()
244 card->ext_csd.boot_ro_lock |= EXT_CSD_BOOT_WP_B_PWR_WP_EN; in power_ro_lock_store()
246 mmc_put_card(card); in power_ro_lock_store()
407 static int ioctl_rpmb_card_status_poll(struct mmc_card *card, u32 *status, in ioctl_rpmb_card_status_poll() argument
417 err = get_card_status(card, status, 5); in ioctl_rpmb_card_status_poll()
439 static int ioctl_do_sanitize(struct mmc_card *card) in ioctl_do_sanitize() argument
443 if (!mmc_can_sanitize(card)) { in ioctl_do_sanitize()
445 mmc_hostname(card->host), __func__); in ioctl_do_sanitize()
451 mmc_hostname(card->host), __func__); in ioctl_do_sanitize()
453 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in ioctl_do_sanitize()
459 mmc_hostname(card->host), __func__, err); in ioctl_do_sanitize()
461 pr_debug("%s: %s - SANITIZE COMPLETED\n", mmc_hostname(card->host), in ioctl_do_sanitize()
467 static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md, in __mmc_blk_ioctl_cmd() argument
478 if (!card || !md || !idata) in __mmc_blk_ioctl_cmd()
502 mmc_set_data_timeout(&data, card); in __mmc_blk_ioctl_cmd()
526 err = mmc_blk_part_switch(card, md); in __mmc_blk_ioctl_cmd()
531 err = mmc_app_cmd(card->host, card); in __mmc_blk_ioctl_cmd()
537 err = mmc_set_blockcount(card, data.blocks, in __mmc_blk_ioctl_cmd()
545 err = ioctl_do_sanitize(card); in __mmc_blk_ioctl_cmd()
554 mmc_wait_for_req(card->host, &mrq); in __mmc_blk_ioctl_cmd()
557 dev_err(mmc_dev(card->host), "%s: cmd error %d\n", in __mmc_blk_ioctl_cmd()
562 dev_err(mmc_dev(card->host), "%s: data error %d\n", in __mmc_blk_ioctl_cmd()
581 err = ioctl_rpmb_card_status_poll(card, &status, 5); in __mmc_blk_ioctl_cmd()
583 dev_err(mmc_dev(card->host), in __mmc_blk_ioctl_cmd()
596 struct mmc_card *card; in mmc_blk_ioctl_cmd() local
617 card = md->queue.card; in mmc_blk_ioctl_cmd()
618 if (IS_ERR(card)) { in mmc_blk_ioctl_cmd()
619 err = PTR_ERR(card); in mmc_blk_ioctl_cmd()
623 mmc_get_card(card); in mmc_blk_ioctl_cmd()
625 ioc_err = __mmc_blk_ioctl_cmd(card, md, idata); in mmc_blk_ioctl_cmd()
627 mmc_put_card(card); in mmc_blk_ioctl_cmd()
644 struct mmc_card *card; in mmc_blk_ioctl_multi_cmd() local
681 card = md->queue.card; in mmc_blk_ioctl_multi_cmd()
682 if (IS_ERR(card)) { in mmc_blk_ioctl_multi_cmd()
683 err = PTR_ERR(card); in mmc_blk_ioctl_multi_cmd()
687 mmc_get_card(card); in mmc_blk_ioctl_multi_cmd()
690 ioc_err = __mmc_blk_ioctl_cmd(card, md, idata[i]); in mmc_blk_ioctl_multi_cmd()
692 mmc_put_card(card); in mmc_blk_ioctl_multi_cmd()
743 static inline int mmc_blk_part_switch(struct mmc_card *card, in mmc_blk_part_switch() argument
747 struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev); in mmc_blk_part_switch()
752 if (mmc_card_mmc(card)) { in mmc_blk_part_switch()
753 u8 part_config = card->ext_csd.part_config; in mmc_blk_part_switch()
758 ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_part_switch()
760 card->ext_csd.part_time); in mmc_blk_part_switch()
764 card->ext_csd.part_config = part_config; in mmc_blk_part_switch()
771 static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) in mmc_sd_num_wr_blocks() argument
784 cmd.arg = card->rca << 16; in mmc_sd_num_wr_blocks()
787 err = mmc_wait_for_cmd(card->host, &cmd, 0); in mmc_sd_num_wr_blocks()
790 if (!mmc_host_is_spi(card->host) && !(cmd.resp[0] & R1_APP_CMD)) in mmc_sd_num_wr_blocks()
804 mmc_set_data_timeout(&data, card); in mmc_sd_num_wr_blocks()
815 mmc_wait_for_req(card->host, &mrq); in mmc_sd_num_wr_blocks()
826 static int get_card_status(struct mmc_card *card, u32 *status, int retries) in get_card_status() argument
832 if (!mmc_host_is_spi(card->host)) in get_card_status()
833 cmd.arg = card->rca << 16; in get_card_status()
835 err = mmc_wait_for_cmd(card->host, &cmd, retries); in get_card_status()
841 static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, in card_busy_detect() argument
849 err = get_card_status(card, &status, 5); in card_busy_detect()
863 if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) && in card_busy_detect()
873 mmc_hostname(card->host), in card_busy_detect()
889 static int send_stop(struct mmc_card *card, unsigned int timeout_ms, in send_stop() argument
892 struct mmc_host *host = card->host; in send_stop()
931 return card_busy_detect(card, timeout_ms, use_r1b_resp, req, gen_err); in send_stop()
995 static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req, in mmc_blk_cmd_recovery() argument
1002 if (mmc_card_removed(card)) in mmc_blk_cmd_recovery()
1011 err = get_card_status(card, &status, 0); in mmc_blk_cmd_recovery()
1016 mmc_retune_recheck(card->host); in mmc_blk_cmd_recovery()
1026 if (mmc_detect_card_removed(card->host)) in mmc_blk_cmd_recovery()
1038 if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) in mmc_blk_cmd_recovery()
1053 err = send_stop(card, in mmc_blk_cmd_recovery()
1113 dev_get_drvdata(&host->card->dev); in mmc_blk_reset()
1117 part_err = mmc_blk_part_switch(host->card, md); in mmc_blk_reset()
1149 struct mmc_card *card = md->queue.card; in mmc_blk_issue_discard_rq() local
1153 if (!mmc_can_erase(card)) { in mmc_blk_issue_discard_rq()
1161 if (mmc_can_discard(card)) in mmc_blk_issue_discard_rq()
1163 else if (mmc_can_trim(card)) in mmc_blk_issue_discard_rq()
1168 if (card->quirks & MMC_QUIRK_INAND_CMD38) { in mmc_blk_issue_discard_rq()
1169 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_issue_discard_rq()
1178 err = mmc_erase(card, from, nr, arg); in mmc_blk_issue_discard_rq()
1180 if (err == -EIO && !mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_discard_rq()
1193 struct mmc_card *card = md->queue.card; in mmc_blk_issue_secdiscard_rq() local
1197 if (!(mmc_can_secure_erase_trim(card))) { in mmc_blk_issue_secdiscard_rq()
1205 if (mmc_can_trim(card) && !mmc_erase_group_aligned(card, from, nr)) in mmc_blk_issue_secdiscard_rq()
1211 if (card->quirks & MMC_QUIRK_INAND_CMD38) { in mmc_blk_issue_secdiscard_rq()
1212 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_issue_secdiscard_rq()
1222 err = mmc_erase(card, from, nr, arg); in mmc_blk_issue_secdiscard_rq()
1229 if (card->quirks & MMC_QUIRK_INAND_CMD38) { in mmc_blk_issue_secdiscard_rq()
1230 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, in mmc_blk_issue_secdiscard_rq()
1238 err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG); in mmc_blk_issue_secdiscard_rq()
1246 if (err && !mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_secdiscard_rq()
1259 struct mmc_card *card = md->queue.card; in mmc_blk_issue_flush() local
1262 ret = mmc_flush_cache(card); in mmc_blk_issue_flush()
1279 struct mmc_card *card, in mmc_apply_rel_rw() argument
1282 if (!(card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN)) { in mmc_apply_rel_rw()
1284 if (!IS_ALIGNED(brq->cmd.arg, card->ext_csd.rel_sectors)) in mmc_apply_rel_rw()
1287 if (brq->data.blocks > card->ext_csd.rel_sectors) in mmc_apply_rel_rw()
1288 brq->data.blocks = card->ext_csd.rel_sectors; in mmc_apply_rel_rw()
1289 else if (brq->data.blocks < card->ext_csd.rel_sectors) in mmc_apply_rel_rw()
1302 static int mmc_blk_err_check(struct mmc_card *card, in mmc_blk_err_check() argument
1309 int need_retune = card->host->need_retune; in mmc_blk_err_check()
1324 switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err, &gen_err)) { in mmc_blk_err_check()
1352 if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) { in mmc_blk_err_check()
1363 err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, false, req, in mmc_blk_err_check()
1414 static int mmc_blk_packed_err_check(struct mmc_card *card, in mmc_blk_packed_err_check() argument
1427 check = mmc_blk_err_check(card, areq); in mmc_blk_packed_err_check()
1428 err = get_card_status(card, &status, 0); in mmc_blk_packed_err_check()
1436 err = mmc_get_ext_csd(card, &ext_csd); in mmc_blk_packed_err_check()
1465 struct mmc_card *card, in mmc_blk_rw_rq_prep() argument
1488 if (!mmc_card_blockaddr(card)) in mmc_blk_rw_rq_prep()
1501 if (brq->data.blocks > card->host->max_blk_count) in mmc_blk_rw_rq_prep()
1502 brq->data.blocks = card->host->max_blk_count; in mmc_blk_rw_rq_prep()
1517 if (card->host->ops->multi_io_quirk) in mmc_blk_rw_rq_prep()
1518 brq->data.blocks = card->host->ops->multi_io_quirk(card, in mmc_blk_rw_rq_prep()
1528 if (!mmc_host_is_spi(card->host) || in mmc_blk_rw_rq_prep()
1553 mmc_apply_rel_rw(brq, card, req); in mmc_blk_rw_rq_prep()
1559 do_data_tag = (card->ext_csd.data_tag_unit_size) && in mmc_blk_rw_rq_prep()
1563 card->ext_csd.data_tag_unit_size); in mmc_blk_rw_rq_prep()
1584 (do_rel_wr || !(card->quirks & MMC_QUIRK_BLK_NO_CMD23) || in mmc_blk_rw_rq_prep()
1594 mmc_set_data_timeout(&brq->data, card); in mmc_blk_rw_rq_prep()
1625 struct mmc_card *card) in mmc_calc_packed_hdr_segs() argument
1627 unsigned int hdr_sz = mmc_large_sector(card) ? 4096 : 512; in mmc_calc_packed_hdr_segs()
1643 struct mmc_card *card = mq->card; in mmc_blk_prep_packed_list() local
1647 bool en_rel_wr = card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN; in mmc_blk_prep_packed_list()
1658 mmc_host_packed_wr(card->host)) in mmc_blk_prep_packed_list()
1659 max_packed_rw = card->ext_csd.max_packed_writes; in mmc_blk_prep_packed_list()
1668 if (mmc_large_sector(card) && in mmc_blk_prep_packed_list()
1674 max_blk_count = min(card->host->max_blk_count, in mmc_blk_prep_packed_list()
1675 card->host->max_req_size >> 9); in mmc_blk_prep_packed_list()
1684 req_sectors += mmc_large_sector(card) ? 8 : 1; in mmc_blk_prep_packed_list()
1685 phys_segments += mmc_calc_packed_hdr_segs(q, card); in mmc_blk_prep_packed_list()
1702 if (mmc_large_sector(card) && in mmc_blk_prep_packed_list()
1749 struct mmc_card *card, in mmc_blk_packed_hdr_wrq_prep() argument
1772 hdr_blocks = mmc_large_sector(card) ? 8 : 1; in mmc_blk_packed_hdr_wrq_prep()
1779 do_data_tag = (card->ext_csd.data_tag_unit_size) && in mmc_blk_packed_hdr_wrq_prep()
1783 card->ext_csd.data_tag_unit_size); in mmc_blk_packed_hdr_wrq_prep()
1791 mmc_card_blockaddr(card) ? in mmc_blk_packed_hdr_wrq_prep()
1809 if (!mmc_card_blockaddr(card)) in mmc_blk_packed_hdr_wrq_prep()
1821 mmc_set_data_timeout(&brq->data, card); in mmc_blk_packed_hdr_wrq_prep()
1832 static int mmc_blk_cmd_err(struct mmc_blk_data *md, struct mmc_card *card, in mmc_blk_cmd_err() argument
1847 if (mmc_card_sd(card)) { in mmc_blk_cmd_err()
1850 blocks = mmc_sd_num_wr_blocks(card); in mmc_blk_cmd_err()
1936 struct mmc_card *card = md->queue.card; in mmc_blk_issue_rw_rq() local
1959 (card->ext_csd.data_sector_size == 4096)) { in mmc_blk_issue_rw_rq()
1968 card, mq); in mmc_blk_issue_rw_rq()
1970 mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq); in mmc_blk_issue_rw_rq()
1974 areq = mmc_start_req(card->host, areq, (int *) &status); in mmc_blk_issue_rw_rq()
2017 ret = mmc_blk_cmd_err(md, card, brq, req, ret); in mmc_blk_issue_rw_rq()
2018 if (mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_rw_rq()
2029 if (!mmc_blk_reset(md, card->host, type)) in mmc_blk_issue_rw_rq()
2035 err = mmc_blk_reset(md, card->host, type); in mmc_blk_issue_rw_rq()
2073 mmc_blk_packed_hdr_wrq_prep(mq_rq, card, mq); in mmc_blk_issue_rw_rq()
2074 mmc_start_req(card->host, in mmc_blk_issue_rw_rq()
2082 mmc_blk_rw_rq_prep(mq_rq, card, in mmc_blk_issue_rw_rq()
2084 mmc_start_req(card->host, in mmc_blk_issue_rw_rq()
2097 if (mmc_card_removed(card)) in mmc_blk_issue_rw_rq()
2106 if (mmc_card_removed(card)) { in mmc_blk_issue_rw_rq()
2116 mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq); in mmc_blk_issue_rw_rq()
2117 mmc_start_req(card->host, in mmc_blk_issue_rw_rq()
2129 struct mmc_card *card = md->queue.card; in mmc_blk_issue_rq() local
2130 struct mmc_host *host = card->host; in mmc_blk_issue_rq()
2136 mmc_get_card(card); in mmc_blk_issue_rq()
2138 ret = mmc_blk_part_switch(card, md); in mmc_blk_issue_rq()
2150 if (card->host->areq) in mmc_blk_issue_rq()
2158 if (card->host->areq) in mmc_blk_issue_rq()
2179 mmc_put_card(card); in mmc_blk_issue_rq()
2183 static inline int mmc_blk_readonly(struct mmc_card *card) in mmc_blk_readonly() argument
2185 return mmc_card_readonly(card) || in mmc_blk_readonly()
2186 !(card->csd.cmdclass & CCC_BLOCK_WRITE); in mmc_blk_readonly()
2189 static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, in mmc_blk_alloc_req() argument
2229 md->read_only = mmc_blk_readonly(card); in mmc_blk_alloc_req()
2241 ret = mmc_init_queue(&md->queue, card, &md->lock, subname); in mmc_blk_alloc_req()
2273 if (mmc_card_mmc(card)) in mmc_blk_alloc_req()
2275 card->ext_csd.data_sector_size); in mmc_blk_alloc_req()
2281 if (mmc_host_cmd23(card->host)) { in mmc_blk_alloc_req()
2282 if (mmc_card_mmc(card) || in mmc_blk_alloc_req()
2283 (mmc_card_sd(card) && in mmc_blk_alloc_req()
2284 card->scr.cmds & SD_SCR_CMD23_SUPPORT)) in mmc_blk_alloc_req()
2288 if (mmc_card_mmc(card) && in mmc_blk_alloc_req()
2290 ((card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN) || in mmc_blk_alloc_req()
2291 card->ext_csd.rel_sectors)) { in mmc_blk_alloc_req()
2296 if (mmc_card_mmc(card) && in mmc_blk_alloc_req()
2299 card->ext_csd.packed_event_en) { in mmc_blk_alloc_req()
2300 if (!mmc_packed_init(&md->queue, card)) in mmc_blk_alloc_req()
2314 static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) in mmc_blk_alloc() argument
2318 if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) { in mmc_blk_alloc()
2323 size = card->ext_csd.sectors; in mmc_blk_alloc()
2329 size = (typeof(sector_t))card->csd.capacity in mmc_blk_alloc()
2330 << (card->csd.read_blkbits - 9); in mmc_blk_alloc()
2333 return mmc_blk_alloc_req(card, &card->dev, size, false, NULL, in mmc_blk_alloc()
2337 static int mmc_blk_alloc_part(struct mmc_card *card, in mmc_blk_alloc_part() argument
2348 part_md = mmc_blk_alloc_req(card, disk_to_dev(md->disk), size, default_ro, in mmc_blk_alloc_part()
2358 part_md->disk->disk_name, mmc_card_id(card), in mmc_blk_alloc_part()
2359 mmc_card_name(card), part_md->part_type, cap_str); in mmc_blk_alloc_part()
2369 static int mmc_blk_alloc_parts(struct mmc_card *card, struct mmc_blk_data *md) in mmc_blk_alloc_parts() argument
2373 if (!mmc_card_mmc(card)) in mmc_blk_alloc_parts()
2376 for (idx = 0; idx < card->nr_parts; idx++) { in mmc_blk_alloc_parts()
2377 if (card->part[idx].size) { in mmc_blk_alloc_parts()
2378 ret = mmc_blk_alloc_part(card, md, in mmc_blk_alloc_parts()
2379 card->part[idx].part_cfg, in mmc_blk_alloc_parts()
2380 card->part[idx].size >> 9, in mmc_blk_alloc_parts()
2381 card->part[idx].force_ro, in mmc_blk_alloc_parts()
2382 card->part[idx].name, in mmc_blk_alloc_parts()
2383 card->part[idx].area_type); in mmc_blk_alloc_parts()
2394 struct mmc_card *card; in mmc_blk_remove_req() local
2402 card = md->queue.card; in mmc_blk_remove_req()
2409 card->ext_csd.boot_ro_lockable) in mmc_blk_remove_req()
2419 static void mmc_blk_remove_parts(struct mmc_card *card, in mmc_blk_remove_parts() argument
2436 struct mmc_card *card = md->queue.card; in mmc_add_disk() local
2449 card->ext_csd.boot_ro_lockable) { in mmc_add_disk()
2452 if (card->ext_csd.boot_ro_lock & EXT_CSD_BOOT_WP_B_PWR_WP_DIS) in mmc_add_disk()
2558 static int mmc_blk_probe(struct mmc_card *card) in mmc_blk_probe() argument
2566 if (!(card->csd.cmdclass & CCC_BLOCK_READ)) in mmc_blk_probe()
2569 mmc_fixup_device(card, blk_fixups); in mmc_blk_probe()
2571 md = mmc_blk_alloc(card); in mmc_blk_probe()
2578 md->disk->disk_name, mmc_card_id(card), mmc_card_name(card), in mmc_blk_probe()
2581 if (mmc_blk_alloc_parts(card, md)) in mmc_blk_probe()
2584 dev_set_drvdata(&card->dev, md); in mmc_blk_probe()
2594 pm_runtime_set_autosuspend_delay(&card->dev, 3000); in mmc_blk_probe()
2595 pm_runtime_use_autosuspend(&card->dev); in mmc_blk_probe()
2601 if (card->type != MMC_TYPE_SD_COMBO) { in mmc_blk_probe()
2602 pm_runtime_set_active(&card->dev); in mmc_blk_probe()
2603 pm_runtime_enable(&card->dev); in mmc_blk_probe()
2609 mmc_blk_remove_parts(card, md); in mmc_blk_probe()
2614 static void mmc_blk_remove(struct mmc_card *card) in mmc_blk_remove() argument
2616 struct mmc_blk_data *md = dev_get_drvdata(&card->dev); in mmc_blk_remove()
2618 mmc_blk_remove_parts(card, md); in mmc_blk_remove()
2619 pm_runtime_get_sync(&card->dev); in mmc_blk_remove()
2620 mmc_claim_host(card->host); in mmc_blk_remove()
2621 mmc_blk_part_switch(card, md); in mmc_blk_remove()
2622 mmc_release_host(card->host); in mmc_blk_remove()
2623 if (card->type != MMC_TYPE_SD_COMBO) in mmc_blk_remove()
2624 pm_runtime_disable(&card->dev); in mmc_blk_remove()
2625 pm_runtime_put_noidle(&card->dev); in mmc_blk_remove()
2627 dev_set_drvdata(&card->dev, NULL); in mmc_blk_remove()
2630 static int _mmc_blk_suspend(struct mmc_card *card) in _mmc_blk_suspend() argument
2633 struct mmc_blk_data *md = dev_get_drvdata(&card->dev); in _mmc_blk_suspend()
2644 static void mmc_blk_shutdown(struct mmc_card *card) in mmc_blk_shutdown() argument
2646 _mmc_blk_suspend(card); in mmc_blk_shutdown()
2652 struct mmc_card *card = mmc_dev_to_card(dev); in mmc_blk_suspend() local
2654 return _mmc_blk_suspend(card); in mmc_blk_suspend()