Wey-Yi Guy [Fri, 11 Sep 2009 17:38:14 +0000 (10:38 -0700)]
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

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>

index 89f360b..1dd8db2 100644 (file)
@@ -164,5 +164,6 @@ struct iwl_cfg iwl1000_bgn_cfg = {
.max_ll_items = OTP_MAX_LL_ITEMS_1000,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

index e70c5b0..33e40c2 100644 (file)
@@ -2894,6 +2894,7 @@ static struct iwl_cfg iwl3945_bg_cfg = {
.mod_params = &iwl3945_mod_params,
.use_isr_legacy = true,
.ht_greenfield_support = false,
+       .led_compensation = 64,
};

static struct iwl_cfg iwl3945_abg_cfg = {
@@ -2908,6 +2909,7 @@ static struct iwl_cfg iwl3945_abg_cfg = {
.mod_params = &iwl3945_mod_params,
.use_isr_legacy = true,
.ht_greenfield_support = false,
+       .led_compensation = 64,
};

struct pci_device_id iwl3945_hw_card_ids[] = {
index a22a050..2500ab2 100644 (file)
@@ -2355,6 +2355,7 @@ struct iwl_cfg iwl4965_agn_cfg = {
.use_isr_legacy = true,
.ht_greenfield_support = false,
.broken_powersave = true,
+       .led_compensation = 61,
};

/* Module firmware */
index e1b3785..c81fd4b 100644 (file)
@@ -1656,6 +1656,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
.valid_rx_ant = ANT_ABC,
.need_pll_cfg = true,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl5100_bg_cfg = {
@@ -1673,6 +1674,7 @@ struct iwl_cfg iwl5100_bg_cfg = {
.valid_rx_ant = ANT_AB,
.need_pll_cfg = true,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl5100_abg_cfg = {
@@ -1690,6 +1692,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
.valid_rx_ant = ANT_AB,
.need_pll_cfg = true,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl5100_agn_cfg = {
@@ -1707,6 +1710,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
.valid_rx_ant = ANT_AB,
.need_pll_cfg = true,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl5350_agn_cfg = {
@@ -1724,6 +1728,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
.valid_rx_ant = ANT_ABC,
.need_pll_cfg = true,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl5150_agn_cfg = {
@@ -1741,6 +1746,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
.valid_rx_ant = ANT_AB,
.need_pll_cfg = true,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));
index 4b3fb40..48b2b7d 100644 (file)
@@ -258,6 +258,7 @@ struct iwl_cfg iwl6000h_2agn_cfg = {
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

/*
@@ -281,6 +282,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl6050_2agn_cfg = {
@@ -301,6 +303,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl6000_3agn_cfg = {
@@ -321,6 +324,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

struct iwl_cfg iwl6050_3agn_cfg = {
@@ -341,6 +345,7 @@ struct iwl_cfg iwl6050_3agn_cfg = {
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.ht_greenfield_support = true,
+       .led_compensation = 51,
};

MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
index e50103a..79ea425 100644 (file)
@@ -213,6 +213,9 @@ struct iwl_mod_params {
* @pa_type: used by 6000 series only to identify the type of Power Amplifier
* @max_ll_items: max number of OTP blocks
+ * @led_compensation: compensate on the led on/off time per HW according
+ *     to the deviation to achieve the desired led frequency.
+ *     The detail algorithm is described in iwl-led.c
*
* We enable the driver to be backward compatible wrt API version. The
* driver specifies which APIs it supports (with @ucode_api_max being the
@@ -255,6 +258,7 @@ struct iwl_cfg {
const bool ht_greenfield_support;
const bool broken_powersave;
+       u16 led_compensation;
};

/***************************
@@ -78,6 +78,29 @@ static const struct {

+/*
+ * 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
+ */
+static inline u8 iwl_blink_compensation(struct iwl_priv *priv,
+                                   u8 time, u16 compensation)
+{
+       if (!compensation) {
+               IWL_ERR(priv, "undefined blink compensation: "
+               return time;
+       }
+
+       return (u8)((time * compensation) >> 6);
+}
+
/*  [0-256] -> [0..8] FIXME: we need [0..10] */
static inline int iwl_brightness_to_idx(enum led_brightness brightness)
{
@@ -114,8 +137,14 @@ static int iwl_led_pattern(struct iwl_priv *priv, int led_id,

+       IWL_DEBUG_LED(priv, "Led blink time compensation= %u\n",
+                       priv->cfg->led_compensation);
+       led_cmd.on =
+                                       priv->cfg->led_compensation);
+       led_cmd.off =
+                                       priv->cfg->led_compensation);

return iwl_send_led_cmd(priv, &led_cmd);
}