[PATCH 06/13] rtw88: fw and efuse files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

fw and efuse files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/efuse.c | 150 +++
 drivers/net/wireless/realtek/rtw88/efuse.h |  53 +++
 drivers/net/wireless/realtek/rtw88/fw.c| 611 +
 drivers/net/wireless/realtek/rtw88/fw.h| 213 ++
 4 files changed, 1027 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/efuse.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/efuse.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/fw.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/fw.h

diff --git a/drivers/net/wireless/realtek/rtw88/efuse.c 
b/drivers/net/wireless/realtek/rtw88/efuse.c
new file mode 100644
index 000..7c1b782
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/efuse.c
@@ -0,0 +1,150 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "efuse.h"
+#include "reg.h"
+#include "debug.h"
+
+#define RTW_EFUSE_BANK_WIFI0x0
+
+static void switch_efuse_bank(struct rtw_dev *rtwdev)
+{
+   rtw_write32_mask(rtwdev, REG_LDO_EFUSE_CTRL, BIT_MASK_EFUSE_BANK_SEL,
+RTW_EFUSE_BANK_WIFI);
+}
+
+static int rtw_dump_logical_efuse_map(struct rtw_dev *rtwdev, u8 *phy_map,
+ u8 *log_map)
+{
+   u32 physical_size = rtwdev->efuse.physical_size;
+   u32 protect_size = rtwdev->efuse.protect_size;
+   u32 logical_size = rtwdev->efuse.logical_size;
+   u32 phy_idx, log_idx;
+   u8 hdr1, hdr2;
+   u8 blk_idx;
+   u8 valid;
+   u8 word_en;
+   int i;
+
+   phy_idx = 0;
+
+   do {
+   hdr1 = *(phy_map + phy_idx);
+   if ((hdr1 & 0x1f) == 0xf) {
+   phy_idx++;
+   hdr2 = *(phy_map + phy_idx);
+   if (hdr2 == 0xff)
+   break;
+   blk_idx = ((hdr2 & 0xf0) >> 1) | ((hdr1 >> 5) & 0x07);
+   word_en = hdr2 & 0x0f;
+   } else {
+   blk_idx = (hdr1 & 0xf0) >> 4;
+   word_en = hdr1 & 0x0f;
+   }
+
+   if (hdr1 == 0xff)
+   break;
+
+   phy_idx++;
+   for (i = 0; i < 4; i++) {
+   valid = (~(word_en >> i)) & 0x1;
+   if (valid != 0x1)
+   continue;
+   log_idx = (blk_idx << 3) + (i << 1);
+   *(log_map + log_idx) = *(phy_map + phy_idx);
+   log_idx++;
+   phy_idx++;
+   *(log_map + log_idx) = *(phy_map + phy_idx);
+   phy_idx++;
+   if (phy_idx > physical_size - protect_size ||
+   log_idx > logical_size)
+   return -EINVAL;
+   }
+   } while (1);
+
+   return 0;
+}
+
+static int rtw_dump_physical_efuse_map(struct rtw_dev *rtwdev, u8 *map)
+{
+   struct rtw_chip_info *chip = rtwdev->chip;
+   u32 size = rtwdev->efuse.physical_size;
+   u32 efuse_ctl;
+   u32 addr;
+   u32 cnt;
+
+   switch_efuse_bank(rtwdev);
+
+   /* disable 2.5V LDO */
+   chip->ops->cfg_ldo25(rtwdev, false);
+
+   efuse_ctl = rtw_read32(rtwdev, REG_EFUSE_CTRL);
+
+   for (addr = 0; addr < size; addr++) {
+   efuse_ctl &= ~(BIT_MASK_EF_DATA | BITS_EF_ADDR);
+   efuse_ctl |= (addr & BIT_MASK_EF_ADDR) << BIT_SHIFT_EF_ADDR;
+   rtw_write32(rtwdev, REG_EFUSE_CTRL, efuse_ctl & (~BIT_EF_FLAG));
+
+   cnt = 100;
+   do {
+   udelay(1);
+   efuse_ctl = rtw_read32(rtwdev, REG_EFUSE_CTRL);
+   if (--cnt == 0)
+   return -EBUSY;
+   } while (!(efuse_ctl & BIT_EF_FLAG));
+
+   *(map + addr) = (u8)(efuse_ctl & BIT_MASK_EF_DATA);
+   }
+
+   return 0;
+}
+
+int rtw_parse_efuse_map(struct rtw_dev *rtwdev)
+{
+   struct rtw_chip_info *chip = rtwdev->chip;
+   struct rtw_efuse *efuse = >efuse;
+   u32 phy_size = efuse->physical_size;
+   u32 log_size = efuse->logical_size;
+   u8 *phy_map = NULL;
+   u8 *log_map = NULL;
+   int ret = 0;
+
+   phy_map = kmalloc(phy_size, GFP_KERNEL);
+   log_map = kmalloc(log_size, GFP_KERNEL);
+   if (!phy_map || !log_map) {
+   ret = -ENOMEM;
+   goto out_free;
+   }
+
+   ret = rtw_dump_physical_efuse_map(rtwdev, phy_map);
+   if (ret) {
+   rtw_err(rtwdev, "failed to dump efuse physical map\n");
+   goto out_free;
+   }
+
+   memset(log_map, 0xff, log_size);
+   ret = rtw_dump_logical_efuse_map(rtwdev, phy_map, 

[PATCH 00/13] rtw88: mac80211 driver for Realtek 802.11ac wireless network chips

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

As rtw88 has been discussed for two months, this is the first PATCH series
for rtw88. The only change with respect to RFC v5 is the debug system.
We move debug log with levels such as rtw_[info/warn/err]() out of the
internal debug flag but leave rtw_dbg() remained in the flag.

As suggested, they should not be turned off based on the debug config flag.
And since they are moved out of the debug flag, the function call is
unnecessary, we can just use macros for them.

The other description about rtw88 are remained below, as the RFC series.

This is a new mac80211 driver for Realtek 802.11ac wireless network chips.
rtw88 supports 8822BE and 8822CE chips, and will be able to support
multi-vif combinations in run-time.

For now, only PCI bus is supported, but rtw88 was originally designed
to optionally support three buses includes USB & SDIO. USB & SDIO modules
will soon be supported by rtw88, with configurable core module to fit
with different bus modules in the same time.

For example, if we choose 8822BE and 8822CU, only PCI & USB modules will
be selected, built, loaded into kernel. This is one of the major
difference from rtlwifi, which can only support specific combinations.

Another difference from rtlwifi is that rtw88 is designed to support
the latest Realtek 802.11ac wireless network chips like 8822B and
8822C series. Compared to the earlier chips supported by rtlwifi like
the 802.11n 8192EE chipset or 802.11ac 8821AE/8812AE chips, newer ICs
have different MAC & PHY settings, such as new multi-port feature for the
MAC layer design and Jaguar2/Jaguar3 PHY layer IPs.

Multi-Port feature is also supported under rtw88's software architecture.
rtlwifi can only support one vif in the same time, most because of the
hardware limitations for early chips, hence the original design of it
also restricts the usage of multi-vif support, so latest chipset seems not
take advantages from its new MAC engine.

However, rtw88 can run multiple vifs concurrently by holding them on
hardware ports provided by MAC engine, hence can easily start different
roles on a single device.

Based on the reasons mentioned before, we implemented rtw88. It had many
authors, they are listed here alphabetically:

Ping-Ke Shih 
Tzu-En Huang 
Yan-Hsuan Chuang 


Yan-Hsuan Chuang (13):
  rtw88: main files
  rtw88: core files
  rtw88: hci files
  rtw88: trx files
  rtw88: mac files
  rtw88: fw and efuse files
  rtw88: phy files
  rtw88: debug files
  rtw88: chip files
  rtw88: 8822B init table
  rtw88: 8822C init table
  rtw88: Kconfig & Makefile
  rtw88: add support for Realtek 802.11ac wireless chips

 MAINTAINERS| 8 +
 drivers/net/wireless/realtek/Kconfig   | 1 +
 drivers/net/wireless/realtek/Makefile  | 1 +
 drivers/net/wireless/realtek/rtw88/Kconfig |55 +
 drivers/net/wireless/realtek/rtw88/Makefile|19 +
 drivers/net/wireless/realtek/rtw88/debug.c |   631 +
 drivers/net/wireless/realtek/rtw88/debug.h |35 +
 drivers/net/wireless/realtek/rtw88/efuse.c |   150 +
 drivers/net/wireless/realtek/rtw88/efuse.h |53 +
 drivers/net/wireless/realtek/rtw88/fw.c|   611 +
 drivers/net/wireless/realtek/rtw88/fw.h|   213 +
 drivers/net/wireless/realtek/rtw88/hci.h   |   211 +
 drivers/net/wireless/realtek/rtw88/mac.c   |  1010 +
 drivers/net/wireless/realtek/rtw88/mac.h   |35 +
 drivers/net/wireless/realtek/rtw88/mac80211.c  |   480 +
 drivers/net/wireless/realtek/rtw88/main.c  |  1187 ++
 drivers/net/wireless/realtek/rtw88/main.h  |  1119 +
 drivers/net/wireless/realtek/rtw88/pci.c   |  1208 ++
 drivers/net/wireless/realtek/rtw88/pci.h   |   229 +
 drivers/net/wireless/realtek/rtw88/phy.c   |  1670 ++
 drivers/net/wireless/realtek/rtw88/phy.h   |   125 +
 drivers/net/wireless/realtek/rtw88/ps.c|   165 +
 drivers/net/wireless/realtek/rtw88/ps.h|20 +
 drivers/net/wireless/realtek/rtw88/reg.h   |   411 +
 drivers/net/wireless/realtek/rtw88/regd.c  |   391 +
 drivers/net/wireless/realtek/rtw88/regd.h  |67 +
 drivers/net/wireless/realtek/rtw88/rtw8822b.c  |  1590 ++
 drivers/net/wireless/realtek/rtw88/rtw8822b.h  |   155 +
 .../net/wireless/realtek/rtw88/rtw8822b_table.c| 20783 +++
 .../net/wireless/realtek/rtw88/rtw8822b_table.h|18 +
 drivers/net/wireless/realtek/rtw88/rtw8822c.c  |  1169 ++
 drivers/net/wireless/realtek/rtw88/rtw8822c.h  |   171 +
 .../net/wireless/realtek/rtw88/rtw8822c_table.c|  4150 
 .../net/wireless/realtek/rtw88/rtw8822c_table.h|16 +
 drivers/net/wireless/realtek/rtw88/rx.c|   151 +
 drivers/net/wireless/realtek/rtw88/rx.h|41 +
 drivers/net/wireless/realtek/rtw88/sec.c   |   120 +
 drivers/net/wireless/realtek/rtw88/sec.h 

[PATCH 04/13] rtw88: trx files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

trx files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/rx.c | 151 ++
 drivers/net/wireless/realtek/rtw88/rx.h |  41 +
 drivers/net/wireless/realtek/rtw88/tx.c | 273 
 drivers/net/wireless/realtek/rtw88/tx.h |  81 ++
 4 files changed, 546 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/rx.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/rx.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/tx.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/tx.h

diff --git a/drivers/net/wireless/realtek/rtw88/rx.c 
b/drivers/net/wireless/realtek/rtw88/rx.c
new file mode 100644
index 000..276856e
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rx.c
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "rx.h"
+#include "ps.h"
+
+void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
+ struct sk_buff *skb)
+{
+   struct ieee80211_hdr *hdr;
+   struct rtw_vif *rtwvif;
+
+   hdr = (struct ieee80211_hdr *)skb->data;
+
+   if (!ieee80211_is_data(hdr->frame_control))
+   return;
+
+   if (!is_broadcast_ether_addr(hdr->addr1) &&
+   !is_multicast_ether_addr(hdr->addr1)) {
+   rtwdev->stats.rx_unicast += skb->len;
+   rtwdev->stats.rx_cnt++;
+   if (vif) {
+   rtwvif = (struct rtw_vif *)vif->drv_priv;
+   rtwvif->stats.rx_unicast += skb->len;
+   rtwvif->stats.rx_cnt++;
+   if (rtwvif->stats.rx_cnt > RTW_LPS_THRESHOLD)
+   rtw_leave_lps_irqsafe(rtwdev, rtwvif);
+   }
+   }
+}
+EXPORT_SYMBOL(rtw_rx_stats);
+
+struct rtw_rx_addr_match_data {
+   struct rtw_dev *rtwdev;
+   struct ieee80211_hdr *hdr;
+   struct rtw_rx_pkt_stat *pkt_stat;
+   u8 *bssid;
+};
+
+static void rtw_rx_addr_match_iter(void *data, u8 *mac,
+  struct ieee80211_vif *vif)
+{
+   struct rtw_rx_addr_match_data *iter_data = data;
+   struct ieee80211_sta *sta;
+   struct ieee80211_hdr *hdr = iter_data->hdr;
+   struct rtw_dev *rtwdev = iter_data->rtwdev;
+   struct rtw_sta_info *si;
+   struct rtw_rx_pkt_stat *pkt_stat = iter_data->pkt_stat;
+   u8 *bssid = iter_data->bssid;
+
+   if (ether_addr_equal(vif->bss_conf.bssid, bssid) &&
+   (ether_addr_equal(vif->addr, hdr->addr1) ||
+ieee80211_is_beacon(hdr->frame_control)))
+   sta = ieee80211_find_sta_by_ifaddr(rtwdev->hw, hdr->addr2,
+  vif->addr);
+   else
+   return;
+
+   if (!sta)
+   return;
+
+   si = (struct rtw_sta_info *)sta->drv_priv;
+   ewma_rssi_add(>avg_rssi, pkt_stat->rssi);
+}
+
+static void rtw_rx_addr_match(struct rtw_dev *rtwdev,
+ struct rtw_rx_pkt_stat *pkt_stat,
+ struct ieee80211_hdr *hdr)
+{
+   struct rtw_rx_addr_match_data data = {};
+
+   if (pkt_stat->crc_err || pkt_stat->icv_err || !pkt_stat->phy_status ||
+   ieee80211_is_ctl(hdr->frame_control))
+   return;
+
+   data.rtwdev = rtwdev;
+   data.hdr = hdr;
+   data.pkt_stat = pkt_stat;
+   data.bssid = get_hdr_bssid(hdr);
+
+   rtw_iterate_vifs_atomic(rtwdev, rtw_rx_addr_match_iter, );
+}
+
+void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
+  struct rtw_rx_pkt_stat *pkt_stat,
+  struct ieee80211_hdr *hdr,
+  struct ieee80211_rx_status *rx_status,
+  u8 *phy_status)
+{
+   struct ieee80211_hw *hw = rtwdev->hw;
+
+   memset(rx_status, 0, sizeof(*rx_status));
+   rx_status->freq = hw->conf.chandef.chan->center_freq;
+   rx_status->band = hw->conf.chandef.chan->band;
+   if (pkt_stat->crc_err)
+   rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
+   if (pkt_stat->decrypted)
+   rx_status->flag |= RX_FLAG_DECRYPTED;
+
+   if (pkt_stat->rate >= DESC_RATEVHT1SS_MCS0)
+   rx_status->encoding = RX_ENC_VHT;
+   else if (pkt_stat->rate >= DESC_RATEMCS0)
+   rx_status->encoding = RX_ENC_HT;
+
+   if (pkt_stat->rate >= DESC_RATEVHT1SS_MCS0 &&
+   pkt_stat->rate <= DESC_RATEVHT1SS_MCS9) {
+   rx_status->nss = 1;
+   rx_status->rate_idx = pkt_stat->rate - DESC_RATEVHT1SS_MCS0;
+   } else if (pkt_stat->rate >= DESC_RATEVHT2SS_MCS0 &&
+  pkt_stat->rate <= DESC_RATEVHT2SS_MCS9) {
+   rx_status->nss = 2;
+   rx_status->rate_idx = pkt_stat->rate - DESC_RATEVHT2SS_MCS0;
+   } else if 

[PATCH 03/13] rtw88: hci files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

hci files for Realtek 802.11ac wireless network chips

For now there is only PCI bus supported by rtwlan, in the future it
will also have USB/SDIO

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/hci.h |  211 ++
 drivers/net/wireless/realtek/rtw88/pci.c | 1208 ++
 drivers/net/wireless/realtek/rtw88/pci.h |  229 ++
 3 files changed, 1648 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/hci.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/pci.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/pci.h

diff --git a/drivers/net/wireless/realtek/rtw88/hci.h 
b/drivers/net/wireless/realtek/rtw88/hci.h
new file mode 100644
index 000..91b15ef
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/hci.h
@@ -0,0 +1,211 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#ifndef__RTW_HCI_H__
+#define __RTW_HCI_H__
+
+/* ops for PCI, USB and SDIO */
+struct rtw_hci_ops {
+   int (*tx)(struct rtw_dev *rtwdev,
+ struct rtw_tx_pkt_info *pkt_info,
+ struct sk_buff *skb);
+   int (*setup)(struct rtw_dev *rtwdev);
+   int (*start)(struct rtw_dev *rtwdev);
+   void (*stop)(struct rtw_dev *rtwdev);
+
+   int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
+   int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
+
+   u8 (*read8)(struct rtw_dev *rtwdev, u32 addr);
+   u16 (*read16)(struct rtw_dev *rtwdev, u32 addr);
+   u32 (*read32)(struct rtw_dev *rtwdev, u32 addr);
+   void (*write8)(struct rtw_dev *rtwdev, u32 addr, u8 val);
+   void (*write16)(struct rtw_dev *rtwdev, u32 addr, u16 val);
+   void (*write32)(struct rtw_dev *rtwdev, u32 addr, u32 val);
+};
+
+static inline int rtw_hci_tx(struct rtw_dev *rtwdev,
+struct rtw_tx_pkt_info *pkt_info,
+struct sk_buff *skb)
+{
+   return rtwdev->hci.ops->tx(rtwdev, pkt_info, skb);
+}
+
+static inline int rtw_hci_setup(struct rtw_dev *rtwdev)
+{
+   return rtwdev->hci.ops->setup(rtwdev);
+}
+
+static inline int rtw_hci_start(struct rtw_dev *rtwdev)
+{
+   return rtwdev->hci.ops->start(rtwdev);
+}
+
+static inline void rtw_hci_stop(struct rtw_dev *rtwdev)
+{
+   rtwdev->hci.ops->stop(rtwdev);
+}
+
+static inline int
+rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
+{
+   return rtwdev->hci.ops->write_data_rsvd_page(rtwdev, buf, size);
+}
+
+static inline int
+rtw_hci_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
+{
+   return rtwdev->hci.ops->write_data_h2c(rtwdev, buf, size);
+}
+
+static inline u8 rtw_read8(struct rtw_dev *rtwdev, u32 addr)
+{
+   return rtwdev->hci.ops->read8(rtwdev, addr);
+}
+
+static inline u16 rtw_read16(struct rtw_dev *rtwdev, u32 addr)
+{
+   return rtwdev->hci.ops->read16(rtwdev, addr);
+}
+
+static inline u32 rtw_read32(struct rtw_dev *rtwdev, u32 addr)
+{
+   return rtwdev->hci.ops->read32(rtwdev, addr);
+}
+
+static inline void rtw_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
+{
+   rtwdev->hci.ops->write8(rtwdev, addr, val);
+}
+
+static inline void rtw_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
+{
+   rtwdev->hci.ops->write16(rtwdev, addr, val);
+}
+
+static inline void rtw_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
+{
+   rtwdev->hci.ops->write32(rtwdev, addr, val);
+}
+
+static inline void rtw_write8_set(struct rtw_dev *rtwdev, u32 addr, u8 bit)
+{
+   u8 val;
+
+   val = rtw_read8(rtwdev, addr);
+   rtw_write8(rtwdev, addr, val | bit);
+}
+
+static inline void rtw_writ16_set(struct rtw_dev *rtwdev, u32 addr, u16 bit)
+{
+   u16 val;
+
+   val = rtw_read16(rtwdev, addr);
+   rtw_write16(rtwdev, addr, val | bit);
+}
+
+static inline void rtw_write32_set(struct rtw_dev *rtwdev, u32 addr, u32 bit)
+{
+   u32 val;
+
+   val = rtw_read32(rtwdev, addr);
+   rtw_write32(rtwdev, addr, val | bit);
+}
+
+static inline void rtw_write8_clr(struct rtw_dev *rtwdev, u32 addr, u8 bit)
+{
+   u8 val;
+
+   val = rtw_read8(rtwdev, addr);
+   rtw_write8(rtwdev, addr, val & ~bit);
+}
+
+static inline void rtw_write16_clr(struct rtw_dev *rtwdev, u32 addr, u16 bit)
+{
+   u16 val;
+
+   val = rtw_read16(rtwdev, addr);
+   rtw_write16(rtwdev, addr, val & ~bit);
+}
+
+static inline void rtw_write32_clr(struct rtw_dev *rtwdev, u32 addr, u32 bit)
+{
+   u32 val;
+
+   val = rtw_read32(rtwdev, addr);
+   rtw_write32(rtwdev, addr, val & ~bit);
+}
+
+static inline u32
+rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
+   u32 addr, u32 mask)
+{
+   unsigned long flags;
+   u32 val;
+
+   spin_lock_irqsave(>rf_lock, flags);
+   val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
+   spin_unlock_irqrestore(>rf_lock, 

[PATCH 11/13] rtw88: 8822C init table

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

8822C init table for chip files Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 .../net/wireless/realtek/rtw88/rtw8822c_table.c| 4150 
 1 file changed, 4150 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822c_table.c

diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c_table.c 
b/drivers/net/wireless/realtek/rtw88/rtw8822c_table.c
new file mode 100644
index 000..e95ad82
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c_table.c
@@ -0,0 +1,4150 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "phy.h"
+#include "rtw8822c_table.h"
+
+static const u32 rtw8822c_mac[] = {
+};
+
+RTW_DECL_TABLE_PHY_COND(rtw8822c_mac, rtw_phy_cfg_mac);
+
+static const u32 rtw8822c_agc[] = {
+   0x1D90, 0x31FF,
+   0x1D90, 0x300101FF,
+   0x1D90, 0x300201FF,
+   0x1D90, 0x300301FF,
+   0x1D90, 0x300401FF,
+   0x1D90, 0x300501FF,
+   0x1D90, 0x300601FE,
+   0x1D90, 0x300701FD,
+   0x1D90, 0x300801FC,
+   0x1D90, 0x300901FB,
+   0x1D90, 0x300A01FA,
+   0x1D90, 0x300B01F9,
+   0x1D90, 0x300C01F8,
+   0x1D90, 0x300D01F7,
+   0x1D90, 0x300E01F6,
+   0x1D90, 0x300F01F5,
+   0x1D90, 0x301001F4,
+   0x1D90, 0x301101F3,
+   0x1D90, 0x301201F2,
+   0x1D90, 0x301301F1,
+   0x1D90, 0x301401F0,
+   0x1D90, 0x301501EF,
+   0x1D90, 0x301601AF,
+   0x1D90, 0x301701AE,
+   0x1D90, 0x301801AD,
+   0x1D90, 0x301901AC,
+   0x1D90, 0x301A01AB,
+   0x1D90, 0x301B01AA,
+   0x1D90, 0x301C01A9,
+   0x1D90, 0x301D0188,
+   0x1D90, 0x301E0187,
+   0x1D90, 0x301F0186,
+   0x1D90, 0x30200185,
+   0x1D90, 0x30210168,
+   0x1D90, 0x30220167,
+   0x1D90, 0x30230166,
+   0x1D90, 0x30240108,
+   0x1D90, 0x30250107,
+   0x1D90, 0x30260106,
+   0x1D90, 0x30270144,
+   0x1D90, 0x30280143,
+   0x1D90, 0x30290142,
+   0x1D90, 0x302A0141,
+   0x1D90, 0x302B0140,
+   0x1D90, 0x302C00C9,
+   0x1D90, 0x302D00C8,
+   0x1D90, 0x302E00C7,
+   0x1D90, 0x302F00C6,
+   0x1D90, 0x303000C5,
+   0x1D90, 0x303100C4,
+   0x1D90, 0x303200C3,
+   0x1D90, 0x30330088,
+   0x1D90, 0x30340087,
+   0x1D90, 0x30350086,
+   0x1D90, 0x30360045,
+   0x1D90, 0x30370044,
+   0x1D90, 0x30380043,
+   0x1D90, 0x30390023,
+   0x1D90, 0x303A0022,
+   0x1D90, 0x303B0021,
+   0x1D90, 0x303C0020,
+   0x1D90, 0x303D0002,
+   0x1D90, 0x303E0001,
+   0x1D90, 0x303F,
+   0x1D90, 0x304000FF,
+   0x1D90, 0x304100FF,
+   0x1D90, 0x304200FF,
+   0x1D90, 0x304300FF,
+   0x1D90, 0x304400FF,
+   0x1D90, 0x304500FE,
+   0x1D90, 0x304600FD,
+   0x1D90, 0x304700FC,
+   0x1D90, 0x304800FB,
+   0x1D90, 0x304900FA,
+   0x1D90, 0x304A00F9,
+   0x1D90, 0x304B00F8,
+   0x1D90, 0x304C00F7,
+   0x1D90, 0x304D00F6,
+   0x1D90, 0x304E00F5,
+   0x1D90, 0x304F00F4,
+   0x1D90, 0x305000F3,
+   0x1D90, 0x305100F2,
+   0x1D90, 0x305200F1,
+   0x1D90, 0x305300F0,
+   0x1D90, 0x305400EF,
+   0x1D90, 0x305500EE,
+   0x1D90, 0x305600ED,
+   0x1D90, 0x305700EC,
+   0x1D90, 0x305800EB,
+   0x1D90, 0x305900EA,
+   0x1D90, 0x305A00E9,
+   0x1D90, 0x305B00E8,
+   0x1D90, 0x305C00E7,
+   0x1D90, 0x305D00E6,
+   0x1D90, 0x305E00E5,
+   0x1D90, 0x305F00E4,
+   0x1D90, 0x306000E3,
+   0x1D90, 0x306100C3,
+   0x1D90, 0x306200C2,
+   0x1D90, 0x306300C1,
+   0x1D90, 0x30640088,
+   0x1D90, 0x30650087,
+   0x1D90, 0x30660086,
+   0x1D90, 0x30670085,
+   0x1D90, 0x30680084,
+   0x1D90, 0x30690083,
+   0x1D90, 0x306A0082,
+   0x1D90, 0x306B0081,
+   0x1D90, 0x306C0068,
+   0x1D90, 0x306D0067,
+   0x1D90, 0x306E0066,
+   0x1D90, 0x306F0065,
+   0x1D90, 0x30700064,
+   0x1D90, 0x30710063,
+   

[PATCH 09/13] rtw88: chip files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

chip files Realtek 802.11ac wireless network chips
8822B & 8822C series files

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/rtw8822b.c  | 1590 
 drivers/net/wireless/realtek/rtw88/rtw8822b.h  |  155 ++
 .../net/wireless/realtek/rtw88/rtw8822b_table.h|   18 +
 drivers/net/wireless/realtek/rtw88/rtw8822c.c  | 1169 ++
 drivers/net/wireless/realtek/rtw88/rtw8822c.h  |  171 +++
 .../net/wireless/realtek/rtw88/rtw8822c_table.h|   16 +
 6 files changed, 3119 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822b.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822b.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822b_table.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822c.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822c.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822c_table.h

diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c 
b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
new file mode 100644
index 000..0339041
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
@@ -0,0 +1,1590 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "fw.h"
+#include "tx.h"
+#include "rx.h"
+#include "phy.h"
+#include "rtw8822b.h"
+#include "rtw8822b_table.h"
+#include "mac.h"
+#include "reg.h"
+#include "debug.h"
+
+static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
+u8 rx_path, bool is_tx2_path);
+
+static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse,
+   struct rtw8822b_efuse *map)
+{
+   ether_addr_copy(efuse->addr, map->e.mac_addr);
+}
+
+static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
+{
+   struct rtw_efuse *efuse = >efuse;
+   struct rtw8822b_efuse *map;
+   int i;
+
+   map = (struct rtw8822b_efuse *)log_map;
+
+   efuse->rfe_option = map->rfe_option;
+   efuse->crystal_cap = map->xtal_k;
+   efuse->pa_type_2g = map->pa_type;
+   efuse->pa_type_5g = map->pa_type;
+   efuse->lna_type_2g = map->lna_type_2g[0];
+   efuse->lna_type_5g = map->lna_type_5g[0];
+   efuse->channel_plan = map->channel_plan;
+   efuse->country_code[0] = map->country_code[0];
+   efuse->country_code[1] = map->country_code[1];
+   efuse->bt_setting = map->rf_bt_setting;
+   efuse->regd = map->rf_board_option & 0x7;
+
+   for (i = 0; i < 4; i++)
+   efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
+
+   switch (rtw_hci_type(rtwdev)) {
+   case RTW_HCI_TYPE_PCIE:
+   rtw8822be_efuse_parsing(efuse, map);
+   break;
+   default:
+   /* unsupported now */
+   return -ENOTSUPP;
+   }
+
+   return 0;
+}
+
+static void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev)
+{
+   /* chip top mux */
+   rtw_write32_mask(rtwdev, 0x64, BIT(29) | BIT(28), 0x3);
+   rtw_write32_mask(rtwdev, 0x4c, BIT(26) | BIT(25), 0x0);
+   rtw_write32_mask(rtwdev, 0x40, BIT(2), 0x1);
+
+   /* from s0 or s1 */
+   rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30);
+   rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3);
+
+   /* input or output */
+   rtw_write32_mask(rtwdev, 0x974, 0x3f, 0x3f);
+   rtw_write32_mask(rtwdev, 0x974, (BIT(11) | BIT(10)), 0x3);
+}
+
+static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)
+{
+   struct rtw_hal *hal = >hal;
+   u8 crystal_cap;
+   bool is_tx2_path;
+
+   /* power on BB/RF domain */
+   rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
+  BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
+   rtw_write8_set(rtwdev, REG_RF_CTRL,
+  BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
+   rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
+
+   /* pre init before header files config */
+   rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
+
+   rtw_phy_load_tables(rtwdev);
+
+   crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
+   rtw_write32_mask(rtwdev, 0x24, 0x7e00, crystal_cap);
+   rtw_write32_mask(rtwdev, 0x28, 0x7e, crystal_cap);
+
+   /* post init after header files config */
+   rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
+
+   is_tx2_path = false;
+   rtw8822b_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
+is_tx2_path);
+   rtw_phy_init(rtwdev);
+
+   rtw8822b_phy_rfe_init(rtwdev);
+
+   /* wifi path controller */
+   rtw_write32_mask(rtwdev, 0x70, 0x400, 1);
+   /* BB control */
+   rtw_write32_mask(rtwdev, 0x4c, 0x0180, 0x2);
+   /* antenna mux switch */
+   rtw_write8(rtwdev, 0x974, 0xff);
+   rtw_write32_mask(rtwdev, 0x1990, 0x300, 0);
+   

[PATCH 05/13] rtw88: mac files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

mac files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/mac.c | 1010 ++
 drivers/net/wireless/realtek/rtw88/mac.h |   35 ++
 2 files changed, 1045 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/mac.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/mac.h

diff --git a/drivers/net/wireless/realtek/rtw88/mac.c 
b/drivers/net/wireless/realtek/rtw88/mac.c
new file mode 100644
index 000..126e489
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
@@ -0,0 +1,1010 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "mac.h"
+#include "reg.h"
+#include "fw.h"
+#include "debug.h"
+
+void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw,
+u8 primary_ch_idx)
+{
+   u8 txsc40 = 0, txsc20 = 0;
+   u32 value32;
+   u8 value8;
+
+   txsc20 = primary_ch_idx;
+   if (txsc20 == 1 || txsc20 == 3)
+   txsc40 = 9;
+   else
+   txsc40 = 10;
+   rtw_write8(rtwdev, REG_DATA_SC,
+  BIT_TXSC_20M(txsc20) | BIT_TXSC_40M(txsc40));
+
+   value32 = rtw_read32(rtwdev, REG_WMAC_TRXPTCL_CTL);
+   value32 &= ~BIT_RFMOD;
+   switch (bw) {
+   case RTW_CHANNEL_WIDTH_80:
+   value32 |= BIT_RFMOD_80M;
+   break;
+   case RTW_CHANNEL_WIDTH_40:
+   value32 |= BIT_RFMOD_40M;
+   break;
+   case RTW_CHANNEL_WIDTH_20:
+   default:
+   break;
+   }
+   rtw_write32(rtwdev, REG_WMAC_TRXPTCL_CTL, value32);
+
+   value32 = rtw_read32(rtwdev, REG_AFE_CTRL1) & ~(BIT_MAC_CLK_SEL);
+   value32 |= (MAC_CLK_HW_DEF_80M << BIT_SHIFT_MAC_CLK_SEL);
+   rtw_write32(rtwdev, REG_AFE_CTRL1, value32);
+
+   rtw_write8(rtwdev, REG_USTIME_TSF, MAC_CLK_SPEED);
+   rtw_write8(rtwdev, REG_USTIME_EDCA, MAC_CLK_SPEED);
+
+   value8 = rtw_read8(rtwdev, REG_CCK_CHECK);
+   value8 = value8 & ~BIT_CHECK_CCK_EN;
+   if (channel > 35)
+   value8 |= BIT_CHECK_CCK_EN;
+   rtw_write8(rtwdev, REG_CCK_CHECK, value8);
+}
+
+static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev)
+{
+   u32 value32;
+   u8 value8;
+
+   rtw_write8(rtwdev, REG_RSV_CTRL, 0);
+
+   switch (rtw_hci_type(rtwdev)) {
+   case RTW_HCI_TYPE_PCIE:
+   rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_BT_DIG_CLK_EN);
+   break;
+   case RTW_HCI_TYPE_USB:
+   break;
+   default:
+   return -EINVAL;
+   }
+
+   /* config PIN Mux */
+   value32 = rtw_read32(rtwdev, REG_PAD_CTRL1);
+   value32 |= BIT_PAPE_WLBT_SEL | BIT_LNAON_WLBT_SEL;
+   rtw_write32(rtwdev, REG_PAD_CTRL1, value32);
+
+   value32 = rtw_read32(rtwdev, REG_LED_CFG);
+   value32 &= ~(BIT_PAPE_SEL_EN | BIT_LNAON_SEL_EN);
+   rtw_write32(rtwdev, REG_LED_CFG, value32);
+
+   value32 = rtw_read32(rtwdev, REG_GPIO_MUXCFG);
+   value32 |= BIT_WLRFE_4_5_EN;
+   rtw_write32(rtwdev, REG_GPIO_MUXCFG, value32);
+
+   /* disable BB/RF */
+   value8 = rtw_read8(rtwdev, REG_SYS_FUNC_EN);
+   value8 &= ~(BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
+   rtw_write8(rtwdev, REG_SYS_FUNC_EN, value8);
+
+   value8 = rtw_read8(rtwdev, REG_RF_CTRL);
+   value8 &= ~(BIT_RF_SDM_RSTB | BIT_RF_RSTB | BIT_RF_EN);
+   rtw_write8(rtwdev, REG_RF_CTRL, value8);
+
+   value32 = rtw_read32(rtwdev, REG_WLRF1);
+   value32 &= ~BIT_WLRF1_BBRF_EN;
+   rtw_write32(rtwdev, REG_WLRF1, value32);
+
+   return 0;
+}
+
+static int rtw_pwr_cmd_polling(struct rtw_dev *rtwdev,
+  struct rtw_pwr_seq_cmd *cmd)
+{
+   u8 value;
+   u8 flag = 0;
+   u32 offset;
+   u32 cnt = RTW_PWR_POLLING_CNT;
+
+   if (cmd->base == RTW_PWR_ADDR_SDIO)
+   offset = cmd->offset | SDIO_LOCAL_OFFSET;
+   else
+   offset = cmd->offset;
+
+   do {
+   cnt--;
+   value = rtw_read8(rtwdev, offset);
+   value &= cmd->mask;
+   if (value == (cmd->value & cmd->mask))
+   return 0;
+   if (cnt == 0) {
+   if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE &&
+   flag == 0) {
+   value = rtw_read8(rtwdev, REG_SYS_PW_CTRL);
+   value |= BIT(3);
+   rtw_write8(rtwdev, REG_SYS_PW_CTRL, value);
+   value &= ~BIT(3);
+   rtw_write8(rtwdev, REG_SYS_PW_CTRL, value);
+   cnt = RTW_PWR_POLLING_CNT;
+   flag = 1;
+   } else {
+   return -EBUSY;
+   }
+   

[PATCH 08/13] rtw88: debug files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

debug files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/debug.c | 631 +
 drivers/net/wireless/realtek/rtw88/debug.h |  35 ++
 2 files changed, 666 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/debug.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/debug.h

diff --git a/drivers/net/wireless/realtek/rtw88/debug.c 
b/drivers/net/wireless/realtek/rtw88/debug.c
new file mode 100644
index 000..d0cb9d3
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
@@ -0,0 +1,631 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include 
+#include 
+#include "main.h"
+#include "sec.h"
+#include "fw.h"
+#include "debug.h"
+
+#ifdef CONFIG_RTW88_DEBUGFS
+
+struct rtw_debugfs_priv {
+   struct rtw_dev *rtwdev;
+   int (*cb_read)(struct seq_file *m, void *v);
+   ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
+   size_t count, loff_t *loff);
+   union {
+   u32 cb_data;
+   u8 *buf;
+   struct {
+   u32 page_offset;
+   u32 page_num;
+   } rsvd_page;
+   struct {
+   u8 rf_path;
+   u32 rf_addr;
+   u32 rf_mask;
+   };
+   struct {
+   u32 addr;
+   u32 len;
+   } read_reg;
+   };
+};
+
+static int rtw_debugfs_single_show(struct seq_file *m, void *v)
+{
+   struct rtw_debugfs_priv *debugfs_priv = m->private;
+
+   return debugfs_priv->cb_read(m, v);
+}
+
+static ssize_t rtw_debugfs_common_write(struct file *filp,
+   const char __user *buffer,
+   size_t count, loff_t *loff)
+{
+   struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
+
+   return debugfs_priv->cb_write(filp, buffer, count, loff);
+}
+
+static ssize_t rtw_debugfs_single_write(struct file *filp,
+   const char __user *buffer,
+   size_t count, loff_t *loff)
+{
+   struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
+   struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
+
+   return debugfs_priv->cb_write(filp, buffer, count, loff);
+}
+
+static int rtw_debugfs_single_open_rw(struct inode *inode, struct file *filp)
+{
+   return single_open(filp, rtw_debugfs_single_show, inode->i_private);
+}
+
+static int rtw_debugfs_close(struct inode *inode, struct file *filp)
+{
+   return 0;
+}
+
+static const struct file_operations file_ops_single_r = {
+   .owner = THIS_MODULE,
+   .open = rtw_debugfs_single_open_rw,
+   .read = seq_read,
+   .llseek = seq_lseek,
+   .release = seq_release,
+};
+
+static const struct file_operations file_ops_single_rw = {
+   .owner = THIS_MODULE,
+   .open = rtw_debugfs_single_open_rw,
+   .release = single_release,
+   .read = seq_read,
+   .llseek = seq_lseek,
+   .write = rtw_debugfs_single_write,
+};
+
+static const struct file_operations file_ops_common_write = {
+   .owner = THIS_MODULE,
+   .write = rtw_debugfs_common_write,
+   .open = simple_open,
+   .release = rtw_debugfs_close,
+};
+
+static int rtw_debugfs_get_read_reg(struct seq_file *m, void *v)
+{
+   struct rtw_debugfs_priv *debugfs_priv = m->private;
+   struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+   u32 val, len, addr;
+
+   len = debugfs_priv->read_reg.len;
+   addr = debugfs_priv->read_reg.addr;
+   switch (len) {
+   case 1:
+   val = rtw_read8(rtwdev, addr);
+   seq_printf(m, "reg 0x%03x: 0x%02x\n", addr, val);
+   break;
+   case 2:
+   val = rtw_read16(rtwdev, addr);
+   seq_printf(m, "reg 0x%03x: 0x%04x\n", addr, val);
+   break;
+   case 4:
+   val = rtw_read32(rtwdev, addr);
+   seq_printf(m, "reg 0x%03x: 0x%08x\n", addr, val);
+   break;
+   }
+   return 0;
+}
+
+static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
+{
+   struct rtw_debugfs_priv *debugfs_priv = m->private;
+   struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+   u32 val, addr, mask;
+   u8 path;
+
+   path = debugfs_priv->rf_path;
+   addr = debugfs_priv->rf_addr;
+   mask = debugfs_priv->rf_mask;
+
+   val = rtw_read_rf(rtwdev, path, addr, mask);
+
+   seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
+  path, addr, mask, val);
+
+   return 0;
+}
+
+static int rtw_debugfs_copy_from_user(char tmp[], int size,
+ const char __user *buffer, size_t count,
+   

[PATCH 07/13] rtw88: phy files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

phy files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/phy.c | 1670 ++
 drivers/net/wireless/realtek/rtw88/phy.h |  125 +++
 2 files changed, 1795 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/phy.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/phy.h

diff --git a/drivers/net/wireless/realtek/rtw88/phy.c 
b/drivers/net/wireless/realtek/rtw88/phy.c
new file mode 100644
index 000..51b7fca
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
@@ -0,0 +1,1670 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include 
+
+#include "main.h"
+#include "fw.h"
+#include "phy.h"
+#include "debug.h"
+
+struct phy_cfg_pair {
+   u32 addr;
+   u32 data;
+};
+
+union phy_table_tile {
+   struct rtw_phy_cond cond;
+   struct phy_cfg_pair cfg;
+};
+
+struct phy_pg_cfg_pair {
+   u32 band;
+   u32 rf_path;
+   u32 tx_num;
+   u32 addr;
+   u32 bitmask;
+   u32 data;
+};
+
+struct txpwr_lmt_cfg_pair {
+   u8 regd;
+   u8 band;
+   u8 bw;
+   u8 rs;
+   u8 ch;
+   s8 txpwr_lmt;
+};
+
+static const u32 db_invert_table[12][8] = {
+   {10,13, 16, 20,
+25,32, 40, 50},
+   {64,80, 101,128,
+160,   201,256,318},
+   {401,   505,635,800,
+1007,  1268,   1596,   2010},
+   {316,   398,501,631,
+794,   1000,   1259,   1585},
+   {1995,  2512,   3162,   3981,
+5012,  6310,   7943,   1},
+   {12589, 15849,  19953,  25119,
+31623, 39811,  50119,  63098},
+   {79433, 10, 125893, 158489,
+199526,251189, 316228, 398107},
+   {501187,630957, 794328, 100,
+1258925,   1584893,1995262,2511886},
+   {3162278,   3981072,5011872,6309573,
+7943282,   100,12589254,   15848932},
+   {19952623,  25118864,   31622777,   39810717,
+50118723,  63095734,   79432823,   1},
+   {125892541, 158489319,  199526232,  251188643,
+316227766, 398107171,  501187234,  630957345},
+   {794328235, 10, 1258925412, 1584893192,
+1995262315,2511886432U,3162277660U,3981071706U}
+};
+
+enum rtw_phy_band_type {
+   PHY_BAND_2G = 0,
+   PHY_BAND_5G = 1,
+};
+
+void rtw_phy_init(struct rtw_dev *rtwdev)
+{
+   struct rtw_chip_info *chip = rtwdev->chip;
+   struct rtw_dm_info *dm_info = >dm_info;
+   u32 addr, mask;
+
+   dm_info->fa_history[3] = 0;
+   dm_info->fa_history[2] = 0;
+   dm_info->fa_history[1] = 0;
+   dm_info->fa_history[0] = 0;
+   dm_info->igi_bitmap = 0;
+   dm_info->igi_history[3] = 0;
+   dm_info->igi_history[2] = 0;
+   dm_info->igi_history[1] = 0;
+
+   addr = chip->dig[0].addr;
+   mask = chip->dig[0].mask;
+   dm_info->igi_history[0] = rtw_read32_mask(rtwdev, addr, mask);
+}
+
+void rtw_phy_dig_write(struct rtw_dev *rtwdev, u8 igi)
+{
+   struct rtw_chip_info *chip = rtwdev->chip;
+   struct rtw_hal *hal = >hal;
+   u32 addr, mask;
+   u8 path;
+
+   for (path = 0; path < hal->rf_path_num; path++) {
+   addr = chip->dig[path].addr;
+   mask = chip->dig[path].mask;
+   rtw_write32_mask(rtwdev, addr, mask, igi);
+   }
+}
+
+static void rtw_phy_stat_false_alarm(struct rtw_dev *rtwdev)
+{
+   struct rtw_chip_info *chip = rtwdev->chip;
+
+   chip->ops->false_alarm_statistics(rtwdev);
+}
+
+#define RA_FLOOR_TABLE_SIZE7
+#define RA_FLOOR_UP_GAP3
+
+static u8 rtw_phy_get_rssi_level(u8 old_level, u8 rssi)
+{
+   u8 table[RA_FLOOR_TABLE_SIZE] = {20, 34, 38, 42, 46, 50, 100};
+   u8 new_level = 0;
+   int i;
+
+   for (i = 0; i < RA_FLOOR_TABLE_SIZE; i++)
+   if (i >= old_level)
+   table[i] += RA_FLOOR_UP_GAP;
+
+   for (i = 0; i < RA_FLOOR_TABLE_SIZE; i++) {
+   if (rssi < table[i]) {
+   new_level = i;
+   break;
+   }
+   }
+
+   return new_level;
+}
+
+struct rtw_phy_stat_iter_data {
+   struct rtw_dev *rtwdev;
+   u8 min_rssi;
+};
+
+static void rtw_phy_stat_rssi_iter(void *data, struct ieee80211_sta *sta)
+{
+   struct rtw_phy_stat_iter_data *iter_data = data;
+   struct rtw_dev 

[PATCH 01/13] rtw88: main files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

main files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/mac80211.c |  480 ++
 drivers/net/wireless/realtek/rtw88/main.c | 1187 +
 drivers/net/wireless/realtek/rtw88/main.h | 1119 +++
 drivers/net/wireless/realtek/rtw88/reg.h  |  411 +
 4 files changed, 3197 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/mac80211.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/main.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/main.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/reg.h

diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c 
b/drivers/net/wireless/realtek/rtw88/mac80211.c
new file mode 100644
index 000..17b3651
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -0,0 +1,480 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "sec.h"
+#include "tx.h"
+#include "fw.h"
+#include "mac.h"
+#include "ps.h"
+#include "reg.h"
+#include "debug.h"
+
+static void rtw_ops_tx(struct ieee80211_hw *hw,
+  struct ieee80211_tx_control *control,
+  struct sk_buff *skb)
+{
+   struct rtw_dev *rtwdev = hw->priv;
+   struct rtw_tx_pkt_info pkt_info = {0};
+
+   if (!rtw_flag_check(rtwdev, RTW_FLAG_RUNNING))
+   goto out;
+
+   rtw_tx_pkt_info_update(rtwdev, _info, control, skb);
+   if (rtw_hci_tx(rtwdev, _info, skb))
+   goto out;
+
+   return;
+
+out:
+   ieee80211_free_txskb(hw, skb);
+}
+
+static int rtw_ops_start(struct ieee80211_hw *hw)
+{
+   struct rtw_dev *rtwdev = hw->priv;
+   int ret;
+
+   mutex_lock(>mutex);
+   ret = rtw_core_start(rtwdev);
+   mutex_unlock(>mutex);
+
+   return ret;
+}
+
+static void rtw_ops_stop(struct ieee80211_hw *hw)
+{
+   struct rtw_dev *rtwdev = hw->priv;
+
+   mutex_lock(>mutex);
+   rtw_core_stop(rtwdev);
+   mutex_unlock(>mutex);
+}
+
+static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed)
+{
+   struct rtw_dev *rtwdev = hw->priv;
+   int ret = 0;
+
+   mutex_lock(>mutex);
+
+   if (changed & IEEE80211_CONF_CHANGE_IDLE) {
+   if (hw->conf.flags & IEEE80211_CONF_IDLE) {
+   rtw_enter_ips(rtwdev);
+   } else {
+   ret = rtw_leave_ips(rtwdev);
+   if (ret) {
+   rtw_err(rtwdev, "failed to leave idle state\n");
+   goto out;
+   }
+   }
+   }
+
+   if (changed & IEEE80211_CONF_CHANGE_CHANNEL)
+   rtw_set_channel(rtwdev);
+
+out:
+   mutex_unlock(>mutex);
+   return ret;
+}
+
+static const struct rtw_vif_port rtw_vif_port[] = {
+   [0] = {
+   .mac_addr   = {.addr = 0x0610},
+   .bssid  = {.addr = 0x0618},
+   .net_type   = {.addr = 0x0100, .mask = 0x3},
+   .aid= {.addr = 0x06a8, .mask = 0x7ff},
+   },
+   [1] = {
+   .mac_addr   = {.addr = 0x0700},
+   .bssid  = {.addr = 0x0708},
+   .net_type   = {.addr = 0x0100, .mask = 0xc},
+   .aid= {.addr = 0x0710, .mask = 0x7ff},
+   },
+   [2] = {
+   .mac_addr   = {.addr = 0x1620},
+   .bssid  = {.addr = 0x1628},
+   .net_type   = {.addr = 0x1100, .mask = 0x3},
+   .aid= {.addr = 0x1600, .mask = 0x7ff},
+   },
+   [3] = {
+   .mac_addr   = {.addr = 0x1630},
+   .bssid  = {.addr = 0x1638},
+   .net_type   = {.addr = 0x1100, .mask = 0xc},
+   .aid= {.addr = 0x1604, .mask = 0x7ff},
+   },
+   [4] = {
+   .mac_addr   = {.addr = 0x1640},
+   .bssid  = {.addr = 0x1648},
+   .net_type   = {.addr = 0x1100, .mask = 0x30},
+   .aid= {.addr = 0x1608, .mask = 0x7ff},
+   },
+};
+
+static int rtw_ops_add_interface(struct ieee80211_hw *hw,
+struct ieee80211_vif *vif)
+{
+   struct rtw_dev *rtwdev = hw->priv;
+   struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
+   enum rtw_net_type net_type;
+   u32 config = 0;
+   u8 port = 0;
+
+   vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
+   rtwvif->port = port;
+   rtwvif->vif = vif;
+   rtwvif->stats.tx_unicast = 0;
+   rtwvif->stats.rx_unicast = 0;
+   rtwvif->stats.tx_cnt = 0;
+   rtwvif->stats.rx_cnt = 0;
+   rtwvif->in_lps = false;
+   rtwvif->conf = _vif_port[port];
+
+   mutex_lock(>mutex);
+
+   switch (vif->type) {
+   

[PATCH 02/13] rtw88: core files

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

core files for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/rtw88/ps.c   | 165 +
 drivers/net/wireless/realtek/rtw88/ps.h   |  20 ++
 drivers/net/wireless/realtek/rtw88/regd.c | 391 ++
 drivers/net/wireless/realtek/rtw88/regd.h |  67 +
 drivers/net/wireless/realtek/rtw88/sec.c  | 120 +
 drivers/net/wireless/realtek/rtw88/sec.h  |  39 +++
 6 files changed, 802 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/ps.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/ps.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/regd.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/regd.h
 create mode 100644 drivers/net/wireless/realtek/rtw88/sec.c
 create mode 100644 drivers/net/wireless/realtek/rtw88/sec.h

diff --git a/drivers/net/wireless/realtek/rtw88/ps.c 
b/drivers/net/wireless/realtek/rtw88/ps.c
new file mode 100644
index 000..db51910
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
@@ -0,0 +1,165 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright(c) 2018  Realtek Corporation.
+ */
+
+#include "main.h"
+#include "fw.h"
+#include "ps.h"
+#include "mac.h"
+#include "debug.h"
+
+static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
+{
+   int ret;
+
+   ret = rtw_core_start(rtwdev);
+   if (ret)
+   rtw_err(rtwdev, "leave idle state failed\n");
+
+   rtw_flag_clear(rtwdev, RTW_FLAG_INACTIVE_PS);
+
+   return ret;
+}
+
+int rtw_enter_ips(struct rtw_dev *rtwdev)
+{
+   rtw_flag_set(rtwdev, RTW_FLAG_INACTIVE_PS);
+
+   rtw_core_stop(rtwdev);
+
+   return 0;
+}
+
+static void rtw_restore_port_cfg_iter(void *data, u8 *mac,
+ struct ieee80211_vif *vif)
+{
+   struct rtw_dev *rtwdev = data;
+   struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
+   u32 config = ~0;
+
+   rtw_vif_port_config(rtwdev, rtwvif, config);
+}
+
+int rtw_leave_ips(struct rtw_dev *rtwdev)
+{
+   int ret;
+
+   ret = rtw_ips_pwr_up(rtwdev);
+   if (ret) {
+   rtw_err(rtwdev, "failed to leave ips state\n");
+   return ret;
+   }
+
+   rtw_iterate_vifs_atomic(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
+
+   return 0;
+}
+
+static void rtw_leave_lps_core(struct rtw_dev *rtwdev)
+{
+   struct rtw_lps_conf *conf = >lps_conf;
+
+   conf->state = RTW_ALL_ON;
+   conf->awake_interval = 1;
+   conf->rlbm = 0;
+   conf->smart_ps = 0;
+
+   rtw_fw_set_pwr_mode(rtwdev);
+   rtw_flag_clear(rtwdev, RTW_FLAG_LEISURE_PS);
+}
+
+static void rtw_enter_lps_core(struct rtw_dev *rtwdev)
+{
+   struct rtw_lps_conf *conf = >lps_conf;
+
+   conf->state = RTW_RF_OFF;
+   conf->awake_interval = 1;
+   conf->rlbm = 1;
+   conf->smart_ps = 2;
+
+   rtw_fw_set_pwr_mode(rtwdev);
+   rtw_flag_set(rtwdev, RTW_FLAG_LEISURE_PS);
+}
+
+void rtw_lps_work(struct work_struct *work)
+{
+   struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
+ lps_work.work);
+   struct rtw_lps_conf *conf = >lps_conf;
+   struct rtw_vif *rtwvif = conf->rtwvif;
+
+   if (WARN_ON(!rtwvif))
+   return;
+
+   if (conf->mode == RTW_MODE_LPS)
+   rtw_enter_lps_core(rtwdev);
+   else
+   rtw_leave_lps_core(rtwdev);
+}
+
+void rtw_enter_lps_irqsafe(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
+{
+   struct rtw_lps_conf *conf = >lps_conf;
+
+   if (rtwvif->in_lps)
+   return;
+
+   conf->mode = RTW_MODE_LPS;
+   conf->rtwvif = rtwvif;
+   rtwvif->in_lps = true;
+
+   ieee80211_queue_delayed_work(rtwdev->hw, >lps_work, 0);
+}
+
+void rtw_leave_lps_irqsafe(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
+{
+   struct rtw_lps_conf *conf = >lps_conf;
+
+   if (!rtwvif->in_lps)
+   return;
+
+   conf->mode = RTW_MODE_ACTIVE;
+   conf->rtwvif = rtwvif;
+   rtwvif->in_lps = false;
+
+   ieee80211_queue_delayed_work(rtwdev->hw, >lps_work, 0);
+}
+
+bool rtw_in_lps(struct rtw_dev *rtwdev)
+{
+   return rtw_flag_check(rtwdev, RTW_FLAG_LEISURE_PS);
+}
+
+void rtw_enter_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
+{
+   struct rtw_lps_conf *conf = >lps_conf;
+
+   if (WARN_ON(!rtwvif))
+   return;
+
+   if (rtwvif->in_lps)
+   return;
+
+   conf->mode = RTW_MODE_LPS;
+   conf->rtwvif = rtwvif;
+   rtwvif->in_lps = true;
+
+   rtw_enter_lps_core(rtwdev);
+}
+
+void rtw_leave_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
+{
+   struct rtw_lps_conf *conf = >lps_conf;
+
+   if (WARN_ON(!rtwvif))
+   return;
+
+   if (!rtwvif->in_lps)
+   return;
+
+   conf->mode = RTW_MODE_ACTIVE;
+   conf->rtwvif = rtwvif;
+   rtwvif->in_lps = false;
+

[PATCH 12/13] rtw88: Kconfig & Makefile

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

Kconfig & Makefile for Realtek 802.11ac wireless network chips

Signed-off-by: Yan-Hsuan Chuang 
---
 drivers/net/wireless/realtek/Kconfig|  1 +
 drivers/net/wireless/realtek/Makefile   |  1 +
 drivers/net/wireless/realtek/rtw88/Kconfig  | 55 +
 drivers/net/wireless/realtek/rtw88/Makefile | 19 ++
 4 files changed, 76 insertions(+)
 create mode 100644 drivers/net/wireless/realtek/rtw88/Kconfig
 create mode 100644 drivers/net/wireless/realtek/rtw88/Makefile

diff --git a/drivers/net/wireless/realtek/Kconfig 
b/drivers/net/wireless/realtek/Kconfig
index 3db988e..9189fd6 100644
--- a/drivers/net/wireless/realtek/Kconfig
+++ b/drivers/net/wireless/realtek/Kconfig
@@ -14,5 +14,6 @@ if WLAN_VENDOR_REALTEK
 source "drivers/net/wireless/realtek/rtl818x/Kconfig"
 source "drivers/net/wireless/realtek/rtlwifi/Kconfig"
 source "drivers/net/wireless/realtek/rtl8xxxu/Kconfig"
+source "drivers/net/wireless/realtek/rtw88/Kconfig"
 
 endif # WLAN_VENDOR_REALTEK
diff --git a/drivers/net/wireless/realtek/Makefile 
b/drivers/net/wireless/realtek/Makefile
index 9c78deb..118af99 100644
--- a/drivers/net/wireless/realtek/Makefile
+++ b/drivers/net/wireless/realtek/Makefile
@@ -6,4 +6,5 @@ obj-$(CONFIG_RTL8180)   += rtl818x/
 obj-$(CONFIG_RTL8187)  += rtl818x/
 obj-$(CONFIG_RTLWIFI)  += rtlwifi/
 obj-$(CONFIG_RTL8XXXU) += rtl8xxxu/
+obj-$(CONFIG_RTW88)+= rtw88/
 
diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig 
b/drivers/net/wireless/realtek/rtw88/Kconfig
new file mode 100644
index 000..bd68c7c
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
@@ -0,0 +1,55 @@
+menuconfig RTW88
+   tristate "Realtek 802.11ac wireless chips support"
+   depends on MAC80211
+   default y
+   help
+ This module adds support for mac80211-based wireless drivers that
+ enables Realtek IEEE 802.11ac wireless chipsets.
+
+ If you choose to build a module, it'll be called rtw88.
+
+if RTW88
+
+config RTW88_CORE
+   tristate
+
+config RTW88_PCI
+   tristate
+
+config RTW88_8822BE
+   bool "Realtek 8822BE PCI wireless network adapter"
+   depends on PCI
+   select RTW88_CORE
+   select RTW88_PCI
+   help
+ Select this option will enable support for 8822BE chipset
+
+ 802.11ac PCIe wireless network adapter
+
+config RTW88_8822CE
+   bool "Realtek 8822CE PCI wireless network adapter"
+   depends on PCI
+   select RTW88_CORE
+   select RTW88_PCI
+   help
+ Select this option will enable support for 8822CE chipset
+
+ 802.11ac PCIe wireless network adapter
+
+config RTW88_DEBUG
+   bool "Realtek rtw88 debug support"
+   depends on RTW88_CORE
+   help
+ Enable debug support
+
+ If unsure, say Y to simplify debug problems
+
+config RTW88_DEBUGFS
+   bool "Realtek rtw88 debugfs support"
+   depends on RTW88_CORE
+   help
+ Enable debug support
+
+ If unsure, say Y to simplify debug problems
+
+endif
diff --git a/drivers/net/wireless/realtek/rtw88/Makefile 
b/drivers/net/wireless/realtek/rtw88/Makefile
new file mode 100644
index 000..d70782a
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/Makefile
@@ -0,0 +1,19 @@
+obj-$(CONFIG_RTW88_CORE)   += rtw88.o
+rtw88-y += main.o \
+  mac80211.o \
+  debug.o \
+  tx.o \
+  rx.o \
+  mac.o \
+  phy.o \
+  efuse.o \
+  fw.o \
+  ps.o \
+  sec.o \
+  regd.o
+
+rtw88-$(CONFIG_RTW88_8822BE)   += rtw8822b.o rtw8822b_table.o
+rtw88-$(CONFIG_RTW88_8822CE)   += rtw8822c.o rtw8822c_table.o
+
+obj-$(CONFIG_RTW88_PCI)+= rtwpci.o
+rtwpci-objs:= pci.o
-- 
2.7.4



[PATCH 13/13] rtw88: add support for Realtek 802.11ac wireless chips

2018-11-12 Thread yhchuang
From: Yan-Hsuan Chuang 

Signed-off-by: Yan-Hsuan Chuang 
---
 MAINTAINERS | 8 
 1 file changed, 8 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 9ad052a..138515b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12546,6 +12546,14 @@ T: git 
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.g
 S: Maintained
 F: drivers/net/wireless/realtek/rtlwifi/
 
+REALTEK WIRELESS DRIVER (rtw88)
+M: Yan-Hsuan Chuang 
+L: linux-wireless@vger.kernel.org
+W: http://wireless.kernel.org/
+T: git 
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
+S: Maintained
+F: drivers/net/wireless/realtek/rtw88/
+
 RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
 M: Jes Sorensen 
 L: linux-wireless@vger.kernel.org
-- 
2.7.4



Inquiry 12.11.18

2018-11-12 Thread Daniel Murray
Hi,friend,
 
This is Daniel Murray and i am from Sinara Group Co.Ltd Group Co.,LTD in Russia.
We are glad to know about your company from the web and we are interested in 
your products.
Could you kindly send us your Latest catalog and price list for our trial order.
 
Best Regards,
 
Daniel Murray
Purchasing Manager




Re: [PATCH 2/5] brcmfmac: remove "arp_hostip_clear" from "brcmf_netdev_stop"

2018-11-12 Thread Franky Lin
On Sun, Nov 11, 2018 at 6:10 PM Wright Feng  wrote:
>
>
>
> On 2018/11/9 上午 03:19, Franky Lin wrote:
> > On Wed, Nov 7, 2018 at 7:48 PM Chi-Hsien Lin  
> > wrote:
> >>
> >> From: Wright Feng 
> >>
> >> The firmware does not respond ARP request and causes ping failure with
> >> following steps:
> >>
> >> 1. Bring up interface
> >> ifconfig wlan0 up or start wpa_supplicant
> >> 2. Set the IP address
> >> ifconfig wlan0 192.168.100.10
> >> 3. Bring down interface or
> >> ifconfig wlan0 down or kill wpa_supplicant
> >> 4. Bring up interface again and set the same IP address
> >> 5. Connect to AP(192.168.100.1) and ping to AP will be failed.
> >>
> >> FMAC clears arp_hostip when bringing down the interface, but not set it
> >> back if setting the same IP address. We are able to see the IP address
> >> in interface info(inconfig wlan0) but the ping still cannot work because
> >> the firmware ARP offload does not respond the ARP request.
> >> Because of that, we remove "arp_hostip_clear" from function
> >> "brcmf_netdev_stop"
> >
> > Shouldn't brcmf_inetaddr_changed get called when the interface up again?
> >
> > Thanks,
> > - Franky
> >
> The brcmf_inetaddr_changed only be called in inet_del_ifa and
> inet_insert_ifa. If the IP address is not changed when the interface up
> again, the brcmf_inetaddr_changed will not be called.

Thanks, looks good to me.

>
> -Wright
> >>
> >> Signed-off-by: Wright Feng 
> >> Signed-off-by: Chi-Hsien Lin 

Reviewed-by: Franky Lin 

> >> ---
> >>   drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 --
> >>   1 file changed, 2 deletions(-)
> >>
> >> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 
> >> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> >> index b1f702faff4f..e1666cf3801c 100644
> >> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> >> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> >> @@ -533,8 +533,6 @@ static int brcmf_netdev_stop(struct net_device *ndev)
> >>
> >>  brcmf_cfg80211_down(ndev);
> >>
> >> -   brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0);
> >> -
> >>  brcmf_net_setcarrier(ifp, false);
> >>
> >>  return 0;
> >> --
> >> 2.1.0
> >>
> >
> >
> > --
> >
> > You're receiving this message because you're a member of the 
> > brcm80211-dev-list group.
> >


Re: [PATCH v5] iw: ack signal support for tx ack packets

2018-11-12 Thread Johannes Berg
On Mon, 2018-11-12 at 21:56 +0530, Balaji Pothunoori wrote:
> Hi Johannes,
> 
> Now that corresponding driver patches are merged, could you please let 
> me know if anything is left from our end for merging this patch?

Oh, I marked this as "changes requested" since I thought the updates we
discussed on the kernel side would require changes here (IIRC we talked
about changing some names?)

If it applies and compiles as is, I guess best if you just resend, since
I no longer have it in patchwork and am on vacation this week.

johannes



Re: [PATCH v5] iw: ack signal support for tx ack packets

2018-11-12 Thread Balaji Pothunoori

Hi Johannes,

Now that corresponding driver patches are merged, could you please let 
me know if anything is left from our end for merging this patch?


Regards,
Balaji.

On 2018-07-19 19:59, Balaji Pothunoori wrote:

This patch is to display the average ack signal,
last ack signal of tx ack packets.

Signed-off-by: Balaji Pothunoori 
---
v5:
 * Rebased, No changes
v4:
 * Changed the subject
 * Added last ack signal support and renamed avg ack signal macro
v3:
 * Added version no
v2:
 * Removed nl80211.h changes and modified the commit log

 station.c | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/station.c b/station.c
index 38c5f91..fd38043 100644
--- a/station.c
+++ b/station.c
@@ -308,6 +308,8 @@ static int print_sta_handler(struct nl_msg *msg, 
void *arg)

[NL80211_STA_INFO_TID_STATS] = { .type = NLA_NESTED },
[NL80211_STA_INFO_BSS_PARAM] = { .type = NLA_NESTED },
[NL80211_STA_INFO_RX_DURATION] = { .type = NLA_U64 },
+   [NL80211_STA_INFO_ACK_SIGNAL] = {.type = NLA_U8 },
+   [NL80211_STA_INFO_ACK_SIGNAL_AVG] = { .type = NLA_U8 },
};
char *chain;

@@ -409,6 +411,14 @@ static int print_sta_handler(struct nl_msg *msg, 
void *arg)

printf("\n\trx duration:\t%lld us",
 		   (unsigned long 
long)nla_get_u64(sinfo[NL80211_STA_INFO_RX_DURATION]));


+   if (sinfo[NL80211_STA_INFO_ACK_SIGNAL])
+   printf("\n\tlast ack signal:%d dBm",
+   (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_ACK_SIGNAL]));
+
+   if (sinfo[NL80211_STA_INFO_ACK_SIGNAL_AVG])
+   printf("\n\tavg ack signal:\t%d dBm",
+   
(int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_ACK_SIGNAL_AVG]));
+
if (sinfo[NL80211_STA_INFO_EXPECTED_THROUGHPUT]) {
uint32_t thr;


Re: [PATCH] nl80211: Add support to notify radar event info received from STA

2018-11-12 Thread Sriram R

On 2018-11-09 17:34, Johannes Berg wrote:

On Fri, 2018-10-19 at 14:42 +0530, Sriram R wrote:
[...]

This looks fine, but I think it would be nice to have some extended
netlink error reporting for at least some of these errors:


Sure Johannes, I'll add them in the next patch revision.

+   dfs_region = reg_get_dfs_region(wiphy);
+   if (dfs_region == NL80211_DFS_UNSET)
+   return -EINVAL;
+
+   err = nl80211_parse_chandef(rdev, info, );
+   if (err)
+   return err;
+
+   err = cfg80211_chandef_dfs_required(wiphy, , wdev->iftype);
+   if (err < 0)
+   return err;
+
+   if (err == 0)
+   return -EINVAL;
+
+   /* Do not process this notification if radar is already detected
+* by kernel on this channel
+*/
+   if (chandef.chan->dfs_state == NL80211_DFS_UNAVAILABLE)
+   return -EINVAL;


And maybe that last one should just return 0?

You're right. I'll return success here.
Thanks,
Sriram.R



johannes


Re: [PATCH V2 8/8] brcmfmac: disable command decode in sdio_aos

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:30 AM, Chi-Hsien Lin wrote:

From: Wright Feng 

AOS is a part of the SDIOD core that becomes active when the rest of
SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
commands.

Transaction between AOS and SDIOD is not protected, and if cmd 52 is
received in AOS and in the middle of response state changed from AOS to
SDIOD, response is corrupted and it causes to SDIO Host controller to
hang.


Just one question. The above sound pretty generic so does it apply to 
any SDIO chip with AOS logic?


Regards,
Arend



Re: [PATCH V2 8/8] brcmfmac: disable command decode in sdio_aos

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:30 AM, Chi-Hsien Lin wrote:

From: Wright Feng 

AOS is a part of the SDIOD core that becomes active when the rest of
SDIOD is sleeping to keep SDIO bus alive responding to reduced set of
commands.

Transaction between AOS and SDIOD is not protected, and if cmd 52 is
received in AOS and in the middle of response state changed from AOS to
SDIOD, response is corrupted and it causes to SDIO Host controller to
hang.

Command decode for below chips are disabled in this commit:
 - 4339
 - 4345
 - 4354
 - 4373


Already have my review tag so this is fine as is.


Reviewed-by: Arend van Spriel 
Signed-off-by: Wright Feng 
Signed-off-by: Double Lo 
Signed-off-by: Madhan Mohan R 
Signed-off-by: Chi-Hsien Lin 
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)




Re: [PATCH V2 7/8] brcmfmac: 4373 save-restore support

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

Use sr_eng_en bit to check 4373 sr support.

Reviewed-by: Arend van Spriel 
Signed-off-by: Chi-Hsien Lin 
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index a8d3b96b727f..08d5173d000c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -1365,6 +1365,11 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
addr = CORE_CC_REG(base, sr_control1);
reg = chip->ops->read32(chip->ctx, addr);
return reg != 0;
+   case CY_CC_4373_CHIP_ID:
+   /* explicitly check SR engine enable bit */
+   addr = CORE_CC_REG(base, sr_control0);
+   reg = chip->ops->read32(chip->ctx, addr);
+   return (reg & BIT(0)) != 0;


Sorry for not saying it earlier, but maybe it is good to add define of 
SR engine enable bit in brcm80211/include/chipcommon.h.


Regards,
Arend


Re: [PATCH V2 5/8] brcmfmac: allow GCI core enumuration

2018-11-12 Thread Chi-Hsien Lin



On 11/12/2018 6:27, Arend van Spriel wrote:
> On 11/12/2018 11:24 AM, Chi-Hsien Lin wrote:
>>
>>
>> On 11/12/2018 6:16, Arend van Spriel wrote:
>>> On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:
 GCI core is needed for ULP operation. Allow GCI core enumuration with
 below changes:
  - Allow GCI to be added to core list even when it doesn't have a
 wrapper.
  - Allow 8K address space size.
  - Don't overwrite the address value when an additional size descriptor
    is in place.
>>>
>>> One question. This only assures the GCI core is listed. So does the
>>> driver need to access it for ULP operation?
>>
>> Yes, the GCI core registers are accessed when entering/exiting ULP sleep
>> modes. There will be other patches for the ULP support.
> 
> Yeah. I suspected such. It would have been better to send this patch 
> with that ULP series, but let's not make it an issue now. The patch is 
> fine.

Thanks a lot.  :)

> 
> Regards,
> Arend
> 
> .
> 


Re: [PATCH V2 5/8] brcmfmac: allow GCI core enumuration

2018-11-12 Thread Arend van Spriel

On 11/12/2018 11:24 AM, Chi-Hsien Lin wrote:



On 11/12/2018 6:16, Arend van Spriel wrote:

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

GCI core is needed for ULP operation. Allow GCI core enumuration with
below changes:
 - Allow GCI to be added to core list even when it doesn't have a
wrapper.
 - Allow 8K address space size.
 - Don't overwrite the address value when an additional size descriptor
   is in place.


One question. This only assures the GCI core is listed. So does the
driver need to access it for ULP operation?


Yes, the GCI core registers are accessed when entering/exiting ULP sleep
modes. There will be other patches for the ULP support.


Yeah. I suspected such. It would have been better to send this patch 
with that ULP series, but let's not make it an issue now. The patch is fine.


Regards,
Arend



Re: [PATCH V2 5/8] brcmfmac: allow GCI core enumuration

2018-11-12 Thread Chi-Hsien Lin



On 11/12/2018 6:16, Arend van Spriel wrote:
> On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:
>> GCI core is needed for ULP operation. Allow GCI core enumuration with
>> below changes:
>>  - Allow GCI to be added to core list even when it doesn't have a 
>> wrapper.
>>  - Allow 8K address space size.
>>  - Don't overwrite the address value when an additional size descriptor
>>    is in place.
> 
> One question. This only assures the GCI core is listed. So does the
> driver need to access it for ULP operation?

Yes, the GCI core registers are accessed when entering/exiting ULP sleep 
modes. There will be other patches for the ULP support.

Regards,
Chi-hsien Lin

> 
> Regards,
> Arend
> 
>> Reviewed-by: Arend van Spriel 
>> Signed-off-by: Chi-Hsien Lin 
>> ---
>>  drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 14 
>> --
>>  1 file changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c 
>> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
>> index a3c857721446..a8d3b96b727f 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
>> @@ -786,7 +786,7 @@ static int brcmf_chip_dmp_get_regaddr(struct 
>> brcmf_chip_priv *ci, u32 *eromaddr,
>>     u32 *regbase, u32 *wrapbase)
>>  {
>>   u8 desc;
>> - u32 val;
>> + u32 val, szdesc;
>>   u8 mpnum = 0;
>>   u8 stype, sztype, wraptype;
>>
>> @@ -832,14 +832,15 @@ static int brcmf_chip_dmp_get_regaddr(struct 
>> brcmf_chip_priv *ci, u32 *eromaddr,
>>
>>   /* next size descriptor can be skipped */
>>   if (sztype == DMP_SLAVE_SIZE_DESC) {
>> - val = brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
>> + szdesc = brcmf_chip_dmp_get_desc(ci, eromaddr, 
>> NULL);
>>   /* skip upper size descriptor if present */
>> - if (val & DMP_DESC_ADDRSIZE_GT32)
>> + if (szdesc & DMP_DESC_ADDRSIZE_GT32)
>>   brcmf_chip_dmp_get_desc(ci, eromaddr, 
>> NULL);
>>   }
>>
>> - /* only look for 4K register regions */
>> - if (sztype != DMP_SLAVE_SIZE_4K)
>> + /* look for 4K or 8K register regions */
>> + if (sztype != DMP_SLAVE_SIZE_4K &&
>> + sztype != DMP_SLAVE_SIZE_8K)
>>   continue;
>>
>>   stype = (val & DMP_SLAVE_TYPE) >> DMP_SLAVE_TYPE_S;
>> @@ -896,7 +897,8 @@ int brcmf_chip_dmp_erom_scan(struct 
>> brcmf_chip_priv *ci)
>>
>>   /* need core with ports */
>>   if (nmw + nsw == 0 &&
>> - id != BCMA_CORE_PMU)
>> + id != BCMA_CORE_PMU &&
>> + id != BCMA_CORE_GCI)
>>   continue;
>>
>>   /* try to obtain register address info */
>>
> 
> 
> 
> --
> 
> You're receiving this message because you're a member of the 
> brcm80211-dev-list group.
> .
> 


Inquiry 12/11/2018

2018-11-12 Thread sinara-group
Hi,friend,
 
This is Daniel Murray and i am from Sinara Group Co.Ltd Group Co.,LTD in Russia.
We are glad to know about your company from the web and we are interested in 
your products.
Could you kindly send us your Latest catalog and price list for our trial order.
 
Best Regards,
 
Daniel Murray
Purchasing Manager




Re: [PATCH V2 5/8] brcmfmac: allow GCI core enumuration

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

GCI core is needed for ULP operation. Allow GCI core enumuration with
below changes:
 - Allow GCI to be added to core list even when it doesn't have a wrapper.
 - Allow 8K address space size.
 - Don't overwrite the address value when an additional size descriptor
   is in place.


One question. This only assures the GCI core is listed. So does the 
driver need to access it for ULP operation?


Regards,
Arend


Reviewed-by: Arend van Spriel 
Signed-off-by: Chi-Hsien Lin 
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 14 --
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
index a3c857721446..a8d3b96b727f 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
@@ -786,7 +786,7 @@ static int brcmf_chip_dmp_get_regaddr(struct 
brcmf_chip_priv *ci, u32 *eromaddr,
  u32 *regbase, u32 *wrapbase)
 {
u8 desc;
-   u32 val;
+   u32 val, szdesc;
u8 mpnum = 0;
u8 stype, sztype, wraptype;

@@ -832,14 +832,15 @@ static int brcmf_chip_dmp_get_regaddr(struct 
brcmf_chip_priv *ci, u32 *eromaddr,

/* next size descriptor can be skipped */
if (sztype == DMP_SLAVE_SIZE_DESC) {
-   val = brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
+   szdesc = brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
/* skip upper size descriptor if present */
-   if (val & DMP_DESC_ADDRSIZE_GT32)
+   if (szdesc & DMP_DESC_ADDRSIZE_GT32)
brcmf_chip_dmp_get_desc(ci, eromaddr, NULL);
}

-   /* only look for 4K register regions */
-   if (sztype != DMP_SLAVE_SIZE_4K)
+   /* look for 4K or 8K register regions */
+   if (sztype != DMP_SLAVE_SIZE_4K &&
+   sztype != DMP_SLAVE_SIZE_8K)
continue;

stype = (val & DMP_SLAVE_TYPE) >> DMP_SLAVE_TYPE_S;
@@ -896,7 +897,8 @@ int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv *ci)

/* need core with ports */
if (nmw + nsw == 0 &&
-   id != BCMA_CORE_PMU)
+   id != BCMA_CORE_PMU &&
+   id != BCMA_CORE_GCI)
continue;

/* try to obtain register address info */





Re: [PATCH V2 2/8] brcmfmac: set F2 watermark to 256 for 4373

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

From: Wright Feng 

We got SDIO_CRC_ERROR with 4373 on SDR104 when doing bi-directional
throughput test. Enable watermark to 256 to guarantee the operation
stability.


Please see my comment on patch 6/8 regarding introducing queuing latency 
with this change.


Regards,
Arend


Reviewed-by: Arend van Spriel 
Signed-off-by: Wright Feng 
Signed-off-by: Chi-Hsien Lin 
---
 .../wireless/broadcom/brcm80211/brcmfmac/sdio.c| 26 --
 1 file changed, 24 insertions(+), 2 deletions(-)




Re: [PATCH V2 1/8] brcmfmac: add 4354 raw pcie device id

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

From: Winnie Chang 

Add the raw 4354 PCIe device ID for unprogrammed Cypress boards.


Already have my review tag so this is fine as is.


Reviewed-by: Arend Van Spriel 
Signed-off-by: Winnie Chang 
Signed-off-by: Chi-Hsien Lin 
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c   | 1 +
 drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 +
 2 files changed, 2 insertions(+)




Re: [PATCH V2 6/8] brcmfmac: update 43012 F2 watermark setting to fix DMA Error during UDP RX Traffic

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

From: Naveen Gupta 

The number of words that the read FIFO has to contain except
the end of frame before sends data back to the host.
Max watermark = (512B - 2* (BurstLength))/4 =
(512 - 128)/4 = 384/4 = 0x60
so if burst length (i.e. BurstLength = 64) is increased,
watermark has to be reduced. This is the optimal setting for this chip.

Reviewed-by: Arend van Spriel 
Signed-off-by: Naveen Gupta 
Signed-off-by: Chi-Hsien Lin 
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 7707b0169c21..e1708e297d07 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -52,6 +52,7 @@
 /* watermark expressed in number of words */
 #define DEFAULT_F2_WATERMARK0x8
 #define CY_4373_F2_WATERMARK0x40
+#define CY_43012_F2_WATERMARK0x60


So basically you increase queuing in firmware rx path. How does this 
affect TCP latency. The DMA error obviously needs fixing, but why go 
from a watermark of 32 bytes to the maximum of 384 bytes. Same question 
for 4373.


Regards,
Arend


Re: [PATCH V2 3/8] brcmfmac: set SDIO F1 MesBusyCtrl for CYW4373

2018-11-12 Thread Arend van Spriel

On 11/12/2018 8:29 AM, Chi-Hsien Lin wrote:

From: Madhan Mohan R 

Along with F2 watermark (existing) configuration, F1 MesBusyCtrl
should be enabled & configured to avoid overflow errors.


I am a bit confused. Why is it necessary to program the watermark in 
both SBSDIO_WATERMARK (0x10008) and SDSDIO_FUNC1_MESBUSYCTRL (0x1001D).

Looks suspicious to me.

Regards,
Arend


[PATCH v2 5/5] iwlwifi: mvm: don't use SAR Geo if basic SAR is not used

2018-11-12 Thread Luca Coelho
From: Luca Coelho 

We can't use SAR Geo if basic SAR is not enabled, since the SAR Geo
tables define offsets in relation to the basic SAR table in use.

To fix this, make iwl_mvm_sar_init() return one in case WRDS is not
available, so we can skip reading WGDS entirely.

Fixes: a6bff3cb19b7 ("iwlwifi: mvm: add GEO_TX_POWER_LIMIT cmd for geographic 
tx power table")
Cc: sta...@vger.kernel.org # 4.12+
Signed-off-by: Luca Coelho 
---
In v2:
   * fix compilation when CONFIG_ACPI is not set;

drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 36 -
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
index 899f4a6432fb..2ba890445c35 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
@@ -928,6 +928,11 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm)
return -ENOENT;
 }
 
+static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
+{
+   return -ENOENT;
+}
+
 static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
 {
return 0;
@@ -954,8 +959,11 @@ static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
IWL_DEBUG_RADIO(mvm,
"WRDS SAR BIOS table invalid or unavailable. 
(%d)\n",
ret);
-   /* if not available, don't fail and don't bother with EWRD */
-   return 0;
+   /*
+* If not available, don't fail and don't bother with EWRD.
+* Return 1 to tell that we can't use WGDS either.
+*/
+   return 1;
}
 
ret = iwl_mvm_sar_get_ewrd_table(mvm);
@@ -968,9 +976,13 @@ static int iwl_mvm_sar_init(struct iwl_mvm *mvm)
/* choose profile 1 (WRDS) as default for both chains */
ret = iwl_mvm_sar_select_profile(mvm, 1, 1);
 
-   /* if we don't have profile 0 from BIOS, just skip it */
+   /*
+* If we don't have profile 0 from BIOS, just skip it.  This
+* means that SAR Geo will not be enabled either, even if we
+* have other valid profiles.
+*/
if (ret == -ENOENT)
-   return 0;
+   return 1;
 
return ret;
 }
@@ -1168,11 +1180,19 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
 
ret = iwl_mvm_sar_init(mvm);
-   if (ret)
-   goto error;
+   if (ret == 0) {
+   ret = iwl_mvm_sar_geo_init(mvm);
+   } else if (ret > 0 && !iwl_mvm_sar_get_wgds_table(mvm)) {
+   /*
+* If basic SAR is not available, we check for WGDS,
+* which should *not* be available either.  If it is
+* available, issue an error, because we can't use SAR
+* Geo without basic SAR.
+*/
+   IWL_ERR(mvm, "BIOS contains WGDS but no WRDS\n");
+   }
 
-   ret = iwl_mvm_sar_geo_init(mvm);
-   if (ret)
+   if (ret < 0)
goto error;
 
iwl_mvm_leds_sync(mvm);
-- 
2.19.1