master/cdev.c
changeset 1037 59f191c9185b
parent 1029 61ffe5f22306
child 1055 2be8918682fa
--- a/master/cdev.c	Thu Jun 19 08:06:49 2008 +0000
+++ b/master/cdev.c	Thu Jun 19 09:24:22 2008 +0000
@@ -628,6 +628,7 @@
                     if (request.req.state == EC_REQUEST_QUEUED) {
                         list_del(&request.req.list);
                         up(&master->sdo_sem);
+                        ec_sdo_request_clear(&request.req);
                         retval = -EINTR;
                         break;
                     }
@@ -637,27 +638,31 @@
 
                 // wait until master FSM has finished processing
                 wait_event(master->sdo_queue, request.req.state != EC_REQUEST_BUSY);
+                
+                data.abort_code = request.req.abort_code;
 
                 if (request.req.state != EC_REQUEST_SUCCESS) {
+                    data.data_size = 0;
                     retval = -EIO;
-                    break;
-                }
-
-                if (request.req.data_size > data.target_size) {
-                    EC_ERR("Buffer too small.\n");
-                    retval = -EOVERFLOW;
-                    break;
-                }
-                data.data_size = request.req.data_size;
-
-                if (copy_to_user((void __user *) data.target,
-                            request.req.data, data.data_size)) {
-                    retval = -EFAULT;
-                    break;
-                }
+                } else {
+                    if (request.req.data_size > data.target_size) {
+                        EC_ERR("Buffer too small.\n");
+                        ec_sdo_request_clear(&request.req);
+                        retval = -EOVERFLOW;
+                        break;
+                    }
+                    data.data_size = request.req.data_size;
+
+                    if (copy_to_user((void __user *) data.target,
+                                request.req.data, data.data_size)) {
+                        ec_sdo_request_clear(&request.req);
+                        retval = -EFAULT;
+                        break;
+                    }
+                }
+
                 if (__copy_to_user((void __user *) arg, &data, sizeof(data))) {
                     retval = -EFAULT;
-                    break;
                 }
 
                 ec_sdo_request_clear(&request.req);
@@ -721,6 +726,7 @@
                     if (request.req.state == EC_REQUEST_QUEUED) {
                         list_del(&request.req.list);
                         up(&master->sdo_sem);
+                        ec_sdo_request_clear(&request.req);
                         retval = -EINTR;
                         break;
                     }
@@ -731,9 +737,14 @@
                 // wait until master FSM has finished processing
                 wait_event(master->sdo_queue, request.req.state != EC_REQUEST_BUSY);
 
+                data.abort_code = request.req.abort_code;
+
                 if (request.req.state != EC_REQUEST_SUCCESS) {
                     retval = -EIO;
-                    break;
+                }
+
+                if (__copy_to_user((void __user *) arg, &data, sizeof(data))) {
+                    retval = -EFAULT;
                 }
 
                 ec_sdo_request_clear(&request.req);