|
@@ -301,10 +301,11 @@ static int rsi_load_radio_caps(struct rsi_common *common)
|
|
|
0xf0, 0xf0, 0xf0, 0xf0,
|
|
|
0xf0, 0xf0, 0xf0, 0xf0};
|
|
|
struct sk_buff *skb;
|
|
|
+ u16 frame_len = sizeof(struct rsi_radio_caps);
|
|
|
|
|
|
rsi_dbg(INFO_ZONE, "%s: Sending rate symbol req frame\n", __func__);
|
|
|
|
|
|
- skb = dev_alloc_skb(sizeof(struct rsi_radio_caps));
|
|
|
+ skb = dev_alloc_skb(frame_len);
|
|
|
|
|
|
if (!skb) {
|
|
|
rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
|
|
@@ -312,37 +313,40 @@ static int rsi_load_radio_caps(struct rsi_common *common)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- memset(skb->data, 0, sizeof(struct rsi_radio_caps));
|
|
|
+ memset(skb->data, 0, frame_len);
|
|
|
radio_caps = (struct rsi_radio_caps *)skb->data;
|
|
|
|
|
|
- radio_caps->desc_word[1] = cpu_to_le16(RADIO_CAPABILITIES);
|
|
|
- radio_caps->desc_word[4] = cpu_to_le16(RSI_RF_TYPE << 8);
|
|
|
+ radio_caps->desc_dword0.frame_type = RADIO_CAPABILITIES;
|
|
|
+ radio_caps->channel_num = common->channel;
|
|
|
+ radio_caps->rf_model = RSI_RF_TYPE;
|
|
|
|
|
|
if (common->channel_width == BW_40MHZ) {
|
|
|
- radio_caps->desc_word[7] |= cpu_to_le16(RSI_LMAC_CLOCK_80MHZ);
|
|
|
- radio_caps->desc_word[7] |= cpu_to_le16(RSI_ENABLE_40MHZ);
|
|
|
+ radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
|
|
|
+ radio_caps->radio_cfg_info |= RSI_ENABLE_40MHZ;
|
|
|
|
|
|
if (common->fsm_state == FSM_MAC_INIT_DONE) {
|
|
|
struct ieee80211_hw *hw = adapter->hw;
|
|
|
struct ieee80211_conf *conf = &hw->conf;
|
|
|
+
|
|
|
if (conf_is_ht40_plus(conf)) {
|
|
|
- radio_caps->desc_word[5] =
|
|
|
- cpu_to_le16(LOWER_20_ENABLE);
|
|
|
- radio_caps->desc_word[5] |=
|
|
|
- cpu_to_le16(LOWER_20_ENABLE >> 12);
|
|
|
+ radio_caps->radio_cfg_info =
|
|
|
+ RSI_CMDDESC_LOWER_20_ENABLE;
|
|
|
+ radio_caps->radio_info =
|
|
|
+ RSI_CMDDESC_LOWER_20_ENABLE;
|
|
|
} else if (conf_is_ht40_minus(conf)) {
|
|
|
- radio_caps->desc_word[5] =
|
|
|
- cpu_to_le16(UPPER_20_ENABLE);
|
|
|
- radio_caps->desc_word[5] |=
|
|
|
- cpu_to_le16(UPPER_20_ENABLE >> 12);
|
|
|
+ radio_caps->radio_cfg_info =
|
|
|
+ RSI_CMDDESC_UPPER_20_ENABLE;
|
|
|
+ radio_caps->radio_info =
|
|
|
+ RSI_CMDDESC_UPPER_20_ENABLE;
|
|
|
} else {
|
|
|
- radio_caps->desc_word[5] =
|
|
|
- cpu_to_le16(BW_40MHZ << 12);
|
|
|
- radio_caps->desc_word[5] |=
|
|
|
- cpu_to_le16(FULL40M_ENABLE);
|
|
|
+ radio_caps->radio_cfg_info =
|
|
|
+ RSI_CMDDESC_40MHZ;
|
|
|
+ radio_caps->radio_info =
|
|
|
+ RSI_CMDDESC_FULL_40_ENABLE;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ radio_caps->radio_info |= radio_id;
|
|
|
|
|
|
radio_caps->sifs_tx_11n = cpu_to_le16(SIFS_TX_11N_VALUE);
|
|
|
radio_caps->sifs_tx_11b = cpu_to_le16(SIFS_TX_11B_VALUE);
|
|
@@ -351,8 +355,6 @@ static int rsi_load_radio_caps(struct rsi_common *common)
|
|
|
radio_caps->cck_ack_tout = cpu_to_le16(CCK_ACK_TOUT_VALUE);
|
|
|
radio_caps->preamble_type = cpu_to_le16(LONG_PREAMBLE);
|
|
|
|
|
|
- radio_caps->desc_word[7] |= cpu_to_le16(radio_id << 8);
|
|
|
-
|
|
|
for (ii = 0; ii < MAX_HW_QUEUES; ii++) {
|
|
|
radio_caps->qos_params[ii].cont_win_min_q = cpu_to_le16(3);
|
|
|
radio_caps->qos_params[ii].cont_win_max_q = cpu_to_le16(0x3f);
|
|
@@ -360,7 +362,7 @@ static int rsi_load_radio_caps(struct rsi_common *common)
|
|
|
radio_caps->qos_params[ii].txop_q = 0;
|
|
|
}
|
|
|
|
|
|
- for (ii = 0; ii < MAX_HW_QUEUES - 4; ii++) {
|
|
|
+ for (ii = 0; ii < NUM_EDCA_QUEUES; ii++) {
|
|
|
radio_caps->qos_params[ii].cont_win_min_q =
|
|
|
cpu_to_le16(common->edca_params[ii].cw_min);
|
|
|
radio_caps->qos_params[ii].cont_win_max_q =
|
|
@@ -371,17 +373,19 @@ static int rsi_load_radio_caps(struct rsi_common *common)
|
|
|
cpu_to_le16(common->edca_params[ii].txop);
|
|
|
}
|
|
|
|
|
|
+ radio_caps->qos_params[BROADCAST_HW_Q].txop_q = cpu_to_le16(0xffff);
|
|
|
+ radio_caps->qos_params[MGMT_HW_Q].txop_q = 0;
|
|
|
+ radio_caps->qos_params[BEACON_HW_Q].txop_q = cpu_to_le16(0xffff);
|
|
|
+
|
|
|
memcpy(&common->rate_pwr[0], &gc[0], 40);
|
|
|
for (ii = 0; ii < 20; ii++)
|
|
|
radio_caps->gcpd_per_rate[inx++] =
|
|
|
cpu_to_le16(common->rate_pwr[ii] & 0x00FF);
|
|
|
|
|
|
- radio_caps->desc_word[0] = cpu_to_le16((sizeof(struct rsi_radio_caps) -
|
|
|
- FRAME_DESC_SZ) |
|
|
|
- (RSI_WIFI_MGMT_Q << 12));
|
|
|
-
|
|
|
+ rsi_set_len_qno(&radio_caps->desc_dword0.len_qno,
|
|
|
+ (frame_len - FRAME_DESC_SZ), RSI_WIFI_MGMT_Q);
|
|
|
|
|
|
- skb_put(skb, (sizeof(struct rsi_radio_caps)));
|
|
|
+ skb_put(skb, frame_len);
|
|
|
|
|
|
return rsi_send_internal_mgmt_frame(common, skb);
|
|
|
}
|