| .. | .. |
|---|
| 47 | 47 | |
|---|
| 48 | 48 | #include <linux/uaccess.h> |
|---|
| 49 | 49 | |
|---|
| 50 | +#include <trace/hooks/mmc_core.h> |
|---|
| 51 | + |
|---|
| 50 | 52 | #include "queue.h" |
|---|
| 51 | 53 | #include "block.h" |
|---|
| 52 | 54 | #include "core.h" |
|---|
| .. | .. |
|---|
| 71 | 73 | * ample. |
|---|
| 72 | 74 | */ |
|---|
| 73 | 75 | #define MMC_BLK_TIMEOUT_MS (10 * 1000) |
|---|
| 74 | | -#define MMC_SANITIZE_REQ_TIMEOUT 240000 |
|---|
| 75 | 76 | #define MMC_EXTRACT_INDEX_FROM_ARG(x) ((x & 0x00FF0000) >> 16) |
|---|
| 76 | 77 | #define MMC_EXTRACT_VALUE_FROM_ARG(x) ((x & 0x0000FF00) >> 8) |
|---|
| 77 | 78 | |
|---|
| .. | .. |
|---|
| 101 | 102 | * There is one mmc_blk_data per slot. |
|---|
| 102 | 103 | */ |
|---|
| 103 | 104 | struct mmc_blk_data { |
|---|
| 104 | | - spinlock_t lock; |
|---|
| 105 | 105 | struct device *parent; |
|---|
| 106 | 106 | struct gendisk *disk; |
|---|
| 107 | 107 | struct mmc_queue queue; |
|---|
| .. | .. |
|---|
| 172 | 172 | unsigned int part_type); |
|---|
| 173 | 173 | static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, |
|---|
| 174 | 174 | struct mmc_card *card, |
|---|
| 175 | | - int disable_multi, |
|---|
| 175 | + int recovery_mode, |
|---|
| 176 | 176 | struct mmc_queue *mq); |
|---|
| 177 | 177 | static void mmc_blk_hsq_req_done(struct mmc_request *mrq); |
|---|
| 178 | 178 | |
|---|
| .. | .. |
|---|
| 315 | 315 | |
|---|
| 316 | 316 | mutex_lock(&block_mutex); |
|---|
| 317 | 317 | if (md) { |
|---|
| 318 | | - if (md->usage == 2) |
|---|
| 319 | | - check_disk_change(bdev); |
|---|
| 320 | 318 | ret = 0; |
|---|
| 321 | | - |
|---|
| 322 | 319 | if ((mode & FMODE_WRITE) && md->read_only) { |
|---|
| 323 | 320 | mmc_blk_put(md); |
|---|
| 324 | 321 | ret = -EROFS; |
|---|
| .. | .. |
|---|
| 415 | 412 | return 0; |
|---|
| 416 | 413 | } |
|---|
| 417 | 414 | |
|---|
| 418 | | -static int ioctl_do_sanitize(struct mmc_card *card) |
|---|
| 419 | | -{ |
|---|
| 420 | | - int err; |
|---|
| 421 | | - |
|---|
| 422 | | - if (!mmc_can_sanitize(card)) { |
|---|
| 423 | | - pr_warn("%s: %s - SANITIZE is not supported\n", |
|---|
| 424 | | - mmc_hostname(card->host), __func__); |
|---|
| 425 | | - err = -EOPNOTSUPP; |
|---|
| 426 | | - goto out; |
|---|
| 427 | | - } |
|---|
| 428 | | - |
|---|
| 429 | | - pr_debug("%s: %s - SANITIZE IN PROGRESS...\n", |
|---|
| 430 | | - mmc_hostname(card->host), __func__); |
|---|
| 431 | | - |
|---|
| 432 | | - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
|---|
| 433 | | - EXT_CSD_SANITIZE_START, 1, |
|---|
| 434 | | - MMC_SANITIZE_REQ_TIMEOUT); |
|---|
| 435 | | - |
|---|
| 436 | | - if (err) |
|---|
| 437 | | - pr_err("%s: %s - EXT_CSD_SANITIZE_START failed. err=%d\n", |
|---|
| 438 | | - mmc_hostname(card->host), __func__, err); |
|---|
| 439 | | - |
|---|
| 440 | | - pr_debug("%s: %s - SANITIZE COMPLETED\n", mmc_hostname(card->host), |
|---|
| 441 | | - __func__); |
|---|
| 442 | | -out: |
|---|
| 443 | | - return err; |
|---|
| 444 | | -} |
|---|
| 445 | | - |
|---|
| 446 | | -static inline bool mmc_blk_in_tran_state(u32 status) |
|---|
| 447 | | -{ |
|---|
| 448 | | - /* |
|---|
| 449 | | - * Some cards mishandle the status bits, so make sure to check both the |
|---|
| 450 | | - * busy indication and the card state. |
|---|
| 451 | | - */ |
|---|
| 452 | | - return status & R1_READY_FOR_DATA && |
|---|
| 453 | | - (R1_CURRENT_STATE(status) == R1_STATE_TRAN); |
|---|
| 454 | | -} |
|---|
| 455 | | - |
|---|
| 456 | 415 | static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, |
|---|
| 457 | 416 | u32 *resp_errs) |
|---|
| 458 | 417 | { |
|---|
| .. | .. |
|---|
| 463 | 422 | do { |
|---|
| 464 | 423 | bool done = time_after(jiffies, timeout); |
|---|
| 465 | 424 | |
|---|
| 466 | | - if (card->host->ops->card_busy) { |
|---|
| 425 | + if (!(card->host->caps2 & MMC_CAP2_NO_SD) && card->host->ops->card_busy) { |
|---|
| 467 | 426 | status = card->host->ops->card_busy(card->host) ? |
|---|
| 468 | 427 | 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9; |
|---|
| 469 | | - usleep_range(100, 150); |
|---|
| 428 | + |
|---|
| 429 | + if (!status) |
|---|
| 430 | + usleep_range(100, 150); |
|---|
| 470 | 431 | } else { |
|---|
| 471 | 432 | err = __mmc_send_status(card, &status, 5); |
|---|
| 472 | 433 | if (err) { |
|---|
| .. | .. |
|---|
| 490 | 451 | __func__, status); |
|---|
| 491 | 452 | return -ETIMEDOUT; |
|---|
| 492 | 453 | } |
|---|
| 493 | | - |
|---|
| 494 | | - /* |
|---|
| 495 | | - * Some cards mishandle the status bits, |
|---|
| 496 | | - * so make sure to check both the busy |
|---|
| 497 | | - * indication and the card state. |
|---|
| 498 | | - */ |
|---|
| 499 | | - } while (!mmc_blk_in_tran_state(status)); |
|---|
| 454 | + } while (!mmc_ready_for_data(status)); |
|---|
| 500 | 455 | |
|---|
| 501 | 456 | return err; |
|---|
| 502 | 457 | } |
|---|
| .. | .. |
|---|
| 593 | 548 | } |
|---|
| 594 | 549 | |
|---|
| 595 | 550 | if ((MMC_EXTRACT_INDEX_FROM_ARG(cmd.arg) == EXT_CSD_SANITIZE_START) && |
|---|
| 596 | | - (cmd.opcode == MMC_SWITCH)) { |
|---|
| 597 | | - err = ioctl_do_sanitize(card); |
|---|
| 598 | | - |
|---|
| 599 | | - if (err) |
|---|
| 600 | | - pr_err("%s: ioctl_do_sanitize() failed. err = %d", |
|---|
| 601 | | - __func__, err); |
|---|
| 602 | | - |
|---|
| 603 | | - return err; |
|---|
| 604 | | - } |
|---|
| 551 | + (cmd.opcode == MMC_SWITCH)) |
|---|
| 552 | + return mmc_sanitize(card); |
|---|
| 605 | 553 | |
|---|
| 606 | 554 | mmc_wait_for_req(card->host, &mrq); |
|---|
| 607 | 555 | memcpy(&idata->ic.response, cmd.resp, sizeof(cmd.resp)); |
|---|
| .. | .. |
|---|
| 797 | 745 | * whole block device, not on a partition. This prevents overspray |
|---|
| 798 | 746 | * between sibling partitions. |
|---|
| 799 | 747 | */ |
|---|
| 800 | | - if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains)) |
|---|
| 748 | + if (!capable(CAP_SYS_RAWIO) || bdev_is_partition(bdev)) |
|---|
| 801 | 749 | return -EPERM; |
|---|
| 802 | 750 | return 0; |
|---|
| 803 | 751 | } |
|---|
| .. | .. |
|---|
| 1024 | 972 | struct mmc_blk_data *main_md = |
|---|
| 1025 | 973 | dev_get_drvdata(&host->card->dev); |
|---|
| 1026 | 974 | int part_err; |
|---|
| 975 | + bool allow = true; |
|---|
| 976 | + |
|---|
| 977 | + trace_android_vh_mmc_blk_reset(host, err, &allow); |
|---|
| 978 | + if (!allow) |
|---|
| 979 | + return -ENODEV; |
|---|
| 1027 | 980 | |
|---|
| 1028 | 981 | main_md->part_curr = main_md->part_type; |
|---|
| 1029 | 982 | part_err = mmc_blk_part_switch(host->card, md->part_type); |
|---|
| .. | .. |
|---|
| 1070 | 1023 | if (ret) |
|---|
| 1071 | 1024 | break; |
|---|
| 1072 | 1025 | } |
|---|
| 1073 | | - /* fallthrough */ |
|---|
| 1026 | + fallthrough; |
|---|
| 1074 | 1027 | case MMC_DRV_OP_IOCTL_RPMB: |
|---|
| 1075 | 1028 | idata = mq_rq->drv_op_data; |
|---|
| 1076 | 1029 | for (i = 0, ret = 0; i < mq_rq->ioc_count; i++) { |
|---|
| .. | .. |
|---|
| 1119 | 1072 | { |
|---|
| 1120 | 1073 | struct mmc_blk_data *md = mq->blkdata; |
|---|
| 1121 | 1074 | struct mmc_card *card = md->queue.card; |
|---|
| 1122 | | - unsigned int from, nr, arg; |
|---|
| 1075 | + unsigned int from, nr; |
|---|
| 1123 | 1076 | int err = 0, type = MMC_BLK_DISCARD; |
|---|
| 1124 | 1077 | blk_status_t status = BLK_STS_OK; |
|---|
| 1125 | 1078 | |
|---|
| .. | .. |
|---|
| 1131 | 1084 | from = blk_rq_pos(req); |
|---|
| 1132 | 1085 | nr = blk_rq_sectors(req); |
|---|
| 1133 | 1086 | |
|---|
| 1134 | | - if (mmc_can_discard(card)) |
|---|
| 1135 | | - arg = MMC_DISCARD_ARG; |
|---|
| 1136 | | - else if (mmc_can_trim(card)) |
|---|
| 1137 | | - arg = MMC_TRIM_ARG; |
|---|
| 1138 | | - else |
|---|
| 1139 | | - arg = MMC_ERASE_ARG; |
|---|
| 1140 | 1087 | do { |
|---|
| 1088 | + unsigned int erase_arg = card->erase_arg; |
|---|
| 1089 | + |
|---|
| 1090 | + if (mmc_card_broken_sd_discard(card)) |
|---|
| 1091 | + erase_arg = SD_ERASE_ARG; |
|---|
| 1092 | + |
|---|
| 1141 | 1093 | err = 0; |
|---|
| 1142 | 1094 | if (card->quirks & MMC_QUIRK_INAND_CMD38) { |
|---|
| 1143 | 1095 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
|---|
| 1144 | 1096 | INAND_CMD38_ARG_EXT_CSD, |
|---|
| 1145 | | - arg == MMC_TRIM_ARG ? |
|---|
| 1097 | + card->erase_arg == MMC_TRIM_ARG ? |
|---|
| 1146 | 1098 | INAND_CMD38_ARG_TRIM : |
|---|
| 1147 | 1099 | INAND_CMD38_ARG_ERASE, |
|---|
| 1148 | | - 0); |
|---|
| 1100 | + card->ext_csd.generic_cmd6_time); |
|---|
| 1149 | 1101 | } |
|---|
| 1150 | 1102 | if (!err) |
|---|
| 1151 | | - err = mmc_erase(card, from, nr, arg); |
|---|
| 1103 | + err = mmc_erase(card, from, nr, erase_arg); |
|---|
| 1152 | 1104 | } while (err == -EIO && !mmc_blk_reset(md, card->host, type)); |
|---|
| 1153 | 1105 | if (err) |
|---|
| 1154 | 1106 | status = BLK_STS_IOERR; |
|---|
| .. | .. |
|---|
| 1187 | 1139 | arg == MMC_SECURE_TRIM1_ARG ? |
|---|
| 1188 | 1140 | INAND_CMD38_ARG_SECTRIM1 : |
|---|
| 1189 | 1141 | INAND_CMD38_ARG_SECERASE, |
|---|
| 1190 | | - 0); |
|---|
| 1142 | + card->ext_csd.generic_cmd6_time); |
|---|
| 1191 | 1143 | if (err) |
|---|
| 1192 | 1144 | goto out_retry; |
|---|
| 1193 | 1145 | } |
|---|
| .. | .. |
|---|
| 1205 | 1157 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
|---|
| 1206 | 1158 | INAND_CMD38_ARG_EXT_CSD, |
|---|
| 1207 | 1159 | INAND_CMD38_ARG_SECTRIM2, |
|---|
| 1208 | | - 0); |
|---|
| 1160 | + card->ext_csd.generic_cmd6_time); |
|---|
| 1209 | 1161 | if (err) |
|---|
| 1210 | 1162 | goto out_retry; |
|---|
| 1211 | 1163 | } |
|---|
| .. | .. |
|---|
| 1316 | 1268 | } |
|---|
| 1317 | 1269 | |
|---|
| 1318 | 1270 | static void mmc_blk_data_prep(struct mmc_queue *mq, struct mmc_queue_req *mqrq, |
|---|
| 1319 | | - int disable_multi, bool *do_rel_wr_p, |
|---|
| 1271 | + int recovery_mode, bool *do_rel_wr_p, |
|---|
| 1320 | 1272 | bool *do_data_tag_p) |
|---|
| 1321 | 1273 | { |
|---|
| 1322 | 1274 | struct mmc_blk_data *md = mq->blkdata; |
|---|
| .. | .. |
|---|
| 1382 | 1334 | brq->data.blocks--; |
|---|
| 1383 | 1335 | |
|---|
| 1384 | 1336 | /* |
|---|
| 1385 | | - * After a read error, we redo the request one sector |
|---|
| 1337 | + * After a read error, we redo the request one (native) sector |
|---|
| 1386 | 1338 | * at a time in order to accurately determine which |
|---|
| 1387 | 1339 | * sectors can be read successfully. |
|---|
| 1388 | 1340 | */ |
|---|
| 1389 | | - if (disable_multi) |
|---|
| 1390 | | - brq->data.blocks = 1; |
|---|
| 1341 | + if (recovery_mode) |
|---|
| 1342 | + brq->data.blocks = queue_physical_block_size(mq->queue) >> 9; |
|---|
| 1391 | 1343 | |
|---|
| 1392 | 1344 | /* |
|---|
| 1393 | 1345 | * Some controllers have HW issues while operating |
|---|
| .. | .. |
|---|
| 1485 | 1437 | blk_mq_end_request(req, BLK_STS_OK); |
|---|
| 1486 | 1438 | } |
|---|
| 1487 | 1439 | |
|---|
| 1488 | | - spin_lock_irqsave(q->queue_lock, flags); |
|---|
| 1440 | + spin_lock_irqsave(&mq->lock, flags); |
|---|
| 1489 | 1441 | |
|---|
| 1490 | 1442 | mq->in_flight[issue_type] -= 1; |
|---|
| 1491 | 1443 | |
|---|
| .. | .. |
|---|
| 1493 | 1445 | |
|---|
| 1494 | 1446 | mmc_cqe_check_busy(mq); |
|---|
| 1495 | 1447 | |
|---|
| 1496 | | - spin_unlock_irqrestore(q->queue_lock, flags); |
|---|
| 1448 | + spin_unlock_irqrestore(&mq->lock, flags); |
|---|
| 1497 | 1449 | |
|---|
| 1498 | 1450 | if (!mq->cqe_busy) |
|---|
| 1499 | 1451 | blk_mq_run_hw_queues(q, true); |
|---|
| .. | .. |
|---|
| 1513 | 1465 | err = mmc_cqe_recovery(host); |
|---|
| 1514 | 1466 | if (err) |
|---|
| 1515 | 1467 | mmc_blk_reset(mq->blkdata, host, MMC_BLK_CQE_RECOVERY); |
|---|
| 1516 | | - else |
|---|
| 1517 | | - mmc_blk_reset_success(mq->blkdata, MMC_BLK_CQE_RECOVERY); |
|---|
| 1468 | + mmc_blk_reset_success(mq->blkdata, MMC_BLK_CQE_RECOVERY); |
|---|
| 1518 | 1469 | |
|---|
| 1519 | 1470 | pr_debug("%s: CQE recovery done\n", mmc_hostname(host)); |
|---|
| 1520 | 1471 | } |
|---|
| .. | .. |
|---|
| 1533 | 1484 | */ |
|---|
| 1534 | 1485 | if (mq->in_recovery) |
|---|
| 1535 | 1486 | mmc_blk_cqe_complete_rq(mq, req); |
|---|
| 1536 | | - else |
|---|
| 1487 | + else if (likely(!blk_should_fake_timeout(req->q))) |
|---|
| 1537 | 1488 | blk_mq_complete_request(req); |
|---|
| 1538 | 1489 | } |
|---|
| 1539 | 1490 | |
|---|
| .. | .. |
|---|
| 1605 | 1556 | |
|---|
| 1606 | 1557 | static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, |
|---|
| 1607 | 1558 | struct mmc_card *card, |
|---|
| 1608 | | - int disable_multi, |
|---|
| 1559 | + int recovery_mode, |
|---|
| 1609 | 1560 | struct mmc_queue *mq) |
|---|
| 1610 | 1561 | { |
|---|
| 1611 | 1562 | u32 readcmd, writecmd; |
|---|
| .. | .. |
|---|
| 1614 | 1565 | struct mmc_blk_data *md = mq->blkdata; |
|---|
| 1615 | 1566 | bool do_rel_wr, do_data_tag; |
|---|
| 1616 | 1567 | |
|---|
| 1617 | | - mmc_blk_data_prep(mq, mqrq, disable_multi, &do_rel_wr, &do_data_tag); |
|---|
| 1568 | + mmc_blk_data_prep(mq, mqrq, recovery_mode, &do_rel_wr, &do_data_tag); |
|---|
| 1618 | 1569 | |
|---|
| 1619 | 1570 | brq->mrq.cmd = &brq->cmd; |
|---|
| 1620 | 1571 | |
|---|
| .. | .. |
|---|
| 1705 | 1656 | |
|---|
| 1706 | 1657 | #define MMC_READ_SINGLE_RETRIES 2 |
|---|
| 1707 | 1658 | |
|---|
| 1708 | | -/* Single sector read during recovery */ |
|---|
| 1659 | +/* Single (native) sector read during recovery */ |
|---|
| 1709 | 1660 | static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) |
|---|
| 1710 | 1661 | { |
|---|
| 1711 | 1662 | struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req); |
|---|
| .. | .. |
|---|
| 1713 | 1664 | struct mmc_card *card = mq->card; |
|---|
| 1714 | 1665 | struct mmc_host *host = card->host; |
|---|
| 1715 | 1666 | blk_status_t error = BLK_STS_OK; |
|---|
| 1667 | + size_t bytes_per_read = queue_physical_block_size(mq->queue); |
|---|
| 1716 | 1668 | |
|---|
| 1717 | 1669 | do { |
|---|
| 1718 | 1670 | u32 status; |
|---|
| .. | .. |
|---|
| 1729 | 1681 | goto error_exit; |
|---|
| 1730 | 1682 | |
|---|
| 1731 | 1683 | if (!mmc_host_is_spi(host) && |
|---|
| 1732 | | - !mmc_blk_in_tran_state(status)) { |
|---|
| 1684 | + !mmc_ready_for_data(status)) { |
|---|
| 1733 | 1685 | err = mmc_blk_fix_state(card, req); |
|---|
| 1734 | 1686 | if (err) |
|---|
| 1735 | 1687 | goto error_exit; |
|---|
| .. | .. |
|---|
| 1747 | 1699 | else |
|---|
| 1748 | 1700 | error = BLK_STS_OK; |
|---|
| 1749 | 1701 | |
|---|
| 1750 | | - } while (blk_update_request(req, error, 512)); |
|---|
| 1702 | + } while (blk_update_request(req, error, bytes_per_read)); |
|---|
| 1751 | 1703 | |
|---|
| 1752 | 1704 | return; |
|---|
| 1753 | 1705 | |
|---|
| 1754 | 1706 | error_exit: |
|---|
| 1755 | 1707 | mrq->data->bytes_xfered = 0; |
|---|
| 1756 | | - blk_update_request(req, BLK_STS_IOERR, 512); |
|---|
| 1708 | + blk_update_request(req, BLK_STS_IOERR, bytes_per_read); |
|---|
| 1757 | 1709 | /* Let it try the remaining request again */ |
|---|
| 1758 | 1710 | if (mqrq->retries > MMC_MAX_RETRIES - 1) |
|---|
| 1759 | 1711 | mqrq->retries = MMC_MAX_RETRIES - 1; |
|---|
| .. | .. |
|---|
| 1788 | 1740 | return brq->cmd.resp[0] & CMD_ERRORS || |
|---|
| 1789 | 1741 | brq->stop.resp[0] & stop_err_bits || |
|---|
| 1790 | 1742 | status & stop_err_bits || |
|---|
| 1791 | | - (rq_data_dir(req) == WRITE && !mmc_blk_in_tran_state(status)); |
|---|
| 1743 | + (rq_data_dir(req) == WRITE && !mmc_ready_for_data(status)); |
|---|
| 1792 | 1744 | } |
|---|
| 1793 | 1745 | |
|---|
| 1794 | 1746 | static inline bool mmc_blk_cmd_started(struct mmc_blk_request *brq) |
|---|
| .. | .. |
|---|
| 1850 | 1802 | |
|---|
| 1851 | 1803 | /* Try to get back to "tran" state */ |
|---|
| 1852 | 1804 | if (!mmc_host_is_spi(mq->card->host) && |
|---|
| 1853 | | - (err || !mmc_blk_in_tran_state(status))) |
|---|
| 1805 | + (err || !mmc_ready_for_data(status))) |
|---|
| 1854 | 1806 | err = mmc_blk_fix_state(mq->card, req); |
|---|
| 1855 | 1807 | |
|---|
| 1856 | 1808 | /* |
|---|
| .. | .. |
|---|
| 1870 | 1822 | err && mmc_blk_reset(md, card->host, type)) { |
|---|
| 1871 | 1823 | pr_err("%s: recovery failed!\n", req->rq_disk->disk_name); |
|---|
| 1872 | 1824 | mqrq->retries = MMC_NO_RETRIES; |
|---|
| 1825 | + trace_android_vh_mmc_blk_mq_rw_recovery(card); |
|---|
| 1873 | 1826 | return; |
|---|
| 1874 | 1827 | } |
|---|
| 1875 | 1828 | |
|---|
| .. | .. |
|---|
| 1894 | 1847 | return; |
|---|
| 1895 | 1848 | } |
|---|
| 1896 | 1849 | |
|---|
| 1897 | | - /* FIXME: Missing single sector read for large sector size */ |
|---|
| 1898 | | - if (!mmc_large_sector(card) && rq_data_dir(req) == READ && |
|---|
| 1899 | | - brq->data.blocks > 1) { |
|---|
| 1900 | | - /* Read one sector at a time */ |
|---|
| 1850 | + if (rq_data_dir(req) == READ && brq->data.blocks > |
|---|
| 1851 | + queue_physical_block_size(mq->queue) >> 9) { |
|---|
| 1852 | + /* Read one (native) sector at a time */ |
|---|
| 1901 | 1853 | mmc_blk_read_single(mq, req); |
|---|
| 1902 | 1854 | return; |
|---|
| 1903 | 1855 | } |
|---|
| .. | .. |
|---|
| 1979 | 1931 | struct mmc_queue_req *mqrq) |
|---|
| 1980 | 1932 | { |
|---|
| 1981 | 1933 | if (mmc_blk_urgent_bkops_needed(mq, mqrq)) |
|---|
| 1982 | | - mmc_start_bkops(mq->card, true); |
|---|
| 1934 | + mmc_run_bkops(mq->card); |
|---|
| 1983 | 1935 | } |
|---|
| 1984 | 1936 | |
|---|
| 1985 | 1937 | static void mmc_blk_hsq_req_done(struct mmc_request *mrq) |
|---|
| 1986 | 1938 | { |
|---|
| 1987 | 1939 | struct mmc_queue_req *mqrq = |
|---|
| 1988 | | - container_of(mrq, struct mmc_queue_req, brq.mrq); |
|---|
| 1940 | + container_of(mrq, struct mmc_queue_req, brq.mrq); |
|---|
| 1989 | 1941 | struct request *req = mmc_queue_req_to_req(mqrq); |
|---|
| 1990 | 1942 | struct request_queue *q = req->q; |
|---|
| 1991 | 1943 | struct mmc_queue *mq = q->queuedata; |
|---|
| .. | .. |
|---|
| 1994 | 1946 | |
|---|
| 1995 | 1947 | if (mmc_blk_rq_error(&mqrq->brq) || |
|---|
| 1996 | 1948 | mmc_blk_urgent_bkops_needed(mq, mqrq)) { |
|---|
| 1997 | | - spin_lock_irqsave(q->queue_lock, flags); |
|---|
| 1949 | + spin_lock_irqsave(&mq->lock, flags); |
|---|
| 1998 | 1950 | mq->recovery_needed = true; |
|---|
| 1999 | 1951 | mq->recovery_req = req; |
|---|
| 2000 | | - spin_unlock_irqrestore(q->queue_lock, flags); |
|---|
| 1952 | + spin_unlock_irqrestore(&mq->lock, flags); |
|---|
| 2001 | 1953 | |
|---|
| 2002 | 1954 | host->cqe_ops->cqe_recovery_start(host); |
|---|
| 2003 | 1955 | |
|---|
| .. | .. |
|---|
| 2013 | 1965 | */ |
|---|
| 2014 | 1966 | if (mq->in_recovery) |
|---|
| 2015 | 1967 | mmc_blk_cqe_complete_rq(mq, req); |
|---|
| 2016 | | - else |
|---|
| 1968 | + else if (likely(!blk_should_fake_timeout(req->q))) |
|---|
| 2017 | 1969 | blk_mq_complete_request(req); |
|---|
| 2018 | 1970 | } |
|---|
| 2019 | 1971 | |
|---|
| .. | .. |
|---|
| 2023 | 1975 | |
|---|
| 2024 | 1976 | if (mq->use_cqe) |
|---|
| 2025 | 1977 | mmc_blk_cqe_complete_rq(mq, req); |
|---|
| 2026 | | - else |
|---|
| 1978 | + else if (likely(!blk_should_fake_timeout(req->q))) |
|---|
| 2027 | 1979 | mmc_blk_mq_complete_rq(mq, req); |
|---|
| 2028 | 1980 | } |
|---|
| 2029 | 1981 | |
|---|
| .. | .. |
|---|
| 2046 | 1998 | |
|---|
| 2047 | 1999 | static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, struct request *req) |
|---|
| 2048 | 2000 | { |
|---|
| 2049 | | - struct request_queue *q = req->q; |
|---|
| 2050 | 2001 | unsigned long flags; |
|---|
| 2051 | 2002 | bool put_card; |
|---|
| 2052 | 2003 | |
|---|
| 2053 | | - spin_lock_irqsave(q->queue_lock, flags); |
|---|
| 2004 | + spin_lock_irqsave(&mq->lock, flags); |
|---|
| 2054 | 2005 | |
|---|
| 2055 | 2006 | mq->in_flight[mmc_issue_type(mq, req)] -= 1; |
|---|
| 2056 | 2007 | |
|---|
| 2057 | 2008 | put_card = (mmc_tot_in_flight(mq) == 0); |
|---|
| 2058 | 2009 | |
|---|
| 2059 | | - spin_unlock_irqrestore(q->queue_lock, flags); |
|---|
| 2010 | + spin_unlock_irqrestore(&mq->lock, flags); |
|---|
| 2060 | 2011 | |
|---|
| 2061 | 2012 | if (put_card) |
|---|
| 2062 | 2013 | mmc_put_card(mq->card, &mq->ctx); |
|---|
| .. | .. |
|---|
| 2076 | 2027 | */ |
|---|
| 2077 | 2028 | if (mq->in_recovery) |
|---|
| 2078 | 2029 | mmc_blk_mq_complete_rq(mq, req); |
|---|
| 2079 | | - else |
|---|
| 2030 | + else if (likely(!blk_should_fake_timeout(req->q))) |
|---|
| 2080 | 2031 | blk_mq_complete_request(req); |
|---|
| 2081 | 2032 | |
|---|
| 2082 | 2033 | mmc_blk_mq_dec_in_flight(mq, req); |
|---|
| .. | .. |
|---|
| 2152 | 2103 | * request does not need to wait (although it does need to |
|---|
| 2153 | 2104 | * complete complete_req first). |
|---|
| 2154 | 2105 | */ |
|---|
| 2155 | | - spin_lock_irqsave(q->queue_lock, flags); |
|---|
| 2106 | + spin_lock_irqsave(&mq->lock, flags); |
|---|
| 2156 | 2107 | mq->complete_req = req; |
|---|
| 2157 | 2108 | mq->rw_wait = false; |
|---|
| 2158 | 2109 | waiting = mq->waiting; |
|---|
| 2159 | | - spin_unlock_irqrestore(q->queue_lock, flags); |
|---|
| 2110 | + spin_unlock_irqrestore(&mq->lock, flags); |
|---|
| 2160 | 2111 | |
|---|
| 2161 | 2112 | /* |
|---|
| 2162 | 2113 | * If 'waiting' then the waiting task will complete this |
|---|
| .. | .. |
|---|
| 2175 | 2126 | /* Take the recovery path for errors or urgent background operations */ |
|---|
| 2176 | 2127 | if (mmc_blk_rq_error(&mqrq->brq) || |
|---|
| 2177 | 2128 | mmc_blk_urgent_bkops_needed(mq, mqrq)) { |
|---|
| 2178 | | - spin_lock_irqsave(q->queue_lock, flags); |
|---|
| 2129 | + spin_lock_irqsave(&mq->lock, flags); |
|---|
| 2179 | 2130 | mq->recovery_needed = true; |
|---|
| 2180 | 2131 | mq->recovery_req = req; |
|---|
| 2181 | | - spin_unlock_irqrestore(q->queue_lock, flags); |
|---|
| 2132 | + spin_unlock_irqrestore(&mq->lock, flags); |
|---|
| 2182 | 2133 | wake_up(&mq->wait); |
|---|
| 2183 | 2134 | schedule_work(&mq->recovery_work); |
|---|
| 2184 | 2135 | return; |
|---|
| .. | .. |
|---|
| 2194 | 2145 | |
|---|
| 2195 | 2146 | static bool mmc_blk_rw_wait_cond(struct mmc_queue *mq, int *err) |
|---|
| 2196 | 2147 | { |
|---|
| 2197 | | - struct request_queue *q = mq->queue; |
|---|
| 2198 | 2148 | unsigned long flags; |
|---|
| 2199 | 2149 | bool done; |
|---|
| 2200 | 2150 | |
|---|
| .. | .. |
|---|
| 2202 | 2152 | * Wait while there is another request in progress, but not if recovery |
|---|
| 2203 | 2153 | * is needed. Also indicate whether there is a request waiting to start. |
|---|
| 2204 | 2154 | */ |
|---|
| 2205 | | - spin_lock_irqsave(q->queue_lock, flags); |
|---|
| 2155 | + spin_lock_irqsave(&mq->lock, flags); |
|---|
| 2206 | 2156 | if (mq->recovery_needed) { |
|---|
| 2207 | 2157 | *err = -EBUSY; |
|---|
| 2208 | 2158 | done = true; |
|---|
| .. | .. |
|---|
| 2210 | 2160 | done = !mq->rw_wait; |
|---|
| 2211 | 2161 | } |
|---|
| 2212 | 2162 | mq->waiting = !done; |
|---|
| 2213 | | - spin_unlock_irqrestore(q->queue_lock, flags); |
|---|
| 2163 | + spin_unlock_irqrestore(&mq->lock, flags); |
|---|
| 2214 | 2164 | |
|---|
| 2215 | 2165 | return done; |
|---|
| 2216 | 2166 | } |
|---|
| .. | .. |
|---|
| 2391 | 2341 | goto err_kfree; |
|---|
| 2392 | 2342 | } |
|---|
| 2393 | 2343 | |
|---|
| 2394 | | - spin_lock_init(&md->lock); |
|---|
| 2395 | 2344 | INIT_LIST_HEAD(&md->part); |
|---|
| 2396 | 2345 | INIT_LIST_HEAD(&md->rpmbs); |
|---|
| 2397 | 2346 | md->usage = 1; |
|---|
| 2398 | 2347 | |
|---|
| 2399 | | - ret = mmc_init_queue(&md->queue, card, &md->lock, subname); |
|---|
| 2348 | + ret = mmc_init_queue(&md->queue, card); |
|---|
| 2400 | 2349 | if (ret) |
|---|
| 2401 | 2350 | goto err_putdisk; |
|---|
| 2402 | 2351 | |
|---|
| .. | .. |
|---|
| 2764 | 2713 | int ret; |
|---|
| 2765 | 2714 | struct mmc_card *card = md->queue.card; |
|---|
| 2766 | 2715 | |
|---|
| 2767 | | - device_add_disk(md->parent, md->disk); |
|---|
| 2716 | + device_add_disk(md->parent, md->disk, NULL); |
|---|
| 2768 | 2717 | md->force_ro.show = force_ro_show; |
|---|
| 2769 | 2718 | md->force_ro.store = force_ro_store; |
|---|
| 2770 | 2719 | sysfs_attr_init(&md->force_ro.attr); |
|---|
| .. | .. |
|---|
| 2829 | 2778 | |
|---|
| 2830 | 2779 | return ret; |
|---|
| 2831 | 2780 | } |
|---|
| 2832 | | -DEFINE_SIMPLE_ATTRIBUTE(mmc_dbg_card_status_fops, mmc_dbg_card_status_get, |
|---|
| 2833 | | - NULL, "%08llx\n"); |
|---|
| 2781 | +DEFINE_DEBUGFS_ATTRIBUTE(mmc_dbg_card_status_fops, mmc_dbg_card_status_get, |
|---|
| 2782 | + NULL, "%08llx\n"); |
|---|
| 2834 | 2783 | |
|---|
| 2835 | 2784 | /* That is two digits * 512 + 1 for newline */ |
|---|
| 2836 | 2785 | #define EXT_CSD_STR_LEN 1025 |
|---|
| .. | .. |
|---|
| 2918 | 2867 | |
|---|
| 2919 | 2868 | if (mmc_card_mmc(card) || mmc_card_sd(card)) { |
|---|
| 2920 | 2869 | md->status_dentry = |
|---|
| 2921 | | - debugfs_create_file("status", S_IRUSR, root, card, |
|---|
| 2922 | | - &mmc_dbg_card_status_fops); |
|---|
| 2870 | + debugfs_create_file_unsafe("status", 0400, root, |
|---|
| 2871 | + card, |
|---|
| 2872 | + &mmc_dbg_card_status_fops); |
|---|
| 2923 | 2873 | if (!md->status_dentry) |
|---|
| 2924 | 2874 | return -EIO; |
|---|
| 2925 | 2875 | } |
|---|
| .. | .. |
|---|
| 2968 | 2918 | |
|---|
| 2969 | 2919 | struct mmc_card *this_card; |
|---|
| 2970 | 2920 | EXPORT_SYMBOL(this_card); |
|---|
| 2921 | + |
|---|
| 2971 | 2922 | static int mmc_blk_probe(struct mmc_card *card) |
|---|
| 2972 | 2923 | { |
|---|
| 2973 | 2924 | struct mmc_blk_data *md, *part_md; |
|---|
| .. | .. |
|---|
| 3003 | 2954 | |
|---|
| 3004 | 2955 | dev_set_drvdata(&card->dev, md); |
|---|
| 3005 | 2956 | |
|---|
| 3006 | | -#if IS_ENABLED(CONFIG_MMC_DW_ROCKCHIP) || IS_ENABLED(CONFIG_MMC_SDHCI_OF_ARASAN) |
|---|
| 3007 | | - if (card->host->restrict_caps & RESTRICT_CARD_TYPE_EMMC) |
|---|
| 2957 | +#if defined(CONFIG_MMC_DW_ROCKCHIP) || defined(CONFIG_MMC_SDHCI_OF_ARASAN) |
|---|
| 2958 | + if (card->type == MMC_TYPE_MMC) |
|---|
| 3008 | 2959 | this_card = card; |
|---|
| 3009 | 2960 | #endif |
|---|
| 3010 | 2961 | |
|---|
| .. | .. |
|---|
| 3046 | 2997 | mmc_blk_remove_debugfs(card, md); |
|---|
| 3047 | 2998 | |
|---|
| 3048 | 2999 | #if defined(CONFIG_MMC_DW_ROCKCHIP) |
|---|
| 3049 | | - if (card->host->restrict_caps & RESTRICT_CARD_TYPE_EMMC) |
|---|
| 3000 | + if (card->type == MMC_TYPE_MMC) |
|---|
| 3050 | 3001 | this_card = NULL; |
|---|
| 3051 | 3002 | #endif |
|---|
| 3052 | 3003 | |
|---|