struct brcmf_fil_action_frame_le *action_frame;
        struct brcmf_fil_af_params_le *af_params;
        bool ack;
-       s32 chan_nr;
-       u32 freq;
+       __le32 hw_ch;
 
        brcmf_dbg(TRACE, "Enter\n");
 
                /* Add the channel. Use the one specified as parameter if any or
                 * the current one (got from the firmware) otherwise
                 */
-               if (chan)
-                       freq = chan->center_freq;
-               else
-                       brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL,
-                                             &freq);
-               chan_nr = ieee80211_frequency_to_channel(freq);
-               af_params->channel = cpu_to_le32(chan_nr);
+               if (chan) {
+                       hw_ch = cpu_to_le32(chan->hw_value);
+               } else {
+                       err = brcmf_fil_cmd_data_get(vif->ifp,
+                                                    BRCMF_C_GET_CHANNEL,
+                                                    &hw_ch, sizeof(hw_ch));
+                       if (err) {
+                               bphy_err(drvr,
+                                        "unable to get current hw channel\n");
+                               goto free;
+                       }
+               }
+               af_params->channel = hw_ch;
+
                af_params->dwell_time = cpu_to_le32(params->wait);
                memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
                       le16_to_cpu(action_frame->len));
 
-               brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, freq=%d\n",
-                         *cookie, le16_to_cpu(action_frame->len), freq);
+               brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, channel=%d\n",
+                         *cookie, le16_to_cpu(action_frame->len),
+                         le32_to_cpu(af_params->channel));
 
                ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg),
                                                  af_params);
 
                cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
                                        GFP_KERNEL);
+free:
                kfree(af_params);
        } else {
                brcmf_dbg(TRACE, "Unhandled, fc=%04x!!\n", mgmt->frame_control);
 
        struct brcmf_cfg80211_vif *vif;
        s32 err = 0;
        bool ack = false;
-       s32 chan_nr;
-       u32 freq;
+       __le16 hw_ch;
        struct brcmf_mf_params_le *mf_params;
        u32 mf_params_len;
        s32 ready;
        mf_params->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN);
        mf_params->frame_control = mgmt->frame_control;
 
-       if (chan)
-               freq = chan->center_freq;
-       else
-               brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL,
-                                     &freq);
-       chan_nr = ieee80211_frequency_to_channel(freq);
-       mf_params->channel = cpu_to_le16(chan_nr);
+       if (chan) {
+               hw_ch = cpu_to_le16(chan->hw_value);
+       } else {
+               err = brcmf_fil_cmd_data_get(vif->ifp, BRCMF_C_GET_CHANNEL,
+                                            &hw_ch, sizeof(hw_ch));
+               if (err) {
+                       bphy_err(drvr, "unable to get current hw channel\n");
+                       goto free;
+               }
+       }
+       mf_params->channel = hw_ch;
+
        memcpy(&mf_params->da[0], &mgmt->da[0], ETH_ALEN);
        memcpy(&mf_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
        mf_params->packet_id = cpu_to_le32(*cookie);
        brcmf_dbg(TRACE, "Auth frame, cookie=%d, fc=%04x, len=%d, channel=%d\n",
                  le32_to_cpu(mf_params->packet_id),
                  le16_to_cpu(mf_params->frame_control),
-                 le16_to_cpu(mf_params->len), chan_nr);
+                 le16_to_cpu(mf_params->len),
+                 le16_to_cpu(mf_params->channel));
 
        vif->mgmt_tx_id = le32_to_cpu(mf_params->packet_id);
        set_bit(BRCMF_MGMT_TX_SEND_FRAME, &vif->mgmt_tx_status);
 tx_status:
        cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
                                GFP_KERNEL);
+free:
        kfree(mf_params);
        return err;
 }