56 */ |
56 */ |
57 void ec_foe_request_init( |
57 void ec_foe_request_init( |
58 ec_foe_request_t *req, /**< FoE request. */ |
58 ec_foe_request_t *req, /**< FoE request. */ |
59 uint8_t* file_name /** filename */) |
59 uint8_t* file_name /** filename */) |
60 { |
60 { |
|
61 INIT_LIST_HEAD(&req->list); |
61 req->buffer = NULL; |
62 req->buffer = NULL; |
62 req->file_name = file_name; |
63 req->file_name = file_name; |
63 req->buffer_size = 0; |
64 req->buffer_size = 0; |
64 req->data_size = 0; |
65 req->data_size = 0; |
65 req->dir = EC_DIR_INVALID; |
66 req->dir = EC_DIR_INVALID; |
100 |
101 |
101 /*****************************************************************************/ |
102 /*****************************************************************************/ |
102 |
103 |
103 /** Pre-allocates the data memory. |
104 /** Pre-allocates the data memory. |
104 * |
105 * |
105 * If the \a buffer_size is already bigger than \a size, nothing is done. |
106 * If the internal \a buffer_size is already bigger than \a size, nothing is |
|
107 * done. |
|
108 * |
|
109 * \return Zero on success, otherwise a negative error code. |
106 */ |
110 */ |
107 int ec_foe_request_alloc( |
111 int ec_foe_request_alloc( |
108 ec_foe_request_t *req, /**< FoE request. */ |
112 ec_foe_request_t *req, /**< FoE request. */ |
109 size_t size /**< Data size to allocate. */ |
113 size_t size /**< Data size to allocate. */ |
110 ) |
114 ) |
111 { |
115 { |
112 if (size <= req->buffer_size) |
116 if (size <= req->buffer_size) { |
113 return 0; |
117 return 0; |
|
118 } |
114 |
119 |
115 ec_foe_request_clear_data(req); |
120 ec_foe_request_clear_data(req); |
116 |
121 |
117 if (!(req->buffer = (uint8_t *) kmalloc(size, GFP_KERNEL))) { |
122 if (!(req->buffer = (uint8_t *) kmalloc(size, GFP_KERNEL))) { |
118 EC_ERR("Failed to allocate %zu bytes of FoE memory.\n", size); |
123 EC_ERR("Failed to allocate %zu bytes of FoE memory.\n", size); |
119 return -1; |
124 return -ENOMEM; |
120 } |
125 } |
121 |
126 |
122 req->buffer_size = size; |
127 req->buffer_size = size; |
123 req->data_size = 0; |
128 req->data_size = 0; |
124 return 0; |
129 return 0; |
127 /*****************************************************************************/ |
132 /*****************************************************************************/ |
128 |
133 |
129 /** Copies FoE data from an external source. |
134 /** Copies FoE data from an external source. |
130 * |
135 * |
131 * If the \a buffer_size is to small, new memory is allocated. |
136 * If the \a buffer_size is to small, new memory is allocated. |
|
137 * |
|
138 * \return Zero on success, otherwise a negative error code. |
132 */ |
139 */ |
133 int ec_foe_request_copy_data( |
140 int ec_foe_request_copy_data( |
134 ec_foe_request_t *req, /**< FoE request. */ |
141 ec_foe_request_t *req, /**< FoE request. */ |
135 const uint8_t *source, /**< Source data. */ |
142 const uint8_t *source, /**< Source data. */ |
136 size_t size /**< Number of bytes in \a source. */ |
143 size_t size /**< Number of bytes in \a source. */ |
137 ) |
144 ) |
138 { |
145 { |
139 if (ec_foe_request_alloc(req, size)) |
146 int ret; |
140 return -1; |
147 |
|
148 ret = ec_foe_request_alloc(req, size); |
|
149 if (ret) { |
|
150 return ret; |
|
151 } |
141 |
152 |
142 memcpy(req->buffer, source, size); |
153 memcpy(req->buffer, source, size); |
143 req->data_size = size; |
154 req->data_size = size; |
144 return 0; |
155 return 0; |
145 } |
156 } |