u16 ip_base_id = ipv4 ? ntohs(ip_hdr(skb)->id) : 0;
        u16 amsdu_add, snap_ip_tcp, pad, i = 0;
        unsigned int dbg_max_amsdu_len;
-       u8 *qc, tid;
+       u8 *qc, tid, txf;
 
        snap_ip_tcp = 8 + skb_transport_header(skb) - skb_network_header(skb) +
                tcp_hdrlen(skb);
 
        max_amsdu_len = sta->max_amsdu_len;
        dbg_max_amsdu_len = ACCESS_ONCE(mvm->max_amsdu_len);
+
+       /* the Tx FIFO to which this A-MSDU will be routed */
+       txf = iwl_mvm_ac_to_tx_fifo[tid_to_mac80211_ac[tid]];
+
+       /*
+        * Don't send an AMSDU that will be longer than the TXF.
+        * Add a security margin of 256 for the TX command + headers.
+        * We also want to have the start of the next packet inside the
+        * fifo to be able to send bursts.
+        */
+       max_amsdu_len = min_t(unsigned int, max_amsdu_len,
+                             mvm->shared_mem_cfg.txfifo_size[txf] - 256);
+
        if (dbg_max_amsdu_len)
                max_amsdu_len = min_t(unsigned int, max_amsdu_len,
                                      dbg_max_amsdu_len);