diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/main.c')
| -rw-r--r-- | drivers/net/wireless/mwifiex/main.c | 71 | 
1 files changed, 28 insertions, 43 deletions
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c index c2b91f566e0..e91cd0fa5ca 100644 --- a/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c @@ -38,7 +38,8 @@ static void scan_delay_timer_fn(unsigned long data)  	if (adapter->surprise_removed)  		return; -	if (adapter->scan_delay_cnt == MWIFIEX_MAX_SCAN_DELAY_CNT) { +	if (adapter->scan_delay_cnt == MWIFIEX_MAX_SCAN_DELAY_CNT || +	    !adapter->scan_processing) {  		/*  		 * Abort scan operation by cancelling all pending scan  		 * commands @@ -194,7 +195,7 @@ static int mwifiex_unregister(struct mwifiex_adapter *adapter)  	if (adapter->if_ops.cleanup_if)  		adapter->if_ops.cleanup_if(adapter); -	del_timer(&adapter->cmd_timer); +	del_timer_sync(&adapter->cmd_timer);  	/* Free private structures */  	for (i = 0; i < adapter->priv_num; i++) { @@ -291,6 +292,12 @@ process_start:  			while ((skb = skb_dequeue(&adapter->usb_rx_data_q)))  				mwifiex_handle_rx_packet(adapter, skb); +		/* Check for event */ +		if (adapter->event_received) { +			adapter->event_received = false; +			mwifiex_process_event(adapter); +		} +  		/* Check for Cmd Resp */  		if (adapter->cmd_resp_received) {  			adapter->cmd_resp_received = false; @@ -303,12 +310,6 @@ process_start:  			}  		} -		/* Check for event */ -		if (adapter->event_received) { -			adapter->event_received = false; -			mwifiex_process_event(adapter); -		} -  		/* Check if we need to confirm Sleep Request  		   received previously */  		if (adapter->ps_state == PS_STATE_PRE_SLEEP) { @@ -411,13 +412,14 @@ static void mwifiex_terminate_workqueue(struct mwifiex_adapter *adapter)   */  static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)  { -	int ret, i; +	int ret;  	char fmt[64];  	struct mwifiex_private *priv;  	struct mwifiex_adapter *adapter = context;  	struct mwifiex_fw_image fw;  	struct semaphore *sem = adapter->card_sem;  	bool init_failed = false; +	struct wireless_dev *wdev;  	if (!firmware) {  		dev_err(adapter->dev, @@ -469,14 +471,16 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)  	priv = adapter->priv[MWIFIEX_BSS_ROLE_STA];  	if (mwifiex_register_cfg80211(adapter)) {  		dev_err(adapter->dev, "cannot register with cfg80211\n"); -		goto err_register_cfg80211; +		goto err_init_fw;  	}  	rtnl_lock();  	/* Create station interface by default */ -	if (!mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", -				      NL80211_IFTYPE_STATION, NULL, NULL)) { +	wdev = mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", +					NL80211_IFTYPE_STATION, NULL, NULL); +	if (IS_ERR(wdev)) {  		dev_err(adapter->dev, "cannot create default STA interface\n"); +		rtnl_unlock();  		goto err_add_intf;  	}  	rtnl_unlock(); @@ -486,17 +490,6 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)  	goto done;  err_add_intf: -	for (i = 0; i < adapter->priv_num; i++) { -		priv = adapter->priv[i]; - -		if (!priv) -			continue; - -		if (priv->wdev && priv->netdev) -			mwifiex_del_virtual_intf(adapter->wiphy, priv->wdev); -	} -	rtnl_unlock(); -err_register_cfg80211:  	wiphy_unregister(adapter->wiphy);  	wiphy_free(adapter->wiphy);  err_init_fw: @@ -528,7 +521,6 @@ done:  		release_firmware(adapter->firmware);  		adapter->firmware = NULL;  	} -	complete(&adapter->fw_load);  	if (init_failed)  		mwifiex_free_adapter(adapter);  	up(sem); @@ -542,7 +534,6 @@ static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter)  {  	int ret; -	init_completion(&adapter->fw_load);  	ret = request_firmware_nowait(THIS_MODULE, 1, adapter->fw_name,  				      adapter->dev, GFP_KERNEL, adapter,  				      mwifiex_fw_dpc); @@ -654,8 +645,10 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)  	}  	tx_info = MWIFIEX_SKB_TXCB(skb); +	memset(tx_info, 0, sizeof(*tx_info));  	tx_info->bss_num = priv->bss_num;  	tx_info->bss_type = priv->bss_type; +	tx_info->pkt_len = skb->len;  	/* Record the current time the packet was queued; used to  	 * determine the amount of time the packet was queued in @@ -685,8 +678,8 @@ mwifiex_set_mac_address(struct net_device *dev, void *addr)  	memcpy(priv->curr_addr, hw_addr->sa_data, ETH_ALEN);  	/* Send request to firmware */ -	ret = mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_MAC_ADDRESS, -				    HostCmd_ACT_GEN_SET, 0, NULL); +	ret = mwifiex_send_cmd(priv, HostCmd_CMD_802_11_MAC_ADDRESS, +			       HostCmd_ACT_GEN_SET, 0, NULL, true);  	if (!ret)  		memcpy(priv->netdev->dev_addr, priv->curr_addr, ETH_ALEN); @@ -754,9 +747,10 @@ static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)  }  static u16 -mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb) +mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb, +				void *accel_priv, select_queue_fallback_t fallback)  { -	skb->priority = cfg80211_classify8021d(skb); +	skb->priority = cfg80211_classify8021d(skb, NULL);  	return mwifiex_1d_to_wmm_queue[skb->priority];  } @@ -877,12 +871,13 @@ mwifiex_add_card(void *card, struct semaphore *sem,  	adapter->is_suspended = false;  	adapter->hs_activated = false;  	init_waitqueue_head(&adapter->hs_activate_wait_q); -	adapter->cmd_wait_q_required = false;  	init_waitqueue_head(&adapter->cmd_wait_q.wait);  	adapter->cmd_wait_q.status = 0;  	adapter->scan_wait_q_woken = false; -	adapter->workqueue = create_workqueue("MWIFIEX_WORK_QUEUE"); +	adapter->workqueue = +		alloc_workqueue("MWIFIEX_WORK_QUEUE", +				WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1);  	if (!adapter->workqueue)  		goto err_kmalloc; @@ -997,18 +992,8 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)  		rtnl_unlock();  	} -	priv = adapter->priv[0]; -	if (!priv || !priv->wdev) -		goto exit_remove; - -	wiphy_unregister(priv->wdev->wiphy); -	wiphy_free(priv->wdev->wiphy); - -	for (i = 0; i < adapter->priv_num; i++) { -		priv = adapter->priv[i]; -		if (priv) -			kfree(priv->wdev); -	} +	wiphy_unregister(adapter->wiphy); +	wiphy_free(adapter->wiphy);  	mwifiex_terminate_workqueue(adapter);  | 
