[PATCH] USB: make bias writeable in libusual
Make the bias parameter writeable. Writing the parameter does not trigger a rebind of currently attached storage devices. Signed-off-by: Pete Zaitcev <zaitcev@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
a00828e9ac
commit
5ba35bd8f9
1 changed files with 27 additions and 26 deletions
|
@ -24,10 +24,9 @@ static DEFINE_SPINLOCK(usu_lock);
|
||||||
/*
|
/*
|
||||||
*/
|
*/
|
||||||
#define USB_US_DEFAULT_BIAS USB_US_TYPE_STOR
|
#define USB_US_DEFAULT_BIAS USB_US_TYPE_STOR
|
||||||
|
static atomic_t usu_bias = ATOMIC_INIT(USB_US_DEFAULT_BIAS);
|
||||||
|
|
||||||
#define BIAS_NAME_SIZE (sizeof("usb-storage"))
|
#define BIAS_NAME_SIZE (sizeof("usb-storage"))
|
||||||
static char bias[BIAS_NAME_SIZE];
|
|
||||||
static int usb_usual_bias;
|
|
||||||
static const char *bias_names[3] = { "none", "usb-storage", "ub" };
|
static const char *bias_names[3] = { "none", "usb-storage", "ub" };
|
||||||
|
|
||||||
static DECLARE_MUTEX_LOCKED(usu_init_notify);
|
static DECLARE_MUTEX_LOCKED(usu_init_notify);
|
||||||
|
@ -35,7 +34,6 @@ static DECLARE_COMPLETION(usu_end_notify);
|
||||||
static atomic_t total_threads = ATOMIC_INIT(0);
|
static atomic_t total_threads = ATOMIC_INIT(0);
|
||||||
|
|
||||||
static int usu_probe_thread(void *arg);
|
static int usu_probe_thread(void *arg);
|
||||||
static int parse_bias(const char *bias_s);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The table.
|
* The table.
|
||||||
|
@ -107,7 +105,7 @@ int usb_usual_check_type(const struct usb_device_id *id, int caller_type)
|
||||||
if (id_type == caller_type)
|
if (id_type == caller_type)
|
||||||
return 0;
|
return 0;
|
||||||
/* Drivers grab devices biased to them */
|
/* Drivers grab devices biased to them */
|
||||||
if (id_type == USB_US_TYPE_NONE && caller_type == usb_usual_bias)
|
if (id_type == USB_US_TYPE_NONE && caller_type == atomic_read(&usu_bias))
|
||||||
return 0;
|
return 0;
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
@ -124,7 +122,7 @@ static int usu_probe(struct usb_interface *intf,
|
||||||
|
|
||||||
type = USB_US_TYPE(id->driver_info);
|
type = USB_US_TYPE(id->driver_info);
|
||||||
if (type == 0)
|
if (type == 0)
|
||||||
type = usb_usual_bias;
|
type = atomic_read(&usu_bias);
|
||||||
|
|
||||||
spin_lock_irqsave(&usu_lock, flags);
|
spin_lock_irqsave(&usu_lock, flags);
|
||||||
if ((stat[type].fls & (USU_MOD_FL_THREAD|USU_MOD_FL_PRESENT)) != 0) {
|
if ((stat[type].fls & (USU_MOD_FL_THREAD|USU_MOD_FL_PRESENT)) != 0) {
|
||||||
|
@ -206,9 +204,6 @@ static int __init usb_usual_init(void)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
bias[BIAS_NAME_SIZE-1] = 0;
|
|
||||||
usb_usual_bias = parse_bias(bias);
|
|
||||||
|
|
||||||
rc = usb_register(&usu_driver);
|
rc = usb_register(&usu_driver);
|
||||||
up(&usu_init_notify);
|
up(&usu_init_notify);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -231,36 +226,42 @@ static void __exit usb_usual_exit(void)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate and accept the bias parameter.
|
* Validate and accept the bias parameter.
|
||||||
* Maybe make an sysfs method later. XXX
|
|
||||||
*/
|
*/
|
||||||
static int parse_bias(const char *bias_s)
|
static int usu_set_bias(const char *bias_s, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int len;
|
||||||
int bias_n = 0;
|
int bias_n = 0;
|
||||||
|
|
||||||
if (bias_s[0] == 0 || bias_s[0] == ' ') {
|
len = strlen(bias_s);
|
||||||
bias_n = USB_US_DEFAULT_BIAS;
|
if (len == 0)
|
||||||
} else {
|
return -EDOM;
|
||||||
for (i = 1; i < 3; i++) {
|
if (bias_s[len-1] == '\n')
|
||||||
if (strcmp(bias_s, bias_names[i]) == 0) {
|
--len;
|
||||||
bias_n = i;
|
|
||||||
break;
|
for (i = 1; i < 3; i++) {
|
||||||
}
|
if (strncmp(bias_s, bias_names[i], len) == 0) {
|
||||||
}
|
bias_n = i;
|
||||||
if (bias_n == 0) {
|
break;
|
||||||
bias_n = USB_US_DEFAULT_BIAS;
|
|
||||||
printk(KERN_INFO
|
|
||||||
"libusual: unknown bias \"%s\", using \"%s\"\n",
|
|
||||||
bias_s, bias_names[bias_n]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bias_n;
|
if (bias_n == 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
atomic_set(&usu_bias, bias_n);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int usu_get_bias(char *buffer, struct kernel_param *kp)
|
||||||
|
{
|
||||||
|
return strlen(strcpy(buffer, bias_names[atomic_read(&usu_bias)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(usb_usual_init);
|
module_init(usb_usual_init);
|
||||||
module_exit(usb_usual_exit);
|
module_exit(usb_usual_exit);
|
||||||
|
|
||||||
module_param_string(bias, bias, BIAS_NAME_SIZE, S_IRUGO|S_IWUSR);
|
module_param_call(bias, usu_set_bias, usu_get_bias, NULL, S_IRUGO|S_IWUSR);
|
||||||
|
__MODULE_PARM_TYPE(bias, "string");
|
||||||
MODULE_PARM_DESC(bias, "Bias to usb-storage or ub");
|
MODULE_PARM_DESC(bias, "Bias to usb-storage or ub");
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
Loading…
Add table
Reference in a new issue