Contents of /trunk/kernel-alx/patches-4.9/0278-4.9.179-all-fixes.patch
Parent Directory | Revision Log
Revision 3355 -
(show annotations)
(download)
Tue Jun 18 09:42:08 2019 UTC (5 years, 3 months ago) by niro
File size: 54398 byte(s)
Tue Jun 18 09:42:08 2019 UTC (5 years, 3 months ago) by niro
File size: 54398 byte(s)
-linux-4.9.179
1 | diff --git a/Makefile b/Makefile |
2 | index e9fae7a3c621..d60795319d8a 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 178 |
9 | +SUBLEVEL = 179 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c |
14 | index a670c70f4def..dfc00a5bdc10 100644 |
15 | --- a/arch/arm/kvm/arm.c |
16 | +++ b/arch/arm/kvm/arm.c |
17 | @@ -801,7 +801,7 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, |
18 | static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, |
19 | const struct kvm_vcpu_init *init) |
20 | { |
21 | - unsigned int i; |
22 | + unsigned int i, ret; |
23 | int phys_target = kvm_target_cpu(); |
24 | |
25 | if (init->target != phys_target) |
26 | @@ -836,9 +836,14 @@ static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, |
27 | vcpu->arch.target = phys_target; |
28 | |
29 | /* Now we know what it is, we can reset it. */ |
30 | - return kvm_reset_vcpu(vcpu); |
31 | -} |
32 | + ret = kvm_reset_vcpu(vcpu); |
33 | + if (ret) { |
34 | + vcpu->arch.target = -1; |
35 | + bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES); |
36 | + } |
37 | |
38 | + return ret; |
39 | +} |
40 | |
41 | static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu, |
42 | struct kvm_vcpu_init *init) |
43 | diff --git a/arch/parisc/include/asm/assembly.h b/arch/parisc/include/asm/assembly.h |
44 | index 60e6f07b7e32..eb83d65153b8 100644 |
45 | --- a/arch/parisc/include/asm/assembly.h |
46 | +++ b/arch/parisc/include/asm/assembly.h |
47 | @@ -59,14 +59,14 @@ |
48 | #define LDCW ldcw,co |
49 | #define BL b,l |
50 | # ifdef CONFIG_64BIT |
51 | -# define LEVEL 2.0w |
52 | +# define PA_ASM_LEVEL 2.0w |
53 | # else |
54 | -# define LEVEL 2.0 |
55 | +# define PA_ASM_LEVEL 2.0 |
56 | # endif |
57 | #else |
58 | #define LDCW ldcw |
59 | #define BL bl |
60 | -#define LEVEL 1.1 |
61 | +#define PA_ASM_LEVEL 1.1 |
62 | #endif |
63 | |
64 | #ifdef __ASSEMBLY__ |
65 | diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S |
66 | index bbbe360b458f..9b99eb0712ad 100644 |
67 | --- a/arch/parisc/kernel/head.S |
68 | +++ b/arch/parisc/kernel/head.S |
69 | @@ -22,7 +22,7 @@ |
70 | #include <linux/linkage.h> |
71 | #include <linux/init.h> |
72 | |
73 | - .level LEVEL |
74 | + .level PA_ASM_LEVEL |
75 | |
76 | __INITDATA |
77 | ENTRY(boot_args) |
78 | @@ -254,7 +254,7 @@ stext_pdc_ret: |
79 | ldo R%PA(fault_vector_11)(%r10),%r10 |
80 | |
81 | $is_pa20: |
82 | - .level LEVEL /* restore 1.1 || 2.0w */ |
83 | + .level PA_ASM_LEVEL /* restore 1.1 || 2.0w */ |
84 | #endif /*!CONFIG_64BIT*/ |
85 | load32 PA(fault_vector_20),%r10 |
86 | |
87 | diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c |
88 | index 2e5216c28bb1..b4e3edad53ab 100644 |
89 | --- a/arch/parisc/kernel/process.c |
90 | +++ b/arch/parisc/kernel/process.c |
91 | @@ -189,6 +189,7 @@ int dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *r) |
92 | */ |
93 | |
94 | int running_on_qemu __read_mostly; |
95 | +EXPORT_SYMBOL(running_on_qemu); |
96 | |
97 | void __cpuidle arch_cpu_idle_dead(void) |
98 | { |
99 | diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S |
100 | index 5f7e57fcaeef..0cf379acb5ed 100644 |
101 | --- a/arch/parisc/kernel/syscall.S |
102 | +++ b/arch/parisc/kernel/syscall.S |
103 | @@ -48,7 +48,7 @@ registers). |
104 | */ |
105 | #define KILL_INSN break 0,0 |
106 | |
107 | - .level LEVEL |
108 | + .level PA_ASM_LEVEL |
109 | |
110 | .text |
111 | |
112 | diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c |
113 | index 66d1fc7dff58..1ab36a355daf 100644 |
114 | --- a/drivers/clk/tegra/clk-pll.c |
115 | +++ b/drivers/clk/tegra/clk-pll.c |
116 | @@ -638,8 +638,8 @@ static void _update_pll_mnp(struct tegra_clk_pll *pll, |
117 | pll_override_writel(val, params->pmc_divp_reg, pll); |
118 | |
119 | val = pll_override_readl(params->pmc_divnm_reg, pll); |
120 | - val &= ~(divm_mask(pll) << div_nmp->override_divm_shift) | |
121 | - ~(divn_mask(pll) << div_nmp->override_divn_shift); |
122 | + val &= ~((divm_mask(pll) << div_nmp->override_divm_shift) | |
123 | + (divn_mask(pll) << div_nmp->override_divn_shift)); |
124 | val |= (cfg->m << div_nmp->override_divm_shift) | |
125 | (cfg->n << div_nmp->override_divn_shift); |
126 | pll_override_writel(val, params->pmc_divnm_reg, pll); |
127 | diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c |
128 | index f91d9faf14ea..aadae9dc2aad 100644 |
129 | --- a/drivers/hwtracing/intel_th/msu.c |
130 | +++ b/drivers/hwtracing/intel_th/msu.c |
131 | @@ -90,6 +90,7 @@ struct msc_iter { |
132 | * @reg_base: register window base address |
133 | * @thdev: intel_th_device pointer |
134 | * @win_list: list of windows in multiblock mode |
135 | + * @single_sgt: single mode buffer |
136 | * @nr_pages: total number of pages allocated for this buffer |
137 | * @single_sz: amount of data in single mode |
138 | * @single_wrap: single mode wrap occurred |
139 | @@ -110,6 +111,7 @@ struct msc { |
140 | struct intel_th_device *thdev; |
141 | |
142 | struct list_head win_list; |
143 | + struct sg_table single_sgt; |
144 | unsigned long nr_pages; |
145 | unsigned long single_sz; |
146 | unsigned int single_wrap : 1; |
147 | @@ -623,22 +625,45 @@ static void intel_th_msc_deactivate(struct intel_th_device *thdev) |
148 | */ |
149 | static int msc_buffer_contig_alloc(struct msc *msc, unsigned long size) |
150 | { |
151 | + unsigned long nr_pages = size >> PAGE_SHIFT; |
152 | unsigned int order = get_order(size); |
153 | struct page *page; |
154 | + int ret; |
155 | |
156 | if (!size) |
157 | return 0; |
158 | |
159 | + ret = sg_alloc_table(&msc->single_sgt, 1, GFP_KERNEL); |
160 | + if (ret) |
161 | + goto err_out; |
162 | + |
163 | + ret = -ENOMEM; |
164 | page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); |
165 | if (!page) |
166 | - return -ENOMEM; |
167 | + goto err_free_sgt; |
168 | |
169 | split_page(page, order); |
170 | - msc->nr_pages = size >> PAGE_SHIFT; |
171 | + sg_set_buf(msc->single_sgt.sgl, page_address(page), size); |
172 | + |
173 | + ret = dma_map_sg(msc_dev(msc)->parent->parent, msc->single_sgt.sgl, 1, |
174 | + DMA_FROM_DEVICE); |
175 | + if (ret < 0) |
176 | + goto err_free_pages; |
177 | + |
178 | + msc->nr_pages = nr_pages; |
179 | msc->base = page_address(page); |
180 | - msc->base_addr = page_to_phys(page); |
181 | + msc->base_addr = sg_dma_address(msc->single_sgt.sgl); |
182 | |
183 | return 0; |
184 | + |
185 | +err_free_pages: |
186 | + __free_pages(page, order); |
187 | + |
188 | +err_free_sgt: |
189 | + sg_free_table(&msc->single_sgt); |
190 | + |
191 | +err_out: |
192 | + return ret; |
193 | } |
194 | |
195 | /** |
196 | @@ -649,6 +674,10 @@ static void msc_buffer_contig_free(struct msc *msc) |
197 | { |
198 | unsigned long off; |
199 | |
200 | + dma_unmap_sg(msc_dev(msc)->parent->parent, msc->single_sgt.sgl, |
201 | + 1, DMA_FROM_DEVICE); |
202 | + sg_free_table(&msc->single_sgt); |
203 | + |
204 | for (off = 0; off < msc->nr_pages << PAGE_SHIFT; off += PAGE_SIZE) { |
205 | struct page *page = virt_to_page(msc->base + off); |
206 | |
207 | diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c |
208 | index 3c45c1c15f7e..fd0ebec03ae7 100644 |
209 | --- a/drivers/hwtracing/stm/core.c |
210 | +++ b/drivers/hwtracing/stm/core.c |
211 | @@ -226,8 +226,8 @@ stm_output_disclaim(struct stm_device *stm, struct stm_output *output) |
212 | bitmap_release_region(&master->chan_map[0], output->channel, |
213 | ilog2(output->nr_chans)); |
214 | |
215 | - output->nr_chans = 0; |
216 | master->nr_free += output->nr_chans; |
217 | + output->nr_chans = 0; |
218 | } |
219 | |
220 | /* |
221 | diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c |
222 | index 9305964250ac..c4eb293b1524 100644 |
223 | --- a/drivers/iommu/tegra-smmu.c |
224 | +++ b/drivers/iommu/tegra-smmu.c |
225 | @@ -91,7 +91,6 @@ static inline u32 smmu_readl(struct tegra_smmu *smmu, unsigned long offset) |
226 | #define SMMU_TLB_FLUSH_VA_MATCH_ALL (0 << 0) |
227 | #define SMMU_TLB_FLUSH_VA_MATCH_SECTION (2 << 0) |
228 | #define SMMU_TLB_FLUSH_VA_MATCH_GROUP (3 << 0) |
229 | -#define SMMU_TLB_FLUSH_ASID(x) (((x) & 0x7f) << 24) |
230 | #define SMMU_TLB_FLUSH_VA_SECTION(addr) ((((addr) & 0xffc00000) >> 12) | \ |
231 | SMMU_TLB_FLUSH_VA_MATCH_SECTION) |
232 | #define SMMU_TLB_FLUSH_VA_GROUP(addr) ((((addr) & 0xffffc000) >> 12) | \ |
233 | @@ -194,8 +193,12 @@ static inline void smmu_flush_tlb_asid(struct tegra_smmu *smmu, |
234 | { |
235 | u32 value; |
236 | |
237 | - value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) | |
238 | - SMMU_TLB_FLUSH_VA_MATCH_ALL; |
239 | + if (smmu->soc->num_asids == 4) |
240 | + value = (asid & 0x3) << 29; |
241 | + else |
242 | + value = (asid & 0x7f) << 24; |
243 | + |
244 | + value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_MATCH_ALL; |
245 | smmu_writel(smmu, value, SMMU_TLB_FLUSH); |
246 | } |
247 | |
248 | @@ -205,8 +208,12 @@ static inline void smmu_flush_tlb_section(struct tegra_smmu *smmu, |
249 | { |
250 | u32 value; |
251 | |
252 | - value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) | |
253 | - SMMU_TLB_FLUSH_VA_SECTION(iova); |
254 | + if (smmu->soc->num_asids == 4) |
255 | + value = (asid & 0x3) << 29; |
256 | + else |
257 | + value = (asid & 0x7f) << 24; |
258 | + |
259 | + value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_SECTION(iova); |
260 | smmu_writel(smmu, value, SMMU_TLB_FLUSH); |
261 | } |
262 | |
263 | @@ -216,8 +223,12 @@ static inline void smmu_flush_tlb_group(struct tegra_smmu *smmu, |
264 | { |
265 | u32 value; |
266 | |
267 | - value = SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_ASID(asid) | |
268 | - SMMU_TLB_FLUSH_VA_GROUP(iova); |
269 | + if (smmu->soc->num_asids == 4) |
270 | + value = (asid & 0x3) << 29; |
271 | + else |
272 | + value = (asid & 0x7f) << 24; |
273 | + |
274 | + value |= SMMU_TLB_FLUSH_ASID_MATCH | SMMU_TLB_FLUSH_VA_GROUP(iova); |
275 | smmu_writel(smmu, value, SMMU_TLB_FLUSH); |
276 | } |
277 | |
278 | diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c |
279 | index cc70871a6d29..3f01c5229e69 100644 |
280 | --- a/drivers/md/dm-delay.c |
281 | +++ b/drivers/md/dm-delay.c |
282 | @@ -222,7 +222,8 @@ static void delay_dtr(struct dm_target *ti) |
283 | { |
284 | struct delay_c *dc = ti->private; |
285 | |
286 | - destroy_workqueue(dc->kdelayd_wq); |
287 | + if (dc->kdelayd_wq) |
288 | + destroy_workqueue(dc->kdelayd_wq); |
289 | |
290 | dm_put_device(ti, dc->dev_read); |
291 | |
292 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
293 | index a7a0e3acdb2f..21698eb671d7 100644 |
294 | --- a/drivers/md/md.c |
295 | +++ b/drivers/md/md.c |
296 | @@ -2694,8 +2694,10 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len) |
297 | err = 0; |
298 | } |
299 | } else if (cmd_match(buf, "re-add")) { |
300 | - if (test_bit(Faulty, &rdev->flags) && (rdev->raid_disk == -1) && |
301 | - rdev->saved_raid_disk >= 0) { |
302 | + if (!rdev->mddev->pers) |
303 | + err = -EINVAL; |
304 | + else if (test_bit(Faulty, &rdev->flags) && (rdev->raid_disk == -1) && |
305 | + rdev->saved_raid_disk >= 0) { |
306 | /* clear_bit is performed _after_ all the devices |
307 | * have their local Faulty bit cleared. If any writes |
308 | * happen in the meantime in the local node, they |
309 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
310 | index 2a403e5c31aa..401e7c0e8802 100644 |
311 | --- a/drivers/md/raid5.c |
312 | +++ b/drivers/md/raid5.c |
313 | @@ -3878,7 +3878,7 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh, |
314 | /* now write out any block on a failed drive, |
315 | * or P or Q if they were recomputed |
316 | */ |
317 | - BUG_ON(s->uptodate < disks - 1); /* We don't need Q to recover */ |
318 | + dev = NULL; |
319 | if (s->failed == 2) { |
320 | dev = &sh->dev[s->failed_num[1]]; |
321 | s->locked++; |
322 | @@ -3903,6 +3903,14 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh, |
323 | set_bit(R5_LOCKED, &dev->flags); |
324 | set_bit(R5_Wantwrite, &dev->flags); |
325 | } |
326 | + if (WARN_ONCE(dev && !test_bit(R5_UPTODATE, &dev->flags), |
327 | + "%s: disk%td not up to date\n", |
328 | + mdname(conf->mddev), |
329 | + dev - (struct r5dev *) &sh->dev)) { |
330 | + clear_bit(R5_LOCKED, &dev->flags); |
331 | + clear_bit(R5_Wantwrite, &dev->flags); |
332 | + s->locked--; |
333 | + } |
334 | clear_bit(STRIPE_DEGRADED, &sh->state); |
335 | |
336 | set_bit(STRIPE_INSYNC, &sh->state); |
337 | @@ -3914,15 +3922,26 @@ static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh, |
338 | case check_state_check_result: |
339 | sh->check_state = check_state_idle; |
340 | |
341 | - if (s->failed > 1) |
342 | - break; |
343 | /* handle a successful check operation, if parity is correct |
344 | * we are done. Otherwise update the mismatch count and repair |
345 | * parity if !MD_RECOVERY_CHECK |
346 | */ |
347 | if (sh->ops.zero_sum_result == 0) { |
348 | - /* Any parity checked was correct */ |
349 | - set_bit(STRIPE_INSYNC, &sh->state); |
350 | + /* both parities are correct */ |
351 | + if (!s->failed) |
352 | + set_bit(STRIPE_INSYNC, &sh->state); |
353 | + else { |
354 | + /* in contrast to the raid5 case we can validate |
355 | + * parity, but still have a failure to write |
356 | + * back |
357 | + */ |
358 | + sh->check_state = check_state_compute_result; |
359 | + /* Returning at this point means that we may go |
360 | + * off and bring p and/or q uptodate again so |
361 | + * we make sure to check zero_sum_result again |
362 | + * to verify if p or q need writeback |
363 | + */ |
364 | + } |
365 | } else { |
366 | atomic64_add(STRIPE_SECTORS, &conf->mddev->resync_mismatches); |
367 | if (test_bit(MD_RECOVERY_CHECK, &conf->mddev->recovery)) |
368 | diff --git a/drivers/media/i2c/soc_camera/ov6650.c b/drivers/media/i2c/soc_camera/ov6650.c |
369 | index 8f85910eda5d..e21b7e1c2ee1 100644 |
370 | --- a/drivers/media/i2c/soc_camera/ov6650.c |
371 | +++ b/drivers/media/i2c/soc_camera/ov6650.c |
372 | @@ -844,6 +844,8 @@ static int ov6650_video_probe(struct i2c_client *client) |
373 | if (ret < 0) |
374 | return ret; |
375 | |
376 | + msleep(20); |
377 | + |
378 | /* |
379 | * check and show product ID and manufacturer ID |
380 | */ |
381 | diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c |
382 | index 1d49a8dd4a37..7c040a3b45be 100644 |
383 | --- a/drivers/memory/tegra/mc.c |
384 | +++ b/drivers/memory/tegra/mc.c |
385 | @@ -72,7 +72,7 @@ static int tegra_mc_setup_latency_allowance(struct tegra_mc *mc) |
386 | u32 value; |
387 | |
388 | /* compute the number of MC clock cycles per tick */ |
389 | - tick = mc->tick * clk_get_rate(mc->clk); |
390 | + tick = (unsigned long long)mc->tick * clk_get_rate(mc->clk); |
391 | do_div(tick, NSEC_PER_SEC); |
392 | |
393 | value = readl(mc->regs + MC_EMEM_ARB_CFG); |
394 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c |
395 | index 0710b3677464..cb186321edc1 100644 |
396 | --- a/drivers/net/ethernet/mellanox/mlx4/mcg.c |
397 | +++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c |
398 | @@ -1490,7 +1490,7 @@ int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port, |
399 | rule.port = port; |
400 | rule.qpn = qpn; |
401 | INIT_LIST_HEAD(&rule.list); |
402 | - mlx4_err(dev, "going promisc on %x\n", port); |
403 | + mlx4_info(dev, "going promisc on %x\n", port); |
404 | |
405 | return mlx4_flow_attach(dev, &rule, regid_p); |
406 | } |
407 | diff --git a/drivers/net/ppp/ppp_deflate.c b/drivers/net/ppp/ppp_deflate.c |
408 | index b5edc7f96a39..685e875f5164 100644 |
409 | --- a/drivers/net/ppp/ppp_deflate.c |
410 | +++ b/drivers/net/ppp/ppp_deflate.c |
411 | @@ -610,12 +610,20 @@ static struct compressor ppp_deflate_draft = { |
412 | |
413 | static int __init deflate_init(void) |
414 | { |
415 | - int answer = ppp_register_compressor(&ppp_deflate); |
416 | - if (answer == 0) |
417 | - printk(KERN_INFO |
418 | - "PPP Deflate Compression module registered\n"); |
419 | - ppp_register_compressor(&ppp_deflate_draft); |
420 | - return answer; |
421 | + int rc; |
422 | + |
423 | + rc = ppp_register_compressor(&ppp_deflate); |
424 | + if (rc) |
425 | + return rc; |
426 | + |
427 | + rc = ppp_register_compressor(&ppp_deflate_draft); |
428 | + if (rc) { |
429 | + ppp_unregister_compressor(&ppp_deflate); |
430 | + return rc; |
431 | + } |
432 | + |
433 | + pr_info("PPP Deflate Compression module registered\n"); |
434 | + return 0; |
435 | } |
436 | |
437 | static void __exit deflate_cleanup(void) |
438 | diff --git a/drivers/net/wireless/intersil/p54/p54pci.c b/drivers/net/wireless/intersil/p54/p54pci.c |
439 | index 27a49068d32d..57ad56435dda 100644 |
440 | --- a/drivers/net/wireless/intersil/p54/p54pci.c |
441 | +++ b/drivers/net/wireless/intersil/p54/p54pci.c |
442 | @@ -554,7 +554,7 @@ static int p54p_probe(struct pci_dev *pdev, |
443 | err = pci_enable_device(pdev); |
444 | if (err) { |
445 | dev_err(&pdev->dev, "Cannot enable new PCI device\n"); |
446 | - return err; |
447 | + goto err_put; |
448 | } |
449 | |
450 | mem_addr = pci_resource_start(pdev, 0); |
451 | @@ -639,6 +639,7 @@ static int p54p_probe(struct pci_dev *pdev, |
452 | pci_release_regions(pdev); |
453 | err_disable_dev: |
454 | pci_disable_device(pdev); |
455 | +err_put: |
456 | pci_dev_put(pdev); |
457 | return err; |
458 | } |
459 | diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c |
460 | index b48243131993..3a91e06926ad 100644 |
461 | --- a/drivers/parisc/led.c |
462 | +++ b/drivers/parisc/led.c |
463 | @@ -568,6 +568,9 @@ int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long d |
464 | break; |
465 | |
466 | case DISPLAY_MODEL_LASI: |
467 | + /* Skip to register LED in QEMU */ |
468 | + if (running_on_qemu) |
469 | + return 1; |
470 | LED_DATA_REG = data_reg; |
471 | led_func_ptr = led_LASI_driver; |
472 | printk(KERN_INFO "LED display at %lx registered\n", LED_DATA_REG); |
473 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c |
474 | index 6643a7bc381c..b12fe65d07f8 100644 |
475 | --- a/drivers/pci/pcie/aspm.c |
476 | +++ b/drivers/pci/pcie/aspm.c |
477 | @@ -172,6 +172,38 @@ static void pcie_clkpm_cap_init(struct pcie_link_state *link, int blacklist) |
478 | link->clkpm_capable = (blacklist) ? 0 : capable; |
479 | } |
480 | |
481 | +static bool pcie_retrain_link(struct pcie_link_state *link) |
482 | +{ |
483 | + struct pci_dev *parent = link->pdev; |
484 | + unsigned long start_jiffies; |
485 | + u16 reg16; |
486 | + |
487 | + pcie_capability_read_word(parent, PCI_EXP_LNKCTL, ®16); |
488 | + reg16 |= PCI_EXP_LNKCTL_RL; |
489 | + pcie_capability_write_word(parent, PCI_EXP_LNKCTL, reg16); |
490 | + if (parent->clear_retrain_link) { |
491 | + /* |
492 | + * Due to an erratum in some devices the Retrain Link bit |
493 | + * needs to be cleared again manually to allow the link |
494 | + * training to succeed. |
495 | + */ |
496 | + reg16 &= ~PCI_EXP_LNKCTL_RL; |
497 | + pcie_capability_write_word(parent, PCI_EXP_LNKCTL, reg16); |
498 | + } |
499 | + |
500 | + /* Wait for link training end. Break out after waiting for timeout */ |
501 | + start_jiffies = jiffies; |
502 | + for (;;) { |
503 | + pcie_capability_read_word(parent, PCI_EXP_LNKSTA, ®16); |
504 | + if (!(reg16 & PCI_EXP_LNKSTA_LT)) |
505 | + break; |
506 | + if (time_after(jiffies, start_jiffies + LINK_RETRAIN_TIMEOUT)) |
507 | + break; |
508 | + msleep(1); |
509 | + } |
510 | + return !(reg16 & PCI_EXP_LNKSTA_LT); |
511 | +} |
512 | + |
513 | /* |
514 | * pcie_aspm_configure_common_clock: check if the 2 ends of a link |
515 | * could use common clock. If they are, configure them to use the |
516 | @@ -181,7 +213,6 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) |
517 | { |
518 | int same_clock = 1; |
519 | u16 reg16, parent_reg, child_reg[8]; |
520 | - unsigned long start_jiffies; |
521 | struct pci_dev *child, *parent = link->pdev; |
522 | struct pci_bus *linkbus = parent->subordinate; |
523 | /* |
524 | @@ -221,21 +252,7 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) |
525 | reg16 &= ~PCI_EXP_LNKCTL_CCC; |
526 | pcie_capability_write_word(parent, PCI_EXP_LNKCTL, reg16); |
527 | |
528 | - /* Retrain link */ |
529 | - reg16 |= PCI_EXP_LNKCTL_RL; |
530 | - pcie_capability_write_word(parent, PCI_EXP_LNKCTL, reg16); |
531 | - |
532 | - /* Wait for link training end. Break out after waiting for timeout */ |
533 | - start_jiffies = jiffies; |
534 | - for (;;) { |
535 | - pcie_capability_read_word(parent, PCI_EXP_LNKSTA, ®16); |
536 | - if (!(reg16 & PCI_EXP_LNKSTA_LT)) |
537 | - break; |
538 | - if (time_after(jiffies, start_jiffies + LINK_RETRAIN_TIMEOUT)) |
539 | - break; |
540 | - msleep(1); |
541 | - } |
542 | - if (!(reg16 & PCI_EXP_LNKSTA_LT)) |
543 | + if (pcie_retrain_link(link)) |
544 | return; |
545 | |
546 | /* Training failed. Restore common clock configurations */ |
547 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
548 | index 6663b76934ad..f474899073e0 100644 |
549 | --- a/drivers/pci/quirks.c |
550 | +++ b/drivers/pci/quirks.c |
551 | @@ -2046,6 +2046,23 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s); |
552 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s); |
553 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s); |
554 | |
555 | +/* |
556 | + * Some Pericom PCIe-to-PCI bridges in reverse mode need the PCIe Retrain |
557 | + * Link bit cleared after starting the link retrain process to allow this |
558 | + * process to finish. |
559 | + * |
560 | + * Affected devices: PI7C9X110, PI7C9X111SL, PI7C9X130. See also the |
561 | + * Pericom Errata Sheet PI7C9X111SLB_errata_rev1.2_102711.pdf. |
562 | + */ |
563 | +static void quirk_enable_clear_retrain_link(struct pci_dev *dev) |
564 | +{ |
565 | + dev->clear_retrain_link = 1; |
566 | + pci_info(dev, "Enable PCIe Retrain Link quirk\n"); |
567 | +} |
568 | +DECLARE_PCI_FIXUP_HEADER(0x12d8, 0xe110, quirk_enable_clear_retrain_link); |
569 | +DECLARE_PCI_FIXUP_HEADER(0x12d8, 0xe111, quirk_enable_clear_retrain_link); |
570 | +DECLARE_PCI_FIXUP_HEADER(0x12d8, 0xe130, quirk_enable_clear_retrain_link); |
571 | + |
572 | static void fixup_rev1_53c810(struct pci_dev *dev) |
573 | { |
574 | u32 class = dev->class; |
575 | @@ -3326,6 +3343,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); |
576 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset); |
577 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); |
578 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset); |
579 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0034, quirk_no_bus_reset); |
580 | |
581 | static void quirk_no_pm_reset(struct pci_dev *dev) |
582 | { |
583 | diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c |
584 | index bcde8d13476a..c0fc98e03c91 100644 |
585 | --- a/drivers/power/supply/power_supply_sysfs.c |
586 | +++ b/drivers/power/supply/power_supply_sysfs.c |
587 | @@ -278,15 +278,11 @@ int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env) |
588 | char *prop_buf; |
589 | char *attrname; |
590 | |
591 | - dev_dbg(dev, "uevent\n"); |
592 | - |
593 | if (!psy || !psy->desc) { |
594 | dev_dbg(dev, "No power supply yet\n"); |
595 | return ret; |
596 | } |
597 | |
598 | - dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->desc->name); |
599 | - |
600 | ret = add_uevent_var(env, "POWER_SUPPLY_NAME=%s", psy->desc->name); |
601 | if (ret) |
602 | return ret; |
603 | @@ -322,8 +318,6 @@ int power_supply_uevent(struct device *dev, struct kobj_uevent_env *env) |
604 | goto out; |
605 | } |
606 | |
607 | - dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf); |
608 | - |
609 | ret = add_uevent_var(env, "POWER_SUPPLY_%s=%s", attrname, prop_buf); |
610 | kfree(attrname); |
611 | if (ret) |
612 | diff --git a/drivers/video/fbdev/sm712.h b/drivers/video/fbdev/sm712.h |
613 | index aad1cc4be34a..c7ebf03b8d53 100644 |
614 | --- a/drivers/video/fbdev/sm712.h |
615 | +++ b/drivers/video/fbdev/sm712.h |
616 | @@ -15,14 +15,10 @@ |
617 | |
618 | #define FB_ACCEL_SMI_LYNX 88 |
619 | |
620 | -#define SCREEN_X_RES 1024 |
621 | -#define SCREEN_Y_RES 600 |
622 | -#define SCREEN_BPP 16 |
623 | - |
624 | -/*Assume SM712 graphics chip has 4MB VRAM */ |
625 | -#define SM712_VIDEOMEMORYSIZE 0x00400000 |
626 | -/*Assume SM722 graphics chip has 8MB VRAM */ |
627 | -#define SM722_VIDEOMEMORYSIZE 0x00800000 |
628 | +#define SCREEN_X_RES 1024 |
629 | +#define SCREEN_Y_RES_PC 768 |
630 | +#define SCREEN_Y_RES_NETBOOK 600 |
631 | +#define SCREEN_BPP 16 |
632 | |
633 | #define dac_reg (0x3c8) |
634 | #define dac_val (0x3c9) |
635 | diff --git a/drivers/video/fbdev/sm712fb.c b/drivers/video/fbdev/sm712fb.c |
636 | index 73cb4ffff3c5..0d92ff366a7b 100644 |
637 | --- a/drivers/video/fbdev/sm712fb.c |
638 | +++ b/drivers/video/fbdev/sm712fb.c |
639 | @@ -530,6 +530,65 @@ static const struct modeinit vgamode[] = { |
640 | 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, |
641 | }, |
642 | }, |
643 | + { /* 1024 x 768 16Bpp 60Hz */ |
644 | + 1024, 768, 16, 60, |
645 | + /* Init_MISC */ |
646 | + 0xEB, |
647 | + { /* Init_SR0_SR4 */ |
648 | + 0x03, 0x01, 0x0F, 0x03, 0x0E, |
649 | + }, |
650 | + { /* Init_SR10_SR24 */ |
651 | + 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C, |
652 | + 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, |
653 | + 0xC4, 0x30, 0x02, 0x01, 0x01, |
654 | + }, |
655 | + { /* Init_SR30_SR75 */ |
656 | + 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A, |
657 | + 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF, |
658 | + 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, |
659 | + 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A, |
660 | + 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, |
661 | + 0x0F, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A, |
662 | + 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, |
663 | + 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02, |
664 | + 0x04, 0x45, 0x30, 0x30, 0x40, 0x20, |
665 | + }, |
666 | + { /* Init_SR80_SR93 */ |
667 | + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, |
668 | + 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, |
669 | + 0x00, 0x00, 0x00, 0x00, |
670 | + }, |
671 | + { /* Init_SRA0_SRAF */ |
672 | + 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, |
673 | + 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, |
674 | + }, |
675 | + { /* Init_GR00_GR08 */ |
676 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, |
677 | + 0xFF, |
678 | + }, |
679 | + { /* Init_AR00_AR14 */ |
680 | + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
681 | + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, |
682 | + 0x41, 0x00, 0x0F, 0x00, 0x00, |
683 | + }, |
684 | + { /* Init_CR00_CR18 */ |
685 | + 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, |
686 | + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
687 | + 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, |
688 | + 0xFF, |
689 | + }, |
690 | + { /* Init_CR30_CR4D */ |
691 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, |
692 | + 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF, |
693 | + 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00, |
694 | + 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF, |
695 | + }, |
696 | + { /* Init_CR90_CRA7 */ |
697 | + 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, |
698 | + 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, |
699 | + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, |
700 | + }, |
701 | + }, |
702 | { /* mode#5: 1024 x 768 24Bpp 60Hz */ |
703 | 1024, 768, 24, 60, |
704 | /* Init_MISC */ |
705 | @@ -827,67 +886,80 @@ static inline unsigned int chan_to_field(unsigned int chan, |
706 | |
707 | static int smtc_blank(int blank_mode, struct fb_info *info) |
708 | { |
709 | + struct smtcfb_info *sfb = info->par; |
710 | + |
711 | /* clear DPMS setting */ |
712 | switch (blank_mode) { |
713 | case FB_BLANK_UNBLANK: |
714 | /* Screen On: HSync: On, VSync : On */ |
715 | + |
716 | + switch (sfb->chip_id) { |
717 | + case 0x710: |
718 | + case 0x712: |
719 | + smtc_seqw(0x6a, 0x16); |
720 | + smtc_seqw(0x6b, 0x02); |
721 | + break; |
722 | + case 0x720: |
723 | + smtc_seqw(0x6a, 0x0d); |
724 | + smtc_seqw(0x6b, 0x02); |
725 | + break; |
726 | + } |
727 | + |
728 | + smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0))); |
729 | smtc_seqw(0x01, (smtc_seqr(0x01) & (~0x20))); |
730 | - smtc_seqw(0x6a, 0x16); |
731 | - smtc_seqw(0x6b, 0x02); |
732 | smtc_seqw(0x21, (smtc_seqr(0x21) & 0x77)); |
733 | smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30))); |
734 | - smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0))); |
735 | - smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01)); |
736 | smtc_seqw(0x31, (smtc_seqr(0x31) | 0x03)); |
737 | + smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01)); |
738 | break; |
739 | case FB_BLANK_NORMAL: |
740 | /* Screen Off: HSync: On, VSync : On Soft blank */ |
741 | + smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01)); |
742 | + smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
743 | + smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0))); |
744 | smtc_seqw(0x01, (smtc_seqr(0x01) & (~0x20))); |
745 | + smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30))); |
746 | smtc_seqw(0x6a, 0x16); |
747 | smtc_seqw(0x6b, 0x02); |
748 | - smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30))); |
749 | - smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0))); |
750 | - smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01)); |
751 | - smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
752 | break; |
753 | case FB_BLANK_VSYNC_SUSPEND: |
754 | /* Screen On: HSync: On, VSync : Off */ |
755 | + smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); |
756 | + smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
757 | + smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0x20)); |
758 | smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20)); |
759 | - smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); |
760 | - smtc_seqw(0x6a, 0x0c); |
761 | - smtc_seqw(0x6b, 0x02); |
762 | smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88)); |
763 | + smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); |
764 | smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x20)); |
765 | - smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0x20)); |
766 | - smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); |
767 | - smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
768 | smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80)); |
769 | + smtc_seqw(0x6a, 0x0c); |
770 | + smtc_seqw(0x6b, 0x02); |
771 | break; |
772 | case FB_BLANK_HSYNC_SUSPEND: |
773 | /* Screen On: HSync: Off, VSync : On */ |
774 | + smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); |
775 | + smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
776 | + smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8)); |
777 | smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20)); |
778 | - smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); |
779 | - smtc_seqw(0x6a, 0x0c); |
780 | - smtc_seqw(0x6b, 0x02); |
781 | smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88)); |
782 | + smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); |
783 | smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x10)); |
784 | - smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8)); |
785 | - smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); |
786 | - smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
787 | smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80)); |
788 | + smtc_seqw(0x6a, 0x0c); |
789 | + smtc_seqw(0x6b, 0x02); |
790 | break; |
791 | case FB_BLANK_POWERDOWN: |
792 | /* Screen On: HSync: Off, VSync : Off */ |
793 | + smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); |
794 | + smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
795 | + smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8)); |
796 | smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20)); |
797 | - smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); |
798 | - smtc_seqw(0x6a, 0x0c); |
799 | - smtc_seqw(0x6b, 0x02); |
800 | smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88)); |
801 | + smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); |
802 | smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x30)); |
803 | - smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8)); |
804 | - smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); |
805 | - smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); |
806 | smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80)); |
807 | + smtc_seqw(0x6a, 0x0c); |
808 | + smtc_seqw(0x6b, 0x02); |
809 | break; |
810 | default: |
811 | return -EINVAL; |
812 | @@ -1144,8 +1216,10 @@ static void sm7xx_set_timing(struct smtcfb_info *sfb) |
813 | |
814 | /* init SEQ register SR30 - SR75 */ |
815 | for (i = 0; i < SIZE_SR30_SR75; i++) |
816 | - if ((i + 0x30) != 0x62 && (i + 0x30) != 0x6a && |
817 | - (i + 0x30) != 0x6b) |
818 | + if ((i + 0x30) != 0x30 && (i + 0x30) != 0x62 && |
819 | + (i + 0x30) != 0x6a && (i + 0x30) != 0x6b && |
820 | + (i + 0x30) != 0x70 && (i + 0x30) != 0x71 && |
821 | + (i + 0x30) != 0x74 && (i + 0x30) != 0x75) |
822 | smtc_seqw(i + 0x30, |
823 | vgamode[j].init_sr30_sr75[i]); |
824 | |
825 | @@ -1170,8 +1244,12 @@ static void sm7xx_set_timing(struct smtcfb_info *sfb) |
826 | smtc_crtcw(i, vgamode[j].init_cr00_cr18[i]); |
827 | |
828 | /* init CRTC register CR30 - CR4D */ |
829 | - for (i = 0; i < SIZE_CR30_CR4D; i++) |
830 | + for (i = 0; i < SIZE_CR30_CR4D; i++) { |
831 | + if ((i + 0x30) >= 0x3B && (i + 0x30) <= 0x3F) |
832 | + /* side-effect, don't write to CR3B-CR3F */ |
833 | + continue; |
834 | smtc_crtcw(i + 0x30, vgamode[j].init_cr30_cr4d[i]); |
835 | + } |
836 | |
837 | /* init CRTC register CR90 - CRA7 */ |
838 | for (i = 0; i < SIZE_CR90_CRA7; i++) |
839 | @@ -1322,6 +1400,11 @@ static int smtc_map_smem(struct smtcfb_info *sfb, |
840 | { |
841 | sfb->fb->fix.smem_start = pci_resource_start(pdev, 0); |
842 | |
843 | + if (sfb->chip_id == 0x720) |
844 | + /* on SM720, the framebuffer starts at the 1 MB offset */ |
845 | + sfb->fb->fix.smem_start += 0x00200000; |
846 | + |
847 | + /* XXX: is it safe for SM720 on Big-Endian? */ |
848 | if (sfb->fb->var.bits_per_pixel == 32) |
849 | sfb->fb->fix.smem_start += big_addr; |
850 | |
851 | @@ -1359,12 +1442,82 @@ static inline void sm7xx_init_hw(void) |
852 | outb_p(0x11, 0x3c5); |
853 | } |
854 | |
855 | +static u_long sm7xx_vram_probe(struct smtcfb_info *sfb) |
856 | +{ |
857 | + u8 vram; |
858 | + |
859 | + switch (sfb->chip_id) { |
860 | + case 0x710: |
861 | + case 0x712: |
862 | + /* |
863 | + * Assume SM712 graphics chip has 4MB VRAM. |
864 | + * |
865 | + * FIXME: SM712 can have 2MB VRAM, which is used on earlier |
866 | + * laptops, such as IBM Thinkpad 240X. This driver would |
867 | + * probably crash on those machines. If anyone gets one of |
868 | + * those and is willing to help, run "git blame" and send me |
869 | + * an E-mail. |
870 | + */ |
871 | + return 0x00400000; |
872 | + case 0x720: |
873 | + outb_p(0x76, 0x3c4); |
874 | + vram = inb_p(0x3c5) >> 6; |
875 | + |
876 | + if (vram == 0x00) |
877 | + return 0x00800000; /* 8 MB */ |
878 | + else if (vram == 0x01) |
879 | + return 0x01000000; /* 16 MB */ |
880 | + else if (vram == 0x02) |
881 | + return 0x00400000; /* illegal, fallback to 4 MB */ |
882 | + else if (vram == 0x03) |
883 | + return 0x00400000; /* 4 MB */ |
884 | + } |
885 | + return 0; /* unknown hardware */ |
886 | +} |
887 | + |
888 | +static void sm7xx_resolution_probe(struct smtcfb_info *sfb) |
889 | +{ |
890 | + /* get mode parameter from smtc_scr_info */ |
891 | + if (smtc_scr_info.lfb_width != 0) { |
892 | + sfb->fb->var.xres = smtc_scr_info.lfb_width; |
893 | + sfb->fb->var.yres = smtc_scr_info.lfb_height; |
894 | + sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth; |
895 | + goto final; |
896 | + } |
897 | + |
898 | + /* |
899 | + * No parameter, default resolution is 1024x768-16. |
900 | + * |
901 | + * FIXME: earlier laptops, such as IBM Thinkpad 240X, has a 800x600 |
902 | + * panel, also see the comments about Thinkpad 240X above. |
903 | + */ |
904 | + sfb->fb->var.xres = SCREEN_X_RES; |
905 | + sfb->fb->var.yres = SCREEN_Y_RES_PC; |
906 | + sfb->fb->var.bits_per_pixel = SCREEN_BPP; |
907 | + |
908 | +#ifdef CONFIG_MIPS |
909 | + /* |
910 | + * Loongson MIPS netbooks use 1024x600 LCD panels, which is the original |
911 | + * target platform of this driver, but nearly all old x86 laptops have |
912 | + * 1024x768. Lighting 768 panels using 600's timings would partially |
913 | + * garble the display, so we don't want that. But it's not possible to |
914 | + * distinguish them reliably. |
915 | + * |
916 | + * So we change the default to 768, but keep 600 as-is on MIPS. |
917 | + */ |
918 | + sfb->fb->var.yres = SCREEN_Y_RES_NETBOOK; |
919 | +#endif |
920 | + |
921 | +final: |
922 | + big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth); |
923 | +} |
924 | + |
925 | static int smtcfb_pci_probe(struct pci_dev *pdev, |
926 | const struct pci_device_id *ent) |
927 | { |
928 | struct smtcfb_info *sfb; |
929 | struct fb_info *info; |
930 | - u_long smem_size = 0x00800000; /* default 8MB */ |
931 | + u_long smem_size; |
932 | int err; |
933 | unsigned long mmio_base; |
934 | |
935 | @@ -1404,29 +1557,19 @@ static int smtcfb_pci_probe(struct pci_dev *pdev, |
936 | |
937 | sm7xx_init_hw(); |
938 | |
939 | - /* get mode parameter from smtc_scr_info */ |
940 | - if (smtc_scr_info.lfb_width != 0) { |
941 | - sfb->fb->var.xres = smtc_scr_info.lfb_width; |
942 | - sfb->fb->var.yres = smtc_scr_info.lfb_height; |
943 | - sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth; |
944 | - } else { |
945 | - /* default resolution 1024x600 16bit mode */ |
946 | - sfb->fb->var.xres = SCREEN_X_RES; |
947 | - sfb->fb->var.yres = SCREEN_Y_RES; |
948 | - sfb->fb->var.bits_per_pixel = SCREEN_BPP; |
949 | - } |
950 | - |
951 | - big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth); |
952 | /* Map address and memory detection */ |
953 | mmio_base = pci_resource_start(pdev, 0); |
954 | pci_read_config_byte(pdev, PCI_REVISION_ID, &sfb->chip_rev_id); |
955 | |
956 | + smem_size = sm7xx_vram_probe(sfb); |
957 | + dev_info(&pdev->dev, "%lu MiB of VRAM detected.\n", |
958 | + smem_size / 1048576); |
959 | + |
960 | switch (sfb->chip_id) { |
961 | case 0x710: |
962 | case 0x712: |
963 | sfb->fb->fix.mmio_start = mmio_base + 0x00400000; |
964 | sfb->fb->fix.mmio_len = 0x00400000; |
965 | - smem_size = SM712_VIDEOMEMORYSIZE; |
966 | sfb->lfb = ioremap(mmio_base, mmio_addr); |
967 | if (!sfb->lfb) { |
968 | dev_err(&pdev->dev, |
969 | @@ -1458,8 +1601,7 @@ static int smtcfb_pci_probe(struct pci_dev *pdev, |
970 | case 0x720: |
971 | sfb->fb->fix.mmio_start = mmio_base; |
972 | sfb->fb->fix.mmio_len = 0x00200000; |
973 | - smem_size = SM722_VIDEOMEMORYSIZE; |
974 | - sfb->dp_regs = ioremap(mmio_base, 0x00a00000); |
975 | + sfb->dp_regs = ioremap(mmio_base, 0x00200000 + smem_size); |
976 | sfb->lfb = sfb->dp_regs + 0x00200000; |
977 | sfb->mmio = (smtc_regbaseaddress = |
978 | sfb->dp_regs + 0x000c0000); |
979 | @@ -1476,6 +1618,9 @@ static int smtcfb_pci_probe(struct pci_dev *pdev, |
980 | goto failed_fb; |
981 | } |
982 | |
983 | + /* probe and decide resolution */ |
984 | + sm7xx_resolution_probe(sfb); |
985 | + |
986 | /* can support 32 bpp */ |
987 | if (15 == sfb->fb->var.bits_per_pixel) |
988 | sfb->fb->var.bits_per_pixel = 16; |
989 | @@ -1486,7 +1631,11 @@ static int smtcfb_pci_probe(struct pci_dev *pdev, |
990 | if (err) |
991 | goto failed; |
992 | |
993 | - smtcfb_setmode(sfb); |
994 | + /* |
995 | + * The screen would be temporarily garbled when sm712fb takes over |
996 | + * vesafb or VGA text mode. Zero the framebuffer. |
997 | + */ |
998 | + memset_io(sfb->lfb, 0, sfb->fb->fix.smem_len); |
999 | |
1000 | err = register_framebuffer(info); |
1001 | if (err < 0) |
1002 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c |
1003 | index 7938c48c72ff..6b29165f766f 100644 |
1004 | --- a/fs/btrfs/extent-tree.c |
1005 | +++ b/fs/btrfs/extent-tree.c |
1006 | @@ -11150,9 +11150,9 @@ int btrfs_error_unpin_extent_range(struct btrfs_root *root, u64 start, u64 end) |
1007 | * transaction. |
1008 | */ |
1009 | static int btrfs_trim_free_extents(struct btrfs_device *device, |
1010 | - u64 minlen, u64 *trimmed) |
1011 | + struct fstrim_range *range, u64 *trimmed) |
1012 | { |
1013 | - u64 start = 0, len = 0; |
1014 | + u64 start = range->start, len = 0; |
1015 | int ret; |
1016 | |
1017 | *trimmed = 0; |
1018 | @@ -11188,8 +11188,8 @@ static int btrfs_trim_free_extents(struct btrfs_device *device, |
1019 | atomic_inc(&trans->use_count); |
1020 | spin_unlock(&fs_info->trans_lock); |
1021 | |
1022 | - ret = find_free_dev_extent_start(trans, device, minlen, start, |
1023 | - &start, &len); |
1024 | + ret = find_free_dev_extent_start(trans, device, range->minlen, |
1025 | + start, &start, &len); |
1026 | if (trans) |
1027 | btrfs_put_transaction(trans); |
1028 | |
1029 | @@ -11201,6 +11201,16 @@ static int btrfs_trim_free_extents(struct btrfs_device *device, |
1030 | break; |
1031 | } |
1032 | |
1033 | + /* If we are out of the passed range break */ |
1034 | + if (start > range->start + range->len - 1) { |
1035 | + mutex_unlock(&fs_info->chunk_mutex); |
1036 | + ret = 0; |
1037 | + break; |
1038 | + } |
1039 | + |
1040 | + start = max(range->start, start); |
1041 | + len = min(range->len, len); |
1042 | + |
1043 | ret = btrfs_issue_discard(device->bdev, start, len, &bytes); |
1044 | up_read(&fs_info->commit_root_sem); |
1045 | mutex_unlock(&fs_info->chunk_mutex); |
1046 | @@ -11211,6 +11221,10 @@ static int btrfs_trim_free_extents(struct btrfs_device *device, |
1047 | start += len; |
1048 | *trimmed += bytes; |
1049 | |
1050 | + /* We've trimmed enough */ |
1051 | + if (*trimmed >= range->len) |
1052 | + break; |
1053 | + |
1054 | if (fatal_signal_pending(current)) { |
1055 | ret = -ERESTARTSYS; |
1056 | break; |
1057 | @@ -11295,8 +11309,7 @@ int btrfs_trim_fs(struct btrfs_root *root, struct fstrim_range *range) |
1058 | mutex_lock(&fs_info->fs_devices->device_list_mutex); |
1059 | devices = &fs_info->fs_devices->devices; |
1060 | list_for_each_entry(device, devices, dev_list) { |
1061 | - ret = btrfs_trim_free_extents(device, range->minlen, |
1062 | - &group_trimmed); |
1063 | + ret = btrfs_trim_free_extents(device, range, &group_trimmed); |
1064 | if (ret) { |
1065 | dev_failed++; |
1066 | dev_ret = ret; |
1067 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c |
1068 | index 2a8903025853..c42cbd19ff05 100644 |
1069 | --- a/fs/ceph/super.c |
1070 | +++ b/fs/ceph/super.c |
1071 | @@ -742,6 +742,12 @@ static void ceph_umount_begin(struct super_block *sb) |
1072 | return; |
1073 | } |
1074 | |
1075 | +static int ceph_remount(struct super_block *sb, int *flags, char *data) |
1076 | +{ |
1077 | + sync_filesystem(sb); |
1078 | + return 0; |
1079 | +} |
1080 | + |
1081 | static const struct super_operations ceph_super_ops = { |
1082 | .alloc_inode = ceph_alloc_inode, |
1083 | .destroy_inode = ceph_destroy_inode, |
1084 | @@ -750,6 +756,7 @@ static const struct super_operations ceph_super_ops = { |
1085 | .evict_inode = ceph_evict_inode, |
1086 | .sync_fs = ceph_sync_fs, |
1087 | .put_super = ceph_put_super, |
1088 | + .remount_fs = ceph_remount, |
1089 | .show_options = ceph_show_options, |
1090 | .statfs = ceph_statfs, |
1091 | .umount_begin = ceph_umount_begin, |
1092 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
1093 | index 97d8e2a3df9b..f7ad2a3677be 100644 |
1094 | --- a/fs/cifs/smb2ops.c |
1095 | +++ b/fs/cifs/smb2ops.c |
1096 | @@ -1413,26 +1413,28 @@ smb21_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock, |
1097 | unsigned int epoch, bool *purge_cache) |
1098 | { |
1099 | char message[5] = {0}; |
1100 | + unsigned int new_oplock = 0; |
1101 | |
1102 | oplock &= 0xFF; |
1103 | if (oplock == SMB2_OPLOCK_LEVEL_NOCHANGE) |
1104 | return; |
1105 | |
1106 | - cinode->oplock = 0; |
1107 | if (oplock & SMB2_LEASE_READ_CACHING_HE) { |
1108 | - cinode->oplock |= CIFS_CACHE_READ_FLG; |
1109 | + new_oplock |= CIFS_CACHE_READ_FLG; |
1110 | strcat(message, "R"); |
1111 | } |
1112 | if (oplock & SMB2_LEASE_HANDLE_CACHING_HE) { |
1113 | - cinode->oplock |= CIFS_CACHE_HANDLE_FLG; |
1114 | + new_oplock |= CIFS_CACHE_HANDLE_FLG; |
1115 | strcat(message, "H"); |
1116 | } |
1117 | if (oplock & SMB2_LEASE_WRITE_CACHING_HE) { |
1118 | - cinode->oplock |= CIFS_CACHE_WRITE_FLG; |
1119 | + new_oplock |= CIFS_CACHE_WRITE_FLG; |
1120 | strcat(message, "W"); |
1121 | } |
1122 | - if (!cinode->oplock) |
1123 | - strcat(message, "None"); |
1124 | + if (!new_oplock) |
1125 | + strncpy(message, "None", sizeof(message)); |
1126 | + |
1127 | + cinode->oplock = new_oplock; |
1128 | cifs_dbg(FYI, "%s Lease granted on inode %p\n", message, |
1129 | &cinode->vfs_inode); |
1130 | } |
1131 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c |
1132 | index 30a607473621..037990342321 100644 |
1133 | --- a/fs/fuse/file.c |
1134 | +++ b/fs/fuse/file.c |
1135 | @@ -1521,7 +1521,7 @@ __acquires(fc->lock) |
1136 | { |
1137 | struct fuse_conn *fc = get_fuse_conn(inode); |
1138 | struct fuse_inode *fi = get_fuse_inode(inode); |
1139 | - size_t crop = i_size_read(inode); |
1140 | + loff_t crop = i_size_read(inode); |
1141 | struct fuse_req *req; |
1142 | |
1143 | while (fi->writectr >= 0 && !list_empty(&fi->queued_writes)) { |
1144 | @@ -2961,6 +2961,13 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, |
1145 | } |
1146 | } |
1147 | |
1148 | + if (!(mode & FALLOC_FL_KEEP_SIZE) && |
1149 | + offset + length > i_size_read(inode)) { |
1150 | + err = inode_newsize_ok(inode, offset + length); |
1151 | + if (err) |
1152 | + return err; |
1153 | + } |
1154 | + |
1155 | if (!(mode & FALLOC_FL_KEEP_SIZE)) |
1156 | set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
1157 | |
1158 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c |
1159 | index 857af951831f..6f474b067032 100644 |
1160 | --- a/fs/nfs/nfs4state.c |
1161 | +++ b/fs/nfs/nfs4state.c |
1162 | @@ -143,6 +143,10 @@ int nfs40_discover_server_trunking(struct nfs_client *clp, |
1163 | /* Sustain the lease, even if it's empty. If the clientid4 |
1164 | * goes stale it's of no use for trunking discovery. */ |
1165 | nfs4_schedule_state_renewal(*result); |
1166 | + |
1167 | + /* If the client state need to recover, do it. */ |
1168 | + if (clp->cl_state) |
1169 | + nfs4_schedule_state_manager(clp); |
1170 | } |
1171 | out: |
1172 | return status; |
1173 | diff --git a/fs/ufs/util.h b/fs/ufs/util.h |
1174 | index 398019fb1448..9c4fb1fc0822 100644 |
1175 | --- a/fs/ufs/util.h |
1176 | +++ b/fs/ufs/util.h |
1177 | @@ -228,7 +228,7 @@ ufs_get_inode_gid(struct super_block *sb, struct ufs_inode *inode) |
1178 | case UFS_UID_44BSD: |
1179 | return fs32_to_cpu(sb, inode->ui_u3.ui_44.ui_gid); |
1180 | case UFS_UID_EFT: |
1181 | - if (inode->ui_u1.oldids.ui_suid == 0xFFFF) |
1182 | + if (inode->ui_u1.oldids.ui_sgid == 0xFFFF) |
1183 | return fs32_to_cpu(sb, inode->ui_u3.ui_sun.ui_gid); |
1184 | /* Fall through */ |
1185 | default: |
1186 | diff --git a/include/linux/of.h b/include/linux/of.h |
1187 | index aac3f09c5d90..56d83c2a6bbb 100644 |
1188 | --- a/include/linux/of.h |
1189 | +++ b/include/linux/of.h |
1190 | @@ -220,8 +220,8 @@ extern struct device_node *of_find_all_nodes(struct device_node *prev); |
1191 | static inline u64 of_read_number(const __be32 *cell, int size) |
1192 | { |
1193 | u64 r = 0; |
1194 | - while (size--) |
1195 | - r = (r << 32) | be32_to_cpu(*(cell++)); |
1196 | + for (; size--; cell++) |
1197 | + r = (r << 32) | be32_to_cpu(*cell); |
1198 | return r; |
1199 | } |
1200 | |
1201 | diff --git a/include/linux/pci.h b/include/linux/pci.h |
1202 | index 534cb43e8635..b9ac0ba81221 100644 |
1203 | --- a/include/linux/pci.h |
1204 | +++ b/include/linux/pci.h |
1205 | @@ -320,6 +320,8 @@ struct pci_dev { |
1206 | unsigned int hotplug_user_indicators:1; /* SlotCtl indicators |
1207 | controlled exclusively by |
1208 | user sysfs */ |
1209 | + unsigned int clear_retrain_link:1; /* Need to clear Retrain Link |
1210 | + bit manually */ |
1211 | unsigned int d3_delay; /* D3->D0 transition time in ms */ |
1212 | unsigned int d3cold_delay; /* D3cold->D0 transition time in ms */ |
1213 | |
1214 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
1215 | index 9549ed120556..af969f753e5e 100644 |
1216 | --- a/kernel/trace/trace_events.c |
1217 | +++ b/kernel/trace/trace_events.c |
1218 | @@ -1310,9 +1310,6 @@ event_id_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) |
1219 | char buf[32]; |
1220 | int len; |
1221 | |
1222 | - if (*ppos) |
1223 | - return 0; |
1224 | - |
1225 | if (unlikely(!id)) |
1226 | return -ENODEV; |
1227 | |
1228 | diff --git a/net/core/dev.c b/net/core/dev.c |
1229 | index 8e187f90c85d..5a3196448bd7 100644 |
1230 | --- a/net/core/dev.c |
1231 | +++ b/net/core/dev.c |
1232 | @@ -7499,7 +7499,7 @@ static void netdev_wait_allrefs(struct net_device *dev) |
1233 | |
1234 | refcnt = netdev_refcnt_read(dev); |
1235 | |
1236 | - if (time_after(jiffies, warning_time + 10 * HZ)) { |
1237 | + if (refcnt && time_after(jiffies, warning_time + 10 * HZ)) { |
1238 | pr_emerg("unregister_netdevice: waiting for %s to become free. Usage count = %d\n", |
1239 | dev->name, refcnt); |
1240 | warning_time = jiffies; |
1241 | diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c |
1242 | index 270e79f4d40e..4e39c935e057 100644 |
1243 | --- a/net/ipv4/ip_vti.c |
1244 | +++ b/net/ipv4/ip_vti.c |
1245 | @@ -678,9 +678,9 @@ static int __init vti_init(void) |
1246 | return err; |
1247 | |
1248 | rtnl_link_failed: |
1249 | - xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP); |
1250 | -xfrm_tunnel_failed: |
1251 | xfrm4_tunnel_deregister(&ipip_handler, AF_INET); |
1252 | +xfrm_tunnel_failed: |
1253 | + xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP); |
1254 | xfrm_proto_comp_failed: |
1255 | xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH); |
1256 | xfrm_proto_ah_failed: |
1257 | @@ -696,6 +696,7 @@ pernet_dev_failed: |
1258 | static void __exit vti_fini(void) |
1259 | { |
1260 | rtnl_link_unregister(&vti_link_ops); |
1261 | + xfrm4_tunnel_deregister(&ipip_handler, AF_INET); |
1262 | xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP); |
1263 | xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH); |
1264 | xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP); |
1265 | diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c |
1266 | index 622e158a6fc4..1805413cd225 100644 |
1267 | --- a/net/ipv4/xfrm4_policy.c |
1268 | +++ b/net/ipv4/xfrm4_policy.c |
1269 | @@ -108,7 +108,8 @@ static void |
1270 | _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1271 | { |
1272 | const struct iphdr *iph = ip_hdr(skb); |
1273 | - u8 *xprth = skb_network_header(skb) + iph->ihl * 4; |
1274 | + int ihl = iph->ihl; |
1275 | + u8 *xprth = skb_network_header(skb) + ihl * 4; |
1276 | struct flowi4 *fl4 = &fl->u.ip4; |
1277 | int oif = 0; |
1278 | |
1279 | @@ -119,6 +120,11 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1280 | fl4->flowi4_mark = skb->mark; |
1281 | fl4->flowi4_oif = reverse ? skb->skb_iif : oif; |
1282 | |
1283 | + fl4->flowi4_proto = iph->protocol; |
1284 | + fl4->daddr = reverse ? iph->saddr : iph->daddr; |
1285 | + fl4->saddr = reverse ? iph->daddr : iph->saddr; |
1286 | + fl4->flowi4_tos = iph->tos; |
1287 | + |
1288 | if (!ip_is_fragment(iph)) { |
1289 | switch (iph->protocol) { |
1290 | case IPPROTO_UDP: |
1291 | @@ -130,7 +136,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1292 | pskb_may_pull(skb, xprth + 4 - skb->data)) { |
1293 | __be16 *ports; |
1294 | |
1295 | - xprth = skb_network_header(skb) + iph->ihl * 4; |
1296 | + xprth = skb_network_header(skb) + ihl * 4; |
1297 | ports = (__be16 *)xprth; |
1298 | |
1299 | fl4->fl4_sport = ports[!!reverse]; |
1300 | @@ -143,7 +149,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1301 | pskb_may_pull(skb, xprth + 2 - skb->data)) { |
1302 | u8 *icmp; |
1303 | |
1304 | - xprth = skb_network_header(skb) + iph->ihl * 4; |
1305 | + xprth = skb_network_header(skb) + ihl * 4; |
1306 | icmp = xprth; |
1307 | |
1308 | fl4->fl4_icmp_type = icmp[0]; |
1309 | @@ -156,7 +162,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1310 | pskb_may_pull(skb, xprth + 4 - skb->data)) { |
1311 | __be32 *ehdr; |
1312 | |
1313 | - xprth = skb_network_header(skb) + iph->ihl * 4; |
1314 | + xprth = skb_network_header(skb) + ihl * 4; |
1315 | ehdr = (__be32 *)xprth; |
1316 | |
1317 | fl4->fl4_ipsec_spi = ehdr[0]; |
1318 | @@ -168,7 +174,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1319 | pskb_may_pull(skb, xprth + 8 - skb->data)) { |
1320 | __be32 *ah_hdr; |
1321 | |
1322 | - xprth = skb_network_header(skb) + iph->ihl * 4; |
1323 | + xprth = skb_network_header(skb) + ihl * 4; |
1324 | ah_hdr = (__be32 *)xprth; |
1325 | |
1326 | fl4->fl4_ipsec_spi = ah_hdr[1]; |
1327 | @@ -180,7 +186,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1328 | pskb_may_pull(skb, xprth + 4 - skb->data)) { |
1329 | __be16 *ipcomp_hdr; |
1330 | |
1331 | - xprth = skb_network_header(skb) + iph->ihl * 4; |
1332 | + xprth = skb_network_header(skb) + ihl * 4; |
1333 | ipcomp_hdr = (__be16 *)xprth; |
1334 | |
1335 | fl4->fl4_ipsec_spi = htonl(ntohs(ipcomp_hdr[1])); |
1336 | @@ -193,7 +199,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1337 | __be16 *greflags; |
1338 | __be32 *gre_hdr; |
1339 | |
1340 | - xprth = skb_network_header(skb) + iph->ihl * 4; |
1341 | + xprth = skb_network_header(skb) + ihl * 4; |
1342 | greflags = (__be16 *)xprth; |
1343 | gre_hdr = (__be32 *)xprth; |
1344 | |
1345 | @@ -210,10 +216,6 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1346 | break; |
1347 | } |
1348 | } |
1349 | - fl4->flowi4_proto = iph->protocol; |
1350 | - fl4->daddr = reverse ? iph->saddr : iph->daddr; |
1351 | - fl4->saddr = reverse ? iph->daddr : iph->saddr; |
1352 | - fl4->flowi4_tos = iph->tos; |
1353 | } |
1354 | |
1355 | static inline int xfrm4_garbage_collect(struct dst_ops *ops) |
1356 | diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c |
1357 | index 3a2701d42f47..07b7b2540579 100644 |
1358 | --- a/net/ipv6/xfrm6_tunnel.c |
1359 | +++ b/net/ipv6/xfrm6_tunnel.c |
1360 | @@ -391,6 +391,10 @@ static void __exit xfrm6_tunnel_fini(void) |
1361 | xfrm6_tunnel_deregister(&xfrm6_tunnel_handler, AF_INET6); |
1362 | xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6); |
1363 | unregister_pernet_subsys(&xfrm6_tunnel_net_ops); |
1364 | + /* Someone maybe has gotten the xfrm6_tunnel_spi. |
1365 | + * So need to wait it. |
1366 | + */ |
1367 | + rcu_barrier(); |
1368 | kmem_cache_destroy(xfrm6_tunnel_spi_kmem); |
1369 | } |
1370 | |
1371 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c |
1372 | index 5768560cbfc3..ad03331ee785 100644 |
1373 | --- a/net/mac80211/iface.c |
1374 | +++ b/net/mac80211/iface.c |
1375 | @@ -1937,6 +1937,9 @@ void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) |
1376 | list_del_rcu(&sdata->list); |
1377 | mutex_unlock(&sdata->local->iflist_mtx); |
1378 | |
1379 | + if (sdata->vif.txq) |
1380 | + ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); |
1381 | + |
1382 | synchronize_rcu(); |
1383 | |
1384 | if (sdata->dev) { |
1385 | diff --git a/net/tipc/core.c b/net/tipc/core.c |
1386 | index 236b043a4156..974694121ce9 100644 |
1387 | --- a/net/tipc/core.c |
1388 | +++ b/net/tipc/core.c |
1389 | @@ -62,6 +62,10 @@ static int __net_init tipc_init_net(struct net *net) |
1390 | INIT_LIST_HEAD(&tn->node_list); |
1391 | spin_lock_init(&tn->node_list_lock); |
1392 | |
1393 | + err = tipc_socket_init(); |
1394 | + if (err) |
1395 | + goto out_socket; |
1396 | + |
1397 | err = tipc_sk_rht_init(net); |
1398 | if (err) |
1399 | goto out_sk_rht; |
1400 | @@ -88,6 +92,8 @@ out_subscr: |
1401 | out_nametbl: |
1402 | tipc_sk_rht_destroy(net); |
1403 | out_sk_rht: |
1404 | + tipc_socket_stop(); |
1405 | +out_socket: |
1406 | return err; |
1407 | } |
1408 | |
1409 | @@ -98,6 +104,7 @@ static void __net_exit tipc_exit_net(struct net *net) |
1410 | tipc_bcast_stop(net); |
1411 | tipc_nametbl_stop(net); |
1412 | tipc_sk_rht_destroy(net); |
1413 | + tipc_socket_stop(); |
1414 | } |
1415 | |
1416 | static struct pernet_operations tipc_net_ops = { |
1417 | @@ -125,10 +132,6 @@ static int __init tipc_init(void) |
1418 | if (err) |
1419 | goto out_netlink_compat; |
1420 | |
1421 | - err = tipc_socket_init(); |
1422 | - if (err) |
1423 | - goto out_socket; |
1424 | - |
1425 | err = tipc_register_sysctl(); |
1426 | if (err) |
1427 | goto out_sysctl; |
1428 | @@ -148,8 +151,6 @@ out_bearer: |
1429 | out_pernet: |
1430 | tipc_unregister_sysctl(); |
1431 | out_sysctl: |
1432 | - tipc_socket_stop(); |
1433 | -out_socket: |
1434 | tipc_netlink_compat_stop(); |
1435 | out_netlink_compat: |
1436 | tipc_netlink_stop(); |
1437 | @@ -164,7 +165,6 @@ static void __exit tipc_exit(void) |
1438 | unregister_pernet_subsys(&tipc_net_ops); |
1439 | tipc_netlink_stop(); |
1440 | tipc_netlink_compat_stop(); |
1441 | - tipc_socket_stop(); |
1442 | tipc_unregister_sysctl(); |
1443 | |
1444 | pr_info("Deactivated\n"); |
1445 | diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c |
1446 | index f66a6010ae07..0bd5a60f3bde 100644 |
1447 | --- a/net/vmw_vsock/virtio_transport.c |
1448 | +++ b/net/vmw_vsock/virtio_transport.c |
1449 | @@ -600,28 +600,27 @@ static int __init virtio_vsock_init(void) |
1450 | if (!virtio_vsock_workqueue) |
1451 | return -ENOMEM; |
1452 | |
1453 | - ret = register_virtio_driver(&virtio_vsock_driver); |
1454 | + ret = vsock_core_init(&virtio_transport.transport); |
1455 | if (ret) |
1456 | goto out_wq; |
1457 | |
1458 | - ret = vsock_core_init(&virtio_transport.transport); |
1459 | + ret = register_virtio_driver(&virtio_vsock_driver); |
1460 | if (ret) |
1461 | - goto out_vdr; |
1462 | + goto out_vci; |
1463 | |
1464 | return 0; |
1465 | |
1466 | -out_vdr: |
1467 | - unregister_virtio_driver(&virtio_vsock_driver); |
1468 | +out_vci: |
1469 | + vsock_core_exit(); |
1470 | out_wq: |
1471 | destroy_workqueue(virtio_vsock_workqueue); |
1472 | return ret; |
1473 | - |
1474 | } |
1475 | |
1476 | static void __exit virtio_vsock_exit(void) |
1477 | { |
1478 | - vsock_core_exit(); |
1479 | unregister_virtio_driver(&virtio_vsock_driver); |
1480 | + vsock_core_exit(); |
1481 | destroy_workqueue(virtio_vsock_workqueue); |
1482 | } |
1483 | |
1484 | diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c |
1485 | index cc4b4abb2759..aa9d1c7780c3 100644 |
1486 | --- a/net/vmw_vsock/virtio_transport_common.c |
1487 | +++ b/net/vmw_vsock/virtio_transport_common.c |
1488 | @@ -725,12 +725,19 @@ static bool virtio_transport_close(struct vsock_sock *vsk) |
1489 | |
1490 | void virtio_transport_release(struct vsock_sock *vsk) |
1491 | { |
1492 | + struct virtio_vsock_sock *vvs = vsk->trans; |
1493 | + struct virtio_vsock_pkt *pkt, *tmp; |
1494 | struct sock *sk = &vsk->sk; |
1495 | bool remove_sock = true; |
1496 | |
1497 | lock_sock(sk); |
1498 | if (sk->sk_type == SOCK_STREAM) |
1499 | remove_sock = virtio_transport_close(vsk); |
1500 | + |
1501 | + list_for_each_entry_safe(pkt, tmp, &vvs->rx_queue, list) { |
1502 | + list_del(&pkt->list); |
1503 | + virtio_transport_free_pkt(pkt); |
1504 | + } |
1505 | release_sock(sk); |
1506 | |
1507 | if (remove_sock) |
1508 | diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c |
1509 | index f6f91c3b2de0..ca5c79bfd9a5 100644 |
1510 | --- a/net/xfrm/xfrm_user.c |
1511 | +++ b/net/xfrm/xfrm_user.c |
1512 | @@ -1344,7 +1344,7 @@ static int verify_newpolicy_info(struct xfrm_userpolicy_info *p) |
1513 | ret = verify_policy_dir(p->dir); |
1514 | if (ret) |
1515 | return ret; |
1516 | - if (p->index && ((p->index & XFRM_POLICY_MAX) != p->dir)) |
1517 | + if (p->index && (xfrm_policy_id2dir(p->index) != p->dir)) |
1518 | return -EINVAL; |
1519 | |
1520 | return 0; |
1521 | diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile |
1522 | index 8ae824dbfca3..884d4f1ed0c1 100644 |
1523 | --- a/tools/objtool/Makefile |
1524 | +++ b/tools/objtool/Makefile |
1525 | @@ -7,11 +7,12 @@ ARCH := x86 |
1526 | endif |
1527 | |
1528 | # always use the host compiler |
1529 | +HOSTAR ?= ar |
1530 | HOSTCC ?= gcc |
1531 | HOSTLD ?= ld |
1532 | +AR = $(HOSTAR) |
1533 | CC = $(HOSTCC) |
1534 | LD = $(HOSTLD) |
1535 | -AR = ar |
1536 | |
1537 | ifeq ($(srctree),) |
1538 | srctree := $(patsubst %/,%,$(dir $(CURDIR))) |
1539 | diff --git a/tools/perf/bench/numa.c b/tools/perf/bench/numa.c |
1540 | index ee9565a033f4..e58be7eeced8 100644 |
1541 | --- a/tools/perf/bench/numa.c |
1542 | +++ b/tools/perf/bench/numa.c |
1543 | @@ -35,6 +35,10 @@ |
1544 | #include <numa.h> |
1545 | #include <numaif.h> |
1546 | |
1547 | +#ifndef RUSAGE_THREAD |
1548 | +# define RUSAGE_THREAD 1 |
1549 | +#endif |
1550 | + |
1551 | /* |
1552 | * Regular printout to the terminal, supressed if -q is specified: |
1553 | */ |
1554 | diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
1555 | index 3c1372655c33..63fa3a95a1d6 100644 |
1556 | --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
1557 | +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
1558 | @@ -58,6 +58,7 @@ enum intel_pt_pkt_state { |
1559 | INTEL_PT_STATE_NO_IP, |
1560 | INTEL_PT_STATE_ERR_RESYNC, |
1561 | INTEL_PT_STATE_IN_SYNC, |
1562 | + INTEL_PT_STATE_TNT_CONT, |
1563 | INTEL_PT_STATE_TNT, |
1564 | INTEL_PT_STATE_TIP, |
1565 | INTEL_PT_STATE_TIP_PGD, |
1566 | @@ -72,8 +73,9 @@ static inline bool intel_pt_sample_time(enum intel_pt_pkt_state pkt_state) |
1567 | case INTEL_PT_STATE_NO_IP: |
1568 | case INTEL_PT_STATE_ERR_RESYNC: |
1569 | case INTEL_PT_STATE_IN_SYNC: |
1570 | - case INTEL_PT_STATE_TNT: |
1571 | + case INTEL_PT_STATE_TNT_CONT: |
1572 | return true; |
1573 | + case INTEL_PT_STATE_TNT: |
1574 | case INTEL_PT_STATE_TIP: |
1575 | case INTEL_PT_STATE_TIP_PGD: |
1576 | case INTEL_PT_STATE_FUP: |
1577 | @@ -856,16 +858,20 @@ static uint64_t intel_pt_next_period(struct intel_pt_decoder *decoder) |
1578 | timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; |
1579 | masked_timestamp = timestamp & decoder->period_mask; |
1580 | if (decoder->continuous_period) { |
1581 | - if (masked_timestamp != decoder->last_masked_timestamp) |
1582 | + if (masked_timestamp > decoder->last_masked_timestamp) |
1583 | return 1; |
1584 | } else { |
1585 | timestamp += 1; |
1586 | masked_timestamp = timestamp & decoder->period_mask; |
1587 | - if (masked_timestamp != decoder->last_masked_timestamp) { |
1588 | + if (masked_timestamp > decoder->last_masked_timestamp) { |
1589 | decoder->last_masked_timestamp = masked_timestamp; |
1590 | decoder->continuous_period = true; |
1591 | } |
1592 | } |
1593 | + |
1594 | + if (masked_timestamp < decoder->last_masked_timestamp) |
1595 | + return decoder->period_ticks; |
1596 | + |
1597 | return decoder->period_ticks - (timestamp - masked_timestamp); |
1598 | } |
1599 | |
1600 | @@ -894,7 +900,10 @@ static void intel_pt_sample_insn(struct intel_pt_decoder *decoder) |
1601 | case INTEL_PT_PERIOD_TICKS: |
1602 | timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; |
1603 | masked_timestamp = timestamp & decoder->period_mask; |
1604 | - decoder->last_masked_timestamp = masked_timestamp; |
1605 | + if (masked_timestamp > decoder->last_masked_timestamp) |
1606 | + decoder->last_masked_timestamp = masked_timestamp; |
1607 | + else |
1608 | + decoder->last_masked_timestamp += decoder->period_ticks; |
1609 | break; |
1610 | case INTEL_PT_PERIOD_NONE: |
1611 | case INTEL_PT_PERIOD_MTC: |
1612 | @@ -1171,7 +1180,9 @@ static int intel_pt_walk_tnt(struct intel_pt_decoder *decoder) |
1613 | return -ENOENT; |
1614 | } |
1615 | decoder->tnt.count -= 1; |
1616 | - if (!decoder->tnt.count) |
1617 | + if (decoder->tnt.count) |
1618 | + decoder->pkt_state = INTEL_PT_STATE_TNT_CONT; |
1619 | + else |
1620 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
1621 | decoder->tnt.payload <<= 1; |
1622 | decoder->state.from_ip = decoder->ip; |
1623 | @@ -1202,7 +1213,9 @@ static int intel_pt_walk_tnt(struct intel_pt_decoder *decoder) |
1624 | |
1625 | if (intel_pt_insn.branch == INTEL_PT_BR_CONDITIONAL) { |
1626 | decoder->tnt.count -= 1; |
1627 | - if (!decoder->tnt.count) |
1628 | + if (decoder->tnt.count) |
1629 | + decoder->pkt_state = INTEL_PT_STATE_TNT_CONT; |
1630 | + else |
1631 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
1632 | if (decoder->tnt.payload & BIT63) { |
1633 | decoder->tnt.payload <<= 1; |
1634 | @@ -1222,8 +1235,11 @@ static int intel_pt_walk_tnt(struct intel_pt_decoder *decoder) |
1635 | return 0; |
1636 | } |
1637 | decoder->ip += intel_pt_insn.length; |
1638 | - if (!decoder->tnt.count) |
1639 | + if (!decoder->tnt.count) { |
1640 | + decoder->sample_timestamp = decoder->timestamp; |
1641 | + decoder->sample_insn_cnt = decoder->timestamp_insn_cnt; |
1642 | return -EAGAIN; |
1643 | + } |
1644 | decoder->tnt.payload <<= 1; |
1645 | continue; |
1646 | } |
1647 | @@ -2146,6 +2162,7 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder) |
1648 | err = intel_pt_walk_trace(decoder); |
1649 | break; |
1650 | case INTEL_PT_STATE_TNT: |
1651 | + case INTEL_PT_STATE_TNT_CONT: |
1652 | err = intel_pt_walk_tnt(decoder); |
1653 | if (err == -EAGAIN) |
1654 | err = intel_pt_walk_trace(decoder); |