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