diff options
Diffstat (limited to 'drivers/net/wireless')
34 files changed, 202 insertions, 186 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c index 2d4c0910295..2d394af8217 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c @@ -41,7 +41,8 @@ static bool ar9002_hw_is_cal_supported(struct ath_hw *ah,  	case ADC_DC_CAL:  		/* Run ADC Gain Cal for non-CCK & non 2GHz-HT20 only */  		if (!IS_CHAN_B(chan) && -		    !(IS_CHAN_2GHZ(chan) && IS_CHAN_HT20(chan))) +		    !((IS_CHAN_2GHZ(chan) || IS_CHAN_A_FAST_CLOCK(ah, chan)) && +		      IS_CHAN_HT20(chan)))  			supported = true;  		break;  	} diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h index 2339728a730..3e69c631ebb 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h @@ -1514,7 +1514,7 @@ static const u32 ar9300_2p2_mac_core[][2] = {  	{0x00008258, 0x00000000},  	{0x0000825c, 0x40000000},  	{0x00008260, 0x00080922}, -	{0x00008264, 0x9bc00010}, +	{0x00008264, 0x9d400010},  	{0x00008268, 0xffffffff},  	{0x0000826c, 0x0000ffff},  	{0x00008270, 0x00000000}, diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c index c34bef1bf2b..1b9400371ea 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c @@ -69,7 +69,7 @@ static int ar9003_hw_power_interpolate(int32_t x,  static const struct ar9300_eeprom ar9300_default = {  	.eepromVersion = 2,  	.templateVersion = 2, -	.macAddr = {1, 2, 3, 4, 5, 6}, +	.macAddr = {0, 2, 3, 4, 5, 6},  	.custData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  		     0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  	.baseEepHeader = { diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 1baca8e4715..fcafec0605f 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c @@ -671,7 +671,7 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,  		REG_WRITE_ARRAY(&ah->iniModesAdditional,  				modesIndex, regWrites); -	if (AR_SREV_9300(ah)) +	if (AR_SREV_9330(ah))  		REG_WRITE_ARRAY(&ah->iniModesAdditional, 1, regWrites);  	if (AR_SREV_9340(ah) && !ah->is_clk_25mhz) diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 9098aaad97a..722967b86cf 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -2283,7 +2283,11 @@ static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)  	mutex_lock(&sc->mutex);  	ah->coverage_class = coverage_class; + +	ath9k_ps_wakeup(sc);  	ath9k_hw_init_global_settings(ah); +	ath9k_ps_restore(sc); +  	mutex_unlock(&sc->mutex);  } @@ -2299,6 +2303,12 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop)  	mutex_lock(&sc->mutex);  	cancel_delayed_work_sync(&sc->tx_complete_work); +	if (ah->ah_flags & AH_UNPLUGGED) { +		ath_dbg(common, ATH_DBG_ANY, "Device has been unplugged!\n"); +		mutex_unlock(&sc->mutex); +		return; +	} +  	if (sc->sc_flags & SC_OP_INVALID) {  		ath_dbg(common, ATH_DBG_ANY, "Device not present\n");  		mutex_unlock(&sc->mutex); diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 9a4850154fb..4c21f8cbdeb 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c @@ -205,14 +205,22 @@ static void ath_rx_remove_buffer(struct ath_softc *sc,  static void ath_rx_edma_cleanup(struct ath_softc *sc)  { +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah);  	struct ath_buf *bf;  	ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP);  	ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP);  	list_for_each_entry(bf, &sc->rx.rxbuf, list) { -		if (bf->bf_mpdu) +		if (bf->bf_mpdu) { +			dma_unmap_single(sc->dev, bf->bf_buf_addr, +					common->rx_bufsize, +					DMA_BIDIRECTIONAL);  			dev_kfree_skb_any(bf->bf_mpdu); +			bf->bf_buf_addr = 0; +			bf->bf_mpdu = NULL; +		}  	}  	INIT_LIST_HEAD(&sc->rx.rxbuf); diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index 0122930b14c..0474e6638d2 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c @@ -1066,8 +1066,10 @@ static int carl9170_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  	 * the high througput speed in 802.11n networks.  	 */ -	if (!is_main_vif(ar, vif)) +	if (!is_main_vif(ar, vif)) { +		mutex_lock(&ar->mutex);  		goto err_softw; +	}  	/*  	 * While the hardware supports *catch-all* key, for offloading diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 26f1ab840cc..e293a7921bf 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -1632,7 +1632,8 @@ static void handle_irq_beacon(struct b43_wldev *dev)  	u32 cmd, beacon0_valid, beacon1_valid;  	if (!b43_is_mode(wl, NL80211_IFTYPE_AP) && -	    !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT)) +	    !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) && +	    !b43_is_mode(wl, NL80211_IFTYPE_ADHOC))  		return;  	/* This is the bottom half of the asynchronous beacon update. */ diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 3774dd03474..ef9ad79d1bf 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c @@ -1903,15 +1903,17 @@ static void ipw2100_down(struct ipw2100_priv *priv)  static int ipw2100_net_init(struct net_device *dev)  {  	struct ipw2100_priv *priv = libipw_priv(dev); + +	return ipw2100_up(priv, 1); +} + +static int ipw2100_wdev_init(struct net_device *dev) +{ +	struct ipw2100_priv *priv = libipw_priv(dev);  	const struct libipw_geo *geo = libipw_get_geo(priv->ieee);  	struct wireless_dev *wdev = &priv->ieee->wdev; -	int ret;  	int i; -	ret = ipw2100_up(priv, 1); -	if (ret) -		return ret; -  	memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN);  	/* fill-out priv->ieee->bg_band */ @@ -6350,9 +6352,13 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,  		       "Error calling register_netdev.\n");  		goto fail;  	} +	registered = 1; + +	err = ipw2100_wdev_init(dev); +	if (err) +		goto fail;  	mutex_lock(&priv->action_mutex); -	registered = 1;  	IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev)); @@ -6389,7 +6395,8 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,        fail_unlock:  	mutex_unlock(&priv->action_mutex); - +	wiphy_unregister(priv->ieee->wdev.wiphy); +	kfree(priv->ieee->bg_band.channels);        fail:  	if (dev) {  		if (registered) diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 87813c33bdc..4ffebede5e0 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c @@ -11425,16 +11425,23 @@ static void ipw_bg_down(struct work_struct *work)  /* Called by register_netdev() */  static int ipw_net_init(struct net_device *dev)  { +	int rc = 0; +	struct ipw_priv *priv = libipw_priv(dev); + +	mutex_lock(&priv->mutex); +	if (ipw_up(priv)) +		rc = -EIO; +	mutex_unlock(&priv->mutex); + +	return rc; +} + +static int ipw_wdev_init(struct net_device *dev) +{  	int i, rc = 0;  	struct ipw_priv *priv = libipw_priv(dev);  	const struct libipw_geo *geo = libipw_get_geo(priv->ieee);  	struct wireless_dev *wdev = &priv->ieee->wdev; -	mutex_lock(&priv->mutex); - -	if (ipw_up(priv)) { -		rc = -EIO; -		goto out; -	}  	memcpy(wdev->wiphy->perm_addr, priv->mac_addr, ETH_ALEN); @@ -11519,13 +11526,9 @@ static int ipw_net_init(struct net_device *dev)  	set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev);  	/* With that information in place, we can now register the wiphy... */ -	if (wiphy_register(wdev->wiphy)) { +	if (wiphy_register(wdev->wiphy))  		rc = -EIO; -		goto out; -	} -  out: -	mutex_unlock(&priv->mutex);  	return rc;  } @@ -11832,14 +11835,22 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,  		goto out_remove_sysfs;  	} +	err = ipw_wdev_init(net_dev); +	if (err) { +		IPW_ERROR("failed to register wireless device\n"); +		goto out_unregister_netdev; +	} +  #ifdef CONFIG_IPW2200_PROMISCUOUS  	if (rtap_iface) {  	        err = ipw_prom_alloc(priv);  		if (err) {  			IPW_ERROR("Failed to register promiscuous network "  				  "device (error %d).\n", err); -			unregister_netdev(priv->net_dev); -			goto out_remove_sysfs; +			wiphy_unregister(priv->ieee->wdev.wiphy); +			kfree(priv->ieee->a_band.channels); +			kfree(priv->ieee->bg_band.channels); +			goto out_unregister_netdev;  		}  	}  #endif @@ -11851,6 +11862,8 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,  	return 0; +      out_unregister_netdev: +	unregister_netdev(priv->net_dev);        out_remove_sysfs:  	sysfs_remove_group(&pdev->dev.kobj, &ipw_attribute_group);        out_release_irq: diff --git a/drivers/net/wireless/ipw2x00/libipw_tx.c b/drivers/net/wireless/ipw2x00/libipw_tx.c index 01c88a71abe..e8c039879b0 100644 --- a/drivers/net/wireless/ipw2x00/libipw_tx.c +++ b/drivers/net/wireless/ipw2x00/libipw_tx.c @@ -395,7 +395,7 @@ netdev_tx_t libipw_xmit(struct sk_buff *skb, struct net_device *dev)  		    (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS))  			bytes_per_frag -= LIBIPW_FCS_LEN; -		/* Each fragment may need to have room for encryptiong +		/* Each fragment may need to have room for encryption  		 * pre/postfix */  		if (host_encrypt)  			bytes_per_frag -= crypt->ops->extra_mpdu_prefix_len + diff --git a/drivers/net/wireless/iwlegacy/iwl-3945-rs.c b/drivers/net/wireless/iwlegacy/iwl-3945-rs.c index 977bd2477c6..164bcae821f 100644 --- a/drivers/net/wireless/iwlegacy/iwl-3945-rs.c +++ b/drivers/net/wireless/iwlegacy/iwl-3945-rs.c @@ -822,12 +822,15 @@ static void iwl3945_rs_get_rate(void *priv_r, struct ieee80211_sta *sta,   out: -	rs_sta->last_txrate_idx = index; -	if (sband->band == IEEE80211_BAND_5GHZ) -		info->control.rates[0].idx = rs_sta->last_txrate_idx - -				IWL_FIRST_OFDM_RATE; -	else +	if (sband->band == IEEE80211_BAND_5GHZ) { +		if (WARN_ON_ONCE(index < IWL_FIRST_OFDM_RATE)) +			index = IWL_FIRST_OFDM_RATE; +		rs_sta->last_txrate_idx = index; +		info->control.rates[0].idx = index - IWL_FIRST_OFDM_RATE; +	} else { +		rs_sta->last_txrate_idx = index;  		info->control.rates[0].idx = rs_sta->last_txrate_idx; +	}  	IWL_DEBUG_RATE(priv, "leave: %d\n", index);  } diff --git a/drivers/net/wireless/iwlegacy/iwl-core.c b/drivers/net/wireless/iwlegacy/iwl-core.c index 35cd2537e7f..e5971fe9d16 100644 --- a/drivers/net/wireless/iwlegacy/iwl-core.c +++ b/drivers/net/wireless/iwlegacy/iwl-core.c @@ -937,7 +937,7 @@ void iwl_legacy_irq_handle_error(struct iwl_priv *priv)  					&priv->contexts[IWL_RXON_CTX_BSS]);  #endif -	wake_up_interruptible(&priv->wait_command_queue); +	wake_up(&priv->wait_command_queue);  	/* Keep the restart process from trying to send host  	 * commands by clearing the INIT status bit */ @@ -1746,7 +1746,7 @@ int iwl_legacy_force_reset(struct iwl_priv *priv, bool external)  	/* Set the FW error flag -- cleared on iwl_down */  	set_bit(STATUS_FW_ERROR, &priv->status); -	wake_up_interruptible(&priv->wait_command_queue); +	wake_up(&priv->wait_command_queue);  	/*  	 * Keep the restart process from trying to send host  	 * commands by clearing the INIT status bit diff --git a/drivers/net/wireless/iwlegacy/iwl-hcmd.c b/drivers/net/wireless/iwlegacy/iwl-hcmd.c index 62b4b09122c..ce1fc9feb61 100644 --- a/drivers/net/wireless/iwlegacy/iwl-hcmd.c +++ b/drivers/net/wireless/iwlegacy/iwl-hcmd.c @@ -167,7 +167,7 @@ int iwl_legacy_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)  		goto out;  	} -	ret = wait_event_interruptible_timeout(priv->wait_command_queue, +	ret = wait_event_timeout(priv->wait_command_queue,  			!test_bit(STATUS_HCMD_ACTIVE, &priv->status),  			HOST_COMPLETE_TIMEOUT);  	if (!ret) { diff --git a/drivers/net/wireless/iwlegacy/iwl-tx.c b/drivers/net/wireless/iwlegacy/iwl-tx.c index 4fff995c6f3..ef9e268bf8a 100644 --- a/drivers/net/wireless/iwlegacy/iwl-tx.c +++ b/drivers/net/wireless/iwlegacy/iwl-tx.c @@ -625,6 +625,8 @@ iwl_legacy_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)  	cmd = txq->cmd[cmd_index];  	meta = &txq->meta[cmd_index]; +	txq->time_stamp = jiffies; +  	pci_unmap_single(priv->pci_dev,  			 dma_unmap_addr(meta, mapping),  			 dma_unmap_len(meta, len), @@ -645,7 +647,7 @@ iwl_legacy_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)  		clear_bit(STATUS_HCMD_ACTIVE, &priv->status);  		IWL_DEBUG_INFO(priv, "Clearing HCMD_ACTIVE for command %s\n",  			       iwl_legacy_get_cmd_string(cmd->hdr.cmd)); -		wake_up_interruptible(&priv->wait_command_queue); +		wake_up(&priv->wait_command_queue);  	}  	/* Mark as unmapped */ diff --git a/drivers/net/wireless/iwlegacy/iwl3945-base.c b/drivers/net/wireless/iwlegacy/iwl3945-base.c index 795826a014e..66ee15629a7 100644 --- a/drivers/net/wireless/iwlegacy/iwl3945-base.c +++ b/drivers/net/wireless/iwlegacy/iwl3945-base.c @@ -841,7 +841,7 @@ static void iwl3945_rx_card_state_notif(struct iwl_priv *priv,  		wiphy_rfkill_set_hw_state(priv->hw->wiphy,  				test_bit(STATUS_RF_KILL_HW, &priv->status));  	else -		wake_up_interruptible(&priv->wait_command_queue); +		wake_up(&priv->wait_command_queue);  }  /** @@ -2269,7 +2269,7 @@ static void iwl3945_alive_start(struct iwl_priv *priv)  	iwl3945_reg_txpower_periodic(priv);  	IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n"); -	wake_up_interruptible(&priv->wait_command_queue); +	wake_up(&priv->wait_command_queue);  	return; @@ -2300,7 +2300,7 @@ static void __iwl3945_down(struct iwl_priv *priv)  	iwl_legacy_clear_driver_stations(priv);  	/* Unblock any waiting calls */ -	wake_up_interruptible_all(&priv->wait_command_queue); +	wake_up_all(&priv->wait_command_queue);  	/* Wipe out the EXIT_PENDING status bit if we are not actually  	 * exiting the module */ @@ -2853,7 +2853,7 @@ static int iwl3945_mac_start(struct ieee80211_hw *hw)  	/* Wait for START_ALIVE from ucode. Otherwise callbacks from  	 * mac80211 will not be run successfully. */ -	ret = wait_event_interruptible_timeout(priv->wait_command_queue, +	ret = wait_event_timeout(priv->wait_command_queue,  			test_bit(STATUS_READY, &priv->status),  			UCODE_READY_TIMEOUT);  	if (!ret) { diff --git a/drivers/net/wireless/iwlegacy/iwl4965-base.c b/drivers/net/wireless/iwlegacy/iwl4965-base.c index 14334668034..aa0c2539761 100644 --- a/drivers/net/wireless/iwlegacy/iwl4965-base.c +++ b/drivers/net/wireless/iwlegacy/iwl4965-base.c @@ -576,7 +576,7 @@ static void iwl4965_rx_card_state_notif(struct iwl_priv *priv,  		wiphy_rfkill_set_hw_state(priv->hw->wiphy,  			test_bit(STATUS_RF_KILL_HW, &priv->status));  	else -		wake_up_interruptible(&priv->wait_command_queue); +		wake_up(&priv->wait_command_queue);  }  /** @@ -926,7 +926,7 @@ static void iwl4965_irq_tasklet(struct iwl_priv *priv)  		handled |= CSR_INT_BIT_FH_TX;  		/* Wake up uCode load routine, now that load is complete */  		priv->ucode_write_complete = 1; -		wake_up_interruptible(&priv->wait_command_queue); +		wake_up(&priv->wait_command_queue);  	}  	if (inta & ~handled) { @@ -1795,7 +1795,7 @@ static void iwl4965_alive_start(struct iwl_priv *priv)  	iwl4965_rf_kill_ct_config(priv);  	IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n"); -	wake_up_interruptible(&priv->wait_command_queue); +	wake_up(&priv->wait_command_queue);  	iwl_legacy_power_update_mode(priv, true);  	IWL_DEBUG_INFO(priv, "Updated power mode\n"); @@ -1828,7 +1828,7 @@ static void __iwl4965_down(struct iwl_priv *priv)  	iwl_legacy_clear_driver_stations(priv);  	/* Unblock any waiting calls */ -	wake_up_interruptible_all(&priv->wait_command_queue); +	wake_up_all(&priv->wait_command_queue);  	/* Wipe out the EXIT_PENDING status bit if we are not actually  	 * exiting the module */ @@ -2266,7 +2266,7 @@ int iwl4965_mac_start(struct ieee80211_hw *hw)  	/* Wait for START_ALIVE from Run Time ucode. Otherwise callbacks from  	 * mac80211 will not be run successfully. */ -	ret = wait_event_interruptible_timeout(priv->wait_command_queue, +	ret = wait_event_timeout(priv->wait_command_queue,  			test_bit(STATUS_READY, &priv->status),  			UCODE_READY_TIMEOUT);  	if (!ret) { diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c index a895a099d08..56211006a18 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c @@ -167,7 +167,7 @@ static int iwlagn_set_temperature_offset_calib(struct iwl_priv *priv)  	memset(&cmd, 0, sizeof(cmd));  	iwl_set_calib_hdr(&cmd.hdr, IWL_PHY_CALIBRATE_TEMP_OFFSET_CMD); -	memcpy(&cmd.radio_sensor_offset, offset_calib, sizeof(offset_calib)); +	memcpy(&cmd.radio_sensor_offset, offset_calib, sizeof(*offset_calib));  	if (!(cmd.radio_sensor_offset))  		cmd.radio_sensor_offset = DEFAULT_RADIO_SENSOR_OFFSET; diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index b0ae4de7f08..f9c3cd95d61 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c @@ -2140,7 +2140,12 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,  		    IEEE80211_HW_SPECTRUM_MGMT |  		    IEEE80211_HW_REPORTS_TX_ACK_STATUS; +	/* +	 * Including the following line will crash some AP's.  This +	 * workaround removes the stimulus which causes the crash until +	 * the AP software can be fixed.  	hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF; +	 */  	hw->flags |= IEEE80211_HW_SUPPORTS_PS |  		     IEEE80211_HW_SUPPORTS_DYNAMIC_PS; diff --git a/drivers/net/wireless/iwlwifi/iwl-pci.c b/drivers/net/wireless/iwlwifi/iwl-pci.c index 69d4ec467dc..2fdbffa079c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-pci.c +++ b/drivers/net/wireless/iwlwifi/iwl-pci.c @@ -478,27 +478,22 @@ out_no_pci:  	return err;  } -static void iwl_pci_down(struct iwl_bus *bus) -{ -	struct iwl_pci_bus *pci_bus = (struct iwl_pci_bus *) bus->bus_specific; - -	pci_disable_msi(pci_bus->pci_dev); -	pci_iounmap(pci_bus->pci_dev, pci_bus->hw_base); -	pci_release_regions(pci_bus->pci_dev); -	pci_disable_device(pci_bus->pci_dev); -	pci_set_drvdata(pci_bus->pci_dev, NULL); - -	kfree(bus); -} -  static void __devexit iwl_pci_remove(struct pci_dev *pdev)  {  	struct iwl_priv *priv = pci_get_drvdata(pdev); -	void *bus_specific = priv->bus->bus_specific; +	struct iwl_bus *bus = priv->bus; +	struct iwl_pci_bus *pci_bus = IWL_BUS_GET_PCI_BUS(bus); +	struct pci_dev *pci_dev = IWL_BUS_GET_PCI_DEV(bus);  	iwl_remove(priv); -	iwl_pci_down(bus_specific); +	pci_disable_msi(pci_dev); +	pci_iounmap(pci_dev, pci_bus->hw_base); +	pci_release_regions(pci_dev); +	pci_disable_device(pci_dev); +	pci_set_drvdata(pci_dev, NULL); + +	kfree(bus);  }  #ifdef CONFIG_PM diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index dd6937e9705..77e528f5db8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c @@ -405,31 +405,33 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,  	mutex_lock(&priv->mutex); -	if (test_bit(STATUS_SCANNING, &priv->status) && -	    priv->scan_type != IWL_SCAN_NORMAL) { -		IWL_DEBUG_SCAN(priv, "Scan already in progress.\n"); -		ret = -EAGAIN; -		goto out_unlock; -	} - -	/* mac80211 will only ask for one band at a time */ -	priv->scan_request = req; -	priv->scan_vif = vif; -  	/*  	 * If an internal scan is in progress, just set  	 * up the scan_request as per above.  	 */  	if (priv->scan_type != IWL_SCAN_NORMAL) { -		IWL_DEBUG_SCAN(priv, "SCAN request during internal scan\n"); +		IWL_DEBUG_SCAN(priv, +			       "SCAN request during internal scan - defer\n"); +		priv->scan_request = req; +		priv->scan_vif = vif;  		ret = 0; -	} else +	} else { +		priv->scan_request = req; +		priv->scan_vif = vif; +		/* +		 * mac80211 will only ask for one band at a time +		 * so using channels[0] here is ok +		 */  		ret = iwl_scan_initiate(priv, vif, IWL_SCAN_NORMAL,  					req->channels[0]->band); +		if (ret) { +			priv->scan_request = NULL; +			priv->scan_vif = NULL; +		} +	}  	IWL_DEBUG_MAC80211(priv, "leave\n"); -out_unlock:  	mutex_unlock(&priv->mutex);  	return ret; diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c index a6b2b1db0b1..222d410c586 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-tx-pcie.c @@ -771,6 +771,8 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)  	cmd = txq->cmd[cmd_index];  	meta = &txq->meta[cmd_index]; +	txq->time_stamp = jiffies; +  	iwlagn_unmap_tfd(priv, meta, &txq->tfds[index], DMA_BIDIRECTIONAL);  	/* Input error checking is done when commands are added to queue. */ diff --git a/drivers/net/wireless/libertas_tf/deb_defs.h b/drivers/net/wireless/libertas_tf/deb_defs.h index ae753962d8b..4bd3dc5adf7 100644 --- a/drivers/net/wireless/libertas_tf/deb_defs.h +++ b/drivers/net/wireless/libertas_tf/deb_defs.h @@ -3,7 +3,7 @@    * global variable declaration.    */  #ifndef _LBS_DEB_DEFS_H_ -#define _LBS_DEB_EFS_H_ +#define _LBS_DEB_DEFS_H_  #ifndef DRV_NAME  #define DRV_NAME "libertas_tf" diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index ef67f6786a8..0019dfd8fb0 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c @@ -3697,14 +3697,15 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)  	rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, ®);  	/* Apparently the data is read from end to start */ -	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, -					(u32 *)&rt2x00dev->eeprom[i]); -	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, -					(u32 *)&rt2x00dev->eeprom[i + 2]); -	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, -					(u32 *)&rt2x00dev->eeprom[i + 4]); -	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, -					(u32 *)&rt2x00dev->eeprom[i + 6]); +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, ®); +	/* The returned value is in CPU order, but eeprom is le */ +	rt2x00dev->eeprom[i] = cpu_to_le32(reg); +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, ®); +	*(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg); +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, ®); +	*(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg); +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0, ®); +	*(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);  	mutex_unlock(&rt2x00dev->csr_mutex);  } @@ -3870,19 +3871,23 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)  		return -ENODEV;  	} -	if (!rt2x00_rf(rt2x00dev, RF2820) && -	    !rt2x00_rf(rt2x00dev, RF2850) && -	    !rt2x00_rf(rt2x00dev, RF2720) && -	    !rt2x00_rf(rt2x00dev, RF2750) && -	    !rt2x00_rf(rt2x00dev, RF3020) && -	    !rt2x00_rf(rt2x00dev, RF2020) && -	    !rt2x00_rf(rt2x00dev, RF3021) && -	    !rt2x00_rf(rt2x00dev, RF3022) && -	    !rt2x00_rf(rt2x00dev, RF3052) && -	    !rt2x00_rf(rt2x00dev, RF3320) && -	    !rt2x00_rf(rt2x00dev, RF5370) && -	    !rt2x00_rf(rt2x00dev, RF5390)) { -		ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); +	switch (rt2x00dev->chip.rf) { +	case RF2820: +	case RF2850: +	case RF2720: +	case RF2750: +	case RF3020: +	case RF2020: +	case RF3021: +	case RF3022: +	case RF3052: +	case RF3320: +	case RF5370: +	case RF5390: +		break; +	default: +		ERROR(rt2x00dev, "Invalid RF chipset 0x%x detected.\n", +		      rt2x00dev->chip.rf);  		return -ENODEV;  	} diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 939563162fb..dbf501ca317 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c @@ -464,6 +464,15 @@ static bool rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)  	int wcid, ack, pid;  	int tx_wcid, tx_ack, tx_pid; +	if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || +	    !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) { +		WARNING(entry->queue->rt2x00dev, +			"Data pending for entry %u in queue %u\n", +			entry->entry_idx, entry->queue->qid); +		cond_resched(); +		return false; +	} +  	wcid	= rt2x00_get_field32(reg, TX_STA_FIFO_WCID);  	ack	= rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);  	pid	= rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE); @@ -529,12 +538,11 @@ static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev)  			entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);  			if (rt2800usb_txdone_entry_check(entry, reg))  				break; +			entry = NULL;  		} -		if (!entry || rt2x00queue_empty(queue)) -			break; - -		rt2800_txdone_entry(entry, reg); +		if (entry) +			rt2800_txdone_entry(entry, reg);  	}  } @@ -558,8 +566,10 @@ static void rt2800usb_work_txdone(struct work_struct *work)  		while (!rt2x00queue_empty(queue)) {  			entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -			if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) +			if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || +			    !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))  				break; +  			if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))  				rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);  			else if (rt2x00queue_status_timeout(entry)) diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index b6b4542c246..1e31050dafc 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c @@ -262,23 +262,20 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb)  	struct queue_entry *entry = (struct queue_entry *)urb->context;  	struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; -	if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) +	if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))  		return; - -	if (rt2x00dev->ops->lib->tx_dma_done) -		rt2x00dev->ops->lib->tx_dma_done(entry); - -	/* -	 * Report the frame as DMA done -	 */ -	rt2x00lib_dmadone(entry); -  	/*  	 * Check if the frame was correctly uploaded  	 */  	if (urb->status)  		set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); +	/* +	 * Report the frame as DMA done +	 */ +	rt2x00lib_dmadone(entry); +	if (rt2x00dev->ops->lib->tx_dma_done) +		rt2x00dev->ops->lib->tx_dma_done(entry);  	/*  	 * Schedule the delayed work for reading the TX status  	 * from the device. @@ -874,18 +871,8 @@ int rt2x00usb_suspend(struct usb_interface *usb_intf, pm_message_t state)  {  	struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);  	struct rt2x00_dev *rt2x00dev = hw->priv; -	int retval; - -	retval = rt2x00lib_suspend(rt2x00dev, state); -	if (retval) -		return retval; -	/* -	 * Decrease usbdev refcount. -	 */ -	usb_put_dev(interface_to_usbdev(usb_intf)); - -	return 0; +	return rt2x00lib_suspend(rt2x00dev, state);  }  EXPORT_SYMBOL_GPL(rt2x00usb_suspend); @@ -894,8 +881,6 @@ int rt2x00usb_resume(struct usb_interface *usb_intf)  	struct ieee80211_hw *hw = usb_get_intfdata(usb_intf);  	struct rt2x00_dev *rt2x00dev = hw->priv; -	usb_get_dev(interface_to_usbdev(usb_intf)); -  	return rt2x00lib_resume(rt2x00dev);  }  EXPORT_SYMBOL_GPL(rt2x00usb_resume); diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c index 1bdc1aa305c..04c4e9eb6ee 100644 --- a/drivers/net/wireless/rtlwifi/core.c +++ b/drivers/net/wireless/rtlwifi/core.c @@ -610,6 +610,11 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,  			mac->link_state = MAC80211_NOLINK;  			memset(mac->bssid, 0, 6); + +			/* reset sec info */ +			rtl_cam_reset_sec_info(hw); + +			rtl_cam_reset_all_entry(hw);  			mac->vendor = PEER_UNKNOWN;  			RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, @@ -1063,6 +1068,9 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  		 *or clear all entry here.  		 */  		rtl_cam_delete_one_entry(hw, mac_addr, key_idx); + +		rtl_cam_reset_sec_info(hw); +  		break;  	default:  		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 56f12358389..f8648b7288d 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c @@ -488,7 +488,7 @@ static void _rtl_pci_tx_chk_waitq(struct ieee80211_hw *hw)  	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));  	struct sk_buff *skb = NULL;  	struct ieee80211_tx_info *info = NULL; -	int tid; /* should be int */ +	int tid;  	if (!rtlpriv->rtlhal.earlymode_enable)  		return; @@ -1538,7 +1538,7 @@ static int rtl_pci_start(struct ieee80211_hw *hw)  	rtl_init_rx_config(hw); -	/*should after adapter start and interrupt enable. */ +	/*should be after adapter start and interrupt enable. */  	set_hal_start(rtlhal);  	RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); @@ -1559,7 +1559,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)  	u8 RFInProgressTimeOut = 0;  	/* -	 *should before disable interrrupt&adapter +	 *should be before disable interrupt&adapter  	 *and will do it immediately.  	 */  	set_hal_stop(rtlhal); diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c index 906e7aa55bc..3e52a549622 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c @@ -549,15 +549,16 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,  			       (tcb_desc->rts_use_shortpreamble ? 1 : 0)  			       : (tcb_desc->rts_use_shortgi ? 1 : 0)));  	if (mac->bw_40) { -		if (tcb_desc->packet_bw) { +		if (rate_flag & IEEE80211_TX_RC_DUP_DATA) {  			SET_TX_DESC_DATA_BW(txdesc, 1);  			SET_TX_DESC_DATA_SC(txdesc, 3); +		} else if(rate_flag & IEEE80211_TX_RC_40_MHZ_WIDTH){ +			SET_TX_DESC_DATA_BW(txdesc, 1); +			SET_TX_DESC_DATA_SC(txdesc, mac->cur_40_prime_sc);  		} else {  			SET_TX_DESC_DATA_BW(txdesc, 0); -				if (rate_flag & IEEE80211_TX_RC_DUP_DATA) -					SET_TX_DESC_DATA_SC(txdesc, -							  mac->cur_40_prime_sc); -			} +			SET_TX_DESC_DATA_SC(txdesc, 0); +		}  	} else {  		SET_TX_DESC_DATA_BW(txdesc, 0);  		SET_TX_DESC_DATA_SC(txdesc, 0); diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 8b1cef0ffde..4bf3cf457ef 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c @@ -863,6 +863,7 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,  	u8 tid = 0;  	u16 seq_number = 0; +	memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));  	if (ieee80211_is_auth(fc)) {  		RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));  		rtl_ips_nic_on(hw); diff --git a/drivers/net/wireless/wl12xx/acx.c b/drivers/net/wireless/wl12xx/acx.c index 7e33f1f4f3d..34f6ab53e51 100644 --- a/drivers/net/wireless/wl12xx/acx.c +++ b/drivers/net/wireless/wl12xx/acx.c @@ -77,8 +77,6 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)  	auth->sleep_auth = sleep_auth;  	ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth)); -	if (ret < 0) -		return ret;  out:  	kfree(auth); @@ -624,10 +622,8 @@ int wl1271_acx_cca_threshold(struct wl1271 *wl)  	ret = wl1271_cmd_configure(wl, ACX_CCA_THRESHOLD,  				   detection, sizeof(*detection)); -	if (ret < 0) { +	if (ret < 0)  		wl1271_warning("failed to set cca threshold: %d", ret); -		return ret; -	}  out:  	kfree(detection); diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c index e58c22d21e3..b70ae40ad66 100644 --- a/drivers/net/wireless/wl12xx/main.c +++ b/drivers/net/wireless/wl12xx/main.c @@ -4283,6 +4283,7 @@ int wl1271_init_ieee80211(struct wl1271 *wl)  	wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |  		BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);  	wl->hw->wiphy->max_scan_ssids = 1; +	wl->hw->wiphy->max_sched_scan_ssids = 1;  	/*  	 * Maximum length of elements in scanning probe request templates  	 * should be the maximum length possible for a template, without diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c index 5cf18c2c23f..fb1fd5af75e 100644 --- a/drivers/net/wireless/wl12xx/sdio.c +++ b/drivers/net/wireless/wl12xx/sdio.c @@ -164,7 +164,7 @@ static int wl1271_sdio_power_on(struct wl1271 *wl)  	/* If enabled, tell runtime PM not to power off the card */  	if (pm_runtime_enabled(&func->dev)) {  		ret = pm_runtime_get_sync(&func->dev); -		if (ret) +		if (ret < 0)  			goto out;  	} else {  		/* Runtime PM is disabled: power up the card manually */ diff --git a/drivers/net/wireless/wl12xx/testmode.c b/drivers/net/wireless/wl12xx/testmode.c index 5d5e1ef8720..4ae8effaee2 100644 --- a/drivers/net/wireless/wl12xx/testmode.c +++ b/drivers/net/wireless/wl12xx/testmode.c @@ -36,7 +36,6 @@ enum wl1271_tm_commands {  	WL1271_TM_CMD_TEST,  	WL1271_TM_CMD_INTERROGATE,  	WL1271_TM_CMD_CONFIGURE, -	WL1271_TM_CMD_NVS_PUSH,  	WL1271_TM_CMD_SET_PLT_MODE,  	WL1271_TM_CMD_RECOVER, @@ -139,12 +138,15 @@ static int wl1271_tm_cmd_interrogate(struct wl1271 *wl, struct nlattr *tb[])  	if (ret < 0) {  		wl1271_warning("testmode cmd interrogate failed: %d", ret); +		kfree(cmd);  		return ret;  	}  	skb = cfg80211_testmode_alloc_reply_skb(wl->hw->wiphy, sizeof(*cmd)); -	if (!skb) +	if (!skb) { +		kfree(cmd);  		return -ENOMEM; +	}  	NLA_PUT(skb, WL1271_TM_ATTR_DATA, sizeof(*cmd), cmd); @@ -187,48 +189,6 @@ static int wl1271_tm_cmd_configure(struct wl1271 *wl, struct nlattr *tb[])  	return 0;  } -static int wl1271_tm_cmd_nvs_push(struct wl1271 *wl, struct nlattr *tb[]) -{ -	int ret = 0; -	size_t len; -	void *buf; - -	wl1271_debug(DEBUG_TESTMODE, "testmode cmd nvs push"); - -	if (!tb[WL1271_TM_ATTR_DATA]) -		return -EINVAL; - -	buf = nla_data(tb[WL1271_TM_ATTR_DATA]); -	len = nla_len(tb[WL1271_TM_ATTR_DATA]); - -	mutex_lock(&wl->mutex); - -	kfree(wl->nvs); - -	if ((wl->chip.id == CHIP_ID_1283_PG20) && -	    (len != sizeof(struct wl128x_nvs_file))) -		return -EINVAL; -	else if (len != sizeof(struct wl1271_nvs_file)) -		return -EINVAL; - -	wl->nvs = kzalloc(len, GFP_KERNEL); -	if (!wl->nvs) { -		wl1271_error("could not allocate memory for the nvs file"); -		ret = -ENOMEM; -		goto out; -	} - -	memcpy(wl->nvs, buf, len); -	wl->nvs_len = len; - -	wl1271_debug(DEBUG_TESTMODE, "testmode pushed nvs"); - -out: -	mutex_unlock(&wl->mutex); - -	return ret; -} -  static int wl1271_tm_cmd_set_plt_mode(struct wl1271 *wl, struct nlattr *tb[])  {  	u32 val; @@ -285,8 +245,6 @@ int wl1271_tm_cmd(struct ieee80211_hw *hw, void *data, int len)  		return wl1271_tm_cmd_interrogate(wl, tb);  	case WL1271_TM_CMD_CONFIGURE:  		return wl1271_tm_cmd_configure(wl, tb); -	case WL1271_TM_CMD_NVS_PUSH: -		return wl1271_tm_cmd_nvs_push(wl, tb);  	case WL1271_TM_CMD_SET_PLT_MODE:  		return wl1271_tm_cmd_set_plt_mode(wl, tb);  	case WL1271_TM_CMD_RECOVER:  |