diff options
Diffstat (limited to 'drivers')
24 files changed, 138 insertions, 133 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 6e93e7f98358..61190f6b4829 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1658,10 +1658,8 @@ void cpufreq_suspend(void) | |||
1658 | if (!cpufreq_driver) | 1658 | if (!cpufreq_driver) |
1659 | return; | 1659 | return; |
1660 | 1660 | ||
1661 | cpufreq_suspended = true; | ||
1662 | |||
1663 | if (!has_target()) | 1661 | if (!has_target()) |
1664 | return; | 1662 | goto suspend; |
1665 | 1663 | ||
1666 | pr_debug("%s: Suspending Governors\n", __func__); | 1664 | pr_debug("%s: Suspending Governors\n", __func__); |
1667 | 1665 | ||
@@ -1674,6 +1672,9 @@ void cpufreq_suspend(void) | |||
1674 | pr_err("%s: Failed to suspend driver: %p\n", __func__, | 1672 | pr_err("%s: Failed to suspend driver: %p\n", __func__, |
1675 | policy); | 1673 | policy); |
1676 | } | 1674 | } |
1675 | |||
1676 | suspend: | ||
1677 | cpufreq_suspended = true; | ||
1677 | } | 1678 | } |
1678 | 1679 | ||
1679 | /** | 1680 | /** |
diff --git a/drivers/cpufreq/integrator-cpufreq.c b/drivers/cpufreq/integrator-cpufreq.c index c1320528b9d0..6bd69adc3c5e 100644 --- a/drivers/cpufreq/integrator-cpufreq.c +++ b/drivers/cpufreq/integrator-cpufreq.c | |||
@@ -213,9 +213,9 @@ static int __init integrator_cpufreq_probe(struct platform_device *pdev) | |||
213 | return cpufreq_register_driver(&integrator_driver); | 213 | return cpufreq_register_driver(&integrator_driver); |
214 | } | 214 | } |
215 | 215 | ||
216 | static void __exit integrator_cpufreq_remove(struct platform_device *pdev) | 216 | static int __exit integrator_cpufreq_remove(struct platform_device *pdev) |
217 | { | 217 | { |
218 | cpufreq_unregister_driver(&integrator_driver); | 218 | return cpufreq_unregister_driver(&integrator_driver); |
219 | } | 219 | } |
220 | 220 | ||
221 | static const struct of_device_id integrator_cpufreq_match[] = { | 221 | static const struct of_device_id integrator_cpufreq_match[] = { |
diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c index 728a2d879499..4d2c8e861089 100644 --- a/drivers/cpufreq/pcc-cpufreq.c +++ b/drivers/cpufreq/pcc-cpufreq.c | |||
@@ -204,7 +204,6 @@ static int pcc_cpufreq_target(struct cpufreq_policy *policy, | |||
204 | u32 input_buffer; | 204 | u32 input_buffer; |
205 | int cpu; | 205 | int cpu; |
206 | 206 | ||
207 | spin_lock(&pcc_lock); | ||
208 | cpu = policy->cpu; | 207 | cpu = policy->cpu; |
209 | pcc_cpu_data = per_cpu_ptr(pcc_cpu_info, cpu); | 208 | pcc_cpu_data = per_cpu_ptr(pcc_cpu_info, cpu); |
210 | 209 | ||
@@ -216,6 +215,7 @@ static int pcc_cpufreq_target(struct cpufreq_policy *policy, | |||
216 | freqs.old = policy->cur; | 215 | freqs.old = policy->cur; |
217 | freqs.new = target_freq; | 216 | freqs.new = target_freq; |
218 | cpufreq_freq_transition_begin(policy, &freqs); | 217 | cpufreq_freq_transition_begin(policy, &freqs); |
218 | spin_lock(&pcc_lock); | ||
219 | 219 | ||
220 | input_buffer = 0x1 | (((target_freq * 100) | 220 | input_buffer = 0x1 | (((target_freq * 100) |
221 | / (ioread32(&pcch_hdr->nominal) * 1000)) << 8); | 221 | / (ioread32(&pcch_hdr->nominal) * 1000)) << 8); |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 1411613f2174..e42925f76b4b 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -1310,6 +1310,16 @@ void i915_check_and_clear_faults(struct drm_device *dev) | |||
1310 | POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS])); | 1310 | POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS])); |
1311 | } | 1311 | } |
1312 | 1312 | ||
1313 | static void i915_ggtt_flush(struct drm_i915_private *dev_priv) | ||
1314 | { | ||
1315 | if (INTEL_INFO(dev_priv->dev)->gen < 6) { | ||
1316 | intel_gtt_chipset_flush(); | ||
1317 | } else { | ||
1318 | I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN); | ||
1319 | POSTING_READ(GFX_FLSH_CNTL_GEN6); | ||
1320 | } | ||
1321 | } | ||
1322 | |||
1313 | void i915_gem_suspend_gtt_mappings(struct drm_device *dev) | 1323 | void i915_gem_suspend_gtt_mappings(struct drm_device *dev) |
1314 | { | 1324 | { |
1315 | struct drm_i915_private *dev_priv = dev->dev_private; | 1325 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1326,6 +1336,8 @@ void i915_gem_suspend_gtt_mappings(struct drm_device *dev) | |||
1326 | dev_priv->gtt.base.start, | 1336 | dev_priv->gtt.base.start, |
1327 | dev_priv->gtt.base.total, | 1337 | dev_priv->gtt.base.total, |
1328 | true); | 1338 | true); |
1339 | |||
1340 | i915_ggtt_flush(dev_priv); | ||
1329 | } | 1341 | } |
1330 | 1342 | ||
1331 | void i915_gem_restore_gtt_mappings(struct drm_device *dev) | 1343 | void i915_gem_restore_gtt_mappings(struct drm_device *dev) |
@@ -1378,7 +1390,7 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev) | |||
1378 | gen6_write_pdes(container_of(vm, struct i915_hw_ppgtt, base)); | 1390 | gen6_write_pdes(container_of(vm, struct i915_hw_ppgtt, base)); |
1379 | } | 1391 | } |
1380 | 1392 | ||
1381 | i915_gem_chipset_flush(dev); | 1393 | i915_ggtt_flush(dev_priv); |
1382 | } | 1394 | } |
1383 | 1395 | ||
1384 | int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj) | 1396 | int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj) |
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index ca52ad2ae7d1..d8de1d5140a7 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c | |||
@@ -396,6 +396,16 @@ int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state) | |||
396 | return -EINVAL; | 396 | return -EINVAL; |
397 | } | 397 | } |
398 | 398 | ||
399 | /* | ||
400 | * If the vendor backlight interface is not in use and ACPI backlight interface | ||
401 | * is broken, do not bother processing backlight change requests from firmware. | ||
402 | */ | ||
403 | static bool should_ignore_backlight_request(void) | ||
404 | { | ||
405 | return acpi_video_backlight_support() && | ||
406 | !acpi_video_verify_backlight_support(); | ||
407 | } | ||
408 | |||
399 | static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) | 409 | static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) |
400 | { | 410 | { |
401 | struct drm_i915_private *dev_priv = dev->dev_private; | 411 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -404,11 +414,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) | |||
404 | 414 | ||
405 | DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp); | 415 | DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp); |
406 | 416 | ||
407 | /* | 417 | if (should_ignore_backlight_request()) { |
408 | * If the acpi_video interface is not supposed to be used, don't | ||
409 | * bother processing backlight level change requests from firmware. | ||
410 | */ | ||
411 | if (!acpi_video_verify_backlight_support()) { | ||
412 | DRM_DEBUG_KMS("opregion backlight request ignored\n"); | 418 | DRM_DEBUG_KMS("opregion backlight request ignored\n"); |
413 | return 0; | 419 | return 0; |
414 | } | 420 | } |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c index 4b5bb5d58a54..f8cbb512132f 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c | |||
@@ -1763,9 +1763,10 @@ nv50_disp_intr_unk40_0_tmds(struct nv50_disp_priv *priv, struct dcb_output *outp | |||
1763 | const int or = ffs(outp->or) - 1; | 1763 | const int or = ffs(outp->or) - 1; |
1764 | const u32 loff = (or * 0x800) + (link * 0x80); | 1764 | const u32 loff = (or * 0x800) + (link * 0x80); |
1765 | const u16 mask = (outp->sorconf.link << 6) | outp->or; | 1765 | const u16 mask = (outp->sorconf.link << 6) | outp->or; |
1766 | struct dcb_output match; | ||
1766 | u8 ver, hdr; | 1767 | u8 ver, hdr; |
1767 | 1768 | ||
1768 | if (dcb_outp_match(bios, DCB_OUTPUT_DP, mask, &ver, &hdr, outp)) | 1769 | if (dcb_outp_match(bios, DCB_OUTPUT_DP, mask, &ver, &hdr, &match)) |
1769 | nv_mask(priv, 0x61c10c + loff, 0x00000001, 0x00000000); | 1770 | nv_mask(priv, 0x61c10c + loff, 0x00000001, 0x00000000); |
1770 | } | 1771 | } |
1771 | 1772 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c index 99cd9e4a2aa6..3440fc999f2f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_chan.c +++ b/drivers/gpu/drm/nouveau/nouveau_chan.c | |||
@@ -285,6 +285,7 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart) | |||
285 | struct nouveau_software_chan *swch; | 285 | struct nouveau_software_chan *swch; |
286 | struct nv_dma_v0 args = {}; | 286 | struct nv_dma_v0 args = {}; |
287 | int ret, i; | 287 | int ret, i; |
288 | bool save; | ||
288 | 289 | ||
289 | nvif_object_map(chan->object); | 290 | nvif_object_map(chan->object); |
290 | 291 | ||
@@ -386,7 +387,11 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart) | |||
386 | } | 387 | } |
387 | 388 | ||
388 | /* initialise synchronisation */ | 389 | /* initialise synchronisation */ |
389 | return nouveau_fence(chan->drm)->context_new(chan); | 390 | save = cli->base.super; |
391 | cli->base.super = true; /* hack until fencenv50 fixed */ | ||
392 | ret = nouveau_fence(chan->drm)->context_new(chan); | ||
393 | cli->base.super = save; | ||
394 | return ret; | ||
390 | } | 395 | } |
391 | 396 | ||
392 | int | 397 | int |
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 65b4fd53dd4e..4a21b2b06ce2 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
@@ -550,14 +550,12 @@ nouveau_display_destroy(struct drm_device *dev) | |||
550 | } | 550 | } |
551 | 551 | ||
552 | int | 552 | int |
553 | nouveau_display_suspend(struct drm_device *dev) | 553 | nouveau_display_suspend(struct drm_device *dev, bool runtime) |
554 | { | 554 | { |
555 | struct nouveau_drm *drm = nouveau_drm(dev); | ||
556 | struct drm_crtc *crtc; | 555 | struct drm_crtc *crtc; |
557 | 556 | ||
558 | nouveau_display_fini(dev); | 557 | nouveau_display_fini(dev); |
559 | 558 | ||
560 | NV_INFO(drm, "unpinning framebuffer(s)...\n"); | ||
561 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 559 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
562 | struct nouveau_framebuffer *nouveau_fb; | 560 | struct nouveau_framebuffer *nouveau_fb; |
563 | 561 | ||
@@ -579,12 +577,13 @@ nouveau_display_suspend(struct drm_device *dev) | |||
579 | } | 577 | } |
580 | 578 | ||
581 | void | 579 | void |
582 | nouveau_display_repin(struct drm_device *dev) | 580 | nouveau_display_resume(struct drm_device *dev, bool runtime) |
583 | { | 581 | { |
584 | struct nouveau_drm *drm = nouveau_drm(dev); | 582 | struct nouveau_drm *drm = nouveau_drm(dev); |
585 | struct drm_crtc *crtc; | 583 | struct drm_crtc *crtc; |
586 | int ret; | 584 | int ret, head; |
587 | 585 | ||
586 | /* re-pin fb/cursors */ | ||
588 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 587 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
589 | struct nouveau_framebuffer *nouveau_fb; | 588 | struct nouveau_framebuffer *nouveau_fb; |
590 | 589 | ||
@@ -606,13 +605,6 @@ nouveau_display_repin(struct drm_device *dev) | |||
606 | if (ret) | 605 | if (ret) |
607 | NV_ERROR(drm, "Could not pin/map cursor.\n"); | 606 | NV_ERROR(drm, "Could not pin/map cursor.\n"); |
608 | } | 607 | } |
609 | } | ||
610 | |||
611 | void | ||
612 | nouveau_display_resume(struct drm_device *dev) | ||
613 | { | ||
614 | struct drm_crtc *crtc; | ||
615 | int head; | ||
616 | 608 | ||
617 | nouveau_display_init(dev); | 609 | nouveau_display_init(dev); |
618 | 610 | ||
@@ -627,6 +619,13 @@ nouveau_display_resume(struct drm_device *dev) | |||
627 | for (head = 0; head < dev->mode_config.num_crtc; head++) | 619 | for (head = 0; head < dev->mode_config.num_crtc; head++) |
628 | drm_vblank_on(dev, head); | 620 | drm_vblank_on(dev, head); |
629 | 621 | ||
622 | /* This should ensure we don't hit a locking problem when someone | ||
623 | * wakes us up via a connector. We should never go into suspend | ||
624 | * while the display is on anyways. | ||
625 | */ | ||
626 | if (runtime) | ||
627 | return; | ||
628 | |||
630 | drm_helper_resume_force_mode(dev); | 629 | drm_helper_resume_force_mode(dev); |
631 | 630 | ||
632 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 631 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h index 88ca177cb1c7..be3d5947c6be 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.h +++ b/drivers/gpu/drm/nouveau/nouveau_display.h | |||
@@ -63,9 +63,8 @@ int nouveau_display_create(struct drm_device *dev); | |||
63 | void nouveau_display_destroy(struct drm_device *dev); | 63 | void nouveau_display_destroy(struct drm_device *dev); |
64 | int nouveau_display_init(struct drm_device *dev); | 64 | int nouveau_display_init(struct drm_device *dev); |
65 | void nouveau_display_fini(struct drm_device *dev); | 65 | void nouveau_display_fini(struct drm_device *dev); |
66 | int nouveau_display_suspend(struct drm_device *dev); | 66 | int nouveau_display_suspend(struct drm_device *dev, bool runtime); |
67 | void nouveau_display_repin(struct drm_device *dev); | 67 | void nouveau_display_resume(struct drm_device *dev, bool runtime); |
68 | void nouveau_display_resume(struct drm_device *dev); | ||
69 | int nouveau_display_vblank_enable(struct drm_device *, int); | 68 | int nouveau_display_vblank_enable(struct drm_device *, int); |
70 | void nouveau_display_vblank_disable(struct drm_device *, int); | 69 | void nouveau_display_vblank_disable(struct drm_device *, int); |
71 | int nouveau_display_scanoutpos(struct drm_device *, int, unsigned int, | 70 | int nouveau_display_scanoutpos(struct drm_device *, int, unsigned int, |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index 9c3af96a7153..3ed32dd90303 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c | |||
@@ -547,9 +547,11 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime) | |||
547 | struct nouveau_cli *cli; | 547 | struct nouveau_cli *cli; |
548 | int ret; | 548 | int ret; |
549 | 549 | ||
550 | if (dev->mode_config.num_crtc && !runtime) { | 550 | if (dev->mode_config.num_crtc) { |
551 | NV_INFO(drm, "suspending console...\n"); | ||
552 | nouveau_fbcon_set_suspend(dev, 1); | ||
551 | NV_INFO(drm, "suspending display...\n"); | 553 | NV_INFO(drm, "suspending display...\n"); |
552 | ret = nouveau_display_suspend(dev); | 554 | ret = nouveau_display_suspend(dev, runtime); |
553 | if (ret) | 555 | if (ret) |
554 | return ret; | 556 | return ret; |
555 | } | 557 | } |
@@ -603,7 +605,7 @@ fail_client: | |||
603 | fail_display: | 605 | fail_display: |
604 | if (dev->mode_config.num_crtc) { | 606 | if (dev->mode_config.num_crtc) { |
605 | NV_INFO(drm, "resuming display...\n"); | 607 | NV_INFO(drm, "resuming display...\n"); |
606 | nouveau_display_resume(dev); | 608 | nouveau_display_resume(dev, runtime); |
607 | } | 609 | } |
608 | return ret; | 610 | return ret; |
609 | } | 611 | } |
@@ -618,9 +620,6 @@ int nouveau_pmops_suspend(struct device *dev) | |||
618 | drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) | 620 | drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF) |
619 | return 0; | 621 | return 0; |
620 | 622 | ||
621 | if (drm_dev->mode_config.num_crtc) | ||
622 | nouveau_fbcon_set_suspend(drm_dev, 1); | ||
623 | |||
624 | ret = nouveau_do_suspend(drm_dev, false); | 623 | ret = nouveau_do_suspend(drm_dev, false); |
625 | if (ret) | 624 | if (ret) |
626 | return ret; | 625 | return ret; |
@@ -633,7 +632,7 @@ int nouveau_pmops_suspend(struct device *dev) | |||
633 | } | 632 | } |
634 | 633 | ||
635 | static int | 634 | static int |
636 | nouveau_do_resume(struct drm_device *dev) | 635 | nouveau_do_resume(struct drm_device *dev, bool runtime) |
637 | { | 636 | { |
638 | struct nouveau_drm *drm = nouveau_drm(dev); | 637 | struct nouveau_drm *drm = nouveau_drm(dev); |
639 | struct nouveau_cli *cli; | 638 | struct nouveau_cli *cli; |
@@ -658,7 +657,9 @@ nouveau_do_resume(struct drm_device *dev) | |||
658 | 657 | ||
659 | if (dev->mode_config.num_crtc) { | 658 | if (dev->mode_config.num_crtc) { |
660 | NV_INFO(drm, "resuming display...\n"); | 659 | NV_INFO(drm, "resuming display...\n"); |
661 | nouveau_display_repin(dev); | 660 | nouveau_display_resume(dev, runtime); |
661 | NV_INFO(drm, "resuming console...\n"); | ||
662 | nouveau_fbcon_set_suspend(dev, 0); | ||
662 | } | 663 | } |
663 | 664 | ||
664 | return 0; | 665 | return 0; |
@@ -681,47 +682,21 @@ int nouveau_pmops_resume(struct device *dev) | |||
681 | return ret; | 682 | return ret; |
682 | pci_set_master(pdev); | 683 | pci_set_master(pdev); |
683 | 684 | ||
684 | ret = nouveau_do_resume(drm_dev); | 685 | return nouveau_do_resume(drm_dev, false); |
685 | if (ret) | ||
686 | return ret; | ||
687 | |||
688 | if (drm_dev->mode_config.num_crtc) { | ||
689 | nouveau_display_resume(drm_dev); | ||
690 | nouveau_fbcon_set_suspend(drm_dev, 0); | ||
691 | } | ||
692 | |||
693 | return 0; | ||
694 | } | 686 | } |
695 | 687 | ||
696 | static int nouveau_pmops_freeze(struct device *dev) | 688 | static int nouveau_pmops_freeze(struct device *dev) |
697 | { | 689 | { |
698 | struct pci_dev *pdev = to_pci_dev(dev); | 690 | struct pci_dev *pdev = to_pci_dev(dev); |
699 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | 691 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
700 | int ret; | 692 | return nouveau_do_suspend(drm_dev, false); |
701 | |||
702 | if (drm_dev->mode_config.num_crtc) | ||
703 | nouveau_fbcon_set_suspend(drm_dev, 1); | ||
704 | |||
705 | ret = nouveau_do_suspend(drm_dev, false); | ||
706 | return ret; | ||
707 | } | 693 | } |
708 | 694 | ||
709 | static int nouveau_pmops_thaw(struct device *dev) | 695 | static int nouveau_pmops_thaw(struct device *dev) |
710 | { | 696 | { |
711 | struct pci_dev *pdev = to_pci_dev(dev); | 697 | struct pci_dev *pdev = to_pci_dev(dev); |
712 | struct drm_device *drm_dev = pci_get_drvdata(pdev); | 698 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
713 | int ret; | 699 | return nouveau_do_resume(drm_dev, false); |
714 | |||
715 | ret = nouveau_do_resume(drm_dev); | ||
716 | if (ret) | ||
717 | return ret; | ||
718 | |||
719 | if (drm_dev->mode_config.num_crtc) { | ||
720 | nouveau_display_resume(drm_dev); | ||
721 | nouveau_fbcon_set_suspend(drm_dev, 0); | ||
722 | } | ||
723 | |||
724 | return 0; | ||
725 | } | 700 | } |
726 | 701 | ||
727 | 702 | ||
@@ -977,7 +952,7 @@ static int nouveau_pmops_runtime_resume(struct device *dev) | |||
977 | return ret; | 952 | return ret; |
978 | pci_set_master(pdev); | 953 | pci_set_master(pdev); |
979 | 954 | ||
980 | ret = nouveau_do_resume(drm_dev); | 955 | ret = nouveau_do_resume(drm_dev, true); |
981 | drm_kms_helper_poll_enable(drm_dev); | 956 | drm_kms_helper_poll_enable(drm_dev); |
982 | /* do magic */ | 957 | /* do magic */ |
983 | nvif_mask(device, 0x88488, (1 << 25), (1 << 25)); | 958 | nvif_mask(device, 0x88488, (1 << 25), (1 << 25)); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c index 8bdd27091db8..49fe6075cc7c 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c | |||
@@ -486,6 +486,16 @@ static const struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = { | |||
486 | .fb_probe = nouveau_fbcon_create, | 486 | .fb_probe = nouveau_fbcon_create, |
487 | }; | 487 | }; |
488 | 488 | ||
489 | static void | ||
490 | nouveau_fbcon_set_suspend_work(struct work_struct *work) | ||
491 | { | ||
492 | struct nouveau_fbdev *fbcon = container_of(work, typeof(*fbcon), work); | ||
493 | console_lock(); | ||
494 | nouveau_fbcon_accel_restore(fbcon->dev); | ||
495 | nouveau_fbcon_zfill(fbcon->dev, fbcon); | ||
496 | fb_set_suspend(fbcon->helper.fbdev, FBINFO_STATE_RUNNING); | ||
497 | console_unlock(); | ||
498 | } | ||
489 | 499 | ||
490 | int | 500 | int |
491 | nouveau_fbcon_init(struct drm_device *dev) | 501 | nouveau_fbcon_init(struct drm_device *dev) |
@@ -503,6 +513,7 @@ nouveau_fbcon_init(struct drm_device *dev) | |||
503 | if (!fbcon) | 513 | if (!fbcon) |
504 | return -ENOMEM; | 514 | return -ENOMEM; |
505 | 515 | ||
516 | INIT_WORK(&fbcon->work, nouveau_fbcon_set_suspend_work); | ||
506 | fbcon->dev = dev; | 517 | fbcon->dev = dev; |
507 | drm->fbcon = fbcon; | 518 | drm->fbcon = fbcon; |
508 | 519 | ||
@@ -551,14 +562,14 @@ nouveau_fbcon_set_suspend(struct drm_device *dev, int state) | |||
551 | { | 562 | { |
552 | struct nouveau_drm *drm = nouveau_drm(dev); | 563 | struct nouveau_drm *drm = nouveau_drm(dev); |
553 | if (drm->fbcon) { | 564 | if (drm->fbcon) { |
554 | console_lock(); | 565 | if (state == FBINFO_STATE_RUNNING) { |
555 | if (state == 0) { | 566 | schedule_work(&drm->fbcon->work); |
556 | nouveau_fbcon_accel_restore(dev); | 567 | return; |
557 | nouveau_fbcon_zfill(dev, drm->fbcon); | ||
558 | } | 568 | } |
569 | flush_work(&drm->fbcon->work); | ||
570 | console_lock(); | ||
559 | fb_set_suspend(drm->fbcon->helper.fbdev, state); | 571 | fb_set_suspend(drm->fbcon->helper.fbdev, state); |
560 | if (state == 1) | 572 | nouveau_fbcon_accel_save_disable(dev); |
561 | nouveau_fbcon_accel_save_disable(dev); | ||
562 | console_unlock(); | 573 | console_unlock(); |
563 | } | 574 | } |
564 | } | 575 | } |
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h index 34658cfa8f5d..0b465c7d3907 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h | |||
@@ -36,6 +36,7 @@ struct nouveau_fbdev { | |||
36 | struct nouveau_framebuffer nouveau_fb; | 36 | struct nouveau_framebuffer nouveau_fb; |
37 | struct list_head fbdev_list; | 37 | struct list_head fbdev_list; |
38 | struct drm_device *dev; | 38 | struct drm_device *dev; |
39 | struct work_struct work; | ||
39 | unsigned int saved_flags; | 40 | unsigned int saved_flags; |
40 | struct nvif_object surf2d; | 41 | struct nvif_object surf2d; |
41 | struct nvif_object clip; | 42 | struct nvif_object clip; |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 183588b11fc1..9f0fbecd1eb5 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -64,6 +64,10 @@ | |||
64 | #define cpu_to_group(cpu) cpu_to_node(cpu) | 64 | #define cpu_to_group(cpu) cpu_to_node(cpu) |
65 | #define ANY_GROUP NUMA_NO_NODE | 65 | #define ANY_GROUP NUMA_NO_NODE |
66 | 66 | ||
67 | static bool devices_handle_discard_safely = false; | ||
68 | module_param(devices_handle_discard_safely, bool, 0644); | ||
69 | MODULE_PARM_DESC(devices_handle_discard_safely, | ||
70 | "Set to Y if all devices in each array reliably return zeroes on reads from discarded regions"); | ||
67 | static struct workqueue_struct *raid5_wq; | 71 | static struct workqueue_struct *raid5_wq; |
68 | /* | 72 | /* |
69 | * Stripe cache | 73 | * Stripe cache |
@@ -6208,7 +6212,7 @@ static int run(struct mddev *mddev) | |||
6208 | mddev->queue->limits.discard_granularity = stripe; | 6212 | mddev->queue->limits.discard_granularity = stripe; |
6209 | /* | 6213 | /* |
6210 | * unaligned part of discard request will be ignored, so can't | 6214 | * unaligned part of discard request will be ignored, so can't |
6211 | * guarantee discard_zerors_data | 6215 | * guarantee discard_zeroes_data |
6212 | */ | 6216 | */ |
6213 | mddev->queue->limits.discard_zeroes_data = 0; | 6217 | mddev->queue->limits.discard_zeroes_data = 0; |
6214 | 6218 | ||
@@ -6233,6 +6237,18 @@ static int run(struct mddev *mddev) | |||
6233 | !bdev_get_queue(rdev->bdev)-> | 6237 | !bdev_get_queue(rdev->bdev)-> |
6234 | limits.discard_zeroes_data) | 6238 | limits.discard_zeroes_data) |
6235 | discard_supported = false; | 6239 | discard_supported = false; |
6240 | /* Unfortunately, discard_zeroes_data is not currently | ||
6241 | * a guarantee - just a hint. So we only allow DISCARD | ||
6242 | * if the sysadmin has confirmed that only safe devices | ||
6243 | * are in use by setting a module parameter. | ||
6244 | */ | ||
6245 | if (!devices_handle_discard_safely) { | ||
6246 | if (discard_supported) { | ||
6247 | pr_info("md/raid456: discard support disabled due to uncertainty.\n"); | ||
6248 | pr_info("Set raid456.devices_handle_discard_safely=Y to override.\n"); | ||
6249 | } | ||
6250 | discard_supported = false; | ||
6251 | } | ||
6236 | } | 6252 | } |
6237 | 6253 | ||
6238 | if (discard_supported && | 6254 | if (discard_supported && |
diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index a7e24848f6c8..9da812b8a786 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c | |||
@@ -3524,6 +3524,7 @@ static struct usb_driver em28xx_usb_driver = { | |||
3524 | .disconnect = em28xx_usb_disconnect, | 3524 | .disconnect = em28xx_usb_disconnect, |
3525 | .suspend = em28xx_usb_suspend, | 3525 | .suspend = em28xx_usb_suspend, |
3526 | .resume = em28xx_usb_resume, | 3526 | .resume = em28xx_usb_resume, |
3527 | .reset_resume = em28xx_usb_resume, | ||
3527 | .id_table = em28xx_id_table, | 3528 | .id_table = em28xx_id_table, |
3528 | }; | 3529 | }; |
3529 | 3530 | ||
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 86e621142d5b..41095ebad97f 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c | |||
@@ -2213,7 +2213,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2213 | } | 2213 | } |
2214 | } | 2214 | } |
2215 | #else | 2215 | #else |
2216 | dma_addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE)); | 2216 | dma_addr = pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE); |
2217 | if (dma_mapping_error(&VORTEX_PCI(vp)->dev, dma_addr)) | 2217 | if (dma_mapping_error(&VORTEX_PCI(vp)->dev, dma_addr)) |
2218 | goto out_dma_err; | 2218 | goto out_dma_err; |
2219 | vp->tx_ring[entry].addr = cpu_to_le32(dma_addr); | 2219 | vp->tx_ring[entry].addr = cpu_to_le32(dma_addr); |
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 77f1ff7396ac..075688188644 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c | |||
@@ -857,7 +857,8 @@ static irqreturn_t bcm_sysport_wol_isr(int irq, void *dev_id) | |||
857 | return IRQ_HANDLED; | 857 | return IRQ_HANDLED; |
858 | } | 858 | } |
859 | 859 | ||
860 | static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) | 860 | static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb, |
861 | struct net_device *dev) | ||
861 | { | 862 | { |
862 | struct sk_buff *nskb; | 863 | struct sk_buff *nskb; |
863 | struct bcm_tsb *tsb; | 864 | struct bcm_tsb *tsb; |
@@ -873,7 +874,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) | |||
873 | if (!nskb) { | 874 | if (!nskb) { |
874 | dev->stats.tx_errors++; | 875 | dev->stats.tx_errors++; |
875 | dev->stats.tx_dropped++; | 876 | dev->stats.tx_dropped++; |
876 | return -ENOMEM; | 877 | return NULL; |
877 | } | 878 | } |
878 | skb = nskb; | 879 | skb = nskb; |
879 | } | 880 | } |
@@ -892,7 +893,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) | |||
892 | ip_proto = ipv6_hdr(skb)->nexthdr; | 893 | ip_proto = ipv6_hdr(skb)->nexthdr; |
893 | break; | 894 | break; |
894 | default: | 895 | default: |
895 | return 0; | 896 | return skb; |
896 | } | 897 | } |
897 | 898 | ||
898 | /* Get the checksum offset and the L4 (transport) offset */ | 899 | /* Get the checksum offset and the L4 (transport) offset */ |
@@ -911,7 +912,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) | |||
911 | tsb->l4_ptr_dest_map = csum_info; | 912 | tsb->l4_ptr_dest_map = csum_info; |
912 | } | 913 | } |
913 | 914 | ||
914 | return 0; | 915 | return skb; |
915 | } | 916 | } |
916 | 917 | ||
917 | static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb, | 918 | static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb, |
@@ -945,8 +946,8 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb, | |||
945 | 946 | ||
946 | /* Insert TSB and checksum infos */ | 947 | /* Insert TSB and checksum infos */ |
947 | if (priv->tsb_en) { | 948 | if (priv->tsb_en) { |
948 | ret = bcm_sysport_insert_tsb(skb, dev); | 949 | skb = bcm_sysport_insert_tsb(skb, dev); |
949 | if (ret) { | 950 | if (!skb) { |
950 | ret = NETDEV_TX_OK; | 951 | ret = NETDEV_TX_OK; |
951 | goto out; | 952 | goto out; |
952 | } | 953 | } |
diff --git a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c index 8ee3fdcc17cd..5fac411c52f4 100644 --- a/drivers/net/ethernet/brocade/bna/bna_tx_rx.c +++ b/drivers/net/ethernet/brocade/bna/bna_tx_rx.c | |||
@@ -3410,7 +3410,7 @@ bna_bfi_tx_enet_start(struct bna_tx *tx) | |||
3410 | 3410 | ||
3411 | cfg_req->tx_cfg.vlan_mode = BFI_ENET_TX_VLAN_WI; | 3411 | cfg_req->tx_cfg.vlan_mode = BFI_ENET_TX_VLAN_WI; |
3412 | cfg_req->tx_cfg.vlan_id = htons((u16)tx->txf_vlan_id); | 3412 | cfg_req->tx_cfg.vlan_id = htons((u16)tx->txf_vlan_id); |
3413 | cfg_req->tx_cfg.admit_tagged_frame = BNA_STATUS_T_DISABLED; | 3413 | cfg_req->tx_cfg.admit_tagged_frame = BNA_STATUS_T_ENABLED; |
3414 | cfg_req->tx_cfg.apply_vlan_filter = BNA_STATUS_T_DISABLED; | 3414 | cfg_req->tx_cfg.apply_vlan_filter = BNA_STATUS_T_DISABLED; |
3415 | 3415 | ||
3416 | bfa_msgq_cmd_set(&tx->msgq_cmd, NULL, NULL, | 3416 | bfa_msgq_cmd_set(&tx->msgq_cmd, NULL, NULL, |
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c index ffc92a41d75b..153cafac323c 100644 --- a/drivers/net/ethernet/brocade/bna/bnad.c +++ b/drivers/net/ethernet/brocade/bna/bnad.c | |||
@@ -2864,7 +2864,7 @@ bnad_txq_wi_prepare(struct bnad *bnad, struct bna_tcb *tcb, | |||
2864 | txqent->hdr.wi.opcode = htons(BNA_TXQ_WI_SEND); | 2864 | txqent->hdr.wi.opcode = htons(BNA_TXQ_WI_SEND); |
2865 | txqent->hdr.wi.lso_mss = 0; | 2865 | txqent->hdr.wi.lso_mss = 0; |
2866 | 2866 | ||
2867 | if (unlikely(skb->len > (bnad->netdev->mtu + ETH_HLEN))) { | 2867 | if (unlikely(skb->len > (bnad->netdev->mtu + VLAN_ETH_HLEN))) { |
2868 | BNAD_UPDATE_CTR(bnad, tx_skb_non_tso_too_long); | 2868 | BNAD_UPDATE_CTR(bnad, tx_skb_non_tso_too_long); |
2869 | return -EINVAL; | 2869 | return -EINVAL; |
2870 | } | 2870 | } |
diff --git a/drivers/net/ethernet/toshiba/spider_net.c b/drivers/net/ethernet/toshiba/spider_net.c index 3e38f67c6011..8e9371a3388a 100644 --- a/drivers/net/ethernet/toshiba/spider_net.c +++ b/drivers/net/ethernet/toshiba/spider_net.c | |||
@@ -267,34 +267,6 @@ spider_net_set_promisc(struct spider_net_card *card) | |||
267 | } | 267 | } |
268 | 268 | ||
269 | /** | 269 | /** |
270 | * spider_net_get_mac_address - read mac address from spider card | ||
271 | * @card: device structure | ||
272 | * | ||
273 | * reads MAC address from GMACUNIMACU and GMACUNIMACL registers | ||
274 | */ | ||
275 | static int | ||
276 | spider_net_get_mac_address(struct net_device *netdev) | ||
277 | { | ||
278 | struct spider_net_card *card = netdev_priv(netdev); | ||
279 | u32 macl, macu; | ||
280 | |||
281 | macl = spider_net_read_reg(card, SPIDER_NET_GMACUNIMACL); | ||
282 | macu = spider_net_read_reg(card, SPIDER_NET_GMACUNIMACU); | ||
283 | |||
284 | netdev->dev_addr[0] = (macu >> 24) & 0xff; | ||
285 | netdev->dev_addr[1] = (macu >> 16) & 0xff; | ||
286 | netdev->dev_addr[2] = (macu >> 8) & 0xff; | ||
287 | netdev->dev_addr[3] = macu & 0xff; | ||
288 | netdev->dev_addr[4] = (macl >> 8) & 0xff; | ||
289 | netdev->dev_addr[5] = macl & 0xff; | ||
290 | |||
291 | if (!is_valid_ether_addr(&netdev->dev_addr[0])) | ||
292 | return -EINVAL; | ||
293 | |||
294 | return 0; | ||
295 | } | ||
296 | |||
297 | /** | ||
298 | * spider_net_get_descr_status -- returns the status of a descriptor | 270 | * spider_net_get_descr_status -- returns the status of a descriptor |
299 | * @descr: descriptor to look at | 271 | * @descr: descriptor to look at |
300 | * | 272 | * |
@@ -1345,15 +1317,17 @@ spider_net_set_mac(struct net_device *netdev, void *p) | |||
1345 | if (!is_valid_ether_addr(addr->sa_data)) | 1317 | if (!is_valid_ether_addr(addr->sa_data)) |
1346 | return -EADDRNOTAVAIL; | 1318 | return -EADDRNOTAVAIL; |
1347 | 1319 | ||
1320 | memcpy(netdev->dev_addr, addr->sa_data, ETH_ALEN); | ||
1321 | |||
1348 | /* switch off GMACTPE and GMACRPE */ | 1322 | /* switch off GMACTPE and GMACRPE */ |
1349 | regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD); | 1323 | regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD); |
1350 | regvalue &= ~((1 << 5) | (1 << 6)); | 1324 | regvalue &= ~((1 << 5) | (1 << 6)); |
1351 | spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue); | 1325 | spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue); |
1352 | 1326 | ||
1353 | /* write mac */ | 1327 | /* write mac */ |
1354 | macu = (addr->sa_data[0]<<24) + (addr->sa_data[1]<<16) + | 1328 | macu = (netdev->dev_addr[0]<<24) + (netdev->dev_addr[1]<<16) + |
1355 | (addr->sa_data[2]<<8) + (addr->sa_data[3]); | 1329 | (netdev->dev_addr[2]<<8) + (netdev->dev_addr[3]); |
1356 | macl = (addr->sa_data[4]<<8) + (addr->sa_data[5]); | 1330 | macl = (netdev->dev_addr[4]<<8) + (netdev->dev_addr[5]); |
1357 | spider_net_write_reg(card, SPIDER_NET_GMACUNIMACU, macu); | 1331 | spider_net_write_reg(card, SPIDER_NET_GMACUNIMACU, macu); |
1358 | spider_net_write_reg(card, SPIDER_NET_GMACUNIMACL, macl); | 1332 | spider_net_write_reg(card, SPIDER_NET_GMACUNIMACL, macl); |
1359 | 1333 | ||
@@ -1364,12 +1338,6 @@ spider_net_set_mac(struct net_device *netdev, void *p) | |||
1364 | 1338 | ||
1365 | spider_net_set_promisc(card); | 1339 | spider_net_set_promisc(card); |
1366 | 1340 | ||
1367 | /* look up, whether we have been successful */ | ||
1368 | if (spider_net_get_mac_address(netdev)) | ||
1369 | return -EADDRNOTAVAIL; | ||
1370 | if (memcmp(netdev->dev_addr,addr->sa_data,netdev->addr_len)) | ||
1371 | return -EADDRNOTAVAIL; | ||
1372 | |||
1373 | return 0; | 1341 | return 0; |
1374 | } | 1342 | } |
1375 | 1343 | ||
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 977984bc238a..7d76c9523395 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c | |||
@@ -717,6 +717,7 @@ int netvsc_send(struct hv_device *device, | |||
717 | unsigned int section_index = NETVSC_INVALID_INDEX; | 717 | unsigned int section_index = NETVSC_INVALID_INDEX; |
718 | u32 msg_size = 0; | 718 | u32 msg_size = 0; |
719 | struct sk_buff *skb; | 719 | struct sk_buff *skb; |
720 | u16 q_idx = packet->q_idx; | ||
720 | 721 | ||
721 | 722 | ||
722 | net_device = get_outbound_net_device(device); | 723 | net_device = get_outbound_net_device(device); |
@@ -781,24 +782,24 @@ int netvsc_send(struct hv_device *device, | |||
781 | 782 | ||
782 | if (ret == 0) { | 783 | if (ret == 0) { |
783 | atomic_inc(&net_device->num_outstanding_sends); | 784 | atomic_inc(&net_device->num_outstanding_sends); |
784 | atomic_inc(&net_device->queue_sends[packet->q_idx]); | 785 | atomic_inc(&net_device->queue_sends[q_idx]); |
785 | 786 | ||
786 | if (hv_ringbuf_avail_percent(&out_channel->outbound) < | 787 | if (hv_ringbuf_avail_percent(&out_channel->outbound) < |
787 | RING_AVAIL_PERCENT_LOWATER) { | 788 | RING_AVAIL_PERCENT_LOWATER) { |
788 | netif_tx_stop_queue(netdev_get_tx_queue( | 789 | netif_tx_stop_queue(netdev_get_tx_queue( |
789 | ndev, packet->q_idx)); | 790 | ndev, q_idx)); |
790 | 791 | ||
791 | if (atomic_read(&net_device-> | 792 | if (atomic_read(&net_device-> |
792 | queue_sends[packet->q_idx]) < 1) | 793 | queue_sends[q_idx]) < 1) |
793 | netif_tx_wake_queue(netdev_get_tx_queue( | 794 | netif_tx_wake_queue(netdev_get_tx_queue( |
794 | ndev, packet->q_idx)); | 795 | ndev, q_idx)); |
795 | } | 796 | } |
796 | } else if (ret == -EAGAIN) { | 797 | } else if (ret == -EAGAIN) { |
797 | netif_tx_stop_queue(netdev_get_tx_queue( | 798 | netif_tx_stop_queue(netdev_get_tx_queue( |
798 | ndev, packet->q_idx)); | 799 | ndev, q_idx)); |
799 | if (atomic_read(&net_device->queue_sends[packet->q_idx]) < 1) { | 800 | if (atomic_read(&net_device->queue_sends[q_idx]) < 1) { |
800 | netif_tx_wake_queue(netdev_get_tx_queue( | 801 | netif_tx_wake_queue(netdev_get_tx_queue( |
801 | ndev, packet->q_idx)); | 802 | ndev, q_idx)); |
802 | ret = -ENOSPC; | 803 | ret = -ENOSPC; |
803 | } | 804 | } |
804 | } else { | 805 | } else { |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index a94a9df3e6bd..2368395d8ae5 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -647,7 +647,7 @@ static void team_notify_peers(struct team *team) | |||
647 | { | 647 | { |
648 | if (!team->notify_peers.count || !netif_running(team->dev)) | 648 | if (!team->notify_peers.count || !netif_running(team->dev)) |
649 | return; | 649 | return; |
650 | atomic_set(&team->notify_peers.count_pending, team->notify_peers.count); | 650 | atomic_add(team->notify_peers.count, &team->notify_peers.count_pending); |
651 | schedule_delayed_work(&team->notify_peers.dw, 0); | 651 | schedule_delayed_work(&team->notify_peers.dw, 0); |
652 | } | 652 | } |
653 | 653 | ||
@@ -687,7 +687,7 @@ static void team_mcast_rejoin(struct team *team) | |||
687 | { | 687 | { |
688 | if (!team->mcast_rejoin.count || !netif_running(team->dev)) | 688 | if (!team->mcast_rejoin.count || !netif_running(team->dev)) |
689 | return; | 689 | return; |
690 | atomic_set(&team->mcast_rejoin.count_pending, team->mcast_rejoin.count); | 690 | atomic_add(team->mcast_rejoin.count, &team->mcast_rejoin.count_pending); |
691 | schedule_delayed_work(&team->mcast_rejoin.dw, 0); | 691 | schedule_delayed_work(&team->mcast_rejoin.dw, 0); |
692 | } | 692 | } |
693 | 693 | ||
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index 5d194093f3e1..2c05f6cdb12f 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c | |||
@@ -890,7 +890,7 @@ static const struct driver_info ax88772_info = { | |||
890 | .unbind = ax88772_unbind, | 890 | .unbind = ax88772_unbind, |
891 | .status = asix_status, | 891 | .status = asix_status, |
892 | .link_reset = ax88772_link_reset, | 892 | .link_reset = ax88772_link_reset, |
893 | .reset = ax88772_reset, | 893 | .reset = ax88772_link_reset, |
894 | .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET, | 894 | .flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET, |
895 | .rx_fixup = asix_rx_fixup_common, | 895 | .rx_fixup = asix_rx_fixup_common, |
896 | .tx_fixup = asix_tx_fixup, | 896 | .tx_fixup = asix_tx_fixup, |
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 65326204baa0..5cfd414b9a3e 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
@@ -980,9 +980,14 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p) | |||
980 | { | 980 | { |
981 | struct r8152 *tp = netdev_priv(netdev); | 981 | struct r8152 *tp = netdev_priv(netdev); |
982 | struct sockaddr *addr = p; | 982 | struct sockaddr *addr = p; |
983 | int ret = -EADDRNOTAVAIL; | ||
983 | 984 | ||
984 | if (!is_valid_ether_addr(addr->sa_data)) | 985 | if (!is_valid_ether_addr(addr->sa_data)) |
985 | return -EADDRNOTAVAIL; | 986 | goto out1; |
987 | |||
988 | ret = usb_autopm_get_interface(tp->intf); | ||
989 | if (ret < 0) | ||
990 | goto out1; | ||
986 | 991 | ||
987 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | 992 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); |
988 | 993 | ||
@@ -990,7 +995,9 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p) | |||
990 | pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data); | 995 | pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data); |
991 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); | 996 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); |
992 | 997 | ||
993 | return 0; | 998 | usb_autopm_put_interface(tp->intf); |
999 | out1: | ||
1000 | return ret; | ||
994 | } | 1001 | } |
995 | 1002 | ||
996 | static int set_ethernet_addr(struct r8152 *tp) | 1003 | static int set_ethernet_addr(struct r8152 *tp) |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index a042d065a0c7..8be2096c8423 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
@@ -395,7 +395,8 @@ static void __init superio_serial_init(void) | |||
395 | serial_port.iotype = UPIO_PORT; | 395 | serial_port.iotype = UPIO_PORT; |
396 | serial_port.type = PORT_16550A; | 396 | serial_port.type = PORT_16550A; |
397 | serial_port.uartclk = 115200*16; | 397 | serial_port.uartclk = 115200*16; |
398 | serial_port.fifosize = 16; | 398 | serial_port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE | |
399 | UPF_BOOT_AUTOCONF; | ||
399 | 400 | ||
400 | /* serial port #1 */ | 401 | /* serial port #1 */ |
401 | serial_port.iobase = sio_dev.sp1_base; | 402 | serial_port.iobase = sio_dev.sp1_base; |