const struct firmware *fw;
 
        char *fw_filename = smscore_get_fw_filename(coredev, mode, lookup);
-       sms_debug("Firmware name: %s\n", fw_filename);
-       if (!strcmp(fw_filename, "none"))
+       if (!fw_filename) {
+               sms_info("mode %d not supported on this device", mode);
                return -ENOENT;
+       }
+       sms_debug("Firmware name: %s", fw_filename);
 
        if (loadfirmware_handler == NULL && !(coredev->device_flags
                        & SMS_DEVICE_FAMILY2))
        return rc;
 }
 
-static char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = {
-       /*Stellar, NOVA A0, Nova B0, VEGA, VENICE, MING, PELE, RIO, DENVER_1530, DENVER_2160 */
-               /*DVBT*/
-       { "none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none", "none", "none", "none", "dvb_rio.inp", "none", "none" },
-               /*DVBH*/
-       { "none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none", "none", "none", "none", "dvbh_rio.inp", "none", "none" },
-               /*TDMB*/
-       { "none", "tdmb_nova_12mhz.inp", "tdmb_nova_12mhz_b0.inp", "none", "none", "none", "none", "none", "none", "tdmb_denver.inp" },
-               /*DABIP*/
-       { "none", "none", "none", "none", "none", "none", "none", "none", "none", "none" },
-               /*DVBT_BDA*/
-       { "none", "dvb_nova_12mhz.inp", "dvb_nova_12mhz_b0.inp", "none", "none", "none", "none", "dvb_rio.inp", "none", "none" },
-               /*ISDBT*/
-       { "none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none", "none", "none", "isdbt_pele.inp", "isdbt_rio.inp", "none", "none" },
-               /*ISDBT_BDA*/
-       { "none", "isdbt_nova_12mhz.inp", "isdbt_nova_12mhz_b0.inp", "none", "none", "none", "isdbt_pele.inp", "isdbt_rio.inp", "none", "none" },
-               /*CMMB*/
-       { "none", "none", "none", "cmmb_vega_12mhz.inp", "cmmb_venice_12mhz.inp", "cmmb_ming_app.inp", "none", "none", "none",  "none" },
-               /*RAW - not supported*/
-       { "none", "none", "none", "none", "none", "none", "none", "none", "none", "none" },
-               /*FM*/
-       { "none", "none", "fm_radio.inp", "none", "none", "none", "none", "fm_radio_rio.inp", "none", "none" },
-               /*FM_BDA*/
-       { "none", "none", "fm_radio.inp", "none", "none", "none", "none", "fm_radio_rio.inp", "none", "none" },
-               /*ATSC*/
-       { "none", "none", "none", "none", "none", "none", "none", "none", "atsc_denver.inp", "none" }
+static char *smscore_fw_lkup[][DEVICE_MODE_MAX] = {
+       [SMS_NOVA_A0] = {
+               [DEVICE_MODE_DVBT]              = "dvb_nova_12mhz.inp",
+               [DEVICE_MODE_DVBH]              = "dvb_nova_12mhz.inp",
+               [DEVICE_MODE_DAB_TDMB]          = "tdmb_nova_12mhz.inp",
+               [DEVICE_MODE_DVBT_BDA]          = "dvb_nova_12mhz.inp",
+               [DEVICE_MODE_ISDBT]             = "isdbt_nova_12mhz.inp",
+               [DEVICE_MODE_ISDBT_BDA]         = "isdbt_nova_12mhz.inp",
+       },
+       [SMS_NOVA_B0] = {
+               [DEVICE_MODE_DVBT]              = "dvb_nova_12mhz_b0.inp",
+               [DEVICE_MODE_DVBH]              = "dvb_nova_12mhz_b0.inp",
+               [DEVICE_MODE_DAB_TDMB]          = "tdmb_nova_12mhz_b0.inp",
+               [DEVICE_MODE_DVBT_BDA]          = "dvb_nova_12mhz_b0.inp",
+               [DEVICE_MODE_ISDBT]             = "isdbt_nova_12mhz_b0.inp",
+               [DEVICE_MODE_ISDBT_BDA]         = "isdbt_nova_12mhz_b0.inp",
+               [DEVICE_MODE_FM_RADIO]          = "fm_radio.inp",
+               [DEVICE_MODE_FM_RADIO_BDA]      = "fm_radio.inp",
+       },
+       [SMS_VEGA] = {
+               [DEVICE_MODE_CMMB]              = "cmmb_vega_12mhz.inp",
+       },
+       [SMS_VENICE] = {
+               [DEVICE_MODE_CMMB]              = "cmmb_venice_12mhz.inp",
+       },
+       [SMS_MING] = {
+               [DEVICE_MODE_CMMB]              = "cmmb_ming_app.inp",
+       },
+       [SMS_PELE] = {
+               [DEVICE_MODE_ISDBT]             = "isdbt_pele.inp",
+               [DEVICE_MODE_ISDBT_BDA]         = "isdbt_pele.inp",
+       },
+       [SMS_RIO] = {
+               [DEVICE_MODE_DVBT]              = "dvb_rio.inp",
+               [DEVICE_MODE_DVBH]              = "dvbh_rio.inp",
+               [DEVICE_MODE_DVBT_BDA]          = "dvb_rio.inp",
+               [DEVICE_MODE_ISDBT]             = "isdbt_rio.inp",
+               [DEVICE_MODE_ISDBT_BDA]         = "isdbt_rio.inp",
+               [DEVICE_MODE_FM_RADIO]          = "fm_radio_rio.inp",
+               [DEVICE_MODE_FM_RADIO_BDA]      = "fm_radio_rio.inp",
+       },
+       [SMS_DENVER_1530] = {
+               [DEVICE_MODE_ATSC]              = "atsc_denver.inp",
+       },
+       [SMS_DENVER_2160] = {
+               [DEVICE_MODE_DAB_TDMB]          = "tdmb_denver.inp",
+       },
 };
 
 /**
        if ((board_id == SMS_BOARD_UNKNOWN) || (lookup == 1)) {
                sms_debug("trying to get fw name from lookup table mode %d type %d",
                          mode, type);
-               return smscore_fw_lkup[mode][type];
+               return smscore_fw_lkup[type][mode];
        }
 
        sms_debug("trying to get fw name from sms_boards board_id %d mode %d",
                  board_id, mode);
        fw = sms_get_board(board_id)->fw;
-       if (fw == NULL) {
-               sms_debug("cannot find fw name in sms_boards, getting from lookup table mode %d type %d",
-                         mode, type);
-               return smscore_fw_lkup[mode][type];
-       }
-
-       if (fw[mode] == NULL) {
+       if (!fw || !fw[mode]) {
                sms_debug("cannot find fw name in sms_boards, getting from lookup table mode %d type %d",
                          mode, type);
-               return smscore_fw_lkup[mode][type];
+               return smscore_fw_lkup[type][mode];
        }
 
        return fw[mode];