Page MenuHomeFreeBSD

D13063.diff
No OneTemporary

D13063.diff

Index: head/sys/cam/mmc/mmc.h
===================================================================
--- head/sys/cam/mmc/mmc.h
+++ head/sys/cam/mmc/mmc.h
@@ -94,4 +94,12 @@
uint8_t sdio_func_count;
} __packed;
+/*
+ * Only one MMC card on bus is supported now.
+ * If we ever want to support multiple MMC cards on the same bus,
+ * mmc_xpt needs to be extended to issue new RCAs based on number
+ * of already probed cards. Furthermore, retuning and high-speed
+ * settings should also take all cards into account.
+ */
+#define MMC_PROPOSED_RCA 2
#endif
Index: head/sys/cam/mmc/mmc_xpt.c
===================================================================
--- head/sys/cam/mmc/mmc_xpt.c
+++ head/sys/cam/mmc/mmc_xpt.c
@@ -98,7 +98,8 @@
PROBE_GET_CID,
PROBE_GET_CSD,
PROBE_SEND_RELATIVE_ADDR,
- PROBE_SELECT_CARD,
+ PROBE_MMC_SET_RELATIVE_ADDR,
+ PROBE_SELECT_CARD,
PROBE_DONE,
PROBE_INVALID
} probe_action;
@@ -114,6 +115,7 @@
"PROBE_GET_CID",
"PROBE_GET_CSD",
"PROBE_SEND_RELATIVE_ADDR",
+ "PROBE_MMC_SET_RELATIVE_ADDR",
"PROBE_SELECT_CARD",
"PROBE_DONE",
"PROBE_INVALID"
@@ -702,7 +704,6 @@
mmcio->cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR;
mmcio->stop.opcode = 0;
break;
-
case PROBE_SEND_RELATIVE_ADDR:
init_standard_ccb(start_ccb, XPT_MMC_IO);
mmcio->cmd.opcode = SD_SEND_RELATIVE_ADDR;
@@ -710,6 +711,13 @@
mmcio->cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;
mmcio->stop.opcode = 0;
break;
+ case PROBE_MMC_SET_RELATIVE_ADDR:
+ init_standard_ccb(start_ccb, XPT_MMC_IO);
+ mmcio->cmd.opcode = MMC_SET_RELATIVE_ADDR;
+ mmcio->cmd.arg = MMC_PROPOSED_RCA << 16;
+ mmcio->cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
+ mmcio->stop.opcode = 0;
+ break;
case PROBE_SELECT_CARD:
init_standard_ccb(start_ccb, XPT_MMC_IO);
mmcio->cmd.opcode = MMC_SELECT_CARD;
@@ -985,7 +993,10 @@
mmcp->card_cid[1],
mmcp->card_cid[2],
mmcp->card_cid[3]));
- PROBE_SET_ACTION(softc, PROBE_SEND_RELATIVE_ADDR);
+ if (mmcp->card_features & CARD_FEATURE_MMC)
+ PROBE_SET_ACTION(softc, PROBE_MMC_SET_RELATIVE_ADDR);
+ else
+ PROBE_SET_ACTION(softc, PROBE_SEND_RELATIVE_ADDR);
break;
}
case PROBE_SEND_RELATIVE_ADDR: {
@@ -1010,6 +1021,18 @@
PROBE_SET_ACTION(softc, PROBE_SELECT_CARD);
break;
}
+ case PROBE_MMC_SET_RELATIVE_ADDR:
+ mmcio = &done_ccb->mmcio;
+ err = mmcio->cmd.error;
+ if (err != MMC_ERR_NONE) {
+ CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE,
+ ("PROBE_MMC_SET_RELATIVE_ADDR: error %d\n", err));
+ PROBE_SET_ACTION(softc, PROBE_INVALID);
+ break;
+ }
+ path->device->mmc_ident_data.card_rca = MMC_PROPOSED_RCA;
+ PROBE_SET_ACTION(softc, PROBE_GET_CSD);
+ break;
case PROBE_GET_CSD: {
mmcio = &done_ccb->mmcio;
err = mmcio->cmd.error;

File Metadata

Mime Type
text/plain
Expires
Fri, Oct 9, 10:48 PM (3 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40510240
Default Alt Text
D13063.diff (2 KB)

Event Timeline