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/ioctl.c 190809 2009-04-07 16:38:25Z delphij $ |
27 */ 28/* 29 * ioctl.c ioctl interface implementation 30 */ 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/kernel.h> 34#include <sys/malloc.h> --- 169 unchanged lines hidden (view full) --- 204 while (pAdapter->outstandingCommands) { 205 KdPrint(("outstandingCommands is %d, wait..\n", pAdapter->outstandingCommands)); 206 if (!mWaitingForIdle(_VBUS_P0)) CallWhenIdle(_VBUS_P nothing, 0); 207 unlock_driver(oldspl); 208/*Schedule out*/ 209#if (__FreeBSD_version < 500000) 210 YIELD_THREAD; 211#else |
212#if (__FreeBSD_version > 700033) |
213 pause("switch", 1); |
214#else 215 tsleep(lock_driver_idle, PPAUSE, "switch", 1); |
216#endif |
217#endif |
218 oldspl = lock_driver(); 219 } 220 CheckIdleCall(_VBUS_P0); 221 return oldspl; 222} 223 224int Kernel_DeviceIoControl(_VBUS_ARG 225 DWORD dwIoControlCode, /* operation control code */ --- 110 unchanged lines hidden (view full) --- 336 /* read-only ioctl functions can be called directly. */ 337 case HPT_IOCTL_GET_VERSION: 338 case HPT_IOCTL_GET_CONTROLLER_IDS: 339 case HPT_IOCTL_GET_CONTROLLER_COUNT: 340 case HPT_IOCTL_GET_CONTROLLER_INFO: 341 case HPT_IOCTL_GET_CHANNEL_INFO: 342 case HPT_IOCTL_GET_LOGICAL_DEVICES: 343 case HPT_IOCTL_GET_DEVICE_INFO: |
344 case HPT_IOCTL_GET_DEVICE_INFO_V2: |
345 case HPT_IOCTL_GET_EVENT: 346 case HPT_IOCTL_GET_DRIVER_CAPABILITIES: 347 if(hpt_default_ioctl(_VBUS_P dwIoControlCode, lpInBuffer, nInBufferSize, 348 lpOutBuffer, nOutBufferSize, lpBytesReturned) == -1) return -1; 349 break; 350 351 default: 352 /* 353 * GUI always use /proc/scsi/hptmv/0, so the _vbus_p param will be 354 * wrong for second controller. 355 */ 356 switch(dwIoControlCode) { 357 case HPT_IOCTL_CREATE_ARRAY: 358 pVDev = ID_TO_VDEV(((PCREATE_ARRAY_PARAMS)lpInBuffer)->Members[0]); break; |
359 case HPT_IOCTL_CREATE_ARRAY_V2: 360 pVDev = ID_TO_VDEV(((PCREATE_ARRAY_PARAMS_V2)lpInBuffer)->Members[0]); break; |
361 case HPT_IOCTL_SET_ARRAY_INFO: 362 pVDev = ID_TO_VDEV(((PHPT_SET_ARRAY_INFO)lpInBuffer)->idArray); break; 363 case HPT_IOCTL_SET_DEVICE_INFO: 364 pVDev = ID_TO_VDEV(((PHPT_SET_DEVICE_INFO)lpInBuffer)->idDisk); break; |
365 case HPT_IOCTL_SET_DEVICE_INFO_V2: 366 pVDev = ID_TO_VDEV(((PHPT_SET_DEVICE_INFO_V2)lpInBuffer)->idDisk); break; |
367 case HPT_IOCTL_SET_BOOT_MARK: 368 case HPT_IOCTL_ADD_SPARE_DISK: 369 case HPT_IOCTL_REMOVE_SPARE_DISK: 370 pVDev = ID_TO_VDEV(*(DEVICEID *)lpInBuffer); break; 371 case HPT_IOCTL_ADD_DISK_TO_ARRAY: 372 pVDev = ID_TO_VDEV(((PHPT_ADD_DISK_TO_ARRAY)lpInBuffer)->idArray); break; 373 default: 374 pVDev = 0; --- 39 unchanged lines hidden (view full) --- 414 else if(((PCREATE_ARRAY_PARAMS)lpInBuffer)->CreateFlags & CAF_CREATE_R5_BUILD_PARITY) 415 { 416 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), REBUILD_PARITY); 417 } 418 unlock_driver(oldspl); 419 break; 420 } 421 |
422 423 case HPT_IOCTL_CREATE_ARRAY_V2: 424 { 425 pAdapter=(IAL_ADAPTER_T *)(ID_TO_VDEV(*(DEVICEID *)lpOutBuffer))->pVBus->OsExt; 426 oldspl = lock_driver(); 427 if(((PCREATE_ARRAY_PARAMS_V2)lpInBuffer)->CreateFlags & CAF_CREATE_AND_DUPLICATE) { 428 (ID_TO_VDEV(*(DEVICEID *)lpOutBuffer))->u.array.rf_auto_rebuild = 0; 429 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), DUPLICATE); 430 } else if(((PCREATE_ARRAY_PARAMS_V2)lpInBuffer)->CreateFlags & CAF_CREATE_R5_ZERO_INIT) { 431 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), INITIALIZE); 432 } else if(((PCREATE_ARRAY_PARAMS_V2)lpInBuffer)->CreateFlags & CAF_CREATE_R5_BUILD_PARITY) { 433 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), REBUILD_PARITY); 434 } 435 unlock_driver(oldspl); 436 break; 437 } |
438 case HPT_IOCTL_ADD_DISK_TO_ARRAY: 439 { 440 PVDevice pArray = ID_TO_VDEV(((PHPT_ADD_DISK_TO_ARRAY)lpInBuffer)->idArray); 441 pAdapter=(IAL_ADAPTER_T *)pArray->pVBus->OsExt; 442 if(pArray->u.array.rf_rebuilding == 0) 443 { 444 DWORD timeout = 0; 445 oldspl = lock_driver(); 446 pArray->u.array.rf_auto_rebuild = 0; 447 pArray->u.array.rf_abort_rebuild = 0; 448 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, DUPLICATE); 449 unlock_driver(oldspl); 450 while (!pArray->u.array.rf_rebuilding) 451 { |
452#if (__FreeBSD_version > 700033) |
453 pause("pause", 1); |
454#else 455 tsleep((caddr_t)Kernel_DeviceIoControl, PPAUSE, "pause", 1); 456#endif |
457 if ( timeout >= hz*3) 458 break; 459 timeout ++; 460 } 461 } 462 break; 463 } 464 } --- 48 unchanged lines hidden (view full) --- 513 514 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pVDevice, 515 (UCHAR)((pVDevice->u.array.CriticalMembers || pVDevice->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY)); 516 517 unlock_driver(oldspl); 518 519 while (!pVDevice->u.array.rf_rebuilding) 520 { |
521#if (__FreeBSD_version > 700033) |
522 pause("pause", 1); |
523#else 524 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 525#endif |
526 if ( timeout >= hz*20) 527 break; 528 timeout ++; 529 } 530 } 531 532 break; 533 --- 8 unchanged lines hidden (view full) --- 542 return -1; 543 544 oldspl = lock_driver(); 545 pVDevice->u.array.rf_abort_rebuild = 1; 546 unlock_driver(oldspl); 547 548 while (pVDevice->u.array.rf_abort_rebuild) 549 { |
550#if (__FreeBSD_version > 700033) |
551 pause("pause", 1); |
552#else 553 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 554#endif |
555 if ( timeout >= hz*20) 556 break; 557 timeout ++; 558 } 559 } 560 break; 561 562 case AS_VERIFY_START: --- 7 unchanged lines hidden (view full) --- 570 571 oldspl = lock_driver(); 572 pVDevice->u.array.RebuildSectors = 0; 573 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pVDevice, VERIFY); 574 unlock_driver(oldspl); 575 576 while (!pVDevice->u.array.rf_verifying) 577 { |
578#if (__FreeBSD_version > 700033) |
579 pause("pause", 1); |
580#else 581 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 582#endif |
583 if ( timeout >= hz*20) 584 break; 585 timeout ++; 586 } 587 } 588 break; 589 590 case AS_VERIFY_ABORT: 591 { 592 if(pVDevice->u.array.rf_verifying != 1) 593 return -1; 594 595 oldspl = lock_driver(); 596 pVDevice->u.array.rf_abort_rebuild = 1; 597 unlock_driver(oldspl); 598 599 while (pVDevice->u.array.rf_abort_rebuild) 600 { |
601#if (__FreeBSD_version > 700033) |
602 pause("pause", 1); |
603#else 604 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 605#endif |
606 if ( timeout >= hz*80) 607 break; 608 timeout ++; 609 } 610 } 611 break; 612 613 case AS_INITIALIZE_START: --- 4 unchanged lines hidden (view full) --- 618 return -1; 619 620 oldspl = lock_driver(); 621 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pVDevice, VERIFY); 622 unlock_driver(oldspl); 623 624 while (!pVDevice->u.array.rf_initializing) 625 { |
626#if (__FreeBSD_version > 700033) |
627 pause("pause", 1); |
628#else 629 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 630#endif |
631 if ( timeout >= hz*80) 632 break; 633 timeout ++; 634 } 635 } 636 break; 637 638 case AS_INITIALIZE_ABORT: 639 { 640 if(pVDevice->u.array.rf_initializing != 1) 641 return -1; 642 643 oldspl = lock_driver(); 644 pVDevice->u.array.rf_abort_rebuild = 1; 645 unlock_driver(oldspl); 646 647 while (pVDevice->u.array.rf_abort_rebuild) 648 { |
649#if (__FreeBSD_version > 700033) |
650 pause("pause", 1); |
651#else 652 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 653#endif |
654 if ( timeout >= hz*80) 655 break; 656 timeout ++; 657 } 658 } 659 break; 660 661 default: --- 338 unchanged lines hidden (view full) --- 1000 KdPrintI(("currcmds is %d, wait..\n", pAdapter->outstandingCommands)); 1001 /* put this to have driver stop processing system commands quickly */ 1002 if (!mWaitingForIdle(_VBUS_P0)) CallWhenIdle(_VBUS_P nothing, 0); 1003 unlock_driver(oldspl); 1004 /*Schedule out*/ 1005#if (__FreeBSD_version < 500000) 1006 YIELD_THREAD; 1007#else |
1008#if (__FreeBSD_version > 700033) |
1009 pause("switch", 1); |
1010#else 1011 tsleep(hpt_rebuild_data_block, PPAUSE, "switch", 1); |
1012#endif |
1013#endif |
1014 oldspl = lock_driver(); 1015 } 1016 1017 if (needsync) SyncArrayInfo(pArray); 1018 if(needdelete && (pArray->u.array.rf_duplicate_must_done || (flags == INITIALIZE))) 1019 fDeleteArray(_VBUS_P pArray, TRUE); 1020 1021 Check_Idle_Call(pAdapter); 1022 unlock_driver(oldspl); 1023} |