diff options
Diffstat (limited to 'drivers')
157 files changed, 1992 insertions, 1452 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 47dfde95b8f8..b7d1514cd199 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <linux/delay.h> | 36 | #include <linux/delay.h> |
37 | #include <linux/workqueue.h> | 37 | #include <linux/workqueue.h> |
38 | #include <linux/nmi.h> | 38 | #include <linux/nmi.h> |
39 | #include <linux/kthread.h> | ||
40 | #include <acpi/acpi.h> | 39 | #include <acpi/acpi.h> |
41 | #include <asm/io.h> | 40 | #include <asm/io.h> |
42 | #include <acpi/acpi_bus.h> | 41 | #include <acpi/acpi_bus.h> |
@@ -583,16 +582,6 @@ static void acpi_os_execute_deferred(void *context) | |||
583 | return; | 582 | return; |
584 | } | 583 | } |
585 | 584 | ||
586 | static int acpi_os_execute_thread(void *context) | ||
587 | { | ||
588 | struct acpi_os_dpc *dpc = (struct acpi_os_dpc *)context; | ||
589 | if (dpc) { | ||
590 | dpc->function(dpc->context); | ||
591 | kfree(dpc); | ||
592 | } | ||
593 | do_exit(0); | ||
594 | } | ||
595 | |||
596 | /******************************************************************************* | 585 | /******************************************************************************* |
597 | * | 586 | * |
598 | * FUNCTION: acpi_os_execute | 587 | * FUNCTION: acpi_os_execute |
@@ -614,10 +603,16 @@ acpi_status acpi_os_execute(acpi_execute_type type, | |||
614 | acpi_status status = AE_OK; | 603 | acpi_status status = AE_OK; |
615 | struct acpi_os_dpc *dpc; | 604 | struct acpi_os_dpc *dpc; |
616 | struct work_struct *task; | 605 | struct work_struct *task; |
617 | struct task_struct *p; | 606 | |
607 | ACPI_FUNCTION_TRACE("os_queue_for_execution"); | ||
608 | |||
609 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
610 | "Scheduling function [%p(%p)] for deferred execution.\n", | ||
611 | function, context)); | ||
618 | 612 | ||
619 | if (!function) | 613 | if (!function) |
620 | return AE_BAD_PARAMETER; | 614 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
615 | |||
621 | /* | 616 | /* |
622 | * Allocate/initialize DPC structure. Note that this memory will be | 617 | * Allocate/initialize DPC structure. Note that this memory will be |
623 | * freed by the callee. The kernel handles the tq_struct list in a | 618 | * freed by the callee. The kernel handles the tq_struct list in a |
@@ -628,34 +623,27 @@ acpi_status acpi_os_execute(acpi_execute_type type, | |||
628 | * We can save time and code by allocating the DPC and tq_structs | 623 | * We can save time and code by allocating the DPC and tq_structs |
629 | * from the same memory. | 624 | * from the same memory. |
630 | */ | 625 | */ |
631 | if (type == OSL_NOTIFY_HANDLER) { | 626 | |
632 | dpc = kmalloc(sizeof(struct acpi_os_dpc), GFP_KERNEL); | 627 | dpc = |
633 | } else { | 628 | kmalloc(sizeof(struct acpi_os_dpc) + sizeof(struct work_struct), |
634 | dpc = kmalloc(sizeof(struct acpi_os_dpc) + | 629 | GFP_ATOMIC); |
635 | sizeof(struct work_struct), GFP_ATOMIC); | ||
636 | } | ||
637 | if (!dpc) | 630 | if (!dpc) |
638 | return AE_NO_MEMORY; | 631 | return_ACPI_STATUS(AE_NO_MEMORY); |
632 | |||
639 | dpc->function = function; | 633 | dpc->function = function; |
640 | dpc->context = context; | 634 | dpc->context = context; |
641 | 635 | ||
642 | if (type == OSL_NOTIFY_HANDLER) { | 636 | task = (void *)(dpc + 1); |
643 | p = kthread_create(acpi_os_execute_thread, dpc, "kacpid_notify"); | 637 | INIT_WORK(task, acpi_os_execute_deferred, (void *)dpc); |
644 | if (!IS_ERR(p)) { | 638 | |
645 | wake_up_process(p); | 639 | if (!queue_work(kacpid_wq, task)) { |
646 | } else { | 640 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
647 | status = AE_NO_MEMORY; | 641 | "Call to queue_work() failed.\n")); |
648 | kfree(dpc); | 642 | kfree(dpc); |
649 | } | 643 | status = AE_ERROR; |
650 | } else { | ||
651 | task = (void *)(dpc + 1); | ||
652 | INIT_WORK(task, acpi_os_execute_deferred, (void *)dpc); | ||
653 | if (!queue_work(kacpid_wq, task)) { | ||
654 | status = AE_ERROR; | ||
655 | kfree(dpc); | ||
656 | } | ||
657 | } | 644 | } |
658 | return status; | 645 | |
646 | return_ACPI_STATUS(status); | ||
659 | } | 647 | } |
660 | 648 | ||
661 | EXPORT_SYMBOL(acpi_os_execute); | 649 | EXPORT_SYMBOL(acpi_os_execute); |
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 83fa8b291a59..2e954d07175a 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -129,7 +129,7 @@ static struct kobj_type ktype_bus = { | |||
129 | 129 | ||
130 | }; | 130 | }; |
131 | 131 | ||
132 | decl_subsys(bus, &ktype_bus, NULL); | 132 | static decl_subsys(bus, &ktype_bus, NULL); |
133 | 133 | ||
134 | 134 | ||
135 | #ifdef CONFIG_HOTPLUG | 135 | #ifdef CONFIG_HOTPLUG |
@@ -598,12 +598,13 @@ void put_bus(struct bus_type * bus) | |||
598 | * | 598 | * |
599 | * Note that kset_find_obj increments bus' reference count. | 599 | * Note that kset_find_obj increments bus' reference count. |
600 | */ | 600 | */ |
601 | 601 | #if 0 | |
602 | struct bus_type * find_bus(char * name) | 602 | struct bus_type * find_bus(char * name) |
603 | { | 603 | { |
604 | struct kobject * k = kset_find_obj(&bus_subsys.kset, name); | 604 | struct kobject * k = kset_find_obj(&bus_subsys.kset, name); |
605 | return k ? to_bus(k) : NULL; | 605 | return k ? to_bus(k) : NULL; |
606 | } | 606 | } |
607 | #endif /* 0 */ | ||
607 | 608 | ||
608 | 609 | ||
609 | /** | 610 | /** |
diff --git a/drivers/base/core.c b/drivers/base/core.c index b21f864c9ce8..be6b5bc0677d 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -559,20 +559,20 @@ static void device_create_release(struct device *dev) | |||
559 | 559 | ||
560 | /** | 560 | /** |
561 | * device_create - creates a device and registers it with sysfs | 561 | * device_create - creates a device and registers it with sysfs |
562 | * @cs: pointer to the struct class that this device should be registered to. | 562 | * @class: pointer to the struct class that this device should be registered to |
563 | * @parent: pointer to the parent struct device of this new device, if any. | 563 | * @parent: pointer to the parent struct device of this new device, if any |
564 | * @dev: the dev_t for the char device to be added. | 564 | * @devt: the dev_t for the char device to be added |
565 | * @fmt: string for the class device's name | 565 | * @fmt: string for the device's name |
566 | * | ||
567 | * This function can be used by char device classes. A struct device | ||
568 | * will be created in sysfs, registered to the specified class. | ||
566 | * | 569 | * |
567 | * This function can be used by char device classes. A struct | ||
568 | * device will be created in sysfs, registered to the specified | ||
569 | * class. | ||
570 | * A "dev" file will be created, showing the dev_t for the device, if | 570 | * A "dev" file will be created, showing the dev_t for the device, if |
571 | * the dev_t is not 0,0. | 571 | * the dev_t is not 0,0. |
572 | * If a pointer to a parent struct device is passed in, the newly | 572 | * If a pointer to a parent struct device is passed in, the newly created |
573 | * created struct device will be a child of that device in sysfs. The | 573 | * struct device will be a child of that device in sysfs. |
574 | * pointer to the struct device will be returned from the call. Any | 574 | * The pointer to the struct device will be returned from the call. |
575 | * further sysfs files that might be required can be created using this | 575 | * Any further sysfs files that might be required can be created using this |
576 | * pointer. | 576 | * pointer. |
577 | * | 577 | * |
578 | * Note: the struct class passed to this function must have previously | 578 | * Note: the struct class passed to this function must have previously |
@@ -620,11 +620,11 @@ EXPORT_SYMBOL_GPL(device_create); | |||
620 | 620 | ||
621 | /** | 621 | /** |
622 | * device_destroy - removes a device that was created with device_create() | 622 | * device_destroy - removes a device that was created with device_create() |
623 | * @class: the pointer to the struct class that this device was registered * with. | 623 | * @class: pointer to the struct class that this device was registered with |
624 | * @dev: the dev_t of the device that was previously registered. | 624 | * @devt: the dev_t of the device that was previously registered |
625 | * | 625 | * |
626 | * This call unregisters and cleans up a class device that was created with a | 626 | * This call unregisters and cleans up a device that was created with a |
627 | * call to class_device_create() | 627 | * call to device_create(). |
628 | */ | 628 | */ |
629 | void device_destroy(struct class *class, dev_t devt) | 629 | void device_destroy(struct class *class, dev_t devt) |
630 | { | 630 | { |
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 1994270c16e1..93ba25b7ea32 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c | |||
@@ -191,7 +191,7 @@ static int hci_uart_flush(struct hci_dev *hdev) | |||
191 | 191 | ||
192 | /* Flush any pending characters in the driver and discipline. */ | 192 | /* Flush any pending characters in the driver and discipline. */ |
193 | tty_ldisc_flush(tty); | 193 | tty_ldisc_flush(tty); |
194 | if (tty->driver->flush_buffer) | 194 | if (tty->driver && tty->driver->flush_buffer) |
195 | tty->driver->flush_buffer(tty); | 195 | tty->driver->flush_buffer(tty); |
196 | 196 | ||
197 | if (test_bit(HCI_UART_PROTO_SET, &hu->flags)) | 197 | if (test_bit(HCI_UART_PROTO_SET, &hu->flags)) |
@@ -290,7 +290,7 @@ static int hci_uart_tty_open(struct tty_struct *tty) | |||
290 | if (tty->ldisc.flush_buffer) | 290 | if (tty->ldisc.flush_buffer) |
291 | tty->ldisc.flush_buffer(tty); | 291 | tty->ldisc.flush_buffer(tty); |
292 | 292 | ||
293 | if (tty->driver->flush_buffer) | 293 | if (tty->driver && tty->driver->flush_buffer) |
294 | tty->driver->flush_buffer(tty); | 294 | tty->driver->flush_buffer(tty); |
295 | 295 | ||
296 | return 0; | 296 | return 0; |
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 6ccc364c08df..6e6a7c7a7eff 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
@@ -1245,7 +1245,7 @@ static int rtc_proc_open(struct inode *inode, struct file *file) | |||
1245 | 1245 | ||
1246 | void rtc_get_rtc_time(struct rtc_time *rtc_tm) | 1246 | void rtc_get_rtc_time(struct rtc_time *rtc_tm) |
1247 | { | 1247 | { |
1248 | unsigned long uip_watchdog = jiffies; | 1248 | unsigned long uip_watchdog = jiffies, flags; |
1249 | unsigned char ctrl; | 1249 | unsigned char ctrl; |
1250 | #ifdef CONFIG_MACH_DECSTATION | 1250 | #ifdef CONFIG_MACH_DECSTATION |
1251 | unsigned int real_year; | 1251 | unsigned int real_year; |
@@ -1272,7 +1272,7 @@ void rtc_get_rtc_time(struct rtc_time *rtc_tm) | |||
1272 | * RTC has RTC_DAY_OF_WEEK, we should usually ignore it, as it is | 1272 | * RTC has RTC_DAY_OF_WEEK, we should usually ignore it, as it is |
1273 | * only updated by the RTC when initially set to a non-zero value. | 1273 | * only updated by the RTC when initially set to a non-zero value. |
1274 | */ | 1274 | */ |
1275 | spin_lock_irq(&rtc_lock); | 1275 | spin_lock_irqsave(&rtc_lock, flags); |
1276 | rtc_tm->tm_sec = CMOS_READ(RTC_SECONDS); | 1276 | rtc_tm->tm_sec = CMOS_READ(RTC_SECONDS); |
1277 | rtc_tm->tm_min = CMOS_READ(RTC_MINUTES); | 1277 | rtc_tm->tm_min = CMOS_READ(RTC_MINUTES); |
1278 | rtc_tm->tm_hour = CMOS_READ(RTC_HOURS); | 1278 | rtc_tm->tm_hour = CMOS_READ(RTC_HOURS); |
@@ -1286,7 +1286,7 @@ void rtc_get_rtc_time(struct rtc_time *rtc_tm) | |||
1286 | real_year = CMOS_READ(RTC_DEC_YEAR); | 1286 | real_year = CMOS_READ(RTC_DEC_YEAR); |
1287 | #endif | 1287 | #endif |
1288 | ctrl = CMOS_READ(RTC_CONTROL); | 1288 | ctrl = CMOS_READ(RTC_CONTROL); |
1289 | spin_unlock_irq(&rtc_lock); | 1289 | spin_unlock_irqrestore(&rtc_lock, flags); |
1290 | 1290 | ||
1291 | if (!(ctrl & RTC_DM_BINARY) || RTC_ALWAYS_BCD) | 1291 | if (!(ctrl & RTC_DM_BINARY) || RTC_ALWAYS_BCD) |
1292 | { | 1292 | { |
diff --git a/drivers/hwmon/abituguru.c b/drivers/hwmon/abituguru.c index 59122cc0a50a..cc15c4f2e9ec 100644 --- a/drivers/hwmon/abituguru.c +++ b/drivers/hwmon/abituguru.c | |||
@@ -142,6 +142,14 @@ static const u8 abituguru_pwm_max[5] = { 0, 255, 255, 75, 75 }; | |||
142 | static int force; | 142 | static int force; |
143 | module_param(force, bool, 0); | 143 | module_param(force, bool, 0); |
144 | MODULE_PARM_DESC(force, "Set to one to force detection."); | 144 | MODULE_PARM_DESC(force, "Set to one to force detection."); |
145 | static int bank1_types[ABIT_UGURU_MAX_BANK1_SENSORS] = { -1, -1, -1, -1, -1, | ||
146 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; | ||
147 | module_param_array(bank1_types, int, NULL, 0); | ||
148 | MODULE_PARM_DESC(bank1_types, "Bank1 sensortype autodetection override:\n" | ||
149 | " -1 autodetect\n" | ||
150 | " 0 volt sensor\n" | ||
151 | " 1 temp sensor\n" | ||
152 | " 2 not connected"); | ||
145 | static int fan_sensors; | 153 | static int fan_sensors; |
146 | module_param(fan_sensors, int, 0); | 154 | module_param(fan_sensors, int, 0); |
147 | MODULE_PARM_DESC(fan_sensors, "Number of fan sensors on the uGuru " | 155 | MODULE_PARM_DESC(fan_sensors, "Number of fan sensors on the uGuru " |
@@ -397,6 +405,15 @@ abituguru_detect_bank1_sensor_type(struct abituguru_data *data, | |||
397 | u8 val, buf[3]; | 405 | u8 val, buf[3]; |
398 | int ret = ABIT_UGURU_NC; | 406 | int ret = ABIT_UGURU_NC; |
399 | 407 | ||
408 | /* If overriden by the user return the user selected type */ | ||
409 | if (bank1_types[sensor_addr] >= ABIT_UGURU_IN_SENSOR && | ||
410 | bank1_types[sensor_addr] <= ABIT_UGURU_NC) { | ||
411 | ABIT_UGURU_DEBUG(2, "assuming sensor type %d for bank1 sensor " | ||
412 | "%d because of \"bank1_types\" module param\n", | ||
413 | bank1_types[sensor_addr], (int)sensor_addr); | ||
414 | return bank1_types[sensor_addr]; | ||
415 | } | ||
416 | |||
400 | /* First read the sensor and the current settings */ | 417 | /* First read the sensor and the current settings */ |
401 | if (abituguru_read(data, ABIT_UGURU_SENSOR_BANK1, sensor_addr, &val, | 418 | if (abituguru_read(data, ABIT_UGURU_SENSOR_BANK1, sensor_addr, &val, |
402 | 1, ABIT_UGURU_MAX_RETRIES) != 1) | 419 | 1, ABIT_UGURU_MAX_RETRIES) != 1) |
@@ -514,7 +531,7 @@ abituguru_detect_no_bank2_sensors(struct abituguru_data *data) | |||
514 | { | 531 | { |
515 | int i; | 532 | int i; |
516 | 533 | ||
517 | if (fan_sensors) { | 534 | if (fan_sensors > 0 && fan_sensors <= ABIT_UGURU_MAX_BANK2_SENSORS) { |
518 | data->bank2_sensors = fan_sensors; | 535 | data->bank2_sensors = fan_sensors; |
519 | ABIT_UGURU_DEBUG(2, "assuming %d fan sensors because of " | 536 | ABIT_UGURU_DEBUG(2, "assuming %d fan sensors because of " |
520 | "\"fan_sensors\" module param\n", | 537 | "\"fan_sensors\" module param\n", |
@@ -568,7 +585,7 @@ abituguru_detect_no_pwms(struct abituguru_data *data) | |||
568 | { | 585 | { |
569 | int i, j; | 586 | int i, j; |
570 | 587 | ||
571 | if (pwms) { | 588 | if (pwms > 0 && pwms <= ABIT_UGURU_MAX_PWMS) { |
572 | data->pwms = pwms; | 589 | data->pwms = pwms; |
573 | ABIT_UGURU_DEBUG(2, "assuming %d PWM outputs because of " | 590 | ABIT_UGURU_DEBUG(2, "assuming %d PWM outputs because of " |
574 | "\"pwms\" module param\n", (int)data->pwms); | 591 | "\"pwms\" module param\n", (int)data->pwms); |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index df05df1a0ef6..ab230c033f99 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -372,7 +372,6 @@ static inline int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
372 | 372 | ||
373 | while (count > 0) { | 373 | while (count > 0) { |
374 | inval = i2c_inb(i2c_adap); | 374 | inval = i2c_inb(i2c_adap); |
375 | /*printk("%#02x ",inval); if ( ! (count % 16) ) printk("\n"); */ | ||
376 | if (inval>=0) { | 375 | if (inval>=0) { |
377 | *temp = inval; | 376 | *temp = inval; |
378 | rdcount++; | 377 | rdcount++; |
@@ -544,8 +543,7 @@ int i2c_bit_add_bus(struct i2c_adapter *adap) | |||
544 | adap->timeout = 100; /* default values, should */ | 543 | adap->timeout = 100; /* default values, should */ |
545 | adap->retries = 3; /* be replaced by defines */ | 544 | adap->retries = 3; /* be replaced by defines */ |
546 | 545 | ||
547 | i2c_add_adapter(adap); | 546 | return i2c_add_adapter(adap); |
548 | return 0; | ||
549 | } | 547 | } |
550 | 548 | ||
551 | 549 | ||
diff --git a/drivers/i2c/algos/i2c-algo-ite.c b/drivers/i2c/algos/i2c-algo-ite.c index 2db7bfc85225..70d8eefb5efc 100644 --- a/drivers/i2c/algos/i2c-algo-ite.c +++ b/drivers/i2c/algos/i2c-algo-ite.c | |||
@@ -742,10 +742,8 @@ int i2c_iic_add_bus(struct i2c_adapter *adap) | |||
742 | adap->retries = 3; /* be replaced by defines */ | 742 | adap->retries = 3; /* be replaced by defines */ |
743 | adap->flags = 0; | 743 | adap->flags = 0; |
744 | 744 | ||
745 | i2c_add_adapter(adap); | ||
746 | iic_init(iic_adap); | 745 | iic_init(iic_adap); |
747 | 746 | return i2c_add_adapter(adap); | |
748 | return 0; | ||
749 | } | 747 | } |
750 | 748 | ||
751 | 749 | ||
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 82946acab4c7..b88a6fcf7bd0 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
@@ -374,10 +374,10 @@ int i2c_pca_add_bus(struct i2c_adapter *adap) | |||
374 | adap->timeout = 100; /* default values, should */ | 374 | adap->timeout = 100; /* default values, should */ |
375 | adap->retries = 3; /* be replaced by defines */ | 375 | adap->retries = 3; /* be replaced by defines */ |
376 | 376 | ||
377 | rval = pca_init(pca_adap); | 377 | if ((rval = pca_init(pca_adap))) |
378 | return rval; | ||
378 | 379 | ||
379 | if (!rval) | 380 | rval = i2c_add_adapter(adap); |
380 | i2c_add_adapter(adap); | ||
381 | 381 | ||
382 | return rval; | 382 | return rval; |
383 | } | 383 | } |
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 6e498df1f717..5b24930adb5a 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
@@ -479,9 +479,11 @@ int i2c_pcf_add_bus(struct i2c_adapter *adap) | |||
479 | adap->timeout = 100; /* default values, should */ | 479 | adap->timeout = 100; /* default values, should */ |
480 | adap->retries = 3; /* be replaced by defines */ | 480 | adap->retries = 3; /* be replaced by defines */ |
481 | 481 | ||
482 | rval = pcf_init_8584(pcf_adap); | 482 | if ((rval = pcf_init_8584(pcf_adap))) |
483 | if (!rval) | 483 | return rval; |
484 | i2c_add_adapter(adap); | 484 | |
485 | rval = i2c_add_adapter(adap); | ||
486 | |||
485 | return rval; | 487 | return rval; |
486 | } | 488 | } |
487 | 489 | ||
diff --git a/drivers/i2c/algos/i2c-algo-sibyte.c b/drivers/i2c/algos/i2c-algo-sibyte.c index 3df3f09995c2..32d41c6fac0f 100644 --- a/drivers/i2c/algos/i2c-algo-sibyte.c +++ b/drivers/i2c/algos/i2c-algo-sibyte.c | |||
@@ -173,9 +173,7 @@ int i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) | |||
173 | printk("\n"); | 173 | printk("\n"); |
174 | } | 174 | } |
175 | 175 | ||
176 | i2c_add_adapter(i2c_adap); | 176 | return i2c_add_adapter(i2c_adap); |
177 | |||
178 | return 0; | ||
179 | } | 177 | } |
180 | 178 | ||
181 | 179 | ||
diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c index aca7e1668605..48c56939c861 100644 --- a/drivers/i2c/busses/i2c-iop3xx.c +++ b/drivers/i2c/busses/i2c-iop3xx.c | |||
@@ -21,6 +21,9 @@ | |||
21 | * - Make it work with IXP46x chips | 21 | * - Make it work with IXP46x chips |
22 | * - Cleanup function names, coding style, etc | 22 | * - Cleanup function names, coding style, etc |
23 | * | 23 | * |
24 | * - writing to slave address causes latchup on iop331. | ||
25 | * fix: driver refuses to address self. | ||
26 | * | ||
24 | * This program is free software; you can redistribute it and/or modify | 27 | * This program is free software; you can redistribute it and/or modify |
25 | * it under the terms of the GNU General Public License as published by | 28 | * it under the terms of the GNU General Public License as published by |
26 | * the Free Software Foundation, version 2. | 29 | * the Free Software Foundation, version 2. |
@@ -73,12 +76,6 @@ iop3xx_i2c_reset(struct i2c_algo_iop3xx_data *iop3xx_adap) | |||
73 | } | 76 | } |
74 | 77 | ||
75 | static void | 78 | static void |
76 | iop3xx_i2c_set_slave_addr(struct i2c_algo_iop3xx_data *iop3xx_adap) | ||
77 | { | ||
78 | __raw_writel(MYSAR, iop3xx_adap->ioaddr + SAR_OFFSET); | ||
79 | } | ||
80 | |||
81 | static void | ||
82 | iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap) | 79 | iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap) |
83 | { | 80 | { |
84 | u32 cr = IOP3XX_ICR_GCD | IOP3XX_ICR_SCLEN | IOP3XX_ICR_UE; | 81 | u32 cr = IOP3XX_ICR_GCD | IOP3XX_ICR_SCLEN | IOP3XX_ICR_UE; |
@@ -248,6 +245,13 @@ iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap, | |||
248 | int status; | 245 | int status; |
249 | int rc; | 246 | int rc; |
250 | 247 | ||
248 | /* avoid writing to my slave address (hangs on 80331), | ||
249 | * forbidden in Intel developer manual | ||
250 | */ | ||
251 | if (msg->addr == MYSAR) { | ||
252 | return -EBUSY; | ||
253 | } | ||
254 | |||
251 | __raw_writel(iic_cook_addr(msg), iop3xx_adap->ioaddr + DBR_OFFSET); | 255 | __raw_writel(iic_cook_addr(msg), iop3xx_adap->ioaddr + DBR_OFFSET); |
252 | 256 | ||
253 | cr &= ~(IOP3XX_ICR_MSTOP | IOP3XX_ICR_NACK); | 257 | cr &= ~(IOP3XX_ICR_MSTOP | IOP3XX_ICR_NACK); |
@@ -498,7 +502,6 @@ iop3xx_i2c_probe(struct platform_device *pdev) | |||
498 | spin_lock_init(&adapter_data->lock); | 502 | spin_lock_init(&adapter_data->lock); |
499 | 503 | ||
500 | iop3xx_i2c_reset(adapter_data); | 504 | iop3xx_i2c_reset(adapter_data); |
501 | iop3xx_i2c_set_slave_addr(adapter_data); | ||
502 | iop3xx_i2c_enable(adapter_data); | 505 | iop3xx_i2c_enable(adapter_data); |
503 | 506 | ||
504 | platform_set_drvdata(pdev, new_adapter); | 507 | platform_set_drvdata(pdev, new_adapter); |
diff --git a/drivers/i2c/busses/i2c-iop3xx.h b/drivers/i2c/busses/i2c-iop3xx.h index e46ebaea7b1e..8485861f6a36 100644 --- a/drivers/i2c/busses/i2c-iop3xx.h +++ b/drivers/i2c/busses/i2c-iop3xx.h | |||
@@ -80,7 +80,7 @@ | |||
80 | #define IOP3XX_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */ | 80 | #define IOP3XX_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */ |
81 | #define IOP3XX_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */ | 81 | #define IOP3XX_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */ |
82 | 82 | ||
83 | #define MYSAR 0x02 /* SWAG a suitable slave address */ | 83 | #define MYSAR 0 /* default slave address */ |
84 | 84 | ||
85 | #define I2C_ERR 321 | 85 | #define I2C_ERR 321 |
86 | #define I2C_ERR_BERR (I2C_ERR+0) | 86 | #define I2C_ERR_BERR (I2C_ERR+0) |
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c index 2a0b3be7cdd0..53bb43593863 100644 --- a/drivers/i2c/busses/i2c-powermac.c +++ b/drivers/i2c/busses/i2c-powermac.c | |||
@@ -148,8 +148,6 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap, | |||
148 | int read; | 148 | int read; |
149 | int addrdir; | 149 | int addrdir; |
150 | 150 | ||
151 | if (num != 1) | ||
152 | return -EINVAL; | ||
153 | if (msgs->flags & I2C_M_TEN) | 151 | if (msgs->flags & I2C_M_TEN) |
154 | return -EINVAL; | 152 | return -EINVAL; |
155 | read = (msgs->flags & I2C_M_RD) != 0; | 153 | read = (msgs->flags & I2C_M_RD) != 0; |
@@ -166,7 +164,7 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap, | |||
166 | rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); | 164 | rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); |
167 | bail: | 165 | bail: |
168 | pmac_i2c_close(bus); | 166 | pmac_i2c_close(bus); |
169 | return rc < 0 ? rc : msgs->len; | 167 | return rc < 0 ? rc : 1; |
170 | } | 168 | } |
171 | 169 | ||
172 | static u32 i2c_powermac_func(struct i2c_adapter * adapter) | 170 | static u32 i2c_powermac_func(struct i2c_adapter * adapter) |
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index 22a3eda04166..ced309ff056f 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
@@ -184,21 +184,21 @@ static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status) | |||
184 | break; | 184 | break; |
185 | 185 | ||
186 | case state_read: | 186 | case state_read: |
187 | /* Set ACK if receiving the last byte */ | 187 | /* Set ACK if _next_ byte will be the last one */ |
188 | if (iface->len == 1) | 188 | if (iface->len == 2) |
189 | outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1); | 189 | outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1); |
190 | else | 190 | else |
191 | outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1); | 191 | outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1); |
192 | 192 | ||
193 | *iface->ptr++ = inb(ACBSDA); | 193 | if (iface->len == 1) { |
194 | --iface->len; | ||
195 | |||
196 | if (iface->len == 0) { | ||
197 | iface->result = 0; | 194 | iface->result = 0; |
198 | iface->state = state_idle; | 195 | iface->state = state_idle; |
199 | outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); | 196 | outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); |
200 | } | 197 | } |
201 | 198 | ||
199 | *iface->ptr++ = inb(ACBSDA); | ||
200 | --iface->len; | ||
201 | |||
202 | break; | 202 | break; |
203 | 203 | ||
204 | case state_write: | 204 | case state_write: |
@@ -307,8 +307,12 @@ static s32 scx200_acb_smbus_xfer(struct i2c_adapter *adapter, | |||
307 | buffer = (u8 *)&cur_word; | 307 | buffer = (u8 *)&cur_word; |
308 | break; | 308 | break; |
309 | 309 | ||
310 | case I2C_SMBUS_BLOCK_DATA: | 310 | case I2C_SMBUS_I2C_BLOCK_DATA: |
311 | if (rw == I2C_SMBUS_READ) | ||
312 | data->block[0] = I2C_SMBUS_BLOCK_MAX; /* For now */ | ||
311 | len = data->block[0]; | 313 | len = data->block[0]; |
314 | if (len == 0 || len > I2C_SMBUS_BLOCK_MAX) | ||
315 | return -EINVAL; | ||
312 | buffer = &data->block[1]; | 316 | buffer = &data->block[1]; |
313 | break; | 317 | break; |
314 | 318 | ||
@@ -372,7 +376,7 @@ static u32 scx200_acb_func(struct i2c_adapter *adapter) | |||
372 | { | 376 | { |
373 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | | 377 | return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | |
374 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | | 378 | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | |
375 | I2C_FUNC_SMBUS_BLOCK_DATA; | 379 | I2C_FUNC_SMBUS_I2C_BLOCK; |
376 | } | 380 | } |
377 | 381 | ||
378 | /* For now, we only handle combined mode (smbus) */ | 382 | /* For now, we only handle combined mode (smbus) */ |
diff --git a/drivers/i2c/chips/pca9539.c b/drivers/i2c/chips/pca9539.c index 54b6e6a4beed..cb22280cdd27 100644 --- a/drivers/i2c/chips/pca9539.c +++ b/drivers/i2c/chips/pca9539.c | |||
@@ -134,11 +134,13 @@ static int pca9539_detect(struct i2c_adapter *adapter, int address, int kind) | |||
134 | new_client->driver = &pca9539_driver; | 134 | new_client->driver = &pca9539_driver; |
135 | new_client->flags = 0; | 135 | new_client->flags = 0; |
136 | 136 | ||
137 | /* Detection: the pca9539 only has 8 registers (0-7). | 137 | if (kind < 0) { |
138 | A read of 7 should succeed, but a read of 8 should fail. */ | 138 | /* Detection: the pca9539 only has 8 registers (0-7). |
139 | if ((i2c_smbus_read_byte_data(new_client, 7) < 0) || | 139 | A read of 7 should succeed, but a read of 8 should fail. */ |
140 | (i2c_smbus_read_byte_data(new_client, 8) >= 0)) | 140 | if ((i2c_smbus_read_byte_data(new_client, 7) < 0) || |
141 | goto exit_kfree; | 141 | (i2c_smbus_read_byte_data(new_client, 8) >= 0)) |
142 | goto exit_kfree; | ||
143 | } | ||
142 | 144 | ||
143 | strlcpy(new_client->name, "pca9539", I2C_NAME_SIZE); | 145 | strlcpy(new_client->name, "pca9539", I2C_NAME_SIZE); |
144 | 146 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index a45155f799d4..9cb277d6aa48 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -756,9 +756,9 @@ int i2c_probe(struct i2c_adapter *adapter, | |||
756 | "parameter for adapter %d, " | 756 | "parameter for adapter %d, " |
757 | "addr 0x%02x\n", adap_id, | 757 | "addr 0x%02x\n", adap_id, |
758 | address_data->ignore[j + 1]); | 758 | address_data->ignore[j + 1]); |
759 | ignore = 1; | ||
760 | break; | ||
759 | } | 761 | } |
760 | ignore = 1; | ||
761 | break; | ||
762 | } | 762 | } |
763 | if (ignore) | 763 | if (ignore) |
764 | continue; | 764 | continue; |
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index b7e459e4f284..602797a44208 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
@@ -146,16 +146,7 @@ static void ide_detach(struct pcmcia_device *link) | |||
146 | kfree(link->priv); | 146 | kfree(link->priv); |
147 | } /* ide_detach */ | 147 | } /* ide_detach */ |
148 | 148 | ||
149 | static void idecs_mmio_fixup(ide_hwif_t *hwif) | 149 | static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle) |
150 | { | ||
151 | default_hwif_mmiops(hwif); | ||
152 | hwif->mmio = 2; | ||
153 | |||
154 | ide_undecoded_slave(hwif); | ||
155 | } | ||
156 | |||
157 | static int idecs_register(unsigned long io, unsigned long ctl, | ||
158 | unsigned long irq, struct pcmcia_device *handle, int is_mmio) | ||
159 | { | 150 | { |
160 | hw_regs_t hw; | 151 | hw_regs_t hw; |
161 | memset(&hw, 0, sizeof(hw)); | 152 | memset(&hw, 0, sizeof(hw)); |
@@ -163,19 +154,7 @@ static int idecs_register(unsigned long io, unsigned long ctl, | |||
163 | hw.irq = irq; | 154 | hw.irq = irq; |
164 | hw.chipset = ide_pci; | 155 | hw.chipset = ide_pci; |
165 | hw.dev = &handle->dev; | 156 | hw.dev = &handle->dev; |
166 | 157 | return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave); | |
167 | if(is_mmio) | ||
168 | return ide_register_hw_with_fixup(&hw, NULL, idecs_mmio_fixup); | ||
169 | else | ||
170 | return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave); | ||
171 | } | ||
172 | |||
173 | void outb_io(unsigned char value, unsigned long port) { | ||
174 | outb(value, port); | ||
175 | } | ||
176 | |||
177 | void outb_mem(unsigned char value, unsigned long port) { | ||
178 | writeb(value, (void __iomem *) port); | ||
179 | } | 158 | } |
180 | 159 | ||
181 | /*====================================================================== | 160 | /*====================================================================== |
@@ -201,8 +180,7 @@ static int ide_config(struct pcmcia_device *link) | |||
201 | } *stk = NULL; | 180 | } *stk = NULL; |
202 | cistpl_cftable_entry_t *cfg; | 181 | cistpl_cftable_entry_t *cfg; |
203 | int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0; | 182 | int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0; |
204 | unsigned long io_base, ctl_base, is_mmio, try_slave; | 183 | unsigned long io_base, ctl_base; |
205 | void (*my_outb)(unsigned char, unsigned long); | ||
206 | 184 | ||
207 | DEBUG(0, "ide_config(0x%p)\n", link); | 185 | DEBUG(0, "ide_config(0x%p)\n", link); |
208 | 186 | ||
@@ -232,7 +210,7 @@ static int ide_config(struct pcmcia_device *link) | |||
232 | /* Not sure if this is right... look up the current Vcc */ | 210 | /* Not sure if this is right... look up the current Vcc */ |
233 | CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf)); | 211 | CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf)); |
234 | 212 | ||
235 | pass = io_base = ctl_base = is_mmio = try_slave = 0; | 213 | pass = io_base = ctl_base = 0; |
236 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | 214 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; |
237 | tuple.Attributes = 0; | 215 | tuple.Attributes = 0; |
238 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); | 216 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
@@ -280,45 +258,11 @@ static int ide_config(struct pcmcia_device *link) | |||
280 | goto next_entry; | 258 | goto next_entry; |
281 | io_base = link->io.BasePort1; | 259 | io_base = link->io.BasePort1; |
282 | ctl_base = link->io.BasePort1 + 0x0e; | 260 | ctl_base = link->io.BasePort1 + 0x0e; |
283 | |||
284 | if (io->win[0].len >= 0x20) | ||
285 | try_slave = 1; | ||
286 | |||
287 | } else goto next_entry; | 261 | } else goto next_entry; |
288 | /* If we've got this far, we're done */ | 262 | /* If we've got this far, we're done */ |
289 | break; | 263 | break; |
290 | } | 264 | } |
291 | 265 | ||
292 | if ((cfg->mem.nwin > 0) || (stk->dflt.mem.nwin > 0)) { | ||
293 | win_req_t req; | ||
294 | memreq_t map; | ||
295 | cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &stk->dflt.mem; | ||
296 | |||
297 | if (mem->win[0].len < 16) | ||
298 | goto next_entry; | ||
299 | |||
300 | req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM; | ||
301 | req.Attributes |= WIN_ENABLE; | ||
302 | req.Base = mem->win[0].host_addr; | ||
303 | req.Size = 0; | ||
304 | |||
305 | req.AccessSpeed = 0; | ||
306 | if (pcmcia_request_window(&link, &req, &link->win) != 0) | ||
307 | goto next_entry; | ||
308 | map.Page = 0; map.CardOffset = mem->win[0].card_addr; | ||
309 | if (pcmcia_map_mem_page(link->win, &map) != 0) | ||
310 | goto next_entry; | ||
311 | |||
312 | io_base = (unsigned long) ioremap(req.Base, req.Size); | ||
313 | ctl_base = io_base + 0x0e; | ||
314 | is_mmio = 1; | ||
315 | |||
316 | if (mem->win[0].len >= 0x20) | ||
317 | try_slave = 1; | ||
318 | |||
319 | break; | ||
320 | } | ||
321 | |||
322 | next_entry: | 266 | next_entry: |
323 | if (cfg->flags & CISTPL_CFTABLE_DEFAULT) | 267 | if (cfg->flags & CISTPL_CFTABLE_DEFAULT) |
324 | memcpy(&stk->dflt, cfg, sizeof(stk->dflt)); | 268 | memcpy(&stk->dflt, cfg, sizeof(stk->dflt)); |
@@ -334,26 +278,21 @@ static int ide_config(struct pcmcia_device *link) | |||
334 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | 278 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); |
335 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); | 279 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); |
336 | 280 | ||
337 | if(is_mmio) | ||
338 | my_outb = outb_mem; | ||
339 | else | ||
340 | my_outb = outb_io; | ||
341 | |||
342 | /* disable drive interrupts during IDE probe */ | 281 | /* disable drive interrupts during IDE probe */ |
343 | my_outb(0x02, ctl_base); | 282 | outb(0x02, ctl_base); |
344 | 283 | ||
345 | /* special setup for KXLC005 card */ | 284 | /* special setup for KXLC005 card */ |
346 | if (is_kme) | 285 | if (is_kme) |
347 | my_outb(0x81, ctl_base+1); | 286 | outb(0x81, ctl_base+1); |
348 | 287 | ||
349 | /* retry registration in case device is still spinning up */ | 288 | /* retry registration in case device is still spinning up */ |
350 | for (hd = -1, i = 0; i < 10; i++) { | 289 | for (hd = -1, i = 0; i < 10; i++) { |
351 | hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link, is_mmio); | 290 | hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); |
352 | if (hd >= 0) break; | 291 | if (hd >= 0) break; |
353 | if (try_slave) { | 292 | if (link->io.NumPorts1 == 0x20) { |
354 | my_outb(0x02, ctl_base + 0x10); | 293 | outb(0x02, ctl_base + 0x10); |
355 | hd = idecs_register(io_base + 0x10, ctl_base + 0x10, | 294 | hd = idecs_register(io_base + 0x10, ctl_base + 0x10, |
356 | link->irq.AssignedIRQ, link, is_mmio); | 295 | link->irq.AssignedIRQ, link); |
357 | if (hd >= 0) { | 296 | if (hd >= 0) { |
358 | io_base += 0x10; | 297 | io_base += 0x10; |
359 | ctl_base += 0x10; | 298 | ctl_base += 0x10; |
diff --git a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c index f82e82109728..2f962cfa3f7f 100644 --- a/drivers/ide/pci/generic.c +++ b/drivers/ide/pci/generic.c | |||
@@ -212,6 +212,9 @@ static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_devi | |||
212 | (!(PCI_FUNC(dev->devfn) & 1))) | 212 | (!(PCI_FUNC(dev->devfn) & 1))) |
213 | goto out; | 213 | goto out; |
214 | 214 | ||
215 | if (dev->vendor == PCI_VENDOR_ID_JMICRON && PCI_FUNC(dev->devfn) != 1) | ||
216 | goto out; | ||
217 | |||
215 | pci_read_config_word(dev, PCI_COMMAND, &command); | 218 | pci_read_config_word(dev, PCI_COMMAND, &command); |
216 | if (!(command & PCI_COMMAND_IO)) { | 219 | if (!(command & PCI_COMMAND_IO)) { |
217 | printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); | 220 | printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); |
@@ -239,6 +242,11 @@ static struct pci_device_id generic_pci_tbl[] = { | |||
239 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12}, | 242 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12}, |
240 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13}, | 243 | { PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13}, |
241 | { PCI_VENDOR_ID_NETCELL,PCI_DEVICE_ID_REVOLUTION, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14}, | 244 | { PCI_VENDOR_ID_NETCELL,PCI_DEVICE_ID_REVOLUTION, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14}, |
245 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15}, | ||
246 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16}, | ||
247 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17}, | ||
248 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18}, | ||
249 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19}, | ||
242 | /* Must come last. If you add entries adjust this table appropriately and the init_one code */ | 250 | /* Must come last. If you add entries adjust this table appropriately and the init_one code */ |
243 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0}, | 251 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0}, |
244 | { 0, }, | 252 | { 0, }, |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index d2150baa7e35..1428bb7715af 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -1916,7 +1916,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1916 | regs = ioremap(pciaddr, CP_REGS_SIZE); | 1916 | regs = ioremap(pciaddr, CP_REGS_SIZE); |
1917 | if (!regs) { | 1917 | if (!regs) { |
1918 | rc = -EIO; | 1918 | rc = -EIO; |
1919 | dev_err(&pdev->dev, "Cannot map PCI MMIO (%lx@%lx)\n", | 1919 | dev_err(&pdev->dev, "Cannot map PCI MMIO (%Lx@%Lx)\n", |
1920 | (unsigned long long)pci_resource_len(pdev, 1), | 1920 | (unsigned long long)pci_resource_len(pdev, 1), |
1921 | (unsigned long long)pciaddr); | 1921 | (unsigned long long)pciaddr); |
1922 | goto err_out_res; | 1922 | goto err_out_res; |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 6e7d31bacf4d..6d3d41934503 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -283,7 +283,7 @@ static int e1000_request_irq(struct e1000_adapter *adapter) | |||
283 | } | 283 | } |
284 | } | 284 | } |
285 | if (adapter->have_msi) | 285 | if (adapter->have_msi) |
286 | flags &= ~SA_SHIRQ; | 286 | flags &= ~IRQF_SHARED; |
287 | #endif | 287 | #endif |
288 | if ((err = request_irq(adapter->pdev->irq, &e1000_intr, flags, | 288 | if ((err = request_irq(adapter->pdev->irq, &e1000_intr, flags, |
289 | netdev->name, netdev))) | 289 | netdev->name, netdev))) |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index ad81ec68f887..11b8f1b43dd5 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -240,10 +240,12 @@ enum { | |||
240 | #define NVREG_RNDSEED_FORCE2 0x2d00 | 240 | #define NVREG_RNDSEED_FORCE2 0x2d00 |
241 | #define NVREG_RNDSEED_FORCE3 0x7400 | 241 | #define NVREG_RNDSEED_FORCE3 0x7400 |
242 | 242 | ||
243 | NvRegUnknownSetupReg1 = 0xA0, | 243 | NvRegTxDeferral = 0xA0, |
244 | #define NVREG_UNKSETUP1_VAL 0x16070f | 244 | #define NVREG_TX_DEFERRAL_DEFAULT 0x15050f |
245 | NvRegUnknownSetupReg2 = 0xA4, | 245 | #define NVREG_TX_DEFERRAL_RGMII_10_100 0x16070f |
246 | #define NVREG_UNKSETUP2_VAL 0x16 | 246 | #define NVREG_TX_DEFERRAL_RGMII_1000 0x14050f |
247 | NvRegRxDeferral = 0xA4, | ||
248 | #define NVREG_RX_DEFERRAL_DEFAULT 0x16 | ||
247 | NvRegMacAddrA = 0xA8, | 249 | NvRegMacAddrA = 0xA8, |
248 | NvRegMacAddrB = 0xAC, | 250 | NvRegMacAddrB = 0xAC, |
249 | NvRegMulticastAddrA = 0xB0, | 251 | NvRegMulticastAddrA = 0xB0, |
@@ -269,8 +271,10 @@ enum { | |||
269 | #define NVREG_LINKSPEED_MASK (0xFFF) | 271 | #define NVREG_LINKSPEED_MASK (0xFFF) |
270 | NvRegUnknownSetupReg5 = 0x130, | 272 | NvRegUnknownSetupReg5 = 0x130, |
271 | #define NVREG_UNKSETUP5_BIT31 (1<<31) | 273 | #define NVREG_UNKSETUP5_BIT31 (1<<31) |
272 | NvRegUnknownSetupReg3 = 0x13c, | 274 | NvRegTxWatermark = 0x13c, |
273 | #define NVREG_UNKSETUP3_VAL1 0x200010 | 275 | #define NVREG_TX_WM_DESC1_DEFAULT 0x0200010 |
276 | #define NVREG_TX_WM_DESC2_3_DEFAULT 0x1e08000 | ||
277 | #define NVREG_TX_WM_DESC2_3_1000 0xfe08000 | ||
274 | NvRegTxRxControl = 0x144, | 278 | NvRegTxRxControl = 0x144, |
275 | #define NVREG_TXRXCTL_KICK 0x0001 | 279 | #define NVREG_TXRXCTL_KICK 0x0001 |
276 | #define NVREG_TXRXCTL_BIT1 0x0002 | 280 | #define NVREG_TXRXCTL_BIT1 0x0002 |
@@ -658,7 +662,7 @@ static const struct register_test nv_registers_test[] = { | |||
658 | { NvRegMisc1, 0x03c }, | 662 | { NvRegMisc1, 0x03c }, |
659 | { NvRegOffloadConfig, 0x03ff }, | 663 | { NvRegOffloadConfig, 0x03ff }, |
660 | { NvRegMulticastAddrA, 0xffffffff }, | 664 | { NvRegMulticastAddrA, 0xffffffff }, |
661 | { NvRegUnknownSetupReg3, 0x0ff }, | 665 | { NvRegTxWatermark, 0x0ff }, |
662 | { NvRegWakeUpFlags, 0x07777 }, | 666 | { NvRegWakeUpFlags, 0x07777 }, |
663 | { 0,0 } | 667 | { 0,0 } |
664 | }; | 668 | }; |
@@ -2127,7 +2131,7 @@ static int nv_update_linkspeed(struct net_device *dev) | |||
2127 | int newdup = np->duplex; | 2131 | int newdup = np->duplex; |
2128 | int mii_status; | 2132 | int mii_status; |
2129 | int retval = 0; | 2133 | int retval = 0; |
2130 | u32 control_1000, status_1000, phyreg, pause_flags; | 2134 | u32 control_1000, status_1000, phyreg, pause_flags, txreg; |
2131 | 2135 | ||
2132 | /* BMSR_LSTATUS is latched, read it twice: | 2136 | /* BMSR_LSTATUS is latched, read it twice: |
2133 | * we want the current value. | 2137 | * we want the current value. |
@@ -2245,6 +2249,26 @@ set_speed: | |||
2245 | phyreg |= PHY_1000; | 2249 | phyreg |= PHY_1000; |
2246 | writel(phyreg, base + NvRegPhyInterface); | 2250 | writel(phyreg, base + NvRegPhyInterface); |
2247 | 2251 | ||
2252 | if (phyreg & PHY_RGMII) { | ||
2253 | if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) | ||
2254 | txreg = NVREG_TX_DEFERRAL_RGMII_1000; | ||
2255 | else | ||
2256 | txreg = NVREG_TX_DEFERRAL_RGMII_10_100; | ||
2257 | } else { | ||
2258 | txreg = NVREG_TX_DEFERRAL_DEFAULT; | ||
2259 | } | ||
2260 | writel(txreg, base + NvRegTxDeferral); | ||
2261 | |||
2262 | if (np->desc_ver == DESC_VER_1) { | ||
2263 | txreg = NVREG_TX_WM_DESC1_DEFAULT; | ||
2264 | } else { | ||
2265 | if ((np->linkspeed & NVREG_LINKSPEED_MASK) == NVREG_LINKSPEED_1000) | ||
2266 | txreg = NVREG_TX_WM_DESC2_3_1000; | ||
2267 | else | ||
2268 | txreg = NVREG_TX_WM_DESC2_3_DEFAULT; | ||
2269 | } | ||
2270 | writel(txreg, base + NvRegTxWatermark); | ||
2271 | |||
2248 | writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD), | 2272 | writel(NVREG_MISC1_FORCE | ( np->duplex ? 0 : NVREG_MISC1_HD), |
2249 | base + NvRegMisc1); | 2273 | base + NvRegMisc1); |
2250 | pci_push(base); | 2274 | pci_push(base); |
@@ -3910,7 +3934,10 @@ static int nv_open(struct net_device *dev) | |||
3910 | 3934 | ||
3911 | /* 5) continue setup */ | 3935 | /* 5) continue setup */ |
3912 | writel(np->linkspeed, base + NvRegLinkSpeed); | 3936 | writel(np->linkspeed, base + NvRegLinkSpeed); |
3913 | writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); | 3937 | if (np->desc_ver == DESC_VER_1) |
3938 | writel(NVREG_TX_WM_DESC1_DEFAULT, base + NvRegTxWatermark); | ||
3939 | else | ||
3940 | writel(NVREG_TX_WM_DESC2_3_DEFAULT, base + NvRegTxWatermark); | ||
3914 | writel(np->txrxctl_bits, base + NvRegTxRxControl); | 3941 | writel(np->txrxctl_bits, base + NvRegTxRxControl); |
3915 | writel(np->vlanctl_bits, base + NvRegVlanControl); | 3942 | writel(np->vlanctl_bits, base + NvRegVlanControl); |
3916 | pci_push(base); | 3943 | pci_push(base); |
@@ -3932,8 +3959,8 @@ static int nv_open(struct net_device *dev) | |||
3932 | writel(readl(base + NvRegReceiverStatus), base + NvRegReceiverStatus); | 3959 | writel(readl(base + NvRegReceiverStatus), base + NvRegReceiverStatus); |
3933 | get_random_bytes(&i, sizeof(i)); | 3960 | get_random_bytes(&i, sizeof(i)); |
3934 | writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed); | 3961 | writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed); |
3935 | writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1); | 3962 | writel(NVREG_TX_DEFERRAL_DEFAULT, base + NvRegTxDeferral); |
3936 | writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2); | 3963 | writel(NVREG_RX_DEFERRAL_DEFAULT, base + NvRegRxDeferral); |
3937 | if (poll_interval == -1) { | 3964 | if (poll_interval == -1) { |
3938 | if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) | 3965 | if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) |
3939 | writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval); | 3966 | writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval); |
diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index a4674044bd6f..2eff45bedc7c 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c | |||
@@ -2353,7 +2353,7 @@ static int __init smsc_superio_lpc(unsigned short cfg_base) | |||
2353 | #ifdef CONFIG_PCI | 2353 | #ifdef CONFIG_PCI |
2354 | #define PCIID_VENDOR_INTEL 0x8086 | 2354 | #define PCIID_VENDOR_INTEL 0x8086 |
2355 | #define PCIID_VENDOR_ALI 0x10b9 | 2355 | #define PCIID_VENDOR_ALI 0x10b9 |
2356 | static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __devinitdata = { | 2356 | static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = { |
2357 | { | 2357 | { |
2358 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ | 2358 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ |
2359 | .device = 0x24cc, | 2359 | .device = 0x24cc, |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 7eb08d929139..7bbd447289b5 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -1281,7 +1281,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, | |||
1281 | 1281 | ||
1282 | while(len) { | 1282 | while(len) { |
1283 | buffer_info = &tx_ring->buffer_info[i]; | 1283 | buffer_info = &tx_ring->buffer_info[i]; |
1284 | size = min(len, IXGB_MAX_JUMBO_FRAME_SIZE); | 1284 | size = min(len, IXGB_MAX_DATA_PER_TXD); |
1285 | buffer_info->length = size; | 1285 | buffer_info->length = size; |
1286 | buffer_info->dma = | 1286 | buffer_info->dma = |
1287 | pci_map_single(adapter->pdev, | 1287 | pci_map_single(adapter->pdev, |
@@ -1306,7 +1306,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb, | |||
1306 | 1306 | ||
1307 | while(len) { | 1307 | while(len) { |
1308 | buffer_info = &tx_ring->buffer_info[i]; | 1308 | buffer_info = &tx_ring->buffer_info[i]; |
1309 | size = min(len, IXGB_MAX_JUMBO_FRAME_SIZE); | 1309 | size = min(len, IXGB_MAX_DATA_PER_TXD); |
1310 | buffer_info->length = size; | 1310 | buffer_info->length = size; |
1311 | buffer_info->dma = | 1311 | buffer_info->dma = |
1312 | pci_map_page(adapter->pdev, | 1312 | pci_map_page(adapter->pdev, |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index ee1de971a712..07ca9480a6fe 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -2412,14 +2412,20 @@ static int myri10ge_resume(struct pci_dev *pdev) | |||
2412 | return -EIO; | 2412 | return -EIO; |
2413 | } | 2413 | } |
2414 | myri10ge_restore_state(mgp); | 2414 | myri10ge_restore_state(mgp); |
2415 | pci_enable_device(pdev); | 2415 | |
2416 | status = pci_enable_device(pdev); | ||
2417 | if (status < 0) { | ||
2418 | dev_err(&pdev->dev, "failed to enable device\n"); | ||
2419 | return -EIO; | ||
2420 | } | ||
2421 | |||
2416 | pci_set_master(pdev); | 2422 | pci_set_master(pdev); |
2417 | 2423 | ||
2418 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, | 2424 | status = request_irq(pdev->irq, myri10ge_intr, IRQF_SHARED, |
2419 | netdev->name, mgp); | 2425 | netdev->name, mgp); |
2420 | if (status != 0) { | 2426 | if (status != 0) { |
2421 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); | 2427 | dev_err(&pdev->dev, "failed to allocate IRQ\n"); |
2422 | goto abort_with_msi; | 2428 | goto abort_with_enabled; |
2423 | } | 2429 | } |
2424 | 2430 | ||
2425 | myri10ge_reset(mgp); | 2431 | myri10ge_reset(mgp); |
@@ -2438,7 +2444,8 @@ static int myri10ge_resume(struct pci_dev *pdev) | |||
2438 | 2444 | ||
2439 | return 0; | 2445 | return 0; |
2440 | 2446 | ||
2441 | abort_with_msi: | 2447 | abort_with_enabled: |
2448 | pci_disable_device(pdev); | ||
2442 | return -EIO; | 2449 | return -EIO; |
2443 | 2450 | ||
2444 | } | 2451 | } |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index c6b77acb35ef..e1fe3a0a7b0b 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -1976,7 +1976,6 @@ static int start_nic(struct s2io_nic *nic) | |||
1976 | XENA_dev_config_t __iomem *bar0 = nic->bar0; | 1976 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
1977 | struct net_device *dev = nic->dev; | 1977 | struct net_device *dev = nic->dev; |
1978 | register u64 val64 = 0; | 1978 | register u64 val64 = 0; |
1979 | u16 interruptible; | ||
1980 | u16 subid, i; | 1979 | u16 subid, i; |
1981 | mac_info_t *mac_control; | 1980 | mac_info_t *mac_control; |
1982 | struct config_param *config; | 1981 | struct config_param *config; |
@@ -2047,16 +2046,6 @@ static int start_nic(struct s2io_nic *nic) | |||
2047 | return FAILURE; | 2046 | return FAILURE; |
2048 | } | 2047 | } |
2049 | 2048 | ||
2050 | /* Enable select interrupts */ | ||
2051 | if (nic->intr_type != INTA) | ||
2052 | en_dis_able_nic_intrs(nic, ENA_ALL_INTRS, DISABLE_INTRS); | ||
2053 | else { | ||
2054 | interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR; | ||
2055 | interruptible |= TX_PIC_INTR | RX_PIC_INTR; | ||
2056 | interruptible |= TX_MAC_INTR | RX_MAC_INTR; | ||
2057 | en_dis_able_nic_intrs(nic, interruptible, ENABLE_INTRS); | ||
2058 | } | ||
2059 | |||
2060 | /* | 2049 | /* |
2061 | * With some switches, link might be already up at this point. | 2050 | * With some switches, link might be already up at this point. |
2062 | * Because of this weird behavior, when we enable laser, | 2051 | * Because of this weird behavior, when we enable laser, |
@@ -3749,101 +3738,19 @@ static int s2io_open(struct net_device *dev) | |||
3749 | if (err) { | 3738 | if (err) { |
3750 | DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", | 3739 | DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", |
3751 | dev->name); | 3740 | dev->name); |
3752 | if (err == -ENODEV) | 3741 | goto hw_init_failed; |
3753 | goto hw_init_failed; | ||
3754 | else | ||
3755 | goto hw_enable_failed; | ||
3756 | } | ||
3757 | |||
3758 | /* Store the values of the MSIX table in the nic_t structure */ | ||
3759 | store_xmsi_data(sp); | ||
3760 | |||
3761 | /* After proper initialization of H/W, register ISR */ | ||
3762 | if (sp->intr_type == MSI) { | ||
3763 | err = request_irq((int) sp->pdev->irq, s2io_msi_handle, | ||
3764 | IRQF_SHARED, sp->name, dev); | ||
3765 | if (err) { | ||
3766 | DBG_PRINT(ERR_DBG, "%s: MSI registration \ | ||
3767 | failed\n", dev->name); | ||
3768 | goto isr_registration_failed; | ||
3769 | } | ||
3770 | } | ||
3771 | if (sp->intr_type == MSI_X) { | ||
3772 | int i; | ||
3773 | |||
3774 | for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) { | ||
3775 | if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) { | ||
3776 | sprintf(sp->desc1, "%s:MSI-X-%d-TX", | ||
3777 | dev->name, i); | ||
3778 | err = request_irq(sp->entries[i].vector, | ||
3779 | s2io_msix_fifo_handle, 0, sp->desc1, | ||
3780 | sp->s2io_entries[i].arg); | ||
3781 | DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc1, | ||
3782 | (unsigned long long)sp->msix_info[i].addr); | ||
3783 | } else { | ||
3784 | sprintf(sp->desc2, "%s:MSI-X-%d-RX", | ||
3785 | dev->name, i); | ||
3786 | err = request_irq(sp->entries[i].vector, | ||
3787 | s2io_msix_ring_handle, 0, sp->desc2, | ||
3788 | sp->s2io_entries[i].arg); | ||
3789 | DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc2, | ||
3790 | (unsigned long long)sp->msix_info[i].addr); | ||
3791 | } | ||
3792 | if (err) { | ||
3793 | DBG_PRINT(ERR_DBG, "%s: MSI-X-%d registration \ | ||
3794 | failed\n", dev->name, i); | ||
3795 | DBG_PRINT(ERR_DBG, "Returned: %d\n", err); | ||
3796 | goto isr_registration_failed; | ||
3797 | } | ||
3798 | sp->s2io_entries[i].in_use = MSIX_REGISTERED_SUCCESS; | ||
3799 | } | ||
3800 | } | ||
3801 | if (sp->intr_type == INTA) { | ||
3802 | err = request_irq((int) sp->pdev->irq, s2io_isr, IRQF_SHARED, | ||
3803 | sp->name, dev); | ||
3804 | if (err) { | ||
3805 | DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n", | ||
3806 | dev->name); | ||
3807 | goto isr_registration_failed; | ||
3808 | } | ||
3809 | } | 3742 | } |
3810 | 3743 | ||
3811 | if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) { | 3744 | if (s2io_set_mac_addr(dev, dev->dev_addr) == FAILURE) { |
3812 | DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n"); | 3745 | DBG_PRINT(ERR_DBG, "Set Mac Address Failed\n"); |
3746 | s2io_card_down(sp); | ||
3813 | err = -ENODEV; | 3747 | err = -ENODEV; |
3814 | goto setting_mac_address_failed; | 3748 | goto hw_init_failed; |
3815 | } | 3749 | } |
3816 | 3750 | ||
3817 | netif_start_queue(dev); | 3751 | netif_start_queue(dev); |
3818 | return 0; | 3752 | return 0; |
3819 | 3753 | ||
3820 | setting_mac_address_failed: | ||
3821 | if (sp->intr_type != MSI_X) | ||
3822 | free_irq(sp->pdev->irq, dev); | ||
3823 | isr_registration_failed: | ||
3824 | del_timer_sync(&sp->alarm_timer); | ||
3825 | if (sp->intr_type == MSI_X) { | ||
3826 | int i; | ||
3827 | u16 msi_control; /* Temp variable */ | ||
3828 | |||
3829 | for (i=1; (sp->s2io_entries[i].in_use == | ||
3830 | MSIX_REGISTERED_SUCCESS); i++) { | ||
3831 | int vector = sp->entries[i].vector; | ||
3832 | void *arg = sp->s2io_entries[i].arg; | ||
3833 | |||
3834 | free_irq(vector, arg); | ||
3835 | } | ||
3836 | pci_disable_msix(sp->pdev); | ||
3837 | |||
3838 | /* Temp */ | ||
3839 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | ||
3840 | msi_control &= 0xFFFE; /* Disable MSI */ | ||
3841 | pci_write_config_word(sp->pdev, 0x42, msi_control); | ||
3842 | } | ||
3843 | else if (sp->intr_type == MSI) | ||
3844 | pci_disable_msi(sp->pdev); | ||
3845 | hw_enable_failed: | ||
3846 | s2io_reset(sp); | ||
3847 | hw_init_failed: | 3754 | hw_init_failed: |
3848 | if (sp->intr_type == MSI_X) { | 3755 | if (sp->intr_type == MSI_X) { |
3849 | if (sp->entries) | 3756 | if (sp->entries) |
@@ -3874,7 +3781,7 @@ static int s2io_close(struct net_device *dev) | |||
3874 | flush_scheduled_work(); | 3781 | flush_scheduled_work(); |
3875 | netif_stop_queue(dev); | 3782 | netif_stop_queue(dev); |
3876 | /* Reset card, kill tasklet and free Tx and Rx buffers. */ | 3783 | /* Reset card, kill tasklet and free Tx and Rx buffers. */ |
3877 | s2io_card_down(sp, 1); | 3784 | s2io_card_down(sp); |
3878 | 3785 | ||
3879 | sp->device_close_flag = TRUE; /* Device is shut down. */ | 3786 | sp->device_close_flag = TRUE; /* Device is shut down. */ |
3880 | return 0; | 3787 | return 0; |
@@ -5919,7 +5826,7 @@ static int s2io_change_mtu(struct net_device *dev, int new_mtu) | |||
5919 | 5826 | ||
5920 | dev->mtu = new_mtu; | 5827 | dev->mtu = new_mtu; |
5921 | if (netif_running(dev)) { | 5828 | if (netif_running(dev)) { |
5922 | s2io_card_down(sp, 0); | 5829 | s2io_card_down(sp); |
5923 | netif_stop_queue(dev); | 5830 | netif_stop_queue(dev); |
5924 | if (s2io_card_up(sp)) { | 5831 | if (s2io_card_up(sp)) { |
5925 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", | 5832 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", |
@@ -6216,43 +6123,106 @@ static int rxd_owner_bit_reset(nic_t *sp) | |||
6216 | 6123 | ||
6217 | } | 6124 | } |
6218 | 6125 | ||
6219 | static void s2io_card_down(nic_t * sp, int flag) | 6126 | static int s2io_add_isr(nic_t * sp) |
6220 | { | 6127 | { |
6221 | int cnt = 0; | 6128 | int ret = 0; |
6222 | XENA_dev_config_t __iomem *bar0 = sp->bar0; | ||
6223 | unsigned long flags; | ||
6224 | register u64 val64 = 0; | ||
6225 | struct net_device *dev = sp->dev; | 6129 | struct net_device *dev = sp->dev; |
6130 | int err = 0; | ||
6226 | 6131 | ||
6227 | del_timer_sync(&sp->alarm_timer); | 6132 | if (sp->intr_type == MSI) |
6228 | /* If s2io_set_link task is executing, wait till it completes. */ | 6133 | ret = s2io_enable_msi(sp); |
6229 | while (test_and_set_bit(0, &(sp->link_state))) { | 6134 | else if (sp->intr_type == MSI_X) |
6230 | msleep(50); | 6135 | ret = s2io_enable_msi_x(sp); |
6136 | if (ret) { | ||
6137 | DBG_PRINT(ERR_DBG, "%s: Defaulting to INTA\n", dev->name); | ||
6138 | sp->intr_type = INTA; | ||
6231 | } | 6139 | } |
6232 | atomic_set(&sp->card_state, CARD_DOWN); | ||
6233 | 6140 | ||
6234 | /* disable Tx and Rx traffic on the NIC */ | 6141 | /* Store the values of the MSIX table in the nic_t structure */ |
6235 | stop_nic(sp); | 6142 | store_xmsi_data(sp); |
6236 | if (flag) { | ||
6237 | if (sp->intr_type == MSI_X) { | ||
6238 | int i; | ||
6239 | u16 msi_control; | ||
6240 | 6143 | ||
6241 | for (i=1; (sp->s2io_entries[i].in_use == | 6144 | /* After proper initialization of H/W, register ISR */ |
6242 | MSIX_REGISTERED_SUCCESS); i++) { | 6145 | if (sp->intr_type == MSI) { |
6243 | int vector = sp->entries[i].vector; | 6146 | err = request_irq((int) sp->pdev->irq, s2io_msi_handle, |
6244 | void *arg = sp->s2io_entries[i].arg; | 6147 | IRQF_SHARED, sp->name, dev); |
6148 | if (err) { | ||
6149 | pci_disable_msi(sp->pdev); | ||
6150 | DBG_PRINT(ERR_DBG, "%s: MSI registration failed\n", | ||
6151 | dev->name); | ||
6152 | return -1; | ||
6153 | } | ||
6154 | } | ||
6155 | if (sp->intr_type == MSI_X) { | ||
6156 | int i; | ||
6245 | 6157 | ||
6246 | free_irq(vector, arg); | 6158 | for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) { |
6159 | if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) { | ||
6160 | sprintf(sp->desc[i], "%s:MSI-X-%d-TX", | ||
6161 | dev->name, i); | ||
6162 | err = request_irq(sp->entries[i].vector, | ||
6163 | s2io_msix_fifo_handle, 0, sp->desc[i], | ||
6164 | sp->s2io_entries[i].arg); | ||
6165 | DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc[i], | ||
6166 | (unsigned long long)sp->msix_info[i].addr); | ||
6167 | } else { | ||
6168 | sprintf(sp->desc[i], "%s:MSI-X-%d-RX", | ||
6169 | dev->name, i); | ||
6170 | err = request_irq(sp->entries[i].vector, | ||
6171 | s2io_msix_ring_handle, 0, sp->desc[i], | ||
6172 | sp->s2io_entries[i].arg); | ||
6173 | DBG_PRINT(ERR_DBG, "%s @ 0x%llx\n", sp->desc[i], | ||
6174 | (unsigned long long)sp->msix_info[i].addr); | ||
6247 | } | 6175 | } |
6248 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | 6176 | if (err) { |
6249 | msi_control &= 0xFFFE; /* Disable MSI */ | 6177 | DBG_PRINT(ERR_DBG,"%s:MSI-X-%d registration " |
6250 | pci_write_config_word(sp->pdev, 0x42, msi_control); | 6178 | "failed\n", dev->name, i); |
6251 | pci_disable_msix(sp->pdev); | 6179 | DBG_PRINT(ERR_DBG, "Returned: %d\n", err); |
6252 | } else { | 6180 | return -1; |
6253 | free_irq(sp->pdev->irq, dev); | 6181 | } |
6254 | if (sp->intr_type == MSI) | 6182 | sp->s2io_entries[i].in_use = MSIX_REGISTERED_SUCCESS; |
6255 | pci_disable_msi(sp->pdev); | 6183 | } |
6184 | } | ||
6185 | if (sp->intr_type == INTA) { | ||
6186 | err = request_irq((int) sp->pdev->irq, s2io_isr, IRQF_SHARED, | ||
6187 | sp->name, dev); | ||
6188 | if (err) { | ||
6189 | DBG_PRINT(ERR_DBG, "%s: ISR registration failed\n", | ||
6190 | dev->name); | ||
6191 | return -1; | ||
6192 | } | ||
6193 | } | ||
6194 | return 0; | ||
6195 | } | ||
6196 | static void s2io_rem_isr(nic_t * sp) | ||
6197 | { | ||
6198 | int cnt = 0; | ||
6199 | struct net_device *dev = sp->dev; | ||
6200 | |||
6201 | if (sp->intr_type == MSI_X) { | ||
6202 | int i; | ||
6203 | u16 msi_control; | ||
6204 | |||
6205 | for (i=1; (sp->s2io_entries[i].in_use == | ||
6206 | MSIX_REGISTERED_SUCCESS); i++) { | ||
6207 | int vector = sp->entries[i].vector; | ||
6208 | void *arg = sp->s2io_entries[i].arg; | ||
6209 | |||
6210 | free_irq(vector, arg); | ||
6211 | } | ||
6212 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | ||
6213 | msi_control &= 0xFFFE; /* Disable MSI */ | ||
6214 | pci_write_config_word(sp->pdev, 0x42, msi_control); | ||
6215 | |||
6216 | pci_disable_msix(sp->pdev); | ||
6217 | } else { | ||
6218 | free_irq(sp->pdev->irq, dev); | ||
6219 | if (sp->intr_type == MSI) { | ||
6220 | u16 val; | ||
6221 | |||
6222 | pci_disable_msi(sp->pdev); | ||
6223 | pci_read_config_word(sp->pdev, 0x4c, &val); | ||
6224 | val ^= 0x1; | ||
6225 | pci_write_config_word(sp->pdev, 0x4c, val); | ||
6256 | } | 6226 | } |
6257 | } | 6227 | } |
6258 | /* Waiting till all Interrupt handlers are complete */ | 6228 | /* Waiting till all Interrupt handlers are complete */ |
@@ -6263,6 +6233,26 @@ static void s2io_card_down(nic_t * sp, int flag) | |||
6263 | break; | 6233 | break; |
6264 | cnt++; | 6234 | cnt++; |
6265 | } while(cnt < 5); | 6235 | } while(cnt < 5); |
6236 | } | ||
6237 | |||
6238 | static void s2io_card_down(nic_t * sp) | ||
6239 | { | ||
6240 | int cnt = 0; | ||
6241 | XENA_dev_config_t __iomem *bar0 = sp->bar0; | ||
6242 | unsigned long flags; | ||
6243 | register u64 val64 = 0; | ||
6244 | |||
6245 | del_timer_sync(&sp->alarm_timer); | ||
6246 | /* If s2io_set_link task is executing, wait till it completes. */ | ||
6247 | while (test_and_set_bit(0, &(sp->link_state))) { | ||
6248 | msleep(50); | ||
6249 | } | ||
6250 | atomic_set(&sp->card_state, CARD_DOWN); | ||
6251 | |||
6252 | /* disable Tx and Rx traffic on the NIC */ | ||
6253 | stop_nic(sp); | ||
6254 | |||
6255 | s2io_rem_isr(sp); | ||
6266 | 6256 | ||
6267 | /* Kill tasklet. */ | 6257 | /* Kill tasklet. */ |
6268 | tasklet_kill(&sp->task); | 6258 | tasklet_kill(&sp->task); |
@@ -6314,23 +6304,16 @@ static int s2io_card_up(nic_t * sp) | |||
6314 | mac_info_t *mac_control; | 6304 | mac_info_t *mac_control; |
6315 | struct config_param *config; | 6305 | struct config_param *config; |
6316 | struct net_device *dev = (struct net_device *) sp->dev; | 6306 | struct net_device *dev = (struct net_device *) sp->dev; |
6307 | u16 interruptible; | ||
6317 | 6308 | ||
6318 | /* Initialize the H/W I/O registers */ | 6309 | /* Initialize the H/W I/O registers */ |
6319 | if (init_nic(sp) != 0) { | 6310 | if (init_nic(sp) != 0) { |
6320 | DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", | 6311 | DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", |
6321 | dev->name); | 6312 | dev->name); |
6313 | s2io_reset(sp); | ||
6322 | return -ENODEV; | 6314 | return -ENODEV; |
6323 | } | 6315 | } |
6324 | 6316 | ||
6325 | if (sp->intr_type == MSI) | ||
6326 | ret = s2io_enable_msi(sp); | ||
6327 | else if (sp->intr_type == MSI_X) | ||
6328 | ret = s2io_enable_msi_x(sp); | ||
6329 | if (ret) { | ||
6330 | DBG_PRINT(ERR_DBG, "%s: Defaulting to INTA\n", dev->name); | ||
6331 | sp->intr_type = INTA; | ||
6332 | } | ||
6333 | |||
6334 | /* | 6317 | /* |
6335 | * Initializing the Rx buffers. For now we are considering only 1 | 6318 | * Initializing the Rx buffers. For now we are considering only 1 |
6336 | * Rx ring and initializing buffers into 30 Rx blocks | 6319 | * Rx ring and initializing buffers into 30 Rx blocks |
@@ -6361,21 +6344,39 @@ static int s2io_card_up(nic_t * sp) | |||
6361 | sp->lro_max_aggr_per_sess = lro_max_pkts; | 6344 | sp->lro_max_aggr_per_sess = lro_max_pkts; |
6362 | } | 6345 | } |
6363 | 6346 | ||
6364 | /* Enable tasklet for the device */ | ||
6365 | tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); | ||
6366 | |||
6367 | /* Enable Rx Traffic and interrupts on the NIC */ | 6347 | /* Enable Rx Traffic and interrupts on the NIC */ |
6368 | if (start_nic(sp)) { | 6348 | if (start_nic(sp)) { |
6369 | DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name); | 6349 | DBG_PRINT(ERR_DBG, "%s: Starting NIC failed\n", dev->name); |
6370 | tasklet_kill(&sp->task); | ||
6371 | s2io_reset(sp); | 6350 | s2io_reset(sp); |
6372 | free_irq(dev->irq, dev); | 6351 | free_rx_buffers(sp); |
6352 | return -ENODEV; | ||
6353 | } | ||
6354 | |||
6355 | /* Add interrupt service routine */ | ||
6356 | if (s2io_add_isr(sp) != 0) { | ||
6357 | if (sp->intr_type == MSI_X) | ||
6358 | s2io_rem_isr(sp); | ||
6359 | s2io_reset(sp); | ||
6373 | free_rx_buffers(sp); | 6360 | free_rx_buffers(sp); |
6374 | return -ENODEV; | 6361 | return -ENODEV; |
6375 | } | 6362 | } |
6376 | 6363 | ||
6377 | S2IO_TIMER_CONF(sp->alarm_timer, s2io_alarm_handle, sp, (HZ/2)); | 6364 | S2IO_TIMER_CONF(sp->alarm_timer, s2io_alarm_handle, sp, (HZ/2)); |
6378 | 6365 | ||
6366 | /* Enable tasklet for the device */ | ||
6367 | tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); | ||
6368 | |||
6369 | /* Enable select interrupts */ | ||
6370 | if (sp->intr_type != INTA) | ||
6371 | en_dis_able_nic_intrs(sp, ENA_ALL_INTRS, DISABLE_INTRS); | ||
6372 | else { | ||
6373 | interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR; | ||
6374 | interruptible |= TX_PIC_INTR | RX_PIC_INTR; | ||
6375 | interruptible |= TX_MAC_INTR | RX_MAC_INTR; | ||
6376 | en_dis_able_nic_intrs(sp, interruptible, ENABLE_INTRS); | ||
6377 | } | ||
6378 | |||
6379 | |||
6379 | atomic_set(&sp->card_state, CARD_UP); | 6380 | atomic_set(&sp->card_state, CARD_UP); |
6380 | return 0; | 6381 | return 0; |
6381 | } | 6382 | } |
@@ -6395,7 +6396,7 @@ static void s2io_restart_nic(unsigned long data) | |||
6395 | struct net_device *dev = (struct net_device *) data; | 6396 | struct net_device *dev = (struct net_device *) data; |
6396 | nic_t *sp = dev->priv; | 6397 | nic_t *sp = dev->priv; |
6397 | 6398 | ||
6398 | s2io_card_down(sp, 0); | 6399 | s2io_card_down(sp); |
6399 | if (s2io_card_up(sp)) { | 6400 | if (s2io_card_up(sp)) { |
6400 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", | 6401 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", |
6401 | dev->name); | 6402 | dev->name); |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index c43f52179708..217097bc22f1 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
@@ -829,8 +829,7 @@ struct s2io_nic { | |||
829 | #define MSIX_FLG 0xA5 | 829 | #define MSIX_FLG 0xA5 |
830 | struct msix_entry *entries; | 830 | struct msix_entry *entries; |
831 | struct s2io_msix_entry *s2io_entries; | 831 | struct s2io_msix_entry *s2io_entries; |
832 | char desc1[35]; | 832 | char desc[MAX_REQUESTED_MSI_X][25]; |
833 | char desc2[35]; | ||
834 | 833 | ||
835 | int avail_msix_vectors; /* No. of MSI-X vectors granted by system */ | 834 | int avail_msix_vectors; /* No. of MSI-X vectors granted by system */ |
836 | 835 | ||
@@ -1002,7 +1001,7 @@ static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag); | |||
1002 | static struct ethtool_ops netdev_ethtool_ops; | 1001 | static struct ethtool_ops netdev_ethtool_ops; |
1003 | static void s2io_set_link(unsigned long data); | 1002 | static void s2io_set_link(unsigned long data); |
1004 | static int s2io_set_swapper(nic_t * sp); | 1003 | static int s2io_set_swapper(nic_t * sp); |
1005 | static void s2io_card_down(nic_t *nic, int flag); | 1004 | static void s2io_card_down(nic_t *nic); |
1006 | static int s2io_card_up(nic_t *nic); | 1005 | static int s2io_card_up(nic_t *nic); |
1007 | static int get_xena_rev_id(struct pci_dev *pdev); | 1006 | static int get_xena_rev_id(struct pci_dev *pdev); |
1008 | static void restore_xmsi_data(nic_t *nic); | 1007 | static void restore_xmsi_data(nic_t *nic); |
diff --git a/drivers/net/sk98lin/h/xmac_ii.h b/drivers/net/sk98lin/h/xmac_ii.h index 2b19f8ad0318..7f8e6d0084c7 100644 --- a/drivers/net/sk98lin/h/xmac_ii.h +++ b/drivers/net/sk98lin/h/xmac_ii.h | |||
@@ -1473,7 +1473,7 @@ extern "C" { | |||
1473 | #define GM_TXCR_FORCE_JAM (1<<15) /* Bit 15: Force Jam / Flow-Control */ | 1473 | #define GM_TXCR_FORCE_JAM (1<<15) /* Bit 15: Force Jam / Flow-Control */ |
1474 | #define GM_TXCR_CRC_DIS (1<<14) /* Bit 14: Disable insertion of CRC */ | 1474 | #define GM_TXCR_CRC_DIS (1<<14) /* Bit 14: Disable insertion of CRC */ |
1475 | #define GM_TXCR_PAD_DIS (1<<13) /* Bit 13: Disable padding of packets */ | 1475 | #define GM_TXCR_PAD_DIS (1<<13) /* Bit 13: Disable padding of packets */ |
1476 | #define GM_TXCR_COL_THR_MSK (1<<10) /* Bit 12..10: Collision Threshold */ | 1476 | #define GM_TXCR_COL_THR_MSK (7<<10) /* Bit 12..10: Collision Threshold */ |
1477 | 1477 | ||
1478 | #define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK) | 1478 | #define TX_COL_THR(x) (SHIFT10(x) & GM_TXCR_COL_THR_MSK) |
1479 | 1479 | ||
diff --git a/drivers/net/skge.h b/drivers/net/skge.h index ed19ff47ce11..593387b3c0dd 100644 --- a/drivers/net/skge.h +++ b/drivers/net/skge.h | |||
@@ -1734,11 +1734,11 @@ enum { | |||
1734 | GM_TXCR_FORCE_JAM = 1<<15, /* Bit 15: Force Jam / Flow-Control */ | 1734 | GM_TXCR_FORCE_JAM = 1<<15, /* Bit 15: Force Jam / Flow-Control */ |
1735 | GM_TXCR_CRC_DIS = 1<<14, /* Bit 14: Disable insertion of CRC */ | 1735 | GM_TXCR_CRC_DIS = 1<<14, /* Bit 14: Disable insertion of CRC */ |
1736 | GM_TXCR_PAD_DIS = 1<<13, /* Bit 13: Disable padding of packets */ | 1736 | GM_TXCR_PAD_DIS = 1<<13, /* Bit 13: Disable padding of packets */ |
1737 | GM_TXCR_COL_THR_MSK = 1<<10, /* Bit 12..10: Collision Threshold */ | 1737 | GM_TXCR_COL_THR_MSK = 7<<10, /* Bit 12..10: Collision Threshold */ |
1738 | }; | 1738 | }; |
1739 | 1739 | ||
1740 | #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) | 1740 | #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) |
1741 | #define TX_COL_DEF 0x04 | 1741 | #define TX_COL_DEF 0x04 /* late collision after 64 byte */ |
1742 | 1742 | ||
1743 | /* GM_RX_CTRL 16 bit r/w Receive Control Register */ | 1743 | /* GM_RX_CTRL 16 bit r/w Receive Control Register */ |
1744 | enum { | 1744 | enum { |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 31093760aa1e..d98f28c34e5c 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -65,6 +65,7 @@ | |||
65 | #define RX_MAX_PENDING (RX_LE_SIZE/2 - 2) | 65 | #define RX_MAX_PENDING (RX_LE_SIZE/2 - 2) |
66 | #define RX_DEF_PENDING RX_MAX_PENDING | 66 | #define RX_DEF_PENDING RX_MAX_PENDING |
67 | #define RX_SKB_ALIGN 8 | 67 | #define RX_SKB_ALIGN 8 |
68 | #define RX_BUF_WRITE 16 | ||
68 | 69 | ||
69 | #define TX_RING_SIZE 512 | 70 | #define TX_RING_SIZE 512 |
70 | #define TX_DEF_PENDING (TX_RING_SIZE - 1) | 71 | #define TX_DEF_PENDING (TX_RING_SIZE - 1) |
@@ -234,7 +235,6 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) | |||
234 | } | 235 | } |
235 | 236 | ||
236 | if (hw->chip_id == CHIP_ID_YUKON_EC_U) { | 237 | if (hw->chip_id == CHIP_ID_YUKON_EC_U) { |
237 | sky2_write16(hw, B0_CTST, Y2_HW_WOL_ON); | ||
238 | sky2_pci_write32(hw, PCI_DEV_REG3, 0); | 238 | sky2_pci_write32(hw, PCI_DEV_REG3, 0); |
239 | reg1 = sky2_pci_read32(hw, PCI_DEV_REG4); | 239 | reg1 = sky2_pci_read32(hw, PCI_DEV_REG4); |
240 | reg1 &= P_ASPM_CONTROL_MSK; | 240 | reg1 &= P_ASPM_CONTROL_MSK; |
@@ -243,6 +243,7 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) | |||
243 | } | 243 | } |
244 | 244 | ||
245 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); | 245 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); |
246 | udelay(100); | ||
246 | 247 | ||
247 | break; | 248 | break; |
248 | 249 | ||
@@ -255,6 +256,7 @@ static void sky2_set_power_state(struct sky2_hw *hw, pci_power_t state) | |||
255 | else | 256 | else |
256 | reg1 |= (PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD); | 257 | reg1 |= (PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD); |
257 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); | 258 | sky2_pci_write32(hw, PCI_DEV_REG1, reg1); |
259 | udelay(100); | ||
258 | 260 | ||
259 | if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) | 261 | if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) |
260 | sky2_write8(hw, B2_Y2_CLK_GATE, 0); | 262 | sky2_write8(hw, B2_Y2_CLK_GATE, 0); |
@@ -1389,7 +1391,7 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) | |||
1389 | } | 1391 | } |
1390 | 1392 | ||
1391 | sky2->tx_cons = put; | 1393 | sky2->tx_cons = put; |
1392 | if (tx_avail(sky2) > MAX_SKB_TX_LE) | 1394 | if (tx_avail(sky2) > MAX_SKB_TX_LE + 4) |
1393 | netif_wake_queue(dev); | 1395 | netif_wake_queue(dev); |
1394 | } | 1396 | } |
1395 | 1397 | ||
@@ -1888,9 +1890,6 @@ resubmit: | |||
1888 | re->skb->ip_summed = CHECKSUM_NONE; | 1890 | re->skb->ip_summed = CHECKSUM_NONE; |
1889 | sky2_rx_add(sky2, re->mapaddr); | 1891 | sky2_rx_add(sky2, re->mapaddr); |
1890 | 1892 | ||
1891 | /* Tell receiver about new buffers. */ | ||
1892 | sky2_put_idx(sky2->hw, rxqaddr[sky2->port], sky2->rx_put); | ||
1893 | |||
1894 | return skb; | 1893 | return skb; |
1895 | 1894 | ||
1896 | oversize: | 1895 | oversize: |
@@ -1937,7 +1936,9 @@ static inline int sky2_more_work(const struct sky2_hw *hw) | |||
1937 | /* Process status response ring */ | 1936 | /* Process status response ring */ |
1938 | static int sky2_status_intr(struct sky2_hw *hw, int to_do) | 1937 | static int sky2_status_intr(struct sky2_hw *hw, int to_do) |
1939 | { | 1938 | { |
1939 | struct sky2_port *sky2; | ||
1940 | int work_done = 0; | 1940 | int work_done = 0; |
1941 | unsigned buf_write[2] = { 0, 0 }; | ||
1941 | u16 hwidx = sky2_read16(hw, STAT_PUT_IDX); | 1942 | u16 hwidx = sky2_read16(hw, STAT_PUT_IDX); |
1942 | 1943 | ||
1943 | rmb(); | 1944 | rmb(); |
@@ -1945,7 +1946,6 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | |||
1945 | while (hw->st_idx != hwidx) { | 1946 | while (hw->st_idx != hwidx) { |
1946 | struct sky2_status_le *le = hw->st_le + hw->st_idx; | 1947 | struct sky2_status_le *le = hw->st_le + hw->st_idx; |
1947 | struct net_device *dev; | 1948 | struct net_device *dev; |
1948 | struct sky2_port *sky2; | ||
1949 | struct sk_buff *skb; | 1949 | struct sk_buff *skb; |
1950 | u32 status; | 1950 | u32 status; |
1951 | u16 length; | 1951 | u16 length; |
@@ -1978,6 +1978,14 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | |||
1978 | #endif | 1978 | #endif |
1979 | netif_receive_skb(skb); | 1979 | netif_receive_skb(skb); |
1980 | 1980 | ||
1981 | /* Update receiver after 16 frames */ | ||
1982 | if (++buf_write[le->link] == RX_BUF_WRITE) { | ||
1983 | sky2_put_idx(hw, rxqaddr[le->link], | ||
1984 | sky2->rx_put); | ||
1985 | buf_write[le->link] = 0; | ||
1986 | } | ||
1987 | |||
1988 | /* Stop after net poll weight */ | ||
1981 | if (++work_done >= to_do) | 1989 | if (++work_done >= to_do) |
1982 | goto exit_loop; | 1990 | goto exit_loop; |
1983 | break; | 1991 | break; |
@@ -2016,6 +2024,16 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do) | |||
2016 | } | 2024 | } |
2017 | 2025 | ||
2018 | exit_loop: | 2026 | exit_loop: |
2027 | if (buf_write[0]) { | ||
2028 | sky2 = netdev_priv(hw->dev[0]); | ||
2029 | sky2_put_idx(hw, Q_R1, sky2->rx_put); | ||
2030 | } | ||
2031 | |||
2032 | if (buf_write[1]) { | ||
2033 | sky2 = netdev_priv(hw->dev[1]); | ||
2034 | sky2_put_idx(hw, Q_R2, sky2->rx_put); | ||
2035 | } | ||
2036 | |||
2019 | return work_done; | 2037 | return work_done; |
2020 | } | 2038 | } |
2021 | 2039 | ||
@@ -2286,7 +2304,7 @@ static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk) | |||
2286 | } | 2304 | } |
2287 | 2305 | ||
2288 | 2306 | ||
2289 | static int __devinit sky2_reset(struct sky2_hw *hw) | 2307 | static int sky2_reset(struct sky2_hw *hw) |
2290 | { | 2308 | { |
2291 | u16 status; | 2309 | u16 status; |
2292 | u8 t8, pmd_type; | 2310 | u8 t8, pmd_type; |
@@ -3437,17 +3455,14 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state) | |||
3437 | return -EINVAL; | 3455 | return -EINVAL; |
3438 | 3456 | ||
3439 | del_timer_sync(&hw->idle_timer); | 3457 | del_timer_sync(&hw->idle_timer); |
3458 | netif_poll_disable(hw->dev[0]); | ||
3440 | 3459 | ||
3441 | for (i = 0; i < hw->ports; i++) { | 3460 | for (i = 0; i < hw->ports; i++) { |
3442 | struct net_device *dev = hw->dev[i]; | 3461 | struct net_device *dev = hw->dev[i]; |
3443 | 3462 | ||
3444 | if (dev) { | 3463 | if (netif_running(dev)) { |
3445 | if (!netif_running(dev)) | ||
3446 | continue; | ||
3447 | |||
3448 | sky2_down(dev); | 3464 | sky2_down(dev); |
3449 | netif_device_detach(dev); | 3465 | netif_device_detach(dev); |
3450 | netif_poll_disable(dev); | ||
3451 | } | 3466 | } |
3452 | } | 3467 | } |
3453 | 3468 | ||
@@ -3474,9 +3489,8 @@ static int sky2_resume(struct pci_dev *pdev) | |||
3474 | 3489 | ||
3475 | for (i = 0; i < hw->ports; i++) { | 3490 | for (i = 0; i < hw->ports; i++) { |
3476 | struct net_device *dev = hw->dev[i]; | 3491 | struct net_device *dev = hw->dev[i]; |
3477 | if (dev && netif_running(dev)) { | 3492 | if (netif_running(dev)) { |
3478 | netif_device_attach(dev); | 3493 | netif_device_attach(dev); |
3479 | netif_poll_enable(dev); | ||
3480 | 3494 | ||
3481 | err = sky2_up(dev); | 3495 | err = sky2_up(dev); |
3482 | if (err) { | 3496 | if (err) { |
@@ -3488,6 +3502,7 @@ static int sky2_resume(struct pci_dev *pdev) | |||
3488 | } | 3502 | } |
3489 | } | 3503 | } |
3490 | 3504 | ||
3505 | netif_poll_enable(hw->dev[0]); | ||
3491 | sky2_idle_start(hw); | 3506 | sky2_idle_start(hw); |
3492 | out: | 3507 | out: |
3493 | return err; | 3508 | return err; |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 8a0bc5525f0a..2db8d19b22d1 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -1480,7 +1480,7 @@ enum { | |||
1480 | GM_TXCR_FORCE_JAM = 1<<15, /* Bit 15: Force Jam / Flow-Control */ | 1480 | GM_TXCR_FORCE_JAM = 1<<15, /* Bit 15: Force Jam / Flow-Control */ |
1481 | GM_TXCR_CRC_DIS = 1<<14, /* Bit 14: Disable insertion of CRC */ | 1481 | GM_TXCR_CRC_DIS = 1<<14, /* Bit 14: Disable insertion of CRC */ |
1482 | GM_TXCR_PAD_DIS = 1<<13, /* Bit 13: Disable padding of packets */ | 1482 | GM_TXCR_PAD_DIS = 1<<13, /* Bit 13: Disable padding of packets */ |
1483 | GM_TXCR_COL_THR_MSK = 1<<10, /* Bit 12..10: Collision Threshold */ | 1483 | GM_TXCR_COL_THR_MSK = 7<<10, /* Bit 12..10: Collision Threshold */ |
1484 | }; | 1484 | }; |
1485 | 1485 | ||
1486 | #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) | 1486 | #define TX_COL_THR(x) (((x)<<10) & GM_TXCR_COL_THR_MSK) |
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index b4028049ed76..4ec4b4d23ae5 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h | |||
@@ -354,6 +354,24 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, | |||
354 | 354 | ||
355 | #define SMC_IRQ_FLAGS (0) | 355 | #define SMC_IRQ_FLAGS (0) |
356 | 356 | ||
357 | #elif defined(CONFIG_ARCH_VERSATILE) | ||
358 | |||
359 | #define SMC_CAN_USE_8BIT 1 | ||
360 | #define SMC_CAN_USE_16BIT 1 | ||
361 | #define SMC_CAN_USE_32BIT 1 | ||
362 | #define SMC_NOWAIT 1 | ||
363 | |||
364 | #define SMC_inb(a, r) readb((a) + (r)) | ||
365 | #define SMC_inw(a, r) readw((a) + (r)) | ||
366 | #define SMC_inl(a, r) readl((a) + (r)) | ||
367 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) | ||
368 | #define SMC_outw(v, a, r) writew(v, (a) + (r)) | ||
369 | #define SMC_outl(v, a, r) writel(v, (a) + (r)) | ||
370 | #define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) | ||
371 | #define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) | ||
372 | |||
373 | #define SMC_IRQ_FLAGS (0) | ||
374 | |||
357 | #else | 375 | #else |
358 | 376 | ||
359 | #define SMC_CAN_USE_8BIT 1 | 377 | #define SMC_CAN_USE_8BIT 1 |
diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c index c92ac9fde083..2c09ec908a3f 100644 --- a/drivers/net/wan/c101.c +++ b/drivers/net/wan/c101.c | |||
@@ -116,27 +116,33 @@ static inline void openwin(card_t *card, u8 page) | |||
116 | #include "hd6457x.c" | 116 | #include "hd6457x.c" |
117 | 117 | ||
118 | 118 | ||
119 | static inline void set_carrier(port_t *port) | ||
120 | { | ||
121 | if (!sca_in(MSCI1_OFFSET + ST3, port) & ST3_DCD) | ||
122 | netif_carrier_on(port_to_dev(port)); | ||
123 | else | ||
124 | netif_carrier_off(port_to_dev(port)); | ||
125 | } | ||
126 | |||
127 | |||
119 | static void sca_msci_intr(port_t *port) | 128 | static void sca_msci_intr(port_t *port) |
120 | { | 129 | { |
121 | struct net_device *dev = port_to_dev(port); | 130 | u8 stat = sca_in(MSCI1_OFFSET + ST1, port); /* read MSCI ST1 status */ |
122 | card_t* card = port_to_card(port); | ||
123 | u8 stat = sca_in(MSCI1_OFFSET + ST1, card); /* read MSCI ST1 status */ | ||
124 | 131 | ||
125 | /* Reset MSCI TX underrun status bit */ | 132 | /* Reset MSCI TX underrun status bit */ |
126 | sca_out(stat & ST1_UDRN, MSCI0_OFFSET + ST1, card); | 133 | sca_out(stat & ST1_UDRN, MSCI0_OFFSET + ST1, port); |
127 | 134 | ||
128 | if (stat & ST1_UDRN) { | 135 | if (stat & ST1_UDRN) { |
129 | struct net_device_stats *stats = hdlc_stats(dev); | 136 | struct net_device_stats *stats = hdlc_stats(port_to_dev(port)); |
130 | stats->tx_errors++; /* TX Underrun error detected */ | 137 | stats->tx_errors++; /* TX Underrun error detected */ |
131 | stats->tx_fifo_errors++; | 138 | stats->tx_fifo_errors++; |
132 | } | 139 | } |
133 | 140 | ||
134 | /* Reset MSCI CDCD status bit - uses ch#2 DCD input */ | 141 | /* Reset MSCI CDCD status bit - uses ch#2 DCD input */ |
135 | sca_out(stat & ST1_CDCD, MSCI1_OFFSET + ST1, card); | 142 | sca_out(stat & ST1_CDCD, MSCI1_OFFSET + ST1, port); |
136 | 143 | ||
137 | if (stat & ST1_CDCD) | 144 | if (stat & ST1_CDCD) |
138 | hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), | 145 | set_carrier(port); |
139 | dev); | ||
140 | } | 146 | } |
141 | 147 | ||
142 | 148 | ||
@@ -190,7 +196,7 @@ static int c101_open(struct net_device *dev) | |||
190 | sca_out(IE1_UDRN, MSCI0_OFFSET + IE1, port); | 196 | sca_out(IE1_UDRN, MSCI0_OFFSET + IE1, port); |
191 | sca_out(IE0_TXINT, MSCI0_OFFSET + IE0, port); | 197 | sca_out(IE0_TXINT, MSCI0_OFFSET + IE0, port); |
192 | 198 | ||
193 | hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, port) & ST3_DCD), dev); | 199 | set_carrier(port); |
194 | printk(KERN_DEBUG "0x%X\n", sca_in(MSCI1_OFFSET + ST3, port)); | 200 | printk(KERN_DEBUG "0x%X\n", sca_in(MSCI1_OFFSET + ST3, port)); |
195 | 201 | ||
196 | /* enable MSCI1 CDCD interrupt */ | 202 | /* enable MSCI1 CDCD interrupt */ |
@@ -378,7 +384,7 @@ static int __init c101_run(unsigned long irq, unsigned long winbase) | |||
378 | } | 384 | } |
379 | 385 | ||
380 | sca_init_sync_port(card); /* Set up C101 memory */ | 386 | sca_init_sync_port(card); /* Set up C101 memory */ |
381 | hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), dev); | 387 | set_carrier(card); |
382 | 388 | ||
383 | printk(KERN_INFO "%s: Moxa C101 on IRQ%u," | 389 | printk(KERN_INFO "%s: Moxa C101 on IRQ%u," |
384 | " using %u TX + %u RX packets rings\n", | 390 | " using %u TX + %u RX packets rings\n", |
diff --git a/drivers/net/wan/hd6457x.c b/drivers/net/wan/hd6457x.c index d3743321a977..dce2bb317b82 100644 --- a/drivers/net/wan/hd6457x.c +++ b/drivers/net/wan/hd6457x.c | |||
@@ -168,6 +168,23 @@ static inline u32 buffer_offset(port_t *port, u16 desc, int transmit) | |||
168 | } | 168 | } |
169 | 169 | ||
170 | 170 | ||
171 | static inline void sca_set_carrier(port_t *port) | ||
172 | { | ||
173 | if (!(sca_in(get_msci(port) + ST3, port_to_card(port)) & ST3_DCD)) { | ||
174 | #ifdef DEBUG_LINK | ||
175 | printk(KERN_DEBUG "%s: sca_set_carrier on\n", | ||
176 | port_to_dev(port)->name); | ||
177 | #endif | ||
178 | netif_carrier_on(port_to_dev(port)); | ||
179 | } else { | ||
180 | #ifdef DEBUG_LINK | ||
181 | printk(KERN_DEBUG "%s: sca_set_carrier off\n", | ||
182 | port_to_dev(port)->name); | ||
183 | #endif | ||
184 | netif_carrier_off(port_to_dev(port)); | ||
185 | } | ||
186 | } | ||
187 | |||
171 | 188 | ||
172 | static void sca_init_sync_port(port_t *port) | 189 | static void sca_init_sync_port(port_t *port) |
173 | { | 190 | { |
@@ -237,9 +254,7 @@ static void sca_init_sync_port(port_t *port) | |||
237 | sca_out(DIR_BOFE, DIR_TX(phy_node(port)), card); | 254 | sca_out(DIR_BOFE, DIR_TX(phy_node(port)), card); |
238 | } | 255 | } |
239 | } | 256 | } |
240 | 257 | sca_set_carrier(port); | |
241 | hdlc_set_carrier(!(sca_in(get_msci(port) + ST3, card) & ST3_DCD), | ||
242 | port_to_dev(port)); | ||
243 | } | 258 | } |
244 | 259 | ||
245 | 260 | ||
@@ -262,8 +277,7 @@ static inline void sca_msci_intr(port_t *port) | |||
262 | } | 277 | } |
263 | 278 | ||
264 | if (stat & ST1_CDCD) | 279 | if (stat & ST1_CDCD) |
265 | hdlc_set_carrier(!(sca_in(msci + ST3, card) & ST3_DCD), | 280 | sca_set_carrier(port); |
266 | port_to_dev(port)); | ||
267 | } | 281 | } |
268 | #endif | 282 | #endif |
269 | 283 | ||
@@ -566,7 +580,7 @@ static void sca_open(struct net_device *dev) | |||
566 | - all DMA interrupts | 580 | - all DMA interrupts |
567 | */ | 581 | */ |
568 | 582 | ||
569 | hdlc_set_carrier(!(sca_in(msci + ST3, card) & ST3_DCD), dev); | 583 | sca_set_carrier(port); |
570 | 584 | ||
571 | #ifdef __HD64570_H | 585 | #ifdef __HD64570_H |
572 | /* MSCI TX INT and RX INT A IRQ enable */ | 586 | /* MSCI TX INT and RX INT A IRQ enable */ |
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index 1fd04662c4fc..f289daba0c7b 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c | |||
@@ -192,9 +192,7 @@ static int cisco_rx(struct sk_buff *skb) | |||
192 | "uptime %ud%uh%um%us)\n", | 192 | "uptime %ud%uh%um%us)\n", |
193 | dev->name, days, hrs, | 193 | dev->name, days, hrs, |
194 | min, sec); | 194 | min, sec); |
195 | #if 0 | 195 | netif_dormant_off(dev); |
196 | netif_carrier_on(dev); | ||
197 | #endif | ||
198 | hdlc->state.cisco.up = 1; | 196 | hdlc->state.cisco.up = 1; |
199 | } | 197 | } |
200 | } | 198 | } |
@@ -227,9 +225,7 @@ static void cisco_timer(unsigned long arg) | |||
227 | hdlc->state.cisco.settings.timeout * HZ)) { | 225 | hdlc->state.cisco.settings.timeout * HZ)) { |
228 | hdlc->state.cisco.up = 0; | 226 | hdlc->state.cisco.up = 0; |
229 | printk(KERN_INFO "%s: Link down\n", dev->name); | 227 | printk(KERN_INFO "%s: Link down\n", dev->name); |
230 | #if 0 | 228 | netif_dormant_on(dev); |
231 | netif_carrier_off(dev); | ||
232 | #endif | ||
233 | } | 229 | } |
234 | 230 | ||
235 | cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, | 231 | cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, |
@@ -265,10 +261,7 @@ static void cisco_stop(struct net_device *dev) | |||
265 | { | 261 | { |
266 | hdlc_device *hdlc = dev_to_hdlc(dev); | 262 | hdlc_device *hdlc = dev_to_hdlc(dev); |
267 | del_timer_sync(&hdlc->state.cisco.timer); | 263 | del_timer_sync(&hdlc->state.cisco.timer); |
268 | #if 0 | 264 | netif_dormant_on(dev); |
269 | if (netif_carrier_ok(dev)) | ||
270 | netif_carrier_off(dev); | ||
271 | #endif | ||
272 | hdlc->state.cisco.up = 0; | 265 | hdlc->state.cisco.up = 0; |
273 | hdlc->state.cisco.request_sent = 0; | 266 | hdlc->state.cisco.request_sent = 0; |
274 | } | 267 | } |
@@ -328,6 +321,7 @@ int hdlc_cisco_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
328 | dev->type = ARPHRD_CISCO; | 321 | dev->type = ARPHRD_CISCO; |
329 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | 322 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; |
330 | dev->addr_len = 0; | 323 | dev->addr_len = 0; |
324 | netif_dormant_on(dev); | ||
331 | return 0; | 325 | return 0; |
332 | } | 326 | } |
333 | 327 | ||
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index 523afe17564e..7bb737bbdeb9 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c | |||
@@ -301,7 +301,7 @@ static int pvc_open(struct net_device *dev) | |||
301 | if (pvc->open_count++ == 0) { | 301 | if (pvc->open_count++ == 0) { |
302 | hdlc_device *hdlc = dev_to_hdlc(pvc->master); | 302 | hdlc_device *hdlc = dev_to_hdlc(pvc->master); |
303 | if (hdlc->state.fr.settings.lmi == LMI_NONE) | 303 | if (hdlc->state.fr.settings.lmi == LMI_NONE) |
304 | pvc->state.active = hdlc->carrier; | 304 | pvc->state.active = netif_carrier_ok(pvc->master); |
305 | 305 | ||
306 | pvc_carrier(pvc->state.active, pvc); | 306 | pvc_carrier(pvc->state.active, pvc); |
307 | hdlc->state.fr.dce_changed = 1; | 307 | hdlc->state.fr.dce_changed = 1; |
@@ -545,11 +545,7 @@ static void fr_set_link_state(int reliable, struct net_device *dev) | |||
545 | 545 | ||
546 | hdlc->state.fr.reliable = reliable; | 546 | hdlc->state.fr.reliable = reliable; |
547 | if (reliable) { | 547 | if (reliable) { |
548 | #if 0 | 548 | netif_dormant_off(dev); |
549 | if (!netif_carrier_ok(dev)) | ||
550 | netif_carrier_on(dev); | ||
551 | #endif | ||
552 | |||
553 | hdlc->state.fr.n391cnt = 0; /* Request full status */ | 549 | hdlc->state.fr.n391cnt = 0; /* Request full status */ |
554 | hdlc->state.fr.dce_changed = 1; | 550 | hdlc->state.fr.dce_changed = 1; |
555 | 551 | ||
@@ -562,11 +558,7 @@ static void fr_set_link_state(int reliable, struct net_device *dev) | |||
562 | } | 558 | } |
563 | } | 559 | } |
564 | } else { | 560 | } else { |
565 | #if 0 | 561 | netif_dormant_on(dev); |
566 | if (netif_carrier_ok(dev)) | ||
567 | netif_carrier_off(dev); | ||
568 | #endif | ||
569 | |||
570 | while (pvc) { /* Deactivate all PVCs */ | 562 | while (pvc) { /* Deactivate all PVCs */ |
571 | pvc_carrier(0, pvc); | 563 | pvc_carrier(0, pvc); |
572 | pvc->state.exist = pvc->state.active = 0; | 564 | pvc->state.exist = pvc->state.active = 0; |
diff --git a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c index b7da55140fbd..04ca1f7b6424 100644 --- a/drivers/net/wan/hdlc_generic.c +++ b/drivers/net/wan/hdlc_generic.c | |||
@@ -34,10 +34,11 @@ | |||
34 | #include <linux/inetdevice.h> | 34 | #include <linux/inetdevice.h> |
35 | #include <linux/lapb.h> | 35 | #include <linux/lapb.h> |
36 | #include <linux/rtnetlink.h> | 36 | #include <linux/rtnetlink.h> |
37 | #include <linux/notifier.h> | ||
37 | #include <linux/hdlc.h> | 38 | #include <linux/hdlc.h> |
38 | 39 | ||
39 | 40 | ||
40 | static const char* version = "HDLC support module revision 1.18"; | 41 | static const char* version = "HDLC support module revision 1.19"; |
41 | 42 | ||
42 | #undef DEBUG_LINK | 43 | #undef DEBUG_LINK |
43 | 44 | ||
@@ -73,57 +74,51 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, | |||
73 | 74 | ||
74 | 75 | ||
75 | 76 | ||
76 | static void __hdlc_set_carrier_on(struct net_device *dev) | 77 | static inline void hdlc_proto_start(struct net_device *dev) |
77 | { | 78 | { |
78 | hdlc_device *hdlc = dev_to_hdlc(dev); | 79 | hdlc_device *hdlc = dev_to_hdlc(dev); |
79 | if (hdlc->proto.start) | 80 | if (hdlc->proto.start) |
80 | return hdlc->proto.start(dev); | 81 | return hdlc->proto.start(dev); |
81 | #if 0 | ||
82 | #ifdef DEBUG_LINK | ||
83 | if (netif_carrier_ok(dev)) | ||
84 | printk(KERN_ERR "hdlc_set_carrier_on(): already on\n"); | ||
85 | #endif | ||
86 | netif_carrier_on(dev); | ||
87 | #endif | ||
88 | } | 82 | } |
89 | 83 | ||
90 | 84 | ||
91 | 85 | ||
92 | static void __hdlc_set_carrier_off(struct net_device *dev) | 86 | static inline void hdlc_proto_stop(struct net_device *dev) |
93 | { | 87 | { |
94 | hdlc_device *hdlc = dev_to_hdlc(dev); | 88 | hdlc_device *hdlc = dev_to_hdlc(dev); |
95 | if (hdlc->proto.stop) | 89 | if (hdlc->proto.stop) |
96 | return hdlc->proto.stop(dev); | 90 | return hdlc->proto.stop(dev); |
97 | |||
98 | #if 0 | ||
99 | #ifdef DEBUG_LINK | ||
100 | if (!netif_carrier_ok(dev)) | ||
101 | printk(KERN_ERR "hdlc_set_carrier_off(): already off\n"); | ||
102 | #endif | ||
103 | netif_carrier_off(dev); | ||
104 | #endif | ||
105 | } | 91 | } |
106 | 92 | ||
107 | 93 | ||
108 | 94 | ||
109 | void hdlc_set_carrier(int on, struct net_device *dev) | 95 | static int hdlc_device_event(struct notifier_block *this, unsigned long event, |
96 | void *ptr) | ||
110 | { | 97 | { |
111 | hdlc_device *hdlc = dev_to_hdlc(dev); | 98 | struct net_device *dev = ptr; |
99 | hdlc_device *hdlc; | ||
112 | unsigned long flags; | 100 | unsigned long flags; |
113 | on = on ? 1 : 0; | 101 | int on; |
102 | |||
103 | if (dev->get_stats != hdlc_get_stats) | ||
104 | return NOTIFY_DONE; /* not an HDLC device */ | ||
105 | |||
106 | if (event != NETDEV_CHANGE) | ||
107 | return NOTIFY_DONE; /* Only interrested in carrier changes */ | ||
108 | |||
109 | on = netif_carrier_ok(dev); | ||
114 | 110 | ||
115 | #ifdef DEBUG_LINK | 111 | #ifdef DEBUG_LINK |
116 | printk(KERN_DEBUG "hdlc_set_carrier %i\n", on); | 112 | printk(KERN_DEBUG "%s: hdlc_device_event NETDEV_CHANGE, carrier %i\n", |
113 | dev->name, on); | ||
117 | #endif | 114 | #endif |
118 | 115 | ||
116 | hdlc = dev_to_hdlc(dev); | ||
119 | spin_lock_irqsave(&hdlc->state_lock, flags); | 117 | spin_lock_irqsave(&hdlc->state_lock, flags); |
120 | 118 | ||
121 | if (hdlc->carrier == on) | 119 | if (hdlc->carrier == on) |
122 | goto carrier_exit; /* no change in DCD line level */ | 120 | goto carrier_exit; /* no change in DCD line level */ |
123 | 121 | ||
124 | #ifdef DEBUG_LINK | ||
125 | printk(KERN_INFO "%s: carrier %s\n", dev->name, on ? "ON" : "off"); | ||
126 | #endif | ||
127 | hdlc->carrier = on; | 122 | hdlc->carrier = on; |
128 | 123 | ||
129 | if (!hdlc->open) | 124 | if (!hdlc->open) |
@@ -131,14 +126,15 @@ void hdlc_set_carrier(int on, struct net_device *dev) | |||
131 | 126 | ||
132 | if (hdlc->carrier) { | 127 | if (hdlc->carrier) { |
133 | printk(KERN_INFO "%s: Carrier detected\n", dev->name); | 128 | printk(KERN_INFO "%s: Carrier detected\n", dev->name); |
134 | __hdlc_set_carrier_on(dev); | 129 | hdlc_proto_start(dev); |
135 | } else { | 130 | } else { |
136 | printk(KERN_INFO "%s: Carrier lost\n", dev->name); | 131 | printk(KERN_INFO "%s: Carrier lost\n", dev->name); |
137 | __hdlc_set_carrier_off(dev); | 132 | hdlc_proto_stop(dev); |
138 | } | 133 | } |
139 | 134 | ||
140 | carrier_exit: | 135 | carrier_exit: |
141 | spin_unlock_irqrestore(&hdlc->state_lock, flags); | 136 | spin_unlock_irqrestore(&hdlc->state_lock, flags); |
137 | return NOTIFY_DONE; | ||
142 | } | 138 | } |
143 | 139 | ||
144 | 140 | ||
@@ -165,7 +161,7 @@ int hdlc_open(struct net_device *dev) | |||
165 | 161 | ||
166 | if (hdlc->carrier) { | 162 | if (hdlc->carrier) { |
167 | printk(KERN_INFO "%s: Carrier detected\n", dev->name); | 163 | printk(KERN_INFO "%s: Carrier detected\n", dev->name); |
168 | __hdlc_set_carrier_on(dev); | 164 | hdlc_proto_start(dev); |
169 | } else | 165 | } else |
170 | printk(KERN_INFO "%s: No carrier\n", dev->name); | 166 | printk(KERN_INFO "%s: No carrier\n", dev->name); |
171 | 167 | ||
@@ -190,7 +186,7 @@ void hdlc_close(struct net_device *dev) | |||
190 | 186 | ||
191 | hdlc->open = 0; | 187 | hdlc->open = 0; |
192 | if (hdlc->carrier) | 188 | if (hdlc->carrier) |
193 | __hdlc_set_carrier_off(dev); | 189 | hdlc_proto_stop(dev); |
194 | 190 | ||
195 | spin_unlock_irq(&hdlc->state_lock); | 191 | spin_unlock_irq(&hdlc->state_lock); |
196 | 192 | ||
@@ -303,7 +299,6 @@ MODULE_LICENSE("GPL v2"); | |||
303 | 299 | ||
304 | EXPORT_SYMBOL(hdlc_open); | 300 | EXPORT_SYMBOL(hdlc_open); |
305 | EXPORT_SYMBOL(hdlc_close); | 301 | EXPORT_SYMBOL(hdlc_close); |
306 | EXPORT_SYMBOL(hdlc_set_carrier); | ||
307 | EXPORT_SYMBOL(hdlc_ioctl); | 302 | EXPORT_SYMBOL(hdlc_ioctl); |
308 | EXPORT_SYMBOL(hdlc_setup); | 303 | EXPORT_SYMBOL(hdlc_setup); |
309 | EXPORT_SYMBOL(alloc_hdlcdev); | 304 | EXPORT_SYMBOL(alloc_hdlcdev); |
@@ -315,9 +310,18 @@ static struct packet_type hdlc_packet_type = { | |||
315 | }; | 310 | }; |
316 | 311 | ||
317 | 312 | ||
313 | static struct notifier_block hdlc_notifier = { | ||
314 | .notifier_call = hdlc_device_event, | ||
315 | }; | ||
316 | |||
317 | |||
318 | static int __init hdlc_module_init(void) | 318 | static int __init hdlc_module_init(void) |
319 | { | 319 | { |
320 | int result; | ||
321 | |||
320 | printk(KERN_INFO "%s\n", version); | 322 | printk(KERN_INFO "%s\n", version); |
323 | if ((result = register_netdevice_notifier(&hdlc_notifier)) != 0) | ||
324 | return result; | ||
321 | dev_add_pack(&hdlc_packet_type); | 325 | dev_add_pack(&hdlc_packet_type); |
322 | return 0; | 326 | return 0; |
323 | } | 327 | } |
@@ -327,6 +331,7 @@ static int __init hdlc_module_init(void) | |||
327 | static void __exit hdlc_module_exit(void) | 331 | static void __exit hdlc_module_exit(void) |
328 | { | 332 | { |
329 | dev_remove_pack(&hdlc_packet_type); | 333 | dev_remove_pack(&hdlc_packet_type); |
334 | unregister_netdevice_notifier(&hdlc_notifier); | ||
330 | } | 335 | } |
331 | 336 | ||
332 | 337 | ||
diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c index d564224cdca9..b2031dfc4bb1 100644 --- a/drivers/net/wan/wanxl.c +++ b/drivers/net/wan/wanxl.c | |||
@@ -149,7 +149,10 @@ static inline void wanxl_cable_intr(port_t *port) | |||
149 | printk(KERN_INFO "%s: %s%s module, %s cable%s%s\n", | 149 | printk(KERN_INFO "%s: %s%s module, %s cable%s%s\n", |
150 | port->dev->name, pm, dte, cable, dsr, dcd); | 150 | port->dev->name, pm, dte, cable, dsr, dcd); |
151 | 151 | ||
152 | hdlc_set_carrier(value & STATUS_CABLE_DCD, port->dev); | 152 | if (value & STATUS_CABLE_DCD) |
153 | netif_carrier_on(port->dev); | ||
154 | else | ||
155 | netif_carrier_off(port->dev); | ||
153 | } | 156 | } |
154 | 157 | ||
155 | 158 | ||
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c index e1c5a939bca4..3889f79e7128 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c | |||
@@ -1547,7 +1547,7 @@ static void handle_irq_noise(struct bcm43xx_private *bcm) | |||
1547 | goto generate_new; | 1547 | goto generate_new; |
1548 | 1548 | ||
1549 | /* Get the noise samples. */ | 1549 | /* Get the noise samples. */ |
1550 | assert(bcm->noisecalc.nr_samples <= 8); | 1550 | assert(bcm->noisecalc.nr_samples < 8); |
1551 | i = bcm->noisecalc.nr_samples; | 1551 | i = bcm->noisecalc.nr_samples; |
1552 | noise[0] = limit_value(noise[0], 0, ARRAY_SIZE(radio->nrssi_lt) - 1); | 1552 | noise[0] = limit_value(noise[0], 0, ARRAY_SIZE(radio->nrssi_lt) - 1); |
1553 | noise[1] = limit_value(noise[1], 0, ARRAY_SIZE(radio->nrssi_lt) - 1); | 1553 | noise[1] = limit_value(noise[1], 0, ARRAY_SIZE(radio->nrssi_lt) - 1); |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index ce1cb2c6aa8d..72f90525bf68 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
@@ -375,10 +375,8 @@ static void int_urb_complete(struct urb *urb, struct pt_regs *pt_regs) | |||
375 | case -ENODEV: | 375 | case -ENODEV: |
376 | case -ENOENT: | 376 | case -ENOENT: |
377 | case -ECONNRESET: | 377 | case -ECONNRESET: |
378 | goto kfree; | ||
379 | case -EPIPE: | 378 | case -EPIPE: |
380 | usb_clear_halt(urb->dev, EP_INT_IN); | 379 | goto kfree; |
381 | /* FALL-THROUGH */ | ||
382 | default: | 380 | default: |
383 | goto resubmit; | 381 | goto resubmit; |
384 | } | 382 | } |
@@ -580,10 +578,8 @@ static void rx_urb_complete(struct urb *urb, struct pt_regs *pt_regs) | |||
580 | case -ENODEV: | 578 | case -ENODEV: |
581 | case -ENOENT: | 579 | case -ENOENT: |
582 | case -ECONNRESET: | 580 | case -ECONNRESET: |
583 | return; | ||
584 | case -EPIPE: | 581 | case -EPIPE: |
585 | usb_clear_halt(urb->dev, EP_DATA_IN); | 582 | return; |
586 | /* FALL-THROUGH */ | ||
587 | default: | 583 | default: |
588 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); | 584 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); |
589 | goto resubmit; | 585 | goto resubmit; |
@@ -749,11 +745,9 @@ static void tx_urb_complete(struct urb *urb, struct pt_regs *pt_regs) | |||
749 | case -ENODEV: | 745 | case -ENODEV: |
750 | case -ENOENT: | 746 | case -ENOENT: |
751 | case -ECONNRESET: | 747 | case -ECONNRESET: |
748 | case -EPIPE: | ||
752 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); | 749 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); |
753 | break; | 750 | break; |
754 | case -EPIPE: | ||
755 | usb_clear_halt(urb->dev, EP_DATA_OUT); | ||
756 | /* FALL-THROUGH */ | ||
757 | default: | 751 | default: |
758 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); | 752 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); |
759 | goto resubmit; | 753 | goto resubmit; |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 36bc7c415af7..a83c1f5735d6 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -47,13 +47,13 @@ msi_register(struct msi_ops *ops) | |||
47 | 47 | ||
48 | static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags) | 48 | static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags) |
49 | { | 49 | { |
50 | memset(p, 0, NR_IRQS * sizeof(struct msi_desc)); | 50 | memset(p, 0, sizeof(struct msi_desc)); |
51 | } | 51 | } |
52 | 52 | ||
53 | static int msi_cache_init(void) | 53 | static int msi_cache_init(void) |
54 | { | 54 | { |
55 | msi_cachep = kmem_cache_create("msi_cache", | 55 | msi_cachep = kmem_cache_create("msi_cache", |
56 | NR_IRQS * sizeof(struct msi_desc), | 56 | sizeof(struct msi_desc), |
57 | 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL); | 57 | 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL); |
58 | if (!msi_cachep) | 58 | if (!msi_cachep) |
59 | return -ENOMEM; | 59 | return -ENOMEM; |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index cf57d7de3765..9f79dd6d51ab 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ | 19 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ |
20 | #include "pci.h" | 20 | #include "pci.h" |
21 | 21 | ||
22 | unsigned int pci_pm_d3_delay = 10; | ||
22 | 23 | ||
23 | /** | 24 | /** |
24 | * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children | 25 | * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children |
@@ -313,6 +314,14 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
313 | } else if (dev->current_state == state) | 314 | } else if (dev->current_state == state) |
314 | return 0; /* we're already there */ | 315 | return 0; /* we're already there */ |
315 | 316 | ||
317 | /* | ||
318 | * If the device or the parent bridge can't support PCI PM, ignore | ||
319 | * the request if we're doing anything besides putting it into D0 | ||
320 | * (which would only happen on boot). | ||
321 | */ | ||
322 | if ((state == PCI_D1 || state == PCI_D2) && pci_no_d1d2(dev)) | ||
323 | return 0; | ||
324 | |||
316 | /* find PCI PM capability in list */ | 325 | /* find PCI PM capability in list */ |
317 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); | 326 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); |
318 | 327 | ||
@@ -363,7 +372,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
363 | /* Mandatory power management transition delays */ | 372 | /* Mandatory power management transition delays */ |
364 | /* see PCI PM 1.1 5.6.1 table 18 */ | 373 | /* see PCI PM 1.1 5.6.1 table 18 */ |
365 | if (state == PCI_D3hot || dev->current_state == PCI_D3hot) | 374 | if (state == PCI_D3hot || dev->current_state == PCI_D3hot) |
366 | msleep(10); | 375 | msleep(pci_pm_d3_delay); |
367 | else if (state == PCI_D2 || dev->current_state == PCI_D2) | 376 | else if (state == PCI_D2 || dev->current_state == PCI_D2) |
368 | udelay(200); | 377 | udelay(200); |
369 | 378 | ||
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 9cc842b666eb..08d58fc78ee1 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -47,7 +47,7 @@ extern int pci_msi_quirk; | |||
47 | #else | 47 | #else |
48 | #define pci_msi_quirk 0 | 48 | #define pci_msi_quirk 0 |
49 | #endif | 49 | #endif |
50 | 50 | extern unsigned int pci_pm_d3_delay; | |
51 | #ifdef CONFIG_PCI_MSI | 51 | #ifdef CONFIG_PCI_MSI |
52 | void disable_msi_mode(struct pci_dev *dev, int pos, int type); | 52 | void disable_msi_mode(struct pci_dev *dev, int pos, int type); |
53 | void pci_no_msi(void); | 53 | void pci_no_msi(void); |
@@ -66,7 +66,15 @@ static inline int pci_save_msix_state(struct pci_dev *dev) { return 0; } | |||
66 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} | 66 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} |
67 | static inline void pci_restore_msix_state(struct pci_dev *dev) {} | 67 | static inline void pci_restore_msix_state(struct pci_dev *dev) {} |
68 | #endif | 68 | #endif |
69 | static inline int pci_no_d1d2(struct pci_dev *dev) | ||
70 | { | ||
71 | unsigned int parent_dstates = 0; | ||
69 | 72 | ||
73 | if (dev->bus->self) | ||
74 | parent_dstates = dev->bus->self->no_d1d2; | ||
75 | return (dev->no_d1d2 || parent_dstates); | ||
76 | |||
77 | } | ||
70 | extern int pcie_mch_quirk; | 78 | extern int pcie_mch_quirk; |
71 | extern struct device_attribute pci_dev_attrs[]; | 79 | extern struct device_attribute pci_dev_attrs[]; |
72 | extern struct class_device_attribute class_device_attr_cpuaffinity; | 80 | extern struct class_device_attribute class_device_attr_cpuaffinity; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index d1d7333bb71b..e3c78c39b7e4 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -400,6 +400,7 @@ static void __devinit quirk_piix4_acpi(struct pci_dev *dev) | |||
400 | piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); | 400 | piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); |
401 | } | 401 | } |
402 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); | 402 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); |
403 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3, quirk_piix4_acpi ); | ||
403 | 404 | ||
404 | /* | 405 | /* |
405 | * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at | 406 | * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at |
@@ -682,6 +683,33 @@ static void __devinit quirk_vt82c598_id(struct pci_dev *dev) | |||
682 | } | 683 | } |
683 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); | 684 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); |
684 | 685 | ||
686 | #ifdef CONFIG_ACPI_SLEEP | ||
687 | |||
688 | /* | ||
689 | * Some VIA systems boot with the abnormal status flag set. This can cause | ||
690 | * the BIOS to re-POST the system on resume rather than passing control | ||
691 | * back to the OS. Clear the flag on boot | ||
692 | */ | ||
693 | static void __devinit quirk_via_abnormal_poweroff(struct pci_dev *dev) | ||
694 | { | ||
695 | u32 reg; | ||
696 | |||
697 | acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, | ||
698 | ®); | ||
699 | |||
700 | if (reg & 0x800) { | ||
701 | printk("Clearing abnormal poweroff flag\n"); | ||
702 | acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | ||
703 | ACPI_REGISTER_PM1_STATUS, | ||
704 | (u16)0x800); | ||
705 | } | ||
706 | } | ||
707 | |||
708 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_abnormal_poweroff); | ||
709 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_abnormal_poweroff); | ||
710 | |||
711 | #endif | ||
712 | |||
685 | /* | 713 | /* |
686 | * CardBus controllers have a legacy base address that enables them | 714 | * CardBus controllers have a legacy base address that enables them |
687 | * to respond as i82365 pcmcia controllers. We don't want them to | 715 | * to respond as i82365 pcmcia controllers. We don't want them to |
@@ -1174,6 +1202,55 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_ | |||
1174 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); | 1202 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); |
1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); | 1203 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); |
1176 | 1204 | ||
1205 | #if defined(CONFIG_SCSI_SATA) || defined(CONFIG_SCSI_SATA_MODULE) | ||
1206 | |||
1207 | /* | ||
1208 | * If we are using libata we can drive this chip properly but must | ||
1209 | * do this early on to make the additional device appear during | ||
1210 | * the PCI scanning. | ||
1211 | */ | ||
1212 | |||
1213 | static void __devinit quirk_jmicron_dualfn(struct pci_dev *pdev) | ||
1214 | { | ||
1215 | u32 conf; | ||
1216 | u8 hdr; | ||
1217 | |||
1218 | /* Only poke fn 0 */ | ||
1219 | if (PCI_FUNC(pdev->devfn)) | ||
1220 | return; | ||
1221 | |||
1222 | switch(pdev->device) { | ||
1223 | case PCI_DEVICE_ID_JMICRON_JMB365: | ||
1224 | case PCI_DEVICE_ID_JMICRON_JMB366: | ||
1225 | /* Redirect IDE second PATA port to the right spot */ | ||
1226 | pci_read_config_dword(pdev, 0x80, &conf); | ||
1227 | conf |= (1 << 24); | ||
1228 | /* Fall through */ | ||
1229 | pci_write_config_dword(pdev, 0x80, conf); | ||
1230 | case PCI_DEVICE_ID_JMICRON_JMB361: | ||
1231 | case PCI_DEVICE_ID_JMICRON_JMB363: | ||
1232 | pci_read_config_dword(pdev, 0x40, &conf); | ||
1233 | /* Enable dual function mode, AHCI on fn 0, IDE fn1 */ | ||
1234 | /* Set the class codes correctly and then direct IDE 0 */ | ||
1235 | conf &= ~0x000F0200; /* Clear bit 9 and 16-19 */ | ||
1236 | conf |= 0x00C20002; /* Set bit 1, 17, 22, 23 */ | ||
1237 | pci_write_config_dword(pdev, 0x40, conf); | ||
1238 | |||
1239 | /* Reconfigure so that the PCI scanner discovers the | ||
1240 | device is now multifunction */ | ||
1241 | |||
1242 | pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr); | ||
1243 | pdev->hdr_type = hdr & 0x7f; | ||
1244 | pdev->multifunction = !!(hdr & 0x80); | ||
1245 | |||
1246 | break; | ||
1247 | } | ||
1248 | } | ||
1249 | |||
1250 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, quirk_jmicron_dualfn); | ||
1251 | |||
1252 | #endif | ||
1253 | |||
1177 | #ifdef CONFIG_X86_IO_APIC | 1254 | #ifdef CONFIG_X86_IO_APIC |
1178 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) | 1255 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) |
1179 | { | 1256 | { |
@@ -1341,6 +1418,37 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0, quirk_pc | |||
1341 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); | 1418 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); |
1342 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); | 1419 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); |
1343 | 1420 | ||
1421 | /* | ||
1422 | * Some Intel PCI Express chipsets have trouble with downstream | ||
1423 | * device power management. | ||
1424 | */ | ||
1425 | static void quirk_intel_pcie_pm(struct pci_dev * dev) | ||
1426 | { | ||
1427 | pci_pm_d3_delay = 120; | ||
1428 | dev->no_d1d2 = 1; | ||
1429 | } | ||
1430 | |||
1431 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e2, quirk_intel_pcie_pm); | ||
1432 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e3, quirk_intel_pcie_pm); | ||
1433 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e4, quirk_intel_pcie_pm); | ||
1434 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e5, quirk_intel_pcie_pm); | ||
1435 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e6, quirk_intel_pcie_pm); | ||
1436 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e7, quirk_intel_pcie_pm); | ||
1437 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f7, quirk_intel_pcie_pm); | ||
1438 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f8, quirk_intel_pcie_pm); | ||
1439 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f9, quirk_intel_pcie_pm); | ||
1440 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25fa, quirk_intel_pcie_pm); | ||
1441 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2601, quirk_intel_pcie_pm); | ||
1442 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2602, quirk_intel_pcie_pm); | ||
1443 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2603, quirk_intel_pcie_pm); | ||
1444 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2604, quirk_intel_pcie_pm); | ||
1445 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2605, quirk_intel_pcie_pm); | ||
1446 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2606, quirk_intel_pcie_pm); | ||
1447 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2607, quirk_intel_pcie_pm); | ||
1448 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2608, quirk_intel_pcie_pm); | ||
1449 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); | ||
1450 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); | ||
1451 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); | ||
1344 | 1452 | ||
1345 | /* | 1453 | /* |
1346 | * Fixup the cardbus bridges on the IBM Dock II docking station | 1454 | * Fixup the cardbus bridges on the IBM Dock II docking station |
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index d7295386821c..7f6fdac74706 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -394,7 +394,7 @@ dasd_add_busid(char *bus_id, int features) | |||
394 | if (!new) | 394 | if (!new) |
395 | return ERR_PTR(-ENOMEM); | 395 | return ERR_PTR(-ENOMEM); |
396 | spin_lock(&dasd_devmap_lock); | 396 | spin_lock(&dasd_devmap_lock); |
397 | devmap = 0; | 397 | devmap = NULL; |
398 | hash = dasd_hash_busid(bus_id); | 398 | hash = dasd_hash_busid(bus_id); |
399 | list_for_each_entry(tmp, &dasd_hashlists[hash], list) | 399 | list_for_each_entry(tmp, &dasd_hashlists[hash], list) |
400 | if (strncmp(tmp->bus_id, bus_id, BUS_ID_SIZE) == 0) { | 400 | if (strncmp(tmp->bus_id, bus_id, BUS_ID_SIZE) == 0) { |
@@ -406,10 +406,10 @@ dasd_add_busid(char *bus_id, int features) | |||
406 | new->devindex = dasd_max_devindex++; | 406 | new->devindex = dasd_max_devindex++; |
407 | strncpy(new->bus_id, bus_id, BUS_ID_SIZE); | 407 | strncpy(new->bus_id, bus_id, BUS_ID_SIZE); |
408 | new->features = features; | 408 | new->features = features; |
409 | new->device = 0; | 409 | new->device = NULL; |
410 | list_add(&new->list, &dasd_hashlists[hash]); | 410 | list_add(&new->list, &dasd_hashlists[hash]); |
411 | devmap = new; | 411 | devmap = new; |
412 | new = 0; | 412 | new = NULL; |
413 | } | 413 | } |
414 | spin_unlock(&dasd_devmap_lock); | 414 | spin_unlock(&dasd_devmap_lock); |
415 | kfree(new); | 415 | kfree(new); |
@@ -479,7 +479,7 @@ dasd_device_from_devindex(int devindex) | |||
479 | int i; | 479 | int i; |
480 | 480 | ||
481 | spin_lock(&dasd_devmap_lock); | 481 | spin_lock(&dasd_devmap_lock); |
482 | devmap = 0; | 482 | devmap = NULL; |
483 | for (i = 0; (i < 256) && !devmap; i++) | 483 | for (i = 0; (i < 256) && !devmap; i++) |
484 | list_for_each_entry(tmp, &dasd_hashlists[i], list) | 484 | list_for_each_entry(tmp, &dasd_hashlists[i], list) |
485 | if (tmp->devindex == devindex) { | 485 | if (tmp->devindex == devindex) { |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 2e655f466743..39c2281371b5 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -65,16 +65,16 @@ struct dasd_eckd_private { | |||
65 | /* The ccw bus type uses this table to find devices that it sends to | 65 | /* The ccw bus type uses this table to find devices that it sends to |
66 | * dasd_eckd_probe */ | 66 | * dasd_eckd_probe */ |
67 | static struct ccw_device_id dasd_eckd_ids[] = { | 67 | static struct ccw_device_id dasd_eckd_ids[] = { |
68 | { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), driver_info: 0x1}, | 68 | { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3390, 0), .driver_info = 0x1}, |
69 | { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), driver_info: 0x2}, | 69 | { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3390, 0), .driver_info = 0x2}, |
70 | { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), driver_info: 0x3}, | 70 | { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3390, 0), .driver_info = 0x3}, |
71 | { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), driver_info: 0x4}, | 71 | { CCW_DEVICE_DEVTYPE (0x3990, 0, 0x3380, 0), .driver_info = 0x4}, |
72 | { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), driver_info: 0x5}, | 72 | { CCW_DEVICE_DEVTYPE (0x2105, 0, 0x3380, 0), .driver_info = 0x5}, |
73 | { CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), driver_info: 0x6}, | 73 | { CCW_DEVICE_DEVTYPE (0x9343, 0, 0x9345, 0), .driver_info = 0x6}, |
74 | { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3390, 0), driver_info: 0x7}, | 74 | { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3390, 0), .driver_info = 0x7}, |
75 | { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3380, 0), driver_info: 0x8}, | 75 | { CCW_DEVICE_DEVTYPE (0x2107, 0, 0x3380, 0), .driver_info = 0x8}, |
76 | { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3390, 0), driver_info: 0x9}, | 76 | { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3390, 0), .driver_info = 0x9}, |
77 | { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3380, 0), driver_info: 0xa}, | 77 | { CCW_DEVICE_DEVTYPE (0x1750, 0, 0x3380, 0), .driver_info = 0xa}, |
78 | { /* end of list */ }, | 78 | { /* end of list */ }, |
79 | }; | 79 | }; |
80 | 80 | ||
diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index 808434d38526..e85015be109b 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c | |||
@@ -44,8 +44,8 @@ struct dasd_fba_private { | |||
44 | }; | 44 | }; |
45 | 45 | ||
46 | static struct ccw_device_id dasd_fba_ids[] = { | 46 | static struct ccw_device_id dasd_fba_ids[] = { |
47 | { CCW_DEVICE_DEVTYPE (0x6310, 0, 0x9336, 0), driver_info: 0x1}, | 47 | { CCW_DEVICE_DEVTYPE (0x6310, 0, 0x9336, 0), .driver_info = 0x1}, |
48 | { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3370, 0), driver_info: 0x2}, | 48 | { CCW_DEVICE_DEVTYPE (0x3880, 0, 0x3370, 0), .driver_info = 0x2}, |
49 | { /* end of list */ }, | 49 | { /* end of list */ }, |
50 | }; | 50 | }; |
51 | 51 | ||
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index 12c7d296eaa8..4c272b70f41a 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c | |||
@@ -84,9 +84,9 @@ void | |||
84 | dasd_gendisk_free(struct dasd_device *device) | 84 | dasd_gendisk_free(struct dasd_device *device) |
85 | { | 85 | { |
86 | del_gendisk(device->gdp); | 86 | del_gendisk(device->gdp); |
87 | device->gdp->queue = 0; | 87 | device->gdp->queue = NULL; |
88 | put_disk(device->gdp); | 88 | put_disk(device->gdp); |
89 | device->gdp = 0; | 89 | device->gdp = NULL; |
90 | } | 90 | } |
91 | 91 | ||
92 | /* | 92 | /* |
@@ -136,7 +136,7 @@ dasd_destroy_partitions(struct dasd_device * device) | |||
136 | * device->bdev to lower the offline open_count limit again. | 136 | * device->bdev to lower the offline open_count limit again. |
137 | */ | 137 | */ |
138 | bdev = device->bdev; | 138 | bdev = device->bdev; |
139 | device->bdev = 0; | 139 | device->bdev = NULL; |
140 | 140 | ||
141 | /* | 141 | /* |
142 | * See fs/partition/check.c:delete_partition | 142 | * See fs/partition/check.c:delete_partition |
@@ -145,7 +145,7 @@ dasd_destroy_partitions(struct dasd_device * device) | |||
145 | */ | 145 | */ |
146 | memset(&bpart, 0, sizeof(struct blkpg_partition)); | 146 | memset(&bpart, 0, sizeof(struct blkpg_partition)); |
147 | memset(&barg, 0, sizeof(struct blkpg_ioctl_arg)); | 147 | memset(&barg, 0, sizeof(struct blkpg_ioctl_arg)); |
148 | barg.data = &bpart; | 148 | barg.data = (void __user *) &bpart; |
149 | barg.op = BLKPG_DEL_PARTITION; | 149 | barg.op = BLKPG_DEL_PARTITION; |
150 | for (bpart.pno = device->gdp->minors - 1; bpart.pno > 0; bpart.pno--) | 150 | for (bpart.pno = device->gdp->minors - 1; bpart.pno > 0; bpart.pno--) |
151 | ioctl_by_bdev(bdev, BLKPG, (unsigned long) &barg); | 151 | ioctl_by_bdev(bdev, BLKPG, (unsigned long) &barg); |
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index e97f5316ad2d..8fed3603e9ea 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
@@ -345,7 +345,7 @@ dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp) | |||
345 | if (bdev != bdev->bd_contains) | 345 | if (bdev != bdev->bd_contains) |
346 | // ro setting is not allowed for partitions | 346 | // ro setting is not allowed for partitions |
347 | return -EINVAL; | 347 | return -EINVAL; |
348 | if (get_user(intval, (int *)argp)) | 348 | if (get_user(intval, (int __user *)argp)) |
349 | return -EFAULT; | 349 | return -EFAULT; |
350 | 350 | ||
351 | set_disk_ro(bdev->bd_disk, intval); | 351 | set_disk_ro(bdev->bd_disk, intval); |
diff --git a/drivers/s390/block/xpram.c b/drivers/s390/block/xpram.c index 4c1e56b9b98d..4cd879cb9bdd 100644 --- a/drivers/s390/block/xpram.c +++ b/drivers/s390/block/xpram.c | |||
@@ -71,11 +71,11 @@ static int xpram_devs; | |||
71 | /* | 71 | /* |
72 | * Parameter parsing functions. | 72 | * Parameter parsing functions. |
73 | */ | 73 | */ |
74 | static int devs = XPRAM_DEVS; | 74 | static int __initdata devs = XPRAM_DEVS; |
75 | static unsigned int sizes[XPRAM_MAX_DEVS]; | 75 | static char __initdata *sizes[XPRAM_MAX_DEVS]; |
76 | 76 | ||
77 | module_param(devs, int, 0); | 77 | module_param(devs, int, 0); |
78 | module_param_array(sizes, int, NULL, 0); | 78 | module_param_array(sizes, charp, NULL, 0); |
79 | 79 | ||
80 | MODULE_PARM_DESC(devs, "number of devices (\"partitions\"), " \ | 80 | MODULE_PARM_DESC(devs, "number of devices (\"partitions\"), " \ |
81 | "the default is " __MODULE_STRING(XPRAM_DEVS) "\n"); | 81 | "the default is " __MODULE_STRING(XPRAM_DEVS) "\n"); |
@@ -86,59 +86,6 @@ MODULE_PARM_DESC(sizes, "list of device (partition) sizes " \ | |||
86 | "claimed by explicit sizes\n"); | 86 | "claimed by explicit sizes\n"); |
87 | MODULE_LICENSE("GPL"); | 87 | MODULE_LICENSE("GPL"); |
88 | 88 | ||
89 | #ifndef MODULE | ||
90 | /* | ||
91 | * Parses the kernel parameters given in the kernel parameter line. | ||
92 | * The expected format is | ||
93 | * <number_of_partitions>[","<partition_size>]* | ||
94 | * where | ||
95 | * devices is a positive integer that initializes xpram_devs | ||
96 | * each size is a non-negative integer possibly followed by a | ||
97 | * magnitude (k,K,m,M,g,G), the list of sizes initialises | ||
98 | * xpram_sizes | ||
99 | * | ||
100 | * Arguments | ||
101 | * str: substring of kernel parameter line that contains xprams | ||
102 | * kernel parameters. | ||
103 | * | ||
104 | * Result 0 on success, -EINVAL else -- only for Version > 2.3 | ||
105 | * | ||
106 | * Side effects | ||
107 | * the global variabls devs is set to the value of | ||
108 | * <number_of_partitions> and sizes[i] is set to the i-th | ||
109 | * partition size (if provided). A parsing error of a value | ||
110 | * results in this value being set to -EINVAL. | ||
111 | */ | ||
112 | static int __init xpram_setup (char *str) | ||
113 | { | ||
114 | char *cp; | ||
115 | int i; | ||
116 | |||
117 | devs = simple_strtoul(str, &cp, 10); | ||
118 | if (cp <= str || devs > XPRAM_MAX_DEVS) | ||
119 | return 0; | ||
120 | for (i = 0; (i < devs) && (*cp++ == ','); i++) { | ||
121 | sizes[i] = simple_strtoul(cp, &cp, 10); | ||
122 | if (*cp == 'g' || *cp == 'G') { | ||
123 | sizes[i] <<= 20; | ||
124 | cp++; | ||
125 | } else if (*cp == 'm' || *cp == 'M') { | ||
126 | sizes[i] <<= 10; | ||
127 | cp++; | ||
128 | } else if (*cp == 'k' || *cp == 'K') | ||
129 | cp++; | ||
130 | while (isspace(*cp)) cp++; | ||
131 | } | ||
132 | if (*cp == ',' && i >= devs) | ||
133 | PRINT_WARN("partition sizes list has too many entries.\n"); | ||
134 | else if (*cp != 0) | ||
135 | PRINT_WARN("ignored '%s' at end of parameter string.\n", cp); | ||
136 | return 1; | ||
137 | } | ||
138 | |||
139 | __setup("xpram_parts=", xpram_setup); | ||
140 | #endif | ||
141 | |||
142 | /* | 89 | /* |
143 | * Copy expanded memory page (4kB) into main memory | 90 | * Copy expanded memory page (4kB) into main memory |
144 | * Arguments | 91 | * Arguments |
@@ -374,7 +321,9 @@ static int __init xpram_setup_sizes(unsigned long pages) | |||
374 | mem_needed = 0; | 321 | mem_needed = 0; |
375 | mem_auto_no = 0; | 322 | mem_auto_no = 0; |
376 | for (i = 0; i < xpram_devs; i++) { | 323 | for (i = 0; i < xpram_devs; i++) { |
377 | xpram_sizes[i] = (sizes[i] + 3) & -4UL; | 324 | if (sizes[i]) |
325 | xpram_sizes[i] = | ||
326 | (memparse(sizes[i], &sizes[i]) + 3) & -4UL; | ||
378 | if (xpram_sizes[i]) | 327 | if (xpram_sizes[i]) |
379 | mem_needed += xpram_sizes[i]; | 328 | mem_needed += xpram_sizes[i]; |
380 | else | 329 | else |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index f25c6d116f6f..2fa566fa6da4 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
@@ -693,7 +693,7 @@ raw3215_probe (struct ccw_device *cdev) | |||
693 | GFP_KERNEL|GFP_DMA); | 693 | GFP_KERNEL|GFP_DMA); |
694 | if (raw->buffer == NULL) { | 694 | if (raw->buffer == NULL) { |
695 | spin_lock(&raw3215_device_lock); | 695 | spin_lock(&raw3215_device_lock); |
696 | raw3215[line] = 0; | 696 | raw3215[line] = NULL; |
697 | spin_unlock(&raw3215_device_lock); | 697 | spin_unlock(&raw3215_device_lock); |
698 | kfree(raw); | 698 | kfree(raw); |
699 | return -ENOMEM; | 699 | return -ENOMEM; |
diff --git a/drivers/s390/char/ctrlchar.c b/drivers/s390/char/ctrlchar.c index 0ea6f36a2527..d83eb6358bac 100644 --- a/drivers/s390/char/ctrlchar.c +++ b/drivers/s390/char/ctrlchar.c | |||
@@ -23,7 +23,7 @@ ctrlchar_handle_sysrq(void *tty) | |||
23 | handle_sysrq(ctrlchar_sysrq_key, NULL, (struct tty_struct *) tty); | 23 | handle_sysrq(ctrlchar_sysrq_key, NULL, (struct tty_struct *) tty); |
24 | } | 24 | } |
25 | 25 | ||
26 | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, 0); | 26 | static DECLARE_WORK(ctrlchar_work, ctrlchar_handle_sysrq, NULL); |
27 | #endif | 27 | #endif |
28 | 28 | ||
29 | 29 | ||
diff --git a/drivers/s390/char/defkeymap.c b/drivers/s390/char/defkeymap.c index ca15adb140d1..17027d918cf7 100644 --- a/drivers/s390/char/defkeymap.c +++ b/drivers/s390/char/defkeymap.c | |||
@@ -83,8 +83,8 @@ static u_short shift_ctrl_map[NR_KEYS] = { | |||
83 | }; | 83 | }; |
84 | 84 | ||
85 | ushort *key_maps[MAX_NR_KEYMAPS] = { | 85 | ushort *key_maps[MAX_NR_KEYMAPS] = { |
86 | plain_map, shift_map, 0, 0, | 86 | plain_map, shift_map, NULL, NULL, |
87 | ctrl_map, shift_ctrl_map, 0 | 87 | ctrl_map, shift_ctrl_map, NULL, |
88 | }; | 88 | }; |
89 | 89 | ||
90 | unsigned int keymap_count = 4; | 90 | unsigned int keymap_count = 4; |
@@ -145,7 +145,7 @@ char *func_table[MAX_NR_FUNC] = { | |||
145 | func_buf + 97, | 145 | func_buf + 97, |
146 | func_buf + 103, | 146 | func_buf + 103, |
147 | func_buf + 109, | 147 | func_buf + 109, |
148 | 0, | 148 | NULL, |
149 | }; | 149 | }; |
150 | 150 | ||
151 | struct kbdiacr accent_table[MAX_DIACR] = { | 151 | struct kbdiacr accent_table[MAX_DIACR] = { |
diff --git a/drivers/s390/char/fs3270.c b/drivers/s390/char/fs3270.c index 6099c14de429..ef004d089712 100644 --- a/drivers/s390/char/fs3270.c +++ b/drivers/s390/char/fs3270.c | |||
@@ -236,7 +236,7 @@ fs3270_irq(struct fs3270 *fp, struct raw3270_request *rq, struct irb *irb) | |||
236 | * Process reads from fullscreen 3270. | 236 | * Process reads from fullscreen 3270. |
237 | */ | 237 | */ |
238 | static ssize_t | 238 | static ssize_t |
239 | fs3270_read(struct file *filp, char *data, size_t count, loff_t *off) | 239 | fs3270_read(struct file *filp, char __user *data, size_t count, loff_t *off) |
240 | { | 240 | { |
241 | struct fs3270 *fp; | 241 | struct fs3270 *fp; |
242 | struct raw3270_request *rq; | 242 | struct raw3270_request *rq; |
@@ -281,7 +281,7 @@ fs3270_read(struct file *filp, char *data, size_t count, loff_t *off) | |||
281 | * Process writes to fullscreen 3270. | 281 | * Process writes to fullscreen 3270. |
282 | */ | 282 | */ |
283 | static ssize_t | 283 | static ssize_t |
284 | fs3270_write(struct file *filp, const char *data, size_t count, loff_t *off) | 284 | fs3270_write(struct file *filp, const char __user *data, size_t count, loff_t *off) |
285 | { | 285 | { |
286 | struct fs3270 *fp; | 286 | struct fs3270 *fp; |
287 | struct raw3270_request *rq; | 287 | struct raw3270_request *rq; |
@@ -338,10 +338,10 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
338 | fp->write_command = arg; | 338 | fp->write_command = arg; |
339 | break; | 339 | break; |
340 | case TUBGETI: | 340 | case TUBGETI: |
341 | rc = put_user(fp->read_command, (char *) arg); | 341 | rc = put_user(fp->read_command, (char __user *) arg); |
342 | break; | 342 | break; |
343 | case TUBGETO: | 343 | case TUBGETO: |
344 | rc = put_user(fp->write_command,(char *) arg); | 344 | rc = put_user(fp->write_command,(char __user *) arg); |
345 | break; | 345 | break; |
346 | case TUBGETMOD: | 346 | case TUBGETMOD: |
347 | iocb.model = fp->view.model; | 347 | iocb.model = fp->view.model; |
@@ -350,7 +350,7 @@ fs3270_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
350 | iocb.pf_cnt = 24; | 350 | iocb.pf_cnt = 24; |
351 | iocb.re_cnt = 20; | 351 | iocb.re_cnt = 20; |
352 | iocb.map = 0; | 352 | iocb.map = 0; |
353 | if (copy_to_user((char *) arg, &iocb, | 353 | if (copy_to_user((char __user *) arg, &iocb, |
354 | sizeof(struct raw3270_iocb))) | 354 | sizeof(struct raw3270_iocb))) |
355 | rc = -EFAULT; | 355 | rc = -EFAULT; |
356 | break; | 356 | break; |
@@ -479,7 +479,7 @@ fs3270_close(struct inode *inode, struct file *filp) | |||
479 | struct fs3270 *fp; | 479 | struct fs3270 *fp; |
480 | 480 | ||
481 | fp = filp->private_data; | 481 | fp = filp->private_data; |
482 | filp->private_data = 0; | 482 | filp->private_data = NULL; |
483 | if (fp) { | 483 | if (fp) { |
484 | fp->fs_pid = 0; | 484 | fp->fs_pid = 0; |
485 | raw3270_reset(&fp->view); | 485 | raw3270_reset(&fp->view); |
diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 547ef906ae2c..3be06569180d 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c | |||
@@ -103,7 +103,7 @@ out_maps: | |||
103 | out_kbd: | 103 | out_kbd: |
104 | kfree(kbd); | 104 | kfree(kbd); |
105 | out: | 105 | out: |
106 | return 0; | 106 | return NULL; |
107 | } | 107 | } |
108 | 108 | ||
109 | void | 109 | void |
@@ -304,7 +304,7 @@ kbd_keycode(struct kbd_data *kbd, unsigned int keycode) | |||
304 | if (kbd->sysrq) { | 304 | if (kbd->sysrq) { |
305 | if (kbd->sysrq == K(KT_LATIN, '-')) { | 305 | if (kbd->sysrq == K(KT_LATIN, '-')) { |
306 | kbd->sysrq = 0; | 306 | kbd->sysrq = 0; |
307 | handle_sysrq(value, 0, kbd->tty); | 307 | handle_sysrq(value, NULL, kbd->tty); |
308 | return; | 308 | return; |
309 | } | 309 | } |
310 | if (value == '-') { | 310 | if (value == '-') { |
@@ -363,7 +363,7 @@ do_kdsk_ioctl(struct kbd_data *kbd, struct kbentry __user *user_kbe, | |||
363 | /* disallocate map */ | 363 | /* disallocate map */ |
364 | key_map = kbd->key_maps[tmp.kb_table]; | 364 | key_map = kbd->key_maps[tmp.kb_table]; |
365 | if (key_map) { | 365 | if (key_map) { |
366 | kbd->key_maps[tmp.kb_table] = 0; | 366 | kbd->key_maps[tmp.kb_table] = NULL; |
367 | kfree(key_map); | 367 | kfree(key_map); |
368 | } | 368 | } |
369 | break; | 369 | break; |
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index e95b56f810db..95e285b2e25c 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
@@ -555,7 +555,7 @@ raw3270_start_init(struct raw3270 *rp, struct raw3270_view *view, | |||
555 | #ifdef CONFIG_TN3270_CONSOLE | 555 | #ifdef CONFIG_TN3270_CONSOLE |
556 | if (raw3270_registered == 0) { | 556 | if (raw3270_registered == 0) { |
557 | spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); | 557 | spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags); |
558 | rq->callback = 0; | 558 | rq->callback = NULL; |
559 | rc = __raw3270_start(rp, view, rq); | 559 | rc = __raw3270_start(rp, view, rq); |
560 | if (rc == 0) | 560 | if (rc == 0) |
561 | while (!raw3270_request_final(rq)) { | 561 | while (!raw3270_request_final(rq)) { |
@@ -719,8 +719,8 @@ raw3270_size_device(struct raw3270 *rp) | |||
719 | rc = __raw3270_size_device_vm(rp); | 719 | rc = __raw3270_size_device_vm(rp); |
720 | else | 720 | else |
721 | rc = __raw3270_size_device(rp); | 721 | rc = __raw3270_size_device(rp); |
722 | raw3270_init_view.dev = 0; | 722 | raw3270_init_view.dev = NULL; |
723 | rp->view = 0; | 723 | rp->view = NULL; |
724 | up(&raw3270_init_sem); | 724 | up(&raw3270_init_sem); |
725 | if (rc == 0) { /* Found something. */ | 725 | if (rc == 0) { /* Found something. */ |
726 | /* Try to find a model. */ | 726 | /* Try to find a model. */ |
@@ -761,8 +761,8 @@ raw3270_reset_device(struct raw3270 *rp) | |||
761 | rp->view = &raw3270_init_view; | 761 | rp->view = &raw3270_init_view; |
762 | raw3270_init_view.dev = rp; | 762 | raw3270_init_view.dev = rp; |
763 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); | 763 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); |
764 | raw3270_init_view.dev = 0; | 764 | raw3270_init_view.dev = NULL; |
765 | rp->view = 0; | 765 | rp->view = NULL; |
766 | up(&raw3270_init_sem); | 766 | up(&raw3270_init_sem); |
767 | return rc; | 767 | return rc; |
768 | } | 768 | } |
@@ -934,7 +934,7 @@ raw3270_activate_view(struct raw3270_view *view) | |||
934 | else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) | 934 | else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags)) |
935 | rc = -ENODEV; | 935 | rc = -ENODEV; |
936 | else { | 936 | else { |
937 | oldview = 0; | 937 | oldview = NULL; |
938 | if (rp->view) { | 938 | if (rp->view) { |
939 | oldview = rp->view; | 939 | oldview = rp->view; |
940 | oldview->fn->deactivate(oldview); | 940 | oldview->fn->deactivate(oldview); |
@@ -951,7 +951,7 @@ raw3270_activate_view(struct raw3270_view *view) | |||
951 | rp->view = nv; | 951 | rp->view = nv; |
952 | if (nv->fn->activate(nv) == 0) | 952 | if (nv->fn->activate(nv) == 0) |
953 | break; | 953 | break; |
954 | rp->view = 0; | 954 | rp->view = NULL; |
955 | } | 955 | } |
956 | } | 956 | } |
957 | } | 957 | } |
@@ -975,7 +975,7 @@ raw3270_deactivate_view(struct raw3270_view *view) | |||
975 | spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); | 975 | spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); |
976 | if (rp->view == view) { | 976 | if (rp->view == view) { |
977 | view->fn->deactivate(view); | 977 | view->fn->deactivate(view); |
978 | rp->view = 0; | 978 | rp->view = NULL; |
979 | /* Move deactivated view to end of list. */ | 979 | /* Move deactivated view to end of list. */ |
980 | list_del_init(&view->list); | 980 | list_del_init(&view->list); |
981 | list_add_tail(&view->list, &rp->view_list); | 981 | list_add_tail(&view->list, &rp->view_list); |
@@ -985,7 +985,7 @@ raw3270_deactivate_view(struct raw3270_view *view) | |||
985 | rp->view = view; | 985 | rp->view = view; |
986 | if (view->fn->activate(view) == 0) | 986 | if (view->fn->activate(view) == 0) |
987 | break; | 987 | break; |
988 | rp->view = 0; | 988 | rp->view = NULL; |
989 | } | 989 | } |
990 | } | 990 | } |
991 | } | 991 | } |
@@ -1076,7 +1076,7 @@ raw3270_del_view(struct raw3270_view *view) | |||
1076 | spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); | 1076 | spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); |
1077 | if (rp->view == view) { | 1077 | if (rp->view == view) { |
1078 | view->fn->deactivate(view); | 1078 | view->fn->deactivate(view); |
1079 | rp->view = 0; | 1079 | rp->view = NULL; |
1080 | } | 1080 | } |
1081 | list_del_init(&view->list); | 1081 | list_del_init(&view->list); |
1082 | if (!rp->view && test_bit(RAW3270_FLAGS_READY, &rp->flags)) { | 1082 | if (!rp->view && test_bit(RAW3270_FLAGS_READY, &rp->flags)) { |
@@ -1117,9 +1117,9 @@ raw3270_delete_device(struct raw3270 *rp) | |||
1117 | 1117 | ||
1118 | /* Disconnect from ccw_device. */ | 1118 | /* Disconnect from ccw_device. */ |
1119 | cdev = rp->cdev; | 1119 | cdev = rp->cdev; |
1120 | rp->cdev = 0; | 1120 | rp->cdev = NULL; |
1121 | cdev->dev.driver_data = 0; | 1121 | cdev->dev.driver_data = NULL; |
1122 | cdev->handler = 0; | 1122 | cdev->handler = NULL; |
1123 | 1123 | ||
1124 | /* Put ccw_device structure. */ | 1124 | /* Put ccw_device structure. */ |
1125 | put_device(&cdev->dev); | 1125 | put_device(&cdev->dev); |
@@ -1144,7 +1144,7 @@ raw3270_model_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
1144 | return snprintf(buf, PAGE_SIZE, "%i\n", | 1144 | return snprintf(buf, PAGE_SIZE, "%i\n", |
1145 | ((struct raw3270 *) dev->driver_data)->model); | 1145 | ((struct raw3270 *) dev->driver_data)->model); |
1146 | } | 1146 | } |
1147 | static DEVICE_ATTR(model, 0444, raw3270_model_show, 0); | 1147 | static DEVICE_ATTR(model, 0444, raw3270_model_show, NULL); |
1148 | 1148 | ||
1149 | static ssize_t | 1149 | static ssize_t |
1150 | raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf) | 1150 | raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf) |
@@ -1152,7 +1152,7 @@ raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
1152 | return snprintf(buf, PAGE_SIZE, "%i\n", | 1152 | return snprintf(buf, PAGE_SIZE, "%i\n", |
1153 | ((struct raw3270 *) dev->driver_data)->rows); | 1153 | ((struct raw3270 *) dev->driver_data)->rows); |
1154 | } | 1154 | } |
1155 | static DEVICE_ATTR(rows, 0444, raw3270_rows_show, 0); | 1155 | static DEVICE_ATTR(rows, 0444, raw3270_rows_show, NULL); |
1156 | 1156 | ||
1157 | static ssize_t | 1157 | static ssize_t |
1158 | raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *buf) | 1158 | raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *buf) |
@@ -1160,7 +1160,7 @@ raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *bu | |||
1160 | return snprintf(buf, PAGE_SIZE, "%i\n", | 1160 | return snprintf(buf, PAGE_SIZE, "%i\n", |
1161 | ((struct raw3270 *) dev->driver_data)->cols); | 1161 | ((struct raw3270 *) dev->driver_data)->cols); |
1162 | } | 1162 | } |
1163 | static DEVICE_ATTR(columns, 0444, raw3270_columns_show, 0); | 1163 | static DEVICE_ATTR(columns, 0444, raw3270_columns_show, NULL); |
1164 | 1164 | ||
1165 | static struct attribute * raw3270_attrs[] = { | 1165 | static struct attribute * raw3270_attrs[] = { |
1166 | &dev_attr_model.attr, | 1166 | &dev_attr_model.attr, |
@@ -1296,7 +1296,7 @@ raw3270_remove (struct ccw_device *cdev) | |||
1296 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); | 1296 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); |
1297 | if (rp->view) { | 1297 | if (rp->view) { |
1298 | rp->view->fn->deactivate(rp->view); | 1298 | rp->view->fn->deactivate(rp->view); |
1299 | rp->view = 0; | 1299 | rp->view = NULL; |
1300 | } | 1300 | } |
1301 | while (!list_empty(&rp->view_list)) { | 1301 | while (!list_empty(&rp->view_list)) { |
1302 | v = list_entry(rp->view_list.next, struct raw3270_view, list); | 1302 | v = list_entry(rp->view_list.next, struct raw3270_view, list); |
diff --git a/drivers/s390/char/raw3270.h b/drivers/s390/char/raw3270.h index b635bf8e7775..90beaa80a782 100644 --- a/drivers/s390/char/raw3270.h +++ b/drivers/s390/char/raw3270.h | |||
@@ -231,7 +231,7 @@ alloc_string(struct list_head *free_list, unsigned long len) | |||
231 | INIT_LIST_HEAD(&cs->update); | 231 | INIT_LIST_HEAD(&cs->update); |
232 | return cs; | 232 | return cs; |
233 | } | 233 | } |
234 | return 0; | 234 | return NULL; |
235 | } | 235 | } |
236 | 236 | ||
237 | static inline unsigned long | 237 | static inline unsigned long |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index 48b4d30a7256..7b95dab913d0 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
@@ -1309,9 +1309,9 @@ static struct tape_discipline tape_discipline_34xx = { | |||
1309 | }; | 1309 | }; |
1310 | 1310 | ||
1311 | static struct ccw_device_id tape_34xx_ids[] = { | 1311 | static struct ccw_device_id tape_34xx_ids[] = { |
1312 | { CCW_DEVICE_DEVTYPE(0x3480, 0, 0x3480, 0), driver_info: tape_3480}, | 1312 | { CCW_DEVICE_DEVTYPE(0x3480, 0, 0x3480, 0), .driver_info = tape_3480}, |
1313 | { CCW_DEVICE_DEVTYPE(0x3490, 0, 0x3490, 0), driver_info: tape_3490}, | 1313 | { CCW_DEVICE_DEVTYPE(0x3490, 0, 0x3490, 0), .driver_info = tape_3490}, |
1314 | { /* end of list */ } | 1314 | { /* end of list */ }, |
1315 | }; | 1315 | }; |
1316 | 1316 | ||
1317 | static int | 1317 | static int |
diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c index f496f236b9c0..29718042c6c9 100644 --- a/drivers/s390/char/tty3270.c +++ b/drivers/s390/char/tty3270.c | |||
@@ -437,7 +437,7 @@ tty3270_rcl_add(struct tty3270 *tp, char *input, int len) | |||
437 | { | 437 | { |
438 | struct string *s; | 438 | struct string *s; |
439 | 439 | ||
440 | tp->rcl_walk = 0; | 440 | tp->rcl_walk = NULL; |
441 | if (len <= 0) | 441 | if (len <= 0) |
442 | return; | 442 | return; |
443 | if (tp->rcl_nr >= tp->rcl_max) { | 443 | if (tp->rcl_nr >= tp->rcl_max) { |
@@ -466,12 +466,12 @@ tty3270_rcl_backward(struct kbd_data *kbd) | |||
466 | else if (!list_empty(&tp->rcl_lines)) | 466 | else if (!list_empty(&tp->rcl_lines)) |
467 | tp->rcl_walk = tp->rcl_lines.prev; | 467 | tp->rcl_walk = tp->rcl_lines.prev; |
468 | s = tp->rcl_walk ? | 468 | s = tp->rcl_walk ? |
469 | list_entry(tp->rcl_walk, struct string, list) : 0; | 469 | list_entry(tp->rcl_walk, struct string, list) : NULL; |
470 | if (tp->rcl_walk) { | 470 | if (tp->rcl_walk) { |
471 | s = list_entry(tp->rcl_walk, struct string, list); | 471 | s = list_entry(tp->rcl_walk, struct string, list); |
472 | tty3270_update_prompt(tp, s->string, s->len); | 472 | tty3270_update_prompt(tp, s->string, s->len); |
473 | } else | 473 | } else |
474 | tty3270_update_prompt(tp, 0, 0); | 474 | tty3270_update_prompt(tp, NULL, 0); |
475 | tty3270_set_timer(tp, 1); | 475 | tty3270_set_timer(tp, 1); |
476 | } | 476 | } |
477 | spin_unlock_bh(&tp->view.lock); | 477 | spin_unlock_bh(&tp->view.lock); |
@@ -553,7 +553,7 @@ tty3270_read_tasklet(struct raw3270_request *rrq) | |||
553 | * has to be emitted to the tty and for 0x6d the screen | 553 | * has to be emitted to the tty and for 0x6d the screen |
554 | * needs to be redrawn. | 554 | * needs to be redrawn. |
555 | */ | 555 | */ |
556 | input = 0; | 556 | input = NULL; |
557 | len = 0; | 557 | len = 0; |
558 | if (tp->input->string[0] == 0x7d) { | 558 | if (tp->input->string[0] == 0x7d) { |
559 | /* Enter: write input to tty. */ | 559 | /* Enter: write input to tty. */ |
@@ -567,7 +567,7 @@ tty3270_read_tasklet(struct raw3270_request *rrq) | |||
567 | tty3270_update_status(tp); | 567 | tty3270_update_status(tp); |
568 | } | 568 | } |
569 | /* Clear input area. */ | 569 | /* Clear input area. */ |
570 | tty3270_update_prompt(tp, 0, 0); | 570 | tty3270_update_prompt(tp, NULL, 0); |
571 | tty3270_set_timer(tp, 1); | 571 | tty3270_set_timer(tp, 1); |
572 | } else if (tp->input->string[0] == 0x6d) { | 572 | } else if (tp->input->string[0] == 0x6d) { |
573 | /* Display has been cleared. Redraw. */ | 573 | /* Display has been cleared. Redraw. */ |
@@ -808,8 +808,8 @@ tty3270_release(struct raw3270_view *view) | |||
808 | tp = (struct tty3270 *) view; | 808 | tp = (struct tty3270 *) view; |
809 | tty = tp->tty; | 809 | tty = tp->tty; |
810 | if (tty) { | 810 | if (tty) { |
811 | tty->driver_data = 0; | 811 | tty->driver_data = NULL; |
812 | tp->tty = tp->kbd->tty = 0; | 812 | tp->tty = tp->kbd->tty = NULL; |
813 | tty_hangup(tty); | 813 | tty_hangup(tty); |
814 | raw3270_put_view(&tp->view); | 814 | raw3270_put_view(&tp->view); |
815 | } | 815 | } |
@@ -948,8 +948,8 @@ tty3270_close(struct tty_struct *tty, struct file * filp) | |||
948 | return; | 948 | return; |
949 | tp = (struct tty3270 *) tty->driver_data; | 949 | tp = (struct tty3270 *) tty->driver_data; |
950 | if (tp) { | 950 | if (tp) { |
951 | tty->driver_data = 0; | 951 | tty->driver_data = NULL; |
952 | tp->tty = tp->kbd->tty = 0; | 952 | tp->tty = tp->kbd->tty = NULL; |
953 | raw3270_put_view(&tp->view); | 953 | raw3270_put_view(&tp->view); |
954 | } | 954 | } |
955 | } | 955 | } |
@@ -1673,7 +1673,7 @@ tty3270_set_termios(struct tty_struct *tty, struct termios *old) | |||
1673 | new = L_ECHO(tty) ? TF_INPUT: TF_INPUTN; | 1673 | new = L_ECHO(tty) ? TF_INPUT: TF_INPUTN; |
1674 | if (new != tp->inattr) { | 1674 | if (new != tp->inattr) { |
1675 | tp->inattr = new; | 1675 | tp->inattr = new; |
1676 | tty3270_update_prompt(tp, 0, 0); | 1676 | tty3270_update_prompt(tp, NULL, 0); |
1677 | tty3270_set_timer(tp, 1); | 1677 | tty3270_set_timer(tp, 1); |
1678 | } | 1678 | } |
1679 | } | 1679 | } |
@@ -1759,7 +1759,7 @@ void | |||
1759 | tty3270_notifier(int index, int active) | 1759 | tty3270_notifier(int index, int active) |
1760 | { | 1760 | { |
1761 | if (active) | 1761 | if (active) |
1762 | tty_register_device(tty3270_driver, index, 0); | 1762 | tty_register_device(tty3270_driver, index, NULL); |
1763 | else | 1763 | else |
1764 | tty_unregister_device(tty3270_driver, index); | 1764 | tty_unregister_device(tty3270_driver, index); |
1765 | } | 1765 | } |
@@ -1818,7 +1818,7 @@ tty3270_exit(void) | |||
1818 | 1818 | ||
1819 | raw3270_unregister_notifier(tty3270_notifier); | 1819 | raw3270_unregister_notifier(tty3270_notifier); |
1820 | driver = tty3270_driver; | 1820 | driver = tty3270_driver; |
1821 | tty3270_driver = 0; | 1821 | tty3270_driver = NULL; |
1822 | tty_unregister_driver(driver); | 1822 | tty_unregister_driver(driver); |
1823 | tty3270_del_views(); | 1823 | tty3270_del_views(); |
1824 | } | 1824 | } |
diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c index c625b69ebd19..6cb23040954b 100644 --- a/drivers/s390/char/vmlogrdr.c +++ b/drivers/s390/char/vmlogrdr.c | |||
@@ -86,8 +86,8 @@ struct vmlogrdr_priv_t { | |||
86 | */ | 86 | */ |
87 | static int vmlogrdr_open(struct inode *, struct file *); | 87 | static int vmlogrdr_open(struct inode *, struct file *); |
88 | static int vmlogrdr_release(struct inode *, struct file *); | 88 | static int vmlogrdr_release(struct inode *, struct file *); |
89 | static ssize_t vmlogrdr_read (struct file *filp, char *data, size_t count, | 89 | static ssize_t vmlogrdr_read (struct file *filp, char __user *data, |
90 | loff_t * ppos); | 90 | size_t count, loff_t * ppos); |
91 | 91 | ||
92 | static struct file_operations vmlogrdr_fops = { | 92 | static struct file_operations vmlogrdr_fops = { |
93 | .owner = THIS_MODULE, | 93 | .owner = THIS_MODULE, |
@@ -515,7 +515,7 @@ vmlogrdr_receive_data(struct vmlogrdr_priv_t *priv) { | |||
515 | 515 | ||
516 | 516 | ||
517 | static ssize_t | 517 | static ssize_t |
518 | vmlogrdr_read (struct file *filp, char *data, size_t count, loff_t * ppos) | 518 | vmlogrdr_read(struct file *filp, char __user *data, size_t count, loff_t * ppos) |
519 | { | 519 | { |
520 | int rc; | 520 | int rc; |
521 | struct vmlogrdr_priv_t * priv = filp->private_data; | 521 | struct vmlogrdr_priv_t * priv = filp->private_data; |
diff --git a/drivers/s390/char/vmwatchdog.c b/drivers/s390/char/vmwatchdog.c index 5acc0ace3d7d..807320a41fa4 100644 --- a/drivers/s390/char/vmwatchdog.c +++ b/drivers/s390/char/vmwatchdog.c | |||
@@ -193,7 +193,7 @@ static int vmwdt_ioctl(struct inode *i, struct file *f, | |||
193 | return 0; | 193 | return 0; |
194 | case WDIOC_GETSTATUS: | 194 | case WDIOC_GETSTATUS: |
195 | case WDIOC_GETBOOTSTATUS: | 195 | case WDIOC_GETBOOTSTATUS: |
196 | return put_user(0, (int *)arg); | 196 | return put_user(0, (int __user *)arg); |
197 | case WDIOC_GETTEMP: | 197 | case WDIOC_GETTEMP: |
198 | return -EINVAL; | 198 | return -EINVAL; |
199 | case WDIOC_SETOPTIONS: | 199 | case WDIOC_SETOPTIONS: |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index c7319a07ba35..f26a2ee3aad8 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -319,7 +319,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
319 | if (!try_module_get(gdrv->owner)) | 319 | if (!try_module_get(gdrv->owner)) |
320 | return -EINVAL; | 320 | return -EINVAL; |
321 | 321 | ||
322 | value = simple_strtoul(buf, 0, 0); | 322 | value = simple_strtoul(buf, NULL, 0); |
323 | ret = count; | 323 | ret = count; |
324 | if (value == 1) | 324 | if (value == 1) |
325 | ccwgroup_set_online(gdev); | 325 | ccwgroup_set_online(gdev); |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index a01f3bba4a7b..61ce3f1d5228 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -1464,6 +1464,40 @@ chsc_get_chp_desc(struct subchannel *sch, int chp_no) | |||
1464 | return desc; | 1464 | return desc; |
1465 | } | 1465 | } |
1466 | 1466 | ||
1467 | static int reset_channel_path(struct channel_path *chp) | ||
1468 | { | ||
1469 | int cc; | ||
1470 | |||
1471 | cc = rchp(chp->id); | ||
1472 | switch (cc) { | ||
1473 | case 0: | ||
1474 | return 0; | ||
1475 | case 2: | ||
1476 | return -EBUSY; | ||
1477 | default: | ||
1478 | return -ENODEV; | ||
1479 | } | ||
1480 | } | ||
1481 | |||
1482 | static void reset_channel_paths_css(struct channel_subsystem *css) | ||
1483 | { | ||
1484 | int i; | ||
1485 | |||
1486 | for (i = 0; i <= __MAX_CHPID; i++) { | ||
1487 | if (css->chps[i]) | ||
1488 | reset_channel_path(css->chps[i]); | ||
1489 | } | ||
1490 | } | ||
1491 | |||
1492 | void cio_reset_channel_paths(void) | ||
1493 | { | ||
1494 | int i; | ||
1495 | |||
1496 | for (i = 0; i <= __MAX_CSSID; i++) { | ||
1497 | if (css[i] && css[i]->valid) | ||
1498 | reset_channel_paths_css(css[i]); | ||
1499 | } | ||
1500 | } | ||
1467 | 1501 | ||
1468 | static int __init | 1502 | static int __init |
1469 | chsc_alloc_sei_area(void) | 1503 | chsc_alloc_sei_area(void) |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 6fec90eab00e..89320c1ad825 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -519,6 +519,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
519 | memset(sch, 0, sizeof(struct subchannel)); | 519 | memset(sch, 0, sizeof(struct subchannel)); |
520 | 520 | ||
521 | spin_lock_init(&sch->lock); | 521 | spin_lock_init(&sch->lock); |
522 | mutex_init(&sch->reg_mutex); | ||
522 | 523 | ||
523 | /* Set a name for the subchannel */ | 524 | /* Set a name for the subchannel */ |
524 | snprintf (sch->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", schid.ssid, | 525 | snprintf (sch->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", schid.ssid, |
@@ -797,7 +798,7 @@ struct subchannel * | |||
797 | cio_get_console_subchannel(void) | 798 | cio_get_console_subchannel(void) |
798 | { | 799 | { |
799 | if (!console_subchannel_in_use) | 800 | if (!console_subchannel_in_use) |
800 | return 0; | 801 | return NULL; |
801 | return &console_subchannel; | 802 | return &console_subchannel; |
802 | } | 803 | } |
803 | 804 | ||
@@ -875,5 +876,6 @@ void | |||
875 | reipl(unsigned long devno) | 876 | reipl(unsigned long devno) |
876 | { | 877 | { |
877 | clear_all_subchannels(); | 878 | clear_all_subchannels(); |
879 | cio_reset_channel_paths(); | ||
878 | do_reipl(devno); | 880 | do_reipl(devno); |
879 | } | 881 | } |
diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h index 0ca987344e07..4541c1af4b66 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define S390_CIO_H | 2 | #define S390_CIO_H |
3 | 3 | ||
4 | #include "schid.h" | 4 | #include "schid.h" |
5 | #include <linux/mutex.h> | ||
5 | 6 | ||
6 | /* | 7 | /* |
7 | * where we put the ssd info | 8 | * where we put the ssd info |
@@ -87,7 +88,7 @@ struct orb { | |||
87 | struct subchannel { | 88 | struct subchannel { |
88 | struct subchannel_id schid; | 89 | struct subchannel_id schid; |
89 | spinlock_t lock; /* subchannel lock */ | 90 | spinlock_t lock; /* subchannel lock */ |
90 | 91 | struct mutex reg_mutex; | |
91 | enum { | 92 | enum { |
92 | SUBCHANNEL_TYPE_IO = 0, | 93 | SUBCHANNEL_TYPE_IO = 0, |
93 | SUBCHANNEL_TYPE_CHSC = 1, | 94 | SUBCHANNEL_TYPE_CHSC = 1, |
diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index 1c3e8e9012b0..0df3af1f08de 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c | |||
@@ -1140,7 +1140,7 @@ static struct attribute *cmf_attributes[] = { | |||
1140 | &dev_attr_avg_device_disconnect_time.attr, | 1140 | &dev_attr_avg_device_disconnect_time.attr, |
1141 | &dev_attr_avg_control_unit_queuing_time.attr, | 1141 | &dev_attr_avg_control_unit_queuing_time.attr, |
1142 | &dev_attr_avg_device_active_only_time.attr, | 1142 | &dev_attr_avg_device_active_only_time.attr, |
1143 | 0, | 1143 | NULL, |
1144 | }; | 1144 | }; |
1145 | 1145 | ||
1146 | static struct attribute_group cmf_attr_group = { | 1146 | static struct attribute_group cmf_attr_group = { |
@@ -1160,7 +1160,7 @@ static struct attribute *cmf_attributes_ext[] = { | |||
1160 | &dev_attr_avg_device_active_only_time.attr, | 1160 | &dev_attr_avg_device_active_only_time.attr, |
1161 | &dev_attr_avg_device_busy_time.attr, | 1161 | &dev_attr_avg_device_busy_time.attr, |
1162 | &dev_attr_avg_initial_command_response_time.attr, | 1162 | &dev_attr_avg_initial_command_response_time.attr, |
1163 | 0, | 1163 | NULL, |
1164 | }; | 1164 | }; |
1165 | 1165 | ||
1166 | static struct attribute_group cmf_attr_group_ext = { | 1166 | static struct attribute_group cmf_attr_group_ext = { |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 1d3be80797f8..13eeea3d547f 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -108,6 +108,24 @@ css_subchannel_release(struct device *dev) | |||
108 | 108 | ||
109 | extern int css_get_ssd_info(struct subchannel *sch); | 109 | extern int css_get_ssd_info(struct subchannel *sch); |
110 | 110 | ||
111 | |||
112 | int css_sch_device_register(struct subchannel *sch) | ||
113 | { | ||
114 | int ret; | ||
115 | |||
116 | mutex_lock(&sch->reg_mutex); | ||
117 | ret = device_register(&sch->dev); | ||
118 | mutex_unlock(&sch->reg_mutex); | ||
119 | return ret; | ||
120 | } | ||
121 | |||
122 | void css_sch_device_unregister(struct subchannel *sch) | ||
123 | { | ||
124 | mutex_lock(&sch->reg_mutex); | ||
125 | device_unregister(&sch->dev); | ||
126 | mutex_unlock(&sch->reg_mutex); | ||
127 | } | ||
128 | |||
111 | static int | 129 | static int |
112 | css_register_subchannel(struct subchannel *sch) | 130 | css_register_subchannel(struct subchannel *sch) |
113 | { | 131 | { |
@@ -119,7 +137,7 @@ css_register_subchannel(struct subchannel *sch) | |||
119 | sch->dev.release = &css_subchannel_release; | 137 | sch->dev.release = &css_subchannel_release; |
120 | 138 | ||
121 | /* make it known to the system */ | 139 | /* make it known to the system */ |
122 | ret = device_register(&sch->dev); | 140 | ret = css_sch_device_register(sch); |
123 | if (ret) | 141 | if (ret) |
124 | printk (KERN_WARNING "%s: could not register %s\n", | 142 | printk (KERN_WARNING "%s: could not register %s\n", |
125 | __func__, sch->dev.bus_id); | 143 | __func__, sch->dev.bus_id); |
@@ -250,7 +268,7 @@ css_evaluate_subchannel(struct subchannel_id schid, int slow) | |||
250 | * The device will be killed automatically. | 268 | * The device will be killed automatically. |
251 | */ | 269 | */ |
252 | cio_disable_subchannel(sch); | 270 | cio_disable_subchannel(sch); |
253 | device_unregister(&sch->dev); | 271 | css_sch_device_unregister(sch); |
254 | /* Reset intparm to zeroes. */ | 272 | /* Reset intparm to zeroes. */ |
255 | sch->schib.pmcw.intparm = 0; | 273 | sch->schib.pmcw.intparm = 0; |
256 | cio_modify(sch); | 274 | cio_modify(sch); |
@@ -264,7 +282,7 @@ css_evaluate_subchannel(struct subchannel_id schid, int slow) | |||
264 | * away in any case. | 282 | * away in any case. |
265 | */ | 283 | */ |
266 | if (!disc) { | 284 | if (!disc) { |
267 | device_unregister(&sch->dev); | 285 | css_sch_device_unregister(sch); |
268 | /* Reset intparm to zeroes. */ | 286 | /* Reset intparm to zeroes. */ |
269 | sch->schib.pmcw.intparm = 0; | 287 | sch->schib.pmcw.intparm = 0; |
270 | cio_modify(sch); | 288 | cio_modify(sch); |
@@ -605,9 +623,13 @@ init_channel_subsystem (void) | |||
605 | ret = device_register(&css[i]->device); | 623 | ret = device_register(&css[i]->device); |
606 | if (ret) | 624 | if (ret) |
607 | goto out_free; | 625 | goto out_free; |
608 | if (css_characteristics_avail && css_chsc_characteristics.secm) | 626 | if (css_characteristics_avail && |
609 | device_create_file(&css[i]->device, | 627 | css_chsc_characteristics.secm) { |
610 | &dev_attr_cm_enable); | 628 | ret = device_create_file(&css[i]->device, |
629 | &dev_attr_cm_enable); | ||
630 | if (ret) | ||
631 | goto out_device; | ||
632 | } | ||
611 | } | 633 | } |
612 | css_init_done = 1; | 634 | css_init_done = 1; |
613 | 635 | ||
@@ -615,6 +637,8 @@ init_channel_subsystem (void) | |||
615 | 637 | ||
616 | for_each_subchannel(__init_channel_subsystem, NULL); | 638 | for_each_subchannel(__init_channel_subsystem, NULL); |
617 | return 0; | 639 | return 0; |
640 | out_device: | ||
641 | device_unregister(&css[i]->device); | ||
618 | out_free: | 642 | out_free: |
619 | kfree(css[i]); | 643 | kfree(css[i]); |
620 | out_unregister: | 644 | out_unregister: |
diff --git a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h index e210f89a2449..8aabb4adeb5f 100644 --- a/drivers/s390/cio/css.h +++ b/drivers/s390/cio/css.h | |||
@@ -100,7 +100,7 @@ struct ccw_device_private { | |||
100 | struct qdio_irq *qdio_data; | 100 | struct qdio_irq *qdio_data; |
101 | struct irb irb; /* device status */ | 101 | struct irb irb; /* device status */ |
102 | struct senseid senseid; /* SenseID info */ | 102 | struct senseid senseid; /* SenseID info */ |
103 | struct pgid pgid; /* path group ID */ | 103 | struct pgid pgid[8]; /* path group IDs per chpid*/ |
104 | struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */ | 104 | struct ccw1 iccws[2]; /* ccws for SNID/SID/SPGID commands */ |
105 | struct work_struct kick_work; | 105 | struct work_struct kick_work; |
106 | wait_queue_head_t wait_q; | 106 | wait_queue_head_t wait_q; |
@@ -136,6 +136,8 @@ extern struct bus_type css_bus_type; | |||
136 | extern struct css_driver io_subchannel_driver; | 136 | extern struct css_driver io_subchannel_driver; |
137 | 137 | ||
138 | extern int css_probe_device(struct subchannel_id); | 138 | extern int css_probe_device(struct subchannel_id); |
139 | extern int css_sch_device_register(struct subchannel *); | ||
140 | extern void css_sch_device_unregister(struct subchannel *); | ||
139 | extern struct subchannel * get_subchannel_by_schid(struct subchannel_id); | 141 | extern struct subchannel * get_subchannel_by_schid(struct subchannel_id); |
140 | extern int css_init_done; | 142 | extern int css_init_done; |
141 | extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *); | 143 | extern int for_each_subchannel(int(*fn)(struct subchannel_id, void *), void *); |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 67f0de6aed33..585fa04233c3 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -100,7 +100,7 @@ ccw_uevent (struct device *dev, char **envp, int num_envp, | |||
100 | if ((buffer_size - length <= 0) || (i >= num_envp)) | 100 | if ((buffer_size - length <= 0) || (i >= num_envp)) |
101 | return -ENOMEM; | 101 | return -ENOMEM; |
102 | 102 | ||
103 | envp[i] = 0; | 103 | envp[i] = NULL; |
104 | 104 | ||
105 | return 0; | 105 | return 0; |
106 | } | 106 | } |
@@ -280,7 +280,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) | |||
280 | * 'throw away device'. | 280 | * 'throw away device'. |
281 | */ | 281 | */ |
282 | sch = to_subchannel(cdev->dev.parent); | 282 | sch = to_subchannel(cdev->dev.parent); |
283 | device_unregister(&sch->dev); | 283 | css_sch_device_unregister(sch); |
284 | /* Reset intparm to zeroes. */ | 284 | /* Reset intparm to zeroes. */ |
285 | sch->schib.pmcw.intparm = 0; | 285 | sch->schib.pmcw.intparm = 0; |
286 | cio_modify(sch); | 286 | cio_modify(sch); |
@@ -625,7 +625,7 @@ ccw_device_do_unreg_rereg(void *data) | |||
625 | other_sch->schib.pmcw.intparm = 0; | 625 | other_sch->schib.pmcw.intparm = 0; |
626 | cio_modify(other_sch); | 626 | cio_modify(other_sch); |
627 | } | 627 | } |
628 | device_unregister(&other_sch->dev); | 628 | css_sch_device_unregister(other_sch); |
629 | } | 629 | } |
630 | } | 630 | } |
631 | /* Update ssd info here. */ | 631 | /* Update ssd info here. */ |
@@ -709,7 +709,7 @@ ccw_device_call_sch_unregister(void *data) | |||
709 | struct subchannel *sch; | 709 | struct subchannel *sch; |
710 | 710 | ||
711 | sch = to_subchannel(cdev->dev.parent); | 711 | sch = to_subchannel(cdev->dev.parent); |
712 | device_unregister(&sch->dev); | 712 | css_sch_device_unregister(sch); |
713 | /* Reset intparm to zeroes. */ | 713 | /* Reset intparm to zeroes. */ |
714 | sch->schib.pmcw.intparm = 0; | 714 | sch->schib.pmcw.intparm = 0; |
715 | cio_modify(sch); | 715 | cio_modify(sch); |
@@ -1057,7 +1057,7 @@ get_ccwdev_by_busid(struct ccw_driver *cdrv, const char *bus_id) | |||
1057 | __ccwdev_check_busid); | 1057 | __ccwdev_check_busid); |
1058 | put_driver(drv); | 1058 | put_driver(drv); |
1059 | 1059 | ||
1060 | return dev ? to_ccwdev(dev) : 0; | 1060 | return dev ? to_ccwdev(dev) : NULL; |
1061 | } | 1061 | } |
1062 | 1062 | ||
1063 | /************************** device driver handling ************************/ | 1063 | /************************** device driver handling ************************/ |
@@ -1082,7 +1082,7 @@ ccw_device_probe (struct device *dev) | |||
1082 | ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; | 1082 | ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; |
1083 | 1083 | ||
1084 | if (ret) { | 1084 | if (ret) { |
1085 | cdev->drv = 0; | 1085 | cdev->drv = NULL; |
1086 | return ret; | 1086 | return ret; |
1087 | } | 1087 | } |
1088 | 1088 | ||
@@ -1113,7 +1113,7 @@ ccw_device_remove (struct device *dev) | |||
1113 | ret, cdev->dev.bus_id); | 1113 | ret, cdev->dev.bus_id); |
1114 | } | 1114 | } |
1115 | ccw_device_set_timeout(cdev, 0); | 1115 | ccw_device_set_timeout(cdev, 0); |
1116 | cdev->drv = 0; | 1116 | cdev->drv = NULL; |
1117 | return 0; | 1117 | return 0; |
1118 | } | 1118 | } |
1119 | 1119 | ||
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index cb1af0b6f033..ac6e0c7e43d9 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -378,6 +378,56 @@ ccw_device_done(struct ccw_device *cdev, int state) | |||
378 | put_device (&cdev->dev); | 378 | put_device (&cdev->dev); |
379 | } | 379 | } |
380 | 380 | ||
381 | static inline int cmp_pgid(struct pgid *p1, struct pgid *p2) | ||
382 | { | ||
383 | char *c1; | ||
384 | char *c2; | ||
385 | |||
386 | c1 = (char *)p1; | ||
387 | c2 = (char *)p2; | ||
388 | |||
389 | return memcmp(c1 + 1, c2 + 1, sizeof(struct pgid) - 1); | ||
390 | } | ||
391 | |||
392 | static void __ccw_device_get_common_pgid(struct ccw_device *cdev) | ||
393 | { | ||
394 | int i; | ||
395 | int last; | ||
396 | |||
397 | last = 0; | ||
398 | for (i = 0; i < 8; i++) { | ||
399 | if (cdev->private->pgid[i].inf.ps.state1 == SNID_STATE1_RESET) | ||
400 | /* No PGID yet */ | ||
401 | continue; | ||
402 | if (cdev->private->pgid[last].inf.ps.state1 == | ||
403 | SNID_STATE1_RESET) { | ||
404 | /* First non-zero PGID */ | ||
405 | last = i; | ||
406 | continue; | ||
407 | } | ||
408 | if (cmp_pgid(&cdev->private->pgid[i], | ||
409 | &cdev->private->pgid[last]) == 0) | ||
410 | /* Non-conflicting PGIDs */ | ||
411 | continue; | ||
412 | |||
413 | /* PGID mismatch, can't pathgroup. */ | ||
414 | CIO_MSG_EVENT(0, "SNID - pgid mismatch for device " | ||
415 | "0.%x.%04x, can't pathgroup\n", | ||
416 | cdev->private->ssid, cdev->private->devno); | ||
417 | cdev->private->options.pgroup = 0; | ||
418 | return; | ||
419 | } | ||
420 | if (cdev->private->pgid[last].inf.ps.state1 == | ||
421 | SNID_STATE1_RESET) | ||
422 | /* No previous pgid found */ | ||
423 | memcpy(&cdev->private->pgid[0], &css[0]->global_pgid, | ||
424 | sizeof(struct pgid)); | ||
425 | else | ||
426 | /* Use existing pgid */ | ||
427 | memcpy(&cdev->private->pgid[0], &cdev->private->pgid[last], | ||
428 | sizeof(struct pgid)); | ||
429 | } | ||
430 | |||
381 | /* | 431 | /* |
382 | * Function called from device_pgid.c after sense path ground has completed. | 432 | * Function called from device_pgid.c after sense path ground has completed. |
383 | */ | 433 | */ |
@@ -388,24 +438,26 @@ ccw_device_sense_pgid_done(struct ccw_device *cdev, int err) | |||
388 | 438 | ||
389 | sch = to_subchannel(cdev->dev.parent); | 439 | sch = to_subchannel(cdev->dev.parent); |
390 | switch (err) { | 440 | switch (err) { |
391 | case 0: | 441 | case -EOPNOTSUPP: /* path grouping not supported, use nop instead. */ |
392 | /* Start Path Group verification. */ | 442 | cdev->private->options.pgroup = 0; |
393 | sch->vpm = 0; /* Start with no path groups set. */ | 443 | break; |
394 | cdev->private->state = DEV_STATE_VERIFY; | 444 | case 0: /* success */ |
395 | ccw_device_verify_start(cdev); | 445 | case -EACCES: /* partial success, some paths not operational */ |
446 | /* Check if all pgids are equal or 0. */ | ||
447 | __ccw_device_get_common_pgid(cdev); | ||
396 | break; | 448 | break; |
397 | case -ETIME: /* Sense path group id stopped by timeout. */ | 449 | case -ETIME: /* Sense path group id stopped by timeout. */ |
398 | case -EUSERS: /* device is reserved for someone else. */ | 450 | case -EUSERS: /* device is reserved for someone else. */ |
399 | ccw_device_done(cdev, DEV_STATE_BOXED); | 451 | ccw_device_done(cdev, DEV_STATE_BOXED); |
400 | break; | 452 | return; |
401 | case -EOPNOTSUPP: /* path grouping not supported, just set online. */ | ||
402 | cdev->private->options.pgroup = 0; | ||
403 | ccw_device_done(cdev, DEV_STATE_ONLINE); | ||
404 | break; | ||
405 | default: | 453 | default: |
406 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); | 454 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); |
407 | break; | 455 | return; |
408 | } | 456 | } |
457 | /* Start Path Group verification. */ | ||
458 | sch->vpm = 0; /* Start with no path groups set. */ | ||
459 | cdev->private->state = DEV_STATE_VERIFY; | ||
460 | ccw_device_verify_start(cdev); | ||
409 | } | 461 | } |
410 | 462 | ||
411 | /* | 463 | /* |
@@ -562,8 +614,9 @@ ccw_device_online(struct ccw_device *cdev) | |||
562 | } | 614 | } |
563 | /* Do we want to do path grouping? */ | 615 | /* Do we want to do path grouping? */ |
564 | if (!cdev->private->options.pgroup) { | 616 | if (!cdev->private->options.pgroup) { |
565 | /* No, set state online immediately. */ | 617 | /* Start initial path verification. */ |
566 | ccw_device_done(cdev, DEV_STATE_ONLINE); | 618 | cdev->private->state = DEV_STATE_VERIFY; |
619 | ccw_device_verify_start(cdev); | ||
567 | return 0; | 620 | return 0; |
568 | } | 621 | } |
569 | /* Do a SensePGID first. */ | 622 | /* Do a SensePGID first. */ |
@@ -609,6 +662,7 @@ ccw_device_offline(struct ccw_device *cdev) | |||
609 | /* Are we doing path grouping? */ | 662 | /* Are we doing path grouping? */ |
610 | if (!cdev->private->options.pgroup) { | 663 | if (!cdev->private->options.pgroup) { |
611 | /* No, set state offline immediately. */ | 664 | /* No, set state offline immediately. */ |
665 | sch->vpm = 0; | ||
612 | ccw_device_done(cdev, DEV_STATE_OFFLINE); | 666 | ccw_device_done(cdev, DEV_STATE_OFFLINE); |
613 | return 0; | 667 | return 0; |
614 | } | 668 | } |
@@ -705,8 +759,6 @@ ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event) | |||
705 | { | 759 | { |
706 | struct subchannel *sch; | 760 | struct subchannel *sch; |
707 | 761 | ||
708 | if (!cdev->private->options.pgroup) | ||
709 | return; | ||
710 | if (cdev->private->state == DEV_STATE_W4SENSE) { | 762 | if (cdev->private->state == DEV_STATE_W4SENSE) { |
711 | cdev->private->flags.doverify = 1; | 763 | cdev->private->flags.doverify = 1; |
712 | return; | 764 | return; |
@@ -995,8 +1047,7 @@ static void | |||
995 | ccw_device_wait4io_verify(struct ccw_device *cdev, enum dev_event dev_event) | 1047 | ccw_device_wait4io_verify(struct ccw_device *cdev, enum dev_event dev_event) |
996 | { | 1048 | { |
997 | /* When the I/O has terminated, we have to start verification. */ | 1049 | /* When the I/O has terminated, we have to start verification. */ |
998 | if (cdev->private->options.pgroup) | 1050 | cdev->private->flags.doverify = 1; |
999 | cdev->private->flags.doverify = 1; | ||
1000 | } | 1051 | } |
1001 | 1052 | ||
1002 | static void | 1053 | static void |
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index 54cb64ed0786..32610fd8868e 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c | |||
@@ -33,12 +33,17 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) | |||
33 | struct subchannel *sch; | 33 | struct subchannel *sch; |
34 | struct ccw1 *ccw; | 34 | struct ccw1 *ccw; |
35 | int ret; | 35 | int ret; |
36 | int i; | ||
36 | 37 | ||
37 | sch = to_subchannel(cdev->dev.parent); | 38 | sch = to_subchannel(cdev->dev.parent); |
39 | /* Return if we already checked on all paths. */ | ||
40 | if (cdev->private->imask == 0) | ||
41 | return (sch->lpm == 0) ? -ENODEV : -EACCES; | ||
42 | i = 8 - ffs(cdev->private->imask); | ||
43 | |||
38 | /* Setup sense path group id channel program. */ | 44 | /* Setup sense path group id channel program. */ |
39 | ccw = cdev->private->iccws; | 45 | ccw = cdev->private->iccws; |
40 | ccw->cmd_code = CCW_CMD_SENSE_PGID; | 46 | ccw->cmd_code = CCW_CMD_SENSE_PGID; |
41 | ccw->cda = (__u32) __pa (&cdev->private->pgid); | ||
42 | ccw->count = sizeof (struct pgid); | 47 | ccw->count = sizeof (struct pgid); |
43 | ccw->flags = CCW_FLAG_SLI; | 48 | ccw->flags = CCW_FLAG_SLI; |
44 | 49 | ||
@@ -48,6 +53,7 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) | |||
48 | ret = -ENODEV; | 53 | ret = -ENODEV; |
49 | while (cdev->private->imask != 0) { | 54 | while (cdev->private->imask != 0) { |
50 | /* Try every path multiple times. */ | 55 | /* Try every path multiple times. */ |
56 | ccw->cda = (__u32) __pa (&cdev->private->pgid[i]); | ||
51 | if (cdev->private->iretry > 0) { | 57 | if (cdev->private->iretry > 0) { |
52 | cdev->private->iretry--; | 58 | cdev->private->iretry--; |
53 | ret = cio_start (sch, cdev->private->iccws, | 59 | ret = cio_start (sch, cdev->private->iccws, |
@@ -64,7 +70,9 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) | |||
64 | } | 70 | } |
65 | cdev->private->imask >>= 1; | 71 | cdev->private->imask >>= 1; |
66 | cdev->private->iretry = 5; | 72 | cdev->private->iretry = 5; |
73 | i++; | ||
67 | } | 74 | } |
75 | |||
68 | return ret; | 76 | return ret; |
69 | } | 77 | } |
70 | 78 | ||
@@ -76,7 +84,7 @@ ccw_device_sense_pgid_start(struct ccw_device *cdev) | |||
76 | cdev->private->state = DEV_STATE_SENSE_PGID; | 84 | cdev->private->state = DEV_STATE_SENSE_PGID; |
77 | cdev->private->imask = 0x80; | 85 | cdev->private->imask = 0x80; |
78 | cdev->private->iretry = 5; | 86 | cdev->private->iretry = 5; |
79 | memset (&cdev->private->pgid, 0, sizeof (struct pgid)); | 87 | memset (&cdev->private->pgid, 0, sizeof (cdev->private->pgid)); |
80 | ret = __ccw_device_sense_pgid_start(cdev); | 88 | ret = __ccw_device_sense_pgid_start(cdev); |
81 | if (ret && ret != -EBUSY) | 89 | if (ret && ret != -EBUSY) |
82 | ccw_device_sense_pgid_done(cdev, ret); | 90 | ccw_device_sense_pgid_done(cdev, ret); |
@@ -91,6 +99,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) | |||
91 | { | 99 | { |
92 | struct subchannel *sch; | 100 | struct subchannel *sch; |
93 | struct irb *irb; | 101 | struct irb *irb; |
102 | int i; | ||
94 | 103 | ||
95 | sch = to_subchannel(cdev->dev.parent); | 104 | sch = to_subchannel(cdev->dev.parent); |
96 | irb = &cdev->private->irb; | 105 | irb = &cdev->private->irb; |
@@ -124,7 +133,8 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) | |||
124 | sch->schid.sch_no, sch->orb.lpm); | 133 | sch->schid.sch_no, sch->orb.lpm); |
125 | return -EACCES; | 134 | return -EACCES; |
126 | } | 135 | } |
127 | if (cdev->private->pgid.inf.ps.state2 == SNID_STATE2_RESVD_ELSE) { | 136 | i = 8 - ffs(cdev->private->imask); |
137 | if (cdev->private->pgid[i].inf.ps.state2 == SNID_STATE2_RESVD_ELSE) { | ||
128 | CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x " | 138 | CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x " |
129 | "is reserved by someone else\n", | 139 | "is reserved by someone else\n", |
130 | cdev->private->devno, sch->schid.ssid, | 140 | cdev->private->devno, sch->schid.ssid, |
@@ -162,12 +172,6 @@ ccw_device_sense_pgid_irq(struct ccw_device *cdev, enum dev_event dev_event) | |||
162 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | 172 | memset(&cdev->private->irb, 0, sizeof(struct irb)); |
163 | switch (ret) { | 173 | switch (ret) { |
164 | /* 0, -ETIME, -EOPNOTSUPP, -EAGAIN, -EACCES or -EUSERS */ | 174 | /* 0, -ETIME, -EOPNOTSUPP, -EAGAIN, -EACCES or -EUSERS */ |
165 | case 0: /* Sense Path Group ID successful. */ | ||
166 | if (cdev->private->pgid.inf.ps.state1 == SNID_STATE1_RESET) | ||
167 | memcpy(&cdev->private->pgid, &css[0]->global_pgid, | ||
168 | sizeof(struct pgid)); | ||
169 | ccw_device_sense_pgid_done(cdev, 0); | ||
170 | break; | ||
171 | case -EOPNOTSUPP: /* Sense Path Group ID not supported */ | 175 | case -EOPNOTSUPP: /* Sense Path Group ID not supported */ |
172 | ccw_device_sense_pgid_done(cdev, -EOPNOTSUPP); | 176 | ccw_device_sense_pgid_done(cdev, -EOPNOTSUPP); |
173 | break; | 177 | break; |
@@ -176,13 +180,15 @@ ccw_device_sense_pgid_irq(struct ccw_device *cdev, enum dev_event dev_event) | |||
176 | break; | 180 | break; |
177 | case -EACCES: /* channel is not operational. */ | 181 | case -EACCES: /* channel is not operational. */ |
178 | sch->lpm &= ~cdev->private->imask; | 182 | sch->lpm &= ~cdev->private->imask; |
183 | /* Fall through. */ | ||
184 | case 0: /* Sense Path Group ID successful. */ | ||
179 | cdev->private->imask >>= 1; | 185 | cdev->private->imask >>= 1; |
180 | cdev->private->iretry = 5; | 186 | cdev->private->iretry = 5; |
181 | /* Fall through. */ | 187 | /* Fall through. */ |
182 | case -EAGAIN: /* Try again. */ | 188 | case -EAGAIN: /* Try again. */ |
183 | ret = __ccw_device_sense_pgid_start(cdev); | 189 | ret = __ccw_device_sense_pgid_start(cdev); |
184 | if (ret != 0 && ret != -EBUSY) | 190 | if (ret != 0 && ret != -EBUSY) |
185 | ccw_device_sense_pgid_done(cdev, -ENODEV); | 191 | ccw_device_sense_pgid_done(cdev, ret); |
186 | break; | 192 | break; |
187 | case -EUSERS: /* device is reserved for someone else. */ | 193 | case -EUSERS: /* device is reserved for someone else. */ |
188 | ccw_device_sense_pgid_done(cdev, -EUSERS); | 194 | ccw_device_sense_pgid_done(cdev, -EUSERS); |
@@ -203,20 +209,20 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) | |||
203 | sch = to_subchannel(cdev->dev.parent); | 209 | sch = to_subchannel(cdev->dev.parent); |
204 | 210 | ||
205 | /* Setup sense path group id channel program. */ | 211 | /* Setup sense path group id channel program. */ |
206 | cdev->private->pgid.inf.fc = func; | 212 | cdev->private->pgid[0].inf.fc = func; |
207 | ccw = cdev->private->iccws; | 213 | ccw = cdev->private->iccws; |
208 | if (!cdev->private->flags.pgid_single) { | 214 | if (!cdev->private->flags.pgid_single) { |
209 | cdev->private->pgid.inf.fc |= SPID_FUNC_MULTI_PATH; | 215 | cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; |
210 | ccw->cmd_code = CCW_CMD_SUSPEND_RECONN; | 216 | ccw->cmd_code = CCW_CMD_SUSPEND_RECONN; |
211 | ccw->cda = 0; | 217 | ccw->cda = 0; |
212 | ccw->count = 0; | 218 | ccw->count = 0; |
213 | ccw->flags = CCW_FLAG_SLI | CCW_FLAG_CC; | 219 | ccw->flags = CCW_FLAG_SLI | CCW_FLAG_CC; |
214 | ccw++; | 220 | ccw++; |
215 | } else | 221 | } else |
216 | cdev->private->pgid.inf.fc |= SPID_FUNC_SINGLE_PATH; | 222 | cdev->private->pgid[0].inf.fc |= SPID_FUNC_SINGLE_PATH; |
217 | 223 | ||
218 | ccw->cmd_code = CCW_CMD_SET_PGID; | 224 | ccw->cmd_code = CCW_CMD_SET_PGID; |
219 | ccw->cda = (__u32) __pa (&cdev->private->pgid); | 225 | ccw->cda = (__u32) __pa (&cdev->private->pgid[0]); |
220 | ccw->count = sizeof (struct pgid); | 226 | ccw->count = sizeof (struct pgid); |
221 | ccw->flags = CCW_FLAG_SLI; | 227 | ccw->flags = CCW_FLAG_SLI; |
222 | 228 | ||
@@ -244,6 +250,48 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) | |||
244 | } | 250 | } |
245 | 251 | ||
246 | /* | 252 | /* |
253 | * Helper function to send a nop ccw down a path. | ||
254 | */ | ||
255 | static int __ccw_device_do_nop(struct ccw_device *cdev) | ||
256 | { | ||
257 | struct subchannel *sch; | ||
258 | struct ccw1 *ccw; | ||
259 | int ret; | ||
260 | |||
261 | sch = to_subchannel(cdev->dev.parent); | ||
262 | |||
263 | /* Setup nop channel program. */ | ||
264 | ccw = cdev->private->iccws; | ||
265 | ccw->cmd_code = CCW_CMD_NOOP; | ||
266 | ccw->cda = 0; | ||
267 | ccw->count = 0; | ||
268 | ccw->flags = CCW_FLAG_SLI; | ||
269 | |||
270 | /* Reset device status. */ | ||
271 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | ||
272 | |||
273 | /* Try multiple times. */ | ||
274 | ret = -ENODEV; | ||
275 | if (cdev->private->iretry > 0) { | ||
276 | cdev->private->iretry--; | ||
277 | ret = cio_start (sch, cdev->private->iccws, | ||
278 | cdev->private->imask); | ||
279 | /* ret is 0, -EBUSY, -EACCES or -ENODEV */ | ||
280 | if ((ret != -EACCES) && (ret != -ENODEV)) | ||
281 | return ret; | ||
282 | } | ||
283 | /* nop command failed on this path. Switch it off. */ | ||
284 | sch->lpm &= ~cdev->private->imask; | ||
285 | sch->vpm &= ~cdev->private->imask; | ||
286 | CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel " | ||
287 | "0.%x.%04x, lpm %02X, became 'not operational'\n", | ||
288 | cdev->private->devno, sch->schid.ssid, | ||
289 | sch->schid.sch_no, cdev->private->imask); | ||
290 | return ret; | ||
291 | } | ||
292 | |||
293 | |||
294 | /* | ||
247 | * Called from interrupt context to check if a valid answer | 295 | * Called from interrupt context to check if a valid answer |
248 | * to Set Path Group ID was received. | 296 | * to Set Path Group ID was received. |
249 | */ | 297 | */ |
@@ -282,6 +330,29 @@ __ccw_device_check_pgid(struct ccw_device *cdev) | |||
282 | return 0; | 330 | return 0; |
283 | } | 331 | } |
284 | 332 | ||
333 | /* | ||
334 | * Called from interrupt context to check the path status after a nop has | ||
335 | * been send. | ||
336 | */ | ||
337 | static int __ccw_device_check_nop(struct ccw_device *cdev) | ||
338 | { | ||
339 | struct subchannel *sch; | ||
340 | struct irb *irb; | ||
341 | |||
342 | sch = to_subchannel(cdev->dev.parent); | ||
343 | irb = &cdev->private->irb; | ||
344 | if (irb->scsw.fctl & (SCSW_FCTL_HALT_FUNC | SCSW_FCTL_CLEAR_FUNC)) | ||
345 | return -ETIME; | ||
346 | if (irb->scsw.cc == 3) { | ||
347 | CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel 0.%x.%04x," | ||
348 | " lpm %02X, became 'not operational'\n", | ||
349 | cdev->private->devno, sch->schid.ssid, | ||
350 | sch->schid.sch_no, cdev->private->imask); | ||
351 | return -EACCES; | ||
352 | } | ||
353 | return 0; | ||
354 | } | ||
355 | |||
285 | static void | 356 | static void |
286 | __ccw_device_verify_start(struct ccw_device *cdev) | 357 | __ccw_device_verify_start(struct ccw_device *cdev) |
287 | { | 358 | { |
@@ -296,9 +367,12 @@ __ccw_device_verify_start(struct ccw_device *cdev) | |||
296 | if ((sch->vpm & imask) != (sch->lpm & imask)) | 367 | if ((sch->vpm & imask) != (sch->lpm & imask)) |
297 | break; | 368 | break; |
298 | cdev->private->imask = imask; | 369 | cdev->private->imask = imask; |
299 | func = (sch->vpm & imask) ? | 370 | if (cdev->private->options.pgroup) { |
300 | SPID_FUNC_RESIGN : SPID_FUNC_ESTABLISH; | 371 | func = (sch->vpm & imask) ? |
301 | ret = __ccw_device_do_pgid(cdev, func); | 372 | SPID_FUNC_RESIGN : SPID_FUNC_ESTABLISH; |
373 | ret = __ccw_device_do_pgid(cdev, func); | ||
374 | } else | ||
375 | ret = __ccw_device_do_nop(cdev); | ||
302 | if (ret == 0 || ret == -EBUSY) | 376 | if (ret == 0 || ret == -EBUSY) |
303 | return; | 377 | return; |
304 | cdev->private->iretry = 5; | 378 | cdev->private->iretry = 5; |
@@ -327,7 +401,10 @@ ccw_device_verify_irq(struct ccw_device *cdev, enum dev_event dev_event) | |||
327 | if (ccw_device_accumulate_and_sense(cdev, irb) != 0) | 401 | if (ccw_device_accumulate_and_sense(cdev, irb) != 0) |
328 | return; | 402 | return; |
329 | sch = to_subchannel(cdev->dev.parent); | 403 | sch = to_subchannel(cdev->dev.parent); |
330 | ret = __ccw_device_check_pgid(cdev); | 404 | if (cdev->private->options.pgroup) |
405 | ret = __ccw_device_check_pgid(cdev); | ||
406 | else | ||
407 | ret = __ccw_device_check_nop(cdev); | ||
331 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | 408 | memset(&cdev->private->irb, 0, sizeof(struct irb)); |
332 | switch (ret) { | 409 | switch (ret) { |
333 | /* 0, -ETIME, -EAGAIN, -EOPNOTSUPP or -EACCES */ | 410 | /* 0, -ETIME, -EAGAIN, -EOPNOTSUPP or -EACCES */ |
@@ -345,11 +422,10 @@ ccw_device_verify_irq(struct ccw_device *cdev, enum dev_event dev_event) | |||
345 | * One of those strange devices which claim to be able | 422 | * One of those strange devices which claim to be able |
346 | * to do multipathing but not for Set Path Group ID. | 423 | * to do multipathing but not for Set Path Group ID. |
347 | */ | 424 | */ |
348 | if (cdev->private->flags.pgid_single) { | 425 | if (cdev->private->flags.pgid_single) |
349 | ccw_device_verify_done(cdev, -EOPNOTSUPP); | 426 | cdev->private->options.pgroup = 0; |
350 | break; | 427 | else |
351 | } | 428 | cdev->private->flags.pgid_single = 1; |
352 | cdev->private->flags.pgid_single = 1; | ||
353 | /* fall through. */ | 429 | /* fall through. */ |
354 | case -EAGAIN: /* Try again. */ | 430 | case -EAGAIN: /* Try again. */ |
355 | __ccw_device_verify_start(cdev); | 431 | __ccw_device_verify_start(cdev); |
diff --git a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c index 14bef2c179bf..caf148d5caad 100644 --- a/drivers/s390/cio/device_status.c +++ b/drivers/s390/cio/device_status.c | |||
@@ -67,8 +67,7 @@ ccw_device_path_notoper(struct ccw_device *cdev) | |||
67 | sch->schib.pmcw.pnom); | 67 | sch->schib.pmcw.pnom); |
68 | 68 | ||
69 | sch->lpm &= ~sch->schib.pmcw.pnom; | 69 | sch->lpm &= ~sch->schib.pmcw.pnom; |
70 | if (cdev->private->options.pgroup) | 70 | cdev->private->flags.doverify = 1; |
71 | cdev->private->flags.doverify = 1; | ||
72 | } | 71 | } |
73 | 72 | ||
74 | /* | 73 | /* |
@@ -180,7 +179,7 @@ ccw_device_accumulate_esw(struct ccw_device *cdev, struct irb *irb) | |||
180 | cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth; | 179 | cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth; |
181 | /* Copy path verification required flag. */ | 180 | /* Copy path verification required flag. */ |
182 | cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf; | 181 | cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf; |
183 | if (irb->esw.esw0.erw.pvrf && cdev->private->options.pgroup) | 182 | if (irb->esw.esw0.erw.pvrf) |
184 | cdev->private->flags.doverify = 1; | 183 | cdev->private->flags.doverify = 1; |
185 | /* Copy concurrent sense bit. */ | 184 | /* Copy concurrent sense bit. */ |
186 | cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons; | 185 | cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons; |
@@ -354,7 +353,7 @@ ccw_device_accumulate_basic_sense(struct ccw_device *cdev, struct irb *irb) | |||
354 | } | 353 | } |
355 | /* Check if path verification is required. */ | 354 | /* Check if path verification is required. */ |
356 | if (ccw_device_accumulate_esw_valid(irb) && | 355 | if (ccw_device_accumulate_esw_valid(irb) && |
357 | irb->esw.esw0.erw.pvrf && cdev->private->options.pgroup) | 356 | irb->esw.esw0.erw.pvrf) |
358 | cdev->private->flags.doverify = 1; | 357 | cdev->private->flags.doverify = 1; |
359 | } | 358 | } |
360 | 359 | ||
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index b70039af70d6..7c93a8798d23 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -2735,7 +2735,7 @@ qdio_free(struct ccw_device *cdev) | |||
2735 | QDIO_DBF_TEXT1(0,trace,dbf_text); | 2735 | QDIO_DBF_TEXT1(0,trace,dbf_text); |
2736 | QDIO_DBF_TEXT0(0,setup,dbf_text); | 2736 | QDIO_DBF_TEXT0(0,setup,dbf_text); |
2737 | 2737 | ||
2738 | cdev->private->qdio_data = 0; | 2738 | cdev->private->qdio_data = NULL; |
2739 | 2739 | ||
2740 | up(&irq_ptr->setting_up_sema); | 2740 | up(&irq_ptr->setting_up_sema); |
2741 | 2741 | ||
diff --git a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c index 189a49275433..0e863df4027a 100644 --- a/drivers/s390/net/iucv.c +++ b/drivers/s390/net/iucv.c | |||
@@ -692,7 +692,7 @@ iucv_retrieve_buffer (void) | |||
692 | iucv_debug(1, "entering"); | 692 | iucv_debug(1, "entering"); |
693 | if (iucv_cpuid != -1) { | 693 | if (iucv_cpuid != -1) { |
694 | smp_call_function_on(iucv_retrieve_buffer_cpuid, | 694 | smp_call_function_on(iucv_retrieve_buffer_cpuid, |
695 | 0, 0, 1, iucv_cpuid); | 695 | NULL, 0, 1, iucv_cpuid); |
696 | /* Release the cpu reserved by iucv_declare_buffer. */ | 696 | /* Release the cpu reserved by iucv_declare_buffer. */ |
697 | smp_put_cpu(iucv_cpuid); | 697 | smp_put_cpu(iucv_cpuid); |
698 | iucv_cpuid = -1; | 698 | iucv_cpuid = -1; |
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 4caced21ac8c..103c41470bd2 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -4804,7 +4804,7 @@ static struct qeth_cmd_buffer * | |||
4804 | qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs, | 4804 | qeth_get_setassparms_cmd(struct qeth_card *, enum qeth_ipa_funcs, |
4805 | __u16, __u16, enum qeth_prot_versions); | 4805 | __u16, __u16, enum qeth_prot_versions); |
4806 | static int | 4806 | static int |
4807 | qeth_arp_query(struct qeth_card *card, char *udata) | 4807 | qeth_arp_query(struct qeth_card *card, char __user *udata) |
4808 | { | 4808 | { |
4809 | struct qeth_cmd_buffer *iob; | 4809 | struct qeth_cmd_buffer *iob; |
4810 | struct qeth_arp_query_info qinfo = {0, }; | 4810 | struct qeth_arp_query_info qinfo = {0, }; |
@@ -4937,7 +4937,7 @@ qeth_get_adapter_cmd(struct qeth_card *card, __u32 command, __u32 cmdlen) | |||
4937 | * function to send SNMP commands to OSA-E card | 4937 | * function to send SNMP commands to OSA-E card |
4938 | */ | 4938 | */ |
4939 | static int | 4939 | static int |
4940 | qeth_snmp_command(struct qeth_card *card, char *udata) | 4940 | qeth_snmp_command(struct qeth_card *card, char __user *udata) |
4941 | { | 4941 | { |
4942 | struct qeth_cmd_buffer *iob; | 4942 | struct qeth_cmd_buffer *iob; |
4943 | struct qeth_ipa_cmd *cmd; | 4943 | struct qeth_ipa_cmd *cmd; |
@@ -7909,9 +7909,9 @@ qeth_set_online(struct ccwgroup_device *gdev) | |||
7909 | } | 7909 | } |
7910 | 7910 | ||
7911 | static struct ccw_device_id qeth_ids[] = { | 7911 | static struct ccw_device_id qeth_ids[] = { |
7912 | {CCW_DEVICE(0x1731, 0x01), driver_info:QETH_CARD_TYPE_OSAE}, | 7912 | {CCW_DEVICE(0x1731, 0x01), .driver_info = QETH_CARD_TYPE_OSAE}, |
7913 | {CCW_DEVICE(0x1731, 0x05), driver_info:QETH_CARD_TYPE_IQD}, | 7913 | {CCW_DEVICE(0x1731, 0x05), .driver_info = QETH_CARD_TYPE_IQD}, |
7914 | {CCW_DEVICE(0x1731, 0x06), driver_info:QETH_CARD_TYPE_OSN}, | 7914 | {CCW_DEVICE(0x1731, 0x06), .driver_info = QETH_CARD_TYPE_OSN}, |
7915 | {}, | 7915 | {}, |
7916 | }; | 7916 | }; |
7917 | MODULE_DEVICE_TABLE(ccw, qeth_ids); | 7917 | MODULE_DEVICE_TABLE(ccw, qeth_ids); |
@@ -8380,7 +8380,7 @@ out: | |||
8380 | 8380 | ||
8381 | static struct notifier_block qeth_ip_notifier = { | 8381 | static struct notifier_block qeth_ip_notifier = { |
8382 | qeth_ip_event, | 8382 | qeth_ip_event, |
8383 | 0 | 8383 | NULL, |
8384 | }; | 8384 | }; |
8385 | 8385 | ||
8386 | #ifdef CONFIG_QETH_IPV6 | 8386 | #ifdef CONFIG_QETH_IPV6 |
@@ -8433,7 +8433,7 @@ out: | |||
8433 | 8433 | ||
8434 | static struct notifier_block qeth_ip6_notifier = { | 8434 | static struct notifier_block qeth_ip6_notifier = { |
8435 | qeth_ip6_event, | 8435 | qeth_ip6_event, |
8436 | 0 | 8436 | NULL, |
8437 | }; | 8437 | }; |
8438 | #endif | 8438 | #endif |
8439 | 8439 | ||
@@ -8460,7 +8460,7 @@ qeth_reboot_event(struct notifier_block *this, unsigned long event, void *ptr) | |||
8460 | 8460 | ||
8461 | static struct notifier_block qeth_reboot_notifier = { | 8461 | static struct notifier_block qeth_reboot_notifier = { |
8462 | qeth_reboot_event, | 8462 | qeth_reboot_event, |
8463 | 0 | 8463 | NULL, |
8464 | }; | 8464 | }; |
8465 | 8465 | ||
8466 | static int | 8466 | static int |
diff --git a/drivers/s390/net/qeth_sys.c b/drivers/s390/net/qeth_sys.c index 185a9cfbcbdc..001497bbea16 100644 --- a/drivers/s390/net/qeth_sys.c +++ b/drivers/s390/net/qeth_sys.c | |||
@@ -1755,7 +1755,7 @@ qeth_driver_group_store(struct device_driver *ddrv, const char *buf, | |||
1755 | } | 1755 | } |
1756 | 1756 | ||
1757 | 1757 | ||
1758 | static DRIVER_ATTR(group, 0200, 0, qeth_driver_group_store); | 1758 | static DRIVER_ATTR(group, 0200, NULL, qeth_driver_group_store); |
1759 | 1759 | ||
1760 | static ssize_t | 1760 | static ssize_t |
1761 | qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, | 1761 | qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, |
@@ -1783,7 +1783,7 @@ qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf, | |||
1783 | return count; | 1783 | return count; |
1784 | } | 1784 | } |
1785 | 1785 | ||
1786 | static DRIVER_ATTR(notifier_register, 0200, 0, | 1786 | static DRIVER_ATTR(notifier_register, 0200, NULL, |
1787 | qeth_driver_notifier_register_store); | 1787 | qeth_driver_notifier_register_store); |
1788 | 1788 | ||
1789 | int | 1789 | int |
diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c index 72118ee68954..b8179c27ceb6 100644 --- a/drivers/s390/net/smsgiucv.c +++ b/drivers/s390/net/smsgiucv.c | |||
@@ -66,7 +66,7 @@ smsg_message_pending(iucv_MessagePending *eib, void *pgm_data) | |||
66 | return; | 66 | return; |
67 | } | 67 | } |
68 | rc = iucv_receive(eib->ippathid, eib->ipmsgid, eib->iptrgcls, | 68 | rc = iucv_receive(eib->ippathid, eib->ipmsgid, eib->iptrgcls, |
69 | msg, len, 0, 0, 0); | 69 | msg, len, NULL, NULL, NULL); |
70 | if (rc == 0) { | 70 | if (rc == 0) { |
71 | msg[len] = 0; | 71 | msg[len] = 0; |
72 | EBCASC(msg, len); | 72 | EBCASC(msg, len); |
@@ -122,7 +122,7 @@ smsg_unregister_callback(char *prefix, void (*callback)(char *from, char *str)) | |||
122 | struct smsg_callback *cb, *tmp; | 122 | struct smsg_callback *cb, *tmp; |
123 | 123 | ||
124 | spin_lock(&smsg_list_lock); | 124 | spin_lock(&smsg_list_lock); |
125 | cb = 0; | 125 | cb = NULL; |
126 | list_for_each_entry(tmp, &smsg_list, list) | 126 | list_for_each_entry(tmp, &smsg_list, list) |
127 | if (tmp->callback == callback && | 127 | if (tmp->callback == callback && |
128 | strcmp(tmp->prefix, prefix) == 0) { | 128 | strcmp(tmp->prefix, prefix) == 0) { |
@@ -139,7 +139,7 @@ smsg_exit(void) | |||
139 | { | 139 | { |
140 | if (smsg_handle > 0) { | 140 | if (smsg_handle > 0) { |
141 | cpcmd("SET SMSG OFF", NULL, 0, NULL); | 141 | cpcmd("SET SMSG OFF", NULL, 0, NULL); |
142 | iucv_sever(smsg_pathid, 0); | 142 | iucv_sever(smsg_pathid, NULL); |
143 | iucv_unregister_program(smsg_handle); | 143 | iucv_unregister_program(smsg_handle); |
144 | driver_unregister(&smsg_driver); | 144 | driver_unregister(&smsg_driver); |
145 | } | 145 | } |
@@ -162,19 +162,19 @@ smsg_init(void) | |||
162 | return rc; | 162 | return rc; |
163 | } | 163 | } |
164 | smsg_handle = iucv_register_program("SMSGIUCV ", "*MSG ", | 164 | smsg_handle = iucv_register_program("SMSGIUCV ", "*MSG ", |
165 | pgmmask, &smsg_ops, 0); | 165 | pgmmask, &smsg_ops, NULL); |
166 | if (!smsg_handle) { | 166 | if (!smsg_handle) { |
167 | printk(KERN_ERR "SMSGIUCV: failed to register to iucv"); | 167 | printk(KERN_ERR "SMSGIUCV: failed to register to iucv"); |
168 | driver_unregister(&smsg_driver); | 168 | driver_unregister(&smsg_driver); |
169 | return -EIO; /* better errno ? */ | 169 | return -EIO; /* better errno ? */ |
170 | } | 170 | } |
171 | rc = iucv_connect (&smsg_pathid, 255, 0, "*MSG ", 0, 0, 0, 0, | 171 | rc = iucv_connect (&smsg_pathid, 255, NULL, "*MSG ", NULL, 0, |
172 | smsg_handle, 0); | 172 | NULL, NULL, smsg_handle, NULL); |
173 | if (rc) { | 173 | if (rc) { |
174 | printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG"); | 174 | printk(KERN_ERR "SMSGIUCV: failed to connect to *MSG"); |
175 | iucv_unregister_program(smsg_handle); | 175 | iucv_unregister_program(smsg_handle); |
176 | driver_unregister(&smsg_driver); | 176 | driver_unregister(&smsg_driver); |
177 | smsg_handle = 0; | 177 | smsg_handle = NULL; |
178 | return -EIO; | 178 | return -EIO; |
179 | } | 179 | } |
180 | cpcmd("SET SMSG IUCV", NULL, 0, NULL); | 180 | cpcmd("SET SMSG IUCV", NULL, 0, NULL); |
diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index ffb3677e354f..5399c5d99b81 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c | |||
@@ -111,6 +111,16 @@ repeat: | |||
111 | break; | 111 | break; |
112 | case CRW_RSC_CPATH: | 112 | case CRW_RSC_CPATH: |
113 | pr_debug("source is channel path %02X\n", crw[0].rsid); | 113 | pr_debug("source is channel path %02X\n", crw[0].rsid); |
114 | /* | ||
115 | * Check for solicited machine checks. These are | ||
116 | * created by reset channel path and need not be | ||
117 | * reported to the common I/O layer. | ||
118 | */ | ||
119 | if (crw[chain].slct) { | ||
120 | DBG(KERN_INFO"solicited machine check for " | ||
121 | "channel path %02X\n", crw[0].rsid); | ||
122 | break; | ||
123 | } | ||
114 | switch (crw[0].erc) { | 124 | switch (crw[0].erc) { |
115 | case CRW_ERC_IPARM: /* Path has come. */ | 125 | case CRW_ERC_IPARM: /* Path has come. */ |
116 | ret = chp_process_crw(crw[0].rsid, 1); | 126 | ret = chp_process_crw(crw[0].rsid, 1); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 6335f9229184..31db2b06faba 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -2227,7 +2227,7 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, | |||
2227 | /* setup new FSF request */ | 2227 | /* setup new FSF request */ |
2228 | retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, | 2228 | retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, |
2229 | erp_action ? ZFCP_REQ_AUTO_CLEANUP : 0, | 2229 | erp_action ? ZFCP_REQ_AUTO_CLEANUP : 0, |
2230 | 0, &lock_flags, &fsf_req); | 2230 | NULL, &lock_flags, &fsf_req); |
2231 | if (retval < 0) { | 2231 | if (retval < 0) { |
2232 | ZFCP_LOG_INFO("error: Out of resources. Could not create an " | 2232 | ZFCP_LOG_INFO("error: Out of resources. Could not create an " |
2233 | "exchange port data request for" | 2233 | "exchange port data request for" |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 46e14f22ec18..671f4a6a5d18 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -44,30 +44,29 @@ struct scsi_transport_template *zfcp_transport_template; | |||
44 | 44 | ||
45 | struct zfcp_data zfcp_data = { | 45 | struct zfcp_data zfcp_data = { |
46 | .scsi_host_template = { | 46 | .scsi_host_template = { |
47 | name: ZFCP_NAME, | 47 | .name = ZFCP_NAME, |
48 | proc_name: "zfcp", | 48 | .proc_name = "zfcp", |
49 | proc_info: NULL, | 49 | .proc_info = NULL, |
50 | detect: NULL, | 50 | .detect = NULL, |
51 | slave_alloc: zfcp_scsi_slave_alloc, | 51 | .slave_alloc = zfcp_scsi_slave_alloc, |
52 | slave_configure: zfcp_scsi_slave_configure, | 52 | .slave_configure = zfcp_scsi_slave_configure, |
53 | slave_destroy: zfcp_scsi_slave_destroy, | 53 | .slave_destroy = zfcp_scsi_slave_destroy, |
54 | queuecommand: zfcp_scsi_queuecommand, | 54 | .queuecommand = zfcp_scsi_queuecommand, |
55 | eh_abort_handler: zfcp_scsi_eh_abort_handler, | 55 | .eh_abort_handler = zfcp_scsi_eh_abort_handler, |
56 | eh_device_reset_handler: zfcp_scsi_eh_device_reset_handler, | 56 | .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler, |
57 | eh_bus_reset_handler: zfcp_scsi_eh_bus_reset_handler, | 57 | .eh_bus_reset_handler = zfcp_scsi_eh_bus_reset_handler, |
58 | eh_host_reset_handler: zfcp_scsi_eh_host_reset_handler, | 58 | .eh_host_reset_handler = zfcp_scsi_eh_host_reset_handler, |
59 | /* FIXME(openfcp): Tune */ | 59 | .can_queue = 4096, |
60 | can_queue: 4096, | 60 | .this_id = -1, |
61 | this_id: -1, | 61 | /* |
62 | /* | 62 | * FIXME: |
63 | * FIXME: | 63 | * one less? can zfcp_create_sbale cope with it? |
64 | * one less? can zfcp_create_sbale cope with it? | 64 | */ |
65 | */ | 65 | .sg_tablesize = ZFCP_MAX_SBALES_PER_REQ, |
66 | sg_tablesize: ZFCP_MAX_SBALES_PER_REQ, | 66 | .cmd_per_lun = 1, |
67 | cmd_per_lun: 1, | 67 | .unchecked_isa_dma = 0, |
68 | unchecked_isa_dma: 0, | 68 | .use_clustering = 1, |
69 | use_clustering: 1, | 69 | .sdev_attrs = zfcp_sysfs_sdev_attrs, |
70 | sdev_attrs: zfcp_sysfs_sdev_attrs, | ||
71 | }, | 70 | }, |
72 | .driver_version = ZFCP_VERSION, | 71 | .driver_version = ZFCP_VERSION, |
73 | /* rest initialised with zeros */ | 72 | /* rest initialised with zeros */ |
diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c index f9013baba05b..93bdaa3169fc 100644 --- a/drivers/serial/sunsu.c +++ b/drivers/serial/sunsu.c | |||
@@ -1406,25 +1406,35 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m | |||
1406 | struct device_node *dp = op->node; | 1406 | struct device_node *dp = op->node; |
1407 | struct uart_sunsu_port *up; | 1407 | struct uart_sunsu_port *up; |
1408 | struct resource *rp; | 1408 | struct resource *rp; |
1409 | enum su_type type; | ||
1409 | int err; | 1410 | int err; |
1410 | 1411 | ||
1411 | if (inst >= UART_NR) | 1412 | type = su_get_type(dp); |
1412 | return -EINVAL; | 1413 | if (type == SU_PORT_PORT) { |
1414 | if (inst >= UART_NR) | ||
1415 | return -EINVAL; | ||
1416 | up = &sunsu_ports[inst]; | ||
1417 | } else { | ||
1418 | up = kzalloc(sizeof(*up), GFP_KERNEL); | ||
1419 | if (!up) | ||
1420 | return -ENOMEM; | ||
1421 | } | ||
1413 | 1422 | ||
1414 | up = &sunsu_ports[inst]; | ||
1415 | up->port.line = inst; | 1423 | up->port.line = inst; |
1416 | 1424 | ||
1417 | spin_lock_init(&up->port.lock); | 1425 | spin_lock_init(&up->port.lock); |
1418 | 1426 | ||
1419 | up->su_type = su_get_type(dp); | 1427 | up->su_type = type; |
1420 | 1428 | ||
1421 | rp = &op->resource[0]; | 1429 | rp = &op->resource[0]; |
1422 | up->port.mapbase = op->resource[0].start; | 1430 | up->port.mapbase = rp->start; |
1423 | |||
1424 | up->reg_size = (rp->end - rp->start) + 1; | 1431 | up->reg_size = (rp->end - rp->start) + 1; |
1425 | up->port.membase = of_ioremap(rp, 0, up->reg_size, "su"); | 1432 | up->port.membase = of_ioremap(rp, 0, up->reg_size, "su"); |
1426 | if (!up->port.membase) | 1433 | if (!up->port.membase) { |
1434 | if (type != SU_PORT_PORT) | ||
1435 | kfree(up); | ||
1427 | return -ENOMEM; | 1436 | return -ENOMEM; |
1437 | } | ||
1428 | 1438 | ||
1429 | up->port.irq = op->irqs[0]; | 1439 | up->port.irq = op->irqs[0]; |
1430 | 1440 | ||
@@ -1436,8 +1446,11 @@ static int __devinit su_probe(struct of_device *op, const struct of_device_id *m | |||
1436 | err = 0; | 1446 | err = 0; |
1437 | if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) { | 1447 | if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) { |
1438 | err = sunsu_kbd_ms_init(up); | 1448 | err = sunsu_kbd_ms_init(up); |
1439 | if (err) | 1449 | if (err) { |
1450 | kfree(up); | ||
1440 | goto out_unmap; | 1451 | goto out_unmap; |
1452 | } | ||
1453 | dev_set_drvdata(&op->dev, up); | ||
1441 | 1454 | ||
1442 | return 0; | 1455 | return 0; |
1443 | } | 1456 | } |
@@ -1476,8 +1489,12 @@ static int __devexit su_remove(struct of_device *dev) | |||
1476 | #ifdef CONFIG_SERIO | 1489 | #ifdef CONFIG_SERIO |
1477 | serio_unregister_port(&up->serio); | 1490 | serio_unregister_port(&up->serio); |
1478 | #endif | 1491 | #endif |
1479 | } else if (up->port.type != PORT_UNKNOWN) | 1492 | kfree(up); |
1493 | } else if (up->port.type != PORT_UNKNOWN) { | ||
1480 | uart_remove_one_port(&sunsu_reg, &up->port); | 1494 | uart_remove_one_port(&sunsu_reg, &up->port); |
1495 | } | ||
1496 | |||
1497 | dev_set_drvdata(&dev->dev, NULL); | ||
1481 | 1498 | ||
1482 | return 0; | 1499 | return 0; |
1483 | } | 1500 | } |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 7fdbc5dad5fd..2ee742d40c43 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
@@ -23,6 +23,7 @@ config USB_ARCH_HAS_OHCI | |||
23 | default y if ARCH_LH7A404 | 23 | default y if ARCH_LH7A404 |
24 | default y if ARCH_S3C2410 | 24 | default y if ARCH_S3C2410 |
25 | default y if PXA27x | 25 | default y if PXA27x |
26 | default y if ARCH_EP93XX | ||
26 | default y if ARCH_AT91RM9200 | 27 | default y if ARCH_AT91RM9200 |
27 | # PPC: | 28 | # PPC: |
28 | default y if STB03xxx | 29 | default y if STB03xxx |
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index c7123bf71c58..4710eb02ed64 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
@@ -48,7 +48,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/ | |||
48 | obj-$(CONFIG_USB_SERIAL) += serial/ | 48 | obj-$(CONFIG_USB_SERIAL) += serial/ |
49 | 49 | ||
50 | obj-$(CONFIG_USB_AUERSWALD) += misc/ | 50 | obj-$(CONFIG_USB_AUERSWALD) += misc/ |
51 | obj-$(CONFIG_USB_CY7C63) += misc/ | 51 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= misc/ |
52 | obj-$(CONFIG_USB_CYTHERM) += misc/ | 52 | obj-$(CONFIG_USB_CYTHERM) += misc/ |
53 | obj-$(CONFIG_USB_EMI26) += misc/ | 53 | obj-$(CONFIG_USB_EMI26) += misc/ |
54 | obj-$(CONFIG_USB_EMI62) += misc/ | 54 | obj-$(CONFIG_USB_EMI62) += misc/ |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 3670d77e912c..ca90326f2f5c 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -291,13 +291,13 @@ static void acm_read_bulk(struct urb *urb, struct pt_regs *regs) | |||
291 | struct acm_ru *rcv = urb->context; | 291 | struct acm_ru *rcv = urb->context; |
292 | struct acm *acm = rcv->instance; | 292 | struct acm *acm = rcv->instance; |
293 | int status = urb->status; | 293 | int status = urb->status; |
294 | dbg("Entering acm_read_bulk with status %d\n", urb->status); | 294 | dbg("Entering acm_read_bulk with status %d", urb->status); |
295 | 295 | ||
296 | if (!ACM_READY(acm)) | 296 | if (!ACM_READY(acm)) |
297 | return; | 297 | return; |
298 | 298 | ||
299 | if (status) | 299 | if (status) |
300 | dev_dbg(&acm->data->dev, "bulk rx status %d\n", status); | 300 | dev_dbg(&acm->data->dev, "bulk rx status %d", status); |
301 | 301 | ||
302 | buf = rcv->buffer; | 302 | buf = rcv->buffer; |
303 | buf->size = urb->actual_length; | 303 | buf->size = urb->actual_length; |
@@ -343,7 +343,7 @@ next_buffer: | |||
343 | list_del(&buf->list); | 343 | list_del(&buf->list); |
344 | spin_unlock(&acm->read_lock); | 344 | spin_unlock(&acm->read_lock); |
345 | 345 | ||
346 | dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size); | 346 | dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size); |
347 | 347 | ||
348 | tty_buffer_request_room(tty, buf->size); | 348 | tty_buffer_request_room(tty, buf->size); |
349 | if (!acm->throttle) | 349 | if (!acm->throttle) |
@@ -394,7 +394,7 @@ urbs: | |||
394 | rcv->urb->transfer_dma = buf->dma; | 394 | rcv->urb->transfer_dma = buf->dma; |
395 | rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 395 | rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
396 | 396 | ||
397 | dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p\n", rcv->urb, rcv, buf); | 397 | dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf); |
398 | 398 | ||
399 | /* This shouldn't kill the driver as unsuccessful URBs are returned to the | 399 | /* This shouldn't kill the driver as unsuccessful URBs are returned to the |
400 | free-urbs-pool and resubmited ASAP */ | 400 | free-urbs-pool and resubmited ASAP */ |
@@ -413,7 +413,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) | |||
413 | { | 413 | { |
414 | struct acm *acm = (struct acm *)urb->context; | 414 | struct acm *acm = (struct acm *)urb->context; |
415 | 415 | ||
416 | dbg("Entering acm_write_bulk with status %d\n", urb->status); | 416 | dbg("Entering acm_write_bulk with status %d", urb->status); |
417 | 417 | ||
418 | acm_write_done(acm); | 418 | acm_write_done(acm); |
419 | acm_write_start(acm); | 419 | acm_write_start(acm); |
@@ -424,7 +424,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) | |||
424 | static void acm_softint(void *private) | 424 | static void acm_softint(void *private) |
425 | { | 425 | { |
426 | struct acm *acm = private; | 426 | struct acm *acm = private; |
427 | dbg("Entering acm_softint.\n"); | 427 | dbg("Entering acm_softint."); |
428 | 428 | ||
429 | if (!ACM_READY(acm)) | 429 | if (!ACM_READY(acm)) |
430 | return; | 430 | return; |
@@ -440,7 +440,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
440 | struct acm *acm; | 440 | struct acm *acm; |
441 | int rv = -EINVAL; | 441 | int rv = -EINVAL; |
442 | int i; | 442 | int i; |
443 | dbg("Entering acm_tty_open.\n"); | 443 | dbg("Entering acm_tty_open."); |
444 | 444 | ||
445 | mutex_lock(&open_mutex); | 445 | mutex_lock(&open_mutex); |
446 | 446 | ||
@@ -541,7 +541,7 @@ static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int c | |||
541 | int wbn; | 541 | int wbn; |
542 | struct acm_wb *wb; | 542 | struct acm_wb *wb; |
543 | 543 | ||
544 | dbg("Entering acm_tty_write to write %d bytes,\n", count); | 544 | dbg("Entering acm_tty_write to write %d bytes,", count); |
545 | 545 | ||
546 | if (!ACM_READY(acm)) | 546 | if (!ACM_READY(acm)) |
547 | return -EINVAL; | 547 | return -EINVAL; |
@@ -793,7 +793,7 @@ static int acm_probe (struct usb_interface *intf, | |||
793 | 793 | ||
794 | if (!buflen) { | 794 | if (!buflen) { |
795 | if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) { | 795 | if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) { |
796 | dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n"); | 796 | dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint"); |
797 | buflen = intf->cur_altsetting->endpoint->extralen; | 797 | buflen = intf->cur_altsetting->endpoint->extralen; |
798 | buffer = intf->cur_altsetting->endpoint->extra; | 798 | buffer = intf->cur_altsetting->endpoint->extra; |
799 | } else { | 799 | } else { |
@@ -842,24 +842,24 @@ next_desc: | |||
842 | 842 | ||
843 | if (!union_header) { | 843 | if (!union_header) { |
844 | if (call_interface_num > 0) { | 844 | if (call_interface_num > 0) { |
845 | dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n"); | 845 | dev_dbg(&intf->dev,"No union descriptor, using call management descriptor"); |
846 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); | 846 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); |
847 | control_interface = intf; | 847 | control_interface = intf; |
848 | } else { | 848 | } else { |
849 | dev_dbg(&intf->dev,"No union descriptor, giving up\n"); | 849 | dev_dbg(&intf->dev,"No union descriptor, giving up"); |
850 | return -ENODEV; | 850 | return -ENODEV; |
851 | } | 851 | } |
852 | } else { | 852 | } else { |
853 | control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); | 853 | control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); |
854 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0)); | 854 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0)); |
855 | if (!control_interface || !data_interface) { | 855 | if (!control_interface || !data_interface) { |
856 | dev_dbg(&intf->dev,"no interfaces\n"); | 856 | dev_dbg(&intf->dev,"no interfaces"); |
857 | return -ENODEV; | 857 | return -ENODEV; |
858 | } | 858 | } |
859 | } | 859 | } |
860 | 860 | ||
861 | if (data_interface_num != call_interface_num) | 861 | if (data_interface_num != call_interface_num) |
862 | dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n"); | 862 | dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported."); |
863 | 863 | ||
864 | skip_normal_probe: | 864 | skip_normal_probe: |
865 | 865 | ||
@@ -867,7 +867,7 @@ skip_normal_probe: | |||
867 | if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) { | 867 | if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) { |
868 | if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) { | 868 | if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) { |
869 | struct usb_interface *t; | 869 | struct usb_interface *t; |
870 | dev_dbg(&intf->dev,"Your device has switched interfaces.\n"); | 870 | dev_dbg(&intf->dev,"Your device has switched interfaces."); |
871 | 871 | ||
872 | t = control_interface; | 872 | t = control_interface; |
873 | control_interface = data_interface; | 873 | control_interface = data_interface; |
@@ -878,7 +878,7 @@ skip_normal_probe: | |||
878 | } | 878 | } |
879 | 879 | ||
880 | if (usb_interface_claimed(data_interface)) { /* valid in this context */ | 880 | if (usb_interface_claimed(data_interface)) { /* valid in this context */ |
881 | dev_dbg(&intf->dev,"The data interface isn't available\n"); | 881 | dev_dbg(&intf->dev,"The data interface isn't available"); |
882 | return -EBUSY; | 882 | return -EBUSY; |
883 | } | 883 | } |
884 | 884 | ||
@@ -895,7 +895,7 @@ skip_normal_probe: | |||
895 | if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { | 895 | if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { |
896 | /* descriptors are swapped */ | 896 | /* descriptors are swapped */ |
897 | struct usb_endpoint_descriptor *t; | 897 | struct usb_endpoint_descriptor *t; |
898 | dev_dbg(&intf->dev,"The data interface has switched endpoints\n"); | 898 | dev_dbg(&intf->dev,"The data interface has switched endpoints"); |
899 | 899 | ||
900 | t = epread; | 900 | t = epread; |
901 | epread = epwrite; | 901 | epread = epwrite; |
@@ -910,7 +910,7 @@ skip_normal_probe: | |||
910 | } | 910 | } |
911 | 911 | ||
912 | if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) { | 912 | if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) { |
913 | dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n"); | 913 | dev_dbg(&intf->dev, "out of memory (acm kzalloc)"); |
914 | goto alloc_fail; | 914 | goto alloc_fail; |
915 | } | 915 | } |
916 | 916 | ||
@@ -936,26 +936,26 @@ skip_normal_probe: | |||
936 | 936 | ||
937 | buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); | 937 | buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); |
938 | if (!buf) { | 938 | if (!buf) { |
939 | dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); | 939 | dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)"); |
940 | goto alloc_fail2; | 940 | goto alloc_fail2; |
941 | } | 941 | } |
942 | acm->ctrl_buffer = buf; | 942 | acm->ctrl_buffer = buf; |
943 | 943 | ||
944 | if (acm_write_buffers_alloc(acm) < 0) { | 944 | if (acm_write_buffers_alloc(acm) < 0) { |
945 | dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n"); | 945 | dev_dbg(&intf->dev, "out of memory (write buffer alloc)"); |
946 | goto alloc_fail4; | 946 | goto alloc_fail4; |
947 | } | 947 | } |
948 | 948 | ||
949 | acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); | 949 | acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); |
950 | if (!acm->ctrlurb) { | 950 | if (!acm->ctrlurb) { |
951 | dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); | 951 | dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)"); |
952 | goto alloc_fail5; | 952 | goto alloc_fail5; |
953 | } | 953 | } |
954 | for (i = 0; i < num_rx_buf; i++) { | 954 | for (i = 0; i < num_rx_buf; i++) { |
955 | struct acm_ru *rcv = &(acm->ru[i]); | 955 | struct acm_ru *rcv = &(acm->ru[i]); |
956 | 956 | ||
957 | if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) { | 957 | if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) { |
958 | dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)\n"); | 958 | dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)"); |
959 | goto alloc_fail7; | 959 | goto alloc_fail7; |
960 | } | 960 | } |
961 | 961 | ||
@@ -966,13 +966,13 @@ skip_normal_probe: | |||
966 | struct acm_rb *buf = &(acm->rb[i]); | 966 | struct acm_rb *buf = &(acm->rb[i]); |
967 | 967 | ||
968 | if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) { | 968 | if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) { |
969 | dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)\n"); | 969 | dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)"); |
970 | goto alloc_fail7; | 970 | goto alloc_fail7; |
971 | } | 971 | } |
972 | } | 972 | } |
973 | acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); | 973 | acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); |
974 | if (!acm->writeurb) { | 974 | if (!acm->writeurb) { |
975 | dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n"); | 975 | dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)"); |
976 | goto alloc_fail7; | 976 | goto alloc_fail7; |
977 | } | 977 | } |
978 | 978 | ||
@@ -1086,6 +1086,9 @@ static struct usb_device_id acm_ids[] = { | |||
1086 | { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */ | 1086 | { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */ |
1087 | .driver_info = SINGLE_RX_URB, /* firmware bug */ | 1087 | .driver_info = SINGLE_RX_URB, /* firmware bug */ |
1088 | }, | 1088 | }, |
1089 | { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */ | ||
1090 | .driver_info = SINGLE_RX_URB, /* firmware bug */ | ||
1091 | }, | ||
1089 | /* control interfaces with various AT-command sets */ | 1092 | /* control interfaces with various AT-command sets */ |
1090 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | 1093 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
1091 | USB_CDC_ACM_PROTO_AT_V25TER) }, | 1094 | USB_CDC_ACM_PROTO_AT_V25TER) }, |
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index a08787e253aa..6e3b5358a760 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
@@ -31,9 +31,6 @@ config USB_DEVICEFS | |||
31 | For the format of the various /proc/bus/usb/ files, please read | 31 | For the format of the various /proc/bus/usb/ files, please read |
32 | <file:Documentation/usb/proc_usb_info.txt>. | 32 | <file:Documentation/usb/proc_usb_info.txt>. |
33 | 33 | ||
34 | Please note that this code is completely unrelated to devfs, the | ||
35 | "/dev file system support". | ||
36 | |||
37 | Most users want to say Y here. | 34 | Most users want to say Y here. |
38 | 35 | ||
39 | config USB_BANDWIDTH | 36 | config USB_BANDWIDTH |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 875596e98e42..26c8cb5f3e67 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1790,7 +1790,10 @@ static int finish_device_resume(struct usb_device *udev) | |||
1790 | * and device drivers will know about any resume quirks. | 1790 | * and device drivers will know about any resume quirks. |
1791 | */ | 1791 | */ |
1792 | status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); | 1792 | status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); |
1793 | if (status < 2) | 1793 | if (status >= 0) |
1794 | status = (status == 2 ? 0 : -ENODEV); | ||
1795 | |||
1796 | if (status) | ||
1794 | dev_dbg(&udev->dev, | 1797 | dev_dbg(&udev->dev, |
1795 | "gone after usb resume? status %d\n", | 1798 | "gone after usb resume? status %d\n", |
1796 | status); | 1799 | status); |
@@ -1879,7 +1882,12 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | |||
1879 | dev_dbg(hub->intfdev, | 1882 | dev_dbg(hub->intfdev, |
1880 | "port %d status %04x.%04x after resume, %d\n", | 1883 | "port %d status %04x.%04x after resume, %d\n", |
1881 | port1, portchange, devstatus, status); | 1884 | port1, portchange, devstatus, status); |
1885 | if (status >= 0) | ||
1886 | status = -ENODEV; | ||
1882 | } else { | 1887 | } else { |
1888 | if (portchange & USB_PORT_STAT_C_SUSPEND) | ||
1889 | clear_port_feature(hub->hdev, port1, | ||
1890 | USB_PORT_FEAT_C_SUSPEND); | ||
1883 | /* TRSMRCY = 10 msec */ | 1891 | /* TRSMRCY = 10 msec */ |
1884 | msleep(10); | 1892 | msleep(10); |
1885 | if (udev) | 1893 | if (udev) |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index f48c3dbc367a..3182c2224ba2 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
@@ -695,7 +695,7 @@ static void usbfs_remove_device(struct usb_device *dev) | |||
695 | wake_up_all(&ds->wait); | 695 | wake_up_all(&ds->wait); |
696 | list_del_init(&ds->list); | 696 | list_del_init(&ds->list); |
697 | if (ds->discsignr) { | 697 | if (ds->discsignr) { |
698 | sinfo.si_signo = SIGPIPE; | 698 | sinfo.si_signo = ds->discsignr; |
699 | sinfo.si_errno = EPIPE; | 699 | sinfo.si_errno = EPIPE; |
700 | sinfo.si_code = SI_ASYNCIO; | 700 | sinfo.si_code = SI_ASYNCIO; |
701 | sinfo.si_addr = ds->disccontext; | 701 | sinfo.si_addr = ds->disccontext; |
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index f7c6d758e1b0..53d584589c26 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c | |||
@@ -34,12 +34,12 @@ | |||
34 | 34 | ||
35 | 35 | ||
36 | /* we must assign addresses for configurable endpoints (like net2280) */ | 36 | /* we must assign addresses for configurable endpoints (like net2280) */ |
37 | static __initdata unsigned epnum; | 37 | static __devinitdata unsigned epnum; |
38 | 38 | ||
39 | // #define MANY_ENDPOINTS | 39 | // #define MANY_ENDPOINTS |
40 | #ifdef MANY_ENDPOINTS | 40 | #ifdef MANY_ENDPOINTS |
41 | /* more than 15 configurable endpoints */ | 41 | /* more than 15 configurable endpoints */ |
42 | static __initdata unsigned in_epnum; | 42 | static __devinitdata unsigned in_epnum; |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | 45 | ||
@@ -59,7 +59,7 @@ static __initdata unsigned in_epnum; | |||
59 | * NOTE: each endpoint is unidirectional, as specified by its USB | 59 | * NOTE: each endpoint is unidirectional, as specified by its USB |
60 | * descriptor; and isn't specific to a configuration or altsetting. | 60 | * descriptor; and isn't specific to a configuration or altsetting. |
61 | */ | 61 | */ |
62 | static int __init | 62 | static int __devinit |
63 | ep_matches ( | 63 | ep_matches ( |
64 | struct usb_gadget *gadget, | 64 | struct usb_gadget *gadget, |
65 | struct usb_ep *ep, | 65 | struct usb_ep *ep, |
@@ -73,7 +73,7 @@ ep_matches ( | |||
73 | /* endpoint already claimed? */ | 73 | /* endpoint already claimed? */ |
74 | if (0 != ep->driver_data) | 74 | if (0 != ep->driver_data) |
75 | return 0; | 75 | return 0; |
76 | 76 | ||
77 | /* only support ep0 for portable CONTROL traffic */ | 77 | /* only support ep0 for portable CONTROL traffic */ |
78 | type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | 78 | type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; |
79 | if (USB_ENDPOINT_XFER_CONTROL == type) | 79 | if (USB_ENDPOINT_XFER_CONTROL == type) |
@@ -186,7 +186,7 @@ ep_matches ( | |||
186 | return 1; | 186 | return 1; |
187 | } | 187 | } |
188 | 188 | ||
189 | static struct usb_ep * __init | 189 | static struct usb_ep * __devinit |
190 | find_ep (struct usb_gadget *gadget, const char *name) | 190 | find_ep (struct usb_gadget *gadget, const char *name) |
191 | { | 191 | { |
192 | struct usb_ep *ep; | 192 | struct usb_ep *ep; |
@@ -228,7 +228,7 @@ find_ep (struct usb_gadget *gadget, const char *name) | |||
228 | * | 228 | * |
229 | * On failure, this returns a null endpoint descriptor. | 229 | * On failure, this returns a null endpoint descriptor. |
230 | */ | 230 | */ |
231 | struct usb_ep * __init usb_ep_autoconfig ( | 231 | struct usb_ep * __devinit usb_ep_autoconfig ( |
232 | struct usb_gadget *gadget, | 232 | struct usb_gadget *gadget, |
233 | struct usb_endpoint_descriptor *desc | 233 | struct usb_endpoint_descriptor *desc |
234 | ) | 234 | ) |
@@ -276,7 +276,7 @@ struct usb_ep * __init usb_ep_autoconfig ( | |||
276 | return ep; | 276 | return ep; |
277 | } | 277 | } |
278 | 278 | ||
279 | /* Second, look at endpoints until an unclaimed one looks usable */ | 279 | /* Second, look at endpoints until an unclaimed one looks usable */ |
280 | list_for_each_entry (ep, &gadget->ep_list, ep_list) { | 280 | list_for_each_entry (ep, &gadget->ep_list, ep_list) { |
281 | if (ep_matches (gadget, ep, desc)) | 281 | if (ep_matches (gadget, ep, desc)) |
282 | return ep; | 282 | return ep; |
@@ -295,7 +295,7 @@ struct usb_ep * __init usb_ep_autoconfig ( | |||
295 | * state such as ep->driver_data and the record of assigned endpoints | 295 | * state such as ep->driver_data and the record of assigned endpoints |
296 | * used by usb_ep_autoconfig(). | 296 | * used by usb_ep_autoconfig(). |
297 | */ | 297 | */ |
298 | void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget) | 298 | void __devinit usb_ep_autoconfig_reset (struct usb_gadget *gadget) |
299 | { | 299 | { |
300 | struct usb_ep *ep; | 300 | struct usb_ep *ep; |
301 | 301 | ||
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 8320fcef0425..4fe1bec1c255 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
@@ -2131,7 +2131,7 @@ eth_req_free (struct usb_ep *ep, struct usb_request *req) | |||
2131 | } | 2131 | } |
2132 | 2132 | ||
2133 | 2133 | ||
2134 | static void __exit | 2134 | static void /* __init_or_exit */ |
2135 | eth_unbind (struct usb_gadget *gadget) | 2135 | eth_unbind (struct usb_gadget *gadget) |
2136 | { | 2136 | { |
2137 | struct eth_dev *dev = get_gadget_data (gadget); | 2137 | struct eth_dev *dev = get_gadget_data (gadget); |
@@ -2158,7 +2158,7 @@ eth_unbind (struct usb_gadget *gadget) | |||
2158 | set_gadget_data (gadget, NULL); | 2158 | set_gadget_data (gadget, NULL); |
2159 | } | 2159 | } |
2160 | 2160 | ||
2161 | static u8 __init nibble (unsigned char c) | 2161 | static u8 __devinit nibble (unsigned char c) |
2162 | { | 2162 | { |
2163 | if (likely (isdigit (c))) | 2163 | if (likely (isdigit (c))) |
2164 | return c - '0'; | 2164 | return c - '0'; |
@@ -2168,7 +2168,7 @@ static u8 __init nibble (unsigned char c) | |||
2168 | return 0; | 2168 | return 0; |
2169 | } | 2169 | } |
2170 | 2170 | ||
2171 | static int __init get_ether_addr(const char *str, u8 *dev_addr) | 2171 | static int __devinit get_ether_addr(const char *str, u8 *dev_addr) |
2172 | { | 2172 | { |
2173 | if (str) { | 2173 | if (str) { |
2174 | unsigned i; | 2174 | unsigned i; |
@@ -2189,7 +2189,7 @@ static int __init get_ether_addr(const char *str, u8 *dev_addr) | |||
2189 | return 1; | 2189 | return 1; |
2190 | } | 2190 | } |
2191 | 2191 | ||
2192 | static int __init | 2192 | static int __devinit |
2193 | eth_bind (struct usb_gadget *gadget) | 2193 | eth_bind (struct usb_gadget *gadget) |
2194 | { | 2194 | { |
2195 | struct eth_dev *dev; | 2195 | struct eth_dev *dev; |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index b1a9cf06f3e6..8d7f1e84cd7b 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
@@ -3691,7 +3691,7 @@ static void lun_release(struct device *dev) | |||
3691 | kref_put(&fsg->ref, fsg_release); | 3691 | kref_put(&fsg->ref, fsg_release); |
3692 | } | 3692 | } |
3693 | 3693 | ||
3694 | static void __exit fsg_unbind(struct usb_gadget *gadget) | 3694 | static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) |
3695 | { | 3695 | { |
3696 | struct fsg_dev *fsg = get_gadget_data(gadget); | 3696 | struct fsg_dev *fsg = get_gadget_data(gadget); |
3697 | int i; | 3697 | int i; |
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index 354670d12308..408c3380d602 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c | |||
@@ -1398,7 +1398,7 @@ static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS]; | |||
1398 | #endif /* CONFIG_USB_GADGET_DEBUG_FILES */ | 1398 | #endif /* CONFIG_USB_GADGET_DEBUG_FILES */ |
1399 | 1399 | ||
1400 | 1400 | ||
1401 | int __init rndis_init (void) | 1401 | int __devinit rndis_init (void) |
1402 | { | 1402 | { |
1403 | u8 i; | 1403 | u8 i; |
1404 | 1404 | ||
diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h index 2956608be751..4c3c7259f019 100644 --- a/drivers/usb/gadget/rndis.h +++ b/drivers/usb/gadget/rndis.h | |||
@@ -264,7 +264,7 @@ int rndis_signal_disconnect (int configNr); | |||
264 | int rndis_state (int configNr); | 264 | int rndis_state (int configNr); |
265 | extern void rndis_set_host_mac (int configNr, const u8 *addr); | 265 | extern void rndis_set_host_mac (int configNr, const u8 *addr); |
266 | 266 | ||
267 | int __init rndis_init (void); | 267 | int __devinit rndis_init (void); |
268 | void rndis_exit (void); | 268 | void rndis_exit (void); |
269 | 269 | ||
270 | #endif /* _LINUX_RNDIS_H */ | 270 | #endif /* _LINUX_RNDIS_H */ |
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index 30d7664d449d..e762aa19ab0a 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c | |||
@@ -1473,7 +1473,7 @@ autoconf_fail: | |||
1473 | * Called on module unload. Frees the control request and device | 1473 | * Called on module unload. Frees the control request and device |
1474 | * structure. | 1474 | * structure. |
1475 | */ | 1475 | */ |
1476 | static void __exit gs_unbind(struct usb_gadget *gadget) | 1476 | static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget) |
1477 | { | 1477 | { |
1478 | struct gs_dev *dev = get_gadget_data(gadget); | 1478 | struct gs_dev *dev = get_gadget_data(gadget); |
1479 | 1479 | ||
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 3a08a7ab4ce0..b7018ee487ea 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
@@ -1121,7 +1121,7 @@ zero_autoresume (unsigned long _dev) | |||
1121 | 1121 | ||
1122 | /*-------------------------------------------------------------------------*/ | 1122 | /*-------------------------------------------------------------------------*/ |
1123 | 1123 | ||
1124 | static void __exit | 1124 | static void /* __init_or_exit */ |
1125 | zero_unbind (struct usb_gadget *gadget) | 1125 | zero_unbind (struct usb_gadget *gadget) |
1126 | { | 1126 | { |
1127 | struct zero_dev *dev = get_gadget_data (gadget); | 1127 | struct zero_dev *dev = get_gadget_data (gadget); |
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index d66867aa527e..26ed757d22a6 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c | |||
@@ -41,8 +41,6 @@ | |||
41 | #endif | 41 | #endif |
42 | #define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN) | 42 | #define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN) |
43 | 43 | ||
44 | #endif /* Au1200 */ | ||
45 | |||
46 | extern int usb_disabled(void); | 44 | extern int usb_disabled(void); |
47 | 45 | ||
48 | /*-------------------------------------------------------------------------*/ | 46 | /*-------------------------------------------------------------------------*/ |
@@ -107,9 +105,9 @@ int usb_ehci_au1xxx_probe(const struct hc_driver *driver, | |||
107 | 105 | ||
108 | /* Au1200 AB USB does not support coherent memory */ | 106 | /* Au1200 AB USB does not support coherent memory */ |
109 | if (!(read_c0_prid() & 0xff)) { | 107 | if (!(read_c0_prid() & 0xff)) { |
110 | pr_info("%s: this is chip revision AB!\n", dev->dev.name); | 108 | pr_info("%s: this is chip revision AB!\n", dev->name); |
111 | pr_info("%s: update your board or re-configure the kernel\n", | 109 | pr_info("%s: update your board or re-configure the kernel\n", |
112 | dev->dev.name); | 110 | dev->name); |
113 | return -ENODEV; | 111 | return -ENODEV; |
114 | } | 112 | } |
115 | #endif | 113 | #endif |
@@ -228,9 +226,8 @@ static const struct hc_driver ehci_au1xxx_hc_driver = { | |||
228 | 226 | ||
229 | /*-------------------------------------------------------------------------*/ | 227 | /*-------------------------------------------------------------------------*/ |
230 | 228 | ||
231 | static int ehci_hcd_au1xxx_drv_probe(struct device *dev) | 229 | static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) |
232 | { | 230 | { |
233 | struct platform_device *pdev = to_platform_device(dev); | ||
234 | struct usb_hcd *hcd = NULL; | 231 | struct usb_hcd *hcd = NULL; |
235 | int ret; | 232 | int ret; |
236 | 233 | ||
@@ -243,10 +240,9 @@ static int ehci_hcd_au1xxx_drv_probe(struct device *dev) | |||
243 | return ret; | 240 | return ret; |
244 | } | 241 | } |
245 | 242 | ||
246 | static int ehci_hcd_au1xxx_drv_remove(struct device *dev) | 243 | static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev) |
247 | { | 244 | { |
248 | struct platform_device *pdev = to_platform_device(dev); | 245 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
249 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
250 | 246 | ||
251 | usb_ehci_au1xxx_remove(hcd, pdev); | 247 | usb_ehci_au1xxx_remove(hcd, pdev); |
252 | return 0; | 248 | return 0; |
@@ -269,12 +265,13 @@ static int ehci_hcd_au1xxx_drv_resume(struct device *dev) | |||
269 | } | 265 | } |
270 | */ | 266 | */ |
271 | MODULE_ALIAS("au1xxx-ehci"); | 267 | MODULE_ALIAS("au1xxx-ehci"); |
272 | /* FIXME use "struct platform_driver" */ | 268 | static struct platform_driver ehci_hcd_au1xxx_driver = { |
273 | static struct device_driver ehci_hcd_au1xxx_driver = { | ||
274 | .name = "au1xxx-ehci", | ||
275 | .bus = &platform_bus_type, | ||
276 | .probe = ehci_hcd_au1xxx_drv_probe, | 269 | .probe = ehci_hcd_au1xxx_drv_probe, |
277 | .remove = ehci_hcd_au1xxx_drv_remove, | 270 | .remove = ehci_hcd_au1xxx_drv_remove, |
278 | /*.suspend = ehci_hcd_au1xxx_drv_suspend, */ | 271 | /*.suspend = ehci_hcd_au1xxx_drv_suspend, */ |
279 | /*.resume = ehci_hcd_au1xxx_drv_resume, */ | 272 | /*.resume = ehci_hcd_au1xxx_drv_resume, */ |
273 | .driver = { | ||
274 | .name = "au1xxx-ehci", | ||
275 | .bus = &platform_bus_type | ||
276 | } | ||
280 | }; | 277 | }; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index cee6f538de0a..85b0b4ad4c16 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -625,10 +625,11 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) | |||
625 | writel (status | CMD_RUN, &ehci->regs->command); | 625 | writel (status | CMD_RUN, &ehci->regs->command); |
626 | 626 | ||
627 | while (i--) { | 627 | while (i--) { |
628 | status = readl (&ehci->regs->port_status [i]); | 628 | int pstatus = readl (&ehci->regs->port_status [i]); |
629 | if (status & PORT_OWNER) | 629 | |
630 | if (pstatus & PORT_OWNER) | ||
630 | continue; | 631 | continue; |
631 | if (!(status & PORT_RESUME) | 632 | if (!(pstatus & PORT_RESUME) |
632 | || ehci->reset_done [i] != 0) | 633 | || ehci->reset_done [i] != 0) |
633 | continue; | 634 | continue; |
634 | 635 | ||
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index 689261e44018..822914e2f43b 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c | |||
@@ -101,13 +101,16 @@ static void au1xxx_start_ohc(struct platform_device *dev) | |||
101 | 101 | ||
102 | #endif /* Au1200 */ | 102 | #endif /* Au1200 */ |
103 | 103 | ||
104 | #ifndef CONFIG_SOC_AU1200 | ||
104 | /* wait for reset complete (read register twice; see au1500 errata) */ | 105 | /* wait for reset complete (read register twice; see au1500 errata) */ |
105 | while (au_readl(USB_HOST_CONFIG), | 106 | while (au_readl(USB_HOST_CONFIG), |
106 | !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD)) | 107 | !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD)) |
108 | #endif | ||
107 | udelay(1000); | 109 | udelay(1000); |
108 | 110 | ||
109 | printk(KERN_DEBUG __FILE__ | 111 | printk(KERN_DEBUG __FILE__ |
110 | ": Clock to USB host has been enabled \n"); | 112 | ": Clock to USB host has been enabled \n"); |
113 | #endif | ||
111 | } | 114 | } |
112 | 115 | ||
113 | static void au1xxx_stop_ohc(struct platform_device *dev) | 116 | static void au1xxx_stop_ohc(struct platform_device *dev) |
@@ -157,9 +160,9 @@ static int usb_ohci_au1xxx_probe(const struct hc_driver *driver, | |||
157 | /* Au1200 AB USB does not support coherent memory */ | 160 | /* Au1200 AB USB does not support coherent memory */ |
158 | if (!(read_c0_prid() & 0xff)) { | 161 | if (!(read_c0_prid() & 0xff)) { |
159 | pr_info("%s: this is chip revision AB !!\n", | 162 | pr_info("%s: this is chip revision AB !!\n", |
160 | dev->dev.name); | 163 | dev->name); |
161 | pr_info("%s: update your board or re-configure the kernel\n", | 164 | pr_info("%s: update your board or re-configure the kernel\n", |
162 | dev->dev.name); | 165 | dev->name); |
163 | return -ENODEV; | 166 | return -ENODEV; |
164 | } | 167 | } |
165 | #endif | 168 | #endif |
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c new file mode 100644 index 000000000000..6531c4d26527 --- /dev/null +++ b/drivers/usb/host/ohci-ep93xx.c | |||
@@ -0,0 +1,225 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | ||
5 | * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> | ||
6 | * (C) Copyright 2002 Hewlett-Packard Company | ||
7 | * | ||
8 | * Bus Glue for ep93xx. | ||
9 | * | ||
10 | * Written by Christopher Hoover <ch@hpl.hp.com> | ||
11 | * Based on fragments of previous driver by Russell King et al. | ||
12 | * | ||
13 | * Modified for LH7A404 from ohci-sa1111.c | ||
14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> | ||
15 | * | ||
16 | * Modified for pxa27x from ohci-lh7a404.c | ||
17 | * by Nick Bane <nick@cecomputing.co.uk> 26-8-2004 | ||
18 | * | ||
19 | * Modified for ep93xx from ohci-pxa27x.c | ||
20 | * by Lennert Buytenhek <buytenh@wantstofly.org> 28-2-2006 | ||
21 | * Based on an earlier driver by Ray Lehtiniemi | ||
22 | * | ||
23 | * This file is licenced under the GPL. | ||
24 | */ | ||
25 | |||
26 | #include <linux/clk.h> | ||
27 | #include <linux/device.h> | ||
28 | #include <linux/signal.h> | ||
29 | #include <linux/platform_device.h> | ||
30 | |||
31 | #include <asm/mach-types.h> | ||
32 | #include <asm/hardware.h> | ||
33 | |||
34 | static struct clk *usb_host_clock; | ||
35 | |||
36 | static void ep93xx_start_hc(struct device *dev) | ||
37 | { | ||
38 | clk_enable(usb_host_clock); | ||
39 | } | ||
40 | |||
41 | static void ep93xx_stop_hc(struct device *dev) | ||
42 | { | ||
43 | clk_disable(usb_host_clock); | ||
44 | } | ||
45 | |||
46 | static int usb_hcd_ep93xx_probe(const struct hc_driver *driver, | ||
47 | struct platform_device *pdev) | ||
48 | { | ||
49 | int retval; | ||
50 | struct usb_hcd *hcd; | ||
51 | |||
52 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { | ||
53 | pr_debug("resource[1] is not IORESOURCE_IRQ"); | ||
54 | return -ENOMEM; | ||
55 | } | ||
56 | |||
57 | hcd = usb_create_hcd(driver, &pdev->dev, "ep93xx"); | ||
58 | if (hcd == NULL) | ||
59 | return -ENOMEM; | ||
60 | |||
61 | hcd->rsrc_start = pdev->resource[0].start; | ||
62 | hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; | ||
63 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
64 | usb_put_hcd(hcd); | ||
65 | retval = -EBUSY; | ||
66 | goto err1; | ||
67 | } | ||
68 | |||
69 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
70 | if (hcd->regs == NULL) { | ||
71 | pr_debug("ioremap failed"); | ||
72 | retval = -ENOMEM; | ||
73 | goto err2; | ||
74 | } | ||
75 | |||
76 | usb_host_clock = clk_get(&pdev->dev, "usb_host"); | ||
77 | ep93xx_start_hc(&pdev->dev); | ||
78 | |||
79 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
80 | |||
81 | retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT); | ||
82 | if (retval == 0) | ||
83 | return retval; | ||
84 | |||
85 | ep93xx_stop_hc(&pdev->dev); | ||
86 | iounmap(hcd->regs); | ||
87 | err2: | ||
88 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
89 | err1: | ||
90 | usb_put_hcd(hcd); | ||
91 | |||
92 | return retval; | ||
93 | } | ||
94 | |||
95 | static void usb_hcd_ep93xx_remove(struct usb_hcd *hcd, | ||
96 | struct platform_device *pdev) | ||
97 | { | ||
98 | usb_remove_hcd(hcd); | ||
99 | ep93xx_stop_hc(&pdev->dev); | ||
100 | clk_put(usb_host_clock); | ||
101 | iounmap(hcd->regs); | ||
102 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
103 | usb_put_hcd(hcd); | ||
104 | } | ||
105 | |||
106 | static int __devinit ohci_ep93xx_start(struct usb_hcd *hcd) | ||
107 | { | ||
108 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
109 | int ret; | ||
110 | |||
111 | if ((ret = ohci_init(ohci)) < 0) | ||
112 | return ret; | ||
113 | |||
114 | if ((ret = ohci_run(ohci)) < 0) { | ||
115 | err("can't start %s", hcd->self.bus_name); | ||
116 | ohci_stop(hcd); | ||
117 | return ret; | ||
118 | } | ||
119 | |||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static struct hc_driver ohci_ep93xx_hc_driver = { | ||
124 | .description = hcd_name, | ||
125 | .product_desc = "EP93xx OHCI", | ||
126 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
127 | .irq = ohci_irq, | ||
128 | .flags = HCD_USB11 | HCD_MEMORY, | ||
129 | .start = ohci_ep93xx_start, | ||
130 | .stop = ohci_stop, | ||
131 | .urb_enqueue = ohci_urb_enqueue, | ||
132 | .urb_dequeue = ohci_urb_dequeue, | ||
133 | .endpoint_disable = ohci_endpoint_disable, | ||
134 | .get_frame_number = ohci_get_frame, | ||
135 | .hub_status_data = ohci_hub_status_data, | ||
136 | .hub_control = ohci_hub_control, | ||
137 | #ifdef CONFIG_PM | ||
138 | .bus_suspend = ohci_bus_suspend, | ||
139 | .bus_resume = ohci_bus_resume, | ||
140 | #endif | ||
141 | .start_port_reset = ohci_start_port_reset, | ||
142 | }; | ||
143 | |||
144 | extern int usb_disabled(void); | ||
145 | |||
146 | static int ohci_hcd_ep93xx_drv_probe(struct platform_device *pdev) | ||
147 | { | ||
148 | int ret; | ||
149 | |||
150 | ret = -ENODEV; | ||
151 | if (!usb_disabled()) | ||
152 | ret = usb_hcd_ep93xx_probe(&ohci_ep93xx_hc_driver, pdev); | ||
153 | |||
154 | return ret; | ||
155 | } | ||
156 | |||
157 | static int ohci_hcd_ep93xx_drv_remove(struct platform_device *pdev) | ||
158 | { | ||
159 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
160 | |||
161 | usb_hcd_ep93xx_remove(hcd, pdev); | ||
162 | |||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | #ifdef CONFIG_PM | ||
167 | static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state) | ||
168 | { | ||
169 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
170 | struct ochi_hcd *ohci = hcd_to_ohci(hcd); | ||
171 | |||
172 | if (time_before(jiffies, ohci->next_statechange)) | ||
173 | msleep(5); | ||
174 | ohci->next_statechange = jiffies; | ||
175 | |||
176 | ep93xx_stop_hc(&pdev->dev); | ||
177 | hcd->state = HC_STATE_SUSPENDED; | ||
178 | pdev->dev.power.power_state = PMSG_SUSPEND; | ||
179 | |||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | static int ohci_hcd_ep93xx_drv_resume(struct platform_device *pdev) | ||
184 | { | ||
185 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
186 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
187 | int status; | ||
188 | |||
189 | if (time_before(jiffies, ohci->next_statechange)) | ||
190 | msleep(5); | ||
191 | ohci->next_statechange = jiffies; | ||
192 | |||
193 | ep93xx_start_hc(&pdev->dev); | ||
194 | pdev->dev.power.power_state = PMSG_ON; | ||
195 | usb_hcd_resume_root_hub(hcd); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | #endif | ||
200 | |||
201 | |||
202 | static struct platform_driver ohci_hcd_ep93xx_driver = { | ||
203 | .probe = ohci_hcd_ep93xx_drv_probe, | ||
204 | .remove = ohci_hcd_ep93xx_drv_remove, | ||
205 | #ifdef CONFIG_PM | ||
206 | .suspend = ohci_hcd_ep93xx_drv_suspend, | ||
207 | .resume = ohci_hcd_ep93xx_drv_resume, | ||
208 | #endif | ||
209 | .driver = { | ||
210 | .name = "ep93xx-ohci", | ||
211 | }, | ||
212 | }; | ||
213 | |||
214 | static int __init ohci_hcd_ep93xx_init(void) | ||
215 | { | ||
216 | return platform_driver_register(&ohci_hcd_ep93xx_driver); | ||
217 | } | ||
218 | |||
219 | static void __exit ohci_hcd_ep93xx_cleanup(void) | ||
220 | { | ||
221 | platform_driver_unregister(&ohci_hcd_ep93xx_driver); | ||
222 | } | ||
223 | |||
224 | module_init(ohci_hcd_ep93xx_init); | ||
225 | module_exit(ohci_hcd_ep93xx_cleanup); | ||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 8fb842ed5f6e..afef5ac35b4a 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -901,6 +901,10 @@ MODULE_LICENSE ("GPL"); | |||
901 | #include "ohci-pxa27x.c" | 901 | #include "ohci-pxa27x.c" |
902 | #endif | 902 | #endif |
903 | 903 | ||
904 | #ifdef CONFIG_ARCH_EP93XX | ||
905 | #include "ohci-ep93xx.c" | ||
906 | #endif | ||
907 | |||
904 | #ifdef CONFIG_SOC_AU1X00 | 908 | #ifdef CONFIG_SOC_AU1X00 |
905 | #include "ohci-au1xxx.c" | 909 | #include "ohci-au1xxx.c" |
906 | #endif | 910 | #endif |
@@ -919,6 +923,7 @@ MODULE_LICENSE ("GPL"); | |||
919 | || defined(CONFIG_ARCH_OMAP) \ | 923 | || defined(CONFIG_ARCH_OMAP) \ |
920 | || defined (CONFIG_ARCH_LH7A404) \ | 924 | || defined (CONFIG_ARCH_LH7A404) \ |
921 | || defined (CONFIG_PXA27x) \ | 925 | || defined (CONFIG_PXA27x) \ |
926 | || defined (CONFIG_ARCH_EP93XX) \ | ||
922 | || defined (CONFIG_SOC_AU1X00) \ | 927 | || defined (CONFIG_SOC_AU1X00) \ |
923 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ | 928 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ |
924 | || defined (CONFIG_ARCH_AT91RM9200) \ | 929 | || defined (CONFIG_ARCH_AT91RM9200) \ |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 0bb972b58336..5b0a23fd798b 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -581,14 +581,14 @@ static int ohci_hub_control ( | |||
581 | break; | 581 | break; |
582 | case GetHubStatus: | 582 | case GetHubStatus: |
583 | temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); | 583 | temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); |
584 | *(__le32 *) buf = cpu_to_le32 (temp); | 584 | put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); |
585 | break; | 585 | break; |
586 | case GetPortStatus: | 586 | case GetPortStatus: |
587 | if (!wIndex || wIndex > ports) | 587 | if (!wIndex || wIndex > ports) |
588 | goto error; | 588 | goto error; |
589 | wIndex--; | 589 | wIndex--; |
590 | temp = roothub_portstatus (ohci, wIndex); | 590 | temp = roothub_portstatus (ohci, wIndex); |
591 | *(__le32 *) buf = cpu_to_le32 (temp); | 591 | put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); |
592 | 592 | ||
593 | #ifndef OHCI_VERBOSE_DEBUG | 593 | #ifndef OHCI_VERBOSE_DEBUG |
594 | if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ | 594 | if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index dff60568b4a1..20861650905e 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -167,8 +167,6 @@ static int __devinit mmio_resource_enabled(struct pci_dev *pdev, int idx) | |||
167 | static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | 167 | static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) |
168 | { | 168 | { |
169 | void __iomem *base; | 169 | void __iomem *base; |
170 | int wait_time; | ||
171 | u32 control; | ||
172 | 170 | ||
173 | if (!mmio_resource_enabled(pdev, 0)) | 171 | if (!mmio_resource_enabled(pdev, 0)) |
174 | return; | 172 | return; |
@@ -179,9 +177,10 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
179 | 177 | ||
180 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ | 178 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ |
181 | #ifndef __hppa__ | 179 | #ifndef __hppa__ |
182 | control = readl(base + OHCI_CONTROL); | 180 | { |
181 | u32 control = readl(base + OHCI_CONTROL); | ||
183 | if (control & OHCI_CTRL_IR) { | 182 | if (control & OHCI_CTRL_IR) { |
184 | wait_time = 500; /* arbitrary; 5 seconds */ | 183 | int wait_time = 500; /* arbitrary; 5 seconds */ |
185 | writel(OHCI_INTR_OC, base + OHCI_INTRENABLE); | 184 | writel(OHCI_INTR_OC, base + OHCI_INTRENABLE); |
186 | writel(OHCI_OCR, base + OHCI_CMDSTATUS); | 185 | writel(OHCI_OCR, base + OHCI_CMDSTATUS); |
187 | while (wait_time > 0 && | 186 | while (wait_time > 0 && |
@@ -198,6 +197,7 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
198 | /* reset controller, preserving RWC */ | 197 | /* reset controller, preserving RWC */ |
199 | writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL); | 198 | writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL); |
200 | } | 199 | } |
200 | } | ||
201 | #endif | 201 | #endif |
202 | 202 | ||
203 | /* | 203 | /* |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index b9fb9687f926..8ea9c915fbf9 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -1507,6 +1507,9 @@ void hid_init_reports(struct hid_device *hid) | |||
1507 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 | 1507 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 |
1508 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 | 1508 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 |
1509 | 1509 | ||
1510 | #define USB_VENDOR_ID_WISEGROUP_LTD 0x6677 | ||
1511 | #define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 | ||
1512 | |||
1510 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 | 1513 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 |
1511 | #define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500 | 1514 | #define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500 |
1512 | #define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501 | 1515 | #define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501 |
@@ -1670,6 +1673,7 @@ static const struct hid_blacklist { | |||
1670 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, | 1673 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, |
1671 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, | 1674 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, |
1672 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | 1675 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, |
1676 | { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | ||
1673 | 1677 | ||
1674 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, | 1678 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, |
1675 | { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, | 1679 | { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, |
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index daa486dde8cf..88928a4be805 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig | |||
@@ -88,19 +88,19 @@ config USB_LED | |||
88 | To compile this driver as a module, choose M here: the | 88 | To compile this driver as a module, choose M here: the |
89 | module will be called usbled. | 89 | module will be called usbled. |
90 | 90 | ||
91 | config USB_CY7C63 | 91 | config USB_CYPRESS_CY7C63 |
92 | tristate "Cypress CY7C63xxx USB driver support" | 92 | tristate "Cypress CY7C63xxx USB driver support" |
93 | depends on USB | 93 | depends on USB |
94 | help | 94 | help |
95 | Say Y here if you want to connect a Cypress CY7C63xxx | 95 | Say Y here if you want to connect a Cypress CY7C63xxx |
96 | micro controller to your computer's USB port. This driver | 96 | micro controller to your computer's USB port. Currently this |
97 | supports the pre-programmed devices (incl. firmware) by | 97 | driver supports the pre-programmed devices (incl. firmware) |
98 | AK Modul-Bus Computer GmbH. | 98 | by AK Modul-Bus Computer GmbH. |
99 | 99 | ||
100 | Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html | 100 | Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html |
101 | 101 | ||
102 | To compile this driver as a module, choose M here: the | 102 | To compile this driver as a module, choose M here: the |
103 | module will be called cy7c63. | 103 | module will be called cypress_cy7c63. |
104 | 104 | ||
105 | config USB_CYTHERM | 105 | config USB_CYTHERM |
106 | tristate "Cypress USB thermometer driver support" | 106 | tristate "Cypress USB thermometer driver support" |
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index f25a97227297..2927260c5812 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o | 6 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o |
7 | obj-$(CONFIG_USB_CY7C63) += cy7c63.o | 7 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o |
8 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o | 8 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o |
9 | obj-$(CONFIG_USB_EMI26) += emi26.o | 9 | obj-$(CONFIG_USB_EMI26) += emi26.o |
10 | obj-$(CONFIG_USB_EMI62) += emi62.o | 10 | obj-$(CONFIG_USB_EMI62) += emi62.o |
diff --git a/drivers/usb/misc/cy7c63.c b/drivers/usb/misc/cy7c63.c deleted file mode 100644 index 8a1c10b89b76..000000000000 --- a/drivers/usb/misc/cy7c63.c +++ /dev/null | |||
@@ -1,244 +0,0 @@ | |||
1 | /* | ||
2 | * cy7c63.c | ||
3 | * | ||
4 | * Copyright (c) 2006 Oliver Bock (bock@fh-wolfenbuettel.de) | ||
5 | * | ||
6 | * This driver is based on the Cypress Thermometer USB Driver by | ||
7 | * Marcus Maul and the 2.0 version of Greg Kroah-Hartman's | ||
8 | * USB Skeleton driver. | ||
9 | * | ||
10 | * Is is a generic driver for the Cypress CY7C63000 family. | ||
11 | * For the time being it enables you to toggle the single I/O ports | ||
12 | * of the device. | ||
13 | * | ||
14 | * Supported vendors: AK Modul-Bus Computer GmbH | ||
15 | * Supported devices: CY7C63001A-PC (to be continued...) | ||
16 | * Supported functions: Read/Write Ports (to be continued...) | ||
17 | * | ||
18 | * Chipsets families: CY7C63000, CY7C63001, CY7C63100, CY7C63101 | ||
19 | * | ||
20 | * | ||
21 | * This program is free software; you can redistribute it and/or | ||
22 | * modify it under the terms of the GNU General Public License as | ||
23 | * published by the Free Software Foundation, version 2. | ||
24 | */ | ||
25 | |||
26 | #include <linux/init.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/kernel.h> | ||
29 | #include <linux/usb.h> | ||
30 | |||
31 | #define DRIVER_AUTHOR "Oliver Bock (bock@fh-wolfenbuettel.de)" | ||
32 | #define DRIVER_DESC "Cypress CY7C63xxx USB driver" | ||
33 | |||
34 | #define CY7C63_VENDOR_ID 0xa2c | ||
35 | #define CY7C63_PRODUCT_ID 0x8 | ||
36 | |||
37 | #define CY7C63_READ_PORT 0x4 | ||
38 | #define CY7C63_WRITE_PORT 0x5 | ||
39 | #define CY7C63_READ_RAM 0x2 | ||
40 | #define CY7C63_WRITE_RAM 0x3 | ||
41 | #define CY7C63_READ_ROM 0x1 | ||
42 | |||
43 | #define CY7C63_READ_PORT_ID0 0 | ||
44 | #define CY7C63_WRITE_PORT_ID0 0 | ||
45 | #define CY7C63_READ_PORT_ID1 0x2 | ||
46 | #define CY7C63_WRITE_PORT_ID1 1 | ||
47 | |||
48 | #define CY7C63_MAX_REQSIZE 8 | ||
49 | |||
50 | |||
51 | /* table of devices that work with this driver */ | ||
52 | static struct usb_device_id cy7c63_table [] = { | ||
53 | { USB_DEVICE(CY7C63_VENDOR_ID, CY7C63_PRODUCT_ID) }, | ||
54 | { } | ||
55 | }; | ||
56 | MODULE_DEVICE_TABLE(usb, cy7c63_table); | ||
57 | |||
58 | /* structure to hold all of our device specific stuff */ | ||
59 | struct cy7c63 { | ||
60 | struct usb_device * udev; | ||
61 | char port0; | ||
62 | char port1; | ||
63 | }; | ||
64 | |||
65 | /* used to send usb control messages to device */ | ||
66 | int vendor_command(struct cy7c63 *dev, unsigned char request, | ||
67 | unsigned char address, unsigned char data) { | ||
68 | |||
69 | int retval = 0; | ||
70 | unsigned int pipe; | ||
71 | unsigned char *iobuf; | ||
72 | |||
73 | /* allocate some memory for the i/o buffer*/ | ||
74 | iobuf = kzalloc(CY7C63_MAX_REQSIZE, GFP_KERNEL); | ||
75 | if (!iobuf) { | ||
76 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
77 | retval = -ENOMEM; | ||
78 | goto error; | ||
79 | } | ||
80 | |||
81 | dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data); | ||
82 | |||
83 | /* prepare usb control message and send it upstream */ | ||
84 | pipe = usb_rcvctrlpipe(dev->udev, 0); | ||
85 | retval = usb_control_msg(dev->udev, pipe, request, | ||
86 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER, | ||
87 | address, data, iobuf, CY7C63_MAX_REQSIZE, | ||
88 | USB_CTRL_GET_TIMEOUT); | ||
89 | |||
90 | /* store returned data (more READs to be added!) */ | ||
91 | switch (request) { | ||
92 | case CY7C63_READ_PORT: | ||
93 | if (address == CY7C63_READ_PORT_ID0) { | ||
94 | dev->port0 = iobuf[1]; | ||
95 | dev_dbg(&dev->udev->dev, | ||
96 | "READ_PORT0 returned: %d\n",dev->port0); | ||
97 | } | ||
98 | else if (address == CY7C63_READ_PORT_ID1) { | ||
99 | dev->port1 = iobuf[1]; | ||
100 | dev_dbg(&dev->udev->dev, | ||
101 | "READ_PORT1 returned: %d\n",dev->port1); | ||
102 | } | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | kfree(iobuf); | ||
107 | error: | ||
108 | return retval; | ||
109 | } | ||
110 | |||
111 | #define get_set_port(num,read_id,write_id) \ | ||
112 | static ssize_t set_port##num(struct device *dev, struct device_attribute *attr, \ | ||
113 | const char *buf, size_t count) { \ | ||
114 | \ | ||
115 | int value; \ | ||
116 | int result = 0; \ | ||
117 | \ | ||
118 | struct usb_interface *intf = to_usb_interface(dev); \ | ||
119 | struct cy7c63 *cyp = usb_get_intfdata(intf); \ | ||
120 | \ | ||
121 | dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", num); \ | ||
122 | \ | ||
123 | /* validate input data */ \ | ||
124 | if (sscanf(buf, "%d", &value) < 1) { \ | ||
125 | result = -EINVAL; \ | ||
126 | goto error; \ | ||
127 | } \ | ||
128 | if (value>255 || value<0) { \ | ||
129 | result = -EINVAL; \ | ||
130 | goto error; \ | ||
131 | } \ | ||
132 | \ | ||
133 | result = vendor_command(cyp, CY7C63_WRITE_PORT, write_id, \ | ||
134 | (unsigned char)value); \ | ||
135 | \ | ||
136 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n",result); \ | ||
137 | error: \ | ||
138 | return result < 0 ? result : count; \ | ||
139 | } \ | ||
140 | \ | ||
141 | static ssize_t get_port##num(struct device *dev, \ | ||
142 | struct device_attribute *attr, char *buf) { \ | ||
143 | \ | ||
144 | int result = 0; \ | ||
145 | \ | ||
146 | struct usb_interface *intf = to_usb_interface(dev); \ | ||
147 | struct cy7c63 *cyp = usb_get_intfdata(intf); \ | ||
148 | \ | ||
149 | dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", num); \ | ||
150 | \ | ||
151 | result = vendor_command(cyp, CY7C63_READ_PORT, read_id, 0); \ | ||
152 | \ | ||
153 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); \ | ||
154 | \ | ||
155 | return sprintf(buf, "%d", cyp->port##num); \ | ||
156 | } \ | ||
157 | static DEVICE_ATTR(port##num, S_IWUGO | S_IRUGO, get_port##num, set_port##num); | ||
158 | |||
159 | get_set_port(0, CY7C63_READ_PORT_ID0, CY7C63_WRITE_PORT_ID0); | ||
160 | get_set_port(1, CY7C63_READ_PORT_ID1, CY7C63_WRITE_PORT_ID1); | ||
161 | |||
162 | static int cy7c63_probe(struct usb_interface *interface, | ||
163 | const struct usb_device_id *id) { | ||
164 | |||
165 | struct cy7c63 *dev = NULL; | ||
166 | int retval = -ENOMEM; | ||
167 | |||
168 | /* allocate memory for our device state and initialize it */ | ||
169 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
170 | if (dev == NULL) { | ||
171 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
172 | goto error; | ||
173 | } | ||
174 | |||
175 | dev->udev = usb_get_dev(interface_to_usbdev(interface)); | ||
176 | |||
177 | /* save our data pointer in this interface device */ | ||
178 | usb_set_intfdata(interface, dev); | ||
179 | |||
180 | /* create device attribute files */ | ||
181 | device_create_file(&interface->dev, &dev_attr_port0); | ||
182 | device_create_file(&interface->dev, &dev_attr_port1); | ||
183 | |||
184 | /* let the user know what node this device is now attached to */ | ||
185 | dev_info(&interface->dev, | ||
186 | "Cypress CY7C63xxx device now attached\n"); | ||
187 | |||
188 | retval = 0; | ||
189 | error: | ||
190 | return retval; | ||
191 | } | ||
192 | |||
193 | static void cy7c63_disconnect(struct usb_interface *interface) { | ||
194 | |||
195 | struct cy7c63 *dev; | ||
196 | |||
197 | dev = usb_get_intfdata(interface); | ||
198 | usb_set_intfdata(interface, NULL); | ||
199 | |||
200 | /* remove device attribute files */ | ||
201 | device_remove_file(&interface->dev, &dev_attr_port0); | ||
202 | device_remove_file(&interface->dev, &dev_attr_port1); | ||
203 | |||
204 | usb_put_dev(dev->udev); | ||
205 | |||
206 | dev_info(&interface->dev, | ||
207 | "Cypress CY7C63xxx device now disconnected\n"); | ||
208 | |||
209 | kfree(dev); | ||
210 | } | ||
211 | |||
212 | static struct usb_driver cy7c63_driver = { | ||
213 | .name = "cy7c63", | ||
214 | .probe = cy7c63_probe, | ||
215 | .disconnect = cy7c63_disconnect, | ||
216 | .id_table = cy7c63_table, | ||
217 | }; | ||
218 | |||
219 | static int __init cy7c63_init(void) { | ||
220 | |||
221 | int result; | ||
222 | |||
223 | /* register this driver with the USB subsystem */ | ||
224 | result = usb_register(&cy7c63_driver); | ||
225 | if (result) { | ||
226 | err("Function usb_register failed! Error number: %d\n", result); | ||
227 | } | ||
228 | |||
229 | return result; | ||
230 | } | ||
231 | |||
232 | static void __exit cy7c63_exit(void) { | ||
233 | |||
234 | /* deregister this driver with the USB subsystem */ | ||
235 | usb_deregister(&cy7c63_driver); | ||
236 | } | ||
237 | |||
238 | module_init(cy7c63_init); | ||
239 | module_exit(cy7c63_exit); | ||
240 | |||
241 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
242 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
243 | |||
244 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c new file mode 100644 index 000000000000..e091d327bd9e --- /dev/null +++ b/drivers/usb/misc/cypress_cy7c63.c | |||
@@ -0,0 +1,279 @@ | |||
1 | /* | ||
2 | * cypress_cy7c63.c | ||
3 | * | ||
4 | * Copyright (c) 2006 Oliver Bock (o.bock@fh-wolfenbuettel.de) | ||
5 | * | ||
6 | * This driver is based on the Cypress USB Driver by Marcus Maul | ||
7 | * (cyport) and the 2.0 version of Greg Kroah-Hartman's | ||
8 | * USB Skeleton driver. | ||
9 | * | ||
10 | * This is a generic driver for the Cypress CY7C63xxx family. | ||
11 | * For the time being it enables you to read from and write to | ||
12 | * the single I/O ports of the device. | ||
13 | * | ||
14 | * Supported vendors: AK Modul-Bus Computer GmbH | ||
15 | * Supported devices: CY7C63001A-PC (to be continued...) | ||
16 | * Supported functions: Read/Write Ports (to be continued...) | ||
17 | * | ||
18 | * | ||
19 | * This program is free software; you can redistribute it and/or | ||
20 | * modify it under the terms of the GNU General Public License as | ||
21 | * published by the Free Software Foundation, version 2. | ||
22 | */ | ||
23 | |||
24 | #include <linux/init.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/usb.h> | ||
28 | |||
29 | #define DRIVER_AUTHOR "Oliver Bock (o.bock@fh-wolfenbuettel.de)" | ||
30 | #define DRIVER_DESC "Cypress CY7C63xxx USB driver" | ||
31 | |||
32 | #define CYPRESS_VENDOR_ID 0xa2c | ||
33 | #define CYPRESS_PRODUCT_ID 0x8 | ||
34 | |||
35 | #define CYPRESS_READ_PORT 0x4 | ||
36 | #define CYPRESS_WRITE_PORT 0x5 | ||
37 | |||
38 | #define CYPRESS_READ_RAM 0x2 | ||
39 | #define CYPRESS_WRITE_RAM 0x3 | ||
40 | #define CYPRESS_READ_ROM 0x1 | ||
41 | |||
42 | #define CYPRESS_READ_PORT_ID0 0 | ||
43 | #define CYPRESS_WRITE_PORT_ID0 0 | ||
44 | #define CYPRESS_READ_PORT_ID1 0x2 | ||
45 | #define CYPRESS_WRITE_PORT_ID1 1 | ||
46 | |||
47 | #define CYPRESS_MAX_REQSIZE 8 | ||
48 | |||
49 | |||
50 | /* table of devices that work with this driver */ | ||
51 | static struct usb_device_id cypress_table [] = { | ||
52 | { USB_DEVICE(CYPRESS_VENDOR_ID, CYPRESS_PRODUCT_ID) }, | ||
53 | { } | ||
54 | }; | ||
55 | MODULE_DEVICE_TABLE(usb, cypress_table); | ||
56 | |||
57 | /* structure to hold all of our device specific stuff */ | ||
58 | struct cypress { | ||
59 | struct usb_device * udev; | ||
60 | unsigned char port[2]; | ||
61 | }; | ||
62 | |||
63 | /* used to send usb control messages to device */ | ||
64 | static int vendor_command(struct cypress *dev, unsigned char request, | ||
65 | unsigned char address, unsigned char data) | ||
66 | { | ||
67 | int retval = 0; | ||
68 | unsigned int pipe; | ||
69 | unsigned char *iobuf; | ||
70 | |||
71 | /* allocate some memory for the i/o buffer*/ | ||
72 | iobuf = kzalloc(CYPRESS_MAX_REQSIZE, GFP_KERNEL); | ||
73 | if (!iobuf) { | ||
74 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
75 | retval = -ENOMEM; | ||
76 | goto error; | ||
77 | } | ||
78 | |||
79 | dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data); | ||
80 | |||
81 | /* prepare usb control message and send it upstream */ | ||
82 | pipe = usb_rcvctrlpipe(dev->udev, 0); | ||
83 | retval = usb_control_msg(dev->udev, pipe, request, | ||
84 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER, | ||
85 | address, data, iobuf, CYPRESS_MAX_REQSIZE, | ||
86 | USB_CTRL_GET_TIMEOUT); | ||
87 | |||
88 | /* store returned data (more READs to be added) */ | ||
89 | switch (request) { | ||
90 | case CYPRESS_READ_PORT: | ||
91 | if (address == CYPRESS_READ_PORT_ID0) { | ||
92 | dev->port[0] = iobuf[1]; | ||
93 | dev_dbg(&dev->udev->dev, | ||
94 | "READ_PORT0 returned: %d\n", | ||
95 | dev->port[0]); | ||
96 | } | ||
97 | else if (address == CYPRESS_READ_PORT_ID1) { | ||
98 | dev->port[1] = iobuf[1]; | ||
99 | dev_dbg(&dev->udev->dev, | ||
100 | "READ_PORT1 returned: %d\n", | ||
101 | dev->port[1]); | ||
102 | } | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | kfree(iobuf); | ||
107 | error: | ||
108 | return retval; | ||
109 | } | ||
110 | |||
111 | /* write port value */ | ||
112 | static ssize_t write_port(struct device *dev, struct device_attribute *attr, | ||
113 | const char *buf, size_t count, | ||
114 | int port_num, int write_id) | ||
115 | { | ||
116 | int value = -1; | ||
117 | int result = 0; | ||
118 | |||
119 | struct usb_interface *intf = to_usb_interface(dev); | ||
120 | struct cypress *cyp = usb_get_intfdata(intf); | ||
121 | |||
122 | dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", port_num); | ||
123 | |||
124 | /* validate input data */ | ||
125 | if (sscanf(buf, "%d", &value) < 1) { | ||
126 | result = -EINVAL; | ||
127 | goto error; | ||
128 | } | ||
129 | if (value < 0 || value > 255) { | ||
130 | result = -EINVAL; | ||
131 | goto error; | ||
132 | } | ||
133 | |||
134 | result = vendor_command(cyp, CYPRESS_WRITE_PORT, write_id, | ||
135 | (unsigned char)value); | ||
136 | |||
137 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); | ||
138 | error: | ||
139 | return result < 0 ? result : count; | ||
140 | } | ||
141 | |||
142 | /* attribute callback handler (write) */ | ||
143 | static ssize_t set_port0_handler(struct device *dev, | ||
144 | struct device_attribute *attr, | ||
145 | const char *buf, size_t count) | ||
146 | { | ||
147 | return write_port(dev, attr, buf, count, 0, CYPRESS_WRITE_PORT_ID0); | ||
148 | } | ||
149 | |||
150 | /* attribute callback handler (write) */ | ||
151 | static ssize_t set_port1_handler(struct device *dev, | ||
152 | struct device_attribute *attr, | ||
153 | const char *buf, size_t count) | ||
154 | { | ||
155 | return write_port(dev, attr, buf, count, 1, CYPRESS_WRITE_PORT_ID1); | ||
156 | } | ||
157 | |||
158 | /* read port value */ | ||
159 | static ssize_t read_port(struct device *dev, struct device_attribute *attr, | ||
160 | char *buf, int port_num, int read_id) | ||
161 | { | ||
162 | int result = 0; | ||
163 | |||
164 | struct usb_interface *intf = to_usb_interface(dev); | ||
165 | struct cypress *cyp = usb_get_intfdata(intf); | ||
166 | |||
167 | dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", port_num); | ||
168 | |||
169 | result = vendor_command(cyp, CYPRESS_READ_PORT, read_id, 0); | ||
170 | |||
171 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); | ||
172 | |||
173 | return sprintf(buf, "%d", cyp->port[port_num]); | ||
174 | } | ||
175 | |||
176 | /* attribute callback handler (read) */ | ||
177 | static ssize_t get_port0_handler(struct device *dev, | ||
178 | struct device_attribute *attr, char *buf) | ||
179 | { | ||
180 | return read_port(dev, attr, buf, 0, CYPRESS_READ_PORT_ID0); | ||
181 | } | ||
182 | |||
183 | /* attribute callback handler (read) */ | ||
184 | static ssize_t get_port1_handler(struct device *dev, | ||
185 | struct device_attribute *attr, char *buf) | ||
186 | { | ||
187 | return read_port(dev, attr, buf, 1, CYPRESS_READ_PORT_ID1); | ||
188 | } | ||
189 | |||
190 | static DEVICE_ATTR(port0, S_IWUGO | S_IRUGO, | ||
191 | get_port0_handler, set_port0_handler); | ||
192 | |||
193 | static DEVICE_ATTR(port1, S_IWUGO | S_IRUGO, | ||
194 | get_port1_handler, set_port1_handler); | ||
195 | |||
196 | |||
197 | static int cypress_probe(struct usb_interface *interface, | ||
198 | const struct usb_device_id *id) | ||
199 | { | ||
200 | struct cypress *dev = NULL; | ||
201 | int retval = -ENOMEM; | ||
202 | |||
203 | /* allocate memory for our device state and initialize it */ | ||
204 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
205 | if (dev == NULL) { | ||
206 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
207 | goto error; | ||
208 | } | ||
209 | |||
210 | dev->udev = usb_get_dev(interface_to_usbdev(interface)); | ||
211 | |||
212 | /* save our data pointer in this interface device */ | ||
213 | usb_set_intfdata(interface, dev); | ||
214 | |||
215 | /* create device attribute files */ | ||
216 | device_create_file(&interface->dev, &dev_attr_port0); | ||
217 | device_create_file(&interface->dev, &dev_attr_port1); | ||
218 | |||
219 | /* let the user know that the device is now attached */ | ||
220 | dev_info(&interface->dev, | ||
221 | "Cypress CY7C63xxx device now attached\n"); | ||
222 | |||
223 | retval = 0; | ||
224 | error: | ||
225 | return retval; | ||
226 | } | ||
227 | |||
228 | static void cypress_disconnect(struct usb_interface *interface) | ||
229 | { | ||
230 | struct cypress *dev; | ||
231 | |||
232 | dev = usb_get_intfdata(interface); | ||
233 | usb_set_intfdata(interface, NULL); | ||
234 | |||
235 | /* remove device attribute files */ | ||
236 | device_remove_file(&interface->dev, &dev_attr_port0); | ||
237 | device_remove_file(&interface->dev, &dev_attr_port1); | ||
238 | |||
239 | usb_put_dev(dev->udev); | ||
240 | |||
241 | dev_info(&interface->dev, | ||
242 | "Cypress CY7C63xxx device now disconnected\n"); | ||
243 | |||
244 | kfree(dev); | ||
245 | } | ||
246 | |||
247 | static struct usb_driver cypress_driver = { | ||
248 | .name = "cypress_cy7c63", | ||
249 | .probe = cypress_probe, | ||
250 | .disconnect = cypress_disconnect, | ||
251 | .id_table = cypress_table, | ||
252 | }; | ||
253 | |||
254 | static int __init cypress_init(void) | ||
255 | { | ||
256 | int result; | ||
257 | |||
258 | /* register this driver with the USB subsystem */ | ||
259 | result = usb_register(&cypress_driver); | ||
260 | if (result) { | ||
261 | err("Function usb_register failed! Error number: %d\n", result); | ||
262 | } | ||
263 | |||
264 | return result; | ||
265 | } | ||
266 | |||
267 | static void __exit cypress_exit(void) | ||
268 | { | ||
269 | /* deregister this driver with the USB subsystem */ | ||
270 | usb_deregister(&cypress_driver); | ||
271 | } | ||
272 | |||
273 | module_init(cypress_init); | ||
274 | module_exit(cypress_exit); | ||
275 | |||
276 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
277 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
278 | |||
279 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index c82c402285a0..e095772dd8e9 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c | |||
@@ -200,10 +200,8 @@ static ssize_t lcd_write(struct file *file, const char __user * user_buffer, siz | |||
200 | 200 | ||
201 | /* create a urb, and a buffer for it, and copy the data to the urb */ | 201 | /* create a urb, and a buffer for it, and copy the data to the urb */ |
202 | urb = usb_alloc_urb(0, GFP_KERNEL); | 202 | urb = usb_alloc_urb(0, GFP_KERNEL); |
203 | if (!urb) { | 203 | if (!urb) |
204 | retval = -ENOMEM; | 204 | return -ENOMEM; |
205 | goto error; | ||
206 | } | ||
207 | 205 | ||
208 | buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); | 206 | buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); |
209 | if (!buf) { | 207 | if (!buf) { |
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index e02c1a30c4cd..f961a770cee2 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c | |||
@@ -64,7 +64,6 @@ struct mon_reader_text { | |||
64 | }; | 64 | }; |
65 | 65 | ||
66 | static void mon_text_ctor(void *, kmem_cache_t *, unsigned long); | 66 | static void mon_text_ctor(void *, kmem_cache_t *, unsigned long); |
67 | static void mon_text_dtor(void *, kmem_cache_t *, unsigned long); | ||
68 | 67 | ||
69 | /* | 68 | /* |
70 | * mon_text_submit | 69 | * mon_text_submit |
@@ -268,7 +267,7 @@ static int mon_text_open(struct inode *inode, struct file *file) | |||
268 | (long)rp); | 267 | (long)rp); |
269 | rp->e_slab = kmem_cache_create(rp->slab_name, | 268 | rp->e_slab = kmem_cache_create(rp->slab_name, |
270 | sizeof(struct mon_event_text), sizeof(long), 0, | 269 | sizeof(struct mon_event_text), sizeof(long), 0, |
271 | mon_text_ctor, mon_text_dtor); | 270 | mon_text_ctor, NULL); |
272 | if (rp->e_slab == NULL) { | 271 | if (rp->e_slab == NULL) { |
273 | rc = -ENOMEM; | 272 | rc = -ENOMEM; |
274 | goto err_slab; | 273 | goto err_slab; |
@@ -459,7 +458,3 @@ static void mon_text_ctor(void *mem, kmem_cache_t *slab, unsigned long sflags) | |||
459 | memset(mem, 0xe5, sizeof(struct mon_event_text)); | 458 | memset(mem, 0xe5, sizeof(struct mon_event_text)); |
460 | } | 459 | } |
461 | 460 | ||
462 | static void mon_text_dtor(void *mem, kmem_cache_t *slab, unsigned long sflags) | ||
463 | { | ||
464 | ; | ||
465 | } | ||
diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index 718f8e2b552b..e5e6e4f3ef87 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c | |||
@@ -128,11 +128,13 @@ | |||
128 | #define VENDOR_ID_MELCO 0x0411 | 128 | #define VENDOR_ID_MELCO 0x0411 |
129 | #define VENDOR_ID_MICRONET 0x3980 | 129 | #define VENDOR_ID_MICRONET 0x3980 |
130 | #define VENDOR_ID_LONGSHINE 0x07b8 | 130 | #define VENDOR_ID_LONGSHINE 0x07b8 |
131 | #define VENDOR_ID_ZYXEL 0x0586 | ||
131 | 132 | ||
132 | #define PRODUCT_ID_RTL8150 0x8150 | 133 | #define PRODUCT_ID_RTL8150 0x8150 |
133 | #define PRODUCT_ID_LUAKTX 0x0012 | 134 | #define PRODUCT_ID_LUAKTX 0x0012 |
134 | #define PRODUCT_ID_LCS8138TX 0x401a | 135 | #define PRODUCT_ID_LCS8138TX 0x401a |
135 | #define PRODUCT_ID_SP128AR 0x0003 | 136 | #define PRODUCT_ID_SP128AR 0x0003 |
137 | #define PRODUCT_ID_PRESTIGE 0x401a | ||
136 | 138 | ||
137 | #undef EEPROM_WRITE | 139 | #undef EEPROM_WRITE |
138 | 140 | ||
@@ -142,6 +144,7 @@ static struct usb_device_id rtl8150_table[] = { | |||
142 | {USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)}, | 144 | {USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)}, |
143 | {USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)}, | 145 | {USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)}, |
144 | {USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)}, | 146 | {USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)}, |
147 | {USB_DEVICE(VENDOR_ID_ZYXEL, PRODUCT_ID_PRESTIGE)}, | ||
145 | {} | 148 | {} |
146 | }; | 149 | }; |
147 | 150 | ||
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 8bd44fda5eaf..ac33bd47cfce 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -456,6 +456,17 @@ config USB_SERIAL_SAFE_PADDED | |||
456 | bool "USB Secure Encapsulated Driver - Padded" | 456 | bool "USB Secure Encapsulated Driver - Padded" |
457 | depends on USB_SERIAL_SAFE | 457 | depends on USB_SERIAL_SAFE |
458 | 458 | ||
459 | config USB_SERIAL_SIERRAWIRELESS | ||
460 | tristate "USB Sierra Wireless Driver" | ||
461 | depends on USB_SERIAL | ||
462 | help | ||
463 | Say M here if you want to use a Sierra Wireless device (if | ||
464 | using an PC 5220 or AC580 please use the Airprime driver | ||
465 | instead). | ||
466 | |||
467 | To compile this driver as a module, choose M here: the | ||
468 | module will be called sierra. | ||
469 | |||
459 | config USB_SERIAL_TI | 470 | config USB_SERIAL_TI |
460 | tristate "USB TI 3410/5052 Serial Driver" | 471 | tristate "USB TI 3410/5052 Serial Driver" |
461 | depends on USB_SERIAL | 472 | depends on USB_SERIAL |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 5a0960fc9d3e..35d4acc7f1d3 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -39,6 +39,7 @@ obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o | |||
39 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o | 39 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o |
40 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o | 40 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o |
41 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o | 41 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o |
42 | obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o | ||
42 | obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o | 43 | obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o |
43 | obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o | 44 | obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o |
44 | obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o | 45 | obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o |
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index 94b9ba0ff875..62082532a8b3 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ | 19 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ |
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c index 343f6f228220..01843ef8c11e 100644 --- a/drivers/usb/serial/anydata.c +++ b/drivers/usb/serial/anydata.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ | 19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ |
@@ -71,7 +71,7 @@ static int anydata_open(struct usb_serial_port *port, struct file *filp) | |||
71 | port->bulk_in_endpointAddress), | 71 | port->bulk_in_endpointAddress), |
72 | port->read_urb->transfer_buffer, | 72 | port->read_urb->transfer_buffer, |
73 | port->read_urb->transfer_buffer_length, | 73 | port->read_urb->transfer_buffer_length, |
74 | usb_serial_generic_write_bulk_callback, port); | 74 | usb_serial_generic_read_bulk_callback, port); |
75 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | 75 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); |
76 | if (result) | 76 | if (result) |
77 | dev_err(&port->dev, | 77 | dev_err(&port->dev, |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 8dec796222a0..970d9ef0a7a5 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/tty.h> | 21 | #include <linux/tty.h> |
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
24 | #include "usb-serial.h" | 24 | #include <linux/usb/serial.h> |
25 | 25 | ||
26 | 26 | ||
27 | static int debug; | 27 | static int debug; |
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 3faa7aa0111a..70ece9e01ce4 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c | |||
@@ -74,7 +74,7 @@ | |||
74 | #include <linux/spinlock.h> | 74 | #include <linux/spinlock.h> |
75 | #include <asm/uaccess.h> | 75 | #include <asm/uaccess.h> |
76 | #include <linux/usb.h> | 76 | #include <linux/usb.h> |
77 | #include "usb-serial.h" | 77 | #include <linux/usb/serial.h> |
78 | #include "belkin_sa.h" | 78 | #include "belkin_sa.h" |
79 | 79 | ||
80 | static int debug; | 80 | static int debug; |
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index f2d993b70c18..6542f220468f 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static int usb_serial_device_match (struct device *dev, struct device_driver *drv) | 18 | static int usb_serial_device_match (struct device *dev, struct device_driver *drv) |
19 | { | 19 | { |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 3d456b32c316..3a9073dbfe6a 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -17,11 +17,10 @@ | |||
17 | #include <linux/tty.h> | 17 | #include <linux/tty.h> |
18 | #include <linux/console.h> | 18 | #include <linux/console.h> |
19 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
20 | #include <linux/usb/serial.h> | ||
20 | 21 | ||
21 | static int debug; | 22 | static int debug; |
22 | 23 | ||
23 | #include "usb-serial.h" | ||
24 | |||
25 | struct usbcons_info { | 24 | struct usbcons_info { |
26 | int magic; | 25 | int magic; |
27 | int break_flag; | 26 | int break_flag; |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index df0a4f98b4ae..486c7411b9a7 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
27 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
29 | #include "usb-serial.h" | 29 | #include <linux/usb/serial.h> |
30 | 30 | ||
31 | /* | 31 | /* |
32 | * Version Information | 32 | * Version Information |
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 49b51ab0d4cb..6286aba86fae 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <linux/spinlock.h> | 39 | #include <linux/spinlock.h> |
40 | #include <asm/uaccess.h> | 40 | #include <asm/uaccess.h> |
41 | #include <linux/usb.h> | 41 | #include <linux/usb.h> |
42 | #include "usb-serial.h" | 42 | #include <linux/usb/serial.h> |
43 | 43 | ||
44 | #define CYBERJACK_LOCAL_BUF_SIZE 32 | 44 | #define CYBERJACK_LOCAL_BUF_SIZE 32 |
45 | 45 | ||
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 4ff2dfb299bd..ee70fddcab60 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -59,11 +59,11 @@ | |||
59 | #include <linux/moduleparam.h> | 59 | #include <linux/moduleparam.h> |
60 | #include <linux/spinlock.h> | 60 | #include <linux/spinlock.h> |
61 | #include <linux/usb.h> | 61 | #include <linux/usb.h> |
62 | #include <linux/usb/serial.h> | ||
62 | #include <linux/serial.h> | 63 | #include <linux/serial.h> |
63 | #include <linux/delay.h> | 64 | #include <linux/delay.h> |
64 | #include <asm/uaccess.h> | 65 | #include <asm/uaccess.h> |
65 | 66 | ||
66 | #include "usb-serial.h" | ||
67 | #include "cypress_m8.h" | 67 | #include "cypress_m8.h" |
68 | 68 | ||
69 | 69 | ||
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index 6953d3ef5738..9b225183fc7a 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -246,7 +246,7 @@ | |||
246 | #include <asm/uaccess.h> | 246 | #include <asm/uaccess.h> |
247 | #include <linux/usb.h> | 247 | #include <linux/usb.h> |
248 | #include <linux/wait.h> | 248 | #include <linux/wait.h> |
249 | #include "usb-serial.h" | 249 | #include <linux/usb/serial.h> |
250 | 250 | ||
251 | /* Defines */ | 251 | /* Defines */ |
252 | 252 | ||
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 1e2b31eeb497..daafe405d86d 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
@@ -62,7 +62,7 @@ | |||
62 | #include <linux/spinlock.h> | 62 | #include <linux/spinlock.h> |
63 | #include <asm/uaccess.h> | 63 | #include <asm/uaccess.h> |
64 | #include <linux/usb.h> | 64 | #include <linux/usb.h> |
65 | #include "usb-serial.h" | 65 | #include <linux/usb/serial.h> |
66 | 66 | ||
67 | static int debug; | 67 | static int debug; |
68 | 68 | ||
diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c index debc3b0f9662..5169c2d154ab 100644 --- a/drivers/usb/serial/ezusb.c +++ b/drivers/usb/serial/ezusb.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/tty.h> | 15 | #include <linux/tty.h> |
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/usb.h> | 17 | #include <linux/usb.h> |
18 | #include "usb-serial.h" | 18 | #include <linux/usb/serial.h> |
19 | 19 | ||
20 | /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ | 20 | /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ |
21 | #define CPUCS_REG 0x7F92 | 21 | #define CPUCS_REG 0x7F92 |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 8a74b19f1283..b458aedc5fb6 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -257,7 +257,7 @@ | |||
257 | #include <asm/uaccess.h> | 257 | #include <asm/uaccess.h> |
258 | #include <linux/usb.h> | 258 | #include <linux/usb.h> |
259 | #include <linux/serial.h> | 259 | #include <linux/serial.h> |
260 | #include "usb-serial.h" | 260 | #include <linux/usb/serial.h> |
261 | #include "ftdi_sio.h" | 261 | #include "ftdi_sio.h" |
262 | 262 | ||
263 | /* | 263 | /* |
@@ -313,6 +313,7 @@ static struct usb_device_id id_table_combined [] = { | |||
313 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, | 313 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, |
314 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, | 314 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, |
315 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 315 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
316 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | ||
316 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 317 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
317 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | 318 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
318 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | 319 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
@@ -500,6 +501,8 @@ static struct usb_device_id id_table_combined [] = { | |||
500 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, | 501 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, |
501 | { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, | 502 | { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, |
502 | { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, | 503 | { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, |
504 | { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, | ||
505 | { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) }, | ||
503 | { }, /* Optional parameter entry */ | 506 | { }, /* Optional parameter entry */ |
504 | { } /* Terminating entry */ | 507 | { } /* Terminating entry */ |
505 | }; | 508 | }; |
@@ -548,11 +551,17 @@ struct ftdi_private { | |||
548 | spinlock_t rx_lock; /* spinlock for receive state */ | 551 | spinlock_t rx_lock; /* spinlock for receive state */ |
549 | struct work_struct rx_work; | 552 | struct work_struct rx_work; |
550 | int rx_processed; | 553 | int rx_processed; |
554 | unsigned long rx_bytes; | ||
551 | 555 | ||
552 | __u16 interface; /* FT2232C port interface (0 for FT232/245) */ | 556 | __u16 interface; /* FT2232C port interface (0 for FT232/245) */ |
553 | 557 | ||
554 | int force_baud; /* if non-zero, force the baud rate to this value */ | 558 | int force_baud; /* if non-zero, force the baud rate to this value */ |
555 | int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ | 559 | int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ |
560 | |||
561 | spinlock_t tx_lock; /* spinlock for transmit state */ | ||
562 | unsigned long tx_bytes; | ||
563 | unsigned long tx_outstanding_bytes; | ||
564 | unsigned long tx_outstanding_urbs; | ||
556 | }; | 565 | }; |
557 | 566 | ||
558 | /* Used for TIOCMIWAIT */ | 567 | /* Used for TIOCMIWAIT */ |
@@ -626,6 +635,9 @@ static struct usb_serial_driver ftdi_sio_device = { | |||
626 | #define HIGH 1 | 635 | #define HIGH 1 |
627 | #define LOW 0 | 636 | #define LOW 0 |
628 | 637 | ||
638 | /* number of outstanding urbs to prevent userspace DoS from happening */ | ||
639 | #define URB_UPPER_LIMIT 42 | ||
640 | |||
629 | /* | 641 | /* |
630 | * *************************************************************************** | 642 | * *************************************************************************** |
631 | * Utlity functions | 643 | * Utlity functions |
@@ -1156,6 +1168,7 @@ static int ftdi_sio_attach (struct usb_serial *serial) | |||
1156 | } | 1168 | } |
1157 | 1169 | ||
1158 | spin_lock_init(&priv->rx_lock); | 1170 | spin_lock_init(&priv->rx_lock); |
1171 | spin_lock_init(&priv->tx_lock); | ||
1159 | init_waitqueue_head(&priv->delta_msr_wait); | 1172 | init_waitqueue_head(&priv->delta_msr_wait); |
1160 | /* This will push the characters through immediately rather | 1173 | /* This will push the characters through immediately rather |
1161 | than queue a task to deliver them */ | 1174 | than queue a task to deliver them */ |
@@ -1270,6 +1283,13 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp) | |||
1270 | 1283 | ||
1271 | dbg("%s", __FUNCTION__); | 1284 | dbg("%s", __FUNCTION__); |
1272 | 1285 | ||
1286 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1287 | priv->tx_bytes = 0; | ||
1288 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1289 | spin_lock_irqsave(&priv->rx_lock, flags); | ||
1290 | priv->rx_bytes = 0; | ||
1291 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
1292 | |||
1273 | if (port->tty) | 1293 | if (port->tty) |
1274 | port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | 1294 | port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; |
1275 | 1295 | ||
@@ -1372,6 +1392,7 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1372 | int data_offset ; /* will be 1 for the SIO and 0 otherwise */ | 1392 | int data_offset ; /* will be 1 for the SIO and 0 otherwise */ |
1373 | int status; | 1393 | int status; |
1374 | int transfer_size; | 1394 | int transfer_size; |
1395 | unsigned long flags; | ||
1375 | 1396 | ||
1376 | dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count); | 1397 | dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count); |
1377 | 1398 | ||
@@ -1379,6 +1400,13 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1379 | dbg("write request of 0 bytes"); | 1400 | dbg("write request of 0 bytes"); |
1380 | return 0; | 1401 | return 0; |
1381 | } | 1402 | } |
1403 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1404 | if (priv->tx_outstanding_urbs > URB_UPPER_LIMIT) { | ||
1405 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1406 | dbg("%s - write limit hit\n", __FUNCTION__); | ||
1407 | return 0; | ||
1408 | } | ||
1409 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1382 | 1410 | ||
1383 | data_offset = priv->write_offset; | 1411 | data_offset = priv->write_offset; |
1384 | dbg("data_offset set to %d",data_offset); | 1412 | dbg("data_offset set to %d",data_offset); |
@@ -1445,6 +1473,12 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1445 | err("%s - failed submitting write urb, error %d", __FUNCTION__, status); | 1473 | err("%s - failed submitting write urb, error %d", __FUNCTION__, status); |
1446 | count = status; | 1474 | count = status; |
1447 | kfree (buffer); | 1475 | kfree (buffer); |
1476 | } else { | ||
1477 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1478 | ++priv->tx_outstanding_urbs; | ||
1479 | priv->tx_outstanding_bytes += count; | ||
1480 | priv->tx_bytes += count; | ||
1481 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1448 | } | 1482 | } |
1449 | 1483 | ||
1450 | /* we are done with this urb, so let the host driver | 1484 | /* we are done with this urb, so let the host driver |
@@ -1460,7 +1494,11 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1460 | 1494 | ||
1461 | static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) | 1495 | static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) |
1462 | { | 1496 | { |
1497 | unsigned long flags; | ||
1463 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | 1498 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; |
1499 | struct ftdi_private *priv; | ||
1500 | int data_offset; /* will be 1 for the SIO and 0 otherwise */ | ||
1501 | unsigned long countback; | ||
1464 | 1502 | ||
1465 | /* free up the transfer buffer, as usb_free_urb() does not do this */ | 1503 | /* free up the transfer buffer, as usb_free_urb() does not do this */ |
1466 | kfree (urb->transfer_buffer); | 1504 | kfree (urb->transfer_buffer); |
@@ -1472,34 +1510,67 @@ static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
1472 | return; | 1510 | return; |
1473 | } | 1511 | } |
1474 | 1512 | ||
1513 | priv = usb_get_serial_port_data(port); | ||
1514 | if (!priv) { | ||
1515 | dbg("%s - bad port private data pointer - exiting", __FUNCTION__); | ||
1516 | return; | ||
1517 | } | ||
1518 | /* account for transferred data */ | ||
1519 | countback = urb->actual_length; | ||
1520 | data_offset = priv->write_offset; | ||
1521 | if (data_offset > 0) { | ||
1522 | /* Subtract the control bytes */ | ||
1523 | countback -= (data_offset * ((countback + (PKTSZ - 1)) / PKTSZ)); | ||
1524 | } | ||
1525 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1526 | --priv->tx_outstanding_urbs; | ||
1527 | priv->tx_outstanding_bytes -= countback; | ||
1528 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1529 | |||
1475 | usb_serial_port_softint(port); | 1530 | usb_serial_port_softint(port); |
1476 | } /* ftdi_write_bulk_callback */ | 1531 | } /* ftdi_write_bulk_callback */ |
1477 | 1532 | ||
1478 | 1533 | ||
1479 | static int ftdi_write_room( struct usb_serial_port *port ) | 1534 | static int ftdi_write_room( struct usb_serial_port *port ) |
1480 | { | 1535 | { |
1536 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
1537 | int room; | ||
1538 | unsigned long flags; | ||
1539 | |||
1481 | dbg("%s - port %d", __FUNCTION__, port->number); | 1540 | dbg("%s - port %d", __FUNCTION__, port->number); |
1482 | 1541 | ||
1483 | /* | 1542 | spin_lock_irqsave(&priv->tx_lock, flags); |
1484 | * We really can take anything the user throws at us | 1543 | if (priv->tx_outstanding_urbs < URB_UPPER_LIMIT) { |
1485 | * but let's pick a nice big number to tell the tty | 1544 | /* |
1486 | * layer that we have lots of free space | 1545 | * We really can take anything the user throws at us |
1487 | */ | 1546 | * but let's pick a nice big number to tell the tty |
1488 | return 2048; | 1547 | * layer that we have lots of free space |
1548 | */ | ||
1549 | room = 2048; | ||
1550 | } else { | ||
1551 | room = 0; | ||
1552 | } | ||
1553 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1554 | return room; | ||
1489 | } /* ftdi_write_room */ | 1555 | } /* ftdi_write_room */ |
1490 | 1556 | ||
1491 | 1557 | ||
1492 | static int ftdi_chars_in_buffer (struct usb_serial_port *port) | 1558 | static int ftdi_chars_in_buffer (struct usb_serial_port *port) |
1493 | { /* ftdi_chars_in_buffer */ | 1559 | { /* ftdi_chars_in_buffer */ |
1560 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
1561 | int buffered; | ||
1562 | unsigned long flags; | ||
1563 | |||
1494 | dbg("%s - port %d", __FUNCTION__, port->number); | 1564 | dbg("%s - port %d", __FUNCTION__, port->number); |
1495 | 1565 | ||
1496 | /* | 1566 | spin_lock_irqsave(&priv->tx_lock, flags); |
1497 | * We can't really account for how much data we | 1567 | buffered = (int)priv->tx_outstanding_bytes; |
1498 | * have sent out, but hasn't made it through to the | 1568 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
1499 | * device, so just tell the tty layer that everything | 1569 | if (buffered < 0) { |
1500 | * is flushed. | 1570 | err("%s outstanding tx bytes is negative!", __FUNCTION__); |
1501 | */ | 1571 | buffered = 0; |
1502 | return 0; | 1572 | } |
1573 | return buffered; | ||
1503 | } /* ftdi_chars_in_buffer */ | 1574 | } /* ftdi_chars_in_buffer */ |
1504 | 1575 | ||
1505 | 1576 | ||
@@ -1509,6 +1580,8 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
1509 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | 1580 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; |
1510 | struct tty_struct *tty; | 1581 | struct tty_struct *tty; |
1511 | struct ftdi_private *priv; | 1582 | struct ftdi_private *priv; |
1583 | unsigned long countread; | ||
1584 | unsigned long flags; | ||
1512 | 1585 | ||
1513 | if (urb->number_of_packets > 0) { | 1586 | if (urb->number_of_packets > 0) { |
1514 | err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__, | 1587 | err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__, |
@@ -1543,6 +1616,13 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
1543 | return; | 1616 | return; |
1544 | } | 1617 | } |
1545 | 1618 | ||
1619 | /* count data bytes, but not status bytes */ | ||
1620 | countread = urb->actual_length; | ||
1621 | countread -= 2 * ((countread + (PKTSZ - 1)) / PKTSZ); | ||
1622 | spin_lock_irqsave(&priv->rx_lock, flags); | ||
1623 | priv->rx_bytes += countread; | ||
1624 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
1625 | |||
1546 | ftdi_process_read(port); | 1626 | ftdi_process_read(port); |
1547 | 1627 | ||
1548 | } /* ftdi_read_bulk_callback */ | 1628 | } /* ftdi_read_bulk_callback */ |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 6ab2ac845bd7..04ef90fcb876 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -36,6 +36,9 @@ | |||
36 | #define FTDI_ACTZWAVE_PID 0xF2D0 | 36 | #define FTDI_ACTZWAVE_PID 0xF2D0 |
37 | 37 | ||
38 | 38 | ||
39 | /* www.starting-point-systems.com µChameleon device */ | ||
40 | #define FTDI_MICRO_CHAMELEON_PID 0xCAA0 /* Product Id */ | ||
41 | |||
39 | /* www.irtrans.de device */ | 42 | /* www.irtrans.de device */ |
40 | #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ | 43 | #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ |
41 | 44 | ||
@@ -442,6 +445,18 @@ | |||
442 | */ | 445 | */ |
443 | #define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ | 446 | #define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ |
444 | 447 | ||
448 | /* | ||
449 | * ThorLabs USB motor drivers | ||
450 | */ | ||
451 | #define FTDI_THORLABS_PID 0xfaf0 /* ThorLabs USB motor drivers */ | ||
452 | |||
453 | /* | ||
454 | * Testo products (http://www.testo.com/) | ||
455 | * Submitted by Colin Leroy | ||
456 | */ | ||
457 | #define TESTO_VID 0x128D | ||
458 | #define TESTO_USB_INTERFACE_PID 0x0001 | ||
459 | |||
445 | /* Commands */ | 460 | /* Commands */ |
446 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 461 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
447 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 462 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c index 803721b97e2e..77b977206a8c 100644 --- a/drivers/usb/serial/funsoft.c +++ b/drivers/usb/serial/funsoft.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0x1404, 0xcddc) }, | 19 | { USB_DEVICE(0x1404, 0xcddc) }, |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 1f5d1620baa1..727852634be9 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/spinlock.h> | 35 | #include <linux/spinlock.h> |
36 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
37 | #include <linux/usb.h> | 37 | #include <linux/usb.h> |
38 | #include <linux/usb/serial.h> | ||
38 | 39 | ||
39 | /* the mode to be set when the port ist opened */ | 40 | /* the mode to be set when the port ist opened */ |
40 | static int initial_mode = 1; | 41 | static int initial_mode = 1; |
@@ -42,8 +43,6 @@ static int initial_mode = 1; | |||
42 | /* debug flag */ | 43 | /* debug flag */ |
43 | static int debug = 0; | 44 | static int debug = 0; |
44 | 45 | ||
45 | #include "usb-serial.h" | ||
46 | |||
47 | #define GARMIN_VENDOR_ID 0x091E | 46 | #define GARMIN_VENDOR_ID 0x091E |
48 | 47 | ||
49 | /* | 48 | /* |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 945b8bb38c92..172713556393 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -17,8 +17,8 @@ | |||
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/moduleparam.h> | 18 | #include <linux/moduleparam.h> |
19 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
20 | #include <linux/usb/serial.h> | ||
20 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
21 | #include "usb-serial.h" | ||
22 | 22 | ||
23 | static int debug; | 23 | static int debug; |
24 | 24 | ||
@@ -285,6 +285,7 @@ void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *reg | |||
285 | if (result) | 285 | if (result) |
286 | dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); | 286 | dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); |
287 | } | 287 | } |
288 | EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); | ||
288 | 289 | ||
289 | void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs) | 290 | void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs) |
290 | { | 291 | { |
diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c index 7e06358b0310..ebcac701b069 100644 --- a/drivers/usb/serial/hp4x.c +++ b/drivers/usb/serial/hp4x.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/tty.h> | 17 | #include <linux/tty.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
20 | #include "usb-serial.h" | 20 | #include <linux/usb/serial.h> |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Version Information | 23 | * Version Information |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index bd2c05dac2a9..c49976c3ad52 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #include <linux/wait.h> | 44 | #include <linux/wait.h> |
45 | #include <asm/uaccess.h> | 45 | #include <asm/uaccess.h> |
46 | #include <linux/usb.h> | 46 | #include <linux/usb.h> |
47 | #include "usb-serial.h" | 47 | #include <linux/usb/serial.h> |
48 | #include "io_edgeport.h" | 48 | #include "io_edgeport.h" |
49 | #include "io_ionsp.h" /* info for the iosp messages */ | 49 | #include "io_ionsp.h" /* info for the iosp messages */ |
50 | #include "io_16654.h" /* 16654 UART defines */ | 50 | #include "io_16654.h" /* 16654 UART defines */ |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 723a12ae87b5..17c5b1d2311a 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -39,8 +39,8 @@ | |||
39 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
40 | #include <asm/semaphore.h> | 40 | #include <asm/semaphore.h> |
41 | #include <linux/usb.h> | 41 | #include <linux/usb.h> |
42 | #include <linux/usb/serial.h> | ||
42 | 43 | ||
43 | #include "usb-serial.h" | ||
44 | #include "io_16654.h" | 44 | #include "io_16654.h" |
45 | #include "io_usbvend.h" | 45 | #include "io_usbvend.h" |
46 | #include "io_ti.h" | 46 | #include "io_ti.h" |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index dbcfe172a5cc..59c5d999009a 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -55,7 +55,7 @@ | |||
55 | #include <linux/spinlock.h> | 55 | #include <linux/spinlock.h> |
56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
57 | #include <linux/usb.h> | 57 | #include <linux/usb.h> |
58 | #include "usb-serial.h" | 58 | #include <linux/usb/serial.h> |
59 | #include "ipaq.h" | 59 | #include "ipaq.h" |
60 | 60 | ||
61 | #define KP_RETRIES 100 | 61 | #define KP_RETRIES 100 |
@@ -70,6 +70,8 @@ | |||
70 | 70 | ||
71 | static __u16 product, vendor; | 71 | static __u16 product, vendor; |
72 | static int debug; | 72 | static int debug; |
73 | static int connect_retries = KP_RETRIES; | ||
74 | static int initial_wait; | ||
73 | 75 | ||
74 | /* Function prototypes for an ipaq */ | 76 | /* Function prototypes for an ipaq */ |
75 | static int ipaq_open (struct usb_serial_port *port, struct file *filp); | 77 | static int ipaq_open (struct usb_serial_port *port, struct file *filp); |
@@ -582,7 +584,7 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) | |||
582 | struct ipaq_private *priv; | 584 | struct ipaq_private *priv; |
583 | struct ipaq_packet *pkt; | 585 | struct ipaq_packet *pkt; |
584 | int i, result = 0; | 586 | int i, result = 0; |
585 | int retries = KP_RETRIES; | 587 | int retries = connect_retries; |
586 | 588 | ||
587 | dbg("%s - port %d", __FUNCTION__, port->number); | 589 | dbg("%s - port %d", __FUNCTION__, port->number); |
588 | 590 | ||
@@ -646,16 +648,12 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) | |||
646 | port->read_urb->transfer_buffer_length = URBDATA_SIZE; | 648 | port->read_urb->transfer_buffer_length = URBDATA_SIZE; |
647 | port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; | 649 | port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; |
648 | 650 | ||
651 | msleep(1000*initial_wait); | ||
649 | /* Start reading from the device */ | 652 | /* Start reading from the device */ |
650 | usb_fill_bulk_urb(port->read_urb, serial->dev, | 653 | usb_fill_bulk_urb(port->read_urb, serial->dev, |
651 | usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), | 654 | usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), |
652 | port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, | 655 | port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, |
653 | ipaq_read_bulk_callback, port); | 656 | ipaq_read_bulk_callback, port); |
654 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
655 | if (result) { | ||
656 | err("%s - failed submitting read urb, error %d", __FUNCTION__, result); | ||
657 | goto error; | ||
658 | } | ||
659 | 657 | ||
660 | /* | 658 | /* |
661 | * Send out control message observed in win98 sniffs. Not sure what | 659 | * Send out control message observed in win98 sniffs. Not sure what |
@@ -670,8 +668,14 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) | |||
670 | usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21, | 668 | usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21, |
671 | 0x1, 0, NULL, 0, 100); | 669 | 0x1, 0, NULL, 0, 100); |
672 | if (result == 0) { | 670 | if (result == 0) { |
671 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
672 | if (result) { | ||
673 | err("%s - failed submitting read urb, error %d", __FUNCTION__, result); | ||
674 | goto error; | ||
675 | } | ||
673 | return 0; | 676 | return 0; |
674 | } | 677 | } |
678 | msleep(1000); | ||
675 | } | 679 | } |
676 | err("%s - failed doing control urb, error %d", __FUNCTION__, result); | 680 | err("%s - failed doing control urb, error %d", __FUNCTION__, result); |
677 | goto error; | 681 | goto error; |
@@ -854,6 +858,7 @@ static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
854 | 858 | ||
855 | if (urb->status) { | 859 | if (urb->status) { |
856 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); | 860 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); |
861 | return; | ||
857 | } | 862 | } |
858 | 863 | ||
859 | spin_lock_irqsave(&write_list_lock, flags); | 864 | spin_lock_irqsave(&write_list_lock, flags); |
@@ -966,3 +971,9 @@ MODULE_PARM_DESC(vendor, "User specified USB idVendor"); | |||
966 | 971 | ||
967 | module_param(product, ushort, 0); | 972 | module_param(product, ushort, 0); |
968 | MODULE_PARM_DESC(product, "User specified USB idProduct"); | 973 | MODULE_PARM_DESC(product, "User specified USB idProduct"); |
974 | |||
975 | module_param(connect_retries, int, S_IRUGO|S_IWUSR); | ||
976 | MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)"); | ||
977 | |||
978 | module_param(initial_wait, int, S_IRUGO|S_IWUSR); | ||
979 | MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)"); | ||
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index a4a0bfeaab00..87306cb6f9f5 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -46,8 +46,8 @@ | |||
46 | #include <linux/module.h> | 46 | #include <linux/module.h> |
47 | #include <linux/spinlock.h> | 47 | #include <linux/spinlock.h> |
48 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
49 | #include <linux/usb/serial.h> | ||
49 | #include <asm/uaccess.h> | 50 | #include <asm/uaccess.h> |
50 | #include "usb-serial.h" | ||
51 | 51 | ||
52 | /* | 52 | /* |
53 | * Version Information | 53 | * Version Information |
@@ -373,6 +373,8 @@ static void ipw_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
373 | 373 | ||
374 | dbg("%s", __FUNCTION__); | 374 | dbg("%s", __FUNCTION__); |
375 | 375 | ||
376 | port->write_urb_busy = 0; | ||
377 | |||
376 | if (urb->status) | 378 | if (urb->status) |
377 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); | 379 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); |
378 | 380 | ||
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 2cf1fed3de43..1738b0b6a376 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c | |||
@@ -57,7 +57,7 @@ | |||
57 | #include <linux/spinlock.h> | 57 | #include <linux/spinlock.h> |
58 | #include <asm/uaccess.h> | 58 | #include <asm/uaccess.h> |
59 | #include <linux/usb.h> | 59 | #include <linux/usb.h> |
60 | #include "usb-serial.h" | 60 | #include <linux/usb/serial.h> |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * Version Information | 63 | * Version Information |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index d7c58f1bc960..015ad6cc1bbb 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -107,7 +107,7 @@ | |||
107 | #include <linux/spinlock.h> | 107 | #include <linux/spinlock.h> |
108 | #include <asm/uaccess.h> | 108 | #include <asm/uaccess.h> |
109 | #include <linux/usb.h> | 109 | #include <linux/usb.h> |
110 | #include "usb-serial.h" | 110 | #include <linux/usb/serial.h> |
111 | #include "keyspan.h" | 111 | #include "keyspan.h" |
112 | 112 | ||
113 | static int debug; | 113 | static int debug; |
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 03ab3c0f3cce..49b8dc039d1f 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
@@ -78,6 +78,7 @@ | |||
78 | #include <linux/workqueue.h> | 78 | #include <linux/workqueue.h> |
79 | #include <asm/uaccess.h> | 79 | #include <asm/uaccess.h> |
80 | #include <linux/usb.h> | 80 | #include <linux/usb.h> |
81 | #include <linux/usb/serial.h> | ||
81 | 82 | ||
82 | static int debug; | 83 | static int debug; |
83 | 84 | ||
@@ -107,8 +108,6 @@ struct ezusb_hex_record { | |||
107 | #include "xircom_pgs_fw.h" | 108 | #include "xircom_pgs_fw.h" |
108 | #endif | 109 | #endif |
109 | 110 | ||
110 | #include "usb-serial.h" | ||
111 | |||
112 | /* | 111 | /* |
113 | * Version Information | 112 | * Version Information |
114 | */ | 113 | */ |
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index b45ff3e7ab40..2a2f3e2da055 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
@@ -55,7 +55,7 @@ | |||
55 | #include <linux/module.h> | 55 | #include <linux/module.h> |
56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
57 | #include <linux/usb.h> | 57 | #include <linux/usb.h> |
58 | #include "usb-serial.h" | 58 | #include <linux/usb/serial.h> |
59 | #include "kl5kusb105.h" | 59 | #include "kl5kusb105.h" |
60 | 60 | ||
61 | static int debug; | 61 | static int debug; |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 457733374772..d50dce034958 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -46,8 +46,8 @@ | |||
46 | #include <linux/spinlock.h> | 46 | #include <linux/spinlock.h> |
47 | #include <asm/uaccess.h> | 47 | #include <asm/uaccess.h> |
48 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
49 | #include <linux/usb/serial.h> | ||
49 | #include <linux/ioctl.h> | 50 | #include <linux/ioctl.h> |
50 | #include "usb-serial.h" | ||
51 | #include "kobil_sct.h" | 51 | #include "kobil_sct.h" |
52 | 52 | ||
53 | static int debug; | 53 | static int debug; |
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index ca05d3275f3e..f4d4305c2c02 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -75,7 +75,7 @@ | |||
75 | #include <linux/spinlock.h> | 75 | #include <linux/spinlock.h> |
76 | #include <asm/uaccess.h> | 76 | #include <asm/uaccess.h> |
77 | #include <linux/usb.h> | 77 | #include <linux/usb.h> |
78 | #include "usb-serial.h" | 78 | #include <linux/usb/serial.h> |
79 | #include "mct_u232.h" | 79 | #include "mct_u232.h" |
80 | 80 | ||
81 | /* | 81 | /* |
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 7f544081032e..ac3f8b5d2c49 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/tty_flip.h> | 14 | #include <linux/tty_flip.h> |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/usb.h> | 16 | #include <linux/usb.h> |
17 | #include "usb-serial.h" | 17 | #include <linux/usb/serial.h> |
18 | 18 | ||
19 | static int debug; | 19 | static int debug; |
20 | 20 | ||
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index cfb711a21a45..e49f40913c27 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include <linux/spinlock.h> | 46 | #include <linux/spinlock.h> |
47 | #include <asm/uaccess.h> | 47 | #include <asm/uaccess.h> |
48 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
49 | #include "usb-serial.h" | 49 | #include <linux/usb/serial.h> |
50 | 50 | ||
51 | static int debug; | 51 | static int debug; |
52 | 52 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 78ad4b3126a6..f0530c1d7b7a 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -35,6 +35,7 @@ | |||
35 | 2006-06-01 v0.6.2 add backwards-compatibility stuff | 35 | 2006-06-01 v0.6.2 add backwards-compatibility stuff |
36 | 2006-06-01 v0.6.3 add Novatel Wireless | 36 | 2006-06-01 v0.6.3 add Novatel Wireless |
37 | 2006-06-01 v0.7 Option => GSM | 37 | 2006-06-01 v0.7 Option => GSM |
38 | 2006-06-01 v0.7.1 add COBRA2 | ||
38 | 39 | ||
39 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> | 40 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> |
40 | 41 | ||
@@ -53,7 +54,7 @@ | |||
53 | device features. | 54 | device features. |
54 | */ | 55 | */ |
55 | 56 | ||
56 | #define DRIVER_VERSION "v0.7.0" | 57 | #define DRIVER_VERSION "v0.7.1" |
57 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" | 58 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" |
58 | #define DRIVER_DESC "USB Driver for GSM modems" | 59 | #define DRIVER_DESC "USB Driver for GSM modems" |
59 | 60 | ||
@@ -64,7 +65,7 @@ | |||
64 | #include <linux/tty_flip.h> | 65 | #include <linux/tty_flip.h> |
65 | #include <linux/module.h> | 66 | #include <linux/module.h> |
66 | #include <linux/usb.h> | 67 | #include <linux/usb.h> |
67 | #include "usb-serial.h" | 68 | #include <linux/usb/serial.h> |
68 | 69 | ||
69 | /* Function prototypes */ | 70 | /* Function prototypes */ |
70 | static int option_open(struct usb_serial_port *port, struct file *filp); | 71 | static int option_open(struct usb_serial_port *port, struct file *filp); |
@@ -102,6 +103,7 @@ static int option_send_setup(struct usb_serial_port *port); | |||
102 | #define OPTION_PRODUCT_FUSION 0x6000 | 103 | #define OPTION_PRODUCT_FUSION 0x6000 |
103 | #define OPTION_PRODUCT_FUSION2 0x6300 | 104 | #define OPTION_PRODUCT_FUSION2 0x6300 |
104 | #define OPTION_PRODUCT_COBRA 0x6500 | 105 | #define OPTION_PRODUCT_COBRA 0x6500 |
106 | #define OPTION_PRODUCT_COBRA2 0x6600 | ||
105 | #define HUAWEI_PRODUCT_E600 0x1001 | 107 | #define HUAWEI_PRODUCT_E600 0x1001 |
106 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 | 108 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 |
107 | #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802 | 109 | #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802 |
@@ -112,6 +114,7 @@ static struct usb_device_id option_ids[] = { | |||
112 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, | 114 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, |
113 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 115 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
114 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, | 116 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, |
117 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | ||
115 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 118 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
116 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 119 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
117 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, | 120 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, |
@@ -124,6 +127,7 @@ static struct usb_device_id option_ids1[] = { | |||
124 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, | 127 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, |
125 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 128 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
126 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, | 129 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, |
130 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | ||
127 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 131 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
128 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 132 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
129 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 133 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index de93a2b909e7..259db31b65c1 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
29 | #include <linux/usb.h> | 29 | #include <linux/usb.h> |
30 | #include "usb-serial.h" | 30 | #include <linux/usb/serial.h> |
31 | #include "pl2303.h" | 31 | #include "pl2303.h" |
32 | 32 | ||
33 | /* | 33 | /* |
@@ -52,6 +52,7 @@ struct pl2303_buf { | |||
52 | static struct usb_device_id id_table [] = { | 52 | static struct usb_device_id id_table [] = { |
53 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, | 53 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, |
54 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) }, | 54 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) }, |
55 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) }, | ||
55 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) }, | 56 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) }, |
56 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, | 57 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, |
57 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, | 58 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
@@ -79,6 +80,7 @@ static struct usb_device_id id_table [] = { | |||
79 | { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, | 80 | { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, |
80 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, | 81 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, |
81 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, | 82 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, |
83 | { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, | ||
82 | { } /* Terminating entry */ | 84 | { } /* Terminating entry */ |
83 | }; | 85 | }; |
84 | 86 | ||
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 7f29e81d3e35..d9c1e6e0b4b3 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #define PL2303_VENDOR_ID 0x067b | 10 | #define PL2303_VENDOR_ID 0x067b |
11 | #define PL2303_PRODUCT_ID 0x2303 | 11 | #define PL2303_PRODUCT_ID 0x2303 |
12 | #define PL2303_PRODUCT_ID_RSAQ2 0x04bb | 12 | #define PL2303_PRODUCT_ID_RSAQ2 0x04bb |
13 | #define PL2303_PRODUCT_ID_DCU11 0x1234 | ||
13 | #define PL2303_PRODUCT_ID_PHAROS 0xaaa0 | 14 | #define PL2303_PRODUCT_ID_PHAROS 0xaaa0 |
14 | #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 | 15 | #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 |
15 | 16 | ||
@@ -84,3 +85,7 @@ | |||
84 | /* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */ | 85 | /* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */ |
85 | #define OTI_VENDOR_ID 0x0ea0 | 86 | #define OTI_VENDOR_ID 0x0ea0 |
86 | #define OTI_PRODUCT_ID 0x6858 | 87 | #define OTI_PRODUCT_ID 0x6858 |
88 | |||
89 | /* DATAPILOT Universal-2 Phone Cable */ | ||
90 | #define DATAPILOT_U2_VENDOR_ID 0x0731 | ||
91 | #define DATAPILOT_U2_PRODUCT_ID 0x2003 | ||
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index 897d8447252b..789771ecdb11 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c | |||
@@ -71,7 +71,7 @@ | |||
71 | #include <linux/spinlock.h> | 71 | #include <linux/spinlock.h> |
72 | #include <asm/uaccess.h> | 72 | #include <asm/uaccess.h> |
73 | #include <linux/usb.h> | 73 | #include <linux/usb.h> |
74 | #include "usb-serial.h" | 74 | #include <linux/usb/serial.h> |
75 | 75 | ||
76 | 76 | ||
77 | #ifndef CONFIG_USB_SAFE_PADDED | 77 | #ifndef CONFIG_USB_SAFE_PADDED |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c new file mode 100644 index 000000000000..d29638daa987 --- /dev/null +++ b/drivers/usb/serial/sierra.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * Sierra Wireless CDMA Wireless Serial USB driver | ||
3 | * | ||
4 | * Current Copy modified by: Kevin Lloyd <linux@sierrawireless.com> | ||
5 | * Original Copyright (C) 2005-2006 Greg Kroah-Hartman <gregkh@suse.de> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License version | ||
9 | * 2 as published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/tty.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/usb.h> | ||
17 | #include <linux/usb/serial.h> | ||
18 | |||
19 | static struct usb_device_id id_table [] = { | ||
20 | { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */ | ||
21 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ | ||
22 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ | ||
23 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ | ||
24 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ | ||
25 | { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */ | ||
26 | { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */ | ||
27 | { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */ | ||
28 | /* Following devices are supported in the airprime.c driver */ | ||
29 | /* { USB_DEVICE(0x1199, 0x0112) }, */ /* Sierra Wireless AirCard 580 */ | ||
30 | /* { USB_DEVICE(0x0F3D, 0x0112) }, */ /* AirPrime/Sierra PC 5220 */ | ||
31 | { } | ||
32 | }; | ||
33 | MODULE_DEVICE_TABLE(usb, id_table); | ||
34 | |||
35 | static struct usb_driver sierra_driver = { | ||
36 | .name = "sierra_wireless", | ||
37 | .probe = usb_serial_probe, | ||
38 | .disconnect = usb_serial_disconnect, | ||
39 | .id_table = id_table, | ||
40 | }; | ||
41 | |||
42 | static struct usb_serial_driver sierra_device = { | ||
43 | .driver = { | ||
44 | .owner = THIS_MODULE, | ||
45 | .name = "Sierra_Wireless", | ||
46 | }, | ||
47 | .id_table = id_table, | ||
48 | .num_interrupt_in = NUM_DONT_CARE, | ||
49 | .num_bulk_in = NUM_DONT_CARE, | ||
50 | .num_bulk_out = NUM_DONT_CARE, | ||
51 | .num_ports = 3, | ||
52 | }; | ||
53 | |||
54 | static int __init sierra_init(void) | ||
55 | { | ||
56 | int retval; | ||
57 | |||
58 | retval = usb_serial_register(&sierra_device); | ||
59 | if (retval) | ||
60 | return retval; | ||
61 | retval = usb_register(&sierra_driver); | ||
62 | if (retval) | ||
63 | usb_serial_deregister(&sierra_device); | ||
64 | return retval; | ||
65 | } | ||
66 | |||
67 | static void __exit sierra_exit(void) | ||
68 | { | ||
69 | usb_deregister(&sierra_driver); | ||
70 | usb_serial_deregister(&sierra_device); | ||
71 | } | ||
72 | |||
73 | module_init(sierra_init); | ||
74 | module_exit(sierra_exit); | ||
75 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index a9afff31a921..ac9b8ee52d44 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -83,8 +83,8 @@ | |||
83 | #include <asm/uaccess.h> | 83 | #include <asm/uaccess.h> |
84 | #include <asm/semaphore.h> | 84 | #include <asm/semaphore.h> |
85 | #include <linux/usb.h> | 85 | #include <linux/usb.h> |
86 | #include <linux/usb/serial.h> | ||
86 | 87 | ||
87 | #include "usb-serial.h" | ||
88 | #include "ti_usb_3410_5052.h" | 88 | #include "ti_usb_3410_5052.h" |
89 | #include "ti_fw_3410.h" /* firmware image for 3410 */ | 89 | #include "ti_fw_3410.h" /* firmware image for 3410 */ |
90 | #include "ti_fw_5052.h" /* firmware image for 5052 */ | 90 | #include "ti_fw_5052.h" /* firmware image for 5052 */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index b59a0536ea5c..12c1694d322e 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/smp_lock.h> | 31 | #include <linux/smp_lock.h> |
32 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
33 | #include <linux/usb.h> | 33 | #include <linux/usb.h> |
34 | #include "usb-serial.h" | 34 | #include <linux/usb/serial.h> |
35 | #include "pl2303.h" | 35 | #include "pl2303.h" |
36 | 36 | ||
37 | /* | 37 | /* |
@@ -40,6 +40,8 @@ | |||
40 | #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" | 40 | #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" |
41 | #define DRIVER_DESC "USB Serial Driver core" | 41 | #define DRIVER_DESC "USB Serial Driver core" |
42 | 42 | ||
43 | static void port_free(struct usb_serial_port *port); | ||
44 | |||
43 | /* Driver structure we register with the USB core */ | 45 | /* Driver structure we register with the USB core */ |
44 | static struct usb_driver usb_serial_driver = { | 46 | static struct usb_driver usb_serial_driver = { |
45 | .name = "usbserial", | 47 | .name = "usbserial", |
@@ -146,23 +148,10 @@ static void destroy_serial(struct kref *kref) | |||
146 | port = serial->port[i]; | 148 | port = serial->port[i]; |
147 | if (!port) | 149 | if (!port) |
148 | continue; | 150 | continue; |
149 | usb_kill_urb(port->read_urb); | 151 | port_free(port); |
150 | usb_free_urb(port->read_urb); | ||
151 | usb_kill_urb(port->write_urb); | ||
152 | usb_free_urb(port->write_urb); | ||
153 | usb_kill_urb(port->interrupt_in_urb); | ||
154 | usb_free_urb(port->interrupt_in_urb); | ||
155 | usb_kill_urb(port->interrupt_out_urb); | ||
156 | usb_free_urb(port->interrupt_out_urb); | ||
157 | kfree(port->bulk_in_buffer); | ||
158 | kfree(port->bulk_out_buffer); | ||
159 | kfree(port->interrupt_in_buffer); | ||
160 | kfree(port->interrupt_out_buffer); | ||
161 | } | 152 | } |
162 | } | 153 | } |
163 | 154 | ||
164 | flush_scheduled_work(); /* port->work */ | ||
165 | |||
166 | usb_put_dev(serial->dev); | 155 | usb_put_dev(serial->dev); |
167 | 156 | ||
168 | /* free up any memory that we allocated */ | 157 | /* free up any memory that we allocated */ |
@@ -564,6 +553,11 @@ static void port_release(struct device *dev) | |||
564 | struct usb_serial_port *port = to_usb_serial_port(dev); | 553 | struct usb_serial_port *port = to_usb_serial_port(dev); |
565 | 554 | ||
566 | dbg ("%s - %s", __FUNCTION__, dev->bus_id); | 555 | dbg ("%s - %s", __FUNCTION__, dev->bus_id); |
556 | port_free(port); | ||
557 | } | ||
558 | |||
559 | static void port_free(struct usb_serial_port *port) | ||
560 | { | ||
567 | usb_kill_urb(port->read_urb); | 561 | usb_kill_urb(port->read_urb); |
568 | usb_free_urb(port->read_urb); | 562 | usb_free_urb(port->read_urb); |
569 | usb_kill_urb(port->write_urb); | 563 | usb_kill_urb(port->write_urb); |
@@ -576,6 +570,7 @@ static void port_release(struct device *dev) | |||
576 | kfree(port->bulk_out_buffer); | 570 | kfree(port->bulk_out_buffer); |
577 | kfree(port->interrupt_in_buffer); | 571 | kfree(port->interrupt_in_buffer); |
578 | kfree(port->interrupt_out_buffer); | 572 | kfree(port->interrupt_out_buffer); |
573 | flush_scheduled_work(); /* port->work */ | ||
579 | kfree(port); | 574 | kfree(port); |
580 | } | 575 | } |
581 | 576 | ||
diff --git a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h deleted file mode 100644 index 0f2802a60194..000000000000 --- a/drivers/usb/serial/usb-serial.h +++ /dev/null | |||
@@ -1,300 +0,0 @@ | |||
1 | /* | ||
2 | * USB Serial Converter driver | ||
3 | * | ||
4 | * Copyright (C) 1999 - 2005 | ||
5 | * Greg Kroah-Hartman (greg@kroah.com) | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | |||
14 | #ifndef __LINUX_USB_SERIAL_H | ||
15 | #define __LINUX_USB_SERIAL_H | ||
16 | |||
17 | #include <linux/kref.h> | ||
18 | #include <linux/mutex.h> | ||
19 | |||
20 | #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ | ||
21 | #define SERIAL_TTY_MINORS 255 /* loads of devices :) */ | ||
22 | |||
23 | #define MAX_NUM_PORTS 8 /* The maximum number of ports one device can grab at once */ | ||
24 | |||
25 | /* parity check flag */ | ||
26 | #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) | ||
27 | |||
28 | /** | ||
29 | * usb_serial_port: structure for the specific ports of a device. | ||
30 | * @serial: pointer back to the struct usb_serial owner of this port. | ||
31 | * @tty: pointer to the corresponding tty for this port. | ||
32 | * @lock: spinlock to grab when updating portions of this structure. | ||
33 | * @mutex: mutex used to synchronize serial_open() and serial_close() | ||
34 | * access for this port. | ||
35 | * @number: the number of the port (the minor number). | ||
36 | * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. | ||
37 | * @interrupt_in_urb: pointer to the interrupt in struct urb for this port. | ||
38 | * @interrupt_in_endpointAddress: endpoint address for the interrupt in pipe | ||
39 | * for this port. | ||
40 | * @interrupt_out_buffer: pointer to the interrupt out buffer for this port. | ||
41 | * @interrupt_out_size: the size of the interrupt_out_buffer, in bytes. | ||
42 | * @interrupt_out_urb: pointer to the interrupt out struct urb for this port. | ||
43 | * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe | ||
44 | * for this port. | ||
45 | * @bulk_in_buffer: pointer to the bulk in buffer for this port. | ||
46 | * @read_urb: pointer to the bulk in struct urb for this port. | ||
47 | * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this | ||
48 | * port. | ||
49 | * @bulk_out_buffer: pointer to the bulk out buffer for this port. | ||
50 | * @bulk_out_size: the size of the bulk_out_buffer, in bytes. | ||
51 | * @write_urb: pointer to the bulk out struct urb for this port. | ||
52 | * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this | ||
53 | * port. | ||
54 | * @write_wait: a wait_queue_head_t used by the port. | ||
55 | * @work: work queue entry for the line discipline waking up. | ||
56 | * @open_count: number of times this port has been opened. | ||
57 | * | ||
58 | * This structure is used by the usb-serial core and drivers for the specific | ||
59 | * ports of a device. | ||
60 | */ | ||
61 | struct usb_serial_port { | ||
62 | struct usb_serial * serial; | ||
63 | struct tty_struct * tty; | ||
64 | spinlock_t lock; | ||
65 | struct mutex mutex; | ||
66 | unsigned char number; | ||
67 | |||
68 | unsigned char * interrupt_in_buffer; | ||
69 | struct urb * interrupt_in_urb; | ||
70 | __u8 interrupt_in_endpointAddress; | ||
71 | |||
72 | unsigned char * interrupt_out_buffer; | ||
73 | int interrupt_out_size; | ||
74 | struct urb * interrupt_out_urb; | ||
75 | __u8 interrupt_out_endpointAddress; | ||
76 | |||
77 | unsigned char * bulk_in_buffer; | ||
78 | int bulk_in_size; | ||
79 | struct urb * read_urb; | ||
80 | __u8 bulk_in_endpointAddress; | ||
81 | |||
82 | unsigned char * bulk_out_buffer; | ||
83 | int bulk_out_size; | ||
84 | struct urb * write_urb; | ||
85 | int write_urb_busy; | ||
86 | __u8 bulk_out_endpointAddress; | ||
87 | |||
88 | wait_queue_head_t write_wait; | ||
89 | struct work_struct work; | ||
90 | int open_count; | ||
91 | struct device dev; | ||
92 | }; | ||
93 | #define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev) | ||
94 | |||
95 | /* get and set the port private data pointer helper functions */ | ||
96 | static inline void *usb_get_serial_port_data (struct usb_serial_port *port) | ||
97 | { | ||
98 | return dev_get_drvdata(&port->dev); | ||
99 | } | ||
100 | |||
101 | static inline void usb_set_serial_port_data (struct usb_serial_port *port, void *data) | ||
102 | { | ||
103 | dev_set_drvdata(&port->dev, data); | ||
104 | } | ||
105 | |||
106 | /** | ||
107 | * usb_serial - structure used by the usb-serial core for a device | ||
108 | * @dev: pointer to the struct usb_device for this device | ||
109 | * @type: pointer to the struct usb_serial_driver for this device | ||
110 | * @interface: pointer to the struct usb_interface for this device | ||
111 | * @minor: the starting minor number for this device | ||
112 | * @num_ports: the number of ports this device has | ||
113 | * @num_interrupt_in: number of interrupt in endpoints we have | ||
114 | * @num_interrupt_out: number of interrupt out endpoints we have | ||
115 | * @num_bulk_in: number of bulk in endpoints we have | ||
116 | * @num_bulk_out: number of bulk out endpoints we have | ||
117 | * @port: array of struct usb_serial_port structures for the different ports. | ||
118 | * @private: place to put any driver specific information that is needed. The | ||
119 | * usb-serial driver is required to manage this data, the usb-serial core | ||
120 | * will not touch this. Use usb_get_serial_data() and | ||
121 | * usb_set_serial_data() to access this. | ||
122 | */ | ||
123 | struct usb_serial { | ||
124 | struct usb_device * dev; | ||
125 | struct usb_serial_driver * type; | ||
126 | struct usb_interface * interface; | ||
127 | unsigned char minor; | ||
128 | unsigned char num_ports; | ||
129 | unsigned char num_port_pointers; | ||
130 | char num_interrupt_in; | ||
131 | char num_interrupt_out; | ||
132 | char num_bulk_in; | ||
133 | char num_bulk_out; | ||
134 | struct usb_serial_port * port[MAX_NUM_PORTS]; | ||
135 | struct kref kref; | ||
136 | void * private; | ||
137 | }; | ||
138 | #define to_usb_serial(d) container_of(d, struct usb_serial, kref) | ||
139 | |||
140 | #define NUM_DONT_CARE (-1) | ||
141 | |||
142 | /* get and set the serial private data pointer helper functions */ | ||
143 | static inline void *usb_get_serial_data (struct usb_serial *serial) | ||
144 | { | ||
145 | return serial->private; | ||
146 | } | ||
147 | |||
148 | static inline void usb_set_serial_data (struct usb_serial *serial, void *data) | ||
149 | { | ||
150 | serial->private = data; | ||
151 | } | ||
152 | |||
153 | /** | ||
154 | * usb_serial_driver - describes a usb serial driver | ||
155 | * @description: pointer to a string that describes this driver. This string used | ||
156 | * in the syslog messages when a device is inserted or removed. | ||
157 | * @id_table: pointer to a list of usb_device_id structures that define all | ||
158 | * of the devices this structure can support. | ||
159 | * @num_interrupt_in: the number of interrupt in endpoints this device will | ||
160 | * have. | ||
161 | * @num_interrupt_out: the number of interrupt out endpoints this device will | ||
162 | * have. | ||
163 | * @num_bulk_in: the number of bulk in endpoints this device will have. | ||
164 | * @num_bulk_out: the number of bulk out endpoints this device will have. | ||
165 | * @num_ports: the number of different ports this device will have. | ||
166 | * @calc_num_ports: pointer to a function to determine how many ports this | ||
167 | * device has dynamically. It will be called after the probe() | ||
168 | * callback is called, but before attach() | ||
169 | * @probe: pointer to the driver's probe function. | ||
170 | * This will be called when the device is inserted into the system, | ||
171 | * but before the device has been fully initialized by the usb_serial | ||
172 | * subsystem. Use this function to download any firmware to the device, | ||
173 | * or any other early initialization that might be needed. | ||
174 | * Return 0 to continue on with the initialization sequence. Anything | ||
175 | * else will abort it. | ||
176 | * @attach: pointer to the driver's attach function. | ||
177 | * This will be called when the struct usb_serial structure is fully set | ||
178 | * set up. Do any local initialization of the device, or any private | ||
179 | * memory structure allocation at this point in time. | ||
180 | * @shutdown: pointer to the driver's shutdown function. This will be | ||
181 | * called when the device is removed from the system. | ||
182 | * | ||
183 | * This structure is defines a USB Serial driver. It provides all of | ||
184 | * the information that the USB serial core code needs. If the function | ||
185 | * pointers are defined, then the USB serial core code will call them when | ||
186 | * the corresponding tty port functions are called. If they are not | ||
187 | * called, the generic serial function will be used instead. | ||
188 | * | ||
189 | * The driver.owner field should be set to the module owner of this driver. | ||
190 | * The driver.name field should be set to the name of this driver (remember | ||
191 | * it will show up in sysfs, so it needs to be short and to the point. | ||
192 | * Useing the module name is a good idea.) | ||
193 | */ | ||
194 | struct usb_serial_driver { | ||
195 | const char *description; | ||
196 | const struct usb_device_id *id_table; | ||
197 | char num_interrupt_in; | ||
198 | char num_interrupt_out; | ||
199 | char num_bulk_in; | ||
200 | char num_bulk_out; | ||
201 | char num_ports; | ||
202 | |||
203 | struct list_head driver_list; | ||
204 | struct device_driver driver; | ||
205 | |||
206 | int (*probe) (struct usb_serial *serial, const struct usb_device_id *id); | ||
207 | int (*attach) (struct usb_serial *serial); | ||
208 | int (*calc_num_ports) (struct usb_serial *serial); | ||
209 | |||
210 | void (*shutdown) (struct usb_serial *serial); | ||
211 | |||
212 | int (*port_probe) (struct usb_serial_port *port); | ||
213 | int (*port_remove) (struct usb_serial_port *port); | ||
214 | |||
215 | /* serial function calls */ | ||
216 | int (*open) (struct usb_serial_port *port, struct file * filp); | ||
217 | void (*close) (struct usb_serial_port *port, struct file * filp); | ||
218 | int (*write) (struct usb_serial_port *port, const unsigned char *buf, int count); | ||
219 | int (*write_room) (struct usb_serial_port *port); | ||
220 | int (*ioctl) (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); | ||
221 | void (*set_termios) (struct usb_serial_port *port, struct termios * old); | ||
222 | void (*break_ctl) (struct usb_serial_port *port, int break_state); | ||
223 | int (*chars_in_buffer) (struct usb_serial_port *port); | ||
224 | void (*throttle) (struct usb_serial_port *port); | ||
225 | void (*unthrottle) (struct usb_serial_port *port); | ||
226 | int (*tiocmget) (struct usb_serial_port *port, struct file *file); | ||
227 | int (*tiocmset) (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); | ||
228 | |||
229 | void (*read_int_callback)(struct urb *urb, struct pt_regs *regs); | ||
230 | void (*write_int_callback)(struct urb *urb, struct pt_regs *regs); | ||
231 | void (*read_bulk_callback)(struct urb *urb, struct pt_regs *regs); | ||
232 | void (*write_bulk_callback)(struct urb *urb, struct pt_regs *regs); | ||
233 | }; | ||
234 | #define to_usb_serial_driver(d) container_of(d, struct usb_serial_driver, driver) | ||
235 | |||
236 | extern int usb_serial_register(struct usb_serial_driver *driver); | ||
237 | extern void usb_serial_deregister(struct usb_serial_driver *driver); | ||
238 | extern void usb_serial_port_softint(struct usb_serial_port *port); | ||
239 | |||
240 | extern int usb_serial_probe(struct usb_interface *iface, const struct usb_device_id *id); | ||
241 | extern void usb_serial_disconnect(struct usb_interface *iface); | ||
242 | |||
243 | extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest); | ||
244 | extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit); | ||
245 | |||
246 | /* USB Serial console functions */ | ||
247 | #ifdef CONFIG_USB_SERIAL_CONSOLE | ||
248 | extern void usb_serial_console_init (int debug, int minor); | ||
249 | extern void usb_serial_console_exit (void); | ||
250 | extern void usb_serial_console_disconnect(struct usb_serial *serial); | ||
251 | #else | ||
252 | static inline void usb_serial_console_init (int debug, int minor) { } | ||
253 | static inline void usb_serial_console_exit (void) { } | ||
254 | static inline void usb_serial_console_disconnect(struct usb_serial *serial) {} | ||
255 | #endif | ||
256 | |||
257 | /* Functions needed by other parts of the usbserial core */ | ||
258 | extern struct usb_serial *usb_serial_get_by_index (unsigned int minor); | ||
259 | extern void usb_serial_put(struct usb_serial *serial); | ||
260 | extern int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp); | ||
261 | extern int usb_serial_generic_write (struct usb_serial_port *port, const unsigned char *buf, int count); | ||
262 | extern void usb_serial_generic_close (struct usb_serial_port *port, struct file *filp); | ||
263 | extern int usb_serial_generic_write_room (struct usb_serial_port *port); | ||
264 | extern int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port); | ||
265 | extern void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs); | ||
266 | extern void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs); | ||
267 | extern void usb_serial_generic_shutdown (struct usb_serial *serial); | ||
268 | extern int usb_serial_generic_register (int debug); | ||
269 | extern void usb_serial_generic_deregister (void); | ||
270 | |||
271 | extern int usb_serial_bus_register (struct usb_serial_driver *device); | ||
272 | extern void usb_serial_bus_deregister (struct usb_serial_driver *device); | ||
273 | |||
274 | extern struct usb_serial_driver usb_serial_generic_device; | ||
275 | extern struct bus_type usb_serial_bus_type; | ||
276 | extern struct tty_driver *usb_serial_tty_driver; | ||
277 | |||
278 | static inline void usb_serial_debug_data(int debug, | ||
279 | struct device *dev, | ||
280 | const char *function, int size, | ||
281 | const unsigned char *data) | ||
282 | { | ||
283 | int i; | ||
284 | |||
285 | if (debug) { | ||
286 | dev_printk(KERN_DEBUG, dev, "%s - length = %d, data = ", function, size); | ||
287 | for (i = 0; i < size; ++i) | ||
288 | printk ("%.2x ", data[i]); | ||
289 | printk ("\n"); | ||
290 | } | ||
291 | } | ||
292 | |||
293 | /* Use our own dbg macro */ | ||
294 | #undef dbg | ||
295 | #define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg); } while (0) | ||
296 | |||
297 | |||
298 | |||
299 | #endif /* ifdef __LINUX_USB_SERIAL_H */ | ||
300 | |||
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 95a2936e902e..88949f7884ca 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
27 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
28 | #include "usb-serial.h" | 28 | #include <linux/usb/serial.h> |
29 | #include "visor.h" | 29 | #include "visor.h" |
30 | 30 | ||
31 | /* | 31 | /* |
@@ -302,7 +302,6 @@ static int visor_open (struct usb_serial_port *port, struct file *filp) | |||
302 | spin_lock_irqsave(&priv->lock, flags); | 302 | spin_lock_irqsave(&priv->lock, flags); |
303 | priv->bytes_in = 0; | 303 | priv->bytes_in = 0; |
304 | priv->bytes_out = 0; | 304 | priv->bytes_out = 0; |
305 | priv->outstanding_urbs = 0; | ||
306 | priv->throttled = 0; | 305 | priv->throttled = 0; |
307 | spin_unlock_irqrestore(&priv->lock, flags); | 306 | spin_unlock_irqrestore(&priv->lock, flags); |
308 | 307 | ||
@@ -435,13 +434,25 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf, | |||
435 | 434 | ||
436 | static int visor_write_room (struct usb_serial_port *port) | 435 | static int visor_write_room (struct usb_serial_port *port) |
437 | { | 436 | { |
437 | struct visor_private *priv = usb_get_serial_port_data(port); | ||
438 | unsigned long flags; | ||
439 | |||
438 | dbg("%s - port %d", __FUNCTION__, port->number); | 440 | dbg("%s - port %d", __FUNCTION__, port->number); |
439 | 441 | ||
440 | /* | 442 | /* |
441 | * We really can take anything the user throws at us | 443 | * We really can take anything the user throws at us |
442 | * but let's pick a nice big number to tell the tty | 444 | * but let's pick a nice big number to tell the tty |
443 | * layer that we have lots of free space | 445 | * layer that we have lots of free space, unless we don't. |
444 | */ | 446 | */ |
447 | |||
448 | spin_lock_irqsave(&priv->lock, flags); | ||
449 | if (priv->outstanding_urbs > URB_UPPER_LIMIT * 2 / 3) { | ||
450 | spin_unlock_irqrestore(&priv->lock, flags); | ||
451 | dbg("%s - write limit hit\n", __FUNCTION__); | ||
452 | return 0; | ||
453 | } | ||
454 | spin_unlock_irqrestore(&priv->lock, flags); | ||
455 | |||
445 | return 2048; | 456 | return 2048; |
446 | } | 457 | } |
447 | 458 | ||
@@ -758,15 +769,22 @@ static int visor_calc_num_ports (struct usb_serial *serial) | |||
758 | 769 | ||
759 | static int generic_startup(struct usb_serial *serial) | 770 | static int generic_startup(struct usb_serial *serial) |
760 | { | 771 | { |
772 | struct usb_serial_port **ports = serial->port; | ||
761 | struct visor_private *priv; | 773 | struct visor_private *priv; |
762 | int i; | 774 | int i; |
763 | 775 | ||
764 | for (i = 0; i < serial->num_ports; ++i) { | 776 | for (i = 0; i < serial->num_ports; ++i) { |
765 | priv = kzalloc (sizeof(*priv), GFP_KERNEL); | 777 | priv = kzalloc (sizeof(*priv), GFP_KERNEL); |
766 | if (!priv) | 778 | if (!priv) { |
779 | while (i-- != 0) { | ||
780 | priv = usb_get_serial_port_data(ports[i]); | ||
781 | usb_set_serial_port_data(ports[i], NULL); | ||
782 | kfree(priv); | ||
783 | } | ||
767 | return -ENOMEM; | 784 | return -ENOMEM; |
785 | } | ||
768 | spin_lock_init(&priv->lock); | 786 | spin_lock_init(&priv->lock); |
769 | usb_set_serial_port_data(serial->port[i], priv); | 787 | usb_set_serial_port_data(ports[i], priv); |
770 | } | 788 | } |
771 | return 0; | 789 | return 0; |
772 | } | 790 | } |
@@ -876,7 +894,18 @@ static int clie_5_attach (struct usb_serial *serial) | |||
876 | 894 | ||
877 | static void visor_shutdown (struct usb_serial *serial) | 895 | static void visor_shutdown (struct usb_serial *serial) |
878 | { | 896 | { |
897 | struct visor_private *priv; | ||
898 | int i; | ||
899 | |||
879 | dbg("%s", __FUNCTION__); | 900 | dbg("%s", __FUNCTION__); |
901 | |||
902 | for (i = 0; i < serial->num_ports; i++) { | ||
903 | priv = usb_get_serial_port_data(serial->port[i]); | ||
904 | if (priv) { | ||
905 | usb_set_serial_port_data(serial->port[i], NULL); | ||
906 | kfree(priv); | ||
907 | } | ||
908 | } | ||
880 | } | 909 | } |
881 | 910 | ||
882 | static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) | 911 | static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 540438c3f381..6e6c7934be32 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
@@ -79,7 +79,7 @@ | |||
79 | #include <linux/usb.h> | 79 | #include <linux/usb.h> |
80 | #include <linux/serial_reg.h> | 80 | #include <linux/serial_reg.h> |
81 | #include <linux/serial.h> | 81 | #include <linux/serial.h> |
82 | #include "usb-serial.h" | 82 | #include <linux/usb/serial.h> |
83 | #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ | 83 | #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ |
84 | #include "whiteheat.h" /* WhiteHEAT specific commands */ | 84 | #include "whiteheat.h" /* WhiteHEAT specific commands */ |
85 | 85 | ||
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 5715291ba540..a4b7df9ff8c1 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
@@ -112,13 +112,11 @@ static int slave_configure(struct scsi_device *sdev) | |||
112 | if (sdev->scsi_level < SCSI_2) | 112 | if (sdev->scsi_level < SCSI_2) |
113 | sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; | 113 | sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; |
114 | 114 | ||
115 | /* According to the technical support people at Genesys Logic, | 115 | /* Many devices have trouble transfering more than 32KB at a time, |
116 | * devices using their chips have problems transferring more than | 116 | * while others have trouble with more than 64K. At this time we |
117 | * 32 KB at a time. In practice people have found that 64 KB | 117 | * are limiting both to 32K (64 sectores). |
118 | * works okay and that's what Windows does. But we'll be | 118 | */ |
119 | * conservative; people can always use the sysfs interface to | 119 | if ((us->flags & US_FL_MAX_SECTORS_64) && |
120 | * increase max_sectors. */ | ||
121 | if (le16_to_cpu(us->pusb_dev->descriptor.idVendor) == USB_VENDOR_ID_GENESYS && | ||
122 | sdev->request_queue->max_sectors > 64) | 120 | sdev->request_queue->max_sectors > 64) |
123 | blk_queue_max_sectors(sdev->request_queue, 64); | 121 | blk_queue_max_sectors(sdev->request_queue, 64); |
124 | 122 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index c7e84e653df9..a5ca449f6e64 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -112,6 +112,19 @@ UNUSUAL_DEV( 0x0411, 0x001c, 0x0113, 0x0113, | |||
112 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 112 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
113 | US_FL_FIX_INQUIRY ), | 113 | US_FL_FIX_INQUIRY ), |
114 | 114 | ||
115 | /* Submitted by Ernestas Vaiciukevicius <ernisv@gmail.com> */ | ||
116 | UNUSUAL_DEV( 0x0419, 0x0100, 0x0100, 0x0100, | ||
117 | "Samsung Info. Systems America, Inc.", | ||
118 | "MP3 Player", | ||
119 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
120 | US_FL_IGNORE_RESIDUE ), | ||
121 | |||
122 | /* Reported by Orgad Shaneh <orgads@gmail.com> */ | ||
123 | UNUSUAL_DEV( 0x0419, 0xaace, 0x0100, 0x0100, | ||
124 | "Samsung", "MP3 Player", | ||
125 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
126 | US_FL_IGNORE_RESIDUE ), | ||
127 | |||
115 | /* Reported by Christian Leber <christian@leber.de> */ | 128 | /* Reported by Christian Leber <christian@leber.de> */ |
116 | UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, | 129 | UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, |
117 | "TrekStor", | 130 | "TrekStor", |
@@ -132,6 +145,14 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, | |||
132 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 145 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
133 | US_FL_IGNORE_RESIDUE ), | 146 | US_FL_IGNORE_RESIDUE ), |
134 | 147 | ||
148 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and | ||
149 | * Einar Th. Einarsson <einarthered@gmail.com> */ | ||
150 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, | ||
151 | "Nokia", | ||
152 | "N91", | ||
153 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
154 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
155 | |||
135 | /* Reported by Jiri Slaby <jirislaby@gmail.com> and | 156 | /* Reported by Jiri Slaby <jirislaby@gmail.com> and |
136 | * Rene C. Castberg <Rene@Castberg.org> */ | 157 | * Rene C. Castberg <Rene@Castberg.org> */ |
137 | UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, | 158 | UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, |
@@ -140,6 +161,13 @@ UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, | |||
140 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 161 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
141 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | 162 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), |
142 | 163 | ||
164 | /* Reported by Matthew Bloch <matthew@bytemark.co.uk> */ | ||
165 | UNUSUAL_DEV( 0x0421, 0x044e, 0x0100, 0x0100, | ||
166 | "Nokia", | ||
167 | "E61", | ||
168 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
169 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
170 | |||
143 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ | 171 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ |
144 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, | 172 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, |
145 | "SMSC", | 173 | "SMSC", |
@@ -473,10 +501,11 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, | |||
473 | US_SC_SCSI, US_PR_DEVICE, NULL, | 501 | US_SC_SCSI, US_PR_DEVICE, NULL, |
474 | US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), | 502 | US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), |
475 | 503 | ||
476 | /* This entry is needed because the device reports Sub=ff */ | 504 | /* Submitted by Lars Jacob <jacob.lars@googlemail.com> |
477 | UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600, | 505 | * This entry is needed because the device reports Sub=ff */ |
506 | UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610, | ||
478 | "Sony", | 507 | "Sony", |
479 | "DSC-T1/T5", | 508 | "DSC-T1/T5/H5", |
480 | US_SC_8070, US_PR_DEVICE, NULL, | 509 | US_SC_8070, US_PR_DEVICE, NULL, |
481 | US_FL_SINGLE_LUN ), | 510 | US_FL_SINGLE_LUN ), |
482 | 511 | ||
@@ -708,18 +737,22 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113, | |||
708 | * They were originally reported by Alexander Oltu | 737 | * They were originally reported by Alexander Oltu |
709 | * <alexander@all-2.com> and Peter Marks <peter.marks@turner.com> | 738 | * <alexander@all-2.com> and Peter Marks <peter.marks@turner.com> |
710 | * respectively. | 739 | * respectively. |
740 | * | ||
741 | * US_FL_GO_SLOW and US_FL_MAX_SECTORS_64 added by Phil Dibowitz | ||
742 | * <phil@ipom.com> as these flags were made and hard-coded | ||
743 | * special-cases were pulled from scsiglue.c. | ||
711 | */ | 744 | */ |
712 | UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, | 745 | UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, |
713 | "Genesys Logic", | 746 | "Genesys Logic", |
714 | "USB to IDE Optical", | 747 | "USB to IDE Optical", |
715 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 748 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
716 | US_FL_GO_SLOW ), | 749 | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), |
717 | 750 | ||
718 | UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, | 751 | UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, |
719 | "Genesys Logic", | 752 | "Genesys Logic", |
720 | "USB to IDE Disk", | 753 | "USB to IDE Disk", |
721 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 754 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
722 | US_FL_GO_SLOW ), | 755 | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), |
723 | 756 | ||
724 | /* Reported by Hanno Boeck <hanno@gmx.de> | 757 | /* Reported by Hanno Boeck <hanno@gmx.de> |
725 | * Taken from the Lycoris Kernel */ | 758 | * Taken from the Lycoris Kernel */ |
@@ -1196,6 +1229,14 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110, | |||
1196 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1229 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1197 | US_FL_IGNORE_RESIDUE ), | 1230 | US_FL_IGNORE_RESIDUE ), |
1198 | 1231 | ||
1232 | /* Reported by Benjamin Schiller <sbenni@gmx.de> | ||
1233 | * It is also sold by Easylite as DJ 20 */ | ||
1234 | UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103, | ||
1235 | "Typhoon", | ||
1236 | "My DJ 1820", | ||
1237 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1238 | US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), | ||
1239 | |||
1199 | /* Reported by Michael Stattmann <michael@stattmann.com> */ | 1240 | /* Reported by Michael Stattmann <michael@stattmann.com> */ |
1200 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, | 1241 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, |
1201 | "Sony Ericsson", | 1242 | "Sony Ericsson", |
@@ -1227,6 +1268,15 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110, | |||
1227 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1268 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1228 | US_FL_IGNORE_RESIDUE ), | 1269 | US_FL_IGNORE_RESIDUE ), |
1229 | 1270 | ||
1271 | /* patch submitted by Davide Perini <perini.davide@dpsoftware.org> | ||
1272 | * and Renato Perini <rperini@email.it> | ||
1273 | */ | ||
1274 | UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001, | ||
1275 | "Motorola", | ||
1276 | "RAZR V3x", | ||
1277 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1278 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), | ||
1279 | |||
1230 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ | 1280 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ |
1231 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, | 1281 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, |
1232 | "MPIO", | 1282 | "MPIO", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 1185acac4b21..5ee19be52f65 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/slab.h> | 55 | #include <linux/slab.h> |
56 | #include <linux/kthread.h> | 56 | #include <linux/kthread.h> |
57 | #include <linux/mutex.h> | 57 | #include <linux/mutex.h> |
58 | #include <linux/utsrelease.h> | ||
58 | 59 | ||
59 | #include <scsi/scsi.h> | 60 | #include <scsi/scsi.h> |
60 | #include <scsi/scsi_cmnd.h> | 61 | #include <scsi/scsi_cmnd.h> |
@@ -373,8 +374,12 @@ static int usb_stor_control_thread(void * __us) | |||
373 | /* lock access to the state */ | 374 | /* lock access to the state */ |
374 | scsi_lock(host); | 375 | scsi_lock(host); |
375 | 376 | ||
377 | /* did the command already complete because of a disconnect? */ | ||
378 | if (!us->srb) | ||
379 | ; /* nothing to do */ | ||
380 | |||
376 | /* indicate that the command is done */ | 381 | /* indicate that the command is done */ |
377 | if (us->srb->result != DID_ABORT << 16) { | 382 | else if (us->srb->result != DID_ABORT << 16) { |
378 | US_DEBUGP("scsi cmd done, result=0x%x\n", | 383 | US_DEBUGP("scsi cmd done, result=0x%x\n", |
379 | us->srb->result); | 384 | us->srb->result); |
380 | us->srb->scsi_done(us->srb); | 385 | us->srb->scsi_done(us->srb); |
@@ -524,7 +529,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
524 | if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) | 529 | if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) |
525 | printk(KERN_NOTICE USB_STORAGE "This device " | 530 | printk(KERN_NOTICE USB_STORAGE "This device " |
526 | "(%04x,%04x,%04x S %02x P %02x)" | 531 | "(%04x,%04x,%04x S %02x P %02x)" |
527 | " has %s in unusual_devs.h\n" | 532 | " has %s in unusual_devs.h (kernel" |
533 | " %s)\n" | ||
528 | " Please send a copy of this message to " | 534 | " Please send a copy of this message to " |
529 | "<linux-usb-devel@lists.sourceforge.net>\n", | 535 | "<linux-usb-devel@lists.sourceforge.net>\n", |
530 | le16_to_cpu(ddesc->idVendor), | 536 | le16_to_cpu(ddesc->idVendor), |
@@ -532,7 +538,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
532 | le16_to_cpu(ddesc->bcdDevice), | 538 | le16_to_cpu(ddesc->bcdDevice), |
533 | idesc->bInterfaceSubClass, | 539 | idesc->bInterfaceSubClass, |
534 | idesc->bInterfaceProtocol, | 540 | idesc->bInterfaceProtocol, |
535 | msgs[msg]); | 541 | msgs[msg], |
542 | UTS_RELEASE); | ||
536 | } | 543 | } |
537 | } | 544 | } |
538 | 545 | ||
@@ -836,32 +843,34 @@ static void dissociate_dev(struct us_data *us) | |||
836 | * the host */ | 843 | * the host */ |
837 | static void quiesce_and_remove_host(struct us_data *us) | 844 | static void quiesce_and_remove_host(struct us_data *us) |
838 | { | 845 | { |
846 | struct Scsi_Host *host = us_to_host(us); | ||
847 | |||
839 | /* Prevent new USB transfers, stop the current command, and | 848 | /* Prevent new USB transfers, stop the current command, and |
840 | * interrupt a SCSI-scan or device-reset delay */ | 849 | * interrupt a SCSI-scan or device-reset delay */ |
850 | scsi_lock(host); | ||
841 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | 851 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); |
852 | scsi_unlock(host); | ||
842 | usb_stor_stop_transport(us); | 853 | usb_stor_stop_transport(us); |
843 | wake_up(&us->delay_wait); | 854 | wake_up(&us->delay_wait); |
844 | 855 | ||
845 | /* It doesn't matter if the SCSI-scanning thread is still running. | 856 | /* It doesn't matter if the SCSI-scanning thread is still running. |
846 | * The thread will exit when it sees the DISCONNECTING flag. */ | 857 | * The thread will exit when it sees the DISCONNECTING flag. */ |
847 | 858 | ||
848 | /* Wait for the current command to finish, then remove the host */ | ||
849 | mutex_lock(&us->dev_mutex); | ||
850 | mutex_unlock(&us->dev_mutex); | ||
851 | |||
852 | /* queuecommand won't accept any new commands and the control | 859 | /* queuecommand won't accept any new commands and the control |
853 | * thread won't execute a previously-queued command. If there | 860 | * thread won't execute a previously-queued command. If there |
854 | * is such a command pending, complete it with an error. */ | 861 | * is such a command pending, complete it with an error. */ |
862 | mutex_lock(&us->dev_mutex); | ||
855 | if (us->srb) { | 863 | if (us->srb) { |
856 | us->srb->result = DID_NO_CONNECT << 16; | 864 | us->srb->result = DID_NO_CONNECT << 16; |
857 | scsi_lock(us_to_host(us)); | 865 | scsi_lock(host); |
858 | us->srb->scsi_done(us->srb); | 866 | us->srb->scsi_done(us->srb); |
859 | us->srb = NULL; | 867 | us->srb = NULL; |
860 | scsi_unlock(us_to_host(us)); | 868 | scsi_unlock(host); |
861 | } | 869 | } |
870 | mutex_unlock(&us->dev_mutex); | ||
862 | 871 | ||
863 | /* Now we own no commands so it's safe to remove the SCSI host */ | 872 | /* Now we own no commands so it's safe to remove the SCSI host */ |
864 | scsi_remove_host(us_to_host(us)); | 873 | scsi_remove_host(host); |
865 | } | 874 | } |
866 | 875 | ||
867 | /* Second stage of disconnect processing: deallocate all resources */ | 876 | /* Second stage of disconnect processing: deallocate all resources */ |
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 5284abe1b5eb..21f3ddbc9080 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h | |||
@@ -176,8 +176,4 @@ extern void fill_inquiry_response(struct us_data *us, | |||
176 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) | 176 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) |
177 | #define scsi_lock(host) spin_lock_irq(host->host_lock) | 177 | #define scsi_lock(host) spin_lock_irq(host->host_lock) |
178 | 178 | ||
179 | |||
180 | /* Vendor ID list for devices that require special handling */ | ||
181 | #define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */ | ||
182 | |||
183 | #endif | 179 | #endif |
diff --git a/drivers/w1/masters/ds2482.c b/drivers/w1/masters/ds2482.c index af492cc48db2..d93eb626b2f0 100644 --- a/drivers/w1/masters/ds2482.c +++ b/drivers/w1/masters/ds2482.c | |||
@@ -218,7 +218,7 @@ static int ds2482_wait_1wire_idle(struct ds2482_data *pdev) | |||
218 | do { | 218 | do { |
219 | temp = i2c_smbus_read_byte(&pdev->client); | 219 | temp = i2c_smbus_read_byte(&pdev->client); |
220 | } while ((temp >= 0) && (temp & DS2482_REG_STS_1WB) && | 220 | } while ((temp >= 0) && (temp & DS2482_REG_STS_1WB) && |
221 | (++retries > DS2482_WAIT_IDLE_TIMEOUT)); | 221 | (++retries < DS2482_WAIT_IDLE_TIMEOUT)); |
222 | } | 222 | } |
223 | 223 | ||
224 | if (retries > DS2482_WAIT_IDLE_TIMEOUT) | 224 | if (retries > DS2482_WAIT_IDLE_TIMEOUT) |
diff --git a/drivers/w1/w1_io.h b/drivers/w1/w1_io.h deleted file mode 100644 index 9a76d2ad69c5..000000000000 --- a/drivers/w1/w1_io.h +++ /dev/null | |||
@@ -1,36 +0,0 @@ | |||
1 | /* | ||
2 | * w1_io.h | ||
3 | * | ||
4 | * Copyright (c) 2004 Evgeniy Polyakov <johnpol@2ka.mipt.ru> | ||
5 | * | ||
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 as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | #ifndef __W1_IO_H | ||
23 | #define __W1_IO_H | ||
24 | |||
25 | #include "w1.h" | ||
26 | |||
27 | u8 w1_triplet(struct w1_master *dev, int bdir); | ||
28 | void w1_write_8(struct w1_master *, u8); | ||
29 | int w1_reset_bus(struct w1_master *); | ||
30 | u8 w1_calc_crc8(u8 *, int); | ||
31 | void w1_write_block(struct w1_master *, const u8 *, int); | ||
32 | u8 w1_read_block(struct w1_master *, u8 *, int); | ||
33 | void w1_search_devices(struct w1_master *dev, w1_slave_found_callback cb); | ||
34 | int w1_reset_select_slave(struct w1_slave *sl); | ||
35 | |||
36 | #endif /* __W1_IO_H */ | ||