From: John W. Linville <linville@tuxdriver.com>
Date: Thu, 8 Apr 2010 17:34:54 +0000 (-0400)
Subject: Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel... 
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=0f2df9eac70423838a1f8d410fd3899ddd88317b;p=openwrt%2Fstaging%2Fblogic.git

Merge branch 'master' of git://git./linux/kernel/git/linville/wireless-2.6 into merge

Conflicts:
	Documentation/feature-removal-schedule.txt
	drivers/net/wireless/ath/ath5k/phy.c
	drivers/net/wireless/iwlwifi/iwl-4965.c
	drivers/net/wireless/iwlwifi/iwl-agn.c
	drivers/net/wireless/iwlwifi/iwl-core.c
	drivers/net/wireless/iwlwifi/iwl-core.h
	drivers/net/wireless/iwlwifi/iwl-tx.c
---

0f2df9eac70423838a1f8d410fd3899ddd88317b
diff --cc Documentation/feature-removal-schedule.txt
index d46944f9de53,73ef30dbe612..5f460110c5ee
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@@ -520,24 -520,29 +520,47 @@@ Who:	Hans de Goede <hdegoede@redhat.com
  
  ----------------------------
  
+ What:	corgikbd, spitzkbd, tosakbd driver
+ When:	2.6.35
+ Files:	drivers/input/keyboard/{corgi,spitz,tosa}kbd.c
+ Why:	We now have a generic GPIO based matrix keyboard driver that
+ 	are fully capable of handling all the keys on these devices.
+ 	The original drivers manipulate the GPIO registers directly
+ 	and so are difficult to maintain.
+ Who:	Eric Miao <eric.y.miao@gmail.com>
+ 
+ ----------------------------
+ 
+ What:	corgi_ssp and corgi_ts driver
+ When:	2.6.35
+ Files:	arch/arm/mach-pxa/corgi_ssp.c, drivers/input/touchscreen/corgi_ts.c
+ Why:	The corgi touchscreen is now deprecated in favour of the generic
+ 	ads7846.c driver. The noise reduction technique used in corgi_ts.c,
+ 	that's to wait till vsync before ADC sampling, is also integrated into
+ 	ads7846 driver now. Provided that the original driver is not generic
+ 	and is difficult to maintain, it will be removed later.
+ Who:	Eric Miao <eric.y.miao@gmail.com>
+ 
+ ----------------------------
+ 
 +What:	sysfs-class-rfkill state file
 +When:	Feb 2014
 +Files:	net/rfkill/core.c
 +Why: 	Documented as obsolete since Feb 2010. This file is limited to 3
 +	states while the rfkill drivers can have 4 states.
 +Who: 	anybody or Florian Mickler <florian@mickler.org>
 +
 +----------------------------
 +
 +What: 	sysfs-class-rfkill claim file
 +When:	Feb 2012
 +Files:	net/rfkill/core.c
 +Why:	It is not possible to claim an rfkill driver since 2007. This is
 +	Documented as obsolete since Feb 2010.
 +Who: 	anybody or Florian Mickler <florian@mickler.org>
 +
 +----------------------------
 +
  What:	capifs
  When:	February 2011
  Files:	drivers/isdn/capi/capifs.*
diff --cc drivers/net/wireless/ath/ath5k/phy.c
index cb569dbffa63,eff3323efb4b..b6704c93f808
--- a/drivers/net/wireless/ath/ath5k/phy.c
+++ b/drivers/net/wireless/ath/ath5k/phy.c
@@@ -1369,38 -1399,26 +1375,30 @@@ static int ath5k_hw_rf511x_calibrate(st
  	}
  
  	i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7;
 -	q_coffd = q_pwr >> 7;
 +
 +	if (ah->ah_version == AR5K_AR5211)
 +		q_coffd = q_pwr >> 6;
 +	else
 +		q_coffd = q_pwr >> 7;
  
- 	/* No correction */
- 	if (i_coffd == 0 || q_coffd == 0)
+ 	/* protect against divide by 0 and loss of sign bits */
+ 	if (i_coffd == 0 || q_coffd < 2)
  		goto done;
  
- 	i_coff = ((-iq_corr) / i_coffd);
+ 	i_coff = (-iq_corr) / i_coffd;
+ 	i_coff = clamp(i_coff, -32, 31); /* signed 6 bit */
  
- 	/* Boundary check */
- 	if (i_coff > 31)
- 		i_coff = 31;
- 	if (i_coff < -32)
- 		i_coff = -32;
- 
- 	if (ah->ah_version == AR5K_AR5211)
- 		q_coff = (i_pwr / q_coffd) - 64;
- 	else
- 		q_coff = (i_pwr / q_coffd) - 128;
+ 	q_coff = (i_pwr / q_coffd) - 128;
+ 	q_coff = clamp(q_coff, -16, 15); /* signed 5 bit */
  
- 	/* Boundary check */
- 	if (q_coff > 15)
- 		q_coff = 15;
- 	if (q_coff < -16)
- 		q_coff = -16;
+ 	ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_CALIBRATE,
+ 			"new I:%d Q:%d (i_coffd:%x q_coffd:%x)",
+ 			i_coff, q_coff, i_coffd, q_coffd);
  
- 	/* Commit new I/Q value */
- 	AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE |
- 		((u32)q_coff) | ((u32)i_coff << AR5K_PHY_IQ_CORR_Q_I_COFF_S));
+ 	/* Commit new I/Q values (set enable bit last to match HAL sources) */
+ 	AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_I_COFF, i_coff);
+ 	AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_Q_COFF, q_coff);
+ 	AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE);
  
  	/* Re-enable calibration -if we don't we'll commit
  	 * the same values again and again */
diff --cc drivers/net/wireless/ath/ath5k/reset.c
index 4120068792ec,cbf28e379843..44bbbf2a6edd
--- a/drivers/net/wireless/ath/ath5k/reset.c
+++ b/drivers/net/wireless/ath/ath5k/reset.c
@@@ -1393,10 -1382,11 +1396,9 @@@ int ath5k_hw_reset(struct ath5k_hw *ah
  		ath5k_hw_set_sleep_clock(ah, true);
  
  	/*
- 	 * Disable beacons and reset the register
+ 	 * Disable beacons and reset the TSF
  	 */
- 	AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE |
- 			AR5K_BEACON_RESET_TSF);
- 
+ 	AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE);
+ 	ath5k_hw_reset_tsf(ah);
  	return 0;
  }
 -
 -#undef _ATH5K_RESET
diff --cc drivers/net/wireless/ipw2x00/ipw2200.c
index 192abfdc5039,5c7aa1b1eb56..9e2ae8f3ecb0
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
@@@ -3186,11 -3177,22 +3186,22 @@@ static int ipw_load_firmware(struct ipw
  	int total_nr = 0;
  	int i;
  	struct pci_pool *pool;
- 	u32 *virts[CB_NUMBER_OF_ELEMENTS_SMALL];
- 	dma_addr_t phys[CB_NUMBER_OF_ELEMENTS_SMALL];
+ 	void **virts;
+ 	dma_addr_t *phys;
  
 -	IPW_DEBUG_TRACE("<< : \n");
 +	IPW_DEBUG_TRACE("<< :\n");
  
+ 	virts = kmalloc(sizeof(void *) * CB_NUMBER_OF_ELEMENTS_SMALL,
+ 			GFP_KERNEL);
+ 	if (!virts)
+ 		return -ENOMEM;
+ 
+ 	phys = kmalloc(sizeof(dma_addr_t) * CB_NUMBER_OF_ELEMENTS_SMALL,
+ 			GFP_KERNEL);
+ 	if (!phys) {
+ 		kfree(virts);
+ 		return -ENOMEM;
+ 	}
  	pool = pci_pool_create("ipw2200", priv->pci_dev, CB_MAX_LENGTH, 0, 0);
  	if (!pool) {
  		IPW_ERROR("pci_pool_create failed\n");
diff --cc drivers/net/wireless/iwlwifi/iwl-4965.c
index 9a220d415449,83c52a682622..6edae9b83bb7
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@@ -2039,17 -2040,15 +2039,15 @@@ static void iwl4965_rx_reply_tx(struct 
  				   le32_to_cpu(tx_resp->rate_n_flags),
  				   tx_resp->failure_frame);
  
 -		freed = iwl_tx_queue_reclaim(priv, txq_id, index);
 +		freed = iwlagn_tx_queue_reclaim(priv, txq_id, index);
- 		if (qc && likely(sta_id != IWL_INVALID_STATION))
- 			priv->stations[sta_id].tid[tid].tfds_in_queue -= freed;
+ 		iwl_free_tfds_in_queue(priv, sta_id, tid, freed);
  
  		if (priv->mac80211_registered &&
  		    (iwl_queue_space(&txq->q) > txq->q.low_mark))
  			iwl_wake_queue(priv, txq_id);
  	}
  
- 	if (qc && likely(sta_id != IWL_INVALID_STATION))
- 		iwlagn_txq_check_empty(priv, sta_id, tid, txq_id);
 -	iwl_txq_check_empty(priv, sta_id, tid, txq_id);
++	iwlagn_txq_check_empty(priv, sta_id, tid, txq_id);
  
  	if (iwl_check_bits(status, TX_ABORT_REQUIRED_MSK))
  		IWL_ERR(priv, "TODO:  Implement Tx ABORT REQUIRED!!!\n");
diff --cc drivers/net/wireless/iwlwifi/iwl-agn.c
index 629cbf38aa9b,e4c2e1e448ad..4f0cb803f732
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@@ -1229,9 -1258,17 +1229,17 @@@ static void iwl_irq_tasklet(struct iwl_
  	/* Ack/clear/reset pending uCode interrupts.
  	 * Note:  Some bits in CSR_INT are "OR" of bits in CSR_FH_INT_STATUS,
  	 */
- 	iwl_write32(priv, CSR_INT, priv->_agn.inta);
+ 	/* There is a hardware bug in the interrupt mask function that some
+ 	 * interrupts (i.e. CSR_INT_BIT_SCD) can still be generated even if
+ 	 * they are disabled in the CSR_INT_MASK register. Furthermore the
+ 	 * ICT interrupt handling mechanism has another bug that might cause
+ 	 * these unmasked interrupts fail to be detected. We workaround the
+ 	 * hardware bugs here by ACKing all the possible interrupts so that
+ 	 * interrupt coalescing can still be achieved.
+ 	 */
 -	iwl_write32(priv, CSR_INT, priv->inta | ~priv->inta_mask);
++	iwl_write32(priv, CSR_INT, priv->_agn.inta | ~priv->inta_mask);
  
 -	inta = priv->inta;
 +	inta = priv->_agn.inta;
  
  #ifdef CONFIG_IWLWIFI_DEBUG
  	if (iwl_get_debug_level(priv) & IWL_DL_ISR) {
diff --cc drivers/net/wireless/iwlwifi/iwl-core.h
index bc04b43cad36,732590f5fe30..10f95724536f
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@@ -458,7 -457,12 +458,9 @@@ void iwl_free_tfds_in_queue(struct iwl_
  void iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq);
  int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
  		      int slots_num, u32 txq_id);
+ void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
+ 			int slots_num, u32 txq_id);
  void iwl_tx_queue_free(struct iwl_priv *priv, int txq_id);
 -int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn);
 -int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid);
 -int iwl_txq_check_empty(struct iwl_priv *priv, int sta_id, u8 tid, int txq_id);
  /*****************************************************
   * TX power
   ****************************************************/