diff options
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-power.c | 27 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-power.h | 31 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 63 |
3 files changed, 58 insertions, 63 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c index e3c71beb01ef..028e3053c0ca 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.c +++ b/drivers/net/wireless/iwlwifi/iwl-power.c | |||
| @@ -82,7 +82,7 @@ | |||
| 82 | 82 | ||
| 83 | /* default power management (not Tx power) table values */ | 83 | /* default power management (not Tx power) table values */ |
| 84 | /* for tim 0-10 */ | 84 | /* for tim 0-10 */ |
| 85 | static struct iwl_power_vec_entry range_0[IWL_POWER_AC] = { | 85 | static struct iwl_power_vec_entry range_0[IWL_POWER_MAX] = { |
| 86 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, | 86 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, |
| 87 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, | 87 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, |
| 88 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, | 88 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0}, |
| @@ -93,7 +93,7 @@ static struct iwl_power_vec_entry range_0[IWL_POWER_AC] = { | |||
| 93 | 93 | ||
| 94 | 94 | ||
| 95 | /* for tim = 3-10 */ | 95 | /* for tim = 3-10 */ |
| 96 | static struct iwl_power_vec_entry range_1[IWL_POWER_AC] = { | 96 | static struct iwl_power_vec_entry range_1[IWL_POWER_MAX] = { |
| 97 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, | 97 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, |
| 98 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 4)}, 0}, | 98 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 4)}, 0}, |
| 99 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 3, 4, 7)}, 0}, | 99 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 3, 4, 7)}, 0}, |
| @@ -103,7 +103,7 @@ static struct iwl_power_vec_entry range_1[IWL_POWER_AC] = { | |||
| 103 | }; | 103 | }; |
| 104 | 104 | ||
| 105 | /* for tim > 11 */ | 105 | /* for tim > 11 */ |
| 106 | static struct iwl_power_vec_entry range_2[IWL_POWER_AC] = { | 106 | static struct iwl_power_vec_entry range_2[IWL_POWER_MAX] = { |
| 107 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, | 107 | {{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0}, |
| 108 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 0xFF)}, 0}, | 108 | {{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 0xFF)}, 0}, |
| 109 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(2, 4, 6, 7, 0xFF)}, 0}, | 109 | {{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(2, 4, 6, 7, 0xFF)}, 0}, |
| @@ -124,7 +124,7 @@ static int iwl_set_power(struct iwl_priv *priv, void *cmd) | |||
| 124 | */ | 124 | */ |
| 125 | static u16 iwl_get_auto_power_mode(struct iwl_priv *priv) | 125 | static u16 iwl_get_auto_power_mode(struct iwl_priv *priv) |
| 126 | { | 126 | { |
| 127 | u16 mode = priv->power_data.user_power_setting; | 127 | u16 mode; |
| 128 | 128 | ||
| 129 | switch (priv->power_data.user_power_setting) { | 129 | switch (priv->power_data.user_power_setting) { |
| 130 | case IWL_POWER_AUTO: | 130 | case IWL_POWER_AUTO: |
| @@ -136,12 +136,16 @@ static u16 iwl_get_auto_power_mode(struct iwl_priv *priv) | |||
| 136 | else | 136 | else |
| 137 | mode = IWL_POWER_ON_AC_DISASSOC; | 137 | mode = IWL_POWER_ON_AC_DISASSOC; |
| 138 | break; | 138 | break; |
| 139 | /* FIXME: remove battery and ac from here */ | ||
| 139 | case IWL_POWER_BATTERY: | 140 | case IWL_POWER_BATTERY: |
| 140 | mode = IWL_POWER_INDEX_3; | 141 | mode = IWL_POWER_INDEX_3; |
| 141 | break; | 142 | break; |
| 142 | case IWL_POWER_AC: | 143 | case IWL_POWER_AC: |
| 143 | mode = IWL_POWER_MODE_CAM; | 144 | mode = IWL_POWER_MODE_CAM; |
| 144 | break; | 145 | break; |
| 146 | default: | ||
| 147 | mode = priv->power_data.user_power_setting; | ||
| 148 | break; | ||
| 145 | } | 149 | } |
| 146 | return mode; | 150 | return mode; |
| 147 | } | 151 | } |
| @@ -151,7 +155,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv) | |||
| 151 | { | 155 | { |
| 152 | int ret = 0, i; | 156 | int ret = 0, i; |
| 153 | struct iwl_power_mgr *pow_data; | 157 | struct iwl_power_mgr *pow_data; |
| 154 | int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_AC; | 158 | int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_MAX; |
| 155 | u16 pci_pm; | 159 | u16 pci_pm; |
| 156 | 160 | ||
| 157 | IWL_DEBUG_POWER("Initialize power \n"); | 161 | IWL_DEBUG_POWER("Initialize power \n"); |
| @@ -173,7 +177,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv) | |||
| 173 | 177 | ||
| 174 | IWL_DEBUG_POWER("adjust power command flags\n"); | 178 | IWL_DEBUG_POWER("adjust power command flags\n"); |
| 175 | 179 | ||
| 176 | for (i = 0; i < IWL_POWER_AC; i++) { | 180 | for (i = 0; i < IWL_POWER_MAX; i++) { |
| 177 | cmd = &pow_data->pwr_range_0[i].cmd; | 181 | cmd = &pow_data->pwr_range_0[i].cmd; |
| 178 | 182 | ||
| 179 | if (pci_pm & 0x1) | 183 | if (pci_pm & 0x1) |
| @@ -265,17 +269,18 @@ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh) | |||
| 265 | * else user level */ | 269 | * else user level */ |
| 266 | 270 | ||
| 267 | switch (setting->system_power_setting) { | 271 | switch (setting->system_power_setting) { |
| 268 | case IWL_POWER_AUTO: | 272 | case IWL_POWER_SYS_AUTO: |
| 269 | final_mode = iwl_get_auto_power_mode(priv); | 273 | final_mode = iwl_get_auto_power_mode(priv); |
| 270 | break; | 274 | break; |
| 271 | case IWL_POWER_BATTERY: | 275 | case IWL_POWER_SYS_BATTERY: |
| 272 | final_mode = IWL_POWER_INDEX_3; | 276 | final_mode = IWL_POWER_INDEX_3; |
| 273 | break; | 277 | break; |
| 274 | case IWL_POWER_AC: | 278 | case IWL_POWER_SYS_AC: |
| 275 | final_mode = IWL_POWER_MODE_CAM; | 279 | final_mode = IWL_POWER_MODE_CAM; |
| 276 | break; | 280 | break; |
| 277 | default: | 281 | default: |
| 278 | final_mode = setting->system_power_setting; | 282 | final_mode = IWL_POWER_INDEX_3; |
| 283 | WARN_ON(1); | ||
| 279 | } | 284 | } |
| 280 | 285 | ||
| 281 | if (setting->critical_power_setting > final_mode) | 286 | if (setting->critical_power_setting > final_mode) |
| @@ -394,7 +399,7 @@ void iwl_power_initialize(struct iwl_priv *priv) | |||
| 394 | iwl_power_init_handle(priv); | 399 | iwl_power_init_handle(priv); |
| 395 | priv->power_data.user_power_setting = IWL_POWER_AUTO; | 400 | priv->power_data.user_power_setting = IWL_POWER_AUTO; |
| 396 | priv->power_data.power_disabled = 0; | 401 | priv->power_data.power_disabled = 0; |
| 397 | priv->power_data.system_power_setting = IWL_POWER_AUTO; | 402 | priv->power_data.system_power_setting = IWL_POWER_SYS_AUTO; |
| 398 | priv->power_data.is_battery_active = 0; | 403 | priv->power_data.is_battery_active = 0; |
| 399 | priv->power_data.power_disabled = 0; | 404 | priv->power_data.power_disabled = 0; |
| 400 | priv->power_data.critical_power_setting = 0; | 405 | priv->power_data.critical_power_setting = 0; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.h b/drivers/net/wireless/iwlwifi/iwl-power.h index 801f6143a42c..abcbbf96a84e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.h +++ b/drivers/net/wireless/iwlwifi/iwl-power.h | |||
| @@ -33,12 +33,25 @@ | |||
| 33 | 33 | ||
| 34 | struct iwl_priv; | 34 | struct iwl_priv; |
| 35 | 35 | ||
| 36 | #define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */ | 36 | enum { |
| 37 | #define IWL_POWER_INDEX_3 0x03 | 37 | IWL_POWER_MODE_CAM, /* Continuously Aware Mode, always on */ |
| 38 | #define IWL_POWER_INDEX_5 0x05 | 38 | IWL_POWER_INDEX_1, |
| 39 | #define IWL_POWER_AC 0x06 | 39 | IWL_POWER_INDEX_2, |
| 40 | #define IWL_POWER_BATTERY 0x07 | 40 | IWL_POWER_INDEX_3, |
| 41 | #define IWL_POWER_AUTO 0x08 | 41 | IWL_POWER_INDEX_4, |
| 42 | IWL_POWER_INDEX_5, | ||
| 43 | IWL_POWER_AUTO, | ||
| 44 | IWL_POWER_MAX = IWL_POWER_AUTO, | ||
| 45 | IWL_POWER_AC, | ||
| 46 | IWL_POWER_BATTERY, | ||
| 47 | }; | ||
| 48 | |||
| 49 | enum { | ||
| 50 | IWL_POWER_SYS_AUTO, | ||
| 51 | IWL_POWER_SYS_AC, | ||
| 52 | IWL_POWER_SYS_BATTERY, | ||
| 53 | }; | ||
| 54 | |||
| 42 | #define IWL_POWER_LIMIT 0x08 | 55 | #define IWL_POWER_LIMIT 0x08 |
| 43 | #define IWL_POWER_MASK 0x0F | 56 | #define IWL_POWER_MASK 0x0F |
| 44 | #define IWL_POWER_ENABLED 0x10 | 57 | #define IWL_POWER_ENABLED 0x10 |
| @@ -52,9 +65,9 @@ struct iwl_power_vec_entry { | |||
| 52 | 65 | ||
| 53 | struct iwl_power_mgr { | 66 | struct iwl_power_mgr { |
| 54 | spinlock_t lock; | 67 | spinlock_t lock; |
| 55 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_AC]; | 68 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_MAX]; |
| 56 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_AC]; | 69 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_MAX]; |
| 57 | struct iwl_power_vec_entry pwr_range_2[IWL_POWER_AC]; | 70 | struct iwl_power_vec_entry pwr_range_2[IWL_POWER_MAX]; |
| 58 | u32 dtim_period; | 71 | u32 dtim_period; |
| 59 | /* final power level that used to calculate final power command */ | 72 | /* final power level that used to calculate final power command */ |
| 60 | u8 power_mode; | 73 | u8 power_mode; |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index 71f5da3fe5c4..2001b09738ff 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
| @@ -3800,76 +3800,53 @@ static ssize_t store_power_level(struct device *d, | |||
| 3800 | const char *buf, size_t count) | 3800 | const char *buf, size_t count) |
| 3801 | { | 3801 | { |
| 3802 | struct iwl_priv *priv = dev_get_drvdata(d); | 3802 | struct iwl_priv *priv = dev_get_drvdata(d); |
| 3803 | int rc; | 3803 | int ret; |
| 3804 | int mode; | 3804 | int mode; |
| 3805 | 3805 | ||
| 3806 | mode = simple_strtoul(buf, NULL, 0); | 3806 | mode = simple_strtoul(buf, NULL, 0); |
| 3807 | mutex_lock(&priv->mutex); | 3807 | mutex_lock(&priv->mutex); |
| 3808 | 3808 | ||
| 3809 | if (!iwl_is_ready(priv)) { | 3809 | if (!iwl_is_ready(priv)) { |
| 3810 | rc = -EAGAIN; | 3810 | ret = -EAGAIN; |
| 3811 | goto out; | 3811 | goto out; |
| 3812 | } | 3812 | } |
| 3813 | 3813 | ||
| 3814 | rc = iwl_power_set_user_mode(priv, mode); | 3814 | ret = iwl_power_set_user_mode(priv, mode); |
| 3815 | if (rc) { | 3815 | if (ret) { |
| 3816 | IWL_DEBUG_MAC80211("failed setting power mode.\n"); | 3816 | IWL_DEBUG_MAC80211("failed setting power mode.\n"); |
| 3817 | goto out; | 3817 | goto out; |
| 3818 | } | 3818 | } |
| 3819 | rc = count; | 3819 | ret = count; |
| 3820 | 3820 | ||
| 3821 | out: | 3821 | out: |
| 3822 | mutex_unlock(&priv->mutex); | 3822 | mutex_unlock(&priv->mutex); |
| 3823 | return rc; | 3823 | return ret; |
| 3824 | } | 3824 | } |
| 3825 | 3825 | ||
| 3826 | #define MAX_WX_STRING 80 | ||
| 3827 | |||
| 3828 | /* Values are in microsecond */ | ||
| 3829 | static const s32 timeout_duration[] = { | ||
| 3830 | 350000, | ||
| 3831 | 250000, | ||
| 3832 | 75000, | ||
| 3833 | 37000, | ||
| 3834 | 25000, | ||
| 3835 | }; | ||
| 3836 | static const s32 period_duration[] = { | ||
| 3837 | 400000, | ||
| 3838 | 700000, | ||
| 3839 | 1000000, | ||
| 3840 | 1000000, | ||
| 3841 | 1000000 | ||
| 3842 | }; | ||
| 3843 | |||
| 3844 | static ssize_t show_power_level(struct device *d, | 3826 | static ssize_t show_power_level(struct device *d, |
| 3845 | struct device_attribute *attr, char *buf) | 3827 | struct device_attribute *attr, char *buf) |
| 3846 | { | 3828 | { |
| 3847 | struct iwl_priv *priv = dev_get_drvdata(d); | 3829 | struct iwl_priv *priv = dev_get_drvdata(d); |
| 3830 | int mode = priv->power_data.user_power_setting; | ||
| 3831 | int system = priv->power_data.system_power_setting; | ||
| 3848 | int level = priv->power_data.power_mode; | 3832 | int level = priv->power_data.power_mode; |
| 3849 | char *p = buf; | 3833 | char *p = buf; |
| 3850 | 3834 | ||
| 3851 | p += sprintf(p, "%d ", level); | 3835 | switch (system) { |
| 3852 | switch (level) { | 3836 | case IWL_POWER_SYS_AUTO: |
| 3853 | case IWL_POWER_MODE_CAM: | 3837 | p += sprintf(p, "SYSTEM:auto"); |
| 3854 | case IWL_POWER_AC: | ||
| 3855 | p += sprintf(p, "(AC)"); | ||
| 3856 | break; | 3838 | break; |
| 3857 | case IWL_POWER_BATTERY: | 3839 | case IWL_POWER_SYS_AC: |
| 3858 | p += sprintf(p, "(BATTERY)"); | 3840 | p += sprintf(p, "SYSTEM:ac"); |
| 3841 | break; | ||
| 3842 | case IWL_POWER_SYS_BATTERY: | ||
| 3843 | p += sprintf(p, "SYSTEM:battery"); | ||
| 3859 | break; | 3844 | break; |
| 3860 | default: | ||
| 3861 | p += sprintf(p, | ||
| 3862 | "(Timeout %dms, Period %dms)", | ||
| 3863 | timeout_duration[level - 1] / 1000, | ||
| 3864 | period_duration[level - 1] / 1000); | ||
| 3865 | } | 3845 | } |
| 3866 | /* | 3846 | |
| 3867 | if (!(priv->power_mode & IWL_POWER_ENABLED)) | 3847 | p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO)?"fixed":"auto"); |
| 3868 | p += sprintf(p, " OFF\n"); | 3848 | p += sprintf(p, "\tINDEX:%d", level); |
| 3869 | else | 3849 | p += sprintf(p, "\n"); |
| 3870 | p += sprintf(p, " \n"); | ||
| 3871 | */ | ||
| 3872 | p += sprintf(p, " \n"); | ||
| 3873 | return (p - buf + 1); | 3850 | return (p - buf + 1); |
| 3874 | } | 3851 | } |
| 3875 | 3852 | ||
