cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rsi_91x_mgmt.c (65637B)


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