diff options
Diffstat (limited to 'drivers')
149 files changed, 2195 insertions, 1506 deletions
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c index d2fc94161848..26038c2a2a71 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c | |||
| @@ -301,16 +301,20 @@ static int bay_add(acpi_handle handle, int id) | |||
| 301 | */ | 301 | */ |
| 302 | pdev->dev.uevent_suppress = 0; | 302 | pdev->dev.uevent_suppress = 0; |
| 303 | 303 | ||
| 304 | if (acpi_bay_add_fs(new_bay)) { | ||
| 305 | platform_device_unregister(new_bay->pdev); | ||
| 306 | goto bay_add_err; | ||
| 307 | } | ||
| 308 | |||
| 309 | /* register for events on this device */ | 304 | /* register for events on this device */ |
| 310 | status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 305 | status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
| 311 | bay_notify, new_bay); | 306 | bay_notify, new_bay); |
| 312 | if (ACPI_FAILURE(status)) { | 307 | if (ACPI_FAILURE(status)) { |
| 313 | printk(KERN_ERR PREFIX "Error installing bay notify handler\n"); | 308 | printk(KERN_INFO PREFIX "Error installing bay notify handler\n"); |
| 309 | platform_device_unregister(new_bay->pdev); | ||
| 310 | goto bay_add_err; | ||
| 311 | } | ||
| 312 | |||
| 313 | if (acpi_bay_add_fs(new_bay)) { | ||
| 314 | acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | ||
| 315 | bay_notify); | ||
| 316 | platform_device_unregister(new_bay->pdev); | ||
| 317 | goto bay_add_err; | ||
| 314 | } | 318 | } |
| 315 | 319 | ||
| 316 | /* if we are on a dock station, we should register for dock | 320 | /* if we are on a dock station, we should register for dock |
diff --git a/drivers/acpi/dispatcher/dsfield.c b/drivers/acpi/dispatcher/dsfield.c index c78078315be9..f988a5e7d2b4 100644 --- a/drivers/acpi/dispatcher/dsfield.c +++ b/drivers/acpi/dispatcher/dsfield.c | |||
| @@ -450,10 +450,6 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, | |||
| 450 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 450 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
| 451 | } | 451 | } |
| 452 | 452 | ||
| 453 | if (!arg) { | ||
| 454 | return_ACPI_STATUS(AE_AML_NO_OPERAND); | ||
| 455 | } | ||
| 456 | |||
| 457 | /* Creating new namespace node(s), should not already exist */ | 453 | /* Creating new namespace node(s), should not already exist */ |
| 458 | 454 | ||
| 459 | flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | | 455 | flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | |
| @@ -467,6 +463,7 @@ acpi_ds_init_field_objects(union acpi_parse_object *op, | |||
| 467 | 463 | ||
| 468 | /* | 464 | /* |
| 469 | * Walk the list of entries in the field_list | 465 | * Walk the list of entries in the field_list |
| 466 | * Note: field_list can be of zero length. In this case, Arg will be NULL. | ||
| 470 | */ | 467 | */ |
| 471 | while (arg) { | 468 | while (arg) { |
| 472 | /* | 469 | /* |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index fa44fb96fc34..96c542f7fded 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -834,7 +834,7 @@ static int dock_add(acpi_handle handle) | |||
| 834 | goto dock_add_err; | 834 | goto dock_add_err; |
| 835 | } | 835 | } |
| 836 | 836 | ||
| 837 | printk(KERN_INFO PREFIX "%s \n", ACPI_DOCK_DRIVER_DESCRIPTION); | 837 | printk(KERN_INFO PREFIX "%s\n", ACPI_DOCK_DRIVER_DESCRIPTION); |
| 838 | 838 | ||
| 839 | return 0; | 839 | return 0; |
| 840 | 840 | ||
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 0924992187e8..5622aee996b2 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
| @@ -194,7 +194,7 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
| 194 | while (time_before(jiffies, delay)) { | 194 | while (time_before(jiffies, delay)) { |
| 195 | if (acpi_ec_check_status(ec, event)) | 195 | if (acpi_ec_check_status(ec, event)) |
| 196 | return 0; | 196 | return 0; |
| 197 | udelay(ACPI_EC_UDELAY); | 197 | msleep(1); |
| 198 | } | 198 | } |
| 199 | } | 199 | } |
| 200 | pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", | 200 | pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", |
diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c index 24da921d13e3..39d742190584 100644 --- a/drivers/acpi/executer/exconfig.c +++ b/drivers/acpi/executer/exconfig.c | |||
| @@ -375,9 +375,15 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | |||
| 375 | goto cleanup; | 375 | goto cleanup; |
| 376 | } | 376 | } |
| 377 | 377 | ||
| 378 | /* | ||
| 379 | * Add the table to the namespace. | ||
| 380 | * | ||
| 381 | * Note: We load the table objects relative to the root of the namespace. | ||
| 382 | * This appears to go against the ACPI specification, but we do it for | ||
| 383 | * compatibility with other ACPI implementations. | ||
| 384 | */ | ||
| 378 | status = | 385 | status = |
| 379 | acpi_ex_add_table(table_index, walk_state->scope_info->scope.node, | 386 | acpi_ex_add_table(table_index, acpi_gbl_root_node, &ddb_handle); |
| 380 | &ddb_handle); | ||
| 381 | if (ACPI_FAILURE(status)) { | 387 | if (ACPI_FAILURE(status)) { |
| 382 | 388 | ||
| 383 | /* On error, table_ptr was deallocated above */ | 389 | /* On error, table_ptr was deallocated above */ |
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 06f8634fe58b..2808dc60fd67 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -272,6 +272,12 @@ static u32 rtc_handler(void *context) | |||
| 272 | static inline void rtc_wake_setup(void) | 272 | static inline void rtc_wake_setup(void) |
| 273 | { | 273 | { |
| 274 | acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL); | 274 | acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL); |
| 275 | /* | ||
| 276 | * After the RTC handler is installed, the Fixed_RTC event should | ||
| 277 | * be disabled. Only when the RTC alarm is set will it be enabled. | ||
| 278 | */ | ||
| 279 | acpi_clear_event(ACPI_EVENT_RTC); | ||
| 280 | acpi_disable_event(ACPI_EVENT_RTC, 0); | ||
| 275 | } | 281 | } |
| 276 | 282 | ||
| 277 | static void rtc_wake_on(struct device *dev) | 283 | static void rtc_wake_on(struct device *dev) |
diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c index d9937e05ec6a..dba3cfbe8cba 100644 --- a/drivers/acpi/hardware/hwsleep.c +++ b/drivers/acpi/hardware/hwsleep.c | |||
| @@ -223,15 +223,17 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state) | |||
| 223 | break; | 223 | break; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | /* Set the system indicators to show the desired sleep state. */ | 226 | /* |
| 227 | 227 | * Set the system indicators to show the desired sleep state. | |
| 228 | * _SST is an optional method (return no error if not found) | ||
| 229 | */ | ||
| 228 | status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL); | 230 | status = acpi_evaluate_object(NULL, METHOD_NAME__SST, &arg_list, NULL); |
| 229 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { | 231 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { |
| 230 | ACPI_EXCEPTION((AE_INFO, status, | 232 | ACPI_EXCEPTION((AE_INFO, status, |
| 231 | "While executing method _SST")); | 233 | "While executing method _SST")); |
| 232 | } | 234 | } |
| 233 | 235 | ||
| 234 | return_ACPI_STATUS(status); | 236 | return_ACPI_STATUS(AE_OK); |
| 235 | } | 237 | } |
| 236 | 238 | ||
| 237 | ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep) | 239 | ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep) |
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index 5d59cb33b1a5..658e5f3abae0 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
| @@ -140,19 +140,42 @@ acpi_table_print_srat_entry(struct acpi_subtable_header *header) | |||
| 140 | } | 140 | } |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | /* | ||
| 144 | * A lot of BIOS fill in 10 (= no distance) everywhere. This messes | ||
| 145 | * up the NUMA heuristics which wants the local node to have a smaller | ||
| 146 | * distance than the others. | ||
| 147 | * Do some quick checks here and only use the SLIT if it passes. | ||
| 148 | */ | ||
| 149 | static __init int slit_valid(struct acpi_table_slit *slit) | ||
| 150 | { | ||
| 151 | int i, j; | ||
| 152 | int d = slit->locality_count; | ||
| 153 | for (i = 0; i < d; i++) { | ||
| 154 | for (j = 0; j < d; j++) { | ||
| 155 | u8 val = slit->entry[d*i + j]; | ||
| 156 | if (i == j) { | ||
| 157 | if (val != LOCAL_DISTANCE) | ||
| 158 | return 0; | ||
| 159 | } else if (val <= LOCAL_DISTANCE) | ||
| 160 | return 0; | ||
| 161 | } | ||
| 162 | } | ||
| 163 | return 1; | ||
| 164 | } | ||
| 165 | |||
| 143 | static int __init acpi_parse_slit(struct acpi_table_header *table) | 166 | static int __init acpi_parse_slit(struct acpi_table_header *table) |
| 144 | { | 167 | { |
| 145 | struct acpi_table_slit *slit; | 168 | struct acpi_table_slit *slit; |
| 146 | u32 localities; | ||
| 147 | 169 | ||
| 148 | if (!table) | 170 | if (!table) |
| 149 | return -EINVAL; | 171 | return -EINVAL; |
| 150 | 172 | ||
| 151 | slit = (struct acpi_table_slit *)table; | 173 | slit = (struct acpi_table_slit *)table; |
| 152 | 174 | ||
| 153 | /* downcast just for %llu vs %lu for i386/ia64 */ | 175 | if (!slit_valid(slit)) { |
| 154 | localities = (u32) slit->locality_count; | 176 | printk(KERN_INFO "ACPI: SLIT table looks invalid. Not used.\n"); |
| 155 | 177 | return -EINVAL; | |
| 178 | } | ||
| 156 | acpi_numa_slit_init(slit); | 179 | acpi_numa_slit_init(slit); |
| 157 | 180 | ||
| 158 | return 0; | 181 | return 0; |
diff --git a/drivers/acpi/parser/psargs.c b/drivers/acpi/parser/psargs.c index f1e8bf65e24e..e94463778845 100644 --- a/drivers/acpi/parser/psargs.c +++ b/drivers/acpi/parser/psargs.c | |||
| @@ -268,7 +268,7 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state, | |||
| 268 | */ | 268 | */ |
| 269 | if (ACPI_SUCCESS(status) && | 269 | if (ACPI_SUCCESS(status) && |
| 270 | possible_method_call && (node->type == ACPI_TYPE_METHOD)) { | 270 | possible_method_call && (node->type == ACPI_TYPE_METHOD)) { |
| 271 | if (walk_state->op->common.aml_opcode == AML_UNLOAD_OP) { | 271 | if (walk_state->opcode == AML_UNLOAD_OP) { |
| 272 | /* | 272 | /* |
| 273 | * acpi_ps_get_next_namestring has increased the AML pointer, | 273 | * acpi_ps_get_next_namestring has increased the AML pointer, |
| 274 | * so we need to restore the saved AML pointer for method call. | 274 | * so we need to restore the saved AML pointer for method call. |
| @@ -691,7 +691,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state, | |||
| 691 | 691 | ||
| 692 | /* To support super_name arg of Unload */ | 692 | /* To support super_name arg of Unload */ |
| 693 | 693 | ||
| 694 | if (walk_state->op->common.aml_opcode == AML_UNLOAD_OP) { | 694 | if (walk_state->opcode == AML_UNLOAD_OP) { |
| 695 | status = | 695 | status = |
| 696 | acpi_ps_get_next_namepath(walk_state, | 696 | acpi_ps_get_next_namepath(walk_state, |
| 697 | parser_state, arg, | 697 | parser_state, arg, |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 386e5aa48834..9dd0fa93b9e1 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
| @@ -86,7 +86,6 @@ static int acpi_processor_info_open_fs(struct inode *inode, struct file *file); | |||
| 86 | static void acpi_processor_notify(acpi_handle handle, u32 event, void *data); | 86 | static void acpi_processor_notify(acpi_handle handle, u32 event, void *data); |
| 87 | static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu); | 87 | static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu); |
| 88 | static int acpi_processor_handle_eject(struct acpi_processor *pr); | 88 | static int acpi_processor_handle_eject(struct acpi_processor *pr); |
| 89 | extern int acpi_processor_tstate_has_changed(struct acpi_processor *pr); | ||
| 90 | 89 | ||
| 91 | 90 | ||
| 92 | static const struct acpi_device_id processor_device_ids[] = { | 91 | static const struct acpi_device_id processor_device_ids[] = { |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 2dd2c1f3a01c..556ee1585192 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -1669,6 +1669,7 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr) | |||
| 1669 | return -EINVAL; | 1669 | return -EINVAL; |
| 1670 | } | 1670 | } |
| 1671 | 1671 | ||
| 1672 | dev->cpu = pr->id; | ||
| 1672 | for (i = 0; i < CPUIDLE_STATE_MAX; i++) { | 1673 | for (i = 0; i < CPUIDLE_STATE_MAX; i++) { |
| 1673 | dev->states[i].name[0] = '\0'; | 1674 | dev->states[i].name[0] = '\0'; |
| 1674 | dev->states[i].desc[0] = '\0'; | 1675 | dev->states[i].desc[0] = '\0'; |
| @@ -1738,7 +1739,7 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr) | |||
| 1738 | 1739 | ||
| 1739 | int acpi_processor_cst_has_changed(struct acpi_processor *pr) | 1740 | int acpi_processor_cst_has_changed(struct acpi_processor *pr) |
| 1740 | { | 1741 | { |
| 1741 | int ret; | 1742 | int ret = 0; |
| 1742 | 1743 | ||
| 1743 | if (boot_option_idle_override) | 1744 | if (boot_option_idle_override) |
| 1744 | return 0; | 1745 | return 0; |
| @@ -1756,8 +1757,10 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) | |||
| 1756 | cpuidle_pause_and_lock(); | 1757 | cpuidle_pause_and_lock(); |
| 1757 | cpuidle_disable_device(&pr->power.dev); | 1758 | cpuidle_disable_device(&pr->power.dev); |
| 1758 | acpi_processor_get_power_info(pr); | 1759 | acpi_processor_get_power_info(pr); |
| 1759 | acpi_processor_setup_cpuidle(pr); | 1760 | if (pr->flags.power) { |
| 1760 | ret = cpuidle_enable_device(&pr->power.dev); | 1761 | acpi_processor_setup_cpuidle(pr); |
| 1762 | ret = cpuidle_enable_device(&pr->power.dev); | ||
| 1763 | } | ||
| 1761 | cpuidle_resume_and_unlock(); | 1764 | cpuidle_resume_and_unlock(); |
| 1762 | 1765 | ||
| 1763 | return ret; | 1766 | return ret; |
| @@ -1813,7 +1816,6 @@ int __cpuinit acpi_processor_power_init(struct acpi_processor *pr, | |||
| 1813 | if (pr->flags.power) { | 1816 | if (pr->flags.power) { |
| 1814 | #ifdef CONFIG_CPU_IDLE | 1817 | #ifdef CONFIG_CPU_IDLE |
| 1815 | acpi_processor_setup_cpuidle(pr); | 1818 | acpi_processor_setup_cpuidle(pr); |
| 1816 | pr->power.dev.cpu = pr->id; | ||
| 1817 | if (cpuidle_register_device(&pr->power.dev)) | 1819 | if (cpuidle_register_device(&pr->power.dev)) |
| 1818 | return -EIO; | 1820 | return -EIO; |
| 1819 | #endif | 1821 | #endif |
| @@ -1850,8 +1852,7 @@ int acpi_processor_power_exit(struct acpi_processor *pr, | |||
| 1850 | return 0; | 1852 | return 0; |
| 1851 | 1853 | ||
| 1852 | #ifdef CONFIG_CPU_IDLE | 1854 | #ifdef CONFIG_CPU_IDLE |
| 1853 | if (pr->flags.power) | 1855 | cpuidle_unregister_device(&pr->power.dev); |
| 1854 | cpuidle_unregister_device(&pr->power.dev); | ||
| 1855 | #endif | 1856 | #endif |
| 1856 | pr->flags.power_setup_done = 0; | 1857 | pr->flags.power_setup_done = 0; |
| 1857 | 1858 | ||
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c index 8a5fe8710513..224c57c03381 100644 --- a/drivers/acpi/sleep/proc.c +++ b/drivers/acpi/sleep/proc.c | |||
| @@ -495,6 +495,12 @@ static int __init acpi_sleep_proc_init(void) | |||
| 495 | acpi_root_dir, &acpi_system_alarm_fops); | 495 | acpi_root_dir, &acpi_system_alarm_fops); |
| 496 | 496 | ||
| 497 | acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL); | 497 | acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, NULL); |
| 498 | /* | ||
| 499 | * Disable the RTC event after installing RTC handler. | ||
| 500 | * Only when RTC alarm is set will it be enabled. | ||
| 501 | */ | ||
| 502 | acpi_clear_event(ACPI_EVENT_RTC); | ||
| 503 | acpi_disable_event(ACPI_EVENT_RTC, 0); | ||
| 498 | #endif /* HAVE_ACPI_LEGACY_ALARM */ | 504 | #endif /* HAVE_ACPI_LEGACY_ALARM */ |
| 499 | 505 | ||
| 500 | /* 'wakeup device' [R/W] */ | 506 | /* 'wakeup device' [R/W] */ |
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index 769f24855eb6..5bd2dec9a7ac 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
| @@ -77,7 +77,6 @@ static ssize_t acpi_table_show(struct kobject *kobj, | |||
| 77 | container_of(bin_attr, struct acpi_table_attr, attr); | 77 | container_of(bin_attr, struct acpi_table_attr, attr); |
| 78 | struct acpi_table_header *table_header = NULL; | 78 | struct acpi_table_header *table_header = NULL; |
| 79 | acpi_status status; | 79 | acpi_status status; |
| 80 | ssize_t ret_count = count; | ||
| 81 | 80 | ||
| 82 | status = | 81 | status = |
| 83 | acpi_get_table(table_attr->name, table_attr->instance, | 82 | acpi_get_table(table_attr->name, table_attr->instance, |
| @@ -85,18 +84,8 @@ static ssize_t acpi_table_show(struct kobject *kobj, | |||
| 85 | if (ACPI_FAILURE(status)) | 84 | if (ACPI_FAILURE(status)) |
| 86 | return -ENODEV; | 85 | return -ENODEV; |
| 87 | 86 | ||
| 88 | if (offset >= table_header->length) { | 87 | return memory_read_from_buffer(buf, count, &offset, |
| 89 | ret_count = 0; | 88 | table_header, table_header->length); |
| 90 | goto end; | ||
| 91 | } | ||
| 92 | |||
| 93 | if (offset + ret_count > table_header->length) | ||
| 94 | ret_count = table_header->length - offset; | ||
| 95 | |||
| 96 | memcpy(buf, ((char *)table_header) + offset, ret_count); | ||
| 97 | |||
| 98 | end: | ||
| 99 | return ret_count; | ||
| 100 | } | 89 | } |
| 101 | 90 | ||
| 102 | static void acpi_table_attr_init(struct acpi_table_attr *table_attr, | 91 | static void acpi_table_attr_init(struct acpi_table_attr *table_attr, |
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c index 402f93e1ff20..5336ce88f89f 100644 --- a/drivers/acpi/tables/tbinstal.c +++ b/drivers/acpi/tables/tbinstal.c | |||
| @@ -123,24 +123,13 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, | |||
| 123 | } | 123 | } |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | /* The table must be either an SSDT or a PSDT or an OEMx */ | 126 | /* |
| 127 | 127 | * Originally, we checked the table signature for "SSDT" or "PSDT" here. | |
| 128 | if (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT)&& | 128 | * Next, we added support for OEMx tables, signature "OEM". |
| 129 | !ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)&& | 129 | * Valid tables were encountered with a null signature, so we've just |
| 130 | strncmp(table_desc->pointer->signature, "OEM", 3)) { | 130 | * given up on validating the signature, since it seems to be a waste |
| 131 | /* Check for a printable name */ | 131 | * of code. The original code was removed (05/2008). |
| 132 | if (acpi_ut_valid_acpi_name( | 132 | */ |
| 133 | *(u32 *) table_desc->pointer->signature)) { | ||
| 134 | ACPI_ERROR((AE_INFO, "Table has invalid signature " | ||
| 135 | "[%4.4s], must be SSDT or PSDT", | ||
| 136 | table_desc->pointer->signature)); | ||
| 137 | } else { | ||
| 138 | ACPI_ERROR((AE_INFO, "Table has invalid signature " | ||
| 139 | "(0x%8.8X), must be SSDT or PSDT", | ||
| 140 | *(u32 *) table_desc->pointer->signature)); | ||
| 141 | } | ||
| 142 | return_ACPI_STATUS(AE_BAD_SIGNATURE); | ||
| 143 | } | ||
| 144 | 133 | ||
| 145 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 134 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
| 146 | 135 | ||
diff --git a/drivers/acpi/tables/tbxface.c b/drivers/acpi/tables/tbxface.c index fb57b93c2495..0e319604d3e7 100644 --- a/drivers/acpi/tables/tbxface.c +++ b/drivers/acpi/tables/tbxface.c | |||
| @@ -540,7 +540,7 @@ static acpi_status acpi_tb_load_namespace(void) | |||
| 540 | acpi_tb_print_table_header(0, table); | 540 | acpi_tb_print_table_header(0, table); |
| 541 | 541 | ||
| 542 | if (no_auto_ssdt == 0) { | 542 | if (no_auto_ssdt == 0) { |
| 543 | printk(KERN_WARNING "ACPI: DSDT override uses original SSDTs unless \"acpi_no_auto_ssdt\""); | 543 | printk(KERN_WARNING "ACPI: DSDT override uses original SSDTs unless \"acpi_no_auto_ssdt\"\n"); |
| 544 | } | 544 | } |
| 545 | } | 545 | } |
| 546 | 546 | ||
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 504385b1f211..84c795fb9b1e 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
| @@ -364,10 +364,17 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag) | |||
| 364 | if (flag & ACPI_TRIPS_CRITICAL) { | 364 | if (flag & ACPI_TRIPS_CRITICAL) { |
| 365 | status = acpi_evaluate_integer(tz->device->handle, | 365 | status = acpi_evaluate_integer(tz->device->handle, |
| 366 | "_CRT", NULL, &tz->trips.critical.temperature); | 366 | "_CRT", NULL, &tz->trips.critical.temperature); |
| 367 | if (ACPI_FAILURE(status)) { | 367 | /* |
| 368 | * Treat freezing temperatures as invalid as well; some | ||
| 369 | * BIOSes return really low values and cause reboots at startup. | ||
| 370 | * Below zero (Celcius) values clearly aren't right for sure.. | ||
| 371 | * ... so lets discard those as invalid. | ||
| 372 | */ | ||
| 373 | if (ACPI_FAILURE(status) || | ||
| 374 | tz->trips.critical.temperature <= 2732) { | ||
| 368 | tz->trips.critical.flags.valid = 0; | 375 | tz->trips.critical.flags.valid = 0; |
| 369 | ACPI_EXCEPTION((AE_INFO, status, | 376 | ACPI_EXCEPTION((AE_INFO, status, |
| 370 | "No critical threshold")); | 377 | "No or invalid critical threshold")); |
| 371 | return -ENODEV; | 378 | return -ENODEV; |
| 372 | } else { | 379 | } else { |
| 373 | tz->trips.critical.flags.valid = 1; | 380 | tz->trips.critical.flags.valid = 1; |
diff --git a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c index e4ba7192cd15..1f057b71db1a 100644 --- a/drivers/acpi/utilities/utmisc.c +++ b/drivers/acpi/utilities/utmisc.c | |||
| @@ -1048,6 +1048,7 @@ acpi_ut_exception(char *module_name, | |||
| 1048 | va_start(args, format); | 1048 | va_start(args, format); |
| 1049 | acpi_os_vprintf(format, args); | 1049 | acpi_os_vprintf(format, args); |
| 1050 | acpi_os_printf(" [%X]\n", ACPI_CA_VERSION); | 1050 | acpi_os_printf(" [%X]\n", ACPI_CA_VERSION); |
| 1051 | va_end(args); | ||
| 1051 | } | 1052 | } |
| 1052 | 1053 | ||
| 1053 | EXPORT_SYMBOL(acpi_ut_exception); | 1054 | EXPORT_SYMBOL(acpi_ut_exception); |
| @@ -1063,7 +1064,6 @@ acpi_ut_warning(char *module_name, u32 line_number, char *format, ...) | |||
| 1063 | acpi_os_vprintf(format, args); | 1064 | acpi_os_vprintf(format, args); |
| 1064 | acpi_os_printf(" [%X]\n", ACPI_CA_VERSION); | 1065 | acpi_os_printf(" [%X]\n", ACPI_CA_VERSION); |
| 1065 | va_end(args); | 1066 | va_end(args); |
| 1066 | va_end(args); | ||
| 1067 | } | 1067 | } |
| 1068 | 1068 | ||
| 1069 | void ACPI_INTERNAL_VAR_XFACE | 1069 | void ACPI_INTERNAL_VAR_XFACE |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 544b7d6c617c..966ab401e523 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -89,6 +89,7 @@ enum { | |||
| 89 | board_ahci_sb600 = 3, | 89 | board_ahci_sb600 = 3, |
| 90 | board_ahci_mv = 4, | 90 | board_ahci_mv = 4, |
| 91 | board_ahci_sb700 = 5, | 91 | board_ahci_sb700 = 5, |
| 92 | board_ahci_mcp65 = 6, | ||
| 92 | 93 | ||
| 93 | /* global controller registers */ | 94 | /* global controller registers */ |
| 94 | HOST_CAP = 0x00, /* host capabilities */ | 95 | HOST_CAP = 0x00, /* host capabilities */ |
| @@ -190,6 +191,7 @@ enum { | |||
| 190 | AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */ | 191 | AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */ |
| 191 | AHCI_HFLAG_NO_HOTPLUG = (1 << 7), /* ignore PxSERR.DIAG.N */ | 192 | AHCI_HFLAG_NO_HOTPLUG = (1 << 7), /* ignore PxSERR.DIAG.N */ |
| 192 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ | 193 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ |
| 194 | AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */ | ||
| 193 | 195 | ||
| 194 | /* ap->flags bits */ | 196 | /* ap->flags bits */ |
| 195 | 197 | ||
| @@ -253,6 +255,8 @@ static void ahci_pmp_attach(struct ata_port *ap); | |||
| 253 | static void ahci_pmp_detach(struct ata_port *ap); | 255 | static void ahci_pmp_detach(struct ata_port *ap); |
| 254 | static int ahci_softreset(struct ata_link *link, unsigned int *class, | 256 | static int ahci_softreset(struct ata_link *link, unsigned int *class, |
| 255 | unsigned long deadline); | 257 | unsigned long deadline); |
| 258 | static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class, | ||
| 259 | unsigned long deadline); | ||
| 256 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, | 260 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, |
| 257 | unsigned long deadline); | 261 | unsigned long deadline); |
| 258 | static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, | 262 | static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, |
| @@ -329,6 +333,12 @@ static struct ata_port_operations ahci_p5wdh_ops = { | |||
| 329 | .hardreset = ahci_p5wdh_hardreset, | 333 | .hardreset = ahci_p5wdh_hardreset, |
| 330 | }; | 334 | }; |
| 331 | 335 | ||
| 336 | static struct ata_port_operations ahci_sb600_ops = { | ||
| 337 | .inherits = &ahci_ops, | ||
| 338 | .softreset = ahci_sb600_softreset, | ||
| 339 | .pmp_softreset = ahci_sb600_softreset, | ||
| 340 | }; | ||
| 341 | |||
| 332 | #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) | 342 | #define AHCI_HFLAGS(flags) .private_data = (void *)(flags) |
| 333 | 343 | ||
| 334 | static const struct ata_port_info ahci_port_info[] = { | 344 | static const struct ata_port_info ahci_port_info[] = { |
| @@ -359,11 +369,11 @@ static const struct ata_port_info ahci_port_info[] = { | |||
| 359 | { | 369 | { |
| 360 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | | 370 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | |
| 361 | AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_MSI | | 371 | AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_MSI | |
| 362 | AHCI_HFLAG_SECT255 | AHCI_HFLAG_NO_PMP), | 372 | AHCI_HFLAG_SECT255), |
| 363 | .flags = AHCI_FLAG_COMMON, | 373 | .flags = AHCI_FLAG_COMMON, |
| 364 | .pio_mask = 0x1f, /* pio0-4 */ | 374 | .pio_mask = 0x1f, /* pio0-4 */ |
| 365 | .udma_mask = ATA_UDMA6, | 375 | .udma_mask = ATA_UDMA6, |
| 366 | .port_ops = &ahci_ops, | 376 | .port_ops = &ahci_sb600_ops, |
| 367 | }, | 377 | }, |
| 368 | /* board_ahci_mv */ | 378 | /* board_ahci_mv */ |
| 369 | { | 379 | { |
| @@ -377,8 +387,15 @@ static const struct ata_port_info ahci_port_info[] = { | |||
| 377 | }, | 387 | }, |
| 378 | /* board_ahci_sb700 */ | 388 | /* board_ahci_sb700 */ |
| 379 | { | 389 | { |
| 380 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | | 390 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL), |
| 381 | AHCI_HFLAG_NO_PMP), | 391 | .flags = AHCI_FLAG_COMMON, |
| 392 | .pio_mask = 0x1f, /* pio0-4 */ | ||
| 393 | .udma_mask = ATA_UDMA6, | ||
| 394 | .port_ops = &ahci_sb600_ops, | ||
| 395 | }, | ||
| 396 | /* board_ahci_mcp65 */ | ||
| 397 | { | ||
| 398 | AHCI_HFLAGS (AHCI_HFLAG_YES_NCQ), | ||
| 382 | .flags = AHCI_FLAG_COMMON, | 399 | .flags = AHCI_FLAG_COMMON, |
| 383 | .pio_mask = 0x1f, /* pio0-4 */ | 400 | .pio_mask = 0x1f, /* pio0-4 */ |
| 384 | .udma_mask = ATA_UDMA6, | 401 | .udma_mask = ATA_UDMA6, |
| @@ -438,14 +455,14 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 438 | { PCI_VDEVICE(VIA, 0x6287), board_ahci_vt8251 }, /* VIA VT8251 */ | 455 | { PCI_VDEVICE(VIA, 0x6287), board_ahci_vt8251 }, /* VIA VT8251 */ |
| 439 | 456 | ||
| 440 | /* NVIDIA */ | 457 | /* NVIDIA */ |
| 441 | { PCI_VDEVICE(NVIDIA, 0x044c), board_ahci }, /* MCP65 */ | 458 | { PCI_VDEVICE(NVIDIA, 0x044c), board_ahci_mcp65 }, /* MCP65 */ |
| 442 | { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci }, /* MCP65 */ | 459 | { PCI_VDEVICE(NVIDIA, 0x044d), board_ahci_mcp65 }, /* MCP65 */ |
| 443 | { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci }, /* MCP65 */ | 460 | { PCI_VDEVICE(NVIDIA, 0x044e), board_ahci_mcp65 }, /* MCP65 */ |
| 444 | { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci }, /* MCP65 */ | 461 | { PCI_VDEVICE(NVIDIA, 0x044f), board_ahci_mcp65 }, /* MCP65 */ |
| 445 | { PCI_VDEVICE(NVIDIA, 0x045c), board_ahci }, /* MCP65 */ | 462 | { PCI_VDEVICE(NVIDIA, 0x045c), board_ahci_mcp65 }, /* MCP65 */ |
| 446 | { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci }, /* MCP65 */ | 463 | { PCI_VDEVICE(NVIDIA, 0x045d), board_ahci_mcp65 }, /* MCP65 */ |
| 447 | { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci }, /* MCP65 */ | 464 | { PCI_VDEVICE(NVIDIA, 0x045e), board_ahci_mcp65 }, /* MCP65 */ |
| 448 | { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci }, /* MCP65 */ | 465 | { PCI_VDEVICE(NVIDIA, 0x045f), board_ahci_mcp65 }, /* MCP65 */ |
| 449 | { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci }, /* MCP67 */ | 466 | { PCI_VDEVICE(NVIDIA, 0x0550), board_ahci }, /* MCP67 */ |
| 450 | { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci }, /* MCP67 */ | 467 | { PCI_VDEVICE(NVIDIA, 0x0551), board_ahci }, /* MCP67 */ |
| 451 | { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci }, /* MCP67 */ | 468 | { PCI_VDEVICE(NVIDIA, 0x0552), board_ahci }, /* MCP67 */ |
| @@ -624,6 +641,12 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
| 624 | cap &= ~HOST_CAP_NCQ; | 641 | cap &= ~HOST_CAP_NCQ; |
| 625 | } | 642 | } |
| 626 | 643 | ||
| 644 | if (!(cap & HOST_CAP_NCQ) && (hpriv->flags & AHCI_HFLAG_YES_NCQ)) { | ||
| 645 | dev_printk(KERN_INFO, &pdev->dev, | ||
| 646 | "controller can do NCQ, turning on CAP_NCQ\n"); | ||
| 647 | cap |= HOST_CAP_NCQ; | ||
| 648 | } | ||
| 649 | |||
| 627 | if ((cap & HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) { | 650 | if ((cap & HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) { |
| 628 | dev_printk(KERN_INFO, &pdev->dev, | 651 | dev_printk(KERN_INFO, &pdev->dev, |
| 629 | "controller can't do PMP, turning off CAP_PMP\n"); | 652 | "controller can't do PMP, turning off CAP_PMP\n"); |
| @@ -1262,19 +1285,11 @@ static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp, | |||
| 1262 | return 0; | 1285 | return 0; |
| 1263 | } | 1286 | } |
| 1264 | 1287 | ||
| 1265 | static int ahci_check_ready(struct ata_link *link) | 1288 | static int ahci_do_softreset(struct ata_link *link, unsigned int *class, |
| 1266 | { | 1289 | int pmp, unsigned long deadline, |
| 1267 | void __iomem *port_mmio = ahci_port_base(link->ap); | 1290 | int (*check_ready)(struct ata_link *link)) |
| 1268 | u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF; | ||
| 1269 | |||
| 1270 | return ata_check_ready(status); | ||
| 1271 | } | ||
| 1272 | |||
| 1273 | static int ahci_softreset(struct ata_link *link, unsigned int *class, | ||
| 1274 | unsigned long deadline) | ||
| 1275 | { | 1291 | { |
| 1276 | struct ata_port *ap = link->ap; | 1292 | struct ata_port *ap = link->ap; |
| 1277 | int pmp = sata_srst_pmp(link); | ||
| 1278 | const char *reason = NULL; | 1293 | const char *reason = NULL; |
| 1279 | unsigned long now, msecs; | 1294 | unsigned long now, msecs; |
| 1280 | struct ata_taskfile tf; | 1295 | struct ata_taskfile tf; |
| @@ -1312,7 +1327,7 @@ static int ahci_softreset(struct ata_link *link, unsigned int *class, | |||
| 1312 | ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0); | 1327 | ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0); |
| 1313 | 1328 | ||
| 1314 | /* wait for link to become ready */ | 1329 | /* wait for link to become ready */ |
| 1315 | rc = ata_wait_after_reset(link, deadline, ahci_check_ready); | 1330 | rc = ata_wait_after_reset(link, deadline, check_ready); |
| 1316 | /* link occupied, -ENODEV too is an error */ | 1331 | /* link occupied, -ENODEV too is an error */ |
| 1317 | if (rc) { | 1332 | if (rc) { |
| 1318 | reason = "device not ready"; | 1333 | reason = "device not ready"; |
| @@ -1328,6 +1343,72 @@ static int ahci_softreset(struct ata_link *link, unsigned int *class, | |||
| 1328 | return rc; | 1343 | return rc; |
| 1329 | } | 1344 | } |
| 1330 | 1345 | ||
| 1346 | static int ahci_check_ready(struct ata_link *link) | ||
| 1347 | { | ||
| 1348 | void __iomem *port_mmio = ahci_port_base(link->ap); | ||
| 1349 | u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF; | ||
| 1350 | |||
| 1351 | return ata_check_ready(status); | ||
| 1352 | } | ||
| 1353 | |||
| 1354 | static int ahci_softreset(struct ata_link *link, unsigned int *class, | ||
| 1355 | unsigned long deadline) | ||
| 1356 | { | ||
| 1357 | int pmp = sata_srst_pmp(link); | ||
| 1358 | |||
| 1359 | DPRINTK("ENTER\n"); | ||
| 1360 | |||
| 1361 | return ahci_do_softreset(link, class, pmp, deadline, ahci_check_ready); | ||
| 1362 | } | ||
| 1363 | |||
| 1364 | static int ahci_sb600_check_ready(struct ata_link *link) | ||
| 1365 | { | ||
| 1366 | void __iomem *port_mmio = ahci_port_base(link->ap); | ||
| 1367 | u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF; | ||
| 1368 | u32 irq_status = readl(port_mmio + PORT_IRQ_STAT); | ||
| 1369 | |||
| 1370 | /* | ||
| 1371 | * There is no need to check TFDATA if BAD PMP is found due to HW bug, | ||
| 1372 | * which can save timeout delay. | ||
| 1373 | */ | ||
| 1374 | if (irq_status & PORT_IRQ_BAD_PMP) | ||
| 1375 | return -EIO; | ||
| 1376 | |||
| 1377 | return ata_check_ready(status); | ||
| 1378 | } | ||
| 1379 | |||
| 1380 | static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class, | ||
| 1381 | unsigned long deadline) | ||
| 1382 | { | ||
| 1383 | struct ata_port *ap = link->ap; | ||
| 1384 | void __iomem *port_mmio = ahci_port_base(ap); | ||
| 1385 | int pmp = sata_srst_pmp(link); | ||
| 1386 | int rc; | ||
| 1387 | u32 irq_sts; | ||
| 1388 | |||
| 1389 | DPRINTK("ENTER\n"); | ||
| 1390 | |||
| 1391 | rc = ahci_do_softreset(link, class, pmp, deadline, | ||
| 1392 | ahci_sb600_check_ready); | ||
| 1393 | |||
| 1394 | /* | ||
| 1395 | * Soft reset fails on some ATI chips with IPMS set when PMP | ||
| 1396 | * is enabled but SATA HDD/ODD is connected to SATA port, | ||
| 1397 | * do soft reset again to port 0. | ||
| 1398 | */ | ||
| 1399 | if (rc == -EIO) { | ||
| 1400 | irq_sts = readl(port_mmio + PORT_IRQ_STAT); | ||
| 1401 | if (irq_sts & PORT_IRQ_BAD_PMP) { | ||
| 1402 | ata_link_printk(link, KERN_WARNING, | ||
| 1403 | "failed due to HW bug, retry pmp=0\n"); | ||
| 1404 | rc = ahci_do_softreset(link, class, 0, deadline, | ||
| 1405 | ahci_check_ready); | ||
| 1406 | } | ||
| 1407 | } | ||
| 1408 | |||
| 1409 | return rc; | ||
| 1410 | } | ||
| 1411 | |||
| 1331 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, | 1412 | static int ahci_hardreset(struct ata_link *link, unsigned int *class, |
| 1332 | unsigned long deadline) | 1413 | unsigned long deadline) |
| 1333 | { | 1414 | { |
| @@ -2118,7 +2199,8 @@ static void ahci_p5wdh_workaround(struct ata_host *host) | |||
| 2118 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 2199 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 2119 | { | 2200 | { |
| 2120 | static int printed_version; | 2201 | static int printed_version; |
| 2121 | struct ata_port_info pi = ahci_port_info[ent->driver_data]; | 2202 | unsigned int board_id = ent->driver_data; |
| 2203 | struct ata_port_info pi = ahci_port_info[board_id]; | ||
| 2122 | const struct ata_port_info *ppi[] = { &pi, NULL }; | 2204 | const struct ata_port_info *ppi[] = { &pi, NULL }; |
| 2123 | struct device *dev = &pdev->dev; | 2205 | struct device *dev = &pdev->dev; |
| 2124 | struct ahci_host_priv *hpriv; | 2206 | struct ahci_host_priv *hpriv; |
| @@ -2167,6 +2249,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2167 | return -ENOMEM; | 2249 | return -ENOMEM; |
| 2168 | hpriv->flags |= (unsigned long)pi.private_data; | 2250 | hpriv->flags |= (unsigned long)pi.private_data; |
| 2169 | 2251 | ||
| 2252 | /* MCP65 revision A1 and A2 can't do MSI */ | ||
| 2253 | if (board_id == board_ahci_mcp65 && | ||
| 2254 | (pdev->revision == 0xa1 || pdev->revision == 0xa2)) | ||
| 2255 | hpriv->flags |= AHCI_HFLAG_NO_MSI; | ||
| 2256 | |||
| 2170 | if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) | 2257 | if ((hpriv->flags & AHCI_HFLAG_NO_MSI) || pci_enable_msi(pdev)) |
| 2171 | pci_intx(pdev, 1); | 2258 | pci_intx(pdev, 1); |
| 2172 | 2259 | ||
diff --git a/drivers/atm/eni.h b/drivers/atm/eni.h index d04fefb0841f..e4c9525e60b3 100644 --- a/drivers/atm/eni.h +++ b/drivers/atm/eni.h | |||
| @@ -18,7 +18,6 @@ | |||
| 18 | #include "midway.h" | 18 | #include "midway.h" |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | #define KERNEL_OFFSET 0xC0000000 /* kernel 0x0 is at phys 0xC0000000 */ | ||
| 22 | #define DEV_LABEL "eni" | 21 | #define DEV_LABEL "eni" |
| 23 | 22 | ||
| 24 | #define UBR_BUFFER (128*1024) /* UBR buffer size */ | 23 | #define UBR_BUFFER (128*1024) /* UBR buffer size */ |
diff --git a/drivers/atm/he.c b/drivers/atm/he.c index ffc4a5a41946..ea495b21f916 100644 --- a/drivers/atm/he.c +++ b/drivers/atm/he.c | |||
| @@ -1542,7 +1542,8 @@ he_start(struct atm_dev *dev) | |||
| 1542 | /* initialize framer */ | 1542 | /* initialize framer */ |
| 1543 | 1543 | ||
| 1544 | #ifdef CONFIG_ATM_HE_USE_SUNI | 1544 | #ifdef CONFIG_ATM_HE_USE_SUNI |
| 1545 | suni_init(he_dev->atm_dev); | 1545 | if (he_isMM(he_dev)) |
| 1546 | suni_init(he_dev->atm_dev); | ||
| 1546 | if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) | 1547 | if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) |
| 1547 | he_dev->atm_dev->phy->start(he_dev->atm_dev); | 1548 | he_dev->atm_dev->phy->start(he_dev->atm_dev); |
| 1548 | #endif /* CONFIG_ATM_HE_USE_SUNI */ | 1549 | #endif /* CONFIG_ATM_HE_USE_SUNI */ |
| @@ -1554,6 +1555,7 @@ he_start(struct atm_dev *dev) | |||
| 1554 | val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); | 1555 | val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); |
| 1555 | val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT); | 1556 | val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT); |
| 1556 | he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); | 1557 | he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); |
| 1558 | he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP); | ||
| 1557 | } | 1559 | } |
| 1558 | 1560 | ||
| 1559 | /* 5.1.12 enable transmit and receive */ | 1561 | /* 5.1.12 enable transmit and receive */ |
| @@ -2844,10 +2846,15 @@ he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg) | |||
| 2844 | if (copy_from_user(®, arg, | 2846 | if (copy_from_user(®, arg, |
| 2845 | sizeof(struct he_ioctl_reg))) | 2847 | sizeof(struct he_ioctl_reg))) |
| 2846 | return -EFAULT; | 2848 | return -EFAULT; |
| 2847 | 2849 | ||
| 2848 | spin_lock_irqsave(&he_dev->global_lock, flags); | 2850 | spin_lock_irqsave(&he_dev->global_lock, flags); |
| 2849 | switch (reg.type) { | 2851 | switch (reg.type) { |
| 2850 | case HE_REGTYPE_PCI: | 2852 | case HE_REGTYPE_PCI: |
| 2853 | if (reg.addr < 0 || reg.addr >= HE_REGMAP_SIZE) { | ||
| 2854 | err = -EINVAL; | ||
| 2855 | break; | ||
| 2856 | } | ||
| 2857 | |||
| 2851 | reg.val = he_readl(he_dev, reg.addr); | 2858 | reg.val = he_readl(he_dev, reg.addr); |
| 2852 | break; | 2859 | break; |
| 2853 | case HE_REGTYPE_RCM: | 2860 | case HE_REGTYPE_RCM: |
diff --git a/drivers/atm/he.h b/drivers/atm/he.h index fe6cd15a78a4..b87d6ccabac1 100644 --- a/drivers/atm/he.h +++ b/drivers/atm/he.h | |||
| @@ -267,13 +267,7 @@ struct he_dev { | |||
| 267 | 267 | ||
| 268 | char prod_id[30]; | 268 | char prod_id[30]; |
| 269 | char mac_addr[6]; | 269 | char mac_addr[6]; |
| 270 | int media; /* | 270 | int media; |
| 271 | * 0x26 = HE155 MM | ||
| 272 | * 0x27 = HE622 MM | ||
| 273 | * 0x46 = HE155 SM | ||
| 274 | * 0x47 = HE622 SM | ||
| 275 | */ | ||
| 276 | |||
| 277 | 271 | ||
| 278 | unsigned int vcibits, vpibits; | 272 | unsigned int vcibits, vpibits; |
| 279 | unsigned int cells_per_row; | 273 | unsigned int cells_per_row; |
| @@ -392,6 +386,7 @@ struct he_vcc | |||
| 392 | #define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data) | 386 | #define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data) |
| 393 | 387 | ||
| 394 | #define he_is622(dev) ((dev)->media & 0x1) | 388 | #define he_is622(dev) ((dev)->media & 0x1) |
| 389 | #define he_isMM(dev) ((dev)->media & 0x20) | ||
| 395 | 390 | ||
| 396 | #define HE_REGMAP_SIZE 0x100000 | 391 | #define HE_REGMAP_SIZE 0x100000 |
| 397 | 392 | ||
| @@ -876,8 +871,8 @@ struct he_vcc | |||
| 876 | #define M_SN 0x3a /* integer */ | 871 | #define M_SN 0x3a /* integer */ |
| 877 | #define MEDIA 0x3e /* integer */ | 872 | #define MEDIA 0x3e /* integer */ |
| 878 | #define HE155MM 0x26 | 873 | #define HE155MM 0x26 |
| 879 | #define HE155SM 0x27 | 874 | #define HE622MM 0x27 |
| 880 | #define HE622MM 0x46 | 875 | #define HE155SM 0x46 |
| 881 | #define HE622SM 0x47 | 876 | #define HE622SM 0x47 |
| 882 | #define MAC_ADDR 0x42 /* char[] */ | 877 | #define MAC_ADDR 0x42 /* char[] */ |
| 883 | 878 | ||
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 5c28ca7380ff..139fce6968a6 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
| @@ -2562,17 +2562,11 @@ static int __devinit ia_start(struct atm_dev *dev) | |||
| 2562 | error = suni_init(dev); | 2562 | error = suni_init(dev); |
| 2563 | if (error) | 2563 | if (error) |
| 2564 | goto err_free_rx; | 2564 | goto err_free_rx; |
| 2565 | /* | 2565 | if (dev->phy->start) { |
| 2566 | * Enable interrupt on loss of signal | 2566 | error = dev->phy->start(dev); |
| 2567 | * SUNI_RSOP_CIE - 0x10 | 2567 | if (error) |
| 2568 | * SUNI_RSOP_CIE_LOSE - 0x04 | 2568 | goto err_free_rx; |
| 2569 | */ | 2569 | } |
| 2570 | ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); | ||
| 2571 | #ifndef MODULE | ||
| 2572 | error = dev->phy->start(dev); | ||
| 2573 | if (error) | ||
| 2574 | goto err_free_rx; | ||
| 2575 | #endif | ||
| 2576 | /* Get iadev->carrier_detect status */ | 2570 | /* Get iadev->carrier_detect status */ |
| 2577 | IaFrontEndIntr(iadev); | 2571 | IaFrontEndIntr(iadev); |
| 2578 | } | 2572 | } |
| @@ -3198,6 +3192,8 @@ static int __devinit ia_init_one(struct pci_dev *pdev, | |||
| 3198 | IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, | 3192 | IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, |
| 3199 | iadev->LineRate);) | 3193 | iadev->LineRate);) |
| 3200 | 3194 | ||
| 3195 | pci_set_drvdata(pdev, dev); | ||
| 3196 | |||
| 3201 | ia_dev[iadev_count] = iadev; | 3197 | ia_dev[iadev_count] = iadev; |
| 3202 | _ia_dev[iadev_count] = dev; | 3198 | _ia_dev[iadev_count] = dev; |
| 3203 | iadev_count++; | 3199 | iadev_count++; |
| @@ -3219,8 +3215,6 @@ static int __devinit ia_init_one(struct pci_dev *pdev, | |||
| 3219 | iadev->next_board = ia_boards; | 3215 | iadev->next_board = ia_boards; |
| 3220 | ia_boards = dev; | 3216 | ia_boards = dev; |
| 3221 | 3217 | ||
| 3222 | pci_set_drvdata(pdev, dev); | ||
| 3223 | |||
| 3224 | return 0; | 3218 | return 0; |
| 3225 | 3219 | ||
| 3226 | err_out_deregister_dev: | 3220 | err_out_deregister_dev: |
| @@ -3238,9 +3232,14 @@ static void __devexit ia_remove_one(struct pci_dev *pdev) | |||
| 3238 | struct atm_dev *dev = pci_get_drvdata(pdev); | 3232 | struct atm_dev *dev = pci_get_drvdata(pdev); |
| 3239 | IADEV *iadev = INPH_IA_DEV(dev); | 3233 | IADEV *iadev = INPH_IA_DEV(dev); |
| 3240 | 3234 | ||
| 3241 | ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); | 3235 | /* Disable phy interrupts */ |
| 3236 | ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE), | ||
| 3237 | SUNI_RSOP_CIE); | ||
| 3242 | udelay(1); | 3238 | udelay(1); |
| 3243 | 3239 | ||
| 3240 | if (dev->phy && dev->phy->stop) | ||
| 3241 | dev->phy->stop(dev); | ||
| 3242 | |||
| 3244 | /* De-register device */ | 3243 | /* De-register device */ |
| 3245 | free_irq(iadev->irq, dev); | 3244 | free_irq(iadev->irq, dev); |
| 3246 | iadev_count--; | 3245 | iadev_count--; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 422cfcad486d..ee0a51a3a41d 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -762,6 +762,7 @@ static void device_remove_class_symlinks(struct device *dev) | |||
| 762 | /** | 762 | /** |
| 763 | * dev_set_name - set a device name | 763 | * dev_set_name - set a device name |
| 764 | * @dev: device | 764 | * @dev: device |
| 765 | * @fmt: format string for the device's name | ||
| 765 | */ | 766 | */ |
| 766 | int dev_set_name(struct device *dev, const char *fmt, ...) | 767 | int dev_set_name(struct device *dev, const char *fmt, ...) |
| 767 | { | 768 | { |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index e336b05fe4a7..5f1e1cc6165a 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -53,15 +53,16 @@ | |||
| 53 | #include <linux/scatterlist.h> | 53 | #include <linux/scatterlist.h> |
| 54 | 54 | ||
| 55 | #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) | 55 | #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) |
| 56 | #define DRIVER_NAME "HP CISS Driver (v 3.6.14)" | 56 | #define DRIVER_NAME "HP CISS Driver (v 3.6.20)" |
| 57 | #define DRIVER_VERSION CCISS_DRIVER_VERSION(3,6,14) | 57 | #define DRIVER_VERSION CCISS_DRIVER_VERSION(3, 6, 20) |
| 58 | 58 | ||
| 59 | /* Embedded module documentation macros - see modules.h */ | 59 | /* Embedded module documentation macros - see modules.h */ |
| 60 | MODULE_AUTHOR("Hewlett-Packard Company"); | 60 | MODULE_AUTHOR("Hewlett-Packard Company"); |
| 61 | MODULE_DESCRIPTION("Driver for HP Controller SA5xxx SA6xxx version 3.6.14"); | 61 | MODULE_DESCRIPTION("Driver for HP Smart Array Controllers"); |
| 62 | MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400" | 62 | MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400" |
| 63 | " SA6i P600 P800 P400 P400i E200 E200i E500"); | 63 | " SA6i P600 P800 P400 P400i E200 E200i E500 P700m" |
| 64 | MODULE_VERSION("3.6.14"); | 64 | " Smart Array G2 Series SAS/SATA Controllers"); |
| 65 | MODULE_VERSION("3.6.20"); | ||
| 65 | MODULE_LICENSE("GPL"); | 66 | MODULE_LICENSE("GPL"); |
| 66 | 67 | ||
| 67 | #include "cciss_cmd.h" | 68 | #include "cciss_cmd.h" |
| @@ -90,6 +91,11 @@ static const struct pci_device_id cciss_pci_device_id[] = { | |||
| 90 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3215}, | 91 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3215}, |
| 91 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3237}, | 92 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3237}, |
| 92 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x323D}, | 93 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x323D}, |
| 94 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3241}, | ||
| 95 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3243}, | ||
| 96 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3245}, | ||
| 97 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3247}, | ||
| 98 | {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3249}, | ||
| 93 | {PCI_VENDOR_ID_HP, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 99 | {PCI_VENDOR_ID_HP, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
| 94 | PCI_CLASS_STORAGE_RAID << 8, 0xffff << 8, 0}, | 100 | PCI_CLASS_STORAGE_RAID << 8, 0xffff << 8, 0}, |
| 95 | {0,} | 101 | {0,} |
| @@ -123,6 +129,11 @@ static struct board_type products[] = { | |||
| 123 | {0x3215103C, "Smart Array E200i", &SA5_access, 120}, | 129 | {0x3215103C, "Smart Array E200i", &SA5_access, 120}, |
| 124 | {0x3237103C, "Smart Array E500", &SA5_access, 512}, | 130 | {0x3237103C, "Smart Array E500", &SA5_access, 512}, |
| 125 | {0x323D103C, "Smart Array P700m", &SA5_access, 512}, | 131 | {0x323D103C, "Smart Array P700m", &SA5_access, 512}, |
| 132 | {0x3241103C, "Smart Array P212", &SA5_access, 384}, | ||
| 133 | {0x3243103C, "Smart Array P410", &SA5_access, 384}, | ||
| 134 | {0x3245103C, "Smart Array P410i", &SA5_access, 384}, | ||
| 135 | {0x3247103C, "Smart Array P411", &SA5_access, 384}, | ||
| 136 | {0x3249103C, "Smart Array P812", &SA5_access, 384}, | ||
| 126 | {0xFFFF103C, "Unknown Smart Array", &SA5_access, 120}, | 137 | {0xFFFF103C, "Unknown Smart Array", &SA5_access, 120}, |
| 127 | }; | 138 | }; |
| 128 | 139 | ||
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index d307bf26af58..2d854bb9373e 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
| @@ -749,7 +749,7 @@ config NVRAM | |||
| 749 | if RTC_LIB=n | 749 | if RTC_LIB=n |
| 750 | 750 | ||
| 751 | config RTC | 751 | config RTC |
| 752 | tristate "Enhanced Real Time Clock Support" | 752 | tristate "Enhanced Real Time Clock Support (legacy PC RTC driver)" |
| 753 | depends on !PPC && !PARISC && !IA64 && !M68K && !SPARC && !FRV \ | 753 | depends on !PPC && !PARISC && !IA64 && !M68K && !SPARC && !FRV \ |
| 754 | && !ARM && !SUPERH && !S390 && !AVR32 | 754 | && !ARM && !SUPERH && !S390 && !AVR32 |
| 755 | ---help--- | 755 | ---help--- |
| @@ -1036,9 +1036,9 @@ config HPET | |||
| 1036 | non-periodic and/or periodic. | 1036 | non-periodic and/or periodic. |
| 1037 | 1037 | ||
| 1038 | config HPET_RTC_IRQ | 1038 | config HPET_RTC_IRQ |
| 1039 | bool "HPET Control RTC IRQ" if !HPET_EMULATE_RTC | 1039 | bool |
| 1040 | default n | 1040 | default HPET_EMULATE_RTC |
| 1041 | depends on HPET | 1041 | depends on RTC && HPET |
| 1042 | help | 1042 | help |
| 1043 | If you say Y here, you will disable RTC_IRQ in drivers/char/rtc.c. It | 1043 | If you say Y here, you will disable RTC_IRQ in drivers/char/rtc.c. It |
| 1044 | is assumed the platform called hpet_alloc with the RTC IRQ values for | 1044 | is assumed the platform called hpet_alloc with the RTC IRQ values for |
diff --git a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c index 55c97f623242..07b4d8ff56e5 100644 --- a/drivers/char/agp/ati-agp.c +++ b/drivers/char/agp/ati-agp.c | |||
| @@ -458,6 +458,10 @@ static struct agp_device_ids ati_agp_device_ids[] __devinitdata = | |||
| 458 | .chipset_name = "IGP9100/M", | 458 | .chipset_name = "IGP9100/M", |
| 459 | }, | 459 | }, |
| 460 | { | 460 | { |
| 461 | .device_id = PCI_DEVICE_ID_ATI_RS350_133, | ||
| 462 | .chipset_name = "IGP9000/M", | ||
| 463 | }, | ||
| 464 | { | ||
| 461 | .device_id = PCI_DEVICE_ID_ATI_RS350_200, | 465 | .device_id = PCI_DEVICE_ID_ATI_RS350_200, |
| 462 | .chipset_name = "IGP9100/M", | 466 | .chipset_name = "IGP9100/M", |
| 463 | }, | 467 | }, |
diff --git a/drivers/char/generic_nvram.c b/drivers/char/generic_nvram.c index 2398e864c28d..a00869c650d5 100644 --- a/drivers/char/generic_nvram.c +++ b/drivers/char/generic_nvram.c | |||
| @@ -133,7 +133,7 @@ static struct miscdevice nvram_dev = { | |||
| 133 | 133 | ||
| 134 | int __init nvram_init(void) | 134 | int __init nvram_init(void) |
| 135 | { | 135 | { |
| 136 | printk(KERN_INFO "Macintosh non-volatile memory driver v%s\n", | 136 | printk(KERN_INFO "Generic non-volatile memory driver v%s\n", |
| 137 | NVRAM_VERSION); | 137 | NVRAM_VERSION); |
| 138 | return misc_register(&nvram_dev); | 138 | return misc_register(&nvram_dev); |
| 139 | } | 139 | } |
diff --git a/drivers/char/hw_random/intel-rng.c b/drivers/char/hw_random/intel-rng.c index 5cc651ef75eb..27fdc0866496 100644 --- a/drivers/char/hw_random/intel-rng.c +++ b/drivers/char/hw_random/intel-rng.c | |||
| @@ -273,7 +273,7 @@ static int __init intel_rng_hw_init(void *_intel_rng_hw) | |||
| 273 | if (mfc != INTEL_FWH_MANUFACTURER_CODE || | 273 | if (mfc != INTEL_FWH_MANUFACTURER_CODE || |
| 274 | (dvc != INTEL_FWH_DEVICE_CODE_8M && | 274 | (dvc != INTEL_FWH_DEVICE_CODE_8M && |
| 275 | dvc != INTEL_FWH_DEVICE_CODE_4M)) { | 275 | dvc != INTEL_FWH_DEVICE_CODE_4M)) { |
| 276 | printk(KERN_ERR PFX "FWH not detected\n"); | 276 | printk(KERN_NOTICE PFX "FWH not detected\n"); |
| 277 | return -ENODEV; | 277 | return -ENODEV; |
| 278 | } | 278 | } |
| 279 | 279 | ||
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c index 7f7e798c1384..d9a0a53c842d 100644 --- a/drivers/char/keyboard.c +++ b/drivers/char/keyboard.c | |||
| @@ -677,12 +677,7 @@ static void k_deadunicode(struct vc_data *vc, unsigned int value, char up_flag) | |||
| 677 | 677 | ||
| 678 | static void k_self(struct vc_data *vc, unsigned char value, char up_flag) | 678 | static void k_self(struct vc_data *vc, unsigned char value, char up_flag) |
| 679 | { | 679 | { |
| 680 | unsigned int uni; | 680 | k_unicode(vc, conv_8bit_to_uni(value), up_flag); |
| 681 | if (kbd->kbdmode == VC_UNICODE) | ||
| 682 | uni = value; | ||
| 683 | else | ||
| 684 | uni = conv_8bit_to_uni(value); | ||
| 685 | k_unicode(vc, uni, up_flag); | ||
| 686 | } | 681 | } |
| 687 | 682 | ||
| 688 | static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag) | 683 | static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag) |
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index fc555a90bb21..23554b676d6e 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -38,6 +38,8 @@ static void cpuidle_kick_cpus(void) | |||
| 38 | static void cpuidle_kick_cpus(void) {} | 38 | static void cpuidle_kick_cpus(void) {} |
| 39 | #endif | 39 | #endif |
| 40 | 40 | ||
| 41 | static int __cpuidle_register_device(struct cpuidle_device *dev); | ||
| 42 | |||
| 41 | /** | 43 | /** |
| 42 | * cpuidle_idle_call - the main idle loop | 44 | * cpuidle_idle_call - the main idle loop |
| 43 | * | 45 | * |
| @@ -138,6 +140,12 @@ int cpuidle_enable_device(struct cpuidle_device *dev) | |||
| 138 | if (!dev->state_count) | 140 | if (!dev->state_count) |
| 139 | return -EINVAL; | 141 | return -EINVAL; |
| 140 | 142 | ||
| 143 | if (dev->registered == 0) { | ||
| 144 | ret = __cpuidle_register_device(dev); | ||
| 145 | if (ret) | ||
| 146 | return ret; | ||
| 147 | } | ||
| 148 | |||
| 141 | if ((ret = cpuidle_add_state_sysfs(dev))) | 149 | if ((ret = cpuidle_add_state_sysfs(dev))) |
| 142 | return ret; | 150 | return ret; |
| 143 | 151 | ||
| @@ -232,10 +240,13 @@ static void poll_idle_init(struct cpuidle_device *dev) {} | |||
| 232 | #endif /* CONFIG_ARCH_HAS_CPU_RELAX */ | 240 | #endif /* CONFIG_ARCH_HAS_CPU_RELAX */ |
| 233 | 241 | ||
| 234 | /** | 242 | /** |
| 235 | * cpuidle_register_device - registers a CPU's idle PM feature | 243 | * __cpuidle_register_device - internal register function called before register |
| 244 | * and enable routines | ||
| 236 | * @dev: the cpu | 245 | * @dev: the cpu |
| 246 | * | ||
| 247 | * cpuidle_lock mutex must be held before this is called | ||
| 237 | */ | 248 | */ |
| 238 | int cpuidle_register_device(struct cpuidle_device *dev) | 249 | static int __cpuidle_register_device(struct cpuidle_device *dev) |
| 239 | { | 250 | { |
| 240 | int ret; | 251 | int ret; |
| 241 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); | 252 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); |
| @@ -247,18 +258,34 @@ int cpuidle_register_device(struct cpuidle_device *dev) | |||
| 247 | 258 | ||
| 248 | init_completion(&dev->kobj_unregister); | 259 | init_completion(&dev->kobj_unregister); |
| 249 | 260 | ||
| 250 | mutex_lock(&cpuidle_lock); | ||
| 251 | |||
| 252 | poll_idle_init(dev); | 261 | poll_idle_init(dev); |
| 253 | 262 | ||
| 254 | per_cpu(cpuidle_devices, dev->cpu) = dev; | 263 | per_cpu(cpuidle_devices, dev->cpu) = dev; |
| 255 | list_add(&dev->device_list, &cpuidle_detected_devices); | 264 | list_add(&dev->device_list, &cpuidle_detected_devices); |
| 256 | if ((ret = cpuidle_add_sysfs(sys_dev))) { | 265 | if ((ret = cpuidle_add_sysfs(sys_dev))) { |
| 257 | mutex_unlock(&cpuidle_lock); | ||
| 258 | module_put(cpuidle_curr_driver->owner); | 266 | module_put(cpuidle_curr_driver->owner); |
| 259 | return ret; | 267 | return ret; |
| 260 | } | 268 | } |
| 261 | 269 | ||
| 270 | dev->registered = 1; | ||
| 271 | return 0; | ||
| 272 | } | ||
| 273 | |||
| 274 | /** | ||
| 275 | * cpuidle_register_device - registers a CPU's idle PM feature | ||
| 276 | * @dev: the cpu | ||
| 277 | */ | ||
| 278 | int cpuidle_register_device(struct cpuidle_device *dev) | ||
| 279 | { | ||
| 280 | int ret; | ||
| 281 | |||
| 282 | mutex_lock(&cpuidle_lock); | ||
| 283 | |||
| 284 | if ((ret = __cpuidle_register_device(dev))) { | ||
| 285 | mutex_unlock(&cpuidle_lock); | ||
| 286 | return ret; | ||
| 287 | } | ||
| 288 | |||
| 262 | cpuidle_enable_device(dev); | 289 | cpuidle_enable_device(dev); |
| 263 | cpuidle_install_idle_handler(); | 290 | cpuidle_install_idle_handler(); |
| 264 | 291 | ||
| @@ -278,6 +305,9 @@ void cpuidle_unregister_device(struct cpuidle_device *dev) | |||
| 278 | { | 305 | { |
| 279 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); | 306 | struct sys_device *sys_dev = get_cpu_sysdev((unsigned long)dev->cpu); |
| 280 | 307 | ||
| 308 | if (dev->registered == 0) | ||
| 309 | return; | ||
| 310 | |||
| 281 | cpuidle_pause_and_lock(); | 311 | cpuidle_pause_and_lock(); |
| 282 | 312 | ||
| 283 | cpuidle_disable_device(dev); | 313 | cpuidle_disable_device(dev); |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index b4f3aefa12b6..1607536ff5fb 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -1028,6 +1028,7 @@ endif | |||
| 1028 | 1028 | ||
| 1029 | config BLK_DEV_HD_ONLY | 1029 | config BLK_DEV_HD_ONLY |
| 1030 | bool "Old hard disk (MFM/RLL/IDE) driver" | 1030 | bool "Old hard disk (MFM/RLL/IDE) driver" |
| 1031 | depends on !ARM || ARCH_RPC || ARCH_SHARK || BROKEN | ||
| 1031 | help | 1032 | help |
| 1032 | There are two drivers for MFM/RLL/IDE hard disks. Most people use | 1033 | There are two drivers for MFM/RLL/IDE hard disks. Most people use |
| 1033 | the newer enhanced driver, but this old one is still around for two | 1034 | the newer enhanced driver, but this old one is still around for two |
diff --git a/drivers/ide/arm/bast-ide.c b/drivers/ide/arm/bast-ide.c index 713cef20622e..8e8c28104b45 100644 --- a/drivers/ide/arm/bast-ide.c +++ b/drivers/ide/arm/bast-ide.c | |||
| @@ -42,6 +42,7 @@ static int __init bastide_register(unsigned int base, unsigned int aux, int irq) | |||
| 42 | 42 | ||
| 43 | hw.io_ports.ctl_addr = aux + (6 * 0x20); | 43 | hw.io_ports.ctl_addr = aux + (6 * 0x20); |
| 44 | hw.irq = irq; | 44 | hw.irq = irq; |
| 45 | hw.chipset = ide_generic; | ||
| 45 | 46 | ||
| 46 | hwif = ide_find_port(); | 47 | hwif = ide_find_port(); |
| 47 | if (hwif == NULL) | 48 | if (hwif == NULL) |
diff --git a/drivers/ide/arm/ide_arm.c b/drivers/ide/arm/ide_arm.c index 4263ffd4ab20..2f311da4c963 100644 --- a/drivers/ide/arm/ide_arm.c +++ b/drivers/ide/arm/ide_arm.c | |||
| @@ -49,6 +49,7 @@ static int __init ide_arm_init(void) | |||
| 49 | memset(&hw, 0, sizeof(hw)); | 49 | memset(&hw, 0, sizeof(hw)); |
| 50 | ide_std_init_ports(&hw, base, ctl); | 50 | ide_std_init_ports(&hw, base, ctl); |
| 51 | hw.irq = IDE_ARM_IRQ; | 51 | hw.irq = IDE_ARM_IRQ; |
| 52 | hw.chipset = ide_generic; | ||
| 52 | 53 | ||
| 53 | hwif = ide_find_port(); | 54 | hwif = ide_find_port(); |
| 54 | if (hwif) { | 55 | if (hwif) { |
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c index 96378ebfb31f..d024ac8fad14 100644 --- a/drivers/ide/arm/palm_bk3710.c +++ b/drivers/ide/arm/palm_bk3710.c | |||
| @@ -409,9 +409,6 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev) | |||
| 409 | 409 | ||
| 410 | ide_device_add(idx, &palm_bk3710_port_info); | 410 | ide_device_add(idx, &palm_bk3710_port_info); |
| 411 | 411 | ||
| 412 | if (!hwif->present) | ||
| 413 | goto out; | ||
| 414 | |||
| 415 | return 0; | 412 | return 0; |
| 416 | out: | 413 | out: |
| 417 | printk(KERN_WARNING "Palm Chip BK3710 IDE Register Fail\n"); | 414 | printk(KERN_WARNING "Palm Chip BK3710 IDE Register Fail\n"); |
diff --git a/drivers/ide/ide-generic.c b/drivers/ide/ide-generic.c index a6073e248f45..2d92214096ab 100644 --- a/drivers/ide/ide-generic.c +++ b/drivers/ide/ide-generic.c | |||
| @@ -22,6 +22,10 @@ | |||
| 22 | 22 | ||
| 23 | #define DRV_NAME "ide_generic" | 23 | #define DRV_NAME "ide_generic" |
| 24 | 24 | ||
| 25 | static int probe_mask = 0x03; | ||
| 26 | module_param(probe_mask, int, 0); | ||
| 27 | MODULE_PARM_DESC(probe_mask, "probe mask for legacy ISA IDE ports"); | ||
| 28 | |||
| 25 | static ssize_t store_add(struct class *cls, const char *buf, size_t n) | 29 | static ssize_t store_add(struct class *cls, const char *buf, size_t n) |
| 26 | { | 30 | { |
| 27 | ide_hwif_t *hwif; | 31 | ide_hwif_t *hwif; |
| @@ -89,6 +93,9 @@ static int __init ide_generic_init(void) | |||
| 89 | u8 idx[MAX_HWIFS]; | 93 | u8 idx[MAX_HWIFS]; |
| 90 | int i; | 94 | int i; |
| 91 | 95 | ||
| 96 | printk(KERN_INFO DRV_NAME ": please use \"probe_mask=0x3f\" module " | ||
| 97 | "parameter for probing all legacy ISA IDE ports\n"); | ||
| 98 | |||
| 92 | for (i = 0; i < MAX_HWIFS; i++) { | 99 | for (i = 0; i < MAX_HWIFS; i++) { |
| 93 | ide_hwif_t *hwif; | 100 | ide_hwif_t *hwif; |
| 94 | unsigned long io_addr = ide_default_io_base(i); | 101 | unsigned long io_addr = ide_default_io_base(i); |
| @@ -96,7 +103,7 @@ static int __init ide_generic_init(void) | |||
| 96 | 103 | ||
| 97 | idx[i] = 0xff; | 104 | idx[i] = 0xff; |
| 98 | 105 | ||
| 99 | if (io_addr) { | 106 | if ((probe_mask & (1 << i)) && io_addr) { |
| 100 | if (!request_region(io_addr, 8, DRV_NAME)) { | 107 | if (!request_region(io_addr, 8, DRV_NAME)) { |
| 101 | printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX " | 108 | printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX " |
| 102 | "not free.\n", | 109 | "not free.\n", |
| @@ -125,6 +132,7 @@ static int __init ide_generic_init(void) | |||
| 125 | memset(&hw, 0, sizeof(hw)); | 132 | memset(&hw, 0, sizeof(hw)); |
| 126 | ide_std_init_ports(&hw, io_addr, io_addr + 0x206); | 133 | ide_std_init_ports(&hw, io_addr, io_addr + 0x206); |
| 127 | hw.irq = ide_default_irq(io_addr); | 134 | hw.irq = ide_default_irq(io_addr); |
| 135 | hw.chipset = ide_generic; | ||
| 128 | ide_init_port_hw(hwif, &hw); | 136 | ide_init_port_hw(hwif, &hw); |
| 129 | 137 | ||
| 130 | idx[i] = i; | 138 | idx[i] = i; |
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c index 6a8953f68e9f..adbd01784162 100644 --- a/drivers/ide/ide-pnp.c +++ b/drivers/ide/ide-pnp.c | |||
| @@ -55,6 +55,7 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | |||
| 55 | memset(&hw, 0, sizeof(hw)); | 55 | memset(&hw, 0, sizeof(hw)); |
| 56 | ide_std_init_ports(&hw, base, ctl); | 56 | ide_std_init_ports(&hw, base, ctl); |
| 57 | hw.irq = pnp_irq(dev, 0); | 57 | hw.irq = pnp_irq(dev, 0); |
| 58 | hw.chipset = ide_generic; | ||
| 58 | 59 | ||
| 59 | hwif = ide_find_port(); | 60 | hwif = ide_find_port(); |
| 60 | if (hwif) { | 61 | if (hwif) { |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 655ec7ef568a..380fa0c8cc84 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
| @@ -1333,8 +1333,7 @@ static void ide_port_init_devices(ide_hwif_t *hwif) | |||
| 1333 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | 1333 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, |
| 1334 | const struct ide_port_info *d) | 1334 | const struct ide_port_info *d) |
| 1335 | { | 1335 | { |
| 1336 | if (d->chipset != ide_etrax100) | 1336 | hwif->channel = port; |
| 1337 | hwif->channel = port; | ||
| 1338 | 1337 | ||
| 1339 | if (d->chipset) | 1338 | if (d->chipset) |
| 1340 | hwif->chipset = d->chipset; | 1339 | hwif->chipset = d->chipset; |
| @@ -1519,7 +1518,7 @@ int ide_device_add_all(u8 *idx, const struct ide_port_info *d) | |||
| 1519 | continue; | 1518 | continue; |
| 1520 | } | 1519 | } |
| 1521 | 1520 | ||
| 1522 | if (d->chipset != ide_etrax100 && (i & 1) && mate) { | 1521 | if ((i & 1) && mate) { |
| 1523 | hwif->mate = mate; | 1522 | hwif->mate = mate; |
| 1524 | mate->mate = hwif; | 1523 | mate->mate = hwif; |
| 1525 | } | 1524 | } |
| @@ -1665,6 +1664,7 @@ static void ide_legacy_init_one(u8 *idx, hw_regs_t *hw, u8 port_no, | |||
| 1665 | 1664 | ||
| 1666 | ide_std_init_ports(hw, base, ctl); | 1665 | ide_std_init_ports(hw, base, ctl); |
| 1667 | hw->irq = irq; | 1666 | hw->irq = irq; |
| 1667 | hw->chipset = d->chipset; | ||
| 1668 | 1668 | ||
| 1669 | hwif = ide_find_port_slot(d); | 1669 | hwif = ide_find_port_slot(d); |
| 1670 | if (hwif) { | 1670 | if (hwif) { |
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index 8d6ad812a014..55ec7f798772 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c | |||
| @@ -63,7 +63,6 @@ static int proc_ide_read_imodel | |||
| 63 | case ide_pmac: name = "mac-io"; break; | 63 | case ide_pmac: name = "mac-io"; break; |
| 64 | case ide_au1xxx: name = "au1xxx"; break; | 64 | case ide_au1xxx: name = "au1xxx"; break; |
| 65 | case ide_palm3710: name = "palm3710"; break; | 65 | case ide_palm3710: name = "palm3710"; break; |
| 66 | case ide_etrax100: name = "etrax100"; break; | ||
| 67 | case ide_acorn: name = "acorn"; break; | 66 | case ide_acorn: name = "acorn"; break; |
| 68 | default: name = "(unknown)"; break; | 67 | default: name = "(unknown)"; break; |
| 69 | } | 68 | } |
diff --git a/drivers/ide/legacy/buddha.c b/drivers/ide/legacy/buddha.c index 5c730e4dd735..9a1d27ef3f8a 100644 --- a/drivers/ide/legacy/buddha.c +++ b/drivers/ide/legacy/buddha.c | |||
| @@ -138,6 +138,8 @@ static void __init buddha_setup_ports(hw_regs_t *hw, unsigned long base, | |||
| 138 | 138 | ||
| 139 | hw->irq = IRQ_AMIGA_PORTS; | 139 | hw->irq = IRQ_AMIGA_PORTS; |
| 140 | hw->ack_intr = ack_intr; | 140 | hw->ack_intr = ack_intr; |
| 141 | |||
| 142 | hw->chipset = ide_generic; | ||
| 141 | } | 143 | } |
| 142 | 144 | ||
| 143 | /* | 145 | /* |
diff --git a/drivers/ide/legacy/falconide.c b/drivers/ide/legacy/falconide.c index 9e449a0c623f..af11028b4794 100644 --- a/drivers/ide/legacy/falconide.c +++ b/drivers/ide/legacy/falconide.c | |||
| @@ -81,6 +81,8 @@ static void __init falconide_setup_ports(hw_regs_t *hw) | |||
| 81 | 81 | ||
| 82 | hw->irq = IRQ_MFP_IDE; | 82 | hw->irq = IRQ_MFP_IDE; |
| 83 | hw->ack_intr = NULL; | 83 | hw->ack_intr = NULL; |
| 84 | |||
| 85 | hw->chipset = ide_generic; | ||
| 84 | } | 86 | } |
| 85 | 87 | ||
| 86 | /* | 88 | /* |
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c index a9c2593a898c..fed7d812761c 100644 --- a/drivers/ide/legacy/gayle.c +++ b/drivers/ide/legacy/gayle.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/ide.h> | 16 | #include <linux/ide.h> |
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | #include <linux/zorro.h> | 18 | #include <linux/zorro.h> |
| 19 | #include <linux/module.h> | ||
| 19 | 20 | ||
| 20 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
| 21 | #include <asm/amigahw.h> | 22 | #include <asm/amigahw.h> |
| @@ -62,7 +63,10 @@ | |||
| 62 | GAYLE_NUM_HWIFS-1) | 63 | GAYLE_NUM_HWIFS-1) |
| 63 | #define GAYLE_HAS_CONTROL_REG (!ide_doubler) | 64 | #define GAYLE_HAS_CONTROL_REG (!ide_doubler) |
| 64 | #define GAYLE_IDEREG_SIZE (ide_doubler ? 0x1000 : 0x2000) | 65 | #define GAYLE_IDEREG_SIZE (ide_doubler ? 0x1000 : 0x2000) |
| 66 | |||
| 65 | int ide_doubler = 0; /* support IDE doublers? */ | 67 | int ide_doubler = 0; /* support IDE doublers? */ |
| 68 | EXPORT_SYMBOL_GPL(ide_doubler); | ||
| 69 | |||
| 66 | module_param_named(doubler, ide_doubler, bool, 0); | 70 | module_param_named(doubler, ide_doubler, bool, 0); |
| 67 | MODULE_PARM_DESC(doubler, "enable support for IDE doublers"); | 71 | MODULE_PARM_DESC(doubler, "enable support for IDE doublers"); |
| 68 | #endif /* CONFIG_BLK_DEV_IDEDOUBLER */ | 72 | #endif /* CONFIG_BLK_DEV_IDEDOUBLER */ |
| @@ -112,6 +116,8 @@ static void __init gayle_setup_ports(hw_regs_t *hw, unsigned long base, | |||
| 112 | 116 | ||
| 113 | hw->irq = IRQ_AMIGA_PORTS; | 117 | hw->irq = IRQ_AMIGA_PORTS; |
| 114 | hw->ack_intr = ack_intr; | 118 | hw->ack_intr = ack_intr; |
| 119 | |||
| 120 | hw->chipset = ide_generic; | ||
| 115 | } | 121 | } |
| 116 | 122 | ||
| 117 | /* | 123 | /* |
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index aa2ea3deac85..f633b6b3c7f3 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
| @@ -135,13 +135,17 @@ static void ide_detach(struct pcmcia_device *link) | |||
| 135 | { | 135 | { |
| 136 | ide_info_t *info = link->priv; | 136 | ide_info_t *info = link->priv; |
| 137 | ide_hwif_t *hwif = info->hwif; | 137 | ide_hwif_t *hwif = info->hwif; |
| 138 | unsigned long data_addr, ctl_addr; | ||
| 138 | 139 | ||
| 139 | DEBUG(0, "ide_detach(0x%p)\n", link); | 140 | DEBUG(0, "ide_detach(0x%p)\n", link); |
| 140 | 141 | ||
| 142 | data_addr = hwif->io_ports.data_addr; | ||
| 143 | ctl_addr = hwif->io_ports.ctl_addr; | ||
| 144 | |||
| 141 | ide_release(link); | 145 | ide_release(link); |
| 142 | 146 | ||
| 143 | release_region(hwif->io_ports.ctl_addr, 1); | 147 | release_region(ctl_addr, 1); |
| 144 | release_region(hwif->io_ports.data_addr, 8); | 148 | release_region(data_addr, 8); |
| 145 | 149 | ||
| 146 | kfree(info); | 150 | kfree(info); |
| 147 | } /* ide_detach */ | 151 | } /* ide_detach */ |
| @@ -194,6 +198,16 @@ static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, | |||
| 194 | if (hwif->present) | 198 | if (hwif->present) |
| 195 | return hwif; | 199 | return hwif; |
| 196 | 200 | ||
| 201 | /* retry registration in case device is still spinning up */ | ||
| 202 | for (i = 0; i < 10; i++) { | ||
| 203 | msleep(100); | ||
| 204 | ide_port_scan(hwif); | ||
| 205 | if (hwif->present) | ||
| 206 | return hwif; | ||
| 207 | } | ||
| 208 | |||
| 209 | return hwif; | ||
| 210 | |||
| 197 | out_release: | 211 | out_release: |
| 198 | release_region(ctl, 1); | 212 | release_region(ctl, 1); |
| 199 | release_region(io, 8); | 213 | release_region(io, 8); |
| @@ -222,7 +236,7 @@ static int ide_config(struct pcmcia_device *link) | |||
| 222 | cistpl_cftable_entry_t dflt; | 236 | cistpl_cftable_entry_t dflt; |
| 223 | } *stk = NULL; | 237 | } *stk = NULL; |
| 224 | cistpl_cftable_entry_t *cfg; | 238 | cistpl_cftable_entry_t *cfg; |
| 225 | int i, pass, last_ret = 0, last_fn = 0, is_kme = 0; | 239 | int pass, last_ret = 0, last_fn = 0, is_kme = 0; |
| 226 | unsigned long io_base, ctl_base; | 240 | unsigned long io_base, ctl_base; |
| 227 | ide_hwif_t *hwif; | 241 | ide_hwif_t *hwif; |
| 228 | 242 | ||
| @@ -319,30 +333,15 @@ static int ide_config(struct pcmcia_device *link) | |||
| 319 | if (is_kme) | 333 | if (is_kme) |
| 320 | outb(0x81, ctl_base+1); | 334 | outb(0x81, ctl_base+1); |
| 321 | 335 | ||
| 322 | /* retry registration in case device is still spinning up */ | 336 | hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); |
| 323 | for (i = 0; i < 10; i++) { | 337 | if (hwif == NULL && link->io.NumPorts1 == 0x20) { |
| 324 | hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); | ||
| 325 | if (hwif) | ||
| 326 | break; | ||
| 327 | if (link->io.NumPorts1 == 0x20) { | ||
| 328 | outb(0x02, ctl_base + 0x10); | 338 | outb(0x02, ctl_base + 0x10); |
| 329 | hwif = idecs_register(io_base + 0x10, ctl_base + 0x10, | 339 | hwif = idecs_register(io_base + 0x10, ctl_base + 0x10, |
| 330 | link->irq.AssignedIRQ, link); | 340 | link->irq.AssignedIRQ, link); |
| 331 | if (hwif) { | ||
| 332 | io_base += 0x10; | ||
| 333 | ctl_base += 0x10; | ||
| 334 | break; | ||
| 335 | } | ||
| 336 | } | ||
| 337 | msleep(100); | ||
| 338 | } | 341 | } |
| 339 | 342 | ||
| 340 | if (hwif == NULL) { | 343 | if (hwif == NULL) |
| 341 | printk(KERN_NOTICE "ide-cs: ide_register() at 0x%3lx & 0x%3lx" | ||
| 342 | ", irq %u failed\n", io_base, ctl_base, | ||
| 343 | link->irq.AssignedIRQ); | ||
| 344 | goto failed; | 344 | goto failed; |
| 345 | } | ||
| 346 | 345 | ||
| 347 | info->ndev = 1; | 346 | info->ndev = 1; |
| 348 | sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2); | 347 | sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2); |
diff --git a/drivers/ide/legacy/macide.c b/drivers/ide/legacy/macide.c index caa2632dd08e..2e84290d0bcc 100644 --- a/drivers/ide/legacy/macide.c +++ b/drivers/ide/legacy/macide.c | |||
| @@ -78,6 +78,8 @@ static void __init macide_setup_ports(hw_regs_t *hw, unsigned long base, | |||
| 78 | 78 | ||
| 79 | hw->irq = irq; | 79 | hw->irq = irq; |
| 80 | hw->ack_intr = ack_intr; | 80 | hw->ack_intr = ack_intr; |
| 81 | |||
| 82 | hw->chipset = ide_generic; | ||
| 81 | } | 83 | } |
| 82 | 84 | ||
| 83 | static const char *mac_ide_name[] = | 85 | static const char *mac_ide_name[] = |
diff --git a/drivers/ide/legacy/q40ide.c b/drivers/ide/legacy/q40ide.c index 6f535d00e638..8ff6e2d20834 100644 --- a/drivers/ide/legacy/q40ide.c +++ b/drivers/ide/legacy/q40ide.c | |||
| @@ -70,6 +70,8 @@ static void q40_ide_setup_ports(hw_regs_t *hw, unsigned long base, | |||
| 70 | 70 | ||
| 71 | hw->irq = irq; | 71 | hw->irq = irq; |
| 72 | hw->ack_intr = ack_intr; | 72 | hw->ack_intr = ack_intr; |
| 73 | |||
| 74 | hw->chipset = ide_generic; | ||
| 73 | } | 75 | } |
| 74 | 76 | ||
| 75 | static void q40ide_input_data(ide_drive_t *drive, struct request *rq, | 77 | static void q40ide_input_data(ide_drive_t *drive, struct request *rq, |
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c index aaf38109eaec..b38a1980dcd5 100644 --- a/drivers/ide/pci/cmd640.c +++ b/drivers/ide/pci/cmd640.c | |||
| @@ -747,9 +747,11 @@ static int __init cmd640x_init(void) | |||
| 747 | 747 | ||
| 748 | ide_std_init_ports(&hw[0], 0x1f0, 0x3f6); | 748 | ide_std_init_ports(&hw[0], 0x1f0, 0x3f6); |
| 749 | hw[0].irq = 14; | 749 | hw[0].irq = 14; |
| 750 | hw[0].chipset = ide_cmd640; | ||
| 750 | 751 | ||
| 751 | ide_std_init_ports(&hw[1], 0x170, 0x376); | 752 | ide_std_init_ports(&hw[1], 0x170, 0x376); |
| 752 | hw[1].irq = 15; | 753 | hw[1].irq = 15; |
| 754 | hw[1].chipset = ide_cmd640; | ||
| 753 | 755 | ||
| 754 | printk(KERN_INFO "cmd640: buggy cmd640%c interface on %s, config=0x%02x" | 756 | printk(KERN_INFO "cmd640: buggy cmd640%c interface on %s, config=0x%02x" |
| 755 | "\n", 'a' + cmd640_chip_version - 1, bus_type, cfr); | 757 | "\n", 'a' + cmd640_chip_version - 1, bus_type, cfr); |
diff --git a/drivers/ide/pci/delkin_cb.c b/drivers/ide/pci/delkin_cb.c index b9e457996d0e..af0f30051d5a 100644 --- a/drivers/ide/pci/delkin_cb.c +++ b/drivers/ide/pci/delkin_cb.c | |||
| @@ -47,13 +47,18 @@ static const struct ide_port_ops delkin_cb_port_ops = { | |||
| 47 | .quirkproc = ide_undecoded_slave, | 47 | .quirkproc = ide_undecoded_slave, |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | static const struct ide_port_info delkin_cb_port_info = { | ||
| 51 | .port_ops = &delkin_cb_port_ops, | ||
| 52 | .host_flags = IDE_HFLAG_IO_32BIT | IDE_HFLAG_UNMASK_IRQS | | ||
| 53 | IDE_HFLAG_NO_DMA, | ||
| 54 | }; | ||
| 55 | |||
| 50 | static int __devinit | 56 | static int __devinit |
| 51 | delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) | 57 | delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) |
| 52 | { | 58 | { |
| 53 | unsigned long base; | 59 | unsigned long base; |
| 54 | hw_regs_t hw; | 60 | hw_regs_t hw; |
| 55 | ide_hwif_t *hwif = NULL; | 61 | ide_hwif_t *hwif = NULL; |
| 56 | ide_drive_t *drive; | ||
| 57 | int i, rc; | 62 | int i, rc; |
| 58 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 63 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
| 59 | 64 | ||
| @@ -79,6 +84,7 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
| 79 | memset(&hw, 0, sizeof(hw)); | 84 | memset(&hw, 0, sizeof(hw)); |
| 80 | ide_std_init_ports(&hw, base + 0x10, base + 0x1e); | 85 | ide_std_init_ports(&hw, base + 0x10, base + 0x1e); |
| 81 | hw.irq = dev->irq; | 86 | hw.irq = dev->irq; |
| 87 | hw.dev = &dev->dev; | ||
| 82 | hw.chipset = ide_pci; /* this enables IRQ sharing */ | 88 | hw.chipset = ide_pci; /* this enables IRQ sharing */ |
| 83 | 89 | ||
| 84 | hwif = ide_find_port(); | 90 | hwif = ide_find_port(); |
| @@ -89,26 +95,16 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
| 89 | 95 | ||
| 90 | ide_init_port_data(hwif, i); | 96 | ide_init_port_data(hwif, i); |
| 91 | ide_init_port_hw(hwif, &hw); | 97 | ide_init_port_hw(hwif, &hw); |
| 92 | hwif->port_ops = &delkin_cb_port_ops; | ||
| 93 | 98 | ||
| 94 | idx[0] = i; | 99 | idx[0] = i; |
| 95 | 100 | ||
| 96 | ide_device_add(idx, NULL); | 101 | ide_device_add(idx, &delkin_cb_port_info); |
| 97 | |||
| 98 | if (!hwif->present) | ||
| 99 | goto out_disable; | ||
| 100 | 102 | ||
| 101 | pci_set_drvdata(dev, hwif); | 103 | pci_set_drvdata(dev, hwif); |
| 102 | hwif->dev = &dev->dev; | 104 | |
| 103 | drive = &hwif->drives[0]; | ||
| 104 | if (drive->present) { | ||
| 105 | drive->io_32bit = 1; | ||
| 106 | drive->unmask = 1; | ||
| 107 | } | ||
| 108 | return 0; | 105 | return 0; |
| 109 | 106 | ||
| 110 | out_disable: | 107 | out_disable: |
| 111 | printk(KERN_ERR "delkin_cb: no IDE devices found\n"); | ||
| 112 | pci_release_regions(dev); | 108 | pci_release_regions(dev); |
| 113 | pci_disable_device(dev); | 109 | pci_disable_device(dev); |
| 114 | return -ENODEV; | 110 | return -ENODEV; |
| @@ -139,14 +135,12 @@ static struct pci_driver driver = { | |||
| 139 | .remove = delkin_cb_remove, | 135 | .remove = delkin_cb_remove, |
| 140 | }; | 136 | }; |
| 141 | 137 | ||
| 142 | static int | 138 | static int __init delkin_cb_init(void) |
| 143 | delkin_cb_init (void) | ||
| 144 | { | 139 | { |
| 145 | return pci_register_driver(&driver); | 140 | return pci_register_driver(&driver); |
| 146 | } | 141 | } |
| 147 | 142 | ||
| 148 | static void | 143 | static void __exit delkin_cb_exit(void) |
| 149 | delkin_cb_exit (void) | ||
| 150 | { | 144 | { |
| 151 | pci_unregister_driver(&driver); | 145 | pci_unregister_driver(&driver); |
| 152 | } | 146 | } |
diff --git a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c index 6e99080497bf..725c80508d90 100644 --- a/drivers/ide/pci/opti621.c +++ b/drivers/ide/pci/opti621.c | |||
| @@ -81,8 +81,6 @@ | |||
| 81 | * 0.5 doesn't work. | 81 | * 0.5 doesn't work. |
| 82 | */ | 82 | */ |
| 83 | 83 | ||
| 84 | #define OPTI621_DEBUG /* define for debug messages */ | ||
| 85 | |||
| 86 | #include <linux/types.h> | 84 | #include <linux/types.h> |
| 87 | #include <linux/module.h> | 85 | #include <linux/module.h> |
| 88 | #include <linux/kernel.h> | 86 | #include <linux/kernel.h> |
| @@ -92,28 +90,6 @@ | |||
| 92 | 90 | ||
| 93 | #include <asm/io.h> | 91 | #include <asm/io.h> |
| 94 | 92 | ||
| 95 | //#define OPTI621_MAX_PIO 3 | ||
| 96 | /* In fact, I do not have any PIO 4 drive | ||
| 97 | * (address: 25 ns, data: 70 ns, recovery: 35 ns), | ||
| 98 | * but OPTi 82C621 is programmable and it can do (minimal values): | ||
| 99 | * on 40MHz PCI bus (pulse 25 ns): | ||
| 100 | * address: 25 ns, data: 25 ns, recovery: 50 ns; | ||
| 101 | * on 20MHz PCI bus (pulse 50 ns): | ||
| 102 | * address: 50 ns, data: 50 ns, recovery: 100 ns. | ||
| 103 | */ | ||
| 104 | |||
| 105 | /* #define READ_PREFETCH 0 */ | ||
| 106 | /* Uncomment for disable read prefetch. | ||
| 107 | * There is some readprefetch capatibility in hdparm, | ||
| 108 | * but when I type hdparm -P 1 /dev/hda, I got errors | ||
| 109 | * and till reset drive is inaccessible. | ||
| 110 | * This (hw) read prefetch is safe on my drive. | ||
| 111 | */ | ||
| 112 | |||
| 113 | #ifndef READ_PREFETCH | ||
| 114 | #define READ_PREFETCH 0x40 /* read prefetch is enabled */ | ||
| 115 | #endif /* else read prefetch is disabled */ | ||
| 116 | |||
| 117 | #define READ_REG 0 /* index of Read cycle timing register */ | 93 | #define READ_REG 0 /* index of Read cycle timing register */ |
| 118 | #define WRITE_REG 1 /* index of Write cycle timing register */ | 94 | #define WRITE_REG 1 /* index of Write cycle timing register */ |
| 119 | #define CNTRL_REG 3 /* index of Control register */ | 95 | #define CNTRL_REG 3 /* index of Control register */ |
| @@ -122,51 +98,8 @@ | |||
| 122 | 98 | ||
| 123 | static int reg_base; | 99 | static int reg_base; |
| 124 | 100 | ||
| 125 | #define PIO_NOT_EXIST 254 | ||
| 126 | #define PIO_DONT_KNOW 255 | ||
| 127 | |||
| 128 | static DEFINE_SPINLOCK(opti621_lock); | 101 | static DEFINE_SPINLOCK(opti621_lock); |
| 129 | 102 | ||
| 130 | /* there are stored pio numbers from other calls of opti621_set_pio_mode */ | ||
| 131 | static void compute_pios(ide_drive_t *drive, const u8 pio) | ||
| 132 | /* Store values into drive->drive_data | ||
| 133 | * second_contr - 0 for primary controller, 1 for secondary | ||
| 134 | * slave_drive - 0 -> pio is for master, 1 -> pio is for slave | ||
| 135 | * pio - PIO mode for selected drive (for other we don't know) | ||
| 136 | */ | ||
| 137 | { | ||
| 138 | int d; | ||
| 139 | ide_hwif_t *hwif = HWIF(drive); | ||
| 140 | |||
| 141 | drive->drive_data = pio; | ||
| 142 | |||
| 143 | for (d = 0; d < 2; ++d) { | ||
| 144 | drive = &hwif->drives[d]; | ||
| 145 | if (drive->present) { | ||
| 146 | if (drive->drive_data == PIO_DONT_KNOW) | ||
| 147 | drive->drive_data = ide_get_best_pio_mode(drive, 255, 3); | ||
| 148 | #ifdef OPTI621_DEBUG | ||
| 149 | printk("%s: Selected PIO mode %d\n", | ||
| 150 | drive->name, drive->drive_data); | ||
| 151 | #endif | ||
| 152 | } else { | ||
| 153 | drive->drive_data = PIO_NOT_EXIST; | ||
| 154 | } | ||
| 155 | } | ||
| 156 | } | ||
| 157 | |||
| 158 | static int cmpt_clk(int time, int bus_speed) | ||
| 159 | /* Returns (rounded up) time in clocks for time in ns, | ||
| 160 | * with bus_speed in MHz. | ||
| 161 | * Example: bus_speed = 40 MHz, time = 80 ns | ||
| 162 | * 1000/40 = 25 ns (clk value), | ||
| 163 | * 80/25 = 3.2, rounded up to 4 (I hope ;-)). | ||
| 164 | * Use idebus=xx to select right frequency. | ||
| 165 | */ | ||
| 166 | { | ||
| 167 | return ((time*bus_speed+999)/1000); | ||
| 168 | } | ||
| 169 | |||
| 170 | /* Write value to register reg, base of register | 103 | /* Write value to register reg, base of register |
| 171 | * is at reg_base (0x1f0 primary, 0x170 secondary, | 104 | * is at reg_base (0x1f0 primary, 0x170 secondary, |
| 172 | * if not changed by PCI configuration). | 105 | * if not changed by PCI configuration). |
| @@ -199,83 +132,29 @@ static u8 read_reg(int reg) | |||
| 199 | return ret; | 132 | return ret; |
| 200 | } | 133 | } |
| 201 | 134 | ||
| 202 | typedef struct pio_clocks_s { | ||
| 203 | int address_time; /* Address setup (clocks) */ | ||
| 204 | int data_time; /* Active/data pulse (clocks) */ | ||
| 205 | int recovery_time; /* Recovery time (clocks) */ | ||
| 206 | } pio_clocks_t; | ||
| 207 | |||
| 208 | static void compute_clocks(int pio, pio_clocks_t *clks) | ||
| 209 | { | ||
| 210 | if (pio != PIO_NOT_EXIST) { | ||
| 211 | int adr_setup, data_pls; | ||
| 212 | int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock(); | ||
| 213 | |||
| 214 | adr_setup = ide_pio_timings[pio].setup_time; | ||
| 215 | data_pls = ide_pio_timings[pio].active_time; | ||
| 216 | clks->address_time = cmpt_clk(adr_setup, bus_speed); | ||
| 217 | clks->data_time = cmpt_clk(data_pls, bus_speed); | ||
| 218 | clks->recovery_time = cmpt_clk(ide_pio_timings[pio].cycle_time | ||
| 219 | - adr_setup-data_pls, bus_speed); | ||
| 220 | if (clks->address_time < 1) | ||
| 221 | clks->address_time = 1; | ||
| 222 | if (clks->address_time > 4) | ||
| 223 | clks->address_time = 4; | ||
| 224 | if (clks->data_time < 1) | ||
| 225 | clks->data_time = 1; | ||
| 226 | if (clks->data_time > 16) | ||
| 227 | clks->data_time = 16; | ||
| 228 | if (clks->recovery_time < 2) | ||
| 229 | clks->recovery_time = 2; | ||
| 230 | if (clks->recovery_time > 17) | ||
| 231 | clks->recovery_time = 17; | ||
| 232 | } else { | ||
| 233 | clks->address_time = 1; | ||
| 234 | clks->data_time = 1; | ||
| 235 | clks->recovery_time = 2; | ||
| 236 | /* minimal values */ | ||
| 237 | } | ||
| 238 | } | ||
| 239 | |||
| 240 | static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) | 135 | static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) |
| 241 | { | 136 | { |
| 242 | /* primary and secondary drives share some registers, | 137 | ide_hwif_t *hwif = drive->hwif; |
| 243 | * so we have to program both drives | 138 | ide_drive_t *pair = ide_get_paired_drive(drive); |
| 244 | */ | ||
| 245 | unsigned long flags; | 139 | unsigned long flags; |
| 246 | u8 pio1 = 0, pio2 = 0; | 140 | u8 tim, misc, addr_pio = pio, clk; |
| 247 | pio_clocks_t first, second; | 141 | |
| 248 | int ax, drdy; | 142 | /* DRDY is default 2 (by OPTi Databook) */ |
| 249 | u8 cycle1, cycle2, misc; | 143 | static const u8 addr_timings[2][5] = { |
| 250 | ide_hwif_t *hwif = HWIF(drive); | 144 | { 0x20, 0x10, 0x00, 0x00, 0x00 }, /* 33 MHz */ |
| 251 | 145 | { 0x10, 0x10, 0x00, 0x00, 0x00 }, /* 25 MHz */ | |
| 252 | /* sets drive->drive_data for both drives */ | 146 | }; |
| 253 | compute_pios(drive, pio); | 147 | static const u8 data_rec_timings[2][5] = { |
| 254 | pio1 = hwif->drives[0].drive_data; | 148 | { 0x5b, 0x45, 0x32, 0x21, 0x20 }, /* 33 MHz */ |
| 255 | pio2 = hwif->drives[1].drive_data; | 149 | { 0x48, 0x34, 0x21, 0x10, 0x10 } /* 25 MHz */ |
| 256 | 150 | }; | |
| 257 | compute_clocks(pio1, &first); | 151 | |
| 258 | compute_clocks(pio2, &second); | 152 | drive->drive_data = XFER_PIO_0 + pio; |
| 259 | 153 | ||
| 260 | /* ax = max(a1,a2) */ | 154 | if (pair->present) { |
| 261 | ax = (first.address_time < second.address_time) ? second.address_time : first.address_time; | 155 | if (pair->drive_data && pair->drive_data < drive->drive_data) |
| 262 | 156 | addr_pio = pair->drive_data - XFER_PIO_0; | |
| 263 | drdy = 2; /* DRDY is default 2 (by OPTi Databook) */ | 157 | } |
| 264 | |||
| 265 | cycle1 = ((first.data_time-1)<<4) | (first.recovery_time-2); | ||
| 266 | cycle2 = ((second.data_time-1)<<4) | (second.recovery_time-2); | ||
| 267 | misc = READ_PREFETCH | ((ax-1)<<4) | ((drdy-2)<<1); | ||
| 268 | |||
| 269 | #ifdef OPTI621_DEBUG | ||
| 270 | printk("%s: master: address: %d, data: %d, " | ||
| 271 | "recovery: %d, drdy: %d [clk]\n", | ||
| 272 | hwif->name, ax, first.data_time, | ||
| 273 | first.recovery_time, drdy); | ||
| 274 | printk("%s: slave: address: %d, data: %d, " | ||
| 275 | "recovery: %d, drdy: %d [clk]\n", | ||
| 276 | hwif->name, ax, second.data_time, | ||
| 277 | second.recovery_time, drdy); | ||
| 278 | #endif | ||
| 279 | 158 | ||
| 280 | spin_lock_irqsave(&opti621_lock, flags); | 159 | spin_lock_irqsave(&opti621_lock, flags); |
| 281 | 160 | ||
| @@ -289,24 +168,21 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 289 | (void)inb(reg_base + CNTRL_REG); | 168 | (void)inb(reg_base + CNTRL_REG); |
| 290 | /* if reads 0xc0, no interface exist? */ | 169 | /* if reads 0xc0, no interface exist? */ |
| 291 | read_reg(CNTRL_REG); | 170 | read_reg(CNTRL_REG); |
| 292 | /* read version, probably 0 */ | ||
| 293 | read_reg(STRAP_REG); | ||
| 294 | 171 | ||
| 295 | /* program primary drive */ | 172 | /* check CLK speed */ |
| 296 | /* select Index-0 for Register-A */ | 173 | clk = read_reg(STRAP_REG) & 1; |
| 297 | write_reg(0, MISC_REG); | 174 | |
| 298 | /* set read cycle timings */ | 175 | printk(KERN_INFO "%s: CLK = %d MHz\n", hwif->name, clk ? 25 : 33); |
| 299 | write_reg(cycle1, READ_REG); | ||
| 300 | /* set write cycle timings */ | ||
| 301 | write_reg(cycle1, WRITE_REG); | ||
| 302 | 176 | ||
| 303 | /* program secondary drive */ | 177 | tim = data_rec_timings[clk][pio]; |
| 304 | /* select Index-1 for Register-B */ | 178 | misc = addr_timings[clk][addr_pio]; |
| 305 | write_reg(1, MISC_REG); | 179 | |
| 180 | /* select Index-0/1 for Register-A/B */ | ||
| 181 | write_reg(drive->select.b.unit, MISC_REG); | ||
| 306 | /* set read cycle timings */ | 182 | /* set read cycle timings */ |
| 307 | write_reg(cycle2, READ_REG); | 183 | write_reg(tim, READ_REG); |
| 308 | /* set write cycle timings */ | 184 | /* set write cycle timings */ |
| 309 | write_reg(cycle2, WRITE_REG); | 185 | write_reg(tim, WRITE_REG); |
| 310 | 186 | ||
| 311 | /* use Register-A for drive 0 */ | 187 | /* use Register-A for drive 0 */ |
| 312 | /* use Register-B for drive 1 */ | 188 | /* use Register-B for drive 1 */ |
| @@ -319,45 +195,26 @@ static void opti621_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 319 | spin_unlock_irqrestore(&opti621_lock, flags); | 195 | spin_unlock_irqrestore(&opti621_lock, flags); |
| 320 | } | 196 | } |
| 321 | 197 | ||
| 322 | static void __devinit opti621_port_init_devs(ide_hwif_t *hwif) | ||
| 323 | { | ||
| 324 | hwif->drives[0].drive_data = PIO_DONT_KNOW; | ||
| 325 | hwif->drives[1].drive_data = PIO_DONT_KNOW; | ||
| 326 | } | ||
| 327 | |||
| 328 | static const struct ide_port_ops opti621_port_ops = { | 198 | static const struct ide_port_ops opti621_port_ops = { |
| 329 | .port_init_devs = opti621_port_init_devs, | ||
| 330 | .set_pio_mode = opti621_set_pio_mode, | 199 | .set_pio_mode = opti621_set_pio_mode, |
| 331 | }; | 200 | }; |
| 332 | 201 | ||
| 333 | static const struct ide_port_info opti621_chipsets[] __devinitdata = { | 202 | static const struct ide_port_info opti621_chipset __devinitdata = { |
| 334 | { /* 0 */ | 203 | .name = "OPTI621/X", |
| 335 | .name = "OPTI621", | 204 | .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} }, |
| 336 | .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} }, | 205 | .port_ops = &opti621_port_ops, |
| 337 | .port_ops = &opti621_port_ops, | 206 | .host_flags = IDE_HFLAG_NO_DMA, |
| 338 | .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA, | 207 | .pio_mask = ATA_PIO4, |
| 339 | .pio_mask = ATA_PIO3, | ||
| 340 | .swdma_mask = ATA_SWDMA2, | ||
| 341 | .mwdma_mask = ATA_MWDMA2, | ||
| 342 | }, { /* 1 */ | ||
| 343 | .name = "OPTI621X", | ||
| 344 | .enablebits = { {0x45, 0x80, 0x00}, {0x40, 0x08, 0x00} }, | ||
| 345 | .port_ops = &opti621_port_ops, | ||
| 346 | .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA, | ||
| 347 | .pio_mask = ATA_PIO3, | ||
| 348 | .swdma_mask = ATA_SWDMA2, | ||
| 349 | .mwdma_mask = ATA_MWDMA2, | ||
| 350 | } | ||
| 351 | }; | 208 | }; |
| 352 | 209 | ||
| 353 | static int __devinit opti621_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 210 | static int __devinit opti621_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
| 354 | { | 211 | { |
| 355 | return ide_setup_pci_device(dev, &opti621_chipsets[id->driver_data]); | 212 | return ide_setup_pci_device(dev, &opti621_chipset); |
| 356 | } | 213 | } |
| 357 | 214 | ||
| 358 | static const struct pci_device_id opti621_pci_tbl[] = { | 215 | static const struct pci_device_id opti621_pci_tbl[] = { |
| 359 | { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C621), 0 }, | 216 | { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C621), 0 }, |
| 360 | { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C825), 1 }, | 217 | { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C825), 0 }, |
| 361 | { 0, }, | 218 | { 0, }, |
| 362 | }; | 219 | }; |
| 363 | MODULE_DEVICE_TABLE(pci, opti621_pci_tbl); | 220 | MODULE_DEVICE_TABLE(pci, opti621_pci_tbl); |
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index 4b0b85d8faf5..e127eb25ab63 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
| @@ -569,6 +569,11 @@ static int __devinit sis5513_init_one(struct pci_dev *dev, const struct pci_devi | |||
| 569 | { | 569 | { |
| 570 | struct ide_port_info d = sis5513_chipset; | 570 | struct ide_port_info d = sis5513_chipset; |
| 571 | u8 udma_rates[] = { 0x00, 0x00, 0x07, 0x1f, 0x3f, 0x3f, 0x7f, 0x7f }; | 571 | u8 udma_rates[] = { 0x00, 0x00, 0x07, 0x1f, 0x3f, 0x3f, 0x7f, 0x7f }; |
| 572 | int rc; | ||
| 573 | |||
| 574 | rc = pci_enable_device(dev); | ||
| 575 | if (rc) | ||
| 576 | return rc; | ||
| 572 | 577 | ||
| 573 | if (sis_find_family(dev) == 0) | 578 | if (sis_find_family(dev) == 0) |
| 574 | return -ENOTSUPP; | 579 | return -ENOTSUPP; |
diff --git a/drivers/ide/ppc/mpc8xx.c b/drivers/ide/ppc/mpc8xx.c index f0e638dcc3ab..236f9c38e519 100644 --- a/drivers/ide/ppc/mpc8xx.c +++ b/drivers/ide/ppc/mpc8xx.c | |||
| @@ -303,6 +303,8 @@ static int __init m8xx_ide_init_ports(hw_regs_t *hw, unsigned long data_port) | |||
| 303 | pcmp->pcmc_per = 0x100000 >> (16 * _slot_); | 303 | pcmp->pcmc_per = 0x100000 >> (16 * _slot_); |
| 304 | #endif /* CONFIG_IDE_8xx_PCCARD */ | 304 | #endif /* CONFIG_IDE_8xx_PCCARD */ |
| 305 | 305 | ||
| 306 | hw->chipset = ide_generic; | ||
| 307 | |||
| 306 | return 0; | 308 | return 0; |
| 307 | } | 309 | } |
| 308 | #endif /* CONFIG_IDE_8xx_PCCARD || CONFIG_IDE_8xx_DIRECT */ | 310 | #endif /* CONFIG_IDE_8xx_PCCARD || CONFIG_IDE_8xx_DIRECT */ |
| @@ -377,6 +379,8 @@ static int __init m8xx_ide_init_ports(hw_regs_t *hw, unsigned long data_port) | |||
| 377 | ((immap_t *) IMAP_ADDR)->im_siu_conf.sc_siel |= | 379 | ((immap_t *) IMAP_ADDR)->im_siu_conf.sc_siel |= |
| 378 | (0x80000000 >> ioport_dsc[data_port].irq); | 380 | (0x80000000 >> ioport_dsc[data_port].irq); |
| 379 | 381 | ||
| 382 | hw->chipset = ide_generic; | ||
| 383 | |||
| 380 | return 0; | 384 | return 0; |
| 381 | } | 385 | } |
| 382 | #endif /* CONFIG_IDE_8xx_DIRECT */ | 386 | #endif /* CONFIG_IDE_8xx_DIRECT */ |
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index 48aa019127bc..ba2d58727964 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
| @@ -59,7 +59,6 @@ typedef struct pmac_ide_hwif { | |||
| 59 | int irq; | 59 | int irq; |
| 60 | int kind; | 60 | int kind; |
| 61 | int aapl_bus_id; | 61 | int aapl_bus_id; |
| 62 | unsigned cable_80 : 1; | ||
| 63 | unsigned mediabay : 1; | 62 | unsigned mediabay : 1; |
| 64 | unsigned broken_dma : 1; | 63 | unsigned broken_dma : 1; |
| 65 | unsigned broken_dma_warn : 1; | 64 | unsigned broken_dma_warn : 1; |
| @@ -918,10 +917,40 @@ pmac_ide_do_resume(ide_hwif_t *hwif) | |||
| 918 | return 0; | 917 | return 0; |
| 919 | } | 918 | } |
| 920 | 919 | ||
| 920 | static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) | ||
| 921 | { | ||
| 922 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)ide_get_hwifdata(hwif); | ||
| 923 | struct device_node *np = pmif->node; | ||
| 924 | const char *cable = of_get_property(np, "cable-type", NULL); | ||
| 925 | |||
| 926 | /* Get cable type from device-tree. */ | ||
| 927 | if (cable && !strncmp(cable, "80-", 3)) | ||
| 928 | return ATA_CBL_PATA80; | ||
| 929 | |||
| 930 | /* | ||
| 931 | * G5's seem to have incorrect cable type in device-tree. | ||
| 932 | * Let's assume they have a 80 conductor cable, this seem | ||
| 933 | * to be always the case unless the user mucked around. | ||
| 934 | */ | ||
| 935 | if (of_device_is_compatible(np, "K2-UATA") || | ||
| 936 | of_device_is_compatible(np, "shasta-ata")) | ||
| 937 | return ATA_CBL_PATA80; | ||
| 938 | |||
| 939 | return ATA_CBL_PATA40; | ||
| 940 | } | ||
| 941 | |||
| 921 | static const struct ide_port_ops pmac_ide_ata6_port_ops = { | 942 | static const struct ide_port_ops pmac_ide_ata6_port_ops = { |
| 922 | .set_pio_mode = pmac_ide_set_pio_mode, | 943 | .set_pio_mode = pmac_ide_set_pio_mode, |
| 923 | .set_dma_mode = pmac_ide_set_dma_mode, | 944 | .set_dma_mode = pmac_ide_set_dma_mode, |
| 924 | .selectproc = pmac_ide_kauai_selectproc, | 945 | .selectproc = pmac_ide_kauai_selectproc, |
| 946 | .cable_detect = pmac_ide_cable_detect, | ||
| 947 | }; | ||
| 948 | |||
| 949 | static const struct ide_port_ops pmac_ide_ata4_port_ops = { | ||
| 950 | .set_pio_mode = pmac_ide_set_pio_mode, | ||
| 951 | .set_dma_mode = pmac_ide_set_dma_mode, | ||
| 952 | .selectproc = pmac_ide_selectproc, | ||
| 953 | .cable_detect = pmac_ide_cable_detect, | ||
| 925 | }; | 954 | }; |
| 926 | 955 | ||
| 927 | static const struct ide_port_ops pmac_ide_port_ops = { | 956 | static const struct ide_port_ops pmac_ide_port_ops = { |
| @@ -949,10 +978,7 @@ static const struct ide_port_info pmac_port_info = { | |||
| 949 | 978 | ||
| 950 | /* | 979 | /* |
| 951 | * Setup, register & probe an IDE channel driven by this driver, this is | 980 | * Setup, register & probe an IDE channel driven by this driver, this is |
| 952 | * called by one of the 2 probe functions (macio or PCI). Note that a channel | 981 | * called by one of the 2 probe functions (macio or PCI). |
| 953 | * that ends up beeing free of any device is not kept around by this driver | ||
| 954 | * (it is kept in 2.4). This introduce an interface numbering change on some | ||
| 955 | * rare machines unfortunately, but it's better this way. | ||
| 956 | */ | 982 | */ |
| 957 | static int __devinit | 983 | static int __devinit |
| 958 | pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | 984 | pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) |
| @@ -962,7 +988,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
| 962 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 988 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
| 963 | struct ide_port_info d = pmac_port_info; | 989 | struct ide_port_info d = pmac_port_info; |
| 964 | 990 | ||
| 965 | pmif->cable_80 = 0; | ||
| 966 | pmif->broken_dma = pmif->broken_dma_warn = 0; | 991 | pmif->broken_dma = pmif->broken_dma_warn = 0; |
| 967 | if (of_device_is_compatible(np, "shasta-ata")) { | 992 | if (of_device_is_compatible(np, "shasta-ata")) { |
| 968 | pmif->kind = controller_sh_ata6; | 993 | pmif->kind = controller_sh_ata6; |
| @@ -979,6 +1004,7 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
| 979 | } else if (of_device_is_compatible(np, "keylargo-ata")) { | 1004 | } else if (of_device_is_compatible(np, "keylargo-ata")) { |
| 980 | if (strcmp(np->name, "ata-4") == 0) { | 1005 | if (strcmp(np->name, "ata-4") == 0) { |
| 981 | pmif->kind = controller_kl_ata4; | 1006 | pmif->kind = controller_kl_ata4; |
| 1007 | d.port_ops = &pmac_ide_ata4_port_ops; | ||
| 982 | d.udma_mask = ATA_UDMA4; | 1008 | d.udma_mask = ATA_UDMA4; |
| 983 | } else | 1009 | } else |
| 984 | pmif->kind = controller_kl_ata3; | 1010 | pmif->kind = controller_kl_ata3; |
| @@ -992,22 +1018,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
| 992 | bidp = of_get_property(np, "AAPL,bus-id", NULL); | 1018 | bidp = of_get_property(np, "AAPL,bus-id", NULL); |
| 993 | pmif->aapl_bus_id = bidp ? *bidp : 0; | 1019 | pmif->aapl_bus_id = bidp ? *bidp : 0; |
| 994 | 1020 | ||
| 995 | /* Get cable type from device-tree */ | ||
| 996 | if (pmif->kind == controller_kl_ata4 || pmif->kind == controller_un_ata6 | ||
| 997 | || pmif->kind == controller_k2_ata6 | ||
| 998 | || pmif->kind == controller_sh_ata6) { | ||
| 999 | const char* cable = of_get_property(np, "cable-type", NULL); | ||
| 1000 | if (cable && !strncmp(cable, "80-", 3)) | ||
| 1001 | pmif->cable_80 = 1; | ||
| 1002 | } | ||
| 1003 | /* G5's seem to have incorrect cable type in device-tree. Let's assume | ||
| 1004 | * they have a 80 conductor cable, this seem to be always the case unless | ||
| 1005 | * the user mucked around | ||
| 1006 | */ | ||
| 1007 | if (of_device_is_compatible(np, "K2-UATA") || | ||
| 1008 | of_device_is_compatible(np, "shasta-ata")) | ||
| 1009 | pmif->cable_80 = 1; | ||
| 1010 | |||
| 1011 | /* On Kauai-type controllers, we make sure the FCR is correct */ | 1021 | /* On Kauai-type controllers, we make sure the FCR is correct */ |
| 1012 | if (pmif->kauai_fcr) | 1022 | if (pmif->kauai_fcr) |
| 1013 | writel(KAUAI_FCR_UATA_MAGIC | | 1023 | writel(KAUAI_FCR_UATA_MAGIC | |
| @@ -1053,7 +1063,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
| 1053 | 1063 | ||
| 1054 | hwif->hwif_data = pmif; | 1064 | hwif->hwif_data = pmif; |
| 1055 | ide_init_port_hw(hwif, hw); | 1065 | ide_init_port_hw(hwif, hw); |
| 1056 | hwif->cbl = pmif->cable_80 ? ATA_CBL_PATA80 : ATA_CBL_PATA40; | ||
| 1057 | 1066 | ||
| 1058 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", | 1067 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", |
| 1059 | hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, | 1068 | hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, |
| @@ -1070,11 +1079,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
| 1070 | } | 1079 | } |
| 1071 | } | 1080 | } |
| 1072 | 1081 | ||
| 1073 | #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC | ||
| 1074 | if (pmif->cable_80 == 0) | ||
| 1075 | d.udma_mask &= ATA_UDMA2; | ||
| 1076 | #endif | ||
| 1077 | |||
| 1078 | idx[0] = hwif->index; | 1082 | idx[0] = hwif->index; |
| 1079 | 1083 | ||
| 1080 | ide_device_add(idx, &d); | 1084 | ide_device_add(idx, &d); |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 3ad8bd9f7543..432699d61c58 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
| @@ -15,7 +15,6 @@ if INPUT_MISC | |||
| 15 | config INPUT_PCSPKR | 15 | config INPUT_PCSPKR |
| 16 | tristate "PC Speaker support" | 16 | tristate "PC Speaker support" |
| 17 | depends on PCSPKR_PLATFORM | 17 | depends on PCSPKR_PLATFORM |
| 18 | depends on SND_PCSP=n | ||
| 19 | help | 18 | help |
| 20 | Say Y here if you want the standard PC Speaker to be used for | 19 | Say Y here if you want the standard PC Speaker to be used for |
| 21 | bells and whistles. | 20 | bells and whistles. |
diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c index 8dd3942f3022..ce6fdec19e14 100644 --- a/drivers/input/mouse/appletouch.c +++ b/drivers/input/mouse/appletouch.c | |||
| @@ -589,6 +589,21 @@ static void atp_close(struct input_dev *input) | |||
| 589 | dev->open = 0; | 589 | dev->open = 0; |
| 590 | } | 590 | } |
| 591 | 591 | ||
| 592 | static int atp_handle_geyser(struct atp *dev) | ||
| 593 | { | ||
| 594 | struct usb_device *udev = dev->udev; | ||
| 595 | |||
| 596 | if (!atp_is_fountain(dev)) { | ||
| 597 | /* switch to raw sensor mode */ | ||
| 598 | if (atp_geyser_init(udev)) | ||
| 599 | return -EIO; | ||
| 600 | |||
| 601 | printk(KERN_INFO "appletouch: Geyser mode initialized.\n"); | ||
| 602 | } | ||
| 603 | |||
| 604 | return 0; | ||
| 605 | } | ||
| 606 | |||
| 592 | static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) | 607 | static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) |
| 593 | { | 608 | { |
| 594 | struct atp *dev; | 609 | struct atp *dev; |
| @@ -633,14 +648,6 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
| 633 | else | 648 | else |
| 634 | dev->datalen = 81; | 649 | dev->datalen = 81; |
| 635 | 650 | ||
| 636 | if (!atp_is_fountain(dev)) { | ||
| 637 | /* switch to raw sensor mode */ | ||
| 638 | if (atp_geyser_init(udev)) | ||
| 639 | goto err_free_devs; | ||
| 640 | |||
| 641 | printk(KERN_INFO "appletouch: Geyser mode initialized.\n"); | ||
| 642 | } | ||
| 643 | |||
| 644 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); | 651 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); |
| 645 | if (!dev->urb) | 652 | if (!dev->urb) |
| 646 | goto err_free_devs; | 653 | goto err_free_devs; |
| @@ -654,6 +661,10 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
| 654 | usb_rcvintpipe(udev, int_in_endpointAddr), | 661 | usb_rcvintpipe(udev, int_in_endpointAddr), |
| 655 | dev->data, dev->datalen, atp_complete, dev, 1); | 662 | dev->data, dev->datalen, atp_complete, dev, 1); |
| 656 | 663 | ||
| 664 | error = atp_handle_geyser(dev); | ||
| 665 | if (error) | ||
| 666 | goto err_free_buffer; | ||
| 667 | |||
| 657 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); | 668 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); |
| 658 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); | 669 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); |
| 659 | 670 | ||
| @@ -744,6 +755,20 @@ static void atp_disconnect(struct usb_interface *iface) | |||
| 744 | printk(KERN_INFO "input: appletouch disconnected\n"); | 755 | printk(KERN_INFO "input: appletouch disconnected\n"); |
| 745 | } | 756 | } |
| 746 | 757 | ||
| 758 | static int atp_recover(struct atp *dev) | ||
| 759 | { | ||
| 760 | int error; | ||
| 761 | |||
| 762 | error = atp_handle_geyser(dev); | ||
| 763 | if (error) | ||
| 764 | return error; | ||
| 765 | |||
| 766 | if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC)) | ||
| 767 | return -EIO; | ||
| 768 | |||
| 769 | return 0; | ||
| 770 | } | ||
| 771 | |||
| 747 | static int atp_suspend(struct usb_interface *iface, pm_message_t message) | 772 | static int atp_suspend(struct usb_interface *iface, pm_message_t message) |
| 748 | { | 773 | { |
| 749 | struct atp *dev = usb_get_intfdata(iface); | 774 | struct atp *dev = usb_get_intfdata(iface); |
| @@ -764,12 +789,20 @@ static int atp_resume(struct usb_interface *iface) | |||
| 764 | return 0; | 789 | return 0; |
| 765 | } | 790 | } |
| 766 | 791 | ||
| 792 | static int atp_reset_resume(struct usb_interface *iface) | ||
| 793 | { | ||
| 794 | struct atp *dev = usb_get_intfdata(iface); | ||
| 795 | |||
| 796 | return atp_recover(dev); | ||
| 797 | } | ||
| 798 | |||
| 767 | static struct usb_driver atp_driver = { | 799 | static struct usb_driver atp_driver = { |
| 768 | .name = "appletouch", | 800 | .name = "appletouch", |
| 769 | .probe = atp_probe, | 801 | .probe = atp_probe, |
| 770 | .disconnect = atp_disconnect, | 802 | .disconnect = atp_disconnect, |
| 771 | .suspend = atp_suspend, | 803 | .suspend = atp_suspend, |
| 772 | .resume = atp_resume, | 804 | .resume = atp_resume, |
| 805 | .reset_resume = atp_reset_resume, | ||
| 773 | .id_table = atp_table, | 806 | .id_table = atp_table, |
| 774 | }; | 807 | }; |
| 775 | 808 | ||
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 9aafa96cb746..78eb7841174c 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -193,6 +193,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
| 193 | }, | 193 | }, |
| 194 | }, | 194 | }, |
| 195 | { | 195 | { |
| 196 | .ident = "Fujitsu-Siemens Amilo Pro 2030", | ||
| 197 | .matches = { | ||
| 198 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 199 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), | ||
| 200 | }, | ||
| 201 | }, | ||
| 202 | { | ||
| 196 | /* | 203 | /* |
| 197 | * No data is coming from the touchscreen unless KBC | 204 | * No data is coming from the touchscreen unless KBC |
| 198 | * is in legacy mode. | 205 | * is in legacy mode. |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 592ff55b62d0..170f71ee5772 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
| @@ -952,8 +952,12 @@ static int i8042_resume(struct platform_device *dev) | |||
| 952 | i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS; | 952 | i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS; |
| 953 | i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT); | 953 | i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT); |
| 954 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { | 954 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { |
| 955 | printk(KERN_ERR "i8042: Can't write CTR to resume\n"); | 955 | printk(KERN_WARNING "i8042: Can't write CTR to resume, retrying...\n"); |
| 956 | return -EIO; | 956 | msleep(50); |
| 957 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { | ||
| 958 | printk(KERN_ERR "i8042: CTR write retry failed\n"); | ||
| 959 | return -EIO; | ||
| 960 | } | ||
| 957 | } | 961 | } |
| 958 | 962 | ||
| 959 | 963 | ||
diff --git a/drivers/isdn/hardware/eicon/divasmain.c b/drivers/isdn/hardware/eicon/divasmain.c index 5fcbdccd7a53..16a874bb1561 100644 --- a/drivers/isdn/hardware/eicon/divasmain.c +++ b/drivers/isdn/hardware/eicon/divasmain.c | |||
| @@ -806,7 +806,6 @@ static int DIVA_INIT_FUNCTION divas_init(void) | |||
| 806 | 806 | ||
| 807 | if (!create_divas_proc()) { | 807 | if (!create_divas_proc()) { |
| 808 | #ifdef MODULE | 808 | #ifdef MODULE |
| 809 | remove_divas_proc(); | ||
| 810 | divas_unregister_chrdev(); | 809 | divas_unregister_chrdev(); |
| 811 | divasfunc_exit(); | 810 | divasfunc_exit(); |
| 812 | #endif | 811 | #endif |
diff --git a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c index fae895828a17..040827288ec9 100644 --- a/drivers/isdn/hardware/eicon/divasproc.c +++ b/drivers/isdn/hardware/eicon/divasproc.c | |||
| @@ -125,8 +125,8 @@ static const struct file_operations divas_fops = { | |||
| 125 | 125 | ||
| 126 | int create_divas_proc(void) | 126 | int create_divas_proc(void) |
| 127 | { | 127 | { |
| 128 | proc_create(divas_proc_name, S_IFREG | S_IRUGO, proc_net_eicon, | 128 | divas_proc_entry = proc_create(divas_proc_name, S_IFREG | S_IRUGO, |
| 129 | &divas_fops); | 129 | proc_net_eicon, &divas_fops); |
| 130 | if (!divas_proc_entry) | 130 | if (!divas_proc_entry) |
| 131 | return (0); | 131 | return (0); |
| 132 | 132 | ||
diff --git a/drivers/isdn/hysdn/hysdn_procconf.c b/drivers/isdn/hysdn/hysdn_procconf.c index 15906d005b05..484299b031f8 100644 --- a/drivers/isdn/hysdn/hysdn_procconf.c +++ b/drivers/isdn/hysdn/hysdn_procconf.c | |||
| @@ -207,30 +207,17 @@ hysdn_conf_write(struct file *file, const char __user *buf, size_t count, loff_t | |||
| 207 | /* read conf file -> output card info data */ | 207 | /* read conf file -> output card info data */ |
| 208 | /*******************************************/ | 208 | /*******************************************/ |
| 209 | static ssize_t | 209 | static ssize_t |
| 210 | hysdn_conf_read(struct file *file, char __user *buf, size_t count, loff_t * off) | 210 | hysdn_conf_read(struct file *file, char __user *buf, size_t count, loff_t *off) |
| 211 | { | 211 | { |
| 212 | char *cp; | 212 | char *cp; |
| 213 | int i; | ||
| 214 | 213 | ||
| 215 | if (file->f_mode & FMODE_READ) { | 214 | if (!(file->f_mode & FMODE_READ)) |
| 216 | if (!(cp = file->private_data)) | 215 | return -EPERM; /* no permission to read */ |
| 217 | return (-EFAULT); /* should never happen */ | 216 | |
| 218 | i = strlen(cp); /* get total string length */ | 217 | if (!(cp = file->private_data)) |
| 219 | if (*off < i) { | 218 | return -EFAULT; /* should never happen */ |
| 220 | /* still bytes to transfer */ | 219 | |
| 221 | cp += *off; /* point to desired data offset */ | 220 | return simple_read_from_buffer(buf, count, off, cp, strlen(cp)); |
| 222 | i -= *off; /* remaining length */ | ||
| 223 | if (i > count) | ||
| 224 | i = count; /* limit length to transfer */ | ||
| 225 | if (copy_to_user(buf, cp, i)) | ||
| 226 | return (-EFAULT); /* copy error */ | ||
| 227 | *off += i; /* adjust offset */ | ||
| 228 | } else | ||
| 229 | return (0); | ||
| 230 | } else | ||
| 231 | return (-EPERM); /* no permission to read */ | ||
| 232 | |||
| 233 | return (i); | ||
| 234 | } /* hysdn_conf_read */ | 221 | } /* hysdn_conf_read */ |
| 235 | 222 | ||
| 236 | /******************/ | 223 | /******************/ |
diff --git a/drivers/isdn/sc/ioctl.c b/drivers/isdn/sc/ioctl.c index 7817d2244921..1081091bbfaf 100644 --- a/drivers/isdn/sc/ioctl.c +++ b/drivers/isdn/sc/ioctl.c | |||
| @@ -226,6 +226,7 @@ int sc_ioctl(int card, scs_ioctl *data) | |||
| 226 | */ | 226 | */ |
| 227 | if (copy_from_user(spid, data->dataptr, SCIOC_SPIDSIZE)) { | 227 | if (copy_from_user(spid, data->dataptr, SCIOC_SPIDSIZE)) { |
| 228 | kfree(rcvmsg); | 228 | kfree(rcvmsg); |
| 229 | kfree(spid); | ||
| 229 | return -EFAULT; | 230 | return -EFAULT; |
| 230 | } | 231 | } |
| 231 | 232 | ||
diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index 82add26cc665..818aba368541 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c | |||
| @@ -84,7 +84,7 @@ struct media_bay_info { | |||
| 84 | int cd_irq; | 84 | int cd_irq; |
| 85 | int cd_retry; | 85 | int cd_retry; |
| 86 | #endif | 86 | #endif |
| 87 | #if defined(CONFIG_BLK_DEV_IDE_PMAC) || defined(CONFIG_MAC_FLOPPY) | 87 | #if defined(CONFIG_BLK_DEV_IDE_PMAC) |
| 88 | int cd_index; | 88 | int cd_index; |
| 89 | #endif | 89 | #endif |
| 90 | }; | 90 | }; |
| @@ -417,6 +417,7 @@ static void poll_media_bay(struct media_bay_info* bay) | |||
| 417 | } | 417 | } |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 420 | int check_media_bay(struct device_node *which_bay, int what) | 421 | int check_media_bay(struct device_node *which_bay, int what) |
| 421 | { | 422 | { |
| 422 | int i; | 423 | int i; |
| @@ -432,7 +433,6 @@ int check_media_bay(struct device_node *which_bay, int what) | |||
| 432 | } | 433 | } |
| 433 | EXPORT_SYMBOL(check_media_bay); | 434 | EXPORT_SYMBOL(check_media_bay); |
| 434 | 435 | ||
| 435 | #ifdef CONFIG_BLK_DEV_IDE_PMAC | ||
| 436 | int check_media_bay_by_base(unsigned long base, int what) | 436 | int check_media_bay_by_base(unsigned long base, int what) |
| 437 | { | 437 | { |
| 438 | int i; | 438 | int i; |
| @@ -556,7 +556,8 @@ static void media_bay_step(int i) | |||
| 556 | printk("mediabay %d, registering IDE...\n", i); | 556 | printk("mediabay %d, registering IDE...\n", i); |
| 557 | pmu_suspend(); | 557 | pmu_suspend(); |
| 558 | ide_port_scan(bay->cd_port); | 558 | ide_port_scan(bay->cd_port); |
| 559 | bay->cd_index = bay->cd_port->index; | 559 | if (bay->cd_port->present) |
| 560 | bay->cd_index = bay->cd_port->index; | ||
| 560 | pmu_resume(); | 561 | pmu_resume(); |
| 561 | } | 562 | } |
| 562 | if (bay->cd_index == -1) { | 563 | if (bay->cd_index == -1) { |
diff --git a/drivers/macintosh/smu.c b/drivers/macintosh/smu.c index 77ad192962c5..d86d57af282a 100644 --- a/drivers/macintosh/smu.c +++ b/drivers/macintosh/smu.c | |||
| @@ -483,12 +483,15 @@ int __init smu_init (void) | |||
| 483 | 483 | ||
| 484 | if (smu_cmdbuf_abs == 0) { | 484 | if (smu_cmdbuf_abs == 0) { |
| 485 | printk(KERN_ERR "SMU: Command buffer not allocated !\n"); | 485 | printk(KERN_ERR "SMU: Command buffer not allocated !\n"); |
| 486 | of_node_put(np); | ||
| 486 | return -EINVAL; | 487 | return -EINVAL; |
| 487 | } | 488 | } |
| 488 | 489 | ||
| 489 | smu = alloc_bootmem(sizeof(struct smu_device)); | 490 | smu = alloc_bootmem(sizeof(struct smu_device)); |
| 490 | if (smu == NULL) | 491 | if (smu == NULL) { |
| 492 | of_node_put(np); | ||
| 491 | return -ENOMEM; | 493 | return -ENOMEM; |
| 494 | } | ||
| 492 | memset(smu, 0, sizeof(*smu)); | 495 | memset(smu, 0, sizeof(*smu)); |
| 493 | 496 | ||
| 494 | spin_lock_init(&smu->lock); | 497 | spin_lock_init(&smu->lock); |
diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c index 54f4942a2968..5366dc93fb38 100644 --- a/drivers/macintosh/therm_adt746x.c +++ b/drivers/macintosh/therm_adt746x.c | |||
| @@ -562,18 +562,24 @@ thermostat_init(void) | |||
| 562 | therm_type = ADT7460; | 562 | therm_type = ADT7460; |
| 563 | else if (of_device_is_compatible(np, "adt7467")) | 563 | else if (of_device_is_compatible(np, "adt7467")) |
| 564 | therm_type = ADT7467; | 564 | therm_type = ADT7467; |
| 565 | else | 565 | else { |
| 566 | of_node_put(np); | ||
| 566 | return -ENODEV; | 567 | return -ENODEV; |
| 568 | } | ||
| 567 | 569 | ||
| 568 | prop = of_get_property(np, "hwsensor-params-version", NULL); | 570 | prop = of_get_property(np, "hwsensor-params-version", NULL); |
| 569 | printk(KERN_INFO "adt746x: version %d (%ssupported)\n", *prop, | 571 | printk(KERN_INFO "adt746x: version %d (%ssupported)\n", *prop, |
| 570 | (*prop == 1)?"":"un"); | 572 | (*prop == 1)?"":"un"); |
| 571 | if (*prop != 1) | 573 | if (*prop != 1) { |
| 574 | of_node_put(np); | ||
| 572 | return -ENODEV; | 575 | return -ENODEV; |
| 576 | } | ||
| 573 | 577 | ||
| 574 | prop = of_get_property(np, "reg", NULL); | 578 | prop = of_get_property(np, "reg", NULL); |
| 575 | if (!prop) | 579 | if (!prop) { |
| 580 | of_node_put(np); | ||
| 576 | return -ENODEV; | 581 | return -ENODEV; |
| 582 | } | ||
| 577 | 583 | ||
| 578 | /* look for bus either by path or using "reg" */ | 584 | /* look for bus either by path or using "reg" */ |
| 579 | if (strstr(np->full_name, "/i2c-bus@") != NULL) { | 585 | if (strstr(np->full_name, "/i2c-bus@") != NULL) { |
| @@ -610,6 +616,7 @@ thermostat_init(void) | |||
| 610 | 616 | ||
| 611 | if (of_dev == NULL) { | 617 | if (of_dev == NULL) { |
| 612 | printk(KERN_ERR "Can't register temperatures device !\n"); | 618 | printk(KERN_ERR "Can't register temperatures device !\n"); |
| 619 | of_node_put(np); | ||
| 613 | return -ENODEV; | 620 | return -ENODEV; |
| 614 | } | 621 | } |
| 615 | 622 | ||
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index a0ce0b2fa03e..b5969298f3d3 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
| @@ -1293,7 +1293,7 @@ static void tpacpi_input_send_radiosw(void) | |||
| 1293 | mutex_lock(&tpacpi_inputdev_send_mutex); | 1293 | mutex_lock(&tpacpi_inputdev_send_mutex); |
| 1294 | 1294 | ||
| 1295 | input_report_switch(tpacpi_inputdev, | 1295 | input_report_switch(tpacpi_inputdev, |
| 1296 | SW_RADIO, !!wlsw); | 1296 | SW_RFKILL_ALL, !!wlsw); |
| 1297 | input_sync(tpacpi_inputdev); | 1297 | input_sync(tpacpi_inputdev); |
| 1298 | 1298 | ||
| 1299 | mutex_unlock(&tpacpi_inputdev_send_mutex); | 1299 | mutex_unlock(&tpacpi_inputdev_send_mutex); |
| @@ -1921,6 +1921,29 @@ static struct attribute *hotkey_mask_attributes[] __initdata = { | |||
| 1921 | &dev_attr_hotkey_wakeup_hotunplug_complete.attr, | 1921 | &dev_attr_hotkey_wakeup_hotunplug_complete.attr, |
| 1922 | }; | 1922 | }; |
| 1923 | 1923 | ||
| 1924 | static void hotkey_exit(void) | ||
| 1925 | { | ||
| 1926 | #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL | ||
| 1927 | hotkey_poll_stop_sync(); | ||
| 1928 | #endif | ||
| 1929 | |||
| 1930 | if (hotkey_dev_attributes) | ||
| 1931 | delete_attr_set(hotkey_dev_attributes, &tpacpi_pdev->dev.kobj); | ||
| 1932 | |||
| 1933 | kfree(hotkey_keycode_map); | ||
| 1934 | |||
| 1935 | if (tp_features.hotkey) { | ||
| 1936 | dbg_printk(TPACPI_DBG_EXIT, | ||
| 1937 | "restoring original hot key mask\n"); | ||
| 1938 | /* no short-circuit boolean operator below! */ | ||
| 1939 | if ((hotkey_mask_set(hotkey_orig_mask) | | ||
| 1940 | hotkey_status_set(hotkey_orig_status)) != 0) | ||
| 1941 | printk(TPACPI_ERR | ||
| 1942 | "failed to restore hot key mask " | ||
| 1943 | "to BIOS defaults\n"); | ||
| 1944 | } | ||
| 1945 | } | ||
| 1946 | |||
| 1924 | static int __init hotkey_init(struct ibm_init_struct *iibm) | 1947 | static int __init hotkey_init(struct ibm_init_struct *iibm) |
| 1925 | { | 1948 | { |
| 1926 | /* Requirements for changing the default keymaps: | 1949 | /* Requirements for changing the default keymaps: |
| @@ -2060,226 +2083,220 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
| 2060 | vdbg_printk(TPACPI_DBG_INIT, "hotkeys are %s\n", | 2083 | vdbg_printk(TPACPI_DBG_INIT, "hotkeys are %s\n", |
| 2061 | str_supported(tp_features.hotkey)); | 2084 | str_supported(tp_features.hotkey)); |
| 2062 | 2085 | ||
| 2063 | if (tp_features.hotkey) { | 2086 | if (!tp_features.hotkey) |
| 2064 | hotkey_dev_attributes = create_attr_set(13, NULL); | 2087 | return 1; |
| 2065 | if (!hotkey_dev_attributes) | ||
| 2066 | return -ENOMEM; | ||
| 2067 | res = add_many_to_attr_set(hotkey_dev_attributes, | ||
| 2068 | hotkey_attributes, | ||
| 2069 | ARRAY_SIZE(hotkey_attributes)); | ||
| 2070 | if (res) | ||
| 2071 | return res; | ||
| 2072 | 2088 | ||
| 2073 | /* mask not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, | 2089 | hotkey_dev_attributes = create_attr_set(13, NULL); |
| 2074 | A30, R30, R31, T20-22, X20-21, X22-24. Detected by checking | 2090 | if (!hotkey_dev_attributes) |
| 2075 | for HKEY interface version 0x100 */ | 2091 | return -ENOMEM; |
| 2076 | if (acpi_evalf(hkey_handle, &hkeyv, "MHKV", "qd")) { | 2092 | res = add_many_to_attr_set(hotkey_dev_attributes, |
| 2077 | if ((hkeyv >> 8) != 1) { | 2093 | hotkey_attributes, |
| 2078 | printk(TPACPI_ERR "unknown version of the " | 2094 | ARRAY_SIZE(hotkey_attributes)); |
| 2079 | "HKEY interface: 0x%x\n", hkeyv); | 2095 | if (res) |
| 2080 | printk(TPACPI_ERR "please report this to %s\n", | 2096 | goto err_exit; |
| 2081 | TPACPI_MAIL); | 2097 | |
| 2082 | } else { | 2098 | /* mask not supported on 570, 600e/x, 770e, 770x, A21e, A2xm/p, |
| 2083 | /* | 2099 | A30, R30, R31, T20-22, X20-21, X22-24. Detected by checking |
| 2084 | * MHKV 0x100 in A31, R40, R40e, | 2100 | for HKEY interface version 0x100 */ |
| 2085 | * T4x, X31, and later | 2101 | if (acpi_evalf(hkey_handle, &hkeyv, "MHKV", "qd")) { |
| 2086 | */ | 2102 | if ((hkeyv >> 8) != 1) { |
| 2087 | tp_features.hotkey_mask = 1; | 2103 | printk(TPACPI_ERR "unknown version of the " |
| 2088 | } | 2104 | "HKEY interface: 0x%x\n", hkeyv); |
| 2105 | printk(TPACPI_ERR "please report this to %s\n", | ||
| 2106 | TPACPI_MAIL); | ||
| 2107 | } else { | ||
| 2108 | /* | ||
| 2109 | * MHKV 0x100 in A31, R40, R40e, | ||
| 2110 | * T4x, X31, and later | ||
| 2111 | */ | ||
| 2112 | tp_features.hotkey_mask = 1; | ||
| 2089 | } | 2113 | } |
| 2114 | } | ||
| 2090 | 2115 | ||
| 2091 | vdbg_printk(TPACPI_DBG_INIT, "hotkey masks are %s\n", | 2116 | vdbg_printk(TPACPI_DBG_INIT, "hotkey masks are %s\n", |
| 2092 | str_supported(tp_features.hotkey_mask)); | 2117 | str_supported(tp_features.hotkey_mask)); |
| 2093 | 2118 | ||
| 2094 | if (tp_features.hotkey_mask) { | 2119 | if (tp_features.hotkey_mask) { |
| 2095 | if (!acpi_evalf(hkey_handle, &hotkey_all_mask, | 2120 | if (!acpi_evalf(hkey_handle, &hotkey_all_mask, |
| 2096 | "MHKA", "qd")) { | 2121 | "MHKA", "qd")) { |
| 2097 | printk(TPACPI_ERR | 2122 | printk(TPACPI_ERR |
| 2098 | "missing MHKA handler, " | 2123 | "missing MHKA handler, " |
| 2099 | "please report this to %s\n", | 2124 | "please report this to %s\n", |
| 2100 | TPACPI_MAIL); | 2125 | TPACPI_MAIL); |
| 2101 | /* FN+F12, FN+F4, FN+F3 */ | 2126 | /* FN+F12, FN+F4, FN+F3 */ |
| 2102 | hotkey_all_mask = 0x080cU; | 2127 | hotkey_all_mask = 0x080cU; |
| 2103 | } | ||
| 2104 | } | 2128 | } |
| 2129 | } | ||
| 2105 | 2130 | ||
| 2106 | /* hotkey_source_mask *must* be zero for | 2131 | /* hotkey_source_mask *must* be zero for |
| 2107 | * the first hotkey_mask_get */ | 2132 | * the first hotkey_mask_get */ |
| 2108 | res = hotkey_status_get(&hotkey_orig_status); | 2133 | res = hotkey_status_get(&hotkey_orig_status); |
| 2109 | if (!res && tp_features.hotkey_mask) { | 2134 | if (res) |
| 2110 | res = hotkey_mask_get(); | 2135 | goto err_exit; |
| 2111 | hotkey_orig_mask = hotkey_mask; | 2136 | |
| 2112 | if (!res) { | 2137 | if (tp_features.hotkey_mask) { |
| 2113 | res = add_many_to_attr_set( | 2138 | res = hotkey_mask_get(); |
| 2114 | hotkey_dev_attributes, | 2139 | if (res) |
| 2115 | hotkey_mask_attributes, | 2140 | goto err_exit; |
| 2116 | ARRAY_SIZE(hotkey_mask_attributes)); | 2141 | |
| 2117 | } | 2142 | hotkey_orig_mask = hotkey_mask; |
| 2118 | } | 2143 | res = add_many_to_attr_set( |
| 2144 | hotkey_dev_attributes, | ||
| 2145 | hotkey_mask_attributes, | ||
| 2146 | ARRAY_SIZE(hotkey_mask_attributes)); | ||
| 2147 | if (res) | ||
| 2148 | goto err_exit; | ||
| 2149 | } | ||
| 2119 | 2150 | ||
| 2120 | #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL | 2151 | #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL |
| 2121 | if (tp_features.hotkey_mask) { | 2152 | if (tp_features.hotkey_mask) { |
| 2122 | hotkey_source_mask = TPACPI_HKEY_NVRAM_GOOD_MASK | 2153 | hotkey_source_mask = TPACPI_HKEY_NVRAM_GOOD_MASK |
| 2123 | & ~hotkey_all_mask; | 2154 | & ~hotkey_all_mask; |
| 2124 | } else { | 2155 | } else { |
| 2125 | hotkey_source_mask = TPACPI_HKEY_NVRAM_GOOD_MASK; | 2156 | hotkey_source_mask = TPACPI_HKEY_NVRAM_GOOD_MASK; |
| 2126 | } | 2157 | } |
| 2127 | 2158 | ||
| 2128 | vdbg_printk(TPACPI_DBG_INIT, | 2159 | vdbg_printk(TPACPI_DBG_INIT, |
| 2129 | "hotkey source mask 0x%08x, polling freq %d\n", | 2160 | "hotkey source mask 0x%08x, polling freq %d\n", |
| 2130 | hotkey_source_mask, hotkey_poll_freq); | 2161 | hotkey_source_mask, hotkey_poll_freq); |
| 2131 | #endif | 2162 | #endif |
| 2132 | 2163 | ||
| 2133 | /* Not all thinkpads have a hardware radio switch */ | 2164 | /* Not all thinkpads have a hardware radio switch */ |
| 2134 | if (!res && acpi_evalf(hkey_handle, &status, "WLSW", "qd")) { | 2165 | if (acpi_evalf(hkey_handle, &status, "WLSW", "qd")) { |
| 2135 | tp_features.hotkey_wlsw = 1; | 2166 | tp_features.hotkey_wlsw = 1; |
| 2136 | printk(TPACPI_INFO | 2167 | printk(TPACPI_INFO |
| 2137 | "radio switch found; radios are %s\n", | 2168 | "radio switch found; radios are %s\n", |
| 2138 | enabled(status, 0)); | 2169 | enabled(status, 0)); |
| 2139 | res = add_to_attr_set(hotkey_dev_attributes, | 2170 | res = add_to_attr_set(hotkey_dev_attributes, |
| 2140 | &dev_attr_hotkey_radio_sw.attr); | 2171 | &dev_attr_hotkey_radio_sw.attr); |
| 2141 | } | 2172 | } |
| 2142 | 2173 | ||
| 2143 | /* For X41t, X60t, X61t Tablets... */ | 2174 | /* For X41t, X60t, X61t Tablets... */ |
| 2144 | if (!res && acpi_evalf(hkey_handle, &status, "MHKG", "qd")) { | 2175 | if (!res && acpi_evalf(hkey_handle, &status, "MHKG", "qd")) { |
| 2145 | tp_features.hotkey_tablet = 1; | 2176 | tp_features.hotkey_tablet = 1; |
| 2146 | printk(TPACPI_INFO | 2177 | printk(TPACPI_INFO |
| 2147 | "possible tablet mode switch found; " | 2178 | "possible tablet mode switch found; " |
| 2148 | "ThinkPad in %s mode\n", | 2179 | "ThinkPad in %s mode\n", |
| 2149 | (status & TP_HOTKEY_TABLET_MASK)? | 2180 | (status & TP_HOTKEY_TABLET_MASK)? |
| 2150 | "tablet" : "laptop"); | 2181 | "tablet" : "laptop"); |
| 2151 | res = add_to_attr_set(hotkey_dev_attributes, | 2182 | res = add_to_attr_set(hotkey_dev_attributes, |
| 2152 | &dev_attr_hotkey_tablet_mode.attr); | 2183 | &dev_attr_hotkey_tablet_mode.attr); |
| 2153 | } | 2184 | } |
| 2154 | 2185 | ||
| 2155 | if (!res) | 2186 | if (!res) |
| 2156 | res = register_attr_set_with_sysfs( | 2187 | res = register_attr_set_with_sysfs( |
| 2157 | hotkey_dev_attributes, | 2188 | hotkey_dev_attributes, |
| 2158 | &tpacpi_pdev->dev.kobj); | 2189 | &tpacpi_pdev->dev.kobj); |
| 2159 | if (res) | 2190 | if (res) |
| 2160 | return res; | 2191 | goto err_exit; |
| 2161 | 2192 | ||
| 2162 | /* Set up key map */ | 2193 | /* Set up key map */ |
| 2163 | 2194 | ||
| 2164 | hotkey_keycode_map = kmalloc(TPACPI_HOTKEY_MAP_SIZE, | 2195 | hotkey_keycode_map = kmalloc(TPACPI_HOTKEY_MAP_SIZE, |
| 2165 | GFP_KERNEL); | 2196 | GFP_KERNEL); |
| 2166 | if (!hotkey_keycode_map) { | 2197 | if (!hotkey_keycode_map) { |
| 2167 | printk(TPACPI_ERR | 2198 | printk(TPACPI_ERR |
| 2168 | "failed to allocate memory for key map\n"); | 2199 | "failed to allocate memory for key map\n"); |
| 2169 | return -ENOMEM; | 2200 | res = -ENOMEM; |
| 2170 | } | 2201 | goto err_exit; |
| 2202 | } | ||
| 2171 | 2203 | ||
| 2172 | if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO) { | 2204 | if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO) { |
| 2173 | dbg_printk(TPACPI_DBG_INIT, | 2205 | dbg_printk(TPACPI_DBG_INIT, |
| 2174 | "using Lenovo default hot key map\n"); | 2206 | "using Lenovo default hot key map\n"); |
| 2175 | memcpy(hotkey_keycode_map, &lenovo_keycode_map, | 2207 | memcpy(hotkey_keycode_map, &lenovo_keycode_map, |
| 2176 | TPACPI_HOTKEY_MAP_SIZE); | 2208 | TPACPI_HOTKEY_MAP_SIZE); |
| 2209 | } else { | ||
| 2210 | dbg_printk(TPACPI_DBG_INIT, | ||
| 2211 | "using IBM default hot key map\n"); | ||
| 2212 | memcpy(hotkey_keycode_map, &ibm_keycode_map, | ||
| 2213 | TPACPI_HOTKEY_MAP_SIZE); | ||
| 2214 | } | ||
| 2215 | |||
| 2216 | set_bit(EV_KEY, tpacpi_inputdev->evbit); | ||
| 2217 | set_bit(EV_MSC, tpacpi_inputdev->evbit); | ||
| 2218 | set_bit(MSC_SCAN, tpacpi_inputdev->mscbit); | ||
| 2219 | tpacpi_inputdev->keycodesize = TPACPI_HOTKEY_MAP_TYPESIZE; | ||
| 2220 | tpacpi_inputdev->keycodemax = TPACPI_HOTKEY_MAP_LEN; | ||
| 2221 | tpacpi_inputdev->keycode = hotkey_keycode_map; | ||
| 2222 | for (i = 0; i < TPACPI_HOTKEY_MAP_LEN; i++) { | ||
| 2223 | if (hotkey_keycode_map[i] != KEY_RESERVED) { | ||
| 2224 | set_bit(hotkey_keycode_map[i], | ||
| 2225 | tpacpi_inputdev->keybit); | ||
| 2177 | } else { | 2226 | } else { |
| 2178 | dbg_printk(TPACPI_DBG_INIT, | 2227 | if (i < sizeof(hotkey_reserved_mask)*8) |
| 2179 | "using IBM default hot key map\n"); | 2228 | hotkey_reserved_mask |= 1 << i; |
| 2180 | memcpy(hotkey_keycode_map, &ibm_keycode_map, | ||
| 2181 | TPACPI_HOTKEY_MAP_SIZE); | ||
| 2182 | } | ||
| 2183 | |||
| 2184 | set_bit(EV_KEY, tpacpi_inputdev->evbit); | ||
| 2185 | set_bit(EV_MSC, tpacpi_inputdev->evbit); | ||
| 2186 | set_bit(MSC_SCAN, tpacpi_inputdev->mscbit); | ||
| 2187 | tpacpi_inputdev->keycodesize = TPACPI_HOTKEY_MAP_TYPESIZE; | ||
| 2188 | tpacpi_inputdev->keycodemax = TPACPI_HOTKEY_MAP_LEN; | ||
| 2189 | tpacpi_inputdev->keycode = hotkey_keycode_map; | ||
| 2190 | for (i = 0; i < TPACPI_HOTKEY_MAP_LEN; i++) { | ||
| 2191 | if (hotkey_keycode_map[i] != KEY_RESERVED) { | ||
| 2192 | set_bit(hotkey_keycode_map[i], | ||
| 2193 | tpacpi_inputdev->keybit); | ||
| 2194 | } else { | ||
| 2195 | if (i < sizeof(hotkey_reserved_mask)*8) | ||
| 2196 | hotkey_reserved_mask |= 1 << i; | ||
| 2197 | } | ||
| 2198 | } | ||
| 2199 | |||
| 2200 | if (tp_features.hotkey_wlsw) { | ||
| 2201 | set_bit(EV_SW, tpacpi_inputdev->evbit); | ||
| 2202 | set_bit(SW_RADIO, tpacpi_inputdev->swbit); | ||
| 2203 | } | ||
| 2204 | if (tp_features.hotkey_tablet) { | ||
| 2205 | set_bit(EV_SW, tpacpi_inputdev->evbit); | ||
| 2206 | set_bit(SW_TABLET_MODE, tpacpi_inputdev->swbit); | ||
| 2207 | } | 2229 | } |
| 2230 | } | ||
| 2208 | 2231 | ||
| 2209 | /* Do not issue duplicate brightness change events to | 2232 | if (tp_features.hotkey_wlsw) { |
| 2210 | * userspace */ | 2233 | set_bit(EV_SW, tpacpi_inputdev->evbit); |
| 2211 | if (!tp_features.bright_acpimode) | 2234 | set_bit(SW_RFKILL_ALL, tpacpi_inputdev->swbit); |
| 2212 | /* update bright_acpimode... */ | 2235 | } |
| 2213 | tpacpi_check_std_acpi_brightness_support(); | 2236 | if (tp_features.hotkey_tablet) { |
| 2214 | 2237 | set_bit(EV_SW, tpacpi_inputdev->evbit); | |
| 2215 | if (tp_features.bright_acpimode) { | 2238 | set_bit(SW_TABLET_MODE, tpacpi_inputdev->swbit); |
| 2216 | printk(TPACPI_INFO | 2239 | } |
| 2217 | "This ThinkPad has standard ACPI backlight " | ||
| 2218 | "brightness control, supported by the ACPI " | ||
| 2219 | "video driver\n"); | ||
| 2220 | printk(TPACPI_NOTICE | ||
| 2221 | "Disabling thinkpad-acpi brightness events " | ||
| 2222 | "by default...\n"); | ||
| 2223 | |||
| 2224 | /* The hotkey_reserved_mask change below is not | ||
| 2225 | * necessary while the keys are at KEY_RESERVED in the | ||
| 2226 | * default map, but better safe than sorry, leave it | ||
| 2227 | * here as a marker of what we have to do, especially | ||
| 2228 | * when we finally become able to set this at runtime | ||
| 2229 | * on response to X.org requests */ | ||
| 2230 | hotkey_reserved_mask |= | ||
| 2231 | (1 << TP_ACPI_HOTKEYSCAN_FNHOME) | ||
| 2232 | | (1 << TP_ACPI_HOTKEYSCAN_FNEND); | ||
| 2233 | } | ||
| 2234 | 2240 | ||
| 2235 | dbg_printk(TPACPI_DBG_INIT, | 2241 | /* Do not issue duplicate brightness change events to |
| 2236 | "enabling hot key handling\n"); | 2242 | * userspace */ |
| 2237 | res = hotkey_status_set(1); | 2243 | if (!tp_features.bright_acpimode) |
| 2238 | if (res) | 2244 | /* update bright_acpimode... */ |
| 2239 | return res; | 2245 | tpacpi_check_std_acpi_brightness_support(); |
| 2240 | res = hotkey_mask_set(((hotkey_all_mask | hotkey_source_mask) | ||
| 2241 | & ~hotkey_reserved_mask) | ||
| 2242 | | hotkey_orig_mask); | ||
| 2243 | if (res < 0 && res != -ENXIO) | ||
| 2244 | return res; | ||
| 2245 | 2246 | ||
| 2246 | dbg_printk(TPACPI_DBG_INIT, | 2247 | if (tp_features.bright_acpimode) { |
| 2247 | "legacy hot key reporting over procfs %s\n", | 2248 | printk(TPACPI_INFO |
| 2248 | (hotkey_report_mode < 2) ? | 2249 | "This ThinkPad has standard ACPI backlight " |
| 2249 | "enabled" : "disabled"); | 2250 | "brightness control, supported by the ACPI " |
| 2251 | "video driver\n"); | ||
| 2252 | printk(TPACPI_NOTICE | ||
| 2253 | "Disabling thinkpad-acpi brightness events " | ||
| 2254 | "by default...\n"); | ||
| 2255 | |||
| 2256 | /* The hotkey_reserved_mask change below is not | ||
| 2257 | * necessary while the keys are at KEY_RESERVED in the | ||
| 2258 | * default map, but better safe than sorry, leave it | ||
| 2259 | * here as a marker of what we have to do, especially | ||
| 2260 | * when we finally become able to set this at runtime | ||
| 2261 | * on response to X.org requests */ | ||
| 2262 | hotkey_reserved_mask |= | ||
| 2263 | (1 << TP_ACPI_HOTKEYSCAN_FNHOME) | ||
| 2264 | | (1 << TP_ACPI_HOTKEYSCAN_FNEND); | ||
| 2265 | } | ||
| 2266 | |||
| 2267 | dbg_printk(TPACPI_DBG_INIT, "enabling hot key handling\n"); | ||
| 2268 | res = hotkey_status_set(1); | ||
| 2269 | if (res) { | ||
| 2270 | hotkey_exit(); | ||
| 2271 | return res; | ||
| 2272 | } | ||
| 2273 | res = hotkey_mask_set(((hotkey_all_mask | hotkey_source_mask) | ||
| 2274 | & ~hotkey_reserved_mask) | ||
| 2275 | | hotkey_orig_mask); | ||
| 2276 | if (res < 0 && res != -ENXIO) { | ||
| 2277 | hotkey_exit(); | ||
| 2278 | return res; | ||
| 2279 | } | ||
| 2250 | 2280 | ||
| 2251 | tpacpi_inputdev->open = &hotkey_inputdev_open; | 2281 | dbg_printk(TPACPI_DBG_INIT, |
| 2252 | tpacpi_inputdev->close = &hotkey_inputdev_close; | 2282 | "legacy hot key reporting over procfs %s\n", |
| 2283 | (hotkey_report_mode < 2) ? | ||
| 2284 | "enabled" : "disabled"); | ||
| 2253 | 2285 | ||
| 2254 | hotkey_poll_setup_safe(1); | 2286 | tpacpi_inputdev->open = &hotkey_inputdev_open; |
| 2255 | tpacpi_input_send_radiosw(); | 2287 | tpacpi_inputdev->close = &hotkey_inputdev_close; |
| 2256 | tpacpi_input_send_tabletsw(); | ||
| 2257 | } | ||
| 2258 | 2288 | ||
| 2259 | return (tp_features.hotkey)? 0 : 1; | 2289 | hotkey_poll_setup_safe(1); |
| 2260 | } | 2290 | tpacpi_input_send_radiosw(); |
| 2291 | tpacpi_input_send_tabletsw(); | ||
| 2261 | 2292 | ||
| 2262 | static void hotkey_exit(void) | 2293 | return 0; |
| 2263 | { | ||
| 2264 | #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL | ||
| 2265 | hotkey_poll_stop_sync(); | ||
| 2266 | #endif | ||
| 2267 | 2294 | ||
| 2268 | if (tp_features.hotkey) { | 2295 | err_exit: |
| 2269 | dbg_printk(TPACPI_DBG_EXIT, | 2296 | delete_attr_set(hotkey_dev_attributes, &tpacpi_pdev->dev.kobj); |
| 2270 | "restoring original hot key mask\n"); | 2297 | hotkey_dev_attributes = NULL; |
| 2271 | /* no short-circuit boolean operator below! */ | ||
| 2272 | if ((hotkey_mask_set(hotkey_orig_mask) | | ||
| 2273 | hotkey_status_set(hotkey_orig_status)) != 0) | ||
| 2274 | printk(TPACPI_ERR | ||
| 2275 | "failed to restore hot key mask " | ||
| 2276 | "to BIOS defaults\n"); | ||
| 2277 | } | ||
| 2278 | 2298 | ||
| 2279 | if (hotkey_dev_attributes) { | 2299 | return (res < 0)? res : 1; |
| 2280 | delete_attr_set(hotkey_dev_attributes, &tpacpi_pdev->dev.kobj); | ||
| 2281 | hotkey_dev_attributes = NULL; | ||
| 2282 | } | ||
| 2283 | } | 2300 | } |
| 2284 | 2301 | ||
| 2285 | static void hotkey_notify(struct ibm_struct *ibm, u32 event) | 2302 | static void hotkey_notify(struct ibm_struct *ibm, u32 event) |
| @@ -3319,7 +3336,7 @@ static struct tpacpi_led_classdev tpacpi_led_thinklight = { | |||
| 3319 | 3336 | ||
| 3320 | static int __init light_init(struct ibm_init_struct *iibm) | 3337 | static int __init light_init(struct ibm_init_struct *iibm) |
| 3321 | { | 3338 | { |
| 3322 | int rc = 0; | 3339 | int rc; |
| 3323 | 3340 | ||
| 3324 | vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n"); | 3341 | vdbg_printk(TPACPI_DBG_INIT, "initializing light subdriver\n"); |
| 3325 | 3342 | ||
| @@ -3337,20 +3354,23 @@ static int __init light_init(struct ibm_init_struct *iibm) | |||
| 3337 | tp_features.light_status = | 3354 | tp_features.light_status = |
| 3338 | acpi_evalf(ec_handle, NULL, "KBLT", "qv"); | 3355 | acpi_evalf(ec_handle, NULL, "KBLT", "qv"); |
| 3339 | 3356 | ||
| 3340 | vdbg_printk(TPACPI_DBG_INIT, "light is %s\n", | 3357 | vdbg_printk(TPACPI_DBG_INIT, "light is %s, light status is %s\n", |
| 3341 | str_supported(tp_features.light)); | 3358 | str_supported(tp_features.light), |
| 3359 | str_supported(tp_features.light_status)); | ||
| 3342 | 3360 | ||
| 3343 | if (tp_features.light) { | 3361 | if (!tp_features.light) |
| 3344 | rc = led_classdev_register(&tpacpi_pdev->dev, | 3362 | return 1; |
| 3345 | &tpacpi_led_thinklight.led_classdev); | 3363 | |
| 3346 | } | 3364 | rc = led_classdev_register(&tpacpi_pdev->dev, |
| 3365 | &tpacpi_led_thinklight.led_classdev); | ||
| 3347 | 3366 | ||
| 3348 | if (rc < 0) { | 3367 | if (rc < 0) { |
| 3349 | tp_features.light = 0; | 3368 | tp_features.light = 0; |
| 3350 | tp_features.light_status = 0; | 3369 | tp_features.light_status = 0; |
| 3351 | } else { | 3370 | } else { |
| 3352 | rc = (tp_features.light)? 0 : 1; | 3371 | rc = 0; |
| 3353 | } | 3372 | } |
| 3373 | |||
| 3354 | return rc; | 3374 | return rc; |
| 3355 | } | 3375 | } |
| 3356 | 3376 | ||
| @@ -3833,7 +3853,7 @@ static const char * const tpacpi_led_names[TPACPI_LED_NUMLEDS] = { | |||
| 3833 | "tpacpi::standby", | 3853 | "tpacpi::standby", |
| 3834 | }; | 3854 | }; |
| 3835 | 3855 | ||
| 3836 | static int led_get_status(unsigned int led) | 3856 | static int led_get_status(const unsigned int led) |
| 3837 | { | 3857 | { |
| 3838 | int status; | 3858 | int status; |
| 3839 | enum led_status_t led_s; | 3859 | enum led_status_t led_s; |
| @@ -3857,41 +3877,42 @@ static int led_get_status(unsigned int led) | |||
| 3857 | /* not reached */ | 3877 | /* not reached */ |
| 3858 | } | 3878 | } |
| 3859 | 3879 | ||
| 3860 | static int led_set_status(unsigned int led, enum led_status_t ledstatus) | 3880 | static int led_set_status(const unsigned int led, |
| 3881 | const enum led_status_t ledstatus) | ||
| 3861 | { | 3882 | { |
| 3862 | /* off, on, blink. Index is led_status_t */ | 3883 | /* off, on, blink. Index is led_status_t */ |
| 3863 | static const int led_sled_arg1[] = { 0, 1, 3 }; | 3884 | static const unsigned int led_sled_arg1[] = { 0, 1, 3 }; |
| 3864 | static const int led_exp_hlbl[] = { 0, 0, 1 }; /* led# * */ | 3885 | static const unsigned int led_led_arg1[] = { 0, 0x80, 0xc0 }; |
| 3865 | static const int led_exp_hlcl[] = { 0, 1, 1 }; /* led# * */ | ||
| 3866 | static const int led_led_arg1[] = { 0, 0x80, 0xc0 }; | ||
| 3867 | 3886 | ||
| 3868 | int rc = 0; | 3887 | int rc = 0; |
| 3869 | 3888 | ||
| 3870 | switch (led_supported) { | 3889 | switch (led_supported) { |
| 3871 | case TPACPI_LED_570: | 3890 | case TPACPI_LED_570: |
| 3872 | /* 570 */ | 3891 | /* 570 */ |
| 3873 | led = 1 << led; | 3892 | if (led > 7) |
| 3874 | if (!acpi_evalf(led_handle, NULL, NULL, "vdd", | 3893 | return -EINVAL; |
| 3875 | led, led_sled_arg1[ledstatus])) | 3894 | if (!acpi_evalf(led_handle, NULL, NULL, "vdd", |
| 3876 | rc = -EIO; | 3895 | (1 << led), led_sled_arg1[ledstatus])) |
| 3877 | break; | 3896 | rc = -EIO; |
| 3897 | break; | ||
| 3878 | case TPACPI_LED_OLD: | 3898 | case TPACPI_LED_OLD: |
| 3879 | /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20 */ | 3899 | /* 600e/x, 770e, 770x, A21e, A2xm/p, T20-22, X20 */ |
| 3880 | led = 1 << led; | 3900 | if (led > 7) |
| 3881 | rc = ec_write(TPACPI_LED_EC_HLMS, led); | 3901 | return -EINVAL; |
| 3882 | if (rc >= 0) | 3902 | rc = ec_write(TPACPI_LED_EC_HLMS, (1 << led)); |
| 3883 | rc = ec_write(TPACPI_LED_EC_HLBL, | 3903 | if (rc >= 0) |
| 3884 | led * led_exp_hlbl[ledstatus]); | 3904 | rc = ec_write(TPACPI_LED_EC_HLBL, |
| 3885 | if (rc >= 0) | 3905 | (ledstatus == TPACPI_LED_BLINK) << led); |
| 3886 | rc = ec_write(TPACPI_LED_EC_HLCL, | 3906 | if (rc >= 0) |
| 3887 | led * led_exp_hlcl[ledstatus]); | 3907 | rc = ec_write(TPACPI_LED_EC_HLCL, |
| 3888 | break; | 3908 | (ledstatus != TPACPI_LED_OFF) << led); |
| 3909 | break; | ||
| 3889 | case TPACPI_LED_NEW: | 3910 | case TPACPI_LED_NEW: |
| 3890 | /* all others */ | 3911 | /* all others */ |
| 3891 | if (!acpi_evalf(led_handle, NULL, NULL, "vdd", | 3912 | if (!acpi_evalf(led_handle, NULL, NULL, "vdd", |
| 3892 | led, led_led_arg1[ledstatus])) | 3913 | led, led_led_arg1[ledstatus])) |
| 3893 | rc = -EIO; | 3914 | rc = -EIO; |
| 3894 | break; | 3915 | break; |
| 3895 | default: | 3916 | default: |
| 3896 | rc = -ENXIO; | 3917 | rc = -ENXIO; |
| 3897 | } | 3918 | } |
| @@ -3978,7 +3999,6 @@ static void led_exit(void) | |||
| 3978 | } | 3999 | } |
| 3979 | 4000 | ||
| 3980 | kfree(tpacpi_leds); | 4001 | kfree(tpacpi_leds); |
| 3981 | tpacpi_leds = NULL; | ||
| 3982 | } | 4002 | } |
| 3983 | 4003 | ||
| 3984 | static int __init led_init(struct ibm_init_struct *iibm) | 4004 | static int __init led_init(struct ibm_init_struct *iibm) |
| @@ -4802,7 +4822,6 @@ static void brightness_exit(void) | |||
| 4802 | vdbg_printk(TPACPI_DBG_EXIT, | 4822 | vdbg_printk(TPACPI_DBG_EXIT, |
| 4803 | "calling backlight_device_unregister()\n"); | 4823 | "calling backlight_device_unregister()\n"); |
| 4804 | backlight_device_unregister(ibm_backlight_device); | 4824 | backlight_device_unregister(ibm_backlight_device); |
| 4805 | ibm_backlight_device = NULL; | ||
| 4806 | } | 4825 | } |
| 4807 | } | 4826 | } |
| 4808 | 4827 | ||
| @@ -5764,11 +5783,16 @@ static int __init fan_init(struct ibm_init_struct *iibm) | |||
| 5764 | fan_control_access_mode != TPACPI_FAN_WR_NONE) { | 5783 | fan_control_access_mode != TPACPI_FAN_WR_NONE) { |
| 5765 | rc = sysfs_create_group(&tpacpi_sensors_pdev->dev.kobj, | 5784 | rc = sysfs_create_group(&tpacpi_sensors_pdev->dev.kobj, |
| 5766 | &fan_attr_group); | 5785 | &fan_attr_group); |
| 5767 | if (!(rc < 0)) | ||
| 5768 | rc = driver_create_file(&tpacpi_hwmon_pdriver.driver, | ||
| 5769 | &driver_attr_fan_watchdog); | ||
| 5770 | if (rc < 0) | 5786 | if (rc < 0) |
| 5771 | return rc; | 5787 | return rc; |
| 5788 | |||
| 5789 | rc = driver_create_file(&tpacpi_hwmon_pdriver.driver, | ||
| 5790 | &driver_attr_fan_watchdog); | ||
| 5791 | if (rc < 0) { | ||
| 5792 | sysfs_remove_group(&tpacpi_sensors_pdev->dev.kobj, | ||
| 5793 | &fan_attr_group); | ||
| 5794 | return rc; | ||
| 5795 | } | ||
| 5772 | return 0; | 5796 | return 0; |
| 5773 | } else | 5797 | } else |
| 5774 | return 1; | 5798 | return 1; |
diff --git a/drivers/mmc/host/wbsd.c b/drivers/mmc/host/wbsd.c index be624a049c67..c303e7f57ab4 100644 --- a/drivers/mmc/host/wbsd.c +++ b/drivers/mmc/host/wbsd.c | |||
| @@ -1457,17 +1457,7 @@ static int __devinit wbsd_request_irq(struct wbsd_host *host, int irq) | |||
| 1457 | int ret; | 1457 | int ret; |
| 1458 | 1458 | ||
| 1459 | /* | 1459 | /* |
| 1460 | * Allocate interrupt. | 1460 | * Set up tasklets. Must be done before requesting interrupt. |
| 1461 | */ | ||
| 1462 | |||
| 1463 | ret = request_irq(irq, wbsd_irq, IRQF_SHARED, DRIVER_NAME, host); | ||
| 1464 | if (ret) | ||
| 1465 | return ret; | ||
| 1466 | |||
| 1467 | host->irq = irq; | ||
| 1468 | |||
| 1469 | /* | ||
| 1470 | * Set up tasklets. | ||
| 1471 | */ | 1461 | */ |
| 1472 | tasklet_init(&host->card_tasklet, wbsd_tasklet_card, | 1462 | tasklet_init(&host->card_tasklet, wbsd_tasklet_card, |
| 1473 | (unsigned long)host); | 1463 | (unsigned long)host); |
| @@ -1480,6 +1470,15 @@ static int __devinit wbsd_request_irq(struct wbsd_host *host, int irq) | |||
| 1480 | tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish, | 1470 | tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish, |
| 1481 | (unsigned long)host); | 1471 | (unsigned long)host); |
| 1482 | 1472 | ||
| 1473 | /* | ||
| 1474 | * Allocate interrupt. | ||
| 1475 | */ | ||
| 1476 | ret = request_irq(irq, wbsd_irq, IRQF_SHARED, DRIVER_NAME, host); | ||
| 1477 | if (ret) | ||
| 1478 | return ret; | ||
| 1479 | |||
| 1480 | host->irq = irq; | ||
| 1481 | |||
| 1483 | return 0; | 1482 | return 0; |
| 1484 | } | 1483 | } |
| 1485 | 1484 | ||
diff --git a/drivers/net/7990.c b/drivers/net/7990.c index 750a46f4bc58..ad6b8a5b6574 100644 --- a/drivers/net/7990.c +++ b/drivers/net/7990.c | |||
| @@ -506,6 +506,7 @@ int lance_open (struct net_device *dev) | |||
| 506 | 506 | ||
| 507 | return res; | 507 | return res; |
| 508 | } | 508 | } |
| 509 | EXPORT_SYMBOL_GPL(lance_open); | ||
| 509 | 510 | ||
| 510 | int lance_close (struct net_device *dev) | 511 | int lance_close (struct net_device *dev) |
| 511 | { | 512 | { |
| @@ -521,6 +522,7 @@ int lance_close (struct net_device *dev) | |||
| 521 | 522 | ||
| 522 | return 0; | 523 | return 0; |
| 523 | } | 524 | } |
| 525 | EXPORT_SYMBOL_GPL(lance_close); | ||
| 524 | 526 | ||
| 525 | void lance_tx_timeout(struct net_device *dev) | 527 | void lance_tx_timeout(struct net_device *dev) |
| 526 | { | 528 | { |
| @@ -529,7 +531,7 @@ void lance_tx_timeout(struct net_device *dev) | |||
| 529 | dev->trans_start = jiffies; | 531 | dev->trans_start = jiffies; |
| 530 | netif_wake_queue (dev); | 532 | netif_wake_queue (dev); |
| 531 | } | 533 | } |
| 532 | 534 | EXPORT_SYMBOL_GPL(lance_tx_timeout); | |
| 533 | 535 | ||
| 534 | int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) | 536 | int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) |
| 535 | { | 537 | { |
| @@ -586,6 +588,7 @@ int lance_start_xmit (struct sk_buff *skb, struct net_device *dev) | |||
| 586 | 588 | ||
| 587 | return 0; | 589 | return 0; |
| 588 | } | 590 | } |
| 591 | EXPORT_SYMBOL_GPL(lance_start_xmit); | ||
| 589 | 592 | ||
| 590 | /* taken from the depca driver via a2065.c */ | 593 | /* taken from the depca driver via a2065.c */ |
| 591 | static void lance_load_multicast (struct net_device *dev) | 594 | static void lance_load_multicast (struct net_device *dev) |
| @@ -654,6 +657,7 @@ void lance_set_multicast (struct net_device *dev) | |||
| 654 | if (!stopped) | 657 | if (!stopped) |
| 655 | netif_start_queue (dev); | 658 | netif_start_queue (dev); |
| 656 | } | 659 | } |
| 660 | EXPORT_SYMBOL_GPL(lance_set_multicast); | ||
| 657 | 661 | ||
| 658 | #ifdef CONFIG_NET_POLL_CONTROLLER | 662 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 659 | void lance_poll(struct net_device *dev) | 663 | void lance_poll(struct net_device *dev) |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 6ddc911e7d15..3c798ae5c343 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
| @@ -471,7 +471,6 @@ static int atl1_get_permanent_address(struct atl1_hw *hw) | |||
| 471 | memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN); | 471 | memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN); |
| 472 | return 0; | 472 | return 0; |
| 473 | } | 473 | } |
| 474 | return 1; | ||
| 475 | } | 474 | } |
| 476 | 475 | ||
| 477 | /* see if SPI FLAGS exist ? */ | 476 | /* see if SPI FLAGS exist ? */ |
| @@ -637,22 +636,6 @@ static s32 atl1_phy_leave_power_saving(struct atl1_hw *hw) | |||
| 637 | } | 636 | } |
| 638 | 637 | ||
| 639 | /* | 638 | /* |
| 640 | * Force the PHY into power saving mode using vendor magic. | ||
| 641 | */ | ||
| 642 | #ifdef CONFIG_PM | ||
| 643 | static void atl1_phy_enter_power_saving(struct atl1_hw *hw) | ||
| 644 | { | ||
| 645 | atl1_write_phy_reg(hw, MII_DBG_ADDR, 0); | ||
| 646 | atl1_write_phy_reg(hw, MII_DBG_DATA, 0x124E); | ||
| 647 | atl1_write_phy_reg(hw, MII_DBG_ADDR, 2); | ||
| 648 | atl1_write_phy_reg(hw, MII_DBG_DATA, 0x3000); | ||
| 649 | atl1_write_phy_reg(hw, MII_DBG_ADDR, 3); | ||
| 650 | atl1_write_phy_reg(hw, MII_DBG_DATA, 0); | ||
| 651 | |||
| 652 | } | ||
| 653 | #endif | ||
| 654 | |||
| 655 | /* | ||
| 656 | * Resets the PHY and make all config validate | 639 | * Resets the PHY and make all config validate |
| 657 | * hw - Struct containing variables accessed by shared code | 640 | * hw - Struct containing variables accessed by shared code |
| 658 | * | 641 | * |
| @@ -2860,7 +2843,6 @@ disable_wol: | |||
| 2860 | ctrl |= PCIE_PHYMISC_FORCE_RCV_DET; | 2843 | ctrl |= PCIE_PHYMISC_FORCE_RCV_DET; |
| 2861 | iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC); | 2844 | iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC); |
| 2862 | ioread32(hw->hw_addr + REG_PCIE_PHYMISC); | 2845 | ioread32(hw->hw_addr + REG_PCIE_PHYMISC); |
| 2863 | atl1_phy_enter_power_saving(hw); | ||
| 2864 | hw->phy_configured = false; | 2846 | hw->phy_configured = false; |
| 2865 | pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); | 2847 | pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); |
| 2866 | exit: | 2848 | exit: |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 4b46e68183e0..367b6d462708 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -5724,14 +5724,12 @@ bnx2_reset_task(struct work_struct *work) | |||
| 5724 | if (!netif_running(bp->dev)) | 5724 | if (!netif_running(bp->dev)) |
| 5725 | return; | 5725 | return; |
| 5726 | 5726 | ||
| 5727 | bp->in_reset_task = 1; | ||
| 5728 | bnx2_netif_stop(bp); | 5727 | bnx2_netif_stop(bp); |
| 5729 | 5728 | ||
| 5730 | bnx2_init_nic(bp); | 5729 | bnx2_init_nic(bp); |
| 5731 | 5730 | ||
| 5732 | atomic_set(&bp->intr_sem, 1); | 5731 | atomic_set(&bp->intr_sem, 1); |
| 5733 | bnx2_netif_start(bp); | 5732 | bnx2_netif_start(bp); |
| 5734 | bp->in_reset_task = 0; | ||
| 5735 | } | 5733 | } |
| 5736 | 5734 | ||
| 5737 | static void | 5735 | static void |
| @@ -5907,12 +5905,7 @@ bnx2_close(struct net_device *dev) | |||
| 5907 | struct bnx2 *bp = netdev_priv(dev); | 5905 | struct bnx2 *bp = netdev_priv(dev); |
| 5908 | u32 reset_code; | 5906 | u32 reset_code; |
| 5909 | 5907 | ||
| 5910 | /* Calling flush_scheduled_work() may deadlock because | 5908 | cancel_work_sync(&bp->reset_task); |
| 5911 | * linkwatch_event() may be on the workqueue and it will try to get | ||
| 5912 | * the rtnl_lock which we are holding. | ||
| 5913 | */ | ||
| 5914 | while (bp->in_reset_task) | ||
| 5915 | msleep(1); | ||
| 5916 | 5909 | ||
| 5917 | bnx2_disable_int_sync(bp); | 5910 | bnx2_disable_int_sync(bp); |
| 5918 | bnx2_napi_disable(bp); | 5911 | bnx2_napi_disable(bp); |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 1eaf5bb3d9c2..2377cc13bf61 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
| @@ -6656,7 +6656,6 @@ struct bnx2 { | |||
| 6656 | int current_interval; | 6656 | int current_interval; |
| 6657 | struct timer_list timer; | 6657 | struct timer_list timer; |
| 6658 | struct work_struct reset_task; | 6658 | struct work_struct reset_task; |
| 6659 | int in_reset_task; | ||
| 6660 | 6659 | ||
| 6661 | /* Used to synchronize phy accesses. */ | 6660 | /* Used to synchronize phy accesses. */ |
| 6662 | spinlock_t phy_lock; | 6661 | spinlock_t phy_lock; |
diff --git a/drivers/net/bnx2x.c b/drivers/net/bnx2x.c index 7bdb5af35951..70cba64732ca 100644 --- a/drivers/net/bnx2x.c +++ b/drivers/net/bnx2x.c | |||
| @@ -6,7 +6,8 @@ | |||
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation. | 7 | * the Free Software Foundation. |
| 8 | * | 8 | * |
| 9 | * Written by: Eliezer Tamir <eliezert@broadcom.com> | 9 | * Maintained by: Eilon Greenstein <eilong@broadcom.com> |
| 10 | * Written by: Eliezer Tamir | ||
| 10 | * Based on code from Michael Chan's bnx2 driver | 11 | * Based on code from Michael Chan's bnx2 driver |
| 11 | * UDP CSUM errata workaround by Arik Gendelman | 12 | * UDP CSUM errata workaround by Arik Gendelman |
| 12 | * Slowpath rework by Vladislav Zolotarov | 13 | * Slowpath rework by Vladislav Zolotarov |
| @@ -74,7 +75,7 @@ static char version[] __devinitdata = | |||
| 74 | "Broadcom NetXtreme II 5771X 10Gigabit Ethernet Driver " | 75 | "Broadcom NetXtreme II 5771X 10Gigabit Ethernet Driver " |
| 75 | DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 76 | DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
| 76 | 77 | ||
| 77 | MODULE_AUTHOR("Eliezer Tamir <eliezert@broadcom.com>"); | 78 | MODULE_AUTHOR("Eliezer Tamir"); |
| 78 | MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 Driver"); | 79 | MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 Driver"); |
| 79 | MODULE_LICENSE("GPL"); | 80 | MODULE_LICENSE("GPL"); |
| 80 | MODULE_VERSION(DRV_MODULE_VERSION); | 81 | MODULE_VERSION(DRV_MODULE_VERSION); |
diff --git a/drivers/net/bnx2x.h b/drivers/net/bnx2x.h index 4f0c0d31e7c1..8e68d06510a6 100644 --- a/drivers/net/bnx2x.h +++ b/drivers/net/bnx2x.h | |||
| @@ -6,7 +6,8 @@ | |||
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation. | 7 | * the Free Software Foundation. |
| 8 | * | 8 | * |
| 9 | * Written by: Eliezer Tamir <eliezert@broadcom.com> | 9 | * Maintained by: Eilon Greenstein <eilong@broadcom.com> |
| 10 | * Written by: Eliezer Tamir | ||
| 10 | * Based on code from Michael Chan's bnx2 driver | 11 | * Based on code from Michael Chan's bnx2 driver |
| 11 | */ | 12 | */ |
| 12 | 13 | ||
diff --git a/drivers/net/bnx2x_init.h b/drivers/net/bnx2x_init.h index dcaecc53bdb1..370686eef97c 100644 --- a/drivers/net/bnx2x_init.h +++ b/drivers/net/bnx2x_init.h | |||
| @@ -6,7 +6,8 @@ | |||
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
| 7 | * the Free Software Foundation. | 7 | * the Free Software Foundation. |
| 8 | * | 8 | * |
| 9 | * Written by: Eliezer Tamir <eliezert@broadcom.com> | 9 | * Maintained by: Eilon Greenstein <eilong@broadcom.com> |
| 10 | * Written by: Eliezer Tamir | ||
| 10 | */ | 11 | */ |
| 11 | 12 | ||
| 12 | #ifndef BNX2X_INIT_H | 13 | #ifndef BNX2X_INIT_H |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 287a61918739..075fd547421e 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -1766,16 +1766,20 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa) | |||
| 1766 | mutex_lock(&ehea_bcmc_regs.lock); | 1766 | mutex_lock(&ehea_bcmc_regs.lock); |
| 1767 | 1767 | ||
| 1768 | /* Deregister old MAC in pHYP */ | 1768 | /* Deregister old MAC in pHYP */ |
| 1769 | ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC); | 1769 | if (port->state == EHEA_PORT_UP) { |
| 1770 | if (ret) | 1770 | ret = ehea_broadcast_reg_helper(port, H_DEREG_BCMC); |
| 1771 | goto out_upregs; | 1771 | if (ret) |
| 1772 | goto out_upregs; | ||
| 1773 | } | ||
| 1772 | 1774 | ||
| 1773 | port->mac_addr = cb0->port_mac_addr << 16; | 1775 | port->mac_addr = cb0->port_mac_addr << 16; |
| 1774 | 1776 | ||
| 1775 | /* Register new MAC in pHYP */ | 1777 | /* Register new MAC in pHYP */ |
| 1776 | ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); | 1778 | if (port->state == EHEA_PORT_UP) { |
| 1777 | if (ret) | 1779 | ret = ehea_broadcast_reg_helper(port, H_REG_BCMC); |
| 1778 | goto out_upregs; | 1780 | if (ret) |
| 1781 | goto out_upregs; | ||
| 1782 | } | ||
| 1779 | 1783 | ||
| 1780 | ret = 0; | 1784 | ret = 0; |
| 1781 | 1785 | ||
| @@ -2601,7 +2605,8 @@ static int ehea_stop(struct net_device *dev) | |||
| 2601 | if (netif_msg_ifdown(port)) | 2605 | if (netif_msg_ifdown(port)) |
| 2602 | ehea_info("disabling port %s", dev->name); | 2606 | ehea_info("disabling port %s", dev->name); |
| 2603 | 2607 | ||
| 2604 | flush_scheduled_work(); | 2608 | cancel_work_sync(&port->reset_task); |
| 2609 | |||
| 2605 | mutex_lock(&port->port_lock); | 2610 | mutex_lock(&port->port_lock); |
| 2606 | netif_stop_queue(dev); | 2611 | netif_stop_queue(dev); |
| 2607 | port_napi_disable(port); | 2612 | port_napi_disable(port); |
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c index 46a90e9ec563..c05cb159c772 100644 --- a/drivers/net/enc28j60.c +++ b/drivers/net/enc28j60.c | |||
| @@ -400,26 +400,31 @@ enc28j60_packet_write(struct enc28j60_net *priv, int len, const u8 *data) | |||
| 400 | mutex_unlock(&priv->lock); | 400 | mutex_unlock(&priv->lock); |
| 401 | } | 401 | } |
| 402 | 402 | ||
| 403 | /* | 403 | static unsigned long msec20_to_jiffies; |
| 404 | * Wait until the PHY operation is complete. | 404 | |
| 405 | */ | 405 | static int poll_ready(struct enc28j60_net *priv, u8 reg, u8 mask, u8 val) |
| 406 | static int wait_phy_ready(struct enc28j60_net *priv) | ||
| 407 | { | 406 | { |
| 408 | unsigned long timeout = jiffies + 20 * HZ / 1000; | 407 | unsigned long timeout = jiffies + msec20_to_jiffies; |
| 409 | int ret = 1; | ||
| 410 | 408 | ||
| 411 | /* 20 msec timeout read */ | 409 | /* 20 msec timeout read */ |
| 412 | while (nolock_regb_read(priv, MISTAT) & MISTAT_BUSY) { | 410 | while ((nolock_regb_read(priv, reg) & mask) != val) { |
| 413 | if (time_after(jiffies, timeout)) { | 411 | if (time_after(jiffies, timeout)) { |
| 414 | if (netif_msg_drv(priv)) | 412 | if (netif_msg_drv(priv)) |
| 415 | printk(KERN_DEBUG DRV_NAME | 413 | dev_dbg(&priv->spi->dev, |
| 416 | ": PHY ready timeout!\n"); | 414 | "reg %02x ready timeout!\n", reg); |
| 417 | ret = 0; | 415 | return -ETIMEDOUT; |
| 418 | break; | ||
| 419 | } | 416 | } |
| 420 | cpu_relax(); | 417 | cpu_relax(); |
| 421 | } | 418 | } |
| 422 | return ret; | 419 | return 0; |
| 420 | } | ||
| 421 | |||
| 422 | /* | ||
| 423 | * Wait until the PHY operation is complete. | ||
| 424 | */ | ||
| 425 | static int wait_phy_ready(struct enc28j60_net *priv) | ||
| 426 | { | ||
| 427 | return poll_ready(priv, MISTAT, MISTAT_BUSY, 0) ? 0 : 1; | ||
| 423 | } | 428 | } |
| 424 | 429 | ||
| 425 | /* | 430 | /* |
| @@ -594,6 +599,32 @@ static void nolock_txfifo_init(struct enc28j60_net *priv, u16 start, u16 end) | |||
| 594 | nolock_regw_write(priv, ETXNDL, end); | 599 | nolock_regw_write(priv, ETXNDL, end); |
| 595 | } | 600 | } |
| 596 | 601 | ||
| 602 | /* | ||
| 603 | * Low power mode shrinks power consumption about 100x, so we'd like | ||
| 604 | * the chip to be in that mode whenever it's inactive. (However, we | ||
| 605 | * can't stay in lowpower mode during suspend with WOL active.) | ||
| 606 | */ | ||
| 607 | static void enc28j60_lowpower(struct enc28j60_net *priv, bool is_low) | ||
| 608 | { | ||
| 609 | if (netif_msg_drv(priv)) | ||
| 610 | dev_dbg(&priv->spi->dev, "%s power...\n", | ||
| 611 | is_low ? "low" : "high"); | ||
| 612 | |||
| 613 | mutex_lock(&priv->lock); | ||
| 614 | if (is_low) { | ||
| 615 | nolock_reg_bfclr(priv, ECON1, ECON1_RXEN); | ||
| 616 | poll_ready(priv, ESTAT, ESTAT_RXBUSY, 0); | ||
| 617 | poll_ready(priv, ECON1, ECON1_TXRTS, 0); | ||
| 618 | /* ECON2_VRPS was set during initialization */ | ||
| 619 | nolock_reg_bfset(priv, ECON2, ECON2_PWRSV); | ||
| 620 | } else { | ||
| 621 | nolock_reg_bfclr(priv, ECON2, ECON2_PWRSV); | ||
| 622 | poll_ready(priv, ESTAT, ESTAT_CLKRDY, ESTAT_CLKRDY); | ||
| 623 | /* caller sets ECON1_RXEN */ | ||
| 624 | } | ||
| 625 | mutex_unlock(&priv->lock); | ||
| 626 | } | ||
| 627 | |||
| 597 | static int enc28j60_hw_init(struct enc28j60_net *priv) | 628 | static int enc28j60_hw_init(struct enc28j60_net *priv) |
| 598 | { | 629 | { |
| 599 | u8 reg; | 630 | u8 reg; |
| @@ -612,8 +643,8 @@ static int enc28j60_hw_init(struct enc28j60_net *priv) | |||
| 612 | priv->tx_retry_count = 0; | 643 | priv->tx_retry_count = 0; |
| 613 | priv->max_pk_counter = 0; | 644 | priv->max_pk_counter = 0; |
| 614 | priv->rxfilter = RXFILTER_NORMAL; | 645 | priv->rxfilter = RXFILTER_NORMAL; |
| 615 | /* enable address auto increment */ | 646 | /* enable address auto increment and voltage regulator powersave */ |
| 616 | nolock_regb_write(priv, ECON2, ECON2_AUTOINC); | 647 | nolock_regb_write(priv, ECON2, ECON2_AUTOINC | ECON2_VRPS); |
| 617 | 648 | ||
| 618 | nolock_rxfifo_init(priv, RXSTART_INIT, RXEND_INIT); | 649 | nolock_rxfifo_init(priv, RXSTART_INIT, RXEND_INIT); |
| 619 | nolock_txfifo_init(priv, TXSTART_INIT, TXEND_INIT); | 650 | nolock_txfifo_init(priv, TXSTART_INIT, TXEND_INIT); |
| @@ -690,7 +721,7 @@ static int enc28j60_hw_init(struct enc28j60_net *priv) | |||
| 690 | 721 | ||
| 691 | static void enc28j60_hw_enable(struct enc28j60_net *priv) | 722 | static void enc28j60_hw_enable(struct enc28j60_net *priv) |
| 692 | { | 723 | { |
| 693 | /* enable interrutps */ | 724 | /* enable interrupts */ |
| 694 | if (netif_msg_hw(priv)) | 725 | if (netif_msg_hw(priv)) |
| 695 | printk(KERN_DEBUG DRV_NAME ": %s() enabling interrupts.\n", | 726 | printk(KERN_DEBUG DRV_NAME ": %s() enabling interrupts.\n", |
| 696 | __FUNCTION__); | 727 | __FUNCTION__); |
| @@ -726,15 +757,12 @@ enc28j60_setlink(struct net_device *ndev, u8 autoneg, u16 speed, u8 duplex) | |||
| 726 | int ret = 0; | 757 | int ret = 0; |
| 727 | 758 | ||
| 728 | if (!priv->hw_enable) { | 759 | if (!priv->hw_enable) { |
| 729 | if (autoneg == AUTONEG_DISABLE && speed == SPEED_10) { | 760 | /* link is in low power mode now; duplex setting |
| 761 | * will take effect on next enc28j60_hw_init(). | ||
| 762 | */ | ||
| 763 | if (autoneg == AUTONEG_DISABLE && speed == SPEED_10) | ||
| 730 | priv->full_duplex = (duplex == DUPLEX_FULL); | 764 | priv->full_duplex = (duplex == DUPLEX_FULL); |
| 731 | if (!enc28j60_hw_init(priv)) { | 765 | else { |
| 732 | if (netif_msg_drv(priv)) | ||
| 733 | dev_err(&ndev->dev, | ||
| 734 | "hw_reset() failed\n"); | ||
| 735 | ret = -EINVAL; | ||
| 736 | } | ||
| 737 | } else { | ||
| 738 | if (netif_msg_link(priv)) | 766 | if (netif_msg_link(priv)) |
| 739 | dev_warn(&ndev->dev, | 767 | dev_warn(&ndev->dev, |
| 740 | "unsupported link setting\n"); | 768 | "unsupported link setting\n"); |
| @@ -1307,7 +1335,8 @@ static int enc28j60_net_open(struct net_device *dev) | |||
| 1307 | } | 1335 | } |
| 1308 | return -EADDRNOTAVAIL; | 1336 | return -EADDRNOTAVAIL; |
| 1309 | } | 1337 | } |
| 1310 | /* Reset the hardware here */ | 1338 | /* Reset the hardware here (and take it out of low power mode) */ |
| 1339 | enc28j60_lowpower(priv, false); | ||
| 1311 | enc28j60_hw_disable(priv); | 1340 | enc28j60_hw_disable(priv); |
| 1312 | if (!enc28j60_hw_init(priv)) { | 1341 | if (!enc28j60_hw_init(priv)) { |
| 1313 | if (netif_msg_ifup(priv)) | 1342 | if (netif_msg_ifup(priv)) |
| @@ -1337,6 +1366,7 @@ static int enc28j60_net_close(struct net_device *dev) | |||
| 1337 | printk(KERN_DEBUG DRV_NAME ": %s() enter\n", __FUNCTION__); | 1366 | printk(KERN_DEBUG DRV_NAME ": %s() enter\n", __FUNCTION__); |
| 1338 | 1367 | ||
| 1339 | enc28j60_hw_disable(priv); | 1368 | enc28j60_hw_disable(priv); |
| 1369 | enc28j60_lowpower(priv, true); | ||
| 1340 | netif_stop_queue(dev); | 1370 | netif_stop_queue(dev); |
| 1341 | 1371 | ||
| 1342 | return 0; | 1372 | return 0; |
| @@ -1537,6 +1567,8 @@ static int __devinit enc28j60_probe(struct spi_device *spi) | |||
| 1537 | dev->watchdog_timeo = TX_TIMEOUT; | 1567 | dev->watchdog_timeo = TX_TIMEOUT; |
| 1538 | SET_ETHTOOL_OPS(dev, &enc28j60_ethtool_ops); | 1568 | SET_ETHTOOL_OPS(dev, &enc28j60_ethtool_ops); |
| 1539 | 1569 | ||
| 1570 | enc28j60_lowpower(priv, true); | ||
| 1571 | |||
| 1540 | ret = register_netdev(dev); | 1572 | ret = register_netdev(dev); |
| 1541 | if (ret) { | 1573 | if (ret) { |
| 1542 | if (netif_msg_probe(priv)) | 1574 | if (netif_msg_probe(priv)) |
| @@ -1556,7 +1588,7 @@ error_alloc: | |||
| 1556 | return ret; | 1588 | return ret; |
| 1557 | } | 1589 | } |
| 1558 | 1590 | ||
| 1559 | static int enc28j60_remove(struct spi_device *spi) | 1591 | static int __devexit enc28j60_remove(struct spi_device *spi) |
| 1560 | { | 1592 | { |
| 1561 | struct enc28j60_net *priv = dev_get_drvdata(&spi->dev); | 1593 | struct enc28j60_net *priv = dev_get_drvdata(&spi->dev); |
| 1562 | 1594 | ||
| @@ -1573,15 +1605,16 @@ static int enc28j60_remove(struct spi_device *spi) | |||
| 1573 | static struct spi_driver enc28j60_driver = { | 1605 | static struct spi_driver enc28j60_driver = { |
| 1574 | .driver = { | 1606 | .driver = { |
| 1575 | .name = DRV_NAME, | 1607 | .name = DRV_NAME, |
| 1576 | .bus = &spi_bus_type, | ||
| 1577 | .owner = THIS_MODULE, | 1608 | .owner = THIS_MODULE, |
| 1578 | }, | 1609 | }, |
| 1579 | .probe = enc28j60_probe, | 1610 | .probe = enc28j60_probe, |
| 1580 | .remove = __devexit_p(enc28j60_remove), | 1611 | .remove = __devexit_p(enc28j60_remove), |
| 1581 | }; | 1612 | }; |
| 1582 | 1613 | ||
| 1583 | static int __init enc28j60_init(void) | 1614 | static int __init enc28j60_init(void) |
| 1584 | { | 1615 | { |
| 1616 | msec20_to_jiffies = msecs_to_jiffies(20); | ||
| 1617 | |||
| 1585 | return spi_register_driver(&enc28j60_driver); | 1618 | return spi_register_driver(&enc28j60_driver); |
| 1586 | } | 1619 | } |
| 1587 | 1620 | ||
diff --git a/drivers/net/fec_mpc52xx.c b/drivers/net/fec_mpc52xx.c index 5f9c42e7a7f1..329edd9c08fc 100644 --- a/drivers/net/fec_mpc52xx.c +++ b/drivers/net/fec_mpc52xx.c | |||
| @@ -78,7 +78,7 @@ module_param_array_named(mac, mpc52xx_fec_mac_addr, byte, NULL, 0); | |||
| 78 | MODULE_PARM_DESC(mac, "six hex digits, ie. 0x1,0x2,0xc0,0x01,0xba,0xbe"); | 78 | MODULE_PARM_DESC(mac, "six hex digits, ie. 0x1,0x2,0xc0,0x01,0xba,0xbe"); |
| 79 | 79 | ||
| 80 | #define MPC52xx_MESSAGES_DEFAULT ( NETIF_MSG_DRV | NETIF_MSG_PROBE | \ | 80 | #define MPC52xx_MESSAGES_DEFAULT ( NETIF_MSG_DRV | NETIF_MSG_PROBE | \ |
| 81 | NETIF_MSG_LINK | NETIF_MSG_IFDOWN | NETIF_MSG_IFDOWN ) | 81 | NETIF_MSG_LINK | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP) |
| 82 | static int debug = -1; /* the above default */ | 82 | static int debug = -1; /* the above default */ |
| 83 | module_param(debug, int, 0); | 83 | module_param(debug, int, 0); |
| 84 | MODULE_PARM_DESC(debug, "debugging messages level"); | 84 | MODULE_PARM_DESC(debug, "debugging messages level"); |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 9eca97fb0a54..2cb244763292 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -3273,6 +3273,20 @@ static void nv_link_irq(struct net_device *dev) | |||
| 3273 | dprintk(KERN_DEBUG "%s: link change notification done.\n", dev->name); | 3273 | dprintk(KERN_DEBUG "%s: link change notification done.\n", dev->name); |
| 3274 | } | 3274 | } |
| 3275 | 3275 | ||
| 3276 | static void nv_msi_workaround(struct fe_priv *np) | ||
| 3277 | { | ||
| 3278 | |||
| 3279 | /* Need to toggle the msi irq mask within the ethernet device, | ||
| 3280 | * otherwise, future interrupts will not be detected. | ||
| 3281 | */ | ||
| 3282 | if (np->msi_flags & NV_MSI_ENABLED) { | ||
| 3283 | u8 __iomem *base = np->base; | ||
| 3284 | |||
| 3285 | writel(0, base + NvRegMSIIrqMask); | ||
| 3286 | writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask); | ||
| 3287 | } | ||
| 3288 | } | ||
| 3289 | |||
| 3276 | static irqreturn_t nv_nic_irq(int foo, void *data) | 3290 | static irqreturn_t nv_nic_irq(int foo, void *data) |
| 3277 | { | 3291 | { |
| 3278 | struct net_device *dev = (struct net_device *) data; | 3292 | struct net_device *dev = (struct net_device *) data; |
| @@ -3295,6 +3309,8 @@ static irqreturn_t nv_nic_irq(int foo, void *data) | |||
| 3295 | if (!(events & np->irqmask)) | 3309 | if (!(events & np->irqmask)) |
| 3296 | break; | 3310 | break; |
| 3297 | 3311 | ||
| 3312 | nv_msi_workaround(np); | ||
| 3313 | |||
| 3298 | spin_lock(&np->lock); | 3314 | spin_lock(&np->lock); |
| 3299 | nv_tx_done(dev); | 3315 | nv_tx_done(dev); |
| 3300 | spin_unlock(&np->lock); | 3316 | spin_unlock(&np->lock); |
| @@ -3410,6 +3426,8 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data) | |||
| 3410 | if (!(events & np->irqmask)) | 3426 | if (!(events & np->irqmask)) |
| 3411 | break; | 3427 | break; |
| 3412 | 3428 | ||
| 3429 | nv_msi_workaround(np); | ||
| 3430 | |||
| 3413 | spin_lock(&np->lock); | 3431 | spin_lock(&np->lock); |
| 3414 | nv_tx_done_optimized(dev, TX_WORK_PER_LOOP); | 3432 | nv_tx_done_optimized(dev, TX_WORK_PER_LOOP); |
| 3415 | spin_unlock(&np->lock); | 3433 | spin_unlock(&np->lock); |
| @@ -3750,6 +3768,8 @@ static irqreturn_t nv_nic_irq_test(int foo, void *data) | |||
| 3750 | if (!(events & NVREG_IRQ_TIMER)) | 3768 | if (!(events & NVREG_IRQ_TIMER)) |
| 3751 | return IRQ_RETVAL(0); | 3769 | return IRQ_RETVAL(0); |
| 3752 | 3770 | ||
| 3771 | nv_msi_workaround(np); | ||
| 3772 | |||
| 3753 | spin_lock(&np->lock); | 3773 | spin_lock(&np->lock); |
| 3754 | np->intr_test = 1; | 3774 | np->intr_test = 1; |
| 3755 | spin_unlock(&np->lock); | 3775 | spin_unlock(&np->lock); |
diff --git a/drivers/net/hamradio/baycom_epp.c b/drivers/net/hamradio/baycom_epp.c index dde9c7e6408a..00bc7fbb6b37 100644 --- a/drivers/net/hamradio/baycom_epp.c +++ b/drivers/net/hamradio/baycom_epp.c | |||
| @@ -959,7 +959,7 @@ static int epp_close(struct net_device *dev) | |||
| 959 | unsigned char tmp[1]; | 959 | unsigned char tmp[1]; |
| 960 | 960 | ||
| 961 | bc->work_running = 0; | 961 | bc->work_running = 0; |
| 962 | flush_scheduled_work(); | 962 | cancel_delayed_work_sync(&bc->run_work); |
| 963 | bc->stat = EPP_DCDBIT; | 963 | bc->stat = EPP_DCDBIT; |
| 964 | tmp[0] = 0; | 964 | tmp[0] = 0; |
| 965 | pp->ops->epp_write_addr(pp, tmp, 1, 0); | 965 | pp->ops->epp_write_addr(pp, tmp, 1, 0); |
diff --git a/drivers/net/ibm_newemac/Kconfig b/drivers/net/ibm_newemac/Kconfig index 0d3e7380bad0..70a3272ee998 100644 --- a/drivers/net/ibm_newemac/Kconfig +++ b/drivers/net/ibm_newemac/Kconfig | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | config IBM_NEW_EMAC | 1 | config IBM_NEW_EMAC |
| 2 | tristate "IBM EMAC Ethernet support" | 2 | tristate "IBM EMAC Ethernet support" |
| 3 | depends on PPC_DCR && PPC_MERGE | 3 | depends on PPC_DCR && PPC_MERGE |
| 4 | select CRC32 | ||
| 4 | help | 5 | help |
| 5 | This driver supports the IBM EMAC family of Ethernet controllers | 6 | This driver supports the IBM EMAC family of Ethernet controllers |
| 6 | typically found on 4xx embedded PowerPC chips, but also on the | 7 | typically found on 4xx embedded PowerPC chips, but also on the |
diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c index 9b358f61ed7f..679a0826780e 100644 --- a/drivers/net/ipg.c +++ b/drivers/net/ipg.c | |||
| @@ -577,12 +577,12 @@ static void ipg_nic_set_multicast_list(struct net_device *dev) | |||
| 577 | /* NIC to be configured in promiscuous mode. */ | 577 | /* NIC to be configured in promiscuous mode. */ |
| 578 | receivemode = IPG_RM_RECEIVEALLFRAMES; | 578 | receivemode = IPG_RM_RECEIVEALLFRAMES; |
| 579 | } else if ((dev->flags & IFF_ALLMULTI) || | 579 | } else if ((dev->flags & IFF_ALLMULTI) || |
| 580 | (dev->flags & IFF_MULTICAST & | 580 | ((dev->flags & IFF_MULTICAST) && |
| 581 | (dev->mc_count > IPG_MULTICAST_HASHTABLE_SIZE))) { | 581 | (dev->mc_count > IPG_MULTICAST_HASHTABLE_SIZE))) { |
| 582 | /* NIC to be configured to receive all multicast | 582 | /* NIC to be configured to receive all multicast |
| 583 | * frames. */ | 583 | * frames. */ |
| 584 | receivemode |= IPG_RM_RECEIVEMULTICAST; | 584 | receivemode |= IPG_RM_RECEIVEMULTICAST; |
| 585 | } else if (dev->flags & IFF_MULTICAST & (dev->mc_count > 0)) { | 585 | } else if ((dev->flags & IFF_MULTICAST) && (dev->mc_count > 0)) { |
| 586 | /* NIC to be configured to receive selected | 586 | /* NIC to be configured to receive selected |
| 587 | * multicast addresses. */ | 587 | * multicast addresses. */ |
| 588 | receivemode |= IPG_RM_RECEIVEMULTICASTHASH; | 588 | receivemode |= IPG_RM_RECEIVEMULTICASTHASH; |
diff --git a/drivers/net/irda/Kconfig b/drivers/net/irda/Kconfig index ce816ba9c40d..e6317557a531 100644 --- a/drivers/net/irda/Kconfig +++ b/drivers/net/irda/Kconfig | |||
| @@ -329,6 +329,7 @@ config PXA_FICP | |||
| 329 | config MCS_FIR | 329 | config MCS_FIR |
| 330 | tristate "MosChip MCS7780 IrDA-USB dongle" | 330 | tristate "MosChip MCS7780 IrDA-USB dongle" |
| 331 | depends on IRDA && USB && EXPERIMENTAL | 331 | depends on IRDA && USB && EXPERIMENTAL |
| 332 | select CRC32 | ||
| 332 | help | 333 | help |
| 333 | Say Y or M here if you want to build support for the MosChip | 334 | Say Y or M here if you want to build support for the MosChip |
| 334 | MCS7780 IrDA-USB bridge device driver. | 335 | MCS7780 IrDA-USB bridge device driver. |
diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c index 6321b059ce13..2f38e847e2cd 100644 --- a/drivers/net/ixgbe/ixgbe_82598.c +++ b/drivers/net/ixgbe/ixgbe_82598.c | |||
| @@ -58,8 +58,8 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw); | |||
| 58 | 58 | ||
| 59 | static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) | 59 | static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) |
| 60 | { | 60 | { |
| 61 | hw->mac.num_rx_queues = IXGBE_82598_MAX_TX_QUEUES; | 61 | hw->mac.num_rx_queues = IXGBE_82598_MAX_RX_QUEUES; |
| 62 | hw->mac.num_tx_queues = IXGBE_82598_MAX_RX_QUEUES; | 62 | hw->mac.num_tx_queues = IXGBE_82598_MAX_TX_QUEUES; |
| 63 | hw->mac.num_rx_addrs = IXGBE_82598_RAR_ENTRIES; | 63 | hw->mac.num_rx_addrs = IXGBE_82598_RAR_ENTRIES; |
| 64 | 64 | ||
| 65 | /* PHY ops are filled in by default properly for Fiber only */ | 65 | /* PHY ops are filled in by default properly for Fiber only */ |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 8cb29f5b1038..da4c4fb97064 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
| @@ -776,7 +776,6 @@ struct netxen_hardware_context { | |||
| 776 | 776 | ||
| 777 | u8 revision_id; | 777 | u8 revision_id; |
| 778 | u16 board_type; | 778 | u16 board_type; |
| 779 | u16 max_ports; | ||
| 780 | struct netxen_board_info boardcfg; | 779 | struct netxen_board_info boardcfg; |
| 781 | u32 xg_linkup; | 780 | u32 xg_linkup; |
| 782 | u32 qg_linksup; | 781 | u32 qg_linksup; |
| @@ -863,6 +862,7 @@ struct netxen_adapter { | |||
| 863 | unsigned char mac_addr[ETH_ALEN]; | 862 | unsigned char mac_addr[ETH_ALEN]; |
| 864 | int mtu; | 863 | int mtu; |
| 865 | int portnum; | 864 | int portnum; |
| 865 | u8 physical_port; | ||
| 866 | 866 | ||
| 867 | struct work_struct watchdog_task; | 867 | struct work_struct watchdog_task; |
| 868 | struct timer_list watchdog_timer; | 868 | struct timer_list watchdog_timer; |
| @@ -1034,7 +1034,6 @@ int netxen_rom_se(struct netxen_adapter *adapter, int addr); | |||
| 1034 | 1034 | ||
| 1035 | /* Functions from netxen_nic_isr.c */ | 1035 | /* Functions from netxen_nic_isr.c */ |
| 1036 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); | 1036 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); |
| 1037 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter); | ||
| 1038 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, | 1037 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, |
| 1039 | struct pci_dev **used_dev); | 1038 | struct pci_dev **used_dev); |
| 1040 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter); | 1039 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter); |
| @@ -1077,20 +1076,6 @@ static const struct netxen_brdinfo netxen_boards[] = { | |||
| 1077 | 1076 | ||
| 1078 | #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(netxen_boards) | 1077 | #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(netxen_boards) |
| 1079 | 1078 | ||
| 1080 | static inline void get_brd_port_by_type(u32 type, int *ports) | ||
| 1081 | { | ||
| 1082 | int i, found = 0; | ||
| 1083 | for (i = 0; i < NUM_SUPPORTED_BOARDS; ++i) { | ||
| 1084 | if (netxen_boards[i].brdtype == type) { | ||
| 1085 | *ports = netxen_boards[i].ports; | ||
| 1086 | found = 1; | ||
| 1087 | break; | ||
| 1088 | } | ||
| 1089 | } | ||
| 1090 | if (!found) | ||
| 1091 | *ports = 0; | ||
| 1092 | } | ||
| 1093 | |||
| 1094 | static inline void get_brd_name_by_type(u32 type, char *name) | 1079 | static inline void get_brd_name_by_type(u32 type, char *name) |
| 1095 | { | 1080 | { |
| 1096 | int i, found = 0; | 1081 | int i, found = 0; |
| @@ -1169,5 +1154,4 @@ extern int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, | |||
| 1169 | 1154 | ||
| 1170 | extern struct ethtool_ops netxen_nic_ethtool_ops; | 1155 | extern struct ethtool_ops netxen_nic_ethtool_ops; |
| 1171 | 1156 | ||
| 1172 | extern int physical_port[]; /* physical port # from virtual port.*/ | ||
| 1173 | #endif /* __NETXEN_NIC_H_ */ | 1157 | #endif /* __NETXEN_NIC_H_ */ |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 6e98d830eefb..723487bf200c 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
| @@ -369,7 +369,7 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | |||
| 369 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { | 369 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { |
| 370 | /* GB: port specific registers */ | 370 | /* GB: port specific registers */ |
| 371 | if (mode == 0 && i >= 19) | 371 | if (mode == 0 && i >= 19) |
| 372 | window = physical_port[adapter->portnum] * | 372 | window = adapter->physical_port * |
| 373 | NETXEN_NIC_PORT_WINDOW; | 373 | NETXEN_NIC_PORT_WINDOW; |
| 374 | 374 | ||
| 375 | NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. | 375 | NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. |
| @@ -527,7 +527,7 @@ netxen_nic_get_pauseparam(struct net_device *dev, | |||
| 527 | { | 527 | { |
| 528 | struct netxen_adapter *adapter = netdev_priv(dev); | 528 | struct netxen_adapter *adapter = netdev_priv(dev); |
| 529 | __u32 val; | 529 | __u32 val; |
| 530 | int port = physical_port[adapter->portnum]; | 530 | int port = adapter->physical_port; |
| 531 | 531 | ||
| 532 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 532 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
| 533 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | 533 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) |
| @@ -573,7 +573,7 @@ netxen_nic_set_pauseparam(struct net_device *dev, | |||
| 573 | { | 573 | { |
| 574 | struct netxen_adapter *adapter = netdev_priv(dev); | 574 | struct netxen_adapter *adapter = netdev_priv(dev); |
| 575 | __u32 val; | 575 | __u32 val; |
| 576 | int port = physical_port[adapter->portnum]; | 576 | int port = adapter->physical_port; |
| 577 | /* read mode */ | 577 | /* read mode */ |
| 578 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 578 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
| 579 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | 579 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index af7356468251..c43d06b8de9b 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
| @@ -396,11 +396,8 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
| 396 | } | 396 | } |
| 397 | adapter->intr_scheme = readl( | 397 | adapter->intr_scheme = readl( |
| 398 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW)); | 398 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_FW)); |
| 399 | printk(KERN_NOTICE "%s: FW capabilities:0x%x\n", netxen_nic_driver_name, | ||
| 400 | adapter->intr_scheme); | ||
| 401 | adapter->msi_mode = readl( | 399 | adapter->msi_mode = readl( |
| 402 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW)); | 400 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_MSI_MODE_FW)); |
| 403 | DPRINTK(INFO, "Receive Peg ready too. starting stuff\n"); | ||
| 404 | 401 | ||
| 405 | addr = netxen_alloc(adapter->ahw.pdev, | 402 | addr = netxen_alloc(adapter->ahw.pdev, |
| 406 | sizeof(struct netxen_ring_ctx) + | 403 | sizeof(struct netxen_ring_ctx) + |
| @@ -408,8 +405,6 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
| 408 | (dma_addr_t *) & adapter->ctx_desc_phys_addr, | 405 | (dma_addr_t *) & adapter->ctx_desc_phys_addr, |
| 409 | &adapter->ctx_desc_pdev); | 406 | &adapter->ctx_desc_pdev); |
| 410 | 407 | ||
| 411 | printk(KERN_INFO "ctx_desc_phys_addr: 0x%llx\n", | ||
| 412 | (unsigned long long) adapter->ctx_desc_phys_addr); | ||
| 413 | if (addr == NULL) { | 408 | if (addr == NULL) { |
| 414 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); | 409 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); |
| 415 | err = -ENOMEM; | 410 | err = -ENOMEM; |
| @@ -429,8 +424,6 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
| 429 | adapter->max_tx_desc_count, | 424 | adapter->max_tx_desc_count, |
| 430 | (dma_addr_t *) & hw->cmd_desc_phys_addr, | 425 | (dma_addr_t *) & hw->cmd_desc_phys_addr, |
| 431 | &adapter->ahw.cmd_desc_pdev); | 426 | &adapter->ahw.cmd_desc_pdev); |
| 432 | printk(KERN_INFO "cmd_desc_phys_addr: 0x%llx\n", | ||
| 433 | (unsigned long long) hw->cmd_desc_phys_addr); | ||
| 434 | 427 | ||
| 435 | if (addr == NULL) { | 428 | if (addr == NULL) { |
| 436 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); | 429 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); |
| @@ -1032,15 +1025,15 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter) | |||
| 1032 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu) | 1025 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu) |
| 1033 | { | 1026 | { |
| 1034 | netxen_nic_write_w0(adapter, | 1027 | netxen_nic_write_w0(adapter, |
| 1035 | NETXEN_NIU_GB_MAX_FRAME_SIZE( | 1028 | NETXEN_NIU_GB_MAX_FRAME_SIZE(adapter->physical_port), |
| 1036 | physical_port[adapter->portnum]), new_mtu); | 1029 | new_mtu); |
| 1037 | return 0; | 1030 | return 0; |
| 1038 | } | 1031 | } |
| 1039 | 1032 | ||
| 1040 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) | 1033 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) |
| 1041 | { | 1034 | { |
| 1042 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; | 1035 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; |
| 1043 | if (physical_port[adapter->portnum] == 0) | 1036 | if (adapter->physical_port == 0) |
| 1044 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, | 1037 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, |
| 1045 | new_mtu); | 1038 | new_mtu); |
| 1046 | else | 1039 | else |
| @@ -1051,7 +1044,7 @@ int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) | |||
| 1051 | 1044 | ||
| 1052 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter) | 1045 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter) |
| 1053 | { | 1046 | { |
| 1054 | netxen_niu_gbe_init_port(adapter, physical_port[adapter->portnum]); | 1047 | netxen_niu_gbe_init_port(adapter, adapter->physical_port); |
| 1055 | } | 1048 | } |
| 1056 | 1049 | ||
| 1057 | void | 1050 | void |
| @@ -1127,7 +1120,6 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter) | |||
| 1127 | 1120 | ||
| 1128 | void netxen_nic_flash_print(struct netxen_adapter *adapter) | 1121 | void netxen_nic_flash_print(struct netxen_adapter *adapter) |
| 1129 | { | 1122 | { |
| 1130 | int valid = 1; | ||
| 1131 | u32 fw_major = 0; | 1123 | u32 fw_major = 0; |
| 1132 | u32 fw_minor = 0; | 1124 | u32 fw_minor = 0; |
| 1133 | u32 fw_build = 0; | 1125 | u32 fw_build = 0; |
| @@ -1137,70 +1129,62 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter) | |||
| 1137 | __le32 *ptr32; | 1129 | __le32 *ptr32; |
| 1138 | 1130 | ||
| 1139 | struct netxen_board_info *board_info = &(adapter->ahw.boardcfg); | 1131 | struct netxen_board_info *board_info = &(adapter->ahw.boardcfg); |
| 1140 | if (board_info->magic != NETXEN_BDINFO_MAGIC) { | 1132 | |
| 1141 | printk | 1133 | adapter->driver_mismatch = 0; |
| 1142 | ("NetXen Unknown board config, Read 0x%x expected as 0x%x\n", | 1134 | |
| 1143 | board_info->magic, NETXEN_BDINFO_MAGIC); | 1135 | ptr32 = (u32 *)&serial_num; |
| 1144 | valid = 0; | 1136 | addr = NETXEN_USER_START + |
| 1145 | } | 1137 | offsetof(struct netxen_new_user_info, serial_num); |
| 1146 | if (board_info->header_version != NETXEN_BDINFO_VERSION) { | 1138 | for (i = 0; i < 8; i++) { |
| 1147 | printk("NetXen Unknown board config version." | 1139 | if (netxen_rom_fast_read(adapter, addr, ptr32) == -1) { |
| 1148 | " Read %x, expected %x\n", | 1140 | printk("%s: ERROR reading %s board userarea.\n", |
| 1149 | board_info->header_version, NETXEN_BDINFO_VERSION); | 1141 | netxen_nic_driver_name, |
| 1150 | valid = 0; | 1142 | netxen_nic_driver_name); |
| 1151 | } | 1143 | adapter->driver_mismatch = 1; |
| 1152 | if (valid) { | 1144 | return; |
| 1153 | ptr32 = (u32 *)&serial_num; | ||
| 1154 | addr = NETXEN_USER_START + | ||
| 1155 | offsetof(struct netxen_new_user_info, serial_num); | ||
| 1156 | for (i = 0; i < 8; i++) { | ||
| 1157 | if (netxen_rom_fast_read(adapter, addr, ptr32) == -1) { | ||
| 1158 | printk("%s: ERROR reading %s board userarea.\n", | ||
| 1159 | netxen_nic_driver_name, | ||
| 1160 | netxen_nic_driver_name); | ||
| 1161 | return; | ||
| 1162 | } | ||
| 1163 | ptr32++; | ||
| 1164 | addr += sizeof(u32); | ||
| 1165 | } | 1145 | } |
| 1146 | ptr32++; | ||
| 1147 | addr += sizeof(u32); | ||
| 1148 | } | ||
| 1149 | |||
| 1150 | fw_major = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1151 | NETXEN_FW_VERSION_MAJOR)); | ||
| 1152 | fw_minor = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1153 | NETXEN_FW_VERSION_MINOR)); | ||
| 1154 | fw_build = | ||
| 1155 | readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); | ||
| 1166 | 1156 | ||
| 1157 | if (adapter->portnum == 0) { | ||
| 1167 | get_brd_name_by_type(board_info->board_type, brd_name); | 1158 | get_brd_name_by_type(board_info->board_type, brd_name); |
| 1168 | 1159 | ||
| 1169 | printk("NetXen %s Board S/N %s Chip id 0x%x\n", | 1160 | printk("NetXen %s Board S/N %s Chip id 0x%x\n", |
| 1170 | brd_name, serial_num, board_info->chip_id); | 1161 | brd_name, serial_num, board_info->chip_id); |
| 1171 | 1162 | printk("NetXen Firmware version %d.%d.%d\n", fw_major, | |
| 1172 | printk("NetXen %s Board #%d, Chip id 0x%x\n", | 1163 | fw_minor, fw_build); |
| 1173 | board_info->board_type == 0x0b ? "XGB" : "GBE", | ||
| 1174 | board_info->board_num, board_info->chip_id); | ||
| 1175 | fw_major = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1176 | NETXEN_FW_VERSION_MAJOR)); | ||
| 1177 | fw_minor = readl(NETXEN_CRB_NORMALIZE(adapter, | ||
| 1178 | NETXEN_FW_VERSION_MINOR)); | ||
| 1179 | fw_build = | ||
| 1180 | readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); | ||
| 1181 | |||
| 1182 | printk("NetXen Firmware version %d.%d.%d\n", fw_major, fw_minor, | ||
| 1183 | fw_build); | ||
| 1184 | } | 1164 | } |
| 1165 | |||
| 1185 | if (fw_major != _NETXEN_NIC_LINUX_MAJOR) { | 1166 | if (fw_major != _NETXEN_NIC_LINUX_MAJOR) { |
| 1186 | printk(KERN_ERR "The mismatch in driver version and firmware " | ||
| 1187 | "version major number\n" | ||
| 1188 | "Driver version major number = %d \t" | ||
| 1189 | "Firmware version major number = %d \n", | ||
| 1190 | _NETXEN_NIC_LINUX_MAJOR, fw_major); | ||
| 1191 | adapter->driver_mismatch = 1; | 1167 | adapter->driver_mismatch = 1; |
| 1192 | } | 1168 | } |
| 1193 | if (fw_minor != _NETXEN_NIC_LINUX_MINOR && | 1169 | if (fw_minor != _NETXEN_NIC_LINUX_MINOR && |
| 1194 | fw_minor != (_NETXEN_NIC_LINUX_MINOR + 1)) { | 1170 | fw_minor != (_NETXEN_NIC_LINUX_MINOR + 1)) { |
| 1195 | printk(KERN_ERR "The mismatch in driver version and firmware " | ||
| 1196 | "version minor number\n" | ||
| 1197 | "Driver version minor number = %d \t" | ||
| 1198 | "Firmware version minor number = %d \n", | ||
| 1199 | _NETXEN_NIC_LINUX_MINOR, fw_minor); | ||
| 1200 | adapter->driver_mismatch = 1; | 1171 | adapter->driver_mismatch = 1; |
| 1201 | } | 1172 | } |
| 1202 | if (adapter->driver_mismatch) | 1173 | if (adapter->driver_mismatch) { |
| 1203 | printk(KERN_INFO "Use the driver with version no %d.%d.xxx\n", | 1174 | printk(KERN_ERR "%s: driver and firmware version mismatch\n", |
| 1204 | fw_major, fw_minor); | 1175 | adapter->netdev->name); |
| 1176 | return; | ||
| 1177 | } | ||
| 1178 | |||
| 1179 | switch (adapter->ahw.board_type) { | ||
| 1180 | case NETXEN_NIC_GBE: | ||
| 1181 | dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", | ||
| 1182 | adapter->netdev->name); | ||
| 1183 | break; | ||
| 1184 | case NETXEN_NIC_XGBE: | ||
| 1185 | dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", | ||
| 1186 | adapter->netdev->name); | ||
| 1187 | break; | ||
| 1188 | } | ||
| 1205 | } | 1189 | } |
| 1206 | 1190 | ||
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 45fa33e0cb90..70d1b22ced22 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -203,21 +203,6 @@ void netxen_initialize_adapter_sw(struct netxen_adapter *adapter) | |||
| 203 | } | 203 | } |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter) | ||
| 207 | { | ||
| 208 | int ports = 0; | ||
| 209 | struct netxen_board_info *board_info = &(adapter->ahw.boardcfg); | ||
| 210 | |||
| 211 | if (netxen_nic_get_board_info(adapter) != 0) | ||
| 212 | printk("%s: Error getting board config info.\n", | ||
| 213 | netxen_nic_driver_name); | ||
| 214 | get_brd_port_by_type(board_info->board_type, &ports); | ||
| 215 | if (ports == 0) | ||
| 216 | printk(KERN_ERR "%s: Unknown board type\n", | ||
| 217 | netxen_nic_driver_name); | ||
| 218 | adapter->ahw.max_ports = ports; | ||
| 219 | } | ||
| 220 | |||
| 221 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) | 206 | void netxen_initialize_adapter_ops(struct netxen_adapter *adapter) |
| 222 | { | 207 | { |
| 223 | switch (adapter->ahw.board_type) { | 208 | switch (adapter->ahw.board_type) { |
| @@ -765,18 +750,13 @@ int netxen_flash_unlock(struct netxen_adapter *adapter) | |||
| 765 | 750 | ||
| 766 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | 751 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) |
| 767 | { | 752 | { |
| 768 | int addr, val, status; | 753 | int addr, val; |
| 769 | int n, i; | 754 | int n, i; |
| 770 | int init_delay = 0; | 755 | int init_delay = 0; |
| 771 | struct crb_addr_pair *buf; | 756 | struct crb_addr_pair *buf; |
| 772 | u32 off; | 757 | u32 off; |
| 773 | 758 | ||
| 774 | /* resetall */ | 759 | /* resetall */ |
| 775 | status = netxen_nic_get_board_info(adapter); | ||
| 776 | if (status) | ||
| 777 | printk("%s: netxen_pinit_from_rom: Error getting board info\n", | ||
| 778 | netxen_nic_driver_name); | ||
| 779 | |||
| 780 | netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, | 760 | netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_GLB_SW_RESET, |
| 781 | NETXEN_ROMBUS_RESET); | 761 | NETXEN_ROMBUS_RESET); |
| 782 | 762 | ||
| @@ -860,10 +840,10 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
| 860 | netxen_nic_pci_change_crbwindow(adapter, 1); | 840 | netxen_nic_pci_change_crbwindow(adapter, 1); |
| 861 | } | 841 | } |
| 862 | if (init_delay == 1) { | 842 | if (init_delay == 1) { |
| 863 | msleep(2000); | 843 | msleep(1000); |
| 864 | init_delay = 0; | 844 | init_delay = 0; |
| 865 | } | 845 | } |
| 866 | msleep(20); | 846 | msleep(1); |
| 867 | } | 847 | } |
| 868 | kfree(buf); | 848 | kfree(buf); |
| 869 | 849 | ||
| @@ -938,12 +918,28 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter) | |||
| 938 | 918 | ||
| 939 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) | 919 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) |
| 940 | { | 920 | { |
| 921 | int i; | ||
| 922 | |||
| 941 | if (adapter->dummy_dma.addr) { | 923 | if (adapter->dummy_dma.addr) { |
| 942 | pci_free_consistent(adapter->ahw.pdev, | 924 | i = 100; |
| 925 | do { | ||
| 926 | if (dma_watchdog_shutdown_request(adapter) == 1) | ||
| 927 | break; | ||
| 928 | msleep(50); | ||
| 929 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | ||
| 930 | break; | ||
| 931 | } while (--i); | ||
| 932 | |||
| 933 | if (i) { | ||
| 934 | pci_free_consistent(adapter->ahw.pdev, | ||
| 943 | NETXEN_HOST_DUMMY_DMA_SIZE, | 935 | NETXEN_HOST_DUMMY_DMA_SIZE, |
| 944 | adapter->dummy_dma.addr, | 936 | adapter->dummy_dma.addr, |
| 945 | adapter->dummy_dma.phys_addr); | 937 | adapter->dummy_dma.phys_addr); |
| 946 | adapter->dummy_dma.addr = NULL; | 938 | adapter->dummy_dma.addr = NULL; |
| 939 | } else { | ||
| 940 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | ||
| 941 | adapter->netdev->name); | ||
| 942 | } | ||
| 947 | } | 943 | } |
| 948 | } | 944 | } |
| 949 | 945 | ||
diff --git a/drivers/net/netxen/netxen_nic_isr.c b/drivers/net/netxen/netxen_nic_isr.c index f487615f4063..96cec41f9019 100644 --- a/drivers/net/netxen/netxen_nic_isr.c +++ b/drivers/net/netxen/netxen_nic_isr.c | |||
| @@ -145,7 +145,7 @@ static void netxen_nic_isr_other(struct netxen_adapter *adapter) | |||
| 145 | 145 | ||
| 146 | /* verify the offset */ | 146 | /* verify the offset */ |
| 147 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); | 147 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); |
| 148 | val = val >> physical_port[adapter->portnum]; | 148 | val = val >> adapter->physical_port; |
| 149 | if (val == adapter->ahw.qg_linksup) | 149 | if (val == adapter->ahw.qg_linksup) |
| 150 | return; | 150 | return; |
| 151 | 151 | ||
| @@ -199,7 +199,7 @@ void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter) | |||
| 199 | 199 | ||
| 200 | /* WINDOW = 1 */ | 200 | /* WINDOW = 1 */ |
| 201 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); | 201 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); |
| 202 | val >>= (physical_port[adapter->portnum] * 8); | 202 | val >>= (adapter->physical_port * 8); |
| 203 | val &= 0xff; | 203 | val &= 0xff; |
| 204 | 204 | ||
| 205 | if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) { | 205 | if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) { |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 7144c255ce54..6797ed069f1f 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -70,17 +70,15 @@ static void netxen_nic_poll_controller(struct net_device *netdev); | |||
| 70 | static irqreturn_t netxen_intr(int irq, void *data); | 70 | static irqreturn_t netxen_intr(int irq, void *data); |
| 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
| 72 | 72 | ||
| 73 | int physical_port[] = {0, 1, 2, 3}; | ||
| 74 | |||
| 75 | /* PCI Device ID Table */ | 73 | /* PCI Device ID Table */ |
| 76 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | 74 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { |
| 77 | {PCI_DEVICE(0x4040, 0x0001)}, | 75 | {PCI_DEVICE(0x4040, 0x0001), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 78 | {PCI_DEVICE(0x4040, 0x0002)}, | 76 | {PCI_DEVICE(0x4040, 0x0002), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 79 | {PCI_DEVICE(0x4040, 0x0003)}, | 77 | {PCI_DEVICE(0x4040, 0x0003), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 80 | {PCI_DEVICE(0x4040, 0x0004)}, | 78 | {PCI_DEVICE(0x4040, 0x0004), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 81 | {PCI_DEVICE(0x4040, 0x0005)}, | 79 | {PCI_DEVICE(0x4040, 0x0005), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 82 | {PCI_DEVICE(0x4040, 0x0024)}, | 80 | {PCI_DEVICE(0x4040, 0x0024), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 83 | {PCI_DEVICE(0x4040, 0x0025)}, | 81 | {PCI_DEVICE(0x4040, 0x0025), PCI_DEVICE_CLASS(0x020000, ~0)}, |
| 84 | {0,} | 82 | {0,} |
| 85 | }; | 83 | }; |
| 86 | 84 | ||
| @@ -288,10 +286,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 288 | int pci_func_id = PCI_FUNC(pdev->devfn); | 286 | int pci_func_id = PCI_FUNC(pdev->devfn); |
| 289 | DECLARE_MAC_BUF(mac); | 287 | DECLARE_MAC_BUF(mac); |
| 290 | 288 | ||
| 291 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | 289 | if (pci_func_id == 0) |
| 290 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | ||
| 292 | 291 | ||
| 293 | if (pdev->class != 0x020000) { | 292 | if (pdev->class != 0x020000) { |
| 294 | printk(KERN_ERR"NetXen function %d, class %x will not " | 293 | printk(KERN_DEBUG "NetXen function %d, class %x will not " |
| 295 | "be enabled.\n",pci_func_id, pdev->class); | 294 | "be enabled.\n",pci_func_id, pdev->class); |
| 296 | return -ENODEV; | 295 | return -ENODEV; |
| 297 | } | 296 | } |
| @@ -450,8 +449,12 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 450 | */ | 449 | */ |
| 451 | adapter->curr_window = 255; | 450 | adapter->curr_window = 255; |
| 452 | 451 | ||
| 453 | /* initialize the adapter */ | 452 | if (netxen_nic_get_board_info(adapter) != 0) { |
| 454 | netxen_initialize_adapter_hw(adapter); | 453 | printk("%s: Error getting board config info.\n", |
| 454 | netxen_nic_driver_name); | ||
| 455 | err = -EIO; | ||
| 456 | goto err_out_iounmap; | ||
| 457 | } | ||
| 455 | 458 | ||
| 456 | /* | 459 | /* |
| 457 | * Adapter in our case is quad port so initialize it before | 460 | * Adapter in our case is quad port so initialize it before |
| @@ -530,17 +533,15 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 530 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ | 533 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ |
| 531 | 534 | ||
| 532 | /* Mezz cards have PCI function 0,2,3 enabled */ | 535 | /* Mezz cards have PCI function 0,2,3 enabled */ |
| 533 | if ((adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) | 536 | switch (adapter->ahw.boardcfg.board_type) { |
| 534 | && (pci_func_id >= 2)) | 537 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: |
| 538 | case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: | ||
| 539 | if (pci_func_id >= 2) | ||
| 535 | adapter->portnum = pci_func_id - 2; | 540 | adapter->portnum = pci_func_id - 2; |
| 536 | 541 | break; | |
| 537 | #ifdef CONFIG_IA64 | 542 | default: |
| 538 | if(adapter->portnum == 0) { | 543 | break; |
| 539 | netxen_pinit_from_rom(adapter, 0); | ||
| 540 | udelay(500); | ||
| 541 | netxen_load_firmware(adapter); | ||
| 542 | } | 544 | } |
| 543 | #endif | ||
| 544 | 545 | ||
| 545 | init_timer(&adapter->watchdog_timer); | 546 | init_timer(&adapter->watchdog_timer); |
| 546 | adapter->ahw.xg_linkup = 0; | 547 | adapter->ahw.xg_linkup = 0; |
| @@ -613,11 +614,18 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 613 | err = -ENODEV; | 614 | err = -ENODEV; |
| 614 | goto err_out_free_dev; | 615 | goto err_out_free_dev; |
| 615 | } | 616 | } |
| 617 | } else { | ||
| 618 | writel(0, NETXEN_CRB_NORMALIZE(adapter, | ||
| 619 | CRB_CMDPEG_STATE)); | ||
| 620 | netxen_pinit_from_rom(adapter, 0); | ||
| 621 | msleep(1); | ||
| 622 | netxen_load_firmware(adapter); | ||
| 623 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
| 616 | } | 624 | } |
| 617 | 625 | ||
| 618 | /* clear the register for future unloads/loads */ | 626 | /* clear the register for future unloads/loads */ |
| 619 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | 627 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); |
| 620 | printk(KERN_INFO "State: 0x%0x\n", | 628 | dev_info(&pdev->dev, "cmdpeg state: 0x%0x\n", |
| 621 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | 629 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); |
| 622 | 630 | ||
| 623 | /* | 631 | /* |
| @@ -639,9 +647,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 639 | /* | 647 | /* |
| 640 | * See if the firmware gave us a virtual-physical port mapping. | 648 | * See if the firmware gave us a virtual-physical port mapping. |
| 641 | */ | 649 | */ |
| 650 | adapter->physical_port = adapter->portnum; | ||
| 642 | i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); | 651 | i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); |
| 643 | if (i != 0x55555555) | 652 | if (i != 0x55555555) |
| 644 | physical_port[adapter->portnum] = i; | 653 | adapter->physical_port = i; |
| 645 | 654 | ||
| 646 | netif_carrier_off(netdev); | 655 | netif_carrier_off(netdev); |
| 647 | netif_stop_queue(netdev); | 656 | netif_stop_queue(netdev); |
| @@ -654,22 +663,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 654 | goto err_out_free_dev; | 663 | goto err_out_free_dev; |
| 655 | } | 664 | } |
| 656 | 665 | ||
| 666 | netxen_nic_flash_print(adapter); | ||
| 657 | pci_set_drvdata(pdev, adapter); | 667 | pci_set_drvdata(pdev, adapter); |
| 658 | 668 | ||
| 659 | switch (adapter->ahw.board_type) { | ||
| 660 | case NETXEN_NIC_GBE: | ||
| 661 | printk(KERN_INFO "%s: QUAD GbE board initialized\n", | ||
| 662 | netxen_nic_driver_name); | ||
| 663 | break; | ||
| 664 | |||
| 665 | case NETXEN_NIC_XGBE: | ||
| 666 | printk(KERN_INFO "%s: XGbE board initialized\n", | ||
| 667 | netxen_nic_driver_name); | ||
| 668 | break; | ||
| 669 | } | ||
| 670 | |||
| 671 | adapter->driver_mismatch = 0; | ||
| 672 | |||
| 673 | return 0; | 669 | return 0; |
| 674 | 670 | ||
| 675 | err_out_free_dev: | 671 | err_out_free_dev: |
| @@ -760,55 +756,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
| 760 | 756 | ||
| 761 | vfree(adapter->cmd_buf_arr); | 757 | vfree(adapter->cmd_buf_arr); |
| 762 | 758 | ||
| 763 | if (adapter->portnum == 0) { | 759 | if (adapter->portnum == 0) |
| 764 | if (init_firmware_done) { | 760 | netxen_free_adapter_offload(adapter); |
| 765 | i = 100; | ||
| 766 | do { | ||
| 767 | if (dma_watchdog_shutdown_request(adapter) == 1) | ||
| 768 | break; | ||
| 769 | msleep(100); | ||
| 770 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | ||
| 771 | break; | ||
| 772 | } while (--i); | ||
| 773 | |||
| 774 | if (i == 0) | ||
| 775 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | ||
| 776 | netdev->name); | ||
| 777 | |||
| 778 | /* clear the register for future unloads/loads */ | ||
| 779 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | ||
| 780 | printk(KERN_INFO "State: 0x%0x\n", | ||
| 781 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | ||
| 782 | |||
| 783 | /* leave the hw in the same state as reboot */ | ||
| 784 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | ||
| 785 | netxen_pinit_from_rom(adapter, 0); | ||
| 786 | msleep(1); | ||
| 787 | netxen_load_firmware(adapter); | ||
| 788 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
| 789 | } | ||
| 790 | |||
| 791 | /* clear the register for future unloads/loads */ | ||
| 792 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | ||
| 793 | printk(KERN_INFO "State: 0x%0x\n", | ||
| 794 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | ||
| 795 | |||
| 796 | i = 100; | ||
| 797 | do { | ||
| 798 | if (dma_watchdog_shutdown_request(adapter) == 1) | ||
| 799 | break; | ||
| 800 | msleep(100); | ||
| 801 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | ||
| 802 | break; | ||
| 803 | } while (--i); | ||
| 804 | |||
| 805 | if (i) { | ||
| 806 | netxen_free_adapter_offload(adapter); | ||
| 807 | } else { | ||
| 808 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | ||
| 809 | netdev->name); | ||
| 810 | } | ||
| 811 | } | ||
| 812 | 761 | ||
| 813 | if (adapter->irq) | 762 | if (adapter->irq) |
| 814 | free_irq(adapter->irq, adapter); | 763 | free_irq(adapter->irq, adapter); |
| @@ -840,13 +789,15 @@ static int netxen_nic_open(struct net_device *netdev) | |||
| 840 | irq_handler_t handler; | 789 | irq_handler_t handler; |
| 841 | unsigned long flags = IRQF_SAMPLE_RANDOM; | 790 | unsigned long flags = IRQF_SAMPLE_RANDOM; |
| 842 | 791 | ||
| 792 | if (adapter->driver_mismatch) | ||
| 793 | return -EIO; | ||
| 794 | |||
| 843 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { | 795 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { |
| 844 | err = netxen_init_firmware(adapter); | 796 | err = netxen_init_firmware(adapter); |
| 845 | if (err != 0) { | 797 | if (err != 0) { |
| 846 | printk(KERN_ERR "Failed to init firmware\n"); | 798 | printk(KERN_ERR "Failed to init firmware\n"); |
| 847 | return -EIO; | 799 | return -EIO; |
| 848 | } | 800 | } |
| 849 | netxen_nic_flash_print(adapter); | ||
| 850 | 801 | ||
| 851 | /* setup all the resources for the Phantom... */ | 802 | /* setup all the resources for the Phantom... */ |
| 852 | /* this include the descriptors for rcv, tx, and status */ | 803 | /* this include the descriptors for rcv, tx, and status */ |
| @@ -895,14 +846,12 @@ static int netxen_nic_open(struct net_device *netdev) | |||
| 895 | if (adapter->set_mtu) | 846 | if (adapter->set_mtu) |
| 896 | adapter->set_mtu(adapter, netdev->mtu); | 847 | adapter->set_mtu(adapter, netdev->mtu); |
| 897 | 848 | ||
| 898 | if (!adapter->driver_mismatch) | 849 | mod_timer(&adapter->watchdog_timer, jiffies); |
| 899 | mod_timer(&adapter->watchdog_timer, jiffies); | ||
| 900 | 850 | ||
| 901 | napi_enable(&adapter->napi); | 851 | napi_enable(&adapter->napi); |
| 902 | netxen_nic_enable_int(adapter); | 852 | netxen_nic_enable_int(adapter); |
| 903 | 853 | ||
| 904 | if (!adapter->driver_mismatch) | 854 | netif_start_queue(netdev); |
| 905 | netif_start_queue(netdev); | ||
| 906 | 855 | ||
| 907 | return 0; | 856 | return 0; |
| 908 | } | 857 | } |
diff --git a/drivers/net/netxen/netxen_nic_niu.c b/drivers/net/netxen/netxen_nic_niu.c index 1c852a76c80d..a3bc7cc67a6f 100644 --- a/drivers/net/netxen/netxen_nic_niu.c +++ b/drivers/net/netxen/netxen_nic_niu.c | |||
| @@ -94,7 +94,7 @@ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg, | |||
| 94 | long timeout = 0; | 94 | long timeout = 0; |
| 95 | long result = 0; | 95 | long result = 0; |
| 96 | long restore = 0; | 96 | long restore = 0; |
| 97 | long phy = physical_port[adapter->portnum]; | 97 | long phy = adapter->physical_port; |
| 98 | __u32 address; | 98 | __u32 address; |
| 99 | __u32 command; | 99 | __u32 command; |
| 100 | __u32 status; | 100 | __u32 status; |
| @@ -190,7 +190,7 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long reg, | |||
| 190 | long timeout = 0; | 190 | long timeout = 0; |
| 191 | long result = 0; | 191 | long result = 0; |
| 192 | long restore = 0; | 192 | long restore = 0; |
| 193 | long phy = physical_port[adapter->portnum]; | 193 | long phy = adapter->physical_port; |
| 194 | __u32 address; | 194 | __u32 address; |
| 195 | __u32 command; | 195 | __u32 command; |
| 196 | __u32 status; | 196 | __u32 status; |
| @@ -456,7 +456,7 @@ int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port) | |||
| 456 | 456 | ||
| 457 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) | 457 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port) |
| 458 | { | 458 | { |
| 459 | u32 portnum = physical_port[adapter->portnum]; | 459 | u32 portnum = adapter->physical_port; |
| 460 | 460 | ||
| 461 | netxen_crb_writelit_adapter(adapter, | 461 | netxen_crb_writelit_adapter(adapter, |
| 462 | NETXEN_NIU_XGE_CONFIG_1+(0x10000*portnum), 0x1447); | 462 | NETXEN_NIU_XGE_CONFIG_1+(0x10000*portnum), 0x1447); |
| @@ -573,7 +573,7 @@ static int netxen_niu_macaddr_get(struct netxen_adapter *adapter, | |||
| 573 | { | 573 | { |
| 574 | u32 stationhigh; | 574 | u32 stationhigh; |
| 575 | u32 stationlow; | 575 | u32 stationlow; |
| 576 | int phy = physical_port[adapter->portnum]; | 576 | int phy = adapter->physical_port; |
| 577 | u8 val[8]; | 577 | u8 val[8]; |
| 578 | 578 | ||
| 579 | if (addr == NULL) | 579 | if (addr == NULL) |
| @@ -604,7 +604,7 @@ int netxen_niu_macaddr_set(struct netxen_adapter *adapter, | |||
| 604 | { | 604 | { |
| 605 | u8 temp[4]; | 605 | u8 temp[4]; |
| 606 | u32 val; | 606 | u32 val; |
| 607 | int phy = physical_port[adapter->portnum]; | 607 | int phy = adapter->physical_port; |
| 608 | unsigned char mac_addr[6]; | 608 | unsigned char mac_addr[6]; |
| 609 | int i; | 609 | int i; |
| 610 | DECLARE_MAC_BUF(mac); | 610 | DECLARE_MAC_BUF(mac); |
| @@ -724,7 +724,7 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter, | |||
| 724 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) | 724 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) |
| 725 | { | 725 | { |
| 726 | __u32 mac_cfg0; | 726 | __u32 mac_cfg0; |
| 727 | u32 port = physical_port[adapter->portnum]; | 727 | u32 port = adapter->physical_port; |
| 728 | 728 | ||
| 729 | if (port > NETXEN_NIU_MAX_GBE_PORTS) | 729 | if (port > NETXEN_NIU_MAX_GBE_PORTS) |
| 730 | return -EINVAL; | 730 | return -EINVAL; |
| @@ -740,7 +740,7 @@ int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) | |||
| 740 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) | 740 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) |
| 741 | { | 741 | { |
| 742 | __u32 mac_cfg; | 742 | __u32 mac_cfg; |
| 743 | u32 port = physical_port[adapter->portnum]; | 743 | u32 port = adapter->physical_port; |
| 744 | 744 | ||
| 745 | if (port > NETXEN_NIU_MAX_XG_PORTS) | 745 | if (port > NETXEN_NIU_MAX_XG_PORTS) |
| 746 | return -EINVAL; | 746 | return -EINVAL; |
| @@ -757,7 +757,7 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, | |||
| 757 | netxen_niu_prom_mode_t mode) | 757 | netxen_niu_prom_mode_t mode) |
| 758 | { | 758 | { |
| 759 | __u32 reg; | 759 | __u32 reg; |
| 760 | u32 port = physical_port[adapter->portnum]; | 760 | u32 port = adapter->physical_port; |
| 761 | 761 | ||
| 762 | if (port > NETXEN_NIU_MAX_GBE_PORTS) | 762 | if (port > NETXEN_NIU_MAX_GBE_PORTS) |
| 763 | return -EINVAL; | 763 | return -EINVAL; |
| @@ -814,7 +814,7 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, | |||
| 814 | int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, | 814 | int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, |
| 815 | netxen_ethernet_macaddr_t addr) | 815 | netxen_ethernet_macaddr_t addr) |
| 816 | { | 816 | { |
| 817 | int phy = physical_port[adapter->portnum]; | 817 | int phy = adapter->physical_port; |
| 818 | u8 temp[4]; | 818 | u8 temp[4]; |
| 819 | u32 val; | 819 | u32 val; |
| 820 | 820 | ||
| @@ -867,7 +867,7 @@ int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, | |||
| 867 | int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, | 867 | int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, |
| 868 | netxen_ethernet_macaddr_t * addr) | 868 | netxen_ethernet_macaddr_t * addr) |
| 869 | { | 869 | { |
| 870 | int phy = physical_port[adapter->portnum]; | 870 | int phy = adapter->physical_port; |
| 871 | u32 stationhigh; | 871 | u32 stationhigh; |
| 872 | u32 stationlow; | 872 | u32 stationlow; |
| 873 | u8 val[8]; | 873 | u8 val[8]; |
| @@ -896,7 +896,7 @@ int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, | |||
| 896 | netxen_niu_prom_mode_t mode) | 896 | netxen_niu_prom_mode_t mode) |
| 897 | { | 897 | { |
| 898 | __u32 reg; | 898 | __u32 reg; |
| 899 | u32 port = physical_port[adapter->portnum]; | 899 | u32 port = adapter->physical_port; |
| 900 | 900 | ||
| 901 | if (port > NETXEN_NIU_MAX_XG_PORTS) | 901 | if (port > NETXEN_NIU_MAX_XG_PORTS) |
| 902 | return -EINVAL; | 902 | return -EINVAL; |
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 58a26a47af29..bafb69b6f7cb 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
| @@ -341,12 +341,6 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb) | |||
| 341 | struct pppox_sock *relay_po; | 341 | struct pppox_sock *relay_po; |
| 342 | 342 | ||
| 343 | if (sk->sk_state & PPPOX_BOUND) { | 343 | if (sk->sk_state & PPPOX_BOUND) { |
| 344 | struct pppoe_hdr *ph = pppoe_hdr(skb); | ||
| 345 | int len = ntohs(ph->length); | ||
| 346 | skb_pull_rcsum(skb, sizeof(struct pppoe_hdr)); | ||
| 347 | if (pskb_trim_rcsum(skb, len)) | ||
| 348 | goto abort_kfree; | ||
| 349 | |||
| 350 | ppp_input(&po->chan, skb); | 344 | ppp_input(&po->chan, skb); |
| 351 | } else if (sk->sk_state & PPPOX_RELAY) { | 345 | } else if (sk->sk_state & PPPOX_RELAY) { |
| 352 | relay_po = get_item_by_addr(&po->pppoe_relay); | 346 | relay_po = get_item_by_addr(&po->pppoe_relay); |
| @@ -357,7 +351,6 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb) | |||
| 357 | if ((sk_pppox(relay_po)->sk_state & PPPOX_CONNECTED) == 0) | 351 | if ((sk_pppox(relay_po)->sk_state & PPPOX_CONNECTED) == 0) |
| 358 | goto abort_put; | 352 | goto abort_put; |
| 359 | 353 | ||
| 360 | skb_pull(skb, sizeof(struct pppoe_hdr)); | ||
| 361 | if (!__pppoe_xmit(sk_pppox(relay_po), skb)) | 354 | if (!__pppoe_xmit(sk_pppox(relay_po), skb)) |
| 362 | goto abort_put; | 355 | goto abort_put; |
| 363 | } else { | 356 | } else { |
| @@ -388,6 +381,7 @@ static int pppoe_rcv(struct sk_buff *skb, | |||
| 388 | { | 381 | { |
| 389 | struct pppoe_hdr *ph; | 382 | struct pppoe_hdr *ph; |
| 390 | struct pppox_sock *po; | 383 | struct pppox_sock *po; |
| 384 | int len; | ||
| 391 | 385 | ||
| 392 | if (!(skb = skb_share_check(skb, GFP_ATOMIC))) | 386 | if (!(skb = skb_share_check(skb, GFP_ATOMIC))) |
| 393 | goto out; | 387 | goto out; |
| @@ -399,10 +393,21 @@ static int pppoe_rcv(struct sk_buff *skb, | |||
| 399 | goto drop; | 393 | goto drop; |
| 400 | 394 | ||
| 401 | ph = pppoe_hdr(skb); | 395 | ph = pppoe_hdr(skb); |
| 396 | len = ntohs(ph->length); | ||
| 397 | |||
| 398 | skb_pull_rcsum(skb, sizeof(*ph)); | ||
| 399 | if (skb->len < len) | ||
| 400 | goto drop; | ||
| 402 | 401 | ||
| 403 | po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex); | 402 | po = get_item(ph->sid, eth_hdr(skb)->h_source, dev->ifindex); |
| 404 | if (po != NULL) | 403 | if (!po) |
| 405 | return sk_receive_skb(sk_pppox(po), skb, 0); | 404 | goto drop; |
| 405 | |||
| 406 | if (pskb_trim_rcsum(skb, len)) | ||
| 407 | goto drop; | ||
| 408 | |||
| 409 | return sk_receive_skb(sk_pppox(po), skb, 0); | ||
| 410 | |||
| 406 | drop: | 411 | drop: |
| 407 | kfree_skb(skb); | 412 | kfree_skb(skb); |
| 408 | out: | 413 | out: |
| @@ -427,12 +432,12 @@ static int pppoe_disc_rcv(struct sk_buff *skb, | |||
| 427 | if (dev_net(dev) != &init_net) | 432 | if (dev_net(dev) != &init_net) |
| 428 | goto abort; | 433 | goto abort; |
| 429 | 434 | ||
| 430 | if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr))) | ||
| 431 | goto abort; | ||
| 432 | |||
| 433 | if (!(skb = skb_share_check(skb, GFP_ATOMIC))) | 435 | if (!(skb = skb_share_check(skb, GFP_ATOMIC))) |
| 434 | goto out; | 436 | goto out; |
| 435 | 437 | ||
| 438 | if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr))) | ||
| 439 | goto abort; | ||
| 440 | |||
| 436 | ph = pppoe_hdr(skb); | 441 | ph = pppoe_hdr(skb); |
| 437 | if (ph->code != PADT_CODE) | 442 | if (ph->code != PADT_CODE) |
| 438 | goto abort; | 443 | goto abort; |
| @@ -937,12 +942,10 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 937 | m->msg_namelen = 0; | 942 | m->msg_namelen = 0; |
| 938 | 943 | ||
| 939 | if (skb) { | 944 | if (skb) { |
| 940 | struct pppoe_hdr *ph = pppoe_hdr(skb); | 945 | total_len = min(total_len, skb->len); |
| 941 | const int len = ntohs(ph->length); | 946 | error = skb_copy_datagram_iovec(skb, 0, m->msg_iov, total_len); |
| 942 | |||
| 943 | error = memcpy_toiovec(m->msg_iov, (unsigned char *) &ph->tag[0], len); | ||
| 944 | if (error == 0) | 947 | if (error == 0) |
| 945 | error = len; | 948 | error = total_len; |
| 946 | } | 949 | } |
| 947 | 950 | ||
| 948 | kfree_skb(skb); | 951 | kfree_skb(skb); |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 70cfdb46aa27..f9298827a76c 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
| @@ -783,14 +783,18 @@ static int pppol2tp_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 783 | err = 0; | 783 | err = 0; |
| 784 | skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, | 784 | skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, |
| 785 | flags & MSG_DONTWAIT, &err); | 785 | flags & MSG_DONTWAIT, &err); |
| 786 | if (skb) { | 786 | if (!skb) |
| 787 | err = memcpy_toiovec(msg->msg_iov, (unsigned char *) skb->data, | 787 | goto end; |
| 788 | skb->len); | 788 | |
| 789 | if (err < 0) | 789 | if (len > skb->len) |
| 790 | goto do_skb_free; | 790 | len = skb->len; |
| 791 | err = skb->len; | 791 | else if (len < skb->len) |
| 792 | } | 792 | msg->msg_flags |= MSG_TRUNC; |
| 793 | do_skb_free: | 793 | |
| 794 | err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, len); | ||
| 795 | if (likely(err == 0)) | ||
| 796 | err = len; | ||
| 797 | |||
| 794 | kfree_skb(skb); | 798 | kfree_skb(skb); |
| 795 | end: | 799 | end: |
| 796 | return err; | 800 | return err; |
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 169edc154928..858b191517b3 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
| @@ -733,7 +733,7 @@ static void r6040_timer(unsigned long data) | |||
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | /* Timer active again */ | 735 | /* Timer active again */ |
| 736 | mod_timer(&lp->timer, jiffies + round_jiffies(HZ)); | 736 | mod_timer(&lp->timer, round_jiffies(jiffies + HZ)); |
| 737 | } | 737 | } |
| 738 | 738 | ||
| 739 | /* Read/set MAC address routines */ | 739 | /* Read/set MAC address routines */ |
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index d3f749c72d41..790db89db345 100644 --- a/drivers/net/sfc/falcon.c +++ b/drivers/net/sfc/falcon.c | |||
| @@ -733,8 +733,10 @@ void falcon_fini_rx(struct efx_rx_queue *rx_queue) | |||
| 733 | continue; | 733 | continue; |
| 734 | break; | 734 | break; |
| 735 | } | 735 | } |
| 736 | if (rc) | 736 | if (rc) { |
| 737 | EFX_ERR(efx, "failed to flush rx queue %d\n", rx_queue->queue); | 737 | EFX_ERR(efx, "failed to flush rx queue %d\n", rx_queue->queue); |
| 738 | efx_schedule_reset(efx, RESET_TYPE_INVISIBLE); | ||
| 739 | } | ||
| 738 | 740 | ||
| 739 | /* Remove RX descriptor ring from card */ | 741 | /* Remove RX descriptor ring from card */ |
| 740 | EFX_ZERO_OWORD(rx_desc_ptr); | 742 | EFX_ZERO_OWORD(rx_desc_ptr); |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 3bb60530d4d7..c8a5ef2d75f4 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -118,6 +118,7 @@ static const struct pci_device_id sky2_id_table[] = { | |||
| 118 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ | 118 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ |
| 119 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ | 119 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ |
| 120 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */ | 120 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */ |
| 121 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4355) }, /* 88E8040T */ | ||
| 121 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ | 122 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ |
| 122 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4357) }, /* 88E8042 */ | 123 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4357) }, /* 88E8042 */ |
| 123 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */ | 124 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */ |
| @@ -4404,7 +4405,9 @@ static int sky2_resume(struct pci_dev *pdev) | |||
| 4404 | if (err) { | 4405 | if (err) { |
| 4405 | printk(KERN_ERR PFX "%s: could not up: %d\n", | 4406 | printk(KERN_ERR PFX "%s: could not up: %d\n", |
| 4406 | dev->name, err); | 4407 | dev->name, err); |
| 4408 | rtnl_lock(); | ||
| 4407 | dev_close(dev); | 4409 | dev_close(dev); |
| 4410 | rtnl_unlock(); | ||
| 4408 | goto out; | 4411 | goto out; |
| 4409 | } | 4412 | } |
| 4410 | } | 4413 | } |
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 4e2800205189..e2ee91a6ae7e 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c | |||
| @@ -136,7 +136,6 @@ struct smc911x_local { | |||
| 136 | 136 | ||
| 137 | /* work queue */ | 137 | /* work queue */ |
| 138 | struct work_struct phy_configure; | 138 | struct work_struct phy_configure; |
| 139 | int work_pending; | ||
| 140 | 139 | ||
| 141 | int tx_throttle; | 140 | int tx_throttle; |
| 142 | spinlock_t lock; | 141 | spinlock_t lock; |
| @@ -960,11 +959,11 @@ static void smc911x_phy_configure(struct work_struct *work) | |||
| 960 | * We should not be called if phy_type is zero. | 959 | * We should not be called if phy_type is zero. |
| 961 | */ | 960 | */ |
| 962 | if (lp->phy_type == 0) | 961 | if (lp->phy_type == 0) |
| 963 | goto smc911x_phy_configure_exit_nolock; | 962 | return; |
| 964 | 963 | ||
| 965 | if (smc911x_phy_reset(dev, phyaddr)) { | 964 | if (smc911x_phy_reset(dev, phyaddr)) { |
| 966 | printk("%s: PHY reset timed out\n", dev->name); | 965 | printk("%s: PHY reset timed out\n", dev->name); |
| 967 | goto smc911x_phy_configure_exit_nolock; | 966 | return; |
| 968 | } | 967 | } |
| 969 | spin_lock_irqsave(&lp->lock, flags); | 968 | spin_lock_irqsave(&lp->lock, flags); |
| 970 | 969 | ||
| @@ -1033,8 +1032,6 @@ static void smc911x_phy_configure(struct work_struct *work) | |||
| 1033 | 1032 | ||
| 1034 | smc911x_phy_configure_exit: | 1033 | smc911x_phy_configure_exit: |
| 1035 | spin_unlock_irqrestore(&lp->lock, flags); | 1034 | spin_unlock_irqrestore(&lp->lock, flags); |
| 1036 | smc911x_phy_configure_exit_nolock: | ||
| 1037 | lp->work_pending = 0; | ||
| 1038 | } | 1035 | } |
| 1039 | 1036 | ||
| 1040 | /* | 1037 | /* |
| @@ -1356,11 +1353,8 @@ static void smc911x_timeout(struct net_device *dev) | |||
| 1356 | * smc911x_phy_configure() calls msleep() which calls schedule_timeout() | 1353 | * smc911x_phy_configure() calls msleep() which calls schedule_timeout() |
| 1357 | * which calls schedule(). Hence we use a work queue. | 1354 | * which calls schedule(). Hence we use a work queue. |
| 1358 | */ | 1355 | */ |
| 1359 | if (lp->phy_type != 0) { | 1356 | if (lp->phy_type != 0) |
| 1360 | if (schedule_work(&lp->phy_configure)) { | 1357 | schedule_work(&lp->phy_configure); |
| 1361 | lp->work_pending = 1; | ||
| 1362 | } | ||
| 1363 | } | ||
| 1364 | 1358 | ||
| 1365 | /* We can accept TX packets again */ | 1359 | /* We can accept TX packets again */ |
| 1366 | dev->trans_start = jiffies; | 1360 | dev->trans_start = jiffies; |
| @@ -1531,16 +1525,8 @@ static int smc911x_close(struct net_device *dev) | |||
| 1531 | if (lp->phy_type != 0) { | 1525 | if (lp->phy_type != 0) { |
| 1532 | /* We need to ensure that no calls to | 1526 | /* We need to ensure that no calls to |
| 1533 | * smc911x_phy_configure are pending. | 1527 | * smc911x_phy_configure are pending. |
| 1534 | |||
| 1535 | * flush_scheduled_work() cannot be called because we | ||
| 1536 | * are running with the netlink semaphore held (from | ||
| 1537 | * devinet_ioctl()) and the pending work queue | ||
| 1538 | * contains linkwatch_event() (scheduled by | ||
| 1539 | * netif_carrier_off() above). linkwatch_event() also | ||
| 1540 | * wants the netlink semaphore. | ||
| 1541 | */ | 1528 | */ |
| 1542 | while (lp->work_pending) | 1529 | cancel_work_sync(&lp->phy_configure); |
| 1543 | schedule(); | ||
| 1544 | smc911x_phy_powerdown(dev, lp->mii.phy_id); | 1530 | smc911x_phy_powerdown(dev, lp->mii.phy_id); |
| 1545 | } | 1531 | } |
| 1546 | 1532 | ||
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index a188e33484e6..f2051b209da2 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
| @@ -1016,15 +1016,8 @@ static void smc_phy_powerdown(struct net_device *dev) | |||
| 1016 | 1016 | ||
| 1017 | /* We need to ensure that no calls to smc_phy_configure are | 1017 | /* We need to ensure that no calls to smc_phy_configure are |
| 1018 | pending. | 1018 | pending. |
| 1019 | |||
| 1020 | flush_scheduled_work() cannot be called because we are | ||
| 1021 | running with the netlink semaphore held (from | ||
| 1022 | devinet_ioctl()) and the pending work queue contains | ||
| 1023 | linkwatch_event() (scheduled by netif_carrier_off() | ||
| 1024 | above). linkwatch_event() also wants the netlink semaphore. | ||
| 1025 | */ | 1019 | */ |
| 1026 | while(lp->work_pending) | 1020 | cancel_work_sync(&lp->phy_configure); |
| 1027 | yield(); | ||
| 1028 | 1021 | ||
| 1029 | bmcr = smc_phy_read(dev, phy, MII_BMCR); | 1022 | bmcr = smc_phy_read(dev, phy, MII_BMCR); |
| 1030 | smc_phy_write(dev, phy, MII_BMCR, bmcr | BMCR_PDOWN); | 1023 | smc_phy_write(dev, phy, MII_BMCR, bmcr | BMCR_PDOWN); |
| @@ -1161,7 +1154,6 @@ static void smc_phy_configure(struct work_struct *work) | |||
| 1161 | smc_phy_configure_exit: | 1154 | smc_phy_configure_exit: |
| 1162 | SMC_SELECT_BANK(lp, 2); | 1155 | SMC_SELECT_BANK(lp, 2); |
| 1163 | spin_unlock_irq(&lp->lock); | 1156 | spin_unlock_irq(&lp->lock); |
| 1164 | lp->work_pending = 0; | ||
| 1165 | } | 1157 | } |
| 1166 | 1158 | ||
| 1167 | /* | 1159 | /* |
| @@ -1389,11 +1381,8 @@ static void smc_timeout(struct net_device *dev) | |||
| 1389 | * smc_phy_configure() calls msleep() which calls schedule_timeout() | 1381 | * smc_phy_configure() calls msleep() which calls schedule_timeout() |
| 1390 | * which calls schedule(). Hence we use a work queue. | 1382 | * which calls schedule(). Hence we use a work queue. |
| 1391 | */ | 1383 | */ |
| 1392 | if (lp->phy_type != 0) { | 1384 | if (lp->phy_type != 0) |
| 1393 | if (schedule_work(&lp->phy_configure)) { | 1385 | schedule_work(&lp->phy_configure); |
| 1394 | lp->work_pending = 1; | ||
| 1395 | } | ||
| 1396 | } | ||
| 1397 | 1386 | ||
| 1398 | /* We can accept TX packets again */ | 1387 | /* We can accept TX packets again */ |
| 1399 | dev->trans_start = jiffies; | 1388 | dev->trans_start = jiffies; |
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 69e97a1cb1c4..8606818653f8 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h | |||
| @@ -93,14 +93,14 @@ | |||
| 93 | #define SMC_insw(a, r, p, l) insw ((unsigned long *)((a) + (r)), p, l) | 93 | #define SMC_insw(a, r, p, l) insw ((unsigned long *)((a) + (r)), p, l) |
| 94 | # endif | 94 | # endif |
| 95 | /* check if the mac in reg is valid */ | 95 | /* check if the mac in reg is valid */ |
| 96 | #define SMC_GET_MAC_ADDR(addr) \ | 96 | #define SMC_GET_MAC_ADDR(lp, addr) \ |
| 97 | do { \ | 97 | do { \ |
| 98 | unsigned int __v; \ | 98 | unsigned int __v; \ |
| 99 | __v = SMC_inw(ioaddr, ADDR0_REG); \ | 99 | __v = SMC_inw(ioaddr, ADDR0_REG(lp)); \ |
| 100 | addr[0] = __v; addr[1] = __v >> 8; \ | 100 | addr[0] = __v; addr[1] = __v >> 8; \ |
| 101 | __v = SMC_inw(ioaddr, ADDR1_REG); \ | 101 | __v = SMC_inw(ioaddr, ADDR1_REG(lp)); \ |
| 102 | addr[2] = __v; addr[3] = __v >> 8; \ | 102 | addr[2] = __v; addr[3] = __v >> 8; \ |
| 103 | __v = SMC_inw(ioaddr, ADDR2_REG); \ | 103 | __v = SMC_inw(ioaddr, ADDR2_REG(lp)); \ |
| 104 | addr[4] = __v; addr[5] = __v >> 8; \ | 104 | addr[4] = __v; addr[5] = __v >> 8; \ |
| 105 | if (*(u32 *)(&addr[0]) == 0xFFFFFFFF) { \ | 105 | if (*(u32 *)(&addr[0]) == 0xFFFFFFFF) { \ |
| 106 | random_ether_addr(addr); \ | 106 | random_ether_addr(addr); \ |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 07b3f77e7626..cc4bde852542 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -64,8 +64,8 @@ | |||
| 64 | 64 | ||
| 65 | #define DRV_MODULE_NAME "tg3" | 65 | #define DRV_MODULE_NAME "tg3" |
| 66 | #define PFX DRV_MODULE_NAME ": " | 66 | #define PFX DRV_MODULE_NAME ": " |
| 67 | #define DRV_MODULE_VERSION "3.92" | 67 | #define DRV_MODULE_VERSION "3.92.1" |
| 68 | #define DRV_MODULE_RELDATE "May 2, 2008" | 68 | #define DRV_MODULE_RELDATE "June 9, 2008" |
| 69 | 69 | ||
| 70 | #define TG3_DEF_MAC_MODE 0 | 70 | #define TG3_DEF_MAC_MODE 0 |
| 71 | #define TG3_DEF_RX_MODE 0 | 71 | #define TG3_DEF_RX_MODE 0 |
| @@ -1295,6 +1295,21 @@ static void tg3_frob_aux_power(struct tg3 *tp) | |||
| 1295 | GRC_LCLCTRL_GPIO_OUTPUT0 | | 1295 | GRC_LCLCTRL_GPIO_OUTPUT0 | |
| 1296 | GRC_LCLCTRL_GPIO_OUTPUT1), | 1296 | GRC_LCLCTRL_GPIO_OUTPUT1), |
| 1297 | 100); | 1297 | 100); |
| 1298 | } else if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761) { | ||
| 1299 | /* The 5761 non-e device swaps GPIO 0 and GPIO 2. */ | ||
| 1300 | u32 grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 | | ||
| 1301 | GRC_LCLCTRL_GPIO_OE1 | | ||
| 1302 | GRC_LCLCTRL_GPIO_OE2 | | ||
| 1303 | GRC_LCLCTRL_GPIO_OUTPUT0 | | ||
| 1304 | GRC_LCLCTRL_GPIO_OUTPUT1 | | ||
| 1305 | tp->grc_local_ctrl; | ||
| 1306 | tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl, 100); | ||
| 1307 | |||
| 1308 | grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT2; | ||
| 1309 | tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl, 100); | ||
| 1310 | |||
| 1311 | grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT0; | ||
| 1312 | tw32_wait_f(GRC_LOCAL_CTRL, grc_local_ctrl, 100); | ||
| 1298 | } else { | 1313 | } else { |
| 1299 | u32 no_gpio2; | 1314 | u32 no_gpio2; |
| 1300 | u32 grc_local_ctrl = 0; | 1315 | u32 grc_local_ctrl = 0; |
| @@ -3168,8 +3183,7 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset) | |||
| 3168 | err |= tg3_readphy(tp, MII_BMCR, &bmcr); | 3183 | err |= tg3_readphy(tp, MII_BMCR, &bmcr); |
| 3169 | 3184 | ||
| 3170 | if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset && | 3185 | if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset && |
| 3171 | (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT) && | 3186 | (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT)) { |
| 3172 | tp->link_config.flowctrl == tp->link_config.active_flowctrl) { | ||
| 3173 | /* do nothing, just check for link up at the end */ | 3187 | /* do nothing, just check for link up at the end */ |
| 3174 | } else if (tp->link_config.autoneg == AUTONEG_ENABLE) { | 3188 | } else if (tp->link_config.autoneg == AUTONEG_ENABLE) { |
| 3175 | u32 adv, new_adv; | 3189 | u32 adv, new_adv; |
| @@ -8599,7 +8613,7 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 8599 | (cmd->speed == SPEED_1000)) | 8613 | (cmd->speed == SPEED_1000)) |
| 8600 | return -EINVAL; | 8614 | return -EINVAL; |
| 8601 | else if ((cmd->speed == SPEED_1000) && | 8615 | else if ((cmd->speed == SPEED_1000) && |
| 8602 | (tp->tg3_flags2 & TG3_FLAG_10_100_ONLY)) | 8616 | (tp->tg3_flags & TG3_FLAG_10_100_ONLY)) |
| 8603 | return -EINVAL; | 8617 | return -EINVAL; |
| 8604 | 8618 | ||
| 8605 | tg3_full_lock(tp, 0); | 8619 | tg3_full_lock(tp, 0); |
| @@ -11768,6 +11782,15 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
| 11768 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) | 11782 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) |
| 11769 | tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; | 11783 | tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; |
| 11770 | 11784 | ||
| 11785 | if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761) { | ||
| 11786 | /* Turn off the debug UART. */ | ||
| 11787 | tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL; | ||
| 11788 | if (tp->tg3_flags2 & TG3_FLG2_IS_NIC) | ||
| 11789 | /* Keep VMain power. */ | ||
| 11790 | tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 | | ||
| 11791 | GRC_LCLCTRL_GPIO_OUTPUT0; | ||
| 11792 | } | ||
| 11793 | |||
| 11771 | /* Force the chip into D0. */ | 11794 | /* Force the chip into D0. */ |
| 11772 | err = tg3_set_power_state(tp, PCI_D0); | 11795 | err = tg3_set_power_state(tp, PCI_D0); |
| 11773 | if (err) { | 11796 | if (err) { |
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index 55670b5eb611..af8d2c436efd 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c | |||
| @@ -731,7 +731,7 @@ static void tulip_down (struct net_device *dev) | |||
| 731 | void __iomem *ioaddr = tp->base_addr; | 731 | void __iomem *ioaddr = tp->base_addr; |
| 732 | unsigned long flags; | 732 | unsigned long flags; |
| 733 | 733 | ||
| 734 | flush_scheduled_work(); | 734 | cancel_work_sync(&tp->media_work); |
| 735 | 735 | ||
| 736 | #ifdef CONFIG_TULIP_NAPI | 736 | #ifdef CONFIG_TULIP_NAPI |
| 737 | napi_disable(&tp->napi); | 737 | napi_disable(&tp->napi); |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 0ce07a339c7e..7ab94c825b57 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -313,6 +313,21 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, | |||
| 313 | 313 | ||
| 314 | switch (tun->flags & TUN_TYPE_MASK) { | 314 | switch (tun->flags & TUN_TYPE_MASK) { |
| 315 | case TUN_TUN_DEV: | 315 | case TUN_TUN_DEV: |
| 316 | if (tun->flags & TUN_NO_PI) { | ||
| 317 | switch (skb->data[0] & 0xf0) { | ||
| 318 | case 0x40: | ||
| 319 | pi.proto = htons(ETH_P_IP); | ||
| 320 | break; | ||
| 321 | case 0x60: | ||
| 322 | pi.proto = htons(ETH_P_IPV6); | ||
| 323 | break; | ||
| 324 | default: | ||
| 325 | tun->dev->stats.rx_dropped++; | ||
| 326 | kfree_skb(skb); | ||
| 327 | return -EINVAL; | ||
| 328 | } | ||
| 329 | } | ||
| 330 | |||
| 316 | skb_reset_mac_header(skb); | 331 | skb_reset_mac_header(skb); |
| 317 | skb->protocol = pi.proto; | 332 | skb->protocol = pi.proto; |
| 318 | skb->dev = tun->dev; | 333 | skb->dev = tun->dev; |
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index 0dcfc0310264..7c66b052f55a 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
| @@ -706,7 +706,7 @@ static void kaweth_kill_urbs(struct kaweth_device *kaweth) | |||
| 706 | usb_kill_urb(kaweth->rx_urb); | 706 | usb_kill_urb(kaweth->rx_urb); |
| 707 | usb_kill_urb(kaweth->tx_urb); | 707 | usb_kill_urb(kaweth->tx_urb); |
| 708 | 708 | ||
| 709 | flush_scheduled_work(); | 709 | cancel_delayed_work_sync(&kaweth->lowmem_work); |
| 710 | 710 | ||
| 711 | /* a scheduled work may have resubmitted, | 711 | /* a scheduled work may have resubmitted, |
| 712 | we hit them again */ | 712 | we hit them again */ |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5450eac9e263..4452306d5328 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -44,11 +44,15 @@ struct virtnet_info | |||
| 44 | /* The skb we couldn't send because buffers were full. */ | 44 | /* The skb we couldn't send because buffers were full. */ |
| 45 | struct sk_buff *last_xmit_skb; | 45 | struct sk_buff *last_xmit_skb; |
| 46 | 46 | ||
| 47 | /* If we need to free in a timer, this is it. */ | ||
| 48 | struct timer_list xmit_free_timer; | ||
| 49 | |||
| 47 | /* Number of input buffers, and max we've ever had. */ | 50 | /* Number of input buffers, and max we've ever had. */ |
| 48 | unsigned int num, max; | 51 | unsigned int num, max; |
| 49 | 52 | ||
| 50 | /* For cleaning up after transmission. */ | 53 | /* For cleaning up after transmission. */ |
| 51 | struct tasklet_struct tasklet; | 54 | struct tasklet_struct tasklet; |
| 55 | bool free_in_tasklet; | ||
| 52 | 56 | ||
| 53 | /* Receive & send queues. */ | 57 | /* Receive & send queues. */ |
| 54 | struct sk_buff_head recv; | 58 | struct sk_buff_head recv; |
| @@ -72,7 +76,7 @@ static void skb_xmit_done(struct virtqueue *svq) | |||
| 72 | /* Suppress further interrupts. */ | 76 | /* Suppress further interrupts. */ |
| 73 | svq->vq_ops->disable_cb(svq); | 77 | svq->vq_ops->disable_cb(svq); |
| 74 | 78 | ||
| 75 | /* We were waiting for more output buffers. */ | 79 | /* We were probably waiting for more output buffers. */ |
| 76 | netif_wake_queue(vi->dev); | 80 | netif_wake_queue(vi->dev); |
| 77 | 81 | ||
| 78 | /* Make sure we re-xmit last_xmit_skb: if there are no more packets | 82 | /* Make sure we re-xmit last_xmit_skb: if there are no more packets |
| @@ -94,9 +98,7 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
| 94 | BUG_ON(len > MAX_PACKET_LEN); | 98 | BUG_ON(len > MAX_PACKET_LEN); |
| 95 | 99 | ||
| 96 | skb_trim(skb, len); | 100 | skb_trim(skb, len); |
| 97 | skb->protocol = eth_type_trans(skb, dev); | 101 | |
| 98 | pr_debug("Receiving skb proto 0x%04x len %i type %i\n", | ||
| 99 | ntohs(skb->protocol), skb->len, skb->pkt_type); | ||
| 100 | dev->stats.rx_bytes += skb->len; | 102 | dev->stats.rx_bytes += skb->len; |
| 101 | dev->stats.rx_packets++; | 103 | dev->stats.rx_packets++; |
| 102 | 104 | ||
| @@ -106,6 +108,10 @@ static void receive_skb(struct net_device *dev, struct sk_buff *skb, | |||
| 106 | goto frame_err; | 108 | goto frame_err; |
| 107 | } | 109 | } |
| 108 | 110 | ||
| 111 | skb->protocol = eth_type_trans(skb, dev); | ||
| 112 | pr_debug("Receiving skb proto 0x%04x len %i type %i\n", | ||
| 113 | ntohs(skb->protocol), skb->len, skb->pkt_type); | ||
| 114 | |||
| 109 | if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { | 115 | if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { |
| 110 | pr_debug("GSO!\n"); | 116 | pr_debug("GSO!\n"); |
| 111 | switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | 117 | switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { |
| @@ -238,9 +244,25 @@ static void free_old_xmit_skbs(struct virtnet_info *vi) | |||
| 238 | } | 244 | } |
| 239 | } | 245 | } |
| 240 | 246 | ||
| 247 | /* If the virtio transport doesn't always notify us when all in-flight packets | ||
| 248 | * are consumed, we fall back to using this function on a timer to free them. */ | ||
| 249 | static void xmit_free(unsigned long data) | ||
| 250 | { | ||
| 251 | struct virtnet_info *vi = (void *)data; | ||
| 252 | |||
| 253 | netif_tx_lock(vi->dev); | ||
| 254 | |||
| 255 | free_old_xmit_skbs(vi); | ||
| 256 | |||
| 257 | if (!skb_queue_empty(&vi->send)) | ||
| 258 | mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10)); | ||
| 259 | |||
| 260 | netif_tx_unlock(vi->dev); | ||
| 261 | } | ||
| 262 | |||
| 241 | static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) | 263 | static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) |
| 242 | { | 264 | { |
| 243 | int num; | 265 | int num, err; |
| 244 | struct scatterlist sg[2+MAX_SKB_FRAGS]; | 266 | struct scatterlist sg[2+MAX_SKB_FRAGS]; |
| 245 | struct virtio_net_hdr *hdr; | 267 | struct virtio_net_hdr *hdr; |
| 246 | const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; | 268 | const unsigned char *dest = ((struct ethhdr *)skb->data)->h_dest; |
| @@ -283,7 +305,11 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) | |||
| 283 | vnet_hdr_to_sg(sg, skb); | 305 | vnet_hdr_to_sg(sg, skb); |
| 284 | num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; | 306 | num = skb_to_sgvec(skb, sg+1, 0, skb->len) + 1; |
| 285 | 307 | ||
| 286 | return vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); | 308 | err = vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); |
| 309 | if (!err && !vi->free_in_tasklet) | ||
| 310 | mod_timer(&vi->xmit_free_timer, jiffies + (HZ/10)); | ||
| 311 | |||
| 312 | return err; | ||
| 287 | } | 313 | } |
| 288 | 314 | ||
| 289 | static void xmit_tasklet(unsigned long data) | 315 | static void xmit_tasklet(unsigned long data) |
| @@ -295,6 +321,8 @@ static void xmit_tasklet(unsigned long data) | |||
| 295 | vi->svq->vq_ops->kick(vi->svq); | 321 | vi->svq->vq_ops->kick(vi->svq); |
| 296 | vi->last_xmit_skb = NULL; | 322 | vi->last_xmit_skb = NULL; |
| 297 | } | 323 | } |
| 324 | if (vi->free_in_tasklet) | ||
| 325 | free_old_xmit_skbs(vi); | ||
| 298 | netif_tx_unlock_bh(vi->dev); | 326 | netif_tx_unlock_bh(vi->dev); |
| 299 | } | 327 | } |
| 300 | 328 | ||
| @@ -435,6 +463,10 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 435 | vi->vdev = vdev; | 463 | vi->vdev = vdev; |
| 436 | vdev->priv = vi; | 464 | vdev->priv = vi; |
| 437 | 465 | ||
| 466 | /* If they give us a callback when all buffers are done, we don't need | ||
| 467 | * the timer. */ | ||
| 468 | vi->free_in_tasklet = virtio_has_feature(vdev,VIRTIO_F_NOTIFY_ON_EMPTY); | ||
| 469 | |||
| 438 | /* We expect two virtqueues, receive then send. */ | 470 | /* We expect two virtqueues, receive then send. */ |
| 439 | vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done); | 471 | vi->rvq = vdev->config->find_vq(vdev, 0, skb_recv_done); |
| 440 | if (IS_ERR(vi->rvq)) { | 472 | if (IS_ERR(vi->rvq)) { |
| @@ -454,6 +486,9 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 454 | 486 | ||
| 455 | tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi); | 487 | tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi); |
| 456 | 488 | ||
| 489 | if (!vi->free_in_tasklet) | ||
| 490 | setup_timer(&vi->xmit_free_timer, xmit_free, (unsigned long)vi); | ||
| 491 | |||
| 457 | err = register_netdev(dev); | 492 | err = register_netdev(dev); |
| 458 | if (err) { | 493 | if (err) { |
| 459 | pr_debug("virtio_net: registering device failed\n"); | 494 | pr_debug("virtio_net: registering device failed\n"); |
| @@ -491,6 +526,9 @@ static void virtnet_remove(struct virtio_device *vdev) | |||
| 491 | /* Stop all the virtqueues. */ | 526 | /* Stop all the virtqueues. */ |
| 492 | vdev->config->reset(vdev); | 527 | vdev->config->reset(vdev); |
| 493 | 528 | ||
| 529 | if (!vi->free_in_tasklet) | ||
| 530 | del_timer_sync(&vi->xmit_free_timer); | ||
| 531 | |||
| 494 | /* Free our skbs in send and recv queues, if any. */ | 532 | /* Free our skbs in send and recv queues, if any. */ |
| 495 | while ((skb = __skb_dequeue(&vi->recv)) != NULL) { | 533 | while ((skb = __skb_dequeue(&vi->recv)) != NULL) { |
| 496 | kfree_skb(skb); | 534 | kfree_skb(skb); |
| @@ -514,7 +552,7 @@ static struct virtio_device_id id_table[] = { | |||
| 514 | static unsigned int features[] = { | 552 | static unsigned int features[] = { |
| 515 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, | 553 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, |
| 516 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, | 554 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, |
| 517 | VIRTIO_NET_F_HOST_ECN, | 555 | VIRTIO_NET_F_HOST_ECN, VIRTIO_F_NOTIFY_ON_EMPTY, |
| 518 | }; | 556 | }; |
| 519 | 557 | ||
| 520 | static struct virtio_driver virtio_net = { | 558 | static struct virtio_driver virtio_net = { |
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index dfa4bdd5597c..d3db298c05fc 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
| @@ -630,7 +630,6 @@ struct b43_pio { | |||
| 630 | 630 | ||
| 631 | /* Context information for a noise calculation (Link Quality). */ | 631 | /* Context information for a noise calculation (Link Quality). */ |
| 632 | struct b43_noise_calculation { | 632 | struct b43_noise_calculation { |
| 633 | u8 channel_at_start; | ||
| 634 | bool calculation_running; | 633 | bool calculation_running; |
| 635 | u8 nr_samples; | 634 | u8 nr_samples; |
| 636 | s8 samples[8][4]; | 635 | s8 samples[8][4]; |
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 6dcbb3c87e72..e23f2f172bd7 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
| @@ -795,24 +795,49 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 795 | { | 795 | { |
| 796 | struct b43_dmaring *ring; | 796 | struct b43_dmaring *ring; |
| 797 | int err; | 797 | int err; |
| 798 | int nr_slots; | ||
| 799 | dma_addr_t dma_test; | 798 | dma_addr_t dma_test; |
| 800 | 799 | ||
| 801 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); | 800 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); |
| 802 | if (!ring) | 801 | if (!ring) |
| 803 | goto out; | 802 | goto out; |
| 804 | ring->type = type; | ||
| 805 | 803 | ||
| 806 | nr_slots = B43_RXRING_SLOTS; | 804 | ring->nr_slots = B43_RXRING_SLOTS; |
| 807 | if (for_tx) | 805 | if (for_tx) |
| 808 | nr_slots = B43_TXRING_SLOTS; | 806 | ring->nr_slots = B43_TXRING_SLOTS; |
| 809 | 807 | ||
| 810 | ring->meta = kcalloc(nr_slots, sizeof(struct b43_dmadesc_meta), | 808 | ring->meta = kcalloc(ring->nr_slots, sizeof(struct b43_dmadesc_meta), |
| 811 | GFP_KERNEL); | 809 | GFP_KERNEL); |
| 812 | if (!ring->meta) | 810 | if (!ring->meta) |
| 813 | goto err_kfree_ring; | 811 | goto err_kfree_ring; |
| 812 | |||
| 813 | ring->type = type; | ||
| 814 | ring->dev = dev; | ||
| 815 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
| 816 | ring->index = controller_index; | ||
| 817 | if (type == B43_DMA_64BIT) | ||
| 818 | ring->ops = &dma64_ops; | ||
| 819 | else | ||
| 820 | ring->ops = &dma32_ops; | ||
| 814 | if (for_tx) { | 821 | if (for_tx) { |
| 815 | ring->txhdr_cache = kcalloc(nr_slots, | 822 | ring->tx = 1; |
| 823 | ring->current_slot = -1; | ||
| 824 | } else { | ||
| 825 | if (ring->index == 0) { | ||
| 826 | ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | ||
| 827 | ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | ||
| 828 | } else if (ring->index == 3) { | ||
| 829 | ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | ||
| 830 | ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | ||
| 831 | } else | ||
| 832 | B43_WARN_ON(1); | ||
| 833 | } | ||
| 834 | spin_lock_init(&ring->lock); | ||
| 835 | #ifdef CONFIG_B43_DEBUG | ||
| 836 | ring->last_injected_overflow = jiffies; | ||
| 837 | #endif | ||
| 838 | |||
| 839 | if (for_tx) { | ||
| 840 | ring->txhdr_cache = kcalloc(ring->nr_slots, | ||
| 816 | b43_txhdr_size(dev), | 841 | b43_txhdr_size(dev), |
| 817 | GFP_KERNEL); | 842 | GFP_KERNEL); |
| 818 | if (!ring->txhdr_cache) | 843 | if (!ring->txhdr_cache) |
| @@ -828,7 +853,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 828 | b43_txhdr_size(dev), 1)) { | 853 | b43_txhdr_size(dev), 1)) { |
| 829 | /* ugh realloc */ | 854 | /* ugh realloc */ |
| 830 | kfree(ring->txhdr_cache); | 855 | kfree(ring->txhdr_cache); |
| 831 | ring->txhdr_cache = kcalloc(nr_slots, | 856 | ring->txhdr_cache = kcalloc(ring->nr_slots, |
| 832 | b43_txhdr_size(dev), | 857 | b43_txhdr_size(dev), |
| 833 | GFP_KERNEL | GFP_DMA); | 858 | GFP_KERNEL | GFP_DMA); |
| 834 | if (!ring->txhdr_cache) | 859 | if (!ring->txhdr_cache) |
| @@ -853,32 +878,6 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev, | |||
| 853 | DMA_TO_DEVICE); | 878 | DMA_TO_DEVICE); |
| 854 | } | 879 | } |
| 855 | 880 | ||
| 856 | ring->dev = dev; | ||
| 857 | ring->nr_slots = nr_slots; | ||
| 858 | ring->mmio_base = b43_dmacontroller_base(type, controller_index); | ||
| 859 | ring->index = controller_index; | ||
| 860 | if (type == B43_DMA_64BIT) | ||
| 861 | ring->ops = &dma64_ops; | ||
| 862 | else | ||
| 863 | ring->ops = &dma32_ops; | ||
| 864 | if (for_tx) { | ||
| 865 | ring->tx = 1; | ||
| 866 | ring->current_slot = -1; | ||
| 867 | } else { | ||
| 868 | if (ring->index == 0) { | ||
| 869 | ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | ||
| 870 | ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | ||
| 871 | } else if (ring->index == 3) { | ||
| 872 | ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | ||
| 873 | ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | ||
| 874 | } else | ||
| 875 | B43_WARN_ON(1); | ||
| 876 | } | ||
| 877 | spin_lock_init(&ring->lock); | ||
| 878 | #ifdef CONFIG_B43_DEBUG | ||
| 879 | ring->last_injected_overflow = jiffies; | ||
| 880 | #endif | ||
| 881 | |||
| 882 | err = alloc_ringmemory(ring); | 881 | err = alloc_ringmemory(ring); |
| 883 | if (err) | 882 | if (err) |
| 884 | goto err_kfree_txhdr_cache; | 883 | goto err_kfree_txhdr_cache; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 6c3d9ea0a9f8..fa4b0d8b74a2 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
| @@ -1145,7 +1145,6 @@ static void b43_generate_noise_sample(struct b43_wldev *dev) | |||
| 1145 | b43_jssi_write(dev, 0x7F7F7F7F); | 1145 | b43_jssi_write(dev, 0x7F7F7F7F); |
| 1146 | b43_write32(dev, B43_MMIO_MACCMD, | 1146 | b43_write32(dev, B43_MMIO_MACCMD, |
| 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); | 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); |
| 1148 | B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel); | ||
| 1149 | } | 1148 | } |
| 1150 | 1149 | ||
| 1151 | static void b43_calculate_link_quality(struct b43_wldev *dev) | 1150 | static void b43_calculate_link_quality(struct b43_wldev *dev) |
| @@ -1154,7 +1153,6 @@ static void b43_calculate_link_quality(struct b43_wldev *dev) | |||
| 1154 | 1153 | ||
| 1155 | if (dev->noisecalc.calculation_running) | 1154 | if (dev->noisecalc.calculation_running) |
| 1156 | return; | 1155 | return; |
| 1157 | dev->noisecalc.channel_at_start = dev->phy.channel; | ||
| 1158 | dev->noisecalc.calculation_running = 1; | 1156 | dev->noisecalc.calculation_running = 1; |
| 1159 | dev->noisecalc.nr_samples = 0; | 1157 | dev->noisecalc.nr_samples = 0; |
| 1160 | 1158 | ||
| @@ -1171,9 +1169,16 @@ static void handle_irq_noise(struct b43_wldev *dev) | |||
| 1171 | 1169 | ||
| 1172 | /* Bottom half of Link Quality calculation. */ | 1170 | /* Bottom half of Link Quality calculation. */ |
| 1173 | 1171 | ||
| 1172 | /* Possible race condition: It might be possible that the user | ||
| 1173 | * changed to a different channel in the meantime since we | ||
| 1174 | * started the calculation. We ignore that fact, since it's | ||
| 1175 | * not really that much of a problem. The background noise is | ||
| 1176 | * an estimation only anyway. Slightly wrong results will get damped | ||
| 1177 | * by the averaging of the 8 sample rounds. Additionally the | ||
| 1178 | * value is shortlived. So it will be replaced by the next noise | ||
| 1179 | * calculation round soon. */ | ||
| 1180 | |||
| 1174 | B43_WARN_ON(!dev->noisecalc.calculation_running); | 1181 | B43_WARN_ON(!dev->noisecalc.calculation_running); |
| 1175 | if (dev->noisecalc.channel_at_start != phy->channel) | ||
| 1176 | goto drop_calculation; | ||
| 1177 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); | 1182 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); |
| 1178 | if (noise[0] == 0x7F || noise[1] == 0x7F || | 1183 | if (noise[0] == 0x7F || noise[1] == 0x7F || |
| 1179 | noise[2] == 0x7F || noise[3] == 0x7F) | 1184 | noise[2] == 0x7F || noise[3] == 0x7F) |
| @@ -1214,11 +1219,10 @@ static void handle_irq_noise(struct b43_wldev *dev) | |||
| 1214 | average -= 48; | 1219 | average -= 48; |
| 1215 | 1220 | ||
| 1216 | dev->stats.link_noise = average; | 1221 | dev->stats.link_noise = average; |
| 1217 | drop_calculation: | ||
| 1218 | dev->noisecalc.calculation_running = 0; | 1222 | dev->noisecalc.calculation_running = 0; |
| 1219 | return; | 1223 | return; |
| 1220 | } | 1224 | } |
| 1221 | generate_new: | 1225 | generate_new: |
| 1222 | b43_generate_noise_sample(dev); | 1226 | b43_generate_noise_sample(dev); |
| 1223 | } | 1227 | } |
| 1224 | 1228 | ||
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c index 20d387f6658c..f7aec9309d04 100644 --- a/drivers/net/wireless/hostap/hostap_main.c +++ b/drivers/net/wireless/hostap/hostap_main.c | |||
| @@ -682,7 +682,13 @@ static int prism2_close(struct net_device *dev) | |||
| 682 | netif_device_detach(dev); | 682 | netif_device_detach(dev); |
| 683 | } | 683 | } |
| 684 | 684 | ||
| 685 | flush_scheduled_work(); | 685 | cancel_work_sync(&local->reset_queue); |
| 686 | cancel_work_sync(&local->set_multicast_list_queue); | ||
| 687 | cancel_work_sync(&local->set_tim_queue); | ||
| 688 | #ifndef PRISM2_NO_STATION_MODES | ||
| 689 | cancel_work_sync(&local->info_queue); | ||
| 690 | #endif | ||
| 691 | cancel_work_sync(&local->comms_qual_update); | ||
| 686 | 692 | ||
| 687 | module_put(local->hw_module); | 693 | module_put(local->hw_module); |
| 688 | 694 | ||
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 729336774828..6e704608947c 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
| @@ -1753,6 +1753,8 @@ static int ipw_radio_kill_sw(struct ipw_priv *priv, int disable_radio) | |||
| 1753 | 1753 | ||
| 1754 | if (priv->workqueue) { | 1754 | if (priv->workqueue) { |
| 1755 | cancel_delayed_work(&priv->request_scan); | 1755 | cancel_delayed_work(&priv->request_scan); |
| 1756 | cancel_delayed_work(&priv->request_direct_scan); | ||
| 1757 | cancel_delayed_work(&priv->request_passive_scan); | ||
| 1756 | cancel_delayed_work(&priv->scan_event); | 1758 | cancel_delayed_work(&priv->scan_event); |
| 1757 | } | 1759 | } |
| 1758 | queue_work(priv->workqueue, &priv->down); | 1760 | queue_work(priv->workqueue, &priv->down); |
| @@ -2005,6 +2007,8 @@ static void ipw_irq_tasklet(struct ipw_priv *priv) | |||
| 2005 | wake_up_interruptible(&priv->wait_command_queue); | 2007 | wake_up_interruptible(&priv->wait_command_queue); |
| 2006 | priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); | 2008 | priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING); |
| 2007 | cancel_delayed_work(&priv->request_scan); | 2009 | cancel_delayed_work(&priv->request_scan); |
| 2010 | cancel_delayed_work(&priv->request_direct_scan); | ||
| 2011 | cancel_delayed_work(&priv->request_passive_scan); | ||
| 2008 | cancel_delayed_work(&priv->scan_event); | 2012 | cancel_delayed_work(&priv->scan_event); |
| 2009 | schedule_work(&priv->link_down); | 2013 | schedule_work(&priv->link_down); |
| 2010 | queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ); | 2014 | queue_delayed_work(priv->workqueue, &priv->rf_kill, 2 * HZ); |
| @@ -4712,6 +4716,12 @@ static void ipw_rx_notification(struct ipw_priv *priv, | |||
| 4712 | priv->status &= ~STATUS_SCAN_FORCED; | 4716 | priv->status &= ~STATUS_SCAN_FORCED; |
| 4713 | #endif /* CONFIG_IPW2200_MONITOR */ | 4717 | #endif /* CONFIG_IPW2200_MONITOR */ |
| 4714 | 4718 | ||
| 4719 | /* Do queued direct scans first */ | ||
| 4720 | if (priv->status & STATUS_DIRECT_SCAN_PENDING) { | ||
| 4721 | queue_delayed_work(priv->workqueue, | ||
| 4722 | &priv->request_direct_scan, 0); | ||
| 4723 | } | ||
| 4724 | |||
| 4715 | if (!(priv->status & (STATUS_ASSOCIATED | | 4725 | if (!(priv->status & (STATUS_ASSOCIATED | |
| 4716 | STATUS_ASSOCIATING | | 4726 | STATUS_ASSOCIATING | |
| 4717 | STATUS_ROAMING | | 4727 | STATUS_ROAMING | |
| @@ -6267,7 +6277,7 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | |||
| 6267 | } | 6277 | } |
| 6268 | } | 6278 | } |
| 6269 | 6279 | ||
| 6270 | static int ipw_request_scan_helper(struct ipw_priv *priv, int type) | 6280 | static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) |
| 6271 | { | 6281 | { |
| 6272 | struct ipw_scan_request_ext scan; | 6282 | struct ipw_scan_request_ext scan; |
| 6273 | int err = 0, scan_type; | 6283 | int err = 0, scan_type; |
| @@ -6278,22 +6288,31 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type) | |||
| 6278 | 6288 | ||
| 6279 | mutex_lock(&priv->mutex); | 6289 | mutex_lock(&priv->mutex); |
| 6280 | 6290 | ||
| 6291 | if (direct && (priv->direct_scan_ssid_len == 0)) { | ||
| 6292 | IPW_DEBUG_HC("Direct scan requested but no SSID to scan for\n"); | ||
| 6293 | priv->status &= ~STATUS_DIRECT_SCAN_PENDING; | ||
| 6294 | goto done; | ||
| 6295 | } | ||
| 6296 | |||
| 6281 | if (priv->status & STATUS_SCANNING) { | 6297 | if (priv->status & STATUS_SCANNING) { |
| 6282 | IPW_DEBUG_HC("Concurrent scan requested. Ignoring.\n"); | 6298 | IPW_DEBUG_HC("Concurrent scan requested. Queuing.\n"); |
| 6283 | priv->status |= STATUS_SCAN_PENDING; | 6299 | priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : |
| 6300 | STATUS_SCAN_PENDING; | ||
| 6284 | goto done; | 6301 | goto done; |
| 6285 | } | 6302 | } |
| 6286 | 6303 | ||
| 6287 | if (!(priv->status & STATUS_SCAN_FORCED) && | 6304 | if (!(priv->status & STATUS_SCAN_FORCED) && |
| 6288 | priv->status & STATUS_SCAN_ABORTING) { | 6305 | priv->status & STATUS_SCAN_ABORTING) { |
| 6289 | IPW_DEBUG_HC("Scan request while abort pending. Queuing.\n"); | 6306 | IPW_DEBUG_HC("Scan request while abort pending. Queuing.\n"); |
| 6290 | priv->status |= STATUS_SCAN_PENDING; | 6307 | priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : |
| 6308 | STATUS_SCAN_PENDING; | ||
| 6291 | goto done; | 6309 | goto done; |
| 6292 | } | 6310 | } |
| 6293 | 6311 | ||
| 6294 | if (priv->status & STATUS_RF_KILL_MASK) { | 6312 | if (priv->status & STATUS_RF_KILL_MASK) { |
| 6295 | IPW_DEBUG_HC("Aborting scan due to RF Kill activation\n"); | 6313 | IPW_DEBUG_HC("Queuing scan due to RF Kill activation\n"); |
| 6296 | priv->status |= STATUS_SCAN_PENDING; | 6314 | priv->status |= direct ? STATUS_DIRECT_SCAN_PENDING : |
| 6315 | STATUS_SCAN_PENDING; | ||
| 6297 | goto done; | 6316 | goto done; |
| 6298 | } | 6317 | } |
| 6299 | 6318 | ||
| @@ -6321,6 +6340,7 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type) | |||
| 6321 | cpu_to_le16(20); | 6340 | cpu_to_le16(20); |
| 6322 | 6341 | ||
| 6323 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); | 6342 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); |
| 6343 | scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20); | ||
| 6324 | 6344 | ||
| 6325 | #ifdef CONFIG_IPW2200_MONITOR | 6345 | #ifdef CONFIG_IPW2200_MONITOR |
| 6326 | if (priv->ieee->iw_mode == IW_MODE_MONITOR) { | 6346 | if (priv->ieee->iw_mode == IW_MODE_MONITOR) { |
| @@ -6360,13 +6380,23 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type) | |||
| 6360 | cpu_to_le16(2000); | 6380 | cpu_to_le16(2000); |
| 6361 | } else { | 6381 | } else { |
| 6362 | #endif /* CONFIG_IPW2200_MONITOR */ | 6382 | #endif /* CONFIG_IPW2200_MONITOR */ |
| 6363 | /* If we are roaming, then make this a directed scan for the | 6383 | /* Honor direct scans first, otherwise if we are roaming make |
| 6364 | * current network. Otherwise, ensure that every other scan | 6384 | * this a direct scan for the current network. Finally, |
| 6365 | * is a fast channel hop scan */ | 6385 | * ensure that every other scan is a fast channel hop scan */ |
| 6366 | if ((priv->status & STATUS_ROAMING) | 6386 | if (direct) { |
| 6367 | || (!(priv->status & STATUS_ASSOCIATED) | 6387 | err = ipw_send_ssid(priv, priv->direct_scan_ssid, |
| 6368 | && (priv->config & CFG_STATIC_ESSID) | 6388 | priv->direct_scan_ssid_len); |
| 6369 | && (le32_to_cpu(scan.full_scan_index) % 2))) { | 6389 | if (err) { |
| 6390 | IPW_DEBUG_HC("Attempt to send SSID command " | ||
| 6391 | "failed\n"); | ||
| 6392 | goto done; | ||
| 6393 | } | ||
| 6394 | |||
| 6395 | scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN; | ||
| 6396 | } else if ((priv->status & STATUS_ROAMING) | ||
| 6397 | || (!(priv->status & STATUS_ASSOCIATED) | ||
| 6398 | && (priv->config & CFG_STATIC_ESSID) | ||
| 6399 | && (le32_to_cpu(scan.full_scan_index) % 2))) { | ||
| 6370 | err = ipw_send_ssid(priv, priv->essid, priv->essid_len); | 6400 | err = ipw_send_ssid(priv, priv->essid, priv->essid_len); |
| 6371 | if (err) { | 6401 | if (err) { |
| 6372 | IPW_DEBUG_HC("Attempt to send SSID command " | 6402 | IPW_DEBUG_HC("Attempt to send SSID command " |
| @@ -6391,7 +6421,12 @@ send_request: | |||
| 6391 | } | 6421 | } |
| 6392 | 6422 | ||
| 6393 | priv->status |= STATUS_SCANNING; | 6423 | priv->status |= STATUS_SCANNING; |
| 6394 | priv->status &= ~STATUS_SCAN_PENDING; | 6424 | if (direct) { |
| 6425 | priv->status &= ~STATUS_DIRECT_SCAN_PENDING; | ||
| 6426 | priv->direct_scan_ssid_len = 0; | ||
| 6427 | } else | ||
| 6428 | priv->status &= ~STATUS_SCAN_PENDING; | ||
| 6429 | |||
| 6395 | queue_delayed_work(priv->workqueue, &priv->scan_check, | 6430 | queue_delayed_work(priv->workqueue, &priv->scan_check, |
| 6396 | IPW_SCAN_CHECK_WATCHDOG); | 6431 | IPW_SCAN_CHECK_WATCHDOG); |
| 6397 | done: | 6432 | done: |
| @@ -6402,15 +6437,22 @@ done: | |||
| 6402 | static void ipw_request_passive_scan(struct work_struct *work) | 6437 | static void ipw_request_passive_scan(struct work_struct *work) |
| 6403 | { | 6438 | { |
| 6404 | struct ipw_priv *priv = | 6439 | struct ipw_priv *priv = |
| 6405 | container_of(work, struct ipw_priv, request_passive_scan); | 6440 | container_of(work, struct ipw_priv, request_passive_scan.work); |
| 6406 | ipw_request_scan_helper(priv, IW_SCAN_TYPE_PASSIVE); | 6441 | ipw_request_scan_helper(priv, IW_SCAN_TYPE_PASSIVE, 0); |
| 6407 | } | 6442 | } |
| 6408 | 6443 | ||
| 6409 | static void ipw_request_scan(struct work_struct *work) | 6444 | static void ipw_request_scan(struct work_struct *work) |
| 6410 | { | 6445 | { |
| 6411 | struct ipw_priv *priv = | 6446 | struct ipw_priv *priv = |
| 6412 | container_of(work, struct ipw_priv, request_scan.work); | 6447 | container_of(work, struct ipw_priv, request_scan.work); |
| 6413 | ipw_request_scan_helper(priv, IW_SCAN_TYPE_ACTIVE); | 6448 | ipw_request_scan_helper(priv, IW_SCAN_TYPE_ACTIVE, 0); |
| 6449 | } | ||
| 6450 | |||
| 6451 | static void ipw_request_direct_scan(struct work_struct *work) | ||
| 6452 | { | ||
| 6453 | struct ipw_priv *priv = | ||
| 6454 | container_of(work, struct ipw_priv, request_direct_scan.work); | ||
| 6455 | ipw_request_scan_helper(priv, IW_SCAN_TYPE_ACTIVE, 1); | ||
| 6414 | } | 6456 | } |
| 6415 | 6457 | ||
| 6416 | static void ipw_bg_abort_scan(struct work_struct *work) | 6458 | static void ipw_bg_abort_scan(struct work_struct *work) |
| @@ -9477,99 +9519,38 @@ static int ipw_wx_get_retry(struct net_device *dev, | |||
| 9477 | return 0; | 9519 | return 0; |
| 9478 | } | 9520 | } |
| 9479 | 9521 | ||
| 9480 | static int ipw_request_direct_scan(struct ipw_priv *priv, char *essid, | ||
| 9481 | int essid_len) | ||
| 9482 | { | ||
| 9483 | struct ipw_scan_request_ext scan; | ||
| 9484 | int err = 0, scan_type; | ||
| 9485 | |||
| 9486 | if (!(priv->status & STATUS_INIT) || | ||
| 9487 | (priv->status & STATUS_EXIT_PENDING)) | ||
| 9488 | return 0; | ||
| 9489 | |||
| 9490 | mutex_lock(&priv->mutex); | ||
| 9491 | |||
| 9492 | if (priv->status & STATUS_RF_KILL_MASK) { | ||
| 9493 | IPW_DEBUG_HC("Aborting scan due to RF kill activation\n"); | ||
| 9494 | priv->status |= STATUS_SCAN_PENDING; | ||
| 9495 | goto done; | ||
| 9496 | } | ||
| 9497 | |||
| 9498 | IPW_DEBUG_HC("starting request direct scan!\n"); | ||
| 9499 | |||
| 9500 | if (priv->status & (STATUS_SCANNING | STATUS_SCAN_ABORTING)) { | ||
| 9501 | /* We should not sleep here; otherwise we will block most | ||
| 9502 | * of the system (for instance, we hold rtnl_lock when we | ||
| 9503 | * get here). | ||
| 9504 | */ | ||
| 9505 | err = -EAGAIN; | ||
| 9506 | goto done; | ||
| 9507 | } | ||
| 9508 | memset(&scan, 0, sizeof(scan)); | ||
| 9509 | |||
| 9510 | if (priv->config & CFG_SPEED_SCAN) | ||
| 9511 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = | ||
| 9512 | cpu_to_le16(30); | ||
| 9513 | else | ||
| 9514 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = | ||
| 9515 | cpu_to_le16(20); | ||
| 9516 | |||
| 9517 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = | ||
| 9518 | cpu_to_le16(20); | ||
| 9519 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); | ||
| 9520 | scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20); | ||
| 9521 | |||
| 9522 | scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); | ||
| 9523 | |||
| 9524 | err = ipw_send_ssid(priv, essid, essid_len); | ||
| 9525 | if (err) { | ||
| 9526 | IPW_DEBUG_HC("Attempt to send SSID command failed\n"); | ||
| 9527 | goto done; | ||
| 9528 | } | ||
| 9529 | scan_type = IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN; | ||
| 9530 | |||
| 9531 | ipw_add_scan_channels(priv, &scan, scan_type); | ||
| 9532 | |||
| 9533 | err = ipw_send_scan_request_ext(priv, &scan); | ||
| 9534 | if (err) { | ||
| 9535 | IPW_DEBUG_HC("Sending scan command failed: %08X\n", err); | ||
| 9536 | goto done; | ||
| 9537 | } | ||
| 9538 | |||
| 9539 | priv->status |= STATUS_SCANNING; | ||
| 9540 | |||
| 9541 | done: | ||
| 9542 | mutex_unlock(&priv->mutex); | ||
| 9543 | return err; | ||
| 9544 | } | ||
| 9545 | |||
| 9546 | static int ipw_wx_set_scan(struct net_device *dev, | 9522 | static int ipw_wx_set_scan(struct net_device *dev, |
| 9547 | struct iw_request_info *info, | 9523 | struct iw_request_info *info, |
| 9548 | union iwreq_data *wrqu, char *extra) | 9524 | union iwreq_data *wrqu, char *extra) |
| 9549 | { | 9525 | { |
| 9550 | struct ipw_priv *priv = ieee80211_priv(dev); | 9526 | struct ipw_priv *priv = ieee80211_priv(dev); |
| 9551 | struct iw_scan_req *req = (struct iw_scan_req *)extra; | 9527 | struct iw_scan_req *req = (struct iw_scan_req *)extra; |
| 9528 | struct delayed_work *work = NULL; | ||
| 9552 | 9529 | ||
| 9553 | mutex_lock(&priv->mutex); | 9530 | mutex_lock(&priv->mutex); |
| 9531 | |||
| 9554 | priv->user_requested_scan = 1; | 9532 | priv->user_requested_scan = 1; |
| 9555 | mutex_unlock(&priv->mutex); | ||
| 9556 | 9533 | ||
| 9557 | if (wrqu->data.length == sizeof(struct iw_scan_req)) { | 9534 | if (wrqu->data.length == sizeof(struct iw_scan_req)) { |
| 9558 | if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { | 9535 | if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { |
| 9559 | ipw_request_direct_scan(priv, req->essid, | 9536 | int len = min((int)req->essid_len, |
| 9560 | req->essid_len); | 9537 | (int)sizeof(priv->direct_scan_ssid)); |
| 9561 | return 0; | 9538 | memcpy(priv->direct_scan_ssid, req->essid, len); |
| 9562 | } | 9539 | priv->direct_scan_ssid_len = len; |
| 9563 | if (req->scan_type == IW_SCAN_TYPE_PASSIVE) { | 9540 | work = &priv->request_direct_scan; |
| 9564 | queue_work(priv->workqueue, | 9541 | } else if (req->scan_type == IW_SCAN_TYPE_PASSIVE) { |
| 9565 | &priv->request_passive_scan); | 9542 | work = &priv->request_passive_scan; |
| 9566 | return 0; | ||
| 9567 | } | 9543 | } |
| 9544 | } else { | ||
| 9545 | /* Normal active broadcast scan */ | ||
| 9546 | work = &priv->request_scan; | ||
| 9568 | } | 9547 | } |
| 9569 | 9548 | ||
| 9549 | mutex_unlock(&priv->mutex); | ||
| 9550 | |||
| 9570 | IPW_DEBUG_WX("Start scan\n"); | 9551 | IPW_DEBUG_WX("Start scan\n"); |
| 9571 | 9552 | ||
| 9572 | queue_delayed_work(priv->workqueue, &priv->request_scan, 0); | 9553 | queue_delayed_work(priv->workqueue, work, 0); |
| 9573 | 9554 | ||
| 9574 | return 0; | 9555 | return 0; |
| 9575 | } | 9556 | } |
| @@ -10731,6 +10712,8 @@ static void ipw_link_up(struct ipw_priv *priv) | |||
| 10731 | } | 10712 | } |
| 10732 | 10713 | ||
| 10733 | cancel_delayed_work(&priv->request_scan); | 10714 | cancel_delayed_work(&priv->request_scan); |
| 10715 | cancel_delayed_work(&priv->request_direct_scan); | ||
| 10716 | cancel_delayed_work(&priv->request_passive_scan); | ||
| 10734 | cancel_delayed_work(&priv->scan_event); | 10717 | cancel_delayed_work(&priv->scan_event); |
| 10735 | ipw_reset_stats(priv); | 10718 | ipw_reset_stats(priv); |
| 10736 | /* Ensure the rate is updated immediately */ | 10719 | /* Ensure the rate is updated immediately */ |
| @@ -10761,6 +10744,8 @@ static void ipw_link_down(struct ipw_priv *priv) | |||
| 10761 | 10744 | ||
| 10762 | /* Cancel any queued work ... */ | 10745 | /* Cancel any queued work ... */ |
| 10763 | cancel_delayed_work(&priv->request_scan); | 10746 | cancel_delayed_work(&priv->request_scan); |
| 10747 | cancel_delayed_work(&priv->request_direct_scan); | ||
| 10748 | cancel_delayed_work(&priv->request_passive_scan); | ||
| 10764 | cancel_delayed_work(&priv->adhoc_check); | 10749 | cancel_delayed_work(&priv->adhoc_check); |
| 10765 | cancel_delayed_work(&priv->gather_stats); | 10750 | cancel_delayed_work(&priv->gather_stats); |
| 10766 | 10751 | ||
| @@ -10800,8 +10785,9 @@ static int __devinit ipw_setup_deferred_work(struct ipw_priv *priv) | |||
| 10800 | INIT_WORK(&priv->up, ipw_bg_up); | 10785 | INIT_WORK(&priv->up, ipw_bg_up); |
| 10801 | INIT_WORK(&priv->down, ipw_bg_down); | 10786 | INIT_WORK(&priv->down, ipw_bg_down); |
| 10802 | INIT_DELAYED_WORK(&priv->request_scan, ipw_request_scan); | 10787 | INIT_DELAYED_WORK(&priv->request_scan, ipw_request_scan); |
| 10788 | INIT_DELAYED_WORK(&priv->request_direct_scan, ipw_request_direct_scan); | ||
| 10789 | INIT_DELAYED_WORK(&priv->request_passive_scan, ipw_request_passive_scan); | ||
| 10803 | INIT_DELAYED_WORK(&priv->scan_event, ipw_scan_event); | 10790 | INIT_DELAYED_WORK(&priv->scan_event, ipw_scan_event); |
| 10804 | INIT_WORK(&priv->request_passive_scan, ipw_request_passive_scan); | ||
| 10805 | INIT_DELAYED_WORK(&priv->gather_stats, ipw_bg_gather_stats); | 10791 | INIT_DELAYED_WORK(&priv->gather_stats, ipw_bg_gather_stats); |
| 10806 | INIT_WORK(&priv->abort_scan, ipw_bg_abort_scan); | 10792 | INIT_WORK(&priv->abort_scan, ipw_bg_abort_scan); |
| 10807 | INIT_WORK(&priv->roam, ipw_bg_roam); | 10793 | INIT_WORK(&priv->roam, ipw_bg_roam); |
| @@ -11835,6 +11821,8 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) | |||
| 11835 | cancel_delayed_work(&priv->adhoc_check); | 11821 | cancel_delayed_work(&priv->adhoc_check); |
| 11836 | cancel_delayed_work(&priv->gather_stats); | 11822 | cancel_delayed_work(&priv->gather_stats); |
| 11837 | cancel_delayed_work(&priv->request_scan); | 11823 | cancel_delayed_work(&priv->request_scan); |
| 11824 | cancel_delayed_work(&priv->request_direct_scan); | ||
| 11825 | cancel_delayed_work(&priv->request_passive_scan); | ||
| 11838 | cancel_delayed_work(&priv->scan_event); | 11826 | cancel_delayed_work(&priv->scan_event); |
| 11839 | cancel_delayed_work(&priv->rf_kill); | 11827 | cancel_delayed_work(&priv->rf_kill); |
| 11840 | cancel_delayed_work(&priv->scan_check); | 11828 | cancel_delayed_work(&priv->scan_check); |
diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h index cd3295b66dd6..d4ab28b73b32 100644 --- a/drivers/net/wireless/ipw2200.h +++ b/drivers/net/wireless/ipw2200.h | |||
| @@ -1037,6 +1037,7 @@ struct ipw_cmd { /* XXX */ | |||
| 1037 | #define STATUS_DISASSOC_PENDING (1<<12) | 1037 | #define STATUS_DISASSOC_PENDING (1<<12) |
| 1038 | #define STATUS_STATE_PENDING (1<<13) | 1038 | #define STATUS_STATE_PENDING (1<<13) |
| 1039 | 1039 | ||
| 1040 | #define STATUS_DIRECT_SCAN_PENDING (1<<19) | ||
| 1040 | #define STATUS_SCAN_PENDING (1<<20) | 1041 | #define STATUS_SCAN_PENDING (1<<20) |
| 1041 | #define STATUS_SCANNING (1<<21) | 1042 | #define STATUS_SCANNING (1<<21) |
| 1042 | #define STATUS_SCAN_ABORTING (1<<22) | 1043 | #define STATUS_SCAN_ABORTING (1<<22) |
| @@ -1292,6 +1293,8 @@ struct ipw_priv { | |||
| 1292 | struct iw_public_data wireless_data; | 1293 | struct iw_public_data wireless_data; |
| 1293 | 1294 | ||
| 1294 | int user_requested_scan; | 1295 | int user_requested_scan; |
| 1296 | u8 direct_scan_ssid[IW_ESSID_MAX_SIZE]; | ||
| 1297 | u8 direct_scan_ssid_len; | ||
| 1295 | 1298 | ||
| 1296 | struct workqueue_struct *workqueue; | 1299 | struct workqueue_struct *workqueue; |
| 1297 | 1300 | ||
| @@ -1301,8 +1304,9 @@ struct ipw_priv { | |||
| 1301 | struct work_struct system_config; | 1304 | struct work_struct system_config; |
| 1302 | struct work_struct rx_replenish; | 1305 | struct work_struct rx_replenish; |
| 1303 | struct delayed_work request_scan; | 1306 | struct delayed_work request_scan; |
| 1307 | struct delayed_work request_direct_scan; | ||
| 1308 | struct delayed_work request_passive_scan; | ||
| 1304 | struct delayed_work scan_event; | 1309 | struct delayed_work scan_event; |
| 1305 | struct work_struct request_passive_scan; | ||
| 1306 | struct work_struct adapter_restart; | 1310 | struct work_struct adapter_restart; |
| 1307 | struct delayed_work rf_kill; | 1311 | struct delayed_work rf_kill; |
| 1308 | struct work_struct up; | 1312 | struct work_struct up; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.c b/drivers/net/wireless/iwlwifi/iwl-3945-led.c index d200d08fb086..8b1528e52d43 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.c | |||
| @@ -229,14 +229,15 @@ static int iwl3945_led_register_led(struct iwl3945_priv *priv, | |||
| 229 | led->led_dev.brightness_set = iwl3945_led_brightness_set; | 229 | led->led_dev.brightness_set = iwl3945_led_brightness_set; |
| 230 | led->led_dev.default_trigger = trigger; | 230 | led->led_dev.default_trigger = trigger; |
| 231 | 231 | ||
| 232 | led->priv = priv; | ||
| 233 | led->type = type; | ||
| 234 | |||
| 232 | ret = led_classdev_register(device, &led->led_dev); | 235 | ret = led_classdev_register(device, &led->led_dev); |
| 233 | if (ret) { | 236 | if (ret) { |
| 234 | IWL_ERROR("Error: failed to register led handler.\n"); | 237 | IWL_ERROR("Error: failed to register led handler.\n"); |
| 235 | return ret; | 238 | return ret; |
| 236 | } | 239 | } |
| 237 | 240 | ||
| 238 | led->priv = priv; | ||
| 239 | led->type = type; | ||
| 240 | led->registered = 1; | 241 | led->registered = 1; |
| 241 | 242 | ||
| 242 | if (set_led && led->led_on) | 243 | if (set_led && led->led_on) |
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 6328b9593877..8124fd9b1353 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
| @@ -1842,6 +1842,9 @@ static void lbs_send_confirmsleep(struct lbs_private *priv) | |||
| 1842 | 1842 | ||
| 1843 | spin_lock_irqsave(&priv->driver_lock, flags); | 1843 | spin_lock_irqsave(&priv->driver_lock, flags); |
| 1844 | 1844 | ||
| 1845 | /* We don't get a response on the sleep-confirmation */ | ||
| 1846 | priv->dnld_sent = DNLD_RES_RECEIVED; | ||
| 1847 | |||
| 1845 | /* If nothing to do, go back to sleep (?) */ | 1848 | /* If nothing to do, go back to sleep (?) */ |
| 1846 | if (!__kfifo_len(priv->event_fifo) && !priv->resp_len[priv->resp_idx]) | 1849 | if (!__kfifo_len(priv->event_fifo) && !priv->resp_len[priv->resp_idx]) |
| 1847 | priv->psstate = PS_STATE_SLEEP; | 1850 | priv->psstate = PS_STATE_SLEEP; |
| @@ -1904,12 +1907,12 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv) | |||
| 1904 | 1907 | ||
| 1905 | lbs_deb_enter(LBS_DEB_HOST); | 1908 | lbs_deb_enter(LBS_DEB_HOST); |
| 1906 | 1909 | ||
| 1910 | spin_lock_irqsave(&priv->driver_lock, flags); | ||
| 1907 | if (priv->dnld_sent) { | 1911 | if (priv->dnld_sent) { |
| 1908 | allowed = 0; | 1912 | allowed = 0; |
| 1909 | lbs_deb_host("dnld_sent was set\n"); | 1913 | lbs_deb_host("dnld_sent was set\n"); |
| 1910 | } | 1914 | } |
| 1911 | 1915 | ||
| 1912 | spin_lock_irqsave(&priv->driver_lock, flags); | ||
| 1913 | /* In-progress command? */ | 1916 | /* In-progress command? */ |
| 1914 | if (priv->cur_cmd) { | 1917 | if (priv->cur_cmd) { |
| 1915 | allowed = 0; | 1918 | allowed = 0; |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index e1f066068590..acfc4bfcc262 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
| @@ -732,8 +732,8 @@ static int lbs_thread(void *data) | |||
| 732 | lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n", | 732 | lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n", |
| 733 | priv->currenttxskb, priv->dnld_sent); | 733 | priv->currenttxskb, priv->dnld_sent); |
| 734 | 734 | ||
| 735 | spin_lock_irq(&priv->driver_lock); | ||
| 736 | /* Process any pending command response */ | 735 | /* Process any pending command response */ |
| 736 | spin_lock_irq(&priv->driver_lock); | ||
| 737 | resp_idx = priv->resp_idx; | 737 | resp_idx = priv->resp_idx; |
| 738 | if (priv->resp_len[resp_idx]) { | 738 | if (priv->resp_len[resp_idx]) { |
| 739 | spin_unlock_irq(&priv->driver_lock); | 739 | spin_unlock_irq(&priv->driver_lock); |
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig index ab1029e79884..2d611876bbe0 100644 --- a/drivers/net/wireless/rt2x00/Kconfig +++ b/drivers/net/wireless/rt2x00/Kconfig | |||
| @@ -32,12 +32,13 @@ config RT2X00_LIB_FIRMWARE | |||
| 32 | config RT2X00_LIB_RFKILL | 32 | config RT2X00_LIB_RFKILL |
| 33 | boolean | 33 | boolean |
| 34 | depends on RT2X00_LIB | 34 | depends on RT2X00_LIB |
| 35 | depends on INPUT | ||
| 35 | select RFKILL | 36 | select RFKILL |
| 36 | select INPUT_POLLDEV | 37 | select INPUT_POLLDEV |
| 37 | 38 | ||
| 38 | config RT2X00_LIB_LEDS | 39 | config RT2X00_LIB_LEDS |
| 39 | boolean | 40 | boolean |
| 40 | depends on RT2X00_LIB | 41 | depends on RT2X00_LIB && NEW_LEDS |
| 41 | 42 | ||
| 42 | config RT2400PCI | 43 | config RT2400PCI |
| 43 | tristate "Ralink rt2400 pci/pcmcia support" | 44 | tristate "Ralink rt2400 pci/pcmcia support" |
| @@ -51,7 +52,7 @@ config RT2400PCI | |||
| 51 | 52 | ||
| 52 | config RT2400PCI_RFKILL | 53 | config RT2400PCI_RFKILL |
| 53 | bool "RT2400 rfkill support" | 54 | bool "RT2400 rfkill support" |
| 54 | depends on RT2400PCI | 55 | depends on RT2400PCI && INPUT |
| 55 | select RT2X00_LIB_RFKILL | 56 | select RT2X00_LIB_RFKILL |
| 56 | ---help--- | 57 | ---help--- |
| 57 | This adds support for integrated rt2400 devices that feature a | 58 | This adds support for integrated rt2400 devices that feature a |
| @@ -60,7 +61,7 @@ config RT2400PCI_RFKILL | |||
| 60 | 61 | ||
| 61 | config RT2400PCI_LEDS | 62 | config RT2400PCI_LEDS |
| 62 | bool "RT2400 leds support" | 63 | bool "RT2400 leds support" |
| 63 | depends on RT2400PCI | 64 | depends on RT2400PCI && NEW_LEDS |
| 64 | select LEDS_CLASS | 65 | select LEDS_CLASS |
| 65 | select RT2X00_LIB_LEDS | 66 | select RT2X00_LIB_LEDS |
| 66 | ---help--- | 67 | ---help--- |
| @@ -78,7 +79,7 @@ config RT2500PCI | |||
| 78 | 79 | ||
| 79 | config RT2500PCI_RFKILL | 80 | config RT2500PCI_RFKILL |
| 80 | bool "RT2500 rfkill support" | 81 | bool "RT2500 rfkill support" |
| 81 | depends on RT2500PCI | 82 | depends on RT2500PCI && INPUT |
| 82 | select RT2X00_LIB_RFKILL | 83 | select RT2X00_LIB_RFKILL |
| 83 | ---help--- | 84 | ---help--- |
| 84 | This adds support for integrated rt2500 devices that feature a | 85 | This adds support for integrated rt2500 devices that feature a |
| @@ -87,7 +88,7 @@ config RT2500PCI_RFKILL | |||
| 87 | 88 | ||
| 88 | config RT2500PCI_LEDS | 89 | config RT2500PCI_LEDS |
| 89 | bool "RT2500 leds support" | 90 | bool "RT2500 leds support" |
| 90 | depends on RT2500PCI | 91 | depends on RT2500PCI && NEW_LEDS |
| 91 | select LEDS_CLASS | 92 | select LEDS_CLASS |
| 92 | select RT2X00_LIB_LEDS | 93 | select RT2X00_LIB_LEDS |
| 93 | ---help--- | 94 | ---help--- |
| @@ -107,7 +108,7 @@ config RT61PCI | |||
| 107 | 108 | ||
| 108 | config RT61PCI_RFKILL | 109 | config RT61PCI_RFKILL |
| 109 | bool "RT61 rfkill support" | 110 | bool "RT61 rfkill support" |
| 110 | depends on RT61PCI | 111 | depends on RT61PCI && INPUT |
| 111 | select RT2X00_LIB_RFKILL | 112 | select RT2X00_LIB_RFKILL |
| 112 | ---help--- | 113 | ---help--- |
| 113 | This adds support for integrated rt61 devices that feature a | 114 | This adds support for integrated rt61 devices that feature a |
| @@ -116,7 +117,7 @@ config RT61PCI_RFKILL | |||
| 116 | 117 | ||
| 117 | config RT61PCI_LEDS | 118 | config RT61PCI_LEDS |
| 118 | bool "RT61 leds support" | 119 | bool "RT61 leds support" |
| 119 | depends on RT61PCI | 120 | depends on RT61PCI && NEW_LEDS |
| 120 | select LEDS_CLASS | 121 | select LEDS_CLASS |
| 121 | select RT2X00_LIB_LEDS | 122 | select RT2X00_LIB_LEDS |
| 122 | ---help--- | 123 | ---help--- |
| @@ -133,7 +134,7 @@ config RT2500USB | |||
| 133 | 134 | ||
| 134 | config RT2500USB_LEDS | 135 | config RT2500USB_LEDS |
| 135 | bool "RT2500 leds support" | 136 | bool "RT2500 leds support" |
| 136 | depends on RT2500USB | 137 | depends on RT2500USB && NEW_LEDS |
| 137 | select LEDS_CLASS | 138 | select LEDS_CLASS |
| 138 | select RT2X00_LIB_LEDS | 139 | select RT2X00_LIB_LEDS |
| 139 | ---help--- | 140 | ---help--- |
| @@ -152,7 +153,7 @@ config RT73USB | |||
| 152 | 153 | ||
| 153 | config RT73USB_LEDS | 154 | config RT73USB_LEDS |
| 154 | bool "RT73 leds support" | 155 | bool "RT73 leds support" |
| 155 | depends on RT73USB | 156 | depends on RT73USB && NEW_LEDS |
| 156 | select LEDS_CLASS | 157 | select LEDS_CLASS |
| 157 | select RT2X00_LIB_LEDS | 158 | select RT2X00_LIB_LEDS |
| 158 | ---help--- | 159 | ---help--- |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 971af2546b59..60893de3bf8f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
| @@ -412,8 +412,7 @@ int rt2x00pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) | |||
| 412 | if (pci_set_mwi(pci_dev)) | 412 | if (pci_set_mwi(pci_dev)) |
| 413 | ERROR_PROBE("MWI not available.\n"); | 413 | ERROR_PROBE("MWI not available.\n"); |
| 414 | 414 | ||
| 415 | if (pci_set_dma_mask(pci_dev, DMA_64BIT_MASK) && | 415 | if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { |
| 416 | pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { | ||
| 417 | ERROR_PROBE("PCI DMA not supported.\n"); | 416 | ERROR_PROBE("PCI DMA not supported.\n"); |
| 418 | retval = -EIO; | 417 | retval = -EIO; |
| 419 | goto exit_disable_device; | 418 | goto exit_disable_device; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 5a331674dcb2..e5ceae805b57 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
| @@ -362,6 +362,12 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
| 362 | } | 362 | } |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | /* | ||
| 366 | * Kill guardian urb (if required by driver). | ||
| 367 | */ | ||
| 368 | if (!test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags)) | ||
| 369 | return; | ||
| 370 | |||
| 365 | for (i = 0; i < rt2x00dev->bcn->limit; i++) { | 371 | for (i = 0; i < rt2x00dev->bcn->limit; i++) { |
| 366 | priv_bcn = rt2x00dev->bcn->entries[i].priv_data; | 372 | priv_bcn = rt2x00dev->bcn->entries[i].priv_data; |
| 367 | usb_kill_urb(priv_bcn->urb); | 373 | usb_kill_urb(priv_bcn->urb); |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index da19a3a91f4d..fff8386e816b 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -2131,6 +2131,7 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
| 2131 | /* D-Link */ | 2131 | /* D-Link */ |
| 2132 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, | 2132 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2133 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, | 2133 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2134 | { USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
| 2134 | { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, | 2135 | { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, |
| 2135 | /* Gemtek */ | 2136 | /* Gemtek */ |
| 2136 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, | 2137 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, |
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index 6424e5a2c83d..418606ac1c3b 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c | |||
| @@ -719,7 +719,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length) | |||
| 719 | fc = le16_to_cpu(*((__le16 *) buffer)); | 719 | fc = le16_to_cpu(*((__le16 *) buffer)); |
| 720 | 720 | ||
| 721 | is_qos = ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && | 721 | is_qos = ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && |
| 722 | ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_QOS_DATA); | 722 | (fc & IEEE80211_STYPE_QOS_DATA); |
| 723 | is_4addr = (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == | 723 | is_4addr = (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == |
| 724 | (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS); | 724 | (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS); |
| 725 | need_padding = is_qos ^ is_4addr; | 725 | need_padding = is_qos ^ is_4addr; |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 72cf61ed8f96..e1637bd82b8e 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -181,7 +181,7 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, | |||
| 181 | any need to change it. */ | 181 | any need to change it. */ |
| 182 | struct mempolicy *oldpol; | 182 | struct mempolicy *oldpol; |
| 183 | cpumask_t oldmask = current->cpus_allowed; | 183 | cpumask_t oldmask = current->cpus_allowed; |
| 184 | int node = pcibus_to_node(dev->bus); | 184 | int node = dev_to_node(&dev->dev); |
| 185 | 185 | ||
| 186 | if (node >= 0) { | 186 | if (node >= 0) { |
| 187 | node_to_cpumask_ptr(nodecpumask, node); | 187 | node_to_cpumask_ptr(nodecpumask, node); |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 271d41cc05ab..6f3c7446c329 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -489,13 +489,13 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, | |||
| 489 | * @kobj: kobject for mapping | 489 | * @kobj: kobject for mapping |
| 490 | * @attr: struct bin_attribute for the file being mapped | 490 | * @attr: struct bin_attribute for the file being mapped |
| 491 | * @vma: struct vm_area_struct passed into the mmap | 491 | * @vma: struct vm_area_struct passed into the mmap |
| 492 | * @write_combine: 1 for write_combine mapping | ||
| 492 | * | 493 | * |
| 493 | * Use the regular PCI mapping routines to map a PCI resource into userspace. | 494 | * Use the regular PCI mapping routines to map a PCI resource into userspace. |
| 494 | * FIXME: write combining? maybe automatic for prefetchable regions? | ||
| 495 | */ | 495 | */ |
| 496 | static int | 496 | static int |
| 497 | pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, | 497 | pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, |
| 498 | struct vm_area_struct *vma) | 498 | struct vm_area_struct *vma, int write_combine) |
| 499 | { | 499 | { |
| 500 | struct pci_dev *pdev = to_pci_dev(container_of(kobj, | 500 | struct pci_dev *pdev = to_pci_dev(container_of(kobj, |
| 501 | struct device, kobj)); | 501 | struct device, kobj)); |
| @@ -518,7 +518,21 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, | |||
| 518 | vma->vm_pgoff += start >> PAGE_SHIFT; | 518 | vma->vm_pgoff += start >> PAGE_SHIFT; |
| 519 | mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; | 519 | mmap_type = res->flags & IORESOURCE_MEM ? pci_mmap_mem : pci_mmap_io; |
| 520 | 520 | ||
| 521 | return pci_mmap_page_range(pdev, vma, mmap_type, 0); | 521 | return pci_mmap_page_range(pdev, vma, mmap_type, write_combine); |
| 522 | } | ||
| 523 | |||
| 524 | static int | ||
| 525 | pci_mmap_resource_uc(struct kobject *kobj, struct bin_attribute *attr, | ||
| 526 | struct vm_area_struct *vma) | ||
| 527 | { | ||
| 528 | return pci_mmap_resource(kobj, attr, vma, 0); | ||
| 529 | } | ||
| 530 | |||
| 531 | static int | ||
| 532 | pci_mmap_resource_wc(struct kobject *kobj, struct bin_attribute *attr, | ||
| 533 | struct vm_area_struct *vma) | ||
| 534 | { | ||
| 535 | return pci_mmap_resource(kobj, attr, vma, 1); | ||
| 522 | } | 536 | } |
| 523 | 537 | ||
| 524 | /** | 538 | /** |
| @@ -541,9 +555,46 @@ pci_remove_resource_files(struct pci_dev *pdev) | |||
| 541 | sysfs_remove_bin_file(&pdev->dev.kobj, res_attr); | 555 | sysfs_remove_bin_file(&pdev->dev.kobj, res_attr); |
| 542 | kfree(res_attr); | 556 | kfree(res_attr); |
| 543 | } | 557 | } |
| 558 | |||
| 559 | res_attr = pdev->res_attr_wc[i]; | ||
| 560 | if (res_attr) { | ||
| 561 | sysfs_remove_bin_file(&pdev->dev.kobj, res_attr); | ||
| 562 | kfree(res_attr); | ||
| 563 | } | ||
| 544 | } | 564 | } |
| 545 | } | 565 | } |
| 546 | 566 | ||
| 567 | static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine) | ||
| 568 | { | ||
| 569 | /* allocate attribute structure, piggyback attribute name */ | ||
| 570 | int name_len = write_combine ? 13 : 10; | ||
| 571 | struct bin_attribute *res_attr; | ||
| 572 | int retval; | ||
| 573 | |||
| 574 | res_attr = kzalloc(sizeof(*res_attr) + name_len, GFP_ATOMIC); | ||
| 575 | if (res_attr) { | ||
| 576 | char *res_attr_name = (char *)(res_attr + 1); | ||
| 577 | |||
| 578 | if (write_combine) { | ||
| 579 | pdev->res_attr_wc[num] = res_attr; | ||
| 580 | sprintf(res_attr_name, "resource%d_wc", num); | ||
| 581 | res_attr->mmap = pci_mmap_resource_wc; | ||
| 582 | } else { | ||
| 583 | pdev->res_attr[num] = res_attr; | ||
| 584 | sprintf(res_attr_name, "resource%d", num); | ||
| 585 | res_attr->mmap = pci_mmap_resource_uc; | ||
| 586 | } | ||
| 587 | res_attr->attr.name = res_attr_name; | ||
| 588 | res_attr->attr.mode = S_IRUSR | S_IWUSR; | ||
| 589 | res_attr->size = pci_resource_len(pdev, num); | ||
| 590 | res_attr->private = &pdev->resource[num]; | ||
| 591 | retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr); | ||
| 592 | } else | ||
| 593 | retval = -ENOMEM; | ||
| 594 | |||
| 595 | return retval; | ||
| 596 | } | ||
| 597 | |||
| 547 | /** | 598 | /** |
| 548 | * pci_create_resource_files - create resource files in sysfs for @dev | 599 | * pci_create_resource_files - create resource files in sysfs for @dev |
| 549 | * @dev: dev in question | 600 | * @dev: dev in question |
| @@ -557,31 +608,19 @@ static int pci_create_resource_files(struct pci_dev *pdev) | |||
| 557 | 608 | ||
| 558 | /* Expose the PCI resources from this device as files */ | 609 | /* Expose the PCI resources from this device as files */ |
| 559 | for (i = 0; i < PCI_ROM_RESOURCE; i++) { | 610 | for (i = 0; i < PCI_ROM_RESOURCE; i++) { |
| 560 | struct bin_attribute *res_attr; | ||
| 561 | 611 | ||
| 562 | /* skip empty resources */ | 612 | /* skip empty resources */ |
| 563 | if (!pci_resource_len(pdev, i)) | 613 | if (!pci_resource_len(pdev, i)) |
| 564 | continue; | 614 | continue; |
| 565 | 615 | ||
| 566 | /* allocate attribute structure, piggyback attribute name */ | 616 | retval = pci_create_attr(pdev, i, 0); |
| 567 | res_attr = kzalloc(sizeof(*res_attr) + 10, GFP_ATOMIC); | 617 | /* for prefetchable resources, create a WC mappable file */ |
| 568 | if (res_attr) { | 618 | if (!retval && pdev->resource[i].flags & IORESOURCE_PREFETCH) |
| 569 | char *res_attr_name = (char *)(res_attr + 1); | 619 | retval = pci_create_attr(pdev, i, 1); |
| 570 | 620 | ||
| 571 | pdev->res_attr[i] = res_attr; | 621 | if (retval) { |
| 572 | sprintf(res_attr_name, "resource%d", i); | 622 | pci_remove_resource_files(pdev); |
| 573 | res_attr->attr.name = res_attr_name; | 623 | return retval; |
| 574 | res_attr->attr.mode = S_IRUSR | S_IWUSR; | ||
| 575 | res_attr->size = pci_resource_len(pdev, i); | ||
| 576 | res_attr->mmap = pci_mmap_resource; | ||
| 577 | res_attr->private = &pdev->resource[i]; | ||
| 578 | retval = sysfs_create_bin_file(&pdev->dev.kobj, res_attr); | ||
| 579 | if (retval) { | ||
| 580 | pci_remove_resource_files(pdev); | ||
| 581 | return retval; | ||
| 582 | } | ||
| 583 | } else { | ||
| 584 | return -ENOMEM; | ||
| 585 | } | 624 | } |
| 586 | } | 625 | } |
| 587 | return 0; | 626 | return 0; |
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index 0201c8adfda7..46c791adb894 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
| @@ -50,15 +50,17 @@ static int irq_flags(int triggering, int polarity, int shareable) | |||
| 50 | flags = IORESOURCE_IRQ_HIGHEDGE; | 50 | flags = IORESOURCE_IRQ_HIGHEDGE; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | if (shareable) | 53 | if (shareable == ACPI_SHARED) |
| 54 | flags |= IORESOURCE_IRQ_SHAREABLE; | 54 | flags |= IORESOURCE_IRQ_SHAREABLE; |
| 55 | 55 | ||
| 56 | return flags; | 56 | return flags; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | static void decode_irq_flags(int flag, int *triggering, int *polarity) | 59 | static void decode_irq_flags(struct pnp_dev *dev, int flags, int *triggering, |
| 60 | int *polarity, int *shareable) | ||
| 60 | { | 61 | { |
| 61 | switch (flag) { | 62 | switch (flags & (IORESOURCE_IRQ_LOWLEVEL | IORESOURCE_IRQ_HIGHLEVEL | |
| 63 | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE)) { | ||
| 62 | case IORESOURCE_IRQ_LOWLEVEL: | 64 | case IORESOURCE_IRQ_LOWLEVEL: |
| 63 | *triggering = ACPI_LEVEL_SENSITIVE; | 65 | *triggering = ACPI_LEVEL_SENSITIVE; |
| 64 | *polarity = ACPI_ACTIVE_LOW; | 66 | *polarity = ACPI_ACTIVE_LOW; |
| @@ -75,7 +77,18 @@ static void decode_irq_flags(int flag, int *triggering, int *polarity) | |||
| 75 | *triggering = ACPI_EDGE_SENSITIVE; | 77 | *triggering = ACPI_EDGE_SENSITIVE; |
| 76 | *polarity = ACPI_ACTIVE_HIGH; | 78 | *polarity = ACPI_ACTIVE_HIGH; |
| 77 | break; | 79 | break; |
| 80 | default: | ||
| 81 | dev_err(&dev->dev, "can't encode invalid IRQ mode %#x\n", | ||
| 82 | flags); | ||
| 83 | *triggering = ACPI_EDGE_SENSITIVE; | ||
| 84 | *polarity = ACPI_ACTIVE_HIGH; | ||
| 85 | break; | ||
| 78 | } | 86 | } |
| 87 | |||
| 88 | if (flags & IORESOURCE_IRQ_SHAREABLE) | ||
| 89 | *shareable = ACPI_SHARED; | ||
| 90 | else | ||
| 91 | *shareable = ACPI_EXCLUSIVE; | ||
| 79 | } | 92 | } |
| 80 | 93 | ||
| 81 | static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev, | 94 | static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev, |
| @@ -742,6 +755,9 @@ static acpi_status pnpacpi_type_resources(struct acpi_resource *res, void *data) | |||
| 742 | if (pnpacpi_supported_resource(res)) { | 755 | if (pnpacpi_supported_resource(res)) { |
| 743 | (*resource)->type = res->type; | 756 | (*resource)->type = res->type; |
| 744 | (*resource)->length = sizeof(struct acpi_resource); | 757 | (*resource)->length = sizeof(struct acpi_resource); |
| 758 | if (res->type == ACPI_RESOURCE_TYPE_IRQ) | ||
| 759 | (*resource)->data.irq.descriptor_length = | ||
| 760 | res->data.irq.descriptor_length; | ||
| 745 | (*resource)++; | 761 | (*resource)++; |
| 746 | } | 762 | } |
| 747 | 763 | ||
| @@ -788,22 +804,21 @@ static void pnpacpi_encode_irq(struct pnp_dev *dev, | |||
| 788 | struct resource *p) | 804 | struct resource *p) |
| 789 | { | 805 | { |
| 790 | struct acpi_resource_irq *irq = &resource->data.irq; | 806 | struct acpi_resource_irq *irq = &resource->data.irq; |
| 791 | int triggering, polarity; | 807 | int triggering, polarity, shareable; |
| 792 | 808 | ||
| 793 | decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity); | 809 | decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable); |
| 794 | irq->triggering = triggering; | 810 | irq->triggering = triggering; |
| 795 | irq->polarity = polarity; | 811 | irq->polarity = polarity; |
| 796 | if (triggering == ACPI_EDGE_SENSITIVE) | 812 | irq->sharable = shareable; |
| 797 | irq->sharable = ACPI_EXCLUSIVE; | ||
| 798 | else | ||
| 799 | irq->sharable = ACPI_SHARED; | ||
| 800 | irq->interrupt_count = 1; | 813 | irq->interrupt_count = 1; |
| 801 | irq->interrupts[0] = p->start; | 814 | irq->interrupts[0] = p->start; |
| 802 | 815 | ||
| 803 | dev_dbg(&dev->dev, " encode irq %d %s %s %s\n", (int) p->start, | 816 | dev_dbg(&dev->dev, " encode irq %d %s %s %s (%d-byte descriptor)\n", |
| 817 | (int) p->start, | ||
| 804 | triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge", | 818 | triggering == ACPI_LEVEL_SENSITIVE ? "level" : "edge", |
| 805 | polarity == ACPI_ACTIVE_LOW ? "low" : "high", | 819 | polarity == ACPI_ACTIVE_LOW ? "low" : "high", |
| 806 | irq->sharable == ACPI_SHARED ? "shared" : "exclusive"); | 820 | irq->sharable == ACPI_SHARED ? "shared" : "exclusive", |
| 821 | irq->descriptor_length); | ||
| 807 | } | 822 | } |
| 808 | 823 | ||
| 809 | static void pnpacpi_encode_ext_irq(struct pnp_dev *dev, | 824 | static void pnpacpi_encode_ext_irq(struct pnp_dev *dev, |
| @@ -811,16 +826,13 @@ static void pnpacpi_encode_ext_irq(struct pnp_dev *dev, | |||
| 811 | struct resource *p) | 826 | struct resource *p) |
| 812 | { | 827 | { |
| 813 | struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq; | 828 | struct acpi_resource_extended_irq *extended_irq = &resource->data.extended_irq; |
| 814 | int triggering, polarity; | 829 | int triggering, polarity, shareable; |
| 815 | 830 | ||
| 816 | decode_irq_flags(p->flags & IORESOURCE_BITS, &triggering, &polarity); | 831 | decode_irq_flags(dev, p->flags, &triggering, &polarity, &shareable); |
| 817 | extended_irq->producer_consumer = ACPI_CONSUMER; | 832 | extended_irq->producer_consumer = ACPI_CONSUMER; |
| 818 | extended_irq->triggering = triggering; | 833 | extended_irq->triggering = triggering; |
| 819 | extended_irq->polarity = polarity; | 834 | extended_irq->polarity = polarity; |
| 820 | if (triggering == ACPI_EDGE_SENSITIVE) | 835 | extended_irq->sharable = shareable; |
| 821 | extended_irq->sharable = ACPI_EXCLUSIVE; | ||
| 822 | else | ||
| 823 | extended_irq->sharable = ACPI_SHARED; | ||
| 824 | extended_irq->interrupt_count = 1; | 836 | extended_irq->interrupt_count = 1; |
| 825 | extended_irq->interrupts[0] = p->start; | 837 | extended_irq->interrupts[0] = p->start; |
| 826 | 838 | ||
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 60f8afc7a56e..4949dc4859be 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -256,6 +256,17 @@ config RTC_DRV_S35390A | |||
| 256 | This driver can also be built as a module. If so the module | 256 | This driver can also be built as a module. If so the module |
| 257 | will be called rtc-s35390a. | 257 | will be called rtc-s35390a. |
| 258 | 258 | ||
| 259 | config RTC_DRV_FM3130 | ||
| 260 | tristate "Ramtron FM3130" | ||
| 261 | help | ||
| 262 | If you say Y here you will get support for the | ||
| 263 | Ramtron FM3130 RTC chips. | ||
| 264 | Ramtron FM3130 is a chip with two separate devices inside, | ||
| 265 | RTC clock and FRAM. This driver provides only RTC functionality. | ||
| 266 | |||
| 267 | This driver can also be built as a module. If so the module | ||
| 268 | will be called rtc-fm3130. | ||
| 269 | |||
| 259 | endif # I2C | 270 | endif # I2C |
| 260 | 271 | ||
| 261 | comment "SPI RTC drivers" | 272 | comment "SPI RTC drivers" |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index ebe871cf16c1..b6e14d51670b 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
| @@ -31,6 +31,7 @@ obj-$(CONFIG_RTC_DRV_DS1553) += rtc-ds1553.o | |||
| 31 | obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o | 31 | obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o |
| 32 | obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o | 32 | obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o |
| 33 | obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o | 33 | obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o |
| 34 | obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o | ||
| 34 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o | 35 | obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o |
| 35 | obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o | 36 | obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o |
| 36 | obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o | 37 | obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o |
| @@ -41,6 +42,7 @@ obj-$(CONFIG_RTC_DRV_OMAP) += rtc-omap.o | |||
| 41 | obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o | 42 | obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o |
| 42 | obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o | 43 | obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o |
| 43 | obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o | 44 | obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o |
| 45 | obj-$(CONFIG_RTC_DRV_PPC) += rtc-ppc.o | ||
| 44 | obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o | 46 | obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o |
| 45 | obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o | 47 | obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o |
| 46 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o | 48 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o |
| @@ -54,4 +56,3 @@ obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o | |||
| 54 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o | 56 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o |
| 55 | obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o | 57 | obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o |
| 56 | obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o | 58 | obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o |
| 57 | obj-$(CONFIG_RTC_DRV_PPC) += rtc-ppc.o | ||
diff --git a/drivers/rtc/rtc-at32ap700x.c b/drivers/rtc/rtc-at32ap700x.c index 42244f14b41c..2ef8cdfda4a7 100644 --- a/drivers/rtc/rtc-at32ap700x.c +++ b/drivers/rtc/rtc-at32ap700x.c | |||
| @@ -94,8 +94,11 @@ static int at32_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 94 | { | 94 | { |
| 95 | struct rtc_at32ap700x *rtc = dev_get_drvdata(dev); | 95 | struct rtc_at32ap700x *rtc = dev_get_drvdata(dev); |
| 96 | 96 | ||
| 97 | spin_lock_irq(&rtc->lock); | ||
| 97 | rtc_time_to_tm(rtc->alarm_time, &alrm->time); | 98 | rtc_time_to_tm(rtc->alarm_time, &alrm->time); |
| 98 | alrm->pending = rtc_readl(rtc, IMR) & RTC_BIT(IMR_TOPI) ? 1 : 0; | 99 | alrm->enabled = rtc_readl(rtc, IMR) & RTC_BIT(IMR_TOPI) ? 1 : 0; |
| 100 | alrm->pending = rtc_readl(rtc, ISR) & RTC_BIT(ISR_TOPI) ? 1 : 0; | ||
| 101 | spin_unlock_irq(&rtc->lock); | ||
| 99 | 102 | ||
| 100 | return 0; | 103 | return 0; |
| 101 | } | 104 | } |
| @@ -119,7 +122,7 @@ static int at32_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 119 | spin_lock_irq(&rtc->lock); | 122 | spin_lock_irq(&rtc->lock); |
| 120 | rtc->alarm_time = alarm_unix_time; | 123 | rtc->alarm_time = alarm_unix_time; |
| 121 | rtc_writel(rtc, TOP, rtc->alarm_time); | 124 | rtc_writel(rtc, TOP, rtc->alarm_time); |
| 122 | if (alrm->pending) | 125 | if (alrm->enabled) |
| 123 | rtc_writel(rtc, CTRL, rtc_readl(rtc, CTRL) | 126 | rtc_writel(rtc, CTRL, rtc_readl(rtc, CTRL) |
| 124 | | RTC_BIT(CTRL_TOPEN)); | 127 | | RTC_BIT(CTRL_TOPEN)); |
| 125 | else | 128 | else |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index d060a06ce05b..d7bb9bac71df 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -905,19 +905,7 @@ static struct pnp_driver cmos_pnp_driver = { | |||
| 905 | .resume = cmos_pnp_resume, | 905 | .resume = cmos_pnp_resume, |
| 906 | }; | 906 | }; |
| 907 | 907 | ||
| 908 | static int __init cmos_init(void) | 908 | #endif /* CONFIG_PNP */ |
| 909 | { | ||
| 910 | return pnp_register_driver(&cmos_pnp_driver); | ||
| 911 | } | ||
| 912 | module_init(cmos_init); | ||
| 913 | |||
| 914 | static void __exit cmos_exit(void) | ||
| 915 | { | ||
| 916 | pnp_unregister_driver(&cmos_pnp_driver); | ||
| 917 | } | ||
| 918 | module_exit(cmos_exit); | ||
| 919 | |||
| 920 | #else /* no PNP */ | ||
| 921 | 909 | ||
| 922 | /*----------------------------------------------------------------*/ | 910 | /*----------------------------------------------------------------*/ |
| 923 | 911 | ||
| @@ -958,20 +946,33 @@ static struct platform_driver cmos_platform_driver = { | |||
| 958 | 946 | ||
| 959 | static int __init cmos_init(void) | 947 | static int __init cmos_init(void) |
| 960 | { | 948 | { |
| 949 | #ifdef CONFIG_PNP | ||
| 950 | if (pnp_platform_devices) | ||
| 951 | return pnp_register_driver(&cmos_pnp_driver); | ||
| 952 | else | ||
| 953 | return platform_driver_probe(&cmos_platform_driver, | ||
| 954 | cmos_platform_probe); | ||
| 955 | #else | ||
| 961 | return platform_driver_probe(&cmos_platform_driver, | 956 | return platform_driver_probe(&cmos_platform_driver, |
| 962 | cmos_platform_probe); | 957 | cmos_platform_probe); |
| 958 | #endif /* CONFIG_PNP */ | ||
| 963 | } | 959 | } |
| 964 | module_init(cmos_init); | 960 | module_init(cmos_init); |
| 965 | 961 | ||
| 966 | static void __exit cmos_exit(void) | 962 | static void __exit cmos_exit(void) |
| 967 | { | 963 | { |
| 964 | #ifdef CONFIG_PNP | ||
| 965 | if (pnp_platform_devices) | ||
| 966 | pnp_unregister_driver(&cmos_pnp_driver); | ||
| 967 | else | ||
| 968 | platform_driver_unregister(&cmos_platform_driver); | ||
| 969 | #else | ||
| 968 | platform_driver_unregister(&cmos_platform_driver); | 970 | platform_driver_unregister(&cmos_platform_driver); |
| 971 | #endif /* CONFIG_PNP */ | ||
| 969 | } | 972 | } |
| 970 | module_exit(cmos_exit); | 973 | module_exit(cmos_exit); |
| 971 | 974 | ||
| 972 | 975 | ||
| 973 | #endif /* !PNP */ | ||
| 974 | |||
| 975 | MODULE_AUTHOR("David Brownell"); | 976 | MODULE_AUTHOR("David Brownell"); |
| 976 | MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs"); | 977 | MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs"); |
| 977 | MODULE_LICENSE("GPL"); | 978 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/rtc/rtc-fm3130.c b/drivers/rtc/rtc-fm3130.c new file mode 100644 index 000000000000..11644c8fca82 --- /dev/null +++ b/drivers/rtc/rtc-fm3130.c | |||
| @@ -0,0 +1,501 @@ | |||
| 1 | /* | ||
| 2 | * rtc-fm3130.c - RTC driver for Ramtron FM3130 I2C chip. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 Sergey Lapin | ||
| 5 | * Based on ds1307 driver by James Chapman and David Brownell | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/module.h> | ||
| 13 | #include <linux/i2c.h> | ||
| 14 | #include <linux/rtc.h> | ||
| 15 | #include <linux/bcd.h> | ||
| 16 | |||
| 17 | #define FM3130_RTC_CONTROL (0x0) | ||
| 18 | #define FM3130_CAL_CONTROL (0x1) | ||
| 19 | #define FM3130_RTC_SECONDS (0x2) | ||
| 20 | #define FM3130_RTC_MINUTES (0x3) | ||
| 21 | #define FM3130_RTC_HOURS (0x4) | ||
| 22 | #define FM3130_RTC_DAY (0x5) | ||
| 23 | #define FM3130_RTC_DATE (0x6) | ||
| 24 | #define FM3130_RTC_MONTHS (0x7) | ||
| 25 | #define FM3130_RTC_YEARS (0x8) | ||
| 26 | |||
| 27 | #define FM3130_ALARM_SECONDS (0x9) | ||
| 28 | #define FM3130_ALARM_MINUTES (0xa) | ||
| 29 | #define FM3130_ALARM_HOURS (0xb) | ||
| 30 | #define FM3130_ALARM_DATE (0xc) | ||
| 31 | #define FM3130_ALARM_MONTHS (0xd) | ||
| 32 | #define FM3130_ALARM_WP_CONTROL (0xe) | ||
| 33 | |||
| 34 | #define FM3130_CAL_CONTROL_BIT_nOSCEN (1 << 7) /* Osciallator enabled */ | ||
| 35 | #define FM3130_RTC_CONTROL_BIT_LB (1 << 7) /* Low battery */ | ||
| 36 | #define FM3130_RTC_CONTROL_BIT_AF (1 << 6) /* Alarm flag */ | ||
| 37 | #define FM3130_RTC_CONTROL_BIT_CF (1 << 5) /* Century overflow */ | ||
| 38 | #define FM3130_RTC_CONTROL_BIT_POR (1 << 4) /* Power on reset */ | ||
| 39 | #define FM3130_RTC_CONTROL_BIT_AEN (1 << 3) /* Alarm enable */ | ||
| 40 | #define FM3130_RTC_CONTROL_BIT_CAL (1 << 2) /* Calibration mode */ | ||
| 41 | #define FM3130_RTC_CONTROL_BIT_WRITE (1 << 1) /* W=1 -> write mode W=0 normal */ | ||
| 42 | #define FM3130_RTC_CONTROL_BIT_READ (1 << 0) /* R=1 -> read mode R=0 normal */ | ||
| 43 | |||
| 44 | #define FM3130_CLOCK_REGS 7 | ||
| 45 | #define FM3130_ALARM_REGS 5 | ||
| 46 | |||
| 47 | struct fm3130 { | ||
| 48 | u8 reg_addr_time; | ||
| 49 | u8 reg_addr_alarm; | ||
| 50 | u8 regs[15]; | ||
| 51 | struct i2c_msg msg[4]; | ||
| 52 | struct i2c_client *client; | ||
| 53 | struct rtc_device *rtc; | ||
| 54 | int data_valid; | ||
| 55 | int alarm; | ||
| 56 | }; | ||
| 57 | static const struct i2c_device_id fm3130_id[] = { | ||
| 58 | { "fm3130-rtc", 0 }, | ||
| 59 | { } | ||
| 60 | }; | ||
| 61 | MODULE_DEVICE_TABLE(i2c, fm3130_id); | ||
| 62 | |||
| 63 | #define FM3130_MODE_NORMAL 0 | ||
| 64 | #define FM3130_MODE_WRITE 1 | ||
| 65 | #define FM3130_MODE_READ 2 | ||
| 66 | |||
| 67 | static void fm3130_rtc_mode(struct device *dev, int mode) | ||
| 68 | { | ||
| 69 | struct fm3130 *fm3130 = dev_get_drvdata(dev); | ||
| 70 | |||
| 71 | fm3130->regs[FM3130_RTC_CONTROL] = | ||
| 72 | i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL); | ||
| 73 | switch (mode) { | ||
| 74 | case FM3130_MODE_NORMAL: | ||
| 75 | fm3130->regs[FM3130_RTC_CONTROL] &= | ||
| 76 | ~(FM3130_RTC_CONTROL_BIT_WRITE | | ||
| 77 | FM3130_RTC_CONTROL_BIT_READ); | ||
| 78 | break; | ||
| 79 | case FM3130_MODE_WRITE: | ||
| 80 | fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_WRITE; | ||
| 81 | break; | ||
| 82 | case FM3130_MODE_READ: | ||
| 83 | fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_READ; | ||
| 84 | break; | ||
| 85 | default: | ||
| 86 | dev_dbg(dev, "invalid mode %d\n", mode); | ||
| 87 | break; | ||
| 88 | } | ||
| 89 | /* Checking for alarm */ | ||
| 90 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AF) { | ||
| 91 | fm3130->alarm = 1; | ||
| 92 | fm3130->regs[FM3130_RTC_CONTROL] &= ~FM3130_RTC_CONTROL_BIT_AF; | ||
| 93 | } | ||
| 94 | i2c_smbus_write_byte_data(fm3130->client, | ||
| 95 | FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL]); | ||
| 96 | } | ||
| 97 | |||
| 98 | static int fm3130_get_time(struct device *dev, struct rtc_time *t) | ||
| 99 | { | ||
| 100 | struct fm3130 *fm3130 = dev_get_drvdata(dev); | ||
| 101 | int tmp; | ||
| 102 | |||
| 103 | if (!fm3130->data_valid) { | ||
| 104 | /* We have invalid data in RTC, probably due | ||
| 105 | to battery faults or other problems. Return EIO | ||
| 106 | for now, it will allow us to set data later insted | ||
| 107 | of error during probing which disables device */ | ||
| 108 | return -EIO; | ||
| 109 | } | ||
| 110 | fm3130_rtc_mode(dev, FM3130_MODE_READ); | ||
| 111 | |||
| 112 | /* read the RTC date and time registers all at once */ | ||
| 113 | tmp = i2c_transfer(to_i2c_adapter(fm3130->client->dev.parent), | ||
| 114 | fm3130->msg, 2); | ||
| 115 | if (tmp != 2) { | ||
| 116 | dev_err(dev, "%s error %d\n", "read", tmp); | ||
| 117 | return -EIO; | ||
| 118 | } | ||
| 119 | |||
| 120 | fm3130_rtc_mode(dev, FM3130_MODE_NORMAL); | ||
| 121 | |||
| 122 | dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x %02x" | ||
| 123 | "%02x %02x %02x %02x %02x %02x %02x\n", | ||
| 124 | "read", | ||
| 125 | fm3130->regs[0], fm3130->regs[1], | ||
| 126 | fm3130->regs[2], fm3130->regs[3], | ||
| 127 | fm3130->regs[4], fm3130->regs[5], | ||
| 128 | fm3130->regs[6], fm3130->regs[7], | ||
| 129 | fm3130->regs[8], fm3130->regs[9], | ||
| 130 | fm3130->regs[0xa], fm3130->regs[0xb], | ||
| 131 | fm3130->regs[0xc], fm3130->regs[0xd], | ||
| 132 | fm3130->regs[0xe]); | ||
| 133 | |||
| 134 | t->tm_sec = BCD2BIN(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f); | ||
| 135 | t->tm_min = BCD2BIN(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f); | ||
| 136 | tmp = fm3130->regs[FM3130_RTC_HOURS] & 0x3f; | ||
| 137 | t->tm_hour = BCD2BIN(tmp); | ||
| 138 | t->tm_wday = BCD2BIN(fm3130->regs[FM3130_RTC_DAY] & 0x07) - 1; | ||
| 139 | t->tm_mday = BCD2BIN(fm3130->regs[FM3130_RTC_DATE] & 0x3f); | ||
| 140 | tmp = fm3130->regs[FM3130_RTC_MONTHS] & 0x1f; | ||
| 141 | t->tm_mon = BCD2BIN(tmp) - 1; | ||
| 142 | |||
| 143 | /* assume 20YY not 19YY, and ignore CF bit */ | ||
| 144 | t->tm_year = BCD2BIN(fm3130->regs[FM3130_RTC_YEARS]) + 100; | ||
| 145 | |||
| 146 | dev_dbg(dev, "%s secs=%d, mins=%d, " | ||
| 147 | "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", | ||
| 148 | "read", t->tm_sec, t->tm_min, | ||
| 149 | t->tm_hour, t->tm_mday, | ||
| 150 | t->tm_mon, t->tm_year, t->tm_wday); | ||
| 151 | |||
| 152 | /* initial clock setting can be undefined */ | ||
| 153 | return rtc_valid_tm(t); | ||
| 154 | } | ||
| 155 | |||
| 156 | |||
| 157 | static int fm3130_set_time(struct device *dev, struct rtc_time *t) | ||
| 158 | { | ||
| 159 | struct fm3130 *fm3130 = dev_get_drvdata(dev); | ||
| 160 | int tmp, i; | ||
| 161 | u8 *buf = fm3130->regs; | ||
| 162 | |||
| 163 | dev_dbg(dev, "%s secs=%d, mins=%d, " | ||
| 164 | "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", | ||
| 165 | "write", t->tm_sec, t->tm_min, | ||
| 166 | t->tm_hour, t->tm_mday, | ||
| 167 | t->tm_mon, t->tm_year, t->tm_wday); | ||
| 168 | |||
| 169 | /* first register addr */ | ||
| 170 | buf[FM3130_RTC_SECONDS] = BIN2BCD(t->tm_sec); | ||
| 171 | buf[FM3130_RTC_MINUTES] = BIN2BCD(t->tm_min); | ||
| 172 | buf[FM3130_RTC_HOURS] = BIN2BCD(t->tm_hour); | ||
| 173 | buf[FM3130_RTC_DAY] = BIN2BCD(t->tm_wday + 1); | ||
| 174 | buf[FM3130_RTC_DATE] = BIN2BCD(t->tm_mday); | ||
| 175 | buf[FM3130_RTC_MONTHS] = BIN2BCD(t->tm_mon + 1); | ||
| 176 | |||
| 177 | /* assume 20YY not 19YY */ | ||
| 178 | tmp = t->tm_year - 100; | ||
| 179 | buf[FM3130_RTC_YEARS] = BIN2BCD(tmp); | ||
| 180 | |||
| 181 | dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x" | ||
| 182 | "%02x %02x %02x %02x %02x %02x %02x %02x\n", | ||
| 183 | "write", buf[0], buf[1], buf[2], buf[3], | ||
| 184 | buf[4], buf[5], buf[6], buf[7], | ||
| 185 | buf[8], buf[9], buf[0xa], buf[0xb], | ||
| 186 | buf[0xc], buf[0xd], buf[0xe]); | ||
| 187 | |||
| 188 | fm3130_rtc_mode(dev, FM3130_MODE_WRITE); | ||
| 189 | |||
| 190 | /* Writing time registers, we don't support multibyte transfers */ | ||
| 191 | for (i = 0; i < FM3130_CLOCK_REGS; i++) { | ||
| 192 | i2c_smbus_write_byte_data(fm3130->client, | ||
| 193 | FM3130_RTC_SECONDS + i, | ||
| 194 | fm3130->regs[FM3130_RTC_SECONDS + i]); | ||
| 195 | } | ||
| 196 | |||
| 197 | fm3130_rtc_mode(dev, FM3130_MODE_NORMAL); | ||
| 198 | |||
| 199 | /* We assume here that data are valid once written */ | ||
| 200 | if (!fm3130->data_valid) | ||
| 201 | fm3130->data_valid = 1; | ||
| 202 | return 0; | ||
| 203 | } | ||
| 204 | |||
| 205 | static int fm3130_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
| 206 | { | ||
| 207 | struct fm3130 *fm3130 = dev_get_drvdata(dev); | ||
| 208 | int tmp; | ||
| 209 | struct rtc_time *tm = &alrm->time; | ||
| 210 | /* read the RTC alarm registers all at once */ | ||
| 211 | tmp = i2c_transfer(to_i2c_adapter(fm3130->client->dev.parent), | ||
| 212 | &fm3130->msg[2], 2); | ||
| 213 | if (tmp != 2) { | ||
| 214 | dev_err(dev, "%s error %d\n", "read", tmp); | ||
| 215 | return -EIO; | ||
| 216 | } | ||
| 217 | dev_dbg(dev, "alarm read %02x %02x %02x %02x %02x\n", | ||
| 218 | fm3130->regs[FM3130_ALARM_SECONDS], | ||
| 219 | fm3130->regs[FM3130_ALARM_MINUTES], | ||
| 220 | fm3130->regs[FM3130_ALARM_HOURS], | ||
| 221 | fm3130->regs[FM3130_ALARM_DATE], | ||
| 222 | fm3130->regs[FM3130_ALARM_MONTHS]); | ||
| 223 | |||
| 224 | |||
| 225 | tm->tm_sec = BCD2BIN(fm3130->regs[FM3130_ALARM_SECONDS] & 0x7F); | ||
| 226 | tm->tm_min = BCD2BIN(fm3130->regs[FM3130_ALARM_MINUTES] & 0x7F); | ||
| 227 | tm->tm_hour = BCD2BIN(fm3130->regs[FM3130_ALARM_HOURS] & 0x3F); | ||
| 228 | tm->tm_mday = BCD2BIN(fm3130->regs[FM3130_ALARM_DATE] & 0x3F); | ||
| 229 | tm->tm_mon = BCD2BIN(fm3130->regs[FM3130_ALARM_MONTHS] & 0x1F); | ||
| 230 | if (tm->tm_mon > 0) | ||
| 231 | tm->tm_mon -= 1; /* RTC is 1-12, tm_mon is 0-11 */ | ||
| 232 | dev_dbg(dev, "%s secs=%d, mins=%d, " | ||
| 233 | "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", | ||
| 234 | "read alarm", tm->tm_sec, tm->tm_min, | ||
| 235 | tm->tm_hour, tm->tm_mday, | ||
| 236 | tm->tm_mon, tm->tm_year, tm->tm_wday); | ||
| 237 | |||
| 238 | return 0; | ||
| 239 | } | ||
| 240 | |||
| 241 | static int fm3130_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
| 242 | { | ||
| 243 | struct fm3130 *fm3130 = dev_get_drvdata(dev); | ||
| 244 | struct rtc_time *tm = &alrm->time; | ||
| 245 | int i; | ||
| 246 | |||
| 247 | dev_dbg(dev, "%s secs=%d, mins=%d, " | ||
| 248 | "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", | ||
| 249 | "write alarm", tm->tm_sec, tm->tm_min, | ||
| 250 | tm->tm_hour, tm->tm_mday, | ||
| 251 | tm->tm_mon, tm->tm_year, tm->tm_wday); | ||
| 252 | |||
| 253 | if (tm->tm_sec != -1) | ||
| 254 | fm3130->regs[FM3130_ALARM_SECONDS] = | ||
| 255 | BIN2BCD(tm->tm_sec) | 0x80; | ||
| 256 | |||
| 257 | if (tm->tm_min != -1) | ||
| 258 | fm3130->regs[FM3130_ALARM_MINUTES] = | ||
| 259 | BIN2BCD(tm->tm_min) | 0x80; | ||
| 260 | |||
| 261 | if (tm->tm_hour != -1) | ||
| 262 | fm3130->regs[FM3130_ALARM_HOURS] = | ||
| 263 | BIN2BCD(tm->tm_hour) | 0x80; | ||
| 264 | |||
| 265 | if (tm->tm_mday != -1) | ||
| 266 | fm3130->regs[FM3130_ALARM_DATE] = | ||
| 267 | BIN2BCD(tm->tm_mday) | 0x80; | ||
| 268 | |||
| 269 | if (tm->tm_mon != -1) | ||
| 270 | fm3130->regs[FM3130_ALARM_MONTHS] = | ||
| 271 | BIN2BCD(tm->tm_mon + 1) | 0x80; | ||
| 272 | |||
| 273 | dev_dbg(dev, "alarm write %02x %02x %02x %02x %02x\n", | ||
| 274 | fm3130->regs[FM3130_ALARM_SECONDS], | ||
| 275 | fm3130->regs[FM3130_ALARM_MINUTES], | ||
| 276 | fm3130->regs[FM3130_ALARM_HOURS], | ||
| 277 | fm3130->regs[FM3130_ALARM_DATE], | ||
| 278 | fm3130->regs[FM3130_ALARM_MONTHS]); | ||
| 279 | /* Writing time registers, we don't support multibyte transfers */ | ||
| 280 | for (i = 0; i < FM3130_ALARM_REGS; i++) { | ||
| 281 | i2c_smbus_write_byte_data(fm3130->client, | ||
| 282 | FM3130_ALARM_SECONDS + i, | ||
| 283 | fm3130->regs[FM3130_ALARM_SECONDS + i]); | ||
| 284 | } | ||
| 285 | fm3130->regs[FM3130_RTC_CONTROL] = | ||
| 286 | i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL); | ||
| 287 | /* Checking for alarm */ | ||
| 288 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AF) { | ||
| 289 | fm3130->alarm = 1; | ||
| 290 | fm3130->regs[FM3130_RTC_CONTROL] &= ~FM3130_RTC_CONTROL_BIT_AF; | ||
| 291 | } | ||
| 292 | if (alrm->enabled) { | ||
| 293 | i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL, | ||
| 294 | (fm3130->regs[FM3130_RTC_CONTROL] & | ||
| 295 | ~(FM3130_RTC_CONTROL_BIT_CAL)) | | ||
| 296 | FM3130_RTC_CONTROL_BIT_AEN); | ||
| 297 | } else { | ||
| 298 | i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL, | ||
| 299 | fm3130->regs[FM3130_RTC_CONTROL] & | ||
| 300 | ~(FM3130_RTC_CONTROL_BIT_AEN)); | ||
| 301 | } | ||
| 302 | return 0; | ||
| 303 | } | ||
| 304 | |||
| 305 | static const struct rtc_class_ops fm3130_rtc_ops = { | ||
| 306 | .read_time = fm3130_get_time, | ||
| 307 | .set_time = fm3130_set_time, | ||
| 308 | .read_alarm = fm3130_read_alarm, | ||
| 309 | .set_alarm = fm3130_set_alarm, | ||
| 310 | }; | ||
| 311 | |||
| 312 | static struct i2c_driver fm3130_driver; | ||
| 313 | |||
| 314 | static int __devinit fm3130_probe(struct i2c_client *client, | ||
| 315 | const struct i2c_device_id *id) | ||
| 316 | { | ||
| 317 | struct fm3130 *fm3130; | ||
| 318 | int err = -ENODEV; | ||
| 319 | int tmp; | ||
| 320 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | ||
| 321 | |||
| 322 | if (!i2c_check_functionality(adapter, | ||
| 323 | I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) | ||
| 324 | return -EIO; | ||
| 325 | |||
| 326 | fm3130 = kzalloc(sizeof(struct fm3130), GFP_KERNEL); | ||
| 327 | |||
| 328 | if (!fm3130) | ||
| 329 | return -ENOMEM; | ||
| 330 | |||
| 331 | fm3130->client = client; | ||
| 332 | i2c_set_clientdata(client, fm3130); | ||
| 333 | fm3130->reg_addr_time = FM3130_RTC_SECONDS; | ||
| 334 | fm3130->reg_addr_alarm = FM3130_ALARM_SECONDS; | ||
| 335 | |||
| 336 | /* Messages to read time */ | ||
| 337 | fm3130->msg[0].addr = client->addr; | ||
| 338 | fm3130->msg[0].flags = 0; | ||
| 339 | fm3130->msg[0].len = 1; | ||
| 340 | fm3130->msg[0].buf = &fm3130->reg_addr_time; | ||
| 341 | |||
| 342 | fm3130->msg[1].addr = client->addr; | ||
| 343 | fm3130->msg[1].flags = I2C_M_RD; | ||
| 344 | fm3130->msg[1].len = FM3130_CLOCK_REGS; | ||
| 345 | fm3130->msg[1].buf = &fm3130->regs[FM3130_RTC_SECONDS]; | ||
| 346 | |||
| 347 | /* Messages to read alarm */ | ||
| 348 | fm3130->msg[2].addr = client->addr; | ||
| 349 | fm3130->msg[2].flags = 0; | ||
| 350 | fm3130->msg[2].len = 1; | ||
| 351 | fm3130->msg[2].buf = &fm3130->reg_addr_alarm; | ||
| 352 | |||
| 353 | fm3130->msg[3].addr = client->addr; | ||
| 354 | fm3130->msg[3].flags = I2C_M_RD; | ||
| 355 | fm3130->msg[3].len = FM3130_ALARM_REGS; | ||
| 356 | fm3130->msg[3].buf = &fm3130->regs[FM3130_ALARM_SECONDS]; | ||
| 357 | |||
| 358 | fm3130->data_valid = 0; | ||
| 359 | |||
| 360 | tmp = i2c_transfer(adapter, fm3130->msg, 4); | ||
| 361 | if (tmp != 4) { | ||
| 362 | pr_debug("read error %d\n", tmp); | ||
| 363 | err = -EIO; | ||
| 364 | goto exit_free; | ||
| 365 | } | ||
| 366 | |||
| 367 | fm3130->regs[FM3130_RTC_CONTROL] = | ||
| 368 | i2c_smbus_read_byte_data(client, FM3130_RTC_CONTROL); | ||
| 369 | fm3130->regs[FM3130_CAL_CONTROL] = | ||
| 370 | i2c_smbus_read_byte_data(client, FM3130_CAL_CONTROL); | ||
| 371 | |||
| 372 | /* Checking for alarm */ | ||
| 373 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AF) { | ||
| 374 | fm3130->alarm = 1; | ||
| 375 | fm3130->regs[FM3130_RTC_CONTROL] &= ~FM3130_RTC_CONTROL_BIT_AF; | ||
| 376 | } | ||
| 377 | |||
| 378 | /* Disabling calibration mode */ | ||
| 379 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) | ||
| 380 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, | ||
| 381 | fm3130->regs[FM3130_RTC_CONTROL] & | ||
| 382 | ~(FM3130_RTC_CONTROL_BIT_CAL)); | ||
| 383 | dev_warn(&client->dev, "Disabling calibration mode!\n"); | ||
| 384 | |||
| 385 | /* Disabling read and write modes */ | ||
| 386 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE || | ||
| 387 | fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) | ||
| 388 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, | ||
| 389 | fm3130->regs[FM3130_RTC_CONTROL] & | ||
| 390 | ~(FM3130_RTC_CONTROL_BIT_READ | | ||
| 391 | FM3130_RTC_CONTROL_BIT_WRITE)); | ||
| 392 | dev_warn(&client->dev, "Disabling READ or WRITE mode!\n"); | ||
| 393 | |||
| 394 | /* oscillator off? turn it on, so clock can tick. */ | ||
| 395 | if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN) | ||
| 396 | i2c_smbus_write_byte_data(client, FM3130_CAL_CONTROL, | ||
| 397 | fm3130->regs[FM3130_CAL_CONTROL] & | ||
| 398 | ~(FM3130_CAL_CONTROL_BIT_nOSCEN)); | ||
| 399 | |||
| 400 | /* oscillator fault? clear flag, and warn */ | ||
| 401 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_LB) | ||
| 402 | dev_warn(&client->dev, "Low battery!\n"); | ||
| 403 | |||
| 404 | /* oscillator fault? clear flag, and warn */ | ||
| 405 | if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_POR) { | ||
| 406 | i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, | ||
| 407 | fm3130->regs[FM3130_RTC_CONTROL] & | ||
| 408 | ~FM3130_RTC_CONTROL_BIT_POR); | ||
| 409 | dev_warn(&client->dev, "SET TIME!\n"); | ||
| 410 | } | ||
| 411 | /* ACS is controlled by alarm */ | ||
| 412 | i2c_smbus_write_byte_data(client, FM3130_ALARM_WP_CONTROL, 0x80); | ||
| 413 | |||
| 414 | /* TODO */ | ||
| 415 | /* TODO need to sanity check alarm */ | ||
| 416 | tmp = fm3130->regs[FM3130_RTC_SECONDS]; | ||
| 417 | tmp = BCD2BIN(tmp & 0x7f); | ||
| 418 | if (tmp > 60) | ||
| 419 | goto exit_bad; | ||
| 420 | tmp = BCD2BIN(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f); | ||
| 421 | if (tmp > 60) | ||
| 422 | goto exit_bad; | ||
| 423 | |||
| 424 | tmp = BCD2BIN(fm3130->regs[FM3130_RTC_DATE] & 0x3f); | ||
| 425 | if (tmp == 0 || tmp > 31) | ||
| 426 | goto exit_bad; | ||
| 427 | |||
| 428 | tmp = BCD2BIN(fm3130->regs[FM3130_RTC_MONTHS] & 0x1f); | ||
| 429 | if (tmp == 0 || tmp > 12) | ||
| 430 | goto exit_bad; | ||
| 431 | |||
| 432 | tmp = fm3130->regs[FM3130_RTC_HOURS]; | ||
| 433 | |||
| 434 | fm3130->data_valid = 1; | ||
| 435 | |||
| 436 | exit_bad: | ||
| 437 | if (!fm3130->data_valid) | ||
| 438 | dev_dbg(&client->dev, | ||
| 439 | "%s: %02x %02x %02x %02x %02x %02x %02x %02x" | ||
| 440 | "%02x %02x %02x %02x %02x %02x %02x\n", | ||
| 441 | "bogus registers", | ||
| 442 | fm3130->regs[0], fm3130->regs[1], | ||
| 443 | fm3130->regs[2], fm3130->regs[3], | ||
| 444 | fm3130->regs[4], fm3130->regs[5], | ||
| 445 | fm3130->regs[6], fm3130->regs[7], | ||
| 446 | fm3130->regs[8], fm3130->regs[9], | ||
| 447 | fm3130->regs[0xa], fm3130->regs[0xb], | ||
| 448 | fm3130->regs[0xc], fm3130->regs[0xd], | ||
| 449 | fm3130->regs[0xe]); | ||
| 450 | |||
| 451 | /* We won't bail out here because we just got invalid data. | ||
| 452 | Time setting from u-boot doesn't work anyway */ | ||
| 453 | fm3130->rtc = rtc_device_register(client->name, &client->dev, | ||
| 454 | &fm3130_rtc_ops, THIS_MODULE); | ||
| 455 | if (IS_ERR(fm3130->rtc)) { | ||
| 456 | err = PTR_ERR(fm3130->rtc); | ||
| 457 | dev_err(&client->dev, | ||
| 458 | "unable to register the class device\n"); | ||
| 459 | goto exit_free; | ||
| 460 | } | ||
| 461 | return 0; | ||
| 462 | exit_free: | ||
| 463 | kfree(fm3130); | ||
| 464 | return err; | ||
| 465 | } | ||
| 466 | |||
| 467 | static int __devexit fm3130_remove(struct i2c_client *client) | ||
| 468 | { | ||
| 469 | struct fm3130 *fm3130 = i2c_get_clientdata(client); | ||
| 470 | |||
| 471 | rtc_device_unregister(fm3130->rtc); | ||
| 472 | kfree(fm3130); | ||
| 473 | return 0; | ||
| 474 | } | ||
| 475 | |||
| 476 | static struct i2c_driver fm3130_driver = { | ||
| 477 | .driver = { | ||
| 478 | .name = "rtc-fm3130", | ||
| 479 | .owner = THIS_MODULE, | ||
| 480 | }, | ||
| 481 | .probe = fm3130_probe, | ||
| 482 | .remove = __devexit_p(fm3130_remove), | ||
| 483 | .id_table = fm3130_id, | ||
| 484 | }; | ||
| 485 | |||
| 486 | static int __init fm3130_init(void) | ||
| 487 | { | ||
| 488 | return i2c_add_driver(&fm3130_driver); | ||
| 489 | } | ||
| 490 | module_init(fm3130_init); | ||
| 491 | |||
| 492 | static void __exit fm3130_exit(void) | ||
| 493 | { | ||
| 494 | i2c_del_driver(&fm3130_driver); | ||
| 495 | } | ||
| 496 | module_exit(fm3130_exit); | ||
| 497 | |||
| 498 | MODULE_DESCRIPTION("RTC driver for FM3130"); | ||
| 499 | MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>"); | ||
| 500 | MODULE_LICENSE("GPL"); | ||
| 501 | |||
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index 62576af36f47..3e577f655b18 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c | |||
| @@ -773,6 +773,7 @@ sclp_vt220_con_init(void) | |||
| 773 | { | 773 | { |
| 774 | int rc; | 774 | int rc; |
| 775 | 775 | ||
| 776 | INIT_LIST_HEAD(&sclp_vt220_register.list); | ||
| 776 | if (!CONSOLE_IS_SCLP) | 777 | if (!CONSOLE_IS_SCLP) |
| 777 | return 0; | 778 | return 0; |
| 778 | rc = __sclp_vt220_init(); | 779 | rc = __sclp_vt220_init(); |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index 8246ef3ab095..42ce7915fc5d 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
| @@ -1598,7 +1598,7 @@ tape_3590_setup_device(struct tape_device *device) | |||
| 1598 | rc = tape_3590_read_dev_chars(device, rdc_data); | 1598 | rc = tape_3590_read_dev_chars(device, rdc_data); |
| 1599 | if (rc) { | 1599 | if (rc) { |
| 1600 | DBF_LH(3, "Read device characteristics failed!\n"); | 1600 | DBF_LH(3, "Read device characteristics failed!\n"); |
| 1601 | goto fail_kmalloc; | 1601 | goto fail_rdc_data; |
| 1602 | } | 1602 | } |
| 1603 | rc = tape_std_assign(device); | 1603 | rc = tape_std_assign(device); |
| 1604 | if (rc) | 1604 | if (rc) |
diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index a4a5f2efea48..0bfcbbe375c4 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c | |||
| @@ -97,8 +97,8 @@ static int pure_hex(char **cp, unsigned int *val, int min_digit, | |||
| 97 | return 0; | 97 | return 0; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | static int parse_busid(char *str, int *cssid, int *ssid, int *devno, | 100 | static int parse_busid(char *str, unsigned int *cssid, unsigned int *ssid, |
| 101 | int msgtrigger) | 101 | unsigned int *devno, int msgtrigger) |
| 102 | { | 102 | { |
| 103 | char *str_work; | 103 | char *str_work; |
| 104 | int val, rc, ret; | 104 | int val, rc, ret; |
| @@ -148,7 +148,7 @@ out: | |||
| 148 | static int blacklist_parse_parameters(char *str, range_action action, | 148 | static int blacklist_parse_parameters(char *str, range_action action, |
| 149 | int msgtrigger) | 149 | int msgtrigger) |
| 150 | { | 150 | { |
| 151 | int from_cssid, to_cssid, from_ssid, to_ssid, from, to; | 151 | unsigned int from_cssid, to_cssid, from_ssid, to_ssid, from, to; |
| 152 | int rc, totalrc; | 152 | int rc, totalrc; |
| 153 | char *parm; | 153 | char *parm; |
| 154 | range_action ra; | 154 | range_action ra; |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 82c6a2d45128..b32d7eb3d81a 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
| @@ -576,12 +576,14 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
| 576 | err = -ENODEV; | 576 | err = -ENODEV; |
| 577 | goto out; | 577 | goto out; |
| 578 | } | 578 | } |
| 579 | if (cio_is_console(sch->schid)) | 579 | if (cio_is_console(sch->schid)) { |
| 580 | sch->opm = 0xff; | 580 | sch->opm = 0xff; |
| 581 | else | 581 | sch->isc = 1; |
| 582 | } else { | ||
| 582 | sch->opm = chp_get_sch_opm(sch); | 583 | sch->opm = chp_get_sch_opm(sch); |
| 584 | sch->isc = 3; | ||
| 585 | } | ||
| 583 | sch->lpm = sch->schib.pmcw.pam & sch->opm; | 586 | sch->lpm = sch->schib.pmcw.pam & sch->opm; |
| 584 | sch->isc = 3; | ||
| 585 | 587 | ||
| 586 | CIO_MSG_EVENT(6, "Detected device %04x on subchannel 0.%x.%04X " | 588 | CIO_MSG_EVENT(6, "Detected device %04x on subchannel 0.%x.%04X " |
| 587 | "- PIM = %02X, PAM = %02X, POM = %02X\n", | 589 | "- PIM = %02X, PAM = %02X, POM = %02X\n", |
| @@ -704,9 +706,9 @@ void wait_cons_dev(void) | |||
| 704 | if (!console_subchannel_in_use) | 706 | if (!console_subchannel_in_use) |
| 705 | return; | 707 | return; |
| 706 | 708 | ||
| 707 | /* disable all but isc 7 (console device) */ | 709 | /* disable all but isc 1 (console device) */ |
| 708 | __ctl_store (save_cr6, 6, 6); | 710 | __ctl_store (save_cr6, 6, 6); |
| 709 | cr6 = 0x01000000; | 711 | cr6 = 0x40000000; |
| 710 | __ctl_load (cr6, 6, 6); | 712 | __ctl_load (cr6, 6, 6); |
| 711 | 713 | ||
| 712 | do { | 714 | do { |
| @@ -788,11 +790,11 @@ cio_probe_console(void) | |||
| 788 | } | 790 | } |
| 789 | 791 | ||
| 790 | /* | 792 | /* |
| 791 | * enable console I/O-interrupt subclass 7 | 793 | * enable console I/O-interrupt subclass 1 |
| 792 | */ | 794 | */ |
| 793 | ctl_set_bit(6, 24); | 795 | ctl_set_bit(6, 30); |
| 794 | console_subchannel.isc = 7; | 796 | console_subchannel.isc = 1; |
| 795 | console_subchannel.schib.pmcw.isc = 7; | 797 | console_subchannel.schib.pmcw.isc = 1; |
| 796 | console_subchannel.schib.pmcw.intparm = | 798 | console_subchannel.schib.pmcw.intparm = |
| 797 | (u32)(addr_t)&console_subchannel; | 799 | (u32)(addr_t)&console_subchannel; |
| 798 | ret = cio_modify(&console_subchannel); | 800 | ret = cio_modify(&console_subchannel); |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 436bf1f6d4a6..9a71dae223e8 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
| @@ -290,9 +290,6 @@ int qeth_set_large_send(struct qeth_card *card, | |||
| 290 | card->dev->features |= NETIF_F_TSO | NETIF_F_SG | | 290 | card->dev->features |= NETIF_F_TSO | NETIF_F_SG | |
| 291 | NETIF_F_HW_CSUM; | 291 | NETIF_F_HW_CSUM; |
| 292 | } else { | 292 | } else { |
| 293 | PRINT_WARN("TSO not supported on %s. " | ||
| 294 | "large_send set to 'no'.\n", | ||
| 295 | card->dev->name); | ||
| 296 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | | 293 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | |
| 297 | NETIF_F_HW_CSUM); | 294 | NETIF_F_HW_CSUM); |
| 298 | card->options.large_send = QETH_LARGE_SEND_NO; | 295 | card->options.large_send = QETH_LARGE_SEND_NO; |
| @@ -1407,12 +1404,6 @@ static void qeth_init_func_level(struct qeth_card *card) | |||
| 1407 | } | 1404 | } |
| 1408 | } | 1405 | } |
| 1409 | 1406 | ||
| 1410 | static inline __u16 qeth_raw_devno_from_bus_id(char *id) | ||
| 1411 | { | ||
| 1412 | id += (strlen(id) - 4); | ||
| 1413 | return (__u16) simple_strtoul(id, &id, 16); | ||
| 1414 | } | ||
| 1415 | |||
| 1416 | static int qeth_idx_activate_get_answer(struct qeth_channel *channel, | 1407 | static int qeth_idx_activate_get_answer(struct qeth_channel *channel, |
| 1417 | void (*idx_reply_cb)(struct qeth_channel *, | 1408 | void (*idx_reply_cb)(struct qeth_channel *, |
| 1418 | struct qeth_cmd_buffer *)) | 1409 | struct qeth_cmd_buffer *)) |
| @@ -1439,7 +1430,7 @@ static int qeth_idx_activate_get_answer(struct qeth_channel *channel, | |||
| 1439 | spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); | 1430 | spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); |
| 1440 | 1431 | ||
| 1441 | if (rc) { | 1432 | if (rc) { |
| 1442 | PRINT_ERR("Error2 in activating channel rc=%d\n", rc); | 1433 | QETH_DBF_MESSAGE(2, "Error2 in activating channel rc=%d\n", rc); |
| 1443 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | 1434 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); |
| 1444 | atomic_set(&channel->irq_pending, 0); | 1435 | atomic_set(&channel->irq_pending, 0); |
| 1445 | wake_up(&card->wait_q); | 1436 | wake_up(&card->wait_q); |
| @@ -1468,6 +1459,7 @@ static int qeth_idx_activate_channel(struct qeth_channel *channel, | |||
| 1468 | __u16 temp; | 1459 | __u16 temp; |
| 1469 | __u8 tmp; | 1460 | __u8 tmp; |
| 1470 | int rc; | 1461 | int rc; |
| 1462 | struct ccw_dev_id temp_devid; | ||
| 1471 | 1463 | ||
| 1472 | card = CARD_FROM_CDEV(channel->ccwdev); | 1464 | card = CARD_FROM_CDEV(channel->ccwdev); |
| 1473 | 1465 | ||
| @@ -1494,8 +1486,8 @@ static int qeth_idx_activate_channel(struct qeth_channel *channel, | |||
| 1494 | &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH); | 1486 | &card->token.issuer_rm_w, QETH_MPC_TOKEN_LENGTH); |
| 1495 | memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data), | 1487 | memcpy(QETH_IDX_ACT_FUNC_LEVEL(iob->data), |
| 1496 | &card->info.func_level, sizeof(__u16)); | 1488 | &card->info.func_level, sizeof(__u16)); |
| 1497 | temp = qeth_raw_devno_from_bus_id(CARD_DDEV_ID(card)); | 1489 | ccw_device_get_id(CARD_DDEV(card), &temp_devid); |
| 1498 | memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &temp, 2); | 1490 | memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(iob->data), &temp_devid.devno, 2); |
| 1499 | temp = (card->info.cula << 8) + card->info.unit_addr2; | 1491 | temp = (card->info.cula << 8) + card->info.unit_addr2; |
| 1500 | memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &temp, 2); | 1492 | memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(iob->data), &temp, 2); |
| 1501 | 1493 | ||
| @@ -1508,7 +1500,8 @@ static int qeth_idx_activate_channel(struct qeth_channel *channel, | |||
| 1508 | spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); | 1500 | spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); |
| 1509 | 1501 | ||
| 1510 | if (rc) { | 1502 | if (rc) { |
| 1511 | PRINT_ERR("Error1 in activating channel. rc=%d\n", rc); | 1503 | QETH_DBF_MESSAGE(2, "Error1 in activating channel. rc=%d\n", |
| 1504 | rc); | ||
| 1512 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 1505 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); |
| 1513 | atomic_set(&channel->irq_pending, 0); | 1506 | atomic_set(&channel->irq_pending, 0); |
| 1514 | wake_up(&card->wait_q); | 1507 | wake_up(&card->wait_q); |
| @@ -1658,7 +1651,6 @@ int qeth_send_control_data(struct qeth_card *card, int len, | |||
| 1658 | 1651 | ||
| 1659 | reply = qeth_alloc_reply(card); | 1652 | reply = qeth_alloc_reply(card); |
| 1660 | if (!reply) { | 1653 | if (!reply) { |
| 1661 | PRINT_WARN("Could not alloc qeth_reply!\n"); | ||
| 1662 | return -ENOMEM; | 1654 | return -ENOMEM; |
| 1663 | } | 1655 | } |
| 1664 | reply->callback = reply_cb; | 1656 | reply->callback = reply_cb; |
| @@ -2612,15 +2604,9 @@ void qeth_queue_input_buffer(struct qeth_card *card, int index) | |||
| 2612 | if (newcount < count) { | 2604 | if (newcount < count) { |
| 2613 | /* we are in memory shortage so we switch back to | 2605 | /* we are in memory shortage so we switch back to |
| 2614 | traditional skb allocation and drop packages */ | 2606 | traditional skb allocation and drop packages */ |
| 2615 | if (!atomic_read(&card->force_alloc_skb) && | ||
| 2616 | net_ratelimit()) | ||
| 2617 | PRINT_WARN("Switch to alloc skb\n"); | ||
| 2618 | atomic_set(&card->force_alloc_skb, 3); | 2607 | atomic_set(&card->force_alloc_skb, 3); |
| 2619 | count = newcount; | 2608 | count = newcount; |
| 2620 | } else { | 2609 | } else { |
| 2621 | if ((atomic_read(&card->force_alloc_skb) == 1) && | ||
| 2622 | net_ratelimit()) | ||
| 2623 | PRINT_WARN("Switch to sg\n"); | ||
| 2624 | atomic_add_unless(&card->force_alloc_skb, -1, 0); | 2610 | atomic_add_unless(&card->force_alloc_skb, -1, 0); |
| 2625 | } | 2611 | } |
| 2626 | 2612 | ||
| @@ -3034,7 +3020,7 @@ int qeth_get_elements_no(struct qeth_card *card, void *hdr, | |||
| 3034 | elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE) | 3020 | elements_needed = 1 + (((((unsigned long) hdr) % PAGE_SIZE) |
| 3035 | + skb->len) >> PAGE_SHIFT); | 3021 | + skb->len) >> PAGE_SHIFT); |
| 3036 | if ((elements_needed + elems) > QETH_MAX_BUFFER_ELEMENTS(card)) { | 3022 | if ((elements_needed + elems) > QETH_MAX_BUFFER_ELEMENTS(card)) { |
| 3037 | PRINT_ERR("Invalid size of IP packet " | 3023 | QETH_DBF_MESSAGE(2, "Invalid size of IP packet " |
| 3038 | "(Number=%d / Length=%d). Discarded.\n", | 3024 | "(Number=%d / Length=%d). Discarded.\n", |
| 3039 | (elements_needed+elems), skb->len); | 3025 | (elements_needed+elems), skb->len); |
| 3040 | return 0; | 3026 | return 0; |
| @@ -3247,8 +3233,6 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, | |||
| 3247 | * free buffers) to handle eddp context */ | 3233 | * free buffers) to handle eddp context */ |
| 3248 | if (qeth_eddp_check_buffers_for_context(queue, ctx) | 3234 | if (qeth_eddp_check_buffers_for_context(queue, ctx) |
| 3249 | < 0) { | 3235 | < 0) { |
| 3250 | if (net_ratelimit()) | ||
| 3251 | PRINT_WARN("eddp tx_dropped 1\n"); | ||
| 3252 | rc = -EBUSY; | 3236 | rc = -EBUSY; |
| 3253 | goto out; | 3237 | goto out; |
| 3254 | } | 3238 | } |
| @@ -3260,7 +3244,6 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, | |||
| 3260 | tmp = qeth_eddp_fill_buffer(queue, ctx, | 3244 | tmp = qeth_eddp_fill_buffer(queue, ctx, |
| 3261 | queue->next_buf_to_fill); | 3245 | queue->next_buf_to_fill); |
| 3262 | if (tmp < 0) { | 3246 | if (tmp < 0) { |
| 3263 | PRINT_ERR("eddp tx_dropped 2\n"); | ||
| 3264 | rc = -EBUSY; | 3247 | rc = -EBUSY; |
| 3265 | goto out; | 3248 | goto out; |
| 3266 | } | 3249 | } |
| @@ -3602,8 +3585,6 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata) | |||
| 3602 | 3585 | ||
| 3603 | if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) && | 3586 | if ((!qeth_adp_supported(card, IPA_SETADP_SET_SNMP_CONTROL)) && |
| 3604 | (!card->options.layer2)) { | 3587 | (!card->options.layer2)) { |
| 3605 | PRINT_WARN("SNMP Query MIBS not supported " | ||
| 3606 | "on %s!\n", QETH_CARD_IFNAME(card)); | ||
| 3607 | return -EOPNOTSUPP; | 3588 | return -EOPNOTSUPP; |
| 3608 | } | 3589 | } |
| 3609 | /* skip 4 bytes (data_len struct member) to get req_len */ | 3590 | /* skip 4 bytes (data_len struct member) to get req_len */ |
| @@ -3634,7 +3615,7 @@ int qeth_snmp_command(struct qeth_card *card, char __user *udata) | |||
| 3634 | rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len, | 3615 | rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len, |
| 3635 | qeth_snmp_command_cb, (void *)&qinfo); | 3616 | qeth_snmp_command_cb, (void *)&qinfo); |
| 3636 | if (rc) | 3617 | if (rc) |
| 3637 | PRINT_WARN("SNMP command failed on %s: (0x%x)\n", | 3618 | QETH_DBF_MESSAGE(2, "SNMP command failed on %s: (0x%x)\n", |
| 3638 | QETH_CARD_IFNAME(card), rc); | 3619 | QETH_CARD_IFNAME(card), rc); |
| 3639 | else { | 3620 | else { |
| 3640 | if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) | 3621 | if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) |
| @@ -3807,8 +3788,8 @@ retry: | |||
| 3807 | if (mpno) | 3788 | if (mpno) |
| 3808 | mpno = min(mpno - 1, QETH_MAX_PORTNO); | 3789 | mpno = min(mpno - 1, QETH_MAX_PORTNO); |
| 3809 | if (card->info.portno > mpno) { | 3790 | if (card->info.portno > mpno) { |
| 3810 | PRINT_ERR("Device %s does not offer port number %d \n.", | 3791 | QETH_DBF_MESSAGE(2, "Device %s does not offer port number %d" |
| 3811 | CARD_BUS_ID(card), card->info.portno); | 3792 | "\n.", CARD_BUS_ID(card), card->info.portno); |
| 3812 | rc = -ENODEV; | 3793 | rc = -ENODEV; |
| 3813 | goto out; | 3794 | goto out; |
| 3814 | } | 3795 | } |
| @@ -3985,8 +3966,6 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, | |||
| 3985 | return skb; | 3966 | return skb; |
| 3986 | no_mem: | 3967 | no_mem: |
| 3987 | if (net_ratelimit()) { | 3968 | if (net_ratelimit()) { |
| 3988 | PRINT_WARN("No memory for packet received on %s.\n", | ||
| 3989 | QETH_CARD_IFNAME(card)); | ||
| 3990 | QETH_DBF_TEXT(TRACE, 2, "noskbmem"); | 3969 | QETH_DBF_TEXT(TRACE, 2, "noskbmem"); |
| 3991 | QETH_DBF_TEXT_(TRACE, 2, "%s", CARD_BUS_ID(card)); | 3970 | QETH_DBF_TEXT_(TRACE, 2, "%s", CARD_BUS_ID(card)); |
| 3992 | } | 3971 | } |
| @@ -4004,15 +3983,17 @@ static void qeth_unregister_dbf_views(void) | |||
| 4004 | } | 3983 | } |
| 4005 | } | 3984 | } |
| 4006 | 3985 | ||
| 4007 | void qeth_dbf_longtext(enum qeth_dbf_names dbf_nix, int level, char *text, ...) | 3986 | void qeth_dbf_longtext(enum qeth_dbf_names dbf_nix, int level, char *fmt, ...) |
| 4008 | { | 3987 | { |
| 4009 | char dbf_txt_buf[32]; | 3988 | char dbf_txt_buf[32]; |
| 3989 | va_list args; | ||
| 4010 | 3990 | ||
| 4011 | if (level > (qeth_dbf[dbf_nix].id)->level) | 3991 | if (level > (qeth_dbf[dbf_nix].id)->level) |
| 4012 | return; | 3992 | return; |
| 4013 | snprintf(dbf_txt_buf, sizeof(dbf_txt_buf), text); | 3993 | va_start(args, fmt); |
| 3994 | vsnprintf(dbf_txt_buf, sizeof(dbf_txt_buf), fmt, args); | ||
| 3995 | va_end(args); | ||
| 4014 | debug_text_event(qeth_dbf[dbf_nix].id, level, dbf_txt_buf); | 3996 | debug_text_event(qeth_dbf[dbf_nix].id, level, dbf_txt_buf); |
| 4015 | |||
| 4016 | } | 3997 | } |
| 4017 | EXPORT_SYMBOL_GPL(qeth_dbf_longtext); | 3998 | EXPORT_SYMBOL_GPL(qeth_dbf_longtext); |
| 4018 | 3999 | ||
diff --git a/drivers/s390/net/qeth_core_offl.c b/drivers/s390/net/qeth_core_offl.c index 822df8362856..452874e89740 100644 --- a/drivers/s390/net/qeth_core_offl.c +++ b/drivers/s390/net/qeth_core_offl.c | |||
| @@ -122,8 +122,8 @@ int qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue, | |||
| 122 | if (element == 0) | 122 | if (element == 0) |
| 123 | return -EBUSY; | 123 | return -EBUSY; |
| 124 | else { | 124 | else { |
| 125 | PRINT_WARN("could only partially fill eddp " | 125 | QETH_DBF_MESSAGE(2, "could only partially fill" |
| 126 | "buffer!\n"); | 126 | "eddp buffer!\n"); |
| 127 | goto out; | 127 | goto out; |
| 128 | } | 128 | } |
| 129 | } | 129 | } |
| @@ -143,8 +143,6 @@ int qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue, | |||
| 143 | if (must_refcnt) { | 143 | if (must_refcnt) { |
| 144 | must_refcnt = 0; | 144 | must_refcnt = 0; |
| 145 | if (qeth_eddp_buf_ref_context(buf, ctx)) { | 145 | if (qeth_eddp_buf_ref_context(buf, ctx)) { |
| 146 | PRINT_WARN("no memory to create eddp context " | ||
| 147 | "reference\n"); | ||
| 148 | goto out_check; | 146 | goto out_check; |
| 149 | } | 147 | } |
| 150 | } | 148 | } |
diff --git a/drivers/s390/net/qeth_core_sys.c b/drivers/s390/net/qeth_core_sys.c index 08a50f057284..c26e842ad905 100644 --- a/drivers/s390/net/qeth_core_sys.c +++ b/drivers/s390/net/qeth_core_sys.c | |||
| @@ -129,7 +129,6 @@ static ssize_t qeth_dev_portno_store(struct device *dev, | |||
| 129 | 129 | ||
| 130 | portno = simple_strtoul(buf, &tmp, 16); | 130 | portno = simple_strtoul(buf, &tmp, 16); |
| 131 | if (portno > QETH_MAX_PORTNO) { | 131 | if (portno > QETH_MAX_PORTNO) { |
| 132 | PRINT_WARN("portno 0x%X is out of range\n", portno); | ||
| 133 | return -EINVAL; | 132 | return -EINVAL; |
| 134 | } | 133 | } |
| 135 | 134 | ||
| @@ -223,8 +222,6 @@ static ssize_t qeth_dev_prioqing_store(struct device *dev, | |||
| 223 | * if though we have to permit priority queueing | 222 | * if though we have to permit priority queueing |
| 224 | */ | 223 | */ |
| 225 | if (card->qdio.no_out_queues == 1) { | 224 | if (card->qdio.no_out_queues == 1) { |
| 226 | PRINT_WARN("Priority queueing disabled due " | ||
| 227 | "to hardware limitations!\n"); | ||
| 228 | card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT; | 225 | card->qdio.do_prio_queueing = QETH_PRIOQ_DEFAULT; |
| 229 | return -EPERM; | 226 | return -EPERM; |
| 230 | } | 227 | } |
| @@ -250,7 +247,6 @@ static ssize_t qeth_dev_prioqing_store(struct device *dev, | |||
| 250 | card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING; | 247 | card->qdio.do_prio_queueing = QETH_NO_PRIO_QUEUEING; |
| 251 | card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; | 248 | card->qdio.default_out_queue = QETH_DEFAULT_QUEUE; |
| 252 | } else { | 249 | } else { |
| 253 | PRINT_WARN("Unknown queueing type '%s'\n", tmp); | ||
| 254 | return -EINVAL; | 250 | return -EINVAL; |
| 255 | } | 251 | } |
| 256 | return count; | 252 | return count; |
| @@ -291,9 +287,6 @@ static ssize_t qeth_dev_bufcnt_store(struct device *dev, | |||
| 291 | ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt); | 287 | ((cnt > QETH_IN_BUF_COUNT_MAX) ? QETH_IN_BUF_COUNT_MAX : cnt); |
| 292 | if (old_cnt != cnt) { | 288 | if (old_cnt != cnt) { |
| 293 | rc = qeth_realloc_buffer_pool(card, cnt); | 289 | rc = qeth_realloc_buffer_pool(card, cnt); |
| 294 | if (rc) | ||
| 295 | PRINT_WARN("Error (%d) while setting " | ||
| 296 | "buffer count.\n", rc); | ||
| 297 | } | 290 | } |
| 298 | return count; | 291 | return count; |
| 299 | } | 292 | } |
| @@ -355,7 +348,6 @@ static ssize_t qeth_dev_performance_stats_store(struct device *dev, | |||
| 355 | card->perf_stats.initial_rx_packets = card->stats.rx_packets; | 348 | card->perf_stats.initial_rx_packets = card->stats.rx_packets; |
| 356 | card->perf_stats.initial_tx_packets = card->stats.tx_packets; | 349 | card->perf_stats.initial_tx_packets = card->stats.tx_packets; |
| 357 | } else { | 350 | } else { |
| 358 | PRINT_WARN("performance_stats: write 0 or 1 to this file!\n"); | ||
| 359 | return -EINVAL; | 351 | return -EINVAL; |
| 360 | } | 352 | } |
| 361 | return count; | 353 | return count; |
| @@ -399,7 +391,6 @@ static ssize_t qeth_dev_layer2_store(struct device *dev, | |||
| 399 | newdis = QETH_DISCIPLINE_LAYER2; | 391 | newdis = QETH_DISCIPLINE_LAYER2; |
| 400 | break; | 392 | break; |
| 401 | default: | 393 | default: |
| 402 | PRINT_WARN("layer2: write 0 or 1 to this file!\n"); | ||
| 403 | return -EINVAL; | 394 | return -EINVAL; |
| 404 | } | 395 | } |
| 405 | 396 | ||
| @@ -463,7 +454,6 @@ static ssize_t qeth_dev_large_send_store(struct device *dev, | |||
| 463 | } else if (!strcmp(tmp, "TSO")) { | 454 | } else if (!strcmp(tmp, "TSO")) { |
| 464 | type = QETH_LARGE_SEND_TSO; | 455 | type = QETH_LARGE_SEND_TSO; |
| 465 | } else { | 456 | } else { |
| 466 | PRINT_WARN("large_send: invalid mode %s!\n", tmp); | ||
| 467 | return -EINVAL; | 457 | return -EINVAL; |
| 468 | } | 458 | } |
| 469 | if (card->options.large_send == type) | 459 | if (card->options.large_send == type) |
| @@ -503,8 +493,6 @@ static ssize_t qeth_dev_blkt_store(struct qeth_card *card, | |||
| 503 | if (i <= max_value) { | 493 | if (i <= max_value) { |
| 504 | *value = i; | 494 | *value = i; |
| 505 | } else { | 495 | } else { |
| 506 | PRINT_WARN("blkt total time: write values between" | ||
| 507 | " 0 and %d to this file!\n", max_value); | ||
| 508 | return -EINVAL; | 496 | return -EINVAL; |
| 509 | } | 497 | } |
| 510 | return count; | 498 | return count; |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 86ec50ddae13..f682f7b14480 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
| @@ -101,19 +101,16 @@ static struct net_device *qeth_l2_netdev_by_devno(unsigned char *read_dev_no) | |||
| 101 | { | 101 | { |
| 102 | struct qeth_card *card; | 102 | struct qeth_card *card; |
| 103 | struct net_device *ndev; | 103 | struct net_device *ndev; |
| 104 | unsigned char *readno; | 104 | __u16 temp_dev_no; |
| 105 | __u16 temp_dev_no, card_dev_no; | ||
| 106 | char *endp; | ||
| 107 | unsigned long flags; | 105 | unsigned long flags; |
| 106 | struct ccw_dev_id read_devid; | ||
| 108 | 107 | ||
| 109 | ndev = NULL; | 108 | ndev = NULL; |
| 110 | memcpy(&temp_dev_no, read_dev_no, 2); | 109 | memcpy(&temp_dev_no, read_dev_no, 2); |
| 111 | read_lock_irqsave(&qeth_core_card_list.rwlock, flags); | 110 | read_lock_irqsave(&qeth_core_card_list.rwlock, flags); |
| 112 | list_for_each_entry(card, &qeth_core_card_list.list, list) { | 111 | list_for_each_entry(card, &qeth_core_card_list.list, list) { |
| 113 | readno = CARD_RDEV_ID(card); | 112 | ccw_device_get_id(CARD_RDEV(card), &read_devid); |
| 114 | readno += (strlen(readno) - 4); | 113 | if (read_devid.devno == temp_dev_no) { |
| 115 | card_dev_no = simple_strtoul(readno, &endp, 16); | ||
| 116 | if (card_dev_no == temp_dev_no) { | ||
| 117 | ndev = card->dev; | 114 | ndev = card->dev; |
| 118 | break; | 115 | break; |
| 119 | } | 116 | } |
| @@ -134,14 +131,14 @@ static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card, | |||
| 134 | mac = &cmd->data.setdelmac.mac[0]; | 131 | mac = &cmd->data.setdelmac.mac[0]; |
| 135 | /* MAC already registered, needed in couple/uncouple case */ | 132 | /* MAC already registered, needed in couple/uncouple case */ |
| 136 | if (cmd->hdr.return_code == 0x2005) { | 133 | if (cmd->hdr.return_code == 0x2005) { |
| 137 | PRINT_WARN("Group MAC %02x:%02x:%02x:%02x:%02x:%02x " \ | 134 | QETH_DBF_MESSAGE(2, "Group MAC %02x:%02x:%02x:%02x:%02x:%02x " |
| 138 | "already existing on %s \n", | 135 | "already existing on %s \n", |
| 139 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], | 136 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], |
| 140 | QETH_CARD_IFNAME(card)); | 137 | QETH_CARD_IFNAME(card)); |
| 141 | cmd->hdr.return_code = 0; | 138 | cmd->hdr.return_code = 0; |
| 142 | } | 139 | } |
| 143 | if (cmd->hdr.return_code) | 140 | if (cmd->hdr.return_code) |
| 144 | PRINT_ERR("Could not set group MAC " \ | 141 | QETH_DBF_MESSAGE(2, "Could not set group MAC " |
| 145 | "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n", | 142 | "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n", |
| 146 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], | 143 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], |
| 147 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 144 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); |
| @@ -166,7 +163,7 @@ static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card, | |||
| 166 | cmd = (struct qeth_ipa_cmd *) data; | 163 | cmd = (struct qeth_ipa_cmd *) data; |
| 167 | mac = &cmd->data.setdelmac.mac[0]; | 164 | mac = &cmd->data.setdelmac.mac[0]; |
| 168 | if (cmd->hdr.return_code) | 165 | if (cmd->hdr.return_code) |
| 169 | PRINT_ERR("Could not delete group MAC " \ | 166 | QETH_DBF_MESSAGE(2, "Could not delete group MAC " |
| 170 | "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n", | 167 | "%02x:%02x:%02x:%02x:%02x:%02x on %s: %x\n", |
| 171 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], | 168 | mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], |
| 172 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 169 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); |
| @@ -186,10 +183,8 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac) | |||
| 186 | 183 | ||
| 187 | mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC); | 184 | mc = kmalloc(sizeof(struct qeth_mc_mac), GFP_ATOMIC); |
| 188 | 185 | ||
| 189 | if (!mc) { | 186 | if (!mc) |
| 190 | PRINT_ERR("no mem vor mc mac address\n"); | ||
| 191 | return; | 187 | return; |
| 192 | } | ||
| 193 | 188 | ||
| 194 | memcpy(mc->mc_addr, mac, OSA_ADDR_LEN); | 189 | memcpy(mc->mc_addr, mac, OSA_ADDR_LEN); |
| 195 | mc->mc_addrlen = OSA_ADDR_LEN; | 190 | mc->mc_addrlen = OSA_ADDR_LEN; |
| @@ -280,7 +275,7 @@ static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card, | |||
| 280 | QETH_DBF_TEXT(TRACE, 2, "L2sdvcb"); | 275 | QETH_DBF_TEXT(TRACE, 2, "L2sdvcb"); |
| 281 | cmd = (struct qeth_ipa_cmd *) data; | 276 | cmd = (struct qeth_ipa_cmd *) data; |
| 282 | if (cmd->hdr.return_code) { | 277 | if (cmd->hdr.return_code) { |
| 283 | PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. " | 278 | QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. " |
| 284 | "Continuing\n", cmd->data.setdelvlan.vlan_id, | 279 | "Continuing\n", cmd->data.setdelvlan.vlan_id, |
| 285 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); | 280 | QETH_CARD_IFNAME(card), cmd->hdr.return_code); |
| 286 | QETH_DBF_TEXT_(TRACE, 2, "L2VL%4x", cmd->hdr.command); | 281 | QETH_DBF_TEXT_(TRACE, 2, "L2VL%4x", cmd->hdr.command); |
| @@ -333,8 +328,6 @@ static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) | |||
| 333 | spin_lock_bh(&card->vlanlock); | 328 | spin_lock_bh(&card->vlanlock); |
| 334 | list_add_tail(&id->list, &card->vid_list); | 329 | list_add_tail(&id->list, &card->vid_list); |
| 335 | spin_unlock_bh(&card->vlanlock); | 330 | spin_unlock_bh(&card->vlanlock); |
| 336 | } else { | ||
| 337 | PRINT_ERR("no memory for vid\n"); | ||
| 338 | } | 331 | } |
| 339 | } | 332 | } |
| 340 | 333 | ||
| @@ -550,16 +543,15 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card) | |||
| 550 | 543 | ||
| 551 | rc = qeth_query_setadapterparms(card); | 544 | rc = qeth_query_setadapterparms(card); |
| 552 | if (rc) { | 545 | if (rc) { |
| 553 | PRINT_WARN("could not query adapter parameters on device %s: " | 546 | QETH_DBF_MESSAGE(2, "could not query adapter parameters on " |
| 554 | "x%x\n", CARD_BUS_ID(card), rc); | 547 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
| 555 | } | 548 | } |
| 556 | 549 | ||
| 557 | if (card->info.guestlan) { | 550 | if (card->info.guestlan) { |
| 558 | rc = qeth_setadpparms_change_macaddr(card); | 551 | rc = qeth_setadpparms_change_macaddr(card); |
| 559 | if (rc) { | 552 | if (rc) { |
| 560 | PRINT_WARN("couldn't get MAC address on " | 553 | QETH_DBF_MESSAGE(2, "couldn't get MAC address on " |
| 561 | "device %s: x%x\n", | 554 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
| 562 | CARD_BUS_ID(card), rc); | ||
| 563 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | 555 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); |
| 564 | return rc; | 556 | return rc; |
| 565 | } | 557 | } |
| @@ -585,8 +577,6 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p) | |||
| 585 | } | 577 | } |
| 586 | 578 | ||
| 587 | if (card->info.type == QETH_CARD_TYPE_OSN) { | 579 | if (card->info.type == QETH_CARD_TYPE_OSN) { |
| 588 | PRINT_WARN("Setting MAC address on %s is not supported.\n", | ||
| 589 | dev->name); | ||
| 590 | QETH_DBF_TEXT(TRACE, 3, "setmcOSN"); | 580 | QETH_DBF_TEXT(TRACE, 3, "setmcOSN"); |
| 591 | return -EOPNOTSUPP; | 581 | return -EOPNOTSUPP; |
| 592 | } | 582 | } |
| @@ -666,7 +656,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 666 | ctx = qeth_eddp_create_context(card, new_skb, hdr, | 656 | ctx = qeth_eddp_create_context(card, new_skb, hdr, |
| 667 | skb->sk->sk_protocol); | 657 | skb->sk->sk_protocol); |
| 668 | if (ctx == NULL) { | 658 | if (ctx == NULL) { |
| 669 | PRINT_WARN("could not create eddp context\n"); | 659 | QETH_DBF_MESSAGE(2, "could not create eddp context\n"); |
| 670 | goto tx_drop; | 660 | goto tx_drop; |
| 671 | } | 661 | } |
| 672 | } else { | 662 | } else { |
| @@ -731,6 +721,7 @@ tx_drop: | |||
| 731 | if ((new_skb != skb) && new_skb) | 721 | if ((new_skb != skb) && new_skb) |
| 732 | dev_kfree_skb_any(new_skb); | 722 | dev_kfree_skb_any(new_skb); |
| 733 | dev_kfree_skb_any(skb); | 723 | dev_kfree_skb_any(skb); |
| 724 | netif_wake_queue(dev); | ||
| 734 | return NETDEV_TX_OK; | 725 | return NETDEV_TX_OK; |
| 735 | } | 726 | } |
| 736 | 727 | ||
| @@ -1155,7 +1146,7 @@ static int qeth_osn_send_control_data(struct qeth_card *card, int len, | |||
| 1155 | (addr_t) iob, 0, 0); | 1146 | (addr_t) iob, 0, 0); |
| 1156 | spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags); | 1147 | spin_unlock_irqrestore(get_ccwdev_lock(card->write.ccwdev), flags); |
| 1157 | if (rc) { | 1148 | if (rc) { |
| 1158 | PRINT_WARN("qeth_osn_send_control_data: " | 1149 | QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: " |
| 1159 | "ccw_device_start rc = %i\n", rc); | 1150 | "ccw_device_start rc = %i\n", rc); |
| 1160 | QETH_DBF_TEXT_(TRACE, 2, " err%d", rc); | 1151 | QETH_DBF_TEXT_(TRACE, 2, " err%d", rc); |
| 1161 | qeth_release_buffer(iob->channel, iob); | 1152 | qeth_release_buffer(iob->channel, iob); |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 94a8ead64ed4..999552c83bbe 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
| @@ -311,7 +311,6 @@ static struct qeth_ipaddr *qeth_l3_get_addr_buffer( | |||
| 311 | 311 | ||
| 312 | addr = kzalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC); | 312 | addr = kzalloc(sizeof(struct qeth_ipaddr), GFP_ATOMIC); |
| 313 | if (addr == NULL) { | 313 | if (addr == NULL) { |
| 314 | PRINT_WARN("Not enough memory to add address\n"); | ||
| 315 | return NULL; | 314 | return NULL; |
| 316 | } | 315 | } |
| 317 | addr->type = QETH_IP_TYPE_NORMAL; | 316 | addr->type = QETH_IP_TYPE_NORMAL; |
| @@ -649,15 +648,6 @@ static void qeth_l3_correct_routing_type(struct qeth_card *card, | |||
| 649 | } | 648 | } |
| 650 | } | 649 | } |
| 651 | out_inval: | 650 | out_inval: |
| 652 | PRINT_WARN("Routing type '%s' not supported for interface %s.\n" | ||
| 653 | "Router status set to 'no router'.\n", | ||
| 654 | ((*type == PRIMARY_ROUTER)? "primary router" : | ||
| 655 | (*type == SECONDARY_ROUTER)? "secondary router" : | ||
| 656 | (*type == PRIMARY_CONNECTOR)? "primary connector" : | ||
| 657 | (*type == SECONDARY_CONNECTOR)? "secondary connector" : | ||
| 658 | (*type == MULTICAST_ROUTER)? "multicast router" : | ||
| 659 | "unknown"), | ||
| 660 | card->dev->name); | ||
| 661 | *type = NO_ROUTER; | 651 | *type = NO_ROUTER; |
| 662 | } | 652 | } |
| 663 | 653 | ||
| @@ -674,9 +664,9 @@ int qeth_l3_setrouting_v4(struct qeth_card *card) | |||
| 674 | QETH_PROT_IPV4); | 664 | QETH_PROT_IPV4); |
| 675 | if (rc) { | 665 | if (rc) { |
| 676 | card->options.route4.type = NO_ROUTER; | 666 | card->options.route4.type = NO_ROUTER; |
| 677 | PRINT_WARN("Error (0x%04x) while setting routing type on %s. " | 667 | QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" |
| 678 | "Type set to 'no router'.\n", | 668 | " on %s. Type set to 'no router'.\n", rc, |
| 679 | rc, QETH_CARD_IFNAME(card)); | 669 | QETH_CARD_IFNAME(card)); |
| 680 | } | 670 | } |
| 681 | return rc; | 671 | return rc; |
| 682 | } | 672 | } |
| @@ -697,9 +687,9 @@ int qeth_l3_setrouting_v6(struct qeth_card *card) | |||
| 697 | QETH_PROT_IPV6); | 687 | QETH_PROT_IPV6); |
| 698 | if (rc) { | 688 | if (rc) { |
| 699 | card->options.route6.type = NO_ROUTER; | 689 | card->options.route6.type = NO_ROUTER; |
| 700 | PRINT_WARN("Error (0x%04x) while setting routing type on %s. " | 690 | QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" |
| 701 | "Type set to 'no router'.\n", | 691 | " on %s. Type set to 'no router'.\n", rc, |
| 702 | rc, QETH_CARD_IFNAME(card)); | 692 | QETH_CARD_IFNAME(card)); |
| 703 | } | 693 | } |
| 704 | #endif | 694 | #endif |
| 705 | return rc; | 695 | return rc; |
| @@ -737,7 +727,6 @@ int qeth_l3_add_ipato_entry(struct qeth_card *card, | |||
| 737 | if (!memcmp(ipatoe->addr, new->addr, | 727 | if (!memcmp(ipatoe->addr, new->addr, |
| 738 | (ipatoe->proto == QETH_PROT_IPV4)? 4:16) && | 728 | (ipatoe->proto == QETH_PROT_IPV4)? 4:16) && |
| 739 | (ipatoe->mask_bits == new->mask_bits)) { | 729 | (ipatoe->mask_bits == new->mask_bits)) { |
| 740 | PRINT_WARN("ipato entry already exists!\n"); | ||
| 741 | rc = -EEXIST; | 730 | rc = -EEXIST; |
| 742 | break; | 731 | break; |
| 743 | } | 732 | } |
| @@ -802,7 +791,6 @@ int qeth_l3_add_vipa(struct qeth_card *card, enum qeth_prot_versions proto, | |||
| 802 | rc = -EEXIST; | 791 | rc = -EEXIST; |
| 803 | spin_unlock_irqrestore(&card->ip_lock, flags); | 792 | spin_unlock_irqrestore(&card->ip_lock, flags); |
| 804 | if (rc) { | 793 | if (rc) { |
| 805 | PRINT_WARN("Cannot add VIPA. Address already exists!\n"); | ||
| 806 | return rc; | 794 | return rc; |
| 807 | } | 795 | } |
| 808 | if (!qeth_l3_add_ip(card, ipaddr)) | 796 | if (!qeth_l3_add_ip(card, ipaddr)) |
| @@ -867,7 +855,6 @@ int qeth_l3_add_rxip(struct qeth_card *card, enum qeth_prot_versions proto, | |||
| 867 | rc = -EEXIST; | 855 | rc = -EEXIST; |
| 868 | spin_unlock_irqrestore(&card->ip_lock, flags); | 856 | spin_unlock_irqrestore(&card->ip_lock, flags); |
| 869 | if (rc) { | 857 | if (rc) { |
| 870 | PRINT_WARN("Cannot add RXIP. Address already exists!\n"); | ||
| 871 | return rc; | 858 | return rc; |
| 872 | } | 859 | } |
| 873 | if (!qeth_l3_add_ip(card, ipaddr)) | 860 | if (!qeth_l3_add_ip(card, ipaddr)) |
| @@ -1020,23 +1007,23 @@ static int qeth_l3_setadapter_hstr(struct qeth_card *card) | |||
| 1020 | IPA_SETADP_SET_BROADCAST_MODE, | 1007 | IPA_SETADP_SET_BROADCAST_MODE, |
| 1021 | card->options.broadcast_mode); | 1008 | card->options.broadcast_mode); |
| 1022 | if (rc) | 1009 | if (rc) |
| 1023 | PRINT_WARN("couldn't set broadcast mode on " | 1010 | QETH_DBF_MESSAGE(2, "couldn't set broadcast mode on " |
| 1024 | "device %s: x%x\n", | 1011 | "device %s: x%x\n", |
| 1025 | CARD_BUS_ID(card), rc); | 1012 | CARD_BUS_ID(card), rc); |
| 1026 | rc = qeth_l3_send_setadp_mode(card, | 1013 | rc = qeth_l3_send_setadp_mode(card, |
| 1027 | IPA_SETADP_ALTER_MAC_ADDRESS, | 1014 | IPA_SETADP_ALTER_MAC_ADDRESS, |
| 1028 | card->options.macaddr_mode); | 1015 | card->options.macaddr_mode); |
| 1029 | if (rc) | 1016 | if (rc) |
| 1030 | PRINT_WARN("couldn't set macaddr mode on " | 1017 | QETH_DBF_MESSAGE(2, "couldn't set macaddr mode on " |
| 1031 | "device %s: x%x\n", CARD_BUS_ID(card), rc); | 1018 | "device %s: x%x\n", CARD_BUS_ID(card), rc); |
| 1032 | return rc; | 1019 | return rc; |
| 1033 | } | 1020 | } |
| 1034 | if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL) | 1021 | if (card->options.broadcast_mode == QETH_TR_BROADCAST_LOCAL) |
| 1035 | PRINT_WARN("set adapter parameters not available " | 1022 | QETH_DBF_MESSAGE(2, "set adapter parameters not available " |
| 1036 | "to set broadcast mode, using ALLRINGS " | 1023 | "to set broadcast mode, using ALLRINGS " |
| 1037 | "on device %s:\n", CARD_BUS_ID(card)); | 1024 | "on device %s:\n", CARD_BUS_ID(card)); |
| 1038 | if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL) | 1025 | if (card->options.macaddr_mode == QETH_TR_MACADDR_CANONICAL) |
| 1039 | PRINT_WARN("set adapter parameters not available " | 1026 | QETH_DBF_MESSAGE(2, "set adapter parameters not available " |
| 1040 | "to set macaddr mode, using NONCANONICAL " | 1027 | "to set macaddr mode, using NONCANONICAL " |
| 1041 | "on device %s:\n", CARD_BUS_ID(card)); | 1028 | "on device %s:\n", CARD_BUS_ID(card)); |
| 1042 | return 0; | 1029 | return 0; |
| @@ -2070,7 +2057,7 @@ static struct qeth_card *qeth_l3_get_card_from_dev(struct net_device *dev) | |||
| 2070 | card = netdev_priv(dev); | 2057 | card = netdev_priv(dev); |
| 2071 | else if (rc == QETH_VLAN_CARD) | 2058 | else if (rc == QETH_VLAN_CARD) |
| 2072 | card = netdev_priv(vlan_dev_info(dev)->real_dev); | 2059 | card = netdev_priv(vlan_dev_info(dev)->real_dev); |
| 2073 | if (card->options.layer2) | 2060 | if (card && card->options.layer2) |
| 2074 | card = NULL; | 2061 | card = NULL; |
| 2075 | QETH_DBF_TEXT_(TRACE, 4, "%d", rc); | 2062 | QETH_DBF_TEXT_(TRACE, 4, "%d", rc); |
| 2076 | return card ; | 2063 | return card ; |
| @@ -2182,8 +2169,6 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) | |||
| 2182 | if (card->info.guestlan) | 2169 | if (card->info.guestlan) |
| 2183 | return -EOPNOTSUPP; | 2170 | return -EOPNOTSUPP; |
| 2184 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { | 2171 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { |
| 2185 | PRINT_WARN("ARP processing not supported " | ||
| 2186 | "on %s!\n", QETH_CARD_IFNAME(card)); | ||
| 2187 | return -EOPNOTSUPP; | 2172 | return -EOPNOTSUPP; |
| 2188 | } | 2173 | } |
| 2189 | rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, | 2174 | rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, |
| @@ -2191,8 +2176,8 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) | |||
| 2191 | no_entries); | 2176 | no_entries); |
| 2192 | if (rc) { | 2177 | if (rc) { |
| 2193 | tmp = rc; | 2178 | tmp = rc; |
| 2194 | PRINT_WARN("Could not set number of ARP entries on %s: " | 2179 | QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on " |
| 2195 | "%s (0x%x/%d)\n", QETH_CARD_IFNAME(card), | 2180 | "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), |
| 2196 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | 2181 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); |
| 2197 | } | 2182 | } |
| 2198 | return rc; | 2183 | return rc; |
| @@ -2260,9 +2245,6 @@ static int qeth_l3_arp_query_cb(struct qeth_card *card, | |||
| 2260 | qdata->no_entries * uentry_size){ | 2245 | qdata->no_entries * uentry_size){ |
| 2261 | QETH_DBF_TEXT_(TRACE, 4, "qaer3%i", -ENOMEM); | 2246 | QETH_DBF_TEXT_(TRACE, 4, "qaer3%i", -ENOMEM); |
| 2262 | cmd->hdr.return_code = -ENOMEM; | 2247 | cmd->hdr.return_code = -ENOMEM; |
| 2263 | PRINT_WARN("query ARP user space buffer is too small for " | ||
| 2264 | "the returned number of ARP entries. " | ||
| 2265 | "Aborting query!\n"); | ||
| 2266 | goto out_error; | 2248 | goto out_error; |
| 2267 | } | 2249 | } |
| 2268 | QETH_DBF_TEXT_(TRACE, 4, "anore%i", | 2250 | QETH_DBF_TEXT_(TRACE, 4, "anore%i", |
| @@ -2324,8 +2306,6 @@ static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) | |||
| 2324 | 2306 | ||
| 2325 | if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/ | 2307 | if (!qeth_is_supported(card,/*IPA_QUERY_ARP_ADDR_INFO*/ |
| 2326 | IPA_ARP_PROCESSING)) { | 2308 | IPA_ARP_PROCESSING)) { |
| 2327 | PRINT_WARN("ARP processing not supported " | ||
| 2328 | "on %s!\n", QETH_CARD_IFNAME(card)); | ||
| 2329 | return -EOPNOTSUPP; | 2309 | return -EOPNOTSUPP; |
| 2330 | } | 2310 | } |
| 2331 | /* get size of userspace buffer and mask_bits -> 6 bytes */ | 2311 | /* get size of userspace buffer and mask_bits -> 6 bytes */ |
| @@ -2344,7 +2324,7 @@ static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) | |||
| 2344 | qeth_l3_arp_query_cb, (void *)&qinfo); | 2324 | qeth_l3_arp_query_cb, (void *)&qinfo); |
| 2345 | if (rc) { | 2325 | if (rc) { |
| 2346 | tmp = rc; | 2326 | tmp = rc; |
| 2347 | PRINT_WARN("Error while querying ARP cache on %s: %s " | 2327 | QETH_DBF_MESSAGE(2, "Error while querying ARP cache on %s: %s " |
| 2348 | "(0x%x/%d)\n", QETH_CARD_IFNAME(card), | 2328 | "(0x%x/%d)\n", QETH_CARD_IFNAME(card), |
| 2349 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | 2329 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); |
| 2350 | if (copy_to_user(udata, qinfo.udata, 4)) | 2330 | if (copy_to_user(udata, qinfo.udata, 4)) |
| @@ -2375,8 +2355,6 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card, | |||
| 2375 | if (card->info.guestlan) | 2355 | if (card->info.guestlan) |
| 2376 | return -EOPNOTSUPP; | 2356 | return -EOPNOTSUPP; |
| 2377 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { | 2357 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { |
| 2378 | PRINT_WARN("ARP processing not supported " | ||
| 2379 | "on %s!\n", QETH_CARD_IFNAME(card)); | ||
| 2380 | return -EOPNOTSUPP; | 2358 | return -EOPNOTSUPP; |
| 2381 | } | 2359 | } |
| 2382 | 2360 | ||
| @@ -2391,10 +2369,9 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card, | |||
| 2391 | if (rc) { | 2369 | if (rc) { |
| 2392 | tmp = rc; | 2370 | tmp = rc; |
| 2393 | qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); | 2371 | qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); |
| 2394 | PRINT_WARN("Could not add ARP entry for address %s on %s: " | 2372 | QETH_DBF_MESSAGE(2, "Could not add ARP entry for address %s " |
| 2395 | "%s (0x%x/%d)\n", | 2373 | "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), |
| 2396 | buf, QETH_CARD_IFNAME(card), | 2374 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); |
| 2397 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
| 2398 | } | 2375 | } |
| 2399 | return rc; | 2376 | return rc; |
| 2400 | } | 2377 | } |
| @@ -2417,8 +2394,6 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card, | |||
| 2417 | if (card->info.guestlan) | 2394 | if (card->info.guestlan) |
| 2418 | return -EOPNOTSUPP; | 2395 | return -EOPNOTSUPP; |
| 2419 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { | 2396 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { |
| 2420 | PRINT_WARN("ARP processing not supported " | ||
| 2421 | "on %s!\n", QETH_CARD_IFNAME(card)); | ||
| 2422 | return -EOPNOTSUPP; | 2397 | return -EOPNOTSUPP; |
| 2423 | } | 2398 | } |
| 2424 | memcpy(buf, entry, 12); | 2399 | memcpy(buf, entry, 12); |
| @@ -2433,10 +2408,9 @@ static int qeth_l3_arp_remove_entry(struct qeth_card *card, | |||
| 2433 | tmp = rc; | 2408 | tmp = rc; |
| 2434 | memset(buf, 0, 16); | 2409 | memset(buf, 0, 16); |
| 2435 | qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); | 2410 | qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); |
| 2436 | PRINT_WARN("Could not delete ARP entry for address %s on %s: " | 2411 | QETH_DBF_MESSAGE(2, "Could not delete ARP entry for address %s" |
| 2437 | "%s (0x%x/%d)\n", | 2412 | " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), |
| 2438 | buf, QETH_CARD_IFNAME(card), | 2413 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); |
| 2439 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
| 2440 | } | 2414 | } |
| 2441 | return rc; | 2415 | return rc; |
| 2442 | } | 2416 | } |
| @@ -2456,16 +2430,14 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card) | |||
| 2456 | if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD)) | 2430 | if (card->info.guestlan || (card->info.type == QETH_CARD_TYPE_IQD)) |
| 2457 | return -EOPNOTSUPP; | 2431 | return -EOPNOTSUPP; |
| 2458 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { | 2432 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { |
| 2459 | PRINT_WARN("ARP processing not supported " | ||
| 2460 | "on %s!\n", QETH_CARD_IFNAME(card)); | ||
| 2461 | return -EOPNOTSUPP; | 2433 | return -EOPNOTSUPP; |
| 2462 | } | 2434 | } |
| 2463 | rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, | 2435 | rc = qeth_l3_send_simple_setassparms(card, IPA_ARP_PROCESSING, |
| 2464 | IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); | 2436 | IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); |
| 2465 | if (rc) { | 2437 | if (rc) { |
| 2466 | tmp = rc; | 2438 | tmp = rc; |
| 2467 | PRINT_WARN("Could not flush ARP cache on %s: %s (0x%x/%d)\n", | 2439 | QETH_DBF_MESSAGE(2, "Could not flush ARP cache on %s: %s " |
| 2468 | QETH_CARD_IFNAME(card), | 2440 | "(0x%x/%d)\n", QETH_CARD_IFNAME(card), |
| 2469 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | 2441 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); |
| 2470 | } | 2442 | } |
| 2471 | return rc; | 2443 | return rc; |
| @@ -2724,7 +2696,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 2724 | ctx = qeth_eddp_create_context(card, new_skb, hdr, | 2696 | ctx = qeth_eddp_create_context(card, new_skb, hdr, |
| 2725 | skb->sk->sk_protocol); | 2697 | skb->sk->sk_protocol); |
| 2726 | if (ctx == NULL) { | 2698 | if (ctx == NULL) { |
| 2727 | PRINT_WARN("could not create eddp context\n"); | 2699 | QETH_DBF_MESSAGE(2, "could not create eddp context\n"); |
| 2728 | goto tx_drop; | 2700 | goto tx_drop; |
| 2729 | } | 2701 | } |
| 2730 | } else { | 2702 | } else { |
| @@ -2792,6 +2764,7 @@ tx_drop: | |||
| 2792 | if ((new_skb != skb) && new_skb) | 2764 | if ((new_skb != skb) && new_skb) |
| 2793 | dev_kfree_skb_any(new_skb); | 2765 | dev_kfree_skb_any(new_skb); |
| 2794 | dev_kfree_skb_any(skb); | 2766 | dev_kfree_skb_any(skb); |
| 2767 | netif_wake_queue(dev); | ||
| 2795 | return NETDEV_TX_OK; | 2768 | return NETDEV_TX_OK; |
| 2796 | } | 2769 | } |
| 2797 | 2770 | ||
diff --git a/drivers/s390/net/qeth_l3_sys.c b/drivers/s390/net/qeth_l3_sys.c index 08f51fd902c4..ac1993708ae9 100644 --- a/drivers/s390/net/qeth_l3_sys.c +++ b/drivers/s390/net/qeth_l3_sys.c | |||
| @@ -85,7 +85,6 @@ static ssize_t qeth_l3_dev_route_store(struct qeth_card *card, | |||
| 85 | } else if (!strcmp(tmp, "multicast_router")) { | 85 | } else if (!strcmp(tmp, "multicast_router")) { |
| 86 | route->type = MULTICAST_ROUTER; | 86 | route->type = MULTICAST_ROUTER; |
| 87 | } else { | 87 | } else { |
| 88 | PRINT_WARN("Invalid routing type '%s'.\n", tmp); | ||
| 89 | return -EINVAL; | 88 | return -EINVAL; |
| 90 | } | 89 | } |
| 91 | if (((card->state == CARD_STATE_SOFTSETUP) || | 90 | if (((card->state == CARD_STATE_SOFTSETUP) || |
| @@ -137,9 +136,6 @@ static ssize_t qeth_l3_dev_route6_store(struct device *dev, | |||
| 137 | return -EINVAL; | 136 | return -EINVAL; |
| 138 | 137 | ||
| 139 | if (!qeth_is_supported(card, IPA_IPV6)) { | 138 | if (!qeth_is_supported(card, IPA_IPV6)) { |
| 140 | PRINT_WARN("IPv6 not supported for interface %s.\n" | ||
| 141 | "Routing status no changed.\n", | ||
| 142 | QETH_CARD_IFNAME(card)); | ||
| 143 | return -ENOTSUPP; | 139 | return -ENOTSUPP; |
| 144 | } | 140 | } |
| 145 | 141 | ||
| @@ -179,7 +175,6 @@ static ssize_t qeth_l3_dev_fake_broadcast_store(struct device *dev, | |||
| 179 | if ((i == 0) || (i == 1)) | 175 | if ((i == 0) || (i == 1)) |
| 180 | card->options.fake_broadcast = i; | 176 | card->options.fake_broadcast = i; |
| 181 | else { | 177 | else { |
| 182 | PRINT_WARN("fake_broadcast: write 0 or 1 to this file!\n"); | ||
| 183 | return -EINVAL; | 178 | return -EINVAL; |
| 184 | } | 179 | } |
| 185 | return count; | 180 | return count; |
| @@ -220,7 +215,6 @@ static ssize_t qeth_l3_dev_broadcast_mode_store(struct device *dev, | |||
| 220 | 215 | ||
| 221 | if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || | 216 | if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || |
| 222 | (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) { | 217 | (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) { |
| 223 | PRINT_WARN("Device is not a tokenring device!\n"); | ||
| 224 | return -EINVAL; | 218 | return -EINVAL; |
| 225 | } | 219 | } |
| 226 | 220 | ||
| @@ -233,8 +227,6 @@ static ssize_t qeth_l3_dev_broadcast_mode_store(struct device *dev, | |||
| 233 | card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS; | 227 | card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS; |
| 234 | return count; | 228 | return count; |
| 235 | } else { | 229 | } else { |
| 236 | PRINT_WARN("broadcast_mode: invalid mode %s!\n", | ||
| 237 | tmp); | ||
| 238 | return -EINVAL; | 230 | return -EINVAL; |
| 239 | } | 231 | } |
| 240 | return count; | 232 | return count; |
| @@ -275,7 +267,6 @@ static ssize_t qeth_l3_dev_canonical_macaddr_store(struct device *dev, | |||
| 275 | 267 | ||
| 276 | if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || | 268 | if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) || |
| 277 | (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) { | 269 | (card->info.link_type == QETH_LINK_TYPE_LANE_TR))) { |
| 278 | PRINT_WARN("Device is not a tokenring device!\n"); | ||
| 279 | return -EINVAL; | 270 | return -EINVAL; |
| 280 | } | 271 | } |
| 281 | 272 | ||
| @@ -285,7 +276,6 @@ static ssize_t qeth_l3_dev_canonical_macaddr_store(struct device *dev, | |||
| 285 | QETH_TR_MACADDR_CANONICAL : | 276 | QETH_TR_MACADDR_CANONICAL : |
| 286 | QETH_TR_MACADDR_NONCANONICAL; | 277 | QETH_TR_MACADDR_NONCANONICAL; |
| 287 | else { | 278 | else { |
| 288 | PRINT_WARN("canonical_macaddr: write 0 or 1 to this file!\n"); | ||
| 289 | return -EINVAL; | 279 | return -EINVAL; |
| 290 | } | 280 | } |
| 291 | return count; | 281 | return count; |
| @@ -327,7 +317,6 @@ static ssize_t qeth_l3_dev_checksum_store(struct device *dev, | |||
| 327 | else if (!strcmp(tmp, "no_checksumming")) | 317 | else if (!strcmp(tmp, "no_checksumming")) |
| 328 | card->options.checksum_type = NO_CHECKSUMMING; | 318 | card->options.checksum_type = NO_CHECKSUMMING; |
| 329 | else { | 319 | else { |
| 330 | PRINT_WARN("Unknown checksumming type '%s'\n", tmp); | ||
| 331 | return -EINVAL; | 320 | return -EINVAL; |
| 332 | } | 321 | } |
| 333 | return count; | 322 | return count; |
| @@ -382,8 +371,6 @@ static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev, | |||
| 382 | } else if (!strcmp(tmp, "0")) { | 371 | } else if (!strcmp(tmp, "0")) { |
| 383 | card->ipato.enabled = 0; | 372 | card->ipato.enabled = 0; |
| 384 | } else { | 373 | } else { |
| 385 | PRINT_WARN("ipato_enable: write 0, 1 or 'toggle' to " | ||
| 386 | "this file\n"); | ||
| 387 | return -EINVAL; | 374 | return -EINVAL; |
| 388 | } | 375 | } |
| 389 | return count; | 376 | return count; |
| @@ -422,8 +409,6 @@ static ssize_t qeth_l3_dev_ipato_invert4_store(struct device *dev, | |||
| 422 | } else if (!strcmp(tmp, "0")) { | 409 | } else if (!strcmp(tmp, "0")) { |
| 423 | card->ipato.invert4 = 0; | 410 | card->ipato.invert4 = 0; |
| 424 | } else { | 411 | } else { |
| 425 | PRINT_WARN("ipato_invert4: write 0, 1 or 'toggle' to " | ||
| 426 | "this file\n"); | ||
| 427 | return -EINVAL; | 412 | return -EINVAL; |
| 428 | } | 413 | } |
| 429 | return count; | 414 | return count; |
| @@ -486,13 +471,10 @@ static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto, | |||
| 486 | /* get address string */ | 471 | /* get address string */ |
| 487 | end = strchr(start, '/'); | 472 | end = strchr(start, '/'); |
| 488 | if (!end || (end - start >= 40)) { | 473 | if (!end || (end - start >= 40)) { |
| 489 | PRINT_WARN("Invalid format for ipato_addx/delx. " | ||
| 490 | "Use <ip addr>/<mask bits>\n"); | ||
| 491 | return -EINVAL; | 474 | return -EINVAL; |
| 492 | } | 475 | } |
| 493 | strncpy(buffer, start, end - start); | 476 | strncpy(buffer, start, end - start); |
| 494 | if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) { | 477 | if (qeth_l3_string_to_ipaddr(buffer, proto, addr)) { |
| 495 | PRINT_WARN("Invalid IP address format!\n"); | ||
| 496 | return -EINVAL; | 478 | return -EINVAL; |
| 497 | } | 479 | } |
| 498 | start = end + 1; | 480 | start = end + 1; |
| @@ -500,7 +482,6 @@ static int qeth_l3_parse_ipatoe(const char *buf, enum qeth_prot_versions proto, | |||
| 500 | if (!strlen(start) || | 482 | if (!strlen(start) || |
| 501 | (tmp == start) || | 483 | (tmp == start) || |
| 502 | (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) { | 484 | (*mask_bits > ((proto == QETH_PROT_IPV4) ? 32 : 128))) { |
| 503 | PRINT_WARN("Invalid mask bits for ipato_addx/delx !\n"); | ||
| 504 | return -EINVAL; | 485 | return -EINVAL; |
| 505 | } | 486 | } |
| 506 | return 0; | 487 | return 0; |
| @@ -520,7 +501,6 @@ static ssize_t qeth_l3_dev_ipato_add_store(const char *buf, size_t count, | |||
| 520 | 501 | ||
| 521 | ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL); | 502 | ipatoe = kzalloc(sizeof(struct qeth_ipato_entry), GFP_KERNEL); |
| 522 | if (!ipatoe) { | 503 | if (!ipatoe) { |
| 523 | PRINT_WARN("No memory to allocate ipato entry\n"); | ||
| 524 | return -ENOMEM; | 504 | return -ENOMEM; |
| 525 | } | 505 | } |
| 526 | ipatoe->proto = proto; | 506 | ipatoe->proto = proto; |
| @@ -609,8 +589,6 @@ static ssize_t qeth_l3_dev_ipato_invert6_store(struct device *dev, | |||
| 609 | } else if (!strcmp(tmp, "0")) { | 589 | } else if (!strcmp(tmp, "0")) { |
| 610 | card->ipato.invert6 = 0; | 590 | card->ipato.invert6 = 0; |
| 611 | } else { | 591 | } else { |
| 612 | PRINT_WARN("ipato_invert6: write 0, 1 or 'toggle' to " | ||
| 613 | "this file\n"); | ||
| 614 | return -EINVAL; | 592 | return -EINVAL; |
| 615 | } | 593 | } |
| 616 | return count; | 594 | return count; |
| @@ -724,7 +702,6 @@ static int qeth_l3_parse_vipae(const char *buf, enum qeth_prot_versions proto, | |||
| 724 | u8 *addr) | 702 | u8 *addr) |
| 725 | { | 703 | { |
| 726 | if (qeth_l3_string_to_ipaddr(buf, proto, addr)) { | 704 | if (qeth_l3_string_to_ipaddr(buf, proto, addr)) { |
| 727 | PRINT_WARN("Invalid IP address format!\n"); | ||
| 728 | return -EINVAL; | 705 | return -EINVAL; |
| 729 | } | 706 | } |
| 730 | return 0; | 707 | return 0; |
| @@ -891,7 +868,6 @@ static int qeth_l3_parse_rxipe(const char *buf, enum qeth_prot_versions proto, | |||
| 891 | u8 *addr) | 868 | u8 *addr) |
| 892 | { | 869 | { |
| 893 | if (qeth_l3_string_to_ipaddr(buf, proto, addr)) { | 870 | if (qeth_l3_string_to_ipaddr(buf, proto, addr)) { |
| 894 | PRINT_WARN("Invalid IP address format!\n"); | ||
| 895 | return -EINVAL; | 871 | return -EINVAL; |
| 896 | } | 872 | } |
| 897 | return 0; | 873 | return 0; |
diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index 5080f343ad74..5bfbe7659830 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c | |||
| @@ -207,6 +207,7 @@ s390_handle_mcck(void) | |||
| 207 | do_exit(SIGSEGV); | 207 | do_exit(SIGSEGV); |
| 208 | } | 208 | } |
| 209 | } | 209 | } |
| 210 | EXPORT_SYMBOL_GPL(s390_handle_mcck); | ||
| 210 | 211 | ||
| 211 | /* | 212 | /* |
| 212 | * returns 0 if all registers could be validated | 213 | * returns 0 if all registers could be validated |
diff --git a/drivers/scsi/dpt/dptsig.h b/drivers/scsi/dpt/dptsig.h index 72c8992fdf21..a6644b332b53 100644 --- a/drivers/scsi/dpt/dptsig.h +++ b/drivers/scsi/dpt/dptsig.h | |||
| @@ -85,7 +85,7 @@ typedef unsigned int sigINT; | |||
| 85 | /* ------------------------------------------------------------------ */ | 85 | /* ------------------------------------------------------------------ */ |
| 86 | /* What type of processor the file is meant to run on. */ | 86 | /* What type of processor the file is meant to run on. */ |
| 87 | /* This will let us know whether to read sigWORDs as high/low or low/high. */ | 87 | /* This will let us know whether to read sigWORDs as high/low or low/high. */ |
| 88 | #define PROC_INTEL 0x00 /* Intel 80x86 */ | 88 | #define PROC_INTEL 0x00 /* Intel 80x86/ia64 */ |
| 89 | #define PROC_MOTOROLA 0x01 /* Motorola 68K */ | 89 | #define PROC_MOTOROLA 0x01 /* Motorola 68K */ |
| 90 | #define PROC_MIPS4000 0x02 /* MIPS RISC 4000 */ | 90 | #define PROC_MIPS4000 0x02 /* MIPS RISC 4000 */ |
| 91 | #define PROC_ALPHA 0x03 /* DEC Alpha */ | 91 | #define PROC_ALPHA 0x03 /* DEC Alpha */ |
| @@ -104,6 +104,7 @@ typedef unsigned int sigINT; | |||
| 104 | #define PROC_486 0x08 /* Intel 80486 */ | 104 | #define PROC_486 0x08 /* Intel 80486 */ |
| 105 | #define PROC_PENTIUM 0x10 /* Intel 586 aka P5 aka Pentium */ | 105 | #define PROC_PENTIUM 0x10 /* Intel 586 aka P5 aka Pentium */ |
| 106 | #define PROC_SEXIUM 0x20 /* Intel 686 aka P6 aka Pentium Pro or MMX */ | 106 | #define PROC_SEXIUM 0x20 /* Intel 686 aka P6 aka Pentium Pro or MMX */ |
| 107 | #define PROC_IA64 0x40 /* Intel IA64 processor */ | ||
| 107 | 108 | ||
| 108 | /* PROC_i960: */ | 109 | /* PROC_i960: */ |
| 109 | #define PROC_960RX 0x01 /* Intel 80960RC/RD */ | 110 | #define PROC_960RX 0x01 /* Intel 80960RC/RD */ |
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 3690360d7a79..c6457bfc8a49 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
| @@ -456,6 +456,10 @@ static int __scsi_host_match(struct device *dev, void *data) | |||
| 456 | * | 456 | * |
| 457 | * Return value: | 457 | * Return value: |
| 458 | * A pointer to located Scsi_Host or NULL. | 458 | * A pointer to located Scsi_Host or NULL. |
| 459 | * | ||
| 460 | * The caller must do a scsi_host_put() to drop the reference | ||
| 461 | * that scsi_host_get() took. The put_device() below dropped | ||
| 462 | * the reference from class_find_device(). | ||
| 459 | **/ | 463 | **/ |
| 460 | struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) | 464 | struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) |
| 461 | { | 465 | { |
| @@ -463,9 +467,10 @@ struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) | |||
| 463 | struct Scsi_Host *shost = ERR_PTR(-ENXIO); | 467 | struct Scsi_Host *shost = ERR_PTR(-ENXIO); |
| 464 | 468 | ||
| 465 | cdev = class_find_device(&shost_class, &hostnum, __scsi_host_match); | 469 | cdev = class_find_device(&shost_class, &hostnum, __scsi_host_match); |
| 466 | if (cdev) | 470 | if (cdev) { |
| 467 | shost = scsi_host_get(class_to_shost(cdev)); | 471 | shost = scsi_host_get(class_to_shost(cdev)); |
| 468 | 472 | put_device(cdev); | |
| 473 | } | ||
| 469 | return shost; | 474 | return shost; |
| 470 | } | 475 | } |
| 471 | EXPORT_SYMBOL(scsi_host_lookup); | 476 | EXPORT_SYMBOL(scsi_host_lookup); |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 7ee86d4a7618..c82df8bd4d89 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
| @@ -178,6 +178,9 @@ int sr_test_unit_ready(struct scsi_device *sdev, struct scsi_sense_hdr *sshdr) | |||
| 178 | the_result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, | 178 | the_result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, |
| 179 | 0, sshdr, SR_TIMEOUT, | 179 | 0, sshdr, SR_TIMEOUT, |
| 180 | retries--); | 180 | retries--); |
| 181 | if (scsi_sense_valid(sshdr) && | ||
| 182 | sshdr->sense_key == UNIT_ATTENTION) | ||
| 183 | sdev->changed = 1; | ||
| 181 | 184 | ||
| 182 | } while (retries > 0 && | 185 | } while (retries > 0 && |
| 183 | (!scsi_status_is_good(the_result) || | 186 | (!scsi_status_is_good(the_result) || |
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index 7cf8851286b5..d184f2aea78d 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c | |||
| @@ -1168,15 +1168,21 @@ EXPORT_SYMBOL(ssb_dma_translation); | |||
| 1168 | int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask) | 1168 | int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask) |
| 1169 | { | 1169 | { |
| 1170 | struct device *dma_dev = ssb_dev->dma_dev; | 1170 | struct device *dma_dev = ssb_dev->dma_dev; |
| 1171 | int err = 0; | ||
| 1171 | 1172 | ||
| 1172 | #ifdef CONFIG_SSB_PCIHOST | 1173 | #ifdef CONFIG_SSB_PCIHOST |
| 1173 | if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) | 1174 | if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) { |
| 1174 | return dma_set_mask(dma_dev, mask); | 1175 | err = pci_set_dma_mask(ssb_dev->bus->host_pci, mask); |
| 1176 | if (err) | ||
| 1177 | return err; | ||
| 1178 | err = pci_set_consistent_dma_mask(ssb_dev->bus->host_pci, mask); | ||
| 1179 | return err; | ||
| 1180 | } | ||
| 1175 | #endif | 1181 | #endif |
| 1176 | dma_dev->coherent_dma_mask = mask; | 1182 | dma_dev->coherent_dma_mask = mask; |
| 1177 | dma_dev->dma_mask = &dma_dev->coherent_dma_mask; | 1183 | dma_dev->dma_mask = &dma_dev->coherent_dma_mask; |
| 1178 | 1184 | ||
| 1179 | return 0; | 1185 | return err; |
| 1180 | } | 1186 | } |
| 1181 | EXPORT_SYMBOL(ssb_dma_set_mask); | 1187 | EXPORT_SYMBOL(ssb_dma_set_mask); |
| 1182 | 1188 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 8eb4da332f56..94789be54ca3 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -644,6 +644,48 @@ static void hub_stop(struct usb_hub *hub) | |||
| 644 | 644 | ||
| 645 | #ifdef CONFIG_PM | 645 | #ifdef CONFIG_PM |
| 646 | 646 | ||
| 647 | /* Try to identify which devices need USB-PERSIST handling */ | ||
| 648 | static int persistent_device(struct usb_device *udev) | ||
| 649 | { | ||
| 650 | int i; | ||
| 651 | int retval; | ||
| 652 | struct usb_host_config *actconfig; | ||
| 653 | |||
| 654 | /* Explicitly not marked persistent? */ | ||
| 655 | if (!udev->persist_enabled) | ||
| 656 | return 0; | ||
| 657 | |||
| 658 | /* No active config? */ | ||
| 659 | actconfig = udev->actconfig; | ||
| 660 | if (!actconfig) | ||
| 661 | return 0; | ||
| 662 | |||
| 663 | /* FIXME! We should check whether it's open here or not! */ | ||
| 664 | |||
| 665 | /* | ||
| 666 | * Check that all the interface drivers have a | ||
| 667 | * 'reset_resume' entrypoint | ||
| 668 | */ | ||
| 669 | retval = 0; | ||
| 670 | for (i = 0; i < actconfig->desc.bNumInterfaces; i++) { | ||
| 671 | struct usb_interface *intf; | ||
| 672 | struct usb_driver *driver; | ||
| 673 | |||
| 674 | intf = actconfig->interface[i]; | ||
| 675 | if (!intf->dev.driver) | ||
| 676 | continue; | ||
| 677 | driver = to_usb_driver(intf->dev.driver); | ||
| 678 | if (!driver->reset_resume) | ||
| 679 | return 0; | ||
| 680 | /* | ||
| 681 | * We have at least one driver, and that one | ||
| 682 | * has a reset_resume method. | ||
| 683 | */ | ||
| 684 | retval = 1; | ||
| 685 | } | ||
| 686 | return retval; | ||
| 687 | } | ||
| 688 | |||
| 647 | static void hub_restart(struct usb_hub *hub, int type) | 689 | static void hub_restart(struct usb_hub *hub, int type) |
| 648 | { | 690 | { |
| 649 | struct usb_device *hdev = hub->hdev; | 691 | struct usb_device *hdev = hub->hdev; |
| @@ -689,8 +731,8 @@ static void hub_restart(struct usb_hub *hub, int type) | |||
| 689 | * turn off the various status changes to prevent | 731 | * turn off the various status changes to prevent |
| 690 | * khubd from disconnecting it later. | 732 | * khubd from disconnecting it later. |
| 691 | */ | 733 | */ |
| 692 | if (udev->persist_enabled && status == 0 && | 734 | if (status == 0 && !(portstatus & USB_PORT_STAT_ENABLE) && |
| 693 | !(portstatus & USB_PORT_STAT_ENABLE)) { | 735 | persistent_device(udev)) { |
| 694 | if (portchange & USB_PORT_STAT_C_ENABLE) | 736 | if (portchange & USB_PORT_STAT_C_ENABLE) |
| 695 | clear_port_feature(hub->hdev, port1, | 737 | clear_port_feature(hub->hdev, port1, |
| 696 | USB_PORT_FEAT_C_ENABLE); | 738 | USB_PORT_FEAT_C_ENABLE); |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 3da1ab4b389d..c070b34b669d 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
| @@ -47,6 +47,9 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
| 47 | /* Edirol SD-20 */ | 47 | /* Edirol SD-20 */ |
| 48 | { USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME }, | 48 | { USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME }, |
| 49 | 49 | ||
| 50 | /* appletouch */ | ||
| 51 | { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
| 52 | |||
| 50 | /* Avision AV600U */ | 53 | /* Avision AV600U */ |
| 51 | { USB_DEVICE(0x0638, 0x0a13), .driver_info = | 54 | { USB_DEVICE(0x0638, 0x0a13), .driver_info = |
| 52 | USB_QUIRK_STRING_FETCH_255 }, | 55 | USB_QUIRK_STRING_FETCH_255 }, |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index c9cec8738261..65aa5ecf569a 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
| @@ -2207,14 +2207,14 @@ struct usb_hcd *isp1760_register(u64 res_start, u64 res_len, int irq, | |||
| 2207 | goto err_put; | 2207 | goto err_put; |
| 2208 | } | 2208 | } |
| 2209 | 2209 | ||
| 2210 | ret = usb_add_hcd(hcd, irq, irqflags); | ||
| 2211 | if (ret) | ||
| 2212 | goto err_unmap; | ||
| 2213 | |||
| 2214 | hcd->irq = irq; | 2210 | hcd->irq = irq; |
| 2215 | hcd->rsrc_start = res_start; | 2211 | hcd->rsrc_start = res_start; |
| 2216 | hcd->rsrc_len = res_len; | 2212 | hcd->rsrc_len = res_len; |
| 2217 | 2213 | ||
| 2214 | ret = usb_add_hcd(hcd, irq, irqflags); | ||
| 2215 | if (ret) | ||
| 2216 | goto err_unmap; | ||
| 2217 | |||
| 2218 | return hcd; | 2218 | return hcd; |
| 2219 | 2219 | ||
| 2220 | err_unmap: | 2220 | err_unmap: |
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index eb6c06979f3b..001789c9a11a 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig | |||
| @@ -272,6 +272,7 @@ config USB_TEST | |||
| 272 | config USB_ISIGHTFW | 272 | config USB_ISIGHTFW |
| 273 | tristate "iSight firmware loading support" | 273 | tristate "iSight firmware loading support" |
| 274 | depends on USB | 274 | depends on USB |
| 275 | select FW_LOADER | ||
| 275 | help | 276 | help |
| 276 | This driver loads firmware for USB Apple iSight cameras, allowing | 277 | This driver loads firmware for USB Apple iSight cameras, allowing |
| 277 | them to be driven by the USB video class driver available at | 278 | them to be driven by the USB video class driver available at |
diff --git a/drivers/usb/misc/isight_firmware.c b/drivers/usb/misc/isight_firmware.c index 390e04885536..9f30aa1f8a5d 100644 --- a/drivers/usb/misc/isight_firmware.c +++ b/drivers/usb/misc/isight_firmware.c | |||
| @@ -39,9 +39,12 @@ static int isight_firmware_load(struct usb_interface *intf, | |||
| 39 | struct usb_device *dev = interface_to_usbdev(intf); | 39 | struct usb_device *dev = interface_to_usbdev(intf); |
| 40 | int llen, len, req, ret = 0; | 40 | int llen, len, req, ret = 0; |
| 41 | const struct firmware *firmware; | 41 | const struct firmware *firmware; |
| 42 | unsigned char *buf; | 42 | unsigned char *buf = kmalloc(50, GFP_KERNEL); |
| 43 | unsigned char data[4]; | 43 | unsigned char data[4]; |
| 44 | char *ptr; | 44 | u8 *ptr; |
| 45 | |||
| 46 | if (!buf) | ||
| 47 | return -ENOMEM; | ||
| 45 | 48 | ||
| 46 | if (request_firmware(&firmware, "isight.fw", &dev->dev) != 0) { | 49 | if (request_firmware(&firmware, "isight.fw", &dev->dev) != 0) { |
| 47 | printk(KERN_ERR "Unable to load isight firmware\n"); | 50 | printk(KERN_ERR "Unable to load isight firmware\n"); |
| @@ -59,7 +62,7 @@ static int isight_firmware_load(struct usb_interface *intf, | |||
| 59 | goto out; | 62 | goto out; |
| 60 | } | 63 | } |
| 61 | 64 | ||
| 62 | while (1) { | 65 | while (ptr+4 <= firmware->data+firmware->size) { |
| 63 | memcpy(data, ptr, 4); | 66 | memcpy(data, ptr, 4); |
| 64 | len = (data[0] << 8 | data[1]); | 67 | len = (data[0] << 8 | data[1]); |
| 65 | req = (data[2] << 8 | data[3]); | 68 | req = (data[2] << 8 | data[3]); |
| @@ -71,10 +74,14 @@ static int isight_firmware_load(struct usb_interface *intf, | |||
| 71 | continue; | 74 | continue; |
| 72 | 75 | ||
| 73 | for (; len > 0; req += 50) { | 76 | for (; len > 0; req += 50) { |
| 74 | llen = len > 50 ? 50 : len; | 77 | llen = min(len, 50); |
| 75 | len -= llen; | 78 | len -= llen; |
| 76 | 79 | if (ptr+llen > firmware->data+firmware->size) { | |
| 77 | buf = kmalloc(llen, GFP_KERNEL); | 80 | printk(KERN_ERR |
| 81 | "Malformed isight firmware"); | ||
| 82 | ret = -ENODEV; | ||
| 83 | goto out; | ||
| 84 | } | ||
| 78 | memcpy(buf, ptr, llen); | 85 | memcpy(buf, ptr, llen); |
| 79 | 86 | ||
| 80 | ptr += llen; | 87 | ptr += llen; |
| @@ -89,16 +96,18 @@ static int isight_firmware_load(struct usb_interface *intf, | |||
| 89 | goto out; | 96 | goto out; |
| 90 | } | 97 | } |
| 91 | 98 | ||
| 92 | kfree(buf); | ||
| 93 | } | 99 | } |
| 94 | } | 100 | } |
| 101 | |||
| 95 | if (usb_control_msg | 102 | if (usb_control_msg |
| 96 | (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\0", 1, | 103 | (dev, usb_sndctrlpipe(dev, 0), 0xa0, 0x40, 0xe600, 0, "\0", 1, |
| 97 | 300) != 1) { | 104 | 300) != 1) { |
| 98 | printk(KERN_ERR "isight firmware loading completion failed\n"); | 105 | printk(KERN_ERR "isight firmware loading completion failed\n"); |
| 99 | ret = -ENODEV; | 106 | ret = -ENODEV; |
| 100 | } | 107 | } |
| 108 | |||
| 101 | out: | 109 | out: |
| 110 | kfree(buf); | ||
| 102 | release_firmware(firmware); | 111 | release_firmware(firmware); |
| 103 | return ret; | 112 | return ret; |
| 104 | } | 113 | } |
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c index 35ac9d956b3d..c14b2435d23e 100644 --- a/drivers/video/cirrusfb.c +++ b/drivers/video/cirrusfb.c | |||
| @@ -2432,9 +2432,9 @@ static int cirrusfb_pci_register(struct pci_dev *pdev, | |||
| 2432 | info->screen_size = board_size; | 2432 | info->screen_size = board_size; |
| 2433 | cinfo->unmap = cirrusfb_pci_unmap; | 2433 | cinfo->unmap = cirrusfb_pci_unmap; |
| 2434 | 2434 | ||
| 2435 | printk(KERN_INFO " RAM (%lu kB) at 0xx%lx, ", | 2435 | printk(KERN_INFO "RAM (%lu kB) at 0x%lx, Cirrus " |
| 2436 | info->screen_size >> 10, board_addr); | 2436 | "Logic chipset on PCI bus\n", |
| 2437 | printk(KERN_INFO "Cirrus Logic chipset on PCI bus\n"); | 2437 | info->screen_size >> 10, board_addr); |
| 2438 | pci_set_drvdata(pdev, info); | 2438 | pci_set_drvdata(pdev, info); |
| 2439 | 2439 | ||
| 2440 | ret = cirrusfb_register(info); | 2440 | ret = cirrusfb_register(info); |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index b50bb03cb5ab..0a2785361ca3 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
| @@ -1320,7 +1320,7 @@ static void free_irq_local(int irq) | |||
| 1320 | * Power management hooks. Note that we won't be called from IRQ context, | 1320 | * Power management hooks. Note that we won't be called from IRQ context, |
| 1321 | * unlike the blank functions above, so we may sleep. | 1321 | * unlike the blank functions above, so we may sleep. |
| 1322 | */ | 1322 | */ |
| 1323 | static int fsl_diu_suspend(struct of_device *dev, pm_message_t state) | 1323 | static int fsl_diu_suspend(struct of_device *ofdev, pm_message_t state) |
| 1324 | { | 1324 | { |
| 1325 | struct fsl_diu_data *machine_data; | 1325 | struct fsl_diu_data *machine_data; |
| 1326 | 1326 | ||
| @@ -1330,7 +1330,7 @@ static int fsl_diu_suspend(struct of_device *dev, pm_message_t state) | |||
| 1330 | return 0; | 1330 | return 0; |
| 1331 | } | 1331 | } |
| 1332 | 1332 | ||
| 1333 | static int fsl_diu_resume(struct of_device *dev) | 1333 | static int fsl_diu_resume(struct of_device *ofdev) |
| 1334 | { | 1334 | { |
| 1335 | struct fsl_diu_data *machine_data; | 1335 | struct fsl_diu_data *machine_data; |
| 1336 | 1336 | ||
diff --git a/drivers/video/hgafb.c b/drivers/video/hgafb.c index fb9e67228543..c18880d9db1f 100644 --- a/drivers/video/hgafb.c +++ b/drivers/video/hgafb.c | |||
| @@ -279,7 +279,7 @@ static void hga_blank(int blank_mode) | |||
| 279 | 279 | ||
| 280 | static int __init hga_card_detect(void) | 280 | static int __init hga_card_detect(void) |
| 281 | { | 281 | { |
| 282 | int count=0; | 282 | int count = 0; |
| 283 | void __iomem *p, *q; | 283 | void __iomem *p, *q; |
| 284 | unsigned short p_save, q_save; | 284 | unsigned short p_save, q_save; |
| 285 | 285 | ||
| @@ -303,20 +303,18 @@ static int __init hga_card_detect(void) | |||
| 303 | writew(0x55aa, p); if (readw(p) == 0x55aa) count++; | 303 | writew(0x55aa, p); if (readw(p) == 0x55aa) count++; |
| 304 | writew(p_save, p); | 304 | writew(p_save, p); |
| 305 | 305 | ||
| 306 | if (count != 2) { | 306 | if (count != 2) |
| 307 | return 0; | 307 | goto error; |
| 308 | } | ||
| 309 | 308 | ||
| 310 | /* Ok, there is definitely a card registering at the correct | 309 | /* Ok, there is definitely a card registering at the correct |
| 311 | * memory location, so now we do an I/O port test. | 310 | * memory location, so now we do an I/O port test. |
| 312 | */ | 311 | */ |
| 313 | 312 | ||
| 314 | if (!test_hga_b(0x66, 0x0f)) { /* cursor low register */ | 313 | if (!test_hga_b(0x66, 0x0f)) /* cursor low register */ |
| 315 | return 0; | 314 | goto error; |
| 316 | } | 315 | |
| 317 | if (!test_hga_b(0x99, 0x0f)) { /* cursor low register */ | 316 | if (!test_hga_b(0x99, 0x0f)) /* cursor low register */ |
| 318 | return 0; | 317 | goto error; |
| 319 | } | ||
| 320 | 318 | ||
| 321 | /* See if the card is a Hercules, by checking whether the vsync | 319 | /* See if the card is a Hercules, by checking whether the vsync |
| 322 | * bit of the status register is changing. This test lasts for | 320 | * bit of the status register is changing. This test lasts for |
| @@ -331,7 +329,7 @@ static int __init hga_card_detect(void) | |||
| 331 | } | 329 | } |
| 332 | 330 | ||
| 333 | if (p_save == q_save) | 331 | if (p_save == q_save) |
| 334 | return 0; | 332 | goto error; |
| 335 | 333 | ||
| 336 | switch (inb_p(HGA_STATUS_PORT) & 0x70) { | 334 | switch (inb_p(HGA_STATUS_PORT) & 0x70) { |
| 337 | case 0x10: | 335 | case 0x10: |
| @@ -348,6 +346,12 @@ static int __init hga_card_detect(void) | |||
| 348 | break; | 346 | break; |
| 349 | } | 347 | } |
| 350 | return 1; | 348 | return 1; |
| 349 | error: | ||
| 350 | if (release_io_ports) | ||
| 351 | release_region(0x3b0, 12); | ||
| 352 | if (release_io_port) | ||
| 353 | release_region(0x3bf, 1); | ||
| 354 | return 0; | ||
| 351 | } | 355 | } |
| 352 | 356 | ||
| 353 | /** | 357 | /** |
diff --git a/drivers/video/leo.c b/drivers/video/leo.c index 8bc46e930340..13fea61d6ae4 100644 --- a/drivers/video/leo.c +++ b/drivers/video/leo.c | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
| 18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
| 19 | #include <linux/of_device.h> | 19 | #include <linux/of_device.h> |
| 20 | #include <linux/io.h> | ||
| 20 | 21 | ||
| 21 | #include <asm/io.h> | ||
| 22 | #include <asm/fbio.h> | 22 | #include <asm/fbio.h> |
| 23 | 23 | ||
| 24 | #include "sbuslib.h" | 24 | #include "sbuslib.h" |
| @@ -33,7 +33,6 @@ static int leo_blank(int, struct fb_info *); | |||
| 33 | 33 | ||
| 34 | static int leo_mmap(struct fb_info *, struct vm_area_struct *); | 34 | static int leo_mmap(struct fb_info *, struct vm_area_struct *); |
| 35 | static int leo_ioctl(struct fb_info *, unsigned int, unsigned long); | 35 | static int leo_ioctl(struct fb_info *, unsigned int, unsigned long); |
| 36 | static int leo_pan_display(struct fb_var_screeninfo *, struct fb_info *); | ||
| 37 | 36 | ||
| 38 | /* | 37 | /* |
| 39 | * Frame buffer operations | 38 | * Frame buffer operations |
| @@ -43,7 +42,6 @@ static struct fb_ops leo_ops = { | |||
| 43 | .owner = THIS_MODULE, | 42 | .owner = THIS_MODULE, |
| 44 | .fb_setcolreg = leo_setcolreg, | 43 | .fb_setcolreg = leo_setcolreg, |
| 45 | .fb_blank = leo_blank, | 44 | .fb_blank = leo_blank, |
| 46 | .fb_pan_display = leo_pan_display, | ||
| 47 | .fb_fillrect = cfb_fillrect, | 45 | .fb_fillrect = cfb_fillrect, |
| 48 | .fb_copyarea = cfb_copyarea, | 46 | .fb_copyarea = cfb_copyarea, |
| 49 | .fb_imageblit = cfb_imageblit, | 47 | .fb_imageblit = cfb_imageblit, |
| @@ -78,7 +76,7 @@ static struct fb_ops leo_ops = { | |||
| 78 | #define LEO_CUR_TYPE_CMAP 0x00000050 | 76 | #define LEO_CUR_TYPE_CMAP 0x00000050 |
| 79 | 77 | ||
| 80 | struct leo_cursor { | 78 | struct leo_cursor { |
| 81 | u8 xxx0[16]; | 79 | u8 xxx0[16]; |
| 82 | u32 cur_type; | 80 | u32 cur_type; |
| 83 | u32 cur_misc; | 81 | u32 cur_misc; |
| 84 | u32 cur_cursxy; | 82 | u32 cur_cursxy; |
| @@ -105,7 +103,7 @@ struct leo_lx_krn { | |||
| 105 | 103 | ||
| 106 | struct leo_lc_ss0_krn { | 104 | struct leo_lc_ss0_krn { |
| 107 | u32 misc; | 105 | u32 misc; |
| 108 | u8 xxx0[0x800-4]; | 106 | u8 xxx0[0x800-4]; |
| 109 | u32 rev; | 107 | u32 rev; |
| 110 | }; | 108 | }; |
| 111 | 109 | ||
| @@ -116,7 +114,7 @@ struct leo_lc_ss0_usr { | |||
| 116 | u32 fontt; | 114 | u32 fontt; |
| 117 | u32 extent; | 115 | u32 extent; |
| 118 | u32 src; | 116 | u32 src; |
| 119 | u32 dst; | 117 | u32 dst; |
| 120 | u32 copy; | 118 | u32 copy; |
| 121 | u32 fill; | 119 | u32 fill; |
| 122 | }; | 120 | }; |
| @@ -129,8 +127,8 @@ struct leo_lc_ss1_usr { | |||
| 129 | u8 unknown; | 127 | u8 unknown; |
| 130 | }; | 128 | }; |
| 131 | 129 | ||
| 132 | struct leo_ld { | 130 | struct leo_ld_ss0 { |
| 133 | u8 xxx0[0xe00]; | 131 | u8 xxx0[0xe00]; |
| 134 | u32 csr; | 132 | u32 csr; |
| 135 | u32 wid; | 133 | u32 wid; |
| 136 | u32 wmask; | 134 | u32 wmask; |
| @@ -144,13 +142,13 @@ struct leo_ld { | |||
| 144 | u32 src; /* Copy/Scroll (SS0 only) */ | 142 | u32 src; /* Copy/Scroll (SS0 only) */ |
| 145 | u32 dst; /* Copy/Scroll/Fill (SS0 only) */ | 143 | u32 dst; /* Copy/Scroll/Fill (SS0 only) */ |
| 146 | u32 extent; /* Copy/Scroll/Fill size (SS0 only) */ | 144 | u32 extent; /* Copy/Scroll/Fill size (SS0 only) */ |
| 147 | u32 xxx1[3]; | 145 | u32 xxx1[3]; |
| 148 | u32 setsem; /* SS1 only */ | 146 | u32 setsem; /* SS1 only */ |
| 149 | u32 clrsem; /* SS1 only */ | 147 | u32 clrsem; /* SS1 only */ |
| 150 | u32 clrpick; /* SS1 only */ | 148 | u32 clrpick; /* SS1 only */ |
| 151 | u32 clrdat; /* SS1 only */ | 149 | u32 clrdat; /* SS1 only */ |
| 152 | u32 alpha; /* SS1 only */ | 150 | u32 alpha; /* SS1 only */ |
| 153 | u8 xxx2[0x2c]; | 151 | u8 xxx2[0x2c]; |
| 154 | u32 winbg; | 152 | u32 winbg; |
| 155 | u32 planemask; | 153 | u32 planemask; |
| 156 | u32 rop; | 154 | u32 rop; |
| @@ -199,11 +197,12 @@ struct leo_par { | |||
| 199 | static void leo_wait(struct leo_lx_krn __iomem *lx_krn) | 197 | static void leo_wait(struct leo_lx_krn __iomem *lx_krn) |
| 200 | { | 198 | { |
| 201 | int i; | 199 | int i; |
| 202 | 200 | ||
| 203 | for (i = 0; | 201 | for (i = 0; |
| 204 | (sbus_readl(&lx_krn->krn_csr) & LEO_KRN_CSR_PROGRESS) && i < 300000; | 202 | (sbus_readl(&lx_krn->krn_csr) & LEO_KRN_CSR_PROGRESS) && |
| 203 | i < 300000; | ||
| 205 | i++) | 204 | i++) |
| 206 | udelay (1); /* Busy wait at most 0.3 sec */ | 205 | udelay(1); /* Busy wait at most 0.3 sec */ |
| 207 | return; | 206 | return; |
| 208 | } | 207 | } |
| 209 | 208 | ||
| @@ -221,7 +220,7 @@ static int leo_setcolreg(unsigned regno, | |||
| 221 | unsigned transp, struct fb_info *info) | 220 | unsigned transp, struct fb_info *info) |
| 222 | { | 221 | { |
| 223 | struct leo_par *par = (struct leo_par *) info->par; | 222 | struct leo_par *par = (struct leo_par *) info->par; |
| 224 | struct leo_lx_krn __iomem *lx_krn = par->lx_krn; | 223 | struct leo_lx_krn __iomem *lx_krn = par->lx_krn; |
| 225 | unsigned long flags; | 224 | unsigned long flags; |
| 226 | u32 val; | 225 | u32 val; |
| 227 | int i; | 226 | int i; |
| @@ -408,7 +407,7 @@ static void leo_wid_put(struct fb_info *info, struct fb_wid_list *wl) | |||
| 408 | leo_wait(lx_krn); | 407 | leo_wait(lx_krn); |
| 409 | 408 | ||
| 410 | for (i = 0, wi = wl->wl_list; i < wl->wl_count; i++, wi++) { | 409 | for (i = 0, wi = wl->wl_list; i < wl->wl_count; i++, wi++) { |
| 411 | switch(wi->wi_type) { | 410 | switch (wi->wi_type) { |
| 412 | case FB_WID_DBL_8: | 411 | case FB_WID_DBL_8: |
| 413 | j = (wi->wi_index & 0xf) + 0x40; | 412 | j = (wi->wi_index & 0xf) + 0x40; |
| 414 | break; | 413 | break; |
| @@ -453,13 +452,12 @@ static void leo_init_wids(struct fb_info *info) | |||
| 453 | wi.wi_index = 1; | 452 | wi.wi_index = 1; |
| 454 | wi.wi_values [0] = 0x30; | 453 | wi.wi_values [0] = 0x30; |
| 455 | leo_wid_put(info, &wl); | 454 | leo_wid_put(info, &wl); |
| 456 | |||
| 457 | } | 455 | } |
| 458 | 456 | ||
| 459 | static void leo_switch_from_graph(struct fb_info *info) | 457 | static void leo_switch_from_graph(struct fb_info *info) |
| 460 | { | 458 | { |
| 461 | struct leo_par *par = (struct leo_par *) info->par; | 459 | struct leo_par *par = (struct leo_par *) info->par; |
| 462 | struct leo_ld __iomem *ss = (struct leo_ld __iomem *) par->ld_ss0; | 460 | struct leo_ld_ss0 __iomem *ss = par->ld_ss0; |
| 463 | unsigned long flags; | 461 | unsigned long flags; |
| 464 | u32 val; | 462 | u32 val; |
| 465 | 463 | ||
| @@ -485,19 +483,13 @@ static void leo_switch_from_graph(struct fb_info *info) | |||
| 485 | val = sbus_readl(&par->lc_ss0_usr->csr); | 483 | val = sbus_readl(&par->lc_ss0_usr->csr); |
| 486 | } while (val & 0x20000000); | 484 | } while (val & 0x20000000); |
| 487 | 485 | ||
| 488 | spin_unlock_irqrestore(&par->lock, flags); | 486 | /* setup screen buffer for cfb_* functions */ |
| 489 | } | 487 | sbus_writel(1, &ss->wid); |
| 490 | 488 | sbus_writel(0x00ffffff, &ss->planemask); | |
| 491 | static int leo_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) | 489 | sbus_writel(0x310b90, &ss->rop); |
| 492 | { | 490 | sbus_writel(0, &par->lc_ss0_usr->addrspace); |
| 493 | /* We just use this to catch switches out of | ||
| 494 | * graphics mode. | ||
| 495 | */ | ||
| 496 | leo_switch_from_graph(info); | ||
| 497 | 491 | ||
| 498 | if (var->xoffset || var->yoffset || var->vmode) | 492 | spin_unlock_irqrestore(&par->lock, flags); |
| 499 | return -EINVAL; | ||
| 500 | return 0; | ||
| 501 | } | 493 | } |
| 502 | 494 | ||
| 503 | static void leo_init_hw(struct fb_info *info) | 495 | static void leo_init_hw(struct fb_info *info) |
| @@ -542,7 +534,8 @@ static void leo_unmap_regs(struct of_device *op, struct fb_info *info, | |||
| 542 | of_iounmap(&op->resource[0], info->screen_base, 0x800000); | 534 | of_iounmap(&op->resource[0], info->screen_base, 0x800000); |
| 543 | } | 535 | } |
| 544 | 536 | ||
| 545 | static int __devinit leo_probe(struct of_device *op, const struct of_device_id *match) | 537 | static int __devinit leo_probe(struct of_device *op, |
| 538 | const struct of_device_id *match) | ||
| 546 | { | 539 | { |
| 547 | struct device_node *dp = op->node; | 540 | struct device_node *dp = op->node; |
| 548 | struct fb_info *info; | 541 | struct fb_info *info; |
| @@ -594,8 +587,9 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id * | |||
| 594 | !info->screen_base) | 587 | !info->screen_base) |
| 595 | goto out_unmap_regs; | 588 | goto out_unmap_regs; |
| 596 | 589 | ||
| 597 | info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; | 590 | info->flags = FBINFO_DEFAULT; |
| 598 | info->fbops = &leo_ops; | 591 | info->fbops = &leo_ops; |
| 592 | info->pseudo_palette = par->clut_data; | ||
| 599 | 593 | ||
| 600 | leo_init_wids(info); | 594 | leo_init_wids(info); |
| 601 | leo_init_hw(info); | 595 | leo_init_hw(info); |
| @@ -649,7 +643,7 @@ static int __devexit leo_remove(struct of_device *op) | |||
| 649 | 643 | ||
| 650 | static struct of_device_id leo_match[] = { | 644 | static struct of_device_id leo_match[] = { |
| 651 | { | 645 | { |
| 652 | .name = "leo", | 646 | .name = "SUNW,leo", |
| 653 | }, | 647 | }, |
| 654 | {}, | 648 | {}, |
| 655 | }; | 649 | }; |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 274bc93ab7d8..7dcda187d9ba 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
| @@ -573,8 +573,8 @@ static int setup_frame_dma(struct pxafb_info *fbi, int dma, int pal, | |||
| 573 | dma_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; | 573 | dma_desc->fdadr = fbi->dma_buff_phys + dma_desc_off; |
| 574 | fbi->fdadr[dma] = fbi->dma_buff_phys + dma_desc_off; | 574 | fbi->fdadr[dma] = fbi->dma_buff_phys + dma_desc_off; |
| 575 | } else { | 575 | } else { |
| 576 | pal_desc = &fbi->dma_buff->pal_desc[dma]; | 576 | pal_desc = &fbi->dma_buff->pal_desc[pal]; |
| 577 | pal_desc_off = offsetof(struct pxafb_dma_buff, dma_desc[pal]); | 577 | pal_desc_off = offsetof(struct pxafb_dma_buff, pal_desc[pal]); |
| 578 | 578 | ||
| 579 | pal_desc->fsadr = fbi->dma_buff_phys + pal * PALETTE_SIZE; | 579 | pal_desc->fsadr = fbi->dma_buff_phys + pal * PALETTE_SIZE; |
| 580 | pal_desc->fidr = 0; | 580 | pal_desc->fidr = 0; |
| @@ -1276,6 +1276,8 @@ static int __init pxafb_map_video_memory(struct pxafb_info *fbi) | |||
| 1276 | fbi->dma_buff_phys = fbi->map_dma; | 1276 | fbi->dma_buff_phys = fbi->map_dma; |
| 1277 | fbi->palette_cpu = (u16 *) fbi->dma_buff->palette; | 1277 | fbi->palette_cpu = (u16 *) fbi->dma_buff->palette; |
| 1278 | 1278 | ||
| 1279 | pr_debug("pxafb: palette_mem_size = 0x%08lx\n", fbi->palette_size*sizeof(u16)); | ||
| 1280 | |||
| 1279 | #ifdef CONFIG_FB_PXA_SMARTPANEL | 1281 | #ifdef CONFIG_FB_PXA_SMARTPANEL |
| 1280 | fbi->smart_cmds = (uint16_t *) fbi->dma_buff->cmd_buff; | 1282 | fbi->smart_cmds = (uint16_t *) fbi->dma_buff->cmd_buff; |
| 1281 | fbi->n_smart_cmds = 0; | 1283 | fbi->n_smart_cmds = 0; |
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c index 0f3c2bb7bf35..7084e7e146c0 100644 --- a/drivers/virtio/virtio.c +++ b/drivers/virtio/virtio.c | |||
| @@ -124,9 +124,9 @@ static int virtio_dev_probe(struct device *_d) | |||
| 124 | if (err) | 124 | if (err) |
| 125 | add_status(dev, VIRTIO_CONFIG_S_FAILED); | 125 | add_status(dev, VIRTIO_CONFIG_S_FAILED); |
| 126 | else { | 126 | else { |
| 127 | add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK); | ||
| 128 | /* They should never have set feature bits beyond 32 */ | 127 | /* They should never have set feature bits beyond 32 */ |
| 129 | dev->config->set_features(dev, dev->features[0]); | 128 | dev->config->set_features(dev, dev->features[0]); |
| 129 | add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK); | ||
| 130 | } | 130 | } |
| 131 | return err; | 131 | return err; |
| 132 | } | 132 | } |
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index 25b352b664d9..8662a6b7a30b 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile | |||
| @@ -68,6 +68,7 @@ obj-$(CONFIG_WAFER_WDT) += wafer5823wdt.o | |||
| 68 | obj-$(CONFIG_I6300ESB_WDT) += i6300esb.o | 68 | obj-$(CONFIG_I6300ESB_WDT) += i6300esb.o |
| 69 | obj-$(CONFIG_ITCO_WDT) += iTCO_wdt.o iTCO_vendor_support.o | 69 | obj-$(CONFIG_ITCO_WDT) += iTCO_wdt.o iTCO_vendor_support.o |
| 70 | obj-$(CONFIG_IT8712F_WDT) += it8712f_wdt.o | 70 | obj-$(CONFIG_IT8712F_WDT) += it8712f_wdt.o |
| 71 | CFLAGS_hpwdt.o += -O | ||
| 71 | obj-$(CONFIG_HP_WATCHDOG) += hpwdt.o | 72 | obj-$(CONFIG_HP_WATCHDOG) += hpwdt.o |
| 72 | obj-$(CONFIG_SC1200_WDT) += sc1200wdt.o | 73 | obj-$(CONFIG_SC1200_WDT) += sc1200wdt.o |
| 73 | obj-$(CONFIG_SCx200_WDT) += scx200_wdt.o | 74 | obj-$(CONFIG_SCx200_WDT) += scx200_wdt.o |
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c index 6a63535fc04d..2686f3eaeedf 100644 --- a/drivers/watchdog/hpwdt.c +++ b/drivers/watchdog/hpwdt.c | |||
| @@ -145,8 +145,8 @@ MODULE_DEVICE_TABLE(pci, hpwdt_devices); | |||
| 145 | 145 | ||
| 146 | #define HPWDT_ARCH 32 | 146 | #define HPWDT_ARCH 32 |
| 147 | 147 | ||
| 148 | static void asminline_call(struct cmn_registers *pi86Regs, | 148 | asmlinkage void asminline_call(struct cmn_registers *pi86Regs, |
| 149 | unsigned long *pRomEntry) | 149 | unsigned long *pRomEntry) |
| 150 | { | 150 | { |
| 151 | asm("pushl %ebp \n\t" | 151 | asm("pushl %ebp \n\t" |
| 152 | "movl %esp, %ebp \n\t" | 152 | "movl %esp, %ebp \n\t" |
| @@ -333,8 +333,8 @@ static int __devinit detect_cru_service(void) | |||
| 333 | 333 | ||
| 334 | #define HPWDT_ARCH 64 | 334 | #define HPWDT_ARCH 64 |
| 335 | 335 | ||
| 336 | static void asminline_call(struct cmn_registers *pi86Regs, | 336 | asmlinkage void asminline_call(struct cmn_registers *pi86Regs, |
| 337 | unsigned long *pRomEntry) | 337 | unsigned long *pRomEntry) |
| 338 | { | 338 | { |
| 339 | asm("pushq %rbp \n\t" | 339 | asm("pushq %rbp \n\t" |
| 340 | "movq %rsp, %rbp \n\t" | 340 | "movq %rsp, %rbp \n\t" |
| @@ -418,20 +418,23 @@ static int hpwdt_pretimeout(struct notifier_block *nb, unsigned long ulReason, | |||
| 418 | static unsigned long rom_pl; | 418 | static unsigned long rom_pl; |
| 419 | static int die_nmi_called; | 419 | static int die_nmi_called; |
| 420 | 420 | ||
| 421 | if (ulReason == DIE_NMI || ulReason == DIE_NMI_IPI) { | 421 | if (ulReason != DIE_NMI && ulReason != DIE_NMI_IPI) |
| 422 | spin_lock_irqsave(&rom_lock, rom_pl); | 422 | return NOTIFY_OK; |
| 423 | if (!die_nmi_called) | 423 | |
| 424 | asminline_call(&cmn_regs, cru_rom_addr); | 424 | spin_lock_irqsave(&rom_lock, rom_pl); |
| 425 | die_nmi_called = 1; | 425 | if (!die_nmi_called) |
| 426 | spin_unlock_irqrestore(&rom_lock, rom_pl); | 426 | asminline_call(&cmn_regs, cru_rom_addr); |
| 427 | if (cmn_regs.u1.ral != 0) { | 427 | die_nmi_called = 1; |
| 428 | panic("An NMI occurred, please see the Integrated " | 428 | spin_unlock_irqrestore(&rom_lock, rom_pl); |
| 429 | "Management Log for details.\n"); | 429 | if (cmn_regs.u1.ral == 0) { |
| 430 | } | 430 | printk(KERN_WARNING "hpwdt: An NMI occurred, " |
| 431 | "but unable to determine source.\n"); | ||
| 432 | } else { | ||
| 433 | panic("An NMI occurred, please see the Integrated " | ||
| 434 | "Management Log for details.\n"); | ||
| 431 | } | 435 | } |
| 432 | 436 | ||
| 433 | die_nmi_called = 0; | 437 | return NOTIFY_STOP; |
| 434 | return NOTIFY_DONE; | ||
| 435 | } | 438 | } |
| 436 | 439 | ||
| 437 | /* | 440 | /* |
