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