1 |
mpagano |
2254 |
diff --git a/Makefile b/Makefile |
2 |
|
|
index bf1df55..a3e12e6 100644 |
3 |
|
|
--- a/Makefile |
4 |
|
|
+++ b/Makefile |
5 |
|
|
@@ -1,6 +1,6 @@ |
6 |
|
|
VERSION = 3 |
7 |
|
|
PATCHLEVEL = 4 |
8 |
|
|
-SUBLEVEL = 23 |
9 |
|
|
+SUBLEVEL = 24 |
10 |
|
|
EXTRAVERSION = |
11 |
|
|
NAME = Saber-toothed Squirrel |
12 |
|
|
|
13 |
|
|
diff --git a/arch/arm/include/asm/hwcap.h b/arch/arm/include/asm/hwcap.h |
14 |
|
|
index 9176261..a2fe893 100644 |
15 |
|
|
--- a/arch/arm/include/asm/hwcap.h |
16 |
|
|
+++ b/arch/arm/include/asm/hwcap.h |
17 |
|
|
@@ -18,11 +18,12 @@ |
18 |
|
|
#define HWCAP_THUMBEE (1 << 11) |
19 |
|
|
#define HWCAP_NEON (1 << 12) |
20 |
|
|
#define HWCAP_VFPv3 (1 << 13) |
21 |
|
|
-#define HWCAP_VFPv3D16 (1 << 14) |
22 |
|
|
+#define HWCAP_VFPv3D16 (1 << 14) /* also set for VFPv4-D16 */ |
23 |
|
|
#define HWCAP_TLS (1 << 15) |
24 |
|
|
#define HWCAP_VFPv4 (1 << 16) |
25 |
|
|
#define HWCAP_IDIVA (1 << 17) |
26 |
|
|
#define HWCAP_IDIVT (1 << 18) |
27 |
|
|
+#define HWCAP_VFPD32 (1 << 19) /* set if VFP has 32 regs (not 16) */ |
28 |
|
|
#define HWCAP_IDIV (HWCAP_IDIVA | HWCAP_IDIVT) |
29 |
|
|
|
30 |
|
|
#if defined(__KERNEL__) |
31 |
|
|
diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h |
32 |
|
|
index bf53047..c49c8f7 100644 |
33 |
|
|
--- a/arch/arm/include/asm/vfpmacros.h |
34 |
|
|
+++ b/arch/arm/include/asm/vfpmacros.h |
35 |
|
|
@@ -27,9 +27,9 @@ |
36 |
|
|
#if __LINUX_ARM_ARCH__ <= 6 |
37 |
|
|
ldr \tmp, =elf_hwcap @ may not have MVFR regs |
38 |
|
|
ldr \tmp, [\tmp, #0] |
39 |
|
|
- tst \tmp, #HWCAP_VFPv3D16 |
40 |
|
|
- ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} |
41 |
|
|
- addne \base, \base, #32*4 @ step over unused register space |
42 |
|
|
+ tst \tmp, #HWCAP_VFPD32 |
43 |
|
|
+ ldcnel p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} |
44 |
|
|
+ addeq \base, \base, #32*4 @ step over unused register space |
45 |
|
|
#else |
46 |
|
|
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
47 |
|
|
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
48 |
|
|
@@ -51,9 +51,9 @@ |
49 |
|
|
#if __LINUX_ARM_ARCH__ <= 6 |
50 |
|
|
ldr \tmp, =elf_hwcap @ may not have MVFR regs |
51 |
|
|
ldr \tmp, [\tmp, #0] |
52 |
|
|
- tst \tmp, #HWCAP_VFPv3D16 |
53 |
|
|
- stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} |
54 |
|
|
- addne \base, \base, #32*4 @ step over unused register space |
55 |
|
|
+ tst \tmp, #HWCAP_VFPD32 |
56 |
|
|
+ stcnel p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} |
57 |
|
|
+ addeq \base, \base, #32*4 @ step over unused register space |
58 |
|
|
#else |
59 |
|
|
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 |
60 |
|
|
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field |
61 |
|
|
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c |
62 |
|
|
index 1f8241d..3b36062 100644 |
63 |
|
|
--- a/arch/arm/vfp/vfpmodule.c |
64 |
|
|
+++ b/arch/arm/vfp/vfpmodule.c |
65 |
|
|
@@ -701,11 +701,14 @@ static int __init vfp_init(void) |
66 |
|
|
elf_hwcap |= HWCAP_VFPv3; |
67 |
|
|
|
68 |
|
|
/* |
69 |
|
|
- * Check for VFPv3 D16. CPUs in this configuration |
70 |
|
|
- * only have 16 x 64bit registers. |
71 |
|
|
+ * Check for VFPv3 D16 and VFPv4 D16. CPUs in |
72 |
|
|
+ * this configuration only have 16 x 64bit |
73 |
|
|
+ * registers. |
74 |
|
|
*/ |
75 |
|
|
if (((fmrx(MVFR0) & MVFR0_A_SIMD_MASK)) == 1) |
76 |
|
|
- elf_hwcap |= HWCAP_VFPv3D16; |
77 |
|
|
+ elf_hwcap |= HWCAP_VFPv3D16; /* also v4-D16 */ |
78 |
|
|
+ else |
79 |
|
|
+ elf_hwcap |= HWCAP_VFPD32; |
80 |
|
|
} |
81 |
|
|
#endif |
82 |
|
|
/* |
83 |
|
|
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c |
84 |
|
|
index ad0de0c..2861b4c 100644 |
85 |
|
|
--- a/arch/x86/kernel/hpet.c |
86 |
|
|
+++ b/arch/x86/kernel/hpet.c |
87 |
|
|
@@ -431,7 +431,7 @@ void hpet_msi_unmask(struct irq_data *data) |
88 |
|
|
|
89 |
|
|
/* unmask it */ |
90 |
|
|
cfg = hpet_readl(HPET_Tn_CFG(hdev->num)); |
91 |
|
|
- cfg |= HPET_TN_FSB; |
92 |
|
|
+ cfg |= HPET_TN_ENABLE | HPET_TN_FSB; |
93 |
|
|
hpet_writel(cfg, HPET_Tn_CFG(hdev->num)); |
94 |
|
|
} |
95 |
|
|
|
96 |
|
|
@@ -442,7 +442,7 @@ void hpet_msi_mask(struct irq_data *data) |
97 |
|
|
|
98 |
|
|
/* mask it */ |
99 |
|
|
cfg = hpet_readl(HPET_Tn_CFG(hdev->num)); |
100 |
|
|
- cfg &= ~HPET_TN_FSB; |
101 |
|
|
+ cfg &= ~(HPET_TN_ENABLE | HPET_TN_FSB); |
102 |
|
|
hpet_writel(cfg, HPET_Tn_CFG(hdev->num)); |
103 |
|
|
} |
104 |
|
|
|
105 |
|
|
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c |
106 |
|
|
index 7dd3f9f..6ea287e2 100644 |
107 |
|
|
--- a/drivers/acpi/battery.c |
108 |
|
|
+++ b/drivers/acpi/battery.c |
109 |
|
|
@@ -34,6 +34,7 @@ |
110 |
|
|
#include <linux/dmi.h> |
111 |
|
|
#include <linux/slab.h> |
112 |
|
|
#include <linux/suspend.h> |
113 |
|
|
+#include <asm/unaligned.h> |
114 |
|
|
|
115 |
|
|
#ifdef CONFIG_ACPI_PROCFS_POWER |
116 |
|
|
#include <linux/proc_fs.h> |
117 |
|
|
@@ -95,6 +96,18 @@ enum { |
118 |
|
|
ACPI_BATTERY_ALARM_PRESENT, |
119 |
|
|
ACPI_BATTERY_XINFO_PRESENT, |
120 |
|
|
ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, |
121 |
|
|
+ /* On Lenovo Thinkpad models from 2010 and 2011, the power unit |
122 |
|
|
+ switches between mWh and mAh depending on whether the system |
123 |
|
|
+ is running on battery or not. When mAh is the unit, most |
124 |
|
|
+ reported values are incorrect and need to be adjusted by |
125 |
|
|
+ 10000/design_voltage. Verified on x201, t410, t410s, and x220. |
126 |
|
|
+ Pre-2010 and 2012 models appear to always report in mWh and |
127 |
|
|
+ are thus unaffected (tested with t42, t61, t500, x200, x300, |
128 |
|
|
+ and x230). Also, in mid-2012 Lenovo issued a BIOS update for |
129 |
|
|
+ the 2011 models that fixes the issue (tested on x220 with a |
130 |
|
|
+ post-1.29 BIOS), but as of Nov. 2012, no such update is |
131 |
|
|
+ available for the 2010 models. */ |
132 |
|
|
+ ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
133 |
|
|
}; |
134 |
|
|
|
135 |
|
|
struct acpi_battery { |
136 |
|
|
@@ -429,6 +442,21 @@ static int acpi_battery_get_info(struct acpi_battery *battery) |
137 |
|
|
kfree(buffer.pointer); |
138 |
|
|
if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) |
139 |
|
|
battery->full_charge_capacity = battery->design_capacity; |
140 |
|
|
+ if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && |
141 |
|
|
+ battery->power_unit && battery->design_voltage) { |
142 |
|
|
+ battery->design_capacity = battery->design_capacity * |
143 |
|
|
+ 10000 / battery->design_voltage; |
144 |
|
|
+ battery->full_charge_capacity = battery->full_charge_capacity * |
145 |
|
|
+ 10000 / battery->design_voltage; |
146 |
|
|
+ battery->design_capacity_warning = |
147 |
|
|
+ battery->design_capacity_warning * |
148 |
|
|
+ 10000 / battery->design_voltage; |
149 |
|
|
+ /* Curiously, design_capacity_low, unlike the rest of them, |
150 |
|
|
+ is correct. */ |
151 |
|
|
+ /* capacity_granularity_* equal 1 on the systems tested, so |
152 |
|
|
+ it's impossible to tell if they would need an adjustment |
153 |
|
|
+ or not if their values were higher. */ |
154 |
|
|
+ } |
155 |
|
|
return result; |
156 |
|
|
} |
157 |
|
|
|
158 |
|
|
@@ -477,6 +505,11 @@ static int acpi_battery_get_state(struct acpi_battery *battery) |
159 |
|
|
&& battery->capacity_now >= 0 && battery->capacity_now <= 100) |
160 |
|
|
battery->capacity_now = (battery->capacity_now * |
161 |
|
|
battery->full_charge_capacity) / 100; |
162 |
|
|
+ if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && |
163 |
|
|
+ battery->power_unit && battery->design_voltage) { |
164 |
|
|
+ battery->capacity_now = battery->capacity_now * |
165 |
|
|
+ 10000 / battery->design_voltage; |
166 |
|
|
+ } |
167 |
|
|
return result; |
168 |
|
|
} |
169 |
|
|
|
170 |
|
|
@@ -586,6 +619,24 @@ static void sysfs_remove_battery(struct acpi_battery *battery) |
171 |
|
|
mutex_unlock(&battery->sysfs_lock); |
172 |
|
|
} |
173 |
|
|
|
174 |
|
|
+static void find_battery(const struct dmi_header *dm, void *private) |
175 |
|
|
+{ |
176 |
|
|
+ struct acpi_battery *battery = (struct acpi_battery *)private; |
177 |
|
|
+ /* Note: the hardcoded offsets below have been extracted from |
178 |
|
|
+ the source code of dmidecode. */ |
179 |
|
|
+ if (dm->type == DMI_ENTRY_PORTABLE_BATTERY && dm->length >= 8) { |
180 |
|
|
+ const u8 *dmi_data = (const u8 *)(dm + 1); |
181 |
|
|
+ int dmi_capacity = get_unaligned((const u16 *)(dmi_data + 6)); |
182 |
|
|
+ if (dm->length >= 18) |
183 |
|
|
+ dmi_capacity *= dmi_data[17]; |
184 |
|
|
+ if (battery->design_capacity * battery->design_voltage / 1000 |
185 |
|
|
+ != dmi_capacity && |
186 |
|
|
+ battery->design_capacity * 10 == dmi_capacity) |
187 |
|
|
+ set_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
188 |
|
|
+ &battery->flags); |
189 |
|
|
+ } |
190 |
|
|
+} |
191 |
|
|
+ |
192 |
|
|
/* |
193 |
|
|
* According to the ACPI spec, some kinds of primary batteries can |
194 |
|
|
* report percentage battery remaining capacity directly to OS. |
195 |
|
|
@@ -611,6 +662,32 @@ static void acpi_battery_quirks(struct acpi_battery *battery) |
196 |
|
|
battery->capacity_now = (battery->capacity_now * |
197 |
|
|
battery->full_charge_capacity) / 100; |
198 |
|
|
} |
199 |
|
|
+ |
200 |
|
|
+ if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags)) |
201 |
|
|
+ return ; |
202 |
|
|
+ |
203 |
|
|
+ if (battery->power_unit && dmi_name_in_vendors("LENOVO")) { |
204 |
|
|
+ const char *s; |
205 |
|
|
+ s = dmi_get_system_info(DMI_PRODUCT_VERSION); |
206 |
|
|
+ if (s && !strnicmp(s, "ThinkPad", 8)) { |
207 |
|
|
+ dmi_walk(find_battery, battery); |
208 |
|
|
+ if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, |
209 |
|
|
+ &battery->flags) && |
210 |
|
|
+ battery->design_voltage) { |
211 |
|
|
+ battery->design_capacity = |
212 |
|
|
+ battery->design_capacity * |
213 |
|
|
+ 10000 / battery->design_voltage; |
214 |
|
|
+ battery->full_charge_capacity = |
215 |
|
|
+ battery->full_charge_capacity * |
216 |
|
|
+ 10000 / battery->design_voltage; |
217 |
|
|
+ battery->design_capacity_warning = |
218 |
|
|
+ battery->design_capacity_warning * |
219 |
|
|
+ 10000 / battery->design_voltage; |
220 |
|
|
+ battery->capacity_now = battery->capacity_now * |
221 |
|
|
+ 10000 / battery->design_voltage; |
222 |
|
|
+ } |
223 |
|
|
+ } |
224 |
|
|
+ } |
225 |
|
|
} |
226 |
|
|
|
227 |
|
|
static int acpi_battery_update(struct acpi_battery *battery) |
228 |
|
|
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
229 |
|
|
index 2377445..480b648 100644 |
230 |
|
|
--- a/drivers/acpi/sleep.c |
231 |
|
|
+++ b/drivers/acpi/sleep.c |
232 |
|
|
@@ -508,6 +508,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
233 |
|
|
}, |
234 |
|
|
{ |
235 |
|
|
.callback = init_nvs_nosave, |
236 |
|
|
+ .ident = "Sony Vaio VPCEB1S1E", |
237 |
|
|
+ .matches = { |
238 |
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
239 |
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1S1E"), |
240 |
|
|
+ }, |
241 |
|
|
+ }, |
242 |
|
|
+ { |
243 |
|
|
+ .callback = init_nvs_nosave, |
244 |
|
|
.ident = "Sony Vaio VGN-FW520F", |
245 |
|
|
.matches = { |
246 |
|
|
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
247 |
|
|
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
248 |
|
|
index 62d9ee6..91357e1 100644 |
249 |
|
|
--- a/drivers/acpi/video.c |
250 |
|
|
+++ b/drivers/acpi/video.c |
251 |
|
|
@@ -389,6 +389,12 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d) |
252 |
|
|
return 0; |
253 |
|
|
} |
254 |
|
|
|
255 |
|
|
+static int video_ignore_initial_backlight(const struct dmi_system_id *d) |
256 |
|
|
+{ |
257 |
|
|
+ use_bios_initial_backlight = 0; |
258 |
|
|
+ return 0; |
259 |
|
|
+} |
260 |
|
|
+ |
261 |
|
|
static struct dmi_system_id video_dmi_table[] __initdata = { |
262 |
|
|
/* |
263 |
|
|
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 |
264 |
|
|
@@ -433,6 +439,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
265 |
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"), |
266 |
|
|
}, |
267 |
|
|
}, |
268 |
|
|
+ { |
269 |
|
|
+ .callback = video_ignore_initial_backlight, |
270 |
|
|
+ .ident = "HP Folio 13-2000", |
271 |
|
|
+ .matches = { |
272 |
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
273 |
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"), |
274 |
|
|
+ }, |
275 |
|
|
+ }, |
276 |
|
|
{} |
277 |
|
|
}; |
278 |
|
|
|
279 |
|
|
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c |
280 |
|
|
index b48fc2a..3fe0524 100644 |
281 |
|
|
--- a/drivers/gpu/drm/i915/intel_bios.c |
282 |
|
|
+++ b/drivers/gpu/drm/i915/intel_bios.c |
283 |
|
|
@@ -459,12 +459,8 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) |
284 |
|
|
|
285 |
|
|
edp = find_section(bdb, BDB_EDP); |
286 |
|
|
if (!edp) { |
287 |
|
|
- if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) { |
288 |
|
|
- DRM_DEBUG_KMS("No eDP BDB found but eDP panel " |
289 |
|
|
- "supported, assume %dbpp panel color " |
290 |
|
|
- "depth.\n", |
291 |
|
|
- dev_priv->edp.bpp); |
292 |
|
|
- } |
293 |
|
|
+ if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) |
294 |
|
|
+ DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n"); |
295 |
|
|
return; |
296 |
|
|
} |
297 |
|
|
|
298 |
|
|
@@ -617,9 +613,6 @@ init_vbt_defaults(struct drm_i915_private *dev_priv) |
299 |
|
|
dev_priv->lvds_use_ssc = 1; |
300 |
|
|
dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); |
301 |
|
|
DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); |
302 |
|
|
- |
303 |
|
|
- /* eDP data */ |
304 |
|
|
- dev_priv->edp.bpp = 18; |
305 |
|
|
} |
306 |
|
|
|
307 |
|
|
static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) |
308 |
|
|
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
309 |
|
|
index f3b06f0..dd3e7e4 100644 |
310 |
|
|
--- a/drivers/gpu/drm/i915/intel_display.c |
311 |
|
|
+++ b/drivers/gpu/drm/i915/intel_display.c |
312 |
|
|
@@ -4996,6 +4996,17 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, |
313 |
|
|
} |
314 |
|
|
} |
315 |
|
|
|
316 |
|
|
+ if (intel_encoder->type == INTEL_OUTPUT_EDP) { |
317 |
|
|
+ /* Use VBT settings if we have an eDP panel */ |
318 |
|
|
+ unsigned int edp_bpc = dev_priv->edp.bpp / 3; |
319 |
|
|
+ |
320 |
|
|
+ if (edp_bpc && edp_bpc < display_bpc) { |
321 |
|
|
+ DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); |
322 |
|
|
+ display_bpc = edp_bpc; |
323 |
|
|
+ } |
324 |
|
|
+ continue; |
325 |
|
|
+ } |
326 |
|
|
+ |
327 |
|
|
/* |
328 |
|
|
* HDMI is either 12 or 8, so if the display lets 10bpc sneak |
329 |
|
|
* through, clamp it down. (Note: >12bpc will be caught below.) |
330 |
|
|
diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c |
331 |
|
|
index ac2d6cb..770e959 100644 |
332 |
|
|
--- a/drivers/hwmon/fam15h_power.c |
333 |
|
|
+++ b/drivers/hwmon/fam15h_power.c |
334 |
|
|
@@ -31,6 +31,9 @@ MODULE_DESCRIPTION("AMD Family 15h CPU processor power monitor"); |
335 |
|
|
MODULE_AUTHOR("Andreas Herrmann <andreas.herrmann3@amd.com>"); |
336 |
|
|
MODULE_LICENSE("GPL"); |
337 |
|
|
|
338 |
|
|
+/* Family 16h Northbridge's function 4 PCI ID */ |
339 |
|
|
+#define PCI_DEVICE_ID_AMD_16H_NB_F4 0x1534 |
340 |
|
|
+ |
341 |
|
|
/* D18F3 */ |
342 |
|
|
#define REG_NORTHBRIDGE_CAP 0xe8 |
343 |
|
|
|
344 |
|
|
@@ -256,6 +259,7 @@ static void __devexit fam15h_power_remove(struct pci_dev *pdev) |
345 |
|
|
|
346 |
|
|
static DEFINE_PCI_DEVICE_TABLE(fam15h_power_id_table) = { |
347 |
|
|
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, |
348 |
|
|
+ { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) }, |
349 |
|
|
{} |
350 |
|
|
}; |
351 |
|
|
MODULE_DEVICE_TABLE(pci, fam15h_power_id_table); |
352 |
|
|
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c |
353 |
|
|
index 3b8236b..a5786a8 100644 |
354 |
|
|
--- a/drivers/mmc/host/sh_mmcif.c |
355 |
|
|
+++ b/drivers/mmc/host/sh_mmcif.c |
356 |
|
|
@@ -1066,7 +1066,6 @@ static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id) |
357 |
|
|
{ |
358 |
|
|
struct sh_mmcif_host *host = dev_id; |
359 |
|
|
struct mmc_request *mrq = host->mrq; |
360 |
|
|
- struct mmc_data *data = mrq->data; |
361 |
|
|
|
362 |
|
|
cancel_delayed_work_sync(&host->timeout_work); |
363 |
|
|
|
364 |
|
|
@@ -1114,13 +1113,14 @@ static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id) |
365 |
|
|
case MMCIF_WAIT_FOR_READ_END: |
366 |
|
|
case MMCIF_WAIT_FOR_WRITE_END: |
367 |
|
|
if (host->sd_error) |
368 |
|
|
- data->error = sh_mmcif_error_manage(host); |
369 |
|
|
+ mrq->data->error = sh_mmcif_error_manage(host); |
370 |
|
|
break; |
371 |
|
|
default: |
372 |
|
|
BUG(); |
373 |
|
|
} |
374 |
|
|
|
375 |
|
|
if (host->wait_for != MMCIF_WAIT_FOR_STOP) { |
376 |
|
|
+ struct mmc_data *data = mrq->data; |
377 |
|
|
if (!mrq->cmd->error && data && !data->error) |
378 |
|
|
data->bytes_xfered = |
379 |
|
|
data->blocks * data->blksz; |
380 |
|
|
@@ -1191,10 +1191,6 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id) |
381 |
|
|
host->sd_error = true; |
382 |
|
|
dev_dbg(&host->pd->dev, "int err state = %08x\n", state); |
383 |
|
|
} |
384 |
|
|
- if (host->state == STATE_IDLE) { |
385 |
|
|
- dev_info(&host->pd->dev, "Spurious IRQ status 0x%x", state); |
386 |
|
|
- return IRQ_HANDLED; |
387 |
|
|
- } |
388 |
|
|
if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) { |
389 |
|
|
if (!host->dma_active) |
390 |
|
|
return IRQ_WAKE_THREAD; |
391 |
|
|
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c |
392 |
|
|
index d21e8f5..e353788 100644 |
393 |
|
|
--- a/drivers/pnp/pnpacpi/core.c |
394 |
|
|
+++ b/drivers/pnp/pnpacpi/core.c |
395 |
|
|
@@ -95,6 +95,9 @@ static int pnpacpi_set_resources(struct pnp_dev *dev) |
396 |
|
|
return -ENODEV; |
397 |
|
|
} |
398 |
|
|
|
399 |
|
|
+ if (WARN_ON_ONCE(acpi_dev != dev->data)) |
400 |
|
|
+ dev->data = acpi_dev; |
401 |
|
|
+ |
402 |
|
|
ret = pnpacpi_build_resource_template(dev, &buffer); |
403 |
|
|
if (ret) |
404 |
|
|
return ret; |
405 |
|
|
diff --git a/drivers/staging/telephony/ixj.c b/drivers/staging/telephony/ixj.c |
406 |
|
|
index f960279..638d2b8 100644 |
407 |
|
|
--- a/drivers/staging/telephony/ixj.c |
408 |
|
|
+++ b/drivers/staging/telephony/ixj.c |
409 |
|
|
@@ -3190,12 +3190,12 @@ static void ixj_write_cid(IXJ *j) |
410 |
|
|
|
411 |
|
|
ixj_fsk_alloc(j); |
412 |
|
|
|
413 |
|
|
- strcpy(sdmf1, j->cid_send.month); |
414 |
|
|
- strcat(sdmf1, j->cid_send.day); |
415 |
|
|
- strcat(sdmf1, j->cid_send.hour); |
416 |
|
|
- strcat(sdmf1, j->cid_send.min); |
417 |
|
|
- strcpy(sdmf2, j->cid_send.number); |
418 |
|
|
- strcpy(sdmf3, j->cid_send.name); |
419 |
|
|
+ strlcpy(sdmf1, j->cid_send.month, sizeof(sdmf1)); |
420 |
|
|
+ strlcat(sdmf1, j->cid_send.day, sizeof(sdmf1)); |
421 |
|
|
+ strlcat(sdmf1, j->cid_send.hour, sizeof(sdmf1)); |
422 |
|
|
+ strlcat(sdmf1, j->cid_send.min, sizeof(sdmf1)); |
423 |
|
|
+ strlcpy(sdmf2, j->cid_send.number, sizeof(sdmf2)); |
424 |
|
|
+ strlcpy(sdmf3, j->cid_send.name, sizeof(sdmf3)); |
425 |
|
|
|
426 |
|
|
len1 = strlen(sdmf1); |
427 |
|
|
len2 = strlen(sdmf2); |
428 |
|
|
@@ -3340,12 +3340,12 @@ static void ixj_write_cidcw(IXJ *j) |
429 |
|
|
ixj_pre_cid(j); |
430 |
|
|
} |
431 |
|
|
j->flags.cidcw_ack = 0; |
432 |
|
|
- strcpy(sdmf1, j->cid_send.month); |
433 |
|
|
- strcat(sdmf1, j->cid_send.day); |
434 |
|
|
- strcat(sdmf1, j->cid_send.hour); |
435 |
|
|
- strcat(sdmf1, j->cid_send.min); |
436 |
|
|
- strcpy(sdmf2, j->cid_send.number); |
437 |
|
|
- strcpy(sdmf3, j->cid_send.name); |
438 |
|
|
+ strlcpy(sdmf1, j->cid_send.month, sizeof(sdmf1)); |
439 |
|
|
+ strlcat(sdmf1, j->cid_send.day, sizeof(sdmf1)); |
440 |
|
|
+ strlcat(sdmf1, j->cid_send.hour, sizeof(sdmf1)); |
441 |
|
|
+ strlcat(sdmf1, j->cid_send.min, sizeof(sdmf1)); |
442 |
|
|
+ strlcpy(sdmf2, j->cid_send.number, sizeof(sdmf2)); |
443 |
|
|
+ strlcpy(sdmf3, j->cid_send.name, sizeof(sdmf3)); |
444 |
|
|
|
445 |
|
|
len1 = strlen(sdmf1); |
446 |
|
|
len2 = strlen(sdmf2); |
447 |
|
|
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
448 |
|
|
index c5f7eae..b4e87cf 100644 |
449 |
|
|
--- a/drivers/usb/class/cdc-acm.c |
450 |
|
|
+++ b/drivers/usb/class/cdc-acm.c |
451 |
|
|
@@ -788,6 +788,10 @@ static int get_serial_info(struct acm *acm, struct serial_struct __user *info) |
452 |
|
|
tmp.flags = ASYNC_LOW_LATENCY; |
453 |
|
|
tmp.xmit_fifo_size = acm->writesize; |
454 |
|
|
tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); |
455 |
|
|
+ tmp.close_delay = acm->port.close_delay / 10; |
456 |
|
|
+ tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
457 |
|
|
+ ASYNC_CLOSING_WAIT_NONE : |
458 |
|
|
+ acm->port.closing_wait / 10; |
459 |
|
|
|
460 |
|
|
if (copy_to_user(info, &tmp, sizeof(tmp))) |
461 |
|
|
return -EFAULT; |
462 |
|
|
@@ -795,6 +799,37 @@ static int get_serial_info(struct acm *acm, struct serial_struct __user *info) |
463 |
|
|
return 0; |
464 |
|
|
} |
465 |
|
|
|
466 |
|
|
+static int set_serial_info(struct acm *acm, |
467 |
|
|
+ struct serial_struct __user *newinfo) |
468 |
|
|
+{ |
469 |
|
|
+ struct serial_struct new_serial; |
470 |
|
|
+ unsigned int closing_wait, close_delay; |
471 |
|
|
+ int retval = 0; |
472 |
|
|
+ |
473 |
|
|
+ if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) |
474 |
|
|
+ return -EFAULT; |
475 |
|
|
+ |
476 |
|
|
+ close_delay = new_serial.close_delay * 10; |
477 |
|
|
+ closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? |
478 |
|
|
+ ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; |
479 |
|
|
+ |
480 |
|
|
+ mutex_lock(&acm->port.mutex); |
481 |
|
|
+ |
482 |
|
|
+ if (!capable(CAP_SYS_ADMIN)) { |
483 |
|
|
+ if ((close_delay != acm->port.close_delay) || |
484 |
|
|
+ (closing_wait != acm->port.closing_wait)) |
485 |
|
|
+ retval = -EPERM; |
486 |
|
|
+ else |
487 |
|
|
+ retval = -EOPNOTSUPP; |
488 |
|
|
+ } else { |
489 |
|
|
+ acm->port.close_delay = close_delay; |
490 |
|
|
+ acm->port.closing_wait = closing_wait; |
491 |
|
|
+ } |
492 |
|
|
+ |
493 |
|
|
+ mutex_unlock(&acm->port.mutex); |
494 |
|
|
+ return retval; |
495 |
|
|
+} |
496 |
|
|
+ |
497 |
|
|
static int acm_tty_ioctl(struct tty_struct *tty, |
498 |
|
|
unsigned int cmd, unsigned long arg) |
499 |
|
|
{ |
500 |
|
|
@@ -805,6 +840,9 @@ static int acm_tty_ioctl(struct tty_struct *tty, |
501 |
|
|
case TIOCGSERIAL: /* gets serial port data */ |
502 |
|
|
rv = get_serial_info(acm, (struct serial_struct __user *) arg); |
503 |
|
|
break; |
504 |
|
|
+ case TIOCSSERIAL: |
505 |
|
|
+ rv = set_serial_info(acm, (struct serial_struct __user *) arg); |
506 |
|
|
+ break; |
507 |
|
|
} |
508 |
|
|
|
509 |
|
|
return rv; |
510 |
|
|
diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c |
511 |
|
|
index c5a1ea9..9d00d47 100644 |
512 |
|
|
--- a/drivers/usb/host/ohci-q.c |
513 |
|
|
+++ b/drivers/usb/host/ohci-q.c |
514 |
|
|
@@ -1128,6 +1128,25 @@ dl_done_list (struct ohci_hcd *ohci) |
515 |
|
|
|
516 |
|
|
while (td) { |
517 |
|
|
struct td *td_next = td->next_dl_td; |
518 |
|
|
+ struct ed *ed = td->ed; |
519 |
|
|
+ |
520 |
|
|
+ /* |
521 |
|
|
+ * Some OHCI controllers (NVIDIA for sure, maybe others) |
522 |
|
|
+ * occasionally forget to add TDs to the done queue. Since |
523 |
|
|
+ * TDs for a given endpoint are always processed in order, |
524 |
|
|
+ * if we find a TD on the donelist then all of its |
525 |
|
|
+ * predecessors must be finished as well. |
526 |
|
|
+ */ |
527 |
|
|
+ for (;;) { |
528 |
|
|
+ struct td *td2; |
529 |
|
|
+ |
530 |
|
|
+ td2 = list_first_entry(&ed->td_list, struct td, |
531 |
|
|
+ td_list); |
532 |
|
|
+ if (td2 == td) |
533 |
|
|
+ break; |
534 |
|
|
+ takeback_td(ohci, td2); |
535 |
|
|
+ } |
536 |
|
|
+ |
537 |
|
|
takeback_td(ohci, td); |
538 |
|
|
td = td_next; |
539 |
|
|
} |
540 |
|
|
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
541 |
|
|
index 4211017..84e82dc 100644 |
542 |
|
|
--- a/drivers/usb/host/xhci-pci.c |
543 |
|
|
+++ b/drivers/usb/host/xhci-pci.c |
544 |
|
|
@@ -29,6 +29,7 @@ |
545 |
|
|
/* Device for a quirk */ |
546 |
|
|
#define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
547 |
|
|
#define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
548 |
|
|
+#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400 0x1400 |
549 |
|
|
|
550 |
|
|
#define PCI_VENDOR_ID_ETRON 0x1b6f |
551 |
|
|
#define PCI_DEVICE_ID_ASROCK_P67 0x7023 |
552 |
|
|
@@ -58,8 +59,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
553 |
|
|
|
554 |
|
|
/* Look for vendor-specific quirks */ |
555 |
|
|
if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && |
556 |
|
|
- pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) { |
557 |
|
|
- if (pdev->revision == 0x0) { |
558 |
|
|
+ (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK || |
559 |
|
|
+ pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) { |
560 |
|
|
+ if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && |
561 |
|
|
+ pdev->revision == 0x0) { |
562 |
|
|
xhci->quirks |= XHCI_RESET_EP_QUIRK; |
563 |
|
|
xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" |
564 |
|
|
" endpoint cmd after reset endpoint\n"); |
565 |
|
|
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c |
566 |
|
|
index 53e7e69..f38a278 100644 |
567 |
|
|
--- a/drivers/usb/serial/cp210x.c |
568 |
|
|
+++ b/drivers/usb/serial/cp210x.c |
569 |
|
|
@@ -120,6 +120,7 @@ static const struct usb_device_id id_table[] = { |
570 |
|
|
{ USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ |
571 |
|
|
{ USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */ |
572 |
|
|
{ USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */ |
573 |
|
|
+ { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ |
574 |
|
|
{ USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ |
575 |
|
|
{ USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
576 |
|
|
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
577 |
|
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
578 |
|
|
index 25bb935..25903f5 100644 |
579 |
|
|
--- a/drivers/usb/serial/ftdi_sio.c |
580 |
|
|
+++ b/drivers/usb/serial/ftdi_sio.c |
581 |
|
|
@@ -197,6 +197,7 @@ static struct usb_device_id id_table_combined [] = { |
582 |
|
|
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, |
583 |
|
|
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, |
584 |
|
|
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, |
585 |
|
|
+ { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) }, |
586 |
|
|
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
587 |
|
|
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
588 |
|
|
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, |
589 |
|
|
@@ -1810,7 +1811,7 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) |
590 |
|
|
dbg("%s", __func__); |
591 |
|
|
|
592 |
|
|
if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) || |
593 |
|
|
- (udev->product && !strcmp(udev->product, "BeagleBone/XDS100"))) |
594 |
|
|
+ (udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2"))) |
595 |
|
|
return ftdi_jtag_probe(serial); |
596 |
|
|
|
597 |
|
|
return 0; |
598 |
|
|
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
599 |
|
|
index 57c12ef..049b6e7 100644 |
600 |
|
|
--- a/drivers/usb/serial/ftdi_sio_ids.h |
601 |
|
|
+++ b/drivers/usb/serial/ftdi_sio_ids.h |
602 |
|
|
@@ -752,6 +752,12 @@ |
603 |
|
|
#define TTI_VID 0x103E /* Vendor Id */ |
604 |
|
|
#define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */ |
605 |
|
|
|
606 |
|
|
+/* |
607 |
|
|
+ * Newport Cooperation (www.newport.com) |
608 |
|
|
+ */ |
609 |
|
|
+#define NEWPORT_VID 0x104D |
610 |
|
|
+#define NEWPORT_AGILIS_PID 0x3000 |
611 |
|
|
+ |
612 |
|
|
/* Interbiometrics USB I/O Board */ |
613 |
|
|
/* Developed for Interbiometrics by Rudolf Gugler */ |
614 |
|
|
#define INTERBIOMETRICS_VID 0x1209 |
615 |
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
616 |
|
|
index 43aa36b..0c3d290 100644 |
617 |
|
|
--- a/drivers/usb/serial/option.c |
618 |
|
|
+++ b/drivers/usb/serial/option.c |
619 |
|
|
@@ -80,6 +80,7 @@ static void option_instat_callback(struct urb *urb); |
620 |
|
|
#define OPTION_PRODUCT_GTM380_MODEM 0x7201 |
621 |
|
|
|
622 |
|
|
#define HUAWEI_VENDOR_ID 0x12D1 |
623 |
|
|
+#define HUAWEI_PRODUCT_E173 0x140C |
624 |
|
|
#define HUAWEI_PRODUCT_K4505 0x1464 |
625 |
|
|
#define HUAWEI_PRODUCT_K3765 0x1465 |
626 |
|
|
#define HUAWEI_PRODUCT_K4605 0x14C6 |
627 |
|
|
@@ -552,6 +553,8 @@ static const struct usb_device_id option_ids[] = { |
628 |
|
|
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) }, |
629 |
|
|
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) }, |
630 |
|
|
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) }, |
631 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), |
632 |
|
|
+ .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, |
633 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff), |
634 |
|
|
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
635 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), |
636 |
|
|
@@ -883,6 +886,10 @@ static const struct usb_device_id option_ids[] = { |
637 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), |
638 |
|
|
.driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
639 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, |
640 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0135, 0xff, 0xff, 0xff) }, |
641 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0136, 0xff, 0xff, 0xff) }, |
642 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0137, 0xff, 0xff, 0xff) }, |
643 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0139, 0xff, 0xff, 0xff) }, |
644 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, |
645 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, |
646 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) }, |
647 |
|
|
@@ -903,20 +910,34 @@ static const struct usb_device_id option_ids[] = { |
648 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
649 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), |
650 |
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
651 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0189, 0xff, 0xff, 0xff) }, |
652 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ |
653 |
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
654 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0196, 0xff, 0xff, 0xff) }, |
655 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0197, 0xff, 0xff, 0xff) }, |
656 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ |
657 |
|
|
.driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
658 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0200, 0xff, 0xff, 0xff) }, |
659 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0201, 0xff, 0xff, 0xff) }, |
660 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0254, 0xff, 0xff, 0xff) }, |
661 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ |
662 |
|
|
.driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
663 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) }, |
664 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) }, |
665 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) }, |
666 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), |
667 |
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
668 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) }, |
669 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) }, |
670 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) }, |
671 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) }, |
672 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
673 |
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
674 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), |
675 |
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
676 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), |
677 |
|
|
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
678 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff) }, |
679 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), |
680 |
|
|
.driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
681 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
682 |
|
|
@@ -1096,6 +1117,10 @@ static const struct usb_device_id option_ids[] = { |
683 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
684 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
685 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
686 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1301, 0xff, 0xff, 0xff) }, |
687 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1302, 0xff, 0xff, 0xff) }, |
688 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1303, 0xff, 0xff, 0xff) }, |
689 |
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1333, 0xff, 0xff, 0xff) }, |
690 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), |
691 |
|
|
.driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
692 |
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), |
693 |
|
|
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig |
694 |
|
|
index 7691c86..685edc8 100644 |
695 |
|
|
--- a/drivers/usb/storage/Kconfig |
696 |
|
|
+++ b/drivers/usb/storage/Kconfig |
697 |
|
|
@@ -203,7 +203,7 @@ config USB_STORAGE_ENE_UB6250 |
698 |
|
|
|
699 |
|
|
config USB_UAS |
700 |
|
|
tristate "USB Attached SCSI" |
701 |
|
|
- depends on USB && SCSI |
702 |
|
|
+ depends on USB && SCSI && BROKEN |
703 |
|
|
help |
704 |
|
|
The USB Attached SCSI protocol is supported by some USB |
705 |
|
|
storage devices. It permits higher performance by supporting |
706 |
|
|
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h |
707 |
|
|
index 0abf1d4..fe07e5a 100644 |
708 |
|
|
--- a/include/linux/mempolicy.h |
709 |
|
|
+++ b/include/linux/mempolicy.h |
710 |
|
|
@@ -137,16 +137,6 @@ static inline void mpol_cond_put(struct mempolicy *pol) |
711 |
|
|
__mpol_put(pol); |
712 |
|
|
} |
713 |
|
|
|
714 |
|
|
-extern struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, |
715 |
|
|
- struct mempolicy *frompol); |
716 |
|
|
-static inline struct mempolicy *mpol_cond_copy(struct mempolicy *tompol, |
717 |
|
|
- struct mempolicy *frompol) |
718 |
|
|
-{ |
719 |
|
|
- if (!frompol) |
720 |
|
|
- return frompol; |
721 |
|
|
- return __mpol_cond_copy(tompol, frompol); |
722 |
|
|
-} |
723 |
|
|
- |
724 |
|
|
extern struct mempolicy *__mpol_dup(struct mempolicy *pol); |
725 |
|
|
static inline struct mempolicy *mpol_dup(struct mempolicy *pol) |
726 |
|
|
{ |
727 |
|
|
@@ -270,12 +260,6 @@ static inline void mpol_cond_put(struct mempolicy *pol) |
728 |
|
|
{ |
729 |
|
|
} |
730 |
|
|
|
731 |
|
|
-static inline struct mempolicy *mpol_cond_copy(struct mempolicy *to, |
732 |
|
|
- struct mempolicy *from) |
733 |
|
|
-{ |
734 |
|
|
- return from; |
735 |
|
|
-} |
736 |
|
|
- |
737 |
|
|
static inline void mpol_get(struct mempolicy *pol) |
738 |
|
|
{ |
739 |
|
|
} |
740 |
|
|
diff --git a/kernel/rcutree.c b/kernel/rcutree.c |
741 |
|
|
index 4eec66e..62c5e9c 100644 |
742 |
|
|
--- a/kernel/rcutree.c |
743 |
|
|
+++ b/kernel/rcutree.c |
744 |
|
|
@@ -202,13 +202,13 @@ DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = { |
745 |
|
|
.dynticks = ATOMIC_INIT(1), |
746 |
|
|
}; |
747 |
|
|
|
748 |
|
|
-static int blimit = 10; /* Maximum callbacks per rcu_do_batch. */ |
749 |
|
|
-static int qhimark = 10000; /* If this many pending, ignore blimit. */ |
750 |
|
|
-static int qlowmark = 100; /* Once only this many pending, use blimit. */ |
751 |
|
|
+static long blimit = 10; /* Maximum callbacks per rcu_do_batch. */ |
752 |
|
|
+static long qhimark = 10000; /* If this many pending, ignore blimit. */ |
753 |
|
|
+static long qlowmark = 100; /* Once only this many pending, use blimit. */ |
754 |
|
|
|
755 |
|
|
-module_param(blimit, int, 0); |
756 |
|
|
-module_param(qhimark, int, 0); |
757 |
|
|
-module_param(qlowmark, int, 0); |
758 |
|
|
+module_param(blimit, long, 0); |
759 |
|
|
+module_param(qhimark, long, 0); |
760 |
|
|
+module_param(qlowmark, long, 0); |
761 |
|
|
|
762 |
|
|
int rcu_cpu_stall_suppress __read_mostly; /* 1 = suppress stall warnings. */ |
763 |
|
|
int rcu_cpu_stall_timeout __read_mostly = CONFIG_RCU_CPU_STALL_TIMEOUT; |
764 |
|
|
@@ -1476,7 +1476,7 @@ static void rcu_do_batch(struct rcu_state *rsp, struct rcu_data *rdp) |
765 |
|
|
{ |
766 |
|
|
unsigned long flags; |
767 |
|
|
struct rcu_head *next, *list, **tail; |
768 |
|
|
- int bl, count, count_lazy; |
769 |
|
|
+ long bl, count, count_lazy; |
770 |
|
|
|
771 |
|
|
/* If no callbacks are ready, just return.*/ |
772 |
|
|
if (!cpu_has_callbacks_ready_to_invoke(rdp)) { |
773 |
|
|
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
774 |
|
|
index 0fa92f6..100b7fd 100644 |
775 |
|
|
--- a/kernel/trace/ftrace.c |
776 |
|
|
+++ b/kernel/trace/ftrace.c |
777 |
|
|
@@ -2368,7 +2368,7 @@ static void reset_iter_read(struct ftrace_iterator *iter) |
778 |
|
|
{ |
779 |
|
|
iter->pos = 0; |
780 |
|
|
iter->func_pos = 0; |
781 |
|
|
- iter->flags &= ~(FTRACE_ITER_PRINTALL & FTRACE_ITER_HASH); |
782 |
|
|
+ iter->flags &= ~(FTRACE_ITER_PRINTALL | FTRACE_ITER_HASH); |
783 |
|
|
} |
784 |
|
|
|
785 |
|
|
static void *t_start(struct seq_file *m, loff_t *pos) |
786 |
|
|
diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
787 |
|
|
index bcb9d34..a64b94e 100644 |
788 |
|
|
--- a/kernel/workqueue.c |
789 |
|
|
+++ b/kernel/workqueue.c |
790 |
|
|
@@ -1141,8 +1141,8 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, |
791 |
|
|
if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { |
792 |
|
|
unsigned int lcpu; |
793 |
|
|
|
794 |
|
|
- BUG_ON(timer_pending(timer)); |
795 |
|
|
- BUG_ON(!list_empty(&work->entry)); |
796 |
|
|
+ WARN_ON_ONCE(timer_pending(timer)); |
797 |
|
|
+ WARN_ON_ONCE(!list_empty(&work->entry)); |
798 |
|
|
|
799 |
|
|
timer_stats_timer_set_start_info(&dwork->timer); |
800 |
|
|
|
801 |
|
|
diff --git a/mm/dmapool.c b/mm/dmapool.c |
802 |
|
|
index c5ab33b..da1b0f0 100644 |
803 |
|
|
--- a/mm/dmapool.c |
804 |
|
|
+++ b/mm/dmapool.c |
805 |
|
|
@@ -50,7 +50,6 @@ struct dma_pool { /* the pool */ |
806 |
|
|
size_t allocation; |
807 |
|
|
size_t boundary; |
808 |
|
|
char name[32]; |
809 |
|
|
- wait_queue_head_t waitq; |
810 |
|
|
struct list_head pools; |
811 |
|
|
}; |
812 |
|
|
|
813 |
|
|
@@ -62,8 +61,6 @@ struct dma_page { /* cacheable header for 'allocation' bytes */ |
814 |
|
|
unsigned int offset; |
815 |
|
|
}; |
816 |
|
|
|
817 |
|
|
-#define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000) |
818 |
|
|
- |
819 |
|
|
static DEFINE_MUTEX(pools_lock); |
820 |
|
|
|
821 |
|
|
static ssize_t |
822 |
|
|
@@ -172,7 +169,6 @@ struct dma_pool *dma_pool_create(const char *name, struct device *dev, |
823 |
|
|
retval->size = size; |
824 |
|
|
retval->boundary = boundary; |
825 |
|
|
retval->allocation = allocation; |
826 |
|
|
- init_waitqueue_head(&retval->waitq); |
827 |
|
|
|
828 |
|
|
if (dev) { |
829 |
|
|
int ret; |
830 |
|
|
@@ -227,7 +223,6 @@ static struct dma_page *pool_alloc_page(struct dma_pool *pool, gfp_t mem_flags) |
831 |
|
|
memset(page->vaddr, POOL_POISON_FREED, pool->allocation); |
832 |
|
|
#endif |
833 |
|
|
pool_initialise_page(pool, page); |
834 |
|
|
- list_add(&page->page_list, &pool->page_list); |
835 |
|
|
page->in_use = 0; |
836 |
|
|
page->offset = 0; |
837 |
|
|
} else { |
838 |
|
|
@@ -315,30 +310,21 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, |
839 |
|
|
might_sleep_if(mem_flags & __GFP_WAIT); |
840 |
|
|
|
841 |
|
|
spin_lock_irqsave(&pool->lock, flags); |
842 |
|
|
- restart: |
843 |
|
|
list_for_each_entry(page, &pool->page_list, page_list) { |
844 |
|
|
if (page->offset < pool->allocation) |
845 |
|
|
goto ready; |
846 |
|
|
} |
847 |
|
|
- page = pool_alloc_page(pool, GFP_ATOMIC); |
848 |
|
|
- if (!page) { |
849 |
|
|
- if (mem_flags & __GFP_WAIT) { |
850 |
|
|
- DECLARE_WAITQUEUE(wait, current); |
851 |
|
|
|
852 |
|
|
- __set_current_state(TASK_UNINTERRUPTIBLE); |
853 |
|
|
- __add_wait_queue(&pool->waitq, &wait); |
854 |
|
|
- spin_unlock_irqrestore(&pool->lock, flags); |
855 |
|
|
+ /* pool_alloc_page() might sleep, so temporarily drop &pool->lock */ |
856 |
|
|
+ spin_unlock_irqrestore(&pool->lock, flags); |
857 |
|
|
|
858 |
|
|
- schedule_timeout(POOL_TIMEOUT_JIFFIES); |
859 |
|
|
+ page = pool_alloc_page(pool, mem_flags); |
860 |
|
|
+ if (!page) |
861 |
|
|
+ return NULL; |
862 |
|
|
|
863 |
|
|
- spin_lock_irqsave(&pool->lock, flags); |
864 |
|
|
- __remove_wait_queue(&pool->waitq, &wait); |
865 |
|
|
- goto restart; |
866 |
|
|
- } |
867 |
|
|
- retval = NULL; |
868 |
|
|
- goto done; |
869 |
|
|
- } |
870 |
|
|
+ spin_lock_irqsave(&pool->lock, flags); |
871 |
|
|
|
872 |
|
|
+ list_add(&page->page_list, &pool->page_list); |
873 |
|
|
ready: |
874 |
|
|
page->in_use++; |
875 |
|
|
offset = page->offset; |
876 |
|
|
@@ -348,7 +334,6 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, |
877 |
|
|
#ifdef DMAPOOL_DEBUG |
878 |
|
|
memset(retval, POOL_POISON_ALLOCATED, pool->size); |
879 |
|
|
#endif |
880 |
|
|
- done: |
881 |
|
|
spin_unlock_irqrestore(&pool->lock, flags); |
882 |
|
|
return retval; |
883 |
|
|
} |
884 |
|
|
@@ -435,8 +420,6 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma) |
885 |
|
|
page->in_use--; |
886 |
|
|
*(int *)vaddr = page->offset; |
887 |
|
|
page->offset = offset; |
888 |
|
|
- if (waitqueue_active(&pool->waitq)) |
889 |
|
|
- wake_up_locked(&pool->waitq); |
890 |
|
|
/* |
891 |
|
|
* Resist a temptation to do |
892 |
|
|
* if (!is_page_busy(page)) pool_free_page(pool, page); |
893 |
|
|
diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
894 |
|
|
index d1e4bef..458dede 100644 |
895 |
|
|
--- a/mm/mempolicy.c |
896 |
|
|
+++ b/mm/mempolicy.c |
897 |
|
|
@@ -2009,28 +2009,6 @@ struct mempolicy *__mpol_dup(struct mempolicy *old) |
898 |
|
|
return new; |
899 |
|
|
} |
900 |
|
|
|
901 |
|
|
-/* |
902 |
|
|
- * If *frompol needs [has] an extra ref, copy *frompol to *tompol , |
903 |
|
|
- * eliminate the * MPOL_F_* flags that require conditional ref and |
904 |
|
|
- * [NOTE!!!] drop the extra ref. Not safe to reference *frompol directly |
905 |
|
|
- * after return. Use the returned value. |
906 |
|
|
- * |
907 |
|
|
- * Allows use of a mempolicy for, e.g., multiple allocations with a single |
908 |
|
|
- * policy lookup, even if the policy needs/has extra ref on lookup. |
909 |
|
|
- * shmem_readahead needs this. |
910 |
|
|
- */ |
911 |
|
|
-struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, |
912 |
|
|
- struct mempolicy *frompol) |
913 |
|
|
-{ |
914 |
|
|
- if (!mpol_needs_cond_ref(frompol)) |
915 |
|
|
- return frompol; |
916 |
|
|
- |
917 |
|
|
- *tompol = *frompol; |
918 |
|
|
- tompol->flags &= ~MPOL_F_SHARED; /* copy doesn't need unref */ |
919 |
|
|
- __mpol_put(frompol); |
920 |
|
|
- return tompol; |
921 |
|
|
-} |
922 |
|
|
- |
923 |
|
|
/* Slow path of a mempolicy comparison */ |
924 |
|
|
bool __mpol_equal(struct mempolicy *a, struct mempolicy *b) |
925 |
|
|
{ |
926 |
|
|
diff --git a/mm/shmem.c b/mm/shmem.c |
927 |
|
|
index a859b06..a409bd8 100644 |
928 |
|
|
--- a/mm/shmem.c |
929 |
|
|
+++ b/mm/shmem.c |
930 |
|
|
@@ -798,24 +798,28 @@ static struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo) |
931 |
|
|
static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp, |
932 |
|
|
struct shmem_inode_info *info, pgoff_t index) |
933 |
|
|
{ |
934 |
|
|
- struct mempolicy mpol, *spol; |
935 |
|
|
struct vm_area_struct pvma; |
936 |
|
|
- |
937 |
|
|
- spol = mpol_cond_copy(&mpol, |
938 |
|
|
- mpol_shared_policy_lookup(&info->policy, index)); |
939 |
|
|
+ struct page *page; |
940 |
|
|
|
941 |
|
|
/* Create a pseudo vma that just contains the policy */ |
942 |
|
|
pvma.vm_start = 0; |
943 |
|
|
pvma.vm_pgoff = index; |
944 |
|
|
pvma.vm_ops = NULL; |
945 |
|
|
- pvma.vm_policy = spol; |
946 |
|
|
- return swapin_readahead(swap, gfp, &pvma, 0); |
947 |
|
|
+ pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
948 |
|
|
+ |
949 |
|
|
+ page = swapin_readahead(swap, gfp, &pvma, 0); |
950 |
|
|
+ |
951 |
|
|
+ /* Drop reference taken by mpol_shared_policy_lookup() */ |
952 |
|
|
+ mpol_cond_put(pvma.vm_policy); |
953 |
|
|
+ |
954 |
|
|
+ return page; |
955 |
|
|
} |
956 |
|
|
|
957 |
|
|
static struct page *shmem_alloc_page(gfp_t gfp, |
958 |
|
|
struct shmem_inode_info *info, pgoff_t index) |
959 |
|
|
{ |
960 |
|
|
struct vm_area_struct pvma; |
961 |
|
|
+ struct page *page; |
962 |
|
|
|
963 |
|
|
/* Create a pseudo vma that just contains the policy */ |
964 |
|
|
pvma.vm_start = 0; |
965 |
|
|
@@ -823,10 +827,12 @@ static struct page *shmem_alloc_page(gfp_t gfp, |
966 |
|
|
pvma.vm_ops = NULL; |
967 |
|
|
pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
968 |
|
|
|
969 |
|
|
- /* |
970 |
|
|
- * alloc_page_vma() will drop the shared policy reference |
971 |
|
|
- */ |
972 |
|
|
- return alloc_page_vma(gfp, &pvma, 0); |
973 |
|
|
+ page = alloc_page_vma(gfp, &pvma, 0); |
974 |
|
|
+ |
975 |
|
|
+ /* Drop reference taken by mpol_shared_policy_lookup() */ |
976 |
|
|
+ mpol_cond_put(pvma.vm_policy); |
977 |
|
|
+ |
978 |
|
|
+ return page; |
979 |
|
|
} |
980 |
|
|
#else /* !CONFIG_NUMA */ |
981 |
|
|
#ifdef CONFIG_TMPFS |
982 |
|
|
diff --git a/sound/soc/Makefile b/sound/soc/Makefile |
983 |
|
|
index 2feaf37..0f37086 100644 |
984 |
|
|
--- a/sound/soc/Makefile |
985 |
|
|
+++ b/sound/soc/Makefile |
986 |
|
|
@@ -1,8 +1,9 @@ |
987 |
|
|
snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o |
988 |
|
|
snd-soc-core-objs += soc-pcm.o soc-io.o |
989 |
|
|
|
990 |
|
|
-snd-soc-dmaengine-pcm-objs := soc-dmaengine-pcm.o |
991 |
|
|
-obj-$(CONFIG_SND_SOC_DMAENGINE_PCM) += snd-soc-dmaengine-pcm.o |
992 |
|
|
+ifneq ($(CONFIG_SND_SOC_DMAENGINE_PCM),) |
993 |
|
|
+snd-soc-core-objs += soc-dmaengine-pcm.o |
994 |
|
|
+endif |
995 |
|
|
|
996 |
|
|
obj-$(CONFIG_SND_SOC) += snd-soc-core.o |
997 |
|
|
obj-$(CONFIG_SND_SOC) += codecs/ |
998 |
|
|
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c |
999 |
|
|
index 223ffdc..3487b4b 100644 |
1000 |
|
|
--- a/tools/perf/builtin-test.c |
1001 |
|
|
+++ b/tools/perf/builtin-test.c |
1002 |
|
|
@@ -1154,19 +1154,13 @@ static int test__parse_events(void) |
1003 |
|
|
return ret; |
1004 |
|
|
} |
1005 |
|
|
|
1006 |
|
|
-static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t **maskp, |
1007 |
|
|
- size_t *sizep) |
1008 |
|
|
+static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t *maskp) |
1009 |
|
|
{ |
1010 |
|
|
- cpu_set_t *mask; |
1011 |
|
|
- size_t size; |
1012 |
|
|
int i, cpu = -1, nrcpus = 1024; |
1013 |
|
|
realloc: |
1014 |
|
|
- mask = CPU_ALLOC(nrcpus); |
1015 |
|
|
- size = CPU_ALLOC_SIZE(nrcpus); |
1016 |
|
|
- CPU_ZERO_S(size, mask); |
1017 |
|
|
+ CPU_ZERO(maskp); |
1018 |
|
|
|
1019 |
|
|
- if (sched_getaffinity(pid, size, mask) == -1) { |
1020 |
|
|
- CPU_FREE(mask); |
1021 |
|
|
+ if (sched_getaffinity(pid, sizeof(*maskp), maskp) == -1) { |
1022 |
|
|
if (errno == EINVAL && nrcpus < (1024 << 8)) { |
1023 |
|
|
nrcpus = nrcpus << 2; |
1024 |
|
|
goto realloc; |
1025 |
|
|
@@ -1176,19 +1170,14 @@ realloc: |
1026 |
|
|
} |
1027 |
|
|
|
1028 |
|
|
for (i = 0; i < nrcpus; i++) { |
1029 |
|
|
- if (CPU_ISSET_S(i, size, mask)) { |
1030 |
|
|
- if (cpu == -1) { |
1031 |
|
|
+ if (CPU_ISSET(i, maskp)) { |
1032 |
|
|
+ if (cpu == -1) |
1033 |
|
|
cpu = i; |
1034 |
|
|
- *maskp = mask; |
1035 |
|
|
- *sizep = size; |
1036 |
|
|
- } else |
1037 |
|
|
- CPU_CLR_S(i, size, mask); |
1038 |
|
|
+ else |
1039 |
|
|
+ CPU_CLR(i, maskp); |
1040 |
|
|
} |
1041 |
|
|
} |
1042 |
|
|
|
1043 |
|
|
- if (cpu == -1) |
1044 |
|
|
- CPU_FREE(mask); |
1045 |
|
|
- |
1046 |
|
|
return cpu; |
1047 |
|
|
} |
1048 |
|
|
|
1049 |
|
|
@@ -1199,8 +1188,8 @@ static int test__PERF_RECORD(void) |
1050 |
|
|
.freq = 10, |
1051 |
|
|
.mmap_pages = 256, |
1052 |
|
|
}; |
1053 |
|
|
- cpu_set_t *cpu_mask = NULL; |
1054 |
|
|
- size_t cpu_mask_size = 0; |
1055 |
|
|
+ cpu_set_t cpu_mask; |
1056 |
|
|
+ size_t cpu_mask_size = sizeof(cpu_mask); |
1057 |
|
|
struct perf_evlist *evlist = perf_evlist__new(NULL, NULL); |
1058 |
|
|
struct perf_evsel *evsel; |
1059 |
|
|
struct perf_sample sample; |
1060 |
|
|
@@ -1265,8 +1254,7 @@ static int test__PERF_RECORD(void) |
1061 |
|
|
evsel->attr.sample_type |= PERF_SAMPLE_TIME; |
1062 |
|
|
perf_evlist__config_attrs(evlist, &opts); |
1063 |
|
|
|
1064 |
|
|
- err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask, |
1065 |
|
|
- &cpu_mask_size); |
1066 |
|
|
+ err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); |
1067 |
|
|
if (err < 0) { |
1068 |
|
|
pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); |
1069 |
|
|
goto out_delete_evlist; |
1070 |
|
|
@@ -1277,9 +1265,9 @@ static int test__PERF_RECORD(void) |
1071 |
|
|
/* |
1072 |
|
|
* So that we can check perf_sample.cpu on all the samples. |
1073 |
|
|
*/ |
1074 |
|
|
- if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, cpu_mask) < 0) { |
1075 |
|
|
+ if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { |
1076 |
|
|
pr_debug("sched_setaffinity: %s\n", strerror(errno)); |
1077 |
|
|
- goto out_free_cpu_mask; |
1078 |
|
|
+ goto out_delete_evlist; |
1079 |
|
|
} |
1080 |
|
|
|
1081 |
|
|
/* |
1082 |
|
|
@@ -1472,8 +1460,6 @@ found_exit: |
1083 |
|
|
} |
1084 |
|
|
out_err: |
1085 |
|
|
perf_evlist__munmap(evlist); |
1086 |
|
|
-out_free_cpu_mask: |
1087 |
|
|
- CPU_FREE(cpu_mask); |
1088 |
|
|
out_delete_evlist: |
1089 |
|
|
perf_evlist__delete(evlist); |
1090 |
|
|
out: |