master/soe_request.c
changeset 1864 0a6b3aacc847
parent 1843 4d44d8bee580
child 1907 dd276ae226b4
equal deleted inserted replaced
1863:8ea4a79dfe84 1864:0a6b3aacc847
   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;