diff options
Diffstat (limited to 'drivers')
113 files changed, 1243 insertions, 983 deletions
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c index baa5fc05e124..db307a356f08 100644 --- a/drivers/acpi/acpica/hwsleep.c +++ b/drivers/acpi/acpica/hwsleep.c | |||
@@ -211,6 +211,12 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state) | |||
211 | 211 | ||
212 | ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep) | 212 | ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep) |
213 | 213 | ||
214 | static unsigned int gts, bfs; | ||
215 | module_param(gts, uint, 0644); | ||
216 | module_param(bfs, uint, 0644); | ||
217 | MODULE_PARM_DESC(gts, "Enable evaluation of _GTS on suspend."); | ||
218 | MODULE_PARM_DESC(bfs, "Enable evaluation of _BFS on resume".); | ||
219 | |||
214 | /******************************************************************************* | 220 | /******************************************************************************* |
215 | * | 221 | * |
216 | * FUNCTION: acpi_enter_sleep_state | 222 | * FUNCTION: acpi_enter_sleep_state |
@@ -278,16 +284,18 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state) | |||
278 | return_ACPI_STATUS(status); | 284 | return_ACPI_STATUS(status); |
279 | } | 285 | } |
280 | 286 | ||
281 | /* Execute the _GTS method */ | 287 | if (gts) { |
288 | /* Execute the _GTS method */ | ||
282 | 289 | ||
283 | arg_list.count = 1; | 290 | arg_list.count = 1; |
284 | arg_list.pointer = &arg; | 291 | arg_list.pointer = &arg; |
285 | arg.type = ACPI_TYPE_INTEGER; | 292 | arg.type = ACPI_TYPE_INTEGER; |
286 | arg.integer.value = sleep_state; | 293 | arg.integer.value = sleep_state; |
287 | 294 | ||
288 | status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL); | 295 | status = acpi_evaluate_object(NULL, METHOD_NAME__GTS, &arg_list, NULL); |
289 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { | 296 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { |
290 | return_ACPI_STATUS(status); | 297 | return_ACPI_STATUS(status); |
298 | } | ||
291 | } | 299 | } |
292 | 300 | ||
293 | /* Get current value of PM1A control */ | 301 | /* Get current value of PM1A control */ |
@@ -513,18 +521,19 @@ acpi_status acpi_leave_sleep_state_prep(u8 sleep_state) | |||
513 | } | 521 | } |
514 | } | 522 | } |
515 | 523 | ||
516 | /* Execute the _BFS method */ | 524 | if (bfs) { |
525 | /* Execute the _BFS method */ | ||
517 | 526 | ||
518 | arg_list.count = 1; | 527 | arg_list.count = 1; |
519 | arg_list.pointer = &arg; | 528 | arg_list.pointer = &arg; |
520 | arg.type = ACPI_TYPE_INTEGER; | 529 | arg.type = ACPI_TYPE_INTEGER; |
521 | arg.integer.value = sleep_state; | 530 | arg.integer.value = sleep_state; |
522 | 531 | ||
523 | status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL); | 532 | status = acpi_evaluate_object(NULL, METHOD_NAME__BFS, &arg_list, NULL); |
524 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { | 533 | if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { |
525 | ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS")); | 534 | ACPI_EXCEPTION((AE_INFO, status, "During Method _BFS")); |
535 | } | ||
526 | } | 536 | } |
527 | |||
528 | return_ACPI_STATUS(status); | 537 | return_ACPI_STATUS(status); |
529 | } | 538 | } |
530 | 539 | ||
diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c index 7737afb157c3..ec33f270c5b7 100644 --- a/drivers/acpi/acpica/hwvalid.c +++ b/drivers/acpi/acpica/hwvalid.c | |||
@@ -90,6 +90,7 @@ static const struct acpi_port_info acpi_protected_ports[] = { | |||
90 | {"PIT2", 0x0048, 0x004B, ACPI_OSI_WIN_XP}, | 90 | {"PIT2", 0x0048, 0x004B, ACPI_OSI_WIN_XP}, |
91 | {"RTC", 0x0070, 0x0071, ACPI_OSI_WIN_XP}, | 91 | {"RTC", 0x0070, 0x0071, ACPI_OSI_WIN_XP}, |
92 | {"CMOS", 0x0074, 0x0076, ACPI_OSI_WIN_XP}, | 92 | {"CMOS", 0x0074, 0x0076, ACPI_OSI_WIN_XP}, |
93 | {"DMA1", 0x0081, 0x0083, ACPI_OSI_WIN_XP}, | ||
93 | {"DMA1L", 0x0087, 0x0087, ACPI_OSI_WIN_XP}, | 94 | {"DMA1L", 0x0087, 0x0087, ACPI_OSI_WIN_XP}, |
94 | {"DMA2", 0x0089, 0x008B, ACPI_OSI_WIN_XP}, | 95 | {"DMA2", 0x0089, 0x008B, ACPI_OSI_WIN_XP}, |
95 | {"DMA2L", 0x008F, 0x008F, ACPI_OSI_WIN_XP}, | 96 | {"DMA2L", 0x008F, 0x008F, ACPI_OSI_WIN_XP}, |
@@ -151,7 +152,7 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width) | |||
151 | ACPI_ERROR((AE_INFO, | 152 | ACPI_ERROR((AE_INFO, |
152 | "Illegal I/O port address/length above 64K: 0x%p/%X", | 153 | "Illegal I/O port address/length above 64K: 0x%p/%X", |
153 | ACPI_CAST_PTR(void, address), byte_width)); | 154 | ACPI_CAST_PTR(void, address), byte_width)); |
154 | return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS); | 155 | return_ACPI_STATUS(AE_LIMIT); |
155 | } | 156 | } |
156 | 157 | ||
157 | /* Exit if requested address is not within the protected port table */ | 158 | /* Exit if requested address is not within the protected port table */ |
@@ -178,11 +179,12 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width) | |||
178 | /* Port illegality may depend on the _OSI calls made by the BIOS */ | 179 | /* Port illegality may depend on the _OSI calls made by the BIOS */ |
179 | 180 | ||
180 | if (acpi_gbl_osi_data >= port_info->osi_dependency) { | 181 | if (acpi_gbl_osi_data >= port_info->osi_dependency) { |
181 | ACPI_ERROR((AE_INFO, | 182 | ACPI_DEBUG_PRINT((ACPI_DB_IO, |
182 | "Denied AML access to port 0x%p/%X (%s 0x%.4X-0x%.4X)", | 183 | "Denied AML access to port 0x%p/%X (%s 0x%.4X-0x%.4X)", |
183 | ACPI_CAST_PTR(void, address), | 184 | ACPI_CAST_PTR(void, address), |
184 | byte_width, port_info->name, | 185 | byte_width, port_info->name, |
185 | port_info->start, port_info->end)); | 186 | port_info->start, |
187 | port_info->end)); | ||
186 | 188 | ||
187 | return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS); | 189 | return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS); |
188 | } | 190 | } |
@@ -206,7 +208,7 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width) | |||
206 | * Value Where value is placed | 208 | * Value Where value is placed |
207 | * Width Number of bits | 209 | * Width Number of bits |
208 | * | 210 | * |
209 | * RETURN: Value read from port | 211 | * RETURN: Status and value read from port |
210 | * | 212 | * |
211 | * DESCRIPTION: Read data from an I/O port or register. This is a front-end | 213 | * DESCRIPTION: Read data from an I/O port or register. This is a front-end |
212 | * to acpi_os_read_port that performs validation on both the port | 214 | * to acpi_os_read_port that performs validation on both the port |
@@ -217,14 +219,43 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width) | |||
217 | acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width) | 219 | acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width) |
218 | { | 220 | { |
219 | acpi_status status; | 221 | acpi_status status; |
222 | u32 one_byte; | ||
223 | u32 i; | ||
224 | |||
225 | /* Validate the entire request and perform the I/O */ | ||
220 | 226 | ||
221 | status = acpi_hw_validate_io_request(address, width); | 227 | status = acpi_hw_validate_io_request(address, width); |
222 | if (ACPI_FAILURE(status)) { | 228 | if (ACPI_SUCCESS(status)) { |
229 | status = acpi_os_read_port(address, value, width); | ||
223 | return status; | 230 | return status; |
224 | } | 231 | } |
225 | 232 | ||
226 | status = acpi_os_read_port(address, value, width); | 233 | if (status != AE_AML_ILLEGAL_ADDRESS) { |
227 | return status; | 234 | return status; |
235 | } | ||
236 | |||
237 | /* | ||
238 | * There has been a protection violation within the request. Fall | ||
239 | * back to byte granularity port I/O and ignore the failing bytes. | ||
240 | * This provides Windows compatibility. | ||
241 | */ | ||
242 | for (i = 0, *value = 0; i < width; i += 8) { | ||
243 | |||
244 | /* Validate and read one byte */ | ||
245 | |||
246 | if (acpi_hw_validate_io_request(address, 8) == AE_OK) { | ||
247 | status = acpi_os_read_port(address, &one_byte, 8); | ||
248 | if (ACPI_FAILURE(status)) { | ||
249 | return status; | ||
250 | } | ||
251 | |||
252 | *value |= (one_byte << i); | ||
253 | } | ||
254 | |||
255 | address++; | ||
256 | } | ||
257 | |||
258 | return AE_OK; | ||
228 | } | 259 | } |
229 | 260 | ||
230 | /****************************************************************************** | 261 | /****************************************************************************** |
@@ -235,7 +266,7 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width) | |||
235 | * Value Value to write | 266 | * Value Value to write |
236 | * Width Number of bits | 267 | * Width Number of bits |
237 | * | 268 | * |
238 | * RETURN: None | 269 | * RETURN: Status |
239 | * | 270 | * |
240 | * DESCRIPTION: Write data to an I/O port or register. This is a front-end | 271 | * DESCRIPTION: Write data to an I/O port or register. This is a front-end |
241 | * to acpi_os_write_port that performs validation on both the port | 272 | * to acpi_os_write_port that performs validation on both the port |
@@ -246,12 +277,39 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width) | |||
246 | acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width) | 277 | acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width) |
247 | { | 278 | { |
248 | acpi_status status; | 279 | acpi_status status; |
280 | u32 i; | ||
281 | |||
282 | /* Validate the entire request and perform the I/O */ | ||
249 | 283 | ||
250 | status = acpi_hw_validate_io_request(address, width); | 284 | status = acpi_hw_validate_io_request(address, width); |
251 | if (ACPI_FAILURE(status)) { | 285 | if (ACPI_SUCCESS(status)) { |
286 | status = acpi_os_write_port(address, value, width); | ||
252 | return status; | 287 | return status; |
253 | } | 288 | } |
254 | 289 | ||
255 | status = acpi_os_write_port(address, value, width); | 290 | if (status != AE_AML_ILLEGAL_ADDRESS) { |
256 | return status; | 291 | return status; |
292 | } | ||
293 | |||
294 | /* | ||
295 | * There has been a protection violation within the request. Fall | ||
296 | * back to byte granularity port I/O and ignore the failing bytes. | ||
297 | * This provides Windows compatibility. | ||
298 | */ | ||
299 | for (i = 0; i < width; i += 8) { | ||
300 | |||
301 | /* Validate and write one byte */ | ||
302 | |||
303 | if (acpi_hw_validate_io_request(address, 8) == AE_OK) { | ||
304 | status = | ||
305 | acpi_os_write_port(address, (value >> i) & 0xFF, 8); | ||
306 | if (ACPI_FAILURE(status)) { | ||
307 | return status; | ||
308 | } | ||
309 | } | ||
310 | |||
311 | address++; | ||
312 | } | ||
313 | |||
314 | return AE_OK; | ||
257 | } | 315 | } |
diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index 663f692fffcf..a3c23d686d5f 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c | |||
@@ -191,8 +191,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
191 | user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); | 191 | user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); |
192 | 192 | ||
193 | for (index = 0; index < number_of_elements; index++) { | 193 | for (index = 0; index < number_of_elements; index++) { |
194 | int source_name_index = 2; | ||
195 | int source_index_index = 3; | ||
196 | 194 | ||
197 | /* | 195 | /* |
198 | * Point user_prt past this current structure | 196 | * Point user_prt past this current structure |
@@ -261,27 +259,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
261 | return_ACPI_STATUS(AE_BAD_DATA); | 259 | return_ACPI_STATUS(AE_BAD_DATA); |
262 | } | 260 | } |
263 | 261 | ||
264 | /* | ||
265 | * If BIOS erroneously reversed the _PRT source_name and source_index, | ||
266 | * then reverse them back. | ||
267 | */ | ||
268 | if ((sub_object_list[3])->common.type != | ||
269 | ACPI_TYPE_INTEGER) { | ||
270 | if (acpi_gbl_enable_interpreter_slack) { | ||
271 | source_name_index = 3; | ||
272 | source_index_index = 2; | ||
273 | printk(KERN_WARNING | ||
274 | "ACPI: Handling Garbled _PRT entry\n"); | ||
275 | } else { | ||
276 | ACPI_ERROR((AE_INFO, | ||
277 | "(PRT[%X].source_index) Need Integer, found %s", | ||
278 | index, | ||
279 | acpi_ut_get_object_type_name | ||
280 | (sub_object_list[3]))); | ||
281 | return_ACPI_STATUS(AE_BAD_DATA); | ||
282 | } | ||
283 | } | ||
284 | |||
285 | user_prt->pin = (u32) obj_desc->integer.value; | 262 | user_prt->pin = (u32) obj_desc->integer.value; |
286 | 263 | ||
287 | /* | 264 | /* |
@@ -304,7 +281,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
304 | * 3) Third subobject: Dereference the PRT.source_name | 281 | * 3) Third subobject: Dereference the PRT.source_name |
305 | * The name may be unresolved (slack mode), so allow a null object | 282 | * The name may be unresolved (slack mode), so allow a null object |
306 | */ | 283 | */ |
307 | obj_desc = sub_object_list[source_name_index]; | 284 | obj_desc = sub_object_list[2]; |
308 | if (obj_desc) { | 285 | if (obj_desc) { |
309 | switch (obj_desc->common.type) { | 286 | switch (obj_desc->common.type) { |
310 | case ACPI_TYPE_LOCAL_REFERENCE: | 287 | case ACPI_TYPE_LOCAL_REFERENCE: |
@@ -378,7 +355,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
378 | 355 | ||
379 | /* 4) Fourth subobject: Dereference the PRT.source_index */ | 356 | /* 4) Fourth subobject: Dereference the PRT.source_index */ |
380 | 357 | ||
381 | obj_desc = sub_object_list[source_index_index]; | 358 | obj_desc = sub_object_list[3]; |
382 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { | 359 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { |
383 | ACPI_ERROR((AE_INFO, | 360 | ACPI_ERROR((AE_INFO, |
384 | "(PRT[%X].SourceIndex) Need Integer, found %s", | 361 | "(PRT[%X].SourceIndex) Need Integer, found %s", |
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index d73c94b8441d..9195deba9d94 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * acpi_button.c - ACPI Button Driver ($Revision: 30 $) | 2 | * button.c - ACPI Button Driver |
3 | * | 3 | * |
4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> | 4 | * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> |
5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 5 | * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> |
@@ -41,17 +41,13 @@ | |||
41 | 41 | ||
42 | #define ACPI_BUTTON_SUBCLASS_POWER "power" | 42 | #define ACPI_BUTTON_SUBCLASS_POWER "power" |
43 | #define ACPI_BUTTON_HID_POWER "PNP0C0C" | 43 | #define ACPI_BUTTON_HID_POWER "PNP0C0C" |
44 | #define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button (CM)" | 44 | #define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button" |
45 | #define ACPI_BUTTON_DEVICE_NAME_POWERF "Power Button (FF)" | ||
46 | #define ACPI_BUTTON_TYPE_POWER 0x01 | 45 | #define ACPI_BUTTON_TYPE_POWER 0x01 |
47 | #define ACPI_BUTTON_TYPE_POWERF 0x02 | ||
48 | 46 | ||
49 | #define ACPI_BUTTON_SUBCLASS_SLEEP "sleep" | 47 | #define ACPI_BUTTON_SUBCLASS_SLEEP "sleep" |
50 | #define ACPI_BUTTON_HID_SLEEP "PNP0C0E" | 48 | #define ACPI_BUTTON_HID_SLEEP "PNP0C0E" |
51 | #define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button (CM)" | 49 | #define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button" |
52 | #define ACPI_BUTTON_DEVICE_NAME_SLEEPF "Sleep Button (FF)" | ||
53 | #define ACPI_BUTTON_TYPE_SLEEP 0x03 | 50 | #define ACPI_BUTTON_TYPE_SLEEP 0x03 |
54 | #define ACPI_BUTTON_TYPE_SLEEPF 0x04 | ||
55 | 51 | ||
56 | #define ACPI_BUTTON_SUBCLASS_LID "lid" | 52 | #define ACPI_BUTTON_SUBCLASS_LID "lid" |
57 | #define ACPI_BUTTON_HID_LID "PNP0C0D" | 53 | #define ACPI_BUTTON_HID_LID "PNP0C0D" |
@@ -95,7 +91,6 @@ static struct acpi_driver acpi_button_driver = { | |||
95 | }; | 91 | }; |
96 | 92 | ||
97 | struct acpi_button { | 93 | struct acpi_button { |
98 | struct acpi_device *device; /* Fixed button kludge */ | ||
99 | unsigned int type; | 94 | unsigned int type; |
100 | struct input_dev *input; | 95 | struct input_dev *input; |
101 | char phys[32]; /* for input device */ | 96 | char phys[32]; /* for input device */ |
@@ -126,14 +121,10 @@ static struct proc_dir_entry *acpi_button_dir; | |||
126 | 121 | ||
127 | static int acpi_button_info_seq_show(struct seq_file *seq, void *offset) | 122 | static int acpi_button_info_seq_show(struct seq_file *seq, void *offset) |
128 | { | 123 | { |
129 | struct acpi_button *button = seq->private; | 124 | struct acpi_device *device = seq->private; |
130 | |||
131 | if (!button || !button->device) | ||
132 | return 0; | ||
133 | 125 | ||
134 | seq_printf(seq, "type: %s\n", | 126 | seq_printf(seq, "type: %s\n", |
135 | acpi_device_name(button->device)); | 127 | acpi_device_name(device)); |
136 | |||
137 | return 0; | 128 | return 0; |
138 | } | 129 | } |
139 | 130 | ||
@@ -144,14 +135,11 @@ static int acpi_button_info_open_fs(struct inode *inode, struct file *file) | |||
144 | 135 | ||
145 | static int acpi_button_state_seq_show(struct seq_file *seq, void *offset) | 136 | static int acpi_button_state_seq_show(struct seq_file *seq, void *offset) |
146 | { | 137 | { |
147 | struct acpi_button *button = seq->private; | 138 | struct acpi_device *device = seq->private; |
148 | acpi_status status; | 139 | acpi_status status; |
149 | unsigned long long state; | 140 | unsigned long long state; |
150 | 141 | ||
151 | if (!button || !button->device) | 142 | status = acpi_evaluate_integer(device->handle, "_LID", NULL, &state); |
152 | return 0; | ||
153 | |||
154 | status = acpi_evaluate_integer(button->device->handle, "_LID", NULL, &state); | ||
155 | seq_printf(seq, "state: %s\n", | 143 | seq_printf(seq, "state: %s\n", |
156 | ACPI_FAILURE(status) ? "unsupported" : | 144 | ACPI_FAILURE(status) ? "unsupported" : |
157 | (state ? "open" : "closed")); | 145 | (state ? "open" : "closed")); |
@@ -169,24 +157,17 @@ static struct proc_dir_entry *acpi_lid_dir; | |||
169 | 157 | ||
170 | static int acpi_button_add_fs(struct acpi_device *device) | 158 | static int acpi_button_add_fs(struct acpi_device *device) |
171 | { | 159 | { |
160 | struct acpi_button *button = acpi_driver_data(device); | ||
172 | struct proc_dir_entry *entry = NULL; | 161 | struct proc_dir_entry *entry = NULL; |
173 | struct acpi_button *button; | ||
174 | |||
175 | if (!device || !acpi_driver_data(device)) | ||
176 | return -EINVAL; | ||
177 | |||
178 | button = acpi_driver_data(device); | ||
179 | 162 | ||
180 | switch (button->type) { | 163 | switch (button->type) { |
181 | case ACPI_BUTTON_TYPE_POWER: | 164 | case ACPI_BUTTON_TYPE_POWER: |
182 | case ACPI_BUTTON_TYPE_POWERF: | ||
183 | if (!acpi_power_dir) | 165 | if (!acpi_power_dir) |
184 | acpi_power_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_POWER, | 166 | acpi_power_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_POWER, |
185 | acpi_button_dir); | 167 | acpi_button_dir); |
186 | entry = acpi_power_dir; | 168 | entry = acpi_power_dir; |
187 | break; | 169 | break; |
188 | case ACPI_BUTTON_TYPE_SLEEP: | 170 | case ACPI_BUTTON_TYPE_SLEEP: |
189 | case ACPI_BUTTON_TYPE_SLEEPF: | ||
190 | if (!acpi_sleep_dir) | 171 | if (!acpi_sleep_dir) |
191 | acpi_sleep_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_SLEEP, | 172 | acpi_sleep_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_SLEEP, |
192 | acpi_button_dir); | 173 | acpi_button_dir); |
@@ -210,8 +191,7 @@ static int acpi_button_add_fs(struct acpi_device *device) | |||
210 | /* 'info' [R] */ | 191 | /* 'info' [R] */ |
211 | entry = proc_create_data(ACPI_BUTTON_FILE_INFO, | 192 | entry = proc_create_data(ACPI_BUTTON_FILE_INFO, |
212 | S_IRUGO, acpi_device_dir(device), | 193 | S_IRUGO, acpi_device_dir(device), |
213 | &acpi_button_info_fops, | 194 | &acpi_button_info_fops, device); |
214 | acpi_driver_data(device)); | ||
215 | if (!entry) | 195 | if (!entry) |
216 | return -ENODEV; | 196 | return -ENODEV; |
217 | 197 | ||
@@ -219,8 +199,7 @@ static int acpi_button_add_fs(struct acpi_device *device) | |||
219 | if (button->type == ACPI_BUTTON_TYPE_LID) { | 199 | if (button->type == ACPI_BUTTON_TYPE_LID) { |
220 | entry = proc_create_data(ACPI_BUTTON_FILE_STATE, | 200 | entry = proc_create_data(ACPI_BUTTON_FILE_STATE, |
221 | S_IRUGO, acpi_device_dir(device), | 201 | S_IRUGO, acpi_device_dir(device), |
222 | &acpi_button_state_fops, | 202 | &acpi_button_state_fops, device); |
223 | acpi_driver_data(device)); | ||
224 | if (!entry) | 203 | if (!entry) |
225 | return -ENODEV; | 204 | return -ENODEV; |
226 | } | 205 | } |
@@ -250,15 +229,16 @@ static int acpi_button_remove_fs(struct acpi_device *device) | |||
250 | /* -------------------------------------------------------------------------- | 229 | /* -------------------------------------------------------------------------- |
251 | Driver Interface | 230 | Driver Interface |
252 | -------------------------------------------------------------------------- */ | 231 | -------------------------------------------------------------------------- */ |
253 | static int acpi_lid_send_state(struct acpi_button *button) | 232 | static int acpi_lid_send_state(struct acpi_device *device) |
254 | { | 233 | { |
234 | struct acpi_button *button = acpi_driver_data(device); | ||
255 | unsigned long long state; | 235 | unsigned long long state; |
256 | acpi_status status; | 236 | acpi_status status; |
257 | 237 | ||
258 | status = acpi_evaluate_integer(button->device->handle, "_LID", NULL, | 238 | status = acpi_evaluate_integer(device->handle, "_LID", NULL, &state); |
259 | &state); | ||
260 | if (ACPI_FAILURE(status)) | 239 | if (ACPI_FAILURE(status)) |
261 | return -ENODEV; | 240 | return -ENODEV; |
241 | |||
262 | /* input layer checks if event is redundant */ | 242 | /* input layer checks if event is redundant */ |
263 | input_report_switch(button->input, SW_LID, !state); | 243 | input_report_switch(button->input, SW_LID, !state); |
264 | input_sync(button->input); | 244 | input_sync(button->input); |
@@ -270,9 +250,6 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) | |||
270 | struct acpi_button *button = acpi_driver_data(device); | 250 | struct acpi_button *button = acpi_driver_data(device); |
271 | struct input_dev *input; | 251 | struct input_dev *input; |
272 | 252 | ||
273 | if (!button || !button->device) | ||
274 | return; | ||
275 | |||
276 | switch (event) { | 253 | switch (event) { |
277 | case ACPI_FIXED_HARDWARE_EVENT: | 254 | case ACPI_FIXED_HARDWARE_EVENT: |
278 | event = ACPI_BUTTON_NOTIFY_STATUS; | 255 | event = ACPI_BUTTON_NOTIFY_STATUS; |
@@ -280,7 +257,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) | |||
280 | case ACPI_BUTTON_NOTIFY_STATUS: | 257 | case ACPI_BUTTON_NOTIFY_STATUS: |
281 | input = button->input; | 258 | input = button->input; |
282 | if (button->type == ACPI_BUTTON_TYPE_LID) { | 259 | if (button->type == ACPI_BUTTON_TYPE_LID) { |
283 | acpi_lid_send_state(button); | 260 | acpi_lid_send_state(device); |
284 | } else { | 261 | } else { |
285 | int keycode = test_bit(KEY_SLEEP, input->keybit) ? | 262 | int keycode = test_bit(KEY_SLEEP, input->keybit) ? |
286 | KEY_SLEEP : KEY_POWER; | 263 | KEY_SLEEP : KEY_POWER; |
@@ -291,43 +268,35 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) | |||
291 | input_sync(input); | 268 | input_sync(input); |
292 | } | 269 | } |
293 | 270 | ||
294 | acpi_bus_generate_proc_event(button->device, event, | 271 | acpi_bus_generate_proc_event(device, event, ++button->pushed); |
295 | ++button->pushed); | ||
296 | break; | 272 | break; |
297 | default: | 273 | default: |
298 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 274 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
299 | "Unsupported event [0x%x]\n", event)); | 275 | "Unsupported event [0x%x]\n", event)); |
300 | break; | 276 | break; |
301 | } | 277 | } |
302 | |||
303 | return; | ||
304 | } | 278 | } |
305 | 279 | ||
306 | static int acpi_button_resume(struct acpi_device *device) | 280 | static int acpi_button_resume(struct acpi_device *device) |
307 | { | 281 | { |
308 | struct acpi_button *button; | 282 | struct acpi_button *button = acpi_driver_data(device); |
309 | if (!device) | 283 | |
310 | return -EINVAL; | 284 | if (button->type == ACPI_BUTTON_TYPE_LID) |
311 | button = acpi_driver_data(device); | 285 | return acpi_lid_send_state(device); |
312 | if (button && button->type == ACPI_BUTTON_TYPE_LID) | ||
313 | return acpi_lid_send_state(button); | ||
314 | return 0; | 286 | return 0; |
315 | } | 287 | } |
316 | 288 | ||
317 | static int acpi_button_add(struct acpi_device *device) | 289 | static int acpi_button_add(struct acpi_device *device) |
318 | { | 290 | { |
319 | int error; | ||
320 | struct acpi_button *button; | 291 | struct acpi_button *button; |
321 | struct input_dev *input; | 292 | struct input_dev *input; |
322 | 293 | char *hid, *name, *class; | |
323 | if (!device) | 294 | int error; |
324 | return -EINVAL; | ||
325 | 295 | ||
326 | button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL); | 296 | button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL); |
327 | if (!button) | 297 | if (!button) |
328 | return -ENOMEM; | 298 | return -ENOMEM; |
329 | 299 | ||
330 | button->device = device; | ||
331 | device->driver_data = button; | 300 | device->driver_data = button; |
332 | 301 | ||
333 | button->input = input = input_allocate_device(); | 302 | button->input = input = input_allocate_device(); |
@@ -336,40 +305,29 @@ static int acpi_button_add(struct acpi_device *device) | |||
336 | goto err_free_button; | 305 | goto err_free_button; |
337 | } | 306 | } |
338 | 307 | ||
339 | /* | 308 | hid = acpi_device_hid(device); |
340 | * Determine the button type (via hid), as fixed-feature buttons | 309 | name = acpi_device_name(device); |
341 | * need to be handled a bit differently than generic-space. | 310 | class = acpi_device_class(device); |
342 | */ | 311 | |
343 | if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_POWER)) { | 312 | if (!strcmp(hid, ACPI_BUTTON_HID_POWER) || |
313 | !strcmp(hid, ACPI_BUTTON_HID_POWERF)) { | ||
344 | button->type = ACPI_BUTTON_TYPE_POWER; | 314 | button->type = ACPI_BUTTON_TYPE_POWER; |
345 | strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_POWER); | 315 | strcpy(name, ACPI_BUTTON_DEVICE_NAME_POWER); |
346 | sprintf(acpi_device_class(device), "%s/%s", | 316 | sprintf(class, "%s/%s", |
347 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_POWER); | ||
348 | } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_POWERF)) { | ||
349 | button->type = ACPI_BUTTON_TYPE_POWERF; | ||
350 | strcpy(acpi_device_name(device), | ||
351 | ACPI_BUTTON_DEVICE_NAME_POWERF); | ||
352 | sprintf(acpi_device_class(device), "%s/%s", | ||
353 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_POWER); | 317 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_POWER); |
354 | } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_SLEEP)) { | 318 | } else if (!strcmp(hid, ACPI_BUTTON_HID_SLEEP) || |
319 | !strcmp(hid, ACPI_BUTTON_HID_SLEEPF)) { | ||
355 | button->type = ACPI_BUTTON_TYPE_SLEEP; | 320 | button->type = ACPI_BUTTON_TYPE_SLEEP; |
356 | strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_SLEEP); | 321 | strcpy(name, ACPI_BUTTON_DEVICE_NAME_SLEEP); |
357 | sprintf(acpi_device_class(device), "%s/%s", | 322 | sprintf(class, "%s/%s", |
358 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_SLEEP); | ||
359 | } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_SLEEPF)) { | ||
360 | button->type = ACPI_BUTTON_TYPE_SLEEPF; | ||
361 | strcpy(acpi_device_name(device), | ||
362 | ACPI_BUTTON_DEVICE_NAME_SLEEPF); | ||
363 | sprintf(acpi_device_class(device), "%s/%s", | ||
364 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_SLEEP); | 323 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_SLEEP); |
365 | } else if (!strcmp(acpi_device_hid(device), ACPI_BUTTON_HID_LID)) { | 324 | } else if (!strcmp(hid, ACPI_BUTTON_HID_LID)) { |
366 | button->type = ACPI_BUTTON_TYPE_LID; | 325 | button->type = ACPI_BUTTON_TYPE_LID; |
367 | strcpy(acpi_device_name(device), ACPI_BUTTON_DEVICE_NAME_LID); | 326 | strcpy(name, ACPI_BUTTON_DEVICE_NAME_LID); |
368 | sprintf(acpi_device_class(device), "%s/%s", | 327 | sprintf(class, "%s/%s", |
369 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_LID); | 328 | ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_LID); |
370 | } else { | 329 | } else { |
371 | printk(KERN_ERR PREFIX "Unsupported hid [%s]\n", | 330 | printk(KERN_ERR PREFIX "Unsupported hid [%s]\n", hid); |
372 | acpi_device_hid(device)); | ||
373 | error = -ENODEV; | 331 | error = -ENODEV; |
374 | goto err_free_input; | 332 | goto err_free_input; |
375 | } | 333 | } |
@@ -378,10 +336,9 @@ static int acpi_button_add(struct acpi_device *device) | |||
378 | if (error) | 336 | if (error) |
379 | goto err_free_input; | 337 | goto err_free_input; |
380 | 338 | ||
381 | snprintf(button->phys, sizeof(button->phys), | 339 | snprintf(button->phys, sizeof(button->phys), "%s/button/input0", hid); |
382 | "%s/button/input0", acpi_device_hid(device)); | ||
383 | 340 | ||
384 | input->name = acpi_device_name(device); | 341 | input->name = name; |
385 | input->phys = button->phys; | 342 | input->phys = button->phys; |
386 | input->id.bustype = BUS_HOST; | 343 | input->id.bustype = BUS_HOST; |
387 | input->id.product = button->type; | 344 | input->id.product = button->type; |
@@ -389,13 +346,11 @@ static int acpi_button_add(struct acpi_device *device) | |||
389 | 346 | ||
390 | switch (button->type) { | 347 | switch (button->type) { |
391 | case ACPI_BUTTON_TYPE_POWER: | 348 | case ACPI_BUTTON_TYPE_POWER: |
392 | case ACPI_BUTTON_TYPE_POWERF: | ||
393 | input->evbit[0] = BIT_MASK(EV_KEY); | 349 | input->evbit[0] = BIT_MASK(EV_KEY); |
394 | set_bit(KEY_POWER, input->keybit); | 350 | set_bit(KEY_POWER, input->keybit); |
395 | break; | 351 | break; |
396 | 352 | ||
397 | case ACPI_BUTTON_TYPE_SLEEP: | 353 | case ACPI_BUTTON_TYPE_SLEEP: |
398 | case ACPI_BUTTON_TYPE_SLEEPF: | ||
399 | input->evbit[0] = BIT_MASK(EV_KEY); | 354 | input->evbit[0] = BIT_MASK(EV_KEY); |
400 | set_bit(KEY_SLEEP, input->keybit); | 355 | set_bit(KEY_SLEEP, input->keybit); |
401 | break; | 356 | break; |
@@ -410,7 +365,7 @@ static int acpi_button_add(struct acpi_device *device) | |||
410 | if (error) | 365 | if (error) |
411 | goto err_remove_fs; | 366 | goto err_remove_fs; |
412 | if (button->type == ACPI_BUTTON_TYPE_LID) | 367 | if (button->type == ACPI_BUTTON_TYPE_LID) |
413 | acpi_lid_send_state(button); | 368 | acpi_lid_send_state(device); |
414 | 369 | ||
415 | if (device->wakeup.flags.valid) { | 370 | if (device->wakeup.flags.valid) { |
416 | /* Button's GPE is run-wake GPE */ | 371 | /* Button's GPE is run-wake GPE */ |
@@ -422,9 +377,7 @@ static int acpi_button_add(struct acpi_device *device) | |||
422 | device->wakeup.state.enabled = 1; | 377 | device->wakeup.state.enabled = 1; |
423 | } | 378 | } |
424 | 379 | ||
425 | printk(KERN_INFO PREFIX "%s [%s]\n", | 380 | printk(KERN_INFO PREFIX "%s [%s]\n", name, acpi_device_bid(device)); |
426 | acpi_device_name(device), acpi_device_bid(device)); | ||
427 | |||
428 | return 0; | 381 | return 0; |
429 | 382 | ||
430 | err_remove_fs: | 383 | err_remove_fs: |
@@ -438,17 +391,11 @@ static int acpi_button_add(struct acpi_device *device) | |||
438 | 391 | ||
439 | static int acpi_button_remove(struct acpi_device *device, int type) | 392 | static int acpi_button_remove(struct acpi_device *device, int type) |
440 | { | 393 | { |
441 | struct acpi_button *button; | 394 | struct acpi_button *button = acpi_driver_data(device); |
442 | |||
443 | if (!device || !acpi_driver_data(device)) | ||
444 | return -EINVAL; | ||
445 | |||
446 | button = acpi_driver_data(device); | ||
447 | 395 | ||
448 | acpi_button_remove_fs(device); | 396 | acpi_button_remove_fs(device); |
449 | input_unregister_device(button->input); | 397 | input_unregister_device(button->input); |
450 | kfree(button); | 398 | kfree(button); |
451 | |||
452 | return 0; | 399 | return 0; |
453 | } | 400 | } |
454 | 401 | ||
@@ -459,6 +406,7 @@ static int __init acpi_button_init(void) | |||
459 | acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir); | 406 | acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir); |
460 | if (!acpi_button_dir) | 407 | if (!acpi_button_dir) |
461 | return -ENODEV; | 408 | return -ENODEV; |
409 | |||
462 | result = acpi_bus_register_driver(&acpi_button_driver); | 410 | result = acpi_bus_register_driver(&acpi_button_driver); |
463 | if (result < 0) { | 411 | if (result < 0) { |
464 | remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir); | 412 | remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir); |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 04e90443eff7..391f331674c7 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -1065,6 +1065,7 @@ static int acpi_ec_resume(struct acpi_device *device) | |||
1065 | struct acpi_ec *ec = acpi_driver_data(device); | 1065 | struct acpi_ec *ec = acpi_driver_data(device); |
1066 | /* Enable use of GPE back */ | 1066 | /* Enable use of GPE back */ |
1067 | clear_bit(EC_FLAGS_NO_GPE, &ec->flags); | 1067 | clear_bit(EC_FLAGS_NO_GPE, &ec->flags); |
1068 | set_bit(EC_FLAGS_GPE_MODE, &ec->flags); | ||
1068 | acpi_enable_gpe(NULL, ec->gpe); | 1069 | acpi_enable_gpe(NULL, ec->gpe); |
1069 | return 0; | 1070 | return 0; |
1070 | } | 1071 | } |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index d59f08ecaf16..d916bea729f1 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -353,8 +353,10 @@ static irqreturn_t acpi_irq(int irq, void *dev_id) | |||
353 | if (handled) { | 353 | if (handled) { |
354 | acpi_irq_handled++; | 354 | acpi_irq_handled++; |
355 | return IRQ_HANDLED; | 355 | return IRQ_HANDLED; |
356 | } else | 356 | } else { |
357 | acpi_irq_not_handled++; | ||
357 | return IRQ_NONE; | 358 | return IRQ_NONE; |
359 | } | ||
358 | } | 360 | } |
359 | 361 | ||
360 | acpi_status | 362 | acpi_status |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 6fe121434ffb..f7ca8c55956b 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -581,6 +581,11 @@ static int acpi_processor_power_verify(struct acpi_processor *pr) | |||
581 | for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) { | 581 | for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) { |
582 | struct acpi_processor_cx *cx = &pr->power.states[i]; | 582 | struct acpi_processor_cx *cx = &pr->power.states[i]; |
583 | 583 | ||
584 | #if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86) | ||
585 | /* TSC could halt in idle, so notify users */ | ||
586 | if (tsc_halts_in_c(cx->type)) | ||
587 | mark_tsc_unstable("TSC halts in idle");; | ||
588 | #endif | ||
584 | switch (cx->type) { | 589 | switch (cx->type) { |
585 | case ACPI_STATE_C1: | 590 | case ACPI_STATE_C1: |
586 | cx->valid = 1; | 591 | cx->valid = 1; |
@@ -657,11 +662,9 @@ static int acpi_processor_power_seq_show(struct seq_file *seq, void *offset) | |||
657 | 662 | ||
658 | seq_printf(seq, "active state: C%zd\n" | 663 | seq_printf(seq, "active state: C%zd\n" |
659 | "max_cstate: C%d\n" | 664 | "max_cstate: C%d\n" |
660 | "bus master activity: %08x\n" | ||
661 | "maximum allowed latency: %d usec\n", | 665 | "maximum allowed latency: %d usec\n", |
662 | pr->power.state ? pr->power.state - pr->power.states : 0, | 666 | pr->power.state ? pr->power.state - pr->power.states : 0, |
663 | max_cstate, (unsigned)pr->power.bm_activity, | 667 | max_cstate, pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)); |
664 | pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)); | ||
665 | 668 | ||
666 | seq_puts(seq, "states:\n"); | 669 | seq_puts(seq, "states:\n"); |
667 | 670 | ||
@@ -871,11 +874,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
871 | kt2 = ktime_get_real(); | 874 | kt2 = ktime_get_real(); |
872 | idle_time = ktime_to_us(ktime_sub(kt2, kt1)); | 875 | idle_time = ktime_to_us(ktime_sub(kt2, kt1)); |
873 | 876 | ||
874 | #if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86) | ||
875 | /* TSC could halt in idle, so notify users */ | ||
876 | if (tsc_halts_in_c(cx->type)) | ||
877 | mark_tsc_unstable("TSC halts in idle");; | ||
878 | #endif | ||
879 | sleep_ticks = us_to_pm_timer_ticks(idle_time); | 877 | sleep_ticks = us_to_pm_timer_ticks(idle_time); |
880 | 878 | ||
881 | /* Tell the scheduler how much we idled: */ | 879 | /* Tell the scheduler how much we idled: */ |
@@ -955,6 +953,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
955 | */ | 953 | */ |
956 | acpi_state_timer_broadcast(pr, cx, 1); | 954 | acpi_state_timer_broadcast(pr, cx, 1); |
957 | 955 | ||
956 | kt1 = ktime_get_real(); | ||
958 | /* | 957 | /* |
959 | * disable bus master | 958 | * disable bus master |
960 | * bm_check implies we need ARB_DIS | 959 | * bm_check implies we need ARB_DIS |
@@ -976,10 +975,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
976 | ACPI_FLUSH_CPU_CACHE(); | 975 | ACPI_FLUSH_CPU_CACHE(); |
977 | } | 976 | } |
978 | 977 | ||
979 | kt1 = ktime_get_real(); | ||
980 | acpi_idle_do_entry(cx); | 978 | acpi_idle_do_entry(cx); |
981 | kt2 = ktime_get_real(); | ||
982 | idle_time = ktime_to_us(ktime_sub(kt2, kt1)); | ||
983 | 979 | ||
984 | /* Re-enable bus master arbitration */ | 980 | /* Re-enable bus master arbitration */ |
985 | if (pr->flags.bm_check && pr->flags.bm_control) { | 981 | if (pr->flags.bm_check && pr->flags.bm_control) { |
@@ -988,12 +984,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
988 | c3_cpu_count--; | 984 | c3_cpu_count--; |
989 | spin_unlock(&c3_lock); | 985 | spin_unlock(&c3_lock); |
990 | } | 986 | } |
987 | kt2 = ktime_get_real(); | ||
988 | idle_time = ktime_to_us(ktime_sub(kt2, kt1)); | ||
991 | 989 | ||
992 | #if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86) | ||
993 | /* TSC could halt in idle, so notify users */ | ||
994 | if (tsc_halts_in_c(ACPI_STATE_C3)) | ||
995 | mark_tsc_unstable("TSC halts in idle"); | ||
996 | #endif | ||
997 | sleep_ticks = us_to_pm_timer_ticks(idle_time); | 990 | sleep_ticks = us_to_pm_timer_ticks(idle_time); |
998 | /* Tell the scheduler how much we idled: */ | 991 | /* Tell the scheduler how much we idled: */ |
999 | sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS); | 992 | sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS); |
@@ -1037,6 +1030,9 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr) | |||
1037 | dev->states[i].desc[0] = '\0'; | 1030 | dev->states[i].desc[0] = '\0'; |
1038 | } | 1031 | } |
1039 | 1032 | ||
1033 | if (max_cstate == 0) | ||
1034 | max_cstate = 1; | ||
1035 | |||
1040 | for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) { | 1036 | for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) { |
1041 | cx = &pr->power.states[i]; | 1037 | cx = &pr->power.states[i]; |
1042 | state = &dev->states[count]; | 1038 | state = &dev->states[count]; |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index d060e6fd7fd5..01574a066534 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -713,6 +713,32 @@ static void acpi_power_off(void) | |||
713 | acpi_enter_sleep_state(ACPI_STATE_S5); | 713 | acpi_enter_sleep_state(ACPI_STATE_S5); |
714 | } | 714 | } |
715 | 715 | ||
716 | /* | ||
717 | * ACPI 2.0 created the optional _GTS and _BFS, | ||
718 | * but industry adoption has been neither rapid nor broad. | ||
719 | * | ||
720 | * Linux gets into trouble when it executes poorly validated | ||
721 | * paths through the BIOS, so disable _GTS and _BFS by default, | ||
722 | * but do speak up and offer the option to enable them. | ||
723 | */ | ||
724 | void __init acpi_gts_bfs_check(void) | ||
725 | { | ||
726 | acpi_handle dummy; | ||
727 | |||
728 | if (ACPI_SUCCESS(acpi_get_handle(ACPI_ROOT_OBJECT, METHOD_NAME__GTS, &dummy))) | ||
729 | { | ||
730 | printk(KERN_NOTICE PREFIX "BIOS offers _GTS\n"); | ||
731 | printk(KERN_NOTICE PREFIX "If \"acpi.gts=1\" improves suspend, " | ||
732 | "please notify linux-acpi@vger.kernel.org\n"); | ||
733 | } | ||
734 | if (ACPI_SUCCESS(acpi_get_handle(ACPI_ROOT_OBJECT, METHOD_NAME__BFS, &dummy))) | ||
735 | { | ||
736 | printk(KERN_NOTICE PREFIX "BIOS offers _BFS\n"); | ||
737 | printk(KERN_NOTICE PREFIX "If \"acpi.bfs=1\" improves resume, " | ||
738 | "please notify linux-acpi@vger.kernel.org\n"); | ||
739 | } | ||
740 | } | ||
741 | |||
716 | int __init acpi_sleep_init(void) | 742 | int __init acpi_sleep_init(void) |
717 | { | 743 | { |
718 | acpi_status status; | 744 | acpi_status status; |
@@ -771,5 +797,6 @@ int __init acpi_sleep_init(void) | |||
771 | * object can also be evaluated when the system enters S5. | 797 | * object can also be evaluated when the system enters S5. |
772 | */ | 798 | */ |
773 | register_reboot_notifier(&tts_notifier); | 799 | register_reboot_notifier(&tts_notifier); |
800 | acpi_gts_bfs_check(); | ||
774 | return 0; | 801 | return 0; |
775 | } | 802 | } |
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index da51f05ef8d8..0944daec064f 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
@@ -38,6 +38,7 @@ ACPI_MODULE_NAME("system"); | |||
38 | #define ACPI_SYSTEM_DEVICE_NAME "System" | 38 | #define ACPI_SYSTEM_DEVICE_NAME "System" |
39 | 39 | ||
40 | u32 acpi_irq_handled; | 40 | u32 acpi_irq_handled; |
41 | u32 acpi_irq_not_handled; | ||
41 | 42 | ||
42 | /* | 43 | /* |
43 | * Make ACPICA version work as module param | 44 | * Make ACPICA version work as module param |
@@ -214,8 +215,9 @@ err: | |||
214 | 215 | ||
215 | #define COUNT_GPE 0 | 216 | #define COUNT_GPE 0 |
216 | #define COUNT_SCI 1 /* acpi_irq_handled */ | 217 | #define COUNT_SCI 1 /* acpi_irq_handled */ |
217 | #define COUNT_ERROR 2 /* other */ | 218 | #define COUNT_SCI_NOT 2 /* acpi_irq_not_handled */ |
218 | #define NUM_COUNTERS_EXTRA 3 | 219 | #define COUNT_ERROR 3 /* other */ |
220 | #define NUM_COUNTERS_EXTRA 4 | ||
219 | 221 | ||
220 | struct event_counter { | 222 | struct event_counter { |
221 | u32 count; | 223 | u32 count; |
@@ -317,6 +319,8 @@ static ssize_t counter_show(struct kobject *kobj, | |||
317 | 319 | ||
318 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI].count = | 320 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI].count = |
319 | acpi_irq_handled; | 321 | acpi_irq_handled; |
322 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI_NOT].count = | ||
323 | acpi_irq_not_handled; | ||
320 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count = | 324 | all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count = |
321 | acpi_gpe_count; | 325 | acpi_gpe_count; |
322 | 326 | ||
@@ -363,6 +367,7 @@ static ssize_t counter_set(struct kobject *kobj, | |||
363 | all_counters[i].count = 0; | 367 | all_counters[i].count = 0; |
364 | acpi_gpe_count = 0; | 368 | acpi_gpe_count = 0; |
365 | acpi_irq_handled = 0; | 369 | acpi_irq_handled = 0; |
370 | acpi_irq_not_handled = 0; | ||
366 | goto end; | 371 | goto end; |
367 | } | 372 | } |
368 | 373 | ||
@@ -456,6 +461,8 @@ void acpi_irq_stats_init(void) | |||
456 | sprintf(buffer, "gpe_all"); | 461 | sprintf(buffer, "gpe_all"); |
457 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI) | 462 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI) |
458 | sprintf(buffer, "sci"); | 463 | sprintf(buffer, "sci"); |
464 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI_NOT) | ||
465 | sprintf(buffer, "sci_not"); | ||
459 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR) | 466 | else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR) |
460 | sprintf(buffer, "error"); | 467 | sprintf(buffer, "error"); |
461 | else | 468 | else |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 9cd15e8c8932..564ea1424288 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -909,7 +909,7 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz) | |||
909 | thermal_zone_device_register("acpitz", trips, tz, | 909 | thermal_zone_device_register("acpitz", trips, tz, |
910 | &acpi_thermal_zone_ops, | 910 | &acpi_thermal_zone_ops, |
911 | 0, 0, 0, | 911 | 0, 0, 0, |
912 | tz->polling_frequency); | 912 | tz->polling_frequency*100); |
913 | if (IS_ERR(tz->thermal_zone)) | 913 | if (IS_ERR(tz->thermal_zone)) |
914 | return -ENODEV; | 914 | return -ENODEV; |
915 | 915 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index cd4fb7543a90..1705d947ea09 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -770,10 +770,12 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
770 | * In this case, the first two elements in _BCL packages | 770 | * In this case, the first two elements in _BCL packages |
771 | * are also supported brightness levels that OS should take care of. | 771 | * are also supported brightness levels that OS should take care of. |
772 | */ | 772 | */ |
773 | for (i = 2; i < count; i++) | 773 | for (i = 2; i < count; i++) { |
774 | if (br->levels[i] == br->levels[0] || | 774 | if (br->levels[i] == br->levels[0]) |
775 | br->levels[i] == br->levels[1]) | ||
776 | level_ac_battery++; | 775 | level_ac_battery++; |
776 | if (br->levels[i] == br->levels[1]) | ||
777 | level_ac_battery++; | ||
778 | } | ||
777 | 779 | ||
778 | if (level_ac_battery < 2) { | 780 | if (level_ac_battery < 2) { |
779 | level_ac_battery = 2 - level_ac_battery; | 781 | level_ac_battery = 2 - level_ac_battery; |
@@ -807,12 +809,19 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
807 | br->flags._BCM_use_index = br->flags._BCL_use_index; | 809 | br->flags._BCM_use_index = br->flags._BCL_use_index; |
808 | 810 | ||
809 | /* _BQC uses INDEX while _BCL uses VALUE in some laptops */ | 811 | /* _BQC uses INDEX while _BCL uses VALUE in some laptops */ |
810 | br->curr = max_level; | 812 | br->curr = level_old = max_level; |
813 | |||
814 | if (!device->cap._BQC) | ||
815 | goto set_level; | ||
816 | |||
811 | result = acpi_video_device_lcd_get_level_current(device, &level_old); | 817 | result = acpi_video_device_lcd_get_level_current(device, &level_old); |
812 | if (result) | 818 | if (result) |
813 | goto out_free_levels; | 819 | goto out_free_levels; |
814 | 820 | ||
815 | result = acpi_video_device_lcd_set_level(device, br->curr); | 821 | /* |
822 | * Set the level to maximum and check if _BQC uses indexed value | ||
823 | */ | ||
824 | result = acpi_video_device_lcd_set_level(device, max_level); | ||
816 | if (result) | 825 | if (result) |
817 | goto out_free_levels; | 826 | goto out_free_levels; |
818 | 827 | ||
@@ -820,25 +829,19 @@ acpi_video_init_brightness(struct acpi_video_device *device) | |||
820 | if (result) | 829 | if (result) |
821 | goto out_free_levels; | 830 | goto out_free_levels; |
822 | 831 | ||
823 | if ((level != level_old) && !br->flags._BCM_use_index) { | 832 | br->flags._BQC_use_index = (level == max_level ? 0 : 1); |
824 | /* Note: | 833 | |
825 | * This piece of code does not work correctly if the current | 834 | if (!br->flags._BQC_use_index) |
826 | * brightness levels is 0. | 835 | goto set_level; |
827 | * But I guess boxes that boot with such a dark screen are rare | 836 | |
828 | * and no more code is needed to cover this specifial case. | 837 | if (br->flags._BCL_reversed) |
829 | */ | 838 | level_old = (br->count - 1) - level_old; |
830 | 839 | level_old = br->levels[level_old]; | |
831 | if (level_ac_battery != 2) { | 840 | |
832 | /* | 841 | set_level: |
833 | * For now, we don't support the _BCL like this: | 842 | result = acpi_video_device_lcd_set_level(device, level_old); |
834 | * 16, 15, 0, 1, 2, 3, ..., 14, 15, 16 | 843 | if (result) |
835 | * because we may mess up the index returned by _BQC. | 844 | goto out_free_levels; |
836 | * Plus: we have not got a box like this. | ||
837 | */ | ||
838 | ACPI_ERROR((AE_INFO, "_BCL not supported\n")); | ||
839 | } | ||
840 | br->flags._BQC_use_index = 1; | ||
841 | } | ||
842 | 845 | ||
843 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 846 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
844 | "found %d brightness levels\n", count - 2)); | 847 | "found %d brightness levels\n", count - 2)); |
diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 9744d59a69f2..858c34dd032d 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c | |||
@@ -906,6 +906,7 @@ static int __devinit mm_pci_probe(struct pci_dev *dev, | |||
906 | goto failed_alloc; | 906 | goto failed_alloc; |
907 | 907 | ||
908 | blk_queue_make_request(card->queue, mm_make_request); | 908 | blk_queue_make_request(card->queue, mm_make_request); |
909 | card->queue->queue_lock = &card->lock; | ||
909 | card->queue->queuedata = card; | 910 | card->queue->queuedata = card; |
910 | card->queue->unplug_fn = mm_unplug_device; | 911 | card->queue->unplug_fn = mm_unplug_device; |
911 | 912 | ||
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/i915_opregion.c index 69427722d20e..8dc1fd3115c2 100644 --- a/drivers/gpu/drm/i915/i915_opregion.c +++ b/drivers/gpu/drm/i915/i915_opregion.c | |||
@@ -370,11 +370,8 @@ int intel_opregion_init(struct drm_device *dev, int resume) | |||
370 | if (mboxes & MBOX_ACPI) { | 370 | if (mboxes & MBOX_ACPI) { |
371 | DRM_DEBUG("Public ACPI methods supported\n"); | 371 | DRM_DEBUG("Public ACPI methods supported\n"); |
372 | opregion->acpi = base + OPREGION_ACPI_OFFSET; | 372 | opregion->acpi = base + OPREGION_ACPI_OFFSET; |
373 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { | 373 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
374 | intel_didl_outputs(dev); | 374 | intel_didl_outputs(dev); |
375 | if (!resume) | ||
376 | acpi_video_register(); | ||
377 | } | ||
378 | } else { | 375 | } else { |
379 | DRM_DEBUG("Public ACPI methods not supported\n"); | 376 | DRM_DEBUG("Public ACPI methods not supported\n"); |
380 | err = -ENOTSUPP; | 377 | err = -ENOTSUPP; |
@@ -391,6 +388,10 @@ int intel_opregion_init(struct drm_device *dev, int resume) | |||
391 | opregion->asle = base + OPREGION_ASLE_OFFSET; | 388 | opregion->asle = base + OPREGION_ASLE_OFFSET; |
392 | } | 389 | } |
393 | 390 | ||
391 | if (!resume) | ||
392 | acpi_video_register(); | ||
393 | |||
394 | |||
394 | /* Notify BIOS we are ready to handle ACPI video ext notifs. | 395 | /* Notify BIOS we are ready to handle ACPI video ext notifs. |
395 | * Right now, all the events are handled by the ACPI video module. | 396 | * Right now, all the events are handled by the ACPI video module. |
396 | * We don't actually need to do anything with them. */ | 397 | * We don't actually need to do anything with them. */ |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 3aec19d1fdfc..3d4e09969763 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -609,7 +609,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
609 | struct request *rq = hwif->rq; | 609 | struct request *rq = hwif->rq; |
610 | ide_expiry_t *expiry = NULL; | 610 | ide_expiry_t *expiry = NULL; |
611 | int dma_error = 0, dma, thislen, uptodate = 0; | 611 | int dma_error = 0, dma, thislen, uptodate = 0; |
612 | int write = (rq_data_dir(rq) == WRITE) ? 1 : 0, rc, nsectors; | 612 | int write = (rq_data_dir(rq) == WRITE) ? 1 : 0, rc = 0, nsectors; |
613 | int sense = blk_sense_request(rq); | 613 | int sense = blk_sense_request(rq); |
614 | unsigned int timeout; | 614 | unsigned int timeout; |
615 | u16 len; | 615 | u16 len; |
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index 1aebdf1a4f58..4b6b71e2cdf5 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/mutex.h> | 7 | #include <linux/mutex.h> |
8 | #include <linux/ide.h> | 8 | #include <linux/ide.h> |
9 | #include <linux/hdreg.h> | 9 | #include <linux/hdreg.h> |
10 | #include <linux/dmi.h> | ||
10 | 11 | ||
11 | #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT) | 12 | #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT) |
12 | #define IDE_DISK_MINORS (1 << PARTN_BITS) | 13 | #define IDE_DISK_MINORS (1 << PARTN_BITS) |
@@ -99,6 +100,19 @@ static void ide_gd_resume(ide_drive_t *drive) | |||
99 | (void)drive->disk_ops->get_capacity(drive); | 100 | (void)drive->disk_ops->get_capacity(drive); |
100 | } | 101 | } |
101 | 102 | ||
103 | static const struct dmi_system_id ide_coldreboot_table[] = { | ||
104 | { | ||
105 | /* Acer TravelMate 66x cuts power during reboot */ | ||
106 | .ident = "Acer TravelMate 660", | ||
107 | .matches = { | ||
108 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
109 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), | ||
110 | }, | ||
111 | }, | ||
112 | |||
113 | { } /* terminate list */ | ||
114 | }; | ||
115 | |||
102 | static void ide_gd_shutdown(ide_drive_t *drive) | 116 | static void ide_gd_shutdown(ide_drive_t *drive) |
103 | { | 117 | { |
104 | #ifdef CONFIG_ALPHA | 118 | #ifdef CONFIG_ALPHA |
@@ -115,7 +129,8 @@ static void ide_gd_shutdown(ide_drive_t *drive) | |||
115 | the disk to expire its write cache. */ | 129 | the disk to expire its write cache. */ |
116 | if (system_state != SYSTEM_POWER_OFF) { | 130 | if (system_state != SYSTEM_POWER_OFF) { |
117 | #else | 131 | #else |
118 | if (system_state == SYSTEM_RESTART) { | 132 | if (system_state == SYSTEM_RESTART && |
133 | !dmi_check_system(ide_coldreboot_table)) { | ||
119 | #endif | 134 | #endif |
120 | drive->disk_ops->flush(drive); | 135 | drive->disk_ops->flush(drive); |
121 | return; | 136 | return; |
diff --git a/drivers/ide/palm_bk3710.c b/drivers/ide/palm_bk3710.c index c7acca0b8733..09d813d313f4 100644 --- a/drivers/ide/palm_bk3710.c +++ b/drivers/ide/palm_bk3710.c | |||
@@ -39,27 +39,12 @@ | |||
39 | /* Primary Control Offset */ | 39 | /* Primary Control Offset */ |
40 | #define IDE_PALM_ATA_PRI_CTL_OFFSET 0x3F6 | 40 | #define IDE_PALM_ATA_PRI_CTL_OFFSET 0x3F6 |
41 | 41 | ||
42 | /* | ||
43 | * PalmChip 3710 IDE Controller UDMA timing structure Definition | ||
44 | */ | ||
45 | struct palm_bk3710_udmatiming { | ||
46 | unsigned int rptime; /* Ready to pause time */ | ||
47 | unsigned int cycletime; /* Cycle Time */ | ||
48 | }; | ||
49 | |||
50 | #define BK3710_BMICP 0x00 | 42 | #define BK3710_BMICP 0x00 |
51 | #define BK3710_BMISP 0x02 | 43 | #define BK3710_BMISP 0x02 |
52 | #define BK3710_BMIDTP 0x04 | 44 | #define BK3710_BMIDTP 0x04 |
53 | #define BK3710_BMICS 0x08 | ||
54 | #define BK3710_BMISS 0x0A | ||
55 | #define BK3710_BMIDTS 0x0C | ||
56 | #define BK3710_IDETIMP 0x40 | 45 | #define BK3710_IDETIMP 0x40 |
57 | #define BK3710_IDETIMS 0x42 | ||
58 | #define BK3710_SIDETIM 0x44 | ||
59 | #define BK3710_SLEWCTL 0x45 | ||
60 | #define BK3710_IDESTATUS 0x47 | 46 | #define BK3710_IDESTATUS 0x47 |
61 | #define BK3710_UDMACTL 0x48 | 47 | #define BK3710_UDMACTL 0x48 |
62 | #define BK3710_UDMATIM 0x4A | ||
63 | #define BK3710_MISCCTL 0x50 | 48 | #define BK3710_MISCCTL 0x50 |
64 | #define BK3710_REGSTB 0x54 | 49 | #define BK3710_REGSTB 0x54 |
65 | #define BK3710_REGRCVR 0x58 | 50 | #define BK3710_REGRCVR 0x58 |
@@ -71,17 +56,22 @@ struct palm_bk3710_udmatiming { | |||
71 | #define BK3710_UDMATRP 0x70 | 56 | #define BK3710_UDMATRP 0x70 |
72 | #define BK3710_UDMAENV 0x74 | 57 | #define BK3710_UDMAENV 0x74 |
73 | #define BK3710_IORDYTMP 0x78 | 58 | #define BK3710_IORDYTMP 0x78 |
74 | #define BK3710_IORDYTMS 0x7C | ||
75 | 59 | ||
76 | static unsigned ideclk_period; /* in nanoseconds */ | 60 | static unsigned ideclk_period; /* in nanoseconds */ |
77 | 61 | ||
62 | struct palm_bk3710_udmatiming { | ||
63 | unsigned int rptime; /* tRP -- Ready to pause time (nsec) */ | ||
64 | unsigned int cycletime; /* tCYCTYP2/2 -- avg Cycle Time (nsec) */ | ||
65 | /* tENV is always a minimum of 20 nsec */ | ||
66 | }; | ||
67 | |||
78 | static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { | 68 | static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { |
79 | {160, 240}, /* UDMA Mode 0 */ | 69 | { 160, 240 / 2 }, /* UDMA Mode 0 */ |
80 | {125, 160}, /* UDMA Mode 1 */ | 70 | { 125, 160 / 2 }, /* UDMA Mode 1 */ |
81 | {100, 120}, /* UDMA Mode 2 */ | 71 | { 100, 120 / 2 }, /* UDMA Mode 2 */ |
82 | {100, 90}, /* UDMA Mode 3 */ | 72 | { 100, 90 / 2 }, /* UDMA Mode 3 */ |
83 | {100, 60}, /* UDMA Mode 4 */ | 73 | { 100, 60 / 2 }, /* UDMA Mode 4 */ |
84 | {85, 40}, /* UDMA Mode 5 */ | 74 | { 85, 40 / 2 }, /* UDMA Mode 5 */ |
85 | }; | 75 | }; |
86 | 76 | ||
87 | static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev, | 77 | static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev, |
@@ -98,11 +88,6 @@ static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev, | |||
98 | trp = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].rptime, | 88 | trp = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].rptime, |
99 | ideclk_period) - 1; | 89 | ideclk_period) - 1; |
100 | 90 | ||
101 | /* udmatim Register */ | ||
102 | val16 = readw(base + BK3710_UDMATIM) & (dev ? 0xFF0F : 0xFFF0); | ||
103 | val16 |= (mode << (dev ? 4 : 0)); | ||
104 | writew(val16, base + BK3710_UDMATIM); | ||
105 | |||
106 | /* udmastb Ultra DMA Access Strobe Width */ | 91 | /* udmastb Ultra DMA Access Strobe Width */ |
107 | val32 = readl(base + BK3710_UDMASTB) & (0xFF << (dev ? 0 : 8)); | 92 | val32 = readl(base + BK3710_UDMASTB) & (0xFF << (dev ? 0 : 8)); |
108 | val32 |= (t0 << (dev ? 8 : 0)); | 93 | val32 |= (t0 << (dev ? 8 : 0)); |
@@ -163,10 +148,11 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate, | |||
163 | u32 val32; | 148 | u32 val32; |
164 | struct ide_timing *t; | 149 | struct ide_timing *t; |
165 | 150 | ||
151 | t = ide_timing_find_mode(XFER_PIO_0 + mode); | ||
152 | |||
166 | /* PIO Data Setup */ | 153 | /* PIO Data Setup */ |
167 | t0 = DIV_ROUND_UP(cycletime, ideclk_period); | 154 | t0 = DIV_ROUND_UP(cycletime, ideclk_period); |
168 | t2 = DIV_ROUND_UP(ide_timing_find_mode(XFER_PIO_0 + mode)->active, | 155 | t2 = DIV_ROUND_UP(t->active, ideclk_period); |
169 | ideclk_period); | ||
170 | 156 | ||
171 | t2i = t0 - t2 - 1; | 157 | t2i = t0 - t2 - 1; |
172 | t2 -= 1; | 158 | t2 -= 1; |
@@ -187,7 +173,6 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate, | |||
187 | } | 173 | } |
188 | 174 | ||
189 | /* TASKFILE Setup */ | 175 | /* TASKFILE Setup */ |
190 | t = ide_timing_find_mode(XFER_PIO_0 + mode); | ||
191 | t0 = DIV_ROUND_UP(t->cyc8b, ideclk_period); | 176 | t0 = DIV_ROUND_UP(t->cyc8b, ideclk_period); |
192 | t2 = DIV_ROUND_UP(t->act8b, ideclk_period); | 177 | t2 = DIV_ROUND_UP(t->act8b, ideclk_period); |
193 | 178 | ||
@@ -236,42 +221,23 @@ static void palm_bk3710_set_pio_mode(ide_drive_t *drive, u8 pio) | |||
236 | static void __devinit palm_bk3710_chipinit(void __iomem *base) | 221 | static void __devinit palm_bk3710_chipinit(void __iomem *base) |
237 | { | 222 | { |
238 | /* | 223 | /* |
239 | * enable the reset_en of ATA controller so that when ata signals | 224 | * REVISIT: the ATA reset signal needs to be managed through a |
240 | * are brought out, by writing into device config. at that | 225 | * GPIO, which means it should come from platform_data. Until |
241 | * time por_n signal should not be 'Z' and have a stable value. | 226 | * we get and use such information, we have to trust that things |
227 | * have been reset before we get here. | ||
242 | */ | 228 | */ |
243 | writel(0x0300, base + BK3710_MISCCTL); | ||
244 | |||
245 | /* wait for some time and deassert the reset of ATA Device. */ | ||
246 | mdelay(100); | ||
247 | |||
248 | /* Deassert the Reset */ | ||
249 | writel(0x0200, base + BK3710_MISCCTL); | ||
250 | 229 | ||
251 | /* | 230 | /* |
252 | * Program the IDETIMP Register Value based on the following assumptions | 231 | * Program the IDETIMP Register Value based on the following assumptions |
253 | * | 232 | * |
254 | * (ATA_IDETIMP_IDEEN , ENABLE ) | | 233 | * (ATA_IDETIMP_IDEEN , ENABLE ) | |
255 | * (ATA_IDETIMP_SLVTIMEN , DISABLE) | | ||
256 | * (ATA_IDETIMP_RDYSMPL , 70NS) | | ||
257 | * (ATA_IDETIMP_RDYRCVRY , 50NS) | | ||
258 | * (ATA_IDETIMP_DMAFTIM1 , PIOCOMP) | | ||
259 | * (ATA_IDETIMP_PREPOST1 , DISABLE) | | 234 | * (ATA_IDETIMP_PREPOST1 , DISABLE) | |
260 | * (ATA_IDETIMP_RDYSEN1 , DISABLE) | | ||
261 | * (ATA_IDETIMP_PIOFTIM1 , DISABLE) | | ||
262 | * (ATA_IDETIMP_DMAFTIM0 , PIOCOMP) | | ||
263 | * (ATA_IDETIMP_PREPOST0 , DISABLE) | | 235 | * (ATA_IDETIMP_PREPOST0 , DISABLE) | |
264 | * (ATA_IDETIMP_RDYSEN0 , DISABLE) | | 236 | * |
265 | * (ATA_IDETIMP_PIOFTIM0 , DISABLE) | 237 | * DM6446 silicon rev 2.1 and earlier have no observed net benefit |
266 | */ | 238 | * from enabling prefetch/postwrite. |
267 | writew(0xB388, base + BK3710_IDETIMP); | ||
268 | |||
269 | /* | ||
270 | * Configure SIDETIM Register | ||
271 | * (ATA_SIDETIM_RDYSMPS1 ,120NS ) | | ||
272 | * (ATA_SIDETIM_RDYRCYS1 ,120NS ) | ||
273 | */ | 239 | */ |
274 | writeb(0, base + BK3710_SIDETIM); | 240 | writew(BIT(15), base + BK3710_IDETIMP); |
275 | 241 | ||
276 | /* | 242 | /* |
277 | * UDMACTL Ultra-ATA DMA Control | 243 | * UDMACTL Ultra-ATA DMA Control |
@@ -283,11 +249,11 @@ static void __devinit palm_bk3710_chipinit(void __iomem *base) | |||
283 | 249 | ||
284 | /* | 250 | /* |
285 | * MISCCTL Miscellaneous Conrol Register | 251 | * MISCCTL Miscellaneous Conrol Register |
286 | * (ATA_MISCCTL_RSTMODEP , 1) | | 252 | * (ATA_MISCCTL_HWNHLD1P , 1 cycle) |
287 | * (ATA_MISCCTL_RESETP , 0) | | 253 | * (ATA_MISCCTL_HWNHLD0P , 1 cycle) |
288 | * (ATA_MISCCTL_TIMORIDE , 1) | 254 | * (ATA_MISCCTL_TIMORIDE , 1) |
289 | */ | 255 | */ |
290 | writel(0x201, base + BK3710_MISCCTL); | 256 | writel(0x001, base + BK3710_MISCCTL); |
291 | 257 | ||
292 | /* | 258 | /* |
293 | * IORDYTMP IORDY Timer for Primary Register | 259 | * IORDYTMP IORDY Timer for Primary Register |
@@ -357,10 +323,9 @@ static int __init palm_bk3710_probe(struct platform_device *pdev) | |||
357 | 323 | ||
358 | clk_enable(clk); | 324 | clk_enable(clk); |
359 | rate = clk_get_rate(clk); | 325 | rate = clk_get_rate(clk); |
360 | ideclk_period = 1000000000UL / rate; | ||
361 | 326 | ||
362 | /* Register the IDE interface with Linux ATA Interface */ | 327 | /* NOTE: round *down* to meet minimum timings; we count in clocks */ |
363 | memset(&hw, 0, sizeof(hw)); | 328 | ideclk_period = 1000000000UL / rate; |
364 | 329 | ||
365 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 330 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
366 | if (mem == NULL) { | 331 | if (mem == NULL) { |
@@ -390,6 +355,7 @@ static int __init palm_bk3710_probe(struct platform_device *pdev) | |||
390 | /* Configure the Palm Chip controller */ | 355 | /* Configure the Palm Chip controller */ |
391 | palm_bk3710_chipinit(base); | 356 | palm_bk3710_chipinit(base); |
392 | 357 | ||
358 | memset(&hw, 0, sizeof(hw)); | ||
393 | for (i = 0; i < IDE_NR_PORTS - 2; i++) | 359 | for (i = 0; i < IDE_NR_PORTS - 2; i++) |
394 | hw.io_ports_array[i] = (unsigned long) | 360 | hw.io_ports_array[i] = (unsigned long) |
395 | (base + IDE_PALM_ATA_PRI_REG_OFFSET + i); | 361 | (base + IDE_PALM_ATA_PRI_REG_OFFSET + i); |
@@ -402,6 +368,7 @@ static int __init palm_bk3710_probe(struct platform_device *pdev) | |||
402 | palm_bk3710_port_info.udma_mask = rate < 100000000 ? ATA_UDMA4 : | 368 | palm_bk3710_port_info.udma_mask = rate < 100000000 ? ATA_UDMA4 : |
403 | ATA_UDMA5; | 369 | ATA_UDMA5; |
404 | 370 | ||
371 | /* Register the IDE interface with Linux */ | ||
405 | rc = ide_host_add(&palm_bk3710_port_info, hws, NULL); | 372 | rc = ide_host_add(&palm_bk3710_port_info, hws, NULL); |
406 | if (rc) | 373 | if (rc) |
407 | goto out; | 374 | goto out; |
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index 173cf55c64d0..3d906833948d 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -123,7 +123,7 @@ config PMAC_APM_EMU | |||
123 | 123 | ||
124 | config PMAC_MEDIABAY | 124 | config PMAC_MEDIABAY |
125 | bool "Support PowerBook hotswap media bay" | 125 | bool "Support PowerBook hotswap media bay" |
126 | depends on PPC_PMAC && PPC32 | 126 | depends on PPC_PMAC && PPC32 && BLOCK |
127 | help | 127 | help |
128 | This option adds support for older PowerBook's hotswap media bay | 128 | This option adds support for older PowerBook's hotswap media bay |
129 | that can contains batteries, floppy drives, or IDE devices. PCI | 129 | that can contains batteries, floppy drives, or IDE devices. PCI |
diff --git a/drivers/macintosh/mediabay.c b/drivers/macintosh/mediabay.c index d7e46d345d9e..029ad8ce8a7e 100644 --- a/drivers/macintosh/mediabay.c +++ b/drivers/macintosh/mediabay.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
19 | #include <linux/stddef.h> | 19 | #include <linux/stddef.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/ide.h> | ||
22 | #include <linux/kthread.h> | 21 | #include <linux/kthread.h> |
23 | #include <linux/mutex.h> | 22 | #include <linux/mutex.h> |
24 | #include <asm/prom.h> | 23 | #include <asm/prom.h> |
@@ -447,6 +446,7 @@ int check_media_bay_by_base(unsigned long base, int what) | |||
447 | 446 | ||
448 | return -ENODEV; | 447 | return -ENODEV; |
449 | } | 448 | } |
449 | EXPORT_SYMBOL_GPL(check_media_bay_by_base); | ||
450 | 450 | ||
451 | int media_bay_set_ide_infos(struct device_node* which_bay, unsigned long base, | 451 | int media_bay_set_ide_infos(struct device_node* which_bay, unsigned long base, |
452 | int irq, ide_hwif_t *hwif) | 452 | int irq, ide_hwif_t *hwif) |
@@ -486,6 +486,7 @@ int media_bay_set_ide_infos(struct device_node* which_bay, unsigned long base, | |||
486 | 486 | ||
487 | return -ENODEV; | 487 | return -ENODEV; |
488 | } | 488 | } |
489 | EXPORT_SYMBOL_GPL(media_bay_set_ide_infos); | ||
489 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ | 490 | #endif /* CONFIG_BLK_DEV_IDE_PMAC */ |
490 | 491 | ||
491 | static void media_bay_step(int i) | 492 | static void media_bay_step(int i) |
diff --git a/drivers/media/radio/radio-si470x.c b/drivers/media/radio/radio-si470x.c index 92c297796a9f..bd945d04dc90 100644 --- a/drivers/media/radio/radio-si470x.c +++ b/drivers/media/radio/radio-si470x.c | |||
@@ -1200,7 +1200,7 @@ static int si470x_fops_release(struct file *file) | |||
1200 | video_unregister_device(radio->videodev); | 1200 | video_unregister_device(radio->videodev); |
1201 | kfree(radio->buffer); | 1201 | kfree(radio->buffer); |
1202 | kfree(radio); | 1202 | kfree(radio); |
1203 | goto unlock; | 1203 | goto done; |
1204 | } | 1204 | } |
1205 | 1205 | ||
1206 | /* stop rds reception */ | 1206 | /* stop rds reception */ |
diff --git a/drivers/media/video/pwc/pwc-ctrl.c b/drivers/media/video/pwc/pwc-ctrl.c index f9fbe02e0f69..50b415e07eda 100644 --- a/drivers/media/video/pwc/pwc-ctrl.c +++ b/drivers/media/video/pwc/pwc-ctrl.c | |||
@@ -159,35 +159,67 @@ static void pwc_set_image_buffer_size(struct pwc_device *pdev); | |||
159 | 159 | ||
160 | /****************************************************************************/ | 160 | /****************************************************************************/ |
161 | 161 | ||
162 | static int _send_control_msg(struct pwc_device *pdev, | ||
163 | u8 request, u16 value, int index, void *buf, int buflen, int timeout) | ||
164 | { | ||
165 | int rc; | ||
166 | void *kbuf = NULL; | ||
167 | |||
168 | if (buflen) { | ||
169 | kbuf = kmalloc(buflen, GFP_KERNEL); /* not allowed on stack */ | ||
170 | if (kbuf == NULL) | ||
171 | return -ENOMEM; | ||
172 | memcpy(kbuf, buf, buflen); | ||
173 | } | ||
162 | 174 | ||
163 | #define SendControlMsg(request, value, buflen) \ | 175 | rc = usb_control_msg(pdev->udev, usb_sndctrlpipe(pdev->udev, 0), |
164 | usb_control_msg(pdev->udev, usb_sndctrlpipe(pdev->udev, 0), \ | 176 | request, |
165 | request, \ | 177 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
166 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, \ | 178 | value, |
167 | value, \ | 179 | index, |
168 | pdev->vcinterface, \ | 180 | kbuf, buflen, timeout); |
169 | &buf, buflen, 500) | ||
170 | 181 | ||
171 | #define RecvControlMsg(request, value, buflen) \ | 182 | kfree(kbuf); |
172 | usb_control_msg(pdev->udev, usb_rcvctrlpipe(pdev->udev, 0), \ | 183 | return rc; |
173 | request, \ | 184 | } |
174 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, \ | ||
175 | value, \ | ||
176 | pdev->vcinterface, \ | ||
177 | &buf, buflen, 500) | ||
178 | 185 | ||
186 | static int recv_control_msg(struct pwc_device *pdev, | ||
187 | u8 request, u16 value, void *buf, int buflen) | ||
188 | { | ||
189 | int rc; | ||
190 | void *kbuf = kmalloc(buflen, GFP_KERNEL); /* not allowed on stack */ | ||
191 | |||
192 | if (kbuf == NULL) | ||
193 | return -ENOMEM; | ||
194 | |||
195 | rc = usb_control_msg(pdev->udev, usb_rcvctrlpipe(pdev->udev, 0), | ||
196 | request, | ||
197 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
198 | value, | ||
199 | pdev->vcinterface, | ||
200 | kbuf, buflen, 500); | ||
201 | memcpy(buf, kbuf, buflen); | ||
202 | kfree(kbuf); | ||
203 | return rc; | ||
204 | } | ||
179 | 205 | ||
180 | static int send_video_command(struct usb_device *udev, int index, void *buf, int buflen) | 206 | static inline int send_video_command(struct pwc_device *pdev, |
207 | int index, void *buf, int buflen) | ||
181 | { | 208 | { |
182 | return usb_control_msg(udev, | 209 | return _send_control_msg(pdev, |
183 | usb_sndctrlpipe(udev, 0), | ||
184 | SET_EP_STREAM_CTL, | 210 | SET_EP_STREAM_CTL, |
185 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
186 | VIDEO_OUTPUT_CONTROL_FORMATTER, | 211 | VIDEO_OUTPUT_CONTROL_FORMATTER, |
187 | index, | 212 | index, |
188 | buf, buflen, 1000); | 213 | buf, buflen, 1000); |
189 | } | 214 | } |
190 | 215 | ||
216 | static inline int send_control_msg(struct pwc_device *pdev, | ||
217 | u8 request, u16 value, void *buf, int buflen) | ||
218 | { | ||
219 | return _send_control_msg(pdev, | ||
220 | request, value, pdev->vcinterface, buf, buflen, 500); | ||
221 | } | ||
222 | |||
191 | 223 | ||
192 | 224 | ||
193 | static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) | 225 | static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) |
@@ -224,7 +256,7 @@ static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames) | |||
224 | return -EINVAL; | 256 | return -EINVAL; |
225 | 257 | ||
226 | memcpy(buf, pEntry->mode, 3); | 258 | memcpy(buf, pEntry->mode, 3); |
227 | ret = send_video_command(pdev->udev, pdev->vendpoint, buf, 3); | 259 | ret = send_video_command(pdev, pdev->vendpoint, buf, 3); |
228 | if (ret < 0) { | 260 | if (ret < 0) { |
229 | PWC_DEBUG_MODULE("Failed to send video command... %d\n", ret); | 261 | PWC_DEBUG_MODULE("Failed to send video command... %d\n", ret); |
230 | return ret; | 262 | return ret; |
@@ -285,7 +317,7 @@ static int set_video_mode_Timon(struct pwc_device *pdev, int size, int frames, i | |||
285 | memcpy(buf, pChoose->mode, 13); | 317 | memcpy(buf, pChoose->mode, 13); |
286 | if (snapshot) | 318 | if (snapshot) |
287 | buf[0] |= 0x80; | 319 | buf[0] |= 0x80; |
288 | ret = send_video_command(pdev->udev, pdev->vendpoint, buf, 13); | 320 | ret = send_video_command(pdev, pdev->vendpoint, buf, 13); |
289 | if (ret < 0) | 321 | if (ret < 0) |
290 | return ret; | 322 | return ret; |
291 | 323 | ||
@@ -358,7 +390,7 @@ static int set_video_mode_Kiara(struct pwc_device *pdev, int size, int frames, i | |||
358 | buf[0] |= 0x80; | 390 | buf[0] |= 0x80; |
359 | 391 | ||
360 | /* Firmware bug: video endpoint is 5, but commands are sent to endpoint 4 */ | 392 | /* Firmware bug: video endpoint is 5, but commands are sent to endpoint 4 */ |
361 | ret = send_video_command(pdev->udev, 4 /* pdev->vendpoint */, buf, 12); | 393 | ret = send_video_command(pdev, 4 /* pdev->vendpoint */, buf, 12); |
362 | if (ret < 0) | 394 | if (ret < 0) |
363 | return ret; | 395 | return ret; |
364 | 396 | ||
@@ -530,7 +562,8 @@ int pwc_get_brightness(struct pwc_device *pdev) | |||
530 | char buf; | 562 | char buf; |
531 | int ret; | 563 | int ret; |
532 | 564 | ||
533 | ret = RecvControlMsg(GET_LUM_CTL, BRIGHTNESS_FORMATTER, 1); | 565 | ret = recv_control_msg(pdev, |
566 | GET_LUM_CTL, BRIGHTNESS_FORMATTER, &buf, sizeof(buf)); | ||
534 | if (ret < 0) | 567 | if (ret < 0) |
535 | return ret; | 568 | return ret; |
536 | return buf; | 569 | return buf; |
@@ -545,7 +578,8 @@ int pwc_set_brightness(struct pwc_device *pdev, int value) | |||
545 | if (value > 0xffff) | 578 | if (value > 0xffff) |
546 | value = 0xffff; | 579 | value = 0xffff; |
547 | buf = (value >> 9) & 0x7f; | 580 | buf = (value >> 9) & 0x7f; |
548 | return SendControlMsg(SET_LUM_CTL, BRIGHTNESS_FORMATTER, 1); | 581 | return send_control_msg(pdev, |
582 | SET_LUM_CTL, BRIGHTNESS_FORMATTER, &buf, sizeof(buf)); | ||
549 | } | 583 | } |
550 | 584 | ||
551 | /* CONTRAST */ | 585 | /* CONTRAST */ |
@@ -555,7 +589,8 @@ int pwc_get_contrast(struct pwc_device *pdev) | |||
555 | char buf; | 589 | char buf; |
556 | int ret; | 590 | int ret; |
557 | 591 | ||
558 | ret = RecvControlMsg(GET_LUM_CTL, CONTRAST_FORMATTER, 1); | 592 | ret = recv_control_msg(pdev, |
593 | GET_LUM_CTL, CONTRAST_FORMATTER, &buf, sizeof(buf)); | ||
559 | if (ret < 0) | 594 | if (ret < 0) |
560 | return ret; | 595 | return ret; |
561 | return buf; | 596 | return buf; |
@@ -570,7 +605,8 @@ int pwc_set_contrast(struct pwc_device *pdev, int value) | |||
570 | if (value > 0xffff) | 605 | if (value > 0xffff) |
571 | value = 0xffff; | 606 | value = 0xffff; |
572 | buf = (value >> 10) & 0x3f; | 607 | buf = (value >> 10) & 0x3f; |
573 | return SendControlMsg(SET_LUM_CTL, CONTRAST_FORMATTER, 1); | 608 | return send_control_msg(pdev, |
609 | SET_LUM_CTL, CONTRAST_FORMATTER, &buf, sizeof(buf)); | ||
574 | } | 610 | } |
575 | 611 | ||
576 | /* GAMMA */ | 612 | /* GAMMA */ |
@@ -580,7 +616,8 @@ int pwc_get_gamma(struct pwc_device *pdev) | |||
580 | char buf; | 616 | char buf; |
581 | int ret; | 617 | int ret; |
582 | 618 | ||
583 | ret = RecvControlMsg(GET_LUM_CTL, GAMMA_FORMATTER, 1); | 619 | ret = recv_control_msg(pdev, |
620 | GET_LUM_CTL, GAMMA_FORMATTER, &buf, sizeof(buf)); | ||
584 | if (ret < 0) | 621 | if (ret < 0) |
585 | return ret; | 622 | return ret; |
586 | return buf; | 623 | return buf; |
@@ -595,7 +632,8 @@ int pwc_set_gamma(struct pwc_device *pdev, int value) | |||
595 | if (value > 0xffff) | 632 | if (value > 0xffff) |
596 | value = 0xffff; | 633 | value = 0xffff; |
597 | buf = (value >> 11) & 0x1f; | 634 | buf = (value >> 11) & 0x1f; |
598 | return SendControlMsg(SET_LUM_CTL, GAMMA_FORMATTER, 1); | 635 | return send_control_msg(pdev, |
636 | SET_LUM_CTL, GAMMA_FORMATTER, &buf, sizeof(buf)); | ||
599 | } | 637 | } |
600 | 638 | ||
601 | 639 | ||
@@ -613,7 +651,8 @@ int pwc_get_saturation(struct pwc_device *pdev, int *value) | |||
613 | saturation_register = SATURATION_MODE_FORMATTER2; | 651 | saturation_register = SATURATION_MODE_FORMATTER2; |
614 | else | 652 | else |
615 | saturation_register = SATURATION_MODE_FORMATTER1; | 653 | saturation_register = SATURATION_MODE_FORMATTER1; |
616 | ret = RecvControlMsg(GET_CHROM_CTL, saturation_register, 1); | 654 | ret = recv_control_msg(pdev, |
655 | GET_CHROM_CTL, saturation_register, &buf, sizeof(buf)); | ||
617 | if (ret < 0) | 656 | if (ret < 0) |
618 | return ret; | 657 | return ret; |
619 | *value = (signed)buf; | 658 | *value = (signed)buf; |
@@ -636,7 +675,8 @@ int pwc_set_saturation(struct pwc_device *pdev, int value) | |||
636 | saturation_register = SATURATION_MODE_FORMATTER2; | 675 | saturation_register = SATURATION_MODE_FORMATTER2; |
637 | else | 676 | else |
638 | saturation_register = SATURATION_MODE_FORMATTER1; | 677 | saturation_register = SATURATION_MODE_FORMATTER1; |
639 | return SendControlMsg(SET_CHROM_CTL, saturation_register, 1); | 678 | return send_control_msg(pdev, |
679 | SET_CHROM_CTL, saturation_register, &buf, sizeof(buf)); | ||
640 | } | 680 | } |
641 | 681 | ||
642 | /* AGC */ | 682 | /* AGC */ |
@@ -651,7 +691,8 @@ int pwc_set_agc(struct pwc_device *pdev, int mode, int value) | |||
651 | else | 691 | else |
652 | buf = 0xff; /* fixed */ | 692 | buf = 0xff; /* fixed */ |
653 | 693 | ||
654 | ret = SendControlMsg(SET_LUM_CTL, AGC_MODE_FORMATTER, 1); | 694 | ret = send_control_msg(pdev, |
695 | SET_LUM_CTL, AGC_MODE_FORMATTER, &buf, sizeof(buf)); | ||
655 | 696 | ||
656 | if (!mode && ret >= 0) { | 697 | if (!mode && ret >= 0) { |
657 | if (value < 0) | 698 | if (value < 0) |
@@ -659,7 +700,8 @@ int pwc_set_agc(struct pwc_device *pdev, int mode, int value) | |||
659 | if (value > 0xffff) | 700 | if (value > 0xffff) |
660 | value = 0xffff; | 701 | value = 0xffff; |
661 | buf = (value >> 10) & 0x3F; | 702 | buf = (value >> 10) & 0x3F; |
662 | ret = SendControlMsg(SET_LUM_CTL, PRESET_AGC_FORMATTER, 1); | 703 | ret = send_control_msg(pdev, |
704 | SET_LUM_CTL, PRESET_AGC_FORMATTER, &buf, sizeof(buf)); | ||
663 | } | 705 | } |
664 | if (ret < 0) | 706 | if (ret < 0) |
665 | return ret; | 707 | return ret; |
@@ -671,12 +713,14 @@ int pwc_get_agc(struct pwc_device *pdev, int *value) | |||
671 | unsigned char buf; | 713 | unsigned char buf; |
672 | int ret; | 714 | int ret; |
673 | 715 | ||
674 | ret = RecvControlMsg(GET_LUM_CTL, AGC_MODE_FORMATTER, 1); | 716 | ret = recv_control_msg(pdev, |
717 | GET_LUM_CTL, AGC_MODE_FORMATTER, &buf, sizeof(buf)); | ||
675 | if (ret < 0) | 718 | if (ret < 0) |
676 | return ret; | 719 | return ret; |
677 | 720 | ||
678 | if (buf != 0) { /* fixed */ | 721 | if (buf != 0) { /* fixed */ |
679 | ret = RecvControlMsg(GET_LUM_CTL, PRESET_AGC_FORMATTER, 1); | 722 | ret = recv_control_msg(pdev, |
723 | GET_LUM_CTL, PRESET_AGC_FORMATTER, &buf, sizeof(buf)); | ||
680 | if (ret < 0) | 724 | if (ret < 0) |
681 | return ret; | 725 | return ret; |
682 | if (buf > 0x3F) | 726 | if (buf > 0x3F) |
@@ -684,7 +728,8 @@ int pwc_get_agc(struct pwc_device *pdev, int *value) | |||
684 | *value = (buf << 10); | 728 | *value = (buf << 10); |
685 | } | 729 | } |
686 | else { /* auto */ | 730 | else { /* auto */ |
687 | ret = RecvControlMsg(GET_STATUS_CTL, READ_AGC_FORMATTER, 1); | 731 | ret = recv_control_msg(pdev, |
732 | GET_STATUS_CTL, READ_AGC_FORMATTER, &buf, sizeof(buf)); | ||
688 | if (ret < 0) | 733 | if (ret < 0) |
689 | return ret; | 734 | return ret; |
690 | /* Gah... this value ranges from 0x00 ... 0x9F */ | 735 | /* Gah... this value ranges from 0x00 ... 0x9F */ |
@@ -707,7 +752,8 @@ int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value) | |||
707 | else | 752 | else |
708 | buf[0] = 0xff; /* fixed */ | 753 | buf[0] = 0xff; /* fixed */ |
709 | 754 | ||
710 | ret = SendControlMsg(SET_LUM_CTL, SHUTTER_MODE_FORMATTER, 1); | 755 | ret = send_control_msg(pdev, |
756 | SET_LUM_CTL, SHUTTER_MODE_FORMATTER, &buf, sizeof(buf)); | ||
711 | 757 | ||
712 | if (!mode && ret >= 0) { | 758 | if (!mode && ret >= 0) { |
713 | if (value < 0) | 759 | if (value < 0) |
@@ -726,7 +772,9 @@ int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value) | |||
726 | buf[0] = value >> 8; | 772 | buf[0] = value >> 8; |
727 | } | 773 | } |
728 | 774 | ||
729 | ret = SendControlMsg(SET_LUM_CTL, PRESET_SHUTTER_FORMATTER, 2); | 775 | ret = send_control_msg(pdev, |
776 | SET_LUM_CTL, PRESET_SHUTTER_FORMATTER, | ||
777 | &buf, sizeof(buf)); | ||
730 | } | 778 | } |
731 | return ret; | 779 | return ret; |
732 | } | 780 | } |
@@ -737,7 +785,8 @@ int pwc_get_shutter_speed(struct pwc_device *pdev, int *value) | |||
737 | unsigned char buf[2]; | 785 | unsigned char buf[2]; |
738 | int ret; | 786 | int ret; |
739 | 787 | ||
740 | ret = RecvControlMsg(GET_STATUS_CTL, READ_SHUTTER_FORMATTER, 2); | 788 | ret = recv_control_msg(pdev, |
789 | GET_STATUS_CTL, READ_SHUTTER_FORMATTER, &buf, sizeof(buf)); | ||
741 | if (ret < 0) | 790 | if (ret < 0) |
742 | return ret; | 791 | return ret; |
743 | *value = buf[0] + (buf[1] << 8); | 792 | *value = buf[0] + (buf[1] << 8); |
@@ -764,7 +813,9 @@ int pwc_camera_power(struct pwc_device *pdev, int power) | |||
764 | buf = 0x00; /* active */ | 813 | buf = 0x00; /* active */ |
765 | else | 814 | else |
766 | buf = 0xFF; /* power save */ | 815 | buf = 0xFF; /* power save */ |
767 | return SendControlMsg(SET_STATUS_CTL, SET_POWER_SAVE_MODE_FORMATTER, 1); | 816 | return send_control_msg(pdev, |
817 | SET_STATUS_CTL, SET_POWER_SAVE_MODE_FORMATTER, | ||
818 | &buf, sizeof(buf)); | ||
768 | } | 819 | } |
769 | 820 | ||
770 | 821 | ||
@@ -773,20 +824,20 @@ int pwc_camera_power(struct pwc_device *pdev, int power) | |||
773 | 824 | ||
774 | int pwc_restore_user(struct pwc_device *pdev) | 825 | int pwc_restore_user(struct pwc_device *pdev) |
775 | { | 826 | { |
776 | char buf; /* dummy */ | 827 | return send_control_msg(pdev, |
777 | return SendControlMsg(SET_STATUS_CTL, RESTORE_USER_DEFAULTS_FORMATTER, 0); | 828 | SET_STATUS_CTL, RESTORE_USER_DEFAULTS_FORMATTER, NULL, 0); |
778 | } | 829 | } |
779 | 830 | ||
780 | int pwc_save_user(struct pwc_device *pdev) | 831 | int pwc_save_user(struct pwc_device *pdev) |
781 | { | 832 | { |
782 | char buf; /* dummy */ | 833 | return send_control_msg(pdev, |
783 | return SendControlMsg(SET_STATUS_CTL, SAVE_USER_DEFAULTS_FORMATTER, 0); | 834 | SET_STATUS_CTL, SAVE_USER_DEFAULTS_FORMATTER, NULL, 0); |
784 | } | 835 | } |
785 | 836 | ||
786 | int pwc_restore_factory(struct pwc_device *pdev) | 837 | int pwc_restore_factory(struct pwc_device *pdev) |
787 | { | 838 | { |
788 | char buf; /* dummy */ | 839 | return send_control_msg(pdev, |
789 | return SendControlMsg(SET_STATUS_CTL, RESTORE_FACTORY_DEFAULTS_FORMATTER, 0); | 840 | SET_STATUS_CTL, RESTORE_FACTORY_DEFAULTS_FORMATTER, NULL, 0); |
790 | } | 841 | } |
791 | 842 | ||
792 | /* ************************************************* */ | 843 | /* ************************************************* */ |
@@ -814,7 +865,8 @@ int pwc_set_awb(struct pwc_device *pdev, int mode) | |||
814 | 865 | ||
815 | buf = mode & 0x07; /* just the lowest three bits */ | 866 | buf = mode & 0x07; /* just the lowest three bits */ |
816 | 867 | ||
817 | ret = SendControlMsg(SET_CHROM_CTL, WB_MODE_FORMATTER, 1); | 868 | ret = send_control_msg(pdev, |
869 | SET_CHROM_CTL, WB_MODE_FORMATTER, &buf, sizeof(buf)); | ||
818 | 870 | ||
819 | if (ret < 0) | 871 | if (ret < 0) |
820 | return ret; | 872 | return ret; |
@@ -826,7 +878,8 @@ int pwc_get_awb(struct pwc_device *pdev) | |||
826 | unsigned char buf; | 878 | unsigned char buf; |
827 | int ret; | 879 | int ret; |
828 | 880 | ||
829 | ret = RecvControlMsg(GET_CHROM_CTL, WB_MODE_FORMATTER, 1); | 881 | ret = recv_control_msg(pdev, |
882 | GET_CHROM_CTL, WB_MODE_FORMATTER, &buf, sizeof(buf)); | ||
830 | 883 | ||
831 | if (ret < 0) | 884 | if (ret < 0) |
832 | return ret; | 885 | return ret; |
@@ -843,7 +896,9 @@ int pwc_set_red_gain(struct pwc_device *pdev, int value) | |||
843 | value = 0xffff; | 896 | value = 0xffff; |
844 | /* only the msb is considered */ | 897 | /* only the msb is considered */ |
845 | buf = value >> 8; | 898 | buf = value >> 8; |
846 | return SendControlMsg(SET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, 1); | 899 | return send_control_msg(pdev, |
900 | SET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, | ||
901 | &buf, sizeof(buf)); | ||
847 | } | 902 | } |
848 | 903 | ||
849 | int pwc_get_red_gain(struct pwc_device *pdev, int *value) | 904 | int pwc_get_red_gain(struct pwc_device *pdev, int *value) |
@@ -851,7 +906,9 @@ int pwc_get_red_gain(struct pwc_device *pdev, int *value) | |||
851 | unsigned char buf; | 906 | unsigned char buf; |
852 | int ret; | 907 | int ret; |
853 | 908 | ||
854 | ret = RecvControlMsg(GET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, 1); | 909 | ret = recv_control_msg(pdev, |
910 | GET_CHROM_CTL, PRESET_MANUAL_RED_GAIN_FORMATTER, | ||
911 | &buf, sizeof(buf)); | ||
855 | if (ret < 0) | 912 | if (ret < 0) |
856 | return ret; | 913 | return ret; |
857 | *value = buf << 8; | 914 | *value = buf << 8; |
@@ -869,7 +926,9 @@ int pwc_set_blue_gain(struct pwc_device *pdev, int value) | |||
869 | value = 0xffff; | 926 | value = 0xffff; |
870 | /* only the msb is considered */ | 927 | /* only the msb is considered */ |
871 | buf = value >> 8; | 928 | buf = value >> 8; |
872 | return SendControlMsg(SET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, 1); | 929 | return send_control_msg(pdev, |
930 | SET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, | ||
931 | &buf, sizeof(buf)); | ||
873 | } | 932 | } |
874 | 933 | ||
875 | int pwc_get_blue_gain(struct pwc_device *pdev, int *value) | 934 | int pwc_get_blue_gain(struct pwc_device *pdev, int *value) |
@@ -877,7 +936,9 @@ int pwc_get_blue_gain(struct pwc_device *pdev, int *value) | |||
877 | unsigned char buf; | 936 | unsigned char buf; |
878 | int ret; | 937 | int ret; |
879 | 938 | ||
880 | ret = RecvControlMsg(GET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, 1); | 939 | ret = recv_control_msg(pdev, |
940 | GET_CHROM_CTL, PRESET_MANUAL_BLUE_GAIN_FORMATTER, | ||
941 | &buf, sizeof(buf)); | ||
881 | if (ret < 0) | 942 | if (ret < 0) |
882 | return ret; | 943 | return ret; |
883 | *value = buf << 8; | 944 | *value = buf << 8; |
@@ -894,7 +955,8 @@ static int pwc_read_red_gain(struct pwc_device *pdev, int *value) | |||
894 | unsigned char buf; | 955 | unsigned char buf; |
895 | int ret; | 956 | int ret; |
896 | 957 | ||
897 | ret = RecvControlMsg(GET_STATUS_CTL, READ_RED_GAIN_FORMATTER, 1); | 958 | ret = recv_control_msg(pdev, |
959 | GET_STATUS_CTL, READ_RED_GAIN_FORMATTER, &buf, sizeof(buf)); | ||
898 | if (ret < 0) | 960 | if (ret < 0) |
899 | return ret; | 961 | return ret; |
900 | *value = buf << 8; | 962 | *value = buf << 8; |
@@ -906,7 +968,8 @@ static int pwc_read_blue_gain(struct pwc_device *pdev, int *value) | |||
906 | unsigned char buf; | 968 | unsigned char buf; |
907 | int ret; | 969 | int ret; |
908 | 970 | ||
909 | ret = RecvControlMsg(GET_STATUS_CTL, READ_BLUE_GAIN_FORMATTER, 1); | 971 | ret = recv_control_msg(pdev, |
972 | GET_STATUS_CTL, READ_BLUE_GAIN_FORMATTER, &buf, sizeof(buf)); | ||
910 | if (ret < 0) | 973 | if (ret < 0) |
911 | return ret; | 974 | return ret; |
912 | *value = buf << 8; | 975 | *value = buf << 8; |
@@ -920,7 +983,8 @@ static int pwc_set_wb_speed(struct pwc_device *pdev, int speed) | |||
920 | 983 | ||
921 | /* useful range is 0x01..0x20 */ | 984 | /* useful range is 0x01..0x20 */ |
922 | buf = speed / 0x7f0; | 985 | buf = speed / 0x7f0; |
923 | return SendControlMsg(SET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, 1); | 986 | return send_control_msg(pdev, |
987 | SET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, &buf, sizeof(buf)); | ||
924 | } | 988 | } |
925 | 989 | ||
926 | static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) | 990 | static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) |
@@ -928,7 +992,8 @@ static int pwc_get_wb_speed(struct pwc_device *pdev, int *value) | |||
928 | unsigned char buf; | 992 | unsigned char buf; |
929 | int ret; | 993 | int ret; |
930 | 994 | ||
931 | ret = RecvControlMsg(GET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, 1); | 995 | ret = recv_control_msg(pdev, |
996 | GET_CHROM_CTL, AWB_CONTROL_SPEED_FORMATTER, &buf, sizeof(buf)); | ||
932 | if (ret < 0) | 997 | if (ret < 0) |
933 | return ret; | 998 | return ret; |
934 | *value = buf * 0x7f0; | 999 | *value = buf * 0x7f0; |
@@ -942,7 +1007,8 @@ static int pwc_set_wb_delay(struct pwc_device *pdev, int delay) | |||
942 | 1007 | ||
943 | /* useful range is 0x01..0x3F */ | 1008 | /* useful range is 0x01..0x3F */ |
944 | buf = (delay >> 10); | 1009 | buf = (delay >> 10); |
945 | return SendControlMsg(SET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, 1); | 1010 | return send_control_msg(pdev, |
1011 | SET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, &buf, sizeof(buf)); | ||
946 | } | 1012 | } |
947 | 1013 | ||
948 | static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) | 1014 | static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) |
@@ -950,7 +1016,8 @@ static int pwc_get_wb_delay(struct pwc_device *pdev, int *value) | |||
950 | unsigned char buf; | 1016 | unsigned char buf; |
951 | int ret; | 1017 | int ret; |
952 | 1018 | ||
953 | ret = RecvControlMsg(GET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, 1); | 1019 | ret = recv_control_msg(pdev, |
1020 | GET_CHROM_CTL, AWB_CONTROL_DELAY_FORMATTER, &buf, sizeof(buf)); | ||
954 | if (ret < 0) | 1021 | if (ret < 0) |
955 | return ret; | 1022 | return ret; |
956 | *value = buf << 10; | 1023 | *value = buf << 10; |
@@ -978,7 +1045,8 @@ int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value) | |||
978 | buf[0] = on_value; | 1045 | buf[0] = on_value; |
979 | buf[1] = off_value; | 1046 | buf[1] = off_value; |
980 | 1047 | ||
981 | return SendControlMsg(SET_STATUS_CTL, LED_FORMATTER, 2); | 1048 | return send_control_msg(pdev, |
1049 | SET_STATUS_CTL, LED_FORMATTER, &buf, sizeof(buf)); | ||
982 | } | 1050 | } |
983 | 1051 | ||
984 | static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) | 1052 | static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) |
@@ -992,7 +1060,8 @@ static int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value) | |||
992 | return 0; | 1060 | return 0; |
993 | } | 1061 | } |
994 | 1062 | ||
995 | ret = RecvControlMsg(GET_STATUS_CTL, LED_FORMATTER, 2); | 1063 | ret = recv_control_msg(pdev, |
1064 | GET_STATUS_CTL, LED_FORMATTER, &buf, sizeof(buf)); | ||
996 | if (ret < 0) | 1065 | if (ret < 0) |
997 | return ret; | 1066 | return ret; |
998 | *on_value = buf[0] * 100; | 1067 | *on_value = buf[0] * 100; |
@@ -1009,7 +1078,8 @@ int pwc_set_contour(struct pwc_device *pdev, int contour) | |||
1009 | buf = 0xff; /* auto contour on */ | 1078 | buf = 0xff; /* auto contour on */ |
1010 | else | 1079 | else |
1011 | buf = 0x0; /* auto contour off */ | 1080 | buf = 0x0; /* auto contour off */ |
1012 | ret = SendControlMsg(SET_LUM_CTL, AUTO_CONTOUR_FORMATTER, 1); | 1081 | ret = send_control_msg(pdev, |
1082 | SET_LUM_CTL, AUTO_CONTOUR_FORMATTER, &buf, sizeof(buf)); | ||
1013 | if (ret < 0) | 1083 | if (ret < 0) |
1014 | return ret; | 1084 | return ret; |
1015 | 1085 | ||
@@ -1019,7 +1089,8 @@ int pwc_set_contour(struct pwc_device *pdev, int contour) | |||
1019 | contour = 0xffff; | 1089 | contour = 0xffff; |
1020 | 1090 | ||
1021 | buf = (contour >> 10); /* contour preset is [0..3f] */ | 1091 | buf = (contour >> 10); /* contour preset is [0..3f] */ |
1022 | ret = SendControlMsg(SET_LUM_CTL, PRESET_CONTOUR_FORMATTER, 1); | 1092 | ret = send_control_msg(pdev, |
1093 | SET_LUM_CTL, PRESET_CONTOUR_FORMATTER, &buf, sizeof(buf)); | ||
1023 | if (ret < 0) | 1094 | if (ret < 0) |
1024 | return ret; | 1095 | return ret; |
1025 | return 0; | 1096 | return 0; |
@@ -1030,13 +1101,16 @@ int pwc_get_contour(struct pwc_device *pdev, int *contour) | |||
1030 | unsigned char buf; | 1101 | unsigned char buf; |
1031 | int ret; | 1102 | int ret; |
1032 | 1103 | ||
1033 | ret = RecvControlMsg(GET_LUM_CTL, AUTO_CONTOUR_FORMATTER, 1); | 1104 | ret = recv_control_msg(pdev, |
1105 | GET_LUM_CTL, AUTO_CONTOUR_FORMATTER, &buf, sizeof(buf)); | ||
1034 | if (ret < 0) | 1106 | if (ret < 0) |
1035 | return ret; | 1107 | return ret; |
1036 | 1108 | ||
1037 | if (buf == 0) { | 1109 | if (buf == 0) { |
1038 | /* auto mode off, query current preset value */ | 1110 | /* auto mode off, query current preset value */ |
1039 | ret = RecvControlMsg(GET_LUM_CTL, PRESET_CONTOUR_FORMATTER, 1); | 1111 | ret = recv_control_msg(pdev, |
1112 | GET_LUM_CTL, PRESET_CONTOUR_FORMATTER, | ||
1113 | &buf, sizeof(buf)); | ||
1040 | if (ret < 0) | 1114 | if (ret < 0) |
1041 | return ret; | 1115 | return ret; |
1042 | *contour = buf << 10; | 1116 | *contour = buf << 10; |
@@ -1055,7 +1129,9 @@ int pwc_set_backlight(struct pwc_device *pdev, int backlight) | |||
1055 | buf = 0xff; | 1129 | buf = 0xff; |
1056 | else | 1130 | else |
1057 | buf = 0x0; | 1131 | buf = 0x0; |
1058 | return SendControlMsg(SET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, 1); | 1132 | return send_control_msg(pdev, |
1133 | SET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, | ||
1134 | &buf, sizeof(buf)); | ||
1059 | } | 1135 | } |
1060 | 1136 | ||
1061 | int pwc_get_backlight(struct pwc_device *pdev, int *backlight) | 1137 | int pwc_get_backlight(struct pwc_device *pdev, int *backlight) |
@@ -1063,7 +1139,9 @@ int pwc_get_backlight(struct pwc_device *pdev, int *backlight) | |||
1063 | int ret; | 1139 | int ret; |
1064 | unsigned char buf; | 1140 | unsigned char buf; |
1065 | 1141 | ||
1066 | ret = RecvControlMsg(GET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, 1); | 1142 | ret = recv_control_msg(pdev, |
1143 | GET_LUM_CTL, BACK_LIGHT_COMPENSATION_FORMATTER, | ||
1144 | &buf, sizeof(buf)); | ||
1067 | if (ret < 0) | 1145 | if (ret < 0) |
1068 | return ret; | 1146 | return ret; |
1069 | *backlight = !!buf; | 1147 | *backlight = !!buf; |
@@ -1078,7 +1156,8 @@ int pwc_set_colour_mode(struct pwc_device *pdev, int colour) | |||
1078 | buf = 0xff; | 1156 | buf = 0xff; |
1079 | else | 1157 | else |
1080 | buf = 0x0; | 1158 | buf = 0x0; |
1081 | return SendControlMsg(SET_CHROM_CTL, COLOUR_MODE_FORMATTER, 1); | 1159 | return send_control_msg(pdev, |
1160 | SET_CHROM_CTL, COLOUR_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1082 | } | 1161 | } |
1083 | 1162 | ||
1084 | int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) | 1163 | int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) |
@@ -1086,7 +1165,8 @@ int pwc_get_colour_mode(struct pwc_device *pdev, int *colour) | |||
1086 | int ret; | 1165 | int ret; |
1087 | unsigned char buf; | 1166 | unsigned char buf; |
1088 | 1167 | ||
1089 | ret = RecvControlMsg(GET_CHROM_CTL, COLOUR_MODE_FORMATTER, 1); | 1168 | ret = recv_control_msg(pdev, |
1169 | GET_CHROM_CTL, COLOUR_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1090 | if (ret < 0) | 1170 | if (ret < 0) |
1091 | return ret; | 1171 | return ret; |
1092 | *colour = !!buf; | 1172 | *colour = !!buf; |
@@ -1102,7 +1182,8 @@ int pwc_set_flicker(struct pwc_device *pdev, int flicker) | |||
1102 | buf = 0xff; | 1182 | buf = 0xff; |
1103 | else | 1183 | else |
1104 | buf = 0x0; | 1184 | buf = 0x0; |
1105 | return SendControlMsg(SET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, 1); | 1185 | return send_control_msg(pdev, |
1186 | SET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1106 | } | 1187 | } |
1107 | 1188 | ||
1108 | int pwc_get_flicker(struct pwc_device *pdev, int *flicker) | 1189 | int pwc_get_flicker(struct pwc_device *pdev, int *flicker) |
@@ -1110,7 +1191,8 @@ int pwc_get_flicker(struct pwc_device *pdev, int *flicker) | |||
1110 | int ret; | 1191 | int ret; |
1111 | unsigned char buf; | 1192 | unsigned char buf; |
1112 | 1193 | ||
1113 | ret = RecvControlMsg(GET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, 1); | 1194 | ret = recv_control_msg(pdev, |
1195 | GET_LUM_CTL, FLICKERLESS_MODE_FORMATTER, &buf, sizeof(buf)); | ||
1114 | if (ret < 0) | 1196 | if (ret < 0) |
1115 | return ret; | 1197 | return ret; |
1116 | *flicker = !!buf; | 1198 | *flicker = !!buf; |
@@ -1126,7 +1208,9 @@ int pwc_set_dynamic_noise(struct pwc_device *pdev, int noise) | |||
1126 | if (noise > 3) | 1208 | if (noise > 3) |
1127 | noise = 3; | 1209 | noise = 3; |
1128 | buf = noise; | 1210 | buf = noise; |
1129 | return SendControlMsg(SET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, 1); | 1211 | return send_control_msg(pdev, |
1212 | SET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, | ||
1213 | &buf, sizeof(buf)); | ||
1130 | } | 1214 | } |
1131 | 1215 | ||
1132 | int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) | 1216 | int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) |
@@ -1134,7 +1218,9 @@ int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise) | |||
1134 | int ret; | 1218 | int ret; |
1135 | unsigned char buf; | 1219 | unsigned char buf; |
1136 | 1220 | ||
1137 | ret = RecvControlMsg(GET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, 1); | 1221 | ret = recv_control_msg(pdev, |
1222 | GET_LUM_CTL, DYNAMIC_NOISE_CONTROL_FORMATTER, | ||
1223 | &buf, sizeof(buf)); | ||
1138 | if (ret < 0) | 1224 | if (ret < 0) |
1139 | return ret; | 1225 | return ret; |
1140 | *noise = buf; | 1226 | *noise = buf; |
@@ -1146,7 +1232,8 @@ static int _pwc_mpt_reset(struct pwc_device *pdev, int flags) | |||
1146 | unsigned char buf; | 1232 | unsigned char buf; |
1147 | 1233 | ||
1148 | buf = flags & 0x03; // only lower two bits are currently used | 1234 | buf = flags & 0x03; // only lower two bits are currently used |
1149 | return SendControlMsg(SET_MPT_CTL, PT_RESET_CONTROL_FORMATTER, 1); | 1235 | return send_control_msg(pdev, |
1236 | SET_MPT_CTL, PT_RESET_CONTROL_FORMATTER, &buf, sizeof(buf)); | ||
1150 | } | 1237 | } |
1151 | 1238 | ||
1152 | int pwc_mpt_reset(struct pwc_device *pdev, int flags) | 1239 | int pwc_mpt_reset(struct pwc_device *pdev, int flags) |
@@ -1175,7 +1262,8 @@ static int _pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) | |||
1175 | buf[1] = (pan >> 8) & 0xFF; | 1262 | buf[1] = (pan >> 8) & 0xFF; |
1176 | buf[2] = tilt & 0xFF; | 1263 | buf[2] = tilt & 0xFF; |
1177 | buf[3] = (tilt >> 8) & 0xFF; | 1264 | buf[3] = (tilt >> 8) & 0xFF; |
1178 | return SendControlMsg(SET_MPT_CTL, PT_RELATIVE_CONTROL_FORMATTER, 4); | 1265 | return send_control_msg(pdev, |
1266 | SET_MPT_CTL, PT_RELATIVE_CONTROL_FORMATTER, &buf, sizeof(buf)); | ||
1179 | } | 1267 | } |
1180 | 1268 | ||
1181 | int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) | 1269 | int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt) |
@@ -1211,7 +1299,8 @@ static int pwc_mpt_get_status(struct pwc_device *pdev, struct pwc_mpt_status *st | |||
1211 | int ret; | 1299 | int ret; |
1212 | unsigned char buf[5]; | 1300 | unsigned char buf[5]; |
1213 | 1301 | ||
1214 | ret = RecvControlMsg(GET_MPT_CTL, PT_STATUS_FORMATTER, 5); | 1302 | ret = recv_control_msg(pdev, |
1303 | GET_MPT_CTL, PT_STATUS_FORMATTER, &buf, sizeof(buf)); | ||
1215 | if (ret < 0) | 1304 | if (ret < 0) |
1216 | return ret; | 1305 | return ret; |
1217 | status->status = buf[0] & 0x7; // 3 bits are used for reporting | 1306 | status->status = buf[0] & 0x7; // 3 bits are used for reporting |
@@ -1233,7 +1322,8 @@ int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor) | |||
1233 | else | 1322 | else |
1234 | request = SENSOR_TYPE_FORMATTER2; | 1323 | request = SENSOR_TYPE_FORMATTER2; |
1235 | 1324 | ||
1236 | ret = RecvControlMsg(GET_STATUS_CTL, request, 1); | 1325 | ret = recv_control_msg(pdev, |
1326 | GET_STATUS_CTL, request, &buf, sizeof(buf)); | ||
1237 | if (ret < 0) | 1327 | if (ret < 0) |
1238 | return ret; | 1328 | return ret; |
1239 | if (pdev->type < 675) | 1329 | if (pdev->type < 675) |
diff --git a/drivers/mtd/nand/cafe_nand.c b/drivers/mtd/nand/cafe_nand.c index 7c5b257ce8e4..29acd06b1c39 100644 --- a/drivers/mtd/nand/cafe_nand.c +++ b/drivers/mtd/nand/cafe_nand.c | |||
@@ -332,7 +332,7 @@ static void cafe_select_chip(struct mtd_info *mtd, int chipnr) | |||
332 | cafe->ctl1 &= ~CTRL1_CHIPSELECT; | 332 | cafe->ctl1 &= ~CTRL1_CHIPSELECT; |
333 | } | 333 | } |
334 | 334 | ||
335 | static int cafe_nand_interrupt(int irq, void *id) | 335 | static irqreturn_t cafe_nand_interrupt(int irq, void *id) |
336 | { | 336 | { |
337 | struct mtd_info *mtd = id; | 337 | struct mtd_info *mtd = id; |
338 | struct cafe_priv *cafe = mtd->priv; | 338 | struct cafe_priv *cafe = mtd->priv; |
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index 29df398b7727..1fc45431a620 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
@@ -1383,6 +1383,11 @@ static void rtl8139_hw_start (struct net_device *dev) | |||
1383 | RTL_W32_F (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0))); | 1383 | RTL_W32_F (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0))); |
1384 | RTL_W32_F (MAC0 + 4, le16_to_cpu (*(__le16 *) (dev->dev_addr + 4))); | 1384 | RTL_W32_F (MAC0 + 4, le16_to_cpu (*(__le16 *) (dev->dev_addr + 4))); |
1385 | 1385 | ||
1386 | tp->cur_rx = 0; | ||
1387 | |||
1388 | /* init Rx ring buffer DMA address */ | ||
1389 | RTL_W32_F (RxBuf, tp->rx_ring_dma); | ||
1390 | |||
1386 | /* Must enable Tx/Rx before setting transfer thresholds! */ | 1391 | /* Must enable Tx/Rx before setting transfer thresholds! */ |
1387 | RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb); | 1392 | RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb); |
1388 | 1393 | ||
@@ -1390,8 +1395,6 @@ static void rtl8139_hw_start (struct net_device *dev) | |||
1390 | RTL_W32 (RxConfig, tp->rx_config); | 1395 | RTL_W32 (RxConfig, tp->rx_config); |
1391 | RTL_W32 (TxConfig, rtl8139_tx_config); | 1396 | RTL_W32 (TxConfig, rtl8139_tx_config); |
1392 | 1397 | ||
1393 | tp->cur_rx = 0; | ||
1394 | |||
1395 | rtl_check_media (dev, 1); | 1398 | rtl_check_media (dev, 1); |
1396 | 1399 | ||
1397 | if (tp->chipset >= CH_8139B) { | 1400 | if (tp->chipset >= CH_8139B) { |
@@ -1406,9 +1409,6 @@ static void rtl8139_hw_start (struct net_device *dev) | |||
1406 | /* Lock Config[01234] and BMCR register writes */ | 1409 | /* Lock Config[01234] and BMCR register writes */ |
1407 | RTL_W8 (Cfg9346, Cfg9346_Lock); | 1410 | RTL_W8 (Cfg9346, Cfg9346_Lock); |
1408 | 1411 | ||
1409 | /* init Rx ring buffer DMA address */ | ||
1410 | RTL_W32_F (RxBuf, tp->rx_ring_dma); | ||
1411 | |||
1412 | /* init Tx buffer DMA addresses */ | 1412 | /* init Tx buffer DMA addresses */ |
1413 | for (i = 0; i < NUM_TX_DESC; i++) | 1413 | for (i = 0; i < NUM_TX_DESC; i++) |
1414 | RTL_W32_F (TxAddr0 + (i * 4), tp->tx_bufs_dma + (tp->tx_buf[i] - tp->tx_bufs)); | 1414 | RTL_W32_F (TxAddr0 + (i * 4), tp->tx_bufs_dma + (tp->tx_buf[i] - tp->tx_bufs)); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 9e921544ba20..214a92d1ef75 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -28,9 +28,9 @@ if NETDEVICES | |||
28 | 28 | ||
29 | config COMPAT_NET_DEV_OPS | 29 | config COMPAT_NET_DEV_OPS |
30 | default y | 30 | default y |
31 | bool "Enable older network device API compatiablity" | 31 | bool "Enable older network device API compatibility" |
32 | ---help--- | 32 | ---help--- |
33 | This option enables kernel compatiability with older network devices | 33 | This option enables kernel compatibility with older network devices |
34 | that do not use net_device_ops interface. | 34 | that do not use net_device_ops interface. |
35 | 35 | ||
36 | If unsure, say Y. | 36 | If unsure, say Y. |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index ab0e5febef83..7ea48414c6cb 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -1117,8 +1117,8 @@ static void cxgb_down(struct adapter *adapter) | |||
1117 | spin_unlock_irq(&adapter->work_lock); | 1117 | spin_unlock_irq(&adapter->work_lock); |
1118 | 1118 | ||
1119 | free_irq_resources(adapter); | 1119 | free_irq_resources(adapter); |
1120 | flush_workqueue(cxgb3_wq); /* wait for external IRQ handler */ | ||
1121 | quiesce_rx(adapter); | 1120 | quiesce_rx(adapter); |
1121 | flush_workqueue(cxgb3_wq); /* wait for external IRQ handler */ | ||
1122 | } | 1122 | } |
1123 | 1123 | ||
1124 | static void schedule_chk_task(struct adapter *adap) | 1124 | static void schedule_chk_task(struct adapter *adap) |
@@ -1187,6 +1187,9 @@ static int offload_close(struct t3cdev *tdev) | |||
1187 | 1187 | ||
1188 | sysfs_remove_group(&tdev->lldev->dev.kobj, &offload_attr_group); | 1188 | sysfs_remove_group(&tdev->lldev->dev.kobj, &offload_attr_group); |
1189 | 1189 | ||
1190 | /* Flush work scheduled while releasing TIDs */ | ||
1191 | flush_scheduled_work(); | ||
1192 | |||
1190 | tdev->lldev = NULL; | 1193 | tdev->lldev = NULL; |
1191 | cxgb3_set_dummy_ops(tdev); | 1194 | cxgb3_set_dummy_ops(tdev); |
1192 | t3_tp_set_offload_mode(adapter, 0); | 1195 | t3_tp_set_offload_mode(adapter, 0); |
@@ -1232,6 +1235,10 @@ static int cxgb_close(struct net_device *dev) | |||
1232 | struct port_info *pi = netdev_priv(dev); | 1235 | struct port_info *pi = netdev_priv(dev); |
1233 | struct adapter *adapter = pi->adapter; | 1236 | struct adapter *adapter = pi->adapter; |
1234 | 1237 | ||
1238 | |||
1239 | if (!adapter->open_device_map) | ||
1240 | return 0; | ||
1241 | |||
1235 | /* Stop link fault interrupts */ | 1242 | /* Stop link fault interrupts */ |
1236 | t3_xgm_intr_disable(adapter, pi->port_id); | 1243 | t3_xgm_intr_disable(adapter, pi->port_id); |
1237 | t3_read_reg(adapter, A_XGM_INT_STATUS + pi->mac.offset); | 1244 | t3_read_reg(adapter, A_XGM_INT_STATUS + pi->mac.offset); |
@@ -1247,8 +1254,7 @@ static int cxgb_close(struct net_device *dev) | |||
1247 | spin_unlock_irq(&adapter->work_lock); | 1254 | spin_unlock_irq(&adapter->work_lock); |
1248 | 1255 | ||
1249 | if (!(adapter->open_device_map & PORT_MASK)) | 1256 | if (!(adapter->open_device_map & PORT_MASK)) |
1250 | cancel_rearming_delayed_workqueue(cxgb3_wq, | 1257 | cancel_delayed_work_sync(&adapter->adap_check_task); |
1251 | &adapter->adap_check_task); | ||
1252 | 1258 | ||
1253 | if (!adapter->open_device_map) | 1259 | if (!adapter->open_device_map) |
1254 | cxgb_down(adapter); | 1260 | cxgb_down(adapter); |
@@ -2493,6 +2499,7 @@ static void check_link_status(struct adapter *adapter) | |||
2493 | 2499 | ||
2494 | spin_lock_irq(&adapter->work_lock); | 2500 | spin_lock_irq(&adapter->work_lock); |
2495 | if (p->link_fault) { | 2501 | if (p->link_fault) { |
2502 | t3_link_fault(adapter, i); | ||
2496 | spin_unlock_irq(&adapter->work_lock); | 2503 | spin_unlock_irq(&adapter->work_lock); |
2497 | continue; | 2504 | continue; |
2498 | } | 2505 | } |
@@ -2554,9 +2561,7 @@ static void t3_adap_check_task(struct work_struct *work) | |||
2554 | 2561 | ||
2555 | adapter->check_task_cnt++; | 2562 | adapter->check_task_cnt++; |
2556 | 2563 | ||
2557 | /* Check link status for PHYs without interrupts */ | 2564 | check_link_status(adapter); |
2558 | if (p->linkpoll_period) | ||
2559 | check_link_status(adapter); | ||
2560 | 2565 | ||
2561 | /* Accumulate MAC stats if needed */ | 2566 | /* Accumulate MAC stats if needed */ |
2562 | if (!p->linkpoll_period || | 2567 | if (!p->linkpoll_period || |
@@ -2680,21 +2685,6 @@ void t3_os_ext_intr_handler(struct adapter *adapter) | |||
2680 | spin_unlock(&adapter->work_lock); | 2685 | spin_unlock(&adapter->work_lock); |
2681 | } | 2686 | } |
2682 | 2687 | ||
2683 | static void link_fault_task(struct work_struct *work) | ||
2684 | { | ||
2685 | struct adapter *adapter = container_of(work, struct adapter, | ||
2686 | link_fault_handler_task); | ||
2687 | int i; | ||
2688 | |||
2689 | for_each_port(adapter, i) { | ||
2690 | struct net_device *netdev = adapter->port[i]; | ||
2691 | struct port_info *pi = netdev_priv(netdev); | ||
2692 | |||
2693 | if (pi->link_fault) | ||
2694 | t3_link_fault(adapter, i); | ||
2695 | } | ||
2696 | } | ||
2697 | |||
2698 | void t3_os_link_fault_handler(struct adapter *adapter, int port_id) | 2688 | void t3_os_link_fault_handler(struct adapter *adapter, int port_id) |
2699 | { | 2689 | { |
2700 | struct net_device *netdev = adapter->port[port_id]; | 2690 | struct net_device *netdev = adapter->port[port_id]; |
@@ -2702,7 +2692,6 @@ void t3_os_link_fault_handler(struct adapter *adapter, int port_id) | |||
2702 | 2692 | ||
2703 | spin_lock(&adapter->work_lock); | 2693 | spin_lock(&adapter->work_lock); |
2704 | pi->link_fault = 1; | 2694 | pi->link_fault = 1; |
2705 | queue_work(cxgb3_wq, &adapter->link_fault_handler_task); | ||
2706 | spin_unlock(&adapter->work_lock); | 2695 | spin_unlock(&adapter->work_lock); |
2707 | } | 2696 | } |
2708 | 2697 | ||
@@ -2838,6 +2827,9 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev, | |||
2838 | struct adapter *adapter = pci_get_drvdata(pdev); | 2827 | struct adapter *adapter = pci_get_drvdata(pdev); |
2839 | int ret; | 2828 | int ret; |
2840 | 2829 | ||
2830 | if (state == pci_channel_io_perm_failure) | ||
2831 | return PCI_ERS_RESULT_DISCONNECT; | ||
2832 | |||
2841 | ret = t3_adapter_error(adapter, 0); | 2833 | ret = t3_adapter_error(adapter, 0); |
2842 | 2834 | ||
2843 | /* Request a slot reset. */ | 2835 | /* Request a slot reset. */ |
@@ -2932,8 +2924,13 @@ static int __devinit cxgb_enable_msix(struct adapter *adap) | |||
2932 | while ((err = pci_enable_msix(adap->pdev, entries, vectors)) > 0) | 2924 | while ((err = pci_enable_msix(adap->pdev, entries, vectors)) > 0) |
2933 | vectors = err; | 2925 | vectors = err; |
2934 | 2926 | ||
2935 | if (!err && vectors < (adap->params.nports + 1)) | 2927 | if (err < 0) |
2928 | pci_disable_msix(adap->pdev); | ||
2929 | |||
2930 | if (!err && vectors < (adap->params.nports + 1)) { | ||
2931 | pci_disable_msix(adap->pdev); | ||
2936 | err = -1; | 2932 | err = -1; |
2933 | } | ||
2937 | 2934 | ||
2938 | if (!err) { | 2935 | if (!err) { |
2939 | for (i = 0; i < vectors; ++i) | 2936 | for (i = 0; i < vectors; ++i) |
@@ -3082,7 +3079,6 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
3082 | 3079 | ||
3083 | INIT_LIST_HEAD(&adapter->adapter_list); | 3080 | INIT_LIST_HEAD(&adapter->adapter_list); |
3084 | INIT_WORK(&adapter->ext_intr_handler_task, ext_intr_task); | 3081 | INIT_WORK(&adapter->ext_intr_handler_task, ext_intr_task); |
3085 | INIT_WORK(&adapter->link_fault_handler_task, link_fault_task); | ||
3086 | INIT_WORK(&adapter->fatal_error_handler_task, fatal_error_task); | 3082 | INIT_WORK(&adapter->fatal_error_handler_task, fatal_error_task); |
3087 | INIT_DELAYED_WORK(&adapter->adap_check_task, t3_adap_check_task); | 3083 | INIT_DELAYED_WORK(&adapter->adap_check_task, t3_adap_check_task); |
3088 | 3084 | ||
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index 31ed31a3428b..e1bd690ff831 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -1202,7 +1202,6 @@ void t3_link_changed(struct adapter *adapter, int port_id) | |||
1202 | struct cphy *phy = &pi->phy; | 1202 | struct cphy *phy = &pi->phy; |
1203 | struct cmac *mac = &pi->mac; | 1203 | struct cmac *mac = &pi->mac; |
1204 | struct link_config *lc = &pi->link_config; | 1204 | struct link_config *lc = &pi->link_config; |
1205 | int force_link_down = 0; | ||
1206 | 1205 | ||
1207 | phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc); | 1206 | phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc); |
1208 | 1207 | ||
@@ -1218,14 +1217,9 @@ void t3_link_changed(struct adapter *adapter, int port_id) | |||
1218 | status = t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset); | 1217 | status = t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset); |
1219 | if (status & F_LINKFAULTCHANGE) { | 1218 | if (status & F_LINKFAULTCHANGE) { |
1220 | mac->stats.link_faults++; | 1219 | mac->stats.link_faults++; |
1221 | force_link_down = 1; | 1220 | pi->link_fault = 1; |
1222 | } | 1221 | } |
1223 | t3_open_rx_traffic(mac, rx_cfg, rx_hash_high, rx_hash_low); | 1222 | t3_open_rx_traffic(mac, rx_cfg, rx_hash_high, rx_hash_low); |
1224 | |||
1225 | if (force_link_down) { | ||
1226 | t3_os_link_fault_handler(adapter, port_id); | ||
1227 | return; | ||
1228 | } | ||
1229 | } | 1223 | } |
1230 | 1224 | ||
1231 | if (lc->requested_fc & PAUSE_AUTONEG) | 1225 | if (lc->requested_fc & PAUSE_AUTONEG) |
@@ -1292,9 +1286,6 @@ void t3_link_fault(struct adapter *adapter, int port_id) | |||
1292 | /* Account link faults only when the phy reports a link up */ | 1286 | /* Account link faults only when the phy reports a link up */ |
1293 | if (link_ok) | 1287 | if (link_ok) |
1294 | mac->stats.link_faults++; | 1288 | mac->stats.link_faults++; |
1295 | |||
1296 | msleep(1000); | ||
1297 | t3_os_link_fault_handler(adapter, port_id); | ||
1298 | } else { | 1289 | } else { |
1299 | if (link_ok) | 1290 | if (link_ok) |
1300 | t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset, | 1291 | t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset, |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index ef12931d302a..6a46ceed9436 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -3834,7 +3834,6 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | |||
3834 | struct e1000_buffer *buffer_info; | 3834 | struct e1000_buffer *buffer_info; |
3835 | unsigned int i, eop; | 3835 | unsigned int i, eop; |
3836 | unsigned int count = 0; | 3836 | unsigned int count = 0; |
3837 | bool cleaned = false; | ||
3838 | unsigned int total_tx_bytes=0, total_tx_packets=0; | 3837 | unsigned int total_tx_bytes=0, total_tx_packets=0; |
3839 | 3838 | ||
3840 | i = tx_ring->next_to_clean; | 3839 | i = tx_ring->next_to_clean; |
@@ -3843,7 +3842,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | |||
3843 | 3842 | ||
3844 | while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) && | 3843 | while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) && |
3845 | (count < tx_ring->count)) { | 3844 | (count < tx_ring->count)) { |
3846 | for (cleaned = false; !cleaned; count++) { | 3845 | bool cleaned = false; |
3846 | for ( ; !cleaned; count++) { | ||
3847 | tx_desc = E1000_TX_DESC(*tx_ring, i); | 3847 | tx_desc = E1000_TX_DESC(*tx_ring, i); |
3848 | buffer_info = &tx_ring->buffer_info[i]; | 3848 | buffer_info = &tx_ring->buffer_info[i]; |
3849 | cleaned = (i == eop); | 3849 | cleaned = (i == eop); |
@@ -3871,7 +3871,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter, | |||
3871 | tx_ring->next_to_clean = i; | 3871 | tx_ring->next_to_clean = i; |
3872 | 3872 | ||
3873 | #define TX_WAKE_THRESHOLD 32 | 3873 | #define TX_WAKE_THRESHOLD 32 |
3874 | if (unlikely(cleaned && netif_carrier_ok(netdev) && | 3874 | if (unlikely(count && netif_carrier_ok(netdev) && |
3875 | E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) { | 3875 | E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) { |
3876 | /* Make sure that anybody stopping the queue after this | 3876 | /* Make sure that anybody stopping the queue after this |
3877 | * sees the new next_to_clean. | 3877 | * sees the new next_to_clean. |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 1693ed116b16..ca82f19a7ed1 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -621,7 +621,6 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | |||
621 | struct e1000_buffer *buffer_info; | 621 | struct e1000_buffer *buffer_info; |
622 | unsigned int i, eop; | 622 | unsigned int i, eop; |
623 | unsigned int count = 0; | 623 | unsigned int count = 0; |
624 | bool cleaned = false; | ||
625 | unsigned int total_tx_bytes = 0, total_tx_packets = 0; | 624 | unsigned int total_tx_bytes = 0, total_tx_packets = 0; |
626 | 625 | ||
627 | i = tx_ring->next_to_clean; | 626 | i = tx_ring->next_to_clean; |
@@ -630,7 +629,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | |||
630 | 629 | ||
631 | while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) && | 630 | while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) && |
632 | (count < tx_ring->count)) { | 631 | (count < tx_ring->count)) { |
633 | for (cleaned = 0; !cleaned; count++) { | 632 | bool cleaned = false; |
633 | for (; !cleaned; count++) { | ||
634 | tx_desc = E1000_TX_DESC(*tx_ring, i); | 634 | tx_desc = E1000_TX_DESC(*tx_ring, i); |
635 | buffer_info = &tx_ring->buffer_info[i]; | 635 | buffer_info = &tx_ring->buffer_info[i]; |
636 | cleaned = (i == eop); | 636 | cleaned = (i == eop); |
@@ -661,8 +661,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | |||
661 | tx_ring->next_to_clean = i; | 661 | tx_ring->next_to_clean = i; |
662 | 662 | ||
663 | #define TX_WAKE_THRESHOLD 32 | 663 | #define TX_WAKE_THRESHOLD 32 |
664 | if (cleaned && netif_carrier_ok(netdev) && | 664 | if (count && netif_carrier_ok(netdev) && |
665 | e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) { | 665 | e1000_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD) { |
666 | /* Make sure that anybody stopping the queue after this | 666 | /* Make sure that anybody stopping the queue after this |
667 | * sees the new next_to_clean. | 667 | * sees the new next_to_clean. |
668 | */ | 668 | */ |
diff --git a/drivers/net/ixgbe/ixgbe_dcb_82599.c b/drivers/net/ixgbe/ixgbe_dcb_82599.c index 470b676c1dae..f4417fc3b0fd 100644 --- a/drivers/net/ixgbe/ixgbe_dcb_82599.c +++ b/drivers/net/ixgbe/ixgbe_dcb_82599.c | |||
@@ -290,7 +290,7 @@ s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, | |||
290 | s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, | 290 | s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, |
291 | struct ixgbe_dcb_config *dcb_config) | 291 | struct ixgbe_dcb_config *dcb_config) |
292 | { | 292 | { |
293 | u32 i, reg; | 293 | u32 i, reg, rx_pba_size; |
294 | 294 | ||
295 | /* If PFC is disabled globally then fall back to LFC. */ | 295 | /* If PFC is disabled globally then fall back to LFC. */ |
296 | if (!dcb_config->pfc_mode_enable) { | 296 | if (!dcb_config->pfc_mode_enable) { |
@@ -301,17 +301,23 @@ s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, | |||
301 | 301 | ||
302 | /* Configure PFC Tx thresholds per TC */ | 302 | /* Configure PFC Tx thresholds per TC */ |
303 | for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { | 303 | for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { |
304 | /* Config and remember Tx */ | 304 | if (dcb_config->rx_pba_cfg == pba_equal) |
305 | rx_pba_size = IXGBE_RXPBSIZE_64KB; | ||
306 | else | ||
307 | rx_pba_size = (i < 4) ? IXGBE_RXPBSIZE_80KB | ||
308 | : IXGBE_RXPBSIZE_48KB; | ||
309 | |||
310 | reg = ((rx_pba_size >> 5) & 0xFFE0); | ||
305 | if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full || | 311 | if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full || |
306 | dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx) { | 312 | dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx) |
307 | reg = hw->fc.high_water | IXGBE_FCRTH_FCEN; | 313 | reg |= IXGBE_FCRTL_XONE; |
308 | IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg); | 314 | IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg); |
309 | reg = hw->fc.low_water | IXGBE_FCRTL_XONE; | 315 | |
310 | IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg); | 316 | reg = ((rx_pba_size >> 2) & 0xFFE0); |
311 | } else { | 317 | if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full || |
312 | IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), 0); | 318 | dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx) |
313 | IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0); | 319 | reg |= IXGBE_FCRTH_FCEN; |
314 | } | 320 | IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg); |
315 | } | 321 | } |
316 | 322 | ||
317 | /* Configure pause time (2 TCs per register) */ | 323 | /* Configure pause time (2 TCs per register) */ |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index febde45cf9fa..01884256f4c9 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -2841,11 +2841,55 @@ static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter) | |||
2841 | } | 2841 | } |
2842 | ret = true; | 2842 | ret = true; |
2843 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | 2843 | } else if (adapter->hw.mac.type == ixgbe_mac_82599EB) { |
2844 | for (i = 0; i < dcb_i; i++) { | 2844 | if (dcb_i == 8) { |
2845 | adapter->rx_ring[i].reg_idx = i << 4; | 2845 | /* |
2846 | adapter->tx_ring[i].reg_idx = i << 4; | 2846 | * Tx TC0 starts at: descriptor queue 0 |
2847 | * Tx TC1 starts at: descriptor queue 32 | ||
2848 | * Tx TC2 starts at: descriptor queue 64 | ||
2849 | * Tx TC3 starts at: descriptor queue 80 | ||
2850 | * Tx TC4 starts at: descriptor queue 96 | ||
2851 | * Tx TC5 starts at: descriptor queue 104 | ||
2852 | * Tx TC6 starts at: descriptor queue 112 | ||
2853 | * Tx TC7 starts at: descriptor queue 120 | ||
2854 | * | ||
2855 | * Rx TC0-TC7 are offset by 16 queues each | ||
2856 | */ | ||
2857 | for (i = 0; i < 3; i++) { | ||
2858 | adapter->tx_ring[i].reg_idx = i << 5; | ||
2859 | adapter->rx_ring[i].reg_idx = i << 4; | ||
2860 | } | ||
2861 | for ( ; i < 5; i++) { | ||
2862 | adapter->tx_ring[i].reg_idx = | ||
2863 | ((i + 2) << 4); | ||
2864 | adapter->rx_ring[i].reg_idx = i << 4; | ||
2865 | } | ||
2866 | for ( ; i < dcb_i; i++) { | ||
2867 | adapter->tx_ring[i].reg_idx = | ||
2868 | ((i + 8) << 3); | ||
2869 | adapter->rx_ring[i].reg_idx = i << 4; | ||
2870 | } | ||
2871 | |||
2872 | ret = true; | ||
2873 | } else if (dcb_i == 4) { | ||
2874 | /* | ||
2875 | * Tx TC0 starts at: descriptor queue 0 | ||
2876 | * Tx TC1 starts at: descriptor queue 64 | ||
2877 | * Tx TC2 starts at: descriptor queue 96 | ||
2878 | * Tx TC3 starts at: descriptor queue 112 | ||
2879 | * | ||
2880 | * Rx TC0-TC3 are offset by 32 queues each | ||
2881 | */ | ||
2882 | adapter->tx_ring[0].reg_idx = 0; | ||
2883 | adapter->tx_ring[1].reg_idx = 64; | ||
2884 | adapter->tx_ring[2].reg_idx = 96; | ||
2885 | adapter->tx_ring[3].reg_idx = 112; | ||
2886 | for (i = 0 ; i < dcb_i; i++) | ||
2887 | adapter->rx_ring[i].reg_idx = i << 5; | ||
2888 | |||
2889 | ret = true; | ||
2890 | } else { | ||
2891 | ret = false; | ||
2847 | } | 2892 | } |
2848 | ret = true; | ||
2849 | } else { | 2893 | } else { |
2850 | ret = false; | 2894 | ret = false; |
2851 | } | 2895 | } |
@@ -3946,7 +3990,7 @@ static void ixgbe_sfp_config_module_task(struct work_struct *work) | |||
3946 | } | 3990 | } |
3947 | hw->mac.ops.setup_sfp(hw); | 3991 | hw->mac.ops.setup_sfp(hw); |
3948 | 3992 | ||
3949 | if (!adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK) | 3993 | if (!(adapter->flags & IXGBE_FLAG_IN_SFP_LINK_TASK)) |
3950 | /* This will also work for DA Twinax connections */ | 3994 | /* This will also work for DA Twinax connections */ |
3951 | schedule_work(&adapter->multispeed_fiber_task); | 3995 | schedule_work(&adapter->multispeed_fiber_task); |
3952 | adapter->flags &= ~IXGBE_FLAG_IN_SFP_MOD_TASK; | 3996 | adapter->flags &= ~IXGBE_FLAG_IN_SFP_MOD_TASK; |
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 46073de290cf..e82aee41d77e 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
@@ -316,10 +316,11 @@ static void macb_tx(struct macb *bp) | |||
316 | dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n", | 316 | dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n", |
317 | (unsigned long)status); | 317 | (unsigned long)status); |
318 | 318 | ||
319 | if (status & MACB_BIT(UND)) { | 319 | if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) { |
320 | int i; | 320 | int i; |
321 | printk(KERN_ERR "%s: TX underrun, resetting buffers\n", | 321 | printk(KERN_ERR "%s: TX %s, resetting buffers\n", |
322 | bp->dev->name); | 322 | bp->dev->name, status & MACB_BIT(UND) ? |
323 | "underrun" : "retry limit exceeded"); | ||
323 | 324 | ||
324 | /* Transfer ongoing, disable transmitter, to avoid confusion */ | 325 | /* Transfer ongoing, disable transmitter, to avoid confusion */ |
325 | if (status & MACB_BIT(TGO)) | 326 | if (status & MACB_BIT(TGO)) |
@@ -520,27 +521,10 @@ static int macb_poll(struct napi_struct *napi, int budget) | |||
520 | macb_writel(bp, RSR, status); | 521 | macb_writel(bp, RSR, status); |
521 | 522 | ||
522 | work_done = 0; | 523 | work_done = 0; |
523 | if (!status) { | ||
524 | /* | ||
525 | * This may happen if an interrupt was pending before | ||
526 | * this function was called last time, and no packets | ||
527 | * have been received since. | ||
528 | */ | ||
529 | napi_complete(napi); | ||
530 | goto out; | ||
531 | } | ||
532 | 524 | ||
533 | dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n", | 525 | dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n", |
534 | (unsigned long)status, budget); | 526 | (unsigned long)status, budget); |
535 | 527 | ||
536 | if (!(status & MACB_BIT(REC))) { | ||
537 | dev_warn(&bp->pdev->dev, | ||
538 | "No RX buffers complete, status = %02lx\n", | ||
539 | (unsigned long)status); | ||
540 | napi_complete(napi); | ||
541 | goto out; | ||
542 | } | ||
543 | |||
544 | work_done = macb_rx(bp, budget); | 528 | work_done = macb_rx(bp, budget); |
545 | if (work_done < budget) | 529 | if (work_done < budget) |
546 | napi_complete(napi); | 530 | napi_complete(napi); |
@@ -549,7 +533,6 @@ static int macb_poll(struct napi_struct *napi, int budget) | |||
549 | * We've done what we can to clean the buffers. Make sure we | 533 | * We've done what we can to clean the buffers. Make sure we |
550 | * get notified when new packets arrive. | 534 | * get notified when new packets arrive. |
551 | */ | 535 | */ |
552 | out: | ||
553 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | 536 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); |
554 | 537 | ||
555 | /* TODO: Handle errors */ | 538 | /* TODO: Handle errors */ |
@@ -590,7 +573,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
590 | } | 573 | } |
591 | } | 574 | } |
592 | 575 | ||
593 | if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND))) | 576 | if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND) | |
577 | MACB_BIT(ISR_RLE))) | ||
594 | macb_tx(bp); | 578 | macb_tx(bp); |
595 | 579 | ||
596 | /* | 580 | /* |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 70d3ef4a2c5f..214a8cf2b708 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -376,7 +376,8 @@ static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev) | |||
376 | const struct macvlan_dev *vlan = netdev_priv(dev); | 376 | const struct macvlan_dev *vlan = netdev_priv(dev); |
377 | struct net_device *lowerdev = vlan->lowerdev; | 377 | struct net_device *lowerdev = vlan->lowerdev; |
378 | 378 | ||
379 | if (lowerdev->ethtool_ops->get_rx_csum == NULL) | 379 | if (lowerdev->ethtool_ops == NULL || |
380 | lowerdev->ethtool_ops->get_rx_csum == NULL) | ||
380 | return 0; | 381 | return 0; |
381 | return lowerdev->ethtool_ops->get_rx_csum(lowerdev); | 382 | return lowerdev->ethtool_ops->get_rx_csum(lowerdev); |
382 | } | 383 | } |
@@ -387,7 +388,8 @@ static int macvlan_ethtool_get_settings(struct net_device *dev, | |||
387 | const struct macvlan_dev *vlan = netdev_priv(dev); | 388 | const struct macvlan_dev *vlan = netdev_priv(dev); |
388 | struct net_device *lowerdev = vlan->lowerdev; | 389 | struct net_device *lowerdev = vlan->lowerdev; |
389 | 390 | ||
390 | if (!lowerdev->ethtool_ops->get_settings) | 391 | if (!lowerdev->ethtool_ops || |
392 | !lowerdev->ethtool_ops->get_settings) | ||
391 | return -EOPNOTSUPP; | 393 | return -EOPNOTSUPP; |
392 | 394 | ||
393 | return lowerdev->ethtool_ops->get_settings(lowerdev, cmd); | 395 | return lowerdev->ethtool_ops->get_settings(lowerdev, cmd); |
@@ -398,7 +400,8 @@ static u32 macvlan_ethtool_get_flags(struct net_device *dev) | |||
398 | const struct macvlan_dev *vlan = netdev_priv(dev); | 400 | const struct macvlan_dev *vlan = netdev_priv(dev); |
399 | struct net_device *lowerdev = vlan->lowerdev; | 401 | struct net_device *lowerdev = vlan->lowerdev; |
400 | 402 | ||
401 | if (!lowerdev->ethtool_ops->get_flags) | 403 | if (!lowerdev->ethtool_ops || |
404 | !lowerdev->ethtool_ops->get_flags) | ||
402 | return 0; | 405 | return 0; |
403 | return lowerdev->ethtool_ops->get_flags(lowerdev); | 406 | return lowerdev->ethtool_ops->get_flags(lowerdev); |
404 | } | 407 | } |
diff --git a/drivers/net/mlx4/en_main.c b/drivers/net/mlx4/en_main.c index eda72dd2120f..510633fd57f6 100644 --- a/drivers/net/mlx4/en_main.c +++ b/drivers/net/mlx4/en_main.c | |||
@@ -181,7 +181,7 @@ static void *mlx4_en_add(struct mlx4_dev *dev) | |||
181 | mdev->workqueue = create_singlethread_workqueue("mlx4_en"); | 181 | mdev->workqueue = create_singlethread_workqueue("mlx4_en"); |
182 | if (!mdev->workqueue) { | 182 | if (!mdev->workqueue) { |
183 | err = -ENOMEM; | 183 | err = -ENOMEM; |
184 | goto err_close_nic; | 184 | goto err_mr; |
185 | } | 185 | } |
186 | 186 | ||
187 | /* At this stage all non-port specific tasks are complete: | 187 | /* At this stage all non-port specific tasks are complete: |
@@ -214,9 +214,8 @@ err_free_netdev: | |||
214 | flush_workqueue(mdev->workqueue); | 214 | flush_workqueue(mdev->workqueue); |
215 | 215 | ||
216 | /* Stop event queue before we drop down to release shared SW state */ | 216 | /* Stop event queue before we drop down to release shared SW state */ |
217 | |||
218 | err_close_nic: | ||
219 | destroy_workqueue(mdev->workqueue); | 217 | destroy_workqueue(mdev->workqueue); |
218 | |||
220 | err_mr: | 219 | err_mr: |
221 | mlx4_mr_free(dev, &mdev->mr); | 220 | mlx4_mr_free(dev, &mdev->mr); |
222 | err_uar: | 221 | err_uar: |
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index 303c23de6cac..438678ab2a10 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c | |||
@@ -348,11 +348,9 @@ static void mlx4_en_tx_timeout(struct net_device *dev) | |||
348 | if (netif_msg_timer(priv)) | 348 | if (netif_msg_timer(priv)) |
349 | mlx4_warn(mdev, "Tx timeout called on port:%d\n", priv->port); | 349 | mlx4_warn(mdev, "Tx timeout called on port:%d\n", priv->port); |
350 | 350 | ||
351 | if (netif_carrier_ok(dev)) { | 351 | priv->port_stats.tx_timeout++; |
352 | priv->port_stats.tx_timeout++; | 352 | mlx4_dbg(DRV, priv, "Scheduling watchdog\n"); |
353 | mlx4_dbg(DRV, priv, "Scheduling watchdog\n"); | 353 | queue_work(mdev->workqueue, &priv->watchdog_task); |
354 | queue_work(mdev->workqueue, &priv->watchdog_task); | ||
355 | } | ||
356 | } | 354 | } |
357 | 355 | ||
358 | 356 | ||
@@ -761,9 +759,14 @@ static void mlx4_en_restart(struct work_struct *work) | |||
761 | struct net_device *dev = priv->dev; | 759 | struct net_device *dev = priv->dev; |
762 | 760 | ||
763 | mlx4_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); | 761 | mlx4_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); |
764 | mlx4_en_stop_port(dev); | 762 | |
765 | if (mlx4_en_start_port(dev)) | 763 | mutex_lock(&mdev->state_lock); |
766 | mlx4_err(mdev, "Failed restarting port %d\n", priv->port); | 764 | if (priv->port_up) { |
765 | mlx4_en_stop_port(dev); | ||
766 | if (mlx4_en_start_port(dev)) | ||
767 | mlx4_err(mdev, "Failed restarting port %d\n", priv->port); | ||
768 | } | ||
769 | mutex_unlock(&mdev->state_lock); | ||
767 | } | 770 | } |
768 | 771 | ||
769 | 772 | ||
@@ -1054,7 +1057,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
1054 | * Set driver features | 1057 | * Set driver features |
1055 | */ | 1058 | */ |
1056 | dev->features |= NETIF_F_SG; | 1059 | dev->features |= NETIF_F_SG; |
1057 | dev->features |= NETIF_F_HW_CSUM; | 1060 | dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; |
1058 | dev->features |= NETIF_F_HIGHDMA; | 1061 | dev->features |= NETIF_F_HIGHDMA; |
1059 | dev->features |= NETIF_F_HW_VLAN_TX | | 1062 | dev->features |= NETIF_F_HW_VLAN_TX | |
1060 | NETIF_F_HW_VLAN_RX | | 1063 | NETIF_F_HW_VLAN_RX | |
diff --git a/drivers/net/mlx4/en_port.c b/drivers/net/mlx4/en_port.c index c5a4c0389752..a29abe845d2e 100644 --- a/drivers/net/mlx4/en_port.c +++ b/drivers/net/mlx4/en_port.c | |||
@@ -151,6 +151,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
151 | struct mlx4_cmd_mailbox *mailbox; | 151 | struct mlx4_cmd_mailbox *mailbox; |
152 | u64 in_mod = reset << 8 | port; | 152 | u64 in_mod = reset << 8 | port; |
153 | int err; | 153 | int err; |
154 | int i; | ||
154 | 155 | ||
155 | mailbox = mlx4_alloc_cmd_mailbox(mdev->dev); | 156 | mailbox = mlx4_alloc_cmd_mailbox(mdev->dev); |
156 | if (IS_ERR(mailbox)) | 157 | if (IS_ERR(mailbox)) |
@@ -165,38 +166,18 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
165 | 166 | ||
166 | spin_lock_bh(&priv->stats_lock); | 167 | spin_lock_bh(&priv->stats_lock); |
167 | 168 | ||
168 | stats->rx_packets = be32_to_cpu(mlx4_en_stats->RTOTFRMS) - | 169 | stats->rx_packets = 0; |
169 | be32_to_cpu(mlx4_en_stats->RDROP); | 170 | stats->rx_bytes = 0; |
170 | stats->tx_packets = be64_to_cpu(mlx4_en_stats->TTOT_prio_0) + | 171 | for (i = 0; i < priv->rx_ring_num; i++) { |
171 | be64_to_cpu(mlx4_en_stats->TTOT_prio_1) + | 172 | stats->rx_packets += priv->rx_ring[i].packets; |
172 | be64_to_cpu(mlx4_en_stats->TTOT_prio_2) + | 173 | stats->rx_bytes += priv->rx_ring[i].bytes; |
173 | be64_to_cpu(mlx4_en_stats->TTOT_prio_3) + | 174 | } |
174 | be64_to_cpu(mlx4_en_stats->TTOT_prio_4) + | 175 | stats->tx_packets = 0; |
175 | be64_to_cpu(mlx4_en_stats->TTOT_prio_5) + | 176 | stats->tx_bytes = 0; |
176 | be64_to_cpu(mlx4_en_stats->TTOT_prio_6) + | 177 | for (i = 0; i <= priv->tx_ring_num; i++) { |
177 | be64_to_cpu(mlx4_en_stats->TTOT_prio_7) + | 178 | stats->tx_packets += priv->tx_ring[i].packets; |
178 | be64_to_cpu(mlx4_en_stats->TTOT_novlan) + | 179 | stats->tx_bytes += priv->tx_ring[i].bytes; |
179 | be64_to_cpu(mlx4_en_stats->TTOT_loopbk); | 180 | } |
180 | stats->rx_bytes = be64_to_cpu(mlx4_en_stats->ROCT_prio_0) + | ||
181 | be64_to_cpu(mlx4_en_stats->ROCT_prio_1) + | ||
182 | be64_to_cpu(mlx4_en_stats->ROCT_prio_2) + | ||
183 | be64_to_cpu(mlx4_en_stats->ROCT_prio_3) + | ||
184 | be64_to_cpu(mlx4_en_stats->ROCT_prio_4) + | ||
185 | be64_to_cpu(mlx4_en_stats->ROCT_prio_5) + | ||
186 | be64_to_cpu(mlx4_en_stats->ROCT_prio_6) + | ||
187 | be64_to_cpu(mlx4_en_stats->ROCT_prio_7) + | ||
188 | be64_to_cpu(mlx4_en_stats->ROCT_novlan); | ||
189 | |||
190 | stats->tx_bytes = be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_0) + | ||
191 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_1) + | ||
192 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_2) + | ||
193 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_3) + | ||
194 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_4) + | ||
195 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_5) + | ||
196 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_6) + | ||
197 | be64_to_cpu(mlx4_en_stats->TTTLOCT_prio_7) + | ||
198 | be64_to_cpu(mlx4_en_stats->TTTLOCT_novlan) + | ||
199 | be64_to_cpu(mlx4_en_stats->TTTLOCT_loopbk); | ||
200 | 181 | ||
201 | stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) + | 182 | stats->rx_errors = be64_to_cpu(mlx4_en_stats->PCS) + |
202 | be32_to_cpu(mlx4_en_stats->RdropLength) + | 183 | be32_to_cpu(mlx4_en_stats->RdropLength) + |
diff --git a/drivers/net/mlx4/en_resources.c b/drivers/net/mlx4/en_resources.c index a0545209e507..65ca706c04bb 100644 --- a/drivers/net/mlx4/en_resources.c +++ b/drivers/net/mlx4/en_resources.c | |||
@@ -94,3 +94,9 @@ void mlx4_en_unmap_buffer(struct mlx4_buf *buf) | |||
94 | 94 | ||
95 | vunmap(buf->direct.buf); | 95 | vunmap(buf->direct.buf); |
96 | } | 96 | } |
97 | |||
98 | void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event) | ||
99 | { | ||
100 | return; | ||
101 | } | ||
102 | |||
diff --git a/drivers/net/mlx4/en_rx.c b/drivers/net/mlx4/en_rx.c index 7e40741fb7d8..0cbb78ca7b29 100644 --- a/drivers/net/mlx4/en_rx.c +++ b/drivers/net/mlx4/en_rx.c | |||
@@ -436,8 +436,9 @@ int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv) | |||
436 | /* Initialize page allocators */ | 436 | /* Initialize page allocators */ |
437 | err = mlx4_en_init_allocator(priv, ring); | 437 | err = mlx4_en_init_allocator(priv, ring); |
438 | if (err) { | 438 | if (err) { |
439 | mlx4_err(mdev, "Failed initializing ring allocator\n"); | 439 | mlx4_err(mdev, "Failed initializing ring allocator\n"); |
440 | goto err_allocator; | 440 | ring_ind--; |
441 | goto err_allocator; | ||
441 | } | 442 | } |
442 | 443 | ||
443 | /* Fill Rx buffers */ | 444 | /* Fill Rx buffers */ |
@@ -467,6 +468,7 @@ int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv) | |||
467 | ring->wqres.db.dma, &ring->srq); | 468 | ring->wqres.db.dma, &ring->srq); |
468 | if (err){ | 469 | if (err){ |
469 | mlx4_err(mdev, "Failed to allocate srq\n"); | 470 | mlx4_err(mdev, "Failed to allocate srq\n"); |
471 | ring_ind--; | ||
470 | goto err_srq; | 472 | goto err_srq; |
471 | } | 473 | } |
472 | ring->srq.event = mlx4_en_srq_event; | 474 | ring->srq.event = mlx4_en_srq_event; |
@@ -926,12 +928,6 @@ void mlx4_en_set_default_rss_map(struct mlx4_en_priv *priv, | |||
926 | } | 928 | } |
927 | } | 929 | } |
928 | 930 | ||
929 | static void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event) | ||
930 | { | ||
931 | return; | ||
932 | } | ||
933 | |||
934 | |||
935 | static int mlx4_en_config_rss_qp(struct mlx4_en_priv *priv, | 931 | static int mlx4_en_config_rss_qp(struct mlx4_en_priv *priv, |
936 | int qpn, int srqn, int cqn, | 932 | int qpn, int srqn, int cqn, |
937 | enum mlx4_qp_state *state, | 933 | enum mlx4_qp_state *state, |
diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c index 4afd5993e31c..ac6fc499b280 100644 --- a/drivers/net/mlx4/en_tx.c +++ b/drivers/net/mlx4/en_tx.c | |||
@@ -112,6 +112,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, | |||
112 | mlx4_err(mdev, "Failed allocating qp %d\n", ring->qpn); | 112 | mlx4_err(mdev, "Failed allocating qp %d\n", ring->qpn); |
113 | goto err_reserve; | 113 | goto err_reserve; |
114 | } | 114 | } |
115 | ring->qp.event = mlx4_en_sqp_event; | ||
115 | 116 | ||
116 | return 0; | 117 | return 0; |
117 | 118 | ||
diff --git a/drivers/net/mlx4/mlx4_en.h b/drivers/net/mlx4/mlx4_en.h index e9af32d41ca4..ef840abbcd39 100644 --- a/drivers/net/mlx4/mlx4_en.h +++ b/drivers/net/mlx4/mlx4_en.h | |||
@@ -538,6 +538,7 @@ int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget); | |||
538 | void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride, | 538 | void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride, |
539 | int is_tx, int rss, int qpn, int cqn, int srqn, | 539 | int is_tx, int rss, int qpn, int cqn, int srqn, |
540 | struct mlx4_qp_context *context); | 540 | struct mlx4_qp_context *context); |
541 | void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event); | ||
541 | int mlx4_en_map_buffer(struct mlx4_buf *buf); | 542 | int mlx4_en_map_buffer(struct mlx4_buf *buf); |
542 | void mlx4_en_unmap_buffer(struct mlx4_buf *buf); | 543 | void mlx4_en_unmap_buffer(struct mlx4_buf *buf); |
543 | 544 | ||
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 2fbf9f9ddd37..652a36888361 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
@@ -1758,7 +1758,7 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
1758 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"), | 1758 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"), |
1759 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"), | 1759 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"), |
1760 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"), | 1760 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"), |
1761 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "LA-PCM.cis"), | 1761 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), |
1762 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), | 1762 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), |
1763 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"), | 1763 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"), |
1764 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), | 1764 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), |
diff --git a/drivers/net/ps3_gelic_wireless.c b/drivers/net/ps3_gelic_wireless.c index a5ac2bd58b5b..4f3ada622f9b 100644 --- a/drivers/net/ps3_gelic_wireless.c +++ b/drivers/net/ps3_gelic_wireless.c | |||
@@ -2101,6 +2101,9 @@ static int gelic_wl_associate_bss(struct gelic_wl_info *wl, | |||
2101 | if (ret) { | 2101 | if (ret) { |
2102 | pr_debug("%s: WEP/WPA setup failed %d\n", __func__, | 2102 | pr_debug("%s: WEP/WPA setup failed %d\n", __func__, |
2103 | ret); | 2103 | ret); |
2104 | ret = -EPERM; | ||
2105 | gelic_wl_send_iwap_event(wl, NULL); | ||
2106 | goto out; | ||
2104 | } | 2107 | } |
2105 | 2108 | ||
2106 | /* start association */ | 2109 | /* start association */ |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 7a837c465960..201be425643a 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -2190,7 +2190,14 @@ static int tg3_nvram_read_using_eeprom(struct tg3 *tp, | |||
2190 | if (!(tmp & EEPROM_ADDR_COMPLETE)) | 2190 | if (!(tmp & EEPROM_ADDR_COMPLETE)) |
2191 | return -EBUSY; | 2191 | return -EBUSY; |
2192 | 2192 | ||
2193 | *val = tr32(GRC_EEPROM_DATA); | 2193 | tmp = tr32(GRC_EEPROM_DATA); |
2194 | |||
2195 | /* | ||
2196 | * The data will always be opposite the native endian | ||
2197 | * format. Perform a blind byteswap to compensate. | ||
2198 | */ | ||
2199 | *val = swab32(tmp); | ||
2200 | |||
2194 | return 0; | 2201 | return 0; |
2195 | } | 2202 | } |
2196 | 2203 | ||
@@ -10663,7 +10670,13 @@ static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp, | |||
10663 | 10670 | ||
10664 | memcpy(&data, buf + i, 4); | 10671 | memcpy(&data, buf + i, 4); |
10665 | 10672 | ||
10666 | tw32(GRC_EEPROM_DATA, be32_to_cpu(data)); | 10673 | /* |
10674 | * The SEEPROM interface expects the data to always be opposite | ||
10675 | * the native endian format. We accomplish this by reversing | ||
10676 | * all the operations that would have been performed on the | ||
10677 | * data from a call to tg3_nvram_read_be32(). | ||
10678 | */ | ||
10679 | tw32(GRC_EEPROM_DATA, swab32(be32_to_cpu(data))); | ||
10667 | 10680 | ||
10668 | val = tr32(GRC_EEPROM_ADDR); | 10681 | val = tr32(GRC_EEPROM_ADDR); |
10669 | tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE); | 10682 | tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE); |
@@ -12443,13 +12456,8 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) | |||
12443 | /* Next, try NVRAM. */ | 12456 | /* Next, try NVRAM. */ |
12444 | if (!tg3_nvram_read_be32(tp, mac_offset + 0, &hi) && | 12457 | if (!tg3_nvram_read_be32(tp, mac_offset + 0, &hi) && |
12445 | !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) { | 12458 | !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) { |
12446 | dev->dev_addr[0] = ((hi >> 16) & 0xff); | 12459 | memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2); |
12447 | dev->dev_addr[1] = ((hi >> 24) & 0xff); | 12460 | memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo)); |
12448 | dev->dev_addr[2] = ((lo >> 0) & 0xff); | ||
12449 | dev->dev_addr[3] = ((lo >> 8) & 0xff); | ||
12450 | dev->dev_addr[4] = ((lo >> 16) & 0xff); | ||
12451 | dev->dev_addr[5] = ((lo >> 24) & 0xff); | ||
12452 | |||
12453 | } | 12461 | } |
12454 | /* Finally just fetch it out of the MAC control regs. */ | 12462 | /* Finally just fetch it out of the MAC control regs. */ |
12455 | else { | 12463 | else { |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 16716aef184c..735bf41c654a 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -93,7 +93,6 @@ struct tun_file { | |||
93 | atomic_t count; | 93 | atomic_t count; |
94 | struct tun_struct *tun; | 94 | struct tun_struct *tun; |
95 | struct net *net; | 95 | struct net *net; |
96 | wait_queue_head_t read_wait; | ||
97 | }; | 96 | }; |
98 | 97 | ||
99 | struct tun_sock; | 98 | struct tun_sock; |
@@ -156,6 +155,7 @@ static int tun_attach(struct tun_struct *tun, struct file *file) | |||
156 | tfile->tun = tun; | 155 | tfile->tun = tun; |
157 | tun->tfile = tfile; | 156 | tun->tfile = tfile; |
158 | dev_hold(tun->dev); | 157 | dev_hold(tun->dev); |
158 | sock_hold(tun->sk); | ||
159 | atomic_inc(&tfile->count); | 159 | atomic_inc(&tfile->count); |
160 | 160 | ||
161 | out: | 161 | out: |
@@ -165,11 +165,8 @@ out: | |||
165 | 165 | ||
166 | static void __tun_detach(struct tun_struct *tun) | 166 | static void __tun_detach(struct tun_struct *tun) |
167 | { | 167 | { |
168 | struct tun_file *tfile = tun->tfile; | ||
169 | |||
170 | /* Detach from net device */ | 168 | /* Detach from net device */ |
171 | netif_tx_lock_bh(tun->dev); | 169 | netif_tx_lock_bh(tun->dev); |
172 | tfile->tun = NULL; | ||
173 | tun->tfile = NULL; | 170 | tun->tfile = NULL; |
174 | netif_tx_unlock_bh(tun->dev); | 171 | netif_tx_unlock_bh(tun->dev); |
175 | 172 | ||
@@ -333,12 +330,19 @@ static void tun_net_uninit(struct net_device *dev) | |||
333 | /* Inform the methods they need to stop using the dev. | 330 | /* Inform the methods they need to stop using the dev. |
334 | */ | 331 | */ |
335 | if (tfile) { | 332 | if (tfile) { |
336 | wake_up_all(&tfile->read_wait); | 333 | wake_up_all(&tun->socket.wait); |
337 | if (atomic_dec_and_test(&tfile->count)) | 334 | if (atomic_dec_and_test(&tfile->count)) |
338 | __tun_detach(tun); | 335 | __tun_detach(tun); |
339 | } | 336 | } |
340 | } | 337 | } |
341 | 338 | ||
339 | static void tun_free_netdev(struct net_device *dev) | ||
340 | { | ||
341 | struct tun_struct *tun = netdev_priv(dev); | ||
342 | |||
343 | sock_put(tun->sk); | ||
344 | } | ||
345 | |||
342 | /* Net device open. */ | 346 | /* Net device open. */ |
343 | static int tun_net_open(struct net_device *dev) | 347 | static int tun_net_open(struct net_device *dev) |
344 | { | 348 | { |
@@ -393,7 +397,7 @@ static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev) | |||
393 | /* Notify and wake up reader process */ | 397 | /* Notify and wake up reader process */ |
394 | if (tun->flags & TUN_FASYNC) | 398 | if (tun->flags & TUN_FASYNC) |
395 | kill_fasync(&tun->fasync, SIGIO, POLL_IN); | 399 | kill_fasync(&tun->fasync, SIGIO, POLL_IN); |
396 | wake_up_interruptible(&tun->tfile->read_wait); | 400 | wake_up_interruptible(&tun->socket.wait); |
397 | return 0; | 401 | return 0; |
398 | 402 | ||
399 | drop: | 403 | drop: |
@@ -490,7 +494,7 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait) | |||
490 | 494 | ||
491 | DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name); | 495 | DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name); |
492 | 496 | ||
493 | poll_wait(file, &tfile->read_wait, wait); | 497 | poll_wait(file, &tun->socket.wait, wait); |
494 | 498 | ||
495 | if (!skb_queue_empty(&tun->readq)) | 499 | if (!skb_queue_empty(&tun->readq)) |
496 | mask |= POLLIN | POLLRDNORM; | 500 | mask |= POLLIN | POLLRDNORM; |
@@ -763,7 +767,7 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv, | |||
763 | goto out; | 767 | goto out; |
764 | } | 768 | } |
765 | 769 | ||
766 | add_wait_queue(&tfile->read_wait, &wait); | 770 | add_wait_queue(&tun->socket.wait, &wait); |
767 | while (len) { | 771 | while (len) { |
768 | current->state = TASK_INTERRUPTIBLE; | 772 | current->state = TASK_INTERRUPTIBLE; |
769 | 773 | ||
@@ -794,7 +798,7 @@ static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv, | |||
794 | } | 798 | } |
795 | 799 | ||
796 | current->state = TASK_RUNNING; | 800 | current->state = TASK_RUNNING; |
797 | remove_wait_queue(&tfile->read_wait, &wait); | 801 | remove_wait_queue(&tun->socket.wait, &wait); |
798 | 802 | ||
799 | out: | 803 | out: |
800 | tun_put(tun); | 804 | tun_put(tun); |
@@ -811,7 +815,7 @@ static void tun_setup(struct net_device *dev) | |||
811 | tun->group = -1; | 815 | tun->group = -1; |
812 | 816 | ||
813 | dev->ethtool_ops = &tun_ethtool_ops; | 817 | dev->ethtool_ops = &tun_ethtool_ops; |
814 | dev->destructor = free_netdev; | 818 | dev->destructor = tun_free_netdev; |
815 | } | 819 | } |
816 | 820 | ||
817 | /* Trivial set of netlink ops to allow deleting tun or tap | 821 | /* Trivial set of netlink ops to allow deleting tun or tap |
@@ -848,7 +852,7 @@ static void tun_sock_write_space(struct sock *sk) | |||
848 | 852 | ||
849 | static void tun_sock_destruct(struct sock *sk) | 853 | static void tun_sock_destruct(struct sock *sk) |
850 | { | 854 | { |
851 | dev_put(container_of(sk, struct tun_sock, sk)->tun->dev); | 855 | free_netdev(container_of(sk, struct tun_sock, sk)->tun->dev); |
852 | } | 856 | } |
853 | 857 | ||
854 | static struct proto tun_proto = { | 858 | static struct proto tun_proto = { |
@@ -862,7 +866,6 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
862 | struct sock *sk; | 866 | struct sock *sk; |
863 | struct tun_struct *tun; | 867 | struct tun_struct *tun; |
864 | struct net_device *dev; | 868 | struct net_device *dev; |
865 | struct tun_file *tfile = file->private_data; | ||
866 | int err; | 869 | int err; |
867 | 870 | ||
868 | dev = __dev_get_by_name(net, ifr->ifr_name); | 871 | dev = __dev_get_by_name(net, ifr->ifr_name); |
@@ -920,13 +923,10 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
920 | if (!sk) | 923 | if (!sk) |
921 | goto err_free_dev; | 924 | goto err_free_dev; |
922 | 925 | ||
923 | /* This ref count is for tun->sk. */ | 926 | init_waitqueue_head(&tun->socket.wait); |
924 | dev_hold(dev); | ||
925 | sock_init_data(&tun->socket, sk); | 927 | sock_init_data(&tun->socket, sk); |
926 | sk->sk_write_space = tun_sock_write_space; | 928 | sk->sk_write_space = tun_sock_write_space; |
927 | sk->sk_destruct = tun_sock_destruct; | ||
928 | sk->sk_sndbuf = INT_MAX; | 929 | sk->sk_sndbuf = INT_MAX; |
929 | sk->sk_sleep = &tfile->read_wait; | ||
930 | 930 | ||
931 | tun->sk = sk; | 931 | tun->sk = sk; |
932 | container_of(sk, struct tun_sock, sk)->tun = tun; | 932 | container_of(sk, struct tun_sock, sk)->tun = tun; |
@@ -942,11 +942,13 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
942 | err = -EINVAL; | 942 | err = -EINVAL; |
943 | err = register_netdevice(tun->dev); | 943 | err = register_netdevice(tun->dev); |
944 | if (err < 0) | 944 | if (err < 0) |
945 | goto err_free_dev; | 945 | goto err_free_sk; |
946 | |||
947 | sk->sk_destruct = tun_sock_destruct; | ||
946 | 948 | ||
947 | err = tun_attach(tun, file); | 949 | err = tun_attach(tun, file); |
948 | if (err < 0) | 950 | if (err < 0) |
949 | goto err_free_dev; | 951 | goto failed; |
950 | } | 952 | } |
951 | 953 | ||
952 | DBG(KERN_INFO "%s: tun_set_iff\n", tun->dev->name); | 954 | DBG(KERN_INFO "%s: tun_set_iff\n", tun->dev->name); |
@@ -1266,7 +1268,6 @@ static int tun_chr_open(struct inode *inode, struct file * file) | |||
1266 | atomic_set(&tfile->count, 0); | 1268 | atomic_set(&tfile->count, 0); |
1267 | tfile->tun = NULL; | 1269 | tfile->tun = NULL; |
1268 | tfile->net = get_net(current->nsproxy->net_ns); | 1270 | tfile->net = get_net(current->nsproxy->net_ns); |
1269 | init_waitqueue_head(&tfile->read_wait); | ||
1270 | file->private_data = tfile; | 1271 | file->private_data = tfile; |
1271 | return 0; | 1272 | return 0; |
1272 | } | 1273 | } |
@@ -1284,14 +1285,16 @@ static int tun_chr_close(struct inode *inode, struct file *file) | |||
1284 | __tun_detach(tun); | 1285 | __tun_detach(tun); |
1285 | 1286 | ||
1286 | /* If desireable, unregister the netdevice. */ | 1287 | /* If desireable, unregister the netdevice. */ |
1287 | if (!(tun->flags & TUN_PERSIST)) { | 1288 | if (!(tun->flags & TUN_PERSIST)) |
1288 | sock_put(tun->sk); | ||
1289 | unregister_netdevice(tun->dev); | 1289 | unregister_netdevice(tun->dev); |
1290 | } | ||
1291 | 1290 | ||
1292 | rtnl_unlock(); | 1291 | rtnl_unlock(); |
1293 | } | 1292 | } |
1294 | 1293 | ||
1294 | tun = tfile->tun; | ||
1295 | if (tun) | ||
1296 | sock_put(tun->sk); | ||
1297 | |||
1295 | put_net(tfile->net); | 1298 | put_net(tfile->net); |
1296 | kfree(tfile); | 1299 | kfree(tfile); |
1297 | 1300 | ||
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index d3f39e86eb95..44f8392da117 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
@@ -1394,7 +1394,8 @@ static int adjust_enet_interface(struct ucc_geth_private *ugeth) | |||
1394 | (ugeth->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) || | 1394 | (ugeth->phy_interface == PHY_INTERFACE_MODE_RGMII_RXID) || |
1395 | (ugeth->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) || | 1395 | (ugeth->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID) || |
1396 | (ugeth->phy_interface == PHY_INTERFACE_MODE_RTBI)) { | 1396 | (ugeth->phy_interface == PHY_INTERFACE_MODE_RTBI)) { |
1397 | upsmr |= UCC_GETH_UPSMR_RPM; | 1397 | if (ugeth->phy_interface != PHY_INTERFACE_MODE_RMII) |
1398 | upsmr |= UCC_GETH_UPSMR_RPM; | ||
1398 | switch (ugeth->max_speed) { | 1399 | switch (ugeth->max_speed) { |
1399 | case SPEED_10: | 1400 | case SPEED_10: |
1400 | upsmr |= UCC_GETH_UPSMR_R10M; | 1401 | upsmr |= UCC_GETH_UPSMR_R10M; |
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index a8228d87c8cf..2138535f2339 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c | |||
@@ -899,6 +899,7 @@ static int pegasus_start_xmit(struct sk_buff *skb, struct net_device *net) | |||
899 | /* cleanup should already have been scheduled */ | 899 | /* cleanup should already have been scheduled */ |
900 | break; | 900 | break; |
901 | case -ENODEV: /* disconnect() upcoming */ | 901 | case -ENODEV: /* disconnect() upcoming */ |
902 | case -EPERM: | ||
902 | netif_device_detach(pegasus->net); | 903 | netif_device_detach(pegasus->net); |
903 | break; | 904 | break; |
904 | default: | 905 | default: |
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index f21a6171c691..c36d3a3d655f 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -6713,11 +6713,11 @@ static int airo_set_auth(struct net_device *dev, | |||
6713 | local->config.authType = AUTH_ENCRYPT; | 6713 | local->config.authType = AUTH_ENCRYPT; |
6714 | } else | 6714 | } else |
6715 | return -EINVAL; | 6715 | return -EINVAL; |
6716 | break; | ||
6717 | 6716 | ||
6718 | /* Commit the changes to flags if needed */ | 6717 | /* Commit the changes to flags if needed */ |
6719 | if (local->config.authType != currentAuthType) | 6718 | if (local->config.authType != currentAuthType) |
6720 | set_bit (FLAG_COMMIT, &local->flags); | 6719 | set_bit (FLAG_COMMIT, &local->flags); |
6720 | break; | ||
6721 | } | 6721 | } |
6722 | 6722 | ||
6723 | case IW_AUTH_WPA_ENABLED: | 6723 | case IW_AUTH_WPA_ENABLED: |
diff --git a/drivers/net/wireless/ar9170/hw.h b/drivers/net/wireless/ar9170/hw.h index 13091bd9d815..53e250a4278f 100644 --- a/drivers/net/wireless/ar9170/hw.h +++ b/drivers/net/wireless/ar9170/hw.h | |||
@@ -310,7 +310,7 @@ struct ar9170_tx_control { | |||
310 | 310 | ||
311 | struct ar9170_rx_head { | 311 | struct ar9170_rx_head { |
312 | u8 plcp[12]; | 312 | u8 plcp[12]; |
313 | }; | 313 | } __packed; |
314 | 314 | ||
315 | struct ar9170_rx_tail { | 315 | struct ar9170_rx_tail { |
316 | union { | 316 | union { |
@@ -318,16 +318,16 @@ struct ar9170_rx_tail { | |||
318 | u8 rssi_ant0, rssi_ant1, rssi_ant2, | 318 | u8 rssi_ant0, rssi_ant1, rssi_ant2, |
319 | rssi_ant0x, rssi_ant1x, rssi_ant2x, | 319 | rssi_ant0x, rssi_ant1x, rssi_ant2x, |
320 | rssi_combined; | 320 | rssi_combined; |
321 | }; | 321 | } __packed; |
322 | u8 rssi[7]; | 322 | u8 rssi[7]; |
323 | }; | 323 | } __packed; |
324 | 324 | ||
325 | u8 evm_stream0[6], evm_stream1[6]; | 325 | u8 evm_stream0[6], evm_stream1[6]; |
326 | u8 phy_err; | 326 | u8 phy_err; |
327 | u8 SAidx, DAidx; | 327 | u8 SAidx, DAidx; |
328 | u8 error; | 328 | u8 error; |
329 | u8 status; | 329 | u8 status; |
330 | }; | 330 | } __packed; |
331 | 331 | ||
332 | #define AR9170_ENC_ALG_NONE 0x0 | 332 | #define AR9170_ENC_ALG_NONE 0x0 |
333 | #define AR9170_ENC_ALG_WEP64 0x1 | 333 | #define AR9170_ENC_ALG_WEP64 0x1 |
diff --git a/drivers/net/wireless/ar9170/usb.c b/drivers/net/wireless/ar9170/usb.c index ad296840893e..fddda477095c 100644 --- a/drivers/net/wireless/ar9170/usb.c +++ b/drivers/net/wireless/ar9170/usb.c | |||
@@ -59,6 +59,8 @@ static struct usb_device_id ar9170_usb_ids[] = { | |||
59 | { USB_DEVICE(0x0cf3, 0x9170) }, | 59 | { USB_DEVICE(0x0cf3, 0x9170) }, |
60 | /* Atheros TG121N */ | 60 | /* Atheros TG121N */ |
61 | { USB_DEVICE(0x0cf3, 0x1001) }, | 61 | { USB_DEVICE(0x0cf3, 0x1001) }, |
62 | /* Cace Airpcap NX */ | ||
63 | { USB_DEVICE(0xcace, 0x0300) }, | ||
62 | /* D-Link DWA 160A */ | 64 | /* D-Link DWA 160A */ |
63 | { USB_DEVICE(0x07d1, 0x3c10) }, | 65 | { USB_DEVICE(0x07d1, 0x3c10) }, |
64 | /* Netgear WNDA3100 */ | 66 | /* Netgear WNDA3100 */ |
@@ -67,6 +69,8 @@ static struct usb_device_id ar9170_usb_ids[] = { | |||
67 | { USB_DEVICE(0x0846, 0x9001) }, | 69 | { USB_DEVICE(0x0846, 0x9001) }, |
68 | /* Zydas ZD1221 */ | 70 | /* Zydas ZD1221 */ |
69 | { USB_DEVICE(0x0ace, 0x1221) }, | 71 | { USB_DEVICE(0x0ace, 0x1221) }, |
72 | /* ZyXEL NWD271N */ | ||
73 | { USB_DEVICE(0x0586, 0x3417) }, | ||
70 | /* Z-Com UB81 BG */ | 74 | /* Z-Com UB81 BG */ |
71 | { USB_DEVICE(0x0cde, 0x0023) }, | 75 | { USB_DEVICE(0x0cde, 0x0023) }, |
72 | /* Z-Com UB82 ABG */ | 76 | /* Z-Com UB82 ABG */ |
@@ -619,6 +623,39 @@ static int ar9170_usb_open(struct ar9170 *ar) | |||
619 | return 0; | 623 | return 0; |
620 | } | 624 | } |
621 | 625 | ||
626 | static int ar9170_usb_init_device(struct ar9170_usb *aru) | ||
627 | { | ||
628 | int err; | ||
629 | |||
630 | err = ar9170_usb_alloc_rx_irq_urb(aru); | ||
631 | if (err) | ||
632 | goto err_out; | ||
633 | |||
634 | err = ar9170_usb_alloc_rx_bulk_urbs(aru); | ||
635 | if (err) | ||
636 | goto err_unrx; | ||
637 | |||
638 | err = ar9170_usb_upload_firmware(aru); | ||
639 | if (err) { | ||
640 | err = ar9170_echo_test(&aru->common, 0x60d43110); | ||
641 | if (err) { | ||
642 | /* force user invention, by disabling the device */ | ||
643 | err = usb_driver_set_configuration(aru->udev, -1); | ||
644 | dev_err(&aru->udev->dev, "device is in a bad state. " | ||
645 | "please reconnect it!\n"); | ||
646 | goto err_unrx; | ||
647 | } | ||
648 | } | ||
649 | |||
650 | return 0; | ||
651 | |||
652 | err_unrx: | ||
653 | ar9170_usb_cancel_urbs(aru); | ||
654 | |||
655 | err_out: | ||
656 | return err; | ||
657 | } | ||
658 | |||
622 | static int ar9170_usb_probe(struct usb_interface *intf, | 659 | static int ar9170_usb_probe(struct usb_interface *intf, |
623 | const struct usb_device_id *id) | 660 | const struct usb_device_id *id) |
624 | { | 661 | { |
@@ -654,32 +691,16 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
654 | 691 | ||
655 | err = ar9170_usb_reset(aru); | 692 | err = ar9170_usb_reset(aru); |
656 | if (err) | 693 | if (err) |
657 | goto err_unlock; | 694 | goto err_freehw; |
658 | 695 | ||
659 | err = ar9170_usb_request_firmware(aru); | 696 | err = ar9170_usb_request_firmware(aru); |
660 | if (err) | 697 | if (err) |
661 | goto err_unlock; | 698 | goto err_freehw; |
662 | 699 | ||
663 | err = ar9170_usb_alloc_rx_irq_urb(aru); | 700 | err = ar9170_usb_init_device(aru); |
664 | if (err) | 701 | if (err) |
665 | goto err_freefw; | 702 | goto err_freefw; |
666 | 703 | ||
667 | err = ar9170_usb_alloc_rx_bulk_urbs(aru); | ||
668 | if (err) | ||
669 | goto err_unrx; | ||
670 | |||
671 | err = ar9170_usb_upload_firmware(aru); | ||
672 | if (err) { | ||
673 | err = ar9170_echo_test(&aru->common, 0x60d43110); | ||
674 | if (err) { | ||
675 | /* force user invention, by disabling the device */ | ||
676 | err = usb_driver_set_configuration(aru->udev, -1); | ||
677 | dev_err(&aru->udev->dev, "device is in a bad state. " | ||
678 | "please reconnect it!\n"); | ||
679 | goto err_unrx; | ||
680 | } | ||
681 | } | ||
682 | |||
683 | err = ar9170_usb_open(ar); | 704 | err = ar9170_usb_open(ar); |
684 | if (err) | 705 | if (err) |
685 | goto err_unrx; | 706 | goto err_unrx; |
@@ -699,7 +720,7 @@ err_freefw: | |||
699 | release_firmware(aru->init_values); | 720 | release_firmware(aru->init_values); |
700 | release_firmware(aru->firmware); | 721 | release_firmware(aru->firmware); |
701 | 722 | ||
702 | err_unlock: | 723 | err_freehw: |
703 | usb_set_intfdata(intf, NULL); | 724 | usb_set_intfdata(intf, NULL); |
704 | usb_put_dev(udev); | 725 | usb_put_dev(udev); |
705 | ieee80211_free_hw(ar->hw); | 726 | ieee80211_free_hw(ar->hw); |
@@ -726,12 +747,65 @@ static void ar9170_usb_disconnect(struct usb_interface *intf) | |||
726 | ieee80211_free_hw(aru->common.hw); | 747 | ieee80211_free_hw(aru->common.hw); |
727 | } | 748 | } |
728 | 749 | ||
750 | #ifdef CONFIG_PM | ||
751 | static int ar9170_suspend(struct usb_interface *intf, | ||
752 | pm_message_t message) | ||
753 | { | ||
754 | struct ar9170_usb *aru = usb_get_intfdata(intf); | ||
755 | |||
756 | if (!aru) | ||
757 | return -ENODEV; | ||
758 | |||
759 | aru->common.state = AR9170_IDLE; | ||
760 | ar9170_usb_cancel_urbs(aru); | ||
761 | |||
762 | return 0; | ||
763 | } | ||
764 | |||
765 | static int ar9170_resume(struct usb_interface *intf) | ||
766 | { | ||
767 | struct ar9170_usb *aru = usb_get_intfdata(intf); | ||
768 | int err; | ||
769 | |||
770 | if (!aru) | ||
771 | return -ENODEV; | ||
772 | |||
773 | usb_unpoison_anchored_urbs(&aru->rx_submitted); | ||
774 | usb_unpoison_anchored_urbs(&aru->tx_submitted); | ||
775 | |||
776 | /* | ||
777 | * FIXME: firmware upload will fail on resume. | ||
778 | * but this is better than a hang! | ||
779 | */ | ||
780 | |||
781 | err = ar9170_usb_init_device(aru); | ||
782 | if (err) | ||
783 | goto err_unrx; | ||
784 | |||
785 | err = ar9170_usb_open(&aru->common); | ||
786 | if (err) | ||
787 | goto err_unrx; | ||
788 | |||
789 | return 0; | ||
790 | |||
791 | err_unrx: | ||
792 | aru->common.state = AR9170_IDLE; | ||
793 | ar9170_usb_cancel_urbs(aru); | ||
794 | |||
795 | return err; | ||
796 | } | ||
797 | #endif /* CONFIG_PM */ | ||
798 | |||
729 | static struct usb_driver ar9170_driver = { | 799 | static struct usb_driver ar9170_driver = { |
730 | .name = "ar9170usb", | 800 | .name = "ar9170usb", |
731 | .probe = ar9170_usb_probe, | 801 | .probe = ar9170_usb_probe, |
732 | .disconnect = ar9170_usb_disconnect, | 802 | .disconnect = ar9170_usb_disconnect, |
733 | .id_table = ar9170_usb_ids, | 803 | .id_table = ar9170_usb_ids, |
734 | .soft_unbind = 1, | 804 | .soft_unbind = 1, |
805 | #ifdef CONFIG_PM | ||
806 | .suspend = ar9170_suspend, | ||
807 | .resume = ar9170_resume, | ||
808 | #endif /* CONFIG_PM */ | ||
735 | }; | 809 | }; |
736 | 810 | ||
737 | static int __init ar9170_init(void) | 811 | static int __init ar9170_init(void) |
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c index 0c02f1c2bd94..744f4f4dd3d1 100644 --- a/drivers/net/wireless/at76c50x-usb.c +++ b/drivers/net/wireless/at76c50x-usb.c | |||
@@ -250,6 +250,8 @@ static struct usb_device_id dev_table[] = { | |||
250 | { USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A) }, | 250 | { USB_DEVICE(0x03eb, 0x7617), USB_DEVICE_DATA(BOARD_505A) }, |
251 | /* Siemens Gigaset USB WLAN Adapter 11 */ | 251 | /* Siemens Gigaset USB WLAN Adapter 11 */ |
252 | { USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A) }, | 252 | { USB_DEVICE(0x1690, 0x0701), USB_DEVICE_DATA(BOARD_505A) }, |
253 | /* OQO Model 01+ Internal Wi-Fi */ | ||
254 | { USB_DEVICE(0x1557, 0x0002), USB_DEVICE_DATA(BOARD_505A) }, | ||
253 | /* | 255 | /* |
254 | * at76c505amx-rfmd | 256 | * at76c505amx-rfmd |
255 | */ | 257 | */ |
diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c index 71cb18d6757d..dd1f30156740 100644 --- a/drivers/net/wireless/ath9k/recv.c +++ b/drivers/net/wireless/ath9k/recv.c | |||
@@ -493,6 +493,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
493 | int hdrlen, padsize, retval; | 493 | int hdrlen, padsize, retval; |
494 | bool decrypt_error = false; | 494 | bool decrypt_error = false; |
495 | u8 keyix; | 495 | u8 keyix; |
496 | __le16 fc; | ||
496 | 497 | ||
497 | spin_lock_bh(&sc->rx.rxbuflock); | 498 | spin_lock_bh(&sc->rx.rxbuflock); |
498 | 499 | ||
@@ -606,6 +607,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
606 | /* see if any padding is done by the hw and remove it */ | 607 | /* see if any padding is done by the hw and remove it */ |
607 | hdr = (struct ieee80211_hdr *)skb->data; | 608 | hdr = (struct ieee80211_hdr *)skb->data; |
608 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); | 609 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); |
610 | fc = hdr->frame_control; | ||
609 | 611 | ||
610 | /* The MAC header is padded to have 32-bit boundary if the | 612 | /* The MAC header is padded to have 32-bit boundary if the |
611 | * packet payload is non-zero. The general calculation for | 613 | * packet payload is non-zero. The general calculation for |
@@ -690,7 +692,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
690 | sc->rx.rxotherant = 0; | 692 | sc->rx.rxotherant = 0; |
691 | } | 693 | } |
692 | 694 | ||
693 | if (ieee80211_is_beacon(hdr->frame_control) && | 695 | if (ieee80211_is_beacon(fc) && |
694 | (sc->sc_flags & SC_OP_WAIT_FOR_BEACON)) { | 696 | (sc->sc_flags & SC_OP_WAIT_FOR_BEACON)) { |
695 | sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON; | 697 | sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON; |
696 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP); | 698 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_NETWORK_SLEEP); |
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index 857d84148b1d..27eef8fb7107 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c | |||
@@ -1502,7 +1502,6 @@ static const struct net_device_ops atmel_netdev_ops = { | |||
1502 | .ndo_set_mac_address = atmel_set_mac_address, | 1502 | .ndo_set_mac_address = atmel_set_mac_address, |
1503 | .ndo_start_xmit = start_tx, | 1503 | .ndo_start_xmit = start_tx, |
1504 | .ndo_do_ioctl = atmel_ioctl, | 1504 | .ndo_do_ioctl = atmel_ioctl, |
1505 | .ndo_change_mtu = eth_change_mtu, | ||
1506 | .ndo_validate_addr = eth_validate_addr, | 1505 | .ndo_validate_addr = eth_validate_addr, |
1507 | }; | 1506 | }; |
1508 | 1507 | ||
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index e228c1de6e11..eae680b53052 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
@@ -555,11 +555,32 @@ address_error: | |||
555 | return 1; | 555 | return 1; |
556 | } | 556 | } |
557 | 557 | ||
558 | static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb) | ||
559 | { | ||
560 | unsigned char *f = skb->data + ring->frameoffset; | ||
561 | |||
562 | return ((f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]) == 0xFF); | ||
563 | } | ||
564 | |||
565 | static void b43_poison_rx_buffer(struct b43_dmaring *ring, struct sk_buff *skb) | ||
566 | { | ||
567 | struct b43_rxhdr_fw4 *rxhdr; | ||
568 | unsigned char *frame; | ||
569 | |||
570 | /* This poisons the RX buffer to detect DMA failures. */ | ||
571 | |||
572 | rxhdr = (struct b43_rxhdr_fw4 *)(skb->data); | ||
573 | rxhdr->frame_len = 0; | ||
574 | |||
575 | B43_WARN_ON(ring->rx_buffersize < ring->frameoffset + sizeof(struct b43_plcp_hdr6) + 2); | ||
576 | frame = skb->data + ring->frameoffset; | ||
577 | memset(frame, 0xFF, sizeof(struct b43_plcp_hdr6) + 2 /* padding */); | ||
578 | } | ||
579 | |||
558 | static int setup_rx_descbuffer(struct b43_dmaring *ring, | 580 | static int setup_rx_descbuffer(struct b43_dmaring *ring, |
559 | struct b43_dmadesc_generic *desc, | 581 | struct b43_dmadesc_generic *desc, |
560 | struct b43_dmadesc_meta *meta, gfp_t gfp_flags) | 582 | struct b43_dmadesc_meta *meta, gfp_t gfp_flags) |
561 | { | 583 | { |
562 | struct b43_rxhdr_fw4 *rxhdr; | ||
563 | dma_addr_t dmaaddr; | 584 | dma_addr_t dmaaddr; |
564 | struct sk_buff *skb; | 585 | struct sk_buff *skb; |
565 | 586 | ||
@@ -568,6 +589,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring, | |||
568 | skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); | 589 | skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); |
569 | if (unlikely(!skb)) | 590 | if (unlikely(!skb)) |
570 | return -ENOMEM; | 591 | return -ENOMEM; |
592 | b43_poison_rx_buffer(ring, skb); | ||
571 | dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0); | 593 | dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0); |
572 | if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { | 594 | if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { |
573 | /* ugh. try to realloc in zone_dma */ | 595 | /* ugh. try to realloc in zone_dma */ |
@@ -578,6 +600,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring, | |||
578 | skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); | 600 | skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags); |
579 | if (unlikely(!skb)) | 601 | if (unlikely(!skb)) |
580 | return -ENOMEM; | 602 | return -ENOMEM; |
603 | b43_poison_rx_buffer(ring, skb); | ||
581 | dmaaddr = map_descbuffer(ring, skb->data, | 604 | dmaaddr = map_descbuffer(ring, skb->data, |
582 | ring->rx_buffersize, 0); | 605 | ring->rx_buffersize, 0); |
583 | if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { | 606 | if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { |
@@ -592,9 +615,6 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring, | |||
592 | ring->ops->fill_descriptor(ring, desc, dmaaddr, | 615 | ring->ops->fill_descriptor(ring, desc, dmaaddr, |
593 | ring->rx_buffersize, 0, 0, 0); | 616 | ring->rx_buffersize, 0, 0, 0); |
594 | 617 | ||
595 | rxhdr = (struct b43_rxhdr_fw4 *)(skb->data); | ||
596 | rxhdr->frame_len = 0; | ||
597 | |||
598 | return 0; | 618 | return 0; |
599 | } | 619 | } |
600 | 620 | ||
@@ -1483,12 +1503,17 @@ static void dma_rx(struct b43_dmaring *ring, int *slot) | |||
1483 | len = le16_to_cpu(rxhdr->frame_len); | 1503 | len = le16_to_cpu(rxhdr->frame_len); |
1484 | } while (len == 0 && i++ < 5); | 1504 | } while (len == 0 && i++ < 5); |
1485 | if (unlikely(len == 0)) { | 1505 | if (unlikely(len == 0)) { |
1486 | /* recycle the descriptor buffer. */ | 1506 | dmaaddr = meta->dmaaddr; |
1487 | sync_descbuffer_for_device(ring, meta->dmaaddr, | 1507 | goto drop_recycle_buffer; |
1488 | ring->rx_buffersize); | ||
1489 | goto drop; | ||
1490 | } | 1508 | } |
1491 | } | 1509 | } |
1510 | if (unlikely(b43_rx_buffer_is_poisoned(ring, skb))) { | ||
1511 | /* Something went wrong with the DMA. | ||
1512 | * The device did not touch the buffer and did not overwrite the poison. */ | ||
1513 | b43dbg(ring->dev->wl, "DMA RX: Dropping poisoned buffer.\n"); | ||
1514 | dmaaddr = meta->dmaaddr; | ||
1515 | goto drop_recycle_buffer; | ||
1516 | } | ||
1492 | if (unlikely(len > ring->rx_buffersize)) { | 1517 | if (unlikely(len > ring->rx_buffersize)) { |
1493 | /* The data did not fit into one descriptor buffer | 1518 | /* The data did not fit into one descriptor buffer |
1494 | * and is split over multiple buffers. | 1519 | * and is split over multiple buffers. |
@@ -1501,6 +1526,7 @@ static void dma_rx(struct b43_dmaring *ring, int *slot) | |||
1501 | while (1) { | 1526 | while (1) { |
1502 | desc = ops->idx2desc(ring, *slot, &meta); | 1527 | desc = ops->idx2desc(ring, *slot, &meta); |
1503 | /* recycle the descriptor buffer. */ | 1528 | /* recycle the descriptor buffer. */ |
1529 | b43_poison_rx_buffer(ring, meta->skb); | ||
1504 | sync_descbuffer_for_device(ring, meta->dmaaddr, | 1530 | sync_descbuffer_for_device(ring, meta->dmaaddr, |
1505 | ring->rx_buffersize); | 1531 | ring->rx_buffersize); |
1506 | *slot = next_slot(ring, *slot); | 1532 | *slot = next_slot(ring, *slot); |
@@ -1519,8 +1545,7 @@ static void dma_rx(struct b43_dmaring *ring, int *slot) | |||
1519 | err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC); | 1545 | err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC); |
1520 | if (unlikely(err)) { | 1546 | if (unlikely(err)) { |
1521 | b43dbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer() failed\n"); | 1547 | b43dbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer() failed\n"); |
1522 | sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize); | 1548 | goto drop_recycle_buffer; |
1523 | goto drop; | ||
1524 | } | 1549 | } |
1525 | 1550 | ||
1526 | unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0); | 1551 | unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0); |
@@ -1530,6 +1555,11 @@ static void dma_rx(struct b43_dmaring *ring, int *slot) | |||
1530 | b43_rx(ring->dev, skb, rxhdr); | 1555 | b43_rx(ring->dev, skb, rxhdr); |
1531 | drop: | 1556 | drop: |
1532 | return; | 1557 | return; |
1558 | |||
1559 | drop_recycle_buffer: | ||
1560 | /* Poison and recycle the RX buffer. */ | ||
1561 | b43_poison_rx_buffer(ring, skb); | ||
1562 | sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize); | ||
1533 | } | 1563 | } |
1534 | 1564 | ||
1535 | void b43_dma_rx(struct b43_dmaring *ring) | 1565 | void b43_dma_rx(struct b43_dmaring *ring) |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 4896e0831114..79b685e300c7 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -3974,6 +3974,11 @@ static void setup_struct_phy_for_init(struct b43_wldev *dev, | |||
3974 | phy->next_txpwr_check_time = jiffies; | 3974 | phy->next_txpwr_check_time = jiffies; |
3975 | /* PHY TX errors counter. */ | 3975 | /* PHY TX errors counter. */ |
3976 | atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT); | 3976 | atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT); |
3977 | |||
3978 | #if B43_DEBUG | ||
3979 | phy->phy_locked = 0; | ||
3980 | phy->radio_locked = 0; | ||
3981 | #endif | ||
3977 | } | 3982 | } |
3978 | 3983 | ||
3979 | static void setup_struct_wldev_for_init(struct b43_wldev *dev) | 3984 | static void setup_struct_wldev_for_init(struct b43_wldev *dev) |
diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c index 026b61c03fb9..e176b6e0d9cf 100644 --- a/drivers/net/wireless/b43/phy_common.c +++ b/drivers/net/wireless/b43/phy_common.c | |||
@@ -131,12 +131,16 @@ void b43_radio_lock(struct b43_wldev *dev) | |||
131 | { | 131 | { |
132 | u32 macctl; | 132 | u32 macctl; |
133 | 133 | ||
134 | #if B43_DEBUG | ||
135 | B43_WARN_ON(dev->phy.radio_locked); | ||
136 | dev->phy.radio_locked = 1; | ||
137 | #endif | ||
138 | |||
134 | macctl = b43_read32(dev, B43_MMIO_MACCTL); | 139 | macctl = b43_read32(dev, B43_MMIO_MACCTL); |
135 | B43_WARN_ON(macctl & B43_MACCTL_RADIOLOCK); | ||
136 | macctl |= B43_MACCTL_RADIOLOCK; | 140 | macctl |= B43_MACCTL_RADIOLOCK; |
137 | b43_write32(dev, B43_MMIO_MACCTL, macctl); | 141 | b43_write32(dev, B43_MMIO_MACCTL, macctl); |
138 | /* Commit the write and wait for the device | 142 | /* Commit the write and wait for the firmware |
139 | * to exit any radio register access. */ | 143 | * to finish any radio register access. */ |
140 | b43_read32(dev, B43_MMIO_MACCTL); | 144 | b43_read32(dev, B43_MMIO_MACCTL); |
141 | udelay(10); | 145 | udelay(10); |
142 | } | 146 | } |
@@ -145,11 +149,15 @@ void b43_radio_unlock(struct b43_wldev *dev) | |||
145 | { | 149 | { |
146 | u32 macctl; | 150 | u32 macctl; |
147 | 151 | ||
152 | #if B43_DEBUG | ||
153 | B43_WARN_ON(!dev->phy.radio_locked); | ||
154 | dev->phy.radio_locked = 0; | ||
155 | #endif | ||
156 | |||
148 | /* Commit any write */ | 157 | /* Commit any write */ |
149 | b43_read16(dev, B43_MMIO_PHY_VER); | 158 | b43_read16(dev, B43_MMIO_PHY_VER); |
150 | /* unlock */ | 159 | /* unlock */ |
151 | macctl = b43_read32(dev, B43_MMIO_MACCTL); | 160 | macctl = b43_read32(dev, B43_MMIO_MACCTL); |
152 | B43_WARN_ON(!(macctl & B43_MACCTL_RADIOLOCK)); | ||
153 | macctl &= ~B43_MACCTL_RADIOLOCK; | 161 | macctl &= ~B43_MACCTL_RADIOLOCK; |
154 | b43_write32(dev, B43_MMIO_MACCTL, macctl); | 162 | b43_write32(dev, B43_MMIO_MACCTL, macctl); |
155 | } | 163 | } |
diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h index c9f5430d1d7d..b2d99101947b 100644 --- a/drivers/net/wireless/b43/phy_common.h +++ b/drivers/net/wireless/b43/phy_common.h | |||
@@ -245,8 +245,10 @@ struct b43_phy { | |||
245 | atomic_t txerr_cnt; | 245 | atomic_t txerr_cnt; |
246 | 246 | ||
247 | #ifdef CONFIG_B43_DEBUG | 247 | #ifdef CONFIG_B43_DEBUG |
248 | /* PHY registers locked by b43_phy_lock()? */ | 248 | /* PHY registers locked (w.r.t. firmware) */ |
249 | bool phy_locked; | 249 | bool phy_locked; |
250 | /* Radio registers locked (w.r.t. firmware) */ | ||
251 | bool radio_locked; | ||
250 | #endif /* B43_DEBUG */ | 252 | #endif /* B43_DEBUG */ |
251 | }; | 253 | }; |
252 | 254 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 2399328e8de7..527525cc0919 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -1192,7 +1192,7 @@ int iwl3945_hw_nic_init(struct iwl_priv *priv) | |||
1192 | return -ENOMEM; | 1192 | return -ENOMEM; |
1193 | } | 1193 | } |
1194 | } else | 1194 | } else |
1195 | iwl_rx_queue_reset(priv, rxq); | 1195 | iwl3945_rx_queue_reset(priv, rxq); |
1196 | 1196 | ||
1197 | iwl3945_rx_replenish(priv); | 1197 | iwl3945_rx_replenish(priv); |
1198 | 1198 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index ab7aaf6872c7..55188844657b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
@@ -215,6 +215,7 @@ extern int iwl3945_calc_sig_qual(int rssi_dbm, int noise_dbm); | |||
215 | extern int iwl3945_tx_queue_init(struct iwl_priv *priv, | 215 | extern int iwl3945_tx_queue_init(struct iwl_priv *priv, |
216 | struct iwl_tx_queue *txq, int count, u32 id); | 216 | struct iwl_tx_queue *txq, int count, u32 id); |
217 | extern void iwl3945_rx_replenish(void *data); | 217 | extern void iwl3945_rx_replenish(void *data); |
218 | extern void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq); | ||
218 | extern void iwl3945_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq); | 219 | extern void iwl3945_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq); |
219 | extern int iwl3945_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len, | 220 | extern int iwl3945_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len, |
220 | const void *data); | 221 | const void *data); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 3889158b359c..1ef4192207a5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -976,11 +976,9 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
976 | 976 | ||
977 | rxq->queue[i] = NULL; | 977 | rxq->queue[i] = NULL; |
978 | 978 | ||
979 | dma_sync_single_range_for_cpu( | 979 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, |
980 | &priv->pci_dev->dev, rxb->real_dma_addr, | 980 | priv->hw_params.rx_buf_size + 256, |
981 | rxb->aligned_dma_addr - rxb->real_dma_addr, | 981 | PCI_DMA_FROMDEVICE); |
982 | priv->hw_params.rx_buf_size, | ||
983 | PCI_DMA_FROMDEVICE); | ||
984 | pkt = (struct iwl_rx_packet *)rxb->skb->data; | 982 | pkt = (struct iwl_rx_packet *)rxb->skb->data; |
985 | 983 | ||
986 | /* Reclaim a command buffer only if this packet is a response | 984 | /* Reclaim a command buffer only if this packet is a response |
@@ -1031,9 +1029,6 @@ void iwl_rx_handle(struct iwl_priv *priv) | |||
1031 | rxb->skb = NULL; | 1029 | rxb->skb = NULL; |
1032 | } | 1030 | } |
1033 | 1031 | ||
1034 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, | ||
1035 | priv->hw_params.rx_buf_size + 256, | ||
1036 | PCI_DMA_FROMDEVICE); | ||
1037 | spin_lock_irqsave(&rxq->lock, flags); | 1032 | spin_lock_irqsave(&rxq->lock, flags); |
1038 | list_add_tail(&rxb->list, &priv->rxq.rx_used); | 1033 | list_add_tail(&rxb->list, &priv->rxq.rx_used); |
1039 | spin_unlock_irqrestore(&rxq->lock, flags); | 1034 | spin_unlock_irqrestore(&rxq->lock, flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h index 2f1242447b3b..6e983149b83b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-csr.h +++ b/drivers/net/wireless/iwlwifi/iwl-csr.h | |||
@@ -223,7 +223,7 @@ | |||
223 | #define CSR_EEPROM_REG_MSK_DATA (0xFFFF0000) | 223 | #define CSR_EEPROM_REG_MSK_DATA (0xFFFF0000) |
224 | 224 | ||
225 | /* EEPROM GP */ | 225 | /* EEPROM GP */ |
226 | #define CSR_EEPROM_GP_VALID_MSK (0x00000006) | 226 | #define CSR_EEPROM_GP_VALID_MSK (0x00000007) |
227 | #define CSR_EEPROM_GP_BAD_SIGNATURE (0x00000000) | 227 | #define CSR_EEPROM_GP_BAD_SIGNATURE (0x00000000) |
228 | #define CSR_EEPROM_GP_IF_OWNER_MSK (0x00000180) | 228 | #define CSR_EEPROM_GP_IF_OWNER_MSK (0x00000180) |
229 | 229 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index ec9a13846edd..cf7f0db58fcf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -360,12 +360,16 @@ struct iwl_host_cmd { | |||
360 | 360 | ||
361 | /** | 361 | /** |
362 | * struct iwl_rx_queue - Rx queue | 362 | * struct iwl_rx_queue - Rx queue |
363 | * @bd: driver's pointer to buffer of receive buffer descriptors (rbd) | ||
364 | * @dma_addr: bus address of buffer of receive buffer descriptors (rbd) | ||
363 | * @read: Shared index to newest available Rx buffer | 365 | * @read: Shared index to newest available Rx buffer |
364 | * @write: Shared index to oldest written Rx packet | 366 | * @write: Shared index to oldest written Rx packet |
365 | * @free_count: Number of pre-allocated buffers in rx_free | 367 | * @free_count: Number of pre-allocated buffers in rx_free |
366 | * @rx_free: list of free SKBs for use | 368 | * @rx_free: list of free SKBs for use |
367 | * @rx_used: List of Rx buffers with no SKB | 369 | * @rx_used: List of Rx buffers with no SKB |
368 | * @need_update: flag to indicate we need to update read/write index | 370 | * @need_update: flag to indicate we need to update read/write index |
371 | * @rb_stts: driver's pointer to receive buffer status | ||
372 | * @rb_stts_dma: bus address of receive buffer status | ||
369 | * | 373 | * |
370 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers | 374 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers |
371 | */ | 375 | */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 1f117a49c569..71d5b8a1a73e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -799,6 +799,22 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
799 | /* Copy MAC header from skb into command buffer */ | 799 | /* Copy MAC header from skb into command buffer */ |
800 | memcpy(tx_cmd->hdr, hdr, hdr_len); | 800 | memcpy(tx_cmd->hdr, hdr, hdr_len); |
801 | 801 | ||
802 | |||
803 | /* Total # bytes to be transmitted */ | ||
804 | len = (u16)skb->len; | ||
805 | tx_cmd->len = cpu_to_le16(len); | ||
806 | |||
807 | if (info->control.hw_key) | ||
808 | iwl_tx_cmd_build_hwcrypto(priv, info, tx_cmd, skb, sta_id); | ||
809 | |||
810 | /* TODO need this for burst mode later on */ | ||
811 | iwl_tx_cmd_build_basic(priv, tx_cmd, info, hdr, sta_id); | ||
812 | |||
813 | /* set is_hcca to 0; it probably will never be implemented */ | ||
814 | iwl_tx_cmd_build_rate(priv, tx_cmd, info, fc, sta_id, 0); | ||
815 | |||
816 | iwl_update_tx_stats(priv, le16_to_cpu(fc), len); | ||
817 | |||
802 | /* | 818 | /* |
803 | * Use the first empty entry in this queue's command buffer array | 819 | * Use the first empty entry in this queue's command buffer array |
804 | * to contain the Tx command and MAC header concatenated together | 820 | * to contain the Tx command and MAC header concatenated together |
@@ -819,21 +835,30 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
819 | else | 835 | else |
820 | len_org = 0; | 836 | len_org = 0; |
821 | 837 | ||
838 | /* Tell NIC about any 2-byte padding after MAC header */ | ||
839 | if (len_org) | ||
840 | tx_cmd->tx_flags |= TX_CMD_FLG_MH_PAD_MSK; | ||
841 | |||
822 | /* Physical address of this Tx command's header (not MAC header!), | 842 | /* Physical address of this Tx command's header (not MAC header!), |
823 | * within command buffer array. */ | 843 | * within command buffer array. */ |
824 | txcmd_phys = pci_map_single(priv->pci_dev, | 844 | txcmd_phys = pci_map_single(priv->pci_dev, |
825 | out_cmd, sizeof(struct iwl_cmd), | 845 | &out_cmd->hdr, len, |
826 | PCI_DMA_BIDIRECTIONAL); | 846 | PCI_DMA_BIDIRECTIONAL); |
827 | pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys); | 847 | pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys); |
828 | pci_unmap_len_set(&out_cmd->meta, len, sizeof(struct iwl_cmd)); | 848 | pci_unmap_len_set(&out_cmd->meta, len, len); |
829 | /* Add buffer containing Tx command and MAC(!) header to TFD's | 849 | /* Add buffer containing Tx command and MAC(!) header to TFD's |
830 | * first entry */ | 850 | * first entry */ |
831 | txcmd_phys += offsetof(struct iwl_cmd, hdr); | ||
832 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, | 851 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, |
833 | txcmd_phys, len, 1, 0); | 852 | txcmd_phys, len, 1, 0); |
834 | 853 | ||
835 | if (info->control.hw_key) | 854 | if (!ieee80211_has_morefrags(hdr->frame_control)) { |
836 | iwl_tx_cmd_build_hwcrypto(priv, info, tx_cmd, skb, sta_id); | 855 | txq->need_update = 1; |
856 | if (qc) | ||
857 | priv->stations[sta_id].tid[tid].seq_number = seq_number; | ||
858 | } else { | ||
859 | wait_write_ptr = 1; | ||
860 | txq->need_update = 0; | ||
861 | } | ||
837 | 862 | ||
838 | /* Set up TFD's 2nd entry to point directly to remainder of skb, | 863 | /* Set up TFD's 2nd entry to point directly to remainder of skb, |
839 | * if any (802.11 null frames have no payload). */ | 864 | * if any (802.11 null frames have no payload). */ |
@@ -846,41 +871,29 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
846 | 0, 0); | 871 | 0, 0); |
847 | } | 872 | } |
848 | 873 | ||
849 | /* Tell NIC about any 2-byte padding after MAC header */ | ||
850 | if (len_org) | ||
851 | tx_cmd->tx_flags |= TX_CMD_FLG_MH_PAD_MSK; | ||
852 | |||
853 | /* Total # bytes to be transmitted */ | ||
854 | len = (u16)skb->len; | ||
855 | tx_cmd->len = cpu_to_le16(len); | ||
856 | /* TODO need this for burst mode later on */ | ||
857 | iwl_tx_cmd_build_basic(priv, tx_cmd, info, hdr, sta_id); | ||
858 | |||
859 | /* set is_hcca to 0; it probably will never be implemented */ | ||
860 | iwl_tx_cmd_build_rate(priv, tx_cmd, info, fc, sta_id, 0); | ||
861 | |||
862 | iwl_update_tx_stats(priv, le16_to_cpu(fc), len); | ||
863 | |||
864 | scratch_phys = txcmd_phys + sizeof(struct iwl_cmd_header) + | 874 | scratch_phys = txcmd_phys + sizeof(struct iwl_cmd_header) + |
865 | offsetof(struct iwl_tx_cmd, scratch); | 875 | offsetof(struct iwl_tx_cmd, scratch); |
876 | |||
877 | len = sizeof(struct iwl_tx_cmd) + | ||
878 | sizeof(struct iwl_cmd_header) + hdr_len; | ||
879 | /* take back ownership of DMA buffer to enable update */ | ||
880 | pci_dma_sync_single_for_cpu(priv->pci_dev, txcmd_phys, | ||
881 | len, PCI_DMA_BIDIRECTIONAL); | ||
866 | tx_cmd->dram_lsb_ptr = cpu_to_le32(scratch_phys); | 882 | tx_cmd->dram_lsb_ptr = cpu_to_le32(scratch_phys); |
867 | tx_cmd->dram_msb_ptr = iwl_get_dma_hi_addr(scratch_phys); | 883 | tx_cmd->dram_msb_ptr = iwl_get_dma_hi_addr(scratch_phys); |
868 | 884 | ||
869 | if (!ieee80211_has_morefrags(hdr->frame_control)) { | 885 | IWL_DEBUG_TX(priv, "sequence nr = 0X%x \n", |
870 | txq->need_update = 1; | 886 | le16_to_cpu(out_cmd->hdr.sequence)); |
871 | if (qc) | 887 | IWL_DEBUG_TX(priv, "tx_flags = 0X%x \n", le32_to_cpu(tx_cmd->tx_flags)); |
872 | priv->stations[sta_id].tid[tid].seq_number = seq_number; | ||
873 | } else { | ||
874 | wait_write_ptr = 1; | ||
875 | txq->need_update = 0; | ||
876 | } | ||
877 | |||
878 | iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd, sizeof(*tx_cmd)); | 888 | iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd, sizeof(*tx_cmd)); |
879 | |||
880 | iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len); | 889 | iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx_cmd->hdr, hdr_len); |
881 | 890 | ||
882 | /* Set up entry for this TFD in Tx byte-count array */ | 891 | /* Set up entry for this TFD in Tx byte-count array */ |
883 | priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, len); | 892 | priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, |
893 | le16_to_cpu(tx_cmd->len)); | ||
894 | |||
895 | pci_dma_sync_single_for_device(priv->pci_dev, txcmd_phys, | ||
896 | len, PCI_DMA_BIDIRECTIONAL); | ||
884 | 897 | ||
885 | /* Tell device the write index *just past* this latest filled TFD */ | 898 | /* Tell device the write index *just past* this latest filled TFD */ |
886 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); | 899 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); |
@@ -968,18 +981,9 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
968 | INDEX_TO_SEQ(q->write_ptr)); | 981 | INDEX_TO_SEQ(q->write_ptr)); |
969 | if (out_cmd->meta.flags & CMD_SIZE_HUGE) | 982 | if (out_cmd->meta.flags & CMD_SIZE_HUGE) |
970 | out_cmd->hdr.sequence |= SEQ_HUGE_FRAME; | 983 | out_cmd->hdr.sequence |= SEQ_HUGE_FRAME; |
971 | len = (idx == TFD_CMD_SLOTS) ? | 984 | len = sizeof(struct iwl_cmd) - sizeof(struct iwl_cmd_meta); |
972 | IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd); | 985 | len += (idx == TFD_CMD_SLOTS) ? IWL_MAX_SCAN_SIZE : 0; |
973 | |||
974 | phys_addr = pci_map_single(priv->pci_dev, out_cmd, | ||
975 | len, PCI_DMA_BIDIRECTIONAL); | ||
976 | pci_unmap_addr_set(&out_cmd->meta, mapping, phys_addr); | ||
977 | pci_unmap_len_set(&out_cmd->meta, len, len); | ||
978 | phys_addr += offsetof(struct iwl_cmd, hdr); | ||
979 | 986 | ||
980 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, | ||
981 | phys_addr, fix_size, 1, | ||
982 | U32_PAD(cmd->len)); | ||
983 | 987 | ||
984 | #ifdef CONFIG_IWLWIFI_DEBUG | 988 | #ifdef CONFIG_IWLWIFI_DEBUG |
985 | switch (out_cmd->hdr.cmd) { | 989 | switch (out_cmd->hdr.cmd) { |
@@ -1007,6 +1011,15 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1007 | /* Set up entry in queue's byte count circular buffer */ | 1011 | /* Set up entry in queue's byte count circular buffer */ |
1008 | priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, 0); | 1012 | priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, 0); |
1009 | 1013 | ||
1014 | phys_addr = pci_map_single(priv->pci_dev, &out_cmd->hdr, | ||
1015 | fix_size, PCI_DMA_BIDIRECTIONAL); | ||
1016 | pci_unmap_addr_set(&out_cmd->meta, mapping, phys_addr); | ||
1017 | pci_unmap_len_set(&out_cmd->meta, len, fix_size); | ||
1018 | |||
1019 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, | ||
1020 | phys_addr, fix_size, 1, | ||
1021 | U32_PAD(cmd->len)); | ||
1022 | |||
1010 | /* Increment and update queue's write index */ | 1023 | /* Increment and update queue's write index */ |
1011 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); | 1024 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); |
1012 | ret = iwl_txq_update_write_ptr(priv, txq); | 1025 | ret = iwl_txq_update_write_ptr(priv, txq); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index ce729281ff62..617c4235d971 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -972,7 +972,7 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
972 | dma_addr_t phys_addr; | 972 | dma_addr_t phys_addr; |
973 | dma_addr_t txcmd_phys; | 973 | dma_addr_t txcmd_phys; |
974 | int txq_id = skb_get_queue_mapping(skb); | 974 | int txq_id = skb_get_queue_mapping(skb); |
975 | u16 len, idx, len_org, hdr_len; | 975 | u16 len, idx, len_org, hdr_len; /* TODO: len_org is not used */ |
976 | u8 id; | 976 | u8 id; |
977 | u8 unicast; | 977 | u8 unicast; |
978 | u8 sta_id; | 978 | u8 sta_id; |
@@ -1074,6 +1074,40 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
1074 | /* Copy MAC header from skb into command buffer */ | 1074 | /* Copy MAC header from skb into command buffer */ |
1075 | memcpy(tx->hdr, hdr, hdr_len); | 1075 | memcpy(tx->hdr, hdr, hdr_len); |
1076 | 1076 | ||
1077 | |||
1078 | if (info->control.hw_key) | ||
1079 | iwl3945_build_tx_cmd_hwcrypto(priv, info, out_cmd, skb, sta_id); | ||
1080 | |||
1081 | /* TODO need this for burst mode later on */ | ||
1082 | iwl3945_build_tx_cmd_basic(priv, out_cmd, info, hdr, sta_id); | ||
1083 | |||
1084 | /* set is_hcca to 0; it probably will never be implemented */ | ||
1085 | iwl3945_hw_build_tx_cmd_rate(priv, out_cmd, info, hdr, sta_id, 0); | ||
1086 | |||
1087 | /* Total # bytes to be transmitted */ | ||
1088 | len = (u16)skb->len; | ||
1089 | tx->len = cpu_to_le16(len); | ||
1090 | |||
1091 | |||
1092 | tx->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK; | ||
1093 | tx->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK; | ||
1094 | |||
1095 | if (!ieee80211_has_morefrags(hdr->frame_control)) { | ||
1096 | txq->need_update = 1; | ||
1097 | if (qc) | ||
1098 | priv->stations_39[sta_id].tid[tid].seq_number = seq_number; | ||
1099 | } else { | ||
1100 | wait_write_ptr = 1; | ||
1101 | txq->need_update = 0; | ||
1102 | } | ||
1103 | |||
1104 | IWL_DEBUG_TX(priv, "sequence nr = 0X%x \n", | ||
1105 | le16_to_cpu(out_cmd->hdr.sequence)); | ||
1106 | IWL_DEBUG_TX(priv, "tx_flags = 0X%x \n", le32_to_cpu(tx->tx_flags)); | ||
1107 | iwl_print_hex_dump(priv, IWL_DL_TX, tx, sizeof(*tx)); | ||
1108 | iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx->hdr, | ||
1109 | ieee80211_hdrlen(fc)); | ||
1110 | |||
1077 | /* | 1111 | /* |
1078 | * Use the first empty entry in this queue's command buffer array | 1112 | * Use the first empty entry in this queue's command buffer array |
1079 | * to contain the Tx command and MAC header concatenated together | 1113 | * to contain the Tx command and MAC header concatenated together |
@@ -1096,22 +1130,18 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
1096 | 1130 | ||
1097 | /* Physical address of this Tx command's header (not MAC header!), | 1131 | /* Physical address of this Tx command's header (not MAC header!), |
1098 | * within command buffer array. */ | 1132 | * within command buffer array. */ |
1099 | txcmd_phys = pci_map_single(priv->pci_dev, | 1133 | txcmd_phys = pci_map_single(priv->pci_dev, &out_cmd->hdr, |
1100 | out_cmd, sizeof(struct iwl_cmd), | 1134 | len, PCI_DMA_TODEVICE); |
1101 | PCI_DMA_TODEVICE); | 1135 | /* we do not map meta data ... so we can safely access address to |
1136 | * provide to unmap command*/ | ||
1102 | pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys); | 1137 | pci_unmap_addr_set(&out_cmd->meta, mapping, txcmd_phys); |
1103 | pci_unmap_len_set(&out_cmd->meta, len, sizeof(struct iwl_cmd)); | 1138 | pci_unmap_len_set(&out_cmd->meta, len, len); |
1104 | /* Add buffer containing Tx command and MAC(!) header to TFD's | ||
1105 | * first entry */ | ||
1106 | txcmd_phys += offsetof(struct iwl_cmd, hdr); | ||
1107 | 1139 | ||
1108 | /* Add buffer containing Tx command and MAC(!) header to TFD's | 1140 | /* Add buffer containing Tx command and MAC(!) header to TFD's |
1109 | * first entry */ | 1141 | * first entry */ |
1110 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, | 1142 | priv->cfg->ops->lib->txq_attach_buf_to_tfd(priv, txq, |
1111 | txcmd_phys, len, 1, 0); | 1143 | txcmd_phys, len, 1, 0); |
1112 | 1144 | ||
1113 | if (info->control.hw_key) | ||
1114 | iwl3945_build_tx_cmd_hwcrypto(priv, info, out_cmd, skb, sta_id); | ||
1115 | 1145 | ||
1116 | /* Set up TFD's 2nd entry to point directly to remainder of skb, | 1146 | /* Set up TFD's 2nd entry to point directly to remainder of skb, |
1117 | * if any (802.11 null frames have no payload). */ | 1147 | * if any (802.11 null frames have no payload). */ |
@@ -1124,32 +1154,6 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
1124 | 0, U32_PAD(len)); | 1154 | 0, U32_PAD(len)); |
1125 | } | 1155 | } |
1126 | 1156 | ||
1127 | /* Total # bytes to be transmitted */ | ||
1128 | len = (u16)skb->len; | ||
1129 | tx->len = cpu_to_le16(len); | ||
1130 | |||
1131 | /* TODO need this for burst mode later on */ | ||
1132 | iwl3945_build_tx_cmd_basic(priv, out_cmd, info, hdr, sta_id); | ||
1133 | |||
1134 | /* set is_hcca to 0; it probably will never be implemented */ | ||
1135 | iwl3945_hw_build_tx_cmd_rate(priv, out_cmd, info, hdr, sta_id, 0); | ||
1136 | |||
1137 | tx->tx_flags &= ~TX_CMD_FLG_ANT_A_MSK; | ||
1138 | tx->tx_flags &= ~TX_CMD_FLG_ANT_B_MSK; | ||
1139 | |||
1140 | if (!ieee80211_has_morefrags(hdr->frame_control)) { | ||
1141 | txq->need_update = 1; | ||
1142 | if (qc) | ||
1143 | priv->stations_39[sta_id].tid[tid].seq_number = seq_number; | ||
1144 | } else { | ||
1145 | wait_write_ptr = 1; | ||
1146 | txq->need_update = 0; | ||
1147 | } | ||
1148 | |||
1149 | iwl_print_hex_dump(priv, IWL_DL_TX, tx, sizeof(*tx)); | ||
1150 | |||
1151 | iwl_print_hex_dump(priv, IWL_DL_TX, (u8 *)tx->hdr, | ||
1152 | ieee80211_hdrlen(fc)); | ||
1153 | 1157 | ||
1154 | /* Tell device the write index *just past* this latest filled TFD */ | 1158 | /* Tell device the write index *just past* this latest filled TFD */ |
1155 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); | 1159 | q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); |
@@ -1661,6 +1665,37 @@ static void iwl3945_rx_allocate(struct iwl_priv *priv) | |||
1661 | spin_unlock_irqrestore(&rxq->lock, flags); | 1665 | spin_unlock_irqrestore(&rxq->lock, flags); |
1662 | } | 1666 | } |
1663 | 1667 | ||
1668 | void iwl3945_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | ||
1669 | { | ||
1670 | unsigned long flags; | ||
1671 | int i; | ||
1672 | spin_lock_irqsave(&rxq->lock, flags); | ||
1673 | INIT_LIST_HEAD(&rxq->rx_free); | ||
1674 | INIT_LIST_HEAD(&rxq->rx_used); | ||
1675 | /* Fill the rx_used queue with _all_ of the Rx buffers */ | ||
1676 | for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) { | ||
1677 | /* In the reset function, these buffers may have been allocated | ||
1678 | * to an SKB, so we need to unmap and free potential storage */ | ||
1679 | if (rxq->pool[i].skb != NULL) { | ||
1680 | pci_unmap_single(priv->pci_dev, | ||
1681 | rxq->pool[i].real_dma_addr, | ||
1682 | priv->hw_params.rx_buf_size, | ||
1683 | PCI_DMA_FROMDEVICE); | ||
1684 | priv->alloc_rxb_skb--; | ||
1685 | dev_kfree_skb(rxq->pool[i].skb); | ||
1686 | rxq->pool[i].skb = NULL; | ||
1687 | } | ||
1688 | list_add_tail(&rxq->pool[i].list, &rxq->rx_used); | ||
1689 | } | ||
1690 | |||
1691 | /* Set us so that we have processed and used all buffers, but have | ||
1692 | * not restocked the Rx queue with fresh buffers */ | ||
1693 | rxq->read = rxq->write = 0; | ||
1694 | rxq->free_count = 0; | ||
1695 | spin_unlock_irqrestore(&rxq->lock, flags); | ||
1696 | } | ||
1697 | EXPORT_SYMBOL(iwl3945_rx_queue_reset); | ||
1698 | |||
1664 | /* | 1699 | /* |
1665 | * this should be called while priv->lock is locked | 1700 | * this should be called while priv->lock is locked |
1666 | */ | 1701 | */ |
@@ -1685,6 +1720,34 @@ void iwl3945_rx_replenish(void *data) | |||
1685 | spin_unlock_irqrestore(&priv->lock, flags); | 1720 | spin_unlock_irqrestore(&priv->lock, flags); |
1686 | } | 1721 | } |
1687 | 1722 | ||
1723 | /* Assumes that the skb field of the buffers in 'pool' is kept accurate. | ||
1724 | * If an SKB has been detached, the POOL needs to have its SKB set to NULL | ||
1725 | * This free routine walks the list of POOL entries and if SKB is set to | ||
1726 | * non NULL it is unmapped and freed | ||
1727 | */ | ||
1728 | static void iwl3945_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | ||
1729 | { | ||
1730 | int i; | ||
1731 | for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { | ||
1732 | if (rxq->pool[i].skb != NULL) { | ||
1733 | pci_unmap_single(priv->pci_dev, | ||
1734 | rxq->pool[i].real_dma_addr, | ||
1735 | priv->hw_params.rx_buf_size, | ||
1736 | PCI_DMA_FROMDEVICE); | ||
1737 | dev_kfree_skb(rxq->pool[i].skb); | ||
1738 | } | ||
1739 | } | ||
1740 | |||
1741 | pci_free_consistent(priv->pci_dev, 4 * RX_QUEUE_SIZE, rxq->bd, | ||
1742 | rxq->dma_addr); | ||
1743 | pci_free_consistent(priv->pci_dev, sizeof(struct iwl_rb_status), | ||
1744 | rxq->rb_stts, rxq->rb_stts_dma); | ||
1745 | rxq->bd = NULL; | ||
1746 | rxq->rb_stts = NULL; | ||
1747 | } | ||
1748 | EXPORT_SYMBOL(iwl3945_rx_queue_free); | ||
1749 | |||
1750 | |||
1688 | /* Convert linear signal-to-noise ratio into dB */ | 1751 | /* Convert linear signal-to-noise ratio into dB */ |
1689 | static u8 ratio2dB[100] = { | 1752 | static u8 ratio2dB[100] = { |
1690 | /* 0 1 2 3 4 5 6 7 8 9 */ | 1753 | /* 0 1 2 3 4 5 6 7 8 9 */ |
@@ -1802,9 +1865,9 @@ static void iwl3945_rx_handle(struct iwl_priv *priv) | |||
1802 | 1865 | ||
1803 | rxq->queue[i] = NULL; | 1866 | rxq->queue[i] = NULL; |
1804 | 1867 | ||
1805 | pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->real_dma_addr, | 1868 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, |
1806 | priv->hw_params.rx_buf_size, | 1869 | priv->hw_params.rx_buf_size, |
1807 | PCI_DMA_FROMDEVICE); | 1870 | PCI_DMA_FROMDEVICE); |
1808 | pkt = (struct iwl_rx_packet *)rxb->skb->data; | 1871 | pkt = (struct iwl_rx_packet *)rxb->skb->data; |
1809 | 1872 | ||
1810 | /* Reclaim a command buffer only if this packet is a response | 1873 | /* Reclaim a command buffer only if this packet is a response |
@@ -1852,9 +1915,6 @@ static void iwl3945_rx_handle(struct iwl_priv *priv) | |||
1852 | rxb->skb = NULL; | 1915 | rxb->skb = NULL; |
1853 | } | 1916 | } |
1854 | 1917 | ||
1855 | pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, | ||
1856 | priv->hw_params.rx_buf_size, | ||
1857 | PCI_DMA_FROMDEVICE); | ||
1858 | spin_lock_irqsave(&rxq->lock, flags); | 1918 | spin_lock_irqsave(&rxq->lock, flags); |
1859 | list_add_tail(&rxb->list, &priv->rxq.rx_used); | 1919 | list_add_tail(&rxb->list, &priv->rxq.rx_used); |
1860 | spin_unlock_irqrestore(&rxq->lock, flags); | 1920 | spin_unlock_irqrestore(&rxq->lock, flags); |
@@ -4075,7 +4135,7 @@ static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, | |||
4075 | if (!static_key) { | 4135 | if (!static_key) { |
4076 | sta_id = iwl3945_hw_find_station(priv, addr); | 4136 | sta_id = iwl3945_hw_find_station(priv, addr); |
4077 | if (sta_id == IWL_INVALID_STATION) { | 4137 | if (sta_id == IWL_INVALID_STATION) { |
4078 | IWL_DEBUG_MAC80211(priv, "leave - %pMnot in station map.\n", | 4138 | IWL_DEBUG_MAC80211(priv, "leave - %pM not in station map.\n", |
4079 | addr); | 4139 | addr); |
4080 | return -EINVAL; | 4140 | return -EINVAL; |
4081 | } | 4141 | } |
@@ -4913,6 +4973,8 @@ static int iwl3945_setup_mac(struct iwl_priv *priv) | |||
4913 | 4973 | ||
4914 | hw->wiphy->custom_regulatory = true; | 4974 | hw->wiphy->custom_regulatory = true; |
4915 | 4975 | ||
4976 | hw->wiphy->max_scan_ssids = 1; /* WILL FIX */ | ||
4977 | |||
4916 | /* Default value; 4 EDCA QOS priorities */ | 4978 | /* Default value; 4 EDCA QOS priorities */ |
4917 | hw->queues = 4; | 4979 | hw->queues = 4; |
4918 | 4980 | ||
@@ -5194,12 +5256,12 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev) | |||
5194 | sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group); | 5256 | sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group); |
5195 | 5257 | ||
5196 | iwl_rfkill_unregister(priv); | 5258 | iwl_rfkill_unregister(priv); |
5197 | cancel_delayed_work(&priv->rfkill_poll); | 5259 | cancel_delayed_work_sync(&priv->rfkill_poll); |
5198 | 5260 | ||
5199 | iwl3945_dealloc_ucode_pci(priv); | 5261 | iwl3945_dealloc_ucode_pci(priv); |
5200 | 5262 | ||
5201 | if (priv->rxq.bd) | 5263 | if (priv->rxq.bd) |
5202 | iwl_rx_queue_free(priv, &priv->rxq); | 5264 | iwl3945_rx_queue_free(priv, &priv->rxq); |
5203 | iwl3945_hw_txq_ctx_free(priv); | 5265 | iwl3945_hw_txq_ctx_free(priv); |
5204 | 5266 | ||
5205 | iwl3945_unset_hw_params(priv); | 5267 | iwl3945_unset_hw_params(priv); |
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c index 63d7e19ce9bd..8e669775cb5d 100644 --- a/drivers/net/wireless/libertas/rx.c +++ b/drivers/net/wireless/libertas/rx.c | |||
@@ -170,6 +170,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb) | |||
170 | lbs_deb_rx("rx err: frame received with bad length\n"); | 170 | lbs_deb_rx("rx err: frame received with bad length\n"); |
171 | dev->stats.rx_length_errors++; | 171 | dev->stats.rx_length_errors++; |
172 | ret = 0; | 172 | ret = 0; |
173 | dev_kfree_skb(skb); | ||
173 | goto done; | 174 | goto done; |
174 | } | 175 | } |
175 | 176 | ||
@@ -181,6 +182,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb) | |||
181 | lbs_pr_alert("rxpd not ok\n"); | 182 | lbs_pr_alert("rxpd not ok\n"); |
182 | dev->stats.rx_errors++; | 183 | dev->stats.rx_errors++; |
183 | ret = 0; | 184 | ret = 0; |
185 | dev_kfree_skb(skb); | ||
184 | goto done; | 186 | goto done; |
185 | } | 187 | } |
186 | 188 | ||
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c index 57a0268d1bae..a9a970469c2a 100644 --- a/drivers/net/wireless/mwl8k.c +++ b/drivers/net/wireless/mwl8k.c | |||
@@ -893,8 +893,7 @@ static int mwl8k_rxq_init(struct ieee80211_hw *hw, int index) | |||
893 | rx_desc->next_rx_desc_phys_addr = | 893 | rx_desc->next_rx_desc_phys_addr = |
894 | cpu_to_le32(rxq->rx_desc_dma | 894 | cpu_to_le32(rxq->rx_desc_dma |
895 | + nexti * sizeof(*rx_desc)); | 895 | + nexti * sizeof(*rx_desc)); |
896 | rx_desc->rx_ctrl = | 896 | rx_desc->rx_ctrl = MWL8K_RX_CTRL_OWNED_BY_HOST; |
897 | cpu_to_le32(MWL8K_RX_CTRL_OWNED_BY_HOST); | ||
898 | } | 897 | } |
899 | 898 | ||
900 | return 0; | 899 | return 0; |
@@ -3720,12 +3719,12 @@ err_free_reg: | |||
3720 | return rc; | 3719 | return rc; |
3721 | } | 3720 | } |
3722 | 3721 | ||
3723 | static void __devexit mwl8k_remove(struct pci_dev *pdev) | 3722 | static void __devexit mwl8k_shutdown(struct pci_dev *pdev) |
3724 | { | 3723 | { |
3725 | printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__); | 3724 | printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__); |
3726 | } | 3725 | } |
3727 | 3726 | ||
3728 | static void __devexit mwl8k_shutdown(struct pci_dev *pdev) | 3727 | static void __devexit mwl8k_remove(struct pci_dev *pdev) |
3729 | { | 3728 | { |
3730 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | 3729 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); |
3731 | struct mwl8k_priv *priv; | 3730 | struct mwl8k_priv *priv; |
diff --git a/drivers/net/wireless/orinoco/hw.c b/drivers/net/wireless/orinoco/hw.c index 081428d9409e..632fac86a308 100644 --- a/drivers/net/wireless/orinoco/hw.c +++ b/drivers/net/wireless/orinoco/hw.c | |||
@@ -372,15 +372,13 @@ int __orinoco_hw_set_tkip_key(hermes_t *hw, int key_idx, int set_tx, | |||
372 | } | 372 | } |
373 | 373 | ||
374 | /* Wait upto 100ms for tx queue to empty */ | 374 | /* Wait upto 100ms for tx queue to empty */ |
375 | k = 100; | 375 | for (k = 100; k > 0; k--) { |
376 | do { | ||
377 | k--; | ||
378 | udelay(1000); | 376 | udelay(1000); |
379 | ret = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_TXQUEUEEMPTY, | 377 | ret = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_TXQUEUEEMPTY, |
380 | &xmitting); | 378 | &xmitting); |
381 | if (ret) | 379 | if (ret || !xmitting) |
382 | break; | 380 | break; |
383 | } while ((k > 0) && xmitting); | 381 | } |
384 | 382 | ||
385 | if (k == 0) | 383 | if (k == 0) |
386 | ret = -ETIMEDOUT; | 384 | ret = -ETIMEDOUT; |
diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h index 2dda5fe418b6..ecf8b6ed5a47 100644 --- a/drivers/net/wireless/p54/p54.h +++ b/drivers/net/wireless/p54/p54.h | |||
@@ -14,9 +14,9 @@ | |||
14 | * published by the Free Software Foundation. | 14 | * published by the Free Software Foundation. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #ifdef CONFIG_MAC80211_LEDS | 17 | #ifdef CONFIG_P54_LEDS |
18 | #include <linux/leds.h> | 18 | #include <linux/leds.h> |
19 | #endif /* CONFIG_MAC80211_LEDS */ | 19 | #endif /* CONFIG_P54_LEDS */ |
20 | 20 | ||
21 | enum p54_control_frame_types { | 21 | enum p54_control_frame_types { |
22 | P54_CONTROL_TYPE_SETUP = 0, | 22 | P54_CONTROL_TYPE_SETUP = 0, |
@@ -116,7 +116,7 @@ enum fw_state { | |||
116 | FW_STATE_RESETTING, | 116 | FW_STATE_RESETTING, |
117 | }; | 117 | }; |
118 | 118 | ||
119 | #ifdef CONFIG_MAC80211_LEDS | 119 | #ifdef CONFIG_P54_LEDS |
120 | 120 | ||
121 | #define P54_LED_MAX_NAME_LEN 31 | 121 | #define P54_LED_MAX_NAME_LEN 31 |
122 | 122 | ||
@@ -129,7 +129,7 @@ struct p54_led_dev { | |||
129 | unsigned int registered; | 129 | unsigned int registered; |
130 | }; | 130 | }; |
131 | 131 | ||
132 | #endif /* CONFIG_MAC80211_LEDS */ | 132 | #endif /* CONFIG_P54_LEDS */ |
133 | 133 | ||
134 | struct p54_common { | 134 | struct p54_common { |
135 | struct ieee80211_hw *hw; | 135 | struct ieee80211_hw *hw; |
@@ -177,10 +177,10 @@ struct p54_common { | |||
177 | u8 privacy_caps; | 177 | u8 privacy_caps; |
178 | u8 rx_keycache_size; | 178 | u8 rx_keycache_size; |
179 | /* LED management */ | 179 | /* LED management */ |
180 | #ifdef CONFIG_MAC80211_LEDS | 180 | #ifdef CONFIG_P54_LEDS |
181 | struct p54_led_dev assoc_led; | 181 | struct p54_led_dev assoc_led; |
182 | struct p54_led_dev tx_led; | 182 | struct p54_led_dev tx_led; |
183 | #endif /* CONFIG_MAC80211_LEDS */ | 183 | #endif /* CONFIG_P54_LEDS */ |
184 | u16 softled_state; /* bit field of glowing LEDs */ | 184 | u16 softled_state; /* bit field of glowing LEDs */ |
185 | }; | 185 | }; |
186 | 186 | ||
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 0c1b0577d4ee..c8f0232ee5e0 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -2543,8 +2543,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) | |||
2543 | priv->basic_rate_mask = 0x15f; | 2543 | priv->basic_rate_mask = 0x15f; |
2544 | skb_queue_head_init(&priv->tx_queue); | 2544 | skb_queue_head_init(&priv->tx_queue); |
2545 | dev->flags = IEEE80211_HW_RX_INCLUDES_FCS | | 2545 | dev->flags = IEEE80211_HW_RX_INCLUDES_FCS | |
2546 | IEEE80211_HW_SUPPORTS_PS | | ||
2547 | IEEE80211_HW_PS_NULLFUNC_STACK | | ||
2548 | IEEE80211_HW_SIGNAL_DBM | | 2546 | IEEE80211_HW_SIGNAL_DBM | |
2549 | IEEE80211_HW_NOISE_DBM; | 2547 | IEEE80211_HW_NOISE_DBM; |
2550 | 2548 | ||
diff --git a/drivers/net/wireless/p54/p54spi.c b/drivers/net/wireless/p54/p54spi.c index 2b222aaa6f0a..d1fe577de3d4 100644 --- a/drivers/net/wireless/p54/p54spi.c +++ b/drivers/net/wireless/p54/p54spi.c | |||
@@ -457,9 +457,10 @@ static int p54spi_wq_tx(struct p54s_priv *priv) | |||
457 | struct ieee80211_tx_info *info; | 457 | struct ieee80211_tx_info *info; |
458 | struct p54_tx_info *minfo; | 458 | struct p54_tx_info *minfo; |
459 | struct p54s_tx_info *dinfo; | 459 | struct p54s_tx_info *dinfo; |
460 | unsigned long flags; | ||
460 | int ret = 0; | 461 | int ret = 0; |
461 | 462 | ||
462 | spin_lock_bh(&priv->tx_lock); | 463 | spin_lock_irqsave(&priv->tx_lock, flags); |
463 | 464 | ||
464 | while (!list_empty(&priv->tx_pending)) { | 465 | while (!list_empty(&priv->tx_pending)) { |
465 | entry = list_entry(priv->tx_pending.next, | 466 | entry = list_entry(priv->tx_pending.next, |
@@ -467,7 +468,7 @@ static int p54spi_wq_tx(struct p54s_priv *priv) | |||
467 | 468 | ||
468 | list_del_init(&entry->tx_list); | 469 | list_del_init(&entry->tx_list); |
469 | 470 | ||
470 | spin_unlock_bh(&priv->tx_lock); | 471 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
471 | 472 | ||
472 | dinfo = container_of((void *) entry, struct p54s_tx_info, | 473 | dinfo = container_of((void *) entry, struct p54s_tx_info, |
473 | tx_list); | 474 | tx_list); |
@@ -479,16 +480,14 @@ static int p54spi_wq_tx(struct p54s_priv *priv) | |||
479 | 480 | ||
480 | ret = p54spi_tx_frame(priv, skb); | 481 | ret = p54spi_tx_frame(priv, skb); |
481 | 482 | ||
482 | spin_lock_bh(&priv->tx_lock); | ||
483 | |||
484 | if (ret < 0) { | 483 | if (ret < 0) { |
485 | p54_free_skb(priv->hw, skb); | 484 | p54_free_skb(priv->hw, skb); |
486 | goto out; | 485 | return ret; |
487 | } | 486 | } |
488 | } | ||
489 | 487 | ||
490 | out: | 488 | spin_lock_irqsave(&priv->tx_lock, flags); |
491 | spin_unlock_bh(&priv->tx_lock); | 489 | } |
490 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
492 | return ret; | 491 | return ret; |
493 | } | 492 | } |
494 | 493 | ||
@@ -498,12 +497,13 @@ static void p54spi_op_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
498 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 497 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
499 | struct p54_tx_info *mi = (struct p54_tx_info *) info->rate_driver_data; | 498 | struct p54_tx_info *mi = (struct p54_tx_info *) info->rate_driver_data; |
500 | struct p54s_tx_info *di = (struct p54s_tx_info *) mi->data; | 499 | struct p54s_tx_info *di = (struct p54s_tx_info *) mi->data; |
500 | unsigned long flags; | ||
501 | 501 | ||
502 | BUILD_BUG_ON(sizeof(*di) > sizeof((mi->data))); | 502 | BUILD_BUG_ON(sizeof(*di) > sizeof((mi->data))); |
503 | 503 | ||
504 | spin_lock_bh(&priv->tx_lock); | 504 | spin_lock_irqsave(&priv->tx_lock, flags); |
505 | list_add_tail(&di->tx_list, &priv->tx_pending); | 505 | list_add_tail(&di->tx_list, &priv->tx_pending); |
506 | spin_unlock_bh(&priv->tx_lock); | 506 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
507 | 507 | ||
508 | queue_work(priv->hw->workqueue, &priv->work); | 508 | queue_work(priv->hw->workqueue, &priv->work); |
509 | } | 509 | } |
@@ -604,6 +604,7 @@ out: | |||
604 | static void p54spi_op_stop(struct ieee80211_hw *dev) | 604 | static void p54spi_op_stop(struct ieee80211_hw *dev) |
605 | { | 605 | { |
606 | struct p54s_priv *priv = dev->priv; | 606 | struct p54s_priv *priv = dev->priv; |
607 | unsigned long flags; | ||
607 | 608 | ||
608 | if (mutex_lock_interruptible(&priv->mutex)) { | 609 | if (mutex_lock_interruptible(&priv->mutex)) { |
609 | /* FIXME: how to handle this error? */ | 610 | /* FIXME: how to handle this error? */ |
@@ -615,9 +616,9 @@ static void p54spi_op_stop(struct ieee80211_hw *dev) | |||
615 | cancel_work_sync(&priv->work); | 616 | cancel_work_sync(&priv->work); |
616 | 617 | ||
617 | p54spi_power_off(priv); | 618 | p54spi_power_off(priv); |
618 | spin_lock_bh(&priv->tx_lock); | 619 | spin_lock_irqsave(&priv->tx_lock, flags); |
619 | INIT_LIST_HEAD(&priv->tx_pending); | 620 | INIT_LIST_HEAD(&priv->tx_pending); |
620 | spin_unlock_bh(&priv->tx_lock); | 621 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
621 | 622 | ||
622 | priv->fw_state = FW_STATE_OFF; | 623 | priv->fw_state = FW_STATE_OFF; |
623 | mutex_unlock(&priv->mutex); | 624 | mutex_unlock(&priv->mutex); |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index da6640afc835..6cc6cbc9234f 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
@@ -71,6 +71,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { | |||
71 | {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ | 71 | {USB_DEVICE(0x1260, 0xee22)}, /* SMC 2862W-G version 2 */ |
72 | {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */ | 72 | {USB_DEVICE(0x13b1, 0x000a)}, /* Linksys WUSB54G ver 2 */ |
73 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ | 73 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ |
74 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ | ||
74 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ | 75 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ |
75 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ | 76 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ |
76 | {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */ | 77 | {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 05f94e21b423..5752aaae906b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -646,10 +646,8 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
646 | * Register HW. | 646 | * Register HW. |
647 | */ | 647 | */ |
648 | status = ieee80211_register_hw(rt2x00dev->hw); | 648 | status = ieee80211_register_hw(rt2x00dev->hw); |
649 | if (status) { | 649 | if (status) |
650 | rt2x00lib_remove_hw(rt2x00dev); | ||
651 | return status; | 650 | return status; |
652 | } | ||
653 | 651 | ||
654 | set_bit(DEVICE_STATE_REGISTERED_HW, &rt2x00dev->flags); | 652 | set_bit(DEVICE_STATE_REGISTERED_HW, &rt2x00dev->flags); |
655 | 653 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 43fa0f849003..9730b4f8fd26 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -369,8 +369,6 @@ int rt2x00pci_suspend(struct pci_dev *pci_dev, pm_message_t state) | |||
369 | if (retval) | 369 | if (retval) |
370 | return retval; | 370 | return retval; |
371 | 371 | ||
372 | rt2x00pci_free_reg(rt2x00dev); | ||
373 | |||
374 | pci_save_state(pci_dev); | 372 | pci_save_state(pci_dev); |
375 | pci_disable_device(pci_dev); | 373 | pci_disable_device(pci_dev); |
376 | return pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state)); | 374 | return pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state)); |
@@ -381,7 +379,6 @@ int rt2x00pci_resume(struct pci_dev *pci_dev) | |||
381 | { | 379 | { |
382 | struct ieee80211_hw *hw = pci_get_drvdata(pci_dev); | 380 | struct ieee80211_hw *hw = pci_get_drvdata(pci_dev); |
383 | struct rt2x00_dev *rt2x00dev = hw->priv; | 381 | struct rt2x00_dev *rt2x00dev = hw->priv; |
384 | int retval; | ||
385 | 382 | ||
386 | if (pci_set_power_state(pci_dev, PCI_D0) || | 383 | if (pci_set_power_state(pci_dev, PCI_D0) || |
387 | pci_enable_device(pci_dev) || | 384 | pci_enable_device(pci_dev) || |
@@ -390,20 +387,7 @@ int rt2x00pci_resume(struct pci_dev *pci_dev) | |||
390 | return -EIO; | 387 | return -EIO; |
391 | } | 388 | } |
392 | 389 | ||
393 | retval = rt2x00pci_alloc_reg(rt2x00dev); | 390 | return rt2x00lib_resume(rt2x00dev); |
394 | if (retval) | ||
395 | return retval; | ||
396 | |||
397 | retval = rt2x00lib_resume(rt2x00dev); | ||
398 | if (retval) | ||
399 | goto exit_free_reg; | ||
400 | |||
401 | return 0; | ||
402 | |||
403 | exit_free_reg: | ||
404 | rt2x00pci_free_reg(rt2x00dev); | ||
405 | |||
406 | return retval; | ||
407 | } | 391 | } |
408 | EXPORT_SYMBOL_GPL(rt2x00pci_resume); | 392 | EXPORT_SYMBOL_GPL(rt2x00pci_resume); |
409 | #endif /* CONFIG_PM */ | 393 | #endif /* CONFIG_PM */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 7d50ca82375e..501544882c2c 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -702,8 +702,6 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state) | |||
702 | if (retval) | 702 | if (retval) |
703 | return retval; | 703 | return retval; |
704 | 704 | ||
705 | rt2x00usb_free_reg(rt2x00dev); | ||
706 | |||
707 | /* | 705 | /* |
708 | * Decrease usbdev refcount. | 706 | * Decrease usbdev refcount. |
709 | */ | 707 | */ |
@@ -717,24 +715,10 @@ int rt2x00usb_resume(struct usb_interface *usb_intf) | |||
717 | { | 715 | { |
718 | struct ieee80211_hw *hw = usb_get_intfdata(usb_intf); | 716 | struct ieee80211_hw *hw = usb_get_intfdata(usb_intf); |
719 | struct rt2x00_dev *rt2x00dev = hw->priv; | 717 | struct rt2x00_dev *rt2x00dev = hw->priv; |
720 | int retval; | ||
721 | 718 | ||
722 | usb_get_dev(interface_to_usbdev(usb_intf)); | 719 | usb_get_dev(interface_to_usbdev(usb_intf)); |
723 | 720 | ||
724 | retval = rt2x00usb_alloc_reg(rt2x00dev); | 721 | return rt2x00lib_resume(rt2x00dev); |
725 | if (retval) | ||
726 | return retval; | ||
727 | |||
728 | retval = rt2x00lib_resume(rt2x00dev); | ||
729 | if (retval) | ||
730 | goto exit_free_reg; | ||
731 | |||
732 | return 0; | ||
733 | |||
734 | exit_free_reg: | ||
735 | rt2x00usb_free_reg(rt2x00dev); | ||
736 | |||
737 | return retval; | ||
738 | } | 722 | } |
739 | EXPORT_SYMBOL_GPL(rt2x00usb_resume); | 723 | EXPORT_SYMBOL_GPL(rt2x00usb_resume); |
740 | #endif /* CONFIG_PM */ | 724 | #endif /* CONFIG_PM */ |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 420fff42c0dd..853b2b279b64 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -2369,6 +2369,8 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
2369 | /* Buffalo */ | 2369 | /* Buffalo */ |
2370 | { USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) }, | 2370 | { USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) }, |
2371 | { USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) }, | 2371 | { USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) }, |
2372 | { USB_DEVICE(0x0411, 0x0116), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2373 | { USB_DEVICE(0x0411, 0x0119), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2372 | /* CNet */ | 2374 | /* CNet */ |
2373 | { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) }, | 2375 | { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) }, |
2374 | { USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) }, | 2376 | { USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) }, |
diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c index 1cd02f5a23a0..bc43f78f6f0b 100644 --- a/drivers/pcmcia/pxa2xx_sharpsl.c +++ b/drivers/pcmcia/pxa2xx_sharpsl.c | |||
@@ -255,6 +255,9 @@ static int __init sharpsl_pcmcia_init(void) | |||
255 | { | 255 | { |
256 | int ret; | 256 | int ret; |
257 | 257 | ||
258 | if (!platform_scoop_config) | ||
259 | return -ENODEV; | ||
260 | |||
258 | sharpsl_pcmcia_ops.nr = platform_scoop_config->num_devs; | 261 | sharpsl_pcmcia_ops.nr = platform_scoop_config->num_devs; |
259 | sharpsl_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | 262 | sharpsl_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); |
260 | 263 | ||
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c index d3c92d777bde..552958545f94 100644 --- a/drivers/platform/x86/sony-laptop.c +++ b/drivers/platform/x86/sony-laptop.c | |||
@@ -317,7 +317,8 @@ static void sony_laptop_report_input_event(u8 event) | |||
317 | struct input_dev *key_dev = sony_laptop_input.key_dev; | 317 | struct input_dev *key_dev = sony_laptop_input.key_dev; |
318 | struct sony_laptop_keypress kp = { NULL }; | 318 | struct sony_laptop_keypress kp = { NULL }; |
319 | 319 | ||
320 | if (event == SONYPI_EVENT_FNKEY_RELEASED) { | 320 | if (event == SONYPI_EVENT_FNKEY_RELEASED || |
321 | event == SONYPI_EVENT_ANYBUTTON_RELEASED) { | ||
321 | /* Nothing, not all VAIOs generate this event */ | 322 | /* Nothing, not all VAIOs generate this event */ |
322 | return; | 323 | return; |
323 | } | 324 | } |
@@ -905,7 +906,6 @@ static struct sony_nc_event sony_127_events[] = { | |||
905 | { 0x05, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 906 | { 0x05, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
906 | { 0x86, SONYPI_EVENT_PKEY_P5 }, | 907 | { 0x86, SONYPI_EVENT_PKEY_P5 }, |
907 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 908 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
908 | { 0x06, SONYPI_EVENT_ANYBUTTON_RELEASED }, | ||
909 | { 0x87, SONYPI_EVENT_SETTINGKEY_PRESSED }, | 909 | { 0x87, SONYPI_EVENT_SETTINGKEY_PRESSED }, |
910 | { 0x07, SONYPI_EVENT_ANYBUTTON_RELEASED }, | 910 | { 0x07, SONYPI_EVENT_ANYBUTTON_RELEASED }, |
911 | { 0, 0 }, | 911 | { 0, 0 }, |
@@ -1004,6 +1004,7 @@ static int sony_nc_function_setup(struct acpi_device *device) | |||
1004 | sony_call_snc_handle(0x0100, 0, &result); | 1004 | sony_call_snc_handle(0x0100, 0, &result); |
1005 | sony_call_snc_handle(0x0101, 0, &result); | 1005 | sony_call_snc_handle(0x0101, 0, &result); |
1006 | sony_call_snc_handle(0x0102, 0x100, &result); | 1006 | sony_call_snc_handle(0x0102, 0x100, &result); |
1007 | sony_call_snc_handle(0x0127, 0, &result); | ||
1007 | 1008 | ||
1008 | return 0; | 1009 | return 0; |
1009 | } | 1010 | } |
@@ -1040,7 +1041,7 @@ static int sony_nc_resume(struct acpi_device *device) | |||
1040 | 1041 | ||
1041 | /* set the last requested brightness level */ | 1042 | /* set the last requested brightness level */ |
1042 | if (sony_backlight_device && | 1043 | if (sony_backlight_device && |
1043 | !sony_backlight_update_status(sony_backlight_device)) | 1044 | sony_backlight_update_status(sony_backlight_device) < 0) |
1044 | printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n"); | 1045 | printk(KERN_WARNING DRV_PFX "unable to restore brightness level\n"); |
1045 | 1046 | ||
1046 | return 0; | 1047 | return 0; |
@@ -1102,8 +1103,11 @@ static int sony_nc_setup_wifi_rfkill(struct acpi_device *device) | |||
1102 | err = rfkill_register(sony_wifi_rfkill); | 1103 | err = rfkill_register(sony_wifi_rfkill); |
1103 | if (err) | 1104 | if (err) |
1104 | rfkill_free(sony_wifi_rfkill); | 1105 | rfkill_free(sony_wifi_rfkill); |
1105 | else | 1106 | else { |
1106 | sony_rfkill_devices[SONY_WIFI] = sony_wifi_rfkill; | 1107 | sony_rfkill_devices[SONY_WIFI] = sony_wifi_rfkill; |
1108 | sony_nc_rfkill_set(sony_wifi_rfkill->data, | ||
1109 | RFKILL_STATE_UNBLOCKED); | ||
1110 | } | ||
1107 | return err; | 1111 | return err; |
1108 | } | 1112 | } |
1109 | 1113 | ||
@@ -1124,8 +1128,11 @@ static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device) | |||
1124 | err = rfkill_register(sony_bluetooth_rfkill); | 1128 | err = rfkill_register(sony_bluetooth_rfkill); |
1125 | if (err) | 1129 | if (err) |
1126 | rfkill_free(sony_bluetooth_rfkill); | 1130 | rfkill_free(sony_bluetooth_rfkill); |
1127 | else | 1131 | else { |
1128 | sony_rfkill_devices[SONY_BLUETOOTH] = sony_bluetooth_rfkill; | 1132 | sony_rfkill_devices[SONY_BLUETOOTH] = sony_bluetooth_rfkill; |
1133 | sony_nc_rfkill_set(sony_bluetooth_rfkill->data, | ||
1134 | RFKILL_STATE_UNBLOCKED); | ||
1135 | } | ||
1129 | return err; | 1136 | return err; |
1130 | } | 1137 | } |
1131 | 1138 | ||
@@ -1145,8 +1152,11 @@ static int sony_nc_setup_wwan_rfkill(struct acpi_device *device) | |||
1145 | err = rfkill_register(sony_wwan_rfkill); | 1152 | err = rfkill_register(sony_wwan_rfkill); |
1146 | if (err) | 1153 | if (err) |
1147 | rfkill_free(sony_wwan_rfkill); | 1154 | rfkill_free(sony_wwan_rfkill); |
1148 | else | 1155 | else { |
1149 | sony_rfkill_devices[SONY_WWAN] = sony_wwan_rfkill; | 1156 | sony_rfkill_devices[SONY_WWAN] = sony_wwan_rfkill; |
1157 | sony_nc_rfkill_set(sony_wwan_rfkill->data, | ||
1158 | RFKILL_STATE_UNBLOCKED); | ||
1159 | } | ||
1150 | return err; | 1160 | return err; |
1151 | } | 1161 | } |
1152 | 1162 | ||
@@ -1166,8 +1176,11 @@ static int sony_nc_setup_wimax_rfkill(struct acpi_device *device) | |||
1166 | err = rfkill_register(sony_wimax_rfkill); | 1176 | err = rfkill_register(sony_wimax_rfkill); |
1167 | if (err) | 1177 | if (err) |
1168 | rfkill_free(sony_wimax_rfkill); | 1178 | rfkill_free(sony_wimax_rfkill); |
1169 | else | 1179 | else { |
1170 | sony_rfkill_devices[SONY_WIMAX] = sony_wimax_rfkill; | 1180 | sony_rfkill_devices[SONY_WIMAX] = sony_wimax_rfkill; |
1181 | sony_nc_rfkill_set(sony_wimax_rfkill->data, | ||
1182 | RFKILL_STATE_UNBLOCKED); | ||
1183 | } | ||
1171 | return err; | 1184 | return err; |
1172 | } | 1185 | } |
1173 | 1186 | ||
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index a40b075743d9..912be65b6261 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
@@ -21,7 +21,7 @@ | |||
21 | * 02110-1301, USA. | 21 | * 02110-1301, USA. |
22 | */ | 22 | */ |
23 | 23 | ||
24 | #define TPACPI_VERSION "0.22" | 24 | #define TPACPI_VERSION "0.23" |
25 | #define TPACPI_SYSFS_VERSION 0x020300 | 25 | #define TPACPI_SYSFS_VERSION 0x020300 |
26 | 26 | ||
27 | /* | 27 | /* |
@@ -303,11 +303,17 @@ static u32 dbg_level; | |||
303 | 303 | ||
304 | static struct workqueue_struct *tpacpi_wq; | 304 | static struct workqueue_struct *tpacpi_wq; |
305 | 305 | ||
306 | enum led_status_t { | ||
307 | TPACPI_LED_OFF = 0, | ||
308 | TPACPI_LED_ON, | ||
309 | TPACPI_LED_BLINK, | ||
310 | }; | ||
311 | |||
306 | /* Special LED class that can defer work */ | 312 | /* Special LED class that can defer work */ |
307 | struct tpacpi_led_classdev { | 313 | struct tpacpi_led_classdev { |
308 | struct led_classdev led_classdev; | 314 | struct led_classdev led_classdev; |
309 | struct work_struct work; | 315 | struct work_struct work; |
310 | enum led_brightness new_brightness; | 316 | enum led_status_t new_state; |
311 | unsigned int led; | 317 | unsigned int led; |
312 | }; | 318 | }; |
313 | 319 | ||
@@ -2946,12 +2952,18 @@ static int hotkey_read(char *p) | |||
2946 | return len; | 2952 | return len; |
2947 | } | 2953 | } |
2948 | 2954 | ||
2949 | static void hotkey_enabledisable_warn(void) | 2955 | static void hotkey_enabledisable_warn(bool enable) |
2950 | { | 2956 | { |
2951 | tpacpi_log_usertask("procfs hotkey enable/disable"); | 2957 | tpacpi_log_usertask("procfs hotkey enable/disable"); |
2952 | WARN(1, TPACPI_WARN | 2958 | if (!WARN((tpacpi_lifecycle == TPACPI_LIFE_RUNNING || !enable), |
2953 | "hotkey enable/disable functionality has been " | 2959 | TPACPI_WARN |
2954 | "removed from the driver. Hotkeys are always enabled.\n"); | 2960 | "hotkey enable/disable functionality has been " |
2961 | "removed from the driver. Hotkeys are always " | ||
2962 | "enabled\n")) | ||
2963 | printk(TPACPI_ERR | ||
2964 | "Please remove the hotkey=enable module " | ||
2965 | "parameter, it is deprecated. Hotkeys are always " | ||
2966 | "enabled\n"); | ||
2955 | } | 2967 | } |
2956 | 2968 | ||
2957 | static int hotkey_write(char *buf) | 2969 | static int hotkey_write(char *buf) |
@@ -2971,9 +2983,9 @@ static int hotkey_write(char *buf) | |||
2971 | res = 0; | 2983 | res = 0; |
2972 | while ((cmd = next_cmd(&buf))) { | 2984 | while ((cmd = next_cmd(&buf))) { |
2973 | if (strlencmp(cmd, "enable") == 0) { | 2985 | if (strlencmp(cmd, "enable") == 0) { |
2974 | hotkey_enabledisable_warn(); | 2986 | hotkey_enabledisable_warn(1); |
2975 | } else if (strlencmp(cmd, "disable") == 0) { | 2987 | } else if (strlencmp(cmd, "disable") == 0) { |
2976 | hotkey_enabledisable_warn(); | 2988 | hotkey_enabledisable_warn(0); |
2977 | res = -EPERM; | 2989 | res = -EPERM; |
2978 | } else if (strlencmp(cmd, "reset") == 0) { | 2990 | } else if (strlencmp(cmd, "reset") == 0) { |
2979 | mask = hotkey_orig_mask; | 2991 | mask = hotkey_orig_mask; |
@@ -4207,7 +4219,7 @@ static void light_set_status_worker(struct work_struct *work) | |||
4207 | container_of(work, struct tpacpi_led_classdev, work); | 4219 | container_of(work, struct tpacpi_led_classdev, work); |
4208 | 4220 | ||
4209 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) | 4221 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) |
4210 | light_set_status((data->new_brightness != LED_OFF)); | 4222 | light_set_status((data->new_state != TPACPI_LED_OFF)); |
4211 | } | 4223 | } |
4212 | 4224 | ||
4213 | static void light_sysfs_set(struct led_classdev *led_cdev, | 4225 | static void light_sysfs_set(struct led_classdev *led_cdev, |
@@ -4217,7 +4229,8 @@ static void light_sysfs_set(struct led_classdev *led_cdev, | |||
4217 | container_of(led_cdev, | 4229 | container_of(led_cdev, |
4218 | struct tpacpi_led_classdev, | 4230 | struct tpacpi_led_classdev, |
4219 | led_classdev); | 4231 | led_classdev); |
4220 | data->new_brightness = brightness; | 4232 | data->new_state = (brightness != LED_OFF) ? |
4233 | TPACPI_LED_ON : TPACPI_LED_OFF; | ||
4221 | queue_work(tpacpi_wq, &data->work); | 4234 | queue_work(tpacpi_wq, &data->work); |
4222 | } | 4235 | } |
4223 | 4236 | ||
@@ -4724,12 +4737,6 @@ enum { /* For TPACPI_LED_OLD */ | |||
4724 | TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */ | 4737 | TPACPI_LED_EC_HLMS = 0x0e, /* EC reg to select led to command */ |
4725 | }; | 4738 | }; |
4726 | 4739 | ||
4727 | enum led_status_t { | ||
4728 | TPACPI_LED_OFF = 0, | ||
4729 | TPACPI_LED_ON, | ||
4730 | TPACPI_LED_BLINK, | ||
4731 | }; | ||
4732 | |||
4733 | static enum led_access_mode led_supported; | 4740 | static enum led_access_mode led_supported; |
4734 | 4741 | ||
4735 | TPACPI_HANDLE(led, ec, "SLED", /* 570 */ | 4742 | TPACPI_HANDLE(led, ec, "SLED", /* 570 */ |
@@ -4841,23 +4848,13 @@ static int led_set_status(const unsigned int led, | |||
4841 | return rc; | 4848 | return rc; |
4842 | } | 4849 | } |
4843 | 4850 | ||
4844 | static void led_sysfs_set_status(unsigned int led, | ||
4845 | enum led_brightness brightness) | ||
4846 | { | ||
4847 | led_set_status(led, | ||
4848 | (brightness == LED_OFF) ? | ||
4849 | TPACPI_LED_OFF : | ||
4850 | (tpacpi_led_state_cache[led] == TPACPI_LED_BLINK) ? | ||
4851 | TPACPI_LED_BLINK : TPACPI_LED_ON); | ||
4852 | } | ||
4853 | |||
4854 | static void led_set_status_worker(struct work_struct *work) | 4851 | static void led_set_status_worker(struct work_struct *work) |
4855 | { | 4852 | { |
4856 | struct tpacpi_led_classdev *data = | 4853 | struct tpacpi_led_classdev *data = |
4857 | container_of(work, struct tpacpi_led_classdev, work); | 4854 | container_of(work, struct tpacpi_led_classdev, work); |
4858 | 4855 | ||
4859 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) | 4856 | if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING)) |
4860 | led_sysfs_set_status(data->led, data->new_brightness); | 4857 | led_set_status(data->led, data->new_state); |
4861 | } | 4858 | } |
4862 | 4859 | ||
4863 | static void led_sysfs_set(struct led_classdev *led_cdev, | 4860 | static void led_sysfs_set(struct led_classdev *led_cdev, |
@@ -4866,7 +4863,13 @@ static void led_sysfs_set(struct led_classdev *led_cdev, | |||
4866 | struct tpacpi_led_classdev *data = container_of(led_cdev, | 4863 | struct tpacpi_led_classdev *data = container_of(led_cdev, |
4867 | struct tpacpi_led_classdev, led_classdev); | 4864 | struct tpacpi_led_classdev, led_classdev); |
4868 | 4865 | ||
4869 | data->new_brightness = brightness; | 4866 | if (brightness == LED_OFF) |
4867 | data->new_state = TPACPI_LED_OFF; | ||
4868 | else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK) | ||
4869 | data->new_state = TPACPI_LED_ON; | ||
4870 | else | ||
4871 | data->new_state = TPACPI_LED_BLINK; | ||
4872 | |||
4870 | queue_work(tpacpi_wq, &data->work); | 4873 | queue_work(tpacpi_wq, &data->work); |
4871 | } | 4874 | } |
4872 | 4875 | ||
@@ -4884,7 +4887,7 @@ static int led_sysfs_blink_set(struct led_classdev *led_cdev, | |||
4884 | } else if ((*delay_on != 500) || (*delay_off != 500)) | 4887 | } else if ((*delay_on != 500) || (*delay_off != 500)) |
4885 | return -EINVAL; | 4888 | return -EINVAL; |
4886 | 4889 | ||
4887 | data->new_brightness = TPACPI_LED_BLINK; | 4890 | data->new_state = TPACPI_LED_BLINK; |
4888 | queue_work(tpacpi_wq, &data->work); | 4891 | queue_work(tpacpi_wq, &data->work); |
4889 | 4892 | ||
4890 | return 0; | 4893 | return 0; |
@@ -7858,6 +7861,15 @@ static int __init thinkpad_acpi_module_init(void) | |||
7858 | MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); | 7861 | MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); |
7859 | 7862 | ||
7860 | /* | 7863 | /* |
7864 | * This will autoload the driver in almost every ThinkPad | ||
7865 | * in widespread use. | ||
7866 | * | ||
7867 | * Only _VERY_ old models, like the 240, 240x and 570 lack | ||
7868 | * the HKEY event interface. | ||
7869 | */ | ||
7870 | MODULE_DEVICE_TABLE(acpi, ibm_htk_device_ids); | ||
7871 | |||
7872 | /* | ||
7861 | * DMI matching for module autoloading | 7873 | * DMI matching for module autoloading |
7862 | * | 7874 | * |
7863 | * See http://thinkwiki.org/wiki/List_of_DMI_IDs | 7875 | * See http://thinkwiki.org/wiki/List_of_DMI_IDs |
@@ -7869,18 +7881,13 @@ MODULE_ALIAS(TPACPI_DRVR_SHORTNAME); | |||
7869 | #define IBM_BIOS_MODULE_ALIAS(__type) \ | 7881 | #define IBM_BIOS_MODULE_ALIAS(__type) \ |
7870 | MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*") | 7882 | MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*") |
7871 | 7883 | ||
7872 | /* Non-ancient thinkpads */ | ||
7873 | MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*"); | ||
7874 | MODULE_ALIAS("dmi:bvnLENOVO:*:svnLENOVO:*:pvrThinkPad*:rvnLENOVO:*"); | ||
7875 | |||
7876 | /* Ancient thinkpad BIOSes have to be identified by | 7884 | /* Ancient thinkpad BIOSes have to be identified by |
7877 | * BIOS type or model number, and there are far less | 7885 | * BIOS type or model number, and there are far less |
7878 | * BIOS types than model numbers... */ | 7886 | * BIOS types than model numbers... */ |
7879 | IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]"); | 7887 | IBM_BIOS_MODULE_ALIAS("I[MU]"); /* 570, 570e */ |
7880 | IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]"); | ||
7881 | IBM_BIOS_MODULE_ALIAS("K[UX-Z]"); | ||
7882 | 7888 | ||
7883 | MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh"); | 7889 | MODULE_AUTHOR("Borislav Deianov <borislav@users.sf.net>"); |
7890 | MODULE_AUTHOR("Henrique de Moraes Holschuh <hmh@hmh.eng.br>"); | ||
7884 | MODULE_DESCRIPTION(TPACPI_DESC); | 7891 | MODULE_DESCRIPTION(TPACPI_DESC); |
7885 | MODULE_VERSION(TPACPI_VERSION); | 7892 | MODULE_VERSION(TPACPI_VERSION); |
7886 | MODULE_LICENSE("GPL"); | 7893 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h index c07809c8016a..5469e099597e 100644 --- a/drivers/s390/char/tape.h +++ b/drivers/s390/char/tape.h | |||
@@ -285,7 +285,7 @@ extern int tape_mtop(struct tape_device *, int, int); | |||
285 | extern void tape_state_set(struct tape_device *, enum tape_state); | 285 | extern void tape_state_set(struct tape_device *, enum tape_state); |
286 | 286 | ||
287 | extern int tape_generic_online(struct tape_device *, struct tape_discipline *); | 287 | extern int tape_generic_online(struct tape_device *, struct tape_discipline *); |
288 | extern int tape_generic_offline(struct tape_device *device); | 288 | extern int tape_generic_offline(struct ccw_device *); |
289 | 289 | ||
290 | /* Externals from tape_devmap.c */ | 290 | /* Externals from tape_devmap.c */ |
291 | extern int tape_generic_probe(struct ccw_device *); | 291 | extern int tape_generic_probe(struct ccw_device *); |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index 807ded5eb049..5f8e8ef43dd3 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
@@ -1294,12 +1294,6 @@ tape_34xx_online(struct ccw_device *cdev) | |||
1294 | ); | 1294 | ); |
1295 | } | 1295 | } |
1296 | 1296 | ||
1297 | static int | ||
1298 | tape_34xx_offline(struct ccw_device *cdev) | ||
1299 | { | ||
1300 | return tape_generic_offline(cdev->dev.driver_data); | ||
1301 | } | ||
1302 | |||
1303 | static struct ccw_driver tape_34xx_driver = { | 1297 | static struct ccw_driver tape_34xx_driver = { |
1304 | .name = "tape_34xx", | 1298 | .name = "tape_34xx", |
1305 | .owner = THIS_MODULE, | 1299 | .owner = THIS_MODULE, |
@@ -1307,7 +1301,7 @@ static struct ccw_driver tape_34xx_driver = { | |||
1307 | .probe = tape_generic_probe, | 1301 | .probe = tape_generic_probe, |
1308 | .remove = tape_generic_remove, | 1302 | .remove = tape_generic_remove, |
1309 | .set_online = tape_34xx_online, | 1303 | .set_online = tape_34xx_online, |
1310 | .set_offline = tape_34xx_offline, | 1304 | .set_offline = tape_generic_offline, |
1311 | }; | 1305 | }; |
1312 | 1306 | ||
1313 | static int | 1307 | static int |
diff --git a/drivers/s390/char/tape_3590.c b/drivers/s390/char/tape_3590.c index fc1d91294143..823b05bd0dd7 100644 --- a/drivers/s390/char/tape_3590.c +++ b/drivers/s390/char/tape_3590.c | |||
@@ -1707,19 +1707,13 @@ tape_3590_online(struct ccw_device *cdev) | |||
1707 | &tape_discipline_3590); | 1707 | &tape_discipline_3590); |
1708 | } | 1708 | } |
1709 | 1709 | ||
1710 | static int | ||
1711 | tape_3590_offline(struct ccw_device *cdev) | ||
1712 | { | ||
1713 | return tape_generic_offline(cdev->dev.driver_data); | ||
1714 | } | ||
1715 | |||
1716 | static struct ccw_driver tape_3590_driver = { | 1710 | static struct ccw_driver tape_3590_driver = { |
1717 | .name = "tape_3590", | 1711 | .name = "tape_3590", |
1718 | .owner = THIS_MODULE, | 1712 | .owner = THIS_MODULE, |
1719 | .ids = tape_3590_ids, | 1713 | .ids = tape_3590_ids, |
1720 | .probe = tape_generic_probe, | 1714 | .probe = tape_generic_probe, |
1721 | .remove = tape_generic_remove, | 1715 | .remove = tape_generic_remove, |
1722 | .set_offline = tape_3590_offline, | 1716 | .set_offline = tape_generic_offline, |
1723 | .set_online = tape_3590_online, | 1717 | .set_online = tape_3590_online, |
1724 | }; | 1718 | }; |
1725 | 1719 | ||
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 08c09d3503cf..8a109f3b69c6 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
@@ -387,8 +387,11 @@ tape_cleanup_device(struct tape_device *device) | |||
387 | * Manual offline is only allowed while the drive is not in use. | 387 | * Manual offline is only allowed while the drive is not in use. |
388 | */ | 388 | */ |
389 | int | 389 | int |
390 | tape_generic_offline(struct tape_device *device) | 390 | tape_generic_offline(struct ccw_device *cdev) |
391 | { | 391 | { |
392 | struct tape_device *device; | ||
393 | |||
394 | device = cdev->dev.driver_data; | ||
392 | if (!device) { | 395 | if (!device) { |
393 | return -ENODEV; | 396 | return -ENODEV; |
394 | } | 397 | } |
diff --git a/drivers/scsi/a4000t.c b/drivers/scsi/a4000t.c index 61af3d91ac8a..e3519fa5a3ba 100644 --- a/drivers/scsi/a4000t.c +++ b/drivers/scsi/a4000t.c | |||
@@ -129,7 +129,7 @@ static int __init a4000t_scsi_init(void) | |||
129 | a4000t_scsi_device = platform_device_register_simple("a4000t-scsi", | 129 | a4000t_scsi_device = platform_device_register_simple("a4000t-scsi", |
130 | -1, NULL, 0); | 130 | -1, NULL, 0); |
131 | if (IS_ERR(a4000t_scsi_device)) { | 131 | if (IS_ERR(a4000t_scsi_device)) { |
132 | platform_driver_register(&a4000t_scsi_driver); | 132 | platform_driver_unregister(&a4000t_scsi_driver); |
133 | return PTR_ERR(a4000t_scsi_device); | 133 | return PTR_ERR(a4000t_scsi_device); |
134 | } | 134 | } |
135 | 135 | ||
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index 7ddff3f55087..938bc1b6c3fa 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c | |||
@@ -771,8 +771,6 @@ static int pci_netmos_init(struct pci_dev *dev) | |||
771 | } | 771 | } |
772 | 772 | ||
773 | /* | 773 | /* |
774 | * ITE support by Niels de Vos <niels.devos@wincor-nixdorf.com> | ||
775 | * | ||
776 | * These chips are available with optionally one parallel port and up to | 774 | * These chips are available with optionally one parallel port and up to |
777 | * two serial ports. Unfortunately they all have the same product id. | 775 | * two serial ports. Unfortunately they all have the same product id. |
778 | * | 776 | * |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 34e6108e1d42..0fe434505ac4 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * This driver supports USB CDC WCM Device Management. | 4 | * This driver supports USB CDC WCM Device Management. |
5 | * | 5 | * |
6 | * Copyright (c) 2007-2008 Oliver Neukum | 6 | * Copyright (c) 2007-2009 Oliver Neukum |
7 | * | 7 | * |
8 | * Some code taken from cdc-acm.c | 8 | * Some code taken from cdc-acm.c |
9 | * | 9 | * |
@@ -610,7 +610,7 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
610 | if (!buffer) | 610 | if (!buffer) |
611 | goto out; | 611 | goto out; |
612 | 612 | ||
613 | while (buflen > 0) { | 613 | while (buflen > 2) { |
614 | if (buffer [1] != USB_DT_CS_INTERFACE) { | 614 | if (buffer [1] != USB_DT_CS_INTERFACE) { |
615 | dev_err(&intf->dev, "skipping garbage\n"); | 615 | dev_err(&intf->dev, "skipping garbage\n"); |
616 | goto next_desc; | 616 | goto next_desc; |
@@ -646,16 +646,18 @@ next_desc: | |||
646 | spin_lock_init(&desc->iuspin); | 646 | spin_lock_init(&desc->iuspin); |
647 | init_waitqueue_head(&desc->wait); | 647 | init_waitqueue_head(&desc->wait); |
648 | desc->wMaxCommand = maxcom; | 648 | desc->wMaxCommand = maxcom; |
649 | /* this will be expanded and needed in hardware endianness */ | ||
649 | desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber); | 650 | desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber); |
650 | desc->intf = intf; | 651 | desc->intf = intf; |
651 | INIT_WORK(&desc->rxwork, wdm_rxwork); | 652 | INIT_WORK(&desc->rxwork, wdm_rxwork); |
652 | 653 | ||
653 | iface = &intf->altsetting[0]; | 654 | rv = -EINVAL; |
655 | iface = intf->cur_altsetting; | ||
656 | if (iface->desc.bNumEndpoints != 1) | ||
657 | goto err; | ||
654 | ep = &iface->endpoint[0].desc; | 658 | ep = &iface->endpoint[0].desc; |
655 | if (!ep || !usb_endpoint_is_int_in(ep)) { | 659 | if (!ep || !usb_endpoint_is_int_in(ep)) |
656 | rv = -EINVAL; | ||
657 | goto err; | 660 | goto err; |
658 | } | ||
659 | 661 | ||
660 | desc->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize); | 662 | desc->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize); |
661 | desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0; | 663 | desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0; |
@@ -711,12 +713,19 @@ next_desc: | |||
711 | 713 | ||
712 | usb_set_intfdata(intf, desc); | 714 | usb_set_intfdata(intf, desc); |
713 | rv = usb_register_dev(intf, &wdm_class); | 715 | rv = usb_register_dev(intf, &wdm_class); |
714 | dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n", | ||
715 | intf->minor - WDM_MINOR_BASE); | ||
716 | if (rv < 0) | 716 | if (rv < 0) |
717 | goto err; | 717 | goto err3; |
718 | else | ||
719 | dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n", | ||
720 | intf->minor - WDM_MINOR_BASE); | ||
718 | out: | 721 | out: |
719 | return rv; | 722 | return rv; |
723 | err3: | ||
724 | usb_set_intfdata(intf, NULL); | ||
725 | usb_buffer_free(interface_to_usbdev(desc->intf), | ||
726 | desc->bMaxPacketSize0, | ||
727 | desc->inbuf, | ||
728 | desc->response->transfer_dma); | ||
720 | err2: | 729 | err2: |
721 | usb_buffer_free(interface_to_usbdev(desc->intf), | 730 | usb_buffer_free(interface_to_usbdev(desc->intf), |
722 | desc->wMaxPacketSize, | 731 | desc->wMaxPacketSize, |
diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index cadb2dc1d28a..3ba2fff71490 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c | |||
@@ -119,7 +119,7 @@ void *hcd_buffer_alloc( | |||
119 | if (size <= pool_max [i]) | 119 | if (size <= pool_max [i]) |
120 | return dma_pool_alloc(hcd->pool [i], mem_flags, dma); | 120 | return dma_pool_alloc(hcd->pool [i], mem_flags, dma); |
121 | } | 121 | } |
122 | return dma_alloc_coherent(hcd->self.controller, size, dma, 0); | 122 | return dma_alloc_coherent(hcd->self.controller, size, dma, mem_flags); |
123 | } | 123 | } |
124 | 124 | ||
125 | void hcd_buffer_free( | 125 | void hcd_buffer_free( |
diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 22c65960c429..38e531ecae4d 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c | |||
@@ -51,6 +51,7 @@ | |||
51 | * - Gadget API (majority of optional features) | 51 | * - Gadget API (majority of optional features) |
52 | * - Suspend & Remote Wakeup | 52 | * - Suspend & Remote Wakeup |
53 | */ | 53 | */ |
54 | #include <linux/delay.h> | ||
54 | #include <linux/device.h> | 55 | #include <linux/device.h> |
55 | #include <linux/dmapool.h> | 56 | #include <linux/dmapool.h> |
56 | #include <linux/dma-mapping.h> | 57 | #include <linux/dma-mapping.h> |
@@ -142,7 +143,7 @@ static struct { | |||
142 | #define CAP_DEVICEADDR (0x014UL) | 143 | #define CAP_DEVICEADDR (0x014UL) |
143 | #define CAP_ENDPTLISTADDR (0x018UL) | 144 | #define CAP_ENDPTLISTADDR (0x018UL) |
144 | #define CAP_PORTSC (0x044UL) | 145 | #define CAP_PORTSC (0x044UL) |
145 | #define CAP_DEVLC (0x0B4UL) | 146 | #define CAP_DEVLC (0x084UL) |
146 | #define CAP_USBMODE (hw_bank.lpm ? 0x0C8UL : 0x068UL) | 147 | #define CAP_USBMODE (hw_bank.lpm ? 0x0C8UL : 0x068UL) |
147 | #define CAP_ENDPTSETUPSTAT (hw_bank.lpm ? 0x0D8UL : 0x06CUL) | 148 | #define CAP_ENDPTSETUPSTAT (hw_bank.lpm ? 0x0D8UL : 0x06CUL) |
148 | #define CAP_ENDPTPRIME (hw_bank.lpm ? 0x0DCUL : 0x070UL) | 149 | #define CAP_ENDPTPRIME (hw_bank.lpm ? 0x0DCUL : 0x070UL) |
@@ -1986,6 +1987,8 @@ static int ep_enable(struct usb_ep *ep, | |||
1986 | do { | 1987 | do { |
1987 | dbg_event(_usb_addr(mEp), "ENABLE", 0); | 1988 | dbg_event(_usb_addr(mEp), "ENABLE", 0); |
1988 | 1989 | ||
1990 | mEp->qh[mEp->dir].ptr->cap = 0; | ||
1991 | |||
1989 | if (mEp->type == USB_ENDPOINT_XFER_CONTROL) | 1992 | if (mEp->type == USB_ENDPOINT_XFER_CONTROL) |
1990 | mEp->qh[mEp->dir].ptr->cap |= QH_IOS; | 1993 | mEp->qh[mEp->dir].ptr->cap |= QH_IOS; |
1991 | else if (mEp->type == USB_ENDPOINT_XFER_ISOC) | 1994 | else if (mEp->type == USB_ENDPOINT_XFER_ISOC) |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 5c030b080d4c..381a53b3e11c 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
@@ -738,7 +738,6 @@ static struct fsg_dev *the_fsg; | |||
738 | static struct usb_gadget_driver fsg_driver; | 738 | static struct usb_gadget_driver fsg_driver; |
739 | 739 | ||
740 | static void close_backing_file(struct lun *curlun); | 740 | static void close_backing_file(struct lun *curlun); |
741 | static void close_all_backing_files(struct fsg_dev *fsg); | ||
742 | 741 | ||
743 | 742 | ||
744 | /*-------------------------------------------------------------------------*/ | 743 | /*-------------------------------------------------------------------------*/ |
@@ -3593,12 +3592,10 @@ static int fsg_main_thread(void *fsg_) | |||
3593 | fsg->thread_task = NULL; | 3592 | fsg->thread_task = NULL; |
3594 | spin_unlock_irq(&fsg->lock); | 3593 | spin_unlock_irq(&fsg->lock); |
3595 | 3594 | ||
3596 | /* In case we are exiting because of a signal, unregister the | 3595 | /* If we are exiting because of a signal, unregister the |
3597 | * gadget driver and close the backing file. */ | 3596 | * gadget driver. */ |
3598 | if (test_and_clear_bit(REGISTERED, &fsg->atomic_bitflags)) { | 3597 | if (test_and_clear_bit(REGISTERED, &fsg->atomic_bitflags)) |
3599 | usb_gadget_unregister_driver(&fsg_driver); | 3598 | usb_gadget_unregister_driver(&fsg_driver); |
3600 | close_all_backing_files(fsg); | ||
3601 | } | ||
3602 | 3599 | ||
3603 | /* Let the unbind and cleanup routines know the thread has exited */ | 3600 | /* Let the unbind and cleanup routines know the thread has exited */ |
3604 | complete_and_exit(&fsg->thread_notifier, 0); | 3601 | complete_and_exit(&fsg->thread_notifier, 0); |
@@ -3703,14 +3700,6 @@ static void close_backing_file(struct lun *curlun) | |||
3703 | } | 3700 | } |
3704 | } | 3701 | } |
3705 | 3702 | ||
3706 | static void close_all_backing_files(struct fsg_dev *fsg) | ||
3707 | { | ||
3708 | int i; | ||
3709 | |||
3710 | for (i = 0; i < fsg->nluns; ++i) | ||
3711 | close_backing_file(&fsg->luns[i]); | ||
3712 | } | ||
3713 | |||
3714 | 3703 | ||
3715 | static ssize_t show_ro(struct device *dev, struct device_attribute *attr, char *buf) | 3704 | static ssize_t show_ro(struct device *dev, struct device_attribute *attr, char *buf) |
3716 | { | 3705 | { |
@@ -3845,6 +3834,7 @@ static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) | |||
3845 | if (curlun->registered) { | 3834 | if (curlun->registered) { |
3846 | device_remove_file(&curlun->dev, &dev_attr_ro); | 3835 | device_remove_file(&curlun->dev, &dev_attr_ro); |
3847 | device_remove_file(&curlun->dev, &dev_attr_file); | 3836 | device_remove_file(&curlun->dev, &dev_attr_file); |
3837 | close_backing_file(curlun); | ||
3848 | device_unregister(&curlun->dev); | 3838 | device_unregister(&curlun->dev); |
3849 | curlun->registered = 0; | 3839 | curlun->registered = 0; |
3850 | } | 3840 | } |
@@ -4190,7 +4180,6 @@ autoconf_fail: | |||
4190 | out: | 4180 | out: |
4191 | fsg->state = FSG_STATE_TERMINATED; // The thread is dead | 4181 | fsg->state = FSG_STATE_TERMINATED; // The thread is dead |
4192 | fsg_unbind(gadget); | 4182 | fsg_unbind(gadget); |
4193 | close_all_backing_files(fsg); | ||
4194 | complete(&fsg->thread_notifier); | 4183 | complete(&fsg->thread_notifier); |
4195 | return rc; | 4184 | return rc; |
4196 | } | 4185 | } |
@@ -4284,7 +4273,6 @@ static void __exit fsg_cleanup(void) | |||
4284 | /* Wait for the thread to finish up */ | 4273 | /* Wait for the thread to finish up */ |
4285 | wait_for_completion(&fsg->thread_notifier); | 4274 | wait_for_completion(&fsg->thread_notifier); |
4286 | 4275 | ||
4287 | close_all_backing_files(fsg); | ||
4288 | kref_put(&fsg->ref, fsg_release); | 4276 | kref_put(&fsg->ref, fsg_release); |
4289 | } | 4277 | } |
4290 | module_exit(fsg_cleanup); | 4278 | module_exit(fsg_cleanup); |
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 57d9641c6bf8..a2db0e174f2c 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -3104,7 +3104,6 @@ static int omap_udc_resume(struct platform_device *dev) | |||
3104 | /*-------------------------------------------------------------------------*/ | 3104 | /*-------------------------------------------------------------------------*/ |
3105 | 3105 | ||
3106 | static struct platform_driver udc_driver = { | 3106 | static struct platform_driver udc_driver = { |
3107 | .probe = omap_udc_probe, | ||
3108 | .remove = __exit_p(omap_udc_remove), | 3107 | .remove = __exit_p(omap_udc_remove), |
3109 | .suspend = omap_udc_suspend, | 3108 | .suspend = omap_udc_suspend, |
3110 | .resume = omap_udc_resume, | 3109 | .resume = omap_udc_resume, |
@@ -3122,7 +3121,7 @@ static int __init udc_init(void) | |||
3122 | #endif | 3121 | #endif |
3123 | "%s\n", driver_desc, | 3122 | "%s\n", driver_desc, |
3124 | use_dma ? " (dma)" : ""); | 3123 | use_dma ? " (dma)" : ""); |
3125 | return platform_driver_register(&udc_driver); | 3124 | return platform_driver_probe(&udc_driver, omap_udc_probe); |
3126 | } | 3125 | } |
3127 | module_init(udc_init); | 3126 | module_init(udc_init); |
3128 | 3127 | ||
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index ada5d2ba297b..556d0ec0c1f8 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -323,7 +323,7 @@ static int tt_available ( | |||
323 | * already scheduled transactions | 323 | * already scheduled transactions |
324 | */ | 324 | */ |
325 | if (125 < usecs) { | 325 | if (125 < usecs) { |
326 | int ufs = (usecs / 125) - 1; | 326 | int ufs = (usecs / 125); |
327 | int i; | 327 | int i; |
328 | for (i = uframe; i < (uframe + ufs) && i < 8; i++) | 328 | for (i = uframe; i < (uframe + ufs) && i < 8; i++) |
329 | if (0 < tt_usecs[i]) { | 329 | if (0 < tt_usecs[i]) { |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 0112353ec97d..4000cf6d1e81 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -2191,7 +2191,7 @@ static int musb_resume_early(struct platform_device *pdev) | |||
2191 | 2191 | ||
2192 | #else | 2192 | #else |
2193 | #define musb_suspend NULL | 2193 | #define musb_suspend NULL |
2194 | #define musb_resume NULL | 2194 | #define musb_resume_early NULL |
2195 | #endif | 2195 | #endif |
2196 | 2196 | ||
2197 | static struct platform_driver musb_driver = { | 2197 | static struct platform_driver musb_driver = { |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 901dffdf23b1..60924ce08493 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
@@ -3,7 +3,6 @@ | |||
3 | * Some code has been taken from tusb6010.c | 3 | * Some code has been taken from tusb6010.c |
4 | * Copyrights for that are attributable to: | 4 | * Copyrights for that are attributable to: |
5 | * Copyright (C) 2006 Nokia Corporation | 5 | * Copyright (C) 2006 Nokia Corporation |
6 | * Jarkko Nikula <jarkko.nikula@nokia.com> | ||
7 | * Tony Lindgren <tony@atomide.com> | 6 | * Tony Lindgren <tony@atomide.com> |
8 | * | 7 | * |
9 | * This file is part of the Inventra Controller Driver for Linux. | 8 | * This file is part of the Inventra Controller Driver for Linux. |
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 9e20fd070d71..4ac1477d3569 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
@@ -2,7 +2,6 @@ | |||
2 | * TUSB6010 USB 2.0 OTG Dual Role controller | 2 | * TUSB6010 USB 2.0 OTG Dual Role controller |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Nokia Corporation | 4 | * Copyright (C) 2006 Nokia Corporation |
5 | * Jarkko Nikula <jarkko.nikula@nokia.com> | ||
6 | * Tony Lindgren <tony@atomide.com> | 5 | * Tony Lindgren <tony@atomide.com> |
7 | * | 6 | * |
8 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
diff --git a/drivers/usb/musb/tusb6010.h b/drivers/usb/musb/tusb6010.h index ab8c96286ce6..35c933a5d991 100644 --- a/drivers/usb/musb/tusb6010.h +++ b/drivers/usb/musb/tusb6010.h | |||
@@ -2,7 +2,6 @@ | |||
2 | * Definitions for TUSB6010 USB 2.0 OTG Dual Role controller | 2 | * Definitions for TUSB6010 USB 2.0 OTG Dual Role controller |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Nokia Corporation | 4 | * Copyright (C) 2006 Nokia Corporation |
5 | * Jarkko Nikula <jarkko.nikula@nokia.com> | ||
6 | * Tony Lindgren <tony@atomide.com> | 5 | * Tony Lindgren <tony@atomide.com> |
7 | * | 6 | * |
8 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
diff --git a/drivers/usb/otg/otg.c b/drivers/usb/otg/otg.c index ff318fae7d4d..0a43a7db750f 100644 --- a/drivers/usb/otg/otg.c +++ b/drivers/usb/otg/otg.c | |||
@@ -43,7 +43,8 @@ EXPORT_SYMBOL(otg_get_transceiver); | |||
43 | */ | 43 | */ |
44 | void otg_put_transceiver(struct otg_transceiver *x) | 44 | void otg_put_transceiver(struct otg_transceiver *x) |
45 | { | 45 | { |
46 | put_device(x->dev); | 46 | if (x) |
47 | put_device(x->dev); | ||
47 | } | 48 | } |
48 | EXPORT_SYMBOL(otg_put_transceiver); | 49 | EXPORT_SYMBOL(otg_put_transceiver); |
49 | 50 | ||
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 858bdd038fbc..dd501bb63ed6 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c | |||
@@ -175,13 +175,6 @@ static int cyberjack_open(struct tty_struct *tty, | |||
175 | dbg("%s - usb_clear_halt", __func__); | 175 | dbg("%s - usb_clear_halt", __func__); |
176 | usb_clear_halt(port->serial->dev, port->write_urb->pipe); | 176 | usb_clear_halt(port->serial->dev, port->write_urb->pipe); |
177 | 177 | ||
178 | /* force low_latency on so that our tty_push actually forces | ||
179 | * the data through, otherwise it is scheduled, and with high | ||
180 | * data rates (like with OHCI) data can get lost. | ||
181 | */ | ||
182 | if (tty) | ||
183 | tty->low_latency = 1; | ||
184 | |||
185 | priv = usb_get_serial_port_data(port); | 178 | priv = usb_get_serial_port_data(port); |
186 | spin_lock_irqsave(&priv->lock, flags); | 179 | spin_lock_irqsave(&priv->lock, flags); |
187 | priv->rdtodo = 0; | 180 | priv->rdtodo = 0; |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index eae4740d448c..e568710b263f 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -656,10 +656,6 @@ static int cypress_open(struct tty_struct *tty, | |||
656 | priv->rx_flags = 0; | 656 | priv->rx_flags = 0; |
657 | spin_unlock_irqrestore(&priv->lock, flags); | 657 | spin_unlock_irqrestore(&priv->lock, flags); |
658 | 658 | ||
659 | /* setting to zero could cause data loss */ | ||
660 | if (tty) | ||
661 | tty->low_latency = 1; | ||
662 | |||
663 | /* raise both lines and set termios */ | 659 | /* raise both lines and set termios */ |
664 | spin_lock_irqsave(&priv->lock, flags); | 660 | spin_lock_irqsave(&priv->lock, flags); |
665 | priv->line_control = CONTROL_DTR | CONTROL_RTS; | 661 | priv->line_control = CONTROL_DTR | CONTROL_RTS; |
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 8a69cce40b6d..c709ec474a80 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
@@ -478,12 +478,6 @@ static void empeg_set_termios(struct tty_struct *tty, | |||
478 | termios->c_cflag | 478 | termios->c_cflag |
479 | |= CS8; /* character size 8 bits */ | 479 | |= CS8; /* character size 8 bits */ |
480 | 480 | ||
481 | /* | ||
482 | * Force low_latency on; otherwise the pushes are scheduled; | ||
483 | * this is bad as it opens up the possibility of dropping bytes | ||
484 | * on the floor. We don't want to drop bytes on the floor. :) | ||
485 | */ | ||
486 | tty->low_latency = 1; | ||
487 | tty_encode_baud_rate(tty, 115200, 115200); | 481 | tty_encode_baud_rate(tty, 115200, 115200); |
488 | } | 482 | } |
489 | 483 | ||
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index a26a0e2cdb4a..586d30ff450b 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -973,14 +973,6 @@ static int garmin_open(struct tty_struct *tty, | |||
973 | 973 | ||
974 | dbg("%s - port %d", __func__, port->number); | 974 | dbg("%s - port %d", __func__, port->number); |
975 | 975 | ||
976 | /* | ||
977 | * Force low_latency on so that our tty_push actually forces the data | ||
978 | * through, otherwise it is scheduled, and with high data rates (like | ||
979 | * with OHCI) data can get lost. | ||
980 | */ | ||
981 | if (tty) | ||
982 | tty->low_latency = 1; | ||
983 | |||
984 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 976 | spin_lock_irqsave(&garmin_data_p->lock, flags); |
985 | garmin_data_p->mode = initial_mode; | 977 | garmin_data_p->mode = initial_mode; |
986 | garmin_data_p->count = 0; | 978 | garmin_data_p->count = 0; |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 9d57cace3731..4cec9906ccf3 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -122,12 +122,6 @@ int usb_serial_generic_open(struct tty_struct *tty, | |||
122 | 122 | ||
123 | dbg("%s - port %d", __func__, port->number); | 123 | dbg("%s - port %d", __func__, port->number); |
124 | 124 | ||
125 | /* force low_latency on so that our tty_push actually forces the data | ||
126 | through, otherwise it is scheduled, and with high data rates (like | ||
127 | with OHCI) data can get lost. */ | ||
128 | if (tty) | ||
129 | tty->low_latency = 1; | ||
130 | |||
131 | /* clear the throttle flags */ | 125 | /* clear the throttle flags */ |
132 | spin_lock_irqsave(&port->lock, flags); | 126 | spin_lock_irqsave(&port->lock, flags); |
133 | port->throttled = 0; | 127 | port->throttled = 0; |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index e85c8c0d1ad9..fb4a73d090f6 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -193,8 +193,6 @@ static const struct divisor_table_entry divisor_table[] = { | |||
193 | /* local variables */ | 193 | /* local variables */ |
194 | static int debug; | 194 | static int debug; |
195 | 195 | ||
196 | static int low_latency = 1; /* tty low latency flag, on by default */ | ||
197 | |||
198 | static atomic_t CmdUrbs; /* Number of outstanding Command Write Urbs */ | 196 | static atomic_t CmdUrbs; /* Number of outstanding Command Write Urbs */ |
199 | 197 | ||
200 | 198 | ||
@@ -867,9 +865,6 @@ static int edge_open(struct tty_struct *tty, | |||
867 | if (edge_port == NULL) | 865 | if (edge_port == NULL) |
868 | return -ENODEV; | 866 | return -ENODEV; |
869 | 867 | ||
870 | if (tty) | ||
871 | tty->low_latency = low_latency; | ||
872 | |||
873 | /* see if we've set up our endpoint info yet (can't set it up | 868 | /* see if we've set up our endpoint info yet (can't set it up |
874 | in edge_startup as the structures were not set up at that time.) */ | 869 | in edge_startup as the structures were not set up at that time.) */ |
875 | serial = port->serial; | 870 | serial = port->serial; |
@@ -3299,6 +3294,3 @@ MODULE_FIRMWARE("edgeport/down2.fw"); | |||
3299 | 3294 | ||
3300 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 3295 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
3301 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 3296 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
3302 | |||
3303 | module_param(low_latency, bool, S_IRUGO | S_IWUSR); | ||
3304 | MODULE_PARM_DESC(low_latency, "Low latency enabled or not"); | ||
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index c3cdd00ddc41..513b25e044c1 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -76,7 +76,6 @@ struct edgeport_uart_buf_desc { | |||
76 | #define EDGE_READ_URB_STOPPING 1 | 76 | #define EDGE_READ_URB_STOPPING 1 |
77 | #define EDGE_READ_URB_STOPPED 2 | 77 | #define EDGE_READ_URB_STOPPED 2 |
78 | 78 | ||
79 | #define EDGE_LOW_LATENCY 1 | ||
80 | #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */ | 79 | #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */ |
81 | 80 | ||
82 | #define EDGE_OUT_BUF_SIZE 1024 | 81 | #define EDGE_OUT_BUF_SIZE 1024 |
@@ -232,7 +231,6 @@ static unsigned short OperationalBuildNumber; | |||
232 | 231 | ||
233 | static int debug; | 232 | static int debug; |
234 | 233 | ||
235 | static int low_latency = EDGE_LOW_LATENCY; | ||
236 | static int closing_wait = EDGE_CLOSING_WAIT; | 234 | static int closing_wait = EDGE_CLOSING_WAIT; |
237 | static int ignore_cpu_rev; | 235 | static int ignore_cpu_rev; |
238 | static int default_uart_mode; /* RS232 */ | 236 | static int default_uart_mode; /* RS232 */ |
@@ -1850,9 +1848,6 @@ static int edge_open(struct tty_struct *tty, | |||
1850 | if (edge_port == NULL) | 1848 | if (edge_port == NULL) |
1851 | return -ENODEV; | 1849 | return -ENODEV; |
1852 | 1850 | ||
1853 | if (tty) | ||
1854 | tty->low_latency = low_latency; | ||
1855 | |||
1856 | port_number = port->number - port->serial->minor; | 1851 | port_number = port->number - port->serial->minor; |
1857 | switch (port_number) { | 1852 | switch (port_number) { |
1858 | case 0: | 1853 | case 0: |
@@ -3008,9 +3003,6 @@ MODULE_FIRMWARE("edgeport/down3.bin"); | |||
3008 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 3003 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
3009 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 3004 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
3010 | 3005 | ||
3011 | module_param(low_latency, bool, S_IRUGO | S_IWUSR); | ||
3012 | MODULE_PARM_DESC(low_latency, "Low latency enabled or not"); | ||
3013 | |||
3014 | module_param(closing_wait, int, S_IRUGO | S_IWUSR); | 3006 | module_param(closing_wait, int, S_IRUGO | S_IWUSR); |
3015 | MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs"); | 3007 | MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs"); |
3016 | 3008 | ||
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index ef92095b0732..cd62825a9ac3 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -631,13 +631,7 @@ static int ipaq_open(struct tty_struct *tty, | |||
631 | priv->free_len += PACKET_SIZE; | 631 | priv->free_len += PACKET_SIZE; |
632 | } | 632 | } |
633 | 633 | ||
634 | /* | ||
635 | * Force low latency on. This will immediately push data to the line | ||
636 | * discipline instead of queueing. | ||
637 | */ | ||
638 | |||
639 | if (tty) { | 634 | if (tty) { |
640 | tty->low_latency = 1; | ||
641 | /* FIXME: These two are bogus */ | 635 | /* FIXME: These two are bogus */ |
642 | tty->raw = 1; | 636 | tty->raw = 1; |
643 | tty->real_raw = 1; | 637 | tty->real_raw = 1; |
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index f530032ed93d..da2a2b46644a 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -207,9 +207,6 @@ static int ipw_open(struct tty_struct *tty, | |||
207 | if (!buf_flow_init) | 207 | if (!buf_flow_init) |
208 | return -ENOMEM; | 208 | return -ENOMEM; |
209 | 209 | ||
210 | if (tty) | ||
211 | tty->low_latency = 1; | ||
212 | |||
213 | /* --1: Tell the modem to initialize (we think) From sniffs this is | 210 | /* --1: Tell the modem to initialize (we think) From sniffs this is |
214 | * always the first thing that gets sent to the modem during | 211 | * always the first thing that gets sent to the modem during |
215 | * opening of the device */ | 212 | * opening of the device */ |
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 2314c6ae4fc2..4473d442b2aa 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
@@ -1051,7 +1051,6 @@ static int iuu_open(struct tty_struct *tty, | |||
1051 | tty->termios->c_oflag = 0; | 1051 | tty->termios->c_oflag = 0; |
1052 | tty->termios->c_iflag = 0; | 1052 | tty->termios->c_iflag = 0; |
1053 | priv->termios_initialized = 1; | 1053 | priv->termios_initialized = 1; |
1054 | tty->low_latency = 1; | ||
1055 | priv->poll = 0; | 1054 | priv->poll = 0; |
1056 | } | 1055 | } |
1057 | spin_unlock_irqrestore(&priv->lock, flags); | 1056 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 6286baad9392..c148544953b3 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -231,13 +231,7 @@ static int kobil_open(struct tty_struct *tty, | |||
231 | /* someone sets the dev to 0 if the close method has been called */ | 231 | /* someone sets the dev to 0 if the close method has been called */ |
232 | port->interrupt_in_urb->dev = port->serial->dev; | 232 | port->interrupt_in_urb->dev = port->serial->dev; |
233 | 233 | ||
234 | |||
235 | /* force low_latency on so that our tty_push actually forces | ||
236 | * the data through, otherwise it is scheduled, and with high | ||
237 | * data rates (like with OHCI) data can get lost. | ||
238 | */ | ||
239 | if (tty) { | 234 | if (tty) { |
240 | tty->low_latency = 1; | ||
241 | 235 | ||
242 | /* Default to echo off and other sane device settings */ | 236 | /* Default to echo off and other sane device settings */ |
243 | tty->termios->c_lflag = 0; | 237 | tty->termios->c_lflag = 0; |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index e772cc0a97fd..24e3b5d4b4d4 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -446,13 +446,6 @@ static int mos7720_open(struct tty_struct *tty, | |||
446 | data = 0x0c; | 446 | data = 0x0c; |
447 | send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); | 447 | send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data); |
448 | 448 | ||
449 | /* force low_latency on so that our tty_push actually forces * | ||
450 | * the data through,otherwise it is scheduled, and with * | ||
451 | * high data rates (like with OHCI) data can get lost. */ | ||
452 | |||
453 | if (tty) | ||
454 | tty->low_latency = 1; | ||
455 | |||
456 | /* see if we've set up our endpoint info yet * | 449 | /* see if we've set up our endpoint info yet * |
457 | * (can't set it up in mos7720_startup as the * | 450 | * (can't set it up in mos7720_startup as the * |
458 | * structures were not set up at that time.) */ | 451 | * structures were not set up at that time.) */ |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 2c20e88a91b3..84fb1dcd30dc 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -38,7 +38,7 @@ | |||
38 | /* | 38 | /* |
39 | * Version Information | 39 | * Version Information |
40 | */ | 40 | */ |
41 | #define DRIVER_VERSION "1.3.1" | 41 | #define DRIVER_VERSION "1.3.2" |
42 | #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" | 42 | #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" |
43 | 43 | ||
44 | /* | 44 | /* |
@@ -123,6 +123,11 @@ | |||
123 | #define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 | 123 | #define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 |
124 | #define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 | 124 | #define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 |
125 | 125 | ||
126 | /* This driver also supports the ATEN UC2324 device since it is mos7840 based | ||
127 | * - if I knew the device id it would also support the ATEN UC2322 */ | ||
128 | #define USB_VENDOR_ID_ATENINTL 0x0557 | ||
129 | #define ATENINTL_DEVICE_ID_UC2324 0x2011 | ||
130 | |||
126 | /* Interrupt Routine Defines */ | 131 | /* Interrupt Routine Defines */ |
127 | 132 | ||
128 | #define SERIAL_IIR_RLS 0x06 | 133 | #define SERIAL_IIR_RLS 0x06 |
@@ -170,6 +175,7 @@ static struct usb_device_id moschip_port_id_table[] = { | |||
170 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, | 175 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, |
171 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, | 176 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, |
172 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, | 177 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, |
178 | {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, | ||
173 | {} /* terminating entry */ | 179 | {} /* terminating entry */ |
174 | }; | 180 | }; |
175 | 181 | ||
@@ -178,6 +184,7 @@ static __devinitdata struct usb_device_id moschip_id_table_combined[] = { | |||
178 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, | 184 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, |
179 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, | 185 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, |
180 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, | 186 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, |
187 | {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, | ||
181 | {} /* terminating entry */ | 188 | {} /* terminating entry */ |
182 | }; | 189 | }; |
183 | 190 | ||
@@ -1000,12 +1007,6 @@ static int mos7840_open(struct tty_struct *tty, | |||
1000 | status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, | 1007 | status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, |
1001 | Data); | 1008 | Data); |
1002 | 1009 | ||
1003 | /* force low_latency on so that our tty_push actually forces * | ||
1004 | * the data through,otherwise it is scheduled, and with * | ||
1005 | * high data rates (like with OHCI) data can get lost. */ | ||
1006 | if (tty) | ||
1007 | tty->low_latency = 1; | ||
1008 | |||
1009 | /* Check to see if we've set up our endpoint info yet * | 1010 | /* Check to see if we've set up our endpoint info yet * |
1010 | * (can't set it up in mos7840_startup as the structures * | 1011 | * (can't set it up in mos7840_startup as the structures * |
1011 | * were not set up at that time.) */ | 1012 | * were not set up at that time.) */ |
@@ -2477,9 +2478,14 @@ static int mos7840_startup(struct usb_serial *serial) | |||
2477 | mos7840_set_port_private(serial->port[i], mos7840_port); | 2478 | mos7840_set_port_private(serial->port[i], mos7840_port); |
2478 | spin_lock_init(&mos7840_port->pool_lock); | 2479 | spin_lock_init(&mos7840_port->pool_lock); |
2479 | 2480 | ||
2480 | mos7840_port->port_num = ((serial->port[i]->number - | 2481 | /* minor is not initialised until later by |
2481 | (serial->port[i]->serial->minor)) + | 2482 | * usb-serial.c:get_free_serial() and cannot therefore be used |
2482 | 1); | 2483 | * to index device instances */ |
2484 | mos7840_port->port_num = i + 1; | ||
2485 | dbg ("serial->port[i]->number = %d", serial->port[i]->number); | ||
2486 | dbg ("serial->port[i]->serial->minor = %d", serial->port[i]->serial->minor); | ||
2487 | dbg ("mos7840_port->port_num = %d", mos7840_port->port_num); | ||
2488 | dbg ("serial->minor = %d", serial->minor); | ||
2483 | 2489 | ||
2484 | if (mos7840_port->port_num == 1) { | 2490 | if (mos7840_port->port_num == 1) { |
2485 | mos7840_port->SpRegOffset = 0x0; | 2491 | mos7840_port->SpRegOffset = 0x0; |
@@ -2690,13 +2696,16 @@ static void mos7840_shutdown(struct usb_serial *serial) | |||
2690 | 2696 | ||
2691 | for (i = 0; i < serial->num_ports; ++i) { | 2697 | for (i = 0; i < serial->num_ports; ++i) { |
2692 | mos7840_port = mos7840_get_port_private(serial->port[i]); | 2698 | mos7840_port = mos7840_get_port_private(serial->port[i]); |
2693 | spin_lock_irqsave(&mos7840_port->pool_lock, flags); | 2699 | dbg ("mos7840_port %d = %p", i, mos7840_port); |
2694 | mos7840_port->zombie = 1; | 2700 | if (mos7840_port) { |
2695 | spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); | 2701 | spin_lock_irqsave(&mos7840_port->pool_lock, flags); |
2696 | usb_kill_urb(mos7840_port->control_urb); | 2702 | mos7840_port->zombie = 1; |
2697 | kfree(mos7840_port->ctrl_buf); | 2703 | spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); |
2698 | kfree(mos7840_port->dr); | 2704 | usb_kill_urb(mos7840_port->control_urb); |
2699 | kfree(mos7840_port); | 2705 | kfree(mos7840_port->ctrl_buf); |
2706 | kfree(mos7840_port->dr); | ||
2707 | kfree(mos7840_port); | ||
2708 | } | ||
2700 | mos7840_set_port_private(serial->port[i], NULL); | 2709 | mos7840_set_port_private(serial->port[i], NULL); |
2701 | } | 2710 | } |
2702 | 2711 | ||
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index 839583dc8b6a..b500ad10b758 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c | |||
@@ -159,14 +159,6 @@ static int opticon_open(struct tty_struct *tty, struct usb_serial_port *port, | |||
159 | priv->port = port; | 159 | priv->port = port; |
160 | spin_unlock_irqrestore(&priv->lock, flags); | 160 | spin_unlock_irqrestore(&priv->lock, flags); |
161 | 161 | ||
162 | /* | ||
163 | * Force low_latency on so that our tty_push actually forces the data | ||
164 | * through, otherwise it is scheduled, and with high data rates (like | ||
165 | * with OHCI) data can get lost. | ||
166 | */ | ||
167 | if (tty) | ||
168 | tty->low_latency = 1; | ||
169 | |||
170 | /* Start reading from the device */ | 162 | /* Start reading from the device */ |
171 | usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev, | 163 | usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev, |
172 | usb_rcvbulkpipe(priv->udev, | 164 | usb_rcvbulkpipe(priv->udev, |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 47bd070f24b7..7817b82889ca 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -936,9 +936,6 @@ static int option_open(struct tty_struct *tty, | |||
936 | usb_pipeout(urb->pipe), 0); */ | 936 | usb_pipeout(urb->pipe), 0); */ |
937 | } | 937 | } |
938 | 938 | ||
939 | if (tty) | ||
940 | tty->low_latency = 1; | ||
941 | |||
942 | option_send_setup(tty, port); | 939 | option_send_setup(tty, port); |
943 | 940 | ||
944 | return 0; | 941 | return 0; |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index d9bf9a5c20ec..913225c61610 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -14,7 +14,7 @@ | |||
14 | Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> | 14 | Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #define DRIVER_VERSION "v.1.3.2" | 17 | #define DRIVER_VERSION "v.1.3.3" |
18 | #define DRIVER_AUTHOR "Kevin Lloyd <klloyd@sierrawireless.com>" | 18 | #define DRIVER_AUTHOR "Kevin Lloyd <klloyd@sierrawireless.com>" |
19 | #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" | 19 | #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" |
20 | 20 | ||
@@ -259,9 +259,21 @@ static int sierra_send_setup(struct tty_struct *tty, | |||
259 | val |= 0x02; | 259 | val |= 0x02; |
260 | 260 | ||
261 | /* If composite device then properly report interface */ | 261 | /* If composite device then properly report interface */ |
262 | if (serial->num_ports == 1) | 262 | if (serial->num_ports == 1) { |
263 | interface = sierra_calc_interface(serial); | 263 | interface = sierra_calc_interface(serial); |
264 | 264 | ||
265 | /* Control message is sent only to interfaces with | ||
266 | * interrupt_in endpoints | ||
267 | */ | ||
268 | if (port->interrupt_in_urb) { | ||
269 | /* send control message */ | ||
270 | return usb_control_msg(serial->dev, | ||
271 | usb_rcvctrlpipe(serial->dev, 0), | ||
272 | 0x22, 0x21, val, interface, | ||
273 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
274 | } | ||
275 | } | ||
276 | |||
265 | /* Otherwise the need to do non-composite mapping */ | 277 | /* Otherwise the need to do non-composite mapping */ |
266 | else { | 278 | else { |
267 | if (port->bulk_out_endpointAddress == 2) | 279 | if (port->bulk_out_endpointAddress == 2) |
@@ -270,12 +282,13 @@ static int sierra_send_setup(struct tty_struct *tty, | |||
270 | interface = 1; | 282 | interface = 1; |
271 | else if (port->bulk_out_endpointAddress == 5) | 283 | else if (port->bulk_out_endpointAddress == 5) |
272 | interface = 2; | 284 | interface = 2; |
273 | } | ||
274 | 285 | ||
275 | return usb_control_msg(serial->dev, | 286 | return usb_control_msg(serial->dev, |
276 | usb_rcvctrlpipe(serial->dev, 0), | 287 | usb_rcvctrlpipe(serial->dev, 0), |
277 | 0x22, 0x21, val, interface, | 288 | 0x22, 0x21, val, interface, |
278 | NULL, 0, USB_CTRL_SET_TIMEOUT); | 289 | NULL, 0, USB_CTRL_SET_TIMEOUT); |
290 | |||
291 | } | ||
279 | } | 292 | } |
280 | 293 | ||
281 | return 0; | 294 | return 0; |
@@ -585,9 +598,6 @@ static int sierra_open(struct tty_struct *tty, | |||
585 | } | 598 | } |
586 | } | 599 | } |
587 | 600 | ||
588 | if (tty) | ||
589 | tty->low_latency = 1; | ||
590 | |||
591 | sierra_send_setup(tty, port); | 601 | sierra_send_setup(tty, port); |
592 | 602 | ||
593 | /* start up the interrupt endpoint if we have one */ | 603 | /* start up the interrupt endpoint if we have one */ |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 9c4c700c7cc6..0a64bac306ee 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -50,11 +50,10 @@ | |||
50 | 50 | ||
51 | #define TI_TRANSFER_TIMEOUT 2 | 51 | #define TI_TRANSFER_TIMEOUT 2 |
52 | 52 | ||
53 | #define TI_DEFAULT_LOW_LATENCY 0 | ||
54 | #define TI_DEFAULT_CLOSING_WAIT 4000 /* in .01 secs */ | 53 | #define TI_DEFAULT_CLOSING_WAIT 4000 /* in .01 secs */ |
55 | 54 | ||
56 | /* supported setserial flags */ | 55 | /* supported setserial flags */ |
57 | #define TI_SET_SERIAL_FLAGS (ASYNC_LOW_LATENCY) | 56 | #define TI_SET_SERIAL_FLAGS 0 |
58 | 57 | ||
59 | /* read urb states */ | 58 | /* read urb states */ |
60 | #define TI_READ_URB_RUNNING 0 | 59 | #define TI_READ_URB_RUNNING 0 |
@@ -161,7 +160,6 @@ static int ti_buf_get(struct circ_buf *cb, char *buf, int count); | |||
161 | 160 | ||
162 | /* module parameters */ | 161 | /* module parameters */ |
163 | static int debug; | 162 | static int debug; |
164 | static int low_latency = TI_DEFAULT_LOW_LATENCY; | ||
165 | static int closing_wait = TI_DEFAULT_CLOSING_WAIT; | 163 | static int closing_wait = TI_DEFAULT_CLOSING_WAIT; |
166 | static ushort vendor_3410[TI_EXTRA_VID_PID_COUNT]; | 164 | static ushort vendor_3410[TI_EXTRA_VID_PID_COUNT]; |
167 | static unsigned int vendor_3410_count; | 165 | static unsigned int vendor_3410_count; |
@@ -296,10 +294,6 @@ MODULE_FIRMWARE("mts_edge.fw"); | |||
296 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 294 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
297 | MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes"); | 295 | MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes"); |
298 | 296 | ||
299 | module_param(low_latency, bool, S_IRUGO | S_IWUSR); | ||
300 | MODULE_PARM_DESC(low_latency, | ||
301 | "TTY low_latency flag, 0=off, 1=on, default is off"); | ||
302 | |||
303 | module_param(closing_wait, int, S_IRUGO | S_IWUSR); | 297 | module_param(closing_wait, int, S_IRUGO | S_IWUSR); |
304 | MODULE_PARM_DESC(closing_wait, | 298 | MODULE_PARM_DESC(closing_wait, |
305 | "Maximum wait for data to drain in close, in .01 secs, default is 4000"); | 299 | "Maximum wait for data to drain in close, in .01 secs, default is 4000"); |
@@ -448,7 +442,6 @@ static int ti_startup(struct usb_serial *serial) | |||
448 | spin_lock_init(&tport->tp_lock); | 442 | spin_lock_init(&tport->tp_lock); |
449 | tport->tp_uart_base_addr = (i == 0 ? | 443 | tport->tp_uart_base_addr = (i == 0 ? |
450 | TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); | 444 | TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); |
451 | tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0; | ||
452 | tport->tp_closing_wait = closing_wait; | 445 | tport->tp_closing_wait = closing_wait; |
453 | init_waitqueue_head(&tport->tp_msr_wait); | 446 | init_waitqueue_head(&tport->tp_msr_wait); |
454 | init_waitqueue_head(&tport->tp_write_wait); | 447 | init_waitqueue_head(&tport->tp_write_wait); |
@@ -528,10 +521,6 @@ static int ti_open(struct tty_struct *tty, | |||
528 | if (mutex_lock_interruptible(&tdev->td_open_close_lock)) | 521 | if (mutex_lock_interruptible(&tdev->td_open_close_lock)) |
529 | return -ERESTARTSYS; | 522 | return -ERESTARTSYS; |
530 | 523 | ||
531 | if (tty) | ||
532 | tty->low_latency = | ||
533 | (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0; | ||
534 | |||
535 | port_number = port->number - port->serial->minor; | 524 | port_number = port->number - port->serial->minor; |
536 | 525 | ||
537 | memset(&(tport->tp_icount), 0x00, sizeof(tport->tp_icount)); | 526 | memset(&(tport->tp_icount), 0x00, sizeof(tport->tp_icount)); |
@@ -1454,7 +1443,6 @@ static int ti_set_serial_info(struct tty_struct *tty, struct ti_port *tport, | |||
1454 | return -EFAULT; | 1443 | return -EFAULT; |
1455 | 1444 | ||
1456 | tport->tp_flags = new_serial.flags & TI_SET_SERIAL_FLAGS; | 1445 | tport->tp_flags = new_serial.flags & TI_SET_SERIAL_FLAGS; |
1457 | tty->low_latency = (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0; | ||
1458 | tport->tp_closing_wait = new_serial.closing_wait; | 1446 | tport->tp_closing_wait = new_serial.closing_wait; |
1459 | 1447 | ||
1460 | return 0; | 1448 | return 0; |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 2a70563bbee1..0a566eea49c0 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -137,22 +137,10 @@ static void destroy_serial(struct kref *kref) | |||
137 | 137 | ||
138 | dbg("%s - %s", __func__, serial->type->description); | 138 | dbg("%s - %s", __func__, serial->type->description); |
139 | 139 | ||
140 | serial->type->shutdown(serial); | ||
141 | |||
142 | /* return the minor range that this device had */ | 140 | /* return the minor range that this device had */ |
143 | if (serial->minor != SERIAL_TTY_NO_MINOR) | 141 | if (serial->minor != SERIAL_TTY_NO_MINOR) |
144 | return_serial(serial); | 142 | return_serial(serial); |
145 | 143 | ||
146 | for (i = 0; i < serial->num_ports; ++i) | ||
147 | serial->port[i]->port.count = 0; | ||
148 | |||
149 | /* the ports are cleaned up and released in port_release() */ | ||
150 | for (i = 0; i < serial->num_ports; ++i) | ||
151 | if (serial->port[i]->dev.parent != NULL) { | ||
152 | device_unregister(&serial->port[i]->dev); | ||
153 | serial->port[i] = NULL; | ||
154 | } | ||
155 | |||
156 | /* If this is a "fake" port, we have to clean it up here, as it will | 144 | /* If this is a "fake" port, we have to clean it up here, as it will |
157 | * not get cleaned up in port_release() as it was never registered with | 145 | * not get cleaned up in port_release() as it was never registered with |
158 | * the driver core */ | 146 | * the driver core */ |
@@ -187,7 +175,7 @@ static int serial_open (struct tty_struct *tty, struct file *filp) | |||
187 | struct usb_serial *serial; | 175 | struct usb_serial *serial; |
188 | struct usb_serial_port *port; | 176 | struct usb_serial_port *port; |
189 | unsigned int portNumber; | 177 | unsigned int portNumber; |
190 | int retval; | 178 | int retval = 0; |
191 | 179 | ||
192 | dbg("%s", __func__); | 180 | dbg("%s", __func__); |
193 | 181 | ||
@@ -198,21 +186,24 @@ static int serial_open (struct tty_struct *tty, struct file *filp) | |||
198 | return -ENODEV; | 186 | return -ENODEV; |
199 | } | 187 | } |
200 | 188 | ||
189 | mutex_lock(&serial->disc_mutex); | ||
201 | portNumber = tty->index - serial->minor; | 190 | portNumber = tty->index - serial->minor; |
202 | port = serial->port[portNumber]; | 191 | port = serial->port[portNumber]; |
203 | if (!port) { | 192 | if (!port || serial->disconnected) |
204 | retval = -ENODEV; | ||
205 | goto bailout_kref_put; | ||
206 | } | ||
207 | |||
208 | if (port->serial->disconnected) { | ||
209 | retval = -ENODEV; | 193 | retval = -ENODEV; |
210 | goto bailout_kref_put; | 194 | else |
211 | } | 195 | get_device(&port->dev); |
196 | /* | ||
197 | * Note: Our locking order requirement does not allow port->mutex | ||
198 | * to be acquired while serial->disc_mutex is held. | ||
199 | */ | ||
200 | mutex_unlock(&serial->disc_mutex); | ||
201 | if (retval) | ||
202 | goto bailout_serial_put; | ||
212 | 203 | ||
213 | if (mutex_lock_interruptible(&port->mutex)) { | 204 | if (mutex_lock_interruptible(&port->mutex)) { |
214 | retval = -ERESTARTSYS; | 205 | retval = -ERESTARTSYS; |
215 | goto bailout_kref_put; | 206 | goto bailout_port_put; |
216 | } | 207 | } |
217 | 208 | ||
218 | ++port->port.count; | 209 | ++port->port.count; |
@@ -232,14 +223,20 @@ static int serial_open (struct tty_struct *tty, struct file *filp) | |||
232 | goto bailout_mutex_unlock; | 223 | goto bailout_mutex_unlock; |
233 | } | 224 | } |
234 | 225 | ||
235 | retval = usb_autopm_get_interface(serial->interface); | 226 | mutex_lock(&serial->disc_mutex); |
227 | if (serial->disconnected) | ||
228 | retval = -ENODEV; | ||
229 | else | ||
230 | retval = usb_autopm_get_interface(serial->interface); | ||
236 | if (retval) | 231 | if (retval) |
237 | goto bailout_module_put; | 232 | goto bailout_module_put; |
233 | |||
238 | /* only call the device specific open if this | 234 | /* only call the device specific open if this |
239 | * is the first time the port is opened */ | 235 | * is the first time the port is opened */ |
240 | retval = serial->type->open(tty, port, filp); | 236 | retval = serial->type->open(tty, port, filp); |
241 | if (retval) | 237 | if (retval) |
242 | goto bailout_interface_put; | 238 | goto bailout_interface_put; |
239 | mutex_unlock(&serial->disc_mutex); | ||
243 | } | 240 | } |
244 | 241 | ||
245 | mutex_unlock(&port->mutex); | 242 | mutex_unlock(&port->mutex); |
@@ -248,13 +245,16 @@ static int serial_open (struct tty_struct *tty, struct file *filp) | |||
248 | bailout_interface_put: | 245 | bailout_interface_put: |
249 | usb_autopm_put_interface(serial->interface); | 246 | usb_autopm_put_interface(serial->interface); |
250 | bailout_module_put: | 247 | bailout_module_put: |
248 | mutex_unlock(&serial->disc_mutex); | ||
251 | module_put(serial->type->driver.owner); | 249 | module_put(serial->type->driver.owner); |
252 | bailout_mutex_unlock: | 250 | bailout_mutex_unlock: |
253 | port->port.count = 0; | 251 | port->port.count = 0; |
254 | tty->driver_data = NULL; | 252 | tty->driver_data = NULL; |
255 | tty_port_tty_set(&port->port, NULL); | 253 | tty_port_tty_set(&port->port, NULL); |
256 | mutex_unlock(&port->mutex); | 254 | mutex_unlock(&port->mutex); |
257 | bailout_kref_put: | 255 | bailout_port_put: |
256 | put_device(&port->dev); | ||
257 | bailout_serial_put: | ||
258 | usb_serial_put(serial); | 258 | usb_serial_put(serial); |
259 | return retval; | 259 | return retval; |
260 | } | 260 | } |
@@ -262,6 +262,9 @@ bailout_kref_put: | |||
262 | static void serial_close(struct tty_struct *tty, struct file *filp) | 262 | static void serial_close(struct tty_struct *tty, struct file *filp) |
263 | { | 263 | { |
264 | struct usb_serial_port *port = tty->driver_data; | 264 | struct usb_serial_port *port = tty->driver_data; |
265 | struct usb_serial *serial; | ||
266 | struct module *owner; | ||
267 | int count; | ||
265 | 268 | ||
266 | if (!port) | 269 | if (!port) |
267 | return; | 270 | return; |
@@ -269,6 +272,8 @@ static void serial_close(struct tty_struct *tty, struct file *filp) | |||
269 | dbg("%s - port %d", __func__, port->number); | 272 | dbg("%s - port %d", __func__, port->number); |
270 | 273 | ||
271 | mutex_lock(&port->mutex); | 274 | mutex_lock(&port->mutex); |
275 | serial = port->serial; | ||
276 | owner = serial->type->driver.owner; | ||
272 | 277 | ||
273 | if (port->port.count == 0) { | 278 | if (port->port.count == 0) { |
274 | mutex_unlock(&port->mutex); | 279 | mutex_unlock(&port->mutex); |
@@ -281,7 +286,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp) | |||
281 | * this before we drop the port count. The call is protected | 286 | * this before we drop the port count. The call is protected |
282 | * by the port mutex | 287 | * by the port mutex |
283 | */ | 288 | */ |
284 | port->serial->type->close(tty, port, filp); | 289 | serial->type->close(tty, port, filp); |
285 | 290 | ||
286 | if (port->port.count == (port->console ? 2 : 1)) { | 291 | if (port->port.count == (port->console ? 2 : 1)) { |
287 | struct tty_struct *tty = tty_port_tty_get(&port->port); | 292 | struct tty_struct *tty = tty_port_tty_get(&port->port); |
@@ -295,17 +300,23 @@ static void serial_close(struct tty_struct *tty, struct file *filp) | |||
295 | } | 300 | } |
296 | } | 301 | } |
297 | 302 | ||
298 | if (port->port.count == 1) { | ||
299 | mutex_lock(&port->serial->disc_mutex); | ||
300 | if (!port->serial->disconnected) | ||
301 | usb_autopm_put_interface(port->serial->interface); | ||
302 | mutex_unlock(&port->serial->disc_mutex); | ||
303 | module_put(port->serial->type->driver.owner); | ||
304 | } | ||
305 | --port->port.count; | 303 | --port->port.count; |
306 | 304 | count = port->port.count; | |
307 | mutex_unlock(&port->mutex); | 305 | mutex_unlock(&port->mutex); |
308 | usb_serial_put(port->serial); | 306 | put_device(&port->dev); |
307 | |||
308 | /* Mustn't dereference port any more */ | ||
309 | if (count == 0) { | ||
310 | mutex_lock(&serial->disc_mutex); | ||
311 | if (!serial->disconnected) | ||
312 | usb_autopm_put_interface(serial->interface); | ||
313 | mutex_unlock(&serial->disc_mutex); | ||
314 | } | ||
315 | usb_serial_put(serial); | ||
316 | |||
317 | /* Mustn't dereference serial any more */ | ||
318 | if (count == 0) | ||
319 | module_put(owner); | ||
309 | } | 320 | } |
310 | 321 | ||
311 | static int serial_write(struct tty_struct *tty, const unsigned char *buf, | 322 | static int serial_write(struct tty_struct *tty, const unsigned char *buf, |
@@ -549,7 +560,13 @@ static void kill_traffic(struct usb_serial_port *port) | |||
549 | 560 | ||
550 | static void port_free(struct usb_serial_port *port) | 561 | static void port_free(struct usb_serial_port *port) |
551 | { | 562 | { |
563 | /* | ||
564 | * Stop all the traffic before cancelling the work, so that | ||
565 | * nobody will restart it by calling usb_serial_port_softint. | ||
566 | */ | ||
552 | kill_traffic(port); | 567 | kill_traffic(port); |
568 | cancel_work_sync(&port->work); | ||
569 | |||
553 | usb_free_urb(port->read_urb); | 570 | usb_free_urb(port->read_urb); |
554 | usb_free_urb(port->write_urb); | 571 | usb_free_urb(port->write_urb); |
555 | usb_free_urb(port->interrupt_in_urb); | 572 | usb_free_urb(port->interrupt_in_urb); |
@@ -558,7 +575,6 @@ static void port_free(struct usb_serial_port *port) | |||
558 | kfree(port->bulk_out_buffer); | 575 | kfree(port->bulk_out_buffer); |
559 | kfree(port->interrupt_in_buffer); | 576 | kfree(port->interrupt_in_buffer); |
560 | kfree(port->interrupt_out_buffer); | 577 | kfree(port->interrupt_out_buffer); |
561 | flush_scheduled_work(); /* port->work */ | ||
562 | kfree(port); | 578 | kfree(port); |
563 | } | 579 | } |
564 | 580 | ||
@@ -1043,6 +1059,12 @@ void usb_serial_disconnect(struct usb_interface *interface) | |||
1043 | usb_set_intfdata(interface, NULL); | 1059 | usb_set_intfdata(interface, NULL); |
1044 | /* must set a flag, to signal subdrivers */ | 1060 | /* must set a flag, to signal subdrivers */ |
1045 | serial->disconnected = 1; | 1061 | serial->disconnected = 1; |
1062 | mutex_unlock(&serial->disc_mutex); | ||
1063 | |||
1064 | /* Unfortunately, many of the sub-drivers expect the port structures | ||
1065 | * to exist when their shutdown method is called, so we have to go | ||
1066 | * through this awkward two-step unregistration procedure. | ||
1067 | */ | ||
1046 | for (i = 0; i < serial->num_ports; ++i) { | 1068 | for (i = 0; i < serial->num_ports; ++i) { |
1047 | port = serial->port[i]; | 1069 | port = serial->port[i]; |
1048 | if (port) { | 1070 | if (port) { |
@@ -1052,11 +1074,21 @@ void usb_serial_disconnect(struct usb_interface *interface) | |||
1052 | tty_kref_put(tty); | 1074 | tty_kref_put(tty); |
1053 | } | 1075 | } |
1054 | kill_traffic(port); | 1076 | kill_traffic(port); |
1077 | cancel_work_sync(&port->work); | ||
1078 | device_del(&port->dev); | ||
1079 | } | ||
1080 | } | ||
1081 | serial->type->shutdown(serial); | ||
1082 | for (i = 0; i < serial->num_ports; ++i) { | ||
1083 | port = serial->port[i]; | ||
1084 | if (port) { | ||
1085 | put_device(&port->dev); | ||
1086 | serial->port[i] = NULL; | ||
1055 | } | 1087 | } |
1056 | } | 1088 | } |
1089 | |||
1057 | /* let the last holder of this object | 1090 | /* let the last holder of this object |
1058 | * cause it to be cleaned up */ | 1091 | * cause it to be cleaned up */ |
1059 | mutex_unlock(&serial->disc_mutex); | ||
1060 | usb_serial_put(serial); | 1092 | usb_serial_put(serial); |
1061 | dev_info(dev, "device disconnected\n"); | 1093 | dev_info(dev, "device disconnected\n"); |
1062 | } | 1094 | } |
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 4facce3d9364..5ac414bda718 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
@@ -296,14 +296,6 @@ static int visor_open(struct tty_struct *tty, struct usb_serial_port *port, | |||
296 | priv->throttled = 0; | 296 | priv->throttled = 0; |
297 | spin_unlock_irqrestore(&priv->lock, flags); | 297 | spin_unlock_irqrestore(&priv->lock, flags); |
298 | 298 | ||
299 | /* | ||
300 | * Force low_latency on so that our tty_push actually forces the data | ||
301 | * through, otherwise it is scheduled, and with high data rates (like | ||
302 | * with OHCI) data can get lost. | ||
303 | */ | ||
304 | if (tty) | ||
305 | tty->low_latency = 1; | ||
306 | |||
307 | /* Start reading from the device */ | 299 | /* Start reading from the device */ |
308 | usb_fill_bulk_urb(port->read_urb, serial->dev, | 300 | usb_fill_bulk_urb(port->read_urb, serial->dev, |
309 | usb_rcvbulkpipe(serial->dev, | 301 | usb_rcvbulkpipe(serial->dev, |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 96db479d1165..fa65a3b08601 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1851,6 +1851,12 @@ UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001, | |||
1851 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1851 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1852 | US_FL_CAPACITY_HEURISTICS), | 1852 | US_FL_CAPACITY_HEURISTICS), |
1853 | 1853 | ||
1854 | /* Reported by Alessio Treglia <quadrispro@ubuntu.com> */ | ||
1855 | UNUSUAL_DEV( 0xed10, 0x7636, 0x0001, 0x0001, | ||
1856 | "TGE", | ||
1857 | "Digital MP3 Audio Player", | ||
1858 | US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ), | ||
1859 | |||
1854 | /* Control/Bulk transport for all SubClass values */ | 1860 | /* Control/Bulk transport for all SubClass values */ |
1855 | USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR), | 1861 | USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR), |
1856 | USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR), | 1862 | USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR), |
diff --git a/drivers/watchdog/orion5x_wdt.c b/drivers/watchdog/orion5x_wdt.c index 7529616739d2..2cde568e4fb0 100644 --- a/drivers/watchdog/orion5x_wdt.c +++ b/drivers/watchdog/orion5x_wdt.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/uaccess.h> | 22 | #include <linux/uaccess.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
25 | #include <mach/bridge-regs.h> | ||
25 | #include <plat/orion5x_wdt.h> | 26 | #include <plat/orion5x_wdt.h> |
26 | 27 | ||
27 | /* | 28 | /* |