.max_ll_items = OTP_MAX_LL_ITEMS_1000,
        .shadow_ram_support = false,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 
        .mod_params = &iwl3945_mod_params,
        .use_isr_legacy = true,
        .ht_greenfield_support = false,
+       .led_compensation = 64,
 };
 
 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[] = {
 
        .use_isr_legacy = true,
        .ht_greenfield_support = false,
        .broken_powersave = true,
+       .led_compensation = 61,
 };
 
 /* Module firmware */
 
        .valid_rx_ant = ANT_ABC,
        .need_pll_cfg = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 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 = {
        .valid_rx_ant = ANT_AB,
        .need_pll_cfg = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 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 = {
        .valid_rx_ant = ANT_ABC,
        .need_pll_cfg = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 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));
 
        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
        .shadow_ram_support = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 /*
        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
        .shadow_ram_support = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 struct iwl_cfg iwl6050_2agn_cfg = {
        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
        .shadow_ram_support = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 struct iwl_cfg iwl6000_3agn_cfg = {
        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
        .shadow_ram_support = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 struct iwl_cfg iwl6050_3agn_cfg = {
        .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
        .shadow_ram_support = true,
        .ht_greenfield_support = true,
+       .led_compensation = 51,
 };
 
 MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
 
  * @pa_type: used by 6000 series only to identify the type of Power Amplifier
  * @max_ll_items: max number of OTP blocks
  * @shadow_ram_support: shadow support for OTP memory
+ * @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
        const bool shadow_ram_support;
        const bool ht_greenfield_support;
        const bool broken_powersave;
+       u16 led_compensation;
 };
 
 /***************************
 
 #define IWL_MAX_BLINK_TBL (ARRAY_SIZE(blink_tbl) - 1) /* exclude SOLID_ON */
 #define IWL_SOLID_BLINK_IDX (ARRAY_SIZE(blink_tbl) - 1)
 
+/*
+ * 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
+ */
+static inline u8 iwl_blink_compensation(struct iwl_priv *priv,
+                                   u8 time, u16 compensation)
+{
+       if (!compensation) {
+               IWL_ERR(priv, "undefined blink compensation: "
+                       "use pre-defined blinking time\n");
+               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)
 {
 
        BUG_ON(idx > IWL_MAX_BLINK_TBL);
 
-       led_cmd.on = blink_tbl[idx].on_time;
-       led_cmd.off = blink_tbl[idx].off_time;
+       IWL_DEBUG_LED(priv, "Led blink time compensation= %u\n",
+                       priv->cfg->led_compensation);
+       led_cmd.on =
+               iwl_blink_compensation(priv, blink_tbl[idx].on_time,
+                                       priv->cfg->led_compensation);
+       led_cmd.off =
+               iwl_blink_compensation(priv, blink_tbl[idx].off_time,
+                                       priv->cfg->led_compensation);
 
        return iwl_send_led_cmd(priv, &led_cmd);
 }