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