Contents of /trunk/kernel-magellan/patches-3.8/0107-3.8.8-all-fixes.patch
Parent Directory | Revision Log
Revision 2158 -
(show annotations)
(download)
Mon Apr 22 07:45:45 2013 UTC (11 years, 5 months ago) by niro
File size: 45313 byte(s)
Mon Apr 22 07:45:45 2013 UTC (11 years, 5 months ago) by niro
File size: 45313 byte(s)
-linux-3.8.8
1 | diff --git a/Makefile b/Makefile |
2 | index 85204da..7684f95 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 8 |
8 | -SUBLEVEL = 7 |
9 | +SUBLEVEL = 8 |
10 | EXTRAVERSION = |
11 | NAME = Displaced Humerus Anterior |
12 | |
13 | diff --git a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts |
14 | index 93c3afb..3694e94 100644 |
15 | --- a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts |
16 | +++ b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts |
17 | @@ -96,11 +96,11 @@ |
18 | marvell,function = "gpio"; |
19 | }; |
20 | pmx_led_rebuild_brt_ctrl_1: pmx-led-rebuild-brt-ctrl-1 { |
21 | - marvell,pins = "mpp44"; |
22 | + marvell,pins = "mpp46"; |
23 | marvell,function = "gpio"; |
24 | }; |
25 | pmx_led_rebuild_brt_ctrl_2: pmx-led-rebuild-brt-ctrl-2 { |
26 | - marvell,pins = "mpp45"; |
27 | + marvell,pins = "mpp47"; |
28 | marvell,function = "gpio"; |
29 | }; |
30 | |
31 | @@ -157,14 +157,14 @@ |
32 | gpios = <&gpio0 16 0>; |
33 | linux,default-trigger = "default-on"; |
34 | }; |
35 | - health_led1 { |
36 | + rebuild_led { |
37 | + label = "status:white:rebuild_led"; |
38 | + gpios = <&gpio1 4 0>; |
39 | + }; |
40 | + health_led { |
41 | label = "status:red:health_led"; |
42 | gpios = <&gpio1 5 0>; |
43 | }; |
44 | - health_led2 { |
45 | - label = "status:white:health_led"; |
46 | - gpios = <&gpio1 4 0>; |
47 | - }; |
48 | backup_led { |
49 | label = "status:blue:backup_led"; |
50 | gpios = <&gpio0 15 0>; |
51 | diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c |
52 | index f0727e8..0edce4b 100644 |
53 | --- a/arch/arm/mach-imx/clk-imx35.c |
54 | +++ b/arch/arm/mach-imx/clk-imx35.c |
55 | @@ -257,6 +257,7 @@ int __init mx35_clocks_init() |
56 | clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0"); |
57 | clk_register_clkdev(clk[nfc_div], NULL, "imx25-nand.0"); |
58 | clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0"); |
59 | + clk_register_clkdev(clk[admux_gate], "audmux", NULL); |
60 | |
61 | clk_prepare_enable(clk[spba_gate]); |
62 | clk_prepare_enable(clk[gpio1_gate]); |
63 | diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h |
64 | index 5edd174..7361e47 100644 |
65 | --- a/arch/x86/include/asm/paravirt.h |
66 | +++ b/arch/x86/include/asm/paravirt.h |
67 | @@ -703,7 +703,10 @@ static inline void arch_leave_lazy_mmu_mode(void) |
68 | PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave); |
69 | } |
70 | |
71 | -void arch_flush_lazy_mmu_mode(void); |
72 | +static inline void arch_flush_lazy_mmu_mode(void) |
73 | +{ |
74 | + PVOP_VCALL0(pv_mmu_ops.lazy_mode.flush); |
75 | +} |
76 | |
77 | static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, |
78 | phys_addr_t phys, pgprot_t flags) |
79 | diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h |
80 | index 142236e..b3b0ec1 100644 |
81 | --- a/arch/x86/include/asm/paravirt_types.h |
82 | +++ b/arch/x86/include/asm/paravirt_types.h |
83 | @@ -91,6 +91,7 @@ struct pv_lazy_ops { |
84 | /* Set deferred update mode, used for batching operations. */ |
85 | void (*enter)(void); |
86 | void (*leave)(void); |
87 | + void (*flush)(void); |
88 | }; |
89 | |
90 | struct pv_time_ops { |
91 | @@ -679,6 +680,7 @@ void paravirt_end_context_switch(struct task_struct *next); |
92 | |
93 | void paravirt_enter_lazy_mmu(void); |
94 | void paravirt_leave_lazy_mmu(void); |
95 | +void paravirt_flush_lazy_mmu(void); |
96 | |
97 | void _paravirt_nop(void); |
98 | u32 _paravirt_ident_32(u32); |
99 | diff --git a/arch/x86/include/asm/tlb.h b/arch/x86/include/asm/tlb.h |
100 | index 4fef207..c779730 100644 |
101 | --- a/arch/x86/include/asm/tlb.h |
102 | +++ b/arch/x86/include/asm/tlb.h |
103 | @@ -7,7 +7,7 @@ |
104 | |
105 | #define tlb_flush(tlb) \ |
106 | { \ |
107 | - if (tlb->fullmm == 0) \ |
108 | + if (!tlb->fullmm && !tlb->need_flush_all) \ |
109 | flush_tlb_mm_range(tlb->mm, tlb->start, tlb->end, 0UL); \ |
110 | else \ |
111 | flush_tlb_mm_range(tlb->mm, 0UL, TLB_FLUSH_ALL, 0UL); \ |
112 | diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c |
113 | index 17fff18..8bfb335 100644 |
114 | --- a/arch/x86/kernel/paravirt.c |
115 | +++ b/arch/x86/kernel/paravirt.c |
116 | @@ -263,6 +263,18 @@ void paravirt_leave_lazy_mmu(void) |
117 | leave_lazy(PARAVIRT_LAZY_MMU); |
118 | } |
119 | |
120 | +void paravirt_flush_lazy_mmu(void) |
121 | +{ |
122 | + preempt_disable(); |
123 | + |
124 | + if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { |
125 | + arch_leave_lazy_mmu_mode(); |
126 | + arch_enter_lazy_mmu_mode(); |
127 | + } |
128 | + |
129 | + preempt_enable(); |
130 | +} |
131 | + |
132 | void paravirt_start_context_switch(struct task_struct *prev) |
133 | { |
134 | BUG_ON(preemptible()); |
135 | @@ -292,18 +304,6 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void) |
136 | return this_cpu_read(paravirt_lazy_mode); |
137 | } |
138 | |
139 | -void arch_flush_lazy_mmu_mode(void) |
140 | -{ |
141 | - preempt_disable(); |
142 | - |
143 | - if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { |
144 | - arch_leave_lazy_mmu_mode(); |
145 | - arch_enter_lazy_mmu_mode(); |
146 | - } |
147 | - |
148 | - preempt_enable(); |
149 | -} |
150 | - |
151 | struct pv_info pv_info = { |
152 | .name = "bare hardware", |
153 | .paravirt_enabled = 0, |
154 | @@ -475,6 +475,7 @@ struct pv_mmu_ops pv_mmu_ops = { |
155 | .lazy_mode = { |
156 | .enter = paravirt_nop, |
157 | .leave = paravirt_nop, |
158 | + .flush = paravirt_nop, |
159 | }, |
160 | |
161 | .set_fixmap = native_set_fixmap, |
162 | diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c |
163 | index df4176c..20a4fd4 100644 |
164 | --- a/arch/x86/lguest/boot.c |
165 | +++ b/arch/x86/lguest/boot.c |
166 | @@ -1333,6 +1333,7 @@ __init void lguest_init(void) |
167 | pv_mmu_ops.read_cr3 = lguest_read_cr3; |
168 | pv_mmu_ops.lazy_mode.enter = paravirt_enter_lazy_mmu; |
169 | pv_mmu_ops.lazy_mode.leave = lguest_leave_lazy_mmu_mode; |
170 | + pv_mmu_ops.lazy_mode.flush = paravirt_flush_lazy_mmu; |
171 | pv_mmu_ops.pte_update = lguest_pte_update; |
172 | pv_mmu_ops.pte_update_defer = lguest_pte_update; |
173 | |
174 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c |
175 | index fb674fd..4f7d793 100644 |
176 | --- a/arch/x86/mm/fault.c |
177 | +++ b/arch/x86/mm/fault.c |
178 | @@ -378,10 +378,12 @@ static noinline __kprobes int vmalloc_fault(unsigned long address) |
179 | if (pgd_none(*pgd_ref)) |
180 | return -1; |
181 | |
182 | - if (pgd_none(*pgd)) |
183 | + if (pgd_none(*pgd)) { |
184 | set_pgd(pgd, *pgd_ref); |
185 | - else |
186 | + arch_flush_lazy_mmu_mode(); |
187 | + } else { |
188 | BUG_ON(pgd_page_vaddr(*pgd) != pgd_page_vaddr(*pgd_ref)); |
189 | + } |
190 | |
191 | /* |
192 | * Below here mismatches are bugs because these lower tables |
193 | diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c |
194 | index e27fbf8..395b3b4 100644 |
195 | --- a/arch/x86/mm/pgtable.c |
196 | +++ b/arch/x86/mm/pgtable.c |
197 | @@ -58,6 +58,13 @@ void ___pte_free_tlb(struct mmu_gather *tlb, struct page *pte) |
198 | void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) |
199 | { |
200 | paravirt_release_pmd(__pa(pmd) >> PAGE_SHIFT); |
201 | + /* |
202 | + * NOTE! For PAE, any changes to the top page-directory-pointer-table |
203 | + * entries need a full cr3 reload to flush. |
204 | + */ |
205 | +#ifdef CONFIG_X86_PAE |
206 | + tlb->need_flush_all = 1; |
207 | +#endif |
208 | tlb_remove_page(tlb, virt_to_page(pmd)); |
209 | } |
210 | |
211 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
212 | index 01de35c..cab96b6 100644 |
213 | --- a/arch/x86/xen/mmu.c |
214 | +++ b/arch/x86/xen/mmu.c |
215 | @@ -2190,6 +2190,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = { |
216 | .lazy_mode = { |
217 | .enter = paravirt_enter_lazy_mmu, |
218 | .leave = xen_leave_lazy_mmu, |
219 | + .flush = paravirt_flush_lazy_mmu, |
220 | }, |
221 | |
222 | .set_fixmap = xen_set_fixmap, |
223 | diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c |
224 | index 5a31264..8607724 100644 |
225 | --- a/drivers/dma/omap-dma.c |
226 | +++ b/drivers/dma/omap-dma.c |
227 | @@ -276,12 +276,20 @@ static void omap_dma_issue_pending(struct dma_chan *chan) |
228 | |
229 | spin_lock_irqsave(&c->vc.lock, flags); |
230 | if (vchan_issue_pending(&c->vc) && !c->desc) { |
231 | - struct omap_dmadev *d = to_omap_dma_dev(chan->device); |
232 | - spin_lock(&d->lock); |
233 | - if (list_empty(&c->node)) |
234 | - list_add_tail(&c->node, &d->pending); |
235 | - spin_unlock(&d->lock); |
236 | - tasklet_schedule(&d->task); |
237 | + /* |
238 | + * c->cyclic is used only by audio and in this case the DMA need |
239 | + * to be started without delay. |
240 | + */ |
241 | + if (!c->cyclic) { |
242 | + struct omap_dmadev *d = to_omap_dma_dev(chan->device); |
243 | + spin_lock(&d->lock); |
244 | + if (list_empty(&c->node)) |
245 | + list_add_tail(&c->node, &d->pending); |
246 | + spin_unlock(&d->lock); |
247 | + tasklet_schedule(&d->task); |
248 | + } else { |
249 | + omap_dma_start_desc(c); |
250 | + } |
251 | } |
252 | spin_unlock_irqrestore(&c->vc.lock, flags); |
253 | } |
254 | diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c |
255 | index d542a14..ea537fa 100644 |
256 | --- a/drivers/gpio/gpiolib-of.c |
257 | +++ b/drivers/gpio/gpiolib-of.c |
258 | @@ -228,7 +228,7 @@ static void of_gpiochip_add_pin_range(struct gpio_chip *chip) |
259 | if (!np) |
260 | return; |
261 | |
262 | - do { |
263 | + for (;; index++) { |
264 | ret = of_parse_phandle_with_args(np, "gpio-ranges", |
265 | "#gpio-range-cells", index, &pinspec); |
266 | if (ret) |
267 | @@ -257,8 +257,7 @@ static void of_gpiochip_add_pin_range(struct gpio_chip *chip) |
268 | |
269 | if (ret) |
270 | break; |
271 | - |
272 | - } while (index++); |
273 | + } |
274 | } |
275 | |
276 | #else |
277 | diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c |
278 | index fe5cdbc..b44d548 100644 |
279 | --- a/drivers/gpu/drm/udl/udl_connector.c |
280 | +++ b/drivers/gpu/drm/udl/udl_connector.c |
281 | @@ -61,6 +61,10 @@ static int udl_get_modes(struct drm_connector *connector) |
282 | int ret; |
283 | |
284 | edid = (struct edid *)udl_get_edid(udl); |
285 | + if (!edid) { |
286 | + drm_mode_connector_update_edid_property(connector, NULL); |
287 | + return 0; |
288 | + } |
289 | |
290 | /* |
291 | * We only read the main block, but if the monitor reports extension |
292 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c |
293 | index 21a8242..18d3764 100644 |
294 | --- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c |
295 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c |
296 | @@ -1137,9 +1137,8 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi, |
297 | gain0_15 = ((biq1 & 0xf) << 12) | |
298 | ((tia & 0xf) << 8) | |
299 | ((lna2 & 0x3) << 6) | |
300 | - ((lna2 & 0x3) << 4) | |
301 | - ((lna1 & 0x3) << 2) | |
302 | - ((lna1 & 0x3) << 0); |
303 | + ((lna2 & |
304 | + 0x3) << 4) | ((lna1 & 0x3) << 2) | ((lna1 & 0x3) << 0); |
305 | |
306 | mod_phy_reg(pi, 0x4b6, (0xffff << 0), gain0_15 << 0); |
307 | mod_phy_reg(pi, 0x4b7, (0xf << 0), gain16_19 << 0); |
308 | @@ -1157,8 +1156,6 @@ wlc_lcnphy_set_rx_gain_by_distribution(struct brcms_phy *pi, |
309 | } |
310 | |
311 | mod_phy_reg(pi, 0x44d, (0x1 << 0), (!trsw) << 0); |
312 | - mod_phy_reg(pi, 0x4b1, (0x3 << 11), lna1 << 11); |
313 | - mod_phy_reg(pi, 0x4e6, (0x3 << 3), lna1 << 3); |
314 | |
315 | } |
316 | |
317 | @@ -1331,43 +1328,6 @@ static u32 wlc_lcnphy_measure_digital_power(struct brcms_phy *pi, u16 nsamples) |
318 | return (iq_est.i_pwr + iq_est.q_pwr) / nsamples; |
319 | } |
320 | |
321 | -static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain, |
322 | - u16 tia_gain, u16 lna2_gain) |
323 | -{ |
324 | - u32 i_thresh_l, q_thresh_l; |
325 | - u32 i_thresh_h, q_thresh_h; |
326 | - struct lcnphy_iq_est iq_est_h, iq_est_l; |
327 | - |
328 | - wlc_lcnphy_set_rx_gain_by_distribution(pi, 0, 0, 0, biq1_gain, tia_gain, |
329 | - lna2_gain, 0); |
330 | - |
331 | - wlc_lcnphy_rx_gain_override_enable(pi, true); |
332 | - wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0); |
333 | - udelay(500); |
334 | - write_radio_reg(pi, RADIO_2064_REG112, 0); |
335 | - if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l)) |
336 | - return false; |
337 | - |
338 | - wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0); |
339 | - udelay(500); |
340 | - write_radio_reg(pi, RADIO_2064_REG112, 0); |
341 | - if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h)) |
342 | - return false; |
343 | - |
344 | - i_thresh_l = (iq_est_l.i_pwr << 1); |
345 | - i_thresh_h = (iq_est_l.i_pwr << 2) + iq_est_l.i_pwr; |
346 | - |
347 | - q_thresh_l = (iq_est_l.q_pwr << 1); |
348 | - q_thresh_h = (iq_est_l.q_pwr << 2) + iq_est_l.q_pwr; |
349 | - if ((iq_est_h.i_pwr > i_thresh_l) && |
350 | - (iq_est_h.i_pwr < i_thresh_h) && |
351 | - (iq_est_h.q_pwr > q_thresh_l) && |
352 | - (iq_est_h.q_pwr < q_thresh_h)) |
353 | - return true; |
354 | - |
355 | - return false; |
356 | -} |
357 | - |
358 | static bool |
359 | wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, |
360 | const struct lcnphy_rx_iqcomp *iqcomp, |
361 | @@ -1382,8 +1342,8 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, |
362 | RFOverrideVal0_old, rfoverride2_old, rfoverride2val_old, |
363 | rfoverride3_old, rfoverride3val_old, rfoverride4_old, |
364 | rfoverride4val_old, afectrlovr_old, afectrlovrval_old; |
365 | - int tia_gain, lna2_gain, biq1_gain; |
366 | - bool set_gain; |
367 | + int tia_gain; |
368 | + u32 received_power, rx_pwr_threshold; |
369 | u16 old_sslpnCalibClkEnCtrl, old_sslpnRxFeClkEnCtrl; |
370 | u16 values_to_save[11]; |
371 | s16 *ptr; |
372 | @@ -1408,134 +1368,126 @@ wlc_lcnphy_rx_iq_cal(struct brcms_phy *pi, |
373 | goto cal_done; |
374 | } |
375 | |
376 | - WARN_ON(module != 1); |
377 | - tx_pwr_ctrl = wlc_lcnphy_get_tx_pwr_ctrl(pi); |
378 | - wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF); |
379 | - |
380 | - for (i = 0; i < 11; i++) |
381 | - values_to_save[i] = |
382 | - read_radio_reg(pi, rxiq_cal_rf_reg[i]); |
383 | - Core1TxControl_old = read_phy_reg(pi, 0x631); |
384 | - |
385 | - or_phy_reg(pi, 0x631, 0x0015); |
386 | - |
387 | - RFOverride0_old = read_phy_reg(pi, 0x44c); |
388 | - RFOverrideVal0_old = read_phy_reg(pi, 0x44d); |
389 | - rfoverride2_old = read_phy_reg(pi, 0x4b0); |
390 | - rfoverride2val_old = read_phy_reg(pi, 0x4b1); |
391 | - rfoverride3_old = read_phy_reg(pi, 0x4f9); |
392 | - rfoverride3val_old = read_phy_reg(pi, 0x4fa); |
393 | - rfoverride4_old = read_phy_reg(pi, 0x938); |
394 | - rfoverride4val_old = read_phy_reg(pi, 0x939); |
395 | - afectrlovr_old = read_phy_reg(pi, 0x43b); |
396 | - afectrlovrval_old = read_phy_reg(pi, 0x43c); |
397 | - old_sslpnCalibClkEnCtrl = read_phy_reg(pi, 0x6da); |
398 | - old_sslpnRxFeClkEnCtrl = read_phy_reg(pi, 0x6db); |
399 | - |
400 | - tx_gain_override_old = wlc_lcnphy_tx_gain_override_enabled(pi); |
401 | - if (tx_gain_override_old) { |
402 | - wlc_lcnphy_get_tx_gain(pi, &old_gains); |
403 | - tx_gain_index_old = pi_lcn->lcnphy_current_index; |
404 | - } |
405 | - |
406 | - wlc_lcnphy_set_tx_pwr_by_index(pi, tx_gain_idx); |
407 | + if (module == 1) { |
408 | |
409 | - mod_phy_reg(pi, 0x4f9, (0x1 << 0), 1 << 0); |
410 | - mod_phy_reg(pi, 0x4fa, (0x1 << 0), 0 << 0); |
411 | + tx_pwr_ctrl = wlc_lcnphy_get_tx_pwr_ctrl(pi); |
412 | + wlc_lcnphy_set_tx_pwr_ctrl(pi, LCNPHY_TX_PWR_CTRL_OFF); |
413 | |
414 | - mod_phy_reg(pi, 0x43b, (0x1 << 1), 1 << 1); |
415 | - mod_phy_reg(pi, 0x43c, (0x1 << 1), 0 << 1); |
416 | + for (i = 0; i < 11; i++) |
417 | + values_to_save[i] = |
418 | + read_radio_reg(pi, rxiq_cal_rf_reg[i]); |
419 | + Core1TxControl_old = read_phy_reg(pi, 0x631); |
420 | + |
421 | + or_phy_reg(pi, 0x631, 0x0015); |
422 | + |
423 | + RFOverride0_old = read_phy_reg(pi, 0x44c); |
424 | + RFOverrideVal0_old = read_phy_reg(pi, 0x44d); |
425 | + rfoverride2_old = read_phy_reg(pi, 0x4b0); |
426 | + rfoverride2val_old = read_phy_reg(pi, 0x4b1); |
427 | + rfoverride3_old = read_phy_reg(pi, 0x4f9); |
428 | + rfoverride3val_old = read_phy_reg(pi, 0x4fa); |
429 | + rfoverride4_old = read_phy_reg(pi, 0x938); |
430 | + rfoverride4val_old = read_phy_reg(pi, 0x939); |
431 | + afectrlovr_old = read_phy_reg(pi, 0x43b); |
432 | + afectrlovrval_old = read_phy_reg(pi, 0x43c); |
433 | + old_sslpnCalibClkEnCtrl = read_phy_reg(pi, 0x6da); |
434 | + old_sslpnRxFeClkEnCtrl = read_phy_reg(pi, 0x6db); |
435 | + |
436 | + tx_gain_override_old = wlc_lcnphy_tx_gain_override_enabled(pi); |
437 | + if (tx_gain_override_old) { |
438 | + wlc_lcnphy_get_tx_gain(pi, &old_gains); |
439 | + tx_gain_index_old = pi_lcn->lcnphy_current_index; |
440 | + } |
441 | |
442 | - write_radio_reg(pi, RADIO_2064_REG116, 0x06); |
443 | - write_radio_reg(pi, RADIO_2064_REG12C, 0x07); |
444 | - write_radio_reg(pi, RADIO_2064_REG06A, 0xd3); |
445 | - write_radio_reg(pi, RADIO_2064_REG098, 0x03); |
446 | - write_radio_reg(pi, RADIO_2064_REG00B, 0x7); |
447 | - mod_radio_reg(pi, RADIO_2064_REG113, 1 << 4, 1 << 4); |
448 | - write_radio_reg(pi, RADIO_2064_REG01D, 0x01); |
449 | - write_radio_reg(pi, RADIO_2064_REG114, 0x01); |
450 | - write_radio_reg(pi, RADIO_2064_REG02E, 0x10); |
451 | - write_radio_reg(pi, RADIO_2064_REG12A, 0x08); |
452 | - |
453 | - mod_phy_reg(pi, 0x938, (0x1 << 0), 1 << 0); |
454 | - mod_phy_reg(pi, 0x939, (0x1 << 0), 0 << 0); |
455 | - mod_phy_reg(pi, 0x938, (0x1 << 1), 1 << 1); |
456 | - mod_phy_reg(pi, 0x939, (0x1 << 1), 1 << 1); |
457 | - mod_phy_reg(pi, 0x938, (0x1 << 2), 1 << 2); |
458 | - mod_phy_reg(pi, 0x939, (0x1 << 2), 1 << 2); |
459 | - mod_phy_reg(pi, 0x938, (0x1 << 3), 1 << 3); |
460 | - mod_phy_reg(pi, 0x939, (0x1 << 3), 1 << 3); |
461 | - mod_phy_reg(pi, 0x938, (0x1 << 5), 1 << 5); |
462 | - mod_phy_reg(pi, 0x939, (0x1 << 5), 0 << 5); |
463 | + wlc_lcnphy_set_tx_pwr_by_index(pi, tx_gain_idx); |
464 | |
465 | - mod_phy_reg(pi, 0x43b, (0x1 << 0), 1 << 0); |
466 | - mod_phy_reg(pi, 0x43c, (0x1 << 0), 0 << 0); |
467 | + mod_phy_reg(pi, 0x4f9, (0x1 << 0), 1 << 0); |
468 | + mod_phy_reg(pi, 0x4fa, (0x1 << 0), 0 << 0); |
469 | |
470 | - write_phy_reg(pi, 0x6da, 0xffff); |
471 | - or_phy_reg(pi, 0x6db, 0x3); |
472 | + mod_phy_reg(pi, 0x43b, (0x1 << 1), 1 << 1); |
473 | + mod_phy_reg(pi, 0x43c, (0x1 << 1), 0 << 1); |
474 | |
475 | - wlc_lcnphy_set_trsw_override(pi, tx_switch, rx_switch); |
476 | - set_gain = false; |
477 | - |
478 | - lna2_gain = 3; |
479 | - while ((lna2_gain >= 0) && !set_gain) { |
480 | - tia_gain = 4; |
481 | - |
482 | - while ((tia_gain >= 0) && !set_gain) { |
483 | - biq1_gain = 6; |
484 | - |
485 | - while ((biq1_gain >= 0) && !set_gain) { |
486 | - set_gain = wlc_lcnphy_rx_iq_cal_gain(pi, |
487 | - (u16) |
488 | - biq1_gain, |
489 | - (u16) |
490 | - tia_gain, |
491 | - (u16) |
492 | - lna2_gain); |
493 | - biq1_gain -= 1; |
494 | - } |
495 | + write_radio_reg(pi, RADIO_2064_REG116, 0x06); |
496 | + write_radio_reg(pi, RADIO_2064_REG12C, 0x07); |
497 | + write_radio_reg(pi, RADIO_2064_REG06A, 0xd3); |
498 | + write_radio_reg(pi, RADIO_2064_REG098, 0x03); |
499 | + write_radio_reg(pi, RADIO_2064_REG00B, 0x7); |
500 | + mod_radio_reg(pi, RADIO_2064_REG113, 1 << 4, 1 << 4); |
501 | + write_radio_reg(pi, RADIO_2064_REG01D, 0x01); |
502 | + write_radio_reg(pi, RADIO_2064_REG114, 0x01); |
503 | + write_radio_reg(pi, RADIO_2064_REG02E, 0x10); |
504 | + write_radio_reg(pi, RADIO_2064_REG12A, 0x08); |
505 | + |
506 | + mod_phy_reg(pi, 0x938, (0x1 << 0), 1 << 0); |
507 | + mod_phy_reg(pi, 0x939, (0x1 << 0), 0 << 0); |
508 | + mod_phy_reg(pi, 0x938, (0x1 << 1), 1 << 1); |
509 | + mod_phy_reg(pi, 0x939, (0x1 << 1), 1 << 1); |
510 | + mod_phy_reg(pi, 0x938, (0x1 << 2), 1 << 2); |
511 | + mod_phy_reg(pi, 0x939, (0x1 << 2), 1 << 2); |
512 | + mod_phy_reg(pi, 0x938, (0x1 << 3), 1 << 3); |
513 | + mod_phy_reg(pi, 0x939, (0x1 << 3), 1 << 3); |
514 | + mod_phy_reg(pi, 0x938, (0x1 << 5), 1 << 5); |
515 | + mod_phy_reg(pi, 0x939, (0x1 << 5), 0 << 5); |
516 | + |
517 | + mod_phy_reg(pi, 0x43b, (0x1 << 0), 1 << 0); |
518 | + mod_phy_reg(pi, 0x43c, (0x1 << 0), 0 << 0); |
519 | + |
520 | + wlc_lcnphy_start_tx_tone(pi, 2000, 120, 0); |
521 | + write_phy_reg(pi, 0x6da, 0xffff); |
522 | + or_phy_reg(pi, 0x6db, 0x3); |
523 | + wlc_lcnphy_set_trsw_override(pi, tx_switch, rx_switch); |
524 | + wlc_lcnphy_rx_gain_override_enable(pi, true); |
525 | + |
526 | + tia_gain = 8; |
527 | + rx_pwr_threshold = 950; |
528 | + while (tia_gain > 0) { |
529 | tia_gain -= 1; |
530 | + wlc_lcnphy_set_rx_gain_by_distribution(pi, |
531 | + 0, 0, 2, 2, |
532 | + (u16) |
533 | + tia_gain, 1, 0); |
534 | + udelay(500); |
535 | + |
536 | + received_power = |
537 | + wlc_lcnphy_measure_digital_power(pi, 2000); |
538 | + if (received_power < rx_pwr_threshold) |
539 | + break; |
540 | } |
541 | - lna2_gain -= 1; |
542 | - } |
543 | + result = wlc_lcnphy_calc_rx_iq_comp(pi, 0xffff); |
544 | |
545 | - if (set_gain) |
546 | - result = wlc_lcnphy_calc_rx_iq_comp(pi, 1024); |
547 | - else |
548 | - result = false; |
549 | + wlc_lcnphy_stop_tx_tone(pi); |
550 | |
551 | - wlc_lcnphy_stop_tx_tone(pi); |
552 | + write_phy_reg(pi, 0x631, Core1TxControl_old); |
553 | |
554 | - write_phy_reg(pi, 0x631, Core1TxControl_old); |
555 | - |
556 | - write_phy_reg(pi, 0x44c, RFOverrideVal0_old); |
557 | - write_phy_reg(pi, 0x44d, RFOverrideVal0_old); |
558 | - write_phy_reg(pi, 0x4b0, rfoverride2_old); |
559 | - write_phy_reg(pi, 0x4b1, rfoverride2val_old); |
560 | - write_phy_reg(pi, 0x4f9, rfoverride3_old); |
561 | - write_phy_reg(pi, 0x4fa, rfoverride3val_old); |
562 | - write_phy_reg(pi, 0x938, rfoverride4_old); |
563 | - write_phy_reg(pi, 0x939, rfoverride4val_old); |
564 | - write_phy_reg(pi, 0x43b, afectrlovr_old); |
565 | - write_phy_reg(pi, 0x43c, afectrlovrval_old); |
566 | - write_phy_reg(pi, 0x6da, old_sslpnCalibClkEnCtrl); |
567 | - write_phy_reg(pi, 0x6db, old_sslpnRxFeClkEnCtrl); |
568 | + write_phy_reg(pi, 0x44c, RFOverrideVal0_old); |
569 | + write_phy_reg(pi, 0x44d, RFOverrideVal0_old); |
570 | + write_phy_reg(pi, 0x4b0, rfoverride2_old); |
571 | + write_phy_reg(pi, 0x4b1, rfoverride2val_old); |
572 | + write_phy_reg(pi, 0x4f9, rfoverride3_old); |
573 | + write_phy_reg(pi, 0x4fa, rfoverride3val_old); |
574 | + write_phy_reg(pi, 0x938, rfoverride4_old); |
575 | + write_phy_reg(pi, 0x939, rfoverride4val_old); |
576 | + write_phy_reg(pi, 0x43b, afectrlovr_old); |
577 | + write_phy_reg(pi, 0x43c, afectrlovrval_old); |
578 | + write_phy_reg(pi, 0x6da, old_sslpnCalibClkEnCtrl); |
579 | + write_phy_reg(pi, 0x6db, old_sslpnRxFeClkEnCtrl); |
580 | |
581 | - wlc_lcnphy_clear_trsw_override(pi); |
582 | + wlc_lcnphy_clear_trsw_override(pi); |
583 | |
584 | - mod_phy_reg(pi, 0x44c, (0x1 << 2), 0 << 2); |
585 | + mod_phy_reg(pi, 0x44c, (0x1 << 2), 0 << 2); |
586 | |
587 | - for (i = 0; i < 11; i++) |
588 | - write_radio_reg(pi, rxiq_cal_rf_reg[i], |
589 | - values_to_save[i]); |
590 | + for (i = 0; i < 11; i++) |
591 | + write_radio_reg(pi, rxiq_cal_rf_reg[i], |
592 | + values_to_save[i]); |
593 | |
594 | - if (tx_gain_override_old) |
595 | - wlc_lcnphy_set_tx_pwr_by_index(pi, tx_gain_index_old); |
596 | - else |
597 | - wlc_lcnphy_disable_tx_gain_override(pi); |
598 | + if (tx_gain_override_old) |
599 | + wlc_lcnphy_set_tx_pwr_by_index(pi, tx_gain_index_old); |
600 | + else |
601 | + wlc_lcnphy_disable_tx_gain_override(pi); |
602 | |
603 | - wlc_lcnphy_set_tx_pwr_ctrl(pi, tx_pwr_ctrl); |
604 | - wlc_lcnphy_rx_gain_override_enable(pi, false); |
605 | + wlc_lcnphy_set_tx_pwr_ctrl(pi, tx_pwr_ctrl); |
606 | + wlc_lcnphy_rx_gain_override_enable(pi, false); |
607 | + } |
608 | |
609 | cal_done: |
610 | kfree(ptr); |
611 | @@ -1829,17 +1781,6 @@ wlc_lcnphy_radio_2064_channel_tune_4313(struct brcms_phy *pi, u8 channel) |
612 | write_radio_reg(pi, RADIO_2064_REG038, 3); |
613 | write_radio_reg(pi, RADIO_2064_REG091, 7); |
614 | } |
615 | - |
616 | - if (!(pi->sh->boardflags & BFL_FEM)) { |
617 | - u8 reg038[14] = {0xd, 0xe, 0xd, 0xd, 0xd, 0xc, |
618 | - 0xa, 0xb, 0xb, 0x3, 0x3, 0x2, 0x0, 0x0}; |
619 | - |
620 | - write_radio_reg(pi, RADIO_2064_REG02A, 0xf); |
621 | - write_radio_reg(pi, RADIO_2064_REG091, 0x3); |
622 | - write_radio_reg(pi, RADIO_2064_REG038, 0x3); |
623 | - |
624 | - write_radio_reg(pi, RADIO_2064_REG038, reg038[channel - 1]); |
625 | - } |
626 | } |
627 | |
628 | static int |
629 | @@ -2034,16 +1975,6 @@ wlc_lcnphy_set_tssi_mux(struct brcms_phy *pi, enum lcnphy_tssi_mode pos) |
630 | } else { |
631 | mod_radio_reg(pi, RADIO_2064_REG03A, 1, 0x1); |
632 | mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8); |
633 | - mod_radio_reg(pi, RADIO_2064_REG028, 0x1, 0x0); |
634 | - mod_radio_reg(pi, RADIO_2064_REG11A, 0x4, 1<<2); |
635 | - mod_radio_reg(pi, RADIO_2064_REG036, 0x10, 0x0); |
636 | - mod_radio_reg(pi, RADIO_2064_REG11A, 0x10, 1<<4); |
637 | - mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0); |
638 | - mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x77); |
639 | - mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, 0xe<<1); |
640 | - mod_radio_reg(pi, RADIO_2064_REG112, 0x80, 1<<7); |
641 | - mod_radio_reg(pi, RADIO_2064_REG005, 0x7, 1<<1); |
642 | - mod_radio_reg(pi, RADIO_2064_REG029, 0xf0, 0<<4); |
643 | } |
644 | } else { |
645 | mod_phy_reg(pi, 0x4d9, (0x1 << 2), (0x1) << 2); |
646 | @@ -2130,14 +2061,12 @@ static void wlc_lcnphy_pwrctrl_rssiparams(struct brcms_phy *pi) |
647 | (auxpga_vmid_temp << 0) | (auxpga_gain_temp << 12)); |
648 | |
649 | mod_radio_reg(pi, RADIO_2064_REG082, (1 << 5), (1 << 5)); |
650 | - mod_radio_reg(pi, RADIO_2064_REG07C, (1 << 0), (1 << 0)); |
651 | } |
652 | |
653 | static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) |
654 | { |
655 | struct phytbl_info tab; |
656 | u32 rfseq, ind; |
657 | - u8 tssi_sel; |
658 | |
659 | tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL; |
660 | tab.tbl_width = 32; |
661 | @@ -2159,13 +2088,7 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) |
662 | |
663 | mod_phy_reg(pi, 0x503, (0x1 << 4), (1) << 4); |
664 | |
665 | - if (pi->sh->boardflags & BFL_FEM) { |
666 | - tssi_sel = 0x1; |
667 | - wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_EXT); |
668 | - } else { |
669 | - tssi_sel = 0xe; |
670 | - wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_POST_PA); |
671 | - } |
672 | + wlc_lcnphy_set_tssi_mux(pi, LCNPHY_TSSI_EXT); |
673 | mod_phy_reg(pi, 0x4a4, (0x1 << 14), (0) << 14); |
674 | |
675 | mod_phy_reg(pi, 0x4a4, (0x1 << 15), (1) << 15); |
676 | @@ -2201,10 +2124,9 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) |
677 | mod_phy_reg(pi, 0x49a, (0x1ff << 0), (0xff) << 0); |
678 | |
679 | if (LCNREV_IS(pi->pubpi.phy_rev, 2)) { |
680 | - mod_radio_reg(pi, RADIO_2064_REG028, 0xf, tssi_sel); |
681 | + mod_radio_reg(pi, RADIO_2064_REG028, 0xf, 0xe); |
682 | mod_radio_reg(pi, RADIO_2064_REG086, 0x4, 0x4); |
683 | } else { |
684 | - mod_radio_reg(pi, RADIO_2064_REG028, 0x1e, tssi_sel << 1); |
685 | mod_radio_reg(pi, RADIO_2064_REG03A, 0x1, 1); |
686 | mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 1 << 3); |
687 | } |
688 | @@ -2251,10 +2173,6 @@ static void wlc_lcnphy_tssi_setup(struct brcms_phy *pi) |
689 | |
690 | mod_phy_reg(pi, 0x4d7, (0xf << 8), (0) << 8); |
691 | |
692 | - mod_radio_reg(pi, RADIO_2064_REG035, 0xff, 0x0); |
693 | - mod_radio_reg(pi, RADIO_2064_REG036, 0x3, 0x0); |
694 | - mod_radio_reg(pi, RADIO_2064_REG11A, 0x8, 0x8); |
695 | - |
696 | wlc_lcnphy_pwrctrl_rssiparams(pi); |
697 | } |
698 | |
699 | @@ -2873,8 +2791,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) |
700 | read_radio_reg(pi, RADIO_2064_REG007) & 1; |
701 | u16 SAVE_jtag_auxpga = read_radio_reg(pi, RADIO_2064_REG0FF) & 0x10; |
702 | u16 SAVE_iqadc_aux_en = read_radio_reg(pi, RADIO_2064_REG11F) & 4; |
703 | - u8 SAVE_bbmult = wlc_lcnphy_get_bbmult(pi); |
704 | - |
705 | idleTssi = read_phy_reg(pi, 0x4ab); |
706 | suspend = (0 == (bcma_read32(pi->d11core, D11REGOFFS(maccontrol)) & |
707 | MCTL_EN_MAC)); |
708 | @@ -2892,12 +2808,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) |
709 | mod_radio_reg(pi, RADIO_2064_REG0FF, 0x10, 1 << 4); |
710 | mod_radio_reg(pi, RADIO_2064_REG11F, 0x4, 1 << 2); |
711 | wlc_lcnphy_tssi_setup(pi); |
712 | - |
713 | - mod_phy_reg(pi, 0x4d7, (0x1 << 0), (1 << 0)); |
714 | - mod_phy_reg(pi, 0x4d7, (0x1 << 6), (1 << 6)); |
715 | - |
716 | - wlc_lcnphy_set_bbmult(pi, 0x0); |
717 | - |
718 | wlc_phy_do_dummy_tx(pi, true, OFF); |
719 | idleTssi = ((read_phy_reg(pi, 0x4ab) & (0x1ff << 0)) |
720 | >> 0); |
721 | @@ -2919,7 +2829,6 @@ static void wlc_lcnphy_idle_tssi_est(struct brcms_phy_pub *ppi) |
722 | |
723 | mod_phy_reg(pi, 0x44c, (0x1 << 12), (0) << 12); |
724 | |
725 | - wlc_lcnphy_set_bbmult(pi, SAVE_bbmult); |
726 | wlc_lcnphy_set_tx_gain_override(pi, tx_gain_override_old); |
727 | wlc_lcnphy_set_tx_gain(pi, &old_gains); |
728 | wlc_lcnphy_set_tx_pwr_ctrl(pi, SAVE_txpwrctrl); |
729 | @@ -3133,11 +3042,6 @@ static void wlc_lcnphy_tx_pwr_ctrl_init(struct brcms_phy_pub *ppi) |
730 | wlc_lcnphy_write_table(pi, &tab); |
731 | tab.tbl_offset++; |
732 | } |
733 | - mod_phy_reg(pi, 0x4d0, (0x1 << 0), (0) << 0); |
734 | - mod_phy_reg(pi, 0x4d3, (0xff << 0), (0) << 0); |
735 | - mod_phy_reg(pi, 0x4d3, (0xff << 8), (0) << 8); |
736 | - mod_phy_reg(pi, 0x4d0, (0x1 << 4), (0) << 4); |
737 | - mod_phy_reg(pi, 0x4d0, (0x1 << 2), (0) << 2); |
738 | |
739 | mod_phy_reg(pi, 0x410, (0x1 << 7), (0) << 7); |
740 | |
741 | @@ -3939,6 +3843,7 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi) |
742 | target_gains.pad_gain = 21; |
743 | target_gains.dac_gain = 0; |
744 | wlc_lcnphy_set_tx_gain(pi, &target_gains); |
745 | + wlc_lcnphy_set_tx_pwr_by_index(pi, 16); |
746 | |
747 | if (LCNREV_IS(pi->pubpi.phy_rev, 1) || pi_lcn->lcnphy_hw_iqcal_en) { |
748 | |
749 | @@ -3949,7 +3854,6 @@ static void wlc_lcnphy_txpwrtbl_iqlo_cal(struct brcms_phy *pi) |
750 | lcnphy_recal ? LCNPHY_CAL_RECAL : |
751 | LCNPHY_CAL_FULL), false); |
752 | } else { |
753 | - wlc_lcnphy_set_tx_pwr_by_index(pi, 16); |
754 | wlc_lcnphy_tx_iqlo_soft_cal_full(pi); |
755 | } |
756 | |
757 | @@ -4374,22 +4278,17 @@ wlc_lcnphy_load_tx_gain_table(struct brcms_phy *pi, |
758 | if (CHSPEC_IS5G(pi->radio_chanspec)) |
759 | pa_gain = 0x70; |
760 | else |
761 | - pa_gain = 0x60; |
762 | + pa_gain = 0x70; |
763 | |
764 | if (pi->sh->boardflags & BFL_FEM) |
765 | pa_gain = 0x10; |
766 | - |
767 | tab.tbl_id = LCNPHY_TBL_ID_TXPWRCTL; |
768 | tab.tbl_width = 32; |
769 | tab.tbl_len = 1; |
770 | tab.tbl_ptr = &val; |
771 | |
772 | for (j = 0; j < 128; j++) { |
773 | - if (pi->sh->boardflags & BFL_FEM) |
774 | - gm_gain = gain_table[j].gm; |
775 | - else |
776 | - gm_gain = 15; |
777 | - |
778 | + gm_gain = gain_table[j].gm; |
779 | val = (((u32) pa_gain << 24) | |
780 | (gain_table[j].pad << 16) | |
781 | (gain_table[j].pga << 8) | gm_gain); |
782 | @@ -4600,10 +4499,7 @@ static void wlc_radio_2064_init(struct brcms_phy *pi) |
783 | |
784 | write_phy_reg(pi, 0x4ea, 0x4688); |
785 | |
786 | - if (pi->sh->boardflags & BFL_FEM) |
787 | - mod_phy_reg(pi, 0x4eb, (0x7 << 0), 2 << 0); |
788 | - else |
789 | - mod_phy_reg(pi, 0x4eb, (0x7 << 0), 3 << 0); |
790 | + mod_phy_reg(pi, 0x4eb, (0x7 << 0), 2 << 0); |
791 | |
792 | mod_phy_reg(pi, 0x4eb, (0x7 << 6), 0 << 6); |
793 | |
794 | @@ -4614,13 +4510,6 @@ static void wlc_radio_2064_init(struct brcms_phy *pi) |
795 | wlc_lcnphy_rcal(pi); |
796 | |
797 | wlc_lcnphy_rc_cal(pi); |
798 | - |
799 | - if (!(pi->sh->boardflags & BFL_FEM)) { |
800 | - write_radio_reg(pi, RADIO_2064_REG032, 0x6f); |
801 | - write_radio_reg(pi, RADIO_2064_REG033, 0x19); |
802 | - write_radio_reg(pi, RADIO_2064_REG039, 0xe); |
803 | - } |
804 | - |
805 | } |
806 | |
807 | static void wlc_lcnphy_radio_init(struct brcms_phy *pi) |
808 | @@ -4650,20 +4539,22 @@ static void wlc_lcnphy_tbl_init(struct brcms_phy *pi) |
809 | wlc_lcnphy_write_table(pi, &tab); |
810 | } |
811 | |
812 | - if (!(pi->sh->boardflags & BFL_FEM)) { |
813 | - tab.tbl_id = LCNPHY_TBL_ID_RFSEQ; |
814 | - tab.tbl_width = 16; |
815 | - tab.tbl_ptr = &val; |
816 | - tab.tbl_len = 1; |
817 | + tab.tbl_id = LCNPHY_TBL_ID_RFSEQ; |
818 | + tab.tbl_width = 16; |
819 | + tab.tbl_ptr = &val; |
820 | + tab.tbl_len = 1; |
821 | |
822 | - val = 150; |
823 | - tab.tbl_offset = 0; |
824 | - wlc_lcnphy_write_table(pi, &tab); |
825 | + val = 114; |
826 | + tab.tbl_offset = 0; |
827 | + wlc_lcnphy_write_table(pi, &tab); |
828 | |
829 | - val = 220; |
830 | - tab.tbl_offset = 1; |
831 | - wlc_lcnphy_write_table(pi, &tab); |
832 | - } |
833 | + val = 130; |
834 | + tab.tbl_offset = 1; |
835 | + wlc_lcnphy_write_table(pi, &tab); |
836 | + |
837 | + val = 6; |
838 | + tab.tbl_offset = 8; |
839 | + wlc_lcnphy_write_table(pi, &tab); |
840 | |
841 | if (CHSPEC_IS2G(pi->radio_chanspec)) { |
842 | if (pi->sh->boardflags & BFL_FEM) |
843 | @@ -5055,7 +4946,6 @@ void wlc_phy_chanspec_set_lcnphy(struct brcms_phy *pi, u16 chanspec) |
844 | wlc_lcnphy_load_tx_iir_filter(pi, true, 3); |
845 | |
846 | mod_phy_reg(pi, 0x4eb, (0x7 << 3), (1) << 3); |
847 | - wlc_lcnphy_tssi_setup(pi); |
848 | } |
849 | |
850 | void wlc_phy_detach_lcnphy(struct brcms_phy *pi) |
851 | @@ -5094,7 +4984,8 @@ bool wlc_phy_attach_lcnphy(struct brcms_phy *pi) |
852 | if (!wlc_phy_txpwr_srom_read_lcnphy(pi)) |
853 | return false; |
854 | |
855 | - if (LCNREV_IS(pi->pubpi.phy_rev, 1)) { |
856 | + if ((pi->sh->boardflags & BFL_FEM) && |
857 | + (LCNREV_IS(pi->pubpi.phy_rev, 1))) { |
858 | if (pi_lcn->lcnphy_tempsense_option == 3) { |
859 | pi->hwpwrctrl = true; |
860 | pi->hwpwrctrl_capable = true; |
861 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phytbl_lcn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phytbl_lcn.c |
862 | index b7e95ac..622c01c 100644 |
863 | --- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phytbl_lcn.c |
864 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phytbl_lcn.c |
865 | @@ -1992,70 +1992,70 @@ static const u16 dot11lcn_sw_ctrl_tbl_4313_epa_rev0[] = { |
866 | }; |
867 | |
868 | static const u16 dot11lcn_sw_ctrl_tbl_4313_rev0[] = { |
869 | - 0x0009, |
870 | 0x000a, |
871 | - 0x0005, |
872 | - 0x0006, |
873 | 0x0009, |
874 | - 0x000a, |
875 | - 0x0005, |
876 | 0x0006, |
877 | - 0x0009, |
878 | - 0x000a, |
879 | 0x0005, |
880 | - 0x0006, |
881 | - 0x0009, |
882 | 0x000a, |
883 | - 0x0005, |
884 | - 0x0006, |
885 | 0x0009, |
886 | - 0x000a, |
887 | - 0x0005, |
888 | 0x0006, |
889 | - 0x0009, |
890 | - 0x000a, |
891 | 0x0005, |
892 | - 0x0006, |
893 | - 0x0009, |
894 | 0x000a, |
895 | - 0x0005, |
896 | - 0x0006, |
897 | 0x0009, |
898 | - 0x000a, |
899 | - 0x0005, |
900 | 0x0006, |
901 | - 0x0009, |
902 | - 0x000a, |
903 | 0x0005, |
904 | - 0x0006, |
905 | - 0x0009, |
906 | 0x000a, |
907 | - 0x0005, |
908 | - 0x0006, |
909 | 0x0009, |
910 | - 0x000a, |
911 | - 0x0005, |
912 | 0x0006, |
913 | - 0x0009, |
914 | - 0x000a, |
915 | 0x0005, |
916 | - 0x0006, |
917 | + 0x000a, |
918 | 0x0009, |
919 | + 0x0006, |
920 | + 0x0005, |
921 | 0x000a, |
922 | + 0x0009, |
923 | + 0x0006, |
924 | 0x0005, |
925 | + 0x000a, |
926 | + 0x0009, |
927 | 0x0006, |
928 | + 0x0005, |
929 | + 0x000a, |
930 | 0x0009, |
931 | + 0x0006, |
932 | + 0x0005, |
933 | 0x000a, |
934 | + 0x0009, |
935 | + 0x0006, |
936 | 0x0005, |
937 | + 0x000a, |
938 | + 0x0009, |
939 | 0x0006, |
940 | + 0x0005, |
941 | + 0x000a, |
942 | 0x0009, |
943 | + 0x0006, |
944 | + 0x0005, |
945 | 0x000a, |
946 | + 0x0009, |
947 | + 0x0006, |
948 | 0x0005, |
949 | + 0x000a, |
950 | + 0x0009, |
951 | 0x0006, |
952 | + 0x0005, |
953 | + 0x000a, |
954 | 0x0009, |
955 | + 0x0006, |
956 | + 0x0005, |
957 | 0x000a, |
958 | + 0x0009, |
959 | + 0x0006, |
960 | 0x0005, |
961 | + 0x000a, |
962 | + 0x0009, |
963 | 0x0006, |
964 | + 0x0005, |
965 | }; |
966 | |
967 | static const u16 dot11lcn_sw_ctrl_tbl_rev0[] = { |
968 | diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c |
969 | index aec2e0d..1924d8b 100644 |
970 | --- a/drivers/scsi/libsas/sas_expander.c |
971 | +++ b/drivers/scsi/libsas/sas_expander.c |
972 | @@ -235,6 +235,17 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp) |
973 | linkrate = phy->linkrate; |
974 | memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE); |
975 | |
976 | + /* Handle vacant phy - rest of dr data is not valid so skip it */ |
977 | + if (phy->phy_state == PHY_VACANT) { |
978 | + memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE); |
979 | + phy->attached_dev_type = NO_DEVICE; |
980 | + if (!test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) { |
981 | + phy->phy_id = phy_id; |
982 | + goto skip; |
983 | + } else |
984 | + goto out; |
985 | + } |
986 | + |
987 | phy->attached_dev_type = to_dev_type(dr); |
988 | if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) |
989 | goto out; |
990 | @@ -272,6 +283,7 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp) |
991 | phy->phy->maximum_linkrate = dr->pmax_linkrate; |
992 | phy->phy->negotiated_linkrate = phy->linkrate; |
993 | |
994 | + skip: |
995 | if (new_phy) |
996 | if (sas_phy_add(phy->phy)) { |
997 | sas_phy_free(phy->phy); |
998 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c |
999 | index 7d4ec02..fea564c 100644 |
1000 | --- a/drivers/target/target_core_alua.c |
1001 | +++ b/drivers/target/target_core_alua.c |
1002 | @@ -408,6 +408,7 @@ static inline int core_alua_state_standby( |
1003 | case REPORT_LUNS: |
1004 | case RECEIVE_DIAGNOSTIC: |
1005 | case SEND_DIAGNOSTIC: |
1006 | + return 0; |
1007 | case MAINTENANCE_IN: |
1008 | switch (cdb[1] & 0x1f) { |
1009 | case MI_REPORT_TARGET_PGS: |
1010 | @@ -450,6 +451,7 @@ static inline int core_alua_state_unavailable( |
1011 | switch (cdb[0]) { |
1012 | case INQUIRY: |
1013 | case REPORT_LUNS: |
1014 | + return 0; |
1015 | case MAINTENANCE_IN: |
1016 | switch (cdb[1] & 0x1f) { |
1017 | case MI_REPORT_TARGET_PGS: |
1018 | @@ -490,6 +492,7 @@ static inline int core_alua_state_transition( |
1019 | switch (cdb[0]) { |
1020 | case INQUIRY: |
1021 | case REPORT_LUNS: |
1022 | + return 0; |
1023 | case MAINTENANCE_IN: |
1024 | switch (cdb[1] & 0x1f) { |
1025 | case MI_REPORT_TARGET_PGS: |
1026 | diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c |
1027 | index c578229..78f1be2 100644 |
1028 | --- a/drivers/tty/tty_ldisc.c |
1029 | +++ b/drivers/tty/tty_ldisc.c |
1030 | @@ -934,17 +934,17 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty) |
1031 | * race with the set_ldisc code path. |
1032 | */ |
1033 | |
1034 | - tty_lock_pair(tty, o_tty); |
1035 | tty_ldisc_halt(tty); |
1036 | - tty_ldisc_flush_works(tty); |
1037 | - if (o_tty) { |
1038 | + if (o_tty) |
1039 | tty_ldisc_halt(o_tty); |
1040 | + |
1041 | + tty_ldisc_flush_works(tty); |
1042 | + if (o_tty) |
1043 | tty_ldisc_flush_works(o_tty); |
1044 | - } |
1045 | |
1046 | + tty_lock_pair(tty, o_tty); |
1047 | /* This will need doing differently if we need to lock */ |
1048 | tty_ldisc_kill(tty); |
1049 | - |
1050 | if (o_tty) |
1051 | tty_ldisc_kill(o_tty); |
1052 | |
1053 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
1054 | index 12b3da3..f7199b9 100644 |
1055 | --- a/fs/cifs/connect.c |
1056 | +++ b/fs/cifs/connect.c |
1057 | @@ -1546,14 +1546,24 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, |
1058 | } |
1059 | break; |
1060 | case Opt_blank_pass: |
1061 | - vol->password = NULL; |
1062 | - break; |
1063 | - case Opt_pass: |
1064 | /* passwords have to be handled differently |
1065 | * to allow the character used for deliminator |
1066 | * to be passed within them |
1067 | */ |
1068 | |
1069 | + /* |
1070 | + * Check if this is a case where the password |
1071 | + * starts with a delimiter |
1072 | + */ |
1073 | + tmp_end = strchr(data, '='); |
1074 | + tmp_end++; |
1075 | + if (!(tmp_end < end && tmp_end[1] == delim)) { |
1076 | + /* No it is not. Set the password to NULL */ |
1077 | + vol->password = NULL; |
1078 | + break; |
1079 | + } |
1080 | + /* Yes it is. Drop down to Opt_pass below.*/ |
1081 | + case Opt_pass: |
1082 | /* Obtain the value string */ |
1083 | value = strchr(data, '='); |
1084 | value++; |
1085 | diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c |
1086 | index 991ab2d..7af426b 100644 |
1087 | --- a/fs/gfs2/file.c |
1088 | +++ b/fs/gfs2/file.c |
1089 | @@ -924,8 +924,11 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) |
1090 | cmd = F_SETLK; |
1091 | fl->fl_type = F_UNLCK; |
1092 | } |
1093 | - if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) |
1094 | + if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) { |
1095 | + if (fl->fl_type == F_UNLCK) |
1096 | + posix_lock_file_wait(file, fl); |
1097 | return -EIO; |
1098 | + } |
1099 | if (IS_GETLK(cmd)) |
1100 | return dlm_posix_get(ls->ls_dlm, ip->i_no_addr, file, fl); |
1101 | else if (fl->fl_type == F_UNLCK) |
1102 | diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c |
1103 | index b7eff07..9afba3d6 100644 |
1104 | --- a/fs/gfs2/rgrp.c |
1105 | +++ b/fs/gfs2/rgrp.c |
1106 | @@ -576,7 +576,7 @@ int gfs2_rs_alloc(struct gfs2_inode *ip) |
1107 | RB_CLEAR_NODE(&ip->i_res->rs_node); |
1108 | out: |
1109 | up_write(&ip->i_rw_mutex); |
1110 | - return 0; |
1111 | + return error; |
1112 | } |
1113 | |
1114 | static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) |
1115 | diff --git a/fs/inode.c b/fs/inode.c |
1116 | index 14084b7..b98540e 100644 |
1117 | --- a/fs/inode.c |
1118 | +++ b/fs/inode.c |
1119 | @@ -725,7 +725,7 @@ void prune_icache_sb(struct super_block *sb, int nr_to_scan) |
1120 | * inode to the back of the list so we don't spin on it. |
1121 | */ |
1122 | if (!spin_trylock(&inode->i_lock)) { |
1123 | - list_move_tail(&inode->i_lru, &sb->s_inode_lru); |
1124 | + list_move(&inode->i_lru, &sb->s_inode_lru); |
1125 | continue; |
1126 | } |
1127 | |
1128 | diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h |
1129 | index 25f01d0..b1b1fa6 100644 |
1130 | --- a/include/asm-generic/tlb.h |
1131 | +++ b/include/asm-generic/tlb.h |
1132 | @@ -99,7 +99,12 @@ struct mmu_gather { |
1133 | unsigned int need_flush : 1, /* Did free PTEs */ |
1134 | fast_mode : 1; /* No batching */ |
1135 | |
1136 | - unsigned int fullmm; |
1137 | + /* we are in the middle of an operation to clear |
1138 | + * a full mm and can make some optimizations */ |
1139 | + unsigned int fullmm : 1, |
1140 | + /* we have performed an operation which |
1141 | + * requires a complete flush of the tlb */ |
1142 | + need_flush_all : 1; |
1143 | |
1144 | struct mmu_gather_batch *active; |
1145 | struct mmu_gather_batch local; |
1146 | diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h |
1147 | index 92691d8..616603d 100644 |
1148 | --- a/include/linux/ftrace.h |
1149 | +++ b/include/linux/ftrace.h |
1150 | @@ -394,7 +394,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf, |
1151 | size_t cnt, loff_t *ppos); |
1152 | ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf, |
1153 | size_t cnt, loff_t *ppos); |
1154 | -loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int whence); |
1155 | int ftrace_regex_release(struct inode *inode, struct file *file); |
1156 | |
1157 | void __init |
1158 | @@ -567,6 +566,8 @@ static inline int |
1159 | ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } |
1160 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
1161 | |
1162 | +loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); |
1163 | + |
1164 | /* totally disable ftrace - can not re-enable after this */ |
1165 | void ftrace_kill(void); |
1166 | |
1167 | diff --git a/ipc/msg.c b/ipc/msg.c |
1168 | index 31cd1bf..fede1d0 100644 |
1169 | --- a/ipc/msg.c |
1170 | +++ b/ipc/msg.c |
1171 | @@ -872,6 +872,7 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, |
1172 | goto out_unlock; |
1173 | break; |
1174 | } |
1175 | + msg = ERR_PTR(-EAGAIN); |
1176 | } else |
1177 | break; |
1178 | msg_counter++; |
1179 | diff --git a/kernel/sched/clock.c b/kernel/sched/clock.c |
1180 | index c685e31..c3ae144 100644 |
1181 | --- a/kernel/sched/clock.c |
1182 | +++ b/kernel/sched/clock.c |
1183 | @@ -176,10 +176,36 @@ static u64 sched_clock_remote(struct sched_clock_data *scd) |
1184 | u64 this_clock, remote_clock; |
1185 | u64 *ptr, old_val, val; |
1186 | |
1187 | +#if BITS_PER_LONG != 64 |
1188 | +again: |
1189 | + /* |
1190 | + * Careful here: The local and the remote clock values need to |
1191 | + * be read out atomic as we need to compare the values and |
1192 | + * then update either the local or the remote side. So the |
1193 | + * cmpxchg64 below only protects one readout. |
1194 | + * |
1195 | + * We must reread via sched_clock_local() in the retry case on |
1196 | + * 32bit as an NMI could use sched_clock_local() via the |
1197 | + * tracer and hit between the readout of |
1198 | + * the low32bit and the high 32bit portion. |
1199 | + */ |
1200 | + this_clock = sched_clock_local(my_scd); |
1201 | + /* |
1202 | + * We must enforce atomic readout on 32bit, otherwise the |
1203 | + * update on the remote cpu can hit inbetween the readout of |
1204 | + * the low32bit and the high 32bit portion. |
1205 | + */ |
1206 | + remote_clock = cmpxchg64(&scd->clock, 0, 0); |
1207 | +#else |
1208 | + /* |
1209 | + * On 64bit the read of [my]scd->clock is atomic versus the |
1210 | + * update, so we can avoid the above 32bit dance. |
1211 | + */ |
1212 | sched_clock_local(my_scd); |
1213 | again: |
1214 | this_clock = my_scd->clock; |
1215 | remote_clock = scd->clock; |
1216 | +#endif |
1217 | |
1218 | /* |
1219 | * Use the opportunity that we have both locks |
1220 | diff --git a/kernel/sys.c b/kernel/sys.c |
1221 | index 265b376..47f1d1b 100644 |
1222 | --- a/kernel/sys.c |
1223 | +++ b/kernel/sys.c |
1224 | @@ -323,7 +323,6 @@ void kernel_restart_prepare(char *cmd) |
1225 | system_state = SYSTEM_RESTART; |
1226 | usermodehelper_disable(); |
1227 | device_shutdown(); |
1228 | - syscore_shutdown(); |
1229 | } |
1230 | |
1231 | /** |
1232 | @@ -369,6 +368,7 @@ void kernel_restart(char *cmd) |
1233 | { |
1234 | kernel_restart_prepare(cmd); |
1235 | disable_nonboot_cpus(); |
1236 | + syscore_shutdown(); |
1237 | if (!cmd) |
1238 | printk(KERN_EMERG "Restarting system.\n"); |
1239 | else |
1240 | @@ -394,6 +394,7 @@ static void kernel_shutdown_prepare(enum system_states state) |
1241 | void kernel_halt(void) |
1242 | { |
1243 | kernel_shutdown_prepare(SYSTEM_HALT); |
1244 | + disable_nonboot_cpus(); |
1245 | syscore_shutdown(); |
1246 | printk(KERN_EMERG "System halted.\n"); |
1247 | kmsg_dump(KMSG_DUMP_HALT); |
1248 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
1249 | index 64bc5d8..35cc3a8 100644 |
1250 | --- a/kernel/trace/ftrace.c |
1251 | +++ b/kernel/trace/ftrace.c |
1252 | @@ -668,7 +668,6 @@ int ftrace_profile_pages_init(struct ftrace_profile_stat *stat) |
1253 | free_page(tmp); |
1254 | } |
1255 | |
1256 | - free_page((unsigned long)stat->pages); |
1257 | stat->pages = NULL; |
1258 | stat->start = NULL; |
1259 | |
1260 | @@ -1028,6 +1027,19 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer) |
1261 | |
1262 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; |
1263 | |
1264 | +loff_t |
1265 | +ftrace_filter_lseek(struct file *file, loff_t offset, int whence) |
1266 | +{ |
1267 | + loff_t ret; |
1268 | + |
1269 | + if (file->f_mode & FMODE_READ) |
1270 | + ret = seq_lseek(file, offset, whence); |
1271 | + else |
1272 | + file->f_pos = ret = 1; |
1273 | + |
1274 | + return ret; |
1275 | +} |
1276 | + |
1277 | #ifdef CONFIG_DYNAMIC_FTRACE |
1278 | |
1279 | #ifndef CONFIG_FTRACE_MCOUNT_RECORD |
1280 | @@ -2590,7 +2602,7 @@ static void ftrace_filter_reset(struct ftrace_hash *hash) |
1281 | * routine, you can use ftrace_filter_write() for the write |
1282 | * routine if @flag has FTRACE_ITER_FILTER set, or |
1283 | * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set. |
1284 | - * ftrace_regex_lseek() should be used as the lseek routine, and |
1285 | + * ftrace_filter_lseek() should be used as the lseek routine, and |
1286 | * release must call ftrace_regex_release(). |
1287 | */ |
1288 | int |
1289 | @@ -2674,19 +2686,6 @@ ftrace_notrace_open(struct inode *inode, struct file *file) |
1290 | inode, file); |
1291 | } |
1292 | |
1293 | -loff_t |
1294 | -ftrace_regex_lseek(struct file *file, loff_t offset, int whence) |
1295 | -{ |
1296 | - loff_t ret; |
1297 | - |
1298 | - if (file->f_mode & FMODE_READ) |
1299 | - ret = seq_lseek(file, offset, whence); |
1300 | - else |
1301 | - file->f_pos = ret = 1; |
1302 | - |
1303 | - return ret; |
1304 | -} |
1305 | - |
1306 | static int ftrace_match(char *str, char *regex, int len, int type) |
1307 | { |
1308 | int matched = 0; |
1309 | @@ -3549,7 +3548,7 @@ static const struct file_operations ftrace_filter_fops = { |
1310 | .open = ftrace_filter_open, |
1311 | .read = seq_read, |
1312 | .write = ftrace_filter_write, |
1313 | - .llseek = ftrace_regex_lseek, |
1314 | + .llseek = ftrace_filter_lseek, |
1315 | .release = ftrace_regex_release, |
1316 | }; |
1317 | |
1318 | @@ -3557,7 +3556,7 @@ static const struct file_operations ftrace_notrace_fops = { |
1319 | .open = ftrace_notrace_open, |
1320 | .read = seq_read, |
1321 | .write = ftrace_notrace_write, |
1322 | - .llseek = ftrace_regex_lseek, |
1323 | + .llseek = ftrace_filter_lseek, |
1324 | .release = ftrace_regex_release, |
1325 | }; |
1326 | |
1327 | @@ -3762,8 +3761,8 @@ static const struct file_operations ftrace_graph_fops = { |
1328 | .open = ftrace_graph_open, |
1329 | .read = seq_read, |
1330 | .write = ftrace_graph_write, |
1331 | + .llseek = ftrace_filter_lseek, |
1332 | .release = ftrace_graph_release, |
1333 | - .llseek = seq_lseek, |
1334 | }; |
1335 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
1336 | |
1337 | @@ -4421,7 +4420,7 @@ static const struct file_operations ftrace_pid_fops = { |
1338 | .open = ftrace_pid_open, |
1339 | .write = ftrace_pid_write, |
1340 | .read = seq_read, |
1341 | - .llseek = seq_lseek, |
1342 | + .llseek = ftrace_filter_lseek, |
1343 | .release = ftrace_pid_release, |
1344 | }; |
1345 | |
1346 | diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c |
1347 | index 42ca822..83a8b5b 100644 |
1348 | --- a/kernel/trace/trace_stack.c |
1349 | +++ b/kernel/trace/trace_stack.c |
1350 | @@ -322,7 +322,7 @@ static const struct file_operations stack_trace_filter_fops = { |
1351 | .open = stack_trace_filter_open, |
1352 | .read = seq_read, |
1353 | .write = ftrace_filter_write, |
1354 | - .llseek = ftrace_regex_lseek, |
1355 | + .llseek = ftrace_filter_lseek, |
1356 | .release = ftrace_regex_release, |
1357 | }; |
1358 | |
1359 | diff --git a/lib/kobject.c b/lib/kobject.c |
1360 | index e07ee1f..a654866 100644 |
1361 | --- a/lib/kobject.c |
1362 | +++ b/lib/kobject.c |
1363 | @@ -529,6 +529,13 @@ struct kobject *kobject_get(struct kobject *kobj) |
1364 | return kobj; |
1365 | } |
1366 | |
1367 | +static struct kobject *kobject_get_unless_zero(struct kobject *kobj) |
1368 | +{ |
1369 | + if (!kref_get_unless_zero(&kobj->kref)) |
1370 | + kobj = NULL; |
1371 | + return kobj; |
1372 | +} |
1373 | + |
1374 | /* |
1375 | * kobject_cleanup - free kobject resources. |
1376 | * @kobj: object to cleanup |
1377 | @@ -751,7 +758,7 @@ struct kobject *kset_find_obj(struct kset *kset, const char *name) |
1378 | |
1379 | list_for_each_entry(k, &kset->list, entry) { |
1380 | if (kobject_name(k) && !strcmp(kobject_name(k), name)) { |
1381 | - ret = kobject_get(k); |
1382 | + ret = kobject_get_unless_zero(k); |
1383 | break; |
1384 | } |
1385 | } |
1386 | diff --git a/mm/memory.c b/mm/memory.c |
1387 | index bb1369f..f8b734a 100644 |
1388 | --- a/mm/memory.c |
1389 | +++ b/mm/memory.c |
1390 | @@ -212,6 +212,7 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm) |
1391 | tlb->mm = mm; |
1392 | |
1393 | tlb->fullmm = fullmm; |
1394 | + tlb->need_flush_all = 0; |
1395 | tlb->start = -1UL; |
1396 | tlb->end = 0; |
1397 | tlb->need_flush = 0; |
1398 | diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c |
1399 | index 1440b3f..b54c2e8 100644 |
1400 | --- a/sound/soc/codecs/wm5102.c |
1401 | +++ b/sound/soc/codecs/wm5102.c |
1402 | @@ -576,7 +576,7 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, |
1403 | struct snd_kcontrol *kcontrol, int event) |
1404 | { |
1405 | struct snd_soc_codec *codec = w->codec; |
1406 | - struct arizona *arizona = dev_get_drvdata(codec->dev); |
1407 | + struct arizona *arizona = dev_get_drvdata(codec->dev->parent); |
1408 | struct regmap *regmap = codec->control_data; |
1409 | const struct reg_default *patch = NULL; |
1410 | int i, patch_size; |
1411 | diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c |
1412 | index 134e41c..f8a31ad 100644 |
1413 | --- a/sound/soc/codecs/wm8903.c |
1414 | +++ b/sound/soc/codecs/wm8903.c |
1415 | @@ -1083,6 +1083,8 @@ static const struct snd_soc_dapm_route wm8903_intercon[] = { |
1416 | { "ROP", NULL, "Right Speaker PGA" }, |
1417 | { "RON", NULL, "Right Speaker PGA" }, |
1418 | |
1419 | + { "Charge Pump", NULL, "CLK_DSP" }, |
1420 | + |
1421 | { "Left Headphone Output PGA", NULL, "Charge Pump" }, |
1422 | { "Right Headphone Output PGA", NULL, "Charge Pump" }, |
1423 | { "Left Line Output PGA", NULL, "Charge Pump" }, |
1424 | diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
1425 | index 2370063..f3ab918 100644 |
1426 | --- a/sound/soc/soc-core.c |
1427 | +++ b/sound/soc/soc-core.c |
1428 | @@ -2959,7 +2959,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1429 | val = val << shift; |
1430 | |
1431 | ret = snd_soc_update_bits_locked(codec, reg, val_mask, val); |
1432 | - if (ret != 0) |
1433 | + if (ret < 0) |
1434 | return ret; |
1435 | |
1436 | if (snd_soc_volsw_is_stereo(mc)) { |
1437 | diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c |
1438 | index 15520de..190f434 100644 |
1439 | --- a/sound/usb/mixer_quirks.c |
1440 | +++ b/sound/usb/mixer_quirks.c |
1441 | @@ -509,7 +509,7 @@ static int snd_nativeinstruments_control_get(struct snd_kcontrol *kcontrol, |
1442 | else |
1443 | ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), bRequest, |
1444 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, |
1445 | - 0, cpu_to_le16(wIndex), |
1446 | + 0, wIndex, |
1447 | &tmp, sizeof(tmp), 1000); |
1448 | up_read(&mixer->chip->shutdown_rwsem); |
1449 | |
1450 | @@ -540,7 +540,7 @@ static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol, |
1451 | else |
1452 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest, |
1453 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
1454 | - cpu_to_le16(wValue), cpu_to_le16(wIndex), |
1455 | + wValue, wIndex, |
1456 | NULL, 0, 1000); |
1457 | up_read(&mixer->chip->shutdown_rwsem); |
1458 | |
1459 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c |
1460 | index 0115289..b9ca776 100644 |
1461 | --- a/sound/usb/quirks.c |
1462 | +++ b/sound/usb/quirks.c |
1463 | @@ -486,7 +486,7 @@ static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev) |
1464 | { |
1465 | int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
1466 | 0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
1467 | - cpu_to_le16(1), 0, NULL, 0, 1000); |
1468 | + 1, 0, NULL, 0, 1000); |
1469 | |
1470 | if (ret < 0) |
1471 | return ret; |