mirror of https://gitee.com/openkylin/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
64b1f00a08
12
MAINTAINERS
12
MAINTAINERS
|
@ -1667,6 +1667,12 @@ M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/tty/serial/atmel_serial.c
|
F: drivers/tty/serial/atmel_serial.c
|
||||||
|
|
||||||
|
ATMEL Audio ALSA driver
|
||||||
|
M: Bo Shen <voice.shen@atmel.com>
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
S: Supported
|
||||||
|
F: sound/soc/atmel
|
||||||
|
|
||||||
ATMEL DMA DRIVER
|
ATMEL DMA DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
@ -4791,14 +4797,14 @@ M: Deepak Saxena <dsaxena@plexity.net>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/char/hw_random/ixp4xx-rng.c
|
F: drivers/char/hw_random/ixp4xx-rng.c
|
||||||
|
|
||||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf/i40e/i40evf)
|
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/fm10k/igb/igbvf/ixgb/ixgbe/ixgbevf/i40e/i40evf)
|
||||||
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
|
||||||
M: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
M: Jesse Brandeburg <jesse.brandeburg@intel.com>
|
||||||
M: Bruce Allan <bruce.w.allan@intel.com>
|
M: Bruce Allan <bruce.w.allan@intel.com>
|
||||||
M: Carolyn Wyborny <carolyn.wyborny@intel.com>
|
M: Carolyn Wyborny <carolyn.wyborny@intel.com>
|
||||||
M: Don Skidmore <donald.c.skidmore@intel.com>
|
M: Don Skidmore <donald.c.skidmore@intel.com>
|
||||||
M: Greg Rose <gregory.v.rose@intel.com>
|
M: Greg Rose <gregory.v.rose@intel.com>
|
||||||
M: Alex Duyck <alexander.h.duyck@intel.com>
|
M: Matthew Vick <matthew.vick@intel.com>
|
||||||
M: John Ronciak <john.ronciak@intel.com>
|
M: John Ronciak <john.ronciak@intel.com>
|
||||||
M: Mitch Williams <mitch.a.williams@intel.com>
|
M: Mitch Williams <mitch.a.williams@intel.com>
|
||||||
M: Linux NICS <linux.nics@intel.com>
|
M: Linux NICS <linux.nics@intel.com>
|
||||||
|
@ -5486,7 +5492,7 @@ F: drivers/macintosh/
|
||||||
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
||||||
M: Anatolij Gustschin <agust@denx.de>
|
M: Anatolij Gustschin <agust@denx.de>
|
||||||
L: linuxppc-dev@lists.ozlabs.org
|
L: linuxppc-dev@lists.ozlabs.org
|
||||||
T: git git://git.denx.de/linux-2.6-agust.git
|
T: git git://git.denx.de/linux-denx-agust.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/powerpc/platforms/512x/
|
F: arch/powerpc/platforms/512x/
|
||||||
F: arch/powerpc/platforms/52xx/
|
F: arch/powerpc/platforms/52xx/
|
||||||
|
|
|
@ -1658,10 +1658,8 @@ void cpufreq_suspend(void)
|
||||||
if (!cpufreq_driver)
|
if (!cpufreq_driver)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cpufreq_suspended = true;
|
|
||||||
|
|
||||||
if (!has_target())
|
if (!has_target())
|
||||||
return;
|
goto suspend;
|
||||||
|
|
||||||
pr_debug("%s: Suspending Governors\n", __func__);
|
pr_debug("%s: Suspending Governors\n", __func__);
|
||||||
|
|
||||||
|
@ -1674,6 +1672,9 @@ void cpufreq_suspend(void)
|
||||||
pr_err("%s: Failed to suspend driver: %p\n", __func__,
|
pr_err("%s: Failed to suspend driver: %p\n", __func__,
|
||||||
policy);
|
policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend:
|
||||||
|
cpufreq_suspended = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -213,9 +213,9 @@ static int __init integrator_cpufreq_probe(struct platform_device *pdev)
|
||||||
return cpufreq_register_driver(&integrator_driver);
|
return cpufreq_register_driver(&integrator_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit integrator_cpufreq_remove(struct platform_device *pdev)
|
static int __exit integrator_cpufreq_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
cpufreq_unregister_driver(&integrator_driver);
|
return cpufreq_unregister_driver(&integrator_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id integrator_cpufreq_match[] = {
|
static const struct of_device_id integrator_cpufreq_match[] = {
|
||||||
|
|
|
@ -204,7 +204,6 @@ static int pcc_cpufreq_target(struct cpufreq_policy *policy,
|
||||||
u32 input_buffer;
|
u32 input_buffer;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
spin_lock(&pcc_lock);
|
|
||||||
cpu = policy->cpu;
|
cpu = policy->cpu;
|
||||||
pcc_cpu_data = per_cpu_ptr(pcc_cpu_info, cpu);
|
pcc_cpu_data = per_cpu_ptr(pcc_cpu_info, cpu);
|
||||||
|
|
||||||
|
@ -216,6 +215,7 @@ static int pcc_cpufreq_target(struct cpufreq_policy *policy,
|
||||||
freqs.old = policy->cur;
|
freqs.old = policy->cur;
|
||||||
freqs.new = target_freq;
|
freqs.new = target_freq;
|
||||||
cpufreq_freq_transition_begin(policy, &freqs);
|
cpufreq_freq_transition_begin(policy, &freqs);
|
||||||
|
spin_lock(&pcc_lock);
|
||||||
|
|
||||||
input_buffer = 0x1 | (((target_freq * 100)
|
input_buffer = 0x1 | (((target_freq * 100)
|
||||||
/ (ioread32(&pcch_hdr->nominal) * 1000)) << 8);
|
/ (ioread32(&pcch_hdr->nominal) * 1000)) << 8);
|
||||||
|
|
|
@ -1310,6 +1310,16 @@ void i915_check_and_clear_faults(struct drm_device *dev)
|
||||||
POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS]));
|
POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void i915_ggtt_flush(struct drm_i915_private *dev_priv)
|
||||||
|
{
|
||||||
|
if (INTEL_INFO(dev_priv->dev)->gen < 6) {
|
||||||
|
intel_gtt_chipset_flush();
|
||||||
|
} else {
|
||||||
|
I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
|
||||||
|
POSTING_READ(GFX_FLSH_CNTL_GEN6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
|
void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
@ -1326,6 +1336,8 @@ void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
|
||||||
dev_priv->gtt.base.start,
|
dev_priv->gtt.base.start,
|
||||||
dev_priv->gtt.base.total,
|
dev_priv->gtt.base.total,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
|
i915_ggtt_flush(dev_priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
void i915_gem_restore_gtt_mappings(struct drm_device *dev)
|
void i915_gem_restore_gtt_mappings(struct drm_device *dev)
|
||||||
|
@ -1378,7 +1390,7 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
|
||||||
gen6_write_pdes(container_of(vm, struct i915_hw_ppgtt, base));
|
gen6_write_pdes(container_of(vm, struct i915_hw_ppgtt, base));
|
||||||
}
|
}
|
||||||
|
|
||||||
i915_gem_chipset_flush(dev);
|
i915_ggtt_flush(dev_priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj)
|
int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj)
|
||||||
|
|
|
@ -396,6 +396,16 @@ int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the vendor backlight interface is not in use and ACPI backlight interface
|
||||||
|
* is broken, do not bother processing backlight change requests from firmware.
|
||||||
|
*/
|
||||||
|
static bool should_ignore_backlight_request(void)
|
||||||
|
{
|
||||||
|
return acpi_video_backlight_support() &&
|
||||||
|
!acpi_video_verify_backlight_support();
|
||||||
|
}
|
||||||
|
|
||||||
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
@ -404,11 +414,7 @@ static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
|
||||||
|
|
||||||
DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
|
DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
|
||||||
|
|
||||||
/*
|
if (should_ignore_backlight_request()) {
|
||||||
* If the acpi_video interface is not supposed to be used, don't
|
|
||||||
* bother processing backlight level change requests from firmware.
|
|
||||||
*/
|
|
||||||
if (!acpi_video_verify_backlight_support()) {
|
|
||||||
DRM_DEBUG_KMS("opregion backlight request ignored\n");
|
DRM_DEBUG_KMS("opregion backlight request ignored\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1763,9 +1763,10 @@ nv50_disp_intr_unk40_0_tmds(struct nv50_disp_priv *priv, struct dcb_output *outp
|
||||||
const int or = ffs(outp->or) - 1;
|
const int or = ffs(outp->or) - 1;
|
||||||
const u32 loff = (or * 0x800) + (link * 0x80);
|
const u32 loff = (or * 0x800) + (link * 0x80);
|
||||||
const u16 mask = (outp->sorconf.link << 6) | outp->or;
|
const u16 mask = (outp->sorconf.link << 6) | outp->or;
|
||||||
|
struct dcb_output match;
|
||||||
u8 ver, hdr;
|
u8 ver, hdr;
|
||||||
|
|
||||||
if (dcb_outp_match(bios, DCB_OUTPUT_DP, mask, &ver, &hdr, outp))
|
if (dcb_outp_match(bios, DCB_OUTPUT_DP, mask, &ver, &hdr, &match))
|
||||||
nv_mask(priv, 0x61c10c + loff, 0x00000001, 0x00000000);
|
nv_mask(priv, 0x61c10c + loff, 0x00000001, 0x00000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -285,6 +285,7 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
|
||||||
struct nouveau_software_chan *swch;
|
struct nouveau_software_chan *swch;
|
||||||
struct nv_dma_v0 args = {};
|
struct nv_dma_v0 args = {};
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
bool save;
|
||||||
|
|
||||||
nvif_object_map(chan->object);
|
nvif_object_map(chan->object);
|
||||||
|
|
||||||
|
@ -386,7 +387,11 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialise synchronisation */
|
/* initialise synchronisation */
|
||||||
return nouveau_fence(chan->drm)->context_new(chan);
|
save = cli->base.super;
|
||||||
|
cli->base.super = true; /* hack until fencenv50 fixed */
|
||||||
|
ret = nouveau_fence(chan->drm)->context_new(chan);
|
||||||
|
cli->base.super = save;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -550,14 +550,12 @@ nouveau_display_destroy(struct drm_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
nouveau_display_suspend(struct drm_device *dev)
|
nouveau_display_suspend(struct drm_device *dev, bool runtime)
|
||||||
{
|
{
|
||||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
|
||||||
struct drm_crtc *crtc;
|
struct drm_crtc *crtc;
|
||||||
|
|
||||||
nouveau_display_fini(dev);
|
nouveau_display_fini(dev);
|
||||||
|
|
||||||
NV_INFO(drm, "unpinning framebuffer(s)...\n");
|
|
||||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||||
struct nouveau_framebuffer *nouveau_fb;
|
struct nouveau_framebuffer *nouveau_fb;
|
||||||
|
|
||||||
|
@ -579,12 +577,13 @@ nouveau_display_suspend(struct drm_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nouveau_display_repin(struct drm_device *dev)
|
nouveau_display_resume(struct drm_device *dev, bool runtime)
|
||||||
{
|
{
|
||||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||||
struct drm_crtc *crtc;
|
struct drm_crtc *crtc;
|
||||||
int ret;
|
int ret, head;
|
||||||
|
|
||||||
|
/* re-pin fb/cursors */
|
||||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||||
struct nouveau_framebuffer *nouveau_fb;
|
struct nouveau_framebuffer *nouveau_fb;
|
||||||
|
|
||||||
|
@ -606,13 +605,6 @@ nouveau_display_repin(struct drm_device *dev)
|
||||||
if (ret)
|
if (ret)
|
||||||
NV_ERROR(drm, "Could not pin/map cursor.\n");
|
NV_ERROR(drm, "Could not pin/map cursor.\n");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nouveau_display_resume(struct drm_device *dev)
|
|
||||||
{
|
|
||||||
struct drm_crtc *crtc;
|
|
||||||
int head;
|
|
||||||
|
|
||||||
nouveau_display_init(dev);
|
nouveau_display_init(dev);
|
||||||
|
|
||||||
|
@ -627,6 +619,13 @@ nouveau_display_resume(struct drm_device *dev)
|
||||||
for (head = 0; head < dev->mode_config.num_crtc; head++)
|
for (head = 0; head < dev->mode_config.num_crtc; head++)
|
||||||
drm_vblank_on(dev, head);
|
drm_vblank_on(dev, head);
|
||||||
|
|
||||||
|
/* This should ensure we don't hit a locking problem when someone
|
||||||
|
* wakes us up via a connector. We should never go into suspend
|
||||||
|
* while the display is on anyways.
|
||||||
|
*/
|
||||||
|
if (runtime)
|
||||||
|
return;
|
||||||
|
|
||||||
drm_helper_resume_force_mode(dev);
|
drm_helper_resume_force_mode(dev);
|
||||||
|
|
||||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||||
|
|
|
@ -63,9 +63,8 @@ int nouveau_display_create(struct drm_device *dev);
|
||||||
void nouveau_display_destroy(struct drm_device *dev);
|
void nouveau_display_destroy(struct drm_device *dev);
|
||||||
int nouveau_display_init(struct drm_device *dev);
|
int nouveau_display_init(struct drm_device *dev);
|
||||||
void nouveau_display_fini(struct drm_device *dev);
|
void nouveau_display_fini(struct drm_device *dev);
|
||||||
int nouveau_display_suspend(struct drm_device *dev);
|
int nouveau_display_suspend(struct drm_device *dev, bool runtime);
|
||||||
void nouveau_display_repin(struct drm_device *dev);
|
void nouveau_display_resume(struct drm_device *dev, bool runtime);
|
||||||
void nouveau_display_resume(struct drm_device *dev);
|
|
||||||
int nouveau_display_vblank_enable(struct drm_device *, int);
|
int nouveau_display_vblank_enable(struct drm_device *, int);
|
||||||
void nouveau_display_vblank_disable(struct drm_device *, int);
|
void nouveau_display_vblank_disable(struct drm_device *, int);
|
||||||
int nouveau_display_scanoutpos(struct drm_device *, int, unsigned int,
|
int nouveau_display_scanoutpos(struct drm_device *, int, unsigned int,
|
||||||
|
|
|
@ -547,9 +547,11 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
|
||||||
struct nouveau_cli *cli;
|
struct nouveau_cli *cli;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (dev->mode_config.num_crtc && !runtime) {
|
if (dev->mode_config.num_crtc) {
|
||||||
|
NV_INFO(drm, "suspending console...\n");
|
||||||
|
nouveau_fbcon_set_suspend(dev, 1);
|
||||||
NV_INFO(drm, "suspending display...\n");
|
NV_INFO(drm, "suspending display...\n");
|
||||||
ret = nouveau_display_suspend(dev);
|
ret = nouveau_display_suspend(dev, runtime);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -603,7 +605,7 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
|
||||||
fail_display:
|
fail_display:
|
||||||
if (dev->mode_config.num_crtc) {
|
if (dev->mode_config.num_crtc) {
|
||||||
NV_INFO(drm, "resuming display...\n");
|
NV_INFO(drm, "resuming display...\n");
|
||||||
nouveau_display_resume(dev);
|
nouveau_display_resume(dev, runtime);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -618,9 +620,6 @@ int nouveau_pmops_suspend(struct device *dev)
|
||||||
drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
|
drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (drm_dev->mode_config.num_crtc)
|
|
||||||
nouveau_fbcon_set_suspend(drm_dev, 1);
|
|
||||||
|
|
||||||
ret = nouveau_do_suspend(drm_dev, false);
|
ret = nouveau_do_suspend(drm_dev, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -633,7 +632,7 @@ int nouveau_pmops_suspend(struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nouveau_do_resume(struct drm_device *dev)
|
nouveau_do_resume(struct drm_device *dev, bool runtime)
|
||||||
{
|
{
|
||||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||||
struct nouveau_cli *cli;
|
struct nouveau_cli *cli;
|
||||||
|
@ -658,7 +657,9 @@ nouveau_do_resume(struct drm_device *dev)
|
||||||
|
|
||||||
if (dev->mode_config.num_crtc) {
|
if (dev->mode_config.num_crtc) {
|
||||||
NV_INFO(drm, "resuming display...\n");
|
NV_INFO(drm, "resuming display...\n");
|
||||||
nouveau_display_repin(dev);
|
nouveau_display_resume(dev, runtime);
|
||||||
|
NV_INFO(drm, "resuming console...\n");
|
||||||
|
nouveau_fbcon_set_suspend(dev, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -681,47 +682,21 @@ int nouveau_pmops_resume(struct device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
pci_set_master(pdev);
|
pci_set_master(pdev);
|
||||||
|
|
||||||
ret = nouveau_do_resume(drm_dev);
|
return nouveau_do_resume(drm_dev, false);
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (drm_dev->mode_config.num_crtc) {
|
|
||||||
nouveau_display_resume(drm_dev);
|
|
||||||
nouveau_fbcon_set_suspend(drm_dev, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nouveau_pmops_freeze(struct device *dev)
|
static int nouveau_pmops_freeze(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(dev);
|
struct pci_dev *pdev = to_pci_dev(dev);
|
||||||
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
||||||
int ret;
|
return nouveau_do_suspend(drm_dev, false);
|
||||||
|
|
||||||
if (drm_dev->mode_config.num_crtc)
|
|
||||||
nouveau_fbcon_set_suspend(drm_dev, 1);
|
|
||||||
|
|
||||||
ret = nouveau_do_suspend(drm_dev, false);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nouveau_pmops_thaw(struct device *dev)
|
static int nouveau_pmops_thaw(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(dev);
|
struct pci_dev *pdev = to_pci_dev(dev);
|
||||||
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
struct drm_device *drm_dev = pci_get_drvdata(pdev);
|
||||||
int ret;
|
return nouveau_do_resume(drm_dev, false);
|
||||||
|
|
||||||
ret = nouveau_do_resume(drm_dev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (drm_dev->mode_config.num_crtc) {
|
|
||||||
nouveau_display_resume(drm_dev);
|
|
||||||
nouveau_fbcon_set_suspend(drm_dev, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -977,7 +952,7 @@ static int nouveau_pmops_runtime_resume(struct device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
pci_set_master(pdev);
|
pci_set_master(pdev);
|
||||||
|
|
||||||
ret = nouveau_do_resume(drm_dev);
|
ret = nouveau_do_resume(drm_dev, true);
|
||||||
drm_kms_helper_poll_enable(drm_dev);
|
drm_kms_helper_poll_enable(drm_dev);
|
||||||
/* do magic */
|
/* do magic */
|
||||||
nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
|
nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
|
||||||
|
|
|
@ -486,6 +486,16 @@ static const struct drm_fb_helper_funcs nouveau_fbcon_helper_funcs = {
|
||||||
.fb_probe = nouveau_fbcon_create,
|
.fb_probe = nouveau_fbcon_create,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
nouveau_fbcon_set_suspend_work(struct work_struct *work)
|
||||||
|
{
|
||||||
|
struct nouveau_fbdev *fbcon = container_of(work, typeof(*fbcon), work);
|
||||||
|
console_lock();
|
||||||
|
nouveau_fbcon_accel_restore(fbcon->dev);
|
||||||
|
nouveau_fbcon_zfill(fbcon->dev, fbcon);
|
||||||
|
fb_set_suspend(fbcon->helper.fbdev, FBINFO_STATE_RUNNING);
|
||||||
|
console_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
nouveau_fbcon_init(struct drm_device *dev)
|
nouveau_fbcon_init(struct drm_device *dev)
|
||||||
|
@ -503,6 +513,7 @@ nouveau_fbcon_init(struct drm_device *dev)
|
||||||
if (!fbcon)
|
if (!fbcon)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
INIT_WORK(&fbcon->work, nouveau_fbcon_set_suspend_work);
|
||||||
fbcon->dev = dev;
|
fbcon->dev = dev;
|
||||||
drm->fbcon = fbcon;
|
drm->fbcon = fbcon;
|
||||||
|
|
||||||
|
@ -551,14 +562,14 @@ nouveau_fbcon_set_suspend(struct drm_device *dev, int state)
|
||||||
{
|
{
|
||||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||||
if (drm->fbcon) {
|
if (drm->fbcon) {
|
||||||
console_lock();
|
if (state == FBINFO_STATE_RUNNING) {
|
||||||
if (state == 0) {
|
schedule_work(&drm->fbcon->work);
|
||||||
nouveau_fbcon_accel_restore(dev);
|
return;
|
||||||
nouveau_fbcon_zfill(dev, drm->fbcon);
|
|
||||||
}
|
}
|
||||||
|
flush_work(&drm->fbcon->work);
|
||||||
|
console_lock();
|
||||||
fb_set_suspend(drm->fbcon->helper.fbdev, state);
|
fb_set_suspend(drm->fbcon->helper.fbdev, state);
|
||||||
if (state == 1)
|
nouveau_fbcon_accel_save_disable(dev);
|
||||||
nouveau_fbcon_accel_save_disable(dev);
|
|
||||||
console_unlock();
|
console_unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ struct nouveau_fbdev {
|
||||||
struct nouveau_framebuffer nouveau_fb;
|
struct nouveau_framebuffer nouveau_fb;
|
||||||
struct list_head fbdev_list;
|
struct list_head fbdev_list;
|
||||||
struct drm_device *dev;
|
struct drm_device *dev;
|
||||||
|
struct work_struct work;
|
||||||
unsigned int saved_flags;
|
unsigned int saved_flags;
|
||||||
struct nvif_object surf2d;
|
struct nvif_object surf2d;
|
||||||
struct nvif_object clip;
|
struct nvif_object clip;
|
||||||
|
|
|
@ -64,6 +64,10 @@
|
||||||
#define cpu_to_group(cpu) cpu_to_node(cpu)
|
#define cpu_to_group(cpu) cpu_to_node(cpu)
|
||||||
#define ANY_GROUP NUMA_NO_NODE
|
#define ANY_GROUP NUMA_NO_NODE
|
||||||
|
|
||||||
|
static bool devices_handle_discard_safely = false;
|
||||||
|
module_param(devices_handle_discard_safely, bool, 0644);
|
||||||
|
MODULE_PARM_DESC(devices_handle_discard_safely,
|
||||||
|
"Set to Y if all devices in each array reliably return zeroes on reads from discarded regions");
|
||||||
static struct workqueue_struct *raid5_wq;
|
static struct workqueue_struct *raid5_wq;
|
||||||
/*
|
/*
|
||||||
* Stripe cache
|
* Stripe cache
|
||||||
|
@ -6208,7 +6212,7 @@ static int run(struct mddev *mddev)
|
||||||
mddev->queue->limits.discard_granularity = stripe;
|
mddev->queue->limits.discard_granularity = stripe;
|
||||||
/*
|
/*
|
||||||
* unaligned part of discard request will be ignored, so can't
|
* unaligned part of discard request will be ignored, so can't
|
||||||
* guarantee discard_zerors_data
|
* guarantee discard_zeroes_data
|
||||||
*/
|
*/
|
||||||
mddev->queue->limits.discard_zeroes_data = 0;
|
mddev->queue->limits.discard_zeroes_data = 0;
|
||||||
|
|
||||||
|
@ -6233,6 +6237,18 @@ static int run(struct mddev *mddev)
|
||||||
!bdev_get_queue(rdev->bdev)->
|
!bdev_get_queue(rdev->bdev)->
|
||||||
limits.discard_zeroes_data)
|
limits.discard_zeroes_data)
|
||||||
discard_supported = false;
|
discard_supported = false;
|
||||||
|
/* Unfortunately, discard_zeroes_data is not currently
|
||||||
|
* a guarantee - just a hint. So we only allow DISCARD
|
||||||
|
* if the sysadmin has confirmed that only safe devices
|
||||||
|
* are in use by setting a module parameter.
|
||||||
|
*/
|
||||||
|
if (!devices_handle_discard_safely) {
|
||||||
|
if (discard_supported) {
|
||||||
|
pr_info("md/raid456: discard support disabled due to uncertainty.\n");
|
||||||
|
pr_info("Set raid456.devices_handle_discard_safely=Y to override.\n");
|
||||||
|
}
|
||||||
|
discard_supported = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (discard_supported &&
|
if (discard_supported &&
|
||||||
|
|
|
@ -3524,6 +3524,7 @@ static struct usb_driver em28xx_usb_driver = {
|
||||||
.disconnect = em28xx_usb_disconnect,
|
.disconnect = em28xx_usb_disconnect,
|
||||||
.suspend = em28xx_usb_suspend,
|
.suspend = em28xx_usb_suspend,
|
||||||
.resume = em28xx_usb_resume,
|
.resume = em28xx_usb_resume,
|
||||||
|
.reset_resume = em28xx_usb_resume,
|
||||||
.id_table = em28xx_id_table,
|
.id_table = em28xx_id_table,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2213,7 +2213,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
dma_addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE));
|
dma_addr = pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE);
|
||||||
if (dma_mapping_error(&VORTEX_PCI(vp)->dev, dma_addr))
|
if (dma_mapping_error(&VORTEX_PCI(vp)->dev, dma_addr))
|
||||||
goto out_dma_err;
|
goto out_dma_err;
|
||||||
vp->tx_ring[entry].addr = cpu_to_le32(dma_addr);
|
vp->tx_ring[entry].addr = cpu_to_le32(dma_addr);
|
||||||
|
|
|
@ -857,7 +857,8 @@ static irqreturn_t bcm_sysport_wol_isr(int irq, void *dev_id)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev)
|
static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb,
|
||||||
|
struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct sk_buff *nskb;
|
struct sk_buff *nskb;
|
||||||
struct bcm_tsb *tsb;
|
struct bcm_tsb *tsb;
|
||||||
|
@ -873,7 +874,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev)
|
||||||
if (!nskb) {
|
if (!nskb) {
|
||||||
dev->stats.tx_errors++;
|
dev->stats.tx_errors++;
|
||||||
dev->stats.tx_dropped++;
|
dev->stats.tx_dropped++;
|
||||||
return -ENOMEM;
|
return NULL;
|
||||||
}
|
}
|
||||||
skb = nskb;
|
skb = nskb;
|
||||||
}
|
}
|
||||||
|
@ -892,7 +893,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev)
|
||||||
ip_proto = ipv6_hdr(skb)->nexthdr;
|
ip_proto = ipv6_hdr(skb)->nexthdr;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the checksum offset and the L4 (transport) offset */
|
/* 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)
|
||||||
tsb->l4_ptr_dest_map = csum_info;
|
tsb->l4_ptr_dest_map = csum_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb,
|
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,
|
||||||
|
|
||||||
/* Insert TSB and checksum infos */
|
/* Insert TSB and checksum infos */
|
||||||
if (priv->tsb_en) {
|
if (priv->tsb_en) {
|
||||||
ret = bcm_sysport_insert_tsb(skb, dev);
|
skb = bcm_sysport_insert_tsb(skb, dev);
|
||||||
if (ret) {
|
if (!skb) {
|
||||||
ret = NETDEV_TX_OK;
|
ret = NETDEV_TX_OK;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3410,7 +3410,7 @@ bna_bfi_tx_enet_start(struct bna_tx *tx)
|
||||||
|
|
||||||
cfg_req->tx_cfg.vlan_mode = BFI_ENET_TX_VLAN_WI;
|
cfg_req->tx_cfg.vlan_mode = BFI_ENET_TX_VLAN_WI;
|
||||||
cfg_req->tx_cfg.vlan_id = htons((u16)tx->txf_vlan_id);
|
cfg_req->tx_cfg.vlan_id = htons((u16)tx->txf_vlan_id);
|
||||||
cfg_req->tx_cfg.admit_tagged_frame = BNA_STATUS_T_DISABLED;
|
cfg_req->tx_cfg.admit_tagged_frame = BNA_STATUS_T_ENABLED;
|
||||||
cfg_req->tx_cfg.apply_vlan_filter = BNA_STATUS_T_DISABLED;
|
cfg_req->tx_cfg.apply_vlan_filter = BNA_STATUS_T_DISABLED;
|
||||||
|
|
||||||
bfa_msgq_cmd_set(&tx->msgq_cmd, NULL, NULL,
|
bfa_msgq_cmd_set(&tx->msgq_cmd, NULL, NULL,
|
||||||
|
|
|
@ -2864,7 +2864,7 @@ bnad_txq_wi_prepare(struct bnad *bnad, struct bna_tcb *tcb,
|
||||||
txqent->hdr.wi.opcode = htons(BNA_TXQ_WI_SEND);
|
txqent->hdr.wi.opcode = htons(BNA_TXQ_WI_SEND);
|
||||||
txqent->hdr.wi.lso_mss = 0;
|
txqent->hdr.wi.lso_mss = 0;
|
||||||
|
|
||||||
if (unlikely(skb->len > (bnad->netdev->mtu + ETH_HLEN))) {
|
if (unlikely(skb->len > (bnad->netdev->mtu + VLAN_ETH_HLEN))) {
|
||||||
BNAD_UPDATE_CTR(bnad, tx_skb_non_tso_too_long);
|
BNAD_UPDATE_CTR(bnad, tx_skb_non_tso_too_long);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,34 +266,6 @@ spider_net_set_promisc(struct spider_net_card *card)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* spider_net_get_mac_address - read mac address from spider card
|
|
||||||
* @card: device structure
|
|
||||||
*
|
|
||||||
* reads MAC address from GMACUNIMACU and GMACUNIMACL registers
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
spider_net_get_mac_address(struct net_device *netdev)
|
|
||||||
{
|
|
||||||
struct spider_net_card *card = netdev_priv(netdev);
|
|
||||||
u32 macl, macu;
|
|
||||||
|
|
||||||
macl = spider_net_read_reg(card, SPIDER_NET_GMACUNIMACL);
|
|
||||||
macu = spider_net_read_reg(card, SPIDER_NET_GMACUNIMACU);
|
|
||||||
|
|
||||||
netdev->dev_addr[0] = (macu >> 24) & 0xff;
|
|
||||||
netdev->dev_addr[1] = (macu >> 16) & 0xff;
|
|
||||||
netdev->dev_addr[2] = (macu >> 8) & 0xff;
|
|
||||||
netdev->dev_addr[3] = macu & 0xff;
|
|
||||||
netdev->dev_addr[4] = (macl >> 8) & 0xff;
|
|
||||||
netdev->dev_addr[5] = macl & 0xff;
|
|
||||||
|
|
||||||
if (!is_valid_ether_addr(&netdev->dev_addr[0]))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spider_net_get_descr_status -- returns the status of a descriptor
|
* spider_net_get_descr_status -- returns the status of a descriptor
|
||||||
* @descr: descriptor to look at
|
* @descr: descriptor to look at
|
||||||
|
@ -1345,15 +1317,17 @@ spider_net_set_mac(struct net_device *netdev, void *p)
|
||||||
if (!is_valid_ether_addr(addr->sa_data))
|
if (!is_valid_ether_addr(addr->sa_data))
|
||||||
return -EADDRNOTAVAIL;
|
return -EADDRNOTAVAIL;
|
||||||
|
|
||||||
|
memcpy(netdev->dev_addr, addr->sa_data, ETH_ALEN);
|
||||||
|
|
||||||
/* switch off GMACTPE and GMACRPE */
|
/* switch off GMACTPE and GMACRPE */
|
||||||
regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD);
|
regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD);
|
||||||
regvalue &= ~((1 << 5) | (1 << 6));
|
regvalue &= ~((1 << 5) | (1 << 6));
|
||||||
spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue);
|
spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue);
|
||||||
|
|
||||||
/* write mac */
|
/* write mac */
|
||||||
macu = (addr->sa_data[0]<<24) + (addr->sa_data[1]<<16) +
|
macu = (netdev->dev_addr[0]<<24) + (netdev->dev_addr[1]<<16) +
|
||||||
(addr->sa_data[2]<<8) + (addr->sa_data[3]);
|
(netdev->dev_addr[2]<<8) + (netdev->dev_addr[3]);
|
||||||
macl = (addr->sa_data[4]<<8) + (addr->sa_data[5]);
|
macl = (netdev->dev_addr[4]<<8) + (netdev->dev_addr[5]);
|
||||||
spider_net_write_reg(card, SPIDER_NET_GMACUNIMACU, macu);
|
spider_net_write_reg(card, SPIDER_NET_GMACUNIMACU, macu);
|
||||||
spider_net_write_reg(card, SPIDER_NET_GMACUNIMACL, macl);
|
spider_net_write_reg(card, SPIDER_NET_GMACUNIMACL, macl);
|
||||||
|
|
||||||
|
@ -1364,12 +1338,6 @@ spider_net_set_mac(struct net_device *netdev, void *p)
|
||||||
|
|
||||||
spider_net_set_promisc(card);
|
spider_net_set_promisc(card);
|
||||||
|
|
||||||
/* look up, whether we have been successful */
|
|
||||||
if (spider_net_get_mac_address(netdev))
|
|
||||||
return -EADDRNOTAVAIL;
|
|
||||||
if (memcmp(netdev->dev_addr,addr->sa_data,netdev->addr_len))
|
|
||||||
return -EADDRNOTAVAIL;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -717,6 +717,7 @@ int netvsc_send(struct hv_device *device,
|
||||||
unsigned int section_index = NETVSC_INVALID_INDEX;
|
unsigned int section_index = NETVSC_INVALID_INDEX;
|
||||||
u32 msg_size = 0;
|
u32 msg_size = 0;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
u16 q_idx = packet->q_idx;
|
||||||
|
|
||||||
|
|
||||||
net_device = get_outbound_net_device(device);
|
net_device = get_outbound_net_device(device);
|
||||||
|
@ -781,24 +782,24 @@ int netvsc_send(struct hv_device *device,
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
atomic_inc(&net_device->num_outstanding_sends);
|
atomic_inc(&net_device->num_outstanding_sends);
|
||||||
atomic_inc(&net_device->queue_sends[packet->q_idx]);
|
atomic_inc(&net_device->queue_sends[q_idx]);
|
||||||
|
|
||||||
if (hv_ringbuf_avail_percent(&out_channel->outbound) <
|
if (hv_ringbuf_avail_percent(&out_channel->outbound) <
|
||||||
RING_AVAIL_PERCENT_LOWATER) {
|
RING_AVAIL_PERCENT_LOWATER) {
|
||||||
netif_tx_stop_queue(netdev_get_tx_queue(
|
netif_tx_stop_queue(netdev_get_tx_queue(
|
||||||
ndev, packet->q_idx));
|
ndev, q_idx));
|
||||||
|
|
||||||
if (atomic_read(&net_device->
|
if (atomic_read(&net_device->
|
||||||
queue_sends[packet->q_idx]) < 1)
|
queue_sends[q_idx]) < 1)
|
||||||
netif_tx_wake_queue(netdev_get_tx_queue(
|
netif_tx_wake_queue(netdev_get_tx_queue(
|
||||||
ndev, packet->q_idx));
|
ndev, q_idx));
|
||||||
}
|
}
|
||||||
} else if (ret == -EAGAIN) {
|
} else if (ret == -EAGAIN) {
|
||||||
netif_tx_stop_queue(netdev_get_tx_queue(
|
netif_tx_stop_queue(netdev_get_tx_queue(
|
||||||
ndev, packet->q_idx));
|
ndev, q_idx));
|
||||||
if (atomic_read(&net_device->queue_sends[packet->q_idx]) < 1) {
|
if (atomic_read(&net_device->queue_sends[q_idx]) < 1) {
|
||||||
netif_tx_wake_queue(netdev_get_tx_queue(
|
netif_tx_wake_queue(netdev_get_tx_queue(
|
||||||
ndev, packet->q_idx));
|
ndev, q_idx));
|
||||||
ret = -ENOSPC;
|
ret = -ENOSPC;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -647,7 +647,7 @@ static void team_notify_peers(struct team *team)
|
||||||
{
|
{
|
||||||
if (!team->notify_peers.count || !netif_running(team->dev))
|
if (!team->notify_peers.count || !netif_running(team->dev))
|
||||||
return;
|
return;
|
||||||
atomic_set(&team->notify_peers.count_pending, team->notify_peers.count);
|
atomic_add(team->notify_peers.count, &team->notify_peers.count_pending);
|
||||||
schedule_delayed_work(&team->notify_peers.dw, 0);
|
schedule_delayed_work(&team->notify_peers.dw, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,7 +687,7 @@ static void team_mcast_rejoin(struct team *team)
|
||||||
{
|
{
|
||||||
if (!team->mcast_rejoin.count || !netif_running(team->dev))
|
if (!team->mcast_rejoin.count || !netif_running(team->dev))
|
||||||
return;
|
return;
|
||||||
atomic_set(&team->mcast_rejoin.count_pending, team->mcast_rejoin.count);
|
atomic_add(team->mcast_rejoin.count, &team->mcast_rejoin.count_pending);
|
||||||
schedule_delayed_work(&team->mcast_rejoin.dw, 0);
|
schedule_delayed_work(&team->mcast_rejoin.dw, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -890,7 +890,7 @@ static const struct driver_info ax88772_info = {
|
||||||
.unbind = ax88772_unbind,
|
.unbind = ax88772_unbind,
|
||||||
.status = asix_status,
|
.status = asix_status,
|
||||||
.link_reset = ax88772_link_reset,
|
.link_reset = ax88772_link_reset,
|
||||||
.reset = ax88772_reset,
|
.reset = ax88772_link_reset,
|
||||||
.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET,
|
.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET,
|
||||||
.rx_fixup = asix_rx_fixup_common,
|
.rx_fixup = asix_rx_fixup_common,
|
||||||
.tx_fixup = asix_tx_fixup,
|
.tx_fixup = asix_tx_fixup,
|
||||||
|
|
|
@ -980,9 +980,14 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
|
||||||
{
|
{
|
||||||
struct r8152 *tp = netdev_priv(netdev);
|
struct r8152 *tp = netdev_priv(netdev);
|
||||||
struct sockaddr *addr = p;
|
struct sockaddr *addr = p;
|
||||||
|
int ret = -EADDRNOTAVAIL;
|
||||||
|
|
||||||
if (!is_valid_ether_addr(addr->sa_data))
|
if (!is_valid_ether_addr(addr->sa_data))
|
||||||
return -EADDRNOTAVAIL;
|
goto out1;
|
||||||
|
|
||||||
|
ret = usb_autopm_get_interface(tp->intf);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out1;
|
||||||
|
|
||||||
memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
|
memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
|
||||||
|
|
||||||
|
@ -990,7 +995,9 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
|
||||||
pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data);
|
pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data);
|
||||||
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
|
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
|
||||||
|
|
||||||
return 0;
|
usb_autopm_put_interface(tp->intf);
|
||||||
|
out1:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_ethernet_addr(struct r8152 *tp)
|
static int set_ethernet_addr(struct r8152 *tp)
|
||||||
|
|
|
@ -395,7 +395,8 @@ static void __init superio_serial_init(void)
|
||||||
serial_port.iotype = UPIO_PORT;
|
serial_port.iotype = UPIO_PORT;
|
||||||
serial_port.type = PORT_16550A;
|
serial_port.type = PORT_16550A;
|
||||||
serial_port.uartclk = 115200*16;
|
serial_port.uartclk = 115200*16;
|
||||||
serial_port.fifosize = 16;
|
serial_port.flags = UPF_FIXED_PORT | UPF_FIXED_TYPE |
|
||||||
|
UPF_BOOT_AUTOCONF;
|
||||||
|
|
||||||
/* serial port #1 */
|
/* serial port #1 */
|
||||||
serial_port.iobase = sio_dev.sp1_base;
|
serial_port.iobase = sio_dev.sp1_base;
|
||||||
|
|
|
@ -2039,6 +2039,10 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
|
||||||
"and killing the other node now! This node is OK and can continue.\n");
|
"and killing the other node now! This node is OK and can continue.\n");
|
||||||
__dlm_print_one_lock_resource(res);
|
__dlm_print_one_lock_resource(res);
|
||||||
spin_unlock(&res->spinlock);
|
spin_unlock(&res->spinlock);
|
||||||
|
spin_lock(&dlm->master_lock);
|
||||||
|
if (mle)
|
||||||
|
__dlm_put_mle(mle);
|
||||||
|
spin_unlock(&dlm->master_lock);
|
||||||
spin_unlock(&dlm->spinlock);
|
spin_unlock(&dlm->spinlock);
|
||||||
*ret_data = (void *)res;
|
*ret_data = (void *)res;
|
||||||
dlm_put(dlm);
|
dlm_put(dlm);
|
||||||
|
|
|
@ -115,7 +115,7 @@ typedef enum {
|
||||||
* analysis of the state functions, but in reality just taken from
|
* analysis of the state functions, but in reality just taken from
|
||||||
* thin air in the hopes othat we don't trigger a kernel panic.
|
* thin air in the hopes othat we don't trigger a kernel panic.
|
||||||
*/
|
*/
|
||||||
#define SCTP_MAX_NUM_COMMANDS 14
|
#define SCTP_MAX_NUM_COMMANDS 20
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
void *zero_all; /* Set to NULL to clear the entire union */
|
void *zero_all; /* Set to NULL to clear the entire union */
|
||||||
|
|
|
@ -7948,8 +7948,10 @@ int perf_event_init_task(struct task_struct *child)
|
||||||
|
|
||||||
for_each_task_context_nr(ctxn) {
|
for_each_task_context_nr(ctxn) {
|
||||||
ret = perf_event_init_context(child, ctxn);
|
ret = perf_event_init_context(child, ctxn);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
perf_event_free_task(child);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1360,7 +1360,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||||
goto bad_fork_cleanup_policy;
|
goto bad_fork_cleanup_policy;
|
||||||
retval = audit_alloc(p);
|
retval = audit_alloc(p);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto bad_fork_cleanup_policy;
|
goto bad_fork_cleanup_perf;
|
||||||
/* copy all the process information */
|
/* copy all the process information */
|
||||||
shm_init_task(p);
|
shm_init_task(p);
|
||||||
retval = copy_semundo(clone_flags, p);
|
retval = copy_semundo(clone_flags, p);
|
||||||
|
@ -1566,8 +1566,9 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
||||||
exit_sem(p);
|
exit_sem(p);
|
||||||
bad_fork_cleanup_audit:
|
bad_fork_cleanup_audit:
|
||||||
audit_free(p);
|
audit_free(p);
|
||||||
bad_fork_cleanup_policy:
|
bad_fork_cleanup_perf:
|
||||||
perf_event_free_task(p);
|
perf_event_free_task(p);
|
||||||
|
bad_fork_cleanup_policy:
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
mpol_put(p->mempolicy);
|
mpol_put(p->mempolicy);
|
||||||
bad_fork_cleanup_threadgroup_lock:
|
bad_fork_cleanup_threadgroup_lock:
|
||||||
|
|
|
@ -1795,14 +1795,17 @@ static int __split_huge_page_map(struct page *page,
|
||||||
for (i = 0; i < HPAGE_PMD_NR; i++, haddr += PAGE_SIZE) {
|
for (i = 0; i < HPAGE_PMD_NR; i++, haddr += PAGE_SIZE) {
|
||||||
pte_t *pte, entry;
|
pte_t *pte, entry;
|
||||||
BUG_ON(PageCompound(page+i));
|
BUG_ON(PageCompound(page+i));
|
||||||
|
/*
|
||||||
|
* Note that pmd_numa is not transferred deliberately
|
||||||
|
* to avoid any possibility that pte_numa leaks to
|
||||||
|
* a PROT_NONE VMA by accident.
|
||||||
|
*/
|
||||||
entry = mk_pte(page + i, vma->vm_page_prot);
|
entry = mk_pte(page + i, vma->vm_page_prot);
|
||||||
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
entry = maybe_mkwrite(pte_mkdirty(entry), vma);
|
||||||
if (!pmd_write(*pmd))
|
if (!pmd_write(*pmd))
|
||||||
entry = pte_wrprotect(entry);
|
entry = pte_wrprotect(entry);
|
||||||
if (!pmd_young(*pmd))
|
if (!pmd_young(*pmd))
|
||||||
entry = pte_mkold(entry);
|
entry = pte_mkold(entry);
|
||||||
if (pmd_numa(*pmd))
|
|
||||||
entry = pte_mknuma(entry);
|
|
||||||
pte = pte_offset_map(&_pmd, haddr);
|
pte = pte_offset_map(&_pmd, haddr);
|
||||||
BUG_ON(!pte_none(*pte));
|
BUG_ON(!pte_none(*pte));
|
||||||
set_pte_at(mm, haddr, pte, entry);
|
set_pte_at(mm, haddr, pte, entry);
|
||||||
|
|
|
@ -292,6 +292,9 @@ struct mem_cgroup {
|
||||||
/* vmpressure notifications */
|
/* vmpressure notifications */
|
||||||
struct vmpressure vmpressure;
|
struct vmpressure vmpressure;
|
||||||
|
|
||||||
|
/* css_online() has been completed */
|
||||||
|
int initialized;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the counter to account for mem+swap usage.
|
* the counter to account for mem+swap usage.
|
||||||
*/
|
*/
|
||||||
|
@ -1099,10 +1102,21 @@ static struct mem_cgroup *__mem_cgroup_iter_next(struct mem_cgroup *root,
|
||||||
* skipping css reference should be safe.
|
* skipping css reference should be safe.
|
||||||
*/
|
*/
|
||||||
if (next_css) {
|
if (next_css) {
|
||||||
if ((next_css == &root->css) ||
|
struct mem_cgroup *memcg = mem_cgroup_from_css(next_css);
|
||||||
((next_css->flags & CSS_ONLINE) &&
|
|
||||||
css_tryget_online(next_css)))
|
if (next_css == &root->css)
|
||||||
return mem_cgroup_from_css(next_css);
|
return memcg;
|
||||||
|
|
||||||
|
if (css_tryget_online(next_css)) {
|
||||||
|
/*
|
||||||
|
* Make sure the memcg is initialized:
|
||||||
|
* mem_cgroup_css_online() orders the the
|
||||||
|
* initialization against setting the flag.
|
||||||
|
*/
|
||||||
|
if (smp_load_acquire(&memcg->initialized))
|
||||||
|
return memcg;
|
||||||
|
css_put(next_css);
|
||||||
|
}
|
||||||
|
|
||||||
prev_css = next_css;
|
prev_css = next_css;
|
||||||
goto skip_node;
|
goto skip_node;
|
||||||
|
@ -5549,6 +5563,7 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css)
|
||||||
{
|
{
|
||||||
struct mem_cgroup *memcg = mem_cgroup_from_css(css);
|
struct mem_cgroup *memcg = mem_cgroup_from_css(css);
|
||||||
struct mem_cgroup *parent = mem_cgroup_from_css(css->parent);
|
struct mem_cgroup *parent = mem_cgroup_from_css(css->parent);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (css->id > MEM_CGROUP_ID_MAX)
|
if (css->id > MEM_CGROUP_ID_MAX)
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
|
@ -5585,7 +5600,18 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css)
|
||||||
}
|
}
|
||||||
mutex_unlock(&memcg_create_mutex);
|
mutex_unlock(&memcg_create_mutex);
|
||||||
|
|
||||||
return memcg_init_kmem(memcg, &memory_cgrp_subsys);
|
ret = memcg_init_kmem(memcg, &memory_cgrp_subsys);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the memcg is initialized: mem_cgroup_iter()
|
||||||
|
* orders reading memcg->initialized against its callers
|
||||||
|
* reading the memcg members.
|
||||||
|
*/
|
||||||
|
smp_store_release(&memcg->initialized, 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -146,8 +146,11 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
|
||||||
pte = pte_mkold(mk_pte(new, vma->vm_page_prot));
|
pte = pte_mkold(mk_pte(new, vma->vm_page_prot));
|
||||||
if (pte_swp_soft_dirty(*ptep))
|
if (pte_swp_soft_dirty(*ptep))
|
||||||
pte = pte_mksoft_dirty(pte);
|
pte = pte_mksoft_dirty(pte);
|
||||||
|
|
||||||
|
/* Recheck VMA as permissions can change since migration started */
|
||||||
if (is_write_migration_entry(entry))
|
if (is_write_migration_entry(entry))
|
||||||
pte = pte_mkwrite(pte);
|
pte = maybe_mkwrite(pte, vma);
|
||||||
|
|
||||||
#ifdef CONFIG_HUGETLB_PAGE
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
if (PageHuge(new)) {
|
if (PageHuge(new)) {
|
||||||
pte = pte_mkhuge(pte);
|
pte = pte_mkhuge(pte);
|
||||||
|
|
|
@ -1612,7 +1612,7 @@ struct page *buffered_rmqueue(struct zone *preferred_zone,
|
||||||
}
|
}
|
||||||
|
|
||||||
__mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order));
|
__mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order));
|
||||||
if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 &&
|
if (atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]) <= 0 &&
|
||||||
!zone_is_fair_depleted(zone))
|
!zone_is_fair_depleted(zone))
|
||||||
zone_set_flag(zone, ZONE_FAIR_DEPLETED);
|
zone_set_flag(zone, ZONE_FAIR_DEPLETED);
|
||||||
|
|
||||||
|
@ -5701,9 +5701,8 @@ static void __setup_per_zone_wmarks(void)
|
||||||
zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1);
|
zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1);
|
||||||
|
|
||||||
__mod_zone_page_state(zone, NR_ALLOC_BATCH,
|
__mod_zone_page_state(zone, NR_ALLOC_BATCH,
|
||||||
high_wmark_pages(zone) -
|
high_wmark_pages(zone) - low_wmark_pages(zone) -
|
||||||
low_wmark_pages(zone) -
|
atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]));
|
||||||
zone_page_state(zone, NR_ALLOC_BATCH));
|
|
||||||
|
|
||||||
setup_zone_migrate_reserve(zone);
|
setup_zone_migrate_reserve(zone);
|
||||||
spin_unlock_irqrestore(&zone->lock, flags);
|
spin_unlock_irqrestore(&zone->lock, flags);
|
||||||
|
|
|
@ -316,6 +316,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
|
||||||
ETH_HLEN-ETH_ALEN);
|
ETH_HLEN-ETH_ALEN);
|
||||||
/* tell br_dev_xmit to continue with forwarding */
|
/* tell br_dev_xmit to continue with forwarding */
|
||||||
nf_bridge->mask |= BRNF_BRIDGED_DNAT;
|
nf_bridge->mask |= BRNF_BRIDGED_DNAT;
|
||||||
|
/* FIXME Need to refragment */
|
||||||
ret = neigh->output(neigh, skb);
|
ret = neigh->output(neigh, skb);
|
||||||
}
|
}
|
||||||
neigh_release(neigh);
|
neigh_release(neigh);
|
||||||
|
@ -371,6 +372,10 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
|
||||||
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
|
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
|
||||||
struct rtable *rt;
|
struct rtable *rt;
|
||||||
int err;
|
int err;
|
||||||
|
int frag_max_size;
|
||||||
|
|
||||||
|
frag_max_size = IPCB(skb)->frag_max_size;
|
||||||
|
BR_INPUT_SKB_CB(skb)->frag_max_size = frag_max_size;
|
||||||
|
|
||||||
if (nf_bridge->mask & BRNF_PKT_TYPE) {
|
if (nf_bridge->mask & BRNF_PKT_TYPE) {
|
||||||
skb->pkt_type = PACKET_OTHERHOST;
|
skb->pkt_type = PACKET_OTHERHOST;
|
||||||
|
@ -775,13 +780,19 @@ static unsigned int br_nf_forward_arp(const struct nf_hook_ops *ops,
|
||||||
static int br_nf_dev_queue_xmit(struct sk_buff *skb)
|
static int br_nf_dev_queue_xmit(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
int frag_max_size;
|
||||||
|
|
||||||
|
/* This is wrong! We should preserve the original fragment
|
||||||
|
* boundaries by preserving frag_list rather than refragmenting.
|
||||||
|
*/
|
||||||
if (skb->protocol == htons(ETH_P_IP) &&
|
if (skb->protocol == htons(ETH_P_IP) &&
|
||||||
skb->len + nf_bridge_mtu_reduction(skb) > skb->dev->mtu &&
|
skb->len + nf_bridge_mtu_reduction(skb) > skb->dev->mtu &&
|
||||||
!skb_is_gso(skb)) {
|
!skb_is_gso(skb)) {
|
||||||
|
frag_max_size = BR_INPUT_SKB_CB(skb)->frag_max_size;
|
||||||
if (br_parse_ip_options(skb))
|
if (br_parse_ip_options(skb))
|
||||||
/* Drop invalid packet */
|
/* Drop invalid packet */
|
||||||
return NF_DROP;
|
return NF_DROP;
|
||||||
|
IPCB(skb)->frag_max_size = frag_max_size;
|
||||||
ret = ip_fragment(skb, br_dev_queue_push_xmit);
|
ret = ip_fragment(skb, br_dev_queue_push_xmit);
|
||||||
} else
|
} else
|
||||||
ret = br_dev_queue_push_xmit(skb);
|
ret = br_dev_queue_push_xmit(skb);
|
||||||
|
|
|
@ -306,10 +306,14 @@ struct net_bridge
|
||||||
|
|
||||||
struct br_input_skb_cb {
|
struct br_input_skb_cb {
|
||||||
struct net_device *brdev;
|
struct net_device *brdev;
|
||||||
|
|
||||||
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
|
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
|
||||||
int igmp;
|
int igmp;
|
||||||
int mrouters_only;
|
int mrouters_only;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
u16 frag_max_size;
|
||||||
|
|
||||||
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
|
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
|
||||||
bool vlan_filtered;
|
bool vlan_filtered;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -786,7 +786,7 @@ static inline int ip6gre_xmit_ipv4(struct sk_buff *skb, struct net_device *dev)
|
||||||
encap_limit = t->parms.encap_limit;
|
encap_limit = t->parms.encap_limit;
|
||||||
|
|
||||||
memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6));
|
memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6));
|
||||||
fl6.flowi6_proto = IPPROTO_IPIP;
|
fl6.flowi6_proto = IPPROTO_GRE;
|
||||||
|
|
||||||
dsfield = ipv4_get_dsfield(iph);
|
dsfield = ipv4_get_dsfield(iph);
|
||||||
|
|
||||||
|
@ -836,7 +836,7 @@ static inline int ip6gre_xmit_ipv6(struct sk_buff *skb, struct net_device *dev)
|
||||||
encap_limit = t->parms.encap_limit;
|
encap_limit = t->parms.encap_limit;
|
||||||
|
|
||||||
memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6));
|
memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6));
|
||||||
fl6.flowi6_proto = IPPROTO_IPV6;
|
fl6.flowi6_proto = IPPROTO_GRE;
|
||||||
|
|
||||||
dsfield = ipv6_get_dsfield(ipv6h);
|
dsfield = ipv6_get_dsfield(ipv6h);
|
||||||
if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS)
|
if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS)
|
||||||
|
|
|
@ -593,8 +593,11 @@ static void rds_send_remove_from_sock(struct list_head *messages, int status)
|
||||||
sock_put(rds_rs_to_sk(rs));
|
sock_put(rds_rs_to_sk(rs));
|
||||||
}
|
}
|
||||||
rs = rm->m_rs;
|
rs = rm->m_rs;
|
||||||
sock_hold(rds_rs_to_sk(rs));
|
if (rs)
|
||||||
|
sock_hold(rds_rs_to_sk(rs));
|
||||||
}
|
}
|
||||||
|
if (!rs)
|
||||||
|
goto unlock_and_drop;
|
||||||
spin_lock(&rs->rs_lock);
|
spin_lock(&rs->rs_lock);
|
||||||
|
|
||||||
if (test_and_clear_bit(RDS_MSG_ON_SOCK, &rm->m_flags)) {
|
if (test_and_clear_bit(RDS_MSG_ON_SOCK, &rm->m_flags)) {
|
||||||
|
@ -638,9 +641,6 @@ static void rds_send_remove_from_sock(struct list_head *messages, int status)
|
||||||
* queue. This means that in the TCP case, the message may not have been
|
* queue. This means that in the TCP case, the message may not have been
|
||||||
* assigned the m_ack_seq yet - but that's fine as long as tcp_is_acked
|
* assigned the m_ack_seq yet - but that's fine as long as tcp_is_acked
|
||||||
* checks the RDS_MSG_HAS_ACK_SEQ bit.
|
* checks the RDS_MSG_HAS_ACK_SEQ bit.
|
||||||
*
|
|
||||||
* XXX It's not clear to me how this is safely serialized with socket
|
|
||||||
* destruction. Maybe it should bail if it sees SOCK_DEAD.
|
|
||||||
*/
|
*/
|
||||||
void rds_send_drop_acked(struct rds_connection *conn, u64 ack,
|
void rds_send_drop_acked(struct rds_connection *conn, u64 ack,
|
||||||
is_acked_func is_acked)
|
is_acked_func is_acked)
|
||||||
|
@ -711,6 +711,9 @@ void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in *dest)
|
||||||
*/
|
*/
|
||||||
if (!test_and_clear_bit(RDS_MSG_ON_CONN, &rm->m_flags)) {
|
if (!test_and_clear_bit(RDS_MSG_ON_CONN, &rm->m_flags)) {
|
||||||
spin_unlock_irqrestore(&conn->c_lock, flags);
|
spin_unlock_irqrestore(&conn->c_lock, flags);
|
||||||
|
spin_lock_irqsave(&rm->m_rs_lock, flags);
|
||||||
|
rm->m_rs = NULL;
|
||||||
|
spin_unlock_irqrestore(&rm->m_rs_lock, flags);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
list_del_init(&rm->m_conn_item);
|
list_del_init(&rm->m_conn_item);
|
||||||
|
|
|
@ -106,11 +106,14 @@ int rds_tcp_conn_connect(struct rds_connection *conn)
|
||||||
rds_tcp_set_callbacks(sock, conn);
|
rds_tcp_set_callbacks(sock, conn);
|
||||||
ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest),
|
ret = sock->ops->connect(sock, (struct sockaddr *)&dest, sizeof(dest),
|
||||||
O_NONBLOCK);
|
O_NONBLOCK);
|
||||||
sock = NULL;
|
|
||||||
|
|
||||||
rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret);
|
rdsdebug("connect to address %pI4 returned %d\n", &conn->c_faddr, ret);
|
||||||
if (ret == -EINPROGRESS)
|
if (ret == -EINPROGRESS)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
if (ret == 0)
|
||||||
|
sock = NULL;
|
||||||
|
else
|
||||||
|
rds_tcp_restore_callbacks(sock, conn->c_transport_data);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (sock)
|
if (sock)
|
||||||
|
|
|
@ -78,8 +78,7 @@ void rds_connect_complete(struct rds_connection *conn)
|
||||||
"current state is %d\n",
|
"current state is %d\n",
|
||||||
__func__,
|
__func__,
|
||||||
atomic_read(&conn->c_state));
|
atomic_read(&conn->c_state));
|
||||||
atomic_set(&conn->c_state, RDS_CONN_ERROR);
|
rds_conn_drop(conn);
|
||||||
queue_work(rds_wq, &conn->c_down_w);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -549,6 +549,7 @@ void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
|
||||||
tcf_tree_lock(tp);
|
tcf_tree_lock(tp);
|
||||||
list_splice_init(&dst->actions, &tmp);
|
list_splice_init(&dst->actions, &tmp);
|
||||||
list_splice(&src->actions, &dst->actions);
|
list_splice(&src->actions, &dst->actions);
|
||||||
|
dst->type = src->type;
|
||||||
tcf_tree_unlock(tp);
|
tcf_tree_unlock(tp);
|
||||||
tcf_action_destroy(&tmp, TCA_ACT_UNBIND);
|
tcf_action_destroy(&tmp, TCA_ACT_UNBIND);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -528,9 +528,10 @@ int __tcf_em_tree_match(struct sk_buff *skb, struct tcf_ematch_tree *tree,
|
||||||
match_idx = stack[--stackp];
|
match_idx = stack[--stackp];
|
||||||
cur_match = tcf_em_get_match(tree, match_idx);
|
cur_match = tcf_em_get_match(tree, match_idx);
|
||||||
|
|
||||||
|
if (tcf_em_is_inverted(cur_match))
|
||||||
|
res = !res;
|
||||||
|
|
||||||
if (tcf_em_early_end(cur_match, res)) {
|
if (tcf_em_early_end(cur_match, res)) {
|
||||||
if (tcf_em_is_inverted(cur_match))
|
|
||||||
res = !res;
|
|
||||||
goto pop_stack;
|
goto pop_stack;
|
||||||
} else {
|
} else {
|
||||||
match_idx++;
|
match_idx++;
|
||||||
|
|
|
@ -1775,9 +1775,22 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(struct net *net,
|
||||||
/* Update the content of current association. */
|
/* Update the content of current association. */
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
|
sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
|
sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
|
if (sctp_state(asoc, SHUTDOWN_PENDING) &&
|
||||||
SCTP_STATE(SCTP_STATE_ESTABLISHED));
|
(sctp_sstate(asoc->base.sk, CLOSING) ||
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
|
sock_flag(asoc->base.sk, SOCK_DEAD))) {
|
||||||
|
/* if were currently in SHUTDOWN_PENDING, but the socket
|
||||||
|
* has been closed by user, don't transition to ESTABLISHED.
|
||||||
|
* Instead trigger SHUTDOWN bundled with COOKIE_ACK.
|
||||||
|
*/
|
||||||
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
|
||||||
|
return sctp_sf_do_9_2_start_shutdown(net, ep, asoc,
|
||||||
|
SCTP_ST_CHUNK(0), NULL,
|
||||||
|
commands);
|
||||||
|
} else {
|
||||||
|
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
|
||||||
|
SCTP_STATE(SCTP_STATE_ESTABLISHED));
|
||||||
|
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl));
|
||||||
|
}
|
||||||
return SCTP_DISPOSITION_CONSUME;
|
return SCTP_DISPOSITION_CONSUME;
|
||||||
|
|
||||||
nomem_ev:
|
nomem_ev:
|
||||||
|
|
|
@ -51,7 +51,7 @@ static struct reg_default rt286_index_def[] = {
|
||||||
{ 0x04, 0xaf01 },
|
{ 0x04, 0xaf01 },
|
||||||
{ 0x08, 0x000d },
|
{ 0x08, 0x000d },
|
||||||
{ 0x09, 0xd810 },
|
{ 0x09, 0xd810 },
|
||||||
{ 0x0a, 0x0060 },
|
{ 0x0a, 0x0120 },
|
||||||
{ 0x0b, 0x0000 },
|
{ 0x0b, 0x0000 },
|
||||||
{ 0x0d, 0x2800 },
|
{ 0x0d, 0x2800 },
|
||||||
{ 0x0f, 0x0000 },
|
{ 0x0f, 0x0000 },
|
||||||
|
@ -60,7 +60,7 @@ static struct reg_default rt286_index_def[] = {
|
||||||
{ 0x33, 0x0208 },
|
{ 0x33, 0x0208 },
|
||||||
{ 0x49, 0x0004 },
|
{ 0x49, 0x0004 },
|
||||||
{ 0x4f, 0x50e9 },
|
{ 0x4f, 0x50e9 },
|
||||||
{ 0x50, 0x2c00 },
|
{ 0x50, 0x2000 },
|
||||||
{ 0x63, 0x2902 },
|
{ 0x63, 0x2902 },
|
||||||
{ 0x67, 0x1111 },
|
{ 0x67, 0x1111 },
|
||||||
{ 0x68, 0x1016 },
|
{ 0x68, 0x1016 },
|
||||||
|
@ -104,7 +104,6 @@ static const struct reg_default rt286_reg[] = {
|
||||||
{ 0x02170700, 0x00000000 },
|
{ 0x02170700, 0x00000000 },
|
||||||
{ 0x02270100, 0x00000000 },
|
{ 0x02270100, 0x00000000 },
|
||||||
{ 0x02370100, 0x00000000 },
|
{ 0x02370100, 0x00000000 },
|
||||||
{ 0x02040000, 0x00004002 },
|
|
||||||
{ 0x01870700, 0x00000020 },
|
{ 0x01870700, 0x00000020 },
|
||||||
{ 0x00830000, 0x000000c3 },
|
{ 0x00830000, 0x000000c3 },
|
||||||
{ 0x00930000, 0x000000c3 },
|
{ 0x00930000, 0x000000c3 },
|
||||||
|
@ -192,7 +191,6 @@ static int rt286_hw_write(void *context, unsigned int reg, unsigned int value)
|
||||||
/*handle index registers*/
|
/*handle index registers*/
|
||||||
if (reg <= 0xff) {
|
if (reg <= 0xff) {
|
||||||
rt286_hw_write(client, RT286_COEF_INDEX, reg);
|
rt286_hw_write(client, RT286_COEF_INDEX, reg);
|
||||||
reg = RT286_PROC_COEF;
|
|
||||||
for (i = 0; i < INDEX_CACHE_SIZE; i++) {
|
for (i = 0; i < INDEX_CACHE_SIZE; i++) {
|
||||||
if (reg == rt286->index_cache[i].reg) {
|
if (reg == rt286->index_cache[i].reg) {
|
||||||
rt286->index_cache[i].def = value;
|
rt286->index_cache[i].def = value;
|
||||||
|
@ -200,6 +198,7 @@ static int rt286_hw_write(void *context, unsigned int reg, unsigned int value)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
reg = RT286_PROC_COEF;
|
||||||
}
|
}
|
||||||
|
|
||||||
data[0] = (reg >> 24) & 0xff;
|
data[0] = (reg >> 24) & 0xff;
|
||||||
|
|
|
@ -647,7 +647,7 @@ int ssm2602_probe(struct device *dev, enum ssm2602_type type,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
dev_set_drvdata(dev, ssm2602);
|
dev_set_drvdata(dev, ssm2602);
|
||||||
ssm2602->type = SSM2602;
|
ssm2602->type = type;
|
||||||
ssm2602->regmap = regmap;
|
ssm2602->regmap = regmap;
|
||||||
|
|
||||||
return snd_soc_register_codec(dev, &soc_codec_dev_ssm2602,
|
return snd_soc_register_codec(dev, &soc_codec_dev_ssm2602,
|
||||||
|
|
|
@ -748,8 +748,9 @@ static int fsl_ssi_hw_free(struct snd_pcm_substream *substream,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _fsl_ssi_set_dai_fmt(struct fsl_ssi_private *ssi_private,
|
static int _fsl_ssi_set_dai_fmt(struct device *dev,
|
||||||
unsigned int fmt)
|
struct fsl_ssi_private *ssi_private,
|
||||||
|
unsigned int fmt)
|
||||||
{
|
{
|
||||||
struct regmap *regs = ssi_private->regs;
|
struct regmap *regs = ssi_private->regs;
|
||||||
u32 strcr = 0, stcr, srcr, scr, mask;
|
u32 strcr = 0, stcr, srcr, scr, mask;
|
||||||
|
@ -758,7 +759,7 @@ static int _fsl_ssi_set_dai_fmt(struct fsl_ssi_private *ssi_private,
|
||||||
ssi_private->dai_fmt = fmt;
|
ssi_private->dai_fmt = fmt;
|
||||||
|
|
||||||
if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) {
|
if (fsl_ssi_is_i2s_master(ssi_private) && IS_ERR(ssi_private->baudclk)) {
|
||||||
dev_err(&ssi_private->pdev->dev, "baudclk is missing which is necessary for master mode\n");
|
dev_err(dev, "baudclk is missing which is necessary for master mode\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -913,7 +914,7 @@ static int fsl_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
|
||||||
{
|
{
|
||||||
struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
|
struct fsl_ssi_private *ssi_private = snd_soc_dai_get_drvdata(cpu_dai);
|
||||||
|
|
||||||
return _fsl_ssi_set_dai_fmt(ssi_private, fmt);
|
return _fsl_ssi_set_dai_fmt(cpu_dai->dev, ssi_private, fmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1387,7 +1388,8 @@ static int fsl_ssi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (ssi_private->dai_fmt)
|
if (ssi_private->dai_fmt)
|
||||||
_fsl_ssi_set_dai_fmt(ssi_private, ssi_private->dai_fmt);
|
_fsl_ssi_set_dai_fmt(&pdev->dev, ssi_private,
|
||||||
|
ssi_private->dai_fmt);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -102,13 +102,11 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
|
||||||
fe->dpcm[stream].runtime = fe_substream->runtime;
|
fe->dpcm[stream].runtime = fe_substream->runtime;
|
||||||
|
|
||||||
ret = dpcm_path_get(fe, stream, &list);
|
ret = dpcm_path_get(fe, stream, &list);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
mutex_unlock(&fe->card->mutex);
|
|
||||||
goto fe_err;
|
goto fe_err;
|
||||||
} else if (ret == 0) {
|
else if (ret == 0)
|
||||||
dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
|
dev_dbg(fe->dev, "ASoC: %s no valid %s route\n",
|
||||||
fe->dai_link->name, stream ? "capture" : "playback");
|
fe->dai_link->name, stream ? "capture" : "playback");
|
||||||
}
|
|
||||||
|
|
||||||
/* calculate valid and active FE <-> BE dpcms */
|
/* calculate valid and active FE <-> BE dpcms */
|
||||||
dpcm_process_paths(fe, stream, &list, 1);
|
dpcm_process_paths(fe, stream, &list, 1);
|
||||||
|
|
|
@ -3203,7 +3203,7 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
|
||||||
unsigned int val, mask;
|
unsigned int val, mask;
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
if (!component->regmap)
|
if (!component->regmap || !params->num_regs)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
len = params->num_regs * component->val_bytes;
|
len = params->num_regs * component->val_bytes;
|
||||||
|
|
Loading…
Reference in New Issue