181966bceSXin LI /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3718cf2ccSPedro F. Giffuni * 4f29c86f1SXin LI * Copyright (c) 2004-2011 HighPoint Technologies, Inc. 581966bceSXin LI * All rights reserved. 681966bceSXin LI * 781966bceSXin LI * Redistribution and use in source and binary forms, with or without 881966bceSXin LI * modification, are permitted provided that the following conditions 981966bceSXin LI * are met: 1081966bceSXin LI * 1. Redistributions of source code must retain the above copyright 1181966bceSXin LI * notice, this list of conditions and the following disclaimer. 1281966bceSXin LI * 2. Redistributions in binary form must reproduce the above copyright 1381966bceSXin LI * notice, this list of conditions and the following disclaimer in the 1481966bceSXin LI * documentation and/or other materials provided with the distribution. 1581966bceSXin LI * 1681966bceSXin LI * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1781966bceSXin LI * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1881966bceSXin LI * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1981966bceSXin LI * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2081966bceSXin LI * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2181966bceSXin LI * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2281966bceSXin LI * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2381966bceSXin LI * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2481966bceSXin LI * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2581966bceSXin LI * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2681966bceSXin LI * SUCH DAMAGE. 2781966bceSXin LI */ 2881966bceSXin LI 2981966bceSXin LI #include <dev/hpt27xx/hpt27xx_config.h> 3081966bceSXin LI 3181966bceSXin LI #ifndef _HPT_ARRAY_H_ 3281966bceSXin LI #define _HPT_ARRAY_H_ 3381966bceSXin LI 3481966bceSXin LI #define VERMAGIC_ARRAY 46 3581966bceSXin LI 3681966bceSXin LI #if defined(__cplusplus) 3781966bceSXin LI extern "C" { 3881966bceSXin LI #endif 3981966bceSXin LI 4081966bceSXin LI #define MAX_ARRAY_NAME 16 4181966bceSXin LI 4281966bceSXin LI #ifndef MAX_MEMBERS 4381966bceSXin LI #define MAX_MEMBERS 16 4481966bceSXin LI #endif 4581966bceSXin LI 4681966bceSXin LI #if MAX_MEMBERS<=16 4781966bceSXin LI typedef HPT_U16 HPT_MMASK; 4881966bceSXin LI #elif MAX_MEMBERS<=32 4981966bceSXin LI typedef HPT_U32 HPT_MMASK; 5081966bceSXin LI #elif MAX_MEMBERS<=64 5181966bceSXin LI typedef HPT_U64 HPT_MMASK; 5281966bceSXin LI #else 5381966bceSXin LI #error "MAX_MEMBERS too large" 5481966bceSXin LI #endif 5581966bceSXin LI 5681966bceSXin LI #define HPT_MMASK_VALUE(x) (HPT_MMASK)((HPT_MMASK)1<<(x)) 5781966bceSXin LI 5881966bceSXin LI #if MAX_MEMBERS<32 5981966bceSXin LI #define HPT_MMASK_VALUE_SAFE(x) HPT_MMASK_VALUE(x) 6081966bceSXin LI #else 6181966bceSXin LI #define HPT_MMASK_VALUE_SAFE(x) ((x)>=MAX_MEMBERS? (HPT_MMASK)0 : HPT_MMASK_VALUE(x)) 6281966bceSXin LI #endif 6381966bceSXin LI 6481966bceSXin LI #define MAX_REBUILD_SECTORS 128 6581966bceSXin LI 6681966bceSXin LI typedef struct _RAID_FLAGS { 6781966bceSXin LI HPT_UINT rf_need_initialize : 1; 6881966bceSXin LI HPT_UINT rf_need_rebuild: 1; 6981966bceSXin LI HPT_UINT rf_need_sync: 1; 7081966bceSXin LI /* ioctl flags */ 7181966bceSXin LI HPT_UINT rf_auto_rebuild: 1; 7281966bceSXin LI HPT_UINT rf_rebuilding: 1; 7381966bceSXin LI HPT_UINT rf_verifying: 1; 7481966bceSXin LI HPT_UINT rf_initializing: 1; 7581966bceSXin LI HPT_UINT rf_abort_verifying: 1; 7681966bceSXin LI HPT_UINT rf_raid15: 1; 7781966bceSXin LI HPT_UINT rf_v3_format : 1; 7881966bceSXin LI HPT_UINT rf_need_transform : 1; 7981966bceSXin LI HPT_UINT rf_transforming : 1; 8081966bceSXin LI HPT_UINT rf_abort_transform : 1; 8181966bceSXin LI HPT_UINT rf_log_write: 1; 8281966bceSXin LI } RAID_FLAGS; 8381966bceSXin LI 8481966bceSXin LI typedef struct transform_cmd_ext 8581966bceSXin LI { 8681966bceSXin LI HPT_LBA lba; 8781966bceSXin LI HPT_U16 total_sectors; 8881966bceSXin LI HPT_U16 finished_sectors; 8981966bceSXin LI } TRANSFORM_CMD_EXT , *PTRANSFORM_CMD_EXT; 9081966bceSXin LI 9181966bceSXin LI 9281966bceSXin LI #define TO_MOVE_DATA 0 9381966bceSXin LI #define TO_INITIALIZE 1 9481966bceSXin LI #define TO_INITIALIZE_ONLY 2 9581966bceSXin LI #define TO_MOVE_DATA_ONLY 3 9681966bceSXin LI typedef struct hpt_transform 9781966bceSXin LI { 9881966bceSXin LI HPT_U32 stamp; 9981966bceSXin LI PVDEV source; 10081966bceSXin LI PVDEV target; 10181966bceSXin LI struct list_head link; 10281966bceSXin LI HPT_U8 transform_from_tail; 10381966bceSXin LI struct tq_item task; 10481966bceSXin LI 10581966bceSXin LI struct lock_request lock; 10681966bceSXin LI TRANSFORM_CMD_EXT cmdext; 10781966bceSXin LI 10881966bceSXin LI HPT_U64 transform_point; 10981966bceSXin LI HPT_U16 transform_sectors_per_step; 11081966bceSXin LI HPT_U8 operation; 11181966bceSXin LI HPT_U8 disabled; 11281966bceSXin LI } HPT_TRANSFORM, *PHPT_TRANSFORM; 11381966bceSXin LI 11481966bceSXin LI typedef struct hpt_array 11581966bceSXin LI { 11681966bceSXin LI HPT_U32 array_stamp; 11781966bceSXin LI HPT_U32 data_stamp; 11881966bceSXin LI HPT_U32 array_sn; 11981966bceSXin LI 12081966bceSXin LI HPT_U8 ndisk; 12181966bceSXin LI HPT_U8 block_size_shift; 12281966bceSXin LI HPT_U16 strip_width; 12381966bceSXin LI HPT_U8 sector_size_shift; /*sector size = 512B<<sector_size_shift*/ 12481966bceSXin LI HPT_U8 jid; 12581966bceSXin LI HPT_U8 reserved[2]; 12681966bceSXin LI 12781966bceSXin LI 12881966bceSXin LI HPT_MMASK outdated_members; 12981966bceSXin LI HPT_MMASK offline_members; 13081966bceSXin LI 13181966bceSXin LI PVDEV member[MAX_MEMBERS]; 13281966bceSXin LI 13381966bceSXin LI RAID_FLAGS flags; 13481966bceSXin LI 13581966bceSXin LI HPT_U64 rebuilt_sectors; 13681966bceSXin LI 13781966bceSXin LI 13881966bceSXin LI HPT_U8 name[MAX_ARRAY_NAME]; 13981966bceSXin LI PHPT_TRANSFORM transform; 14081966bceSXin LI 14181966bceSXin LI TIME_RECORD create_time; 14281966bceSXin LI HPT_U8 description[64]; 14381966bceSXin LI HPT_U8 create_manager[16]; 14481966bceSXin LI 14581966bceSXin LI #ifdef OS_SUPPORT_TASK 14681966bceSXin LI int floating_priority; 14781966bceSXin LI OSM_TASK ioctl_task; 14881966bceSXin LI IOCTL_ARG ioctl_arg; 14981966bceSXin LI 15081966bceSXin LI char ioctl_inbuf[sizeof(PVDEV)+sizeof(HPT_U64)+sizeof(HPT_U16)]; 15181966bceSXin LI char ioctl_outbuf[sizeof(HPT_UINT)]; 15281966bceSXin LI #endif 15381966bceSXin LI 15481966bceSXin LI } HPT_ARRAY, *PHPT_ARRAY; 15581966bceSXin LI 15681966bceSXin LI #ifdef OS_SUPPORT_TASK 15781966bceSXin LI void ldm_start_rebuild(struct _VDEV *pArray); 15881966bceSXin LI #else 15981966bceSXin LI #define ldm_start_rebuild(pArray) 16081966bceSXin LI #endif 16181966bceSXin LI 16281966bceSXin LI typedef struct _raw_partition{ 16381966bceSXin LI struct _raw_partition * next; 16481966bceSXin LI __HPT_RAW_LBA start; 16581966bceSXin LI __HPT_RAW_LBA capacity; 16681966bceSXin LI PVDEV vd_part; 16781966bceSXin LI } RAW_PARTITION, *PRAW_PARTITION; 16881966bceSXin LI 16981966bceSXin LI typedef struct hpt_partiton 17081966bceSXin LI { 17181966bceSXin LI PVDEV raw_disk; 17281966bceSXin LI __HPT_RAW_LBA des_location; 17381966bceSXin LI PRAW_PARTITION raw_part; 17481966bceSXin LI HPT_U8 del_mbr; 17581966bceSXin LI HPT_U8 reserved[3]; 17681966bceSXin LI } HPT_PARTITION, *PHPT_PARTITION; 17781966bceSXin LI 17881966bceSXin LI void ldm_check_array_online(PVDEV pArray); 17981966bceSXin LI void ldm_generic_member_failed(PVDEV member); 18081966bceSXin LI void ldm_sync_array_info(PVDEV pArray); 18181966bceSXin LI void ldm_sync_array_stamp(PVDEV pArray); 18281966bceSXin LI void ldm_add_spare_to_array(PVDEV pArray, PVDEV spare_partition); 18381966bceSXin LI 18481966bceSXin LI #if defined(__cplusplus) 18581966bceSXin LI } 18681966bceSXin LI #endif 18781966bceSXin LI #endif 188