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