Issuing rebuild instruction to 3Ware 7000 series TwinStor array
Peter Wemm
peter at wemm.org
Fri Dec 10 16:19:04 PST 2004
On Friday 10 December 2004 12:20 pm, Tony Arcieri wrote:
> I have a 3Ware 7000 series controller on a FreeBSD 5.3/amd64 system.
> Unfortunately, after stability problems the array is in the degraded
> state:
>
> twed0: <Unit 0, TwinStor, Degraded> on twe0
>
> As there is currently no version of the 3Ware CLI for FreeBSD/AMD64,
> I was wondering how hard it would be to set up the ioctl() calls to
> issue the rebuild command to the controller directly. Looking in
> twe_tables.h, I see the following memeber of the twe_table_opcode
> array:
>
> {"REBUILDUNIT", 0x17},
>
> Is this the command I need to send to the device and if so, what
> parameters does it need?
I have a horrible hack to the twe driver to enable it to understand the
32 bit binary ioctl's. It was enough for me to run the CLI.
I was thinking about committing it, but I've been meaning to ask the
3ware folks for a native build, which would be much better. Maybe they
do a build so I won't have to commit this. I've given this diff to all the people
that have asked.
Their management stuff generally passes opaque data blobs through
from the cli/3dm to the firmware. We don't need to see what it is.
Anyway, the diff:
http://people.freebsd.org/~peter/twe.diff
Index: sys/dev/twe/twe.c
===========================================================================
--- sys/dev/twe/twe.c 2004/12/11 00:10:34 #14
+++ sys/dev/twe/twe.c 2004/12/11 00:10:34
@@ -500,9 +500,25 @@
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 @@
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 @@
}
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;
Index: sys/dev/twe/tweio.h
===========================================================================
--- sys/dev/twe/tweio.h 2004/12/11 00:10:34 #3
+++ sys/dev/twe/tweio.h 2004/12/11 00:10:34
@@ -44,6 +44,17 @@
#define TWEIO_COMMAND _IOWR('T', 100, struct twe_usercommand)
+#ifdef __amd64__
+struct twe_usercommand32 {
+ TWE_Command tu_command; /* command ready for the controller */
+ uint32_t tu_data; /* pointer to data in userspace */
+ uint32_t tu_size; /* userspace data length */
+};
+
+#define TWEIO_COMMAND32 _IOWR('T', 100, struct twe_usercommand32)
+#endif
+
+
/*
* Command queue statistics
*/
@@ -89,6 +100,18 @@
#define TWEIO_SET_PARAM _IOW ('T', 104, struct twe_paramcommand)
#define TWEIO_GET_PARAM _IOW ('T', 105, struct twe_paramcommand)
+#ifdef __amd64__
+struct twe_paramcommand32 {
+ u_int16_t tp_table_id;
+ u_int8_t tp_param_id;
+ u_int32_t tp_data;
+ u_int8_t tp_size;
+};
+
+#define TWEIO_SET_PARAM32 _IOW ('T', 104, struct twe_paramcommand32)
+#define TWEIO_GET_PARAM32 _IOW ('T', 105, struct twe_paramcommand32)
+#endif
+
/*
* Request a controller soft-reset
*/
--
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5
More information about the freebsd-amd64
mailing list