diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/init.c')
| -rw-r--r-- | drivers/net/wireless/mwifiex/init.c | 35 | 
1 files changed, 33 insertions, 2 deletions
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c index 520ad4a3018b..b77ba743e1c4 100644 --- a/drivers/net/wireless/mwifiex/init.c +++ b/drivers/net/wireless/mwifiex/init.c @@ -52,6 +52,18 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)  	return 0;  } +static void wakeup_timer_fn(unsigned long data) +{ +	struct mwifiex_adapter *adapter = (struct mwifiex_adapter *)data; + +	dev_err(adapter->dev, "Firmware wakeup failed\n"); +	adapter->hw_status = MWIFIEX_HW_STATUS_RESET; +	mwifiex_cancel_all_pending_cmd(adapter); + +	if (adapter->if_ops.card_reset) +		adapter->if_ops.card_reset(adapter); +} +  /*   * This function initializes the private structure and sets default   * values to the members. @@ -140,6 +152,8 @@ int mwifiex_init_priv(struct mwifiex_private *priv)  	priv->check_tdls_tx = false;  	memcpy(priv->tos_to_tid_inv, tos_to_tid_inv, MAX_NUM_TID); +	mwifiex_init_11h_params(priv); +  	return mwifiex_add_bss_prio_tbl(priv);  } @@ -282,9 +296,16 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)  	memset(&adapter->arp_filter, 0, sizeof(adapter->arp_filter));  	adapter->arp_filter_size = 0;  	adapter->max_mgmt_ie_index = MAX_MGMT_IE_INDEX; -	adapter->ext_scan = true; +	adapter->ext_scan = false;  	adapter->key_api_major_ver = 0;  	adapter->key_api_minor_ver = 0; +	memset(adapter->perm_addr, 0xff, ETH_ALEN); +	adapter->iface_limit.sta_intf = MWIFIEX_MAX_STA_NUM; +	adapter->iface_limit.uap_intf = MWIFIEX_MAX_UAP_NUM; +	adapter->iface_limit.p2p_intf = MWIFIEX_MAX_P2P_NUM; + +	setup_timer(&adapter->wakeup_timer, wakeup_timer_fn, +		    (unsigned long)adapter);  }  /* @@ -391,7 +412,10 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter)  		return;  	} +	del_timer(&adapter->wakeup_timer);  	mwifiex_cancel_all_pending_cmd(adapter); +	wake_up_interruptible(&adapter->cmd_wait_q.wait); +	wake_up_interruptible(&adapter->hs_activate_wait_q);  	/* Free lock variables */  	mwifiex_free_lock_list(adapter); @@ -411,6 +435,11 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter)  		entry->mem_size = 0;  	} +	if (adapter->drv_info_dump) { +		vfree(adapter->drv_info_dump); +		adapter->drv_info_size = 0; +	} +  	if (adapter->sleep_cfm)  		dev_kfree_skb_any(adapter->sleep_cfm);  } @@ -528,7 +557,8 @@ int mwifiex_init_fw(struct mwifiex_adapter *adapter)  	for (i = 0; i < adapter->priv_num; i++) {  		if (adapter->priv[i]) { -			ret = mwifiex_sta_init_cmd(adapter->priv[i], first_sta); +			ret = mwifiex_sta_init_cmd(adapter->priv[i], first_sta, +						   true);  			if (ret == -1)  				return -1; @@ -653,6 +683,7 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)  			priv = adapter->priv[i];  			mwifiex_clean_auto_tdls(priv); +			mwifiex_abort_cac(priv);  			mwifiex_clean_txrx(priv);  			mwifiex_delete_bss_prio_tbl(priv);  		}  | 

