diff options
Diffstat (limited to 'drivers/mmc/mmc.c')
| -rw-r--r-- | drivers/mmc/mmc.c | 182 |
1 files changed, 136 insertions, 46 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 6f2a282e2b97..5046a1661342 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c | |||
| @@ -103,11 +103,16 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) | |||
| 103 | mmc_hostname(host), mrq->cmd->opcode, | 103 | mmc_hostname(host), mrq->cmd->opcode, |
| 104 | mrq->cmd->arg, mrq->cmd->flags); | 104 | mrq->cmd->arg, mrq->cmd->flags); |
| 105 | 105 | ||
| 106 | WARN_ON(host->card_busy == NULL); | 106 | WARN_ON(!host->claimed); |
| 107 | 107 | ||
| 108 | mrq->cmd->error = 0; | 108 | mrq->cmd->error = 0; |
| 109 | mrq->cmd->mrq = mrq; | 109 | mrq->cmd->mrq = mrq; |
| 110 | if (mrq->data) { | 110 | if (mrq->data) { |
| 111 | BUG_ON(mrq->data->blksz > host->max_blk_size); | ||
| 112 | BUG_ON(mrq->data->blocks > host->max_blk_count); | ||
| 113 | BUG_ON(mrq->data->blocks * mrq->data->blksz > | ||
| 114 | host->max_req_size); | ||
| 115 | |||
| 111 | mrq->cmd->data = mrq->data; | 116 | mrq->cmd->data = mrq->data; |
| 112 | mrq->data->error = 0; | 117 | mrq->data->error = 0; |
| 113 | mrq->data->mrq = mrq; | 118 | mrq->data->mrq = mrq; |
| @@ -157,7 +162,7 @@ int mmc_wait_for_cmd(struct mmc_host *host, struct mmc_command *cmd, int retries | |||
| 157 | { | 162 | { |
| 158 | struct mmc_request mrq; | 163 | struct mmc_request mrq; |
| 159 | 164 | ||
| 160 | BUG_ON(host->card_busy == NULL); | 165 | BUG_ON(!host->claimed); |
| 161 | 166 | ||
| 162 | memset(&mrq, 0, sizeof(struct mmc_request)); | 167 | memset(&mrq, 0, sizeof(struct mmc_request)); |
| 163 | 168 | ||
| @@ -195,7 +200,7 @@ int mmc_wait_for_app_cmd(struct mmc_host *host, unsigned int rca, | |||
| 195 | 200 | ||
| 196 | int i, err; | 201 | int i, err; |
| 197 | 202 | ||
| 198 | BUG_ON(host->card_busy == NULL); | 203 | BUG_ON(!host->claimed); |
| 199 | BUG_ON(retries < 0); | 204 | BUG_ON(retries < 0); |
| 200 | 205 | ||
| 201 | err = MMC_ERR_INVALID; | 206 | err = MMC_ERR_INVALID; |
| @@ -289,7 +294,10 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card, | |||
| 289 | else | 294 | else |
| 290 | limit_us = 100000; | 295 | limit_us = 100000; |
| 291 | 296 | ||
| 292 | if (timeout_us > limit_us) { | 297 | /* |
| 298 | * SDHC cards always use these fixed values. | ||
| 299 | */ | ||
| 300 | if (timeout_us > limit_us || mmc_card_blockaddr(card)) { | ||
| 293 | data->timeout_ns = limit_us * 1000; | 301 | data->timeout_ns = limit_us * 1000; |
| 294 | data->timeout_clks = 0; | 302 | data->timeout_clks = 0; |
| 295 | } | 303 | } |
| @@ -320,14 +328,14 @@ int __mmc_claim_host(struct mmc_host *host, struct mmc_card *card) | |||
| 320 | spin_lock_irqsave(&host->lock, flags); | 328 | spin_lock_irqsave(&host->lock, flags); |
| 321 | while (1) { | 329 | while (1) { |
| 322 | set_current_state(TASK_UNINTERRUPTIBLE); | 330 | set_current_state(TASK_UNINTERRUPTIBLE); |
| 323 | if (host->card_busy == NULL) | 331 | if (!host->claimed) |
| 324 | break; | 332 | break; |
| 325 | spin_unlock_irqrestore(&host->lock, flags); | 333 | spin_unlock_irqrestore(&host->lock, flags); |
| 326 | schedule(); | 334 | schedule(); |
| 327 | spin_lock_irqsave(&host->lock, flags); | 335 | spin_lock_irqsave(&host->lock, flags); |
| 328 | } | 336 | } |
| 329 | set_current_state(TASK_RUNNING); | 337 | set_current_state(TASK_RUNNING); |
| 330 | host->card_busy = card; | 338 | host->claimed = 1; |
| 331 | spin_unlock_irqrestore(&host->lock, flags); | 339 | spin_unlock_irqrestore(&host->lock, flags); |
| 332 | remove_wait_queue(&host->wq, &wait); | 340 | remove_wait_queue(&host->wq, &wait); |
| 333 | 341 | ||
| @@ -353,10 +361,10 @@ void mmc_release_host(struct mmc_host *host) | |||
| 353 | { | 361 | { |
| 354 | unsigned long flags; | 362 | unsigned long flags; |
| 355 | 363 | ||
| 356 | BUG_ON(host->card_busy == NULL); | 364 | BUG_ON(!host->claimed); |
| 357 | 365 | ||
| 358 | spin_lock_irqsave(&host->lock, flags); | 366 | spin_lock_irqsave(&host->lock, flags); |
| 359 | host->card_busy = NULL; | 367 | host->claimed = 0; |
| 360 | spin_unlock_irqrestore(&host->lock, flags); | 368 | spin_unlock_irqrestore(&host->lock, flags); |
| 361 | 369 | ||
| 362 | wake_up(&host->wq); | 370 | wake_up(&host->wq); |
| @@ -372,7 +380,7 @@ static inline void mmc_set_ios(struct mmc_host *host) | |||
| 372 | mmc_hostname(host), ios->clock, ios->bus_mode, | 380 | mmc_hostname(host), ios->clock, ios->bus_mode, |
| 373 | ios->power_mode, ios->chip_select, ios->vdd, | 381 | ios->power_mode, ios->chip_select, ios->vdd, |
| 374 | ios->bus_width); | 382 | ios->bus_width); |
| 375 | 383 | ||
| 376 | host->ops->set_ios(host, ios); | 384 | host->ops->set_ios(host, ios); |
| 377 | } | 385 | } |
| 378 | 386 | ||
| @@ -381,7 +389,7 @@ static int mmc_select_card(struct mmc_host *host, struct mmc_card *card) | |||
| 381 | int err; | 389 | int err; |
| 382 | struct mmc_command cmd; | 390 | struct mmc_command cmd; |
| 383 | 391 | ||
| 384 | BUG_ON(host->card_busy == NULL); | 392 | BUG_ON(!host->claimed); |
| 385 | 393 | ||
| 386 | if (host->card_selected == card) | 394 | if (host->card_selected == card) |
| 387 | return MMC_ERR_NONE; | 395 | return MMC_ERR_NONE; |
| @@ -588,34 +596,65 @@ static void mmc_decode_csd(struct mmc_card *card) | |||
| 588 | 596 | ||
| 589 | if (mmc_card_sd(card)) { | 597 | if (mmc_card_sd(card)) { |
| 590 | csd_struct = UNSTUFF_BITS(resp, 126, 2); | 598 | csd_struct = UNSTUFF_BITS(resp, 126, 2); |
| 591 | if (csd_struct != 0) { | 599 | |
| 600 | switch (csd_struct) { | ||
| 601 | case 0: | ||
| 602 | m = UNSTUFF_BITS(resp, 115, 4); | ||
| 603 | e = UNSTUFF_BITS(resp, 112, 3); | ||
| 604 | csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; | ||
| 605 | csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; | ||
| 606 | |||
| 607 | m = UNSTUFF_BITS(resp, 99, 4); | ||
| 608 | e = UNSTUFF_BITS(resp, 96, 3); | ||
| 609 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
| 610 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
| 611 | |||
| 612 | e = UNSTUFF_BITS(resp, 47, 3); | ||
| 613 | m = UNSTUFF_BITS(resp, 62, 12); | ||
| 614 | csd->capacity = (1 + m) << (e + 2); | ||
| 615 | |||
| 616 | csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); | ||
| 617 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | ||
| 618 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | ||
| 619 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | ||
| 620 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
| 621 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | ||
| 622 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | ||
| 623 | break; | ||
| 624 | case 1: | ||
| 625 | /* | ||
| 626 | * This is a block-addressed SDHC card. Most | ||
| 627 | * interesting fields are unused and have fixed | ||
| 628 | * values. To avoid getting tripped by buggy cards, | ||
| 629 | * we assume those fixed values ourselves. | ||
| 630 | */ | ||
| 631 | mmc_card_set_blockaddr(card); | ||
| 632 | |||
| 633 | csd->tacc_ns = 0; /* Unused */ | ||
| 634 | csd->tacc_clks = 0; /* Unused */ | ||
| 635 | |||
| 636 | m = UNSTUFF_BITS(resp, 99, 4); | ||
| 637 | e = UNSTUFF_BITS(resp, 96, 3); | ||
| 638 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
| 639 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
| 640 | |||
| 641 | m = UNSTUFF_BITS(resp, 48, 22); | ||
| 642 | csd->capacity = (1 + m) << 10; | ||
| 643 | |||
| 644 | csd->read_blkbits = 9; | ||
| 645 | csd->read_partial = 0; | ||
| 646 | csd->write_misalign = 0; | ||
| 647 | csd->read_misalign = 0; | ||
| 648 | csd->r2w_factor = 4; /* Unused */ | ||
| 649 | csd->write_blkbits = 9; | ||
| 650 | csd->write_partial = 0; | ||
| 651 | break; | ||
| 652 | default: | ||
| 592 | printk("%s: unrecognised CSD structure version %d\n", | 653 | printk("%s: unrecognised CSD structure version %d\n", |
| 593 | mmc_hostname(card->host), csd_struct); | 654 | mmc_hostname(card->host), csd_struct); |
| 594 | mmc_card_set_bad(card); | 655 | mmc_card_set_bad(card); |
| 595 | return; | 656 | return; |
| 596 | } | 657 | } |
| 597 | |||
| 598 | m = UNSTUFF_BITS(resp, 115, 4); | ||
| 599 | e = UNSTUFF_BITS(resp, 112, 3); | ||
| 600 | csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; | ||
| 601 | csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; | ||
| 602 | |||
| 603 | m = UNSTUFF_BITS(resp, 99, 4); | ||
| 604 | e = UNSTUFF_BITS(resp, 96, 3); | ||
| 605 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
| 606 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
| 607 | |||
| 608 | e = UNSTUFF_BITS(resp, 47, 3); | ||
| 609 | m = UNSTUFF_BITS(resp, 62, 12); | ||
| 610 | csd->capacity = (1 + m) << (e + 2); | ||
| 611 | |||
| 612 | csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); | ||
| 613 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | ||
| 614 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | ||
| 615 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | ||
| 616 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
| 617 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | ||
| 618 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | ||
| 619 | } else { | 658 | } else { |
| 620 | /* | 659 | /* |
| 621 | * We only understand CSD structure v1.1 and v1.2. | 660 | * We only understand CSD structure v1.1 and v1.2. |
| @@ -848,6 +887,41 @@ static int mmc_send_app_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) | |||
| 848 | return err; | 887 | return err; |
| 849 | } | 888 | } |
| 850 | 889 | ||
| 890 | static int mmc_send_if_cond(struct mmc_host *host, u32 ocr, int *rsd2) | ||
| 891 | { | ||
| 892 | struct mmc_command cmd; | ||
| 893 | int err, sd2; | ||
| 894 | static const u8 test_pattern = 0xAA; | ||
| 895 | |||
| 896 | /* | ||
| 897 | * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND | ||
| 898 | * before SD_APP_OP_COND. This command will harmlessly fail for | ||
| 899 | * SD 1.0 cards. | ||
| 900 | */ | ||
| 901 | cmd.opcode = SD_SEND_IF_COND; | ||
| 902 | cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | test_pattern; | ||
| 903 | cmd.flags = MMC_RSP_R7 | MMC_CMD_BCR; | ||
| 904 | |||
| 905 | err = mmc_wait_for_cmd(host, &cmd, 0); | ||
| 906 | if (err == MMC_ERR_NONE) { | ||
| 907 | if ((cmd.resp[0] & 0xFF) == test_pattern) { | ||
| 908 | sd2 = 1; | ||
| 909 | } else { | ||
| 910 | sd2 = 0; | ||
| 911 | err = MMC_ERR_FAILED; | ||
| 912 | } | ||
| 913 | } else { | ||
| 914 | /* | ||
| 915 | * Treat errors as SD 1.0 card. | ||
| 916 | */ | ||
| 917 | sd2 = 0; | ||
| 918 | err = MMC_ERR_NONE; | ||
| 919 | } | ||
| 920 | if (rsd2) | ||
| 921 | *rsd2 = sd2; | ||
| 922 | return err; | ||
| 923 | } | ||
| 924 | |||
| 851 | /* | 925 | /* |
| 852 | * Discover cards by requesting their CID. If this command | 926 | * Discover cards by requesting their CID. If this command |
| 853 | * times out, it is not an error; there are no further cards | 927 | * times out, it is not an error; there are no further cards |
| @@ -1018,7 +1092,8 @@ static void mmc_process_ext_csds(struct mmc_host *host) | |||
| 1018 | mmc_wait_for_req(host, &mrq); | 1092 | mmc_wait_for_req(host, &mrq); |
| 1019 | 1093 | ||
| 1020 | if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { | 1094 | if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { |
| 1021 | mmc_card_set_dead(card); | 1095 | printk("%s: unable to read EXT_CSD, performance " |
| 1096 | "might suffer.\n", mmc_hostname(card->host)); | ||
| 1022 | continue; | 1097 | continue; |
| 1023 | } | 1098 | } |
| 1024 | 1099 | ||
| @@ -1034,7 +1109,6 @@ static void mmc_process_ext_csds(struct mmc_host *host) | |||
| 1034 | printk("%s: card is mmc v4 but doesn't support " | 1109 | printk("%s: card is mmc v4 but doesn't support " |
| 1035 | "any high-speed modes.\n", | 1110 | "any high-speed modes.\n", |
| 1036 | mmc_hostname(card->host)); | 1111 | mmc_hostname(card->host)); |
| 1037 | mmc_card_set_bad(card); | ||
| 1038 | continue; | 1112 | continue; |
| 1039 | } | 1113 | } |
| 1040 | 1114 | ||
| @@ -1215,7 +1289,9 @@ static void mmc_read_switch_caps(struct mmc_host *host) | |||
| 1215 | mmc_wait_for_req(host, &mrq); | 1289 | mmc_wait_for_req(host, &mrq); |
| 1216 | 1290 | ||
| 1217 | if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { | 1291 | if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { |
| 1218 | mmc_card_set_dead(card); | 1292 | printk("%s: unable to read switch capabilities, " |
| 1293 | "performance might suffer.\n", | ||
| 1294 | mmc_hostname(card->host)); | ||
| 1219 | continue; | 1295 | continue; |
| 1220 | } | 1296 | } |
| 1221 | 1297 | ||
| @@ -1247,12 +1323,8 @@ static void mmc_read_switch_caps(struct mmc_host *host) | |||
| 1247 | 1323 | ||
| 1248 | mmc_wait_for_req(host, &mrq); | 1324 | mmc_wait_for_req(host, &mrq); |
| 1249 | 1325 | ||
| 1250 | if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE) { | 1326 | if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE || |
| 1251 | mmc_card_set_dead(card); | 1327 | (status[16] & 0xF) != 1) { |
| 1252 | continue; | ||
| 1253 | } | ||
| 1254 | |||
| 1255 | if ((status[16] & 0xF) != 1) { | ||
| 1256 | printk(KERN_WARNING "%s: Problem switching card " | 1328 | printk(KERN_WARNING "%s: Problem switching card " |
| 1257 | "into high-speed mode!\n", | 1329 | "into high-speed mode!\n", |
| 1258 | mmc_hostname(host)); | 1330 | mmc_hostname(host)); |
| @@ -1334,6 +1406,10 @@ static void mmc_setup(struct mmc_host *host) | |||
| 1334 | mmc_power_up(host); | 1406 | mmc_power_up(host); |
| 1335 | mmc_idle_cards(host); | 1407 | mmc_idle_cards(host); |
| 1336 | 1408 | ||
| 1409 | err = mmc_send_if_cond(host, host->ocr_avail, NULL); | ||
| 1410 | if (err != MMC_ERR_NONE) { | ||
| 1411 | return; | ||
| 1412 | } | ||
| 1337 | err = mmc_send_app_op_cond(host, 0, &ocr); | 1413 | err = mmc_send_app_op_cond(host, 0, &ocr); |
| 1338 | 1414 | ||
| 1339 | /* | 1415 | /* |
| @@ -1386,10 +1462,21 @@ static void mmc_setup(struct mmc_host *host) | |||
| 1386 | * all get the idea that they should be ready for CMD2. | 1462 | * all get the idea that they should be ready for CMD2. |
| 1387 | * (My SanDisk card seems to need this.) | 1463 | * (My SanDisk card seems to need this.) |
| 1388 | */ | 1464 | */ |
| 1389 | if (host->mode == MMC_MODE_SD) | 1465 | if (host->mode == MMC_MODE_SD) { |
| 1390 | mmc_send_app_op_cond(host, host->ocr, NULL); | 1466 | int err, sd2; |
| 1391 | else | 1467 | err = mmc_send_if_cond(host, host->ocr, &sd2); |
| 1468 | if (err == MMC_ERR_NONE) { | ||
| 1469 | /* | ||
| 1470 | * If SD_SEND_IF_COND indicates an SD 2.0 | ||
| 1471 | * compliant card and we should set bit 30 | ||
| 1472 | * of the ocr to indicate that we can handle | ||
| 1473 | * block-addressed SDHC cards. | ||
| 1474 | */ | ||
| 1475 | mmc_send_app_op_cond(host, host->ocr | (sd2 << 30), NULL); | ||
| 1476 | } | ||
| 1477 | } else { | ||
| 1392 | mmc_send_op_cond(host, host->ocr, NULL); | 1478 | mmc_send_op_cond(host, host->ocr, NULL); |
| 1479 | } | ||
| 1393 | 1480 | ||
| 1394 | mmc_discover_cards(host); | 1481 | mmc_discover_cards(host); |
| 1395 | 1482 | ||
| @@ -1519,8 +1606,11 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) | |||
| 1519 | */ | 1606 | */ |
| 1520 | host->max_hw_segs = 1; | 1607 | host->max_hw_segs = 1; |
| 1521 | host->max_phys_segs = 1; | 1608 | host->max_phys_segs = 1; |
| 1522 | host->max_sectors = 1 << (PAGE_CACHE_SHIFT - 9); | ||
| 1523 | host->max_seg_size = PAGE_CACHE_SIZE; | 1609 | host->max_seg_size = PAGE_CACHE_SIZE; |
| 1610 | |||
| 1611 | host->max_req_size = PAGE_CACHE_SIZE; | ||
| 1612 | host->max_blk_size = 512; | ||
| 1613 | host->max_blk_count = PAGE_CACHE_SIZE / 512; | ||
| 1524 | } | 1614 | } |
| 1525 | 1615 | ||
| 1526 | return host; | 1616 | return host; |
