Просмотр исходного кода

usb: gadget: composite: make sure to reactivate function on unbind

If a function sets bind_deactivated flag, upon removal we will be left
with an unbalanced deactivation. Let's make sure that we conditionally
call usb_function_activate() from usb_remove_function() and make sure
usb_remove_function() is called from remove_config().

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Felipe Balbi 8 лет назад
Родитель
Сommit
0e3e97526a
1 измененных файлов с 5 добавлено и 6 удалено
  1. 5 6
      drivers/usb/gadget/composite.c

+ 5 - 6
drivers/usb/gadget/composite.c

@@ -315,6 +315,9 @@ void usb_remove_function(struct usb_configuration *c, struct usb_function *f)
 	list_del(&f->list);
 	list_del(&f->list);
 	if (f->unbind)
 	if (f->unbind)
 		f->unbind(c, f);
 		f->unbind(c, f);
+
+	if (f->bind_deactivated)
+		usb_function_activate(f);
 }
 }
 EXPORT_SYMBOL_GPL(usb_remove_function);
 EXPORT_SYMBOL_GPL(usb_remove_function);
 
 
@@ -956,12 +959,8 @@ static void remove_config(struct usb_composite_dev *cdev,
 
 
 		f = list_first_entry(&config->functions,
 		f = list_first_entry(&config->functions,
 				struct usb_function, list);
 				struct usb_function, list);
-		list_del(&f->list);
-		if (f->unbind) {
-			DBG(cdev, "unbind function '%s'/%p\n", f->name, f);
-			f->unbind(config, f);
-			/* may free memory for "f" */
-		}
+
+		usb_remove_function(config, f);
 	}
 	}
 	list_del(&config->list);
 	list_del(&config->list);
 	if (config->unbind) {
 	if (config->unbind) {