aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-11-15 15:42:23 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-11-15 15:42:23 -0800
commitcae7bf988b354fd938934fdfc15fe23e72869d2c (patch)
tree60339d96d5572ec8b6ab393b2887ccdee3b29f3a /usb
parent3f775d6d6c1d91cb28793ee12e3a73810ea770a4 (diff)
downloadpatches-cae7bf988b354fd938934fdfc15fe23e72869d2c.tar.gz
new usb patches
Diffstat (limited to 'usb')
-rw-r--r--usb/usb-file-storage-gadget-add-reference-count-for-children.patch137
-rw-r--r--usb/usb-fix-race-in-kaweth-disconnect.patch64
-rw-r--r--usb/usb-makefile-change-for-libusual.patch43
-rw-r--r--usb/usb-net-new-device-id-passed-through-module-parameter.patch104
-rw-r--r--usb/usb-net-removes-redundant-return.patch293
-rw-r--r--usb/usb-pl2303-adds-new-ids..patch43
-rw-r--r--usb/usb-pl2303-updates-pl2303_update_line_status.patch31
7 files changed, 715 insertions, 0 deletions
diff --git a/usb/usb-file-storage-gadget-add-reference-count-for-children.patch b/usb/usb-file-storage-gadget-add-reference-count-for-children.patch
new file mode 100644
index 00000000000000..5eea428310ee6f
--- /dev/null
+++ b/usb/usb-file-storage-gadget-add-reference-count-for-children.patch
@@ -0,0 +1,137 @@
+From stern@rowland.harvard.edu Wed Nov 9 14:03:45 2005
+Date: Wed, 9 Nov 2005 16:59:56 -0500 (EST)
+From: Alan Stern <stern@rowland.harvard.edu>
+To: Greg KH <greg@kroah.com>
+cc: USB development list <linux-usb-devel@lists.sourceforge.net>
+Subject: USB: file-storage gadget: Add reference count for children
+Message-ID: <Pine.LNX.4.44L0.0511091651130.4431-100000@iolanthe.rowland.org>
+
+This patch (as601) adds a proper reference count to the file-storage
+gadget's main data structure, to keep track of references held by child
+devices (LUNs in this case). Before this, the driver would wait for
+each child to be released before unbinding.
+
+While there's nothing really wrong with that (you can't create a hang by
+doing "rmmod g_file_storage </sys/.../lun0/ro" since the open file will
+prevent rmmod from running), the code might as well follow the standard
+procedures. Besides, this shrinks the size of the structure by a few
+words... :-)
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/gadget/file_storage.c | 30 +++++++++++++++++-------------
+ 1 file changed, 17 insertions(+), 13 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/gadget/file_storage.c
++++ gregkh-2.6/drivers/usb/gadget/file_storage.c
+@@ -224,6 +224,7 @@
+ #include <linux/fs.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
++#include <linux/kref.h>
+ #include <linux/kthread.h>
+ #include <linux/limits.h>
+ #include <linux/list.h>
+@@ -631,6 +632,9 @@ struct fsg_dev {
+ /* filesem protects: backing files in use */
+ struct rw_semaphore filesem;
+
++ /* reference counting: wait until all LUNs are released */
++ struct kref ref;
++
+ struct usb_ep *ep0; // Handy copy of gadget->ep0
+ struct usb_request *ep0req; // For control responses
+ volatile unsigned int ep0_req_tag;
+@@ -694,7 +698,6 @@ struct fsg_dev {
+ unsigned int nluns;
+ struct lun *luns;
+ struct lun *curlun;
+- struct completion lun_released;
+ };
+
+ typedef void (*fsg_routine_t)(struct fsg_dev *);
+@@ -3642,11 +3645,19 @@ static DEVICE_ATTR(file, 0444, show_file
+
+ /*-------------------------------------------------------------------------*/
+
++static void fsg_release(struct kref *ref)
++{
++ struct fsg_dev *fsg = container_of(ref, struct fsg_dev, ref);
++
++ kfree(fsg->luns);
++ kfree(fsg);
++}
++
+ static void lun_release(struct device *dev)
+ {
+ struct fsg_dev *fsg = (struct fsg_dev *) dev_get_drvdata(dev);
+
+- complete(&fsg->lun_released);
++ kref_put(&fsg->ref, fsg_release);
+ }
+
+ static void fsg_unbind(struct usb_gadget *gadget)
+@@ -3660,14 +3671,12 @@ static void fsg_unbind(struct usb_gadget
+ clear_bit(REGISTERED, &fsg->atomic_bitflags);
+
+ /* Unregister the sysfs attribute files and the LUNs */
+- init_completion(&fsg->lun_released);
+ for (i = 0; i < fsg->nluns; ++i) {
+ curlun = &fsg->luns[i];
+ if (curlun->registered) {
+ device_remove_file(&curlun->dev, &dev_attr_ro);
+ device_remove_file(&curlun->dev, &dev_attr_file);
+ device_unregister(&curlun->dev);
+- wait_for_completion(&fsg->lun_released);
+ curlun->registered = 0;
+ }
+ }
+@@ -3846,6 +3855,7 @@ static int __init fsg_bind(struct usb_ga
+ curlun->dev.release = lun_release;
+ device_create_file(&curlun->dev, &dev_attr_ro);
+ device_create_file(&curlun->dev, &dev_attr_file);
++ kref_get(&fsg->ref);
+ }
+
+ if (file[i] && *file[i]) {
+@@ -4061,6 +4071,7 @@ static int __init fsg_alloc(void)
+ return -ENOMEM;
+ spin_lock_init(&fsg->lock);
+ init_rwsem(&fsg->filesem);
++ kref_init(&fsg->ref);
+ init_waitqueue_head(&fsg->thread_wqh);
+ init_completion(&fsg->thread_notifier);
+
+@@ -4069,13 +4080,6 @@ static int __init fsg_alloc(void)
+ }
+
+
+-static void fsg_free(struct fsg_dev *fsg)
+-{
+- kfree(fsg->luns);
+- kfree(fsg);
+-}
+-
+-
+ static int __init fsg_init(void)
+ {
+ int rc;
+@@ -4085,7 +4089,7 @@ static int __init fsg_init(void)
+ return rc;
+ fsg = the_fsg;
+ if ((rc = usb_gadget_register_driver(&fsg_driver)) != 0)
+- fsg_free(fsg);
++ kref_put(&fsg->ref, fsg_release);
+ return rc;
+ }
+ module_init(fsg_init);
+@@ -4103,6 +4107,6 @@ static void __exit fsg_cleanup(void)
+ wait_for_completion(&fsg->thread_notifier);
+
+ close_all_backing_files(fsg);
+- fsg_free(fsg);
++ kref_put(&fsg->ref, fsg_release);
+ }
+ module_exit(fsg_cleanup);
diff --git a/usb/usb-fix-race-in-kaweth-disconnect.patch b/usb/usb-fix-race-in-kaweth-disconnect.patch
new file mode 100644
index 00000000000000..14e8e6a3d2a0e1
--- /dev/null
+++ b/usb/usb-fix-race-in-kaweth-disconnect.patch
@@ -0,0 +1,64 @@
+From oliver@neukum.org Wed Nov 9 23:42:43 2005
+From: Oliver Neukum <oliver@neukum.org>
+To: Greg KH <greg@kroah.com>, Herbert Xu <herbert@gondor.apana.org.au>,
+Subject: USB: fix race in kaweth disconnect
+Date: Thu, 10 Nov 2005 08:38:39 +0100
+Content-Disposition: inline
+Message-Id: <200511100838.44635.oliver@neukum.org>
+
+From: Herbert Xu <herbert@gondor.apana.org.au>
+
+this patch from Herbert Xu fixes a race by moving termination of
+the URBs into close() exclusively. Please apply.
+
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Oliver Neukum <oliver@neukum.name>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/net/kaweth.c | 13 +------------
+ 1 file changed, 1 insertion(+), 12 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/net/kaweth.c
++++ gregkh-2.6/drivers/usb/net/kaweth.c
+@@ -219,7 +219,6 @@ struct kaweth_device
+
+ __u32 status;
+ int end;
+- int removed;
+ int suspend_lowmem_rx;
+ int suspend_lowmem_ctrl;
+ int linkstate;
+@@ -699,6 +698,7 @@ static int kaweth_close(struct net_devic
+
+ usb_kill_urb(kaweth->irq_urb);
+ usb_kill_urb(kaweth->rx_urb);
++ usb_kill_urb(kaweth->tx_urb);
+
+ flush_scheduled_work();
+
+@@ -750,13 +750,6 @@ static int kaweth_start_xmit(struct sk_b
+
+ spin_lock(&kaweth->device_lock);
+
+- if (kaweth->removed) {
+- /* our device is undergoing disconnection - we bail out */
+- spin_unlock(&kaweth->device_lock);
+- dev_kfree_skb_irq(skb);
+- return 0;
+- }
+-
+ kaweth_async_set_rx_mode(kaweth);
+ netif_stop_queue(net);
+
+@@ -1136,10 +1129,6 @@ static void kaweth_disconnect(struct usb
+ return;
+ }
+ netdev = kaweth->net;
+- kaweth->removed = 1;
+- usb_kill_urb(kaweth->irq_urb);
+- usb_kill_urb(kaweth->rx_urb);
+- usb_kill_urb(kaweth->tx_urb);
+
+ kaweth_dbg("Unregistering net device");
+ unregister_netdev(netdev);
diff --git a/usb/usb-makefile-change-for-libusual.patch b/usb/usb-makefile-change-for-libusual.patch
new file mode 100644
index 00000000000000..63a2c201fa5764
--- /dev/null
+++ b/usb/usb-makefile-change-for-libusual.patch
@@ -0,0 +1,43 @@
+From zaitcev@redhat.com Fri Nov 11 01:19:22 2005
+Date: Fri, 11 Nov 2005 01:14:36 -0800
+From: Pete Zaitcev <zaitcev@redhat.com>
+To: greg@kroah.com, Adrian Bunk <bunk@stusta.de>
+Cc: stern@rowland.harvard.edu, akpm@osdl.org, mdharm-usb@one-eyed-alien.net, zaitcev@redhat.com, <reuben-lkml@reub.net>
+Subject: USB: Makefile change for libusual
+Message-Id: <20051111011436.5804aac8.zaitcev@redhat.com>
+
+Never one to ignore a good idea, I propose to take a segment of
+Adrian's patch which addresses this particular problem:
+
+> --- linux-2.6.14-mm1-full/drivers/usb/Makefile.old 2005-11-08 01:31:00.000000000 +0100
+> +++ linux-2.6.14-mm1-full/drivers/usb/Makefile 2005-11-08 01:31:26.000000000 +0100
+> @@ -22,6 +22,7 @@
+> obj-$(CONFIG_USB_PRINTER) += class/
+>
+> obj-$(CONFIG_USB_STORAGE) += storage/
+> +obj-$(CONFIG_USB_LIBUSUAL) += storage/
+>
+> obj-$(CONFIG_USB_AIPTEK) += input/
+> obj-$(CONFIG_USB_ATI_REMOTE) += input/
+
+With a small change, this seems to work fine with the supplied .config.
+Also I have tested my usual build modes and added Reuben's configuration
+to my testing list.
+
+Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/Makefile | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- gregkh-2.6.orig/drivers/usb/Makefile
++++ gregkh-2.6/drivers/usb/Makefile
+@@ -20,6 +20,7 @@ obj-$(CONFIG_USB_ACM) += class/
+ obj-$(CONFIG_USB_PRINTER) += class/
+
+ obj-$(CONFIG_USB_STORAGE) += storage/
++obj-$(CONFIG_USB) += storage/
+
+ obj-$(CONFIG_USB_AIPTEK) += input/
+ obj-$(CONFIG_USB_ATI_REMOTE) += input/
diff --git a/usb/usb-net-new-device-id-passed-through-module-parameter.patch b/usb/usb-net-new-device-id-passed-through-module-parameter.patch
new file mode 100644
index 00000000000000..5c6dff6cac5a45
--- /dev/null
+++ b/usb/usb-net-new-device-id-passed-through-module-parameter.patch
@@ -0,0 +1,104 @@
+From petkan@nucleusys.com Tue Nov 15 07:01:55 2005
+Date: Tue, 15 Nov 2005 09:55:18 +0200 (EET)
+From: Petko Manolov <petkan@nucleusys.com>
+To: gregkh@suse.de
+Cc: "A.YOSHIYAMA" <yosshy@debian.or.jp>
+Subject: [PATCH 2/2] usb-net: new device ID passed through module parameter
+Message-ID: <Pine.LNX.4.64.0511150948440.11138@bender.nucleusys.com>
+
+From: A.YOSHIYAMA <yosshy@debian.or.jp>
+
+adds new module parameter "devid" that points to a string with format
+"device_name:vendor_id:device_id:flags". if provided at module load
+time, this string is being parsed and a new entry is created in
+usb_dev_id[] and pegasus_ids[] so the new device can later be recognized
+by the probe routine. this might be helpful for someone who don't
+know/wish to build new module/kernel, but want to use his new usb-to-eth
+device that is not yet listed in pegasus.h
+
+Signed-off-by: Petko Manolov <petkan@nucleusys.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/net/pegasus.c | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/net/pegasus.c
++++ gregkh-2.6/drivers/usb/net/pegasus.c
+@@ -59,12 +59,14 @@ static const char driver_name[] = "pegas
+
+ static int loopback = 0;
+ static int mii_mode = 0;
++static char *devid=NULL;
+
+ static struct usb_eth_dev usb_dev_id[] = {
+ #define PEGASUS_DEV(pn, vid, pid, flags) \
+ {.name = pn, .vendor = vid, .device = pid, .private = flags},
+ #include "pegasus.h"
+ #undef PEGASUS_DEV
++ {NULL, 0, 0, 0},
+ {NULL, 0, 0, 0}
+ };
+
+@@ -73,6 +75,7 @@ static struct usb_device_id pegasus_ids[
+ {.match_flags = USB_DEVICE_ID_MATCH_DEVICE, .idVendor = vid, .idProduct = pid},
+ #include "pegasus.h"
+ #undef PEGASUS_DEV
++ {},
+ {}
+ };
+
+@@ -81,8 +84,10 @@ MODULE_DESCRIPTION(DRIVER_DESC);
+ MODULE_LICENSE("GPL");
+ module_param(loopback, bool, 0);
+ module_param(mii_mode, bool, 0);
++module_param(devid, charp, 0);
+ MODULE_PARM_DESC(loopback, "Enable MAC loopback mode (bit 0)");
+ MODULE_PARM_DESC(mii_mode, "Enable HomePNA mode (bit 0),default=MII mode = 0");
++MODULE_PARM_DESC(devid, "The format is: 'DEV_name:VendorID:DeviceID:Flags'");
+
+ /* use ethtool to change the level for any given device */
+ static int msg_level = -1;
+@@ -1412,9 +1417,42 @@ static struct usb_driver pegasus_driver
+ .resume = pegasus_resume,
+ };
+
++static void parse_id(char *id)
++{
++ unsigned int vendor_id=0, device_id=0, flags=0, i=0;
++ char *token, *name=NULL;
++
++ if ((token = strsep(&id, ":")) != NULL)
++ name = token;
++ /* name now points to a null terminated string*/
++ if ((token = strsep(&id, ":")) != NULL)
++ vendor_id = simple_strtoul(token, NULL, 16);
++ if ((token = strsep(&id, ":")) != NULL)
++ device_id = simple_strtoul(token, NULL, 16);
++ flags = simple_strtoul(id, NULL, 16);
++ pr_info("%s: new device %s, vendor ID 0x%04x, device ID 0x%04x, flags: 0x%x\n",
++ driver_name, name, vendor_id, device_id, flags);
++
++ if (vendor_id > 0x10000 || vendor_id == 0)
++ return;
++ if (device_id > 0x10000 || device_id == 0)
++ return;
++
++ for (i=0; usb_dev_id[i].name; i++);
++ usb_dev_id[i].name = name;
++ usb_dev_id[i].vendor = vendor_id;
++ usb_dev_id[i].device = device_id;
++ usb_dev_id[i].private = flags;
++ pegasus_ids[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE;
++ pegasus_ids[i].idVendor = vendor_id;
++ pegasus_ids[i].idProduct = device_id;
++}
++
+ static int __init pegasus_init(void)
+ {
+ pr_info("%s: %s, " DRIVER_DESC "\n", driver_name, DRIVER_VERSION);
++ if (devid)
++ parse_id(devid);
+ pegasus_workqueue = create_singlethread_workqueue("pegasus");
+ if (!pegasus_workqueue)
+ return -ENOMEM;
diff --git a/usb/usb-net-removes-redundant-return.patch b/usb/usb-net-removes-redundant-return.patch
new file mode 100644
index 00000000000000..47e072fc1ce009
--- /dev/null
+++ b/usb/usb-net-removes-redundant-return.patch
@@ -0,0 +1,293 @@
+From petkan@nucleusys.com Tue Nov 15 07:01:54 2005
+Date: Tue, 15 Nov 2005 09:48:23 +0200 (EET)
+From: Petko Manolov <petkan@nucleusys.com>
+To: gregkh@suse.de
+Subject: [PATCH 1/2] usb-net: removes redundant return
+Message-ID: <Pine.LNX.4.64.0511150939220.11138@bender.nucleusys.com>
+
+From: Petko Manolov <petkan@nucleusys.com>
+
+removes all redundant collecting of the return value from
+get/set_registers() and suchlike. can't remember who put all of those
+some time ago, but they doesn't make any sense to me. where needed only
+a few references remained;
+
+Signed-off-by: Petko Manolov <petkan@nucleusys.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/net/pegasus.c | 106 ++++++++++++++++++++++------------------------
+ 1 file changed, 51 insertions(+), 55 deletions(-)
+
+--- gregkh-2.6.orig/drivers/usb/net/pegasus.c
++++ gregkh-2.6/drivers/usb/net/pegasus.c
+@@ -47,7 +47,7 @@
+ /*
+ * Version Information
+ */
+-#define DRIVER_VERSION "v0.6.12 (2005/01/13)"
++#define DRIVER_VERSION "v0.6.13 (2005/11/13)"
+ #define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>"
+ #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver"
+
+@@ -115,7 +115,7 @@ static void ctrl_callback(struct urb *ur
+ break;
+ default:
+ if (netif_msg_drv(pegasus))
+- dev_err(&pegasus->intf->dev, "%s, status %d\n",
++ dev_dbg(&pegasus->intf->dev, "%s, status %d\n",
+ __FUNCTION__, urb->status);
+ }
+ pegasus->flags &= ~ETH_REGS_CHANGED;
+@@ -310,9 +310,9 @@ static int read_mii_word(pegasus_t * peg
+ __le16 regdi;
+ int ret;
+
+- ret = set_register(pegasus, PhyCtrl, 0);
+- ret = set_registers(pegasus, PhyAddr, sizeof (data), data);
+- ret = set_register(pegasus, PhyCtrl, (indx | PHY_READ));
++ set_register(pegasus, PhyCtrl, 0);
++ set_registers(pegasus, PhyAddr, sizeof (data), data);
++ set_register(pegasus, PhyCtrl, (indx | PHY_READ));
+ for (i = 0; i < REG_TIMEOUT; i++) {
+ ret = get_registers(pegasus, PhyCtrl, 1, data);
+ if (data[0] & PHY_DONE)
+@@ -321,12 +321,12 @@ static int read_mii_word(pegasus_t * peg
+ if (i < REG_TIMEOUT) {
+ ret = get_registers(pegasus, PhyData, 2, &regdi);
+ *regd = le16_to_cpu(regdi);
+- return 1;
++ return ret;
+ }
+ if (netif_msg_drv(pegasus))
+ dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
+
+- return 0;
++ return ret;
+ }
+
+ static int mdio_read(struct net_device *dev, int phy_id, int loc)
+@@ -346,20 +346,20 @@ static int write_mii_word(pegasus_t * pe
+
+ data[1] = (u8) regd;
+ data[2] = (u8) (regd >> 8);
+- ret = set_register(pegasus, PhyCtrl, 0);
+- ret = set_registers(pegasus, PhyAddr, sizeof(data), data);
+- ret = set_register(pegasus, PhyCtrl, (indx | PHY_WRITE));
++ set_register(pegasus, PhyCtrl, 0);
++ set_registers(pegasus, PhyAddr, sizeof(data), data);
++ set_register(pegasus, PhyCtrl, (indx | PHY_WRITE));
+ for (i = 0; i < REG_TIMEOUT; i++) {
+ ret = get_registers(pegasus, PhyCtrl, 1, data);
+ if (data[0] & PHY_DONE)
+ break;
+ }
+ if (i < REG_TIMEOUT)
+- return 0;
++ return ret;
+
+ if (netif_msg_drv(pegasus))
+ dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
+- return 1;
++ return -ETIMEDOUT;
+ }
+
+ static void mdio_write(struct net_device *dev, int phy_id, int loc, int val)
+@@ -376,9 +376,9 @@ static int read_eprom_word(pegasus_t * p
+ __le16 retdatai;
+ int ret;
+
+- ret = set_register(pegasus, EpromCtrl, 0);
+- ret = set_register(pegasus, EpromOffset, index);
+- ret = set_register(pegasus, EpromCtrl, EPROM_READ);
++ set_register(pegasus, EpromCtrl, 0);
++ set_register(pegasus, EpromOffset, index);
++ set_register(pegasus, EpromCtrl, EPROM_READ);
+
+ for (i = 0; i < REG_TIMEOUT; i++) {
+ ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
+@@ -388,12 +388,12 @@ static int read_eprom_word(pegasus_t * p
+ if (i < REG_TIMEOUT) {
+ ret = get_registers(pegasus, EpromData, 2, &retdatai);
+ *retdata = le16_to_cpu(retdatai);
+- return 0;
++ return ret;
+ }
+
+ if (netif_msg_drv(pegasus))
+ dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
+- return -1;
++ return -ETIMEDOUT;
+ }
+
+ #ifdef PEGASUS_WRITE_EEPROM
+@@ -402,8 +402,8 @@ static inline void enable_eprom_write(pe
+ __u8 tmp;
+ int ret;
+
+- ret = get_registers(pegasus, EthCtrl2, 1, &tmp);
+- ret = set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE);
++ get_registers(pegasus, EthCtrl2, 1, &tmp);
++ set_register(pegasus, EthCtrl2, tmp | EPROM_WR_ENABLE);
+ }
+
+ static inline void disable_eprom_write(pegasus_t * pegasus)
+@@ -411,9 +411,9 @@ static inline void disable_eprom_write(p
+ __u8 tmp;
+ int ret;
+
+- ret = get_registers(pegasus, EthCtrl2, 1, &tmp);
+- ret = set_register(pegasus, EpromCtrl, 0);
+- ret = set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE);
++ get_registers(pegasus, EthCtrl2, 1, &tmp);
++ set_register(pegasus, EpromCtrl, 0);
++ set_register(pegasus, EthCtrl2, tmp & ~EPROM_WR_ENABLE);
+ }
+
+ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data)
+@@ -422,11 +422,11 @@ static int write_eprom_word(pegasus_t *
+ __u8 tmp, d[4] = { 0x3f, 0, 0, EPROM_WRITE };
+ int ret;
+
+- ret = set_registers(pegasus, EpromOffset, 4, d);
++ set_registers(pegasus, EpromOffset, 4, d);
+ enable_eprom_write(pegasus);
+- ret = set_register(pegasus, EpromOffset, index);
+- ret = set_registers(pegasus, EpromData, 2, &data);
+- ret = set_register(pegasus, EpromCtrl, EPROM_WRITE);
++ set_register(pegasus, EpromOffset, index);
++ set_registers(pegasus, EpromData, 2, &data);
++ set_register(pegasus, EpromCtrl, EPROM_WRITE);
+
+ for (i = 0; i < REG_TIMEOUT; i++) {
+ ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
+@@ -435,10 +435,10 @@ static int write_eprom_word(pegasus_t *
+ }
+ disable_eprom_write(pegasus);
+ if (i < REG_TIMEOUT)
+- return 0;
++ return ret;
+ if (netif_msg_drv(pegasus))
+ dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
+- return -1;
++ return -ETIMEDOUT;
+ }
+ #endif /* PEGASUS_WRITE_EEPROM */
+
+@@ -456,10 +456,9 @@ static inline void get_node_id(pegasus_t
+ static void set_ethernet_addr(pegasus_t * pegasus)
+ {
+ __u8 node_id[6];
+- int ret;
+
+ get_node_id(pegasus, node_id);
+- ret = set_registers(pegasus, EthID, sizeof (node_id), node_id);
++ set_registers(pegasus, EthID, sizeof (node_id), node_id);
+ memcpy(pegasus->net->dev_addr, node_id, sizeof (node_id));
+ }
+
+@@ -467,30 +466,29 @@ static inline int reset_mac(pegasus_t *
+ {
+ __u8 data = 0x8;
+ int i;
+- int ret;
+
+- ret = set_register(pegasus, EthCtrl1, data);
++ set_register(pegasus, EthCtrl1, data);
+ for (i = 0; i < REG_TIMEOUT; i++) {
+- ret = get_registers(pegasus, EthCtrl1, 1, &data);
++ get_registers(pegasus, EthCtrl1, 1, &data);
+ if (~data & 0x08) {
+ if (loopback & 1)
+ break;
+ if (mii_mode && (pegasus->features & HAS_HOME_PNA))
+- ret = set_register(pegasus, Gpio1, 0x34);
++ set_register(pegasus, Gpio1, 0x34);
+ else
+- ret = set_register(pegasus, Gpio1, 0x26);
+- ret = set_register(pegasus, Gpio0, pegasus->features);
+- ret = set_register(pegasus, Gpio0, DEFAULT_GPIO_SET);
++ set_register(pegasus, Gpio1, 0x26);
++ set_register(pegasus, Gpio0, pegasus->features);
++ set_register(pegasus, Gpio0, DEFAULT_GPIO_SET);
+ break;
+ }
+ }
+ if (i == REG_TIMEOUT)
+- return 1;
++ return -ETIMEDOUT;
+
+ if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
+ usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
+- ret = set_register(pegasus, Gpio0, 0x24);
+- ret = set_register(pegasus, Gpio0, 0x26);
++ set_register(pegasus, Gpio0, 0x24);
++ set_register(pegasus, Gpio0, 0x26);
+ }
+ if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) {
+ __u16 auxmode;
+@@ -529,7 +527,7 @@ static int enable_net_traffic(struct net
+ write_mii_word(pegasus, 0, 0x1b, auxmode | 4);
+ }
+
+- return 0;
++ return ret;
+ }
+
+ static void fill_skb_pool(pegasus_t * pegasus)
+@@ -883,9 +881,8 @@ static struct net_device_stats *pegasus_
+ static inline void disable_net_traffic(pegasus_t * pegasus)
+ {
+ int tmp = 0;
+- int ret;
+
+- ret = set_registers(pegasus, EthCtrl0, 2, &tmp);
++ set_registers(pegasus, EthCtrl0, 2, &tmp);
+ }
+
+ static inline void get_interrupt_interval(pegasus_t * pegasus)
+@@ -1208,18 +1205,17 @@ static __u8 mii_phy_probe(pegasus_t * pe
+ static inline void setup_pegasus_II(pegasus_t * pegasus)
+ {
+ __u8 data = 0xa5;
+- int ret;
+
+- ret = set_register(pegasus, Reg1d, 0);
+- ret = set_register(pegasus, Reg7b, 1);
++ set_register(pegasus, Reg1d, 0);
++ set_register(pegasus, Reg7b, 1);
+ mdelay(100);
+ if ((pegasus->features & HAS_HOME_PNA) && mii_mode)
+- ret = set_register(pegasus, Reg7b, 0);
++ set_register(pegasus, Reg7b, 0);
+ else
+- ret = set_register(pegasus, Reg7b, 2);
++ set_register(pegasus, Reg7b, 2);
+
+- ret = set_register(pegasus, 0x83, data);
+- ret = get_registers(pegasus, 0x83, 1, &data);
++ set_register(pegasus, 0x83, data);
++ get_registers(pegasus, 0x83, 1, &data);
+
+ if (data == 0xa5) {
+ pegasus->chip = 0x8513;
+@@ -1227,14 +1223,14 @@ static inline void setup_pegasus_II(pega
+ pegasus->chip = 0;
+ }
+
+- ret = set_register(pegasus, 0x80, 0xc0);
+- ret = set_register(pegasus, 0x83, 0xff);
+- ret = set_register(pegasus, 0x84, 0x01);
++ set_register(pegasus, 0x80, 0xc0);
++ set_register(pegasus, 0x83, 0xff);
++ set_register(pegasus, 0x84, 0x01);
+
+ if (pegasus->features & HAS_HOME_PNA && mii_mode)
+- ret = set_register(pegasus, Reg81, 6);
++ set_register(pegasus, Reg81, 6);
+ else
+- ret = set_register(pegasus, Reg81, 2);
++ set_register(pegasus, Reg81, 2);
+ }
+
+
diff --git a/usb/usb-pl2303-adds-new-ids..patch b/usb/usb-pl2303-adds-new-ids..patch
new file mode 100644
index 00000000000000..5f808dba657bbb
--- /dev/null
+++ b/usb/usb-pl2303-adds-new-ids..patch
@@ -0,0 +1,43 @@
+From lcapitulino@mandriva.com.br Fri Nov 11 18:56:30 2005
+Date: Fri, 11 Nov 2005 17:25:34 -0200
+From: Luiz Fernando Capitulino <lcapitulino@mandriva.com.br>
+To: gregkh@suse.de
+Subject: USB: pl2303: adds new IDs.
+Message-Id: <20051111172534.4645e0b7.lcapitulino@mandriva.com.br>
+
+
+This patch adds two new Siemens mobiles IDs for the pl2303 driver.
+
+Signed-off-by: Luiz Capitulino <lcapitulino@mandriva.com.br>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/serial/pl2303.c | 2 ++
+ drivers/usb/serial/pl2303.h | 2 ++
+ 2 files changed, 4 insertions(+)
+
+--- gregkh-2.6.orig/drivers/usb/serial/pl2303.c
++++ gregkh-2.6/drivers/usb/serial/pl2303.c
+@@ -71,7 +71,9 @@ static struct usb_device_id id_table []
+ { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
+ { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
+ { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
++ { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
+ { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
++ { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
+ { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
+ { USB_DEVICE( NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID ) },
+ { } /* Terminating entry */
+--- gregkh-2.6.orig/drivers/usb/serial/pl2303.h
++++ gregkh-2.6/drivers/usb/serial/pl2303.h
+@@ -54,7 +54,9 @@
+ #define SAMSUNG_PRODUCT_ID 0x8001
+
+ #define SIEMENS_VENDOR_ID 0x11f5
++#define SIEMENS_PRODUCT_ID_SX1 0x0001
+ #define SIEMENS_PRODUCT_ID_X65 0x0003
++#define SIEMENS_PRODUCT_ID_X75 0x0004
+
+ #define SYNTECH_VENDOR_ID 0x0745
+ #define SYNTECH_PRODUCT_ID 0x0001
diff --git a/usb/usb-pl2303-updates-pl2303_update_line_status.patch b/usb/usb-pl2303-updates-pl2303_update_line_status.patch
new file mode 100644
index 00000000000000..9705f106495cbc
--- /dev/null
+++ b/usb/usb-pl2303-updates-pl2303_update_line_status.patch
@@ -0,0 +1,31 @@
+From lcapitulino@mandriva.com.br Fri Nov 11 18:56:30 2005
+Date: Fri, 11 Nov 2005 17:25:57 -0200
+From: Luiz Fernando Capitulino <lcapitulino@mandriva.com.br>
+To: gregkh@suse.de
+Subject: USB: pl2303: updates pl2303_update_line_status()
+Message-Id: <20051111172557.64ed6d7a.lcapitulino@mandriva.com.br>
+
+
+Updates pl2303_update_line_status() to handle X75 and SX1 Siemens mobiles
+
+Signed-off-by: Luiz Capitulino <lcapitulino@mandriva.com.br>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/serial/pl2303.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- gregkh-2.6.orig/drivers/usb/serial/pl2303.c
++++ gregkh-2.6/drivers/usb/serial/pl2303.c
+@@ -813,7 +813,9 @@ static void pl2303_update_line_status(st
+ u8 length = UART_STATE;
+
+ if ((le16_to_cpu(port->serial->dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
+- (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65)) {
++ (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65 ||
++ le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_SX1 ||
++ le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X75)) {
+ length = 1;
+ status_idx = 0;
+ }