ioctl.c (169823) | ioctl.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/ioctl.c 169823 2007-05-21 09:26:47Z mjacob $ | 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 | 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) |
|
212 pause("switch", 1); | 213 pause("switch", 1); |
214#else 215 tsleep(lock_driver_idle, PPAUSE, "switch", 1); |
|
213#endif | 216#endif |
217#endif |
|
214 oldspl = lock_driver(); 215 } 216 CheckIdleCall(_VBUS_P0); 217 return oldspl; 218} 219 220int Kernel_DeviceIoControl(_VBUS_ARG 221 DWORD dwIoControlCode, /* operation control code */ --- 110 unchanged lines hidden (view full) --- 332 /* read-only ioctl functions can be called directly. */ 333 case HPT_IOCTL_GET_VERSION: 334 case HPT_IOCTL_GET_CONTROLLER_IDS: 335 case HPT_IOCTL_GET_CONTROLLER_COUNT: 336 case HPT_IOCTL_GET_CONTROLLER_INFO: 337 case HPT_IOCTL_GET_CHANNEL_INFO: 338 case HPT_IOCTL_GET_LOGICAL_DEVICES: 339 case HPT_IOCTL_GET_DEVICE_INFO: | 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: |
|
340 case HPT_IOCTL_GET_EVENT: 341 case HPT_IOCTL_GET_DRIVER_CAPABILITIES: 342 if(hpt_default_ioctl(_VBUS_P dwIoControlCode, lpInBuffer, nInBufferSize, 343 lpOutBuffer, nOutBufferSize, lpBytesReturned) == -1) return -1; 344 break; 345 346 default: 347 /* 348 * GUI always use /proc/scsi/hptmv/0, so the _vbus_p param will be 349 * wrong for second controller. 350 */ 351 switch(dwIoControlCode) { 352 case HPT_IOCTL_CREATE_ARRAY: 353 pVDev = ID_TO_VDEV(((PCREATE_ARRAY_PARAMS)lpInBuffer)->Members[0]); break; | 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; |
|
354 case HPT_IOCTL_SET_ARRAY_INFO: 355 pVDev = ID_TO_VDEV(((PHPT_SET_ARRAY_INFO)lpInBuffer)->idArray); break; 356 case HPT_IOCTL_SET_DEVICE_INFO: 357 pVDev = ID_TO_VDEV(((PHPT_SET_DEVICE_INFO)lpInBuffer)->idDisk); 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; |
|
358 case HPT_IOCTL_SET_BOOT_MARK: 359 case HPT_IOCTL_ADD_SPARE_DISK: 360 case HPT_IOCTL_REMOVE_SPARE_DISK: 361 pVDev = ID_TO_VDEV(*(DEVICEID *)lpInBuffer); break; 362 case HPT_IOCTL_ADD_DISK_TO_ARRAY: 363 pVDev = ID_TO_VDEV(((PHPT_ADD_DISK_TO_ARRAY)lpInBuffer)->idArray); break; 364 default: 365 pVDev = 0; --- 39 unchanged lines hidden (view full) --- 405 else if(((PCREATE_ARRAY_PARAMS)lpInBuffer)->CreateFlags & CAF_CREATE_R5_BUILD_PARITY) 406 { 407 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), REBUILD_PARITY); 408 } 409 unlock_driver(oldspl); 410 break; 411 } 412 | 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 } |
|
413 case HPT_IOCTL_ADD_DISK_TO_ARRAY: 414 { 415 PVDevice pArray = ID_TO_VDEV(((PHPT_ADD_DISK_TO_ARRAY)lpInBuffer)->idArray); 416 pAdapter=(IAL_ADAPTER_T *)pArray->pVBus->OsExt; 417 if(pArray->u.array.rf_rebuilding == 0) 418 { 419 DWORD timeout = 0; 420 oldspl = lock_driver(); 421 pArray->u.array.rf_auto_rebuild = 0; 422 pArray->u.array.rf_abort_rebuild = 0; 423 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, DUPLICATE); 424 unlock_driver(oldspl); 425 while (!pArray->u.array.rf_rebuilding) 426 { | 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) |
|
427 pause("pause", 1); | 453 pause("pause", 1); |
454#else 455 tsleep((caddr_t)Kernel_DeviceIoControl, PPAUSE, "pause", 1); 456#endif |
|
428 if ( timeout >= hz*3) 429 break; 430 timeout ++; 431 } 432 } 433 break; 434 } 435 } --- 48 unchanged lines hidden (view full) --- 484 485 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pVDevice, 486 (UCHAR)((pVDevice->u.array.CriticalMembers || pVDevice->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY)); 487 488 unlock_driver(oldspl); 489 490 while (!pVDevice->u.array.rf_rebuilding) 491 { | 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) |
|
492 pause("pause", 1); | 522 pause("pause", 1); |
523#else 524 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 525#endif |
|
493 if ( timeout >= hz*20) 494 break; 495 timeout ++; 496 } 497 } 498 499 break; 500 --- 8 unchanged lines hidden (view full) --- 509 return -1; 510 511 oldspl = lock_driver(); 512 pVDevice->u.array.rf_abort_rebuild = 1; 513 unlock_driver(oldspl); 514 515 while (pVDevice->u.array.rf_abort_rebuild) 516 { | 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) |
|
517 pause("pause", 1); | 551 pause("pause", 1); |
552#else 553 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 554#endif |
|
518 if ( timeout >= hz*20) 519 break; 520 timeout ++; 521 } 522 } 523 break; 524 525 case AS_VERIFY_START: --- 7 unchanged lines hidden (view full) --- 533 534 oldspl = lock_driver(); 535 pVDevice->u.array.RebuildSectors = 0; 536 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pVDevice, VERIFY); 537 unlock_driver(oldspl); 538 539 while (!pVDevice->u.array.rf_verifying) 540 { | 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) |
|
541 pause("pause", 1); | 579 pause("pause", 1); |
580#else 581 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 582#endif |
|
542 if ( timeout >= hz*20) 543 break; 544 timeout ++; 545 } 546 } 547 break; 548 549 case AS_VERIFY_ABORT: 550 { 551 if(pVDevice->u.array.rf_verifying != 1) 552 return -1; 553 554 oldspl = lock_driver(); 555 pVDevice->u.array.rf_abort_rebuild = 1; 556 unlock_driver(oldspl); 557 558 while (pVDevice->u.array.rf_abort_rebuild) 559 { | 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) |
|
560 pause("pause", 1); | 602 pause("pause", 1); |
603#else 604 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 605#endif |
|
561 if ( timeout >= hz*80) 562 break; 563 timeout ++; 564 } 565 } 566 break; 567 568 case AS_INITIALIZE_START: --- 4 unchanged lines hidden (view full) --- 573 return -1; 574 575 oldspl = lock_driver(); 576 hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pVDevice, VERIFY); 577 unlock_driver(oldspl); 578 579 while (!pVDevice->u.array.rf_initializing) 580 { | 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) |
|
581 pause("pause", 1); | 627 pause("pause", 1); |
628#else 629 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 630#endif |
|
582 if ( timeout >= hz*80) 583 break; 584 timeout ++; 585 } 586 } 587 break; 588 589 case AS_INITIALIZE_ABORT: 590 { 591 if(pVDevice->u.array.rf_initializing != 1) 592 return -1; 593 594 oldspl = lock_driver(); 595 pVDevice->u.array.rf_abort_rebuild = 1; 596 unlock_driver(oldspl); 597 598 while (pVDevice->u.array.rf_abort_rebuild) 599 { | 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) |
|
600 pause("pause", 1); | 650 pause("pause", 1); |
651#else 652 tsleep((caddr_t)hpt_set_array_state, PPAUSE, "pause", 1); 653#endif |
|
601 if ( timeout >= hz*80) 602 break; 603 timeout ++; 604 } 605 } 606 break; 607 608 default: --- 338 unchanged lines hidden (view full) --- 947 KdPrintI(("currcmds is %d, wait..\n", pAdapter->outstandingCommands)); 948 /* put this to have driver stop processing system commands quickly */ 949 if (!mWaitingForIdle(_VBUS_P0)) CallWhenIdle(_VBUS_P nothing, 0); 950 unlock_driver(oldspl); 951 /*Schedule out*/ 952#if (__FreeBSD_version < 500000) 953 YIELD_THREAD; 954#else | 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) |
|
955 pause("switch", 1); | 1009 pause("switch", 1); |
1010#else 1011 tsleep(hpt_rebuild_data_block, PPAUSE, "switch", 1); |
|
956#endif | 1012#endif |
1013#endif |
|
957 oldspl = lock_driver(); 958 } 959 960 if (needsync) SyncArrayInfo(pArray); 961 if(needdelete && (pArray->u.array.rf_duplicate_must_done || (flags == INITIALIZE))) 962 fDeleteArray(_VBUS_P pArray, TRUE); 963 964 Check_Idle_Call(pAdapter); 965 unlock_driver(oldspl); 966} | 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} |