Annotation of /trunk/kernel-lts/patches-3.4/0130-3.4.31-all-fixes.patch
Parent Directory | Revision Log
Revision 2084 -
(hide 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 | niro | 2084 | 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 |