diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-15 15:42:23 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-15 15:42:23 -0800 |
commit | cae7bf988b354fd938934fdfc15fe23e72869d2c (patch) | |
tree | 60339d96d5572ec8b6ab393b2887ccdee3b29f3a /usb | |
parent | 3f775d6d6c1d91cb28793ee12e3a73810ea770a4 (diff) | |
download | patches-cae7bf988b354fd938934fdfc15fe23e72869d2c.tar.gz |
new usb patches
Diffstat (limited to 'usb')
-rw-r--r-- | usb/usb-file-storage-gadget-add-reference-count-for-children.patch | 137 | ||||
-rw-r--r-- | usb/usb-fix-race-in-kaweth-disconnect.patch | 64 | ||||
-rw-r--r-- | usb/usb-makefile-change-for-libusual.patch | 43 | ||||
-rw-r--r-- | usb/usb-net-new-device-id-passed-through-module-parameter.patch | 104 | ||||
-rw-r--r-- | usb/usb-net-removes-redundant-return.patch | 293 | ||||
-rw-r--r-- | usb/usb-pl2303-adds-new-ids..patch | 43 | ||||
-rw-r--r-- | usb/usb-pl2303-updates-pl2303_update_line_status.patch | 31 |
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, ®di); + *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; + } |