From owner-svn-src-user@freebsd.org Sun Dec 1 07:44:22 2019 Return-Path: Delivered-To: svn-src-user@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 24AF01C25C4 for ; Sun, 1 Dec 2019 07:44:22 +0000 (UTC) (envelope-from nwhitehorn@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) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 47QgHV07rRz4YHt; Sun, 1 Dec 2019 07:44:22 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id DC646B81E; Sun, 1 Dec 2019 07:44:21 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id xB17iLFk062013; Sun, 1 Dec 2019 07:44:21 GMT (envelope-from nwhitehorn@FreeBSD.org) Received: (from nwhitehorn@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id xB17iLfB062011; Sun, 1 Dec 2019 07:44:21 GMT (envelope-from nwhitehorn@FreeBSD.org) Message-Id: <201912010744.xB17iLfB062011@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: nwhitehorn set sender to nwhitehorn@FreeBSD.org using -f From: Nathan Whitehorn Date: Sun, 1 Dec 2019 07:44:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r355259 - user/nwhitehorn/rtsx X-SVN-Group: user X-SVN-Commit-Author: nwhitehorn X-SVN-Commit-Paths: user/nwhitehorn/rtsx X-SVN-Commit-Revision: 355259 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 Dec 2019 07:44:22 -0000 Author: nwhitehorn Date: Sun Dec 1 07:44:21 2019 New Revision: 355259 URL: https://svnweb.freebsd.org/changeset/base/355259 Log: Checkpoint rtsx(4) bring-up. Now can communicate a little with the card, but hitting some checksum errors that suggest the card isn't really happy. No longer crashes the kernel. Modified: user/nwhitehorn/rtsx/rtsx.c user/nwhitehorn/rtsx/rtsx_pci.c Modified: user/nwhitehorn/rtsx/rtsx.c ============================================================================== --- user/nwhitehorn/rtsx/rtsx.c Sun Dec 1 04:00:08 2019 (r355258) +++ user/nwhitehorn/rtsx/rtsx.c Sun Dec 1 07:44:21 2019 (r355259) @@ -904,7 +904,7 @@ rtsx_xfer(struct rtsx_softc *sc, struct mmc_command *c DPRINTF(3, "%s xfer: %zd bytes with block size %zd\n", read ? "read" : "write", - cmd->data->len, cmd->data->xfer_len); + cmd->data->len, cmd->data->block_size); if (cmd->data->len > RTSX_DMA_DATA_BUFSIZE) { DPRINTF(3, "cmd->data->len too large: %zd > %d\n", @@ -939,16 +939,16 @@ rtsx_xfer(struct rtsx_softc *sc, struct mmc_command *c /* Queue commands to configure data transfer size. */ rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BYTE_CNT_L, 0xff, - (cmd->data->xfer_len & 0xff)); + (cmd->data->block_size & 0xff)); rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BYTE_CNT_H, 0xff, - (cmd->data->xfer_len >> 8)); + (cmd->data->block_size >> 8)); rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BLOCK_CNT_L, 0xff, - ((cmd->data->len / cmd->data->xfer_len) & 0xff)); + (cmd->data->block_count & 0xff)); rtsx_hostcmd(cmdbuf, &ncmd, RTSX_WRITE_REG_CMD, RTSX_SD_BLOCK_CNT_H, 0xff, - ((cmd->data->len / cmd->data->xfer_len) >> 8)); + (cmd->data->block_count >> 8)); /* Use the DMA ring buffer for commands which transfer data. */ rtsx_hostcmd(cmdbuf, &ncmd, @@ -978,6 +978,10 @@ rtsx_xfer(struct rtsx_softc *sc, struct mmc_command *c RTSX_CHECK_REG_CMD, RTSX_SD_TRANSFER, RTSX_SD_TRANSFER_END, RTSX_SD_TRANSFER_END); + /* Load and sync command DMA buffer. */ + bus_dmamap_sync(sc->cmd_tag, sc->dmap_cmd, BUS_DMASYNC_PREREAD); + bus_dmamap_sync(sc->cmd_tag, sc->dmap_cmd, BUS_DMASYNC_PREWRITE); + error = rtsx_hostcmd_send(sc, ncmd); if (error) goto ret; @@ -995,6 +999,7 @@ rtsx_xfer_adma_callback(void *xsc, bus_dma_segment_t * uint64_t *descp; int i; +printf("Mapping DMA for %d segments, error %d\n", nsegs, error); if (error != 0) { sc->cur_req->cmd->error = error; return; @@ -1005,6 +1010,7 @@ rtsx_xfer_adma_callback(void *xsc, bus_dma_segment_t * for (i = 0; i < nsegs; i++) { uint64_t paddr = segs[i].ds_addr; uint64_t len = segs[i].ds_len; +printf("\tSeg %d at %#lx (%zd bytes)\n", i, paddr, len); uint8_t sgflags = RTSX_SG_VALID | RTSX_SG_TRANS_DATA; uint64_t desc; @@ -1034,6 +1040,12 @@ rtsx_xfer_adma(struct rtsx_softc *sc, struct mmc_comma return cmd->error; } bus_dmamap_sync(sc->adma_tag, sc->dmap_adma, BUS_DMASYNC_PREWRITE); + if (read) + bus_dmamap_sync(sc->data_tag, sc->dmap_data, + BUS_DMASYNC_PREREAD); + else + bus_dmamap_sync(sc->data_tag, sc->dmap_data, + BUS_DMASYNC_PREWRITE); /* Tell the chip where the data buffer is and run the transfer. */ WRITE4(sc, RTSX_HDBAR, sc->adma_segs[0].ds_addr); @@ -1072,10 +1084,10 @@ rtsx_request(device_t bus, device_t child, struct mmc_ goto ret; } - rsp_type = rtsx_response_type(cmd->flags & 0xff00); + rsp_type = rtsx_response_type(MMC_RSP(cmd->flags)); if (rsp_type == 0) { - device_printf(sc->sc_dev, "unknown response type 0x%x\n", - (cmd->flags & 0xff00)); + device_printf(sc->sc_dev, "unknown response type 0x%lx\n", + MMC_RSP(cmd->flags)); error = EINVAL; goto ret; } @@ -1145,6 +1157,7 @@ ret: cmd->flags |= MMC_REQ_DONE; cmd->error = error; +printf("Error @ %d: %d\n", __LINE__, error); req->done(req); return (0); @@ -1156,7 +1169,7 @@ rtsx_request2(device_t bus, device_t child, struct mmc struct rtsx_softc *sc = device_get_softc(bus); struct mmc_command *cmd = req->cmd; u_int32_t *cmdbuf = (u_int32_t *)sc->cmdbuf; - int error; + int i, error; mtx_assert(&sc->sc_mtx, MA_LOCKED); @@ -1167,6 +1180,7 @@ rtsx_request2(device_t bus, device_t child, struct mmc cmd->flags |= MMC_REQ_DONE; cmd->error = error; +printf("Error @ %d: %d\n", __LINE__, error); req->done(req); return (0); } @@ -1174,19 +1188,23 @@ rtsx_request2(device_t bus, device_t child, struct mmc bus_dmamap_sync(sc->cmd_tag, sc->dmap_cmd, BUS_DMASYNC_POSTREAD); bus_dmamap_sync(sc->cmd_tag, sc->dmap_cmd, BUS_DMASYNC_POSTWRITE); - /* Copy card response into mmc response buffer. */ + /* + * Copy card response into mmc response buffer, + * First byte is CHECK_REG_CMD return value, second is a check code + */ if (cmd->flags & MMC_RSP_PRESENT) { - /* Copy bytes like sdhci(4), which on little-endian uses - * different byte order for short and long responses... */ + caddr_t rspbuf = (caddr_t)sc->cmdbuf + 2; /* skip status */ if (cmd->flags & MMC_RSP_136) { - memcpy(cmd->resp, (caddr_t)sc->cmdbuf + 1, - sizeof(cmd->resp)); + rspbuf[15] = 1; + for (i = 0; i < 4; i++) { + memcpy(&cmd->resp[i], + rspbuf + i*sizeof(cmd->resp[i]), + sizeof(cmd->resp[i])); + cmd->resp[i] = be32toh(cmd->resp[i]); + } } else { - /* First byte is CHECK_REG_CMD return value, second - * one is the command op code -- we skip those. */ - cmd->resp[0] = - ((be32toh(cmdbuf[0]) & 0x0000ffff) << 16) | - ((be32toh(cmdbuf[1]) & 0xffff0000) >> 16); + memcpy(&cmd->resp[0], rspbuf, sizeof(cmd->resp[0])); + cmd->resp[0] = be32toh(cmd->resp[0]); } } @@ -1194,13 +1212,13 @@ rtsx_request2(device_t bus, device_t child, struct mmc error = rtsx_xfer(sc, cmd, cmdbuf); sc->next_req_func = rtsx_request3; - return (0); } else { sc->cur_req = NULL; sc->next_req_func = NULL; cmd->flags |= MMC_REQ_DONE; cmd->error = error; +printf("Error @ %d: %d\n", __LINE__, error); req->done(req); } @@ -1218,7 +1236,7 @@ rtsx_request3(device_t bus, device_t child, struct mmc error = rtsx_intr_status(sc, RTSX_TRANS_OK_INT, 10*hz); - bus_dmamap_sync(sc->adma_tag, sc->dmap_adma, BUS_DMASYNC_POSTWRITE); + bus_dmamap_sync(sc->data_tag, sc->dmap_data, BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(sc->data_tag, sc->dmap_data); if (error) { @@ -1234,6 +1252,7 @@ rtsx_request3(device_t bus, device_t child, struct mmc cmd->flags |= MMC_REQ_DONE; cmd->error = error; +printf("Error @ %d: %d\n", __LINE__, error); req->done(req); return (0); @@ -1534,8 +1553,10 @@ ret: int rtsx_switch_vccq(device_t brdev, device_t reqdev) { - device_printf(brdev, "%s\n", __func__); - return (ENXIO); + struct rtsx_softc *sc; + + sc = device_get_softc(brdev); + return (rtsx_bus_power_on(sc)); } int Modified: user/nwhitehorn/rtsx/rtsx_pci.c ============================================================================== --- user/nwhitehorn/rtsx/rtsx_pci.c Sun Dec 1 04:00:08 2019 (r355258) +++ user/nwhitehorn/rtsx/rtsx_pci.c Sun Dec 1 07:44:21 2019 (r355259) @@ -133,7 +133,6 @@ rtsx_pci_probe(device_t dev) if (tbl == NULL) return (ENXIO); device_set_desc(dev, tbl->descr); -printf("AHOY\n"); return (BUS_PROBE_DEFAULT); }