|
@@ -2810,6 +2810,33 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int fsg_common_set_cdev(struct fsg_common *common,
|
|
|
+ struct usb_composite_dev *cdev, bool can_stall)
|
|
|
+{
|
|
|
+ struct usb_string *us;
|
|
|
+
|
|
|
+ common->gadget = cdev->gadget;
|
|
|
+ common->ep0 = cdev->gadget->ep0;
|
|
|
+ common->ep0req = cdev->req;
|
|
|
+ common->cdev = cdev;
|
|
|
+
|
|
|
+ us = usb_gstrings_attach(cdev, fsg_strings_array,
|
|
|
+ ARRAY_SIZE(fsg_strings));
|
|
|
+ if (IS_ERR(us))
|
|
|
+ return PTR_ERR(us);
|
|
|
+
|
|
|
+ fsg_intf_desc.iInterface = us[FSG_STRING_INTERFACE].id;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Some peripheral controllers are known not to be able to
|
|
|
+ * halt bulk endpoints correctly. If one of them is present,
|
|
|
+ * disable stalls.
|
|
|
+ */
|
|
|
+ common->can_stall = can_stall && !(gadget_is_at91(common->gadget));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
struct fsg_common *fsg_common_init(struct fsg_common *common,
|
|
|
struct usb_composite_dev *cdev,
|
|
|
struct fsg_config *cfg)
|
|
@@ -2817,7 +2844,6 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
|
|
|
struct usb_gadget *gadget = cdev->gadget;
|
|
|
struct fsg_lun **curlun_it;
|
|
|
struct fsg_lun_config *lcfg;
|
|
|
- struct usb_string *us;
|
|
|
int nluns, i, rc;
|
|
|
char *pathbuf;
|
|
|
|
|
@@ -2837,19 +2863,9 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
|
|
|
common->ops = cfg->ops;
|
|
|
common->private_data = cfg->private_data;
|
|
|
|
|
|
- common->gadget = gadget;
|
|
|
- common->ep0 = gadget->ep0;
|
|
|
- common->ep0req = cdev->req;
|
|
|
- common->cdev = cdev;
|
|
|
-
|
|
|
- us = usb_gstrings_attach(cdev, fsg_strings_array,
|
|
|
- ARRAY_SIZE(fsg_strings));
|
|
|
- if (IS_ERR(us)) {
|
|
|
- rc = PTR_ERR(us);
|
|
|
+ rc = fsg_common_set_cdev(common, cdev, cfg->can_stall);
|
|
|
+ if (rc)
|
|
|
goto error_release;
|
|
|
- }
|
|
|
- fsg_intf_desc.iInterface = us[FSG_STRING_INTERFACE].id;
|
|
|
-
|
|
|
|
|
|
rc = fsg_common_set_nluns(common, cfg->nluns);
|
|
|
if (rc)
|
|
@@ -2925,14 +2941,6 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
|
|
|
: "File-Stor Gadget"),
|
|
|
i);
|
|
|
|
|
|
- /*
|
|
|
- * Some peripheral controllers are known not to be able to
|
|
|
- * halt bulk endpoints correctly. If one of them is present,
|
|
|
- * disable stalls.
|
|
|
- */
|
|
|
- common->can_stall = cfg->can_stall &&
|
|
|
- !(gadget_is_at91(common->gadget));
|
|
|
-
|
|
|
|
|
|
/* Tell the thread to start working */
|
|
|
common->thread_task =
|