summaryrefslogtreecommitdiffstats
path: root/sys/dev/hpt27xx/array.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/hpt27xx/array.h')
-rw-r--r--sys/dev/hpt27xx/array.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/sys/dev/hpt27xx/array.h b/sys/dev/hpt27xx/array.h
new file mode 100644
index 0000000..e22464c
--- /dev/null
+++ b/sys/dev/hpt27xx/array.h
@@ -0,0 +1,187 @@
+/*-
+ * Copyright (c) 2011 HighPoint Technologies, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <dev/hpt27xx/hpt27xx_config.h>
+
+#ifndef _HPT_ARRAY_H_
+#define _HPT_ARRAY_H_
+
+#define VERMAGIC_ARRAY 46
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#define MAX_ARRAY_NAME 16
+
+#ifndef MAX_MEMBERS
+#define MAX_MEMBERS 16
+#endif
+
+#if MAX_MEMBERS<=16
+typedef HPT_U16 HPT_MMASK;
+#elif MAX_MEMBERS<=32
+typedef HPT_U32 HPT_MMASK;
+#elif MAX_MEMBERS<=64
+typedef HPT_U64 HPT_MMASK;
+#else
+#error "MAX_MEMBERS too large"
+#endif
+
+#define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
+
+#if MAX_MEMBERS<32
+#define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
+#else
+#define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
+#endif
+
+#define MAX_REBUILD_SECTORS 128
+
+typedef struct _RAID_FLAGS {
+ HPT_UINT rf_need_initialize : 1;
+ HPT_UINT rf_need_rebuild: 1;
+ HPT_UINT rf_need_sync: 1;
+ /* ioctl flags */
+ HPT_UINT rf_auto_rebuild: 1;
+ HPT_UINT rf_rebuilding: 1;
+ HPT_UINT rf_verifying: 1;
+ HPT_UINT rf_initializing: 1;
+ HPT_UINT rf_abort_verifying: 1;
+ HPT_UINT rf_raid15: 1;
+ HPT_UINT rf_v3_format : 1;
+ HPT_UINT rf_need_transform : 1;
+ HPT_UINT rf_transforming : 1;
+ HPT_UINT rf_abort_transform : 1;
+ HPT_UINT rf_log_write: 1;
+} RAID_FLAGS;
+
+typedef struct transform_cmd_ext
+{
+ HPT_LBA lba;
+ HPT_U16 total_sectors;
+ HPT_U16 finished_sectors;
+} TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
+
+
+#define TO_MOVE_DATA 0
+#define TO_INITIALIZE 1
+#define TO_INITIALIZE_ONLY 2
+#define TO_MOVE_DATA_ONLY 3
+typedef struct hpt_transform
+{
+ HPT_U32 stamp;
+ PVDEV source;
+ PVDEV target;
+ struct list_head link;
+ HPT_U8 transform_from_tail;
+ struct tq_item task;
+
+ struct lock_request lock;
+ TRANSFORM_CMD_EXT cmdext;
+
+ HPT_U64 transform_point;
+ HPT_U16 transform_sectors_per_step;
+ HPT_U8 operation;
+ HPT_U8 disabled;
+} HPT_TRANSFORM, *PHPT_TRANSFORM;
+
+typedef struct hpt_array
+{
+ HPT_U32 array_stamp;
+ HPT_U32 data_stamp;
+ HPT_U32 array_sn;
+
+ HPT_U8 ndisk;
+ HPT_U8 block_size_shift;
+ HPT_U16 strip_width;
+ HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/
+ HPT_U8 jid;
+ HPT_U8 reserved[2];
+
+
+ HPT_MMASK outdated_members;
+ HPT_MMASK offline_members;
+
+ PVDEV member[MAX_MEMBERS];
+
+ RAID_FLAGS flags;
+
+ HPT_U64 rebuilt_sectors;
+
+
+ HPT_U8 name[MAX_ARRAY_NAME];
+ PHPT_TRANSFORM transform;
+
+ TIME_RECORD create_time;
+ HPT_U8 description[64];
+ HPT_U8 create_manager[16];
+
+#ifdef OS_SUPPORT_TASK
+ int floating_priority;
+ OSM_TASK ioctl_task;
+ IOCTL_ARG ioctl_arg;
+
+ char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
+ char ioctl_outbuf[sizeof(HPT_UINT)];
+#endif
+
+} HPT_ARRAY, *PHPT_ARRAY;
+
+#ifdef OS_SUPPORT_TASK
+void ldm_start_rebuild(struct _VDEV *pArray);
+#else
+#define ldm_start_rebuild(pArray)
+#endif
+
+typedef struct _raw_partition{
+ struct _raw_partition * next;
+ __HPT_RAW_LBA start;
+ __HPT_RAW_LBA capacity;
+ PVDEV vd_part;
+} RAW_PARTITION, *PRAW_PARTITION;
+
+typedef struct hpt_partiton
+{
+ PVDEV raw_disk;
+ __HPT_RAW_LBA des_location;
+ PRAW_PARTITION raw_part;
+ HPT_U8 del_mbr;
+ HPT_U8 reserved[3];
+} HPT_PARTITION, *PHPT_PARTITION;
+
+void ldm_check_array_online(PVDEV pArray);
+void ldm_generic_member_failed(PVDEV member);
+void ldm_sync_array_info(PVDEV pArray);
+void ldm_sync_array_stamp(PVDEV pArray);
+void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
+
+#if defined(__cplusplus)
+}
+#endif
+#endif
OpenPOWER on IntegriCloud