Deleted Added
full compact
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}