Contents of /trunk/kernel-lts/patches-3.4/0130-3.4.31-all-fixes.patch
Parent Directory | Revision Log
Revision 2084 -
(show annotations)
(download)
Wed Feb 20 10:54:48 2013 UTC (11 years, 7 months ago) by niro
File size: 61527 byte(s)
Wed Feb 20 10:54:48 2013 UTC (11 years, 7 months ago) by niro
File size: 61527 byte(s)
-linux-3.4.31
1 | diff --git a/MAINTAINERS b/MAINTAINERS |
2 | index a60009d..c744d9c 100644 |
3 | --- a/MAINTAINERS |
4 | +++ b/MAINTAINERS |
5 | @@ -2627,7 +2627,7 @@ S: Maintained |
6 | F: drivers/net/ethernet/i825xx/eexpress.* |
7 | |
8 | ETHERNET BRIDGE |
9 | -M: Stephen Hemminger <shemminger@vyatta.com> |
10 | +M: Stephen Hemminger <stephen@networkplumber.org> |
11 | L: bridge@lists.linux-foundation.org |
12 | L: netdev@vger.kernel.org |
13 | W: http://www.linuxfoundation.org/en/Net:Bridge |
14 | @@ -4312,7 +4312,7 @@ S: Maintained |
15 | |
16 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) |
17 | M: Mirko Lindner <mlindner@marvell.com> |
18 | -M: Stephen Hemminger <shemminger@vyatta.com> |
19 | +M: Stephen Hemminger <stephen@networkplumber.org> |
20 | L: netdev@vger.kernel.org |
21 | S: Maintained |
22 | F: drivers/net/ethernet/marvell/sk* |
23 | @@ -4563,7 +4563,7 @@ S: Supported |
24 | F: drivers/infiniband/hw/nes/ |
25 | |
26 | NETEM NETWORK EMULATOR |
27 | -M: Stephen Hemminger <shemminger@vyatta.com> |
28 | +M: Stephen Hemminger <stephen@networkplumber.org> |
29 | L: netem@lists.linux-foundation.org |
30 | S: Maintained |
31 | F: net/sched/sch_netem.c |
32 | diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h |
33 | index 029189d..da37433 100644 |
34 | --- a/arch/x86/include/asm/efi.h |
35 | +++ b/arch/x86/include/asm/efi.h |
36 | @@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, |
37 | #endif /* CONFIG_X86_32 */ |
38 | |
39 | extern int add_efi_memmap; |
40 | +extern unsigned long x86_efi_facility; |
41 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); |
42 | extern int efi_memblock_x86_reserve_range(void); |
43 | extern void efi_call_phys_prelog(void); |
44 | diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c |
45 | index 3034ee5..df1b604 100644 |
46 | --- a/arch/x86/kernel/reboot.c |
47 | +++ b/arch/x86/kernel/reboot.c |
48 | @@ -619,7 +619,7 @@ static void native_machine_emergency_restart(void) |
49 | break; |
50 | |
51 | case BOOT_EFI: |
52 | - if (efi_enabled) |
53 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) |
54 | efi.reset_system(reboot_mode ? |
55 | EFI_RESET_WARM : |
56 | EFI_RESET_COLD, |
57 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c |
58 | index b71e4a5..537dc03 100644 |
59 | --- a/arch/x86/kernel/setup.c |
60 | +++ b/arch/x86/kernel/setup.c |
61 | @@ -818,15 +818,15 @@ void __init setup_arch(char **cmdline_p) |
62 | #ifdef CONFIG_EFI |
63 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
64 | "EL32", 4)) { |
65 | - efi_enabled = 1; |
66 | - efi_64bit = false; |
67 | + set_bit(EFI_BOOT, &x86_efi_facility); |
68 | } else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, |
69 | "EL64", 4)) { |
70 | - efi_enabled = 1; |
71 | - efi_64bit = true; |
72 | + set_bit(EFI_BOOT, &x86_efi_facility); |
73 | + set_bit(EFI_64BIT, &x86_efi_facility); |
74 | } |
75 | - if (efi_enabled && efi_memblock_x86_reserve_range()) |
76 | - efi_enabled = 0; |
77 | + |
78 | + if (efi_enabled(EFI_BOOT)) |
79 | + efi_memblock_x86_reserve_range(); |
80 | #endif |
81 | |
82 | x86_init.oem.arch_setup(); |
83 | @@ -899,7 +899,7 @@ void __init setup_arch(char **cmdline_p) |
84 | |
85 | finish_e820_parsing(); |
86 | |
87 | - if (efi_enabled) |
88 | + if (efi_enabled(EFI_BOOT)) |
89 | efi_init(); |
90 | |
91 | dmi_scan_machine(); |
92 | @@ -982,7 +982,7 @@ void __init setup_arch(char **cmdline_p) |
93 | * The EFI specification says that boot service code won't be called |
94 | * after ExitBootServices(). This is, in fact, a lie. |
95 | */ |
96 | - if (efi_enabled) |
97 | + if (efi_enabled(EFI_MEMMAP)) |
98 | efi_reserve_boot_services(); |
99 | |
100 | /* preallocate 4k for mptable mpc */ |
101 | @@ -1119,7 +1119,7 @@ void __init setup_arch(char **cmdline_p) |
102 | |
103 | #ifdef CONFIG_VT |
104 | #if defined(CONFIG_VGA_CONSOLE) |
105 | - if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) |
106 | + if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) |
107 | conswitchp = &vga_con; |
108 | #elif defined(CONFIG_DUMMY_CONSOLE) |
109 | conswitchp = &dummy_con; |
110 | @@ -1136,14 +1136,14 @@ void __init setup_arch(char **cmdline_p) |
111 | arch_init_ideal_nops(); |
112 | |
113 | #ifdef CONFIG_EFI |
114 | - /* Once setup is done above, disable efi_enabled on mismatched |
115 | - * firmware/kernel archtectures since there is no support for |
116 | - * runtime services. |
117 | + /* Once setup is done above, unmap the EFI memory map on |
118 | + * mismatched firmware/kernel archtectures since there is no |
119 | + * support for runtime services. |
120 | */ |
121 | - if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) { |
122 | + if (efi_enabled(EFI_BOOT) && |
123 | + IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) { |
124 | pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); |
125 | efi_unmap_memmap(); |
126 | - efi_enabled = 0; |
127 | } |
128 | #endif |
129 | } |
130 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c |
131 | index 6825327..6fcd4ad 100644 |
132 | --- a/arch/x86/platform/efi/efi.c |
133 | +++ b/arch/x86/platform/efi/efi.c |
134 | @@ -50,9 +50,6 @@ |
135 | |
136 | #define EFI_DEBUG 1 |
137 | |
138 | -int efi_enabled; |
139 | -EXPORT_SYMBOL(efi_enabled); |
140 | - |
141 | struct efi __read_mostly efi = { |
142 | .mps = EFI_INVALID_TABLE_ADDR, |
143 | .acpi = EFI_INVALID_TABLE_ADDR, |
144 | @@ -68,19 +65,28 @@ EXPORT_SYMBOL(efi); |
145 | |
146 | struct efi_memory_map memmap; |
147 | |
148 | -bool efi_64bit; |
149 | - |
150 | static struct efi efi_phys __initdata; |
151 | static efi_system_table_t efi_systab __initdata; |
152 | |
153 | static inline bool efi_is_native(void) |
154 | { |
155 | - return IS_ENABLED(CONFIG_X86_64) == efi_64bit; |
156 | + return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); |
157 | +} |
158 | + |
159 | +unsigned long x86_efi_facility; |
160 | + |
161 | +/* |
162 | + * Returns 1 if 'facility' is enabled, 0 otherwise. |
163 | + */ |
164 | +int efi_enabled(int facility) |
165 | +{ |
166 | + return test_bit(facility, &x86_efi_facility) != 0; |
167 | } |
168 | +EXPORT_SYMBOL(efi_enabled); |
169 | |
170 | static int __init setup_noefi(char *arg) |
171 | { |
172 | - efi_enabled = 0; |
173 | + clear_bit(EFI_BOOT, &x86_efi_facility); |
174 | return 0; |
175 | } |
176 | early_param("noefi", setup_noefi); |
177 | @@ -425,6 +431,7 @@ void __init efi_reserve_boot_services(void) |
178 | |
179 | void __init efi_unmap_memmap(void) |
180 | { |
181 | + clear_bit(EFI_MEMMAP, &x86_efi_facility); |
182 | if (memmap.map) { |
183 | early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size); |
184 | memmap.map = NULL; |
185 | @@ -459,7 +466,7 @@ void __init efi_free_boot_services(void) |
186 | |
187 | static int __init efi_systab_init(void *phys) |
188 | { |
189 | - if (efi_64bit) { |
190 | + if (efi_enabled(EFI_64BIT)) { |
191 | efi_system_table_64_t *systab64; |
192 | u64 tmp = 0; |
193 | |
194 | @@ -551,7 +558,7 @@ static int __init efi_config_init(u64 tables, int nr_tables) |
195 | void *config_tables, *tablep; |
196 | int i, sz; |
197 | |
198 | - if (efi_64bit) |
199 | + if (efi_enabled(EFI_64BIT)) |
200 | sz = sizeof(efi_config_table_64_t); |
201 | else |
202 | sz = sizeof(efi_config_table_32_t); |
203 | @@ -571,7 +578,7 @@ static int __init efi_config_init(u64 tables, int nr_tables) |
204 | efi_guid_t guid; |
205 | unsigned long table; |
206 | |
207 | - if (efi_64bit) { |
208 | + if (efi_enabled(EFI_64BIT)) { |
209 | u64 table64; |
210 | guid = ((efi_config_table_64_t *)tablep)->guid; |
211 | table64 = ((efi_config_table_64_t *)tablep)->table; |
212 | @@ -683,7 +690,6 @@ void __init efi_init(void) |
213 | if (boot_params.efi_info.efi_systab_hi || |
214 | boot_params.efi_info.efi_memmap_hi) { |
215 | pr_info("Table located above 4GB, disabling EFI.\n"); |
216 | - efi_enabled = 0; |
217 | return; |
218 | } |
219 | efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab; |
220 | @@ -693,10 +699,10 @@ void __init efi_init(void) |
221 | ((__u64)boot_params.efi_info.efi_systab_hi<<32)); |
222 | #endif |
223 | |
224 | - if (efi_systab_init(efi_phys.systab)) { |
225 | - efi_enabled = 0; |
226 | + if (efi_systab_init(efi_phys.systab)) |
227 | return; |
228 | - } |
229 | + |
230 | + set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); |
231 | |
232 | /* |
233 | * Show what we know for posterity |
234 | @@ -714,10 +720,10 @@ void __init efi_init(void) |
235 | efi.systab->hdr.revision >> 16, |
236 | efi.systab->hdr.revision & 0xffff, vendor); |
237 | |
238 | - if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) { |
239 | - efi_enabled = 0; |
240 | + if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) |
241 | return; |
242 | - } |
243 | + |
244 | + set_bit(EFI_CONFIG_TABLES, &x86_efi_facility); |
245 | |
246 | /* |
247 | * Note: We currently don't support runtime services on an EFI |
248 | @@ -726,15 +732,17 @@ void __init efi_init(void) |
249 | |
250 | if (!efi_is_native()) |
251 | pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n"); |
252 | - else if (efi_runtime_init()) { |
253 | - efi_enabled = 0; |
254 | - return; |
255 | + else { |
256 | + if (efi_runtime_init()) |
257 | + return; |
258 | + set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); |
259 | } |
260 | |
261 | - if (efi_memmap_init()) { |
262 | - efi_enabled = 0; |
263 | + if (efi_memmap_init()) |
264 | return; |
265 | - } |
266 | + |
267 | + set_bit(EFI_MEMMAP, &x86_efi_facility); |
268 | + |
269 | #ifdef CONFIG_X86_32 |
270 | if (efi_is_native()) { |
271 | x86_platform.get_wallclock = efi_get_time; |
272 | @@ -943,6 +951,9 @@ u64 efi_mem_attributes(unsigned long phys_addr) |
273 | efi_memory_desc_t *md; |
274 | void *p; |
275 | |
276 | + if (!efi_enabled(EFI_MEMMAP)) |
277 | + return 0; |
278 | + |
279 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { |
280 | md = p; |
281 | if ((md->phys_addr <= phys_addr) && |
282 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c |
283 | index c3881b2..f48720c 100644 |
284 | --- a/drivers/acpi/osl.c |
285 | +++ b/drivers/acpi/osl.c |
286 | @@ -250,7 +250,7 @@ acpi_physical_address __init acpi_os_get_root_pointer(void) |
287 | return acpi_rsdp; |
288 | #endif |
289 | |
290 | - if (efi_enabled) { |
291 | + if (efi_enabled(EFI_CONFIG_TABLES)) { |
292 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) |
293 | return efi.acpi20; |
294 | else if (efi.acpi != EFI_INVALID_TABLE_ADDR) |
295 | diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h |
296 | index 6a0955e..53ecac5 100644 |
297 | --- a/drivers/atm/iphase.h |
298 | +++ b/drivers/atm/iphase.h |
299 | @@ -636,82 +636,82 @@ struct rx_buf_desc { |
300 | #define SEG_BASE IPHASE5575_FRAG_CONTROL_REG_BASE |
301 | #define REASS_BASE IPHASE5575_REASS_CONTROL_REG_BASE |
302 | |
303 | -typedef volatile u_int freg_t; |
304 | +typedef volatile u_int ffreg_t; |
305 | typedef u_int rreg_t; |
306 | |
307 | typedef struct _ffredn_t { |
308 | - freg_t idlehead_high; /* Idle cell header (high) */ |
309 | - freg_t idlehead_low; /* Idle cell header (low) */ |
310 | - freg_t maxrate; /* Maximum rate */ |
311 | - freg_t stparms; /* Traffic Management Parameters */ |
312 | - freg_t abrubr_abr; /* ABRUBR Priority Byte 1, TCR Byte 0 */ |
313 | - freg_t rm_type; /* */ |
314 | - u_int filler5[0x17 - 0x06]; |
315 | - freg_t cmd_reg; /* Command register */ |
316 | - u_int filler18[0x20 - 0x18]; |
317 | - freg_t cbr_base; /* CBR Pointer Base */ |
318 | - freg_t vbr_base; /* VBR Pointer Base */ |
319 | - freg_t abr_base; /* ABR Pointer Base */ |
320 | - freg_t ubr_base; /* UBR Pointer Base */ |
321 | - u_int filler24; |
322 | - freg_t vbrwq_base; /* VBR Wait Queue Base */ |
323 | - freg_t abrwq_base; /* ABR Wait Queue Base */ |
324 | - freg_t ubrwq_base; /* UBR Wait Queue Base */ |
325 | - freg_t vct_base; /* Main VC Table Base */ |
326 | - freg_t vcte_base; /* Extended Main VC Table Base */ |
327 | - u_int filler2a[0x2C - 0x2A]; |
328 | - freg_t cbr_tab_beg; /* CBR Table Begin */ |
329 | - freg_t cbr_tab_end; /* CBR Table End */ |
330 | - freg_t cbr_pointer; /* CBR Pointer */ |
331 | - u_int filler2f[0x30 - 0x2F]; |
332 | - freg_t prq_st_adr; /* Packet Ready Queue Start Address */ |
333 | - freg_t prq_ed_adr; /* Packet Ready Queue End Address */ |
334 | - freg_t prq_rd_ptr; /* Packet Ready Queue read pointer */ |
335 | - freg_t prq_wr_ptr; /* Packet Ready Queue write pointer */ |
336 | - freg_t tcq_st_adr; /* Transmit Complete Queue Start Address*/ |
337 | - freg_t tcq_ed_adr; /* Transmit Complete Queue End Address */ |
338 | - freg_t tcq_rd_ptr; /* Transmit Complete Queue read pointer */ |
339 | - freg_t tcq_wr_ptr; /* Transmit Complete Queue write pointer*/ |
340 | - u_int filler38[0x40 - 0x38]; |
341 | - freg_t queue_base; /* Base address for PRQ and TCQ */ |
342 | - freg_t desc_base; /* Base address of descriptor table */ |
343 | - u_int filler42[0x45 - 0x42]; |
344 | - freg_t mode_reg_0; /* Mode register 0 */ |
345 | - freg_t mode_reg_1; /* Mode register 1 */ |
346 | - freg_t intr_status_reg;/* Interrupt Status register */ |
347 | - freg_t mask_reg; /* Mask Register */ |
348 | - freg_t cell_ctr_high1; /* Total cell transfer count (high) */ |
349 | - freg_t cell_ctr_lo1; /* Total cell transfer count (low) */ |
350 | - freg_t state_reg; /* Status register */ |
351 | - u_int filler4c[0x58 - 0x4c]; |
352 | - freg_t curr_desc_num; /* Contains the current descriptor num */ |
353 | - freg_t next_desc; /* Next descriptor */ |
354 | - freg_t next_vc; /* Next VC */ |
355 | - u_int filler5b[0x5d - 0x5b]; |
356 | - freg_t present_slot_cnt;/* Present slot count */ |
357 | - u_int filler5e[0x6a - 0x5e]; |
358 | - freg_t new_desc_num; /* New descriptor number */ |
359 | - freg_t new_vc; /* New VC */ |
360 | - freg_t sched_tbl_ptr; /* Schedule table pointer */ |
361 | - freg_t vbrwq_wptr; /* VBR wait queue write pointer */ |
362 | - freg_t vbrwq_rptr; /* VBR wait queue read pointer */ |
363 | - freg_t abrwq_wptr; /* ABR wait queue write pointer */ |
364 | - freg_t abrwq_rptr; /* ABR wait queue read pointer */ |
365 | - freg_t ubrwq_wptr; /* UBR wait queue write pointer */ |
366 | - freg_t ubrwq_rptr; /* UBR wait queue read pointer */ |
367 | - freg_t cbr_vc; /* CBR VC */ |
368 | - freg_t vbr_sb_vc; /* VBR SB VC */ |
369 | - freg_t abr_sb_vc; /* ABR SB VC */ |
370 | - freg_t ubr_sb_vc; /* UBR SB VC */ |
371 | - freg_t vbr_next_link; /* VBR next link */ |
372 | - freg_t abr_next_link; /* ABR next link */ |
373 | - freg_t ubr_next_link; /* UBR next link */ |
374 | - u_int filler7a[0x7c-0x7a]; |
375 | - freg_t out_rate_head; /* Out of rate head */ |
376 | - u_int filler7d[0xca-0x7d]; /* pad out to full address space */ |
377 | - freg_t cell_ctr_high1_nc;/* Total cell transfer count (high) */ |
378 | - freg_t cell_ctr_lo1_nc;/* Total cell transfer count (low) */ |
379 | - u_int fillercc[0x100-0xcc]; /* pad out to full address space */ |
380 | + ffreg_t idlehead_high; /* Idle cell header (high) */ |
381 | + ffreg_t idlehead_low; /* Idle cell header (low) */ |
382 | + ffreg_t maxrate; /* Maximum rate */ |
383 | + ffreg_t stparms; /* Traffic Management Parameters */ |
384 | + ffreg_t abrubr_abr; /* ABRUBR Priority Byte 1, TCR Byte 0 */ |
385 | + ffreg_t rm_type; /* */ |
386 | + u_int filler5[0x17 - 0x06]; |
387 | + ffreg_t cmd_reg; /* Command register */ |
388 | + u_int filler18[0x20 - 0x18]; |
389 | + ffreg_t cbr_base; /* CBR Pointer Base */ |
390 | + ffreg_t vbr_base; /* VBR Pointer Base */ |
391 | + ffreg_t abr_base; /* ABR Pointer Base */ |
392 | + ffreg_t ubr_base; /* UBR Pointer Base */ |
393 | + u_int filler24; |
394 | + ffreg_t vbrwq_base; /* VBR Wait Queue Base */ |
395 | + ffreg_t abrwq_base; /* ABR Wait Queue Base */ |
396 | + ffreg_t ubrwq_base; /* UBR Wait Queue Base */ |
397 | + ffreg_t vct_base; /* Main VC Table Base */ |
398 | + ffreg_t vcte_base; /* Extended Main VC Table Base */ |
399 | + u_int filler2a[0x2C - 0x2A]; |
400 | + ffreg_t cbr_tab_beg; /* CBR Table Begin */ |
401 | + ffreg_t cbr_tab_end; /* CBR Table End */ |
402 | + ffreg_t cbr_pointer; /* CBR Pointer */ |
403 | + u_int filler2f[0x30 - 0x2F]; |
404 | + ffreg_t prq_st_adr; /* Packet Ready Queue Start Address */ |
405 | + ffreg_t prq_ed_adr; /* Packet Ready Queue End Address */ |
406 | + ffreg_t prq_rd_ptr; /* Packet Ready Queue read pointer */ |
407 | + ffreg_t prq_wr_ptr; /* Packet Ready Queue write pointer */ |
408 | + ffreg_t tcq_st_adr; /* Transmit Complete Queue Start Address*/ |
409 | + ffreg_t tcq_ed_adr; /* Transmit Complete Queue End Address */ |
410 | + ffreg_t tcq_rd_ptr; /* Transmit Complete Queue read pointer */ |
411 | + ffreg_t tcq_wr_ptr; /* Transmit Complete Queue write pointer*/ |
412 | + u_int filler38[0x40 - 0x38]; |
413 | + ffreg_t queue_base; /* Base address for PRQ and TCQ */ |
414 | + ffreg_t desc_base; /* Base address of descriptor table */ |
415 | + u_int filler42[0x45 - 0x42]; |
416 | + ffreg_t mode_reg_0; /* Mode register 0 */ |
417 | + ffreg_t mode_reg_1; /* Mode register 1 */ |
418 | + ffreg_t intr_status_reg;/* Interrupt Status register */ |
419 | + ffreg_t mask_reg; /* Mask Register */ |
420 | + ffreg_t cell_ctr_high1; /* Total cell transfer count (high) */ |
421 | + ffreg_t cell_ctr_lo1; /* Total cell transfer count (low) */ |
422 | + ffreg_t state_reg; /* Status register */ |
423 | + u_int filler4c[0x58 - 0x4c]; |
424 | + ffreg_t curr_desc_num; /* Contains the current descriptor num */ |
425 | + ffreg_t next_desc; /* Next descriptor */ |
426 | + ffreg_t next_vc; /* Next VC */ |
427 | + u_int filler5b[0x5d - 0x5b]; |
428 | + ffreg_t present_slot_cnt;/* Present slot count */ |
429 | + u_int filler5e[0x6a - 0x5e]; |
430 | + ffreg_t new_desc_num; /* New descriptor number */ |
431 | + ffreg_t new_vc; /* New VC */ |
432 | + ffreg_t sched_tbl_ptr; /* Schedule table pointer */ |
433 | + ffreg_t vbrwq_wptr; /* VBR wait queue write pointer */ |
434 | + ffreg_t vbrwq_rptr; /* VBR wait queue read pointer */ |
435 | + ffreg_t abrwq_wptr; /* ABR wait queue write pointer */ |
436 | + ffreg_t abrwq_rptr; /* ABR wait queue read pointer */ |
437 | + ffreg_t ubrwq_wptr; /* UBR wait queue write pointer */ |
438 | + ffreg_t ubrwq_rptr; /* UBR wait queue read pointer */ |
439 | + ffreg_t cbr_vc; /* CBR VC */ |
440 | + ffreg_t vbr_sb_vc; /* VBR SB VC */ |
441 | + ffreg_t abr_sb_vc; /* ABR SB VC */ |
442 | + ffreg_t ubr_sb_vc; /* UBR SB VC */ |
443 | + ffreg_t vbr_next_link; /* VBR next link */ |
444 | + ffreg_t abr_next_link; /* ABR next link */ |
445 | + ffreg_t ubr_next_link; /* UBR next link */ |
446 | + u_int filler7a[0x7c-0x7a]; |
447 | + ffreg_t out_rate_head; /* Out of rate head */ |
448 | + u_int filler7d[0xca-0x7d]; /* pad out to full address space */ |
449 | + ffreg_t cell_ctr_high1_nc;/* Total cell transfer count (high) */ |
450 | + ffreg_t cell_ctr_lo1_nc;/* Total cell transfer count (low) */ |
451 | + u_int fillercc[0x100-0xcc]; /* pad out to full address space */ |
452 | } ffredn_t; |
453 | |
454 | typedef struct _rfredn_t { |
455 | diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c |
456 | index cdf2f54..f77e341 100644 |
457 | --- a/drivers/char/virtio_console.c |
458 | +++ b/drivers/char/virtio_console.c |
459 | @@ -1808,7 +1808,8 @@ static void virtcons_remove(struct virtio_device *vdev) |
460 | /* Disable interrupts for vqs */ |
461 | vdev->config->reset(vdev); |
462 | /* Finish up work that's lined up */ |
463 | - cancel_work_sync(&portdev->control_work); |
464 | + if (use_multiport(portdev)) |
465 | + cancel_work_sync(&portdev->control_work); |
466 | |
467 | list_for_each_entry_safe(port, port2, &portdev->ports, list) |
468 | unplug_port(port); |
469 | diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c |
470 | index fd3ae62..982f1f5 100644 |
471 | --- a/drivers/firmware/dmi_scan.c |
472 | +++ b/drivers/firmware/dmi_scan.c |
473 | @@ -471,7 +471,7 @@ void __init dmi_scan_machine(void) |
474 | char __iomem *p, *q; |
475 | int rc; |
476 | |
477 | - if (efi_enabled) { |
478 | + if (efi_enabled(EFI_CONFIG_TABLES)) { |
479 | if (efi.smbios == EFI_INVALID_TABLE_ADDR) |
480 | goto error; |
481 | |
482 | diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c |
483 | index d10c987..bfd8f43 100644 |
484 | --- a/drivers/firmware/efivars.c |
485 | +++ b/drivers/firmware/efivars.c |
486 | @@ -1224,7 +1224,7 @@ efivars_init(void) |
487 | printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION, |
488 | EFIVARS_DATE); |
489 | |
490 | - if (!efi_enabled) |
491 | + if (!efi_enabled(EFI_RUNTIME_SERVICES)) |
492 | return 0; |
493 | |
494 | /* For now we'll register the efi directory at /sys/firmware/efi */ |
495 | @@ -1262,7 +1262,7 @@ err_put: |
496 | static void __exit |
497 | efivars_exit(void) |
498 | { |
499 | - if (efi_enabled) { |
500 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) { |
501 | unregister_efivars(&__efivars); |
502 | kobject_put(efi_kobj); |
503 | } |
504 | diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c |
505 | index 4da4eb9..2224f1d 100644 |
506 | --- a/drivers/firmware/iscsi_ibft_find.c |
507 | +++ b/drivers/firmware/iscsi_ibft_find.c |
508 | @@ -99,7 +99,7 @@ unsigned long __init find_ibft_region(unsigned long *sizep) |
509 | /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will |
510 | * only use ACPI for this */ |
511 | |
512 | - if (!efi_enabled) |
513 | + if (!efi_enabled(EFI_BOOT)) |
514 | find_ibft_in_mem(); |
515 | |
516 | if (ibft_addr) { |
517 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
518 | index de5e0b5..68c89db 100644 |
519 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
520 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
521 | @@ -358,7 +358,8 @@ bool radeon_card_posted(struct radeon_device *rdev) |
522 | { |
523 | uint32_t reg; |
524 | |
525 | - if (efi_enabled && rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) |
526 | + if (efi_enabled(EFI_BOOT) && |
527 | + rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) |
528 | return false; |
529 | |
530 | /* first check CRTCs */ |
531 | diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c |
532 | index 579aa02..be22d5e 100644 |
533 | --- a/drivers/isdn/gigaset/capi.c |
534 | +++ b/drivers/isdn/gigaset/capi.c |
535 | @@ -264,6 +264,8 @@ static inline void dump_rawmsg(enum debuglevel level, const char *tag, |
536 | CAPIMSG_APPID(data), CAPIMSG_MSGID(data), l, |
537 | CAPIMSG_CONTROL(data)); |
538 | l -= 12; |
539 | + if (l <= 0) |
540 | + return; |
541 | dbgline = kmalloc(3 * l, GFP_ATOMIC); |
542 | if (!dbgline) |
543 | return; |
544 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c |
545 | index 689d2a1..e143d8c 100644 |
546 | --- a/drivers/net/ethernet/broadcom/tg3.c |
547 | +++ b/drivers/net/ethernet/broadcom/tg3.c |
548 | @@ -1136,14 +1136,26 @@ static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set) |
549 | return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg); |
550 | } |
551 | |
552 | -#define TG3_PHY_AUXCTL_SMDSP_ENABLE(tp) \ |
553 | - tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \ |
554 | - MII_TG3_AUXCTL_ACTL_SMDSP_ENA | \ |
555 | - MII_TG3_AUXCTL_ACTL_TX_6DB) |
556 | +static int tg3_phy_toggle_auxctl_smdsp(struct tg3 *tp, bool enable) |
557 | +{ |
558 | + u32 val; |
559 | + int err; |
560 | |
561 | -#define TG3_PHY_AUXCTL_SMDSP_DISABLE(tp) \ |
562 | - tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \ |
563 | - MII_TG3_AUXCTL_ACTL_TX_6DB); |
564 | + err = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val); |
565 | + |
566 | + if (err) |
567 | + return err; |
568 | + if (enable) |
569 | + |
570 | + val |= MII_TG3_AUXCTL_ACTL_SMDSP_ENA; |
571 | + else |
572 | + val &= ~MII_TG3_AUXCTL_ACTL_SMDSP_ENA; |
573 | + |
574 | + err = tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, |
575 | + val | MII_TG3_AUXCTL_ACTL_TX_6DB); |
576 | + |
577 | + return err; |
578 | +} |
579 | |
580 | static int tg3_bmcr_reset(struct tg3 *tp) |
581 | { |
582 | @@ -2076,7 +2088,7 @@ static void tg3_phy_apply_otp(struct tg3 *tp) |
583 | |
584 | otp = tp->phy_otp; |
585 | |
586 | - if (TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) |
587 | + if (tg3_phy_toggle_auxctl_smdsp(tp, true)) |
588 | return; |
589 | |
590 | phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT); |
591 | @@ -2101,7 +2113,7 @@ static void tg3_phy_apply_otp(struct tg3 *tp) |
592 | ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT); |
593 | tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy); |
594 | |
595 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
596 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
597 | } |
598 | |
599 | static void tg3_phy_eee_adjust(struct tg3 *tp, u32 current_link_up) |
600 | @@ -2137,9 +2149,9 @@ static void tg3_phy_eee_adjust(struct tg3 *tp, u32 current_link_up) |
601 | |
602 | if (!tp->setlpicnt) { |
603 | if (current_link_up == 1 && |
604 | - !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) { |
605 | + !tg3_phy_toggle_auxctl_smdsp(tp, true)) { |
606 | tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, 0x0000); |
607 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
608 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
609 | } |
610 | |
611 | val = tr32(TG3_CPMU_EEE_MODE); |
612 | @@ -2155,11 +2167,11 @@ static void tg3_phy_eee_enable(struct tg3 *tp) |
613 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 || |
614 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 || |
615 | tg3_flag(tp, 57765_CLASS)) && |
616 | - !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) { |
617 | + !tg3_phy_toggle_auxctl_smdsp(tp, true)) { |
618 | val = MII_TG3_DSP_TAP26_ALNOKO | |
619 | MII_TG3_DSP_TAP26_RMRXSTO; |
620 | tg3_phydsp_write(tp, MII_TG3_DSP_TAP26, val); |
621 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
622 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
623 | } |
624 | |
625 | val = tr32(TG3_CPMU_EEE_MODE); |
626 | @@ -2303,7 +2315,7 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp) |
627 | tg3_writephy(tp, MII_CTRL1000, |
628 | CTL1000_AS_MASTER | CTL1000_ENABLE_MASTER); |
629 | |
630 | - err = TG3_PHY_AUXCTL_SMDSP_ENABLE(tp); |
631 | + err = tg3_phy_toggle_auxctl_smdsp(tp, true); |
632 | if (err) |
633 | return err; |
634 | |
635 | @@ -2324,7 +2336,7 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp) |
636 | tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200); |
637 | tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0000); |
638 | |
639 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
640 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
641 | |
642 | tg3_writephy(tp, MII_CTRL1000, phy9_orig); |
643 | |
644 | @@ -2413,10 +2425,10 @@ static int tg3_phy_reset(struct tg3 *tp) |
645 | |
646 | out: |
647 | if ((tp->phy_flags & TG3_PHYFLG_ADC_BUG) && |
648 | - !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) { |
649 | + !tg3_phy_toggle_auxctl_smdsp(tp, true)) { |
650 | tg3_phydsp_write(tp, 0x201f, 0x2aaa); |
651 | tg3_phydsp_write(tp, 0x000a, 0x0323); |
652 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
653 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
654 | } |
655 | |
656 | if (tp->phy_flags & TG3_PHYFLG_5704_A0_BUG) { |
657 | @@ -2425,14 +2437,14 @@ out: |
658 | } |
659 | |
660 | if (tp->phy_flags & TG3_PHYFLG_BER_BUG) { |
661 | - if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) { |
662 | + if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) { |
663 | tg3_phydsp_write(tp, 0x000a, 0x310b); |
664 | tg3_phydsp_write(tp, 0x201f, 0x9506); |
665 | tg3_phydsp_write(tp, 0x401f, 0x14e2); |
666 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
667 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
668 | } |
669 | } else if (tp->phy_flags & TG3_PHYFLG_JITTER_BUG) { |
670 | - if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) { |
671 | + if (!tg3_phy_toggle_auxctl_smdsp(tp, true)) { |
672 | tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a); |
673 | if (tp->phy_flags & TG3_PHYFLG_ADJUST_TRIM) { |
674 | tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b); |
675 | @@ -2441,7 +2453,7 @@ out: |
676 | } else |
677 | tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b); |
678 | |
679 | - TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
680 | + tg3_phy_toggle_auxctl_smdsp(tp, false); |
681 | } |
682 | } |
683 | |
684 | @@ -3858,7 +3870,7 @@ static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl) |
685 | tw32(TG3_CPMU_EEE_MODE, |
686 | tr32(TG3_CPMU_EEE_MODE) & ~TG3_CPMU_EEEMD_LPI_ENABLE); |
687 | |
688 | - err = TG3_PHY_AUXCTL_SMDSP_ENABLE(tp); |
689 | + err = tg3_phy_toggle_auxctl_smdsp(tp, true); |
690 | if (!err) { |
691 | u32 err2; |
692 | |
693 | @@ -3891,7 +3903,7 @@ static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl) |
694 | MII_TG3_DSP_CH34TP2_HIBW01); |
695 | } |
696 | |
697 | - err2 = TG3_PHY_AUXCTL_SMDSP_DISABLE(tp); |
698 | + err2 = tg3_phy_toggle_auxctl_smdsp(tp, false); |
699 | if (!err) |
700 | err = err2; |
701 | } |
702 | @@ -6574,6 +6586,9 @@ static void tg3_poll_controller(struct net_device *dev) |
703 | int i; |
704 | struct tg3 *tp = netdev_priv(dev); |
705 | |
706 | + if (tg3_irq_sync(tp)) |
707 | + return; |
708 | + |
709 | for (i = 0; i < tp->irq_cnt; i++) |
710 | tg3_interrupt(tp->napi[i].irq_vec, &tp->napi[i]); |
711 | } |
712 | @@ -15529,6 +15544,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, |
713 | tp->pm_cap = pm_cap; |
714 | tp->rx_mode = TG3_DEF_RX_MODE; |
715 | tp->tx_mode = TG3_DEF_TX_MODE; |
716 | + tp->irq_sync = 1; |
717 | |
718 | if (tg3_debug > 0) |
719 | tp->msg_enable = tg3_debug; |
720 | diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c |
721 | index 11f667f..4ebbe6f 100644 |
722 | --- a/drivers/net/ethernet/calxeda/xgmac.c |
723 | +++ b/drivers/net/ethernet/calxeda/xgmac.c |
724 | @@ -547,6 +547,10 @@ static int desc_get_rx_status(struct xgmac_priv *priv, struct xgmac_dma_desc *p) |
725 | return -1; |
726 | } |
727 | |
728 | + /* All frames should fit into a single buffer */ |
729 | + if (!(status & RXDESC_FIRST_SEG) || !(status & RXDESC_LAST_SEG)) |
730 | + return -1; |
731 | + |
732 | /* Check if packet has checksum already */ |
733 | if ((status & RXDESC_FRAME_TYPE) && (status & RXDESC_EXT_STATUS) && |
734 | !(ext_status & RXDESC_IP_PAYLOAD_MASK)) |
735 | diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h |
736 | index 9576ac0..dcb02c2 100644 |
737 | --- a/drivers/net/ethernet/emulex/benet/be.h |
738 | +++ b/drivers/net/ethernet/emulex/benet/be.h |
739 | @@ -536,6 +536,11 @@ static inline void be_check_sriov_fn_type(struct be_adapter *adapter) |
740 | adapter->is_virtfn = (sli_intf & SLI_INTF_FT_MASK) ? 1 : 0; |
741 | } |
742 | |
743 | +static inline bool is_ipv4_pkt(struct sk_buff *skb) |
744 | +{ |
745 | + return skb->protocol == ntohs(ETH_P_IP) && ip_hdr(skb)->version == 4; |
746 | +} |
747 | + |
748 | static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac) |
749 | { |
750 | u32 addr; |
751 | diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c |
752 | index 1bbf6b3..ef1f940 100644 |
753 | --- a/drivers/net/ethernet/emulex/benet/be_main.c |
754 | +++ b/drivers/net/ethernet/emulex/benet/be_main.c |
755 | @@ -571,6 +571,11 @@ static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter, |
756 | return vlan_tag; |
757 | } |
758 | |
759 | +static int be_vlan_tag_chk(struct be_adapter *adapter, struct sk_buff *skb) |
760 | +{ |
761 | + return vlan_tx_tag_present(skb) || adapter->pvid; |
762 | +} |
763 | + |
764 | static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr, |
765 | struct sk_buff *skb, u32 wrb_cnt, u32 len) |
766 | { |
767 | @@ -698,33 +703,56 @@ dma_err: |
768 | return 0; |
769 | } |
770 | |
771 | +static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter, |
772 | + struct sk_buff *skb) |
773 | +{ |
774 | + u16 vlan_tag = 0; |
775 | + |
776 | + skb = skb_share_check(skb, GFP_ATOMIC); |
777 | + if (unlikely(!skb)) |
778 | + return skb; |
779 | + |
780 | + if (vlan_tx_tag_present(skb)) { |
781 | + vlan_tag = be_get_tx_vlan_tag(adapter, skb); |
782 | + __vlan_put_tag(skb, vlan_tag); |
783 | + skb->vlan_tci = 0; |
784 | + } |
785 | + |
786 | + return skb; |
787 | +} |
788 | + |
789 | static netdev_tx_t be_xmit(struct sk_buff *skb, |
790 | struct net_device *netdev) |
791 | { |
792 | struct be_adapter *adapter = netdev_priv(netdev); |
793 | struct be_tx_obj *txo = &adapter->tx_obj[skb_get_queue_mapping(skb)]; |
794 | struct be_queue_info *txq = &txo->q; |
795 | + struct iphdr *ip = NULL; |
796 | u32 wrb_cnt = 0, copied = 0; |
797 | - u32 start = txq->head; |
798 | + u32 start = txq->head, eth_hdr_len; |
799 | bool dummy_wrb, stopped = false; |
800 | |
801 | - /* For vlan tagged pkts, BE |
802 | - * 1) calculates checksum even when CSO is not requested |
803 | - * 2) calculates checksum wrongly for padded pkt less than |
804 | - * 60 bytes long. |
805 | - * As a workaround disable TX vlan offloading in such cases. |
806 | + eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ? |
807 | + VLAN_ETH_HLEN : ETH_HLEN; |
808 | + |
809 | + /* HW has a bug which considers padding bytes as legal |
810 | + * and modifies the IPv4 hdr's 'tot_len' field |
811 | */ |
812 | - if (unlikely(vlan_tx_tag_present(skb) && |
813 | - (skb->ip_summed != CHECKSUM_PARTIAL || skb->len <= 60))) { |
814 | - skb = skb_share_check(skb, GFP_ATOMIC); |
815 | - if (unlikely(!skb)) |
816 | - goto tx_drop; |
817 | + if (skb->len <= 60 && be_vlan_tag_chk(adapter, skb) && |
818 | + is_ipv4_pkt(skb)) { |
819 | + ip = (struct iphdr *)ip_hdr(skb); |
820 | + pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len)); |
821 | + } |
822 | |
823 | - skb = __vlan_put_tag(skb, be_get_tx_vlan_tag(adapter, skb)); |
824 | + /* HW has a bug wherein it will calculate CSUM for VLAN |
825 | + * pkts even though it is disabled. |
826 | + * Manually insert VLAN in pkt. |
827 | + */ |
828 | + if (skb->ip_summed != CHECKSUM_PARTIAL && |
829 | + be_vlan_tag_chk(adapter, skb)) { |
830 | + skb = be_insert_vlan_in_pkt(adapter, skb); |
831 | if (unlikely(!skb)) |
832 | goto tx_drop; |
833 | - |
834 | - skb->vlan_tci = 0; |
835 | } |
836 | |
837 | wrb_cnt = wrb_cnt_for_skb(adapter, skb, &dummy_wrb); |
838 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
839 | index 1796824..efa3a13 100644 |
840 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
841 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
842 | @@ -683,10 +683,15 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) |
843 | ring->tx_csum++; |
844 | } |
845 | |
846 | - /* Copy dst mac address to wqe */ |
847 | - ethh = (struct ethhdr *)skb->data; |
848 | - tx_desc->ctrl.srcrb_flags16[0] = get_unaligned((__be16 *)ethh->h_dest); |
849 | - tx_desc->ctrl.imm = get_unaligned((__be32 *)(ethh->h_dest + 2)); |
850 | + if (mlx4_is_mfunc(mdev->dev) || priv->validate_loopback) { |
851 | + /* Copy dst mac address to wqe. This allows loopback in eSwitch, |
852 | + * so that VFs and PF can communicate with each other |
853 | + */ |
854 | + ethh = (struct ethhdr *)skb->data; |
855 | + tx_desc->ctrl.srcrb_flags16[0] = get_unaligned((__be16 *)ethh->h_dest); |
856 | + tx_desc->ctrl.imm = get_unaligned((__be32 *)(ethh->h_dest + 2)); |
857 | + } |
858 | + |
859 | /* Handle LSO (TSO) packets */ |
860 | if (lso_header_size) { |
861 | /* Mark opcode as LSO */ |
862 | diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c |
863 | index 8bb05b4..1995cb0 100644 |
864 | --- a/drivers/net/ethernet/mellanox/mlx4/main.c |
865 | +++ b/drivers/net/ethernet/mellanox/mlx4/main.c |
866 | @@ -1526,15 +1526,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev) |
867 | int i; |
868 | |
869 | if (msi_x) { |
870 | - /* In multifunction mode each function gets 2 msi-X vectors |
871 | - * one for data path completions anf the other for asynch events |
872 | - * or command completions */ |
873 | - if (mlx4_is_mfunc(dev)) { |
874 | - nreq = 2; |
875 | - } else { |
876 | - nreq = min_t(int, dev->caps.num_eqs - |
877 | - dev->caps.reserved_eqs, nreq); |
878 | - } |
879 | + nreq = min_t(int, dev->caps.num_eqs - dev->caps.reserved_eqs, |
880 | + nreq); |
881 | |
882 | entries = kcalloc(nreq, sizeof *entries, GFP_KERNEL); |
883 | if (!entries) |
884 | diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c |
885 | index 718b274..83538cc 100644 |
886 | --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c |
887 | +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c |
888 | @@ -144,7 +144,7 @@ void netxen_release_tx_buffers(struct netxen_adapter *adapter) |
889 | buffrag->length, PCI_DMA_TODEVICE); |
890 | buffrag->dma = 0ULL; |
891 | } |
892 | - for (j = 0; j < cmd_buf->frag_count; j++) { |
893 | + for (j = 1; j < cmd_buf->frag_count; j++) { |
894 | buffrag++; |
895 | if (buffrag->dma) { |
896 | pci_unmap_page(adapter->pdev, buffrag->dma, |
897 | diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c |
898 | index 22b399a..7ee9c74 100644 |
899 | --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c |
900 | +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c |
901 | @@ -1956,10 +1956,12 @@ unwind: |
902 | while (--i >= 0) { |
903 | nf = &pbuf->frag_array[i+1]; |
904 | pci_unmap_page(pdev, nf->dma, nf->length, PCI_DMA_TODEVICE); |
905 | + nf->dma = 0ULL; |
906 | } |
907 | |
908 | nf = &pbuf->frag_array[0]; |
909 | pci_unmap_single(pdev, nf->dma, skb_headlen(skb), PCI_DMA_TODEVICE); |
910 | + nf->dma = 0ULL; |
911 | |
912 | out_err: |
913 | return -ENOMEM; |
914 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c |
915 | index 06ee243..df49ce2 100644 |
916 | --- a/drivers/net/ethernet/realtek/r8169.c |
917 | +++ b/drivers/net/ethernet/realtek/r8169.c |
918 | @@ -5450,13 +5450,6 @@ process_pkt: |
919 | tp->rx_stats.bytes += pkt_size; |
920 | u64_stats_update_end(&tp->rx_stats.syncp); |
921 | } |
922 | - |
923 | - /* Work around for AMD plateform. */ |
924 | - if ((desc->opts2 & cpu_to_le32(0xfffe000)) && |
925 | - (tp->mac_version == RTL_GIGA_MAC_VER_05)) { |
926 | - desc->opts2 = 0; |
927 | - cur_rx++; |
928 | - } |
929 | } |
930 | |
931 | count = cur_rx - tp->cur_rx; |
932 | diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c |
933 | index fcfa01f..4c76db4 100644 |
934 | --- a/drivers/net/ethernet/via/via-rhine.c |
935 | +++ b/drivers/net/ethernet/via/via-rhine.c |
936 | @@ -1802,7 +1802,7 @@ static void rhine_tx(struct net_device *dev) |
937 | rp->tx_skbuff[entry]->len, |
938 | PCI_DMA_TODEVICE); |
939 | } |
940 | - dev_kfree_skb_irq(rp->tx_skbuff[entry]); |
941 | + dev_kfree_skb(rp->tx_skbuff[entry]); |
942 | rp->tx_skbuff[entry] = NULL; |
943 | entry = (++rp->dirty_tx) % TX_RING_SIZE; |
944 | } |
945 | @@ -2011,11 +2011,7 @@ static void rhine_slow_event_task(struct work_struct *work) |
946 | if (intr_status & IntrPCIErr) |
947 | netif_warn(rp, hw, dev, "PCI error\n"); |
948 | |
949 | - napi_disable(&rp->napi); |
950 | - rhine_irq_disable(rp); |
951 | - /* Slow and safe. Consider __napi_schedule as a replacement ? */ |
952 | - napi_enable(&rp->napi); |
953 | - napi_schedule(&rp->napi); |
954 | + iowrite16(RHINE_EVENT & 0xffff, rp->base + IntrEnable); |
955 | |
956 | out_unlock: |
957 | mutex_unlock(&rp->task_lock); |
958 | diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c |
959 | index 32eb94e..a3d4707 100644 |
960 | --- a/drivers/net/loopback.c |
961 | +++ b/drivers/net/loopback.c |
962 | @@ -77,6 +77,11 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, |
963 | |
964 | skb_orphan(skb); |
965 | |
966 | + /* Before queueing this packet to netif_rx(), |
967 | + * make sure dst is refcounted. |
968 | + */ |
969 | + skb_dst_force(skb); |
970 | + |
971 | skb->protocol = eth_type_trans(skb, dev); |
972 | |
973 | /* it's OK to use per_cpu_ptr() because BHs are off */ |
974 | diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c |
975 | index e54488d..18d9eb3a 100644 |
976 | --- a/drivers/net/wireless/rtlwifi/base.c |
977 | +++ b/drivers/net/wireless/rtlwifi/base.c |
978 | @@ -980,7 +980,8 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) |
979 | is_tx ? "Tx" : "Rx"); |
980 | |
981 | if (is_tx) { |
982 | - rtl_lps_leave(hw); |
983 | + schedule_work(&rtlpriv-> |
984 | + works.lps_leave_work); |
985 | ppsc->last_delaylps_stamp_jiffies = |
986 | jiffies; |
987 | } |
988 | @@ -990,7 +991,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) |
989 | } |
990 | } else if (ETH_P_ARP == ether_type) { |
991 | if (is_tx) { |
992 | - rtl_lps_leave(hw); |
993 | + schedule_work(&rtlpriv->works.lps_leave_work); |
994 | ppsc->last_delaylps_stamp_jiffies = jiffies; |
995 | } |
996 | |
997 | @@ -1000,7 +1001,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) |
998 | "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx"); |
999 | |
1000 | if (is_tx) { |
1001 | - rtl_lps_leave(hw); |
1002 | + schedule_work(&rtlpriv->works.lps_leave_work); |
1003 | ppsc->last_delaylps_stamp_jiffies = jiffies; |
1004 | } |
1005 | |
1006 | diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c |
1007 | index 8fa144f..17cd028 100644 |
1008 | --- a/drivers/net/wireless/rtlwifi/usb.c |
1009 | +++ b/drivers/net/wireless/rtlwifi/usb.c |
1010 | @@ -542,8 +542,8 @@ static void _rtl_rx_pre_process(struct ieee80211_hw *hw, struct sk_buff *skb) |
1011 | WARN_ON(skb_queue_empty(&rx_queue)); |
1012 | while (!skb_queue_empty(&rx_queue)) { |
1013 | _skb = skb_dequeue(&rx_queue); |
1014 | - _rtl_usb_rx_process_agg(hw, skb); |
1015 | - ieee80211_rx_irqsafe(hw, skb); |
1016 | + _rtl_usb_rx_process_agg(hw, _skb); |
1017 | + ieee80211_rx_irqsafe(hw, _skb); |
1018 | } |
1019 | } |
1020 | |
1021 | diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h |
1022 | index 94b79c3..9d7f172 100644 |
1023 | --- a/drivers/net/xen-netback/common.h |
1024 | +++ b/drivers/net/xen-netback/common.h |
1025 | @@ -151,6 +151,9 @@ void xen_netbk_queue_tx_skb(struct xenvif *vif, struct sk_buff *skb); |
1026 | /* Notify xenvif that ring now has space to send an skb to the frontend */ |
1027 | void xenvif_notify_tx_completion(struct xenvif *vif); |
1028 | |
1029 | +/* Prevent the device from generating any further traffic. */ |
1030 | +void xenvif_carrier_off(struct xenvif *vif); |
1031 | + |
1032 | /* Returns number of ring slots required to send an skb to the frontend */ |
1033 | unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb); |
1034 | |
1035 | diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c |
1036 | index b7d41f8..b8c5193 100644 |
1037 | --- a/drivers/net/xen-netback/interface.c |
1038 | +++ b/drivers/net/xen-netback/interface.c |
1039 | @@ -343,17 +343,22 @@ err: |
1040 | return err; |
1041 | } |
1042 | |
1043 | -void xenvif_disconnect(struct xenvif *vif) |
1044 | +void xenvif_carrier_off(struct xenvif *vif) |
1045 | { |
1046 | struct net_device *dev = vif->dev; |
1047 | - if (netif_carrier_ok(dev)) { |
1048 | - rtnl_lock(); |
1049 | - netif_carrier_off(dev); /* discard queued packets */ |
1050 | - if (netif_running(dev)) |
1051 | - xenvif_down(vif); |
1052 | - rtnl_unlock(); |
1053 | - xenvif_put(vif); |
1054 | - } |
1055 | + |
1056 | + rtnl_lock(); |
1057 | + netif_carrier_off(dev); /* discard queued packets */ |
1058 | + if (netif_running(dev)) |
1059 | + xenvif_down(vif); |
1060 | + rtnl_unlock(); |
1061 | + xenvif_put(vif); |
1062 | +} |
1063 | + |
1064 | +void xenvif_disconnect(struct xenvif *vif) |
1065 | +{ |
1066 | + if (netif_carrier_ok(vif->dev)) |
1067 | + xenvif_carrier_off(vif); |
1068 | |
1069 | atomic_dec(&vif->refcnt); |
1070 | wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0); |
1071 | diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c |
1072 | index 2596401..e2793d0 100644 |
1073 | --- a/drivers/net/xen-netback/netback.c |
1074 | +++ b/drivers/net/xen-netback/netback.c |
1075 | @@ -146,7 +146,8 @@ void xen_netbk_remove_xenvif(struct xenvif *vif) |
1076 | atomic_dec(&netbk->netfront_count); |
1077 | } |
1078 | |
1079 | -static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx); |
1080 | +static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx, |
1081 | + u8 status); |
1082 | static void make_tx_response(struct xenvif *vif, |
1083 | struct xen_netif_tx_request *txp, |
1084 | s8 st); |
1085 | @@ -851,7 +852,7 @@ static void netbk_tx_err(struct xenvif *vif, |
1086 | |
1087 | do { |
1088 | make_tx_response(vif, txp, XEN_NETIF_RSP_ERROR); |
1089 | - if (cons >= end) |
1090 | + if (cons == end) |
1091 | break; |
1092 | txp = RING_GET_REQUEST(&vif->tx, cons++); |
1093 | } while (1); |
1094 | @@ -860,6 +861,13 @@ static void netbk_tx_err(struct xenvif *vif, |
1095 | xenvif_put(vif); |
1096 | } |
1097 | |
1098 | +static void netbk_fatal_tx_err(struct xenvif *vif) |
1099 | +{ |
1100 | + netdev_err(vif->dev, "fatal error; disabling device\n"); |
1101 | + xenvif_carrier_off(vif); |
1102 | + xenvif_put(vif); |
1103 | +} |
1104 | + |
1105 | static int netbk_count_requests(struct xenvif *vif, |
1106 | struct xen_netif_tx_request *first, |
1107 | struct xen_netif_tx_request *txp, |
1108 | @@ -873,19 +881,22 @@ static int netbk_count_requests(struct xenvif *vif, |
1109 | |
1110 | do { |
1111 | if (frags >= work_to_do) { |
1112 | - netdev_dbg(vif->dev, "Need more frags\n"); |
1113 | + netdev_err(vif->dev, "Need more frags\n"); |
1114 | + netbk_fatal_tx_err(vif); |
1115 | return -frags; |
1116 | } |
1117 | |
1118 | if (unlikely(frags >= MAX_SKB_FRAGS)) { |
1119 | - netdev_dbg(vif->dev, "Too many frags\n"); |
1120 | + netdev_err(vif->dev, "Too many frags\n"); |
1121 | + netbk_fatal_tx_err(vif); |
1122 | return -frags; |
1123 | } |
1124 | |
1125 | memcpy(txp, RING_GET_REQUEST(&vif->tx, cons + frags), |
1126 | sizeof(*txp)); |
1127 | if (txp->size > first->size) { |
1128 | - netdev_dbg(vif->dev, "Frags galore\n"); |
1129 | + netdev_err(vif->dev, "Frag is bigger than frame.\n"); |
1130 | + netbk_fatal_tx_err(vif); |
1131 | return -frags; |
1132 | } |
1133 | |
1134 | @@ -893,8 +904,9 @@ static int netbk_count_requests(struct xenvif *vif, |
1135 | frags++; |
1136 | |
1137 | if (unlikely((txp->offset + txp->size) > PAGE_SIZE)) { |
1138 | - netdev_dbg(vif->dev, "txp->offset: %x, size: %u\n", |
1139 | + netdev_err(vif->dev, "txp->offset: %x, size: %u\n", |
1140 | txp->offset, txp->size); |
1141 | + netbk_fatal_tx_err(vif); |
1142 | return -frags; |
1143 | } |
1144 | } while ((txp++)->flags & XEN_NETTXF_more_data); |
1145 | @@ -938,7 +950,7 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk, |
1146 | pending_idx = netbk->pending_ring[index]; |
1147 | page = xen_netbk_alloc_page(netbk, skb, pending_idx); |
1148 | if (!page) |
1149 | - return NULL; |
1150 | + goto err; |
1151 | |
1152 | gop->source.u.ref = txp->gref; |
1153 | gop->source.domid = vif->domid; |
1154 | @@ -960,6 +972,17 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk, |
1155 | } |
1156 | |
1157 | return gop; |
1158 | +err: |
1159 | + /* Unwind, freeing all pages and sending error responses. */ |
1160 | + while (i-- > start) { |
1161 | + xen_netbk_idx_release(netbk, frag_get_pending_idx(&frags[i]), |
1162 | + XEN_NETIF_RSP_ERROR); |
1163 | + } |
1164 | + /* The head too, if necessary. */ |
1165 | + if (start) |
1166 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_ERROR); |
1167 | + |
1168 | + return NULL; |
1169 | } |
1170 | |
1171 | static int xen_netbk_tx_check_gop(struct xen_netbk *netbk, |
1172 | @@ -968,30 +991,20 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk, |
1173 | { |
1174 | struct gnttab_copy *gop = *gopp; |
1175 | u16 pending_idx = *((u16 *)skb->data); |
1176 | - struct pending_tx_info *pending_tx_info = netbk->pending_tx_info; |
1177 | - struct xenvif *vif = pending_tx_info[pending_idx].vif; |
1178 | - struct xen_netif_tx_request *txp; |
1179 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
1180 | int nr_frags = shinfo->nr_frags; |
1181 | int i, err, start; |
1182 | |
1183 | /* Check status of header. */ |
1184 | err = gop->status; |
1185 | - if (unlikely(err)) { |
1186 | - pending_ring_idx_t index; |
1187 | - index = pending_index(netbk->pending_prod++); |
1188 | - txp = &pending_tx_info[pending_idx].req; |
1189 | - make_tx_response(vif, txp, XEN_NETIF_RSP_ERROR); |
1190 | - netbk->pending_ring[index] = pending_idx; |
1191 | - xenvif_put(vif); |
1192 | - } |
1193 | + if (unlikely(err)) |
1194 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_ERROR); |
1195 | |
1196 | /* Skip first skb fragment if it is on same page as header fragment. */ |
1197 | start = (frag_get_pending_idx(&shinfo->frags[0]) == pending_idx); |
1198 | |
1199 | for (i = start; i < nr_frags; i++) { |
1200 | int j, newerr; |
1201 | - pending_ring_idx_t index; |
1202 | |
1203 | pending_idx = frag_get_pending_idx(&shinfo->frags[i]); |
1204 | |
1205 | @@ -1000,16 +1013,12 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk, |
1206 | if (likely(!newerr)) { |
1207 | /* Had a previous error? Invalidate this fragment. */ |
1208 | if (unlikely(err)) |
1209 | - xen_netbk_idx_release(netbk, pending_idx); |
1210 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_OKAY); |
1211 | continue; |
1212 | } |
1213 | |
1214 | /* Error on this fragment: respond to client with an error. */ |
1215 | - txp = &netbk->pending_tx_info[pending_idx].req; |
1216 | - make_tx_response(vif, txp, XEN_NETIF_RSP_ERROR); |
1217 | - index = pending_index(netbk->pending_prod++); |
1218 | - netbk->pending_ring[index] = pending_idx; |
1219 | - xenvif_put(vif); |
1220 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_ERROR); |
1221 | |
1222 | /* Not the first error? Preceding frags already invalidated. */ |
1223 | if (err) |
1224 | @@ -1017,10 +1026,10 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk, |
1225 | |
1226 | /* First error: invalidate header and preceding fragments. */ |
1227 | pending_idx = *((u16 *)skb->data); |
1228 | - xen_netbk_idx_release(netbk, pending_idx); |
1229 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_OKAY); |
1230 | for (j = start; j < i; j++) { |
1231 | pending_idx = frag_get_pending_idx(&shinfo->frags[j]); |
1232 | - xen_netbk_idx_release(netbk, pending_idx); |
1233 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_OKAY); |
1234 | } |
1235 | |
1236 | /* Remember the error: invalidate all subsequent fragments. */ |
1237 | @@ -1054,7 +1063,7 @@ static void xen_netbk_fill_frags(struct xen_netbk *netbk, struct sk_buff *skb) |
1238 | |
1239 | /* Take an extra reference to offset xen_netbk_idx_release */ |
1240 | get_page(netbk->mmap_pages[pending_idx]); |
1241 | - xen_netbk_idx_release(netbk, pending_idx); |
1242 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_OKAY); |
1243 | } |
1244 | } |
1245 | |
1246 | @@ -1067,7 +1076,8 @@ static int xen_netbk_get_extras(struct xenvif *vif, |
1247 | |
1248 | do { |
1249 | if (unlikely(work_to_do-- <= 0)) { |
1250 | - netdev_dbg(vif->dev, "Missing extra info\n"); |
1251 | + netdev_err(vif->dev, "Missing extra info\n"); |
1252 | + netbk_fatal_tx_err(vif); |
1253 | return -EBADR; |
1254 | } |
1255 | |
1256 | @@ -1076,8 +1086,9 @@ static int xen_netbk_get_extras(struct xenvif *vif, |
1257 | if (unlikely(!extra.type || |
1258 | extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) { |
1259 | vif->tx.req_cons = ++cons; |
1260 | - netdev_dbg(vif->dev, |
1261 | + netdev_err(vif->dev, |
1262 | "Invalid extra type: %d\n", extra.type); |
1263 | + netbk_fatal_tx_err(vif); |
1264 | return -EINVAL; |
1265 | } |
1266 | |
1267 | @@ -1093,13 +1104,15 @@ static int netbk_set_skb_gso(struct xenvif *vif, |
1268 | struct xen_netif_extra_info *gso) |
1269 | { |
1270 | if (!gso->u.gso.size) { |
1271 | - netdev_dbg(vif->dev, "GSO size must not be zero.\n"); |
1272 | + netdev_err(vif->dev, "GSO size must not be zero.\n"); |
1273 | + netbk_fatal_tx_err(vif); |
1274 | return -EINVAL; |
1275 | } |
1276 | |
1277 | /* Currently only TCPv4 S.O. is supported. */ |
1278 | if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) { |
1279 | - netdev_dbg(vif->dev, "Bad GSO type %d.\n", gso->u.gso.type); |
1280 | + netdev_err(vif->dev, "Bad GSO type %d.\n", gso->u.gso.type); |
1281 | + netbk_fatal_tx_err(vif); |
1282 | return -EINVAL; |
1283 | } |
1284 | |
1285 | @@ -1236,9 +1249,25 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) |
1286 | |
1287 | /* Get a netif from the list with work to do. */ |
1288 | vif = poll_net_schedule_list(netbk); |
1289 | + /* This can sometimes happen because the test of |
1290 | + * list_empty(net_schedule_list) at the top of the |
1291 | + * loop is unlocked. Just go back and have another |
1292 | + * look. |
1293 | + */ |
1294 | if (!vif) |
1295 | continue; |
1296 | |
1297 | + if (vif->tx.sring->req_prod - vif->tx.req_cons > |
1298 | + XEN_NETIF_TX_RING_SIZE) { |
1299 | + netdev_err(vif->dev, |
1300 | + "Impossible number of requests. " |
1301 | + "req_prod %d, req_cons %d, size %ld\n", |
1302 | + vif->tx.sring->req_prod, vif->tx.req_cons, |
1303 | + XEN_NETIF_TX_RING_SIZE); |
1304 | + netbk_fatal_tx_err(vif); |
1305 | + continue; |
1306 | + } |
1307 | + |
1308 | RING_FINAL_CHECK_FOR_REQUESTS(&vif->tx, work_to_do); |
1309 | if (!work_to_do) { |
1310 | xenvif_put(vif); |
1311 | @@ -1266,17 +1295,14 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) |
1312 | work_to_do = xen_netbk_get_extras(vif, extras, |
1313 | work_to_do); |
1314 | idx = vif->tx.req_cons; |
1315 | - if (unlikely(work_to_do < 0)) { |
1316 | - netbk_tx_err(vif, &txreq, idx); |
1317 | + if (unlikely(work_to_do < 0)) |
1318 | continue; |
1319 | - } |
1320 | } |
1321 | |
1322 | ret = netbk_count_requests(vif, &txreq, txfrags, work_to_do); |
1323 | - if (unlikely(ret < 0)) { |
1324 | - netbk_tx_err(vif, &txreq, idx - ret); |
1325 | + if (unlikely(ret < 0)) |
1326 | continue; |
1327 | - } |
1328 | + |
1329 | idx += ret; |
1330 | |
1331 | if (unlikely(txreq.size < ETH_HLEN)) { |
1332 | @@ -1288,11 +1314,11 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) |
1333 | |
1334 | /* No crossing a page as the payload mustn't fragment. */ |
1335 | if (unlikely((txreq.offset + txreq.size) > PAGE_SIZE)) { |
1336 | - netdev_dbg(vif->dev, |
1337 | + netdev_err(vif->dev, |
1338 | "txreq.offset: %x, size: %u, end: %lu\n", |
1339 | txreq.offset, txreq.size, |
1340 | (txreq.offset&~PAGE_MASK) + txreq.size); |
1341 | - netbk_tx_err(vif, &txreq, idx); |
1342 | + netbk_fatal_tx_err(vif); |
1343 | continue; |
1344 | } |
1345 | |
1346 | @@ -1320,8 +1346,8 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk) |
1347 | gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1]; |
1348 | |
1349 | if (netbk_set_skb_gso(vif, skb, gso)) { |
1350 | + /* Failure in netbk_set_skb_gso is fatal. */ |
1351 | kfree_skb(skb); |
1352 | - netbk_tx_err(vif, &txreq, idx); |
1353 | continue; |
1354 | } |
1355 | } |
1356 | @@ -1420,7 +1446,7 @@ static void xen_netbk_tx_submit(struct xen_netbk *netbk) |
1357 | txp->size -= data_len; |
1358 | } else { |
1359 | /* Schedule a response immediately. */ |
1360 | - xen_netbk_idx_release(netbk, pending_idx); |
1361 | + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_OKAY); |
1362 | } |
1363 | |
1364 | if (txp->flags & XEN_NETTXF_csum_blank) |
1365 | @@ -1475,7 +1501,8 @@ static void xen_netbk_tx_action(struct xen_netbk *netbk) |
1366 | |
1367 | } |
1368 | |
1369 | -static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx) |
1370 | +static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx, |
1371 | + u8 status) |
1372 | { |
1373 | struct xenvif *vif; |
1374 | struct pending_tx_info *pending_tx_info; |
1375 | @@ -1489,7 +1516,7 @@ static void xen_netbk_idx_release(struct xen_netbk *netbk, u16 pending_idx) |
1376 | |
1377 | vif = pending_tx_info->vif; |
1378 | |
1379 | - make_tx_response(vif, &pending_tx_info->req, XEN_NETIF_RSP_OKAY); |
1380 | + make_tx_response(vif, &pending_tx_info->req, status); |
1381 | |
1382 | index = pending_index(netbk->pending_prod++); |
1383 | netbk->pending_ring[index] = pending_idx; |
1384 | diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c |
1385 | index 7481146..97c2be1 100644 |
1386 | --- a/drivers/platform/x86/ibm_rtl.c |
1387 | +++ b/drivers/platform/x86/ibm_rtl.c |
1388 | @@ -244,7 +244,7 @@ static int __init ibm_rtl_init(void) { |
1389 | if (force) |
1390 | pr_warn("module loaded by force\n"); |
1391 | /* first ensure that we are running on IBM HW */ |
1392 | - else if (efi_enabled || !dmi_check_system(ibm_rtl_dmi_table)) |
1393 | + else if (efi_enabled(EFI_BOOT) || !dmi_check_system(ibm_rtl_dmi_table)) |
1394 | return -ENODEV; |
1395 | |
1396 | /* Get the address for the Extended BIOS Data Area */ |
1397 | diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c |
1398 | index 1afbe5e..de9f432 100644 |
1399 | --- a/drivers/platform/x86/samsung-laptop.c |
1400 | +++ b/drivers/platform/x86/samsung-laptop.c |
1401 | @@ -26,6 +26,7 @@ |
1402 | #include <linux/seq_file.h> |
1403 | #include <linux/debugfs.h> |
1404 | #include <linux/ctype.h> |
1405 | +#include <linux/efi.h> |
1406 | #if (defined CONFIG_ACPI_VIDEO || defined CONFIG_ACPI_VIDEO_MODULE) |
1407 | #include <acpi/video.h> |
1408 | #endif |
1409 | @@ -1527,6 +1528,9 @@ static int __init samsung_init(void) |
1410 | struct samsung_laptop *samsung; |
1411 | int ret; |
1412 | |
1413 | + if (efi_enabled(EFI_BOOT)) |
1414 | + return -ENODEV; |
1415 | + |
1416 | quirks = &samsung_unknown; |
1417 | if (!force && !dmi_check_system(samsung_dmi_table)) |
1418 | return -ENODEV; |
1419 | diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c |
1420 | index 4c150df..5a1bd0c 100644 |
1421 | --- a/drivers/scsi/isci/init.c |
1422 | +++ b/drivers/scsi/isci/init.c |
1423 | @@ -470,7 +470,7 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic |
1424 | return -ENOMEM; |
1425 | pci_set_drvdata(pdev, pci_info); |
1426 | |
1427 | - if (efi_enabled) |
1428 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) |
1429 | orom = isci_get_efi_var(pdev); |
1430 | |
1431 | if (!orom) |
1432 | diff --git a/include/linux/efi.h b/include/linux/efi.h |
1433 | index 5782114..eee8b0b 100644 |
1434 | --- a/include/linux/efi.h |
1435 | +++ b/include/linux/efi.h |
1436 | @@ -539,18 +539,30 @@ extern int __init efi_setup_pcdp_console(char *); |
1437 | #endif |
1438 | |
1439 | /* |
1440 | - * We play games with efi_enabled so that the compiler will, if possible, remove |
1441 | - * EFI-related code altogether. |
1442 | + * We play games with efi_enabled so that the compiler will, if |
1443 | + * possible, remove EFI-related code altogether. |
1444 | */ |
1445 | +#define EFI_BOOT 0 /* Were we booted from EFI? */ |
1446 | +#define EFI_SYSTEM_TABLES 1 /* Can we use EFI system tables? */ |
1447 | +#define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ |
1448 | +#define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ |
1449 | +#define EFI_MEMMAP 4 /* Can we use EFI memory map? */ |
1450 | +#define EFI_64BIT 5 /* Is the firmware 64-bit? */ |
1451 | + |
1452 | #ifdef CONFIG_EFI |
1453 | # ifdef CONFIG_X86 |
1454 | - extern int efi_enabled; |
1455 | - extern bool efi_64bit; |
1456 | +extern int efi_enabled(int facility); |
1457 | # else |
1458 | -# define efi_enabled 1 |
1459 | +static inline int efi_enabled(int facility) |
1460 | +{ |
1461 | + return 1; |
1462 | +} |
1463 | # endif |
1464 | #else |
1465 | -# define efi_enabled 0 |
1466 | +static inline int efi_enabled(int facility) |
1467 | +{ |
1468 | + return 0; |
1469 | +} |
1470 | #endif |
1471 | |
1472 | /* |
1473 | diff --git a/init/main.c b/init/main.c |
1474 | index c2178d2..02c1384 100644 |
1475 | --- a/init/main.c |
1476 | +++ b/init/main.c |
1477 | @@ -602,7 +602,7 @@ asmlinkage void __init start_kernel(void) |
1478 | pidmap_init(); |
1479 | anon_vma_init(); |
1480 | #ifdef CONFIG_X86 |
1481 | - if (efi_enabled) |
1482 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) |
1483 | efi_enter_virtual_mode(); |
1484 | #endif |
1485 | thread_info_cache_init(); |
1486 | @@ -630,7 +630,7 @@ asmlinkage void __init start_kernel(void) |
1487 | acpi_early_init(); /* before LAPIC and SMP init */ |
1488 | sfi_init_late(); |
1489 | |
1490 | - if (efi_enabled) |
1491 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) |
1492 | efi_free_boot_services(); |
1493 | |
1494 | ftrace_init(); |
1495 | diff --git a/kernel/resource.c b/kernel/resource.c |
1496 | index 7e8ea66..bfe96b8 100644 |
1497 | --- a/kernel/resource.c |
1498 | +++ b/kernel/resource.c |
1499 | @@ -758,6 +758,7 @@ static void __init __reserve_region_with_split(struct resource *root, |
1500 | struct resource *parent = root; |
1501 | struct resource *conflict; |
1502 | struct resource *res = kzalloc(sizeof(*res), GFP_ATOMIC); |
1503 | + struct resource *next_res = NULL; |
1504 | |
1505 | if (!res) |
1506 | return; |
1507 | @@ -767,21 +768,46 @@ static void __init __reserve_region_with_split(struct resource *root, |
1508 | res->end = end; |
1509 | res->flags = IORESOURCE_BUSY; |
1510 | |
1511 | - conflict = __request_resource(parent, res); |
1512 | - if (!conflict) |
1513 | - return; |
1514 | + while (1) { |
1515 | |
1516 | - /* failed, split and try again */ |
1517 | - kfree(res); |
1518 | + conflict = __request_resource(parent, res); |
1519 | + if (!conflict) { |
1520 | + if (!next_res) |
1521 | + break; |
1522 | + res = next_res; |
1523 | + next_res = NULL; |
1524 | + continue; |
1525 | + } |
1526 | |
1527 | - /* conflict covered whole area */ |
1528 | - if (conflict->start <= start && conflict->end >= end) |
1529 | - return; |
1530 | + /* conflict covered whole area */ |
1531 | + if (conflict->start <= res->start && |
1532 | + conflict->end >= res->end) { |
1533 | + kfree(res); |
1534 | + WARN_ON(next_res); |
1535 | + break; |
1536 | + } |
1537 | + |
1538 | + /* failed, split and try again */ |
1539 | + if (conflict->start > res->start) { |
1540 | + end = res->end; |
1541 | + res->end = conflict->start - 1; |
1542 | + if (conflict->end < end) { |
1543 | + next_res = kzalloc(sizeof(*next_res), |
1544 | + GFP_ATOMIC); |
1545 | + if (!next_res) { |
1546 | + kfree(res); |
1547 | + break; |
1548 | + } |
1549 | + next_res->name = name; |
1550 | + next_res->start = conflict->end + 1; |
1551 | + next_res->end = end; |
1552 | + next_res->flags = IORESOURCE_BUSY; |
1553 | + } |
1554 | + } else { |
1555 | + res->start = conflict->end + 1; |
1556 | + } |
1557 | + } |
1558 | |
1559 | - if (conflict->start > start) |
1560 | - __reserve_region_with_split(root, start, conflict->start-1, name); |
1561 | - if (conflict->end < end) |
1562 | - __reserve_region_with_split(root, conflict->end+1, end, name); |
1563 | } |
1564 | |
1565 | void __init reserve_region_with_split(struct resource *root, |
1566 | diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c |
1567 | index 208edc0..605156f 100644 |
1568 | --- a/net/bluetooth/smp.c |
1569 | +++ b/net/bluetooth/smp.c |
1570 | @@ -852,6 +852,19 @@ int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb) |
1571 | |
1572 | skb_pull(skb, sizeof(code)); |
1573 | |
1574 | + /* |
1575 | + * The SMP context must be initialized for all other PDUs except |
1576 | + * pairing and security requests. If we get any other PDU when |
1577 | + * not initialized simply disconnect (done if this function |
1578 | + * returns an error). |
1579 | + */ |
1580 | + if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ && |
1581 | + !conn->smp_chan) { |
1582 | + BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code); |
1583 | + kfree_skb(skb); |
1584 | + return -ENOTSUPP; |
1585 | + } |
1586 | + |
1587 | switch (code) { |
1588 | case SMP_CMD_PAIRING_REQ: |
1589 | reason = smp_cmd_pairing_req(conn, skb); |
1590 | diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c |
1591 | index d7f49b6..e54ef82 100644 |
1592 | --- a/net/bridge/br_netfilter.c |
1593 | +++ b/net/bridge/br_netfilter.c |
1594 | @@ -254,6 +254,9 @@ static int br_parse_ip_options(struct sk_buff *skb) |
1595 | struct net_device *dev = skb->dev; |
1596 | u32 len; |
1597 | |
1598 | + if (!pskb_may_pull(skb, sizeof(struct iphdr))) |
1599 | + goto inhdr_error; |
1600 | + |
1601 | iph = ip_hdr(skb); |
1602 | opt = &(IPCB(skb)->opt); |
1603 | |
1604 | diff --git a/net/core/pktgen.c b/net/core/pktgen.c |
1605 | index 8dae76f..114d8a9 100644 |
1606 | --- a/net/core/pktgen.c |
1607 | +++ b/net/core/pktgen.c |
1608 | @@ -1802,10 +1802,13 @@ static ssize_t pktgen_thread_write(struct file *file, |
1609 | return -EFAULT; |
1610 | i += len; |
1611 | mutex_lock(&pktgen_thread_lock); |
1612 | - pktgen_add_device(t, f); |
1613 | + ret = pktgen_add_device(t, f); |
1614 | mutex_unlock(&pktgen_thread_lock); |
1615 | - ret = count; |
1616 | - sprintf(pg_result, "OK: add_device=%s", f); |
1617 | + if (!ret) { |
1618 | + ret = count; |
1619 | + sprintf(pg_result, "OK: add_device=%s", f); |
1620 | + } else |
1621 | + sprintf(pg_result, "ERROR: can not add device %s", f); |
1622 | goto out; |
1623 | } |
1624 | |
1625 | diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c |
1626 | index 59ef40a..3748284 100644 |
1627 | --- a/net/ipv4/ip_sockglue.c |
1628 | +++ b/net/ipv4/ip_sockglue.c |
1629 | @@ -589,7 +589,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, |
1630 | case IP_TTL: |
1631 | if (optlen < 1) |
1632 | goto e_inval; |
1633 | - if (val != -1 && (val < 0 || val > 255)) |
1634 | + if (val != -1 && (val < 1 || val > 255)) |
1635 | goto e_inval; |
1636 | inet->uc_ttl = val; |
1637 | break; |
1638 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
1639 | index 0e0b6d0..57b20b9 100644 |
1640 | --- a/net/ipv4/tcp_input.c |
1641 | +++ b/net/ipv4/tcp_input.c |
1642 | @@ -3639,6 +3639,11 @@ static int tcp_process_frto(struct sock *sk, int flag) |
1643 | } |
1644 | } else { |
1645 | if (!(flag & FLAG_DATA_ACKED) && (tp->frto_counter == 1)) { |
1646 | + if (!tcp_packets_in_flight(tp)) { |
1647 | + tcp_enter_frto_loss(sk, 2, flag); |
1648 | + return true; |
1649 | + } |
1650 | + |
1651 | /* Prevent sending of new data. */ |
1652 | tp->snd_cwnd = min(tp->snd_cwnd, |
1653 | tcp_packets_in_flight(tp)); |
1654 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
1655 | index 468a5ce..81e0ad2 100644 |
1656 | --- a/net/ipv6/addrconf.c |
1657 | +++ b/net/ipv6/addrconf.c |
1658 | @@ -1736,7 +1736,7 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx, |
1659 | continue; |
1660 | if ((rt->rt6i_flags & flags) != flags) |
1661 | continue; |
1662 | - if ((noflags != 0) && ((rt->rt6i_flags & flags) != 0)) |
1663 | + if ((rt->rt6i_flags & noflags) != 0) |
1664 | continue; |
1665 | dst_hold(&rt->dst); |
1666 | break; |
1667 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c |
1668 | index 13e5399..ce661ba 100644 |
1669 | --- a/net/ipv6/ip6_output.c |
1670 | +++ b/net/ipv6/ip6_output.c |
1671 | @@ -1287,10 +1287,10 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, |
1672 | cork->length = 0; |
1673 | sk->sk_sndmsg_page = NULL; |
1674 | sk->sk_sndmsg_off = 0; |
1675 | - exthdrlen = (opt ? opt->opt_flen : 0) - rt->rt6i_nfheader_len; |
1676 | + exthdrlen = (opt ? opt->opt_flen : 0); |
1677 | length += exthdrlen; |
1678 | transhdrlen += exthdrlen; |
1679 | - dst_exthdrlen = rt->dst.header_len; |
1680 | + dst_exthdrlen = rt->dst.header_len - rt->rt6i_nfheader_len; |
1681 | } else { |
1682 | rt = (struct rt6_info *)cork->dst; |
1683 | fl6 = &inet->cork.fl.u.ip6; |
1684 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
1685 | index b84cba1..493490f 100644 |
1686 | --- a/net/ipv6/route.c |
1687 | +++ b/net/ipv6/route.c |
1688 | @@ -846,7 +846,8 @@ restart: |
1689 | dst_hold(&rt->dst); |
1690 | read_unlock_bh(&table->tb6_lock); |
1691 | |
1692 | - if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
1693 | + if (!dst_get_neighbour_noref_raw(&rt->dst) && |
1694 | + !(rt->rt6i_flags & (RTF_NONEXTHOP | RTF_LOCAL))) |
1695 | nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); |
1696 | else if (!(rt->dst.flags & DST_HOST)) |
1697 | nrt = rt6_alloc_clone(rt, &fl6->daddr); |
1698 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
1699 | index 078fdff..38ca5e0 100644 |
1700 | --- a/net/packet/af_packet.c |
1701 | +++ b/net/packet/af_packet.c |
1702 | @@ -2450,13 +2450,15 @@ static int packet_release(struct socket *sock) |
1703 | |
1704 | packet_flush_mclist(sk); |
1705 | |
1706 | - memset(&req_u, 0, sizeof(req_u)); |
1707 | - |
1708 | - if (po->rx_ring.pg_vec) |
1709 | + if (po->rx_ring.pg_vec) { |
1710 | + memset(&req_u, 0, sizeof(req_u)); |
1711 | packet_set_ring(sk, &req_u, 1, 0); |
1712 | + } |
1713 | |
1714 | - if (po->tx_ring.pg_vec) |
1715 | + if (po->tx_ring.pg_vec) { |
1716 | + memset(&req_u, 0, sizeof(req_u)); |
1717 | packet_set_ring(sk, &req_u, 1, 1); |
1718 | + } |
1719 | |
1720 | fanout_release(sk); |
1721 | |
1722 | diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c |
1723 | index 68a385d..58cd035 100644 |
1724 | --- a/net/sctp/endpointola.c |
1725 | +++ b/net/sctp/endpointola.c |
1726 | @@ -248,6 +248,8 @@ void sctp_endpoint_free(struct sctp_endpoint *ep) |
1727 | /* Final destructor for endpoint. */ |
1728 | static void sctp_endpoint_destroy(struct sctp_endpoint *ep) |
1729 | { |
1730 | + int i; |
1731 | + |
1732 | SCTP_ASSERT(ep->base.dead, "Endpoint is not dead", return); |
1733 | |
1734 | /* Free up the HMAC transform. */ |
1735 | @@ -270,6 +272,9 @@ static void sctp_endpoint_destroy(struct sctp_endpoint *ep) |
1736 | sctp_inq_free(&ep->base.inqueue); |
1737 | sctp_bind_addr_free(&ep->base.bind_addr); |
1738 | |
1739 | + for (i = 0; i < SCTP_HOW_MANY_SECRETS; ++i) |
1740 | + memset(&ep->secret_key[i], 0, SCTP_SECRET_SIZE); |
1741 | + |
1742 | /* Remove and free the port */ |
1743 | if (sctp_sk(ep->base.sk)->bind_hash) |
1744 | sctp_put_port(ep->base.sk); |
1745 | diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c |
1746 | index cfeb1d4..96eb168 100644 |
1747 | --- a/net/sctp/outqueue.c |
1748 | +++ b/net/sctp/outqueue.c |
1749 | @@ -223,7 +223,7 @@ void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) |
1750 | |
1751 | /* Free the outqueue structure and any related pending chunks. |
1752 | */ |
1753 | -void sctp_outq_teardown(struct sctp_outq *q) |
1754 | +static void __sctp_outq_teardown(struct sctp_outq *q) |
1755 | { |
1756 | struct sctp_transport *transport; |
1757 | struct list_head *lchunk, *temp; |
1758 | @@ -276,8 +276,6 @@ void sctp_outq_teardown(struct sctp_outq *q) |
1759 | sctp_chunk_free(chunk); |
1760 | } |
1761 | |
1762 | - q->error = 0; |
1763 | - |
1764 | /* Throw away any leftover control chunks. */ |
1765 | list_for_each_entry_safe(chunk, tmp, &q->control_chunk_list, list) { |
1766 | list_del_init(&chunk->list); |
1767 | @@ -285,11 +283,17 @@ void sctp_outq_teardown(struct sctp_outq *q) |
1768 | } |
1769 | } |
1770 | |
1771 | +void sctp_outq_teardown(struct sctp_outq *q) |
1772 | +{ |
1773 | + __sctp_outq_teardown(q); |
1774 | + sctp_outq_init(q->asoc, q); |
1775 | +} |
1776 | + |
1777 | /* Free the outqueue structure and any related pending chunks. */ |
1778 | void sctp_outq_free(struct sctp_outq *q) |
1779 | { |
1780 | /* Throw away leftover chunks. */ |
1781 | - sctp_outq_teardown(q); |
1782 | + __sctp_outq_teardown(q); |
1783 | |
1784 | /* If we were kmalloc()'d, free the memory. */ |
1785 | if (q->malloced) |
1786 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
1787 | index 7405355..9fd05ed 100644 |
1788 | --- a/net/sctp/socket.c |
1789 | +++ b/net/sctp/socket.c |
1790 | @@ -3375,7 +3375,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk, |
1791 | |
1792 | ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey); |
1793 | out: |
1794 | - kfree(authkey); |
1795 | + kzfree(authkey); |
1796 | return ret; |
1797 | } |
1798 |