diff options
Diffstat (limited to 'drivers')
123 files changed, 1251 insertions, 893 deletions
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c index b770deab968c..6d7d4157e049 100644 --- a/drivers/acpi/asus_acpi.c +++ b/drivers/acpi/asus_acpi.c | |||
@@ -1357,7 +1357,7 @@ static struct backlight_ops asus_backlight_data = { | |||
1357 | .update_status = set_brightness_status, | 1357 | .update_status = set_brightness_status, |
1358 | }; | 1358 | }; |
1359 | 1359 | ||
1360 | static void __exit asus_acpi_exit(void) | 1360 | static void asus_acpi_exit(void) |
1361 | { | 1361 | { |
1362 | if (asus_backlight_device) | 1362 | if (asus_backlight_device) |
1363 | backlight_device_unregister(asus_backlight_device); | 1363 | backlight_device_unregister(asus_backlight_device); |
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index a2efae8a4c4e..0c9f15c54e8c 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
@@ -59,7 +59,7 @@ int node_to_pxm(int node) | |||
59 | return node_to_pxm_map[node]; | 59 | return node_to_pxm_map[node]; |
60 | } | 60 | } |
61 | 61 | ||
62 | int __cpuinit acpi_map_pxm_to_node(int pxm) | 62 | int acpi_map_pxm_to_node(int pxm) |
63 | { | 63 | { |
64 | int node = pxm_to_node_map[pxm]; | 64 | int node = pxm_to_node_map[pxm]; |
65 | 65 | ||
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c index 0e7b121a99ce..3bc0c67a9283 100644 --- a/drivers/acpi/tables/tbinstal.c +++ b/drivers/acpi/tables/tbinstal.c | |||
@@ -123,14 +123,14 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, | |||
123 | } | 123 | } |
124 | } | 124 | } |
125 | 125 | ||
126 | /* The table must be either an SSDT or a PSDT */ | 126 | /* The table must be either an SSDT or a PSDT or an OEMx */ |
127 | 127 | ||
128 | if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT)) | 128 | if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT)) |
129 | && | 129 | && |
130 | (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT))) | 130 | (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)) |
131 | { | 131 | && (strncmp(table_desc->pointer->signature, "OEM", 3))) { |
132 | ACPI_ERROR((AE_INFO, | 132 | ACPI_ERROR((AE_INFO, |
133 | "Table has invalid signature [%4.4s], must be SSDT or PSDT", | 133 | "Table has invalid signature [%4.4s], must be SSDT, PSDT or OEMx", |
134 | table_desc->pointer->signature)); | 134 | table_desc->pointer->signature)); |
135 | return_ACPI_STATUS(AE_BAD_SIGNATURE); | 135 | return_ACPI_STATUS(AE_BAD_SIGNATURE); |
136 | } | 136 | } |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 1ada017d01ef..194ecfe8b360 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -827,6 +827,7 @@ static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file) | |||
827 | static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) | 827 | static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) |
828 | { | 828 | { |
829 | struct acpi_thermal *tz = seq->private; | 829 | struct acpi_thermal *tz = seq->private; |
830 | struct acpi_device *device; | ||
830 | int i = 0; | 831 | int i = 0; |
831 | int j = 0; | 832 | int j = 0; |
832 | 833 | ||
@@ -849,9 +850,8 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) | |||
849 | tz->trips.passive.tc1, tz->trips.passive.tc2, | 850 | tz->trips.passive.tc1, tz->trips.passive.tc2, |
850 | tz->trips.passive.tsp); | 851 | tz->trips.passive.tsp); |
851 | for (j = 0; j < tz->trips.passive.devices.count; j++) { | 852 | for (j = 0; j < tz->trips.passive.devices.count; j++) { |
852 | 853 | acpi_bus_get_device(tz->trips.passive.devices.handles[j], &device); | |
853 | seq_printf(seq, "0x%p ", | 854 | seq_printf(seq, "%4.4s ", acpi_device_bid(device)); |
854 | tz->trips.passive.devices.handles[j]); | ||
855 | } | 855 | } |
856 | seq_puts(seq, "\n"); | 856 | seq_puts(seq, "\n"); |
857 | } | 857 | } |
@@ -862,9 +862,10 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) | |||
862 | seq_printf(seq, "active[%d]: %ld C: devices=", | 862 | seq_printf(seq, "active[%d]: %ld C: devices=", |
863 | i, | 863 | i, |
864 | KELVIN_TO_CELSIUS(tz->trips.active[i].temperature)); | 864 | KELVIN_TO_CELSIUS(tz->trips.active[i].temperature)); |
865 | for (j = 0; j < tz->trips.active[i].devices.count; j++) | 865 | for (j = 0; j < tz->trips.active[i].devices.count; j++){ |
866 | seq_printf(seq, "0x%p ", | 866 | acpi_bus_get_device(tz->trips.active[i].devices.handles[j], &device); |
867 | tz->trips.active[i].devices.handles[j]); | 867 | seq_printf(seq, "%4.4s ", acpi_device_bid(device)); |
868 | } | ||
868 | seq_puts(seq, "\n"); | 869 | seq_puts(seq, "\n"); |
869 | } | 870 | } |
870 | 871 | ||
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c index 3906d47b9783..1cfbecb0ac10 100644 --- a/drivers/acpi/toshiba_acpi.c +++ b/drivers/acpi/toshiba_acpi.c | |||
@@ -538,7 +538,7 @@ static struct backlight_ops toshiba_backlight_data = { | |||
538 | .update_status = set_lcd_status, | 538 | .update_status = set_lcd_status, |
539 | }; | 539 | }; |
540 | 540 | ||
541 | static void __exit toshiba_acpi_exit(void) | 541 | static void toshiba_acpi_exit(void) |
542 | { | 542 | { |
543 | if (toshiba_backlight_device) | 543 | if (toshiba_backlight_device) |
544 | backlight_device_unregister(toshiba_backlight_device); | 544 | backlight_device_unregister(toshiba_backlight_device); |
diff --git a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c index 4c1e00874dff..879eaa10d3ae 100644 --- a/drivers/acpi/utilities/utcopy.c +++ b/drivers/acpi/utilities/utcopy.c | |||
@@ -68,6 +68,10 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *user_obj, | |||
68 | union acpi_operand_object **return_obj); | 68 | union acpi_operand_object **return_obj); |
69 | 69 | ||
70 | static acpi_status | 70 | static acpi_status |
71 | acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object, | ||
72 | union acpi_operand_object **internal_object); | ||
73 | |||
74 | static acpi_status | ||
71 | acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, | 75 | acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, |
72 | union acpi_operand_object *dest_desc); | 76 | union acpi_operand_object *dest_desc); |
73 | 77 | ||
@@ -518,77 +522,73 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, | |||
518 | return_ACPI_STATUS(AE_NO_MEMORY); | 522 | return_ACPI_STATUS(AE_NO_MEMORY); |
519 | } | 523 | } |
520 | 524 | ||
521 | #ifdef ACPI_FUTURE_IMPLEMENTATION | ||
522 | /* Code to convert packages that are parameters to control methods */ | ||
523 | |||
524 | /******************************************************************************* | 525 | /******************************************************************************* |
525 | * | 526 | * |
526 | * FUNCTION: acpi_ut_copy_epackage_to_ipackage | 527 | * FUNCTION: acpi_ut_copy_epackage_to_ipackage |
527 | * | 528 | * |
528 | * PARAMETERS: *internal_object - Pointer to the object we are returning | 529 | * PARAMETERS: external_object - The external object to be converted |
529 | * *Buffer - Where the object is returned | 530 | * internal_object - Where the internal object is returned |
530 | * *space_used - Where the length of the object is returned | ||
531 | * | 531 | * |
532 | * RETURN: Status | 532 | * RETURN: Status |
533 | * | 533 | * |
534 | * DESCRIPTION: This function is called to place a package object in a user | 534 | * DESCRIPTION: Copy an external package object to an internal package. |
535 | * buffer. A package object by definition contains other objects. | 535 | * Handles nested packages. |
536 | * | ||
537 | * The buffer is assumed to have sufficient space for the object. | ||
538 | * The caller must have verified the buffer length needed using the | ||
539 | * acpi_ut_get_object_size function before calling this function. | ||
540 | * | 536 | * |
541 | ******************************************************************************/ | 537 | ******************************************************************************/ |
542 | 538 | ||
543 | static acpi_status | 539 | static acpi_status |
544 | acpi_ut_copy_epackage_to_ipackage(union acpi_operand_object *internal_object, | 540 | acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object, |
545 | u8 * buffer, u32 * space_used) | 541 | union acpi_operand_object **internal_object) |
546 | { | 542 | { |
547 | u8 *free_space; | 543 | acpi_status status = AE_OK; |
548 | union acpi_object *external_object; | 544 | union acpi_operand_object *package_object; |
549 | u32 length = 0; | 545 | union acpi_operand_object **package_elements; |
550 | u32 this_index; | 546 | acpi_native_uint i; |
551 | u32 object_space = 0; | ||
552 | union acpi_operand_object *this_internal_obj; | ||
553 | union acpi_object *this_external_obj; | ||
554 | 547 | ||
555 | ACPI_FUNCTION_TRACE(ut_copy_epackage_to_ipackage); | 548 | ACPI_FUNCTION_TRACE(ut_copy_epackage_to_ipackage); |
556 | 549 | ||
557 | /* | 550 | /* Create the package object */ |
558 | * First package at head of the buffer | ||
559 | */ | ||
560 | external_object = (union acpi_object *)buffer; | ||
561 | 551 | ||
562 | /* | 552 | package_object = |
563 | * Free space begins right after the first package | 553 | acpi_ut_create_package_object(external_object->package.count); |
564 | */ | 554 | if (!package_object) { |
565 | free_space = buffer + sizeof(union acpi_object); | 555 | return_ACPI_STATUS(AE_NO_MEMORY); |
556 | } | ||
566 | 557 | ||
567 | external_object->type = ACPI_GET_OBJECT_TYPE(internal_object); | 558 | package_elements = package_object->package.elements; |
568 | external_object->package.count = internal_object->package.count; | ||
569 | external_object->package.elements = (union acpi_object *)free_space; | ||
570 | 559 | ||
571 | /* | 560 | /* |
572 | * Build an array of ACPI_OBJECTS in the buffer | 561 | * Recursive implementation. Probably ok, since nested external packages |
573 | * and move the free space past it | 562 | * as parameters should be very rare. |
574 | */ | 563 | */ |
575 | free_space += | 564 | for (i = 0; i < external_object->package.count; i++) { |
576 | external_object->package.count * sizeof(union acpi_object); | 565 | status = |
566 | acpi_ut_copy_eobject_to_iobject(&external_object->package. | ||
567 | elements[i], | ||
568 | &package_elements[i]); | ||
569 | if (ACPI_FAILURE(status)) { | ||
577 | 570 | ||
578 | /* Call walk_package */ | 571 | /* Truncate package and delete it */ |
579 | 572 | ||
580 | } | 573 | package_object->package.count = i; |
574 | package_elements[i] = NULL; | ||
575 | acpi_ut_remove_reference(package_object); | ||
576 | return_ACPI_STATUS(status); | ||
577 | } | ||
578 | } | ||
581 | 579 | ||
582 | #endif /* Future implementation */ | 580 | *internal_object = package_object; |
581 | return_ACPI_STATUS(status); | ||
582 | } | ||
583 | 583 | ||
584 | /******************************************************************************* | 584 | /******************************************************************************* |
585 | * | 585 | * |
586 | * FUNCTION: acpi_ut_copy_eobject_to_iobject | 586 | * FUNCTION: acpi_ut_copy_eobject_to_iobject |
587 | * | 587 | * |
588 | * PARAMETERS: *internal_object - The external object to be converted | 588 | * PARAMETERS: external_object - The external object to be converted |
589 | * *buffer_ptr - Where the internal object is returned | 589 | * internal_object - Where the internal object is returned |
590 | * | 590 | * |
591 | * RETURN: Status - the status of the call | 591 | * RETURN: Status - the status of the call |
592 | * | 592 | * |
593 | * DESCRIPTION: Converts an external object to an internal object. | 593 | * DESCRIPTION: Converts an external object to an internal object. |
594 | * | 594 | * |
@@ -603,16 +603,10 @@ acpi_ut_copy_eobject_to_iobject(union acpi_object *external_object, | |||
603 | ACPI_FUNCTION_TRACE(ut_copy_eobject_to_iobject); | 603 | ACPI_FUNCTION_TRACE(ut_copy_eobject_to_iobject); |
604 | 604 | ||
605 | if (external_object->type == ACPI_TYPE_PACKAGE) { | 605 | if (external_object->type == ACPI_TYPE_PACKAGE) { |
606 | /* | 606 | status = |
607 | * Packages as external input to control methods are not supported, | 607 | acpi_ut_copy_epackage_to_ipackage(external_object, |
608 | */ | 608 | internal_object); |
609 | ACPI_ERROR((AE_INFO, | 609 | } else { |
610 | "Packages as parameters not implemented!")); | ||
611 | |||
612 | return_ACPI_STATUS(AE_NOT_IMPLEMENTED); | ||
613 | } | ||
614 | |||
615 | else { | ||
616 | /* | 610 | /* |
617 | * Build a simple object (no nested objects) | 611 | * Build a simple object (no nested objects) |
618 | */ | 612 | */ |
@@ -803,33 +797,19 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type, | |||
803 | * Create and build the package object | 797 | * Create and build the package object |
804 | */ | 798 | */ |
805 | target_object = | 799 | target_object = |
806 | acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); | 800 | acpi_ut_create_package_object(source_object->package.count); |
807 | if (!target_object) { | 801 | if (!target_object) { |
808 | return (AE_NO_MEMORY); | 802 | return (AE_NO_MEMORY); |
809 | } | 803 | } |
810 | 804 | ||
811 | target_object->package.count = source_object->package.count; | ||
812 | target_object->common.flags = source_object->common.flags; | 805 | target_object->common.flags = source_object->common.flags; |
813 | 806 | ||
814 | /* | 807 | /* Pass the new package object back to the package walk routine */ |
815 | * Create the object array | ||
816 | */ | ||
817 | target_object->package.elements = | ||
818 | ACPI_ALLOCATE_ZEROED(((acpi_size) source_object->package. | ||
819 | count + 1) * sizeof(void *)); | ||
820 | if (!target_object->package.elements) { | ||
821 | status = AE_NO_MEMORY; | ||
822 | goto error_exit; | ||
823 | } | ||
824 | 808 | ||
825 | /* | ||
826 | * Pass the new package object back to the package walk routine | ||
827 | */ | ||
828 | state->pkg.this_target_obj = target_object; | 809 | state->pkg.this_target_obj = target_object; |
829 | 810 | ||
830 | /* | 811 | /* Store the object pointer in the parent package object */ |
831 | * Store the object pointer in the parent package object | 812 | |
832 | */ | ||
833 | *this_target_ptr = target_object; | 813 | *this_target_ptr = target_object; |
834 | break; | 814 | break; |
835 | 815 | ||
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c index 4696124759e1..db0b9bac7945 100644 --- a/drivers/acpi/utilities/utobject.c +++ b/drivers/acpi/utilities/utobject.c | |||
@@ -146,6 +146,48 @@ union acpi_operand_object *acpi_ut_create_internal_object_dbg(char *module_name, | |||
146 | 146 | ||
147 | /******************************************************************************* | 147 | /******************************************************************************* |
148 | * | 148 | * |
149 | * FUNCTION: acpi_ut_create_package_object | ||
150 | * | ||
151 | * PARAMETERS: Count - Number of package elements | ||
152 | * | ||
153 | * RETURN: Pointer to a new Package object, null on failure | ||
154 | * | ||
155 | * DESCRIPTION: Create a fully initialized package object | ||
156 | * | ||
157 | ******************************************************************************/ | ||
158 | |||
159 | union acpi_operand_object *acpi_ut_create_package_object(u32 count) | ||
160 | { | ||
161 | union acpi_operand_object *package_desc; | ||
162 | union acpi_operand_object **package_elements; | ||
163 | |||
164 | ACPI_FUNCTION_TRACE_U32(ut_create_package_object, count); | ||
165 | |||
166 | /* Create a new Package object */ | ||
167 | |||
168 | package_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); | ||
169 | if (!package_desc) { | ||
170 | return_PTR(NULL); | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * Create the element array. Count+1 allows the array to be null | ||
175 | * terminated. | ||
176 | */ | ||
177 | package_elements = ACPI_ALLOCATE_ZEROED((acpi_size) | ||
178 | (count + 1) * sizeof(void *)); | ||
179 | if (!package_elements) { | ||
180 | ACPI_FREE(package_desc); | ||
181 | return_PTR(NULL); | ||
182 | } | ||
183 | |||
184 | package_desc->package.count = count; | ||
185 | package_desc->package.elements = package_elements; | ||
186 | return_PTR(package_desc); | ||
187 | } | ||
188 | |||
189 | /******************************************************************************* | ||
190 | * | ||
149 | * FUNCTION: acpi_ut_create_buffer_object | 191 | * FUNCTION: acpi_ut_create_buffer_object |
150 | * | 192 | * |
151 | * PARAMETERS: buffer_size - Size of buffer to be created | 193 | * PARAMETERS: buffer_size - Size of buffer to be created |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3ca9c610c110..af625147df62 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -3783,6 +3783,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
3783 | { "FUJITSU MHT2060BH", NULL, ATA_HORKAGE_NONCQ }, | 3783 | { "FUJITSU MHT2060BH", NULL, ATA_HORKAGE_NONCQ }, |
3784 | /* NCQ is broken */ | 3784 | /* NCQ is broken */ |
3785 | { "Maxtor 6L250S0", "BANC1G10", ATA_HORKAGE_NONCQ }, | 3785 | { "Maxtor 6L250S0", "BANC1G10", ATA_HORKAGE_NONCQ }, |
3786 | { "Maxtor 6B200M0", "BANC1B10", ATA_HORKAGE_NONCQ }, | ||
3786 | /* NCQ hard hangs device under heavier load, needs hard power cycle */ | 3787 | /* NCQ hard hangs device under heavier load, needs hard power cycle */ |
3787 | { "Maxtor 6B250S0", "BANC1B70", ATA_HORKAGE_NONCQ }, | 3788 | { "Maxtor 6B250S0", "BANC1B70", ATA_HORKAGE_NONCQ }, |
3788 | /* Blacklist entries taken from Silicon Image 3124/3132 | 3789 | /* Blacklist entries taken from Silicon Image 3124/3132 |
diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 2e18a63ead36..ea4fe3e48f33 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig | |||
@@ -68,6 +68,10 @@ config CFAG12864B | |||
68 | depends on X86 | 68 | depends on X86 |
69 | depends on FB | 69 | depends on FB |
70 | depends on KS0108 | 70 | depends on KS0108 |
71 | select FB_SYS_FILLRECT | ||
72 | select FB_SYS_COPYAREA | ||
73 | select FB_SYS_IMAGEBLIT | ||
74 | select FB_SYS_FOPS | ||
71 | default n | 75 | default n |
72 | ---help--- | 76 | ---help--- |
73 | If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series, | 77 | If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series, |
diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c index 66fafbb1d087..307c190699e0 100644 --- a/drivers/auxdisplay/cfag12864bfb.c +++ b/drivers/auxdisplay/cfag12864bfb.c | |||
@@ -73,9 +73,11 @@ static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma) | |||
73 | 73 | ||
74 | static struct fb_ops cfag12864bfb_ops = { | 74 | static struct fb_ops cfag12864bfb_ops = { |
75 | .owner = THIS_MODULE, | 75 | .owner = THIS_MODULE, |
76 | .fb_fillrect = cfb_fillrect, | 76 | .fb_read = fb_sys_read, |
77 | .fb_copyarea = cfb_copyarea, | 77 | .fb_write = fb_sys_write, |
78 | .fb_imageblit = cfb_imageblit, | 78 | .fb_fillrect = sys_fillrect, |
79 | .fb_copyarea = sys_copyarea, | ||
80 | .fb_imageblit = sys_imageblit, | ||
79 | .fb_mmap = cfag12864bfb_mmap, | 81 | .fb_mmap = cfag12864bfb_mmap, |
80 | }; | 82 | }; |
81 | 83 | ||
diff --git a/drivers/char/drm/Kconfig b/drivers/char/drm/Kconfig index ef833a1c27eb..0b7ffa5191c6 100644 --- a/drivers/char/drm/Kconfig +++ b/drivers/char/drm/Kconfig | |||
@@ -6,7 +6,7 @@ | |||
6 | # | 6 | # |
7 | config DRM | 7 | config DRM |
8 | tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)" | 8 | tristate "Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)" |
9 | depends on (AGP || AGP=n) && PCI | 9 | depends on (AGP || AGP=n) && PCI && !EMULATED_CMPXCHG |
10 | help | 10 | help |
11 | Kernel-level support for the Direct Rendering Infrastructure (DRI) | 11 | Kernel-level support for the Direct Rendering Infrastructure (DRI) |
12 | introduced in XFree86 4.0. If you say Y here, you need to select | 12 | introduced in XFree86 4.0. If you say Y here, you need to select |
diff --git a/drivers/char/drm/drm_drawable.c b/drivers/char/drm/drm_drawable.c index de37d5f74563..b33313be2547 100644 --- a/drivers/char/drm/drm_drawable.c +++ b/drivers/char/drm/drm_drawable.c | |||
@@ -172,38 +172,49 @@ int drm_rmdraw(DRM_IOCTL_ARGS) | |||
172 | 172 | ||
173 | bitfield_length = idx + 1; | 173 | bitfield_length = idx + 1; |
174 | 174 | ||
175 | if (idx != id / (8 * sizeof(*bitfield))) | 175 | bitfield = NULL; |
176 | bitfield = drm_alloc(bitfield_length * | ||
177 | sizeof(*bitfield), DRM_MEM_BUFS); | ||
178 | 176 | ||
179 | if (!bitfield && bitfield_length) { | 177 | if (bitfield_length) { |
180 | bitfield = dev->drw_bitfield; | 178 | if (bitfield_length != dev->drw_bitfield_length) |
181 | bitfield_length = dev->drw_bitfield_length; | 179 | bitfield = drm_alloc(bitfield_length * |
180 | sizeof(*bitfield), | ||
181 | DRM_MEM_BUFS); | ||
182 | |||
183 | if (!bitfield) { | ||
184 | bitfield = dev->drw_bitfield; | ||
185 | bitfield_length = dev->drw_bitfield_length; | ||
186 | } | ||
182 | } | 187 | } |
183 | } | 188 | } |
184 | 189 | ||
185 | if (bitfield != dev->drw_bitfield) { | 190 | if (bitfield != dev->drw_bitfield) { |
186 | info_length = 8 * sizeof(*bitfield) * bitfield_length; | 191 | info_length = 8 * sizeof(*bitfield) * bitfield_length; |
187 | 192 | ||
188 | info = drm_alloc(info_length * sizeof(*info), DRM_MEM_BUFS); | 193 | if (info_length) { |
194 | info = drm_alloc(info_length * sizeof(*info), | ||
195 | DRM_MEM_BUFS); | ||
189 | 196 | ||
190 | if (!info && info_length) { | 197 | if (!info) { |
191 | info = dev->drw_info; | 198 | info = dev->drw_info; |
192 | info_length = dev->drw_info_length; | 199 | info_length = dev->drw_info_length; |
193 | } | 200 | } |
201 | } else | ||
202 | info = NULL; | ||
194 | 203 | ||
195 | spin_lock_irqsave(&dev->drw_lock, irqflags); | 204 | spin_lock_irqsave(&dev->drw_lock, irqflags); |
196 | 205 | ||
197 | memcpy(bitfield, dev->drw_bitfield, bitfield_length * | 206 | if (bitfield) |
198 | sizeof(*bitfield)); | 207 | memcpy(bitfield, dev->drw_bitfield, bitfield_length * |
208 | sizeof(*bitfield)); | ||
199 | drm_free(dev->drw_bitfield, sizeof(*bitfield) * | 209 | drm_free(dev->drw_bitfield, sizeof(*bitfield) * |
200 | dev->drw_bitfield_length, DRM_MEM_BUFS); | 210 | dev->drw_bitfield_length, DRM_MEM_BUFS); |
201 | dev->drw_bitfield = bitfield; | 211 | dev->drw_bitfield = bitfield; |
202 | dev->drw_bitfield_length = bitfield_length; | 212 | dev->drw_bitfield_length = bitfield_length; |
203 | 213 | ||
204 | if (info != dev->drw_info) { | 214 | if (info != dev->drw_info) { |
205 | memcpy(info, dev->drw_info, info_length * | 215 | if (info) |
206 | sizeof(*info)); | 216 | memcpy(info, dev->drw_info, info_length * |
217 | sizeof(*info)); | ||
207 | drm_free(dev->drw_info, sizeof(*info) * | 218 | drm_free(dev->drw_info, sizeof(*info) * |
208 | dev->drw_info_length, DRM_MEM_BUFS); | 219 | dev->drw_info_length, DRM_MEM_BUFS); |
209 | dev->drw_info = info; | 220 | dev->drw_info = info; |
diff --git a/drivers/char/drm/drm_pciids.h b/drivers/char/drm/drm_pciids.h index 31cdde83713b..177ccc07f968 100644 --- a/drivers/char/drm/drm_pciids.h +++ b/drivers/char/drm/drm_pciids.h | |||
@@ -102,13 +102,20 @@ | |||
102 | {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 102 | {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
103 | {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ | 103 | {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ |
104 | {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ | 104 | {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ |
105 | {0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
105 | {0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | 106 | {0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ |
107 | {0x1002, 0x5974, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
108 | {0x1002, 0x5975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
106 | {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 109 | {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
107 | {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 110 | {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
108 | {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 111 | {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
109 | {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 112 | {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
110 | {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 113 | {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
111 | {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ | 114 | {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ |
115 | {0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
116 | {0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
117 | {0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
118 | {0x1002, 0x5a62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
112 | {0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ | 119 | {0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
113 | {0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ | 120 | {0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
114 | {0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ | 121 | {0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c index 78c1ae28f17c..b92062a239f1 100644 --- a/drivers/char/drm/i915_irq.c +++ b/drivers/char/drm/i915_irq.c | |||
@@ -582,7 +582,7 @@ void i915_driver_irq_postinstall(drm_device_t * dev) | |||
582 | { | 582 | { |
583 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 583 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
584 | 584 | ||
585 | dev_priv->swaps_lock = SPIN_LOCK_UNLOCKED; | 585 | spin_lock_init(&dev_priv->swaps_lock); |
586 | INIT_LIST_HEAD(&dev_priv->vbl_swaps.head); | 586 | INIT_LIST_HEAD(&dev_priv->vbl_swaps.head); |
587 | dev_priv->swaps_pending = 0; | 587 | dev_priv->swaps_pending = 0; |
588 | 588 | ||
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index b3d4ccc33a47..154f42203b05 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
@@ -1191,6 +1191,7 @@ static int job_control(struct tty_struct *tty, struct file *file) | |||
1191 | is_current_pgrp_orphaned()) | 1191 | is_current_pgrp_orphaned()) |
1192 | return -EIO; | 1192 | return -EIO; |
1193 | kill_pgrp(task_pgrp(current), SIGTTIN, 1); | 1193 | kill_pgrp(task_pgrp(current), SIGTTIN, 1); |
1194 | set_thread_flag(TIF_SIGPENDING); | ||
1194 | return -ERESTARTSYS; | 1195 | return -ERESTARTSYS; |
1195 | } | 1196 | } |
1196 | } | 1197 | } |
diff --git a/drivers/char/random.c b/drivers/char/random.c index 46c1b97748b6..0474cac4a84e 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -760,7 +760,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min, | |||
760 | 760 | ||
761 | static void extract_buf(struct entropy_store *r, __u8 *out) | 761 | static void extract_buf(struct entropy_store *r, __u8 *out) |
762 | { | 762 | { |
763 | int i, x; | 763 | int i; |
764 | __u32 data[16], buf[5 + SHA_WORKSPACE_WORDS]; | 764 | __u32 data[16], buf[5 + SHA_WORKSPACE_WORDS]; |
765 | 765 | ||
766 | sha_init(buf); | 766 | sha_init(buf); |
@@ -772,9 +772,11 @@ static void extract_buf(struct entropy_store *r, __u8 *out) | |||
772 | * attempts to find previous ouputs), unless the hash | 772 | * attempts to find previous ouputs), unless the hash |
773 | * function can be inverted. | 773 | * function can be inverted. |
774 | */ | 774 | */ |
775 | for (i = 0, x = 0; i < r->poolinfo->poolwords; i += 16, x+=2) { | 775 | for (i = 0; i < r->poolinfo->poolwords; i += 16) { |
776 | sha_transform(buf, (__u8 *)r->pool+i, buf + 5); | 776 | /* hash blocks of 16 words = 512 bits */ |
777 | add_entropy_words(r, &buf[x % 5], 1); | 777 | sha_transform(buf, (__u8 *)(r->pool + i), buf + 5); |
778 | /* feed back portion of the resulting hash */ | ||
779 | add_entropy_words(r, &buf[i % 5], 1); | ||
778 | } | 780 | } |
779 | 781 | ||
780 | /* | 782 | /* |
@@ -782,7 +784,7 @@ static void extract_buf(struct entropy_store *r, __u8 *out) | |||
782 | * portion of the pool while mixing, and hash one | 784 | * portion of the pool while mixing, and hash one |
783 | * final time. | 785 | * final time. |
784 | */ | 786 | */ |
785 | __add_entropy_words(r, &buf[x % 5], 1, data); | 787 | __add_entropy_words(r, &buf[i % 5], 1, data); |
786 | sha_transform(buf, (__u8 *)data, buf + 5); | 788 | sha_transform(buf, (__u8 *)data, buf + 5); |
787 | 789 | ||
788 | /* | 790 | /* |
@@ -1018,37 +1020,44 @@ random_poll(struct file *file, poll_table * wait) | |||
1018 | return mask; | 1020 | return mask; |
1019 | } | 1021 | } |
1020 | 1022 | ||
1021 | static ssize_t | 1023 | static int |
1022 | random_write(struct file * file, const char __user * buffer, | 1024 | write_pool(struct entropy_store *r, const char __user *buffer, size_t count) |
1023 | size_t count, loff_t *ppos) | ||
1024 | { | 1025 | { |
1025 | int ret = 0; | ||
1026 | size_t bytes; | 1026 | size_t bytes; |
1027 | __u32 buf[16]; | 1027 | __u32 buf[16]; |
1028 | const char __user *p = buffer; | 1028 | const char __user *p = buffer; |
1029 | size_t c = count; | ||
1030 | 1029 | ||
1031 | while (c > 0) { | 1030 | while (count > 0) { |
1032 | bytes = min(c, sizeof(buf)); | 1031 | bytes = min(count, sizeof(buf)); |
1032 | if (copy_from_user(&buf, p, bytes)) | ||
1033 | return -EFAULT; | ||
1033 | 1034 | ||
1034 | bytes -= copy_from_user(&buf, p, bytes); | 1035 | count -= bytes; |
1035 | if (!bytes) { | ||
1036 | ret = -EFAULT; | ||
1037 | break; | ||
1038 | } | ||
1039 | c -= bytes; | ||
1040 | p += bytes; | 1036 | p += bytes; |
1041 | 1037 | ||
1042 | add_entropy_words(&input_pool, buf, (bytes + 3) / 4); | 1038 | add_entropy_words(r, buf, (bytes + 3) / 4); |
1043 | } | ||
1044 | if (p == buffer) { | ||
1045 | return (ssize_t)ret; | ||
1046 | } else { | ||
1047 | struct inode *inode = file->f_path.dentry->d_inode; | ||
1048 | inode->i_mtime = current_fs_time(inode->i_sb); | ||
1049 | mark_inode_dirty(inode); | ||
1050 | return (ssize_t)(p - buffer); | ||
1051 | } | 1039 | } |
1040 | |||
1041 | return 0; | ||
1042 | } | ||
1043 | |||
1044 | static ssize_t | ||
1045 | random_write(struct file * file, const char __user * buffer, | ||
1046 | size_t count, loff_t *ppos) | ||
1047 | { | ||
1048 | size_t ret; | ||
1049 | struct inode *inode = file->f_path.dentry->d_inode; | ||
1050 | |||
1051 | ret = write_pool(&blocking_pool, buffer, count); | ||
1052 | if (ret) | ||
1053 | return ret; | ||
1054 | ret = write_pool(&nonblocking_pool, buffer, count); | ||
1055 | if (ret) | ||
1056 | return ret; | ||
1057 | |||
1058 | inode->i_mtime = current_fs_time(inode->i_sb); | ||
1059 | mark_inode_dirty(inode); | ||
1060 | return (ssize_t)count; | ||
1052 | } | 1061 | } |
1053 | 1062 | ||
1054 | static int | 1063 | static int |
@@ -1087,8 +1096,8 @@ random_ioctl(struct inode * inode, struct file * file, | |||
1087 | return -EINVAL; | 1096 | return -EINVAL; |
1088 | if (get_user(size, p++)) | 1097 | if (get_user(size, p++)) |
1089 | return -EFAULT; | 1098 | return -EFAULT; |
1090 | retval = random_write(file, (const char __user *) p, | 1099 | retval = write_pool(&input_pool, (const char __user *)p, |
1091 | size, &file->f_pos); | 1100 | size); |
1092 | if (retval < 0) | 1101 | if (retval < 0) |
1093 | return retval; | 1102 | return retval; |
1094 | credit_entropy_store(&input_pool, ent_count); | 1103 | credit_entropy_store(&input_pool, ent_count); |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 75d2a46e106f..3752edc30c36 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1148,7 +1148,8 @@ int tty_check_change(struct tty_struct * tty) | |||
1148 | return 0; | 1148 | return 0; |
1149 | if (is_current_pgrp_orphaned()) | 1149 | if (is_current_pgrp_orphaned()) |
1150 | return -EIO; | 1150 | return -EIO; |
1151 | (void) kill_pgrp(task_pgrp(current), SIGTTOU, 1); | 1151 | kill_pgrp(task_pgrp(current), SIGTTOU, 1); |
1152 | set_thread_flag(TIF_SIGPENDING); | ||
1152 | return -ERESTARTSYS; | 1153 | return -ERESTARTSYS; |
1153 | } | 1154 | } |
1154 | 1155 | ||
diff --git a/drivers/char/watchdog/ixp2000_wdt.c b/drivers/char/watchdog/ixp2000_wdt.c index fd955dbd588c..dc7548dcaf35 100644 --- a/drivers/char/watchdog/ixp2000_wdt.c +++ b/drivers/char/watchdog/ixp2000_wdt.c | |||
@@ -205,7 +205,7 @@ static void __exit ixp2000_wdt_exit(void) | |||
205 | module_init(ixp2000_wdt_init); | 205 | module_init(ixp2000_wdt_init); |
206 | module_exit(ixp2000_wdt_exit); | 206 | module_exit(ixp2000_wdt_exit); |
207 | 207 | ||
208 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net">); | 208 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>"); |
209 | MODULE_DESCRIPTION("IXP2000 Network Processor Watchdog"); | 209 | MODULE_DESCRIPTION("IXP2000 Network Processor Watchdog"); |
210 | 210 | ||
211 | module_param(heartbeat, int, 0); | 211 | module_param(heartbeat, int, 0); |
diff --git a/drivers/firewire/Kconfig b/drivers/firewire/Kconfig index 5932c72f9e42..396dade731f9 100644 --- a/drivers/firewire/Kconfig +++ b/drivers/firewire/Kconfig | |||
@@ -18,7 +18,7 @@ config FIREWIRE | |||
18 | your IEEE 1394 adapter. | 18 | your IEEE 1394 adapter. |
19 | 19 | ||
20 | To compile this driver as a module, say M here: the module will be | 20 | To compile this driver as a module, say M here: the module will be |
21 | called fw-core. | 21 | called firewire-core. |
22 | 22 | ||
23 | This is the "JUJU" FireWire stack, an alternative implementation | 23 | This is the "JUJU" FireWire stack, an alternative implementation |
24 | designed for robustness and simplicity. You can build either this | 24 | designed for robustness and simplicity. You can build either this |
@@ -34,11 +34,11 @@ config FIREWIRE_OHCI | |||
34 | is the only chipset in use, so say Y here. | 34 | is the only chipset in use, so say Y here. |
35 | 35 | ||
36 | To compile this driver as a module, say M here: The module will be | 36 | To compile this driver as a module, say M here: The module will be |
37 | called fw-ohci. | 37 | called firewire-ohci. |
38 | 38 | ||
39 | If you also build ohci1394 of the classic IEEE 1394 driver stack, | 39 | If you also build ohci1394 of the classic IEEE 1394 driver stack, |
40 | blacklist either ohci1394 or fw-ohci to let hotplug load the desired | 40 | blacklist either ohci1394 or firewire-ohci to let hotplug load the |
41 | driver. | 41 | desired driver. |
42 | 42 | ||
43 | config FIREWIRE_SBP2 | 43 | config FIREWIRE_SBP2 |
44 | tristate "Support for storage devices (SBP-2 protocol driver)" | 44 | tristate "Support for storage devices (SBP-2 protocol driver)" |
@@ -50,12 +50,12 @@ config FIREWIRE_SBP2 | |||
50 | like scanners. | 50 | like scanners. |
51 | 51 | ||
52 | To compile this driver as a module, say M here: The module will be | 52 | To compile this driver as a module, say M here: The module will be |
53 | called fw-sbp2. | 53 | called firewire-sbp2. |
54 | 54 | ||
55 | You should also enable support for disks, CD-ROMs, etc. in the SCSI | 55 | You should also enable support for disks, CD-ROMs, etc. in the SCSI |
56 | configuration section. | 56 | configuration section. |
57 | 57 | ||
58 | If you also build sbp2 of the classic IEEE 1394 driver stack, | 58 | If you also build sbp2 of the classic IEEE 1394 driver stack, |
59 | blacklist either sbp2 or fw-sbp2 to let hotplug load the desired | 59 | blacklist either sbp2 or firewire-sbp2 to let hotplug load the |
60 | driver. | 60 | desired driver. |
61 | 61 | ||
diff --git a/drivers/firewire/Makefile b/drivers/firewire/Makefile index fc7d59d4bce0..a7c31e9039c1 100644 --- a/drivers/firewire/Makefile +++ b/drivers/firewire/Makefile | |||
@@ -2,9 +2,11 @@ | |||
2 | # Makefile for the Linux IEEE 1394 implementation | 2 | # Makefile for the Linux IEEE 1394 implementation |
3 | # | 3 | # |
4 | 4 | ||
5 | fw-core-y += fw-card.o fw-topology.o fw-transaction.o fw-iso.o \ | 5 | firewire-core-y += fw-card.o fw-topology.o fw-transaction.o fw-iso.o \ |
6 | fw-device.o fw-cdev.o | 6 | fw-device.o fw-cdev.o |
7 | firewire-ohci-y += fw-ohci.o | ||
8 | firewire-sbp2-y += fw-sbp2.o | ||
7 | 9 | ||
8 | obj-$(CONFIG_FIREWIRE) += fw-core.o | 10 | obj-$(CONFIG_FIREWIRE) += firewire-core.o |
9 | obj-$(CONFIG_FIREWIRE_OHCI) += fw-ohci.o | 11 | obj-$(CONFIG_FIREWIRE_OHCI) += firewire-ohci.o |
10 | obj-$(CONFIG_FIREWIRE_SBP2) += fw-sbp2.o | 12 | obj-$(CONFIG_FIREWIRE_SBP2) += firewire-sbp2.o |
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c index 636151a64add..9eb1edacd825 100644 --- a/drivers/firewire/fw-card.c +++ b/drivers/firewire/fw-card.c | |||
@@ -407,11 +407,6 @@ fw_card_add(struct fw_card *card, | |||
407 | card->link_speed = link_speed; | 407 | card->link_speed = link_speed; |
408 | card->guid = guid; | 408 | card->guid = guid; |
409 | 409 | ||
410 | /* Activate link_on bit and contender bit in our self ID packets.*/ | ||
411 | if (card->driver->update_phy_reg(card, 4, 0, | ||
412 | PHY_LINK_ACTIVE | PHY_CONTENDER) < 0) | ||
413 | return -EIO; | ||
414 | |||
415 | /* | 410 | /* |
416 | * The subsystem grabs a reference when the card is added and | 411 | * The subsystem grabs a reference when the card is added and |
417 | * drops it when the driver calls fw_core_remove_card. | 412 | * drops it when the driver calls fw_core_remove_card. |
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c index 0fa5bd54c6a1..5d402d63799f 100644 --- a/drivers/firewire/fw-cdev.c +++ b/drivers/firewire/fw-cdev.c | |||
@@ -365,7 +365,7 @@ complete_transaction(struct fw_card *card, int rcode, | |||
365 | response->response.data, response->response.length); | 365 | response->response.data, response->response.length); |
366 | } | 366 | } |
367 | 367 | ||
368 | static ssize_t ioctl_send_request(struct client *client, void *buffer) | 368 | static int ioctl_send_request(struct client *client, void *buffer) |
369 | { | 369 | { |
370 | struct fw_device *device = client->device; | 370 | struct fw_device *device = client->device; |
371 | struct fw_cdev_send_request *request = buffer; | 371 | struct fw_cdev_send_request *request = buffer; |
@@ -677,12 +677,21 @@ static int ioctl_create_iso_context(struct client *client, void *buffer) | |||
677 | return 0; | 677 | return 0; |
678 | } | 678 | } |
679 | 679 | ||
680 | /* Macros for decoding the iso packet control header. */ | ||
681 | #define GET_PAYLOAD_LENGTH(v) ((v) & 0xffff) | ||
682 | #define GET_INTERRUPT(v) (((v) >> 16) & 0x01) | ||
683 | #define GET_SKIP(v) (((v) >> 17) & 0x01) | ||
684 | #define GET_TAG(v) (((v) >> 18) & 0x02) | ||
685 | #define GET_SY(v) (((v) >> 20) & 0x04) | ||
686 | #define GET_HEADER_LENGTH(v) (((v) >> 24) & 0xff) | ||
687 | |||
680 | static int ioctl_queue_iso(struct client *client, void *buffer) | 688 | static int ioctl_queue_iso(struct client *client, void *buffer) |
681 | { | 689 | { |
682 | struct fw_cdev_queue_iso *request = buffer; | 690 | struct fw_cdev_queue_iso *request = buffer; |
683 | struct fw_cdev_iso_packet __user *p, *end, *next; | 691 | struct fw_cdev_iso_packet __user *p, *end, *next; |
684 | struct fw_iso_context *ctx = client->iso_context; | 692 | struct fw_iso_context *ctx = client->iso_context; |
685 | unsigned long payload, buffer_end, header_length; | 693 | unsigned long payload, buffer_end, header_length; |
694 | u32 control; | ||
686 | int count; | 695 | int count; |
687 | struct { | 696 | struct { |
688 | struct fw_iso_packet packet; | 697 | struct fw_iso_packet packet; |
@@ -717,8 +726,14 @@ static int ioctl_queue_iso(struct client *client, void *buffer) | |||
717 | end = (void __user *)p + request->size; | 726 | end = (void __user *)p + request->size; |
718 | count = 0; | 727 | count = 0; |
719 | while (p < end) { | 728 | while (p < end) { |
720 | if (__copy_from_user(&u.packet, p, sizeof(*p))) | 729 | if (get_user(control, &p->control)) |
721 | return -EFAULT; | 730 | return -EFAULT; |
731 | u.packet.payload_length = GET_PAYLOAD_LENGTH(control); | ||
732 | u.packet.interrupt = GET_INTERRUPT(control); | ||
733 | u.packet.skip = GET_SKIP(control); | ||
734 | u.packet.tag = GET_TAG(control); | ||
735 | u.packet.sy = GET_SY(control); | ||
736 | u.packet.header_length = GET_HEADER_LENGTH(control); | ||
722 | 737 | ||
723 | if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) { | 738 | if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) { |
724 | header_length = u.packet.header_length; | 739 | header_length = u.packet.header_length; |
diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h index 0ba9d64ccf4c..af1723eae4ba 100644 --- a/drivers/firewire/fw-device.h +++ b/drivers/firewire/fw-device.h | |||
@@ -99,6 +99,7 @@ fw_unit(struct device *dev) | |||
99 | #define CSR_DEPENDENT_INFO 0x14 | 99 | #define CSR_DEPENDENT_INFO 0x14 |
100 | #define CSR_MODEL 0x17 | 100 | #define CSR_MODEL 0x17 |
101 | #define CSR_INSTANCE 0x18 | 101 | #define CSR_INSTANCE 0x18 |
102 | #define CSR_DIRECTORY_ID 0x20 | ||
102 | 103 | ||
103 | #define SBP2_COMMAND_SET_SPECIFIER 0x38 | 104 | #define SBP2_COMMAND_SET_SPECIFIER 0x38 |
104 | #define SBP2_COMMAND_SET 0x39 | 105 | #define SBP2_COMMAND_SET 0x39 |
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index c17342d3e6fd..0d08bf9b78c2 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
@@ -268,7 +268,7 @@ static int ar_context_add_page(struct ar_context *ctx) | |||
268 | 268 | ||
269 | dma_sync_single_for_device(dev, ab_bus, PAGE_SIZE, DMA_BIDIRECTIONAL); | 269 | dma_sync_single_for_device(dev, ab_bus, PAGE_SIZE, DMA_BIDIRECTIONAL); |
270 | 270 | ||
271 | ctx->last_buffer->descriptor.branch_address = ab_bus | 1; | 271 | ctx->last_buffer->descriptor.branch_address = cpu_to_le32(ab_bus | 1); |
272 | ctx->last_buffer->next = ab; | 272 | ctx->last_buffer->next = ab; |
273 | ctx->last_buffer = ab; | 273 | ctx->last_buffer = ab; |
274 | 274 | ||
@@ -417,11 +417,21 @@ ar_context_init(struct ar_context *ctx, struct fw_ohci *ohci, u32 regs) | |||
417 | ctx->current_buffer = ab.next; | 417 | ctx->current_buffer = ab.next; |
418 | ctx->pointer = ctx->current_buffer->data; | 418 | ctx->pointer = ctx->current_buffer->data; |
419 | 419 | ||
420 | reg_write(ctx->ohci, COMMAND_PTR(ctx->regs), ab.descriptor.branch_address); | 420 | return 0; |
421 | } | ||
422 | |||
423 | static void ar_context_run(struct ar_context *ctx) | ||
424 | { | ||
425 | struct ar_buffer *ab = ctx->current_buffer; | ||
426 | dma_addr_t ab_bus; | ||
427 | size_t offset; | ||
428 | |||
429 | offset = offsetof(struct ar_buffer, data); | ||
430 | ab_bus = ab->descriptor.data_address - offset; | ||
431 | |||
432 | reg_write(ctx->ohci, COMMAND_PTR(ctx->regs), ab_bus | 1); | ||
421 | reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN); | 433 | reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN); |
422 | flush_writes(ctx->ohci); | 434 | flush_writes(ctx->ohci); |
423 | |||
424 | return 0; | ||
425 | } | 435 | } |
426 | 436 | ||
427 | static void context_tasklet(unsigned long data) | 437 | static void context_tasklet(unsigned long data) |
@@ -1038,11 +1048,78 @@ static irqreturn_t irq_handler(int irq, void *data) | |||
1038 | return IRQ_HANDLED; | 1048 | return IRQ_HANDLED; |
1039 | } | 1049 | } |
1040 | 1050 | ||
1051 | static int software_reset(struct fw_ohci *ohci) | ||
1052 | { | ||
1053 | int i; | ||
1054 | |||
1055 | reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset); | ||
1056 | |||
1057 | for (i = 0; i < OHCI_LOOP_COUNT; i++) { | ||
1058 | if ((reg_read(ohci, OHCI1394_HCControlSet) & | ||
1059 | OHCI1394_HCControl_softReset) == 0) | ||
1060 | return 0; | ||
1061 | msleep(1); | ||
1062 | } | ||
1063 | |||
1064 | return -EBUSY; | ||
1065 | } | ||
1066 | |||
1041 | static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) | 1067 | static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) |
1042 | { | 1068 | { |
1043 | struct fw_ohci *ohci = fw_ohci(card); | 1069 | struct fw_ohci *ohci = fw_ohci(card); |
1044 | struct pci_dev *dev = to_pci_dev(card->device); | 1070 | struct pci_dev *dev = to_pci_dev(card->device); |
1045 | 1071 | ||
1072 | if (software_reset(ohci)) { | ||
1073 | fw_error("Failed to reset ohci card.\n"); | ||
1074 | return -EBUSY; | ||
1075 | } | ||
1076 | |||
1077 | /* | ||
1078 | * Now enable LPS, which we need in order to start accessing | ||
1079 | * most of the registers. In fact, on some cards (ALI M5251), | ||
1080 | * accessing registers in the SClk domain without LPS enabled | ||
1081 | * will lock up the machine. Wait 50msec to make sure we have | ||
1082 | * full link enabled. | ||
1083 | */ | ||
1084 | reg_write(ohci, OHCI1394_HCControlSet, | ||
1085 | OHCI1394_HCControl_LPS | | ||
1086 | OHCI1394_HCControl_postedWriteEnable); | ||
1087 | flush_writes(ohci); | ||
1088 | msleep(50); | ||
1089 | |||
1090 | reg_write(ohci, OHCI1394_HCControlClear, | ||
1091 | OHCI1394_HCControl_noByteSwapData); | ||
1092 | |||
1093 | reg_write(ohci, OHCI1394_LinkControlSet, | ||
1094 | OHCI1394_LinkControl_rcvSelfID | | ||
1095 | OHCI1394_LinkControl_cycleTimerEnable | | ||
1096 | OHCI1394_LinkControl_cycleMaster); | ||
1097 | |||
1098 | reg_write(ohci, OHCI1394_ATRetries, | ||
1099 | OHCI1394_MAX_AT_REQ_RETRIES | | ||
1100 | (OHCI1394_MAX_AT_RESP_RETRIES << 4) | | ||
1101 | (OHCI1394_MAX_PHYS_RESP_RETRIES << 8)); | ||
1102 | |||
1103 | ar_context_run(&ohci->ar_request_ctx); | ||
1104 | ar_context_run(&ohci->ar_response_ctx); | ||
1105 | |||
1106 | reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus); | ||
1107 | reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000); | ||
1108 | reg_write(ohci, OHCI1394_IntEventClear, ~0); | ||
1109 | reg_write(ohci, OHCI1394_IntMaskClear, ~0); | ||
1110 | reg_write(ohci, OHCI1394_IntMaskSet, | ||
1111 | OHCI1394_selfIDComplete | | ||
1112 | OHCI1394_RQPkt | OHCI1394_RSPkt | | ||
1113 | OHCI1394_reqTxComplete | OHCI1394_respTxComplete | | ||
1114 | OHCI1394_isochRx | OHCI1394_isochTx | | ||
1115 | OHCI1394_masterIntEnable | | ||
1116 | OHCI1394_cycle64Seconds); | ||
1117 | |||
1118 | /* Activate link_on bit and contender bit in our self ID packets.*/ | ||
1119 | if (ohci_update_phy_reg(card, 4, 0, | ||
1120 | PHY_LINK_ACTIVE | PHY_CONTENDER) < 0) | ||
1121 | return -EIO; | ||
1122 | |||
1046 | /* | 1123 | /* |
1047 | * When the link is not yet enabled, the atomic config rom | 1124 | * When the link is not yet enabled, the atomic config rom |
1048 | * update mechanism described below in ohci_set_config_rom() | 1125 | * update mechanism described below in ohci_set_config_rom() |
@@ -1700,22 +1777,6 @@ static const struct fw_card_driver ohci_driver = { | |||
1700 | .stop_iso = ohci_stop_iso, | 1777 | .stop_iso = ohci_stop_iso, |
1701 | }; | 1778 | }; |
1702 | 1779 | ||
1703 | static int software_reset(struct fw_ohci *ohci) | ||
1704 | { | ||
1705 | int i; | ||
1706 | |||
1707 | reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset); | ||
1708 | |||
1709 | for (i = 0; i < OHCI_LOOP_COUNT; i++) { | ||
1710 | if ((reg_read(ohci, OHCI1394_HCControlSet) & | ||
1711 | OHCI1394_HCControl_softReset) == 0) | ||
1712 | return 0; | ||
1713 | msleep(1); | ||
1714 | } | ||
1715 | |||
1716 | return -EBUSY; | ||
1717 | } | ||
1718 | |||
1719 | static int __devinit | 1780 | static int __devinit |
1720 | pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | 1781 | pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) |
1721 | { | 1782 | { |
@@ -1761,33 +1822,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1761 | goto fail_iomem; | 1822 | goto fail_iomem; |
1762 | } | 1823 | } |
1763 | 1824 | ||
1764 | if (software_reset(ohci)) { | ||
1765 | fw_error("Failed to reset ohci card.\n"); | ||
1766 | err = -EBUSY; | ||
1767 | goto fail_registers; | ||
1768 | } | ||
1769 | |||
1770 | /* | ||
1771 | * Now enable LPS, which we need in order to start accessing | ||
1772 | * most of the registers. In fact, on some cards (ALI M5251), | ||
1773 | * accessing registers in the SClk domain without LPS enabled | ||
1774 | * will lock up the machine. Wait 50msec to make sure we have | ||
1775 | * full link enabled. | ||
1776 | */ | ||
1777 | reg_write(ohci, OHCI1394_HCControlSet, | ||
1778 | OHCI1394_HCControl_LPS | | ||
1779 | OHCI1394_HCControl_postedWriteEnable); | ||
1780 | flush_writes(ohci); | ||
1781 | msleep(50); | ||
1782 | |||
1783 | reg_write(ohci, OHCI1394_HCControlClear, | ||
1784 | OHCI1394_HCControl_noByteSwapData); | ||
1785 | |||
1786 | reg_write(ohci, OHCI1394_LinkControlSet, | ||
1787 | OHCI1394_LinkControl_rcvSelfID | | ||
1788 | OHCI1394_LinkControl_cycleTimerEnable | | ||
1789 | OHCI1394_LinkControl_cycleMaster); | ||
1790 | |||
1791 | ar_context_init(&ohci->ar_request_ctx, ohci, | 1825 | ar_context_init(&ohci->ar_request_ctx, ohci, |
1792 | OHCI1394_AsReqRcvContextControlSet); | 1826 | OHCI1394_AsReqRcvContextControlSet); |
1793 | 1827 | ||
@@ -1800,11 +1834,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1800 | context_init(&ohci->at_response_ctx, ohci, AT_BUFFER_SIZE, | 1834 | context_init(&ohci->at_response_ctx, ohci, AT_BUFFER_SIZE, |
1801 | OHCI1394_AsRspTrContextControlSet, handle_at_packet); | 1835 | OHCI1394_AsRspTrContextControlSet, handle_at_packet); |
1802 | 1836 | ||
1803 | reg_write(ohci, OHCI1394_ATRetries, | ||
1804 | OHCI1394_MAX_AT_REQ_RETRIES | | ||
1805 | (OHCI1394_MAX_AT_RESP_RETRIES << 4) | | ||
1806 | (OHCI1394_MAX_PHYS_RESP_RETRIES << 8)); | ||
1807 | |||
1808 | reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0); | 1837 | reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0); |
1809 | ohci->it_context_mask = reg_read(ohci, OHCI1394_IsoRecvIntMaskSet); | 1838 | ohci->it_context_mask = reg_read(ohci, OHCI1394_IsoRecvIntMaskSet); |
1810 | reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, ~0); | 1839 | reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, ~0); |
@@ -1834,18 +1863,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1834 | goto fail_registers; | 1863 | goto fail_registers; |
1835 | } | 1864 | } |
1836 | 1865 | ||
1837 | reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus); | ||
1838 | reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000); | ||
1839 | reg_write(ohci, OHCI1394_IntEventClear, ~0); | ||
1840 | reg_write(ohci, OHCI1394_IntMaskClear, ~0); | ||
1841 | reg_write(ohci, OHCI1394_IntMaskSet, | ||
1842 | OHCI1394_selfIDComplete | | ||
1843 | OHCI1394_RQPkt | OHCI1394_RSPkt | | ||
1844 | OHCI1394_reqTxComplete | OHCI1394_respTxComplete | | ||
1845 | OHCI1394_isochRx | OHCI1394_isochTx | | ||
1846 | OHCI1394_masterIntEnable | | ||
1847 | OHCI1394_cycle64Seconds); | ||
1848 | |||
1849 | bus_options = reg_read(ohci, OHCI1394_BusOptions); | 1866 | bus_options = reg_read(ohci, OHCI1394_BusOptions); |
1850 | max_receive = (bus_options >> 12) & 0xf; | 1867 | max_receive = (bus_options >> 12) & 0xf; |
1851 | link_speed = bus_options & 0x7; | 1868 | link_speed = bus_options & 0x7; |
@@ -1907,6 +1924,45 @@ static void pci_remove(struct pci_dev *dev) | |||
1907 | fw_notify("Removed fw-ohci device.\n"); | 1924 | fw_notify("Removed fw-ohci device.\n"); |
1908 | } | 1925 | } |
1909 | 1926 | ||
1927 | #ifdef CONFIG_PM | ||
1928 | static int pci_suspend(struct pci_dev *pdev, pm_message_t state) | ||
1929 | { | ||
1930 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | ||
1931 | int err; | ||
1932 | |||
1933 | software_reset(ohci); | ||
1934 | free_irq(pdev->irq, ohci); | ||
1935 | err = pci_save_state(pdev); | ||
1936 | if (err) { | ||
1937 | fw_error("pci_save_state failed with %d", err); | ||
1938 | return err; | ||
1939 | } | ||
1940 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
1941 | if (err) { | ||
1942 | fw_error("pci_set_power_state failed with %d", err); | ||
1943 | return err; | ||
1944 | } | ||
1945 | |||
1946 | return 0; | ||
1947 | } | ||
1948 | |||
1949 | static int pci_resume(struct pci_dev *pdev) | ||
1950 | { | ||
1951 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | ||
1952 | int err; | ||
1953 | |||
1954 | pci_set_power_state(pdev, PCI_D0); | ||
1955 | pci_restore_state(pdev); | ||
1956 | err = pci_enable_device(pdev); | ||
1957 | if (err) { | ||
1958 | fw_error("pci_enable_device failed with %d", err); | ||
1959 | return err; | ||
1960 | } | ||
1961 | |||
1962 | return ohci_enable(&ohci->card, ohci->config_rom, CONFIG_ROM_SIZE); | ||
1963 | } | ||
1964 | #endif | ||
1965 | |||
1910 | static struct pci_device_id pci_table[] = { | 1966 | static struct pci_device_id pci_table[] = { |
1911 | { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_FIREWIRE_OHCI, ~0) }, | 1967 | { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_FIREWIRE_OHCI, ~0) }, |
1912 | { } | 1968 | { } |
@@ -1919,6 +1975,10 @@ static struct pci_driver fw_ohci_pci_driver = { | |||
1919 | .id_table = pci_table, | 1975 | .id_table = pci_table, |
1920 | .probe = pci_probe, | 1976 | .probe = pci_probe, |
1921 | .remove = pci_remove, | 1977 | .remove = pci_remove, |
1978 | #ifdef CONFIG_PM | ||
1979 | .resume = pci_resume, | ||
1980 | .suspend = pci_suspend, | ||
1981 | #endif | ||
1922 | }; | 1982 | }; |
1923 | 1983 | ||
1924 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | 1984 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 68300414e5f4..a98d3915e26f 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -1108,6 +1108,58 @@ static int sbp2_scsi_abort(struct scsi_cmnd *cmd) | |||
1108 | return SUCCESS; | 1108 | return SUCCESS; |
1109 | } | 1109 | } |
1110 | 1110 | ||
1111 | /* | ||
1112 | * Format of /sys/bus/scsi/devices/.../ieee1394_id: | ||
1113 | * u64 EUI-64 : u24 directory_ID : u16 LUN (all printed in hexadecimal) | ||
1114 | * | ||
1115 | * This is the concatenation of target port identifier and logical unit | ||
1116 | * identifier as per SAM-2...SAM-4 annex A. | ||
1117 | */ | ||
1118 | static ssize_t | ||
1119 | sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr, | ||
1120 | char *buf) | ||
1121 | { | ||
1122 | struct scsi_device *sdev = to_scsi_device(dev); | ||
1123 | struct sbp2_device *sd; | ||
1124 | struct fw_unit *unit; | ||
1125 | struct fw_device *device; | ||
1126 | u32 directory_id; | ||
1127 | struct fw_csr_iterator ci; | ||
1128 | int key, value, lun; | ||
1129 | |||
1130 | if (!sdev) | ||
1131 | return 0; | ||
1132 | sd = (struct sbp2_device *)sdev->host->hostdata; | ||
1133 | unit = sd->unit; | ||
1134 | device = fw_device(unit->device.parent); | ||
1135 | |||
1136 | /* implicit directory ID */ | ||
1137 | directory_id = ((unit->directory - device->config_rom) * 4 | ||
1138 | + CSR_CONFIG_ROM) & 0xffffff; | ||
1139 | |||
1140 | /* explicit directory ID, overrides implicit ID if present */ | ||
1141 | fw_csr_iterator_init(&ci, unit->directory); | ||
1142 | while (fw_csr_iterator_next(&ci, &key, &value)) | ||
1143 | if (key == CSR_DIRECTORY_ID) { | ||
1144 | directory_id = value; | ||
1145 | break; | ||
1146 | } | ||
1147 | |||
1148 | /* FIXME: Make this work for multi-lun devices. */ | ||
1149 | lun = 0; | ||
1150 | |||
1151 | return sprintf(buf, "%08x%08x:%06x:%04x\n", | ||
1152 | device->config_rom[3], device->config_rom[4], | ||
1153 | directory_id, lun); | ||
1154 | } | ||
1155 | |||
1156 | static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL); | ||
1157 | |||
1158 | static struct device_attribute *sbp2_scsi_sysfs_attrs[] = { | ||
1159 | &dev_attr_ieee1394_id, | ||
1160 | NULL | ||
1161 | }; | ||
1162 | |||
1111 | static struct scsi_host_template scsi_driver_template = { | 1163 | static struct scsi_host_template scsi_driver_template = { |
1112 | .module = THIS_MODULE, | 1164 | .module = THIS_MODULE, |
1113 | .name = "SBP-2 IEEE-1394", | 1165 | .name = "SBP-2 IEEE-1394", |
@@ -1121,6 +1173,7 @@ static struct scsi_host_template scsi_driver_template = { | |||
1121 | .use_clustering = ENABLE_CLUSTERING, | 1173 | .use_clustering = ENABLE_CLUSTERING, |
1122 | .cmd_per_lun = 1, | 1174 | .cmd_per_lun = 1, |
1123 | .can_queue = 1, | 1175 | .can_queue = 1, |
1176 | .sdev_attrs = sbp2_scsi_sysfs_attrs, | ||
1124 | }; | 1177 | }; |
1125 | 1178 | ||
1126 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | 1179 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 4d1cb5b855d1..13eea47dceb3 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -620,7 +620,7 @@ config SENSORS_HDAPS | |||
620 | 620 | ||
621 | config SENSORS_APPLESMC | 621 | config SENSORS_APPLESMC |
622 | tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)" | 622 | tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)" |
623 | depends on HWMON && INPUT && X86 | 623 | depends on INPUT && X86 |
624 | select NEW_LEDS | 624 | select NEW_LEDS |
625 | select LEDS_CLASS | 625 | select LEDS_CLASS |
626 | default n | 626 | default n |
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 366f4a1a2cb8..fd1281f42209 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -1206,11 +1206,13 @@ static int __init applesmc_init(void) | |||
1206 | } | 1206 | } |
1207 | 1207 | ||
1208 | ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr); | 1208 | ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_name.attr); |
1209 | if (ret) | ||
1210 | goto out_device; | ||
1209 | 1211 | ||
1210 | /* Create key enumeration sysfs files */ | 1212 | /* Create key enumeration sysfs files */ |
1211 | ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group); | 1213 | ret = sysfs_create_group(&pdev->dev.kobj, &key_enumeration_group); |
1212 | if (ret) | 1214 | if (ret) |
1213 | goto out_device; | 1215 | goto out_name; |
1214 | 1216 | ||
1215 | /* create fan files */ | 1217 | /* create fan files */ |
1216 | count = applesmc_get_fan_count(); | 1218 | count = applesmc_get_fan_count(); |
@@ -1310,6 +1312,8 @@ out_fan_1: | |||
1310 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); | 1312 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); |
1311 | out_key_enumeration: | 1313 | out_key_enumeration: |
1312 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); | 1314 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); |
1315 | out_name: | ||
1316 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); | ||
1313 | out_device: | 1317 | out_device: |
1314 | platform_device_unregister(pdev); | 1318 | platform_device_unregister(pdev); |
1315 | out_driver: | 1319 | out_driver: |
@@ -1335,6 +1339,7 @@ static void __exit applesmc_exit(void) | |||
1335 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]); | 1339 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[0]); |
1336 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); | 1340 | sysfs_remove_group(&pdev->dev.kobj, &fan_attribute_groups[1]); |
1337 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); | 1341 | sysfs_remove_group(&pdev->dev.kobj, &key_enumeration_group); |
1342 | sysfs_remove_file(&pdev->dev.kobj, &dev_attr_name.attr); | ||
1338 | platform_device_unregister(pdev); | 1343 | platform_device_unregister(pdev); |
1339 | platform_driver_unregister(&applesmc_driver); | 1344 | platform_driver_unregister(&applesmc_driver); |
1340 | release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS); | 1345 | release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS); |
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 75e3911810a3..0328382df8fa 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
@@ -176,6 +176,22 @@ static int __devinit coretemp_probe(struct platform_device *pdev) | |||
176 | goto exit_free; | 176 | goto exit_free; |
177 | } | 177 | } |
178 | 178 | ||
179 | /* Check if we have problem with errata AE18 of Core processors: | ||
180 | Readings might stop update when processor visited too deep sleep, | ||
181 | fixed for stepping D0 (6EC). | ||
182 | */ | ||
183 | |||
184 | if ((c->x86_model == 0xe) && (c->x86_mask < 0xc)) { | ||
185 | /* check for microcode update */ | ||
186 | rdmsr_on_cpu(data->id, MSR_IA32_UCODE_REV, &eax, &edx); | ||
187 | if (edx < 0x39) { | ||
188 | dev_err(&pdev->dev, | ||
189 | "Errata AE18 not fixed, update BIOS or " | ||
190 | "microcode of the CPU!\n"); | ||
191 | goto exit_free; | ||
192 | } | ||
193 | } | ||
194 | |||
179 | /* Some processors have Tjmax 85 following magic should detect it | 195 | /* Some processors have Tjmax 85 following magic should detect it |
180 | Intel won't disclose the information without signed NDA, but | 196 | Intel won't disclose the information without signed NDA, but |
181 | individuals cannot sign it. Catch(ed) 22. | 197 | individuals cannot sign it. Catch(ed) 22. |
@@ -193,6 +209,19 @@ static int __devinit coretemp_probe(struct platform_device *pdev) | |||
193 | } | 209 | } |
194 | } | 210 | } |
195 | 211 | ||
212 | /* Intel says that above should not work for desktop Core2 processors, | ||
213 | but it seems to work. There is no other way how get the absolute | ||
214 | readings. Warn the user about this. First check if are desktop, | ||
215 | bit 50 of MSR_IA32_PLATFORM_ID should be 0. | ||
216 | */ | ||
217 | |||
218 | rdmsr_safe_on_cpu(data->id, MSR_IA32_PLATFORM_ID, &eax, &edx); | ||
219 | |||
220 | if ((c->x86_model == 0xf) && (!(edx & 0x00040000))) { | ||
221 | dev_warn(&pdev->dev, "Using undocumented features, absolute " | ||
222 | "temperature might be wrong!\n"); | ||
223 | } | ||
224 | |||
196 | platform_set_drvdata(pdev, data); | 225 | platform_set_drvdata(pdev, data); |
197 | 226 | ||
198 | if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group))) | 227 | if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group))) |
@@ -330,9 +359,6 @@ static int __init coretemp_init(void) | |||
330 | int i, err = -ENODEV; | 359 | int i, err = -ENODEV; |
331 | struct pdev_entry *p, *n; | 360 | struct pdev_entry *p, *n; |
332 | 361 | ||
333 | printk(KERN_NOTICE DRVNAME ": This driver uses undocumented features " | ||
334 | "of Core CPU. Temperature might be wrong!\n"); | ||
335 | |||
336 | /* quick check if we run Intel */ | 362 | /* quick check if we run Intel */ |
337 | if (cpu_data[0].x86_vendor != X86_VENDOR_INTEL) | 363 | if (cpu_data[0].x86_vendor != X86_VENDOR_INTEL) |
338 | goto exit; | 364 | goto exit; |
diff --git a/drivers/hwmon/ds1621.c b/drivers/hwmon/ds1621.c index c849c0c6ee9c..d5ac422d73b2 100644 --- a/drivers/hwmon/ds1621.c +++ b/drivers/hwmon/ds1621.c | |||
@@ -53,8 +53,8 @@ MODULE_PARM_DESC(polarity, "Output's polarity: 0 = active high, 1 = active low") | |||
53 | 53 | ||
54 | /* The DS1621 registers */ | 54 | /* The DS1621 registers */ |
55 | #define DS1621_REG_TEMP 0xAA /* word, RO */ | 55 | #define DS1621_REG_TEMP 0xAA /* word, RO */ |
56 | #define DS1621_REG_TEMP_MIN 0xA1 /* word, RW */ | 56 | #define DS1621_REG_TEMP_MIN 0xA2 /* word, RW */ |
57 | #define DS1621_REG_TEMP_MAX 0xA2 /* word, RW */ | 57 | #define DS1621_REG_TEMP_MAX 0xA1 /* word, RW */ |
58 | #define DS1621_REG_CONF 0xAC /* byte, RW */ | 58 | #define DS1621_REG_CONF 0xAC /* byte, RW */ |
59 | #define DS1621_COM_START 0xEE /* no data */ | 59 | #define DS1621_COM_START 0xEE /* no data */ |
60 | #define DS1621_COM_STOP 0x22 /* no data */ | 60 | #define DS1621_COM_STOP 0x22 /* no data */ |
@@ -328,9 +328,9 @@ static struct ds1621_data *ds1621_update_client(struct device *dev) | |||
328 | 328 | ||
329 | /* reset alarms if necessary */ | 329 | /* reset alarms if necessary */ |
330 | new_conf = data->conf; | 330 | new_conf = data->conf; |
331 | if (data->temp < data->temp_min) | 331 | if (data->temp > data->temp_min) |
332 | new_conf &= ~DS1621_ALARM_TEMP_LOW; | 332 | new_conf &= ~DS1621_ALARM_TEMP_LOW; |
333 | if (data->temp > data->temp_max) | 333 | if (data->temp < data->temp_max) |
334 | new_conf &= ~DS1621_ALARM_TEMP_HIGH; | 334 | new_conf &= ~DS1621_ALARM_TEMP_HIGH; |
335 | if (data->conf != new_conf) | 335 | if (data->conf != new_conf) |
336 | ds1621_write_value(client, DS1621_REG_CONF, | 336 | ds1621_write_value(client, DS1621_REG_CONF, |
diff --git a/drivers/hwmon/hwmon-vid.c b/drivers/hwmon/hwmon-vid.c index 5aab23b93e24..f17e771e42f8 100644 --- a/drivers/hwmon/hwmon-vid.c +++ b/drivers/hwmon/hwmon-vid.c | |||
@@ -132,7 +132,9 @@ int vid_from_reg(int val, u8 vrm) | |||
132 | val &= 0x7f; | 132 | val &= 0x7f; |
133 | return(val > 0x77 ? 0 : (1500000 - (val * 12500) + 500) / 1000); | 133 | return(val > 0x77 ? 0 : (1500000 - (val * 12500) + 500) / 1000); |
134 | default: /* report 0 for unknown */ | 134 | default: /* report 0 for unknown */ |
135 | printk(KERN_INFO "hwmon-vid: requested unknown VRM version\n"); | 135 | if (vrm) |
136 | printk(KERN_WARNING "hwmon-vid: Requested unsupported " | ||
137 | "VRM version (%u)\n", (unsigned int)vrm); | ||
136 | return 0; | 138 | return 0; |
137 | } | 139 | } |
138 | } | 140 | } |
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index a5b774b07cbd..12cb40a975de 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c | |||
@@ -965,8 +965,10 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, | |||
965 | case W687THF_DEVID: | 965 | case W687THF_DEVID: |
966 | sio_data->type = w83687thf; | 966 | sio_data->type = w83687thf; |
967 | break; | 967 | break; |
968 | case 0xff: /* No device at all */ | ||
969 | goto exit; | ||
968 | default: | 970 | default: |
969 | pr_debug(DRVNAME ": Unsupported chip (DEVID=0x%x)\n", val); | 971 | pr_debug(DRVNAME ": Unsupported chip (DEVID=0x%02x)\n", val); |
970 | goto exit; | 972 | goto exit; |
971 | } | 973 | } |
972 | 974 | ||
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 8a0a99b93641..28e7b91a4553 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -837,20 +837,10 @@ static const struct i2c_algorithm i2c_pxa_algorithm = { | |||
837 | .functionality = i2c_pxa_functionality, | 837 | .functionality = i2c_pxa_functionality, |
838 | }; | 838 | }; |
839 | 839 | ||
840 | static struct pxa_i2c i2c_pxa = { | ||
841 | .lock = __SPIN_LOCK_UNLOCKED(i2c_pxa.lock), | ||
842 | .adap = { | ||
843 | .owner = THIS_MODULE, | ||
844 | .algo = &i2c_pxa_algorithm, | ||
845 | .name = "pxa2xx-i2c.0", | ||
846 | .retries = 5, | ||
847 | }, | ||
848 | }; | ||
849 | |||
850 | #define res_len(r) ((r)->end - (r)->start + 1) | 840 | #define res_len(r) ((r)->end - (r)->start + 1) |
851 | static int i2c_pxa_probe(struct platform_device *dev) | 841 | static int i2c_pxa_probe(struct platform_device *dev) |
852 | { | 842 | { |
853 | struct pxa_i2c *i2c = &i2c_pxa; | 843 | struct pxa_i2c *i2c; |
854 | struct resource *res; | 844 | struct resource *res; |
855 | struct i2c_pxa_platform_data *plat = dev->dev.platform_data; | 845 | struct i2c_pxa_platform_data *plat = dev->dev.platform_data; |
856 | int ret; | 846 | int ret; |
@@ -864,15 +854,20 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
864 | if (!request_mem_region(res->start, res_len(res), res->name)) | 854 | if (!request_mem_region(res->start, res_len(res), res->name)) |
865 | return -ENOMEM; | 855 | return -ENOMEM; |
866 | 856 | ||
867 | i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL); | 857 | i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL); |
868 | if (!i2c) { | 858 | if (!i2c) { |
869 | ret = -ENOMEM; | 859 | ret = -ENOMEM; |
870 | goto emalloc; | 860 | goto emalloc; |
871 | } | 861 | } |
872 | 862 | ||
873 | memcpy(i2c, &i2c_pxa, sizeof(struct pxa_i2c)); | 863 | i2c->adap.owner = THIS_MODULE; |
864 | i2c->adap.algo = &i2c_pxa_algorithm; | ||
865 | i2c->adap.retries = 5; | ||
866 | |||
867 | spin_lock_init(&i2c->lock); | ||
874 | init_waitqueue_head(&i2c->wait); | 868 | init_waitqueue_head(&i2c->wait); |
875 | i2c->adap.name[strlen(i2c->adap.name) - 1] = '0' + dev->id % 10; | 869 | |
870 | sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id); | ||
876 | 871 | ||
877 | i2c->reg_base = ioremap(res->start, res_len(res)); | 872 | i2c->reg_base = ioremap(res->start, res_len(res)); |
878 | if (!i2c->reg_base) { | 873 | if (!i2c->reg_base) { |
diff --git a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c index 2296d43a2414..5f026b5d7857 100644 --- a/drivers/ieee1394/eth1394.c +++ b/drivers/ieee1394/eth1394.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include <linux/types.h> | 47 | #include <linux/types.h> |
48 | #include <linux/delay.h> | 48 | #include <linux/delay.h> |
49 | #include <linux/init.h> | 49 | #include <linux/init.h> |
50 | #include <linux/workqueue.h> | ||
50 | 51 | ||
51 | #include <linux/netdevice.h> | 52 | #include <linux/netdevice.h> |
52 | #include <linux/inetdevice.h> | 53 | #include <linux/inetdevice.h> |
@@ -235,6 +236,9 @@ static int ether1394_open(struct net_device *dev) | |||
235 | /* This is called after an "ifdown" */ | 236 | /* This is called after an "ifdown" */ |
236 | static int ether1394_stop(struct net_device *dev) | 237 | static int ether1394_stop(struct net_device *dev) |
237 | { | 238 | { |
239 | /* flush priv->wake */ | ||
240 | flush_scheduled_work(); | ||
241 | |||
238 | netif_stop_queue(dev); | 242 | netif_stop_queue(dev); |
239 | return 0; | 243 | return 0; |
240 | } | 244 | } |
@@ -531,6 +535,37 @@ static void ether1394_init_dev(struct net_device *dev) | |||
531 | } | 535 | } |
532 | 536 | ||
533 | /* | 537 | /* |
538 | * Wake the queue up after commonly encountered transmit failure conditions are | ||
539 | * hopefully over. Currently only tlabel exhaustion is accounted for. | ||
540 | */ | ||
541 | static void ether1394_wake_queue(struct work_struct *work) | ||
542 | { | ||
543 | struct eth1394_priv *priv; | ||
544 | struct hpsb_packet *packet; | ||
545 | |||
546 | priv = container_of(work, struct eth1394_priv, wake); | ||
547 | packet = hpsb_alloc_packet(0); | ||
548 | |||
549 | /* This is really bad, but unjam the queue anyway. */ | ||
550 | if (!packet) | ||
551 | goto out; | ||
552 | |||
553 | packet->host = priv->host; | ||
554 | packet->node_id = priv->wake_node; | ||
555 | /* | ||
556 | * A transaction label is all we really want. If we get one, it almost | ||
557 | * always means we can get a lot more because the ieee1394 core recycled | ||
558 | * a whole batch of tlabels, at last. | ||
559 | */ | ||
560 | if (hpsb_get_tlabel(packet) == 0) | ||
561 | hpsb_free_tlabel(packet); | ||
562 | |||
563 | hpsb_free_packet(packet); | ||
564 | out: | ||
565 | netif_wake_queue(priv->wake_dev); | ||
566 | } | ||
567 | |||
568 | /* | ||
534 | * This function is called every time a card is found. It is generally called | 569 | * This function is called every time a card is found. It is generally called |
535 | * when the module is installed. This is where we add all of our ethernet | 570 | * when the module is installed. This is where we add all of our ethernet |
536 | * devices. One for each host. | 571 | * devices. One for each host. |
@@ -564,16 +599,17 @@ static void ether1394_add_host(struct hpsb_host *host) | |||
564 | } | 599 | } |
565 | 600 | ||
566 | SET_MODULE_OWNER(dev); | 601 | SET_MODULE_OWNER(dev); |
567 | #if 0 | 602 | |
568 | /* FIXME - Is this the correct parent device anyway? */ | 603 | /* This used to be &host->device in Linux 2.6.20 and before. */ |
569 | SET_NETDEV_DEV(dev, &host->device); | 604 | SET_NETDEV_DEV(dev, host->device.parent); |
570 | #endif | ||
571 | 605 | ||
572 | priv = netdev_priv(dev); | 606 | priv = netdev_priv(dev); |
573 | INIT_LIST_HEAD(&priv->ip_node_list); | 607 | INIT_LIST_HEAD(&priv->ip_node_list); |
574 | spin_lock_init(&priv->lock); | 608 | spin_lock_init(&priv->lock); |
575 | priv->host = host; | 609 | priv->host = host; |
576 | priv->local_fifo = fifo_addr; | 610 | priv->local_fifo = fifo_addr; |
611 | INIT_WORK(&priv->wake, ether1394_wake_queue); | ||
612 | priv->wake_dev = dev; | ||
577 | 613 | ||
578 | hi = hpsb_create_hostinfo(ð1394_highlevel, host, sizeof(*hi)); | 614 | hi = hpsb_create_hostinfo(ð1394_highlevel, host, sizeof(*hi)); |
579 | if (hi == NULL) { | 615 | if (hi == NULL) { |
@@ -1390,22 +1426,17 @@ static int ether1394_prep_write_packet(struct hpsb_packet *p, | |||
1390 | u64 addr, void *data, int tx_len) | 1426 | u64 addr, void *data, int tx_len) |
1391 | { | 1427 | { |
1392 | p->node_id = node; | 1428 | p->node_id = node; |
1393 | p->data = NULL; | ||
1394 | 1429 | ||
1395 | p->tcode = TCODE_WRITEB; | 1430 | if (hpsb_get_tlabel(p)) |
1396 | p->header[1] = host->node_id << 16 | addr >> 32; | 1431 | return -EAGAIN; |
1397 | p->header[2] = addr & 0xffffffff; | ||
1398 | 1432 | ||
1433 | p->tcode = TCODE_WRITEB; | ||
1399 | p->header_size = 16; | 1434 | p->header_size = 16; |
1400 | p->expect_response = 1; | 1435 | p->expect_response = 1; |
1401 | |||
1402 | if (hpsb_get_tlabel(p)) { | ||
1403 | ETH1394_PRINT_G(KERN_ERR, "Out of tlabels\n"); | ||
1404 | return -1; | ||
1405 | } | ||
1406 | p->header[0] = | 1436 | p->header[0] = |
1407 | p->node_id << 16 | p->tlabel << 10 | 1 << 8 | TCODE_WRITEB << 4; | 1437 | p->node_id << 16 | p->tlabel << 10 | 1 << 8 | TCODE_WRITEB << 4; |
1408 | 1438 | p->header[1] = host->node_id << 16 | addr >> 32; | |
1439 | p->header[2] = addr & 0xffffffff; | ||
1409 | p->header[3] = tx_len << 16; | 1440 | p->header[3] = tx_len << 16; |
1410 | p->data_size = (tx_len + 3) & ~3; | 1441 | p->data_size = (tx_len + 3) & ~3; |
1411 | p->data = data; | 1442 | p->data = data; |
@@ -1451,7 +1482,7 @@ static int ether1394_send_packet(struct packet_task *ptask, unsigned int tx_len) | |||
1451 | 1482 | ||
1452 | packet = ether1394_alloc_common_packet(priv->host); | 1483 | packet = ether1394_alloc_common_packet(priv->host); |
1453 | if (!packet) | 1484 | if (!packet) |
1454 | return -1; | 1485 | return -ENOMEM; |
1455 | 1486 | ||
1456 | if (ptask->tx_type == ETH1394_GASP) { | 1487 | if (ptask->tx_type == ETH1394_GASP) { |
1457 | int length = tx_len + 2 * sizeof(quadlet_t); | 1488 | int length = tx_len + 2 * sizeof(quadlet_t); |
@@ -1462,7 +1493,7 @@ static int ether1394_send_packet(struct packet_task *ptask, unsigned int tx_len) | |||
1462 | ptask->addr, ptask->skb->data, | 1493 | ptask->addr, ptask->skb->data, |
1463 | tx_len)) { | 1494 | tx_len)) { |
1464 | hpsb_free_packet(packet); | 1495 | hpsb_free_packet(packet); |
1465 | return -1; | 1496 | return -EAGAIN; |
1466 | } | 1497 | } |
1467 | 1498 | ||
1468 | ptask->packet = packet; | 1499 | ptask->packet = packet; |
@@ -1471,7 +1502,7 @@ static int ether1394_send_packet(struct packet_task *ptask, unsigned int tx_len) | |||
1471 | 1502 | ||
1472 | if (hpsb_send_packet(packet) < 0) { | 1503 | if (hpsb_send_packet(packet) < 0) { |
1473 | ether1394_free_packet(packet); | 1504 | ether1394_free_packet(packet); |
1474 | return -1; | 1505 | return -EIO; |
1475 | } | 1506 | } |
1476 | 1507 | ||
1477 | return 0; | 1508 | return 0; |
@@ -1514,13 +1545,18 @@ static void ether1394_complete_cb(void *__ptask) | |||
1514 | 1545 | ||
1515 | ptask->outstanding_pkts--; | 1546 | ptask->outstanding_pkts--; |
1516 | if (ptask->outstanding_pkts > 0 && !fail) { | 1547 | if (ptask->outstanding_pkts > 0 && !fail) { |
1517 | int tx_len; | 1548 | int tx_len, err; |
1518 | 1549 | ||
1519 | /* Add the encapsulation header to the fragment */ | 1550 | /* Add the encapsulation header to the fragment */ |
1520 | tx_len = ether1394_encapsulate(ptask->skb, ptask->max_payload, | 1551 | tx_len = ether1394_encapsulate(ptask->skb, ptask->max_payload, |
1521 | &ptask->hdr); | 1552 | &ptask->hdr); |
1522 | if (ether1394_send_packet(ptask, tx_len)) | 1553 | err = ether1394_send_packet(ptask, tx_len); |
1554 | if (err) { | ||
1555 | if (err == -EAGAIN) | ||
1556 | ETH1394_PRINT_G(KERN_ERR, "Out of tlabels\n"); | ||
1557 | |||
1523 | ether1394_dg_complete(ptask, 1); | 1558 | ether1394_dg_complete(ptask, 1); |
1559 | } | ||
1524 | } else { | 1560 | } else { |
1525 | ether1394_dg_complete(ptask, fail); | 1561 | ether1394_dg_complete(ptask, fail); |
1526 | } | 1562 | } |
@@ -1633,10 +1669,18 @@ static int ether1394_tx(struct sk_buff *skb, struct net_device *dev) | |||
1633 | /* Add the encapsulation header to the fragment */ | 1669 | /* Add the encapsulation header to the fragment */ |
1634 | tx_len = ether1394_encapsulate(skb, max_payload, &ptask->hdr); | 1670 | tx_len = ether1394_encapsulate(skb, max_payload, &ptask->hdr); |
1635 | dev->trans_start = jiffies; | 1671 | dev->trans_start = jiffies; |
1636 | if (ether1394_send_packet(ptask, tx_len)) | 1672 | if (ether1394_send_packet(ptask, tx_len)) { |
1637 | goto fail; | 1673 | if (dest_node == (LOCAL_BUS | ALL_NODES)) |
1674 | goto fail; | ||
1675 | |||
1676 | /* Most failures of ether1394_send_packet are recoverable. */ | ||
1677 | netif_stop_queue(dev); | ||
1678 | priv->wake_node = dest_node; | ||
1679 | schedule_work(&priv->wake); | ||
1680 | kmem_cache_free(packet_task_cache, ptask); | ||
1681 | return NETDEV_TX_BUSY; | ||
1682 | } | ||
1638 | 1683 | ||
1639 | netif_wake_queue(dev); | ||
1640 | return NETDEV_TX_OK; | 1684 | return NETDEV_TX_OK; |
1641 | fail: | 1685 | fail: |
1642 | if (ptask) | 1686 | if (ptask) |
@@ -1650,9 +1694,6 @@ fail: | |||
1650 | priv->stats.tx_errors++; | 1694 | priv->stats.tx_errors++; |
1651 | spin_unlock_irqrestore(&priv->lock, flags); | 1695 | spin_unlock_irqrestore(&priv->lock, flags); |
1652 | 1696 | ||
1653 | if (netif_queue_stopped(dev)) | ||
1654 | netif_wake_queue(dev); | ||
1655 | |||
1656 | /* | 1697 | /* |
1657 | * FIXME: According to a patch from 2003-02-26, "returning non-zero | 1698 | * FIXME: According to a patch from 2003-02-26, "returning non-zero |
1658 | * causes serious problems" here, allegedly. Before that patch, | 1699 | * causes serious problems" here, allegedly. Before that patch, |
diff --git a/drivers/ieee1394/eth1394.h b/drivers/ieee1394/eth1394.h index a3439ee7cb4e..4f3e2dd46f00 100644 --- a/drivers/ieee1394/eth1394.h +++ b/drivers/ieee1394/eth1394.h | |||
@@ -66,6 +66,10 @@ struct eth1394_priv { | |||
66 | int bc_dgl; /* Outgoing broadcast datagram label */ | 66 | int bc_dgl; /* Outgoing broadcast datagram label */ |
67 | struct list_head ip_node_list; /* List of IP capable nodes */ | 67 | struct list_head ip_node_list; /* List of IP capable nodes */ |
68 | struct unit_directory *ud_list[ALL_NODES]; /* Cached unit dir list */ | 68 | struct unit_directory *ud_list[ALL_NODES]; /* Cached unit dir list */ |
69 | |||
70 | struct work_struct wake; /* Wake up after xmit failure */ | ||
71 | struct net_device *wake_dev; /* Stupid backlink for .wake */ | ||
72 | nodeid_t wake_node; /* Destination of failed xmit */ | ||
69 | }; | 73 | }; |
70 | 74 | ||
71 | 75 | ||
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 835937e38529..81b3864d2ba7 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
@@ -976,7 +976,8 @@ static struct unit_directory *nodemgr_process_unit_directory | |||
976 | 976 | ||
977 | ud->ne = ne; | 977 | ud->ne = ne; |
978 | ud->ignore_driver = ignore_drivers; | 978 | ud->ignore_driver = ignore_drivers; |
979 | ud->address = ud_kv->offset + CSR1212_CONFIG_ROM_SPACE_BASE; | 979 | ud->address = ud_kv->offset + CSR1212_REGISTER_SPACE_BASE; |
980 | ud->directory_id = ud->address & 0xffffff; | ||
980 | ud->ud_kv = ud_kv; | 981 | ud->ud_kv = ud_kv; |
981 | ud->id = (*id)++; | 982 | ud->id = (*id)++; |
982 | 983 | ||
@@ -1085,6 +1086,10 @@ static struct unit_directory *nodemgr_process_unit_directory | |||
1085 | 1086 | ||
1086 | break; | 1087 | break; |
1087 | 1088 | ||
1089 | case CSR1212_KV_ID_DIRECTORY_ID: | ||
1090 | ud->directory_id = kv->value.immediate; | ||
1091 | break; | ||
1092 | |||
1088 | default: | 1093 | default: |
1089 | break; | 1094 | break; |
1090 | } | 1095 | } |
diff --git a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h index e7ac683c72c7..4530b29d941c 100644 --- a/drivers/ieee1394/nodemgr.h +++ b/drivers/ieee1394/nodemgr.h | |||
@@ -75,6 +75,7 @@ struct unit_directory { | |||
75 | struct csr1212_keyval *model_name_kv; | 75 | struct csr1212_keyval *model_name_kv; |
76 | quadlet_t specifier_id; | 76 | quadlet_t specifier_id; |
77 | quadlet_t version; | 77 | quadlet_t version; |
78 | quadlet_t directory_id; | ||
78 | 79 | ||
79 | unsigned int id; | 80 | unsigned int id; |
80 | 81 | ||
diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index d382500f4210..f1d05eeb9f51 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c | |||
@@ -936,6 +936,7 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req) | |||
936 | struct hpsb_packet *packet; | 936 | struct hpsb_packet *packet; |
937 | int header_length = req->req.misc & 0xffff; | 937 | int header_length = req->req.misc & 0xffff; |
938 | int expect_response = req->req.misc >> 16; | 938 | int expect_response = req->req.misc >> 16; |
939 | size_t data_size; | ||
939 | 940 | ||
940 | if (header_length > req->req.length || header_length < 12 || | 941 | if (header_length > req->req.length || header_length < 12 || |
941 | header_length > FIELD_SIZEOF(struct hpsb_packet, header)) { | 942 | header_length > FIELD_SIZEOF(struct hpsb_packet, header)) { |
@@ -945,7 +946,8 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req) | |||
945 | return sizeof(struct raw1394_request); | 946 | return sizeof(struct raw1394_request); |
946 | } | 947 | } |
947 | 948 | ||
948 | packet = hpsb_alloc_packet(req->req.length - header_length); | 949 | data_size = req->req.length - header_length; |
950 | packet = hpsb_alloc_packet(data_size); | ||
949 | req->packet = packet; | 951 | req->packet = packet; |
950 | if (!packet) | 952 | if (!packet) |
951 | return -ENOMEM; | 953 | return -ENOMEM; |
@@ -960,7 +962,7 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req) | |||
960 | 962 | ||
961 | if (copy_from_user | 963 | if (copy_from_user |
962 | (packet->data, int2ptr(req->req.sendb) + header_length, | 964 | (packet->data, int2ptr(req->req.sendb) + header_length, |
963 | packet->data_size)) { | 965 | data_size)) { |
964 | req->req.error = RAW1394_ERROR_MEMFAULT; | 966 | req->req.error = RAW1394_ERROR_MEMFAULT; |
965 | req->req.length = 0; | 967 | req->req.length = 0; |
966 | queue_complete_req(req); | 968 | queue_complete_req(req); |
@@ -974,7 +976,7 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req) | |||
974 | packet->host = fi->host; | 976 | packet->host = fi->host; |
975 | packet->expect_response = expect_response; | 977 | packet->expect_response = expect_response; |
976 | packet->header_size = header_length; | 978 | packet->header_size = header_length; |
977 | packet->data_size = req->req.length - header_length; | 979 | packet->data_size = data_size; |
978 | 980 | ||
979 | req->req.length = 0; | 981 | req->req.length = 0; |
980 | hpsb_set_packet_complete_task(packet, | 982 | hpsb_set_packet_complete_task(packet, |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 4cb6fa2bcfb7..3f873cc7e247 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -70,6 +70,7 @@ | |||
70 | #include <linux/stringify.h> | 70 | #include <linux/stringify.h> |
71 | #include <linux/types.h> | 71 | #include <linux/types.h> |
72 | #include <linux/wait.h> | 72 | #include <linux/wait.h> |
73 | #include <linux/workqueue.h> | ||
73 | 74 | ||
74 | #include <asm/byteorder.h> | 75 | #include <asm/byteorder.h> |
75 | #include <asm/errno.h> | 76 | #include <asm/errno.h> |
@@ -193,6 +194,27 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" | |||
193 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) | 194 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) |
194 | ", or a combination)"); | 195 | ", or a combination)"); |
195 | 196 | ||
197 | /* | ||
198 | * This influences the format of the sysfs attribute | ||
199 | * /sys/bus/scsi/devices/.../ieee1394_id. | ||
200 | * | ||
201 | * The default format is like in older kernels: %016Lx:%d:%d | ||
202 | * It contains the target's EUI-64, a number given to the logical unit by | ||
203 | * the ieee1394 driver's nodemgr (starting at 0), and the LUN. | ||
204 | * | ||
205 | * The long format is: %016Lx:%06x:%04x | ||
206 | * It contains the target's EUI-64, the unit directory's directory_ID as per | ||
207 | * IEEE 1212 clause 7.7.19, and the LUN. This format comes closest to the | ||
208 | * format of SBP(-3) target port and logical unit identifier as per SAM (SCSI | ||
209 | * Architecture Model) rev.2 to 4 annex A. Therefore and because it is | ||
210 | * independent of the implementation of the ieee1394 nodemgr, the longer format | ||
211 | * is recommended for future use. | ||
212 | */ | ||
213 | static int sbp2_long_sysfs_ieee1394_id; | ||
214 | module_param_named(long_ieee1394_id, sbp2_long_sysfs_ieee1394_id, bool, 0644); | ||
215 | MODULE_PARM_DESC(long_ieee1394_id, "8+3+2 bytes format of ieee1394_id in sysfs " | ||
216 | "(default = backwards-compatible = N, SAM-conforming = Y)"); | ||
217 | |||
196 | 218 | ||
197 | #define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) | 219 | #define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) |
198 | #define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) | 220 | #define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) |
@@ -2099,8 +2121,14 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, | |||
2099 | if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0])) | 2121 | if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0])) |
2100 | return 0; | 2122 | return 0; |
2101 | 2123 | ||
2102 | return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)lu->ne->guid, | 2124 | if (sbp2_long_sysfs_ieee1394_id) |
2103 | lu->ud->id, ORB_SET_LUN(lu->lun)); | 2125 | return sprintf(buf, "%016Lx:%06x:%04x\n", |
2126 | (unsigned long long)lu->ne->guid, | ||
2127 | lu->ud->directory_id, ORB_SET_LUN(lu->lun)); | ||
2128 | else | ||
2129 | return sprintf(buf, "%016Lx:%d:%d\n", | ||
2130 | (unsigned long long)lu->ne->guid, | ||
2131 | lu->ud->id, ORB_SET_LUN(lu->lun)); | ||
2104 | } | 2132 | } |
2105 | 2133 | ||
2106 | MODULE_AUTHOR("Ben Collins <bcollins@debian.org>"); | 2134 | MODULE_AUTHOR("Ben Collins <bcollins@debian.org>"); |
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index e840434a96d8..40c004a2697e 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -1297,26 +1297,29 @@ static struct cm_id_private * cm_match_req(struct cm_work *work, | |||
1297 | 1297 | ||
1298 | req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; | 1298 | req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; |
1299 | 1299 | ||
1300 | /* Check for duplicate REQ and stale connections. */ | 1300 | /* Check for possible duplicate REQ. */ |
1301 | spin_lock_irqsave(&cm.lock, flags); | 1301 | spin_lock_irqsave(&cm.lock, flags); |
1302 | timewait_info = cm_insert_remote_id(cm_id_priv->timewait_info); | 1302 | timewait_info = cm_insert_remote_id(cm_id_priv->timewait_info); |
1303 | if (!timewait_info) | ||
1304 | timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info); | ||
1305 | |||
1306 | if (timewait_info) { | 1303 | if (timewait_info) { |
1307 | cur_cm_id_priv = cm_get_id(timewait_info->work.local_id, | 1304 | cur_cm_id_priv = cm_get_id(timewait_info->work.local_id, |
1308 | timewait_info->work.remote_id); | 1305 | timewait_info->work.remote_id); |
1309 | cm_cleanup_timewait(cm_id_priv->timewait_info); | ||
1310 | spin_unlock_irqrestore(&cm.lock, flags); | 1306 | spin_unlock_irqrestore(&cm.lock, flags); |
1311 | if (cur_cm_id_priv) { | 1307 | if (cur_cm_id_priv) { |
1312 | cm_dup_req_handler(work, cur_cm_id_priv); | 1308 | cm_dup_req_handler(work, cur_cm_id_priv); |
1313 | cm_deref_id(cur_cm_id_priv); | 1309 | cm_deref_id(cur_cm_id_priv); |
1314 | } else | 1310 | } |
1315 | cm_issue_rej(work->port, work->mad_recv_wc, | 1311 | return NULL; |
1316 | IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ, | 1312 | } |
1317 | NULL, 0); | 1313 | |
1318 | listen_cm_id_priv = NULL; | 1314 | /* Check for stale connections. */ |
1319 | goto out; | 1315 | timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info); |
1316 | if (timewait_info) { | ||
1317 | cm_cleanup_timewait(cm_id_priv->timewait_info); | ||
1318 | spin_unlock_irqrestore(&cm.lock, flags); | ||
1319 | cm_issue_rej(work->port, work->mad_recv_wc, | ||
1320 | IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ, | ||
1321 | NULL, 0); | ||
1322 | return NULL; | ||
1320 | } | 1323 | } |
1321 | 1324 | ||
1322 | /* Find matching listen request. */ | 1325 | /* Find matching listen request. */ |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 027664979fe2..eef415b12b2e 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -2284,10 +2284,10 @@ void mthca_free_err_wqe(struct mthca_dev *dev, struct mthca_qp *qp, int is_send, | |||
2284 | struct mthca_next_seg *next; | 2284 | struct mthca_next_seg *next; |
2285 | 2285 | ||
2286 | /* | 2286 | /* |
2287 | * For SRQs, all WQEs generate a CQE, so we're always at the | 2287 | * For SRQs, all receive WQEs generate a CQE, so we're always |
2288 | * end of the doorbell chain. | 2288 | * at the end of the doorbell chain. |
2289 | */ | 2289 | */ |
2290 | if (qp->ibqp.srq) { | 2290 | if (qp->ibqp.srq && !is_send) { |
2291 | *new_wqe = 0; | 2291 | *new_wqe = 0; |
2292 | return; | 2292 | return; |
2293 | } | 2293 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 158759e28a5b..285c143115cc 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -156,7 +156,7 @@ struct ipoib_cm_data { | |||
156 | * - and then invoke a Destroy QP or Reset QP. | 156 | * - and then invoke a Destroy QP or Reset QP. |
157 | * | 157 | * |
158 | * We use the second option and wait for a completion on the | 158 | * We use the second option and wait for a completion on the |
159 | * rx_drain_qp before destroying QPs attached to our SRQ. | 159 | * same CQ before destroying QPs attached to our SRQ. |
160 | */ | 160 | */ |
161 | 161 | ||
162 | enum ipoib_cm_state { | 162 | enum ipoib_cm_state { |
@@ -199,7 +199,6 @@ struct ipoib_cm_dev_priv { | |||
199 | struct ib_srq *srq; | 199 | struct ib_srq *srq; |
200 | struct ipoib_cm_rx_buf *srq_ring; | 200 | struct ipoib_cm_rx_buf *srq_ring; |
201 | struct ib_cm_id *id; | 201 | struct ib_cm_id *id; |
202 | struct ib_qp *rx_drain_qp; /* generates WR described in 10.3.1 */ | ||
203 | struct list_head passive_ids; /* state: LIVE */ | 202 | struct list_head passive_ids; /* state: LIVE */ |
204 | struct list_head rx_error_list; /* state: ERROR */ | 203 | struct list_head rx_error_list; /* state: ERROR */ |
205 | struct list_head rx_flush_list; /* state: FLUSH, drain not started */ | 204 | struct list_head rx_flush_list; /* state: FLUSH, drain not started */ |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index f133b56fd978..076a0bbb63d7 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
@@ -69,8 +69,9 @@ static struct ib_qp_attr ipoib_cm_err_attr = { | |||
69 | 69 | ||
70 | #define IPOIB_CM_RX_DRAIN_WRID 0x7fffffff | 70 | #define IPOIB_CM_RX_DRAIN_WRID 0x7fffffff |
71 | 71 | ||
72 | static struct ib_recv_wr ipoib_cm_rx_drain_wr = { | 72 | static struct ib_send_wr ipoib_cm_rx_drain_wr = { |
73 | .wr_id = IPOIB_CM_RX_DRAIN_WRID | 73 | .wr_id = IPOIB_CM_RX_DRAIN_WRID, |
74 | .opcode = IB_WR_SEND, | ||
74 | }; | 75 | }; |
75 | 76 | ||
76 | static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, | 77 | static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, |
@@ -163,16 +164,22 @@ partial_error: | |||
163 | 164 | ||
164 | static void ipoib_cm_start_rx_drain(struct ipoib_dev_priv* priv) | 165 | static void ipoib_cm_start_rx_drain(struct ipoib_dev_priv* priv) |
165 | { | 166 | { |
166 | struct ib_recv_wr *bad_wr; | 167 | struct ib_send_wr *bad_wr; |
168 | struct ipoib_cm_rx *p; | ||
167 | 169 | ||
168 | /* rx_drain_qp send queue depth is 1, so | 170 | /* We only reserved 1 extra slot in CQ for drain WRs, so |
169 | * make sure we have at most 1 outstanding WR. */ | 171 | * make sure we have at most 1 outstanding WR. */ |
170 | if (list_empty(&priv->cm.rx_flush_list) || | 172 | if (list_empty(&priv->cm.rx_flush_list) || |
171 | !list_empty(&priv->cm.rx_drain_list)) | 173 | !list_empty(&priv->cm.rx_drain_list)) |
172 | return; | 174 | return; |
173 | 175 | ||
174 | if (ib_post_recv(priv->cm.rx_drain_qp, &ipoib_cm_rx_drain_wr, &bad_wr)) | 176 | /* |
175 | ipoib_warn(priv, "failed to post rx_drain wr\n"); | 177 | * QPs on flush list are error state. This way, a "flush |
178 | * error" WC will be immediately generated for each WR we post. | ||
179 | */ | ||
180 | p = list_entry(priv->cm.rx_flush_list.next, typeof(*p), list); | ||
181 | if (ib_post_send(p->qp, &ipoib_cm_rx_drain_wr, &bad_wr)) | ||
182 | ipoib_warn(priv, "failed to post drain wr\n"); | ||
176 | 183 | ||
177 | list_splice_init(&priv->cm.rx_flush_list, &priv->cm.rx_drain_list); | 184 | list_splice_init(&priv->cm.rx_flush_list, &priv->cm.rx_drain_list); |
178 | } | 185 | } |
@@ -199,10 +206,10 @@ static struct ib_qp *ipoib_cm_create_rx_qp(struct net_device *dev, | |||
199 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 206 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
200 | struct ib_qp_init_attr attr = { | 207 | struct ib_qp_init_attr attr = { |
201 | .event_handler = ipoib_cm_rx_event_handler, | 208 | .event_handler = ipoib_cm_rx_event_handler, |
202 | .send_cq = priv->cq, /* does not matter, we never send anything */ | 209 | .send_cq = priv->cq, /* For drain WR */ |
203 | .recv_cq = priv->cq, | 210 | .recv_cq = priv->cq, |
204 | .srq = priv->cm.srq, | 211 | .srq = priv->cm.srq, |
205 | .cap.max_send_wr = 1, /* FIXME: 0 Seems not to work */ | 212 | .cap.max_send_wr = 1, /* For drain WR */ |
206 | .cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */ | 213 | .cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */ |
207 | .sq_sig_type = IB_SIGNAL_ALL_WR, | 214 | .sq_sig_type = IB_SIGNAL_ALL_WR, |
208 | .qp_type = IB_QPT_RC, | 215 | .qp_type = IB_QPT_RC, |
@@ -242,6 +249,27 @@ static int ipoib_cm_modify_rx_qp(struct net_device *dev, | |||
242 | ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret); | 249 | ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret); |
243 | return ret; | 250 | return ret; |
244 | } | 251 | } |
252 | |||
253 | /* | ||
254 | * Current Mellanox HCA firmware won't generate completions | ||
255 | * with error for drain WRs unless the QP has been moved to | ||
256 | * RTS first. This work-around leaves a window where a QP has | ||
257 | * moved to error asynchronously, but this will eventually get | ||
258 | * fixed in firmware, so let's not error out if modify QP | ||
259 | * fails. | ||
260 | */ | ||
261 | qp_attr.qp_state = IB_QPS_RTS; | ||
262 | ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask); | ||
263 | if (ret) { | ||
264 | ipoib_warn(priv, "failed to init QP attr for RTS: %d\n", ret); | ||
265 | return 0; | ||
266 | } | ||
267 | ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask); | ||
268 | if (ret) { | ||
269 | ipoib_warn(priv, "failed to modify QP to RTS: %d\n", ret); | ||
270 | return 0; | ||
271 | } | ||
272 | |||
245 | return 0; | 273 | return 0; |
246 | } | 274 | } |
247 | 275 | ||
@@ -623,38 +651,11 @@ static void ipoib_cm_tx_completion(struct ib_cq *cq, void *tx_ptr) | |||
623 | int ipoib_cm_dev_open(struct net_device *dev) | 651 | int ipoib_cm_dev_open(struct net_device *dev) |
624 | { | 652 | { |
625 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 653 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
626 | struct ib_qp_init_attr qp_init_attr = { | ||
627 | .send_cq = priv->cq, /* does not matter, we never send anything */ | ||
628 | .recv_cq = priv->cq, | ||
629 | .cap.max_send_wr = 1, /* FIXME: 0 Seems not to work */ | ||
630 | .cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */ | ||
631 | .cap.max_recv_wr = 1, | ||
632 | .cap.max_recv_sge = 1, /* FIXME: 0 Seems not to work */ | ||
633 | .sq_sig_type = IB_SIGNAL_ALL_WR, | ||
634 | .qp_type = IB_QPT_UC, | ||
635 | }; | ||
636 | int ret; | 654 | int ret; |
637 | 655 | ||
638 | if (!IPOIB_CM_SUPPORTED(dev->dev_addr)) | 656 | if (!IPOIB_CM_SUPPORTED(dev->dev_addr)) |
639 | return 0; | 657 | return 0; |
640 | 658 | ||
641 | priv->cm.rx_drain_qp = ib_create_qp(priv->pd, &qp_init_attr); | ||
642 | if (IS_ERR(priv->cm.rx_drain_qp)) { | ||
643 | printk(KERN_WARNING "%s: failed to create CM ID\n", priv->ca->name); | ||
644 | ret = PTR_ERR(priv->cm.rx_drain_qp); | ||
645 | return ret; | ||
646 | } | ||
647 | |||
648 | /* | ||
649 | * We put the QP in error state directly. This way, a "flush | ||
650 | * error" WC will be immediately generated for each WR we post. | ||
651 | */ | ||
652 | ret = ib_modify_qp(priv->cm.rx_drain_qp, &ipoib_cm_err_attr, IB_QP_STATE); | ||
653 | if (ret) { | ||
654 | ipoib_warn(priv, "failed to modify drain QP to error: %d\n", ret); | ||
655 | goto err_qp; | ||
656 | } | ||
657 | |||
658 | priv->cm.id = ib_create_cm_id(priv->ca, ipoib_cm_rx_handler, dev); | 659 | priv->cm.id = ib_create_cm_id(priv->ca, ipoib_cm_rx_handler, dev); |
659 | if (IS_ERR(priv->cm.id)) { | 660 | if (IS_ERR(priv->cm.id)) { |
660 | printk(KERN_WARNING "%s: failed to create CM ID\n", priv->ca->name); | 661 | printk(KERN_WARNING "%s: failed to create CM ID\n", priv->ca->name); |
@@ -676,8 +677,6 @@ err_listen: | |||
676 | ib_destroy_cm_id(priv->cm.id); | 677 | ib_destroy_cm_id(priv->cm.id); |
677 | err_cm: | 678 | err_cm: |
678 | priv->cm.id = NULL; | 679 | priv->cm.id = NULL; |
679 | err_qp: | ||
680 | ib_destroy_qp(priv->cm.rx_drain_qp); | ||
681 | return ret; | 680 | return ret; |
682 | } | 681 | } |
683 | 682 | ||
@@ -740,7 +739,6 @@ void ipoib_cm_dev_stop(struct net_device *dev) | |||
740 | kfree(p); | 739 | kfree(p); |
741 | } | 740 | } |
742 | 741 | ||
743 | ib_destroy_qp(priv->cm.rx_drain_qp); | ||
744 | cancel_delayed_work(&priv->cm.stale_task); | 742 | cancel_delayed_work(&priv->cm.stale_task); |
745 | } | 743 | } |
746 | 744 | ||
diff --git a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c index 559508795af1..d31ece8f68e9 100644 --- a/drivers/input/serio/sa1111ps2.c +++ b/drivers/input/serio/sa1111ps2.c | |||
@@ -170,7 +170,7 @@ static void ps2_close(struct serio *io) | |||
170 | /* | 170 | /* |
171 | * Clear the input buffer. | 171 | * Clear the input buffer. |
172 | */ | 172 | */ |
173 | static void __init ps2_clear_input(struct ps2if *ps2if) | 173 | static void __devinit ps2_clear_input(struct ps2if *ps2if) |
174 | { | 174 | { |
175 | int maxread = 100; | 175 | int maxread = 100; |
176 | 176 | ||
@@ -228,7 +228,7 @@ static int __init ps2_test(struct ps2if *ps2if) | |||
228 | /* | 228 | /* |
229 | * Add one device to this driver. | 229 | * Add one device to this driver. |
230 | */ | 230 | */ |
231 | static int ps2_probe(struct sa1111_dev *dev) | 231 | static int __devinit ps2_probe(struct sa1111_dev *dev) |
232 | { | 232 | { |
233 | struct ps2if *ps2if; | 233 | struct ps2if *ps2if; |
234 | struct serio *serio; | 234 | struct serio *serio; |
diff --git a/drivers/isdn/Kconfig b/drivers/isdn/Kconfig index d42fe89cddf6..3e088c42b222 100644 --- a/drivers/isdn/Kconfig +++ b/drivers/isdn/Kconfig | |||
@@ -26,9 +26,9 @@ menu "Old ISDN4Linux" | |||
26 | depends on NET && ISDN | 26 | depends on NET && ISDN |
27 | 27 | ||
28 | config ISDN_I4L | 28 | config ISDN_I4L |
29 | tristate "Old ISDN4Linux (obsolete)" | 29 | tristate "Old ISDN4Linux (deprecated)" |
30 | ---help--- | 30 | ---help--- |
31 | This driver allows you to use an ISDN-card for networking | 31 | This driver allows you to use an ISDN adapter for networking |
32 | connections and as dialin/out device. The isdn-tty's have a built | 32 | connections and as dialin/out device. The isdn-tty's have a built |
33 | in AT-compatible modem emulator. Network devices support autodial, | 33 | in AT-compatible modem emulator. Network devices support autodial, |
34 | channel-bundling, callback and caller-authentication without having | 34 | channel-bundling, callback and caller-authentication without having |
@@ -39,8 +39,9 @@ config ISDN_I4L | |||
39 | 39 | ||
40 | ISDN support in the linux kernel is moving towards a new API, | 40 | ISDN support in the linux kernel is moving towards a new API, |
41 | called CAPI (Common ISDN Application Programming Interface). | 41 | called CAPI (Common ISDN Application Programming Interface). |
42 | Therefore the old ISDN4Linux layer is becoming obsolete. It is | 42 | Therefore the old ISDN4Linux layer will eventually become obsolete. |
43 | still usable, though, if you select this option. | 43 | It is still available, though, for use with adapters that are not |
44 | supported by the new CAPI subsystem yet. | ||
44 | 45 | ||
45 | if ISDN_I4L | 46 | if ISDN_I4L |
46 | source "drivers/isdn/i4l/Kconfig" | 47 | source "drivers/isdn/i4l/Kconfig" |
diff --git a/drivers/isdn/hardware/eicon/diva_didd.c b/drivers/isdn/hardware/eicon/diva_didd.c index 14298b8c835f..d755d904e62c 100644 --- a/drivers/isdn/hardware/eicon/diva_didd.c +++ b/drivers/isdn/hardware/eicon/diva_didd.c | |||
@@ -99,7 +99,7 @@ static int DIVA_INIT_FUNCTION create_proc(void) | |||
99 | return (0); | 99 | return (0); |
100 | } | 100 | } |
101 | 101 | ||
102 | static void DIVA_EXIT_FUNCTION remove_proc(void) | 102 | static void remove_proc(void) |
103 | { | 103 | { |
104 | remove_proc_entry(DRIVERLNAME, proc_net_eicon); | 104 | remove_proc_entry(DRIVERLNAME, proc_net_eicon); |
105 | remove_proc_entry("net/eicon", NULL); | 105 | remove_proc_entry("net/eicon", NULL); |
diff --git a/drivers/isdn/hardware/eicon/divasfunc.c b/drivers/isdn/hardware/eicon/divasfunc.c index df61e510a28b..46fc21a3f8ff 100644 --- a/drivers/isdn/hardware/eicon/divasfunc.c +++ b/drivers/isdn/hardware/eicon/divasfunc.c | |||
@@ -231,7 +231,7 @@ int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask) | |||
231 | /* | 231 | /* |
232 | * exit | 232 | * exit |
233 | */ | 233 | */ |
234 | void DIVA_EXIT_FUNCTION divasfunc_exit(void) | 234 | void divasfunc_exit(void) |
235 | { | 235 | { |
236 | divasa_xdi_driver_unload(); | 236 | divasa_xdi_driver_unload(); |
237 | disconnect_didd(); | 237 | disconnect_didd(); |
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index ea5f30d4a5a2..4e5f87c1e714 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c | |||
@@ -2693,8 +2693,9 @@ isdn_tty_getdial(char *p, char *q,int cnt) | |||
2693 | int limit = ISDN_MSNLEN - 1; /* MUST match the size of interface var to avoid | 2693 | int limit = ISDN_MSNLEN - 1; /* MUST match the size of interface var to avoid |
2694 | buffer overflow */ | 2694 | buffer overflow */ |
2695 | 2695 | ||
2696 | while (strchr(" 0123456789,#.*WPTS-", *p) && *p && --cnt>0) { | 2696 | while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt>0) { |
2697 | if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) || | 2697 | if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) || |
2698 | ((*p == 'R') && first) || | ||
2698 | (*p == '*') || (*p == '#')) { | 2699 | (*p == '*') || (*p == '#')) { |
2699 | *q++ = *p; | 2700 | *q++ = *p; |
2700 | limit--; | 2701 | limit--; |
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index e6e4d240b2a6..184238e2ece4 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -639,7 +639,7 @@ static void free_vmcs(struct vmcs *vmcs) | |||
639 | free_pages((unsigned long)vmcs, vmcs_descriptor.order); | 639 | free_pages((unsigned long)vmcs, vmcs_descriptor.order); |
640 | } | 640 | } |
641 | 641 | ||
642 | static __exit void free_kvm_area(void) | 642 | static void free_kvm_area(void) |
643 | { | 643 | { |
644 | int cpu; | 644 | int cpu; |
645 | 645 | ||
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index 58926da0ae18..f44c94abd883 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -113,7 +113,6 @@ config PMAC_SMU | |||
113 | 113 | ||
114 | config PMAC_APM_EMU | 114 | config PMAC_APM_EMU |
115 | tristate "APM emulation" | 115 | tristate "APM emulation" |
116 | select SYS_SUPPORTS_APM_EMULATION | ||
117 | select APM_EMULATION | 116 | select APM_EMULATION |
118 | depends on ADB_PMU && PM | 117 | depends on ADB_PMU && PM |
119 | 118 | ||
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index d25d3be8fcd2..165f81d16d00 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -436,7 +436,7 @@ typedef struct _MPT_SAS_MGMT { | |||
436 | typedef struct _mpt_ioctl_events { | 436 | typedef struct _mpt_ioctl_events { |
437 | u32 event; /* Specified by define above */ | 437 | u32 event; /* Specified by define above */ |
438 | u32 eventContext; /* Index or counter */ | 438 | u32 eventContext; /* Index or counter */ |
439 | int data[2]; /* First 8 bytes of Event Data */ | 439 | u32 data[2]; /* First 8 bytes of Event Data */ |
440 | } MPT_IOCTL_EVENTS; | 440 | } MPT_IOCTL_EVENTS; |
441 | 441 | ||
442 | /* | 442 | /* |
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index fa0f7761652a..3bd94f11e7d6 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
@@ -2463,11 +2463,11 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR | |||
2463 | ioc->events[idx].event = MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE; | 2463 | ioc->events[idx].event = MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE; |
2464 | ioc->events[idx].eventContext = ioc->eventContext; | 2464 | ioc->events[idx].eventContext = ioc->eventContext; |
2465 | 2465 | ||
2466 | ioc->events[idx].data[0] = (pReq->LUN[1] << 24) || | 2466 | ioc->events[idx].data[0] = (pReq->LUN[1] << 24) | |
2467 | (MPI_EVENT_SCSI_DEV_STAT_RC_SMART_DATA << 16) || | 2467 | (MPI_EVENT_SCSI_DEV_STAT_RC_SMART_DATA << 16) | |
2468 | (sc->device->channel << 8) || sc->device->id; | 2468 | (sc->device->channel << 8) | sc->device->id; |
2469 | 2469 | ||
2470 | ioc->events[idx].data[1] = (sense_data[13] << 8) || sense_data[12]; | 2470 | ioc->events[idx].data[1] = (sense_data[13] << 8) | sense_data[12]; |
2471 | 2471 | ||
2472 | ioc->eventContext++; | 2472 | ioc->eventContext++; |
2473 | if (hd->ioc->pcidev->vendor == | 2473 | if (hd->ioc->pcidev->vendor == |
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 6c36a55cb3d1..95c0b96e83f2 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -740,7 +740,7 @@ static ssize_t hotkey_enable_store(struct device *dev, | |||
740 | } | 740 | } |
741 | 741 | ||
742 | static struct device_attribute dev_attr_hotkey_enable = | 742 | static struct device_attribute dev_attr_hotkey_enable = |
743 | __ATTR(enable, S_IWUSR | S_IRUGO, | 743 | __ATTR(hotkey_enable, S_IWUSR | S_IRUGO, |
744 | hotkey_enable_show, hotkey_enable_store); | 744 | hotkey_enable_show, hotkey_enable_store); |
745 | 745 | ||
746 | /* sysfs hotkey mask --------------------------------------------------- */ | 746 | /* sysfs hotkey mask --------------------------------------------------- */ |
@@ -775,7 +775,7 @@ static ssize_t hotkey_mask_store(struct device *dev, | |||
775 | } | 775 | } |
776 | 776 | ||
777 | static struct device_attribute dev_attr_hotkey_mask = | 777 | static struct device_attribute dev_attr_hotkey_mask = |
778 | __ATTR(mask, S_IWUSR | S_IRUGO, | 778 | __ATTR(hotkey_mask, S_IWUSR | S_IRUGO, |
779 | hotkey_mask_show, hotkey_mask_store); | 779 | hotkey_mask_show, hotkey_mask_store); |
780 | 780 | ||
781 | /* sysfs hotkey bios_enabled ------------------------------------------- */ | 781 | /* sysfs hotkey bios_enabled ------------------------------------------- */ |
@@ -787,7 +787,7 @@ static ssize_t hotkey_bios_enabled_show(struct device *dev, | |||
787 | } | 787 | } |
788 | 788 | ||
789 | static struct device_attribute dev_attr_hotkey_bios_enabled = | 789 | static struct device_attribute dev_attr_hotkey_bios_enabled = |
790 | __ATTR(bios_enabled, S_IRUGO, hotkey_bios_enabled_show, NULL); | 790 | __ATTR(hotkey_bios_enabled, S_IRUGO, hotkey_bios_enabled_show, NULL); |
791 | 791 | ||
792 | /* sysfs hotkey bios_mask ---------------------------------------------- */ | 792 | /* sysfs hotkey bios_mask ---------------------------------------------- */ |
793 | static ssize_t hotkey_bios_mask_show(struct device *dev, | 793 | static ssize_t hotkey_bios_mask_show(struct device *dev, |
@@ -798,7 +798,7 @@ static ssize_t hotkey_bios_mask_show(struct device *dev, | |||
798 | } | 798 | } |
799 | 799 | ||
800 | static struct device_attribute dev_attr_hotkey_bios_mask = | 800 | static struct device_attribute dev_attr_hotkey_bios_mask = |
801 | __ATTR(bios_mask, S_IRUGO, hotkey_bios_mask_show, NULL); | 801 | __ATTR(hotkey_bios_mask, S_IRUGO, hotkey_bios_mask_show, NULL); |
802 | 802 | ||
803 | /* --------------------------------------------------------------------- */ | 803 | /* --------------------------------------------------------------------- */ |
804 | 804 | ||
@@ -824,8 +824,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
824 | str_supported(tp_features.hotkey)); | 824 | str_supported(tp_features.hotkey)); |
825 | 825 | ||
826 | if (tp_features.hotkey) { | 826 | if (tp_features.hotkey) { |
827 | hotkey_dev_attributes = create_attr_set(4, | 827 | hotkey_dev_attributes = create_attr_set(4, NULL); |
828 | TPACPI_HOTKEY_SYSFS_GROUP); | ||
829 | if (!hotkey_dev_attributes) | 828 | if (!hotkey_dev_attributes) |
830 | return -ENOMEM; | 829 | return -ENOMEM; |
831 | res = add_to_attr_set(hotkey_dev_attributes, | 830 | res = add_to_attr_set(hotkey_dev_attributes, |
@@ -1050,7 +1049,7 @@ static ssize_t bluetooth_enable_store(struct device *dev, | |||
1050 | } | 1049 | } |
1051 | 1050 | ||
1052 | static struct device_attribute dev_attr_bluetooth_enable = | 1051 | static struct device_attribute dev_attr_bluetooth_enable = |
1053 | __ATTR(enable, S_IWUSR | S_IRUGO, | 1052 | __ATTR(bluetooth_enable, S_IWUSR | S_IRUGO, |
1054 | bluetooth_enable_show, bluetooth_enable_store); | 1053 | bluetooth_enable_show, bluetooth_enable_store); |
1055 | 1054 | ||
1056 | /* --------------------------------------------------------------------- */ | 1055 | /* --------------------------------------------------------------------- */ |
@@ -1061,7 +1060,6 @@ static struct attribute *bluetooth_attributes[] = { | |||
1061 | }; | 1060 | }; |
1062 | 1061 | ||
1063 | static const struct attribute_group bluetooth_attr_group = { | 1062 | static const struct attribute_group bluetooth_attr_group = { |
1064 | .name = TPACPI_BLUETH_SYSFS_GROUP, | ||
1065 | .attrs = bluetooth_attributes, | 1063 | .attrs = bluetooth_attributes, |
1066 | }; | 1064 | }; |
1067 | 1065 | ||
@@ -1215,7 +1213,7 @@ static ssize_t wan_enable_store(struct device *dev, | |||
1215 | } | 1213 | } |
1216 | 1214 | ||
1217 | static struct device_attribute dev_attr_wan_enable = | 1215 | static struct device_attribute dev_attr_wan_enable = |
1218 | __ATTR(enable, S_IWUSR | S_IRUGO, | 1216 | __ATTR(wwan_enable, S_IWUSR | S_IRUGO, |
1219 | wan_enable_show, wan_enable_store); | 1217 | wan_enable_show, wan_enable_store); |
1220 | 1218 | ||
1221 | /* --------------------------------------------------------------------- */ | 1219 | /* --------------------------------------------------------------------- */ |
@@ -1226,7 +1224,6 @@ static struct attribute *wan_attributes[] = { | |||
1226 | }; | 1224 | }; |
1227 | 1225 | ||
1228 | static const struct attribute_group wan_attr_group = { | 1226 | static const struct attribute_group wan_attr_group = { |
1229 | .name = TPACPI_WAN_SYSFS_GROUP, | ||
1230 | .attrs = wan_attributes, | 1227 | .attrs = wan_attributes, |
1231 | }; | 1228 | }; |
1232 | 1229 | ||
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h index 440145a02617..72d62f2dabb9 100644 --- a/drivers/misc/thinkpad_acpi.h +++ b/drivers/misc/thinkpad_acpi.h | |||
@@ -278,8 +278,6 @@ static int beep_write(char *buf); | |||
278 | * Bluetooth subdriver | 278 | * Bluetooth subdriver |
279 | */ | 279 | */ |
280 | 280 | ||
281 | #define TPACPI_BLUETH_SYSFS_GROUP "bluetooth" | ||
282 | |||
283 | enum { | 281 | enum { |
284 | /* ACPI GBDC/SBDC bits */ | 282 | /* ACPI GBDC/SBDC bits */ |
285 | TP_ACPI_BLUETOOTH_HWPRESENT = 0x01, /* Bluetooth hw available */ | 283 | TP_ACPI_BLUETOOTH_HWPRESENT = 0x01, /* Bluetooth hw available */ |
@@ -416,8 +414,6 @@ static int fan_write_cmd_watchdog(const char *cmd, int *rc); | |||
416 | * Hotkey subdriver | 414 | * Hotkey subdriver |
417 | */ | 415 | */ |
418 | 416 | ||
419 | #define TPACPI_HOTKEY_SYSFS_GROUP "hotkey" | ||
420 | |||
421 | static int hotkey_orig_status; | 417 | static int hotkey_orig_status; |
422 | static int hotkey_orig_mask; | 418 | static int hotkey_orig_mask; |
423 | 419 | ||
@@ -553,8 +549,6 @@ static int volume_write(char *buf); | |||
553 | * Wan subdriver | 549 | * Wan subdriver |
554 | */ | 550 | */ |
555 | 551 | ||
556 | #define TPACPI_WAN_SYSFS_GROUP "wwan" | ||
557 | |||
558 | enum { | 552 | enum { |
559 | /* ACPI GWAN/SWAN bits */ | 553 | /* ACPI GWAN/SWAN bits */ |
560 | TP_ACPI_WANCARD_HWPRESENT = 0x01, /* Wan hw available */ | 554 | TP_ACPI_WANCARD_HWPRESENT = 0x01, /* Wan hw available */ |
diff --git a/drivers/misc/tifm_7xx1.c b/drivers/misc/tifm_7xx1.c index c08ad8f823d2..2d1b3df95c5b 100644 --- a/drivers/misc/tifm_7xx1.c +++ b/drivers/misc/tifm_7xx1.c | |||
@@ -343,7 +343,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev, | |||
343 | if (!fm->addr) | 343 | if (!fm->addr) |
344 | goto err_out_free; | 344 | goto err_out_free; |
345 | 345 | ||
346 | rc = request_irq(dev->irq, tifm_7xx1_isr, SA_SHIRQ, DRIVER_NAME, fm); | 346 | rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm); |
347 | if (rc) | 347 | if (rc) |
348 | goto err_out_unmap; | 348 | goto err_out_unmap; |
349 | 349 | ||
diff --git a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c index a4873ab84e6b..e8f686f7a357 100644 --- a/drivers/mtd/devices/pmc551.c +++ b/drivers/mtd/devices/pmc551.c | |||
@@ -650,7 +650,7 @@ MODULE_DESCRIPTION(PMC551_VERSION); | |||
650 | */ | 650 | */ |
651 | static int msize = 0; | 651 | static int msize = 0; |
652 | #if defined(CONFIG_MTD_PMC551_APERTURE_SIZE) | 652 | #if defined(CONFIG_MTD_PMC551_APERTURE_SIZE) |
653 | static int asize = CONFIG_MTD_PMC551_APERTURE_SIZE | 653 | static int asize = CONFIG_MTD_PMC551_APERTURE_SIZE; |
654 | #else | 654 | #else |
655 | static int asize = 0; | 655 | static int asize = 0; |
656 | #endif | 656 | #endif |
diff --git a/drivers/mtd/nand/autcpu12.c b/drivers/mtd/nand/autcpu12.c index fe94ae9ae1f2..e3744eb8eccb 100644 --- a/drivers/mtd/nand/autcpu12.c +++ b/drivers/mtd/nand/autcpu12.c | |||
@@ -101,7 +101,7 @@ static void autcpu12_hwcontrol(struct mtd_info *mtd, int cmd, | |||
101 | struct nand_chip *chip = mtd->priv; | 101 | struct nand_chip *chip = mtd->priv; |
102 | 102 | ||
103 | if (ctrl & NAND_CTRL_CHANGE) { | 103 | if (ctrl & NAND_CTRL_CHANGE) { |
104 | void __iomem *addr | 104 | void __iomem *addr; |
105 | unsigned char bits; | 105 | unsigned char bits; |
106 | 106 | ||
107 | addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET; | 107 | addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET; |
diff --git a/drivers/mtd/nand/ppchameleonevb.c b/drivers/mtd/nand/ppchameleonevb.c index eb7d4d443deb..082073acf20f 100644 --- a/drivers/mtd/nand/ppchameleonevb.c +++ b/drivers/mtd/nand/ppchameleonevb.c | |||
@@ -81,7 +81,7 @@ __setup("ppchameleonevb_fio_pbase=", ppchameleonevb_fio_pbase); | |||
81 | */ | 81 | */ |
82 | static struct mtd_partition partition_info_hi[] = { | 82 | static struct mtd_partition partition_info_hi[] = { |
83 | { .name = "PPChameleon HI Nand Flash", | 83 | { .name = "PPChameleon HI Nand Flash", |
84 | offset = 0, | 84 | .offset = 0, |
85 | .size = 128 * 1024 * 1024 | 85 | .size = 128 * 1024 * 1024 |
86 | } | 86 | } |
87 | }; | 87 | }; |
@@ -424,9 +424,9 @@ static void __exit ppchameleonevb_cleanup(void) | |||
424 | 424 | ||
425 | /* Release iomaps */ | 425 | /* Release iomaps */ |
426 | this = (struct nand_chip *) &ppchameleon_mtd[1]; | 426 | this = (struct nand_chip *) &ppchameleon_mtd[1]; |
427 | iounmap((void *) this->IO_ADDR_R; | 427 | iounmap((void *) this->IO_ADDR_R); |
428 | this = (struct nand_chip *) &ppchameleonevb_mtd[1]; | 428 | this = (struct nand_chip *) &ppchameleonevb_mtd[1]; |
429 | iounmap((void *) this->IO_ADDR_R; | 429 | iounmap((void *) this->IO_ADDR_R); |
430 | 430 | ||
431 | /* Free the MTD device structure */ | 431 | /* Free the MTD device structure */ |
432 | kfree (ppchameleon_mtd); | 432 | kfree (ppchameleon_mtd); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 30fd479fea5e..7d57f4a25dc1 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2280,7 +2280,7 @@ config GFAR_NAPI | |||
2280 | config UCC_GETH | 2280 | config UCC_GETH |
2281 | tristate "Freescale QE Gigabit Ethernet" | 2281 | tristate "Freescale QE Gigabit Ethernet" |
2282 | depends on QUICC_ENGINE | 2282 | depends on QUICC_ENGINE |
2283 | select UCC_FAST | 2283 | select PHYLIB |
2284 | help | 2284 | help |
2285 | This driver supports the Gigabit Ethernet mode of the QUICC Engine, | 2285 | This driver supports the Gigabit Ethernet mode of the QUICC Engine, |
2286 | which is available on some Freescale SOCs. | 2286 | which is available on some Freescale SOCs. |
diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index 675fe918421b..84b81642011c 100644 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c | |||
@@ -155,7 +155,7 @@ This function will write into PHY registers. | |||
155 | */ | 155 | */ |
156 | static int amd8111e_write_phy(struct amd8111e_priv* lp,int phy_id, int reg, u32 val) | 156 | static int amd8111e_write_phy(struct amd8111e_priv* lp,int phy_id, int reg, u32 val) |
157 | { | 157 | { |
158 | unsigned int repeat = REPEAT_CNT | 158 | unsigned int repeat = REPEAT_CNT; |
159 | void __iomem *mmio = lp->mmio; | 159 | void __iomem *mmio = lp->mmio; |
160 | unsigned int reg_val; | 160 | unsigned int reg_val; |
161 | 161 | ||
diff --git a/drivers/net/amd8111e.h b/drivers/net/amd8111e.h index 2007510c4eb6..e65080a5994a 100644 --- a/drivers/net/amd8111e.h +++ b/drivers/net/amd8111e.h | |||
@@ -615,7 +615,7 @@ typedef enum { | |||
615 | #define SSTATE 2 | 615 | #define SSTATE 2 |
616 | 616 | ||
617 | /* Assume contoller gets data 10 times the maximum processing time */ | 617 | /* Assume contoller gets data 10 times the maximum processing time */ |
618 | #define REPEAT_CNT 10; | 618 | #define REPEAT_CNT 10 |
619 | 619 | ||
620 | /* amd8111e decriptor flag definitions */ | 620 | /* amd8111e decriptor flag definitions */ |
621 | typedef enum { | 621 | typedef enum { |
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index 9fe3a38883ee..59b9943b077d 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
@@ -4920,7 +4920,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, | |||
4920 | pci_cmd |= PCI_COMMAND_PARITY; | 4920 | pci_cmd |= PCI_COMMAND_PARITY; |
4921 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); | 4921 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); |
4922 | if (pci_set_mwi(pdev)) | 4922 | if (pci_set_mwi(pdev)) |
4923 | printk(KERN_WARNING PFX "Could enable MWI for %s\n", | 4923 | printk(KERN_WARNING PFX "Could not enable MWI for %s\n", |
4924 | pci_name(pdev)); | 4924 | pci_name(pdev)); |
4925 | 4925 | ||
4926 | /* | 4926 | /* |
diff --git a/drivers/net/defxx.c b/drivers/net/defxx.c index 571d82f8008c..7df23dc28190 100644 --- a/drivers/net/defxx.c +++ b/drivers/net/defxx.c | |||
@@ -566,6 +566,7 @@ static int __devinit dfx_register(struct device *bdev) | |||
566 | bp->base.mem = ioremap_nocache(bar_start, bar_len); | 566 | bp->base.mem = ioremap_nocache(bar_start, bar_len); |
567 | if (!bp->base.mem) { | 567 | if (!bp->base.mem) { |
568 | printk(KERN_ERR "%s: Cannot map MMIO\n", print_name); | 568 | printk(KERN_ERR "%s: Cannot map MMIO\n", print_name); |
569 | err = -ENOMEM; | ||
569 | goto err_out_region; | 570 | goto err_out_region; |
570 | } | 571 | } |
571 | } else { | 572 | } else { |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index cbc7febe9cdc..9ec35b7a8207 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -1325,7 +1325,10 @@ e1000_sw_init(struct e1000_adapter *adapter) | |||
1325 | spin_lock_init(&adapter->tx_queue_lock); | 1325 | spin_lock_init(&adapter->tx_queue_lock); |
1326 | #endif | 1326 | #endif |
1327 | 1327 | ||
1328 | atomic_set(&adapter->irq_sem, 1); | 1328 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
1329 | atomic_set(&adapter->irq_sem, 0); | ||
1330 | e1000_irq_disable(adapter); | ||
1331 | |||
1329 | spin_lock_init(&adapter->stats_lock); | 1332 | spin_lock_init(&adapter->stats_lock); |
1330 | 1333 | ||
1331 | set_bit(__E1000_DOWN, &adapter->flags); | 1334 | set_bit(__E1000_DOWN, &adapter->flags); |
@@ -1431,6 +1434,10 @@ e1000_open(struct net_device *netdev) | |||
1431 | /* From here on the code is the same as e1000_up() */ | 1434 | /* From here on the code is the same as e1000_up() */ |
1432 | clear_bit(__E1000_DOWN, &adapter->flags); | 1435 | clear_bit(__E1000_DOWN, &adapter->flags); |
1433 | 1436 | ||
1437 | #ifdef CONFIG_E1000_NAPI | ||
1438 | netif_poll_enable(netdev); | ||
1439 | #endif | ||
1440 | |||
1434 | e1000_irq_enable(adapter); | 1441 | e1000_irq_enable(adapter); |
1435 | 1442 | ||
1436 | /* fire a link status change interrupt to start the watchdog */ | 1443 | /* fire a link status change interrupt to start the watchdog */ |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 602872dbe15f..e85a933a4762 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
40 | 40 | ||
41 | #define DRV_NAME "ehea" | 41 | #define DRV_NAME "ehea" |
42 | #define DRV_VERSION "EHEA_0058" | 42 | #define DRV_VERSION "EHEA_0061" |
43 | 43 | ||
44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | 44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ |
45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) | 45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index f6e0cb1ada1f..152bb2016a2c 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -428,7 +428,7 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev, | |||
428 | } | 428 | } |
429 | skb_copy_to_linear_data(skb, ((char*)cqe) + 64, | 429 | skb_copy_to_linear_data(skb, ((char*)cqe) + 64, |
430 | cqe->num_bytes_transfered - 4); | 430 | cqe->num_bytes_transfered - 4); |
431 | ehea_fill_skb(dev, skb, cqe); | 431 | ehea_fill_skb(port->netdev, skb, cqe); |
432 | } else if (rq == 2) { /* RQ2 */ | 432 | } else if (rq == 2) { /* RQ2 */ |
433 | skb = get_skb_by_index(skb_arr_rq2, | 433 | skb = get_skb_by_index(skb_arr_rq2, |
434 | skb_arr_rq2_len, cqe); | 434 | skb_arr_rq2_len, cqe); |
diff --git a/drivers/net/fec_8xx/fec_main.c b/drivers/net/fec_8xx/fec_main.c index 88efe9731bab..e5502af5b8e2 100644 --- a/drivers/net/fec_8xx/fec_main.c +++ b/drivers/net/fec_8xx/fec_main.c | |||
@@ -550,7 +550,7 @@ static int fec_enet_rx_common(struct net_device *dev, int *budget) | |||
550 | skbn = dev_alloc_skb(pkt_len + 2); | 550 | skbn = dev_alloc_skb(pkt_len + 2); |
551 | if (skbn != NULL) { | 551 | if (skbn != NULL) { |
552 | skb_reserve(skbn, 2); /* align IP header */ | 552 | skb_reserve(skbn, 2); /* align IP header */ |
553 | skb_copy_from_linear_data(skb | 553 | skb_copy_from_linear_data(skb, |
554 | skbn->data, | 554 | skbn->data, |
555 | pkt_len); | 555 | pkt_len); |
556 | /* swap */ | 556 | /* swap */ |
diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index 8118a6750b61..8caa591c5649 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c | |||
@@ -3005,7 +3005,7 @@ static int __init hp100_isa_init(void) | |||
3005 | return cards > 0 ? 0 : -ENODEV; | 3005 | return cards > 0 ? 0 : -ENODEV; |
3006 | } | 3006 | } |
3007 | 3007 | ||
3008 | static void __exit hp100_isa_cleanup(void) | 3008 | static void hp100_isa_cleanup(void) |
3009 | { | 3009 | { |
3010 | int i; | 3010 | int i; |
3011 | 3011 | ||
diff --git a/drivers/net/mlx4/alloc.c b/drivers/net/mlx4/alloc.c index dfbd5809d744..f8d63d39f592 100644 --- a/drivers/net/mlx4/alloc.c +++ b/drivers/net/mlx4/alloc.c | |||
@@ -51,8 +51,8 @@ u32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap) | |||
51 | 51 | ||
52 | if (obj < bitmap->max) { | 52 | if (obj < bitmap->max) { |
53 | set_bit(obj, bitmap->table); | 53 | set_bit(obj, bitmap->table); |
54 | bitmap->last = (obj + 1) & (bitmap->max - 1); | ||
54 | obj |= bitmap->top; | 55 | obj |= bitmap->top; |
55 | bitmap->last = obj + 1; | ||
56 | } else | 56 | } else |
57 | obj = -1; | 57 | obj = -1; |
58 | 58 | ||
diff --git a/drivers/net/skfp/smt.c b/drivers/net/skfp/smt.c index fe847800acdc..75afc1f07ba0 100644 --- a/drivers/net/skfp/smt.c +++ b/drivers/net/skfp/smt.c | |||
@@ -1748,7 +1748,7 @@ char *addr_to_string(struct fddi_addr *addr) | |||
1748 | #endif | 1748 | #endif |
1749 | 1749 | ||
1750 | #ifdef AM29K | 1750 | #ifdef AM29K |
1751 | smt_ifconfig(int argc, char *argv[]) | 1751 | int smt_ifconfig(int argc, char *argv[]) |
1752 | { | 1752 | { |
1753 | if (argc >= 2 && !strcmp(argv[0],"opt_bypass") && | 1753 | if (argc >= 2 && !strcmp(argv[0],"opt_bypass") && |
1754 | !strcmp(argv[1],"yes")) { | 1754 | !strcmp(argv[1],"yes")) { |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 832fd69a0e59..adfbe81693a6 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -364,7 +364,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) | |||
364 | /* for SFP-module set SIGDET polarity to low */ | 364 | /* for SFP-module set SIGDET polarity to low */ |
365 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); | 365 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); |
366 | ctrl |= PHY_M_FIB_SIGD_POL; | 366 | ctrl |= PHY_M_FIB_SIGD_POL; |
367 | gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl); | 367 | gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
368 | } | 368 | } |
369 | 369 | ||
370 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); | 370 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); |
@@ -658,7 +658,7 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) | |||
658 | const u8 *addr = hw->dev[port]->dev_addr; | 658 | const u8 *addr = hw->dev[port]->dev_addr; |
659 | 659 | ||
660 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); | 660 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); |
661 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR|GPC_ENA_PAUSE); | 661 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR); |
662 | 662 | ||
663 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); | 663 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); |
664 | 664 | ||
@@ -1432,7 +1432,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
1432 | tcpsum = offset << 16; /* sum start */ | 1432 | tcpsum = offset << 16; /* sum start */ |
1433 | tcpsum |= offset + skb->csum_offset; /* sum write */ | 1433 | tcpsum |= offset + skb->csum_offset; /* sum write */ |
1434 | 1434 | ||
1435 | ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; | 1435 | ctrl |= CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; |
1436 | if (ip_hdr(skb)->protocol == IPPROTO_UDP) | 1436 | if (ip_hdr(skb)->protocol == IPPROTO_UDP) |
1437 | ctrl |= UDPTCP; | 1437 | ctrl |= UDPTCP; |
1438 | 1438 | ||
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 5efb5afc45ba..b8c4a3b5eadf 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -1149,7 +1149,7 @@ enum { | |||
1149 | PHY_M_IS_JABBER = 1<<0, /* Jabber */ | 1149 | PHY_M_IS_JABBER = 1<<0, /* Jabber */ |
1150 | 1150 | ||
1151 | PHY_M_DEF_MSK = PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE | 1151 | PHY_M_DEF_MSK = PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE |
1152 | | PHY_M_IS_FIFO_ERROR, | 1152 | | PHY_M_IS_DUP_CHANGE, |
1153 | PHY_M_AN_MSK = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL, | 1153 | PHY_M_AN_MSK = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL, |
1154 | }; | 1154 | }; |
1155 | 1155 | ||
@@ -1732,28 +1732,6 @@ enum { | |||
1732 | 1732 | ||
1733 | /* GPHY_CTRL 32 bit GPHY Control Reg (YUKON only) */ | 1733 | /* GPHY_CTRL 32 bit GPHY Control Reg (YUKON only) */ |
1734 | enum { | 1734 | enum { |
1735 | GPC_SEL_BDT = 1<<28, /* Select Bi-Dir. Transfer for MDC/MDIO */ | ||
1736 | GPC_INT_POL_HI = 1<<27, /* IRQ Polarity is Active HIGH */ | ||
1737 | GPC_75_OHM = 1<<26, /* Use 75 Ohm Termination instead of 50 */ | ||
1738 | GPC_DIS_FC = 1<<25, /* Disable Automatic Fiber/Copper Detection */ | ||
1739 | GPC_DIS_SLEEP = 1<<24, /* Disable Energy Detect */ | ||
1740 | GPC_HWCFG_M_3 = 1<<23, /* HWCFG_MODE[3] */ | ||
1741 | GPC_HWCFG_M_2 = 1<<22, /* HWCFG_MODE[2] */ | ||
1742 | GPC_HWCFG_M_1 = 1<<21, /* HWCFG_MODE[1] */ | ||
1743 | GPC_HWCFG_M_0 = 1<<20, /* HWCFG_MODE[0] */ | ||
1744 | GPC_ANEG_0 = 1<<19, /* ANEG[0] */ | ||
1745 | GPC_ENA_XC = 1<<18, /* Enable MDI crossover */ | ||
1746 | GPC_DIS_125 = 1<<17, /* Disable 125 MHz clock */ | ||
1747 | GPC_ANEG_3 = 1<<16, /* ANEG[3] */ | ||
1748 | GPC_ANEG_2 = 1<<15, /* ANEG[2] */ | ||
1749 | GPC_ANEG_1 = 1<<14, /* ANEG[1] */ | ||
1750 | GPC_ENA_PAUSE = 1<<13, /* Enable Pause (SYM_OR_REM) */ | ||
1751 | GPC_PHYADDR_4 = 1<<12, /* Bit 4 of Phy Addr */ | ||
1752 | GPC_PHYADDR_3 = 1<<11, /* Bit 3 of Phy Addr */ | ||
1753 | GPC_PHYADDR_2 = 1<<10, /* Bit 2 of Phy Addr */ | ||
1754 | GPC_PHYADDR_1 = 1<<9, /* Bit 1 of Phy Addr */ | ||
1755 | GPC_PHYADDR_0 = 1<<8, /* Bit 0 of Phy Addr */ | ||
1756 | /* Bits 7..2: reserved */ | ||
1757 | GPC_RST_CLR = 1<<1, /* Clear GPHY Reset */ | 1735 | GPC_RST_CLR = 1<<1, /* Clear GPHY Reset */ |
1758 | GPC_RST_SET = 1<<0, /* Set GPHY Reset */ | 1736 | GPC_RST_SET = 1<<0, /* Set GPHY Reset */ |
1759 | }; | 1737 | }; |
diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c index 246fac0e8001..3df3c60263d4 100644 --- a/drivers/net/wireless/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c | |||
@@ -311,7 +311,7 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
311 | local_info_t *local; | 311 | local_info_t *local; |
312 | struct ieee80211_hdr_4addr *hdr; | 312 | struct ieee80211_hdr_4addr *hdr; |
313 | u16 fc; | 313 | u16 fc; |
314 | int hdr_len, res; | 314 | int prefix_len, postfix_len, hdr_len, res; |
315 | 315 | ||
316 | iface = netdev_priv(skb->dev); | 316 | iface = netdev_priv(skb->dev); |
317 | local = iface->local; | 317 | local = iface->local; |
@@ -337,10 +337,13 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
337 | if (skb == NULL) | 337 | if (skb == NULL) |
338 | return NULL; | 338 | return NULL; |
339 | 339 | ||
340 | if ((skb_headroom(skb) < crypt->ops->extra_mpdu_prefix_len || | 340 | prefix_len = crypt->ops->extra_mpdu_prefix_len + |
341 | skb_tailroom(skb) < crypt->ops->extra_mpdu_postfix_len) && | 341 | crypt->ops->extra_msdu_prefix_len; |
342 | pskb_expand_head(skb, crypt->ops->extra_mpdu_prefix_len, | 342 | postfix_len = crypt->ops->extra_mpdu_postfix_len + |
343 | crypt->ops->extra_mpdu_postfix_len, GFP_ATOMIC)) { | 343 | crypt->ops->extra_msdu_postfix_len; |
344 | if ((skb_headroom(skb) < prefix_len || | ||
345 | skb_tailroom(skb) < postfix_len) && | ||
346 | pskb_expand_head(skb, prefix_len, postfix_len, GFP_ATOMIC)) { | ||
344 | kfree_skb(skb); | 347 | kfree_skb(skb); |
345 | return NULL; | 348 | return NULL; |
346 | } | 349 | } |
diff --git a/drivers/net/wireless/prism54/islpci_eth.c b/drivers/net/wireless/prism54/islpci_eth.c index dd070cccf324..f49eb068c7d0 100644 --- a/drivers/net/wireless/prism54/islpci_eth.c +++ b/drivers/net/wireless/prism54/islpci_eth.c | |||
@@ -378,9 +378,10 @@ islpci_eth_receive(islpci_private *priv) | |||
378 | display_buffer((char *) skb->data, skb->len); | 378 | display_buffer((char *) skb->data, skb->len); |
379 | #endif | 379 | #endif |
380 | /* take care of monitor mode and spy monitoring. */ | 380 | /* take care of monitor mode and spy monitoring. */ |
381 | if (unlikely(priv->iw_mode == IW_MODE_MONITOR)) | 381 | if (unlikely(priv->iw_mode == IW_MODE_MONITOR)) { |
382 | skb->dev = ndev; | ||
382 | discard = islpci_monitor_rx(priv, &skb); | 383 | discard = islpci_monitor_rx(priv, &skb); |
383 | else { | 384 | } else { |
384 | if (unlikely(skb->data[2 * ETH_ALEN] == 0)) { | 385 | if (unlikely(skb->data[2 * ETH_ALEN] == 0)) { |
385 | /* The packet has a rx_annex. Read it for spy monitoring, Then | 386 | /* The packet has a rx_annex. Read it for spy monitoring, Then |
386 | * remove it, while keeping the 2 leading MAC addr. | 387 | * remove it, while keeping the 2 leading MAC addr. |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index d9cbd586ae4b..be1df85e5e2d 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -15,10 +15,10 @@ | |||
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <linux/proc_fs.h> | 16 | #include <linux/proc_fs.h> |
17 | #include <linux/msi.h> | 17 | #include <linux/msi.h> |
18 | #include <linux/smp.h> | ||
18 | 19 | ||
19 | #include <asm/errno.h> | 20 | #include <asm/errno.h> |
20 | #include <asm/io.h> | 21 | #include <asm/io.h> |
21 | #include <asm/smp.h> | ||
22 | 22 | ||
23 | #include "pci.h" | 23 | #include "pci.h" |
24 | #include "msi.h" | 24 | #include "msi.h" |
@@ -333,7 +333,7 @@ static int msi_capability_init(struct pci_dev *dev) | |||
333 | msi_mask_bits_reg(pos, is_64bit_address(control)), | 333 | msi_mask_bits_reg(pos, is_64bit_address(control)), |
334 | maskbits); | 334 | maskbits); |
335 | } | 335 | } |
336 | list_add(&entry->list, &dev->msi_list); | 336 | list_add_tail(&entry->list, &dev->msi_list); |
337 | 337 | ||
338 | /* Configure MSI capability structure */ | 338 | /* Configure MSI capability structure */ |
339 | ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI); | 339 | ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI); |
@@ -404,7 +404,7 @@ static int msix_capability_init(struct pci_dev *dev, | |||
404 | entry->dev = dev; | 404 | entry->dev = dev; |
405 | entry->mask_base = base; | 405 | entry->mask_base = base; |
406 | 406 | ||
407 | list_add(&entry->list, &dev->msi_list); | 407 | list_add_tail(&entry->list, &dev->msi_list); |
408 | } | 408 | } |
409 | 409 | ||
410 | ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX); | 410 | ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX); |
@@ -558,12 +558,12 @@ static int msi_free_irqs(struct pci_dev* dev) | |||
558 | 558 | ||
559 | list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) { | 559 | list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) { |
560 | if (entry->msi_attrib.type == PCI_CAP_ID_MSIX) { | 560 | if (entry->msi_attrib.type == PCI_CAP_ID_MSIX) { |
561 | if (list_is_last(&entry->list, &dev->msi_list)) | ||
562 | iounmap(entry->mask_base); | ||
563 | |||
564 | writel(1, entry->mask_base + entry->msi_attrib.entry_nr | 561 | writel(1, entry->mask_base + entry->msi_attrib.entry_nr |
565 | * PCI_MSIX_ENTRY_SIZE | 562 | * PCI_MSIX_ENTRY_SIZE |
566 | + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); | 563 | + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); |
564 | |||
565 | if (list_is_last(&entry->list, &dev->msi_list)) | ||
566 | iounmap(entry->mask_base); | ||
567 | } | 567 | } |
568 | list_del(&entry->list); | 568 | list_del(&entry->list); |
569 | kfree(entry); | 569 | kfree(entry); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6ccc2e95930a..01d8f8a8843c 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1625,18 +1625,22 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | |||
1625 | quirk_nvidia_ck804_pcie_aer_ext_cap); | 1625 | quirk_nvidia_ck804_pcie_aer_ext_cap); |
1626 | 1626 | ||
1627 | #ifdef CONFIG_PCI_MSI | 1627 | #ifdef CONFIG_PCI_MSI |
1628 | /* The Serverworks PCI-X chipset does not support MSI. We cannot easily rely | 1628 | /* Some chipsets do not support MSI. We cannot easily rely on setting |
1629 | * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually | 1629 | * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually |
1630 | * some other busses controlled by the chipset even if Linux is not aware of it. | 1630 | * some other busses controlled by the chipset even if Linux is not |
1631 | * Instead of setting the flag on all busses in the machine, simply disable MSI | 1631 | * aware of it. Instead of setting the flag on all busses in the |
1632 | * globally. | 1632 | * machine, simply disable MSI globally. |
1633 | */ | 1633 | */ |
1634 | static void __init quirk_svw_msi(struct pci_dev *dev) | 1634 | static void __init quirk_disable_all_msi(struct pci_dev *dev) |
1635 | { | 1635 | { |
1636 | pci_no_msi(); | 1636 | pci_no_msi(); |
1637 | printk(KERN_WARNING "PCI: MSI quirk detected. MSI deactivated.\n"); | 1637 | printk(KERN_WARNING "PCI: MSI quirk detected. MSI deactivated.\n"); |
1638 | } | 1638 | } |
1639 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi); | 1639 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi); |
1640 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000_PCIX, quirk_disable_all_msi); | ||
1641 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi); | ||
1642 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi); | ||
1643 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi); | ||
1640 | 1644 | ||
1641 | /* Disable MSI on chipsets that are known to not support it */ | 1645 | /* Disable MSI on chipsets that are known to not support it */ |
1642 | static void __devinit quirk_disable_msi(struct pci_dev *dev) | 1646 | static void __devinit quirk_disable_msi(struct pci_dev *dev) |
@@ -1649,8 +1653,6 @@ static void __devinit quirk_disable_msi(struct pci_dev *dev) | |||
1649 | } | 1653 | } |
1650 | } | 1654 | } |
1651 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); | 1655 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); |
1652 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_msi); | ||
1653 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_msi); | ||
1654 | 1656 | ||
1655 | /* Go through the list of Hypertransport capabilities and | 1657 | /* Go through the list of Hypertransport capabilities and |
1656 | * return 1 if a HT MSI capability is found and enabled */ | 1658 | * return 1 if a HT MSI capability is found and enabled */ |
diff --git a/drivers/pci/search.c b/drivers/pci/search.c index b137a27472c7..c13232435dc0 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c | |||
@@ -403,10 +403,11 @@ const struct pci_device_id *pci_find_present(const struct pci_device_id *ids) | |||
403 | while (ids->vendor || ids->subvendor || ids->class_mask) { | 403 | while (ids->vendor || ids->subvendor || ids->class_mask) { |
404 | list_for_each_entry(dev, &pci_devices, global_list) { | 404 | list_for_each_entry(dev, &pci_devices, global_list) { |
405 | if ((found = pci_match_one_device(ids, dev)) != NULL) | 405 | if ((found = pci_match_one_device(ids, dev)) != NULL) |
406 | break; | 406 | goto exit; |
407 | } | 407 | } |
408 | ids++; | 408 | ids++; |
409 | } | 409 | } |
410 | exit: | ||
410 | up_read(&pci_bus_sem); | 411 | up_read(&pci_bus_sem); |
411 | return found; | 412 | return found; |
412 | } | 413 | } |
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 948efc775a78..eb6abd3f9221 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c | |||
@@ -336,16 +336,21 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
336 | enable_irq_wake(board->det_pin); | 336 | enable_irq_wake(board->det_pin); |
337 | if (board->irq_pin) | 337 | if (board->irq_pin) |
338 | enable_irq_wake(board->irq_pin); | 338 | enable_irq_wake(board->irq_pin); |
339 | } else { | ||
340 | disable_irq_wake(board->det_pin); | ||
341 | if (board->irq_pin) | ||
342 | disable_irq_wake(board->irq_pin); | ||
343 | } | 339 | } |
344 | return 0; | 340 | return 0; |
345 | } | 341 | } |
346 | 342 | ||
347 | static int at91_cf_resume(struct platform_device *pdev) | 343 | static int at91_cf_resume(struct platform_device *pdev) |
348 | { | 344 | { |
345 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); | ||
346 | struct at91_cf_data *board = cf->board; | ||
347 | |||
348 | if (device_may_wakeup(&pdev->dev)) { | ||
349 | disable_irq_wake(board->det_pin); | ||
350 | if (board->irq_pin) | ||
351 | disable_irq_wake(board->irq_pin); | ||
352 | } | ||
353 | |||
349 | pcmcia_socket_dev_resume(&pdev->dev); | 354 | pcmcia_socket_dev_resume(&pdev->dev); |
350 | return 0; | 355 | return 0; |
351 | } | 356 | } |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 6085261aa2c1..e24ea82dc35b 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -641,9 +641,16 @@ cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | |||
641 | * drivers can't provide shutdown() methods to disable IRQs. | 641 | * drivers can't provide shutdown() methods to disable IRQs. |
642 | * Or better yet, fix PNP to allow those methods... | 642 | * Or better yet, fix PNP to allow those methods... |
643 | */ | 643 | */ |
644 | return cmos_do_probe(&pnp->dev, | 644 | if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0)) |
645 | &pnp->res.port_resource[0], | 645 | /* Some machines contain a PNP entry for the RTC, but |
646 | pnp->res.irq_resource[0].start); | 646 | * don't define the IRQ. It should always be safe to |
647 | * hardcode it in these cases | ||
648 | */ | ||
649 | return cmos_do_probe(&pnp->dev, &pnp->res.port_resource[0], 8); | ||
650 | else | ||
651 | return cmos_do_probe(&pnp->dev, | ||
652 | &pnp->res.port_resource[0], | ||
653 | pnp->res.irq_resource[0].start); | ||
647 | } | 654 | } |
648 | 655 | ||
649 | static void __exit cmos_pnp_remove(struct pnp_dev *pnp) | 656 | static void __exit cmos_pnp_remove(struct pnp_dev *pnp) |
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index a1dc8c466ec9..0c081a664ee8 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -14,9 +14,9 @@ | |||
14 | #include <linux/moduleparam.h> | 14 | #include <linux/moduleparam.h> |
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/poll.h> | 16 | #include <linux/poll.h> |
17 | #include <linux/mutex.h> | ||
17 | 18 | ||
18 | #include <asm/uaccess.h> | 19 | #include <asm/uaccess.h> |
19 | #include <asm/semaphore.h> | ||
20 | #include <asm/atomic.h> | 20 | #include <asm/atomic.h> |
21 | #include <asm/ebcdic.h> | 21 | #include <asm/ebcdic.h> |
22 | 22 | ||
@@ -514,7 +514,7 @@ void dasd_eer_disable(struct dasd_device *device) | |||
514 | * to transfer in a readbuffer, which is protected by the readbuffer_mutex. | 514 | * to transfer in a readbuffer, which is protected by the readbuffer_mutex. |
515 | */ | 515 | */ |
516 | static char readbuffer[PAGE_SIZE]; | 516 | static char readbuffer[PAGE_SIZE]; |
517 | static DECLARE_MUTEX(readbuffer_mutex); | 517 | static DEFINE_MUTEX(readbuffer_mutex); |
518 | 518 | ||
519 | static int dasd_eer_open(struct inode *inp, struct file *filp) | 519 | static int dasd_eer_open(struct inode *inp, struct file *filp) |
520 | { | 520 | { |
@@ -579,7 +579,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
579 | struct eerbuffer *eerb; | 579 | struct eerbuffer *eerb; |
580 | 580 | ||
581 | eerb = (struct eerbuffer *) filp->private_data; | 581 | eerb = (struct eerbuffer *) filp->private_data; |
582 | if (down_interruptible(&readbuffer_mutex)) | 582 | if (mutex_lock_interruptible(&readbuffer_mutex)) |
583 | return -ERESTARTSYS; | 583 | return -ERESTARTSYS; |
584 | 584 | ||
585 | spin_lock_irqsave(&bufferlock, flags); | 585 | spin_lock_irqsave(&bufferlock, flags); |
@@ -588,7 +588,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
588 | /* has been deleted */ | 588 | /* has been deleted */ |
589 | eerb->residual = 0; | 589 | eerb->residual = 0; |
590 | spin_unlock_irqrestore(&bufferlock, flags); | 590 | spin_unlock_irqrestore(&bufferlock, flags); |
591 | up(&readbuffer_mutex); | 591 | mutex_unlock(&readbuffer_mutex); |
592 | return -EIO; | 592 | return -EIO; |
593 | } else if (eerb->residual > 0) { | 593 | } else if (eerb->residual > 0) { |
594 | /* OK we still have a second half of a record to deliver */ | 594 | /* OK we still have a second half of a record to deliver */ |
@@ -602,7 +602,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
602 | if (!tc) { | 602 | if (!tc) { |
603 | /* no data available */ | 603 | /* no data available */ |
604 | spin_unlock_irqrestore(&bufferlock, flags); | 604 | spin_unlock_irqrestore(&bufferlock, flags); |
605 | up(&readbuffer_mutex); | 605 | mutex_unlock(&readbuffer_mutex); |
606 | if (filp->f_flags & O_NONBLOCK) | 606 | if (filp->f_flags & O_NONBLOCK) |
607 | return -EAGAIN; | 607 | return -EAGAIN; |
608 | rc = wait_event_interruptible( | 608 | rc = wait_event_interruptible( |
@@ -610,7 +610,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
610 | eerb->head != eerb->tail); | 610 | eerb->head != eerb->tail); |
611 | if (rc) | 611 | if (rc) |
612 | return rc; | 612 | return rc; |
613 | if (down_interruptible(&readbuffer_mutex)) | 613 | if (mutex_lock_interruptible(&readbuffer_mutex)) |
614 | return -ERESTARTSYS; | 614 | return -ERESTARTSYS; |
615 | spin_lock_irqsave(&bufferlock, flags); | 615 | spin_lock_irqsave(&bufferlock, flags); |
616 | } | 616 | } |
@@ -626,11 +626,11 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
626 | spin_unlock_irqrestore(&bufferlock, flags); | 626 | spin_unlock_irqrestore(&bufferlock, flags); |
627 | 627 | ||
628 | if (copy_to_user(buf, readbuffer, effective_count)) { | 628 | if (copy_to_user(buf, readbuffer, effective_count)) { |
629 | up(&readbuffer_mutex); | 629 | mutex_unlock(&readbuffer_mutex); |
630 | return -EFAULT; | 630 | return -EFAULT; |
631 | } | 631 | } |
632 | 632 | ||
633 | up(&readbuffer_mutex); | 633 | mutex_unlock(&readbuffer_mutex); |
634 | return effective_count; | 634 | return effective_count; |
635 | } | 635 | } |
636 | 636 | ||
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index f6ef90ee3e7d..743944ad61ec 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
@@ -487,7 +487,7 @@ struct raw3270_ua { /* Query Reply structure for Usable Area */ | |||
487 | } __attribute__ ((packed)); | 487 | } __attribute__ ((packed)); |
488 | 488 | ||
489 | static struct diag210 raw3270_init_diag210; | 489 | static struct diag210 raw3270_init_diag210; |
490 | static DECLARE_MUTEX(raw3270_init_sem); | 490 | static DEFINE_MUTEX(raw3270_init_mutex); |
491 | 491 | ||
492 | static int | 492 | static int |
493 | raw3270_init_irq(struct raw3270_view *view, struct raw3270_request *rq, | 493 | raw3270_init_irq(struct raw3270_view *view, struct raw3270_request *rq, |
@@ -713,7 +713,7 @@ raw3270_size_device(struct raw3270 *rp) | |||
713 | { | 713 | { |
714 | int rc; | 714 | int rc; |
715 | 715 | ||
716 | down(&raw3270_init_sem); | 716 | mutex_lock(&raw3270_init_mutex); |
717 | rp->view = &raw3270_init_view; | 717 | rp->view = &raw3270_init_view; |
718 | raw3270_init_view.dev = rp; | 718 | raw3270_init_view.dev = rp; |
719 | if (MACHINE_IS_VM) | 719 | if (MACHINE_IS_VM) |
@@ -722,7 +722,7 @@ raw3270_size_device(struct raw3270 *rp) | |||
722 | rc = __raw3270_size_device(rp); | 722 | rc = __raw3270_size_device(rp); |
723 | raw3270_init_view.dev = NULL; | 723 | raw3270_init_view.dev = NULL; |
724 | rp->view = NULL; | 724 | rp->view = NULL; |
725 | up(&raw3270_init_sem); | 725 | mutex_unlock(&raw3270_init_mutex); |
726 | if (rc == 0) { /* Found something. */ | 726 | if (rc == 0) { /* Found something. */ |
727 | /* Try to find a model. */ | 727 | /* Try to find a model. */ |
728 | rp->model = 0; | 728 | rp->model = 0; |
@@ -749,7 +749,7 @@ raw3270_reset_device(struct raw3270 *rp) | |||
749 | { | 749 | { |
750 | int rc; | 750 | int rc; |
751 | 751 | ||
752 | down(&raw3270_init_sem); | 752 | mutex_lock(&raw3270_init_mutex); |
753 | memset(&rp->init_request, 0, sizeof(rp->init_request)); | 753 | memset(&rp->init_request, 0, sizeof(rp->init_request)); |
754 | memset(&rp->init_data, 0, sizeof(rp->init_data)); | 754 | memset(&rp->init_data, 0, sizeof(rp->init_data)); |
755 | /* Store reset data stream to init_data/init_request */ | 755 | /* Store reset data stream to init_data/init_request */ |
@@ -764,7 +764,7 @@ raw3270_reset_device(struct raw3270 *rp) | |||
764 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); | 764 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); |
765 | raw3270_init_view.dev = NULL; | 765 | raw3270_init_view.dev = NULL; |
766 | rp->view = NULL; | 766 | rp->view = NULL; |
767 | up(&raw3270_init_sem); | 767 | mutex_unlock(&raw3270_init_mutex); |
768 | return rc; | 768 | return rc; |
769 | } | 769 | } |
770 | 770 | ||
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index a8b373f69cf0..6b264bdb5bfb 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -296,30 +296,57 @@ static void ccw_device_unregister(struct ccw_device *cdev) | |||
296 | device_del(&cdev->dev); | 296 | device_del(&cdev->dev); |
297 | } | 297 | } |
298 | 298 | ||
299 | static void ccw_device_remove_orphan_cb(struct device *dev) | ||
300 | { | ||
301 | struct ccw_device *cdev = to_ccwdev(dev); | ||
302 | |||
303 | ccw_device_unregister(cdev); | ||
304 | put_device(&cdev->dev); | ||
305 | } | ||
306 | |||
307 | static void ccw_device_remove_sch_cb(struct device *dev) | ||
308 | { | ||
309 | struct subchannel *sch; | ||
310 | |||
311 | sch = to_subchannel(dev); | ||
312 | css_sch_device_unregister(sch); | ||
313 | /* Reset intparm to zeroes. */ | ||
314 | sch->schib.pmcw.intparm = 0; | ||
315 | cio_modify(sch); | ||
316 | put_device(&sch->dev); | ||
317 | } | ||
318 | |||
299 | static void | 319 | static void |
300 | ccw_device_remove_disconnected(struct ccw_device *cdev) | 320 | ccw_device_remove_disconnected(struct ccw_device *cdev) |
301 | { | 321 | { |
302 | struct subchannel *sch; | ||
303 | unsigned long flags; | 322 | unsigned long flags; |
323 | int rc; | ||
324 | |||
304 | /* | 325 | /* |
305 | * Forced offline in disconnected state means | 326 | * Forced offline in disconnected state means |
306 | * 'throw away device'. | 327 | * 'throw away device'. |
307 | */ | 328 | */ |
308 | if (ccw_device_is_orphan(cdev)) { | 329 | if (ccw_device_is_orphan(cdev)) { |
309 | /* Deregister ccw device. */ | 330 | /* |
331 | * Deregister ccw device. | ||
332 | * Unfortunately, we cannot do this directly from the | ||
333 | * attribute method. | ||
334 | */ | ||
310 | spin_lock_irqsave(cdev->ccwlock, flags); | 335 | spin_lock_irqsave(cdev->ccwlock, flags); |
311 | cdev->private->state = DEV_STATE_NOT_OPER; | 336 | cdev->private->state = DEV_STATE_NOT_OPER; |
312 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 337 | spin_unlock_irqrestore(cdev->ccwlock, flags); |
313 | ccw_device_unregister(cdev); | 338 | rc = device_schedule_callback(&cdev->dev, |
314 | put_device(&cdev->dev); | 339 | ccw_device_remove_orphan_cb); |
315 | return ; | 340 | if (rc) |
341 | dev_info(&cdev->dev, "Couldn't unregister orphan\n"); | ||
342 | return; | ||
316 | } | 343 | } |
317 | sch = to_subchannel(cdev->dev.parent); | 344 | /* Deregister subchannel, which will kill the ccw device. */ |
318 | css_sch_device_unregister(sch); | 345 | rc = device_schedule_callback(cdev->dev.parent, |
319 | /* Reset intparm to zeroes. */ | 346 | ccw_device_remove_sch_cb); |
320 | sch->schib.pmcw.intparm = 0; | 347 | if (rc) |
321 | cio_modify(sch); | 348 | dev_info(&cdev->dev, |
322 | put_device(&sch->dev); | 349 | "Couldn't unregister disconnected device\n"); |
323 | } | 350 | } |
324 | 351 | ||
325 | int | 352 | int |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 898ec3b2bebb..6bba80929577 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -688,6 +688,12 @@ ccw_device_disband_done(struct ccw_device *cdev, int err) | |||
688 | ccw_device_done(cdev, DEV_STATE_BOXED); | 688 | ccw_device_done(cdev, DEV_STATE_BOXED); |
689 | break; | 689 | break; |
690 | default: | 690 | default: |
691 | cdev->private->flags.donotify = 0; | ||
692 | if (get_device(&cdev->dev)) { | ||
693 | PREPARE_WORK(&cdev->private->kick_work, | ||
694 | ccw_device_call_sch_unregister); | ||
695 | queue_work(ccw_device_work, &cdev->private->kick_work); | ||
696 | } | ||
691 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); | 697 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); |
692 | break; | 698 | break; |
693 | } | 699 | } |
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index ddff40c4212c..821cde65e369 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -1127,6 +1127,7 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter) | |||
1127 | int retval = 0; | 1127 | int retval = 0; |
1128 | unsigned long flags; | 1128 | unsigned long flags; |
1129 | 1129 | ||
1130 | zfcp_adapter_scsi_unregister(adapter); | ||
1130 | device_unregister(&adapter->generic_services); | 1131 | device_unregister(&adapter->generic_services); |
1131 | zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); | 1132 | zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); |
1132 | dev_set_drvdata(&adapter->ccw_device->dev, NULL); | 1133 | dev_set_drvdata(&adapter->ccw_device->dev, NULL); |
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 81680efa1721..1c8f71a59855 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -189,9 +189,7 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) | |||
189 | * @ccw_device: pointer to belonging ccw device | 189 | * @ccw_device: pointer to belonging ccw device |
190 | * | 190 | * |
191 | * This function gets called by the common i/o layer and sets an adapter | 191 | * This function gets called by the common i/o layer and sets an adapter |
192 | * into state offline. Setting an fcp device offline means that it will be | 192 | * into state offline. |
193 | * unregistered from the SCSI stack and that the adapter will be shut down | ||
194 | * asynchronously. | ||
195 | */ | 193 | */ |
196 | static int | 194 | static int |
197 | zfcp_ccw_set_offline(struct ccw_device *ccw_device) | 195 | zfcp_ccw_set_offline(struct ccw_device *ccw_device) |
@@ -202,7 +200,6 @@ zfcp_ccw_set_offline(struct ccw_device *ccw_device) | |||
202 | adapter = dev_get_drvdata(&ccw_device->dev); | 200 | adapter = dev_get_drvdata(&ccw_device->dev); |
203 | zfcp_erp_adapter_shutdown(adapter, 0); | 201 | zfcp_erp_adapter_shutdown(adapter, 0); |
204 | zfcp_erp_wait(adapter); | 202 | zfcp_erp_wait(adapter); |
205 | zfcp_adapter_scsi_unregister(adapter); | ||
206 | zfcp_erp_thread_kill(adapter); | 203 | zfcp_erp_thread_kill(adapter); |
207 | zfcp_adapter_debug_unregister(adapter); | 204 | zfcp_adapter_debug_unregister(adapter); |
208 | up(&zfcp_data.config_sema); | 205 | up(&zfcp_data.config_sema); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index a8b02542ac2d..0eb31e162b15 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -156,44 +156,30 @@ zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req) | |||
156 | kfree(fsf_req); | 156 | kfree(fsf_req); |
157 | } | 157 | } |
158 | 158 | ||
159 | /** | 159 | /* |
160 | * zfcp_fsf_req_dismiss - dismiss a single fsf request | 160 | * Never ever call this without shutting down the adapter first. |
161 | */ | 161 | * Otherwise the adapter would continue using and corrupting s390 storage. |
162 | static void zfcp_fsf_req_dismiss(struct zfcp_adapter *adapter, | 162 | * Included BUG_ON() call to ensure this is done. |
163 | struct zfcp_fsf_req *fsf_req, | 163 | * ERP is supposed to be the only user of this function. |
164 | unsigned int counter) | ||
165 | { | ||
166 | u64 dbg_tmp[2]; | ||
167 | |||
168 | dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active); | ||
169 | dbg_tmp[1] = (u64) counter; | ||
170 | debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16); | ||
171 | list_del(&fsf_req->list); | ||
172 | fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; | ||
173 | zfcp_fsf_req_complete(fsf_req); | ||
174 | } | ||
175 | |||
176 | /** | ||
177 | * zfcp_fsf_req_dismiss_all - dismiss all remaining fsf requests | ||
178 | */ | 164 | */ |
179 | void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) | 165 | void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) |
180 | { | 166 | { |
181 | struct zfcp_fsf_req *request, *tmp; | 167 | struct zfcp_fsf_req *fsf_req, *tmp; |
182 | unsigned long flags; | 168 | unsigned long flags; |
183 | LIST_HEAD(remove_queue); | 169 | LIST_HEAD(remove_queue); |
184 | unsigned int i, counter; | 170 | unsigned int i; |
185 | 171 | ||
172 | BUG_ON(atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)); | ||
186 | spin_lock_irqsave(&adapter->req_list_lock, flags); | 173 | spin_lock_irqsave(&adapter->req_list_lock, flags); |
187 | atomic_set(&adapter->reqs_active, 0); | 174 | atomic_set(&adapter->reqs_active, 0); |
188 | for (i=0; i<REQUEST_LIST_SIZE; i++) | 175 | for (i = 0; i < REQUEST_LIST_SIZE; i++) |
189 | list_splice_init(&adapter->req_list[i], &remove_queue); | 176 | list_splice_init(&adapter->req_list[i], &remove_queue); |
190 | |||
191 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); | 177 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); |
192 | 178 | ||
193 | counter = 0; | 179 | list_for_each_entry_safe(fsf_req, tmp, &remove_queue, list) { |
194 | list_for_each_entry_safe(request, tmp, &remove_queue, list) { | 180 | list_del(&fsf_req->list); |
195 | zfcp_fsf_req_dismiss(adapter, request, counter); | 181 | fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; |
196 | counter++; | 182 | zfcp_fsf_req_complete(fsf_req); |
197 | } | 183 | } |
198 | } | 184 | } |
199 | 185 | ||
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 16e2d64658af..0acf6db0a08d 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -569,6 +569,9 @@ zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) | |||
569 | int retval = 0; | 569 | int retval = 0; |
570 | static unsigned int unique_id = 0; | 570 | static unsigned int unique_id = 0; |
571 | 571 | ||
572 | if (adapter->scsi_host) | ||
573 | goto out; | ||
574 | |||
572 | /* register adapter as SCSI host with mid layer of SCSI stack */ | 575 | /* register adapter as SCSI host with mid layer of SCSI stack */ |
573 | adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template, | 576 | adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template, |
574 | sizeof (struct zfcp_adapter *)); | 577 | sizeof (struct zfcp_adapter *)); |
diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c index 262f01e68592..44e039865aa9 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/smp_lock.h> | 15 | #include <linux/smp_lock.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/mm.h> | ||
17 | 18 | ||
18 | #include <asm/system.h> | 19 | #include <asm/system.h> |
19 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index d28c14e23c32..572034ceb143 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -1753,23 +1753,9 @@ config SUN3X_ESP | |||
1753 | The ESP was an on-board SCSI controller used on Sun 3/80 | 1753 | The ESP was an on-board SCSI controller used on Sun 3/80 |
1754 | machines. Say Y here to compile in support for it. | 1754 | machines. Say Y here to compile in support for it. |
1755 | 1755 | ||
1756 | config SCSI_ESP_CORE | ||
1757 | tristate "ESP Scsi Driver Core" | ||
1758 | depends on SCSI | ||
1759 | select SCSI_SPI_ATTRS | ||
1760 | help | ||
1761 | This is a core driver for NCR53c9x based scsi chipsets, | ||
1762 | also known as "ESP" for Emulex Scsi Processor or | ||
1763 | Enhanced Scsi Processor. This driver does not exist by | ||
1764 | itself, there are front-end drivers which, when enabled, | ||
1765 | select and enable this driver. One example is SCSI_SUNESP. | ||
1766 | These front-end drivers provide probing, DMA, and register | ||
1767 | access support for the core driver. | ||
1768 | |||
1769 | config SCSI_SUNESP | 1756 | config SCSI_SUNESP |
1770 | tristate "Sparc ESP Scsi Driver" | 1757 | tristate "Sparc ESP Scsi Driver" |
1771 | depends on SBUS && SCSI | 1758 | depends on SBUS && SCSI |
1772 | select SCSI_ESP_CORE | ||
1773 | help | 1759 | help |
1774 | This is the driver for the Sun ESP SCSI host adapter. The ESP | 1760 | This is the driver for the Sun ESP SCSI host adapter. The ESP |
1775 | chipset is present in most SPARC SBUS-based computers. | 1761 | chipset is present in most SPARC SBUS-based computers. |
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 51e884fa10b0..b1b632791580 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile | |||
@@ -106,8 +106,7 @@ obj-$(CONFIG_MEGARAID_LEGACY) += megaraid.o | |||
106 | obj-$(CONFIG_MEGARAID_NEWGEN) += megaraid/ | 106 | obj-$(CONFIG_MEGARAID_NEWGEN) += megaraid/ |
107 | obj-$(CONFIG_MEGARAID_SAS) += megaraid/ | 107 | obj-$(CONFIG_MEGARAID_SAS) += megaraid/ |
108 | obj-$(CONFIG_SCSI_ACARD) += atp870u.o | 108 | obj-$(CONFIG_SCSI_ACARD) += atp870u.o |
109 | obj-$(CONFIG_SCSI_ESP_CORE) += esp_scsi.o | 109 | obj-$(CONFIG_SCSI_SUNESP) += esp_scsi.o sun_esp.o |
110 | obj-$(CONFIG_SCSI_SUNESP) += sun_esp.o | ||
111 | obj-$(CONFIG_SCSI_GDTH) += gdth.o | 110 | obj-$(CONFIG_SCSI_GDTH) += gdth.o |
112 | obj-$(CONFIG_SCSI_INITIO) += initio.o | 111 | obj-$(CONFIG_SCSI_INITIO) += initio.o |
113 | obj-$(CONFIG_SCSI_INIA100) += a100u2w.o | 112 | obj-$(CONFIG_SCSI_INIA100) += a100u2w.o |
@@ -121,7 +120,7 @@ obj-$(CONFIG_BLK_DEV_3W_XXXX_RAID) += 3w-xxxx.o | |||
121 | obj-$(CONFIG_SCSI_3W_9XXX) += 3w-9xxx.o | 120 | obj-$(CONFIG_SCSI_3W_9XXX) += 3w-9xxx.o |
122 | obj-$(CONFIG_SCSI_PPA) += ppa.o | 121 | obj-$(CONFIG_SCSI_PPA) += ppa.o |
123 | obj-$(CONFIG_SCSI_IMM) += imm.o | 122 | obj-$(CONFIG_SCSI_IMM) += imm.o |
124 | obj-$(CONFIG_JAZZ_ESP) += NCR53C9x.o jazz_esp.o | 123 | obj-$(CONFIG_JAZZ_ESP) += esp_scsi.o jazz_esp.o |
125 | obj-$(CONFIG_SUN3X_ESP) += NCR53C9x.o sun3x_esp.o | 124 | obj-$(CONFIG_SUN3X_ESP) += NCR53C9x.o sun3x_esp.o |
126 | obj-$(CONFIG_SCSI_FCAL) += fcal.o | 125 | obj-$(CONFIG_SCSI_FCAL) += fcal.o |
127 | obj-$(CONFIG_SCSI_LASI700) += 53c700.o lasi700.o | 126 | obj-$(CONFIG_SCSI_LASI700) += 53c700.o lasi700.o |
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index bb3cb3360541..88ea5a1fb606 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c | |||
@@ -2625,7 +2625,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) { | |||
2625 | #ifdef REAL_DMA | 2625 | #ifdef REAL_DMA |
2626 | static void NCR5380_dma_complete(NCR5380_instance * instance) { | 2626 | static void NCR5380_dma_complete(NCR5380_instance * instance) { |
2627 | NCR5380_local_declare(); | 2627 | NCR5380_local_declare(); |
2628 | struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata * instance->hostdata); | 2628 | struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; |
2629 | int transferred; | 2629 | int transferred; |
2630 | NCR5380_setup(instance); | 2630 | NCR5380_setup(instance); |
2631 | 2631 | ||
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 1e82c69b36b0..8dcfe4ec35c2 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -146,7 +146,7 @@ static char *aac_get_status_string(u32 status); | |||
146 | static int nondasd = -1; | 146 | static int nondasd = -1; |
147 | static int dacmode = -1; | 147 | static int dacmode = -1; |
148 | 148 | ||
149 | static int commit = -1; | 149 | int aac_commit = -1; |
150 | int startup_timeout = 180; | 150 | int startup_timeout = 180; |
151 | int aif_timeout = 120; | 151 | int aif_timeout = 120; |
152 | 152 | ||
@@ -154,7 +154,7 @@ module_param(nondasd, int, S_IRUGO|S_IWUSR); | |||
154 | MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); | 154 | MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); |
155 | module_param(dacmode, int, S_IRUGO|S_IWUSR); | 155 | module_param(dacmode, int, S_IRUGO|S_IWUSR); |
156 | MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); | 156 | MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); |
157 | module_param(commit, int, S_IRUGO|S_IWUSR); | 157 | module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR); |
158 | MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); | 158 | MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); |
159 | module_param(startup_timeout, int, S_IRUGO|S_IWUSR); | 159 | module_param(startup_timeout, int, S_IRUGO|S_IWUSR); |
160 | MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); | 160 | MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); |
@@ -173,6 +173,9 @@ int expose_physicals = -1; | |||
173 | module_param(expose_physicals, int, S_IRUGO|S_IWUSR); | 173 | module_param(expose_physicals, int, S_IRUGO|S_IWUSR); |
174 | MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on"); | 174 | MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on"); |
175 | 175 | ||
176 | int aac_reset_devices = 0; | ||
177 | module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR); | ||
178 | MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization."); | ||
176 | 179 | ||
177 | static inline int aac_valid_context(struct scsi_cmnd *scsicmd, | 180 | static inline int aac_valid_context(struct scsi_cmnd *scsicmd, |
178 | struct fib *fibptr) { | 181 | struct fib *fibptr) { |
@@ -246,7 +249,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) | |||
246 | aac_fib_complete(fibptr); | 249 | aac_fib_complete(fibptr); |
247 | /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ | 250 | /* Send a CT_COMMIT_CONFIG to enable discovery of devices */ |
248 | if (status >= 0) { | 251 | if (status >= 0) { |
249 | if ((commit == 1) || commit_flag) { | 252 | if ((aac_commit == 1) || commit_flag) { |
250 | struct aac_commit_config * dinfo; | 253 | struct aac_commit_config * dinfo; |
251 | aac_fib_init(fibptr); | 254 | aac_fib_init(fibptr); |
252 | dinfo = (struct aac_commit_config *) fib_data(fibptr); | 255 | dinfo = (struct aac_commit_config *) fib_data(fibptr); |
@@ -261,7 +264,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) | |||
261 | 1, 1, | 264 | 1, 1, |
262 | NULL, NULL); | 265 | NULL, NULL); |
263 | aac_fib_complete(fibptr); | 266 | aac_fib_complete(fibptr); |
264 | } else if (commit == 0) { | 267 | } else if (aac_commit == 0) { |
265 | printk(KERN_WARNING | 268 | printk(KERN_WARNING |
266 | "aac_get_config_status: Foreign device configurations are being ignored\n"); | 269 | "aac_get_config_status: Foreign device configurations are being ignored\n"); |
267 | } | 270 | } |
@@ -340,7 +343,7 @@ int aac_get_containers(struct aac_dev *dev) | |||
340 | static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigned int offset, unsigned int len) | 343 | static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigned int offset, unsigned int len) |
341 | { | 344 | { |
342 | void *buf; | 345 | void *buf; |
343 | unsigned int transfer_len; | 346 | int transfer_len; |
344 | struct scatterlist *sg = scsicmd->request_buffer; | 347 | struct scatterlist *sg = scsicmd->request_buffer; |
345 | 348 | ||
346 | if (scsicmd->use_sg) { | 349 | if (scsicmd->use_sg) { |
@@ -351,7 +354,7 @@ static void aac_internal_transfer(struct scsi_cmnd *scsicmd, void *data, unsigne | |||
351 | transfer_len = min(scsicmd->request_bufflen, len + offset); | 354 | transfer_len = min(scsicmd->request_bufflen, len + offset); |
352 | } | 355 | } |
353 | transfer_len -= offset; | 356 | transfer_len -= offset; |
354 | if (buf && transfer_len) | 357 | if (buf && transfer_len > 0) |
355 | memcpy(buf + offset, data, transfer_len); | 358 | memcpy(buf + offset, data, transfer_len); |
356 | 359 | ||
357 | if (scsicmd->use_sg) | 360 | if (scsicmd->use_sg) |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 45ca3e801619..c81edf36913f 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -1823,9 +1823,12 @@ int aac_send_shutdown(struct aac_dev *dev); | |||
1823 | int aac_probe_container(struct aac_dev *dev, int cid); | 1823 | int aac_probe_container(struct aac_dev *dev, int cid); |
1824 | int _aac_rx_init(struct aac_dev *dev); | 1824 | int _aac_rx_init(struct aac_dev *dev); |
1825 | int aac_rx_select_comm(struct aac_dev *dev, int comm); | 1825 | int aac_rx_select_comm(struct aac_dev *dev, int comm); |
1826 | int aac_rx_deliver_producer(struct fib * fib); | ||
1826 | extern int numacb; | 1827 | extern int numacb; |
1827 | extern int acbsize; | 1828 | extern int acbsize; |
1828 | extern char aac_driver_version[]; | 1829 | extern char aac_driver_version[]; |
1829 | extern int startup_timeout; | 1830 | extern int startup_timeout; |
1830 | extern int aif_timeout; | 1831 | extern int aif_timeout; |
1831 | extern int expose_physicals; | 1832 | extern int expose_physicals; |
1833 | extern int aac_reset_devices; | ||
1834 | extern int aac_commit; | ||
diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index 291cd14f4e98..ae978a373c56 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c | |||
@@ -378,7 +378,7 @@ static int aac_rx_check_health(struct aac_dev *dev) | |||
378 | * | 378 | * |
379 | * Will send a fib, returning 0 if successful. | 379 | * Will send a fib, returning 0 if successful. |
380 | */ | 380 | */ |
381 | static int aac_rx_deliver_producer(struct fib * fib) | 381 | int aac_rx_deliver_producer(struct fib * fib) |
382 | { | 382 | { |
383 | struct aac_dev *dev = fib->dev; | 383 | struct aac_dev *dev = fib->dev; |
384 | struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; | 384 | struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; |
@@ -488,6 +488,8 @@ static int aac_rx_restart_adapter(struct aac_dev *dev, int bled) | |||
488 | return -EINVAL; | 488 | return -EINVAL; |
489 | if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) | 489 | if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) |
490 | return -ENODEV; | 490 | return -ENODEV; |
491 | if (startup_timeout < 300) | ||
492 | startup_timeout = 300; | ||
491 | return 0; | 493 | return 0; |
492 | } | 494 | } |
493 | 495 | ||
@@ -542,7 +544,7 @@ int _aac_rx_init(struct aac_dev *dev) | |||
542 | dev->a_ops.adapter_sync_cmd = rx_sync_cmd; | 544 | dev->a_ops.adapter_sync_cmd = rx_sync_cmd; |
543 | dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; | 545 | dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; |
544 | dev->OIMR = status = rx_readb (dev, MUnit.OIMR); | 546 | dev->OIMR = status = rx_readb (dev, MUnit.OIMR); |
545 | if ((((status & 0x0c) != 0x0c) || reset_devices) && | 547 | if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) && |
546 | !aac_rx_restart_adapter(dev, 0)) | 548 | !aac_rx_restart_adapter(dev, 0)) |
547 | ++restart; | 549 | ++restart; |
548 | /* | 550 | /* |
@@ -594,6 +596,8 @@ int _aac_rx_init(struct aac_dev *dev) | |||
594 | } | 596 | } |
595 | msleep(1); | 597 | msleep(1); |
596 | } | 598 | } |
599 | if (restart) | ||
600 | aac_commit = 1; | ||
597 | /* | 601 | /* |
598 | * Fill in the common function dispatch table. | 602 | * Fill in the common function dispatch table. |
599 | */ | 603 | */ |
diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c index f4b5e9742ab0..85b91bc578c9 100644 --- a/drivers/scsi/aacraid/sa.c +++ b/drivers/scsi/aacraid/sa.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
@@ -257,6 +257,11 @@ static void aac_sa_start_adapter(struct aac_dev *dev) | |||
257 | NULL, NULL, NULL, NULL, NULL); | 257 | NULL, NULL, NULL, NULL, NULL); |
258 | } | 258 | } |
259 | 259 | ||
260 | static int aac_sa_restart_adapter(struct aac_dev *dev, int bled) | ||
261 | { | ||
262 | return -EINVAL; | ||
263 | } | ||
264 | |||
260 | /** | 265 | /** |
261 | * aac_sa_check_health | 266 | * aac_sa_check_health |
262 | * @dev: device to check if healthy | 267 | * @dev: device to check if healthy |
@@ -366,7 +371,9 @@ int aac_sa_init(struct aac_dev *dev) | |||
366 | dev->a_ops.adapter_notify = aac_sa_notify_adapter; | 371 | dev->a_ops.adapter_notify = aac_sa_notify_adapter; |
367 | dev->a_ops.adapter_sync_cmd = sa_sync_cmd; | 372 | dev->a_ops.adapter_sync_cmd = sa_sync_cmd; |
368 | dev->a_ops.adapter_check_health = aac_sa_check_health; | 373 | dev->a_ops.adapter_check_health = aac_sa_check_health; |
374 | dev->a_ops.adapter_restart = aac_sa_restart_adapter; | ||
369 | dev->a_ops.adapter_intr = aac_sa_intr; | 375 | dev->a_ops.adapter_intr = aac_sa_intr; |
376 | dev->a_ops.adapter_deliver = aac_rx_deliver_producer; | ||
370 | dev->a_ops.adapter_ioremap = aac_sa_ioremap; | 377 | dev->a_ops.adapter_ioremap = aac_sa_ioremap; |
371 | 378 | ||
372 | /* | 379 | /* |
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 9ddc6e4a74b0..05f692bd0adc 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
@@ -5180,7 +5180,7 @@ ahd_handle_devreset(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, | |||
5180 | cur_lun = lun; | 5180 | cur_lun = lun; |
5181 | max_lun = lun; | 5181 | max_lun = lun; |
5182 | } | 5182 | } |
5183 | for (cur_lun <= max_lun; cur_lun++) { | 5183 | for (;cur_lun <= max_lun; cur_lun++) { |
5184 | struct ahd_tmode_lstate* lstate; | 5184 | struct ahd_tmode_lstate* lstate; |
5185 | 5185 | ||
5186 | lstate = tstate->enabled_luns[cur_lun]; | 5186 | lstate = tstate->enabled_luns[cur_lun]; |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y index c328596def3c..6066998ed562 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y | |||
@@ -106,6 +106,7 @@ static void make_expression(expression_t *immed, int value); | |||
106 | static void add_conditional(symbol_t *symbol); | 106 | static void add_conditional(symbol_t *symbol); |
107 | static void add_version(const char *verstring); | 107 | static void add_version(const char *verstring); |
108 | static int is_download_const(expression_t *immed); | 108 | static int is_download_const(expression_t *immed); |
109 | void yyerror(const char *string); | ||
109 | 110 | ||
110 | #define SRAM_SYMNAME "SRAM_BASE" | 111 | #define SRAM_SYMNAME "SRAM_BASE" |
111 | #define SCB_SYMNAME "SCB_BASE" | 112 | #define SCB_SYMNAME "SCB_BASE" |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y index 439f760b34b5..ff46aa6801bf 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y | |||
@@ -65,6 +65,7 @@ | |||
65 | static symbol_t *macro_symbol; | 65 | static symbol_t *macro_symbol; |
66 | 66 | ||
67 | static void add_macro_arg(const char *argtext, int position); | 67 | static void add_macro_arg(const char *argtext, int position); |
68 | void mmerror(const char *string); | ||
68 | 69 | ||
69 | %} | 70 | %} |
70 | 71 | ||
diff --git a/drivers/scsi/aic94xx/aic94xx_tmf.c b/drivers/scsi/aic94xx/aic94xx_tmf.c index 9a14a6d97275..c0d0b7d7a8ce 100644 --- a/drivers/scsi/aic94xx/aic94xx_tmf.c +++ b/drivers/scsi/aic94xx/aic94xx_tmf.c | |||
@@ -290,6 +290,7 @@ static void asd_tmf_tasklet_complete(struct asd_ascb *ascb, | |||
290 | static inline int asd_clear_nexus(struct sas_task *task) | 290 | static inline int asd_clear_nexus(struct sas_task *task) |
291 | { | 291 | { |
292 | int res = TMF_RESP_FUNC_FAILED; | 292 | int res = TMF_RESP_FUNC_FAILED; |
293 | int leftover; | ||
293 | struct asd_ascb *tascb = task->lldd_task; | 294 | struct asd_ascb *tascb = task->lldd_task; |
294 | unsigned long flags; | 295 | unsigned long flags; |
295 | 296 | ||
@@ -298,10 +299,12 @@ static inline int asd_clear_nexus(struct sas_task *task) | |||
298 | res = asd_clear_nexus_tag(task); | 299 | res = asd_clear_nexus_tag(task); |
299 | else | 300 | else |
300 | res = asd_clear_nexus_index(task); | 301 | res = asd_clear_nexus_index(task); |
301 | wait_for_completion_timeout(&tascb->completion, | 302 | leftover = wait_for_completion_timeout(&tascb->completion, |
302 | AIC94XX_SCB_TIMEOUT); | 303 | AIC94XX_SCB_TIMEOUT); |
303 | ASD_DPRINTK("came back from clear nexus\n"); | 304 | ASD_DPRINTK("came back from clear nexus\n"); |
304 | spin_lock_irqsave(&task->task_state_lock, flags); | 305 | spin_lock_irqsave(&task->task_state_lock, flags); |
306 | if (leftover < 1) | ||
307 | res = TMF_RESP_FUNC_FAILED; | ||
305 | if (task->task_state_flags & SAS_TASK_STATE_DONE) | 308 | if (task->task_state_flags & SAS_TASK_STATE_DONE) |
306 | res = TMF_RESP_FUNC_COMPLETE; | 309 | res = TMF_RESP_FUNC_COMPLETE; |
307 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 310 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
@@ -350,6 +353,7 @@ int asd_abort_task(struct sas_task *task) | |||
350 | unsigned long flags; | 353 | unsigned long flags; |
351 | struct asd_ascb *ascb = NULL; | 354 | struct asd_ascb *ascb = NULL; |
352 | struct scb *scb; | 355 | struct scb *scb; |
356 | int leftover; | ||
353 | 357 | ||
354 | spin_lock_irqsave(&task->task_state_lock, flags); | 358 | spin_lock_irqsave(&task->task_state_lock, flags); |
355 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { | 359 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { |
@@ -455,9 +459,11 @@ int asd_abort_task(struct sas_task *task) | |||
455 | break; | 459 | break; |
456 | case TF_TMF_TASK_DONE + 0xFF00: /* done but not reported yet */ | 460 | case TF_TMF_TASK_DONE + 0xFF00: /* done but not reported yet */ |
457 | res = TMF_RESP_FUNC_FAILED; | 461 | res = TMF_RESP_FUNC_FAILED; |
458 | wait_for_completion_timeout(&tascb->completion, | 462 | leftover = wait_for_completion_timeout(&tascb->completion, |
459 | AIC94XX_SCB_TIMEOUT); | 463 | AIC94XX_SCB_TIMEOUT); |
460 | spin_lock_irqsave(&task->task_state_lock, flags); | 464 | spin_lock_irqsave(&task->task_state_lock, flags); |
465 | if (leftover < 1) | ||
466 | res = TMF_RESP_FUNC_FAILED; | ||
461 | if (task->task_state_flags & SAS_TASK_STATE_DONE) | 467 | if (task->task_state_flags & SAS_TASK_STATE_DONE) |
462 | res = TMF_RESP_FUNC_COMPLETE; | 468 | res = TMF_RESP_FUNC_COMPLETE; |
463 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 469 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 4baa79e68679..fa6ff295e568 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -3954,6 +3954,13 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | |||
3954 | spin_unlock_irq(scsi_cmd->device->host->host_lock); | 3954 | spin_unlock_irq(scsi_cmd->device->host->host_lock); |
3955 | ata_do_eh(ap, NULL, NULL, ipr_sata_reset, NULL); | 3955 | ata_do_eh(ap, NULL, NULL, ipr_sata_reset, NULL); |
3956 | spin_lock_irq(scsi_cmd->device->host->host_lock); | 3956 | spin_lock_irq(scsi_cmd->device->host->host_lock); |
3957 | |||
3958 | list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) { | ||
3959 | if (ipr_cmd->ioarcb.res_handle == res->cfgte.res_handle) { | ||
3960 | rc = -EIO; | ||
3961 | break; | ||
3962 | } | ||
3963 | } | ||
3957 | } else | 3964 | } else |
3958 | rc = ipr_device_reset(ioa_cfg, res); | 3965 | rc = ipr_device_reset(ioa_cfg, res); |
3959 | res->resetting_device = 0; | 3966 | res->resetting_device = 0; |
diff --git a/drivers/scsi/jazz_esp.c b/drivers/scsi/jazz_esp.c index 19dd4b962e18..81e497d9eae0 100644 --- a/drivers/scsi/jazz_esp.c +++ b/drivers/scsi/jazz_esp.c | |||
@@ -1,307 +1,244 @@ | |||
1 | /* | 1 | /* jazz_esp.c: ESP front-end for MIPS JAZZ systems. |
2 | * jazz_esp.c: Driver for SCSI chip on Mips Magnum Boards (JAZZ architecture) | ||
3 | * | 2 | * |
4 | * Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de) | 3 | * Copyright (C) 2007 Thomas Bogendörfer (tsbogend@alpha.frankende) |
5 | * | ||
6 | * jazz_esp is based on David S. Miller's ESP driver and cyber_esp | ||
7 | */ | 4 | */ |
8 | 5 | ||
9 | #include <linux/init.h> | ||
10 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
11 | #include <linux/delay.h> | ||
12 | #include <linux/types.h> | 7 | #include <linux/types.h> |
13 | #include <linux/string.h> | 8 | #include <linux/module.h> |
14 | #include <linux/slab.h> | 9 | #include <linux/init.h> |
15 | #include <linux/blkdev.h> | 10 | #include <linux/interrupt.h> |
16 | #include <linux/proc_fs.h> | 11 | #include <linux/platform_device.h> |
17 | #include <linux/stat.h> | 12 | #include <linux/dma-mapping.h> |
18 | |||
19 | #include "scsi.h" | ||
20 | #include <scsi/scsi_host.h> | ||
21 | #include "NCR53C9x.h" | ||
22 | 13 | ||
23 | #include <asm/irq.h> | 14 | #include <asm/irq.h> |
15 | #include <asm/io.h> | ||
16 | #include <asm/dma.h> | ||
17 | |||
24 | #include <asm/jazz.h> | 18 | #include <asm/jazz.h> |
25 | #include <asm/jazzdma.h> | 19 | #include <asm/jazzdma.h> |
26 | #include <asm/dma.h> | ||
27 | 20 | ||
28 | #include <asm/pgtable.h> | 21 | #include <scsi/scsi_host.h> |
29 | |||
30 | static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count); | ||
31 | static int dma_can_transfer(struct NCR_ESP *esp, struct scsi_cmnd *sp); | ||
32 | static void dma_dump_state(struct NCR_ESP *esp); | ||
33 | static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length); | ||
34 | static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length); | ||
35 | static void dma_ints_off(struct NCR_ESP *esp); | ||
36 | static void dma_ints_on(struct NCR_ESP *esp); | ||
37 | static int dma_irq_p(struct NCR_ESP *esp); | ||
38 | static int dma_ports_p(struct NCR_ESP *esp); | ||
39 | static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write); | ||
40 | static void dma_mmu_get_scsi_one (struct NCR_ESP *esp, struct scsi_cmnd *sp); | ||
41 | static void dma_mmu_get_scsi_sgl (struct NCR_ESP *esp, struct scsi_cmnd *sp); | ||
42 | static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, struct scsi_cmnd *sp); | ||
43 | static void dma_mmu_release_scsi_sgl (struct NCR_ESP *esp, struct scsi_cmnd *sp); | ||
44 | static void dma_advance_sg (struct scsi_cmnd *sp); | ||
45 | static void dma_led_off(struct NCR_ESP *); | ||
46 | static void dma_led_on(struct NCR_ESP *); | ||
47 | |||
48 | |||
49 | static volatile unsigned char cmd_buffer[16]; | ||
50 | /* This is where all commands are put | ||
51 | * before they are trasfered to the ESP chip | ||
52 | * via PIO. | ||
53 | */ | ||
54 | |||
55 | static int jazz_esp_release(struct Scsi_Host *shost) | ||
56 | { | ||
57 | if (shost->irq) | ||
58 | free_irq(shost->irq, NULL); | ||
59 | if (shost->dma_channel != 0xff) | ||
60 | free_dma(shost->dma_channel); | ||
61 | if (shost->io_port && shost->n_io_port) | ||
62 | release_region(shost->io_port, shost->n_io_port); | ||
63 | scsi_unregister(shost); | ||
64 | return 0; | ||
65 | } | ||
66 | 22 | ||
67 | /***************************************************************** Detection */ | 23 | #include "esp_scsi.h" |
68 | static int jazz_esp_detect(struct scsi_host_template *tpnt) | ||
69 | { | ||
70 | struct NCR_ESP *esp; | ||
71 | struct ConfigDev *esp_dev; | ||
72 | |||
73 | /* | ||
74 | * first assumption it is there:-) | ||
75 | */ | ||
76 | if (1) { | ||
77 | esp_dev = NULL; | ||
78 | esp = esp_allocate(tpnt, esp_dev, 0); | ||
79 | |||
80 | /* Do command transfer with programmed I/O */ | ||
81 | esp->do_pio_cmds = 1; | ||
82 | |||
83 | /* Required functions */ | ||
84 | esp->dma_bytes_sent = &dma_bytes_sent; | ||
85 | esp->dma_can_transfer = &dma_can_transfer; | ||
86 | esp->dma_dump_state = &dma_dump_state; | ||
87 | esp->dma_init_read = &dma_init_read; | ||
88 | esp->dma_init_write = &dma_init_write; | ||
89 | esp->dma_ints_off = &dma_ints_off; | ||
90 | esp->dma_ints_on = &dma_ints_on; | ||
91 | esp->dma_irq_p = &dma_irq_p; | ||
92 | esp->dma_ports_p = &dma_ports_p; | ||
93 | esp->dma_setup = &dma_setup; | ||
94 | |||
95 | /* Optional functions */ | ||
96 | esp->dma_barrier = NULL; | ||
97 | esp->dma_drain = NULL; | ||
98 | esp->dma_invalidate = NULL; | ||
99 | esp->dma_irq_entry = NULL; | ||
100 | esp->dma_irq_exit = NULL; | ||
101 | esp->dma_poll = NULL; | ||
102 | esp->dma_reset = NULL; | ||
103 | esp->dma_led_off = &dma_led_off; | ||
104 | esp->dma_led_on = &dma_led_on; | ||
105 | |||
106 | /* virtual DMA functions */ | ||
107 | esp->dma_mmu_get_scsi_one = &dma_mmu_get_scsi_one; | ||
108 | esp->dma_mmu_get_scsi_sgl = &dma_mmu_get_scsi_sgl; | ||
109 | esp->dma_mmu_release_scsi_one = &dma_mmu_release_scsi_one; | ||
110 | esp->dma_mmu_release_scsi_sgl = &dma_mmu_release_scsi_sgl; | ||
111 | esp->dma_advance_sg = &dma_advance_sg; | ||
112 | |||
113 | |||
114 | /* SCSI chip speed */ | ||
115 | esp->cfreq = 40000000; | ||
116 | 24 | ||
117 | /* | 25 | #define DRV_MODULE_NAME "jazz_esp" |
118 | * we don't give the address of DMA channel, but the number | 26 | #define PFX DRV_MODULE_NAME ": " |
119 | * of DMA channel, so we can use the jazz DMA functions | 27 | #define DRV_VERSION "1.000" |
120 | * | 28 | #define DRV_MODULE_RELDATE "May 19, 2007" |
121 | */ | ||
122 | esp->dregs = (void *) JAZZ_SCSI_DMA; | ||
123 | |||
124 | /* ESP register base */ | ||
125 | esp->eregs = (struct ESP_regs *)(JAZZ_SCSI_BASE); | ||
126 | |||
127 | /* Set the command buffer */ | ||
128 | esp->esp_command = (volatile unsigned char *)cmd_buffer; | ||
129 | |||
130 | /* get virtual dma address for command buffer */ | ||
131 | esp->esp_command_dvma = vdma_alloc(CPHYSADDR(cmd_buffer), sizeof (cmd_buffer)); | ||
132 | |||
133 | esp->irq = JAZZ_SCSI_IRQ; | ||
134 | request_irq(JAZZ_SCSI_IRQ, esp_intr, IRQF_DISABLED, "JAZZ SCSI", | ||
135 | esp->ehost); | ||
136 | |||
137 | /* | ||
138 | * FIXME, look if the scsi id is available from NVRAM | ||
139 | */ | ||
140 | esp->scsi_id = 7; | ||
141 | |||
142 | /* Check for differential SCSI-bus */ | ||
143 | /* What is this stuff? */ | ||
144 | esp->diff = 0; | ||
145 | |||
146 | esp_initialize(esp); | ||
147 | |||
148 | printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps,esps_in_use); | ||
149 | esps_running = esps_in_use; | ||
150 | return esps_in_use; | ||
151 | } | ||
152 | return 0; | ||
153 | } | ||
154 | 29 | ||
155 | /************************************************************* DMA Functions */ | 30 | static void jazz_esp_write8(struct esp *esp, u8 val, unsigned long reg) |
156 | static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count) | ||
157 | { | 31 | { |
158 | return fifo_count; | 32 | *(volatile u8 *)(esp->regs + reg) = val; |
159 | } | 33 | } |
160 | 34 | ||
161 | static int dma_can_transfer(struct NCR_ESP *esp, struct scsi_cmnd *sp) | 35 | static u8 jazz_esp_read8(struct esp *esp, unsigned long reg) |
162 | { | 36 | { |
163 | /* | 37 | return *(volatile u8 *)(esp->regs + reg); |
164 | * maximum DMA size is 1MB | ||
165 | */ | ||
166 | unsigned long sz = sp->SCp.this_residual; | ||
167 | if(sz > 0x100000) | ||
168 | sz = 0x100000; | ||
169 | return sz; | ||
170 | } | 38 | } |
171 | 39 | ||
172 | static void dma_dump_state(struct NCR_ESP *esp) | 40 | static dma_addr_t jazz_esp_map_single(struct esp *esp, void *buf, |
41 | size_t sz, int dir) | ||
173 | { | 42 | { |
174 | 43 | return dma_map_single(esp->dev, buf, sz, dir); | |
175 | ESPLOG(("esp%d: dma -- enable <%08x> residue <%08x\n", | ||
176 | esp->esp_id, vdma_get_enable((int)esp->dregs), vdma_get_residue((int)esp->dregs))); | ||
177 | } | 44 | } |
178 | 45 | ||
179 | static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length) | 46 | static int jazz_esp_map_sg(struct esp *esp, struct scatterlist *sg, |
47 | int num_sg, int dir) | ||
180 | { | 48 | { |
181 | dma_cache_wback_inv ((unsigned long)phys_to_virt(vdma_log2phys(vaddress)), length); | 49 | return dma_map_sg(esp->dev, sg, num_sg, dir); |
182 | vdma_disable ((int)esp->dregs); | ||
183 | vdma_set_mode ((int)esp->dregs, DMA_MODE_READ); | ||
184 | vdma_set_addr ((int)esp->dregs, vaddress); | ||
185 | vdma_set_count ((int)esp->dregs, length); | ||
186 | vdma_enable ((int)esp->dregs); | ||
187 | } | 50 | } |
188 | 51 | ||
189 | static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length) | 52 | static void jazz_esp_unmap_single(struct esp *esp, dma_addr_t addr, |
53 | size_t sz, int dir) | ||
190 | { | 54 | { |
191 | dma_cache_wback_inv ((unsigned long)phys_to_virt(vdma_log2phys(vaddress)), length); | 55 | dma_unmap_single(esp->dev, addr, sz, dir); |
192 | vdma_disable ((int)esp->dregs); | ||
193 | vdma_set_mode ((int)esp->dregs, DMA_MODE_WRITE); | ||
194 | vdma_set_addr ((int)esp->dregs, vaddress); | ||
195 | vdma_set_count ((int)esp->dregs, length); | ||
196 | vdma_enable ((int)esp->dregs); | ||
197 | } | 56 | } |
198 | 57 | ||
199 | static void dma_ints_off(struct NCR_ESP *esp) | 58 | static void jazz_esp_unmap_sg(struct esp *esp, struct scatterlist *sg, |
59 | int num_sg, int dir) | ||
200 | { | 60 | { |
201 | disable_irq(esp->irq); | 61 | dma_unmap_sg(esp->dev, sg, num_sg, dir); |
202 | } | 62 | } |
203 | 63 | ||
204 | static void dma_ints_on(struct NCR_ESP *esp) | 64 | static int jazz_esp_irq_pending(struct esp *esp) |
205 | { | 65 | { |
206 | enable_irq(esp->irq); | 66 | if (jazz_esp_read8(esp, ESP_STATUS) & ESP_STAT_INTR) |
67 | return 1; | ||
68 | return 0; | ||
207 | } | 69 | } |
208 | 70 | ||
209 | static int dma_irq_p(struct NCR_ESP *esp) | 71 | static void jazz_esp_reset_dma(struct esp *esp) |
210 | { | 72 | { |
211 | return (esp_read(esp->eregs->esp_status) & ESP_STAT_INTR); | 73 | vdma_disable ((int)esp->dma_regs); |
212 | } | 74 | } |
213 | 75 | ||
214 | static int dma_ports_p(struct NCR_ESP *esp) | 76 | static void jazz_esp_dma_drain(struct esp *esp) |
215 | { | 77 | { |
216 | int enable = vdma_get_enable((int)esp->dregs); | 78 | /* nothing to do */ |
217 | |||
218 | return (enable & R4030_CHNL_ENABLE); | ||
219 | } | 79 | } |
220 | 80 | ||
221 | static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) | 81 | static void jazz_esp_dma_invalidate(struct esp *esp) |
222 | { | 82 | { |
223 | /* | 83 | vdma_disable ((int)esp->dma_regs); |
224 | * On the Sparc, DMA_ST_WRITE means "move data from device to memory" | ||
225 | * so when (write) is true, it actually means READ! | ||
226 | */ | ||
227 | if(write){ | ||
228 | dma_init_read(esp, addr, count); | ||
229 | } else { | ||
230 | dma_init_write(esp, addr, count); | ||
231 | } | ||
232 | } | 84 | } |
233 | 85 | ||
234 | static void dma_mmu_get_scsi_one (struct NCR_ESP *esp, struct scsi_cmnd *sp) | 86 | static void jazz_esp_send_dma_cmd(struct esp *esp, u32 addr, u32 esp_count, |
87 | u32 dma_count, int write, u8 cmd) | ||
235 | { | 88 | { |
236 | sp->SCp.have_data_in = vdma_alloc(CPHYSADDR(sp->SCp.buffer), sp->SCp.this_residual); | 89 | BUG_ON(!(cmd & ESP_CMD_DMA)); |
237 | sp->SCp.ptr = (char *)((unsigned long)sp->SCp.have_data_in); | 90 | |
91 | jazz_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); | ||
92 | jazz_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); | ||
93 | vdma_disable ((int)esp->dma_regs); | ||
94 | if (write) | ||
95 | vdma_set_mode ((int)esp->dma_regs, DMA_MODE_READ); | ||
96 | else | ||
97 | vdma_set_mode ((int)esp->dma_regs, DMA_MODE_WRITE); | ||
98 | |||
99 | vdma_set_addr ((int)esp->dma_regs, addr); | ||
100 | vdma_set_count ((int)esp->dma_regs, dma_count); | ||
101 | vdma_enable ((int)esp->dma_regs); | ||
102 | |||
103 | scsi_esp_cmd(esp, cmd); | ||
238 | } | 104 | } |
239 | 105 | ||
240 | static void dma_mmu_get_scsi_sgl (struct NCR_ESP *esp, struct scsi_cmnd *sp) | 106 | static int jazz_esp_dma_error(struct esp *esp) |
241 | { | ||
242 | int sz = sp->SCp.buffers_residual; | ||
243 | struct scatterlist *sg = (struct scatterlist *) sp->SCp.buffer; | ||
244 | |||
245 | while (sz >= 0) { | ||
246 | sg[sz].dma_address = vdma_alloc(CPHYSADDR(page_address(sg[sz].page) + sg[sz].offset), sg[sz].length); | ||
247 | sz--; | ||
248 | } | ||
249 | sp->SCp.ptr=(char *)(sp->SCp.buffer->dma_address); | ||
250 | } | ||
251 | |||
252 | static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, struct scsi_cmnd *sp) | ||
253 | { | 107 | { |
254 | vdma_free(sp->SCp.have_data_in); | 108 | u32 enable = vdma_get_enable((int)esp->dma_regs); |
109 | |||
110 | if (enable & (R4030_MEM_INTR|R4030_ADDR_INTR)) | ||
111 | return 1; | ||
112 | |||
113 | return 0; | ||
255 | } | 114 | } |
256 | 115 | ||
257 | static void dma_mmu_release_scsi_sgl (struct NCR_ESP *esp, struct scsi_cmnd *sp) | 116 | static const struct esp_driver_ops jazz_esp_ops = { |
117 | .esp_write8 = jazz_esp_write8, | ||
118 | .esp_read8 = jazz_esp_read8, | ||
119 | .map_single = jazz_esp_map_single, | ||
120 | .map_sg = jazz_esp_map_sg, | ||
121 | .unmap_single = jazz_esp_unmap_single, | ||
122 | .unmap_sg = jazz_esp_unmap_sg, | ||
123 | .irq_pending = jazz_esp_irq_pending, | ||
124 | .reset_dma = jazz_esp_reset_dma, | ||
125 | .dma_drain = jazz_esp_dma_drain, | ||
126 | .dma_invalidate = jazz_esp_dma_invalidate, | ||
127 | .send_dma_cmd = jazz_esp_send_dma_cmd, | ||
128 | .dma_error = jazz_esp_dma_error, | ||
129 | }; | ||
130 | |||
131 | static int __devinit esp_jazz_probe(struct platform_device *dev) | ||
258 | { | 132 | { |
259 | int sz = sp->use_sg - 1; | 133 | struct scsi_host_template *tpnt = &scsi_esp_template; |
260 | struct scatterlist *sg = (struct scatterlist *)sp->request_buffer; | 134 | struct Scsi_Host *host; |
261 | 135 | struct esp *esp; | |
262 | while(sz >= 0) { | 136 | struct resource *res; |
263 | vdma_free(sg[sz].dma_address); | 137 | int err; |
264 | sz--; | 138 | |
265 | } | 139 | host = scsi_host_alloc(tpnt, sizeof(struct esp)); |
140 | |||
141 | err = -ENOMEM; | ||
142 | if (!host) | ||
143 | goto fail; | ||
144 | |||
145 | host->max_id = 8; | ||
146 | esp = host_to_esp(host); | ||
147 | |||
148 | esp->host = host; | ||
149 | esp->dev = dev; | ||
150 | esp->ops = &jazz_esp_ops; | ||
151 | |||
152 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
153 | if (!res) | ||
154 | goto fail_unlink; | ||
155 | |||
156 | esp->regs = (void __iomem *)res->start; | ||
157 | if (!esp->regs) | ||
158 | goto fail_unlink; | ||
159 | |||
160 | res = platform_get_resource(dev, IORESOURCE_MEM, 1); | ||
161 | if (!res) | ||
162 | goto fail_unlink; | ||
163 | |||
164 | esp->dma_regs = (void __iomem *)res->start; | ||
165 | |||
166 | esp->command_block = dma_alloc_coherent(esp->dev, 16, | ||
167 | &esp->command_block_dma, | ||
168 | GFP_KERNEL); | ||
169 | if (!esp->command_block) | ||
170 | goto fail_unmap_regs; | ||
171 | |||
172 | host->irq = platform_get_irq(dev, 0); | ||
173 | err = request_irq(host->irq, scsi_esp_intr, IRQF_SHARED, "ESP", esp); | ||
174 | if (err < 0) | ||
175 | goto fail_unmap_command_block; | ||
176 | |||
177 | esp->scsi_id = 7; | ||
178 | esp->host->this_id = esp->scsi_id; | ||
179 | esp->scsi_id_mask = (1 << esp->scsi_id); | ||
180 | esp->cfreq = 40000000; | ||
181 | |||
182 | dev_set_drvdata(&dev->dev, esp); | ||
183 | |||
184 | err = scsi_esp_register(esp, &dev->dev); | ||
185 | if (err) | ||
186 | goto fail_free_irq; | ||
187 | |||
188 | return 0; | ||
189 | |||
190 | fail_free_irq: | ||
191 | free_irq(host->irq, esp); | ||
192 | fail_unmap_command_block: | ||
193 | dma_free_coherent(esp->dev, 16, | ||
194 | esp->command_block, | ||
195 | esp->command_block_dma); | ||
196 | fail_unmap_regs: | ||
197 | fail_unlink: | ||
198 | scsi_host_put(host); | ||
199 | fail: | ||
200 | return err; | ||
266 | } | 201 | } |
267 | 202 | ||
268 | static void dma_advance_sg (struct scsi_cmnd *sp) | 203 | static int __devexit esp_jazz_remove(struct platform_device *dev) |
269 | { | 204 | { |
270 | sp->SCp.ptr = (char *)(sp->SCp.buffer->dma_address); | 205 | struct esp *esp = dev_get_drvdata(&dev->dev); |
206 | unsigned int irq = esp->host->irq; | ||
207 | |||
208 | scsi_esp_unregister(esp); | ||
209 | |||
210 | free_irq(irq, esp); | ||
211 | dma_free_coherent(esp->dev, 16, | ||
212 | esp->command_block, | ||
213 | esp->command_block_dma); | ||
214 | |||
215 | scsi_host_put(esp->host); | ||
216 | |||
217 | return 0; | ||
271 | } | 218 | } |
272 | 219 | ||
273 | #define JAZZ_HDC_LED 0xe000d100 /* FIXME, find correct address */ | 220 | static struct platform_driver esp_jazz_driver = { |
221 | .probe = esp_jazz_probe, | ||
222 | .remove = __devexit_p(esp_jazz_remove), | ||
223 | .driver = { | ||
224 | .name = "jazz_esp", | ||
225 | }, | ||
226 | }; | ||
274 | 227 | ||
275 | static void dma_led_off(struct NCR_ESP *esp) | 228 | static int __init jazz_esp_init(void) |
276 | { | 229 | { |
277 | #if 0 | 230 | return platform_driver_register(&esp_jazz_driver); |
278 | *(unsigned char *)JAZZ_HDC_LED = 0; | ||
279 | #endif | ||
280 | } | 231 | } |
281 | 232 | ||
282 | static void dma_led_on(struct NCR_ESP *esp) | 233 | static void __exit jazz_esp_exit(void) |
283 | { | 234 | { |
284 | #if 0 | 235 | platform_driver_unregister(&esp_jazz_driver); |
285 | *(unsigned char *)JAZZ_HDC_LED = 1; | ||
286 | #endif | ||
287 | } | 236 | } |
288 | 237 | ||
289 | static struct scsi_host_template driver_template = { | 238 | MODULE_DESCRIPTION("JAZZ ESP SCSI driver"); |
290 | .proc_name = "jazz_esp", | 239 | MODULE_AUTHOR("Thomas Bogendoerfer (tsbogend@alpha.franken.de)"); |
291 | .proc_info = esp_proc_info, | 240 | MODULE_LICENSE("GPL"); |
292 | .name = "ESP 100/100a/200", | 241 | MODULE_VERSION(DRV_VERSION); |
293 | .detect = jazz_esp_detect, | 242 | |
294 | .slave_alloc = esp_slave_alloc, | 243 | module_init(jazz_esp_init); |
295 | .slave_destroy = esp_slave_destroy, | 244 | module_exit(jazz_esp_exit); |
296 | .release = jazz_esp_release, | ||
297 | .info = esp_info, | ||
298 | .queuecommand = esp_queue, | ||
299 | .eh_abort_handler = esp_abort, | ||
300 | .eh_bus_reset_handler = esp_reset, | ||
301 | .can_queue = 7, | ||
302 | .this_id = 7, | ||
303 | .sg_tablesize = SG_ALL, | ||
304 | .cmd_per_lun = 1, | ||
305 | .use_clustering = DISABLE_CLUSTERING, | ||
306 | }; | ||
307 | #include "scsi_module.c" | ||
diff --git a/drivers/scsi/libsrp.c b/drivers/scsi/libsrp.c index 5631c199a8eb..732446e63963 100644 --- a/drivers/scsi/libsrp.c +++ b/drivers/scsi/libsrp.c | |||
@@ -254,6 +254,7 @@ static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd, | |||
254 | 254 | ||
255 | sg_init_one(&dummy, md, id->table_desc.len); | 255 | sg_init_one(&dummy, md, id->table_desc.len); |
256 | sg_dma_address(&dummy) = token; | 256 | sg_dma_address(&dummy) = token; |
257 | sg_dma_len(&dummy) = id->table_desc.len; | ||
257 | err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE, | 258 | err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE, |
258 | id->table_desc.len); | 259 | id->table_desc.len); |
259 | if (err) { | 260 | if (err) { |
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 7a812677ff8a..e2cf12ef3688 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * FILE : megaraid_sas.c | 12 | * FILE : megaraid_sas.c |
13 | * Version : v00.00.03.10-rc1 | 13 | * Version : v00.00.03.10-rc5 |
14 | * | 14 | * |
15 | * Authors: | 15 | * Authors: |
16 | * (email-id : megaraidlinux@lsi.com) | 16 | * (email-id : megaraidlinux@lsi.com) |
@@ -886,6 +886,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *)) | |||
886 | goto out_return_cmd; | 886 | goto out_return_cmd; |
887 | 887 | ||
888 | cmd->scmd = scmd; | 888 | cmd->scmd = scmd; |
889 | scmd->SCp.ptr = (char *)cmd; | ||
889 | 890 | ||
890 | /* | 891 | /* |
891 | * Issue the command to the FW | 892 | * Issue the command to the FW |
@@ -919,7 +920,7 @@ static int megasas_slave_configure(struct scsi_device *sdev) | |||
919 | * The RAID firmware may require extended timeouts. | 920 | * The RAID firmware may require extended timeouts. |
920 | */ | 921 | */ |
921 | if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS) | 922 | if (sdev->channel >= MEGASAS_MAX_PD_CHANNELS) |
922 | sdev->timeout = 90 * HZ; | 923 | sdev->timeout = MEGASAS_DEFAULT_CMD_TIMEOUT * HZ; |
923 | return 0; | 924 | return 0; |
924 | } | 925 | } |
925 | 926 | ||
@@ -981,8 +982,8 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd) | |||
981 | 982 | ||
982 | instance = (struct megasas_instance *)scmd->device->host->hostdata; | 983 | instance = (struct megasas_instance *)scmd->device->host->hostdata; |
983 | 984 | ||
984 | scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x\n", | 985 | scmd_printk(KERN_NOTICE, scmd, "megasas: RESET -%ld cmd=%x retries=%x\n", |
985 | scmd->serial_number, scmd->cmnd[0]); | 986 | scmd->serial_number, scmd->cmnd[0], scmd->retries); |
986 | 987 | ||
987 | if (instance->hw_crit_error) { | 988 | if (instance->hw_crit_error) { |
988 | printk(KERN_ERR "megasas: cannot recover from previous reset " | 989 | printk(KERN_ERR "megasas: cannot recover from previous reset " |
@@ -1000,6 +1001,39 @@ static int megasas_generic_reset(struct scsi_cmnd *scmd) | |||
1000 | } | 1001 | } |
1001 | 1002 | ||
1002 | /** | 1003 | /** |
1004 | * megasas_reset_timer - quiesce the adapter if required | ||
1005 | * @scmd: scsi cmnd | ||
1006 | * | ||
1007 | * Sets the FW busy flag and reduces the host->can_queue if the | ||
1008 | * cmd has not been completed within the timeout period. | ||
1009 | */ | ||
1010 | static enum | ||
1011 | scsi_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd) | ||
1012 | { | ||
1013 | struct megasas_cmd *cmd = (struct megasas_cmd *)scmd->SCp.ptr; | ||
1014 | struct megasas_instance *instance; | ||
1015 | unsigned long flags; | ||
1016 | |||
1017 | if (time_after(jiffies, scmd->jiffies_at_alloc + | ||
1018 | (MEGASAS_DEFAULT_CMD_TIMEOUT * 2) * HZ)) { | ||
1019 | return EH_NOT_HANDLED; | ||
1020 | } | ||
1021 | |||
1022 | instance = cmd->instance; | ||
1023 | if (!(instance->flag & MEGASAS_FW_BUSY)) { | ||
1024 | /* FW is busy, throttle IO */ | ||
1025 | spin_lock_irqsave(instance->host->host_lock, flags); | ||
1026 | |||
1027 | instance->host->can_queue = 16; | ||
1028 | instance->last_time = jiffies; | ||
1029 | instance->flag |= MEGASAS_FW_BUSY; | ||
1030 | |||
1031 | spin_unlock_irqrestore(instance->host->host_lock, flags); | ||
1032 | } | ||
1033 | return EH_RESET_TIMER; | ||
1034 | } | ||
1035 | |||
1036 | /** | ||
1003 | * megasas_reset_device - Device reset handler entry point | 1037 | * megasas_reset_device - Device reset handler entry point |
1004 | */ | 1038 | */ |
1005 | static int megasas_reset_device(struct scsi_cmnd *scmd) | 1039 | static int megasas_reset_device(struct scsi_cmnd *scmd) |
@@ -1112,6 +1146,7 @@ static struct scsi_host_template megasas_template = { | |||
1112 | .eh_device_reset_handler = megasas_reset_device, | 1146 | .eh_device_reset_handler = megasas_reset_device, |
1113 | .eh_bus_reset_handler = megasas_reset_bus_host, | 1147 | .eh_bus_reset_handler = megasas_reset_bus_host, |
1114 | .eh_host_reset_handler = megasas_reset_bus_host, | 1148 | .eh_host_reset_handler = megasas_reset_bus_host, |
1149 | .eh_timed_out = megasas_reset_timer, | ||
1115 | .bios_param = megasas_bios_param, | 1150 | .bios_param = megasas_bios_param, |
1116 | .use_clustering = ENABLE_CLUSTERING, | 1151 | .use_clustering = ENABLE_CLUSTERING, |
1117 | }; | 1152 | }; |
@@ -1215,9 +1250,8 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, | |||
1215 | int exception = 0; | 1250 | int exception = 0; |
1216 | struct megasas_header *hdr = &cmd->frame->hdr; | 1251 | struct megasas_header *hdr = &cmd->frame->hdr; |
1217 | 1252 | ||
1218 | if (cmd->scmd) { | 1253 | if (cmd->scmd) |
1219 | cmd->scmd->SCp.ptr = (char *)0; | 1254 | cmd->scmd->SCp.ptr = NULL; |
1220 | } | ||
1221 | 1255 | ||
1222 | switch (hdr->cmd) { | 1256 | switch (hdr->cmd) { |
1223 | 1257 | ||
@@ -1806,6 +1840,7 @@ static void megasas_complete_cmd_dpc(unsigned long instance_addr) | |||
1806 | u32 context; | 1840 | u32 context; |
1807 | struct megasas_cmd *cmd; | 1841 | struct megasas_cmd *cmd; |
1808 | struct megasas_instance *instance = (struct megasas_instance *)instance_addr; | 1842 | struct megasas_instance *instance = (struct megasas_instance *)instance_addr; |
1843 | unsigned long flags; | ||
1809 | 1844 | ||
1810 | /* If we have already declared adapter dead, donot complete cmds */ | 1845 | /* If we have already declared adapter dead, donot complete cmds */ |
1811 | if (instance->hw_crit_error) | 1846 | if (instance->hw_crit_error) |
@@ -1828,6 +1863,22 @@ static void megasas_complete_cmd_dpc(unsigned long instance_addr) | |||
1828 | } | 1863 | } |
1829 | 1864 | ||
1830 | *instance->consumer = producer; | 1865 | *instance->consumer = producer; |
1866 | |||
1867 | /* | ||
1868 | * Check if we can restore can_queue | ||
1869 | */ | ||
1870 | if (instance->flag & MEGASAS_FW_BUSY | ||
1871 | && time_after(jiffies, instance->last_time + 5 * HZ) | ||
1872 | && atomic_read(&instance->fw_outstanding) < 17) { | ||
1873 | |||
1874 | spin_lock_irqsave(instance->host->host_lock, flags); | ||
1875 | instance->flag &= ~MEGASAS_FW_BUSY; | ||
1876 | instance->host->can_queue = | ||
1877 | instance->max_fw_cmds - MEGASAS_INT_CMDS; | ||
1878 | |||
1879 | spin_unlock_irqrestore(instance->host->host_lock, flags); | ||
1880 | } | ||
1881 | |||
1831 | } | 1882 | } |
1832 | 1883 | ||
1833 | /** | 1884 | /** |
@@ -2398,6 +2449,8 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2398 | instance->init_id = MEGASAS_DEFAULT_INIT_ID; | 2449 | instance->init_id = MEGASAS_DEFAULT_INIT_ID; |
2399 | 2450 | ||
2400 | megasas_dbg_lvl = 0; | 2451 | megasas_dbg_lvl = 0; |
2452 | instance->flag = 0; | ||
2453 | instance->last_time = 0; | ||
2401 | 2454 | ||
2402 | /* | 2455 | /* |
2403 | * Initialize MFI Firmware | 2456 | * Initialize MFI Firmware |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index e862992ee377..4dffc918a414 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
@@ -18,9 +18,9 @@ | |||
18 | /* | 18 | /* |
19 | * MegaRAID SAS Driver meta data | 19 | * MegaRAID SAS Driver meta data |
20 | */ | 20 | */ |
21 | #define MEGASAS_VERSION "00.00.03.10-rc1" | 21 | #define MEGASAS_VERSION "00.00.03.10-rc5" |
22 | #define MEGASAS_RELDATE "Feb 14, 2007" | 22 | #define MEGASAS_RELDATE "May 17, 2007" |
23 | #define MEGASAS_EXT_VERSION "Wed Feb 14 10:14:25 PST 2007" | 23 | #define MEGASAS_EXT_VERSION "Thu May 17 10:09:32 PDT 2007" |
24 | 24 | ||
25 | /* | 25 | /* |
26 | * Device IDs | 26 | * Device IDs |
@@ -539,6 +539,8 @@ struct megasas_ctrl_info { | |||
539 | 539 | ||
540 | #define MEGASAS_DBG_LVL 1 | 540 | #define MEGASAS_DBG_LVL 1 |
541 | 541 | ||
542 | #define MEGASAS_FW_BUSY 1 | ||
543 | |||
542 | /* | 544 | /* |
543 | * When SCSI mid-layer calls driver's reset routine, driver waits for | 545 | * When SCSI mid-layer calls driver's reset routine, driver waits for |
544 | * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note | 546 | * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note |
@@ -549,8 +551,8 @@ struct megasas_ctrl_info { | |||
549 | #define MEGASAS_RESET_WAIT_TIME 180 | 551 | #define MEGASAS_RESET_WAIT_TIME 180 |
550 | #define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 | 552 | #define MEGASAS_INTERNAL_CMD_WAIT_TIME 180 |
551 | #define MEGASAS_RESET_NOTICE_INTERVAL 5 | 553 | #define MEGASAS_RESET_NOTICE_INTERVAL 5 |
552 | |||
553 | #define MEGASAS_IOCTL_CMD 0 | 554 | #define MEGASAS_IOCTL_CMD 0 |
555 | #define MEGASAS_DEFAULT_CMD_TIMEOUT 90 | ||
554 | 556 | ||
555 | /* | 557 | /* |
556 | * FW reports the maximum of number of commands that it can accept (maximum | 558 | * FW reports the maximum of number of commands that it can accept (maximum |
@@ -1073,7 +1075,6 @@ struct megasas_instance { | |||
1073 | struct megasas_register_set __iomem *reg_set; | 1075 | struct megasas_register_set __iomem *reg_set; |
1074 | 1076 | ||
1075 | s8 init_id; | 1077 | s8 init_id; |
1076 | u8 reserved[3]; | ||
1077 | 1078 | ||
1078 | u16 max_num_sge; | 1079 | u16 max_num_sge; |
1079 | u16 max_fw_cmds; | 1080 | u16 max_fw_cmds; |
@@ -1104,6 +1105,9 @@ struct megasas_instance { | |||
1104 | 1105 | ||
1105 | struct megasas_instance_template *instancet; | 1106 | struct megasas_instance_template *instancet; |
1106 | struct tasklet_struct isr_tasklet; | 1107 | struct tasklet_struct isr_tasklet; |
1108 | |||
1109 | u8 flag; | ||
1110 | unsigned long last_time; | ||
1107 | }; | 1111 | }; |
1108 | 1112 | ||
1109 | #define MEGASAS_IS_LOGICAL(scp) \ | 1113 | #define MEGASAS_IS_LOGICAL(scp) \ |
diff --git a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c index 3b2e1a53e6e2..d953d43fe2e6 100644 --- a/drivers/scsi/pluto.c +++ b/drivers/scsi/pluto.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * | 4 | * |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <linux/completion.h> | ||
7 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
8 | #include <linux/delay.h> | 9 | #include <linux/delay.h> |
9 | #include <linux/types.h> | 10 | #include <linux/types.h> |
@@ -50,16 +51,10 @@ static struct ctrl_inquiry { | |||
50 | } *fcs __initdata; | 51 | } *fcs __initdata; |
51 | static int fcscount __initdata = 0; | 52 | static int fcscount __initdata = 0; |
52 | static atomic_t fcss __initdata = ATOMIC_INIT(0); | 53 | static atomic_t fcss __initdata = ATOMIC_INIT(0); |
53 | DECLARE_MUTEX_LOCKED(fc_sem); | 54 | static DECLARE_COMPLETION(fc_detect_complete); |
54 | 55 | ||
55 | static int pluto_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd); | 56 | static int pluto_encode_addr(Scsi_Cmnd *SCpnt, u16 *addr, fc_channel *fc, fcp_cmnd *fcmd); |
56 | 57 | ||
57 | static void __init pluto_detect_timeout(unsigned long data) | ||
58 | { | ||
59 | PLND(("Timeout\n")) | ||
60 | up(&fc_sem); | ||
61 | } | ||
62 | |||
63 | static void __init pluto_detect_done(Scsi_Cmnd *SCpnt) | 58 | static void __init pluto_detect_done(Scsi_Cmnd *SCpnt) |
64 | { | 59 | { |
65 | /* Do nothing */ | 60 | /* Do nothing */ |
@@ -69,7 +64,7 @@ static void __init pluto_detect_scsi_done(Scsi_Cmnd *SCpnt) | |||
69 | { | 64 | { |
70 | PLND(("Detect done %08lx\n", (long)SCpnt)) | 65 | PLND(("Detect done %08lx\n", (long)SCpnt)) |
71 | if (atomic_dec_and_test (&fcss)) | 66 | if (atomic_dec_and_test (&fcss)) |
72 | up(&fc_sem); | 67 | complete(&fc_detect_complete); |
73 | } | 68 | } |
74 | 69 | ||
75 | int pluto_slave_configure(struct scsi_device *device) | 70 | int pluto_slave_configure(struct scsi_device *device) |
@@ -96,7 +91,6 @@ int __init pluto_detect(struct scsi_host_template *tpnt) | |||
96 | int i, retry, nplutos; | 91 | int i, retry, nplutos; |
97 | fc_channel *fc; | 92 | fc_channel *fc; |
98 | struct scsi_device dev; | 93 | struct scsi_device dev; |
99 | DEFINE_TIMER(fc_timer, pluto_detect_timeout, 0, 0); | ||
100 | 94 | ||
101 | tpnt->proc_name = "pluto"; | 95 | tpnt->proc_name = "pluto"; |
102 | fcscount = 0; | 96 | fcscount = 0; |
@@ -187,15 +181,11 @@ int __init pluto_detect(struct scsi_host_template *tpnt) | |||
187 | } | 181 | } |
188 | } | 182 | } |
189 | 183 | ||
190 | fc_timer.expires = jiffies + 10 * HZ; | 184 | wait_for_completion_timeout(&fc_detect_complete, 10 * HZ); |
191 | add_timer(&fc_timer); | ||
192 | |||
193 | down(&fc_sem); | ||
194 | PLND(("Woken up\n")) | 185 | PLND(("Woken up\n")) |
195 | if (!atomic_read(&fcss)) | 186 | if (!atomic_read(&fcss)) |
196 | break; /* All fc channels have answered us */ | 187 | break; /* All fc channels have answered us */ |
197 | } | 188 | } |
198 | del_timer_sync(&fc_timer); | ||
199 | 189 | ||
200 | PLND(("Finished search\n")) | 190 | PLND(("Finished search\n")) |
201 | for (i = 0, nplutos = 0; i < fcscount; i++) { | 191 | for (i = 0, nplutos = 0; i < fcscount; i++) { |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index ce63044b1ec8..18dd5cc4d7c6 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c | |||
@@ -209,6 +209,7 @@ static struct { | |||
209 | {"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 209 | {"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
210 | {"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 210 | {"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
211 | {"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 211 | {"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
212 | {"Promise", "", NULL, BLIST_SPARSELUN}, | ||
212 | {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, | 213 | {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, |
213 | {"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN}, | 214 | {"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN}, |
214 | {"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */ | 215 | {"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */ |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 00e46662296f..3d8c9cb24f91 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -1789,7 +1789,7 @@ static void sd_shutdown(struct device *dev) | |||
1789 | static int sd_suspend(struct device *dev, pm_message_t mesg) | 1789 | static int sd_suspend(struct device *dev, pm_message_t mesg) |
1790 | { | 1790 | { |
1791 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); | 1791 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); |
1792 | int ret; | 1792 | int ret = 0; |
1793 | 1793 | ||
1794 | if (!sdkp) | 1794 | if (!sdkp) |
1795 | return 0; /* this can happen */ | 1795 | return 0; /* this can happen */ |
@@ -1798,30 +1798,34 @@ static int sd_suspend(struct device *dev, pm_message_t mesg) | |||
1798 | sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); | 1798 | sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); |
1799 | ret = sd_sync_cache(sdkp); | 1799 | ret = sd_sync_cache(sdkp); |
1800 | if (ret) | 1800 | if (ret) |
1801 | return ret; | 1801 | goto done; |
1802 | } | 1802 | } |
1803 | 1803 | ||
1804 | if (mesg.event == PM_EVENT_SUSPEND && | 1804 | if (mesg.event == PM_EVENT_SUSPEND && |
1805 | sdkp->device->manage_start_stop) { | 1805 | sdkp->device->manage_start_stop) { |
1806 | sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); | 1806 | sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); |
1807 | ret = sd_start_stop_device(sdkp, 0); | 1807 | ret = sd_start_stop_device(sdkp, 0); |
1808 | if (ret) | ||
1809 | return ret; | ||
1810 | } | 1808 | } |
1811 | 1809 | ||
1812 | return 0; | 1810 | done: |
1811 | scsi_disk_put(sdkp); | ||
1812 | return ret; | ||
1813 | } | 1813 | } |
1814 | 1814 | ||
1815 | static int sd_resume(struct device *dev) | 1815 | static int sd_resume(struct device *dev) |
1816 | { | 1816 | { |
1817 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); | 1817 | struct scsi_disk *sdkp = scsi_disk_get_from_dev(dev); |
1818 | int ret = 0; | ||
1818 | 1819 | ||
1819 | if (!sdkp->device->manage_start_stop) | 1820 | if (!sdkp->device->manage_start_stop) |
1820 | return 0; | 1821 | goto done; |
1821 | 1822 | ||
1822 | sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); | 1823 | sd_printk(KERN_NOTICE, sdkp, "Starting disk\n"); |
1824 | ret = sd_start_stop_device(sdkp, 1); | ||
1823 | 1825 | ||
1824 | return sd_start_stop_device(sdkp, 1); | 1826 | done: |
1827 | scsi_disk_put(sdkp); | ||
1828 | return ret; | ||
1825 | } | 1829 | } |
1826 | 1830 | ||
1827 | /** | 1831 | /** |
diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c index 69be1324b114..9ac83abc4028 100644 --- a/drivers/scsi/stex.c +++ b/drivers/scsi/stex.c | |||
@@ -32,11 +32,12 @@ | |||
32 | #include <scsi/scsi_cmnd.h> | 32 | #include <scsi/scsi_cmnd.h> |
33 | #include <scsi/scsi_host.h> | 33 | #include <scsi/scsi_host.h> |
34 | #include <scsi/scsi_tcq.h> | 34 | #include <scsi/scsi_tcq.h> |
35 | #include <scsi/scsi_dbg.h> | ||
35 | 36 | ||
36 | #define DRV_NAME "stex" | 37 | #define DRV_NAME "stex" |
37 | #define ST_DRIVER_VERSION "3.1.0.1" | 38 | #define ST_DRIVER_VERSION "3.6.0000.1" |
38 | #define ST_VER_MAJOR 3 | 39 | #define ST_VER_MAJOR 3 |
39 | #define ST_VER_MINOR 1 | 40 | #define ST_VER_MINOR 6 |
40 | #define ST_OEM 0 | 41 | #define ST_OEM 0 |
41 | #define ST_BUILD_VER 1 | 42 | #define ST_BUILD_VER 1 |
42 | 43 | ||
@@ -113,10 +114,6 @@ enum { | |||
113 | SG_CF_64B = 0x40, /* 64 bit item */ | 114 | SG_CF_64B = 0x40, /* 64 bit item */ |
114 | SG_CF_HOST = 0x20, /* sg in host memory */ | 115 | SG_CF_HOST = 0x20, /* sg in host memory */ |
115 | 116 | ||
116 | ST_MAX_ARRAY_SUPPORTED = 16, | ||
117 | ST_MAX_TARGET_NUM = (ST_MAX_ARRAY_SUPPORTED+1), | ||
118 | ST_MAX_LUN_PER_TARGET = 16, | ||
119 | |||
120 | st_shasta = 0, | 117 | st_shasta = 0, |
121 | st_vsc = 1, | 118 | st_vsc = 1, |
122 | st_vsc1 = 2, | 119 | st_vsc1 = 2, |
@@ -586,7 +583,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
586 | u16 tag; | 583 | u16 tag; |
587 | host = cmd->device->host; | 584 | host = cmd->device->host; |
588 | id = cmd->device->id; | 585 | id = cmd->device->id; |
589 | lun = cmd->device->channel; /* firmware lun issue work around */ | 586 | lun = cmd->device->lun; |
590 | hba = (struct st_hba *) &host->hostdata[0]; | 587 | hba = (struct st_hba *) &host->hostdata[0]; |
591 | 588 | ||
592 | switch (cmd->cmnd[0]) { | 589 | switch (cmd->cmnd[0]) { |
@@ -605,8 +602,26 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
605 | stex_invalid_field(cmd, done); | 602 | stex_invalid_field(cmd, done); |
606 | return 0; | 603 | return 0; |
607 | } | 604 | } |
605 | case REPORT_LUNS: | ||
606 | /* | ||
607 | * The shasta firmware does not report actual luns in the | ||
608 | * target, so fail the command to force sequential lun scan. | ||
609 | * Also, the console device does not support this command. | ||
610 | */ | ||
611 | if (hba->cardtype == st_shasta || id == host->max_id - 1) { | ||
612 | stex_invalid_field(cmd, done); | ||
613 | return 0; | ||
614 | } | ||
615 | break; | ||
616 | case TEST_UNIT_READY: | ||
617 | if (id == host->max_id - 1) { | ||
618 | cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; | ||
619 | done(cmd); | ||
620 | return 0; | ||
621 | } | ||
622 | break; | ||
608 | case INQUIRY: | 623 | case INQUIRY: |
609 | if (id != ST_MAX_ARRAY_SUPPORTED) | 624 | if (id != host->max_id - 1) |
610 | break; | 625 | break; |
611 | if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) { | 626 | if (lun == 0 && (cmd->cmnd[1] & INQUIRY_EVPD) == 0) { |
612 | stex_direct_copy(cmd, console_inq_page, | 627 | stex_direct_copy(cmd, console_inq_page, |
@@ -624,7 +639,7 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
624 | ver.oem = ST_OEM; | 639 | ver.oem = ST_OEM; |
625 | ver.build = ST_BUILD_VER; | 640 | ver.build = ST_BUILD_VER; |
626 | ver.signature[0] = PASSTHRU_SIGNATURE; | 641 | ver.signature[0] = PASSTHRU_SIGNATURE; |
627 | ver.console_id = ST_MAX_ARRAY_SUPPORTED; | 642 | ver.console_id = host->max_id - 1; |
628 | ver.host_no = hba->host->host_no; | 643 | ver.host_no = hba->host->host_no; |
629 | cmd->result = stex_direct_copy(cmd, &ver, sizeof(ver)) ? | 644 | cmd->result = stex_direct_copy(cmd, &ver, sizeof(ver)) ? |
630 | DID_OK << 16 | COMMAND_COMPLETE << 8 : | 645 | DID_OK << 16 | COMMAND_COMPLETE << 8 : |
@@ -645,13 +660,8 @@ stex_queuecommand(struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) | |||
645 | 660 | ||
646 | req = stex_alloc_req(hba); | 661 | req = stex_alloc_req(hba); |
647 | 662 | ||
648 | if (hba->cardtype == st_yosemite) { | 663 | req->lun = lun; |
649 | req->lun = lun * (ST_MAX_TARGET_NUM - 1) + id; | 664 | req->target = id; |
650 | req->target = 0; | ||
651 | } else { | ||
652 | req->lun = lun; | ||
653 | req->target = id; | ||
654 | } | ||
655 | 665 | ||
656 | /* cdb */ | 666 | /* cdb */ |
657 | memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH); | 667 | memcpy(req->cdb, cmd->cmnd, STEX_CDB_LENGTH); |
@@ -767,18 +777,6 @@ static void stex_ys_commands(struct st_hba *hba, | |||
767 | ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT; | 777 | ccb->srb_status = SRB_STATUS_SELECTION_TIMEOUT; |
768 | else | 778 | else |
769 | ccb->srb_status = SRB_STATUS_SUCCESS; | 779 | ccb->srb_status = SRB_STATUS_SUCCESS; |
770 | } else if (ccb->cmd->cmnd[0] == REPORT_LUNS) { | ||
771 | u8 *report_lun_data = (u8 *)hba->copy_buffer; | ||
772 | |||
773 | count = STEX_EXTRA_SIZE; | ||
774 | stex_internal_copy(ccb->cmd, report_lun_data, | ||
775 | &count, ccb->sg_count, ST_FROM_CMD); | ||
776 | if (report_lun_data[2] || report_lun_data[3]) { | ||
777 | report_lun_data[2] = 0x00; | ||
778 | report_lun_data[3] = 0x08; | ||
779 | stex_internal_copy(ccb->cmd, report_lun_data, | ||
780 | &count, ccb->sg_count, ST_TO_CMD); | ||
781 | } | ||
782 | } | 780 | } |
783 | } | 781 | } |
784 | 782 | ||
@@ -995,6 +993,11 @@ static int stex_abort(struct scsi_cmnd *cmd) | |||
995 | u32 data; | 993 | u32 data; |
996 | int result = SUCCESS; | 994 | int result = SUCCESS; |
997 | unsigned long flags; | 995 | unsigned long flags; |
996 | |||
997 | printk(KERN_INFO DRV_NAME | ||
998 | "(%s): aborting command\n", pci_name(hba->pdev)); | ||
999 | scsi_print_command(cmd); | ||
1000 | |||
998 | base = hba->mmio_base; | 1001 | base = hba->mmio_base; |
999 | spin_lock_irqsave(host->host_lock, flags); | 1002 | spin_lock_irqsave(host->host_lock, flags); |
1000 | if (tag < host->can_queue && hba->ccb[tag].cmd == cmd) | 1003 | if (tag < host->can_queue && hba->ccb[tag].cmd == cmd) |
@@ -1051,7 +1054,12 @@ static void stex_hard_reset(struct st_hba *hba) | |||
1051 | pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &pci_bctl); | 1054 | pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &pci_bctl); |
1052 | pci_bctl |= PCI_BRIDGE_CTL_BUS_RESET; | 1055 | pci_bctl |= PCI_BRIDGE_CTL_BUS_RESET; |
1053 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); | 1056 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); |
1054 | msleep(1); | 1057 | |
1058 | /* | ||
1059 | * 1 ms may be enough for 8-port controllers. But 16-port controllers | ||
1060 | * require more time to finish bus reset. Use 100 ms here for safety | ||
1061 | */ | ||
1062 | msleep(100); | ||
1055 | pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET; | 1063 | pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET; |
1056 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); | 1064 | pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); |
1057 | 1065 | ||
@@ -1075,6 +1083,10 @@ static int stex_reset(struct scsi_cmnd *cmd) | |||
1075 | unsigned long before; | 1083 | unsigned long before; |
1076 | hba = (struct st_hba *) &cmd->device->host->hostdata[0]; | 1084 | hba = (struct st_hba *) &cmd->device->host->hostdata[0]; |
1077 | 1085 | ||
1086 | printk(KERN_INFO DRV_NAME | ||
1087 | "(%s): resetting host\n", pci_name(hba->pdev)); | ||
1088 | scsi_print_command(cmd); | ||
1089 | |||
1078 | hba->mu_status = MU_STATE_RESETTING; | 1090 | hba->mu_status = MU_STATE_RESETTING; |
1079 | 1091 | ||
1080 | if (hba->cardtype == st_shasta) | 1092 | if (hba->cardtype == st_shasta) |
@@ -1194,7 +1206,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1194 | goto out_scsi_host_put; | 1206 | goto out_scsi_host_put; |
1195 | } | 1207 | } |
1196 | 1208 | ||
1197 | hba->mmio_base = ioremap(pci_resource_start(pdev, 0), | 1209 | hba->mmio_base = ioremap_nocache(pci_resource_start(pdev, 0), |
1198 | pci_resource_len(pdev, 0)); | 1210 | pci_resource_len(pdev, 0)); |
1199 | if ( !hba->mmio_base) { | 1211 | if ( !hba->mmio_base) { |
1200 | printk(KERN_ERR DRV_NAME "(%s): memory map failed\n", | 1212 | printk(KERN_ERR DRV_NAME "(%s): memory map failed\n", |
@@ -1229,12 +1241,18 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1229 | hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE; | 1241 | hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE; |
1230 | hba->mu_status = MU_STATE_STARTING; | 1242 | hba->mu_status = MU_STATE_STARTING; |
1231 | 1243 | ||
1232 | /* firmware uses id/lun pair for a logical drive, but lun would be | 1244 | if (hba->cardtype == st_shasta) { |
1233 | always 0 if CONFIG_SCSI_MULTI_LUN not configured, so we use | 1245 | host->max_lun = 8; |
1234 | channel to map lun here */ | 1246 | host->max_id = 16 + 1; |
1235 | host->max_channel = ST_MAX_LUN_PER_TARGET - 1; | 1247 | } else if (hba->cardtype == st_yosemite) { |
1236 | host->max_id = ST_MAX_TARGET_NUM; | 1248 | host->max_lun = 128; |
1237 | host->max_lun = 1; | 1249 | host->max_id = 1 + 1; |
1250 | } else { | ||
1251 | /* st_vsc and st_vsc1 */ | ||
1252 | host->max_lun = 1; | ||
1253 | host->max_id = 128 + 1; | ||
1254 | } | ||
1255 | host->max_channel = 0; | ||
1238 | host->unique_id = host->host_no; | 1256 | host->unique_id = host->host_no; |
1239 | host->max_cmd_len = STEX_CDB_LENGTH; | 1257 | host->max_cmd_len = STEX_CDB_LENGTH; |
1240 | 1258 | ||
diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c index 1a9a24b82636..00d1255e4c12 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c | |||
@@ -167,8 +167,9 @@ static void pl010_rx_chars(struct uart_amba_port *uap) | |||
167 | ignore_char: | 167 | ignore_char: |
168 | status = readb(uap->port.membase + UART01x_FR); | 168 | status = readb(uap->port.membase + UART01x_FR); |
169 | } | 169 | } |
170 | spin_unlock(&port->lock); | ||
170 | tty_flip_buffer_push(tty); | 171 | tty_flip_buffer_push(tty); |
171 | return; | 172 | spin_lock(&port->lock); |
172 | } | 173 | } |
173 | 174 | ||
174 | static void pl010_tx_chars(struct uart_amba_port *uap) | 175 | static void pl010_tx_chars(struct uart_amba_port *uap) |
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 44639e71372a..954073c6ce3a 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c | |||
@@ -153,8 +153,9 @@ static void pl011_rx_chars(struct uart_amba_port *uap) | |||
153 | ignore_char: | 153 | ignore_char: |
154 | status = readw(uap->port.membase + UART01x_FR); | 154 | status = readw(uap->port.membase + UART01x_FR); |
155 | } | 155 | } |
156 | spin_unlock(&uap->port.lock); | ||
156 | tty_flip_buffer_push(tty); | 157 | tty_flip_buffer_push(tty); |
157 | return; | 158 | spin_lock(&uap->port.lock); |
158 | } | 159 | } |
159 | 160 | ||
160 | static void pl011_tx_chars(struct uart_amba_port *uap) | 161 | static void pl011_tx_chars(struct uart_amba_port *uap) |
diff --git a/drivers/serial/serial_ks8695.c b/drivers/serial/serial_ks8695.c index 698763b28ddd..8721afe1ae4f 100644 --- a/drivers/serial/serial_ks8695.c +++ b/drivers/serial/serial_ks8695.c | |||
@@ -589,7 +589,7 @@ static int __init ks8695_console_setup(struct console *co, char *options) | |||
589 | return uart_set_options(port, co, baud, parity, bits, flow); | 589 | return uart_set_options(port, co, baud, parity, bits, flow); |
590 | } | 590 | } |
591 | 591 | ||
592 | extern struct uart_driver ks8695_reg; | 592 | static struct uart_driver ks8695_reg; |
593 | 593 | ||
594 | static struct console ks8695_console = { | 594 | static struct console ks8695_console = { |
595 | .name = SERIAL_KS8695_DEVNAME, | 595 | .name = SERIAL_KS8695_DEVNAME, |
diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c index e35d9ab359f1..b45ba5392dd3 100644 --- a/drivers/serial/suncore.c +++ b/drivers/serial/suncore.c | |||
@@ -30,9 +30,9 @@ void | |||
30 | sunserial_console_termios(struct console *con) | 30 | sunserial_console_termios(struct console *con) |
31 | { | 31 | { |
32 | char mode[16], buf[16], *s; | 32 | char mode[16], buf[16], *s; |
33 | char *mode_prop = "ttyX-mode"; | 33 | char mode_prop[] = "ttyX-mode"; |
34 | char *cd_prop = "ttyX-ignore-cd"; | 34 | char cd_prop[] = "ttyX-ignore-cd"; |
35 | char *dtr_prop = "ttyX-rts-dtr-off"; | 35 | char dtr_prop[] = "ttyX-rts-dtr-off"; |
36 | char *ssp_console_modes_prop = "ssp-console-modes"; | 36 | char *ssp_console_modes_prop = "ssp-console-modes"; |
37 | int baud, bits, stop, cflag; | 37 | int baud, bits, stop, cflag; |
38 | char parity; | 38 | char parity; |
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c index 0985193dc57d..15b6e1cb040b 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c | |||
@@ -1239,7 +1239,7 @@ static inline struct console *SUNZILOG_CONSOLE(void) | |||
1239 | #define SUNZILOG_CONSOLE() (NULL) | 1239 | #define SUNZILOG_CONSOLE() (NULL) |
1240 | #endif | 1240 | #endif |
1241 | 1241 | ||
1242 | static void __init sunzilog_init_kbdms(struct uart_sunzilog_port *up, int channel) | 1242 | static void __devinit sunzilog_init_kbdms(struct uart_sunzilog_port *up, int channel) |
1243 | { | 1243 | { |
1244 | int baud, brg; | 1244 | int baud, brg; |
1245 | 1245 | ||
@@ -1259,7 +1259,7 @@ static void __init sunzilog_init_kbdms(struct uart_sunzilog_port *up, int channe | |||
1259 | } | 1259 | } |
1260 | 1260 | ||
1261 | #ifdef CONFIG_SERIO | 1261 | #ifdef CONFIG_SERIO |
1262 | static void __init sunzilog_register_serio(struct uart_sunzilog_port *up) | 1262 | static void __devinit sunzilog_register_serio(struct uart_sunzilog_port *up) |
1263 | { | 1263 | { |
1264 | struct serio *serio = &up->serio; | 1264 | struct serio *serio = &up->serio; |
1265 | 1265 | ||
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 1d8a2f6bb8eb..8b2601de3630 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
@@ -113,16 +113,16 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
113 | 113 | ||
114 | len = as->remaining_bytes; | 114 | len = as->remaining_bytes; |
115 | 115 | ||
116 | tx_dma = xfer->tx_dma; | 116 | tx_dma = xfer->tx_dma + xfer->len - len; |
117 | rx_dma = xfer->rx_dma; | 117 | rx_dma = xfer->rx_dma + xfer->len - len; |
118 | 118 | ||
119 | /* use scratch buffer only when rx or tx data is unspecified */ | 119 | /* use scratch buffer only when rx or tx data is unspecified */ |
120 | if (rx_dma == INVALID_DMA_ADDRESS) { | 120 | if (!xfer->rx_buf) { |
121 | rx_dma = as->buffer_dma; | 121 | rx_dma = as->buffer_dma; |
122 | if (len > BUFFER_SIZE) | 122 | if (len > BUFFER_SIZE) |
123 | len = BUFFER_SIZE; | 123 | len = BUFFER_SIZE; |
124 | } | 124 | } |
125 | if (tx_dma == INVALID_DMA_ADDRESS) { | 125 | if (!xfer->tx_buf) { |
126 | tx_dma = as->buffer_dma; | 126 | tx_dma = as->buffer_dma; |
127 | if (len > BUFFER_SIZE) | 127 | if (len > BUFFER_SIZE) |
128 | len = BUFFER_SIZE; | 128 | len = BUFFER_SIZE; |
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 51daa212c6b7..656be4a5094a 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
@@ -121,7 +121,7 @@ | |||
121 | 32.768 KHz Clock */ | 121 | 32.768 KHz Clock */ |
122 | 122 | ||
123 | /* SPI DMA Register Bit Fields & Masks */ | 123 | /* SPI DMA Register Bit Fields & Masks */ |
124 | #define SPI_DMA_RHDMA (0xF << 4) /* RXFIFO Half Status */ | 124 | #define SPI_DMA_RHDMA (0x1 << 4) /* RXFIFO Half Status */ |
125 | #define SPI_DMA_RFDMA (0x1 << 5) /* RXFIFO Full Status */ | 125 | #define SPI_DMA_RFDMA (0x1 << 5) /* RXFIFO Full Status */ |
126 | #define SPI_DMA_TEDMA (0x1 << 6) /* TXFIFO Empty Status */ | 126 | #define SPI_DMA_TEDMA (0x1 << 6) /* TXFIFO Empty Status */ |
127 | #define SPI_DMA_THDMA (0x1 << 7) /* TXFIFO Half Status */ | 127 | #define SPI_DMA_THDMA (0x1 << 7) /* TXFIFO Half Status */ |
@@ -1355,6 +1355,7 @@ static int setup(struct spi_device *spi) | |||
1355 | spi->bits_per_word, | 1355 | spi->bits_per_word, |
1356 | spi_speed_hz(SPI_CONTROL_DATARATE_MIN), | 1356 | spi_speed_hz(SPI_CONTROL_DATARATE_MIN), |
1357 | spi->max_speed_hz); | 1357 | spi->max_speed_hz); |
1358 | return status; | ||
1358 | 1359 | ||
1359 | err_first_setup: | 1360 | err_first_setup: |
1360 | kfree(chip); | 1361 | kfree(chip); |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index e277258df382..8969e42434b9 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1681,7 +1681,7 @@ void usb_remove_hcd(struct usb_hcd *hcd) | |||
1681 | spin_unlock_irq (&hcd_root_hub_lock); | 1681 | spin_unlock_irq (&hcd_root_hub_lock); |
1682 | 1682 | ||
1683 | #ifdef CONFIG_PM | 1683 | #ifdef CONFIG_PM |
1684 | flush_workqueue(ksuspend_usb_wq); | 1684 | cancel_work_sync(&hcd->wakeup_work); |
1685 | #endif | 1685 | #endif |
1686 | 1686 | ||
1687 | mutex_lock(&usb_bus_list_lock); | 1687 | mutex_lock(&usb_bus_list_lock); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index caaa46f2dec7..24f10a19dbdb 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1158,6 +1158,30 @@ static void release_address(struct usb_device *udev) | |||
1158 | } | 1158 | } |
1159 | } | 1159 | } |
1160 | 1160 | ||
1161 | #ifdef CONFIG_USB_SUSPEND | ||
1162 | |||
1163 | static void usb_stop_pm(struct usb_device *udev) | ||
1164 | { | ||
1165 | /* Synchronize with the ksuspend thread to prevent any more | ||
1166 | * autosuspend requests from being submitted, and decrement | ||
1167 | * the parent's count of unsuspended children. | ||
1168 | */ | ||
1169 | usb_pm_lock(udev); | ||
1170 | if (udev->parent && !udev->discon_suspended) | ||
1171 | usb_autosuspend_device(udev->parent); | ||
1172 | usb_pm_unlock(udev); | ||
1173 | |||
1174 | /* Stop any autosuspend requests already submitted */ | ||
1175 | cancel_rearming_delayed_work(&udev->autosuspend); | ||
1176 | } | ||
1177 | |||
1178 | #else | ||
1179 | |||
1180 | static inline void usb_stop_pm(struct usb_device *udev) | ||
1181 | { } | ||
1182 | |||
1183 | #endif | ||
1184 | |||
1161 | /** | 1185 | /** |
1162 | * usb_disconnect - disconnect a device (usbcore-internal) | 1186 | * usb_disconnect - disconnect a device (usbcore-internal) |
1163 | * @pdev: pointer to device being disconnected | 1187 | * @pdev: pointer to device being disconnected |
@@ -1224,13 +1248,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
1224 | *pdev = NULL; | 1248 | *pdev = NULL; |
1225 | spin_unlock_irq(&device_state_lock); | 1249 | spin_unlock_irq(&device_state_lock); |
1226 | 1250 | ||
1227 | /* Decrement the parent's count of unsuspended children */ | 1251 | usb_stop_pm(udev); |
1228 | if (udev->parent) { | ||
1229 | usb_pm_lock(udev); | ||
1230 | if (!udev->discon_suspended) | ||
1231 | usb_autosuspend_device(udev->parent); | ||
1232 | usb_pm_unlock(udev); | ||
1233 | } | ||
1234 | 1252 | ||
1235 | put_device(&udev->dev); | 1253 | put_device(&udev->dev); |
1236 | } | 1254 | } |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 80627b6a2bf9..4a6299bd0047 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -184,10 +184,6 @@ static void usb_release_dev(struct device *dev) | |||
184 | 184 | ||
185 | udev = to_usb_device(dev); | 185 | udev = to_usb_device(dev); |
186 | 186 | ||
187 | #ifdef CONFIG_USB_SUSPEND | ||
188 | cancel_delayed_work(&udev->autosuspend); | ||
189 | flush_workqueue(ksuspend_usb_wq); | ||
190 | #endif | ||
191 | usb_destroy_configuration(udev); | 187 | usb_destroy_configuration(udev); |
192 | usb_put_hcd(bus_to_hcd(udev->bus)); | 188 | usb_put_hcd(bus_to_hcd(udev->bus)); |
193 | kfree(udev->product); | 189 | kfree(udev->product); |
diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c index ba6fede5c466..8a1b07c74394 100644 --- a/drivers/video/arkfb.c +++ b/drivers/video/arkfb.c | |||
@@ -1055,9 +1055,10 @@ err_enable_device: | |||
1055 | static void __devexit ark_pci_remove(struct pci_dev *dev) | 1055 | static void __devexit ark_pci_remove(struct pci_dev *dev) |
1056 | { | 1056 | { |
1057 | struct fb_info *info = pci_get_drvdata(dev); | 1057 | struct fb_info *info = pci_get_drvdata(dev); |
1058 | struct arkfb_info *par = info->par; | ||
1059 | 1058 | ||
1060 | if (info) { | 1059 | if (info) { |
1060 | struct arkfb_info *par = info->par; | ||
1061 | |||
1061 | #ifdef CONFIG_MTRR | 1062 | #ifdef CONFIG_MTRR |
1062 | if (par->mtrr_reg >= 0) { | 1063 | if (par->mtrr_reg >= 0) { |
1063 | mtrr_del(par->mtrr_reg, 0, 0); | 1064 | mtrr_del(par->mtrr_reg, 0, 0); |
diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index 71f24e00fcd0..8e6ef4bc7a5c 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h | |||
@@ -176,7 +176,6 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info); | |||
176 | #endif | 176 | #endif |
177 | extern void fbcon_set_bitops(struct fbcon_ops *ops); | 177 | extern void fbcon_set_bitops(struct fbcon_ops *ops); |
178 | extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); | 178 | extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); |
179 | extern struct class *fb_class; | ||
180 | 179 | ||
181 | #define FBCON_ATTRIBUTE_UNDERLINE 1 | 180 | #define FBCON_ATTRIBUTE_UNDERLINE 1 |
182 | #define FBCON_ATTRIBUTE_REVERSE 2 | 181 | #define FBCON_ATTRIBUTE_REVERSE 2 |
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c index bd30aba242d0..731d7a5c5aa2 100644 --- a/drivers/video/neofb.c +++ b/drivers/video/neofb.c | |||
@@ -1286,34 +1286,36 @@ static int neofb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
1286 | if (regno >= fb->cmap.len || regno > 255) | 1286 | if (regno >= fb->cmap.len || regno > 255) |
1287 | return -EINVAL; | 1287 | return -EINVAL; |
1288 | 1288 | ||
1289 | switch (fb->var.bits_per_pixel) { | 1289 | if (fb->var.bits_per_pixel <= 8) { |
1290 | case 8: | ||
1291 | outb(regno, 0x3c8); | 1290 | outb(regno, 0x3c8); |
1292 | 1291 | ||
1293 | outb(red >> 10, 0x3c9); | 1292 | outb(red >> 10, 0x3c9); |
1294 | outb(green >> 10, 0x3c9); | 1293 | outb(green >> 10, 0x3c9); |
1295 | outb(blue >> 10, 0x3c9); | 1294 | outb(blue >> 10, 0x3c9); |
1296 | break; | 1295 | } else if (regno < 16) { |
1297 | case 16: | 1296 | switch (fb->var.bits_per_pixel) { |
1298 | ((u32 *) fb->pseudo_palette)[regno] = | 1297 | case 16: |
1298 | ((u32 *) fb->pseudo_palette)[regno] = | ||
1299 | ((red & 0xf800)) | ((green & 0xfc00) >> 5) | | 1299 | ((red & 0xf800)) | ((green & 0xfc00) >> 5) | |
1300 | ((blue & 0xf800) >> 11); | 1300 | ((blue & 0xf800) >> 11); |
1301 | break; | 1301 | break; |
1302 | case 24: | 1302 | case 24: |
1303 | ((u32 *) fb->pseudo_palette)[regno] = | 1303 | ((u32 *) fb->pseudo_palette)[regno] = |
1304 | ((red & 0xff00) << 8) | ((green & 0xff00)) | | 1304 | ((red & 0xff00) << 8) | ((green & 0xff00)) | |
1305 | ((blue & 0xff00) >> 8); | 1305 | ((blue & 0xff00) >> 8); |
1306 | break; | 1306 | break; |
1307 | #ifdef NO_32BIT_SUPPORT_YET | 1307 | #ifdef NO_32BIT_SUPPORT_YET |
1308 | case 32: | 1308 | case 32: |
1309 | ((u32 *) fb->pseudo_palette)[regno] = | 1309 | ((u32 *) fb->pseudo_palette)[regno] = |
1310 | ((transp & 0xff00) << 16) | ((red & 0xff00) << 8) | | 1310 | ((transp & 0xff00) << 16) | ((red & 0xff00) << 8) | |
1311 | ((green & 0xff00)) | ((blue & 0xff00) >> 8); | 1311 | ((green & 0xff00)) | ((blue & 0xff00) >> 8); |
1312 | break; | 1312 | break; |
1313 | #endif | 1313 | #endif |
1314 | default: | 1314 | default: |
1315 | return 1; | 1315 | return 1; |
1316 | } | ||
1316 | } | 1317 | } |
1318 | |||
1317 | return 0; | 1319 | return 0; |
1318 | } | 1320 | } |
1319 | 1321 | ||
diff --git a/drivers/video/pm3fb.c b/drivers/video/pm3fb.c index 616a0c08e30c..b52e883f0a52 100644 --- a/drivers/video/pm3fb.c +++ b/drivers/video/pm3fb.c | |||
@@ -498,7 +498,7 @@ static int pm3fb_set_par(struct fb_info *info) | |||
498 | else | 498 | else |
499 | par->video |= PM3VideoControl_LINE_DOUBLE_OFF; | 499 | par->video |= PM3VideoControl_LINE_DOUBLE_OFF; |
500 | 500 | ||
501 | if (info->var.activate == FB_ACTIVATE_NOW) | 501 | if ((info->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) |
502 | par->video |= PM3VideoControl_ENABLE; | 502 | par->video |= PM3VideoControl_ENABLE; |
503 | else { | 503 | else { |
504 | par->video |= PM3VideoControl_DISABLE; | 504 | par->video |= PM3VideoControl_DISABLE; |
diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c index 836a612af977..64779e70408f 100644 --- a/drivers/video/skeletonfb.c +++ b/drivers/video/skeletonfb.c | |||
@@ -132,7 +132,6 @@ static struct fb_info info; | |||
132 | static struct xxx_par __initdata current_par; | 132 | static struct xxx_par __initdata current_par; |
133 | 133 | ||
134 | int xxxfb_init(void); | 134 | int xxxfb_init(void); |
135 | int xxxfb_setup(char*); | ||
136 | 135 | ||
137 | /** | 136 | /** |
138 | * xxxfb_open - Optional function. Called when the framebuffer is | 137 | * xxxfb_open - Optional function. Called when the framebuffer is |
@@ -975,6 +974,21 @@ static struct platform_device xxxfb_device = { | |||
975 | .name = "xxxfb", | 974 | .name = "xxxfb", |
976 | }; | 975 | }; |
977 | 976 | ||
977 | #ifndef MODULE | ||
978 | /* | ||
979 | * Setup | ||
980 | */ | ||
981 | |||
982 | /* | ||
983 | * Only necessary if your driver takes special options, | ||
984 | * otherwise we fall back on the generic fb_setup(). | ||
985 | */ | ||
986 | int __init xxxfb_setup(char *options) | ||
987 | { | ||
988 | /* Parse user speficied options (`video=xxxfb:') */ | ||
989 | } | ||
990 | #endif /* MODULE */ | ||
991 | |||
978 | static int __init xxxfb_init(void) | 992 | static int __init xxxfb_init(void) |
979 | { | 993 | { |
980 | int ret; | 994 | int ret; |
@@ -1006,21 +1020,6 @@ static void __exit xxxfb_exit(void) | |||
1006 | } | 1020 | } |
1007 | #endif /* CONFIG_PCI */ | 1021 | #endif /* CONFIG_PCI */ |
1008 | 1022 | ||
1009 | #ifdef MODULE | ||
1010 | /* | ||
1011 | * Setup | ||
1012 | */ | ||
1013 | |||
1014 | /* | ||
1015 | * Only necessary if your driver takes special options, | ||
1016 | * otherwise we fall back on the generic fb_setup(). | ||
1017 | */ | ||
1018 | int __init xxxfb_setup(char *options) | ||
1019 | { | ||
1020 | /* Parse user speficied options (`video=xxxfb:') */ | ||
1021 | } | ||
1022 | #endif /* MODULE */ | ||
1023 | |||
1024 | /* ------------------------------------------------------------------------- */ | 1023 | /* ------------------------------------------------------------------------- */ |
1025 | 1024 | ||
1026 | 1025 | ||
diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c index 5e9755e464a1..30c0b948852b 100644 --- a/drivers/video/vt8623fb.c +++ b/drivers/video/vt8623fb.c | |||
@@ -778,9 +778,10 @@ err_enable_device: | |||
778 | static void __devexit vt8623_pci_remove(struct pci_dev *dev) | 778 | static void __devexit vt8623_pci_remove(struct pci_dev *dev) |
779 | { | 779 | { |
780 | struct fb_info *info = pci_get_drvdata(dev); | 780 | struct fb_info *info = pci_get_drvdata(dev); |
781 | struct vt8623fb_info *par = info->par; | ||
782 | 781 | ||
783 | if (info) { | 782 | if (info) { |
783 | struct vt8623fb_info *par = info->par; | ||
784 | |||
784 | #ifdef CONFIG_MTRR | 785 | #ifdef CONFIG_MTRR |
785 | if (par->mtrr_reg >= 0) { | 786 | if (par->mtrr_reg >= 0) { |
786 | mtrr_del(par->mtrr_reg, 0, 0); | 787 | mtrr_del(par->mtrr_reg, 0, 0); |