#include "iwl-agn.h"
 #include "iwl-shared.h"
 
-const char *get_cmd_string(u8 cmd)
-{
-       switch (cmd) {
-               IWL_CMD(REPLY_ALIVE);
-               IWL_CMD(REPLY_ERROR);
-               IWL_CMD(REPLY_ECHO);
-               IWL_CMD(REPLY_RXON);
-               IWL_CMD(REPLY_RXON_ASSOC);
-               IWL_CMD(REPLY_QOS_PARAM);
-               IWL_CMD(REPLY_RXON_TIMING);
-               IWL_CMD(REPLY_ADD_STA);
-               IWL_CMD(REPLY_REMOVE_STA);
-               IWL_CMD(REPLY_REMOVE_ALL_STA);
-               IWL_CMD(REPLY_TXFIFO_FLUSH);
-               IWL_CMD(REPLY_WEPKEY);
-               IWL_CMD(REPLY_TX);
-               IWL_CMD(REPLY_LEDS_CMD);
-               IWL_CMD(REPLY_TX_LINK_QUALITY_CMD);
-               IWL_CMD(COEX_PRIORITY_TABLE_CMD);
-               IWL_CMD(COEX_MEDIUM_NOTIFICATION);
-               IWL_CMD(COEX_EVENT_CMD);
-               IWL_CMD(REPLY_QUIET_CMD);
-               IWL_CMD(REPLY_CHANNEL_SWITCH);
-               IWL_CMD(CHANNEL_SWITCH_NOTIFICATION);
-               IWL_CMD(REPLY_SPECTRUM_MEASUREMENT_CMD);
-               IWL_CMD(SPECTRUM_MEASURE_NOTIFICATION);
-               IWL_CMD(POWER_TABLE_CMD);
-               IWL_CMD(PM_SLEEP_NOTIFICATION);
-               IWL_CMD(PM_DEBUG_STATISTIC_NOTIFIC);
-               IWL_CMD(REPLY_SCAN_CMD);
-               IWL_CMD(REPLY_SCAN_ABORT_CMD);
-               IWL_CMD(SCAN_START_NOTIFICATION);
-               IWL_CMD(SCAN_RESULTS_NOTIFICATION);
-               IWL_CMD(SCAN_COMPLETE_NOTIFICATION);
-               IWL_CMD(BEACON_NOTIFICATION);
-               IWL_CMD(REPLY_TX_BEACON);
-               IWL_CMD(WHO_IS_AWAKE_NOTIFICATION);
-               IWL_CMD(QUIET_NOTIFICATION);
-               IWL_CMD(REPLY_TX_PWR_TABLE_CMD);
-               IWL_CMD(MEASURE_ABORT_NOTIFICATION);
-               IWL_CMD(REPLY_BT_CONFIG);
-               IWL_CMD(REPLY_STATISTICS_CMD);
-               IWL_CMD(STATISTICS_NOTIFICATION);
-               IWL_CMD(REPLY_CARD_STATE_CMD);
-               IWL_CMD(CARD_STATE_NOTIFICATION);
-               IWL_CMD(MISSED_BEACONS_NOTIFICATION);
-               IWL_CMD(REPLY_CT_KILL_CONFIG_CMD);
-               IWL_CMD(SENSITIVITY_CMD);
-               IWL_CMD(REPLY_PHY_CALIBRATION_CMD);
-               IWL_CMD(REPLY_RX_PHY_CMD);
-               IWL_CMD(REPLY_RX_MPDU_CMD);
-               IWL_CMD(REPLY_RX);
-               IWL_CMD(REPLY_COMPRESSED_BA);
-               IWL_CMD(CALIBRATION_CFG_CMD);
-               IWL_CMD(CALIBRATION_RES_NOTIFICATION);
-               IWL_CMD(CALIBRATION_COMPLETE_NOTIFICATION);
-               IWL_CMD(REPLY_TX_POWER_DBM_CMD);
-               IWL_CMD(TEMPERATURE_NOTIFICATION);
-               IWL_CMD(TX_ANT_CONFIGURATION_CMD);
-               IWL_CMD(REPLY_BT_COEX_PROFILE_NOTIF);
-               IWL_CMD(REPLY_BT_COEX_PRIO_TABLE);
-               IWL_CMD(REPLY_BT_COEX_PROT_ENV);
-               IWL_CMD(REPLY_WIPAN_PARAMS);
-               IWL_CMD(REPLY_WIPAN_RXON);
-               IWL_CMD(REPLY_WIPAN_RXON_TIMING);
-               IWL_CMD(REPLY_WIPAN_RXON_ASSOC);
-               IWL_CMD(REPLY_WIPAN_QOS_PARAM);
-               IWL_CMD(REPLY_WIPAN_WEPKEY);
-               IWL_CMD(REPLY_WIPAN_P2P_CHANNEL_SWITCH);
-               IWL_CMD(REPLY_WIPAN_NOA_NOTIFICATION);
-               IWL_CMD(REPLY_WIPAN_DEACTIVATION_COMPLETE);
-               IWL_CMD(REPLY_WOWLAN_PATTERNS);
-               IWL_CMD(REPLY_WOWLAN_WAKEUP_FILTER);
-               IWL_CMD(REPLY_WOWLAN_TSC_RSC_PARAMS);
-               IWL_CMD(REPLY_WOWLAN_TKIP_PARAMS);
-               IWL_CMD(REPLY_WOWLAN_KEK_KCK_MATERIAL);
-               IWL_CMD(REPLY_WOWLAN_GET_STATUS);
-               IWL_CMD(REPLY_D3_CONFIG);
-       default:
-               return "UNKNOWN";
-
-       }
-}
+#define IWL_CMD_ENTRY(x) [x] = #x
+
+const char *iwl_dvm_cmd_strings[REPLY_MAX] = {
+       IWL_CMD_ENTRY(REPLY_ALIVE),
+       IWL_CMD_ENTRY(REPLY_ERROR),
+       IWL_CMD_ENTRY(REPLY_ECHO),
+       IWL_CMD_ENTRY(REPLY_RXON),
+       IWL_CMD_ENTRY(REPLY_RXON_ASSOC),
+       IWL_CMD_ENTRY(REPLY_QOS_PARAM),
+       IWL_CMD_ENTRY(REPLY_RXON_TIMING),
+       IWL_CMD_ENTRY(REPLY_ADD_STA),
+       IWL_CMD_ENTRY(REPLY_REMOVE_STA),
+       IWL_CMD_ENTRY(REPLY_REMOVE_ALL_STA),
+       IWL_CMD_ENTRY(REPLY_TXFIFO_FLUSH),
+       IWL_CMD_ENTRY(REPLY_WEPKEY),
+       IWL_CMD_ENTRY(REPLY_TX),
+       IWL_CMD_ENTRY(REPLY_LEDS_CMD),
+       IWL_CMD_ENTRY(REPLY_TX_LINK_QUALITY_CMD),
+       IWL_CMD_ENTRY(COEX_PRIORITY_TABLE_CMD),
+       IWL_CMD_ENTRY(COEX_MEDIUM_NOTIFICATION),
+       IWL_CMD_ENTRY(COEX_EVENT_CMD),
+       IWL_CMD_ENTRY(REPLY_QUIET_CMD),
+       IWL_CMD_ENTRY(REPLY_CHANNEL_SWITCH),
+       IWL_CMD_ENTRY(CHANNEL_SWITCH_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_SPECTRUM_MEASUREMENT_CMD),
+       IWL_CMD_ENTRY(SPECTRUM_MEASURE_NOTIFICATION),
+       IWL_CMD_ENTRY(POWER_TABLE_CMD),
+       IWL_CMD_ENTRY(PM_SLEEP_NOTIFICATION),
+       IWL_CMD_ENTRY(PM_DEBUG_STATISTIC_NOTIFIC),
+       IWL_CMD_ENTRY(REPLY_SCAN_CMD),
+       IWL_CMD_ENTRY(REPLY_SCAN_ABORT_CMD),
+       IWL_CMD_ENTRY(SCAN_START_NOTIFICATION),
+       IWL_CMD_ENTRY(SCAN_RESULTS_NOTIFICATION),
+       IWL_CMD_ENTRY(SCAN_COMPLETE_NOTIFICATION),
+       IWL_CMD_ENTRY(BEACON_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_TX_BEACON),
+       IWL_CMD_ENTRY(WHO_IS_AWAKE_NOTIFICATION),
+       IWL_CMD_ENTRY(QUIET_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_TX_PWR_TABLE_CMD),
+       IWL_CMD_ENTRY(MEASURE_ABORT_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_BT_CONFIG),
+       IWL_CMD_ENTRY(REPLY_STATISTICS_CMD),
+       IWL_CMD_ENTRY(STATISTICS_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_CARD_STATE_CMD),
+       IWL_CMD_ENTRY(CARD_STATE_NOTIFICATION),
+       IWL_CMD_ENTRY(MISSED_BEACONS_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_CT_KILL_CONFIG_CMD),
+       IWL_CMD_ENTRY(SENSITIVITY_CMD),
+       IWL_CMD_ENTRY(REPLY_PHY_CALIBRATION_CMD),
+       IWL_CMD_ENTRY(REPLY_RX_PHY_CMD),
+       IWL_CMD_ENTRY(REPLY_RX_MPDU_CMD),
+       IWL_CMD_ENTRY(REPLY_RX),
+       IWL_CMD_ENTRY(REPLY_COMPRESSED_BA),
+       IWL_CMD_ENTRY(CALIBRATION_CFG_CMD),
+       IWL_CMD_ENTRY(CALIBRATION_RES_NOTIFICATION),
+       IWL_CMD_ENTRY(CALIBRATION_COMPLETE_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_TX_POWER_DBM_CMD),
+       IWL_CMD_ENTRY(TEMPERATURE_NOTIFICATION),
+       IWL_CMD_ENTRY(TX_ANT_CONFIGURATION_CMD),
+       IWL_CMD_ENTRY(REPLY_BT_COEX_PROFILE_NOTIF),
+       IWL_CMD_ENTRY(REPLY_BT_COEX_PRIO_TABLE),
+       IWL_CMD_ENTRY(REPLY_BT_COEX_PROT_ENV),
+       IWL_CMD_ENTRY(REPLY_WIPAN_PARAMS),
+       IWL_CMD_ENTRY(REPLY_WIPAN_RXON),
+       IWL_CMD_ENTRY(REPLY_WIPAN_RXON_TIMING),
+       IWL_CMD_ENTRY(REPLY_WIPAN_RXON_ASSOC),
+       IWL_CMD_ENTRY(REPLY_WIPAN_QOS_PARAM),
+       IWL_CMD_ENTRY(REPLY_WIPAN_WEPKEY),
+       IWL_CMD_ENTRY(REPLY_WIPAN_P2P_CHANNEL_SWITCH),
+       IWL_CMD_ENTRY(REPLY_WIPAN_NOA_NOTIFICATION),
+       IWL_CMD_ENTRY(REPLY_WIPAN_DEACTIVATION_COMPLETE),
+       IWL_CMD_ENTRY(REPLY_WOWLAN_PATTERNS),
+       IWL_CMD_ENTRY(REPLY_WOWLAN_WAKEUP_FILTER),
+       IWL_CMD_ENTRY(REPLY_WOWLAN_TSC_RSC_PARAMS),
+       IWL_CMD_ENTRY(REPLY_WOWLAN_TKIP_PARAMS),
+       IWL_CMD_ENTRY(REPLY_WOWLAN_KEK_KCK_MATERIAL),
+       IWL_CMD_ENTRY(REPLY_WOWLAN_GET_STATUS),
+       IWL_CMD_ENTRY(REPLY_D3_CONFIG),
+};
+#undef IWL_CMD_ENTRY
 
 /******************************************************************************
  *
        struct iwl_rx_packet *pkt = rxb_addr(rxb);
        struct iwl_error_resp *err_resp = (void *)pkt->data;
 
-       IWL_ERR(priv, "Error Reply type 0x%08X cmd %s (0x%02X) "
+       IWL_ERR(priv, "Error Reply type 0x%08X cmd REPLY_ERROR (0x%02X) "
                "seq 0x%04X ser 0x%08X\n",
                le32_to_cpu(err_resp->error_type),
-               get_cmd_string(err_resp->cmd_id),
                err_resp->cmd_id,
                le16_to_cpu(err_resp->bad_cmd_seq_num),
                le32_to_cpu(err_resp->error_info));
        u32 __maybe_unused len =
                le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
        IWL_DEBUG_RADIO(priv, "Dumping %d bytes of unhandled "
-                       "notification for %s:\n", len,
-                       get_cmd_string(pkt->hdr.cmd));
+                       "notification for PM_DEBUG_STATISTIC_NOTIFIC:\n", len);
        iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->data, len);
        return 0;
 }
                        err = priv->rx_handlers[pkt->hdr.cmd] (priv, rxb, cmd);
                } else {
                        /* No handling needed */
-                       IWL_DEBUG_RX(priv,
-                               "No handler needed for %s, 0x%02x\n",
-                               get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
+                       IWL_DEBUG_RX(priv, "No handler needed for %s, 0x%02x\n",
+                                    iwl_dvm_get_cmd_string(pkt->hdr.cmd),
+                                    pkt->hdr.cmd);
                }
        }
        return err;
 
                cmd_dest += cmd->len[i];
        }
 
-       IWL_DEBUG_HC(trans, "Sending command %s (#%x), seq: 0x%04X, "
-                       "%d bytes at %d[%d]:%d\n",
-                       get_cmd_string(out_cmd->hdr.cmd),
-                       out_cmd->hdr.cmd,
-                       le16_to_cpu(out_cmd->hdr.sequence), cmd_size,
-                       q->write_ptr, idx, trans_pcie->cmd_queue);
+       IWL_DEBUG_HC(trans,
+               "Sending command %s (#%x), seq: 0x%04X, %d bytes at %d[%d]:%d\n",
+               trans_pcie_get_cmd_string(trans_pcie, out_cmd->hdr.cmd),
+               out_cmd->hdr.cmd, le16_to_cpu(out_cmd->hdr.sequence), cmd_size,
+               q->write_ptr, idx, trans_pcie->cmd_queue);
 
        phys_addr = dma_map_single(trans->dev, &out_cmd->hdr, copy_size,
                                DMA_BIDIRECTIONAL);
                if (!test_bit(STATUS_HCMD_ACTIVE, &trans_pcie->status)) {
                        IWL_WARN(trans,
                                 "HCMD_ACTIVE already clear for command %s\n",
-                                get_cmd_string(cmd->hdr.cmd));
+                                trans_pcie_get_cmd_string(trans_pcie,
+                                                          cmd->hdr.cmd));
                }
                clear_bit(STATUS_HCMD_ACTIVE, &trans_pcie->status);
                IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n",
-                              get_cmd_string(cmd->hdr.cmd));
+                              trans_pcie_get_cmd_string(trans_pcie,
+                                                        cmd->hdr.cmd));
                wake_up(&trans->wait_command_queue);
        }
 
 
 static int iwl_send_cmd_async(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
 {
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        int ret;
 
        /* An asynchronous command can not expect an SKB to be set. */
        if (ret < 0) {
                IWL_ERR(trans,
                        "Error sending %s: enqueue_hcmd failed: %d\n",
-                         get_cmd_string(cmd->id), ret);
+                       trans_pcie_get_cmd_string(trans_pcie, cmd->id), ret);
                return ret;
        }
        return 0;
        int ret;
 
        IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n",
-                       get_cmd_string(cmd->id));
+                      trans_pcie_get_cmd_string(trans_pcie, cmd->id));
 
        if (WARN_ON(test_and_set_bit(STATUS_HCMD_ACTIVE,
                                     &trans_pcie->status))) {
                IWL_ERR(trans, "Command %s: a command is already active!\n",
-                       get_cmd_string(cmd->id));
+                       trans_pcie_get_cmd_string(trans_pcie, cmd->id));
                return -EIO;
        }
 
        IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n",
-                       get_cmd_string(cmd->id));
+                      trans_pcie_get_cmd_string(trans_pcie, cmd->id));
 
        cmd_idx = iwl_enqueue_hcmd(trans, cmd);
        if (cmd_idx < 0) {
                clear_bit(STATUS_HCMD_ACTIVE, &trans_pcie->status);
                IWL_ERR(trans,
                        "Error sending %s: enqueue_hcmd failed: %d\n",
-                         get_cmd_string(cmd->id), ret);
+                       trans_pcie_get_cmd_string(trans_pcie, cmd->id), ret);
                return ret;
        }
 
 
                        IWL_ERR(trans,
                                "Error sending %s: time out after %dms.\n",
-                               get_cmd_string(cmd->id),
+                               trans_pcie_get_cmd_string(trans_pcie, cmd->id),
                                jiffies_to_msecs(HOST_COMPLETE_TIMEOUT));
 
                        IWL_ERR(trans,
                                q->read_ptr, q->write_ptr);
 
                        clear_bit(STATUS_HCMD_ACTIVE, &trans_pcie->status);
-                       IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command"
-                                "%s\n", get_cmd_string(cmd->id));
+                       IWL_DEBUG_INFO(trans,
+                                      "Clearing HCMD_ACTIVE for command %s\n",
+                                      trans_pcie_get_cmd_string(trans_pcie,
+                                                                cmd->id));
                        ret = -ETIMEDOUT;
                        goto cancel;
                }
 
        if ((cmd->flags & CMD_WANT_SKB) && !cmd->resp_pkt) {
                IWL_ERR(trans, "Error: Response NULL in '%s'\n",
-                         get_cmd_string(cmd->id));
+                       trans_pcie_get_cmd_string(trans_pcie, cmd->id));
                ret = -EIO;
                goto cancel;
        }