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