xref: /dflybsd-src/sys/dev/raid/hpt27xx/array.h (revision cb134596e1626f361411b5da3a6a5f113c471648)
1*0f74dae5SSascha Wildner /*-
2*0f74dae5SSascha Wildner  * Copyright (c) 2011 HighPoint Technologies, Inc.
3*0f74dae5SSascha Wildner  * All rights reserved.
4*0f74dae5SSascha Wildner  *
5*0f74dae5SSascha Wildner  * Redistribution and use in source and binary forms, with or without
6*0f74dae5SSascha Wildner  * modification, are permitted provided that the following conditions
7*0f74dae5SSascha Wildner  * are met:
8*0f74dae5SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
9*0f74dae5SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
10*0f74dae5SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
11*0f74dae5SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
12*0f74dae5SSascha Wildner  *    documentation and/or other materials provided with the distribution.
13*0f74dae5SSascha Wildner  *
14*0f74dae5SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*0f74dae5SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*0f74dae5SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*0f74dae5SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*0f74dae5SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*0f74dae5SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*0f74dae5SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*0f74dae5SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*0f74dae5SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*0f74dae5SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*0f74dae5SSascha Wildner  * SUCH DAMAGE.
25*0f74dae5SSascha Wildner  *
26*0f74dae5SSascha Wildner  * $FreeBSD: src/sys/dev/hpt27xx/array.h,v 1.1 2011/12/28 23:26:58 delphij Exp $
27*0f74dae5SSascha Wildner  */
28*0f74dae5SSascha Wildner 
29*0f74dae5SSascha Wildner #include <dev/raid/hpt27xx/hpt27xx_config.h>
30*0f74dae5SSascha Wildner 
31*0f74dae5SSascha Wildner #ifndef _HPT_ARRAY_H_
32*0f74dae5SSascha Wildner #define _HPT_ARRAY_H_
33*0f74dae5SSascha Wildner 
34*0f74dae5SSascha Wildner #define VERMAGIC_ARRAY 46
35*0f74dae5SSascha Wildner 
36*0f74dae5SSascha Wildner #if defined(__cplusplus)
37*0f74dae5SSascha Wildner extern "C" {
38*0f74dae5SSascha Wildner #endif
39*0f74dae5SSascha Wildner 
40*0f74dae5SSascha Wildner #define MAX_ARRAY_NAME 16
41*0f74dae5SSascha Wildner 
42*0f74dae5SSascha Wildner #ifndef MAX_MEMBERS
43*0f74dae5SSascha Wildner #define MAX_MEMBERS    16
44*0f74dae5SSascha Wildner #endif
45*0f74dae5SSascha Wildner 
46*0f74dae5SSascha Wildner #if MAX_MEMBERS<=16
47*0f74dae5SSascha Wildner typedef HPT_U16 HPT_MMASK;
48*0f74dae5SSascha Wildner #elif MAX_MEMBERS<=32
49*0f74dae5SSascha Wildner typedef HPT_U32 HPT_MMASK;
50*0f74dae5SSascha Wildner #elif MAX_MEMBERS<=64
51*0f74dae5SSascha Wildner typedef HPT_U64 HPT_MMASK;
52*0f74dae5SSascha Wildner #else
53*0f74dae5SSascha Wildner #error "MAX_MEMBERS too large"
54*0f74dae5SSascha Wildner #endif
55*0f74dae5SSascha Wildner 
56*0f74dae5SSascha Wildner #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
57*0f74dae5SSascha Wildner 
58*0f74dae5SSascha Wildner #if MAX_MEMBERS<32
59*0f74dae5SSascha Wildner #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
60*0f74dae5SSascha Wildner #else
61*0f74dae5SSascha Wildner #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
62*0f74dae5SSascha Wildner #endif
63*0f74dae5SSascha Wildner 
64*0f74dae5SSascha Wildner #define MAX_REBUILD_SECTORS 128
65*0f74dae5SSascha Wildner 
66*0f74dae5SSascha Wildner typedef struct _RAID_FLAGS {
67*0f74dae5SSascha Wildner 	HPT_UINT rf_need_initialize : 1;
68*0f74dae5SSascha Wildner 	HPT_UINT rf_need_rebuild: 1;
69*0f74dae5SSascha Wildner 	HPT_UINT rf_need_sync: 1;
70*0f74dae5SSascha Wildner 	/* ioctl flags */
71*0f74dae5SSascha Wildner 	HPT_UINT rf_auto_rebuild: 1;
72*0f74dae5SSascha Wildner 	HPT_UINT rf_rebuilding: 1;
73*0f74dae5SSascha Wildner 	HPT_UINT rf_verifying: 1;
74*0f74dae5SSascha Wildner 	HPT_UINT rf_initializing: 1;
75*0f74dae5SSascha Wildner 	HPT_UINT rf_abort_verifying: 1;
76*0f74dae5SSascha Wildner 	HPT_UINT rf_raid15: 1;
77*0f74dae5SSascha Wildner 	HPT_UINT rf_v3_format : 1;
78*0f74dae5SSascha Wildner 	HPT_UINT rf_need_transform : 1;
79*0f74dae5SSascha Wildner 	HPT_UINT rf_transforming : 1;
80*0f74dae5SSascha Wildner 	HPT_UINT rf_abort_transform : 1;
81*0f74dae5SSascha Wildner 	HPT_UINT rf_log_write: 1;
82*0f74dae5SSascha Wildner } RAID_FLAGS;
83*0f74dae5SSascha Wildner 
84*0f74dae5SSascha Wildner typedef struct transform_cmd_ext
85*0f74dae5SSascha Wildner {
86*0f74dae5SSascha Wildner 	HPT_LBA lba;
87*0f74dae5SSascha Wildner 	HPT_U16 total_sectors;
88*0f74dae5SSascha Wildner 	HPT_U16 finished_sectors;
89*0f74dae5SSascha Wildner } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
90*0f74dae5SSascha Wildner 
91*0f74dae5SSascha Wildner 
92*0f74dae5SSascha Wildner #define TO_MOVE_DATA        0
93*0f74dae5SSascha Wildner #define TO_INITIALIZE       1
94*0f74dae5SSascha Wildner #define TO_INITIALIZE_ONLY  2
95*0f74dae5SSascha Wildner #define TO_MOVE_DATA_ONLY   3
96*0f74dae5SSascha Wildner typedef struct hpt_transform
97*0f74dae5SSascha Wildner {
98*0f74dae5SSascha Wildner 	HPT_U32 stamp;
99*0f74dae5SSascha Wildner 	PVDEV source;
100*0f74dae5SSascha Wildner 	PVDEV target;
101*0f74dae5SSascha Wildner 	struct list_head link;
102*0f74dae5SSascha Wildner 	HPT_U8 transform_from_tail;
103*0f74dae5SSascha Wildner 	struct tq_item task;
104*0f74dae5SSascha Wildner 
105*0f74dae5SSascha Wildner 	struct lock_request lock;
106*0f74dae5SSascha Wildner 	TRANSFORM_CMD_EXT cmdext;
107*0f74dae5SSascha Wildner 
108*0f74dae5SSascha Wildner 	HPT_U64 transform_point;
109*0f74dae5SSascha Wildner 	HPT_U16 transform_sectors_per_step;
110*0f74dae5SSascha Wildner 	HPT_U8  operation;
111*0f74dae5SSascha Wildner 	HPT_U8  disabled;
112*0f74dae5SSascha Wildner } HPT_TRANSFORM, *PHPT_TRANSFORM;
113*0f74dae5SSascha Wildner 
114*0f74dae5SSascha Wildner typedef struct hpt_array
115*0f74dae5SSascha Wildner {
116*0f74dae5SSascha Wildner 	HPT_U32 array_stamp;
117*0f74dae5SSascha Wildner 	HPT_U32 data_stamp;
118*0f74dae5SSascha Wildner 	HPT_U32 array_sn;
119*0f74dae5SSascha Wildner 
120*0f74dae5SSascha Wildner 	HPT_U8  ndisk;
121*0f74dae5SSascha Wildner 	HPT_U8  block_size_shift;
122*0f74dae5SSascha Wildner 	HPT_U16 strip_width;
123*0f74dae5SSascha Wildner 	HPT_U8  sector_size_shift; /*sector size = 512B<<sector_size_shift*/
124*0f74dae5SSascha Wildner 	HPT_U8  jid;
125*0f74dae5SSascha Wildner 	HPT_U8  reserved[2];
126*0f74dae5SSascha Wildner 
127*0f74dae5SSascha Wildner 
128*0f74dae5SSascha Wildner 	HPT_MMASK outdated_members;
129*0f74dae5SSascha Wildner 	HPT_MMASK offline_members;
130*0f74dae5SSascha Wildner 
131*0f74dae5SSascha Wildner 	PVDEV member[MAX_MEMBERS];
132*0f74dae5SSascha Wildner 
133*0f74dae5SSascha Wildner 	RAID_FLAGS flags;
134*0f74dae5SSascha Wildner 
135*0f74dae5SSascha Wildner 	HPT_U64 rebuilt_sectors;
136*0f74dae5SSascha Wildner 
137*0f74dae5SSascha Wildner 
138*0f74dae5SSascha Wildner 	HPT_U8 name[MAX_ARRAY_NAME];
139*0f74dae5SSascha Wildner 	PHPT_TRANSFORM transform;
140*0f74dae5SSascha Wildner 
141*0f74dae5SSascha Wildner 	TIME_RECORD create_time;
142*0f74dae5SSascha Wildner 	HPT_U8  description[64];
143*0f74dae5SSascha Wildner 	HPT_U8  create_manager[16];
144*0f74dae5SSascha Wildner 
145*0f74dae5SSascha Wildner #ifdef OS_SUPPORT_TASK
146*0f74dae5SSascha Wildner 	int floating_priority;
147*0f74dae5SSascha Wildner 	OSM_TASK ioctl_task;
148*0f74dae5SSascha Wildner 	IOCTL_ARG ioctl_arg;
149*0f74dae5SSascha Wildner 
150*0f74dae5SSascha Wildner 	char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
151*0f74dae5SSascha Wildner 	char ioctl_outbuf[sizeof(HPT_UINT)];
152*0f74dae5SSascha Wildner #endif
153*0f74dae5SSascha Wildner 
154*0f74dae5SSascha Wildner } HPT_ARRAY, *PHPT_ARRAY;
155*0f74dae5SSascha Wildner 
156*0f74dae5SSascha Wildner #ifdef OS_SUPPORT_TASK
157*0f74dae5SSascha Wildner void ldm_start_rebuild(struct _VDEV *pArray);
158*0f74dae5SSascha Wildner #else
159*0f74dae5SSascha Wildner #define ldm_start_rebuild(pArray)
160*0f74dae5SSascha Wildner #endif
161*0f74dae5SSascha Wildner 
162*0f74dae5SSascha Wildner typedef struct _raw_partition{
163*0f74dae5SSascha Wildner 	struct _raw_partition * next;
164*0f74dae5SSascha Wildner 	__HPT_RAW_LBA start;
165*0f74dae5SSascha Wildner 	__HPT_RAW_LBA capacity;
166*0f74dae5SSascha Wildner 	PVDEV   vd_part;
167*0f74dae5SSascha Wildner } RAW_PARTITION, *PRAW_PARTITION;
168*0f74dae5SSascha Wildner 
169*0f74dae5SSascha Wildner typedef struct hpt_partiton
170*0f74dae5SSascha Wildner {
171*0f74dae5SSascha Wildner 	PVDEV raw_disk;
172*0f74dae5SSascha Wildner 	__HPT_RAW_LBA des_location;
173*0f74dae5SSascha Wildner 	PRAW_PARTITION raw_part;
174*0f74dae5SSascha Wildner 	HPT_U8  del_mbr;
175*0f74dae5SSascha Wildner 	HPT_U8  reserved[3];
176*0f74dae5SSascha Wildner } HPT_PARTITION, *PHPT_PARTITION;
177*0f74dae5SSascha Wildner 
178*0f74dae5SSascha Wildner void ldm_check_array_online(PVDEV pArray);
179*0f74dae5SSascha Wildner void ldm_generic_member_failed(PVDEV member);
180*0f74dae5SSascha Wildner void ldm_sync_array_info(PVDEV pArray);
181*0f74dae5SSascha Wildner void ldm_sync_array_stamp(PVDEV pArray);
182*0f74dae5SSascha Wildner void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
183*0f74dae5SSascha Wildner 
184*0f74dae5SSascha Wildner #if defined(__cplusplus)
185*0f74dae5SSascha Wildner }
186*0f74dae5SSascha Wildner #endif
187*0f74dae5SSascha Wildner #endif
188