diff options
Diffstat (limited to 'drivers/net/wireless')
| -rw-r--r-- | drivers/net/wireless/ath/regd.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/xmit.c | 15 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/xmit.h | 16 | ||||
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmsmac/dma.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | 33 | ||||
| -rw-r--r-- | drivers/net/wireless/libertas/cfg.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/libertas/if_spi.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/mwifiex/scan.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 22 | ||||
| -rw-r--r-- | drivers/net/wireless/wl12xx/scan.c | 2 | 
12 files changed, 81 insertions, 28 deletions
diff --git a/drivers/net/wireless/ath/regd.c b/drivers/net/wireless/ath/regd.c index 85fa9cc7350..65ecb5bab25 100644 --- a/drivers/net/wireless/ath/regd.c +++ b/drivers/net/wireless/ath/regd.c @@ -254,6 +254,8 @@ ath_reg_apply_active_scan_flags(struct wiphy *wiphy,  	int r;  	sband = wiphy->bands[IEEE80211_BAND_2GHZ]; +	if (!sband) +		return;  	/*  	 * If no country IE has been received always enable active scan diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 58ea0e5fabf..5f77cbe0b6a 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c @@ -175,6 +175,7 @@ void b43_generate_plcp_hdr(struct b43_plcp_hdr4 *plcp,  	}  } +/* TODO: verify if needed for SSLPN or LCN  */  static u16 b43_generate_tx_phy_ctl1(struct b43_wldev *dev, u8 bitrate)  {  	const struct b43_phy *phy = &dev->phy; @@ -256,6 +257,9 @@ int b43_generate_txhdr(struct b43_wldev *dev,  	unsigned int plcp_fragment_len;  	u32 mac_ctl = 0;  	u16 phy_ctl = 0; +	bool fill_phy_ctl1 = (phy->type == B43_PHYTYPE_LP || +			      phy->type == B43_PHYTYPE_N || +			      phy->type == B43_PHYTYPE_HT);  	u8 extra_ft = 0;  	struct ieee80211_rate *txrate;  	struct ieee80211_tx_rate *rates; @@ -531,7 +535,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,  			extra_ft |= B43_TXH_EFT_RTSFB_CCK;  		if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS && -		    phy->type == B43_PHYTYPE_N) { +		    fill_phy_ctl1) {  			txhdr->phy_ctl1_rts = cpu_to_le16(  				b43_generate_tx_phy_ctl1(dev, rts_rate));  			txhdr->phy_ctl1_rts_fb = cpu_to_le16( @@ -552,7 +556,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		break;  	} -	if (phy->type == B43_PHYTYPE_N) { +	if (fill_phy_ctl1) {  		txhdr->phy_ctl1 =  			cpu_to_le16(b43_generate_tx_phy_ctl1(dev, rate));  		txhdr->phy_ctl1_fb = @@ -736,7 +740,14 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)  	/* Link quality statistics */  	switch (chanstat & B43_RX_CHAN_PHYTYPE) { +	case B43_PHYTYPE_HT: +		/* TODO: is max the right choice? */ +		status.signal = max_t(__s8, +			max(rxhdr->phy_ht_power0, rxhdr->phy_ht_power1), +			rxhdr->phy_ht_power2); +		break;  	case B43_PHYTYPE_N: +		/* Broadcom has code for min and avg, but always uses max */  		if (rxhdr->power0 == 16 || rxhdr->power0 == 32)  			status.signal = max(rxhdr->power1, rxhdr->power2);  		else diff --git a/drivers/net/wireless/b43/xmit.h b/drivers/net/wireless/b43/xmit.h index 16c514d54af..98d90747836 100644 --- a/drivers/net/wireless/b43/xmit.h +++ b/drivers/net/wireless/b43/xmit.h @@ -249,6 +249,12 @@ struct b43_rxhdr_fw4 {  		} __packed;  	} __packed;  	union { +		/* HT-PHY */ +		struct { +			PAD_BYTES(1); +			__s8 phy_ht_power0; +		} __packed; +  		/* RSSI for N-PHYs */  		struct {  			__s8 power2; @@ -257,7 +263,15 @@ struct b43_rxhdr_fw4 {  		__le16 phy_status2;	/* PHY RX Status 2 */  	} __packed; -	__le16 phy_status3;	/* PHY RX Status 3 */ +	union { +		/* HT-PHY */ +		struct { +			__s8 phy_ht_power1; +			__s8 phy_ht_power2; +		} __packed; + +		__le16 phy_status3;	/* PHY RX Status 3 */ +	} __packed;  	union {  		/* Tested with 598.314, 644.1001 and 666.2 */  		struct { diff --git a/drivers/net/wireless/brcm80211/brcmsmac/dma.c b/drivers/net/wireless/brcm80211/brcmsmac/dma.c index b56a30297c2..6ebec8f4284 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/dma.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/dma.c @@ -358,13 +358,14 @@ static uint nrxdactive(struct dma_info *di, uint h, uint t)  static uint _dma_ctrlflags(struct dma_info *di, uint mask, uint flags)  { -	uint dmactrlflags = di->dma.dmactrlflags; +	uint dmactrlflags;  	if (di == NULL) { -		DMA_ERROR(("%s: _dma_ctrlflags: NULL dma handle\n", di->name)); +		DMA_ERROR(("_dma_ctrlflags: NULL dma handle\n"));  		return 0;  	} +	dmactrlflags = di->dma.dmactrlflags;  	dmactrlflags &= ~mask;  	dmactrlflags |= flags; diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index da3411057af..ce918980e97 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c @@ -990,29 +990,16 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans)  	return 0;  } -static void iwl_trans_pcie_disable_sync_irq(struct iwl_trans *trans) +static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)  {  	unsigned long flags; -	struct iwl_trans_pcie *trans_pcie = -		IWL_TRANS_GET_PCIE_TRANS(trans); +	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); +	/* tell the device to stop sending interrupts */  	spin_lock_irqsave(&trans->shrd->lock, flags);  	iwl_disable_interrupts(trans);  	spin_unlock_irqrestore(&trans->shrd->lock, flags); -	/* wait to make sure we flush pending tasklet*/ -	synchronize_irq(bus(trans)->irq); -	tasklet_kill(&trans_pcie->irq_tasklet); -} - -static void iwl_trans_pcie_stop_device(struct iwl_trans *trans) -{ -	/* stop and reset the on-board processor */ -	iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET); - -	/* tell the device to stop sending interrupts */ -	iwl_trans_pcie_disable_sync_irq(trans); -  	/* device going down, Stop using ICT table */  	iwl_disable_ict(trans); @@ -1039,6 +1026,20 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)  	/* Stop the device, and put it in low power state */  	iwl_apm_stop(priv(trans)); + +	/* Upon stop, the APM issues an interrupt if HW RF kill is set. +	 * Clean again the interrupt here +	 */ +	spin_lock_irqsave(&trans->shrd->lock, flags); +	iwl_disable_interrupts(trans); +	spin_unlock_irqrestore(&trans->shrd->lock, flags); + +	/* wait to make sure we flush pending tasklet*/ +	synchronize_irq(bus(trans)->irq); +	tasklet_kill(&trans_pcie->irq_tasklet); + +	/* stop and reset the on-board processor */ +	iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);  }  static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c index 4fcd653bddc..a7f1ab28940 100644 --- a/drivers/net/wireless/libertas/cfg.c +++ b/drivers/net/wireless/libertas/cfg.c @@ -634,7 +634,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,  			if (channel &&  			    !(channel->flags & IEEE80211_CHAN_DISABLED))  				cfg80211_inform_bss(wiphy, channel, -					bssid, le64_to_cpu(*(__le64 *)tsfdesc), +					bssid, get_unaligned_le64(tsfdesc),  					capa, intvl, ie, ielen,  					LBS_SCAN_RSSI_TO_MBM(rssi),  					GFP_KERNEL); diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c index 11b69b300dc..728baa44525 100644 --- a/drivers/net/wireless/libertas/if_spi.c +++ b/drivers/net/wireless/libertas/if_spi.c @@ -995,6 +995,7 @@ static int if_spi_host_to_card(struct lbs_private *priv,  		spin_unlock_irqrestore(&card->buffer_lock, flags);  		break;  	default: +		kfree(packet);  		netdev_err(priv->dev, "can't transfer buffer of type %d\n",  			   type);  		err = -EINVAL; diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index dae8dbb24a0..8d3ab378662 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c @@ -819,8 +819,10 @@ mwifiex_scan_setup_scan_config(struct mwifiex_private *priv,  			wildcard_ssid_tlv->header.len = cpu_to_le16(  				(u16) (ssid_len + sizeof(wildcard_ssid_tlv->  							 max_ssid_length))); -			wildcard_ssid_tlv->max_ssid_length = -				user_scan_in->ssid_list[ssid_idx].max_len; + +			/* max_ssid_length = 0 tells firmware to perform +			   specific scan for the SSID filled */ +			wildcard_ssid_tlv->max_ssid_length = 0;  			memcpy(wildcard_ssid_tlv->ssid,  			       user_scan_in->ssid_list[ssid_idx].ssid, @@ -1469,7 +1471,7 @@ mwifiex_update_curr_bss_params(struct mwifiex_private *priv, u8 *bssid,  			       s32 rssi, const u8 *ie_buf, size_t ie_len,  			       u16 beacon_period, u16 cap_info_bitmap, u8 band)  { -	struct mwifiex_bssdescriptor *bss_desc = NULL; +	struct mwifiex_bssdescriptor *bss_desc;  	int ret;  	unsigned long flags;  	u8 *beacon_ie; @@ -1484,6 +1486,7 @@ mwifiex_update_curr_bss_params(struct mwifiex_private *priv, u8 *bssid,  	beacon_ie = kmemdup(ie_buf, ie_len, GFP_KERNEL);  	if (!beacon_ie) { +		kfree(bss_desc);  		dev_err(priv->adapter->dev, " failed to alloc beacon_ie\n");  		return -ENOMEM;  	} diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index f1565792f27..377876315b8 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c @@ -919,6 +919,7 @@ static struct usb_device_id rt2800usb_device_table[] = {  	{ USB_DEVICE(0x050d, 0x935b) },  	/* Buffalo */  	{ USB_DEVICE(0x0411, 0x00e8) }, +	{ USB_DEVICE(0x0411, 0x0158) },  	{ USB_DEVICE(0x0411, 0x016f) },  	{ USB_DEVICE(0x0411, 0x01a2) },  	/* Corega */ diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 2ec5c00235e..99ff12d0c29 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h @@ -943,6 +943,7 @@ struct rt2x00_dev {  	 * Powersaving work  	 */  	struct delayed_work autowakeup_work; +	struct work_struct sleep_work;  	/*  	 * Data queue arrays for RX, TX, Beacon and ATIM. diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index e1fb2a8569b..edd317fa7c0 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -465,6 +465,23 @@ static u8 *rt2x00lib_find_ie(u8 *data, unsigned int len, u8 ie)  	return NULL;  } +static void rt2x00lib_sleep(struct work_struct *work) +{ +	struct rt2x00_dev *rt2x00dev = +	    container_of(work, struct rt2x00_dev, sleep_work); + +	if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) +		return; + +	/* +	 * Check again is powersaving is enabled, to prevent races from delayed +	 * work execution. +	 */ +	if (!test_bit(CONFIG_POWERSAVING, &rt2x00dev->flags)) +		rt2x00lib_config(rt2x00dev, &rt2x00dev->hw->conf, +				 IEEE80211_CONF_CHANGE_PS); +} +  static void rt2x00lib_rxdone_check_ps(struct rt2x00_dev *rt2x00dev,  				      struct sk_buff *skb,  				      struct rxdone_entry_desc *rxdesc) @@ -512,8 +529,7 @@ static void rt2x00lib_rxdone_check_ps(struct rt2x00_dev *rt2x00dev,  	cam |= (tim_ie->bitmap_ctrl & 0x01);  	if (!cam && !test_bit(CONFIG_POWERSAVING, &rt2x00dev->flags)) -		rt2x00lib_config(rt2x00dev, &rt2x00dev->hw->conf, -				 IEEE80211_CONF_CHANGE_PS); +		queue_work(rt2x00dev->workqueue, &rt2x00dev->sleep_work);  }  static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev, @@ -1141,6 +1157,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)  	INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);  	INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); +	INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);  	/*  	 * Let the driver probe the device to detect the capabilities. @@ -1197,6 +1214,7 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)  	 */  	cancel_work_sync(&rt2x00dev->intf_work);  	cancel_delayed_work_sync(&rt2x00dev->autowakeup_work); +	cancel_work_sync(&rt2x00dev->sleep_work);  	if (rt2x00_is_usb(rt2x00dev)) {  		del_timer_sync(&rt2x00dev->txstatus_timer);  		cancel_work_sync(&rt2x00dev->rxdone_work); diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c index 128ccb79318..fc29c671cf3 100644 --- a/drivers/net/wireless/wl12xx/scan.c +++ b/drivers/net/wireless/wl12xx/scan.c @@ -559,7 +559,7 @@ wl12xx_scan_sched_scan_ssid_list(struct wl1271 *wl,  						break;  					}  				/* Fail if SSID isn't present in the filters */ -				if (j == req->n_ssids) { +				if (j == cmd->n_ssids) {  					ret = -EINVAL;  					goto out_free;  				}  |