diff options
Diffstat (limited to 'sys/dev/hpt27xx/array.h')
-rw-r--r-- | sys/dev/hpt27xx/array.h | 187 |
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 |