aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
Diffstat (limited to 'usb')
-rw-r--r--usb/usb-gadget-composite-added-disconnect-callback.patch45
-rw-r--r--usb/usb-gadget-f_mass_storage-added-eject-callback.patch235
-rw-r--r--usb/usb-gadget-g_ether-updated-inf-file.patch268
-rw-r--r--usb/usb-gadget-g_multi-added-documentation-and-inf-files.patch211
-rw-r--r--usb/usb-gadget-g_multi-code-clean-up-and-refactoring.patch450
-rw-r--r--usb/usb-gadget-g_serial-inf-file-updated.patch238
6 files changed, 1447 insertions, 0 deletions
diff --git a/usb/usb-gadget-composite-added-disconnect-callback.patch b/usb/usb-gadget-composite-added-disconnect-callback.patch
new file mode 100644
index 00000000000000..89c20beef8e829
--- /dev/null
+++ b/usb/usb-gadget-composite-added-disconnect-callback.patch
@@ -0,0 +1,45 @@
+From m.nazarewicz@samsung.com Mon Jun 21 14:44:36 2010
+From: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Date: Mon, 21 Jun 2010 13:57:08 +0200
+Subject: USB: gadget: composite: added disconnect callback
+To: linux-usb@vger.kernel.org
+Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org
+Message-ID: <98f552c7e1dd2d68b6eb27675f7fa3f5b211c29e.1277119876.git.m.nazarewicz@samsung.com>
+
+
+Added a disconnect() callback to composite devices which
+is called by composite glue when its disconnect callback
+is called by gadget.
+
+Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Acked-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/composite.c | 2 ++
+ include/linux/usb/composite.h | 2 ++
+ 2 files changed, 4 insertions(+)
+
+--- a/drivers/usb/gadget/composite.c
++++ b/drivers/usb/gadget/composite.c
+@@ -956,6 +956,8 @@ static void composite_disconnect(struct
+ spin_lock_irqsave(&cdev->lock, flags);
+ if (cdev->config)
+ reset_config(cdev);
++ if (composite->disconnect)
++ composite->disconnect(cdev);
+ spin_unlock_irqrestore(&cdev->lock, flags);
+ }
+
+--- a/include/linux/usb/composite.h
++++ b/include/linux/usb/composite.h
+@@ -276,6 +276,8 @@ struct usb_composite_driver {
+ int (*bind)(struct usb_composite_dev *);
+ int (*unbind)(struct usb_composite_dev *);
+
++ void (*disconnect)(struct usb_composite_dev *);
++
+ /* global suspend hooks */
+ void (*suspend)(struct usb_composite_dev *);
+ void (*resume)(struct usb_composite_dev *);
diff --git a/usb/usb-gadget-f_mass_storage-added-eject-callback.patch b/usb/usb-gadget-f_mass_storage-added-eject-callback.patch
new file mode 100644
index 00000000000000..d659df76f5cec3
--- /dev/null
+++ b/usb/usb-gadget-f_mass_storage-added-eject-callback.patch
@@ -0,0 +1,235 @@
+From m.nazarewicz@samsung.com Mon Jun 21 14:44:50 2010
+From: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Date: Mon, 21 Jun 2010 13:57:09 +0200
+Subject: USB: gadget: f_mass_storage: added eject callback
+To: linux-usb@vger.kernel.org
+Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org
+Message-ID: <eeff6a2401957ac2d50af8602ea08d1f913d8e0d.1277119876.git.m.nazarewicz@samsung.com>
+
+
+Added pre_eject() and post_eject() callbacks which are
+called before and after removable logical unit is ejected.
+The first can prevent logical unit from being ejected.
+
+This commit also changes the way callbacks are passed to
+the function from gadget. A fsg_operations structure has
+been created which lists all callbacks -- this is passed
+to the fsg_config.
+
+This is important because it changes the way thread_exits()
+callback is passed.
+
+Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/f_mass_storage.c | 109 +++++++++++++++++++++++-------------
+ drivers/usb/gadget/mass_storage.c | 5 +
+ 2 files changed, 74 insertions(+), 40 deletions(-)
+
+--- a/drivers/usb/gadget/f_mass_storage.c
++++ b/drivers/usb/gadget/f_mass_storage.c
+@@ -316,6 +316,27 @@ static const char fsg_string_interface[]
+ /*-------------------------------------------------------------------------*/
+
+ struct fsg_dev;
++struct fsg_common;
++
++/* FSF callback functions */
++struct fsg_operations {
++ /* Callback function to call when thread exits. If no
++ * callback is set or it returns value lower then zero MSF
++ * will force eject all LUNs it operates on (including those
++ * marked as non-removable or with prevent_medium_removal flag
++ * set). */
++ int (*thread_exits)(struct fsg_common *common);
++
++ /* Called prior to ejection. Negative return means error,
++ * zero means to continue with ejection, positive means not to
++ * eject. */
++ int (*pre_eject)(struct fsg_common *common,
++ struct fsg_lun *lun, int num);
++ /* Called after ejection. Negative return means error, zero
++ * or positive is just a success. */
++ int (*post_eject)(struct fsg_common *common,
++ struct fsg_lun *lun, int num);
++};
+
+
+ /* Data shared by all the FSG instances. */
+@@ -369,8 +390,8 @@ struct fsg_common {
+ struct completion thread_notifier;
+ struct task_struct *thread_task;
+
+- /* Callback function to call when thread exits. */
+- int (*thread_exits)(struct fsg_common *common);
++ /* Callback functions. */
++ const struct fsg_operations *ops;
+ /* Gadget's private data. */
+ void *private_data;
+
+@@ -394,12 +415,8 @@ struct fsg_config {
+ const char *lun_name_format;
+ const char *thread_name;
+
+- /* Callback function to call when thread exits. If no
+- * callback is set or it returns value lower then zero MSF
+- * will force eject all LUNs it operates on (including those
+- * marked as non-removable or with prevent_medium_removal flag
+- * set). */
+- int (*thread_exits)(struct fsg_common *common);
++ /* Callback functions. */
++ const struct fsg_operations *ops;
+ /* Gadget's private data. */
+ void *private_data;
+
+@@ -435,6 +452,7 @@ static inline int __fsg_is_set(struct fs
+ if (common->fsg)
+ return 1;
+ ERROR(common, "common->fsg is NULL in %s at %u\n", func, line);
++ WARN_ON(1);
+ return 0;
+ }
+
+@@ -1393,43 +1411,55 @@ static int do_start_stop(struct fsg_comm
+ } else if (!curlun->removable) {
+ curlun->sense_data = SS_INVALID_COMMAND;
+ return -EINVAL;
+- }
+-
+- loej = common->cmnd[4] & 0x02;
+- start = common->cmnd[4] & 0x01;
+-
+- /* eject code from file_storage.c:do_start_stop() */
+-
+- if ((common->cmnd[1] & ~0x01) != 0 || /* Mask away Immed */
+- (common->cmnd[4] & ~0x03) != 0) { /* Mask LoEj, Start */
++ } else if ((common->cmnd[1] & ~0x01) != 0 || /* Mask away Immed */
++ (common->cmnd[4] & ~0x03) != 0) { /* Mask LoEj, Start */
+ curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
+ return -EINVAL;
+ }
+
+- if (!start) {
+- /* Are we allowed to unload the media? */
+- if (curlun->prevent_medium_removal) {
+- LDBG(curlun, "unload attempt prevented\n");
+- curlun->sense_data = SS_MEDIUM_REMOVAL_PREVENTED;
+- return -EINVAL;
+- }
+- if (loej) { /* Simulate an unload/eject */
+- up_read(&common->filesem);
+- down_write(&common->filesem);
+- fsg_lun_close(curlun);
+- up_write(&common->filesem);
+- down_read(&common->filesem);
+- }
+- } else {
++ loej = common->cmnd[4] & 0x02;
++ start = common->cmnd[4] & 0x01;
+
+- /* Our emulation doesn't support mounting; the medium is
+- * available for use as soon as it is loaded. */
++ /* Our emulation doesn't support mounting; the medium is
++ * available for use as soon as it is loaded. */
++ if (start) {
+ if (!fsg_lun_is_open(curlun)) {
+ curlun->sense_data = SS_MEDIUM_NOT_PRESENT;
+ return -EINVAL;
+ }
++ return 0;
+ }
+- return 0;
++
++ /* Are we allowed to unload the media? */
++ if (curlun->prevent_medium_removal) {
++ LDBG(curlun, "unload attempt prevented\n");
++ curlun->sense_data = SS_MEDIUM_REMOVAL_PREVENTED;
++ return -EINVAL;
++ }
++
++ if (!loej)
++ return 0;
++
++ /* Simulate an unload/eject */
++ if (common->ops && common->ops->pre_eject) {
++ int r = common->ops->pre_eject(common, curlun,
++ curlun - common->luns);
++ if (unlikely(r < 0))
++ return r;
++ else if (r)
++ return 0;
++ }
++
++ up_read(&common->filesem);
++ down_write(&common->filesem);
++ fsg_lun_close(curlun);
++ up_write(&common->filesem);
++ down_read(&common->filesem);
++
++ return common->ops && common->ops->post_eject
++ ? min(0, common->ops->post_eject(common, curlun,
++ curlun - common->luns))
++ : 0;
+ }
+
+
+@@ -2654,7 +2684,8 @@ static int fsg_main_thread(void *common_
+ common->thread_task = NULL;
+ spin_unlock_irq(&common->lock);
+
+- if (!common->thread_exits || common->thread_exits(common) < 0) {
++ if (!common->ops || !common->ops->thread_exits
++ || common->ops->thread_exits(common) < 0) {
+ struct fsg_lun *curlun = common->luns;
+ unsigned i = common->nluns;
+
+@@ -2730,6 +2761,7 @@ static struct fsg_common *fsg_common_ini
+ common->free_storage_on_release = 0;
+ }
+
++ common->ops = cfg->ops;
+ common->private_data = cfg->private_data;
+
+ common->gadget = gadget;
+@@ -2851,7 +2883,6 @@ buffhds_first_it:
+
+
+ /* Tell the thread to start working */
+- common->thread_exits = cfg->thread_exits;
+ common->thread_task =
+ kthread_create(fsg_main_thread, common,
+ OR(cfg->thread_name, "file-storage"));
+@@ -3148,8 +3179,8 @@ fsg_config_from_params(struct fsg_config
+ cfg->product_name = 0;
+ cfg->release = 0xffff;
+
+- cfg->thread_exits = 0;
+- cfg->private_data = 0;
++ cfg->ops = NULL;
++ cfg->private_data = NULL;
+
+ /* Finalise */
+ cfg->can_stall = params->stall;
+--- a/drivers/usb/gadget/mass_storage.c
++++ b/drivers/usb/gadget/mass_storage.c
+@@ -143,6 +143,9 @@ static int msg_thread_exits(struct fsg_c
+
+ static int __init msg_do_config(struct usb_configuration *c)
+ {
++ static const struct fsg_operations ops = {
++ .thread_exits = msg_thread_exits,
++ };
+ static struct fsg_common common;
+
+ struct fsg_common *retp;
+@@ -155,7 +158,7 @@ static int __init msg_do_config(struct u
+ }
+
+ fsg_config_from_params(&config, &mod_data);
+- config.thread_exits = msg_thread_exits;
++ config.ops = &ops;
+
+ retp = fsg_common_init(&common, c->cdev, &config);
+ if (IS_ERR(retp))
diff --git a/usb/usb-gadget-g_ether-updated-inf-file.patch b/usb/usb-gadget-g_ether-updated-inf-file.patch
new file mode 100644
index 00000000000000..fffb821e8efd77
--- /dev/null
+++ b/usb/usb-gadget-g_ether-updated-inf-file.patch
@@ -0,0 +1,268 @@
+From m.nazarewicz@samsung.com Mon Jun 21 14:42:21 2010
+From: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Date: Mon, 21 Jun 2010 13:57:05 +0200
+Subject: USB: gadget: g_ether: updated INF file
+To: linux-usb@vger.kernel.org
+Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org
+Message-ID: <63fcea8d575e5c032d111840bf8cd82cea1aaa59.1277119876.git.m.nazarewicz@samsung.com>
+
+
+Updated the INF file for the g_ether gadget. It should work with most
+recent Windows systems now.
+
+Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ Documentation/usb/linux.inf | 224 ++++++++------------------------------------
+ 1 file changed, 45 insertions(+), 179 deletions(-)
+
+--- a/Documentation/usb/linux.inf
++++ b/Documentation/usb/linux.inf
+@@ -1,200 +1,66 @@
+-; MS-Windows driver config matching some basic modes of the
+-; Linux-USB Ethernet/RNDIS gadget firmware:
+-;
+-; - RNDIS plus CDC Ethernet ... this may be familiar as a DOCSIS
+-; cable modem profile, and supports most non-Microsoft USB hosts
+-;
+-; - RNDIS plus CDC Subset ... used by hardware that incapable of
+-; full CDC Ethernet support.
+-;
+-; Microsoft only directly supports RNDIS drivers, and bundled them into XP.
+-; The Microsoft "Remote NDIS USB Driver Kit" is currently found at:
+-; http://www.microsoft.com/whdc/hwdev/resources/HWservices/rndis.mspx
+-
++; Based on template INF file found at
++; <http://msdn.microsoft.com/en-us/library/ff570620.aspx>
++; which was:
++; Copyright (c) Microsoft Corporation
++; and released under the MLPL as found at:
++; <http://msdn.microsoft.com/en-us/cc300389.aspx#MLPL>.
++; For use only on Windows operating systems.
+
+ [Version]
+-Signature = "$CHICAGO$"
++Signature = "$Windows NT$"
+ Class = Net
+ ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318}
+ Provider = %Linux%
+-Compatible = 1
+-MillenniumPreferred = .ME
+-DriverVer = 03/30/2004,0.0.0.0
+-; catalog file would be used by WHQL
+-;CatalogFile = Linux.cat
++DriverVer = 06/21/2006,6.0.6000.16384
+
+ [Manufacturer]
+-%Linux% = LinuxDevices,NT.5.1
++%Linux% = LinuxDevices,NTx86,NTamd64,NTia64
++
++; Decoration for x86 architecture
++[LinuxDevices.NTx86]
++%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
+
+-[LinuxDevices]
+-; NetChip IDs, used by both firmware modes
+-%LinuxDevice% = RNDIS, USB\VID_0525&PID_a4a2
++; Decoration for x64 architecture
++[LinuxDevices.NTamd64]
++%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
+
+-[LinuxDevices.NT.5.1]
+-%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
++; Decoration for ia64 architecture
++[LinuxDevices.NTia64]
++%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
+
++;@@@ This is the common setting for setup
+ [ControlFlags]
+ ExcludeFromSelect=*
+
+-; Windows 98, Windows 98 Second Edition specific sections --------
+-
+-[RNDIS]
+-DeviceID = usb8023
+-MaxInstance = 512
+-DriverVer = 03/30/2004,0.0.0.0
+-AddReg = RNDIS_AddReg_98, RNDIS_AddReg_Common
+-
+-[RNDIS_AddReg_98]
+-HKR, , DevLoader, 0, *ndis
+-HKR, , DeviceVxDs, 0, usb8023.sys
+-HKR, NDIS, LogDriverName, 0, "usb8023"
+-HKR, NDIS, MajorNdisVersion, 1, 5
+-HKR, NDIS, MinorNdisVersion, 1, 0
+-HKR, Ndi\Interfaces, DefUpper, 0, "ndis3,ndis4,ndis5"
+-HKR, Ndi\Interfaces, DefLower, 0, "ethernet"
+-HKR, Ndi\Interfaces, UpperRange, 0, "ndis3,ndis4,ndis5"
+-HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
+-HKR, Ndi\Install, ndis3, 0, "RNDIS_Install_98"
+-HKR, Ndi\Install, ndis4, 0, "RNDIS_Install_98"
+-HKR, Ndi\Install, ndis5, 0, "RNDIS_Install_98"
+-HKR, Ndi, DeviceId, 0, "USB\VID_0525&PID_a4a2"
+-
+-[RNDIS_Install_98]
+-CopyFiles=RNDIS_CopyFiles_98
+-
+-[RNDIS_CopyFiles_98]
+-usb8023.sys, usb8023w.sys, , 0
+-rndismp.sys, rndismpw.sys, , 0
+-
+-; Windows Millennium Edition specific sections --------------------
+-
+-[RNDIS.ME]
+-DeviceID = usb8023
+-MaxInstance = 512
+-DriverVer = 03/30/2004,0.0.0.0
+-AddReg = RNDIS_AddReg_ME, RNDIS_AddReg_Common
+-Characteristics = 0x84 ; NCF_PHYSICAL + NCF_HAS_UI
+-BusType = 15
+-
+-[RNDIS_AddReg_ME]
+-HKR, , DevLoader, 0, *ndis
+-HKR, , DeviceVxDs, 0, usb8023.sys
+-HKR, NDIS, LogDriverName, 0, "usb8023"
+-HKR, NDIS, MajorNdisVersion, 1, 5
+-HKR, NDIS, MinorNdisVersion, 1, 0
+-HKR, Ndi\Interfaces, DefUpper, 0, "ndis3,ndis4,ndis5"
+-HKR, Ndi\Interfaces, DefLower, 0, "ethernet"
+-HKR, Ndi\Interfaces, UpperRange, 0, "ndis3,ndis4,ndis5"
+-HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
+-HKR, Ndi\Install, ndis3, 0, "RNDIS_Install_ME"
+-HKR, Ndi\Install, ndis4, 0, "RNDIS_Install_ME"
+-HKR, Ndi\Install, ndis5, 0, "RNDIS_Install_ME"
+-HKR, Ndi, DeviceId, 0, "USB\VID_0525&PID_a4a2"
+-
+-[RNDIS_Install_ME]
+-CopyFiles=RNDIS_CopyFiles_ME
+-
+-[RNDIS_CopyFiles_ME]
+-usb8023.sys, usb8023m.sys, , 0
+-rndismp.sys, rndismpm.sys, , 0
+-
+-; Windows 2000 specific sections ---------------------------------
+-
+-[RNDIS.NT]
+-Characteristics = 0x84 ; NCF_PHYSICAL + NCF_HAS_UI
+-BusType = 15
+-DriverVer = 03/30/2004,0.0.0.0
+-AddReg = RNDIS_AddReg_NT, RNDIS_AddReg_Common
+-CopyFiles = RNDIS_CopyFiles_NT
+-
+-[RNDIS.NT.Services]
+-AddService = USB_RNDIS, 2, RNDIS_ServiceInst_NT, RNDIS_EventLog
+-
+-[RNDIS_CopyFiles_NT]
+-; no rename of files on Windows 2000, use the 'k' names as is
+-usb8023k.sys, , , 0
+-rndismpk.sys, , , 0
+-
+-[RNDIS_ServiceInst_NT]
+-DisplayName = %ServiceDisplayName%
+-ServiceType = 1
+-StartType = 3
+-ErrorControl = 1
+-ServiceBinary = %12%\usb8023k.sys
+-LoadOrderGroup = NDIS
+-AddReg = RNDIS_WMI_AddReg_NT
+-
+-[RNDIS_WMI_AddReg_NT]
+-HKR, , MofImagePath, 0x00020000, "System32\drivers\rndismpk.sys"
+-
+-; Windows XP specific sections -----------------------------------
+-
++; DDInstall section
++; References the in-build Netrndis.inf
+ [RNDIS.NT.5.1]
+-Characteristics = 0x84 ; NCF_PHYSICAL + NCF_HAS_UI
+-BusType = 15
+-DriverVer = 03/30/2004,0.0.0.0
+-AddReg = RNDIS_AddReg_NT, RNDIS_AddReg_Common
+-; no copyfiles - the files are already in place
++Characteristics = 0x84 ; NCF_PHYSICAL + NCF_HAS_UI
++BusType = 15
++; NEVER REMOVE THE FOLLOWING REFERENCE FOR NETRNDIS.INF
++include = netrndis.inf
++needs = Usb_Rndis.ndi
++AddReg = Rndis_AddReg_Vista
+
++; DDInstal.Services section
+ [RNDIS.NT.5.1.Services]
+-AddService = USB_RNDIS, 2, RNDIS_ServiceInst_51, RNDIS_EventLog
++include = netrndis.inf
++needs = Usb_Rndis.ndi.Services
+
+-[RNDIS_ServiceInst_51]
+-DisplayName = %ServiceDisplayName%
+-ServiceType = 1
+-StartType = 3
+-ErrorControl = 1
+-ServiceBinary = %12%\usb8023.sys
+-LoadOrderGroup = NDIS
+-AddReg = RNDIS_WMI_AddReg_51
+-
+-[RNDIS_WMI_AddReg_51]
+-HKR, , MofImagePath, 0x00020000, "System32\drivers\rndismp.sys"
+-
+-; Windows 2000 and Windows XP common sections --------------------
+-
+-[RNDIS_AddReg_NT]
+-HKR, Ndi, Service, 0, "USB_RNDIS"
+-HKR, Ndi\Interfaces, UpperRange, 0, "ndis5"
+-HKR, Ndi\Interfaces, LowerRange, 0, "ethernet"
+-
+-[RNDIS_EventLog]
+-AddReg = RNDIS_EventLog_AddReg
+-
+-[RNDIS_EventLog_AddReg]
+-HKR, , EventMessageFile, 0x00020000, "%%SystemRoot%%\System32\netevent.dll"
+-HKR, , TypesSupported, 0x00010001, 7
+-
+-; Common Sections -------------------------------------------------
+-
+-[RNDIS_AddReg_Common]
+-HKR, NDI\params\NetworkAddress, ParamDesc, 0, %NetworkAddress%
+-HKR, NDI\params\NetworkAddress, type, 0, "edit"
+-HKR, NDI\params\NetworkAddress, LimitText, 0, "12"
+-HKR, NDI\params\NetworkAddress, UpperCase, 0, "1"
+-HKR, NDI\params\NetworkAddress, default, 0, " "
+-HKR, NDI\params\NetworkAddress, optional, 0, "1"
+-
+-[SourceDisksNames]
+-1=%SourceDisk%,,1
+-
+-[SourceDisksFiles]
+-usb8023m.sys=1
+-rndismpm.sys=1
+-usb8023w.sys=1
+-rndismpw.sys=1
+-usb8023k.sys=1
+-rndismpk.sys=1
+-
+-[DestinationDirs]
+-RNDIS_CopyFiles_98 = 10, system32/drivers
+-RNDIS_CopyFiles_ME = 10, system32/drivers
+-RNDIS_CopyFiles_NT = 12
++; Optional registry settings. You can modify as needed.
++[RNDIS_AddReg_Vista]
++HKR, NDI\params\VistaProperty, ParamDesc, 0, %Vista_Property%
++HKR, NDI\params\VistaProperty, type, 0, "edit"
++HKR, NDI\params\VistaProperty, LimitText, 0, "12"
++HKR, NDI\params\VistaProperty, UpperCase, 0, "1"
++HKR, NDI\params\VistaProperty, default, 0, " "
++HKR, NDI\params\VistaProperty, optional, 0, "1"
++
++; No sys copyfiles - the sys files are already in-build
++; (part of the operating system).
++; We do not support XP SP1-, 2003 SP1-, ME, 9x.
+
+ [Strings]
+-ServiceDisplayName = "USB Remote NDIS Network Device Driver"
+-NetworkAddress = "Network Address"
+ Linux = "Linux Developer Community"
+ LinuxDevice = "Linux USB Ethernet/RNDIS Gadget"
+-SourceDisk = "Ethernet/RNDIS Gadget Driver Install Disk"
+-
++Vista_Property = "Optional Vista Property"
diff --git a/usb/usb-gadget-g_multi-added-documentation-and-inf-files.patch b/usb/usb-gadget-g_multi-added-documentation-and-inf-files.patch
new file mode 100644
index 00000000000000..1a6e4d0f302c5e
--- /dev/null
+++ b/usb/usb-gadget-g_multi-added-documentation-and-inf-files.patch
@@ -0,0 +1,211 @@
+From m.nazarewicz@samsung.com Mon Jun 21 14:44:21 2010
+From: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Date: Mon, 21 Jun 2010 13:57:07 +0200
+Subject: USB: gadget: g_multi: added documentation and INF files
+To: linux-usb@vger.kernel.org
+Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org
+Message-ID: <a5951faaeb541e04ed99e9cf901faa527d40fa43.1277119876.git.m.nazarewicz@samsung.com>
+
+
+A short documentation of the g_multi driver along with INF
+files for Windows XP SP3 are provided.
+
+Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ Documentation/usb/gadget_multi.txt | 150 ++++++++++++++++++++++++++++++++++++
+ Documentation/usb/linux-cdc-acm.inf | 4
+ Documentation/usb/linux.inf | 6 -
+ 3 files changed, 155 insertions(+), 5 deletions(-)
+
+--- /dev/null
++++ b/Documentation/usb/gadget_multi.txt
+@@ -0,0 +1,150 @@
++ -*- org -*-
++
++* Overview
++
++The Multifunction Composite Gadget (or g_multi) is a composite gadget
++that makes extensive use of the composite framework to provide
++a... multifunction gadget.
++
++In it's standard configuration it provides a single USB configuration
++with RNDIS[1] (that is Ethernet), USB CDC[2] ACM (that is serial) and
++USB Mass Storage functions.
++
++A CDC ECM (Ethernet) function may be turned on via a Kconfig option
++and RNDIS can be turned off. If they are both enabled the gadget will
++have two configurations -- one with RNDIS and another with CDC ECM[3].
++
++Please not that if you use non-standard configuration (that is enable
++CDC ECM) you may need to change vendor and/or product ID.
++
++* Host drivers
++
++To make use of the gadget one needs to make it work on host side --
++without that there's no hope of achieving anything with the gadget.
++As one might expect, things one need to do very from system to system.
++
++** Linux host drivers
++
++Since the gadget uses standard composite framework and appears as such
++to Linux host it does not need any additional drivers on Linux host
++side. All the functions are handled by respective drivers developed
++for them.
++
++This is also true for two configuration set-up with RNDIS
++configuration being the first one. Linux host will use the second
++configuration with CDC ECM which should work better under Linux.
++
++** Windows host drivers
++
++For the gadget two work under Windows two conditions have to be met:
++
++*** Detecting as composite gadget
++
++First of all, Windows need to detect the gadget as an USB composite
++gadget which on its own have some conditions[4]. If they are met,
++Windows lets USB Generic Parent Driver[5] handle the device which then
++tries to much drivers for each individual interface (sort of, don't
++get into too many details).
++
++The good news is: you do not have to worry about most of the
++conditions!
++
++The only thing to worry is that the gadget has to have a single
++configuration so a dual RNDIS and CDC ECM gadget won't work unless you
++create a proper INF -- and of course, if you do submit it!
++
++*** Installing drivers for each function
++
++The other, trickier thing is making Windows install drivers for each
++individual function.
++
++For mass storage it is trivial since Windows detect it's an interface
++implementing USB Mass Storage class and selects appropriate driver.
++
++Things are harder with RDNIS and CDC ACM.
++
++**** RNDIS
++
++To make Windows select RNDIS drivers for the first function in the
++gadget, one needs to use the [[file:linux.inf]] file provided with this
++document. It "attaches" Window's RNDIS driver to the first interface
++of the gadget.
++
++Please note, that while testing we encountered some issues[6] when
++RNDIS was not the first interface. You do not need to worry abut it
++unless you are trying to develop your own gadget in which case watch
++out for this bug.
++
++**** CDC ACM
++
++Similarly, [[file:linux-cdc-acm.inf]] is provided for CDC ACM.
++
++**** Customising the gadget
++
++If you intend to hack the g_multi gadget be advised that rearranging
++functions will obviously change interface numbers for each of the
++functionality. As an effect provided INFs won't work since they have
++interface numbers hard-coded in them (it's not hard to change those
++though[7]).
++
++This also means, that after experimenting with g_multi and changing
++provided functions one should change gadget's vendor and/or product ID
++so there will be no collision with other customised gadgets or the
++original gadget.
++
++Failing to comply may cause brain damage after wondering for hours why
++things don't work as intended before realising Windows have cached
++some drivers information (changing USB port may sometimes help plus
++you might try using USBDeview[8] to remove the phantom device).
++
++**** INF testing
++
++Provided INF files have been tested on Windows XP SP3, Windows Vista
++and Windows 7, all 32-bit versions. It should work on 64-bit versions
++as well. It most likely won't work on Windows prior to Windows XP
++SP2.
++
++** Other systems
++
++At this moment, drivers for any other systems have not been tested.
++Knowing how MacOS is based on BSD and BSD is an Open Source it is
++believed that it should (read: "I have no idea whether it will") work
++out-of-the-box.
++
++For more exotic systems I have even less to say...
++
++Any testing and drivers *are* *welcome*!
++
++* Authors
++
++This document has been written by Michal Nazarewicz
++([[mailto:mina86@mina86.com]]). INF files have been hacked with
++support of Marek Szyprowski ([[mailto:m.szyprowski@samsung.com]]) and
++Xiaofan Chen ([[mailto:xiaofanc@gmail.com]]) basing on the MS RNDIS
++template[9], Microchip's CDC ACM INF file and David Brownell's
++([[mailto:dbrownell@users.sourceforge.net]]) original INF files.
++
++* Footnotes
++
++[1] Remote Network Driver Interface Specification,
++[[http://msdn.microsoft.com/en-us/library/ee484414.aspx]].
++
++[2] Communications Device Class Abstract Control Model, spec for this
++and other USB classes can be found at
++[[http://www.usb.org/developers/devclass_docs/]].
++
++[3] CDC Ethernet Control Model.
++
++[4] [[http://msdn.microsoft.com/en-us/library/ff537109(v=VS.85).aspx]]
++
++[5] [[http://msdn.microsoft.com/en-us/library/ff539234(v=VS.85).aspx]]
++
++[6] To put it in some other nice words, Windows failed to respond to
++any user input.
++
++[7] You may find [[http://www.cygnal.org/ubb/Forum9/HTML/001050.html]]
++useful.
++
++[8] http://www.nirsoft.net/utils/usb_devices_view.html
++
++[9] [[http://msdn.microsoft.com/en-us/library/ff570620.aspx]]
+--- a/Documentation/usb/linux-cdc-acm.inf
++++ b/Documentation/usb/linux-cdc-acm.inf
+@@ -90,10 +90,10 @@ ServiceBinary=%12%\USBSER.sys
+ [SourceDisksFiles]
+ [SourceDisksNames]
+ [DeviceList]
+-%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7
++%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_0525&PID_A4AB&MI_02
+
+ [DeviceList.NTamd64]
+-%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7
++%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_0525&PID_A4AB&MI_02
+
+
+ ;------------------------------------------------------------------------------
+--- a/Documentation/usb/linux.inf
++++ b/Documentation/usb/linux.inf
+@@ -18,15 +18,15 @@ DriverVer = 06/21/2006,6.0.600
+
+ ; Decoration for x86 architecture
+ [LinuxDevices.NTx86]
+-%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
++%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_0525&PID_a4ab&MI_00
+
+ ; Decoration for x64 architecture
+ [LinuxDevices.NTamd64]
+-%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
++%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_0525&PID_a4ab&MI_00
+
+ ; Decoration for ia64 architecture
+ [LinuxDevices.NTia64]
+-%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2
++%LinuxDevice% = RNDIS.NT.5.1, USB\VID_0525&PID_a4a2, USB\VID_0525&PID_a4ab&MI_00
+
+ ;@@@ This is the common setting for setup
+ [ControlFlags]
diff --git a/usb/usb-gadget-g_multi-code-clean-up-and-refactoring.patch b/usb/usb-gadget-g_multi-code-clean-up-and-refactoring.patch
new file mode 100644
index 00000000000000..8fcb0379791781
--- /dev/null
+++ b/usb/usb-gadget-g_multi-code-clean-up-and-refactoring.patch
@@ -0,0 +1,450 @@
+From m.nazarewicz@samsung.com Mon Jun 21 14:42:03 2010
+From: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Date: Mon, 21 Jun 2010 13:57:03 +0200
+Subject: USB: gadget: g_multi: code clean up and refactoring
+Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org
+Message-ID: <caa6546b6691e75a7248415a4d50d681e4f8705d.1277119876.git.m.nazarewicz@samsung.com>
+
+
+The Multifunction Composite Gadget have been cleaned up
+and refactored so hopefully it looks prettier and works
+at least as good as before changes.
+
+A Kconfig has also been fixed to make it impossible to build
+FunctionFS gadget with no configurations. With this patch, if
+RNDIS is not chosen by the user CDC is force-selected.
+
+Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/Kconfig | 1
+ drivers/usb/gadget/multi.c | 262 +++++++++++++++++++++++++--------------------
+ 2 files changed, 147 insertions(+), 116 deletions(-)
+
+--- a/drivers/usb/gadget/Kconfig
++++ b/drivers/usb/gadget/Kconfig
+@@ -863,6 +863,7 @@ config USB_G_NOKIA
+ config USB_G_MULTI
+ tristate "Multifunction Composite Gadget (EXPERIMENTAL)"
+ depends on BLOCK && NET
++ select USB_G_MULTI_CDC if !USB_G_MULTI_RNDIS
+ help
+ The Multifunction Composite Gadget provides Ethernet (RNDIS
+ and/or CDC Ethernet), mass storage and ACM serial link
+--- a/drivers/usb/gadget/multi.c
++++ b/drivers/usb/gadget/multi.c
+@@ -24,6 +24,7 @@
+
+ #include <linux/kernel.h>
+ #include <linux/utsname.h>
++#include <linux/module.h>
+
+
+ #if defined USB_ETH_RNDIS
+@@ -35,14 +36,13 @@
+
+
+ #define DRIVER_DESC "Multifunction Composite Gadget"
+-#define DRIVER_VERSION "2009/07/21"
+
+-/*-------------------------------------------------------------------------*/
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_AUTHOR("Michal Nazarewicz");
++MODULE_LICENSE("GPL");
+
+-#define MULTI_VENDOR_NUM 0x0525 /* XXX NetChip */
+-#define MULTI_PRODUCT_NUM 0xa4ab /* XXX */
+
+-/*-------------------------------------------------------------------------*/
++/***************************** All the files... *****************************/
+
+ /*
+ * kbuild is not very cooperative with respect to linking separately
+@@ -57,6 +57,8 @@
+ #include "config.c"
+ #include "epautoconf.c"
+
++#include "f_mass_storage.c"
++
+ #include "u_serial.c"
+ #include "f_acm.c"
+
+@@ -68,13 +70,24 @@
+ #endif
+ #include "u_ether.c"
+
+-#undef DBG /* u_ether.c has broken idea about macros */
+-#undef VDBG /* so clean up after it */
+-#undef ERROR
+-#undef INFO
+-#include "f_mass_storage.c"
+
+-/*-------------------------------------------------------------------------*/
++
++/***************************** Device Descriptor ****************************/
++
++#define MULTI_VENDOR_NUM 0x0525 /* XXX NetChip */
++#define MULTI_PRODUCT_NUM 0xa4ab /* XXX */
++
++
++enum {
++ __MULTI_NO_CONFIG,
++#ifdef CONFIG_USB_G_MULTI_RNDIS
++ MULTI_RNDIS_CONFIG_NUM,
++#endif
++#ifdef CONFIG_USB_G_MULTI_CDC
++ MULTI_CDC_CONFIG_NUM,
++#endif
++};
++
+
+ static struct usb_device_descriptor device_desc = {
+ .bLength = sizeof device_desc,
+@@ -82,80 +95,82 @@ static struct usb_device_descriptor devi
+
+ .bcdUSB = cpu_to_le16(0x0200),
+
+- /* .bDeviceClass = USB_CLASS_COMM, */
+- /* .bDeviceSubClass = 0, */
+- /* .bDeviceProtocol = 0, */
+- .bDeviceClass = 0xEF,
++ .bDeviceClass = USB_CLASS_MISC /* 0xEF */,
+ .bDeviceSubClass = 2,
+ .bDeviceProtocol = 1,
+- /* .bMaxPacketSize0 = f(hardware) */
+
+ /* Vendor and product id can be overridden by module parameters. */
+ .idVendor = cpu_to_le16(MULTI_VENDOR_NUM),
+ .idProduct = cpu_to_le16(MULTI_PRODUCT_NUM),
+- /* .bcdDevice = f(hardware) */
+- /* .iManufacturer = DYNAMIC */
+- /* .iProduct = DYNAMIC */
+- /* NO SERIAL NUMBER */
+- .bNumConfigurations = 1,
+ };
+
+-static struct usb_otg_descriptor otg_descriptor = {
+- .bLength = sizeof otg_descriptor,
+- .bDescriptorType = USB_DT_OTG,
+-
+- /* REVISIT SRP-only hardware is possible, although
+- * it would not be called "OTG" ...
+- */
+- .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
+-};
+
+ static const struct usb_descriptor_header *otg_desc[] = {
+- (struct usb_descriptor_header *) &otg_descriptor,
++ (struct usb_descriptor_header *) &(struct usb_otg_descriptor){
++ .bLength = sizeof(struct usb_otg_descriptor),
++ .bDescriptorType = USB_DT_OTG,
++
++ /*
++ * REVISIT SRP-only hardware is possible, although
++ * it would not be called "OTG" ...
++ */
++ .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
++ },
+ NULL,
+ };
+
+
+-/* string IDs are assigned dynamically */
+-
+-#define STRING_MANUFACTURER_IDX 0
+-#define STRING_PRODUCT_IDX 1
++enum {
++ MULTI_STRING_MANUFACTURER_IDX,
++ MULTI_STRING_PRODUCT_IDX,
++#ifdef CONFIG_USB_G_MULTI_RNDIS
++ MULTI_STRING_RNDIS_CONFIG_IDX,
++#endif
++#ifdef CONFIG_USB_G_MULTI_CDC
++ MULTI_STRING_CDC_CONFIG_IDX,
++#endif
++};
+
+ static char manufacturer[50];
+
+ static struct usb_string strings_dev[] = {
+- [STRING_MANUFACTURER_IDX].s = manufacturer,
+- [STRING_PRODUCT_IDX].s = DRIVER_DESC,
++ [MULTI_STRING_MANUFACTURER_IDX].s = manufacturer,
++ [MULTI_STRING_PRODUCT_IDX].s = DRIVER_DESC,
++#ifdef CONFIG_USB_G_MULTI_RNDIS
++ [MULTI_STRING_RNDIS_CONFIG_IDX].s = "Multifunction with RNDIS",
++#endif
++#ifdef CONFIG_USB_G_MULTI_CDC
++ [MULTI_STRING_CDC_CONFIG_IDX].s = "Multifunction with CDC ECM",
++#endif
+ { } /* end of list */
+ };
+
+-static struct usb_gadget_strings stringtab_dev = {
+- .language = 0x0409, /* en-us */
+- .strings = strings_dev,
+-};
+-
+ static struct usb_gadget_strings *dev_strings[] = {
+- &stringtab_dev,
++ &(struct usb_gadget_strings){
++ .language = 0x0409, /* en-us */
++ .strings = strings_dev,
++ },
+ NULL,
+ };
+
+-static u8 hostaddr[ETH_ALEN];
+
+
+
+ /****************************** Configurations ******************************/
+
+-static struct fsg_module_parameters mod_data = {
+- .stall = 1
+-};
+-FSG_MODULE_PARAMETERS(/* no prefix */, mod_data);
++static struct fsg_module_parameters fsg_mod_data = { .stall = 1 };
++FSG_MODULE_PARAMETERS(/* no prefix */, fsg_mod_data);
++
++static struct fsg_common fsg_common;
+
+-static struct fsg_common *fsg_common;
++static u8 hostaddr[ETH_ALEN];
+
+
++/********** RNDIS **********/
++
+ #ifdef USB_ETH_RNDIS
+
+-static int __init rndis_do_config(struct usb_configuration *c)
++static __ref int rndis_do_config(struct usb_configuration *c)
+ {
+ int ret;
+
+@@ -172,26 +187,42 @@ static int __init rndis_do_config(struct
+ if (ret < 0)
+ return ret;
+
+- ret = fsg_bind_config(c->cdev, c, fsg_common);
++ ret = fsg_bind_config(c->cdev, c, &fsg_common);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+ }
+
+-static struct usb_configuration rndis_config_driver = {
+- .label = "Multifunction Composite (RNDIS + MS + ACM)",
+- .bind = rndis_do_config,
+- .bConfigurationValue = 2,
+- /* .iConfiguration = DYNAMIC */
+- .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
+-};
++static int rndis_config_register(struct usb_composite_dev *cdev)
++{
++ static struct usb_configuration config = {
++ .bind = rndis_do_config,
++ .bConfigurationValue = MULTI_RNDIS_CONFIG_NUM,
++ .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
++ };
++
++ config.label = strings_dev[MULTI_STRING_RNDIS_CONFIG_IDX].s;
++ config.iConfiguration = strings_dev[MULTI_STRING_RNDIS_CONFIG_IDX].id;
++
++ return usb_add_config(cdev, &config);
++}
++
++#else
++
++static int rndis_config_register(struct usb_composite_dev *cdev)
++{
++ return 0;
++}
+
+ #endif
+
++
++/********** CDC ECM **********/
++
+ #ifdef CONFIG_USB_G_MULTI_CDC
+
+-static int __init cdc_do_config(struct usb_configuration *c)
++static __ref int cdc_do_config(struct usb_configuration *c)
+ {
+ int ret;
+
+@@ -208,20 +239,33 @@ static int __init cdc_do_config(struct u
+ if (ret < 0)
+ return ret;
+
+- ret = fsg_bind_config(c->cdev, c, fsg_common);
++ ret = fsg_bind_config(c->cdev, c, &fsg_common);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+ }
+
+-static struct usb_configuration cdc_config_driver = {
+- .label = "Multifunction Composite (CDC + MS + ACM)",
+- .bind = cdc_do_config,
+- .bConfigurationValue = 1,
+- /* .iConfiguration = DYNAMIC */
+- .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
+-};
++static int cdc_config_register(struct usb_composite_dev *cdev)
++{
++ static struct usb_configuration config = {
++ .bind = cdc_do_config,
++ .bConfigurationValue = MULTI_CDC_CONFIG_NUM,
++ .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
++ };
++
++ config.label = strings_dev[MULTI_STRING_CDC_CONFIG_IDX].s;
++ config.iConfiguration = strings_dev[MULTI_STRING_CDC_CONFIG_IDX].id;
++
++ return usb_add_config(cdev, &config);
++}
++
++#else
++
++static int cdc_config_register(struct usb_composite_dev *cdev)
++{
++ return 0;
++}
+
+ #endif
+
+@@ -230,7 +274,7 @@ static struct usb_configuration cdc_conf
+ /****************************** Gadget Bind ******************************/
+
+
+-static int __init multi_bind(struct usb_composite_dev *cdev)
++static int __ref multi_bind(struct usb_composite_dev *cdev)
+ {
+ struct usb_gadget *gadget = cdev->gadget;
+ int status, gcnum;
+@@ -252,67 +296,56 @@ static int __init multi_bind(struct usb_
+ goto fail0;
+
+ /* set up mass storage function */
+- fsg_common = fsg_common_from_params(0, cdev, &mod_data);
+- if (IS_ERR(fsg_common)) {
+- status = PTR_ERR(fsg_common);
+- goto fail1;
++ {
++ void *retp;
++ retp = fsg_common_from_params(&fsg_common, cdev, &fsg_mod_data);
++ if (IS_ERR(retp)) {
++ status = PTR_ERR(retp);
++ goto fail1;
++ }
+ }
+
+-
++ /* set bcdDevice */
+ gcnum = usb_gadget_controller_number(gadget);
+- if (gcnum >= 0)
++ if (gcnum >= 0) {
+ device_desc.bcdDevice = cpu_to_le16(0x0300 | gcnum);
+- else {
+- /* We assume that can_support_ecm() tells the truth;
+- * but if the controller isn't recognized at all then
+- * that assumption is a bit more likely to be wrong.
+- */
+- WARNING(cdev, "controller '%s' not recognized\n",
+- gadget->name);
++ } else {
++ WARNING(cdev, "controller '%s' not recognized\n", gadget->name);
+ device_desc.bcdDevice = cpu_to_le16(0x0300 | 0x0099);
+ }
+
+-
+- /* Allocate string descriptor numbers ... note that string
+- * contents can be overridden by the composite_dev glue.
+- */
+-
+- /* device descriptor strings: manufacturer, product */
++ /* allocate string descriptor numbers */
+ snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
+ init_utsname()->sysname, init_utsname()->release,
+ gadget->name);
+- status = usb_string_id(cdev);
+- if (status < 0)
+- goto fail2;
+- strings_dev[STRING_MANUFACTURER_IDX].id = status;
+- device_desc.iManufacturer = status;
+
+- status = usb_string_id(cdev);
+- if (status < 0)
++ status = usb_string_ids_tab(cdev, strings_dev);
++ if (unlikely(status < 0))
+ goto fail2;
+- strings_dev[STRING_PRODUCT_IDX].id = status;
+- device_desc.iProduct = status;
+
+-#ifdef USB_ETH_RNDIS
+- /* register our first configuration */
+- status = usb_add_config(cdev, &rndis_config_driver);
+- if (status < 0)
++ device_desc.iManufacturer =
++ strings_dev[MULTI_STRING_MANUFACTURER_IDX].id;
++ device_desc.iProduct =
++ strings_dev[MULTI_STRING_PRODUCT_IDX].id;
++
++ /* register configurations */
++ status = rndis_config_register(cdev);
++ if (unlikely(status < 0))
+ goto fail2;
+-#endif
+
+-#ifdef CONFIG_USB_G_MULTI_CDC
+- /* register our second configuration */
+- status = usb_add_config(cdev, &cdc_config_driver);
+- if (status < 0)
++ status = cdc_config_register(cdev);
++ if (unlikely(status < 0))
+ goto fail2;
+-#endif
+
+- dev_info(&gadget->dev, DRIVER_DESC ", version: " DRIVER_VERSION "\n");
+- fsg_common_put(fsg_common);
++ /* we're done */
++ dev_info(&gadget->dev, DRIVER_DESC "\n");
++ fsg_common_put(&fsg_common);
+ return 0;
+
++
++ /* error recovery */
+ fail2:
+- fsg_common_put(fsg_common);
++ fsg_common_put(&fsg_common);
+ fail1:
+ gserial_cleanup();
+ fail0:
+@@ -339,18 +372,15 @@ static struct usb_composite_driver multi
+ .unbind = __exit_p(multi_unbind),
+ };
+
+-MODULE_DESCRIPTION(DRIVER_DESC);
+-MODULE_AUTHOR("Michal Nazarewicz");
+-MODULE_LICENSE("GPL");
+
+-static int __init g_multi_init(void)
++static int __init multi_init(void)
+ {
+ return usb_composite_register(&multi_driver);
+ }
+-module_init(g_multi_init);
++module_init(multi_init);
+
+-static void __exit g_multi_cleanup(void)
++static void __exit multi_exit(void)
+ {
+ usb_composite_unregister(&multi_driver);
+ }
+-module_exit(g_multi_cleanup);
++module_exit(multi_exit);
diff --git a/usb/usb-gadget-g_serial-inf-file-updated.patch b/usb/usb-gadget-g_serial-inf-file-updated.patch
new file mode 100644
index 00000000000000..24509c635998e7
--- /dev/null
+++ b/usb/usb-gadget-g_serial-inf-file-updated.patch
@@ -0,0 +1,238 @@
+From m.nazarewicz@samsung.com Mon Jun 21 14:42:37 2010
+From: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Date: Mon, 21 Jun 2010 13:57:06 +0200
+Subject: USB: gadget: g_serial: INF file updated
+To: linux-usb@vger.kernel.org
+Cc: David Brownell <dbrownell@users.sourceforge.net>, Greg KH <greg@kroah.com>, Kyungmin Park <kyungmin.park@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, linux-kernel@vger.kernel.org
+Message-ID: <57cb6dca50e173774cdc0135c6a921fc006adc9e.1277119876.git.m.nazarewicz@samsung.com>
+
+
+Updated the INF file for g_serial gadget. It should work with
+most recent Windows systems now.
+
+Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ Documentation/usb/gadget_serial.txt | 87 +++--------------------------
+ Documentation/usb/linux-cdc-acm.inf | 107 ++++++++++++++++++++++++++++++++++++
+ 2 files changed, 117 insertions(+), 77 deletions(-)
+
+--- a/Documentation/usb/gadget_serial.txt
++++ b/Documentation/usb/gadget_serial.txt
+@@ -151,88 +151,23 @@ instructions below to install the host s
+
+ Installing the Windows Host ACM Driver
+ --------------------------------------
+-To use the Windows ACM driver you must have the files "gserial.inf"
+-and "usbser.sys" together in a folder on the Windows machine.
+-
+-The "gserial.inf" file is given here.
+-
+--------------------- CUT HERE --------------------
+-[Version]
+-Signature="$Windows NT$"
+-Class=Ports
+-ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
+-Provider=%LINUX%
+-DriverVer=08/17/2004,0.0.2.0
+-; Copyright (C) 2004 Al Borchers (alborchers@steinerpoint.com)
+-
+-[Manufacturer]
+-%LINUX%=GSerialDeviceList
+-
+-[GSerialDeviceList]
+-%GSERIAL%=GSerialInstall, USB\VID_0525&PID_A4A7
+-
+-[DestinationDirs]
+-DefaultDestDir=10,System32\Drivers
+-
+-[GSerialInstall]
+-CopyFiles=GSerialCopyFiles
+-AddReg=GSerialAddReg
+-
+-[GSerialCopyFiles]
+-usbser.sys
+-
+-[GSerialAddReg]
+-HKR,,DevLoader,,*ntkern
+-HKR,,NTMPDriver,,usbser.sys
+-HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
+-
+-[GSerialInstall.Services]
+-AddService = usbser,0x0002,GSerialService
+-
+-[GSerialService]
+-DisplayName = %GSERIAL_DISPLAY_NAME%
+-ServiceType = 1 ; SERVICE_KERNEL_DRIVER
+-StartType = 3 ; SERVICE_DEMAND_START
+-ErrorControl = 1 ; SERVICE_ERROR_NORMAL
+-ServiceBinary = %10%\System32\Drivers\usbser.sys
+-LoadOrderGroup = Base
+-
+-[Strings]
+-LINUX = "Linux"
+-GSERIAL = "Gadget Serial"
+-GSERIAL_DISPLAY_NAME = "USB Gadget Serial Driver"
+--------------------- CUT HERE --------------------
+-
+-The "usbser.sys" file comes with various versions of Windows.
+-For example, it can be found on Windows XP typically in
+-
+- C:\WINDOWS\Driver Cache\i386\driver.cab
+-
+-Or it can be found on the Windows 98SE CD in the "win98" folder
+-in the "DRIVER11.CAB" through "DRIVER20.CAB" cab files. You will
+-need the DOS "expand" program, the Cygwin "cabextract" program, or
+-a similar program to unpack these cab files and extract "usbser.sys".
+-
+-For example, to extract "usbser.sys" into the current directory
+-on Windows XP, open a DOS window and run a command like
+-
+- expand C:\WINDOWS\Driver~1\i386\driver.cab -F:usbser.sys .
+-
+-(Thanks to Nishant Kamat for pointing out this DOS command.)
++To use the Windows ACM driver you must have the "linux-cdc-acm.inf"
++file (provided along this document) which supports all recent versions
++of Windows.
+
+ When the gadget serial driver is loaded and the USB device connected
+ to the Windows host with a USB cable, Windows should recognize the
+ gadget serial device and ask for a driver. Tell Windows to find the
+-driver in the folder that contains "gserial.inf" and "usbser.sys".
++driver in the folder that contains the "linux-cdc-acm.inf" file.
+
+ For example, on Windows XP, when the gadget serial device is first
+ plugged in, the "Found New Hardware Wizard" starts up. Select
+-"Install from a list or specific location (Advanced)", then on
+-the next screen select "Include this location in the search" and
+-enter the path or browse to the folder containing "gserial.inf" and
+-"usbser.sys". Windows will complain that the Gadget Serial driver
+-has not passed Windows Logo testing, but select "Continue anyway"
+-and finish the driver installation.
++"Install from a list or specific location (Advanced)", then on the
++next screen select "Include this location in the search" and enter the
++path or browse to the folder containing the "linux-cdc-acm.inf" file.
++Windows will complain that the Gadget Serial driver has not passed
++Windows Logo testing, but select "Continue anyway" and finish the
++driver installation.
+
+ On Windows XP, in the "Device Manager" (under "Control Panel",
+ "System", "Hardware") expand the "Ports (COM & LPT)" entry and you
+@@ -345,5 +280,3 @@ you should be able to send data back and
+ side and host side systems. Anything you type on the terminal
+ window on the gadget side should appear in the terminal window on
+ the host side and vice versa.
+-
+-
+--- /dev/null
++++ b/Documentation/usb/linux-cdc-acm.inf
+@@ -0,0 +1,107 @@
++; Windows USB CDC ACM Setup File
++
++; Based on INF template which was:
++; Copyright (c) 2000 Microsoft Corporation
++; Copyright (c) 2007 Microchip Technology Inc.
++; likely to be covered by the MLPL as found at:
++; <http://msdn.microsoft.com/en-us/cc300389.aspx#MLPL>.
++; For use only on Windows operating systems.
++
++[Version]
++Signature="$Windows NT$"
++Class=Ports
++ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
++Provider=%Linux%
++DriverVer=11/15/2007,5.1.2600.0
++
++[Manufacturer]
++%Linux%=DeviceList, NTamd64
++
++[DestinationDirs]
++DefaultDestDir=12
++
++
++;------------------------------------------------------------------------------
++; Windows 2000/XP/Vista-32bit Sections
++;------------------------------------------------------------------------------
++
++[DriverInstall.nt]
++include=mdmcpq.inf
++CopyFiles=DriverCopyFiles.nt
++AddReg=DriverInstall.nt.AddReg
++
++[DriverCopyFiles.nt]
++usbser.sys,,,0x20
++
++[DriverInstall.nt.AddReg]
++HKR,,DevLoader,,*ntkern
++HKR,,NTMPDriver,,USBSER.sys
++HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
++
++[DriverInstall.nt.Services]
++AddService=usbser, 0x00000002, DriverService.nt
++
++[DriverService.nt]
++DisplayName=%SERVICE%
++ServiceType=1
++StartType=3
++ErrorControl=1
++ServiceBinary=%12%\USBSER.sys
++
++;------------------------------------------------------------------------------
++; Vista-64bit Sections
++;------------------------------------------------------------------------------
++
++[DriverInstall.NTamd64]
++include=mdmcpq.inf
++CopyFiles=DriverCopyFiles.NTamd64
++AddReg=DriverInstall.NTamd64.AddReg
++
++[DriverCopyFiles.NTamd64]
++USBSER.sys,,,0x20
++
++[DriverInstall.NTamd64.AddReg]
++HKR,,DevLoader,,*ntkern
++HKR,,NTMPDriver,,USBSER.sys
++HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
++
++[DriverInstall.NTamd64.Services]
++AddService=usbser, 0x00000002, DriverService.NTamd64
++
++[DriverService.NTamd64]
++DisplayName=%SERVICE%
++ServiceType=1
++StartType=3
++ErrorControl=1
++ServiceBinary=%12%\USBSER.sys
++
++
++;------------------------------------------------------------------------------
++; Vendor and Product ID Definitions
++;------------------------------------------------------------------------------
++; When developing your USB device, the VID and PID used in the PC side
++; application program and the firmware on the microcontroller must match.
++; Modify the below line to use your VID and PID. Use the format as shown
++; below.
++; Note: One INF file can be used for multiple devices with different
++; VID and PIDs. For each supported device, append
++; ",USB\VID_xxxx&PID_yyyy" to the end of the line.
++;------------------------------------------------------------------------------
++[SourceDisksFiles]
++[SourceDisksNames]
++[DeviceList]
++%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7
++
++[DeviceList.NTamd64]
++%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7
++
++
++;------------------------------------------------------------------------------
++; String Definitions
++;------------------------------------------------------------------------------
++;Modify these strings to customize your device
++;------------------------------------------------------------------------------
++[Strings]
++Linux = "Linux Developer Community"
++DESCRIPTION = "Gadget Serial"
++SERVICE = "USB RS-232 Emulation Driver"