summaryrefslogtreecommitdiffstats
path: root/sys/dev/twe/twe.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2004-12-17 17:45:29 +0000
committerpeter <peter@FreeBSD.org>2004-12-17 17:45:29 +0000
commiteb2a167966c00bcd7b22614e7642f842ce5b8324 (patch)
treec2c94ea4504f68658712814c9727611eaceb16a6 /sys/dev/twe/twe.c
parentaafcafb65910425ce3addfadf8f3b8bda95d8676 (diff)
downloadFreeBSD-src-eb2a167966c00bcd7b22614e7642f842ce5b8324.zip
FreeBSD-src-eb2a167966c00bcd7b22614e7642f842ce5b8324.tar.gz
Recognize the 32-bit form of the twe binary passthrough ioctl()s so that
there is some hope for the 32-bit management utilities to run. I've used the cli successfully, but 3dm2 doesn't work for other reasons. Of course, a native binary of the 3dm2 and cli would be much better, but that doesn't exist.
Diffstat (limited to 'sys/dev/twe/twe.c')
-rw-r--r--sys/dev/twe/twe.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/sys/dev/twe/twe.c b/sys/dev/twe/twe.c
index 340dab9..6ee9db5 100644
--- a/sys/dev/twe/twe.c
+++ b/sys/dev/twe/twe.c
@@ -500,9 +500,25 @@ twe_ioctl(struct twe_softc *sc, int ioctlcmd, void *addr)
struct twe_request *tr;
u_int8_t srid;
int s, error;
+#ifdef __amd64__
+ struct twe_paramcommand32 *tp32 = (struct twe_paramcommand32 *)addr;
+ struct twe_usercommand32 *tu32 = (struct twe_usercommand32 *)addr;
+ struct twe_paramcommand tp_swab;
+ struct twe_usercommand tu_swab;
+#endif
error = 0;
switch(ioctlcmd) {
+
+#ifdef __amd64__
+ case TWEIO_COMMAND32:
+ tu_swab.tu_command = tu32->tu_command;
+ tu_swab.tu_data = (void *)(uintptr_t)tu32->tu_data;
+ tu_swab.tu_size = tu32->tu_size;
+ tu = &tu_swab;
+ /* FALLTHROUGH */
+#endif
+
/* handle a command from userspace */
case TWEIO_COMMAND:
/* get a request */
@@ -588,6 +604,16 @@ twe_ioctl(struct twe_softc *sc, int ioctlcmd, void *addr)
splx(s);
break;
+#ifdef __amd64__
+ case TWEIO_GET_PARAM32:
+ tp_swab.tp_table_id = tp32->tp_table_id;
+ tp_swab.tp_param_id = tp32->tp_param_id;
+ tp_swab.tp_data = (void *)(uintptr_t)tp32->tp_data;
+ tp_swab.tp_size = tp32->tp_size;
+ tp = &tp_swab;
+ /* FALLTHROUGH */
+#endif
+
case TWEIO_GET_PARAM:
if ((param = twe_get_param(sc, tp->tp_table_id, tp->tp_param_id, tp->tp_size, NULL)) == NULL) {
twe_printf(sc, "TWEIO_GET_PARAM failed for 0x%x/0x%x/%d\n",
@@ -605,6 +631,16 @@ twe_ioctl(struct twe_softc *sc, int ioctlcmd, void *addr)
}
break;
+#ifdef __amd64__
+ case TWEIO_SET_PARAM32:
+ tp_swab.tp_table_id = tp32->tp_table_id;
+ tp_swab.tp_param_id = tp32->tp_param_id;
+ tp_swab.tp_data = (void *)(uintptr_t)tp32->tp_data;
+ tp_swab.tp_size = tp32->tp_size;
+ tp = &tp_swab;
+ /* FALLTHROUGH */
+#endif
+
case TWEIO_SET_PARAM:
if ((data = malloc(tp->tp_size, M_DEVBUF, M_WAITOK)) == NULL) {
error = ENOMEM;
OpenPOWER on IntegriCloud