From nobody Wed Feb 23 01:05:30 2022 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 9D6EC19DDF1F; Wed, 23 Feb 2022 01:05:30 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4K3Hs640xJz4gNM; Wed, 23 Feb 2022 01:05:30 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645578330; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=TpgRJ/LdgamlDdV+Mun79dN1YSwpXJ+nbY5PvSNH0Tc=; b=Gqbw1fH6yxRIGs8jBSAclZSM46wFVV3Pz3oyWZrMfrHMrrO0QO7ICKF7MFbDzNHrg6iMaS i8OL5w8sO0U4NjQSMJUiNF6XLbaurnyv7TjMqRh2vy0A3YIISdRl8nkN1OAIJ/z5pSApNv 4YNYHfA/1inLTP0Lt55ATjU2mKLy4vQcfidTmXbV1dvBGebysMDbfHOqq+jJNfeRiNxlqP F+XTA62tTGXHf3JuJK0FRk2b8zMIV1DBU5/MvNzm4xCJ1hKAsm/q441MNTZg+cg07f1dbK RgCqC7KvyGrAXwpYi2kpaMUCkw3+oqK5dPmmDuviZRILCSTwzHQVE9TWXko+lw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 689106E13; Wed, 23 Feb 2022 01:05:30 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 21N15UPS047573; Wed, 23 Feb 2022 01:05:30 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 21N15UP3047572; Wed, 23 Feb 2022 01:05:30 GMT (envelope-from git) Date: Wed, 23 Feb 2022 01:05:30 GMT Message-Id: <202202230105.21N15UP3047572@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Alexander Motin Subject: git: 545def055b4a - stable/13 - rtsx: Convert driver to use the mmc_sim interface List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mav X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 545def055b4a25c7df578bde88d518f46d941fec Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1645578330; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=TpgRJ/LdgamlDdV+Mun79dN1YSwpXJ+nbY5PvSNH0Tc=; b=n3fdsz9vwDupv5XyVym2IorneAqby+4XVNRDl9Pj5YrGCR06RPj8CtOjKfXQUgvHKn+NbW 30pYZcDH5k1SFN25k/NZNdTYvjwZIZ9TC0Roybf69KZVqusL9fSSBEs7JTt7Gk7cb/nSNB N46gY/9NeyHjhebswPH6pmziw0X59rQ3J34BUJuls2q4lHlRCvosVzuuwnimQeZSx2NwBd Hl4Me9EHwUilW5C9oT9j+66/ND07YOITe2BXIipC+hfHTB9i/k6icwJsNxjJ9ZXqdNhKAX BwQJ5/NIt4Vlh5HAl4yOgYaBE5JKksnYpyWlMnd6L05xsXzPm/hslRTKunpt6A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1645578330; a=rsa-sha256; cv=none; b=lf2h3qus/FCPwoDI3/1Tz6vMwkEWlj1/s/EO0AGR/KcUnIwF5yqkD7pwGiCb3GK7jmjRJG Z9mMTlcilpBz9I0hjGuJUkFMpDAD015okfwC/PYP/jVo02WrFGV9NSkwGc9Ior5pADa73L S4OiD+d09O0xor6PG/yyZipfQK5Qb3U0NcRrUmb5LIzvuOv2Ri+K20kpm3xiloAgB6kQpr e2GD3VJCeIpD3Mwb1Vs64IVRBWqvyC893RTFqzdXVDVhWGOj8zZGUuaibFPKvxGcqS2z/p cilVw182lf/1By5hch0LhmtG+31RT0O73FzDXlLR/R/UD2KOrg+HnjsULpXbdA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by mav: URL: https://cgit.FreeBSD.org/src/commit/?id=545def055b4a25c7df578bde88d518f46d941fec commit 545def055b4a25c7df578bde88d518f46d941fec Author: Henri Hennebert AuthorDate: 2022-02-03 22:58:57 +0000 Commit: Alexander Motin CommitDate: 2022-02-23 00:39:19 +0000 rtsx: Convert driver to use the mmc_sim interface A lot more generic cam related things were done in mmc_sim so this simplifies the driver a lot. Differential Revision: https://reviews.freebsd.org/D32154 Reviewed by: imp (cherry picked from commit 8e9740b62e950b40dcf7dbe729855be14450d40d) --- sys/dev/rtsx/rtsx.c | 286 ++++++++++++---------------------------------- sys/modules/rtsx/Makefile | 2 +- 2 files changed, 71 insertions(+), 217 deletions(-) diff --git a/sys/dev/rtsx/rtsx.c b/sys/dev/rtsx/rtsx.c index fe27f067b916..696149fa039f 100644 --- a/sys/dev/rtsx/rtsx.c +++ b/sys/dev/rtsx/rtsx.c @@ -67,6 +67,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include "mmc_sim_if.h" #endif /* MMCCAM */ #include "rtsxreg.h" @@ -113,10 +115,8 @@ struct rtsx_softc { bus_addr_t rtsx_data_buffer; /* device visible address of the DMA segment */ #ifdef MMCCAM - struct cam_devq *rtsx_devq; /* CAM queue of requests */ - struct cam_sim *rtsx_sim; /* descriptor of our SCSI Interface Modules (SIM) */ - struct mtx rtsx_sim_mtx; /* SIM mutex */ union ccb *rtsx_ccb; /* CAM control block */ + struct mmc_sim rtsx_mmc_sim; /* CAM generic sim */ struct mmc_request rtsx_cam_req; /* CAM MMC request */ #endif /* MMCCAM */ @@ -169,7 +169,7 @@ struct rtsx_softc { #define RTSX_RTL8411 0x5289 #define RTSX_RTL8411B 0x5287 -#define RTSX_VERSION "2.0i" +#define RTSX_VERSION "2.1b" static const struct rtsx_device { uint16_t vendor_id; @@ -221,6 +221,7 @@ static int rtsx_set_sd_timing(struct rtsx_softc *sc, enum mmc_bus_timing timing) static int rtsx_set_sd_clock(struct rtsx_softc *sc, uint32_t freq); static int rtsx_stop_sd_clock(struct rtsx_softc *sc); static int rtsx_switch_sd_clock(struct rtsx_softc *sc, uint8_t clk, uint8_t n, uint8_t div, uint8_t mcu); +#ifndef MMCCAM static void rtsx_sd_change_tx_phase(struct rtsx_softc *sc, uint8_t sample_point); static void rtsx_sd_change_rx_phase(struct rtsx_softc *sc, uint8_t sample_point); static void rtsx_sd_tuning_rx_phase(struct rtsx_softc *sc, uint32_t *phase_map); @@ -230,6 +231,7 @@ static void rtsx_sd_tuning_rx_cmd_wakeup(struct rtsx_softc *sc); static void rtsx_sd_wait_data_idle(struct rtsx_softc *sc); static uint8_t rtsx_sd_search_final_rx_phase(struct rtsx_softc *sc, uint32_t phase_map); static int rtsx_sd_get_rx_phase_len(uint32_t phase_map, int start_bit); +#endif /* !MMCCAM */ #if 0 /* For led */ static int rtsx_led_enable(struct rtsx_softc *sc); static int rtsx_led_disable(struct rtsx_softc *sc); @@ -260,10 +262,9 @@ static void rtsx_xfer_finish(struct rtsx_softc *sc); static void rtsx_timeout(void *arg); #ifdef MMCCAM -static void rtsx_cam_action(struct cam_sim *sim, union ccb *ccb); -static void rtsx_cam_poll(struct cam_sim *sim); -static void rtsx_cam_set_tran_settings(struct rtsx_softc *sc, union ccb *ccb); -static void rtsx_cam_request(struct rtsx_softc *sc, union ccb *ccb); +static int rtsx_get_tran_settings(device_t dev, struct ccb_trans_settings_mmc *cts); +static int rtsx_set_tran_settings(device_t dev, struct ccb_trans_settings_mmc *cts); +static int rtsx_cam_request(device_t dev, union ccb *ccb); #endif /* MMCCAM */ static int rtsx_read_ivar(device_t bus, device_t child, int which, uintptr_t *result); @@ -271,12 +272,14 @@ static int rtsx_write_ivar(device_t bus, device_t child, int which, uintptr_t va static int rtsx_mmcbr_update_ios(device_t bus, device_t child __unused); static int rtsx_mmcbr_switch_vccq(device_t bus, device_t child __unused); +static int rtsx_mmcbr_request(device_t bus, device_t child __unused, struct mmc_request *req); +#ifndef MMCCAM static int rtsx_mmcbr_tune(device_t bus, device_t child __unused, bool hs400 __unused); static int rtsx_mmcbr_retune(device_t bus, device_t child __unused, bool reset __unused); -static int rtsx_mmcbr_request(device_t bus, device_t child __unused, struct mmc_request *req); static int rtsx_mmcbr_get_ro(device_t bus, device_t child __unused); static int rtsx_mmcbr_acquire_host(device_t bus, device_t child __unused); static int rtsx_mmcbr_release_host(device_t bus, device_t child __unused); +#endif /* !MMCCAM */ static int rtsx_probe(device_t dev); static int rtsx_attach(device_t dev); @@ -644,15 +647,11 @@ rtsx_card_task(void *arg, int pending __unused) { struct rtsx_softc *sc = arg; - RTSX_LOCK(sc); - if (rtsx_is_card_present(sc)) { sc->rtsx_flags |= RTSX_F_CARD_PRESENT; /* Card is present, attach if necessary. */ #ifdef MMCCAM if (sc->rtsx_cam_status == 0) { - union ccb *ccb; - uint32_t pathid; #else /* !MMCCAM */ if (sc->rtsx_mmc_dev == NULL) { #endif /* MMCCAM */ @@ -662,27 +661,9 @@ rtsx_card_task(void *arg, int pending __unused) sc->rtsx_read_count = sc->rtsx_write_count = 0; #ifdef MMCCAM sc->rtsx_cam_status = 1; - pathid = cam_sim_path(sc->rtsx_sim); - ccb = xpt_alloc_ccb_nowait(); - if (ccb == NULL) { - device_printf(sc->rtsx_dev, "Unable to alloc CCB for rescan\n"); - RTSX_UNLOCK(sc); - return; - } - /* - * We create a rescan request for BUS:0:0, since the card - * will be at lun 0. - */ - if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, - /* target */ 0, /* lun */ 0) != CAM_REQ_CMP) { - device_printf(sc->rtsx_dev, "Unable to create path for rescan\n"); - RTSX_UNLOCK(sc); - xpt_free_ccb(ccb); - return; - } - RTSX_UNLOCK(sc); - xpt_rescan(ccb); + mmc_cam_sim_discover(&sc->rtsx_mmc_sim); #else /* !MMCCAM */ + RTSX_LOCK(sc); sc->rtsx_mmc_dev = device_add_child(sc->rtsx_dev, "mmc", -1); RTSX_UNLOCK(sc); if (sc->rtsx_mmc_dev == NULL) { @@ -692,15 +673,12 @@ rtsx_card_task(void *arg, int pending __unused) device_probe_and_attach(sc->rtsx_mmc_dev); } #endif /* MMCCAM */ - } else - RTSX_UNLOCK(sc); + } } else { sc->rtsx_flags &= ~RTSX_F_CARD_PRESENT; /* Card isn't present, detach if necessary. */ #ifdef MMCCAM if (sc->rtsx_cam_status != 0) { - union ccb *ccb; - uint32_t pathid; #else /* !MMCCAM */ if (sc->rtsx_mmc_dev != NULL) { #endif /* MMCCAM */ @@ -712,34 +690,13 @@ rtsx_card_task(void *arg, int pending __unused) sc->rtsx_read_count, sc->rtsx_write_count); #ifdef MMCCAM sc->rtsx_cam_status = 0; - pathid = cam_sim_path(sc->rtsx_sim); - ccb = xpt_alloc_ccb_nowait(); - if (ccb == NULL) { - device_printf(sc->rtsx_dev, "Unable to alloc CCB for rescan\n"); - RTSX_UNLOCK(sc); - return; - } - /* - * We create a rescan request for BUS:0:0, since the card - * will be at lun 0. - */ - if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid, - /* target */ 0, /* lun */ 0) != CAM_REQ_CMP) { - device_printf(sc->rtsx_dev, "Unable to create path for rescan\n"); - RTSX_UNLOCK(sc); - xpt_free_ccb(ccb); - return; - } - RTSX_UNLOCK(sc); - xpt_rescan(ccb); + mmc_cam_sim_discover(&sc->rtsx_mmc_sim); #else /* !MMCCAM */ - RTSX_UNLOCK(sc); if (device_delete_child(sc->rtsx_dev, sc->rtsx_mmc_dev)) device_printf(sc->rtsx_dev, "Detaching MMC bus failed\n"); sc->rtsx_mmc_dev = NULL; #endif /* MMCCAM */ - } else - RTSX_UNLOCK(sc); + } } } @@ -1890,6 +1847,7 @@ rtsx_switch_sd_clock(struct rtsx_softc *sc, uint8_t clk, uint8_t n, uint8_t div, return (0); } +#ifndef MMCCAM static void rtsx_sd_change_tx_phase(struct rtsx_softc *sc, uint8_t sample_point) { @@ -2062,6 +2020,7 @@ rtsx_sd_get_rx_phase_len(uint32_t phase_map, int start_bit) } return RTSX_RX_PHASE_MAX; } +#endif /* !MMCCAM */ #if 0 /* For led */ static int @@ -2874,120 +2833,36 @@ rtsx_timeout(void *arg) } #ifdef MMCCAM -static void -rtsx_cam_action(struct cam_sim *sim, union ccb *ccb) +static int +rtsx_get_tran_settings(device_t dev, struct ccb_trans_settings_mmc *cts) { struct rtsx_softc *sc; - sc = cam_sim_softc(sim); - if (sc == NULL) { - ccb->ccb_h.status = CAM_SEL_TIMEOUT; - xpt_done(ccb); - return; - } - switch (ccb->ccb_h.func_code) { - case XPT_PATH_INQ: - { - struct ccb_pathinq *cpi = &ccb->cpi; - - cpi->version_num = 1; /* SIM driver version number - now all drivers use 1 */ - cpi->hba_inquiry = 0; /* bitmask of features supported by the controller */ - cpi->target_sprt = 0; /* flags for target mode support */ - cpi->hba_misc = PIM_NOBUSRESET | PIM_SEQSCAN; - cpi->hba_eng_cnt = 0; /* HBA engine count - always set to 0 */ - cpi->max_target = 0; /* maximal supported target ID */ - cpi->max_lun = 0; /* maximal supported LUN ID */ - cpi->initiator_id = 1; /* the SCSI ID of the controller itself */ - cpi->maxio = RTSX_DMA_DATA_BUFSIZE; /* maximum io size */ - strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); /* vendor ID of the SIM */ - strncpy(cpi->hba_vid, "Realtek", HBA_IDLEN); /* vendor ID of the HBA */ - strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); /* device name for SIM */ - cpi->unit_number = cam_sim_unit(sim); /* controller unit number */ - cpi->bus_id = cam_sim_bus(sim); /* bus number */ - cpi->protocol = PROTO_MMCSD; - cpi->protocol_version = SCSI_REV_0; - cpi->transport = XPORT_MMCSD; - cpi->transport_version = 1; - - cpi->ccb_h.status = CAM_REQ_CMP; - break; - } - case XPT_MMC_GET_TRAN_SETTINGS: - case XPT_GET_TRAN_SETTINGS: - { - struct ccb_trans_settings *cts = &ccb->cts; - - if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_action() - got XPT_GET_TRAN_SETTINGS\n"); - - cts->protocol = PROTO_MMCSD; - cts->protocol_version = 1; - cts->transport = XPORT_MMCSD; - cts->transport_version = 1; - cts->xport_specific.valid = 0; - cts->proto_specific.mmc.host_ocr = sc->rtsx_host.host_ocr; - cts->proto_specific.mmc.host_f_min = sc->rtsx_host.f_min; - cts->proto_specific.mmc.host_f_max = sc->rtsx_host.f_max; - cts->proto_specific.mmc.host_caps = sc->rtsx_host.caps; -#if __FreeBSD__ > 12 - cts->proto_specific.mmc.host_max_data = RTSX_DMA_DATA_BUFSIZE / MMC_SECTOR_SIZE; -#endif - memcpy(&cts->proto_specific.mmc.ios, &sc->rtsx_host.ios, sizeof(struct mmc_ios)); - - ccb->ccb_h.status = CAM_REQ_CMP; - break; - } - case XPT_MMC_SET_TRAN_SETTINGS: - case XPT_SET_TRAN_SETTINGS: - if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_action() - got XPT_SET_TRAN_SETTINGS\n"); - - /* Apply settings and set ccb->ccb_h.status accordingly. */ - rtsx_cam_set_tran_settings(sc, ccb); - break; - case XPT_RESET_BUS: - if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "got XPT_RESET_BUS, ACK it...\n"); + sc = device_get_softc(dev); - ccb->ccb_h.status = CAM_REQ_CMP; - break; - case XPT_MMC_IO: - /* - * Here is the HW-dependent part of sending - * the command to the underlying h/w. - * At some point in the future an interrupt comes - * and the request will be marked as completed. - */ - ccb->ccb_h.status = CAM_REQ_INPROG; + cts->host_ocr = sc->rtsx_host.host_ocr; + cts->host_f_min = sc->rtsx_host.f_min; + cts->host_f_max = sc->rtsx_host.f_max; + cts->host_caps = sc->rtsx_host.caps; + cts->host_max_data = RTSX_DMA_DATA_BUFSIZE / MMC_SECTOR_SIZE; + memcpy(&cts->ios, &sc->rtsx_host.ios, sizeof(struct mmc_ios)); - rtsx_cam_request(sc, ccb); - return; - default: - ccb->ccb_h.status = CAM_REQ_INVALID; - break; - } - xpt_done(ccb); - return; -} - -static void -rtsx_cam_poll(struct cam_sim *sim) -{ - return; + return (0); } /* - * Apply settings and set ccb->ccb_h.status accordingly. + * Apply settings and return status accordingly. */ -static void -rtsx_cam_set_tran_settings(struct rtsx_softc *sc, union ccb *ccb) +static int +rtsx_set_tran_settings(device_t dev, struct ccb_trans_settings_mmc *cts) { + struct rtsx_softc *sc; struct mmc_ios *ios; struct mmc_ios *new_ios; - struct ccb_trans_settings_mmc *cts; + + sc = device_get_softc(dev); ios = &sc->rtsx_host.ios; - cts = &ccb->cts.proto_specific.mmc; new_ios = &cts->ios; /* Update only requested fields */ @@ -2995,68 +2870,69 @@ rtsx_cam_set_tran_settings(struct rtsx_softc *sc, union ccb *ccb) ios->clock = new_ios->clock; sc->rtsx_ios_clock = -1; /* To be updated by rtsx_mmcbr_update_ios(). */ if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - clock: %u\n", ios->clock); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - clock: %u\n", ios->clock); } if (cts->ios_valid & MMC_VDD) { ios->vdd = new_ios->vdd; if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - vdd: %d\n", ios->vdd); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - vdd: %d\n", ios->vdd); } if (cts->ios_valid & MMC_CS) { ios->chip_select = new_ios->chip_select; if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - chip_select: %d\n", ios->chip_select); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - chip_select: %d\n", ios->chip_select); } if (cts->ios_valid & MMC_BW) { ios->bus_width = new_ios->bus_width; sc->rtsx_ios_bus_width = -1; /* To be updated by rtsx_mmcbr_update_ios(). */ if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - bus width: %d\n", ios->bus_width); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - bus width: %d\n", ios->bus_width); } if (cts->ios_valid & MMC_PM) { ios->power_mode = new_ios->power_mode; sc->rtsx_ios_power_mode = -1; /* To be updated by rtsx_mmcbr_update_ios(). */ if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - power mode: %d\n", ios->power_mode); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - power mode: %d\n", ios->power_mode); } if (cts->ios_valid & MMC_BT) { ios->timing = new_ios->timing; sc->rtsx_ios_timing = -1; /* To be updated by rtsx_mmcbr_update_ios(). */ if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - timing: %d\n", ios->timing); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - timing: %d\n", ios->timing); } if (cts->ios_valid & MMC_BM) { ios->bus_mode = new_ios->bus_mode; if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - bus mode: %d\n", ios->bus_mode); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - bus mode: %d\n", ios->bus_mode); } #if __FreeBSD__ > 12 if (cts->ios_valid & MMC_VCCQ) { ios->vccq = new_ios->vccq; sc->rtsx_ios_vccq = -1; /* To be updated by rtsx_mmcbr_update_ios(). */ if (bootverbose || sc->rtsx_debug) - device_printf(sc->rtsx_dev, "rtsx_cam_set_tran_settings() - vccq: %d\n", ios->vccq); + device_printf(sc->rtsx_dev, "rtsx_set_tran_settings() - vccq: %d\n", ios->vccq); } #endif /* __FreeBSD__ > 12 */ if (rtsx_mmcbr_update_ios(sc->rtsx_dev, NULL) == 0) - ccb->ccb_h.status = CAM_REQ_CMP; + return (CAM_REQ_CMP); else - ccb->ccb_h.status = CAM_REQ_CMP_ERR; - - return; + return (CAM_REQ_CMP_ERR); } /* * Build a request and run it. */ -static void -rtsx_cam_request(struct rtsx_softc *sc, union ccb *ccb) +static int +rtsx_cam_request(device_t dev, union ccb *ccb) { + struct rtsx_softc *sc; + + sc = device_get_softc(dev); + RTSX_LOCK(sc); if (sc->rtsx_ccb != NULL) { RTSX_UNLOCK(sc); - ccb->ccb_h.status = CAM_BUSY; /* i.e. CAM_REQ_CMP | CAM_REQ_CMP_ERR */ - return; + return (CAM_BUSY); } sc->rtsx_ccb = ccb; sc->rtsx_cam_req.cmd = &ccb->mmcio.cmd; @@ -3064,7 +2940,7 @@ rtsx_cam_request(struct rtsx_softc *sc, union ccb *ccb) RTSX_UNLOCK(sc); rtsx_mmcbr_request(sc->rtsx_dev, NULL, &sc->rtsx_cam_req); - return; + return (0); } #endif /* MMCCAM */ @@ -3343,6 +3219,7 @@ rtsx_mmcbr_switch_vccq(device_t bus, device_t child __unused) return (0); } +#ifndef MMCCAM /* * Tune card if bus_timing_uhs_sdr50. */ @@ -3435,6 +3312,7 @@ rtsx_mmcbr_retune(device_t bus, device_t child __unused, bool reset __unused) return (0); } +#endif /* !MMCCAM */ static int rtsx_mmcbr_request(device_t bus, device_t child __unused, struct mmc_request *req) @@ -3509,6 +3387,7 @@ rtsx_mmcbr_request(device_t bus, device_t child __unused, struct mmc_request *re return (error); } +#ifndef MMCCAM static int rtsx_mmcbr_get_ro(device_t bus, device_t child __unused) { @@ -3556,6 +3435,7 @@ rtsx_mmcbr_release_host(device_t bus, device_t child __unused) return (0); } +#endif /* !MMCCAM */ /* * @@ -3726,25 +3606,11 @@ rtsx_attach(device_t dev) SYSCTL_ADD_U8(ctx, tree, OID_AUTO, "cam_status", CTLFLAG_RD, &sc->rtsx_cam_status, 0, "driver cam card present"); - if ((sc->rtsx_devq = cam_simq_alloc(1)) == NULL) { - device_printf(dev, "Error during CAM queue allocation\n"); - goto destroy_rtsx_irq; - } - mtx_init(&sc->rtsx_sim_mtx, "rtsxsim", NULL, MTX_DEF); - sc->rtsx_sim = cam_sim_alloc(rtsx_cam_action, rtsx_cam_poll, - "rtsx", sc, device_get_unit(dev), - &sc->rtsx_sim_mtx, 1, 1, sc->rtsx_devq); - if (sc->rtsx_sim == NULL) { + + if (mmc_cam_sim_alloc(dev, "rtsx_mmc", &sc->rtsx_mmc_sim) != 0) { device_printf(dev, "Can't allocate CAM SIM\n"); goto destroy_rtsx_irq; } - mtx_lock(&sc->rtsx_sim_mtx); - if (xpt_bus_register(sc->rtsx_sim, dev, 0) != 0) { - device_printf(dev, "Can't register SCSI pass-through bus\n"); - mtx_unlock(&sc->rtsx_sim_mtx); - goto destroy_rtsx_irq; - } - mtx_unlock(&sc->rtsx_sim_mtx); #endif /* MMCCAM */ /* Initialize device. */ @@ -3784,18 +3650,6 @@ rtsx_attach(device_t dev) sc->rtsx_irq_res); pci_release_msi(dev); RTSX_LOCK_DESTROY(sc); -#ifdef MMCCAM - if (sc->rtsx_sim != NULL) { - mtx_lock(&sc->rtsx_sim_mtx); - xpt_bus_deregister(cam_sim_path(sc->rtsx_sim)); - cam_sim_free(sc->rtsx_sim, FALSE); - mtx_unlock(&sc->rtsx_sim_mtx); - } - if (sc->rtsx_devq != NULL) { - mtx_destroy(&sc->rtsx_sim_mtx); - cam_simq_free(sc->rtsx_devq); - } -#endif /* MMCCAM */ return (ENXIO); } @@ -3838,16 +3692,7 @@ rtsx_detach(device_t dev) } RTSX_LOCK_DESTROY(sc); #ifdef MMCCAM - if (sc->rtsx_sim != NULL) { - mtx_lock(&sc->rtsx_sim_mtx); - xpt_bus_deregister(cam_sim_path(sc->rtsx_sim)); - cam_sim_free(sc->rtsx_sim, FALSE); - mtx_unlock(&sc->rtsx_sim_mtx); - } - if (sc->rtsx_devq != NULL) { - mtx_destroy(&sc->rtsx_sim_mtx); - cam_simq_free(sc->rtsx_devq); - } + mmc_cam_sim_free(&sc->rtsx_mmc_sim); #endif /* MMCCAM */ return (0); @@ -3917,6 +3762,7 @@ static device_method_t rtsx_methods[] = { DEVMETHOD(bus_read_ivar, rtsx_read_ivar), DEVMETHOD(bus_write_ivar, rtsx_write_ivar), +#ifndef MMCCAM /* MMC bridge interface */ DEVMETHOD(mmcbr_update_ios, rtsx_mmcbr_update_ios), DEVMETHOD(mmcbr_switch_vccq, rtsx_mmcbr_switch_vccq), @@ -3926,6 +3772,14 @@ static device_method_t rtsx_methods[] = { DEVMETHOD(mmcbr_get_ro, rtsx_mmcbr_get_ro), DEVMETHOD(mmcbr_acquire_host, rtsx_mmcbr_acquire_host), DEVMETHOD(mmcbr_release_host, rtsx_mmcbr_release_host), +#endif /* !MMCCAM */ + +#ifdef MMCCAM + /* MMCCAM interface */ + DEVMETHOD(mmc_sim_get_tran_settings, rtsx_get_tran_settings), + DEVMETHOD(mmc_sim_set_tran_settings, rtsx_set_tran_settings), + DEVMETHOD(mmc_sim_cam_request, rtsx_cam_request), +#endif /* MMCCAM */ DEVMETHOD_END }; @@ -3936,4 +3790,4 @@ DEFINE_CLASS_0(rtsx, rtsx_driver, rtsx_methods, sizeof(struct rtsx_softc)); DRIVER_MODULE(rtsx, pci, rtsx_driver, rtsx_devclass, NULL, NULL); #ifndef MMCCAM MMC_DECLARE_BRIDGE(rtsx); -#endif /* MMCCAM */ +#endif /* !MMCCAM */ diff --git a/sys/modules/rtsx/Makefile b/sys/modules/rtsx/Makefile index 7fc7457741d3..7deecf4719b4 100644 --- a/sys/modules/rtsx/Makefile +++ b/sys/modules/rtsx/Makefile @@ -4,6 +4,6 @@ KMOD= rtsx SRCS= rtsx.c -SRCS+= device_if.h bus_if.h pci_if.h mmcbr_if.h opt_mmccam.h opt_cam.h +SRCS+= device_if.h bus_if.h pci_if.h mmcbr_if.h opt_mmccam.h opt_cam.h mmc_sim_if.h .include