xref: /netbsd-src/sys/dev/raidframe/rf_compat80.h (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /*	$NetBSD: rf_compat80.h,v 1.2 2018/01/20 01:32:45 mrg Exp $	*/
2 
3 /*
4  * Copyright (c) 2017 Matthew R. Green
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30 
31 #ifndef _RF_COMPAT80_H_
32 #define _RF_COMPAT80_H_
33 
34 #include <sys/ioccom.h>
35 
36 /* NetBSD 8.99.x removed the row, raidPtr and next members */
37 struct rf_recon_req80 {
38 	RF_RowCol_t row, col;
39 	RF_ReconReqFlags_t flags;
40 	void   *raidPtr;	/* used internally; need not be set at ioctl
41 				 * time */
42 	struct rf_recon_req *next;	/* used internally; need not be set at
43 					 * ioctl time */
44 };
45 
46 /* NetBSD 8.99.x made this structure alignment neutral */
47 typedef struct RF_RaidDisk_s80 {
48         char    devname[56];    /* name of device file */
49         RF_DiskStatus_t status; /* whether it is up or down */
50         RF_RowCol_t spareRow;   /* if in status "spared", this identifies the
51                                  * spare disk */
52         RF_RowCol_t spareCol;   /* if in status "spared", this identifies the
53                                  * spare disk */
54         RF_SectorCount_t numBlocks;     /* number of blocks, obtained via READ
55                                          * CAPACITY */
56         int     blockSize;
57         RF_SectorCount_t partitionSize; /* The *actual* and *full* size of
58                                            the partition, from the disklabel */
59         int     auto_configured;/* 1 if this component was autoconfigured.
60                                    0 otherwise. */
61         dev_t   dev;
62 } RF_RaidDisk_t80;
63 
64 typedef struct RF_DeviceConfig_s80 {
65 	u_int   rows;
66 	u_int   cols;
67 	u_int   maxqdepth;
68 	int     ndevs;
69 	RF_RaidDisk_t80 devs[RF_MAX_DISKS];
70 	int     nspares;
71 	RF_RaidDisk_t80 spares[RF_MAX_DISKS];
72 } RF_DeviceConfig_t80;
73 
74 typedef struct RF_Config_s80 {
75 	RF_RowCol_t numRow, numCol, numSpare;	/* number of rows, columns,
76 						 * and spare disks */
77 	dev_t   devs[RF_MAXROW][RF_MAXCOL];	/* device numbers for disks
78 						 * comprising array */
79 	char    devnames[RF_MAXROW][RF_MAXCOL][50];	/* device names */
80 	dev_t   spare_devs[RF_MAXSPARE];	/* device numbers for spare
81 						 * disks */
82 	char    spare_names[RF_MAXSPARE][50];	/* device names */
83 	RF_SectorNum_t sectPerSU;	/* sectors per stripe unit */
84 	RF_StripeNum_t SUsPerPU;/* stripe units per parity unit */
85 	RF_StripeNum_t SUsPerRU;/* stripe units per reconstruction unit */
86 	RF_ParityConfig_t parityConfig;	/* identifies the RAID architecture to
87 					 * be used */
88 	RF_DiskQueueType_t diskQueueType;	/* 'f' = fifo, 'c' = cvscan,
89 						 * not used in kernel */
90 	char    maxOutstandingDiskReqs;	/* # concurrent reqs to be sent to a
91 					 * disk.  not used in kernel. */
92 	char    debugVars[RF_MAXDBGV][50];	/* space for specifying debug
93 						 * variables & their values */
94 	unsigned int layoutSpecificSize;	/* size in bytes of
95 						 * layout-specific info */
96 	void   *layoutSpecific;	/* a pointer to a layout-specific structure to
97 				 * be copied in */
98 	int     force;                          /* if !0, ignore many fatal
99 						   configuration conditions */
100 	/*
101 	   "force" is used to override cases where the component labels would
102 	   indicate that configuration should not proceed without user
103 	   intervention
104 	 */
105 } RF_Config_t80;
106 
107 /*
108  * These ioctls were versioned after NetBSD 8.x.
109  *
110  * RAIDFRAME_FAIL_DISK had unused pointers removed from the structure.
111  * RAIDFRAME_CHECK_*EXT and RAIDFRAME_GET_COMPONENT_LABEL were converted
112  * from pointers to full structures so that ioctl framework does the copyout.
113  * RAIDFRAME_GET_INFO80 had the containing structure reorganised so that
114  * the layout became bitsize neutral.
115  *
116  * These 6 changes enable COMPAT_NETBSD32 support to work sanely with
117  * these ioctls, leaving only RAIDFRAME_CONFIGURE needing extra help.
118  */
119 
120 #define RAIDFRAME_FAIL_DISK80				_IOW ('r', 5,  struct rf_recon_req80)
121 #define RAIDFRAME_GET_COMPONENT_LABEL80			_IOWR('r', 19, RF_ComponentLabel_t *)
122 #define RAIDFRAME_CHECK_RECON_STATUS_EXT80		_IOWR('r', 32, RF_ProgressInfo_t *)
123 #define RAIDFRAME_CHECK_PARITYREWRITE_STATUS_EXT80	_IOWR('r', 33, RF_ProgressInfo_t *)
124 #define RAIDFRAME_CHECK_COPYBACK_STATUS_EXT80		_IOWR('r', 34, RF_ProgressInfo_t *)
125 #define RAIDFRAME_GET_INFO80				_IOWR('r', 36, RF_DeviceConfig_t80 *)
126 #define RAIDFRAME_CONFIGURE80				_IOW ('r', 35, void *)
127 
128 int rf_check_recon_status_ext80(RF_Raid_t *, void *);
129 int rf_check_parityrewrite_status_ext80(RF_Raid_t *, void *);
130 int rf_check_copyback_status_ext80(RF_Raid_t *, void *);
131 int rf_get_info80(RF_Raid_t *, void *);
132 int rf_get_component_label80(RF_Raid_t *, void *);
133 int rf_config80(RF_Raid_t *, int, void *, RF_Config_t **);
134 
135 #endif /* _RF_COMPAT80_H_ */
136