return 0;
 }
 
+static int rtw_debugfs_get_fix_rate(struct seq_file *m, void *v)
+{
+       struct rtw_debugfs_priv *debugfs_priv = m->private;
+       struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+       struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+       u8 fix_rate = dm_info->fix_rate;
+
+       if (fix_rate >= DESC_RATE_MAX) {
+               seq_printf(m, "Fix rate disabled, fix_rate = %u\n", fix_rate);
+               return 0;
+       }
+
+       seq_printf(m, "Data frames fixed at desc rate %u\n", fix_rate);
+       return 0;
+}
+
 static int rtw_debugfs_copy_from_user(char tmp[], int size,
                                      const char __user *buffer, size_t count,
                                      int num)
        return count;
 }
 
+static ssize_t rtw_debugfs_set_fix_rate(struct file *filp,
+                                       const char __user *buffer,
+                                       size_t count, loff_t *loff)
+{
+       struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
+       struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
+       struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+       struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+       u8 fix_rate;
+       char tmp[32 + 1];
+       int ret;
+
+       rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
+
+       ret = kstrtou8(tmp, 0, &fix_rate);
+       if (ret) {
+               rtw_warn(rtwdev, "invalid args, [rate]\n");
+               return ret;
+       }
+
+       dm_info->fix_rate = fix_rate;
+
+       return count;
+}
+
 static int rtw_debug_get_mac_page(struct seq_file *m, void *v)
 {
        struct rtw_debugfs_priv *debugfs_priv = m->private;
        .cb_read = rtw_debugfs_get_read_reg,
 };
 
+static struct rtw_debugfs_priv rtw_debug_priv_fix_rate = {
+       .cb_write = rtw_debugfs_set_fix_rate,
+       .cb_read = rtw_debugfs_get_fix_rate,
+};
+
 static struct rtw_debugfs_priv rtw_debug_priv_dump_cam = {
        .cb_write = rtw_debugfs_set_single_input,
        .cb_read = rtw_debugfs_get_dump_cam,
        rtw_debugfs_add_rw(read_reg);
        rtw_debugfs_add_w(rf_write);
        rtw_debugfs_add_rw(rf_read);
+       rtw_debugfs_add_rw(fix_rate);
        rtw_debugfs_add_rw(dump_cam);
        rtw_debugfs_add_rw(rsvd_page);
        rtw_debugfs_add_r(phy_info);
 
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_hw *hw = rtwdev->hw;
+       struct rtw_dm_info *dm_info = &rtwdev->dm_info;
        struct rtw_sta_info *si;
+       u8 fix_rate;
        u16 seq;
        u8 ampdu_factor = 0;
        u8 ampdu_density = 0;
        pkt_info->bw = bw;
        pkt_info->stbc = stbc;
        pkt_info->ldpc = ldpc;
+
+       fix_rate = dm_info->fix_rate;
+       if (fix_rate < DESC_RATE_MAX) {
+               pkt_info->rate = fix_rate;
+               pkt_info->dis_rate_fallback = true;
+               pkt_info->use_rate = true;
+       }
 }
 
 void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev,