Module Name: src Committed By: jdc Date: Mon May 11 14:55:20 UTC 2020
Modified Files: src/sys/dev/ic: w83l518d.c w83l518d_sdmmc.c w83l518dvar.h Log Message: Make the driver endian-independent. Add a quirk so that the bus front end can specify 1-bit only mode. Remove unused isa includes. Change the error returned for unsupported opcodes to ENOTSUP, so that we can pass this back to sdmmc_mem, where it's handled since r1.72 of src/sys/dev/sdmmc/sdmmc_mem.c To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/w83l518d.c \ src/sys/dev/ic/w83l518dvar.h cvs rdiff -u -r1.3 -r1.4 src/sys/dev/ic/w83l518d_sdmmc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ic/w83l518d.c diff -u src/sys/dev/ic/w83l518d.c:1.2 src/sys/dev/ic/w83l518d.c:1.3 --- src/sys/dev/ic/w83l518d.c:1.2 Thu Aug 19 14:58:22 2010 +++ src/sys/dev/ic/w83l518d.c Mon May 11 14:55:20 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: w83l518d.c,v 1.2 2010/08/19 14:58:22 jmcneill Exp $ */ +/* $NetBSD: w83l518d.c,v 1.3 2020/05/11 14:55:20 jdc Exp $ */ /* * Copyright (c) 2009 Jared D. McNeill <jmcne...@invisible.ca> @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: w83l518d.c,v 1.2 2010/08/19 14:58:22 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: w83l518d.c,v 1.3 2020/05/11 14:55:20 jdc Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -39,9 +39,6 @@ __KERNEL_RCSID(0, "$NetBSD: w83l518d.c,v #include <sys/bus.h> -#include <dev/isa/isavar.h> -#include <dev/isa/isadmavar.h> - #include <dev/ic/w83l518dreg.h> #include <dev/ic/w83l518dvar.h> #include <dev/ic/w83l518d_sdmmc.h> Index: src/sys/dev/ic/w83l518dvar.h diff -u src/sys/dev/ic/w83l518dvar.h:1.2 src/sys/dev/ic/w83l518dvar.h:1.3 --- src/sys/dev/ic/w83l518dvar.h:1.2 Thu Aug 19 14:58:22 2010 +++ src/sys/dev/ic/w83l518dvar.h Mon May 11 14:55:20 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: w83l518dvar.h,v 1.2 2010/08/19 14:58:22 jmcneill Exp $ */ +/* $NetBSD: w83l518dvar.h,v 1.3 2020/05/11 14:55:20 jdc Exp $ */ /* * Copyright (c) 2009 Jared D. McNeill <jmcne...@invisible.ca> @@ -44,6 +44,10 @@ struct wb_softc { uint8_t wb_sdmmc_clk; uint8_t wb_sdmmc_intsts; callout_t wb_sdmmc_callout; + + /* quirks */ +#define WB_QUIRK_1BIT (1U << 0) + int wb_quirks; }; void wb_attach(struct wb_softc *); Index: src/sys/dev/ic/w83l518d_sdmmc.c diff -u src/sys/dev/ic/w83l518d_sdmmc.c:1.3 src/sys/dev/ic/w83l518d_sdmmc.c:1.4 --- src/sys/dev/ic/w83l518d_sdmmc.c:1.3 Thu Oct 7 12:06:09 2010 +++ src/sys/dev/ic/w83l518d_sdmmc.c Mon May 11 14:55:20 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: w83l518d_sdmmc.c,v 1.3 2010/10/07 12:06:09 kiyohara Exp $ */ +/* $NetBSD: w83l518d_sdmmc.c,v 1.4 2020/05/11 14:55:20 jdc Exp $ */ /* * Copyright (c) 2009 Jared D. McNeill <jmcne...@invisible.ca> @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: w83l518d_sdmmc.c,v 1.3 2010/10/07 12:06:09 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: w83l518d_sdmmc.c,v 1.4 2020/05/11 14:55:20 jdc Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -43,9 +43,6 @@ __KERNEL_RCSID(0, "$NetBSD: w83l518d_sdm #include <dev/sdmmc/sdmmcchip.h> #include <dev/sdmmc/sdmmc_ioreg.h> -#include <dev/isa/isavar.h> -#include <dev/isa/isadmavar.h> - #include <dev/ic/w83l518dreg.h> #include <dev/ic/w83l518dvar.h> #include <dev/ic/w83l518d_sdmmc.h> @@ -185,7 +182,8 @@ wb_sdmmc_attach(struct wb_softc *wb) saa.saa_sch = wb; saa.saa_clkmin = 375; saa.saa_clkmax = 24000; - saa.saa_caps = SMC_CAPS_4BIT_MODE; + if (!ISSET(wb->wb_quirks, WB_QUIRK_1BIT)) + saa.saa_caps = SMC_CAPS_4BIT_MODE; wb->wb_sdmmc_dev = config_found(wb->wb_dev, &saa, NULL); } @@ -268,7 +266,7 @@ wb_sdmmc_write_protect(sdmmc_chipset_han static int wb_sdmmc_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr) { - REPORT(sch, "TRACE: sdmmc/bus_power(wb, ocr=%d)\n", ocr); + REPORT(sch, "TRACE: sdmmc/bus_power(wb, ocr=%x)\n", ocr); return 0; } @@ -334,10 +332,19 @@ wb_sdmmc_rsp_read_long(struct wb_softc * } for (i = 12; i >= 0; i -= 4) { +#if BYTE_ORDER == LITTLE_ENDIAN p[3] = wb_idx_read(wb, WB_INDEX_RESP(i + 0)); p[2] = wb_idx_read(wb, WB_INDEX_RESP(i + 1)); p[1] = wb_idx_read(wb, WB_INDEX_RESP(i + 2)); p[0] = wb_idx_read(wb, WB_INDEX_RESP(i + 3)); +#else + p[0] = wb_idx_read(wb, WB_INDEX_RESP(i + 0)); + p[1] = wb_idx_read(wb, WB_INDEX_RESP(i + 1)); + p[2] = wb_idx_read(wb, WB_INDEX_RESP(i + 2)); + p[3] = wb_idx_read(wb, WB_INDEX_RESP(i + 3)); +#endif + REPORT(wb, "TRACE: sdmmc/read_long (%d) 0x%08x\n", + (12 - i) / 4, cmd->c_resp[(12 - i) / 4]); p += 4; } } @@ -352,10 +359,19 @@ wb_sdmmc_rsp_read_short(struct wb_softc return; } +#if BYTE_ORDER == LITTLE_ENDIAN p[3] = wb_idx_read(wb, WB_INDEX_RESP(12)); p[2] = wb_idx_read(wb, WB_INDEX_RESP(13)); p[1] = wb_idx_read(wb, WB_INDEX_RESP(14)); p[0] = wb_idx_read(wb, WB_INDEX_RESP(15)); +#else + p[0] = wb_idx_read(wb, WB_INDEX_RESP(12)); + p[1] = wb_idx_read(wb, WB_INDEX_RESP(13)); + p[2] = wb_idx_read(wb, WB_INDEX_RESP(14)); + p[3] = wb_idx_read(wb, WB_INDEX_RESP(15)); +#endif + REPORT(wb, "TRACE: sdmmc/read_short 0x%08x\n", + cmd->c_resp[0]); } static int @@ -430,8 +446,9 @@ wb_sdmmc_exec_command(sdmmc_chipset_hand int s; REPORT(wb, "TRACE: sdmmc/exec_command(wb, cmd) " - "opcode %d flags 0x%x data %p datalen %d\n", - cmd->c_opcode, cmd->c_flags, cmd->c_data, cmd->c_datalen); + "opcode %d flags 0x%x data %p datalen %d arg 0x%08x\n", + cmd->c_opcode, cmd->c_flags, cmd->c_data, cmd->c_datalen, + cmd->c_arg); if (cmd->c_datalen > 0) { /* controller only supports a select number of data opcodes */ @@ -439,7 +456,9 @@ wb_sdmmc_exec_command(sdmmc_chipset_hand if (opcodes[i] == cmd->c_opcode) break; if (i == __arraycount(opcodes)) { - cmd->c_error = EINVAL; + cmd->c_error = ENOTSUP; + aprint_debug_dev(wb->wb_dev, + "unsupported opcode %d\n", cmd->c_opcode); goto done; }