626 // interrupted by signal |
626 // interrupted by signal |
627 down(&master->sdo_sem); |
627 down(&master->sdo_sem); |
628 if (request.req.state == EC_REQUEST_QUEUED) { |
628 if (request.req.state == EC_REQUEST_QUEUED) { |
629 list_del(&request.req.list); |
629 list_del(&request.req.list); |
630 up(&master->sdo_sem); |
630 up(&master->sdo_sem); |
|
631 ec_sdo_request_clear(&request.req); |
631 retval = -EINTR; |
632 retval = -EINTR; |
632 break; |
633 break; |
633 } |
634 } |
634 // request already processing: interrupt not possible. |
635 // request already processing: interrupt not possible. |
635 up(&master->sdo_sem); |
636 up(&master->sdo_sem); |
636 } |
637 } |
637 |
638 |
638 // wait until master FSM has finished processing |
639 // wait until master FSM has finished processing |
639 wait_event(master->sdo_queue, request.req.state != EC_REQUEST_BUSY); |
640 wait_event(master->sdo_queue, request.req.state != EC_REQUEST_BUSY); |
|
641 |
|
642 data.abort_code = request.req.abort_code; |
640 |
643 |
641 if (request.req.state != EC_REQUEST_SUCCESS) { |
644 if (request.req.state != EC_REQUEST_SUCCESS) { |
|
645 data.data_size = 0; |
642 retval = -EIO; |
646 retval = -EIO; |
643 break; |
647 } else { |
644 } |
648 if (request.req.data_size > data.target_size) { |
645 |
649 EC_ERR("Buffer too small.\n"); |
646 if (request.req.data_size > data.target_size) { |
650 ec_sdo_request_clear(&request.req); |
647 EC_ERR("Buffer too small.\n"); |
651 retval = -EOVERFLOW; |
648 retval = -EOVERFLOW; |
652 break; |
649 break; |
653 } |
650 } |
654 data.data_size = request.req.data_size; |
651 data.data_size = request.req.data_size; |
655 |
652 |
656 if (copy_to_user((void __user *) data.target, |
653 if (copy_to_user((void __user *) data.target, |
657 request.req.data, data.data_size)) { |
654 request.req.data, data.data_size)) { |
658 ec_sdo_request_clear(&request.req); |
655 retval = -EFAULT; |
659 retval = -EFAULT; |
656 break; |
660 break; |
657 } |
661 } |
|
662 } |
|
663 |
658 if (__copy_to_user((void __user *) arg, &data, sizeof(data))) { |
664 if (__copy_to_user((void __user *) arg, &data, sizeof(data))) { |
659 retval = -EFAULT; |
665 retval = -EFAULT; |
660 break; |
|
661 } |
666 } |
662 |
667 |
663 ec_sdo_request_clear(&request.req); |
668 ec_sdo_request_clear(&request.req); |
664 break; |
669 break; |
665 } |
670 } |
719 // interrupted by signal |
724 // interrupted by signal |
720 down(&master->sdo_sem); |
725 down(&master->sdo_sem); |
721 if (request.req.state == EC_REQUEST_QUEUED) { |
726 if (request.req.state == EC_REQUEST_QUEUED) { |
722 list_del(&request.req.list); |
727 list_del(&request.req.list); |
723 up(&master->sdo_sem); |
728 up(&master->sdo_sem); |
|
729 ec_sdo_request_clear(&request.req); |
724 retval = -EINTR; |
730 retval = -EINTR; |
725 break; |
731 break; |
726 } |
732 } |
727 // request already processing: interrupt not possible. |
733 // request already processing: interrupt not possible. |
728 up(&master->sdo_sem); |
734 up(&master->sdo_sem); |
729 } |
735 } |
730 |
736 |
731 // wait until master FSM has finished processing |
737 // wait until master FSM has finished processing |
732 wait_event(master->sdo_queue, request.req.state != EC_REQUEST_BUSY); |
738 wait_event(master->sdo_queue, request.req.state != EC_REQUEST_BUSY); |
733 |
739 |
|
740 data.abort_code = request.req.abort_code; |
|
741 |
734 if (request.req.state != EC_REQUEST_SUCCESS) { |
742 if (request.req.state != EC_REQUEST_SUCCESS) { |
735 retval = -EIO; |
743 retval = -EIO; |
736 break; |
744 } |
|
745 |
|
746 if (__copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
747 retval = -EFAULT; |
737 } |
748 } |
738 |
749 |
739 ec_sdo_request_clear(&request.req); |
750 ec_sdo_request_clear(&request.req); |
740 break; |
751 break; |
741 } |
752 } |