170 return 0; |
170 return 0; |
171 } |
171 } |
172 |
172 |
173 /*****************************************************************************/ |
173 /*****************************************************************************/ |
174 |
174 |
|
175 /** Copies SoE data from an external source. |
|
176 * |
|
177 * If the \a mem_size is to small, new memory is allocated. |
|
178 * |
|
179 * \retval 0 Success. |
|
180 * \retval <0 Error code. |
|
181 */ |
|
182 int ec_soe_request_append_data( |
|
183 ec_soe_request_t *req, /**< SoE request. */ |
|
184 const uint8_t *source, /**< Source data. */ |
|
185 size_t size /**< Number of bytes in \a source. */ |
|
186 ) |
|
187 { |
|
188 if (req->data_size + size > req->mem_size) { |
|
189 size_t new_size = req->mem_size ? req->mem_size * 2 : size; |
|
190 uint8_t *new_data = (uint8_t *) kmalloc(new_size, GFP_KERNEL); |
|
191 if (!new_data) { |
|
192 EC_ERR("Failed to allocate %zu bytes of SoE memory.\n", |
|
193 new_size); |
|
194 return -ENOMEM; |
|
195 } |
|
196 memcpy(new_data, req->data, req->data_size); |
|
197 kfree(req->data); |
|
198 req->data = new_data; |
|
199 req->mem_size = new_size; |
|
200 } |
|
201 |
|
202 memcpy(req->data + req->data_size, source, size); |
|
203 req->data_size += size; |
|
204 return 0; |
|
205 } |
|
206 |
|
207 /*****************************************************************************/ |
|
208 |
175 void ec_soe_request_read(ec_soe_request_t *req) |
209 void ec_soe_request_read(ec_soe_request_t *req) |
176 { |
210 { |
177 req->dir = EC_DIR_INPUT; |
211 req->dir = EC_DIR_INPUT; |
178 req->state = EC_INT_REQUEST_QUEUED; |
212 req->state = EC_INT_REQUEST_QUEUED; |
179 req->error_code = 0x0000; |
213 req->error_code = 0x0000; |