1249997Swkoszek/*- 2250015Swkoszek * Copyright (c) 2004-2011 HighPoint Technologies, Inc. 3249997Swkoszek * All rights reserved. 4250015Swkoszek * 5249997Swkoszek * Redistribution and use in source and binary forms, with or without 6250015Swkoszek * modification, are permitted provided that the following conditions 7250015Swkoszek * are met: 8250015Swkoszek * 1. Redistributions of source code must retain the above copyright 9250015Swkoszek * notice, this list of conditions and the following disclaimer. 10250015Swkoszek * 2. Redistributions in binary form must reproduce the above copyright 11250015Swkoszek * notice, this list of conditions and the following disclaimer in the 12250015Swkoszek * documentation and/or other materials provided with the distribution. 13250015Swkoszek * 14250015Swkoszek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15250015Swkoszek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16249997Swkoszek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17250015Swkoszek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18250015Swkoszek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19250015Swkoszek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20250015Swkoszek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21250015Swkoszek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22250015Swkoszek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23250015Swkoszek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24250015Swkoszek * SUCH DAMAGE. 25249997Swkoszek * 26250015Swkoszek * $FreeBSD$ 27249997Swkoszek */ 28249997Swkoszek 29250015Swkoszek#include <dev/hpt27xx/hpt27xx_config.h> 30250015Swkoszek 31249997Swkoszek#ifndef _HPT_ARRAY_H_ 32249997Swkoszek#define _HPT_ARRAY_H_ 33249997Swkoszek 34249997Swkoszek#define VERMAGIC_ARRAY 46 35249997Swkoszek 36249997Swkoszek#if defined(__cplusplus) 37249997Swkoszekextern "C" { 38249997Swkoszek#endif 39249997Swkoszek 40249997Swkoszek#define MAX_ARRAY_NAME 16 41249997Swkoszek 42249997Swkoszek#ifndef MAX_MEMBERS 43249997Swkoszek#define MAX_MEMBERS 16 44249997Swkoszek#endif 45249997Swkoszek 46249997Swkoszek#if MAX_MEMBERS<=16 47249997Swkoszektypedef HPT_U16 HPT_MMASK; 48249997Swkoszek#elif MAX_MEMBERS<=32 49249997Swkoszektypedef HPT_U32 HPT_MMASK; 50249997Swkoszek#elif MAX_MEMBERS<=64 51249997Swkoszektypedef HPT_U64 HPT_MMASK; 52249997Swkoszek#else 53249997Swkoszek#error "MAX_MEMBERS too large" 54249997Swkoszek#endif 55249997Swkoszek 56249997Swkoszek#define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x)) 57249997Swkoszek 58249997Swkoszek#if MAX_MEMBERS<32 59249997Swkoszek#define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x) 60249997Swkoszek#else 61249997Swkoszek#define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x)) 62249997Swkoszek#endif 63249997Swkoszek 64249997Swkoszek#define MAX_REBUILD_SECTORS 128 65249997Swkoszek 66249997Swkoszektypedef struct _RAID_FLAGS { 67249997Swkoszek HPT_UINT rf_need_initialize : 1; 68249997Swkoszek HPT_UINT rf_need_rebuild: 1; 69249997Swkoszek HPT_UINT rf_need_sync: 1; 70249997Swkoszek /* ioctl flags */ 71249997Swkoszek HPT_UINT rf_auto_rebuild: 1; 72249997Swkoszek 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; 82} RAID_FLAGS; 83 84typedef struct transform_cmd_ext 85{ 86 HPT_LBA lba; 87 HPT_U16 total_sectors; 88 HPT_U16 finished_sectors; 89} TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT; 90 91 92#define TO_MOVE_DATA 0 93#define TO_INITIALIZE 1 94#define TO_INITIALIZE_ONLY 2 95#define TO_MOVE_DATA_ONLY 3 96typedef struct hpt_transform 97{ 98 HPT_U32 stamp; 99 PVDEV source; 100 PVDEV target; 101 struct list_head link; 102 HPT_U8 transform_from_tail; 103 struct tq_item task; 104 105 struct lock_request lock; 106 TRANSFORM_CMD_EXT cmdext; 107 108 HPT_U64 transform_point; 109 HPT_U16 transform_sectors_per_step; 110 HPT_U8 operation; 111 HPT_U8 disabled; 112} HPT_TRANSFORM, *PHPT_TRANSFORM; 113 114typedef struct hpt_array 115{ 116 HPT_U32 array_stamp; 117 HPT_U32 data_stamp; 118 HPT_U32 array_sn; 119 120 HPT_U8 ndisk; 121 HPT_U8 block_size_shift; 122 HPT_U16 strip_width; 123 HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/ 124 HPT_U8 jid; 125 HPT_U8 reserved[2]; 126 127 128 HPT_MMASK outdated_members; 129 HPT_MMASK offline_members; 130 131 PVDEV member[MAX_MEMBERS]; 132 133 RAID_FLAGS flags; 134 135 HPT_U64 rebuilt_sectors; 136 137 138 HPT_U8 name[MAX_ARRAY_NAME]; 139 PHPT_TRANSFORM transform; 140 141 TIME_RECORD create_time; 142 HPT_U8 description[64]; 143 HPT_U8 create_manager[16]; 144 145#ifdef OS_SUPPORT_TASK 146 int floating_priority; 147 OSM_TASK ioctl_task; 148 IOCTL_ARG ioctl_arg; 149 150 char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)]; 151 char ioctl_outbuf[sizeof(HPT_UINT)]; 152#endif 153 154} HPT_ARRAY, *PHPT_ARRAY; 155 156#ifdef OS_SUPPORT_TASK 157void ldm_start_rebuild(struct _VDEV *pArray); 158#else 159#define ldm_start_rebuild(pArray) 160#endif 161 162typedef struct _raw_partition{ 163 struct _raw_partition * next; 164 __HPT_RAW_LBA start; 165 __HPT_RAW_LBA capacity; 166 PVDEV vd_part; 167} RAW_PARTITION, *PRAW_PARTITION; 168 169typedef struct hpt_partiton 170{ 171 PVDEV raw_disk; 172 __HPT_RAW_LBA des_location; 173 PRAW_PARTITION raw_part; 174 HPT_U8 del_mbr; 175 HPT_U8 reserved[3]; 176} HPT_PARTITION, *PHPT_PARTITION; 177 178void ldm_check_array_online(PVDEV pArray); 179void ldm_generic_member_failed(PVDEV member); 180void ldm_sync_array_info(PVDEV pArray); 181void ldm_sync_array_stamp(PVDEV pArray); 182void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition); 183 184#if defined(__cplusplus) 185} 186#endif 187#endif 188