|
@@ -266,21 +266,17 @@ static int lbs_set_rts(struct net_device *dev, struct iw_request_info *info,
|
|
|
{
|
|
|
int ret = 0;
|
|
|
struct lbs_private *priv = dev->priv;
|
|
|
- u32 rthr = vwrq->value;
|
|
|
+ u32 val = vwrq->value;
|
|
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- if (vwrq->disabled) {
|
|
|
- priv->rtsthsd = rthr = MRVDRV_RTS_MAX_VALUE;
|
|
|
- } else {
|
|
|
- if (rthr < MRVDRV_RTS_MIN_VALUE || rthr > MRVDRV_RTS_MAX_VALUE)
|
|
|
- return -EINVAL;
|
|
|
- priv->rtsthsd = rthr;
|
|
|
- }
|
|
|
+ if (vwrq->disabled)
|
|
|
+ val = MRVDRV_RTS_MAX_VALUE;
|
|
|
+
|
|
|
+ if (val < MRVDRV_RTS_MIN_VALUE || val > MRVDRV_RTS_MAX_VALUE)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
|
|
|
- CMD_ACT_SET, CMD_OPTION_WAITFORRSP,
|
|
|
- OID_802_11_RTS_THRESHOLD, &rthr);
|
|
|
+ ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_RTS_THRESHOLD, (u16) val);
|
|
|
|
|
|
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
|
|
|
return ret;
|
|
@@ -289,21 +285,19 @@ static int lbs_set_rts(struct net_device *dev, struct iw_request_info *info,
|
|
|
static int lbs_get_rts(struct net_device *dev, struct iw_request_info *info,
|
|
|
struct iw_param *vwrq, char *extra)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
struct lbs_private *priv = dev->priv;
|
|
|
+ int ret = 0;
|
|
|
+ u16 val = 0;
|
|
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- priv->rtsthsd = 0;
|
|
|
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
|
|
|
- CMD_ACT_GET, CMD_OPTION_WAITFORRSP,
|
|
|
- OID_802_11_RTS_THRESHOLD, NULL);
|
|
|
+ ret = lbs_get_snmp_mib(priv, SNMP_MIB_OID_RTS_THRESHOLD, &val);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
- vwrq->value = priv->rtsthsd;
|
|
|
- vwrq->disabled = ((vwrq->value < MRVDRV_RTS_MIN_VALUE)
|
|
|
- || (vwrq->value > MRVDRV_RTS_MAX_VALUE));
|
|
|
+ vwrq->value = val;
|
|
|
+ vwrq->disabled = ((val < MRVDRV_RTS_MIN_VALUE)
|
|
|
+ || (val > MRVDRV_RTS_MAX_VALUE));
|
|
|
vwrq->fixed = 1;
|
|
|
|
|
|
out:
|
|
@@ -314,24 +308,19 @@ out:
|
|
|
static int lbs_set_frag(struct net_device *dev, struct iw_request_info *info,
|
|
|
struct iw_param *vwrq, char *extra)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
- u32 fthr = vwrq->value;
|
|
|
struct lbs_private *priv = dev->priv;
|
|
|
+ int ret = 0;
|
|
|
+ u32 val = vwrq->value;
|
|
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- if (vwrq->disabled) {
|
|
|
- priv->fragthsd = fthr = MRVDRV_FRAG_MAX_VALUE;
|
|
|
- } else {
|
|
|
- if (fthr < MRVDRV_FRAG_MIN_VALUE
|
|
|
- || fthr > MRVDRV_FRAG_MAX_VALUE)
|
|
|
- return -EINVAL;
|
|
|
- priv->fragthsd = fthr;
|
|
|
- }
|
|
|
+ if (vwrq->disabled)
|
|
|
+ val = MRVDRV_FRAG_MAX_VALUE;
|
|
|
+
|
|
|
+ if (val < MRVDRV_FRAG_MIN_VALUE || val > MRVDRV_FRAG_MAX_VALUE)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
|
|
|
- CMD_ACT_SET, CMD_OPTION_WAITFORRSP,
|
|
|
- OID_802_11_FRAGMENTATION_THRESHOLD, &fthr);
|
|
|
+ ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_FRAG_THRESHOLD, (u16) val);
|
|
|
|
|
|
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
|
|
|
return ret;
|
|
@@ -340,22 +329,19 @@ static int lbs_set_frag(struct net_device *dev, struct iw_request_info *info,
|
|
|
static int lbs_get_frag(struct net_device *dev, struct iw_request_info *info,
|
|
|
struct iw_param *vwrq, char *extra)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
struct lbs_private *priv = dev->priv;
|
|
|
+ int ret = 0;
|
|
|
+ u16 val = 0;
|
|
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- priv->fragthsd = 0;
|
|
|
- ret = lbs_prepare_and_send_command(priv,
|
|
|
- CMD_802_11_SNMP_MIB,
|
|
|
- CMD_ACT_GET, CMD_OPTION_WAITFORRSP,
|
|
|
- OID_802_11_FRAGMENTATION_THRESHOLD, NULL);
|
|
|
+ ret = lbs_get_snmp_mib(priv, SNMP_MIB_OID_FRAG_THRESHOLD, &val);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
- vwrq->value = priv->fragthsd;
|
|
|
- vwrq->disabled = ((vwrq->value < MRVDRV_FRAG_MIN_VALUE)
|
|
|
- || (vwrq->value > MRVDRV_FRAG_MAX_VALUE));
|
|
|
+ vwrq->value = val;
|
|
|
+ vwrq->disabled = ((val < MRVDRV_FRAG_MIN_VALUE)
|
|
|
+ || (val > MRVDRV_FRAG_MAX_VALUE));
|
|
|
vwrq->fixed = 1;
|
|
|
|
|
|
out:
|
|
@@ -382,7 +368,7 @@ static int mesh_wlan_get_mode(struct net_device *dev,
|
|
|
{
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- *uwrq = IW_MODE_REPEAT ;
|
|
|
+ *uwrq = IW_MODE_REPEAT;
|
|
|
|
|
|
lbs_deb_leave(LBS_DEB_WEXT);
|
|
|
return 0;
|
|
@@ -425,31 +411,44 @@ out:
|
|
|
static int lbs_set_retry(struct net_device *dev, struct iw_request_info *info,
|
|
|
struct iw_param *vwrq, char *extra)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
struct lbs_private *priv = dev->priv;
|
|
|
+ int ret = 0;
|
|
|
+ u16 slimit = 0, llimit = 0;
|
|
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- if (vwrq->flags == IW_RETRY_LIMIT) {
|
|
|
- /* The MAC has a 4-bit Total_Tx_Count register
|
|
|
- Total_Tx_Count = 1 + Tx_Retry_Count */
|
|
|
+ if ((vwrq->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ /* The MAC has a 4-bit Total_Tx_Count register
|
|
|
+ Total_Tx_Count = 1 + Tx_Retry_Count */
|
|
|
#define TX_RETRY_MIN 0
|
|
|
#define TX_RETRY_MAX 14
|
|
|
- if (vwrq->value < TX_RETRY_MIN || vwrq->value > TX_RETRY_MAX)
|
|
|
- return -EINVAL;
|
|
|
+ if (vwrq->value < TX_RETRY_MIN || vwrq->value > TX_RETRY_MAX)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- /* Adding 1 to convert retry count to try count */
|
|
|
- priv->txretrycount = vwrq->value + 1;
|
|
|
+ /* Add 1 to convert retry count to try count */
|
|
|
+ if (vwrq->flags & IW_RETRY_SHORT)
|
|
|
+ slimit = (u16) (vwrq->value + 1);
|
|
|
+ else if (vwrq->flags & IW_RETRY_LONG)
|
|
|
+ llimit = (u16) (vwrq->value + 1);
|
|
|
+ else
|
|
|
+ slimit = llimit = (u16) (vwrq->value + 1); /* set both */
|
|
|
|
|
|
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
|
|
|
- CMD_ACT_SET,
|
|
|
- CMD_OPTION_WAITFORRSP,
|
|
|
- OID_802_11_TX_RETRYCOUNT, NULL);
|
|
|
+ if (llimit) {
|
|
|
+ ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_LONG_RETRY_LIMIT,
|
|
|
+ llimit);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
+ if (slimit) {
|
|
|
+ /* txretrycount follows the short retry limit */
|
|
|
+ priv->txretrycount = slimit;
|
|
|
+ ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_SHORT_RETRY_LIMIT,
|
|
|
+ slimit);
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
- } else {
|
|
|
- return -EOPNOTSUPP;
|
|
|
}
|
|
|
|
|
|
out:
|
|
@@ -462,22 +461,30 @@ static int lbs_get_retry(struct net_device *dev, struct iw_request_info *info,
|
|
|
{
|
|
|
struct lbs_private *priv = dev->priv;
|
|
|
int ret = 0;
|
|
|
+ u16 val = 0;
|
|
|
|
|
|
lbs_deb_enter(LBS_DEB_WEXT);
|
|
|
|
|
|
- priv->txretrycount = 0;
|
|
|
- ret = lbs_prepare_and_send_command(priv,
|
|
|
- CMD_802_11_SNMP_MIB,
|
|
|
- CMD_ACT_GET, CMD_OPTION_WAITFORRSP,
|
|
|
- OID_802_11_TX_RETRYCOUNT, NULL);
|
|
|
- if (ret)
|
|
|
- goto out;
|
|
|
-
|
|
|
vwrq->disabled = 0;
|
|
|
- if (!vwrq->flags) {
|
|
|
- vwrq->flags = IW_RETRY_LIMIT;
|
|
|
+
|
|
|
+ if (vwrq->flags & IW_RETRY_LONG) {
|
|
|
+ ret = lbs_get_snmp_mib(priv, SNMP_MIB_OID_LONG_RETRY_LIMIT, &val);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* Subtract 1 to convert try count to retry count */
|
|
|
+ vwrq->value = val - 1;
|
|
|
+ vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
|
|
|
+ } else {
|
|
|
+ ret = lbs_get_snmp_mib(priv, SNMP_MIB_OID_SHORT_RETRY_LIMIT, &val);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* txretry count follows the short retry limit */
|
|
|
+ priv->txretrycount = val;
|
|
|
/* Subtract 1 to convert try count to retry count */
|
|
|
- vwrq->value = priv->txretrycount - 1;
|
|
|
+ vwrq->value = val - 1;
|
|
|
+ vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_SHORT;
|
|
|
}
|
|
|
|
|
|
out:
|