aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-5000.c
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2010-03-01 20:23:50 -0500
committerReinette Chatre <reinette.chatre@intel.com>2010-03-19 16:41:25 -0400
commitb74e31a9bc1013e69b85b139072485dc153453dd (patch)
treecf3fa8db0a9a5d58d9bc633c5fe7b8e641d28d43 /drivers/net/wireless/iwlwifi/iwl-5000.c
parentc11362c01b280f8b2c728bc64793d484282b8734 (diff)
iwlwifi: Recover TX flow stall due to stuck queue
Monitors the internal TX queues periodically. When a queue is stuck for some unknown conditions causing the throughput to drop and the transfer is stop, the driver will force firmware reload and bring the system back to normal operational state. The iwlwifi devices behave differently in this regard so this feature is made part of the ops infrastructure so we can have more control on how to monitor and recover from tx queue stall case per device. Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-5000.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index 8ab28a760157..a01b3c59a5a7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -1499,6 +1499,7 @@ struct iwl_lib_ops iwl5000_lib = {
1499 .set_ct_kill = iwl5000_set_ct_threshold, 1499 .set_ct_kill = iwl5000_set_ct_threshold,
1500 }, 1500 },
1501 .add_bcast_station = iwl_add_bcast_station, 1501 .add_bcast_station = iwl_add_bcast_station,
1502 .recover_from_tx_stall = iwl_bg_monitor_recover,
1502}; 1503};
1503 1504
1504static struct iwl_lib_ops iwl5150_lib = { 1505static struct iwl_lib_ops iwl5150_lib = {
@@ -1553,6 +1554,7 @@ static struct iwl_lib_ops iwl5150_lib = {
1553 .set_ct_kill = iwl5150_set_ct_threshold, 1554 .set_ct_kill = iwl5150_set_ct_threshold,
1554 }, 1555 },
1555 .add_bcast_station = iwl_add_bcast_station, 1556 .add_bcast_station = iwl_add_bcast_station,
1557 .recover_from_tx_stall = iwl_bg_monitor_recover,
1556}; 1558};
1557 1559
1558static const struct iwl_ops iwl5000_ops = { 1560static const struct iwl_ops iwl5000_ops = {
@@ -1602,6 +1604,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
1602 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1604 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1603 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1605 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1604 .chain_noise_scale = 1000, 1606 .chain_noise_scale = 1000,
1607 .monitor_recover_period = IWL_MONITORING_PERIOD,
1605}; 1608};
1606 1609
1607struct iwl_cfg iwl5100_bgn_cfg = { 1610struct iwl_cfg iwl5100_bgn_cfg = {
@@ -1628,6 +1631,7 @@ struct iwl_cfg iwl5100_bgn_cfg = {
1628 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1631 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1629 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1632 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1630 .chain_noise_scale = 1000, 1633 .chain_noise_scale = 1000,
1634 .monitor_recover_period = IWL_MONITORING_PERIOD,
1631}; 1635};
1632 1636
1633struct iwl_cfg iwl5100_abg_cfg = { 1637struct iwl_cfg iwl5100_abg_cfg = {
@@ -1652,6 +1656,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
1652 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1656 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1653 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1657 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1654 .chain_noise_scale = 1000, 1658 .chain_noise_scale = 1000,
1659 .monitor_recover_period = IWL_MONITORING_PERIOD,
1655}; 1660};
1656 1661
1657struct iwl_cfg iwl5100_agn_cfg = { 1662struct iwl_cfg iwl5100_agn_cfg = {
@@ -1678,6 +1683,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
1678 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1683 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1679 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1684 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1680 .chain_noise_scale = 1000, 1685 .chain_noise_scale = 1000,
1686 .monitor_recover_period = IWL_MONITORING_PERIOD,
1681}; 1687};
1682 1688
1683struct iwl_cfg iwl5350_agn_cfg = { 1689struct iwl_cfg iwl5350_agn_cfg = {
@@ -1704,6 +1710,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
1704 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1710 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1705 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1711 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1706 .chain_noise_scale = 1000, 1712 .chain_noise_scale = 1000,
1713 .monitor_recover_period = IWL_MONITORING_PERIOD,
1707}; 1714};
1708 1715
1709struct iwl_cfg iwl5150_agn_cfg = { 1716struct iwl_cfg iwl5150_agn_cfg = {
@@ -1730,6 +1737,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
1730 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1737 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1731 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1738 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1732 .chain_noise_scale = 1000, 1739 .chain_noise_scale = 1000,
1740 .monitor_recover_period = IWL_MONITORING_PERIOD,
1733}; 1741};
1734 1742
1735struct iwl_cfg iwl5150_abg_cfg = { 1743struct iwl_cfg iwl5150_abg_cfg = {
@@ -1754,6 +1762,7 @@ struct iwl_cfg iwl5150_abg_cfg = {
1754 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, 1762 .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
1755 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF, 1763 .plcp_delta_threshold = IWL_MAX_PLCP_ERR_LONG_THRESHOLD_DEF,
1756 .chain_noise_scale = 1000, 1764 .chain_noise_scale = 1000,
1765 .monitor_recover_period = IWL_MONITORING_PERIOD,
1757}; 1766};
1758 1767
1759MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); 1768MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));