00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00034
00035
00036 #include <linux/module.h>
00037 #include <linux/jiffies.h>
00038 #include <linux/slab.h>
00039
00040 #include "sdo_request.h"
00041
00042
00043
00046 #define EC_SDO_REQUEST_RESPONSE_TIMEOUT 1000
00047
00048
00049
00050 void ec_sdo_request_clear_data(ec_sdo_request_t *);
00051
00052
00053
00056 void ec_sdo_request_init(
00057 ec_sdo_request_t *req
00058 )
00059 {
00060 req->complete_access = 0;
00061 req->data = NULL;
00062 req->mem_size = 0;
00063 req->data_size = 0;
00064 req->dir = EC_DIR_INVALID;
00065 req->issue_timeout = 0;
00066 req->response_timeout = EC_SDO_REQUEST_RESPONSE_TIMEOUT;
00067 req->state = EC_INT_REQUEST_INIT;
00068 req->errno = 0;
00069 req->abort_code = 0x00000000;
00070 }
00071
00072
00073
00076 void ec_sdo_request_clear(
00077 ec_sdo_request_t *req
00078 )
00079 {
00080 ec_sdo_request_clear_data(req);
00081 }
00082
00083
00084
00091 int ec_sdo_request_copy(
00092 ec_sdo_request_t *req,
00093 const ec_sdo_request_t *other
00094 )
00095 {
00096 req->complete_access = other->complete_access;
00097 req->index = other->index;
00098 req->subindex = other->subindex;
00099 return ec_sdo_request_copy_data(req, other->data, other->data_size);
00100 }
00101
00102
00103
00106 void ec_sdo_request_clear_data(
00107 ec_sdo_request_t *req
00108 )
00109 {
00110 if (req->data) {
00111 kfree(req->data);
00112 req->data = NULL;
00113 }
00114
00115 req->mem_size = 0;
00116 req->data_size = 0;
00117 }
00118
00119
00120
00127 int ec_sdo_request_alloc(
00128 ec_sdo_request_t *req,
00129 size_t size
00130 )
00131 {
00132 if (size <= req->mem_size)
00133 return 0;
00134
00135 ec_sdo_request_clear_data(req);
00136
00137 if (!(req->data = (uint8_t *) kmalloc(size, GFP_KERNEL))) {
00138 EC_ERR("Failed to allocate %zu bytes of SDO memory.\n", size);
00139 return -ENOMEM;
00140 }
00141
00142 req->mem_size = size;
00143 req->data_size = 0;
00144 return 0;
00145 }
00146
00147
00148
00156 int ec_sdo_request_copy_data(
00157 ec_sdo_request_t *req,
00158 const uint8_t *source,
00159 size_t size
00160 )
00161 {
00162 int ret = ec_sdo_request_alloc(req, size);
00163 if (ret < 0)
00164 return ret;
00165
00166 memcpy(req->data, source, size);
00167 req->data_size = size;
00168 return 0;
00169 }
00170
00171
00172
00177 int ec_sdo_request_timed_out(const ec_sdo_request_t *req )
00178 {
00179 return req->issue_timeout
00180 && jiffies - req->jiffies_start > HZ * req->issue_timeout / 1000;
00181 }
00182
00183
00184
00185
00186
00187 void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index,
00188 uint8_t subindex)
00189 {
00190 req->index = index;
00191 req->subindex = subindex;
00192 }
00193
00194
00195
00196 void ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout)
00197 {
00198 req->issue_timeout = timeout;
00199 }
00200
00201
00202
00203 uint8_t *ecrt_sdo_request_data(ec_sdo_request_t *req)
00204 {
00205 return req->data;
00206 }
00207
00208
00209
00210 size_t ecrt_sdo_request_data_size(const ec_sdo_request_t *req)
00211 {
00212 return req->data_size;
00213 }
00214
00215
00216
00217 ec_request_state_t ecrt_sdo_request_state(const ec_sdo_request_t *req)
00218 {
00219 return ec_request_state_translation_table[req->state];
00220 }
00221
00222
00223
00224 void ecrt_sdo_request_read(ec_sdo_request_t *req)
00225 {
00226 req->dir = EC_DIR_INPUT;
00227 req->state = EC_INT_REQUEST_QUEUED;
00228 req->errno = 0;
00229 req->abort_code = 0x00000000;
00230 req->jiffies_start = jiffies;
00231 }
00232
00233
00234
00235 void ecrt_sdo_request_write(ec_sdo_request_t *req)
00236 {
00237 req->dir = EC_DIR_OUTPUT;
00238 req->state = EC_INT_REQUEST_QUEUED;
00239 req->errno = 0;
00240 req->abort_code = 0x00000000;
00241 req->jiffies_start = jiffies;
00242 }
00243
00244
00245
00248 EXPORT_SYMBOL(ecrt_sdo_request_index);
00249 EXPORT_SYMBOL(ecrt_sdo_request_timeout);
00250 EXPORT_SYMBOL(ecrt_sdo_request_data);
00251 EXPORT_SYMBOL(ecrt_sdo_request_data_size);
00252 EXPORT_SYMBOL(ecrt_sdo_request_state);
00253 EXPORT_SYMBOL(ecrt_sdo_request_read);
00254 EXPORT_SYMBOL(ecrt_sdo_request_write);
00255
00258