diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k')
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/ahb.c | 15 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/base.c | 43 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/dma.c | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/mac80211-ops.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath5k/phy.c | 6 | 
5 files changed, 35 insertions, 43 deletions
diff --git a/drivers/net/wireless/ath/ath5k/ahb.c b/drivers/net/wireless/ath/ath5k/ahb.c index e9bc9e616b6..79bffe165ca 100644 --- a/drivers/net/wireless/ath/ath5k/ahb.c +++ b/drivers/net/wireless/ath/ath5k/ahb.c @@ -37,12 +37,9 @@ ath5k_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data)  {  	struct ath5k_hw *ah = common->priv;  	struct platform_device *pdev = to_platform_device(ah->dev); -	struct ar231x_board_config *bcfg = pdev->dev.platform_data; +	struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);  	u16 *eeprom, *eeprom_end; - - -	bcfg = pdev->dev.platform_data;  	eeprom = (u16 *) bcfg->radio;  	eeprom_end = ((void *) bcfg->config) + BOARD_CONFIG_BUFSZ; @@ -57,7 +54,7 @@ ath5k_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data)  int ath5k_hw_read_srev(struct ath5k_hw *ah)  {  	struct platform_device *pdev = to_platform_device(ah->dev); -	struct ar231x_board_config *bcfg = pdev->dev.platform_data; +	struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);  	ah->ah_mac_srev = bcfg->devid;  	return 0;  } @@ -65,7 +62,7 @@ int ath5k_hw_read_srev(struct ath5k_hw *ah)  static int ath5k_ahb_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac)  {  	struct platform_device *pdev = to_platform_device(ah->dev); -	struct ar231x_board_config *bcfg = pdev->dev.platform_data; +	struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);  	u8 *cfg_mac;  	if (to_platform_device(ah->dev)->id == 0) @@ -87,7 +84,7 @@ static const struct ath_bus_ops ath_ahb_bus_ops = {  /*Initialization*/  static int ath_ahb_probe(struct platform_device *pdev)  { -	struct ar231x_board_config *bcfg = pdev->dev.platform_data; +	struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);  	struct ath5k_hw *ah;  	struct ieee80211_hw *hw;  	struct resource *res; @@ -96,7 +93,7 @@ static int ath_ahb_probe(struct platform_device *pdev)  	int ret = 0;  	u32 reg; -	if (!pdev->dev.platform_data) { +	if (!dev_get_platdata(&pdev->dev)) {  		dev_err(&pdev->dev, "no platform data specified\n");  		ret = -EINVAL;  		goto err_out; @@ -193,7 +190,7 @@ static int ath_ahb_probe(struct platform_device *pdev)  static int ath_ahb_remove(struct platform_device *pdev)  { -	struct ar231x_board_config *bcfg = pdev->dev.platform_data; +	struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);  	struct ieee80211_hw *hw = platform_get_drvdata(pdev);  	struct ath5k_hw *ah;  	u32 reg; diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 48161edec8d..4b18434ba69 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -751,6 +751,9 @@ ath5k_txbuf_setup(struct ath5k_hw *ah, struct ath5k_buf *bf,  	bf->skbaddr = dma_map_single(ah->dev, skb->data, skb->len,  			DMA_TO_DEVICE); +	if (dma_mapping_error(ah->dev, bf->skbaddr)) +		return -ENOSPC; +  	ieee80211_get_tx_rates(info->control.vif, (control) ? control->sta : NULL, skb, bf->rates,  			       ARRAY_SIZE(bf->rates)); @@ -1238,14 +1241,11 @@ static void  ath5k_check_ibss_tsf(struct ath5k_hw *ah, struct sk_buff *skb,  		     struct ieee80211_rx_status *rxs)  { -	struct ath_common *common = ath5k_hw_common(ah);  	u64 tsf, bc_tstamp;  	u32 hw_tu;  	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; -	if (ieee80211_is_beacon(mgmt->frame_control) && -	    le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS && -	    ether_addr_equal(mgmt->bssid, common->curbssid)) { +	if (le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS) {  		/*  		 * Received an IBSS beacon with the same BSSID. Hardware *must*  		 * have updated the local TSF. We have to work around various @@ -1301,23 +1301,6 @@ ath5k_check_ibss_tsf(struct ath5k_hw *ah, struct sk_buff *skb,  	}  } -static void -ath5k_update_beacon_rssi(struct ath5k_hw *ah, struct sk_buff *skb, int rssi) -{ -	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; -	struct ath_common *common = ath5k_hw_common(ah); - -	/* only beacons from our BSSID */ -	if (!ieee80211_is_beacon(mgmt->frame_control) || -	    !ether_addr_equal(mgmt->bssid, common->curbssid)) -		return; - -	ewma_add(&ah->ah_beacon_rssi_avg, rssi); - -	/* in IBSS mode we should keep RSSI statistics per neighbour */ -	/* le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS */ -} -  /*   * Compute padding position. skb must contain an IEEE 802.11 frame   */ @@ -1390,6 +1373,7 @@ ath5k_receive_frame(struct ath5k_hw *ah, struct sk_buff *skb,  		    struct ath5k_rx_status *rs)  {  	struct ieee80211_rx_status *rxs; +	struct ath_common *common = ath5k_hw_common(ah);  	ath5k_remove_padding(skb); @@ -1442,11 +1426,13 @@ ath5k_receive_frame(struct ath5k_hw *ah, struct sk_buff *skb,  	trace_ath5k_rx(ah, skb); -	ath5k_update_beacon_rssi(ah, skb, rs->rs_rssi); +	if (ath_is_mybeacon(common, (struct ieee80211_hdr *)skb->data)) { +		ewma_add(&ah->ah_beacon_rssi_avg, rs->rs_rssi); -	/* check beacons in IBSS mode */ -	if (ah->opmode == NL80211_IFTYPE_ADHOC) -		ath5k_check_ibss_tsf(ah, skb, rxs); +		/* check beacons in IBSS mode */ +		if (ah->opmode == NL80211_IFTYPE_ADHOC) +			ath5k_check_ibss_tsf(ah, skb, rxs); +	}  	ieee80211_rx(ah->hw, skb);  } @@ -1663,15 +1649,15 @@ ath5k_tx_frame_completed(struct ath5k_hw *ah, struct sk_buff *skb,  	ah->stats.tx_bytes_count += skb->len;  	info = IEEE80211_SKB_CB(skb); +	size = min_t(int, sizeof(info->status.rates), sizeof(bf->rates)); +	memcpy(info->status.rates, bf->rates, size); +  	tries[0] = info->status.rates[0].count;  	tries[1] = info->status.rates[1].count;  	tries[2] = info->status.rates[2].count;  	ieee80211_tx_info_clear_status(info); -	size = min_t(int, sizeof(info->status.rates), sizeof(bf->rates)); -	memcpy(info->status.rates, bf->rates, size); -  	for (i = 0; i < ts->ts_final_idx; i++) {  		struct ieee80211_tx_rate *r =  			&info->status.rates[i]; @@ -2549,7 +2535,6 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)  	hw->wiphy->available_antennas_rx = 0x3;  	hw->extra_tx_headroom = 2; -	hw->channel_change_time = 5000;  	/*  	 * Mark the device as detached to avoid processing diff --git a/drivers/net/wireless/ath/ath5k/dma.c b/drivers/net/wireless/ath/ath5k/dma.c index ce86f158423..e6c52f7c26e 100644 --- a/drivers/net/wireless/ath/ath5k/dma.c +++ b/drivers/net/wireless/ath/ath5k/dma.c @@ -616,7 +616,16 @@ ath5k_hw_get_isr(struct ath5k_hw *ah, enum ath5k_int *interrupt_mask)  		 * SISRs will also clear PISR so no need to worry here.  		 */ -		pisr_clear = pisr & ~AR5K_ISR_BITS_FROM_SISRS; +		/* XXX: There seems to be  an issue on some cards +		 *	with tx interrupt flags not being updated +		 *	on PISR despite that all Tx interrupt bits +		 * 	are cleared on SISRs. Since we handle all +		 *	Tx queues all together it shouldn't be an +		 *	issue if we clear Tx interrupt flags also +		 * 	on PISR to avoid that. +		 */ +		pisr_clear = (pisr & ~AR5K_ISR_BITS_FROM_SISRS) | +					(pisr & AR5K_INT_TX_ALL);  		/*  		 * Write to clear them... @@ -661,7 +670,7 @@ ath5k_hw_get_isr(struct ath5k_hw *ah, enum ath5k_int *interrupt_mask)  			ah->ah_txq_isr_txok_all |= AR5K_REG_MS(sisr1,  						AR5K_SISR1_QCU_TXEOL); -		/* Currently this is not much usefull since we treat +		/* Currently this is not much useful since we treat  		 * all queues the same way if we get a TXURN (update  		 * tx trigger level) but we might need it later on*/  		if (pisr & AR5K_ISR_TXURN) diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c index 4ee01f65423..afb23b3cc7b 100644 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c @@ -681,6 +681,7 @@ ath5k_get_survey(struct ieee80211_hw *hw, int idx, struct survey_info *survey)  	survey->channel = conf->chandef.chan;  	survey->noise = ah->ah_noise_floor;  	survey->filled = SURVEY_INFO_NOISE_DBM | +			SURVEY_INFO_IN_USE |  			SURVEY_INFO_CHANNEL_TIME |  			SURVEY_INFO_CHANNEL_TIME_BUSY |  			SURVEY_INFO_CHANNEL_TIME_RX | diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c index d6bc7cb61bf..0fce1c76638 100644 --- a/drivers/net/wireless/ath/ath5k/phy.c +++ b/drivers/net/wireless/ath/ath5k/phy.c @@ -110,7 +110,7 @@ ath5k_hw_radio_revision(struct ath5k_hw *ah, enum ieee80211_band band)  		ath5k_hw_reg_write(ah, 0x00010000, AR5K_PHY(0x20));  	if (ah->ah_version == AR5K_AR5210) { -		srev = ath5k_hw_reg_read(ah, AR5K_PHY(256) >> 28) & 0xf; +		srev = (ath5k_hw_reg_read(ah, AR5K_PHY(256)) >> 28) & 0xf;  		ret = (u16)ath5k_hw_bitswap(srev, 4) + 1;  	} else {  		srev = (ath5k_hw_reg_read(ah, AR5K_PHY(0x100)) >> 24) & 0xff; @@ -3709,8 +3709,8 @@ ath5k_hw_txpower(struct ath5k_hw *ah, struct ieee80211_channel *channel,  			AR5K_REG_MS(AR5K_TUNE_MAX_TXPOWER, AR5K_TPC_CHIRP),  			AR5K_TPC);  	} else { -		ath5k_hw_reg_write(ah, AR5K_PHY_TXPOWER_RATE_MAX | -			AR5K_TUNE_MAX_TXPOWER, AR5K_PHY_TXPOWER_RATE_MAX); +		ath5k_hw_reg_write(ah, AR5K_TUNE_MAX_TXPOWER, +			AR5K_PHY_TXPOWER_RATE_MAX);  	}  	return 0;  | 
