[PATCH] g_file_storage modification for it to become a USB_FUNCTION.
Signed-off-by: Felipe Balbi <[EMAIL PROTECTED]>
Signed-off-by: Ragner Magalhaes <[EMAIL PROTECTED]>
---
Index: 2.6-dev/drivers/usb/gadget/file_storage.c
===================================================================
--- 2.6-dev.orig/drivers/usb/gadget/file_storage.c 2007-01-29
11:47:19.000000000 -0400
+++ 2.6-dev/drivers/usb/gadget/file_storage.c 2007-01-29
11:47:29.000000000 -0400
@@ -221,6 +221,10 @@
#undef VERBOSE
#undef DUMP_MSGS
+#define DEBUG 1
+#define VERBOSE 1
+#define DUMP_MSGS 1
+
#include <asm/system.h>
#include <asm/uaccess.h>
@@ -255,6 +259,7 @@
#include <linux/usb_ch9.h>
#include <linux/usb_gadget.h>
+#include <linux/usb/composite.h>
#include "gadget_chips.h"
@@ -844,14 +849,32 @@
* descriptors are built on demand. Also the (static) config and
interface
* descriptors are adjusted during fsg_bind().
*/
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+/* eth[11-20], serial[21-27], storage[31-35] */
+#define STRING_MANUFACTURER 31
+#define STRING_PRODUCT 32
+#define STRING_SERIAL 33
+#define STRING_CONFIG 34
+#define STRING_INTERFACE 35
+#else
#define STRING_MANUFACTURER 1
#define STRING_PRODUCT 2
#define STRING_SERIAL 3
#define STRING_CONFIG 4
#define STRING_INTERFACE 5
+#endif /* End if Composite*/
+/* If Composite Framework is enabled, we need a default configuration
value
+ * of 3. Else, we use the module's defaul
+ */
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+#define COMPOSITE_CONFIG_VALUE 3 /* composite config */
/* There is only one configuration. */
+#define CONFIG_VALUE COMPOSITE_CONFIG_VALUE
+#else
+ /* There is only one configuration. */
#define CONFIG_VALUE 1
+#endif
static struct usb_device_descriptor
device_desc = {
@@ -941,7 +964,7 @@
.bInterval = 32, // frames -> 32 ms
};
-static const struct usb_descriptor_header *fs_function[] = {
+static struct usb_descriptor_header *fs_function[] = {
(struct usb_descriptor_header *) &otg_desc,
(struct usb_descriptor_header *) &intf_desc,
(struct usb_descriptor_header *) &fs_bulk_in_desc,
@@ -1123,9 +1146,15 @@
* completion of various requests: set config, set interface, and
* Bulk-only device reset. */
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static void fsg_disconnect(struct usb_composite_dev *cdev)
+{
+ struct fsg_dev *fsg = cdev->current_func->driver_data;
+#else
static void fsg_disconnect(struct usb_gadget *gadget)
{
struct fsg_dev *fsg = get_gadget_data(gadget);
+#endif
DBG(fsg, "disconnect or port reset\n");
raise_exception(fsg, FSG_STATE_DISCONNECT);
@@ -1494,10 +1523,17 @@
}
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static int fsg_setup(struct usb_composite_dev *cdev,
+ const struct usb_ctrlrequest *ctrl)
+{
+ struct fsg_dev *fsg = cdev->current_func->driver_data;
+#else
static int fsg_setup(struct usb_gadget *gadget,
const struct usb_ctrlrequest *ctrl)
{
struct fsg_dev *fsg = get_gadget_data(gadget);
+#endif
int rc;
int w_length = le16_to_cpu(ctrl->wLength);
@@ -3705,9 +3741,16 @@
kref_put(&fsg->ref, fsg_release);
}
+
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static void /* __init_or_exit */ fsg_unbind(struct usb_composite_dev
*cdev)
+{
+ struct fsg_dev *fsg = cdev->current_func->driver_data;
+#else
static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget)
{
struct fsg_dev *fsg = get_gadget_data(gadget);
+#endif
int i;
struct lun *curlun;
struct usb_request *req = fsg->ep0req;
@@ -3752,7 +3795,11 @@
usb_ep_free_request(fsg->ep0, req);
}
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+ cdev->current_func->driver_data = NULL;
+#else
set_gadget_data(gadget, NULL);
+#endif
}
@@ -3841,8 +3888,14 @@
}
-static int __init fsg_bind(struct usb_gadget *gadget)
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static int __devinit fsg_bind(struct usb_composite_dev *cdev)
{
+ struct usb_gadget *gadget = cdev->gadget;
+#else
+static int __devinit fsg_bind(struct usb_gadget *gadget)
+{
+#endif
struct fsg_dev *fsg = the_fsg;
int rc;
int i;
@@ -3852,9 +3905,16 @@
char *pathbuf, *p;
fsg->gadget = gadget;
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+ cdev->current_func->driver_data = fsg;
+#else
set_gadget_data(gadget, fsg);
+#endif
fsg->ep0 = gadget->ep0;
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+#else
fsg->ep0->driver_data = fsg;
+#endif
if ((rc = check_parameters(fsg)) != 0)
goto out;
@@ -3920,7 +3980,10 @@
}
/* Find all the endpoints we will use */
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+#else
usb_ep_autoconfig_reset(gadget);
+#endif
ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc);
if (!ep)
goto autoconf_fail;
@@ -3972,6 +4035,10 @@
rc = -ENOMEM;
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+ fsg->ep0req = req = cdev->req;
+ req->buf = cdev->req->buf;
+#else
/* Allocate the request and buffer for endpoint 0 */
fsg->ep0req = req = usb_ep_alloc_request(fsg->ep0, GFP_KERNEL);
if (!req)
@@ -3981,7 +4048,7 @@
if (!req->buf)
goto out;
req->complete = ep0_complete;
-
+#endif
/* Allocate the data buffers */
for (i = 0; i < NUM_BUFFERS; ++i) {
struct fsg_buffhd *bh = &fsg->buffhds[i];
@@ -4024,6 +4091,12 @@
INFO(fsg, DRIVER_DESC ", version: " DRIVER_VERSION "\n");
INFO(fsg, "Number of LUNs=%d\n", fsg->nluns);
+ INFO (fsg, "using %s, OUT %s IN %s%s%s\n", gadget->name,
+ fsg->bulk_out->name, fsg->bulk_in->name,
+ fsg->intr_in ? " STATUS " : "",
+ fsg->intr_in ? fsg->intr_in->name : ""
+ );
+
pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);
for (i = 0; i < fsg->nluns; ++i) {
curlun = &fsg->luns[i];
@@ -4065,7 +4138,11 @@
out:
fsg->state = FSG_STATE_TERMINATED; // The thread is dead
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+ fsg_unbind(cdev);
+#else
fsg_unbind(gadget);
+#endif
close_all_backing_files(fsg);
return rc;
}
@@ -4073,17 +4150,29 @@
/*-------------------------------------------------------------------------*/
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static void fsg_suspend(struct usb_composite_dev *cdev)
+{
+ struct fsg_dev *fsg = cdev->current_func->driver_data;
+#else
static void fsg_suspend(struct usb_gadget *gadget)
{
struct fsg_dev *fsg = get_gadget_data(gadget);
+#endif
DBG(fsg, "suspend\n");
set_bit(SUSPENDED, &fsg->atomic_bitflags);
}
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static void fsg_resume(struct usb_composite_dev *cdev)
+{
+ struct fsg_dev *fsg = cdev->current_func->driver_data;
+#else
static void fsg_resume(struct usb_gadget *gadget)
{
struct fsg_dev *fsg = get_gadget_data(gadget);
+#endif
DBG(fsg, "resume\n");
clear_bit(SUSPENDED, &fsg->atomic_bitflags);
@@ -4091,7 +4180,22 @@
/*-------------------------------------------------------------------------*/
-
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+static struct usb_function fsg_usb_function = {
+ .name = DRIVER_DESC,
+ .strings = &stringtab,
+ .descriptors = fs_function,
+#ifdef CONFIG_USB_GADGET_DUALSPEED
+ .hs_descriptors = fs_function,
+#endif
+ .bind = fsg_bind,
+ .unbind = fsg_unbind,
+ .setup = fsg_setup,
+ .disconnect = fsg_disconnect,
+ .suspend = fsg_suspend,
+ .resume = fsg_resume,
+};
+#else /* not def composite */
static struct usb_gadget_driver fsg_driver = {
#ifdef CONFIG_USB_GADGET_DUALSPEED
.speed = USB_SPEED_HIGH,
@@ -4114,7 +4218,7 @@
// .resume = ...
},
};
-
+#endif /* ifdef composite */
static int __init fsg_alloc(void)
{
@@ -4141,8 +4245,13 @@
if ((rc = fsg_alloc()) != 0)
return rc;
fsg = the_fsg;
+
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+ if ((rc = usb_function_register(&fsg_usb_function)) != 0)
+#else
if ((rc = usb_gadget_register_driver(&fsg_driver)) != 0)
- kref_put(&fsg->ref, fsg_release);
+#endif
+ kref_put(&fsg->ref, fsg_release);
return rc;
}
module_init(fsg_init);
@@ -4154,8 +4263,11 @@
/* Unregister the driver iff the thread hasn't already done so */
if (test_and_clear_bit(REGISTERED, &fsg->atomic_bitflags))
+#if defined(CONFIG_USB_COMPOSITE) ||
defined(CONFIG_USB_COMPOSITE_MODULE)
+ usb_function_unregister(&fsg_usb_function);
+#else
usb_gadget_unregister_driver(&fsg_driver);
-
+#endif
/* Wait for the thread to finish up */
wait_for_completion(&fsg->thread_notifier);
--
Best Regards,
Felipe Balbi
[EMAIL PROTECTED]
Nokia Institute of Technology - INdT
Kernel Developers Team
+55 92 2126 1003
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel