master/cdev.c
changeset 1037 59f191c9185b
parent 1029 61ffe5f22306
child 1055 2be8918682fa
equal deleted inserted replaced
1036:dc2008bc8113 1037:59f191c9185b
   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             }