Commit 6eb72073 authored by Adham Abozaeid's avatar Adham Abozaeid Committed by Greg Kroah-Hartman

staging: wilc1000: validate cfg parameters before scheduling the work

Validate cfg parameters after being called by cfg80211 in set_wiphy_params
before scheduling the work executed in handle_cfg_param
Signed-off-by: default avatarAdham Abozaeid <adham.abozaeid@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 056ef758
...@@ -377,61 +377,41 @@ static void handle_cfg_param(struct work_struct *work) ...@@ -377,61 +377,41 @@ static void handle_cfg_param(struct work_struct *work)
if (param->flag & RETRY_SHORT) { if (param->flag & RETRY_SHORT) {
u16 retry_limit = param->short_retry_limit; u16 retry_limit = param->short_retry_limit;
if (retry_limit > 0 && retry_limit < 256) {
wid_list[i].id = WID_SHORT_RETRY_LIMIT; wid_list[i].id = WID_SHORT_RETRY_LIMIT;
wid_list[i].val = (s8 *)&param->short_retry_limit; wid_list[i].val = (s8 *)&param->short_retry_limit;
wid_list[i].type = WID_SHORT; wid_list[i].type = WID_SHORT;
wid_list[i].size = sizeof(u16); wid_list[i].size = sizeof(u16);
hif_drv->cfg_values.short_retry_limit = retry_limit; hif_drv->cfg_values.short_retry_limit = retry_limit;
} else {
netdev_err(vif->ndev, "Range(1~256) over\n");
goto unlock;
}
i++; i++;
} }
if (param->flag & RETRY_LONG) { if (param->flag & RETRY_LONG) {
u16 limit = param->long_retry_limit; u16 limit = param->long_retry_limit;
if (limit > 0 && limit < 256) {
wid_list[i].id = WID_LONG_RETRY_LIMIT; wid_list[i].id = WID_LONG_RETRY_LIMIT;
wid_list[i].val = (s8 *)&param->long_retry_limit; wid_list[i].val = (s8 *)&param->long_retry_limit;
wid_list[i].type = WID_SHORT; wid_list[i].type = WID_SHORT;
wid_list[i].size = sizeof(u16); wid_list[i].size = sizeof(u16);
hif_drv->cfg_values.long_retry_limit = limit; hif_drv->cfg_values.long_retry_limit = limit;
} else {
netdev_err(vif->ndev, "Range(1~256) over\n");
goto unlock;
}
i++; i++;
} }
if (param->flag & FRAG_THRESHOLD) { if (param->flag & FRAG_THRESHOLD) {
u16 frag_th = param->frag_threshold; u16 frag_th = param->frag_threshold;
if (frag_th > 255 && frag_th < 7937) {
wid_list[i].id = WID_FRAG_THRESHOLD; wid_list[i].id = WID_FRAG_THRESHOLD;
wid_list[i].val = (s8 *)&param->frag_threshold; wid_list[i].val = (s8 *)&param->frag_threshold;
wid_list[i].type = WID_SHORT; wid_list[i].type = WID_SHORT;
wid_list[i].size = sizeof(u16); wid_list[i].size = sizeof(u16);
hif_drv->cfg_values.frag_threshold = frag_th; hif_drv->cfg_values.frag_threshold = frag_th;
} else {
netdev_err(vif->ndev, "Threshold Range fail\n");
goto unlock;
}
i++; i++;
} }
if (param->flag & RTS_THRESHOLD) { if (param->flag & RTS_THRESHOLD) {
u16 rts_th = param->rts_threshold; u16 rts_th = param->rts_threshold;
if (rts_th > 255) {
wid_list[i].id = WID_RTS_THRESHOLD; wid_list[i].id = WID_RTS_THRESHOLD;
wid_list[i].val = (s8 *)&param->rts_threshold; wid_list[i].val = (s8 *)&param->rts_threshold;
wid_list[i].type = WID_SHORT; wid_list[i].type = WID_SHORT;
wid_list[i].size = sizeof(u16); wid_list[i].size = sizeof(u16);
hif_drv->cfg_values.rts_threshold = rts_th; hif_drv->cfg_values.rts_threshold = rts_th;
} else {
netdev_err(vif->ndev, "Threshold Range fail\n");
goto unlock;
}
i++; i++;
} }
...@@ -441,7 +421,6 @@ static void handle_cfg_param(struct work_struct *work) ...@@ -441,7 +421,6 @@ static void handle_cfg_param(struct work_struct *work)
if (ret) if (ret)
netdev_err(vif->ndev, "Error in setting CFG params\n"); netdev_err(vif->ndev, "Error in setting CFG params\n");
unlock:
mutex_unlock(&hif_drv->cfg_values_lock); mutex_unlock(&hif_drv->cfg_values_lock);
kfree(msg); kfree(msg);
} }
......
...@@ -1149,21 +1149,45 @@ static int set_wiphy_params(struct wiphy *wiphy, u32 changed) ...@@ -1149,21 +1149,45 @@ static int set_wiphy_params(struct wiphy *wiphy, u32 changed)
cfg_param_val.flag = 0; cfg_param_val.flag = 0;
if (changed & WIPHY_PARAM_RETRY_SHORT) { if (changed & WIPHY_PARAM_RETRY_SHORT) {
netdev_dbg(vif->ndev,
"Setting WIPHY_PARAM_RETRY_SHORT %d\n",
wiphy->retry_short);
cfg_param_val.flag |= RETRY_SHORT; cfg_param_val.flag |= RETRY_SHORT;
cfg_param_val.short_retry_limit = wiphy->retry_short; cfg_param_val.short_retry_limit = wiphy->retry_short;
} }
if (changed & WIPHY_PARAM_RETRY_LONG) { if (changed & WIPHY_PARAM_RETRY_LONG) {
netdev_dbg(vif->ndev,
"Setting WIPHY_PARAM_RETRY_LONG %d\n",
wiphy->retry_long);
cfg_param_val.flag |= RETRY_LONG; cfg_param_val.flag |= RETRY_LONG;
cfg_param_val.long_retry_limit = wiphy->retry_long; cfg_param_val.long_retry_limit = wiphy->retry_long;
} }
if (changed & WIPHY_PARAM_FRAG_THRESHOLD) { if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
if (wiphy->frag_threshold > 255 &&
wiphy->frag_threshold < 7937) {
netdev_dbg(vif->ndev,
"Setting WIPHY_PARAM_FRAG_THRESHOLD %d\n",
wiphy->frag_threshold);
cfg_param_val.flag |= FRAG_THRESHOLD; cfg_param_val.flag |= FRAG_THRESHOLD;
cfg_param_val.frag_threshold = wiphy->frag_threshold; cfg_param_val.frag_threshold = wiphy->frag_threshold;
} else {
netdev_err(vif->ndev,
"Fragmentation threshold out of range\n");
return -EINVAL;
}
} }
if (changed & WIPHY_PARAM_RTS_THRESHOLD) { if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
if (wiphy->rts_threshold > 255) {
netdev_dbg(vif->ndev,
"Setting WIPHY_PARAM_RTS_THRESHOLD %d\n",
wiphy->rts_threshold);
cfg_param_val.flag |= RTS_THRESHOLD; cfg_param_val.flag |= RTS_THRESHOLD;
cfg_param_val.rts_threshold = wiphy->rts_threshold; cfg_param_val.rts_threshold = wiphy->rts_threshold;
} else {
netdev_err(vif->ndev, "RTS threshold out of range\n");
return -EINVAL;
}
} }
ret = wilc_hif_set_cfg(vif, &cfg_param_val); ret = wilc_hif_set_cfg(vif, &cfg_param_val);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment