2 * Copyright (c) 2011 HighPoint Technologies, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/sys/dev/hpt27xx/array.h,v 1.1 2011/12/28 23:26:58 delphij Exp $
29 #include <dev/raid/hpt27xx/hpt27xx_config.h>
34 #define VERMAGIC_ARRAY 46
36 #if defined(__cplusplus)
40 #define MAX_ARRAY_NAME 16
43 #define MAX_MEMBERS 16
47 typedef HPT_U16 HPT_MMASK
;
49 typedef HPT_U32 HPT_MMASK
;
51 typedef HPT_U64 HPT_MMASK
;
53 #error "MAX_MEMBERS too large"
56 #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
59 #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
61 #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
64 #define MAX_REBUILD_SECTORS 128
66 typedef struct _RAID_FLAGS
{
67 HPT_UINT rf_need_initialize
: 1;
68 HPT_UINT rf_need_rebuild
: 1;
69 HPT_UINT rf_need_sync
: 1;
71 HPT_UINT rf_auto_rebuild
: 1;
72 HPT_UINT rf_rebuilding
: 1;
73 HPT_UINT rf_verifying
: 1;
74 HPT_UINT rf_initializing
: 1;
75 HPT_UINT rf_abort_verifying
: 1;
76 HPT_UINT rf_raid15
: 1;
77 HPT_UINT rf_v3_format
: 1;
78 HPT_UINT rf_need_transform
: 1;
79 HPT_UINT rf_transforming
: 1;
80 HPT_UINT rf_abort_transform
: 1;
81 HPT_UINT rf_log_write
: 1;
84 typedef struct transform_cmd_ext
87 HPT_U16 total_sectors
;
88 HPT_U16 finished_sectors
;
89 } TRANSFORM_CMD_EXT
, *PTRANSFORM_CMD_EXT
;
92 #define TO_MOVE_DATA 0
93 #define TO_INITIALIZE 1
94 #define TO_INITIALIZE_ONLY 2
95 #define TO_MOVE_DATA_ONLY 3
96 typedef struct hpt_transform
101 struct list_head link
;
102 HPT_U8 transform_from_tail
;
105 struct lock_request lock
;
106 TRANSFORM_CMD_EXT cmdext
;
108 HPT_U64 transform_point
;
109 HPT_U16 transform_sectors_per_step
;
112 } HPT_TRANSFORM
, *PHPT_TRANSFORM
;
114 typedef struct hpt_array
121 HPT_U8 block_size_shift
;
123 HPT_U8 sector_size_shift
; /*sector size = 512B<<sector_size_shift*/
128 HPT_MMASK outdated_members
;
129 HPT_MMASK offline_members
;
131 PVDEV member
[MAX_MEMBERS
];
135 HPT_U64 rebuilt_sectors
;
138 HPT_U8 name
[MAX_ARRAY_NAME
];
139 PHPT_TRANSFORM transform
;
141 TIME_RECORD create_time
;
142 HPT_U8 description
[64];
143 HPT_U8 create_manager
[16];
145 #ifdef OS_SUPPORT_TASK
146 int floating_priority
;
150 char ioctl_inbuf
[sizeof(PVDEV
)+sizeof(HPT_U64
)+sizeof(HPT_U16
)];
151 char ioctl_outbuf
[sizeof(HPT_UINT
)];
154 } HPT_ARRAY
, *PHPT_ARRAY
;
156 #ifdef OS_SUPPORT_TASK
157 void ldm_start_rebuild(struct _VDEV
*pArray
);
159 #define ldm_start_rebuild(pArray)
162 typedef struct _raw_partition
{
163 struct _raw_partition
* next
;
165 __HPT_RAW_LBA capacity
;
167 } RAW_PARTITION
, *PRAW_PARTITION
;
169 typedef struct hpt_partiton
172 __HPT_RAW_LBA des_location
;
173 PRAW_PARTITION raw_part
;
176 } HPT_PARTITION
, *PHPT_PARTITION
;
178 void ldm_check_array_online(PVDEV pArray
);
179 void ldm_generic_member_failed(PVDEV member
);
180 void ldm_sync_array_info(PVDEV pArray
);
181 void ldm_sync_array_stamp(PVDEV pArray
);
182 void ldm_add_spare_to_array(PVDEV pArray
, PVDEV spare_partition
);
184 #if defined(__cplusplus)