aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2009-09-11 13:38:14 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-07 16:39:32 -0400
commitf2d0d0e2bab7a325071dbaba3bef51c90868e1e6 (patch)
treea61e9e036b0172483105834d064aa7f1a1a252b9 /drivers
parentc812ee24855e20f43cf211e51e3eb53fe6dc6f1d (diff)
iwlwifi: Adjust blink rate to compensate Clock difference
Adjust led blink rate to compensate on a MAC Clock difference on every HW. Led blink rate analysis showed an average deviation of 0% on 3945, 5% on 4965 HW and 20% on 5000 series and up. Need to compensate on the led on/off time per HW according to the deviation to achieve the desired led frequency The calculation is: (100-averageDeviation)/100 * blinkTime For code efficiency the calculation will be: compensation = (100 - averageDeviation) * 64 / 100 NewBlinkTime = (compensation * BlinkTime) / 64 Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-led.c33
7 files changed, 50 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 89f360befc30..1dd8db2f6f23 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -164,5 +164,6 @@ struct iwl_cfg iwl1000_bgn_cfg = {
164 .max_ll_items = OTP_MAX_LL_ITEMS_1000, 164 .max_ll_items = OTP_MAX_LL_ITEMS_1000,
165 .shadow_ram_support = false, 165 .shadow_ram_support = false,
166 .ht_greenfield_support = true, 166 .ht_greenfield_support = true,
167 .led_compensation = 51,
167}; 168};
168 169
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index e70c5b0af364..33e40c21eb72 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -2894,6 +2894,7 @@ static struct iwl_cfg iwl3945_bg_cfg = {
2894 .mod_params = &iwl3945_mod_params, 2894 .mod_params = &iwl3945_mod_params,
2895 .use_isr_legacy = true, 2895 .use_isr_legacy = true,
2896 .ht_greenfield_support = false, 2896 .ht_greenfield_support = false,
2897 .led_compensation = 64,
2897}; 2898};
2898 2899
2899static struct iwl_cfg iwl3945_abg_cfg = { 2900static struct iwl_cfg iwl3945_abg_cfg = {
@@ -2908,6 +2909,7 @@ static struct iwl_cfg iwl3945_abg_cfg = {
2908 .mod_params = &iwl3945_mod_params, 2909 .mod_params = &iwl3945_mod_params,
2909 .use_isr_legacy = true, 2910 .use_isr_legacy = true,
2910 .ht_greenfield_support = false, 2911 .ht_greenfield_support = false,
2912 .led_compensation = 64,
2911}; 2913};
2912 2914
2913struct pci_device_id iwl3945_hw_card_ids[] = { 2915struct pci_device_id iwl3945_hw_card_ids[] = {
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index a22a0501c190..2500ab2e1d91 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -2355,6 +2355,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
2355 .use_isr_legacy = true, 2355 .use_isr_legacy = true,
2356 .ht_greenfield_support = false, 2356 .ht_greenfield_support = false,
2357 .broken_powersave = true, 2357 .broken_powersave = true,
2358 .led_compensation = 61,
2358}; 2359};
2359 2360
2360/* Module firmware */ 2361/* Module firmware */
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index e1b378528c72..c81fd4bc32b4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -1656,6 +1656,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
1656 .valid_rx_ant = ANT_ABC, 1656 .valid_rx_ant = ANT_ABC,
1657 .need_pll_cfg = true, 1657 .need_pll_cfg = true,
1658 .ht_greenfield_support = true, 1658 .ht_greenfield_support = true,
1659 .led_compensation = 51,
1659}; 1660};
1660 1661
1661struct iwl_cfg iwl5100_bg_cfg = { 1662struct iwl_cfg iwl5100_bg_cfg = {
@@ -1673,6 +1674,7 @@ struct iwl_cfg iwl5100_bg_cfg = {
1673 .valid_rx_ant = ANT_AB, 1674 .valid_rx_ant = ANT_AB,
1674 .need_pll_cfg = true, 1675 .need_pll_cfg = true,
1675 .ht_greenfield_support = true, 1676 .ht_greenfield_support = true,
1677 .led_compensation = 51,
1676}; 1678};
1677 1679
1678struct iwl_cfg iwl5100_abg_cfg = { 1680struct iwl_cfg iwl5100_abg_cfg = {
@@ -1690,6 +1692,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
1690 .valid_rx_ant = ANT_AB, 1692 .valid_rx_ant = ANT_AB,
1691 .need_pll_cfg = true, 1693 .need_pll_cfg = true,
1692 .ht_greenfield_support = true, 1694 .ht_greenfield_support = true,
1695 .led_compensation = 51,
1693}; 1696};
1694 1697
1695struct iwl_cfg iwl5100_agn_cfg = { 1698struct iwl_cfg iwl5100_agn_cfg = {
@@ -1707,6 +1710,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
1707 .valid_rx_ant = ANT_AB, 1710 .valid_rx_ant = ANT_AB,
1708 .need_pll_cfg = true, 1711 .need_pll_cfg = true,
1709 .ht_greenfield_support = true, 1712 .ht_greenfield_support = true,
1713 .led_compensation = 51,
1710}; 1714};
1711 1715
1712struct iwl_cfg iwl5350_agn_cfg = { 1716struct iwl_cfg iwl5350_agn_cfg = {
@@ -1724,6 +1728,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
1724 .valid_rx_ant = ANT_ABC, 1728 .valid_rx_ant = ANT_ABC,
1725 .need_pll_cfg = true, 1729 .need_pll_cfg = true,
1726 .ht_greenfield_support = true, 1730 .ht_greenfield_support = true,
1731 .led_compensation = 51,
1727}; 1732};
1728 1733
1729struct iwl_cfg iwl5150_agn_cfg = { 1734struct iwl_cfg iwl5150_agn_cfg = {
@@ -1741,6 +1746,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
1741 .valid_rx_ant = ANT_AB, 1746 .valid_rx_ant = ANT_AB,
1742 .need_pll_cfg = true, 1747 .need_pll_cfg = true,
1743 .ht_greenfield_support = true, 1748 .ht_greenfield_support = true,
1749 .led_compensation = 51,
1744}; 1750};
1745 1751
1746MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); 1752MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index 4b3fb4095678..48b2b7d2170c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -258,6 +258,7 @@ struct iwl_cfg iwl6000h_2agn_cfg = {
258 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 258 .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
259 .shadow_ram_support = true, 259 .shadow_ram_support = true,
260 .ht_greenfield_support = true, 260 .ht_greenfield_support = true,
261 .led_compensation = 51,
261}; 262};
262 263
263/* 264/*
@@ -281,6 +282,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
281 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 282 .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
282 .shadow_ram_support = true, 283 .shadow_ram_support = true,
283 .ht_greenfield_support = true, 284 .ht_greenfield_support = true,
285 .led_compensation = 51,
284}; 286};
285 287
286struct iwl_cfg iwl6050_2agn_cfg = { 288struct iwl_cfg iwl6050_2agn_cfg = {
@@ -301,6 +303,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
301 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 303 .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
302 .shadow_ram_support = true, 304 .shadow_ram_support = true,
303 .ht_greenfield_support = true, 305 .ht_greenfield_support = true,
306 .led_compensation = 51,
304}; 307};
305 308
306struct iwl_cfg iwl6000_3agn_cfg = { 309struct iwl_cfg iwl6000_3agn_cfg = {
@@ -321,6 +324,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
321 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 324 .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
322 .shadow_ram_support = true, 325 .shadow_ram_support = true,
323 .ht_greenfield_support = true, 326 .ht_greenfield_support = true,
327 .led_compensation = 51,
324}; 328};
325 329
326struct iwl_cfg iwl6050_3agn_cfg = { 330struct iwl_cfg iwl6050_3agn_cfg = {
@@ -341,6 +345,7 @@ struct iwl_cfg iwl6050_3agn_cfg = {
341 .max_ll_items = OTP_MAX_LL_ITEMS_6x00, 345 .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
342 .shadow_ram_support = true, 346 .shadow_ram_support = true,
343 .ht_greenfield_support = true, 347 .ht_greenfield_support = true,
348 .led_compensation = 51,
344}; 349};
345 350
346MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); 351MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index e50103a956b1..79ea42531e28 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -213,6 +213,9 @@ struct iwl_mod_params {
213 * @pa_type: used by 6000 series only to identify the type of Power Amplifier 213 * @pa_type: used by 6000 series only to identify the type of Power Amplifier
214 * @max_ll_items: max number of OTP blocks 214 * @max_ll_items: max number of OTP blocks
215 * @shadow_ram_support: shadow support for OTP memory 215 * @shadow_ram_support: shadow support for OTP memory
216 * @led_compensation: compensate on the led on/off time per HW according
217 * to the deviation to achieve the desired led frequency.
218 * The detail algorithm is described in iwl-led.c
216 * 219 *
217 * We enable the driver to be backward compatible wrt API version. The 220 * We enable the driver to be backward compatible wrt API version. The
218 * driver specifies which APIs it supports (with @ucode_api_max being the 221 * driver specifies which APIs it supports (with @ucode_api_max being the
@@ -255,6 +258,7 @@ struct iwl_cfg {
255 const bool shadow_ram_support; 258 const bool shadow_ram_support;
256 const bool ht_greenfield_support; 259 const bool ht_greenfield_support;
257 const bool broken_powersave; 260 const bool broken_powersave;
261 u16 led_compensation;
258}; 262};
259 263
260/*************************** 264/***************************
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.c b/drivers/net/wireless/iwlwifi/iwl-led.c
index 41addd1c7261..f547233c5b79 100644
--- a/drivers/net/wireless/iwlwifi/iwl-led.c
+++ b/drivers/net/wireless/iwlwifi/iwl-led.c
@@ -78,6 +78,29 @@ static const struct {
78#define IWL_MAX_BLINK_TBL (ARRAY_SIZE(blink_tbl) - 1) /* exclude SOLID_ON */ 78#define IWL_MAX_BLINK_TBL (ARRAY_SIZE(blink_tbl) - 1) /* exclude SOLID_ON */
79#define IWL_SOLID_BLINK_IDX (ARRAY_SIZE(blink_tbl) - 1) 79#define IWL_SOLID_BLINK_IDX (ARRAY_SIZE(blink_tbl) - 1)
80 80
81/*
82 * Adjust led blink rate to compensate on a MAC Clock difference on every HW
83 * Led blink rate analysis showed an average deviation of 0% on 3945,
84 * 5% on 4965 HW and 20% on 5000 series and up.
85 * Need to compensate on the led on/off time per HW according to the deviation
86 * to achieve the desired led frequency
87 * The calculation is: (100-averageDeviation)/100 * blinkTime
88 * For code efficiency the calculation will be:
89 * compensation = (100 - averageDeviation) * 64 / 100
90 * NewBlinkTime = (compensation * BlinkTime) / 64
91 */
92static inline u8 iwl_blink_compensation(struct iwl_priv *priv,
93 u8 time, u16 compensation)
94{
95 if (!compensation) {
96 IWL_ERR(priv, "undefined blink compensation: "
97 "use pre-defined blinking time\n");
98 return time;
99 }
100
101 return (u8)((time * compensation) >> 6);
102}
103
81/* [0-256] -> [0..8] FIXME: we need [0..10] */ 104/* [0-256] -> [0..8] FIXME: we need [0..10] */
82static inline int iwl_brightness_to_idx(enum led_brightness brightness) 105static inline int iwl_brightness_to_idx(enum led_brightness brightness)
83{ 106{
@@ -114,8 +137,14 @@ static int iwl_led_pattern(struct iwl_priv *priv, int led_id,
114 137
115 BUG_ON(idx > IWL_MAX_BLINK_TBL); 138 BUG_ON(idx > IWL_MAX_BLINK_TBL);
116 139
117 led_cmd.on = blink_tbl[idx].on_time; 140 IWL_DEBUG_LED(priv, "Led blink time compensation= %u\n",
118 led_cmd.off = blink_tbl[idx].off_time; 141 priv->cfg->led_compensation);
142 led_cmd.on =
143 iwl_blink_compensation(priv, blink_tbl[idx].on_time,
144 priv->cfg->led_compensation);
145 led_cmd.off =
146 iwl_blink_compensation(priv, blink_tbl[idx].off_time,
147 priv->cfg->led_compensation);
119 148
120 return iwl_send_led_cmd(priv, &led_cmd); 149 return iwl_send_led_cmd(priv, &led_cmd);
121} 150}