if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
            *hlid == wlvif->ap.bcast_hlid) {
+               u32 sqn_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING;
                /*
                 * save the total freed packets in the wlvif, in case this is
                 * recovery or suspend
                 * increment the initial seq number on recovery to account for
                 * transmitted packets that we haven't yet got in the FW status
                 */
+               if (wlvif->encryption_type == KEY_GEM)
+                       sqn_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM;
+
                if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
-                       wlvif->total_freed_pkts +=
-                                       WL1271_TX_SQN_POST_RECOVERY_PADDING;
+                       wlvif->total_freed_pkts += sqn_padding;
        }
 
        wl->links[*hlid].total_freed_pkts = 0;
 
                                   u8 hlid, struct ieee80211_sta *sta)
 {
        struct wl1271_station *wl_sta;
+       u32 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING;
 
        wl_sta = (void *)sta->drv_priv;
        wl_sta->total_freed_pkts = wl->links[hlid].total_freed_pkts;
         * increment the initial seq number on recovery to account for
         * transmitted packets that we haven't yet got in the FW status
         */
+       if (wlvif->encryption_type == KEY_GEM)
+               sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM;
+
        if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
-               wl_sta->total_freed_pkts +=
-                               WL1271_TX_SQN_POST_RECOVERY_PADDING;
+               wl_sta->total_freed_pkts += sqn_recovery_padding;
 }
 
 static void wlcore_save_freed_pkts_addr(struct wl1271 *wl,
 
 #define WL1271_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff))
 #define WL1271_TX_SECURITY_HI32(s) ((u32)(((s) >> 16) & 0xffffffff))
 #define WL1271_TX_SQN_POST_RECOVERY_PADDING 0xff
+/* Use smaller padding for GEM, as some  APs have issues when it's too big */
+#define WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM 0x20
+
 
 #define WL1271_CIPHER_SUITE_GEM 0x00147201