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);
97 void fw_state_init(struct fw_priv *fw_priv)
99 struct fw_state *fw_st = &fw_priv->fw_st;
105 static inline int fw_state_wait(struct fw_priv *fw_priv)
107 return __fw_state_wait_common(fw_priv, MAX_SCHEDULE_TIMEOUT);
110 static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv);
112 static struct fw_priv *__allocate_fw_priv(const char *fw_name,
119 struct fw_priv *fw_priv;
129 fw_priv = kzalloc(sizeof(*fw_priv), GFP_ATOMIC);
130 if (!fw_priv)
133 fw_priv->fw_name = kstrdup_const(fw_name, GFP_ATOMIC);
134 if (!fw_priv->fw_name) {
135 kfree(fw_priv);
139 kref_init(&fw_priv->ref);
140 fw_priv->fwc = fwc;
141 fw_priv->data = dbuf;
142 fw_priv->allocated_size = size;
143 fw_priv->offset = offset;
144 fw_priv->opt_flags = opt_flags;
145 fw_state_init(fw_priv);
147 INIT_LIST_HEAD(&fw_priv->pending_list);
150 pr_debug("%s: fw-%s fw_priv=%p\n", __func__, fw_name, fw_priv);
152 return fw_priv;
155 static struct fw_priv *__lookup_fw_priv(const char *fw_name)
157 struct fw_priv *tmp;
168 struct fw_priv **fw_priv, void *dbuf, size_t size,
171 struct fw_priv *tmp;
183 *fw_priv = tmp;
184 pr_debug("batched request - sharing the same struct fw_priv and lookup for multiple requests\n");
197 *fw_priv = tmp;
205 struct fw_priv *fw_priv = to_fw_priv(ref);
206 struct firmware_cache *fwc = fw_priv->fwc;
208 pr_debug("%s: fw-%s fw_priv=%p data=%p size=%u\n",
209 __func__, fw_priv->fw_name, fw_priv, fw_priv->data,
210 (unsigned int)fw_priv->size);
212 list_del(&fw_priv->list);
215 if (fw_is_paged_buf(fw_priv))
216 fw_free_paged_buf(fw_priv);
217 else if (!fw_priv->allocated_size)
218 vfree(fw_priv->data);
220 kfree_const(fw_priv->fw_name);
221 kfree(fw_priv);
224 void free_fw_priv(struct fw_priv *fw_priv)
226 struct firmware_cache *fwc = fw_priv->fwc;
228 if (!kref_put(&fw_priv->ref, __free_fw_priv))
233 bool fw_is_paged_buf(struct fw_priv *fw_priv)
235 return fw_priv->is_paged_buf;
238 void fw_free_paged_buf(struct fw_priv *fw_priv)
242 if (!fw_priv->pages)
245 vunmap(fw_priv->data);
247 for (i = 0; i < fw_priv->nr_pages; i++)
248 __free_page(fw_priv->pages[i]);
249 kvfree(fw_priv->pages);
250 fw_priv->pages = NULL;
251 fw_priv->page_array_size = 0;
252 fw_priv->nr_pages = 0;
253 fw_priv->data = NULL;
254 fw_priv->size = 0;
257 int fw_grow_paged_buf(struct fw_priv *fw_priv, int pages_needed)
260 if (fw_priv->page_array_size < pages_needed) {
262 fw_priv->page_array_size * 2);
269 memcpy(new_pages, fw_priv->pages,
270 fw_priv->page_array_size * sizeof(void *));
271 memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) *
272 (new_array_size - fw_priv->page_array_size));
273 kvfree(fw_priv->pages);
274 fw_priv->pages = new_pages;
275 fw_priv->page_array_size = new_array_size;
278 while (fw_priv->nr_pages < pages_needed) {
279 fw_priv->pages[fw_priv->nr_pages] =
282 if (!fw_priv->pages[fw_priv->nr_pages])
284 fw_priv->nr_pages++;
290 int fw_map_paged_buf(struct fw_priv *fw_priv)
293 if (!fw_priv->pages)
296 vunmap(fw_priv->data);
297 fw_priv->data = vmap(fw_priv->pages, fw_priv->nr_pages, 0,
299 if (!fw_priv->data)
310 static int fw_decompress_zstd(struct device *dev, struct fw_priv *fw_priv,
318 if (fw_priv->allocated_size) {
319 out_size = fw_priv->allocated_size;
320 out_buf = fw_priv->data;
357 if (!fw_priv->allocated_size)
358 fw_priv->data = out_buf;
359 fw_priv->size = len;
364 if (err && !fw_priv->allocated_size)
385 static int fw_decompress_xz_single(struct device *dev, struct fw_priv *fw_priv,
399 xz_buf.out_size = fw_priv->allocated_size;
400 xz_buf.out = fw_priv->data;
406 fw_priv->size = xz_buf.out_pos;
411 static int fw_decompress_xz_pages(struct device *dev, struct fw_priv *fw_priv,
428 fw_priv->is_paged_buf = true;
429 fw_priv->size = 0;
431 if (fw_grow_paged_buf(fw_priv, fw_priv->nr_pages + 1)) {
437 page = fw_priv->pages[fw_priv->nr_pages - 1];
443 fw_priv->size += xz_buf.out_pos;
451 err = fw_map_paged_buf(fw_priv);
458 static int fw_decompress_xz(struct device *dev, struct fw_priv *fw_priv,
462 if (fw_priv->data)
463 return fw_decompress_xz_single(dev, fw_priv, in_size, in_buffer);
465 return fw_decompress_xz_pages(dev, fw_priv, in_size, in_buffer);
488 fw_get_filesystem_firmware(struct device *device, struct fw_priv *fw_priv,
491 struct fw_priv *fw_priv,
503 if (!decompress && fw_priv->data) {
504 buffer = fw_priv->data;
505 msize = fw_priv->allocated_size;
531 fw_priv->fw_name, suffix);
537 fw_priv->size = 0;
544 if ((fw_priv->opt_flags & FW_OPT_PARTIAL) && buffer)
548 rc = kernel_read_file_from_path_initns(path, fw_priv->offset,
567 fw_priv->fw_name);
568 rc = decompress(device, fw_priv, size, buffer);
573 fw_free_paged_buf(fw_priv);
578 fw_priv->fw_name);
579 if (!fw_priv->data)
580 fw_priv->data = buffer;
581 fw_priv->size = size;
583 fw_state_done(fw_priv);
603 static void fw_set_page_data(struct fw_priv *fw_priv, struct firmware *fw)
605 fw->priv = fw_priv;
606 fw->size = fw_priv->size;
607 fw->data = fw_priv->data;
609 pr_debug("%s: fw-%s fw_priv=%p data=%p size=%u\n",
610 __func__, fw_priv->fw_name, fw_priv, fw_priv->data,
611 (unsigned int)fw_priv->size);
692 struct fw_priv *fw_priv = fw->priv;
696 if (!fw_priv->size || fw_state_is_aborted(fw_priv)) {
709 if (device && (fw_priv->opt_flags & FW_OPT_UEVENT) &&
710 !(fw_priv->opt_flags & FW_OPT_NOCACHE)) {
711 ret = fw_add_devm_name(device, fw_priv->fw_name);
722 if (!(fw_priv->opt_flags & FW_OPT_NOCACHE) &&
723 fw_priv->fwc->state == FW_LOADER_START_CACHE)
724 fw_cache_piggyback_on_request(fw_priv);
727 fw_set_page_data(fw_priv, fw);
742 struct fw_priv *fw_priv;
757 ret = alloc_lookup_fw_priv(name, &fw_cache, &fw_priv, dbuf, size,
764 firmware->priv = fw_priv;
767 ret = fw_state_wait(fw_priv);
769 fw_set_page_data(fw_priv, firmware);
785 * the struct fw_priv and won't release it until all requests are woken
790 struct fw_priv *fw_priv;
796 fw_priv = fw->priv;
798 if (!fw_state_is_aborted(fw_priv))
799 fw_state_aborted(fw_priv);
1269 static struct fw_priv *lookup_fw_priv(const char *fw_name)
1271 struct fw_priv *tmp;
1294 struct fw_priv *fw_priv;
1302 fw_priv = lookup_fw_priv(fw_name);
1303 if (fw_priv) {
1304 free_fw_priv(fw_priv);
1341 static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv)
1343 const char *name = fw_priv->fw_name;
1344 struct firmware_cache *fwc = fw_priv->fwc;
1354 kref_get(&fw_priv->ref);
1589 static void fw_cache_piggyback_on_request(struct fw_priv *fw_priv)