return opcode + (groupid << 8) + (version << 16);
 }
 
+/* due to the conversion, this group is special; new groups
+ * should be defined in the appropriate fw-api header files
+ */
+#define IWL_ALWAYS_LONG_GROUP  1
+
 /**
  * struct iwl_cmd_header
  *
 
 
 /* UMAC Scan API */
 
-/**
- * struct iwl_mvm_umac_cmd_hdr - Command header for UMAC commands
- * @size:      size of the command (not including header)
- * @reserved0: for future use and alignment
- * @ver:       API version number
- */
-struct iwl_mvm_umac_cmd_hdr {
-       __le16 size;
-       u8 reserved0;
-       u8 ver;
-} __packed;
-
 /* The maximum of either of these cannot exceed 8, because we use an
  * 8-bit mask (see IWL_MVM_SCAN_MASK in mvm.h).
  */
 
 /**
  * struct iwl_scan_config
- * @hdr: umac command header
  * @flags:                     enum scan_config_flags
  * @tx_chains:                 valid_tx antenna - ANT_* definitions
  * @rx_chains:                 valid_rx antenna - ANT_* definitions
  * @channel_array:             default supported channels
  */
 struct iwl_scan_config {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 flags;
        __le32 tx_chains;
        __le32 rx_chains;
 
 /**
  * struct iwl_scan_req_umac
- * @hdr: umac command header
  * @flags: &enum iwl_umac_scan_flags
  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
  * @ooc_priority: out of channel priority - &enum iwl_scan_priority
  *     &struct iwl_scan_req_umac_tail
  */
 struct iwl_scan_req_umac {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 flags;
        __le32 uid;
        __le32 ooc_priority;
 
 /**
  * struct iwl_umac_scan_abort
- * @hdr: umac command header
  * @uid: scan id, &enum iwl_umac_scan_uid_offsets
  * @flags: reserved
  */
 struct iwl_umac_scan_abort {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 uid;
        __le32 flags;
 } __packed; /* SCAN_ABORT_CMD_UMAC_API_S_VER_1 */
 
  * @is_buf_required: 1 channel estimation buffer required, 0 - otherwise
  */
 struct iwl_tof_config_cmd {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 sub_grp_cmd_id;
        u8 tof_disabled;
        u8 one_sided_disabled;
  * @bssid: Current AP BSSID
  */
 struct iwl_tof_responder_config_cmd {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 sub_grp_cmd_id;
        __le16 burst_period;
        u8 min_delta_ftm;
  *                     value to be sent to the AP
  */
 struct iwl_tof_range_req_ext_cmd {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 sub_grp_cmd_id;
        __le16 tsf_timer_offset_msec;
        __le16 reserved;
  *               Bits set to 1 shall be randomized by the UMAC
  */
 struct iwl_tof_range_req_cmd {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 sub_grp_cmd_id;
        u8 request_id;
        u8 initiator;
  * @request_id: corresponds to a range request
  */
 struct iwl_tof_range_abort_cmd {
-       struct iwl_mvm_umac_cmd_hdr hdr;
        __le32 sub_grp_cmd_id;
        u8 request_id;
        u8 reserved[3];
 
        int num_channels =
                mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels +
                mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels;
-       int ret, i, j = 0, cmd_size, data_size;
+       int ret, i, j = 0, cmd_size;
        struct iwl_host_cmd cmd = {
-               .id = SCAN_CFG_CMD,
+               .id = iwl_cmd_id(SCAN_CFG_CMD, IWL_ALWAYS_LONG_GROUP, 0),
        };
 
        if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels))
        if (!scan_config)
                return -ENOMEM;
 
-       data_size = cmd_size - sizeof(struct iwl_mvm_umac_cmd_hdr);
-       scan_config->hdr.size = cpu_to_le16(data_size);
        scan_config->flags = cpu_to_le32(SCAN_CONFIG_FLAG_ACTIVATE |
                                         SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS |
                                         SCAN_CONFIG_FLAG_SET_TX_CHAINS |
                return uid;
 
        memset(cmd, 0, ksize(cmd));
-       cmd->hdr.size = cpu_to_le16(iwl_mvm_scan_size(mvm) -
-                                   sizeof(struct iwl_mvm_umac_cmd_hdr));
 
        iwl_mvm_scan_umac_dwell(mvm, cmd, params);
 
        iwl_mvm_build_scan_probe(mvm, vif, ies, ¶ms);
 
        if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
-               hcmd.id = SCAN_REQ_UMAC;
+               hcmd.id = iwl_cmd_id(SCAN_REQ_UMAC, IWL_ALWAYS_LONG_GROUP, 0);
                ret = iwl_mvm_scan_umac(mvm, vif, ¶ms,
                                        IWL_MVM_SCAN_REGULAR);
        } else {
        iwl_mvm_build_scan_probe(mvm, vif, ies, ¶ms);
 
        if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
-               hcmd.id = SCAN_REQ_UMAC;
+               hcmd.id = iwl_cmd_id(SCAN_REQ_UMAC, IWL_ALWAYS_LONG_GROUP, 0);
                ret = iwl_mvm_scan_umac(mvm, vif, ¶ms, IWL_MVM_SCAN_SCHED);
        } else {
                hcmd.id = SCAN_OFFLOAD_REQUEST_CMD;
 
 static int iwl_mvm_umac_scan_abort(struct iwl_mvm *mvm, int type)
 {
-       struct iwl_umac_scan_abort cmd = {
-               .hdr.size = cpu_to_le16(sizeof(struct iwl_umac_scan_abort) -
-                                       sizeof(struct iwl_mvm_umac_cmd_hdr)),
-       };
+       struct iwl_umac_scan_abort cmd = {};
        int uid, ret;
 
        lockdep_assert_held(&mvm->mutex);
 
        IWL_DEBUG_SCAN(mvm, "Sending scan abort, uid %u\n", uid);
 
-       ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_UMAC, 0, sizeof(cmd), &cmd);
+       ret = iwl_mvm_send_cmd_pdu(mvm,
+                                  iwl_cmd_id(SCAN_ABORT_UMAC,
+                                             IWL_ALWAYS_LONG_GROUP, 0),
+                                  0, sizeof(cmd), &cmd);
        if (!ret)
                mvm->scan_uid_status[uid] = type << IWL_MVM_SCAN_STOPPING_SHIFT;
 
 
 
        memset(tof_data, 0, sizeof(*tof_data));
 
-       tof_data->tof_cfg.hdr.size =
-               cpu_to_le16(sizeof(struct iwl_tof_config_cmd) -
-                           sizeof(struct iwl_mvm_umac_cmd_hdr));
        tof_data->tof_cfg.sub_grp_cmd_id = cpu_to_le32(TOF_CONFIG_CMD);
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
        if (IWL_MVM_TOF_IS_RESPONDER) {
-               tof_data->responder_cfg.hdr.size =
-                       cpu_to_le16(sizeof(struct iwl_tof_responder_config_cmd) -
-                                   sizeof(struct iwl_mvm_umac_cmd_hdr));
                tof_data->responder_cfg.sub_grp_cmd_id =
                        cpu_to_le32(TOF_RESPONDER_CONFIG_CMD);
                tof_data->responder_cfg.sta_id = IWL_MVM_STATION_COUNT;
        }
 #endif
 
-       tof_data->range_req.hdr.size =
-               cpu_to_le16(sizeof(struct iwl_tof_range_req_cmd) -
-                           sizeof(struct iwl_mvm_umac_cmd_hdr));
        tof_data->range_req.sub_grp_cmd_id = cpu_to_le32(TOF_RANGE_REQ_CMD);
        tof_data->range_req.req_timeout = 1;
        tof_data->range_req.initiator = 1;
        tof_data->range_req.report_policy = 3;
 
-       tof_data->range_req_ext.hdr.size =
-               cpu_to_le16(sizeof(struct iwl_tof_range_req_ext_cmd) -
-                           sizeof(struct iwl_mvm_umac_cmd_hdr));
        tof_data->range_req_ext.sub_grp_cmd_id =
                cpu_to_le32(TOF_RANGE_REQ_EXT_CMD);
 
        }
 
        mvm->tof_data.active_range_request = IWL_MVM_TOF_RANGE_REQ_MAX_ID;
-       return iwl_mvm_send_cmd_pdu(mvm, TOF_CMD, 0, sizeof(*cmd), cmd);
+       return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(TOF_CMD,
+                                                   IWL_ALWAYS_LONG_GROUP, 0),
+                                   0, sizeof(*cmd), cmd);
 }
 
 int iwl_mvm_tof_range_abort_cmd(struct iwl_mvm *mvm, u8 id)
 {
        struct iwl_tof_range_abort_cmd cmd = {
                .sub_grp_cmd_id = cpu_to_le32(TOF_RANGE_ABORT_CMD),
-               .hdr.size = cpu_to_le16(sizeof(struct iwl_tof_range_abort_cmd) -
-                                       sizeof(struct iwl_mvm_umac_cmd_hdr)),
                .request_id = id,
        };
 
        /* after abort is sent there's no active request anymore */
        mvm->tof_data.active_range_request = IWL_MVM_TOF_RANGE_REQ_MAX_ID;
 
-       return iwl_mvm_send_cmd_pdu(mvm, TOF_CMD, 0, sizeof(cmd), &cmd);
+       return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(TOF_CMD,
+                                                   IWL_ALWAYS_LONG_GROUP, 0),
+                                   0, sizeof(cmd), &cmd);
 }
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
        }
 
        cmd->sta_id = mvmvif->bcast_sta.sta_id;
-       return iwl_mvm_send_cmd_pdu(mvm, TOF_CMD, 0, sizeof(*cmd), cmd);
+       return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(TOF_CMD,
+                                                   IWL_ALWAYS_LONG_GROUP, 0),
+                                   0, sizeof(*cmd), cmd);
 }
 #endif
 
                return -EIO;
        }
 
-       return iwl_mvm_send_cmd_pdu(mvm, TOF_CMD, 0,
-                                   sizeof(mvm->tof_data.range_req_ext),
+       return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(TOF_CMD,
+                                                   IWL_ALWAYS_LONG_GROUP, 0),
+                                   0, sizeof(mvm->tof_data.range_req_ext),
                                    &mvm->tof_data.range_req_ext);
 }
 
 
        const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
        u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
 
-       if (WARN(!trans_pcie->wide_cmd_header && group_id != 0,
+       if (WARN(!trans_pcie->wide_cmd_header &&
+                group_id > IWL_ALWAYS_LONG_GROUP,
                 "unsupported wide command %#x\n", cmd->id))
                return -EINVAL;