Magellan Linux

Contents of /trunk/kernel-magellan/patches-3.8/0107-3.8.8-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2166 - (show annotations) (download)
Mon May 6 09:43:39 2013 UTC (11 years, 5 months ago) by niro
File size: 45094 byte(s)
-fixed patch
1 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;