aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-11-18 11:30:38 -0500
committerJeff Garzik <jgarzik@pobox.com>2005-11-18 11:30:38 -0500
commit79bfb0a98fdc73ed6a18469cef245cbf50a1d8bb (patch)
treefaf5312c25eebfa11bd1f65c881bfac07c945f2b /drivers
parent67cb6e842e7f1e534a5e0e8708a8779e33b60520 (diff)
parentfc71fe40d2bedcc57d3406bf2050481f8b3441b6 (diff)
Merge branch 'master'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/acpi/processor_idle.c14
-rw-r--r--drivers/char/ipmi/ipmi_si_intf.c2
-rw-r--r--drivers/char/tpm/Kconfig2
-rw-r--r--drivers/char/tpm/tpm.c2
-rw-r--r--drivers/char/tpm/tpm_atmel.c47
-rw-r--r--drivers/char/tpm/tpm_atmel.h22
-rw-r--r--drivers/i2c/busses/i2c-ixp4xx.c7
-rw-r--r--drivers/ide/Kconfig4
-rw-r--r--drivers/ide/Makefile2
-rw-r--r--drivers/ide/mips/Makefile1
-rw-r--r--drivers/ide/mips/swarm.c201
-rw-r--r--drivers/md/bitmap.c4
-rw-r--r--drivers/md/md.c17
-rw-r--r--drivers/net/wireless/ipw2200.c7
-rw-r--r--drivers/s390/char/raw3270.c4
-rw-r--r--drivers/tc/zs.c150
-rw-r--r--drivers/tc/zs.h13
-rw-r--r--drivers/usb/atm/Makefile4
-rw-r--r--drivers/usb/atm/usbatm.h5
-rw-r--r--drivers/usb/core/Makefile4
-rw-r--r--drivers/usb/core/buffer.c8
-rw-r--r--drivers/usb/core/config.c5
-rw-r--r--drivers/usb/core/devio.c6
-rw-r--r--drivers/usb/core/file.c6
-rw-r--r--drivers/usb/core/hcd-pci.c7
-rw-r--r--drivers/usb/core/hcd.c5
-rw-r--r--drivers/usb/core/hub.c5
-rw-r--r--drivers/usb/core/inode.c7
-rw-r--r--drivers/usb/core/message.c10
-rw-r--r--drivers/usb/core/notify.c6
-rw-r--r--drivers/usb/core/sysfs.c7
-rw-r--r--drivers/usb/core/urb.c6
-rw-r--r--drivers/usb/core/usb.c7
-rw-r--r--drivers/usb/gadget/dummy_hcd.c4
-rw-r--r--drivers/usb/host/ohci-lh7a404.c2
-rw-r--r--drivers/usb/host/ohci-ppc-soc.c2
-rw-r--r--drivers/usb/image/microtek.c35
-rw-r--r--drivers/usb/image/microtek.h2
-rw-r--r--drivers/usb/input/Makefile4
-rw-r--r--drivers/usb/input/hid-core.c12
-rw-r--r--drivers/usb/input/itmtouch.c7
-rw-r--r--drivers/usb/input/keyspan_remote.c5
-rw-r--r--drivers/usb/input/mtouchusb.c7
-rw-r--r--drivers/usb/input/pid.c2
-rw-r--r--drivers/usb/input/touchkitusb.c4
-rw-r--r--drivers/usb/input/wacom.c133
-rw-r--r--drivers/usb/misc/Makefile6
-rw-r--r--drivers/usb/misc/auerswald.c1
-rw-r--r--drivers/usb/misc/phidgetservo.c3
-rw-r--r--drivers/usb/misc/rio500.c2
-rw-r--r--drivers/usb/misc/usbled.c3
-rw-r--r--drivers/usb/misc/usbtest.c3
-rw-r--r--drivers/usb/misc/uss720.c2
-rw-r--r--drivers/usb/net/Makefile4
-rw-r--r--drivers/usb/net/asix.c3
-rw-r--r--drivers/usb/net/cdc_ether.c3
-rw-r--r--drivers/usb/net/cdc_subset.c3
-rw-r--r--drivers/usb/net/gl620a.c3
-rw-r--r--drivers/usb/net/kaweth.c13
-rw-r--r--drivers/usb/net/net1080.c3
-rw-r--r--drivers/usb/net/pegasus.c2
-rw-r--r--drivers/usb/net/plusb.c3
-rw-r--r--drivers/usb/net/rndis_host.c3
-rw-r--r--drivers/usb/net/usbnet.c3
-rw-r--r--drivers/usb/net/zaurus.c3
-rw-r--r--drivers/usb/serial/ChangeLog.history (renamed from drivers/usb/serial/ChangeLog.old)2
-rw-r--r--drivers/usb/serial/Kconfig18
-rw-r--r--drivers/usb/serial/Makefile2
-rw-r--r--drivers/usb/serial/anydata.c123
-rw-r--r--drivers/usb/serial/cp2101.c1
-rw-r--r--drivers/usb/serial/generic.c1
-rw-r--r--drivers/usb/serial/nokia_dku2.c142
-rw-r--r--drivers/usb/serial/pl2303.c6
-rw-r--r--drivers/usb/serial/pl2303.h2
-rw-r--r--drivers/usb/storage/Kconfig2
-rw-r--r--drivers/usb/storage/shuttle_usbat.c2
-rw-r--r--drivers/usb/storage/unusual_devs.h10
-rw-r--r--drivers/video/offb.c41
78 files changed, 720 insertions, 514 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
index 573b6a97bb1f..70d8a6ec0920 100644
--- a/drivers/acpi/processor_idle.c
+++ b/drivers/acpi/processor_idle.c
@@ -514,8 +514,6 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr)
514 514
515static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) 515static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
516{ 516{
517 int i;
518
519 ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_fadt"); 517 ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_fadt");
520 518
521 if (!pr) 519 if (!pr)
@@ -524,8 +522,7 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
524 if (!pr->pblk) 522 if (!pr->pblk)
525 return_VALUE(-ENODEV); 523 return_VALUE(-ENODEV);
526 524
527 for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++) 525 memset(pr->power.states, 0, sizeof(pr->power.states));
528 memset(pr->power.states, 0, sizeof(struct acpi_processor_cx));
529 526
530 /* if info is obtained from pblk/fadt, type equals state */ 527 /* if info is obtained from pblk/fadt, type equals state */
531 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1; 528 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
@@ -555,13 +552,9 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
555 552
556static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr) 553static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr)
557{ 554{
558 int i;
559
560 ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1"); 555 ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1");
561 556
562 for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++) 557 memset(pr->power.states, 0, sizeof(pr->power.states));
563 memset(&(pr->power.states[i]), 0,
564 sizeof(struct acpi_processor_cx));
565 558
566 /* if info is obtained from pblk/fadt, type equals state */ 559 /* if info is obtained from pblk/fadt, type equals state */
567 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1; 560 pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
@@ -873,7 +866,8 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
873 for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) { 866 for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
874 if (pr->power.states[i].valid) { 867 if (pr->power.states[i].valid) {
875 pr->power.count = i; 868 pr->power.count = i;
876 pr->flags.power = 1; 869 if (pr->power.states[i].type >= ACPI_STATE_C2)
870 pr->flags.power = 1;
877 } 871 }
878 } 872 }
879 873
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
index ea89dca3dbb5..01a1f6badb53 100644
--- a/drivers/char/ipmi/ipmi_si_intf.c
+++ b/drivers/char/ipmi/ipmi_si_intf.c
@@ -2203,7 +2203,7 @@ static void setup_xaction_handlers(struct smi_info *smi_info)
2203 2203
2204static inline void wait_for_timer_and_thread(struct smi_info *smi_info) 2204static inline void wait_for_timer_and_thread(struct smi_info *smi_info)
2205{ 2205{
2206 if (smi_info->thread != ERR_PTR(-ENOMEM)) 2206 if (smi_info->thread != NULL && smi_info->thread != ERR_PTR(-ENOMEM))
2207 kthread_stop(smi_info->thread); 2207 kthread_stop(smi_info->thread);
2208 del_timer_sync(&smi_info->si_timer); 2208 del_timer_sync(&smi_info->si_timer);
2209} 2209}
diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig
index b58adfe3ed19..a6873bf89ffa 100644
--- a/drivers/char/tpm/Kconfig
+++ b/drivers/char/tpm/Kconfig
@@ -6,7 +6,7 @@ menu "TPM devices"
6 6
7config TCG_TPM 7config TCG_TPM
8 tristate "TPM Hardware Support" 8 tristate "TPM Hardware Support"
9 depends on EXPERIMENTAL && PCI 9 depends on EXPERIMENTAL
10 ---help--- 10 ---help---
11 If you have a TPM security chip in your system, which 11 If you have a TPM security chip in your system, which
12 implements the Trusted Computing Group's specification, 12 implements the Trusted Computing Group's specification,
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 0b283d246730..a9be0e8eaea5 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -377,6 +377,7 @@ int tpm_release(struct inode *inode, struct file *file)
377 file->private_data = NULL; 377 file->private_data = NULL;
378 chip->num_opens--; 378 chip->num_opens--;
379 del_singleshot_timer_sync(&chip->user_read_timer); 379 del_singleshot_timer_sync(&chip->user_read_timer);
380 flush_scheduled_work();
380 atomic_set(&chip->data_pending, 0); 381 atomic_set(&chip->data_pending, 0);
381 put_device(chip->dev); 382 put_device(chip->dev);
382 kfree(chip->data_buffer); 383 kfree(chip->data_buffer);
@@ -428,6 +429,7 @@ ssize_t tpm_read(struct file * file, char __user *buf,
428 int ret_size; 429 int ret_size;
429 430
430 del_singleshot_timer_sync(&chip->user_read_timer); 431 del_singleshot_timer_sync(&chip->user_read_timer);
432 flush_scheduled_work();
431 ret_size = atomic_read(&chip->data_pending); 433 ret_size = atomic_read(&chip->data_pending);
432 atomic_set(&chip->data_pending, 0); 434 atomic_set(&chip->data_pending, 0);
433 if (ret_size > 0) { /* relay data */ 435 if (ret_size > 0) { /* relay data */
diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c
index deb4b5c80914..ff3654964fe3 100644
--- a/drivers/char/tpm/tpm_atmel.c
+++ b/drivers/char/tpm/tpm_atmel.c
@@ -47,13 +47,12 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
47 return -EIO; 47 return -EIO;
48 48
49 for (i = 0; i < 6; i++) { 49 for (i = 0; i < 6; i++) {
50 status = atmel_getb(chip, 1); 50 status = ioread8(chip->vendor->iobase + 1);
51 if ((status & ATML_STATUS_DATA_AVAIL) == 0) { 51 if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
52 dev_err(chip->dev, 52 dev_err(chip->dev, "error reading header\n");
53 "error reading header\n");
54 return -EIO; 53 return -EIO;
55 } 54 }
56 *buf++ = atmel_getb(chip, 0); 55 *buf++ = ioread8(chip->vendor->iobase);
57 } 56 }
58 57
59 /* size of the data received */ 58 /* size of the data received */
@@ -64,10 +63,9 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
64 dev_err(chip->dev, 63 dev_err(chip->dev,
65 "Recv size(%d) less than available space\n", size); 64 "Recv size(%d) less than available space\n", size);
66 for (; i < size; i++) { /* clear the waiting data anyway */ 65 for (; i < size; i++) { /* clear the waiting data anyway */
67 status = atmel_getb(chip, 1); 66 status = ioread8(chip->vendor->iobase + 1);
68 if ((status & ATML_STATUS_DATA_AVAIL) == 0) { 67 if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
69 dev_err(chip->dev, 68 dev_err(chip->dev, "error reading data\n");
70 "error reading data\n");
71 return -EIO; 69 return -EIO;
72 } 70 }
73 } 71 }
@@ -76,17 +74,17 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
76 74
77 /* read all the data available */ 75 /* read all the data available */
78 for (; i < size; i++) { 76 for (; i < size; i++) {
79 status = atmel_getb(chip, 1); 77 status = ioread8(chip->vendor->iobase + 1);
80 if ((status & ATML_STATUS_DATA_AVAIL) == 0) { 78 if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
81 dev_err(chip->dev, 79 dev_err(chip->dev, "error reading data\n");
82 "error reading data\n");
83 return -EIO; 80 return -EIO;
84 } 81 }
85 *buf++ = atmel_getb(chip, 0); 82 *buf++ = ioread8(chip->vendor->iobase);
86 } 83 }
87 84
88 /* make sure data available is gone */ 85 /* make sure data available is gone */
89 status = atmel_getb(chip, 1); 86 status = ioread8(chip->vendor->iobase + 1);
87
90 if (status & ATML_STATUS_DATA_AVAIL) { 88 if (status & ATML_STATUS_DATA_AVAIL) {
91 dev_err(chip->dev, "data available is stuck\n"); 89 dev_err(chip->dev, "data available is stuck\n");
92 return -EIO; 90 return -EIO;
@@ -102,7 +100,7 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
102 dev_dbg(chip->dev, "tpm_atml_send:\n"); 100 dev_dbg(chip->dev, "tpm_atml_send:\n");
103 for (i = 0; i < count; i++) { 101 for (i = 0; i < count; i++) {
104 dev_dbg(chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]); 102 dev_dbg(chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]);
105 atmel_putb(buf[i], chip, 0); 103 iowrite8(buf[i], chip->vendor->iobase);
106 } 104 }
107 105
108 return count; 106 return count;
@@ -110,12 +108,12 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
110 108
111static void tpm_atml_cancel(struct tpm_chip *chip) 109static void tpm_atml_cancel(struct tpm_chip *chip)
112{ 110{
113 atmel_putb(ATML_STATUS_ABORT, chip, 1); 111 iowrite8(ATML_STATUS_ABORT, chip->vendor->iobase + 1);
114} 112}
115 113
116static u8 tpm_atml_status(struct tpm_chip *chip) 114static u8 tpm_atml_status(struct tpm_chip *chip)
117{ 115{
118 return atmel_getb(chip, 1); 116 return ioread8(chip->vendor->iobase + 1);
119} 117}
120 118
121static struct file_operations atmel_ops = { 119static struct file_operations atmel_ops = {
@@ -162,7 +160,8 @@ static void atml_plat_remove(void)
162 160
163 if (chip) { 161 if (chip) {
164 if (chip->vendor->have_region) 162 if (chip->vendor->have_region)
165 atmel_release_region(chip->vendor->base, chip->vendor->region_size); 163 atmel_release_region(chip->vendor->base,
164 chip->vendor->region_size);
166 atmel_put_base_addr(chip->vendor); 165 atmel_put_base_addr(chip->vendor);
167 tpm_remove_hardware(chip->dev); 166 tpm_remove_hardware(chip->dev);
168 platform_device_unregister(pdev); 167 platform_device_unregister(pdev);
@@ -183,14 +182,19 @@ static int __init init_atmel(void)
183 182
184 driver_register(&atml_drv); 183 driver_register(&atml_drv);
185 184
186 if (atmel_get_base_addr(&tpm_atmel) != 0) { 185 if ((tpm_atmel.iobase = atmel_get_base_addr(&tpm_atmel)) == NULL) {
187 rc = -ENODEV; 186 rc = -ENODEV;
188 goto err_unreg_drv; 187 goto err_unreg_drv;
189 } 188 }
190 189
191 tpm_atmel.have_region = (atmel_request_region( tpm_atmel.base, tpm_atmel.region_size, "tpm_atmel0") == NULL) ? 0 : 1; 190 tpm_atmel.have_region =
191 (atmel_request_region
192 (tpm_atmel.base, tpm_atmel.region_size,
193 "tpm_atmel0") == NULL) ? 0 : 1;
192 194
193 if (IS_ERR(pdev = platform_device_register_simple("tpm_atmel", -1, NULL, 0 ))) { 195 if (IS_ERR
196 (pdev =
197 platform_device_register_simple("tpm_atmel", -1, NULL, 0))) {
194 rc = PTR_ERR(pdev); 198 rc = PTR_ERR(pdev);
195 goto err_rel_reg; 199 goto err_rel_reg;
196 } 200 }
@@ -202,9 +206,10 @@ static int __init init_atmel(void)
202err_unreg_dev: 206err_unreg_dev:
203 platform_device_unregister(pdev); 207 platform_device_unregister(pdev);
204err_rel_reg: 208err_rel_reg:
205 if (tpm_atmel.have_region)
206 atmel_release_region(tpm_atmel.base, tpm_atmel.region_size);
207 atmel_put_base_addr(&tpm_atmel); 209 atmel_put_base_addr(&tpm_atmel);
210 if (tpm_atmel.have_region)
211 atmel_release_region(tpm_atmel.base,
212 tpm_atmel.region_size);
208err_unreg_drv: 213err_unreg_drv:
209 driver_unregister(&atml_drv); 214 driver_unregister(&atml_drv);
210 return rc; 215 return rc;
diff --git a/drivers/char/tpm/tpm_atmel.h b/drivers/char/tpm/tpm_atmel.h
index 3c5b9a8d1c49..d3478aaadd77 100644
--- a/drivers/char/tpm/tpm_atmel.h
+++ b/drivers/char/tpm/tpm_atmel.h
@@ -27,12 +27,14 @@
27#define atmel_putb(val, chip, offset) writeb(val, chip->vendor->iobase + offset) 27#define atmel_putb(val, chip, offset) writeb(val, chip->vendor->iobase + offset)
28#define atmel_request_region request_mem_region 28#define atmel_request_region request_mem_region
29#define atmel_release_region release_mem_region 29#define atmel_release_region release_mem_region
30static inline void atmel_put_base_addr(struct tpm_vendor_specific *vendor) 30
31static inline void atmel_put_base_addr(struct tpm_vendor_specific
32 *vendor)
31{ 33{
32 iounmap(vendor->iobase); 34 iounmap(vendor->iobase);
33} 35}
34 36
35static int atmel_get_base_addr(struct tpm_vendor_specific *vendor) 37static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific *vendor)
36{ 38{
37 struct device_node *dn; 39 struct device_node *dn;
38 unsigned long address, size; 40 unsigned long address, size;
@@ -44,11 +46,11 @@ static int atmel_get_base_addr(struct tpm_vendor_specific *vendor)
44 dn = of_find_node_by_name(NULL, "tpm"); 46 dn = of_find_node_by_name(NULL, "tpm");
45 47
46 if (!dn) 48 if (!dn)
47 return 1; 49 return NULL;
48 50
49 if (!device_is_compatible(dn, "AT97SC3201")) { 51 if (!device_is_compatible(dn, "AT97SC3201")) {
50 of_node_put(dn); 52 of_node_put(dn);
51 return 1; 53 return NULL;
52 } 54 }
53 55
54 reg = (unsigned int *) get_property(dn, "reg", &reglen); 56 reg = (unsigned int *) get_property(dn, "reg", &reglen);
@@ -71,8 +73,7 @@ static int atmel_get_base_addr(struct tpm_vendor_specific *vendor)
71 73
72 vendor->base = address; 74 vendor->base = address;
73 vendor->region_size = size; 75 vendor->region_size = size;
74 vendor->iobase = ioremap(address, size); 76 return ioremap(vendor->base, vendor->region_size);
75 return 0;
76} 77}
77#else 78#else
78#define atmel_getb(chip, offset) inb(chip->vendor->base + offset) 79#define atmel_getb(chip, offset) inb(chip->vendor->base + offset)
@@ -105,18 +106,19 @@ static int atmel_verify_tpm11(void)
105 return 0; 106 return 0;
106} 107}
107 108
108static inline void atmel_put_base_addr(struct tpm_vendor_specific *vendor) 109static inline void atmel_put_base_addr(struct tpm_vendor_specific
110 *vendor)
109{ 111{
110} 112}
111 113
112/* Determine where to talk to device */ 114/* Determine where to talk to device */
113static unsigned long atmel_get_base_addr(struct tpm_vendor_specific 115static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific
114 *vendor) 116 *vendor)
115{ 117{
116 int lo, hi; 118 int lo, hi;
117 119
118 if (atmel_verify_tpm11() != 0) 120 if (atmel_verify_tpm11() != 0)
119 return 1; 121 return NULL;
120 122
121 lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO); 123 lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO);
122 hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI); 124 hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI);
@@ -124,6 +126,6 @@ static unsigned long atmel_get_base_addr(struct tpm_vendor_specific
124 vendor->base = (hi << 8) | lo; 126 vendor->base = (hi << 8) | lo;
125 vendor->region_size = 2; 127 vendor->region_size = 2;
126 128
127 return 0; 129 return ioport_map(vendor->base, vendor->region_size);
128} 130}
129#endif 131#endif
diff --git a/drivers/i2c/busses/i2c-ixp4xx.c b/drivers/i2c/busses/i2c-ixp4xx.c
index aa36855fa995..f87220be3c87 100644
--- a/drivers/i2c/busses/i2c-ixp4xx.c
+++ b/drivers/i2c/busses/i2c-ixp4xx.c
@@ -35,7 +35,7 @@
35 35
36#include <asm/hardware.h> /* Pick up IXP4xx-specific bits */ 36#include <asm/hardware.h> /* Pick up IXP4xx-specific bits */
37 37
38static struct device_driver ixp4xx_i2c_driver; 38static struct platform_driver ixp4xx_i2c_driver;
39 39
40static inline int ixp4xx_scl_pin(void *data) 40static inline int ixp4xx_scl_pin(void *data)
41{ 41{
@@ -128,7 +128,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
128 drv_data->algo_data.timeout = 100; 128 drv_data->algo_data.timeout = 100;
129 129
130 drv_data->adapter.id = I2C_HW_B_IXP4XX; 130 drv_data->adapter.id = I2C_HW_B_IXP4XX;
131 strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.name, 131 strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.driver.name,
132 I2C_NAME_SIZE); 132 I2C_NAME_SIZE);
133 drv_data->adapter.algo_data = &drv_data->algo_data; 133 drv_data->adapter.algo_data = &drv_data->algo_data;
134 134
@@ -140,7 +140,8 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev)
140 gpio_line_set(gpio->sda_pin, 0); 140 gpio_line_set(gpio->sda_pin, 0);
141 141
142 if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { 142 if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) {
143 printk(KERN_ERR "ERROR: Could not install %s\n", dev->bus_id); 143 printk(KERN_ERR "ERROR: Could not install %s\n",
144 plat_dev->dev.bus_id);
144 145
145 kfree(drv_data); 146 kfree(drv_data);
146 return err; 147 return err;
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
index 42e5b8175cbf..ed2bc87f475b 100644
--- a/drivers/ide/Kconfig
+++ b/drivers/ide/Kconfig
@@ -787,6 +787,10 @@ config BLK_DEV_IDE_PMAC_BLINK
787 This option enables the use of the sleep LED as a hard drive 787 This option enables the use of the sleep LED as a hard drive
788 activity LED. 788 activity LED.
789 789
790config BLK_DEV_IDE_SWARM
791 tristate "IDE for Sibyte evaluation boards"
792 depends on SIBYTE_SB1xxx_SOC
793
790config BLK_DEV_IDE_AU1XXX 794config BLK_DEV_IDE_AU1XXX
791 bool "IDE for AMD Alchemy Au1200" 795 bool "IDE for AMD Alchemy Au1200"
792 depends on SOC_AU1200 796 depends on SOC_AU1200
diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile
index cca9c075966d..569fae717503 100644
--- a/drivers/ide/Makefile
+++ b/drivers/ide/Makefile
@@ -48,6 +48,6 @@ obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o
48obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o 48obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o
49obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o 49obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o
50 50
51obj-$(CONFIG_BLK_DEV_IDE) += legacy/ arm/ 51obj-$(CONFIG_BLK_DEV_IDE) += legacy/ arm/ mips/
52obj-$(CONFIG_BLK_DEV_HD) += legacy/ 52obj-$(CONFIG_BLK_DEV_HD) += legacy/
53obj-$(CONFIG_ETRAX_IDE) += cris/ 53obj-$(CONFIG_ETRAX_IDE) += cris/
diff --git a/drivers/ide/mips/Makefile b/drivers/ide/mips/Makefile
new file mode 100644
index 000000000000..578e52a59588
--- /dev/null
+++ b/drivers/ide/mips/Makefile
@@ -0,0 +1 @@
obj-$(CONFIG_BLK_DEV_IDE_SWARM) += swarm.o
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c
new file mode 100644
index 000000000000..66f6064f4640
--- /dev/null
+++ b/drivers/ide/mips/swarm.c
@@ -0,0 +1,201 @@
1/*
2 * Copyright (C) 2001, 2002, 2003 Broadcom Corporation
3 * Copyright (C) 2004 MontaVista Software Inc.
4 * Author: Manish Lachwani, mlachwani@mvista.com
5 * Copyright (C) 2004 MIPS Technologies, Inc. All rights reserved.
6 * Author: Maciej W. Rozycki <macro@mips.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 */
22
23/*
24 * Derived loosely from ide-pmac.c, so:
25 * Copyright (C) 1998 Paul Mackerras.
26 * Copyright (C) 1995-1998 Mark Lord
27 */
28
29/*
30 * Boards with SiByte processors so far have supported IDE devices via
31 * the Generic Bus, PCI bus, and built-in PCMCIA interface. In all
32 * cases, byte-swapping must be avoided for these devices (whereas
33 * other PCI devices, for example, will require swapping). Any
34 * SiByte-targetted kernel including IDE support will include this
35 * file. Probing of a Generic Bus for an IDE device is controlled by
36 * the definition of "SIBYTE_HAVE_IDE", which is provided by
37 * <asm/sibyte/board.h> for Broadcom boards.
38 */
39
40#include <linux/ide.h>
41#include <linux/ioport.h>
42#include <linux/kernel.h>
43#include <linux/types.h>
44#include <linux/platform_device.h>
45
46#include <asm/io.h>
47
48#include <asm/sibyte/board.h>
49#include <asm/sibyte/sb1250_genbus.h>
50#include <asm/sibyte/sb1250_regs.h>
51
52#define DRV_NAME "ide-swarm"
53
54static char swarm_ide_string[] = DRV_NAME;
55
56static struct resource swarm_ide_resource = {
57 .name = "SWARM GenBus IDE",
58 .flags = IORESOURCE_MEM,
59};
60
61static struct platform_device *swarm_ide_dev;
62
63/*
64 * swarm_ide_probe - if the board header indicates the existence of
65 * Generic Bus IDE, allocate a HWIF for it.
66 */
67static int __devinit swarm_ide_probe(struct device *dev)
68{
69 ide_hwif_t *hwif;
70 u8 __iomem *base;
71 phys_t offset, size;
72 int i;
73
74 if (!SIBYTE_HAVE_IDE)
75 return -ENODEV;
76
77 /* Find an empty slot. */
78 for (i = 0; i < MAX_HWIFS; i++)
79 if (!ide_hwifs[i].io_ports[IDE_DATA_OFFSET])
80 break;
81 if (i >= MAX_HWIFS) {
82 printk(KERN_ERR DRV_NAME ": no free slot for interface\n");
83 return -ENOMEM;
84 }
85
86 hwif = ide_hwifs + i;
87
88 base = ioremap(A_IO_EXT_BASE, 0x800);
89 offset = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_START_ADDR, IDE_CS));
90 size = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_MULT_SIZE, IDE_CS));
91 iounmap(base);
92
93 offset = G_IO_START_ADDR(offset) << S_IO_ADDRBASE;
94 size = (G_IO_MULT_SIZE(size) + 1) << S_IO_REGSIZE;
95 if (offset < A_PHYS_GENBUS || offset >= A_PHYS_GENBUS_END) {
96 printk(KERN_INFO DRV_NAME
97 ": IDE interface at GenBus disabled\n");
98 return -EBUSY;
99 }
100
101 printk(KERN_INFO DRV_NAME ": IDE interface at GenBus slot %i\n",
102 IDE_CS);
103
104 swarm_ide_resource.start = offset;
105 swarm_ide_resource.end = offset + size - 1;
106 if (request_resource(&iomem_resource, &swarm_ide_resource)) {
107 printk(KERN_ERR DRV_NAME
108 ": can't request I/O memory resource\n");
109 return -EBUSY;
110 }
111
112 base = ioremap(offset, size);
113
114 /* Setup MMIO ops. */
115 default_hwif_mmiops(hwif);
116 /* Prevent resource map manipulation. */
117 hwif->mmio = 2;
118 hwif->noprobe = 0;
119
120 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
121 hwif->hw.io_ports[i] =
122 (unsigned long)(base + ((0x1f0 + i) << 5));
123 hwif->hw.io_ports[IDE_CONTROL_OFFSET] =
124 (unsigned long)(base + (0x3f6 << 5));
125 hwif->hw.irq = K_INT_GB_IDE;
126
127 memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
128 hwif->irq = hwif->hw.irq;
129
130 dev_set_drvdata(dev, hwif);
131
132 return 0;
133}
134
135static struct device_driver swarm_ide_driver = {
136 .name = swarm_ide_string,
137 .bus = &platform_bus_type,
138 .probe = swarm_ide_probe,
139};
140
141static void swarm_ide_platform_release(struct device *device)
142{
143 struct platform_device *pldev;
144
145 /* free device */
146 pldev = to_platform_device(device);
147 kfree(pldev);
148}
149
150static int __devinit swarm_ide_init_module(void)
151{
152 struct platform_device *pldev;
153 int err;
154
155 printk(KERN_INFO "SWARM IDE driver\n");
156
157 if (driver_register(&swarm_ide_driver)) {
158 printk(KERN_ERR "Driver registration failed\n");
159 err = -ENODEV;
160 goto out;
161 }
162
163 if (!(pldev = kmalloc(sizeof (*pldev), GFP_KERNEL))) {
164 err = -ENOMEM;
165 goto out_unregister_driver;
166 }
167
168 memset (pldev, 0, sizeof (*pldev));
169 pldev->name = swarm_ide_string;
170 pldev->id = 0;
171 pldev->dev.release = swarm_ide_platform_release;
172
173 if (platform_device_register(pldev)) {
174 err = -ENODEV;
175 goto out_free_pldev;
176 }
177
178 if (!pldev->dev.driver) {
179 /*
180 * The driver was not bound to this device, there was
181 * no hardware at this address. Unregister it, as the
182 * release fuction will take care of freeing the
183 * allocated structure
184 */
185 platform_device_unregister (pldev);
186 }
187
188 swarm_ide_dev = pldev;
189
190 return 0;
191
192out_free_pldev:
193 kfree(pldev);
194
195out_unregister_driver:
196 driver_unregister(&swarm_ide_driver);
197out:
198 return err;
199}
200
201module_init(swarm_ide_init_module);
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index 51315302a85e..252d55df9642 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -326,9 +326,9 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait)
326 } 326 }
327 } 327 }
328 328
329 ret = page->mapping->a_ops->prepare_write(NULL, page, 0, PAGE_SIZE); 329 ret = page->mapping->a_ops->prepare_write(bitmap->file, page, 0, PAGE_SIZE);
330 if (!ret) 330 if (!ret)
331 ret = page->mapping->a_ops->commit_write(NULL, page, 0, 331 ret = page->mapping->a_ops->commit_write(bitmap->file, page, 0,
332 PAGE_SIZE); 332 PAGE_SIZE);
333 if (ret) { 333 if (ret) {
334 unlock_page(page); 334 unlock_page(page);
diff --git a/drivers/md/md.c b/drivers/md/md.c
index f3fed662f32e..78c7418478d6 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -3846,11 +3846,20 @@ static int is_mddev_idle(mddev_t *mddev)
3846 curr_events = disk_stat_read(disk, sectors[0]) + 3846 curr_events = disk_stat_read(disk, sectors[0]) +
3847 disk_stat_read(disk, sectors[1]) - 3847 disk_stat_read(disk, sectors[1]) -
3848 atomic_read(&disk->sync_io); 3848 atomic_read(&disk->sync_io);
3849 /* Allow some slack between valud of curr_events and last_events, 3849 /* The difference between curr_events and last_events
3850 * as there are some uninteresting races. 3850 * will be affected by any new non-sync IO (making
3851 * curr_events bigger) and any difference in the amount of
3852 * in-flight syncio (making current_events bigger or smaller)
3853 * The amount in-flight is currently limited to
3854 * 32*64K in raid1/10 and 256*PAGE_SIZE in raid5/6
3855 * which is at most 4096 sectors.
3856 * These numbers are fairly fragile and should be made
3857 * more robust, probably by enforcing the
3858 * 'window size' that md_do_sync sort-of uses.
3859 *
3851 * Note: the following is an unsigned comparison. 3860 * Note: the following is an unsigned comparison.
3852 */ 3861 */
3853 if ((curr_events - rdev->last_events + 32) > 64) { 3862 if ((curr_events - rdev->last_events + 4096) > 8192) {
3854 rdev->last_events = curr_events; 3863 rdev->last_events = curr_events;
3855 idle = 0; 3864 idle = 0;
3856 } 3865 }
@@ -4109,7 +4118,7 @@ static void md_do_sync(mddev_t *mddev)
4109 if (currspeed > sysctl_speed_limit_min) { 4118 if (currspeed > sysctl_speed_limit_min) {
4110 if ((currspeed > sysctl_speed_limit_max) || 4119 if ((currspeed > sysctl_speed_limit_max) ||
4111 !is_mddev_idle(mddev)) { 4120 !is_mddev_idle(mddev)) {
4112 msleep(250); 4121 msleep(500);
4113 goto repeat; 4122 goto repeat;
4114 } 4123 }
4115 } 4124 }
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index b0d195d1721a..5e7c7e944c9d 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -1110,8 +1110,7 @@ static struct ipw_fw_error *ipw_alloc_error_log(struct ipw_priv *priv)
1110 error->elem_len = elem_len; 1110 error->elem_len = elem_len;
1111 error->log_len = log_len; 1111 error->log_len = log_len;
1112 error->elem = (struct ipw_error_elem *)error->payload; 1112 error->elem = (struct ipw_error_elem *)error->payload;
1113 error->log = (struct ipw_event *)(error->elem + 1113 error->log = (struct ipw_event *)(error->elem + elem_len);
1114 (sizeof(*error->elem) * elem_len));
1115 1114
1116 ipw_capture_event_log(priv, log_len, error->log); 1115 ipw_capture_event_log(priv, log_len, error->log);
1117 1116
@@ -8926,6 +8925,10 @@ static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid,
8926 struct ipw_scan_request_ext scan; 8925 struct ipw_scan_request_ext scan;
8927 int err = 0, scan_type; 8926 int err = 0, scan_type;
8928 8927
8928 if (!(priv->status & STATUS_INIT) ||
8929 (priv->status & STATUS_EXIT_PENDING))
8930 return 0;
8931
8929 down(&priv->sem); 8932 down(&priv->sem);
8930 8933
8931 if (priv->status & STATUS_RF_KILL_MASK) { 8934 if (priv->status & STATUS_RF_KILL_MASK) {
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c
index f5b7d360fc10..1026f2bc3185 100644
--- a/drivers/s390/char/raw3270.c
+++ b/drivers/s390/char/raw3270.c
@@ -1179,12 +1179,12 @@ raw3270_create_attributes(struct raw3270 *rp)
1179 //FIXME: check return code 1179 //FIXME: check return code
1180 sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group); 1180 sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
1181 rp->clttydev = 1181 rp->clttydev =
1182 class_device_create(class3270, 1182 class_device_create(class3270, NULL,
1183 MKDEV(IBM_TTY3270_MAJOR, rp->minor), 1183 MKDEV(IBM_TTY3270_MAJOR, rp->minor),
1184 &rp->cdev->dev, "tty%s", 1184 &rp->cdev->dev, "tty%s",
1185 rp->cdev->dev.bus_id); 1185 rp->cdev->dev.bus_id);
1186 rp->cltubdev = 1186 rp->cltubdev =
1187 class_device_create(class3270, 1187 class_device_create(class3270, NULL,
1188 MKDEV(IBM_FS3270_MAJOR, rp->minor), 1188 MKDEV(IBM_FS3270_MAJOR, rp->minor),
1189 &rp->cdev->dev, "tub%s", 1189 &rp->cdev->dev, "tub%s",
1190 rp->cdev->dev.bus_id); 1190 rp->cdev->dev.bus_id);
diff --git a/drivers/tc/zs.c b/drivers/tc/zs.c
index c52af73a251b..6756d0fab6fe 100644
--- a/drivers/tc/zs.c
+++ b/drivers/tc/zs.c
@@ -6,7 +6,7 @@
6 * 6 *
7 * DECstation changes 7 * DECstation changes
8 * Copyright (C) 1998-2000 Harald Koerfgen 8 * Copyright (C) 1998-2000 Harald Koerfgen
9 * Copyright (C) 2000, 2001, 2002, 2003, 2004 Maciej W. Rozycki 9 * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Maciej W. Rozycki
10 * 10 *
11 * For the rest of the code the original Copyright applies: 11 * For the rest of the code the original Copyright applies:
12 * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au) 12 * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au)
@@ -55,6 +55,7 @@
55#include <linux/delay.h> 55#include <linux/delay.h>
56#include <linux/init.h> 56#include <linux/init.h>
57#include <linux/ioport.h> 57#include <linux/ioport.h>
58#include <linux/spinlock.h>
58#ifdef CONFIG_SERIAL_DEC_CONSOLE 59#ifdef CONFIG_SERIAL_DEC_CONSOLE
59#include <linux/console.h> 60#include <linux/console.h>
60#endif 61#endif
@@ -63,7 +64,6 @@
63#include <asm/pgtable.h> 64#include <asm/pgtable.h>
64#include <asm/irq.h> 65#include <asm/irq.h>
65#include <asm/system.h> 66#include <asm/system.h>
66#include <asm/uaccess.h>
67#include <asm/bootinfo.h> 67#include <asm/bootinfo.h>
68 68
69#include <asm/dec/interrupts.h> 69#include <asm/dec/interrupts.h>
@@ -128,6 +128,8 @@ static struct zs_parms ds_parms = {
128 128
129#define BUS_PRESENT (DS_BUS_PRESENT) 129#define BUS_PRESENT (DS_BUS_PRESENT)
130 130
131DEFINE_SPINLOCK(zs_lock);
132
131struct dec_zschannel zs_channels[NUM_CHANNELS]; 133struct dec_zschannel zs_channels[NUM_CHANNELS];
132struct dec_serial zs_soft[NUM_CHANNELS]; 134struct dec_serial zs_soft[NUM_CHANNELS];
133int zs_channels_found; 135int zs_channels_found;
@@ -159,8 +161,6 @@ static unsigned char zs_init_regs[16] __initdata = {
159 0 /* write 15 */ 161 0 /* write 15 */
160}; 162};
161 163
162DECLARE_TASK_QUEUE(tq_zs_serial);
163
164static struct tty_driver *serial_driver; 164static struct tty_driver *serial_driver;
165 165
166/* serial subtype definitions */ 166/* serial subtype definitions */
@@ -294,8 +294,7 @@ static inline void zs_rtsdtr(struct dec_serial *info, int which, int set)
294{ 294{
295 unsigned long flags; 295 unsigned long flags;
296 296
297 297 spin_lock_irqsave(&zs_lock, flags);
298 save_flags(flags); cli();
299 if (info->zs_channel != info->zs_chan_a) { 298 if (info->zs_channel != info->zs_chan_a) {
300 if (set) { 299 if (set) {
301 info->zs_chan_a->curregs[5] |= (which & (RTS | DTR)); 300 info->zs_chan_a->curregs[5] |= (which & (RTS | DTR));
@@ -304,7 +303,7 @@ static inline void zs_rtsdtr(struct dec_serial *info, int which, int set)
304 } 303 }
305 write_zsreg(info->zs_chan_a, 5, info->zs_chan_a->curregs[5]); 304 write_zsreg(info->zs_chan_a, 5, info->zs_chan_a->curregs[5]);
306 } 305 }
307 restore_flags(flags); 306 spin_unlock_irqrestore(&zs_lock, flags);
308} 307}
309 308
310/* Utility routines for the Zilog */ 309/* Utility routines for the Zilog */
@@ -345,12 +344,10 @@ static inline void rs_recv_clear(struct dec_zschannel *zsc)
345 * This routine is used by the interrupt handler to schedule 344 * This routine is used by the interrupt handler to schedule
346 * processing in the software interrupt portion of the driver. 345 * processing in the software interrupt portion of the driver.
347 */ 346 */
348static _INLINE_ void rs_sched_event(struct dec_serial *info, 347static _INLINE_ void rs_sched_event(struct dec_serial *info, int event)
349 int event)
350{ 348{
351 info->event |= 1 << event; 349 info->event |= 1 << event;
352 queue_task(&info->tqueue, &tq_zs_serial); 350 tasklet_schedule(&info->tlet);
353 mark_bh(SERIAL_BH);
354} 351}
355 352
356static _INLINE_ void receive_chars(struct dec_serial *info, 353static _INLINE_ void receive_chars(struct dec_serial *info,
@@ -497,9 +494,10 @@ static _INLINE_ void status_handle(struct dec_serial *info)
497/* 494/*
498 * This is the serial driver's generic interrupt routine 495 * This is the serial driver's generic interrupt routine
499 */ 496 */
500void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs) 497static irqreturn_t rs_interrupt(int irq, void *dev_id, struct pt_regs *regs)
501{ 498{
502 struct dec_serial *info = (struct dec_serial *) dev_id; 499 struct dec_serial *info = (struct dec_serial *) dev_id;
500 irqreturn_t status = IRQ_NONE;
503 unsigned char zs_intreg; 501 unsigned char zs_intreg;
504 int shift; 502 int shift;
505 503
@@ -521,6 +519,8 @@ void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
521 if ((zs_intreg & CHAN_IRQMASK) == 0) 519 if ((zs_intreg & CHAN_IRQMASK) == 0)
522 break; 520 break;
523 521
522 status = IRQ_HANDLED;
523
524 if (zs_intreg & CHBRxIP) { 524 if (zs_intreg & CHBRxIP) {
525 receive_chars(info, regs); 525 receive_chars(info, regs);
526 } 526 }
@@ -534,6 +534,8 @@ void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs)
534 534
535 /* Why do we need this ? */ 535 /* Why do we need this ? */
536 write_zsreg(info->zs_channel, 0, RES_H_IUS); 536 write_zsreg(info->zs_channel, 0, RES_H_IUS);
537
538 return status;
537} 539}
538 540
539#ifdef ZS_DEBUG_REGS 541#ifdef ZS_DEBUG_REGS
@@ -578,12 +580,12 @@ static void rs_stop(struct tty_struct *tty)
578 return; 580 return;
579 581
580#if 1 582#if 1
581 save_flags(flags); cli(); 583 spin_lock_irqsave(&zs_lock, flags);
582 if (info->zs_channel->curregs[5] & TxENAB) { 584 if (info->zs_channel->curregs[5] & TxENAB) {
583 info->zs_channel->curregs[5] &= ~TxENAB; 585 info->zs_channel->curregs[5] &= ~TxENAB;
584 write_zsreg(info->zs_channel, 5, info->zs_channel->curregs[5]); 586 write_zsreg(info->zs_channel, 5, info->zs_channel->curregs[5]);
585 } 587 }
586 restore_flags(flags); 588 spin_unlock_irqrestore(&zs_lock, flags);
587#endif 589#endif
588} 590}
589 591
@@ -595,7 +597,7 @@ static void rs_start(struct tty_struct *tty)
595 if (serial_paranoia_check(info, tty->name, "rs_start")) 597 if (serial_paranoia_check(info, tty->name, "rs_start"))
596 return; 598 return;
597 599
598 save_flags(flags); cli(); 600 spin_lock_irqsave(&zs_lock, flags);
599#if 1 601#if 1
600 if (info->xmit_cnt && info->xmit_buf && !(info->zs_channel->curregs[5] & TxENAB)) { 602 if (info->xmit_cnt && info->xmit_buf && !(info->zs_channel->curregs[5] & TxENAB)) {
601 info->zs_channel->curregs[5] |= TxENAB; 603 info->zs_channel->curregs[5] |= TxENAB;
@@ -606,7 +608,7 @@ static void rs_start(struct tty_struct *tty)
606 transmit_chars(info); 608 transmit_chars(info);
607 } 609 }
608#endif 610#endif
609 restore_flags(flags); 611 spin_unlock_irqrestore(&zs_lock, flags);
610} 612}
611 613
612/* 614/*
@@ -618,12 +620,8 @@ static void rs_start(struct tty_struct *tty)
618 * interrupt driver proper are done; the interrupt driver schedules 620 * interrupt driver proper are done; the interrupt driver schedules
619 * them using rs_sched_event(), and they get done here. 621 * them using rs_sched_event(), and they get done here.
620 */ 622 */
621static void do_serial_bh(void)
622{
623 run_task_queue(&tq_zs_serial);
624}
625 623
626static void do_softint(void *private_) 624static void do_softint(unsigned long private_)
627{ 625{
628 struct dec_serial *info = (struct dec_serial *) private_; 626 struct dec_serial *info = (struct dec_serial *) private_;
629 struct tty_struct *tty; 627 struct tty_struct *tty;
@@ -634,10 +632,11 @@ static void do_softint(void *private_)
634 632
635 if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) { 633 if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
636 tty_wakeup(tty); 634 tty_wakeup(tty);
635 wake_up_interruptible(&tty->write_wait);
637 } 636 }
638} 637}
639 638
640int zs_startup(struct dec_serial * info) 639static int zs_startup(struct dec_serial * info)
641{ 640{
642 unsigned long flags; 641 unsigned long flags;
643 642
@@ -650,7 +649,7 @@ int zs_startup(struct dec_serial * info)
650 return -ENOMEM; 649 return -ENOMEM;
651 } 650 }
652 651
653 save_flags(flags); cli(); 652 spin_lock_irqsave(&zs_lock, flags);
654 653
655#ifdef SERIAL_DEBUG_OPEN 654#ifdef SERIAL_DEBUG_OPEN
656 printk("starting up ttyS%d (irq %d)...", info->line, info->irq); 655 printk("starting up ttyS%d (irq %d)...", info->line, info->irq);
@@ -706,7 +705,7 @@ int zs_startup(struct dec_serial * info)
706 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; 705 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
707 706
708 info->flags |= ZILOG_INITIALIZED; 707 info->flags |= ZILOG_INITIALIZED;
709 restore_flags(flags); 708 spin_unlock_irqrestore(&zs_lock, flags);
710 return 0; 709 return 0;
711} 710}
712 711
@@ -726,7 +725,7 @@ static void shutdown(struct dec_serial * info)
726 info->irq); 725 info->irq);
727#endif 726#endif
728 727
729 save_flags(flags); cli(); /* Disable interrupts */ 728 spin_lock_irqsave(&zs_lock, flags);
730 729
731 if (info->xmit_buf) { 730 if (info->xmit_buf) {
732 free_page((unsigned long) info->xmit_buf); 731 free_page((unsigned long) info->xmit_buf);
@@ -749,7 +748,7 @@ static void shutdown(struct dec_serial * info)
749 set_bit(TTY_IO_ERROR, &info->tty->flags); 748 set_bit(TTY_IO_ERROR, &info->tty->flags);
750 749
751 info->flags &= ~ZILOG_INITIALIZED; 750 info->flags &= ~ZILOG_INITIALIZED;
752 restore_flags(flags); 751 spin_unlock_irqrestore(&zs_lock, flags);
753} 752}
754 753
755/* 754/*
@@ -785,7 +784,7 @@ static void change_speed(struct dec_serial *info)
785 i += 15; 784 i += 15;
786 } 785 }
787 786
788 save_flags(flags); cli(); 787 spin_lock_irqsave(&zs_lock, flags);
789 info->zs_baud = baud_table[i]; 788 info->zs_baud = baud_table[i];
790 if (info->zs_baud) { 789 if (info->zs_baud) {
791 brg = BPS_TO_BRG(info->zs_baud, zs_parms->clock/info->clk_divisor); 790 brg = BPS_TO_BRG(info->zs_baud, zs_parms->clock/info->clk_divisor);
@@ -858,7 +857,7 @@ static void change_speed(struct dec_serial *info)
858 /* Load up the new values */ 857 /* Load up the new values */
859 load_zsregs(info->zs_channel, info->zs_channel->curregs); 858 load_zsregs(info->zs_channel, info->zs_channel->curregs);
860 859
861 restore_flags(flags); 860 spin_unlock_irqrestore(&zs_lock, flags);
862} 861}
863 862
864static void rs_flush_chars(struct tty_struct *tty) 863static void rs_flush_chars(struct tty_struct *tty)
@@ -874,9 +873,9 @@ static void rs_flush_chars(struct tty_struct *tty)
874 return; 873 return;
875 874
876 /* Enable transmitter */ 875 /* Enable transmitter */
877 save_flags(flags); cli(); 876 spin_lock_irqsave(&zs_lock, flags);
878 transmit_chars(info); 877 transmit_chars(info);
879 restore_flags(flags); 878 spin_unlock_irqrestore(&zs_lock, flags);
880} 879}
881 880
882static int rs_write(struct tty_struct * tty, 881static int rs_write(struct tty_struct * tty,
@@ -892,26 +891,17 @@ static int rs_write(struct tty_struct * tty,
892 if (!tty || !info->xmit_buf) 891 if (!tty || !info->xmit_buf)
893 return 0; 892 return 0;
894 893
895 save_flags(flags);
896 while (1) { 894 while (1) {
897 cli(); 895 spin_lock_irqsave(&zs_lock, flags);
898 c = min(count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, 896 c = min(count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
899 SERIAL_XMIT_SIZE - info->xmit_head)); 897 SERIAL_XMIT_SIZE - info->xmit_head));
900 if (c <= 0) 898 if (c <= 0)
901 break; 899 break;
902 900
903 if (from_user) { 901 memcpy(info->xmit_buf + info->xmit_head, buf, c);
904 down(&tmp_buf_sem);
905 copy_from_user(tmp_buf, buf, c);
906 c = min(c, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
907 SERIAL_XMIT_SIZE - info->xmit_head));
908 memcpy(info->xmit_buf + info->xmit_head, tmp_buf, c);
909 up(&tmp_buf_sem);
910 } else
911 memcpy(info->xmit_buf + info->xmit_head, buf, c);
912 info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1); 902 info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
913 info->xmit_cnt += c; 903 info->xmit_cnt += c;
914 restore_flags(flags); 904 spin_unlock_irqrestore(&zs_lock, flags);
915 buf += c; 905 buf += c;
916 count -= c; 906 count -= c;
917 total += c; 907 total += c;
@@ -920,7 +910,7 @@ static int rs_write(struct tty_struct * tty,
920 if (info->xmit_cnt && !tty->stopped && !info->tx_stopped 910 if (info->xmit_cnt && !tty->stopped && !info->tx_stopped
921 && !info->tx_active) 911 && !info->tx_active)
922 transmit_chars(info); 912 transmit_chars(info);
923 restore_flags(flags); 913 spin_unlock_irqrestore(&zs_lock, flags);
924 return total; 914 return total;
925} 915}
926 916
@@ -952,9 +942,9 @@ static void rs_flush_buffer(struct tty_struct *tty)
952 942
953 if (serial_paranoia_check(info, tty->name, "rs_flush_buffer")) 943 if (serial_paranoia_check(info, tty->name, "rs_flush_buffer"))
954 return; 944 return;
955 cli(); 945 spin_lock_irq(&zs_lock);
956 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; 946 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
957 sti(); 947 spin_unlock_irq(&zs_lock);
958 tty_wakeup(tty); 948 tty_wakeup(tty);
959} 949}
960 950
@@ -982,11 +972,11 @@ static void rs_throttle(struct tty_struct * tty)
982 return; 972 return;
983 973
984 if (I_IXOFF(tty)) { 974 if (I_IXOFF(tty)) {
985 save_flags(flags); cli(); 975 spin_lock_irqsave(&zs_lock, flags);
986 info->x_char = STOP_CHAR(tty); 976 info->x_char = STOP_CHAR(tty);
987 if (!info->tx_active) 977 if (!info->tx_active)
988 transmit_chars(info); 978 transmit_chars(info);
989 restore_flags(flags); 979 spin_unlock_irqrestore(&zs_lock, flags);
990 } 980 }
991 981
992 if (C_CRTSCTS(tty)) { 982 if (C_CRTSCTS(tty)) {
@@ -1010,7 +1000,7 @@ static void rs_unthrottle(struct tty_struct * tty)
1010 return; 1000 return;
1011 1001
1012 if (I_IXOFF(tty)) { 1002 if (I_IXOFF(tty)) {
1013 save_flags(flags); cli(); 1003 spin_lock_irqsave(&zs_lock, flags);
1014 if (info->x_char) 1004 if (info->x_char)
1015 info->x_char = 0; 1005 info->x_char = 0;
1016 else { 1006 else {
@@ -1018,7 +1008,7 @@ static void rs_unthrottle(struct tty_struct * tty)
1018 if (!info->tx_active) 1008 if (!info->tx_active)
1019 transmit_chars(info); 1009 transmit_chars(info);
1020 } 1010 }
1021 restore_flags(flags); 1011 spin_unlock_irqrestore(&zs_lock, flags);
1022 } 1012 }
1023 1013
1024 if (C_CRTSCTS(tty)) { 1014 if (C_CRTSCTS(tty)) {
@@ -1111,9 +1101,9 @@ static int get_lsr_info(struct dec_serial * info, unsigned int *value)
1111{ 1101{
1112 unsigned char status; 1102 unsigned char status;
1113 1103
1114 cli(); 1104 spin_lock(&zs_lock);
1115 status = read_zsreg(info->zs_channel, 0); 1105 status = read_zsreg(info->zs_channel, 0);
1116 sti(); 1106 spin_unlock_irq(&zs_lock);
1117 put_user(status,value); 1107 put_user(status,value);
1118 return 0; 1108 return 0;
1119} 1109}
@@ -1136,11 +1126,11 @@ static int rs_tiocmget(struct tty_struct *tty, struct file *file)
1136 if (info->zs_channel == info->zs_chan_a) 1126 if (info->zs_channel == info->zs_chan_a)
1137 result = 0; 1127 result = 0;
1138 else { 1128 else {
1139 cli(); 1129 spin_lock(&zs_lock);
1140 control = info->zs_chan_a->curregs[5]; 1130 control = info->zs_chan_a->curregs[5];
1141 status_a = read_zsreg(info->zs_chan_a, 0); 1131 status_a = read_zsreg(info->zs_chan_a, 0);
1142 status_b = read_zsreg(info->zs_channel, 0); 1132 status_b = read_zsreg(info->zs_channel, 0);
1143 sti(); 1133 spin_unlock_irq(&zs_lock);
1144 result = ((control & RTS) ? TIOCM_RTS: 0) 1134 result = ((control & RTS) ? TIOCM_RTS: 0)
1145 | ((control & DTR) ? TIOCM_DTR: 0) 1135 | ((control & DTR) ? TIOCM_DTR: 0)
1146 | ((status_b & DCD) ? TIOCM_CAR: 0) 1136 | ((status_b & DCD) ? TIOCM_CAR: 0)
@@ -1155,8 +1145,6 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
1155 unsigned int set, unsigned int clear) 1145 unsigned int set, unsigned int clear)
1156{ 1146{
1157 struct dec_serial * info = (struct dec_serial *)tty->driver_data; 1147 struct dec_serial * info = (struct dec_serial *)tty->driver_data;
1158 int error;
1159 unsigned int arg, bits;
1160 1148
1161 if (info->hook) 1149 if (info->hook)
1162 return -ENODEV; 1150 return -ENODEV;
@@ -1170,8 +1158,7 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
1170 if (info->zs_channel == info->zs_chan_a) 1158 if (info->zs_channel == info->zs_chan_a)
1171 return 0; 1159 return 0;
1172 1160
1173 get_user(arg, value); 1161 spin_lock(&zs_lock);
1174 cli();
1175 if (set & TIOCM_RTS) 1162 if (set & TIOCM_RTS)
1176 info->zs_chan_a->curregs[5] |= RTS; 1163 info->zs_chan_a->curregs[5] |= RTS;
1177 if (set & TIOCM_DTR) 1164 if (set & TIOCM_DTR)
@@ -1181,7 +1168,7 @@ static int rs_tiocmset(struct tty_struct *tty, struct file *file,
1181 if (clear & TIOCM_DTR) 1168 if (clear & TIOCM_DTR)
1182 info->zs_chan_a->curregs[5] &= ~DTR; 1169 info->zs_chan_a->curregs[5] &= ~DTR;
1183 write_zsreg(info->zs_chan_a, 5, info->zs_chan_a->curregs[5]); 1170 write_zsreg(info->zs_chan_a, 5, info->zs_chan_a->curregs[5]);
1184 sti(); 1171 spin_unlock_irq(&zs_lock);
1185 return 0; 1172 return 0;
1186} 1173}
1187 1174
@@ -1198,19 +1185,18 @@ static void rs_break(struct tty_struct *tty, int break_state)
1198 if (!info->port) 1185 if (!info->port)
1199 return; 1186 return;
1200 1187
1201 save_flags(flags); cli(); 1188 spin_lock_irqsave(&zs_lock, flags);
1202 if (break_state == -1) 1189 if (break_state == -1)
1203 info->zs_channel->curregs[5] |= SND_BRK; 1190 info->zs_channel->curregs[5] |= SND_BRK;
1204 else 1191 else
1205 info->zs_channel->curregs[5] &= ~SND_BRK; 1192 info->zs_channel->curregs[5] &= ~SND_BRK;
1206 write_zsreg(info->zs_channel, 5, info->zs_channel->curregs[5]); 1193 write_zsreg(info->zs_channel, 5, info->zs_channel->curregs[5]);
1207 restore_flags(flags); 1194 spin_unlock_irqrestore(&zs_lock, flags);
1208} 1195}
1209 1196
1210static int rs_ioctl(struct tty_struct *tty, struct file * file, 1197static int rs_ioctl(struct tty_struct *tty, struct file * file,
1211 unsigned int cmd, unsigned long arg) 1198 unsigned int cmd, unsigned long arg)
1212{ 1199{
1213 int error;
1214 struct dec_serial * info = (struct dec_serial *)tty->driver_data; 1200 struct dec_serial * info = (struct dec_serial *)tty->driver_data;
1215 1201
1216 if (info->hook) 1202 if (info->hook)
@@ -1287,10 +1273,10 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1287 if (!info || serial_paranoia_check(info, tty->name, "rs_close")) 1273 if (!info || serial_paranoia_check(info, tty->name, "rs_close"))
1288 return; 1274 return;
1289 1275
1290 save_flags(flags); cli(); 1276 spin_lock_irqsave(&zs_lock, flags);
1291 1277
1292 if (tty_hung_up_p(filp)) { 1278 if (tty_hung_up_p(filp)) {
1293 restore_flags(flags); 1279 spin_unlock_irqrestore(&zs_lock, flags);
1294 return; 1280 return;
1295 } 1281 }
1296 1282
@@ -1315,7 +1301,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1315 info->count = 0; 1301 info->count = 0;
1316 } 1302 }
1317 if (info->count) { 1303 if (info->count) {
1318 restore_flags(flags); 1304 spin_unlock_irqrestore(&zs_lock, flags);
1319 return; 1305 return;
1320 } 1306 }
1321 info->flags |= ZILOG_CLOSING; 1307 info->flags |= ZILOG_CLOSING;
@@ -1358,7 +1344,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
1358 } 1344 }
1359 info->flags &= ~(ZILOG_NORMAL_ACTIVE|ZILOG_CLOSING); 1345 info->flags &= ~(ZILOG_NORMAL_ACTIVE|ZILOG_CLOSING);
1360 wake_up_interruptible(&info->close_wait); 1346 wake_up_interruptible(&info->close_wait);
1361 restore_flags(flags); 1347 spin_unlock_irqrestore(&zs_lock, flags);
1362} 1348}
1363 1349
1364/* 1350/*
@@ -1398,7 +1384,7 @@ static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
1398/* 1384/*
1399 * rs_hangup() --- called by tty_hangup() when a hangup is signaled. 1385 * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
1400 */ 1386 */
1401void rs_hangup(struct tty_struct *tty) 1387static void rs_hangup(struct tty_struct *tty)
1402{ 1388{
1403 struct dec_serial * info = (struct dec_serial *)tty->driver_data; 1389 struct dec_serial * info = (struct dec_serial *)tty->driver_data;
1404 1390
@@ -1466,16 +1452,16 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1466 printk("block_til_ready before block: ttyS%d, count = %d\n", 1452 printk("block_til_ready before block: ttyS%d, count = %d\n",
1467 info->line, info->count); 1453 info->line, info->count);
1468#endif 1454#endif
1469 cli(); 1455 spin_lock(&zs_lock);
1470 if (!tty_hung_up_p(filp)) 1456 if (!tty_hung_up_p(filp))
1471 info->count--; 1457 info->count--;
1472 sti(); 1458 spin_unlock_irq(&zs_lock);
1473 info->blocked_open++; 1459 info->blocked_open++;
1474 while (1) { 1460 while (1) {
1475 cli(); 1461 spin_lock(&zs_lock);
1476 if (tty->termios->c_cflag & CBAUD) 1462 if (tty->termios->c_cflag & CBAUD)
1477 zs_rtsdtr(info, RTS | DTR, 1); 1463 zs_rtsdtr(info, RTS | DTR, 1);
1478 sti(); 1464 spin_unlock_irq(&zs_lock);
1479 set_current_state(TASK_INTERRUPTIBLE); 1465 set_current_state(TASK_INTERRUPTIBLE);
1480 if (tty_hung_up_p(filp) || 1466 if (tty_hung_up_p(filp) ||
1481 !(info->flags & ZILOG_INITIALIZED)) { 1467 !(info->flags & ZILOG_INITIALIZED)) {
@@ -1523,7 +1509,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
1523 * the IRQ chain. It also performs the serial-specific 1509 * the IRQ chain. It also performs the serial-specific
1524 * initialization for the tty structure. 1510 * initialization for the tty structure.
1525 */ 1511 */
1526int rs_open(struct tty_struct *tty, struct file * filp) 1512static int rs_open(struct tty_struct *tty, struct file * filp)
1527{ 1513{
1528 struct dec_serial *info; 1514 struct dec_serial *info;
1529 int retval, line; 1515 int retval, line;
@@ -1706,7 +1692,7 @@ static void __init probe_sccs(void)
1706 } 1692 }
1707 } 1693 }
1708 1694
1709 save_and_cli(flags); 1695 spin_lock_irqsave(&zs_lock, flags);
1710 for (n = 0; n < zs_channels_found; n++) { 1696 for (n = 0; n < zs_channels_found; n++) {
1711 if (n % 2 == 0) { 1697 if (n % 2 == 0) {
1712 write_zsreg(zs_soft[n].zs_chan_a, R9, FHWRES); 1698 write_zsreg(zs_soft[n].zs_chan_a, R9, FHWRES);
@@ -1716,7 +1702,7 @@ static void __init probe_sccs(void)
1716 load_zsregs(zs_soft[n].zs_channel, 1702 load_zsregs(zs_soft[n].zs_channel,
1717 zs_soft[n].zs_channel->curregs); 1703 zs_soft[n].zs_channel->curregs);
1718 } 1704 }
1719 restore_flags(flags); 1705 spin_unlock_irqrestore(&zs_lock, flags);
1720} 1706}
1721 1707
1722static struct tty_operations serial_ops = { 1708static struct tty_operations serial_ops = {
@@ -1749,9 +1735,6 @@ int __init zs_init(void)
1749 if(!BUS_PRESENT) 1735 if(!BUS_PRESENT)
1750 return -ENODEV; 1736 return -ENODEV;
1751 1737
1752 /* Setup base handler, and timer table. */
1753 init_bh(SERIAL_BH, do_serial_bh);
1754
1755 /* Find out how many Z8530 SCCs we have */ 1738 /* Find out how many Z8530 SCCs we have */
1756 if (zs_chain == 0) 1739 if (zs_chain == 0)
1757 probe_sccs(); 1740 probe_sccs();
@@ -1800,8 +1783,7 @@ int __init zs_init(void)
1800 info->event = 0; 1783 info->event = 0;
1801 info->count = 0; 1784 info->count = 0;
1802 info->blocked_open = 0; 1785 info->blocked_open = 0;
1803 info->tqueue.routine = do_softint; 1786 tasklet_init(&info->tlet, do_softint, (unsigned long)info);
1804 info->tqueue.data = info;
1805 init_waitqueue_head(&info->open_wait); 1787 init_waitqueue_head(&info->open_wait);
1806 init_waitqueue_head(&info->close_wait); 1788 init_waitqueue_head(&info->close_wait);
1807 printk("ttyS%02d at 0x%08x (irq = %d) is a Z85C30 SCC\n", 1789 printk("ttyS%02d at 0x%08x (irq = %d) is a Z85C30 SCC\n",
@@ -1833,8 +1815,7 @@ int __init zs_init(void)
1833/* 1815/*
1834 * polling I/O routines 1816 * polling I/O routines
1835 */ 1817 */
1836static int 1818static int zs_poll_tx_char(void *handle, unsigned char ch)
1837zs_poll_tx_char(void *handle, unsigned char ch)
1838{ 1819{
1839 struct dec_serial *info = handle; 1820 struct dec_serial *info = handle;
1840 struct dec_zschannel *chan = info->zs_channel; 1821 struct dec_zschannel *chan = info->zs_channel;
@@ -1857,8 +1838,7 @@ zs_poll_tx_char(void *handle, unsigned char ch)
1857 return -ENODEV; 1838 return -ENODEV;
1858} 1839}
1859 1840
1860static int 1841static int zs_poll_rx_char(void *handle)
1861zs_poll_rx_char(void *handle)
1862{ 1842{
1863 struct dec_serial *info = handle; 1843 struct dec_serial *info = handle;
1864 struct dec_zschannel *chan = info->zs_channel; 1844 struct dec_zschannel *chan = info->zs_channel;
@@ -2037,7 +2017,7 @@ static int __init serial_console_setup(struct console *co, char *options)
2037 } 2017 }
2038 co->cflag = cflag; 2018 co->cflag = cflag;
2039 2019
2040 save_and_cli(flags); 2020 spin_lock_irqsave(&zs_lock, flags);
2041 2021
2042 /* 2022 /*
2043 * Set up the baud rate generator. 2023 * Set up the baud rate generator.
@@ -2092,7 +2072,7 @@ static int __init serial_console_setup(struct console *co, char *options)
2092 zs_soft[co->index].clk_divisor = clk_divisor; 2072 zs_soft[co->index].clk_divisor = clk_divisor;
2093 zs_soft[co->index].zs_baud = get_zsbaud(&zs_soft[co->index]); 2073 zs_soft[co->index].zs_baud = get_zsbaud(&zs_soft[co->index]);
2094 2074
2095 restore_flags(flags); 2075 spin_unlock_irqrestore(&zs_lock, flags);
2096 2076
2097 return 0; 2077 return 0;
2098} 2078}
@@ -2229,5 +2209,3 @@ void __init zs_kgdb_hook(int tty_num)
2229 set_debug_traps(); /* init stub */ 2209 set_debug_traps(); /* init stub */
2230} 2210}
2231#endif /* ifdef CONFIG_KGDB */ 2211#endif /* ifdef CONFIG_KGDB */
2232
2233
diff --git a/drivers/tc/zs.h b/drivers/tc/zs.h
index c52edffa6049..13512200ceba 100644
--- a/drivers/tc/zs.h
+++ b/drivers/tc/zs.h
@@ -6,14 +6,14 @@
6 * 6 *
7 * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au) 7 * Copyright (C) 1996 Paul Mackerras (Paul.Mackerras@cs.anu.edu.au)
8 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 8 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
9 * Copyright (C) 2004 Maciej W. Rozycki 9 * Copyright (C) 2004, 2005 Maciej W. Rozycki
10 */ 10 */
11#ifndef _DECSERIAL_H 11#ifndef _DECSERIAL_H
12#define _DECSERIAL_H 12#define _DECSERIAL_H
13 13
14#include <asm/dec/serial.h> 14#include <asm/dec/serial.h>
15 15
16#define NUM_ZSREGS 16 16#define NUM_ZSREGS 16
17 17
18struct serial_struct { 18struct serial_struct {
19 int type; 19 int type;
@@ -139,8 +139,7 @@ struct dec_serial {
139 int xmit_head; 139 int xmit_head;
140 int xmit_tail; 140 int xmit_tail;
141 int xmit_cnt; 141 int xmit_cnt;
142 struct tq_struct tqueue; 142 struct tasklet_struct tlet;
143 struct tq_struct tqueue_hangup;
144 wait_queue_head_t open_wait; 143 wait_queue_head_t open_wait;
145 wait_queue_head_t close_wait; 144 wait_queue_head_t close_wait;
146}; 145};
@@ -282,7 +281,7 @@ struct dec_serial {
282#define DLC 4 /* Disable Lower Chain */ 281#define DLC 4 /* Disable Lower Chain */
283#define MIE 8 /* Master Interrupt Enable */ 282#define MIE 8 /* Master Interrupt Enable */
284#define STATHI 0x10 /* Status high */ 283#define STATHI 0x10 /* Status high */
285#define SOFTACK 0x20 /* Software Interrupt Acknowledge */ 284#define SOFTACK 0x20 /* Software Interrupt Acknowledge */
286#define NORESET 0 /* No reset on write to R9 */ 285#define NORESET 0 /* No reset on write to R9 */
287#define CHRB 0x40 /* Reset channel B */ 286#define CHRB 0x40 /* Reset channel B */
288#define CHRA 0x80 /* Reset channel A */ 287#define CHRA 0x80 /* Reset channel A */
@@ -395,8 +394,8 @@ struct dec_serial {
395/* Read Register 15 (value of WR 15) */ 394/* Read Register 15 (value of WR 15) */
396 395
397/* Misc macros */ 396/* Misc macros */
398#define ZS_CLEARERR(channel) (write_zsreg(channel, 0, ERR_RES)) 397#define ZS_CLEARERR(channel) (write_zsreg(channel, 0, ERR_RES))
399#define ZS_CLEARFIFO(channel) do { volatile unsigned char garbage; \ 398#define ZS_CLEARFIFO(channel) do { volatile unsigned char garbage; \
400 garbage = read_zsdata(channel); \ 399 garbage = read_zsdata(channel); \
401 garbage = read_zsdata(channel); \ 400 garbage = read_zsdata(channel); \
402 garbage = read_zsdata(channel); \ 401 garbage = read_zsdata(channel); \
diff --git a/drivers/usb/atm/Makefile b/drivers/usb/atm/Makefile
index 751f297be2ef..85099718c683 100644
--- a/drivers/usb/atm/Makefile
+++ b/drivers/usb/atm/Makefile
@@ -6,3 +6,7 @@ obj-$(CONFIG_USB_CXACRU) += cxacru.o
6obj-$(CONFIG_USB_SPEEDTOUCH) += speedtch.o 6obj-$(CONFIG_USB_SPEEDTOUCH) += speedtch.o
7obj-$(CONFIG_USB_ATM) += usbatm.o 7obj-$(CONFIG_USB_ATM) += usbatm.o
8obj-$(CONFIG_USB_XUSBATM) += xusbatm.o 8obj-$(CONFIG_USB_XUSBATM) += xusbatm.o
9
10ifeq ($(CONFIG_USB_DEBUG),y)
11EXTRA_CFLAGS += -DDEBUG
12endif
diff --git a/drivers/usb/atm/usbatm.h b/drivers/usb/atm/usbatm.h
index 936646457935..1adacd60d713 100644
--- a/drivers/usb/atm/usbatm.h
+++ b/drivers/usb/atm/usbatm.h
@@ -27,14 +27,9 @@
27#include <linux/config.h> 27#include <linux/config.h>
28 28
29/* 29/*
30#define DEBUG
31#define VERBOSE_DEBUG 30#define VERBOSE_DEBUG
32*/ 31*/
33 32
34#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG)
35# define DEBUG
36#endif
37
38#include <asm/semaphore.h> 33#include <asm/semaphore.h>
39#include <linux/atm.h> 34#include <linux/atm.h>
40#include <linux/atmdev.h> 35#include <linux/atmdev.h>
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index dd1c4d2a0c31..86d5c380892d 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -14,3 +14,7 @@ ifeq ($(CONFIG_USB_DEVICEFS),y)
14endif 14endif
15 15
16obj-$(CONFIG_USB) += usbcore.o 16obj-$(CONFIG_USB) += usbcore.o
17
18ifeq ($(CONFIG_USB_DEBUG),y)
19EXTRA_CFLAGS += -DDEBUG
20endif
diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c
index 57e800ac3cee..419c9943a7cb 100644
--- a/drivers/usb/core/buffer.c
+++ b/drivers/usb/core/buffer.c
@@ -15,14 +15,6 @@
15#include <asm/scatterlist.h> 15#include <asm/scatterlist.h>
16#include <linux/dma-mapping.h> 16#include <linux/dma-mapping.h>
17#include <linux/dmapool.h> 17#include <linux/dmapool.h>
18
19
20#ifdef CONFIG_USB_DEBUG
21 #define DEBUG
22#else
23 #undef DEBUG
24#endif
25
26#include <linux/usb.h> 18#include <linux/usb.h>
27#include "hcd.h" 19#include "hcd.h"
28 20
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c
index 993019500cc3..a9d89c78cc20 100644
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -1,9 +1,4 @@
1#include <linux/config.h> 1#include <linux/config.h>
2
3#ifdef CONFIG_USB_DEBUG
4#define DEBUG
5#endif
6
7#include <linux/usb.h> 2#include <linux/usb.h>
8#include <linux/module.h> 3#include <linux/module.h>
9#include <linux/init.h> 4#include <linux/init.h>
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index 942cd437dc48..b1d6e9af732d 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -1392,13 +1392,13 @@ static int proc_ioctl_default(struct dev_state *ps, void __user *arg)
1392} 1392}
1393 1393
1394#ifdef CONFIG_COMPAT 1394#ifdef CONFIG_COMPAT
1395static int proc_ioctl_compat(struct dev_state *ps, void __user *arg) 1395static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
1396{ 1396{
1397 struct usbdevfs_ioctl32 __user *uioc; 1397 struct usbdevfs_ioctl32 __user *uioc;
1398 struct usbdevfs_ioctl ctrl; 1398 struct usbdevfs_ioctl ctrl;
1399 u32 udata; 1399 u32 udata;
1400 1400
1401 uioc = compat_ptr(arg); 1401 uioc = compat_ptr((long)arg);
1402 if (get_user(ctrl.ifno, &uioc->ifno) || 1402 if (get_user(ctrl.ifno, &uioc->ifno) ||
1403 get_user(ctrl.ioctl_code, &uioc->ioctl_code) || 1403 get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
1404 __get_user(udata, &uioc->data)) 1404 __get_user(udata, &uioc->data))
@@ -1511,7 +1511,7 @@ static int usbdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
1511 1511
1512 case USBDEVFS_IOCTL32: 1512 case USBDEVFS_IOCTL32:
1513 snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__); 1513 snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__);
1514 ret = proc_ioctl_compat(ps, p); 1514 ret = proc_ioctl_compat(ps, (compat_uptr_t)(long)p);
1515 break; 1515 break;
1516#endif 1516#endif
1517 1517
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c
index e695308095ae..37b13368c814 100644
--- a/drivers/usb/core/file.c
+++ b/drivers/usb/core/file.c
@@ -19,12 +19,6 @@
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/spinlock.h> 20#include <linux/spinlock.h>
21#include <linux/errno.h> 21#include <linux/errno.h>
22
23#ifdef CONFIG_USB_DEBUG
24 #define DEBUG
25#else
26 #undef DEBUG
27#endif
28#include <linux/usb.h> 22#include <linux/usb.h>
29 23
30#include "usb.h" 24#include "usb.h"
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
index 84d9e69329bb..7feb829362d6 100644
--- a/drivers/usb/core/hcd-pci.c
+++ b/drivers/usb/core/hcd-pci.c
@@ -17,13 +17,6 @@
17 */ 17 */
18 18
19#include <linux/config.h> 19#include <linux/config.h>
20
21#ifdef CONFIG_USB_DEBUG
22 #define DEBUG
23#else
24 #undef DEBUG
25#endif
26
27#include <linux/kernel.h> 20#include <linux/kernel.h>
28#include <linux/module.h> 21#include <linux/module.h>
29#include <linux/pci.h> 22#include <linux/pci.h>
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 6c7ca5b08cd6..5e5f65a475ab 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -23,11 +23,6 @@
23 */ 23 */
24 24
25#include <linux/config.h> 25#include <linux/config.h>
26
27#ifdef CONFIG_USB_DEBUG
28#define DEBUG
29#endif
30
31#include <linux/module.h> 26#include <linux/module.h>
32#include <linux/version.h> 27#include <linux/version.h>
33#include <linux/kernel.h> 28#include <linux/kernel.h>
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 256d9f698715..840727948d84 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -9,11 +9,6 @@
9 */ 9 */
10 10
11#include <linux/config.h> 11#include <linux/config.h>
12#ifdef CONFIG_USB_DEBUG
13 #define DEBUG
14#else
15 #undef DEBUG
16#endif
17#include <linux/kernel.h> 12#include <linux/kernel.h>
18#include <linux/errno.h> 13#include <linux/errno.h>
19#include <linux/module.h> 14#include <linux/module.h>
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c
index 12f490fdee8f..c44bbedec817 100644
--- a/drivers/usb/core/inode.c
+++ b/drivers/usb/core/inode.c
@@ -46,7 +46,6 @@
46 46
47static struct super_operations usbfs_ops; 47static struct super_operations usbfs_ops;
48static struct file_operations default_file_operations; 48static struct file_operations default_file_operations;
49static struct inode_operations usbfs_dir_inode_operations;
50static struct vfsmount *usbfs_mount; 49static struct vfsmount *usbfs_mount;
51static int usbfs_mount_count; /* = 0 */ 50static int usbfs_mount_count; /* = 0 */
52static int ignore_mount = 0; 51static int ignore_mount = 0;
@@ -262,7 +261,7 @@ static struct inode *usbfs_get_inode (struct super_block *sb, int mode, dev_t de
262 inode->i_fop = &default_file_operations; 261 inode->i_fop = &default_file_operations;
263 break; 262 break;
264 case S_IFDIR: 263 case S_IFDIR:
265 inode->i_op = &usbfs_dir_inode_operations; 264 inode->i_op = &simple_dir_inode_operations;
266 inode->i_fop = &simple_dir_operations; 265 inode->i_fop = &simple_dir_operations;
267 266
268 /* directory inodes start off with i_nlink == 2 (for "." entry) */ 267 /* directory inodes start off with i_nlink == 2 (for "." entry) */
@@ -417,10 +416,6 @@ static struct file_operations default_file_operations = {
417 .llseek = default_file_lseek, 416 .llseek = default_file_lseek,
418}; 417};
419 418
420static struct inode_operations usbfs_dir_inode_operations = {
421 .lookup = simple_lookup,
422};
423
424static struct super_operations usbfs_ops = { 419static struct super_operations usbfs_ops = {
425 .statfs = simple_statfs, 420 .statfs = simple_statfs,
426 .drop_inode = generic_delete_inode, 421 .drop_inode = generic_delete_inode,
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 644a3d4f12aa..fe74f99ca5f4 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -3,13 +3,6 @@
3 */ 3 */
4 4
5#include <linux/config.h> 5#include <linux/config.h>
6
7#ifdef CONFIG_USB_DEBUG
8 #define DEBUG
9#else
10 #undef DEBUG
11#endif
12
13#include <linux/pci.h> /* for scatterlist macros */ 6#include <linux/pci.h> /* for scatterlist macros */
14#include <linux/usb.h> 7#include <linux/usb.h>
15#include <linux/module.h> 8#include <linux/module.h>
@@ -1457,12 +1450,11 @@ free_interfaces:
1457 */ 1450 */
1458 for (i = 0; i < nintf; ++i) { 1451 for (i = 0; i < nintf; ++i) {
1459 struct usb_interface *intf = cp->interface[i]; 1452 struct usb_interface *intf = cp->interface[i];
1460 struct usb_host_interface *alt = intf->cur_altsetting;
1461 1453
1462 dev_dbg (&dev->dev, 1454 dev_dbg (&dev->dev,
1463 "adding %s (config #%d, interface %d)\n", 1455 "adding %s (config #%d, interface %d)\n",
1464 intf->dev.bus_id, configuration, 1456 intf->dev.bus_id, configuration,
1465 alt->desc.bInterfaceNumber); 1457 intf->cur_altsetting->desc.bInterfaceNumber);
1466 ret = device_add (&intf->dev); 1458 ret = device_add (&intf->dev);
1467 if (ret != 0) { 1459 if (ret != 0) {
1468 dev_err(&dev->dev, 1460 dev_err(&dev->dev,
diff --git a/drivers/usb/core/notify.c b/drivers/usb/core/notify.c
index 37da059eced7..fbbebab52fbd 100644
--- a/drivers/usb/core/notify.c
+++ b/drivers/usb/core/notify.c
@@ -12,13 +12,7 @@
12#include <linux/config.h> 12#include <linux/config.h>
13#include <linux/kernel.h> 13#include <linux/kernel.h>
14#include <linux/notifier.h> 14#include <linux/notifier.h>
15#ifdef CONFIG_USB_DEBUG
16 #define DEBUG
17#else
18 #undef DEBUG
19#endif
20#include <linux/usb.h> 15#include <linux/usb.h>
21
22#include "usb.h" 16#include "usb.h"
23 17
24 18
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
index edd83e014452..71d881327e88 100644
--- a/drivers/usb/core/sysfs.c
+++ b/drivers/usb/core/sysfs.c
@@ -12,14 +12,7 @@
12 12
13#include <linux/config.h> 13#include <linux/config.h>
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15
16#ifdef CONFIG_USB_DEBUG
17 #define DEBUG
18#else
19 #undef DEBUG
20#endif
21#include <linux/usb.h> 15#include <linux/usb.h>
22
23#include "usb.h" 16#include "usb.h"
24 17
25/* endpoint stuff */ 18/* endpoint stuff */
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index f2a1fed2a802..081796726b95 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -4,12 +4,6 @@
4#include <linux/bitops.h> 4#include <linux/bitops.h>
5#include <linux/slab.h> 5#include <linux/slab.h>
6#include <linux/init.h> 6#include <linux/init.h>
7
8#ifdef CONFIG_USB_DEBUG
9 #define DEBUG
10#else
11 #undef DEBUG
12#endif
13#include <linux/usb.h> 7#include <linux/usb.h>
14#include "hcd.h" 8#include "hcd.h"
15 9
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 0eefff7bcb3c..e197ce9353de 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -22,13 +22,6 @@
22 */ 22 */
23 23
24#include <linux/config.h> 24#include <linux/config.h>
25
26#ifdef CONFIG_USB_DEBUG
27 #define DEBUG
28#else
29 #undef DEBUG
30#endif
31
32#include <linux/module.h> 25#include <linux/module.h>
33#include <linux/string.h> 26#include <linux/string.h>
34#include <linux/bitops.h> 27#include <linux/bitops.h>
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index 1e407745c115..c655d46c8aed 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -944,7 +944,7 @@ static int dummy_udc_suspend (struct platform_device *dev, pm_message_t state)
944 set_link_state (dum); 944 set_link_state (dum);
945 spin_unlock_irq (&dum->lock); 945 spin_unlock_irq (&dum->lock);
946 946
947 dev->power.power_state = state; 947 dev->dev.power.power_state = state;
948 usb_hcd_poll_rh_status (dummy_to_hcd (dum)); 948 usb_hcd_poll_rh_status (dummy_to_hcd (dum));
949 return 0; 949 return 0;
950} 950}
@@ -1904,7 +1904,7 @@ static int dummy_hcd_probe (struct platform_device *dev)
1904 struct usb_hcd *hcd; 1904 struct usb_hcd *hcd;
1905 int retval; 1905 int retval;
1906 1906
1907 dev_info (dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); 1907 dev_info(&dev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
1908 1908
1909 hcd = usb_create_hcd (&dummy_hcd, &dev->dev, dev->dev.bus_id); 1909 hcd = usb_create_hcd (&dummy_hcd, &dev->dev, dev->dev.bus_id);
1910 if (!hcd) 1910 if (!hcd)
diff --git a/drivers/usb/host/ohci-lh7a404.c b/drivers/usb/host/ohci-lh7a404.c
index 081ec3f5cff4..3959ccc88332 100644
--- a/drivers/usb/host/ohci-lh7a404.c
+++ b/drivers/usb/host/ohci-lh7a404.c
@@ -219,7 +219,7 @@ static int ohci_hcd_lh7a404_drv_probe(struct platform_device *pdev)
219 219
220static int ohci_hcd_lh7a404_drv_remove(struct platform_device *pdev) 220static int ohci_hcd_lh7a404_drv_remove(struct platform_device *pdev)
221{ 221{
222 struct usb_hcd *hcd = platform_get_drvdata(dev); 222 struct usb_hcd *hcd = platform_get_drvdata(pdev);
223 223
224 usb_hcd_lh7a404_remove(hcd, pdev); 224 usb_hcd_lh7a404_remove(hcd, pdev);
225 return 0; 225 return 0;
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c
index 18755766e406..2ec6a78bd65e 100644
--- a/drivers/usb/host/ohci-ppc-soc.c
+++ b/drivers/usb/host/ohci-ppc-soc.c
@@ -185,7 +185,7 @@ static int ohci_hcd_ppc_soc_drv_probe(struct platform_device *pdev)
185 185
186static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev) 186static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev)
187{ 187{
188 struct usb_hcd *hcd = platform_get_drvdata(dev); 188 struct usb_hcd *hcd = platform_get_drvdata(pdev);
189 189
190 usb_hcd_ppc_soc_remove(hcd, pdev); 190 usb_hcd_ppc_soc_remove(hcd, pdev);
191 return 0; 191 return 0;
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c
index 61a2604cce4f..950543aa5ac7 100644
--- a/drivers/usb/image/microtek.c
+++ b/drivers/usb/image/microtek.c
@@ -327,6 +327,18 @@ static inline void mts_urb_abort(struct mts_desc* desc) {
327 usb_kill_urb( desc->urb ); 327 usb_kill_urb( desc->urb );
328} 328}
329 329
330static int mts_slave_alloc (struct scsi_device *s)
331{
332 s->inquiry_len = 0x24;
333 return 0;
334}
335
336static int mts_slave_configure (struct scsi_device *s)
337{
338 blk_queue_dma_alignment(s->request_queue, (512 - 1));
339 return 0;
340}
341
330static int mts_scsi_abort (Scsi_Cmnd *srb) 342static int mts_scsi_abort (Scsi_Cmnd *srb)
331{ 343{
332 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); 344 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]);
@@ -411,7 +423,7 @@ static void mts_transfer_done( struct urb *transfer, struct pt_regs *regs )
411 MTS_INT_INIT(); 423 MTS_INT_INIT();
412 424
413 context->srb->result &= MTS_SCSI_ERR_MASK; 425 context->srb->result &= MTS_SCSI_ERR_MASK;
414 context->srb->result |= (unsigned)context->status<<1; 426 context->srb->result |= (unsigned)(*context->scsi_status)<<1;
415 427
416 mts_transfer_cleanup(transfer); 428 mts_transfer_cleanup(transfer);
417 429
@@ -427,7 +439,7 @@ static void mts_get_status( struct urb *transfer )
427 mts_int_submit_urb(transfer, 439 mts_int_submit_urb(transfer,
428 usb_rcvbulkpipe(context->instance->usb_dev, 440 usb_rcvbulkpipe(context->instance->usb_dev,
429 context->instance->ep_response), 441 context->instance->ep_response),
430 &context->status, 442 context->scsi_status,
431 1, 443 1,
432 mts_transfer_done ); 444 mts_transfer_done );
433} 445}
@@ -481,7 +493,7 @@ static void mts_command_done( struct urb *transfer, struct pt_regs *regs )
481 context->data_pipe, 493 context->data_pipe,
482 context->data, 494 context->data,
483 context->data_length, 495 context->data_length,
484 context->srb->use_sg ? mts_do_sg : mts_data_done); 496 context->srb->use_sg > 1 ? mts_do_sg : mts_data_done);
485 } else { 497 } else {
486 mts_get_status(transfer); 498 mts_get_status(transfer);
487 } 499 }
@@ -627,7 +639,6 @@ int mts_scsi_queuecommand( Scsi_Cmnd *srb, mts_scsi_cmnd_callback callback )
627 callback(srb); 639 callback(srb);
628 640
629 } 641 }
630
631out: 642out:
632 return err; 643 return err;
633} 644}
@@ -645,6 +656,9 @@ static struct scsi_host_template mts_scsi_host_template = {
645 .cmd_per_lun = 1, 656 .cmd_per_lun = 1,
646 .use_clustering = 1, 657 .use_clustering = 1,
647 .emulated = 1, 658 .emulated = 1,
659 .slave_alloc = mts_slave_alloc,
660 .slave_configure = mts_slave_configure,
661 .max_sectors= 256, /* 128 K */
648}; 662};
649 663
650struct vendor_product 664struct vendor_product
@@ -771,8 +785,8 @@ static int mts_usb_probe(struct usb_interface *intf,
771 MTS_WARNING( "couldn't find an output bulk endpoint. Bailing out.\n" ); 785 MTS_WARNING( "couldn't find an output bulk endpoint. Bailing out.\n" );
772 return -ENODEV; 786 return -ENODEV;
773 } 787 }
774 788
775 789
776 new_desc = kzalloc(sizeof(struct mts_desc), GFP_KERNEL); 790 new_desc = kzalloc(sizeof(struct mts_desc), GFP_KERNEL);
777 if (!new_desc) 791 if (!new_desc)
778 goto out; 792 goto out;
@@ -781,6 +795,10 @@ static int mts_usb_probe(struct usb_interface *intf,
781 if (!new_desc->urb) 795 if (!new_desc->urb)
782 goto out_kfree; 796 goto out_kfree;
783 797
798 new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL);
799 if (!new_desc->context.scsi_status)
800 goto out_kfree2;
801
784 new_desc->usb_dev = dev; 802 new_desc->usb_dev = dev;
785 new_desc->usb_intf = intf; 803 new_desc->usb_intf = intf;
786 init_MUTEX(&new_desc->lock); 804 init_MUTEX(&new_desc->lock);
@@ -817,6 +835,8 @@ static int mts_usb_probe(struct usb_interface *intf,
817 usb_set_intfdata(intf, new_desc); 835 usb_set_intfdata(intf, new_desc);
818 return 0; 836 return 0;
819 837
838 out_kfree2:
839 kfree(new_desc->context.scsi_status);
820 out_free_urb: 840 out_free_urb:
821 usb_free_urb(new_desc->urb); 841 usb_free_urb(new_desc->urb);
822 out_kfree: 842 out_kfree:
@@ -836,6 +856,7 @@ static void mts_usb_disconnect (struct usb_interface *intf)
836 856
837 scsi_host_put(desc->host); 857 scsi_host_put(desc->host);
838 usb_free_urb(desc->urb); 858 usb_free_urb(desc->urb);
859 kfree(desc->context.scsi_status);
839 kfree(desc); 860 kfree(desc);
840} 861}
841 862
@@ -856,5 +877,3 @@ module_exit(microtek_drv_exit);
856MODULE_AUTHOR( DRIVER_AUTHOR ); 877MODULE_AUTHOR( DRIVER_AUTHOR );
857MODULE_DESCRIPTION( DRIVER_DESC ); 878MODULE_DESCRIPTION( DRIVER_DESC );
858MODULE_LICENSE("GPL"); 879MODULE_LICENSE("GPL");
859
860
diff --git a/drivers/usb/image/microtek.h b/drivers/usb/image/microtek.h
index 3271deb8c001..926d4bdc6746 100644
--- a/drivers/usb/image/microtek.h
+++ b/drivers/usb/image/microtek.h
@@ -22,7 +22,7 @@ struct mts_transfer_context
22 int data_pipe; 22 int data_pipe;
23 int fragment; 23 int fragment;
24 24
25 u8 status; /* status returned from ep_response after command completion */ 25 u8 *scsi_status; /* status returned from ep_response after command completion */
26}; 26};
27 27
28 28
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
index 5e03b93f29f6..07cb17db42fc 100644
--- a/drivers/usb/input/Makefile
+++ b/drivers/usb/input/Makefile
@@ -42,3 +42,7 @@ obj-$(CONFIG_USB_ACECAD) += acecad.o
42obj-$(CONFIG_USB_YEALINK) += yealink.o 42obj-$(CONFIG_USB_YEALINK) += yealink.o
43obj-$(CONFIG_USB_XPAD) += xpad.o 43obj-$(CONFIG_USB_XPAD) += xpad.o
44obj-$(CONFIG_USB_APPLETOUCH) += appletouch.o 44obj-$(CONFIG_USB_APPLETOUCH) += appletouch.o
45
46ifeq ($(CONFIG_USB_DEBUG),y)
47EXTRA_CFLAGS += -DDEBUG
48endif
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index 79ddce4555ab..45f3130fadea 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -1318,6 +1318,7 @@ void hid_init_reports(struct hid_device *hid)
1318#define USB_DEVICE_ID_WACOM_PTU 0x0003 1318#define USB_DEVICE_ID_WACOM_PTU 0x0003
1319#define USB_DEVICE_ID_WACOM_INTUOS3 0x00B0 1319#define USB_DEVICE_ID_WACOM_INTUOS3 0x00B0
1320#define USB_DEVICE_ID_WACOM_CINTIQ 0x003F 1320#define USB_DEVICE_ID_WACOM_CINTIQ 0x003F
1321#define USB_DEVICE_ID_WACOM_DTF 0x00C0
1321 1322
1322#define USB_VENDOR_ID_ACECAD 0x0460 1323#define USB_VENDOR_ID_ACECAD 0x0460
1323#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004 1324#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004
@@ -1524,6 +1525,9 @@ static struct hid_blacklist {
1524 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 3, HID_QUIRK_IGNORE }, 1525 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 3, HID_QUIRK_IGNORE },
1525 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 4, HID_QUIRK_IGNORE }, 1526 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 4, HID_QUIRK_IGNORE },
1526 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 5, HID_QUIRK_IGNORE }, 1527 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 5, HID_QUIRK_IGNORE },
1528 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 7, HID_QUIRK_IGNORE },
1529 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 8, HID_QUIRK_IGNORE },
1530 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PL + 9, HID_QUIRK_IGNORE },
1527 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 1, HID_QUIRK_IGNORE }, 1531 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 1, HID_QUIRK_IGNORE },
1528 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 2, HID_QUIRK_IGNORE }, 1532 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 2, HID_QUIRK_IGNORE },
1529 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 3, HID_QUIRK_IGNORE }, 1533 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 3, HID_QUIRK_IGNORE },
@@ -1531,11 +1535,19 @@ static struct hid_blacklist {
1531 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 5, HID_QUIRK_IGNORE }, 1535 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 5, HID_QUIRK_IGNORE },
1532 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE }, 1536 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE },
1533 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE }, 1537 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE },
1538 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 1, HID_QUIRK_IGNORE },
1539 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 2, HID_QUIRK_IGNORE },
1540 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 3, HID_QUIRK_IGNORE },
1541 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO + 4, HID_QUIRK_IGNORE },
1542 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 5, HID_QUIRK_IGNORE },
1543 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 6, HID_QUIRK_IGNORE },
1534 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE }, 1544 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE },
1535 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE }, 1545 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE },
1536 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE }, 1546 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE },
1537 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE }, 1547 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE },
1548 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 5, HID_QUIRK_IGNORE },
1538 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE }, 1549 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE },
1550 { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF, HID_QUIRK_IGNORE },
1539 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, 1551 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
1540 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, 1552 { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE },
1541 1553
diff --git a/drivers/usb/input/itmtouch.c b/drivers/usb/input/itmtouch.c
index 3b581853cf10..4a50acb39d29 100644
--- a/drivers/usb/input/itmtouch.c
+++ b/drivers/usb/input/itmtouch.c
@@ -40,13 +40,6 @@
40 *****************************************************************************/ 40 *****************************************************************************/
41 41
42#include <linux/config.h> 42#include <linux/config.h>
43
44#ifdef CONFIG_USB_DEBUG
45 #define DEBUG
46#else
47 #undef DEBUG
48#endif
49
50#include <linux/kernel.h> 43#include <linux/kernel.h>
51#include <linux/slab.h> 44#include <linux/slab.h>
52#include <linux/input.h> 45#include <linux/input.h>
diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c
index 5b8d65f62abf..a32cfe51b77d 100644
--- a/drivers/usb/input/keyspan_remote.c
+++ b/drivers/usb/input/keyspan_remote.c
@@ -160,7 +160,8 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed)
160 * though so it's not too big a deal 160 * though so it's not too big a deal
161 */ 161 */
162 if (dev->data.pos >= dev->data.len) { 162 if (dev->data.pos >= dev->data.len) {
163 dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n", 163 dev_dbg(&dev->udev->dev,
164 "%s - Error ran out of data. pos: %d, len: %d\n",
164 __FUNCTION__, dev->data.pos, dev->data.len); 165 __FUNCTION__, dev->data.pos, dev->data.len);
165 return -1; 166 return -1;
166 } 167 }
@@ -306,7 +307,7 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs)
306 err("Bad message recieved, no stop bit found.\n"); 307 err("Bad message recieved, no stop bit found.\n");
307 } 308 }
308 309
309 dev_dbg(&remote->udev, 310 dev_dbg(&remote->udev->dev,
310 "%s found valid message: system: %d, button: %d, toggle: %d\n", 311 "%s found valid message: system: %d, button: %d, toggle: %d\n",
311 __FUNCTION__, message.system, message.button, message.toggle); 312 __FUNCTION__, message.system, message.button, message.toggle);
312 313
diff --git a/drivers/usb/input/mtouchusb.c b/drivers/usb/input/mtouchusb.c
index 7fce526560ca..52cc18cd247d 100644
--- a/drivers/usb/input/mtouchusb.c
+++ b/drivers/usb/input/mtouchusb.c
@@ -40,13 +40,6 @@
40 *****************************************************************************/ 40 *****************************************************************************/
41 41
42#include <linux/config.h> 42#include <linux/config.h>
43
44#ifdef CONFIG_USB_DEBUG
45 #define DEBUG
46#else
47 #undef DEBUG
48#endif
49
50#include <linux/kernel.h> 43#include <linux/kernel.h>
51#include <linux/slab.h> 44#include <linux/slab.h>
52#include <linux/input.h> 45#include <linux/input.h>
diff --git a/drivers/usb/input/pid.c b/drivers/usb/input/pid.c
index dca5ee93a4ef..19e015d171aa 100644
--- a/drivers/usb/input/pid.c
+++ b/drivers/usb/input/pid.c
@@ -37,8 +37,6 @@
37#include "hid.h" 37#include "hid.h"
38#include "pid.h" 38#include "pid.h"
39 39
40#define DEBUG
41
42#define CHECK_OWNERSHIP(i, hid_pid) \ 40#define CHECK_OWNERSHIP(i, hid_pid) \
43 ((i) < FF_EFFECTS_MAX && i >= 0 && \ 41 ((i) < FF_EFFECTS_MAX && i >= 0 && \
44 test_bit(FF_PID_FLAGS_USED, &hid_pid->effects[(i)].flags) && \ 42 test_bit(FF_PID_FLAGS_USED, &hid_pid->effects[(i)].flags) && \
diff --git a/drivers/usb/input/touchkitusb.c b/drivers/usb/input/touchkitusb.c
index 0043e6ebcd1f..7420c6b84284 100644
--- a/drivers/usb/input/touchkitusb.c
+++ b/drivers/usb/input/touchkitusb.c
@@ -30,10 +30,6 @@
30#include <linux/input.h> 30#include <linux/input.h>
31#include <linux/module.h> 31#include <linux/module.h>
32#include <linux/init.h> 32#include <linux/init.h>
33
34#if !defined(DEBUG) && defined(CONFIG_USB_DEBUG)
35#define DEBUG
36#endif
37#include <linux/usb.h> 33#include <linux/usb.h>
38#include <linux/usb_input.h> 34#include <linux/usb_input.h>
39 35
diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c
index ea0f75773ae1..aea1cfae34cc 100644
--- a/drivers/usb/input/wacom.c
+++ b/drivers/usb/input/wacom.c
@@ -52,8 +52,10 @@
52 * v1.30.1 (pi) - Added Graphire3 support 52 * v1.30.1 (pi) - Added Graphire3 support
53 * v1.40 (pc) - Add support for several new devices, fix eraser reporting, ... 53 * v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
54 * v1.43 (pc) - Added support for Cintiq 21UX 54 * v1.43 (pc) - Added support for Cintiq 21UX
55 - Fixed a Graphire bug 55 * - Fixed a Graphire bug
56 - Merged wacom_intuos3_irq into wacom_intuos_irq 56 * - Merged wacom_intuos3_irq into wacom_intuos_irq
57 * v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc.
58 * - Report Device IDs
57 */ 59 */
58 60
59/* 61/*
@@ -76,7 +78,7 @@
76/* 78/*
77 * Version Information 79 * Version Information
78 */ 80 */
79#define DRIVER_VERSION "v1.43" 81#define DRIVER_VERSION "v1.44"
80#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" 82#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
81#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" 83#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
82#define DRIVER_LICENSE "GPL" 84#define DRIVER_LICENSE "GPL"
@@ -86,10 +88,14 @@ MODULE_DESCRIPTION(DRIVER_DESC);
86MODULE_LICENSE(DRIVER_LICENSE); 88MODULE_LICENSE(DRIVER_LICENSE);
87 89
88#define USB_VENDOR_ID_WACOM 0x056a 90#define USB_VENDOR_ID_WACOM 0x056a
91#define STYLUS_DEVICE_ID 0x02
92#define CURSOR_DEVICE_ID 0x06
93#define ERASER_DEVICE_ID 0x0A
89 94
90enum { 95enum {
91 PENPARTNER = 0, 96 PENPARTNER = 0,
92 GRAPHIRE, 97 GRAPHIRE,
98 G4,
93 PL, 99 PL,
94 INTUOS, 100 INTUOS,
95 INTUOS3, 101 INTUOS3,
@@ -116,6 +122,7 @@ struct wacom {
116 struct urb *irq; 122 struct urb *irq;
117 struct wacom_features *features; 123 struct wacom_features *features;
118 int tool[2]; 124 int tool[2];
125 int id[2];
119 __u32 serial[2]; 126 __u32 serial[2];
120 char phys[32]; 127 char phys[32];
121}; 128};
@@ -136,7 +143,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
136 struct wacom *wacom = urb->context; 143 struct wacom *wacom = urb->context;
137 unsigned char *data = wacom->data; 144 unsigned char *data = wacom->data;
138 struct input_dev *dev = wacom->dev; 145 struct input_dev *dev = wacom->dev;
139 int prox, pressure; 146 int prox, pressure, id;
140 int retval; 147 int retval;
141 148
142 switch (urb->status) { 149 switch (urb->status) {
@@ -163,6 +170,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
163 170
164 input_regs(dev, regs); 171 input_regs(dev, regs);
165 172
173 id = ERASER_DEVICE_ID;
166 if (prox) { 174 if (prox) {
167 175
168 pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); 176 pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
@@ -177,11 +185,15 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
177 * an out of proximity for previous tool then a in for new tool. 185 * an out of proximity for previous tool then a in for new tool.
178 */ 186 */
179 if (!wacom->tool[0]) { 187 if (!wacom->tool[0]) {
180 /* Going into proximity select tool */ 188 /* Eraser bit set for DTF */
181 wacom->tool[1] = (data[4] & 0x20)? BTN_TOOL_RUBBER : BTN_TOOL_PEN; 189 if (data[1] & 0x10)
190 wacom->tool[1] = BTN_TOOL_RUBBER;
191 else
192 /* Going into proximity select tool */
193 wacom->tool[1] = (data[4] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
182 } else { 194 } else {
183 /* was entered with stylus2 pressed */ 195 /* was entered with stylus2 pressed */
184 if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20) ) { 196 if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) {
185 /* report out proximity for previous tool */ 197 /* report out proximity for previous tool */
186 input_report_key(dev, wacom->tool[1], 0); 198 input_report_key(dev, wacom->tool[1], 0);
187 input_sync(dev); 199 input_sync(dev);
@@ -192,8 +204,9 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
192 if (wacom->tool[1] != BTN_TOOL_RUBBER) { 204 if (wacom->tool[1] != BTN_TOOL_RUBBER) {
193 /* Unknown tool selected default to pen tool */ 205 /* Unknown tool selected default to pen tool */
194 wacom->tool[1] = BTN_TOOL_PEN; 206 wacom->tool[1] = BTN_TOOL_PEN;
207 id = STYLUS_DEVICE_ID;
195 } 208 }
196 input_report_key(dev, wacom->tool[1], prox); /* report in proximity for tool */ 209 input_report_key(dev, wacom->tool[1], id); /* report in proximity for tool */
197 input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); 210 input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
198 input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); 211 input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
199 input_report_abs(dev, ABS_PRESSURE, pressure); 212 input_report_abs(dev, ABS_PRESSURE, pressure);
@@ -250,10 +263,10 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs)
250 263
251 input_regs(dev, regs); 264 input_regs(dev, regs);
252 if (data[1] & 0x04) { 265 if (data[1] & 0x04) {
253 input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x20); 266 input_report_key(dev, BTN_TOOL_RUBBER, (data[1] & 0x20) ? ERASER_DEVICE_ID : 0);
254 input_report_key(dev, BTN_TOUCH, data[1] & 0x08); 267 input_report_key(dev, BTN_TOUCH, data[1] & 0x08);
255 } else { 268 } else {
256 input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x20); 269 input_report_key(dev, BTN_TOOL_PEN, (data[1] & 0x20) ? STYLUS_DEVICE_ID : 0);
257 input_report_key(dev, BTN_TOUCH, data[1] & 0x01); 270 input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
258 } 271 }
259 input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[2])); 272 input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[2]));
@@ -299,7 +312,7 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs)
299 } 312 }
300 313
301 input_regs(dev, regs); 314 input_regs(dev, regs);
302 input_report_key(dev, BTN_TOOL_PEN, 1); 315 input_report_key(dev, BTN_TOOL_PEN, STYLUS_DEVICE_ID);
303 input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[1])); 316 input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[1]));
304 input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[3])); 317 input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[3]));
305 input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127); 318 input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127);
@@ -319,7 +332,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
319 struct wacom *wacom = urb->context; 332 struct wacom *wacom = urb->context;
320 unsigned char *data = wacom->data; 333 unsigned char *data = wacom->data;
321 struct input_dev *dev = wacom->dev; 334 struct input_dev *dev = wacom->dev;
322 int x, y; 335 int x, y, id, rw;
323 int retval; 336 int retval;
324 337
325 switch (urb->status) { 338 switch (urb->status) {
@@ -344,6 +357,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
344 357
345 input_regs(dev, regs); 358 input_regs(dev, regs);
346 359
360 id = STYLUS_DEVICE_ID;
347 if (data[1] & 0x10) { /* in prox */ 361 if (data[1] & 0x10) { /* in prox */
348 362
349 switch ((data[1] >> 5) & 3) { 363 switch ((data[1] >> 5) & 3) {
@@ -354,18 +368,27 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
354 368
355 case 1: /* Rubber */ 369 case 1: /* Rubber */
356 wacom->tool[0] = BTN_TOOL_RUBBER; 370 wacom->tool[0] = BTN_TOOL_RUBBER;
371 id = ERASER_DEVICE_ID;
357 break; 372 break;
358 373
359 case 2: /* Mouse with wheel */ 374 case 2: /* Mouse with wheel */
360 input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); 375 input_report_key(dev, BTN_MIDDLE, data[1] & 0x04);
361 input_report_rel(dev, REL_WHEEL, (signed char) data[6]); 376 if (wacom->features->type == G4) {
377 rw = data[7] & 0x04 ? -(data[7] & 0x03) : (data[7] & 0x03);
378 input_report_rel(dev, REL_WHEEL, rw);
379 } else
380 input_report_rel(dev, REL_WHEEL, (signed char) data[6]);
362 /* fall through */ 381 /* fall through */
363 382
364 case 3: /* Mouse without wheel */ 383 case 3: /* Mouse without wheel */
365 wacom->tool[0] = BTN_TOOL_MOUSE; 384 wacom->tool[0] = BTN_TOOL_MOUSE;
385 id = CURSOR_DEVICE_ID;
366 input_report_key(dev, BTN_LEFT, data[1] & 0x01); 386 input_report_key(dev, BTN_LEFT, data[1] & 0x01);
367 input_report_key(dev, BTN_RIGHT, data[1] & 0x02); 387 input_report_key(dev, BTN_RIGHT, data[1] & 0x02);
368 input_report_abs(dev, ABS_DISTANCE, data[7]); 388 if (wacom->features->type == G4)
389 input_report_abs(dev, ABS_DISTANCE, data[6]);
390 else
391 input_report_abs(dev, ABS_DISTANCE, data[7]);
369 break; 392 break;
370 } 393 }
371 } 394 }
@@ -376,16 +399,50 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
376 input_report_abs(dev, ABS_X, x); 399 input_report_abs(dev, ABS_X, x);
377 input_report_abs(dev, ABS_Y, y); 400 input_report_abs(dev, ABS_Y, y);
378 if (wacom->tool[0] != BTN_TOOL_MOUSE) { 401 if (wacom->tool[0] != BTN_TOOL_MOUSE) {
379 input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6])); 402 input_report_abs(dev, ABS_PRESSURE, data[6] | ((data[7] & 0x01) << 8));
380 input_report_key(dev, BTN_TOUCH, data[1] & 0x01); 403 input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
381 input_report_key(dev, BTN_STYLUS, data[1] & 0x02); 404 input_report_key(dev, BTN_STYLUS, data[1] & 0x02);
382 input_report_key(dev, BTN_STYLUS2, data[1] & 0x04); 405 input_report_key(dev, BTN_STYLUS2, data[1] & 0x04);
383 } 406 }
384 } 407 }
385 408
386 input_report_key(dev, wacom->tool[0], data[1] & 0x10); 409 input_report_key(dev, wacom->tool[0], (data[1] & 0x10) ? id : 0);
387 input_sync(dev); 410 input_sync(dev);
388 411
412 /* send pad data */
413 if (wacom->features->type == G4) {
414 /* fist time sending pad data */
415 if (wacom->tool[1] != BTN_TOOL_FINGER) {
416 wacom->id[1] = 0;
417 wacom->serial[1] = (data[7] & 0x38) >> 2;
418 }
419 if (data[7] & 0xf8) {
420 input_report_key(dev, BTN_0, (data[7] & 0x40));
421 input_report_key(dev, BTN_4, (data[7] & 0x80));
422 if (((data[7] & 0x38) >> 2) == (wacom->serial[1] & 0x0e))
423 /* alter REL_WHEEL value so X apps can get it */
424 wacom->serial[1] += (wacom->serial[1] & 0x01) ? -1 : 1;
425 else
426 wacom->serial[1] = (data[7] & 0x38 ) >> 2;
427
428 /* don't alter the value when there is no wheel event */
429 if (wacom->serial[1] == 1)
430 wacom->serial[1] = 0;
431 rw = wacom->serial[1];
432 rw = (rw & 0x08) ? -(rw & 0x07) : (rw & 0x07);
433 input_report_rel(dev, REL_WHEEL, rw);
434 wacom->tool[1] = BTN_TOOL_FINGER;
435 wacom->id[1] = data[7] & 0xf8;
436 input_report_key(dev, wacom->tool[1], 0xf0);
437 input_event(dev, EV_MSC, MSC_SERIAL, 0xf0);
438 } else if (wacom->id[1]) {
439 wacom->id[1] = 0;
440 wacom->serial[1] = 0;
441 input_report_key(dev, wacom->tool[1], 0);
442 input_event(dev, EV_MSC, MSC_SERIAL, 0xf0);
443 }
444 input_sync(dev);
445 }
389 exit: 446 exit:
390 retval = usb_submit_urb (urb, GFP_ATOMIC); 447 retval = usb_submit_urb (urb, GFP_ATOMIC);
391 if (retval) 448 if (retval)
@@ -410,7 +467,8 @@ static int wacom_intuos_inout(struct urb *urb)
410 (data[4] << 20) + (data[5] << 12) + 467 (data[4] << 20) + (data[5] << 12) +
411 (data[6] << 4) + (data[7] >> 4); 468 (data[6] << 4) + (data[7] >> 4);
412 469
413 switch ((data[2] << 4) | (data[3] >> 4)) { 470 wacom->id[idx] = (data[2] << 4) | (data[3] >> 4);
471 switch (wacom->id[idx]) {
414 case 0x812: /* Inking pen */ 472 case 0x812: /* Inking pen */
415 case 0x801: /* Intuos3 Inking pen */ 473 case 0x801: /* Intuos3 Inking pen */
416 case 0x012: 474 case 0x012:
@@ -458,7 +516,7 @@ static int wacom_intuos_inout(struct urb *urb)
458 default: /* Unknown tool */ 516 default: /* Unknown tool */
459 wacom->tool[idx] = BTN_TOOL_PEN; 517 wacom->tool[idx] = BTN_TOOL_PEN;
460 } 518 }
461 input_report_key(dev, wacom->tool[idx], 1); 519 input_report_key(dev, wacom->tool[idx], wacom->id[idx]);
462 input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); 520 input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
463 input_sync(dev); 521 input_sync(dev);
464 return 1; 522 return 1;
@@ -637,7 +695,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
637 } 695 }
638 } 696 }
639 697
640 input_report_key(dev, wacom->tool[idx], 1); 698 input_report_key(dev, wacom->tool[idx], wacom->id[idx]);
641 input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); 699 input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
642 input_sync(dev); 700 input_sync(dev);
643 701
@@ -655,6 +713,13 @@ static struct wacom_features wacom_features[] = {
655 { "Wacom Graphire2 5x7", 8, 13918, 10206, 511, 32, GRAPHIRE, wacom_graphire_irq }, 713 { "Wacom Graphire2 5x7", 8, 13918, 10206, 511, 32, GRAPHIRE, wacom_graphire_irq },
656 { "Wacom Graphire3", 8, 10208, 7424, 511, 32, GRAPHIRE, wacom_graphire_irq }, 714 { "Wacom Graphire3", 8, 10208, 7424, 511, 32, GRAPHIRE, wacom_graphire_irq },
657 { "Wacom Graphire3 6x8", 8, 16704, 12064, 511, 32, GRAPHIRE, wacom_graphire_irq }, 715 { "Wacom Graphire3 6x8", 8, 16704, 12064, 511, 32, GRAPHIRE, wacom_graphire_irq },
716 { "Wacom Graphire4 4x5", 8, 10208, 7424, 511, 32, G4, wacom_graphire_irq },
717 { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 32, G4, wacom_graphire_irq },
718 { "Wacom Volito", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq },
719 { "Wacom PenStation2", 8, 3250, 2320, 255, 32, GRAPHIRE, wacom_graphire_irq },
720 { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq },
721 { "Wacom Volito2 2x3", 8, 3248, 2320, 511, 32, GRAPHIRE, wacom_graphire_irq },
722 { "Wacom PenPartner2", 8, 3250, 2320, 255, 32, GRAPHIRE, wacom_graphire_irq },
658 { "Wacom Intuos 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq }, 723 { "Wacom Intuos 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq },
659 { "Wacom Intuos 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq }, 724 { "Wacom Intuos 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq },
660 { "Wacom Intuos 9x12", 10, 30480, 24060, 1023, 15, INTUOS, wacom_intuos_irq }, 725 { "Wacom Intuos 9x12", 10, 30480, 24060, 1023, 15, INTUOS, wacom_intuos_irq },
@@ -666,16 +731,20 @@ static struct wacom_features wacom_features[] = {
666 { "Wacom PL600SX", 8, 6260, 5016, 255, 32, PL, wacom_pl_irq }, 731 { "Wacom PL600SX", 8, 6260, 5016, 255, 32, PL, wacom_pl_irq },
667 { "Wacom PL550", 8, 6144, 4608, 511, 32, PL, wacom_pl_irq }, 732 { "Wacom PL550", 8, 6144, 4608, 511, 32, PL, wacom_pl_irq },
668 { "Wacom PL800", 8, 7220, 5780, 511, 32, PL, wacom_pl_irq }, 733 { "Wacom PL800", 8, 7220, 5780, 511, 32, PL, wacom_pl_irq },
734 { "Wacom PL700", 8, 6758, 5406, 511, 32, PL, wacom_pl_irq },
735 { "Wacom PL510", 8, 6282, 4762, 511, 32, PL, wacom_pl_irq },
736 { "Wacom PL710", 8, 34080, 27660, 511, 32, PL, wacom_pl_irq },
737 { "Wacom DTF720", 8, 6858, 5506, 511, 32, PL, wacom_pl_irq },
738 { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, PL, wacom_ptu_irq },
669 { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq }, 739 { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq },
670 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq }, 740 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq },
671 { "Wacom Intuos2 9x12", 10, 30480, 24060, 1023, 15, INTUOS, wacom_intuos_irq }, 741 { "Wacom Intuos2 9x12", 10, 30480, 24060, 1023, 15, INTUOS, wacom_intuos_irq },
672 { "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, INTUOS, wacom_intuos_irq }, 742 { "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, INTUOS, wacom_intuos_irq },
673 { "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, INTUOS, wacom_intuos_irq }, 743 { "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, INTUOS, wacom_intuos_irq },
674 { "Wacom Volito", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq },
675 { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, PL, wacom_ptu_irq },
676 { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, INTUOS3, wacom_intuos_irq }, 744 { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, INTUOS3, wacom_intuos_irq },
677 { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, INTUOS3, wacom_intuos_irq }, 745 { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, INTUOS3, wacom_intuos_irq },
678 { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, INTUOS3, wacom_intuos_irq }, 746 { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, INTUOS3, wacom_intuos_irq },
747 { "Wacom Intuos3 6x11", 10, 54204, 31750, 1023, 15, INTUOS3, wacom_intuos_irq },
679 { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 15, CINTIQ, wacom_intuos_irq }, 748 { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 15, CINTIQ, wacom_intuos_irq },
680 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq }, 749 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq },
681 { } 750 { }
@@ -688,6 +757,13 @@ static struct usb_device_id wacom_ids[] = {
688 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12) }, 757 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x12) },
689 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x13) }, 758 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x13) },
690 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) }, 759 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x14) },
760 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x15) },
761 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x16) },
762 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
763 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x61) },
764 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x62) },
765 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x63) },
766 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x64) },
691 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) }, 767 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x20) },
692 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) }, 768 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x21) },
693 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) }, 769 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x22) },
@@ -699,16 +775,20 @@ static struct usb_device_id wacom_ids[] = {
699 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) }, 775 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x33) },
700 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) }, 776 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x34) },
701 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) }, 777 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x35) },
778 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x37) },
779 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) },
780 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) },
781 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) },
782 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
702 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) }, 783 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) },
703 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) }, 784 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) },
704 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) }, 785 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x43) },
705 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) }, 786 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x44) },
706 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) }, 787 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x45) },
707 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x60) },
708 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) },
709 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) }, 788 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },
710 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) }, 789 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },
711 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) }, 790 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) },
791 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) },
712 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, 792 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },
713 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, 793 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },
714 { } 794 { }
@@ -779,6 +859,13 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
779 input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); 859 input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0);
780 860
781 switch (wacom->features->type) { 861 switch (wacom->features->type) {
862 case G4:
863 input_dev->evbit[0] |= BIT(EV_MSC);
864 input_dev->mscbit[0] |= BIT(MSC_SERIAL);
865 input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
866 input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
867 /* fall through */
868
782 case GRAPHIRE: 869 case GRAPHIRE:
783 input_dev->evbit[0] |= BIT(EV_REL); 870 input_dev->evbit[0] |= BIT(EV_REL);
784 input_dev->relbit[0] |= BIT(REL_WHEEL); 871 input_dev->relbit[0] |= BIT(REL_WHEEL);
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile
index 862e40a83689..6c693bc68e2e 100644
--- a/drivers/usb/misc/Makefile
+++ b/drivers/usb/misc/Makefile
@@ -18,4 +18,8 @@ obj-$(CONFIG_USB_RIO500) += rio500.o
18obj-$(CONFIG_USB_TEST) += usbtest.o 18obj-$(CONFIG_USB_TEST) += usbtest.o
19obj-$(CONFIG_USB_USS720) += uss720.o 19obj-$(CONFIG_USB_USS720) += uss720.o
20 20
21obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ \ No newline at end of file 21obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/
22
23ifeq ($(CONFIG_USB_DEBUG),y)
24EXTRA_CFLAGS += -DDEBUG
25endif
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c
index 5f33f7c64885..2a28ceeaa66a 100644
--- a/drivers/usb/misc/auerswald.c
+++ b/drivers/usb/misc/auerswald.c
@@ -30,7 +30,6 @@
30#include <linux/module.h> 30#include <linux/module.h>
31#include <linux/init.h> 31#include <linux/init.h>
32#include <linux/wait.h> 32#include <linux/wait.h>
33#undef DEBUG /* include debug macros until it's done */
34#include <linux/usb.h> 33#include <linux/usb.h>
35 34
36/*-------------------------------------------------------------------*/ 35/*-------------------------------------------------------------------*/
diff --git a/drivers/usb/misc/phidgetservo.c b/drivers/usb/misc/phidgetservo.c
index b84eda631ab5..a30d4a6ee824 100644
--- a/drivers/usb/misc/phidgetservo.c
+++ b/drivers/usb/misc/phidgetservo.c
@@ -26,9 +26,6 @@
26 */ 26 */
27 27
28#include <linux/config.h> 28#include <linux/config.h>
29#ifdef CONFIG_USB_DEBUG
30#define DEBUG 1
31#endif
32#include <linux/kernel.h> 29#include <linux/kernel.h>
33#include <linux/errno.h> 30#include <linux/errno.h>
34#include <linux/init.h> 31#include <linux/init.h>
diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c
index 7d02d8ec6b1a..9590dbac5d9a 100644
--- a/drivers/usb/misc/rio500.c
+++ b/drivers/usb/misc/rio500.c
@@ -393,7 +393,7 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
393 ibuf, this_read, &partial, 393 ibuf, this_read, &partial,
394 8000); 394 8000);
395 395
396 dbg(KERN_DEBUG "read stats: result:%d this_read:%u partial:%u", 396 dbg("read stats: result:%d this_read:%u partial:%u",
397 result, this_read, partial); 397 result, this_read, partial);
398 398
399 if (partial) { 399 if (partial) {
diff --git a/drivers/usb/misc/usbled.c b/drivers/usb/misc/usbled.c
index f6ba4c788dbc..3c93921cb6b3 100644
--- a/drivers/usb/misc/usbled.c
+++ b/drivers/usb/misc/usbled.c
@@ -10,9 +10,6 @@
10 */ 10 */
11 11
12#include <linux/config.h> 12#include <linux/config.h>
13#ifdef CONFIG_USB_DEBUG
14 #define DEBUG 1
15#endif
16#include <linux/kernel.h> 13#include <linux/kernel.h>
17#include <linux/errno.h> 14#include <linux/errno.h>
18#include <linux/init.h> 15#include <linux/init.h>
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
index 2997f558159b..605a2afe34ed 100644
--- a/drivers/usb/misc/usbtest.c
+++ b/drivers/usb/misc/usbtest.c
@@ -1,7 +1,4 @@
1#include <linux/config.h> 1#include <linux/config.h>
2#if !defined (DEBUG) && defined (CONFIG_USB_DEBUG)
3# define DEBUG
4#endif
5#include <linux/kernel.h> 2#include <linux/kernel.h>
6#include <linux/errno.h> 3#include <linux/errno.h>
7#include <linux/init.h> 4#include <linux/init.h>
diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c
index 0592cb5e6c4d..1cabe7ed91f5 100644
--- a/drivers/usb/misc/uss720.c
+++ b/drivers/usb/misc/uss720.c
@@ -41,8 +41,6 @@
41 41
42/*****************************************************************************/ 42/*****************************************************************************/
43 43
44#define DEBUG
45
46#include <linux/module.h> 44#include <linux/module.h>
47#include <linux/socket.h> 45#include <linux/socket.h>
48#include <linux/parport.h> 46#include <linux/parport.h>
diff --git a/drivers/usb/net/Makefile b/drivers/usb/net/Makefile
index 222c0495f791..a21e6eaabaf6 100644
--- a/drivers/usb/net/Makefile
+++ b/drivers/usb/net/Makefile
@@ -16,3 +16,7 @@ obj-$(CONFIG_USB_NET_CDC_SUBSET) += cdc_subset.o
16obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o 16obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o
17obj-$(CONFIG_USB_USBNET) += usbnet.o 17obj-$(CONFIG_USB_USBNET) += usbnet.o
18obj-$(CONFIG_USB_ZD1201) += zd1201.o 18obj-$(CONFIG_USB_ZD1201) += zd1201.o
19
20ifeq ($(CONFIG_USB_DEBUG),y)
21EXTRA_CFLAGS += -DDEBUG
22endif
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c
index 252a34fbb42c..542120ef1fd2 100644
--- a/drivers/usb/net/asix.c
+++ b/drivers/usb/net/asix.c
@@ -23,9 +23,6 @@
23// #define VERBOSE // more; success messages 23// #define VERBOSE // more; success messages
24 24
25#include <linux/config.h> 25#include <linux/config.h>
26#ifdef CONFIG_USB_DEBUG
27# define DEBUG
28#endif
29#include <linux/module.h> 26#include <linux/module.h>
30#include <linux/kmod.h> 27#include <linux/kmod.h>
31#include <linux/sched.h> 28#include <linux/sched.h>
diff --git a/drivers/usb/net/cdc_ether.c b/drivers/usb/net/cdc_ether.c
index 652b04bbf6af..c008c981862b 100644
--- a/drivers/usb/net/cdc_ether.c
+++ b/drivers/usb/net/cdc_ether.c
@@ -21,9 +21,6 @@
21// #define VERBOSE // more; success messages 21// #define VERBOSE // more; success messages
22 22
23#include <linux/config.h> 23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h> 24#include <linux/module.h>
28#include <linux/sched.h> 25#include <linux/sched.h>
29#include <linux/init.h> 26#include <linux/init.h>
diff --git a/drivers/usb/net/cdc_subset.c b/drivers/usb/net/cdc_subset.c
index f1730b685fd2..f05cfb83c82d 100644
--- a/drivers/usb/net/cdc_subset.c
+++ b/drivers/usb/net/cdc_subset.c
@@ -18,9 +18,6 @@
18 */ 18 */
19 19
20#include <linux/config.h> 20#include <linux/config.h>
21#ifdef CONFIG_USB_DEBUG
22# define DEBUG
23#endif
24#include <linux/module.h> 21#include <linux/module.h>
25#include <linux/kmod.h> 22#include <linux/kmod.h>
26#include <linux/sched.h> 23#include <linux/sched.h>
diff --git a/drivers/usb/net/gl620a.c b/drivers/usb/net/gl620a.c
index c0f263b202a6..2455e9a85674 100644
--- a/drivers/usb/net/gl620a.c
+++ b/drivers/usb/net/gl620a.c
@@ -22,9 +22,6 @@
22// #define VERBOSE // more; success messages 22// #define VERBOSE // more; success messages
23 23
24#include <linux/config.h> 24#include <linux/config.h>
25#ifdef CONFIG_USB_DEBUG
26# define DEBUG
27#endif
28#include <linux/module.h> 25#include <linux/module.h>
29#include <linux/sched.h> 26#include <linux/sched.h>
30#include <linux/init.h> 27#include <linux/init.h>
diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c
index 6bef1be6b36c..b5776518020f 100644
--- a/drivers/usb/net/kaweth.c
+++ b/drivers/usb/net/kaweth.c
@@ -219,7 +219,6 @@ struct kaweth_device
219 219
220 __u32 status; 220 __u32 status;
221 int end; 221 int end;
222 int removed;
223 int suspend_lowmem_rx; 222 int suspend_lowmem_rx;
224 int suspend_lowmem_ctrl; 223 int suspend_lowmem_ctrl;
225 int linkstate; 224 int linkstate;
@@ -699,6 +698,7 @@ static int kaweth_close(struct net_device *net)
699 698
700 usb_kill_urb(kaweth->irq_urb); 699 usb_kill_urb(kaweth->irq_urb);
701 usb_kill_urb(kaweth->rx_urb); 700 usb_kill_urb(kaweth->rx_urb);
701 usb_kill_urb(kaweth->tx_urb);
702 702
703 flush_scheduled_work(); 703 flush_scheduled_work();
704 704
@@ -750,13 +750,6 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
750 750
751 spin_lock(&kaweth->device_lock); 751 spin_lock(&kaweth->device_lock);
752 752
753 if (kaweth->removed) {
754 /* our device is undergoing disconnection - we bail out */
755 spin_unlock(&kaweth->device_lock);
756 dev_kfree_skb_irq(skb);
757 return 0;
758 }
759
760 kaweth_async_set_rx_mode(kaweth); 753 kaweth_async_set_rx_mode(kaweth);
761 netif_stop_queue(net); 754 netif_stop_queue(net);
762 755
@@ -1136,10 +1129,6 @@ static void kaweth_disconnect(struct usb_interface *intf)
1136 return; 1129 return;
1137 } 1130 }
1138 netdev = kaweth->net; 1131 netdev = kaweth->net;
1139 kaweth->removed = 1;
1140 usb_kill_urb(kaweth->irq_urb);
1141 usb_kill_urb(kaweth->rx_urb);
1142 usb_kill_urb(kaweth->tx_urb);
1143 1132
1144 kaweth_dbg("Unregistering net device"); 1133 kaweth_dbg("Unregistering net device");
1145 unregister_netdev(netdev); 1134 unregister_netdev(netdev);
diff --git a/drivers/usb/net/net1080.c b/drivers/usb/net/net1080.c
index cee55f8cf64f..b3799b1a2b0d 100644
--- a/drivers/usb/net/net1080.c
+++ b/drivers/usb/net/net1080.c
@@ -21,9 +21,6 @@
21// #define VERBOSE // more; success messages 21// #define VERBOSE // more; success messages
22 22
23#include <linux/config.h> 23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h> 24#include <linux/module.h>
28#include <linux/sched.h> 25#include <linux/sched.h>
29#include <linux/init.h> 26#include <linux/init.h>
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
index 537eb181d985..683e3df5d607 100644
--- a/drivers/usb/net/pegasus.c
+++ b/drivers/usb/net/pegasus.c
@@ -28,8 +28,6 @@
28 * is out of the interrupt routine. 28 * is out of the interrupt routine.
29 */ 29 */
30 30
31#undef DEBUG
32
33#include <linux/sched.h> 31#include <linux/sched.h>
34#include <linux/slab.h> 32#include <linux/slab.h>
35#include <linux/init.h> 33#include <linux/init.h>
diff --git a/drivers/usb/net/plusb.c b/drivers/usb/net/plusb.c
index 74c2b3581c76..89856aa0e3b8 100644
--- a/drivers/usb/net/plusb.c
+++ b/drivers/usb/net/plusb.c
@@ -21,9 +21,6 @@
21// #define VERBOSE // more; success messages 21// #define VERBOSE // more; success messages
22 22
23#include <linux/config.h> 23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h> 24#include <linux/module.h>
28#include <linux/sched.h> 25#include <linux/sched.h>
29#include <linux/init.h> 26#include <linux/init.h>
diff --git a/drivers/usb/net/rndis_host.c b/drivers/usb/net/rndis_host.c
index b5a925dc1beb..c0ecbab6f6ba 100644
--- a/drivers/usb/net/rndis_host.c
+++ b/drivers/usb/net/rndis_host.c
@@ -21,9 +21,6 @@
21// #define VERBOSE // more; success messages 21// #define VERBOSE // more; success messages
22 22
23#include <linux/config.h> 23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h> 24#include <linux/module.h>
28#include <linux/sched.h> 25#include <linux/sched.h>
29#include <linux/init.h> 26#include <linux/init.h>
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
index 74f05c9c84d5..362d6907c9bb 100644
--- a/drivers/usb/net/usbnet.c
+++ b/drivers/usb/net/usbnet.c
@@ -34,9 +34,6 @@
34// #define VERBOSE // more; success messages 34// #define VERBOSE // more; success messages
35 35
36#include <linux/config.h> 36#include <linux/config.h>
37#ifdef CONFIG_USB_DEBUG
38# define DEBUG
39#endif
40#include <linux/module.h> 37#include <linux/module.h>
41#include <linux/sched.h> 38#include <linux/sched.h>
42#include <linux/init.h> 39#include <linux/init.h>
diff --git a/drivers/usb/net/zaurus.c b/drivers/usb/net/zaurus.c
index 5d4b7d55b097..680d13957af4 100644
--- a/drivers/usb/net/zaurus.c
+++ b/drivers/usb/net/zaurus.c
@@ -21,9 +21,6 @@
21// #define VERBOSE // more; success messages 21// #define VERBOSE // more; success messages
22 22
23#include <linux/config.h> 23#include <linux/config.h>
24#ifdef CONFIG_USB_DEBUG
25# define DEBUG
26#endif
27#include <linux/module.h> 24#include <linux/module.h>
28#include <linux/sched.h> 25#include <linux/sched.h>
29#include <linux/init.h> 26#include <linux/init.h>
diff --git a/drivers/usb/serial/ChangeLog.old b/drivers/usb/serial/ChangeLog.history
index c1b279939bbf..52c4f7bd7a80 100644
--- a/drivers/usb/serial/ChangeLog.old
+++ b/drivers/usb/serial/ChangeLog.history
@@ -400,7 +400,7 @@ visor.c Change Log comments:
400 400
401 (11/11/2001) gkh 401 (11/11/2001) gkh
402 Added support for the m125 devices, and added check to prevent oopses 402 Added support for the m125 devices, and added check to prevent oopses
403 for Clié devices that lie about the number of ports they have. 403 for Clié devices that lie about the number of ports they have.
404 404
405 (08/30/2001) gkh 405 (08/30/2001) gkh
406 Added support for the Clie devices, both the 3.5 and 4.0 os versions. 406 Added support for the Clie devices, both the 3.5 and 4.0 os versions.
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
index 7b5e8e4ee2bb..14f55fd26a64 100644
--- a/drivers/usb/serial/Kconfig
+++ b/drivers/usb/serial/Kconfig
@@ -62,6 +62,15 @@ config USB_SERIAL_AIRPRIME
62 To compile this driver as a module, choose M here: the 62 To compile this driver as a module, choose M here: the
63 module will be called airprime. 63 module will be called airprime.
64 64
65config USB_SERIAL_ANYDATA
66 tristate "USB AnyData CDMA Wireless Driver"
67 depends on USB_SERIAL
68 help
69 Say Y here if you want to use a AnyData CDMA device.
70
71 To compile this driver as a module, choose M here: the
72 module will be called anydata.
73
65config USB_SERIAL_BELKIN 74config USB_SERIAL_BELKIN
66 tristate "USB Belkin and Peracom Single Port Serial Driver" 75 tristate "USB Belkin and Peracom Single Port Serial Driver"
67 depends on USB_SERIAL 76 depends on USB_SERIAL
@@ -394,15 +403,6 @@ config USB_SERIAL_MCT_U232
394 To compile this driver as a module, choose M here: the 403 To compile this driver as a module, choose M here: the
395 module will be called mct_u232. 404 module will be called mct_u232.
396 405
397config USB_SERIAL_NOKIA_DKU2
398 tristate "USB Nokia DKU2 Driver"
399 depends on USB_SERIAL
400 help
401 Say Y here if you want to use a Nokia DKU2 device.
402
403 To compile this driver as a module, choose M here: the
404 module will be called nokia_dku2.
405
406config USB_SERIAL_PL2303 406config USB_SERIAL_PL2303
407 tristate "USB Prolific 2303 Single Port Serial Driver" 407 tristate "USB Prolific 2303 Single Port Serial Driver"
408 depends on USB_SERIAL 408 depends on USB_SERIAL
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile
index 55fd461793b7..f0b04420cea1 100644
--- a/drivers/usb/serial/Makefile
+++ b/drivers/usb/serial/Makefile
@@ -12,6 +12,7 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o
12usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) 12usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
13 13
14obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o 14obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o
15obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o
15obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o 16obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o
16obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o 17obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o
17obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o 18obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o
@@ -31,7 +32,6 @@ obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda.o
31obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o 32obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o
32obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o 33obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o
33obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o 34obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o
34obj-$(CONFIG_USB_SERIAL_NOKIA_DKU2) += nokia_dku2.o
35obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o 35obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o
36obj-$(CONFIG_USB_SERIAL_OPTION) += option.o 36obj-$(CONFIG_USB_SERIAL_OPTION) += option.o
37obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o 37obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c
new file mode 100644
index 000000000000..18022a74a3dc
--- /dev/null
+++ b/drivers/usb/serial/anydata.c
@@ -0,0 +1,123 @@
1/*
2 * AnyData CDMA Serial USB driver
3 *
4 * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/tty.h>
14#include <linux/module.h>
15#include <linux/usb.h>
16#include "usb-serial.h"
17
18static struct usb_device_id id_table [] = {
19 { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */
20 { },
21};
22MODULE_DEVICE_TABLE(usb, id_table);
23
24/* if overridden by the user, then use their value for the size of the
25 * read and write urbs */
26static int buffer_size;
27static int debug;
28
29static struct usb_driver anydata_driver = {
30 .owner = THIS_MODULE,
31 .name = "anydata",
32 .probe = usb_serial_probe,
33 .disconnect = usb_serial_disconnect,
34 .id_table = id_table,
35};
36
37static int anydata_open(struct usb_serial_port *port, struct file *filp)
38{
39 char *buffer;
40 int result = 0;
41
42 dbg("%s - port %d", __FUNCTION__, port->number);
43
44 if (buffer_size) {
45 /* override the default buffer sizes */
46 buffer = kmalloc(buffer_size, GFP_KERNEL);
47 if (!buffer) {
48 dev_err(&port->dev, "%s - out of memory.\n",
49 __FUNCTION__);
50 return -ENOMEM;
51 }
52 kfree (port->read_urb->transfer_buffer);
53 port->read_urb->transfer_buffer = buffer;
54 port->read_urb->transfer_buffer_length = buffer_size;
55
56 buffer = kmalloc(buffer_size, GFP_KERNEL);
57 if (!buffer) {
58 dev_err(&port->dev, "%s - out of memory.\n",
59 __FUNCTION__);
60 return -ENOMEM;
61 }
62 kfree (port->write_urb->transfer_buffer);
63 port->write_urb->transfer_buffer = buffer;
64 port->write_urb->transfer_buffer_length = buffer_size;
65 port->bulk_out_size = buffer_size;
66 }
67
68 /* Start reading from the device */
69 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
70 usb_rcvbulkpipe(port->serial->dev,
71 port->bulk_in_endpointAddress),
72 port->read_urb->transfer_buffer,
73 port->read_urb->transfer_buffer_length,
74 usb_serial_generic_write_bulk_callback, port);
75 result = usb_submit_urb(port->read_urb, GFP_KERNEL);
76 if (result)
77 dev_err(&port->dev,
78 "%s - failed submitting read urb, error %d\n",
79 __FUNCTION__, result);
80
81 return result;
82}
83
84static struct usb_serial_driver anydata_device = {
85 .driver = {
86 .owner = THIS_MODULE,
87 .name = "anydata",
88 },
89 .id_table = id_table,
90 .num_interrupt_in = NUM_DONT_CARE,
91 .num_bulk_in = NUM_DONT_CARE,
92 .num_bulk_out = NUM_DONT_CARE,
93 .num_ports = 1,
94 .open = anydata_open,
95};
96
97static int __init anydata_init(void)
98{
99 int retval;
100
101 retval = usb_serial_register(&anydata_device);
102 if (retval)
103 return retval;
104 retval = usb_register(&anydata_driver);
105 if (retval)
106 usb_serial_deregister(&anydata_device);
107 return retval;
108}
109
110static void __exit anydata_exit(void)
111{
112 usb_deregister(&anydata_driver);
113 usb_serial_deregister(&anydata_device);
114}
115
116module_init(anydata_init);
117module_exit(anydata_exit);
118MODULE_LICENSE("GPL");
119
120module_param(debug, bool, S_IRUGO | S_IWUSR);
121MODULE_PARM_DESC(debug, "Debug enabled or not");
122module_param(buffer_size, int, 0);
123MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
index c5334dd89b12..c9787001cf2a 100644
--- a/drivers/usb/serial/cp2101.c
+++ b/drivers/usb/serial/cp2101.c
@@ -60,6 +60,7 @@ static struct usb_device_id id_table [] = {
60 { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */ 60 { USB_DEVICE(0x10C4, 0x80F6) }, /* Suunto sports instrument */
61 { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */ 61 { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */
62 { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ 62 { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */
63 { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
63 { } /* Terminating Entry */ 64 { } /* Terminating Entry */
64}; 65};
65 66
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
index 8909208f506a..53a47c31cd0e 100644
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -309,6 +309,7 @@ void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *re
309 309
310 schedule_work(&port->work); 310 schedule_work(&port->work);
311} 311}
312EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback);
312 313
313void usb_serial_generic_shutdown (struct usb_serial *serial) 314void usb_serial_generic_shutdown (struct usb_serial *serial)
314{ 315{
diff --git a/drivers/usb/serial/nokia_dku2.c b/drivers/usb/serial/nokia_dku2.c
deleted file mode 100644
index fad01bef3a64..000000000000
--- a/drivers/usb/serial/nokia_dku2.c
+++ /dev/null
@@ -1,142 +0,0 @@
1/*
2 * Nokia DKU2 USB driver
3 *
4 * Copyright (C) 2004
5 * Author: C Kemp
6 *
7 * This program is largely derived from work by the linux-usb group
8 * and associated source files. Please see the usb/serial files for
9 * individual credits and copyrights.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * 20.09.2005 - Matthias Blaesing <matthias.blaesing@rwth-aachen.de>
17 * Added short name to device structure to make driver load into kernel 2.6.13
18 *
19 * 20.09.2005 - Matthias Blaesing <matthias.blaesing@rwth-aachen.de>
20 * Added usb_deregister to exit code - to allow remove and reinsert of module
21 */
22
23
24#include <linux/config.h>
25#include <linux/kernel.h>
26#include <linux/errno.h>
27#include <linux/init.h>
28#include <linux/slab.h>
29#include <linux/tty.h>
30#include <linux/tty_driver.h>
31#include <linux/tty_flip.h>
32#include <linux/module.h>
33#include <linux/usb.h>
34#include "usb-serial.h"
35
36
37#define NOKIA_VENDOR_ID 0x0421
38#define NOKIA7600_PRODUCT_ID 0x0400
39#define NOKIA6230_PRODUCT_ID 0x040f
40#define NOKIA6170_PRODUCT_ID 0x0416
41#define NOKIA6670_PRODUCT_ID 0x041d
42#define NOKIA6680_PRODUCT_ID 0x041e
43#define NOKIA6230i_PRODUCT_ID 0x0428
44
45#define NOKIA_AT_PORT 0x82
46#define NOKIA_FBUS_PORT 0x86
47
48/*
49 * Version Information
50 */
51#define DRIVER_VERSION "v0.2"
52#define DRIVER_AUTHOR "C Kemp"
53#define DRIVER_DESC "Nokia DKU2 Driver"
54
55static struct usb_device_id id_table [] = {
56 { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA7600_PRODUCT_ID) },
57 { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6230_PRODUCT_ID) },
58 { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6170_PRODUCT_ID) },
59 { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6670_PRODUCT_ID) },
60 { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6680_PRODUCT_ID) },
61 { USB_DEVICE(NOKIA_VENDOR_ID, NOKIA6230i_PRODUCT_ID) },
62 { } /* Terminating entry */
63};
64MODULE_DEVICE_TABLE(usb, id_table);
65
66/* The only thing which makes this device different from a generic
67 * device is that we have to set an alternative configuration to make
68 * the relevant endpoints available. In 2.6 this is really easy... */
69static int nokia_probe(struct usb_serial *serial,
70 const struct usb_device_id *id)
71{
72 int retval = -ENODEV;
73
74 if (serial->interface->altsetting[0].endpoint[0].desc.bEndpointAddress == NOKIA_AT_PORT) {
75 /* the AT port */
76 dev_info(&serial->dev->dev, "Nokia AT Port:\n");
77 retval = 0;
78 } else if (serial->interface->num_altsetting == 2 &&
79 serial->interface->altsetting[1].endpoint[0].desc.bEndpointAddress == NOKIA_FBUS_PORT) {
80 /* the FBUS port */
81 dev_info(&serial->dev->dev, "Nokia FBUS Port:\n");
82 usb_set_interface(serial->dev, 10, 1);
83 retval = 0;
84 }
85
86 return retval;
87}
88
89static struct usb_driver nokia_driver = {
90 .owner = THIS_MODULE,
91 .name = "nokia_dku2",
92 .probe = usb_serial_probe,
93 .disconnect = usb_serial_disconnect,
94 .id_table = id_table,
95};
96
97static struct usb_serial_driver nokia_serial_driver = {
98 .driver = {
99 .owner = THIS_MODULE,
100 .name = "nokia_dku2",
101 },
102 .description = "Nokia 7600/6230(i)/6170/66x0 DKU2 driver",
103 .id_table = id_table,
104 .num_interrupt_in = 1,
105 .num_bulk_in = 1,
106 .num_bulk_out = 1,
107 .num_ports = 1,
108 .probe = nokia_probe,
109};
110
111static int __init nokia_init(void)
112{
113 int retval;
114
115 retval = usb_serial_register(&nokia_serial_driver);
116 if (retval)
117 return retval;
118
119 retval = usb_register(&nokia_driver);
120 if (retval) {
121 usb_serial_deregister(&nokia_serial_driver);
122 return retval;
123 }
124
125 info(DRIVER_VERSION " " DRIVER_AUTHOR);
126 info(DRIVER_DESC);
127
128 return retval;
129}
130
131static void __exit nokia_exit(void)
132{
133 usb_deregister(&nokia_driver);
134 usb_serial_deregister(&nokia_serial_driver);
135}
136
137module_init(nokia_init);
138module_exit(nokia_exit);
139
140MODULE_AUTHOR(DRIVER_AUTHOR);
141MODULE_DESCRIPTION(DRIVER_DESC);
142MODULE_LICENSE("GPL");
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
index 165c119bf10e..41a45a5025b2 100644
--- a/drivers/usb/serial/pl2303.c
+++ b/drivers/usb/serial/pl2303.c
@@ -71,7 +71,9 @@ static struct usb_device_id id_table [] = {
71 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) }, 71 { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) },
72 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) }, 72 { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) },
73 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) }, 73 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) },
74 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) },
74 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) }, 75 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) },
76 { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) },
75 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) }, 77 { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) },
76 { USB_DEVICE( NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID ) }, 78 { USB_DEVICE( NOKIA_CA42_VENDOR_ID, NOKIA_CA42_PRODUCT_ID ) },
77 { } /* Terminating entry */ 79 { } /* Terminating entry */
@@ -811,7 +813,9 @@ static void pl2303_update_line_status(struct usb_serial_port *port,
811 u8 length = UART_STATE; 813 u8 length = UART_STATE;
812 814
813 if ((le16_to_cpu(port->serial->dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) && 815 if ((le16_to_cpu(port->serial->dev->descriptor.idVendor) == SIEMENS_VENDOR_ID) &&
814 (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65)) { 816 (le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X65 ||
817 le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_SX1 ||
818 le16_to_cpu(port->serial->dev->descriptor.idProduct) == SIEMENS_PRODUCT_ID_X75)) {
815 length = 1; 819 length = 1;
816 status_idx = 0; 820 status_idx = 0;
817 } 821 }
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
index 7be9644f5a03..21d434d81813 100644
--- a/drivers/usb/serial/pl2303.h
+++ b/drivers/usb/serial/pl2303.h
@@ -54,7 +54,9 @@
54#define SAMSUNG_PRODUCT_ID 0x8001 54#define SAMSUNG_PRODUCT_ID 0x8001
55 55
56#define SIEMENS_VENDOR_ID 0x11f5 56#define SIEMENS_VENDOR_ID 0x11f5
57#define SIEMENS_PRODUCT_ID_SX1 0x0001
57#define SIEMENS_PRODUCT_ID_X65 0x0003 58#define SIEMENS_PRODUCT_ID_X65 0x0003
59#define SIEMENS_PRODUCT_ID_X75 0x0004
58 60
59#define SYNTECH_VENDOR_ID 0x0745 61#define SYNTECH_VENDOR_ID 0x0745
60#define SYNTECH_PRODUCT_ID 0x0001 62#define SYNTECH_PRODUCT_ID 0x0001
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
index 1a9679f76f5a..c41d64dbb0f0 100644
--- a/drivers/usb/storage/Kconfig
+++ b/drivers/usb/storage/Kconfig
@@ -115,7 +115,7 @@ config USB_STORAGE_JUMPSHOT
115 115
116config USB_STORAGE_ONETOUCH 116config USB_STORAGE_ONETOUCH
117 bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)" 117 bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)"
118 depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL 118 depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL && !PM
119 help 119 help
120 Say Y here to include additional code to support the Maxtor OneTouch 120 Say Y here to include additional code to support the Maxtor OneTouch
121 USB hard drive's onetouch button. 121 USB hard drive's onetouch button.
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index 33c55a6261bb..fea176d7e79a 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -853,7 +853,7 @@ static int usbat_identify_device(struct us_data *us,
853 rc = usbat_device_reset(us); 853 rc = usbat_device_reset(us);
854 if (rc != USB_STOR_TRANSPORT_GOOD) 854 if (rc != USB_STOR_TRANSPORT_GOOD)
855 return rc; 855 return rc;
856 msleep(25); 856 msleep(500);
857 857
858 /* 858 /*
859 * In attempt to distinguish between HP CDRW's and Flash readers, we now 859 * In attempt to distinguish between HP CDRW's and Flash readers, we now
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
index 9e926a8f2116..0a9858f69a9b 100644
--- a/drivers/usb/storage/unusual_devs.h
+++ b/drivers/usb/storage/unusual_devs.h
@@ -710,11 +710,6 @@ UNUSUAL_DEV( 0x0686, 0x4017, 0x0001, 0x0001,
710 "DIMAGE E223", 710 "DIMAGE E223",
711 US_SC_SCSI, US_PR_DEVICE, NULL, 0 ), 711 US_SC_SCSI, US_PR_DEVICE, NULL, 0 ),
712 712
713UNUSUAL_DEV( 0x0693, 0x0002, 0x0100, 0x0100,
714 "Hagiwara",
715 "FlashGate SmartMedia",
716 US_SC_SCSI, US_PR_BULK, NULL, 0 ),
717
718UNUSUAL_DEV( 0x0693, 0x0005, 0x0100, 0x0100, 713UNUSUAL_DEV( 0x0693, 0x0005, 0x0100, 0x0100,
719 "Hagiwara", 714 "Hagiwara",
720 "Flashgate", 715 "Flashgate",
@@ -1008,6 +1003,11 @@ UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff,
1008 * 1003 *
1009 */ 1004 */
1010#ifdef CONFIG_USB_STORAGE_ONETOUCH 1005#ifdef CONFIG_USB_STORAGE_ONETOUCH
1006 UNUSUAL_DEV( 0x0d49, 0x7000, 0x0000, 0x9999,
1007 "Maxtor",
1008 "OneTouch External Harddrive",
1009 US_SC_DEVICE, US_PR_DEVICE, onetouch_connect_input,
1010 0),
1011 UNUSUAL_DEV( 0x0d49, 0x7010, 0x0000, 0x9999, 1011 UNUSUAL_DEV( 0x0d49, 0x7010, 0x0000, 0x9999,
1012 "Maxtor", 1012 "Maxtor",
1013 "OneTouch External Harddrive", 1013 "OneTouch External Harddrive",
diff --git a/drivers/video/offb.c b/drivers/video/offb.c
index 2c856838694e..00d87f5bb7be 100644
--- a/drivers/video/offb.c
+++ b/drivers/video/offb.c
@@ -26,6 +26,7 @@
26#include <linux/fb.h> 26#include <linux/fb.h>
27#include <linux/init.h> 27#include <linux/init.h>
28#include <linux/ioport.h> 28#include <linux/ioport.h>
29#include <linux/pci.h>
29#include <asm/io.h> 30#include <asm/io.h>
30#include <asm/prom.h> 31#include <asm/prom.h>
31 32
@@ -325,8 +326,8 @@ static void __init offb_init_nodriver(struct device_node *dp)
325 int *pp, i; 326 int *pp, i;
326 unsigned int len; 327 unsigned int len;
327 int width = 640, height = 480, depth = 8, pitch; 328 int width = 640, height = 480, depth = 8, pitch;
328 unsigned *up; 329 unsigned int rsize, *up;
329 unsigned long address; 330 unsigned long address = 0;
330 331
331 if ((pp = (int *) get_property(dp, "depth", &len)) != NULL 332 if ((pp = (int *) get_property(dp, "depth", &len)) != NULL
332 && len == sizeof(int)) 333 && len == sizeof(int))
@@ -344,10 +345,40 @@ static void __init offb_init_nodriver(struct device_node *dp)
344 pitch = 0x1000; 345 pitch = 0x1000;
345 } else 346 } else
346 pitch = width; 347 pitch = width;
347 if ((up = (unsigned *) get_property(dp, "address", &len)) != NULL 348
348 && len == sizeof(unsigned)) 349 rsize = (unsigned long)pitch * (unsigned long)height *
350 (unsigned long)(depth / 8);
351
352 /* Try to match device to a PCI device in order to get a properly
353 * translated address rather then trying to decode the open firmware
354 * stuff in various incorrect ways
355 */
356#ifdef CONFIG_PCI
357 /* First try to locate the PCI device if any */
358 {
359 struct pci_dev *pdev = NULL;
360
361 for_each_pci_dev(pdev) {
362 if (dp == pci_device_to_OF_node(pdev))
363 break;
364 }
365 if (pdev) {
366 for (i = 0; i < 6 && address == 0; i++) {
367 if ((pci_resource_flags(pdev, i) &
368 IORESOURCE_MEM) &&
369 (pci_resource_len(pdev, i) >= rsize))
370 address = pci_resource_start(pdev, i);
371 }
372 pci_dev_put(pdev);
373 }
374 }
375#endif /* CONFIG_PCI */
376
377 if (address == 0 &&
378 (up = (unsigned *) get_property(dp, "address", &len)) != NULL &&
379 len == sizeof(unsigned))
349 address = (u_long) * up; 380 address = (u_long) * up;
350 else { 381 if (address == 0) {
351 for (i = 0; i < dp->n_addrs; ++i) 382 for (i = 0; i < dp->n_addrs; ++i)
352 if (dp->addrs[i].size >= 383 if (dp->addrs[i].size >=
353 pitch * height * depth / 8) 384 pitch * height * depth / 8)