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
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to