struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
        struct ieee80211_vif *vif = tx_info->control.vif;
        const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
-       u16 lowest_rate = chan->band_type == RTW89_BAND_2G ?
-                         RTW89_HW_RATE_CCK1 : RTW89_HW_RATE_OFDM6;
+       u16 lowest_rate;
+
+       if (tx_info->flags & IEEE80211_TX_CTL_NO_CCK_RATE || vif->p2p)
+               lowest_rate = RTW89_HW_RATE_OFDM6;
+       else if (chan->band_type == RTW89_BAND_2G)
+               lowest_rate = RTW89_HW_RATE_CCK1;
+       else
+               lowest_rate = RTW89_HW_RATE_OFDM6;
 
        if (!vif || !vif->bss_conf.basic_rates || !tx_req->sta)
                return lowest_rate;
        if (IEEE80211_SKB_CB(skb)->control.hw_key)
                rtw89_core_tx_update_sec_key(rtwdev, tx_req);
 
-       if (rate_pattern->enable)
+       if (vif->p2p)
+               desc_info->data_retry_lowest_rate = RTW89_HW_RATE_OFDM6;
+       else if (rate_pattern->enable)
                desc_info->data_retry_lowest_rate = rate_pattern->rate;
        else if (chan->band_type == RTW89_BAND_2G)
                desc_info->data_retry_lowest_rate = RTW89_HW_RATE_CCK1;
 
        struct sk_buff *skb;
        u8 pads[RTW89_PPE_BW_NUM];
        u8 mac_id = rtwsta ? rtwsta->mac_id : rtwvif->mac_id;
+       u16 lowest_rate;
        int ret;
 
        memset(pads, 0, sizeof(pads));
        if (sta)
                __get_sta_he_pkt_padding(rtwdev, sta, pads);
 
+       if (vif->p2p)
+               lowest_rate = RTW89_HW_RATE_OFDM6;
+       else if (chan->band_type == RTW89_BAND_2G)
+               lowest_rate = RTW89_HW_RATE_CCK1;
+       else
+               lowest_rate = RTW89_HW_RATE_OFDM6;
+
        skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_CMC_TBL_LEN);
        if (!skb) {
                rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
        SET_CTRL_INFO_OPERATION(skb->data, 1);
        SET_CMC_TBL_DISRTSFB(skb->data, 1);
        SET_CMC_TBL_DISDATAFB(skb->data, 1);
-       if (chan->band_type == RTW89_BAND_2G)
-               SET_CMC_TBL_RTS_RTY_LOWEST_RATE(skb->data, RTW89_HW_RATE_CCK1);
-       else
-               SET_CMC_TBL_RTS_RTY_LOWEST_RATE(skb->data, RTW89_HW_RATE_OFDM6);
+       SET_CMC_TBL_RTS_RTY_LOWEST_RATE(skb->data, lowest_rate);
        SET_CMC_TBL_RTS_TXCNT_LMT_SEL(skb->data, 0);
        SET_CMC_TBL_DATA_TXCNT_LMT_SEL(skb->data, 0);
        if (vif->type == NL80211_IFTYPE_STATION)
        struct sk_buff *skb_beacon;
        u16 tim_offset;
        int bcn_total_len;
+       u16 beacon_rate;
        int ret;
 
+       if (vif->p2p)
+               beacon_rate = RTW89_HW_RATE_OFDM6;
+       else if (chan->band_type == RTW89_BAND_2G)
+               beacon_rate = RTW89_HW_RATE_CCK1;
+       else
+               beacon_rate = RTW89_HW_RATE_OFDM6;
+
        skb_beacon = ieee80211_beacon_get_tim(rtwdev->hw, vif, &tim_offset,
                                              NULL, 0);
        if (!skb_beacon) {
        SET_BCN_UPD_MACID(skb->data, rtwvif->mac_id);
        SET_BCN_UPD_SSN_SEL(skb->data, RTW89_MGMT_HW_SSN_SEL);
        SET_BCN_UPD_SSN_MODE(skb->data, RTW89_MGMT_HW_SEQ_MODE);
-       SET_BCN_UPD_RATE(skb->data, chan->band_type == RTW89_BAND_2G ?
-                                   RTW89_HW_RATE_CCK1 : RTW89_HW_RATE_OFDM6);
+       SET_BCN_UPD_RATE(skb->data, beacon_rate);
 
        skb_put_data(skb, skb_beacon->data, skb_beacon->len);
        dev_kfree_skb_any(skb_beacon);
 
        struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern;
        struct rtw89_ra_info *ra = &rtwsta->ra;
        const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       struct ieee80211_vif *vif = rtwvif_to_vif(rtwsta->rtwvif);
        const u64 *high_rate_masks = rtw89_ra_mask_ht_rates;
        u8 rssi = ewma_rssi_read(&rtwsta->avg_rssi);
        u64 ra_mask = 0;
        switch (chan->band_type) {
        case RTW89_BAND_2G:
                ra_mask |= sta->deflink.supp_rates[NL80211_BAND_2GHZ];
-               if (sta->deflink.supp_rates[NL80211_BAND_2GHZ] <= 0xf)
+               if (sta->deflink.supp_rates[NL80211_BAND_2GHZ] & 0xf)
                        mode |= RTW89_RA_MODE_CCK;
-               else
-                       mode |= RTW89_RA_MODE_CCK | RTW89_RA_MODE_OFDM;
+               if (sta->deflink.supp_rates[NL80211_BAND_2GHZ] & 0xff0)
+                       mode |= RTW89_RA_MODE_OFDM;
                break;
        case RTW89_BAND_5G:
                ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
            IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM)
                ra->dcm_cap = 1;
 
-       if (rate_pattern->enable) {
+       if (rate_pattern->enable && !vif->p2p) {
                ra_mask = rtw89_phy_ra_mask_cfg(rtwdev, rtwsta);
                ra_mask &= rate_pattern->ra_mask;
                mode = rate_pattern->ra_mode;