Lines Matching defs:fw_priv
83 static inline struct fw_priv *to_fw_priv(struct kref *ref)
85 return container_of(ref, struct fw_priv, ref);
98 void fw_state_init(struct fw_priv *fw_priv)
100 struct fw_state *fw_st = &fw_priv->fw_st;
106 static inline int fw_state_wait(struct fw_priv *fw_priv)
108 return __fw_state_wait_common(fw_priv, MAX_SCHEDULE_TIMEOUT);
111 static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv);
113 static struct fw_priv *__allocate_fw_priv(const char *fw_name,
120 struct fw_priv *fw_priv;
130 fw_priv = kzalloc(sizeof(*fw_priv), GFP_ATOMIC);
131 if (!fw_priv)
134 fw_priv->fw_name = kstrdup_const(fw_name, GFP_ATOMIC);
135 if (!fw_priv->fw_name) {
136 kfree(fw_priv);
140 kref_init(&fw_priv->ref);
141 fw_priv->fwc = fwc;
142 fw_priv->data = dbuf;
143 fw_priv->allocated_size = size;
144 fw_priv->offset = offset;
145 fw_priv->opt_flags = opt_flags;
146 fw_state_init(fw_priv);
148 INIT_LIST_HEAD(&fw_priv->pending_list);
151 pr_debug("%s: fw-%s fw_priv=%p\n", __func__, fw_name, fw_priv);
153 return fw_priv;
156 static struct fw_priv *__lookup_fw_priv(const char *fw_name)
158 struct fw_priv *tmp;
169 struct fw_priv **fw_priv, void *dbuf, size_t size,
172 struct fw_priv *tmp;
184 *fw_priv = tmp;
185 pr_debug("batched request - sharing the same struct fw_priv and lookup for multiple requests\n");
198 *fw_priv = tmp;
206 struct fw_priv *fw_priv = to_fw_priv(ref);
207 struct firmware_cache *fwc = fw_priv->fwc;
209 pr_debug("%s: fw-%s fw_priv=%p data=%p size=%u\n",
210 __func__, fw_priv->fw_name, fw_priv, fw_priv->data,
211 (unsigned int)fw_priv->size);
213 list_del(&fw_priv->list);
216 if (fw_is_paged_buf(fw_priv))
217 fw_free_paged_buf(fw_priv);
218 else if (!fw_priv->allocated_size)
219 vfree(fw_priv->data);
221 kfree_const(fw_priv->fw_name);
222 kfree(fw_priv);
225 void free_fw_priv(struct fw_priv *fw_priv)
227 struct firmware_cache *fwc = fw_priv->fwc;
229 if (!kref_put(&fw_priv->ref, __free_fw_priv))
234 bool fw_is_paged_buf(struct fw_priv *fw_priv)
236 return fw_priv->is_paged_buf;
239 void fw_free_paged_buf(struct fw_priv *fw_priv)
243 if (!fw_priv->pages)
246 vunmap(fw_priv->data);
248 for (i = 0; i < fw_priv->nr_pages; i++)
249 __free_page(fw_priv->pages[i]);
250 kvfree(fw_priv->pages);
251 fw_priv->pages = NULL;
252 fw_priv->page_array_size = 0;
253 fw_priv->nr_pages = 0;
254 fw_priv->data = NULL;
255 fw_priv->size = 0;
258 int fw_grow_paged_buf(struct fw_priv *fw_priv, int pages_needed)
261 if (fw_priv->page_array_size < pages_needed) {
263 fw_priv->page_array_size * 2);
270 memcpy(new_pages, fw_priv->pages,
271 fw_priv->page_array_size * sizeof(void *));
272 memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) *
273 (new_array_size - fw_priv->page_array_size));
274 kvfree(fw_priv->pages);
275 fw_priv->pages = new_pages;
276 fw_priv->page_array_size = new_array_size;
279 while (fw_priv->nr_pages < pages_needed) {
280 fw_priv->pages[fw_priv->nr_pages] =
283 if (!fw_priv->pages[fw_priv->nr_pages])
285 fw_priv->nr_pages++;
291 int fw_map_paged_buf(struct fw_priv *fw_priv)
294 if (!fw_priv->pages)
297 vunmap(fw_priv->data);
298 fw_priv->data = vmap(fw_priv->pages, fw_priv->nr_pages, 0,
300 if (!fw_priv->data)
311 static int fw_decompress_zstd(struct device *dev, struct fw_priv *fw_priv,
319 if (fw_priv->allocated_size) {
320 out_size = fw_priv->allocated_size;
321 out_buf = fw_priv->data;
358 if (!fw_priv->allocated_size)
359 fw_priv->data = out_buf;
360 fw_priv->size = len;
365 if (err && !fw_priv->allocated_size)
386 static int fw_decompress_xz_single(struct device *dev, struct fw_priv *fw_priv,
400 xz_buf.out_size = fw_priv->allocated_size;
401 xz_buf.out = fw_priv->data;
407 fw_priv->size = xz_buf.out_pos;
412 static int fw_decompress_xz_pages(struct device *dev, struct fw_priv *fw_priv,
429 fw_priv->is_paged_buf = true;
430 fw_priv->size = 0;
432 if (fw_grow_paged_buf(fw_priv, fw_priv->nr_pages + 1)) {
438 page = fw_priv->pages[fw_priv->nr_pages - 1];
444 fw_priv->size += xz_buf.out_pos;
452 err = fw_map_paged_buf(fw_priv);
459 static int fw_decompress_xz(struct device *dev, struct fw_priv *fw_priv,
463 if (fw_priv->data)
464 return fw_decompress_xz_single(dev, fw_priv, in_size, in_buffer);
466 return fw_decompress_xz_pages(dev, fw_priv, in_size, in_buffer);
489 fw_get_filesystem_firmware(struct device *device, struct fw_priv *fw_priv,
492 struct fw_priv *fw_priv,
504 if (!decompress && fw_priv->data) {
505 buffer = fw_priv->data;
506 msize = fw_priv->allocated_size;
532 fw_priv->fw_name, suffix);
538 fw_priv->size = 0;
545 if ((fw_priv->opt_flags & FW_OPT_PARTIAL) && buffer)
549 rc = kernel_read_file_from_path_initns(path, fw_priv->offset,
554 if (!(fw_priv->opt_flags & FW_OPT_NO_WARN)) {
572 fw_priv->fw_name);
573 rc = decompress(device, fw_priv, size, buffer);
578 fw_free_paged_buf(fw_priv);
583 fw_priv->fw_name);
584 if (!fw_priv->data)
585 fw_priv->data = buffer;
586 fw_priv->size = size;
588 fw_state_done(fw_priv);
608 static void fw_set_page_data(struct fw_priv *fw_priv, struct firmware *fw)
610 fw->priv = fw_priv;
611 fw->size = fw_priv->size;
612 fw->data = fw_priv->data;
614 pr_debug("%s: fw-%s fw_priv=%p data=%p size=%u\n",
615 __func__, fw_priv->fw_name, fw_priv, fw_priv->data,
616 (unsigned int)fw_priv->size);
697 struct fw_priv *fw_priv = fw->priv;
701 if (!fw_priv->size || fw_state_is_aborted(fw_priv)) {
714 if (device && (fw_priv->opt_flags & FW_OPT_UEVENT) &&
715 !(fw_priv->opt_flags & FW_OPT_NOCACHE)) {
716 ret = fw_add_devm_name(device, fw_priv->fw_name);
727 if (!(fw_priv->opt_flags & FW_OPT_NOCACHE) &&
728 fw_priv->fwc->state == FW_LOADER_START_CACHE)
729 fw_cache_piggyback_on_request(fw_priv);
732 fw_set_page_data(fw_priv, fw);
747 struct fw_priv *fw_priv;
762 ret = alloc_lookup_fw_priv(name, &fw_cache, &fw_priv, dbuf, size,
769 firmware->priv = fw_priv;
772 ret = fw_state_wait(fw_priv);
774 fw_set_page_data(fw_priv, firmware);
790 * the struct fw_priv and won't release it until all requests are woken
795 struct fw_priv *fw_priv;
801 fw_priv = fw->priv;
803 if (!fw_state_is_aborted(fw_priv))
804 fw_state_aborted(fw_priv);
1304 static struct fw_priv *lookup_fw_priv(const char *fw_name)
1306 struct fw_priv *tmp;
1329 struct fw_priv *fw_priv;
1337 fw_priv = lookup_fw_priv(fw_name);
1338 if (fw_priv) {
1339 free_fw_priv(fw_priv);
1376 static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv)
1378 const char *name = fw_priv->fw_name;
1379 struct firmware_cache *fwc = fw_priv->fwc;
1389 kref_get(&fw_priv->ref);
1624 static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv)