Deleted Added
full compact
gui_lib.c (149871) gui_lib.c (190809)
1/*
2 * Copyright (c) 2004-2005 HighPoint Technologies, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*
2 * Copyright (c) 2004-2005 HighPoint Technologies, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/dev/hptmv/gui_lib.c 149871 2005-09-07 23:33:26Z scottl $
26 * $FreeBSD: head/sys/dev/hptmv/gui_lib.c 190809 2009-04-07 16:38:25Z delphij $
27 */
28/*
29 * gui_lib.c
30 * Copyright (c) 2002-2004 HighPoint Technologies, Inc. All rights reserved.
31 *
32 * Platform independent ioctl interface implementation.
33 * The platform dependent part may reuse this function and/or use it own
34 * implementation for each ioctl function.

--- 17 unchanged lines hidden (view full) ---

52#include <dev/hptmv/access601.h>
53
54static int hpt_get_driver_capabilities(PDRIVER_CAPABILITIES cap);
55static int hpt_get_controller_count(void);
56static int hpt_get_controller_info(int id, PCONTROLLER_INFO pInfo);
57static int hpt_get_channel_info(int id, int bus, PCHANNEL_INFO pInfo);
58static int hpt_get_logical_devices(DEVICEID * pIds, int nMaxCount);
59static int hpt_get_device_info(DEVICEID id, PLOGICAL_DEVICE_INFO pInfo);
27 */
28/*
29 * gui_lib.c
30 * Copyright (c) 2002-2004 HighPoint Technologies, Inc. All rights reserved.
31 *
32 * Platform independent ioctl interface implementation.
33 * The platform dependent part may reuse this function and/or use it own
34 * implementation for each ioctl function.

--- 17 unchanged lines hidden (view full) ---

52#include <dev/hptmv/access601.h>
53
54static int hpt_get_driver_capabilities(PDRIVER_CAPABILITIES cap);
55static int hpt_get_controller_count(void);
56static int hpt_get_controller_info(int id, PCONTROLLER_INFO pInfo);
57static int hpt_get_channel_info(int id, int bus, PCHANNEL_INFO pInfo);
58static int hpt_get_logical_devices(DEVICEID * pIds, int nMaxCount);
59static int hpt_get_device_info(DEVICEID id, PLOGICAL_DEVICE_INFO pInfo);
60static int hpt_get_device_info_v2(DEVICEID id, PLOGICAL_DEVICE_INFO_V2 pInfo);
60static DEVICEID hpt_create_array(_VBUS_ARG PCREATE_ARRAY_PARAMS pParam);
61static DEVICEID hpt_create_array(_VBUS_ARG PCREATE_ARRAY_PARAMS pParam);
62static DEVICEID hpt_create_array_v2(_VBUS_ARG PCREATE_ARRAY_PARAMS_V2 pParam);
61static int hpt_add_spare_disk(_VBUS_ARG DEVICEID idDisk);
62static int hpt_remove_spare_disk(_VBUS_ARG DEVICEID idDisk);
63static int hpt_set_array_info(_VBUS_ARG DEVICEID idArray, PALTERABLE_ARRAY_INFO pInfo);
64static int hpt_set_device_info(_VBUS_ARG DEVICEID idDisk, PALTERABLE_DEVICE_INFO pInfo);
63static int hpt_add_spare_disk(_VBUS_ARG DEVICEID idDisk);
64static int hpt_remove_spare_disk(_VBUS_ARG DEVICEID idDisk);
65static int hpt_set_array_info(_VBUS_ARG DEVICEID idArray, PALTERABLE_ARRAY_INFO pInfo);
66static int hpt_set_device_info(_VBUS_ARG DEVICEID idDisk, PALTERABLE_DEVICE_INFO pInfo);
67static int hpt_set_device_info_v2(_VBUS_ARG DEVICEID idDisk, PALTERABLE_DEVICE_INFO_V2 pInfo);
65
66int
67check_VDevice_valid(PVDevice p)
68{
69 int i;
70 PVDevice pVDevice;
71 PVBus _vbus_p;
72 IAL_ADAPTER_T *pAdapter = gIal_Adapter;

--- 19 unchanged lines hidden (view full) ---

92 pAdapter = pAdapter->next;
93 }
94#endif
95
96 return -1;
97}
98
99#ifdef SUPPORT_ARRAY
68
69int
70check_VDevice_valid(PVDevice p)
71{
72 int i;
73 PVDevice pVDevice;
74 PVBus _vbus_p;
75 IAL_ADAPTER_T *pAdapter = gIal_Adapter;

--- 19 unchanged lines hidden (view full) ---

95 pAdapter = pAdapter->next;
96 }
97#endif
98
99 return -1;
100}
101
102#ifdef SUPPORT_ARRAY
100static void get_array_info(PVDevice pVDevice, PLOGICAL_DEVICE_INFO pInfo)
101{
102 int i;
103
103
104 pInfo->Type = LDT_ARRAY;
105 pInfo->Capacity = pVDevice->VDeviceCapacity;
106 pInfo->ParentArray = VDEV_TO_ID(pVDevice->pParent);
107
108 memcpy(pInfo->u.array.Name, pVDevice->u.array.ArrayName, MAX_ARRAY_NAME);
109
110 switch( pVDevice->VDeviceType )
104static UCHAR get_vdev_type(PVDevice pVDevice)
111 {
105 {
112 case VD_RAID_0:
113 pInfo->u.array.ArrayType = AT_RAID0;
114 break;
115 case VD_RAID_1:
116 pInfo->u.array.ArrayType = AT_RAID1;
117 break;
118 case VD_JBOD:
119 pInfo->u.array.ArrayType = AT_JBOD;
120 break;
121 case VD_RAID_5:
122 pInfo->u.array.ArrayType = AT_RAID5;
123 break;
124 default:
125 pInfo->u.array.ArrayType = AT_UNKNOWN;
106 switch (pVDevice->VDeviceType) {
107 case VD_RAID_0: return AT_RAID0;
108 case VD_RAID_1: return AT_RAID1;
109 case VD_JBOD: return AT_JBOD;
110 case VD_RAID_5: return AT_RAID5;
111 default: return AT_UNKNOWN;
126 }
112 }
113 }
127
114
128 pInfo->u.array.BlockSizeShift = pVDevice->u.array.bArBlockSizeShift;
115static DWORD get_array_flag(PVDevice pVDevice)
116{
117 int i;
118 DWORD f = 0;
129
119
130 pInfo->u.array.RebuiltSectors = pVDevice->u.array.RebuildSectors;
131
132 /* The array is disabled */
133 if(!pVDevice->vf_online) {
120 /* The array is disabled */
121 if(!pVDevice->vf_online) {
134 pInfo->u.array.Flags |= ARRAY_FLAG_DISABLED;
135 goto ignore_info;
122 f |= ARRAY_FLAG_DISABLED;
123 /* Ignore other info */
124 return f;
136 }
137
138 /* array need synchronizing */
139 if(pVDevice->u.array.rf_need_rebuild && !pVDevice->u.array.rf_duplicate_and_create)
125 }
126
127 /* array need synchronizing */
128 if(pVDevice->u.array.rf_need_rebuild && !pVDevice->u.array.rf_duplicate_and_create)
140 pInfo->u.array.Flags |= ARRAY_FLAG_NEEDBUILDING;
129 f |= ARRAY_FLAG_NEEDBUILDING;
141
130
142 pInfo->u.array.RebuildingProgress = ((pVDevice->u.array.RebuildSectors>>11)*1000 /
143 (pVDevice->VDeviceCapacity>>11) * (pVDevice->u.array.bArnMember-1)) * 10;
144
145 /* array is in rebuilding process */
146 if(pVDevice->u.array.rf_rebuilding)
131 /* array is in rebuilding process */
132 if(pVDevice->u.array.rf_rebuilding)
147 pInfo->u.array.Flags |= ARRAY_FLAG_REBUILDING;
133 f |= ARRAY_FLAG_REBUILDING;
148
149 /* array is being verified */
150 if(pVDevice->u.array.rf_verifying)
134
135 /* array is being verified */
136 if(pVDevice->u.array.rf_verifying)
151 pInfo->u.array.Flags |= ARRAY_FLAG_VERIFYING;
137 f |= ARRAY_FLAG_VERIFYING;
152
153 /* array is being initialized */
154 if(pVDevice->u.array.rf_initializing)
138
139 /* array is being initialized */
140 if(pVDevice->u.array.rf_initializing)
155 pInfo->u.array.Flags |= ARRAY_FLAG_INITIALIZING;
141 f |= ARRAY_FLAG_INITIALIZING;
156
157 /* broken but may still working */
158 if(pVDevice->u.array.rf_broken)
142
143 /* broken but may still working */
144 if(pVDevice->u.array.rf_broken)
159 pInfo->u.array.Flags |= ARRAY_FLAG_BROKEN;
145 f |= ARRAY_FLAG_BROKEN;
160
161 /* array has a active partition */
162 if(pVDevice->vf_bootable)
146
147 /* array has a active partition */
148 if(pVDevice->vf_bootable)
163 pInfo->u.array.Flags |= ARRAY_FLAG_BOOTDISK;
149 f |= ARRAY_FLAG_BOOTDISK;
164
165 /* a newly created array */
166 if(pVDevice->u.array.rf_newly_created)
150
151 /* a newly created array */
152 if(pVDevice->u.array.rf_newly_created)
167 pInfo->u.array.Flags |= ARRAY_FLAG_NEWLY_CREATED;
153 f |= ARRAY_FLAG_NEWLY_CREATED;
168
169 /* array has boot mark set */
170 if(pVDevice->vf_bootmark)
154
155 /* array has boot mark set */
156 if(pVDevice->vf_bootmark)
171 pInfo->u.array.Flags |= ARRAY_FLAG_BOOTMARK;
157 f |= ARRAY_FLAG_BOOTMARK;
172
173 /* auto-rebuild should start */
174 if(pVDevice->u.array.rf_auto_rebuild)
158
159 /* auto-rebuild should start */
160 if(pVDevice->u.array.rf_auto_rebuild)
175 pInfo->u.array.Flags |= ARRAY_FLAG_NEED_AUTOREBUILD;
161 f |= ARRAY_FLAG_NEED_AUTOREBUILD;
176
177 for(i = 0; i < pVDevice->u.array.bArnMember; i++)
178 {
179 PVDevice pMember = pVDevice->u.array.pMember[i];
180 if (!pMember || !pMember->vf_online || (pMember->VDeviceType==VD_SINGLE_DISK))
181 continue;
182
183 /* array need synchronizing */
184 if(pMember->u.array.rf_need_rebuild &&
185 !pMember->u.array.rf_duplicate_and_create)
162
163 for(i = 0; i < pVDevice->u.array.bArnMember; i++)
164 {
165 PVDevice pMember = pVDevice->u.array.pMember[i];
166 if (!pMember || !pMember->vf_online || (pMember->VDeviceType==VD_SINGLE_DISK))
167 continue;
168
169 /* array need synchronizing */
170 if(pMember->u.array.rf_need_rebuild &&
171 !pMember->u.array.rf_duplicate_and_create)
186 pInfo->u.array.Flags |= ARRAY_FLAG_NEEDBUILDING;
172 f |= ARRAY_FLAG_NEEDBUILDING;
187
188 /* array is in rebuilding process */
189 if(pMember->u.array.rf_rebuilding)
173
174 /* array is in rebuilding process */
175 if(pMember->u.array.rf_rebuilding)
190 pInfo->u.array.Flags |= ARRAY_FLAG_REBUILDING;
176 f |= ARRAY_FLAG_REBUILDING;
191
192 /* array is being verified */
193 if(pMember->u.array.rf_verifying)
177
178 /* array is being verified */
179 if(pMember->u.array.rf_verifying)
194 pInfo->u.array.Flags |= ARRAY_FLAG_VERIFYING;
180 f |= ARRAY_FLAG_VERIFYING;
195
196 /* array is being initialized */
197 if(pMember->u.array.rf_initializing)
181
182 /* array is being initialized */
183 if(pMember->u.array.rf_initializing)
198 pInfo->u.array.Flags |= ARRAY_FLAG_INITIALIZING;
184 f |= ARRAY_FLAG_INITIALIZING;
199
200 /* broken but may still working */
201 if(pMember->u.array.rf_broken)
185
186 /* broken but may still working */
187 if(pMember->u.array.rf_broken)
202 pInfo->u.array.Flags |= ARRAY_FLAG_BROKEN;
188 f |= ARRAY_FLAG_BROKEN;
203
204 /* a newly created array */
205 if(pMember->u.array.rf_newly_created)
189
190 /* a newly created array */
191 if(pMember->u.array.rf_newly_created)
206 pInfo->u.array.Flags |= ARRAY_FLAG_NEWLY_CREATED;
192 f |= ARRAY_FLAG_NEWLY_CREATED;
207
208 /* auto-rebuild should start */
209 if(pMember->u.array.rf_auto_rebuild)
193
194 /* auto-rebuild should start */
195 if(pMember->u.array.rf_auto_rebuild)
210 pInfo->u.array.Flags |= ARRAY_FLAG_NEED_AUTOREBUILD;
196 f |= ARRAY_FLAG_NEED_AUTOREBUILD;
197 }
211
198
199 return f;
200}
201
202static DWORD calc_rebuild_progress(PVDevice pVDevice)
203{
204 int i;
205 DWORD result = ((ULONG)(pVDevice->u.array.RebuildSectors>>11)*1000 /
206 (ULONG)(pVDevice->VDeviceCapacity>>11) * (pVDevice->u.array.bArnMember-1)) * 10;
207
208 for(i = 0; i < pVDevice->u.array.bArnMember; i++)
209 {
210 PVDevice pMember = pVDevice->u.array.pMember[i];
211 if (!pMember || !pMember->vf_online || (pMember->VDeviceType==VD_SINGLE_DISK))
212 continue;
213
212 /* for RAID1/0 case */
213 if (pMember->u.array.rf_rebuilding ||
214 pMember->u.array.rf_verifying ||
215 pMember->u.array.rf_initializing)
216 {
214 /* for RAID1/0 case */
215 if (pMember->u.array.rf_rebuilding ||
216 pMember->u.array.rf_verifying ||
217 pMember->u.array.rf_initializing)
218 {
217 DWORD percent = ((pMember->u.array.RebuildSectors>>11)*1000 /
218 (pMember->VDeviceCapacity>>11) * (pMember->u.array.bArnMember-1)) * 10;
219 if (pInfo->u.array.RebuildingProgress==0 ||
220 pInfo->u.array.RebuildingProgress>percent)
221 pInfo->u.array.RebuildingProgress = percent;
219 DWORD percent = ((ULONG)(pMember->u.array.RebuildSectors>>11)*1000 /
220 (ULONG)(pMember->VDeviceCapacity>>11) * (pMember->u.array.bArnMember-1)) * 10;
221 if (result==0 || result>percent)
222 result = percent;
222 }
223 }
224 }
225
226 if (result>10000) result = 10000;
227 return result;
223 }
224
228 }
229
225 if (pInfo->u.array.RebuildingProgress>10000)
226 pInfo->u.array.RebuildingProgress = 10000;
230static void get_array_info(PVDevice pVDevice, PHPT_ARRAY_INFO pArrayInfo)
231{
232 int i;
227
233
228ignore_info:
234 memcpy(pArrayInfo->Name, pVDevice->u.array.ArrayName, MAX_ARRAY_NAME);
235 pArrayInfo->ArrayType = get_vdev_type(pVDevice);
236 pArrayInfo->BlockSizeShift = pVDevice->u.array.bArBlockSizeShift;
237 pArrayInfo->RebuiltSectors = pVDevice->u.array.RebuildSectors;
238 pArrayInfo->Flags = get_array_flag(pVDevice);
239 pArrayInfo->RebuildingProgress = calc_rebuild_progress(pVDevice);
229
240
230 pInfo->u.array.nDisk = 0;
231 for(i=0; i<MAX_ARRAY_MEMBERS; i++)
232 pInfo->u.array.Members[i] = INVALID_DEVICEID;
241 pArrayInfo->nDisk = 0;
233
234 for(i = 0; i < pVDevice->u.array.bArnMember; i++)
242
243 for(i = 0; i < pVDevice->u.array.bArnMember; i++)
235 {
236 if(pVDevice->u.array.pMember[i] != 0)
237 {
238 pInfo->u.array.Members[pInfo->u.array.nDisk] = VDEV_TO_ID(pVDevice->u.array.pMember[i]);
239 pInfo->u.array.nDisk++;
240 }
244 if(pVDevice->u.array.pMember[i] != NULL)
245 pArrayInfo->Members[pArrayInfo->nDisk++] = VDEV_TO_ID(pVDevice->u.array.pMember[i]);
246
247 for(i=pArrayInfo->nDisk; i<MAX_ARRAY_MEMBERS; i++)
248 pArrayInfo->Members[i] = INVALID_DEVICEID;
241 }
249 }
250
251static void get_array_info_v2(PVDevice pVDevice, PHPT_ARRAY_INFO_V2 pArrayInfo)
252{
253 int i;
254
255 memcpy(pArrayInfo->Name, pVDevice->u.array.ArrayName, MAX_ARRAYNAME_LEN);
256 pArrayInfo->ArrayType = get_vdev_type(pVDevice);
257 pArrayInfo->BlockSizeShift = pVDevice->u.array.bArBlockSizeShift;
258 pArrayInfo->RebuiltSectors.lo32 = pVDevice->u.array.RebuildSectors;
259 pArrayInfo->RebuiltSectors.hi32 = sizeof(LBA_T)>4? (pVDevice->u.array.RebuildSectors>>32) : 0;
260 pArrayInfo->Flags = get_array_flag(pVDevice);
261 pArrayInfo->RebuildingProgress = calc_rebuild_progress(pVDevice);
262
263 pArrayInfo->nDisk = 0;
264
265 for(i = 0; i < pVDevice->u.array.bArnMember; i++)
266 if(pVDevice->u.array.pMember[i] != NULL)
267 pArrayInfo->Members[pArrayInfo->nDisk++] = VDEV_TO_ID(pVDevice->u.array.pMember[i]);
268
269 for(i=pArrayInfo->nDisk; i<MAX_ARRAY_MEMBERS_V2; i++)
270 pArrayInfo->Members[i] = INVALID_DEVICEID;
242}
243#endif
244
271}
272#endif
273
245static int get_disk_info(PVDevice pVDevice, PLOGICAL_DEVICE_INFO pInfo)
274static int get_disk_info(PVDevice pVDevice, PDEVICE_INFO pDiskInfo)
246{
247 MV_SATA_ADAPTER *pSataAdapter;
248 MV_SATA_CHANNEL *pSataChannel;
249 IAL_ADAPTER_T *pAdapter;
275{
276 MV_SATA_ADAPTER *pSataAdapter;
277 MV_SATA_CHANNEL *pSataChannel;
278 IAL_ADAPTER_T *pAdapter;
279 MV_CHANNEL *channelInfo;
250 char *p;
251 int i;
252
280 char *p;
281 int i;
282
253 pInfo->Type = LDT_DEVICE;
254
255 if (pVDevice->pParent)
256 pInfo->ParentArray = VDEV_TO_ID(pVDevice->pParent);
257 else
258 pInfo->ParentArray = INVALID_DEVICEID;
259
260 /* report real capacity to be compatible with old arrays */
261 pInfo->Capacity = pVDevice->u.disk.dDeRealCapacity;
262
263 /* device location */
264 pSataChannel = pVDevice->u.disk.mv;
265 if(pSataChannel == NULL) return -1;
283 /* device location */
284 pSataChannel = pVDevice->u.disk.mv;
285 if(pSataChannel == NULL) return -1;
266 pInfo->u.device.TargetId = 0;
286 pDiskInfo->TargetId = 0;
267 pSataAdapter = pSataChannel->mvSataAdapter;
268 if(pSataAdapter == NULL) return -1;
269
270 pAdapter = pSataAdapter->IALData;
271
287 pSataAdapter = pSataChannel->mvSataAdapter;
288 if(pSataAdapter == NULL) return -1;
289
290 pAdapter = pSataAdapter->IALData;
291
272 pInfo->u.device.PathId = pSataChannel->channelNumber;
273 pInfo->u.device.ControllerId = (UCHAR)pSataAdapter->adapterId;
292 pDiskInfo->PathId = pSataChannel->channelNumber;
293 pDiskInfo->ControllerId = (UCHAR)pSataAdapter->adapterId;
274
275/*GUI uses DeviceModeSetting to display to users
276(1) if users select a mode, GUI/BIOS should display that mode.
277(2) if SATA/150, GUI/BIOS should display 150 if case (1) isn't satisfied.
278(3) display real mode if case (1)&&(2) not satisfied.
279*/
280 if (pVDevice->u.disk.df_user_mode_set)
294
295/*GUI uses DeviceModeSetting to display to users
296(1) if users select a mode, GUI/BIOS should display that mode.
297(2) if SATA/150, GUI/BIOS should display 150 if case (1) isn't satisfied.
298(3) display real mode if case (1)&&(2) not satisfied.
299*/
300 if (pVDevice->u.disk.df_user_mode_set)
281 pInfo->u.device.DeviceModeSetting = pVDevice->u.disk.bDeUserSelectMode;
282 else if ((((PIDENTIFY_DATA)pVDevice->u.disk.mv->identifyDevice)->SataCapability & 3)==2)
283 pInfo->u.device.DeviceModeSetting = 15;
301 pDiskInfo->DeviceModeSetting = pVDevice->u.disk.bDeUserSelectMode;
302 else if (((((PIDENTIFY_DATA)pVDevice->u.disk.mv->identifyDevice)->SataCapability) & 3)==2)
303 pDiskInfo->DeviceModeSetting = 15;
284 else {
285 p = (char *)&((PIDENTIFY_DATA)pVDevice->u.disk.mv->identifyDevice)->ModelNumber;
304 else {
305 p = (char *)&((PIDENTIFY_DATA)pVDevice->u.disk.mv->identifyDevice)->ModelNumber;
286 if (*(WORD*)p==0x5354 /*'ST'*/ &&
287 (*(WORD*)(p+8)==0x4153/*'AS'*/ || (p[8]=='A' && p[11]=='S')))
288 pInfo->u.device.DeviceModeSetting = 15;
306 if (*(WORD*)p==(0x5354) /*'ST'*/ &&
307 (*(WORD*)(p+8)==(0x4153)/*'AS'*/ || (p[8]=='A' && p[11]=='S')))
308 pDiskInfo->DeviceModeSetting = 15;
289 else
309 else
290 pInfo->u.device.DeviceModeSetting = pVDevice->u.disk.bDeModeSetting;
310 pDiskInfo->DeviceModeSetting = pVDevice->u.disk.bDeModeSetting;
291 }
292
311 }
312
293 pInfo->u.device.UsableMode = pVDevice->u.disk.bDeUsable_Mode;
313 pDiskInfo->UsableMode = pVDevice->u.disk.bDeUsable_Mode;
294
314
295 pInfo->u.device.DeviceType = PDT_HARDDISK;
315 pDiskInfo->DeviceType = PDT_HARDDISK;
296
316
297 pInfo->u.device.Flags = 0x0;
317 pDiskInfo->Flags = 0x0;
298
299 /* device is disabled */
300 if(!pVDevice->u.disk.df_on_line)
318
319 /* device is disabled */
320 if(!pVDevice->u.disk.df_on_line)
301 pInfo->u.device.Flags |= DEVICE_FLAG_DISABLED;
321 pDiskInfo->Flags |= DEVICE_FLAG_DISABLED;
302
303 /* disk has a active partition */
304 if(pVDevice->vf_bootable)
322
323 /* disk has a active partition */
324 if(pVDevice->vf_bootable)
305 pInfo->u.device.Flags |= DEVICE_FLAG_BOOTDISK;
325 pDiskInfo->Flags |= DEVICE_FLAG_BOOTDISK;
306
307 /* disk has boot mark set */
308 if(pVDevice->vf_bootmark)
326
327 /* disk has boot mark set */
328 if(pVDevice->vf_bootmark)
309 pInfo->u.device.Flags |= DEVICE_FLAG_BOOTMARK;
329 pDiskInfo->Flags |= DEVICE_FLAG_BOOTMARK;
310
330
311 pInfo->u.device.Flags |= DEVICE_FLAG_SATA;
331 pDiskInfo->Flags |= DEVICE_FLAG_SATA;
312
313 /* is a spare disk */
314 if(pVDevice->VDeviceType == VD_SPARE)
332
333 /* is a spare disk */
334 if(pVDevice->VDeviceType == VD_SPARE)
315 pInfo->u.device.Flags |= DEVICE_FLAG_IS_SPARE;
335 pDiskInfo->Flags |= DEVICE_FLAG_IS_SPARE;
316
336
317 memcpy(&(pInfo->u.device.IdentifyData), (pSataChannel->identifyDevice), sizeof(IDENTIFY_DATA2));
318 p = (char *)&pInfo->u.device.IdentifyData.ModelNumber;
337 memcpy(&(pDiskInfo->IdentifyData), (pSataChannel->identifyDevice), sizeof(IDENTIFY_DATA2));
338 p = (char *)&pDiskInfo->IdentifyData.ModelNumber;
319 for (i = 0; i < 20; i++)
320 ((WORD*)p)[i] = shortswap(pSataChannel->identifyDevice[IDEN_MODEL_OFFSET+i]);
321 p[39] = '\0';
322
339 for (i = 0; i < 20; i++)
340 ((WORD*)p)[i] = shortswap(pSataChannel->identifyDevice[IDEN_MODEL_OFFSET+i]);
341 p[39] = '\0';
342
343 channelInfo = &pAdapter->mvChannel[pSataChannel->channelNumber];
344 pDiskInfo->ReadAheadSupported = channelInfo->readAheadSupported;
345 pDiskInfo->ReadAheadEnabled = channelInfo->readAheadEnabled;
346 pDiskInfo->WriteCacheSupported = channelInfo->writeCacheSupported;
347 pDiskInfo->WriteCacheEnabled = channelInfo->writeCacheEnabled;
348 pDiskInfo->TCQSupported = (pSataChannel->identifyDevice[IDEN_SUPPORTED_COMMANDS2] & (0x2))!=0;
349 pDiskInfo->TCQEnabled = pSataChannel->queuedDMA==MV_EDMA_MODE_QUEUED;
350 pDiskInfo->NCQSupported = MV_SATA_GEN_2(pSataAdapter) &&
351 (pSataChannel->identifyDevice[IDEN_SATA_CAPABILITIES] & (0x0100));
352 pDiskInfo->NCQEnabled = pSataChannel->queuedDMA==MV_EDMA_MODE_NATIVE_QUEUING;
323 return 0;
324}
325
326int hpt_get_driver_capabilities(PDRIVER_CAPABILITIES cap)
327{
328 ZeroMemory(cap, sizeof(DRIVER_CAPABILITIES));
329 cap->dwSize = sizeof(DRIVER_CAPABILITIES);
330 cap->MaximumControllers = MAX_VBUS;

--- 67 unchanged lines hidden (view full) ---

398 /* show "Bus Type: ATA/150" in GUI for SATA controllers */
399 pInfo->ChipFlags = CHIP_SUPPORT_ULTRA_150;
400#endif
401 strcpy(pInfo->szProductID, GUI_CONTROLLER_NAME);
402#define _set_product_id(x)
403#else
404#define _set_product_id(x) strcpy(pInfo->szProductID, x)
405#endif
353 return 0;
354}
355
356int hpt_get_driver_capabilities(PDRIVER_CAPABILITIES cap)
357{
358 ZeroMemory(cap, sizeof(DRIVER_CAPABILITIES));
359 cap->dwSize = sizeof(DRIVER_CAPABILITIES);
360 cap->MaximumControllers = MAX_VBUS;

--- 67 unchanged lines hidden (view full) ---

428 /* show "Bus Type: ATA/150" in GUI for SATA controllers */
429 pInfo->ChipFlags = CHIP_SUPPORT_ULTRA_150;
430#endif
431 strcpy(pInfo->szProductID, GUI_CONTROLLER_NAME);
432#define _set_product_id(x)
433#else
434#define _set_product_id(x) strcpy(pInfo->szProductID, x)
435#endif
406 _set_product_id("RocketRAID 182x SATA Controller");
436 _set_product_id("RocketRAID 18xx SATA Controller");
407 pInfo->NumBuses = 8;
408 pInfo->ChipFlags |= CHIP_SUPPORT_ULTRA_133|CHIP_SUPPORT_ULTRA_150;
409 return 0;
410 }
411 }
412 return -1;
413}
414

--- 67 unchanged lines hidden (view full) ---

482int hpt_get_device_info(DEVICEID id, PLOGICAL_DEVICE_INFO pInfo)
483{
484 PVDevice pVDevice = ID_TO_VDEV(id);
485
486 if((id == 0) || check_VDevice_valid(pVDevice))
487 return -1;
488
489#ifdef SUPPORT_ARRAY
437 pInfo->NumBuses = 8;
438 pInfo->ChipFlags |= CHIP_SUPPORT_ULTRA_133|CHIP_SUPPORT_ULTRA_150;
439 return 0;
440 }
441 }
442 return -1;
443}
444

--- 67 unchanged lines hidden (view full) ---

512int hpt_get_device_info(DEVICEID id, PLOGICAL_DEVICE_INFO pInfo)
513{
514 PVDevice pVDevice = ID_TO_VDEV(id);
515
516 if((id == 0) || check_VDevice_valid(pVDevice))
517 return -1;
518
519#ifdef SUPPORT_ARRAY
490 if (mIsArray(pVDevice))
491 get_array_info(pVDevice, pInfo);
492 else
520 if (mIsArray(pVDevice)) {
521 pInfo->Type = LDT_ARRAY;
522 pInfo->Capacity = pVDevice->VDeviceCapacity;
523 pInfo->ParentArray = VDEV_TO_ID(pVDevice->pParent);
524 get_array_info(pVDevice, &pInfo->u.array);
525 return 0;
526 }
493#endif
527#endif
494 return get_disk_info(pVDevice, pInfo);
495
528
529 pInfo->Type = LDT_DEVICE;
530 pInfo->ParentArray = pVDevice->pParent? VDEV_TO_ID(pVDevice->pParent) : INVALID_DEVICEID;
531 /* report real capacity to be compatible with old arrays */
532 pInfo->Capacity = pVDevice->u.disk.dDeRealCapacity;
533 return get_disk_info(pVDevice, &pInfo->u.device);
534}
535
536int hpt_get_device_info_v2(DEVICEID id, PLOGICAL_DEVICE_INFO_V2 pInfo)
537{
538 PVDevice pVDevice = ID_TO_VDEV(id);
539
540 if((id == 0) || check_VDevice_valid(pVDevice))
541 return -1;
542
543#ifdef SUPPORT_ARRAY
544 if (mIsArray(pVDevice)) {
545 pInfo->Type = LDT_ARRAY;
546 pInfo->Capacity.lo32 = pVDevice->VDeviceCapacity;
547 pInfo->Capacity.hi32 = sizeof(LBA_T)>4? (pVDevice->VDeviceCapacity>>32) : 0;
548 pInfo->ParentArray = VDEV_TO_ID(pVDevice->pParent);
549 get_array_info_v2(pVDevice, &pInfo->u.array);
496 return 0;
497}
550 return 0;
551}
552#endif
498
553
554 pInfo->Type = LDT_DEVICE;
555 pInfo->ParentArray = pVDevice->pParent? VDEV_TO_ID(pVDevice->pParent) : INVALID_DEVICEID;
556 /* report real capacity to be compatible with old arrays */
557 pInfo->Capacity.lo32 = pVDevice->u.disk.dDeRealCapacity;
558 pInfo->Capacity.hi32 = 0;
559 return get_disk_info(pVDevice, &pInfo->u.device);
560}
561
499#ifdef SUPPORT_ARRAY
562#ifdef SUPPORT_ARRAY
500DEVICEID hpt_create_array(_VBUS_ARG PCREATE_ARRAY_PARAMS pParam)
563DEVICEID hpt_create_array_v2(_VBUS_ARG PCREATE_ARRAY_PARAMS_V2 pParam)
501{
502 ULONG Stamp = GetStamp();
503 int i,j;
564{
565 ULONG Stamp = GetStamp();
566 int i,j;
504 ULONG capacity = MAX_LBA_T;
567 LBA_T capacity = MAX_LBA_T;
505 PVDevice pArray,pChild;
506 int Loca = -1;
507
568 PVDevice pArray,pChild;
569 int Loca = -1;
570
571 if (pParam->nDisk > MAX_MEMBERS)
572 return INVALID_DEVICEID;
573/* check in verify_vd
508 for(i = 0; i < pParam->nDisk; i++)
509 {
510 PVDevice pVDev = ID_TO_VDEV(pParam->Members[i]);
511 if (check_VDevice_valid(pVDev)) return INVALID_DEVICEID;
512 if (mIsArray(pVDev)) return INVALID_DEVICEID;
513 if (!pVDev->vf_online) return INVALID_DEVICEID;
514 if (!_vbus_p)
515 _vbus_p = pVDev->u.disk.pVBus;
516 else if (_vbus_p != pVDev->u.disk.pVBus)
517 return INVALID_DEVICEID;
518 }
574 for(i = 0; i < pParam->nDisk; i++)
575 {
576 PVDevice pVDev = ID_TO_VDEV(pParam->Members[i]);
577 if (check_VDevice_valid(pVDev)) return INVALID_DEVICEID;
578 if (mIsArray(pVDev)) return INVALID_DEVICEID;
579 if (!pVDev->vf_online) return INVALID_DEVICEID;
580 if (!_vbus_p)
581 _vbus_p = pVDev->u.disk.pVBus;
582 else if (_vbus_p != pVDev->u.disk.pVBus)
583 return INVALID_DEVICEID;
584 }
585*/
586 _vbus_p = (ID_TO_VDEV(pParam->Members[0]))->u.disk.pVBus;
519 if (!_vbus_p) return INVALID_DEVICEID;
520
521 mArGetArrayTable(pArray);
522 if(!pArray) return INVALID_DEVICEID;
523
524 switch (pParam->ArrayType)
525 {
526 case AT_JBOD:

--- 210 unchanged lines hidden (view full) ---

737 pChild = pArray->u.array.pMember[i];
738 if((pChild != NULL) && (pChild->VDeviceType != VD_SINGLE_DISK))
739 mArFreeArrayTable(pChild);
740 }
741 mArFreeArrayTable(pArray);
742 return INVALID_DEVICEID;
743}
744
587 if (!_vbus_p) return INVALID_DEVICEID;
588
589 mArGetArrayTable(pArray);
590 if(!pArray) return INVALID_DEVICEID;
591
592 switch (pParam->ArrayType)
593 {
594 case AT_JBOD:

--- 210 unchanged lines hidden (view full) ---

805 pChild = pArray->u.array.pMember[i];
806 if((pChild != NULL) && (pChild->VDeviceType != VD_SINGLE_DISK))
807 mArFreeArrayTable(pChild);
808 }
809 mArFreeArrayTable(pArray);
810 return INVALID_DEVICEID;
811}
812
813DEVICEID hpt_create_array(_VBUS_ARG PCREATE_ARRAY_PARAMS pParam)
814{
815 CREATE_ARRAY_PARAMS_V2 param2;
816 param2.ArrayType = pParam->ArrayType;
817 param2.nDisk = pParam->nDisk;
818 param2.BlockSizeShift = pParam->BlockSizeShift;
819 param2.CreateFlags = pParam->CreateFlags;
820 param2.CreateTime = pParam->CreateTime;
821 memcpy(param2.ArrayName, pParam->ArrayName, sizeof(param2.ArrayName));
822 memcpy(param2.Description, pParam->Description, sizeof(param2.Description));
823 memcpy(param2.CreateManager, pParam->CreateManager, sizeof(param2.CreateManager));
824 param2.Capacity.lo32 = param2.Capacity.hi32 = 0;
825 memcpy(param2.Members, pParam->Members, sizeof(pParam->Members));
826 return hpt_create_array_v2(_VBUS_P &param2);
827}
828
745#ifdef SUPPORT_OLD_ARRAY
746/* this is only for old RAID 0/1 */
747int old_add_disk_to_raid01(_VBUS_ARG DEVICEID idArray, DEVICEID idDisk)
748{
749 PVDevice pArray1 = ID_TO_VDEV(idArray);
750 PVDevice pArray2 = 0;
751 PVDevice pDisk = ID_TO_VDEV(idDisk);
752 int i;

--- 64 unchanged lines hidden (view full) ---

817 return 1;
818}
819#endif
820
821int hpt_add_disk_to_array(_VBUS_ARG DEVICEID idArray, DEVICEID idDisk)
822{
823 int i;
824
829#ifdef SUPPORT_OLD_ARRAY
830/* this is only for old RAID 0/1 */
831int old_add_disk_to_raid01(_VBUS_ARG DEVICEID idArray, DEVICEID idDisk)
832{
833 PVDevice pArray1 = ID_TO_VDEV(idArray);
834 PVDevice pArray2 = 0;
835 PVDevice pDisk = ID_TO_VDEV(idDisk);
836 int i;

--- 64 unchanged lines hidden (view full) ---

901 return 1;
902}
903#endif
904
905int hpt_add_disk_to_array(_VBUS_ARG DEVICEID idArray, DEVICEID idDisk)
906{
907 int i;
908
825 ULONG Capacity;
909 LBA_T Capacity;
826 PVDevice pArray = ID_TO_VDEV(idArray);
827 PVDevice pDisk = ID_TO_VDEV(idDisk);
828
829 if((idArray == 0) || (idDisk == 0)) return -1;
830 if(check_VDevice_valid(pArray) || check_VDevice_valid(pDisk)) return -1;
831 if(!pArray->u.array.rf_broken) return -1;
832
833 if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5)

--- 20 unchanged lines hidden (view full) ---

854 if(pDisk->u.disk.dDeRealCapacity < Capacity) return -1;
855 }
856 else
857 if(pDisk->VDeviceCapacity < Capacity) return -1;
858
859 if (pArray->pVBus!=_vbus_p) { HPT_ASSERT(0); return -1;}
860
861 for(i = 0; i < pArray->u.array.bArnMember; i++)
910 PVDevice pArray = ID_TO_VDEV(idArray);
911 PVDevice pDisk = ID_TO_VDEV(idDisk);
912
913 if((idArray == 0) || (idDisk == 0)) return -1;
914 if(check_VDevice_valid(pArray) || check_VDevice_valid(pDisk)) return -1;
915 if(!pArray->u.array.rf_broken) return -1;
916
917 if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5)

--- 20 unchanged lines hidden (view full) ---

938 if(pDisk->u.disk.dDeRealCapacity < Capacity) return -1;
939 }
940 else
941 if(pDisk->VDeviceCapacity < Capacity) return -1;
942
943 if (pArray->pVBus!=_vbus_p) { HPT_ASSERT(0); return -1;}
944
945 for(i = 0; i < pArray->u.array.bArnMember; i++)
862 if((pArray->u.array.pMember[i] == NULL) || !pArray->u.array.pMember[i]->vf_online)
946 if((pArray->u.array.pMember[i] == 0) || !pArray->u.array.pMember[i]->vf_online)
863 {
864 if(pArray->u.array.pMember[i] != NULL)
865 pArray->u.array.pMember[i]->pParent = NULL;
866 pArray->u.array.pMember[i] = pDisk;
867 goto find;
868 }
869 return -1;
870

--- 85 unchanged lines hidden (view full) ---

956 pVDevice->u.array.rf_need_sync = 1;
957 }
958
959 if (pVDevice->u.array.rf_need_sync)
960 SyncArrayInfo(pVDevice);
961 return 0;
962}
963
947 {
948 if(pArray->u.array.pMember[i] != NULL)
949 pArray->u.array.pMember[i]->pParent = NULL;
950 pArray->u.array.pMember[i] = pDisk;
951 goto find;
952 }
953 return -1;
954

--- 85 unchanged lines hidden (view full) ---

1040 pVDevice->u.array.rf_need_sync = 1;
1041 }
1042
1043 if (pVDevice->u.array.rf_need_sync)
1044 SyncArrayInfo(pVDevice);
1045 return 0;
1046}
1047
964int hpt_set_device_info(_VBUS_ARG DEVICEID idDisk, PALTERABLE_DEVICE_INFO pInfo)
1048static int hpt_set_device_info(_VBUS_ARG DEVICEID idDisk, PALTERABLE_DEVICE_INFO pInfo)
965{
966 PVDevice pVDevice = ID_TO_VDEV(idDisk);
967
1049{
1050 PVDevice pVDevice = ID_TO_VDEV(idDisk);
1051
968 /* stop buzzer. */
969 if(idDisk == 0) {
970#ifndef FOR_DEMO
971 IAL_ADAPTER_T *pAdapter;
972 for (pAdapter=gIal_Adapter; pAdapter; pAdapter=pAdapter->next) {
973 if (pAdapter->beeping) {
974 pAdapter->beeping = 0;
975 BeepOff(pAdapter->mvSataAdapter.adapterIoBaseAddress);
976 }
977 }
978#endif
1052 if(idDisk == 0 || check_VDevice_valid(pVDevice)) return -1;
1053 if (mIsArray(pVDevice))
1054 return -1;
1055
1056 if (pVDevice->u.disk.pVBus!=_vbus_p) return -1;
1057
1058 /* TODO */
979 return 0;
980 }
981
1059 return 0;
1060 }
1061
982 if (check_VDevice_valid(pVDevice)) return -1;
1062static int hpt_set_device_info_v2(_VBUS_ARG DEVICEID idDisk, PALTERABLE_DEVICE_INFO_V2 pInfo)
1063{
1064 PVDevice pVDevice = ID_TO_VDEV(idDisk);
1065 int sync = 0;
1066
1067 if(idDisk==0 || check_VDevice_valid(pVDevice)) return -1;
983 if (mIsArray(pVDevice))
984 return -1;
985
986 if (pVDevice->u.disk.pVBus!=_vbus_p) return -1;
987
1068 if (mIsArray(pVDevice))
1069 return -1;
1070
1071 if (pVDevice->u.disk.pVBus!=_vbus_p) return -1;
1072
988/* if (pInfo->ValidFields & ADIF_MODE) {
1073 if (pInfo->ValidFields & ADIF_MODE) {
989 pVDevice->u.disk.bDeModeSetting = pInfo->DeviceModeSetting;
990 pVDevice->u.disk.bDeUserSelectMode = pInfo->DeviceModeSetting;
991 pVDevice->u.disk.df_user_mode_set = 1;
992 fDeSelectMode((PDevice)&(pVDevice->u.disk), (UCHAR)pInfo->DeviceModeSetting);
1074 pVDevice->u.disk.bDeModeSetting = pInfo->DeviceModeSetting;
1075 pVDevice->u.disk.bDeUserSelectMode = pInfo->DeviceModeSetting;
1076 pVDevice->u.disk.df_user_mode_set = 1;
1077 fDeSelectMode((PDevice)&(pVDevice->u.disk), (UCHAR)pInfo->DeviceModeSetting);
993 SyncArrayInfo(pVDevice);
994 }*/
995 return 0;
1078 sync = 1;
996}
1079}
997#endif
998
1080
999#ifdef SUPPORT_HPT601
1000int hpt_get_601_info(DEVICEID idDisk, PHPT601_INFO pInfo)
1001{
1002 PVDevice pVDevice = ID_TO_VDEV(idDisk);
1003 PChannel pChan = pVDevice->u.disk.pChannel;
1004 PIDE_REGISTERS_1 IoPort = pChan->BaseIoAddress1;
1005
1006 if(!pVDevice->u.disk.df_with_601) return -1;
1007
1008 mSelectUnit(IoPort, pVDevice->u.disk.bDeUnitId);
1009 pChan->pChipInstance->ftbl.pfnWaitOnBusy(pChan, pVDevice->u.disk.bDeUnitId, 1);
1010
1011 BeginAccess601(IoPort);
1012
1013 mSetBlockCount(IoPort, 0);
1014 pInfo->DeviceId = InWord(&IoPort->Data);
1015
1016 mSetBlockCount(IoPort, 0x14);
1017 pInfo->Temperature = InWord(&IoPort->Data);
1018
1019 mSetBlockCount(IoPort, 0xA);
1020 pInfo->FanStatus = InWord(&IoPort->Data);
1021
1022 mSetBlockCount(IoPort, 7);
1023 pInfo->BeeperControl = InWord(&IoPort->Data);
1024
1025 mSetBlockCount(IoPort, 3);
1026 pInfo->LED1Control = InWord(&IoPort->Data);
1027
1028 mSetBlockCount(IoPort, 5);
1029 pInfo->LED2Control = InWord(&IoPort->Data);
1030
1031 mSetBlockCount(IoPort, 0x18);
1032 pInfo->PowerStatus = InWord(&IoPort->Data);
1033
1034 EndAccess601(IoPort);
1035 pInfo->ValidFields = 0x7F;
1036 /*DEVICEID|TEMPERATURE|FANSTATUS|BEEPERCONTROL|LED1CONTROL|LED2CONTROL|POWERSTATUS*/
1037 return 0;
1081 if (pInfo->ValidFields & ADIF_TCQ) {
1082 if (fDeSetTCQ(&pVDevice->u.disk, pInfo->TCQEnabled, 0)) {
1083 pVDevice->u.disk.df_tcq_set = 1;
1084 pVDevice->u.disk.df_tcq = pInfo->TCQEnabled!=0;
1085 sync = 1;
1038}
1086}
1039
1040int hpt_set_601_info(DEVICEID idDisk, PHPT601_INFO pInfo)
1041{
1042 PVDevice pVDevice = ID_TO_VDEV(idDisk);
1043 PChannel pChan = pVDevice->u.disk.pChannel;
1044 PIDE_REGISTERS_1 IoPort = pChan->BaseIoAddress1;
1045
1046 if(!pVDevice->u.disk.df_with_601) return -1;
1047
1048 mSelectUnit(IoPort, pVDevice->u.disk.bDeUnitId);
1049 pChan->pChipInstance->ftbl.pfnWaitOnBusy(pChan, pVDevice->u.disk.bDeUnitId, 1);
1050
1051 BeginAccess601(IoPort);
1052
1053 if (pInfo->ValidFields & HPT601_INFO_TEMPERATURE) {
1054 mSetBlockCount(IoPort, 1);
1055 OutWord(&IoPort->Data, pInfo->Temperature);
1056 }
1057
1087 }
1088
1058 if (pInfo->ValidFields & HPT601_INFO_FANSTATUS) {
1059 mSetBlockCount(IoPort, 0xA);
1060 OutWord(&IoPort->Data, pInfo->FanStatus);
1089 if (pInfo->ValidFields & ADIF_NCQ) {
1090 if (fDeSetNCQ(&pVDevice->u.disk, pInfo->NCQEnabled, 0)) {
1091 pVDevice->u.disk.df_ncq_set = 1;
1092 pVDevice->u.disk.df_ncq = pInfo->NCQEnabled!=0;
1093 sync = 1;
1061 }
1094 }
1062
1063 if (pInfo->ValidFields & HPT601_INFO_BEEPERCONTROL) {
1064 mSetBlockCount(IoPort, 7);
1065 OutWord(&IoPort->Data, pInfo->BeeperControl);
1066 }
1067
1095 }
1096
1068 if (pInfo->ValidFields & HPT601_INFO_LED1CONTROL) {
1069 mSetBlockCount(IoPort, 3);
1070 OutWord(&IoPort->Data, pInfo->LED1Control);
1097 if (pInfo->ValidFields & ADIF_WRITE_CACHE) {
1098 if (fDeSetWriteCache(&pVDevice->u.disk, pInfo->WriteCacheEnabled)) {
1099 pVDevice->u.disk.df_write_cache_set = 1;
1100 pVDevice->u.disk.df_write_cache = pInfo->WriteCacheEnabled!=0;
1101 sync = 1;
1071 }
1102 }
1072
1073 if (pInfo->ValidFields & HPT601_INFO_LED2CONTROL) {
1074 mSetBlockCount(IoPort, 5);
1075 OutWord(&IoPort->Data, pInfo->LED2Control);
1076 }
1077
1103 }
1104
1078 EndAccess601(IoPort);
1105 if (pInfo->ValidFields & ADIF_READ_AHEAD) {
1106 if (fDeSetReadAhead(&pVDevice->u.disk, pInfo->ReadAheadEnabled)) {
1107 pVDevice->u.disk.df_read_ahead_set = 1;
1108 pVDevice->u.disk.df_read_ahead = pInfo->ReadAheadEnabled!=0;
1109 sync = 1;
1110 }
1111 }
1079
1112
1113 if (sync)
1114 SyncArrayInfo(pVDevice);
1080 return 0;
1081}
1115 return 0;
1116}
1117
1082#endif
1083
1084/* hpt_default_ioctl()
1085 * This is a default implementation. The platform dependent part
1086 * may reuse this function and/or use it own implementation for
1087 * each ioctl function.
1088 */
1089int hpt_default_ioctl(_VBUS_ARG

--- 80 unchanged lines hidden (view full) ---

1170 pInfo = (PLOGICAL_DEVICE_INFO)lpOutBuffer;
1171 memset(pInfo, 0, sizeof(LOGICAL_DEVICE_INFO));
1172
1173 if (hpt_get_device_info(id, pInfo)!=0)
1174 return -1;
1175 }
1176 break;
1177
1118#endif
1119
1120/* hpt_default_ioctl()
1121 * This is a default implementation. The platform dependent part
1122 * may reuse this function and/or use it own implementation for
1123 * each ioctl function.
1124 */
1125int hpt_default_ioctl(_VBUS_ARG

--- 80 unchanged lines hidden (view full) ---

1206 pInfo = (PLOGICAL_DEVICE_INFO)lpOutBuffer;
1207 memset(pInfo, 0, sizeof(LOGICAL_DEVICE_INFO));
1208
1209 if (hpt_get_device_info(id, pInfo)!=0)
1210 return -1;
1211 }
1212 break;
1213
1178#ifdef SUPPORT_ARRAY
1179 case HPT_IOCTL_CREATE_ARRAY:
1214 case HPT_IOCTL_GET_DEVICE_INFO_V2:
1180 {
1215 {
1181 CREATE_ARRAY_PARAMS *pParam;
1182 DEVICEID id;
1216 DEVICEID id;
1217 PLOGICAL_DEVICE_INFO_V2 pInfo;
1183
1218
1219 if (nInBufferSize!=sizeof(DEVICEID)) return -1;
1220 if (nOutBufferSize!=sizeof(LOGICAL_DEVICE_INFO_V2)) return -1;
1221
1222 id = *(DWORD *)lpInBuffer;
1223 if (id == INVALID_DEVICEID) return -1;
1224
1225 pInfo = (PLOGICAL_DEVICE_INFO_V2)lpOutBuffer;
1226 memset(pInfo, 0, sizeof(LOGICAL_DEVICE_INFO_V2));
1227
1228 if (hpt_get_device_info_v2(id, pInfo)!=0)
1229 return -1;
1230 }
1231 break;
1232
1233#ifdef SUPPORT_ARRAY
1234 case HPT_IOCTL_CREATE_ARRAY:
1235 {
1184 if (nInBufferSize!=sizeof(CREATE_ARRAY_PARAMS)) return -1;
1185 if (nOutBufferSize!=sizeof(DEVICEID)) return -1;
1186
1236 if (nInBufferSize!=sizeof(CREATE_ARRAY_PARAMS)) return -1;
1237 if (nOutBufferSize!=sizeof(DEVICEID)) return -1;
1238
1187 pParam = (PCREATE_ARRAY_PARAMS)lpInBuffer;
1239 *(DEVICEID *)lpOutBuffer = hpt_create_array(_VBUS_P (PCREATE_ARRAY_PARAMS)lpInBuffer);
1188
1240
1189 id = hpt_create_array(_VBUS_P pParam);
1190 *(DEVICEID *)lpOutBuffer = id;
1241 if(*(DEVICEID *)lpOutBuffer == INVALID_DEVICEID)
1242 return -1;
1243 }
1244 break;
1191
1245
1192 if(id == (DEVICEID)INVALID_DEVICEID)
1246 case HPT_IOCTL_CREATE_ARRAY_V2:
1247 {
1248 if (nInBufferSize!=sizeof(CREATE_ARRAY_PARAMS_V2)) return -1;
1249 if (nOutBufferSize!=sizeof(DEVICEID)) return -1;
1250
1251 *(DEVICEID *)lpOutBuffer = hpt_create_array_v2(_VBUS_P (PCREATE_ARRAY_PARAMS_V2)lpInBuffer);
1252
1253 if (*(DEVICEID *)lpOutBuffer == INVALID_DEVICEID)
1193 return -1;
1194 }
1195 break;
1196
1197 case HPT_IOCTL_SET_ARRAY_INFO:
1198 {
1199 DEVICEID idArray;
1200 PALTERABLE_ARRAY_INFO pInfo;

--- 19 unchanged lines hidden (view full) ---

1220
1221 idDisk = ((PHPT_SET_DEVICE_INFO)lpInBuffer)->idDisk;
1222 pInfo = &((PHPT_SET_DEVICE_INFO)lpInBuffer)->Info;
1223 if(hpt_set_device_info(_VBUS_P idDisk, pInfo) != 0)
1224 return -1;
1225 }
1226 break;
1227
1254 return -1;
1255 }
1256 break;
1257
1258 case HPT_IOCTL_SET_ARRAY_INFO:
1259 {
1260 DEVICEID idArray;
1261 PALTERABLE_ARRAY_INFO pInfo;

--- 19 unchanged lines hidden (view full) ---

1281
1282 idDisk = ((PHPT_SET_DEVICE_INFO)lpInBuffer)->idDisk;
1283 pInfo = &((PHPT_SET_DEVICE_INFO)lpInBuffer)->Info;
1284 if(hpt_set_device_info(_VBUS_P idDisk, pInfo) != 0)
1285 return -1;
1286 }
1287 break;
1288
1289 case HPT_IOCTL_SET_DEVICE_INFO_V2:
1290 {
1291 DEVICEID idDisk;
1292 PALTERABLE_DEVICE_INFO_V2 pInfo;
1293
1294 if (nInBufferSize < sizeof(HPT_SET_DEVICE_INFO_V2)) return -1;
1295 if (nOutBufferSize!=0) return -1;
1296
1297 idDisk = ((PHPT_SET_DEVICE_INFO_V2)lpInBuffer)->idDisk;
1298 pInfo = &((PHPT_SET_DEVICE_INFO_V2)lpInBuffer)->Info;
1299 if(hpt_set_device_info_v2(_VBUS_P idDisk, pInfo) != 0)
1300 return -1;
1301 }
1302 break;
1303
1228 case HPT_IOCTL_SET_BOOT_MARK:
1229 {
1230 DEVICEID id;
1231 PVDevice pTop;
1232 int i;
1233 IAL_ADAPTER_T *pAdapter = gIal_Adapter;
1234 PVBus pVBus;
1235
1236 if (nInBufferSize!=sizeof(DEVICEID)) return -1;
1237 id = *(DEVICEID *)lpInBuffer;
1238 while(pAdapter != 0)
1239 {
1240 pVBus = &pAdapter->VBus;
1304 case HPT_IOCTL_SET_BOOT_MARK:
1305 {
1306 DEVICEID id;
1307 PVDevice pTop;
1308 int i;
1309 IAL_ADAPTER_T *pAdapter = gIal_Adapter;
1310 PVBus pVBus;
1311
1312 if (nInBufferSize!=sizeof(DEVICEID)) return -1;
1313 id = *(DEVICEID *)lpInBuffer;
1314 while(pAdapter != 0)
1315 {
1316 pVBus = &pAdapter->VBus;
1241 for(i = 0; i < MAX_ARRAY_PER_VBUS; i++)
1317 for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++)
1242 {
1243 if(!(pTop = pVBus->pVDevice[i])) continue;
1244 if (pTop->pVBus!=_vbus_p) return -1;
1245 while (pTop->pParent) pTop = pTop->pParent;
1246 if (id==0 && pTop->vf_bootmark)
1247 pTop->vf_bootmark = 0;
1248 else if (pTop==ID_TO_VDEV(id) && !pTop->vf_bootmark)
1249 pTop->vf_bootmark = 1;
1250 else
1251 continue;
1252 SyncArrayInfo(pTop);
1253 break;
1254 }
1255 pAdapter = pAdapter->next;
1256 }
1257 }
1258 break;
1318 {
1319 if(!(pTop = pVBus->pVDevice[i])) continue;
1320 if (pTop->pVBus!=_vbus_p) return -1;
1321 while (pTop->pParent) pTop = pTop->pParent;
1322 if (id==0 && pTop->vf_bootmark)
1323 pTop->vf_bootmark = 0;
1324 else if (pTop==ID_TO_VDEV(id) && !pTop->vf_bootmark)
1325 pTop->vf_bootmark = 1;
1326 else
1327 continue;
1328 SyncArrayInfo(pTop);
1329 break;
1330 }
1331 pAdapter = pAdapter->next;
1332 }
1333 }
1334 break;
1259#endif
1260 case HPT_IOCTL_RESCAN_DEVICES:
1261 {
1262 if (nInBufferSize!=0) return -1;
1263 if (nOutBufferSize!=0) return -1;
1264 fRescanAllDevice(_VBUS_P0);
1265 }
1266 break;
1267
1335
1268#ifdef SUPPORT_ARRAY
1269 case HPT_IOCTL_ADD_SPARE_DISK:
1270 {
1271 DEVICEID id;
1272
1273 if (nInBufferSize!=sizeof(DEVICEID)) return -1;
1274 if (nOutBufferSize!=0) return -1;
1275
1276 id = *(DEVICEID *)lpInBuffer;

--- 37 unchanged lines hidden (view full) ---

1314 if (nOutBufferSize<sizeof(DRIVER_CAPABILITIES)) return -1;
1315 cap = (PDRIVER_CAPABILITIES)lpOutBuffer;
1316
1317 if(hpt_get_driver_capabilities(cap))
1318 return -1;
1319 }
1320 break;
1321
1336 case HPT_IOCTL_ADD_SPARE_DISK:
1337 {
1338 DEVICEID id;
1339
1340 if (nInBufferSize!=sizeof(DEVICEID)) return -1;
1341 if (nOutBufferSize!=0) return -1;
1342
1343 id = *(DEVICEID *)lpInBuffer;

--- 37 unchanged lines hidden (view full) ---

1381 if (nOutBufferSize<sizeof(DRIVER_CAPABILITIES)) return -1;
1382 cap = (PDRIVER_CAPABILITIES)lpOutBuffer;
1383
1384 if(hpt_get_driver_capabilities(cap))
1385 return -1;
1386 }
1387 break;
1388
1322#ifdef SUPPORT_HPT601
1323 case HPT_IOCTL_GET_601_INFO:
1389 case HPT_IOCTL_GET_CONTROLLER_VENID:
1324 {
1390 {
1325 DEVICEID id;
1326 PHPT601_INFO pInfo;
1391 DWORD id = ((DWORD*)lpInBuffer)[0];
1392 IAL_ADAPTER_T *pAdapTemp;
1393 int iControllerCount = 0;
1327
1394
1328 if (nInBufferSize!=sizeof(DEVICEID)) return -1;
1329 if (nOutBufferSize!=sizeof(HPT601_INFO)) return -1;
1330
1331 id = *(DWORD *)lpInBuffer;
1332 if (id == INVALID_DEVICEID) return -1;
1333
1334 pInfo = (PHPT601_INFO)lpOutBuffer;
1335 memset(pInfo, 0, sizeof(HPT601_INFO));
1336
1337 if (hpt_get_601_info(id, pInfo)!=0)
1395 for (pAdapTemp = gIal_Adapter; pAdapTemp; pAdapTemp = pAdapTemp->next)
1396 if (iControllerCount++==id)
1397 break;
1398
1399 if (!pAdapTemp)
1338 return -1;
1400 return -1;
1401
1402 if (nOutBufferSize < 4)
1403 return -1;
1404
1405 *(DWORD*)lpOutBuffer = ((DWORD)pAdapTemp->mvSataAdapter.pciConfigDeviceId << 16) | 0x11AB;
1406 return 0;
1339 }
1407 }
1340 break;
1341
1408
1342 case HPT_IOCTL_SET_601_INFO:
1409 case HPT_IOCTL_EPROM_IO:
1343 {
1410 {
1344 DEVICEID id;
1345 PHPT601_INFO pInfo;
1411 DWORD id = ((DWORD*)lpInBuffer)[0];
1412 DWORD offset = ((DWORD*)lpInBuffer)[1];
1413 DWORD direction = ((DWORD*)lpInBuffer)[2];
1414 DWORD length = ((DWORD*)lpInBuffer)[3];
1415 IAL_ADAPTER_T *pAdapTemp;
1416 int iControllerCount = 0;
1346
1417
1347 if (nInBufferSize!=sizeof(HPT_SET_601_INFO)) return -1;
1348 if (nOutBufferSize!=0) return -1;
1349
1350 id = ((PHPT_SET_601_INFO)lpInBuffer)->idDisk;
1351 pInfo = &((PHPT_SET_601_INFO)lpInBuffer)->Info;
1352 if(hpt_set_601_info(id, pInfo) != 0)
1418 for (pAdapTemp = gIal_Adapter; pAdapTemp; pAdapTemp = pAdapTemp->next)
1419 if (iControllerCount++==id)
1420 break;
1421
1422 if (!pAdapTemp)
1353 return -1;
1423 return -1;
1424
1425 if (nInBufferSize < sizeof(DWORD) * 4 + (direction? length : 0) ||
1426 nOutBufferSize < (direction? 0 : length))
1427 return -1;
1428
1429 if (direction == 0) /* read */
1430 sx508x_flash_access(&pAdapTemp->mvSataAdapter,
1431 offset, lpOutBuffer, length, 1);
1432 else
1433 sx508x_flash_access(&pAdapTemp->mvSataAdapter,
1434 offset, (char *)lpInBuffer + 16, length, 0);
1435
1436 return 0;
1354 }
1355 break;
1437 }
1438 break;
1356#endif
1439
1357 default:
1358 return -1;
1359 }
1360
1361 if (lpBytesReturned)
1362 *lpBytesReturned = nOutBufferSize;
1363 return 0;
1364}
1440 default:
1441 return -1;
1442 }
1443
1444 if (lpBytesReturned)
1445 *lpBytesReturned = nOutBufferSize;
1446 return 0;
1447}