mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 06:33:07 +00:00
rsi: RTS threshold configuration
Provision is added for configuring RTS threshold by sending vap dynamic update frame to firmware. Signed-off-by: Karun Eagalapati <karun256@gmail.com> Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
67c52a4daf
commit
80a88ecf3b
4 changed files with 55 additions and 0 deletions
|
@ -497,6 +497,15 @@ static int rsi_mac80211_config(struct ieee80211_hw *hw,
|
||||||
spin_unlock_irqrestore(&adapter->ps_lock, flags);
|
spin_unlock_irqrestore(&adapter->ps_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* RTS threshold */
|
||||||
|
if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
|
||||||
|
rsi_dbg(INFO_ZONE, "RTS threshold\n");
|
||||||
|
if ((common->rts_threshold) <= IEEE80211_MAX_RTS_THRESHOLD) {
|
||||||
|
rsi_dbg(INFO_ZONE,
|
||||||
|
"%s: Sending vap updates....\n", __func__);
|
||||||
|
status = rsi_send_vap_dynamic_update(common);
|
||||||
|
}
|
||||||
|
}
|
||||||
mutex_unlock(&common->mutex);
|
mutex_unlock(&common->mutex);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|
|
@ -1058,6 +1058,37 @@ int rsi_send_radio_params_update(struct rsi_common *common)
|
||||||
return rsi_send_internal_mgmt_frame(common, skb);
|
return rsi_send_internal_mgmt_frame(common, skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function programs the threshold. */
|
||||||
|
int rsi_send_vap_dynamic_update(struct rsi_common *common)
|
||||||
|
{
|
||||||
|
struct sk_buff *skb;
|
||||||
|
struct rsi_dynamic_s *dynamic_frame;
|
||||||
|
|
||||||
|
rsi_dbg(MGMT_TX_ZONE,
|
||||||
|
"%s: Sending vap update indication frame\n", __func__);
|
||||||
|
|
||||||
|
skb = dev_alloc_skb(sizeof(struct rsi_dynamic_s));
|
||||||
|
if (!skb)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
memset(skb->data, 0, sizeof(struct rsi_dynamic_s));
|
||||||
|
dynamic_frame = (struct rsi_dynamic_s *)skb->data;
|
||||||
|
rsi_set_len_qno(&dynamic_frame->desc_dword0.len_qno,
|
||||||
|
sizeof(dynamic_frame->frame_body), RSI_WIFI_MGMT_Q);
|
||||||
|
|
||||||
|
dynamic_frame->desc_dword0.frame_type = VAP_DYNAMIC_UPDATE;
|
||||||
|
dynamic_frame->desc_dword2.pkt_info =
|
||||||
|
cpu_to_le32(common->rts_threshold);
|
||||||
|
/* Beacon miss threshold */
|
||||||
|
dynamic_frame->frame_body.keep_alive_period =
|
||||||
|
cpu_to_le16(RSI_DEF_KEEPALIVE);
|
||||||
|
dynamic_frame->desc_dword3.sta_id = 0; /* vap id */
|
||||||
|
|
||||||
|
skb_put(skb, sizeof(struct rsi_dynamic_s));
|
||||||
|
|
||||||
|
return rsi_send_internal_mgmt_frame(common, skb);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rsi_compare() - This function is used to compare two integers
|
* rsi_compare() - This function is used to compare two integers
|
||||||
* @a: pointer to the first integer
|
* @a: pointer to the first integer
|
||||||
|
|
|
@ -58,6 +58,7 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...);
|
||||||
#define IEEE80211_ADDR_LEN 6
|
#define IEEE80211_ADDR_LEN 6
|
||||||
#define FRAME_DESC_SZ 16
|
#define FRAME_DESC_SZ 16
|
||||||
#define MIN_802_11_HDR_LEN 24
|
#define MIN_802_11_HDR_LEN 24
|
||||||
|
#define RSI_DEF_KEEPALIVE 90
|
||||||
|
|
||||||
#define DATA_QUEUE_WATER_MARK 400
|
#define DATA_QUEUE_WATER_MARK 400
|
||||||
#define MIN_DATA_QUEUE_WATER_MARK 300
|
#define MIN_DATA_QUEUE_WATER_MARK 300
|
||||||
|
|
|
@ -239,6 +239,7 @@ enum cmd_frame_type {
|
||||||
CW_MODE_REQ,
|
CW_MODE_REQ,
|
||||||
PER_CMD_PKT,
|
PER_CMD_PKT,
|
||||||
ANT_SEL_FRAME = 0x20,
|
ANT_SEL_FRAME = 0x20,
|
||||||
|
VAP_DYNAMIC_UPDATE = 0x27,
|
||||||
COMMON_DEV_CONFIG = 0x28,
|
COMMON_DEV_CONFIG = 0x28,
|
||||||
RADIO_PARAMS_UPDATE = 0x29
|
RADIO_PARAMS_UPDATE = 0x29
|
||||||
};
|
};
|
||||||
|
@ -374,6 +375,18 @@ struct rsi_ant_sel_frame {
|
||||||
__le32 reserved2;
|
__le32 reserved2;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct rsi_dynamic_s {
|
||||||
|
struct rsi_cmd_desc_dword0 desc_dword0;
|
||||||
|
struct rsi_cmd_desc_dword1 desc_dword1;
|
||||||
|
struct rsi_cmd_desc_dword2 desc_dword2;
|
||||||
|
struct rsi_cmd_desc_dword3 desc_dword3;
|
||||||
|
struct framebody {
|
||||||
|
__le16 data_rate;
|
||||||
|
__le16 mgmt_rate;
|
||||||
|
__le16 keep_alive_period;
|
||||||
|
} frame_body;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
/* Key descriptor flags */
|
/* Key descriptor flags */
|
||||||
#define RSI_KEY_TYPE_BROADCAST BIT(1)
|
#define RSI_KEY_TYPE_BROADCAST BIT(1)
|
||||||
#define RSI_WEP_KEY BIT(2)
|
#define RSI_WEP_KEY BIT(2)
|
||||||
|
@ -585,6 +598,7 @@ int rsi_hal_load_key(struct rsi_common *common, u8 *data, u16 key_len,
|
||||||
u8 key_type, u8 key_id, u32 cipher);
|
u8 key_type, u8 key_id, u32 cipher);
|
||||||
int rsi_set_channel(struct rsi_common *common,
|
int rsi_set_channel(struct rsi_common *common,
|
||||||
struct ieee80211_channel *channel);
|
struct ieee80211_channel *channel);
|
||||||
|
int rsi_send_vap_dynamic_update(struct rsi_common *common);
|
||||||
int rsi_send_block_unblock_frame(struct rsi_common *common, bool event);
|
int rsi_send_block_unblock_frame(struct rsi_common *common, bool event);
|
||||||
void rsi_inform_bss_status(struct rsi_common *common, u8 status,
|
void rsi_inform_bss_status(struct rsi_common *common, u8 status,
|
||||||
const u8 *bssid, u8 qos_enable, u16 aid);
|
const u8 *bssid, u8 qos_enable, u16 aid);
|
||||||
|
|
Loading…
Reference in a new issue