1 /*
2  * firmware_class.c - Multi purpose firmware loading support
3  *
4  * Copyright (c) 2003 Manuel Estrada Sainz <ranty@debian.org>
5  *
6  * Please see Documentation/firmware_class/ for more information.
7  *
8  */
9 /*
10  * Based on kernel/kmod.c and drivers/usb/usb.c
11  */
12 /*
13         kernel/kmod.c
14         Kirk Petersen
15 
16         Reorganized not to be a daemon by Adam Richter, with guidance
17         from Greg Zornetzer.
18 
19         Modified to avoid chroot and file sharing problems.
20         Mikael Pettersson
21 
22         Limit the concurrent number of kmod modprobes to catch loops from
23         "modprobe needs a service that is in a module".
24         Keith Owens <kaos@ocs.com.au> December 1999
25 
26         Unblock all signals when we exec a usermode process.
27         Shuu Yamaguchi <shuu@wondernetworkresources.com> December 2000
28 */
29 /*
30  * drivers/usb/usb.c
31  *
32  * (C) Copyright Linus Torvalds 1999
33  * (C) Copyright Johannes Erdfelt 1999-2001
34  * (C) Copyright Andreas Gal 1999
35  * (C) Copyright Gregory P. Smith 1999
36  * (C) Copyright Deti Fliegl 1999 (new USB architecture)
37  * (C) Copyright Randy Dunlap 2000
38  * (C) Copyright David Brownell 2000 (kernel hotplug, usb_device_id)
39  * (C) Copyright Yggdrasil Computing, Inc. 2000
40  *     (usb_device_id matching changes by Adam J. Richter)
41  */
42 
43 #include <linux/config.h>
44 #include <linux/module.h>
45 #include <linux/string.h>
46 #include <linux/types.h>
47 #include <linux/init.h>
48 #include <linux/slab.h>
49 #include <linux/kmod.h>
50 #include <linux/proc_fs.h>
51 #include <linux/vmalloc.h>
52 #include <asm/hardirq.h>
53 
54 #include "linux/firmware.h"
55 
56 MODULE_AUTHOR("Manuel Estrada Sainz <ranty@debian.org>");
57 MODULE_DESCRIPTION("Multi purpose firmware loading support");
58 MODULE_LICENSE("GPL");
59 
60 #define err(format, arg...) \
61      printk(KERN_ERR  "%s:%s: " format "\n",__FILE__, __FUNCTION__ , ## arg)
62 #define warn(format, arg...) \
63      printk(KERN_WARNING "%s:%s: " format "\n",__FILE__, __FUNCTION__ , ## arg)
64 #define dbg(format, arg...) \
65      printk(KERN_DEBUG "%s:%s: " format "\n",__FILE__, __FUNCTION__ , ## arg)
66 
67 static int loading_timeout = 10;	/* In seconds */
68 static struct proc_dir_entry *proc_dir_timeout;
69 static struct proc_dir_entry *proc_dir;
70 
71 #ifdef CONFIG_HOTPLUG
72 
73 static int
call_helper(char * verb,const char * name,const char * device)74 call_helper(char *verb, const char *name, const char *device)
75 {
76 	char *argv[3], **envp, *buf, *scratch;
77 	int i = 0;
78 
79 	int retval = 0;
80 
81 	if (!hotplug_path[0])
82 		return -ENOENT;
83 	if (in_interrupt()) {
84 		err("in_interrupt");
85 		return -EFAULT;
86 	}
87 	if (!current->fs->root) {
88 		warn("call_policy %s -- no FS yet", verb);
89 		return -EPERM;
90 	}
91 
92 	if (!(envp = (char **) kmalloc(20 * sizeof (char *), GFP_KERNEL))) {
93 		err("unable to allocate envp");
94 		return -ENOMEM;
95 	}
96 	if (!(buf = kmalloc(256, GFP_KERNEL))) {
97 		kfree(envp);
98 		err("unable to allocate buf");
99 		return -ENOMEM;
100 	}
101 
102 	/* only one standardized param to hotplug command: type */
103 	argv[0] = hotplug_path;
104 	argv[1] = "firmware";
105 	argv[2] = 0;
106 
107 	/* minimal command environment */
108 	envp[i++] = "HOME=/";
109 	envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
110 
111 #ifdef  DEBUG
112 	/* hint that policy agent should enter no-stdout debug mode */
113 	envp[i++] = "DEBUG=kernel";
114 #endif
115 	scratch = buf;
116 
117 	if (device) {
118 		envp[i++] = scratch;
119 		scratch += snprintf(scratch, FIRMWARE_NAME_MAX+25,
120 				    "DEVPATH=/driver/firmware/%s", device) + 1;
121 	}
122 
123 	envp[i++] = scratch;
124 	scratch += sprintf(scratch, "ACTION=%s", verb) + 1;
125 
126 	envp[i++] = scratch;
127 	scratch += snprintf(scratch, FIRMWARE_NAME_MAX,
128 			    "FIRMWARE=%s", name) + 1;
129 
130 	envp[i++] = 0;
131 
132 #ifdef  DEBUG
133 	dbg("firmware: %s %s %s", argv[0], argv[1], verb);
134 #endif
135 
136 	retval = call_usermodehelper(argv[0], argv, envp);
137 	if (retval) {
138 		printk("call_usermodehelper return %d\n", retval);
139 	}
140 
141 	kfree(buf);
142 	kfree(envp);
143 	return retval;
144 }
145 #else
146 
147 static inline int
call_helper(char * verb,const char * name,const char * device)148 call_helper(char *verb, const char *name, const char *device)
149 {
150 	return -ENOENT;
151 }
152 
153 #endif /* CONFIG_HOTPLUG */
154 
155 struct firmware_priv {
156 	struct completion completion;
157 	struct proc_dir_entry *proc_dir;
158 	struct proc_dir_entry *attr_data;
159 	struct proc_dir_entry *attr_loading;
160 	struct firmware *fw;
161 	int loading;
162 	int abort;
163 	int alloc_size;
164 	struct timer_list timeout;
165 };
166 
167 static int
firmware_timeout_show(char * buf,char ** start,off_t off,int count,int * eof,void * data)168 firmware_timeout_show(char *buf, char **start, off_t off,
169 		      int count, int *eof, void *data)
170 {
171 	return sprintf(buf, "%d\n", loading_timeout);
172 }
173 
174 /**
175  * firmware_timeout_store:
176  * Description:
177  *	Sets the number of seconds to wait for the firmware.  Once
178  *	this expires an error will be return to the driver and no
179  *	firmware will be provided.
180  *
181  *	Note: zero means 'wait for ever'
182  *
183  **/
184 static int
firmware_timeout_store(struct file * file,const char * buf,unsigned long count,void * data)185 firmware_timeout_store(struct file *file, const char *buf,
186 		       unsigned long count, void *data)
187 {
188 	loading_timeout = simple_strtol(buf, NULL, 10);
189 	return count;
190 }
191 
192 static int
firmware_loading_show(char * buf,char ** start,off_t off,int count,int * eof,void * data)193 firmware_loading_show(char *buf, char **start, off_t off,
194 		      int count, int *eof, void *data)
195 {
196 	struct firmware_priv *fw_priv = data;
197 	return sprintf(buf, "%d\n", fw_priv->loading);
198 }
199 
200 /**
201  * firmware_loading_store: - loading control file
202  * Description:
203  *	The relevant values are:
204  *
205  *	 1: Start a load, discarding any previous partial load.
206  *	 0: Conclude the load and handle the data to the driver code.
207  *	-1: Conclude the load with an error and discard any written data.
208  **/
209 static int
firmware_loading_store(struct file * file,const char * buf,unsigned long count,void * data)210 firmware_loading_store(struct file *file, const char *buf,
211 		       unsigned long count, void *data)
212 {
213 	struct firmware_priv *fw_priv = data;
214 	int prev_loading = fw_priv->loading;
215 
216 	fw_priv->loading = simple_strtol(buf, NULL, 10);
217 
218 	switch (fw_priv->loading) {
219 	case -1:
220 		fw_priv->abort = 1;
221 		wmb();
222 		complete(&fw_priv->completion);
223 		break;
224 	case 1:
225 		kfree(fw_priv->fw->data);
226 		fw_priv->fw->data = NULL;
227 		fw_priv->fw->size = 0;
228 		fw_priv->alloc_size = 0;
229 		break;
230 	case 0:
231 		if (prev_loading == 1)
232 			complete(&fw_priv->completion);
233 		break;
234 	}
235 
236 	return count;
237 }
238 
239 static int
firmware_data_read(char * buffer,char ** start,off_t offset,int count,int * eof,void * data)240 firmware_data_read(char *buffer, char **start, off_t offset,
241 		   int count, int *eof, void *data)
242 {
243 	struct firmware_priv *fw_priv = data;
244 	struct firmware *fw = fw_priv->fw;
245 
246 	if (offset > fw->size)
247 		return 0;
248 	if (offset + count > fw->size)
249 		count = fw->size - offset;
250 
251 	memcpy(buffer, fw->data + offset, count);
252 	*start = (void *) ((long) count);
253 	return count;
254 }
255 static int
fw_realloc_buffer(struct firmware_priv * fw_priv,int min_size)256 fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
257 {
258 	u8 *new_data;
259 	int new_size;
260 
261 	if (min_size <= fw_priv->alloc_size)
262 		return 0;
263 	if((min_size % PAGE_SIZE) == 0)
264 		new_size = min_size;
265 	else
266 		new_size = (min_size + PAGE_SIZE) & PAGE_MASK;
267 	new_data = vmalloc(new_size);
268 	if (!new_data) {
269 		printk(KERN_ERR "%s: unable to alloc buffer\n", __FUNCTION__);
270 		/* Make sure that we don't keep incomplete data */
271 		fw_priv->abort = 1;
272 		return -ENOMEM;
273 	}
274 	fw_priv->alloc_size = new_size;
275 	if (fw_priv->fw->data) {
276 		memcpy(new_data, fw_priv->fw->data, fw_priv->fw->size);
277 		vfree(fw_priv->fw->data);
278 	}
279 	fw_priv->fw->data = new_data;
280 	BUG_ON(min_size > fw_priv->alloc_size);
281 	return 0;
282 }
283 
284 /**
285  * firmware_data_write:
286  *
287  * Description:
288  *
289  *	Data written to the 'data' attribute will be later handled to
290  *	the driver as a firmware image.
291  **/
292 static int
firmware_data_write(struct file * file,const char * buffer,unsigned long count,void * data)293 firmware_data_write(struct file *file, const char *buffer,
294 		    unsigned long count, void *data)
295 {
296 	struct firmware_priv *fw_priv = data;
297 	struct firmware *fw = fw_priv->fw;
298 	int offset = file->f_pos;
299 	int retval;
300 
301 	retval = fw_realloc_buffer(fw_priv, offset + count);
302 	if (retval) {
303 		printk("%s: retval:%d\n", __FUNCTION__, retval);
304 		return retval;
305 	}
306 
307 	memcpy(fw->data + offset, buffer, count);
308 
309 	fw->size = max_t(size_t, offset + count, fw->size);
310 	file->f_pos += count;
311 	return count;
312 }
313 
314 static void
firmware_class_timeout(u_long data)315 firmware_class_timeout(u_long data)
316 {
317 	struct firmware_priv *fw_priv = (struct firmware_priv *) data;
318 	fw_priv->abort = 1;
319 	wmb();
320 	complete(&fw_priv->completion);
321 }
322 static int
fw_setup_class_device(struct firmware_priv ** fw_priv_p,const char * fw_name,const char * device)323 fw_setup_class_device(struct firmware_priv **fw_priv_p,
324 		      const char *fw_name, const char *device)
325 {
326 	int retval;
327 	struct firmware_priv *fw_priv = kmalloc(sizeof (struct firmware_priv),
328 						GFP_KERNEL);
329 	*fw_priv_p = fw_priv;
330 	if (!fw_priv) {
331 		retval = -ENOMEM;
332 		goto out;
333 	}
334 	memset(fw_priv, 0, sizeof (*fw_priv));
335 
336 	init_completion(&fw_priv->completion);
337 
338 	fw_priv->timeout.function = firmware_class_timeout;
339 	fw_priv->timeout.data = (u_long) fw_priv;
340 	init_timer(&fw_priv->timeout);
341 
342 	retval = -EAGAIN;
343 	fw_priv->proc_dir = create_proc_entry(device, 0644 | S_IFDIR, proc_dir);
344 	if (!fw_priv->proc_dir)
345 		goto err_free_fw_priv;
346 
347 	fw_priv->attr_data = create_proc_entry("data", 0644 | S_IFREG,
348 					       fw_priv->proc_dir);
349 	if (!fw_priv->attr_data)
350 		goto err_remove_dir;
351 
352 	fw_priv->attr_data->read_proc = firmware_data_read;
353 	fw_priv->attr_data->write_proc = firmware_data_write;
354 	fw_priv->attr_data->data = fw_priv;
355 
356 	fw_priv->attr_loading = create_proc_entry("loading", 0644 | S_IFREG,
357 						  fw_priv->proc_dir);
358 	if (!fw_priv->attr_loading)
359 		goto err_remove_data;
360 
361 	fw_priv->attr_loading->read_proc = firmware_loading_show;
362 	fw_priv->attr_loading->write_proc = firmware_loading_store;
363 	fw_priv->attr_loading->data = fw_priv;
364 
365 	retval = 0;
366 	fw_priv->fw = kmalloc(sizeof (struct firmware), GFP_KERNEL);
367 	if (!fw_priv->fw) {
368 		printk(KERN_ERR "%s: kmalloc(struct firmware) failed\n",
369 		       __FUNCTION__);
370 		retval = -ENOMEM;
371 		goto err_remove_loading;
372 	}
373 	memset(fw_priv->fw, 0, sizeof (*fw_priv->fw));
374 
375 	goto out;
376 
377 err_remove_loading:
378 	remove_proc_entry("loading", fw_priv->proc_dir);
379 err_remove_data:
380 	remove_proc_entry("data", fw_priv->proc_dir);
381 err_remove_dir:
382 	remove_proc_entry(device, proc_dir);
383 err_free_fw_priv:
384 	kfree(fw_priv);
385 out:
386 	return retval;
387 }
388 static void
fw_remove_class_device(struct firmware_priv * fw_priv)389 fw_remove_class_device(struct firmware_priv *fw_priv)
390 {
391 	remove_proc_entry("loading", fw_priv->proc_dir);
392 	remove_proc_entry("data", fw_priv->proc_dir);
393 	remove_proc_entry(fw_priv->proc_dir->name, proc_dir);
394 }
395 
396 /**
397  * request_firmware: - request firmware to hotplug and wait for it
398  * Description:
399  *	@firmware will be used to return a firmware image by the name
400  *	of @name for device @device.
401  *
402  *	Should be called from user context where sleeping is allowed.
403  *
404  *	@name will be use as $FIRMWARE in the hotplug environment and
405  *	should be distinctive enough not to be confused with any other
406  *	firmware image for this or any other device.
407  **/
408 int
request_firmware(const struct firmware ** firmware,const char * name,const char * device)409 request_firmware(const struct firmware **firmware, const char *name,
410 		 const char *device)
411 {
412 	struct firmware_priv *fw_priv;
413 	int retval;
414 
415 	if (!firmware) {
416 		retval = -EINVAL;
417 		goto out;
418 	}
419 	*firmware = NULL;
420 
421 	retval = fw_setup_class_device(&fw_priv, name, device);
422 	if (retval)
423 		goto out;
424 
425 	retval = call_helper("add", name, device);
426 	if (retval)
427 		goto out;
428 	if (loading_timeout) {
429 		fw_priv->timeout.expires = jiffies + loading_timeout * HZ;
430 		add_timer(&fw_priv->timeout);
431 	}
432 
433 	wait_for_completion(&fw_priv->completion);
434 
435 	del_timer(&fw_priv->timeout);
436 	fw_remove_class_device(fw_priv);
437 
438 	if (fw_priv->fw->size && !fw_priv->abort) {
439 		*firmware = fw_priv->fw;
440 	} else {
441 		retval = -ENOENT;
442 		vfree(fw_priv->fw->data);
443 		kfree(fw_priv->fw);
444 	}
445 out:
446 	kfree(fw_priv);
447 	return retval;
448 }
449 
450 void
release_firmware(const struct firmware * fw)451 release_firmware(const struct firmware *fw)
452 {
453 	if (fw) {
454 		vfree(fw->data);
455 		kfree(fw);
456 	}
457 }
458 
459 /**
460  * register_firmware: - provide a firmware image for later usage
461  *
462  * Description:
463  *	Make sure that @data will be available by requesting firmware @name.
464  *
465  *	Note: This will not be possible until some kind of persistence
466  *	is available.
467  **/
468 void
register_firmware(const char * name,const u8 * data,size_t size)469 register_firmware(const char *name, const u8 *data, size_t size)
470 {
471 	/* This is meaningless without firmware caching, so until we
472 	 * decide if firmware caching is reasonable just leave it as a
473 	 * noop */
474 }
475 
476 /* Async support */
477 struct firmware_work {
478 	struct tq_struct work;
479 	struct module *module;
480 	const char *name;
481 	const char *device;
482 	void *context;
483 	void (*cont)(const struct firmware *fw, void *context);
484 };
485 
486 static void
request_firmware_work_func(void * arg)487 request_firmware_work_func(void *arg)
488 {
489 	struct firmware_work *fw_work = arg;
490 	const struct firmware *fw;
491 	if (!arg)
492 		return;
493 	request_firmware(&fw, fw_work->name, fw_work->device);
494 	fw_work->cont(fw, fw_work->context);
495 	release_firmware(fw);
496 	__MOD_DEC_USE_COUNT(fw_work->module);
497 	kfree(fw_work);
498 }
499 
500 /**
501  * request_firmware_nowait:
502  *
503  * Description:
504  *	Asynchronous variant of request_firmware() for contexts where
505  *	it is not possible to sleep.
506  *
507  *	@cont will be called asynchronously when the firmware request is over.
508  *
509  *	@context will be passed over to @cont.
510  *
511  *	@fw may be %NULL if firmware request fails.
512  *
513  **/
514 int
request_firmware_nowait(struct module * module,const char * name,const char * device,void * context,void (* cont)(const struct firmware * fw,void * context))515 request_firmware_nowait(
516 	struct module *module,
517 	const char *name, const char *device, void *context,
518 	void (*cont)(const struct firmware *fw, void *context))
519 {
520 	struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work),
521 						GFP_ATOMIC);
522 	if (!fw_work)
523 		return -ENOMEM;
524 	if (!try_inc_mod_count(module)) {
525 		kfree(fw_work);
526 		return -EFAULT;
527 	}
528 
529 	*fw_work = (struct firmware_work) {
530 		.module = module,
531 		.name = name,
532 		.device = device,
533 		.context = context,
534 		.cont = cont,
535 	};
536 	INIT_TQUEUE(&fw_work->work, request_firmware_work_func, fw_work);
537 
538 	schedule_task(&fw_work->work);
539 	return 0;
540 }
541 
542 static int __init
firmware_class_init(void)543 firmware_class_init(void)
544 {
545 	proc_dir = create_proc_entry("driver/firmware", 0755 | S_IFDIR, NULL);
546 	if (!proc_dir)
547 		return -EAGAIN;
548 	proc_dir_timeout = create_proc_entry("timeout",
549 					     0644 | S_IFREG, proc_dir);
550 	if (!proc_dir_timeout) {
551 		remove_proc_entry("driver/firmware", NULL);
552 		return -EAGAIN;
553 	}
554 	proc_dir_timeout->read_proc = firmware_timeout_show;
555 	proc_dir_timeout->write_proc = firmware_timeout_store;
556 	return 0;
557 }
558 static void __exit
firmware_class_exit(void)559 firmware_class_exit(void)
560 {
561 	remove_proc_entry("timeout", proc_dir);
562 	remove_proc_entry("driver/firmware", NULL);
563 }
564 
565 module_init(firmware_class_init);
566 module_exit(firmware_class_exit);
567 
568 #ifndef CONFIG_FW_LOADER
569 EXPORT_SYMBOL(release_firmware);
570 EXPORT_SYMBOL(request_firmware);
571 EXPORT_SYMBOL(request_firmware_nowait);
572 EXPORT_SYMBOL(register_firmware);
573 #endif
574