Annotation of /trunk/kernel26-magellan-server/patches-2.6.31-r4/0106-2.6.31.7-all-fixes.patch
Parent Directory | Revision Log
Revision 968 -
(hide annotations)
(download)
Fri Jan 1 14:52:51 2010 UTC (14 years, 8 months ago) by niro
File size: 133338 byte(s)
Fri Jan 1 14:52:51 2010 UTC (14 years, 8 months ago) by niro
File size: 133338 byte(s)
-2.6.31-magellan-r4: -updated to linux-2.6.31.9
1 | niro | 968 | diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt |
2 | index 573f95b..d0a9ee3 100644 | ||
3 | --- a/Documentation/video4linux/gspca.txt | ||
4 | +++ b/Documentation/video4linux/gspca.txt | ||
5 | @@ -284,6 +284,7 @@ sonixj 0c45:613a Microdia Sonix PC Camera | ||
6 | sonixj 0c45:613b Surfer SN-206 | ||
7 | sonixj 0c45:613c Sonix Pccam168 | ||
8 | sonixj 0c45:6143 Sonix Pccam168 | ||
9 | +sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia | ||
10 | sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001) | ||
11 | sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111) | ||
12 | sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655) | ||
13 | diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h | ||
14 | index d16ec97..c019949 100644 | ||
15 | --- a/arch/arm/include/asm/kmap_types.h | ||
16 | +++ b/arch/arm/include/asm/kmap_types.h | ||
17 | @@ -22,4 +22,10 @@ enum km_type { | ||
18 | KM_TYPE_NR | ||
19 | }; | ||
20 | |||
21 | +#ifdef CONFIG_DEBUG_HIGHMEM | ||
22 | +#define KM_NMI (-1) | ||
23 | +#define KM_NMI_PTE (-1) | ||
24 | +#define KM_IRQ_PTE (-1) | ||
25 | +#endif | ||
26 | + | ||
27 | #endif | ||
28 | diff --git a/arch/powerpc/include/asm/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h | ||
29 | index b6bac6f..9163695 100644 | ||
30 | --- a/arch/powerpc/include/asm/kmap_types.h | ||
31 | +++ b/arch/powerpc/include/asm/kmap_types.h | ||
32 | @@ -29,5 +29,16 @@ enum km_type { | ||
33 | KM_TYPE_NR | ||
34 | }; | ||
35 | |||
36 | +/* | ||
37 | + * This is a temporary build fix that (so they say on lkml....) should no longer | ||
38 | + * be required after 2.6.33, because of changes planned to the kmap code. | ||
39 | + * Let's try to remove this cruft then. | ||
40 | + */ | ||
41 | +#ifdef CONFIG_DEBUG_HIGHMEM | ||
42 | +#define KM_NMI (-1) | ||
43 | +#define KM_NMI_PTE (-1) | ||
44 | +#define KM_IRQ_PTE (-1) | ||
45 | +#endif | ||
46 | + | ||
47 | #endif /* __KERNEL__ */ | ||
48 | #endif /* _ASM_POWERPC_KMAP_TYPES_H */ | ||
49 | diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c | ||
50 | index 0fb5789..7b4adbc 100644 | ||
51 | --- a/arch/sparc/kernel/prom_common.c | ||
52 | +++ b/arch/sparc/kernel/prom_common.c | ||
53 | @@ -76,6 +76,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len | ||
54 | |||
55 | err = -ENODEV; | ||
56 | |||
57 | + mutex_lock(&of_set_property_mutex); | ||
58 | write_lock(&devtree_lock); | ||
59 | prevp = &dp->properties; | ||
60 | while (*prevp) { | ||
61 | @@ -85,9 +86,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len | ||
62 | void *old_val = prop->value; | ||
63 | int ret; | ||
64 | |||
65 | - mutex_lock(&of_set_property_mutex); | ||
66 | ret = prom_setprop(dp->node, name, val, len); | ||
67 | - mutex_unlock(&of_set_property_mutex); | ||
68 | |||
69 | err = -EINVAL; | ||
70 | if (ret >= 0) { | ||
71 | @@ -106,6 +105,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len | ||
72 | prevp = &(*prevp)->next; | ||
73 | } | ||
74 | write_unlock(&devtree_lock); | ||
75 | + mutex_unlock(&of_set_property_mutex); | ||
76 | |||
77 | /* XXX Upate procfs if necessary... */ | ||
78 | |||
79 | diff --git a/arch/sparc/kernel/visemul.c b/arch/sparc/kernel/visemul.c | ||
80 | index b956fd7..d231cbd 100644 | ||
81 | --- a/arch/sparc/kernel/visemul.c | ||
82 | +++ b/arch/sparc/kernel/visemul.c | ||
83 | @@ -617,7 +617,7 @@ static void pmul(struct pt_regs *regs, unsigned int insn, unsigned int opf) | ||
84 | rs2 = fps_regval(f, RS2(insn)); | ||
85 | |||
86 | rd_val = 0; | ||
87 | - src2 = (rs2 >> (opf == FMUL8x16AU_OPF) ? 16 : 0); | ||
88 | + src2 = rs2 >> (opf == FMUL8x16AU_OPF ? 16 : 0); | ||
89 | for (byte = 0; byte < 4; byte++) { | ||
90 | u16 src1 = (rs1 >> (byte * 8)) & 0x00ff; | ||
91 | u32 prod = src1 * src2; | ||
92 | diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c | ||
93 | index d296f4a..d85d1b2 100644 | ||
94 | --- a/arch/x86/kernel/acpi/processor.c | ||
95 | +++ b/arch/x86/kernel/acpi/processor.c | ||
96 | @@ -79,7 +79,8 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr) | ||
97 | struct cpuinfo_x86 *c = &cpu_data(pr->id); | ||
98 | |||
99 | pr->pdc = NULL; | ||
100 | - if (c->x86_vendor == X86_VENDOR_INTEL) | ||
101 | + if (c->x86_vendor == X86_VENDOR_INTEL || | ||
102 | + c->x86_vendor == X86_VENDOR_CENTAUR) | ||
103 | init_intel_pdc(pr, c); | ||
104 | |||
105 | return; | ||
106 | diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | ||
107 | index 6911e91..3ae5a7a 100644 | ||
108 | --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | ||
109 | +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | ||
110 | @@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void) | ||
111 | return 0; | ||
112 | } | ||
113 | |||
114 | -struct get_freq_data { | ||
115 | - unsigned int speed; | ||
116 | - unsigned int processor; | ||
117 | -}; | ||
118 | - | ||
119 | -static void get_freq_data(void *_data) | ||
120 | +static void get_freq_data(void *_speed) | ||
121 | { | ||
122 | - struct get_freq_data *data = _data; | ||
123 | + unsigned int *speed = _speed; | ||
124 | |||
125 | - data->speed = speedstep_get_frequency(data->processor); | ||
126 | + *speed = speedstep_get_frequency(speedstep_processor); | ||
127 | } | ||
128 | |||
129 | static unsigned int speedstep_get(unsigned int cpu) | ||
130 | { | ||
131 | - struct get_freq_data data = { .processor = cpu }; | ||
132 | + unsigned int speed; | ||
133 | |||
134 | /* You're supposed to ensure CPU is online. */ | ||
135 | - if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0) | ||
136 | + if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0) | ||
137 | BUG(); | ||
138 | |||
139 | - dprintk("detected %u kHz as current frequency\n", data.speed); | ||
140 | - return data.speed; | ||
141 | + dprintk("detected %u kHz as current frequency\n", speed); | ||
142 | + return speed; | ||
143 | } | ||
144 | |||
145 | /** | ||
146 | diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c | ||
147 | index 6a45365..62711dd 100644 | ||
148 | --- a/drivers/char/agp/intel-agp.c | ||
149 | +++ b/drivers/char/agp/intel-agp.c | ||
150 | @@ -52,6 +52,7 @@ | ||
151 | #define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042 | ||
152 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044 | ||
153 | #define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062 | ||
154 | +#define PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB 0x006a | ||
155 | #define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046 | ||
156 | |||
157 | /* cover 915 and 945 variants */ | ||
158 | @@ -86,7 +87,8 @@ | ||
159 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \ | ||
160 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \ | ||
161 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \ | ||
162 | - agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB) | ||
163 | + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB || \ | ||
164 | + agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB) | ||
165 | |||
166 | extern int agp_memory_reserved; | ||
167 | |||
168 | @@ -1239,6 +1241,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size) | ||
169 | case PCI_DEVICE_ID_INTEL_IGDNG_D_HB: | ||
170 | case PCI_DEVICE_ID_INTEL_IGDNG_M_HB: | ||
171 | case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB: | ||
172 | + case PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB: | ||
173 | *gtt_offset = *gtt_size = MB(2); | ||
174 | break; | ||
175 | default: | ||
176 | @@ -2222,6 +2225,8 @@ static const struct intel_driver_description { | ||
177 | "IGDNG/M", NULL, &intel_i965_driver }, | ||
178 | { PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, | ||
179 | "IGDNG/MA", NULL, &intel_i965_driver }, | ||
180 | + { PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0, | ||
181 | + "IGDNG/MC2", NULL, &intel_i965_driver }, | ||
182 | { 0, 0, 0, NULL, NULL, NULL } | ||
183 | }; | ||
184 | |||
185 | @@ -2418,6 +2423,7 @@ static struct pci_device_id agp_intel_pci_table[] = { | ||
186 | ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB), | ||
187 | ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB), | ||
188 | ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB), | ||
189 | + ID(PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB), | ||
190 | { } | ||
191 | }; | ||
192 | |||
193 | diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c | ||
194 | index 737be95..950837c 100644 | ||
195 | --- a/drivers/char/keyboard.c | ||
196 | +++ b/drivers/char/keyboard.c | ||
197 | @@ -1249,7 +1249,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw) | ||
198 | |||
199 | if (keycode >= NR_KEYS) | ||
200 | if (keycode >= KEY_BRL_DOT1 && keycode <= KEY_BRL_DOT8) | ||
201 | - keysym = K(KT_BRL, keycode - KEY_BRL_DOT1 + 1); | ||
202 | + keysym = U(K(KT_BRL, keycode - KEY_BRL_DOT1 + 1)); | ||
203 | else | ||
204 | return; | ||
205 | else | ||
206 | diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c | ||
207 | index fa4ce67..c0ff7ee 100644 | ||
208 | --- a/drivers/char/tty_port.c | ||
209 | +++ b/drivers/char/tty_port.c | ||
210 | @@ -217,8 +217,14 @@ int tty_port_block_til_ready(struct tty_port *port, | ||
211 | |||
212 | /* if non-blocking mode is set we can pass directly to open unless | ||
213 | the port has just hung up or is in another error state */ | ||
214 | - if ((filp->f_flags & O_NONBLOCK) || | ||
215 | - (tty->flags & (1 << TTY_IO_ERROR))) { | ||
216 | + if (tty->flags & (1 << TTY_IO_ERROR)) { | ||
217 | + port->flags |= ASYNC_NORMAL_ACTIVE; | ||
218 | + return 0; | ||
219 | + } | ||
220 | + if (filp->f_flags & O_NONBLOCK) { | ||
221 | + /* Indicate we are open */ | ||
222 | + if (tty->termios->c_cflag & CBAUD) | ||
223 | + tty_port_raise_dtr_rts(port); | ||
224 | port->flags |= ASYNC_NORMAL_ACTIVE; | ||
225 | return 0; | ||
226 | } | ||
227 | diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c | ||
228 | index a9952b1..84c51e1 100644 | ||
229 | --- a/drivers/crypto/padlock-aes.c | ||
230 | +++ b/drivers/crypto/padlock-aes.c | ||
231 | @@ -236,7 +236,7 @@ static inline void ecb_crypt(const u8 *in, u8 *out, u32 *key, | ||
232 | /* Padlock in ECB mode fetches at least ecb_fetch_bytes of data. | ||
233 | * We could avoid some copying here but it's probably not worth it. | ||
234 | */ | ||
235 | - if (unlikely(((unsigned long)in & PAGE_SIZE) + ecb_fetch_bytes > PAGE_SIZE)) { | ||
236 | + if (unlikely(((unsigned long)in & ~PAGE_MASK) + ecb_fetch_bytes > PAGE_SIZE)) { | ||
237 | ecb_crypt_copy(in, out, key, cword, count); | ||
238 | return; | ||
239 | } | ||
240 | @@ -248,7 +248,7 @@ static inline u8 *cbc_crypt(const u8 *in, u8 *out, u32 *key, | ||
241 | u8 *iv, struct cword *cword, int count) | ||
242 | { | ||
243 | /* Padlock in CBC mode fetches at least cbc_fetch_bytes of data. */ | ||
244 | - if (unlikely(((unsigned long)in & PAGE_SIZE) + cbc_fetch_bytes > PAGE_SIZE)) | ||
245 | + if (unlikely(((unsigned long)in & ~PAGE_MASK) + cbc_fetch_bytes > PAGE_SIZE)) | ||
246 | return cbc_crypt_copy(in, out, key, iv, cword, count); | ||
247 | |||
248 | return rep_xcrypt_cbc(in, out, key, iv, cword, count); | ||
249 | diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig | ||
250 | index 39b393d..012cf1f 100644 | ||
251 | --- a/drivers/gpu/drm/Kconfig | ||
252 | +++ b/drivers/gpu/drm/Kconfig | ||
253 | @@ -82,6 +82,7 @@ config DRM_I830 | ||
254 | config DRM_I915 | ||
255 | tristate "i915 driver" | ||
256 | depends on AGP_INTEL | ||
257 | + select SHMEM | ||
258 | select FB_CFB_FILLRECT | ||
259 | select FB_CFB_COPYAREA | ||
260 | select FB_CFB_IMAGEBLIT | ||
261 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c | ||
262 | index 7f2728b..55fb98d 100644 | ||
263 | --- a/drivers/gpu/drm/drm_edid.c | ||
264 | +++ b/drivers/gpu/drm/drm_edid.c | ||
265 | @@ -333,6 +333,12 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | ||
266 | mode->vsync_end = mode->vsync_start + vsync_pulse_width; | ||
267 | mode->vtotal = mode->vdisplay + vblank; | ||
268 | |||
269 | + /* Some EDIDs have bogus h/vtotal values */ | ||
270 | + if (mode->hsync_end > mode->htotal) | ||
271 | + mode->htotal = mode->hsync_end + 1; | ||
272 | + if (mode->vsync_end > mode->vtotal) | ||
273 | + mode->vtotal = mode->vsync_end + 1; | ||
274 | + | ||
275 | drm_mode_set_name(mode); | ||
276 | |||
277 | if (pt->misc & DRM_EDID_PT_INTERLACED) | ||
278 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
279 | index 7ebc84c..9431a72 100644 | ||
280 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
281 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
282 | @@ -253,10 +253,15 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) | ||
283 | { | ||
284 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | ||
285 | int ret = IRQ_NONE; | ||
286 | - u32 de_iir, gt_iir; | ||
287 | + u32 de_iir, gt_iir, de_ier; | ||
288 | u32 new_de_iir, new_gt_iir; | ||
289 | struct drm_i915_master_private *master_priv; | ||
290 | |||
291 | + /* disable master interrupt before clearing iir */ | ||
292 | + de_ier = I915_READ(DEIER); | ||
293 | + I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); | ||
294 | + (void)I915_READ(DEIER); | ||
295 | + | ||
296 | de_iir = I915_READ(DEIIR); | ||
297 | gt_iir = I915_READ(GTIIR); | ||
298 | |||
299 | @@ -287,6 +292,9 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) | ||
300 | gt_iir = new_gt_iir; | ||
301 | } | ||
302 | |||
303 | + I915_WRITE(DEIER, de_ier); | ||
304 | + (void)I915_READ(DEIER); | ||
305 | + | ||
306 | return ret; | ||
307 | } | ||
308 | |||
309 | diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c | ||
310 | index 1d30802..75a9b83 100644 | ||
311 | --- a/drivers/gpu/drm/i915/intel_fb.c | ||
312 | +++ b/drivers/gpu/drm/i915/intel_fb.c | ||
313 | @@ -114,7 +114,7 @@ static int intelfb_check_var(struct fb_var_screeninfo *var, | ||
314 | struct drm_framebuffer *fb = &intel_fb->base; | ||
315 | int depth; | ||
316 | |||
317 | - if (var->pixclock == -1 || !var->pixclock) | ||
318 | + if (var->pixclock != 0) | ||
319 | return -EINVAL; | ||
320 | |||
321 | /* Need to resize the fb object !!! */ | ||
322 | @@ -205,7 +205,7 @@ static int intelfb_set_par(struct fb_info *info) | ||
323 | |||
324 | DRM_DEBUG("%d %d\n", var->xres, var->pixclock); | ||
325 | |||
326 | - if (var->pixclock != -1) { | ||
327 | + if (var->pixclock != 0) { | ||
328 | |||
329 | DRM_ERROR("PIXEL CLOCK SET\n"); | ||
330 | return -EINVAL; | ||
331 | @@ -692,7 +692,7 @@ static int intelfb_multi_fb_probe_crtc(struct drm_device *dev, struct drm_crtc * | ||
332 | par->crtc_count = 1; | ||
333 | |||
334 | if (new_fb) { | ||
335 | - info->var.pixclock = -1; | ||
336 | + info->var.pixclock = 0; | ||
337 | if (register_framebuffer(info) < 0) | ||
338 | return -EINVAL; | ||
339 | } else | ||
340 | @@ -846,7 +846,7 @@ static int intelfb_single_fb_probe(struct drm_device *dev) | ||
341 | par->crtc_count = crtc_count; | ||
342 | |||
343 | if (new_fb) { | ||
344 | - info->var.pixclock = -1; | ||
345 | + info->var.pixclock = 0; | ||
346 | if (register_framebuffer(info) < 0) | ||
347 | return -EINVAL; | ||
348 | } else | ||
349 | diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c | ||
350 | index ec383ed..f1d6d3d 100644 | ||
351 | --- a/drivers/gpu/drm/radeon/radeon_fb.c | ||
352 | +++ b/drivers/gpu/drm/radeon/radeon_fb.c | ||
353 | @@ -120,7 +120,7 @@ static int radeonfb_check_var(struct fb_var_screeninfo *var, | ||
354 | struct drm_framebuffer *fb = &rfb->base; | ||
355 | int depth; | ||
356 | |||
357 | - if (var->pixclock == -1 || !var->pixclock) { | ||
358 | + if (var->pixclock != 0) { | ||
359 | return -EINVAL; | ||
360 | } | ||
361 | /* Need to resize the fb object !!! */ | ||
362 | @@ -234,7 +234,7 @@ static int radeonfb_set_par(struct fb_info *info) | ||
363 | int ret; | ||
364 | int i; | ||
365 | |||
366 | - if (var->pixclock != -1) { | ||
367 | + if (var->pixclock != 0) { | ||
368 | DRM_ERROR("PIXEL CLCOK SET\n"); | ||
369 | return -EINVAL; | ||
370 | } | ||
371 | @@ -828,7 +828,7 @@ static int radeonfb_single_fb_probe(struct radeon_device *rdev) | ||
372 | rfbdev->crtc_count = crtc_count; | ||
373 | |||
374 | if (new_fb) { | ||
375 | - info->var.pixclock = -1; | ||
376 | + info->var.pixclock = 0; | ||
377 | if (register_framebuffer(info) < 0) | ||
378 | return -EINVAL; | ||
379 | } else { | ||
380 | diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c | ||
381 | index d39877a..20579fa 100644 | ||
382 | --- a/drivers/hwmon/adt7475.c | ||
383 | +++ b/drivers/hwmon/adt7475.c | ||
384 | @@ -350,8 +350,7 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *attr, | ||
385 | |||
386 | case FAULT: | ||
387 | /* Note - only for remote1 and remote2 */ | ||
388 | - out = data->alarms & (sattr->index ? 0x8000 : 0x4000); | ||
389 | - out = out ? 0 : 1; | ||
390 | + out = !!(data->alarms & (sattr->index ? 0x8000 : 0x4000)); | ||
391 | break; | ||
392 | |||
393 | default: | ||
394 | @@ -1152,7 +1151,7 @@ static struct adt7475_data *adt7475_update_device(struct device *dev) | ||
395 | } | ||
396 | |||
397 | /* Limits and settings, should never change update every 60 seconds */ | ||
398 | - if (time_after(jiffies, data->limits_updated + HZ * 2) || | ||
399 | + if (time_after(jiffies, data->limits_updated + HZ * 60) || | ||
400 | !data->valid) { | ||
401 | data->config5 = adt7475_read(REG_CONFIG5); | ||
402 | |||
403 | diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c | ||
404 | index 0e45c29..529d82c 100644 | ||
405 | --- a/drivers/i2c/i2c-core.c | ||
406 | +++ b/drivers/i2c/i2c-core.c | ||
407 | @@ -718,6 +718,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | ||
408 | { | ||
409 | int res = 0; | ||
410 | struct i2c_adapter *found; | ||
411 | + struct i2c_client *client, *next; | ||
412 | |||
413 | /* First make sure that this adapter was ever added */ | ||
414 | mutex_lock(&core_lock); | ||
415 | @@ -737,6 +738,16 @@ int i2c_del_adapter(struct i2c_adapter *adap) | ||
416 | if (res) | ||
417 | return res; | ||
418 | |||
419 | + /* Remove devices instantiated from sysfs */ | ||
420 | + list_for_each_entry_safe(client, next, &userspace_devices, detected) { | ||
421 | + if (client->adapter == adap) { | ||
422 | + dev_dbg(&adap->dev, "Removing %s at 0x%x\n", | ||
423 | + client->name, client->addr); | ||
424 | + list_del(&client->detected); | ||
425 | + i2c_unregister_device(client); | ||
426 | + } | ||
427 | + } | ||
428 | + | ||
429 | /* Detach any active clients. This can't fail, thus we do not | ||
430 | checking the returned value. */ | ||
431 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); | ||
432 | diff --git a/drivers/isdn/hisax/hfc_usb.c b/drivers/isdn/hisax/hfc_usb.c | ||
433 | index 9de5420..a420b64 100644 | ||
434 | --- a/drivers/isdn/hisax/hfc_usb.c | ||
435 | +++ b/drivers/isdn/hisax/hfc_usb.c | ||
436 | @@ -817,8 +817,8 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish) | ||
437 | } | ||
438 | /* we have a complete hdlc packet */ | ||
439 | if (finish) { | ||
440 | - if ((!fifo->skbuff->data[fifo->skbuff->len - 1]) | ||
441 | - && (fifo->skbuff->len > 3)) { | ||
442 | + if (fifo->skbuff->len > 3 && | ||
443 | + !fifo->skbuff->data[fifo->skbuff->len - 1]) { | ||
444 | |||
445 | if (fifon == HFCUSB_D_RX) { | ||
446 | DBG(HFCUSB_DBG_DCHANNEL, | ||
447 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
448 | index 9dd8720..78871cd 100644 | ||
449 | --- a/drivers/md/md.c | ||
450 | +++ b/drivers/md/md.c | ||
451 | @@ -6495,8 +6495,9 @@ void md_do_sync(mddev_t *mddev) | ||
452 | skip: | ||
453 | mddev->curr_resync = 0; | ||
454 | mddev->curr_resync_completed = 0; | ||
455 | - mddev->resync_min = 0; | ||
456 | - mddev->resync_max = MaxSector; | ||
457 | + if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) | ||
458 | + /* We completed so max setting can be forgotten. */ | ||
459 | + mddev->resync_max = MaxSector; | ||
460 | sysfs_notify(&mddev->kobj, NULL, "sync_completed"); | ||
461 | wake_up(&resync_wait); | ||
462 | set_bit(MD_RECOVERY_DONE, &mddev->recovery); | ||
463 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
464 | index 8726fd7..d3e492e 100644 | ||
465 | --- a/drivers/md/raid1.c | ||
466 | +++ b/drivers/md/raid1.c | ||
467 | @@ -1643,11 +1643,12 @@ static void raid1d(mddev_t *mddev) | ||
468 | r1_bio->sector, | ||
469 | r1_bio->sectors); | ||
470 | unfreeze_array(conf); | ||
471 | - } | ||
472 | + } else | ||
473 | + md_error(mddev, | ||
474 | + conf->mirrors[r1_bio->read_disk].rdev); | ||
475 | |||
476 | bio = r1_bio->bios[r1_bio->read_disk]; | ||
477 | - if ((disk=read_balance(conf, r1_bio)) == -1 || | ||
478 | - disk == r1_bio->read_disk) { | ||
479 | + if ((disk=read_balance(conf, r1_bio)) == -1) { | ||
480 | printk(KERN_ALERT "raid1: %s: unrecoverable I/O" | ||
481 | " read error for block %llu\n", | ||
482 | bdevname(bio->bi_bdev,b), | ||
483 | @@ -1676,6 +1677,7 @@ static void raid1d(mddev_t *mddev) | ||
484 | generic_make_request(bio); | ||
485 | } | ||
486 | } | ||
487 | + cond_resched(); | ||
488 | } | ||
489 | if (unplug) | ||
490 | unplug_slaves(mddev); | ||
491 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
492 | index 3d9020c..6a5a5fb 100644 | ||
493 | --- a/drivers/md/raid10.c | ||
494 | +++ b/drivers/md/raid10.c | ||
495 | @@ -1630,6 +1630,7 @@ static void raid10d(mddev_t *mddev) | ||
496 | generic_make_request(bio); | ||
497 | } | ||
498 | } | ||
499 | + cond_resched(); | ||
500 | } | ||
501 | if (unplug) | ||
502 | unplug_slaves(mddev); | ||
503 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
504 | index b8a2c5d..c339c8f 100644 | ||
505 | --- a/drivers/md/raid5.c | ||
506 | +++ b/drivers/md/raid5.c | ||
507 | @@ -3790,6 +3790,8 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped | ||
508 | sector_nr = conf->reshape_progress; | ||
509 | sector_div(sector_nr, new_data_disks); | ||
510 | if (sector_nr) { | ||
511 | + mddev->curr_resync_completed = sector_nr; | ||
512 | + sysfs_notify(&mddev->kobj, NULL, "sync_completed"); | ||
513 | *skipped = 1; | ||
514 | return sector_nr; | ||
515 | } | ||
516 | diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c | ||
517 | index b109356..f446f9a 100644 | ||
518 | --- a/drivers/media/common/tuners/tda18271-fe.c | ||
519 | +++ b/drivers/media/common/tuners/tda18271-fe.c | ||
520 | @@ -595,13 +595,13 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) | ||
521 | case RF2: | ||
522 | map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] - | ||
523 | prog_cal[RF1] + prog_tab[RF1]) / | ||
524 | - ((rf_freq[RF2] - rf_freq[RF1]) / 1000); | ||
525 | + (s32)((rf_freq[RF2] - rf_freq[RF1]) / 1000); | ||
526 | map[i].rf2 = rf_freq[RF2] / 1000; | ||
527 | break; | ||
528 | case RF3: | ||
529 | map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] - | ||
530 | prog_cal[RF2] + prog_tab[RF2]) / | ||
531 | - ((rf_freq[RF3] - rf_freq[RF2]) / 1000); | ||
532 | + (s32)((rf_freq[RF3] - rf_freq[RF2]) / 1000); | ||
533 | map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2]; | ||
534 | map[i].rf3 = rf_freq[RF3] / 1000; | ||
535 | break; | ||
536 | @@ -963,12 +963,12 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe, | ||
537 | struct tda18271_std_map_item *map; | ||
538 | char *mode; | ||
539 | int ret; | ||
540 | - u32 freq = params->frequency * 62500; | ||
541 | + u32 freq = params->frequency * 125 * | ||
542 | + ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2; | ||
543 | |||
544 | priv->mode = TDA18271_ANALOG; | ||
545 | |||
546 | if (params->mode == V4L2_TUNER_RADIO) { | ||
547 | - freq = freq / 1000; | ||
548 | map = &std_map->fm_radio; | ||
549 | mode = "fm"; | ||
550 | } else if (params->std & V4L2_STD_MN) { | ||
551 | diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c | ||
552 | index 406d7fb..f32b332 100644 | ||
553 | --- a/drivers/media/dvb/dvb-usb/cxusb.c | ||
554 | +++ b/drivers/media/dvb/dvb-usb/cxusb.c | ||
555 | @@ -663,6 +663,14 @@ static struct zl10353_config cxusb_zl10353_xc3028_config = { | ||
556 | .parallel_ts = 1, | ||
557 | }; | ||
558 | |||
559 | +static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = { | ||
560 | + .demod_address = 0x0f, | ||
561 | + .if2 = 45600, | ||
562 | + .no_tuner = 1, | ||
563 | + .parallel_ts = 1, | ||
564 | + .disable_i2c_gate_ctrl = 1, | ||
565 | +}; | ||
566 | + | ||
567 | static struct mt352_config cxusb_mt352_xc3028_config = { | ||
568 | .demod_address = 0x0f, | ||
569 | .if2 = 4560, | ||
570 | @@ -894,7 +902,7 @@ static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap) | ||
571 | cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1); | ||
572 | |||
573 | if ((adap->fe = dvb_attach(zl10353_attach, | ||
574 | - &cxusb_zl10353_xc3028_config, | ||
575 | + &cxusb_zl10353_xc3028_config_no_i2c_gate, | ||
576 | &adap->dev->i2c_adap)) == NULL) | ||
577 | return -EIO; | ||
578 | |||
579 | diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c | ||
580 | index 8217e5b..ac10fff 100644 | ||
581 | --- a/drivers/media/dvb/frontends/dib7000p.c | ||
582 | +++ b/drivers/media/dvb/frontends/dib7000p.c | ||
583 | @@ -1344,6 +1344,11 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, | ||
584 | if (dib7000p_identify(st) != 0) | ||
585 | goto error; | ||
586 | |||
587 | + /* FIXME: make sure the dev.parent field is initialized, or else | ||
588 | + request_firmware() will hit an OOPS (this should be moved somewhere | ||
589 | + more common) */ | ||
590 | + st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent; | ||
591 | + | ||
592 | dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr); | ||
593 | |||
594 | dib7000p_demod_reset(st); | ||
595 | diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c | ||
596 | index cb8a358..8f88a58 100644 | ||
597 | --- a/drivers/media/dvb/siano/smsusb.c | ||
598 | +++ b/drivers/media/dvb/siano/smsusb.c | ||
599 | @@ -529,6 +529,12 @@ struct usb_device_id smsusb_id_table[] = { | ||
600 | .driver_info = SMS1XXX_BOARD_SIANO_NICE }, | ||
601 | { USB_DEVICE(0x187f, 0x0301), | ||
602 | .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, | ||
603 | + { USB_DEVICE(0x2040, 0xb900), | ||
604 | + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | ||
605 | + { USB_DEVICE(0x2040, 0xb910), | ||
606 | + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | ||
607 | + { USB_DEVICE(0x2040, 0xc000), | ||
608 | + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, | ||
609 | { } /* Terminating entry */ | ||
610 | }; | ||
611 | |||
612 | diff --git a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c | ||
613 | index c3f579d..c6cf116 100644 | ||
614 | --- a/drivers/media/radio/radio-gemtek-pci.c | ||
615 | +++ b/drivers/media/radio/radio-gemtek-pci.c | ||
616 | @@ -181,12 +181,10 @@ static void gemtek_pci_mute(struct gemtek_pci *card) | ||
617 | |||
618 | static void gemtek_pci_unmute(struct gemtek_pci *card) | ||
619 | { | ||
620 | - mutex_lock(&card->lock); | ||
621 | if (card->mute) { | ||
622 | gemtek_pci_setfrequency(card, card->current_frequency); | ||
623 | card->mute = false; | ||
624 | } | ||
625 | - mutex_unlock(&card->lock); | ||
626 | } | ||
627 | |||
628 | static int gemtek_pci_getsignal(struct gemtek_pci *card) | ||
629 | diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c | ||
630 | index 8cc6dd2..b8e276c 100644 | ||
631 | --- a/drivers/media/video/bt8xx/bttv-driver.c | ||
632 | +++ b/drivers/media/video/bt8xx/bttv-driver.c | ||
633 | @@ -1299,7 +1299,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm) | ||
634 | |||
635 | tvnorm = &bttv_tvnorms[norm]; | ||
636 | |||
637 | - if (!memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap, | ||
638 | + if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap, | ||
639 | sizeof (tvnorm->cropcap))) { | ||
640 | bttv_crop_reset(&btv->crop[0], norm); | ||
641 | btv->crop[1] = btv->crop[0]; /* current = default */ | ||
642 | @@ -3798,11 +3798,34 @@ bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set) | ||
643 | if (!V4L2_FIELD_HAS_BOTH(item->vb.field) && | ||
644 | (item->vb.queue.next != &btv->capture)) { | ||
645 | item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue); | ||
646 | + /* Mike Isely <isely@pobox.com> - Only check | ||
647 | + * and set up the bottom field in the logic | ||
648 | + * below. Don't ever do the top field. This | ||
649 | + * of course means that if we set up the | ||
650 | + * bottom field in the above code that we'll | ||
651 | + * actually skip a field. But that's OK. | ||
652 | + * Having processed only a single buffer this | ||
653 | + * time, then the next time around the first | ||
654 | + * available buffer should be for a top field. | ||
655 | + * That will then cause us here to set up a | ||
656 | + * top then a bottom field in the normal way. | ||
657 | + * The alternative to this understanding is | ||
658 | + * that we set up the second available buffer | ||
659 | + * as a top field, but that's out of order | ||
660 | + * since this driver always processes the top | ||
661 | + * field first - the effect will be the two | ||
662 | + * buffers being returned in the wrong order, | ||
663 | + * with the second buffer also being delayed | ||
664 | + * by one field time (owing to the fifo nature | ||
665 | + * of videobuf). Worse still, we'll be stuck | ||
666 | + * doing fields out of order now every time | ||
667 | + * until something else causes a field to be | ||
668 | + * dropped. By effectively forcing a field to | ||
669 | + * drop this way then we always get back into | ||
670 | + * sync within a single frame time. (Out of | ||
671 | + * order fields can screw up deinterlacing | ||
672 | + * algorithms.) */ | ||
673 | if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) { | ||
674 | - if (NULL == set->top && | ||
675 | - V4L2_FIELD_TOP == item->vb.field) { | ||
676 | - set->top = item; | ||
677 | - } | ||
678 | if (NULL == set->bottom && | ||
679 | V4L2_FIELD_BOTTOM == item->vb.field) { | ||
680 | set->bottom = item; | ||
681 | diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c | ||
682 | index 7bd8a70..ac947ae 100644 | ||
683 | --- a/drivers/media/video/em28xx/em28xx-audio.c | ||
684 | +++ b/drivers/media/video/em28xx/em28xx-audio.c | ||
685 | @@ -383,6 +383,11 @@ static int snd_em28xx_hw_capture_free(struct snd_pcm_substream *substream) | ||
686 | |||
687 | static int snd_em28xx_prepare(struct snd_pcm_substream *substream) | ||
688 | { | ||
689 | + struct em28xx *dev = snd_pcm_substream_chip(substream); | ||
690 | + | ||
691 | + dev->adev.hwptr_done_capture = 0; | ||
692 | + dev->adev.capture_transfer_done = 0; | ||
693 | + | ||
694 | return 0; | ||
695 | } | ||
696 | |||
697 | diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c | ||
698 | index 0163903..3b159e4 100644 | ||
699 | --- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c | ||
700 | +++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c | ||
701 | @@ -35,12 +35,25 @@ static | ||
702 | const | ||
703 | struct dmi_system_id s5k4aa_vflip_dmi_table[] = { | ||
704 | { | ||
705 | + .ident = "BRUNEINIT", | ||
706 | + .matches = { | ||
707 | + DMI_MATCH(DMI_SYS_VENDOR, "BRUNENIT"), | ||
708 | + DMI_MATCH(DMI_PRODUCT_NAME, "BRUNENIT"), | ||
709 | + DMI_MATCH(DMI_BOARD_VERSION, "00030D0000000001") | ||
710 | + } | ||
711 | + }, { | ||
712 | .ident = "Fujitsu-Siemens Amilo Xa 2528", | ||
713 | .matches = { | ||
714 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
715 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528") | ||
716 | } | ||
717 | }, { | ||
718 | + .ident = "Fujitsu-Siemens Amilo Xi 2528", | ||
719 | + .matches = { | ||
720 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
721 | + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 2528") | ||
722 | + } | ||
723 | + }, { | ||
724 | .ident = "Fujitsu-Siemens Amilo Xi 2550", | ||
725 | .matches = { | ||
726 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
727 | @@ -51,6 +64,13 @@ static | ||
728 | .matches = { | ||
729 | DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"), | ||
730 | DMI_MATCH(DMI_PRODUCT_NAME, "GX700"), | ||
731 | + DMI_MATCH(DMI_BIOS_DATE, "12/02/2008") | ||
732 | + } | ||
733 | + }, { | ||
734 | + .ident = "MSI GX700", | ||
735 | + .matches = { | ||
736 | + DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"), | ||
737 | + DMI_MATCH(DMI_PRODUCT_NAME, "GX700"), | ||
738 | DMI_MATCH(DMI_BIOS_DATE, "07/26/2007") | ||
739 | } | ||
740 | }, { | ||
741 | diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c | ||
742 | index d6332ab..33f4d0a 100644 | ||
743 | --- a/drivers/media/video/gspca/sonixj.c | ||
744 | +++ b/drivers/media/video/gspca/sonixj.c | ||
745 | @@ -727,7 +727,7 @@ static const u8 ov7660_sensor_init[][8] = { | ||
746 | {0xa1, 0x21, 0x12, 0x05, 0x00, 0x00, 0x00, 0x10}, | ||
747 | /* Outformat = rawRGB */ | ||
748 | {0xa1, 0x21, 0x13, 0xb8, 0x00, 0x00, 0x00, 0x10}, /* init COM8 */ | ||
749 | - {0xd1, 0x21, 0x00, 0x01, 0x74, 0x74, 0x00, 0x10}, | ||
750 | + {0xd1, 0x21, 0x00, 0x01, 0x74, 0x92, 0x00, 0x10}, | ||
751 | /* GAIN BLUE RED VREF */ | ||
752 | {0xd1, 0x21, 0x04, 0x00, 0x7d, 0x62, 0x00, 0x10}, | ||
753 | /* COM 1 BAVE GEAVE AECHH */ | ||
754 | @@ -783,7 +783,7 @@ static const u8 ov7660_sensor_init[][8] = { | ||
755 | {0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */ | ||
756 | {0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */ | ||
757 | {0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */ | ||
758 | - {0xb1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10}, | ||
759 | + {0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10}, | ||
760 | /****** (some exchanges in the win trace) ******/ | ||
761 | {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */ | ||
762 | /* bits[3..0]reserved */ | ||
763 | @@ -1145,17 +1145,12 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | ||
764 | reg_w1(gspca_dev, 0x01, 0x42); | ||
765 | break; | ||
766 | case SENSOR_OV7660: | ||
767 | - reg_w1(gspca_dev, 0x01, 0x61); | ||
768 | - reg_w1(gspca_dev, 0x17, 0x20); | ||
769 | - reg_w1(gspca_dev, 0x01, 0x60); | ||
770 | - reg_w1(gspca_dev, 0x01, 0x40); | ||
771 | - break; | ||
772 | case SENSOR_SP80708: | ||
773 | reg_w1(gspca_dev, 0x01, 0x63); | ||
774 | reg_w1(gspca_dev, 0x17, 0x20); | ||
775 | reg_w1(gspca_dev, 0x01, 0x62); | ||
776 | reg_w1(gspca_dev, 0x01, 0x42); | ||
777 | - mdelay(100); | ||
778 | + msleep(100); | ||
779 | reg_w1(gspca_dev, 0x02, 0x62); | ||
780 | break; | ||
781 | /* case SENSOR_HV7131R: */ | ||
782 | @@ -1624,6 +1619,8 @@ static void setvflip(struct sd *sd) | ||
783 | |||
784 | static void setinfrared(struct sd *sd) | ||
785 | { | ||
786 | + if (sd->gspca_dev.ctrl_dis & (1 << INFRARED_IDX)) | ||
787 | + return; | ||
788 | /*fixme: different sequence for StarCam Clip and StarCam 370i */ | ||
789 | /* Clip */ | ||
790 | i2c_w1(&sd->gspca_dev, 0x02, /* gpio */ | ||
791 | @@ -1637,16 +1634,19 @@ static void setfreq(struct gspca_dev *gspca_dev) | ||
792 | if (gspca_dev->ctrl_dis & (1 << FREQ_IDX)) | ||
793 | return; | ||
794 | if (sd->sensor == SENSOR_OV7660) { | ||
795 | + u8 com8; | ||
796 | + | ||
797 | + com8 = 0xdf; /* auto gain/wb/expo */ | ||
798 | switch (sd->freq) { | ||
799 | case 0: /* Banding filter disabled */ | ||
800 | - i2c_w1(gspca_dev, 0x13, 0xdf); | ||
801 | + i2c_w1(gspca_dev, 0x13, com8 | 0x20); | ||
802 | break; | ||
803 | case 1: /* 50 hz */ | ||
804 | - i2c_w1(gspca_dev, 0x13, 0xff); | ||
805 | + i2c_w1(gspca_dev, 0x13, com8); | ||
806 | i2c_w1(gspca_dev, 0x3b, 0x0a); | ||
807 | break; | ||
808 | case 2: /* 60 hz */ | ||
809 | - i2c_w1(gspca_dev, 0x13, 0xff); | ||
810 | + i2c_w1(gspca_dev, 0x13, com8); | ||
811 | i2c_w1(gspca_dev, 0x3b, 0x02); | ||
812 | break; | ||
813 | } | ||
814 | @@ -1796,12 +1796,6 @@ static int sd_start(struct gspca_dev *gspca_dev) | ||
815 | reg_w1(gspca_dev, 0x99, 0x60); | ||
816 | break; | ||
817 | case SENSOR_OV7660: | ||
818 | - reg_w1(gspca_dev, 0x9a, 0x05); | ||
819 | - if (sd->bridge == BRIDGE_SN9C105) | ||
820 | - reg_w1(gspca_dev, 0x99, 0xff); | ||
821 | - else | ||
822 | - reg_w1(gspca_dev, 0x99, 0x5b); | ||
823 | - break; | ||
824 | case SENSOR_SP80708: | ||
825 | reg_w1(gspca_dev, 0x9a, 0x05); | ||
826 | reg_w1(gspca_dev, 0x99, 0x59); | ||
827 | @@ -2325,18 +2319,19 @@ static const __devinitdata struct usb_device_id device_table[] = { | ||
828 | {USB_DEVICE(0x0c45, 0x607c), BSI(SN9C102P, HV7131R, 0x11)}, | ||
829 | /* {USB_DEVICE(0x0c45, 0x607e), BSI(SN9C102P, OV7630, 0x??)}, */ | ||
830 | {USB_DEVICE(0x0c45, 0x60c0), BSI(SN9C105, MI0360, 0x5d)}, | ||
831 | -/* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6801, 0x??)}, */ | ||
832 | +/* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6802, 0x??)}, */ | ||
833 | /* {USB_DEVICE(0x0c45, 0x60cc), BSI(SN9C105, HV7131GP, 0x??)}, */ | ||
834 | {USB_DEVICE(0x0c45, 0x60ec), BSI(SN9C105, MO4000, 0x21)}, | ||
835 | /* {USB_DEVICE(0x0c45, 0x60ef), BSI(SN9C105, ICM105C, 0x??)}, */ | ||
836 | /* {USB_DEVICE(0x0c45, 0x60fa), BSI(SN9C105, OV7648, 0x??)}, */ | ||
837 | {USB_DEVICE(0x0c45, 0x60fb), BSI(SN9C105, OV7660, 0x21)}, | ||
838 | - {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)}, | ||
839 | #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE | ||
840 | + {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)}, | ||
841 | {USB_DEVICE(0x0c45, 0x60fe), BSI(SN9C105, OV7630, 0x21)}, | ||
842 | #endif | ||
843 | {USB_DEVICE(0x0c45, 0x6100), BSI(SN9C120, MI0360, 0x5d)}, /*sn9c128*/ | ||
844 | -/* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6801, 0x??)}, */ | ||
845 | +/* {USB_DEVICE(0x0c45, 0x6102), BSI(SN9C120, PO2030N, ??)}, */ | ||
846 | +/* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6802, 0x21)}, */ | ||
847 | {USB_DEVICE(0x0c45, 0x610a), BSI(SN9C120, OV7648, 0x21)}, /*sn9c128*/ | ||
848 | {USB_DEVICE(0x0c45, 0x610b), BSI(SN9C120, OV7660, 0x21)}, /*sn9c128*/ | ||
849 | {USB_DEVICE(0x0c45, 0x610c), BSI(SN9C120, HV7131R, 0x11)}, /*sn9c128*/ | ||
850 | @@ -2352,6 +2347,7 @@ static const __devinitdata struct usb_device_id device_table[] = { | ||
851 | #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE | ||
852 | {USB_DEVICE(0x0c45, 0x6130), BSI(SN9C120, MI0360, 0x5d)}, | ||
853 | #endif | ||
854 | +/* {USB_DEVICE(0x0c45, 0x6132), BSI(SN9C120, OV7670, 0x21)}, */ | ||
855 | {USB_DEVICE(0x0c45, 0x6138), BSI(SN9C120, MO4000, 0x21)}, | ||
856 | {USB_DEVICE(0x0c45, 0x613a), BSI(SN9C120, OV7648, 0x21)}, | ||
857 | #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE | ||
858 | @@ -2359,7 +2355,9 @@ static const __devinitdata struct usb_device_id device_table[] = { | ||
859 | #endif | ||
860 | {USB_DEVICE(0x0c45, 0x613c), BSI(SN9C120, HV7131R, 0x11)}, | ||
861 | {USB_DEVICE(0x0c45, 0x613e), BSI(SN9C120, OV7630, 0x21)}, | ||
862 | - {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)}, | ||
863 | +/* {USB_DEVICE(0x0c45, 0x6142), BSI(SN9C120, PO2030N, ??)}, *sn9c120b*/ | ||
864 | + {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)}, /*sn9c120b*/ | ||
865 | + {USB_DEVICE(0x0c45, 0x6148), BSI(SN9C120, OM6802, 0x21)}, /*sn9c120b*/ | ||
866 | {} | ||
867 | }; | ||
868 | MODULE_DEVICE_TABLE(usb, device_table); | ||
869 | diff --git a/drivers/media/video/s2255drv.c b/drivers/media/video/s2255drv.c | ||
870 | index 9e3262c..2c0bb06 100644 | ||
871 | --- a/drivers/media/video/s2255drv.c | ||
872 | +++ b/drivers/media/video/s2255drv.c | ||
873 | @@ -598,11 +598,6 @@ static int s2255_got_frame(struct s2255_dev *dev, int chn, int jpgsize) | ||
874 | buf = list_entry(dma_q->active.next, | ||
875 | struct s2255_buffer, vb.queue); | ||
876 | |||
877 | - if (!waitqueue_active(&buf->vb.done)) { | ||
878 | - /* no one active */ | ||
879 | - rc = -1; | ||
880 | - goto unlock; | ||
881 | - } | ||
882 | list_del(&buf->vb.queue); | ||
883 | do_gettimeofday(&buf->vb.ts); | ||
884 | dprintk(100, "[%p/%d] wakeup\n", buf, buf->vb.i); | ||
885 | diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c | ||
886 | index 6eebe3e..52a79b3 100644 | ||
887 | --- a/drivers/media/video/saa7134/saa7134-cards.c | ||
888 | +++ b/drivers/media/video/saa7134/saa7134-cards.c | ||
889 | @@ -3373,6 +3373,7 @@ struct saa7134_board saa7134_boards[] = { | ||
890 | .tuner_config = 3, | ||
891 | .mpeg = SAA7134_MPEG_DVB, | ||
892 | .ts_type = SAA7134_MPEG_TS_SERIAL, | ||
893 | + .ts_force_val = 1, | ||
894 | .gpiomask = 0x0800100, /* GPIO 21 is an INPUT */ | ||
895 | .inputs = {{ | ||
896 | .name = name_tv, | ||
897 | diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c | ||
898 | index 3fa6522..03488ba 100644 | ||
899 | --- a/drivers/media/video/saa7134/saa7134-ts.c | ||
900 | +++ b/drivers/media/video/saa7134/saa7134-ts.c | ||
901 | @@ -262,11 +262,13 @@ int saa7134_ts_start(struct saa7134_dev *dev) | ||
902 | switch (saa7134_boards[dev->board].ts_type) { | ||
903 | case SAA7134_MPEG_TS_PARALLEL: | ||
904 | saa_writeb(SAA7134_TS_SERIAL0, 0x40); | ||
905 | - saa_writeb(SAA7134_TS_PARALLEL, 0xec); | ||
906 | + saa_writeb(SAA7134_TS_PARALLEL, 0xec | | ||
907 | + (saa7134_boards[dev->board].ts_force_val << 4)); | ||
908 | break; | ||
909 | case SAA7134_MPEG_TS_SERIAL: | ||
910 | saa_writeb(SAA7134_TS_SERIAL0, 0xd8); | ||
911 | - saa_writeb(SAA7134_TS_PARALLEL, 0x6c); | ||
912 | + saa_writeb(SAA7134_TS_PARALLEL, 0x6c | | ||
913 | + (saa7134_boards[dev->board].ts_force_val << 4)); | ||
914 | saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc); | ||
915 | saa_writeb(SAA7134_TS_SERIAL1, 0x02); | ||
916 | break; | ||
917 | diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h | ||
918 | index 4d85f5c..f50734f 100644 | ||
919 | --- a/drivers/media/video/saa7134/saa7134.h | ||
920 | +++ b/drivers/media/video/saa7134/saa7134.h | ||
921 | @@ -355,6 +355,7 @@ struct saa7134_board { | ||
922 | enum saa7134_mpeg_type mpeg; | ||
923 | enum saa7134_mpeg_ts_type ts_type; | ||
924 | unsigned int vid_port_opts; | ||
925 | + unsigned int ts_force_val:1; | ||
926 | }; | ||
927 | |||
928 | #define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name) | ||
929 | diff --git a/drivers/media/video/sn9c102/sn9c102_devtable.h b/drivers/media/video/sn9c102/sn9c102_devtable.h | ||
930 | index 38a7160..36ee43a 100644 | ||
931 | --- a/drivers/media/video/sn9c102/sn9c102_devtable.h | ||
932 | +++ b/drivers/media/video/sn9c102/sn9c102_devtable.h | ||
933 | @@ -123,8 +123,8 @@ static const struct usb_device_id sn9c102_id_table[] = { | ||
934 | { SN9C102_USB_DEVICE(0x0c45, 0x613b, BRIDGE_SN9C120), }, | ||
935 | #if !defined CONFIG_USB_GSPCA && !defined CONFIG_USB_GSPCA_MODULE | ||
936 | { SN9C102_USB_DEVICE(0x0c45, 0x613c, BRIDGE_SN9C120), }, | ||
937 | -#endif | ||
938 | { SN9C102_USB_DEVICE(0x0c45, 0x613e, BRIDGE_SN9C120), }, | ||
939 | +#endif | ||
940 | { } | ||
941 | }; | ||
942 | |||
943 | diff --git a/drivers/media/video/v4l1-compat.c b/drivers/media/video/v4l1-compat.c | ||
944 | index 02f2a6d..ec76693 100644 | ||
945 | --- a/drivers/media/video/v4l1-compat.c | ||
946 | +++ b/drivers/media/video/v4l1-compat.c | ||
947 | @@ -565,10 +565,9 @@ static noinline long v4l1_compat_get_input_info( | ||
948 | break; | ||
949 | } | ||
950 | chan->norm = 0; | ||
951 | - err = drv(file, VIDIOC_G_STD, &sid); | ||
952 | - if (err < 0) | ||
953 | - dprintk("VIDIOCGCHAN / VIDIOC_G_STD: %ld\n", err); | ||
954 | - if (err == 0) { | ||
955 | + /* Note: G_STD might not be present for radio receivers, | ||
956 | + * so we should ignore any errors. */ | ||
957 | + if (drv(file, VIDIOC_G_STD, &sid) == 0) { | ||
958 | if (sid & V4L2_STD_PAL) | ||
959 | chan->norm = VIDEO_MODE_PAL; | ||
960 | if (sid & V4L2_STD_NTSC) | ||
961 | @@ -777,10 +776,9 @@ static noinline long v4l1_compat_get_tuner( | ||
962 | tun->flags |= VIDEO_TUNER_SECAM; | ||
963 | } | ||
964 | |||
965 | - err = drv(file, VIDIOC_G_STD, &sid); | ||
966 | - if (err < 0) | ||
967 | - dprintk("VIDIOCGTUNER / VIDIOC_G_STD: %ld\n", err); | ||
968 | - if (err == 0) { | ||
969 | + /* Note: G_STD might not be present for radio receivers, | ||
970 | + * so we should ignore any errors. */ | ||
971 | + if (drv(file, VIDIOC_G_STD, &sid) == 0) { | ||
972 | if (sid & V4L2_STD_PAL) | ||
973 | tun->mode = VIDEO_MODE_PAL; | ||
974 | if (sid & V4L2_STD_NTSC) | ||
975 | diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c | ||
976 | index e55ac79..c8c0a7e 100644 | ||
977 | --- a/drivers/mmc/host/pxamci.c | ||
978 | +++ b/drivers/mmc/host/pxamci.c | ||
979 | @@ -694,14 +694,14 @@ static int pxamci_remove(struct platform_device *pdev) | ||
980 | if (mmc) { | ||
981 | struct pxamci_host *host = mmc_priv(mmc); | ||
982 | |||
983 | + mmc_remove_host(mmc); | ||
984 | + | ||
985 | if (host->vcc) | ||
986 | regulator_put(host->vcc); | ||
987 | |||
988 | if (host->pdata && host->pdata->exit) | ||
989 | host->pdata->exit(&pdev->dev, mmc); | ||
990 | |||
991 | - mmc_remove_host(mmc); | ||
992 | - | ||
993 | pxamci_stop_clock(host); | ||
994 | writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD| | ||
995 | END_CMD_RES|PRG_DONE|DATA_TRAN_DONE, | ||
996 | diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c | ||
997 | index 08419ee..12bfc44 100644 | ||
998 | --- a/drivers/net/acenic.c | ||
999 | +++ b/drivers/net/acenic.c | ||
1000 | @@ -1209,7 +1209,8 @@ static int __devinit ace_init(struct net_device *dev) | ||
1001 | memset(ap->info, 0, sizeof(struct ace_info)); | ||
1002 | memset(ap->skb, 0, sizeof(struct ace_skb)); | ||
1003 | |||
1004 | - if (ace_load_firmware(dev)) | ||
1005 | + ecode = ace_load_firmware(dev); | ||
1006 | + if (ecode) | ||
1007 | goto init_error; | ||
1008 | |||
1009 | ap->fw_running = 0; | ||
1010 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
1011 | index 7029d53..bcd8df9 100644 | ||
1012 | --- a/drivers/net/bonding/bond_main.c | ||
1013 | +++ b/drivers/net/bonding/bond_main.c | ||
1014 | @@ -3707,10 +3707,10 @@ static int bond_xmit_hash_policy_l23(struct sk_buff *skb, | ||
1015 | |||
1016 | if (skb->protocol == htons(ETH_P_IP)) { | ||
1017 | return ((ntohl(iph->saddr ^ iph->daddr) & 0xffff) ^ | ||
1018 | - (data->h_dest[5] ^ bond_dev->dev_addr[5])) % count; | ||
1019 | + (data->h_dest[5] ^ data->h_source[5])) % count; | ||
1020 | } | ||
1021 | |||
1022 | - return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; | ||
1023 | + return (data->h_dest[5] ^ data->h_source[5]) % count; | ||
1024 | } | ||
1025 | |||
1026 | /* | ||
1027 | @@ -3737,7 +3737,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb, | ||
1028 | |||
1029 | } | ||
1030 | |||
1031 | - return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; | ||
1032 | + return (data->h_dest[5] ^ data->h_source[5]) % count; | ||
1033 | } | ||
1034 | |||
1035 | /* | ||
1036 | @@ -3748,7 +3748,7 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, | ||
1037 | { | ||
1038 | struct ethhdr *data = (struct ethhdr *)skb->data; | ||
1039 | |||
1040 | - return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; | ||
1041 | + return (data->h_dest[5] ^ data->h_source[5]) % count; | ||
1042 | } | ||
1043 | |||
1044 | /*-------------------------- Device entry points ----------------------------*/ | ||
1045 | diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c | ||
1046 | index 01f9432..98bff5a 100644 | ||
1047 | --- a/drivers/net/sfc/rx.c | ||
1048 | +++ b/drivers/net/sfc/rx.c | ||
1049 | @@ -444,7 +444,8 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue, | ||
1050 | * the appropriate LRO method | ||
1051 | */ | ||
1052 | static void efx_rx_packet_lro(struct efx_channel *channel, | ||
1053 | - struct efx_rx_buffer *rx_buf) | ||
1054 | + struct efx_rx_buffer *rx_buf, | ||
1055 | + bool checksummed) | ||
1056 | { | ||
1057 | struct napi_struct *napi = &channel->napi_str; | ||
1058 | |||
1059 | @@ -466,7 +467,8 @@ static void efx_rx_packet_lro(struct efx_channel *channel, | ||
1060 | skb->len = rx_buf->len; | ||
1061 | skb->data_len = rx_buf->len; | ||
1062 | skb->truesize += rx_buf->len; | ||
1063 | - skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
1064 | + skb->ip_summed = | ||
1065 | + checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE; | ||
1066 | |||
1067 | napi_gro_frags(napi); | ||
1068 | |||
1069 | @@ -475,6 +477,7 @@ out: | ||
1070 | rx_buf->page = NULL; | ||
1071 | } else { | ||
1072 | EFX_BUG_ON_PARANOID(!rx_buf->skb); | ||
1073 | + EFX_BUG_ON_PARANOID(!checksummed); | ||
1074 | |||
1075 | napi_gro_receive(napi, rx_buf->skb); | ||
1076 | rx_buf->skb = NULL; | ||
1077 | @@ -570,7 +573,7 @@ void __efx_rx_packet(struct efx_channel *channel, | ||
1078 | } | ||
1079 | |||
1080 | if (likely(checksummed || rx_buf->page)) { | ||
1081 | - efx_rx_packet_lro(channel, rx_buf); | ||
1082 | + efx_rx_packet_lro(channel, rx_buf, checksummed); | ||
1083 | goto done; | ||
1084 | } | ||
1085 | |||
1086 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c | ||
1087 | index a606e7f..329f447 100644 | ||
1088 | --- a/drivers/net/sky2.c | ||
1089 | +++ b/drivers/net/sky2.c | ||
1090 | @@ -4528,6 +4528,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | ||
1091 | goto err_out_free_netdev; | ||
1092 | } | ||
1093 | |||
1094 | + netif_carrier_off(dev); | ||
1095 | + | ||
1096 | netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT); | ||
1097 | |||
1098 | err = request_irq(pdev->irq, sky2_intr, | ||
1099 | diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c | ||
1100 | index f8c6d7e..9e1fc29 100644 | ||
1101 | --- a/drivers/net/usb/hso.c | ||
1102 | +++ b/drivers/net/usb/hso.c | ||
1103 | @@ -1362,7 +1362,7 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) | ||
1104 | /* reset the rts and dtr */ | ||
1105 | /* do the actual close */ | ||
1106 | serial->open_count--; | ||
1107 | - kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
1108 | + | ||
1109 | if (serial->open_count <= 0) { | ||
1110 | serial->open_count = 0; | ||
1111 | spin_lock_irq(&serial->serial_lock); | ||
1112 | @@ -1382,6 +1382,8 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) | ||
1113 | usb_autopm_put_interface(serial->parent->interface); | ||
1114 | |||
1115 | mutex_unlock(&serial->parent->mutex); | ||
1116 | + | ||
1117 | + kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
1118 | } | ||
1119 | |||
1120 | /* close the requested serial port */ | ||
1121 | diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c | ||
1122 | index a876ca8..0981fb4 100644 | ||
1123 | --- a/drivers/net/wireless/ath/ath5k/phy.c | ||
1124 | +++ b/drivers/net/wireless/ath/ath5k/phy.c | ||
1125 | @@ -740,13 +740,22 @@ int ath5k_hw_rfregs_init(struct ath5k_hw *ah, struct ieee80211_channel *channel, | ||
1126 | AR5K_RF_XPD_GAIN, true); | ||
1127 | |||
1128 | } else { | ||
1129 | - /* TODO: Set high and low gain bits */ | ||
1130 | - ath5k_hw_rfb_op(ah, rf_regs, | ||
1131 | - ee->ee_x_gain[ee_mode], | ||
1132 | + u8 *pdg_curve_to_idx = ee->ee_pdc_to_idx[ee_mode]; | ||
1133 | + if (ee->ee_pd_gains[ee_mode] > 1) { | ||
1134 | + ath5k_hw_rfb_op(ah, rf_regs, | ||
1135 | + pdg_curve_to_idx[0], | ||
1136 | AR5K_RF_PD_GAIN_LO, true); | ||
1137 | - ath5k_hw_rfb_op(ah, rf_regs, | ||
1138 | - ee->ee_x_gain[ee_mode], | ||
1139 | + ath5k_hw_rfb_op(ah, rf_regs, | ||
1140 | + pdg_curve_to_idx[1], | ||
1141 | AR5K_RF_PD_GAIN_HI, true); | ||
1142 | + } else { | ||
1143 | + ath5k_hw_rfb_op(ah, rf_regs, | ||
1144 | + pdg_curve_to_idx[0], | ||
1145 | + AR5K_RF_PD_GAIN_LO, true); | ||
1146 | + ath5k_hw_rfb_op(ah, rf_regs, | ||
1147 | + pdg_curve_to_idx[0], | ||
1148 | + AR5K_RF_PD_GAIN_HI, true); | ||
1149 | + } | ||
1150 | |||
1151 | /* Lower synth voltage on Rev 2 */ | ||
1152 | ath5k_hw_rfb_op(ah, rf_regs, 2, | ||
1153 | @@ -1897,8 +1906,9 @@ ath5k_get_linear_pcdac_min(const u8 *stepL, const u8 *stepR, | ||
1154 | s16 min_pwrL, min_pwrR; | ||
1155 | s16 pwr_i; | ||
1156 | |||
1157 | - if (WARN_ON(stepL[0] == stepL[1] || stepR[0] == stepR[1])) | ||
1158 | - return 0; | ||
1159 | + /* Some vendors write the same pcdac value twice !!! */ | ||
1160 | + if (stepL[0] == stepL[1] || stepR[0] == stepR[1]) | ||
1161 | + return max(pwrL[0], pwrR[0]); | ||
1162 | |||
1163 | if (pwrL[0] == pwrL[1]) | ||
1164 | min_pwrL = pwrL[0]; | ||
1165 | diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c | ||
1166 | index 7964cc3..32e9513 100644 | ||
1167 | --- a/drivers/net/wireless/b43/dma.c | ||
1168 | +++ b/drivers/net/wireless/b43/dma.c | ||
1169 | @@ -1158,8 +1158,9 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot) | ||
1170 | } | ||
1171 | |||
1172 | static int dma_tx_fragment(struct b43_dmaring *ring, | ||
1173 | - struct sk_buff *skb) | ||
1174 | + struct sk_buff **in_skb) | ||
1175 | { | ||
1176 | + struct sk_buff *skb = *in_skb; | ||
1177 | const struct b43_dma_ops *ops = ring->ops; | ||
1178 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
1179 | u8 *header; | ||
1180 | @@ -1225,8 +1226,14 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | ||
1181 | } | ||
1182 | |||
1183 | memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); | ||
1184 | + memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb)); | ||
1185 | + bounce_skb->dev = skb->dev; | ||
1186 | + skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb)); | ||
1187 | + info = IEEE80211_SKB_CB(bounce_skb); | ||
1188 | + | ||
1189 | dev_kfree_skb_any(skb); | ||
1190 | skb = bounce_skb; | ||
1191 | + *in_skb = bounce_skb; | ||
1192 | meta->skb = skb; | ||
1193 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | ||
1194 | if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { | ||
1195 | @@ -1334,13 +1341,22 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) | ||
1196 | spin_lock_irqsave(&ring->lock, flags); | ||
1197 | |||
1198 | B43_WARN_ON(!ring->tx); | ||
1199 | - /* Check if the queue was stopped in mac80211, | ||
1200 | - * but we got called nevertheless. | ||
1201 | - * That would be a mac80211 bug. */ | ||
1202 | - B43_WARN_ON(ring->stopped); | ||
1203 | |||
1204 | - if (unlikely(free_slots(ring) < TX_SLOTS_PER_FRAME)) { | ||
1205 | - b43warn(dev->wl, "DMA queue overflow\n"); | ||
1206 | + if (unlikely(ring->stopped)) { | ||
1207 | + /* We get here only because of a bug in mac80211. | ||
1208 | + * Because of a race, one packet may be queued after | ||
1209 | + * the queue is stopped, thus we got called when we shouldn't. | ||
1210 | + * For now, just refuse the transmit. */ | ||
1211 | + if (b43_debug(dev, B43_DBG_DMAVERBOSE)) | ||
1212 | + b43err(dev->wl, "Packet after queue stopped\n"); | ||
1213 | + err = -ENOSPC; | ||
1214 | + goto out_unlock; | ||
1215 | + } | ||
1216 | + | ||
1217 | + if (unlikely(WARN_ON(free_slots(ring) < TX_SLOTS_PER_FRAME))) { | ||
1218 | + /* If we get here, we have a real error with the queue | ||
1219 | + * full, but queues not stopped. */ | ||
1220 | + b43err(dev->wl, "DMA queue overflow\n"); | ||
1221 | err = -ENOSPC; | ||
1222 | goto out_unlock; | ||
1223 | } | ||
1224 | @@ -1350,7 +1366,11 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) | ||
1225 | * static, so we don't need to store it per frame. */ | ||
1226 | ring->queue_prio = skb_get_queue_mapping(skb); | ||
1227 | |||
1228 | - err = dma_tx_fragment(ring, skb); | ||
1229 | + /* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing | ||
1230 | + * into the skb data or cb now. */ | ||
1231 | + hdr = NULL; | ||
1232 | + info = NULL; | ||
1233 | + err = dma_tx_fragment(ring, &skb); | ||
1234 | if (unlikely(err == -ENOKEY)) { | ||
1235 | /* Drop this packet, as we don't have the encryption key | ||
1236 | * anymore and must not transmit it unencrypted. */ | ||
1237 | diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c | ||
1238 | index d83d430..44baa60 100644 | ||
1239 | --- a/drivers/net/wireless/iwlwifi/iwl-1000.c | ||
1240 | +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c | ||
1241 | @@ -71,5 +71,6 @@ struct iwl_cfg iwl1000_bgn_cfg = { | ||
1242 | .need_pll_cfg = true, | ||
1243 | .max_ll_items = OTP_MAX_LL_ITEMS_1000, | ||
1244 | .shadow_ram_support = false, | ||
1245 | + .use_rts_for_ht = true, /* use rts/cts protection */ | ||
1246 | }; | ||
1247 | |||
1248 | diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c | ||
1249 | index e4a405f..ee7b48e 100644 | ||
1250 | --- a/drivers/net/wireless/iwlwifi/iwl-6000.c | ||
1251 | +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | ||
1252 | @@ -109,6 +109,7 @@ struct iwl_cfg iwl6000_2agn_cfg = { | ||
1253 | .need_pll_cfg = false, | ||
1254 | .max_ll_items = OTP_MAX_LL_ITEMS_6x00, | ||
1255 | .shadow_ram_support = true, | ||
1256 | + .use_rts_for_ht = true, /* use rts/cts protection */ | ||
1257 | }; | ||
1258 | |||
1259 | struct iwl_cfg iwl6050_2agn_cfg = { | ||
1260 | @@ -127,6 +128,7 @@ struct iwl_cfg iwl6050_2agn_cfg = { | ||
1261 | .need_pll_cfg = false, | ||
1262 | .max_ll_items = OTP_MAX_LL_ITEMS_6x00, | ||
1263 | .shadow_ram_support = true, | ||
1264 | + .use_rts_for_ht = true, /* use rts/cts protection */ | ||
1265 | }; | ||
1266 | |||
1267 | struct iwl_cfg iwl6000_3agn_cfg = { | ||
1268 | @@ -145,6 +147,7 @@ struct iwl_cfg iwl6000_3agn_cfg = { | ||
1269 | .need_pll_cfg = false, | ||
1270 | .max_ll_items = OTP_MAX_LL_ITEMS_6x00, | ||
1271 | .shadow_ram_support = true, | ||
1272 | + .use_rts_for_ht = true, /* use rts/cts protection */ | ||
1273 | }; | ||
1274 | |||
1275 | struct iwl_cfg iwl6050_3agn_cfg = { | ||
1276 | @@ -163,6 +166,7 @@ struct iwl_cfg iwl6050_3agn_cfg = { | ||
1277 | .need_pll_cfg = false, | ||
1278 | .max_ll_items = OTP_MAX_LL_ITEMS_6x00, | ||
1279 | .shadow_ram_support = true, | ||
1280 | + .use_rts_for_ht = true, /* use rts/cts protection */ | ||
1281 | }; | ||
1282 | |||
1283 | MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); | ||
1284 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | ||
1285 | index ff20e50..f5c108b 100644 | ||
1286 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | ||
1287 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | ||
1288 | @@ -415,6 +415,15 @@ static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, | ||
1289 | else if (tid == IWL_AGG_ALL_TID) | ||
1290 | for (tid = 0; tid < TID_MAX_LOAD_COUNT; tid++) | ||
1291 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); | ||
1292 | + if (priv->cfg->use_rts_for_ht) { | ||
1293 | + /* | ||
1294 | + * switch to RTS/CTS if it is the prefer protection method | ||
1295 | + * for HT traffic | ||
1296 | + */ | ||
1297 | + IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n"); | ||
1298 | + priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN; | ||
1299 | + iwlcore_commit_rxon(priv); | ||
1300 | + } | ||
1301 | } | ||
1302 | |||
1303 | static inline int get_num_of_ant_from_rate(u32 rate_n_flags) | ||
1304 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c | ||
1305 | index 2a577ae..fc33b29 100644 | ||
1306 | --- a/drivers/net/wireless/iwlwifi/iwl-agn.c | ||
1307 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | ||
1308 | @@ -115,9 +115,6 @@ int iwl_commit_rxon(struct iwl_priv *priv) | ||
1309 | |||
1310 | /* always get timestamp with Rx frame */ | ||
1311 | priv->staging_rxon.flags |= RXON_FLG_TSF2HOST_MSK; | ||
1312 | - /* allow CTS-to-self if possible. this is relevant only for | ||
1313 | - * 5000, but will not damage 4965 */ | ||
1314 | - priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN; | ||
1315 | |||
1316 | ret = iwl_check_rxon_cmd(priv); | ||
1317 | if (ret) { | ||
1318 | @@ -217,6 +214,13 @@ int iwl_commit_rxon(struct iwl_priv *priv) | ||
1319 | "Could not send WEP static key.\n"); | ||
1320 | } | ||
1321 | |||
1322 | + /* | ||
1323 | + * allow CTS-to-self if possible for new association. | ||
1324 | + * this is relevant only for 5000 series and up, | ||
1325 | + * but will not damage 4965 | ||
1326 | + */ | ||
1327 | + priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN; | ||
1328 | + | ||
1329 | /* Apply the new configuration | ||
1330 | * RXON assoc doesn't clear the station table in uCode, | ||
1331 | */ | ||
1332 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h | ||
1333 | index 1e51891..4e616ec 100644 | ||
1334 | --- a/drivers/net/wireless/iwlwifi/iwl-core.h | ||
1335 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | ||
1336 | @@ -209,6 +209,7 @@ struct iwl_mod_params { | ||
1337 | * @ucode_api_min: Lowest version of uCode API supported by driver. | ||
1338 | * @max_ll_items: max number of OTP blocks | ||
1339 | * @shadow_ram_support: shadow support for OTP memory | ||
1340 | + * @use_rts_for_ht: use rts/cts protection for HT traffic | ||
1341 | * | ||
1342 | * We enable the driver to be backward compatible wrt API version. The | ||
1343 | * driver specifies which APIs it supports (with @ucode_api_max being the | ||
1344 | @@ -247,6 +248,7 @@ struct iwl_cfg { | ||
1345 | bool use_isr_legacy; | ||
1346 | const u16 max_ll_items; | ||
1347 | const bool shadow_ram_support; | ||
1348 | + bool use_rts_for_ht; | ||
1349 | }; | ||
1350 | |||
1351 | /*************************** | ||
1352 | diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
1353 | index 2e89040..c17b8f9 100644 | ||
1354 | --- a/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
1355 | +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
1356 | @@ -1233,8 +1233,16 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid) | ||
1357 | return -ENXIO; | ||
1358 | } | ||
1359 | |||
1360 | + if (priv->stations[sta_id].tid[tid].agg.state == | ||
1361 | + IWL_EMPTYING_HW_QUEUE_ADDBA) { | ||
1362 | + IWL_DEBUG_HT(priv, "AGG stop before setup done\n"); | ||
1363 | + ieee80211_stop_tx_ba_cb_irqsafe(priv->hw, ra, tid); | ||
1364 | + priv->stations[sta_id].tid[tid].agg.state = IWL_AGG_OFF; | ||
1365 | + return 0; | ||
1366 | + } | ||
1367 | + | ||
1368 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON) | ||
1369 | - IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n"); | ||
1370 | + IWL_WARN(priv, "Stopping AGG while state not ON or starting\n"); | ||
1371 | |||
1372 | tid_data = &priv->stations[sta_id].tid[tid]; | ||
1373 | ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4; | ||
1374 | diff --git a/drivers/net/wireless/rtl818x/rtl8187_leds.c b/drivers/net/wireless/rtl818x/rtl8187_leds.c | ||
1375 | index cf9f899..75648dd 100644 | ||
1376 | --- a/drivers/net/wireless/rtl818x/rtl8187_leds.c | ||
1377 | +++ b/drivers/net/wireless/rtl818x/rtl8187_leds.c | ||
1378 | @@ -210,10 +210,10 @@ void rtl8187_leds_exit(struct ieee80211_hw *dev) | ||
1379 | |||
1380 | /* turn the LED off before exiting */ | ||
1381 | queue_delayed_work(dev->workqueue, &priv->led_off, 0); | ||
1382 | - cancel_delayed_work_sync(&priv->led_off); | ||
1383 | - cancel_delayed_work_sync(&priv->led_on); | ||
1384 | rtl8187_unregister_led(&priv->led_rx); | ||
1385 | rtl8187_unregister_led(&priv->led_tx); | ||
1386 | + cancel_delayed_work_sync(&priv->led_off); | ||
1387 | + cancel_delayed_work_sync(&priv->led_on); | ||
1388 | } | ||
1389 | #endif /* def CONFIG_RTL8187_LED */ | ||
1390 | |||
1391 | diff --git a/drivers/pci/pcie/aer/aerdrv.c b/drivers/pci/pcie/aer/aerdrv.c | ||
1392 | index 4770f13..e2504be 100644 | ||
1393 | --- a/drivers/pci/pcie/aer/aerdrv.c | ||
1394 | +++ b/drivers/pci/pcie/aer/aerdrv.c | ||
1395 | @@ -52,7 +52,7 @@ static struct pci_error_handlers aer_error_handlers = { | ||
1396 | |||
1397 | static struct pcie_port_service_driver aerdriver = { | ||
1398 | .name = "aer", | ||
1399 | - .port_type = PCIE_ANY_PORT, | ||
1400 | + .port_type = PCIE_RC_PORT, | ||
1401 | .service = PCIE_PORT_SERVICE_AER, | ||
1402 | |||
1403 | .probe = aer_probe, | ||
1404 | diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c | ||
1405 | index bdfee17..ec13977 100644 | ||
1406 | --- a/drivers/platform/x86/acerhdf.c | ||
1407 | +++ b/drivers/platform/x86/acerhdf.c | ||
1408 | @@ -52,7 +52,7 @@ | ||
1409 | */ | ||
1410 | #undef START_IN_KERNEL_MODE | ||
1411 | |||
1412 | -#define DRV_VER "0.5.13" | ||
1413 | +#define DRV_VER "0.5.16" | ||
1414 | |||
1415 | /* | ||
1416 | * According to the Atom N270 datasheet, | ||
1417 | @@ -61,7 +61,7 @@ | ||
1418 | * measured by the on-die thermal monitor are within 0 <= Tj <= 90. So, | ||
1419 | * assume 89°C is critical temperature. | ||
1420 | */ | ||
1421 | -#define ACERHDF_TEMP_CRIT 89 | ||
1422 | +#define ACERHDF_TEMP_CRIT 89000 | ||
1423 | #define ACERHDF_FAN_OFF 0 | ||
1424 | #define ACERHDF_FAN_AUTO 1 | ||
1425 | |||
1426 | @@ -69,7 +69,7 @@ | ||
1427 | * No matter what value the user puts into the fanon variable, turn on the fan | ||
1428 | * at 80 degree Celsius to prevent hardware damage | ||
1429 | */ | ||
1430 | -#define ACERHDF_MAX_FANON 80 | ||
1431 | +#define ACERHDF_MAX_FANON 80000 | ||
1432 | |||
1433 | /* | ||
1434 | * Maximum interval between two temperature checks is 15 seconds, as the die | ||
1435 | @@ -85,11 +85,12 @@ static int kernelmode; | ||
1436 | #endif | ||
1437 | |||
1438 | static unsigned int interval = 10; | ||
1439 | -static unsigned int fanon = 63; | ||
1440 | -static unsigned int fanoff = 58; | ||
1441 | +static unsigned int fanon = 63000; | ||
1442 | +static unsigned int fanoff = 58000; | ||
1443 | static unsigned int verbose; | ||
1444 | static unsigned int fanstate = ACERHDF_FAN_AUTO; | ||
1445 | static char force_bios[16]; | ||
1446 | +static char force_product[16]; | ||
1447 | static unsigned int prev_interval; | ||
1448 | struct thermal_zone_device *thz_dev; | ||
1449 | struct thermal_cooling_device *cl_dev; | ||
1450 | @@ -107,34 +108,62 @@ module_param(verbose, uint, 0600); | ||
1451 | MODULE_PARM_DESC(verbose, "Enable verbose dmesg output"); | ||
1452 | module_param_string(force_bios, force_bios, 16, 0); | ||
1453 | MODULE_PARM_DESC(force_bios, "Force BIOS version and omit BIOS check"); | ||
1454 | +module_param_string(force_product, force_product, 16, 0); | ||
1455 | +MODULE_PARM_DESC(force_product, "Force BIOS product and omit BIOS check"); | ||
1456 | + | ||
1457 | +/* | ||
1458 | + * cmd_off: to switch the fan completely off / to check if the fan is off | ||
1459 | + * cmd_auto: to set the BIOS in control of the fan. The BIOS regulates then | ||
1460 | + * the fan speed depending on the temperature | ||
1461 | + */ | ||
1462 | +struct fancmd { | ||
1463 | + u8 cmd_off; | ||
1464 | + u8 cmd_auto; | ||
1465 | +}; | ||
1466 | |||
1467 | /* BIOS settings */ | ||
1468 | struct bios_settings_t { | ||
1469 | const char *vendor; | ||
1470 | + const char *product; | ||
1471 | const char *version; | ||
1472 | unsigned char fanreg; | ||
1473 | unsigned char tempreg; | ||
1474 | - unsigned char fancmd[2]; /* fan off and auto commands */ | ||
1475 | + struct fancmd cmd; | ||
1476 | }; | ||
1477 | |||
1478 | /* Register addresses and values for different BIOS versions */ | ||
1479 | static const struct bios_settings_t bios_tbl[] = { | ||
1480 | - {"Acer", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, | ||
1481 | - {"Acer", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, | ||
1482 | - {"Acer", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, | ||
1483 | - {"Acer", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, | ||
1484 | - {"Acer", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, | ||
1485 | - {"Acer", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, | ||
1486 | - {"Acer", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, | ||
1487 | - {"Acer", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, | ||
1488 | - {"Gateway", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, | ||
1489 | - {"Packard Bell", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, | ||
1490 | - {"", "", 0, 0, {0, 0} } | ||
1491 | + /* AOA110 */ | ||
1492 | + {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, | ||
1493 | + {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, | ||
1494 | + {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, | ||
1495 | + {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, | ||
1496 | + {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, | ||
1497 | + {"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00} }, | ||
1498 | + {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, | ||
1499 | + {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, | ||
1500 | + {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, | ||
1501 | + /* AOA150 */ | ||
1502 | + {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x20, 0x00} }, | ||
1503 | + {"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00} }, | ||
1504 | + {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, | ||
1505 | + {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} }, | ||
1506 | + {"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00} }, | ||
1507 | + {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} }, | ||
1508 | + {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} }, | ||
1509 | + {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} }, | ||
1510 | + /* special BIOS / other */ | ||
1511 | + {"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, | ||
1512 | + {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} }, | ||
1513 | + {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} }, | ||
1514 | + {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, | ||
1515 | + {"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, | ||
1516 | + /* pewpew-terminator */ | ||
1517 | + {"", "", "", 0, 0, {0, 0} } | ||
1518 | }; | ||
1519 | |||
1520 | static const struct bios_settings_t *bios_cfg __read_mostly; | ||
1521 | |||
1522 | - | ||
1523 | static int acerhdf_get_temp(int *temp) | ||
1524 | { | ||
1525 | u8 read_temp; | ||
1526 | @@ -142,7 +171,7 @@ static int acerhdf_get_temp(int *temp) | ||
1527 | if (ec_read(bios_cfg->tempreg, &read_temp)) | ||
1528 | return -EINVAL; | ||
1529 | |||
1530 | - *temp = read_temp; | ||
1531 | + *temp = read_temp * 1000; | ||
1532 | |||
1533 | return 0; | ||
1534 | } | ||
1535 | @@ -150,13 +179,14 @@ static int acerhdf_get_temp(int *temp) | ||
1536 | static int acerhdf_get_fanstate(int *state) | ||
1537 | { | ||
1538 | u8 fan; | ||
1539 | - bool tmp; | ||
1540 | |||
1541 | if (ec_read(bios_cfg->fanreg, &fan)) | ||
1542 | return -EINVAL; | ||
1543 | |||
1544 | - tmp = (fan == bios_cfg->fancmd[ACERHDF_FAN_OFF]); | ||
1545 | - *state = tmp ? ACERHDF_FAN_OFF : ACERHDF_FAN_AUTO; | ||
1546 | + if (fan != bios_cfg->cmd.cmd_off) | ||
1547 | + *state = ACERHDF_FAN_AUTO; | ||
1548 | + else | ||
1549 | + *state = ACERHDF_FAN_OFF; | ||
1550 | |||
1551 | return 0; | ||
1552 | } | ||
1553 | @@ -175,7 +205,8 @@ static void acerhdf_change_fanstate(int state) | ||
1554 | state = ACERHDF_FAN_AUTO; | ||
1555 | } | ||
1556 | |||
1557 | - cmd = bios_cfg->fancmd[state]; | ||
1558 | + cmd = (state == ACERHDF_FAN_OFF) ? bios_cfg->cmd.cmd_off | ||
1559 | + : bios_cfg->cmd.cmd_auto; | ||
1560 | fanstate = state; | ||
1561 | |||
1562 | ec_write(bios_cfg->fanreg, cmd); | ||
1563 | @@ -437,7 +468,7 @@ static int acerhdf_remove(struct platform_device *device) | ||
1564 | return 0; | ||
1565 | } | ||
1566 | |||
1567 | -struct platform_driver acerhdf_drv = { | ||
1568 | +static struct platform_driver acerhdf_driver = { | ||
1569 | .driver = { | ||
1570 | .name = "acerhdf", | ||
1571 | .owner = THIS_MODULE, | ||
1572 | @@ -454,32 +485,40 @@ static int acerhdf_check_hardware(void) | ||
1573 | { | ||
1574 | char const *vendor, *version, *product; | ||
1575 | int i; | ||
1576 | + unsigned long prod_len = 0; | ||
1577 | |||
1578 | /* get BIOS data */ | ||
1579 | vendor = dmi_get_system_info(DMI_SYS_VENDOR); | ||
1580 | version = dmi_get_system_info(DMI_BIOS_VERSION); | ||
1581 | product = dmi_get_system_info(DMI_PRODUCT_NAME); | ||
1582 | |||
1583 | + | ||
1584 | pr_info("Acer Aspire One Fan driver, v.%s\n", DRV_VER); | ||
1585 | |||
1586 | - if (!force_bios[0]) { | ||
1587 | - if (strncmp(product, "AO", 2)) { | ||
1588 | - pr_err("no Aspire One hardware found\n"); | ||
1589 | - return -EINVAL; | ||
1590 | - } | ||
1591 | - } else { | ||
1592 | - pr_info("forcing BIOS version: %s\n", version); | ||
1593 | + if (force_bios[0]) { | ||
1594 | version = force_bios; | ||
1595 | + pr_info("forcing BIOS version: %s\n", version); | ||
1596 | kernelmode = 0; | ||
1597 | } | ||
1598 | |||
1599 | + if (force_product[0]) { | ||
1600 | + product = force_product; | ||
1601 | + pr_info("forcing BIOS product: %s\n", product); | ||
1602 | + kernelmode = 0; | ||
1603 | + } | ||
1604 | + | ||
1605 | + prod_len = strlen(product); | ||
1606 | + | ||
1607 | if (verbose) | ||
1608 | pr_info("BIOS info: %s %s, product: %s\n", | ||
1609 | vendor, version, product); | ||
1610 | |||
1611 | /* search BIOS version and vendor in BIOS settings table */ | ||
1612 | for (i = 0; bios_tbl[i].version[0]; i++) { | ||
1613 | - if (!strcmp(bios_tbl[i].vendor, vendor) && | ||
1614 | + if (strlen(bios_tbl[i].product) >= prod_len && | ||
1615 | + !strncmp(bios_tbl[i].product, product, | ||
1616 | + strlen(bios_tbl[i].product)) && | ||
1617 | + !strcmp(bios_tbl[i].vendor, vendor) && | ||
1618 | !strcmp(bios_tbl[i].version, version)) { | ||
1619 | bios_cfg = &bios_tbl[i]; | ||
1620 | break; | ||
1621 | @@ -487,8 +526,8 @@ static int acerhdf_check_hardware(void) | ||
1622 | } | ||
1623 | |||
1624 | if (!bios_cfg) { | ||
1625 | - pr_err("unknown (unsupported) BIOS version %s/%s, " | ||
1626 | - "please report, aborting!\n", vendor, version); | ||
1627 | + pr_err("unknown (unsupported) BIOS version %s/%s/%s, " | ||
1628 | + "please report, aborting!\n", vendor, product, version); | ||
1629 | return -EINVAL; | ||
1630 | } | ||
1631 | |||
1632 | @@ -509,7 +548,7 @@ static int acerhdf_register_platform(void) | ||
1633 | { | ||
1634 | int err = 0; | ||
1635 | |||
1636 | - err = platform_driver_register(&acerhdf_drv); | ||
1637 | + err = platform_driver_register(&acerhdf_driver); | ||
1638 | if (err) | ||
1639 | return err; | ||
1640 | |||
1641 | @@ -525,7 +564,7 @@ static void acerhdf_unregister_platform(void) | ||
1642 | return; | ||
1643 | |||
1644 | platform_device_del(acerhdf_dev); | ||
1645 | - platform_driver_unregister(&acerhdf_drv); | ||
1646 | + platform_driver_unregister(&acerhdf_driver); | ||
1647 | } | ||
1648 | |||
1649 | static int acerhdf_register_thermal(void) | ||
1650 | diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c | ||
1651 | index d287283..e5a7eab 100644 | ||
1652 | --- a/drivers/platform/x86/thinkpad_acpi.c | ||
1653 | +++ b/drivers/platform/x86/thinkpad_acpi.c | ||
1654 | @@ -5863,7 +5863,7 @@ static int brightness_write(char *buf) | ||
1655 | * Doing it this way makes the syscall restartable in case of EINTR | ||
1656 | */ | ||
1657 | rc = brightness_set(level); | ||
1658 | - return (rc == -EINTR)? ERESTARTSYS : rc; | ||
1659 | + return (rc == -EINTR)? -ERESTARTSYS : rc; | ||
1660 | } | ||
1661 | |||
1662 | static struct ibm_struct brightness_driver_data = { | ||
1663 | diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c | ||
1664 | index 35a0b19..2d414e2 100644 | ||
1665 | --- a/drivers/pps/kapi.c | ||
1666 | +++ b/drivers/pps/kapi.c | ||
1667 | @@ -271,6 +271,7 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) | ||
1668 | { | ||
1669 | struct pps_device *pps; | ||
1670 | unsigned long flags; | ||
1671 | + int captured = 0; | ||
1672 | |||
1673 | if ((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0) { | ||
1674 | printk(KERN_ERR "pps: unknown event (%x) for source %d\n", | ||
1675 | @@ -293,7 +294,8 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) | ||
1676 | |||
1677 | /* Check the event */ | ||
1678 | pps->current_mode = pps->params.mode; | ||
1679 | - if (event & PPS_CAPTUREASSERT) { | ||
1680 | + if ((event & PPS_CAPTUREASSERT) & | ||
1681 | + (pps->params.mode & PPS_CAPTUREASSERT)) { | ||
1682 | /* We have to add an offset? */ | ||
1683 | if (pps->params.mode & PPS_OFFSETASSERT) | ||
1684 | pps_add_offset(ts, &pps->params.assert_off_tu); | ||
1685 | @@ -303,8 +305,11 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) | ||
1686 | pps->assert_sequence++; | ||
1687 | pr_debug("capture assert seq #%u for source %d\n", | ||
1688 | pps->assert_sequence, source); | ||
1689 | + | ||
1690 | + captured = ~0; | ||
1691 | } | ||
1692 | - if (event & PPS_CAPTURECLEAR) { | ||
1693 | + if ((event & PPS_CAPTURECLEAR) & | ||
1694 | + (pps->params.mode & PPS_CAPTURECLEAR)) { | ||
1695 | /* We have to add an offset? */ | ||
1696 | if (pps->params.mode & PPS_OFFSETCLEAR) | ||
1697 | pps_add_offset(ts, &pps->params.clear_off_tu); | ||
1698 | @@ -314,12 +319,17 @@ void pps_event(int source, struct pps_ktime *ts, int event, void *data) | ||
1699 | pps->clear_sequence++; | ||
1700 | pr_debug("capture clear seq #%u for source %d\n", | ||
1701 | pps->clear_sequence, source); | ||
1702 | + | ||
1703 | + captured = ~0; | ||
1704 | } | ||
1705 | |||
1706 | - pps->go = ~0; | ||
1707 | - wake_up_interruptible(&pps->queue); | ||
1708 | + /* Wake up iif captured somthing */ | ||
1709 | + if (captured) { | ||
1710 | + pps->go = ~0; | ||
1711 | + wake_up_interruptible(&pps->queue); | ||
1712 | |||
1713 | - kill_fasync(&pps->async_queue, SIGIO, POLL_IN); | ||
1714 | + kill_fasync(&pps->async_queue, SIGIO, POLL_IN); | ||
1715 | + } | ||
1716 | |||
1717 | spin_unlock_irqrestore(&pps->lock, flags); | ||
1718 | |||
1719 | diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c | ||
1720 | index fea17e7..ca5183b 100644 | ||
1721 | --- a/drivers/pps/pps.c | ||
1722 | +++ b/drivers/pps/pps.c | ||
1723 | @@ -71,9 +71,14 @@ static long pps_cdev_ioctl(struct file *file, | ||
1724 | case PPS_GETPARAMS: | ||
1725 | pr_debug("PPS_GETPARAMS: source %d\n", pps->id); | ||
1726 | |||
1727 | - /* Return current parameters */ | ||
1728 | - err = copy_to_user(uarg, &pps->params, | ||
1729 | - sizeof(struct pps_kparams)); | ||
1730 | + spin_lock_irq(&pps->lock); | ||
1731 | + | ||
1732 | + /* Get the current parameters */ | ||
1733 | + params = pps->params; | ||
1734 | + | ||
1735 | + spin_unlock_irq(&pps->lock); | ||
1736 | + | ||
1737 | + err = copy_to_user(uarg, ¶ms, sizeof(struct pps_kparams)); | ||
1738 | if (err) | ||
1739 | return -EFAULT; | ||
1740 | |||
1741 | diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c | ||
1742 | index ad16405..423cd5a 100644 | ||
1743 | --- a/drivers/rtc/rtc-v3020.c | ||
1744 | +++ b/drivers/rtc/rtc-v3020.c | ||
1745 | @@ -96,7 +96,7 @@ static void v3020_mmio_write_bit(struct v3020 *chip, unsigned char bit) | ||
1746 | |||
1747 | static unsigned char v3020_mmio_read_bit(struct v3020 *chip) | ||
1748 | { | ||
1749 | - return readl(chip->ioaddress) & (1 << chip->leftshift); | ||
1750 | + return !!(readl(chip->ioaddress) & (1 << chip->leftshift)); | ||
1751 | } | ||
1752 | |||
1753 | static struct v3020_chip_ops v3020_mmio_ops = { | ||
1754 | diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c | ||
1755 | index 185e6bc..9e8fce0 100644 | ||
1756 | --- a/drivers/scsi/gdth.c | ||
1757 | +++ b/drivers/scsi/gdth.c | ||
1758 | @@ -2900,7 +2900,7 @@ static int gdth_read_event(gdth_ha_str *ha, int handle, gdth_evt_str *estr) | ||
1759 | eindex = handle; | ||
1760 | estr->event_source = 0; | ||
1761 | |||
1762 | - if (eindex >= MAX_EVENTS) { | ||
1763 | + if (eindex < 0 || eindex >= MAX_EVENTS) { | ||
1764 | spin_unlock_irqrestore(&ha->smp_lock, flags); | ||
1765 | return eindex; | ||
1766 | } | ||
1767 | diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c | ||
1768 | index 02406ba..cdf172e 100644 | ||
1769 | --- a/drivers/serial/of_serial.c | ||
1770 | +++ b/drivers/serial/of_serial.c | ||
1771 | @@ -161,6 +161,7 @@ static int of_platform_serial_remove(struct of_device *ofdev) | ||
1772 | static struct of_device_id __devinitdata of_platform_serial_table[] = { | ||
1773 | { .type = "serial", .compatible = "ns8250", .data = (void *)PORT_8250, }, | ||
1774 | { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, }, | ||
1775 | + { .type = "serial", .compatible = "ns16550a", .data = (void *)PORT_16550A, }, | ||
1776 | { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, }, | ||
1777 | { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, }, | ||
1778 | { .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, }, | ||
1779 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
1780 | index e3861b2..b72fa49 100644 | ||
1781 | --- a/drivers/usb/class/cdc-acm.c | ||
1782 | +++ b/drivers/usb/class/cdc-acm.c | ||
1783 | @@ -609,9 +609,9 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | ||
1784 | |||
1785 | acm->throttle = 0; | ||
1786 | |||
1787 | - tasklet_schedule(&acm->urb_task); | ||
1788 | set_bit(ASYNCB_INITIALIZED, &acm->port.flags); | ||
1789 | rv = tty_port_block_til_ready(&acm->port, tty, filp); | ||
1790 | + tasklet_schedule(&acm->urb_task); | ||
1791 | done: | ||
1792 | mutex_unlock(&acm->mutex); | ||
1793 | err_out: | ||
1794 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
1795 | index 71f86c6..b41989e 100644 | ||
1796 | --- a/drivers/usb/core/hub.c | ||
1797 | +++ b/drivers/usb/core/hub.c | ||
1798 | @@ -439,7 +439,7 @@ resubmit: | ||
1799 | static inline int | ||
1800 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) | ||
1801 | { | ||
1802 | - return usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | ||
1803 | + return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
1804 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, | ||
1805 | tt, NULL, 0, 1000); | ||
1806 | } | ||
1807 | diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c | ||
1808 | index 77352cc..fb09766 100644 | ||
1809 | --- a/drivers/usb/gadget/amd5536udc.c | ||
1810 | +++ b/drivers/usb/gadget/amd5536udc.c | ||
1811 | @@ -1213,7 +1213,12 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp) | ||
1812 | tmp &= AMD_UNMASK_BIT(ep->num); | ||
1813 | writel(tmp, &dev->regs->ep_irqmsk); | ||
1814 | } | ||
1815 | - } | ||
1816 | + } else if (ep->in) { | ||
1817 | + /* enable ep irq */ | ||
1818 | + tmp = readl(&dev->regs->ep_irqmsk); | ||
1819 | + tmp &= AMD_UNMASK_BIT(ep->num); | ||
1820 | + writel(tmp, &dev->regs->ep_irqmsk); | ||
1821 | + } | ||
1822 | |||
1823 | } else if (ep->dma) { | ||
1824 | |||
1825 | @@ -2005,18 +2010,17 @@ __acquires(dev->lock) | ||
1826 | { | ||
1827 | int tmp; | ||
1828 | |||
1829 | - /* empty queues and init hardware */ | ||
1830 | - udc_basic_init(dev); | ||
1831 | - for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { | ||
1832 | - empty_req_queue(&dev->ep[tmp]); | ||
1833 | - } | ||
1834 | - | ||
1835 | if (dev->gadget.speed != USB_SPEED_UNKNOWN) { | ||
1836 | spin_unlock(&dev->lock); | ||
1837 | driver->disconnect(&dev->gadget); | ||
1838 | spin_lock(&dev->lock); | ||
1839 | } | ||
1840 | - /* init */ | ||
1841 | + | ||
1842 | + /* empty queues and init hardware */ | ||
1843 | + udc_basic_init(dev); | ||
1844 | + for (tmp = 0; tmp < UDC_EP_NUM; tmp++) | ||
1845 | + empty_req_queue(&dev->ep[tmp]); | ||
1846 | + | ||
1847 | udc_setup_endpoints(dev); | ||
1848 | } | ||
1849 | |||
1850 | @@ -2478,6 +2482,13 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) | ||
1851 | } | ||
1852 | } | ||
1853 | |||
1854 | + } else if (!use_dma && ep->in) { | ||
1855 | + /* disable interrupt */ | ||
1856 | + tmp = readl( | ||
1857 | + &dev->regs->ep_irqmsk); | ||
1858 | + tmp |= AMD_BIT(ep->num); | ||
1859 | + writel(tmp, | ||
1860 | + &dev->regs->ep_irqmsk); | ||
1861 | } | ||
1862 | } | ||
1863 | /* clear status bits */ | ||
1864 | @@ -3285,6 +3296,17 @@ static int udc_pci_probe( | ||
1865 | goto finished; | ||
1866 | } | ||
1867 | |||
1868 | + spin_lock_init(&dev->lock); | ||
1869 | + /* udc csr registers base */ | ||
1870 | + dev->csr = dev->virt_addr + UDC_CSR_ADDR; | ||
1871 | + /* dev registers base */ | ||
1872 | + dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR; | ||
1873 | + /* ep registers base */ | ||
1874 | + dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR; | ||
1875 | + /* fifo's base */ | ||
1876 | + dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR); | ||
1877 | + dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR); | ||
1878 | + | ||
1879 | if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { | ||
1880 | dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); | ||
1881 | kfree(dev); | ||
1882 | @@ -3337,7 +3359,6 @@ static int udc_probe(struct udc *dev) | ||
1883 | udc_pollstall_timer.data = 0; | ||
1884 | |||
1885 | /* device struct setup */ | ||
1886 | - spin_lock_init(&dev->lock); | ||
1887 | dev->gadget.ops = &udc_ops; | ||
1888 | |||
1889 | dev_set_name(&dev->gadget.dev, "gadget"); | ||
1890 | @@ -3346,16 +3367,6 @@ static int udc_probe(struct udc *dev) | ||
1891 | dev->gadget.name = name; | ||
1892 | dev->gadget.is_dualspeed = 1; | ||
1893 | |||
1894 | - /* udc csr registers base */ | ||
1895 | - dev->csr = dev->virt_addr + UDC_CSR_ADDR; | ||
1896 | - /* dev registers base */ | ||
1897 | - dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR; | ||
1898 | - /* ep registers base */ | ||
1899 | - dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR; | ||
1900 | - /* fifo's base */ | ||
1901 | - dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR); | ||
1902 | - dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR); | ||
1903 | - | ||
1904 | /* init registers, interrupts, ... */ | ||
1905 | startup_registers(dev); | ||
1906 | |||
1907 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c | ||
1908 | index 11c627c..7e4b381 100644 | ||
1909 | --- a/drivers/usb/host/ehci-hcd.c | ||
1910 | +++ b/drivers/usb/host/ehci-hcd.c | ||
1911 | @@ -28,6 +28,7 @@ | ||
1912 | #include <linux/errno.h> | ||
1913 | #include <linux/init.h> | ||
1914 | #include <linux/timer.h> | ||
1915 | +#include <linux/ktime.h> | ||
1916 | #include <linux/list.h> | ||
1917 | #include <linux/interrupt.h> | ||
1918 | #include <linux/reboot.h> | ||
1919 | @@ -655,6 +656,7 @@ static int ehci_run (struct usb_hcd *hcd) | ||
1920 | ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ | ||
1921 | msleep(5); | ||
1922 | up_write(&ehci_cf_port_reset_rwsem); | ||
1923 | + ehci->last_periodic_enable = ktime_get_real(); | ||
1924 | |||
1925 | temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
1926 | ehci_info (ehci, | ||
1927 | diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c | ||
1928 | index c2f1b7d..c757a70 100644 | ||
1929 | --- a/drivers/usb/host/ehci-pci.c | ||
1930 | +++ b/drivers/usb/host/ehci-pci.c | ||
1931 | @@ -72,6 +72,12 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | ||
1932 | int retval; | ||
1933 | |||
1934 | switch (pdev->vendor) { | ||
1935 | + case PCI_VENDOR_ID_INTEL: | ||
1936 | + if (pdev->device == 0x27cc) { | ||
1937 | + ehci->broken_periodic = 1; | ||
1938 | + ehci_info(ehci, "using broken periodic workaround\n"); | ||
1939 | + } | ||
1940 | + break; | ||
1941 | case PCI_VENDOR_ID_TOSHIBA_2: | ||
1942 | /* celleb's companion chip */ | ||
1943 | if (pdev->device == 0x01b5) { | ||
1944 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c | ||
1945 | index 7673554..6b6c240 100644 | ||
1946 | --- a/drivers/usb/host/ehci-q.c | ||
1947 | +++ b/drivers/usb/host/ehci-q.c | ||
1948 | @@ -475,8 +475,20 @@ halt: | ||
1949 | * we must clear the TT buffer (11.17.5). | ||
1950 | */ | ||
1951 | if (unlikely(last_status != -EINPROGRESS && | ||
1952 | - last_status != -EREMOTEIO)) | ||
1953 | - ehci_clear_tt_buffer(ehci, qh, urb, token); | ||
1954 | + last_status != -EREMOTEIO)) { | ||
1955 | + /* The TT's in some hubs malfunction when they | ||
1956 | + * receive this request following a STALL (they | ||
1957 | + * stop sending isochronous packets). Since a | ||
1958 | + * STALL can't leave the TT buffer in a busy | ||
1959 | + * state (if you believe Figures 11-48 - 11-51 | ||
1960 | + * in the USB 2.0 spec), we won't clear the TT | ||
1961 | + * buffer in this case. Strictly speaking this | ||
1962 | + * is a violation of the spec. | ||
1963 | + */ | ||
1964 | + if (last_status != -EPIPE) | ||
1965 | + ehci_clear_tt_buffer(ehci, qh, urb, | ||
1966 | + token); | ||
1967 | + } | ||
1968 | } | ||
1969 | |||
1970 | /* if we're removing something not at the queue head, | ||
1971 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c | ||
1972 | index edd61ee..c340f1f 100644 | ||
1973 | --- a/drivers/usb/host/ehci-sched.c | ||
1974 | +++ b/drivers/usb/host/ehci-sched.c | ||
1975 | @@ -456,6 +456,8 @@ static int enable_periodic (struct ehci_hcd *ehci) | ||
1976 | /* make sure ehci_work scans these */ | ||
1977 | ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) | ||
1978 | % (ehci->periodic_size << 3); | ||
1979 | + if (unlikely(ehci->broken_periodic)) | ||
1980 | + ehci->last_periodic_enable = ktime_get_real(); | ||
1981 | return 0; | ||
1982 | } | ||
1983 | |||
1984 | @@ -467,6 +469,16 @@ static int disable_periodic (struct ehci_hcd *ehci) | ||
1985 | if (--ehci->periodic_sched) | ||
1986 | return 0; | ||
1987 | |||
1988 | + if (unlikely(ehci->broken_periodic)) { | ||
1989 | + /* delay experimentally determined */ | ||
1990 | + ktime_t safe = ktime_add_us(ehci->last_periodic_enable, 1000); | ||
1991 | + ktime_t now = ktime_get_real(); | ||
1992 | + s64 delay = ktime_us_delta(safe, now); | ||
1993 | + | ||
1994 | + if (unlikely(delay > 0)) | ||
1995 | + udelay(delay); | ||
1996 | + } | ||
1997 | + | ||
1998 | /* did setting PSE not take effect yet? | ||
1999 | * takes effect only at frame boundaries... | ||
2000 | */ | ||
2001 | diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h | ||
2002 | index 2bfff30..aab3cbc 100644 | ||
2003 | --- a/drivers/usb/host/ehci.h | ||
2004 | +++ b/drivers/usb/host/ehci.h | ||
2005 | @@ -118,6 +118,7 @@ struct ehci_hcd { /* one per controller */ | ||
2006 | unsigned stamp; | ||
2007 | unsigned random_frame; | ||
2008 | unsigned long next_statechange; | ||
2009 | + ktime_t last_periodic_enable; | ||
2010 | u32 command; | ||
2011 | |||
2012 | /* SILICON QUIRKS */ | ||
2013 | @@ -126,6 +127,7 @@ struct ehci_hcd { /* one per controller */ | ||
2014 | unsigned big_endian_mmio:1; | ||
2015 | unsigned big_endian_desc:1; | ||
2016 | unsigned has_amcc_usb23:1; | ||
2017 | + unsigned broken_periodic:1; | ||
2018 | |||
2019 | /* required for usb32 quirk */ | ||
2020 | #define OHCI_CTRL_HCFS (3 << 6) | ||
2021 | diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c | ||
2022 | index 5815168..1ed2a16 100644 | ||
2023 | --- a/drivers/usb/host/ohci-hcd.c | ||
2024 | +++ b/drivers/usb/host/ohci-hcd.c | ||
2025 | @@ -88,6 +88,7 @@ static int ohci_restart (struct ohci_hcd *ohci); | ||
2026 | #ifdef CONFIG_PCI | ||
2027 | static void quirk_amd_pll(int state); | ||
2028 | static void amd_iso_dev_put(void); | ||
2029 | +static void sb800_prefetch(struct ohci_hcd *ohci, int on); | ||
2030 | #else | ||
2031 | static inline void quirk_amd_pll(int state) | ||
2032 | { | ||
2033 | @@ -97,6 +98,10 @@ static inline void amd_iso_dev_put(void) | ||
2034 | { | ||
2035 | return; | ||
2036 | } | ||
2037 | +static inline void sb800_prefetch(struct ohci_hcd *ohci, int on) | ||
2038 | +{ | ||
2039 | + return; | ||
2040 | +} | ||
2041 | #endif | ||
2042 | |||
2043 | |||
2044 | diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c | ||
2045 | index d2ba04d..b8a1148 100644 | ||
2046 | --- a/drivers/usb/host/ohci-pci.c | ||
2047 | +++ b/drivers/usb/host/ohci-pci.c | ||
2048 | @@ -177,6 +177,13 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) | ||
2049 | return 0; | ||
2050 | |||
2051 | pci_read_config_byte(amd_smbus_dev, PCI_REVISION_ID, &rev); | ||
2052 | + | ||
2053 | + /* SB800 needs pre-fetch fix */ | ||
2054 | + if ((rev >= 0x40) && (rev <= 0x4f)) { | ||
2055 | + ohci->flags |= OHCI_QUIRK_AMD_PREFETCH; | ||
2056 | + ohci_dbg(ohci, "enabled AMD prefetch quirk\n"); | ||
2057 | + } | ||
2058 | + | ||
2059 | if ((rev > 0x3b) || (rev < 0x30)) { | ||
2060 | pci_dev_put(amd_smbus_dev); | ||
2061 | amd_smbus_dev = NULL; | ||
2062 | @@ -262,6 +269,19 @@ static void amd_iso_dev_put(void) | ||
2063 | |||
2064 | } | ||
2065 | |||
2066 | +static void sb800_prefetch(struct ohci_hcd *ohci, int on) | ||
2067 | +{ | ||
2068 | + struct pci_dev *pdev; | ||
2069 | + u16 misc; | ||
2070 | + | ||
2071 | + pdev = to_pci_dev(ohci_to_hcd(ohci)->self.controller); | ||
2072 | + pci_read_config_word(pdev, 0x50, &misc); | ||
2073 | + if (on == 0) | ||
2074 | + pci_write_config_word(pdev, 0x50, misc & 0xfcff); | ||
2075 | + else | ||
2076 | + pci_write_config_word(pdev, 0x50, misc | 0x0300); | ||
2077 | +} | ||
2078 | + | ||
2079 | /* List of quirks for OHCI */ | ||
2080 | static const struct pci_device_id ohci_pci_quirks[] = { | ||
2081 | { | ||
2082 | diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c | ||
2083 | index c2d80f8..2c7409b 100644 | ||
2084 | --- a/drivers/usb/host/ohci-q.c | ||
2085 | +++ b/drivers/usb/host/ohci-q.c | ||
2086 | @@ -49,9 +49,12 @@ __acquires(ohci->lock) | ||
2087 | switch (usb_pipetype (urb->pipe)) { | ||
2088 | case PIPE_ISOCHRONOUS: | ||
2089 | ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs--; | ||
2090 | - if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0 | ||
2091 | - && quirk_amdiso(ohci)) | ||
2092 | - quirk_amd_pll(1); | ||
2093 | + if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0) { | ||
2094 | + if (quirk_amdiso(ohci)) | ||
2095 | + quirk_amd_pll(1); | ||
2096 | + if (quirk_amdprefetch(ohci)) | ||
2097 | + sb800_prefetch(ohci, 0); | ||
2098 | + } | ||
2099 | break; | ||
2100 | case PIPE_INTERRUPT: | ||
2101 | ohci_to_hcd(ohci)->self.bandwidth_int_reqs--; | ||
2102 | @@ -680,9 +683,12 @@ static void td_submit_urb ( | ||
2103 | data + urb->iso_frame_desc [cnt].offset, | ||
2104 | urb->iso_frame_desc [cnt].length, urb, cnt); | ||
2105 | } | ||
2106 | - if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0 | ||
2107 | - && quirk_amdiso(ohci)) | ||
2108 | - quirk_amd_pll(0); | ||
2109 | + if (ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs == 0) { | ||
2110 | + if (quirk_amdiso(ohci)) | ||
2111 | + quirk_amd_pll(0); | ||
2112 | + if (quirk_amdprefetch(ohci)) | ||
2113 | + sb800_prefetch(ohci, 1); | ||
2114 | + } | ||
2115 | periodic = ohci_to_hcd(ohci)->self.bandwidth_isoc_reqs++ == 0 | ||
2116 | && ohci_to_hcd(ohci)->self.bandwidth_int_reqs == 0; | ||
2117 | break; | ||
2118 | diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h | ||
2119 | index 222011f..5bf15fe 100644 | ||
2120 | --- a/drivers/usb/host/ohci.h | ||
2121 | +++ b/drivers/usb/host/ohci.h | ||
2122 | @@ -402,6 +402,7 @@ struct ohci_hcd { | ||
2123 | #define OHCI_QUIRK_FRAME_NO 0x80 /* no big endian frame_no shift */ | ||
2124 | #define OHCI_QUIRK_HUB_POWER 0x100 /* distrust firmware power/oc setup */ | ||
2125 | #define OHCI_QUIRK_AMD_ISO 0x200 /* ISO transfers*/ | ||
2126 | +#define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */ | ||
2127 | // there are also chip quirks/bugs in init logic | ||
2128 | |||
2129 | struct work_struct nec_work; /* Worker for NEC quirk */ | ||
2130 | @@ -433,6 +434,10 @@ static inline int quirk_amdiso(struct ohci_hcd *ohci) | ||
2131 | { | ||
2132 | return ohci->flags & OHCI_QUIRK_AMD_ISO; | ||
2133 | } | ||
2134 | +static inline int quirk_amdprefetch(struct ohci_hcd *ohci) | ||
2135 | +{ | ||
2136 | + return ohci->flags & OHCI_QUIRK_AMD_PREFETCH; | ||
2137 | +} | ||
2138 | #else | ||
2139 | static inline int quirk_nec(struct ohci_hcd *ohci) | ||
2140 | { | ||
2141 | @@ -446,6 +451,10 @@ static inline int quirk_amdiso(struct ohci_hcd *ohci) | ||
2142 | { | ||
2143 | return 0; | ||
2144 | } | ||
2145 | +static inline int quirk_amdprefetch(struct ohci_hcd *ohci) | ||
2146 | +{ | ||
2147 | + return 0; | ||
2148 | +} | ||
2149 | #endif | ||
2150 | |||
2151 | /* convert between an hcd pointer and the corresponding ohci_hcd */ | ||
2152 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
2153 | index 55920b3..2114648 100644 | ||
2154 | --- a/drivers/usb/host/xhci-mem.c | ||
2155 | +++ b/drivers/usb/host/xhci-mem.c | ||
2156 | @@ -756,9 +756,11 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
2157 | int i; | ||
2158 | |||
2159 | /* Free the Event Ring Segment Table and the actual Event Ring */ | ||
2160 | - xhci_writel(xhci, 0, &xhci->ir_set->erst_size); | ||
2161 | - xhci_write_64(xhci, 0, &xhci->ir_set->erst_base); | ||
2162 | - xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue); | ||
2163 | + if (xhci->ir_set) { | ||
2164 | + xhci_writel(xhci, 0, &xhci->ir_set->erst_size); | ||
2165 | + xhci_write_64(xhci, 0, &xhci->ir_set->erst_base); | ||
2166 | + xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue); | ||
2167 | + } | ||
2168 | size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); | ||
2169 | if (xhci->erst.entries) | ||
2170 | pci_free_consistent(pdev, size, | ||
2171 | @@ -795,9 +797,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
2172 | xhci->dcbaa, xhci->dcbaa->dma); | ||
2173 | xhci->dcbaa = NULL; | ||
2174 | |||
2175 | + scratchpad_free(xhci); | ||
2176 | xhci->page_size = 0; | ||
2177 | xhci->page_shift = 0; | ||
2178 | - scratchpad_free(xhci); | ||
2179 | } | ||
2180 | |||
2181 | int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
2182 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
2183 | index ff5e6bc..9874d9a 100644 | ||
2184 | --- a/drivers/usb/host/xhci-ring.c | ||
2185 | +++ b/drivers/usb/host/xhci-ring.c | ||
2186 | @@ -822,9 +822,11 @@ static struct xhci_segment *trb_in_td( | ||
2187 | cur_seg = start_seg; | ||
2188 | |||
2189 | do { | ||
2190 | + if (start_dma == 0) | ||
2191 | + return 0; | ||
2192 | /* We may get an event for a Link TRB in the middle of a TD */ | ||
2193 | end_seg_dma = xhci_trb_virt_to_dma(cur_seg, | ||
2194 | - &start_seg->trbs[TRBS_PER_SEGMENT - 1]); | ||
2195 | + &cur_seg->trbs[TRBS_PER_SEGMENT - 1]); | ||
2196 | /* If the end TRB isn't in this segment, this is set to 0 */ | ||
2197 | end_trb_dma = xhci_trb_virt_to_dma(cur_seg, end_trb); | ||
2198 | |||
2199 | @@ -851,8 +853,9 @@ static struct xhci_segment *trb_in_td( | ||
2200 | } | ||
2201 | cur_seg = cur_seg->next; | ||
2202 | start_dma = xhci_trb_virt_to_dma(cur_seg, &cur_seg->trbs[0]); | ||
2203 | - } while (1); | ||
2204 | + } while (cur_seg != start_seg); | ||
2205 | |||
2206 | + return 0; | ||
2207 | } | ||
2208 | |||
2209 | /* | ||
2210 | diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c | ||
2211 | index 0f7a30b..fb1dd27 100644 | ||
2212 | --- a/drivers/usb/mon/mon_bin.c | ||
2213 | +++ b/drivers/usb/mon/mon_bin.c | ||
2214 | @@ -350,12 +350,12 @@ static unsigned int mon_buff_area_alloc_contiguous(struct mon_reader_bin *rp, | ||
2215 | |||
2216 | /* | ||
2217 | * Return a few (kilo-)bytes to the head of the buffer. | ||
2218 | - * This is used if a DMA fetch fails. | ||
2219 | + * This is used if a data fetch fails. | ||
2220 | */ | ||
2221 | static void mon_buff_area_shrink(struct mon_reader_bin *rp, unsigned int size) | ||
2222 | { | ||
2223 | |||
2224 | - size = (size + PKT_ALIGN-1) & ~(PKT_ALIGN-1); | ||
2225 | + /* size &= ~(PKT_ALIGN-1); -- we're called with aligned size */ | ||
2226 | rp->b_cnt -= size; | ||
2227 | if (rp->b_in < size) | ||
2228 | rp->b_in += rp->b_size; | ||
2229 | @@ -442,6 +442,7 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, | ||
2230 | unsigned int urb_length; | ||
2231 | unsigned int offset; | ||
2232 | unsigned int length; | ||
2233 | + unsigned int delta; | ||
2234 | unsigned int ndesc, lendesc; | ||
2235 | unsigned char dir; | ||
2236 | struct mon_bin_hdr *ep; | ||
2237 | @@ -546,8 +547,10 @@ static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, | ||
2238 | if (length != 0) { | ||
2239 | ep->flag_data = mon_bin_get_data(rp, offset, urb, length); | ||
2240 | if (ep->flag_data != 0) { /* Yes, it's 0x00, not '0' */ | ||
2241 | - ep->len_cap = 0; | ||
2242 | - mon_buff_area_shrink(rp, length); | ||
2243 | + delta = (ep->len_cap + PKT_ALIGN-1) & ~(PKT_ALIGN-1); | ||
2244 | + ep->len_cap -= length; | ||
2245 | + delta -= (ep->len_cap + PKT_ALIGN-1) & ~(PKT_ALIGN-1); | ||
2246 | + mon_buff_area_shrink(rp, delta); | ||
2247 | } | ||
2248 | } else { | ||
2249 | ep->flag_data = data_tag; | ||
2250 | diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c | ||
2251 | index 8b3c4e2..74073f9 100644 | ||
2252 | --- a/drivers/usb/musb/musb_gadget.c | ||
2253 | +++ b/drivers/usb/musb/musb_gadget.c | ||
2254 | @@ -4,6 +4,7 @@ | ||
2255 | * Copyright 2005 Mentor Graphics Corporation | ||
2256 | * Copyright (C) 2005-2006 by Texas Instruments | ||
2257 | * Copyright (C) 2006-2007 Nokia Corporation | ||
2258 | + * Copyright (C) 2009 MontaVista Software, Inc. <source@mvista.com> | ||
2259 | * | ||
2260 | * This program is free software; you can redistribute it and/or | ||
2261 | * modify it under the terms of the GNU General Public License | ||
2262 | @@ -436,14 +437,6 @@ void musb_g_tx(struct musb *musb, u8 epnum) | ||
2263 | csr |= MUSB_TXCSR_P_WZC_BITS; | ||
2264 | csr &= ~MUSB_TXCSR_P_SENTSTALL; | ||
2265 | musb_writew(epio, MUSB_TXCSR, csr); | ||
2266 | - if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | ||
2267 | - dma->status = MUSB_DMA_STATUS_CORE_ABORT; | ||
2268 | - musb->dma_controller->channel_abort(dma); | ||
2269 | - } | ||
2270 | - | ||
2271 | - if (request) | ||
2272 | - musb_g_giveback(musb_ep, request, -EPIPE); | ||
2273 | - | ||
2274 | break; | ||
2275 | } | ||
2276 | |||
2277 | @@ -582,15 +575,25 @@ void musb_g_tx(struct musb *musb, u8 epnum) | ||
2278 | */ | ||
2279 | static void rxstate(struct musb *musb, struct musb_request *req) | ||
2280 | { | ||
2281 | - u16 csr = 0; | ||
2282 | const u8 epnum = req->epnum; | ||
2283 | struct usb_request *request = &req->request; | ||
2284 | struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; | ||
2285 | void __iomem *epio = musb->endpoints[epnum].regs; | ||
2286 | unsigned fifo_count = 0; | ||
2287 | u16 len = musb_ep->packet_sz; | ||
2288 | + u16 csr = musb_readw(epio, MUSB_RXCSR); | ||
2289 | |||
2290 | - csr = musb_readw(epio, MUSB_RXCSR); | ||
2291 | + /* We shouldn't get here while DMA is active, but we do... */ | ||
2292 | + if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { | ||
2293 | + DBG(4, "DMA pending...\n"); | ||
2294 | + return; | ||
2295 | + } | ||
2296 | + | ||
2297 | + if (csr & MUSB_RXCSR_P_SENDSTALL) { | ||
2298 | + DBG(5, "%s stalling, RXCSR %04x\n", | ||
2299 | + musb_ep->end_point.name, csr); | ||
2300 | + return; | ||
2301 | + } | ||
2302 | |||
2303 | if (is_cppi_enabled() && musb_ep->dma) { | ||
2304 | struct dma_controller *c = musb->dma_controller; | ||
2305 | @@ -761,19 +764,10 @@ void musb_g_rx(struct musb *musb, u8 epnum) | ||
2306 | csr, dma ? " (dma)" : "", request); | ||
2307 | |||
2308 | if (csr & MUSB_RXCSR_P_SENTSTALL) { | ||
2309 | - if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | ||
2310 | - dma->status = MUSB_DMA_STATUS_CORE_ABORT; | ||
2311 | - (void) musb->dma_controller->channel_abort(dma); | ||
2312 | - request->actual += musb_ep->dma->actual_len; | ||
2313 | - } | ||
2314 | - | ||
2315 | csr |= MUSB_RXCSR_P_WZC_BITS; | ||
2316 | csr &= ~MUSB_RXCSR_P_SENTSTALL; | ||
2317 | musb_writew(epio, MUSB_RXCSR, csr); | ||
2318 | - | ||
2319 | - if (request) | ||
2320 | - musb_g_giveback(musb_ep, request, -EPIPE); | ||
2321 | - goto done; | ||
2322 | + return; | ||
2323 | } | ||
2324 | |||
2325 | if (csr & MUSB_RXCSR_P_OVERRUN) { | ||
2326 | @@ -795,7 +789,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) | ||
2327 | DBG((csr & MUSB_RXCSR_DMAENAB) ? 4 : 1, | ||
2328 | "%s busy, csr %04x\n", | ||
2329 | musb_ep->end_point.name, csr); | ||
2330 | - goto done; | ||
2331 | + return; | ||
2332 | } | ||
2333 | |||
2334 | if (dma && (csr & MUSB_RXCSR_DMAENAB)) { | ||
2335 | @@ -826,22 +820,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) | ||
2336 | if ((request->actual < request->length) | ||
2337 | && (musb_ep->dma->actual_len | ||
2338 | == musb_ep->packet_sz)) | ||
2339 | - goto done; | ||
2340 | + return; | ||
2341 | #endif | ||
2342 | musb_g_giveback(musb_ep, request, 0); | ||
2343 | |||
2344 | request = next_request(musb_ep); | ||
2345 | if (!request) | ||
2346 | - goto done; | ||
2347 | - | ||
2348 | - /* don't start more i/o till the stall clears */ | ||
2349 | - musb_ep_select(mbase, epnum); | ||
2350 | - csr = musb_readw(epio, MUSB_RXCSR); | ||
2351 | - if (csr & MUSB_RXCSR_P_SENDSTALL) | ||
2352 | - goto done; | ||
2353 | + return; | ||
2354 | } | ||
2355 | |||
2356 | - | ||
2357 | /* analyze request if the ep is hot */ | ||
2358 | if (request) | ||
2359 | rxstate(musb, to_musb_request(request)); | ||
2360 | @@ -849,8 +836,6 @@ void musb_g_rx(struct musb *musb, u8 epnum) | ||
2361 | DBG(3, "packet waiting for %s%s request\n", | ||
2362 | musb_ep->desc ? "" : "inactive ", | ||
2363 | musb_ep->end_point.name); | ||
2364 | - | ||
2365 | -done: | ||
2366 | return; | ||
2367 | } | ||
2368 | |||
2369 | @@ -1244,7 +1229,7 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) | ||
2370 | void __iomem *mbase; | ||
2371 | unsigned long flags; | ||
2372 | u16 csr; | ||
2373 | - struct musb_request *request = NULL; | ||
2374 | + struct musb_request *request; | ||
2375 | int status = 0; | ||
2376 | |||
2377 | if (!ep) | ||
2378 | @@ -1260,24 +1245,29 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) | ||
2379 | |||
2380 | musb_ep_select(mbase, epnum); | ||
2381 | |||
2382 | - /* cannot portably stall with non-empty FIFO */ | ||
2383 | request = to_musb_request(next_request(musb_ep)); | ||
2384 | - if (value && musb_ep->is_in) { | ||
2385 | - csr = musb_readw(epio, MUSB_TXCSR); | ||
2386 | - if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | ||
2387 | - DBG(3, "%s fifo busy, cannot halt\n", ep->name); | ||
2388 | - spin_unlock_irqrestore(&musb->lock, flags); | ||
2389 | - return -EAGAIN; | ||
2390 | + if (value) { | ||
2391 | + if (request) { | ||
2392 | + DBG(3, "request in progress, cannot halt %s\n", | ||
2393 | + ep->name); | ||
2394 | + status = -EAGAIN; | ||
2395 | + goto done; | ||
2396 | + } | ||
2397 | + /* Cannot portably stall with non-empty FIFO */ | ||
2398 | + if (musb_ep->is_in) { | ||
2399 | + csr = musb_readw(epio, MUSB_TXCSR); | ||
2400 | + if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | ||
2401 | + DBG(3, "FIFO busy, cannot halt %s\n", ep->name); | ||
2402 | + status = -EAGAIN; | ||
2403 | + goto done; | ||
2404 | + } | ||
2405 | } | ||
2406 | - | ||
2407 | } | ||
2408 | |||
2409 | /* set/clear the stall and toggle bits */ | ||
2410 | DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear"); | ||
2411 | if (musb_ep->is_in) { | ||
2412 | csr = musb_readw(epio, MUSB_TXCSR); | ||
2413 | - if (csr & MUSB_TXCSR_FIFONOTEMPTY) | ||
2414 | - csr |= MUSB_TXCSR_FLUSHFIFO; | ||
2415 | csr |= MUSB_TXCSR_P_WZC_BITS | ||
2416 | | MUSB_TXCSR_CLRDATATOG; | ||
2417 | if (value) | ||
2418 | @@ -1300,14 +1290,13 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) | ||
2419 | musb_writew(epio, MUSB_RXCSR, csr); | ||
2420 | } | ||
2421 | |||
2422 | -done: | ||
2423 | - | ||
2424 | /* maybe start the first request in the queue */ | ||
2425 | if (!musb_ep->busy && !value && request) { | ||
2426 | DBG(3, "restarting the request\n"); | ||
2427 | musb_ep_restart(musb, request); | ||
2428 | } | ||
2429 | |||
2430 | +done: | ||
2431 | spin_unlock_irqrestore(&musb->lock, flags); | ||
2432 | return status; | ||
2433 | } | ||
2434 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
2435 | index a69457f..2367325 100644 | ||
2436 | --- a/drivers/usb/serial/cp210x.c | ||
2437 | +++ b/drivers/usb/serial/cp210x.c | ||
2438 | @@ -51,6 +51,8 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *, | ||
2439 | static void cp210x_break_ctl(struct tty_struct *, int); | ||
2440 | static int cp210x_startup(struct usb_serial *); | ||
2441 | static void cp210x_disconnect(struct usb_serial *); | ||
2442 | +static void cp210x_dtr_rts(struct usb_serial_port *p, int on); | ||
2443 | +static int cp210x_carrier_raised(struct usb_serial_port *p); | ||
2444 | |||
2445 | static int debug; | ||
2446 | |||
2447 | @@ -144,6 +146,8 @@ static struct usb_serial_driver cp210x_device = { | ||
2448 | .tiocmset = cp210x_tiocmset, | ||
2449 | .attach = cp210x_startup, | ||
2450 | .disconnect = cp210x_disconnect, | ||
2451 | + .dtr_rts = cp210x_dtr_rts, | ||
2452 | + .carrier_raised = cp210x_carrier_raised | ||
2453 | }; | ||
2454 | |||
2455 | /* Config request types */ | ||
2456 | @@ -748,6 +752,14 @@ static int cp210x_tiocmset_port(struct usb_serial_port *port, struct file *file, | ||
2457 | return cp210x_set_config(port, CP210X_SET_MHS, &control, 2); | ||
2458 | } | ||
2459 | |||
2460 | +static void cp210x_dtr_rts(struct usb_serial_port *p, int on) | ||
2461 | +{ | ||
2462 | + if (on) | ||
2463 | + cp210x_tiocmset_port(p, NULL, TIOCM_DTR|TIOCM_RTS, 0); | ||
2464 | + else | ||
2465 | + cp210x_tiocmset_port(p, NULL, 0, TIOCM_DTR|TIOCM_RTS); | ||
2466 | +} | ||
2467 | + | ||
2468 | static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) | ||
2469 | { | ||
2470 | struct usb_serial_port *port = tty->driver_data; | ||
2471 | @@ -770,6 +782,15 @@ static int cp210x_tiocmget (struct tty_struct *tty, struct file *file) | ||
2472 | return result; | ||
2473 | } | ||
2474 | |||
2475 | +static int cp210x_carrier_raised(struct usb_serial_port *p) | ||
2476 | +{ | ||
2477 | + unsigned int control; | ||
2478 | + cp210x_get_config(p, CP210X_GET_MDMSTS, &control, 1); | ||
2479 | + if (control & CONTROL_DCD) | ||
2480 | + return 1; | ||
2481 | + return 0; | ||
2482 | +} | ||
2483 | + | ||
2484 | static void cp210x_break_ctl (struct tty_struct *tty, int break_state) | ||
2485 | { | ||
2486 | struct usb_serial_port *port = tty->driver_data; | ||
2487 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
2488 | index 048b563..8410201 100644 | ||
2489 | --- a/drivers/usb/serial/ftdi_sio.c | ||
2490 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
2491 | @@ -1939,7 +1939,7 @@ static void ftdi_write_bulk_callback(struct urb *urb) | ||
2492 | return; | ||
2493 | } | ||
2494 | /* account for transferred data */ | ||
2495 | - countback = urb->actual_length; | ||
2496 | + countback = urb->transfer_buffer_length; | ||
2497 | data_offset = priv->write_offset; | ||
2498 | if (data_offset > 0) { | ||
2499 | /* Subtract the control bytes */ | ||
2500 | @@ -1952,7 +1952,6 @@ static void ftdi_write_bulk_callback(struct urb *urb) | ||
2501 | |||
2502 | if (status) { | ||
2503 | dbg("nonzero write bulk status received: %d", status); | ||
2504 | - return; | ||
2505 | } | ||
2506 | |||
2507 | usb_serial_port_softint(port); | ||
2508 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
2509 | index 7c99185..dd50b78 100644 | ||
2510 | --- a/drivers/usb/serial/option.c | ||
2511 | +++ b/drivers/usb/serial/option.c | ||
2512 | @@ -309,6 +309,7 @@ static int option_resume(struct usb_serial *serial); | ||
2513 | |||
2514 | #define DLINK_VENDOR_ID 0x1186 | ||
2515 | #define DLINK_PRODUCT_DWM_652 0x3e04 | ||
2516 | +#define DLINK_PRODUCT_DWM_652_U5 0xce16 | ||
2517 | |||
2518 | #define QISDA_VENDOR_ID 0x1da5 | ||
2519 | #define QISDA_PRODUCT_H21_4512 0x4512 | ||
2520 | @@ -587,6 +588,7 @@ static struct usb_device_id option_ids[] = { | ||
2521 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
2522 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, | ||
2523 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, | ||
2524 | + { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ | ||
2525 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) }, | ||
2526 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) }, | ||
2527 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) }, | ||
2528 | diff --git a/fs/block_dev.c b/fs/block_dev.c | ||
2529 | index 94dfda2..9d544ea 100644 | ||
2530 | --- a/fs/block_dev.c | ||
2531 | +++ b/fs/block_dev.c | ||
2532 | @@ -1243,8 +1243,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) | ||
2533 | bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9); | ||
2534 | } | ||
2535 | } else { | ||
2536 | - put_disk(disk); | ||
2537 | module_put(disk->fops->owner); | ||
2538 | + put_disk(disk); | ||
2539 | disk = NULL; | ||
2540 | if (bdev->bd_contains == bdev) { | ||
2541 | if (bdev->bd_disk->fops->open) { | ||
2542 | diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h | ||
2543 | index da8fbf5..3949ae1 100644 | ||
2544 | --- a/fs/cifs/cifsproto.h | ||
2545 | +++ b/fs/cifs/cifsproto.h | ||
2546 | @@ -389,4 +389,5 @@ extern int CIFSSMBSetPosixACL(const int xid, struct cifsTconInfo *tcon, | ||
2547 | const struct nls_table *nls_codepage, int remap_special_chars); | ||
2548 | extern int CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, | ||
2549 | const int netfid, __u64 *pExtAttrBits, __u64 *pMask); | ||
2550 | +extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb); | ||
2551 | #endif /* _CIFSPROTO_H */ | ||
2552 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
2553 | index 1b056d4..5c084e5 100644 | ||
2554 | --- a/fs/cifs/connect.c | ||
2555 | +++ b/fs/cifs/connect.c | ||
2556 | @@ -2200,16 +2200,8 @@ is_path_accessible(int xid, struct cifsTconInfo *tcon, | ||
2557 | struct cifs_sb_info *cifs_sb, const char *full_path) | ||
2558 | { | ||
2559 | int rc; | ||
2560 | - __u64 inode_num; | ||
2561 | FILE_ALL_INFO *pfile_info; | ||
2562 | |||
2563 | - rc = CIFSGetSrvInodeNumber(xid, tcon, full_path, &inode_num, | ||
2564 | - cifs_sb->local_nls, | ||
2565 | - cifs_sb->mnt_cifs_flags & | ||
2566 | - CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
2567 | - if (rc != -EOPNOTSUPP) | ||
2568 | - return rc; | ||
2569 | - | ||
2570 | pfile_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); | ||
2571 | if (pfile_info == NULL) | ||
2572 | return -ENOMEM; | ||
2573 | diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c | ||
2574 | index 4326ffd..9652690 100644 | ||
2575 | --- a/fs/cifs/dir.c | ||
2576 | +++ b/fs/cifs/dir.c | ||
2577 | @@ -212,8 +212,6 @@ int cifs_posix_open(char *full_path, struct inode **pinode, | ||
2578 | posix_flags |= SMB_O_EXCL; | ||
2579 | if (oflags & O_TRUNC) | ||
2580 | posix_flags |= SMB_O_TRUNC; | ||
2581 | - if (oflags & O_APPEND) | ||
2582 | - posix_flags |= SMB_O_APPEND; | ||
2583 | if (oflags & O_SYNC) | ||
2584 | posix_flags |= SMB_O_SYNC; | ||
2585 | if (oflags & O_DIRECTORY) | ||
2586 | @@ -648,7 +646,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | ||
2587 | * O_EXCL: optimize away the lookup, but don't hash the dentry. Let | ||
2588 | * the VFS handle the create. | ||
2589 | */ | ||
2590 | - if (nd->flags & LOOKUP_EXCL) { | ||
2591 | + if (nd && (nd->flags & LOOKUP_EXCL)) { | ||
2592 | d_instantiate(direntry, NULL); | ||
2593 | return 0; | ||
2594 | } | ||
2595 | @@ -680,7 +678,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | ||
2596 | * reduction in network traffic in the other paths. | ||
2597 | */ | ||
2598 | if (pTcon->unix_ext) { | ||
2599 | - if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && | ||
2600 | + if (nd && !(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && | ||
2601 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && | ||
2602 | (nd->intent.open.flags & O_CREAT)) { | ||
2603 | rc = cifs_posix_open(full_path, &newInode, | ||
2604 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
2605 | index 82d8383..9a77a30 100644 | ||
2606 | --- a/fs/cifs/inode.c | ||
2607 | +++ b/fs/cifs/inode.c | ||
2608 | @@ -512,13 +512,10 @@ int cifs_get_inode_info(struct inode **pinode, | ||
2609 | cifs_sb->local_nls, | ||
2610 | cifs_sb->mnt_cifs_flags & | ||
2611 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
2612 | - if (rc1) { | ||
2613 | + if (rc1 || !fattr.cf_uniqueid) { | ||
2614 | cFYI(1, ("GetSrvInodeNum rc %d", rc1)); | ||
2615 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | ||
2616 | - /* disable serverino if call not supported */ | ||
2617 | - if (rc1 == -EINVAL) | ||
2618 | - cifs_sb->mnt_cifs_flags &= | ||
2619 | - ~CIFS_MOUNT_SERVER_INUM; | ||
2620 | + cifs_autodisable_serverino(cifs_sb); | ||
2621 | } | ||
2622 | } else { | ||
2623 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | ||
2624 | diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c | ||
2625 | index e079a91..b8dc3ed 100644 | ||
2626 | --- a/fs/cifs/misc.c | ||
2627 | +++ b/fs/cifs/misc.c | ||
2628 | @@ -705,3 +705,17 @@ cifsConvertToUCS(__le16 *target, const char *source, int maxlen, | ||
2629 | ctoUCS_out: | ||
2630 | return i; | ||
2631 | } | ||
2632 | + | ||
2633 | +void | ||
2634 | +cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) | ||
2635 | +{ | ||
2636 | + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { | ||
2637 | + cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; | ||
2638 | + cERROR(1, ("Autodisabling the use of server inode numbers on " | ||
2639 | + "%s. This server doesn't seem to support them " | ||
2640 | + "properly. Hardlinks will not be recognized on this " | ||
2641 | + "mount. Consider mounting with the \"noserverino\" " | ||
2642 | + "option to silence this message.", | ||
2643 | + cifs_sb->tcon->treeName)); | ||
2644 | + } | ||
2645 | +} | ||
2646 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c | ||
2647 | index f823a4a..01ce279 100644 | ||
2648 | --- a/fs/cifs/readdir.c | ||
2649 | +++ b/fs/cifs/readdir.c | ||
2650 | @@ -727,11 +727,12 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir, | ||
2651 | cifs_dir_info_to_fattr(&fattr, (FILE_DIRECTORY_INFO *) | ||
2652 | pfindEntry, cifs_sb); | ||
2653 | |||
2654 | - /* FIXME: make _to_fattr functions fill this out */ | ||
2655 | - if (pCifsF->srch_inf.info_level == SMB_FIND_FILE_ID_FULL_DIR_INFO) | ||
2656 | + if (inum && (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) { | ||
2657 | fattr.cf_uniqueid = inum; | ||
2658 | - else | ||
2659 | + } else { | ||
2660 | fattr.cf_uniqueid = iunique(sb, ROOT_I); | ||
2661 | + cifs_autodisable_serverino(cifs_sb); | ||
2662 | + } | ||
2663 | |||
2664 | ino = cifs_uniqueid_to_ino_t(fattr.cf_uniqueid); | ||
2665 | tmp_dentry = cifs_readdir_lookup(file->f_dentry, &qstring, &fattr); | ||
2666 | diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c | ||
2667 | index f91fd51..d84e705 100644 | ||
2668 | --- a/fs/compat_ioctl.c | ||
2669 | +++ b/fs/compat_ioctl.c | ||
2670 | @@ -1800,7 +1800,7 @@ struct space_resv_32 { | ||
2671 | /* just account for different alignment */ | ||
2672 | static int compat_ioctl_preallocate(struct file *file, unsigned long arg) | ||
2673 | { | ||
2674 | - struct space_resv_32 __user *p32 = (void __user *)arg; | ||
2675 | + struct space_resv_32 __user *p32 = compat_ptr(arg); | ||
2676 | struct space_resv __user *p = compat_alloc_user_space(sizeof(*p)); | ||
2677 | |||
2678 | if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) || | ||
2679 | @@ -2802,7 +2802,7 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, | ||
2680 | #else | ||
2681 | case FS_IOC_RESVSP: | ||
2682 | case FS_IOC_RESVSP64: | ||
2683 | - error = ioctl_preallocate(filp, (void __user *)arg); | ||
2684 | + error = ioctl_preallocate(filp, compat_ptr(arg)); | ||
2685 | goto out_fput; | ||
2686 | #endif | ||
2687 | |||
2688 | diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c | ||
2689 | index e703654..d0dcaef 100644 | ||
2690 | --- a/fs/fuse/dir.c | ||
2691 | +++ b/fs/fuse/dir.c | ||
2692 | @@ -385,6 +385,9 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, | ||
2693 | if (fc->no_create) | ||
2694 | return -ENOSYS; | ||
2695 | |||
2696 | + if (flags & O_DIRECT) | ||
2697 | + return -EINVAL; | ||
2698 | + | ||
2699 | forget_req = fuse_get_req(fc); | ||
2700 | if (IS_ERR(forget_req)) | ||
2701 | return PTR_ERR(forget_req); | ||
2702 | diff --git a/fs/jffs2/read.c b/fs/jffs2/read.c | ||
2703 | index cfe05c1..3f39be1 100644 | ||
2704 | --- a/fs/jffs2/read.c | ||
2705 | +++ b/fs/jffs2/read.c | ||
2706 | @@ -164,12 +164,15 @@ int jffs2_read_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f, | ||
2707 | |||
2708 | /* XXX FIXME: Where a single physical node actually shows up in two | ||
2709 | frags, we read it twice. Don't do that. */ | ||
2710 | - /* Now we're pointing at the first frag which overlaps our page */ | ||
2711 | + /* Now we're pointing at the first frag which overlaps our page | ||
2712 | + * (or perhaps is before it, if we've been asked to read off the | ||
2713 | + * end of the file). */ | ||
2714 | while(offset < end) { | ||
2715 | D2(printk(KERN_DEBUG "jffs2_read_inode_range: offset %d, end %d\n", offset, end)); | ||
2716 | - if (unlikely(!frag || frag->ofs > offset)) { | ||
2717 | + if (unlikely(!frag || frag->ofs > offset || | ||
2718 | + frag->ofs + frag->size <= offset)) { | ||
2719 | uint32_t holesize = end - offset; | ||
2720 | - if (frag) { | ||
2721 | + if (frag && frag->ofs > offset) { | ||
2722 | D1(printk(KERN_NOTICE "Eep. Hole in ino #%u fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", f->inocache->ino, frag->ofs, offset)); | ||
2723 | holesize = min(holesize, frag->ofs - offset); | ||
2724 | } | ||
2725 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
2726 | index 2aa2396..54baaef 100644 | ||
2727 | --- a/fs/nfs/nfs4proc.c | ||
2728 | +++ b/fs/nfs/nfs4proc.c | ||
2729 | @@ -2740,7 +2740,7 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, | ||
2730 | .pages = &page, | ||
2731 | .pgbase = 0, | ||
2732 | .count = count, | ||
2733 | - .bitmask = NFS_SERVER(dentry->d_inode)->cache_consistency_bitmask, | ||
2734 | + .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask, | ||
2735 | }; | ||
2736 | struct nfs4_readdir_res res; | ||
2737 | struct rpc_message msg = { | ||
2738 | diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c | ||
2739 | index 6ea5f87..f6b6016 100644 | ||
2740 | --- a/fs/nilfs2/ioctl.c | ||
2741 | +++ b/fs/nilfs2/ioctl.c | ||
2742 | @@ -297,7 +297,18 @@ static int nilfs_ioctl_move_inode_block(struct inode *inode, | ||
2743 | (unsigned long long)vdesc->vd_vblocknr); | ||
2744 | return ret; | ||
2745 | } | ||
2746 | - bh->b_private = vdesc; | ||
2747 | + if (unlikely(!list_empty(&bh->b_assoc_buffers))) { | ||
2748 | + printk(KERN_CRIT "%s: conflicting %s buffer: ino=%llu, " | ||
2749 | + "cno=%llu, offset=%llu, blocknr=%llu, vblocknr=%llu\n", | ||
2750 | + __func__, vdesc->vd_flags ? "node" : "data", | ||
2751 | + (unsigned long long)vdesc->vd_ino, | ||
2752 | + (unsigned long long)vdesc->vd_cno, | ||
2753 | + (unsigned long long)vdesc->vd_offset, | ||
2754 | + (unsigned long long)vdesc->vd_blocknr, | ||
2755 | + (unsigned long long)vdesc->vd_vblocknr); | ||
2756 | + brelse(bh); | ||
2757 | + return -EEXIST; | ||
2758 | + } | ||
2759 | list_add_tail(&bh->b_assoc_buffers, buffers); | ||
2760 | return 0; | ||
2761 | } | ||
2762 | @@ -335,24 +346,10 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs, | ||
2763 | list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { | ||
2764 | ret = nilfs_gccache_wait_and_mark_dirty(bh); | ||
2765 | if (unlikely(ret < 0)) { | ||
2766 | - if (ret == -EEXIST) { | ||
2767 | - vdesc = bh->b_private; | ||
2768 | - printk(KERN_CRIT | ||
2769 | - "%s: conflicting %s buffer: " | ||
2770 | - "ino=%llu, cno=%llu, offset=%llu, " | ||
2771 | - "blocknr=%llu, vblocknr=%llu\n", | ||
2772 | - __func__, | ||
2773 | - vdesc->vd_flags ? "node" : "data", | ||
2774 | - (unsigned long long)vdesc->vd_ino, | ||
2775 | - (unsigned long long)vdesc->vd_cno, | ||
2776 | - (unsigned long long)vdesc->vd_offset, | ||
2777 | - (unsigned long long)vdesc->vd_blocknr, | ||
2778 | - (unsigned long long)vdesc->vd_vblocknr); | ||
2779 | - } | ||
2780 | + WARN_ON(ret == -EEXIST); | ||
2781 | goto failed; | ||
2782 | } | ||
2783 | list_del_init(&bh->b_assoc_buffers); | ||
2784 | - bh->b_private = NULL; | ||
2785 | brelse(bh); | ||
2786 | } | ||
2787 | return nmembs; | ||
2788 | @@ -360,7 +357,6 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs, | ||
2789 | failed: | ||
2790 | list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) { | ||
2791 | list_del_init(&bh->b_assoc_buffers); | ||
2792 | - bh->b_private = NULL; | ||
2793 | brelse(bh); | ||
2794 | } | ||
2795 | return ret; | ||
2796 | diff --git a/fs/proc/base.c b/fs/proc/base.c | ||
2797 | index 6f742f6..baf53d9 100644 | ||
2798 | --- a/fs/proc/base.c | ||
2799 | +++ b/fs/proc/base.c | ||
2800 | @@ -2580,8 +2580,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid) | ||
2801 | name.len = snprintf(buf, sizeof(buf), "%d", pid); | ||
2802 | dentry = d_hash_and_lookup(mnt->mnt_root, &name); | ||
2803 | if (dentry) { | ||
2804 | - if (!(current->flags & PF_EXITING)) | ||
2805 | - shrink_dcache_parent(dentry); | ||
2806 | + shrink_dcache_parent(dentry); | ||
2807 | d_drop(dentry); | ||
2808 | dput(dentry); | ||
2809 | } | ||
2810 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
2811 | index f2c69a2..ff06fb2 100644 | ||
2812 | --- a/include/linux/skbuff.h | ||
2813 | +++ b/include/linux/skbuff.h | ||
2814 | @@ -1761,6 +1761,8 @@ extern int skb_copy_datagram_const_iovec(const struct sk_buff *from, | ||
2815 | int to_offset, | ||
2816 | int size); | ||
2817 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); | ||
2818 | +extern void skb_free_datagram_locked(struct sock *sk, | ||
2819 | + struct sk_buff *skb); | ||
2820 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, | ||
2821 | unsigned int flags); | ||
2822 | extern __wsum skb_checksum(const struct sk_buff *skb, int offset, | ||
2823 | diff --git a/include/net/mac80211.h b/include/net/mac80211.h | ||
2824 | index c061044..5edf792 100644 | ||
2825 | --- a/include/net/mac80211.h | ||
2826 | +++ b/include/net/mac80211.h | ||
2827 | @@ -1244,6 +1244,12 @@ enum ieee80211_filter_flags { | ||
2828 | * | ||
2829 | * These flags are used with the ampdu_action() callback in | ||
2830 | * &struct ieee80211_ops to indicate which action is needed. | ||
2831 | + * | ||
2832 | + * Note that drivers MUST be able to deal with a TX aggregation | ||
2833 | + * session being stopped even before they OK'ed starting it by | ||
2834 | + * calling ieee80211_start_tx_ba_cb(_irqsafe), because the peer | ||
2835 | + * might receive the addBA frame and send a delBA right away! | ||
2836 | + * | ||
2837 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation | ||
2838 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation | ||
2839 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation | ||
2840 | diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h | ||
2841 | index cbdd628..5cf7270 100644 | ||
2842 | --- a/include/net/netfilter/nf_conntrack.h | ||
2843 | +++ b/include/net/netfilter/nf_conntrack.h | ||
2844 | @@ -255,11 +255,9 @@ static inline bool nf_ct_kill(struct nf_conn *ct) | ||
2845 | } | ||
2846 | |||
2847 | /* These are for NAT. Icky. */ | ||
2848 | -/* Update TCP window tracking data when NAT mangles the packet */ | ||
2849 | -extern void nf_conntrack_tcp_update(const struct sk_buff *skb, | ||
2850 | - unsigned int dataoff, | ||
2851 | - struct nf_conn *ct, int dir, | ||
2852 | - s16 offset); | ||
2853 | +extern s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, | ||
2854 | + enum ip_conntrack_dir dir, | ||
2855 | + u32 seq); | ||
2856 | |||
2857 | /* Fake conntrack entry for untracked connections */ | ||
2858 | extern struct nf_conn nf_conntrack_untracked; | ||
2859 | diff --git a/include/net/netfilter/nf_nat_helper.h b/include/net/netfilter/nf_nat_helper.h | ||
2860 | index 237a961..4222220 100644 | ||
2861 | --- a/include/net/netfilter/nf_nat_helper.h | ||
2862 | +++ b/include/net/netfilter/nf_nat_helper.h | ||
2863 | @@ -32,4 +32,8 @@ extern int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb, | ||
2864 | * to port ct->master->saved_proto. */ | ||
2865 | extern void nf_nat_follow_master(struct nf_conn *ct, | ||
2866 | struct nf_conntrack_expect *this); | ||
2867 | + | ||
2868 | +extern s16 nf_nat_get_offset(const struct nf_conn *ct, | ||
2869 | + enum ip_conntrack_dir dir, | ||
2870 | + u32 seq); | ||
2871 | #endif | ||
2872 | diff --git a/init/main.c b/init/main.c | ||
2873 | index 11f4f14..1ec6347 100644 | ||
2874 | --- a/init/main.c | ||
2875 | +++ b/init/main.c | ||
2876 | @@ -250,7 +250,7 @@ early_param("loglevel", loglevel); | ||
2877 | |||
2878 | /* | ||
2879 | * Unknown boot options get handed to init, unless they look like | ||
2880 | - * failed parameters | ||
2881 | + * unused parameters (modprobe will find them in /proc/cmdline). | ||
2882 | */ | ||
2883 | static int __init unknown_bootoption(char *param, char *val) | ||
2884 | { | ||
2885 | @@ -271,14 +271,9 @@ static int __init unknown_bootoption(char *param, char *val) | ||
2886 | if (obsolete_checksetup(param)) | ||
2887 | return 0; | ||
2888 | |||
2889 | - /* | ||
2890 | - * Preemptive maintenance for "why didn't my misspelled command | ||
2891 | - * line work?" | ||
2892 | - */ | ||
2893 | - if (strchr(param, '.') && (!val || strchr(param, '.') < val)) { | ||
2894 | - printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param); | ||
2895 | + /* Unused module parameter. */ | ||
2896 | + if (strchr(param, '.') && (!val || strchr(param, '.') < val)) | ||
2897 | return 0; | ||
2898 | - } | ||
2899 | |||
2900 | if (panic_later) | ||
2901 | return 0; | ||
2902 | diff --git a/kernel/module.c b/kernel/module.c | ||
2903 | index 2d53718..cda4d76 100644 | ||
2904 | --- a/kernel/module.c | ||
2905 | +++ b/kernel/module.c | ||
2906 | @@ -1179,7 +1179,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, | ||
2907 | |||
2908 | /* Count loaded sections and allocate structures */ | ||
2909 | for (i = 0; i < nsect; i++) | ||
2910 | - if (sechdrs[i].sh_flags & SHF_ALLOC) | ||
2911 | + if (sechdrs[i].sh_flags & SHF_ALLOC | ||
2912 | + && sechdrs[i].sh_size) | ||
2913 | nloaded++; | ||
2914 | size[0] = ALIGN(sizeof(*sect_attrs) | ||
2915 | + nloaded * sizeof(sect_attrs->attrs[0]), | ||
2916 | @@ -1199,6 +1200,8 @@ static void add_sect_attrs(struct module *mod, unsigned int nsect, | ||
2917 | for (i = 0; i < nsect; i++) { | ||
2918 | if (! (sechdrs[i].sh_flags & SHF_ALLOC)) | ||
2919 | continue; | ||
2920 | + if (!sechdrs[i].sh_size) | ||
2921 | + continue; | ||
2922 | sattr->address = sechdrs[i].sh_addr; | ||
2923 | sattr->name = kstrdup(secstrings + sechdrs[i].sh_name, | ||
2924 | GFP_KERNEL); | ||
2925 | diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c | ||
2926 | index b1dc468..237fd07 100644 | ||
2927 | --- a/kernel/perf_counter.c | ||
2928 | +++ b/kernel/perf_counter.c | ||
2929 | @@ -1363,7 +1363,7 @@ static void perf_ctx_adjust_freq(struct perf_counter_context *ctx) | ||
2930 | u64 interrupts, freq; | ||
2931 | |||
2932 | spin_lock(&ctx->lock); | ||
2933 | - list_for_each_entry(counter, &ctx->counter_list, list_entry) { | ||
2934 | + list_for_each_entry_rcu(counter, &ctx->counter_list, event_entry) { | ||
2935 | if (counter->state != PERF_COUNTER_STATE_ACTIVE) | ||
2936 | continue; | ||
2937 | |||
2938 | diff --git a/kernel/sched.c b/kernel/sched.c | ||
2939 | index 1b59e26..81ede13 100644 | ||
2940 | --- a/kernel/sched.c | ||
2941 | +++ b/kernel/sched.c | ||
2942 | @@ -7945,6 +7945,7 @@ static cpumask_var_t cpu_isolated_map; | ||
2943 | /* Setup the mask of cpus configured for isolated domains */ | ||
2944 | static int __init isolated_cpu_setup(char *str) | ||
2945 | { | ||
2946 | + alloc_bootmem_cpumask_var(&cpu_isolated_map); | ||
2947 | cpulist_parse(str, cpu_isolated_map); | ||
2948 | return 1; | ||
2949 | } | ||
2950 | @@ -9383,13 +9384,15 @@ void __init sched_init(void) | ||
2951 | current->sched_class = &fair_sched_class; | ||
2952 | |||
2953 | /* Allocate the nohz_cpu_mask if CONFIG_CPUMASK_OFFSTACK */ | ||
2954 | - alloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT); | ||
2955 | + zalloc_cpumask_var(&nohz_cpu_mask, GFP_NOWAIT); | ||
2956 | #ifdef CONFIG_SMP | ||
2957 | #ifdef CONFIG_NO_HZ | ||
2958 | - alloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT); | ||
2959 | + zalloc_cpumask_var(&nohz.cpu_mask, GFP_NOWAIT); | ||
2960 | alloc_cpumask_var(&nohz.ilb_grp_nohz_mask, GFP_NOWAIT); | ||
2961 | #endif | ||
2962 | - alloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT); | ||
2963 | + /* May be allocated at isolcpus cmdline parse time */ | ||
2964 | + if (cpu_isolated_map == NULL) | ||
2965 | + zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT); | ||
2966 | #endif /* SMP */ | ||
2967 | |||
2968 | perf_counter_init(); | ||
2969 | diff --git a/kernel/user.c b/kernel/user.c | ||
2970 | index 2c000e7..46d0165 100644 | ||
2971 | --- a/kernel/user.c | ||
2972 | +++ b/kernel/user.c | ||
2973 | @@ -330,9 +330,9 @@ done: | ||
2974 | */ | ||
2975 | static void free_user(struct user_struct *up, unsigned long flags) | ||
2976 | { | ||
2977 | - spin_unlock_irqrestore(&uidhash_lock, flags); | ||
2978 | INIT_DELAYED_WORK(&up->work, cleanup_user_struct); | ||
2979 | schedule_delayed_work(&up->work, msecs_to_jiffies(1000)); | ||
2980 | + spin_unlock_irqrestore(&uidhash_lock, flags); | ||
2981 | } | ||
2982 | |||
2983 | #else /* CONFIG_USER_SCHED && CONFIG_SYSFS */ | ||
2984 | diff --git a/mm/highmem.c b/mm/highmem.c | ||
2985 | index 25878cc..9c1e627 100644 | ||
2986 | --- a/mm/highmem.c | ||
2987 | +++ b/mm/highmem.c | ||
2988 | @@ -426,16 +426,21 @@ void __init page_address_init(void) | ||
2989 | |||
2990 | void debug_kmap_atomic(enum km_type type) | ||
2991 | { | ||
2992 | - static unsigned warn_count = 10; | ||
2993 | + static int warn_count = 10; | ||
2994 | |||
2995 | - if (unlikely(warn_count == 0)) | ||
2996 | + if (unlikely(warn_count < 0)) | ||
2997 | return; | ||
2998 | |||
2999 | if (unlikely(in_interrupt())) { | ||
3000 | - if (in_irq()) { | ||
3001 | + if (in_nmi()) { | ||
3002 | + if (type != KM_NMI && type != KM_NMI_PTE) { | ||
3003 | + WARN_ON(1); | ||
3004 | + warn_count--; | ||
3005 | + } | ||
3006 | + } else if (in_irq()) { | ||
3007 | if (type != KM_IRQ0 && type != KM_IRQ1 && | ||
3008 | type != KM_BIO_SRC_IRQ && type != KM_BIO_DST_IRQ && | ||
3009 | - type != KM_BOUNCE_READ) { | ||
3010 | + type != KM_BOUNCE_READ && type != KM_IRQ_PTE) { | ||
3011 | WARN_ON(1); | ||
3012 | warn_count--; | ||
3013 | } | ||
3014 | @@ -452,7 +457,9 @@ void debug_kmap_atomic(enum km_type type) | ||
3015 | } | ||
3016 | |||
3017 | if (type == KM_IRQ0 || type == KM_IRQ1 || type == KM_BOUNCE_READ || | ||
3018 | - type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ) { | ||
3019 | + type == KM_BIO_SRC_IRQ || type == KM_BIO_DST_IRQ || | ||
3020 | + type == KM_IRQ_PTE || type == KM_NMI || | ||
3021 | + type == KM_NMI_PTE ) { | ||
3022 | if (!irqs_disabled()) { | ||
3023 | WARN_ON(1); | ||
3024 | warn_count--; | ||
3025 | diff --git a/mm/migrate.c b/mm/migrate.c | ||
3026 | index 939888f..598abad 100644 | ||
3027 | --- a/mm/migrate.c | ||
3028 | +++ b/mm/migrate.c | ||
3029 | @@ -597,7 +597,7 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private, | ||
3030 | struct page *newpage = get_new_page(page, private, &result); | ||
3031 | int rcu_locked = 0; | ||
3032 | int charge = 0; | ||
3033 | - struct mem_cgroup *mem; | ||
3034 | + struct mem_cgroup *mem = NULL; | ||
3035 | |||
3036 | if (!newpage) | ||
3037 | return -ENOMEM; | ||
3038 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
3039 | index 0b3c6cb..957b551 100644 | ||
3040 | --- a/mm/page_alloc.c | ||
3041 | +++ b/mm/page_alloc.c | ||
3042 | @@ -1715,7 +1715,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask) | ||
3043 | * See also cpuset_zone_allowed() comment in kernel/cpuset.c. | ||
3044 | */ | ||
3045 | alloc_flags &= ~ALLOC_CPUSET; | ||
3046 | - } else if (unlikely(rt_task(p))) | ||
3047 | + } else if (unlikely(rt_task(p)) && !in_interrupt()) | ||
3048 | alloc_flags |= ALLOC_HARDER; | ||
3049 | |||
3050 | if (likely(!(gfp_mask & __GFP_NOMEMALLOC))) { | ||
3051 | @@ -1763,6 +1763,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | ||
3052 | if (NUMA_BUILD && (gfp_mask & GFP_THISNODE) == GFP_THISNODE) | ||
3053 | goto nopage; | ||
3054 | |||
3055 | +restart: | ||
3056 | wake_all_kswapd(order, zonelist, high_zoneidx); | ||
3057 | |||
3058 | /* | ||
3059 | @@ -1772,7 +1773,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | ||
3060 | */ | ||
3061 | alloc_flags = gfp_to_alloc_flags(gfp_mask); | ||
3062 | |||
3063 | -restart: | ||
3064 | /* This is the last chance, in general, before the goto nopage. */ | ||
3065 | page = get_page_from_freelist(gfp_mask, nodemask, order, zonelist, | ||
3066 | high_zoneidx, alloc_flags & ~ALLOC_NO_WATERMARKS, | ||
3067 | diff --git a/net/core/datagram.c b/net/core/datagram.c | ||
3068 | index b0fe692..caeb285 100644 | ||
3069 | --- a/net/core/datagram.c | ||
3070 | +++ b/net/core/datagram.c | ||
3071 | @@ -223,6 +223,15 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb) | ||
3072 | consume_skb(skb); | ||
3073 | sk_mem_reclaim_partial(sk); | ||
3074 | } | ||
3075 | +EXPORT_SYMBOL(skb_free_datagram); | ||
3076 | + | ||
3077 | +void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb) | ||
3078 | +{ | ||
3079 | + lock_sock(sk); | ||
3080 | + skb_free_datagram(sk, skb); | ||
3081 | + release_sock(sk); | ||
3082 | +} | ||
3083 | +EXPORT_SYMBOL(skb_free_datagram_locked); | ||
3084 | |||
3085 | /** | ||
3086 | * skb_kill_datagram - Free a datagram skbuff forcibly | ||
3087 | @@ -749,5 +758,4 @@ unsigned int datagram_poll(struct file *file, struct socket *sock, | ||
3088 | EXPORT_SYMBOL(datagram_poll); | ||
3089 | EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); | ||
3090 | EXPORT_SYMBOL(skb_copy_datagram_iovec); | ||
3091 | -EXPORT_SYMBOL(skb_free_datagram); | ||
3092 | EXPORT_SYMBOL(skb_recv_datagram); | ||
3093 | diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c | ||
3094 | index 575f9bd..d3fe10b 100644 | ||
3095 | --- a/net/ipv4/ip_fragment.c | ||
3096 | +++ b/net/ipv4/ip_fragment.c | ||
3097 | @@ -563,7 +563,7 @@ out_oversize: | ||
3098 | printk(KERN_INFO "Oversized IP packet from %pI4.\n", | ||
3099 | &qp->saddr); | ||
3100 | out_fail: | ||
3101 | - IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_REASMFAILS); | ||
3102 | + IP_INC_STATS_BH(net, IPSTATS_MIB_REASMFAILS); | ||
3103 | return err; | ||
3104 | } | ||
3105 | |||
3106 | diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c | ||
3107 | index b6ddd56..d396abf 100644 | ||
3108 | --- a/net/ipv4/netfilter/nf_nat_core.c | ||
3109 | +++ b/net/ipv4/netfilter/nf_nat_core.c | ||
3110 | @@ -750,6 +750,8 @@ static int __init nf_nat_init(void) | ||
3111 | BUG_ON(nfnetlink_parse_nat_setup_hook != NULL); | ||
3112 | rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, | ||
3113 | nfnetlink_parse_nat_setup); | ||
3114 | + BUG_ON(nf_ct_nat_offset != NULL); | ||
3115 | + rcu_assign_pointer(nf_ct_nat_offset, nf_nat_get_offset); | ||
3116 | return 0; | ||
3117 | |||
3118 | cleanup_extend: | ||
3119 | @@ -764,6 +766,7 @@ static void __exit nf_nat_cleanup(void) | ||
3120 | nf_ct_extend_unregister(&nat_extend); | ||
3121 | rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL); | ||
3122 | rcu_assign_pointer(nfnetlink_parse_nat_setup_hook, NULL); | ||
3123 | + rcu_assign_pointer(nf_ct_nat_offset, NULL); | ||
3124 | synchronize_net(); | ||
3125 | } | ||
3126 | |||
3127 | diff --git a/net/ipv4/netfilter/nf_nat_helper.c b/net/ipv4/netfilter/nf_nat_helper.c | ||
3128 | index 09172a6..f9520fa 100644 | ||
3129 | --- a/net/ipv4/netfilter/nf_nat_helper.c | ||
3130 | +++ b/net/ipv4/netfilter/nf_nat_helper.c | ||
3131 | @@ -73,6 +73,28 @@ adjust_tcp_sequence(u32 seq, | ||
3132 | DUMP_OFFSET(this_way); | ||
3133 | } | ||
3134 | |||
3135 | +/* Get the offset value, for conntrack */ | ||
3136 | +s16 nf_nat_get_offset(const struct nf_conn *ct, | ||
3137 | + enum ip_conntrack_dir dir, | ||
3138 | + u32 seq) | ||
3139 | +{ | ||
3140 | + struct nf_conn_nat *nat = nfct_nat(ct); | ||
3141 | + struct nf_nat_seq *this_way; | ||
3142 | + s16 offset; | ||
3143 | + | ||
3144 | + if (!nat) | ||
3145 | + return 0; | ||
3146 | + | ||
3147 | + this_way = &nat->seq[dir]; | ||
3148 | + spin_lock_bh(&nf_nat_seqofs_lock); | ||
3149 | + offset = after(seq, this_way->correction_pos) | ||
3150 | + ? this_way->offset_after : this_way->offset_before; | ||
3151 | + spin_unlock_bh(&nf_nat_seqofs_lock); | ||
3152 | + | ||
3153 | + return offset; | ||
3154 | +} | ||
3155 | +EXPORT_SYMBOL_GPL(nf_nat_get_offset); | ||
3156 | + | ||
3157 | /* Frobs data inside this packet, which is linear. */ | ||
3158 | static void mangle_contents(struct sk_buff *skb, | ||
3159 | unsigned int dataoff, | ||
3160 | @@ -189,11 +211,6 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb, | ||
3161 | adjust_tcp_sequence(ntohl(tcph->seq), | ||
3162 | (int)rep_len - (int)match_len, | ||
3163 | ct, ctinfo); | ||
3164 | - /* Tell TCP window tracking about seq change */ | ||
3165 | - nf_conntrack_tcp_update(skb, ip_hdrlen(skb), | ||
3166 | - ct, CTINFO2DIR(ctinfo), | ||
3167 | - (int)rep_len - (int)match_len); | ||
3168 | - | ||
3169 | nf_conntrack_event_cache(IPCT_NATSEQADJ, ct); | ||
3170 | } | ||
3171 | return 1; | ||
3172 | @@ -415,12 +432,7 @@ nf_nat_seq_adjust(struct sk_buff *skb, | ||
3173 | tcph->seq = newseq; | ||
3174 | tcph->ack_seq = newack; | ||
3175 | |||
3176 | - if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo)) | ||
3177 | - return 0; | ||
3178 | - | ||
3179 | - nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff); | ||
3180 | - | ||
3181 | - return 1; | ||
3182 | + return nf_nat_sack_adjust(skb, tcph, ct, ctinfo); | ||
3183 | } | ||
3184 | |||
3185 | /* Setup NAT on this expected conntrack so it follows master. */ | ||
3186 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c | ||
3187 | index 80e3812..00d1f6d 100644 | ||
3188 | --- a/net/ipv4/udp.c | ||
3189 | +++ b/net/ipv4/udp.c | ||
3190 | @@ -831,6 +831,42 @@ out: | ||
3191 | return ret; | ||
3192 | } | ||
3193 | |||
3194 | + | ||
3195 | +/** | ||
3196 | + * first_packet_length - return length of first packet in receive queue | ||
3197 | + * @sk: socket | ||
3198 | + * | ||
3199 | + * Drops all bad checksum frames, until a valid one is found. | ||
3200 | + * Returns the length of found skb, or 0 if none is found. | ||
3201 | + */ | ||
3202 | +static unsigned int first_packet_length(struct sock *sk) | ||
3203 | +{ | ||
3204 | + struct sk_buff_head list_kill, *rcvq = &sk->sk_receive_queue; | ||
3205 | + struct sk_buff *skb; | ||
3206 | + unsigned int res; | ||
3207 | + | ||
3208 | + __skb_queue_head_init(&list_kill); | ||
3209 | + | ||
3210 | + spin_lock_bh(&rcvq->lock); | ||
3211 | + while ((skb = skb_peek(rcvq)) != NULL && | ||
3212 | + udp_lib_checksum_complete(skb)) { | ||
3213 | + UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, | ||
3214 | + IS_UDPLITE(sk)); | ||
3215 | + __skb_unlink(skb, rcvq); | ||
3216 | + __skb_queue_tail(&list_kill, skb); | ||
3217 | + } | ||
3218 | + res = skb ? skb->len : 0; | ||
3219 | + spin_unlock_bh(&rcvq->lock); | ||
3220 | + | ||
3221 | + if (!skb_queue_empty(&list_kill)) { | ||
3222 | + lock_sock(sk); | ||
3223 | + __skb_queue_purge(&list_kill); | ||
3224 | + sk_mem_reclaim_partial(sk); | ||
3225 | + release_sock(sk); | ||
3226 | + } | ||
3227 | + return res; | ||
3228 | +} | ||
3229 | + | ||
3230 | /* | ||
3231 | * IOCTL requests applicable to the UDP protocol | ||
3232 | */ | ||
3233 | @@ -847,21 +883,16 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg) | ||
3234 | |||
3235 | case SIOCINQ: | ||
3236 | { | ||
3237 | - struct sk_buff *skb; | ||
3238 | - unsigned long amount; | ||
3239 | + unsigned int amount = first_packet_length(sk); | ||
3240 | |||
3241 | - amount = 0; | ||
3242 | - spin_lock_bh(&sk->sk_receive_queue.lock); | ||
3243 | - skb = skb_peek(&sk->sk_receive_queue); | ||
3244 | - if (skb != NULL) { | ||
3245 | + if (amount) | ||
3246 | /* | ||
3247 | * We will only return the amount | ||
3248 | * of this packet since that is all | ||
3249 | * that will be read. | ||
3250 | */ | ||
3251 | - amount = skb->len - sizeof(struct udphdr); | ||
3252 | - } | ||
3253 | - spin_unlock_bh(&sk->sk_receive_queue.lock); | ||
3254 | + amount -= sizeof(struct udphdr); | ||
3255 | + | ||
3256 | return put_user(amount, (int __user *)arg); | ||
3257 | } | ||
3258 | |||
3259 | @@ -956,9 +987,7 @@ try_again: | ||
3260 | err = ulen; | ||
3261 | |||
3262 | out_free: | ||
3263 | - lock_sock(sk); | ||
3264 | - skb_free_datagram(sk, skb); | ||
3265 | - release_sock(sk); | ||
3266 | + skb_free_datagram_locked(sk, skb); | ||
3267 | out: | ||
3268 | return err; | ||
3269 | |||
3270 | @@ -1525,32 +1554,13 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) | ||
3271 | { | ||
3272 | unsigned int mask = datagram_poll(file, sock, wait); | ||
3273 | struct sock *sk = sock->sk; | ||
3274 | - int is_lite = IS_UDPLITE(sk); | ||
3275 | |||
3276 | /* Check for false positives due to checksum errors */ | ||
3277 | - if ( (mask & POLLRDNORM) && | ||
3278 | - !(file->f_flags & O_NONBLOCK) && | ||
3279 | - !(sk->sk_shutdown & RCV_SHUTDOWN)){ | ||
3280 | - struct sk_buff_head *rcvq = &sk->sk_receive_queue; | ||
3281 | - struct sk_buff *skb; | ||
3282 | - | ||
3283 | - spin_lock_bh(&rcvq->lock); | ||
3284 | - while ((skb = skb_peek(rcvq)) != NULL && | ||
3285 | - udp_lib_checksum_complete(skb)) { | ||
3286 | - UDP_INC_STATS_BH(sock_net(sk), | ||
3287 | - UDP_MIB_INERRORS, is_lite); | ||
3288 | - __skb_unlink(skb, rcvq); | ||
3289 | - kfree_skb(skb); | ||
3290 | - } | ||
3291 | - spin_unlock_bh(&rcvq->lock); | ||
3292 | - | ||
3293 | - /* nothing to see, move along */ | ||
3294 | - if (skb == NULL) | ||
3295 | - mask &= ~(POLLIN | POLLRDNORM); | ||
3296 | - } | ||
3297 | + if ((mask & POLLRDNORM) && !(file->f_flags & O_NONBLOCK) && | ||
3298 | + !(sk->sk_shutdown & RCV_SHUTDOWN) && !first_packet_length(sk)) | ||
3299 | + mask &= ~(POLLIN | POLLRDNORM); | ||
3300 | |||
3301 | return mask; | ||
3302 | - | ||
3303 | } | ||
3304 | |||
3305 | struct proto udp_prot = { | ||
3306 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c | ||
3307 | index 33b59bd..333a6ec 100644 | ||
3308 | --- a/net/ipv6/udp.c | ||
3309 | +++ b/net/ipv6/udp.c | ||
3310 | @@ -288,9 +288,7 @@ try_again: | ||
3311 | err = ulen; | ||
3312 | |||
3313 | out_free: | ||
3314 | - lock_sock(sk); | ||
3315 | - skb_free_datagram(sk, skb); | ||
3316 | - release_sock(sk); | ||
3317 | + skb_free_datagram_locked(sk, skb); | ||
3318 | out: | ||
3319 | return err; | ||
3320 | |||
3321 | diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c | ||
3322 | index bc064d7..ce8e0e7 100644 | ||
3323 | --- a/net/mac80211/agg-rx.c | ||
3324 | +++ b/net/mac80211/agg-rx.c | ||
3325 | @@ -85,10 +85,6 @@ void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *r | ||
3326 | struct ieee80211_local *local = sdata->local; | ||
3327 | struct sta_info *sta; | ||
3328 | |||
3329 | - /* stop HW Rx aggregation. ampdu_action existence | ||
3330 | - * already verified in session init so we add the BUG_ON */ | ||
3331 | - BUG_ON(!local->ops->ampdu_action); | ||
3332 | - | ||
3333 | rcu_read_lock(); | ||
3334 | |||
3335 | sta = sta_info_get(local, ra); | ||
3336 | diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c | ||
3337 | index a24e598..b9005e1 100644 | ||
3338 | --- a/net/mac80211/agg-tx.c | ||
3339 | +++ b/net/mac80211/agg-tx.c | ||
3340 | @@ -123,13 +123,18 @@ void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u1 | ||
3341 | ieee80211_tx_skb(sdata, skb, 0); | ||
3342 | } | ||
3343 | |||
3344 | -static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
3345 | - enum ieee80211_back_parties initiator) | ||
3346 | +int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
3347 | + enum ieee80211_back_parties initiator) | ||
3348 | { | ||
3349 | struct ieee80211_local *local = sta->local; | ||
3350 | int ret; | ||
3351 | u8 *state; | ||
3352 | |||
3353 | +#ifdef CONFIG_MAC80211_HT_DEBUG | ||
3354 | + printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", | ||
3355 | + sta->sta.addr, tid); | ||
3356 | +#endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
3357 | + | ||
3358 | state = &sta->ampdu_mlme.tid_state_tx[tid]; | ||
3359 | |||
3360 | if (*state == HT_AGG_STATE_OPERATIONAL) | ||
3361 | @@ -143,7 +148,6 @@ static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
3362 | |||
3363 | /* HW shall not deny going back to legacy */ | ||
3364 | if (WARN_ON(ret)) { | ||
3365 | - *state = HT_AGG_STATE_OPERATIONAL; | ||
3366 | /* | ||
3367 | * We may have pending packets get stuck in this case... | ||
3368 | * Not bothering with a workaround for now. | ||
3369 | @@ -526,11 +530,6 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
3370 | goto unlock; | ||
3371 | } | ||
3372 | |||
3373 | -#ifdef CONFIG_MAC80211_HT_DEBUG | ||
3374 | - printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", | ||
3375 | - sta->sta.addr, tid); | ||
3376 | -#endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
3377 | - | ||
3378 | ret = ___ieee80211_stop_tx_ba_session(sta, tid, initiator); | ||
3379 | |||
3380 | unlock: | ||
3381 | @@ -546,7 +545,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | ||
3382 | struct sta_info *sta; | ||
3383 | int ret = 0; | ||
3384 | |||
3385 | - if (WARN_ON(!local->ops->ampdu_action)) | ||
3386 | + if (!local->ops->ampdu_action) | ||
3387 | return -EINVAL; | ||
3388 | |||
3389 | if (tid >= STA_TID_NUM) | ||
3390 | diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c | ||
3391 | index 0891bfb..a6b8eb4 100644 | ||
3392 | --- a/net/mac80211/ht.c | ||
3393 | +++ b/net/mac80211/ht.c | ||
3394 | @@ -141,7 +141,6 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | ||
3395 | struct sta_info *sta, | ||
3396 | struct ieee80211_mgmt *mgmt, size_t len) | ||
3397 | { | ||
3398 | - struct ieee80211_local *local = sdata->local; | ||
3399 | u16 tid, params; | ||
3400 | u16 initiator; | ||
3401 | |||
3402 | @@ -161,10 +160,9 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | ||
3403 | WLAN_BACK_INITIATOR, 0); | ||
3404 | else { /* WLAN_BACK_RECIPIENT */ | ||
3405 | spin_lock_bh(&sta->lock); | ||
3406 | - sta->ampdu_mlme.tid_state_tx[tid] = | ||
3407 | - HT_AGG_STATE_OPERATIONAL; | ||
3408 | + if (sta->ampdu_mlme.tid_state_tx[tid] & HT_ADDBA_REQUESTED_MSK) | ||
3409 | + ___ieee80211_stop_tx_ba_session(sta, tid, | ||
3410 | + WLAN_BACK_RECIPIENT); | ||
3411 | spin_unlock_bh(&sta->lock); | ||
3412 | - ieee80211_stop_tx_ba_session(&local->hw, sta->sta.addr, tid, | ||
3413 | - WLAN_BACK_RECIPIENT); | ||
3414 | } | ||
3415 | } | ||
3416 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
3417 | index 68eb505..33a7e75 100644 | ||
3418 | --- a/net/mac80211/ieee80211_i.h | ||
3419 | +++ b/net/mac80211/ieee80211_i.h | ||
3420 | @@ -1057,6 +1057,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | ||
3421 | |||
3422 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
3423 | enum ieee80211_back_parties initiator); | ||
3424 | +int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
3425 | + enum ieee80211_back_parties initiator); | ||
3426 | |||
3427 | /* Spectrum management */ | ||
3428 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, | ||
3429 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c | ||
3430 | index b8614c6..4299db7 100644 | ||
3431 | --- a/net/netfilter/nf_conntrack_core.c | ||
3432 | +++ b/net/netfilter/nf_conntrack_core.c | ||
3433 | @@ -1350,6 +1350,11 @@ err_stat: | ||
3434 | return ret; | ||
3435 | } | ||
3436 | |||
3437 | +s16 (*nf_ct_nat_offset)(const struct nf_conn *ct, | ||
3438 | + enum ip_conntrack_dir dir, | ||
3439 | + u32 seq); | ||
3440 | +EXPORT_SYMBOL_GPL(nf_ct_nat_offset); | ||
3441 | + | ||
3442 | int nf_conntrack_init(struct net *net) | ||
3443 | { | ||
3444 | int ret; | ||
3445 | @@ -1367,6 +1372,9 @@ int nf_conntrack_init(struct net *net) | ||
3446 | /* For use by REJECT target */ | ||
3447 | rcu_assign_pointer(ip_ct_attach, nf_conntrack_attach); | ||
3448 | rcu_assign_pointer(nf_ct_destroy, destroy_conntrack); | ||
3449 | + | ||
3450 | + /* Howto get NAT offsets */ | ||
3451 | + rcu_assign_pointer(nf_ct_nat_offset, NULL); | ||
3452 | } | ||
3453 | return 0; | ||
3454 | |||
3455 | diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c | ||
3456 | index 97a82ba..ba2b769 100644 | ||
3457 | --- a/net/netfilter/nf_conntrack_proto_tcp.c | ||
3458 | +++ b/net/netfilter/nf_conntrack_proto_tcp.c | ||
3459 | @@ -492,6 +492,21 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff, | ||
3460 | } | ||
3461 | } | ||
3462 | |||
3463 | +#ifdef CONFIG_NF_NAT_NEEDED | ||
3464 | +static inline s16 nat_offset(const struct nf_conn *ct, | ||
3465 | + enum ip_conntrack_dir dir, | ||
3466 | + u32 seq) | ||
3467 | +{ | ||
3468 | + typeof(nf_ct_nat_offset) get_offset = rcu_dereference(nf_ct_nat_offset); | ||
3469 | + | ||
3470 | + return get_offset != NULL ? get_offset(ct, dir, seq) : 0; | ||
3471 | +} | ||
3472 | +#define NAT_OFFSET(pf, ct, dir, seq) \ | ||
3473 | + (pf == NFPROTO_IPV4 ? nat_offset(ct, dir, seq) : 0) | ||
3474 | +#else | ||
3475 | +#define NAT_OFFSET(pf, ct, dir, seq) 0 | ||
3476 | +#endif | ||
3477 | + | ||
3478 | static bool tcp_in_window(const struct nf_conn *ct, | ||
3479 | struct ip_ct_tcp *state, | ||
3480 | enum ip_conntrack_dir dir, | ||
3481 | @@ -506,6 +521,7 @@ static bool tcp_in_window(const struct nf_conn *ct, | ||
3482 | struct ip_ct_tcp_state *receiver = &state->seen[!dir]; | ||
3483 | const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple; | ||
3484 | __u32 seq, ack, sack, end, win, swin; | ||
3485 | + s16 receiver_offset; | ||
3486 | bool res; | ||
3487 | |||
3488 | /* | ||
3489 | @@ -519,11 +535,16 @@ static bool tcp_in_window(const struct nf_conn *ct, | ||
3490 | if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM) | ||
3491 | tcp_sack(skb, dataoff, tcph, &sack); | ||
3492 | |||
3493 | + /* Take into account NAT sequence number mangling */ | ||
3494 | + receiver_offset = NAT_OFFSET(pf, ct, !dir, ack - 1); | ||
3495 | + ack -= receiver_offset; | ||
3496 | + sack -= receiver_offset; | ||
3497 | + | ||
3498 | pr_debug("tcp_in_window: START\n"); | ||
3499 | pr_debug("tcp_in_window: "); | ||
3500 | nf_ct_dump_tuple(tuple); | ||
3501 | - pr_debug("seq=%u ack=%u sack=%u win=%u end=%u\n", | ||
3502 | - seq, ack, sack, win, end); | ||
3503 | + pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", | ||
3504 | + seq, ack, receiver_offset, sack, receiver_offset, win, end); | ||
3505 | pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " | ||
3506 | "receiver end=%u maxend=%u maxwin=%u scale=%i\n", | ||
3507 | sender->td_end, sender->td_maxend, sender->td_maxwin, | ||
3508 | @@ -613,8 +634,8 @@ static bool tcp_in_window(const struct nf_conn *ct, | ||
3509 | |||
3510 | pr_debug("tcp_in_window: "); | ||
3511 | nf_ct_dump_tuple(tuple); | ||
3512 | - pr_debug("seq=%u ack=%u sack =%u win=%u end=%u\n", | ||
3513 | - seq, ack, sack, win, end); | ||
3514 | + pr_debug("seq=%u ack=%u+(%d) sack=%u+(%d) win=%u end=%u\n", | ||
3515 | + seq, ack, receiver_offset, sack, receiver_offset, win, end); | ||
3516 | pr_debug("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i " | ||
3517 | "receiver end=%u maxend=%u maxwin=%u scale=%i\n", | ||
3518 | sender->td_end, sender->td_maxend, sender->td_maxwin, | ||
3519 | @@ -700,7 +721,7 @@ static bool tcp_in_window(const struct nf_conn *ct, | ||
3520 | before(seq, sender->td_maxend + 1) ? | ||
3521 | after(end, sender->td_end - receiver->td_maxwin - 1) ? | ||
3522 | before(sack, receiver->td_end + 1) ? | ||
3523 | - after(ack, receiver->td_end - MAXACKWINDOW(sender)) ? "BUG" | ||
3524 | + after(sack, receiver->td_end - MAXACKWINDOW(sender) - 1) ? "BUG" | ||
3525 | : "ACK is under the lower bound (possible overly delayed ACK)" | ||
3526 | : "ACK is over the upper bound (ACKed data not seen yet)" | ||
3527 | : "SEQ is under the lower bound (already ACKed data retransmitted)" | ||
3528 | @@ -715,39 +736,6 @@ static bool tcp_in_window(const struct nf_conn *ct, | ||
3529 | return res; | ||
3530 | } | ||
3531 | |||
3532 | -#ifdef CONFIG_NF_NAT_NEEDED | ||
3533 | -/* Update sender->td_end after NAT successfully mangled the packet */ | ||
3534 | -/* Caller must linearize skb at tcp header. */ | ||
3535 | -void nf_conntrack_tcp_update(const struct sk_buff *skb, | ||
3536 | - unsigned int dataoff, | ||
3537 | - struct nf_conn *ct, int dir, | ||
3538 | - s16 offset) | ||
3539 | -{ | ||
3540 | - const struct tcphdr *tcph = (const void *)skb->data + dataoff; | ||
3541 | - const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir]; | ||
3542 | - const struct ip_ct_tcp_state *receiver = &ct->proto.tcp.seen[!dir]; | ||
3543 | - __u32 end; | ||
3544 | - | ||
3545 | - end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, dataoff, tcph); | ||
3546 | - | ||
3547 | - spin_lock_bh(&ct->lock); | ||
3548 | - /* | ||
3549 | - * We have to worry for the ack in the reply packet only... | ||
3550 | - */ | ||
3551 | - if (ct->proto.tcp.seen[dir].td_end + offset == end) | ||
3552 | - ct->proto.tcp.seen[dir].td_end = end; | ||
3553 | - ct->proto.tcp.last_end = end; | ||
3554 | - spin_unlock_bh(&ct->lock); | ||
3555 | - pr_debug("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i " | ||
3556 | - "receiver end=%u maxend=%u maxwin=%u scale=%i\n", | ||
3557 | - sender->td_end, sender->td_maxend, sender->td_maxwin, | ||
3558 | - sender->td_scale, | ||
3559 | - receiver->td_end, receiver->td_maxend, receiver->td_maxwin, | ||
3560 | - receiver->td_scale); | ||
3561 | -} | ||
3562 | -EXPORT_SYMBOL_GPL(nf_conntrack_tcp_update); | ||
3563 | -#endif | ||
3564 | - | ||
3565 | #define TH_FIN 0x01 | ||
3566 | #define TH_SYN 0x02 | ||
3567 | #define TH_RST 0x04 | ||
3568 | diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c | ||
3569 | index 6809809..38f03f7 100644 | ||
3570 | --- a/net/netfilter/xt_connlimit.c | ||
3571 | +++ b/net/netfilter/xt_connlimit.c | ||
3572 | @@ -103,7 +103,7 @@ static int count_them(struct xt_connlimit_data *data, | ||
3573 | const struct nf_conntrack_tuple *tuple, | ||
3574 | const union nf_inet_addr *addr, | ||
3575 | const union nf_inet_addr *mask, | ||
3576 | - const struct xt_match *match) | ||
3577 | + u_int8_t family) | ||
3578 | { | ||
3579 | const struct nf_conntrack_tuple_hash *found; | ||
3580 | struct xt_connlimit_conn *conn; | ||
3581 | @@ -113,8 +113,7 @@ static int count_them(struct xt_connlimit_data *data, | ||
3582 | bool addit = true; | ||
3583 | int matches = 0; | ||
3584 | |||
3585 | - | ||
3586 | - if (match->family == NFPROTO_IPV6) | ||
3587 | + if (family == NFPROTO_IPV6) | ||
3588 | hash = &data->iphash[connlimit_iphash6(addr, mask)]; | ||
3589 | else | ||
3590 | hash = &data->iphash[connlimit_iphash(addr->ip & mask->ip)]; | ||
3591 | @@ -157,8 +156,7 @@ static int count_them(struct xt_connlimit_data *data, | ||
3592 | continue; | ||
3593 | } | ||
3594 | |||
3595 | - if (same_source_net(addr, mask, &conn->tuple.src.u3, | ||
3596 | - match->family)) | ||
3597 | + if (same_source_net(addr, mask, &conn->tuple.src.u3, family)) | ||
3598 | /* same source network -> be counted! */ | ||
3599 | ++matches; | ||
3600 | nf_ct_put(found_ct); | ||
3601 | @@ -207,7 +205,7 @@ connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par) | ||
3602 | |||
3603 | spin_lock_bh(&info->data->lock); | ||
3604 | connections = count_them(info->data, tuple_ptr, &addr, | ||
3605 | - &info->mask, par->match); | ||
3606 | + &info->mask, par->family); | ||
3607 | spin_unlock_bh(&info->data->lock); | ||
3608 | |||
3609 | if (connections < 0) { | ||
3610 | diff --git a/net/rfkill/core.c b/net/rfkill/core.c | ||
3611 | index 2fc4a17..d2438f9 100644 | ||
3612 | --- a/net/rfkill/core.c | ||
3613 | +++ b/net/rfkill/core.c | ||
3614 | @@ -1180,6 +1180,7 @@ static long rfkill_fop_ioctl(struct file *file, unsigned int cmd, | ||
3615 | #endif | ||
3616 | |||
3617 | static const struct file_operations rfkill_fops = { | ||
3618 | + .owner = THIS_MODULE, | ||
3619 | .open = rfkill_fop_open, | ||
3620 | .read = rfkill_fop_read, | ||
3621 | .write = rfkill_fop_write, | ||
3622 | diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c | ||
3623 | index 96c0ed1..6b0359a 100644 | ||
3624 | --- a/net/sched/act_pedit.c | ||
3625 | +++ b/net/sched/act_pedit.c | ||
3626 | @@ -34,7 +34,7 @@ static struct tcf_hashinfo pedit_hash_info = { | ||
3627 | }; | ||
3628 | |||
3629 | static const struct nla_policy pedit_policy[TCA_PEDIT_MAX + 1] = { | ||
3630 | - [TCA_PEDIT_PARMS] = { .len = sizeof(struct tcf_pedit) }, | ||
3631 | + [TCA_PEDIT_PARMS] = { .len = sizeof(struct tc_pedit) }, | ||
3632 | }; | ||
3633 | |||
3634 | static int tcf_pedit_init(struct nlattr *nla, struct nlattr *est, | ||
3635 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c | ||
3636 | index 23128ee..39e37bc 100644 | ||
3637 | --- a/net/sunrpc/svcsock.c | ||
3638 | +++ b/net/sunrpc/svcsock.c | ||
3639 | @@ -110,7 +110,7 @@ static void svc_release_skb(struct svc_rqst *rqstp) | ||
3640 | rqstp->rq_xprt_ctxt = NULL; | ||
3641 | |||
3642 | dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); | ||
3643 | - skb_free_datagram(svsk->sk_sk, skb); | ||
3644 | + skb_free_datagram_locked(svsk->sk_sk, skb); | ||
3645 | } | ||
3646 | } | ||
3647 | |||
3648 | @@ -537,7 +537,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | ||
3649 | printk("rpcsvc: received unknown control message:" | ||
3650 | "%d/%d\n", | ||
3651 | cmh->cmsg_level, cmh->cmsg_type); | ||
3652 | - skb_free_datagram(svsk->sk_sk, skb); | ||
3653 | + skb_free_datagram_locked(svsk->sk_sk, skb); | ||
3654 | return 0; | ||
3655 | } | ||
3656 | svc_udp_get_dest_address(rqstp, cmh); | ||
3657 | @@ -548,18 +548,18 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp) | ||
3658 | if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) { | ||
3659 | local_bh_enable(); | ||
3660 | /* checksum error */ | ||
3661 | - skb_free_datagram(svsk->sk_sk, skb); | ||
3662 | + skb_free_datagram_locked(svsk->sk_sk, skb); | ||
3663 | return 0; | ||
3664 | } | ||
3665 | local_bh_enable(); | ||
3666 | - skb_free_datagram(svsk->sk_sk, skb); | ||
3667 | + skb_free_datagram_locked(svsk->sk_sk, skb); | ||
3668 | } else { | ||
3669 | /* we can use it in-place */ | ||
3670 | rqstp->rq_arg.head[0].iov_base = skb->data + | ||
3671 | sizeof(struct udphdr); | ||
3672 | rqstp->rq_arg.head[0].iov_len = len; | ||
3673 | if (skb_checksum_complete(skb)) { | ||
3674 | - skb_free_datagram(svsk->sk_sk, skb); | ||
3675 | + skb_free_datagram_locked(svsk->sk_sk, skb); | ||
3676 | return 0; | ||
3677 | } | ||
3678 | rqstp->rq_xprt_ctxt = skb; | ||
3679 | diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c | ||
3680 | index b8dd693..a4e2b1d 100644 | ||
3681 | --- a/security/integrity/ima/ima_iint.c | ||
3682 | +++ b/security/integrity/ima/ima_iint.c | ||
3683 | @@ -58,11 +58,11 @@ struct ima_iint_cache *ima_iint_insert(struct inode *inode) | ||
3684 | |||
3685 | if (!ima_initialized) | ||
3686 | return iint; | ||
3687 | - iint = kmem_cache_alloc(iint_cache, GFP_KERNEL); | ||
3688 | + iint = kmem_cache_alloc(iint_cache, GFP_NOFS); | ||
3689 | if (!iint) | ||
3690 | return iint; | ||
3691 | |||
3692 | - rc = radix_tree_preload(GFP_KERNEL); | ||
3693 | + rc = radix_tree_preload(GFP_NOFS); | ||
3694 | if (rc < 0) | ||
3695 | goto out; | ||
3696 | |||
3697 | diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c | ||
3698 | index dc78272..dbb05b7 100644 | ||
3699 | --- a/sound/arm/aaci.c | ||
3700 | +++ b/sound/arm/aaci.c | ||
3701 | @@ -504,6 +504,10 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, | ||
3702 | int err; | ||
3703 | |||
3704 | aaci_pcm_hw_free(substream); | ||
3705 | + if (aacirun->pcm_open) { | ||
3706 | + snd_ac97_pcm_close(aacirun->pcm); | ||
3707 | + aacirun->pcm_open = 0; | ||
3708 | + } | ||
3709 | |||
3710 | err = devdma_hw_alloc(NULL, substream, | ||
3711 | params_buffer_bytes(params)); | ||
3712 | @@ -517,7 +521,7 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, | ||
3713 | else | ||
3714 | err = snd_ac97_pcm_open(aacirun->pcm, params_rate(params), | ||
3715 | params_channels(params), | ||
3716 | - aacirun->pcm->r[1].slots); | ||
3717 | + aacirun->pcm->r[0].slots); | ||
3718 | |||
3719 | if (err) | ||
3720 | goto out; | ||
3721 | diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c | ||
3722 | index 473247c..70d6f25 100644 | ||
3723 | --- a/sound/core/rawmidi.c | ||
3724 | +++ b/sound/core/rawmidi.c | ||
3725 | @@ -248,7 +248,8 @@ static int assign_substream(struct snd_rawmidi *rmidi, int subdevice, | ||
3726 | list_for_each_entry(substream, &s->substreams, list) { | ||
3727 | if (substream->opened) { | ||
3728 | if (stream == SNDRV_RAWMIDI_STREAM_INPUT || | ||
3729 | - !(mode & SNDRV_RAWMIDI_LFLG_APPEND)) | ||
3730 | + !(mode & SNDRV_RAWMIDI_LFLG_APPEND) || | ||
3731 | + !substream->append) | ||
3732 | continue; | ||
3733 | } | ||
3734 | if (subdevice < 0 || subdevice == substream->number) { | ||
3735 | @@ -266,17 +267,21 @@ static int open_substream(struct snd_rawmidi *rmidi, | ||
3736 | { | ||
3737 | int err; | ||
3738 | |||
3739 | - err = snd_rawmidi_runtime_create(substream); | ||
3740 | - if (err < 0) | ||
3741 | - return err; | ||
3742 | - err = substream->ops->open(substream); | ||
3743 | - if (err < 0) | ||
3744 | - return err; | ||
3745 | - substream->opened = 1; | ||
3746 | - if (substream->use_count++ == 0) | ||
3747 | - substream->active_sensing = 1; | ||
3748 | - if (mode & SNDRV_RAWMIDI_LFLG_APPEND) | ||
3749 | - substream->append = 1; | ||
3750 | + if (substream->use_count == 0) { | ||
3751 | + err = snd_rawmidi_runtime_create(substream); | ||
3752 | + if (err < 0) | ||
3753 | + return err; | ||
3754 | + err = substream->ops->open(substream); | ||
3755 | + if (err < 0) { | ||
3756 | + snd_rawmidi_runtime_free(substream); | ||
3757 | + return err; | ||
3758 | + } | ||
3759 | + substream->opened = 1; | ||
3760 | + substream->active_sensing = 0; | ||
3761 | + if (mode & SNDRV_RAWMIDI_LFLG_APPEND) | ||
3762 | + substream->append = 1; | ||
3763 | + } | ||
3764 | + substream->use_count++; | ||
3765 | rmidi->streams[substream->stream].substream_opened++; | ||
3766 | return 0; | ||
3767 | } | ||
3768 | @@ -297,27 +302,27 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode, | ||
3769 | SNDRV_RAWMIDI_STREAM_INPUT, | ||
3770 | mode, &sinput); | ||
3771 | if (err < 0) | ||
3772 | - goto __error; | ||
3773 | + return err; | ||
3774 | } | ||
3775 | if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) { | ||
3776 | err = assign_substream(rmidi, subdevice, | ||
3777 | SNDRV_RAWMIDI_STREAM_OUTPUT, | ||
3778 | mode, &soutput); | ||
3779 | if (err < 0) | ||
3780 | - goto __error; | ||
3781 | + return err; | ||
3782 | } | ||
3783 | |||
3784 | if (sinput) { | ||
3785 | err = open_substream(rmidi, sinput, mode); | ||
3786 | if (err < 0) | ||
3787 | - goto __error; | ||
3788 | + return err; | ||
3789 | } | ||
3790 | if (soutput) { | ||
3791 | err = open_substream(rmidi, soutput, mode); | ||
3792 | if (err < 0) { | ||
3793 | if (sinput) | ||
3794 | close_substream(rmidi, sinput, 0); | ||
3795 | - goto __error; | ||
3796 | + return err; | ||
3797 | } | ||
3798 | } | ||
3799 | |||
3800 | @@ -325,13 +330,6 @@ static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode, | ||
3801 | rfile->input = sinput; | ||
3802 | rfile->output = soutput; | ||
3803 | return 0; | ||
3804 | - | ||
3805 | - __error: | ||
3806 | - if (sinput && sinput->runtime) | ||
3807 | - snd_rawmidi_runtime_free(sinput); | ||
3808 | - if (soutput && soutput->runtime) | ||
3809 | - snd_rawmidi_runtime_free(soutput); | ||
3810 | - return err; | ||
3811 | } | ||
3812 | |||
3813 | /* called from sound/core/seq/seq_midi.c */ | ||
3814 | diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c | ||
3815 | index 4d26146..90356b8 100644 | ||
3816 | --- a/sound/core/seq/seq_midi.c | ||
3817 | +++ b/sound/core/seq/seq_midi.c | ||
3818 | @@ -236,6 +236,7 @@ static int midisynth_use(void *private_data, struct snd_seq_port_subscribe *info | ||
3819 | memset(¶ms, 0, sizeof(params)); | ||
3820 | params.avail_min = 1; | ||
3821 | params.buffer_size = output_buffer_size; | ||
3822 | + params.no_active_sensing = 1; | ||
3823 | if ((err = snd_rawmidi_output_params(msynth->output_rfile.output, ¶ms)) < 0) { | ||
3824 | snd_rawmidi_kernel_release(&msynth->output_rfile); | ||
3825 | return err; | ||
3826 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c | ||
3827 | index 6990cfc..285b1e2 100644 | ||
3828 | --- a/sound/pci/hda/patch_sigmatel.c | ||
3829 | +++ b/sound/pci/hda/patch_sigmatel.c | ||
3830 | @@ -1817,6 +1817,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | ||
3831 | "Dell Studio 17", STAC_DELL_M6_DMIC), | ||
3832 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be, | ||
3833 | "Dell Studio 1555", STAC_DELL_M6_DMIC), | ||
3834 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd, | ||
3835 | + "Dell Studio 1557", STAC_DELL_M6_DMIC), | ||
3836 | {} /* terminator */ | ||
3837 | }; | ||
3838 | |||
3839 | diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c | ||
3840 | index 0b8dcb5..1365de0 100644 | ||
3841 | --- a/sound/soc/codecs/tlv320aic23.c | ||
3842 | +++ b/sound/soc/codecs/tlv320aic23.c | ||
3843 | @@ -625,11 +625,10 @@ static int tlv320aic23_resume(struct platform_device *pdev) | ||
3844 | { | ||
3845 | struct snd_soc_device *socdev = platform_get_drvdata(pdev); | ||
3846 | struct snd_soc_codec *codec = socdev->card->codec; | ||
3847 | - int i; | ||
3848 | u16 reg; | ||
3849 | |||
3850 | /* Sync reg_cache with the hardware */ | ||
3851 | - for (reg = 0; reg < ARRAY_SIZE(tlv320aic23_reg); i++) { | ||
3852 | + for (reg = 0; reg < TLV320AIC23_RESET; reg++) { | ||
3853 | u16 val = tlv320aic23_read_reg_cache(codec, reg); | ||
3854 | tlv320aic23_write(codec, reg, val); | ||
3855 | } | ||
3856 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c | ||
3857 | index 21c6907..4aba33f 100644 | ||
3858 | --- a/sound/soc/soc-dapm.c | ||
3859 | +++ b/sound/soc/soc-dapm.c | ||
3860 | @@ -774,9 +774,19 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event) | ||
3861 | if (!w->power_check) | ||
3862 | continue; | ||
3863 | |||
3864 | - power = w->power_check(w); | ||
3865 | - if (power) | ||
3866 | - sys_power = 1; | ||
3867 | + /* If we're suspending then pull down all the | ||
3868 | + * power. */ | ||
3869 | + switch (event) { | ||
3870 | + case SND_SOC_DAPM_STREAM_SUSPEND: | ||
3871 | + power = 0; | ||
3872 | + break; | ||
3873 | + | ||
3874 | + default: | ||
3875 | + power = w->power_check(w); | ||
3876 | + if (power) | ||
3877 | + sys_power = 1; | ||
3878 | + break; | ||
3879 | + } | ||
3880 | |||
3881 | if (w->power == power) | ||
3882 | continue; | ||
3883 | diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h | ||
3884 | index 8e7f789..e9a3a9d 100644 | ||
3885 | --- a/sound/usb/usbaudio.h | ||
3886 | +++ b/sound/usb/usbaudio.h | ||
3887 | @@ -210,7 +210,7 @@ struct snd_usb_midi_endpoint_info { | ||
3888 | /* | ||
3889 | */ | ||
3890 | |||
3891 | -#define combine_word(s) ((*s) | ((unsigned int)(s)[1] << 8)) | ||
3892 | +#define combine_word(s) ((*(s)) | ((unsigned int)(s)[1] << 8)) | ||
3893 | #define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16)) | ||
3894 | #define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24)) | ||
3895 |