|
@@ -434,7 +434,7 @@ static struct mutex g_smscore_deviceslock;
|
|
|
static struct list_head g_smscore_registry;
|
|
|
static struct mutex g_smscore_registrylock;
|
|
|
|
|
|
-static int default_mode = 4;
|
|
|
+static int default_mode = DEVICE_MODE_NONE;
|
|
|
|
|
|
module_param(default_mode, int, 0644);
|
|
|
MODULE_PARM_DESC(default_mode, "default firmware id (device mode)");
|
|
@@ -880,8 +880,15 @@ int smscore_configure_board(struct smscore_device_t *coredev)
|
|
|
*/
|
|
|
int smscore_start_device(struct smscore_device_t *coredev)
|
|
|
{
|
|
|
- int rc = smscore_set_device_mode(
|
|
|
- coredev, smscore_registry_getmode(coredev->devpath));
|
|
|
+ int rc;
|
|
|
+ int board_id = smscore_get_board_id(coredev);
|
|
|
+ int mode = smscore_registry_getmode(coredev->devpath);
|
|
|
+
|
|
|
+ /* Device is initialized as DEVICE_MODE_NONE */
|
|
|
+ if (board_id != SMS_BOARD_UNKNOWN && mode == DEVICE_MODE_NONE)
|
|
|
+ mode = sms_get_board(board_id)->default_mode;
|
|
|
+
|
|
|
+ rc = smscore_set_device_mode(coredev, mode);
|
|
|
if (rc < 0) {
|
|
|
sms_info("set device mode faile , rc %d", rc);
|
|
|
return rc;
|
|
@@ -1269,6 +1276,12 @@ static char *smscore_get_fw_filename(struct smscore_device_t *coredev,
|
|
|
|
|
|
type = smscore_registry_gettype(coredev->devpath);
|
|
|
|
|
|
+ /* Prevent looking outside the smscore_fw_lkup table */
|
|
|
+ if (type <= SMS_UNKNOWN_TYPE || type >= SMS_NUM_OF_DEVICE_TYPES)
|
|
|
+ return NULL;
|
|
|
+ if (mode <= DEVICE_MODE_NONE || mode >= DEVICE_MODE_MAX)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
if ((board_id == SMS_BOARD_UNKNOWN) || (lookup == 1)) {
|
|
|
sms_debug("trying to get fw name from lookup table mode %d type %d",
|
|
|
mode, type);
|
|
@@ -1338,7 +1351,7 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode)
|
|
|
|
|
|
sms_debug("set device mode to %d", mode);
|
|
|
if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
|
|
|
- if (mode < DEVICE_MODE_DVBT || mode >= DEVICE_MODE_RAW_TUNER) {
|
|
|
+ if (mode <= DEVICE_MODE_NONE || mode >= DEVICE_MODE_MAX) {
|
|
|
sms_err("invalid mode specified %d", mode);
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -1390,7 +1403,7 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode)
|
|
|
sms_err("device init failed, rc %d.", rc);
|
|
|
}
|
|
|
} else {
|
|
|
- if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_MAX) {
|
|
|
+ if (mode <= DEVICE_MODE_NONE || mode >= DEVICE_MODE_MAX) {
|
|
|
sms_err("invalid mode specified %d", mode);
|
|
|
return -EINVAL;
|
|
|
}
|