diff options
Diffstat (limited to 'usb')
| -rw-r--r-- | usb/usb-gadget-composite-added-disconnect-callback.patch | 45 | ||||
| -rw-r--r-- | usb/usb-gadget-f_mass_storage-added-eject-callback.patch | 235 | ||||
| -rw-r--r-- | usb/usb-gadget-g_ether-updated-inf-file.patch | 268 | ||||
| -rw-r--r-- | usb/usb-gadget-g_multi-added-documentation-and-inf-files.patch | 211 | ||||
| -rw-r--r-- | usb/usb-gadget-g_multi-code-clean-up-and-refactoring.patch | 450 | ||||
| -rw-r--r-- | usb/usb-gadget-g_serial-inf-file-updated.patch | 238 |
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" |
