public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] USB: gadget: mass/file storage: set serial number
@ 2010-07-01  9:17 Michal Nazarewicz
  2010-07-01  9:17 ` [PATCH 2/2] " Michal Nazarewicz
                   ` (2 more replies)
  0 siblings, 3 replies; 51+ messages in thread
From: Michal Nazarewicz @ 2010-07-01  9:17 UTC (permalink / raw)
  To: linux-usb
  Cc: Alan Stern, Greg KH, Kyungmin Park, Marek Szyprowski,
	linux-kernel, Dries Van Puymbroeck, stable

This commit adds iSerialNumber to all gadgets that use the Mass
Storage Function.  It appears that Windows has problems when
it is not set.

Not to copy the same code all over again, a fsg_string_serial_fill()
macro has been added to the storage_common.c file which is now also
used in the File Storage Gadget.

Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Reported-by: Dries Van Puymbroeck <Dries.VanPuymbroeck@dekimo.com>
Tested-by: Dries Van Puymbroeck <Dries.VanPuymbroeck@dekimo.com>
Cc: stable <stable@kernel.org>
---
Dries Van Puymbroeck reported problems with Windows when serial was
not set.  This patch fikes this.  As a bug fix, it should get into
the stable.

This particular patch does not apply to the .33.5 nor .34 kernels so
I've also prepered another patch for those versions.

 drivers/usb/gadget/file_storage.c   |   10 +------
 drivers/usb/gadget/mass_storage.c   |   47 +++++++++++++++-------------------
 drivers/usb/gadget/multi.c          |    9 ++++++
 drivers/usb/gadget/storage_common.c |   12 +++++++++
 4 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index 7993267..16decb8 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -3447,15 +3447,7 @@ static int __ref fsg_bind(struct usb_gadget *gadget)
 			init_utsname()->sysname, init_utsname()->release,
 			gadget->name);
 
-	/* On a real device, serial[] would be loaded from permanent
-	 * storage.  We just encode it from the driver version string. */
-	for (i = 0; i < sizeof fsg_string_serial - 2; i += 2) {
-		unsigned char		c = DRIVER_VERSION[i / 2];
-
-		if (!c)
-			break;
-		sprintf(&fsg_string_serial[i], "%02X", c);
-	}
+	fsg_string_serial_fill(fsg_string_serial, DRIVER_VERSION);
 
 	fsg->thread_task = kthread_create(fsg_main_thread, fsg,
 			"file-storage-gadget");
diff --git a/drivers/usb/gadget/mass_storage.c b/drivers/usb/gadget/mass_storage.c
index 585f255..584d2ed 100644
--- a/drivers/usb/gadget/mass_storage.c
+++ b/drivers/usb/gadget/mass_storage.c
@@ -45,7 +45,7 @@
 /*-------------------------------------------------------------------------*/
 
 #define DRIVER_DESC		"Mass Storage Gadget"
-#define DRIVER_VERSION		"2009/09/11"
+#define DRIVER_VERSION		"2010/07/01"
 
 /*-------------------------------------------------------------------------*/
 
@@ -72,21 +72,16 @@ static struct usb_device_descriptor msg_device_desc = {
 	.bcdUSB =		cpu_to_le16(0x0200),
 	.bDeviceClass =		USB_CLASS_PER_INTERFACE,
 
-	/* Vendor and product id can be overridden by module parameters.  */
 	.idVendor =		cpu_to_le16(FSG_VENDOR_ID),
 	.idProduct =		cpu_to_le16(FSG_PRODUCT_ID),
-	/* .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
+	/*
+	 * REVISIT SRP-only hardware is possible, although
 	 * it would not be called "OTG" ...
 	 */
 	.bmAttributes =		USB_OTG_SRP | USB_OTG_HNP,
@@ -100,16 +95,21 @@ static const struct usb_descriptor_header *otg_desc[] = {
 
 /* string IDs are assigned dynamically */
 
-#define STRING_MANUFACTURER_IDX		0
-#define STRING_PRODUCT_IDX		1
-#define STRING_CONFIGURATION_IDX	2
+enum {
+	STRING_MANUFACTURER_IDX,
+	STRING_PRODUCT_IDX,
+	STRING_CONFIGURATION_IDX,
+	STRING_SERIAL_IDX
+};
 
 static char manufacturer[50];
+static char serial[13];
 
 static struct usb_string strings_dev[] = {
 	[STRING_MANUFACTURER_IDX].s = manufacturer,
 	[STRING_PRODUCT_IDX].s = DRIVER_DESC,
 	[STRING_CONFIGURATION_IDX].s = "Self Powered",
+	[STRING_SERIAL_IDX].s = serial,
 	{  } /* end of list */
 };
 
@@ -173,7 +173,6 @@ static struct usb_configuration msg_config_driver = {
 	.label			= "Linux File-Backed Storage",
 	.bind			= msg_do_config,
 	.bConfigurationValue	= 1,
-	/* .iConfiguration = DYNAMIC */
 	.bmAttributes		= USB_CONFIG_ATT_SELFPOWER,
 };
 
@@ -187,25 +186,21 @@ static int __ref msg_bind(struct usb_composite_dev *cdev)
 	struct usb_gadget *gadget = cdev->gadget;
 	int status;
 
-	/* Allocate string descriptor numbers ... note that string
-	 * contents can be overridden by the composite_dev glue.
-	 */
-
-	/* device descriptor strings: manufacturer, product */
+	/* Take care of strings */
 	snprintf(manufacturer, sizeof manufacturer, "%s %s with %s",
 	         init_utsname()->sysname, init_utsname()->release,
 	         gadget->name);
-	status = usb_string_id(cdev);
-	if (status < 0)
-		return status;
-	strings_dev[STRING_MANUFACTURER_IDX].id = status;
-	msg_device_desc.iManufacturer = status;
 
-	status = usb_string_id(cdev);
+	fsg_string_serial_fill(serial, DRIVER_VERSION);
+
+	status = usb_string_ids_tab(cdev, strings_dev);
 	if (status < 0)
 		return status;
-	strings_dev[STRING_PRODUCT_IDX].id = status;
-	msg_device_desc.iProduct = status;
+
+	msg_device_desc.iManufacturer =
+		strings_dev[STRING_MANUFACTURER_IDX].id;
+	msg_device_desc.iProduct = strings_dev[STRING_PRODUCT_IDX].id;
+	msg_device_desc.iSerialNumber = strings_dev[STRING_SERIAL_IDX].id;
 
 	status = usb_string_id(cdev);
 	if (status < 0)
@@ -213,7 +208,7 @@ static int __ref msg_bind(struct usb_composite_dev *cdev)
 	strings_dev[STRING_CONFIGURATION_IDX].id = status;
 	msg_config_driver.iConfiguration = status;
 
-	/* register our second configuration */
+	/* Register our second configuration */
 	status = usb_add_config(cdev, &msg_config_driver);
 	if (status < 0)
 		return status;
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
index 795d762..c8e83ff 100644
--- a/drivers/usb/gadget/multi.c
+++ b/drivers/usb/gadget/multi.c
@@ -36,6 +36,7 @@
 
 
 #define DRIVER_DESC		"Multifunction Composite Gadget"
+#define DRIVER_VERSION		"2010/07/01"
 
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_AUTHOR("Michal Nazarewicz");
@@ -123,6 +124,7 @@ static const struct usb_descriptor_header *otg_desc[] = {
 enum {
 	MULTI_STRING_MANUFACTURER_IDX,
 	MULTI_STRING_PRODUCT_IDX,
+	MULTI_STRING_SERIAL_IDX,
 #ifdef CONFIG_USB_G_MULTI_RNDIS
 	MULTI_STRING_RNDIS_CONFIG_IDX,
 #endif
@@ -132,10 +134,13 @@ enum {
 };
 
 static char manufacturer[50];
+static char serial[13];
+
 
 static struct usb_string strings_dev[] = {
 	[MULTI_STRING_MANUFACTURER_IDX].s = manufacturer,
 	[MULTI_STRING_PRODUCT_IDX].s      = DRIVER_DESC,
+	[MULTI_STRING_SERIAL_IDX].s       = serial,
 #ifdef CONFIG_USB_G_MULTI_RNDIS
 	[MULTI_STRING_RNDIS_CONFIG_IDX].s = "Multifunction with RNDIS",
 #endif
@@ -319,6 +324,8 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
 	         init_utsname()->sysname, init_utsname()->release,
 	         gadget->name);
 
+	fsg_string_serial_fill(serial, DRIVER_VERSION);
+
 	status = usb_string_ids_tab(cdev, strings_dev);
 	if (unlikely(status < 0))
 		goto fail2;
@@ -327,6 +334,8 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
 		strings_dev[MULTI_STRING_MANUFACTURER_IDX].id;
 	device_desc.iProduct      =
 		strings_dev[MULTI_STRING_PRODUCT_IDX].id;
+	device_desc.iSerialNumber =
+		strings_dev[MULTI_STRING_SERIAL_IDX].id;
 
 	/* register configurations */
 	status = rndis_config_register(cdev);
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 557b119..a808879 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -559,6 +559,18 @@ static struct usb_gadget_strings	fsg_stringtab = {
 };
 
 
+#define fsg_string_serial_fill_n(serial, n, version) do {	\
+		unsigned char *c = version;			\
+		unsigned i = ((n) + 1) / 2;			\
+		char *s = serial;				\
+		for (; *c && --i; s += 2, ++c)			\
+			sprintf(s, "%02X", *c);			\
+	} while (0)
+
+#define fsg_string_serial_fill(serial, version)				\
+	fsg_string_serial_fill_n(serial, ARRAY_SIZE(serial), version)
+
+
  /*-------------------------------------------------------------------------*/
 
 /*
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 51+ messages in thread

end of thread, other threads:[~2010-07-27  6:53 UTC | newest]

Thread overview: 51+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-01  9:17 [PATCH 1/2] USB: gadget: mass/file storage: set serial number Michal Nazarewicz
2010-07-01  9:17 ` [PATCH 2/2] " Michal Nazarewicz
2010-07-01 10:27 ` [PATCH 1/2] " Michał Nazarewicz
2010-07-01 13:42 ` [PATCHv2 " Michal Nazarewicz
2010-07-01 13:42   ` [PATCHv2 2/2] USB: gadget: g_multi: code clean up and refactoring Michal Nazarewicz
2010-07-08 18:34   ` [PATCHv2 1/2] USB: gadget: mass/file storage: set serial number Greg KH
2010-07-08 18:58     ` Michał Nazarewicz
2010-07-08 19:03       ` Greg KH
2010-07-08 19:31       ` David Brownell
2010-07-08 20:02         ` Michał Nazarewicz
2010-07-08 20:20           ` David Brownell
2010-07-08 20:27             ` Michał Nazarewicz
2010-07-08 20:52     ` [PATCHv3 1/3] " Michal Nazarewicz
2010-07-08 20:52       ` [PATCHv3 2/3] USB: Add a serial number parameter to g_file_storage module Michal Nazarewicz
2010-07-08 20:52         ` [PATCHv3 3/3] USB: gadget: g_multi: code clean up and refactoring Michal Nazarewicz
2010-07-09 19:04       ` [PATCHv3 1/3] USB: gadget: mass/file storage: set serial number Greg KH
2010-07-17 23:01         ` Michał Nazarewicz
2010-07-17 23:57           ` David Brownell
2010-07-19  8:58             ` Michał Nazarewicz
2010-07-19 10:08               ` David Brownell
2010-07-19 12:07                 ` Michał Nazarewicz
2010-07-19 14:19                   ` Alan Stern
2010-07-19 15:02                     ` Michał Nazarewicz
2010-07-19 16:14                       ` Alan Stern
2010-07-19 16:26                         ` Michał Nazarewicz
2010-07-19 17:06                           ` Alan Stern
2010-07-19 17:21                             ` Michał Nazarewicz
2010-07-19 17:41                               ` David Brownell
2010-07-20  8:41                                 ` Michał Nazarewicz
2010-07-20 14:07                                   ` Alan Stern
2010-07-20 14:43                                     ` Michał Nazarewicz
2010-07-20 15:01                                   ` David Brownell
2010-07-20 15:45                                     ` Michał Nazarewicz
2010-07-19 18:37                               ` Alan Stern
2010-07-20  9:57                             ` Michał Nazarewicz
2010-07-20 14:08                               ` Alan Stern
2010-07-20 14:40                                 ` Michał Nazarewicz
2010-07-20 14:52                                   ` David Brownell
2010-07-20 15:02                                   ` Alan Stern
2010-07-19 14:44                   ` David Brownell
2010-07-19 15:01                     ` Michał Nazarewicz
2010-07-22 12:16       ` [PATCHv4 1/5] USB: gadget: composite: Better string override handling Michal Nazarewicz
2010-07-22 12:16         ` [PATCHv4 2/5] USB: gadget: Use new composite features in some gadgets Michal Nazarewicz
2010-07-22 12:16           ` [PATCHv4 3/5] USB: gadget: g_multi: code clean up and refactoring Michal Nazarewicz
2010-07-22 12:16             ` [PATCHv4 4/5] USB: gadget: g_fs: code cleanup Michal Nazarewicz
2010-07-22 12:16               ` [PATCHv4 5/5] USB: gadget: file_storage: serial parameter even if not test mode Michal Nazarewicz
2010-07-22 14:14                 ` Alan Stern
2010-07-22 23:46         ` [PATCHv4 1/5] USB: gadget: composite: Better string override handling Greg KH
2010-07-23  9:04           ` Michał Nazarewicz
2010-07-27  6:53           ` David Brownell
2010-07-26 21:28         ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox