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 ¶m2); 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} |