Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Nov 2006 18:56:21 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 109868 for review
Message-ID:  <200611131856.kADIuL2f065704@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=109868

Change 109868 by sam@sam_ebb on 2006/11/13 18:55:35

	Workaround ata driver: create bus_space stream read/write multi
	ops that byte swap and undo change to the driver.  When the
	driver is fixed we can undo this damage.

Affected files ...

.. //depot/projects/arm/src/sys/arm/xscale/ixp425/avila_ata.c#9 edit
.. //depot/projects/arm/src/sys/dev/ata/ata-all.c#14 edit

Differences ...

==== //depot/projects/arm/src/sys/arm/xscale/ixp425/avila_ata.c#9 (text+ko) ====

@@ -45,6 +45,7 @@
 #include <sys/resource.h>
 #include <sys/rman.h>
 #include <sys/sysctl.h>
+#include <sys/endian.h>
 
 #include <machine/bus.h>
 #include <machine/cpu.h>
@@ -83,6 +84,10 @@
 
 static void ata_avila_intr(void *);
 bs_protos(ata);
+static	void ata_bs_rm_2_s(void *, bus_space_handle_t, bus_size_t,
+		u_int16_t *, bus_size_t);
+static	void ata_bs_wm_2_s(void *, bus_space_handle_t, bus_size_t,
+		const u_int16_t *, bus_size_t);
 
 static int
 ata_avila_probe(device_t dev)
@@ -116,25 +121,17 @@
 	 */
 	sc->sc_expbus_tag.bs_cookie = sc;	/* NB: backpointer */
 	/* read single */
-	sc->sc_expbus_tag.bs_r_1_s	= ata_bs_r_1,
-	sc->sc_expbus_tag.bs_r_2_s	= ata_bs_r_2,
 	sc->sc_expbus_tag.bs_r_1	= ata_bs_r_1,
 	sc->sc_expbus_tag.bs_r_2	= ata_bs_r_2,
 	/* read multiple */
-	sc->sc_expbus_tag.bs_rm_1	= ata_bs_rm_1,
-	sc->sc_expbus_tag.bs_rm_1_s	= ata_bs_rm_1,
 	sc->sc_expbus_tag.bs_rm_2	= ata_bs_rm_2,
-	sc->sc_expbus_tag.bs_rm_2_s	= ata_bs_rm_2,
+	sc->sc_expbus_tag.bs_rm_2_s	= ata_bs_rm_2_s,
 	/* write (single) */
-	sc->sc_expbus_tag.bs_w_1_s	= ata_bs_w_1,
-	sc->sc_expbus_tag.bs_w_2_s	= ata_bs_w_2,
 	sc->sc_expbus_tag.bs_w_1	= ata_bs_w_1,
 	sc->sc_expbus_tag.bs_w_2	= ata_bs_w_2,
 	/* write multiple */
-	sc->sc_expbus_tag.bs_wm_1	= ata_bs_wm_1,
-	sc->sc_expbus_tag.bs_wm_1_s	= ata_bs_wm_1,
 	sc->sc_expbus_tag.bs_wm_2	= ata_bs_wm_2,
-	sc->sc_expbus_tag.bs_wm_2_s	= ata_bs_wm_2,
+	sc->sc_expbus_tag.bs_wm_2_s	= ata_bs_wm_2_s,
 
 	rman_set_bustag(&sc->sc_ata, &sc->sc_expbus_tag);
 	rman_set_bushandle(&sc->sc_ata, sc->sc_ioh);
@@ -311,42 +308,63 @@
 }
 
 void
-ata_bs_rm_1(void *t, bus_space_handle_t h, bus_size_t o,
-	u_int8_t *d, bus_size_t c)
+ata_bs_rm_2(void *t, bus_space_handle_t h, bus_size_t o,
+	u_int16_t *d, bus_size_t c)
 {
 	struct ata_avila_softc *sc = t;
 
-	bus_space_read_multi_1(sc->sc_iot, h, o, d, c);
+	enable_16(sc);
+	bus_space_read_multi_2(sc->sc_iot, h, o, d, c);
+	disable_16(sc);
 }
 
 void
-ata_bs_wm_1(void *t, bus_space_handle_t h, bus_size_t o,
-	const u_int8_t *d, bus_size_t c)
+ata_bs_wm_2(void *t, bus_space_handle_t h, bus_size_t o,
+	const u_int16_t *d, bus_size_t c)
 {
 	struct ata_avila_softc *sc = t;
 
-	bus_space_write_multi_1(sc->sc_iot, h, o, d, c);
+	enable_16(sc);
+	bus_space_write_multi_2(sc->sc_iot, h, o, d, c);
+	disable_16(sc);
 }
 
+/* XXX workaround ata driver by (incorrectly) byte swapping stream cases */
+
 void
-ata_bs_rm_2(void *t, bus_space_handle_t h, bus_size_t o,
+ata_bs_rm_2_s(void *t, bus_space_handle_t h, bus_size_t o,
 	u_int16_t *d, bus_size_t c)
 {
 	struct ata_avila_softc *sc = t;
+	uint16_t v;
+	bus_size_t i;
 
 	enable_16(sc);
-	bus_space_read_multi_2(sc->sc_iot, h, o, d, c);
+#if 1
+	for (i = 0; i < c; i++) {
+		v = bus_space_read_2(sc->sc_iot, h, o);
+		d[i] = bswap16(v);
+	}
+#else
+	bus_space_read_multi_stream_2(sc->sc_iot, h, o, d, c);
+#endif
 	disable_16(sc);
 }
 
 void
-ata_bs_wm_2(void *t, bus_space_handle_t h, bus_size_t o,
+ata_bs_wm_2_s(void *t, bus_space_handle_t h, bus_size_t o,
 	const u_int16_t *d, bus_size_t c)
 {
 	struct ata_avila_softc *sc = t;
+	bus_size_t i;
 
 	enable_16(sc);
-	bus_space_write_multi_2(sc->sc_iot, h, o, d, c);
+#if 1
+	for (i = 0; i < c; i++)
+		bus_space_write_2(sc->sc_iot, h, o, bswap16(d[i]));
+#else
+	bus_space_write_multi_stream_2(sc->sc_iot, h, o, d, c);
+#endif
 	disable_16(sc);
 }
 

==== //depot/projects/arm/src/sys/dev/ata/ata-all.c#14 (text+ko) ====

@@ -601,8 +601,6 @@
 		   isprint(atadev->param.model[1]))) {
 	struct ata_params *atacap = &atadev->param;
 	char buffer[64];
-#if 0
-/* XXX not right on xscale; ditch for now */
 #if BYTE_ORDER == BIG_ENDIAN
 	int16_t *ptr;
 
@@ -611,7 +609,6 @@
 	    *ptr = bswap16(*ptr);
 	}
 #endif
-#endif
 	if (!(!strncmp(atacap->model, "FX", 2) ||
 	      !strncmp(atacap->model, "NEC", 3) ||
 	      !strncmp(atacap->model, "Pioneer", 7) ||



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200611131856.kADIuL2f065704>