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 "foe_request.h"
00041 #include "foe.h"
00042
00043
00044
00047 #define EC_FOE_REQUEST_RESPONSE_TIMEOUT 3000
00048
00049
00050
00051 void ec_foe_request_clear_data(ec_foe_request_t *);
00052
00053
00054
00057 void ec_foe_request_init(
00058 ec_foe_request_t *req,
00059 uint8_t* file_name )
00060 {
00061 INIT_LIST_HEAD(&req->list);
00062 req->buffer = NULL;
00063 req->file_name = file_name;
00064 req->buffer_size = 0;
00065 req->data_size = 0;
00066 req->dir = EC_DIR_INVALID;
00067 req->issue_timeout = 0;
00068 req->response_timeout = EC_FOE_REQUEST_RESPONSE_TIMEOUT;
00069 req->state = EC_INT_REQUEST_INIT;
00070 req->result = FOE_BUSY;
00071 req->error_code = 0x00000000;
00072 }
00073
00074
00075
00078 void ec_foe_request_clear(
00079 ec_foe_request_t *req
00080 )
00081 {
00082 ec_foe_request_clear_data(req);
00083 }
00084
00085
00086
00089 void ec_foe_request_clear_data(
00090 ec_foe_request_t *req
00091 )
00092 {
00093 if (req->buffer) {
00094 kfree(req->buffer);
00095 req->buffer = NULL;
00096 }
00097
00098 req->buffer_size = 0;
00099 req->data_size = 0;
00100 }
00101
00102
00103
00111 int ec_foe_request_alloc(
00112 ec_foe_request_t *req,
00113 size_t size
00114 )
00115 {
00116 if (size <= req->buffer_size) {
00117 return 0;
00118 }
00119
00120 ec_foe_request_clear_data(req);
00121
00122 if (!(req->buffer = (uint8_t *) kmalloc(size, GFP_KERNEL))) {
00123 EC_ERR("Failed to allocate %zu bytes of FoE memory.\n", size);
00124 return -ENOMEM;
00125 }
00126
00127 req->buffer_size = size;
00128 req->data_size = 0;
00129 return 0;
00130 }
00131
00132
00133
00140 int ec_foe_request_copy_data(
00141 ec_foe_request_t *req,
00142 const uint8_t *source,
00143 size_t size
00144 )
00145 {
00146 int ret;
00147
00148 ret = ec_foe_request_alloc(req, size);
00149 if (ret) {
00150 return ret;
00151 }
00152
00153 memcpy(req->buffer, source, size);
00154 req->data_size = size;
00155 return 0;
00156 }
00157
00158
00159
00164 int ec_foe_request_timed_out(
00165 const ec_foe_request_t *req
00166 )
00167 {
00168 return req->issue_timeout
00169 && jiffies - req->jiffies_start > HZ * req->issue_timeout / 1000;
00170 }
00171
00172
00173
00176 void ec_foe_request_timeout(
00177 ec_foe_request_t *req,
00178 uint32_t timeout
00179 )
00180 {
00181 req->issue_timeout = timeout;
00182 }
00183
00184
00185
00190 uint8_t *ec_foe_request_data(
00191 ec_foe_request_t *req
00192 )
00193 {
00194 return req->buffer;
00195 }
00196
00197
00198
00203 size_t ec_foe_request_data_size(
00204 const ec_foe_request_t *req
00205 )
00206 {
00207 return req->data_size;
00208 }
00209
00210
00211
00214 void ec_foe_request_read(
00215 ec_foe_request_t *req
00216 )
00217 {
00218 req->dir = EC_DIR_INPUT;
00219 req->state = EC_INT_REQUEST_QUEUED;
00220 req->result = FOE_BUSY;
00221 req->jiffies_start = jiffies;
00222 }
00223
00224
00225
00228 void ec_foe_request_write(
00229 ec_foe_request_t *req
00230 )
00231 {
00232 req->dir = EC_DIR_OUTPUT;
00233 req->state = EC_INT_REQUEST_QUEUED;
00234 req->result = FOE_BUSY;
00235 req->jiffies_start = jiffies;
00236 }
00237
00238