svn commit: r355259 - user/nwhitehorn/rtsx

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sun Dec 1 07:44:22 UTC 2019


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);
 }


More information about the svn-src-user mailing list