Linux Audio

Check our new training course

Linux BSP upgrade and security maintenance

Need help to get security updates for your Linux BSP?
Loading...
v4.17
   1/**
   2 * Copyright (c) 2014 Redpine Signals Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
  17#include <linux/etherdevice.h>
  18#include "rsi_mgmt.h"
  19#include "rsi_common.h"
  20#include "rsi_ps.h"
  21#include "rsi_hal.h"
  22
  23static struct bootup_params boot_params_20 = {
  24	.magic_number = cpu_to_le16(0x5aa5),
  25	.crystal_good_time = 0x0,
  26	.valid = cpu_to_le32(VALID_20),
  27	.reserved_for_valids = 0x0,
  28	.bootup_mode_info = 0x0,
  29	.digital_loop_back_params = 0x0,
  30	.rtls_timestamp_en = 0x0,
  31	.host_spi_intr_cfg = 0x0,
  32	.device_clk_info = {{
  33		.pll_config_g = {
  34			.tapll_info_g = {
  35				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_20 << 8)|
  36					      (TA_PLL_M_VAL_20)),
  37				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_20),
  38			},
  39			.pll960_info_g = {
  40				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_20 << 8)|
  41							 (PLL960_N_VAL_20)),
  42				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_20),
  43				.pll_reg_3 = 0x0,
  44			},
  45			.afepll_info_g = {
  46				.pll_reg = cpu_to_le16(0x9f0),
  47			}
  48		},
  49		.switch_clk_g = {
  50			.switch_clk_info = cpu_to_le16(0xb),
  51			.bbp_lmac_clk_reg_val = cpu_to_le16(0x111),
  52			.umac_clock_reg_config = cpu_to_le16(0x48),
  53			.qspi_uart_clock_reg_config = cpu_to_le16(0x1211)
  54		}
  55	},
  56	{
  57		.pll_config_g = {
  58			.tapll_info_g = {
  59				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_20 << 8)|
  60							 (TA_PLL_M_VAL_20)),
  61				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_20),
  62			},
  63			.pll960_info_g = {
  64				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_20 << 8)|
  65							 (PLL960_N_VAL_20)),
  66				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_20),
  67				.pll_reg_3 = 0x0,
  68			},
  69			.afepll_info_g = {
  70				.pll_reg = cpu_to_le16(0x9f0),
  71			}
  72		},
  73		.switch_clk_g = {
  74			.switch_clk_info = 0x0,
  75			.bbp_lmac_clk_reg_val = 0x0,
  76			.umac_clock_reg_config = 0x0,
  77			.qspi_uart_clock_reg_config = 0x0
  78		}
  79	},
  80	{
  81		.pll_config_g = {
  82			.tapll_info_g = {
  83				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_20 << 8)|
  84							 (TA_PLL_M_VAL_20)),
  85				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_20),
  86			},
  87			.pll960_info_g = {
  88				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_20 << 8)|
  89							 (PLL960_N_VAL_20)),
  90				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_20),
  91				.pll_reg_3 = 0x0,
  92			},
  93			.afepll_info_g = {
  94				.pll_reg = cpu_to_le16(0x9f0),
  95			}
  96		},
  97		.switch_clk_g = {
  98			.switch_clk_info = 0x0,
  99			.bbp_lmac_clk_reg_val = 0x0,
 100			.umac_clock_reg_config = 0x0,
 101			.qspi_uart_clock_reg_config = 0x0
 102		}
 103	} },
 104	.buckboost_wakeup_cnt = 0x0,
 105	.pmu_wakeup_wait = 0x0,
 106	.shutdown_wait_time = 0x0,
 107	.pmu_slp_clkout_sel = 0x0,
 108	.wdt_prog_value = 0x0,
 109	.wdt_soc_rst_delay = 0x0,
 110	.dcdc_operation_mode = 0x0,
 111	.soc_reset_wait_cnt = 0x0,
 112	.waiting_time_at_fresh_sleep = 0x0,
 113	.max_threshold_to_avoid_sleep = 0x0,
 114	.beacon_resedue_alg_en = 0,
 115};
 116
 117static struct bootup_params boot_params_40 = {
 118	.magic_number = cpu_to_le16(0x5aa5),
 119	.crystal_good_time = 0x0,
 120	.valid = cpu_to_le32(VALID_40),
 121	.reserved_for_valids = 0x0,
 122	.bootup_mode_info = 0x0,
 123	.digital_loop_back_params = 0x0,
 124	.rtls_timestamp_en = 0x0,
 125	.host_spi_intr_cfg = 0x0,
 126	.device_clk_info = {{
 127		.pll_config_g = {
 128			.tapll_info_g = {
 129				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_40 << 8)|
 130							 (TA_PLL_M_VAL_40)),
 131				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_40),
 132			},
 133			.pll960_info_g = {
 134				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_40 << 8)|
 135							 (PLL960_N_VAL_40)),
 136				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_40),
 137				.pll_reg_3 = 0x0,
 138			},
 139			.afepll_info_g = {
 140				.pll_reg = cpu_to_le16(0x9f0),
 141			}
 142		},
 143		.switch_clk_g = {
 144			.switch_clk_info = cpu_to_le16(0x09),
 145			.bbp_lmac_clk_reg_val = cpu_to_le16(0x1121),
 146			.umac_clock_reg_config = cpu_to_le16(0x48),
 147			.qspi_uart_clock_reg_config = cpu_to_le16(0x1211)
 148		}
 149	},
 150	{
 151		.pll_config_g = {
 152			.tapll_info_g = {
 153				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_40 << 8)|
 154							 (TA_PLL_M_VAL_40)),
 155				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_40),
 156			},
 157			.pll960_info_g = {
 158				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_40 << 8)|
 159							 (PLL960_N_VAL_40)),
 160				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_40),
 161				.pll_reg_3 = 0x0,
 162			},
 163			.afepll_info_g = {
 164				.pll_reg = cpu_to_le16(0x9f0),
 165			}
 166		},
 167		.switch_clk_g = {
 168			.switch_clk_info = 0x0,
 169			.bbp_lmac_clk_reg_val = 0x0,
 170			.umac_clock_reg_config = 0x0,
 171			.qspi_uart_clock_reg_config = 0x0
 172		}
 173	},
 174	{
 175		.pll_config_g = {
 176			.tapll_info_g = {
 177				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_40 << 8)|
 178							 (TA_PLL_M_VAL_40)),
 179				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_40),
 180			},
 181			.pll960_info_g = {
 182				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_40 << 8)|
 183							 (PLL960_N_VAL_40)),
 184				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_40),
 185				.pll_reg_3 = 0x0,
 186			},
 187			.afepll_info_g = {
 188				.pll_reg = cpu_to_le16(0x9f0),
 189			}
 190		},
 191		.switch_clk_g = {
 192			.switch_clk_info = 0x0,
 193			.bbp_lmac_clk_reg_val = 0x0,
 194			.umac_clock_reg_config = 0x0,
 195			.qspi_uart_clock_reg_config = 0x0
 196		}
 197	} },
 198	.buckboost_wakeup_cnt = 0x0,
 199	.pmu_wakeup_wait = 0x0,
 200	.shutdown_wait_time = 0x0,
 201	.pmu_slp_clkout_sel = 0x0,
 202	.wdt_prog_value = 0x0,
 203	.wdt_soc_rst_delay = 0x0,
 204	.dcdc_operation_mode = 0x0,
 205	.soc_reset_wait_cnt = 0x0,
 206	.waiting_time_at_fresh_sleep = 0x0,
 207	.max_threshold_to_avoid_sleep = 0x0,
 208	.beacon_resedue_alg_en = 0,
 209};
 210
 211static u16 mcs[] = {13, 26, 39, 52, 78, 104, 117, 130};
 212
 213/**
 214 * rsi_set_default_parameters() - This function sets default parameters.
 215 * @common: Pointer to the driver private structure.
 216 *
 217 * Return: none
 218 */
 219static void rsi_set_default_parameters(struct rsi_common *common)
 220{
 221	common->band = NL80211_BAND_2GHZ;
 222	common->channel_width = BW_20MHZ;
 223	common->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
 224	common->channel = 1;
 225	common->min_rate = 0xffff;
 226	common->fsm_state = FSM_CARD_NOT_READY;
 227	common->iface_down = true;
 228	common->endpoint = EP_2GHZ_20MHZ;
 229	common->driver_mode = 1; /* End to end mode */
 230	common->lp_ps_handshake_mode = 0; /* Default no handShake mode*/
 231	common->ulp_ps_handshake_mode = 2; /* Default PKT handShake mode*/
 232	common->rf_power_val = 0; /* Default 1.9V */
 233	common->wlan_rf_power_mode = 0;
 234	common->obm_ant_sel_val = 2;
 235	common->beacon_interval = RSI_BEACON_INTERVAL;
 236	common->dtim_cnt = RSI_DTIM_COUNT;
 237}
 238
 239/**
 240 * rsi_set_contention_vals() - This function sets the contention values for the
 241 *			       backoff procedure.
 242 * @common: Pointer to the driver private structure.
 243 *
 244 * Return: None.
 245 */
 246static void rsi_set_contention_vals(struct rsi_common *common)
 247{
 248	u8 ii = 0;
 249
 250	for (; ii < NUM_EDCA_QUEUES; ii++) {
 251		common->tx_qinfo[ii].wme_params =
 252			(((common->edca_params[ii].cw_min / 2) +
 253			  (common->edca_params[ii].aifs)) *
 254			  WMM_SHORT_SLOT_TIME + SIFS_DURATION);
 255		common->tx_qinfo[ii].weight = common->tx_qinfo[ii].wme_params;
 256		common->tx_qinfo[ii].pkt_contended = 0;
 257	}
 258}
 259
 260/**
 261 * rsi_send_internal_mgmt_frame() - This function sends management frames to
 262 *				    firmware.Also schedules packet to queue
 263 *				    for transmission.
 264 * @common: Pointer to the driver private structure.
 265 * @skb: Pointer to the socket buffer structure.
 266 *
 267 * Return: 0 on success, -1 on failure.
 268 */
 269static int rsi_send_internal_mgmt_frame(struct rsi_common *common,
 270					struct sk_buff *skb)
 271{
 272	struct skb_info *tx_params;
 273	struct rsi_cmd_desc *desc;
 274
 275	if (skb == NULL) {
 276		rsi_dbg(ERR_ZONE, "%s: Unable to allocate skb\n", __func__);
 277		return -ENOMEM;
 278	}
 279	desc = (struct rsi_cmd_desc *)skb->data;
 280	desc->desc_dword0.len_qno |= cpu_to_le16(DESC_IMMEDIATE_WAKEUP);
 281	skb->priority = MGMT_SOFT_Q;
 282	tx_params = (struct skb_info *)&IEEE80211_SKB_CB(skb)->driver_data;
 283	tx_params->flags |= INTERNAL_MGMT_PKT;
 284	skb_queue_tail(&common->tx_queue[MGMT_SOFT_Q], skb);
 285	rsi_set_event(&common->tx_thread.event);
 286	return 0;
 287}
 288
 289/**
 290 * rsi_load_radio_caps() - This function is used to send radio capabilities
 291 *			   values to firmware.
 292 * @common: Pointer to the driver private structure.
 293 *
 294 * Return: 0 on success, corresponding negative error code on failure.
 295 */
 296static int rsi_load_radio_caps(struct rsi_common *common)
 297{
 298	struct rsi_radio_caps *radio_caps;
 299	struct rsi_hw *adapter = common->priv;
 300	u16 inx = 0;
 301	u8 ii;
 302	u8 radio_id = 0;
 303	u16 gc[20] = {0xf0, 0xf0, 0xf0, 0xf0,
 304		      0xf0, 0xf0, 0xf0, 0xf0,
 305		      0xf0, 0xf0, 0xf0, 0xf0,
 306		      0xf0, 0xf0, 0xf0, 0xf0,
 307		      0xf0, 0xf0, 0xf0, 0xf0};
 308	struct sk_buff *skb;
 309	u16 frame_len = sizeof(struct rsi_radio_caps);
 310
 311	rsi_dbg(INFO_ZONE, "%s: Sending rate symbol req frame\n", __func__);
 312
 313	skb = dev_alloc_skb(frame_len);
 314
 315	if (!skb) {
 316		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 317			__func__);
 318		return -ENOMEM;
 319	}
 320
 321	memset(skb->data, 0, frame_len);
 322	radio_caps = (struct rsi_radio_caps *)skb->data;
 323
 324	radio_caps->desc_dword0.frame_type = RADIO_CAPABILITIES;
 325	radio_caps->channel_num = common->channel;
 326	radio_caps->rf_model = RSI_RF_TYPE;
 327
 328	if (common->channel_width == BW_40MHZ) {
 329		radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
 330		radio_caps->radio_cfg_info |= RSI_ENABLE_40MHZ;
 331
 332		if (common->fsm_state == FSM_MAC_INIT_DONE) {
 333			struct ieee80211_hw *hw = adapter->hw;
 334			struct ieee80211_conf *conf = &hw->conf;
 335
 336			if (conf_is_ht40_plus(conf)) {
 337				radio_caps->radio_cfg_info =
 338					RSI_CMDDESC_LOWER_20_ENABLE;
 339				radio_caps->radio_info =
 340					RSI_CMDDESC_LOWER_20_ENABLE;
 341			} else if (conf_is_ht40_minus(conf)) {
 342				radio_caps->radio_cfg_info =
 343					RSI_CMDDESC_UPPER_20_ENABLE;
 344				radio_caps->radio_info =
 345					RSI_CMDDESC_UPPER_20_ENABLE;
 346			} else {
 347				radio_caps->radio_cfg_info =
 348					RSI_CMDDESC_40MHZ;
 349				radio_caps->radio_info =
 350					RSI_CMDDESC_FULL_40_ENABLE;
 351			}
 352		}
 353	}
 354	radio_caps->radio_info |= radio_id;
 355
 356	radio_caps->sifs_tx_11n = cpu_to_le16(SIFS_TX_11N_VALUE);
 357	radio_caps->sifs_tx_11b = cpu_to_le16(SIFS_TX_11B_VALUE);
 358	radio_caps->slot_rx_11n = cpu_to_le16(SHORT_SLOT_VALUE);
 359	radio_caps->ofdm_ack_tout = cpu_to_le16(OFDM_ACK_TOUT_VALUE);
 360	radio_caps->cck_ack_tout = cpu_to_le16(CCK_ACK_TOUT_VALUE);
 361	radio_caps->preamble_type = cpu_to_le16(LONG_PREAMBLE);
 362
 
 
 363	for (ii = 0; ii < MAX_HW_QUEUES; ii++) {
 364		radio_caps->qos_params[ii].cont_win_min_q = cpu_to_le16(3);
 365		radio_caps->qos_params[ii].cont_win_max_q = cpu_to_le16(0x3f);
 366		radio_caps->qos_params[ii].aifsn_val_q = cpu_to_le16(2);
 367		radio_caps->qos_params[ii].txop_q = 0;
 368	}
 369
 370	for (ii = 0; ii < NUM_EDCA_QUEUES; ii++) {
 371		radio_caps->qos_params[ii].cont_win_min_q =
 372			cpu_to_le16(common->edca_params[ii].cw_min);
 373		radio_caps->qos_params[ii].cont_win_max_q =
 374			cpu_to_le16(common->edca_params[ii].cw_max);
 375		radio_caps->qos_params[ii].aifsn_val_q =
 376			cpu_to_le16((common->edca_params[ii].aifs) << 8);
 377		radio_caps->qos_params[ii].txop_q =
 378			cpu_to_le16(common->edca_params[ii].txop);
 379	}
 380
 381	radio_caps->qos_params[BROADCAST_HW_Q].txop_q = cpu_to_le16(0xffff);
 382	radio_caps->qos_params[MGMT_HW_Q].txop_q = 0;
 383	radio_caps->qos_params[BEACON_HW_Q].txop_q = cpu_to_le16(0xffff);
 384
 385	memcpy(&common->rate_pwr[0], &gc[0], 40);
 386	for (ii = 0; ii < 20; ii++)
 387		radio_caps->gcpd_per_rate[inx++] =
 388			cpu_to_le16(common->rate_pwr[ii]  & 0x00FF);
 389
 390	rsi_set_len_qno(&radio_caps->desc_dword0.len_qno,
 391			(frame_len - FRAME_DESC_SZ), RSI_WIFI_MGMT_Q);
 
 392
 393	skb_put(skb, frame_len);
 
 394
 395	return rsi_send_internal_mgmt_frame(common, skb);
 396}
 397
 398/**
 399 * rsi_mgmt_pkt_to_core() - This function is the entry point for Mgmt module.
 400 * @common: Pointer to the driver private structure.
 401 * @msg: Pointer to received packet.
 402 * @msg_len: Length of the recieved packet.
 403 * @type: Type of recieved packet.
 404 *
 405 * Return: 0 on success, -1 on failure.
 406 */
 407static int rsi_mgmt_pkt_to_core(struct rsi_common *common,
 408				u8 *msg,
 409				s32 msg_len)
 
 410{
 411	struct rsi_hw *adapter = common->priv;
 412	struct ieee80211_tx_info *info;
 413	struct skb_info *rx_params;
 414	u8 pad_bytes = msg[4];
 
 415	struct sk_buff *skb;
 
 416
 417	if (!adapter->sc_nvifs)
 418		return -ENOLINK;
 
 419
 420	msg_len -= pad_bytes;
 421	if (msg_len <= 0) {
 422		rsi_dbg(MGMT_RX_ZONE,
 423			"%s: Invalid rx msg of len = %d\n",
 424			__func__, msg_len);
 425		return -EINVAL;
 426	}
 427
 428	skb = dev_alloc_skb(msg_len);
 429	if (!skb)
 430		return -ENOMEM;
 
 
 
 
 
 
 
 
 
 
 
 431
 432	skb_put_data(skb,
 433		     (u8 *)(msg + FRAME_DESC_SZ + pad_bytes),
 434		     msg_len);
 435
 436	info = IEEE80211_SKB_CB(skb);
 437	rx_params = (struct skb_info *)info->driver_data;
 438	rx_params->rssi = rsi_get_rssi(msg);
 439	rx_params->channel = rsi_get_channel(msg);
 440	rsi_indicate_pkt_to_os(common, skb);
 441
 442	return 0;
 443}
 444
 445/**
 446 * rsi_hal_send_sta_notify_frame() - This function sends the station notify
 447 *				     frame to firmware.
 448 * @common: Pointer to the driver private structure.
 449 * @opmode: Operating mode of device.
 450 * @notify_event: Notification about station connection.
 451 * @bssid: bssid.
 452 * @qos_enable: Qos is enabled.
 453 * @aid: Aid (unique for all STA).
 454 *
 455 * Return: status: 0 on success, corresponding negative error code on failure.
 456 */
 457static int rsi_hal_send_sta_notify_frame(struct rsi_common *common,
 458					 enum opmode opmode,
 459					 u8 notify_event,
 460					 const unsigned char *bssid,
 461					 u8 qos_enable,
 462					 u16 aid,
 463					 u16 sta_id,
 464					 struct ieee80211_vif *vif)
 465{
 466	struct sk_buff *skb = NULL;
 467	struct rsi_peer_notify *peer_notify;
 468	u16 vap_id = ((struct vif_priv *)vif->drv_priv)->vap_id;
 469	int status;
 470	u16 frame_len = sizeof(struct rsi_peer_notify);
 471
 472	rsi_dbg(MGMT_TX_ZONE, "%s: Sending sta notify frame\n", __func__);
 473
 474	skb = dev_alloc_skb(frame_len);
 475
 476	if (!skb) {
 477		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 478			__func__);
 479		return -ENOMEM;
 480	}
 481
 482	memset(skb->data, 0, frame_len);
 483	peer_notify = (struct rsi_peer_notify *)skb->data;
 484
 485	if (opmode == RSI_OPMODE_STA)
 486		peer_notify->command = cpu_to_le16(PEER_TYPE_AP << 1);
 487	else if (opmode == RSI_OPMODE_AP)
 488		peer_notify->command = cpu_to_le16(PEER_TYPE_STA << 1);
 489
 490	switch (notify_event) {
 491	case STA_CONNECTED:
 492		peer_notify->command |= cpu_to_le16(RSI_ADD_PEER);
 493		break;
 494	case STA_DISCONNECTED:
 495		peer_notify->command |= cpu_to_le16(RSI_DELETE_PEER);
 496		break;
 497	default:
 498		break;
 499	}
 500
 501	peer_notify->command |= cpu_to_le16((aid & 0xfff) << 4);
 502	ether_addr_copy(peer_notify->mac_addr, bssid);
 503	peer_notify->mpdu_density = cpu_to_le16(RSI_MPDU_DENSITY);
 504	peer_notify->sta_flags = cpu_to_le32((qos_enable) ? 1 : 0);
 505
 506	rsi_set_len_qno(&peer_notify->desc.desc_dword0.len_qno,
 507			(frame_len - FRAME_DESC_SZ),
 508			RSI_WIFI_MGMT_Q);
 509	peer_notify->desc.desc_dword0.frame_type = PEER_NOTIFY;
 510	peer_notify->desc.desc_dword3.qid_tid = sta_id;
 511	peer_notify->desc.desc_dword3.sta_id = vap_id;
 512
 513	skb_put(skb, frame_len);
 514
 515	status = rsi_send_internal_mgmt_frame(common, skb);
 516
 517	if ((vif->type == NL80211_IFTYPE_STATION) &&
 518	    (!status && qos_enable)) {
 519		rsi_set_contention_vals(common);
 520		status = rsi_load_radio_caps(common);
 521	}
 522	return status;
 523}
 524
 525/**
 526 * rsi_send_aggregation_params_frame() - This function sends the ampdu
 527 *					 indication frame to firmware.
 528 * @common: Pointer to the driver private structure.
 529 * @tid: traffic identifier.
 530 * @ssn: ssn.
 531 * @buf_size: buffer size.
 532 * @event: notification about station connection.
 533 *
 534 * Return: 0 on success, corresponding negative error code on failure.
 535 */
 536int rsi_send_aggregation_params_frame(struct rsi_common *common,
 537				      u16 tid,
 538				      u16 ssn,
 539				      u8 buf_size,
 540				      u8 event,
 541				      u8 sta_id)
 542{
 543	struct sk_buff *skb = NULL;
 544	struct rsi_aggr_params *aggr_params;
 545	u16 frame_len = sizeof(struct rsi_aggr_params);
 546
 547	skb = dev_alloc_skb(frame_len);
 548
 549	if (!skb) {
 550		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 551			__func__);
 552		return -ENOMEM;
 553	}
 554
 555	memset(skb->data, 0, frame_len);
 556	aggr_params = (struct rsi_aggr_params *)skb->data;
 557
 558	rsi_dbg(MGMT_TX_ZONE, "%s: Sending AMPDU indication frame\n", __func__);
 559
 560	rsi_set_len_qno(&aggr_params->desc_dword0.len_qno, 0, RSI_WIFI_MGMT_Q);
 561	aggr_params->desc_dword0.frame_type = AMPDU_IND;
 562
 563	aggr_params->aggr_params = tid & RSI_AGGR_PARAMS_TID_MASK;
 564	aggr_params->peer_id = sta_id;
 565	if (event == STA_TX_ADDBA_DONE) {
 566		aggr_params->seq_start = cpu_to_le16(ssn);
 567		aggr_params->baw_size = cpu_to_le16(buf_size);
 568		aggr_params->aggr_params |= RSI_AGGR_PARAMS_START;
 
 569	} else if (event == STA_RX_ADDBA_DONE) {
 570		aggr_params->seq_start = cpu_to_le16(ssn);
 571		aggr_params->aggr_params |= (RSI_AGGR_PARAMS_START |
 572					     RSI_AGGR_PARAMS_RX_AGGR);
 
 
 
 
 
 
 573	} else if (event == STA_RX_DELBA) {
 574		aggr_params->aggr_params |= RSI_AGGR_PARAMS_RX_AGGR;
 
 
 
 575	}
 576
 577	skb_put(skb, frame_len);
 578
 579	return rsi_send_internal_mgmt_frame(common, skb);
 580}
 581
 582/**
 583 * rsi_program_bb_rf() - This function starts base band and RF programming.
 584 *			 This is called after initial configurations are done.
 585 * @common: Pointer to the driver private structure.
 586 *
 587 * Return: 0 on success, corresponding negative error code on failure.
 588 */
 589static int rsi_program_bb_rf(struct rsi_common *common)
 590{
 591	struct sk_buff *skb;
 592	struct rsi_bb_rf_prog *bb_rf_prog;
 593	u16 frame_len = sizeof(struct rsi_bb_rf_prog);
 594
 595	rsi_dbg(MGMT_TX_ZONE, "%s: Sending program BB/RF frame\n", __func__);
 596
 597	skb = dev_alloc_skb(frame_len);
 598	if (!skb) {
 599		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 600			__func__);
 601		return -ENOMEM;
 602	}
 603
 604	memset(skb->data, 0, frame_len);
 605	bb_rf_prog = (struct rsi_bb_rf_prog *)skb->data;
 606
 607	rsi_set_len_qno(&bb_rf_prog->desc_dword0.len_qno, 0, RSI_WIFI_MGMT_Q);
 608	bb_rf_prog->desc_dword0.frame_type = BBP_PROG_IN_TA;
 609	bb_rf_prog->endpoint = common->endpoint;
 610	bb_rf_prog->rf_power_mode = common->wlan_rf_power_mode;
 611
 612	if (common->rf_reset) {
 613		bb_rf_prog->flags =  cpu_to_le16(RF_RESET_ENABLE);
 614		rsi_dbg(MGMT_TX_ZONE, "%s: ===> RF RESET REQUEST SENT <===\n",
 615			__func__);
 616		common->rf_reset = 0;
 617	}
 618	common->bb_rf_prog_count = 1;
 619	bb_rf_prog->flags |= cpu_to_le16(PUT_BBP_RESET | BBP_REG_WRITE |
 620					 (RSI_RF_TYPE << 4));
 621	skb_put(skb, frame_len);
 622
 623	return rsi_send_internal_mgmt_frame(common, skb);
 624}
 625
 626/**
 627 * rsi_set_vap_capabilities() - This function send vap capability to firmware.
 628 * @common: Pointer to the driver private structure.
 629 * @opmode: Operating mode of device.
 630 *
 631 * Return: 0 on success, corresponding negative error code on failure.
 632 */
 633int rsi_set_vap_capabilities(struct rsi_common *common,
 634			     enum opmode mode,
 635			     u8 *mac_addr,
 636			     u8 vap_id,
 637			     u8 vap_status)
 638{
 639	struct sk_buff *skb = NULL;
 640	struct rsi_vap_caps *vap_caps;
 641	struct rsi_hw *adapter = common->priv;
 642	struct ieee80211_hw *hw = adapter->hw;
 643	struct ieee80211_conf *conf = &hw->conf;
 644	u16 frame_len = sizeof(struct rsi_vap_caps);
 645
 646	rsi_dbg(MGMT_TX_ZONE, "%s: Sending VAP capabilities frame\n", __func__);
 647
 648	skb = dev_alloc_skb(frame_len);
 649	if (!skb) {
 650		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 651			__func__);
 652		return -ENOMEM;
 653	}
 654
 655	memset(skb->data, 0, frame_len);
 656	vap_caps = (struct rsi_vap_caps *)skb->data;
 657
 658	rsi_set_len_qno(&vap_caps->desc_dword0.len_qno,
 659			(frame_len - FRAME_DESC_SZ), RSI_WIFI_MGMT_Q);
 660	vap_caps->desc_dword0.frame_type = VAP_CAPABILITIES;
 661	vap_caps->status = vap_status;
 662	vap_caps->vif_type = mode;
 663	vap_caps->channel_bw = common->channel_width;
 664	vap_caps->vap_id = vap_id;
 665	vap_caps->radioid_macid = ((common->mac_id & 0xf) << 4) |
 666				   (common->radio_id & 0xf);
 
 667
 668	memcpy(vap_caps->mac_addr, mac_addr, IEEE80211_ADDR_LEN);
 669	vap_caps->keep_alive_period = cpu_to_le16(90);
 670	vap_caps->frag_threshold = cpu_to_le16(IEEE80211_MAX_FRAG_THRESHOLD);
 671
 672	vap_caps->rts_threshold = cpu_to_le16(common->rts_threshold);
 
 673
 674	if (common->band == NL80211_BAND_5GHZ) {
 675		vap_caps->default_ctrl_rate = cpu_to_le16(RSI_RATE_6);
 676		vap_caps->default_mgmt_rate = cpu_to_le32(RSI_RATE_6);
 
 
 
 677	} else {
 678		vap_caps->default_ctrl_rate = cpu_to_le16(RSI_RATE_1);
 679		vap_caps->default_mgmt_rate = cpu_to_le32(RSI_RATE_1);
 680	}
 681	if (conf_is_ht40(conf)) {
 682		if (conf_is_ht40_minus(conf))
 683			vap_caps->ctrl_rate_flags =
 684				cpu_to_le16(UPPER_20_ENABLE);
 685		else if (conf_is_ht40_plus(conf))
 686			vap_caps->ctrl_rate_flags =
 687				cpu_to_le16(LOWER_20_ENABLE);
 688		else
 689			vap_caps->ctrl_rate_flags =
 690				cpu_to_le16(FULL40M_ENABLE);
 691	}
 692
 693	vap_caps->default_data_rate = 0;
 694	vap_caps->beacon_interval = cpu_to_le16(common->beacon_interval);
 695	vap_caps->dtim_period = cpu_to_le16(common->dtim_cnt);
 696
 697	skb_put(skb, frame_len);
 698
 699	return rsi_send_internal_mgmt_frame(common, skb);
 700}
 701
 702/**
 703 * rsi_hal_load_key() - This function is used to load keys within the firmware.
 704 * @common: Pointer to the driver private structure.
 705 * @data: Pointer to the key data.
 706 * @key_len: Key length to be loaded.
 707 * @key_type: Type of key: GROUP/PAIRWISE.
 708 * @key_id: Key index.
 709 * @cipher: Type of cipher used.
 710 *
 711 * Return: 0 on success, -1 on failure.
 712 */
 713int rsi_hal_load_key(struct rsi_common *common,
 714		     u8 *data,
 715		     u16 key_len,
 716		     u8 key_type,
 717		     u8 key_id,
 718		     u32 cipher,
 719		     s16 sta_id,
 720		     struct ieee80211_vif *vif)
 721{
 722	struct sk_buff *skb = NULL;
 723	struct rsi_set_key *set_key;
 724	u16 key_descriptor = 0;
 725	u16 frame_len = sizeof(struct rsi_set_key);
 726
 727	rsi_dbg(MGMT_TX_ZONE, "%s: Sending load key frame\n", __func__);
 728
 729	skb = dev_alloc_skb(frame_len);
 730	if (!skb) {
 731		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 732			__func__);
 733		return -ENOMEM;
 734	}
 735
 736	memset(skb->data, 0, frame_len);
 737	set_key = (struct rsi_set_key *)skb->data;
 738
 739	if (key_type == RSI_GROUP_KEY) {
 740		key_descriptor = RSI_KEY_TYPE_BROADCAST;
 741		if (vif->type == NL80211_IFTYPE_AP)
 742			key_descriptor |= RSI_KEY_MODE_AP;
 743	}
 744	if ((cipher == WLAN_CIPHER_SUITE_WEP40) ||
 745	    (cipher == WLAN_CIPHER_SUITE_WEP104)) {
 746		key_id = 0;
 747		key_descriptor |= RSI_WEP_KEY;
 748		if (key_len >= 13)
 749			key_descriptor |= RSI_WEP_KEY_104;
 750	} else if (cipher != KEY_TYPE_CLEAR) {
 751		key_descriptor |= RSI_CIPHER_WPA;
 
 
 752		if (cipher == WLAN_CIPHER_SUITE_TKIP)
 753			key_descriptor |= RSI_CIPHER_TKIP;
 754	}
 755	key_descriptor |= RSI_PROTECT_DATA_FRAMES;
 756	key_descriptor |= ((key_id << RSI_KEY_ID_OFFSET) & RSI_KEY_ID_MASK);
 757
 758	rsi_set_len_qno(&set_key->desc_dword0.len_qno,
 759			(frame_len - FRAME_DESC_SZ), RSI_WIFI_MGMT_Q);
 760	set_key->desc_dword0.frame_type = SET_KEY_REQ;
 761	set_key->key_desc = cpu_to_le16(key_descriptor);
 762	set_key->sta_id = sta_id;
 763
 764	if (data) {
 765		if ((cipher == WLAN_CIPHER_SUITE_WEP40) ||
 766		    (cipher == WLAN_CIPHER_SUITE_WEP104)) {
 767			memcpy(&set_key->key[key_id][1], data, key_len * 2);
 768		} else {
 769			memcpy(&set_key->key[0][0], data, key_len);
 770		}
 771		memcpy(set_key->tx_mic_key, &data[16], 8);
 772		memcpy(set_key->rx_mic_key, &data[24], 8);
 773	} else {
 774		memset(&set_key[FRAME_DESC_SZ], 0, frame_len - FRAME_DESC_SZ);
 775	}
 776
 777	skb_put(skb, frame_len);
 778
 779	return rsi_send_internal_mgmt_frame(common, skb);
 780}
 781
 782/*
 783 * This function sends the common device configuration parameters to device.
 784 * This frame includes the useful information to make device works on
 785 * specific operating mode.
 786 */
 787static int rsi_send_common_dev_params(struct rsi_common *common)
 788{
 789	struct sk_buff *skb;
 790	u16 frame_len;
 791	struct rsi_config_vals *dev_cfgs;
 792
 793	frame_len = sizeof(struct rsi_config_vals);
 794
 795	rsi_dbg(MGMT_TX_ZONE, "Sending common device config params\n");
 796	skb = dev_alloc_skb(frame_len);
 797	if (!skb) {
 798		rsi_dbg(ERR_ZONE, "%s: Unable to allocate skb\n", __func__);
 799		return -ENOMEM;
 800	}
 801
 802	memset(skb->data, 0, frame_len);
 803
 804	dev_cfgs = (struct rsi_config_vals *)skb->data;
 805	memset(dev_cfgs, 0, (sizeof(struct rsi_config_vals)));
 806
 807	rsi_set_len_qno(&dev_cfgs->len_qno, (frame_len - FRAME_DESC_SZ),
 808			RSI_COEX_Q);
 809	dev_cfgs->pkt_type = COMMON_DEV_CONFIG;
 810
 811	dev_cfgs->lp_ps_handshake = common->lp_ps_handshake_mode;
 812	dev_cfgs->ulp_ps_handshake = common->ulp_ps_handshake_mode;
 813
 814	dev_cfgs->unused_ulp_gpio = RSI_UNUSED_ULP_GPIO_BITMAP;
 815	dev_cfgs->unused_soc_gpio_bitmap =
 816				cpu_to_le32(RSI_UNUSED_SOC_GPIO_BITMAP);
 817
 818	dev_cfgs->opermode = common->oper_mode;
 819	dev_cfgs->wlan_rf_pwr_mode = common->wlan_rf_power_mode;
 820	dev_cfgs->driver_mode = common->driver_mode;
 821	dev_cfgs->region_code = NL80211_DFS_FCC;
 822	dev_cfgs->antenna_sel_val = common->obm_ant_sel_val;
 823
 824	skb_put(skb, frame_len);
 825
 826	return rsi_send_internal_mgmt_frame(common, skb);
 827}
 828
 829/*
 830 * rsi_load_bootup_params() - This function send bootup params to the firmware.
 831 * @common: Pointer to the driver private structure.
 832 *
 833 * Return: 0 on success, corresponding error code on failure.
 834 */
 835static int rsi_load_bootup_params(struct rsi_common *common)
 836{
 837	struct sk_buff *skb;
 838	struct rsi_boot_params *boot_params;
 839
 840	rsi_dbg(MGMT_TX_ZONE, "%s: Sending boot params frame\n", __func__);
 841	skb = dev_alloc_skb(sizeof(struct rsi_boot_params));
 842	if (!skb) {
 843		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 844			__func__);
 845		return -ENOMEM;
 846	}
 847
 848	memset(skb->data, 0, sizeof(struct rsi_boot_params));
 849	boot_params = (struct rsi_boot_params *)skb->data;
 850
 851	rsi_dbg(MGMT_TX_ZONE, "%s:\n", __func__);
 852
 853	if (common->channel_width == BW_40MHZ) {
 854		memcpy(&boot_params->bootup_params,
 855		       &boot_params_40,
 856		       sizeof(struct bootup_params));
 857		rsi_dbg(MGMT_TX_ZONE, "%s: Packet 40MHZ <=== %d\n", __func__,
 858			UMAC_CLK_40BW);
 859		boot_params->desc_word[7] = cpu_to_le16(UMAC_CLK_40BW);
 860	} else {
 861		memcpy(&boot_params->bootup_params,
 862		       &boot_params_20,
 863		       sizeof(struct bootup_params));
 864		if (boot_params_20.valid != cpu_to_le32(VALID_20)) {
 865			boot_params->desc_word[7] = cpu_to_le16(UMAC_CLK_20BW);
 866			rsi_dbg(MGMT_TX_ZONE,
 867				"%s: Packet 20MHZ <=== %d\n", __func__,
 868				UMAC_CLK_20BW);
 869		} else {
 870			boot_params->desc_word[7] = cpu_to_le16(UMAC_CLK_40MHZ);
 871			rsi_dbg(MGMT_TX_ZONE,
 872				"%s: Packet 20MHZ <=== %d\n", __func__,
 873				UMAC_CLK_40MHZ);
 874		}
 875	}
 876
 877	/**
 878	 * Bit{0:11} indicates length of the Packet
 879	 * Bit{12:15} indicates host queue number
 880	 */
 881	boot_params->desc_word[0] = cpu_to_le16(sizeof(struct bootup_params) |
 882				    (RSI_WIFI_MGMT_Q << 12));
 883	boot_params->desc_word[1] = cpu_to_le16(BOOTUP_PARAMS_REQUEST);
 884
 885	skb_put(skb, sizeof(struct rsi_boot_params));
 886
 887	return rsi_send_internal_mgmt_frame(common, skb);
 888}
 889
 890/**
 891 * rsi_send_reset_mac() - This function prepares reset MAC request and sends an
 892 *			  internal management frame to indicate it to firmware.
 893 * @common: Pointer to the driver private structure.
 894 *
 895 * Return: 0 on success, corresponding error code on failure.
 896 */
 897static int rsi_send_reset_mac(struct rsi_common *common)
 898{
 899	struct sk_buff *skb;
 900	struct rsi_mac_frame *mgmt_frame;
 901
 902	rsi_dbg(MGMT_TX_ZONE, "%s: Sending reset MAC frame\n", __func__);
 903
 904	skb = dev_alloc_skb(FRAME_DESC_SZ);
 905	if (!skb) {
 906		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 907			__func__);
 908		return -ENOMEM;
 909	}
 910
 911	memset(skb->data, 0, FRAME_DESC_SZ);
 912	mgmt_frame = (struct rsi_mac_frame *)skb->data;
 913
 914	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 915	mgmt_frame->desc_word[1] = cpu_to_le16(RESET_MAC_REQ);
 916	mgmt_frame->desc_word[4] = cpu_to_le16(RETRY_COUNT << 8);
 917
 918	skb_put(skb, FRAME_DESC_SZ);
 919
 920	return rsi_send_internal_mgmt_frame(common, skb);
 921}
 922
 923/**
 924 * rsi_band_check() - This function programs the band
 925 * @common: Pointer to the driver private structure.
 926 *
 927 * Return: 0 on success, corresponding error code on failure.
 928 */
 929int rsi_band_check(struct rsi_common *common,
 930		   struct ieee80211_channel *curchan)
 931{
 932	struct rsi_hw *adapter = common->priv;
 933	struct ieee80211_hw *hw = adapter->hw;
 934	u8 prev_bw = common->channel_width;
 935	u8 prev_ep = common->endpoint;
 
 936	int status = 0;
 937
 938	if (common->band != curchan->band) {
 939		common->rf_reset = 1;
 940		common->band = curchan->band;
 941	}
 942
 943	if ((hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) ||
 944	    (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20))
 945		common->channel_width = BW_20MHZ;
 946	else
 947		common->channel_width = BW_40MHZ;
 948
 949	if (common->band == NL80211_BAND_2GHZ) {
 950		if (common->channel_width)
 951			common->endpoint = EP_2GHZ_40MHZ;
 952		else
 953			common->endpoint = EP_2GHZ_20MHZ;
 954	} else {
 955		if (common->channel_width)
 956			common->endpoint = EP_5GHZ_40MHZ;
 957		else
 958			common->endpoint = EP_5GHZ_20MHZ;
 959	}
 960
 961	if (common->endpoint != prev_ep) {
 962		status = rsi_program_bb_rf(common);
 963		if (status)
 964			return status;
 965	}
 966
 967	if (common->channel_width != prev_bw) {
 968		status = rsi_load_bootup_params(common);
 969		if (status)
 970			return status;
 971
 972		status = rsi_load_radio_caps(common);
 973		if (status)
 974			return status;
 975	}
 976
 977	return status;
 978}
 979
 980/**
 981 * rsi_set_channel() - This function programs the channel.
 982 * @common: Pointer to the driver private structure.
 983 * @channel: Channel value to be set.
 984 *
 985 * Return: 0 on success, corresponding error code on failure.
 986 */
 987int rsi_set_channel(struct rsi_common *common,
 988		    struct ieee80211_channel *channel)
 989{
 990	struct sk_buff *skb = NULL;
 991	struct rsi_chan_config *chan_cfg;
 992	u16 frame_len = sizeof(struct rsi_chan_config);
 993
 994	rsi_dbg(MGMT_TX_ZONE,
 995		"%s: Sending scan req frame\n", __func__);
 996
 997	skb = dev_alloc_skb(frame_len);
 998	if (!skb) {
 999		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1000			__func__);
1001		return -ENOMEM;
1002	}
1003
1004	if (!channel) {
1005		dev_kfree_skb(skb);
1006		return 0;
1007	}
1008	memset(skb->data, 0, frame_len);
1009	chan_cfg = (struct rsi_chan_config *)skb->data;
1010
1011	rsi_set_len_qno(&chan_cfg->desc_dword0.len_qno, 0, RSI_WIFI_MGMT_Q);
1012	chan_cfg->desc_dword0.frame_type = SCAN_REQUEST;
1013	chan_cfg->channel_number = channel->hw_value;
1014	chan_cfg->antenna_gain_offset_2g = channel->max_antenna_gain;
1015	chan_cfg->antenna_gain_offset_5g = channel->max_antenna_gain;
1016	chan_cfg->region_rftype = (RSI_RF_TYPE & 0xf) << 4;
1017
1018	if ((channel->flags & IEEE80211_CHAN_NO_IR) ||
1019	    (channel->flags & IEEE80211_CHAN_RADAR)) {
1020		chan_cfg->antenna_gain_offset_2g |= RSI_CHAN_RADAR;
1021	} else {
 
 
 
 
1022		if (common->tx_power < channel->max_power)
1023			chan_cfg->tx_power = cpu_to_le16(common->tx_power);
1024		else
1025			chan_cfg->tx_power = cpu_to_le16(channel->max_power);
1026	}
1027	chan_cfg->region_rftype |= (common->priv->dfs_region & 0xf);
1028
1029	if (common->channel_width == BW_40MHZ)
1030		chan_cfg->channel_width = 0x1;
1031
1032	common->channel = channel->hw_value;
1033
1034	skb_put(skb, frame_len);
1035
1036	return rsi_send_internal_mgmt_frame(common, skb);
1037}
1038
1039/**
1040 * rsi_send_radio_params_update() - This function sends the radio
1041 *				parameters update to device
1042 * @common: Pointer to the driver private structure.
1043 * @channel: Channel value to be set.
1044 *
1045 * Return: 0 on success, corresponding error code on failure.
1046 */
1047int rsi_send_radio_params_update(struct rsi_common *common)
1048{
1049	struct rsi_mac_frame *cmd_frame;
1050	struct sk_buff *skb = NULL;
1051
1052	rsi_dbg(MGMT_TX_ZONE,
1053		"%s: Sending Radio Params update frame\n", __func__);
1054
1055	skb = dev_alloc_skb(FRAME_DESC_SZ);
1056	if (!skb) {
1057		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1058			__func__);
1059		return -ENOMEM;
1060	}
1061
1062	memset(skb->data, 0, FRAME_DESC_SZ);
1063	cmd_frame = (struct rsi_mac_frame *)skb->data;
1064
1065	cmd_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
1066	cmd_frame->desc_word[1] = cpu_to_le16(RADIO_PARAMS_UPDATE);
1067	cmd_frame->desc_word[3] = cpu_to_le16(BIT(0));
1068
1069	cmd_frame->desc_word[3] |= cpu_to_le16(common->tx_power << 8);
1070
1071	skb_put(skb, FRAME_DESC_SZ);
1072
1073	return rsi_send_internal_mgmt_frame(common, skb);
1074}
1075
1076/* This function programs the threshold. */
1077int rsi_send_vap_dynamic_update(struct rsi_common *common)
1078{
1079	struct sk_buff *skb;
1080	struct rsi_dynamic_s *dynamic_frame;
1081
1082	rsi_dbg(MGMT_TX_ZONE,
1083		"%s: Sending vap update indication frame\n", __func__);
1084
1085	skb = dev_alloc_skb(sizeof(struct rsi_dynamic_s));
1086	if (!skb)
1087		return -ENOMEM;
1088
1089	memset(skb->data, 0, sizeof(struct rsi_dynamic_s));
1090	dynamic_frame = (struct rsi_dynamic_s *)skb->data;
1091	rsi_set_len_qno(&dynamic_frame->desc_dword0.len_qno,
1092			sizeof(dynamic_frame->frame_body), RSI_WIFI_MGMT_Q);
1093
1094	dynamic_frame->desc_dword0.frame_type = VAP_DYNAMIC_UPDATE;
1095	dynamic_frame->desc_dword2.pkt_info =
1096					cpu_to_le32(common->rts_threshold);
1097
1098	if (common->wow_flags & RSI_WOW_ENABLED) {
1099		/* Beacon miss threshold */
1100		dynamic_frame->desc_dword3.token =
1101					cpu_to_le16(RSI_BCN_MISS_THRESHOLD);
1102		dynamic_frame->frame_body.keep_alive_period =
1103					cpu_to_le16(RSI_WOW_KEEPALIVE);
1104	} else {
1105		dynamic_frame->frame_body.keep_alive_period =
1106					cpu_to_le16(RSI_DEF_KEEPALIVE);
1107	}
1108
1109	dynamic_frame->desc_dword3.sta_id = 0; /* vap id */
1110
1111	skb_put(skb, sizeof(struct rsi_dynamic_s));
1112
1113	return rsi_send_internal_mgmt_frame(common, skb);
1114}
1115
1116/**
1117 * rsi_compare() - This function is used to compare two integers
1118 * @a: pointer to the first integer
1119 * @b: pointer to the second integer
1120 *
1121 * Return: 0 if both are equal, -1 if the first is smaller, else 1
1122 */
1123static int rsi_compare(const void *a, const void *b)
1124{
1125	u16 _a = *(const u16 *)(a);
1126	u16 _b = *(const u16 *)(b);
1127
1128	if (_a > _b)
1129		return -1;
1130
1131	if (_a < _b)
1132		return 1;
1133
1134	return 0;
1135}
1136
1137/**
1138 * rsi_map_rates() - This function is used to map selected rates to hw rates.
1139 * @rate: The standard rate to be mapped.
1140 * @offset: Offset that will be returned.
1141 *
1142 * Return: 0 if it is a mcs rate, else 1
1143 */
1144static bool rsi_map_rates(u16 rate, int *offset)
1145{
1146	int kk;
1147	for (kk = 0; kk < ARRAY_SIZE(rsi_mcsrates); kk++) {
1148		if (rate == mcs[kk]) {
1149			*offset = kk;
1150			return false;
1151		}
1152	}
1153
1154	for (kk = 0; kk < ARRAY_SIZE(rsi_rates); kk++) {
1155		if (rate == rsi_rates[kk].bitrate / 5) {
1156			*offset = kk;
1157			break;
1158		}
1159	}
1160	return true;
1161}
1162
1163/**
1164 * rsi_send_auto_rate_request() - This function is to set rates for connection
1165 *				  and send autorate request to firmware.
1166 * @common: Pointer to the driver private structure.
1167 *
1168 * Return: 0 on success, corresponding error code on failure.
1169 */
1170static int rsi_send_auto_rate_request(struct rsi_common *common,
1171				      struct ieee80211_sta *sta,
1172				      u16 sta_id,
1173				      struct ieee80211_vif *vif)
1174{
1175	struct sk_buff *skb;
1176	struct rsi_auto_rate *auto_rate;
1177	int ii = 0, jj = 0, kk = 0;
1178	struct ieee80211_hw *hw = common->priv->hw;
1179	u8 band = hw->conf.chandef.chan->band;
1180	u8 num_supported_rates = 0;
1181	u8 rate_table_offset, rate_offset = 0;
1182	u32 rate_bitmap;
1183	u16 *selected_rates, min_rate;
1184	bool is_ht = false, is_sgi = false;
1185	u16 frame_len = sizeof(struct rsi_auto_rate);
1186
1187	rsi_dbg(MGMT_TX_ZONE,
1188		"%s: Sending auto rate request frame\n", __func__);
1189
1190	skb = dev_alloc_skb(frame_len);
1191	if (!skb) {
1192		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1193			__func__);
1194		return -ENOMEM;
1195	}
1196
1197	selected_rates = kzalloc(2 * RSI_TBL_SZ, GFP_KERNEL);
1198	if (!selected_rates) {
1199		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of mem\n",
1200			__func__);
1201		dev_kfree_skb(skb);
1202		return -ENOMEM;
1203	}
1204
 
 
1205	auto_rate = (struct rsi_auto_rate *)skb->data;
1206
1207	auto_rate->aarf_rssi = cpu_to_le16(((u16)3 << 6) | (u16)(18 & 0x3f));
1208	auto_rate->collision_tolerance = cpu_to_le16(3);
1209	auto_rate->failure_limit = cpu_to_le16(3);
1210	auto_rate->initial_boundary = cpu_to_le16(3);
1211	auto_rate->max_threshold_limt = cpu_to_le16(27);
1212
1213	auto_rate->desc.desc_dword0.frame_type = AUTO_RATE_IND;
1214
1215	if (common->channel_width == BW_40MHZ)
1216		auto_rate->desc.desc_dword3.qid_tid = BW_40MHZ;
1217	auto_rate->desc.desc_dword3.sta_id = sta_id;
1218
1219	if (vif->type == NL80211_IFTYPE_STATION) {
1220		rate_bitmap = common->bitrate_mask[band];
1221		is_ht = common->vif_info[0].is_ht;
1222		is_sgi = common->vif_info[0].sgi;
1223	} else {
1224		rate_bitmap = sta->supp_rates[band];
1225		is_ht = sta->ht_cap.ht_supported;
1226		if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
1227		    (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
1228			is_sgi = true;
1229	}
1230
1231	if (band == NL80211_BAND_2GHZ) {
1232		if ((rate_bitmap == 0) && (is_ht))
1233			min_rate = RSI_RATE_MCS0;
1234		else
1235			min_rate = RSI_RATE_1;
1236		rate_table_offset = 0;
1237	} else {
1238		if ((rate_bitmap == 0) && (is_ht))
1239			min_rate = RSI_RATE_MCS0;
1240		else
1241			min_rate = RSI_RATE_6;
1242		rate_table_offset = 4;
1243	}
1244
1245	for (ii = 0, jj = 0;
1246	     ii < (ARRAY_SIZE(rsi_rates) - rate_table_offset); ii++) {
1247		if (rate_bitmap & BIT(ii)) {
1248			selected_rates[jj++] =
1249			(rsi_rates[ii + rate_table_offset].bitrate / 5);
1250			rate_offset++;
1251		}
1252	}
1253	num_supported_rates = jj;
1254
1255	if (is_ht) {
1256		for (ii = 0; ii < ARRAY_SIZE(mcs); ii++)
1257			selected_rates[jj++] = mcs[ii];
1258		num_supported_rates += ARRAY_SIZE(mcs);
1259		rate_offset += ARRAY_SIZE(mcs);
1260	}
1261
1262	sort(selected_rates, jj, sizeof(u16), &rsi_compare, NULL);
1263
1264	/* mapping the rates to RSI rates */
1265	for (ii = 0; ii < jj; ii++) {
1266		if (rsi_map_rates(selected_rates[ii], &kk)) {
1267			auto_rate->supported_rates[ii] =
1268				cpu_to_le16(rsi_rates[kk].hw_value);
1269		} else {
1270			auto_rate->supported_rates[ii] =
1271				cpu_to_le16(rsi_mcsrates[kk]);
1272		}
1273	}
1274
1275	/* loading HT rates in the bottom half of the auto rate table */
1276	if (is_ht) {
1277		for (ii = rate_offset, kk = ARRAY_SIZE(rsi_mcsrates) - 1;
1278		     ii < rate_offset + 2 * ARRAY_SIZE(rsi_mcsrates); ii++) {
1279			if (is_sgi || conf_is_ht40(&common->priv->hw->conf))
 
1280				auto_rate->supported_rates[ii++] =
1281					cpu_to_le16(rsi_mcsrates[kk] | BIT(9));
1282			else
1283				auto_rate->supported_rates[ii++] =
1284					cpu_to_le16(rsi_mcsrates[kk]);
1285			auto_rate->supported_rates[ii] =
1286				cpu_to_le16(rsi_mcsrates[kk--]);
1287		}
1288
1289		for (; ii < (RSI_TBL_SZ - 1); ii++) {
1290			auto_rate->supported_rates[ii] =
1291				cpu_to_le16(rsi_mcsrates[0]);
1292		}
1293	}
1294
1295	for (; ii < RSI_TBL_SZ; ii++)
1296		auto_rate->supported_rates[ii] = cpu_to_le16(min_rate);
1297
1298	auto_rate->num_supported_rates = cpu_to_le16(num_supported_rates * 2);
1299	auto_rate->moderate_rate_inx = cpu_to_le16(num_supported_rates / 2);
 
1300	num_supported_rates *= 2;
1301
1302	rsi_set_len_qno(&auto_rate->desc.desc_dword0.len_qno,
1303			(frame_len - FRAME_DESC_SZ), RSI_WIFI_MGMT_Q);
 
1304
1305	skb_put(skb, frame_len);
 
1306	kfree(selected_rates);
1307
1308	return rsi_send_internal_mgmt_frame(common, skb);
1309}
1310
1311/**
1312 * rsi_inform_bss_status() - This function informs about bss status with the
1313 *			     help of sta notify params by sending an internal
1314 *			     management frame to firmware.
1315 * @common: Pointer to the driver private structure.
1316 * @status: Bss status type.
1317 * @bssid: Bssid.
1318 * @qos_enable: Qos is enabled.
1319 * @aid: Aid (unique for all STAs).
1320 *
1321 * Return: None.
1322 */
1323void rsi_inform_bss_status(struct rsi_common *common,
1324			   enum opmode opmode,
1325			   u8 status,
1326			   const u8 *addr,
1327			   u8 qos_enable,
1328			   u16 aid,
1329			   struct ieee80211_sta *sta,
1330			   u16 sta_id,
1331			   struct ieee80211_vif *vif)
1332{
1333	if (status) {
1334		if (opmode == RSI_OPMODE_STA)
1335			common->hw_data_qs_blocked = true;
1336		rsi_hal_send_sta_notify_frame(common,
1337					      opmode,
1338					      STA_CONNECTED,
1339					      addr,
1340					      qos_enable,
1341					      aid, sta_id,
1342					      vif);
1343		if (common->min_rate == 0xffff)
1344			rsi_send_auto_rate_request(common, sta, sta_id, vif);
1345		if (opmode == RSI_OPMODE_STA) {
1346			if (!rsi_send_block_unblock_frame(common, false))
1347				common->hw_data_qs_blocked = false;
1348		}
1349	} else {
1350		if (opmode == RSI_OPMODE_STA)
1351			common->hw_data_qs_blocked = true;
1352
1353		if (!(common->wow_flags & RSI_WOW_ENABLED))
1354			rsi_hal_send_sta_notify_frame(common, opmode,
1355						      STA_DISCONNECTED, addr,
1356						      qos_enable, aid, sta_id,
1357						      vif);
1358		if (opmode == RSI_OPMODE_STA)
1359			rsi_send_block_unblock_frame(common, true);
1360	}
1361}
1362
1363/**
1364 * rsi_eeprom_read() - This function sends a frame to read the mac address
1365 *		       from the eeprom.
1366 * @common: Pointer to the driver private structure.
1367 *
1368 * Return: 0 on success, -1 on failure.
1369 */
1370static int rsi_eeprom_read(struct rsi_common *common)
1371{
1372	struct rsi_eeprom_read_frame *mgmt_frame;
1373	struct rsi_hw *adapter = common->priv;
1374	struct sk_buff *skb;
1375
1376	rsi_dbg(MGMT_TX_ZONE, "%s: Sending EEPROM read req frame\n", __func__);
1377
1378	skb = dev_alloc_skb(FRAME_DESC_SZ);
1379	if (!skb) {
1380		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1381			__func__);
1382		return -ENOMEM;
1383	}
1384
1385	memset(skb->data, 0, FRAME_DESC_SZ);
1386	mgmt_frame = (struct rsi_eeprom_read_frame *)skb->data;
1387
1388	/* FrameType */
1389	rsi_set_len_qno(&mgmt_frame->len_qno, 0, RSI_WIFI_MGMT_Q);
1390	mgmt_frame->pkt_type = EEPROM_READ;
1391
1392	/* Number of bytes to read */
1393	mgmt_frame->pkt_info =
1394		cpu_to_le32((adapter->eeprom.length << RSI_EEPROM_LEN_OFFSET) &
1395			    RSI_EEPROM_LEN_MASK);
1396	mgmt_frame->pkt_info |= cpu_to_le32((3 << RSI_EEPROM_HDR_SIZE_OFFSET) &
1397					    RSI_EEPROM_HDR_SIZE_MASK);
1398
1399	/* Address to read */
1400	mgmt_frame->eeprom_offset = cpu_to_le32(adapter->eeprom.offset);
1401
1402	skb_put(skb, FRAME_DESC_SZ);
1403
1404	return rsi_send_internal_mgmt_frame(common, skb);
1405}
1406
1407/**
1408 * This function sends a frame to block/unblock
1409 * data queues in the firmware
1410 *
1411 * @param common Pointer to the driver private structure.
1412 * @param block event - block if true, unblock if false
1413 * @return 0 on success, -1 on failure.
1414 */
1415int rsi_send_block_unblock_frame(struct rsi_common *common, bool block_event)
1416{
1417	struct rsi_block_unblock_data *mgmt_frame;
1418	struct sk_buff *skb;
1419
1420	rsi_dbg(MGMT_TX_ZONE, "%s: Sending block/unblock frame\n", __func__);
1421
1422	skb = dev_alloc_skb(FRAME_DESC_SZ);
1423	if (!skb) {
1424		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1425			__func__);
1426		return -ENOMEM;
1427	}
1428
1429	memset(skb->data, 0, FRAME_DESC_SZ);
1430	mgmt_frame = (struct rsi_block_unblock_data *)skb->data;
1431
1432	rsi_set_len_qno(&mgmt_frame->desc_dword0.len_qno, 0, RSI_WIFI_MGMT_Q);
1433	mgmt_frame->desc_dword0.frame_type = BLOCK_HW_QUEUE;
1434	mgmt_frame->host_quiet_info = QUIET_INFO_VALID;
1435
1436	if (block_event) {
1437		rsi_dbg(INFO_ZONE, "blocking the data qs\n");
1438		mgmt_frame->block_q_bitmap = cpu_to_le16(0xf);
1439		mgmt_frame->block_q_bitmap |= cpu_to_le16(0xf << 4);
1440	} else {
1441		rsi_dbg(INFO_ZONE, "unblocking the data qs\n");
1442		mgmt_frame->unblock_q_bitmap = cpu_to_le16(0xf);
1443		mgmt_frame->unblock_q_bitmap |= cpu_to_le16(0xf << 4);
1444	}
1445
1446	skb_put(skb, FRAME_DESC_SZ);
1447
1448	return rsi_send_internal_mgmt_frame(common, skb);
 
1449}
1450
1451/**
1452 * rsi_send_rx_filter_frame() - Sends a frame to filter the RX packets
1453 *
1454 * @common: Pointer to the driver private structure.
1455 * @rx_filter_word: Flags of filter packets
1456 *
1457 * @Return: 0 on success, -1 on failure.
1458 */
1459int rsi_send_rx_filter_frame(struct rsi_common *common, u16 rx_filter_word)
1460{
1461	struct rsi_mac_frame *cmd_frame;
1462	struct sk_buff *skb;
1463
1464	rsi_dbg(MGMT_TX_ZONE, "Sending RX filter frame\n");
1465
1466	skb = dev_alloc_skb(FRAME_DESC_SZ);
1467	if (!skb) {
1468		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1469			__func__);
1470		return -ENOMEM;
1471	}
1472
1473	memset(skb->data, 0, FRAME_DESC_SZ);
1474	cmd_frame = (struct rsi_mac_frame *)skb->data;
1475
1476	cmd_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
1477	cmd_frame->desc_word[1] = cpu_to_le16(SET_RX_FILTER);
1478	cmd_frame->desc_word[4] = cpu_to_le16(rx_filter_word);
1479
1480	skb_put(skb, FRAME_DESC_SZ);
1481
1482	return rsi_send_internal_mgmt_frame(common, skb);
1483}
1484
1485int rsi_send_ps_request(struct rsi_hw *adapter, bool enable,
1486			struct ieee80211_vif *vif)
1487{
1488	struct rsi_common *common = adapter->priv;
1489	struct ieee80211_bss_conf *bss = &vif->bss_conf;
1490	struct rsi_request_ps *ps;
1491	struct rsi_ps_info *ps_info;
1492	struct sk_buff *skb;
1493	int frame_len = sizeof(*ps);
1494
1495	skb = dev_alloc_skb(frame_len);
1496	if (!skb)
1497		return -ENOMEM;
1498	memset(skb->data, 0, frame_len);
1499
1500	ps = (struct rsi_request_ps *)skb->data;
1501	ps_info = &adapter->ps_info;
1502
1503	rsi_set_len_qno(&ps->desc.desc_dword0.len_qno,
1504			(frame_len - FRAME_DESC_SZ), RSI_WIFI_MGMT_Q);
1505	ps->desc.desc_dword0.frame_type = WAKEUP_SLEEP_REQUEST;
1506	if (enable) {
1507		ps->ps_sleep.enable = RSI_PS_ENABLE;
1508		ps->desc.desc_dword3.token = cpu_to_le16(RSI_SLEEP_REQUEST);
1509	} else {
1510		ps->ps_sleep.enable = RSI_PS_DISABLE;
1511		ps->desc.desc_dword0.len_qno |= cpu_to_le16(RSI_PS_DISABLE_IND);
1512		ps->desc.desc_dword3.token = cpu_to_le16(RSI_WAKEUP_REQUEST);
1513	}
1514
1515	ps->ps_uapsd_acs = common->uapsd_bitmap;
1516
1517	ps->ps_sleep.sleep_type = ps_info->sleep_type;
1518	ps->ps_sleep.num_bcns_per_lis_int =
1519		cpu_to_le16(ps_info->num_bcns_per_lis_int);
1520	ps->ps_sleep.sleep_duration =
1521		cpu_to_le32(ps_info->deep_sleep_wakeup_period);
1522
1523	if (bss->assoc)
1524		ps->ps_sleep.connected_sleep = RSI_CONNECTED_SLEEP;
1525	else
1526		ps->ps_sleep.connected_sleep = RSI_DEEP_SLEEP;
1527
1528	ps->ps_listen_interval = cpu_to_le32(ps_info->listen_interval);
1529	ps->ps_dtim_interval_duration =
1530		cpu_to_le32(ps_info->dtim_interval_duration);
1531
1532	if (ps_info->listen_interval > ps_info->dtim_interval_duration)
1533		ps->ps_listen_interval = cpu_to_le32(RSI_PS_DISABLE);
1534
1535	ps->ps_num_dtim_intervals = cpu_to_le16(ps_info->num_dtims_per_sleep);
1536	skb_put(skb, frame_len);
1537
1538	return rsi_send_internal_mgmt_frame(common, skb);
1539}
1540
1541/**
1542 * rsi_set_antenna() - This fuction send antenna configuration request
1543 *		       to device
1544 *
1545 * @common: Pointer to the driver private structure.
1546 * @antenna: bitmap for tx antenna selection
1547 *
1548 * Return: 0 on Success, negative error code on failure
1549 */
1550int rsi_set_antenna(struct rsi_common *common, u8 antenna)
1551{
1552	struct rsi_ant_sel_frame *ant_sel_frame;
1553	struct sk_buff *skb;
1554
1555	skb = dev_alloc_skb(FRAME_DESC_SZ);
1556	if (!skb) {
1557		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1558			__func__);
1559		return -ENOMEM;
1560	}
1561
1562	memset(skb->data, 0, FRAME_DESC_SZ);
 
1563
1564	ant_sel_frame = (struct rsi_ant_sel_frame *)skb->data;
1565	ant_sel_frame->desc_dword0.frame_type = ANT_SEL_FRAME;
1566	ant_sel_frame->sub_frame_type = ANTENNA_SEL_TYPE;
1567	ant_sel_frame->ant_value = cpu_to_le16(antenna & ANTENNA_MASK_VALUE);
1568	rsi_set_len_qno(&ant_sel_frame->desc_dword0.len_qno,
1569			0, RSI_WIFI_MGMT_Q);
1570	skb_put(skb, FRAME_DESC_SZ);
1571
1572	return rsi_send_internal_mgmt_frame(common, skb);
1573}
1574
1575static int rsi_send_beacon(struct rsi_common *common)
1576{
1577	struct sk_buff *skb = NULL;
1578	u8 dword_align_bytes = 0;
1579
1580	skb = dev_alloc_skb(MAX_MGMT_PKT_SIZE);
1581	if (!skb)
1582		return -ENOMEM;
1583
1584	memset(skb->data, 0, MAX_MGMT_PKT_SIZE);
1585
1586	dword_align_bytes = ((unsigned long)skb->data & 0x3f);
1587	if (dword_align_bytes)
1588		skb_pull(skb, (64 - dword_align_bytes));
1589	if (rsi_prepare_beacon(common, skb)) {
1590		rsi_dbg(ERR_ZONE, "Failed to prepare beacon\n");
1591		return -EINVAL;
1592	}
1593	skb_queue_tail(&common->tx_queue[MGMT_BEACON_Q], skb);
1594	rsi_set_event(&common->tx_thread.event);
1595	rsi_dbg(DATA_TX_ZONE, "%s: Added to beacon queue\n", __func__);
1596
1597	return 0;
1598}
1599
1600#ifdef CONFIG_PM
1601int rsi_send_wowlan_request(struct rsi_common *common, u16 flags,
1602			    u16 sleep_status)
1603{
1604	struct rsi_wowlan_req *cmd_frame;
1605	struct sk_buff *skb;
1606	u8 length;
1607
1608	rsi_dbg(ERR_ZONE, "%s: Sending wowlan request frame\n", __func__);
1609
1610	length = sizeof(*cmd_frame);
1611	skb = dev_alloc_skb(length);
1612	if (!skb)
1613		return -ENOMEM;
1614	memset(skb->data, 0, length);
1615	cmd_frame = (struct rsi_wowlan_req *)skb->data;
1616
1617	rsi_set_len_qno(&cmd_frame->desc.desc_dword0.len_qno,
1618			(length - FRAME_DESC_SZ),
1619			RSI_WIFI_MGMT_Q);
1620	cmd_frame->desc.desc_dword0.frame_type = WOWLAN_CONFIG_PARAMS;
1621	cmd_frame->host_sleep_status = sleep_status;
1622	if (common->secinfo.security_enable &&
1623	    common->secinfo.gtk_cipher)
1624		flags |= RSI_WOW_GTK_REKEY;
1625	if (sleep_status)
1626		cmd_frame->wow_flags = flags;
1627	rsi_dbg(INFO_ZONE, "Host_Sleep_Status : %d Flags : %d\n",
1628		cmd_frame->host_sleep_status, cmd_frame->wow_flags);
1629
1630	skb_put(skb, length);
1631
1632	return rsi_send_internal_mgmt_frame(common, skb);
1633}
1634#endif
1635
1636/**
1637 * rsi_handle_ta_confirm_type() - This function handles the confirm frames.
1638 * @common: Pointer to the driver private structure.
1639 * @msg: Pointer to received packet.
1640 *
1641 * Return: 0 on success, -1 on failure.
1642 */
1643static int rsi_handle_ta_confirm_type(struct rsi_common *common,
1644				      u8 *msg)
1645{
1646	struct rsi_hw *adapter = common->priv;
1647	u8 sub_type = (msg[15] & 0xff);
1648	u16 msg_len = ((u16 *)msg)[0] & 0xfff;
1649	u8 offset;
1650
1651	switch (sub_type) {
1652	case BOOTUP_PARAMS_REQUEST:
1653		rsi_dbg(FSM_ZONE, "%s: Boot up params confirm received\n",
1654			__func__);
1655		if (common->fsm_state == FSM_BOOT_PARAMS_SENT) {
1656			adapter->eeprom.length = (IEEE80211_ADDR_LEN +
1657						  WLAN_MAC_MAGIC_WORD_LEN +
1658						  WLAN_HOST_MODE_LEN);
1659			adapter->eeprom.offset = WLAN_MAC_EEPROM_ADDR;
1660			if (rsi_eeprom_read(common)) {
1661				common->fsm_state = FSM_CARD_NOT_READY;
1662				goto out;
 
 
1663			}
1664			common->fsm_state = FSM_EEPROM_READ_MAC_ADDR;
1665		} else {
1666			rsi_dbg(INFO_ZONE,
1667				"%s: Received bootup params cfm in %d state\n",
1668				 __func__, common->fsm_state);
1669			return 0;
1670		}
1671		break;
1672
1673	case EEPROM_READ:
1674		rsi_dbg(FSM_ZONE, "EEPROM READ confirm received\n");
1675		if (msg_len <= 0) {
1676			rsi_dbg(FSM_ZONE,
1677				"%s: [EEPROM_READ] Invalid len %d\n",
1678				__func__, msg_len);
1679			goto out;
1680		}
1681		if (msg[16] != MAGIC_WORD) {
1682			rsi_dbg(FSM_ZONE,
1683				"%s: [EEPROM_READ] Invalid token\n", __func__);
1684			common->fsm_state = FSM_CARD_NOT_READY;
1685			goto out;
1686		}
1687		if (common->fsm_state == FSM_EEPROM_READ_MAC_ADDR) {
1688			offset = (FRAME_DESC_SZ + WLAN_HOST_MODE_LEN +
1689				  WLAN_MAC_MAGIC_WORD_LEN);
1690			memcpy(common->mac_addr, &msg[offset], ETH_ALEN);
1691			adapter->eeprom.length =
1692				((WLAN_MAC_MAGIC_WORD_LEN + 3) & (~3));
1693			adapter->eeprom.offset = WLAN_EEPROM_RFTYPE_ADDR;
1694			if (rsi_eeprom_read(common)) {
1695				rsi_dbg(ERR_ZONE,
1696					"%s: Failed reading RF band\n",
1697					__func__);
 
1698				common->fsm_state = FSM_CARD_NOT_READY;
1699				goto out;
1700			}
1701			common->fsm_state = FSM_EEPROM_READ_RF_TYPE;
1702		} else if (common->fsm_state == FSM_EEPROM_READ_RF_TYPE) {
1703			if ((msg[17] & 0x3) == 0x3) {
1704				rsi_dbg(INIT_ZONE, "Dual band supported\n");
1705				common->band = NL80211_BAND_5GHZ;
1706				common->num_supp_bands = 2;
1707			} else if ((msg[17] & 0x3) == 0x1) {
1708				rsi_dbg(INIT_ZONE,
1709					"Only 2.4Ghz band supported\n");
1710				common->band = NL80211_BAND_2GHZ;
1711				common->num_supp_bands = 1;
1712			}
1713			if (rsi_send_reset_mac(common))
1714				goto out;
1715			common->fsm_state = FSM_RESET_MAC_SENT;
 
1716		} else {
1717			rsi_dbg(ERR_ZONE, "%s: Invalid EEPROM read type\n",
1718				__func__);
 
1719			return 0;
1720		}
1721		break;
1722
1723	case RESET_MAC_REQ:
1724		if (common->fsm_state == FSM_RESET_MAC_SENT) {
1725			rsi_dbg(FSM_ZONE, "%s: Reset MAC cfm received\n",
1726				__func__);
1727
1728			if (rsi_load_radio_caps(common))
1729				goto out;
1730			else
1731				common->fsm_state = FSM_RADIO_CAPS_SENT;
1732		} else {
1733			rsi_dbg(ERR_ZONE,
1734				"%s: Received reset mac cfm in %d state\n",
1735				 __func__, common->fsm_state);
1736			return 0;
1737		}
1738		break;
1739
1740	case RADIO_CAPABILITIES:
1741		if (common->fsm_state == FSM_RADIO_CAPS_SENT) {
1742			common->rf_reset = 1;
1743			if (rsi_program_bb_rf(common)) {
1744				goto out;
1745			} else {
1746				common->fsm_state = FSM_BB_RF_PROG_SENT;
1747				rsi_dbg(FSM_ZONE, "%s: Radio cap cfm received\n",
1748					__func__);
1749			}
1750		} else {
1751			rsi_dbg(INFO_ZONE,
1752				"%s: Received radio caps cfm in %d state\n",
1753				 __func__, common->fsm_state);
1754			return 0;
1755		}
1756		break;
1757
1758	case BB_PROG_VALUES_REQUEST:
1759	case RF_PROG_VALUES_REQUEST:
1760	case BBP_PROG_IN_TA:
1761		rsi_dbg(FSM_ZONE, "%s: BB/RF cfm received\n", __func__);
1762		if (common->fsm_state == FSM_BB_RF_PROG_SENT) {
1763			common->bb_rf_prog_count--;
1764			if (!common->bb_rf_prog_count) {
1765				common->fsm_state = FSM_MAC_INIT_DONE;
1766				if (common->reinit_hw) {
1767					complete(&common->wlan_init_completion);
1768				} else {
1769					return rsi_mac80211_attach(common);
1770				}
1771			}
1772		} else {
1773			rsi_dbg(INFO_ZONE,
1774				"%s: Received bbb_rf cfm in %d state\n",
1775				 __func__, common->fsm_state);
1776			return 0;
1777		}
1778		break;
1779	case WAKEUP_SLEEP_REQUEST:
1780		rsi_dbg(INFO_ZONE, "Wakeup/Sleep confirmation.\n");
1781		return rsi_handle_ps_confirm(adapter, msg);
1782	default:
1783		rsi_dbg(INFO_ZONE, "%s: Invalid TA confirm pkt received\n",
1784			__func__);
1785		break;
1786	}
1787	return 0;
1788out:
1789	rsi_dbg(ERR_ZONE, "%s: Unable to send pkt/Invalid frame received\n",
1790		__func__);
1791	return -EINVAL;
1792}
1793
1794int rsi_handle_card_ready(struct rsi_common *common, u8 *msg)
1795{
1796	switch (common->fsm_state) {
1797	case FSM_CARD_NOT_READY:
1798		rsi_dbg(INIT_ZONE, "Card ready indication from Common HAL\n");
1799		rsi_set_default_parameters(common);
1800		if (rsi_send_common_dev_params(common) < 0)
1801			return -EINVAL;
1802		common->fsm_state = FSM_COMMON_DEV_PARAMS_SENT;
1803		break;
1804	case FSM_COMMON_DEV_PARAMS_SENT:
1805		rsi_dbg(INIT_ZONE, "Card ready indication from WLAN HAL\n");
1806
1807		/* Get usb buffer status register address */
1808		common->priv->usb_buffer_status_reg = *(u32 *)&msg[8];
1809		rsi_dbg(INFO_ZONE, "USB buffer status register = %x\n",
1810			common->priv->usb_buffer_status_reg);
1811
1812		if (rsi_load_bootup_params(common)) {
1813			common->fsm_state = FSM_CARD_NOT_READY;
1814			return -EINVAL;
1815		}
1816		common->fsm_state = FSM_BOOT_PARAMS_SENT;
1817		break;
1818	default:
1819		rsi_dbg(ERR_ZONE,
1820			"%s: card ready indication in invalid state %d.\n",
1821			__func__, common->fsm_state);
1822		return -EINVAL;
1823	}
1824
1825	return 0;
1826}
1827
1828/**
1829 * rsi_mgmt_pkt_recv() - This function processes the management packets
1830 *			 recieved from the hardware.
1831 * @common: Pointer to the driver private structure.
1832 * @msg: Pointer to the received packet.
1833 *
1834 * Return: 0 on success, -1 on failure.
1835 */
1836int rsi_mgmt_pkt_recv(struct rsi_common *common, u8 *msg)
1837{
1838	s32 msg_len = (le16_to_cpu(*(__le16 *)&msg[0]) & 0x0fff);
1839	u16 msg_type = (msg[2]);
 
1840
1841	rsi_dbg(FSM_ZONE, "%s: Msg Len: %d, Msg Type: %4x\n",
1842		__func__, msg_len, msg_type);
1843
1844	switch (msg_type) {
1845	case TA_CONFIRM_TYPE:
1846		return rsi_handle_ta_confirm_type(common, msg);
1847	case CARD_READY_IND:
1848		common->hibernate_resume = false;
1849		rsi_dbg(FSM_ZONE, "%s: Card ready indication received\n",
1850			__func__);
1851		return rsi_handle_card_ready(common, msg);
1852	case TX_STATUS_IND:
 
 
 
 
 
 
 
 
 
 
1853		if (msg[15] == PROBEREQ_CONFIRM) {
1854			common->mgmt_q_block = false;
1855			rsi_dbg(FSM_ZONE, "%s: Probe confirm received\n",
1856				__func__);
1857		}
1858		break;
1859	case BEACON_EVENT_IND:
1860		rsi_dbg(INFO_ZONE, "Beacon event\n");
1861		if (common->fsm_state != FSM_MAC_INIT_DONE)
1862			return -1;
1863		if (common->iface_down)
1864			return -1;
1865		if (!common->beacon_enabled)
1866			return -1;
1867		rsi_send_beacon(common);
1868		break;
1869	case RX_DOT11_MGMT:
1870		return rsi_mgmt_pkt_to_core(common, msg, msg_len);
1871	default:
1872		rsi_dbg(INFO_ZONE, "Received packet type: 0x%x\n", msg_type);
1873	}
1874	return 0;
1875}
v4.10.11
   1/**
   2 * Copyright (c) 2014 Redpine Signals Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
  17#include <linux/etherdevice.h>
  18#include "rsi_mgmt.h"
  19#include "rsi_common.h"
 
 
  20
  21static struct bootup_params boot_params_20 = {
  22	.magic_number = cpu_to_le16(0x5aa5),
  23	.crystal_good_time = 0x0,
  24	.valid = cpu_to_le32(VALID_20),
  25	.reserved_for_valids = 0x0,
  26	.bootup_mode_info = 0x0,
  27	.digital_loop_back_params = 0x0,
  28	.rtls_timestamp_en = 0x0,
  29	.host_spi_intr_cfg = 0x0,
  30	.device_clk_info = {{
  31		.pll_config_g = {
  32			.tapll_info_g = {
  33				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_20 << 8)|
  34					      (TA_PLL_M_VAL_20)),
  35				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_20),
  36			},
  37			.pll960_info_g = {
  38				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_20 << 8)|
  39							 (PLL960_N_VAL_20)),
  40				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_20),
  41				.pll_reg_3 = 0x0,
  42			},
  43			.afepll_info_g = {
  44				.pll_reg = cpu_to_le16(0x9f0),
  45			}
  46		},
  47		.switch_clk_g = {
  48			.switch_clk_info = cpu_to_le16(BIT(3)),
  49			.bbp_lmac_clk_reg_val = cpu_to_le16(0x121),
  50			.umac_clock_reg_config = 0x0,
  51			.qspi_uart_clock_reg_config = 0x0
  52		}
  53	},
  54	{
  55		.pll_config_g = {
  56			.tapll_info_g = {
  57				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_20 << 8)|
  58							 (TA_PLL_M_VAL_20)),
  59				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_20),
  60			},
  61			.pll960_info_g = {
  62				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_20 << 8)|
  63							 (PLL960_N_VAL_20)),
  64				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_20),
  65				.pll_reg_3 = 0x0,
  66			},
  67			.afepll_info_g = {
  68				.pll_reg = cpu_to_le16(0x9f0),
  69			}
  70		},
  71		.switch_clk_g = {
  72			.switch_clk_info = 0x0,
  73			.bbp_lmac_clk_reg_val = 0x0,
  74			.umac_clock_reg_config = 0x0,
  75			.qspi_uart_clock_reg_config = 0x0
  76		}
  77	},
  78	{
  79		.pll_config_g = {
  80			.tapll_info_g = {
  81				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_20 << 8)|
  82							 (TA_PLL_M_VAL_20)),
  83				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_20),
  84			},
  85			.pll960_info_g = {
  86				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_20 << 8)|
  87							 (PLL960_N_VAL_20)),
  88				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_20),
  89				.pll_reg_3 = 0x0,
  90			},
  91			.afepll_info_g = {
  92				.pll_reg = cpu_to_le16(0x9f0),
  93			}
  94		},
  95		.switch_clk_g = {
  96			.switch_clk_info = 0x0,
  97			.bbp_lmac_clk_reg_val = 0x0,
  98			.umac_clock_reg_config = 0x0,
  99			.qspi_uart_clock_reg_config = 0x0
 100		}
 101	} },
 102	.buckboost_wakeup_cnt = 0x0,
 103	.pmu_wakeup_wait = 0x0,
 104	.shutdown_wait_time = 0x0,
 105	.pmu_slp_clkout_sel = 0x0,
 106	.wdt_prog_value = 0x0,
 107	.wdt_soc_rst_delay = 0x0,
 108	.dcdc_operation_mode = 0x0,
 109	.soc_reset_wait_cnt = 0x0
 
 
 
 110};
 111
 112static struct bootup_params boot_params_40 = {
 113	.magic_number = cpu_to_le16(0x5aa5),
 114	.crystal_good_time = 0x0,
 115	.valid = cpu_to_le32(VALID_40),
 116	.reserved_for_valids = 0x0,
 117	.bootup_mode_info = 0x0,
 118	.digital_loop_back_params = 0x0,
 119	.rtls_timestamp_en = 0x0,
 120	.host_spi_intr_cfg = 0x0,
 121	.device_clk_info = {{
 122		.pll_config_g = {
 123			.tapll_info_g = {
 124				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_40 << 8)|
 125							 (TA_PLL_M_VAL_40)),
 126				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_40),
 127			},
 128			.pll960_info_g = {
 129				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_40 << 8)|
 130							 (PLL960_N_VAL_40)),
 131				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_40),
 132				.pll_reg_3 = 0x0,
 133			},
 134			.afepll_info_g = {
 135				.pll_reg = cpu_to_le16(0x9f0),
 136			}
 137		},
 138		.switch_clk_g = {
 139			.switch_clk_info = cpu_to_le16(0x09),
 140			.bbp_lmac_clk_reg_val = cpu_to_le16(0x1121),
 141			.umac_clock_reg_config = cpu_to_le16(0x48),
 142			.qspi_uart_clock_reg_config = 0x0
 143		}
 144	},
 145	{
 146		.pll_config_g = {
 147			.tapll_info_g = {
 148				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_40 << 8)|
 149							 (TA_PLL_M_VAL_40)),
 150				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_40),
 151			},
 152			.pll960_info_g = {
 153				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_40 << 8)|
 154							 (PLL960_N_VAL_40)),
 155				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_40),
 156				.pll_reg_3 = 0x0,
 157			},
 158			.afepll_info_g = {
 159				.pll_reg = cpu_to_le16(0x9f0),
 160			}
 161		},
 162		.switch_clk_g = {
 163			.switch_clk_info = 0x0,
 164			.bbp_lmac_clk_reg_val = 0x0,
 165			.umac_clock_reg_config = 0x0,
 166			.qspi_uart_clock_reg_config = 0x0
 167		}
 168	},
 169	{
 170		.pll_config_g = {
 171			.tapll_info_g = {
 172				.pll_reg_1 = cpu_to_le16((TA_PLL_N_VAL_40 << 8)|
 173							 (TA_PLL_M_VAL_40)),
 174				.pll_reg_2 = cpu_to_le16(TA_PLL_P_VAL_40),
 175			},
 176			.pll960_info_g = {
 177				.pll_reg_1 = cpu_to_le16((PLL960_P_VAL_40 << 8)|
 178							 (PLL960_N_VAL_40)),
 179				.pll_reg_2 = cpu_to_le16(PLL960_M_VAL_40),
 180				.pll_reg_3 = 0x0,
 181			},
 182			.afepll_info_g = {
 183				.pll_reg = cpu_to_le16(0x9f0),
 184			}
 185		},
 186		.switch_clk_g = {
 187			.switch_clk_info = 0x0,
 188			.bbp_lmac_clk_reg_val = 0x0,
 189			.umac_clock_reg_config = 0x0,
 190			.qspi_uart_clock_reg_config = 0x0
 191		}
 192	} },
 193	.buckboost_wakeup_cnt = 0x0,
 194	.pmu_wakeup_wait = 0x0,
 195	.shutdown_wait_time = 0x0,
 196	.pmu_slp_clkout_sel = 0x0,
 197	.wdt_prog_value = 0x0,
 198	.wdt_soc_rst_delay = 0x0,
 199	.dcdc_operation_mode = 0x0,
 200	.soc_reset_wait_cnt = 0x0
 
 
 
 201};
 202
 203static u16 mcs[] = {13, 26, 39, 52, 78, 104, 117, 130};
 204
 205/**
 206 * rsi_set_default_parameters() - This function sets default parameters.
 207 * @common: Pointer to the driver private structure.
 208 *
 209 * Return: none
 210 */
 211static void rsi_set_default_parameters(struct rsi_common *common)
 212{
 213	common->band = NL80211_BAND_2GHZ;
 214	common->channel_width = BW_20MHZ;
 215	common->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
 216	common->channel = 1;
 217	common->min_rate = 0xffff;
 218	common->fsm_state = FSM_CARD_NOT_READY;
 219	common->iface_down = true;
 220	common->endpoint = EP_2GHZ_20MHZ;
 
 
 
 
 
 
 
 
 221}
 222
 223/**
 224 * rsi_set_contention_vals() - This function sets the contention values for the
 225 *			       backoff procedure.
 226 * @common: Pointer to the driver private structure.
 227 *
 228 * Return: None.
 229 */
 230static void rsi_set_contention_vals(struct rsi_common *common)
 231{
 232	u8 ii = 0;
 233
 234	for (; ii < NUM_EDCA_QUEUES; ii++) {
 235		common->tx_qinfo[ii].wme_params =
 236			(((common->edca_params[ii].cw_min / 2) +
 237			  (common->edca_params[ii].aifs)) *
 238			  WMM_SHORT_SLOT_TIME + SIFS_DURATION);
 239		common->tx_qinfo[ii].weight = common->tx_qinfo[ii].wme_params;
 240		common->tx_qinfo[ii].pkt_contended = 0;
 241	}
 242}
 243
 244/**
 245 * rsi_send_internal_mgmt_frame() - This function sends management frames to
 246 *				    firmware.Also schedules packet to queue
 247 *				    for transmission.
 248 * @common: Pointer to the driver private structure.
 249 * @skb: Pointer to the socket buffer structure.
 250 *
 251 * Return: 0 on success, -1 on failure.
 252 */
 253static int rsi_send_internal_mgmt_frame(struct rsi_common *common,
 254					struct sk_buff *skb)
 255{
 256	struct skb_info *tx_params;
 
 257
 258	if (skb == NULL) {
 259		rsi_dbg(ERR_ZONE, "%s: Unable to allocate skb\n", __func__);
 260		return -ENOMEM;
 261	}
 
 
 
 262	tx_params = (struct skb_info *)&IEEE80211_SKB_CB(skb)->driver_data;
 263	tx_params->flags |= INTERNAL_MGMT_PKT;
 264	skb_queue_tail(&common->tx_queue[MGMT_SOFT_Q], skb);
 265	rsi_set_event(&common->tx_thread.event);
 266	return 0;
 267}
 268
 269/**
 270 * rsi_load_radio_caps() - This function is used to send radio capabilities
 271 *			   values to firmware.
 272 * @common: Pointer to the driver private structure.
 273 *
 274 * Return: 0 on success, corresponding negative error code on failure.
 275 */
 276static int rsi_load_radio_caps(struct rsi_common *common)
 277{
 278	struct rsi_radio_caps *radio_caps;
 279	struct rsi_hw *adapter = common->priv;
 280	u16 inx = 0;
 281	u8 ii;
 282	u8 radio_id = 0;
 283	u16 gc[20] = {0xf0, 0xf0, 0xf0, 0xf0,
 284		      0xf0, 0xf0, 0xf0, 0xf0,
 285		      0xf0, 0xf0, 0xf0, 0xf0,
 286		      0xf0, 0xf0, 0xf0, 0xf0,
 287		      0xf0, 0xf0, 0xf0, 0xf0};
 288	struct sk_buff *skb;
 
 289
 290	rsi_dbg(INFO_ZONE, "%s: Sending rate symbol req frame\n", __func__);
 291
 292	skb = dev_alloc_skb(sizeof(struct rsi_radio_caps));
 293
 294	if (!skb) {
 295		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 296			__func__);
 297		return -ENOMEM;
 298	}
 299
 300	memset(skb->data, 0, sizeof(struct rsi_radio_caps));
 301	radio_caps = (struct rsi_radio_caps *)skb->data;
 302
 303	radio_caps->desc_word[1] = cpu_to_le16(RADIO_CAPABILITIES);
 304	radio_caps->desc_word[4] = cpu_to_le16(RSI_RF_TYPE << 8);
 
 305
 306	if (common->channel_width == BW_40MHZ) {
 307		radio_caps->desc_word[7] |= cpu_to_le16(RSI_LMAC_CLOCK_80MHZ);
 308		radio_caps->desc_word[7] |= cpu_to_le16(RSI_ENABLE_40MHZ);
 309
 310		if (common->fsm_state == FSM_MAC_INIT_DONE) {
 311			struct ieee80211_hw *hw = adapter->hw;
 312			struct ieee80211_conf *conf = &hw->conf;
 
 313			if (conf_is_ht40_plus(conf)) {
 314				radio_caps->desc_word[5] =
 315					cpu_to_le16(LOWER_20_ENABLE);
 316				radio_caps->desc_word[5] |=
 317					cpu_to_le16(LOWER_20_ENABLE >> 12);
 318			} else if (conf_is_ht40_minus(conf)) {
 319				radio_caps->desc_word[5] =
 320					cpu_to_le16(UPPER_20_ENABLE);
 321				radio_caps->desc_word[5] |=
 322					cpu_to_le16(UPPER_20_ENABLE >> 12);
 323			} else {
 324				radio_caps->desc_word[5] =
 325					cpu_to_le16(BW_40MHZ << 12);
 326				radio_caps->desc_word[5] |=
 327					cpu_to_le16(FULL40M_ENABLE);
 328			}
 329		}
 330	}
 
 331
 332	radio_caps->sifs_tx_11n = cpu_to_le16(SIFS_TX_11N_VALUE);
 333	radio_caps->sifs_tx_11b = cpu_to_le16(SIFS_TX_11B_VALUE);
 334	radio_caps->slot_rx_11n = cpu_to_le16(SHORT_SLOT_VALUE);
 335	radio_caps->ofdm_ack_tout = cpu_to_le16(OFDM_ACK_TOUT_VALUE);
 336	radio_caps->cck_ack_tout = cpu_to_le16(CCK_ACK_TOUT_VALUE);
 337	radio_caps->preamble_type = cpu_to_le16(LONG_PREAMBLE);
 338
 339	radio_caps->desc_word[7] |= cpu_to_le16(radio_id << 8);
 340
 341	for (ii = 0; ii < MAX_HW_QUEUES; ii++) {
 342		radio_caps->qos_params[ii].cont_win_min_q = cpu_to_le16(3);
 343		radio_caps->qos_params[ii].cont_win_max_q = cpu_to_le16(0x3f);
 344		radio_caps->qos_params[ii].aifsn_val_q = cpu_to_le16(2);
 345		radio_caps->qos_params[ii].txop_q = 0;
 346	}
 347
 348	for (ii = 0; ii < MAX_HW_QUEUES - 4; ii++) {
 349		radio_caps->qos_params[ii].cont_win_min_q =
 350			cpu_to_le16(common->edca_params[ii].cw_min);
 351		radio_caps->qos_params[ii].cont_win_max_q =
 352			cpu_to_le16(common->edca_params[ii].cw_max);
 353		radio_caps->qos_params[ii].aifsn_val_q =
 354			cpu_to_le16((common->edca_params[ii].aifs) << 8);
 355		radio_caps->qos_params[ii].txop_q =
 356			cpu_to_le16(common->edca_params[ii].txop);
 357	}
 358
 
 
 
 
 359	memcpy(&common->rate_pwr[0], &gc[0], 40);
 360	for (ii = 0; ii < 20; ii++)
 361		radio_caps->gcpd_per_rate[inx++] =
 362			cpu_to_le16(common->rate_pwr[ii]  & 0x00FF);
 363
 364	radio_caps->desc_word[0] = cpu_to_le16((sizeof(struct rsi_radio_caps) -
 365						FRAME_DESC_SZ) |
 366					       (RSI_WIFI_MGMT_Q << 12));
 367
 368
 369	skb_put(skb, (sizeof(struct rsi_radio_caps)));
 370
 371	return rsi_send_internal_mgmt_frame(common, skb);
 372}
 373
 374/**
 375 * rsi_mgmt_pkt_to_core() - This function is the entry point for Mgmt module.
 376 * @common: Pointer to the driver private structure.
 377 * @msg: Pointer to received packet.
 378 * @msg_len: Length of the recieved packet.
 379 * @type: Type of recieved packet.
 380 *
 381 * Return: 0 on success, -1 on failure.
 382 */
 383static int rsi_mgmt_pkt_to_core(struct rsi_common *common,
 384				u8 *msg,
 385				s32 msg_len,
 386				u8 type)
 387{
 388	struct rsi_hw *adapter = common->priv;
 389	struct ieee80211_tx_info *info;
 390	struct skb_info *rx_params;
 391	u8 pad_bytes = msg[4];
 392	u8 pkt_recv;
 393	struct sk_buff *skb;
 394	char *buffer;
 395
 396	if (type == RX_DOT11_MGMT) {
 397		if (!adapter->sc_nvifs)
 398			return -ENOLINK;
 399
 400		msg_len -= pad_bytes;
 401		if (msg_len <= 0) {
 402			rsi_dbg(MGMT_RX_ZONE,
 403				"%s: Invalid rx msg of len = %d\n",
 404				__func__, msg_len);
 405			return -EINVAL;
 406		}
 407
 408		skb = dev_alloc_skb(msg_len);
 409		if (!skb) {
 410			rsi_dbg(ERR_ZONE, "%s: Failed to allocate skb\n",
 411				__func__);
 412			return -ENOMEM;
 413		}
 414
 415		buffer = skb_put(skb, msg_len);
 416
 417		memcpy(buffer,
 418		       (u8 *)(msg +  FRAME_DESC_SZ + pad_bytes),
 419		       msg_len);
 420
 421		pkt_recv = buffer[0];
 422
 423		info = IEEE80211_SKB_CB(skb);
 424		rx_params = (struct skb_info *)info->driver_data;
 425		rx_params->rssi = rsi_get_rssi(msg);
 426		rx_params->channel = rsi_get_channel(msg);
 427		rsi_indicate_pkt_to_os(common, skb);
 428	} else {
 429		rsi_dbg(MGMT_TX_ZONE, "%s: Internal Packet\n", __func__);
 430	}
 
 431
 432	return 0;
 433}
 434
 435/**
 436 * rsi_hal_send_sta_notify_frame() - This function sends the station notify
 437 *				     frame to firmware.
 438 * @common: Pointer to the driver private structure.
 439 * @opmode: Operating mode of device.
 440 * @notify_event: Notification about station connection.
 441 * @bssid: bssid.
 442 * @qos_enable: Qos is enabled.
 443 * @aid: Aid (unique for all STA).
 444 *
 445 * Return: status: 0 on success, corresponding negative error code on failure.
 446 */
 447static int rsi_hal_send_sta_notify_frame(struct rsi_common *common,
 448					 u8 opmode,
 449					 u8 notify_event,
 450					 const unsigned char *bssid,
 451					 u8 qos_enable,
 452					 u16 aid)
 
 
 453{
 454	struct sk_buff *skb = NULL;
 455	struct rsi_peer_notify *peer_notify;
 456	u16 vap_id = 0;
 457	int status;
 
 458
 459	rsi_dbg(MGMT_TX_ZONE, "%s: Sending sta notify frame\n", __func__);
 460
 461	skb = dev_alloc_skb(sizeof(struct rsi_peer_notify));
 462
 463	if (!skb) {
 464		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 465			__func__);
 466		return -ENOMEM;
 467	}
 468
 469	memset(skb->data, 0, sizeof(struct rsi_peer_notify));
 470	peer_notify = (struct rsi_peer_notify *)skb->data;
 471
 472	peer_notify->command = cpu_to_le16(opmode << 1);
 
 
 
 473
 474	switch (notify_event) {
 475	case STA_CONNECTED:
 476		peer_notify->command |= cpu_to_le16(RSI_ADD_PEER);
 477		break;
 478	case STA_DISCONNECTED:
 479		peer_notify->command |= cpu_to_le16(RSI_DELETE_PEER);
 480		break;
 481	default:
 482		break;
 483	}
 484
 485	peer_notify->command |= cpu_to_le16((aid & 0xfff) << 4);
 486	ether_addr_copy(peer_notify->mac_addr, bssid);
 487
 488	peer_notify->sta_flags = cpu_to_le32((qos_enable) ? 1 : 0);
 489
 490	peer_notify->desc_word[0] =
 491		cpu_to_le16((sizeof(struct rsi_peer_notify) - FRAME_DESC_SZ) |
 492			    (RSI_WIFI_MGMT_Q << 12));
 493	peer_notify->desc_word[1] = cpu_to_le16(PEER_NOTIFY);
 494	peer_notify->desc_word[7] |= cpu_to_le16(vap_id << 8);
 
 495
 496	skb_put(skb, sizeof(struct rsi_peer_notify));
 497
 498	status = rsi_send_internal_mgmt_frame(common, skb);
 499
 500	if (!status && qos_enable) {
 
 501		rsi_set_contention_vals(common);
 502		status = rsi_load_radio_caps(common);
 503	}
 504	return status;
 505}
 506
 507/**
 508 * rsi_send_aggregation_params_frame() - This function sends the ampdu
 509 *					 indication frame to firmware.
 510 * @common: Pointer to the driver private structure.
 511 * @tid: traffic identifier.
 512 * @ssn: ssn.
 513 * @buf_size: buffer size.
 514 * @event: notification about station connection.
 515 *
 516 * Return: 0 on success, corresponding negative error code on failure.
 517 */
 518int rsi_send_aggregation_params_frame(struct rsi_common *common,
 519				      u16 tid,
 520				      u16 ssn,
 521				      u8 buf_size,
 522				      u8 event)
 
 523{
 524	struct sk_buff *skb = NULL;
 525	struct rsi_mac_frame *mgmt_frame;
 526	u8 peer_id = 0;
 527
 528	skb = dev_alloc_skb(FRAME_DESC_SZ);
 529
 530	if (!skb) {
 531		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 532			__func__);
 533		return -ENOMEM;
 534	}
 535
 536	memset(skb->data, 0, FRAME_DESC_SZ);
 537	mgmt_frame = (struct rsi_mac_frame *)skb->data;
 538
 539	rsi_dbg(MGMT_TX_ZONE, "%s: Sending AMPDU indication frame\n", __func__);
 540
 541	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 542	mgmt_frame->desc_word[1] = cpu_to_le16(AMPDU_IND);
 543
 
 
 544	if (event == STA_TX_ADDBA_DONE) {
 545		mgmt_frame->desc_word[4] = cpu_to_le16(ssn);
 546		mgmt_frame->desc_word[5] = cpu_to_le16(buf_size);
 547		mgmt_frame->desc_word[7] =
 548		cpu_to_le16((tid | (START_AMPDU_AGGR << 4) | (peer_id << 8)));
 549	} else if (event == STA_RX_ADDBA_DONE) {
 550		mgmt_frame->desc_word[4] = cpu_to_le16(ssn);
 551		mgmt_frame->desc_word[7] = cpu_to_le16(tid |
 552						       (START_AMPDU_AGGR << 4) |
 553						       (RX_BA_INDICATION << 5) |
 554						       (peer_id << 8));
 555	} else if (event == STA_TX_DELBA) {
 556		mgmt_frame->desc_word[7] = cpu_to_le16(tid |
 557						       (STOP_AMPDU_AGGR << 4) |
 558						       (peer_id << 8));
 559	} else if (event == STA_RX_DELBA) {
 560		mgmt_frame->desc_word[7] = cpu_to_le16(tid |
 561						       (STOP_AMPDU_AGGR << 4) |
 562						       (RX_BA_INDICATION << 5) |
 563						       (peer_id << 8));
 564	}
 565
 566	skb_put(skb, FRAME_DESC_SZ);
 567
 568	return rsi_send_internal_mgmt_frame(common, skb);
 569}
 570
 571/**
 572 * rsi_program_bb_rf() - This function starts base band and RF programming.
 573 *			 This is called after initial configurations are done.
 574 * @common: Pointer to the driver private structure.
 575 *
 576 * Return: 0 on success, corresponding negative error code on failure.
 577 */
 578static int rsi_program_bb_rf(struct rsi_common *common)
 579{
 580	struct sk_buff *skb;
 581	struct rsi_mac_frame *mgmt_frame;
 
 582
 583	rsi_dbg(MGMT_TX_ZONE, "%s: Sending program BB/RF frame\n", __func__);
 584
 585	skb = dev_alloc_skb(FRAME_DESC_SZ);
 586	if (!skb) {
 587		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 588			__func__);
 589		return -ENOMEM;
 590	}
 591
 592	memset(skb->data, 0, FRAME_DESC_SZ);
 593	mgmt_frame = (struct rsi_mac_frame *)skb->data;
 594
 595	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 596	mgmt_frame->desc_word[1] = cpu_to_le16(BBP_PROG_IN_TA);
 597	mgmt_frame->desc_word[4] = cpu_to_le16(common->endpoint);
 
 598
 599	if (common->rf_reset) {
 600		mgmt_frame->desc_word[7] =  cpu_to_le16(RF_RESET_ENABLE);
 601		rsi_dbg(MGMT_TX_ZONE, "%s: ===> RF RESET REQUEST SENT <===\n",
 602			__func__);
 603		common->rf_reset = 0;
 604	}
 605	common->bb_rf_prog_count = 1;
 606	mgmt_frame->desc_word[7] |= cpu_to_le16(PUT_BBP_RESET |
 607				     BBP_REG_WRITE | (RSI_RF_TYPE << 4));
 608	skb_put(skb, FRAME_DESC_SZ);
 609
 610	return rsi_send_internal_mgmt_frame(common, skb);
 611}
 612
 613/**
 614 * rsi_set_vap_capabilities() - This function send vap capability to firmware.
 615 * @common: Pointer to the driver private structure.
 616 * @opmode: Operating mode of device.
 617 *
 618 * Return: 0 on success, corresponding negative error code on failure.
 619 */
 620int rsi_set_vap_capabilities(struct rsi_common *common,
 621			     enum opmode mode,
 
 
 622			     u8 vap_status)
 623{
 624	struct sk_buff *skb = NULL;
 625	struct rsi_vap_caps *vap_caps;
 626	struct rsi_hw *adapter = common->priv;
 627	struct ieee80211_hw *hw = adapter->hw;
 628	struct ieee80211_conf *conf = &hw->conf;
 629	u16 vap_id = 0;
 630
 631	rsi_dbg(MGMT_TX_ZONE, "%s: Sending VAP capabilities frame\n", __func__);
 632
 633	skb = dev_alloc_skb(sizeof(struct rsi_vap_caps));
 634	if (!skb) {
 635		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 636			__func__);
 637		return -ENOMEM;
 638	}
 639
 640	memset(skb->data, 0, sizeof(struct rsi_vap_caps));
 641	vap_caps = (struct rsi_vap_caps *)skb->data;
 642
 643	vap_caps->desc_word[0] = cpu_to_le16((sizeof(struct rsi_vap_caps) -
 644					     FRAME_DESC_SZ) |
 645					     (RSI_WIFI_MGMT_Q << 12));
 646	vap_caps->desc_word[1] = cpu_to_le16(VAP_CAPABILITIES);
 647	vap_caps->desc_word[2] = cpu_to_le16(vap_status << 8);
 648	vap_caps->desc_word[4] = cpu_to_le16(mode |
 649					     (common->channel_width << 8));
 650	vap_caps->desc_word[7] = cpu_to_le16((vap_id << 8) |
 651					     (common->mac_id << 4) |
 652					     common->radio_id);
 653
 654	memcpy(vap_caps->mac_addr, common->mac_addr, IEEE80211_ADDR_LEN);
 655	vap_caps->keep_alive_period = cpu_to_le16(90);
 656	vap_caps->frag_threshold = cpu_to_le16(IEEE80211_MAX_FRAG_THRESHOLD);
 657
 658	vap_caps->rts_threshold = cpu_to_le16(common->rts_threshold);
 659	vap_caps->default_mgmt_rate = cpu_to_le32(RSI_RATE_6);
 660
 661	if (common->band == NL80211_BAND_5GHZ) {
 662		vap_caps->default_ctrl_rate = cpu_to_le32(RSI_RATE_6);
 663		if (conf_is_ht40(&common->priv->hw->conf)) {
 664			vap_caps->default_ctrl_rate |=
 665				cpu_to_le32(FULL40M_ENABLE << 16);
 666		}
 667	} else {
 668		vap_caps->default_ctrl_rate = cpu_to_le32(RSI_RATE_1);
 
 
 
 669		if (conf_is_ht40_minus(conf))
 670			vap_caps->default_ctrl_rate |=
 671				cpu_to_le32(UPPER_20_ENABLE << 16);
 672		else if (conf_is_ht40_plus(conf))
 673			vap_caps->default_ctrl_rate |=
 674				cpu_to_le32(LOWER_20_ENABLE << 16);
 
 
 
 675	}
 676
 677	vap_caps->default_data_rate = 0;
 678	vap_caps->beacon_interval = cpu_to_le16(200);
 679	vap_caps->dtim_period = cpu_to_le16(4);
 680
 681	skb_put(skb, sizeof(*vap_caps));
 682
 683	return rsi_send_internal_mgmt_frame(common, skb);
 684}
 685
 686/**
 687 * rsi_hal_load_key() - This function is used to load keys within the firmware.
 688 * @common: Pointer to the driver private structure.
 689 * @data: Pointer to the key data.
 690 * @key_len: Key length to be loaded.
 691 * @key_type: Type of key: GROUP/PAIRWISE.
 692 * @key_id: Key index.
 693 * @cipher: Type of cipher used.
 694 *
 695 * Return: 0 on success, -1 on failure.
 696 */
 697int rsi_hal_load_key(struct rsi_common *common,
 698		     u8 *data,
 699		     u16 key_len,
 700		     u8 key_type,
 701		     u8 key_id,
 702		     u32 cipher)
 
 
 703{
 704	struct sk_buff *skb = NULL;
 705	struct rsi_set_key *set_key;
 706	u16 key_descriptor = 0;
 
 707
 708	rsi_dbg(MGMT_TX_ZONE, "%s: Sending load key frame\n", __func__);
 709
 710	skb = dev_alloc_skb(sizeof(struct rsi_set_key));
 711	if (!skb) {
 712		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 713			__func__);
 714		return -ENOMEM;
 715	}
 716
 717	memset(skb->data, 0, sizeof(struct rsi_set_key));
 718	set_key = (struct rsi_set_key *)skb->data;
 719
 
 
 
 
 
 720	if ((cipher == WLAN_CIPHER_SUITE_WEP40) ||
 721	    (cipher == WLAN_CIPHER_SUITE_WEP104)) {
 722		key_len += 1;
 723		key_descriptor |= BIT(2);
 724		if (key_len >= 13)
 725			key_descriptor |= BIT(3);
 726	} else if (cipher != KEY_TYPE_CLEAR) {
 727		key_descriptor |= BIT(4);
 728		if (key_type == RSI_PAIRWISE_KEY)
 729			key_id = 0;
 730		if (cipher == WLAN_CIPHER_SUITE_TKIP)
 731			key_descriptor |= BIT(5);
 732	}
 733	key_descriptor |= (key_type | BIT(13) | (key_id << 14));
 
 734
 735	set_key->desc_word[0] = cpu_to_le16((sizeof(struct rsi_set_key) -
 736					    FRAME_DESC_SZ) |
 737					    (RSI_WIFI_MGMT_Q << 12));
 738	set_key->desc_word[1] = cpu_to_le16(SET_KEY_REQ);
 739	set_key->desc_word[4] = cpu_to_le16(key_descriptor);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 740
 741	if ((cipher == WLAN_CIPHER_SUITE_WEP40) ||
 742	    (cipher == WLAN_CIPHER_SUITE_WEP104)) {
 743		memcpy(&set_key->key[key_id][1],
 744		       data,
 745		       key_len * 2);
 746	} else {
 747		memcpy(&set_key->key[0][0], data, key_len);
 
 
 
 
 
 
 
 
 
 
 
 748	}
 749
 750	memcpy(set_key->tx_mic_key, &data[16], 8);
 751	memcpy(set_key->rx_mic_key, &data[24], 8);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 752
 753	skb_put(skb, sizeof(struct rsi_set_key));
 754
 755	return rsi_send_internal_mgmt_frame(common, skb);
 756}
 757
 758/*
 759 * rsi_load_bootup_params() - This function send bootup params to the firmware.
 760 * @common: Pointer to the driver private structure.
 761 *
 762 * Return: 0 on success, corresponding error code on failure.
 763 */
 764static int rsi_load_bootup_params(struct rsi_common *common)
 765{
 766	struct sk_buff *skb;
 767	struct rsi_boot_params *boot_params;
 768
 769	rsi_dbg(MGMT_TX_ZONE, "%s: Sending boot params frame\n", __func__);
 770	skb = dev_alloc_skb(sizeof(struct rsi_boot_params));
 771	if (!skb) {
 772		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 773			__func__);
 774		return -ENOMEM;
 775	}
 776
 777	memset(skb->data, 0, sizeof(struct rsi_boot_params));
 778	boot_params = (struct rsi_boot_params *)skb->data;
 779
 780	rsi_dbg(MGMT_TX_ZONE, "%s:\n", __func__);
 781
 782	if (common->channel_width == BW_40MHZ) {
 783		memcpy(&boot_params->bootup_params,
 784		       &boot_params_40,
 785		       sizeof(struct bootup_params));
 786		rsi_dbg(MGMT_TX_ZONE, "%s: Packet 40MHZ <=== %d\n", __func__,
 787			UMAC_CLK_40BW);
 788		boot_params->desc_word[7] = cpu_to_le16(UMAC_CLK_40BW);
 789	} else {
 790		memcpy(&boot_params->bootup_params,
 791		       &boot_params_20,
 792		       sizeof(struct bootup_params));
 793		if (boot_params_20.valid != cpu_to_le32(VALID_20)) {
 794			boot_params->desc_word[7] = cpu_to_le16(UMAC_CLK_20BW);
 795			rsi_dbg(MGMT_TX_ZONE,
 796				"%s: Packet 20MHZ <=== %d\n", __func__,
 797				UMAC_CLK_20BW);
 798		} else {
 799			boot_params->desc_word[7] = cpu_to_le16(UMAC_CLK_40MHZ);
 800			rsi_dbg(MGMT_TX_ZONE,
 801				"%s: Packet 20MHZ <=== %d\n", __func__,
 802				UMAC_CLK_40MHZ);
 803		}
 804	}
 805
 806	/**
 807	 * Bit{0:11} indicates length of the Packet
 808	 * Bit{12:15} indicates host queue number
 809	 */
 810	boot_params->desc_word[0] = cpu_to_le16(sizeof(struct bootup_params) |
 811				    (RSI_WIFI_MGMT_Q << 12));
 812	boot_params->desc_word[1] = cpu_to_le16(BOOTUP_PARAMS_REQUEST);
 813
 814	skb_put(skb, sizeof(struct rsi_boot_params));
 815
 816	return rsi_send_internal_mgmt_frame(common, skb);
 817}
 818
 819/**
 820 * rsi_send_reset_mac() - This function prepares reset MAC request and sends an
 821 *			  internal management frame to indicate it to firmware.
 822 * @common: Pointer to the driver private structure.
 823 *
 824 * Return: 0 on success, corresponding error code on failure.
 825 */
 826static int rsi_send_reset_mac(struct rsi_common *common)
 827{
 828	struct sk_buff *skb;
 829	struct rsi_mac_frame *mgmt_frame;
 830
 831	rsi_dbg(MGMT_TX_ZONE, "%s: Sending reset MAC frame\n", __func__);
 832
 833	skb = dev_alloc_skb(FRAME_DESC_SZ);
 834	if (!skb) {
 835		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 836			__func__);
 837		return -ENOMEM;
 838	}
 839
 840	memset(skb->data, 0, FRAME_DESC_SZ);
 841	mgmt_frame = (struct rsi_mac_frame *)skb->data;
 842
 843	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 844	mgmt_frame->desc_word[1] = cpu_to_le16(RESET_MAC_REQ);
 845	mgmt_frame->desc_word[4] = cpu_to_le16(RETRY_COUNT << 8);
 846
 847	skb_put(skb, FRAME_DESC_SZ);
 848
 849	return rsi_send_internal_mgmt_frame(common, skb);
 850}
 851
 852/**
 853 * rsi_band_check() - This function programs the band
 854 * @common: Pointer to the driver private structure.
 855 *
 856 * Return: 0 on success, corresponding error code on failure.
 857 */
 858int rsi_band_check(struct rsi_common *common)
 
 859{
 860	struct rsi_hw *adapter = common->priv;
 861	struct ieee80211_hw *hw = adapter->hw;
 862	u8 prev_bw = common->channel_width;
 863	u8 prev_ep = common->endpoint;
 864	struct ieee80211_channel *curchan = hw->conf.chandef.chan;
 865	int status = 0;
 866
 867	if (common->band != curchan->band) {
 868		common->rf_reset = 1;
 869		common->band = curchan->band;
 870	}
 871
 872	if ((hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) ||
 873	    (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20))
 874		common->channel_width = BW_20MHZ;
 875	else
 876		common->channel_width = BW_40MHZ;
 877
 878	if (common->band == NL80211_BAND_2GHZ) {
 879		if (common->channel_width)
 880			common->endpoint = EP_2GHZ_40MHZ;
 881		else
 882			common->endpoint = EP_2GHZ_20MHZ;
 883	} else {
 884		if (common->channel_width)
 885			common->endpoint = EP_5GHZ_40MHZ;
 886		else
 887			common->endpoint = EP_5GHZ_20MHZ;
 888	}
 889
 890	if (common->endpoint != prev_ep) {
 891		status = rsi_program_bb_rf(common);
 892		if (status)
 893			return status;
 894	}
 895
 896	if (common->channel_width != prev_bw) {
 897		status = rsi_load_bootup_params(common);
 898		if (status)
 899			return status;
 900
 901		status = rsi_load_radio_caps(common);
 902		if (status)
 903			return status;
 904	}
 905
 906	return status;
 907}
 908
 909/**
 910 * rsi_set_channel() - This function programs the channel.
 911 * @common: Pointer to the driver private structure.
 912 * @channel: Channel value to be set.
 913 *
 914 * Return: 0 on success, corresponding error code on failure.
 915 */
 916int rsi_set_channel(struct rsi_common *common,
 917		    struct ieee80211_channel *channel)
 918{
 919	struct sk_buff *skb = NULL;
 920	struct rsi_mac_frame *mgmt_frame;
 
 921
 922	rsi_dbg(MGMT_TX_ZONE,
 923		"%s: Sending scan req frame\n", __func__);
 924
 925	skb = dev_alloc_skb(FRAME_DESC_SZ);
 926	if (!skb) {
 927		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 928			__func__);
 929		return -ENOMEM;
 930	}
 931
 932	if (!channel) {
 933		dev_kfree_skb(skb);
 934		return 0;
 935	}
 936	memset(skb->data, 0, FRAME_DESC_SZ);
 937	mgmt_frame = (struct rsi_mac_frame *)skb->data;
 938
 939	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 940	mgmt_frame->desc_word[1] = cpu_to_le16(SCAN_REQUEST);
 941	mgmt_frame->desc_word[4] = cpu_to_le16(channel->hw_value);
 942
 943	mgmt_frame->desc_word[4] |=
 944		cpu_to_le16(((char)(channel->max_antenna_gain)) << 8);
 945	mgmt_frame->desc_word[5] =
 946		cpu_to_le16((char)(channel->max_antenna_gain));
 947
 948	mgmt_frame->desc_word[7] = cpu_to_le16(PUT_BBP_RESET |
 949					       BBP_REG_WRITE |
 950					       (RSI_RF_TYPE << 4));
 951
 952	if (!(channel->flags & IEEE80211_CHAN_NO_IR) &&
 953	       !(channel->flags & IEEE80211_CHAN_RADAR)) {
 954		if (common->tx_power < channel->max_power)
 955			mgmt_frame->desc_word[6] = cpu_to_le16(common->tx_power);
 956		else
 957			mgmt_frame->desc_word[6] = cpu_to_le16(channel->max_power);
 958	}
 959	mgmt_frame->desc_word[7] = cpu_to_le16(common->priv->dfs_region);
 960
 961	if (common->channel_width == BW_40MHZ)
 962		mgmt_frame->desc_word[5] |= cpu_to_le16(0x1 << 8);
 963
 964	common->channel = channel->hw_value;
 965
 966	skb_put(skb, FRAME_DESC_SZ);
 967
 968	return rsi_send_internal_mgmt_frame(common, skb);
 969}
 970
 971/**
 972 * rsi_send_radio_params_update() - This function sends the radio
 973 *				parameters update to device
 974 * @common: Pointer to the driver private structure.
 975 * @channel: Channel value to be set.
 976 *
 977 * Return: 0 on success, corresponding error code on failure.
 978 */
 979int rsi_send_radio_params_update(struct rsi_common *common)
 980{
 981	struct rsi_mac_frame *cmd_frame;
 982	struct sk_buff *skb = NULL;
 983
 984	rsi_dbg(MGMT_TX_ZONE,
 985		"%s: Sending Radio Params update frame\n", __func__);
 986
 987	skb = dev_alloc_skb(FRAME_DESC_SZ);
 988	if (!skb) {
 989		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
 990			__func__);
 991		return -ENOMEM;
 992	}
 993
 994	memset(skb->data, 0, FRAME_DESC_SZ);
 995	cmd_frame = (struct rsi_mac_frame *)skb->data;
 996
 997	cmd_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 998	cmd_frame->desc_word[1] = cpu_to_le16(RADIO_PARAMS_UPDATE);
 999	cmd_frame->desc_word[3] = cpu_to_le16(BIT(0));
1000
1001	cmd_frame->desc_word[3] |= cpu_to_le16(common->tx_power << 8);
1002
1003	skb_put(skb, FRAME_DESC_SZ);
1004
1005	return rsi_send_internal_mgmt_frame(common, skb);
1006}
1007
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1008/**
1009 * rsi_compare() - This function is used to compare two integers
1010 * @a: pointer to the first integer
1011 * @b: pointer to the second integer
1012 *
1013 * Return: 0 if both are equal, -1 if the first is smaller, else 1
1014 */
1015static int rsi_compare(const void *a, const void *b)
1016{
1017	u16 _a = *(const u16 *)(a);
1018	u16 _b = *(const u16 *)(b);
1019
1020	if (_a > _b)
1021		return -1;
1022
1023	if (_a < _b)
1024		return 1;
1025
1026	return 0;
1027}
1028
1029/**
1030 * rsi_map_rates() - This function is used to map selected rates to hw rates.
1031 * @rate: The standard rate to be mapped.
1032 * @offset: Offset that will be returned.
1033 *
1034 * Return: 0 if it is a mcs rate, else 1
1035 */
1036static bool rsi_map_rates(u16 rate, int *offset)
1037{
1038	int kk;
1039	for (kk = 0; kk < ARRAY_SIZE(rsi_mcsrates); kk++) {
1040		if (rate == mcs[kk]) {
1041			*offset = kk;
1042			return false;
1043		}
1044	}
1045
1046	for (kk = 0; kk < ARRAY_SIZE(rsi_rates); kk++) {
1047		if (rate == rsi_rates[kk].bitrate / 5) {
1048			*offset = kk;
1049			break;
1050		}
1051	}
1052	return true;
1053}
1054
1055/**
1056 * rsi_send_auto_rate_request() - This function is to set rates for connection
1057 *				  and send autorate request to firmware.
1058 * @common: Pointer to the driver private structure.
1059 *
1060 * Return: 0 on success, corresponding error code on failure.
1061 */
1062static int rsi_send_auto_rate_request(struct rsi_common *common)
 
 
 
1063{
1064	struct sk_buff *skb;
1065	struct rsi_auto_rate *auto_rate;
1066	int ii = 0, jj = 0, kk = 0;
1067	struct ieee80211_hw *hw = common->priv->hw;
1068	u8 band = hw->conf.chandef.chan->band;
1069	u8 num_supported_rates = 0;
1070	u8 rate_table_offset, rate_offset = 0;
1071	u32 rate_bitmap = common->bitrate_mask[band];
 
 
 
1072
1073	u16 *selected_rates, min_rate;
 
1074
1075	skb = dev_alloc_skb(sizeof(struct rsi_auto_rate));
1076	if (!skb) {
1077		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1078			__func__);
1079		return -ENOMEM;
1080	}
1081
1082	selected_rates = kzalloc(2 * RSI_TBL_SZ, GFP_KERNEL);
1083	if (!selected_rates) {
1084		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of mem\n",
1085			__func__);
1086		dev_kfree_skb(skb);
1087		return -ENOMEM;
1088	}
1089
1090	memset(skb->data, 0, sizeof(struct rsi_auto_rate));
1091
1092	auto_rate = (struct rsi_auto_rate *)skb->data;
1093
1094	auto_rate->aarf_rssi = cpu_to_le16(((u16)3 << 6) | (u16)(18 & 0x3f));
1095	auto_rate->collision_tolerance = cpu_to_le16(3);
1096	auto_rate->failure_limit = cpu_to_le16(3);
1097	auto_rate->initial_boundary = cpu_to_le16(3);
1098	auto_rate->max_threshold_limt = cpu_to_le16(27);
1099
1100	auto_rate->desc_word[1] = cpu_to_le16(AUTO_RATE_IND);
1101
1102	if (common->channel_width == BW_40MHZ)
1103		auto_rate->desc_word[7] |= cpu_to_le16(1);
 
 
 
 
 
 
 
 
 
 
 
 
 
1104
1105	if (band == NL80211_BAND_2GHZ) {
1106		min_rate = RSI_RATE_1;
 
 
 
1107		rate_table_offset = 0;
1108	} else {
1109		min_rate = RSI_RATE_6;
 
 
 
1110		rate_table_offset = 4;
1111	}
1112
1113	for (ii = 0, jj = 0;
1114	     ii < (ARRAY_SIZE(rsi_rates) - rate_table_offset); ii++) {
1115		if (rate_bitmap & BIT(ii)) {
1116			selected_rates[jj++] =
1117			(rsi_rates[ii + rate_table_offset].bitrate / 5);
1118			rate_offset++;
1119		}
1120	}
1121	num_supported_rates = jj;
1122
1123	if (common->vif_info[0].is_ht) {
1124		for (ii = 0; ii < ARRAY_SIZE(mcs); ii++)
1125			selected_rates[jj++] = mcs[ii];
1126		num_supported_rates += ARRAY_SIZE(mcs);
1127		rate_offset += ARRAY_SIZE(mcs);
1128	}
1129
1130	sort(selected_rates, jj, sizeof(u16), &rsi_compare, NULL);
1131
1132	/* mapping the rates to RSI rates */
1133	for (ii = 0; ii < jj; ii++) {
1134		if (rsi_map_rates(selected_rates[ii], &kk)) {
1135			auto_rate->supported_rates[ii] =
1136				cpu_to_le16(rsi_rates[kk].hw_value);
1137		} else {
1138			auto_rate->supported_rates[ii] =
1139				cpu_to_le16(rsi_mcsrates[kk]);
1140		}
1141	}
1142
1143	/* loading HT rates in the bottom half of the auto rate table */
1144	if (common->vif_info[0].is_ht) {
1145		for (ii = rate_offset, kk = ARRAY_SIZE(rsi_mcsrates) - 1;
1146		     ii < rate_offset + 2 * ARRAY_SIZE(rsi_mcsrates); ii++) {
1147			if (common->vif_info[0].sgi ||
1148			    conf_is_ht40(&common->priv->hw->conf))
1149				auto_rate->supported_rates[ii++] =
1150					cpu_to_le16(rsi_mcsrates[kk] | BIT(9));
 
 
 
1151			auto_rate->supported_rates[ii] =
1152				cpu_to_le16(rsi_mcsrates[kk--]);
1153		}
1154
1155		for (; ii < (RSI_TBL_SZ - 1); ii++) {
1156			auto_rate->supported_rates[ii] =
1157				cpu_to_le16(rsi_mcsrates[0]);
1158		}
1159	}
1160
1161	for (; ii < RSI_TBL_SZ; ii++)
1162		auto_rate->supported_rates[ii] = cpu_to_le16(min_rate);
1163
1164	auto_rate->num_supported_rates = cpu_to_le16(num_supported_rates * 2);
1165	auto_rate->moderate_rate_inx = cpu_to_le16(num_supported_rates / 2);
1166	auto_rate->desc_word[7] |= cpu_to_le16(0 << 8);
1167	num_supported_rates *= 2;
1168
1169	auto_rate->desc_word[0] = cpu_to_le16((sizeof(*auto_rate) -
1170					       FRAME_DESC_SZ) |
1171					       (RSI_WIFI_MGMT_Q << 12));
1172
1173	skb_put(skb,
1174		sizeof(struct rsi_auto_rate));
1175	kfree(selected_rates);
1176
1177	return rsi_send_internal_mgmt_frame(common, skb);
1178}
1179
1180/**
1181 * rsi_inform_bss_status() - This function informs about bss status with the
1182 *			     help of sta notify params by sending an internal
1183 *			     management frame to firmware.
1184 * @common: Pointer to the driver private structure.
1185 * @status: Bss status type.
1186 * @bssid: Bssid.
1187 * @qos_enable: Qos is enabled.
1188 * @aid: Aid (unique for all STAs).
1189 *
1190 * Return: None.
1191 */
1192void rsi_inform_bss_status(struct rsi_common *common,
 
1193			   u8 status,
1194			   const unsigned char *bssid,
1195			   u8 qos_enable,
1196			   u16 aid)
 
 
 
1197{
1198	if (status) {
 
 
1199		rsi_hal_send_sta_notify_frame(common,
1200					      RSI_IFTYPE_STATION,
1201					      STA_CONNECTED,
1202					      bssid,
1203					      qos_enable,
1204					      aid);
 
1205		if (common->min_rate == 0xffff)
1206			rsi_send_auto_rate_request(common);
 
 
 
 
1207	} else {
1208		rsi_hal_send_sta_notify_frame(common,
1209					      RSI_IFTYPE_STATION,
1210					      STA_DISCONNECTED,
1211					      bssid,
1212					      qos_enable,
1213					      aid);
 
 
 
 
1214	}
1215}
1216
1217/**
1218 * rsi_eeprom_read() - This function sends a frame to read the mac address
1219 *		       from the eeprom.
1220 * @common: Pointer to the driver private structure.
1221 *
1222 * Return: 0 on success, -1 on failure.
1223 */
1224static int rsi_eeprom_read(struct rsi_common *common)
1225{
1226	struct rsi_mac_frame *mgmt_frame;
 
1227	struct sk_buff *skb;
1228
1229	rsi_dbg(MGMT_TX_ZONE, "%s: Sending EEPROM read req frame\n", __func__);
1230
1231	skb = dev_alloc_skb(FRAME_DESC_SZ);
1232	if (!skb) {
1233		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1234			__func__);
1235		return -ENOMEM;
1236	}
1237
1238	memset(skb->data, 0, FRAME_DESC_SZ);
1239	mgmt_frame = (struct rsi_mac_frame *)skb->data;
1240
1241	/* FrameType */
1242	mgmt_frame->desc_word[1] = cpu_to_le16(EEPROM_READ_TYPE);
1243	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 
1244	/* Number of bytes to read */
1245	mgmt_frame->desc_word[3] = cpu_to_le16(ETH_ALEN +
1246					       WLAN_MAC_MAGIC_WORD_LEN +
1247					       WLAN_HOST_MODE_LEN +
1248					       WLAN_FW_VERSION_LEN);
 
 
1249	/* Address to read */
1250	mgmt_frame->desc_word[4] = cpu_to_le16(WLAN_MAC_EEPROM_ADDR);
1251
1252	skb_put(skb, FRAME_DESC_SZ);
1253
1254	return rsi_send_internal_mgmt_frame(common, skb);
1255}
1256
1257/**
1258 * This function sends a frame to block/unblock
1259 * data queues in the firmware
1260 *
1261 * @param common Pointer to the driver private structure.
1262 * @param block event - block if true, unblock if false
1263 * @return 0 on success, -1 on failure.
1264 */
1265int rsi_send_block_unblock_frame(struct rsi_common *common, bool block_event)
1266{
1267	struct rsi_mac_frame *mgmt_frame;
1268	struct sk_buff *skb;
1269
1270	rsi_dbg(MGMT_TX_ZONE, "%s: Sending block/unblock frame\n", __func__);
1271
1272	skb = dev_alloc_skb(FRAME_DESC_SZ);
1273	if (!skb) {
1274		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1275			__func__);
1276		return -ENOMEM;
1277	}
1278
1279	memset(skb->data, 0, FRAME_DESC_SZ);
1280	mgmt_frame = (struct rsi_mac_frame *)skb->data;
1281
1282	mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
1283	mgmt_frame->desc_word[1] = cpu_to_le16(BLOCK_HW_QUEUE);
 
1284
1285	if (block_event) {
1286		rsi_dbg(INFO_ZONE, "blocking the data qs\n");
1287		mgmt_frame->desc_word[4] = cpu_to_le16(0xf);
 
1288	} else {
1289		rsi_dbg(INFO_ZONE, "unblocking the data qs\n");
1290		mgmt_frame->desc_word[5] = cpu_to_le16(0xf);
 
1291	}
1292
1293	skb_put(skb, FRAME_DESC_SZ);
1294
1295	return rsi_send_internal_mgmt_frame(common, skb);
1296
1297}
1298
1299/**
1300 * rsi_send_rx_filter_frame() - Sends a frame to filter the RX packets
1301 *
1302 * @common: Pointer to the driver private structure.
1303 * @rx_filter_word: Flags of filter packets
1304 *
1305 * @Return: 0 on success, -1 on failure.
1306 */
1307int rsi_send_rx_filter_frame(struct rsi_common *common, u16 rx_filter_word)
1308{
1309	struct rsi_mac_frame *cmd_frame;
1310	struct sk_buff *skb;
1311
1312	rsi_dbg(MGMT_TX_ZONE, "Sending RX filter frame\n");
1313
1314	skb = dev_alloc_skb(FRAME_DESC_SZ);
1315	if (!skb) {
1316		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1317			__func__);
1318		return -ENOMEM;
1319	}
1320
1321	memset(skb->data, 0, FRAME_DESC_SZ);
1322	cmd_frame = (struct rsi_mac_frame *)skb->data;
1323
1324	cmd_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
1325	cmd_frame->desc_word[1] = cpu_to_le16(SET_RX_FILTER);
1326	cmd_frame->desc_word[4] = cpu_to_le16(rx_filter_word);
1327
1328	skb_put(skb, FRAME_DESC_SZ);
1329
1330	return rsi_send_internal_mgmt_frame(common, skb);
1331}
1332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1333/**
1334 * rsi_set_antenna() - This fuction send antenna configuration request
1335 *		       to device
1336 *
1337 * @common: Pointer to the driver private structure.
1338 * @antenna: bitmap for tx antenna selection
1339 *
1340 * Return: 0 on Success, negative error code on failure
1341 */
1342int rsi_set_antenna(struct rsi_common *common, u8 antenna)
1343{
1344	struct rsi_mac_frame *cmd_frame;
1345	struct sk_buff *skb;
1346
1347	skb = dev_alloc_skb(FRAME_DESC_SZ);
1348	if (!skb) {
1349		rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n",
1350			__func__);
1351		return -ENOMEM;
1352	}
1353
1354	memset(skb->data, 0, FRAME_DESC_SZ);
1355	cmd_frame = (struct rsi_mac_frame *)skb->data;
1356
1357	cmd_frame->desc_word[1] = cpu_to_le16(ANT_SEL_FRAME);
1358	cmd_frame->desc_word[3] = cpu_to_le16(antenna & 0x00ff);
1359	cmd_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1360
1361	skb_put(skb, FRAME_DESC_SZ);
1362
1363	return rsi_send_internal_mgmt_frame(common, skb);
1364}
 
1365
1366/**
1367 * rsi_handle_ta_confirm_type() - This function handles the confirm frames.
1368 * @common: Pointer to the driver private structure.
1369 * @msg: Pointer to received packet.
1370 *
1371 * Return: 0 on success, -1 on failure.
1372 */
1373static int rsi_handle_ta_confirm_type(struct rsi_common *common,
1374				      u8 *msg)
1375{
 
1376	u8 sub_type = (msg[15] & 0xff);
 
 
1377
1378	switch (sub_type) {
1379	case BOOTUP_PARAMS_REQUEST:
1380		rsi_dbg(FSM_ZONE, "%s: Boot up params confirm received\n",
1381			__func__);
1382		if (common->fsm_state == FSM_BOOT_PARAMS_SENT) {
 
 
 
 
1383			if (rsi_eeprom_read(common)) {
1384				common->fsm_state = FSM_CARD_NOT_READY;
1385				goto out;
1386			} else {
1387				common->fsm_state = FSM_EEPROM_READ_MAC_ADDR;
1388			}
 
1389		} else {
1390			rsi_dbg(INFO_ZONE,
1391				"%s: Received bootup params cfm in %d state\n",
1392				 __func__, common->fsm_state);
1393			return 0;
1394		}
1395		break;
1396
1397	case EEPROM_READ_TYPE:
 
 
 
 
 
 
 
 
 
 
 
 
 
1398		if (common->fsm_state == FSM_EEPROM_READ_MAC_ADDR) {
1399			if (msg[16] == MAGIC_WORD) {
1400				u8 offset = (FRAME_DESC_SZ + WLAN_HOST_MODE_LEN
1401					     + WLAN_MAC_MAGIC_WORD_LEN);
1402				memcpy(common->mac_addr,
1403				       &msg[offset],
1404				       ETH_ALEN);
1405				memcpy(&common->fw_ver,
1406				       &msg[offset + ETH_ALEN],
1407				       sizeof(struct version_info));
1408
1409			} else {
1410				common->fsm_state = FSM_CARD_NOT_READY;
1411				break;
 
 
 
 
 
 
 
 
 
 
 
 
1412			}
1413			if (rsi_send_reset_mac(common))
1414				goto out;
1415			else
1416				common->fsm_state = FSM_RESET_MAC_SENT;
1417		} else {
1418			rsi_dbg(ERR_ZONE,
1419				"%s: Received eeprom mac addr in %d state\n",
1420				__func__, common->fsm_state);
1421			return 0;
1422		}
1423		break;
1424
1425	case RESET_MAC_REQ:
1426		if (common->fsm_state == FSM_RESET_MAC_SENT) {
1427			rsi_dbg(FSM_ZONE, "%s: Reset MAC cfm received\n",
1428				__func__);
1429
1430			if (rsi_load_radio_caps(common))
1431				goto out;
1432			else
1433				common->fsm_state = FSM_RADIO_CAPS_SENT;
1434		} else {
1435			rsi_dbg(ERR_ZONE,
1436				"%s: Received reset mac cfm in %d state\n",
1437				 __func__, common->fsm_state);
1438			return 0;
1439		}
1440		break;
1441
1442	case RADIO_CAPABILITIES:
1443		if (common->fsm_state == FSM_RADIO_CAPS_SENT) {
1444			common->rf_reset = 1;
1445			if (rsi_program_bb_rf(common)) {
1446				goto out;
1447			} else {
1448				common->fsm_state = FSM_BB_RF_PROG_SENT;
1449				rsi_dbg(FSM_ZONE, "%s: Radio cap cfm received\n",
1450					__func__);
1451			}
1452		} else {
1453			rsi_dbg(INFO_ZONE,
1454				"%s: Received radio caps cfm in %d state\n",
1455				 __func__, common->fsm_state);
1456			return 0;
1457		}
1458		break;
1459
1460	case BB_PROG_VALUES_REQUEST:
1461	case RF_PROG_VALUES_REQUEST:
1462	case BBP_PROG_IN_TA:
1463		rsi_dbg(FSM_ZONE, "%s: BB/RF cfm received\n", __func__);
1464		if (common->fsm_state == FSM_BB_RF_PROG_SENT) {
1465			common->bb_rf_prog_count--;
1466			if (!common->bb_rf_prog_count) {
1467				common->fsm_state = FSM_MAC_INIT_DONE;
1468				return rsi_mac80211_attach(common);
 
 
 
 
1469			}
1470		} else {
1471			rsi_dbg(INFO_ZONE,
1472				"%s: Received bbb_rf cfm in %d state\n",
1473				 __func__, common->fsm_state);
1474			return 0;
1475		}
1476		break;
1477
 
 
1478	default:
1479		rsi_dbg(INFO_ZONE, "%s: Invalid TA confirm pkt received\n",
1480			__func__);
1481		break;
1482	}
1483	return 0;
1484out:
1485	rsi_dbg(ERR_ZONE, "%s: Unable to send pkt/Invalid frame received\n",
1486		__func__);
1487	return -EINVAL;
1488}
1489
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1490/**
1491 * rsi_mgmt_pkt_recv() - This function processes the management packets
1492 *			 recieved from the hardware.
1493 * @common: Pointer to the driver private structure.
1494 * @msg: Pointer to the received packet.
1495 *
1496 * Return: 0 on success, -1 on failure.
1497 */
1498int rsi_mgmt_pkt_recv(struct rsi_common *common, u8 *msg)
1499{
1500	s32 msg_len = (le16_to_cpu(*(__le16 *)&msg[0]) & 0x0fff);
1501	u16 msg_type = (msg[2]);
1502	int ret;
1503
1504	rsi_dbg(FSM_ZONE, "%s: Msg Len: %d, Msg Type: %4x\n",
1505		__func__, msg_len, msg_type);
1506
1507	if (msg_type == TA_CONFIRM_TYPE) {
 
1508		return rsi_handle_ta_confirm_type(common, msg);
1509	} else if (msg_type == CARD_READY_IND) {
 
1510		rsi_dbg(FSM_ZONE, "%s: Card ready indication received\n",
1511			__func__);
1512		if (common->fsm_state == FSM_CARD_NOT_READY) {
1513			rsi_set_default_parameters(common);
1514
1515			ret = rsi_load_bootup_params(common);
1516			if (ret)
1517				return ret;
1518			else
1519				common->fsm_state = FSM_BOOT_PARAMS_SENT;
1520		} else {
1521			return -EINVAL;
1522		}
1523	} else if (msg_type == TX_STATUS_IND) {
1524		if (msg[15] == PROBEREQ_CONFIRM) {
1525			common->mgmt_q_block = false;
1526			rsi_dbg(FSM_ZONE, "%s: Probe confirm received\n",
1527				__func__);
1528		}
1529	} else {
1530		return rsi_mgmt_pkt_to_core(common, msg, msg_len, msg_type);
 
 
 
 
 
 
 
 
 
 
 
 
 
1531	}
1532	return 0;
1533}