| 663 | } |
| 664 | |
| 665 | static void |
| 666 | bcm_sdhost_command(device_t dev, struct sdhci_slot *slot, uint16_t val) |
| 667 | { |
| 668 | struct bcm_sdhost_softc *sc = device_get_softc(dev); |
| 669 | struct mmc_data *data = slot->curcmd->data; |
| 670 | uint16_t val2; |
| 671 | uint8_t opcode; |
| 672 | uint8_t flags; |
| 673 | |
| 674 | mtx_assert(&sc->mtx, MA_OWNED); |
| 675 | |
| 676 | if (RD4(sc, HC_COMMAND) & HC_CMD_ENABLE) { |
| 677 | panic("%s: HC_CMD_ENABLE on entry\n", __func__); |
| 678 | } |
| 679 | |
| 680 | if (sc->cmdbusy == 1) |
| 681 | panic("%s: cmdbusy\n", __func__); |
| 682 | |
| 683 | sc->cmdbusy = 1; |
| 684 | |
| 685 | val2 = ((val >> 8) & HC_CMD_COMMAND_MASK) | HC_CMD_ENABLE; |
| 686 | |
| 687 | opcode = val >> 8; |
| 688 | flags = val & 0xff; |
| 689 | |
| 690 | if (opcode == MMC_APP_CMD) |
| 691 | sc->mmc_app_cmd = 1; |
| 692 | |
| 693 | if ((flags & SDHCI_CMD_RESP_MASK) == SDHCI_CMD_RESP_LONG) |
| 694 | val2 |= HC_CMD_RESPONSE_LONG; |
| 695 | else if ((flags & SDHCI_CMD_RESP_MASK) == SDHCI_CMD_RESP_SHORT_BUSY) |
| 696 | /* XXX XXX when enabled, cmd 7 (select card) blocks forever */ |
| 697 | ;/*val2 |= HC_CMD_BUSY; */ |
| 698 | else if ((flags & SDHCI_CMD_RESP_MASK) == SDHCI_CMD_RESP_SHORT) |
| 699 | ; |
| 700 | else |
| 701 | val2 |= HC_CMD_RESPONSE_NONE; |
| 702 | |
| 703 | if (val2 & HC_CMD_BUSY) |
| 704 | sc->sdhci_present_state |= |
| 705 | SDHCI_CMD_INHIBIT | SDHCI_DAT_INHIBIT; |
| 706 | |
| 707 | if (data != NULL && data->flags & MMC_DATA_READ) |
| 708 | val2 |= HC_CMD_READ; |
| 709 | else if (data != NULL && data->flags & MMC_DATA_WRITE) |
| 710 | val2 |= HC_CMD_WRITE; |
| 711 | |
| 712 | dprintf("%s: SDHCI_COMMAND_FLAGS --> HC_COMMAND %04x --> %04x\n", |
| 713 | __func__, val, val2); |
| 714 | |
| 715 | if (opcode == MMC_READ_MULTIPLE_BLOCK || |
| 716 | opcode == MMC_WRITE_MULTIPLE_BLOCK) { |
| 717 | u_int32_t save_sdarg; |
| 718 | |
| 719 | dprintf("%s: issuing MMC_SET_BLOCK_COUNT: CMD %08x ARG %08x\n", |
| 720 | __func__, MMC_SET_BLOCK_COUNT | HC_CMD_ENABLE, |
| 721 | sc->sdhci_blockcount); |
| 722 |
no test coverage detected