xref: /freebsd/sys/dev/hptnr/array.h (revision 2ff63af9)
11fdeb165SXin LI /* $Id: array.h,v 1.46 2010/02/05 06:57:43 mah Exp $ */
21fdeb165SXin LI /*-
34d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
4718cf2ccSPedro F. Giffuni  *
51fdeb165SXin LI  * Copyright (C) 2004-2011 HighPoint Technologies, Inc.
61fdeb165SXin LI  * All rights reserved.
71fdeb165SXin LI  *
81fdeb165SXin LI  * Redistribution and use in source and binary forms, with or without
91fdeb165SXin LI  * modification, are permitted provided that the following conditions
101fdeb165SXin LI  * are met:
111fdeb165SXin LI  * 1. Redistributions of source code must retain the above copyright
121fdeb165SXin LI  *    notice, this list of conditions and the following disclaimer.
131fdeb165SXin LI  * 2. Redistributions in binary form must reproduce the above copyright
141fdeb165SXin LI  *    notice, this list of conditions and the following disclaimer in the
151fdeb165SXin LI  *    documentation and/or other materials provided with the distribution.
161fdeb165SXin LI  *
171fdeb165SXin LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
181fdeb165SXin LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191fdeb165SXin LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201fdeb165SXin LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
211fdeb165SXin LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221fdeb165SXin LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231fdeb165SXin LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241fdeb165SXin LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251fdeb165SXin LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261fdeb165SXin LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271fdeb165SXin LI  * SUCH DAMAGE.
281fdeb165SXin LI  *
291fdeb165SXin LI  */
301fdeb165SXin LI #include <dev/hptnr/hptnr_config.h>
311fdeb165SXin LI #ifndef _HPT_ARRAY_H_
321fdeb165SXin LI #define _HPT_ARRAY_H_
331fdeb165SXin LI 
341fdeb165SXin LI #define VERMAGIC_ARRAY 46
351fdeb165SXin LI 
361fdeb165SXin LI #if defined(__cplusplus)
371fdeb165SXin LI extern "C" {
381fdeb165SXin LI #endif
391fdeb165SXin LI 
401fdeb165SXin LI #define MAX_ARRAY_NAME 16
411fdeb165SXin LI 
421fdeb165SXin LI #ifndef MAX_MEMBERS
431fdeb165SXin LI #define MAX_MEMBERS    16
441fdeb165SXin LI #endif
451fdeb165SXin LI 
461fdeb165SXin LI #if MAX_MEMBERS<=16
471fdeb165SXin LI typedef HPT_U16 HPT_MMASK;
481fdeb165SXin LI #elif MAX_MEMBERS<=32
491fdeb165SXin LI typedef HPT_U32 HPT_MMASK;
501fdeb165SXin LI #elif MAX_MEMBERS<=64
511fdeb165SXin LI typedef HPT_U64 HPT_MMASK;
521fdeb165SXin LI #else
531fdeb165SXin LI #error "MAX_MEMBERS too large"
541fdeb165SXin LI #endif
551fdeb165SXin LI 
561fdeb165SXin LI #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x))
571fdeb165SXin LI 
581fdeb165SXin LI #if MAX_MEMBERS<32
591fdeb165SXin LI #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x)
601fdeb165SXin LI #else
611fdeb165SXin LI #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x))
621fdeb165SXin LI #endif
631fdeb165SXin LI 
641fdeb165SXin LI #define MAX_REBUILD_SECTORS 128
651fdeb165SXin LI 
661fdeb165SXin LI typedef struct _RAID_FLAGS {
671fdeb165SXin LI 	HPT_UINT rf_need_initialize : 1;
681fdeb165SXin LI 	HPT_UINT rf_need_rebuild: 1;
691fdeb165SXin LI 	HPT_UINT rf_need_sync: 1;
701fdeb165SXin LI 	/* ioctl flags */
711fdeb165SXin LI 	HPT_UINT rf_auto_rebuild: 1;
721fdeb165SXin LI 	HPT_UINT rf_rebuilding: 1;
731fdeb165SXin LI 	HPT_UINT rf_verifying: 1;
741fdeb165SXin LI 	HPT_UINT rf_initializing: 1;
751fdeb165SXin LI 	HPT_UINT rf_abort_verifying: 1;
761fdeb165SXin LI 	HPT_UINT rf_raid15: 1;
771fdeb165SXin LI 	HPT_UINT rf_v3_format : 1;
781fdeb165SXin LI 	HPT_UINT rf_need_transform : 1;
791fdeb165SXin LI 	HPT_UINT rf_transforming : 1;
801fdeb165SXin LI 	HPT_UINT rf_abort_transform : 1;
811fdeb165SXin LI 	HPT_UINT rf_log_write: 1;
821fdeb165SXin LI } RAID_FLAGS;
831fdeb165SXin LI 
841fdeb165SXin LI typedef struct transform_cmd_ext
851fdeb165SXin LI {
861fdeb165SXin LI 	HPT_LBA lba;
871fdeb165SXin LI 	HPT_U16 total_sectors;
881fdeb165SXin LI 	HPT_U16 finished_sectors;
891fdeb165SXin LI } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT;
901fdeb165SXin LI 
911fdeb165SXin LI 
921fdeb165SXin LI #define TO_MOVE_DATA        0
931fdeb165SXin LI #define TO_INITIALIZE       1
941fdeb165SXin LI #define TO_INITIALIZE_ONLY  2
951fdeb165SXin LI #define TO_MOVE_DATA_ONLY   3
961fdeb165SXin LI typedef struct hpt_transform
971fdeb165SXin LI {
981fdeb165SXin LI 	HPT_U32 stamp;
991fdeb165SXin LI 	PVDEV source;
1001fdeb165SXin LI 	PVDEV target;
1011fdeb165SXin LI 	struct list_head link;
1021fdeb165SXin LI 	HPT_U8 transform_from_tail;
1031fdeb165SXin LI 	struct tq_item task;
1041fdeb165SXin LI 
1051fdeb165SXin LI 	struct lock_request lock;
1061fdeb165SXin LI 	TRANSFORM_CMD_EXT cmdext;
1071fdeb165SXin LI 
1081fdeb165SXin LI 	HPT_U64 transform_point;
1091fdeb165SXin LI 	HPT_U16 transform_sectors_per_step;
1101fdeb165SXin LI 	HPT_U8  operation;
1111fdeb165SXin LI 	HPT_U8  disabled;
1121fdeb165SXin LI } HPT_TRANSFORM, *PHPT_TRANSFORM;
1131fdeb165SXin LI 
1141fdeb165SXin LI typedef struct hpt_array
1151fdeb165SXin LI {
1161fdeb165SXin LI 	HPT_U32 array_stamp;
1171fdeb165SXin LI 	HPT_U32 data_stamp;
1181fdeb165SXin LI 	HPT_U32 array_sn;
1191fdeb165SXin LI 
1201fdeb165SXin LI 	HPT_U8  ndisk;
1211fdeb165SXin LI 	HPT_U8  block_size_shift;
1221fdeb165SXin LI 	HPT_U16 strip_width;
1231fdeb165SXin LI 	HPT_U8  sector_size_shift; /*sector size = 512B<<sector_size_shift*/
1241fdeb165SXin LI 	HPT_U8  jid;
1251fdeb165SXin LI 	HPT_U8  reserved[2];
1261fdeb165SXin LI 
1271fdeb165SXin LI 
1281fdeb165SXin LI 	HPT_MMASK outdated_members;
1291fdeb165SXin LI 	HPT_MMASK offline_members;
1301fdeb165SXin LI 
1311fdeb165SXin LI 	PVDEV member[MAX_MEMBERS];
1321fdeb165SXin LI 
1331fdeb165SXin LI 	RAID_FLAGS flags;
1341fdeb165SXin LI 
1351fdeb165SXin LI 	HPT_U64 rebuilt_sectors;
1361fdeb165SXin LI 
1371fdeb165SXin LI 
1381fdeb165SXin LI 	HPT_U8 name[MAX_ARRAY_NAME];
1391fdeb165SXin LI 	PHPT_TRANSFORM transform;
1401fdeb165SXin LI 
1411fdeb165SXin LI 	TIME_RECORD create_time;
1421fdeb165SXin LI 	HPT_U8  description[64];
1431fdeb165SXin LI 	HPT_U8  create_manager[16];
1441fdeb165SXin LI 
1451fdeb165SXin LI #ifdef OS_SUPPORT_TASK
1461fdeb165SXin LI 	int floating_priority;
1471fdeb165SXin LI 	OSM_TASK ioctl_task;
1481fdeb165SXin LI 	IOCTL_ARG ioctl_arg;
1491fdeb165SXin LI 
1501fdeb165SXin LI 	char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)];
1511fdeb165SXin LI 	char ioctl_outbuf[sizeof(HPT_UINT)];
1521fdeb165SXin LI #endif
1531fdeb165SXin LI 
1541fdeb165SXin LI } HPT_ARRAY, *PHPT_ARRAY;
1551fdeb165SXin LI 
1561fdeb165SXin LI #ifdef OS_SUPPORT_TASK
1571fdeb165SXin LI void ldm_start_rebuild(struct _VDEV *pArray);
1581fdeb165SXin LI #else
1591fdeb165SXin LI #define ldm_start_rebuild(pArray)
1601fdeb165SXin LI #endif
1611fdeb165SXin LI 
1621fdeb165SXin LI typedef struct _raw_partition{
1631fdeb165SXin LI 	struct _raw_partition * next;
1641fdeb165SXin LI 	__HPT_RAW_LBA start;
1651fdeb165SXin LI 	__HPT_RAW_LBA capacity;
1661fdeb165SXin LI 	PVDEV   vd_part;
1671fdeb165SXin LI } RAW_PARTITION, *PRAW_PARTITION;
1681fdeb165SXin LI 
1691fdeb165SXin LI typedef struct hpt_partiton
1701fdeb165SXin LI {
1711fdeb165SXin LI 	PVDEV raw_disk;
1721fdeb165SXin LI 	__HPT_RAW_LBA des_location;
1731fdeb165SXin LI 	PRAW_PARTITION raw_part;
1741fdeb165SXin LI 	HPT_U8  del_mbr;
1751fdeb165SXin LI 	HPT_U8  reserved[3];
1761fdeb165SXin LI } HPT_PARTITION, *PHPT_PARTITION;
1771fdeb165SXin LI 
1781fdeb165SXin LI void ldm_check_array_online(PVDEV pArray);
1791fdeb165SXin LI void ldm_generic_member_failed(PVDEV member);
1801fdeb165SXin LI void ldm_sync_array_info(PVDEV pArray);
1811fdeb165SXin LI void ldm_sync_array_stamp(PVDEV pArray);
1821fdeb165SXin LI void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition);
1831fdeb165SXin LI 
1841fdeb165SXin LI #if defined(__cplusplus)
1851fdeb165SXin LI }
1861fdeb165SXin LI #endif
1871fdeb165SXin LI #endif
188