mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
ff30b3642c
23 changed files with 254 additions and 86 deletions
|
|
@ -97,7 +97,7 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
|
|||
struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
|
||||
int ret;
|
||||
u16 val;
|
||||
u32 cksum, offset;
|
||||
u32 cksum, offset, eep_max = AR5K_EEPROM_INFO_MAX;
|
||||
|
||||
/*
|
||||
* Read values from EEPROM and store them in the capability structure
|
||||
|
|
@ -116,12 +116,38 @@ ath5k_eeprom_init_header(struct ath5k_hw *ah)
|
|||
* Validate the checksum of the EEPROM date. There are some
|
||||
* devices with invalid EEPROMs.
|
||||
*/
|
||||
for (cksum = 0, offset = 0; offset < AR5K_EEPROM_INFO_MAX; offset++) {
|
||||
AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_UPPER, val);
|
||||
if (val) {
|
||||
eep_max = (val & AR5K_EEPROM_SIZE_UPPER_MASK) <<
|
||||
AR5K_EEPROM_SIZE_ENDLOC_SHIFT;
|
||||
AR5K_EEPROM_READ(AR5K_EEPROM_SIZE_LOWER, val);
|
||||
eep_max = (eep_max | val) - AR5K_EEPROM_INFO_BASE;
|
||||
|
||||
/*
|
||||
* Fail safe check to prevent stupid loops due
|
||||
* to busted EEPROMs. XXX: This value is likely too
|
||||
* big still, waiting on a better value.
|
||||
*/
|
||||
if (eep_max > (3 * AR5K_EEPROM_INFO_MAX)) {
|
||||
ATH5K_ERR(ah->ah_sc, "Invalid max custom EEPROM size: "
|
||||
"%d (0x%04x) max expected: %d (0x%04x)\n",
|
||||
eep_max, eep_max,
|
||||
3 * AR5K_EEPROM_INFO_MAX,
|
||||
3 * AR5K_EEPROM_INFO_MAX);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
for (cksum = 0, offset = 0; offset < eep_max; offset++) {
|
||||
AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val);
|
||||
cksum ^= val;
|
||||
}
|
||||
if (cksum != AR5K_EEPROM_INFO_CKSUM) {
|
||||
ATH5K_ERR(ah->ah_sc, "Invalid EEPROM checksum 0x%04x\n", cksum);
|
||||
ATH5K_ERR(ah->ah_sc, "Invalid EEPROM "
|
||||
"checksum: 0x%04x eep_max: 0x%04x (%s)\n",
|
||||
cksum, eep_max,
|
||||
eep_max == AR5K_EEPROM_INFO_MAX ?
|
||||
"default size" : "custom size");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,14 @@
|
|||
#define AR5K_EEPROM_RFKILL_POLARITY_S 1
|
||||
|
||||
#define AR5K_EEPROM_REG_DOMAIN 0x00bf /* EEPROM regdom */
|
||||
|
||||
/* FLASH(EEPROM) Defines for AR531X chips */
|
||||
#define AR5K_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */
|
||||
#define AR5K_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */
|
||||
#define AR5K_EEPROM_SIZE_UPPER_MASK 0xfff0
|
||||
#define AR5K_EEPROM_SIZE_UPPER_SHIFT 4
|
||||
#define AR5K_EEPROM_SIZE_ENDLOC_SHIFT 12
|
||||
|
||||
#define AR5K_EEPROM_CHECKSUM 0x00c0 /* EEPROM checksum */
|
||||
#define AR5K_EEPROM_INFO_BASE 0x00c0 /* EEPROM header */
|
||||
#define AR5K_EEPROM_INFO_MAX (0x400 - AR5K_EEPROM_INFO_BASE)
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ config ATH9K
|
|||
|
||||
config ATH9K_DEBUGFS
|
||||
bool "Atheros ath9k debugging"
|
||||
depends on ATH9K
|
||||
depends on ATH9K && DEBUG_FS
|
||||
---help---
|
||||
Say Y, if you need access to ath9k's statistics for
|
||||
interrupts, rate control, etc.
|
||||
|
|
|
|||
|
|
@ -33,11 +33,11 @@ struct ath_node;
|
|||
|
||||
/* Macro to expand scalars to 64-bit objects */
|
||||
|
||||
#define ito64(x) (sizeof(x) == 8) ? \
|
||||
#define ito64(x) (sizeof(x) == 1) ? \
|
||||
(((unsigned long long int)(x)) & (0xff)) : \
|
||||
(sizeof(x) == 16) ? \
|
||||
(sizeof(x) == 2) ? \
|
||||
(((unsigned long long int)(x)) & 0xffff) : \
|
||||
((sizeof(x) == 32) ? \
|
||||
((sizeof(x) == 4) ? \
|
||||
(((unsigned long long int)(x)) & 0xffffffff) : \
|
||||
(unsigned long long int)(x))
|
||||
|
||||
|
|
|
|||
|
|
@ -1961,7 +1961,7 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv,
|
|||
struct ieee80211_tx_info *info;
|
||||
struct iwl4965_tx_resp *tx_resp = (void *)&pkt->u.raw[0];
|
||||
u32 status = le32_to_cpu(tx_resp->u.status);
|
||||
int tid = MAX_TID_COUNT;
|
||||
int uninitialized_var(tid);
|
||||
int sta_id;
|
||||
int freed;
|
||||
u8 *qc = NULL;
|
||||
|
|
|
|||
|
|
@ -2344,6 +2344,21 @@ static void iwl_ht_conf(struct iwl_priv *priv,
|
|||
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||
}
|
||||
|
||||
static inline void iwl_set_no_assoc(struct iwl_priv *priv)
|
||||
{
|
||||
priv->assoc_id = 0;
|
||||
iwl_led_disassociate(priv);
|
||||
/*
|
||||
* inform the ucode that there is no longer an
|
||||
* association and that no more packets should be
|
||||
* sent
|
||||
*/
|
||||
priv->staging_rxon.filter_flags &=
|
||||
~RXON_FILTER_ASSOC_MSK;
|
||||
priv->staging_rxon.assoc_id = 0;
|
||||
iwlcore_commit_rxon(priv);
|
||||
}
|
||||
|
||||
#define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
|
||||
void iwl_bss_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
|
|
@ -2475,20 +2490,8 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
|
|||
IWL_DELAY_NEXT_SCAN_AFTER_ASSOC;
|
||||
if (!iwl_is_rfkill(priv))
|
||||
priv->cfg->ops->lib->post_associate(priv);
|
||||
} else {
|
||||
priv->assoc_id = 0;
|
||||
iwl_led_disassociate(priv);
|
||||
|
||||
/*
|
||||
* inform the ucode that there is no longer an
|
||||
* association and that no more packets should be
|
||||
* send
|
||||
*/
|
||||
priv->staging_rxon.filter_flags &=
|
||||
~RXON_FILTER_ASSOC_MSK;
|
||||
priv->staging_rxon.assoc_id = 0;
|
||||
iwlcore_commit_rxon(priv);
|
||||
}
|
||||
} else
|
||||
iwl_set_no_assoc(priv);
|
||||
}
|
||||
|
||||
if (changes && iwl_is_associated(priv) && priv->assoc_id) {
|
||||
|
|
@ -2503,12 +2506,14 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
|
|||
}
|
||||
}
|
||||
|
||||
if ((changes & BSS_CHANGED_BEACON_ENABLED) &&
|
||||
vif->bss_conf.enable_beacon) {
|
||||
memcpy(priv->staging_rxon.bssid_addr,
|
||||
bss_conf->bssid, ETH_ALEN);
|
||||
memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN);
|
||||
iwlcore_config_ap(priv);
|
||||
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
||||
if (vif->bss_conf.enable_beacon) {
|
||||
memcpy(priv->staging_rxon.bssid_addr,
|
||||
bss_conf->bssid, ETH_ALEN);
|
||||
memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN);
|
||||
iwlcore_config_ap(priv);
|
||||
} else
|
||||
iwl_set_no_assoc(priv);
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
|
|
|||
|
|
@ -711,7 +711,7 @@ extern void iwl_txq_ctx_stop(struct iwl_priv *priv);
|
|||
extern int iwl_queue_space(const struct iwl_queue *q);
|
||||
static inline int iwl_queue_used(const struct iwl_queue *q, int i)
|
||||
{
|
||||
return q->write_ptr > q->read_ptr ?
|
||||
return q->write_ptr >= q->read_ptr ?
|
||||
(i >= q->read_ptr && i < q->write_ptr) :
|
||||
!(i < q->read_ptr && i >= q->write_ptr);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3157,8 +3157,10 @@ static void mwl8k_configure_filter(struct ieee80211_hw *hw,
|
|||
/* Clear unsupported feature flags */
|
||||
*total_flags &= FIF_ALLMULTI | FIF_BCN_PRBRESP_PROMISC;
|
||||
|
||||
if (mwl8k_fw_lock(hw))
|
||||
if (mwl8k_fw_lock(hw)) {
|
||||
kfree(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
if (priv->sniffer_enabled) {
|
||||
mwl8k_enable_sniffer(hw, 0);
|
||||
|
|
|
|||
|
|
@ -340,7 +340,7 @@ static int rt2800_blink_set(struct led_classdev *led_cdev,
|
|||
rt2x00_set_field32(®, LED_CFG_OFF_PERIOD, *delay_off);
|
||||
rt2x00_set_field32(®, LED_CFG_SLOW_BLINK_PERIOD, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_R_LED_MODE, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 12);
|
||||
rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_Y_LED_MODE, 3);
|
||||
rt2x00_set_field32(®, LED_CFG_LED_POLAR, 1);
|
||||
rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
|
||||
|
|
|
|||
|
|
@ -112,6 +112,12 @@
|
|||
#define ALIGN_SIZE(__skb, __header) \
|
||||
( ((unsigned long)((__skb)->data + (__header))) & 3 )
|
||||
|
||||
/*
|
||||
* Constants for extra TX headroom for alignment purposes.
|
||||
*/
|
||||
#define RT2X00_ALIGN_SIZE 4 /* Only whole frame needs alignment */
|
||||
#define RT2X00_L2PAD_SIZE 8 /* Both header & payload need alignment */
|
||||
|
||||
/*
|
||||
* Standard timing and size defines.
|
||||
* These values should follow the ieee80211 specifications.
|
||||
|
|
|
|||
|
|
@ -686,7 +686,17 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)
|
|||
/*
|
||||
* Initialize extra TX headroom required.
|
||||
*/
|
||||
rt2x00dev->hw->extra_tx_headroom = rt2x00dev->ops->extra_tx_headroom;
|
||||
rt2x00dev->hw->extra_tx_headroom =
|
||||
max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM,
|
||||
rt2x00dev->ops->extra_tx_headroom);
|
||||
|
||||
/*
|
||||
* Take TX headroom required for alignment into account.
|
||||
*/
|
||||
if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags))
|
||||
rt2x00dev->hw->extra_tx_headroom += RT2X00_L2PAD_SIZE;
|
||||
else if (test_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags))
|
||||
rt2x00dev->hw->extra_tx_headroom += RT2X00_ALIGN_SIZE;
|
||||
|
||||
/*
|
||||
* Register HW.
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
|
|||
* is also mapped to the DMA so it can be used for transfering
|
||||
* additional descriptor information to the hardware.
|
||||
*/
|
||||
skb_push(skb, rt2x00dev->hw->extra_tx_headroom);
|
||||
skb_push(skb, rt2x00dev->ops->extra_tx_headroom);
|
||||
|
||||
skbdesc->skb_dma =
|
||||
dma_map_single(rt2x00dev->dev, skb->data, skb->len, DMA_TO_DEVICE);
|
||||
|
|
@ -112,7 +112,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
|
|||
/*
|
||||
* Restore data pointer to original location again.
|
||||
*/
|
||||
skb_pull(skb, rt2x00dev->hw->extra_tx_headroom);
|
||||
skb_pull(skb, rt2x00dev->ops->extra_tx_headroom);
|
||||
|
||||
skbdesc->flags |= SKBDESC_DMA_MAPPED_TX;
|
||||
}
|
||||
|
|
@ -134,7 +134,7 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
|
|||
* by the driver, but it was actually mapped to DMA.
|
||||
*/
|
||||
dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma,
|
||||
skb->len + rt2x00dev->hw->extra_tx_headroom,
|
||||
skb->len + rt2x00dev->ops->extra_tx_headroom,
|
||||
DMA_TO_DEVICE);
|
||||
skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -987,12 +987,13 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
|
|||
changed_flags &= SUPPORTED_FIF_FLAGS;
|
||||
*new_flags &= SUPPORTED_FIF_FLAGS;
|
||||
|
||||
/* changed_flags is always populated but this driver
|
||||
* doesn't support all FIF flags so its possible we don't
|
||||
* need to do anything */
|
||||
if (!changed_flags)
|
||||
return;
|
||||
|
||||
/*
|
||||
* If multicast parameter (as returned by zd_op_prepare_multicast)
|
||||
* has changed, no bit in changed_flags is set. To handle this
|
||||
* situation, we do not return if changed_flags is 0. If we do so,
|
||||
* we will have some issue with IPv6 which uses multicast for link
|
||||
* layer address resolution.
|
||||
*/
|
||||
if (*new_flags & (FIF_PROMISC_IN_BSS | FIF_ALLMULTI))
|
||||
zd_mc_add_all(&hash);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue