--- /dev/null
+From c36b58e8a9112017c2bcc322cc98e71241814303 Mon Sep 17 00:00:00 2001
+From: Igor Mammedov <imammedo@redhat.com>
+Date: Mon, 18 Apr 2011 10:17:17 -0700
+Subject: Input: xen-kbdfront - fix mouse getting stuck after save/restore
+
+From: Igor Mammedov <imammedo@redhat.com>
+
+commit c36b58e8a9112017c2bcc322cc98e71241814303 upstream.
+
+Mouse gets "stuck" after restore of PV guest but buttons are in working
+condition.
+
+If driver has been configured for ABS coordinates at start it will get
+XENKBD_TYPE_POS events and then suddenly after restore it'll start getting
+XENKBD_TYPE_MOTION events, that will be dropped later and they won't get
+into user-space.
+
+Regression was introduced by hunk 5 and 6 of
+5ea5254aa0ad269cfbd2875c973ef25ab5b5e9db
+("Input: xen-kbdfront - advertise either absolute or relative
+coordinates").
+
+Driver on restore should ask xen for request-abs-pointer again if it is
+available. So restore parts that did it before 5ea5254.
+
+Acked-by: Olaf Hering <olaf@aepfle.de>
+Signed-off-by: Igor Mammedov <imammedo@redhat.com>
+[v1: Expanded the commit description]
+Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+
+---
+ drivers/input/xen-kbdfront.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+--- a/drivers/input/xen-kbdfront.c
++++ b/drivers/input/xen-kbdfront.c
+@@ -286,7 +286,7 @@ static void xenkbd_backend_changed(struc
+ enum xenbus_state backend_state)
+ {
+ struct xenkbd_info *info = dev_get_drvdata(&dev->dev);
+- int val;
++ int ret, val;
+
+ switch (backend_state) {
+ case XenbusStateInitialising:
+@@ -299,6 +299,16 @@ static void xenkbd_backend_changed(struc
+
+ case XenbusStateInitWait:
+ InitWait:
++ ret = xenbus_scanf(XBT_NIL, info->xbdev->otherend,
++ "feature-abs-pointer", "%d", &val);
++ if (ret < 0)
++ val = 0;
++ if (val) {
++ ret = xenbus_printf(XBT_NIL, info->xbdev->nodename,
++ "request-abs-pointer", "1");
++ if (ret)
++ pr_warning("can't request abs-pointer\n");
++ }
+ xenbus_switch_state(dev, XenbusStateConnected);
+ break;
+
--- /dev/null
+From 0263aa45293838b514b8af674a03faf040991a90 Mon Sep 17 00:00:00 2001
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+Date: Tue, 29 Mar 2011 11:24:21 +0200
+Subject: iwl3945: disable hw scan by default
+
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+
+commit 0263aa45293838b514b8af674a03faf040991a90 upstream.
+
+After new NetworkManager 0.8.996 changes, hardware scanning is causing
+microcode errors as reported here:
+https://bugzilla.redhat.com/show_bug.cgi?id=683571
+and sometimes kernel crashes:
+https://bugzilla.redhat.com/show_bug.cgi?id=688252
+
+Also with hw scan there are very bad performance on some systems
+as reported here:
+https://bugzilla.redhat.com/show_bug.cgi?id=671366
+
+Since Intel no longer supports 3945, there is no chance to get proper
+firmware fixes, we need workaround problems by disable hardware scanning
+by default.
+
+Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl3945-base.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -94,6 +94,7 @@ MODULE_LICENSE("GPL");
+ struct iwl_mod_params iwl3945_mod_params = {
+ .sw_crypto = 1,
+ .restart_fw = 1,
++ .disable_hw_scan = 1,
+ /* the rest are 0 by default */
+ };
+
+@@ -4317,7 +4318,7 @@ MODULE_PARM_DESC(debug, "debug output ma
+ #endif
+ module_param_named(disable_hw_scan, iwl3945_mod_params.disable_hw_scan,
+ int, S_IRUGO);
+-MODULE_PARM_DESC(disable_hw_scan, "disable hardware scanning (default 0)");
++MODULE_PARM_DESC(disable_hw_scan, "disable hardware scanning (default 1)");
+ module_param_named(fw_restart3945, iwl3945_mod_params.restart_fw, int, S_IRUGO);
+ MODULE_PARM_DESC(fw_restart3945, "restart firmware in case of error");
+
--- /dev/null
+From 332704a51498a7e29aa92c19dc03f11f80b71bfe Mon Sep 17 00:00:00 2001
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+Date: Wed, 13 Apr 2011 10:56:51 +0200
+Subject: iwlegacy: fix tx_power initialization
+
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+
+commit 332704a51498a7e29aa92c19dc03f11f80b71bfe upstream.
+
+priv->tx_power_next is not initialized to max supported power,
+but instead default value is used, what cause errors like
+
+[ 58.597834] iwl3945 0000:03:00.0: Requested user TXPOWER 15 above upper limit 14.
+[ 58.597839] iwl3945 0000:03:00.0: Error setting Tx power (-22).
+
+if maximum tx power read from the eeprom is smaller than default.
+In consequence card is unable to initialize properly. Fix the problem
+and cleanup tx power initialization.
+
+Reported-and-tested-by: Robin Dong <hao.bigrat@gmail.com>
+Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-3945-hw.h | 2 --
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 6 ------
+ drivers/net/wireless/iwlwifi/iwl-core.c | 9 +++++++--
+ drivers/net/wireless/iwlwifi/iwl-eeprom.c | 7 -------
+ drivers/net/wireless/iwlwifi/iwl3945-base.c | 4 ----
+ 5 files changed, 7 insertions(+), 21 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h
++++ b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h
+@@ -74,8 +74,6 @@
+ /* RSSI to dBm */
+ #define IWL39_RSSI_OFFSET 95
+
+-#define IWL_DEFAULT_TX_POWER 0x0F
+-
+ /*
+ * EEPROM related constants, enums, and structures.
+ */
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -3841,12 +3841,6 @@ static int iwl_init_drv(struct iwl_priv
+ priv->dynamic_frag_thresh = BT_FRAG_THRESHOLD_DEF;
+ }
+
+- /* Set the tx_power_user_lmt to the lowest power level
+- * this value will get overwritten by channel max power avg
+- * from eeprom */
+- priv->tx_power_user_lmt = IWLAGN_TX_POWER_TARGET_POWER_MIN;
+- priv->tx_power_next = IWLAGN_TX_POWER_TARGET_POWER_MIN;
+-
+ ret = iwl_init_channel_map(priv);
+ if (ret) {
+ IWL_ERR(priv, "initializing regulatory failed: %d\n", ret);
+--- a/drivers/net/wireless/iwlwifi/iwl-core.c
++++ b/drivers/net/wireless/iwlwifi/iwl-core.c
+@@ -168,6 +168,7 @@ int iwlcore_init_geos(struct iwl_priv *p
+ struct ieee80211_channel *geo_ch;
+ struct ieee80211_rate *rates;
+ int i = 0;
++ s8 max_tx_power = 0;
+
+ if (priv->bands[IEEE80211_BAND_2GHZ].n_bitrates ||
+ priv->bands[IEEE80211_BAND_5GHZ].n_bitrates) {
+@@ -244,8 +245,8 @@ int iwlcore_init_geos(struct iwl_priv *p
+
+ geo_ch->flags |= ch->ht40_extension_channel;
+
+- if (ch->max_power_avg > priv->tx_power_device_lmt)
+- priv->tx_power_device_lmt = ch->max_power_avg;
++ if (ch->max_power_avg > max_tx_power)
++ max_tx_power = ch->max_power_avg;
+ } else {
+ geo_ch->flags |= IEEE80211_CHAN_DISABLED;
+ }
+@@ -258,6 +259,10 @@ int iwlcore_init_geos(struct iwl_priv *p
+ geo_ch->flags);
+ }
+
++ priv->tx_power_device_lmt = max_tx_power;
++ priv->tx_power_user_lmt = max_tx_power;
++ priv->tx_power_next = max_tx_power;
++
+ if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) &&
+ priv->cfg->sku & IWL_SKU_A) {
+ IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
+--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
++++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+@@ -724,13 +724,6 @@ int iwl_init_channel_map(struct iwl_priv
+ flags & EEPROM_CHANNEL_RADAR))
+ ? "" : "not ");
+
+- /* Set the tx_power_user_lmt to the highest power
+- * supported by any channel */
+- if (eeprom_ch_info[ch].max_power_avg >
+- priv->tx_power_user_lmt)
+- priv->tx_power_user_lmt =
+- eeprom_ch_info[ch].max_power_avg;
+-
+ ch_info++;
+ }
+ }
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -3859,10 +3859,6 @@ static int iwl3945_init_drv(struct iwl_p
+ priv->force_reset[IWL_FW_RESET].reset_duration =
+ IWL_DELAY_NEXT_FORCE_FW_RELOAD;
+
+-
+- priv->tx_power_user_lmt = IWL_DEFAULT_TX_POWER;
+- priv->tx_power_next = IWL_DEFAULT_TX_POWER;
+-
+ if (eeprom->version < EEPROM_3945_EEPROM_VERSION) {
+ IWL_WARN(priv, "Unsupported EEPROM version: 0x%04X\n",
+ eeprom->version);