svn commit: r323619 - in head/sys: arm/broadcom/bcm2835 cam/mmc conf dev/mmc/host
Ilya Bakulin
kibab at FreeBSD.org
Fri Sep 15 19:47:46 UTC 2017
Author: kibab
Date: Fri Sep 15 19:47:44 2017
New Revision: 323619
URL: https://svnweb.freebsd.org/changeset/base/323619
Log:
Miscellaneous fixes and improvements to MMCCAM stack
* Demote the level of several debug messages to CAM_DEBUG_TRACE
* Add detection for SDHC cards that can do 1.8V. No voltage switch sequence
is issued yet;
* Don't create a separate LUN for each SDIO function. We need just one to make
pass(4) attach;
* Remove obsolete mmc_sdio* files. SDIO functionality will be moved into the
separate device that will manage a new sdio(4) bus;
* Terminate probing if got no reply to CMD0;
* Make bcm2835 SDHCI host controller driver compile with 'option MMCCAM'.
Approved by: imp (mentor)
Differential Revision: https://reviews.freebsd.org/D12109
Deleted:
head/sys/cam/mmc/mmc_sdio.c
head/sys/cam/mmc/mmc_sdio.h
Modified:
head/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
head/sys/cam/mmc/mmc.h
head/sys/cam/mmc/mmc_da.c
head/sys/cam/mmc/mmc_xpt.c
head/sys/conf/files
head/sys/dev/mmc/host/dwmmc.c
Modified: head/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c Fri Sep 15 19:17:30 2017 (r323618)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c Fri Sep 15 19:47:44 2017 (r323619)
@@ -685,4 +685,6 @@ static driver_t bcm_sdhci_driver = {
DRIVER_MODULE(sdhci_bcm, simplebus, bcm_sdhci_driver, bcm_sdhci_devclass,
NULL, NULL);
MODULE_DEPEND(sdhci_bcm, sdhci, 1, 1, 1);
+#ifndef MMCCAM
MMC_DECLARE_BRIDGE(sdhci_bcm);
+#endif
Modified: head/sys/cam/mmc/mmc.h
==============================================================================
--- head/sys/cam/mmc/mmc.h Fri Sep 15 19:17:30 2017 (r323618)
+++ head/sys/cam/mmc/mmc.h Fri Sep 15 19:47:44 2017 (r323619)
@@ -87,6 +87,7 @@ struct mmc_params {
#define CARD_FEATURE_SDIO 0x1 << 2
#define CARD_FEATURE_SD20 0x1 << 3
#define CARD_FEATURE_MMC 0x1 << 4
+#define CARD_FEATURE_18V 0x1 << 5
uint8_t sdio_func_count;
} __packed;
Modified: head/sys/cam/mmc/mmc_da.c
==============================================================================
--- head/sys/cam/mmc/mmc_da.c Fri Sep 15 19:17:30 2017 (r323618)
+++ head/sys/cam/mmc/mmc_da.c Fri Sep 15 19:47:44 2017 (r323619)
@@ -378,8 +378,7 @@ sddaopen(struct disk *dp)
return (error);
}
- CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH,
- ("sddaopen\n"));
+ CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("sddaopen\n"));
softc = (struct sdda_softc *)periph->softc;
softc->flags |= SDDA_FLAG_OPEN;
@@ -403,8 +402,7 @@ sddaclose(struct disk *dp)
cam_periph_lock(periph);
- CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH,
- ("sddaclose\n"));
+ CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("sddaclose\n"));
while (softc->refcount != 0)
cam_periph_sleep(periph, &softc->refcount, PRIBIO, "sddaclose", 1);
Modified: head/sys/cam/mmc/mmc_xpt.c
==============================================================================
--- head/sys/cam/mmc/mmc_xpt.c Fri Sep 15 19:17:30 2017 (r323618)
+++ head/sys/cam/mmc/mmc_xpt.c Fri Sep 15 19:47:44 2017 (r323619)
@@ -58,7 +58,6 @@ __FBSDID("$FreeBSD$");
#include <cam/mmc/mmc.h>
#include <cam/mmc/mmc_bus.h>
-#include <cam/mmc/mmc_sdio.h>
#include <machine/stdarg.h> /* for xpt_print below */
#include <machine/_inttypes.h> /* for PRIu64 */
@@ -162,6 +161,7 @@ typedef struct {
union ccb saved_ccb;
uint32_t flags;
#define PROBE_FLAG_ACMD_SENT 0x1 /* CMD55 is sent, card expects ACMD */
+ uint8_t acmd41_count; /* how many times ACMD41 has been issued */
struct cam_periph *periph;
} mmcprobe_softc;
@@ -219,6 +219,8 @@ mmc_dev_async(u_int32_t async_code, struct cam_eb *bus
printf("Got AC_PATH_REGISTERED -- whatever...\n");
} else if (async_code == AC_PATH_DEREGISTERED ) {
printf("Got AC_PATH_DEREGISTERED -- whatever...\n");
+ } else if (async_code == AC_UNIT_ATTENTION) {
+ printf("Got interrupt generated by the card and ignored it\n");
} else
panic("Unknown async code\n");
}
@@ -299,9 +301,9 @@ mmc_scan_lun(struct cam_periph *periph, struct cam_pat
static void
mmc_action(union ccb *start_ccb)
{
- CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_INFO,
+ CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE,
("mmc_action! func_code=%x, action %s\n", start_ccb->ccb_h.func_code,
- xpt_action_name(start_ccb->ccb_h.func_code)));
+ xpt_action_name(start_ccb->ccb_h.func_code)));
switch (start_ccb->ccb_h.func_code) {
case XPT_SCAN_BUS:
@@ -486,6 +488,7 @@ mmcprobe_register(struct cam_periph *periph, void *arg
}
softc->flags = 0;
+ softc->acmd41_count = 0;
periph->softc = softc;
softc->periph = periph;
softc->action = PROBE_INVALID;
@@ -672,8 +675,12 @@ mmcprobe_start(struct cam_periph *periph, union ccb *s
* We set CCS bit because we do support SDHC cards.
* XXX: Don't set CCS if no response to CMD8.
*/
- mmcio->cmd.arg = MMC_OCR_CCS | mmcp->card_ocr; /* CCS + ocr */
+ uint32_t cmd_arg = MMC_OCR_CCS | mmcp->card_ocr; /* CCS + ocr */
+ if (softc->acmd41_count < 10 && mmcp->card_ocr != 0 )
+ cmd_arg |= MMC_OCR_S18R;
+ mmcio->cmd.arg = cmd_arg;
mmcio->cmd.flags = MMC_RSP_R3 | MMC_CMD_BCR;
+ softc->acmd41_count++;
} else {
mmcio->cmd.opcode = MMC_APP_CMD; /* CMD 55 */
mmcio->cmd.arg = 0; /* rca << 16 */
@@ -769,8 +776,9 @@ mmcprobe_done(struct cam_periph *periph, union ccb *do
/* There was a device there, but now it's gone... */
if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
xpt_async(AC_LOST_DEVICE, path, NULL);
- PROBE_SET_ACTION(softc, PROBE_INVALID);
}
+ PROBE_SET_ACTION(softc, PROBE_INVALID);
+ break;
}
path->device->protocol = PROTO_MMCSD;
PROBE_SET_ACTION(softc, PROBE_SEND_IF_COND);
@@ -936,12 +944,18 @@ mmcprobe_done(struct cam_periph *periph, union ccb *do
mmcp->card_features |= CARD_FEATURE_SDHC;
}
- } else {
- CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE,
- ("Card not ready: %08x\n", mmcio->cmd.resp[0]));
- /* Send CMD55+ACMD41 once again */
- PROBE_SET_ACTION(softc, PROBE_SEND_APP_OP_COND);
- }
+ /* Whether the card supports 1.8V signaling */
+ if (mmcio->cmd.resp[0] & MMC_OCR_S18A) {
+ CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE,
+ ("Card supports 1.8V signaling\n"));
+ mmcp->card_features |= CARD_FEATURE_18V;
+ }
+ } else {
+ CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_PROBE,
+ ("Card not ready: %08x\n", mmcio->cmd.resp[0]));
+ /* Send CMD55+ACMD41 once again */
+ PROBE_SET_ACTION(softc, PROBE_SEND_APP_OP_COND);
+ }
break;
}
@@ -1053,21 +1067,6 @@ mmcprobe_done(struct cam_periph *periph, union ccb *do
done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
xpt_action(done_ccb);
xpt_async(AC_FOUND_DEVICE, path, done_ccb);
- }
-
- /* Also announce each SDIO function */
- struct mmc_params *mmcp = &path->device->mmc_ident_data;
-
- for (int i = 0; i < mmcp->sdio_func_count; i++) {
- struct cam_path *newpath;
- cam_status status;
- status = xpt_create_path(&newpath, NULL,
- done_ccb->ccb_h.path_id, 0, i + 1);
- if (status != CAM_REQ_CMP)
- printf("xpt_create_path failed"
- " with status %#x\n",
- status);
- xpt_async(AC_FOUND_DEVICE, newpath, done_ccb);
}
}
if (softc->action == PROBE_DONE || softc->action == PROBE_INVALID) {
Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Fri Sep 15 19:17:30 2017 (r323618)
+++ head/sys/conf/files Fri Sep 15 19:47:44 2017 (r323619)
@@ -112,7 +112,6 @@ cam/ctl/ctl_util.c optional ctl
cam/ctl/scsi_ctl.c optional ctl
cam/mmc/mmc_xpt.c optional scbus mmccam
cam/mmc/mmc_da.c optional scbus mmccam da
-cam/mmc/mmc_sdio.c optional scbus mmccam
cam/scsi/scsi_da.c optional da
cam/scsi/scsi_low.c optional ncv | nsp | stg
cam/scsi/scsi_pass.c optional pass
Modified: head/sys/dev/mmc/host/dwmmc.c
==============================================================================
--- head/sys/dev/mmc/host/dwmmc.c Fri Sep 15 19:17:30 2017 (r323618)
+++ head/sys/dev/mmc/host/dwmmc.c Fri Sep 15 19:47:44 2017 (r323619)
@@ -59,6 +59,8 @@ __FBSDID("$FreeBSD$");
#include <dev/mmc/host/dwmmc_reg.h>
#include <dev/mmc/host/dwmmc_var.h>
+#include "opt_mmccam.h"
+
#include "mmcbr_if.h"
#define dprintf(x, arg...)
@@ -1181,4 +1183,6 @@ static devclass_t dwmmc_devclass;
DRIVER_MODULE(dwmmc, simplebus, dwmmc_driver, dwmmc_devclass, NULL, NULL);
DRIVER_MODULE(dwmmc, ofwbus, dwmmc_driver, dwmmc_devclass, NULL, NULL);
+#ifndef MMCCAM
MMC_DECLARE_BRIDGE(dwmmc);
+#endif
More information about the svn-src-all
mailing list