Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/ic Make the driver endian-independent.



details:   https://anonhg.NetBSD.org/src/rev/2ecc0bb3bf61
branches:  trunk
changeset: 932564:2ecc0bb3bf61
user:      jdc <jdc%NetBSD.org@localhost>
date:      Mon May 11 14:55:20 2020 +0000

description:
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

diffstat:

 sys/dev/ic/w83l518d.c       |   7 ++-----
 sys/dev/ic/w83l518d_sdmmc.c |  39 +++++++++++++++++++++++++++++----------
 sys/dev/ic/w83l518dvar.h    |   6 +++++-
 3 files changed, 36 insertions(+), 16 deletions(-)

diffs (158 lines):

diff -r 808671a6cf6c -r 2ecc0bb3bf61 sys/dev/ic/w83l518d.c
--- a/sys/dev/ic/w83l518d.c     Mon May 11 14:54:34 2020 +0000
+++ b/sys/dev/ic/w83l518d.c     Mon May 11 14:55:20 2020 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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 @@
 
 #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>
diff -r 808671a6cf6c -r 2ecc0bb3bf61 sys/dev/ic/w83l518d_sdmmc.c
--- a/sys/dev/ic/w83l518d_sdmmc.c       Mon May 11 14:54:34 2020 +0000
+++ b/sys/dev/ic/w83l518d_sdmmc.c       Mon May 11 14:55:20 2020 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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 @@
 #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 @@
        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 @@
 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 @@
        }
 
        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 @@
                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 @@
        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 @@
                        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;
                }
 
diff -r 808671a6cf6c -r 2ecc0bb3bf61 sys/dev/ic/w83l518dvar.h
--- a/sys/dev/ic/w83l518dvar.h  Mon May 11 14:54:34 2020 +0000
+++ b/sys/dev/ic/w83l518dvar.h  Mon May 11 14:55:20 2020 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -44,6 +44,10 @@
        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 *);



Home | Main Index | Thread Index | Old Index