diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-04 11:47:58 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-04 11:47:58 -0700 | 
| commit | 6ba74014c1ab0e37af7de6f64b4eccbbae3cb9e7 (patch) | |
| tree | 8f3892fc44f1e403675a6d7e88fda5c70e56ee4c /drivers/net/wireless/iwlwifi/iwl3945-base.c | |
| parent | 5abd9ccced7a726c817dd6b5b96bc933859138d1 (diff) | |
| parent | 3ff1c25927e3af61c6bf0e4ed959504058ae4565 (diff) | |
| download | olio-linux-3.10-6ba74014c1ab0e37af7de6f64b4eccbbae3cb9e7.tar.xz olio-linux-3.10-6ba74014c1ab0e37af7de6f64b4eccbbae3cb9e7.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1443 commits)
  phy/marvell: add 88ec048 support
  igb: Program MDICNFG register prior to PHY init
  e1000e: correct MAC-PHY interconnect register offset for 82579
  hso: Add new product ID
  can: Add driver for esd CAN-USB/2 device
  l2tp: fix export of header file for userspace
  can-raw: Fix skb_orphan_try handling
  Revert "net: remove zap_completion_queue"
  net: cleanup inclusion
  phy/marvell: add 88e1121 interface mode support
  u32: negative offset fix
  net: Fix a typo from "dev" to "ndev"
  igb: Use irq_synchronize per vector when using MSI-X
  ixgbevf: fix null pointer dereference due to filter being set for VLAN 0
  e1000e: Fix irq_synchronize in MSI-X case
  e1000e: register pm_qos request on hardware activation
  ip_fragment: fix subtracting PPPOE_SES_HLEN from mtu twice
  net: Add getsockopt support for TCP thin-streams
  cxgb4: update driver version
  cxgb4: add new PCI IDs
  ...
Manually fix up conflicts in:
 - drivers/net/e1000e/netdev.c: due to pm_qos registration
   infrastructure changes
 - drivers/net/phy/marvell.c: conflict between adding 88ec048 support
   and cleaning up the IDs
 - drivers/net/wireless/ipw2x00/ipw2100.c: trivial ipw2100_pm_qos_req
   conflict (registration change vs marking it static)
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 160 | 
1 files changed, 42 insertions, 118 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index a27872de410..d24eb47d370 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c @@ -27,6 +27,8 @@   *   *****************************************************************************/ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/init.h> @@ -197,6 +199,7 @@ static int iwl3945_set_wep_dynamic_key_info(struct iwl_priv *priv,  static int iwl3945_clear_sta_key_info(struct iwl_priv *priv, u8 sta_id)  {  	unsigned long flags; +	struct iwl_addsta_cmd sta_cmd;  	spin_lock_irqsave(&priv->sta_lock, flags);  	memset(&priv->stations[sta_id].keyinfo, 0, sizeof(struct iwl_hw_key)); @@ -205,11 +208,11 @@ static int iwl3945_clear_sta_key_info(struct iwl_priv *priv, u8 sta_id)  	priv->stations[sta_id].sta.key.key_flags = STA_KEY_FLG_NO_ENC;  	priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;  	priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; +	memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));  	spin_unlock_irqrestore(&priv->sta_lock, flags);  	IWL_DEBUG_INFO(priv, "hwcrypto: clear ucode station key info\n"); -	iwl_send_add_sta(priv, &priv->stations[sta_id].sta, 0); -	return 0; +	return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);  }  static int iwl3945_set_dynamic_key(struct iwl_priv *priv, @@ -310,9 +313,7 @@ unsigned int iwl3945_fill_beacon_frame(struct iwl_priv *priv,  				int left)  { -	if (!iwl_is_associated(priv) || !priv->ibss_beacon || -	    ((priv->iw_mode != NL80211_IFTYPE_ADHOC) && -	     (priv->iw_mode != NL80211_IFTYPE_AP))) +	if (!iwl_is_associated(priv) || !priv->ibss_beacon)  		return 0;  	if (priv->ibss_beacon->len > left) @@ -474,10 +475,8 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	u8 unicast;  	u8 sta_id;  	u8 tid = 0; -	u16 seq_number = 0;  	__le16 fc;  	u8 wait_write_ptr = 0; -	u8 *qc = NULL;  	unsigned long flags;  	spin_lock_irqsave(&priv->lock, flags); @@ -510,10 +509,7 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	hdr_len = ieee80211_hdrlen(fc);  	/* Find index into station table for destination station */ -	if (!info->control.sta) -		sta_id = priv->hw_params.bcast_sta_id; -	else -		sta_id = iwl_sta_id(info->control.sta); +	sta_id = iwl_sta_id_or_broadcast(priv, info->control.sta);  	if (sta_id == IWL_INVALID_STATION) {  		IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",  			       hdr->addr1); @@ -523,16 +519,10 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	IWL_DEBUG_RATE(priv, "station Id %d\n", sta_id);  	if (ieee80211_is_data_qos(fc)) { -		qc = ieee80211_get_qos_ctl(hdr); +		u8 *qc = ieee80211_get_qos_ctl(hdr);  		tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;  		if (unlikely(tid >= MAX_TID_COUNT))  			goto drop; -		seq_number = priv->stations[sta_id].tid[tid].seq_number & -				IEEE80211_SCTL_SEQ; -		hdr->seq_ctrl = cpu_to_le16(seq_number) | -			(hdr->seq_ctrl & -				cpu_to_le16(IEEE80211_SCTL_FRAG)); -		seq_number += 0x10;  	}  	/* Descriptor for chosen Tx queue */ @@ -548,7 +538,7 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	/* Set up driver data for this TFD */  	memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info)); -	txq->txb[q->write_ptr].skb[0] = skb; +	txq->txb[q->write_ptr].skb = skb;  	/* Init first empty entry in queue's array of Tx/cmd buffers */  	out_cmd = txq->cmd[idx]; @@ -591,8 +581,6 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  	if (!ieee80211_has_morefrags(hdr->frame_control)) {  		txq->need_update = 1; -		if (qc) -			priv->stations[sta_id].tid[tid].seq_number = seq_number;  	} else {  		wait_write_ptr = 1;  		txq->need_update = 0; @@ -631,8 +619,8 @@ static int iwl3945_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)  				    len, PCI_DMA_TODEVICE);  	/* we do not map meta data ... so we can safely access address to  	 * provide to unmap command*/ -	pci_unmap_addr_set(out_meta, mapping, txcmd_phys); -	pci_unmap_len_set(out_meta, len, len); +	dma_unmap_addr_set(out_meta, mapping, txcmd_phys); +	dma_unmap_len_set(out_meta, len, len);  	/* Add buffer containing Tx command and MAC(!) header to TFD's  	 * first entry */ @@ -677,55 +665,6 @@ drop:  	return -1;  } -#define BEACON_TIME_MASK_LOW	0x00FFFFFF -#define BEACON_TIME_MASK_HIGH	0xFF000000 -#define TIME_UNIT		1024 - -/* - * extended beacon time format - * time in usec will be changed into a 32-bit value in 8:24 format - * the high 1 byte is the beacon counts - * the lower 3 bytes is the time in usec within one beacon interval - */ - -static u32 iwl3945_usecs_to_beacons(u32 usec, u32 beacon_interval) -{ -	u32 quot; -	u32 rem; -	u32 interval = beacon_interval * 1024; - -	if (!interval || !usec) -		return 0; - -	quot = (usec / interval) & (BEACON_TIME_MASK_HIGH >> 24); -	rem = (usec % interval) & BEACON_TIME_MASK_LOW; - -	return (quot << 24) + rem; -} - -/* base is usually what we get from ucode with each received frame, - * the same as HW timer counter counting down - */ - -static __le32 iwl3945_add_beacon_time(u32 base, u32 addon, u32 beacon_interval) -{ -	u32 base_low = base & BEACON_TIME_MASK_LOW; -	u32 addon_low = addon & BEACON_TIME_MASK_LOW; -	u32 interval = beacon_interval * TIME_UNIT; -	u32 res = (base & BEACON_TIME_MASK_HIGH) + -	    (addon & BEACON_TIME_MASK_HIGH); - -	if (base_low > addon_low) -		res += base_low - addon_low; -	else if (base_low < addon_low) { -		res += interval + base_low - addon_low; -		res += (1 << 24); -	} else -		res += (1 << 24); - -	return cpu_to_le32(res); -} -  static int iwl3945_get_measurement(struct iwl_priv *priv,  			       struct ieee80211_measurement_params *params,  			       u8 type) @@ -743,8 +682,7 @@ static int iwl3945_get_measurement(struct iwl_priv *priv,  	int duration = le16_to_cpu(params->duration);  	if (iwl_is_associated(priv)) -		add_time = -		    iwl3945_usecs_to_beacons( +		add_time = iwl_usecs_to_beacons(priv,  			le64_to_cpu(params->start_time) - priv->_3945.last_tsf,  			le16_to_cpu(priv->rxon_timing.beacon_interval)); @@ -759,8 +697,8 @@ static int iwl3945_get_measurement(struct iwl_priv *priv,  	if (iwl_is_associated(priv))  		spectrum.start_time = -		    iwl3945_add_beacon_time(priv->_3945.last_beacon_time, -				add_time, +			iwl_add_beacon_time(priv, +				priv->_3945.last_beacon_time, add_time,  				le16_to_cpu(priv->rxon_timing.beacon_interval));  	else  		spectrum.start_time = 0; @@ -1233,7 +1171,7 @@ static void iwl3945_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rx  	}  	dma_free_coherent(&priv->pci_dev->dev, 4 * RX_QUEUE_SIZE, rxq->bd, -			  rxq->dma_addr); +			  rxq->bd_dma);  	dma_free_coherent(&priv->pci_dev->dev, sizeof(struct iwl_rb_status),  			  rxq->rb_stts, rxq->rb_stts_dma);  	rxq->bd = NULL; @@ -1314,6 +1252,8 @@ static void iwl3945_rx_handle(struct iwl_priv *priv)  		IWL_DEBUG_RX(priv, "r = %d, i = %d\n", r, i);  	while (i != r) { +		int len; +  		rxb = rxq->queue[i];  		/* If an RXB doesn't have a Rx queue slot associated with it, @@ -1328,8 +1268,9 @@ static void iwl3945_rx_handle(struct iwl_priv *priv)  			       PCI_DMA_FROMDEVICE);  		pkt = rxb_addr(rxb); -		trace_iwlwifi_dev_rx(priv, pkt, -			le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK); +		len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; +		len += sizeof(u32); /* account for status word */ +		trace_iwlwifi_dev_rx(priv, pkt, len);  		/* Reclaim a command buffer only if this packet is a response  		 *   to a (driver-originated) command. @@ -1483,7 +1424,7 @@ void iwl3945_dump_nic_error_log(struct iwl_priv *priv)  		    iwl_read_targ_mem(priv, base + i + 6 * sizeof(u32));  		IWL_ERR(priv, -			"%-13s (#%d) %010u 0x%05X 0x%05X 0x%05X 0x%05X %u\n\n", +			"%-13s (0x%X) %010u 0x%05X 0x%05X 0x%05X 0x%05X %u\n\n",  			desc_lookup(desc), desc, time, blink1, blink2,  			ilink1, ilink2, data1);  		trace_iwlwifi_dev_ucode_error(priv, desc, time, data1, 0, @@ -2942,7 +2883,10 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)  		IWL_DEBUG_INFO(priv, "Scanning while associated...\n");  		spin_lock_irqsave(&priv->lock, flags); -		interval = vif ? vif->bss_conf.beacon_int : 0; +		if (priv->is_internal_short_scan) +			interval = 0; +		else +			interval = vif->bss_conf.beacon_int;  		spin_unlock_irqrestore(&priv->lock, flags);  		scan->suspend_time = 0; @@ -3022,14 +2966,16 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)  		scan->tx_cmd.len = cpu_to_le16(  			iwl_fill_probe_req(priv,  				(struct ieee80211_mgmt *)scan->data, +				vif->addr,  				priv->scan_request->ie,  				priv->scan_request->ie_len,  				IWL_MAX_SCAN_SIZE - sizeof(*scan)));  	} else { +		/* use bcast addr, will not be transmitted but must be valid */  		scan->tx_cmd.len = cpu_to_le16(  			iwl_fill_probe_req(priv,  				(struct ieee80211_mgmt *)scan->data, -				NULL, 0, +				iwl_bcast_addr, NULL, 0,  				IWL_MAX_SCAN_SIZE - sizeof(*scan)));  	}  	/* select Rx antennas */ @@ -3158,19 +3104,16 @@ void iwl3945_post_associate(struct iwl_priv *priv, struct ieee80211_vif *vif)  	IWL_DEBUG_ASSOC(priv, "assoc id %d beacon interval %d\n",  			vif->bss_conf.aid, vif->bss_conf.beacon_int); -	if (vif->bss_conf.assoc_capability & WLAN_CAPABILITY_SHORT_PREAMBLE) +	if (vif->bss_conf.use_short_preamble)  		priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;  	else  		priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;  	if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) { -		if (vif->bss_conf.assoc_capability & WLAN_CAPABILITY_SHORT_SLOT_TIME) +		if (vif->bss_conf.use_short_slot)  			priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;  		else  			priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK; - -		if (vif->type == NL80211_IFTYPE_ADHOC) -			priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;  	}  	iwlcore_commit_rxon(priv); @@ -3334,8 +3277,7 @@ void iwl3945_config_ap(struct iwl_priv *priv, struct ieee80211_vif *vif)  		priv->staging_rxon.assoc_id = 0; -		if (vif->bss_conf.assoc_capability & -					WLAN_CAPABILITY_SHORT_PREAMBLE) +		if (vif->bss_conf.use_short_preamble)  			priv->staging_rxon.flags |=  				RXON_FLG_SHORT_PREAMBLE_MSK;  		else @@ -3343,17 +3285,12 @@ void iwl3945_config_ap(struct iwl_priv *priv, struct ieee80211_vif *vif)  				~RXON_FLG_SHORT_PREAMBLE_MSK;  		if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) { -			if (vif->bss_conf.assoc_capability & -					WLAN_CAPABILITY_SHORT_SLOT_TIME) +			if (vif->bss_conf.use_short_slot)  				priv->staging_rxon.flags |=  					RXON_FLG_SHORT_SLOT_MSK;  			else  				priv->staging_rxon.flags &=  					~RXON_FLG_SHORT_SLOT_MSK; - -			if (vif->type == NL80211_IFTYPE_ADHOC) -				priv->staging_rxon.flags &= -					~RXON_FLG_SHORT_SLOT_MSK;  		}  		/* restore RXON assoc */  		priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK; @@ -3386,17 +3323,9 @@ static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  	static_key = !iwl_is_associated(priv);  	if (!static_key) { -		if (!sta) { -			sta_id = priv->hw_params.bcast_sta_id; -		} else { -			sta_id = iwl_sta_id(sta); -			if (sta_id == IWL_INVALID_STATION) { -				IWL_DEBUG_MAC80211(priv, -						   "leave - %pM not in station map.\n", -						   sta->addr); -				return -EINVAL; -			} -		} +		sta_id = iwl_sta_id_or_broadcast(priv, sta); +		if (sta_id == IWL_INVALID_STATION) +			return -EINVAL;  	}  	mutex_lock(&priv->mutex); @@ -4006,7 +3935,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  	 *   space for this driver's private structure */  	hw = iwl_alloc_all(cfg, &iwl3945_hw_ops);  	if (hw == NULL) { -		printk(KERN_ERR DRV_NAME "Can not allocate network device\n"); +		pr_err("Can not allocate network device\n");  		err = -ENOMEM;  		goto out;  	} @@ -4028,9 +3957,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  	priv->pci_dev = pdev;  	priv->inta_mask = CSR_INI_SET_MASK; -#ifdef CONFIG_IWLWIFI_DEBUG -	atomic_set(&priv->restrict_refcnt, 0); -#endif  	if (iwl_alloc_traffic_mem(priv))  		IWL_ERR(priv, "Not enough memory to generate traffic log\n"); @@ -4099,9 +4025,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  	}  	/* MAC Address location in EEPROM same for 3945/4965 */  	eeprom = (struct iwl3945_eeprom *)priv->eeprom; -	memcpy(priv->mac_addr, eeprom->mac_address, ETH_ALEN); -	IWL_DEBUG_INFO(priv, "MAC address: %pM\n", priv->mac_addr); -	SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); +	IWL_DEBUG_INFO(priv, "MAC address: %pM\n", eeprom->mac_address); +	SET_IEEE80211_PERM_ADDR(priv->hw, eeprom->mac_address);  	/***********************  	 * 5. Setup HW Constants @@ -4302,19 +4227,18 @@ static int __init iwl3945_init(void)  {  	int ret; -	printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n"); -	printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n"); +	pr_info(DRV_DESCRIPTION ", " DRV_VERSION "\n"); +	pr_info(DRV_COPYRIGHT "\n");  	ret = iwl3945_rate_control_register();  	if (ret) { -		printk(KERN_ERR DRV_NAME -		       "Unable to register rate control algorithm: %d\n", ret); +		pr_err("Unable to register rate control algorithm: %d\n", ret);  		return ret;  	}  	ret = pci_register_driver(&iwl3945_driver);  	if (ret) { -		printk(KERN_ERR DRV_NAME "Unable to initialize PCI module\n"); +		pr_err("Unable to initialize PCI module\n");  		goto error_register;  	}  |