613 */
614 static int
615 cmdksuspend(dev_info_t *dip)
616 {
617 struct cmdk *dkp;
618 int instance;
619 clock_t count = 0;
620
621 instance = ddi_get_instance(dip);
622 if (!(dkp = ddi_get_soft_state(cmdk_state, instance)))
623 return (DDI_FAILURE);
624 mutex_enter(&dkp->dk_mutex);
625 if (dkp->dk_flag & CMDK_SUSPEND) {
626 mutex_exit(&dkp->dk_mutex);
627 return (DDI_SUCCESS);
628 }
629 dkp->dk_flag |= CMDK_SUSPEND;
630
631 /* need to wait a while */
632 while (dadk_getcmds(DKTP_DATA) != 0) {
633 delay(drv_usectohz(1000000));
634 if (count > 60) {
635 dkp->dk_flag &= ~CMDK_SUSPEND;
636 cv_broadcast(&dkp->dk_suspend_cv);
637 mutex_exit(&dkp->dk_mutex);
638 return (DDI_FAILURE);
639 }
640 count++;
641 }
642 mutex_exit(&dkp->dk_mutex);
643 return (DDI_SUCCESS);
644 }
645
646 /*
647 * resume routine, it will be run when get the command
648 * DDI_RESUME at attach(9E) from system power management
649 */
650 static int
651 cmdkresume(dev_info_t *dip)
652 {
653 struct cmdk *dkp;
|
613 */
614 static int
615 cmdksuspend(dev_info_t *dip)
616 {
617 struct cmdk *dkp;
618 int instance;
619 clock_t count = 0;
620
621 instance = ddi_get_instance(dip);
622 if (!(dkp = ddi_get_soft_state(cmdk_state, instance)))
623 return (DDI_FAILURE);
624 mutex_enter(&dkp->dk_mutex);
625 if (dkp->dk_flag & CMDK_SUSPEND) {
626 mutex_exit(&dkp->dk_mutex);
627 return (DDI_SUCCESS);
628 }
629 dkp->dk_flag |= CMDK_SUSPEND;
630
631 /* need to wait a while */
632 while (dadk_getcmds(DKTP_DATA) != 0) {
633 delay(drv_sectohz(1));
634 if (count > 60) {
635 dkp->dk_flag &= ~CMDK_SUSPEND;
636 cv_broadcast(&dkp->dk_suspend_cv);
637 mutex_exit(&dkp->dk_mutex);
638 return (DDI_FAILURE);
639 }
640 count++;
641 }
642 mutex_exit(&dkp->dk_mutex);
643 return (DDI_SUCCESS);
644 }
645
646 /*
647 * resume routine, it will be run when get the command
648 * DDI_RESUME at attach(9E) from system power management
649 */
650 static int
651 cmdkresume(dev_info_t *dip)
652 {
653 struct cmdk *dkp;
|