mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 09:11:49 +00:00
1190 lines
38 KiB
Diff
1190 lines
38 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 65c0d7f..a36dada 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 48
|
|
+SUBLEVEL = 49
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c
|
|
index 8752f79..8a811d9 100644
|
|
--- a/arch/powerpc/platforms/pseries/eeh_pseries.c
|
|
+++ b/arch/powerpc/platforms/pseries/eeh_pseries.c
|
|
@@ -83,7 +83,11 @@ static int pseries_eeh_init(void)
|
|
ibm_configure_pe = rtas_token("ibm,configure-pe");
|
|
ibm_configure_bridge = rtas_token ("ibm,configure-bridge");
|
|
|
|
- /* necessary sanity check */
|
|
+ /*
|
|
+ * Necessary sanity check. We needn't check "get-config-addr-info"
|
|
+ * and its variant since the old firmware probably support address
|
|
+ * of domain/bus/slot/function for EEH RTAS operations.
|
|
+ */
|
|
if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) {
|
|
pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n",
|
|
__func__);
|
|
@@ -102,12 +106,6 @@ static int pseries_eeh_init(void)
|
|
pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n",
|
|
__func__);
|
|
return -EINVAL;
|
|
- } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE &&
|
|
- ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) {
|
|
- pr_warning("%s: RTAS service <ibm,get-config-addr-info2> and "
|
|
- "<ibm,get-config-addr-info> invalid\n",
|
|
- __func__);
|
|
- return -EINVAL;
|
|
} else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE &&
|
|
ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) {
|
|
pr_warning("%s: RTAS service <ibm,configure-pe> and "
|
|
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
|
|
index 91357e1..6d2c49b 100644
|
|
--- a/drivers/acpi/video.c
|
|
+++ b/drivers/acpi/video.c
|
|
@@ -447,6 +447,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"),
|
|
},
|
|
},
|
|
+ {
|
|
+ .callback = video_ignore_initial_backlight,
|
|
+ .ident = "HP Pavilion g6 Notebook PC",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"),
|
|
+ },
|
|
+ },
|
|
+ {
|
|
+ .callback = video_ignore_initial_backlight,
|
|
+ .ident = "HP Pavilion m4",
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"),
|
|
+ },
|
|
+ },
|
|
{}
|
|
};
|
|
|
|
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
|
|
index c869436..dc33ba5 100644
|
|
--- a/drivers/gpu/drm/drm_irq.c
|
|
+++ b/drivers/gpu/drm/drm_irq.c
|
|
@@ -981,7 +981,7 @@ EXPORT_SYMBOL(drm_vblank_off);
|
|
*/
|
|
void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
|
|
{
|
|
- /* vblank is not initialized (IRQ not installed ?) */
|
|
+ /* vblank is not initialized (IRQ not installed ?), or has been freed */
|
|
if (!dev->num_crtcs)
|
|
return;
|
|
/*
|
|
@@ -1003,6 +1003,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
|
|
{
|
|
unsigned long irqflags;
|
|
|
|
+ /* vblank is not initialized (IRQ not installed ?), or has been freed */
|
|
+ if (!dev->num_crtcs)
|
|
+ return;
|
|
+
|
|
if (dev->vblank_inmodeset[crtc]) {
|
|
spin_lock_irqsave(&dev->vbl_lock, irqflags);
|
|
dev->vblank_disable_allowed = 1;
|
|
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
|
|
index 8ea202f..fa74a86 100644
|
|
--- a/drivers/gpu/drm/gma500/framebuffer.c
|
|
+++ b/drivers/gpu/drm/gma500/framebuffer.c
|
|
@@ -782,8 +782,8 @@ void psb_modeset_init(struct drm_device *dev)
|
|
for (i = 0; i < dev_priv->num_pipe; i++)
|
|
psb_intel_crtc_init(dev, i, mode_dev);
|
|
|
|
- dev->mode_config.max_width = 2048;
|
|
- dev->mode_config.max_height = 2048;
|
|
+ dev->mode_config.max_width = 4096;
|
|
+ dev->mode_config.max_height = 4096;
|
|
|
|
psb_setup_outputs(dev);
|
|
}
|
|
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
|
|
index 1ad5906..207180d 100644
|
|
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
@@ -747,10 +747,10 @@ static const struct dmi_system_id intel_no_lvds[] = {
|
|
},
|
|
{
|
|
.callback = intel_no_lvds_dmi_callback,
|
|
- .ident = "Hewlett-Packard HP t5740e Thin Client",
|
|
+ .ident = "Hewlett-Packard HP t5740",
|
|
.matches = {
|
|
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
|
- DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, " t5740"),
|
|
},
|
|
},
|
|
{
|
|
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
|
|
index 1b6b157..aeb9d6e 100644
|
|
--- a/drivers/gpu/drm/i915/intel_sdvo.c
|
|
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
|
|
@@ -1581,7 +1581,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
|
* Assume that the preferred modes are
|
|
* arranged in priority order.
|
|
*/
|
|
- intel_ddc_get_modes(connector, intel_sdvo->i2c);
|
|
+ intel_ddc_get_modes(connector, &intel_sdvo->ddc);
|
|
if (list_empty(&connector->probed_modes) == false)
|
|
goto end;
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
|
|
index 23e3ea6..ced9370 100644
|
|
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
|
|
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
|
|
@@ -396,6 +396,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
|
|
int
|
|
atombios_get_encoder_mode(struct drm_encoder *encoder)
|
|
{
|
|
+ struct drm_device *dev = encoder->dev;
|
|
+ struct radeon_device *rdev = dev->dev_private;
|
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
|
struct drm_connector *connector;
|
|
struct radeon_connector *radeon_connector;
|
|
@@ -421,7 +423,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
|
case DRM_MODE_CONNECTOR_DVII:
|
|
case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
|
|
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
|
- radeon_audio)
|
|
+ radeon_audio &&
|
|
+ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
|
|
return ATOM_ENCODER_MODE_HDMI;
|
|
else if (radeon_connector->use_digital)
|
|
return ATOM_ENCODER_MODE_DVI;
|
|
@@ -432,7 +435,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
|
case DRM_MODE_CONNECTOR_HDMIA:
|
|
default:
|
|
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
|
- radeon_audio)
|
|
+ radeon_audio &&
|
|
+ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
|
|
return ATOM_ENCODER_MODE_HDMI;
|
|
else
|
|
return ATOM_ENCODER_MODE_DVI;
|
|
@@ -446,7 +450,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
|
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
|
|
return ATOM_ENCODER_MODE_DP;
|
|
else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
|
- radeon_audio)
|
|
+ radeon_audio &&
|
|
+ !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
|
|
return ATOM_ENCODER_MODE_HDMI;
|
|
else
|
|
return ATOM_ENCODER_MODE_DVI;
|
|
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
|
|
index 6a8776e..300099d 100644
|
|
--- a/drivers/gpu/drm/radeon/evergreen.c
|
|
+++ b/drivers/gpu/drm/radeon/evergreen.c
|
|
@@ -3258,6 +3258,12 @@ static int evergreen_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r = r600_irq_init(rdev);
|
|
if (r) {
|
|
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
|
@@ -3409,10 +3415,6 @@ int evergreen_init(struct radeon_device *rdev)
|
|
if (r)
|
|
return r;
|
|
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
-
|
|
rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
|
|
r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
|
|
index d706da8..f5387b3 100644
|
|
--- a/drivers/gpu/drm/radeon/ni.c
|
|
+++ b/drivers/gpu/drm/radeon/ni.c
|
|
@@ -1614,6 +1614,12 @@ static int cayman_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r = r600_irq_init(rdev);
|
|
if (r) {
|
|
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
|
@@ -1744,10 +1750,6 @@ int cayman_init(struct radeon_device *rdev)
|
|
if (r)
|
|
return r;
|
|
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
-
|
|
ring->ring_obj = NULL;
|
|
r600_ring_init(rdev, ring, 1024 * 1024);
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
|
|
index fe33d35..40ed0e5 100644
|
|
--- a/drivers/gpu/drm/radeon/r100.c
|
|
+++ b/drivers/gpu/drm/radeon/r100.c
|
|
@@ -3952,6 +3952,12 @@ static int r100_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r100_irq_set(rdev);
|
|
rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -4113,9 +4119,6 @@ int r100_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
|
|
index fa14383..63b53aa 100644
|
|
--- a/drivers/gpu/drm/radeon/r300.c
|
|
+++ b/drivers/gpu/drm/radeon/r300.c
|
|
@@ -1405,6 +1405,12 @@ static int r300_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r100_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -1545,9 +1551,6 @@ int r300_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
|
|
index f3fcaac..1a9347f 100644
|
|
--- a/drivers/gpu/drm/radeon/r420.c
|
|
+++ b/drivers/gpu/drm/radeon/r420.c
|
|
@@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r100_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -417,10 +423,6 @@ int r420_init(struct radeon_device *rdev)
|
|
if (r) {
|
|
return r;
|
|
}
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r) {
|
|
- return r;
|
|
- }
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r) {
|
|
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c
|
|
index ebcc15b..57be784 100644
|
|
--- a/drivers/gpu/drm/radeon/r520.c
|
|
+++ b/drivers/gpu/drm/radeon/r520.c
|
|
@@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
rs600_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -301,9 +307,6 @@ int r520_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
|
|
index b1ff9cc..8c403d9 100644
|
|
--- a/drivers/gpu/drm/radeon/r600.c
|
|
+++ b/drivers/gpu/drm/radeon/r600.c
|
|
@@ -2470,6 +2470,12 @@ int r600_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r = r600_irq_init(rdev);
|
|
if (r) {
|
|
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
|
@@ -2624,10 +2630,6 @@ int r600_init(struct radeon_device *rdev)
|
|
if (r)
|
|
return r;
|
|
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
-
|
|
rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
|
|
r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
|
|
index 4cf381b..5099bd3 100644
|
|
--- a/drivers/gpu/drm/radeon/rs400.c
|
|
+++ b/drivers/gpu/drm/radeon/rs400.c
|
|
@@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r100_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -541,9 +547,6 @@ int rs400_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
|
|
index d25cf86..5248001 100644
|
|
--- a/drivers/gpu/drm/radeon/rs600.c
|
|
+++ b/drivers/gpu/drm/radeon/rs600.c
|
|
@@ -864,6 +864,12 @@ static int rs600_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
rs600_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -994,9 +1000,6 @@ int rs600_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
|
|
index f2c3b9d..c46900c 100644
|
|
--- a/drivers/gpu/drm/radeon/rs690.c
|
|
+++ b/drivers/gpu/drm/radeon/rs690.c
|
|
@@ -628,6 +628,12 @@ static int rs690_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
rs600_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -759,9 +765,6 @@ int rs690_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
|
|
index 43af363..0532bbe 100644
|
|
--- a/drivers/gpu/drm/radeon/rv515.c
|
|
+++ b/drivers/gpu/drm/radeon/rv515.c
|
|
@@ -386,6 +386,12 @@ static int rv515_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
rs600_irq_set(rdev);
|
|
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
|
/* 1M ring buffer */
|
|
@@ -520,9 +526,6 @@ int rv515_init(struct radeon_device *rdev)
|
|
r = radeon_fence_driver_init(rdev);
|
|
if (r)
|
|
return r;
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
/* Memory manager */
|
|
r = radeon_bo_init(rdev);
|
|
if (r)
|
|
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
|
|
index 591040b..4a3937f 100644
|
|
--- a/drivers/gpu/drm/radeon/rv770.c
|
|
+++ b/drivers/gpu/drm/radeon/rv770.c
|
|
@@ -1099,6 +1099,12 @@ static int rv770_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r = r600_irq_init(rdev);
|
|
if (r) {
|
|
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
|
@@ -1237,10 +1243,6 @@ int rv770_init(struct radeon_device *rdev)
|
|
if (r)
|
|
return r;
|
|
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
-
|
|
rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
|
|
r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
|
|
|
|
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
|
|
index 2dbd585..e22b460 100644
|
|
--- a/drivers/gpu/drm/radeon/si.c
|
|
+++ b/drivers/gpu/drm/radeon/si.c
|
|
@@ -3876,6 +3876,12 @@ static int si_startup(struct radeon_device *rdev)
|
|
}
|
|
|
|
/* Enable IRQ */
|
|
+ if (!rdev->irq.installed) {
|
|
+ r = radeon_irq_kms_init(rdev);
|
|
+ if (r)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
r = si_irq_init(rdev);
|
|
if (r) {
|
|
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
|
@@ -4044,10 +4050,6 @@ int si_init(struct radeon_device *rdev)
|
|
if (r)
|
|
return r;
|
|
|
|
- r = radeon_irq_kms_init(rdev);
|
|
- if (r)
|
|
- return r;
|
|
-
|
|
ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
|
|
ring->ring_obj = NULL;
|
|
r600_ring_init(rdev, ring, 1024 * 1024);
|
|
diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c
|
|
index 4394e7e..5653461 100644
|
|
--- a/drivers/hwmon/adm1021.c
|
|
+++ b/drivers/hwmon/adm1021.c
|
|
@@ -332,26 +332,68 @@ static int adm1021_detect(struct i2c_client *client,
|
|
man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID);
|
|
dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID);
|
|
|
|
+ if (man_id < 0 || dev_id < 0)
|
|
+ return -ENODEV;
|
|
+
|
|
if (man_id == 0x4d && dev_id == 0x01)
|
|
type_name = "max1617a";
|
|
else if (man_id == 0x41) {
|
|
if ((dev_id & 0xF0) == 0x30)
|
|
type_name = "adm1023";
|
|
- else
|
|
+ else if ((dev_id & 0xF0) == 0x00)
|
|
type_name = "adm1021";
|
|
+ else
|
|
+ return -ENODEV;
|
|
} else if (man_id == 0x49)
|
|
type_name = "thmc10";
|
|
else if (man_id == 0x23)
|
|
type_name = "gl523sm";
|
|
else if (man_id == 0x54)
|
|
type_name = "mc1066";
|
|
- /* LM84 Mfr ID in a different place, and it has more unused bits */
|
|
- else if (conv_rate == 0x00
|
|
- && (config & 0x7F) == 0x00
|
|
- && (status & 0xAB) == 0x00)
|
|
- type_name = "lm84";
|
|
- else
|
|
- type_name = "max1617";
|
|
+ else {
|
|
+ int lte, rte, lhi, rhi, llo, rlo;
|
|
+
|
|
+ /* extra checks for LM84 and MAX1617 to avoid misdetections */
|
|
+
|
|
+ llo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(0));
|
|
+ rlo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(1));
|
|
+
|
|
+ /* fail if any of the additional register reads failed */
|
|
+ if (llo < 0 || rlo < 0)
|
|
+ return -ENODEV;
|
|
+
|
|
+ lte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(0));
|
|
+ rte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(1));
|
|
+ lhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(0));
|
|
+ rhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(1));
|
|
+
|
|
+ /*
|
|
+ * Fail for negative temperatures and negative high limits.
|
|
+ * This check also catches read errors on the tested registers.
|
|
+ */
|
|
+ if ((s8)lte < 0 || (s8)rte < 0 || (s8)lhi < 0 || (s8)rhi < 0)
|
|
+ return -ENODEV;
|
|
+
|
|
+ /* fail if all registers hold the same value */
|
|
+ if (lte == rte && lte == lhi && lte == rhi && lte == llo
|
|
+ && lte == rlo)
|
|
+ return -ENODEV;
|
|
+
|
|
+ /*
|
|
+ * LM84 Mfr ID is in a different place,
|
|
+ * and it has more unused bits.
|
|
+ */
|
|
+ if (conv_rate == 0x00
|
|
+ && (config & 0x7F) == 0x00
|
|
+ && (status & 0xAB) == 0x00) {
|
|
+ type_name = "lm84";
|
|
+ } else {
|
|
+ /* fail if low limits are larger than high limits */
|
|
+ if ((s8)llo > lhi || (s8)rlo > rhi)
|
|
+ return -ENODEV;
|
|
+ type_name = "max1617";
|
|
+ }
|
|
+ }
|
|
|
|
pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n",
|
|
type_name, i2c_adapter_id(adapter), client->addr);
|
|
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
|
|
index 14d2d71..a60679c 100644
|
|
--- a/drivers/usb/host/ehci-sched.c
|
|
+++ b/drivers/usb/host/ehci-sched.c
|
|
@@ -236,7 +236,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask)
|
|
}
|
|
|
|
static const unsigned char
|
|
-max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 };
|
|
+max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 };
|
|
|
|
/* carryover low/fullspeed bandwidth that crosses uframe boundries */
|
|
static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8])
|
|
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
|
|
index f059222..5080b1d 100644
|
|
--- a/drivers/usb/host/xhci-mem.c
|
|
+++ b/drivers/usb/host/xhci-mem.c
|
|
@@ -1845,6 +1845,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|
}
|
|
spin_unlock_irqrestore(&xhci->lock, flags);
|
|
|
|
+ if (!xhci->rh_bw)
|
|
+ goto no_bw;
|
|
+
|
|
num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
|
|
for (i = 0; i < num_ports; i++) {
|
|
struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
|
|
@@ -1863,6 +1866,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|
}
|
|
}
|
|
|
|
+no_bw:
|
|
xhci->num_usb2_ports = 0;
|
|
xhci->num_usb3_ports = 0;
|
|
xhci->num_active_eps = 0;
|
|
@@ -2274,6 +2278,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|
u32 page_size, temp;
|
|
int i;
|
|
|
|
+ INIT_LIST_HEAD(&xhci->lpm_failed_devs);
|
|
+ INIT_LIST_HEAD(&xhci->cancel_cmd_list);
|
|
+
|
|
page_size = xhci_readl(xhci, &xhci->op_regs->page_size);
|
|
xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size);
|
|
for (i = 0; i < 16; i++) {
|
|
@@ -2352,7 +2359,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|
xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags);
|
|
if (!xhci->cmd_ring)
|
|
goto fail;
|
|
- INIT_LIST_HEAD(&xhci->cancel_cmd_list);
|
|
xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring);
|
|
xhci_dbg(xhci, "First segment DMA is 0x%llx\n",
|
|
(unsigned long long)xhci->cmd_ring->first_seg->dma);
|
|
@@ -2453,8 +2459,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|
if (xhci_setup_port_arrays(xhci, flags))
|
|
goto fail;
|
|
|
|
- INIT_LIST_HEAD(&xhci->lpm_failed_devs);
|
|
-
|
|
/* Enable USB 3.0 device notifications for function remote wake, which
|
|
* is necessary for allowing USB 3.0 devices to do remote wakeup from
|
|
* U3 (device suspend).
|
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
index ec2c89f..0f928b3 100644
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -947,6 +947,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
|
struct usb_hcd *secondary_hcd;
|
|
int retval = 0;
|
|
+ bool comp_timer_running = false;
|
|
|
|
/* Wait a bit if either of the roothubs need to settle from the
|
|
* transition into bus suspend.
|
|
@@ -984,6 +985,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
|
|
/* If restore operation fails, re-initialize the HC during resume */
|
|
if ((temp & STS_SRE) || hibernated) {
|
|
+
|
|
+ if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
|
|
+ !(xhci_all_ports_seen_u0(xhci))) {
|
|
+ del_timer_sync(&xhci->comp_mode_recovery_timer);
|
|
+ xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n");
|
|
+ }
|
|
+
|
|
/* Let the USB core know _both_ roothubs lost power. */
|
|
usb_root_hub_lost_power(xhci->main_hcd->self.root_hub);
|
|
usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub);
|
|
@@ -1026,6 +1034,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
retval = xhci_init(hcd->primary_hcd);
|
|
if (retval)
|
|
return retval;
|
|
+ comp_timer_running = true;
|
|
+
|
|
xhci_dbg(xhci, "Start the primary HCD\n");
|
|
retval = xhci_run(hcd->primary_hcd);
|
|
if (!retval) {
|
|
@@ -1067,7 +1077,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|
* to suffer the Compliance Mode issue again. It doesn't matter if
|
|
* ports have entered previously to U0 before system's suspension.
|
|
*/
|
|
- if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
|
|
+ if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running)
|
|
compliance_mode_recovery_timer_init(xhci);
|
|
|
|
/* Re-enable port polling. */
|
|
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c
|
|
index f99f471..31bfe60 100644
|
|
--- a/drivers/usb/serial/ark3116.c
|
|
+++ b/drivers/usb/serial/ark3116.c
|
|
@@ -49,7 +49,7 @@ static bool debug;
|
|
#define DRIVER_NAME "ark3116"
|
|
|
|
/* usb timeout of 1 second */
|
|
-#define ARK_TIMEOUT (1*HZ)
|
|
+#define ARK_TIMEOUT 1000
|
|
|
|
static const struct usb_device_id id_table[] = {
|
|
{ USB_DEVICE(0x6547, 0x0232) },
|
|
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
|
|
index afc886c..270bda8 100644
|
|
--- a/drivers/usb/serial/cypress_m8.c
|
|
+++ b/drivers/usb/serial/cypress_m8.c
|
|
@@ -70,6 +70,7 @@ static const struct usb_device_id id_table_earthmate[] = {
|
|
static const struct usb_device_id id_table_cyphidcomrs232[] = {
|
|
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
|
|
{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
|
|
+ { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
|
|
{ } /* Terminating entry */
|
|
};
|
|
|
|
@@ -83,6 +84,7 @@ static const struct usb_device_id id_table_combined[] = {
|
|
{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
|
|
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
|
|
{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
|
|
+ { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
|
|
{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },
|
|
{ } /* Terminating entry */
|
|
};
|
|
@@ -243,6 +245,12 @@ static struct usb_serial_driver * const serial_drivers[] = {
|
|
* Cypress serial helper functions
|
|
*****************************************************************************/
|
|
|
|
+/* FRWD Dongle hidcom needs to skip reset and speed checks */
|
|
+static inline bool is_frwd(struct usb_device *dev)
|
|
+{
|
|
+ return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) &&
|
|
+ (le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD));
|
|
+}
|
|
|
|
static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
|
|
{
|
|
@@ -252,6 +260,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
|
|
if (unstable_bauds)
|
|
return new_rate;
|
|
|
|
+ /* FRWD Dongle uses 115200 bps */
|
|
+ if (is_frwd(port->serial->dev))
|
|
+ return new_rate;
|
|
+
|
|
/*
|
|
* The general purpose firmware for the Cypress M8 allows for
|
|
* a maximum speed of 57600bps (I have no idea whether DeLorme
|
|
@@ -465,7 +477,11 @@ static int generic_startup(struct usb_serial *serial)
|
|
}
|
|
init_waitqueue_head(&priv->delta_msr_wait);
|
|
|
|
- usb_reset_configuration(serial->dev);
|
|
+ /* Skip reset for FRWD device. It is a workaound:
|
|
+ device hangs if it receives SET_CONFIGURE in Configured
|
|
+ state. */
|
|
+ if (!is_frwd(serial->dev))
|
|
+ usb_reset_configuration(serial->dev);
|
|
|
|
priv->cmd_ctrl = 0;
|
|
priv->line_control = 0;
|
|
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h
|
|
index 67cf608..b461311 100644
|
|
--- a/drivers/usb/serial/cypress_m8.h
|
|
+++ b/drivers/usb/serial/cypress_m8.h
|
|
@@ -24,6 +24,10 @@
|
|
#define VENDOR_ID_CYPRESS 0x04b4
|
|
#define PRODUCT_ID_CYPHIDCOM 0x5500
|
|
|
|
+/* FRWD Dongle - a GPS sports watch */
|
|
+#define VENDOR_ID_FRWD 0x6737
|
|
+#define PRODUCT_ID_CYPHIDCOM_FRWD 0x0001
|
|
+
|
|
/* Powercom UPS, chip CY7C63723 */
|
|
#define VENDOR_ID_POWERCOM 0x0d9f
|
|
#define PRODUCT_ID_UPS 0x0002
|
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
|
index c6f8e62..f8a9cd7 100644
|
|
--- a/drivers/usb/serial/ftdi_sio.c
|
|
+++ b/drivers/usb/serial/ftdi_sio.c
|
|
@@ -2173,7 +2173,7 @@ static void ftdi_set_termios(struct tty_struct *tty,
|
|
|
|
cflag = termios->c_cflag;
|
|
|
|
- if (old_termios == 0)
|
|
+ if (!old_termios)
|
|
goto no_skip;
|
|
|
|
if (old_termios->c_cflag == termios->c_cflag
|
|
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
|
|
index f2192d5..53c639c 100644
|
|
--- a/drivers/usb/serial/iuu_phoenix.c
|
|
+++ b/drivers/usb/serial/iuu_phoenix.c
|
|
@@ -326,7 +326,7 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
|
|
usb_bulk_msg(serial->dev,
|
|
usb_sndbulkpipe(serial->dev,
|
|
port->bulk_out_endpointAddress), buf,
|
|
- count, &actual, HZ * 1);
|
|
+ count, &actual, 1000);
|
|
|
|
if (status != IUU_OPERATION_OK)
|
|
dbg("%s - error = %2x", __func__, status);
|
|
@@ -349,7 +349,7 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count)
|
|
usb_bulk_msg(serial->dev,
|
|
usb_rcvbulkpipe(serial->dev,
|
|
port->bulk_in_endpointAddress), buf,
|
|
- count, &actual, HZ * 1);
|
|
+ count, &actual, 1000);
|
|
|
|
if (status != IUU_OPERATION_OK)
|
|
dbg("%s - error = %2x", __func__, status);
|
|
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
|
|
index a39ddd1..253bff6 100644
|
|
--- a/drivers/usb/serial/keyspan.c
|
|
+++ b/drivers/usb/serial/keyspan.c
|
|
@@ -1705,7 +1705,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
|
|
d_details = s_priv->device_details;
|
|
device_port = port->number - port->serial->minor;
|
|
|
|
- outcont_urb = d_details->outcont_endpoints[port->number];
|
|
+ outcont_urb = d_details->outcont_endpoints[device_port];
|
|
this_urb = p_priv->outcont_urb;
|
|
|
|
dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe));
|
|
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
|
|
index bdce820..77d974d 100644
|
|
--- a/drivers/usb/serial/mos7720.c
|
|
+++ b/drivers/usb/serial/mos7720.c
|
|
@@ -44,7 +44,7 @@
|
|
#define DRIVER_DESC "Moschip USB Serial Driver"
|
|
|
|
/* default urb timeout */
|
|
-#define MOS_WDR_TIMEOUT (HZ * 5)
|
|
+#define MOS_WDR_TIMEOUT 5000
|
|
|
|
#define MOS_MAX_PORT 0x02
|
|
#define MOS_WRITE 0x0E
|
|
@@ -234,11 +234,22 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,
|
|
__u8 requesttype = (__u8)0xc0;
|
|
__u16 index = get_reg_index(reg);
|
|
__u16 value = get_reg_value(reg, serial_portnum);
|
|
- int status = usb_control_msg(usbdev, pipe, request, requesttype, value,
|
|
- index, data, 1, MOS_WDR_TIMEOUT);
|
|
- if (status < 0)
|
|
+ u8 *buf;
|
|
+ int status;
|
|
+
|
|
+ buf = kmalloc(1, GFP_KERNEL);
|
|
+ if (!buf)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ status = usb_control_msg(usbdev, pipe, request, requesttype, value,
|
|
+ index, buf, 1, MOS_WDR_TIMEOUT);
|
|
+ if (status == 1)
|
|
+ *data = *buf;
|
|
+ else if (status < 0)
|
|
dev_err(&usbdev->dev,
|
|
"mos7720: usb_control_msg() failed: %d", status);
|
|
+ kfree(buf);
|
|
+
|
|
return status;
|
|
}
|
|
|
|
@@ -1690,7 +1701,7 @@ static void change_port_settings(struct tty_struct *tty,
|
|
mos7720_port->shadowMCR |= (UART_MCR_XONANY);
|
|
/* To set hardware flow control to the specified *
|
|
* serial port, in SP1/2_CONTROL_REG */
|
|
- if (port->number)
|
|
+ if (port_number)
|
|
write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01);
|
|
else
|
|
write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02);
|
|
@@ -2094,7 +2105,7 @@ static int mos7720_startup(struct usb_serial *serial)
|
|
|
|
/* setting configuration feature to one */
|
|
usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
|
|
- (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ);
|
|
+ (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);
|
|
|
|
/* start the interrupt urb */
|
|
ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL);
|
|
@@ -2139,7 +2150,7 @@ static void mos7720_release(struct usb_serial *serial)
|
|
/* wait for synchronous usb calls to return */
|
|
if (mos_parport->msg_pending)
|
|
wait_for_completion_timeout(&mos_parport->syncmsg_compl,
|
|
- MOS_WDR_TIMEOUT);
|
|
+ msecs_to_jiffies(MOS_WDR_TIMEOUT));
|
|
|
|
parport_remove_port(mos_parport->pp);
|
|
usb_set_serial_data(serial, NULL);
|
|
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
|
|
index 386b3ab..5b24260 100644
|
|
--- a/drivers/usb/serial/option.c
|
|
+++ b/drivers/usb/serial/option.c
|
|
@@ -593,6 +593,8 @@ static const struct usb_device_id option_ids[] = {
|
|
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff),
|
|
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff), /* Huawei E1820 */
|
|
+ .driver_info = (kernel_ulong_t) &net_intf1_blacklist },
|
|
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),
|
|
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) },
|
|
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
|
|
index 71d6964..b3afd19 100644
|
|
--- a/drivers/usb/serial/visor.c
|
|
+++ b/drivers/usb/serial/visor.c
|
|
@@ -596,10 +596,19 @@ static int treo_attach(struct usb_serial *serial)
|
|
*/
|
|
#define COPY_PORT(dest, src) \
|
|
do { \
|
|
+ int i; \
|
|
+ \
|
|
+ for (i = 0; i < ARRAY_SIZE(src->read_urbs); ++i) { \
|
|
+ dest->read_urbs[i] = src->read_urbs[i]; \
|
|
+ dest->read_urbs[i]->context = dest; \
|
|
+ dest->bulk_in_buffers[i] = src->bulk_in_buffers[i]; \
|
|
+ } \
|
|
dest->read_urb = src->read_urb; \
|
|
dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\
|
|
dest->bulk_in_buffer = src->bulk_in_buffer; \
|
|
+ dest->bulk_in_size = src->bulk_in_size; \
|
|
dest->interrupt_in_urb = src->interrupt_in_urb; \
|
|
+ dest->interrupt_in_urb->context = dest; \
|
|
dest->interrupt_in_endpointAddress = \
|
|
src->interrupt_in_endpointAddress;\
|
|
dest->interrupt_in_buffer = src->interrupt_in_buffer; \
|
|
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
|
|
index 171226a..0d06d7c 100644
|
|
--- a/drivers/usb/serial/whiteheat.c
|
|
+++ b/drivers/usb/serial/whiteheat.c
|
|
@@ -1154,7 +1154,7 @@ static void firm_setup_port(struct tty_struct *tty)
|
|
struct whiteheat_port_settings port_settings;
|
|
unsigned int cflag = tty->termios->c_cflag;
|
|
|
|
- port_settings.port = port->number + 1;
|
|
+ port_settings.port = port->number - port->serial->minor + 1;
|
|
|
|
/* get the byte size */
|
|
switch (cflag & CSIZE) {
|
|
diff --git a/drivers/xen/xen-pciback/pciback_ops.c b/drivers/xen/xen-pciback/pciback_ops.c
|
|
index b6df20a..d52703c 100644
|
|
--- a/drivers/xen/xen-pciback/pciback_ops.c
|
|
+++ b/drivers/xen/xen-pciback/pciback_ops.c
|
|
@@ -9,6 +9,8 @@
|
|
#include <xen/events.h>
|
|
#include <linux/sched.h>
|
|
#include "pciback.h"
|
|
+#include <linux/ratelimit.h>
|
|
+#include <linux/printk.h>
|
|
|
|
int verbose_request;
|
|
module_param(verbose_request, int, 0644);
|
|
@@ -136,7 +138,6 @@ int xen_pcibk_enable_msi(struct xen_pcibk_device *pdev,
|
|
struct pci_dev *dev, struct xen_pci_op *op)
|
|
{
|
|
struct xen_pcibk_dev_data *dev_data;
|
|
- int otherend = pdev->xdev->otherend_id;
|
|
int status;
|
|
|
|
if (unlikely(verbose_request))
|
|
@@ -145,8 +146,9 @@ int xen_pcibk_enable_msi(struct xen_pcibk_device *pdev,
|
|
status = pci_enable_msi(dev);
|
|
|
|
if (status) {
|
|
- printk(KERN_ERR "error enable msi for guest %x status %x\n",
|
|
- otherend, status);
|
|
+ pr_warn_ratelimited(DRV_NAME ": %s: error enabling MSI for guest %u: err %d\n",
|
|
+ pci_name(dev), pdev->xdev->otherend_id,
|
|
+ status);
|
|
op->value = 0;
|
|
return XEN_PCI_ERR_op_failed;
|
|
}
|
|
@@ -224,10 +226,10 @@ int xen_pcibk_enable_msix(struct xen_pcibk_device *pdev,
|
|
pci_name(dev), i,
|
|
op->msix_entries[i].vector);
|
|
}
|
|
- } else {
|
|
- printk(KERN_WARNING DRV_NAME ": %s: failed to enable MSI-X: err %d!\n",
|
|
- pci_name(dev), result);
|
|
- }
|
|
+ } else
|
|
+ pr_warn_ratelimited(DRV_NAME ": %s: error enabling MSI-X for guest %u: err %d!\n",
|
|
+ pci_name(dev), pdev->xdev->otherend_id,
|
|
+ result);
|
|
kfree(entries);
|
|
|
|
op->value = result;
|
|
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
|
|
index 72a6cab..f80ca4a 100644
|
|
--- a/include/linux/ftrace.h
|
|
+++ b/include/linux/ftrace.h
|
|
@@ -299,7 +299,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf,
|
|
size_t cnt, loff_t *ppos);
|
|
ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,
|
|
size_t cnt, loff_t *ppos);
|
|
-loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int origin);
|
|
int ftrace_regex_release(struct inode *inode, struct file *file);
|
|
|
|
void __init
|
|
@@ -420,6 +419,8 @@ static inline int
|
|
ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
|
|
#endif /* CONFIG_DYNAMIC_FTRACE */
|
|
|
|
+loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence);
|
|
+
|
|
/* totally disable ftrace - can not re-enable after this */
|
|
void ftrace_kill(void);
|
|
|
|
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
|
|
index c962d31..e101cf9 100644
|
|
--- a/kernel/trace/ftrace.c
|
|
+++ b/kernel/trace/ftrace.c
|
|
@@ -999,6 +999,19 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer)
|
|
|
|
static struct pid * const ftrace_swapper_pid = &init_struct_pid;
|
|
|
|
+loff_t
|
|
+ftrace_filter_lseek(struct file *file, loff_t offset, int whence)
|
|
+{
|
|
+ loff_t ret;
|
|
+
|
|
+ if (file->f_mode & FMODE_READ)
|
|
+ ret = seq_lseek(file, offset, whence);
|
|
+ else
|
|
+ file->f_pos = ret = 1;
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
|
|
#ifndef CONFIG_FTRACE_MCOUNT_RECORD
|
|
@@ -2541,7 +2554,7 @@ static void ftrace_filter_reset(struct ftrace_hash *hash)
|
|
* routine, you can use ftrace_filter_write() for the write
|
|
* routine if @flag has FTRACE_ITER_FILTER set, or
|
|
* ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set.
|
|
- * ftrace_regex_lseek() should be used as the lseek routine, and
|
|
+ * ftrace_filter_lseek() should be used as the lseek routine, and
|
|
* release must call ftrace_regex_release().
|
|
*/
|
|
int
|
|
@@ -2625,19 +2638,6 @@ ftrace_notrace_open(struct inode *inode, struct file *file)
|
|
inode, file);
|
|
}
|
|
|
|
-loff_t
|
|
-ftrace_regex_lseek(struct file *file, loff_t offset, int origin)
|
|
-{
|
|
- loff_t ret;
|
|
-
|
|
- if (file->f_mode & FMODE_READ)
|
|
- ret = seq_lseek(file, offset, origin);
|
|
- else
|
|
- file->f_pos = ret = 1;
|
|
-
|
|
- return ret;
|
|
-}
|
|
-
|
|
static int ftrace_match(char *str, char *regex, int len, int type)
|
|
{
|
|
int matched = 0;
|
|
@@ -3445,7 +3445,7 @@ static const struct file_operations ftrace_filter_fops = {
|
|
.open = ftrace_filter_open,
|
|
.read = seq_read,
|
|
.write = ftrace_filter_write,
|
|
- .llseek = ftrace_regex_lseek,
|
|
+ .llseek = ftrace_filter_lseek,
|
|
.release = ftrace_regex_release,
|
|
};
|
|
|
|
@@ -3453,7 +3453,7 @@ static const struct file_operations ftrace_notrace_fops = {
|
|
.open = ftrace_notrace_open,
|
|
.read = seq_read,
|
|
.write = ftrace_notrace_write,
|
|
- .llseek = ftrace_regex_lseek,
|
|
+ .llseek = ftrace_filter_lseek,
|
|
.release = ftrace_regex_release,
|
|
};
|
|
|
|
@@ -3659,8 +3659,8 @@ static const struct file_operations ftrace_graph_fops = {
|
|
.open = ftrace_graph_open,
|
|
.read = seq_read,
|
|
.write = ftrace_graph_write,
|
|
+ .llseek = ftrace_filter_lseek,
|
|
.release = ftrace_graph_release,
|
|
- .llseek = seq_lseek,
|
|
};
|
|
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
|
|
|
@@ -4261,7 +4261,7 @@ static const struct file_operations ftrace_pid_fops = {
|
|
.open = ftrace_pid_open,
|
|
.write = ftrace_pid_write,
|
|
.read = seq_read,
|
|
- .llseek = seq_lseek,
|
|
+ .llseek = ftrace_filter_lseek,
|
|
.release = ftrace_pid_release,
|
|
};
|
|
|
|
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
|
|
index c70f6bf..8298997 100644
|
|
--- a/kernel/trace/trace_stack.c
|
|
+++ b/kernel/trace/trace_stack.c
|
|
@@ -384,7 +384,7 @@ static const struct file_operations stack_trace_filter_fops = {
|
|
.open = stack_trace_filter_open,
|
|
.read = seq_read,
|
|
.write = ftrace_filter_write,
|
|
- .llseek = ftrace_regex_lseek,
|
|
+ .llseek = ftrace_filter_lseek,
|
|
.release = ftrace_regex_release,
|
|
};
|
|
|
|
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
|
index f008fc7..e075a67 100644
|
|
--- a/sound/usb/mixer.c
|
|
+++ b/sound/usb/mixer.c
|
|
@@ -822,6 +822,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
|
case USB_ID(0x046d, 0x0808):
|
|
case USB_ID(0x046d, 0x0809):
|
|
case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
|
|
+ case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
|
|
case USB_ID(0x046d, 0x0991):
|
|
/* Most audio usb devices lie about volume resolution.
|
|
* Most Logitech webcams have res = 384.
|
|
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
|
|
index fa4c2f7..915bc2c 100644
|
|
--- a/sound/usb/quirks-table.h
|
|
+++ b/sound/usb/quirks-table.h
|
|
@@ -157,7 +157,13 @@
|
|
.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
|
|
},
|
|
{
|
|
- USB_DEVICE(0x046d, 0x0990),
|
|
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|
|
+ USB_DEVICE_ID_MATCH_INT_CLASS |
|
|
+ USB_DEVICE_ID_MATCH_INT_SUBCLASS,
|
|
+ .idVendor = 0x046d,
|
|
+ .idProduct = 0x0990,
|
|
+ .bInterfaceClass = USB_CLASS_AUDIO,
|
|
+ .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,
|
|
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
|
.vendor_name = "Logitech, Inc.",
|
|
.product_name = "QuickCam Pro 9000",
|
|
@@ -1622,7 +1628,11 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
|
USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108),
|
|
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
|
.ifnum = 0,
|
|
- .type = QUIRK_MIDI_STANDARD_INTERFACE
|
|
+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
|
|
+ .data = & (const struct snd_usb_midi_endpoint_info) {
|
|
+ .out_cables = 0x0007,
|
|
+ .in_cables = 0x0007
|
|
+ }
|
|
}
|
|
},
|
|
{
|