Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Conflicts: net/ieee802154/6lowpan.c
This commit is contained in:
commit
235f939228
|
@ -38,7 +38,7 @@ static const struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = {
|
||||||
{ "M25P32", 0x15, 0x10000, 64, },
|
{ "M25P32", 0x15, 0x10000, 64, },
|
||||||
{ "M25P64", 0x16, 0x10000, 128, },
|
{ "M25P64", 0x16, 0x10000, 128, },
|
||||||
{ "M25FL128", 0x17, 0x10000, 256, },
|
{ "M25FL128", 0x17, 0x10000, 256, },
|
||||||
{ 0 },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
||||||
|
@ -56,7 +56,7 @@ static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = {
|
||||||
{ "SST25VF016", 0x41, 0x1000, 512, },
|
{ "SST25VF016", 0x41, 0x1000, 512, },
|
||||||
{ "SST25VF032", 0x4a, 0x1000, 1024, },
|
{ "SST25VF032", 0x4a, 0x1000, 1024, },
|
||||||
{ "SST25VF064", 0x4b, 0x1000, 2048, },
|
{ "SST25VF064", 0x4b, 0x1000, 2048, },
|
||||||
{ 0 },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct bcma_sflash_tbl_e bcma_sflash_at_tbl[] = {
|
static const struct bcma_sflash_tbl_e bcma_sflash_at_tbl[] = {
|
||||||
|
@ -67,7 +67,7 @@ static const struct bcma_sflash_tbl_e bcma_sflash_at_tbl[] = {
|
||||||
{ "AT45DB161", 0x2c, 512, 4096, },
|
{ "AT45DB161", 0x2c, 512, 4096, },
|
||||||
{ "AT45DB321", 0x34, 512, 8192, },
|
{ "AT45DB321", 0x34, 512, 8192, },
|
||||||
{ "AT45DB642", 0x3c, 1024, 8192, },
|
{ "AT45DB642", 0x3c, 1024, 8192, },
|
||||||
{ 0 },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void bcma_sflash_cmd(struct bcma_drv_cc *cc, u32 opcode)
|
static void bcma_sflash_cmd(struct bcma_drv_cc *cc, u32 opcode)
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct btsdio_data {
|
||||||
#define REG_CL_INTRD 0x13 /* Interrupt Clear */
|
#define REG_CL_INTRD 0x13 /* Interrupt Clear */
|
||||||
#define REG_EN_INTRD 0x14 /* Interrupt Enable */
|
#define REG_EN_INTRD 0x14 /* Interrupt Enable */
|
||||||
#define REG_MD_STAT 0x20 /* Bluetooth Mode Status */
|
#define REG_MD_STAT 0x20 /* Bluetooth Mode Status */
|
||||||
|
#define REG_MD_SET 0x20 /* Bluetooth Mode Set */
|
||||||
|
|
||||||
static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb)
|
static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
@ -212,7 +213,7 @@ static int btsdio_open(struct hci_dev *hdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->func->class == SDIO_CLASS_BT_B)
|
if (data->func->class == SDIO_CLASS_BT_B)
|
||||||
sdio_writeb(data->func, 0x00, REG_MD_STAT, NULL);
|
sdio_writeb(data->func, 0x00, REG_MD_SET, NULL);
|
||||||
|
|
||||||
sdio_writeb(data->func, 0x01, REG_EN_INTRD, NULL);
|
sdio_writeb(data->func, 0x01, REG_EN_INTRD, NULL);
|
||||||
|
|
||||||
|
@ -333,6 +334,9 @@ static int btsdio_probe(struct sdio_func *func,
|
||||||
hdev->flush = btsdio_flush;
|
hdev->flush = btsdio_flush;
|
||||||
hdev->send = btsdio_send_frame;
|
hdev->send = btsdio_send_frame;
|
||||||
|
|
||||||
|
if (func->vendor == 0x0104 && func->device == 0x00c5)
|
||||||
|
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||||
|
|
||||||
err = hci_register_dev(hdev);
|
err = hci_register_dev(hdev);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
hci_free_dev(hdev);
|
hci_free_dev(hdev);
|
||||||
|
|
|
@ -965,6 +965,45 @@ static int btusb_setup_bcm92035(struct hci_dev *hdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int btusb_setup_csr(struct hci_dev *hdev)
|
||||||
|
{
|
||||||
|
struct hci_rp_read_local_version *rp;
|
||||||
|
struct sk_buff *skb;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
BT_DBG("%s", hdev->name);
|
||||||
|
|
||||||
|
skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
|
||||||
|
HCI_INIT_TIMEOUT);
|
||||||
|
if (IS_ERR(skb)) {
|
||||||
|
BT_ERR("Reading local version failed (%ld)", -PTR_ERR(skb));
|
||||||
|
return -PTR_ERR(skb);
|
||||||
|
}
|
||||||
|
|
||||||
|
rp = (struct hci_rp_read_local_version *) skb->data;
|
||||||
|
|
||||||
|
if (!rp->status) {
|
||||||
|
if (le16_to_cpu(rp->manufacturer) != 10) {
|
||||||
|
/* Clear the reset quirk since this is not an actual
|
||||||
|
* early Bluetooth 1.1 device from CSR.
|
||||||
|
*/
|
||||||
|
clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||||
|
|
||||||
|
/* These fake CSR controllers have all a broken
|
||||||
|
* stored link key handling and so just disable it.
|
||||||
|
*/
|
||||||
|
set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY,
|
||||||
|
&hdev->quirks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = -bt_to_errno(rp->status);
|
||||||
|
|
||||||
|
kfree_skb(skb);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
struct intel_version {
|
struct intel_version {
|
||||||
u8 status;
|
u8 status;
|
||||||
u8 hw_platform;
|
u8 hw_platform;
|
||||||
|
@ -1465,10 +1504,15 @@ static int btusb_probe(struct usb_interface *intf,
|
||||||
|
|
||||||
if (id->driver_info & BTUSB_CSR) {
|
if (id->driver_info & BTUSB_CSR) {
|
||||||
struct usb_device *udev = data->udev;
|
struct usb_device *udev = data->udev;
|
||||||
|
u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
|
||||||
|
|
||||||
/* Old firmware would otherwise execute USB reset */
|
/* Old firmware would otherwise execute USB reset */
|
||||||
if (le16_to_cpu(udev->descriptor.bcdDevice) < 0x117)
|
if (bcdDevice < 0x117)
|
||||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||||
|
|
||||||
|
/* Fake CSR devices with broken commands */
|
||||||
|
if (bcdDevice <= 0x100)
|
||||||
|
hdev->setup = btusb_setup_csr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id->driver_info & BTUSB_SNIFFER) {
|
if (id->driver_info & BTUSB_SNIFFER) {
|
||||||
|
|
|
@ -141,22 +141,28 @@ static int vhci_create_device(struct vhci_data *data, __u8 dev_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ssize_t vhci_get_user(struct vhci_data *data,
|
static inline ssize_t vhci_get_user(struct vhci_data *data,
|
||||||
const char __user *buf, size_t count)
|
const struct iovec *iov,
|
||||||
|
unsigned long count)
|
||||||
{
|
{
|
||||||
|
size_t len = iov_length(iov, count);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
__u8 pkt_type, dev_type;
|
__u8 pkt_type, dev_type;
|
||||||
|
unsigned long i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (count < 2 || count > HCI_MAX_FRAME_SIZE)
|
if (len < 2 || len > HCI_MAX_FRAME_SIZE)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
skb = bt_skb_alloc(count, GFP_KERNEL);
|
skb = bt_skb_alloc(len, GFP_KERNEL);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (copy_from_user(skb_put(skb, count), buf, count)) {
|
for (i = 0; i < count; i++) {
|
||||||
kfree_skb(skb);
|
if (copy_from_user(skb_put(skb, iov[i].iov_len),
|
||||||
return -EFAULT;
|
iov[i].iov_base, iov[i].iov_len)) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pkt_type = *((__u8 *) skb->data);
|
pkt_type = *((__u8 *) skb->data);
|
||||||
|
@ -205,7 +211,7 @@ static inline ssize_t vhci_get_user(struct vhci_data *data,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (ret < 0) ? ret : count;
|
return (ret < 0) ? ret : len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ssize_t vhci_put_user(struct vhci_data *data,
|
static inline ssize_t vhci_put_user(struct vhci_data *data,
|
||||||
|
@ -272,12 +278,13 @@ static ssize_t vhci_read(struct file *file,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t vhci_write(struct file *file,
|
static ssize_t vhci_write(struct kiocb *iocb, const struct iovec *iov,
|
||||||
const char __user *buf, size_t count, loff_t *pos)
|
unsigned long count, loff_t pos)
|
||||||
{
|
{
|
||||||
|
struct file *file = iocb->ki_filp;
|
||||||
struct vhci_data *data = file->private_data;
|
struct vhci_data *data = file->private_data;
|
||||||
|
|
||||||
return vhci_get_user(data, buf, count);
|
return vhci_get_user(data, iov, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int vhci_poll(struct file *file, poll_table *wait)
|
static unsigned int vhci_poll(struct file *file, poll_table *wait)
|
||||||
|
@ -342,7 +349,7 @@ static int vhci_release(struct inode *inode, struct file *file)
|
||||||
static const struct file_operations vhci_fops = {
|
static const struct file_operations vhci_fops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.read = vhci_read,
|
.read = vhci_read,
|
||||||
.write = vhci_write,
|
.aio_write = vhci_write,
|
||||||
.poll = vhci_poll,
|
.poll = vhci_poll,
|
||||||
.open = vhci_open,
|
.open = vhci_open,
|
||||||
.release = vhci_release,
|
.release = vhci_release,
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
* more details.
|
* more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#ifdef __IN_PCMCIA_PACKAGE__
|
#ifdef __IN_PCMCIA_PACKAGE__
|
||||||
#include <pcmcia/k_compat.h>
|
#include <pcmcia/k_compat.h>
|
||||||
#endif
|
#endif
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
|
|
@ -1721,7 +1721,7 @@ static void at76_mac80211_tx(struct ieee80211_hw *hw,
|
||||||
* following workaround is necessary. If the TX frame is an
|
* following workaround is necessary. If the TX frame is an
|
||||||
* authentication frame extract the bssid and send the CMD_JOIN. */
|
* authentication frame extract the bssid and send the CMD_JOIN. */
|
||||||
if (mgmt->frame_control & cpu_to_le16(IEEE80211_STYPE_AUTH)) {
|
if (mgmt->frame_control & cpu_to_le16(IEEE80211_STYPE_AUTH)) {
|
||||||
if (!ether_addr_equal(priv->bssid, mgmt->bssid)) {
|
if (!ether_addr_equal_64bits(priv->bssid, mgmt->bssid)) {
|
||||||
memcpy(priv->bssid, mgmt->bssid, ETH_ALEN);
|
memcpy(priv->bssid, mgmt->bssid, ETH_ALEN);
|
||||||
ieee80211_queue_work(hw, &priv->work_join_bssid);
|
ieee80211_queue_work(hw, &priv->work_join_bssid);
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
* that and only has minimal functionality.
|
* that and only has minimal functionality.
|
||||||
*/
|
*/
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
|
|
@ -1245,7 +1245,7 @@ ath5k_check_ibss_tsf(struct ath5k_hw *ah, struct sk_buff *skb,
|
||||||
|
|
||||||
if (ieee80211_is_beacon(mgmt->frame_control) &&
|
if (ieee80211_is_beacon(mgmt->frame_control) &&
|
||||||
le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS &&
|
le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS &&
|
||||||
ether_addr_equal(mgmt->bssid, common->curbssid)) {
|
ether_addr_equal_64bits(mgmt->bssid, common->curbssid)) {
|
||||||
/*
|
/*
|
||||||
* Received an IBSS beacon with the same BSSID. Hardware *must*
|
* Received an IBSS beacon with the same BSSID. Hardware *must*
|
||||||
* have updated the local TSF. We have to work around various
|
* have updated the local TSF. We have to work around various
|
||||||
|
@ -1309,7 +1309,7 @@ ath5k_update_beacon_rssi(struct ath5k_hw *ah, struct sk_buff *skb, int rssi)
|
||||||
|
|
||||||
/* only beacons from our BSSID */
|
/* only beacons from our BSSID */
|
||||||
if (!ieee80211_is_beacon(mgmt->frame_control) ||
|
if (!ieee80211_is_beacon(mgmt->frame_control) ||
|
||||||
!ether_addr_equal(mgmt->bssid, common->curbssid))
|
!ether_addr_equal_64bits(mgmt->bssid, common->curbssid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ewma_add(&ah->ah_beacon_rssi_avg, rssi);
|
ewma_add(&ah->ah_beacon_rssi_avg, rssi);
|
||||||
|
|
|
@ -383,6 +383,20 @@ void ar9002_hw_enable_async_fifo(struct ath_hw *ah)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ar9002_hw_init_hang_checks(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
if (AR_SREV_9100(ah) || AR_SREV_9160(ah)) {
|
||||||
|
ah->config.hw_hang_checks |= HW_BB_RIFS_HANG;
|
||||||
|
ah->config.hw_hang_checks |= HW_BB_DFS_HANG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AR_SREV_9280(ah))
|
||||||
|
ah->config.hw_hang_checks |= HW_BB_RX_CLEAR_STUCK_HANG;
|
||||||
|
|
||||||
|
if (AR_SREV_5416(ah) || AR_SREV_9100(ah) || AR_SREV_9160(ah))
|
||||||
|
ah->config.hw_hang_checks |= HW_MAC_HANG;
|
||||||
|
}
|
||||||
|
|
||||||
/* Sets up the AR5008/AR9001/AR9002 hardware familiy callbacks */
|
/* Sets up the AR5008/AR9001/AR9002 hardware familiy callbacks */
|
||||||
int ar9002_hw_attach_ops(struct ath_hw *ah)
|
int ar9002_hw_attach_ops(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
|
@ -395,6 +409,7 @@ int ar9002_hw_attach_ops(struct ath_hw *ah)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
priv_ops->init_mode_gain_regs = ar9002_hw_init_mode_gain_regs;
|
priv_ops->init_mode_gain_regs = ar9002_hw_init_mode_gain_regs;
|
||||||
|
priv_ops->init_hang_checks = ar9002_hw_init_hang_checks;
|
||||||
|
|
||||||
ops->config_pci_powersave = ar9002_hw_configpcipowersave;
|
ops->config_pci_powersave = ar9002_hw_configpcipowersave;
|
||||||
|
|
||||||
|
|
|
@ -326,6 +326,224 @@ static void ar9003_hw_init_cal_settings(struct ath_hw *ah)
|
||||||
ah->supp_cals = IQ_MISMATCH_CAL;
|
ah->supp_cals = IQ_MISMATCH_CAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define OFF_UPPER_LT 24
|
||||||
|
#define OFF_LOWER_LT 7
|
||||||
|
|
||||||
|
static bool ar9003_hw_dynamic_osdac_selection(struct ath_hw *ah,
|
||||||
|
bool txiqcal_done)
|
||||||
|
{
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
int ch0_done, osdac_ch0, dc_off_ch0_i1, dc_off_ch0_q1, dc_off_ch0_i2,
|
||||||
|
dc_off_ch0_q2, dc_off_ch0_i3, dc_off_ch0_q3;
|
||||||
|
int ch1_done, osdac_ch1, dc_off_ch1_i1, dc_off_ch1_q1, dc_off_ch1_i2,
|
||||||
|
dc_off_ch1_q2, dc_off_ch1_i3, dc_off_ch1_q3;
|
||||||
|
int ch2_done, osdac_ch2, dc_off_ch2_i1, dc_off_ch2_q1, dc_off_ch2_i2,
|
||||||
|
dc_off_ch2_q2, dc_off_ch2_i3, dc_off_ch2_q3;
|
||||||
|
bool status;
|
||||||
|
u32 temp, val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear offset and IQ calibration, run AGC cal.
|
||||||
|
*/
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_OFFSET_CAL);
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0,
|
||||||
|
AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL);
|
||||||
|
REG_WRITE(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
REG_READ(ah, AR_PHY_AGC_CONTROL) | AR_PHY_AGC_CONTROL_CAL);
|
||||||
|
|
||||||
|
status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_CAL,
|
||||||
|
0, AH_WAIT_TIMEOUT);
|
||||||
|
if (!status) {
|
||||||
|
ath_dbg(common, CALIBRATE,
|
||||||
|
"AGC cal without offset cal failed to complete in 1ms");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allow only offset calibration and disable the others
|
||||||
|
* (Carrier Leak calibration, TX Filter calibration and
|
||||||
|
* Peak Detector offset calibration).
|
||||||
|
*/
|
||||||
|
REG_SET_BIT(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_OFFSET_CAL);
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL,
|
||||||
|
AR_PHY_CL_CAL_ENABLE);
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_FLTR_CAL);
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_PKDET_CAL);
|
||||||
|
|
||||||
|
ch0_done = 0;
|
||||||
|
ch1_done = 0;
|
||||||
|
ch2_done = 0;
|
||||||
|
|
||||||
|
while ((ch0_done == 0) || (ch1_done == 0) || (ch2_done == 0)) {
|
||||||
|
osdac_ch0 = (REG_READ(ah, AR_PHY_65NM_CH0_BB1) >> 30) & 0x3;
|
||||||
|
osdac_ch1 = (REG_READ(ah, AR_PHY_65NM_CH1_BB1) >> 30) & 0x3;
|
||||||
|
osdac_ch2 = (REG_READ(ah, AR_PHY_65NM_CH2_BB1) >> 30) & 0x3;
|
||||||
|
|
||||||
|
REG_SET_BIT(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
|
||||||
|
|
||||||
|
REG_WRITE(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
REG_READ(ah, AR_PHY_AGC_CONTROL) | AR_PHY_AGC_CONTROL_CAL);
|
||||||
|
|
||||||
|
status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_CAL,
|
||||||
|
0, AH_WAIT_TIMEOUT);
|
||||||
|
if (!status) {
|
||||||
|
ath_dbg(common, CALIBRATE,
|
||||||
|
"DC offset cal failed to complete in 1ms");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* High gain.
|
||||||
|
*/
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH0_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH0_BB3) & 0xfffffcff) | (1 << 8)));
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH1_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH1_BB3) & 0xfffffcff) | (1 << 8)));
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH2_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH2_BB3) & 0xfffffcff) | (1 << 8)));
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH0_BB3);
|
||||||
|
dc_off_ch0_i1 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch0_q1 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH1_BB3);
|
||||||
|
dc_off_ch1_i1 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch1_q1 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH2_BB3);
|
||||||
|
dc_off_ch2_i1 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch2_q1 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Low gain.
|
||||||
|
*/
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH0_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH0_BB3) & 0xfffffcff) | (2 << 8)));
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH1_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH1_BB3) & 0xfffffcff) | (2 << 8)));
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH2_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH2_BB3) & 0xfffffcff) | (2 << 8)));
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH0_BB3);
|
||||||
|
dc_off_ch0_i2 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch0_q2 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH1_BB3);
|
||||||
|
dc_off_ch1_i2 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch1_q2 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH2_BB3);
|
||||||
|
dc_off_ch2_i2 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch2_q2 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Loopback.
|
||||||
|
*/
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH0_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH0_BB3) & 0xfffffcff) | (3 << 8)));
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH1_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH1_BB3) & 0xfffffcff) | (3 << 8)));
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH2_BB3,
|
||||||
|
((REG_READ(ah, AR_PHY_65NM_CH2_BB3) & 0xfffffcff) | (3 << 8)));
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH0_BB3);
|
||||||
|
dc_off_ch0_i3 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch0_q3 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH1_BB3);
|
||||||
|
dc_off_ch1_i3 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch1_q3 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
temp = REG_READ(ah, AR_PHY_65NM_CH2_BB3);
|
||||||
|
dc_off_ch2_i3 = (temp >> 26) & 0x1f;
|
||||||
|
dc_off_ch2_q3 = (temp >> 21) & 0x1f;
|
||||||
|
|
||||||
|
if ((dc_off_ch0_i1 > OFF_UPPER_LT) || (dc_off_ch0_i1 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch0_i2 > OFF_UPPER_LT) || (dc_off_ch0_i2 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch0_i3 > OFF_UPPER_LT) || (dc_off_ch0_i3 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch0_q1 > OFF_UPPER_LT) || (dc_off_ch0_q1 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch0_q2 > OFF_UPPER_LT) || (dc_off_ch0_q2 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch0_q3 > OFF_UPPER_LT) || (dc_off_ch0_q3 < OFF_LOWER_LT)) {
|
||||||
|
if (osdac_ch0 == 3) {
|
||||||
|
ch0_done = 1;
|
||||||
|
} else {
|
||||||
|
osdac_ch0++;
|
||||||
|
|
||||||
|
val = REG_READ(ah, AR_PHY_65NM_CH0_BB1) & 0x3fffffff;
|
||||||
|
val |= (osdac_ch0 << 30);
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH0_BB1, val);
|
||||||
|
|
||||||
|
ch0_done = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ch0_done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((dc_off_ch1_i1 > OFF_UPPER_LT) || (dc_off_ch1_i1 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch1_i2 > OFF_UPPER_LT) || (dc_off_ch1_i2 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch1_i3 > OFF_UPPER_LT) || (dc_off_ch1_i3 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch1_q1 > OFF_UPPER_LT) || (dc_off_ch1_q1 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch1_q2 > OFF_UPPER_LT) || (dc_off_ch1_q2 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch1_q3 > OFF_UPPER_LT) || (dc_off_ch1_q3 < OFF_LOWER_LT)) {
|
||||||
|
if (osdac_ch1 == 3) {
|
||||||
|
ch1_done = 1;
|
||||||
|
} else {
|
||||||
|
osdac_ch1++;
|
||||||
|
|
||||||
|
val = REG_READ(ah, AR_PHY_65NM_CH1_BB1) & 0x3fffffff;
|
||||||
|
val |= (osdac_ch1 << 30);
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH1_BB1, val);
|
||||||
|
|
||||||
|
ch1_done = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ch1_done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((dc_off_ch2_i1 > OFF_UPPER_LT) || (dc_off_ch2_i1 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch2_i2 > OFF_UPPER_LT) || (dc_off_ch2_i2 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch2_i3 > OFF_UPPER_LT) || (dc_off_ch2_i3 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch2_q1 > OFF_UPPER_LT) || (dc_off_ch2_q1 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch2_q2 > OFF_UPPER_LT) || (dc_off_ch2_q2 < OFF_LOWER_LT) ||
|
||||||
|
(dc_off_ch2_q3 > OFF_UPPER_LT) || (dc_off_ch2_q3 < OFF_LOWER_LT)) {
|
||||||
|
if (osdac_ch2 == 3) {
|
||||||
|
ch2_done = 1;
|
||||||
|
} else {
|
||||||
|
osdac_ch2++;
|
||||||
|
|
||||||
|
val = REG_READ(ah, AR_PHY_65NM_CH2_BB1) & 0x3fffffff;
|
||||||
|
val |= (osdac_ch2 << 30);
|
||||||
|
REG_WRITE(ah, AR_PHY_65NM_CH2_BB1, val);
|
||||||
|
|
||||||
|
ch2_done = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ch2_done = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
|
||||||
|
AR_PHY_AGC_CONTROL_OFFSET_CAL);
|
||||||
|
REG_SET_BIT(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't need to check txiqcal_done here since it is always
|
||||||
|
* set for AR9550.
|
||||||
|
*/
|
||||||
|
REG_SET_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0,
|
||||||
|
AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* solve 4x4 linear equation used in loopback iq cal.
|
* solve 4x4 linear equation used in loopback iq cal.
|
||||||
*/
|
*/
|
||||||
|
@ -1271,6 +1489,11 @@ static bool ar9003_hw_init_cal_soc(struct ath_hw *ah,
|
||||||
REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
|
REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (AR_SREV_9550(ah) && IS_CHAN_2GHZ(chan)) {
|
||||||
|
if (!ar9003_hw_dynamic_osdac_selection(ah, txiqcal_done))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
skip_tx_iqcal:
|
skip_tx_iqcal:
|
||||||
if (run_agc_cal || !(ah->ah_flags & AH_FASTCC)) {
|
if (run_agc_cal || !(ah->ah_flags & AH_FASTCC)) {
|
||||||
if (AR_SREV_9330_11(ah))
|
if (AR_SREV_9330_11(ah))
|
||||||
|
|
|
@ -3598,7 +3598,7 @@ static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
|
||||||
if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
|
if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
|
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
|
||||||
AR_SWITCH_TABLE_COM_AR9462_ALL, value);
|
AR_SWITCH_TABLE_COM_AR9462_ALL, value);
|
||||||
} else if (AR_SREV_9550(ah)) {
|
} else if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
|
||||||
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
|
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
|
||||||
AR_SWITCH_TABLE_COM_AR9550_ALL, value);
|
AR_SWITCH_TABLE_COM_AR9550_ALL, value);
|
||||||
} else
|
} else
|
||||||
|
@ -3975,7 +3975,7 @@ static void ar9003_hw_apply_tuning_caps(struct ath_hw *ah)
|
||||||
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
|
||||||
u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0];
|
u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0];
|
||||||
|
|
||||||
if (AR_SREV_9340(ah))
|
if (AR_SREV_9340(ah) || AR_SREV_9531(ah))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (eep->baseEepHeader.featureEnable & 0x40) {
|
if (eep->baseEepHeader.featureEnable & 0x40) {
|
||||||
|
@ -4030,7 +4030,10 @@ static void ar9003_hw_xpa_timing_control_apply(struct ath_hw *ah, bool is2ghz)
|
||||||
if (!(eep->baseEepHeader.featureEnable & 0x80))
|
if (!(eep->baseEepHeader.featureEnable & 0x80))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!AR_SREV_9300(ah) && !AR_SREV_9340(ah) && !AR_SREV_9580(ah))
|
if (!AR_SREV_9300(ah) &&
|
||||||
|
!AR_SREV_9340(ah) &&
|
||||||
|
!AR_SREV_9580(ah) &&
|
||||||
|
!AR_SREV_9531(ah))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
xpa_ctl = ar9003_modal_header(ah, is2ghz)->txFrameToXpaOn;
|
xpa_ctl = ar9003_modal_header(ah, is2ghz)->txFrameToXpaOn;
|
||||||
|
@ -4163,7 +4166,7 @@ static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
|
||||||
ar9003_hw_xlna_bias_strength_apply(ah, is2ghz);
|
ar9003_hw_xlna_bias_strength_apply(ah, is2ghz);
|
||||||
ar9003_hw_atten_apply(ah, chan);
|
ar9003_hw_atten_apply(ah, chan);
|
||||||
ar9003_hw_quick_drop_apply(ah, chan->channel);
|
ar9003_hw_quick_drop_apply(ah, chan->channel);
|
||||||
if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah))
|
if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) && !AR_SREV_9531(ah))
|
||||||
ar9003_hw_internal_regulator_apply(ah);
|
ar9003_hw_internal_regulator_apply(ah);
|
||||||
ar9003_hw_apply_tuning_caps(ah);
|
ar9003_hw_apply_tuning_caps(ah);
|
||||||
ar9003_hw_apply_minccapwr_thresh(ah, chan);
|
ar9003_hw_apply_minccapwr_thresh(ah, chan);
|
||||||
|
@ -4788,7 +4791,7 @@ static void ar9003_hw_power_control_override(struct ath_hw *ah,
|
||||||
}
|
}
|
||||||
|
|
||||||
tempslope:
|
tempslope:
|
||||||
if (AR_SREV_9550(ah)) {
|
if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
|
||||||
/*
|
/*
|
||||||
* AR955x has tempSlope register for each chain.
|
* AR955x has tempSlope register for each chain.
|
||||||
* Check whether temp_compensation feature is enabled or not.
|
* Check whether temp_compensation feature is enabled or not.
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "ar9462_2p1_initvals.h"
|
#include "ar9462_2p1_initvals.h"
|
||||||
#include "ar9565_1p0_initvals.h"
|
#include "ar9565_1p0_initvals.h"
|
||||||
#include "ar9565_1p1_initvals.h"
|
#include "ar9565_1p1_initvals.h"
|
||||||
|
#include "ar953x_initvals.h"
|
||||||
|
|
||||||
/* General hardware code for the AR9003 hadware family */
|
/* General hardware code for the AR9003 hadware family */
|
||||||
|
|
||||||
|
@ -308,6 +309,31 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
|
||||||
/* Fast clock modal settings */
|
/* Fast clock modal settings */
|
||||||
INIT_INI_ARRAY(&ah->iniModesFastClock,
|
INIT_INI_ARRAY(&ah->iniModesFastClock,
|
||||||
ar955x_1p0_modes_fast_clock);
|
ar955x_1p0_modes_fast_clock);
|
||||||
|
} else if (AR_SREV_9531(ah)) {
|
||||||
|
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
|
||||||
|
qca953x_1p0_mac_core);
|
||||||
|
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
|
||||||
|
qca953x_1p0_mac_postamble);
|
||||||
|
INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
|
||||||
|
qca953x_1p0_baseband_core);
|
||||||
|
INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
|
||||||
|
qca953x_1p0_baseband_postamble);
|
||||||
|
INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
|
||||||
|
qca953x_1p0_radio_core);
|
||||||
|
INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
|
||||||
|
qca953x_1p0_radio_postamble);
|
||||||
|
INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
|
||||||
|
qca953x_1p0_soc_preamble);
|
||||||
|
INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
|
||||||
|
qca953x_1p0_soc_postamble);
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||||
|
qca953x_1p0_common_wo_xlna_rx_gain_table);
|
||||||
|
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
||||||
|
qca953x_1p0_common_wo_xlna_rx_gain_bounds);
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
|
qca953x_1p0_modes_no_xpa_tx_gain_table);
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesFastClock,
|
||||||
|
qca953x_1p0_modes_fast_clock);
|
||||||
} else if (AR_SREV_9580(ah)) {
|
} else if (AR_SREV_9580(ah)) {
|
||||||
/* mac */
|
/* mac */
|
||||||
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
|
INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
|
||||||
|
@ -485,6 +511,9 @@ static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
|
||||||
else if (AR_SREV_9550(ah))
|
else if (AR_SREV_9550(ah))
|
||||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
ar955x_1p0_modes_xpa_tx_gain_table);
|
ar955x_1p0_modes_xpa_tx_gain_table);
|
||||||
|
else if (AR_SREV_9531(ah))
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
|
qca953x_1p0_modes_xpa_tx_gain_table);
|
||||||
else if (AR_SREV_9580(ah))
|
else if (AR_SREV_9580(ah))
|
||||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
ar9580_1p0_lowest_ob_db_tx_gain_table);
|
ar9580_1p0_lowest_ob_db_tx_gain_table);
|
||||||
|
@ -525,7 +554,14 @@ static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
|
||||||
else if (AR_SREV_9550(ah))
|
else if (AR_SREV_9550(ah))
|
||||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
ar955x_1p0_modes_no_xpa_tx_gain_table);
|
ar955x_1p0_modes_no_xpa_tx_gain_table);
|
||||||
else if (AR_SREV_9462_21(ah))
|
else if (AR_SREV_9531(ah)) {
|
||||||
|
if (AR_SREV_9531_11(ah))
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
|
qca953x_1p1_modes_no_xpa_tx_gain_table);
|
||||||
|
else
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
|
qca953x_1p0_modes_no_xpa_tx_gain_table);
|
||||||
|
} else if (AR_SREV_9462_21(ah))
|
||||||
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
INIT_INI_ARRAY(&ah->iniModesTxGain,
|
||||||
ar9462_2p1_modes_high_ob_db_tx_gain);
|
ar9462_2p1_modes_high_ob_db_tx_gain);
|
||||||
else if (AR_SREV_9462_20(ah))
|
else if (AR_SREV_9462_20(ah))
|
||||||
|
@ -699,6 +735,11 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
|
||||||
ar955x_1p0_common_rx_gain_table);
|
ar955x_1p0_common_rx_gain_table);
|
||||||
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
||||||
ar955x_1p0_common_rx_gain_bounds);
|
ar955x_1p0_common_rx_gain_bounds);
|
||||||
|
} else if (AR_SREV_9531(ah)) {
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||||
|
qca953x_1p0_common_rx_gain_table);
|
||||||
|
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
||||||
|
qca953x_1p0_common_rx_gain_bounds);
|
||||||
} else if (AR_SREV_9580(ah))
|
} else if (AR_SREV_9580(ah))
|
||||||
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||||
ar9580_1p0_rx_gain_table);
|
ar9580_1p0_rx_gain_table);
|
||||||
|
@ -744,6 +785,11 @@ static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
|
||||||
ar955x_1p0_common_wo_xlna_rx_gain_table);
|
ar955x_1p0_common_wo_xlna_rx_gain_table);
|
||||||
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
||||||
ar955x_1p0_common_wo_xlna_rx_gain_bounds);
|
ar955x_1p0_common_wo_xlna_rx_gain_bounds);
|
||||||
|
} else if (AR_SREV_9531(ah)) {
|
||||||
|
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||||
|
qca953x_1p0_common_wo_xlna_rx_gain_table);
|
||||||
|
INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
|
||||||
|
qca953x_1p0_common_wo_xlna_rx_gain_bounds);
|
||||||
} else if (AR_SREV_9580(ah))
|
} else if (AR_SREV_9580(ah))
|
||||||
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
INIT_INI_ARRAY(&ah->iniModesRxGain,
|
||||||
ar9580_1p0_wo_xlna_rx_gain_table);
|
ar9580_1p0_wo_xlna_rx_gain_table);
|
||||||
|
@ -872,6 +918,117 @@ static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ar9003_hw_init_hang_checks(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* All chips support detection of BB/MAC hangs.
|
||||||
|
*/
|
||||||
|
ah->config.hw_hang_checks |= HW_BB_WATCHDOG;
|
||||||
|
ah->config.hw_hang_checks |= HW_MAC_HANG;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is not required for AR9580 1.0
|
||||||
|
*/
|
||||||
|
if (AR_SREV_9300_22(ah))
|
||||||
|
ah->config.hw_hang_checks |= HW_PHYRESTART_CLC_WAR;
|
||||||
|
|
||||||
|
if (AR_SREV_9330(ah))
|
||||||
|
ah->bb_watchdog_timeout_ms = 85;
|
||||||
|
else
|
||||||
|
ah->bb_watchdog_timeout_ms = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MAC HW hang check
|
||||||
|
* =================
|
||||||
|
*
|
||||||
|
* Signature: dcu_chain_state is 0x6 and dcu_complete_state is 0x1.
|
||||||
|
*
|
||||||
|
* The state of each DCU chain (mapped to TX queues) is available from these
|
||||||
|
* DMA debug registers:
|
||||||
|
*
|
||||||
|
* Chain 0 state : Bits 4:0 of AR_DMADBG_4
|
||||||
|
* Chain 1 state : Bits 9:5 of AR_DMADBG_4
|
||||||
|
* Chain 2 state : Bits 14:10 of AR_DMADBG_4
|
||||||
|
* Chain 3 state : Bits 19:15 of AR_DMADBG_4
|
||||||
|
* Chain 4 state : Bits 24:20 of AR_DMADBG_4
|
||||||
|
* Chain 5 state : Bits 29:25 of AR_DMADBG_4
|
||||||
|
* Chain 6 state : Bits 4:0 of AR_DMADBG_5
|
||||||
|
* Chain 7 state : Bits 9:5 of AR_DMADBG_5
|
||||||
|
* Chain 8 state : Bits 14:10 of AR_DMADBG_5
|
||||||
|
* Chain 9 state : Bits 19:15 of AR_DMADBG_5
|
||||||
|
*
|
||||||
|
* The DCU chain state "0x6" means "WAIT_FRDONE" - wait for TX frame to be done.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NUM_STATUS_READS 50
|
||||||
|
|
||||||
|
static bool ath9k_hw_verify_hang(struct ath_hw *ah, unsigned int queue)
|
||||||
|
{
|
||||||
|
u32 dma_dbg_chain, dma_dbg_complete;
|
||||||
|
u8 dcu_chain_state, dcu_complete_state;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_STATUS_READS; i++) {
|
||||||
|
if (queue < 6)
|
||||||
|
dma_dbg_chain = REG_READ(ah, AR_DMADBG_4);
|
||||||
|
else
|
||||||
|
dma_dbg_chain = REG_READ(ah, AR_DMADBG_5);
|
||||||
|
|
||||||
|
dma_dbg_complete = REG_READ(ah, AR_DMADBG_6);
|
||||||
|
|
||||||
|
dcu_chain_state = (dma_dbg_chain >> (5 * queue)) & 0x1f;
|
||||||
|
dcu_complete_state = dma_dbg_complete & 0x3;
|
||||||
|
|
||||||
|
if ((dcu_chain_state != 0x6) || (dcu_complete_state != 0x1))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ath_dbg(ath9k_hw_common(ah), RESET,
|
||||||
|
"MAC Hang signature found for queue: %d\n", queue);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ar9003_hw_detect_mac_hang(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
u32 dma_dbg_4, dma_dbg_5, dma_dbg_6, chk_dbg;
|
||||||
|
u8 dcu_chain_state, dcu_complete_state;
|
||||||
|
bool dcu_wait_frdone = false;
|
||||||
|
unsigned long chk_dcu = 0;
|
||||||
|
unsigned int i = 0;
|
||||||
|
|
||||||
|
dma_dbg_4 = REG_READ(ah, AR_DMADBG_4);
|
||||||
|
dma_dbg_5 = REG_READ(ah, AR_DMADBG_5);
|
||||||
|
dma_dbg_6 = REG_READ(ah, AR_DMADBG_6);
|
||||||
|
|
||||||
|
dcu_complete_state = dma_dbg_6 & 0x3;
|
||||||
|
if (dcu_complete_state != 0x1)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
|
||||||
|
if (i < 6)
|
||||||
|
chk_dbg = dma_dbg_4;
|
||||||
|
else
|
||||||
|
chk_dbg = dma_dbg_5;
|
||||||
|
|
||||||
|
dcu_chain_state = (chk_dbg >> (5 * i)) & 0x1f;
|
||||||
|
if (dcu_chain_state == 0x6) {
|
||||||
|
dcu_wait_frdone = true;
|
||||||
|
chk_dcu |= BIT(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((dcu_complete_state == 0x1) && dcu_wait_frdone) {
|
||||||
|
for_each_set_bit(i, &chk_dcu, ATH9K_NUM_TX_QUEUES) {
|
||||||
|
if (ath9k_hw_verify_hang(ah, i))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Sets up the AR9003 hardware familiy callbacks */
|
/* Sets up the AR9003 hardware familiy callbacks */
|
||||||
void ar9003_hw_attach_ops(struct ath_hw *ah)
|
void ar9003_hw_attach_ops(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
|
@ -880,6 +1037,8 @@ void ar9003_hw_attach_ops(struct ath_hw *ah)
|
||||||
|
|
||||||
ar9003_hw_init_mode_regs(ah);
|
ar9003_hw_init_mode_regs(ah);
|
||||||
priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
|
priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
|
||||||
|
priv_ops->init_hang_checks = ar9003_hw_init_hang_checks;
|
||||||
|
priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang;
|
||||||
|
|
||||||
ops->config_pci_powersave = ar9003_hw_configpcipowersave;
|
ops->config_pci_powersave = ar9003_hw_configpcipowersave;
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||||
} else {
|
} else {
|
||||||
channelSel = CHANSEL_2G(freq) >> 1;
|
channelSel = CHANSEL_2G(freq) >> 1;
|
||||||
}
|
}
|
||||||
} else if (AR_SREV_9550(ah)) {
|
} else if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
|
||||||
if (ah->is_clk_25mhz)
|
if (ah->is_clk_25mhz)
|
||||||
div = 75;
|
div = 75;
|
||||||
else
|
else
|
||||||
|
@ -118,7 +118,7 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||||
/* Set to 2G mode */
|
/* Set to 2G mode */
|
||||||
bMode = 1;
|
bMode = 1;
|
||||||
} else {
|
} else {
|
||||||
if ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) &&
|
if ((AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) &&
|
||||||
ah->is_clk_25mhz) {
|
ah->is_clk_25mhz) {
|
||||||
channelSel = freq / 75;
|
channelSel = freq / 75;
|
||||||
chan_frac = ((freq % 75) * 0x20000) / 75;
|
chan_frac = ((freq % 75) * 0x20000) / 75;
|
||||||
|
@ -810,10 +810,12 @@ static int ar9003_hw_process_ini(struct ath_hw *ah,
|
||||||
/*
|
/*
|
||||||
* TXGAIN initvals.
|
* TXGAIN initvals.
|
||||||
*/
|
*/
|
||||||
if (AR_SREV_9550(ah)) {
|
if (AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
|
||||||
int modes_txgain_index;
|
int modes_txgain_index = 1;
|
||||||
|
|
||||||
|
if (AR_SREV_9550(ah))
|
||||||
|
modes_txgain_index = ar9550_hw_get_modes_txgain_index(ah, chan);
|
||||||
|
|
||||||
modes_txgain_index = ar9550_hw_get_modes_txgain_index(ah, chan);
|
|
||||||
if (modes_txgain_index < 0)
|
if (modes_txgain_index < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -1814,6 +1816,68 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
|
||||||
memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs));
|
memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Baseband Watchdog signatures:
|
||||||
|
*
|
||||||
|
* 0x04000539: BB hang when operating in HT40 DFS Channel.
|
||||||
|
* Full chip reset is not required, but a recovery
|
||||||
|
* mechanism is needed.
|
||||||
|
*
|
||||||
|
* 0x1300000a: Related to CAC deafness.
|
||||||
|
* Chip reset is not required.
|
||||||
|
*
|
||||||
|
* 0x0400000a: Related to CAC deafness.
|
||||||
|
* Full chip reset is required.
|
||||||
|
*
|
||||||
|
* 0x04000b09: RX state machine gets into an illegal state
|
||||||
|
* when a packet with unsupported rate is received.
|
||||||
|
* Full chip reset is required and PHY_RESTART has
|
||||||
|
* to be disabled.
|
||||||
|
*
|
||||||
|
* 0x04000409: Packet stuck on receive.
|
||||||
|
* Full chip reset is required for all chips except AR9340.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ar9003_hw_bb_watchdog_check(): Returns true if a chip reset is required.
|
||||||
|
*/
|
||||||
|
bool ar9003_hw_bb_watchdog_check(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
switch(ah->bb_watchdog_last_status) {
|
||||||
|
case 0x04000539:
|
||||||
|
val = REG_READ(ah, AR_PHY_RADAR_0);
|
||||||
|
val &= (~AR_PHY_RADAR_0_FIRPWR);
|
||||||
|
val |= SM(0x7f, AR_PHY_RADAR_0_FIRPWR);
|
||||||
|
REG_WRITE(ah, AR_PHY_RADAR_0, val);
|
||||||
|
udelay(1);
|
||||||
|
val = REG_READ(ah, AR_PHY_RADAR_0);
|
||||||
|
val &= ~AR_PHY_RADAR_0_FIRPWR;
|
||||||
|
val |= SM(AR9300_DFS_FIRPWR, AR_PHY_RADAR_0_FIRPWR);
|
||||||
|
REG_WRITE(ah, AR_PHY_RADAR_0, val);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
case 0x1300000a:
|
||||||
|
return false;
|
||||||
|
case 0x0400000a:
|
||||||
|
case 0x04000b09:
|
||||||
|
return true;
|
||||||
|
case 0x04000409:
|
||||||
|
if (AR_SREV_9340(ah) || AR_SREV_9531(ah))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* For any other unknown signatures, do a
|
||||||
|
* full chip reset.
|
||||||
|
*/
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ar9003_hw_bb_watchdog_check);
|
||||||
|
|
||||||
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah)
|
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
@ -1930,6 +1994,7 @@ EXPORT_SYMBOL(ar9003_hw_bb_watchdog_dbg_info);
|
||||||
|
|
||||||
void ar9003_hw_disable_phy_restart(struct ath_hw *ah)
|
void ar9003_hw_disable_phy_restart(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
|
u8 result;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
/* While receiving unsupported rate frame rx state machine
|
/* While receiving unsupported rate frame rx state machine
|
||||||
|
@ -1937,15 +2002,13 @@ void ar9003_hw_disable_phy_restart(struct ath_hw *ah)
|
||||||
* state, BB would go hang. If RXSM is in 0xb state after
|
* state, BB would go hang. If RXSM is in 0xb state after
|
||||||
* first bb panic, ensure to disable the phy_restart.
|
* first bb panic, ensure to disable the phy_restart.
|
||||||
*/
|
*/
|
||||||
if (!((MS(ah->bb_watchdog_last_status,
|
result = MS(ah->bb_watchdog_last_status, AR_PHY_WATCHDOG_RX_OFDM_SM);
|
||||||
AR_PHY_WATCHDOG_RX_OFDM_SM) == 0xb) ||
|
|
||||||
ah->bb_hang_rx_ofdm))
|
|
||||||
return;
|
|
||||||
|
|
||||||
ah->bb_hang_rx_ofdm = true;
|
if ((result == 0xb) || ah->bb_hang_rx_ofdm) {
|
||||||
val = REG_READ(ah, AR_PHY_RESTART);
|
ah->bb_hang_rx_ofdm = true;
|
||||||
val &= ~AR_PHY_RESTART_ENA;
|
val = REG_READ(ah, AR_PHY_RESTART);
|
||||||
|
val &= ~AR_PHY_RESTART_ENA;
|
||||||
REG_WRITE(ah, AR_PHY_RESTART, val);
|
REG_WRITE(ah, AR_PHY_RESTART, val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ar9003_hw_disable_phy_restart);
|
EXPORT_SYMBOL(ar9003_hw_disable_phy_restart);
|
||||||
|
|
|
@ -338,9 +338,8 @@
|
||||||
#define AR_PHY_CCA_NOM_VAL_9300_5GHZ -115
|
#define AR_PHY_CCA_NOM_VAL_9300_5GHZ -115
|
||||||
#define AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ -125
|
#define AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ -125
|
||||||
#define AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ -125
|
#define AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ -125
|
||||||
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ -95
|
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ -60
|
||||||
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ -100
|
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ -60
|
||||||
|
|
||||||
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_2GHZ -95
|
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_2GHZ -95
|
||||||
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_5GHZ -100
|
#define AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_5GHZ -100
|
||||||
|
|
||||||
|
@ -670,6 +669,16 @@
|
||||||
#define AR_PHY_65NM_CH1_RXTX4 0x1650c
|
#define AR_PHY_65NM_CH1_RXTX4 0x1650c
|
||||||
#define AR_PHY_65NM_CH2_RXTX4 0x1690c
|
#define AR_PHY_65NM_CH2_RXTX4 0x1690c
|
||||||
|
|
||||||
|
#define AR_PHY_65NM_CH0_BB1 0x16140
|
||||||
|
#define AR_PHY_65NM_CH0_BB2 0x16144
|
||||||
|
#define AR_PHY_65NM_CH0_BB3 0x16148
|
||||||
|
#define AR_PHY_65NM_CH1_BB1 0x16540
|
||||||
|
#define AR_PHY_65NM_CH1_BB2 0x16544
|
||||||
|
#define AR_PHY_65NM_CH1_BB3 0x16548
|
||||||
|
#define AR_PHY_65NM_CH2_BB1 0x16940
|
||||||
|
#define AR_PHY_65NM_CH2_BB2 0x16944
|
||||||
|
#define AR_PHY_65NM_CH2_BB3 0x16948
|
||||||
|
|
||||||
#define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3 0x00780000
|
#define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3 0x00780000
|
||||||
#define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3_S 19
|
#define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3_S 19
|
||||||
#define AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK 0x00000004
|
#define AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK 0x00000004
|
||||||
|
@ -1334,4 +1343,6 @@
|
||||||
#define AR_PHY_65NM_RXRF_AGC_AGC_OUT 0x00000004
|
#define AR_PHY_65NM_RXRF_AGC_AGC_OUT 0x00000004
|
||||||
#define AR_PHY_65NM_RXRF_AGC_AGC_OUT_S 2
|
#define AR_PHY_65NM_RXRF_AGC_AGC_OUT_S 2
|
||||||
|
|
||||||
|
#define AR9300_DFS_FIRPWR -28
|
||||||
|
|
||||||
#endif /* AR9003_PHY_H */
|
#endif /* AR9003_PHY_H */
|
||||||
|
|
|
@ -0,0 +1,718 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2011 Atheros Communications Inc.
|
||||||
|
* Copyright (c) 2011-2012 Qualcomm Atheros Inc.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INITVALS_953X_H
|
||||||
|
#define INITVALS_953X_H
|
||||||
|
|
||||||
|
#define qca953x_1p0_mac_postamble ar9300_2p2_mac_postamble
|
||||||
|
|
||||||
|
#define qca953x_1p0_soc_postamble ar9300_2p2_soc_postamble
|
||||||
|
|
||||||
|
#define qca953x_1p0_common_rx_gain_table ar9300Common_rx_gain_table_2p2
|
||||||
|
|
||||||
|
#define qca953x_1p0_common_wo_xlna_rx_gain_table ar9300Common_wo_xlna_rx_gain_table_2p2
|
||||||
|
|
||||||
|
#define qca953x_1p0_modes_fast_clock ar9300Modes_fast_clock_2p2
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_mac_core[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x00000008, 0x00000000},
|
||||||
|
{0x00000030, 0x00020085},
|
||||||
|
{0x00000034, 0x00000005},
|
||||||
|
{0x00000040, 0x00000000},
|
||||||
|
{0x00000044, 0x00000000},
|
||||||
|
{0x00000048, 0x00000008},
|
||||||
|
{0x0000004c, 0x00000010},
|
||||||
|
{0x00000050, 0x00000000},
|
||||||
|
{0x00001040, 0x002ffc0f},
|
||||||
|
{0x00001044, 0x002ffc0f},
|
||||||
|
{0x00001048, 0x002ffc0f},
|
||||||
|
{0x0000104c, 0x002ffc0f},
|
||||||
|
{0x00001050, 0x002ffc0f},
|
||||||
|
{0x00001054, 0x002ffc0f},
|
||||||
|
{0x00001058, 0x002ffc0f},
|
||||||
|
{0x0000105c, 0x002ffc0f},
|
||||||
|
{0x00001060, 0x002ffc0f},
|
||||||
|
{0x00001064, 0x002ffc0f},
|
||||||
|
{0x000010f0, 0x00000100},
|
||||||
|
{0x00001270, 0x00000000},
|
||||||
|
{0x000012b0, 0x00000000},
|
||||||
|
{0x000012f0, 0x00000000},
|
||||||
|
{0x0000143c, 0x00000000},
|
||||||
|
{0x0000147c, 0x00000000},
|
||||||
|
{0x00008000, 0x00000000},
|
||||||
|
{0x00008004, 0x00000000},
|
||||||
|
{0x00008008, 0x00000000},
|
||||||
|
{0x0000800c, 0x00000000},
|
||||||
|
{0x00008018, 0x00000000},
|
||||||
|
{0x00008020, 0x00000000},
|
||||||
|
{0x00008038, 0x00000000},
|
||||||
|
{0x0000803c, 0x00000000},
|
||||||
|
{0x00008040, 0x00000000},
|
||||||
|
{0x00008044, 0x00000000},
|
||||||
|
{0x00008048, 0x00000000},
|
||||||
|
{0x0000804c, 0xffffffff},
|
||||||
|
{0x00008054, 0x00000000},
|
||||||
|
{0x00008058, 0x00000000},
|
||||||
|
{0x0000805c, 0x000fc78f},
|
||||||
|
{0x00008060, 0x0000000f},
|
||||||
|
{0x00008064, 0x00000000},
|
||||||
|
{0x00008070, 0x00000310},
|
||||||
|
{0x00008074, 0x00000020},
|
||||||
|
{0x00008078, 0x00000000},
|
||||||
|
{0x0000809c, 0x0000000f},
|
||||||
|
{0x000080a0, 0x00000000},
|
||||||
|
{0x000080a4, 0x02ff0000},
|
||||||
|
{0x000080a8, 0x0e070605},
|
||||||
|
{0x000080ac, 0x0000000d},
|
||||||
|
{0x000080b0, 0x00000000},
|
||||||
|
{0x000080b4, 0x00000000},
|
||||||
|
{0x000080b8, 0x00000000},
|
||||||
|
{0x000080bc, 0x00000000},
|
||||||
|
{0x000080c0, 0x2a800000},
|
||||||
|
{0x000080c4, 0x06900168},
|
||||||
|
{0x000080c8, 0x13881c22},
|
||||||
|
{0x000080cc, 0x01f40000},
|
||||||
|
{0x000080d0, 0x00252500},
|
||||||
|
{0x000080d4, 0x00a00000},
|
||||||
|
{0x000080d8, 0x00400000},
|
||||||
|
{0x000080dc, 0x00000000},
|
||||||
|
{0x000080e0, 0xffffffff},
|
||||||
|
{0x000080e4, 0x0000ffff},
|
||||||
|
{0x000080e8, 0x3f3f3f3f},
|
||||||
|
{0x000080ec, 0x00000000},
|
||||||
|
{0x000080f0, 0x00000000},
|
||||||
|
{0x000080f4, 0x00000000},
|
||||||
|
{0x000080fc, 0x00020000},
|
||||||
|
{0x00008100, 0x00000000},
|
||||||
|
{0x00008108, 0x00000052},
|
||||||
|
{0x0000810c, 0x00000000},
|
||||||
|
{0x00008110, 0x00000000},
|
||||||
|
{0x00008114, 0x000007ff},
|
||||||
|
{0x00008118, 0x000000aa},
|
||||||
|
{0x0000811c, 0x00003210},
|
||||||
|
{0x00008124, 0x00000000},
|
||||||
|
{0x00008128, 0x00000000},
|
||||||
|
{0x0000812c, 0x00000000},
|
||||||
|
{0x00008130, 0x00000000},
|
||||||
|
{0x00008134, 0x00000000},
|
||||||
|
{0x00008138, 0x00000000},
|
||||||
|
{0x0000813c, 0x0000ffff},
|
||||||
|
{0x00008140, 0x000000fe},
|
||||||
|
{0x00008144, 0xffffffff},
|
||||||
|
{0x00008168, 0x00000000},
|
||||||
|
{0x0000816c, 0x00000000},
|
||||||
|
{0x000081c0, 0x00000000},
|
||||||
|
{0x000081c4, 0x33332210},
|
||||||
|
{0x000081ec, 0x00000000},
|
||||||
|
{0x000081f0, 0x00000000},
|
||||||
|
{0x000081f4, 0x00000000},
|
||||||
|
{0x000081f8, 0x00000000},
|
||||||
|
{0x000081fc, 0x00000000},
|
||||||
|
{0x00008240, 0x00100000},
|
||||||
|
{0x00008244, 0x0010f3d7},
|
||||||
|
{0x00008248, 0x00000852},
|
||||||
|
{0x0000824c, 0x0001e7ae},
|
||||||
|
{0x00008250, 0x00000000},
|
||||||
|
{0x00008254, 0x00000000},
|
||||||
|
{0x00008258, 0x00000000},
|
||||||
|
{0x0000825c, 0x40000000},
|
||||||
|
{0x00008260, 0x00080922},
|
||||||
|
{0x00008264, 0x9d400010},
|
||||||
|
{0x00008268, 0xffffffff},
|
||||||
|
{0x0000826c, 0x0000ffff},
|
||||||
|
{0x00008270, 0x00000000},
|
||||||
|
{0x00008274, 0x40000000},
|
||||||
|
{0x00008278, 0x003e4180},
|
||||||
|
{0x0000827c, 0x00000004},
|
||||||
|
{0x00008284, 0x0000002c},
|
||||||
|
{0x00008288, 0x0000002c},
|
||||||
|
{0x0000828c, 0x000000ff},
|
||||||
|
{0x00008294, 0x00000000},
|
||||||
|
{0x00008298, 0x00000000},
|
||||||
|
{0x0000829c, 0x00000000},
|
||||||
|
{0x00008300, 0x00001d40},
|
||||||
|
{0x00008314, 0x00000000},
|
||||||
|
{0x0000831c, 0x0000010d},
|
||||||
|
{0x00008328, 0x00000000},
|
||||||
|
{0x0000832c, 0x0000001f},
|
||||||
|
{0x00008330, 0x00000302},
|
||||||
|
{0x00008334, 0x00000700},
|
||||||
|
{0x00008338, 0xffff0000},
|
||||||
|
{0x0000833c, 0x02400000},
|
||||||
|
{0x00008340, 0x000107ff},
|
||||||
|
{0x00008344, 0xaa48107b},
|
||||||
|
{0x00008348, 0x008f0000},
|
||||||
|
{0x0000835c, 0x00000000},
|
||||||
|
{0x00008360, 0xffffffff},
|
||||||
|
{0x00008364, 0xffffffff},
|
||||||
|
{0x00008368, 0x00000000},
|
||||||
|
{0x00008370, 0x00000000},
|
||||||
|
{0x00008374, 0x000000ff},
|
||||||
|
{0x00008378, 0x00000000},
|
||||||
|
{0x0000837c, 0x00000000},
|
||||||
|
{0x00008380, 0xffffffff},
|
||||||
|
{0x00008384, 0xffffffff},
|
||||||
|
{0x00008390, 0xffffffff},
|
||||||
|
{0x00008394, 0xffffffff},
|
||||||
|
{0x00008398, 0x00000000},
|
||||||
|
{0x0000839c, 0x00000000},
|
||||||
|
{0x000083a0, 0x00000000},
|
||||||
|
{0x000083a4, 0x0000fa14},
|
||||||
|
{0x000083a8, 0x000f0c00},
|
||||||
|
{0x000083ac, 0x33332210},
|
||||||
|
{0x000083b0, 0x33332210},
|
||||||
|
{0x000083b4, 0x33332210},
|
||||||
|
{0x000083b8, 0x33332210},
|
||||||
|
{0x000083bc, 0x00000000},
|
||||||
|
{0x000083c0, 0x00000000},
|
||||||
|
{0x000083c4, 0x00000000},
|
||||||
|
{0x000083c8, 0x00000000},
|
||||||
|
{0x000083cc, 0x00000200},
|
||||||
|
{0x000083d0, 0x8c7901ff},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_baseband_core[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x00009800, 0xafe68e30},
|
||||||
|
{0x00009804, 0xfd14e000},
|
||||||
|
{0x00009808, 0x9c0a9f6b},
|
||||||
|
{0x0000980c, 0x04900000},
|
||||||
|
{0x00009814, 0x0280c00a},
|
||||||
|
{0x00009818, 0x00000000},
|
||||||
|
{0x0000981c, 0x00020028},
|
||||||
|
{0x00009834, 0x6400a190},
|
||||||
|
{0x00009838, 0x0108ecff},
|
||||||
|
{0x0000983c, 0x14000600},
|
||||||
|
{0x00009880, 0x201fff00},
|
||||||
|
{0x00009884, 0x00001042},
|
||||||
|
{0x000098a4, 0x00200400},
|
||||||
|
{0x000098b0, 0x32840bbe},
|
||||||
|
{0x000098bc, 0x00000002},
|
||||||
|
{0x000098d0, 0x004b6a8e},
|
||||||
|
{0x000098d4, 0x00000820},
|
||||||
|
{0x000098dc, 0x00000000},
|
||||||
|
{0x000098f0, 0x00000000},
|
||||||
|
{0x000098f4, 0x00000000},
|
||||||
|
{0x00009c04, 0xff55ff55},
|
||||||
|
{0x00009c08, 0x0320ff55},
|
||||||
|
{0x00009c0c, 0x00000000},
|
||||||
|
{0x00009c10, 0x00000000},
|
||||||
|
{0x00009c14, 0x00046384},
|
||||||
|
{0x00009c18, 0x05b6b440},
|
||||||
|
{0x00009c1c, 0x00b6b440},
|
||||||
|
{0x00009d00, 0xc080a333},
|
||||||
|
{0x00009d04, 0x40206c10},
|
||||||
|
{0x00009d08, 0x009c4060},
|
||||||
|
{0x00009d0c, 0x9883800a},
|
||||||
|
{0x00009d10, 0x01884061},
|
||||||
|
{0x00009d14, 0x00c0040b},
|
||||||
|
{0x00009d18, 0x00000000},
|
||||||
|
{0x00009e08, 0x0038230c},
|
||||||
|
{0x00009e24, 0x990bb515},
|
||||||
|
{0x00009e28, 0x0c6f0000},
|
||||||
|
{0x00009e30, 0x06336f77},
|
||||||
|
{0x00009e34, 0x6af6532f},
|
||||||
|
{0x00009e38, 0x0cc80c00},
|
||||||
|
{0x00009e40, 0x0d261820},
|
||||||
|
{0x00009e4c, 0x00001004},
|
||||||
|
{0x00009e50, 0x00ff03f1},
|
||||||
|
{0x00009fc0, 0x813e4788},
|
||||||
|
{0x00009fc4, 0x0001efb5},
|
||||||
|
{0x00009fcc, 0x40000014},
|
||||||
|
{0x00009fd0, 0x01193b91},
|
||||||
|
{0x0000a20c, 0x00000000},
|
||||||
|
{0x0000a220, 0x00000000},
|
||||||
|
{0x0000a224, 0x00000000},
|
||||||
|
{0x0000a228, 0x10002310},
|
||||||
|
{0x0000a23c, 0x00000000},
|
||||||
|
{0x0000a244, 0x0c000000},
|
||||||
|
{0x0000a248, 0x00000140},
|
||||||
|
{0x0000a2a0, 0x00000007},
|
||||||
|
{0x0000a2c0, 0x00000007},
|
||||||
|
{0x0000a2c8, 0x00000000},
|
||||||
|
{0x0000a2d4, 0x00000000},
|
||||||
|
{0x0000a2ec, 0x00000000},
|
||||||
|
{0x0000a2f0, 0x00000000},
|
||||||
|
{0x0000a2f4, 0x00000000},
|
||||||
|
{0x0000a2f8, 0x00000000},
|
||||||
|
{0x0000a344, 0x00000000},
|
||||||
|
{0x0000a34c, 0x00000000},
|
||||||
|
{0x0000a350, 0x0000a000},
|
||||||
|
{0x0000a364, 0x00000000},
|
||||||
|
{0x0000a370, 0x00000000},
|
||||||
|
{0x0000a390, 0x00000001},
|
||||||
|
{0x0000a394, 0x00000444},
|
||||||
|
{0x0000a398, 0x1f020503},
|
||||||
|
{0x0000a39c, 0x29180c03},
|
||||||
|
{0x0000a3a0, 0x9a8b6844},
|
||||||
|
{0x0000a3a4, 0x000000ff},
|
||||||
|
{0x0000a3a8, 0x6a6a6a6a},
|
||||||
|
{0x0000a3ac, 0x6a6a6a6a},
|
||||||
|
{0x0000a3b0, 0x00c8641a},
|
||||||
|
{0x0000a3b4, 0x0000001a},
|
||||||
|
{0x0000a3b8, 0x0088642a},
|
||||||
|
{0x0000a3bc, 0x000001fa},
|
||||||
|
{0x0000a3c0, 0x20202020},
|
||||||
|
{0x0000a3c4, 0x22222220},
|
||||||
|
{0x0000a3c8, 0x20200020},
|
||||||
|
{0x0000a3cc, 0x20202020},
|
||||||
|
{0x0000a3d0, 0x20202020},
|
||||||
|
{0x0000a3d4, 0x20202020},
|
||||||
|
{0x0000a3d8, 0x20202020},
|
||||||
|
{0x0000a3dc, 0x20202020},
|
||||||
|
{0x0000a3e0, 0x20202020},
|
||||||
|
{0x0000a3e4, 0x20202020},
|
||||||
|
{0x0000a3e8, 0x20202020},
|
||||||
|
{0x0000a3ec, 0x20202020},
|
||||||
|
{0x0000a3f0, 0x00000000},
|
||||||
|
{0x0000a3f4, 0x00000000},
|
||||||
|
{0x0000a3f8, 0x0c9bd380},
|
||||||
|
{0x0000a3fc, 0x000f0f01},
|
||||||
|
{0x0000a400, 0x8fa91f01},
|
||||||
|
{0x0000a404, 0x00000000},
|
||||||
|
{0x0000a408, 0x0e79e5c6},
|
||||||
|
{0x0000a40c, 0x00820820},
|
||||||
|
{0x0000a414, 0x1ce42108},
|
||||||
|
{0x0000a418, 0x2d001dce},
|
||||||
|
{0x0000a41c, 0x1ce73908},
|
||||||
|
{0x0000a420, 0x000001ce},
|
||||||
|
{0x0000a424, 0x1ce738e7},
|
||||||
|
{0x0000a428, 0x000001ce},
|
||||||
|
{0x0000a42c, 0x1ce739ce},
|
||||||
|
{0x0000a430, 0x1ce739ce},
|
||||||
|
{0x0000a434, 0x00000000},
|
||||||
|
{0x0000a438, 0x00001801},
|
||||||
|
{0x0000a43c, 0x00100000},
|
||||||
|
{0x0000a444, 0x00000000},
|
||||||
|
{0x0000a448, 0x05000080},
|
||||||
|
{0x0000a44c, 0x00000001},
|
||||||
|
{0x0000a450, 0x00010000},
|
||||||
|
{0x0000a458, 0x00000000},
|
||||||
|
{0x0000a644, 0xbfad9d74},
|
||||||
|
{0x0000a648, 0x0048060a},
|
||||||
|
{0x0000a64c, 0x00003c37},
|
||||||
|
{0x0000a670, 0x03020100},
|
||||||
|
{0x0000a674, 0x09080504},
|
||||||
|
{0x0000a678, 0x0d0c0b0a},
|
||||||
|
{0x0000a67c, 0x13121110},
|
||||||
|
{0x0000a680, 0x31301514},
|
||||||
|
{0x0000a684, 0x35343332},
|
||||||
|
{0x0000a688, 0x00000036},
|
||||||
|
{0x0000a690, 0x08000838},
|
||||||
|
{0x0000a7cc, 0x00000000},
|
||||||
|
{0x0000a7d0, 0x00000000},
|
||||||
|
{0x0000a7d4, 0x00000004},
|
||||||
|
{0x0000a7dc, 0x00000000},
|
||||||
|
{0x0000a8d0, 0x004b6a8e},
|
||||||
|
{0x0000a8d4, 0x00000820},
|
||||||
|
{0x0000a8dc, 0x00000000},
|
||||||
|
{0x0000a8f0, 0x00000000},
|
||||||
|
{0x0000a8f4, 0x00000000},
|
||||||
|
{0x0000b2d0, 0x00000080},
|
||||||
|
{0x0000b2d4, 0x00000000},
|
||||||
|
{0x0000b2ec, 0x00000000},
|
||||||
|
{0x0000b2f0, 0x00000000},
|
||||||
|
{0x0000b2f4, 0x00000000},
|
||||||
|
{0x0000b2f8, 0x00000000},
|
||||||
|
{0x0000b408, 0x0e79e5c0},
|
||||||
|
{0x0000b40c, 0x00820820},
|
||||||
|
{0x0000b420, 0x00000000},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_baseband_postamble[][5] = {
|
||||||
|
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
|
||||||
|
{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},
|
||||||
|
{0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a012e},
|
||||||
|
{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
|
||||||
|
{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
|
||||||
|
{0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
|
||||||
|
{0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c},
|
||||||
|
{0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
|
||||||
|
{0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0},
|
||||||
|
{0x00009e04, 0x001c2020, 0x001c2020, 0x001c2020, 0x001c2020},
|
||||||
|
{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
|
||||||
|
{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e},
|
||||||
|
{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},
|
||||||
|
{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||||
|
{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
|
||||||
|
{0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
|
||||||
|
{0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021},
|
||||||
|
{0x00009e3c, 0xcfa10820, 0xcfa10820, 0xcfa10822, 0xcfa10822},
|
||||||
|
{0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27},
|
||||||
|
{0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},
|
||||||
|
{0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
|
||||||
|
{0x0000a204, 0x005c0ec0, 0x005c0ec4, 0x005c0ec4, 0x005c0ec0},
|
||||||
|
{0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
|
||||||
|
{0x0000a22c, 0x07e26a2f, 0x07e26a2f, 0x01026a2f, 0x01026a2f},
|
||||||
|
{0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b},
|
||||||
|
{0x0000a234, 0x00000fff, 0x10000fff, 0x10000fff, 0x00000fff},
|
||||||
|
{0x0000a238, 0xffb01018, 0xffb01018, 0xffb01018, 0xffb01018},
|
||||||
|
{0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
|
||||||
|
{0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
|
||||||
|
{0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002},
|
||||||
|
{0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01010e0e, 0x01010e0e},
|
||||||
|
{0x0000a260, 0x0a021501, 0x0a021501, 0x3a021501, 0x3a021501},
|
||||||
|
{0x0000a264, 0x00000e0e, 0x00000e0e, 0x01000e0e, 0x01000e0e},
|
||||||
|
{0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b},
|
||||||
|
{0x0000a284, 0x00000000, 0x00000000, 0x00000010, 0x00000010},
|
||||||
|
{0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110},
|
||||||
|
{0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222},
|
||||||
|
{0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
|
||||||
|
{0x0000a2cc, 0x18c50033, 0x18c43433, 0x18c41033, 0x18c44c33},
|
||||||
|
{0x0000a2d0, 0x00041982, 0x00041982, 0x00041982, 0x00041982},
|
||||||
|
{0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b},
|
||||||
|
{0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||||
|
{0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
|
||||||
|
{0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x001c0000},
|
||||||
|
{0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||||
|
{0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
|
||||||
|
{0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce},
|
||||||
|
{0x0000b284, 0x00000000, 0x00000000, 0x00000010, 0x00000010},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_radio_core[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x00016000, 0x36db6db6},
|
||||||
|
{0x00016004, 0x6db6db40},
|
||||||
|
{0x00016008, 0x73f00000},
|
||||||
|
{0x0001600c, 0x00000000},
|
||||||
|
{0x00016040, 0x3f80fff8},
|
||||||
|
{0x0001604c, 0x000f0278},
|
||||||
|
{0x00016050, 0x8036db6c},
|
||||||
|
{0x00016054, 0x6db60000},
|
||||||
|
{0x00016080, 0x00080000},
|
||||||
|
{0x00016084, 0x0e48048c},
|
||||||
|
{0x00016088, 0x14214514},
|
||||||
|
{0x0001608c, 0x119f080a},
|
||||||
|
{0x00016090, 0x24926490},
|
||||||
|
{0x00016094, 0x00000000},
|
||||||
|
{0x000160a0, 0xc2108ffe},
|
||||||
|
{0x000160a4, 0x812fc370},
|
||||||
|
{0x000160a8, 0x423c8000},
|
||||||
|
{0x000160b4, 0x92480080},
|
||||||
|
{0x000160c0, 0x006db6d8},
|
||||||
|
{0x000160c4, 0x24b6db6c},
|
||||||
|
{0x000160c8, 0x6db6db6c},
|
||||||
|
{0x000160cc, 0x6db6fb7c},
|
||||||
|
{0x000160d0, 0x6db6da44},
|
||||||
|
{0x00016100, 0x07ff8001},
|
||||||
|
{0x00016108, 0x00080010},
|
||||||
|
{0x00016144, 0x01884080},
|
||||||
|
{0x00016148, 0x000080d8},
|
||||||
|
{0x00016280, 0x01000901},
|
||||||
|
{0x00016284, 0x15d30000},
|
||||||
|
{0x00016288, 0x00318000},
|
||||||
|
{0x0001628c, 0x50000000},
|
||||||
|
{0x00016380, 0x00000000},
|
||||||
|
{0x00016384, 0x00000000},
|
||||||
|
{0x00016388, 0x00800700},
|
||||||
|
{0x0001638c, 0x00800700},
|
||||||
|
{0x00016390, 0x00800700},
|
||||||
|
{0x00016394, 0x00000000},
|
||||||
|
{0x00016398, 0x00000000},
|
||||||
|
{0x0001639c, 0x00000000},
|
||||||
|
{0x000163a0, 0x00000001},
|
||||||
|
{0x000163a4, 0x00000001},
|
||||||
|
{0x000163a8, 0x00000000},
|
||||||
|
{0x000163ac, 0x00000000},
|
||||||
|
{0x000163b0, 0x00000000},
|
||||||
|
{0x000163b4, 0x00000000},
|
||||||
|
{0x000163b8, 0x00000000},
|
||||||
|
{0x000163bc, 0x00000000},
|
||||||
|
{0x000163c0, 0x000000a0},
|
||||||
|
{0x000163c4, 0x000c0000},
|
||||||
|
{0x000163c8, 0x14021402},
|
||||||
|
{0x000163cc, 0x00001402},
|
||||||
|
{0x000163d0, 0x00000000},
|
||||||
|
{0x000163d4, 0x00000000},
|
||||||
|
{0x00016400, 0x36db6db6},
|
||||||
|
{0x00016404, 0x6db6db40},
|
||||||
|
{0x00016408, 0x73f00000},
|
||||||
|
{0x0001640c, 0x00000000},
|
||||||
|
{0x00016440, 0x3f80fff8},
|
||||||
|
{0x0001644c, 0x000f0278},
|
||||||
|
{0x00016450, 0x8036db6c},
|
||||||
|
{0x00016454, 0x6db60000},
|
||||||
|
{0x00016500, 0x07ff8001},
|
||||||
|
{0x00016508, 0x00080010},
|
||||||
|
{0x00016544, 0x01884080},
|
||||||
|
{0x00016548, 0x000080d8},
|
||||||
|
{0x00016780, 0x00000000},
|
||||||
|
{0x00016784, 0x00000000},
|
||||||
|
{0x00016788, 0x00800700},
|
||||||
|
{0x0001678c, 0x00800700},
|
||||||
|
{0x00016790, 0x00800700},
|
||||||
|
{0x00016794, 0x00000000},
|
||||||
|
{0x00016798, 0x00000000},
|
||||||
|
{0x0001679c, 0x00000000},
|
||||||
|
{0x000167a0, 0x00000001},
|
||||||
|
{0x000167a4, 0x00000001},
|
||||||
|
{0x000167a8, 0x00000000},
|
||||||
|
{0x000167ac, 0x00000000},
|
||||||
|
{0x000167b0, 0x00000000},
|
||||||
|
{0x000167b4, 0x00000000},
|
||||||
|
{0x000167b8, 0x00000000},
|
||||||
|
{0x000167bc, 0x00000000},
|
||||||
|
{0x000167c0, 0x000000a0},
|
||||||
|
{0x000167c4, 0x000c0000},
|
||||||
|
{0x000167c8, 0x14021402},
|
||||||
|
{0x000167cc, 0x00001402},
|
||||||
|
{0x000167d0, 0x00000000},
|
||||||
|
{0x000167d4, 0x00000000},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_radio_postamble[][5] = {
|
||||||
|
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
|
||||||
|
{0x00016098, 0xd2dd5554, 0xd2dd5554, 0xc4128f5c, 0xc4128f5c},
|
||||||
|
{0x0001609c, 0x0a566f3a, 0x0a566f3a, 0x0fd08f25, 0x0fd08f25},
|
||||||
|
{0x000160ac, 0xa4647c00, 0xa4647c00, 0x24646800, 0x24646800},
|
||||||
|
{0x000160b0, 0x01885f52, 0x01885f52, 0x00fe7f46, 0x00fe7f46},
|
||||||
|
{0x00016104, 0xb7a00001, 0xb7a00001, 0xfff80005, 0xfff80005},
|
||||||
|
{0x0001610c, 0xc0000000, 0xc0000000, 0x00000000, 0x00000000},
|
||||||
|
{0x00016140, 0x10804008, 0x10804008, 0x50804000, 0x50804000},
|
||||||
|
{0x00016504, 0xb7a00001, 0xb7a00001, 0xfff80001, 0xfff80001},
|
||||||
|
{0x0001650c, 0xc0000000, 0xc0000000, 0x00000000, 0x00000000},
|
||||||
|
{0x00016540, 0x10804008, 0x10804008, 0x50804000, 0x50804000},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_soc_preamble[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x00007000, 0x00000000},
|
||||||
|
{0x00007004, 0x00000000},
|
||||||
|
{0x00007008, 0x00000000},
|
||||||
|
{0x0000700c, 0x00000000},
|
||||||
|
{0x0000701c, 0x00000000},
|
||||||
|
{0x00007020, 0x00000000},
|
||||||
|
{0x00007024, 0x00000000},
|
||||||
|
{0x00007028, 0x00000000},
|
||||||
|
{0x0000702c, 0x00000000},
|
||||||
|
{0x00007030, 0x00000000},
|
||||||
|
{0x00007034, 0x00000002},
|
||||||
|
{0x00007038, 0x000004c2},
|
||||||
|
{0x00007048, 0x00000000},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_common_rx_gain_bounds[][5] = {
|
||||||
|
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
|
||||||
|
{0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27},
|
||||||
|
{0x00009e48, 0x5030201a, 0x5030201a, 0x50302018, 0x50302018},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_common_wo_xlna_rx_gain_bounds[][5] = {
|
||||||
|
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
|
||||||
|
{0x00009e44, 0xfe321e27, 0xfe321e27, 0xfe291e27, 0xfe291e27},
|
||||||
|
{0x00009e48, 0x5030201a, 0x5030201a, 0x50302012, 0x50302012},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_modes_xpa_tx_gain_table[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x0000a2dc, 0xfffd5aaa},
|
||||||
|
{0x0000a2e0, 0xfffe9ccc},
|
||||||
|
{0x0000a2e4, 0xffffe0f0},
|
||||||
|
{0x0000a2e8, 0xfffcff00},
|
||||||
|
{0x0000a410, 0x000050da},
|
||||||
|
{0x0000a500, 0x00000000},
|
||||||
|
{0x0000a504, 0x04000002},
|
||||||
|
{0x0000a508, 0x08000004},
|
||||||
|
{0x0000a50c, 0x0c000006},
|
||||||
|
{0x0000a510, 0x0f00000a},
|
||||||
|
{0x0000a514, 0x1300000c},
|
||||||
|
{0x0000a518, 0x1700000e},
|
||||||
|
{0x0000a51c, 0x1b000064},
|
||||||
|
{0x0000a520, 0x1f000242},
|
||||||
|
{0x0000a524, 0x23000229},
|
||||||
|
{0x0000a528, 0x270002a2},
|
||||||
|
{0x0000a52c, 0x2c001203},
|
||||||
|
{0x0000a530, 0x30001803},
|
||||||
|
{0x0000a534, 0x33000881},
|
||||||
|
{0x0000a538, 0x38001809},
|
||||||
|
{0x0000a53c, 0x3a000814},
|
||||||
|
{0x0000a540, 0x3f001a0c},
|
||||||
|
{0x0000a544, 0x43001a0e},
|
||||||
|
{0x0000a548, 0x46001812},
|
||||||
|
{0x0000a54c, 0x49001884},
|
||||||
|
{0x0000a550, 0x4d001e84},
|
||||||
|
{0x0000a554, 0x50001e69},
|
||||||
|
{0x0000a558, 0x550006f4},
|
||||||
|
{0x0000a55c, 0x59000ad3},
|
||||||
|
{0x0000a560, 0x5e000ad5},
|
||||||
|
{0x0000a564, 0x61001ced},
|
||||||
|
{0x0000a568, 0x660018d4},
|
||||||
|
{0x0000a56c, 0x660018d4},
|
||||||
|
{0x0000a570, 0x660018d4},
|
||||||
|
{0x0000a574, 0x660018d4},
|
||||||
|
{0x0000a578, 0x660018d4},
|
||||||
|
{0x0000a57c, 0x660018d4},
|
||||||
|
{0x0000a600, 0x00000000},
|
||||||
|
{0x0000a604, 0x00000000},
|
||||||
|
{0x0000a608, 0x00000000},
|
||||||
|
{0x0000a60c, 0x03804000},
|
||||||
|
{0x0000a610, 0x0300ca02},
|
||||||
|
{0x0000a614, 0x00000e04},
|
||||||
|
{0x0000a618, 0x03014000},
|
||||||
|
{0x0000a61c, 0x00000000},
|
||||||
|
{0x0000a620, 0x00000000},
|
||||||
|
{0x0000a624, 0x03014000},
|
||||||
|
{0x0000a628, 0x03804c05},
|
||||||
|
{0x0000a62c, 0x0701de06},
|
||||||
|
{0x0000a630, 0x07819c07},
|
||||||
|
{0x0000a634, 0x0701dc07},
|
||||||
|
{0x0000a638, 0x0701dc07},
|
||||||
|
{0x0000a63c, 0x0701dc07},
|
||||||
|
{0x0000b2dc, 0xfffd5aaa},
|
||||||
|
{0x0000b2e0, 0xfffe9ccc},
|
||||||
|
{0x0000b2e4, 0xffffe0f0},
|
||||||
|
{0x0000b2e8, 0xfffcff00},
|
||||||
|
{0x00016044, 0x010002d4},
|
||||||
|
{0x00016048, 0x66482400},
|
||||||
|
{0x00016280, 0x01000015},
|
||||||
|
{0x00016444, 0x010002d4},
|
||||||
|
{0x00016448, 0x66482400},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p0_modes_no_xpa_tx_gain_table[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x0000a2dc, 0xffd5f552},
|
||||||
|
{0x0000a2e0, 0xffe60664},
|
||||||
|
{0x0000a2e4, 0xfff80780},
|
||||||
|
{0x0000a2e8, 0xfffff800},
|
||||||
|
{0x0000a410, 0x000050d6},
|
||||||
|
{0x0000a500, 0x00060020},
|
||||||
|
{0x0000a504, 0x04060060},
|
||||||
|
{0x0000a508, 0x080600a0},
|
||||||
|
{0x0000a50c, 0x0c068020},
|
||||||
|
{0x0000a510, 0x10068060},
|
||||||
|
{0x0000a514, 0x140680a0},
|
||||||
|
{0x0000a518, 0x18090040},
|
||||||
|
{0x0000a51c, 0x1b090080},
|
||||||
|
{0x0000a520, 0x1f0900c0},
|
||||||
|
{0x0000a524, 0x240c0041},
|
||||||
|
{0x0000a528, 0x280d0021},
|
||||||
|
{0x0000a52c, 0x2d0f0061},
|
||||||
|
{0x0000a530, 0x310f00a1},
|
||||||
|
{0x0000a534, 0x350e00a2},
|
||||||
|
{0x0000a538, 0x360e80a2},
|
||||||
|
{0x0000a53c, 0x380f00a2},
|
||||||
|
{0x0000a540, 0x3b0e00a3},
|
||||||
|
{0x0000a544, 0x3d110083},
|
||||||
|
{0x0000a548, 0x3e1100a3},
|
||||||
|
{0x0000a54c, 0x401100e3},
|
||||||
|
{0x0000a550, 0x421380e3},
|
||||||
|
{0x0000a554, 0x431780e3},
|
||||||
|
{0x0000a558, 0x461f80e3},
|
||||||
|
{0x0000a55c, 0x461f80e3},
|
||||||
|
{0x0000a560, 0x461f80e3},
|
||||||
|
{0x0000a564, 0x461f80e3},
|
||||||
|
{0x0000a568, 0x461f80e3},
|
||||||
|
{0x0000a56c, 0x461f80e3},
|
||||||
|
{0x0000a570, 0x461f80e3},
|
||||||
|
{0x0000a574, 0x461f80e3},
|
||||||
|
{0x0000a578, 0x461f80e3},
|
||||||
|
{0x0000a57c, 0x461f80e3},
|
||||||
|
{0x0000a600, 0x00000000},
|
||||||
|
{0x0000a604, 0x00000000},
|
||||||
|
{0x0000a608, 0x00000000},
|
||||||
|
{0x0000a60c, 0x00804201},
|
||||||
|
{0x0000a610, 0x01008201},
|
||||||
|
{0x0000a614, 0x0180c402},
|
||||||
|
{0x0000a618, 0x0180c603},
|
||||||
|
{0x0000a61c, 0x0180c603},
|
||||||
|
{0x0000a620, 0x01c10603},
|
||||||
|
{0x0000a624, 0x01c10704},
|
||||||
|
{0x0000a628, 0x02c18b05},
|
||||||
|
{0x0000a62c, 0x0301cc07},
|
||||||
|
{0x0000a630, 0x0301cc07},
|
||||||
|
{0x0000a634, 0x0301cc07},
|
||||||
|
{0x0000a638, 0x0301cc07},
|
||||||
|
{0x0000a63c, 0x0301cc07},
|
||||||
|
{0x0000b2dc, 0xffd5f552},
|
||||||
|
{0x0000b2e0, 0xffe60664},
|
||||||
|
{0x0000b2e4, 0xfff80780},
|
||||||
|
{0x0000b2e8, 0xfffff800},
|
||||||
|
{0x00016044, 0x049242db},
|
||||||
|
{0x00016048, 0x6c927a70},
|
||||||
|
{0x00016444, 0x049242db},
|
||||||
|
{0x00016448, 0x6c927a70},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const u32 qca953x_1p1_modes_no_xpa_tx_gain_table[][2] = {
|
||||||
|
/* Addr allmodes */
|
||||||
|
{0x0000a2dc, 0xffd5f552},
|
||||||
|
{0x0000a2e0, 0xffe60664},
|
||||||
|
{0x0000a2e4, 0xfff80780},
|
||||||
|
{0x0000a2e8, 0xfffff800},
|
||||||
|
{0x0000a410, 0x000050de},
|
||||||
|
{0x0000a500, 0x00000061},
|
||||||
|
{0x0000a504, 0x04000063},
|
||||||
|
{0x0000a508, 0x08000065},
|
||||||
|
{0x0000a50c, 0x0c000261},
|
||||||
|
{0x0000a510, 0x10000263},
|
||||||
|
{0x0000a514, 0x14000265},
|
||||||
|
{0x0000a518, 0x18000482},
|
||||||
|
{0x0000a51c, 0x1b000484},
|
||||||
|
{0x0000a520, 0x1f000486},
|
||||||
|
{0x0000a524, 0x240008c2},
|
||||||
|
{0x0000a528, 0x28000cc1},
|
||||||
|
{0x0000a52c, 0x2d000ce3},
|
||||||
|
{0x0000a530, 0x31000ce5},
|
||||||
|
{0x0000a534, 0x350010e5},
|
||||||
|
{0x0000a538, 0x360012e5},
|
||||||
|
{0x0000a53c, 0x380014e5},
|
||||||
|
{0x0000a540, 0x3b0018e5},
|
||||||
|
{0x0000a544, 0x3d001d04},
|
||||||
|
{0x0000a548, 0x3e001d05},
|
||||||
|
{0x0000a54c, 0x40001d07},
|
||||||
|
{0x0000a550, 0x42001f27},
|
||||||
|
{0x0000a554, 0x43001f67},
|
||||||
|
{0x0000a558, 0x46001fe7},
|
||||||
|
{0x0000a55c, 0x47001f2b},
|
||||||
|
{0x0000a560, 0x49001f0d},
|
||||||
|
{0x0000a564, 0x4b001ed2},
|
||||||
|
{0x0000a568, 0x4c001ed4},
|
||||||
|
{0x0000a56c, 0x4e001f15},
|
||||||
|
{0x0000a570, 0x4f001ff6},
|
||||||
|
{0x0000a574, 0x4f001ff6},
|
||||||
|
{0x0000a578, 0x4f001ff6},
|
||||||
|
{0x0000a57c, 0x4f001ff6},
|
||||||
|
{0x0000a600, 0x00000000},
|
||||||
|
{0x0000a604, 0x00000000},
|
||||||
|
{0x0000a608, 0x00000000},
|
||||||
|
{0x0000a60c, 0x00804201},
|
||||||
|
{0x0000a610, 0x01008201},
|
||||||
|
{0x0000a614, 0x0180c402},
|
||||||
|
{0x0000a618, 0x0180c603},
|
||||||
|
{0x0000a61c, 0x0180c603},
|
||||||
|
{0x0000a620, 0x01c10603},
|
||||||
|
{0x0000a624, 0x01c10704},
|
||||||
|
{0x0000a628, 0x02c18b05},
|
||||||
|
{0x0000a62c, 0x02c14c07},
|
||||||
|
{0x0000a630, 0x01008704},
|
||||||
|
{0x0000a634, 0x01c10402},
|
||||||
|
{0x0000a638, 0x0301cc07},
|
||||||
|
{0x0000a63c, 0x0301cc07},
|
||||||
|
{0x0000b2dc, 0xffd5f552},
|
||||||
|
{0x0000b2e0, 0xffe60664},
|
||||||
|
{0x0000b2e4, 0xfff80780},
|
||||||
|
{0x0000b2e8, 0xfffff800},
|
||||||
|
{0x00016044, 0x049242db},
|
||||||
|
{0x00016048, 0x6c927a70},
|
||||||
|
{0x00016444, 0x049242db},
|
||||||
|
{0x00016448, 0x6c927a70},
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* INITVALS_953X_H */
|
|
@ -455,10 +455,8 @@ bool ath9k_csa_is_finished(struct ath_softc *sc);
|
||||||
|
|
||||||
void ath_tx_complete_poll_work(struct work_struct *work);
|
void ath_tx_complete_poll_work(struct work_struct *work);
|
||||||
void ath_reset_work(struct work_struct *work);
|
void ath_reset_work(struct work_struct *work);
|
||||||
void ath_hw_check(struct work_struct *work);
|
bool ath_hw_check(struct ath_softc *sc);
|
||||||
void ath_hw_pll_work(struct work_struct *work);
|
void ath_hw_pll_work(struct work_struct *work);
|
||||||
void ath_rx_poll(unsigned long data);
|
|
||||||
void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon);
|
|
||||||
void ath_paprd_calibrate(struct work_struct *work);
|
void ath_paprd_calibrate(struct work_struct *work);
|
||||||
void ath_ani_calibrate(unsigned long data);
|
void ath_ani_calibrate(unsigned long data);
|
||||||
void ath_start_ani(struct ath_softc *sc);
|
void ath_start_ani(struct ath_softc *sc);
|
||||||
|
@ -722,12 +720,10 @@ struct ath_softc {
|
||||||
spinlock_t sc_pcu_lock;
|
spinlock_t sc_pcu_lock;
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
struct work_struct paprd_work;
|
struct work_struct paprd_work;
|
||||||
struct work_struct hw_check_work;
|
|
||||||
struct work_struct hw_reset_work;
|
struct work_struct hw_reset_work;
|
||||||
struct completion paprd_complete;
|
struct completion paprd_complete;
|
||||||
wait_queue_head_t tx_wait;
|
wait_queue_head_t tx_wait;
|
||||||
|
|
||||||
unsigned int hw_busy_count;
|
|
||||||
unsigned long sc_flags;
|
unsigned long sc_flags;
|
||||||
unsigned long driver_data;
|
unsigned long driver_data;
|
||||||
|
|
||||||
|
@ -761,7 +757,6 @@ struct ath_softc {
|
||||||
struct ath_beacon_config cur_beacon_conf;
|
struct ath_beacon_config cur_beacon_conf;
|
||||||
struct delayed_work tx_complete_work;
|
struct delayed_work tx_complete_work;
|
||||||
struct delayed_work hw_pll_work;
|
struct delayed_work hw_pll_work;
|
||||||
struct timer_list rx_poll_timer;
|
|
||||||
struct timer_list sleep_timer;
|
struct timer_list sleep_timer;
|
||||||
|
|
||||||
#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
|
#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
|
||||||
|
|
|
@ -337,8 +337,14 @@ void ath9k_beacon_tasklet(unsigned long data)
|
||||||
|
|
||||||
ath9k_hw_check_nav(ah);
|
ath9k_hw_check_nav(ah);
|
||||||
|
|
||||||
if (!ath9k_hw_check_alive(ah))
|
/*
|
||||||
ieee80211_queue_work(sc->hw, &sc->hw_check_work);
|
* If the previous beacon has not been transmitted
|
||||||
|
* and a MAC/BB hang has been identified, return
|
||||||
|
* here because a chip reset would have been
|
||||||
|
* initiated.
|
||||||
|
*/
|
||||||
|
if (!ath_hw_check(sc))
|
||||||
|
return;
|
||||||
|
|
||||||
if (sc->beacon.bmisscnt < BSTUCK_THRESH * sc->nbcnvifs) {
|
if (sc->beacon.bmisscnt < BSTUCK_THRESH * sc->nbcnvifs) {
|
||||||
ath_dbg(common, BSTUCK,
|
ath_dbg(common, BSTUCK,
|
||||||
|
|
|
@ -1077,7 +1077,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
||||||
|
|
||||||
if (ieee80211_is_beacon(hdr->frame_control) &&
|
if (ieee80211_is_beacon(hdr->frame_control) &&
|
||||||
!is_zero_ether_addr(common->curbssid) &&
|
!is_zero_ether_addr(common->curbssid) &&
|
||||||
ether_addr_equal(hdr->addr3, common->curbssid)) {
|
ether_addr_equal_64bits(hdr->addr3, common->curbssid)) {
|
||||||
s8 rssi = rxbuf->rxstatus.rs_rssi;
|
s8 rssi = rxbuf->rxstatus.rs_rssi;
|
||||||
|
|
||||||
if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
|
if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
|
||||||
|
|
|
@ -107,6 +107,21 @@ static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
|
||||||
|
|
||||||
/* Private hardware call ops */
|
/* Private hardware call ops */
|
||||||
|
|
||||||
|
static inline void ath9k_hw_init_hang_checks(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
ath9k_hw_private_ops(ah)->init_hang_checks(ah);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool ath9k_hw_detect_mac_hang(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
return ath9k_hw_private_ops(ah)->detect_mac_hang(ah);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool ath9k_hw_detect_bb_hang(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
return ath9k_hw_private_ops(ah)->detect_bb_hang(ah);
|
||||||
|
}
|
||||||
|
|
||||||
/* PHY ops */
|
/* PHY ops */
|
||||||
|
|
||||||
static inline int ath9k_hw_rf_set_freq(struct ath_hw *ah,
|
static inline int ath9k_hw_rf_set_freq(struct ath_hw *ah,
|
||||||
|
@ -232,4 +247,31 @@ static inline void ath9k_hw_set_radar_params(struct ath_hw *ah)
|
||||||
ath9k_hw_private_ops(ah)->set_radar_params(ah, &ah->radar_conf);
|
ath9k_hw_private_ops(ah)->set_radar_params(ah, &ah->radar_conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void ath9k_hw_init_cal_settings(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
ath9k_hw_private_ops(ah)->init_cal_settings(ah);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 ath9k_hw_compute_pll_control(struct ath_hw *ah,
|
||||||
|
struct ath9k_channel *chan)
|
||||||
|
{
|
||||||
|
return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
if (!ath9k_hw_private_ops(ah)->init_mode_gain_regs)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ath9k_hw_ani_cache_ini_regs(struct ath_hw *ah)
|
||||||
|
{
|
||||||
|
if (!ath9k_hw_private_ops(ah)->ani_cache_ini_regs)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ath9k_hw_private_ops(ah)->ani_cache_ini_regs(ah);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* ATH9K_HW_OPS_H */
|
#endif /* ATH9K_HW_OPS_H */
|
||||||
|
|
|
@ -37,57 +37,6 @@ MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
|
||||||
MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
|
MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
|
||||||
MODULE_LICENSE("Dual BSD/GPL");
|
MODULE_LICENSE("Dual BSD/GPL");
|
||||||
|
|
||||||
static int __init ath9k_init(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
module_init(ath9k_init);
|
|
||||||
|
|
||||||
static void __exit ath9k_exit(void)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
module_exit(ath9k_exit);
|
|
||||||
|
|
||||||
/* Private hardware callbacks */
|
|
||||||
|
|
||||||
static void ath9k_hw_init_cal_settings(struct ath_hw *ah)
|
|
||||||
{
|
|
||||||
ath9k_hw_private_ops(ah)->init_cal_settings(ah);
|
|
||||||
}
|
|
||||||
|
|
||||||
static u32 ath9k_hw_compute_pll_control(struct ath_hw *ah,
|
|
||||||
struct ath9k_channel *chan)
|
|
||||||
{
|
|
||||||
return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
|
|
||||||
{
|
|
||||||
if (!ath9k_hw_private_ops(ah)->init_mode_gain_regs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ath9k_hw_ani_cache_ini_regs(struct ath_hw *ah)
|
|
||||||
{
|
|
||||||
/* You will not have this callback if using the old ANI */
|
|
||||||
if (!ath9k_hw_private_ops(ah)->ani_cache_ini_regs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ath9k_hw_private_ops(ah)->ani_cache_ini_regs(ah);
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************/
|
|
||||||
/* Helper Functions */
|
|
||||||
/********************/
|
|
||||||
|
|
||||||
#ifdef CONFIG_ATH9K_DEBUGFS
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void ath9k_hw_set_clockrate(struct ath_hw *ah)
|
static void ath9k_hw_set_clockrate(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
@ -296,6 +245,9 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
|
||||||
case AR9300_DEVID_QCA955X:
|
case AR9300_DEVID_QCA955X:
|
||||||
ah->hw_version.macVersion = AR_SREV_VERSION_9550;
|
ah->hw_version.macVersion = AR_SREV_VERSION_9550;
|
||||||
return;
|
return;
|
||||||
|
case AR9300_DEVID_AR953X:
|
||||||
|
ah->hw_version.macVersion = AR_SREV_VERSION_9531;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
|
val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
|
||||||
|
@ -397,9 +349,10 @@ static bool ath9k_hw_chip_test(struct ath_hw *ah)
|
||||||
|
|
||||||
static void ath9k_hw_init_config(struct ath_hw *ah)
|
static void ath9k_hw_init_config(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
|
||||||
ah->config.dma_beacon_response_time = 1;
|
ah->config.dma_beacon_response_time = 1;
|
||||||
ah->config.sw_beacon_response_time = 6;
|
ah->config.sw_beacon_response_time = 6;
|
||||||
ah->config.ack_6mb = 0x0;
|
|
||||||
ah->config.cwm_ignore_extcca = 0;
|
ah->config.cwm_ignore_extcca = 0;
|
||||||
ah->config.analog_shiftreg = 1;
|
ah->config.analog_shiftreg = 1;
|
||||||
|
|
||||||
|
@ -423,6 +376,24 @@ static void ath9k_hw_init_config(struct ath_hw *ah)
|
||||||
*/
|
*/
|
||||||
if (num_possible_cpus() > 1)
|
if (num_possible_cpus() > 1)
|
||||||
ah->config.serialize_regmode = SER_REG_MODE_AUTO;
|
ah->config.serialize_regmode = SER_REG_MODE_AUTO;
|
||||||
|
|
||||||
|
if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
|
||||||
|
if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
|
||||||
|
((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) &&
|
||||||
|
!ah->is_pciexpress)) {
|
||||||
|
ah->config.serialize_regmode = SER_REG_MODE_ON;
|
||||||
|
} else {
|
||||||
|
ah->config.serialize_regmode = SER_REG_MODE_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ath_dbg(common, RESET, "serialize_regmode is %d\n",
|
||||||
|
ah->config.serialize_regmode);
|
||||||
|
|
||||||
|
if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
|
||||||
|
ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD >> 1;
|
||||||
|
else
|
||||||
|
ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath9k_hw_init_defaults(struct ath_hw *ah)
|
static void ath9k_hw_init_defaults(struct ath_hw *ah)
|
||||||
|
@ -435,15 +406,24 @@ static void ath9k_hw_init_defaults(struct ath_hw *ah)
|
||||||
ah->hw_version.magic = AR5416_MAGIC;
|
ah->hw_version.magic = AR5416_MAGIC;
|
||||||
ah->hw_version.subvendorid = 0;
|
ah->hw_version.subvendorid = 0;
|
||||||
|
|
||||||
ah->sta_id1_defaults =
|
ah->sta_id1_defaults = AR_STA_ID1_CRPT_MIC_ENABLE |
|
||||||
AR_STA_ID1_CRPT_MIC_ENABLE |
|
AR_STA_ID1_MCAST_KSRCH;
|
||||||
AR_STA_ID1_MCAST_KSRCH;
|
|
||||||
if (AR_SREV_9100(ah))
|
if (AR_SREV_9100(ah))
|
||||||
ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX;
|
ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX;
|
||||||
|
|
||||||
ah->slottime = ATH9K_SLOT_TIME_9;
|
ah->slottime = ATH9K_SLOT_TIME_9;
|
||||||
ah->globaltxtimeout = (u32) -1;
|
ah->globaltxtimeout = (u32) -1;
|
||||||
ah->power_mode = ATH9K_PM_UNDEFINED;
|
ah->power_mode = ATH9K_PM_UNDEFINED;
|
||||||
ah->htc_reset_init = true;
|
ah->htc_reset_init = true;
|
||||||
|
|
||||||
|
ah->ani_function = ATH9K_ANI_ALL;
|
||||||
|
if (!AR_SREV_9300_20_OR_LATER(ah))
|
||||||
|
ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
|
||||||
|
|
||||||
|
if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
|
||||||
|
ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
|
||||||
|
else
|
||||||
|
ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
|
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
|
||||||
|
@ -525,6 +505,31 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||||
|
|
||||||
ath9k_hw_read_revisions(ah);
|
ath9k_hw_read_revisions(ah);
|
||||||
|
|
||||||
|
switch (ah->hw_version.macVersion) {
|
||||||
|
case AR_SREV_VERSION_5416_PCI:
|
||||||
|
case AR_SREV_VERSION_5416_PCIE:
|
||||||
|
case AR_SREV_VERSION_9160:
|
||||||
|
case AR_SREV_VERSION_9100:
|
||||||
|
case AR_SREV_VERSION_9280:
|
||||||
|
case AR_SREV_VERSION_9285:
|
||||||
|
case AR_SREV_VERSION_9287:
|
||||||
|
case AR_SREV_VERSION_9271:
|
||||||
|
case AR_SREV_VERSION_9300:
|
||||||
|
case AR_SREV_VERSION_9330:
|
||||||
|
case AR_SREV_VERSION_9485:
|
||||||
|
case AR_SREV_VERSION_9340:
|
||||||
|
case AR_SREV_VERSION_9462:
|
||||||
|
case AR_SREV_VERSION_9550:
|
||||||
|
case AR_SREV_VERSION_9565:
|
||||||
|
case AR_SREV_VERSION_9531:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ath_err(common,
|
||||||
|
"Mac Chip Rev 0x%02x.%x is not supported by this driver\n",
|
||||||
|
ah->hw_version.macVersion, ah->hw_version.macRev);
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read back AR_WA into a permanent copy and set bits 14 and 17.
|
* Read back AR_WA into a permanent copy and set bits 14 and 17.
|
||||||
* We need to do this to avoid RMW of this register. We cannot
|
* We need to do this to avoid RMW of this register. We cannot
|
||||||
|
@ -558,50 +563,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
|
|
||||||
if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
|
|
||||||
((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) &&
|
|
||||||
!ah->is_pciexpress)) {
|
|
||||||
ah->config.serialize_regmode =
|
|
||||||
SER_REG_MODE_ON;
|
|
||||||
} else {
|
|
||||||
ah->config.serialize_regmode =
|
|
||||||
SER_REG_MODE_OFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ath_dbg(common, RESET, "serialize_regmode is %d\n",
|
|
||||||
ah->config.serialize_regmode);
|
|
||||||
|
|
||||||
if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
|
|
||||||
ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD >> 1;
|
|
||||||
else
|
|
||||||
ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD;
|
|
||||||
|
|
||||||
switch (ah->hw_version.macVersion) {
|
|
||||||
case AR_SREV_VERSION_5416_PCI:
|
|
||||||
case AR_SREV_VERSION_5416_PCIE:
|
|
||||||
case AR_SREV_VERSION_9160:
|
|
||||||
case AR_SREV_VERSION_9100:
|
|
||||||
case AR_SREV_VERSION_9280:
|
|
||||||
case AR_SREV_VERSION_9285:
|
|
||||||
case AR_SREV_VERSION_9287:
|
|
||||||
case AR_SREV_VERSION_9271:
|
|
||||||
case AR_SREV_VERSION_9300:
|
|
||||||
case AR_SREV_VERSION_9330:
|
|
||||||
case AR_SREV_VERSION_9485:
|
|
||||||
case AR_SREV_VERSION_9340:
|
|
||||||
case AR_SREV_VERSION_9462:
|
|
||||||
case AR_SREV_VERSION_9550:
|
|
||||||
case AR_SREV_VERSION_9565:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ath_err(common,
|
|
||||||
"Mac Chip Rev 0x%02x.%x is not supported by this driver\n",
|
|
||||||
ah->hw_version.macVersion, ah->hw_version.macRev);
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
|
if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
|
||||||
AR_SREV_9330(ah) || AR_SREV_9550(ah))
|
AR_SREV_9330(ah) || AR_SREV_9550(ah))
|
||||||
ah->is_pciexpress = false;
|
ah->is_pciexpress = false;
|
||||||
|
@ -609,10 +570,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||||
ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
|
ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
|
||||||
ath9k_hw_init_cal_settings(ah);
|
ath9k_hw_init_cal_settings(ah);
|
||||||
|
|
||||||
ah->ani_function = ATH9K_ANI_ALL;
|
|
||||||
if (!AR_SREV_9300_20_OR_LATER(ah))
|
|
||||||
ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
|
|
||||||
|
|
||||||
if (!ah->is_pciexpress)
|
if (!ah->is_pciexpress)
|
||||||
ath9k_hw_disablepcie(ah);
|
ath9k_hw_disablepcie(ah);
|
||||||
|
|
||||||
|
@ -631,15 +588,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
|
ath9k_hw_init_hang_checks(ah);
|
||||||
ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
|
|
||||||
else
|
|
||||||
ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
|
|
||||||
|
|
||||||
if (AR_SREV_9330(ah))
|
|
||||||
ah->bb_watchdog_timeout_ms = 85;
|
|
||||||
else
|
|
||||||
ah->bb_watchdog_timeout_ms = 25;
|
|
||||||
|
|
||||||
common->state = ATH_HW_INITIALIZED;
|
common->state = ATH_HW_INITIALIZED;
|
||||||
|
|
||||||
|
@ -672,6 +621,7 @@ int ath9k_hw_init(struct ath_hw *ah)
|
||||||
case AR9300_DEVID_AR9462:
|
case AR9300_DEVID_AR9462:
|
||||||
case AR9485_DEVID_AR1111:
|
case AR9485_DEVID_AR1111:
|
||||||
case AR9300_DEVID_AR9565:
|
case AR9300_DEVID_AR9565:
|
||||||
|
case AR9300_DEVID_AR953X:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (common->bus_ops->ath_bus_type == ATH_USB)
|
if (common->bus_ops->ath_bus_type == ATH_USB)
|
||||||
|
@ -807,7 +757,7 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
|
||||||
/* program BB PLL phase_shift */
|
/* program BB PLL phase_shift */
|
||||||
REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
|
REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
|
||||||
AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x1);
|
AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x1);
|
||||||
} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {
|
} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
|
||||||
u32 regval, pll2_divint, pll2_divfrac, refdiv;
|
u32 regval, pll2_divint, pll2_divfrac, refdiv;
|
||||||
|
|
||||||
REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c);
|
REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c);
|
||||||
|
@ -817,9 +767,15 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
|
||||||
udelay(100);
|
udelay(100);
|
||||||
|
|
||||||
if (ah->is_clk_25mhz) {
|
if (ah->is_clk_25mhz) {
|
||||||
pll2_divint = 0x54;
|
if (AR_SREV_9531(ah)) {
|
||||||
pll2_divfrac = 0x1eb85;
|
pll2_divint = 0x1c;
|
||||||
refdiv = 3;
|
pll2_divfrac = 0xa3d2;
|
||||||
|
refdiv = 1;
|
||||||
|
} else {
|
||||||
|
pll2_divint = 0x54;
|
||||||
|
pll2_divfrac = 0x1eb85;
|
||||||
|
refdiv = 3;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (AR_SREV_9340(ah)) {
|
if (AR_SREV_9340(ah)) {
|
||||||
pll2_divint = 88;
|
pll2_divint = 88;
|
||||||
|
@ -833,7 +789,10 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
|
||||||
}
|
}
|
||||||
|
|
||||||
regval = REG_READ(ah, AR_PHY_PLL_MODE);
|
regval = REG_READ(ah, AR_PHY_PLL_MODE);
|
||||||
regval |= (0x1 << 16);
|
if (AR_SREV_9531(ah))
|
||||||
|
regval |= (0x1 << 22);
|
||||||
|
else
|
||||||
|
regval |= (0x1 << 16);
|
||||||
REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
|
REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
|
||||||
udelay(100);
|
udelay(100);
|
||||||
|
|
||||||
|
@ -843,14 +802,33 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
|
||||||
|
|
||||||
regval = REG_READ(ah, AR_PHY_PLL_MODE);
|
regval = REG_READ(ah, AR_PHY_PLL_MODE);
|
||||||
if (AR_SREV_9340(ah))
|
if (AR_SREV_9340(ah))
|
||||||
regval = (regval & 0x80071fff) | (0x1 << 30) |
|
regval = (regval & 0x80071fff) |
|
||||||
(0x1 << 13) | (0x4 << 26) | (0x18 << 19);
|
(0x1 << 30) |
|
||||||
|
(0x1 << 13) |
|
||||||
|
(0x4 << 26) |
|
||||||
|
(0x18 << 19);
|
||||||
|
else if (AR_SREV_9531(ah))
|
||||||
|
regval = (regval & 0x01c00fff) |
|
||||||
|
(0x1 << 31) |
|
||||||
|
(0x2 << 29) |
|
||||||
|
(0xa << 25) |
|
||||||
|
(0x1 << 19) |
|
||||||
|
(0x6 << 12);
|
||||||
else
|
else
|
||||||
regval = (regval & 0x80071fff) | (0x3 << 30) |
|
regval = (regval & 0x80071fff) |
|
||||||
(0x1 << 13) | (0x4 << 26) | (0x60 << 19);
|
(0x3 << 30) |
|
||||||
|
(0x1 << 13) |
|
||||||
|
(0x4 << 26) |
|
||||||
|
(0x60 << 19);
|
||||||
REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
|
REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
|
||||||
REG_WRITE(ah, AR_PHY_PLL_MODE,
|
|
||||||
REG_READ(ah, AR_PHY_PLL_MODE) & 0xfffeffff);
|
if (AR_SREV_9531(ah))
|
||||||
|
REG_WRITE(ah, AR_PHY_PLL_MODE,
|
||||||
|
REG_READ(ah, AR_PHY_PLL_MODE) & 0xffbfffff);
|
||||||
|
else
|
||||||
|
REG_WRITE(ah, AR_PHY_PLL_MODE,
|
||||||
|
REG_READ(ah, AR_PHY_PLL_MODE) & 0xfffeffff);
|
||||||
|
|
||||||
udelay(1000);
|
udelay(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1532,76 +1510,6 @@ static void ath9k_hw_apply_gpio_override(struct ath_hw *ah)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ath9k_hw_check_dcs(u32 dma_dbg, u32 num_dcu_states,
|
|
||||||
int *hang_state, int *hang_pos)
|
|
||||||
{
|
|
||||||
static u32 dcu_chain_state[] = {5, 6, 9}; /* DCU chain stuck states */
|
|
||||||
u32 chain_state, dcs_pos, i;
|
|
||||||
|
|
||||||
for (dcs_pos = 0; dcs_pos < num_dcu_states; dcs_pos++) {
|
|
||||||
chain_state = (dma_dbg >> (5 * dcs_pos)) & 0x1f;
|
|
||||||
for (i = 0; i < 3; i++) {
|
|
||||||
if (chain_state == dcu_chain_state[i]) {
|
|
||||||
*hang_state = chain_state;
|
|
||||||
*hang_pos = dcs_pos;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DCU_COMPLETE_STATE 1
|
|
||||||
#define DCU_COMPLETE_STATE_MASK 0x3
|
|
||||||
#define NUM_STATUS_READS 50
|
|
||||||
static bool ath9k_hw_detect_mac_hang(struct ath_hw *ah)
|
|
||||||
{
|
|
||||||
u32 chain_state, comp_state, dcs_reg = AR_DMADBG_4;
|
|
||||||
u32 i, hang_pos, hang_state, num_state = 6;
|
|
||||||
|
|
||||||
comp_state = REG_READ(ah, AR_DMADBG_6);
|
|
||||||
|
|
||||||
if ((comp_state & DCU_COMPLETE_STATE_MASK) != DCU_COMPLETE_STATE) {
|
|
||||||
ath_dbg(ath9k_hw_common(ah), RESET,
|
|
||||||
"MAC Hang signature not found at DCU complete\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
chain_state = REG_READ(ah, dcs_reg);
|
|
||||||
if (ath9k_hw_check_dcs(chain_state, num_state, &hang_state, &hang_pos))
|
|
||||||
goto hang_check_iter;
|
|
||||||
|
|
||||||
dcs_reg = AR_DMADBG_5;
|
|
||||||
num_state = 4;
|
|
||||||
chain_state = REG_READ(ah, dcs_reg);
|
|
||||||
if (ath9k_hw_check_dcs(chain_state, num_state, &hang_state, &hang_pos))
|
|
||||||
goto hang_check_iter;
|
|
||||||
|
|
||||||
ath_dbg(ath9k_hw_common(ah), RESET,
|
|
||||||
"MAC Hang signature 1 not found\n");
|
|
||||||
return false;
|
|
||||||
|
|
||||||
hang_check_iter:
|
|
||||||
ath_dbg(ath9k_hw_common(ah), RESET,
|
|
||||||
"DCU registers: chain %08x complete %08x Hang: state %d pos %d\n",
|
|
||||||
chain_state, comp_state, hang_state, hang_pos);
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_STATUS_READS; i++) {
|
|
||||||
chain_state = REG_READ(ah, dcs_reg);
|
|
||||||
chain_state = (chain_state >> (5 * hang_pos)) & 0x1f;
|
|
||||||
comp_state = REG_READ(ah, AR_DMADBG_6);
|
|
||||||
|
|
||||||
if (((comp_state & DCU_COMPLETE_STATE_MASK) !=
|
|
||||||
DCU_COMPLETE_STATE) ||
|
|
||||||
(chain_state != hang_state))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ath_dbg(ath9k_hw_common(ah), RESET, "MAC Hang signature 1 found\n");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ath9k_hw_check_nav(struct ath_hw *ah)
|
void ath9k_hw_check_nav(struct ath_hw *ah)
|
||||||
{
|
{
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
@ -1676,7 +1584,6 @@ static void ath9k_hw_reset_opmode(struct ath_hw *ah,
|
||||||
|
|
||||||
REG_RMW(ah, AR_STA_ID1, macStaId1
|
REG_RMW(ah, AR_STA_ID1, macStaId1
|
||||||
| AR_STA_ID1_RTS_USE_DEF
|
| AR_STA_ID1_RTS_USE_DEF
|
||||||
| (ah->config.ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
|
|
||||||
| ah->sta_id1_defaults,
|
| ah->sta_id1_defaults,
|
||||||
~AR_STA_ID1_SADH_MASK);
|
~AR_STA_ID1_SADH_MASK);
|
||||||
ath_hw_setbssidmask(common);
|
ath_hw_setbssidmask(common);
|
||||||
|
@ -1735,7 +1642,7 @@ static void ath9k_hw_init_desc(struct ath_hw *ah)
|
||||||
}
|
}
|
||||||
#ifdef __BIG_ENDIAN
|
#ifdef __BIG_ENDIAN
|
||||||
else if (AR_SREV_9330(ah) || AR_SREV_9340(ah) ||
|
else if (AR_SREV_9330(ah) || AR_SREV_9340(ah) ||
|
||||||
AR_SREV_9550(ah))
|
AR_SREV_9550(ah) || AR_SREV_9531(ah))
|
||||||
REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);
|
REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);
|
||||||
else
|
else
|
||||||
REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
|
REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
|
||||||
|
@ -1865,7 +1772,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||||
/* Save TSF before chip reset, a cold reset clears it */
|
/* Save TSF before chip reset, a cold reset clears it */
|
||||||
tsf = ath9k_hw_gettsf64(ah);
|
tsf = ath9k_hw_gettsf64(ah);
|
||||||
getrawmonotonic(&ts);
|
getrawmonotonic(&ts);
|
||||||
usec = ts.tv_sec * 1000 + ts.tv_nsec / 1000;
|
usec = ts.tv_sec * 1000000ULL + ts.tv_nsec / 1000;
|
||||||
|
|
||||||
saveLedState = REG_READ(ah, AR_CFG_LED) &
|
saveLedState = REG_READ(ah, AR_CFG_LED) &
|
||||||
(AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
|
(AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
|
||||||
|
@ -1899,7 +1806,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||||
|
|
||||||
/* Restore TSF */
|
/* Restore TSF */
|
||||||
getrawmonotonic(&ts);
|
getrawmonotonic(&ts);
|
||||||
usec = ts.tv_sec * 1000 + ts.tv_nsec / 1000 - usec;
|
usec = ts.tv_sec * 1000000ULL + ts.tv_nsec / 1000 - usec;
|
||||||
ath9k_hw_settsf64(ah, tsf + usec);
|
ath9k_hw_settsf64(ah, tsf + usec);
|
||||||
|
|
||||||
if (AR_SREV_9280_20_OR_LATER(ah))
|
if (AR_SREV_9280_20_OR_LATER(ah))
|
||||||
|
@ -2008,10 +1915,11 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
|
||||||
ath9k_hw_loadnf(ah, chan);
|
ath9k_hw_loadnf(ah, chan);
|
||||||
ath9k_hw_start_nfcal(ah, true);
|
ath9k_hw_start_nfcal(ah, true);
|
||||||
|
|
||||||
if (AR_SREV_9300_20_OR_LATER(ah)) {
|
if (AR_SREV_9300_20_OR_LATER(ah))
|
||||||
ar9003_hw_bb_watchdog_config(ah);
|
ar9003_hw_bb_watchdog_config(ah);
|
||||||
|
|
||||||
|
if (ah->config.hw_hang_checks & HW_PHYRESTART_CLC_WAR)
|
||||||
ar9003_hw_disable_phy_restart(ah);
|
ar9003_hw_disable_phy_restart(ah);
|
||||||
}
|
|
||||||
|
|
||||||
ath9k_hw_apply_gpio_override(ah);
|
ath9k_hw_apply_gpio_override(ah);
|
||||||
|
|
||||||
|
@ -2135,7 +2043,11 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah)
|
||||||
|
|
||||||
REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
|
REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
|
||||||
AR_RTC_FORCE_WAKE_EN);
|
AR_RTC_FORCE_WAKE_EN);
|
||||||
udelay(50);
|
|
||||||
|
if (AR_SREV_9100(ah))
|
||||||
|
udelay(10000);
|
||||||
|
else
|
||||||
|
udelay(50);
|
||||||
|
|
||||||
for (i = POWER_UP_TIME / 50; i > 0; i--) {
|
for (i = POWER_UP_TIME / 50; i > 0; i--) {
|
||||||
val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M;
|
val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M;
|
||||||
|
@ -2564,13 +2476,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
|
||||||
ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
|
ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
|
||||||
pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
|
pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
|
||||||
|
|
||||||
/*
|
|
||||||
* Fast channel change across bands is available
|
|
||||||
* only for AR9462 and AR9565.
|
|
||||||
*/
|
|
||||||
if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
|
|
||||||
pCap->hw_caps |= ATH9K_HW_CAP_FCC_BAND_SWITCH;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3084,14 +2989,14 @@ void ath_gen_timer_isr(struct ath_hw *ah)
|
||||||
trigger_mask &= timer_table->timer_mask;
|
trigger_mask &= timer_table->timer_mask;
|
||||||
thresh_mask &= timer_table->timer_mask;
|
thresh_mask &= timer_table->timer_mask;
|
||||||
|
|
||||||
trigger_mask &= ~thresh_mask;
|
|
||||||
|
|
||||||
for_each_set_bit(index, &thresh_mask, ARRAY_SIZE(timer_table->timers)) {
|
for_each_set_bit(index, &thresh_mask, ARRAY_SIZE(timer_table->timers)) {
|
||||||
timer = timer_table->timers[index];
|
timer = timer_table->timers[index];
|
||||||
if (!timer)
|
if (!timer)
|
||||||
continue;
|
continue;
|
||||||
if (!timer->overflow)
|
if (!timer->overflow)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
trigger_mask &= ~BIT(index);
|
||||||
timer->overflow(timer->arg);
|
timer->overflow(timer->arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#define AR9300_DEVID_QCA955X 0x0038
|
#define AR9300_DEVID_QCA955X 0x0038
|
||||||
#define AR9485_DEVID_AR1111 0x0037
|
#define AR9485_DEVID_AR1111 0x0037
|
||||||
#define AR9300_DEVID_AR9565 0x0036
|
#define AR9300_DEVID_AR9565 0x0036
|
||||||
|
#define AR9300_DEVID_AR953X 0x003d
|
||||||
|
|
||||||
#define AR5416_AR9100_DEVID 0x000b
|
#define AR5416_AR9100_DEVID 0x000b
|
||||||
|
|
||||||
|
@ -277,10 +278,24 @@ struct ath9k_hw_capabilities {
|
||||||
u8 txs_len;
|
u8 txs_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define AR_NO_SPUR 0x8000
|
||||||
|
#define AR_BASE_FREQ_2GHZ 2300
|
||||||
|
#define AR_BASE_FREQ_5GHZ 4900
|
||||||
|
#define AR_SPUR_FEEQ_BOUND_HT40 19
|
||||||
|
#define AR_SPUR_FEEQ_BOUND_HT20 10
|
||||||
|
|
||||||
|
enum ath9k_hw_hang_checks {
|
||||||
|
HW_BB_WATCHDOG = BIT(0),
|
||||||
|
HW_PHYRESTART_CLC_WAR = BIT(1),
|
||||||
|
HW_BB_RIFS_HANG = BIT(2),
|
||||||
|
HW_BB_DFS_HANG = BIT(3),
|
||||||
|
HW_BB_RX_CLEAR_STUCK_HANG = BIT(4),
|
||||||
|
HW_MAC_HANG = BIT(5),
|
||||||
|
};
|
||||||
|
|
||||||
struct ath9k_ops_config {
|
struct ath9k_ops_config {
|
||||||
int dma_beacon_response_time;
|
int dma_beacon_response_time;
|
||||||
int sw_beacon_response_time;
|
int sw_beacon_response_time;
|
||||||
int ack_6mb;
|
|
||||||
u32 cwm_ignore_extcca;
|
u32 cwm_ignore_extcca;
|
||||||
u32 pcie_waen;
|
u32 pcie_waen;
|
||||||
u8 analog_shiftreg;
|
u8 analog_shiftreg;
|
||||||
|
@ -292,13 +307,9 @@ struct ath9k_ops_config {
|
||||||
int serialize_regmode;
|
int serialize_regmode;
|
||||||
bool rx_intr_mitigation;
|
bool rx_intr_mitigation;
|
||||||
bool tx_intr_mitigation;
|
bool tx_intr_mitigation;
|
||||||
#define AR_NO_SPUR 0x8000
|
|
||||||
#define AR_BASE_FREQ_2GHZ 2300
|
|
||||||
#define AR_BASE_FREQ_5GHZ 4900
|
|
||||||
#define AR_SPUR_FEEQ_BOUND_HT40 19
|
|
||||||
#define AR_SPUR_FEEQ_BOUND_HT20 10
|
|
||||||
u8 max_txtrig_level;
|
u8 max_txtrig_level;
|
||||||
u16 ani_poll_interval; /* ANI poll interval in ms */
|
u16 ani_poll_interval; /* ANI poll interval in ms */
|
||||||
|
u16 hw_hang_checks;
|
||||||
|
|
||||||
/* Platform specific config */
|
/* Platform specific config */
|
||||||
u32 aspm_l1_fix;
|
u32 aspm_l1_fix;
|
||||||
|
@ -573,6 +584,10 @@ struct ath_hw_radar_conf {
|
||||||
* register settings through the register initialization.
|
* register settings through the register initialization.
|
||||||
*/
|
*/
|
||||||
struct ath_hw_private_ops {
|
struct ath_hw_private_ops {
|
||||||
|
void (*init_hang_checks)(struct ath_hw *ah);
|
||||||
|
bool (*detect_mac_hang)(struct ath_hw *ah);
|
||||||
|
bool (*detect_bb_hang)(struct ath_hw *ah);
|
||||||
|
|
||||||
/* Calibration ops */
|
/* Calibration ops */
|
||||||
void (*init_cal_settings)(struct ath_hw *ah);
|
void (*init_cal_settings)(struct ath_hw *ah);
|
||||||
bool (*init_cal)(struct ath_hw *ah, struct ath9k_channel *chan);
|
bool (*init_cal)(struct ath_hw *ah, struct ath9k_channel *chan);
|
||||||
|
@ -1029,6 +1044,7 @@ void ar9002_hw_enable_async_fifo(struct ath_hw *ah);
|
||||||
* Code specific to AR9003, we stuff these here to avoid callbacks
|
* Code specific to AR9003, we stuff these here to avoid callbacks
|
||||||
* for older families
|
* for older families
|
||||||
*/
|
*/
|
||||||
|
bool ar9003_hw_bb_watchdog_check(struct ath_hw *ah);
|
||||||
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah);
|
void ar9003_hw_bb_watchdog_config(struct ath_hw *ah);
|
||||||
void ar9003_hw_bb_watchdog_read(struct ath_hw *ah);
|
void ar9003_hw_bb_watchdog_read(struct ath_hw *ah);
|
||||||
void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah);
|
void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah);
|
||||||
|
|
|
@ -763,10 +763,8 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||||
|
|
||||||
setup_timer(&sc->sleep_timer, ath_ps_full_sleep, (unsigned long)sc);
|
setup_timer(&sc->sleep_timer, ath_ps_full_sleep, (unsigned long)sc);
|
||||||
INIT_WORK(&sc->hw_reset_work, ath_reset_work);
|
INIT_WORK(&sc->hw_reset_work, ath_reset_work);
|
||||||
INIT_WORK(&sc->hw_check_work, ath_hw_check);
|
|
||||||
INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
|
INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
|
||||||
INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
|
INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
|
||||||
setup_timer(&sc->rx_poll_timer, ath_rx_poll, (unsigned long)sc);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Cache line size is used to size and align various
|
* Cache line size is used to size and align various
|
||||||
|
|
|
@ -65,50 +65,26 @@ void ath_tx_complete_poll_work(struct work_struct *work)
|
||||||
/*
|
/*
|
||||||
* Checks if the BB/MAC is hung.
|
* Checks if the BB/MAC is hung.
|
||||||
*/
|
*/
|
||||||
void ath_hw_check(struct work_struct *work)
|
bool ath_hw_check(struct ath_softc *sc)
|
||||||
{
|
{
|
||||||
struct ath_softc *sc = container_of(work, struct ath_softc, hw_check_work);
|
|
||||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
unsigned long flags;
|
|
||||||
int busy;
|
|
||||||
u8 is_alive, nbeacon = 1;
|
|
||||||
enum ath_reset_type type;
|
enum ath_reset_type type;
|
||||||
|
bool is_alive;
|
||||||
|
|
||||||
ath9k_ps_wakeup(sc);
|
ath9k_ps_wakeup(sc);
|
||||||
|
|
||||||
is_alive = ath9k_hw_check_alive(sc->sc_ah);
|
is_alive = ath9k_hw_check_alive(sc->sc_ah);
|
||||||
|
|
||||||
if ((is_alive && !AR_SREV_9300(sc->sc_ah)) || sc->tx99_state)
|
if (!is_alive) {
|
||||||
goto out;
|
|
||||||
else if (!is_alive && AR_SREV_9300(sc->sc_ah)) {
|
|
||||||
ath_dbg(common, RESET,
|
ath_dbg(common, RESET,
|
||||||
"DCU stuck is detected. Schedule chip reset\n");
|
"HW hang detected, schedule chip reset\n");
|
||||||
type = RESET_TYPE_MAC_HANG;
|
type = RESET_TYPE_MAC_HANG;
|
||||||
goto sched_reset;
|
ath9k_queue_reset(sc, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&common->cc_lock, flags);
|
|
||||||
busy = ath_update_survey_stats(sc);
|
|
||||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
|
||||||
|
|
||||||
ath_dbg(common, RESET, "Possible baseband hang, busy=%d (try %d)\n",
|
|
||||||
busy, sc->hw_busy_count + 1);
|
|
||||||
if (busy >= 99) {
|
|
||||||
if (++sc->hw_busy_count >= 3) {
|
|
||||||
type = RESET_TYPE_BB_HANG;
|
|
||||||
goto sched_reset;
|
|
||||||
}
|
|
||||||
} else if (busy >= 0) {
|
|
||||||
sc->hw_busy_count = 0;
|
|
||||||
nbeacon = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
ath_start_rx_poll(sc, nbeacon);
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
sched_reset:
|
|
||||||
ath9k_queue_reset(sc, type);
|
|
||||||
out:
|
|
||||||
ath9k_ps_restore(sc);
|
ath9k_ps_restore(sc);
|
||||||
|
|
||||||
|
return is_alive;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -161,29 +137,6 @@ void ath_hw_pll_work(struct work_struct *work)
|
||||||
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* RX Polling - monitors baseband hangs.
|
|
||||||
*/
|
|
||||||
void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon)
|
|
||||||
{
|
|
||||||
if (!AR_SREV_9300(sc->sc_ah))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
|
|
||||||
return;
|
|
||||||
|
|
||||||
mod_timer(&sc->rx_poll_timer, jiffies + msecs_to_jiffies
|
|
||||||
(nbeacon * sc->cur_beacon_conf.beacon_interval));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ath_rx_poll(unsigned long data)
|
|
||||||
{
|
|
||||||
struct ath_softc *sc = (struct ath_softc *)data;
|
|
||||||
|
|
||||||
if (!test_bit(SC_OP_INVALID, &sc->sc_flags))
|
|
||||||
ieee80211_queue_work(sc->hw, &sc->hw_check_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PA Pre-distortion.
|
* PA Pre-distortion.
|
||||||
*/
|
*/
|
||||||
|
@ -409,10 +362,10 @@ void ath_ani_calibrate(unsigned long data)
|
||||||
|
|
||||||
/* Call ANI routine if necessary */
|
/* Call ANI routine if necessary */
|
||||||
if (aniflag) {
|
if (aniflag) {
|
||||||
spin_lock_irqsave(&common->cc_lock, flags);
|
spin_lock(&common->cc_lock);
|
||||||
ath9k_hw_ani_monitor(ah, ah->curchan);
|
ath9k_hw_ani_monitor(ah, ah->curchan);
|
||||||
ath_update_survey_stats(sc);
|
ath_update_survey_stats(sc);
|
||||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
spin_unlock(&common->cc_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Perform calibration if necessary */
|
/* Perform calibration if necessary */
|
||||||
|
|
|
@ -922,11 +922,29 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah)
|
||||||
mask2 |= AR_IMR_S2_CST;
|
mask2 |= AR_IMR_S2_CST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ah->config.hw_hang_checks & HW_BB_WATCHDOG) {
|
||||||
|
if (ints & ATH9K_INT_BB_WATCHDOG) {
|
||||||
|
mask |= AR_IMR_BCNMISC;
|
||||||
|
mask2 |= AR_IMR_S2_BB_WATCHDOG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ath_dbg(common, INTERRUPT, "new IMR 0x%x\n", mask);
|
ath_dbg(common, INTERRUPT, "new IMR 0x%x\n", mask);
|
||||||
REG_WRITE(ah, AR_IMR, mask);
|
REG_WRITE(ah, AR_IMR, mask);
|
||||||
ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC |
|
ah->imrs2_reg &= ~(AR_IMR_S2_TIM |
|
||||||
AR_IMR_S2_CABEND | AR_IMR_S2_CABTO |
|
AR_IMR_S2_DTIM |
|
||||||
AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST);
|
AR_IMR_S2_DTIMSYNC |
|
||||||
|
AR_IMR_S2_CABEND |
|
||||||
|
AR_IMR_S2_CABTO |
|
||||||
|
AR_IMR_S2_TSFOOR |
|
||||||
|
AR_IMR_S2_GTT |
|
||||||
|
AR_IMR_S2_CST);
|
||||||
|
|
||||||
|
if (ah->config.hw_hang_checks & HW_BB_WATCHDOG) {
|
||||||
|
if (ints & ATH9K_INT_BB_WATCHDOG)
|
||||||
|
ah->imrs2_reg &= ~AR_IMR_S2_BB_WATCHDOG;
|
||||||
|
}
|
||||||
|
|
||||||
ah->imrs2_reg |= mask2;
|
ah->imrs2_reg |= mask2;
|
||||||
REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
|
REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,6 @@ void ath9k_ps_restore(struct ath_softc *sc)
|
||||||
static void __ath_cancel_work(struct ath_softc *sc)
|
static void __ath_cancel_work(struct ath_softc *sc)
|
||||||
{
|
{
|
||||||
cancel_work_sync(&sc->paprd_work);
|
cancel_work_sync(&sc->paprd_work);
|
||||||
cancel_work_sync(&sc->hw_check_work);
|
|
||||||
cancel_delayed_work_sync(&sc->tx_complete_work);
|
cancel_delayed_work_sync(&sc->tx_complete_work);
|
||||||
cancel_delayed_work_sync(&sc->hw_pll_work);
|
cancel_delayed_work_sync(&sc->hw_pll_work);
|
||||||
|
|
||||||
|
@ -194,7 +193,6 @@ void ath_restart_work(struct ath_softc *sc)
|
||||||
ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
|
ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
|
||||||
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
||||||
|
|
||||||
ath_start_rx_poll(sc, 3);
|
|
||||||
ath_start_ani(sc);
|
ath_start_ani(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,11 +202,7 @@ static bool ath_prepare_reset(struct ath_softc *sc)
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
ieee80211_stop_queues(sc->hw);
|
ieee80211_stop_queues(sc->hw);
|
||||||
|
|
||||||
sc->hw_busy_count = 0;
|
|
||||||
ath_stop_ani(sc);
|
ath_stop_ani(sc);
|
||||||
del_timer_sync(&sc->rx_poll_timer);
|
|
||||||
|
|
||||||
ath9k_hw_disable_interrupts(ah);
|
ath9k_hw_disable_interrupts(ah);
|
||||||
|
|
||||||
if (!ath_drain_all_txq(sc))
|
if (!ath_drain_all_txq(sc))
|
||||||
|
@ -336,7 +330,6 @@ static int ath_set_channel(struct ath_softc *sc, struct cfg80211_chan_def *chand
|
||||||
struct ieee80211_hw *hw = sc->hw;
|
struct ieee80211_hw *hw = sc->hw;
|
||||||
struct ath9k_channel *hchan;
|
struct ath9k_channel *hchan;
|
||||||
struct ieee80211_channel *chan = chandef->chan;
|
struct ieee80211_channel *chan = chandef->chan;
|
||||||
unsigned long flags;
|
|
||||||
bool offchannel;
|
bool offchannel;
|
||||||
int pos = chan->hw_value;
|
int pos = chan->hw_value;
|
||||||
int old_pos = -1;
|
int old_pos = -1;
|
||||||
|
@ -354,9 +347,9 @@ static int ath_set_channel(struct ath_softc *sc, struct cfg80211_chan_def *chand
|
||||||
chan->center_freq, chandef->width);
|
chan->center_freq, chandef->width);
|
||||||
|
|
||||||
/* update survey stats for the old channel before switching */
|
/* update survey stats for the old channel before switching */
|
||||||
spin_lock_irqsave(&common->cc_lock, flags);
|
spin_lock_bh(&common->cc_lock);
|
||||||
ath_update_survey_stats(sc);
|
ath_update_survey_stats(sc);
|
||||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
spin_unlock_bh(&common->cc_lock);
|
||||||
|
|
||||||
ath9k_cmn_get_channel(hw, ah, chandef);
|
ath9k_cmn_get_channel(hw, ah, chandef);
|
||||||
|
|
||||||
|
@ -427,12 +420,6 @@ static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||||
an->vif = vif;
|
an->vif = vif;
|
||||||
|
|
||||||
ath_tx_node_init(sc, an);
|
ath_tx_node_init(sc, an);
|
||||||
|
|
||||||
if (sta->ht_cap.ht_supported) {
|
|
||||||
an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
|
||||||
sta->ht_cap.ampdu_factor);
|
|
||||||
an->mpdudensity = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta)
|
static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta)
|
||||||
|
@ -454,14 +441,8 @@ void ath9k_tasklet(unsigned long data)
|
||||||
ath9k_ps_wakeup(sc);
|
ath9k_ps_wakeup(sc);
|
||||||
spin_lock(&sc->sc_pcu_lock);
|
spin_lock(&sc->sc_pcu_lock);
|
||||||
|
|
||||||
if ((status & ATH9K_INT_FATAL) ||
|
if (status & ATH9K_INT_FATAL) {
|
||||||
(status & ATH9K_INT_BB_WATCHDOG)) {
|
type = RESET_TYPE_FATAL_INT;
|
||||||
|
|
||||||
if (status & ATH9K_INT_FATAL)
|
|
||||||
type = RESET_TYPE_FATAL_INT;
|
|
||||||
else
|
|
||||||
type = RESET_TYPE_BB_WATCHDOG;
|
|
||||||
|
|
||||||
ath9k_queue_reset(sc, type);
|
ath9k_queue_reset(sc, type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -473,6 +454,28 @@ void ath9k_tasklet(unsigned long data)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ah->config.hw_hang_checks & HW_BB_WATCHDOG) &&
|
||||||
|
(status & ATH9K_INT_BB_WATCHDOG)) {
|
||||||
|
spin_lock(&common->cc_lock);
|
||||||
|
ath_hw_cycle_counters_update(common);
|
||||||
|
ar9003_hw_bb_watchdog_dbg_info(ah);
|
||||||
|
spin_unlock(&common->cc_lock);
|
||||||
|
|
||||||
|
if (ar9003_hw_bb_watchdog_check(ah)) {
|
||||||
|
type = RESET_TYPE_BB_WATCHDOG;
|
||||||
|
ath9k_queue_reset(sc, type);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Increment the ref. counter here so that
|
||||||
|
* interrupts are enabled in the reset routine.
|
||||||
|
*/
|
||||||
|
atomic_inc(&ah->intr_ref_cnt);
|
||||||
|
ath_dbg(common, ANY,
|
||||||
|
"BB_WATCHDOG: Skipping interrupts\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&sc->sc_pm_lock, flags);
|
spin_lock_irqsave(&sc->sc_pm_lock, flags);
|
||||||
if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
|
if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
|
||||||
/*
|
/*
|
||||||
|
@ -541,7 +544,7 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||||
struct ath_hw *ah = sc->sc_ah;
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
struct ath_common *common = ath9k_hw_common(ah);
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
enum ath9k_int status;
|
enum ath9k_int status;
|
||||||
u32 sync_cause;
|
u32 sync_cause = 0;
|
||||||
bool sched = false;
|
bool sched = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -593,16 +596,9 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||||
!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
|
!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
|
||||||
goto chip_reset;
|
goto chip_reset;
|
||||||
|
|
||||||
if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) &&
|
if ((ah->config.hw_hang_checks & HW_BB_WATCHDOG) &&
|
||||||
(status & ATH9K_INT_BB_WATCHDOG)) {
|
(status & ATH9K_INT_BB_WATCHDOG))
|
||||||
|
|
||||||
spin_lock(&common->cc_lock);
|
|
||||||
ath_hw_cycle_counters_update(common);
|
|
||||||
ar9003_hw_bb_watchdog_dbg_info(ah);
|
|
||||||
spin_unlock(&common->cc_lock);
|
|
||||||
|
|
||||||
goto chip_reset;
|
goto chip_reset;
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_ATH9K_WOW
|
#ifdef CONFIG_ATH9K_WOW
|
||||||
if (status & ATH9K_INT_BMISS) {
|
if (status & ATH9K_INT_BMISS) {
|
||||||
|
@ -732,11 +728,13 @@ static int ath9k_start(struct ieee80211_hw *hw)
|
||||||
|
|
||||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
|
if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
|
||||||
ah->imask |= ATH9K_INT_RXHP |
|
ah->imask |= ATH9K_INT_RXHP |
|
||||||
ATH9K_INT_RXLP |
|
ATH9K_INT_RXLP;
|
||||||
ATH9K_INT_BB_WATCHDOG;
|
|
||||||
else
|
else
|
||||||
ah->imask |= ATH9K_INT_RX;
|
ah->imask |= ATH9K_INT_RX;
|
||||||
|
|
||||||
|
if (ah->config.hw_hang_checks & HW_BB_WATCHDOG)
|
||||||
|
ah->imask |= ATH9K_INT_BB_WATCHDOG;
|
||||||
|
|
||||||
ah->imask |= ATH9K_INT_GTT;
|
ah->imask |= ATH9K_INT_GTT;
|
||||||
|
|
||||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)
|
if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)
|
||||||
|
@ -860,7 +858,6 @@ static void ath9k_stop(struct ieee80211_hw *hw)
|
||||||
mutex_lock(&sc->mutex);
|
mutex_lock(&sc->mutex);
|
||||||
|
|
||||||
ath_cancel_work(sc);
|
ath_cancel_work(sc);
|
||||||
del_timer_sync(&sc->rx_poll_timer);
|
|
||||||
|
|
||||||
if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
|
if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
|
||||||
ath_dbg(common, ANY, "Device not present\n");
|
ath_dbg(common, ANY, "Device not present\n");
|
||||||
|
@ -1791,13 +1788,12 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
||||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct ieee80211_channel *chan;
|
struct ieee80211_channel *chan;
|
||||||
unsigned long flags;
|
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
if (config_enabled(CONFIG_ATH9K_TX99))
|
if (config_enabled(CONFIG_ATH9K_TX99))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
spin_lock_irqsave(&common->cc_lock, flags);
|
spin_lock_bh(&common->cc_lock);
|
||||||
if (idx == 0)
|
if (idx == 0)
|
||||||
ath_update_survey_stats(sc);
|
ath_update_survey_stats(sc);
|
||||||
|
|
||||||
|
@ -1811,7 +1807,7 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
||||||
sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
|
sband = hw->wiphy->bands[IEEE80211_BAND_5GHZ];
|
||||||
|
|
||||||
if (!sband || idx >= sband->n_channels) {
|
if (!sband || idx >= sband->n_channels) {
|
||||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
spin_unlock_bh(&common->cc_lock);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1819,7 +1815,7 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
||||||
pos = chan->hw_value;
|
pos = chan->hw_value;
|
||||||
memcpy(survey, &sc->survey[pos], sizeof(*survey));
|
memcpy(survey, &sc->survey[pos], sizeof(*survey));
|
||||||
survey->channel = chan;
|
survey->channel = chan;
|
||||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
spin_unlock_bh(&common->cc_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -409,6 +409,16 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
0x11AD, /* LITEON */
|
0x11AD, /* LITEON */
|
||||||
0x0632),
|
0x0632),
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x11AD, /* LITEON */
|
||||||
|
0x06B2),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x11AD, /* LITEON */
|
||||||
|
0x0842),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
0x11AD, /* LITEON */
|
0x11AD, /* LITEON */
|
||||||
|
@ -424,6 +434,16 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
0x1B9A, /* XAVI */
|
0x1B9A, /* XAVI */
|
||||||
0x2812),
|
0x2812),
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x1B9A, /* XAVI */
|
||||||
|
0x28A1),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_AZWAVE,
|
||||||
|
0x218A),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_1ANT },
|
||||||
|
|
||||||
/* WB335 1-ANT / Antenna Diversity */
|
/* WB335 1-ANT / Antenna Diversity */
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
@ -466,6 +486,11 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
0x11AD, /* LITEON */
|
0x11AD, /* LITEON */
|
||||||
0x0662),
|
0x0662),
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x11AD, /* LITEON */
|
||||||
|
0x06A2),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
0x11AD, /* LITEON */
|
0x11AD, /* LITEON */
|
||||||
|
@ -476,16 +501,6 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
PCI_VENDOR_ID_AZWAVE,
|
PCI_VENDOR_ID_AZWAVE,
|
||||||
0x213A),
|
0x213A),
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
|
||||||
0x0036,
|
|
||||||
PCI_VENDOR_ID_LENOVO,
|
|
||||||
0x3026),
|
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
|
||||||
0x0036,
|
|
||||||
PCI_VENDOR_ID_LENOVO,
|
|
||||||
0x4026),
|
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_HP,
|
PCI_VENDOR_ID_HP,
|
||||||
|
@ -504,37 +519,35 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_DELL,
|
PCI_VENDOR_ID_DELL,
|
||||||
0x020E),
|
0x020C),
|
||||||
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
|
||||||
/* WB335 2-ANT */
|
/* WB335 2-ANT / Antenna-Diversity */
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_SAMSUNG,
|
PCI_VENDOR_ID_SAMSUNG,
|
||||||
0x411A),
|
0x411A),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_SAMSUNG,
|
PCI_VENDOR_ID_SAMSUNG,
|
||||||
0x411B),
|
0x411B),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_SAMSUNG,
|
PCI_VENDOR_ID_SAMSUNG,
|
||||||
0x411C),
|
0x411C),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_SAMSUNG,
|
PCI_VENDOR_ID_SAMSUNG,
|
||||||
0x411D),
|
0x411D),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_SAMSUNG,
|
PCI_VENDOR_ID_SAMSUNG,
|
||||||
0x411E),
|
0x411E),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
|
||||||
/* WB335 2-ANT / Antenna-Diversity */
|
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_ATHEROS,
|
PCI_VENDOR_ID_ATHEROS,
|
||||||
|
@ -560,11 +573,31 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
0x11AD, /* LITEON */
|
0x11AD, /* LITEON */
|
||||||
0x0612),
|
0x0612),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x11AD, /* LITEON */
|
||||||
|
0x0832),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x11AD, /* LITEON */
|
||||||
|
0x0692),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
PCI_VENDOR_ID_AZWAVE,
|
PCI_VENDOR_ID_AZWAVE,
|
||||||
0x2130),
|
0x2130),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_AZWAVE,
|
||||||
|
0x213B),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_AZWAVE,
|
||||||
|
0x2182),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
0x144F, /* ASKEY */
|
0x144F, /* ASKEY */
|
||||||
|
@ -575,6 +608,11 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
0x1B9A, /* XAVI */
|
0x1B9A, /* XAVI */
|
||||||
0x2810),
|
0x2810),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
0x1B9A, /* XAVI */
|
||||||
|
0x28A2),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
0x0036,
|
0x0036,
|
||||||
0x185F, /* WNC */
|
0x185F, /* WNC */
|
||||||
|
@ -590,6 +628,31 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
||||||
PCI_VENDOR_ID_FOXCONN,
|
PCI_VENDOR_ID_FOXCONN,
|
||||||
0xE07F),
|
0xE07F),
|
||||||
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_FOXCONN,
|
||||||
|
0xE081),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_LENOVO,
|
||||||
|
0x3026),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_LENOVO,
|
||||||
|
0x4026),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_ASUSTEK,
|
||||||
|
0x85F2),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
0x0036,
|
||||||
|
PCI_VENDOR_ID_DELL,
|
||||||
|
0x020E),
|
||||||
|
.driver_data = ATH9K_PCI_AR9565_2ANT | ATH9K_PCI_BT_ANT_DIV },
|
||||||
|
|
||||||
/* PCI-E AR9565 (WB335) */
|
/* PCI-E AR9565 (WB335) */
|
||||||
{ PCI_VDEVICE(ATHEROS, 0x0036),
|
{ PCI_VDEVICE(ATHEROS, 0x0036),
|
||||||
|
|
|
@ -419,7 +419,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
|
||||||
rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL;
|
rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AR_SREV_9550(sc->sc_ah))
|
if (AR_SREV_9550(sc->sc_ah) || AR_SREV_9531(sc->sc_ah))
|
||||||
rfilt |= ATH9K_RX_FILTER_4ADDRESS;
|
rfilt |= ATH9K_RX_FILTER_4ADDRESS;
|
||||||
|
|
||||||
return rfilt;
|
return rfilt;
|
||||||
|
@ -850,20 +850,15 @@ static int ath9k_process_rate(struct ath_common *common,
|
||||||
enum ieee80211_band band;
|
enum ieee80211_band band;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
struct ath_softc __maybe_unused *sc = common->priv;
|
struct ath_softc __maybe_unused *sc = common->priv;
|
||||||
|
struct ath_hw *ah = sc->sc_ah;
|
||||||
|
|
||||||
band = hw->conf.chandef.chan->band;
|
band = ah->curchan->chan->band;
|
||||||
sband = hw->wiphy->bands[band];
|
sband = hw->wiphy->bands[band];
|
||||||
|
|
||||||
switch (hw->conf.chandef.width) {
|
if (IS_CHAN_QUARTER_RATE(ah->curchan))
|
||||||
case NL80211_CHAN_WIDTH_5:
|
|
||||||
rxs->flag |= RX_FLAG_5MHZ;
|
rxs->flag |= RX_FLAG_5MHZ;
|
||||||
break;
|
else if (IS_CHAN_HALF_RATE(ah->curchan))
|
||||||
case NL80211_CHAN_WIDTH_10:
|
|
||||||
rxs->flag |= RX_FLAG_10MHZ;
|
rxs->flag |= RX_FLAG_10MHZ;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rx_stats->rs_rate & 0x80) {
|
if (rx_stats->rs_rate & 0x80) {
|
||||||
/* HT rate */
|
/* HT rate */
|
||||||
|
@ -982,7 +977,7 @@ static bool ath9k_is_mybeacon(struct ath_softc *sc, struct ieee80211_hdr *hdr)
|
||||||
if (ieee80211_is_beacon(hdr->frame_control)) {
|
if (ieee80211_is_beacon(hdr->frame_control)) {
|
||||||
RX_STAT_INC(rx_beacons);
|
RX_STAT_INC(rx_beacons);
|
||||||
if (!is_zero_ether_addr(common->curbssid) &&
|
if (!is_zero_ether_addr(common->curbssid) &&
|
||||||
ether_addr_equal(hdr->addr3, common->curbssid))
|
ether_addr_equal_64bits(hdr->addr3, common->curbssid))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1077,9 +1072,13 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,
|
||||||
}
|
}
|
||||||
|
|
||||||
rx_stats->is_mybeacon = ath9k_is_mybeacon(sc, hdr);
|
rx_stats->is_mybeacon = ath9k_is_mybeacon(sc, hdr);
|
||||||
if (rx_stats->is_mybeacon) {
|
|
||||||
sc->hw_busy_count = 0;
|
/*
|
||||||
ath_start_rx_poll(sc, 3);
|
* This shouldn't happen, but have a safety check anyway.
|
||||||
|
*/
|
||||||
|
if (WARN_ON(!ah->curchan)) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ath9k_process_rate(common, hw, rx_stats, rx_status)) {
|
if (ath9k_process_rate(common, hw, rx_stats, rx_status)) {
|
||||||
|
@ -1089,8 +1088,8 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,
|
||||||
|
|
||||||
ath9k_process_rssi(common, hw, rx_stats, rx_status);
|
ath9k_process_rssi(common, hw, rx_stats, rx_status);
|
||||||
|
|
||||||
rx_status->band = hw->conf.chandef.chan->band;
|
rx_status->band = ah->curchan->chan->band;
|
||||||
rx_status->freq = hw->conf.chandef.chan->center_freq;
|
rx_status->freq = ah->curchan->chan->center_freq;
|
||||||
rx_status->antenna = rx_stats->rs_antenna;
|
rx_status->antenna = rx_stats->rs_antenna;
|
||||||
rx_status->flag |= RX_FLAG_MACTIME_END;
|
rx_status->flag |= RX_FLAG_MACTIME_END;
|
||||||
|
|
||||||
|
|
|
@ -304,6 +304,7 @@
|
||||||
#define AR_IMR_S2 0x00ac
|
#define AR_IMR_S2 0x00ac
|
||||||
#define AR_IMR_S2_QCU_TXURN 0x000003FF
|
#define AR_IMR_S2_QCU_TXURN 0x000003FF
|
||||||
#define AR_IMR_S2_QCU_TXURN_S 0
|
#define AR_IMR_S2_QCU_TXURN_S 0
|
||||||
|
#define AR_IMR_S2_BB_WATCHDOG 0x00010000
|
||||||
#define AR_IMR_S2_CST 0x00400000
|
#define AR_IMR_S2_CST 0x00400000
|
||||||
#define AR_IMR_S2_GTT 0x00800000
|
#define AR_IMR_S2_GTT 0x00800000
|
||||||
#define AR_IMR_S2_TIM 0x01000000
|
#define AR_IMR_S2_TIM 0x01000000
|
||||||
|
@ -812,6 +813,9 @@
|
||||||
#define AR_SREV_REVISION_9565_101 1
|
#define AR_SREV_REVISION_9565_101 1
|
||||||
#define AR_SREV_REVISION_9565_11 2
|
#define AR_SREV_REVISION_9565_11 2
|
||||||
#define AR_SREV_VERSION_9550 0x400
|
#define AR_SREV_VERSION_9550 0x400
|
||||||
|
#define AR_SREV_VERSION_9531 0x500
|
||||||
|
#define AR_SREV_REVISION_9531_10 0
|
||||||
|
#define AR_SREV_REVISION_9531_11 1
|
||||||
|
|
||||||
#define AR_SREV_5416(_ah) \
|
#define AR_SREV_5416(_ah) \
|
||||||
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) || \
|
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) || \
|
||||||
|
@ -945,11 +949,19 @@
|
||||||
#define AR_SREV_9580(_ah) \
|
#define AR_SREV_9580(_ah) \
|
||||||
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \
|
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \
|
||||||
((_ah)->hw_version.macRev >= AR_SREV_REVISION_9580_10))
|
((_ah)->hw_version.macRev >= AR_SREV_REVISION_9580_10))
|
||||||
|
|
||||||
#define AR_SREV_9580_10(_ah) \
|
#define AR_SREV_9580_10(_ah) \
|
||||||
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \
|
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \
|
||||||
((_ah)->hw_version.macRev == AR_SREV_REVISION_9580_10))
|
((_ah)->hw_version.macRev == AR_SREV_REVISION_9580_10))
|
||||||
|
|
||||||
|
#define AR_SREV_9531(_ah) \
|
||||||
|
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9531))
|
||||||
|
#define AR_SREV_9531_10(_ah) \
|
||||||
|
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9531) && \
|
||||||
|
((_ah)->hw_version.macRev == AR_SREV_REVISION_9531_10))
|
||||||
|
#define AR_SREV_9531_11(_ah) \
|
||||||
|
(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9531) && \
|
||||||
|
((_ah)->hw_version.macRev == AR_SREV_REVISION_9531_11))
|
||||||
|
|
||||||
/* NOTE: When adding chips newer than Peacock, add chip check here */
|
/* NOTE: When adding chips newer than Peacock, add chip check here */
|
||||||
#define AR_SREV_9580_10_OR_LATER(_ah) \
|
#define AR_SREV_9580_10_OR_LATER(_ah) \
|
||||||
(AR_SREV_9580(_ah))
|
(AR_SREV_9580(_ah))
|
||||||
|
|
|
@ -497,7 +497,7 @@ static int remove_buf_file_handler(struct dentry *dentry)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rchan_callbacks rfs_spec_scan_cb = {
|
static struct rchan_callbacks rfs_spec_scan_cb = {
|
||||||
.create_buf_file = create_buf_file_handler,
|
.create_buf_file = create_buf_file_handler,
|
||||||
.remove_buf_file = remove_buf_file_handler,
|
.remove_buf_file = remove_buf_file_handler,
|
||||||
};
|
};
|
||||||
|
|
|
@ -197,7 +197,6 @@ int ath9k_suspend(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
ath_cancel_work(sc);
|
ath_cancel_work(sc);
|
||||||
ath_stop_ani(sc);
|
ath_stop_ani(sc);
|
||||||
del_timer_sync(&sc->rx_poll_timer);
|
|
||||||
|
|
||||||
if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
|
if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
|
||||||
ath_dbg(common, ANY, "Device not present\n");
|
ath_dbg(common, ANY, "Device not present\n");
|
||||||
|
|
|
@ -774,11 +774,6 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
|
||||||
if (bt_aggr_limit)
|
if (bt_aggr_limit)
|
||||||
aggr_limit = bt_aggr_limit;
|
aggr_limit = bt_aggr_limit;
|
||||||
|
|
||||||
/*
|
|
||||||
* h/w can accept aggregates up to 16 bit lengths (65535).
|
|
||||||
* The IE, however can hold up to 65536, which shows up here
|
|
||||||
* as zero. Ignore 65536 since we are constrained by hw.
|
|
||||||
*/
|
|
||||||
if (tid->an->maxampdu)
|
if (tid->an->maxampdu)
|
||||||
aggr_limit = min(aggr_limit, tid->an->maxampdu);
|
aggr_limit = min(aggr_limit, tid->an->maxampdu);
|
||||||
|
|
||||||
|
@ -1403,8 +1398,8 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||||
* has already been added.
|
* has already been added.
|
||||||
*/
|
*/
|
||||||
if (sta->ht_cap.ht_supported) {
|
if (sta->ht_cap.ht_supported) {
|
||||||
an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
an->maxampdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||||
sta->ht_cap.ampdu_factor);
|
sta->ht_cap.ampdu_factor)) - 1;
|
||||||
density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
|
density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
|
||||||
an->mpdudensity = density;
|
an->mpdudensity = density;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
|
@ -536,7 +535,7 @@ static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* and only beacons from the associated BSSID, please */
|
/* and only beacons from the associated BSSID, please */
|
||||||
if (!ether_addr_equal(hdr->addr3, ar->common.curbssid) ||
|
if (!ether_addr_equal_64bits(hdr->addr3, ar->common.curbssid) ||
|
||||||
!ar->common.curaid)
|
!ar->common.curaid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -602,8 +601,8 @@ static void carl9170_ba_check(struct ar9170 *ar, void *data, unsigned int len)
|
||||||
|
|
||||||
if (bar->start_seq_num == entry_bar->start_seq_num &&
|
if (bar->start_seq_num == entry_bar->start_seq_num &&
|
||||||
TID_CHECK(bar->control, entry_bar->control) &&
|
TID_CHECK(bar->control, entry_bar->control) &&
|
||||||
ether_addr_equal(bar->ra, entry_bar->ta) &&
|
ether_addr_equal_64bits(bar->ra, entry_bar->ta) &&
|
||||||
ether_addr_equal(bar->ta, entry_bar->ra)) {
|
ether_addr_equal_64bits(bar->ta, entry_bar->ra)) {
|
||||||
struct ieee80211_tx_info *tx_info;
|
struct ieee80211_tx_info *tx_info;
|
||||||
|
|
||||||
tx_info = IEEE80211_SKB_CB(entry_skb);
|
tx_info = IEEE80211_SKB_CB(entry_skb);
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
|
|
|
@ -156,6 +156,19 @@ void wil6210_enable_irq(struct wil6210_priv *wil)
|
||||||
iowrite32(WIL_ICR_ICC_VALUE, wil->csr + HOSTADDR(RGF_DMA_EP_MISC_ICR) +
|
iowrite32(WIL_ICR_ICC_VALUE, wil->csr + HOSTADDR(RGF_DMA_EP_MISC_ICR) +
|
||||||
offsetof(struct RGF_ICR, ICC));
|
offsetof(struct RGF_ICR, ICC));
|
||||||
|
|
||||||
|
/* interrupt moderation parameters */
|
||||||
|
if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) {
|
||||||
|
/* disable interrupt moderation for monitor
|
||||||
|
* to get better timestamp precision
|
||||||
|
*/
|
||||||
|
iowrite32(0, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL));
|
||||||
|
} else {
|
||||||
|
iowrite32(WIL6210_ITR_TRSH,
|
||||||
|
wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH));
|
||||||
|
iowrite32(BIT_DMA_ITR_CNT_CRL_EN,
|
||||||
|
wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL));
|
||||||
|
}
|
||||||
|
|
||||||
wil6210_unmask_irq_pseudo(wil);
|
wil6210_unmask_irq_pseudo(wil);
|
||||||
wil6210_unmask_irq_tx(wil);
|
wil6210_unmask_irq_tx(wil);
|
||||||
wil6210_unmask_irq_rx(wil);
|
wil6210_unmask_irq_rx(wil);
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <linux/ip.h>
|
#include <linux/ip.h>
|
||||||
#include <linux/ipv6.h>
|
#include <linux/ipv6.h>
|
||||||
#include <net/ipv6.h>
|
#include <net/ipv6.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
|
|
||||||
#include "wil6210.h"
|
#include "wil6210.h"
|
||||||
#include "wmi.h"
|
#include "wmi.h"
|
||||||
|
@ -377,6 +378,8 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
|
||||||
}
|
}
|
||||||
skb_trim(skb, dmalen);
|
skb_trim(skb, dmalen);
|
||||||
|
|
||||||
|
prefetch(skb->data);
|
||||||
|
|
||||||
wil_hex_dump_txrx("Rx ", DUMP_PREFIX_OFFSET, 16, 1,
|
wil_hex_dump_txrx("Rx ", DUMP_PREFIX_OFFSET, 16, 1,
|
||||||
skb->data, skb_headlen(skb), false);
|
skb->data, skb_headlen(skb), false);
|
||||||
|
|
||||||
|
@ -673,9 +676,12 @@ static int wil_tx_desc_offload_cksum_set(struct wil6210_priv *wil,
|
||||||
if (skb->ip_summed != CHECKSUM_PARTIAL)
|
if (skb->ip_summed != CHECKSUM_PARTIAL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
d->dma.b11 = ETH_HLEN; /* MAC header length */
|
||||||
|
|
||||||
switch (skb->protocol) {
|
switch (skb->protocol) {
|
||||||
case cpu_to_be16(ETH_P_IP):
|
case cpu_to_be16(ETH_P_IP):
|
||||||
protocol = ip_hdr(skb)->protocol;
|
protocol = ip_hdr(skb)->protocol;
|
||||||
|
d->dma.b11 |= BIT(DMA_CFG_DESC_TX_OFFLOAD_CFG_L3T_IPV4_POS);
|
||||||
break;
|
break;
|
||||||
case cpu_to_be16(ETH_P_IPV6):
|
case cpu_to_be16(ETH_P_IPV6):
|
||||||
protocol = ipv6_hdr(skb)->nexthdr;
|
protocol = ipv6_hdr(skb)->nexthdr;
|
||||||
|
@ -701,8 +707,6 @@ static int wil_tx_desc_offload_cksum_set(struct wil6210_priv *wil,
|
||||||
}
|
}
|
||||||
|
|
||||||
d->dma.ip_length = skb_network_header_len(skb);
|
d->dma.ip_length = skb_network_header_len(skb);
|
||||||
d->dma.b11 = ETH_HLEN; /* MAC header length */
|
|
||||||
d->dma.b11 |= BIT(DMA_CFG_DESC_TX_OFFLOAD_CFG_L3T_IPV4_POS);
|
|
||||||
/* Enable TCP/UDP checksum */
|
/* Enable TCP/UDP checksum */
|
||||||
d->dma.d0 |= BIT(DMA_CFG_DESC_TX_0_TCP_UDP_CHECKSUM_EN_POS);
|
d->dma.d0 |= BIT(DMA_CFG_DESC_TX_0_TCP_UDP_CHECKSUM_EN_POS);
|
||||||
/* Calculate pseudo-header */
|
/* Calculate pseudo-header */
|
||||||
|
|
|
@ -39,6 +39,7 @@ static inline u32 WIL_GET_BITS(u32 x, int b0, int b1)
|
||||||
#define WIL6210_MAX_TX_RINGS (24) /* HW limit */
|
#define WIL6210_MAX_TX_RINGS (24) /* HW limit */
|
||||||
#define WIL6210_MAX_CID (8) /* HW limit */
|
#define WIL6210_MAX_CID (8) /* HW limit */
|
||||||
#define WIL6210_NAPI_BUDGET (16) /* arbitrary */
|
#define WIL6210_NAPI_BUDGET (16) /* arbitrary */
|
||||||
|
#define WIL6210_ITR_TRSH (10000) /* arbitrary - about 15 IRQs/msec */
|
||||||
|
|
||||||
/* Hardware definitions begin */
|
/* Hardware definitions begin */
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
|
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#ifdef __IN_PCMCIA_PACKAGE__
|
#ifdef __IN_PCMCIA_PACKAGE__
|
||||||
#include <pcmcia/k_compat.h>
|
#include <pcmcia/k_compat.h>
|
||||||
#endif
|
#endif
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include "atmel.h"
|
#include "atmel.h"
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,6 @@ struct brcmf_proto_bcdc_dcmd {
|
||||||
__le32 status; /* status code returned from the device */
|
__le32 status; /* status code returned from the device */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Max valid buffer size that can be sent to the dongle */
|
|
||||||
#define BCDC_MAX_MSG_SIZE (ETH_FRAME_LEN+ETH_FCS_LEN)
|
|
||||||
|
|
||||||
/* BCDC flag definitions */
|
/* BCDC flag definitions */
|
||||||
#define BCDC_DCMD_ERROR 0x01 /* 1=cmd failed */
|
#define BCDC_DCMD_ERROR 0x01 /* 1=cmd failed */
|
||||||
#define BCDC_DCMD_SET 0x02 /* 0=get, 1=set cmd */
|
#define BCDC_DCMD_SET 0x02 /* 0=get, 1=set cmd */
|
||||||
|
@ -133,9 +130,12 @@ brcmf_proto_bcdc_msg(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
|
||||||
if (buf)
|
if (buf)
|
||||||
memcpy(bcdc->buf, buf, len);
|
memcpy(bcdc->buf, buf, len);
|
||||||
|
|
||||||
|
len += sizeof(*msg);
|
||||||
|
if (len > BRCMF_TX_IOCTL_MAX_MSG_SIZE)
|
||||||
|
len = BRCMF_TX_IOCTL_MAX_MSG_SIZE;
|
||||||
|
|
||||||
/* Send request */
|
/* Send request */
|
||||||
return brcmf_bus_txctl(drvr->bus_if, (unsigned char *)&bcdc->msg,
|
return brcmf_bus_txctl(drvr->bus_if, (unsigned char *)&bcdc->msg, len);
|
||||||
len + sizeof(struct brcmf_proto_bcdc_dcmd));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int brcmf_proto_bcdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len)
|
static int brcmf_proto_bcdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len)
|
||||||
|
|
|
@ -47,8 +47,6 @@
|
||||||
|
|
||||||
#define SDIOH_API_ACCESS_RETRY_LIMIT 2
|
#define SDIOH_API_ACCESS_RETRY_LIMIT 2
|
||||||
|
|
||||||
#define SDIO_VENDOR_ID_BROADCOM 0x02d0
|
|
||||||
|
|
||||||
#define DMA_ALIGN_MASK 0x03
|
#define DMA_ALIGN_MASK 0x03
|
||||||
|
|
||||||
#define SDIO_FUNC1_BLOCKSIZE 64
|
#define SDIO_FUNC1_BLOCKSIZE 64
|
||||||
|
@ -216,94 +214,104 @@ static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func,
|
||||||
return err_ret;
|
return err_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int brcmf_sdiod_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw,
|
static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn,
|
||||||
uint func, uint regaddr, u8 *byte)
|
u32 addr, u8 regsz, void *data, bool write)
|
||||||
{
|
{
|
||||||
int err_ret;
|
struct sdio_func *func;
|
||||||
|
int ret;
|
||||||
brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x\n", rw, func, regaddr);
|
|
||||||
|
|
||||||
brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_byte_wait);
|
|
||||||
if (brcmf_sdiod_pm_resume_error(sdiodev))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (rw && func == 0) {
|
|
||||||
/* handle F0 separately */
|
|
||||||
err_ret = brcmf_sdiod_f0_writeb(sdiodev->func[func],
|
|
||||||
regaddr, *byte);
|
|
||||||
} else {
|
|
||||||
if (rw) /* CMD52 Write */
|
|
||||||
sdio_writeb(sdiodev->func[func], *byte, regaddr,
|
|
||||||
&err_ret);
|
|
||||||
else if (func == 0) {
|
|
||||||
*byte = sdio_f0_readb(sdiodev->func[func], regaddr,
|
|
||||||
&err_ret);
|
|
||||||
} else {
|
|
||||||
*byte = sdio_readb(sdiodev->func[func], regaddr,
|
|
||||||
&err_ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err_ret) {
|
|
||||||
/*
|
|
||||||
* SleepCSR register access can fail when
|
|
||||||
* waking up the device so reduce this noise
|
|
||||||
* in the logs.
|
|
||||||
*/
|
|
||||||
if (regaddr != SBSDIO_FUNC1_SLEEPCSR)
|
|
||||||
brcmf_err("Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n",
|
|
||||||
rw ? "write" : "read", func, regaddr, *byte,
|
|
||||||
err_ret);
|
|
||||||
else
|
|
||||||
brcmf_dbg(SDIO, "Failed to %s byte F%d:@0x%05x=%02x, Err: %d\n",
|
|
||||||
rw ? "write" : "read", func, regaddr, *byte,
|
|
||||||
err_ret);
|
|
||||||
}
|
|
||||||
return err_ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int brcmf_sdiod_request_word(struct brcmf_sdio_dev *sdiodev, uint rw,
|
|
||||||
uint func, uint addr, u32 *word,
|
|
||||||
uint nbytes)
|
|
||||||
{
|
|
||||||
int err_ret = -EIO;
|
|
||||||
|
|
||||||
if (func == 0) {
|
|
||||||
brcmf_err("Only CMD52 allowed to F0\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n",
|
brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n",
|
||||||
rw, func, addr, nbytes);
|
write, fn, addr, regsz);
|
||||||
|
|
||||||
brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_word_wait);
|
brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_word_wait);
|
||||||
if (brcmf_sdiod_pm_resume_error(sdiodev))
|
if (brcmf_sdiod_pm_resume_error(sdiodev))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (rw) { /* CMD52 Write */
|
/* only allow byte access on F0 */
|
||||||
if (nbytes == 4)
|
if (WARN_ON(regsz > 1 && !fn))
|
||||||
sdio_writel(sdiodev->func[func], *word, addr,
|
return -EINVAL;
|
||||||
&err_ret);
|
func = sdiodev->func[fn];
|
||||||
else if (nbytes == 2)
|
|
||||||
sdio_writew(sdiodev->func[func], (*word & 0xFFFF),
|
switch (regsz) {
|
||||||
addr, &err_ret);
|
case sizeof(u8):
|
||||||
|
if (write) {
|
||||||
|
if (fn)
|
||||||
|
sdio_writeb(func, *(u8 *)data, addr, &ret);
|
||||||
|
else
|
||||||
|
ret = brcmf_sdiod_f0_writeb(func, addr,
|
||||||
|
*(u8 *)data);
|
||||||
|
} else {
|
||||||
|
if (fn)
|
||||||
|
*(u8 *)data = sdio_readb(func, addr, &ret);
|
||||||
|
else
|
||||||
|
*(u8 *)data = sdio_f0_readb(func, addr, &ret);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case sizeof(u16):
|
||||||
|
if (write)
|
||||||
|
sdio_writew(func, *(u16 *)data, addr, &ret);
|
||||||
else
|
else
|
||||||
brcmf_err("Invalid nbytes: %d\n", nbytes);
|
*(u16 *)data = sdio_readw(func, addr, &ret);
|
||||||
} else { /* CMD52 Read */
|
break;
|
||||||
if (nbytes == 4)
|
case sizeof(u32):
|
||||||
*word = sdio_readl(sdiodev->func[func], addr, &err_ret);
|
if (write)
|
||||||
else if (nbytes == 2)
|
sdio_writel(func, *(u32 *)data, addr, &ret);
|
||||||
*word = sdio_readw(sdiodev->func[func], addr,
|
|
||||||
&err_ret) & 0xFFFF;
|
|
||||||
else
|
else
|
||||||
brcmf_err("Invalid nbytes: %d\n", nbytes);
|
*(u32 *)data = sdio_readl(func, addr, &ret);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
brcmf_err("invalid size: %d\n", regsz);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err_ret)
|
if (ret) {
|
||||||
brcmf_err("Failed to %s word, Err: 0x%08x\n",
|
/*
|
||||||
rw ? "write" : "read", err_ret);
|
* SleepCSR register access can fail when
|
||||||
|
* waking up the device so reduce this noise
|
||||||
|
* in the logs.
|
||||||
|
*/
|
||||||
|
if (addr != SBSDIO_FUNC1_SLEEPCSR)
|
||||||
|
brcmf_err("failed to %s data F%d@0x%05x, err: %d\n",
|
||||||
|
write ? "write" : "read", fn, addr, ret);
|
||||||
|
else
|
||||||
|
brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
|
||||||
|
write ? "write" : "read", fn, addr, ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return err_ret;
|
static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
||||||
|
u8 regsz, void *data, bool write)
|
||||||
|
{
|
||||||
|
u8 func_num;
|
||||||
|
s32 retry = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* figure out how to read the register based on address range
|
||||||
|
* 0x00 ~ 0x7FF: function 0 CCCR and FBR
|
||||||
|
* 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
|
||||||
|
* The rest: function 1 silicon backplane core registers
|
||||||
|
*/
|
||||||
|
if ((addr & ~REG_F0_REG_MASK) == 0)
|
||||||
|
func_num = SDIO_FUNC_0;
|
||||||
|
else
|
||||||
|
func_num = SDIO_FUNC_1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (!write)
|
||||||
|
memset(data, 0, regsz);
|
||||||
|
/* for retry wait for 1 ms till bus get settled down */
|
||||||
|
if (retry)
|
||||||
|
usleep_range(1000, 2000);
|
||||||
|
ret = brcmf_sdiod_request_data(sdiodev, func_num, addr, regsz,
|
||||||
|
data, write);
|
||||||
|
} while (ret != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
|
||||||
|
|
||||||
|
if (ret != 0)
|
||||||
|
brcmf_err("failed with %d\n", ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -311,24 +319,17 @@ brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
|
||||||
{
|
{
|
||||||
int err = 0, i;
|
int err = 0, i;
|
||||||
u8 addr[3];
|
u8 addr[3];
|
||||||
s32 retry;
|
|
||||||
|
|
||||||
addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
|
addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
|
||||||
addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK;
|
addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK;
|
||||||
addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
|
addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
retry = 0;
|
err = brcmf_sdiod_regrw_helper(sdiodev,
|
||||||
do {
|
SBSDIO_FUNC1_SBADDRLOW + i,
|
||||||
if (retry)
|
sizeof(u8), &addr[i], true);
|
||||||
usleep_range(1000, 2000);
|
|
||||||
err = brcmf_sdiod_request_byte(sdiodev, SDIOH_WRITE,
|
|
||||||
SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW + i,
|
|
||||||
&addr[i]);
|
|
||||||
} while (err != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
|
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
brcmf_err("failed at addr:0x%0x\n",
|
brcmf_err("failed at addr: 0x%0x\n",
|
||||||
SBSDIO_FUNC1_SBADDRLOW + i);
|
SBSDIO_FUNC1_SBADDRLOW + i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -359,61 +360,14 @@ brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
|
||||||
void *data, bool write)
|
|
||||||
{
|
|
||||||
u8 func_num, reg_size;
|
|
||||||
s32 retry = 0;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* figure out how to read the register based on address range
|
|
||||||
* 0x00 ~ 0x7FF: function 0 CCCR and FBR
|
|
||||||
* 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
|
|
||||||
* The rest: function 1 silicon backplane core registers
|
|
||||||
*/
|
|
||||||
if ((addr & ~REG_F0_REG_MASK) == 0) {
|
|
||||||
func_num = SDIO_FUNC_0;
|
|
||||||
reg_size = 1;
|
|
||||||
} else if ((addr & ~REG_F1_MISC_MASK) == 0) {
|
|
||||||
func_num = SDIO_FUNC_1;
|
|
||||||
reg_size = 1;
|
|
||||||
} else {
|
|
||||||
func_num = SDIO_FUNC_1;
|
|
||||||
reg_size = 4;
|
|
||||||
|
|
||||||
ret = brcmf_sdiod_addrprep(sdiodev, reg_size, &addr);
|
|
||||||
if (ret)
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (!write)
|
|
||||||
memset(data, 0, reg_size);
|
|
||||||
if (retry) /* wait for 1 ms till bus get settled down */
|
|
||||||
usleep_range(1000, 2000);
|
|
||||||
if (reg_size == 1)
|
|
||||||
ret = brcmf_sdiod_request_byte(sdiodev, write,
|
|
||||||
func_num, addr, data);
|
|
||||||
else
|
|
||||||
ret = brcmf_sdiod_request_word(sdiodev, write,
|
|
||||||
func_num, addr, data, 4);
|
|
||||||
} while (ret != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
|
|
||||||
|
|
||||||
done:
|
|
||||||
if (ret != 0)
|
|
||||||
brcmf_err("failed with %d\n", ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
|
u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
|
||||||
{
|
{
|
||||||
u8 data;
|
u8 data;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
|
brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
|
||||||
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, false);
|
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
|
||||||
|
false);
|
||||||
brcmf_dbg(SDIO, "data:0x%02x\n", data);
|
brcmf_dbg(SDIO, "data:0x%02x\n", data);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -428,9 +382,14 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
|
brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
|
||||||
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, false);
|
retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr);
|
||||||
|
if (retval)
|
||||||
|
goto done;
|
||||||
|
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
|
||||||
|
false);
|
||||||
brcmf_dbg(SDIO, "data:0x%08x\n", data);
|
brcmf_dbg(SDIO, "data:0x%08x\n", data);
|
||||||
|
|
||||||
|
done:
|
||||||
if (ret)
|
if (ret)
|
||||||
*ret = retval;
|
*ret = retval;
|
||||||
|
|
||||||
|
@ -443,8 +402,8 @@ void brcmf_sdiod_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
|
brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
|
||||||
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, true);
|
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
|
||||||
|
true);
|
||||||
if (ret)
|
if (ret)
|
||||||
*ret = retval;
|
*ret = retval;
|
||||||
}
|
}
|
||||||
|
@ -455,8 +414,13 @@ void brcmf_sdiod_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr,
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
|
brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
|
||||||
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, &data, true);
|
retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr);
|
||||||
|
if (retval)
|
||||||
|
goto done;
|
||||||
|
retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
|
||||||
|
true);
|
||||||
|
|
||||||
|
done:
|
||||||
if (ret)
|
if (ret)
|
||||||
*ret = retval;
|
*ret = retval;
|
||||||
}
|
}
|
||||||
|
@ -879,8 +843,8 @@ int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn)
|
||||||
brcmf_dbg(SDIO, "Enter\n");
|
brcmf_dbg(SDIO, "Enter\n");
|
||||||
|
|
||||||
/* issue abort cmd52 command through F0 */
|
/* issue abort cmd52 command through F0 */
|
||||||
brcmf_sdiod_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0,
|
brcmf_sdiod_request_data(sdiodev, SDIO_FUNC_0, SDIO_CCCR_ABORT,
|
||||||
SDIO_CCCR_ABORT, &t_func);
|
sizeof(t_func), &t_func, true);
|
||||||
|
|
||||||
brcmf_dbg(SDIO, "Exit\n");
|
brcmf_dbg(SDIO, "Exit\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -981,6 +945,7 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
|
||||||
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4329)},
|
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4329)},
|
||||||
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330)},
|
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4330)},
|
||||||
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334)},
|
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_4334)},
|
||||||
|
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, SDIO_DEVICE_ID_BROADCOM_43362)},
|
||||||
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM,
|
{SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM,
|
||||||
SDIO_DEVICE_ID_BROADCOM_4335_4339)},
|
SDIO_DEVICE_ID_BROADCOM_4335_4339)},
|
||||||
{ /* end: all zeroes */ },
|
{ /* end: all zeroes */ },
|
||||||
|
@ -1037,7 +1002,6 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
|
||||||
sdiodev->pdata = brcmfmac_sdio_pdata;
|
sdiodev->pdata = brcmfmac_sdio_pdata;
|
||||||
|
|
||||||
atomic_set(&sdiodev->suspend, false);
|
atomic_set(&sdiodev->suspend, false);
|
||||||
init_waitqueue_head(&sdiodev->request_byte_wait);
|
|
||||||
init_waitqueue_head(&sdiodev->request_word_wait);
|
init_waitqueue_head(&sdiodev->request_word_wait);
|
||||||
init_waitqueue_head(&sdiodev->request_buffer_wait);
|
init_waitqueue_head(&sdiodev->request_buffer_wait);
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
#ifndef _BRCMF_H_
|
#ifndef _BRCMF_H_
|
||||||
#define _BRCMF_H_
|
#define _BRCMF_H_
|
||||||
|
|
||||||
#define BRCMF_VERSION_STR "4.218.248.5"
|
|
||||||
|
|
||||||
#include "fweh.h"
|
#include "fweh.h"
|
||||||
|
|
||||||
#define TOE_TX_CSUM_OL 0x00000001
|
#define TOE_TX_CSUM_OL 0x00000001
|
||||||
|
@ -39,6 +37,11 @@
|
||||||
#define BRCMF_DCMD_MEDLEN 1536
|
#define BRCMF_DCMD_MEDLEN 1536
|
||||||
#define BRCMF_DCMD_MAXLEN 8192
|
#define BRCMF_DCMD_MAXLEN 8192
|
||||||
|
|
||||||
|
/* IOCTL from host to device are limited in lenght. A device can only handle
|
||||||
|
* ethernet frame size. This limitation is to be applied by protocol layer.
|
||||||
|
*/
|
||||||
|
#define BRCMF_TX_IOCTL_MAX_MSG_SIZE (ETH_FRAME_LEN+ETH_FCS_LEN)
|
||||||
|
|
||||||
#define BRCMF_AMPDU_RX_REORDER_MAXFLOWS 256
|
#define BRCMF_AMPDU_RX_REORDER_MAXFLOWS 256
|
||||||
|
|
||||||
/* Length of firmware version string stored for
|
/* Length of firmware version string stored for
|
||||||
|
|
|
@ -32,15 +32,6 @@
|
||||||
#define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40
|
#define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40
|
||||||
#define BRCMF_DEFAULT_PACKET_FILTER "100 0 0 0 0x01 0x00"
|
#define BRCMF_DEFAULT_PACKET_FILTER "100 0 0 0 0x01 0x00"
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
static const char brcmf_version[] =
|
|
||||||
"Dongle Host Driver, version " BRCMF_VERSION_STR "\nCompiled on "
|
|
||||||
__DATE__ " at " __TIME__;
|
|
||||||
#else
|
|
||||||
static const char brcmf_version[] =
|
|
||||||
"Dongle Host Driver, version " BRCMF_VERSION_STR;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
|
bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
|
||||||
struct sk_buff *pkt, int prec)
|
struct sk_buff *pkt, int prec)
|
||||||
|
|
|
@ -702,7 +702,7 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
|
||||||
|
|
||||||
brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
|
brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
|
||||||
|
|
||||||
ndev->destructor = free_netdev;
|
ndev->destructor = brcmf_cfg80211_free_netdev;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -859,8 +859,6 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)
|
||||||
}
|
}
|
||||||
/* unregister will take care of freeing it */
|
/* unregister will take care of freeing it */
|
||||||
unregister_netdev(ifp->ndev);
|
unregister_netdev(ifp->ndev);
|
||||||
if (bssidx == 0)
|
|
||||||
brcmf_cfg80211_detach(drvr->config);
|
|
||||||
} else {
|
} else {
|
||||||
kfree(ifp);
|
kfree(ifp);
|
||||||
}
|
}
|
||||||
|
@ -963,8 +961,7 @@ int brcmf_bus_start(struct device *dev)
|
||||||
fail:
|
fail:
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
brcmf_err("failed: %d\n", ret);
|
brcmf_err("failed: %d\n", ret);
|
||||||
if (drvr->config)
|
brcmf_cfg80211_detach(drvr->config);
|
||||||
brcmf_cfg80211_detach(drvr->config);
|
|
||||||
if (drvr->fws) {
|
if (drvr->fws) {
|
||||||
brcmf_fws_del_interface(ifp);
|
brcmf_fws_del_interface(ifp);
|
||||||
brcmf_fws_deinit(drvr);
|
brcmf_fws_deinit(drvr);
|
||||||
|
@ -1039,6 +1036,8 @@ void brcmf_detach(struct device *dev)
|
||||||
brcmf_del_if(drvr, i);
|
brcmf_del_if(drvr, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
brcmf_cfg80211_detach(drvr->config);
|
||||||
|
|
||||||
brcmf_bus_detach(drvr);
|
brcmf_bus_detach(drvr);
|
||||||
|
|
||||||
brcmf_proto_detach(drvr);
|
brcmf_proto_detach(drvr);
|
||||||
|
|
|
@ -509,6 +509,8 @@ enum brcmf_sdio_frmtype {
|
||||||
#define BCM4334_NVRAM_NAME "brcm/brcmfmac4334-sdio.txt"
|
#define BCM4334_NVRAM_NAME "brcm/brcmfmac4334-sdio.txt"
|
||||||
#define BCM4335_FIRMWARE_NAME "brcm/brcmfmac4335-sdio.bin"
|
#define BCM4335_FIRMWARE_NAME "brcm/brcmfmac4335-sdio.bin"
|
||||||
#define BCM4335_NVRAM_NAME "brcm/brcmfmac4335-sdio.txt"
|
#define BCM4335_NVRAM_NAME "brcm/brcmfmac4335-sdio.txt"
|
||||||
|
#define BCM43362_FIRMWARE_NAME "brcm/brcmfmac43362-sdio.bin"
|
||||||
|
#define BCM43362_NVRAM_NAME "brcm/brcmfmac43362-sdio.txt"
|
||||||
#define BCM4339_FIRMWARE_NAME "brcm/brcmfmac4339-sdio.bin"
|
#define BCM4339_FIRMWARE_NAME "brcm/brcmfmac4339-sdio.bin"
|
||||||
#define BCM4339_NVRAM_NAME "brcm/brcmfmac4339-sdio.txt"
|
#define BCM4339_NVRAM_NAME "brcm/brcmfmac4339-sdio.txt"
|
||||||
|
|
||||||
|
@ -526,6 +528,8 @@ MODULE_FIRMWARE(BCM4334_FIRMWARE_NAME);
|
||||||
MODULE_FIRMWARE(BCM4334_NVRAM_NAME);
|
MODULE_FIRMWARE(BCM4334_NVRAM_NAME);
|
||||||
MODULE_FIRMWARE(BCM4335_FIRMWARE_NAME);
|
MODULE_FIRMWARE(BCM4335_FIRMWARE_NAME);
|
||||||
MODULE_FIRMWARE(BCM4335_NVRAM_NAME);
|
MODULE_FIRMWARE(BCM4335_NVRAM_NAME);
|
||||||
|
MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
|
||||||
|
MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
|
||||||
MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
|
MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
|
||||||
MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
|
MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
|
||||||
|
|
||||||
|
@ -552,6 +556,7 @@ static const struct brcmf_firmware_names brcmf_fwname_data[] = {
|
||||||
{ BCM4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
|
{ BCM4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
|
||||||
{ BCM4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
|
{ BCM4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
|
||||||
{ BCM4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
|
{ BCM4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
|
||||||
|
{ BCM43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
|
||||||
{ BCM4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) }
|
{ BCM4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3384,7 +3389,8 @@ err:
|
||||||
|
|
||||||
static bool brcmf_sdio_sr_capable(struct brcmf_sdio *bus)
|
static bool brcmf_sdio_sr_capable(struct brcmf_sdio *bus)
|
||||||
{
|
{
|
||||||
u32 addr, reg;
|
u32 addr, reg, pmu_cc3_mask = ~0;
|
||||||
|
int err;
|
||||||
|
|
||||||
brcmf_dbg(TRACE, "Enter\n");
|
brcmf_dbg(TRACE, "Enter\n");
|
||||||
|
|
||||||
|
@ -3392,13 +3398,27 @@ static bool brcmf_sdio_sr_capable(struct brcmf_sdio *bus)
|
||||||
if (bus->ci->pmurev < 17)
|
if (bus->ci->pmurev < 17)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* read PMU chipcontrol register 3*/
|
switch (bus->ci->chip) {
|
||||||
addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_addr);
|
case BCM43241_CHIP_ID:
|
||||||
brcmf_sdiod_regwl(bus->sdiodev, addr, 3, NULL);
|
case BCM4335_CHIP_ID:
|
||||||
addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_data);
|
case BCM4339_CHIP_ID:
|
||||||
reg = brcmf_sdiod_regrl(bus->sdiodev, addr, NULL);
|
/* read PMU chipcontrol register 3 */
|
||||||
|
addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_addr);
|
||||||
|
brcmf_sdiod_regwl(bus->sdiodev, addr, 3, NULL);
|
||||||
|
addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_data);
|
||||||
|
reg = brcmf_sdiod_regrl(bus->sdiodev, addr, NULL);
|
||||||
|
return (reg & pmu_cc3_mask) != 0;
|
||||||
|
default:
|
||||||
|
addr = CORE_CC_REG(bus->ci->c_inf[0].base, pmucapabilities_ext);
|
||||||
|
reg = brcmf_sdiod_regrl(bus->sdiodev, addr, &err);
|
||||||
|
if ((reg & PCAPEXT_SR_SUPPORTED_MASK) == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
return (bool)reg;
|
addr = CORE_CC_REG(bus->ci->c_inf[0].base, retention_ctl);
|
||||||
|
reg = brcmf_sdiod_regrl(bus->sdiodev, addr, NULL);
|
||||||
|
return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK |
|
||||||
|
PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void brcmf_sdio_sr_init(struct brcmf_sdio *bus)
|
static void brcmf_sdio_sr_init(struct brcmf_sdio *bus)
|
||||||
|
@ -3615,7 +3635,7 @@ static int brcmf_sdio_bus_init(struct device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we didn't come up, turn off backplane clock */
|
/* If we didn't come up, turn off backplane clock */
|
||||||
if (bus_if->state != BRCMF_BUS_DATA)
|
if (ret != 0)
|
||||||
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
@ -3750,31 +3770,6 @@ static void brcmf_sdio_dataworker(struct work_struct *work)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void brcmf_sdio_release_malloc(struct brcmf_sdio *bus)
|
|
||||||
{
|
|
||||||
brcmf_dbg(TRACE, "Enter\n");
|
|
||||||
|
|
||||||
kfree(bus->rxbuf);
|
|
||||||
bus->rxctl = bus->rxbuf = NULL;
|
|
||||||
bus->rxlen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool brcmf_sdio_probe_malloc(struct brcmf_sdio *bus)
|
|
||||||
{
|
|
||||||
brcmf_dbg(TRACE, "Enter\n");
|
|
||||||
|
|
||||||
if (bus->sdiodev->bus_if->maxctl) {
|
|
||||||
bus->rxblen =
|
|
||||||
roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN),
|
|
||||||
ALIGNMENT) + bus->head_align;
|
|
||||||
bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC);
|
|
||||||
if (!(bus->rxbuf))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
|
brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
|
||||||
{
|
{
|
||||||
|
@ -3888,39 +3883,6 @@ fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool brcmf_sdio_probe_init(struct brcmf_sdio *bus)
|
|
||||||
{
|
|
||||||
brcmf_dbg(TRACE, "Enter\n");
|
|
||||||
|
|
||||||
sdio_claim_host(bus->sdiodev->func[1]);
|
|
||||||
|
|
||||||
/* Disable F2 to clear any intermediate frame state on the dongle */
|
|
||||||
sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
|
|
||||||
|
|
||||||
bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
|
|
||||||
bus->rxflow = false;
|
|
||||||
|
|
||||||
/* Done with backplane-dependent accesses, can drop clock... */
|
|
||||||
brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
|
|
||||||
|
|
||||||
sdio_release_host(bus->sdiodev->func[1]);
|
|
||||||
|
|
||||||
/* ...and initialize clock/power states */
|
|
||||||
bus->clkstate = CLK_SDONLY;
|
|
||||||
bus->idletime = BRCMF_IDLE_INTERVAL;
|
|
||||||
bus->idleclock = BRCMF_IDLE_ACTIVE;
|
|
||||||
|
|
||||||
/* Query the F2 block size, set roundup accordingly */
|
|
||||||
bus->blocksize = bus->sdiodev->func[2]->cur_blksize;
|
|
||||||
bus->roundup = min(max_roundup, bus->blocksize);
|
|
||||||
|
|
||||||
/* SR state */
|
|
||||||
bus->sleeping = false;
|
|
||||||
bus->sr_enabled = false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
brcmf_sdio_watchdog_thread(void *data)
|
brcmf_sdio_watchdog_thread(void *data)
|
||||||
{
|
{
|
||||||
|
@ -3955,24 +3917,6 @@ brcmf_sdio_watchdog(unsigned long data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void brcmf_sdio_release_dongle(struct brcmf_sdio *bus)
|
|
||||||
{
|
|
||||||
brcmf_dbg(TRACE, "Enter\n");
|
|
||||||
|
|
||||||
if (bus->ci) {
|
|
||||||
sdio_claim_host(bus->sdiodev->func[1]);
|
|
||||||
brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
|
|
||||||
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
|
||||||
sdio_release_host(bus->sdiodev->func[1]);
|
|
||||||
brcmf_sdio_chip_detach(&bus->ci);
|
|
||||||
if (bus->vars && bus->varsz)
|
|
||||||
kfree(bus->vars);
|
|
||||||
bus->vars = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
brcmf_dbg(TRACE, "Disconnected\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
|
static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
|
||||||
.stop = brcmf_sdio_bus_stop,
|
.stop = brcmf_sdio_bus_stop,
|
||||||
.preinit = brcmf_sdio_bus_preinit,
|
.preinit = brcmf_sdio_bus_preinit,
|
||||||
|
@ -4066,15 +4010,42 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate buffers */
|
/* Allocate buffers */
|
||||||
if (!(brcmf_sdio_probe_malloc(bus))) {
|
if (bus->sdiodev->bus_if->maxctl) {
|
||||||
brcmf_err("brcmf_sdio_probe_malloc failed\n");
|
bus->rxblen =
|
||||||
goto fail;
|
roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN),
|
||||||
|
ALIGNMENT) + bus->head_align;
|
||||||
|
bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC);
|
||||||
|
if (!(bus->rxbuf)) {
|
||||||
|
brcmf_err("rxbuf allocation failed\n");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(brcmf_sdio_probe_init(bus))) {
|
sdio_claim_host(bus->sdiodev->func[1]);
|
||||||
brcmf_err("brcmf_sdio_probe_init failed\n");
|
|
||||||
goto fail;
|
/* Disable F2 to clear any intermediate frame state on the dongle */
|
||||||
}
|
sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
|
||||||
|
|
||||||
|
bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
|
||||||
|
bus->rxflow = false;
|
||||||
|
|
||||||
|
/* Done with backplane-dependent accesses, can drop clock... */
|
||||||
|
brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
|
||||||
|
|
||||||
|
sdio_release_host(bus->sdiodev->func[1]);
|
||||||
|
|
||||||
|
/* ...and initialize clock/power states */
|
||||||
|
bus->clkstate = CLK_SDONLY;
|
||||||
|
bus->idletime = BRCMF_IDLE_INTERVAL;
|
||||||
|
bus->idleclock = BRCMF_IDLE_ACTIVE;
|
||||||
|
|
||||||
|
/* Query the F2 block size, set roundup accordingly */
|
||||||
|
bus->blocksize = bus->sdiodev->func[2]->cur_blksize;
|
||||||
|
bus->roundup = min(max_roundup, bus->blocksize);
|
||||||
|
|
||||||
|
/* SR state */
|
||||||
|
bus->sleeping = false;
|
||||||
|
bus->sr_enabled = false;
|
||||||
|
|
||||||
brcmf_sdio_debugfs_create(bus);
|
brcmf_sdio_debugfs_create(bus);
|
||||||
brcmf_dbg(INFO, "completed!!\n");
|
brcmf_dbg(INFO, "completed!!\n");
|
||||||
|
@ -4108,12 +4079,20 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
|
||||||
|
|
||||||
if (bus->sdiodev->bus_if->drvr) {
|
if (bus->sdiodev->bus_if->drvr) {
|
||||||
brcmf_detach(bus->sdiodev->dev);
|
brcmf_detach(bus->sdiodev->dev);
|
||||||
brcmf_sdio_release_dongle(bus);
|
}
|
||||||
|
|
||||||
|
if (bus->ci) {
|
||||||
|
sdio_claim_host(bus->sdiodev->func[1]);
|
||||||
|
brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
|
||||||
|
brcmf_sdio_clkctl(bus, CLK_NONE, false);
|
||||||
|
sdio_release_host(bus->sdiodev->func[1]);
|
||||||
|
brcmf_sdio_chip_detach(&bus->ci);
|
||||||
}
|
}
|
||||||
|
|
||||||
brcmu_pkt_buf_free_skb(bus->txglom_sgpad);
|
brcmu_pkt_buf_free_skb(bus->txglom_sgpad);
|
||||||
brcmf_sdio_release_malloc(bus);
|
kfree(bus->rxbuf);
|
||||||
kfree(bus->hdrbuf);
|
kfree(bus->hdrbuf);
|
||||||
|
kfree(bus->vars);
|
||||||
kfree(bus);
|
kfree(bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4131,7 +4110,7 @@ void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* don't start the wd until fw is loaded */
|
/* don't start the wd until fw is loaded */
|
||||||
if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN)
|
if (bus->sdiodev->bus_if->state != BRCMF_BUS_DATA)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (wdtick) {
|
if (wdtick) {
|
||||||
|
|
|
@ -1873,7 +1873,7 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
|
||||||
brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto));
|
brcmf_dbg(DATA, "tx proto=0x%X\n", ntohs(eh->h_proto));
|
||||||
/* determine the priority */
|
/* determine the priority */
|
||||||
if (!skb->priority)
|
if (!skb->priority)
|
||||||
skb->priority = cfg80211_classify8021d(skb);
|
skb->priority = cfg80211_classify8021d(skb, NULL);
|
||||||
|
|
||||||
drvr->tx_multicast += !!multicast;
|
drvr->tx_multicast += !!multicast;
|
||||||
if (pae)
|
if (pae)
|
||||||
|
|
|
@ -1955,21 +1955,21 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg)
|
||||||
err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
|
err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
brcmf_err("set p2p_disc error\n");
|
brcmf_err("set p2p_disc error\n");
|
||||||
brcmf_free_vif(cfg, p2p_vif);
|
brcmf_free_vif(p2p_vif);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
/* obtain bsscfg index for P2P discovery */
|
/* obtain bsscfg index for P2P discovery */
|
||||||
err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
|
err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
brcmf_err("retrieving discover bsscfg index failed\n");
|
brcmf_err("retrieving discover bsscfg index failed\n");
|
||||||
brcmf_free_vif(cfg, p2p_vif);
|
brcmf_free_vif(p2p_vif);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
/* Verify that firmware uses same bssidx as driver !! */
|
/* Verify that firmware uses same bssidx as driver !! */
|
||||||
if (p2p_ifp->bssidx != bssidx) {
|
if (p2p_ifp->bssidx != bssidx) {
|
||||||
brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
|
brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
|
||||||
bssidx, p2p_ifp->bssidx);
|
bssidx, p2p_ifp->bssidx);
|
||||||
brcmf_free_vif(cfg, p2p_vif);
|
brcmf_free_vif(p2p_vif);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1997,7 +1997,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_info *p2p)
|
||||||
brcmf_p2p_cancel_remain_on_channel(vif->ifp);
|
brcmf_p2p_cancel_remain_on_channel(vif->ifp);
|
||||||
brcmf_p2p_deinit_discovery(p2p);
|
brcmf_p2p_deinit_discovery(p2p);
|
||||||
/* remove discovery interface */
|
/* remove discovery interface */
|
||||||
brcmf_free_vif(p2p->cfg, vif);
|
brcmf_free_vif(vif);
|
||||||
p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
|
p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
|
||||||
}
|
}
|
||||||
/* just set it all to zero */
|
/* just set it all to zero */
|
||||||
|
@ -2222,7 +2222,7 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,
|
||||||
return &p2p_vif->wdev;
|
return &p2p_vif->wdev;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
brcmf_free_vif(p2p->cfg, p2p_vif);
|
brcmf_free_vif(p2p_vif);
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2231,31 +2231,12 @@ fail:
|
||||||
*
|
*
|
||||||
* @vif: virtual interface object to delete.
|
* @vif: virtual interface object to delete.
|
||||||
*/
|
*/
|
||||||
static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_info *cfg,
|
static void brcmf_p2p_delete_p2pdev(struct brcmf_p2p_info *p2p,
|
||||||
struct brcmf_cfg80211_vif *vif)
|
struct brcmf_cfg80211_vif *vif)
|
||||||
{
|
{
|
||||||
cfg80211_unregister_wdev(&vif->wdev);
|
cfg80211_unregister_wdev(&vif->wdev);
|
||||||
cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
|
p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;
|
||||||
brcmf_free_vif(cfg, vif);
|
brcmf_free_vif(vif);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* brcmf_p2p_free_p2p_if() - free up net device related data.
|
|
||||||
*
|
|
||||||
* @ndev: net device that needs to be freed.
|
|
||||||
*/
|
|
||||||
static void brcmf_p2p_free_p2p_if(struct net_device *ndev)
|
|
||||||
{
|
|
||||||
struct brcmf_cfg80211_info *cfg;
|
|
||||||
struct brcmf_cfg80211_vif *vif;
|
|
||||||
struct brcmf_if *ifp;
|
|
||||||
|
|
||||||
ifp = netdev_priv(ndev);
|
|
||||||
cfg = ifp->drvr->config;
|
|
||||||
vif = ifp->vif;
|
|
||||||
|
|
||||||
brcmf_free_vif(cfg, vif);
|
|
||||||
free_netdev(ifp->ndev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2335,8 +2316,6 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
|
||||||
brcmf_err("Registering netdevice failed\n");
|
brcmf_err("Registering netdevice failed\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
/* override destructor */
|
|
||||||
ifp->ndev->destructor = brcmf_p2p_free_p2p_if;
|
|
||||||
|
|
||||||
cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
|
cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
|
||||||
/* Disable firmware roaming for P2P interface */
|
/* Disable firmware roaming for P2P interface */
|
||||||
|
@ -2349,7 +2328,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
|
||||||
return &ifp->vif->wdev;
|
return &ifp->vif->wdev;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
brcmf_free_vif(cfg, vif);
|
brcmf_free_vif(vif);
|
||||||
return ERR_PTR(err);
|
return ERR_PTR(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2358,8 +2337,6 @@ fail:
|
||||||
*
|
*
|
||||||
* @wiphy: wiphy device of interface.
|
* @wiphy: wiphy device of interface.
|
||||||
* @wdev: wireless device of interface.
|
* @wdev: wireless device of interface.
|
||||||
*
|
|
||||||
* TODO: not yet supported.
|
|
||||||
*/
|
*/
|
||||||
int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
|
int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||||
{
|
{
|
||||||
|
@ -2385,7 +2362,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NL80211_IFTYPE_P2P_DEVICE:
|
case NL80211_IFTYPE_P2P_DEVICE:
|
||||||
brcmf_p2p_delete_p2pdev(cfg, vif);
|
brcmf_p2p_delete_p2pdev(p2p, vif);
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/mmc/card.h>
|
#include <linux/mmc/card.h>
|
||||||
#include <linux/mmc/sdio_func.h>
|
#include <linux/mmc/sdio_func.h>
|
||||||
|
#include <linux/mmc/sdio_ids.h>
|
||||||
#include <linux/ssb/ssb_regs.h>
|
#include <linux/ssb/ssb_regs.h>
|
||||||
#include <linux/bcma/bcma.h>
|
#include <linux/bcma/bcma.h>
|
||||||
|
|
||||||
|
@ -83,6 +84,24 @@ static const struct sdiod_drive_str sdiod_drvstr_tab1_1v8[] = {
|
||||||
{0, 0x1}
|
{0, 0x1}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* SDIO Drive Strength to sel value table for PMU Rev 13 (1.8v) */
|
||||||
|
static const struct sdiod_drive_str sdiod_drive_strength_tab5_1v8[] = {
|
||||||
|
{6, 0x7},
|
||||||
|
{5, 0x6},
|
||||||
|
{4, 0x5},
|
||||||
|
{3, 0x4},
|
||||||
|
{2, 0x2},
|
||||||
|
{1, 0x1},
|
||||||
|
{0, 0x0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* SDIO Drive Strength to sel value table for PMU Rev 17 (1.8v) */
|
||||||
|
static const struct sdiod_drive_str sdiod_drvstr_tab6_1v8[] = {
|
||||||
|
{3, 0x3},
|
||||||
|
{2, 0x2},
|
||||||
|
{1, 0x1},
|
||||||
|
{0, 0x0} };
|
||||||
|
|
||||||
/* SDIO Drive Strength to sel value table for 43143 PMU Rev 17 (3.3V) */
|
/* SDIO Drive Strength to sel value table for 43143 PMU Rev 17 (3.3V) */
|
||||||
static const struct sdiod_drive_str sdiod_drvstr_tab2_3v3[] = {
|
static const struct sdiod_drive_str sdiod_drvstr_tab2_3v3[] = {
|
||||||
{16, 0x7},
|
{16, 0x7},
|
||||||
|
@ -569,6 +588,23 @@ static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev,
|
||||||
ci->ramsize = 0xc0000;
|
ci->ramsize = 0xc0000;
|
||||||
ci->rambase = 0x180000;
|
ci->rambase = 0x180000;
|
||||||
break;
|
break;
|
||||||
|
case BCM43362_CHIP_ID:
|
||||||
|
ci->c_inf[0].wrapbase = 0x18100000;
|
||||||
|
ci->c_inf[0].cib = 0x27004211;
|
||||||
|
ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
|
||||||
|
ci->c_inf[1].base = 0x18002000;
|
||||||
|
ci->c_inf[1].wrapbase = 0x18102000;
|
||||||
|
ci->c_inf[1].cib = 0x0a004211;
|
||||||
|
ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
|
||||||
|
ci->c_inf[2].base = 0x18004000;
|
||||||
|
ci->c_inf[2].wrapbase = 0x18104000;
|
||||||
|
ci->c_inf[2].cib = 0x08080401;
|
||||||
|
ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
|
||||||
|
ci->c_inf[3].base = 0x18003000;
|
||||||
|
ci->c_inf[3].wrapbase = 0x18103000;
|
||||||
|
ci->c_inf[3].cib = 0x03004211;
|
||||||
|
ci->ramsize = 0x3C000;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
brcmf_err("chipid 0x%x is not supported\n", ci->chip);
|
brcmf_err("chipid 0x%x is not supported\n", ci->chip);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -757,6 +793,11 @@ brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev,
|
||||||
str_mask = 0x00003800;
|
str_mask = 0x00003800;
|
||||||
str_shift = 11;
|
str_shift = 11;
|
||||||
break;
|
break;
|
||||||
|
case SDIOD_DRVSTR_KEY(BCM4334_CHIP_ID, 17):
|
||||||
|
str_tab = sdiod_drvstr_tab6_1v8;
|
||||||
|
str_mask = 0x00001800;
|
||||||
|
str_shift = 11;
|
||||||
|
break;
|
||||||
case SDIOD_DRVSTR_KEY(BCM43143_CHIP_ID, 17):
|
case SDIOD_DRVSTR_KEY(BCM43143_CHIP_ID, 17):
|
||||||
/* note: 43143 does not support tristate */
|
/* note: 43143 does not support tristate */
|
||||||
i = ARRAY_SIZE(sdiod_drvstr_tab2_3v3) - 1;
|
i = ARRAY_SIZE(sdiod_drvstr_tab2_3v3) - 1;
|
||||||
|
@ -769,6 +810,11 @@ brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev,
|
||||||
brcmf_sdio_chip_name(ci->chip, chn, 8),
|
brcmf_sdio_chip_name(ci->chip, chn, 8),
|
||||||
drivestrength);
|
drivestrength);
|
||||||
break;
|
break;
|
||||||
|
case SDIOD_DRVSTR_KEY(BCM43362_CHIP_ID, 13):
|
||||||
|
str_tab = sdiod_drive_strength_tab5_1v8;
|
||||||
|
str_mask = 0x00003800;
|
||||||
|
str_shift = 11;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
brcmf_err("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n",
|
brcmf_err("No SDIO Drive strength init done for chip %s rev %d pmurev %d\n",
|
||||||
brcmf_sdio_chip_name(ci->chip, chn, 8),
|
brcmf_sdio_chip_name(ci->chip, chn, 8),
|
||||||
|
|
|
@ -54,14 +54,6 @@
|
||||||
|
|
||||||
#define BRCMF_MAX_CORENUM 6
|
#define BRCMF_MAX_CORENUM 6
|
||||||
|
|
||||||
/* SDIO device ID */
|
|
||||||
#define SDIO_DEVICE_ID_BROADCOM_43143 43143
|
|
||||||
#define SDIO_DEVICE_ID_BROADCOM_43241 0x4324
|
|
||||||
#define SDIO_DEVICE_ID_BROADCOM_4329 0x4329
|
|
||||||
#define SDIO_DEVICE_ID_BROADCOM_4330 0x4330
|
|
||||||
#define SDIO_DEVICE_ID_BROADCOM_4334 0x4334
|
|
||||||
#define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335
|
|
||||||
|
|
||||||
struct chip_core_info {
|
struct chip_core_info {
|
||||||
u16 id;
|
u16 id;
|
||||||
u16 rev;
|
u16 rev;
|
||||||
|
|
|
@ -167,7 +167,6 @@ struct brcmf_sdio_dev {
|
||||||
u32 sbwad; /* Save backplane window address */
|
u32 sbwad; /* Save backplane window address */
|
||||||
struct brcmf_sdio *bus;
|
struct brcmf_sdio *bus;
|
||||||
atomic_t suspend; /* suspend flag */
|
atomic_t suspend; /* suspend flag */
|
||||||
wait_queue_head_t request_byte_wait;
|
|
||||||
wait_queue_head_t request_word_wait;
|
wait_queue_head_t request_word_wait;
|
||||||
wait_queue_head_t request_buffer_wait;
|
wait_queue_head_t request_buffer_wait;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
|
|
@ -1095,10 +1095,10 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif)
|
||||||
BRCMF_C_DISASSOC, NULL, 0);
|
BRCMF_C_DISASSOC, NULL, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
brcmf_err("WLC_DISASSOC failed (%d)\n", err);
|
brcmf_err("WLC_DISASSOC failed (%d)\n", err);
|
||||||
cfg80211_disconnected(vif->wdev.netdev, 0,
|
|
||||||
NULL, 0, GFP_KERNEL);
|
|
||||||
}
|
}
|
||||||
clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state);
|
clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state);
|
||||||
|
cfg80211_disconnected(vif->wdev.netdev, 0, NULL, 0, GFP_KERNEL);
|
||||||
|
|
||||||
}
|
}
|
||||||
clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
|
clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
|
||||||
clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
|
clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
|
||||||
|
@ -1758,6 +1758,7 @@ brcmf_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *ndev,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
|
clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
|
||||||
|
cfg80211_disconnected(ndev, reason_code, NULL, 0, GFP_KERNEL);
|
||||||
|
|
||||||
memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
|
memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
|
||||||
scbval.val = cpu_to_le32(reason_code);
|
scbval.val = cpu_to_le32(reason_code);
|
||||||
|
@ -4359,9 +4360,6 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||||
{
|
{
|
||||||
struct brcmf_cfg80211_vif *vif;
|
struct brcmf_cfg80211_vif *vif;
|
||||||
|
|
||||||
if (cfg->vif_cnt == BRCMF_IFACE_MAX_CNT)
|
|
||||||
return ERR_PTR(-ENOSPC);
|
|
||||||
|
|
||||||
brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
|
brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
|
||||||
sizeof(*vif));
|
sizeof(*vif));
|
||||||
vif = kzalloc(sizeof(*vif), GFP_KERNEL);
|
vif = kzalloc(sizeof(*vif), GFP_KERNEL);
|
||||||
|
@ -4378,21 +4376,25 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||||
brcmf_init_prof(&vif->profile);
|
brcmf_init_prof(&vif->profile);
|
||||||
|
|
||||||
list_add_tail(&vif->list, &cfg->vif_list);
|
list_add_tail(&vif->list, &cfg->vif_list);
|
||||||
cfg->vif_cnt++;
|
|
||||||
return vif;
|
return vif;
|
||||||
}
|
}
|
||||||
|
|
||||||
void brcmf_free_vif(struct brcmf_cfg80211_info *cfg,
|
void brcmf_free_vif(struct brcmf_cfg80211_vif *vif)
|
||||||
struct brcmf_cfg80211_vif *vif)
|
|
||||||
{
|
{
|
||||||
list_del(&vif->list);
|
list_del(&vif->list);
|
||||||
cfg->vif_cnt--;
|
|
||||||
|
|
||||||
kfree(vif);
|
kfree(vif);
|
||||||
if (!cfg->vif_cnt) {
|
}
|
||||||
wiphy_unregister(cfg->wiphy);
|
|
||||||
wiphy_free(cfg->wiphy);
|
void brcmf_cfg80211_free_netdev(struct net_device *ndev)
|
||||||
}
|
{
|
||||||
|
struct brcmf_cfg80211_vif *vif;
|
||||||
|
struct brcmf_if *ifp;
|
||||||
|
|
||||||
|
ifp = netdev_priv(ndev);
|
||||||
|
vif = ifp->vif;
|
||||||
|
|
||||||
|
brcmf_free_vif(vif);
|
||||||
|
free_netdev(ndev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool brcmf_is_linkup(const struct brcmf_event_msg *e)
|
static bool brcmf_is_linkup(const struct brcmf_event_msg *e)
|
||||||
|
@ -4979,20 +4981,20 @@ cfg80211_p2p_attach_out:
|
||||||
wl_deinit_priv(cfg);
|
wl_deinit_priv(cfg);
|
||||||
|
|
||||||
cfg80211_attach_out:
|
cfg80211_attach_out:
|
||||||
brcmf_free_vif(cfg, vif);
|
brcmf_free_vif(vif);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
|
void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
|
||||||
{
|
{
|
||||||
struct brcmf_cfg80211_vif *vif;
|
if (!cfg)
|
||||||
struct brcmf_cfg80211_vif *tmp;
|
return;
|
||||||
|
|
||||||
wl_deinit_priv(cfg);
|
WARN_ON(!list_empty(&cfg->vif_list));
|
||||||
|
wiphy_unregister(cfg->wiphy);
|
||||||
brcmf_btcoex_detach(cfg);
|
brcmf_btcoex_detach(cfg);
|
||||||
list_for_each_entry_safe(vif, tmp, &cfg->vif_list, list) {
|
wl_deinit_priv(cfg);
|
||||||
brcmf_free_vif(cfg, vif);
|
wiphy_free(cfg->wiphy);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static s32
|
static s32
|
||||||
|
@ -5087,7 +5089,8 @@ dongle_scantime_out:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static s32 brcmf_construct_reginfo(struct brcmf_cfg80211_info *cfg, u32 bw_cap)
|
static s32 brcmf_construct_reginfo(struct brcmf_cfg80211_info *cfg,
|
||||||
|
u32 bw_cap[])
|
||||||
{
|
{
|
||||||
struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
|
||||||
struct ieee80211_channel *band_chan_arr;
|
struct ieee80211_channel *band_chan_arr;
|
||||||
|
@ -5100,7 +5103,6 @@ static s32 brcmf_construct_reginfo(struct brcmf_cfg80211_info *cfg, u32 bw_cap)
|
||||||
enum ieee80211_band band;
|
enum ieee80211_band band;
|
||||||
u32 channel;
|
u32 channel;
|
||||||
u32 *n_cnt;
|
u32 *n_cnt;
|
||||||
bool ht40_allowed;
|
|
||||||
u32 index;
|
u32 index;
|
||||||
u32 ht40_flag;
|
u32 ht40_flag;
|
||||||
bool update;
|
bool update;
|
||||||
|
@ -5133,18 +5135,17 @@ static s32 brcmf_construct_reginfo(struct brcmf_cfg80211_info *cfg, u32 bw_cap)
|
||||||
array_size = ARRAY_SIZE(__wl_2ghz_channels);
|
array_size = ARRAY_SIZE(__wl_2ghz_channels);
|
||||||
n_cnt = &__wl_band_2ghz.n_channels;
|
n_cnt = &__wl_band_2ghz.n_channels;
|
||||||
band = IEEE80211_BAND_2GHZ;
|
band = IEEE80211_BAND_2GHZ;
|
||||||
ht40_allowed = (bw_cap == WLC_N_BW_40ALL);
|
|
||||||
} else if (ch.band == BRCMU_CHAN_BAND_5G) {
|
} else if (ch.band == BRCMU_CHAN_BAND_5G) {
|
||||||
band_chan_arr = __wl_5ghz_a_channels;
|
band_chan_arr = __wl_5ghz_a_channels;
|
||||||
array_size = ARRAY_SIZE(__wl_5ghz_a_channels);
|
array_size = ARRAY_SIZE(__wl_5ghz_a_channels);
|
||||||
n_cnt = &__wl_band_5ghz_a.n_channels;
|
n_cnt = &__wl_band_5ghz_a.n_channels;
|
||||||
band = IEEE80211_BAND_5GHZ;
|
band = IEEE80211_BAND_5GHZ;
|
||||||
ht40_allowed = !(bw_cap == WLC_N_BW_20ALL);
|
|
||||||
} else {
|
} else {
|
||||||
brcmf_err("Invalid channel Sepc. 0x%x.\n", ch.chspec);
|
brcmf_err("Invalid channel Spec. 0x%x.\n", ch.chspec);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!ht40_allowed && ch.bw == BRCMU_CHAN_BW_40)
|
if (!(bw_cap[band] & WLC_BW_40MHZ_BIT) &&
|
||||||
|
ch.bw == BRCMU_CHAN_BW_40)
|
||||||
continue;
|
continue;
|
||||||
update = false;
|
update = false;
|
||||||
for (j = 0; (j < *n_cnt && (*n_cnt < array_size)); j++) {
|
for (j = 0; (j < *n_cnt && (*n_cnt < array_size)); j++) {
|
||||||
|
@ -5162,7 +5163,10 @@ static s32 brcmf_construct_reginfo(struct brcmf_cfg80211_info *cfg, u32 bw_cap)
|
||||||
ieee80211_channel_to_frequency(ch.chnum, band);
|
ieee80211_channel_to_frequency(ch.chnum, band);
|
||||||
band_chan_arr[index].hw_value = ch.chnum;
|
band_chan_arr[index].hw_value = ch.chnum;
|
||||||
|
|
||||||
if (ch.bw == BRCMU_CHAN_BW_40 && ht40_allowed) {
|
brcmf_err("channel %d: f=%d bw=%d sb=%d\n",
|
||||||
|
ch.chnum, band_chan_arr[index].center_freq,
|
||||||
|
ch.bw, ch.sb);
|
||||||
|
if (ch.bw == BRCMU_CHAN_BW_40) {
|
||||||
/* assuming the order is HT20, HT40 Upper,
|
/* assuming the order is HT20, HT40 Upper,
|
||||||
* HT40 lower from chanspecs
|
* HT40 lower from chanspecs
|
||||||
*/
|
*/
|
||||||
|
@ -5213,6 +5217,46 @@ exit:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
|
||||||
|
{
|
||||||
|
u32 band, mimo_bwcap;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
band = WLC_BAND_2G;
|
||||||
|
err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band);
|
||||||
|
if (!err) {
|
||||||
|
bw_cap[IEEE80211_BAND_2GHZ] = band;
|
||||||
|
band = WLC_BAND_5G;
|
||||||
|
err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band);
|
||||||
|
if (!err) {
|
||||||
|
bw_cap[IEEE80211_BAND_5GHZ] = band;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
WARN_ON(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
brcmf_dbg(INFO, "fallback to mimo_bw_cap info\n");
|
||||||
|
mimo_bwcap = 0;
|
||||||
|
err = brcmf_fil_iovar_int_get(ifp, "mimo_bw_cap", &mimo_bwcap);
|
||||||
|
if (err)
|
||||||
|
/* assume 20MHz if firmware does not give a clue */
|
||||||
|
mimo_bwcap = WLC_N_BW_20ALL;
|
||||||
|
|
||||||
|
switch (mimo_bwcap) {
|
||||||
|
case WLC_N_BW_40ALL:
|
||||||
|
bw_cap[IEEE80211_BAND_2GHZ] |= WLC_BW_40MHZ_BIT;
|
||||||
|
/* fall-thru */
|
||||||
|
case WLC_N_BW_20IN2G_40IN5G:
|
||||||
|
bw_cap[IEEE80211_BAND_5GHZ] |= WLC_BW_40MHZ_BIT;
|
||||||
|
/* fall-thru */
|
||||||
|
case WLC_N_BW_20ALL:
|
||||||
|
bw_cap[IEEE80211_BAND_2GHZ] |= WLC_BW_20MHZ_BIT;
|
||||||
|
bw_cap[IEEE80211_BAND_5GHZ] |= WLC_BW_20MHZ_BIT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
brcmf_err("invalid mimo_bw_cap value\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static s32 brcmf_update_wiphybands(struct brcmf_cfg80211_info *cfg)
|
static s32 brcmf_update_wiphybands(struct brcmf_cfg80211_info *cfg)
|
||||||
{
|
{
|
||||||
|
@ -5221,13 +5265,13 @@ static s32 brcmf_update_wiphybands(struct brcmf_cfg80211_info *cfg)
|
||||||
s32 phy_list;
|
s32 phy_list;
|
||||||
u32 band_list[3];
|
u32 band_list[3];
|
||||||
u32 nmode;
|
u32 nmode;
|
||||||
u32 bw_cap = 0;
|
u32 bw_cap[2] = { 0, 0 };
|
||||||
s8 phy;
|
s8 phy;
|
||||||
s32 err;
|
s32 err;
|
||||||
u32 nband;
|
u32 nband;
|
||||||
s32 i;
|
s32 i;
|
||||||
struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS];
|
struct ieee80211_supported_band *bands[2] = { NULL, NULL };
|
||||||
s32 index;
|
struct ieee80211_supported_band *band;
|
||||||
|
|
||||||
err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_PHYLIST,
|
err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_PHYLIST,
|
||||||
&phy_list, sizeof(phy_list));
|
&phy_list, sizeof(phy_list));
|
||||||
|
@ -5253,11 +5297,10 @@ static s32 brcmf_update_wiphybands(struct brcmf_cfg80211_info *cfg)
|
||||||
if (err) {
|
if (err) {
|
||||||
brcmf_err("nmode error (%d)\n", err);
|
brcmf_err("nmode error (%d)\n", err);
|
||||||
} else {
|
} else {
|
||||||
err = brcmf_fil_iovar_int_get(ifp, "mimo_bw_cap", &bw_cap);
|
brcmf_get_bwcap(ifp, bw_cap);
|
||||||
if (err)
|
|
||||||
brcmf_err("mimo_bw_cap error (%d)\n", err);
|
|
||||||
}
|
}
|
||||||
brcmf_dbg(INFO, "nmode=%d, mimo_bw_cap=%d\n", nmode, bw_cap);
|
brcmf_dbg(INFO, "nmode=%d, bw_cap=(%d, %d)\n", nmode,
|
||||||
|
bw_cap[IEEE80211_BAND_2GHZ], bw_cap[IEEE80211_BAND_5GHZ]);
|
||||||
|
|
||||||
err = brcmf_construct_reginfo(cfg, bw_cap);
|
err = brcmf_construct_reginfo(cfg, bw_cap);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -5266,40 +5309,33 @@ static s32 brcmf_update_wiphybands(struct brcmf_cfg80211_info *cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
nband = band_list[0];
|
nband = band_list[0];
|
||||||
memset(bands, 0, sizeof(bands));
|
|
||||||
|
|
||||||
for (i = 1; i <= nband && i < ARRAY_SIZE(band_list); i++) {
|
for (i = 1; i <= nband && i < ARRAY_SIZE(band_list); i++) {
|
||||||
index = -1;
|
band = NULL;
|
||||||
if ((band_list[i] == WLC_BAND_5G) &&
|
if ((band_list[i] == WLC_BAND_5G) &&
|
||||||
(__wl_band_5ghz_a.n_channels > 0)) {
|
(__wl_band_5ghz_a.n_channels > 0))
|
||||||
index = IEEE80211_BAND_5GHZ;
|
band = &__wl_band_5ghz_a;
|
||||||
bands[index] = &__wl_band_5ghz_a;
|
else if ((band_list[i] == WLC_BAND_2G) &&
|
||||||
if ((bw_cap == WLC_N_BW_40ALL) ||
|
(__wl_band_2ghz.n_channels > 0))
|
||||||
(bw_cap == WLC_N_BW_20IN2G_40IN5G))
|
band = &__wl_band_2ghz;
|
||||||
bands[index]->ht_cap.cap |=
|
else
|
||||||
IEEE80211_HT_CAP_SGI_40;
|
continue;
|
||||||
} else if ((band_list[i] == WLC_BAND_2G) &&
|
|
||||||
(__wl_band_2ghz.n_channels > 0)) {
|
|
||||||
index = IEEE80211_BAND_2GHZ;
|
|
||||||
bands[index] = &__wl_band_2ghz;
|
|
||||||
if (bw_cap == WLC_N_BW_40ALL)
|
|
||||||
bands[index]->ht_cap.cap |=
|
|
||||||
IEEE80211_HT_CAP_SGI_40;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((index >= 0) && nmode) {
|
if (bw_cap[band->band] & WLC_BW_40MHZ_BIT) {
|
||||||
bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
|
band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
|
||||||
bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
|
band->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||||
bands[index]->ht_cap.ht_supported = true;
|
|
||||||
bands[index]->ht_cap.ampdu_factor =
|
|
||||||
IEEE80211_HT_MAX_AMPDU_64K;
|
|
||||||
bands[index]->ht_cap.ampdu_density =
|
|
||||||
IEEE80211_HT_MPDU_DENSITY_16;
|
|
||||||
/* An HT shall support all EQM rates for one spatial
|
|
||||||
* stream
|
|
||||||
*/
|
|
||||||
bands[index]->ht_cap.mcs.rx_mask[0] = 0xff;
|
|
||||||
}
|
}
|
||||||
|
band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
|
||||||
|
band->ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
|
||||||
|
band->ht_cap.ht_supported = true;
|
||||||
|
band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
||||||
|
band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
|
||||||
|
/* An HT shall support all EQM rates for one spatial
|
||||||
|
* stream
|
||||||
|
*/
|
||||||
|
band->ht_cap.mcs.rx_mask[0] = 0xff;
|
||||||
|
band->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||||
|
bands[band->band] = band;
|
||||||
}
|
}
|
||||||
|
|
||||||
wiphy = cfg_to_wiphy(cfg);
|
wiphy = cfg_to_wiphy(cfg);
|
||||||
|
|
|
@ -412,7 +412,6 @@ struct brcmf_cfg80211_info {
|
||||||
struct work_struct escan_timeout_work;
|
struct work_struct escan_timeout_work;
|
||||||
u8 *escan_ioctl_buf;
|
u8 *escan_ioctl_buf;
|
||||||
struct list_head vif_list;
|
struct list_head vif_list;
|
||||||
u8 vif_cnt;
|
|
||||||
struct brcmf_cfg80211_vif_event vif_event;
|
struct brcmf_cfg80211_vif_event vif_event;
|
||||||
struct completion vif_disabled;
|
struct completion vif_disabled;
|
||||||
struct brcmu_d11inf d11inf;
|
struct brcmu_d11inf d11inf;
|
||||||
|
@ -487,8 +486,7 @@ enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);
|
||||||
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
|
||||||
enum nl80211_iftype type,
|
enum nl80211_iftype type,
|
||||||
bool pm_block);
|
bool pm_block);
|
||||||
void brcmf_free_vif(struct brcmf_cfg80211_info *cfg,
|
void brcmf_free_vif(struct brcmf_cfg80211_vif *vif);
|
||||||
struct brcmf_cfg80211_vif *vif);
|
|
||||||
|
|
||||||
s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
|
s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
|
||||||
const u8 *vndr_ie_buf, u32 vndr_ie_len);
|
const u8 *vndr_ie_buf, u32 vndr_ie_len);
|
||||||
|
@ -507,5 +505,6 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
|
||||||
bool fw_abort);
|
bool fw_abort);
|
||||||
void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
|
void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
|
||||||
void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
|
void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
|
||||||
|
void brcmf_cfg80211_free_netdev(struct net_device *ndev);
|
||||||
|
|
||||||
#endif /* _wl_cfg80211_h_ */
|
#endif /* _wl_cfg80211_h_ */
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#define BCM4331_CHIP_ID 0x4331
|
#define BCM4331_CHIP_ID 0x4331
|
||||||
#define BCM4334_CHIP_ID 0x4334
|
#define BCM4334_CHIP_ID 0x4334
|
||||||
#define BCM4335_CHIP_ID 0x4335
|
#define BCM4335_CHIP_ID 0x4335
|
||||||
|
#define BCM43362_CHIP_ID 43362
|
||||||
#define BCM4339_CHIP_ID 0x4339
|
#define BCM4339_CHIP_ID 0x4339
|
||||||
|
|
||||||
#endif /* _BRCM_HW_IDS_H_ */
|
#endif /* _BRCM_HW_IDS_H_ */
|
||||||
|
|
|
@ -82,6 +82,20 @@
|
||||||
#define WLC_N_BW_40ALL 1
|
#define WLC_N_BW_40ALL 1
|
||||||
#define WLC_N_BW_20IN2G_40IN5G 2
|
#define WLC_N_BW_20IN2G_40IN5G 2
|
||||||
|
|
||||||
|
#define WLC_BW_20MHZ_BIT BIT(0)
|
||||||
|
#define WLC_BW_40MHZ_BIT BIT(1)
|
||||||
|
#define WLC_BW_80MHZ_BIT BIT(2)
|
||||||
|
#define WLC_BW_160MHZ_BIT BIT(3)
|
||||||
|
|
||||||
|
/* Bandwidth capabilities */
|
||||||
|
#define WLC_BW_CAP_20MHZ (WLC_BW_20MHZ_BIT)
|
||||||
|
#define WLC_BW_CAP_40MHZ (WLC_BW_40MHZ_BIT|WLC_BW_20MHZ_BIT)
|
||||||
|
#define WLC_BW_CAP_80MHZ (WLC_BW_80MHZ_BIT|WLC_BW_40MHZ_BIT| \
|
||||||
|
WLC_BW_20MHZ_BIT)
|
||||||
|
#define WLC_BW_CAP_160MHZ (WLC_BW_160MHZ_BIT|WLC_BW_80MHZ_BIT| \
|
||||||
|
WLC_BW_40MHZ_BIT|WLC_BW_20MHZ_BIT)
|
||||||
|
#define WLC_BW_CAP_UNRESTRICTED 0xFF
|
||||||
|
|
||||||
/* band types */
|
/* band types */
|
||||||
#define WLC_BAND_AUTO 0 /* auto-select */
|
#define WLC_BAND_AUTO 0 /* auto-select */
|
||||||
#define WLC_BAND_5G 1 /* 5 Ghz */
|
#define WLC_BAND_5G 1 /* 5 Ghz */
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
|
|
@ -225,7 +225,7 @@ int cw1200_wow_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||||
cw1200_set_pm(priv, &priv->powersave_mode);
|
cw1200_set_pm(priv, &priv->powersave_mode);
|
||||||
if (wait_event_interruptible_timeout(priv->ps_mode_switch_done,
|
if (wait_event_interruptible_timeout(priv->ps_mode_switch_done,
|
||||||
!priv->ps_mode_switch_in_progress, 1*HZ) <= 0) {
|
!priv->ps_mode_switch_in_progress, 1*HZ) <= 0) {
|
||||||
goto revert3;
|
goto revert4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,11 +254,11 @@ int cw1200_wow_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||||
|
|
||||||
/* Stop serving thread */
|
/* Stop serving thread */
|
||||||
if (cw1200_bh_suspend(priv))
|
if (cw1200_bh_suspend(priv))
|
||||||
goto revert4;
|
goto revert5;
|
||||||
|
|
||||||
ret = timer_pending(&priv->mcast_timeout);
|
ret = timer_pending(&priv->mcast_timeout);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto revert5;
|
goto revert6;
|
||||||
|
|
||||||
/* Store suspend state */
|
/* Store suspend state */
|
||||||
pm_state->suspend_state = state;
|
pm_state->suspend_state = state;
|
||||||
|
@ -280,9 +280,9 @@ int cw1200_wow_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
revert5:
|
revert6:
|
||||||
WARN_ON(cw1200_bh_resume(priv));
|
WARN_ON(cw1200_bh_resume(priv));
|
||||||
revert4:
|
revert5:
|
||||||
cw1200_resume_work(priv, &priv->bss_loss_work,
|
cw1200_resume_work(priv, &priv->bss_loss_work,
|
||||||
state->bss_loss_tmo);
|
state->bss_loss_tmo);
|
||||||
cw1200_resume_work(priv, &priv->join_timeout,
|
cw1200_resume_work(priv, &priv->join_timeout,
|
||||||
|
@ -291,6 +291,7 @@ revert4:
|
||||||
state->direct_probe);
|
state->direct_probe);
|
||||||
cw1200_resume_work(priv, &priv->link_id_gc_work,
|
cw1200_resume_work(priv, &priv->link_id_gc_work,
|
||||||
state->link_id_gc);
|
state->link_id_gc);
|
||||||
|
revert4:
|
||||||
kfree(state);
|
kfree(state);
|
||||||
revert3:
|
revert3:
|
||||||
wsm_set_udp_port_filter(priv, &cw1200_udp_port_filter_off);
|
wsm_set_udp_port_filter(priv, &cw1200_udp_port_filter_off);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#define PRISM2_PCCARD
|
#define PRISM2_PCCARD
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
|
|
|
@ -2567,7 +2567,7 @@ static int prism2_ioctl_priv_prism2_param(struct net_device *dev,
|
||||||
local->passive_scan_interval = value;
|
local->passive_scan_interval = value;
|
||||||
if (timer_pending(&local->passive_scan_timer))
|
if (timer_pending(&local->passive_scan_timer))
|
||||||
del_timer(&local->passive_scan_timer);
|
del_timer(&local->passive_scan_timer);
|
||||||
if (value > 0) {
|
if (value > 0 && value < INT_MAX / HZ) {
|
||||||
local->passive_scan_timer.expires = jiffies +
|
local->passive_scan_timer.expires = jiffies +
|
||||||
local->passive_scan_interval * HZ;
|
local->passive_scan_interval * HZ;
|
||||||
add_timer(&local->passive_scan_timer);
|
add_timer(&local->passive_scan_timer);
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
* Andy Warner <andyw@pobox.com> */
|
* Andy Warner <andyw@pobox.com> */
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/moduleparam.h>
|
#include <linux/moduleparam.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
|
|
@ -1468,7 +1468,7 @@ static inline int is_same_network(struct libipw_network *src,
|
||||||
* as one network */
|
* as one network */
|
||||||
return ((src->ssid_len == dst->ssid_len) &&
|
return ((src->ssid_len == dst->ssid_len) &&
|
||||||
(src->channel == dst->channel) &&
|
(src->channel == dst->channel) &&
|
||||||
ether_addr_equal(src->bssid, dst->bssid) &&
|
ether_addr_equal_64bits(src->bssid, dst->bssid) &&
|
||||||
!memcmp(src->ssid, dst->ssid, src->ssid_len));
|
!memcmp(src->ssid, dst->ssid, src->ssid_len));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
@ -466,10 +465,10 @@ il3945_is_network_packet(struct il_priv *il, struct ieee80211_hdr *header)
|
||||||
switch (il->iw_mode) {
|
switch (il->iw_mode) {
|
||||||
case NL80211_IFTYPE_ADHOC: /* Header: Dest. | Source | BSSID */
|
case NL80211_IFTYPE_ADHOC: /* Header: Dest. | Source | BSSID */
|
||||||
/* packets to our IBSS update information */
|
/* packets to our IBSS update information */
|
||||||
return ether_addr_equal(header->addr3, il->bssid);
|
return ether_addr_equal_64bits(header->addr3, il->bssid);
|
||||||
case NL80211_IFTYPE_STATION: /* Header: Dest. | AP{BSSID} | Source */
|
case NL80211_IFTYPE_STATION: /* Header: Dest. | AP{BSSID} | Source */
|
||||||
/* packets to our IBSS update information */
|
/* packets to our IBSS update information */
|
||||||
return ether_addr_equal(header->addr2, il->bssid);
|
return ether_addr_equal_64bits(header->addr2, il->bssid);
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/lockdep.h>
|
#include <linux/lockdep.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
@ -3746,10 +3745,10 @@ il_full_rxon_required(struct il_priv *il)
|
||||||
|
|
||||||
/* These items are only settable from the full RXON command */
|
/* These items are only settable from the full RXON command */
|
||||||
CHK(!il_is_associated(il));
|
CHK(!il_is_associated(il));
|
||||||
CHK(!ether_addr_equal(staging->bssid_addr, active->bssid_addr));
|
CHK(!ether_addr_equal_64bits(staging->bssid_addr, active->bssid_addr));
|
||||||
CHK(!ether_addr_equal(staging->node_addr, active->node_addr));
|
CHK(!ether_addr_equal_64bits(staging->node_addr, active->node_addr));
|
||||||
CHK(!ether_addr_equal(staging->wlap_bssid_addr,
|
CHK(!ether_addr_equal_64bits(staging->wlap_bssid_addr,
|
||||||
active->wlap_bssid_addr));
|
active->wlap_bssid_addr));
|
||||||
CHK_NEQ(staging->dev_type, active->dev_type);
|
CHK_NEQ(staging->dev_type, active->dev_type);
|
||||||
CHK_NEQ(staging->channel, active->channel);
|
CHK_NEQ(staging->channel, active->channel);
|
||||||
CHK_NEQ(staging->air_propagation, active->air_propagation);
|
CHK_NEQ(staging->air_propagation, active->air_propagation);
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
@ -28,7 +28,6 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include "iwl-io.h"
|
#include "iwl-io.h"
|
||||||
#include "iwl-debug.h"
|
#include "iwl-debug.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -24,7 +24,6 @@
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portionhelp of the ieee80211 subsystem header files.
|
* as portionhelp of the ieee80211 subsystem header files.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2003 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
@ -30,7 +30,6 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include "iwl-io.h"
|
#include "iwl-io.h"
|
||||||
#include "iwl-modparams.h"
|
#include "iwl-modparams.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Portions of this file are derived from the ipw3945 project, as well
|
* Portions of this file are derived from the ipw3945 project, as well
|
||||||
* as portions of the ieee80211 subsystem header files.
|
* as portions of the ieee80211 subsystem header files.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/ieee80211.h>
|
#include <linux/ieee80211.h>
|
||||||
#include "iwl-io.h"
|
#include "iwl-io.h"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -28,7 +28,6 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include "iwl-io.h"
|
#include "iwl-io.h"
|
||||||
#include "iwl-agn-hw.h"
|
#include "iwl-agn-hw.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright(c) 2008 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of version 2 of the GNU General Public License as
|
* under the terms of version 2 of the GNU General Public License as
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* GPL LICENSE SUMMARY
|
* GPL LICENSE SUMMARY
|
||||||
*
|
*
|
||||||
* Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of version 2 of the GNU General Public License as
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* BSD LICENSE
|
* BSD LICENSE
|
||||||
*
|
*
|
||||||
* Copyright(c) 2012 - 2013 Intel Corporation. All rights reserved.
|
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue