You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
This commit is contained in:
+5
-3
@@ -1358,16 +1358,19 @@ F: drivers/mtd/devices/block2mtd.c
|
||||
|
||||
BLUETOOTH DRIVERS
|
||||
M: Marcel Holtmann <marcel@holtmann.org>
|
||||
M: Gustavo F. Padovan <padovan@profusion.mobi>
|
||||
L: linux-bluetooth@vger.kernel.org
|
||||
W: http://www.bluez.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
|
||||
S: Maintained
|
||||
F: drivers/bluetooth/
|
||||
|
||||
BLUETOOTH SUBSYSTEM
|
||||
M: Marcel Holtmann <marcel@holtmann.org>
|
||||
M: Gustavo F. Padovan <padovan@profusion.mobi>
|
||||
L: linux-bluetooth@vger.kernel.org
|
||||
W: http://www.bluez.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
|
||||
S: Maintained
|
||||
F: net/bluetooth/
|
||||
F: include/net/bluetooth/
|
||||
@@ -6458,8 +6461,7 @@ L: linux-wireless@vger.kernel.org
|
||||
W: http://wireless.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/wl12xx/*
|
||||
X: drivers/net/wireless/wl12xx/wl1271*
|
||||
F: drivers/net/wireless/wl1251/*
|
||||
|
||||
WL1271 WIRELESS DRIVER
|
||||
M: Luciano Coelho <luciano.coelho@nokia.com>
|
||||
|
||||
@@ -117,8 +117,8 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
|
||||
(event->data[2] == MODULE_ALREADY_UP)) ?
|
||||
"Bring-up succeed" : "Bring-up failed");
|
||||
|
||||
if (event->length > 3)
|
||||
priv->btmrvl_dev.dev_type = event->data[3];
|
||||
if (event->length > 3 && event->data[3])
|
||||
priv->btmrvl_dev.dev_type = HCI_AMP;
|
||||
else
|
||||
priv->btmrvl_dev.dev_type = HCI_BREDR;
|
||||
|
||||
|
||||
@@ -46,6 +46,9 @@ static const struct sdio_device_id btsdio_table[] = {
|
||||
/* Generic Bluetooth Type-B SDIO device */
|
||||
{ SDIO_DEVICE_CLASS(SDIO_CLASS_BT_B) },
|
||||
|
||||
/* Generic Bluetooth AMP controller */
|
||||
{ SDIO_DEVICE_CLASS(SDIO_CLASS_BT_AMP) },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
@@ -329,6 +332,11 @@ static int btsdio_probe(struct sdio_func *func,
|
||||
hdev->bus = HCI_SDIO;
|
||||
hdev->driver_data = data;
|
||||
|
||||
if (id->class == SDIO_CLASS_BT_AMP)
|
||||
hdev->dev_type = HCI_AMP;
|
||||
else
|
||||
hdev->dev_type = HCI_BREDR;
|
||||
|
||||
data->hdev = hdev;
|
||||
|
||||
SET_HCIDEV_DEV(hdev, &func->dev);
|
||||
|
||||
@@ -59,9 +59,15 @@ static struct usb_device_id btusb_table[] = {
|
||||
/* Generic Bluetooth USB device */
|
||||
{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
|
||||
|
||||
/* Apple MacBookPro 7,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8213) },
|
||||
|
||||
/* Apple iMac11,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8215) },
|
||||
|
||||
/* Apple MacBookPro6,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x8218) },
|
||||
|
||||
/* AVM BlueFRITZ! USB v2.0 */
|
||||
{ USB_DEVICE(0x057c, 0x3800) },
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ static inline void hci_uart_tx_complete(struct hci_uart *hu, int pkt_type)
|
||||
break;
|
||||
|
||||
case HCI_SCODATA_PKT:
|
||||
hdev->stat.cmd_tx++;
|
||||
hdev->stat.sco_tx++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -279,6 +279,7 @@ source "drivers/net/wireless/libertas/Kconfig"
|
||||
source "drivers/net/wireless/orinoco/Kconfig"
|
||||
source "drivers/net/wireless/p54/Kconfig"
|
||||
source "drivers/net/wireless/rt2x00/Kconfig"
|
||||
source "drivers/net/wireless/wl1251/Kconfig"
|
||||
source "drivers/net/wireless/wl12xx/Kconfig"
|
||||
source "drivers/net/wireless/zd1211rw/Kconfig"
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ obj-$(CONFIG_ATH_COMMON) += ath/
|
||||
|
||||
obj-$(CONFIG_MAC80211_HWSIM) += mac80211_hwsim.o
|
||||
|
||||
obj-$(CONFIG_WL1251) += wl1251/
|
||||
obj-$(CONFIG_WL12XX) += wl12xx/
|
||||
obj-$(CONFIG_WL12XX_PLATFORM_DATA) += wl12xx/
|
||||
|
||||
|
||||
@@ -1525,8 +1525,7 @@ static void at76_rx_tasklet(unsigned long param)
|
||||
|
||||
if (priv->device_unplugged) {
|
||||
at76_dbg(DBG_DEVSTART, "device unplugged");
|
||||
if (urb)
|
||||
at76_dbg(DBG_DEVSTART, "urb status %d", urb->status);
|
||||
at76_dbg(DBG_DEVSTART, "urb status %d", urb->status);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <net/mac80211.h>
|
||||
|
||||
/*
|
||||
@@ -42,6 +43,13 @@ struct ath_ani {
|
||||
struct timer_list timer;
|
||||
};
|
||||
|
||||
struct ath_cycle_counters {
|
||||
u32 cycles;
|
||||
u32 rx_busy;
|
||||
u32 rx_frame;
|
||||
u32 tx_frame;
|
||||
};
|
||||
|
||||
enum ath_device_state {
|
||||
ATH_HW_UNAVAILABLE,
|
||||
ATH_HW_INITIALIZED,
|
||||
@@ -145,6 +153,12 @@ struct ath_common {
|
||||
DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX);
|
||||
enum ath_crypt_caps crypt_caps;
|
||||
|
||||
unsigned int clockrate;
|
||||
|
||||
spinlock_t cc_lock;
|
||||
struct ath_cycle_counters cc_ani;
|
||||
struct ath_cycle_counters cc_survey;
|
||||
|
||||
struct ath_regulatory regulatory;
|
||||
const struct ath_ops *ops;
|
||||
const struct ath_bus_ops *bus_ops;
|
||||
@@ -161,5 +175,7 @@ int ath_key_config(struct ath_common *common,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key);
|
||||
bool ath_hw_keyreset(struct ath_common *common, u16 entry);
|
||||
void ath_hw_cycle_counters_update(struct ath_common *common);
|
||||
int32_t ath_hw_get_listen_time(struct ath_common *common);
|
||||
|
||||
#endif /* ATH_H */
|
||||
|
||||
@@ -355,41 +355,28 @@ ath5k_ani_lower_immunity(struct ath5k_hw *ah, struct ath5k_ani_state *as)
|
||||
|
||||
|
||||
/**
|
||||
* ath5k_hw_ani_get_listen_time() - Calculate time spent listening
|
||||
* ath5k_hw_ani_get_listen_time() - Update counters and return listening time
|
||||
*
|
||||
* Return an approximation of the time spent "listening" in milliseconds (ms)
|
||||
* since the last call of this function by deducting the cycles spent
|
||||
* transmitting and receiving from the total cycle count.
|
||||
* Save profile count values for debugging/statistics and because we might want
|
||||
* to use them later.
|
||||
*
|
||||
* We assume no one else clears these registers!
|
||||
* since the last call of this function.
|
||||
* Save a snapshot of the counter values for debugging/statistics.
|
||||
*/
|
||||
static int
|
||||
ath5k_hw_ani_get_listen_time(struct ath5k_hw *ah, struct ath5k_ani_state *as)
|
||||
{
|
||||
struct ath_common *common = ath5k_hw_common(ah);
|
||||
int listen;
|
||||
|
||||
/* freeze */
|
||||
ath5k_hw_reg_write(ah, AR5K_MIBC_FMC, AR5K_MIBC);
|
||||
/* read */
|
||||
as->pfc_cycles = ath5k_hw_reg_read(ah, AR5K_PROFCNT_CYCLE);
|
||||
as->pfc_busy = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RXCLR);
|
||||
as->pfc_tx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_TX);
|
||||
as->pfc_rx = ath5k_hw_reg_read(ah, AR5K_PROFCNT_RX);
|
||||
/* clear */
|
||||
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_TX);
|
||||
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_RX);
|
||||
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_RXCLR);
|
||||
ath5k_hw_reg_write(ah, 0, AR5K_PROFCNT_CYCLE);
|
||||
/* un-freeze */
|
||||
ath5k_hw_reg_write(ah, 0, AR5K_MIBC);
|
||||
spin_lock_bh(&common->cc_lock);
|
||||
|
||||
/* TODO: where does 44000 come from? (11g clock rate?) */
|
||||
listen = (as->pfc_cycles - as->pfc_rx - as->pfc_tx) / 44000;
|
||||
ath_hw_cycle_counters_update(common);
|
||||
memcpy(&as->last_cc, &common->cc_ani, sizeof(as->last_cc));
|
||||
|
||||
/* clears common->cc_ani */
|
||||
listen = ath_hw_get_listen_time(common);
|
||||
|
||||
spin_unlock_bh(&common->cc_lock);
|
||||
|
||||
if (as->pfc_cycles == 0 || listen < 0)
|
||||
return 0;
|
||||
return listen;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,10 +75,7 @@ struct ath5k_ani_state {
|
||||
unsigned int cck_errors;
|
||||
|
||||
/* debug/statistics only: numbers from last ANI calibration */
|
||||
unsigned int pfc_tx;
|
||||
unsigned int pfc_rx;
|
||||
unsigned int pfc_busy;
|
||||
unsigned int pfc_cycles;
|
||||
struct ath_cycle_counters last_cc;
|
||||
unsigned int last_listen;
|
||||
unsigned int last_ofdm_errors;
|
||||
unsigned int last_cck_errors;
|
||||
|
||||
@@ -1201,7 +1201,7 @@ void ath5k_hw_set_ack_bitrate_high(struct ath5k_hw *ah, bool high);
|
||||
/* Clock rate related functions */
|
||||
unsigned int ath5k_hw_htoclock(struct ath5k_hw *ah, unsigned int usec);
|
||||
unsigned int ath5k_hw_clocktoh(struct ath5k_hw *ah, unsigned int clock);
|
||||
unsigned int ath5k_hw_get_clockrate(struct ath5k_hw *ah);
|
||||
void ath5k_hw_set_clockrate(struct ath5k_hw *ah);
|
||||
|
||||
/* Queue Control Unit, DFS Control Unit Functions */
|
||||
int ath5k_hw_get_tx_queueprops(struct ath5k_hw *ah, int queue,
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
#include "reg.h"
|
||||
#include "debug.h"
|
||||
#include "ani.h"
|
||||
#include "../debug.h"
|
||||
|
||||
static int modparam_nohwcrypt;
|
||||
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
|
||||
@@ -517,12 +518,14 @@ struct ath_vif_iter_data {
|
||||
bool need_set_hw_addr;
|
||||
bool found_active;
|
||||
bool any_assoc;
|
||||
enum nl80211_iftype opmode;
|
||||
};
|
||||
|
||||
static void ath_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath_vif_iter_data *iter_data = data;
|
||||
int i;
|
||||
struct ath5k_vif *avf = (void *)vif->drv_priv;
|
||||
|
||||
if (iter_data->hw_macaddr)
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
@@ -539,13 +542,32 @@ static void ath_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
iter_data->need_set_hw_addr = false;
|
||||
|
||||
if (!iter_data->any_assoc) {
|
||||
struct ath5k_vif *avf = (void *)vif->drv_priv;
|
||||
if (avf->assoc)
|
||||
iter_data->any_assoc = true;
|
||||
}
|
||||
|
||||
/* Calculate combined mode - when APs are active, operate in AP mode.
|
||||
* Otherwise use the mode of the new interface. This can currently
|
||||
* only deal with combinations of APs and STAs. Only one ad-hoc
|
||||
* interfaces is allowed above.
|
||||
*/
|
||||
if (avf->opmode == NL80211_IFTYPE_AP)
|
||||
iter_data->opmode = NL80211_IFTYPE_AP;
|
||||
else
|
||||
if (iter_data->opmode == NL80211_IFTYPE_UNSPECIFIED)
|
||||
iter_data->opmode = avf->opmode;
|
||||
}
|
||||
|
||||
void ath5k_update_bssid_mask(struct ath5k_softc *sc, struct ieee80211_vif *vif)
|
||||
static void ath_do_set_opmode(struct ath5k_softc *sc)
|
||||
{
|
||||
struct ath5k_hw *ah = sc->ah;
|
||||
ath5k_hw_set_opmode(ah, sc->opmode);
|
||||
ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "mode setup opmode %d (%s)\n",
|
||||
sc->opmode, ath_opmode_to_string(sc->opmode));
|
||||
}
|
||||
|
||||
void ath5k_update_bssid_mask_and_opmode(struct ath5k_softc *sc,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath_common *common = ath5k_hw_common(sc->ah);
|
||||
struct ath_vif_iter_data iter_data;
|
||||
@@ -558,6 +580,7 @@ void ath5k_update_bssid_mask(struct ath5k_softc *sc, struct ieee80211_vif *vif)
|
||||
memset(&iter_data.mask, 0xff, ETH_ALEN);
|
||||
iter_data.found_active = false;
|
||||
iter_data.need_set_hw_addr = true;
|
||||
iter_data.opmode = NL80211_IFTYPE_UNSPECIFIED;
|
||||
|
||||
if (vif)
|
||||
ath_vif_iter(&iter_data, vif->addr, vif);
|
||||
@@ -567,10 +590,18 @@ void ath5k_update_bssid_mask(struct ath5k_softc *sc, struct ieee80211_vif *vif)
|
||||
&iter_data);
|
||||
memcpy(sc->bssidmask, iter_data.mask, ETH_ALEN);
|
||||
|
||||
sc->opmode = iter_data.opmode;
|
||||
if (sc->opmode == NL80211_IFTYPE_UNSPECIFIED)
|
||||
/* Nothing active, default to station mode */
|
||||
sc->opmode = NL80211_IFTYPE_STATION;
|
||||
|
||||
ath_do_set_opmode(sc);
|
||||
|
||||
if (iter_data.need_set_hw_addr && iter_data.found_active)
|
||||
ath5k_hw_set_lladdr(sc->ah, iter_data.active_mac);
|
||||
|
||||
ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
|
||||
if (ath5k_hw_hasbssidmask(sc->ah))
|
||||
ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -582,15 +613,9 @@ ath5k_mode_setup(struct ath5k_softc *sc, struct ieee80211_vif *vif)
|
||||
/* configure rx filter */
|
||||
rfilt = sc->filter_flags;
|
||||
ath5k_hw_set_rx_filter(ah, rfilt);
|
||||
|
||||
if (ath5k_hw_hasbssidmask(ah))
|
||||
ath5k_update_bssid_mask(sc, vif);
|
||||
|
||||
/* configure operational mode */
|
||||
ath5k_hw_set_opmode(ah, sc->opmode);
|
||||
|
||||
ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "mode setup opmode %d\n", sc->opmode);
|
||||
ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt);
|
||||
|
||||
ath5k_update_bssid_mask_and_opmode(sc, vif);
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -2688,7 +2713,7 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
|
||||
SET_IEEE80211_PERM_ADDR(hw, mac);
|
||||
memcpy(&sc->lladdr, mac, ETH_ALEN);
|
||||
/* All MAC address bits matter for ACKs */
|
||||
ath5k_update_bssid_mask(sc, NULL);
|
||||
ath5k_update_bssid_mask_and_opmode(sc, NULL);
|
||||
|
||||
regulatory->current_rd = ah->ah_capabilities.cap_eeprom.ee_regdomain;
|
||||
ret = ath_regd_init(regulatory, hw->wiphy, ath5k_reg_notifier);
|
||||
@@ -2786,7 +2811,6 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct ath5k_softc *sc = hw->priv;
|
||||
int ret;
|
||||
struct ath5k_hw *ah = sc->ah;
|
||||
struct ath5k_vif *avf = (void *)vif->drv_priv;
|
||||
|
||||
mutex_lock(&sc->lock);
|
||||
@@ -2850,18 +2874,6 @@ static int ath5k_add_interface(struct ieee80211_hw *hw,
|
||||
sc->num_adhoc_vifs++;
|
||||
}
|
||||
|
||||
/* Set combined mode - when APs are configured, operate in AP mode.
|
||||
* Otherwise use the mode of the new interface. This can currently
|
||||
* only deal with combinations of APs and STAs. Only one ad-hoc
|
||||
* interfaces is allowed above.
|
||||
*/
|
||||
if (sc->num_ap_vifs)
|
||||
sc->opmode = NL80211_IFTYPE_AP;
|
||||
else
|
||||
sc->opmode = vif->type;
|
||||
|
||||
ath5k_hw_set_opmode(ah, sc->opmode);
|
||||
|
||||
/* Any MAC address is fine, all others are included through the
|
||||
* filter.
|
||||
*/
|
||||
@@ -2905,7 +2917,7 @@ ath5k_remove_interface(struct ieee80211_hw *hw,
|
||||
else if (avf->opmode == NL80211_IFTYPE_ADHOC)
|
||||
sc->num_adhoc_vifs--;
|
||||
|
||||
ath5k_update_bssid_mask(sc, NULL);
|
||||
ath5k_update_bssid_mask_and_opmode(sc, NULL);
|
||||
mutex_unlock(&sc->lock);
|
||||
}
|
||||
|
||||
@@ -3529,8 +3541,6 @@ ath5k_pci_probe(struct pci_dev *pdev,
|
||||
sc->hw = hw;
|
||||
sc->pdev = pdev;
|
||||
|
||||
ath5k_debug_init_device(sc);
|
||||
|
||||
/*
|
||||
* Mark the device as detached to avoid processing
|
||||
* interrupts until setup is complete.
|
||||
@@ -3638,6 +3648,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
ath5k_debug_init_device(sc);
|
||||
|
||||
/* ready to process interrupts */
|
||||
__clear_bit(ATH_STAT_INVALID, sc->status);
|
||||
@@ -3724,8 +3735,6 @@ init_ath5k_pci(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ath5k_debug_init();
|
||||
|
||||
ret = pci_register_driver(&ath5k_pci_driver);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "ath5k_pci: can't register pci driver\n");
|
||||
@@ -3739,8 +3748,6 @@ static void __exit
|
||||
exit_ath5k_pci(void)
|
||||
{
|
||||
pci_unregister_driver(&ath5k_pci_driver);
|
||||
|
||||
ath5k_debug_finish();
|
||||
}
|
||||
|
||||
module_init(init_ath5k_pci);
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
|
||||
#include "base.h"
|
||||
#include "debug.h"
|
||||
#include "../debug.h"
|
||||
|
||||
static unsigned int ath5k_debug;
|
||||
module_param_named(debug, ath5k_debug, uint, 0);
|
||||
@@ -71,8 +72,6 @@ module_param_named(debug, ath5k_debug, uint, 0);
|
||||
#include "reg.h"
|
||||
#include "ani.h"
|
||||
|
||||
static struct dentry *ath5k_global_debugfs;
|
||||
|
||||
static int ath5k_debugfs_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
file->private_data = inode->i_private;
|
||||
@@ -520,9 +519,10 @@ static ssize_t read_file_misc(struct file *file, char __user *user_buf,
|
||||
if (filt & AR5K_RX_FILTER_PHYERR_5211)
|
||||
snprintf(buf+len, sizeof(buf)-len, " PHYERR-5211");
|
||||
if (filt & AR5K_RX_FILTER_RADARERR_5211)
|
||||
len += snprintf(buf+len, sizeof(buf)-len, " RADARERR-5211\n");
|
||||
else
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "\n");
|
||||
len += snprintf(buf+len, sizeof(buf)-len, " RADARERR-5211");
|
||||
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "\nopmode: %s (%d)\n",
|
||||
ath_opmode_to_string(sc->opmode), sc->opmode);
|
||||
|
||||
if (len > sizeof(buf))
|
||||
len = sizeof(buf);
|
||||
@@ -715,20 +715,21 @@ static ssize_t read_file_ani(struct file *file, char __user *user_buf,
|
||||
len += snprintf(buf+len, sizeof(buf)-len,
|
||||
"beacon RSSI average:\t%d\n",
|
||||
sc->ah->ah_beacon_rssi_avg.avg);
|
||||
|
||||
#define CC_PRINT(_struct, _field) \
|
||||
_struct._field, \
|
||||
_struct.cycles > 0 ? \
|
||||
_struct._field*100/_struct.cycles : 0
|
||||
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n",
|
||||
as->pfc_tx,
|
||||
as->pfc_cycles > 0 ?
|
||||
as->pfc_tx*100/as->pfc_cycles : 0);
|
||||
CC_PRINT(as->last_cc, tx_frame));
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n",
|
||||
as->pfc_rx,
|
||||
as->pfc_cycles > 0 ?
|
||||
as->pfc_rx*100/as->pfc_cycles : 0);
|
||||
CC_PRINT(as->last_cc, rx_frame));
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n",
|
||||
as->pfc_busy,
|
||||
as->pfc_cycles > 0 ?
|
||||
as->pfc_busy*100/as->pfc_cycles : 0);
|
||||
CC_PRINT(as->last_cc, rx_busy));
|
||||
#undef CC_PRINT
|
||||
len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n",
|
||||
as->pfc_cycles);
|
||||
as->last_cc.cycles);
|
||||
len += snprintf(buf+len, sizeof(buf)-len,
|
||||
"listen time\t\t%d\tlast: %d\n",
|
||||
as->listen_time, as->last_listen);
|
||||
@@ -879,21 +880,13 @@ static const struct file_operations fops_queue = {
|
||||
};
|
||||
|
||||
|
||||
/* init */
|
||||
|
||||
void
|
||||
ath5k_debug_init(void)
|
||||
{
|
||||
ath5k_global_debugfs = debugfs_create_dir("ath5k", NULL);
|
||||
}
|
||||
|
||||
void
|
||||
ath5k_debug_init_device(struct ath5k_softc *sc)
|
||||
{
|
||||
sc->debug.level = ath5k_debug;
|
||||
|
||||
sc->debug.debugfs_phydir = debugfs_create_dir(wiphy_name(sc->hw->wiphy),
|
||||
ath5k_global_debugfs);
|
||||
sc->debug.debugfs_phydir = debugfs_create_dir("ath5k",
|
||||
sc->hw->wiphy->debugfsdir);
|
||||
|
||||
sc->debug.debugfs_debug = debugfs_create_file("debug",
|
||||
S_IWUSR | S_IRUSR,
|
||||
@@ -933,12 +926,6 @@ ath5k_debug_init_device(struct ath5k_softc *sc)
|
||||
&fops_queue);
|
||||
}
|
||||
|
||||
void
|
||||
ath5k_debug_finish(void)
|
||||
{
|
||||
debugfs_remove(ath5k_global_debugfs);
|
||||
}
|
||||
|
||||
void
|
||||
ath5k_debug_finish_device(struct ath5k_softc *sc)
|
||||
{
|
||||
|
||||
@@ -137,15 +137,9 @@ enum ath5k_debug_level {
|
||||
__func__, __LINE__, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
void
|
||||
ath5k_debug_init(void);
|
||||
|
||||
void
|
||||
ath5k_debug_init_device(struct ath5k_softc *sc);
|
||||
|
||||
void
|
||||
ath5k_debug_finish(void);
|
||||
|
||||
void
|
||||
ath5k_debug_finish_device(struct ath5k_softc *sc);
|
||||
|
||||
@@ -173,15 +167,9 @@ static inline void __attribute__ ((format (printf, 3, 4)))
|
||||
ATH5K_DBG_UNLIMIT(struct ath5k_softc *sc, unsigned int m, const char *fmt, ...)
|
||||
{}
|
||||
|
||||
static inline void
|
||||
ath5k_debug_init(void) {}
|
||||
|
||||
static inline void
|
||||
ath5k_debug_init_device(struct ath5k_softc *sc) {}
|
||||
|
||||
static inline void
|
||||
ath5k_debug_finish(void) {}
|
||||
|
||||
static inline void
|
||||
ath5k_debug_finish_device(struct ath5k_softc *sc) {}
|
||||
|
||||
|
||||
@@ -207,7 +207,8 @@ static int ath5k_hw_set_cts_timeout(struct ath5k_hw *ah, unsigned int timeout)
|
||||
*/
|
||||
unsigned int ath5k_hw_htoclock(struct ath5k_hw *ah, unsigned int usec)
|
||||
{
|
||||
return usec * ath5k_hw_get_clockrate(ah);
|
||||
struct ath_common *common = ath5k_hw_common(ah);
|
||||
return usec * common->clockrate;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -216,17 +217,19 @@ unsigned int ath5k_hw_htoclock(struct ath5k_hw *ah, unsigned int usec)
|
||||
*/
|
||||
unsigned int ath5k_hw_clocktoh(struct ath5k_hw *ah, unsigned int clock)
|
||||
{
|
||||
return clock / ath5k_hw_get_clockrate(ah);
|
||||
struct ath_common *common = ath5k_hw_common(ah);
|
||||
return clock / common->clockrate;
|
||||
}
|
||||
|
||||
/**
|
||||
* ath5k_hw_get_clockrate - Get the clock rate for current mode
|
||||
* ath5k_hw_set_clockrate - Set common->clockrate for the current channel
|
||||
*
|
||||
* @ah: The &struct ath5k_hw
|
||||
*/
|
||||
unsigned int ath5k_hw_get_clockrate(struct ath5k_hw *ah)
|
||||
void ath5k_hw_set_clockrate(struct ath5k_hw *ah)
|
||||
{
|
||||
struct ieee80211_channel *channel = ah->ah_current_channel;
|
||||
struct ath_common *common = ath5k_hw_common(ah);
|
||||
int clock;
|
||||
|
||||
if (channel->hw_value & CHANNEL_5GHZ)
|
||||
@@ -240,7 +243,7 @@ unsigned int ath5k_hw_get_clockrate(struct ath5k_hw *ah)
|
||||
if (channel->hw_value & CHANNEL_TURBO)
|
||||
clock *= 2;
|
||||
|
||||
return clock;
|
||||
common->clockrate = clock;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1093,6 +1093,7 @@ int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel)
|
||||
|
||||
ah->ah_current_channel = channel;
|
||||
ah->ah_turbo = channel->hw_value == CHANNEL_T ? true : false;
|
||||
ath5k_hw_set_clockrate(ah);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -465,40 +465,6 @@ static void ath9k_hw_ani_lower_immunity(struct ath_hw *ah)
|
||||
ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel - 1);
|
||||
}
|
||||
|
||||
static u8 ath9k_hw_chan_2_clockrate_mhz(struct ath_hw *ah)
|
||||
{
|
||||
struct ath9k_channel *chan = ah->curchan;
|
||||
struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
|
||||
u8 clockrate; /* in MHz */
|
||||
|
||||
if (!ah->curchan) /* should really check for CCK instead */
|
||||
clockrate = ATH9K_CLOCK_RATE_CCK;
|
||||
else if (conf->channel->band == IEEE80211_BAND_2GHZ)
|
||||
clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM;
|
||||
else if (IS_CHAN_A_FAST_CLOCK(ah, chan))
|
||||
clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM;
|
||||
else
|
||||
clockrate = ATH9K_CLOCK_RATE_5GHZ_OFDM;
|
||||
|
||||
if (conf_is_ht40(conf))
|
||||
return clockrate * 2;
|
||||
|
||||
return clockrate;
|
||||
}
|
||||
|
||||
static int32_t ath9k_hw_ani_get_listen_time(struct ath_hw *ah)
|
||||
{
|
||||
int32_t listen_time;
|
||||
int32_t clock_rate;
|
||||
|
||||
ath9k_hw_update_cycle_counters(ah);
|
||||
clock_rate = ath9k_hw_chan_2_clockrate_mhz(ah) * 1000;
|
||||
listen_time = ah->listen_time / clock_rate;
|
||||
ah->listen_time = 0;
|
||||
|
||||
return listen_time;
|
||||
}
|
||||
|
||||
static void ath9k_ani_reset_old(struct ath_hw *ah, bool is_scanning)
|
||||
{
|
||||
struct ar5416AniState *aniState;
|
||||
@@ -667,7 +633,7 @@ void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning)
|
||||
REGWRITE_BUFFER_FLUSH(ah);
|
||||
}
|
||||
|
||||
static void ath9k_hw_ani_read_counters(struct ath_hw *ah)
|
||||
static bool ath9k_hw_ani_read_counters(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ar5416AniState *aniState = &ah->curchan->ani;
|
||||
@@ -677,11 +643,13 @@ static void ath9k_hw_ani_read_counters(struct ath_hw *ah)
|
||||
u32 phyCnt1, phyCnt2;
|
||||
int32_t listenTime;
|
||||
|
||||
listenTime = ath9k_hw_ani_get_listen_time(ah);
|
||||
if (listenTime < 0) {
|
||||
ath_hw_cycle_counters_update(common);
|
||||
listenTime = ath_hw_get_listen_time(common);
|
||||
|
||||
if (listenTime <= 0) {
|
||||
ah->stats.ast_ani_lneg++;
|
||||
ath9k_ani_restart(ah);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!use_new_ani(ah)) {
|
||||
@@ -696,7 +664,7 @@ static void ath9k_hw_ani_read_counters(struct ath_hw *ah)
|
||||
phyCnt1 = REG_READ(ah, AR_PHY_ERR_1);
|
||||
phyCnt2 = REG_READ(ah, AR_PHY_ERR_2);
|
||||
|
||||
if (use_new_ani(ah) && (phyCnt1 < ofdm_base || phyCnt2 < cck_base)) {
|
||||
if (!use_new_ani(ah) && (phyCnt1 < ofdm_base || phyCnt2 < cck_base)) {
|
||||
if (phyCnt1 < ofdm_base) {
|
||||
ath_print(common, ATH_DBG_ANI,
|
||||
"phyCnt1 0x%x, resetting "
|
||||
@@ -715,7 +683,7 @@ static void ath9k_hw_ani_read_counters(struct ath_hw *ah)
|
||||
REG_WRITE(ah, AR_PHY_ERR_MASK_2,
|
||||
AR_PHY_ERR_CCK_TIMING);
|
||||
}
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
ofdmPhyErrCnt = phyCnt1 - ofdm_base;
|
||||
@@ -727,7 +695,7 @@ static void ath9k_hw_ani_read_counters(struct ath_hw *ah)
|
||||
ah->stats.ast_ani_cckerrs +=
|
||||
cckPhyErrCnt - aniState->cckPhyErrCount;
|
||||
aniState->cckPhyErrCount = cckPhyErrCnt;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
@@ -743,7 +711,8 @@ void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
if (WARN_ON(!aniState))
|
||||
return;
|
||||
|
||||
ath9k_hw_ani_read_counters(ah);
|
||||
if (!ath9k_hw_ani_read_counters(ah))
|
||||
return;
|
||||
|
||||
ofdmPhyErrRate = aniState->ofdmPhyErrCount * 1000 /
|
||||
aniState->listenTime;
|
||||
@@ -818,54 +787,6 @@ void ath9k_hw_disable_mib_counters(struct ath_hw *ah)
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_disable_mib_counters);
|
||||
|
||||
void ath9k_hw_update_cycle_counters(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_cycle_counters cc;
|
||||
bool clear;
|
||||
|
||||
memcpy(&cc, &ah->cc, sizeof(cc));
|
||||
|
||||
/* freeze counters */
|
||||
REG_WRITE(ah, AR_MIBC, AR_MIBC_FMC);
|
||||
|
||||
ah->cc.cycles = REG_READ(ah, AR_CCCNT);
|
||||
if (ah->cc.cycles < cc.cycles) {
|
||||
clear = true;
|
||||
goto skip;
|
||||
}
|
||||
|
||||
ah->cc.rx_clear = REG_READ(ah, AR_RCCNT);
|
||||
ah->cc.rx_frame = REG_READ(ah, AR_RFCNT);
|
||||
ah->cc.tx_frame = REG_READ(ah, AR_TFCNT);
|
||||
|
||||
/* prevent wraparound */
|
||||
if (ah->cc.cycles & BIT(31))
|
||||
clear = true;
|
||||
|
||||
#define CC_DELTA(_field, _reg) ah->cc_delta._field += ah->cc._field - cc._field
|
||||
CC_DELTA(cycles, AR_CCCNT);
|
||||
CC_DELTA(rx_frame, AR_RFCNT);
|
||||
CC_DELTA(rx_clear, AR_RCCNT);
|
||||
CC_DELTA(tx_frame, AR_TFCNT);
|
||||
#undef CC_DELTA
|
||||
|
||||
ah->listen_time += (ah->cc.cycles - cc.cycles) -
|
||||
((ah->cc.rx_frame - cc.rx_frame) +
|
||||
(ah->cc.tx_frame - cc.tx_frame));
|
||||
|
||||
skip:
|
||||
if (clear) {
|
||||
REG_WRITE(ah, AR_CCCNT, 0);
|
||||
REG_WRITE(ah, AR_RFCNT, 0);
|
||||
REG_WRITE(ah, AR_RCCNT, 0);
|
||||
REG_WRITE(ah, AR_TFCNT, 0);
|
||||
memset(&ah->cc, 0, sizeof(ah->cc));
|
||||
}
|
||||
|
||||
/* unfreeze counters */
|
||||
REG_WRITE(ah, AR_MIBC, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Process a MIB interrupt. We may potentially be invoked because
|
||||
* any of the MIB counters overflow/trigger so don't assume we're
|
||||
|
||||
@@ -93,13 +93,6 @@ struct ath9k_mib_stats {
|
||||
u32 beacons;
|
||||
};
|
||||
|
||||
struct ath_cycle_counters {
|
||||
u32 cycles;
|
||||
u32 rx_frame;
|
||||
u32 rx_clear;
|
||||
u32 tx_frame;
|
||||
};
|
||||
|
||||
/* INI default values for ANI registers */
|
||||
struct ath9k_ani_default {
|
||||
u16 m1ThreshLow;
|
||||
@@ -164,7 +157,6 @@ struct ar5416Stats {
|
||||
|
||||
void ath9k_enable_mib_counters(struct ath_hw *ah);
|
||||
void ath9k_hw_disable_mib_counters(struct ath_hw *ah);
|
||||
void ath9k_hw_update_cycle_counters(struct ath_hw *ah);
|
||||
void ath9k_hw_ani_setup(struct ath_hw *ah);
|
||||
void ath9k_hw_ani_init(struct ath_hw *ah);
|
||||
int ath9k_hw_get_ani_channel_idx(struct ath_hw *ah,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user