Magellan Linux

Annotation of /trunk/kernel-alx/patches-3.8/0107-3.8.8-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


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