diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-11-18 13:23:21 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-11-18 13:23:21 -0500 |
commit | 638cbac8de9b57345a9446e107b6aebc10b58970 (patch) | |
tree | e445fe3a1b8ad718d7ee770ed1c7a43e3eb5a611 /drivers | |
parent | f055408957750cf759162c364c2a4dfe19765844 (diff) | |
parent | fc71fe40d2bedcc57d3406bf2050481f8b3441b6 (diff) |
Merge branch 'master'
Diffstat (limited to 'drivers')
96 files changed, 1737 insertions, 811 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 | ||
515 | static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr) | 515 | static 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 | ||
556 | static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr) | 553 | static 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/block/cciss_scsi.c b/drivers/block/cciss_scsi.c index 3226aa11c6ef..2942d32280a5 100644 --- a/drivers/block/cciss_scsi.c +++ b/drivers/block/cciss_scsi.c | |||
@@ -255,7 +255,7 @@ scsi_cmd_stack_free(int ctlr) | |||
255 | #define DEVICETYPE(n) (n<0 || n>MAX_SCSI_DEVICE_CODE) ? \ | 255 | #define DEVICETYPE(n) (n<0 || n>MAX_SCSI_DEVICE_CODE) ? \ |
256 | "Unknown" : scsi_device_types[n] | 256 | "Unknown" : scsi_device_types[n] |
257 | 257 | ||
258 | #if 1 | 258 | #if 0 |
259 | static int xmargin=8; | 259 | static int xmargin=8; |
260 | static int amargin=60; | 260 | static int amargin=60; |
261 | 261 | ||
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index d16bd4b5c117..6b302a930e5f 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c | |||
@@ -48,7 +48,7 @@ | |||
48 | 48 | ||
49 | #define PFX "IPMI message handler: " | 49 | #define PFX "IPMI message handler: " |
50 | 50 | ||
51 | #define IPMI_DRIVER_VERSION "36.0" | 51 | #define IPMI_DRIVER_VERSION "38.0" |
52 | 52 | ||
53 | static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void); | 53 | static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void); |
54 | static int ipmi_init_msghandler(void); | 54 | static int ipmi_init_msghandler(void); |
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 | ||
2204 | static inline void wait_for_timer_and_thread(struct smi_info *smi_info) | 2204 | static 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 | ||
7 | config TCG_TPM | 7 | config 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 | ||
111 | static void tpm_atml_cancel(struct tpm_chip *chip) | 109 | static 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 | ||
116 | static u8 tpm_atml_status(struct tpm_chip *chip) | 114 | static 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 | ||
121 | static struct file_operations atmel_ops = { | 119 | static 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) | |||
202 | err_unreg_dev: | 206 | err_unreg_dev: |
203 | platform_device_unregister(pdev); | 207 | platform_device_unregister(pdev); |
204 | err_rel_reg: | 208 | err_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); | ||
208 | err_unreg_drv: | 213 | err_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 |
30 | static inline void atmel_put_base_addr(struct tpm_vendor_specific *vendor) | 30 | |
31 | static 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 | ||
35 | static int atmel_get_base_addr(struct tpm_vendor_specific *vendor) | 37 | static 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", ®len); | 56 | reg = (unsigned int *) get_property(dn, "reg", ®len); |
@@ -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 | ||
108 | static inline void atmel_put_base_addr(struct tpm_vendor_specific *vendor) | 109 | static 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 */ |
113 | static unsigned long atmel_get_base_addr(struct tpm_vendor_specific | 115 | static 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 | ||
38 | static struct device_driver ixp4xx_i2c_driver; | 38 | static struct platform_driver ixp4xx_i2c_driver; |
39 | 39 | ||
40 | static inline int ixp4xx_scl_pin(void *data) | 40 | static 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 | ||
790 | config BLK_DEV_IDE_SWARM | ||
791 | tristate "IDE for Sibyte evaluation boards" | ||
792 | depends on SIBYTE_SB1xxx_SOC | ||
793 | |||
790 | config BLK_DEV_IDE_AU1XXX | 794 | config 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 | |||
48 | obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o | 48 | obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o |
49 | obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o | 49 | obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o |
50 | 50 | ||
51 | obj-$(CONFIG_BLK_DEV_IDE) += legacy/ arm/ | 51 | obj-$(CONFIG_BLK_DEV_IDE) += legacy/ arm/ mips/ |
52 | obj-$(CONFIG_BLK_DEV_HD) += legacy/ | 52 | obj-$(CONFIG_BLK_DEV_HD) += legacy/ |
53 | obj-$(CONFIG_ETRAX_IDE) += cris/ | 53 | obj-$(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 | |||
54 | static char swarm_ide_string[] = DRV_NAME; | ||
55 | |||
56 | static struct resource swarm_ide_resource = { | ||
57 | .name = "SWARM GenBus IDE", | ||
58 | .flags = IORESOURCE_MEM, | ||
59 | }; | ||
60 | |||
61 | static 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 | */ | ||
67 | static 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 | |||
135 | static struct device_driver swarm_ide_driver = { | ||
136 | .name = swarm_ide_string, | ||
137 | .bus = &platform_bus_type, | ||
138 | .probe = swarm_ide_probe, | ||
139 | }; | ||
140 | |||
141 | static 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 | |||
150 | static 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 | |||
192 | out_free_pldev: | ||
193 | kfree(pldev); | ||
194 | |||
195 | out_unregister_driver: | ||
196 | driver_unregister(&swarm_ide_driver); | ||
197 | out: | ||
198 | return err; | ||
199 | } | ||
200 | |||
201 | module_init(swarm_ide_init_module); | ||
diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c index 32bf0d5d0f9a..f8457ef48826 100644 --- a/drivers/isdn/hisax/hfc_usb.c +++ b/drivers/isdn/hisax/hfc_usb.c | |||
@@ -71,78 +71,68 @@ typedef struct { | |||
71 | /****************************************/ | 71 | /****************************************/ |
72 | static struct usb_device_id hfcusb_idtab[] = { | 72 | static struct usb_device_id hfcusb_idtab[] = { |
73 | { | 73 | { |
74 | .idVendor = 0x0959, | 74 | USB_DEVICE(0x0959, 0x2bd0), |
75 | .idProduct = 0x2bd0, | ||
76 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 75 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
77 | {LED_OFF, {4, 0, 2, 1}, | 76 | {LED_OFF, {4, 0, 2, 1}, |
78 | "ISDN USB TA (Cologne Chip HFC-S USB based)"}), | 77 | "ISDN USB TA (Cologne Chip HFC-S USB based)"}), |
79 | }, | 78 | }, |
80 | { | 79 | { |
81 | .idVendor = 0x0675, | 80 | USB_DEVICE(0x0675, 0x1688), |
82 | .idProduct = 0x1688, | ||
83 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 81 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
84 | {LED_SCHEME1, {1, 2, 0, 0}, | 82 | {LED_SCHEME1, {1, 2, 0, 0}, |
85 | "DrayTek miniVigor 128 USB ISDN TA"}), | 83 | "DrayTek miniVigor 128 USB ISDN TA"}), |
86 | }, | 84 | }, |
87 | { | 85 | { |
88 | .idVendor = 0x07b0, | 86 | USB_DEVICE(0x07b0, 0x0007), |
89 | .idProduct = 0x0007, | ||
90 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 87 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
91 | {LED_SCHEME1, {0x80, -64, -32, -16}, | 88 | {LED_SCHEME1, {0x80, -64, -32, -16}, |
92 | "Billion tiny USB ISDN TA 128"}), | 89 | "Billion tiny USB ISDN TA 128"}), |
93 | }, | 90 | }, |
94 | { | 91 | { |
95 | .idVendor = 0x0742, | 92 | USB_DEVICE(0x0742, 0x2008), |
96 | .idProduct = 0x2008, | ||
97 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 93 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
98 | {LED_SCHEME1, {4, 0, 2, 1}, | 94 | {LED_SCHEME1, {4, 0, 2, 1}, |
99 | "Stollmann USB TA"}), | 95 | "Stollmann USB TA"}), |
100 | }, | 96 | }, |
101 | { | 97 | { |
102 | .idVendor = 0x0742, | 98 | USB_DEVICE(0x0742, 0x2009), |
103 | .idProduct = 0x2009, | ||
104 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 99 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
105 | {LED_SCHEME1, {4, 0, 2, 1}, | 100 | {LED_SCHEME1, {4, 0, 2, 1}, |
106 | "Aceex USB ISDN TA"}), | 101 | "Aceex USB ISDN TA"}), |
107 | }, | 102 | }, |
108 | { | 103 | { |
109 | .idVendor = 0x0742, | 104 | USB_DEVICE(0x0742, 0x200A), |
110 | .idProduct = 0x200A, | ||
111 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 105 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
112 | {LED_SCHEME1, {4, 0, 2, 1}, | 106 | {LED_SCHEME1, {4, 0, 2, 1}, |
113 | "OEM USB ISDN TA"}), | 107 | "OEM USB ISDN TA"}), |
114 | }, | 108 | }, |
115 | { | 109 | { |
116 | .idVendor = 0x08e3, | 110 | USB_DEVICE(0x08e3, 0x0301), |
117 | .idProduct = 0x0301, | ||
118 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 111 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
119 | {LED_SCHEME1, {2, 0, 1, 4}, | 112 | {LED_SCHEME1, {2, 0, 1, 4}, |
120 | "Olitec USB RNIS"}), | 113 | "Olitec USB RNIS"}), |
121 | }, | 114 | }, |
122 | { | 115 | { |
123 | .idVendor = 0x07fa, | 116 | USB_DEVICE(0x07fa, 0x0846), |
124 | .idProduct = 0x0846, | ||
125 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 117 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
126 | {LED_SCHEME1, {0x80, -64, -32, -16}, | 118 | {LED_SCHEME1, {0x80, -64, -32, -16}, |
127 | "Bewan Modem RNIS USB"}), | 119 | "Bewan Modem RNIS USB"}), |
128 | }, | 120 | }, |
129 | { | 121 | { |
130 | .idVendor = 0x07fa, | 122 | USB_DEVICE(0x07fa, 0x0847), |
131 | .idProduct = 0x0847, | ||
132 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 123 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
133 | {LED_SCHEME1, {0x80, -64, -32, -16}, | 124 | {LED_SCHEME1, {0x80, -64, -32, -16}, |
134 | "Djinn Numeris USB"}), | 125 | "Djinn Numeris USB"}), |
135 | }, | 126 | }, |
136 | { | 127 | { |
137 | .idVendor = 0x07b0, | 128 | USB_DEVICE(0x07b0, 0x0006), |
138 | .idProduct = 0x0006, | ||
139 | .driver_info = (unsigned long) &((hfcsusb_vdata) | 129 | .driver_info = (unsigned long) &((hfcsusb_vdata) |
140 | {LED_SCHEME1, {0x80, -64, -32, -16}, | 130 | {LED_SCHEME1, {0x80, -64, -32, -16}, |
141 | "Twister ISDN TA"}), | 131 | "Twister ISDN TA"}), |
142 | }, | 132 | }, |
133 | { } | ||
143 | }; | 134 | }; |
144 | 135 | ||
145 | |||
146 | /***************************************************************/ | 136 | /***************************************************************/ |
147 | /* structure defining input+output fifos (interrupt/bulk mode) */ | 137 | /* structure defining input+output fifos (interrupt/bulk mode) */ |
148 | /***************************************************************/ | 138 | /***************************************************************/ |
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 adf960d8a7c9..78c7418478d6 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -3156,7 +3156,7 @@ static int md_ioctl(struct inode *inode, struct file *file, | |||
3156 | if (cnt > 0 ) { | 3156 | if (cnt > 0 ) { |
3157 | printk(KERN_WARNING | 3157 | printk(KERN_WARNING |
3158 | "md: %s(pid %d) used deprecated START_ARRAY ioctl. " | 3158 | "md: %s(pid %d) used deprecated START_ARRAY ioctl. " |
3159 | "This will not be supported beyond 2.6\n", | 3159 | "This will not be supported beyond July 2006\n", |
3160 | current->comm, current->pid); | 3160 | current->comm, current->pid); |
3161 | cnt--; | 3161 | cnt--; |
3162 | } | 3162 | } |
@@ -3437,10 +3437,19 @@ static int md_thread(void * arg) | |||
3437 | allow_signal(SIGKILL); | 3437 | allow_signal(SIGKILL); |
3438 | while (!kthread_should_stop()) { | 3438 | while (!kthread_should_stop()) { |
3439 | 3439 | ||
3440 | wait_event_timeout(thread->wqueue, | 3440 | /* We need to wait INTERRUPTIBLE so that |
3441 | test_bit(THREAD_WAKEUP, &thread->flags) | 3441 | * we don't add to the load-average. |
3442 | || kthread_should_stop(), | 3442 | * That means we need to be sure no signals are |
3443 | thread->timeout); | 3443 | * pending |
3444 | */ | ||
3445 | if (signal_pending(current)) | ||
3446 | flush_signals(current); | ||
3447 | |||
3448 | wait_event_interruptible_timeout | ||
3449 | (thread->wqueue, | ||
3450 | test_bit(THREAD_WAKEUP, &thread->flags) | ||
3451 | || kthread_should_stop(), | ||
3452 | thread->timeout); | ||
3444 | try_to_freeze(); | 3453 | try_to_freeze(); |
3445 | 3454 | ||
3446 | clear_bit(THREAD_WAKEUP, &thread->flags); | 3455 | clear_bit(THREAD_WAKEUP, &thread->flags); |
@@ -3837,11 +3846,20 @@ static int is_mddev_idle(mddev_t *mddev) | |||
3837 | curr_events = disk_stat_read(disk, sectors[0]) + | 3846 | curr_events = disk_stat_read(disk, sectors[0]) + |
3838 | disk_stat_read(disk, sectors[1]) - | 3847 | disk_stat_read(disk, sectors[1]) - |
3839 | atomic_read(&disk->sync_io); | 3848 | atomic_read(&disk->sync_io); |
3840 | /* Allow some slack between valud of curr_events and last_events, | 3849 | /* The difference between curr_events and last_events |
3841 | * 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 | * | ||
3842 | * Note: the following is an unsigned comparison. | 3860 | * Note: the following is an unsigned comparison. |
3843 | */ | 3861 | */ |
3844 | if ((curr_events - rdev->last_events + 32) > 64) { | 3862 | if ((curr_events - rdev->last_events + 4096) > 8192) { |
3845 | rdev->last_events = curr_events; | 3863 | rdev->last_events = curr_events; |
3846 | idle = 0; | 3864 | idle = 0; |
3847 | } | 3865 | } |
@@ -4100,7 +4118,7 @@ static void md_do_sync(mddev_t *mddev) | |||
4100 | if (currspeed > sysctl_speed_limit_min) { | 4118 | if (currspeed > sysctl_speed_limit_min) { |
4101 | if ((currspeed > sysctl_speed_limit_max) || | 4119 | if ((currspeed > sysctl_speed_limit_max) || |
4102 | !is_mddev_idle(mddev)) { | 4120 | !is_mddev_idle(mddev)) { |
4103 | msleep(250); | 4121 | msleep(500); |
4104 | goto repeat; | 4122 | goto repeat; |
4105 | } | 4123 | } |
4106 | } | 4124 | } |
diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c index a1607e7d6d6b..fb394a0d838c 100644 --- a/drivers/media/dvb/cinergyT2/cinergyT2.c +++ b/drivers/media/dvb/cinergyT2/cinergyT2.c | |||
@@ -276,7 +276,7 @@ static void cinergyt2_free_stream_urbs (struct cinergyt2 *cinergyt2) | |||
276 | if (cinergyt2->stream_urb[i]) | 276 | if (cinergyt2->stream_urb[i]) |
277 | usb_free_urb(cinergyt2->stream_urb[i]); | 277 | usb_free_urb(cinergyt2->stream_urb[i]); |
278 | 278 | ||
279 | pci_free_consistent(NULL, STREAM_URB_COUNT*STREAM_BUF_SIZE, | 279 | usb_buffer_free(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE, |
280 | cinergyt2->streambuf, cinergyt2->streambuf_dmahandle); | 280 | cinergyt2->streambuf, cinergyt2->streambuf_dmahandle); |
281 | } | 281 | } |
282 | 282 | ||
@@ -284,9 +284,8 @@ static int cinergyt2_alloc_stream_urbs (struct cinergyt2 *cinergyt2) | |||
284 | { | 284 | { |
285 | int i; | 285 | int i; |
286 | 286 | ||
287 | cinergyt2->streambuf = pci_alloc_consistent(NULL, | 287 | cinergyt2->streambuf = usb_buffer_alloc(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE, |
288 | STREAM_URB_COUNT*STREAM_BUF_SIZE, | 288 | SLAB_KERNEL, &cinergyt2->streambuf_dmahandle); |
289 | &cinergyt2->streambuf_dmahandle); | ||
290 | if (!cinergyt2->streambuf) { | 289 | if (!cinergyt2->streambuf) { |
291 | dprintk(1, "failed to alloc consistent stream memory area, bailing out!\n"); | 290 | dprintk(1, "failed to alloc consistent stream memory area, bailing out!\n"); |
292 | return -ENOMEM; | 291 | return -ENOMEM; |
@@ -780,6 +779,8 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) | |||
780 | 779 | ||
781 | input_register_device(cinergyt2->rc_input_dev); | 780 | input_register_device(cinergyt2->rc_input_dev); |
782 | schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2); | 781 | schedule_delayed_work(&cinergyt2->rc_query_work, HZ/2); |
782 | |||
783 | return 0; | ||
783 | } | 784 | } |
784 | 785 | ||
785 | static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2) | 786 | static void cinergyt2_unregister_rc(struct cinergyt2 *cinergyt2) |
diff --git a/drivers/net/wan/sdladrv.c b/drivers/net/wan/sdladrv.c index 7c2cf2e76300..032c0f81928e 100644 --- a/drivers/net/wan/sdladrv.c +++ b/drivers/net/wan/sdladrv.c | |||
@@ -1994,7 +1994,7 @@ static int detect_s514 (sdlahw_t* hw) | |||
1994 | modname, hw->irq); | 1994 | modname, hw->irq); |
1995 | 1995 | ||
1996 | /* map the physical PCI memory to virtual memory */ | 1996 | /* map the physical PCI memory to virtual memory */ |
1997 | (void *)hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr, | 1997 | hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr, |
1998 | (unsigned long)MAX_SIZEOF_S514_MEMORY); | 1998 | (unsigned long)MAX_SIZEOF_S514_MEMORY); |
1999 | /* map the physical control register memory to virtual memory */ | 1999 | /* map the physical control register memory to virtual memory */ |
2000 | hw->vector = (unsigned long)ioremap( | 2000 | hw->vector = (unsigned long)ioremap( |
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/scsi/Kconfig b/drivers/scsi/Kconfig index 84c42c44e04d..20dd85a77813 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -497,7 +497,7 @@ config SCSI_ATA_PIIX | |||
497 | If unsure, say N. | 497 | If unsure, say N. |
498 | 498 | ||
499 | config SCSI_SATA_MV | 499 | config SCSI_SATA_MV |
500 | tristate "Marvell SATA support" | 500 | tristate "Marvell SATA support (HIGHLY EXPERIMENTAL)" |
501 | depends on SCSI_SATA && PCI && EXPERIMENTAL | 501 | depends on SCSI_SATA && PCI && EXPERIMENTAL |
502 | help | 502 | help |
503 | This option enables support for the Marvell Serial ATA family. | 503 | This option enables support for the Marvell Serial ATA family. |
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index 4e96ec5f2ff9..83467a05dc8e 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include <asm/io.h> | 48 | #include <asm/io.h> |
49 | 49 | ||
50 | #define DRV_NAME "ahci" | 50 | #define DRV_NAME "ahci" |
51 | #define DRV_VERSION "1.01" | 51 | #define DRV_VERSION "1.2" |
52 | 52 | ||
53 | 53 | ||
54 | enum { | 54 | enum { |
@@ -558,13 +558,26 @@ static void ahci_qc_prep(struct ata_queued_cmd *qc) | |||
558 | pp->cmd_slot[0].opts |= cpu_to_le32(n_elem << 16); | 558 | pp->cmd_slot[0].opts |= cpu_to_le32(n_elem << 16); |
559 | } | 559 | } |
560 | 560 | ||
561 | static void ahci_intr_error(struct ata_port *ap, u32 irq_stat) | 561 | static void ahci_restart_port(struct ata_port *ap, u32 irq_stat) |
562 | { | 562 | { |
563 | void __iomem *mmio = ap->host_set->mmio_base; | 563 | void __iomem *mmio = ap->host_set->mmio_base; |
564 | void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); | 564 | void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); |
565 | u32 tmp; | 565 | u32 tmp; |
566 | int work; | 566 | int work; |
567 | 567 | ||
568 | if ((ap->device[0].class != ATA_DEV_ATAPI) || | ||
569 | ((irq_stat & PORT_IRQ_TF_ERR) == 0)) | ||
570 | printk(KERN_WARNING "ata%u: port reset, " | ||
571 | "p_is %x is %x pis %x cmd %x tf %x ss %x se %x\n", | ||
572 | ap->id, | ||
573 | irq_stat, | ||
574 | readl(mmio + HOST_IRQ_STAT), | ||
575 | readl(port_mmio + PORT_IRQ_STAT), | ||
576 | readl(port_mmio + PORT_CMD), | ||
577 | readl(port_mmio + PORT_TFDATA), | ||
578 | readl(port_mmio + PORT_SCR_STAT), | ||
579 | readl(port_mmio + PORT_SCR_ERR)); | ||
580 | |||
568 | /* stop DMA */ | 581 | /* stop DMA */ |
569 | tmp = readl(port_mmio + PORT_CMD); | 582 | tmp = readl(port_mmio + PORT_CMD); |
570 | tmp &= ~PORT_CMD_START; | 583 | tmp &= ~PORT_CMD_START; |
@@ -602,8 +615,6 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat) | |||
602 | tmp |= PORT_CMD_START; | 615 | tmp |= PORT_CMD_START; |
603 | writel(tmp, port_mmio + PORT_CMD); | 616 | writel(tmp, port_mmio + PORT_CMD); |
604 | readl(port_mmio + PORT_CMD); /* flush */ | 617 | readl(port_mmio + PORT_CMD); /* flush */ |
605 | |||
606 | printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->id); | ||
607 | } | 618 | } |
608 | 619 | ||
609 | static void ahci_eng_timeout(struct ata_port *ap) | 620 | static void ahci_eng_timeout(struct ata_port *ap) |
@@ -614,17 +625,17 @@ static void ahci_eng_timeout(struct ata_port *ap) | |||
614 | struct ata_queued_cmd *qc; | 625 | struct ata_queued_cmd *qc; |
615 | unsigned long flags; | 626 | unsigned long flags; |
616 | 627 | ||
617 | DPRINTK("ENTER\n"); | 628 | printk(KERN_WARNING "ata%u: handling error/timeout\n", ap->id); |
618 | 629 | ||
619 | spin_lock_irqsave(&host_set->lock, flags); | 630 | spin_lock_irqsave(&host_set->lock, flags); |
620 | 631 | ||
621 | ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT)); | ||
622 | |||
623 | qc = ata_qc_from_tag(ap, ap->active_tag); | 632 | qc = ata_qc_from_tag(ap, ap->active_tag); |
624 | if (!qc) { | 633 | if (!qc) { |
625 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", | 634 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", |
626 | ap->id); | 635 | ap->id); |
627 | } else { | 636 | } else { |
637 | ahci_restart_port(ap, readl(port_mmio + PORT_IRQ_STAT)); | ||
638 | |||
628 | /* hack alert! We cannot use the supplied completion | 639 | /* hack alert! We cannot use the supplied completion |
629 | * function from inside the ->eh_strategy_handler() thread. | 640 | * function from inside the ->eh_strategy_handler() thread. |
630 | * libata is the only user of ->eh_strategy_handler() in | 641 | * libata is the only user of ->eh_strategy_handler() in |
@@ -659,9 +670,19 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | |||
659 | } | 670 | } |
660 | 671 | ||
661 | if (status & PORT_IRQ_FATAL) { | 672 | if (status & PORT_IRQ_FATAL) { |
662 | ahci_intr_error(ap, status); | 673 | unsigned int err_mask; |
674 | if (status & PORT_IRQ_TF_ERR) | ||
675 | err_mask = AC_ERR_DEV; | ||
676 | else if (status & PORT_IRQ_IF_ERR) | ||
677 | err_mask = AC_ERR_ATA_BUS; | ||
678 | else | ||
679 | err_mask = AC_ERR_HOST_BUS; | ||
680 | |||
681 | /* command processing has stopped due to error; restart */ | ||
682 | ahci_restart_port(ap, status); | ||
683 | |||
663 | if (qc) | 684 | if (qc) |
664 | ata_qc_complete(qc, AC_ERR_OTHER); | 685 | ata_qc_complete(qc, err_mask); |
665 | } | 686 | } |
666 | 687 | ||
667 | return 1; | 688 | return 1; |
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 855428ff37e9..333d69dd84ef 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
@@ -50,7 +50,7 @@ | |||
50 | #include <linux/libata.h> | 50 | #include <linux/libata.h> |
51 | 51 | ||
52 | #define DRV_NAME "ata_piix" | 52 | #define DRV_NAME "ata_piix" |
53 | #define DRV_VERSION "1.04" | 53 | #define DRV_VERSION "1.05" |
54 | 54 | ||
55 | enum { | 55 | enum { |
56 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ | 56 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ |
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index d81db3a3d4b9..665ae79e1fd6 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -1046,6 +1046,30 @@ static unsigned int ata_pio_modes(const struct ata_device *adev) | |||
1046 | return modes; | 1046 | return modes; |
1047 | } | 1047 | } |
1048 | 1048 | ||
1049 | static int ata_qc_wait_err(struct ata_queued_cmd *qc, | ||
1050 | struct completion *wait) | ||
1051 | { | ||
1052 | int rc = 0; | ||
1053 | |||
1054 | if (wait_for_completion_timeout(wait, 30 * HZ) < 1) { | ||
1055 | /* timeout handling */ | ||
1056 | unsigned int err_mask = ac_err_mask(ata_chk_status(qc->ap)); | ||
1057 | |||
1058 | if (!err_mask) { | ||
1059 | printk(KERN_WARNING "ata%u: slow completion (cmd %x)\n", | ||
1060 | qc->ap->id, qc->tf.command); | ||
1061 | } else { | ||
1062 | printk(KERN_WARNING "ata%u: qc timeout (cmd %x)\n", | ||
1063 | qc->ap->id, qc->tf.command); | ||
1064 | rc = -EIO; | ||
1065 | } | ||
1066 | |||
1067 | ata_qc_complete(qc, err_mask); | ||
1068 | } | ||
1069 | |||
1070 | return rc; | ||
1071 | } | ||
1072 | |||
1049 | /** | 1073 | /** |
1050 | * ata_dev_identify - obtain IDENTIFY x DEVICE page | 1074 | * ata_dev_identify - obtain IDENTIFY x DEVICE page |
1051 | * @ap: port on which device we wish to probe resides | 1075 | * @ap: port on which device we wish to probe resides |
@@ -1125,7 +1149,7 @@ retry: | |||
1125 | if (rc) | 1149 | if (rc) |
1126 | goto err_out; | 1150 | goto err_out; |
1127 | else | 1151 | else |
1128 | wait_for_completion(&wait); | 1152 | ata_qc_wait_err(qc, &wait); |
1129 | 1153 | ||
1130 | spin_lock_irqsave(&ap->host_set->lock, flags); | 1154 | spin_lock_irqsave(&ap->host_set->lock, flags); |
1131 | ap->ops->tf_read(ap, &qc->tf); | 1155 | ap->ops->tf_read(ap, &qc->tf); |
@@ -1263,7 +1287,7 @@ retry: | |||
1263 | } | 1287 | } |
1264 | 1288 | ||
1265 | /* ATAPI-specific feature tests */ | 1289 | /* ATAPI-specific feature tests */ |
1266 | else { | 1290 | else if (dev->class == ATA_DEV_ATAPI) { |
1267 | if (ata_id_is_ata(dev->id)) /* sanity check */ | 1291 | if (ata_id_is_ata(dev->id)) /* sanity check */ |
1268 | goto err_out_nosup; | 1292 | goto err_out_nosup; |
1269 | 1293 | ||
@@ -1570,11 +1594,13 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, | |||
1570 | 1594 | ||
1571 | /* | 1595 | /* |
1572 | * Find the mode. | 1596 | * Find the mode. |
1573 | */ | 1597 | */ |
1574 | 1598 | ||
1575 | if (!(s = ata_timing_find_mode(speed))) | 1599 | if (!(s = ata_timing_find_mode(speed))) |
1576 | return -EINVAL; | 1600 | return -EINVAL; |
1577 | 1601 | ||
1602 | memcpy(t, s, sizeof(*s)); | ||
1603 | |||
1578 | /* | 1604 | /* |
1579 | * If the drive is an EIDE drive, it can tell us it needs extended | 1605 | * If the drive is an EIDE drive, it can tell us it needs extended |
1580 | * PIO/MW_DMA cycle timing. | 1606 | * PIO/MW_DMA cycle timing. |
@@ -1595,7 +1621,7 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, | |||
1595 | * Convert the timing to bus clock counts. | 1621 | * Convert the timing to bus clock counts. |
1596 | */ | 1622 | */ |
1597 | 1623 | ||
1598 | ata_timing_quantize(s, t, T, UT); | 1624 | ata_timing_quantize(t, t, T, UT); |
1599 | 1625 | ||
1600 | /* | 1626 | /* |
1601 | * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, S.M.A.R.T | 1627 | * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, S.M.A.R.T |
@@ -2267,7 +2293,7 @@ static void ata_dev_set_xfermode(struct ata_port *ap, struct ata_device *dev) | |||
2267 | if (rc) | 2293 | if (rc) |
2268 | ata_port_disable(ap); | 2294 | ata_port_disable(ap); |
2269 | else | 2295 | else |
2270 | wait_for_completion(&wait); | 2296 | ata_qc_wait_err(qc, &wait); |
2271 | 2297 | ||
2272 | DPRINTK("EXIT\n"); | 2298 | DPRINTK("EXIT\n"); |
2273 | } | 2299 | } |
@@ -2315,7 +2341,7 @@ static void ata_dev_reread_id(struct ata_port *ap, struct ata_device *dev) | |||
2315 | if (rc) | 2341 | if (rc) |
2316 | goto err_out; | 2342 | goto err_out; |
2317 | 2343 | ||
2318 | wait_for_completion(&wait); | 2344 | ata_qc_wait_err(qc, &wait); |
2319 | 2345 | ||
2320 | swap_buf_le16(dev->id, ATA_ID_WORDS); | 2346 | swap_buf_le16(dev->id, ATA_ID_WORDS); |
2321 | 2347 | ||
@@ -2371,7 +2397,7 @@ static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev) | |||
2371 | if (rc) | 2397 | if (rc) |
2372 | ata_port_disable(ap); | 2398 | ata_port_disable(ap); |
2373 | else | 2399 | else |
2374 | wait_for_completion(&wait); | 2400 | ata_qc_wait_err(qc, &wait); |
2375 | 2401 | ||
2376 | DPRINTK("EXIT\n"); | 2402 | DPRINTK("EXIT\n"); |
2377 | } | 2403 | } |
@@ -2399,7 +2425,7 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) | |||
2399 | if (qc->flags & ATA_QCFLAG_SINGLE) | 2425 | if (qc->flags & ATA_QCFLAG_SINGLE) |
2400 | assert(qc->n_elem == 1); | 2426 | assert(qc->n_elem == 1); |
2401 | 2427 | ||
2402 | DPRINTK("unmapping %u sg elements\n", qc->n_elem); | 2428 | VPRINTK("unmapping %u sg elements\n", qc->n_elem); |
2403 | 2429 | ||
2404 | /* if we padded the buffer out to 32-bit bound, and data | 2430 | /* if we padded the buffer out to 32-bit bound, and data |
2405 | * xfer direction is from-device, we must copy from the | 2431 | * xfer direction is from-device, we must copy from the |
@@ -2409,7 +2435,8 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) | |||
2409 | pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | 2435 | pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); |
2410 | 2436 | ||
2411 | if (qc->flags & ATA_QCFLAG_SG) { | 2437 | if (qc->flags & ATA_QCFLAG_SG) { |
2412 | dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir); | 2438 | if (qc->n_elem) |
2439 | dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir); | ||
2413 | /* restore last sg */ | 2440 | /* restore last sg */ |
2414 | sg[qc->orig_n_elem - 1].length += qc->pad_len; | 2441 | sg[qc->orig_n_elem - 1].length += qc->pad_len; |
2415 | if (pad_buf) { | 2442 | if (pad_buf) { |
@@ -2419,8 +2446,10 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) | |||
2419 | kunmap_atomic(psg->page, KM_IRQ0); | 2446 | kunmap_atomic(psg->page, KM_IRQ0); |
2420 | } | 2447 | } |
2421 | } else { | 2448 | } else { |
2422 | dma_unmap_single(ap->host_set->dev, sg_dma_address(&sg[0]), | 2449 | if (sg_dma_len(&sg[0]) > 0) |
2423 | sg_dma_len(&sg[0]), dir); | 2450 | dma_unmap_single(ap->host_set->dev, |
2451 | sg_dma_address(&sg[0]), sg_dma_len(&sg[0]), | ||
2452 | dir); | ||
2424 | /* restore sg */ | 2453 | /* restore sg */ |
2425 | sg->length += qc->pad_len; | 2454 | sg->length += qc->pad_len; |
2426 | if (pad_buf) | 2455 | if (pad_buf) |
@@ -2619,6 +2648,11 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc) | |||
2619 | sg->length, qc->pad_len); | 2648 | sg->length, qc->pad_len); |
2620 | } | 2649 | } |
2621 | 2650 | ||
2651 | if (!sg->length) { | ||
2652 | sg_dma_address(sg) = 0; | ||
2653 | goto skip_map; | ||
2654 | } | ||
2655 | |||
2622 | dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt, | 2656 | dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt, |
2623 | sg->length, dir); | 2657 | sg->length, dir); |
2624 | if (dma_mapping_error(dma_address)) { | 2658 | if (dma_mapping_error(dma_address)) { |
@@ -2628,6 +2662,7 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc) | |||
2628 | } | 2662 | } |
2629 | 2663 | ||
2630 | sg_dma_address(sg) = dma_address; | 2664 | sg_dma_address(sg) = dma_address; |
2665 | skip_map: | ||
2631 | sg_dma_len(sg) = sg->length; | 2666 | sg_dma_len(sg) = sg->length; |
2632 | 2667 | ||
2633 | DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg), | 2668 | DPRINTK("mapped buffer of %d bytes for %s\n", sg_dma_len(sg), |
@@ -2655,7 +2690,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
2655 | struct ata_port *ap = qc->ap; | 2690 | struct ata_port *ap = qc->ap; |
2656 | struct scatterlist *sg = qc->__sg; | 2691 | struct scatterlist *sg = qc->__sg; |
2657 | struct scatterlist *lsg = &sg[qc->n_elem - 1]; | 2692 | struct scatterlist *lsg = &sg[qc->n_elem - 1]; |
2658 | int n_elem, dir; | 2693 | int n_elem, pre_n_elem, dir, trim_sg = 0; |
2659 | 2694 | ||
2660 | VPRINTK("ENTER, ata%u\n", ap->id); | 2695 | VPRINTK("ENTER, ata%u\n", ap->id); |
2661 | assert(qc->flags & ATA_QCFLAG_SG); | 2696 | assert(qc->flags & ATA_QCFLAG_SG); |
@@ -2689,13 +2724,24 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
2689 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; | 2724 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; |
2690 | /* trim last sg */ | 2725 | /* trim last sg */ |
2691 | lsg->length -= qc->pad_len; | 2726 | lsg->length -= qc->pad_len; |
2727 | if (lsg->length == 0) | ||
2728 | trim_sg = 1; | ||
2692 | 2729 | ||
2693 | DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n", | 2730 | DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n", |
2694 | qc->n_elem - 1, lsg->length, qc->pad_len); | 2731 | qc->n_elem - 1, lsg->length, qc->pad_len); |
2695 | } | 2732 | } |
2696 | 2733 | ||
2734 | pre_n_elem = qc->n_elem; | ||
2735 | if (trim_sg && pre_n_elem) | ||
2736 | pre_n_elem--; | ||
2737 | |||
2738 | if (!pre_n_elem) { | ||
2739 | n_elem = 0; | ||
2740 | goto skip_map; | ||
2741 | } | ||
2742 | |||
2697 | dir = qc->dma_dir; | 2743 | dir = qc->dma_dir; |
2698 | n_elem = dma_map_sg(ap->host_set->dev, sg, qc->n_elem, dir); | 2744 | n_elem = dma_map_sg(ap->host_set->dev, sg, pre_n_elem, dir); |
2699 | if (n_elem < 1) { | 2745 | if (n_elem < 1) { |
2700 | /* restore last sg */ | 2746 | /* restore last sg */ |
2701 | lsg->length += qc->pad_len; | 2747 | lsg->length += qc->pad_len; |
@@ -2704,6 +2750,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
2704 | 2750 | ||
2705 | DPRINTK("%d sg elements mapped\n", n_elem); | 2751 | DPRINTK("%d sg elements mapped\n", n_elem); |
2706 | 2752 | ||
2753 | skip_map: | ||
2707 | qc->n_elem = n_elem; | 2754 | qc->n_elem = n_elem; |
2708 | 2755 | ||
2709 | return 0; | 2756 | return 0; |
@@ -3263,32 +3310,11 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc) | |||
3263 | { | 3310 | { |
3264 | struct ata_port *ap = qc->ap; | 3311 | struct ata_port *ap = qc->ap; |
3265 | struct ata_host_set *host_set = ap->host_set; | 3312 | struct ata_host_set *host_set = ap->host_set; |
3266 | struct ata_device *dev = qc->dev; | ||
3267 | u8 host_stat = 0, drv_stat; | 3313 | u8 host_stat = 0, drv_stat; |
3268 | unsigned long flags; | 3314 | unsigned long flags; |
3269 | 3315 | ||
3270 | DPRINTK("ENTER\n"); | 3316 | DPRINTK("ENTER\n"); |
3271 | 3317 | ||
3272 | /* FIXME: doesn't this conflict with timeout handling? */ | ||
3273 | if (qc->dev->class == ATA_DEV_ATAPI && qc->scsicmd) { | ||
3274 | struct scsi_cmnd *cmd = qc->scsicmd; | ||
3275 | |||
3276 | if (!(cmd->eh_eflags & SCSI_EH_CANCEL_CMD)) { | ||
3277 | |||
3278 | /* finish completing original command */ | ||
3279 | spin_lock_irqsave(&host_set->lock, flags); | ||
3280 | __ata_qc_complete(qc); | ||
3281 | spin_unlock_irqrestore(&host_set->lock, flags); | ||
3282 | |||
3283 | atapi_request_sense(ap, dev, cmd); | ||
3284 | |||
3285 | cmd->result = (CHECK_CONDITION << 1) | (DID_OK << 16); | ||
3286 | scsi_finish_command(cmd); | ||
3287 | |||
3288 | goto out; | ||
3289 | } | ||
3290 | } | ||
3291 | |||
3292 | spin_lock_irqsave(&host_set->lock, flags); | 3318 | spin_lock_irqsave(&host_set->lock, flags); |
3293 | 3319 | ||
3294 | /* hack alert! We cannot use the supplied completion | 3320 | /* hack alert! We cannot use the supplied completion |
@@ -3327,7 +3353,6 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc) | |||
3327 | 3353 | ||
3328 | spin_unlock_irqrestore(&host_set->lock, flags); | 3354 | spin_unlock_irqrestore(&host_set->lock, flags); |
3329 | 3355 | ||
3330 | out: | ||
3331 | DPRINTK("EXIT\n"); | 3356 | DPRINTK("EXIT\n"); |
3332 | } | 3357 | } |
3333 | 3358 | ||
@@ -3411,16 +3436,11 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, | |||
3411 | 3436 | ||
3412 | qc = ata_qc_new(ap); | 3437 | qc = ata_qc_new(ap); |
3413 | if (qc) { | 3438 | if (qc) { |
3414 | qc->__sg = NULL; | ||
3415 | qc->flags = 0; | ||
3416 | qc->scsicmd = NULL; | 3439 | qc->scsicmd = NULL; |
3417 | qc->ap = ap; | 3440 | qc->ap = ap; |
3418 | qc->dev = dev; | 3441 | qc->dev = dev; |
3419 | qc->cursect = qc->cursg = qc->cursg_ofs = 0; | ||
3420 | qc->nsect = 0; | ||
3421 | qc->nbytes = qc->curbytes = 0; | ||
3422 | 3442 | ||
3423 | ata_tf_init(ap, &qc->tf, dev->devno); | 3443 | ata_qc_reinit(qc); |
3424 | } | 3444 | } |
3425 | 3445 | ||
3426 | return qc; | 3446 | return qc; |
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 0df4b682965d..3b4ca55a3332 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -1955,22 +1955,44 @@ void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 | |||
1955 | done(cmd); | 1955 | done(cmd); |
1956 | } | 1956 | } |
1957 | 1957 | ||
1958 | void atapi_request_sense(struct ata_port *ap, struct ata_device *dev, | 1958 | static int atapi_sense_complete(struct ata_queued_cmd *qc,unsigned int err_mask) |
1959 | struct scsi_cmnd *cmd) | ||
1960 | { | 1959 | { |
1961 | DECLARE_COMPLETION(wait); | 1960 | if (err_mask && ((err_mask & AC_ERR_DEV) == 0)) |
1962 | struct ata_queued_cmd *qc; | 1961 | /* FIXME: not quite right; we don't want the |
1963 | unsigned long flags; | 1962 | * translation of taskfile registers into |
1964 | int rc; | 1963 | * a sense descriptors, since that's only |
1964 | * correct for ATA, not ATAPI | ||
1965 | */ | ||
1966 | ata_gen_ata_desc_sense(qc); | ||
1965 | 1967 | ||
1966 | DPRINTK("ATAPI request sense\n"); | 1968 | qc->scsidone(qc->scsicmd); |
1969 | return 0; | ||
1970 | } | ||
1967 | 1971 | ||
1968 | qc = ata_qc_new_init(ap, dev); | 1972 | /* is it pointless to prefer PIO for "safety reasons"? */ |
1969 | BUG_ON(qc == NULL); | 1973 | static inline int ata_pio_use_silly(struct ata_port *ap) |
1974 | { | ||
1975 | return (ap->flags & ATA_FLAG_PIO_DMA); | ||
1976 | } | ||
1977 | |||
1978 | static void atapi_request_sense(struct ata_queued_cmd *qc) | ||
1979 | { | ||
1980 | struct ata_port *ap = qc->ap; | ||
1981 | struct scsi_cmnd *cmd = qc->scsicmd; | ||
1982 | |||
1983 | DPRINTK("ATAPI request sense\n"); | ||
1970 | 1984 | ||
1971 | /* FIXME: is this needed? */ | 1985 | /* FIXME: is this needed? */ |
1972 | memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer)); | 1986 | memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer)); |
1973 | 1987 | ||
1988 | ap->ops->tf_read(ap, &qc->tf); | ||
1989 | |||
1990 | /* fill these in, for the case where they are -not- overwritten */ | ||
1991 | cmd->sense_buffer[0] = 0x70; | ||
1992 | cmd->sense_buffer[2] = qc->tf.feature >> 4; | ||
1993 | |||
1994 | ata_qc_reinit(qc); | ||
1995 | |||
1974 | ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer)); | 1996 | ata_sg_init_one(qc, cmd->sense_buffer, sizeof(cmd->sense_buffer)); |
1975 | qc->dma_dir = DMA_FROM_DEVICE; | 1997 | qc->dma_dir = DMA_FROM_DEVICE; |
1976 | 1998 | ||
@@ -1981,22 +2003,20 @@ void atapi_request_sense(struct ata_port *ap, struct ata_device *dev, | |||
1981 | qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 2003 | qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; |
1982 | qc->tf.command = ATA_CMD_PACKET; | 2004 | qc->tf.command = ATA_CMD_PACKET; |
1983 | 2005 | ||
1984 | qc->tf.protocol = ATA_PROT_ATAPI; | 2006 | if (ata_pio_use_silly(ap)) { |
1985 | qc->tf.lbam = (8 * 1024) & 0xff; | 2007 | qc->tf.protocol = ATA_PROT_ATAPI_DMA; |
1986 | qc->tf.lbah = (8 * 1024) >> 8; | 2008 | qc->tf.feature |= ATAPI_PKT_DMA; |
2009 | } else { | ||
2010 | qc->tf.protocol = ATA_PROT_ATAPI; | ||
2011 | qc->tf.lbam = (8 * 1024) & 0xff; | ||
2012 | qc->tf.lbah = (8 * 1024) >> 8; | ||
2013 | } | ||
1987 | qc->nbytes = SCSI_SENSE_BUFFERSIZE; | 2014 | qc->nbytes = SCSI_SENSE_BUFFERSIZE; |
1988 | 2015 | ||
1989 | qc->waiting = &wait; | 2016 | qc->complete_fn = atapi_sense_complete; |
1990 | qc->complete_fn = ata_qc_complete_noop; | ||
1991 | 2017 | ||
1992 | spin_lock_irqsave(&ap->host_set->lock, flags); | 2018 | if (ata_qc_issue(qc)) |
1993 | rc = ata_qc_issue(qc); | 2019 | ata_qc_complete(qc, AC_ERR_OTHER); |
1994 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
1995 | |||
1996 | if (rc) | ||
1997 | ata_port_disable(ap); | ||
1998 | else | ||
1999 | wait_for_completion(&wait); | ||
2000 | 2020 | ||
2001 | DPRINTK("EXIT\n"); | 2021 | DPRINTK("EXIT\n"); |
2002 | } | 2022 | } |
@@ -2008,19 +2028,8 @@ static int atapi_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask) | |||
2008 | VPRINTK("ENTER, err_mask 0x%X\n", err_mask); | 2028 | VPRINTK("ENTER, err_mask 0x%X\n", err_mask); |
2009 | 2029 | ||
2010 | if (unlikely(err_mask & AC_ERR_DEV)) { | 2030 | if (unlikely(err_mask & AC_ERR_DEV)) { |
2011 | DPRINTK("request check condition\n"); | ||
2012 | |||
2013 | /* FIXME: command completion with check condition | ||
2014 | * but no sense causes the error handler to run, | ||
2015 | * which then issues REQUEST SENSE, fills in the sense | ||
2016 | * buffer, and completes the command (for the second | ||
2017 | * time). We need to issue REQUEST SENSE some other | ||
2018 | * way, to avoid completing the command twice. | ||
2019 | */ | ||
2020 | cmd->result = SAM_STAT_CHECK_CONDITION; | 2031 | cmd->result = SAM_STAT_CHECK_CONDITION; |
2021 | 2032 | atapi_request_sense(qc); | |
2022 | qc->scsidone(cmd); | ||
2023 | |||
2024 | return 1; | 2033 | return 1; |
2025 | } | 2034 | } |
2026 | 2035 | ||
diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h index fad051ca4672..8ebaa694d18e 100644 --- a/drivers/scsi/libata.h +++ b/drivers/scsi/libata.h | |||
@@ -29,7 +29,7 @@ | |||
29 | #define __LIBATA_H__ | 29 | #define __LIBATA_H__ |
30 | 30 | ||
31 | #define DRV_NAME "libata" | 31 | #define DRV_NAME "libata" |
32 | #define DRV_VERSION "1.12" /* must be exactly four chars */ | 32 | #define DRV_VERSION "1.20" /* must be exactly four chars */ |
33 | 33 | ||
34 | struct ata_scsi_args { | 34 | struct ata_scsi_args { |
35 | u16 *id; | 35 | u16 *id; |
@@ -54,8 +54,6 @@ extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg); | |||
54 | 54 | ||
55 | 55 | ||
56 | /* libata-scsi.c */ | 56 | /* libata-scsi.c */ |
57 | extern void atapi_request_sense(struct ata_port *ap, struct ata_device *dev, | ||
58 | struct scsi_cmnd *cmd); | ||
59 | extern void ata_scsi_scan_host(struct ata_port *ap); | 57 | extern void ata_scsi_scan_host(struct ata_port *ap); |
60 | extern int ata_scsi_error(struct Scsi_Host *host); | 58 | extern int ata_scsi_error(struct Scsi_Host *host); |
61 | extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, | 59 | extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index 257c128f4aaa..ac184e60797e 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * sata_mv.c - Marvell SATA support | 2 | * sata_mv.c - Marvell SATA support |
3 | * | 3 | * |
4 | * Copyright 2005: EMC Corporation, all rights reserved. | 4 | * Copyright 2005: EMC Corporation, all rights reserved. |
5 | * | 5 | * |
6 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. | 6 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. |
7 | * | 7 | * |
@@ -50,6 +50,9 @@ enum { | |||
50 | MV_PCI_REG_BASE = 0, | 50 | MV_PCI_REG_BASE = 0, |
51 | MV_IRQ_COAL_REG_BASE = 0x18000, /* 6xxx part only */ | 51 | MV_IRQ_COAL_REG_BASE = 0x18000, /* 6xxx part only */ |
52 | MV_SATAHC0_REG_BASE = 0x20000, | 52 | MV_SATAHC0_REG_BASE = 0x20000, |
53 | MV_FLASH_CTL = 0x1046c, | ||
54 | MV_GPIO_PORT_CTL = 0x104f0, | ||
55 | MV_RESET_CFG = 0x180d8, | ||
53 | 56 | ||
54 | MV_PCI_REG_SZ = MV_MAJOR_REG_AREA_SZ, | 57 | MV_PCI_REG_SZ = MV_MAJOR_REG_AREA_SZ, |
55 | MV_SATAHC_REG_SZ = MV_MAJOR_REG_AREA_SZ, | 58 | MV_SATAHC_REG_SZ = MV_MAJOR_REG_AREA_SZ, |
@@ -72,11 +75,6 @@ enum { | |||
72 | MV_SG_TBL_SZ = (16 * MV_MAX_SG_CT), | 75 | MV_SG_TBL_SZ = (16 * MV_MAX_SG_CT), |
73 | MV_PORT_PRIV_DMA_SZ = (MV_CRQB_Q_SZ + MV_CRPB_Q_SZ + MV_SG_TBL_SZ), | 76 | MV_PORT_PRIV_DMA_SZ = (MV_CRQB_Q_SZ + MV_CRPB_Q_SZ + MV_SG_TBL_SZ), |
74 | 77 | ||
75 | /* Our DMA boundary is determined by an ePRD being unable to handle | ||
76 | * anything larger than 64KB | ||
77 | */ | ||
78 | MV_DMA_BOUNDARY = 0xffffU, | ||
79 | |||
80 | MV_PORTS_PER_HC = 4, | 78 | MV_PORTS_PER_HC = 4, |
81 | /* == (port / MV_PORTS_PER_HC) to determine HC from 0-7 port */ | 79 | /* == (port / MV_PORTS_PER_HC) to determine HC from 0-7 port */ |
82 | MV_PORT_HC_SHIFT = 2, | 80 | MV_PORT_HC_SHIFT = 2, |
@@ -86,16 +84,9 @@ enum { | |||
86 | /* Host Flags */ | 84 | /* Host Flags */ |
87 | MV_FLAG_DUAL_HC = (1 << 30), /* two SATA Host Controllers */ | 85 | MV_FLAG_DUAL_HC = (1 << 30), /* two SATA Host Controllers */ |
88 | MV_FLAG_IRQ_COALESCE = (1 << 29), /* IRQ coalescing capability */ | 86 | MV_FLAG_IRQ_COALESCE = (1 << 29), /* IRQ coalescing capability */ |
89 | MV_FLAG_GLBL_SFT_RST = (1 << 28), /* Global Soft Reset support */ | ||
90 | MV_COMMON_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 87 | MV_COMMON_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
91 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO), | 88 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO), |
92 | MV_6XXX_FLAGS = (MV_FLAG_IRQ_COALESCE | | 89 | MV_6XXX_FLAGS = MV_FLAG_IRQ_COALESCE, |
93 | MV_FLAG_GLBL_SFT_RST), | ||
94 | |||
95 | chip_504x = 0, | ||
96 | chip_508x = 1, | ||
97 | chip_604x = 2, | ||
98 | chip_608x = 3, | ||
99 | 90 | ||
100 | CRQB_FLAG_READ = (1 << 0), | 91 | CRQB_FLAG_READ = (1 << 0), |
101 | CRQB_TAG_SHIFT = 1, | 92 | CRQB_TAG_SHIFT = 1, |
@@ -116,8 +107,19 @@ enum { | |||
116 | PCI_MASTER_EMPTY = (1 << 3), | 107 | PCI_MASTER_EMPTY = (1 << 3), |
117 | GLOB_SFT_RST = (1 << 4), | 108 | GLOB_SFT_RST = (1 << 4), |
118 | 109 | ||
119 | PCI_IRQ_CAUSE_OFS = 0x1d58, | 110 | MV_PCI_MODE = 0xd00, |
120 | PCI_IRQ_MASK_OFS = 0x1d5c, | 111 | MV_PCI_EXP_ROM_BAR_CTL = 0xd2c, |
112 | MV_PCI_DISC_TIMER = 0xd04, | ||
113 | MV_PCI_MSI_TRIGGER = 0xc38, | ||
114 | MV_PCI_SERR_MASK = 0xc28, | ||
115 | MV_PCI_XBAR_TMOUT = 0x1d04, | ||
116 | MV_PCI_ERR_LOW_ADDRESS = 0x1d40, | ||
117 | MV_PCI_ERR_HIGH_ADDRESS = 0x1d44, | ||
118 | MV_PCI_ERR_ATTRIBUTE = 0x1d48, | ||
119 | MV_PCI_ERR_COMMAND = 0x1d50, | ||
120 | |||
121 | PCI_IRQ_CAUSE_OFS = 0x1d58, | ||
122 | PCI_IRQ_MASK_OFS = 0x1d5c, | ||
121 | PCI_UNMASK_ALL_IRQS = 0x7fffff, /* bits 22-0 */ | 123 | PCI_UNMASK_ALL_IRQS = 0x7fffff, /* bits 22-0 */ |
122 | 124 | ||
123 | HC_MAIN_IRQ_CAUSE_OFS = 0x1d60, | 125 | HC_MAIN_IRQ_CAUSE_OFS = 0x1d60, |
@@ -134,7 +136,7 @@ enum { | |||
134 | SELF_INT = (1 << 23), | 136 | SELF_INT = (1 << 23), |
135 | TWSI_INT = (1 << 24), | 137 | TWSI_INT = (1 << 24), |
136 | HC_MAIN_RSVD = (0x7f << 25), /* bits 31-25 */ | 138 | HC_MAIN_RSVD = (0x7f << 25), /* bits 31-25 */ |
137 | HC_MAIN_MASKED_IRQS = (TRAN_LO_DONE | TRAN_HI_DONE | | 139 | HC_MAIN_MASKED_IRQS = (TRAN_LO_DONE | TRAN_HI_DONE | |
138 | PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT | | 140 | PORTS_0_7_COAL_DONE | GPIO_INT | TWSI_INT | |
139 | HC_MAIN_RSVD), | 141 | HC_MAIN_RSVD), |
140 | 142 | ||
@@ -153,6 +155,15 @@ enum { | |||
153 | /* SATA registers */ | 155 | /* SATA registers */ |
154 | SATA_STATUS_OFS = 0x300, /* ctrl, err regs follow status */ | 156 | SATA_STATUS_OFS = 0x300, /* ctrl, err regs follow status */ |
155 | SATA_ACTIVE_OFS = 0x350, | 157 | SATA_ACTIVE_OFS = 0x350, |
158 | PHY_MODE3 = 0x310, | ||
159 | PHY_MODE4 = 0x314, | ||
160 | PHY_MODE2 = 0x330, | ||
161 | MV5_PHY_MODE = 0x74, | ||
162 | MV5_LT_MODE = 0x30, | ||
163 | MV5_PHY_CTL = 0x0C, | ||
164 | SATA_INTERFACE_CTL = 0x050, | ||
165 | |||
166 | MV_M2_PREAMP_MASK = 0x7e0, | ||
156 | 167 | ||
157 | /* Port registers */ | 168 | /* Port registers */ |
158 | EDMA_CFG_OFS = 0, | 169 | EDMA_CFG_OFS = 0, |
@@ -182,17 +193,16 @@ enum { | |||
182 | EDMA_ERR_LNK_CTRL_TX = (0x1f << 21), | 193 | EDMA_ERR_LNK_CTRL_TX = (0x1f << 21), |
183 | EDMA_ERR_LNK_DATA_TX = (0x1f << 26), | 194 | EDMA_ERR_LNK_DATA_TX = (0x1f << 26), |
184 | EDMA_ERR_TRANS_PROTO = (1 << 31), | 195 | EDMA_ERR_TRANS_PROTO = (1 << 31), |
185 | EDMA_ERR_FATAL = (EDMA_ERR_D_PAR | EDMA_ERR_PRD_PAR | | 196 | EDMA_ERR_FATAL = (EDMA_ERR_D_PAR | EDMA_ERR_PRD_PAR | |
186 | EDMA_ERR_DEV_DCON | EDMA_ERR_CRBQ_PAR | | 197 | EDMA_ERR_DEV_DCON | EDMA_ERR_CRBQ_PAR | |
187 | EDMA_ERR_CRPB_PAR | EDMA_ERR_INTRL_PAR | | 198 | EDMA_ERR_CRPB_PAR | EDMA_ERR_INTRL_PAR | |
188 | EDMA_ERR_IORDY | EDMA_ERR_LNK_CTRL_RX_2 | | 199 | EDMA_ERR_IORDY | EDMA_ERR_LNK_CTRL_RX_2 | |
189 | EDMA_ERR_LNK_DATA_RX | | 200 | EDMA_ERR_LNK_DATA_RX | |
190 | EDMA_ERR_LNK_DATA_TX | | 201 | EDMA_ERR_LNK_DATA_TX | |
191 | EDMA_ERR_TRANS_PROTO), | 202 | EDMA_ERR_TRANS_PROTO), |
192 | 203 | ||
193 | EDMA_REQ_Q_BASE_HI_OFS = 0x10, | 204 | EDMA_REQ_Q_BASE_HI_OFS = 0x10, |
194 | EDMA_REQ_Q_IN_PTR_OFS = 0x14, /* also contains BASE_LO */ | 205 | EDMA_REQ_Q_IN_PTR_OFS = 0x14, /* also contains BASE_LO */ |
195 | EDMA_REQ_Q_BASE_LO_MASK = 0xfffffc00U, | ||
196 | 206 | ||
197 | EDMA_REQ_Q_OUT_PTR_OFS = 0x18, | 207 | EDMA_REQ_Q_OUT_PTR_OFS = 0x18, |
198 | EDMA_REQ_Q_PTR_SHIFT = 5, | 208 | EDMA_REQ_Q_PTR_SHIFT = 5, |
@@ -200,7 +210,6 @@ enum { | |||
200 | EDMA_RSP_Q_BASE_HI_OFS = 0x1c, | 210 | EDMA_RSP_Q_BASE_HI_OFS = 0x1c, |
201 | EDMA_RSP_Q_IN_PTR_OFS = 0x20, | 211 | EDMA_RSP_Q_IN_PTR_OFS = 0x20, |
202 | EDMA_RSP_Q_OUT_PTR_OFS = 0x24, /* also contains BASE_LO */ | 212 | EDMA_RSP_Q_OUT_PTR_OFS = 0x24, /* also contains BASE_LO */ |
203 | EDMA_RSP_Q_BASE_LO_MASK = 0xffffff00U, | ||
204 | EDMA_RSP_Q_PTR_SHIFT = 3, | 213 | EDMA_RSP_Q_PTR_SHIFT = 3, |
205 | 214 | ||
206 | EDMA_CMD_OFS = 0x28, | 215 | EDMA_CMD_OFS = 0x28, |
@@ -208,14 +217,44 @@ enum { | |||
208 | EDMA_DS = (1 << 1), | 217 | EDMA_DS = (1 << 1), |
209 | ATA_RST = (1 << 2), | 218 | ATA_RST = (1 << 2), |
210 | 219 | ||
220 | EDMA_IORDY_TMOUT = 0x34, | ||
221 | EDMA_ARB_CFG = 0x38, | ||
222 | |||
211 | /* Host private flags (hp_flags) */ | 223 | /* Host private flags (hp_flags) */ |
212 | MV_HP_FLAG_MSI = (1 << 0), | 224 | MV_HP_FLAG_MSI = (1 << 0), |
225 | MV_HP_ERRATA_50XXB0 = (1 << 1), | ||
226 | MV_HP_ERRATA_50XXB2 = (1 << 2), | ||
227 | MV_HP_ERRATA_60X1B2 = (1 << 3), | ||
228 | MV_HP_ERRATA_60X1C0 = (1 << 4), | ||
229 | MV_HP_50XX = (1 << 5), | ||
213 | 230 | ||
214 | /* Port private flags (pp_flags) */ | 231 | /* Port private flags (pp_flags) */ |
215 | MV_PP_FLAG_EDMA_EN = (1 << 0), | 232 | MV_PP_FLAG_EDMA_EN = (1 << 0), |
216 | MV_PP_FLAG_EDMA_DS_ACT = (1 << 1), | 233 | MV_PP_FLAG_EDMA_DS_ACT = (1 << 1), |
217 | }; | 234 | }; |
218 | 235 | ||
236 | #define IS_50XX(hpriv) ((hpriv)->hp_flags & MV_HP_50XX) | ||
237 | #define IS_60XX(hpriv) (((hpriv)->hp_flags & MV_HP_50XX) == 0) | ||
238 | |||
239 | enum { | ||
240 | /* Our DMA boundary is determined by an ePRD being unable to handle | ||
241 | * anything larger than 64KB | ||
242 | */ | ||
243 | MV_DMA_BOUNDARY = 0xffffU, | ||
244 | |||
245 | EDMA_REQ_Q_BASE_LO_MASK = 0xfffffc00U, | ||
246 | |||
247 | EDMA_RSP_Q_BASE_LO_MASK = 0xffffff00U, | ||
248 | }; | ||
249 | |||
250 | enum chip_type { | ||
251 | chip_504x, | ||
252 | chip_508x, | ||
253 | chip_5080, | ||
254 | chip_604x, | ||
255 | chip_608x, | ||
256 | }; | ||
257 | |||
219 | /* Command ReQuest Block: 32B */ | 258 | /* Command ReQuest Block: 32B */ |
220 | struct mv_crqb { | 259 | struct mv_crqb { |
221 | u32 sg_addr; | 260 | u32 sg_addr; |
@@ -252,14 +291,37 @@ struct mv_port_priv { | |||
252 | u32 pp_flags; | 291 | u32 pp_flags; |
253 | }; | 292 | }; |
254 | 293 | ||
294 | struct mv_port_signal { | ||
295 | u32 amps; | ||
296 | u32 pre; | ||
297 | }; | ||
298 | |||
299 | struct mv_host_priv; | ||
300 | struct mv_hw_ops { | ||
301 | void (*phy_errata)(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
302 | unsigned int port); | ||
303 | void (*enable_leds)(struct mv_host_priv *hpriv, void __iomem *mmio); | ||
304 | void (*read_preamp)(struct mv_host_priv *hpriv, int idx, | ||
305 | void __iomem *mmio); | ||
306 | int (*reset_hc)(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
307 | unsigned int n_hc); | ||
308 | void (*reset_flash)(struct mv_host_priv *hpriv, void __iomem *mmio); | ||
309 | void (*reset_bus)(struct pci_dev *pdev, void __iomem *mmio); | ||
310 | }; | ||
311 | |||
255 | struct mv_host_priv { | 312 | struct mv_host_priv { |
256 | u32 hp_flags; | 313 | u32 hp_flags; |
314 | struct mv_port_signal signal[8]; | ||
315 | const struct mv_hw_ops *ops; | ||
257 | }; | 316 | }; |
258 | 317 | ||
259 | static void mv_irq_clear(struct ata_port *ap); | 318 | static void mv_irq_clear(struct ata_port *ap); |
260 | static u32 mv_scr_read(struct ata_port *ap, unsigned int sc_reg_in); | 319 | static u32 mv_scr_read(struct ata_port *ap, unsigned int sc_reg_in); |
261 | static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); | 320 | static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); |
321 | static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in); | ||
322 | static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); | ||
262 | static void mv_phy_reset(struct ata_port *ap); | 323 | static void mv_phy_reset(struct ata_port *ap); |
324 | static void __mv_phy_reset(struct ata_port *ap, int can_sleep); | ||
263 | static void mv_host_stop(struct ata_host_set *host_set); | 325 | static void mv_host_stop(struct ata_host_set *host_set); |
264 | static int mv_port_start(struct ata_port *ap); | 326 | static int mv_port_start(struct ata_port *ap); |
265 | static void mv_port_stop(struct ata_port *ap); | 327 | static void mv_port_stop(struct ata_port *ap); |
@@ -270,6 +332,29 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance, | |||
270 | static void mv_eng_timeout(struct ata_port *ap); | 332 | static void mv_eng_timeout(struct ata_port *ap); |
271 | static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 333 | static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
272 | 334 | ||
335 | static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
336 | unsigned int port); | ||
337 | static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio); | ||
338 | static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx, | ||
339 | void __iomem *mmio); | ||
340 | static int mv5_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
341 | unsigned int n_hc); | ||
342 | static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio); | ||
343 | static void mv5_reset_bus(struct pci_dev *pdev, void __iomem *mmio); | ||
344 | |||
345 | static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
346 | unsigned int port); | ||
347 | static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio); | ||
348 | static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx, | ||
349 | void __iomem *mmio); | ||
350 | static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
351 | unsigned int n_hc); | ||
352 | static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio); | ||
353 | static void mv_reset_pci_bus(struct pci_dev *pdev, void __iomem *mmio); | ||
354 | static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
355 | unsigned int port_no); | ||
356 | static void mv_stop_and_reset(struct ata_port *ap); | ||
357 | |||
273 | static struct scsi_host_template mv_sht = { | 358 | static struct scsi_host_template mv_sht = { |
274 | .module = THIS_MODULE, | 359 | .module = THIS_MODULE, |
275 | .name = DRV_NAME, | 360 | .name = DRV_NAME, |
@@ -278,7 +363,7 @@ static struct scsi_host_template mv_sht = { | |||
278 | .eh_strategy_handler = ata_scsi_error, | 363 | .eh_strategy_handler = ata_scsi_error, |
279 | .can_queue = MV_USE_Q_DEPTH, | 364 | .can_queue = MV_USE_Q_DEPTH, |
280 | .this_id = ATA_SHT_THIS_ID, | 365 | .this_id = ATA_SHT_THIS_ID, |
281 | .sg_tablesize = MV_MAX_SG_CT, | 366 | .sg_tablesize = MV_MAX_SG_CT / 2, |
282 | .max_sectors = ATA_MAX_SECTORS, | 367 | .max_sectors = ATA_MAX_SECTORS, |
283 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, | 368 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, |
284 | .emulated = ATA_SHT_EMULATED, | 369 | .emulated = ATA_SHT_EMULATED, |
@@ -290,7 +375,34 @@ static struct scsi_host_template mv_sht = { | |||
290 | .ordered_flush = 1, | 375 | .ordered_flush = 1, |
291 | }; | 376 | }; |
292 | 377 | ||
293 | static const struct ata_port_operations mv_ops = { | 378 | static const struct ata_port_operations mv5_ops = { |
379 | .port_disable = ata_port_disable, | ||
380 | |||
381 | .tf_load = ata_tf_load, | ||
382 | .tf_read = ata_tf_read, | ||
383 | .check_status = ata_check_status, | ||
384 | .exec_command = ata_exec_command, | ||
385 | .dev_select = ata_std_dev_select, | ||
386 | |||
387 | .phy_reset = mv_phy_reset, | ||
388 | |||
389 | .qc_prep = mv_qc_prep, | ||
390 | .qc_issue = mv_qc_issue, | ||
391 | |||
392 | .eng_timeout = mv_eng_timeout, | ||
393 | |||
394 | .irq_handler = mv_interrupt, | ||
395 | .irq_clear = mv_irq_clear, | ||
396 | |||
397 | .scr_read = mv5_scr_read, | ||
398 | .scr_write = mv5_scr_write, | ||
399 | |||
400 | .port_start = mv_port_start, | ||
401 | .port_stop = mv_port_stop, | ||
402 | .host_stop = mv_host_stop, | ||
403 | }; | ||
404 | |||
405 | static const struct ata_port_operations mv6_ops = { | ||
294 | .port_disable = ata_port_disable, | 406 | .port_disable = ata_port_disable, |
295 | 407 | ||
296 | .tf_load = ata_tf_load, | 408 | .tf_load = ata_tf_load, |
@@ -322,37 +434,44 @@ static struct ata_port_info mv_port_info[] = { | |||
322 | .sht = &mv_sht, | 434 | .sht = &mv_sht, |
323 | .host_flags = MV_COMMON_FLAGS, | 435 | .host_flags = MV_COMMON_FLAGS, |
324 | .pio_mask = 0x1f, /* pio0-4 */ | 436 | .pio_mask = 0x1f, /* pio0-4 */ |
325 | .udma_mask = 0, /* 0x7f (udma0-6 disabled for now) */ | 437 | .udma_mask = 0x7f, /* udma0-6 */ |
326 | .port_ops = &mv_ops, | 438 | .port_ops = &mv5_ops, |
327 | }, | 439 | }, |
328 | { /* chip_508x */ | 440 | { /* chip_508x */ |
329 | .sht = &mv_sht, | 441 | .sht = &mv_sht, |
330 | .host_flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC), | 442 | .host_flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC), |
331 | .pio_mask = 0x1f, /* pio0-4 */ | 443 | .pio_mask = 0x1f, /* pio0-4 */ |
332 | .udma_mask = 0, /* 0x7f (udma0-6 disabled for now) */ | 444 | .udma_mask = 0x7f, /* udma0-6 */ |
333 | .port_ops = &mv_ops, | 445 | .port_ops = &mv5_ops, |
446 | }, | ||
447 | { /* chip_5080 */ | ||
448 | .sht = &mv_sht, | ||
449 | .host_flags = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC), | ||
450 | .pio_mask = 0x1f, /* pio0-4 */ | ||
451 | .udma_mask = 0x7f, /* udma0-6 */ | ||
452 | .port_ops = &mv5_ops, | ||
334 | }, | 453 | }, |
335 | { /* chip_604x */ | 454 | { /* chip_604x */ |
336 | .sht = &mv_sht, | 455 | .sht = &mv_sht, |
337 | .host_flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS), | 456 | .host_flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS), |
338 | .pio_mask = 0x1f, /* pio0-4 */ | 457 | .pio_mask = 0x1f, /* pio0-4 */ |
339 | .udma_mask = 0x7f, /* udma0-6 */ | 458 | .udma_mask = 0x7f, /* udma0-6 */ |
340 | .port_ops = &mv_ops, | 459 | .port_ops = &mv6_ops, |
341 | }, | 460 | }, |
342 | { /* chip_608x */ | 461 | { /* chip_608x */ |
343 | .sht = &mv_sht, | 462 | .sht = &mv_sht, |
344 | .host_flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS | | 463 | .host_flags = (MV_COMMON_FLAGS | MV_6XXX_FLAGS | |
345 | MV_FLAG_DUAL_HC), | 464 | MV_FLAG_DUAL_HC), |
346 | .pio_mask = 0x1f, /* pio0-4 */ | 465 | .pio_mask = 0x1f, /* pio0-4 */ |
347 | .udma_mask = 0x7f, /* udma0-6 */ | 466 | .udma_mask = 0x7f, /* udma0-6 */ |
348 | .port_ops = &mv_ops, | 467 | .port_ops = &mv6_ops, |
349 | }, | 468 | }, |
350 | }; | 469 | }; |
351 | 470 | ||
352 | static const struct pci_device_id mv_pci_tbl[] = { | 471 | static const struct pci_device_id mv_pci_tbl[] = { |
353 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5040), 0, 0, chip_504x}, | 472 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5040), 0, 0, chip_504x}, |
354 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5041), 0, 0, chip_504x}, | 473 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5041), 0, 0, chip_504x}, |
355 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5080), 0, 0, chip_508x}, | 474 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5080), 0, 0, chip_5080}, |
356 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5081), 0, 0, chip_508x}, | 475 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5081), 0, 0, chip_508x}, |
357 | 476 | ||
358 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6040), 0, 0, chip_604x}, | 477 | {PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6040), 0, 0, chip_604x}, |
@@ -371,6 +490,24 @@ static struct pci_driver mv_pci_driver = { | |||
371 | .remove = ata_pci_remove_one, | 490 | .remove = ata_pci_remove_one, |
372 | }; | 491 | }; |
373 | 492 | ||
493 | static const struct mv_hw_ops mv5xxx_ops = { | ||
494 | .phy_errata = mv5_phy_errata, | ||
495 | .enable_leds = mv5_enable_leds, | ||
496 | .read_preamp = mv5_read_preamp, | ||
497 | .reset_hc = mv5_reset_hc, | ||
498 | .reset_flash = mv5_reset_flash, | ||
499 | .reset_bus = mv5_reset_bus, | ||
500 | }; | ||
501 | |||
502 | static const struct mv_hw_ops mv6xxx_ops = { | ||
503 | .phy_errata = mv6_phy_errata, | ||
504 | .enable_leds = mv6_enable_leds, | ||
505 | .read_preamp = mv6_read_preamp, | ||
506 | .reset_hc = mv6_reset_hc, | ||
507 | .reset_flash = mv6_reset_flash, | ||
508 | .reset_bus = mv_reset_pci_bus, | ||
509 | }; | ||
510 | |||
374 | /* | 511 | /* |
375 | * Functions | 512 | * Functions |
376 | */ | 513 | */ |
@@ -386,11 +523,27 @@ static inline void __iomem *mv_hc_base(void __iomem *base, unsigned int hc) | |||
386 | return (base + MV_SATAHC0_REG_BASE + (hc * MV_SATAHC_REG_SZ)); | 523 | return (base + MV_SATAHC0_REG_BASE + (hc * MV_SATAHC_REG_SZ)); |
387 | } | 524 | } |
388 | 525 | ||
526 | static inline unsigned int mv_hc_from_port(unsigned int port) | ||
527 | { | ||
528 | return port >> MV_PORT_HC_SHIFT; | ||
529 | } | ||
530 | |||
531 | static inline unsigned int mv_hardport_from_port(unsigned int port) | ||
532 | { | ||
533 | return port & MV_PORT_MASK; | ||
534 | } | ||
535 | |||
536 | static inline void __iomem *mv_hc_base_from_port(void __iomem *base, | ||
537 | unsigned int port) | ||
538 | { | ||
539 | return mv_hc_base(base, mv_hc_from_port(port)); | ||
540 | } | ||
541 | |||
389 | static inline void __iomem *mv_port_base(void __iomem *base, unsigned int port) | 542 | static inline void __iomem *mv_port_base(void __iomem *base, unsigned int port) |
390 | { | 543 | { |
391 | return (mv_hc_base(base, port >> MV_PORT_HC_SHIFT) + | 544 | return mv_hc_base_from_port(base, port) + |
392 | MV_SATAHC_ARBTR_REG_SZ + | 545 | MV_SATAHC_ARBTR_REG_SZ + |
393 | ((port & MV_PORT_MASK) * MV_PORT_REG_SZ)); | 546 | (mv_hardport_from_port(port) * MV_PORT_REG_SZ); |
394 | } | 547 | } |
395 | 548 | ||
396 | static inline void __iomem *mv_ap_base(struct ata_port *ap) | 549 | static inline void __iomem *mv_ap_base(struct ata_port *ap) |
@@ -398,9 +551,9 @@ static inline void __iomem *mv_ap_base(struct ata_port *ap) | |||
398 | return mv_port_base(ap->host_set->mmio_base, ap->port_no); | 551 | return mv_port_base(ap->host_set->mmio_base, ap->port_no); |
399 | } | 552 | } |
400 | 553 | ||
401 | static inline int mv_get_hc_count(unsigned long hp_flags) | 554 | static inline int mv_get_hc_count(unsigned long host_flags) |
402 | { | 555 | { |
403 | return ((hp_flags & MV_FLAG_DUAL_HC) ? 2 : 1); | 556 | return ((host_flags & MV_FLAG_DUAL_HC) ? 2 : 1); |
404 | } | 557 | } |
405 | 558 | ||
406 | static void mv_irq_clear(struct ata_port *ap) | 559 | static void mv_irq_clear(struct ata_port *ap) |
@@ -452,7 +605,7 @@ static void mv_stop_dma(struct ata_port *ap) | |||
452 | } else { | 605 | } else { |
453 | assert(!(EDMA_EN & readl(port_mmio + EDMA_CMD_OFS))); | 606 | assert(!(EDMA_EN & readl(port_mmio + EDMA_CMD_OFS))); |
454 | } | 607 | } |
455 | 608 | ||
456 | /* now properly wait for the eDMA to stop */ | 609 | /* now properly wait for the eDMA to stop */ |
457 | for (i = 1000; i > 0; i--) { | 610 | for (i = 1000; i > 0; i--) { |
458 | reg = readl(port_mmio + EDMA_CMD_OFS); | 611 | reg = readl(port_mmio + EDMA_CMD_OFS); |
@@ -503,7 +656,7 @@ static void mv_dump_all_regs(void __iomem *mmio_base, int port, | |||
503 | struct pci_dev *pdev) | 656 | struct pci_dev *pdev) |
504 | { | 657 | { |
505 | #ifdef ATA_DEBUG | 658 | #ifdef ATA_DEBUG |
506 | void __iomem *hc_base = mv_hc_base(mmio_base, | 659 | void __iomem *hc_base = mv_hc_base(mmio_base, |
507 | port >> MV_PORT_HC_SHIFT); | 660 | port >> MV_PORT_HC_SHIFT); |
508 | void __iomem *port_base; | 661 | void __iomem *port_base; |
509 | int start_port, num_ports, p, start_hc, num_hcs, hc; | 662 | int start_port, num_ports, p, start_hc, num_hcs, hc; |
@@ -517,7 +670,7 @@ static void mv_dump_all_regs(void __iomem *mmio_base, int port, | |||
517 | start_port = port; | 670 | start_port = port; |
518 | num_ports = num_hcs = 1; | 671 | num_ports = num_hcs = 1; |
519 | } | 672 | } |
520 | DPRINTK("All registers for port(s) %u-%u:\n", start_port, | 673 | DPRINTK("All registers for port(s) %u-%u:\n", start_port, |
521 | num_ports > 1 ? num_ports - 1 : start_port); | 674 | num_ports > 1 ? num_ports - 1 : start_port); |
522 | 675 | ||
523 | if (NULL != pdev) { | 676 | if (NULL != pdev) { |
@@ -585,70 +738,6 @@ static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val) | |||
585 | } | 738 | } |
586 | 739 | ||
587 | /** | 740 | /** |
588 | * mv_global_soft_reset - Perform the 6xxx global soft reset | ||
589 | * @mmio_base: base address of the HBA | ||
590 | * | ||
591 | * This routine only applies to 6xxx parts. | ||
592 | * | ||
593 | * LOCKING: | ||
594 | * Inherited from caller. | ||
595 | */ | ||
596 | static int mv_global_soft_reset(void __iomem *mmio_base) | ||
597 | { | ||
598 | void __iomem *reg = mmio_base + PCI_MAIN_CMD_STS_OFS; | ||
599 | int i, rc = 0; | ||
600 | u32 t; | ||
601 | |||
602 | /* Following procedure defined in PCI "main command and status | ||
603 | * register" table. | ||
604 | */ | ||
605 | t = readl(reg); | ||
606 | writel(t | STOP_PCI_MASTER, reg); | ||
607 | |||
608 | for (i = 0; i < 1000; i++) { | ||
609 | udelay(1); | ||
610 | t = readl(reg); | ||
611 | if (PCI_MASTER_EMPTY & t) { | ||
612 | break; | ||
613 | } | ||
614 | } | ||
615 | if (!(PCI_MASTER_EMPTY & t)) { | ||
616 | printk(KERN_ERR DRV_NAME ": PCI master won't flush\n"); | ||
617 | rc = 1; | ||
618 | goto done; | ||
619 | } | ||
620 | |||
621 | /* set reset */ | ||
622 | i = 5; | ||
623 | do { | ||
624 | writel(t | GLOB_SFT_RST, reg); | ||
625 | t = readl(reg); | ||
626 | udelay(1); | ||
627 | } while (!(GLOB_SFT_RST & t) && (i-- > 0)); | ||
628 | |||
629 | if (!(GLOB_SFT_RST & t)) { | ||
630 | printk(KERN_ERR DRV_NAME ": can't set global reset\n"); | ||
631 | rc = 1; | ||
632 | goto done; | ||
633 | } | ||
634 | |||
635 | /* clear reset and *reenable the PCI master* (not mentioned in spec) */ | ||
636 | i = 5; | ||
637 | do { | ||
638 | writel(t & ~(GLOB_SFT_RST | STOP_PCI_MASTER), reg); | ||
639 | t = readl(reg); | ||
640 | udelay(1); | ||
641 | } while ((GLOB_SFT_RST & t) && (i-- > 0)); | ||
642 | |||
643 | if (GLOB_SFT_RST & t) { | ||
644 | printk(KERN_ERR DRV_NAME ": can't clear global reset\n"); | ||
645 | rc = 1; | ||
646 | } | ||
647 | done: | ||
648 | return rc; | ||
649 | } | ||
650 | |||
651 | /** | ||
652 | * mv_host_stop - Host specific cleanup/stop routine. | 741 | * mv_host_stop - Host specific cleanup/stop routine. |
653 | * @host_set: host data structure | 742 | * @host_set: host data structure |
654 | * | 743 | * |
@@ -701,7 +790,7 @@ static int mv_port_start(struct ata_port *ap) | |||
701 | goto err_out; | 790 | goto err_out; |
702 | memset(pp, 0, sizeof(*pp)); | 791 | memset(pp, 0, sizeof(*pp)); |
703 | 792 | ||
704 | mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma, | 793 | mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma, |
705 | GFP_KERNEL); | 794 | GFP_KERNEL); |
706 | if (!mem) | 795 | if (!mem) |
707 | goto err_out_pp; | 796 | goto err_out_pp; |
@@ -711,7 +800,7 @@ static int mv_port_start(struct ata_port *ap) | |||
711 | if (rc) | 800 | if (rc) |
712 | goto err_out_priv; | 801 | goto err_out_priv; |
713 | 802 | ||
714 | /* First item in chunk of DMA memory: | 803 | /* First item in chunk of DMA memory: |
715 | * 32-slot command request table (CRQB), 32 bytes each in size | 804 | * 32-slot command request table (CRQB), 32 bytes each in size |
716 | */ | 805 | */ |
717 | pp->crqb = mem; | 806 | pp->crqb = mem; |
@@ -719,7 +808,7 @@ static int mv_port_start(struct ata_port *ap) | |||
719 | mem += MV_CRQB_Q_SZ; | 808 | mem += MV_CRQB_Q_SZ; |
720 | mem_dma += MV_CRQB_Q_SZ; | 809 | mem_dma += MV_CRQB_Q_SZ; |
721 | 810 | ||
722 | /* Second item: | 811 | /* Second item: |
723 | * 32-slot command response table (CRPB), 8 bytes each in size | 812 | * 32-slot command response table (CRPB), 8 bytes each in size |
724 | */ | 813 | */ |
725 | pp->crpb = mem; | 814 | pp->crpb = mem; |
@@ -733,18 +822,18 @@ static int mv_port_start(struct ata_port *ap) | |||
733 | pp->sg_tbl = mem; | 822 | pp->sg_tbl = mem; |
734 | pp->sg_tbl_dma = mem_dma; | 823 | pp->sg_tbl_dma = mem_dma; |
735 | 824 | ||
736 | writelfl(EDMA_CFG_Q_DEPTH | EDMA_CFG_RD_BRST_EXT | | 825 | writelfl(EDMA_CFG_Q_DEPTH | EDMA_CFG_RD_BRST_EXT | |
737 | EDMA_CFG_WR_BUFF_LEN, port_mmio + EDMA_CFG_OFS); | 826 | EDMA_CFG_WR_BUFF_LEN, port_mmio + EDMA_CFG_OFS); |
738 | 827 | ||
739 | writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS); | 828 | writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS); |
740 | writelfl(pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK, | 829 | writelfl(pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK, |
741 | port_mmio + EDMA_REQ_Q_IN_PTR_OFS); | 830 | port_mmio + EDMA_REQ_Q_IN_PTR_OFS); |
742 | 831 | ||
743 | writelfl(0, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); | 832 | writelfl(0, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); |
744 | writelfl(0, port_mmio + EDMA_RSP_Q_IN_PTR_OFS); | 833 | writelfl(0, port_mmio + EDMA_RSP_Q_IN_PTR_OFS); |
745 | 834 | ||
746 | writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS); | 835 | writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS); |
747 | writelfl(pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK, | 836 | writelfl(pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK, |
748 | port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); | 837 | port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); |
749 | 838 | ||
750 | pp->req_producer = pp->rsp_consumer = 0; | 839 | pp->req_producer = pp->rsp_consumer = 0; |
@@ -805,20 +894,30 @@ static void mv_fill_sg(struct ata_queued_cmd *qc) | |||
805 | struct scatterlist *sg; | 894 | struct scatterlist *sg; |
806 | 895 | ||
807 | ata_for_each_sg(sg, qc) { | 896 | ata_for_each_sg(sg, qc) { |
808 | u32 sg_len; | ||
809 | dma_addr_t addr; | 897 | dma_addr_t addr; |
898 | u32 sg_len, len, offset; | ||
810 | 899 | ||
811 | addr = sg_dma_address(sg); | 900 | addr = sg_dma_address(sg); |
812 | sg_len = sg_dma_len(sg); | 901 | sg_len = sg_dma_len(sg); |
813 | 902 | ||
814 | pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); | 903 | while (sg_len) { |
815 | pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); | 904 | offset = addr & MV_DMA_BOUNDARY; |
816 | assert(0 == (sg_len & ~MV_DMA_BOUNDARY)); | 905 | len = sg_len; |
817 | pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len); | 906 | if ((offset + sg_len) > 0x10000) |
818 | if (ata_sg_is_last(sg, qc)) | 907 | len = 0x10000 - offset; |
819 | pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL); | 908 | |
909 | pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); | ||
910 | pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); | ||
911 | pp->sg_tbl[i].flags_size = cpu_to_le32(len); | ||
912 | |||
913 | sg_len -= len; | ||
914 | addr += len; | ||
915 | |||
916 | if (!sg_len && ata_sg_is_last(sg, qc)) | ||
917 | pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL); | ||
820 | 918 | ||
821 | i++; | 919 | i++; |
920 | } | ||
822 | } | 921 | } |
823 | } | 922 | } |
824 | 923 | ||
@@ -859,7 +958,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) | |||
859 | } | 958 | } |
860 | 959 | ||
861 | /* the req producer index should be the same as we remember it */ | 960 | /* the req producer index should be the same as we remember it */ |
862 | assert(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >> | 961 | assert(((readl(mv_ap_base(qc->ap) + EDMA_REQ_Q_IN_PTR_OFS) >> |
863 | EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == | 962 | EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == |
864 | pp->req_producer); | 963 | pp->req_producer); |
865 | 964 | ||
@@ -871,9 +970,9 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) | |||
871 | assert(MV_MAX_Q_DEPTH > qc->tag); | 970 | assert(MV_MAX_Q_DEPTH > qc->tag); |
872 | flags |= qc->tag << CRQB_TAG_SHIFT; | 971 | flags |= qc->tag << CRQB_TAG_SHIFT; |
873 | 972 | ||
874 | pp->crqb[pp->req_producer].sg_addr = | 973 | pp->crqb[pp->req_producer].sg_addr = |
875 | cpu_to_le32(pp->sg_tbl_dma & 0xffffffff); | 974 | cpu_to_le32(pp->sg_tbl_dma & 0xffffffff); |
876 | pp->crqb[pp->req_producer].sg_addr_hi = | 975 | pp->crqb[pp->req_producer].sg_addr_hi = |
877 | cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16); | 976 | cpu_to_le32((pp->sg_tbl_dma >> 16) >> 16); |
878 | pp->crqb[pp->req_producer].ctrl_flags = cpu_to_le16(flags); | 977 | pp->crqb[pp->req_producer].ctrl_flags = cpu_to_le16(flags); |
879 | 978 | ||
@@ -896,7 +995,7 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) | |||
896 | #ifdef LIBATA_NCQ /* FIXME: remove this line when NCQ added */ | 995 | #ifdef LIBATA_NCQ /* FIXME: remove this line when NCQ added */ |
897 | case ATA_CMD_FPDMA_READ: | 996 | case ATA_CMD_FPDMA_READ: |
898 | case ATA_CMD_FPDMA_WRITE: | 997 | case ATA_CMD_FPDMA_WRITE: |
899 | mv_crqb_pack_cmd(cw++, tf->hob_feature, ATA_REG_FEATURE, 0); | 998 | mv_crqb_pack_cmd(cw++, tf->hob_feature, ATA_REG_FEATURE, 0); |
900 | mv_crqb_pack_cmd(cw++, tf->feature, ATA_REG_FEATURE, 0); | 999 | mv_crqb_pack_cmd(cw++, tf->feature, ATA_REG_FEATURE, 0); |
901 | break; | 1000 | break; |
902 | #endif /* FIXME: remove this line when NCQ added */ | 1001 | #endif /* FIXME: remove this line when NCQ added */ |
@@ -962,7 +1061,7 @@ static int mv_qc_issue(struct ata_queued_cmd *qc) | |||
962 | pp->req_producer); | 1061 | pp->req_producer); |
963 | /* until we do queuing, the queue should be empty at this point */ | 1062 | /* until we do queuing, the queue should be empty at this point */ |
964 | assert(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == | 1063 | assert(((in_ptr >> EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == |
965 | ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) >> | 1064 | ((readl(port_mmio + EDMA_REQ_Q_OUT_PTR_OFS) >> |
966 | EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK)); | 1065 | EDMA_REQ_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK)); |
967 | 1066 | ||
968 | mv_inc_q_index(&pp->req_producer); /* now incr producer index */ | 1067 | mv_inc_q_index(&pp->req_producer); /* now incr producer index */ |
@@ -999,15 +1098,15 @@ static u8 mv_get_crpb_status(struct ata_port *ap) | |||
999 | out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); | 1098 | out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); |
1000 | 1099 | ||
1001 | /* the response consumer index should be the same as we remember it */ | 1100 | /* the response consumer index should be the same as we remember it */ |
1002 | assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == | 1101 | assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == |
1003 | pp->rsp_consumer); | 1102 | pp->rsp_consumer); |
1004 | 1103 | ||
1005 | /* increment our consumer index... */ | 1104 | /* increment our consumer index... */ |
1006 | pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer); | 1105 | pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer); |
1007 | 1106 | ||
1008 | /* and, until we do NCQ, there should only be 1 CRPB waiting */ | 1107 | /* and, until we do NCQ, there should only be 1 CRPB waiting */ |
1009 | assert(((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) >> | 1108 | assert(((readl(port_mmio + EDMA_RSP_Q_IN_PTR_OFS) >> |
1010 | EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == | 1109 | EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == |
1011 | pp->rsp_consumer); | 1110 | pp->rsp_consumer); |
1012 | 1111 | ||
1013 | /* write out our inc'd consumer index so EDMA knows we're caught up */ | 1112 | /* write out our inc'd consumer index so EDMA knows we're caught up */ |
@@ -1055,7 +1154,7 @@ static void mv_err_intr(struct ata_port *ap) | |||
1055 | 1154 | ||
1056 | /* check for fatal here and recover if needed */ | 1155 | /* check for fatal here and recover if needed */ |
1057 | if (EDMA_ERR_FATAL & edma_err_cause) { | 1156 | if (EDMA_ERR_FATAL & edma_err_cause) { |
1058 | mv_phy_reset(ap); | 1157 | mv_stop_and_reset(ap); |
1059 | } | 1158 | } |
1060 | } | 1159 | } |
1061 | 1160 | ||
@@ -1120,6 +1219,10 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
1120 | handled++; | 1219 | handled++; |
1121 | } | 1220 | } |
1122 | 1221 | ||
1222 | if (ap && | ||
1223 | (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))) | ||
1224 | continue; | ||
1225 | |||
1123 | err_mask = ac_err_mask(ata_status); | 1226 | err_mask = ac_err_mask(ata_status); |
1124 | 1227 | ||
1125 | shift = port << 1; /* (port * 2) */ | 1228 | shift = port << 1; /* (port * 2) */ |
@@ -1131,14 +1234,15 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
1131 | err_mask |= AC_ERR_OTHER; | 1234 | err_mask |= AC_ERR_OTHER; |
1132 | handled++; | 1235 | handled++; |
1133 | } | 1236 | } |
1134 | 1237 | ||
1135 | if (handled && ap) { | 1238 | if (handled && ap) { |
1136 | qc = ata_qc_from_tag(ap, ap->active_tag); | 1239 | qc = ata_qc_from_tag(ap, ap->active_tag); |
1137 | if (NULL != qc) { | 1240 | if (NULL != qc) { |
1138 | VPRINTK("port %u IRQ found for qc, " | 1241 | VPRINTK("port %u IRQ found for qc, " |
1139 | "ata_status 0x%x\n", port,ata_status); | 1242 | "ata_status 0x%x\n", port,ata_status); |
1140 | /* mark qc status appropriately */ | 1243 | /* mark qc status appropriately */ |
1141 | ata_qc_complete(qc, err_mask); | 1244 | if (!(qc->tf.ctl & ATA_NIEN)) |
1245 | ata_qc_complete(qc, err_mask); | ||
1142 | } | 1246 | } |
1143 | } | 1247 | } |
1144 | } | 1248 | } |
@@ -1146,7 +1250,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
1146 | } | 1250 | } |
1147 | 1251 | ||
1148 | /** | 1252 | /** |
1149 | * mv_interrupt - | 1253 | * mv_interrupt - |
1150 | * @irq: unused | 1254 | * @irq: unused |
1151 | * @dev_instance: private data; in this case the host structure | 1255 | * @dev_instance: private data; in this case the host structure |
1152 | * @regs: unused | 1256 | * @regs: unused |
@@ -1156,7 +1260,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant, | |||
1156 | * routine to handle. Also check for PCI errors which are only | 1260 | * routine to handle. Also check for PCI errors which are only |
1157 | * reported here. | 1261 | * reported here. |
1158 | * | 1262 | * |
1159 | * LOCKING: | 1263 | * LOCKING: |
1160 | * This routine holds the host_set lock while processing pending | 1264 | * This routine holds the host_set lock while processing pending |
1161 | * interrupts. | 1265 | * interrupts. |
1162 | */ | 1266 | */ |
@@ -1202,8 +1306,422 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance, | |||
1202 | return IRQ_RETVAL(handled); | 1306 | return IRQ_RETVAL(handled); |
1203 | } | 1307 | } |
1204 | 1308 | ||
1309 | static void __iomem *mv5_phy_base(void __iomem *mmio, unsigned int port) | ||
1310 | { | ||
1311 | void __iomem *hc_mmio = mv_hc_base_from_port(mmio, port); | ||
1312 | unsigned long ofs = (mv_hardport_from_port(port) + 1) * 0x100UL; | ||
1313 | |||
1314 | return hc_mmio + ofs; | ||
1315 | } | ||
1316 | |||
1317 | static unsigned int mv5_scr_offset(unsigned int sc_reg_in) | ||
1318 | { | ||
1319 | unsigned int ofs; | ||
1320 | |||
1321 | switch (sc_reg_in) { | ||
1322 | case SCR_STATUS: | ||
1323 | case SCR_ERROR: | ||
1324 | case SCR_CONTROL: | ||
1325 | ofs = sc_reg_in * sizeof(u32); | ||
1326 | break; | ||
1327 | default: | ||
1328 | ofs = 0xffffffffU; | ||
1329 | break; | ||
1330 | } | ||
1331 | return ofs; | ||
1332 | } | ||
1333 | |||
1334 | static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in) | ||
1335 | { | ||
1336 | void __iomem *mmio = mv5_phy_base(ap->host_set->mmio_base, ap->port_no); | ||
1337 | unsigned int ofs = mv5_scr_offset(sc_reg_in); | ||
1338 | |||
1339 | if (ofs != 0xffffffffU) | ||
1340 | return readl(mmio + ofs); | ||
1341 | else | ||
1342 | return (u32) ofs; | ||
1343 | } | ||
1344 | |||
1345 | static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val) | ||
1346 | { | ||
1347 | void __iomem *mmio = mv5_phy_base(ap->host_set->mmio_base, ap->port_no); | ||
1348 | unsigned int ofs = mv5_scr_offset(sc_reg_in); | ||
1349 | |||
1350 | if (ofs != 0xffffffffU) | ||
1351 | writelfl(val, mmio + ofs); | ||
1352 | } | ||
1353 | |||
1354 | static void mv5_reset_bus(struct pci_dev *pdev, void __iomem *mmio) | ||
1355 | { | ||
1356 | u8 rev_id; | ||
1357 | int early_5080; | ||
1358 | |||
1359 | pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id); | ||
1360 | |||
1361 | early_5080 = (pdev->device == 0x5080) && (rev_id == 0); | ||
1362 | |||
1363 | if (!early_5080) { | ||
1364 | u32 tmp = readl(mmio + MV_PCI_EXP_ROM_BAR_CTL); | ||
1365 | tmp |= (1 << 0); | ||
1366 | writel(tmp, mmio + MV_PCI_EXP_ROM_BAR_CTL); | ||
1367 | } | ||
1368 | |||
1369 | mv_reset_pci_bus(pdev, mmio); | ||
1370 | } | ||
1371 | |||
1372 | static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio) | ||
1373 | { | ||
1374 | writel(0x0fcfffff, mmio + MV_FLASH_CTL); | ||
1375 | } | ||
1376 | |||
1377 | static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx, | ||
1378 | void __iomem *mmio) | ||
1379 | { | ||
1380 | void __iomem *phy_mmio = mv5_phy_base(mmio, idx); | ||
1381 | u32 tmp; | ||
1382 | |||
1383 | tmp = readl(phy_mmio + MV5_PHY_MODE); | ||
1384 | |||
1385 | hpriv->signal[idx].pre = tmp & 0x1800; /* bits 12:11 */ | ||
1386 | hpriv->signal[idx].amps = tmp & 0xe0; /* bits 7:5 */ | ||
1387 | } | ||
1388 | |||
1389 | static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio) | ||
1390 | { | ||
1391 | u32 tmp; | ||
1392 | |||
1393 | writel(0, mmio + MV_GPIO_PORT_CTL); | ||
1394 | |||
1395 | /* FIXME: handle MV_HP_ERRATA_50XXB2 errata */ | ||
1396 | |||
1397 | tmp = readl(mmio + MV_PCI_EXP_ROM_BAR_CTL); | ||
1398 | tmp |= ~(1 << 0); | ||
1399 | writel(tmp, mmio + MV_PCI_EXP_ROM_BAR_CTL); | ||
1400 | } | ||
1401 | |||
1402 | static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1403 | unsigned int port) | ||
1404 | { | ||
1405 | void __iomem *phy_mmio = mv5_phy_base(mmio, port); | ||
1406 | const u32 mask = (1<<12) | (1<<11) | (1<<7) | (1<<6) | (1<<5); | ||
1407 | u32 tmp; | ||
1408 | int fix_apm_sq = (hpriv->hp_flags & MV_HP_ERRATA_50XXB0); | ||
1409 | |||
1410 | if (fix_apm_sq) { | ||
1411 | tmp = readl(phy_mmio + MV5_LT_MODE); | ||
1412 | tmp |= (1 << 19); | ||
1413 | writel(tmp, phy_mmio + MV5_LT_MODE); | ||
1414 | |||
1415 | tmp = readl(phy_mmio + MV5_PHY_CTL); | ||
1416 | tmp &= ~0x3; | ||
1417 | tmp |= 0x1; | ||
1418 | writel(tmp, phy_mmio + MV5_PHY_CTL); | ||
1419 | } | ||
1420 | |||
1421 | tmp = readl(phy_mmio + MV5_PHY_MODE); | ||
1422 | tmp &= ~mask; | ||
1423 | tmp |= hpriv->signal[port].pre; | ||
1424 | tmp |= hpriv->signal[port].amps; | ||
1425 | writel(tmp, phy_mmio + MV5_PHY_MODE); | ||
1426 | } | ||
1427 | |||
1428 | |||
1429 | #undef ZERO | ||
1430 | #define ZERO(reg) writel(0, port_mmio + (reg)) | ||
1431 | static void mv5_reset_hc_port(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1432 | unsigned int port) | ||
1433 | { | ||
1434 | void __iomem *port_mmio = mv_port_base(mmio, port); | ||
1435 | |||
1436 | writelfl(EDMA_DS, port_mmio + EDMA_CMD_OFS); | ||
1437 | |||
1438 | mv_channel_reset(hpriv, mmio, port); | ||
1439 | |||
1440 | ZERO(0x028); /* command */ | ||
1441 | writel(0x11f, port_mmio + EDMA_CFG_OFS); | ||
1442 | ZERO(0x004); /* timer */ | ||
1443 | ZERO(0x008); /* irq err cause */ | ||
1444 | ZERO(0x00c); /* irq err mask */ | ||
1445 | ZERO(0x010); /* rq bah */ | ||
1446 | ZERO(0x014); /* rq inp */ | ||
1447 | ZERO(0x018); /* rq outp */ | ||
1448 | ZERO(0x01c); /* respq bah */ | ||
1449 | ZERO(0x024); /* respq outp */ | ||
1450 | ZERO(0x020); /* respq inp */ | ||
1451 | ZERO(0x02c); /* test control */ | ||
1452 | writel(0xbc, port_mmio + EDMA_IORDY_TMOUT); | ||
1453 | } | ||
1454 | #undef ZERO | ||
1455 | |||
1456 | #define ZERO(reg) writel(0, hc_mmio + (reg)) | ||
1457 | static void mv5_reset_one_hc(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1458 | unsigned int hc) | ||
1459 | { | ||
1460 | void __iomem *hc_mmio = mv_hc_base(mmio, hc); | ||
1461 | u32 tmp; | ||
1462 | |||
1463 | ZERO(0x00c); | ||
1464 | ZERO(0x010); | ||
1465 | ZERO(0x014); | ||
1466 | ZERO(0x018); | ||
1467 | |||
1468 | tmp = readl(hc_mmio + 0x20); | ||
1469 | tmp &= 0x1c1c1c1c; | ||
1470 | tmp |= 0x03030303; | ||
1471 | writel(tmp, hc_mmio + 0x20); | ||
1472 | } | ||
1473 | #undef ZERO | ||
1474 | |||
1475 | static int mv5_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1476 | unsigned int n_hc) | ||
1477 | { | ||
1478 | unsigned int hc, port; | ||
1479 | |||
1480 | for (hc = 0; hc < n_hc; hc++) { | ||
1481 | for (port = 0; port < MV_PORTS_PER_HC; port++) | ||
1482 | mv5_reset_hc_port(hpriv, mmio, | ||
1483 | (hc * MV_PORTS_PER_HC) + port); | ||
1484 | |||
1485 | mv5_reset_one_hc(hpriv, mmio, hc); | ||
1486 | } | ||
1487 | |||
1488 | return 0; | ||
1489 | } | ||
1490 | |||
1491 | #undef ZERO | ||
1492 | #define ZERO(reg) writel(0, mmio + (reg)) | ||
1493 | static void mv_reset_pci_bus(struct pci_dev *pdev, void __iomem *mmio) | ||
1494 | { | ||
1495 | u32 tmp; | ||
1496 | |||
1497 | tmp = readl(mmio + MV_PCI_MODE); | ||
1498 | tmp &= 0xff00ffff; | ||
1499 | writel(tmp, mmio + MV_PCI_MODE); | ||
1500 | |||
1501 | ZERO(MV_PCI_DISC_TIMER); | ||
1502 | ZERO(MV_PCI_MSI_TRIGGER); | ||
1503 | writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT); | ||
1504 | ZERO(HC_MAIN_IRQ_MASK_OFS); | ||
1505 | ZERO(MV_PCI_SERR_MASK); | ||
1506 | ZERO(PCI_IRQ_CAUSE_OFS); | ||
1507 | ZERO(PCI_IRQ_MASK_OFS); | ||
1508 | ZERO(MV_PCI_ERR_LOW_ADDRESS); | ||
1509 | ZERO(MV_PCI_ERR_HIGH_ADDRESS); | ||
1510 | ZERO(MV_PCI_ERR_ATTRIBUTE); | ||
1511 | ZERO(MV_PCI_ERR_COMMAND); | ||
1512 | } | ||
1513 | #undef ZERO | ||
1514 | |||
1515 | static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio) | ||
1516 | { | ||
1517 | u32 tmp; | ||
1518 | |||
1519 | mv5_reset_flash(hpriv, mmio); | ||
1520 | |||
1521 | tmp = readl(mmio + MV_GPIO_PORT_CTL); | ||
1522 | tmp &= 0x3; | ||
1523 | tmp |= (1 << 5) | (1 << 6); | ||
1524 | writel(tmp, mmio + MV_GPIO_PORT_CTL); | ||
1525 | } | ||
1526 | |||
1527 | /** | ||
1528 | * mv6_reset_hc - Perform the 6xxx global soft reset | ||
1529 | * @mmio: base address of the HBA | ||
1530 | * | ||
1531 | * This routine only applies to 6xxx parts. | ||
1532 | * | ||
1533 | * LOCKING: | ||
1534 | * Inherited from caller. | ||
1535 | */ | ||
1536 | static int mv6_reset_hc(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1537 | unsigned int n_hc) | ||
1538 | { | ||
1539 | void __iomem *reg = mmio + PCI_MAIN_CMD_STS_OFS; | ||
1540 | int i, rc = 0; | ||
1541 | u32 t; | ||
1542 | |||
1543 | /* Following procedure defined in PCI "main command and status | ||
1544 | * register" table. | ||
1545 | */ | ||
1546 | t = readl(reg); | ||
1547 | writel(t | STOP_PCI_MASTER, reg); | ||
1548 | |||
1549 | for (i = 0; i < 1000; i++) { | ||
1550 | udelay(1); | ||
1551 | t = readl(reg); | ||
1552 | if (PCI_MASTER_EMPTY & t) { | ||
1553 | break; | ||
1554 | } | ||
1555 | } | ||
1556 | if (!(PCI_MASTER_EMPTY & t)) { | ||
1557 | printk(KERN_ERR DRV_NAME ": PCI master won't flush\n"); | ||
1558 | rc = 1; | ||
1559 | goto done; | ||
1560 | } | ||
1561 | |||
1562 | /* set reset */ | ||
1563 | i = 5; | ||
1564 | do { | ||
1565 | writel(t | GLOB_SFT_RST, reg); | ||
1566 | t = readl(reg); | ||
1567 | udelay(1); | ||
1568 | } while (!(GLOB_SFT_RST & t) && (i-- > 0)); | ||
1569 | |||
1570 | if (!(GLOB_SFT_RST & t)) { | ||
1571 | printk(KERN_ERR DRV_NAME ": can't set global reset\n"); | ||
1572 | rc = 1; | ||
1573 | goto done; | ||
1574 | } | ||
1575 | |||
1576 | /* clear reset and *reenable the PCI master* (not mentioned in spec) */ | ||
1577 | i = 5; | ||
1578 | do { | ||
1579 | writel(t & ~(GLOB_SFT_RST | STOP_PCI_MASTER), reg); | ||
1580 | t = readl(reg); | ||
1581 | udelay(1); | ||
1582 | } while ((GLOB_SFT_RST & t) && (i-- > 0)); | ||
1583 | |||
1584 | if (GLOB_SFT_RST & t) { | ||
1585 | printk(KERN_ERR DRV_NAME ": can't clear global reset\n"); | ||
1586 | rc = 1; | ||
1587 | } | ||
1588 | done: | ||
1589 | return rc; | ||
1590 | } | ||
1591 | |||
1592 | static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx, | ||
1593 | void __iomem *mmio) | ||
1594 | { | ||
1595 | void __iomem *port_mmio; | ||
1596 | u32 tmp; | ||
1597 | |||
1598 | tmp = readl(mmio + MV_RESET_CFG); | ||
1599 | if ((tmp & (1 << 0)) == 0) { | ||
1600 | hpriv->signal[idx].amps = 0x7 << 8; | ||
1601 | hpriv->signal[idx].pre = 0x1 << 5; | ||
1602 | return; | ||
1603 | } | ||
1604 | |||
1605 | port_mmio = mv_port_base(mmio, idx); | ||
1606 | tmp = readl(port_mmio + PHY_MODE2); | ||
1607 | |||
1608 | hpriv->signal[idx].amps = tmp & 0x700; /* bits 10:8 */ | ||
1609 | hpriv->signal[idx].pre = tmp & 0xe0; /* bits 7:5 */ | ||
1610 | } | ||
1611 | |||
1612 | static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio) | ||
1613 | { | ||
1614 | writel(0x00000060, mmio + MV_GPIO_PORT_CTL); | ||
1615 | } | ||
1616 | |||
1617 | static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1618 | unsigned int port) | ||
1619 | { | ||
1620 | void __iomem *port_mmio = mv_port_base(mmio, port); | ||
1621 | |||
1622 | u32 hp_flags = hpriv->hp_flags; | ||
1623 | int fix_phy_mode2 = | ||
1624 | hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); | ||
1625 | int fix_phy_mode4 = | ||
1626 | hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); | ||
1627 | u32 m2, tmp; | ||
1628 | |||
1629 | if (fix_phy_mode2) { | ||
1630 | m2 = readl(port_mmio + PHY_MODE2); | ||
1631 | m2 &= ~(1 << 16); | ||
1632 | m2 |= (1 << 31); | ||
1633 | writel(m2, port_mmio + PHY_MODE2); | ||
1634 | |||
1635 | udelay(200); | ||
1636 | |||
1637 | m2 = readl(port_mmio + PHY_MODE2); | ||
1638 | m2 &= ~((1 << 16) | (1 << 31)); | ||
1639 | writel(m2, port_mmio + PHY_MODE2); | ||
1640 | |||
1641 | udelay(200); | ||
1642 | } | ||
1643 | |||
1644 | /* who knows what this magic does */ | ||
1645 | tmp = readl(port_mmio + PHY_MODE3); | ||
1646 | tmp &= ~0x7F800000; | ||
1647 | tmp |= 0x2A800000; | ||
1648 | writel(tmp, port_mmio + PHY_MODE3); | ||
1649 | |||
1650 | if (fix_phy_mode4) { | ||
1651 | u32 m4; | ||
1652 | |||
1653 | m4 = readl(port_mmio + PHY_MODE4); | ||
1654 | |||
1655 | if (hp_flags & MV_HP_ERRATA_60X1B2) | ||
1656 | tmp = readl(port_mmio + 0x310); | ||
1657 | |||
1658 | m4 = (m4 & ~(1 << 1)) | (1 << 0); | ||
1659 | |||
1660 | writel(m4, port_mmio + PHY_MODE4); | ||
1661 | |||
1662 | if (hp_flags & MV_HP_ERRATA_60X1B2) | ||
1663 | writel(tmp, port_mmio + 0x310); | ||
1664 | } | ||
1665 | |||
1666 | /* Revert values of pre-emphasis and signal amps to the saved ones */ | ||
1667 | m2 = readl(port_mmio + PHY_MODE2); | ||
1668 | |||
1669 | m2 &= ~MV_M2_PREAMP_MASK; | ||
1670 | m2 |= hpriv->signal[port].amps; | ||
1671 | m2 |= hpriv->signal[port].pre; | ||
1672 | m2 &= ~(1 << 16); | ||
1673 | |||
1674 | writel(m2, port_mmio + PHY_MODE2); | ||
1675 | } | ||
1676 | |||
1677 | static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio, | ||
1678 | unsigned int port_no) | ||
1679 | { | ||
1680 | void __iomem *port_mmio = mv_port_base(mmio, port_no); | ||
1681 | |||
1682 | writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS); | ||
1683 | |||
1684 | if (IS_60XX(hpriv)) { | ||
1685 | u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL); | ||
1686 | ifctl |= (1 << 12) | (1 << 7); | ||
1687 | writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL); | ||
1688 | } | ||
1689 | |||
1690 | udelay(25); /* allow reset propagation */ | ||
1691 | |||
1692 | /* Spec never mentions clearing the bit. Marvell's driver does | ||
1693 | * clear the bit, however. | ||
1694 | */ | ||
1695 | writelfl(0, port_mmio + EDMA_CMD_OFS); | ||
1696 | |||
1697 | hpriv->ops->phy_errata(hpriv, mmio, port_no); | ||
1698 | |||
1699 | if (IS_50XX(hpriv)) | ||
1700 | mdelay(1); | ||
1701 | } | ||
1702 | |||
1703 | static void mv_stop_and_reset(struct ata_port *ap) | ||
1704 | { | ||
1705 | struct mv_host_priv *hpriv = ap->host_set->private_data; | ||
1706 | void __iomem *mmio = ap->host_set->mmio_base; | ||
1707 | |||
1708 | mv_stop_dma(ap); | ||
1709 | |||
1710 | mv_channel_reset(hpriv, mmio, ap->port_no); | ||
1711 | |||
1712 | __mv_phy_reset(ap, 0); | ||
1713 | } | ||
1714 | |||
1715 | static inline void __msleep(unsigned int msec, int can_sleep) | ||
1716 | { | ||
1717 | if (can_sleep) | ||
1718 | msleep(msec); | ||
1719 | else | ||
1720 | mdelay(msec); | ||
1721 | } | ||
1722 | |||
1205 | /** | 1723 | /** |
1206 | * mv_phy_reset - Perform eDMA reset followed by COMRESET | 1724 | * __mv_phy_reset - Perform eDMA reset followed by COMRESET |
1207 | * @ap: ATA channel to manipulate | 1725 | * @ap: ATA channel to manipulate |
1208 | * | 1726 | * |
1209 | * Part of this is taken from __sata_phy_reset and modified to | 1727 | * Part of this is taken from __sata_phy_reset and modified to |
@@ -1213,41 +1731,47 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance, | |||
1213 | * Inherited from caller. This is coded to safe to call at | 1731 | * Inherited from caller. This is coded to safe to call at |
1214 | * interrupt level, i.e. it does not sleep. | 1732 | * interrupt level, i.e. it does not sleep. |
1215 | */ | 1733 | */ |
1216 | static void mv_phy_reset(struct ata_port *ap) | 1734 | static void __mv_phy_reset(struct ata_port *ap, int can_sleep) |
1217 | { | 1735 | { |
1736 | struct mv_port_priv *pp = ap->private_data; | ||
1737 | struct mv_host_priv *hpriv = ap->host_set->private_data; | ||
1218 | void __iomem *port_mmio = mv_ap_base(ap); | 1738 | void __iomem *port_mmio = mv_ap_base(ap); |
1219 | struct ata_taskfile tf; | 1739 | struct ata_taskfile tf; |
1220 | struct ata_device *dev = &ap->device[0]; | 1740 | struct ata_device *dev = &ap->device[0]; |
1221 | unsigned long timeout; | 1741 | unsigned long timeout; |
1742 | int retry = 5; | ||
1743 | u32 sstatus; | ||
1222 | 1744 | ||
1223 | VPRINTK("ENTER, port %u, mmio 0x%p\n", ap->port_no, port_mmio); | 1745 | VPRINTK("ENTER, port %u, mmio 0x%p\n", ap->port_no, port_mmio); |
1224 | 1746 | ||
1225 | mv_stop_dma(ap); | 1747 | DPRINTK("S-regs after ATA_RST: SStat 0x%08x SErr 0x%08x " |
1226 | |||
1227 | writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS); | ||
1228 | udelay(25); /* allow reset propagation */ | ||
1229 | |||
1230 | /* Spec never mentions clearing the bit. Marvell's driver does | ||
1231 | * clear the bit, however. | ||
1232 | */ | ||
1233 | writelfl(0, port_mmio + EDMA_CMD_OFS); | ||
1234 | |||
1235 | VPRINTK("S-regs after ATA_RST: SStat 0x%08x SErr 0x%08x " | ||
1236 | "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS), | 1748 | "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS), |
1237 | mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL)); | 1749 | mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL)); |
1238 | 1750 | ||
1239 | /* proceed to init communications via the scr_control reg */ | 1751 | /* Issue COMRESET via SControl */ |
1752 | comreset_retry: | ||
1240 | scr_write_flush(ap, SCR_CONTROL, 0x301); | 1753 | scr_write_flush(ap, SCR_CONTROL, 0x301); |
1241 | mdelay(1); | 1754 | __msleep(1, can_sleep); |
1755 | |||
1242 | scr_write_flush(ap, SCR_CONTROL, 0x300); | 1756 | scr_write_flush(ap, SCR_CONTROL, 0x300); |
1243 | timeout = jiffies + (HZ * 1); | 1757 | __msleep(20, can_sleep); |
1758 | |||
1759 | timeout = jiffies + msecs_to_jiffies(200); | ||
1244 | do { | 1760 | do { |
1245 | mdelay(10); | 1761 | sstatus = scr_read(ap, SCR_STATUS) & 0x3; |
1246 | if ((scr_read(ap, SCR_STATUS) & 0xf) != 1) | 1762 | if ((sstatus == 3) || (sstatus == 0)) |
1247 | break; | 1763 | break; |
1764 | |||
1765 | __msleep(1, can_sleep); | ||
1248 | } while (time_before(jiffies, timeout)); | 1766 | } while (time_before(jiffies, timeout)); |
1249 | 1767 | ||
1250 | VPRINTK("S-regs after PHY wake: SStat 0x%08x SErr 0x%08x " | 1768 | /* work around errata */ |
1769 | if (IS_60XX(hpriv) && | ||
1770 | (sstatus != 0x0) && (sstatus != 0x113) && (sstatus != 0x123) && | ||
1771 | (retry-- > 0)) | ||
1772 | goto comreset_retry; | ||
1773 | |||
1774 | DPRINTK("S-regs after PHY wake: SStat 0x%08x SErr 0x%08x " | ||
1251 | "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS), | 1775 | "SCtrl 0x%08x\n", mv_scr_read(ap, SCR_STATUS), |
1252 | mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL)); | 1776 | mv_scr_read(ap, SCR_ERROR), mv_scr_read(ap, SCR_CONTROL)); |
1253 | 1777 | ||
@@ -1261,6 +1785,21 @@ static void mv_phy_reset(struct ata_port *ap) | |||
1261 | } | 1785 | } |
1262 | ap->cbl = ATA_CBL_SATA; | 1786 | ap->cbl = ATA_CBL_SATA; |
1263 | 1787 | ||
1788 | /* even after SStatus reflects that device is ready, | ||
1789 | * it seems to take a while for link to be fully | ||
1790 | * established (and thus Status no longer 0x80/0x7F), | ||
1791 | * so we poll a bit for that, here. | ||
1792 | */ | ||
1793 | retry = 20; | ||
1794 | while (1) { | ||
1795 | u8 drv_stat = ata_check_status(ap); | ||
1796 | if ((drv_stat != 0x80) && (drv_stat != 0x7f)) | ||
1797 | break; | ||
1798 | __msleep(500, can_sleep); | ||
1799 | if (retry-- <= 0) | ||
1800 | break; | ||
1801 | } | ||
1802 | |||
1264 | tf.lbah = readb((void __iomem *) ap->ioaddr.lbah_addr); | 1803 | tf.lbah = readb((void __iomem *) ap->ioaddr.lbah_addr); |
1265 | tf.lbam = readb((void __iomem *) ap->ioaddr.lbam_addr); | 1804 | tf.lbam = readb((void __iomem *) ap->ioaddr.lbam_addr); |
1266 | tf.lbal = readb((void __iomem *) ap->ioaddr.lbal_addr); | 1805 | tf.lbal = readb((void __iomem *) ap->ioaddr.lbal_addr); |
@@ -1271,9 +1810,19 @@ static void mv_phy_reset(struct ata_port *ap) | |||
1271 | VPRINTK("Port disabled post-sig: No device present.\n"); | 1810 | VPRINTK("Port disabled post-sig: No device present.\n"); |
1272 | ata_port_disable(ap); | 1811 | ata_port_disable(ap); |
1273 | } | 1812 | } |
1813 | |||
1814 | writelfl(0, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); | ||
1815 | |||
1816 | pp->pp_flags &= ~MV_PP_FLAG_EDMA_EN; | ||
1817 | |||
1274 | VPRINTK("EXIT\n"); | 1818 | VPRINTK("EXIT\n"); |
1275 | } | 1819 | } |
1276 | 1820 | ||
1821 | static void mv_phy_reset(struct ata_port *ap) | ||
1822 | { | ||
1823 | __mv_phy_reset(ap, 1); | ||
1824 | } | ||
1825 | |||
1277 | /** | 1826 | /** |
1278 | * mv_eng_timeout - Routine called by libata when SCSI times out I/O | 1827 | * mv_eng_timeout - Routine called by libata when SCSI times out I/O |
1279 | * @ap: ATA channel to manipulate | 1828 | * @ap: ATA channel to manipulate |
@@ -1291,16 +1840,16 @@ static void mv_eng_timeout(struct ata_port *ap) | |||
1291 | 1840 | ||
1292 | printk(KERN_ERR "ata%u: Entering mv_eng_timeout\n",ap->id); | 1841 | printk(KERN_ERR "ata%u: Entering mv_eng_timeout\n",ap->id); |
1293 | DPRINTK("All regs @ start of eng_timeout\n"); | 1842 | DPRINTK("All regs @ start of eng_timeout\n"); |
1294 | mv_dump_all_regs(ap->host_set->mmio_base, ap->port_no, | 1843 | mv_dump_all_regs(ap->host_set->mmio_base, ap->port_no, |
1295 | to_pci_dev(ap->host_set->dev)); | 1844 | to_pci_dev(ap->host_set->dev)); |
1296 | 1845 | ||
1297 | qc = ata_qc_from_tag(ap, ap->active_tag); | 1846 | qc = ata_qc_from_tag(ap, ap->active_tag); |
1298 | printk(KERN_ERR "mmio_base %p ap %p qc %p scsi_cmnd %p &cmnd %p\n", | 1847 | printk(KERN_ERR "mmio_base %p ap %p qc %p scsi_cmnd %p &cmnd %p\n", |
1299 | ap->host_set->mmio_base, ap, qc, qc->scsicmd, | 1848 | ap->host_set->mmio_base, ap, qc, qc->scsicmd, |
1300 | &qc->scsicmd->cmnd); | 1849 | &qc->scsicmd->cmnd); |
1301 | 1850 | ||
1302 | mv_err_intr(ap); | 1851 | mv_err_intr(ap); |
1303 | mv_phy_reset(ap); | 1852 | mv_stop_and_reset(ap); |
1304 | 1853 | ||
1305 | if (!qc) { | 1854 | if (!qc) { |
1306 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", | 1855 | printk(KERN_ERR "ata%u: BUG: timeout without command\n", |
@@ -1336,17 +1885,17 @@ static void mv_port_init(struct ata_ioports *port, void __iomem *port_mmio) | |||
1336 | unsigned long shd_base = (unsigned long) port_mmio + SHD_BLK_OFS; | 1885 | unsigned long shd_base = (unsigned long) port_mmio + SHD_BLK_OFS; |
1337 | unsigned serr_ofs; | 1886 | unsigned serr_ofs; |
1338 | 1887 | ||
1339 | /* PIO related setup | 1888 | /* PIO related setup |
1340 | */ | 1889 | */ |
1341 | port->data_addr = shd_base + (sizeof(u32) * ATA_REG_DATA); | 1890 | port->data_addr = shd_base + (sizeof(u32) * ATA_REG_DATA); |
1342 | port->error_addr = | 1891 | port->error_addr = |
1343 | port->feature_addr = shd_base + (sizeof(u32) * ATA_REG_ERR); | 1892 | port->feature_addr = shd_base + (sizeof(u32) * ATA_REG_ERR); |
1344 | port->nsect_addr = shd_base + (sizeof(u32) * ATA_REG_NSECT); | 1893 | port->nsect_addr = shd_base + (sizeof(u32) * ATA_REG_NSECT); |
1345 | port->lbal_addr = shd_base + (sizeof(u32) * ATA_REG_LBAL); | 1894 | port->lbal_addr = shd_base + (sizeof(u32) * ATA_REG_LBAL); |
1346 | port->lbam_addr = shd_base + (sizeof(u32) * ATA_REG_LBAM); | 1895 | port->lbam_addr = shd_base + (sizeof(u32) * ATA_REG_LBAM); |
1347 | port->lbah_addr = shd_base + (sizeof(u32) * ATA_REG_LBAH); | 1896 | port->lbah_addr = shd_base + (sizeof(u32) * ATA_REG_LBAH); |
1348 | port->device_addr = shd_base + (sizeof(u32) * ATA_REG_DEVICE); | 1897 | port->device_addr = shd_base + (sizeof(u32) * ATA_REG_DEVICE); |
1349 | port->status_addr = | 1898 | port->status_addr = |
1350 | port->command_addr = shd_base + (sizeof(u32) * ATA_REG_STATUS); | 1899 | port->command_addr = shd_base + (sizeof(u32) * ATA_REG_STATUS); |
1351 | /* special case: control/altstatus doesn't have ATA_REG_ address */ | 1900 | /* special case: control/altstatus doesn't have ATA_REG_ address */ |
1352 | port->altstatus_addr = port->ctl_addr = shd_base + SHD_CTL_AST_OFS; | 1901 | port->altstatus_addr = port->ctl_addr = shd_base + SHD_CTL_AST_OFS; |
@@ -1362,14 +1911,92 @@ static void mv_port_init(struct ata_ioports *port, void __iomem *port_mmio) | |||
1362 | /* unmask all EDMA error interrupts */ | 1911 | /* unmask all EDMA error interrupts */ |
1363 | writelfl(~0, port_mmio + EDMA_ERR_IRQ_MASK_OFS); | 1912 | writelfl(~0, port_mmio + EDMA_ERR_IRQ_MASK_OFS); |
1364 | 1913 | ||
1365 | VPRINTK("EDMA cfg=0x%08x EDMA IRQ err cause/mask=0x%08x/0x%08x\n", | 1914 | VPRINTK("EDMA cfg=0x%08x EDMA IRQ err cause/mask=0x%08x/0x%08x\n", |
1366 | readl(port_mmio + EDMA_CFG_OFS), | 1915 | readl(port_mmio + EDMA_CFG_OFS), |
1367 | readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS), | 1916 | readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS), |
1368 | readl(port_mmio + EDMA_ERR_IRQ_MASK_OFS)); | 1917 | readl(port_mmio + EDMA_ERR_IRQ_MASK_OFS)); |
1369 | } | 1918 | } |
1370 | 1919 | ||
1920 | static int mv_chip_id(struct pci_dev *pdev, struct mv_host_priv *hpriv, | ||
1921 | unsigned int board_idx) | ||
1922 | { | ||
1923 | u8 rev_id; | ||
1924 | u32 hp_flags = hpriv->hp_flags; | ||
1925 | |||
1926 | pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id); | ||
1927 | |||
1928 | switch(board_idx) { | ||
1929 | case chip_5080: | ||
1930 | hpriv->ops = &mv5xxx_ops; | ||
1931 | hp_flags |= MV_HP_50XX; | ||
1932 | |||
1933 | switch (rev_id) { | ||
1934 | case 0x1: | ||
1935 | hp_flags |= MV_HP_ERRATA_50XXB0; | ||
1936 | break; | ||
1937 | case 0x3: | ||
1938 | hp_flags |= MV_HP_ERRATA_50XXB2; | ||
1939 | break; | ||
1940 | default: | ||
1941 | dev_printk(KERN_WARNING, &pdev->dev, | ||
1942 | "Applying 50XXB2 workarounds to unknown rev\n"); | ||
1943 | hp_flags |= MV_HP_ERRATA_50XXB2; | ||
1944 | break; | ||
1945 | } | ||
1946 | break; | ||
1947 | |||
1948 | case chip_504x: | ||
1949 | case chip_508x: | ||
1950 | hpriv->ops = &mv5xxx_ops; | ||
1951 | hp_flags |= MV_HP_50XX; | ||
1952 | |||
1953 | switch (rev_id) { | ||
1954 | case 0x0: | ||
1955 | hp_flags |= MV_HP_ERRATA_50XXB0; | ||
1956 | break; | ||
1957 | case 0x3: | ||
1958 | hp_flags |= MV_HP_ERRATA_50XXB2; | ||
1959 | break; | ||
1960 | default: | ||
1961 | dev_printk(KERN_WARNING, &pdev->dev, | ||
1962 | "Applying B2 workarounds to unknown rev\n"); | ||
1963 | hp_flags |= MV_HP_ERRATA_50XXB2; | ||
1964 | break; | ||
1965 | } | ||
1966 | break; | ||
1967 | |||
1968 | case chip_604x: | ||
1969 | case chip_608x: | ||
1970 | hpriv->ops = &mv6xxx_ops; | ||
1971 | |||
1972 | switch (rev_id) { | ||
1973 | case 0x7: | ||
1974 | hp_flags |= MV_HP_ERRATA_60X1B2; | ||
1975 | break; | ||
1976 | case 0x9: | ||
1977 | hp_flags |= MV_HP_ERRATA_60X1C0; | ||
1978 | break; | ||
1979 | default: | ||
1980 | dev_printk(KERN_WARNING, &pdev->dev, | ||
1981 | "Applying B2 workarounds to unknown rev\n"); | ||
1982 | hp_flags |= MV_HP_ERRATA_60X1B2; | ||
1983 | break; | ||
1984 | } | ||
1985 | break; | ||
1986 | |||
1987 | default: | ||
1988 | printk(KERN_ERR DRV_NAME ": BUG: invalid board index %u\n", board_idx); | ||
1989 | return 1; | ||
1990 | } | ||
1991 | |||
1992 | hpriv->hp_flags = hp_flags; | ||
1993 | |||
1994 | return 0; | ||
1995 | } | ||
1996 | |||
1371 | /** | 1997 | /** |
1372 | * mv_host_init - Perform some early initialization of the host. | 1998 | * mv_init_host - Perform some early initialization of the host. |
1999 | * @pdev: host PCI device | ||
1373 | * @probe_ent: early data struct representing the host | 2000 | * @probe_ent: early data struct representing the host |
1374 | * | 2001 | * |
1375 | * If possible, do an early global reset of the host. Then do | 2002 | * If possible, do an early global reset of the host. Then do |
@@ -1378,23 +2005,48 @@ static void mv_port_init(struct ata_ioports *port, void __iomem *port_mmio) | |||
1378 | * LOCKING: | 2005 | * LOCKING: |
1379 | * Inherited from caller. | 2006 | * Inherited from caller. |
1380 | */ | 2007 | */ |
1381 | static int mv_host_init(struct ata_probe_ent *probe_ent) | 2008 | static int mv_init_host(struct pci_dev *pdev, struct ata_probe_ent *probe_ent, |
2009 | unsigned int board_idx) | ||
1382 | { | 2010 | { |
1383 | int rc = 0, n_hc, port, hc; | 2011 | int rc = 0, n_hc, port, hc; |
1384 | void __iomem *mmio = probe_ent->mmio_base; | 2012 | void __iomem *mmio = probe_ent->mmio_base; |
1385 | void __iomem *port_mmio; | 2013 | struct mv_host_priv *hpriv = probe_ent->private_data; |
1386 | 2014 | ||
1387 | if ((MV_FLAG_GLBL_SFT_RST & probe_ent->host_flags) && | 2015 | /* global interrupt mask */ |
1388 | mv_global_soft_reset(probe_ent->mmio_base)) { | 2016 | writel(0, mmio + HC_MAIN_IRQ_MASK_OFS); |
1389 | rc = 1; | 2017 | |
2018 | rc = mv_chip_id(pdev, hpriv, board_idx); | ||
2019 | if (rc) | ||
1390 | goto done; | 2020 | goto done; |
1391 | } | ||
1392 | 2021 | ||
1393 | n_hc = mv_get_hc_count(probe_ent->host_flags); | 2022 | n_hc = mv_get_hc_count(probe_ent->host_flags); |
1394 | probe_ent->n_ports = MV_PORTS_PER_HC * n_hc; | 2023 | probe_ent->n_ports = MV_PORTS_PER_HC * n_hc; |
1395 | 2024 | ||
2025 | for (port = 0; port < probe_ent->n_ports; port++) | ||
2026 | hpriv->ops->read_preamp(hpriv, port, mmio); | ||
2027 | |||
2028 | rc = hpriv->ops->reset_hc(hpriv, mmio, n_hc); | ||
2029 | if (rc) | ||
2030 | goto done; | ||
2031 | |||
2032 | hpriv->ops->reset_flash(hpriv, mmio); | ||
2033 | hpriv->ops->reset_bus(pdev, mmio); | ||
2034 | hpriv->ops->enable_leds(hpriv, mmio); | ||
2035 | |||
1396 | for (port = 0; port < probe_ent->n_ports; port++) { | 2036 | for (port = 0; port < probe_ent->n_ports; port++) { |
1397 | port_mmio = mv_port_base(mmio, port); | 2037 | if (IS_60XX(hpriv)) { |
2038 | void __iomem *port_mmio = mv_port_base(mmio, port); | ||
2039 | |||
2040 | u32 ifctl = readl(port_mmio + SATA_INTERFACE_CTL); | ||
2041 | ifctl |= (1 << 12); | ||
2042 | writelfl(ifctl, port_mmio + SATA_INTERFACE_CTL); | ||
2043 | } | ||
2044 | |||
2045 | hpriv->ops->phy_errata(hpriv, mmio, port); | ||
2046 | } | ||
2047 | |||
2048 | for (port = 0; port < probe_ent->n_ports; port++) { | ||
2049 | void __iomem *port_mmio = mv_port_base(mmio, port); | ||
1398 | mv_port_init(&probe_ent->port[port], port_mmio); | 2050 | mv_port_init(&probe_ent->port[port], port_mmio); |
1399 | } | 2051 | } |
1400 | 2052 | ||
@@ -1418,11 +2070,12 @@ static int mv_host_init(struct ata_probe_ent *probe_ent) | |||
1418 | writelfl(~HC_MAIN_MASKED_IRQS, mmio + HC_MAIN_IRQ_MASK_OFS); | 2070 | writelfl(~HC_MAIN_MASKED_IRQS, mmio + HC_MAIN_IRQ_MASK_OFS); |
1419 | 2071 | ||
1420 | VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x " | 2072 | VPRINTK("HC MAIN IRQ cause/mask=0x%08x/0x%08x " |
1421 | "PCI int cause/mask=0x%08x/0x%08x\n", | 2073 | "PCI int cause/mask=0x%08x/0x%08x\n", |
1422 | readl(mmio + HC_MAIN_IRQ_CAUSE_OFS), | 2074 | readl(mmio + HC_MAIN_IRQ_CAUSE_OFS), |
1423 | readl(mmio + HC_MAIN_IRQ_MASK_OFS), | 2075 | readl(mmio + HC_MAIN_IRQ_MASK_OFS), |
1424 | readl(mmio + PCI_IRQ_CAUSE_OFS), | 2076 | readl(mmio + PCI_IRQ_CAUSE_OFS), |
1425 | readl(mmio + PCI_IRQ_MASK_OFS)); | 2077 | readl(mmio + PCI_IRQ_MASK_OFS)); |
2078 | |||
1426 | done: | 2079 | done: |
1427 | return rc; | 2080 | return rc; |
1428 | } | 2081 | } |
@@ -1458,7 +2111,7 @@ static void mv_print_info(struct ata_probe_ent *probe_ent) | |||
1458 | 2111 | ||
1459 | dev_printk(KERN_INFO, &pdev->dev, | 2112 | dev_printk(KERN_INFO, &pdev->dev, |
1460 | "%u slots %u ports %s mode IRQ via %s\n", | 2113 | "%u slots %u ports %s mode IRQ via %s\n", |
1461 | (unsigned)MV_MAX_Q_DEPTH, probe_ent->n_ports, | 2114 | (unsigned)MV_MAX_Q_DEPTH, probe_ent->n_ports, |
1462 | scc_s, (MV_HP_FLAG_MSI & hpriv->hp_flags) ? "MSI" : "INTx"); | 2115 | scc_s, (MV_HP_FLAG_MSI & hpriv->hp_flags) ? "MSI" : "INTx"); |
1463 | } | 2116 | } |
1464 | 2117 | ||
@@ -1528,7 +2181,7 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1528 | probe_ent->private_data = hpriv; | 2181 | probe_ent->private_data = hpriv; |
1529 | 2182 | ||
1530 | /* initialize adapter */ | 2183 | /* initialize adapter */ |
1531 | rc = mv_host_init(probe_ent); | 2184 | rc = mv_init_host(pdev, probe_ent, board_idx); |
1532 | if (rc) { | 2185 | if (rc) { |
1533 | goto err_out_hpriv; | 2186 | goto err_out_hpriv; |
1534 | } | 2187 | } |
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index 242d906987ad..8a8e3e3ef0ed 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include "sata_promise.h" | 46 | #include "sata_promise.h" |
47 | 47 | ||
48 | #define DRV_NAME "sata_promise" | 48 | #define DRV_NAME "sata_promise" |
49 | #define DRV_VERSION "1.02" | 49 | #define DRV_VERSION "1.03" |
50 | 50 | ||
51 | 51 | ||
52 | enum { | 52 | enum { |
diff --git a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c index 4a6d3067d23c..a8987f5ff5cc 100644 --- a/drivers/scsi/sata_qstor.c +++ b/drivers/scsi/sata_qstor.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <linux/libata.h> | 41 | #include <linux/libata.h> |
42 | 42 | ||
43 | #define DRV_NAME "sata_qstor" | 43 | #define DRV_NAME "sata_qstor" |
44 | #define DRV_VERSION "0.04" | 44 | #define DRV_VERSION "0.05" |
45 | 45 | ||
46 | enum { | 46 | enum { |
47 | QS_PORTS = 4, | 47 | QS_PORTS = 4, |
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index 55e744d6db88..cb1933a3bd55 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c | |||
@@ -139,6 +139,7 @@ enum { | |||
139 | PORT_CS_DEV_RST = (1 << 1), /* device reset */ | 139 | PORT_CS_DEV_RST = (1 << 1), /* device reset */ |
140 | PORT_CS_INIT = (1 << 2), /* port initialize */ | 140 | PORT_CS_INIT = (1 << 2), /* port initialize */ |
141 | PORT_CS_IRQ_WOC = (1 << 3), /* interrupt write one to clear */ | 141 | PORT_CS_IRQ_WOC = (1 << 3), /* interrupt write one to clear */ |
142 | PORT_CS_CDB16 = (1 << 5), /* 0=12b cdb, 1=16b cdb */ | ||
142 | PORT_CS_RESUME = (1 << 6), /* port resume */ | 143 | PORT_CS_RESUME = (1 << 6), /* port resume */ |
143 | PORT_CS_32BIT_ACTV = (1 << 10), /* 32-bit activation */ | 144 | PORT_CS_32BIT_ACTV = (1 << 10), /* 32-bit activation */ |
144 | PORT_CS_PM_EN = (1 << 13), /* port multiplier enable */ | 145 | PORT_CS_PM_EN = (1 << 13), /* port multiplier enable */ |
@@ -188,11 +189,29 @@ enum { | |||
188 | PORT_CERR_XFR_PCIPERR = 35, /* PSD ecode 11 - PCI prity err during transfer */ | 189 | PORT_CERR_XFR_PCIPERR = 35, /* PSD ecode 11 - PCI prity err during transfer */ |
189 | PORT_CERR_SENDSERVICE = 36, /* FIS received while sending service */ | 190 | PORT_CERR_SENDSERVICE = 36, /* FIS received while sending service */ |
190 | 191 | ||
192 | /* bits of PRB control field */ | ||
193 | PRB_CTRL_PROTOCOL = (1 << 0), /* override def. ATA protocol */ | ||
194 | PRB_CTRL_PACKET_READ = (1 << 4), /* PACKET cmd read */ | ||
195 | PRB_CTRL_PACKET_WRITE = (1 << 5), /* PACKET cmd write */ | ||
196 | PRB_CTRL_NIEN = (1 << 6), /* Mask completion irq */ | ||
197 | PRB_CTRL_SRST = (1 << 7), /* Soft reset request (ign BSY?) */ | ||
198 | |||
199 | /* PRB protocol field */ | ||
200 | PRB_PROT_PACKET = (1 << 0), | ||
201 | PRB_PROT_TCQ = (1 << 1), | ||
202 | PRB_PROT_NCQ = (1 << 2), | ||
203 | PRB_PROT_READ = (1 << 3), | ||
204 | PRB_PROT_WRITE = (1 << 4), | ||
205 | PRB_PROT_TRANSPARENT = (1 << 5), | ||
206 | |||
191 | /* | 207 | /* |
192 | * Other constants | 208 | * Other constants |
193 | */ | 209 | */ |
194 | SGE_TRM = (1 << 31), /* Last SGE in chain */ | 210 | SGE_TRM = (1 << 31), /* Last SGE in chain */ |
195 | PRB_SOFT_RST = (1 << 7), /* Soft reset request (ign BSY?) */ | 211 | SGE_LNK = (1 << 30), /* linked list |
212 | Points to SGT, not SGE */ | ||
213 | SGE_DRD = (1 << 29), /* discard data read (/dev/null) | ||
214 | data address ignored */ | ||
196 | 215 | ||
197 | /* board id */ | 216 | /* board id */ |
198 | BID_SIL3124 = 0, | 217 | BID_SIL3124 = 0, |
diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c index 57e5a9d964c3..6e7f7c83a75a 100644 --- a/drivers/scsi/sata_svw.c +++ b/drivers/scsi/sata_svw.c | |||
@@ -54,7 +54,7 @@ | |||
54 | #endif /* CONFIG_PPC_OF */ | 54 | #endif /* CONFIG_PPC_OF */ |
55 | 55 | ||
56 | #define DRV_NAME "sata_svw" | 56 | #define DRV_NAME "sata_svw" |
57 | #define DRV_VERSION "1.06" | 57 | #define DRV_VERSION "1.07" |
58 | 58 | ||
59 | /* Taskfile registers offsets */ | 59 | /* Taskfile registers offsets */ |
60 | #define K2_SATA_TF_CMD_OFFSET 0x00 | 60 | #define K2_SATA_TF_CMD_OFFSET 0x00 |
diff --git a/drivers/scsi/sata_sx4.c b/drivers/scsi/sata_sx4.c index b4bbe48acab0..dcc3ad9a9d6e 100644 --- a/drivers/scsi/sata_sx4.c +++ b/drivers/scsi/sata_sx4.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include "sata_promise.h" | 46 | #include "sata_promise.h" |
47 | 47 | ||
48 | #define DRV_NAME "sata_sx4" | 48 | #define DRV_NAME "sata_sx4" |
49 | #define DRV_VERSION "0.7" | 49 | #define DRV_VERSION "0.8" |
50 | 50 | ||
51 | 51 | ||
52 | enum { | 52 | enum { |
diff --git a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c index 77a6e4b9262d..fcfa486965b4 100644 --- a/drivers/scsi/sata_vsc.c +++ b/drivers/scsi/sata_vsc.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #include <linux/libata.h> | 47 | #include <linux/libata.h> |
48 | 48 | ||
49 | #define DRV_NAME "sata_vsc" | 49 | #define DRV_NAME "sata_vsc" |
50 | #define DRV_VERSION "1.0" | 50 | #define DRV_VERSION "1.1" |
51 | 51 | ||
52 | /* Interrupt register offsets (from chip base address) */ | 52 | /* Interrupt register offsets (from chip base address) */ |
53 | #define VSC_SATA_INT_STAT_OFFSET 0x00 | 53 | #define VSC_SATA_INT_STAT_OFFSET 0x00 |
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 | ||
131 | DEFINE_SPINLOCK(zs_lock); | ||
132 | |||
131 | struct dec_zschannel zs_channels[NUM_CHANNELS]; | 133 | struct dec_zschannel zs_channels[NUM_CHANNELS]; |
132 | struct dec_serial zs_soft[NUM_CHANNELS]; | 134 | struct dec_serial zs_soft[NUM_CHANNELS]; |
133 | int zs_channels_found; | 135 | int 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 | ||
162 | DECLARE_TASK_QUEUE(tq_zs_serial); | ||
163 | |||
164 | static struct tty_driver *serial_driver; | 164 | static 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 | */ |
348 | static _INLINE_ void rs_sched_event(struct dec_serial *info, | 347 | static _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 | ||
356 | static _INLINE_ void receive_chars(struct dec_serial *info, | 353 | static _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 | */ |
500 | void rs_interrupt(int irq, void *dev_id, struct pt_regs * regs) | 497 | static 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 | */ |
621 | static void do_serial_bh(void) | ||
622 | { | ||
623 | run_task_queue(&tq_zs_serial); | ||
624 | } | ||
625 | 623 | ||
626 | static void do_softint(void *private_) | 624 | static 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 | ||
640 | int zs_startup(struct dec_serial * info) | 639 | static 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 | ||
864 | static void rs_flush_chars(struct tty_struct *tty) | 863 | static 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 | ||
882 | static int rs_write(struct tty_struct * tty, | 881 | static 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 | ||
1210 | static int rs_ioctl(struct tty_struct *tty, struct file * file, | 1197 | static 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 | */ |
1401 | void rs_hangup(struct tty_struct *tty) | 1387 | static 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 | */ |
1526 | int rs_open(struct tty_struct *tty, struct file * filp) | 1512 | static 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 | ||
1722 | static struct tty_operations serial_ops = { | 1708 | static 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 | */ |
1836 | static int | 1818 | static int zs_poll_tx_char(void *handle, unsigned char ch) |
1837 | zs_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 | ||
1860 | static int | 1841 | static int zs_poll_rx_char(void *handle) |
1861 | zs_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 | ||
18 | struct serial_struct { | 18 | struct 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 | |||
6 | obj-$(CONFIG_USB_SPEEDTOUCH) += speedtch.o | 6 | obj-$(CONFIG_USB_SPEEDTOUCH) += speedtch.o |
7 | obj-$(CONFIG_USB_ATM) += usbatm.o | 7 | obj-$(CONFIG_USB_ATM) += usbatm.o |
8 | obj-$(CONFIG_USB_XUSBATM) += xusbatm.o | 8 | obj-$(CONFIG_USB_XUSBATM) += xusbatm.o |
9 | |||
10 | ifeq ($(CONFIG_USB_DEBUG),y) | ||
11 | EXTRA_CFLAGS += -DDEBUG | ||
12 | endif | ||
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) | |||
14 | endif | 14 | endif |
15 | 15 | ||
16 | obj-$(CONFIG_USB) += usbcore.o | 16 | obj-$(CONFIG_USB) += usbcore.o |
17 | |||
18 | ifeq ($(CONFIG_USB_DEBUG),y) | ||
19 | EXTRA_CFLAGS += -DDEBUG | ||
20 | endif | ||
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 |
1395 | static int proc_ioctl_compat(struct dev_state *ps, void __user *arg) | 1395 | static 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 | ||
47 | static struct super_operations usbfs_ops; | 47 | static struct super_operations usbfs_ops; |
48 | static struct file_operations default_file_operations; | 48 | static struct file_operations default_file_operations; |
49 | static struct inode_operations usbfs_dir_inode_operations; | ||
50 | static struct vfsmount *usbfs_mount; | 49 | static struct vfsmount *usbfs_mount; |
51 | static int usbfs_mount_count; /* = 0 */ | 50 | static int usbfs_mount_count; /* = 0 */ |
52 | static int ignore_mount = 0; | 51 | static 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 | ||
420 | static struct inode_operations usbfs_dir_inode_operations = { | ||
421 | .lookup = simple_lookup, | ||
422 | }; | ||
423 | |||
424 | static struct super_operations usbfs_ops = { | 419 | static 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 | ||
220 | static int ohci_hcd_lh7a404_drv_remove(struct platform_device *pdev) | 220 | static 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 | ||
186 | static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev) | 186 | static 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 | ||
330 | static int mts_slave_alloc (struct scsi_device *s) | ||
331 | { | ||
332 | s->inquiry_len = 0x24; | ||
333 | return 0; | ||
334 | } | ||
335 | |||
336 | static int mts_slave_configure (struct scsi_device *s) | ||
337 | { | ||
338 | blk_queue_dma_alignment(s->request_queue, (512 - 1)); | ||
339 | return 0; | ||
340 | } | ||
341 | |||
330 | static int mts_scsi_abort (Scsi_Cmnd *srb) | 342 | static 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 | |||
631 | out: | 642 | out: |
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 | ||
650 | struct vendor_product | 664 | struct 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); | |||
856 | MODULE_AUTHOR( DRIVER_AUTHOR ); | 877 | MODULE_AUTHOR( DRIVER_AUTHOR ); |
857 | MODULE_DESCRIPTION( DRIVER_DESC ); | 878 | MODULE_DESCRIPTION( DRIVER_DESC ); |
858 | MODULE_LICENSE("GPL"); | 879 | MODULE_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 | |||
42 | obj-$(CONFIG_USB_YEALINK) += yealink.o | 42 | obj-$(CONFIG_USB_YEALINK) += yealink.o |
43 | obj-$(CONFIG_USB_XPAD) += xpad.o | 43 | obj-$(CONFIG_USB_XPAD) += xpad.o |
44 | obj-$(CONFIG_USB_APPLETOUCH) += appletouch.o | 44 | obj-$(CONFIG_USB_APPLETOUCH) += appletouch.o |
45 | |||
46 | ifeq ($(CONFIG_USB_DEBUG),y) | ||
47 | EXTRA_CFLAGS += -DDEBUG | ||
48 | endif | ||
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); | |||
86 | MODULE_LICENSE(DRIVER_LICENSE); | 88 | MODULE_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 | ||
90 | enum { | 95 | enum { |
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 | |||
18 | obj-$(CONFIG_USB_TEST) += usbtest.o | 18 | obj-$(CONFIG_USB_TEST) += usbtest.o |
19 | obj-$(CONFIG_USB_USS720) += uss720.o | 19 | obj-$(CONFIG_USB_USS720) += uss720.o |
20 | 20 | ||
21 | obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ \ No newline at end of file | 21 | obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ |
22 | |||
23 | ifeq ($(CONFIG_USB_DEBUG),y) | ||
24 | EXTRA_CFLAGS += -DDEBUG | ||
25 | endif | ||
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 | |||
16 | obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o | 16 | obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o |
17 | obj-$(CONFIG_USB_USBNET) += usbnet.o | 17 | obj-$(CONFIG_USB_USBNET) += usbnet.o |
18 | obj-$(CONFIG_USB_ZD1201) += zd1201.o | 18 | obj-$(CONFIG_USB_ZD1201) += zd1201.o |
19 | |||
20 | ifeq ($(CONFIG_USB_DEBUG),y) | ||
21 | EXTRA_CFLAGS += -DDEBUG | ||
22 | endif | ||
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 | ||
65 | config 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 | |||
65 | config USB_SERIAL_BELKIN | 74 | config 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 | ||
397 | config 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 | |||
406 | config USB_SERIAL_PL2303 | 406 | config 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 | |||
12 | usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) | 12 | usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) |
13 | 13 | ||
14 | obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o | 14 | obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o |
15 | obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o | ||
15 | obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o | 16 | obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o |
16 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o | 17 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o |
17 | obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o | 18 | obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o |
@@ -31,7 +32,6 @@ obj-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda.o | |||
31 | obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o | 32 | obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o |
32 | obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o | 33 | obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o |
33 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o | 34 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o |
34 | obj-$(CONFIG_USB_SERIAL_NOKIA_DKU2) += nokia_dku2.o | ||
35 | obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o | 35 | obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o |
36 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o | 36 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o |
37 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o | 37 | obj-$(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 | |||
18 | static struct usb_device_id id_table [] = { | ||
19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ | ||
20 | { }, | ||
21 | }; | ||
22 | MODULE_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 */ | ||
26 | static int buffer_size; | ||
27 | static int debug; | ||
28 | |||
29 | static 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 | |||
37 | static 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 | |||
84 | static 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 | |||
97 | static 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 | |||
110 | static void __exit anydata_exit(void) | ||
111 | { | ||
112 | usb_deregister(&anydata_driver); | ||
113 | usb_serial_deregister(&anydata_device); | ||
114 | } | ||
115 | |||
116 | module_init(anydata_init); | ||
117 | module_exit(anydata_exit); | ||
118 | MODULE_LICENSE("GPL"); | ||
119 | |||
120 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
121 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | ||
122 | module_param(buffer_size, int, 0); | ||
123 | MODULE_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 | } |
312 | EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback); | ||
312 | 313 | ||
313 | void usb_serial_generic_shutdown (struct usb_serial *serial) | 314 | void 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 | |||
55 | static 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 | }; | ||
64 | MODULE_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... */ | ||
69 | static 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 | |||
89 | static 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 | |||
97 | static 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 | |||
111 | static 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 | |||
131 | static void __exit nokia_exit(void) | ||
132 | { | ||
133 | usb_deregister(&nokia_driver); | ||
134 | usb_serial_deregister(&nokia_serial_driver); | ||
135 | } | ||
136 | |||
137 | module_init(nokia_init); | ||
138 | module_exit(nokia_exit); | ||
139 | |||
140 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
141 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
142 | MODULE_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 | ||
116 | config USB_STORAGE_ONETOUCH | 116 | config 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 | ||
713 | UNUSUAL_DEV( 0x0693, 0x0002, 0x0100, 0x0100, | ||
714 | "Hagiwara", | ||
715 | "FlashGate SmartMedia", | ||
716 | US_SC_SCSI, US_PR_BULK, NULL, 0 ), | ||
717 | |||
718 | UNUSUAL_DEV( 0x0693, 0x0005, 0x0100, 0x0100, | 713 | UNUSUAL_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) |