[PATCH 1/2] rsi: fix nommu_map_sg overflow kernel panic

2018-04-11 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

Following overflow kernel panic is observed on some platforms while
loading the driver. It is fixed if dynamically allocated memory is
passed to SDIO instead of static one

[  927.513963] nommu_map_sg: overflow 17d54064ba7c+20 of device mask 
[  927.517712] Modules linked in: rsi_sdio(+) cmac bnep arc4 rsi_91x mac80211 
cfg80211
   btrsi rfcomm bluetooth ecdh_generic snd_soc_sst_bytcr_rt5660
[  927.517861] CPU: 0 PID: 1624 Comm: insmod Tainted: G W 4.15.0-1000 #1
[  927.517870] RIP: 0010:sdhci_send_command+0x5f0/0xa90 [sdhci]
[  927.517873] RSP: :ac3fc064b6d8 EFLAGS: 00010086
[  927.517895] Call Trace:
[  927.517908]  ? __schedule+0x3cd/0x890
[  927.517915]  ? mod_timer+0x17b/0x3c0
[  927.517922]  sdhci_request+0x7c/0xf0 [sdhci]
[  927.517928]  __mmc_start_request+0x5a/0x170
[  927.517932]  mmc_start_request+0x74/0x90
[  927.517936]  mmc_wait_for_req+0x87/0xe0
[  927.517940]  mmc_io_rw_extended+0x2fd/0x330
[  927.517946]  ? mmc_wait_data_done+0x30/0x30
[  927.517951]  sdio_io_rw_ext_helper+0x160/0x210
[  927.517956]  sdio_writesb+0x1d/0x20
[  927.517966]  rsi_sdio_write_register_multiple+0x68/0x110 [rsi_sdio]
[  927.517976]  rsi_hal_device_init+0x357/0x910 [rsi_91x]
[  927.517983]  ? rsi_hal_device_init+0x357/0x910 [rsi_91x]
[  927.517990]  rsi_probe+0x2c6/0x450 [rsi_sdio]
[  927.517995]  sdio_bus_probe+0xfc/0x110
[  927.518000]  driver_probe_device+0x2b3/0x490
[  927.518005]  __driver_attach+0xdf/0xf0
[  927.518008]  ? driver_probe_device+0x490/0x490
[  927.518014]  bus_for_each_dev+0x6c/0xc0
[  927.518018]  driver_attach+0x1e/0x20
[  927.518021]  bus_add_driver+0x1f4/0x270
[  927.518028]  ? rsi_sdio_ack_intr+0x50/0x50 [rsi_sdio]
[  927.518031]  driver_register+0x60/0xe0
[  927.518038]  ? rsi_sdio_ack_intr+0x50/0x50 [rsi_sdio]
[  927.518041]  sdio_register_driver+0x20/0x30
[  927.518047]  rsi_module_init+0x16/0x40 [rsi_sdio]

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 35 -
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 21 +---
 drivers/net/wireless/rsi/rsi_sdio.h |  2 +-
 3 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index b7c5403..0761e61 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -635,28 +635,32 @@ static int bl_write_header(struct rsi_hw *adapter, u8 
*flash_content,
   u32 content_size)
 {
struct rsi_host_intf_ops *hif_ops = adapter->host_intf_ops;
-   struct bl_header bl_hdr;
+   struct bl_header *bl_hdr;
u32 write_addr, write_len;
int status;
 
-   bl_hdr.flags = 0;
-   bl_hdr.image_no = cpu_to_le32(adapter->priv->coex_mode);
-   bl_hdr.check_sum = cpu_to_le32(
-   *(u32 *)_content[CHECK_SUM_OFFSET]);
-   bl_hdr.flash_start_address = cpu_to_le32(
-   *(u32 *)_content[ADDR_OFFSET]);
-   bl_hdr.flash_len = cpu_to_le32(*(u32 *)_content[LEN_OFFSET]);
+   bl_hdr = kzalloc(sizeof(*bl_hdr), GFP_KERNEL);
+   if (!bl_hdr)
+   return -ENOMEM;
+
+   bl_hdr->flags = 0;
+   bl_hdr->image_no = cpu_to_le32(adapter->priv->coex_mode);
+   bl_hdr->check_sum =
+   cpu_to_le32(*(u32 *)_content[CHECK_SUM_OFFSET]);
+   bl_hdr->flash_start_address =
+   cpu_to_le32(*(u32 *)_content[ADDR_OFFSET]);
+   bl_hdr->flash_len = cpu_to_le32(*(u32 *)_content[LEN_OFFSET]);
write_len = sizeof(struct bl_header);
 
if (adapter->rsi_host_intf == RSI_HOST_INTF_USB) {
write_addr = PING_BUFFER_ADDRESS;
status = hif_ops->write_reg_multiple(adapter, write_addr,
-(u8 *)_hdr, write_len);
+(u8 *)bl_hdr, write_len);
if (status < 0) {
rsi_dbg(ERR_ZONE,
"%s: Failed to load Version/CRC structure\n",
__func__);
-   return status;
+   goto fail;
}
} else {
write_addr = PING_BUFFER_ADDRESS >> 16;
@@ -665,20 +669,23 @@ static int bl_write_header(struct rsi_hw *adapter, u8 
*flash_content,
rsi_dbg(ERR_ZONE,
"%s: Unable to set ms word to common reg\n",
__func__);
-   return status;
+   goto fail;
}
write_addr = RSI_SD_REQUEST_MASTER |
 (

[PATCH 2/2] rsi: Fix 'invalid vdd' warning in mmc

2018-04-11 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

While performing cleanup, driver is messing with card->ocr
value by not masking rocr against ocr_avail. Below panic
is observed with some of the SDIO host controllers due to
this. Issue is resolved by reverting incorrect modifications
to vdd.

[  927.423821] mmc1: Invalid vdd 0x1f
[  927.423925] Modules linked in: rsi_sdio(+) cmac bnep arc4 rsi_91x
   mac80211 cfg80211 btrsi rfcomm bluetooth ecdh_generic
[  927.424073] CPU: 0 PID: 1624 Comm: insmod Tainted: G W
4.15.0-1000-caracalla #1
[  927.424075] Hardware name: Dell Inc. Edge Gateway3003/  , BIOS 
01.00.06 01/22/2018
[  927.424082] RIP: 0010:sdhci_set_power_noreg+0xdd/0x190[sdhci]
[  927.424085] RSP: 0018:ac3fc064b930 EFLAGS:  00010282
[  927.424107] Call Trace:
[  927.424118]  sdhci_set_power+0x5a/0x60 [sdhci]
[  927.424125]  sdhci_set_ios+0x360/0x3b0 [sdhci]
[  927.424133]  mmc_set_initial_state+0x92/0x120
[  927.424137]  mmc_power_up.part.34+0x33/0x1d0
[  927.424141]  mmc_power_up+0x17/0x20
[  927.424147]  mmc_sdio_runtime_resume+0x2d/0x50
[  927.424151]  mmc_runtime_resume+0x17/0x20
[  927.424156]  __rpm_callback+0xc4/0x200
[  927.424161]  ? idr_alloc_cyclic+0x57/0xd0
[  927.424165]  ? mmc_runtime_suspend+0x20/0x20
[  927.424169]  rpm_callback+0x24/0x80
[  927.424172]  ? mmc_runtime_suspend+0x20/0x20
[  927.424176]  rpm_resume+0x4b3/0x6c0
[  927.424181]  __pm_runtime_resume+0x4e/0x80
[  927.424188]  driver_probe_device+0x41/0x490
[  927.424192]  __driver_attach+0xdf/0xf0
[  927.424196]  ? driver_probe_device+0x490/0x490
[  927.424201]  bus_for_each_dev+0x6c/0xc0
[  927.424205]  driver_attach+0x1e/0x20
[  927.424209]  bus_add_driver+0x1f4/0x270
[  927.424217]  ? rsi_sdio_ack_intr+0x50/0x50 [rsi_sdio]
[  927.424221]  driver_register+0x60/0xe0
[  927.424227]  ? rsi_sdio_ack_intr+0x50/0x50 [rsi_sdio]
[  927.424231]  sdio_register_driver+0x20/0x30
[  927.424237]  rsi_module_init+0x16/0x40 [rsi_sdio]

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index f7f2820..416981d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -170,7 +170,6 @@ static void rsi_reset_card(struct sdio_func *pfunction)
int err;
struct mmc_card *card = pfunction->card;
struct mmc_host *host = card->host;
-   s32 bit = (fls(host->ocr_avail) - 1);
u8 cmd52_resp;
u32 clock, resp, i;
u16 rca;
@@ -190,7 +189,6 @@ static void rsi_reset_card(struct sdio_func *pfunction)
msleep(20);
 
/* Initialize the SDIO card */
-   host->ios.vdd = bit;
host->ios.chip_select = MMC_CS_DONTCARE;
host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
host->ios.power_mode = MMC_POWER_UP;
-- 
2.7.4



[v2 RESEND 2/4] rsi: move descriptor preparation to core

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Descriptors preparation is moved to core instead of HAL to
avoid synchronization issues in sending TX frames

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_core.c | 11 +
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 43 +
 drivers/net/wireless/rsi/rsi_hal.h  |  2 ++
 3 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index 5dafd2e..f5d1756 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -413,6 +413,11 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
(ieee80211_is_qos_nullfunc(wh->frame_control))) {
q_num = MGMT_SOFT_Q;
skb->priority = q_num;
+
+   if (rsi_prepare_mgmt_desc(common, skb)) {
+   rsi_dbg(ERR_ZONE, "Failed to prepare desc\n");
+   goto xmit_fail;
+   }
} else {
if (ieee80211_is_data_qos(wh->frame_control)) {
tid = (skb->data[24] & IEEE80211_QOS_TID);
@@ -433,6 +438,8 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
if (!rsta)
goto xmit_fail;
tx_params->sta_id = rsta->sta_id;
+   } else {
+   tx_params->sta_id = 0;
}
 
if (rsta) {
@@ -443,6 +450,10 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
  tid, 0);
}
}
+   if (rsi_prepare_data_desc(common, skb)) {
+   rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
+   goto xmit_fail;
+   }
}
 
if ((q_num < MGMT_SOFT_Q) &&
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index ce6a86d..43d7d6c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -45,7 +45,7 @@ int rsi_send_pkt_to_bus(struct rsi_common *common, struct 
sk_buff *skb)
return status;
 }
 
-static int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff 
*skb)
+int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
struct ieee80211_hdr *wh = NULL;
@@ -113,17 +113,6 @@ static int rsi_prepare_mgmt_desc(struct rsi_common 
*common, struct sk_buff *skb)
if (conf_is_ht40(conf))
mgmt_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE);
 
-   if (ieee80211_is_probe_req(wh->frame_control)) {
-   if (!bss->assoc) {
-   rsi_dbg(INFO_ZONE,
-   "%s: blocking mgmt queue\n", __func__);
-   mgmt_desc->misc_flags = RSI_DESC_REQUIRE_CFM_TO_HOST;
-   xtend_desc->confirm_frame_type = PROBEREQ_CONFIRM;
-   common->mgmt_q_block = true;
-   rsi_dbg(INFO_ZONE, "Mgmt queue blocked\n");
-   }
-   }
-
if (ieee80211_is_probe_resp(wh->frame_control)) {
mgmt_desc->misc_flags |= (RSI_ADD_DELTA_TSF_VAP_ID |
  RSI_FETCH_RETRY_CNT_FRM_HST);
@@ -149,7 +138,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
 }
 
 /* This function prepares descriptor for given data packet */
-static int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff 
*skb)
+int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
struct ieee80211_vif *vif;
@@ -301,10 +290,6 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
(!bss->assoc))
goto err;
 
-   status = rsi_prepare_data_desc(common, skb);
-   if (status)
-   goto err;
-
status = rsi_send_pkt_to_bus(common, skb);
if (status)
rsi_dbg(ERR_ZONE, "%s: Failed to write pkt\n", __func__);
@@ -327,12 +312,18 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
  struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
+   struct ieee80211_bss_conf *bss;
+   struct ieee80211_hdr *wh;
struct ieee80211_tx_info *info;
struct skb_info *tx_params;
+   struct rsi_mgmt_desc *mgmt_desc;
+   struct rsi_xtended_desc *xtend_desc;
int status = -E2BIG;
+

[v2 RESEND 4/4] rsi: roaming enhancements

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

To support roaming below changes are done:
* Station notify frame is send to firmware after sending assoc
  request. This will avoid dropping of first EAPOL frame due to
  delay in creation of station control block in firmware.
* Data queues are unblocked after sending station notify in open
  mode, after configuring key in WEP mode, and after receiving
  EAPOL4 confirm in WPA mode.
* Initial EAPOL frames priority is chaged to MGMT, rekey EAPOL
  frames priority changed to VO.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v2: Removed code of dropping data frames with wrong BSSID in driver,
mac80211 takes care of this (Kalle)
---
 drivers/net/wireless/rsi/rsi_91x_core.c | 16 +++
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 18 
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 18 +---
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 32 +
 drivers/net/wireless/rsi/rsi_main.h |  1 +
 drivers/net/wireless/rsi/rsi_mgmt.h | 10 -
 6 files changed, 78 insertions(+), 17 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index f5d1756..3ca468b9 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -411,6 +411,18 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
if ((ieee80211_is_mgmt(wh->frame_control)) ||
(ieee80211_is_ctl(wh->frame_control)) ||
(ieee80211_is_qos_nullfunc(wh->frame_control))) {
+   if (ieee80211_is_assoc_req(wh->frame_control) ||
+   ieee80211_is_reassoc_req(wh->frame_control)) {
+   struct ieee80211_bss_conf *bss = >bss_conf;
+
+   common->eapol4_confirm = false;
+   rsi_hal_send_sta_notify_frame(common,
+ RSI_IFTYPE_STATION,
+ STA_CONNECTED, bss->bssid,
+ bss->qos, bss->aid, 0,
+ vif);
+   }
+
q_num = MGMT_SOFT_Q;
skb->priority = q_num;
 
@@ -450,6 +462,10 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
  tid, 0);
}
}
+   if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+   q_num = MGMT_SOFT_Q;
+   skb->priority = q_num;
+   }
if (rsi_prepare_data_desc(common, skb)) {
rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
goto xmit_fail;
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 43d7d6c..b7c5403 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -232,6 +232,18 @@ int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
data_desc->misc_flags |= RSI_FETCH_RETRY_CNT_FRM_HST;
 #define EAPOL_RETRY_CNT 15
xtend_desc->retry_cnt = EAPOL_RETRY_CNT;
+
+   if (common->eapol4_confirm)
+   skb->priority = VO_Q;
+   else
+   rsi_set_len_qno(_desc->len_qno,
+   (skb->len - FRAME_DESC_SZ),
+   RSI_WIFI_MGMT_Q);
+   if ((skb->len - header_size) == EAPOL4_PACKET_LEN) {
+   data_desc->misc_flags |=
+   RSI_DESC_REQUIRE_CFM_TO_HOST;
+   xtend_desc->confirm_frame_type = EAPOL4_CONFIRM;
+   }
}
 
data_desc->mac_flags = cpu_to_le16(seq_num & 0xfff);
@@ -271,8 +283,11 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
struct rsi_hw *adapter = common->priv;
struct ieee80211_vif *vif;
struct ieee80211_tx_info *info;
+   struct skb_info *tx_params;
struct ieee80211_bss_conf *bss;
+   struct ieee80211_hdr *wh;
int status = -EINVAL;
+   u8 header_size;
 
if (!skb)
return 0;
@@ -284,6 +299,9 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
goto err;
vif = info->control.vif;
bss = >bss_conf;
+   tx_params = (struct skb_info *)info->driver_data;
+   header_size = tx_params->internal_hdr_size;
+   wh = (struct ieee80211_hdr *)>data[header_size];
 
if (((vif->type == 

[v2 RESEND 1/4] rsi: move xtend_desc structure from rsi_main.h to rsi_mgmt.h

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

All descriptor structures are in rsi_mgmt.h except this
extended descriptor structure. Hence moving it to rsi_mgmt.h
and also renaming to rsi_xtend_desc.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_hal.c | 12 ++--
 drivers/net/wireless/rsi/rsi_main.h|  6 --
 drivers/net/wireless/rsi/rsi_mgmt.h|  6 ++
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index de608ae..ce6a86d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -55,7 +55,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
struct rsi_mgmt_desc *mgmt_desc;
struct skb_info *tx_params;
struct ieee80211_bss_conf *bss = NULL;
-   struct xtended_desc *xtend_desc = NULL;
+   struct rsi_xtended_desc *xtend_desc = NULL;
u8 header_size;
u32 dword_align_bytes = 0;
 
@@ -69,7 +69,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
vif = tx_params->vif;
 
/* Update header size */
-   header_size = FRAME_DESC_SZ + sizeof(struct xtended_desc);
+   header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
if (header_size > skb_headroom(skb)) {
rsi_dbg(ERR_ZONE,
"%s: Failed to add extended descriptor\n",
@@ -92,7 +92,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
wh = (struct ieee80211_hdr *)>data[header_size];
 
mgmt_desc = (struct rsi_mgmt_desc *)skb->data;
-   xtend_desc = (struct xtended_desc *)>data[FRAME_DESC_SZ];
+   xtend_desc = (struct rsi_xtended_desc *)>data[FRAME_DESC_SZ];
 
rsi_set_len_qno(_desc->len_qno, (skb->len - FRAME_DESC_SZ),
RSI_WIFI_MGMT_Q);
@@ -158,7 +158,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
struct skb_info *tx_params;
struct ieee80211_bss_conf *bss;
struct rsi_data_desc *data_desc;
-   struct xtended_desc *xtend_desc;
+   struct rsi_xtended_desc *xtend_desc;
u8 ieee80211_size = MIN_802_11_HDR_LEN;
u8 header_size;
u8 vap_id = 0;
@@ -170,7 +170,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
bss = >bss_conf;
tx_params = (struct skb_info *)info->driver_data;
 
-   header_size = FRAME_DESC_SZ + sizeof(struct xtended_desc);
+   header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
if (header_size > skb_headroom(skb)) {
rsi_dbg(ERR_ZONE, "%s: Unable to send pkt\n", __func__);
return -ENOSPC;
@@ -188,7 +188,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
data_desc = (struct rsi_data_desc *)skb->data;
memset(data_desc, 0, header_size);
 
-   xtend_desc = (struct xtended_desc *)>data[FRAME_DESC_SZ];
+   xtend_desc = (struct rsi_xtended_desc *)>data[FRAME_DESC_SZ];
wh = (struct ieee80211_hdr *)>data[header_size];
seq_num = IEEE80211_SEQ_TO_SN(le16_to_cpu(wh->seq_ctrl));
 
diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ef4fa32..b81cdbf 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -190,12 +190,6 @@ struct cqm_info {
u32 rssi_hyst;
 };
 
-struct xtended_desc {
-   u8 confirm_frame_type;
-   u8 retry_cnt;
-   u16 reserved;
-};
-
 enum rsi_dfs_regions {
RSI_REGION_FCC = 0,
RSI_REGION_ETSI,
diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h 
b/drivers/net/wireless/rsi/rsi_mgmt.h
index cf6567a..6726e84 100644
--- a/drivers/net/wireless/rsi/rsi_mgmt.h
+++ b/drivers/net/wireless/rsi/rsi_mgmt.h
@@ -301,6 +301,12 @@ struct rsi_mac_frame {
 #define ENCAP_MGMT_PKT BIT(7)
 #define DESC_IMMEDIATE_WAKEUP  BIT(15)
 
+struct rsi_xtended_desc {
+   u8 confirm_frame_type;
+   u8 retry_cnt;
+   u16 reserved;
+};
+
 struct rsi_cmd_desc_dword0 {
__le16 len_qno;
u8 frame_type;
-- 
2.7.4



[v2 RESEND 3/4] rsi: enable 80MHz clock by default

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

80MHz clock for device should be enabled by default in
TX command frame radio capabilities.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c 
b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index c21fca7..9207da0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -325,8 +325,8 @@ static int rsi_load_radio_caps(struct rsi_common *common)
radio_caps->channel_num = common->channel;
radio_caps->rf_model = RSI_RF_TYPE;
 
+   radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
if (common->channel_width == BW_40MHZ) {
-   radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
radio_caps->radio_cfg_info |= RSI_ENABLE_40MHZ;
 
if (common->fsm_state == FSM_MAC_INIT_DONE) {
-- 
2.7.4



[v2 RESEND 0/4] rsi driver enhancements

2018-03-29 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series includes some code rearrangement and roaming related
improvements.

Changes in v2:
v2 1/4 is same as v1 2/10
v2 2/4 is same as v1 3/10
v2 3/4 is same as v1 4/10
v2 4/4 is updated version of v1 5/10

Remaining patches in v1 need major improvements. Couple of them
requires splitting the patch into multiple patches. So they will be
submitted separately.

Resending as v1->v2 change info was missed in v2 4/4

Prameela Rani Garnepudi (4):
  rsi: move xtend_desc structure from rsi_main.h to rsi_mgmt.h
  rsi: move descriptor preparation to core
  rsi: enable 80MHz clock by default
  rsi: roaming enhancements

 drivers/net/wireless/rsi/rsi_91x_core.c | 27 +++
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 73 ++---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 18 +--
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 34 --
 drivers/net/wireless/rsi/rsi_hal.h  |  2 +
 drivers/net/wireless/rsi/rsi_main.h |  7 +--
 drivers/net/wireless/rsi/rsi_mgmt.h | 16 ++-
 7 files changed, 126 insertions(+), 51 deletions(-)

-- 
2.7.4



[v2 4/4] rsi: roaming enhancements

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

To support roaming below changes are done:
* Station notify frame is send to firmware after sending assoc
  request. This will avoid dropping of first EAPOL frame due to
  delay in creation of station control block in firmware.
* Data queues are unblocked after sending station notify in open
  mode, after configuring key in WEP mode, and after receiving
  EAPOL4 confirm in WPA mode.
* Initial EAPOL frames priority is chaged to MGMT, rekey EAPOL
  frames priority changed to VO.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_core.c | 16 +++
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 18 
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 18 +---
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 32 +
 drivers/net/wireless/rsi/rsi_main.h |  1 +
 drivers/net/wireless/rsi/rsi_mgmt.h | 10 -
 6 files changed, 78 insertions(+), 17 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index f5d1756..3ca468b9 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -411,6 +411,18 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
if ((ieee80211_is_mgmt(wh->frame_control)) ||
(ieee80211_is_ctl(wh->frame_control)) ||
(ieee80211_is_qos_nullfunc(wh->frame_control))) {
+   if (ieee80211_is_assoc_req(wh->frame_control) ||
+   ieee80211_is_reassoc_req(wh->frame_control)) {
+   struct ieee80211_bss_conf *bss = >bss_conf;
+
+   common->eapol4_confirm = false;
+   rsi_hal_send_sta_notify_frame(common,
+ RSI_IFTYPE_STATION,
+ STA_CONNECTED, bss->bssid,
+ bss->qos, bss->aid, 0,
+ vif);
+   }
+
q_num = MGMT_SOFT_Q;
skb->priority = q_num;
 
@@ -450,6 +462,10 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
  tid, 0);
}
}
+   if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+   q_num = MGMT_SOFT_Q;
+   skb->priority = q_num;
+   }
if (rsi_prepare_data_desc(common, skb)) {
rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
goto xmit_fail;
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 43d7d6c..b7c5403 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -232,6 +232,18 @@ int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
data_desc->misc_flags |= RSI_FETCH_RETRY_CNT_FRM_HST;
 #define EAPOL_RETRY_CNT 15
xtend_desc->retry_cnt = EAPOL_RETRY_CNT;
+
+   if (common->eapol4_confirm)
+   skb->priority = VO_Q;
+   else
+   rsi_set_len_qno(_desc->len_qno,
+   (skb->len - FRAME_DESC_SZ),
+   RSI_WIFI_MGMT_Q);
+   if ((skb->len - header_size) == EAPOL4_PACKET_LEN) {
+   data_desc->misc_flags |=
+   RSI_DESC_REQUIRE_CFM_TO_HOST;
+   xtend_desc->confirm_frame_type = EAPOL4_CONFIRM;
+   }
}
 
data_desc->mac_flags = cpu_to_le16(seq_num & 0xfff);
@@ -271,8 +283,11 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
struct rsi_hw *adapter = common->priv;
struct ieee80211_vif *vif;
struct ieee80211_tx_info *info;
+   struct skb_info *tx_params;
struct ieee80211_bss_conf *bss;
+   struct ieee80211_hdr *wh;
int status = -EINVAL;
+   u8 header_size;
 
if (!skb)
return 0;
@@ -284,6 +299,9 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
goto err;
vif = info->control.vif;
bss = >bss_conf;
+   tx_params = (struct skb_info *)info->driver_data;
+   header_size = tx_params->internal_hdr_size;
+   wh = (struct ieee80211_hdr *)>data[header_size];
 
if (((vif->type == NL80211_IFTYPE_STATION) ||
 (vif->type == NL80211_IFTYPE_P2P_CLIENT)) &&
diff --git a/drive

[v2 2/4] rsi: move descriptor preparation to core

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Descriptors preparation is moved to core instead of HAL to
avoid synchronization issues in sending TX frames

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_core.c | 11 +
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 43 +
 drivers/net/wireless/rsi/rsi_hal.h  |  2 ++
 3 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index 5dafd2e..f5d1756 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -413,6 +413,11 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
(ieee80211_is_qos_nullfunc(wh->frame_control))) {
q_num = MGMT_SOFT_Q;
skb->priority = q_num;
+
+   if (rsi_prepare_mgmt_desc(common, skb)) {
+   rsi_dbg(ERR_ZONE, "Failed to prepare desc\n");
+   goto xmit_fail;
+   }
} else {
if (ieee80211_is_data_qos(wh->frame_control)) {
tid = (skb->data[24] & IEEE80211_QOS_TID);
@@ -433,6 +438,8 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
if (!rsta)
goto xmit_fail;
tx_params->sta_id = rsta->sta_id;
+   } else {
+   tx_params->sta_id = 0;
}
 
if (rsta) {
@@ -443,6 +450,10 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
  tid, 0);
}
}
+   if (rsi_prepare_data_desc(common, skb)) {
+   rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
+   goto xmit_fail;
+   }
}
 
if ((q_num < MGMT_SOFT_Q) &&
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index ce6a86d..43d7d6c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -45,7 +45,7 @@ int rsi_send_pkt_to_bus(struct rsi_common *common, struct 
sk_buff *skb)
return status;
 }
 
-static int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff 
*skb)
+int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
struct ieee80211_hdr *wh = NULL;
@@ -113,17 +113,6 @@ static int rsi_prepare_mgmt_desc(struct rsi_common 
*common, struct sk_buff *skb)
if (conf_is_ht40(conf))
mgmt_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE);
 
-   if (ieee80211_is_probe_req(wh->frame_control)) {
-   if (!bss->assoc) {
-   rsi_dbg(INFO_ZONE,
-   "%s: blocking mgmt queue\n", __func__);
-   mgmt_desc->misc_flags = RSI_DESC_REQUIRE_CFM_TO_HOST;
-   xtend_desc->confirm_frame_type = PROBEREQ_CONFIRM;
-   common->mgmt_q_block = true;
-   rsi_dbg(INFO_ZONE, "Mgmt queue blocked\n");
-   }
-   }
-
if (ieee80211_is_probe_resp(wh->frame_control)) {
mgmt_desc->misc_flags |= (RSI_ADD_DELTA_TSF_VAP_ID |
  RSI_FETCH_RETRY_CNT_FRM_HST);
@@ -149,7 +138,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
 }
 
 /* This function prepares descriptor for given data packet */
-static int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff 
*skb)
+int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
struct ieee80211_vif *vif;
@@ -301,10 +290,6 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
(!bss->assoc))
goto err;
 
-   status = rsi_prepare_data_desc(common, skb);
-   if (status)
-   goto err;
-
status = rsi_send_pkt_to_bus(common, skb);
if (status)
rsi_dbg(ERR_ZONE, "%s: Failed to write pkt\n", __func__);
@@ -327,12 +312,18 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
  struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
+   struct ieee80211_bss_conf *bss;
+   struct ieee80211_hdr *wh;
struct ieee80211_tx_info *info;
struct skb_info *tx_params;
+   struct rsi_mgmt_desc *mgmt_desc;
+   struct rsi_xtended_desc *xtend_desc;
int status = -E2BIG;
+

[v2 3/4] rsi: enable 80MHz clock by default

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

80MHz clock for device should be enabled by default in
TX command frame radio capabilities.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c 
b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index c21fca7..9207da0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -325,8 +325,8 @@ static int rsi_load_radio_caps(struct rsi_common *common)
radio_caps->channel_num = common->channel;
radio_caps->rf_model = RSI_RF_TYPE;
 
+   radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
if (common->channel_width == BW_40MHZ) {
-   radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
radio_caps->radio_cfg_info |= RSI_ENABLE_40MHZ;
 
if (common->fsm_state == FSM_MAC_INIT_DONE) {
-- 
2.7.4



[v2 0/4] rsi driver enhancements

2018-03-29 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series includes some code rearrangement and roaming related
improvements.

Changes in v2:
v2 1/4 is same as v1 2/10
v2 2/4 is same as v1 3/10
v2 3/4 is same as v1 4/10
v2 4/4 is updated version of v1 5/10

Remaining patches in v1 need major improvements. Couple of them
requires splitting the patch into multiple patches. So they will be
submitted separately.

Prameela Rani Garnepudi (4):
  rsi: move xtend_desc structure from rsi_main.h to rsi_mgmt.h
  rsi: move descriptor preparation to core
  rsi: enable 80MHz clock by default
  rsi: roaming enhancements

 drivers/net/wireless/rsi/rsi_91x_core.c | 27 +++
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 73 ++---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 18 +--
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 34 --
 drivers/net/wireless/rsi/rsi_hal.h  |  2 +
 drivers/net/wireless/rsi/rsi_main.h |  7 +--
 drivers/net/wireless/rsi/rsi_mgmt.h | 16 ++-
 7 files changed, 126 insertions(+), 51 deletions(-)

-- 
2.7.4



[v2 1/4] rsi: move xtend_desc structure from rsi_main.h to rsi_mgmt.h

2018-03-29 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

All descriptor structures are in rsi_mgmt.h except this
extended descriptor structure. Hence moving it to rsi_mgmt.h
and also renaming to rsi_xtend_desc.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_hal.c | 12 ++--
 drivers/net/wireless/rsi/rsi_main.h|  6 --
 drivers/net/wireless/rsi/rsi_mgmt.h|  6 ++
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index de608ae..ce6a86d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -55,7 +55,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
struct rsi_mgmt_desc *mgmt_desc;
struct skb_info *tx_params;
struct ieee80211_bss_conf *bss = NULL;
-   struct xtended_desc *xtend_desc = NULL;
+   struct rsi_xtended_desc *xtend_desc = NULL;
u8 header_size;
u32 dword_align_bytes = 0;
 
@@ -69,7 +69,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
vif = tx_params->vif;
 
/* Update header size */
-   header_size = FRAME_DESC_SZ + sizeof(struct xtended_desc);
+   header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
if (header_size > skb_headroom(skb)) {
rsi_dbg(ERR_ZONE,
"%s: Failed to add extended descriptor\n",
@@ -92,7 +92,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
wh = (struct ieee80211_hdr *)>data[header_size];
 
mgmt_desc = (struct rsi_mgmt_desc *)skb->data;
-   xtend_desc = (struct xtended_desc *)>data[FRAME_DESC_SZ];
+   xtend_desc = (struct rsi_xtended_desc *)>data[FRAME_DESC_SZ];
 
rsi_set_len_qno(_desc->len_qno, (skb->len - FRAME_DESC_SZ),
RSI_WIFI_MGMT_Q);
@@ -158,7 +158,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
struct skb_info *tx_params;
struct ieee80211_bss_conf *bss;
struct rsi_data_desc *data_desc;
-   struct xtended_desc *xtend_desc;
+   struct rsi_xtended_desc *xtend_desc;
u8 ieee80211_size = MIN_802_11_HDR_LEN;
u8 header_size;
u8 vap_id = 0;
@@ -170,7 +170,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
bss = >bss_conf;
tx_params = (struct skb_info *)info->driver_data;
 
-   header_size = FRAME_DESC_SZ + sizeof(struct xtended_desc);
+   header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
if (header_size > skb_headroom(skb)) {
rsi_dbg(ERR_ZONE, "%s: Unable to send pkt\n", __func__);
return -ENOSPC;
@@ -188,7 +188,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
data_desc = (struct rsi_data_desc *)skb->data;
memset(data_desc, 0, header_size);
 
-   xtend_desc = (struct xtended_desc *)>data[FRAME_DESC_SZ];
+   xtend_desc = (struct rsi_xtended_desc *)>data[FRAME_DESC_SZ];
wh = (struct ieee80211_hdr *)>data[header_size];
seq_num = IEEE80211_SEQ_TO_SN(le16_to_cpu(wh->seq_ctrl));
 
diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ef4fa32..b81cdbf 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -190,12 +190,6 @@ struct cqm_info {
u32 rssi_hyst;
 };
 
-struct xtended_desc {
-   u8 confirm_frame_type;
-   u8 retry_cnt;
-   u16 reserved;
-};
-
 enum rsi_dfs_regions {
RSI_REGION_FCC = 0,
RSI_REGION_ETSI,
diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h 
b/drivers/net/wireless/rsi/rsi_mgmt.h
index cf6567a..6726e84 100644
--- a/drivers/net/wireless/rsi/rsi_mgmt.h
+++ b/drivers/net/wireless/rsi/rsi_mgmt.h
@@ -301,6 +301,12 @@ struct rsi_mac_frame {
 #define ENCAP_MGMT_PKT BIT(7)
 #define DESC_IMMEDIATE_WAKEUP  BIT(15)
 
+struct rsi_xtended_desc {
+   u8 confirm_frame_type;
+   u8 retry_cnt;
+   u16 reserved;
+};
+
 struct rsi_cmd_desc_dword0 {
__le16 len_qno;
u8 frame_type;
-- 
2.7.4



Re: [PATCH 01/10] rsi: add support for hardware scan offload

2018-03-27 Thread Amitkumar Karwar
Hi Kalle/Johannes,

On Tue, Mar 27, 2018 at 7:48 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Johannes Berg <johan...@sipsolutions.net> writes:
>
>> On Fri, 2018-03-23 at 20:20 +0530, Amitkumar Karwar wrote:
>>
>>> > But maybe that's not really true at all? At least in one case it seems
>>> > you just kick off something called "bgscan".
>>>
>>> Yes. We have different scan implementations for device is connected
>>> and non-connected cases. In connected case, firmware will take care of
>>> timings when driver configures bgscan parameters due to power save and
>>> coex restrictions. In non-connected state, driver is taking care of
>>> it.
>>> I found hardware scan in mac80211 more suitable for our device.
>>
>> Yeah it's a bit odd though that you're still implementing software scan
>> :-)
>>
>> Perhaps we could make a special return code from the hwscan callback
>> that would tell mac80211 to fall back to software scanning, so you'd
>> only implement the connected case, and leave the rest up to mac80211?
>
> Hehe, this is exactly what I proposed during my review :)
>

Sounds good. I will prepare a patch with this approach.

Regards,
Amitkumar


Re: [PATCH 10/10] rsi: drop RX broadcast/multicast packets with invalid PN

2018-03-23 Thread Amitkumar Karwar
On Wed, Mar 21, 2018 at 4:25 AM, Johannes Berg
<johan...@sipsolutions.net> wrote:
> On Mon, 2018-03-05 at 20:07 +0530, Amitkumar Karwar wrote:
>> From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>>
>> This patch adds a check to drop received broadcast/multicast frames
>> if
>> PN is invalid (i.e. not greater than last PN). bc_mc_pn
>> variable added for each interface
>>
> Can you say why you do this rather than letting mac80211 do it?

Thanks for your comment.
I wasn't aware that mac80211 can do this even for decrypted Rx
packets. Only thing is we need to avoid IV stripping. I will create a
patch for it.

Regards,
Amitkumar


Re: [PATCH 01/10] rsi: add support for hardware scan offload

2018-03-23 Thread Amitkumar Karwar
On Wed, Mar 21, 2018 at 4:02 AM, Johannes Berg
<johan...@sipsolutions.net> wrote:
> On Thu, 2018-03-15 at 14:57 +0530, Amitkumar Karwar wrote:
>>
>> > What I don't like here is that you are duplicating functionality
>> > already
>> > existing in mac80211 and I hope there is a better way to solve the
>> > problem. Just as a a crazy idea what if the driver returns
>> > -EOPNOTSUPP
>> > when hardware scan is not possible and mac80211 falls back to
>> > software
>> > scan? But of course this depends on what Johannes thinks.
>>
>> Currently mac80211 offloads scan to driver if "ops->hw_scan" is
>> implemented. Otherwise falls back to software scan.
>> I can see below vendors have already implemented hw_scan with their
>> own scan state machine. This patch does the same thing.
>> Let me know if I missed anything here.
>
> I think the argument is that at least it looks like you're implementing
> the timing etc. in software in the driver again, which others don't do,
> they do it in firmware. Which is just software again, but we don't see
> it ;-)

Understood. Timing logic is either is hardware or mac80211 for others.

> But maybe that's not really true at all? At least in one case it seems
> you just kick off something called "bgscan".

Yes. We have different scan implementations for device is connected
and non-connected cases. In connected case, firmware will take care of
timings when driver configures bgscan parameters due to power save and
coex restrictions. In non-connected state, driver is taking care of
it.
I found hardware scan in mac80211 more suitable for our device.

Regards,
Amitkumar Karwar


[PATCH 2/2] rsi: fix kernel panic observed on 64bit machine

2018-03-20 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

Following kernel panic is observed on 64bit machine while loading
the driver. It is fixed if we pass dynamically allocated memory to
SDIO for DMA.

BUG: unable to handle kernel paging request at eb04000172e0
IP: sg_miter_stop+0x56/0x70
PGD 0 P4D 0
Oops:  [#1] SMP PTI
Modules linked in: rsi_sdio(OE+) rsi_91x(OE) btrsi(OE) rfcomm bluetooth
ecdh_generic mac80211 mmc_block fuse xt_CHECKSUM iptable_mangle
drm_kms_helper mmc_core serio_raw drm firewire_ohci tg3
CPU: 0 PID: 4003 Comm: insmod Tainted: G   OE4.16.0-rc1+ #27
Hardware name: Dell Inc. Latitude E5500  /0DW634, BIOS
A19 06/13/2013
RIP: 0010:sg_miter_stop+0x56/0x70
RSP: 0018:88007d003e78 EFLAGS: 00010002
RAX: 0003 RBX: 0004 RCX: 
RDX: eb04000172c0 RSI: 88002f58002c RDI: 88007d003e80
RBP: 0004 R08: 88007d003e80 R09: 0008
R10: 0003 R11: 0001 R12: 0004
R13: 88002f580028 R14:  R15: 0004
FS:  7f35c29db700() GS:88007d00()
knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2: eb04000172e0 CR3: 7038e000 CR4: 000406f0
Call Trace:

sg_copy_buffer+0xc6/0xf0
sdhci_tasklet_finish+0x170/0x260 [sdhci]
tasklet_action+0xf4/0x100
__do_softirq+0xef/0x26e
irq_exit+0xbe/0xd0
do_IRQ+0x4a/0xc0
common_interrupt+0xa2/0xa2


Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 32 +---
 drivers/net/wireless/rsi/rsi_sdio.h |  2 ++
 2 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 9ce2edb..d76e69c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -653,11 +653,14 @@ static int rsi_sdio_master_reg_read(struct rsi_hw 
*adapter, u32 addr,
u32 *read_buf, u16 size)
 {
u32 addr_on_bus, *data;
-   u32 align[2] = {};
u16 ms_addr;
int status;
 
-   data = PTR_ALIGN([0], 8);
+   data = kzalloc(RSI_MASTER_REG_BUF_SIZE, GFP_KERNEL);
+   if (!data)
+   return -ENOMEM;
+
+   data = PTR_ALIGN(data, 8);
 
ms_addr = (addr >> 16);
status = rsi_sdio_master_access_msword(adapter, ms_addr);
@@ -665,7 +668,7 @@ static int rsi_sdio_master_reg_read(struct rsi_hw *adapter, 
u32 addr,
rsi_dbg(ERR_ZONE,
"%s: Unable to set ms word to common reg\n",
__func__);
-   return status;
+   goto err;
}
addr &= 0x;
 
@@ -683,7 +686,7 @@ static int rsi_sdio_master_reg_read(struct rsi_hw *adapter, 
u32 addr,
 (u8 *)data, 4);
if (status < 0) {
rsi_dbg(ERR_ZONE, "%s: AHB register read failed\n", __func__);
-   return status;
+   goto err;
}
if (size == 2) {
if ((addr & 0x3) == 0)
@@ -705,17 +708,23 @@ static int rsi_sdio_master_reg_read(struct rsi_hw 
*adapter, u32 addr,
*read_buf = *data;
}
 
-   return 0;
+err:
+   kfree(data);
+   return status;
 }
 
 static int rsi_sdio_master_reg_write(struct rsi_hw *adapter,
 unsigned long addr,
 unsigned long data, u16 size)
 {
-   unsigned long data1[2], *data_aligned;
+   unsigned long *data_aligned;
int status;
 
-   data_aligned = PTR_ALIGN([0], 8);
+   data_aligned = kzalloc(RSI_MASTER_REG_BUF_SIZE, GFP_KERNEL);
+   if (!data_aligned)
+   return -ENOMEM;
+
+   data_aligned = PTR_ALIGN(data_aligned, 8);
 
if (size == 2) {
*data_aligned = ((data << 16) | (data & 0x));
@@ -734,6 +743,7 @@ static int rsi_sdio_master_reg_write(struct rsi_hw *adapter,
rsi_dbg(ERR_ZONE,
"%s: Unable to set ms word to common reg\n",
__func__);
+   kfree(data_aligned);
return -EIO;
}
addr = addr & 0x;
@@ -743,12 +753,12 @@ static int rsi_sdio_master_reg_write(struct rsi_hw 
*adapter,
(adapter,
 (addr | RSI_SD_REQUEST_MASTER),
 (u8 *)data_aligned, size);
-   if (status < 0) {
+   if (status < 0)
rsi_dbg(ERR_ZONE,
"%s: Unable to do AHB reg write\n", __func__);
-   return status;
-   }
-   return 0;
+
+   kfree(data_aligned);
+   return status;
 }
 
 /**
diff --git a

[PATCH 1/2] rsi: fix error path handling in SDIO probe

2018-03-20 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

We miss to release IRQ in certain error path in SDIO probe which
causes following kernel panic. This patch corrects error path
handling

BUG: unable to handle kernel NULL pointer dereference at(null)
IP:   (null)
PGD 0 P4D 0
Oops: 0010 [#1] SMP PTI
Call Trace:
 
 ? call_timer_fn+0x29/0x120
 ? run_timer_softirq+0x1da/0x420
 ? timer_interrupt+0x11/0x20
 ? __do_softirq+0xef/0x26e
 ? irq_exit+0xbe/0xd0
 ? do_IRQ+0x4a/0xc0
 ? common_interrupt+0xa2/0xa2
 
 ? cpuidle_enter_state+0x118/0x250
 ? do_idle+0x186/0x1e0
 ? cpu_startup_entry+0x6f/0x80
 ? start_kernel+0x47c/0x49c
 ? secondary_startup_64+0xa5/0xb0

Fixes: 50117605770c ("rsi: improve RX handling in SDIO interface")
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 13 -
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 13705fc..9ce2edb 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -967,7 +967,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_sdio_rx_thread, "SDIO-RX-Thread");
if (status) {
rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__);
-   goto fail_free_adapter;
+   goto fail_kill_thread;
}
skb_queue_head_init(>rx_q.head);
sdev->rx_q.num_rx_pkts = 0;
@@ -977,7 +977,7 @@ static int rsi_probe(struct sdio_func *pfunction,
rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__);
sdio_release_host(pfunction);
status = -EIO;
-   goto fail_kill_thread;
+   goto fail_claim_irq;
}
sdio_release_host(pfunction);
rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__);
@@ -985,7 +985,7 @@ static int rsi_probe(struct sdio_func *pfunction,
if (rsi_hal_device_init(adapter)) {
rsi_dbg(ERR_ZONE, "%s: Failed in device init\n", __func__);
status = -EINVAL;
-   goto fail_kill_thread;
+   goto fail_dev_init;
}
rsi_dbg(INFO_ZONE, "===> RSI Device Init Done <===\n");
 
@@ -1002,10 +1002,13 @@ static int rsi_probe(struct sdio_func *pfunction,
 fail_dev_init:
sdio_claim_host(pfunction);
sdio_release_irq(pfunction);
-   sdio_disable_func(pfunction);
sdio_release_host(pfunction);
-fail_kill_thread:
+fail_claim_irq:
rsi_kill_thread(>rx_thread);
+fail_kill_thread:
+   sdio_claim_host(pfunction);
+   sdio_disable_func(pfunction);
+   sdio_release_host(pfunction);
 fail_free_adapter:
rsi_91x_deinit(adapter);
rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
-- 
2.7.4



Re: [PATCH 09/10] rsi: tx improvements

2018-03-15 Thread Amitkumar Karwar
On Tue, Mar 13, 2018 at 8:59 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> Changes done to improve TX path:
>> 1. Max number of frames to aggregate is increased to 8
>> 2. Bootup parameters updated.
>> 3. registering 5g band is done only when device supports
>> 4. Vif is properly taken to enable power save.
>> 5. When coex mode exist, power save on by default is set
>
> If you have a list of changes in the commit log to me that's a strong
> indication that you need to split the patches.
>
> Also I don't see any answers to question "Why?".

Sure. I will split into multiple incremental patches and submit with
proper commit log.

Regards,
Amitkumar


Re: [PATCH 08/10] rsi: device disconnect changes

2018-03-15 Thread Amitkumar Karwar
On Tue, Mar 13, 2018 at 8:57 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> Below changes are done:
>> 1. When HCI detach is called, making bt_adapter null and checking
>> for this variable where ever required.
>> 2. In USB case, one extra register write is added to disable
>> firmware watchdog.
>> 3. When interface down is called as part of disconnect, don't
>> send RX filter frame.
>
> Why? What does this patch fix? Please explain that (symptoms) in the
> commit log.

Kindly ignore this patch. I will include proper commit log which
explains the issue and resolution in updated version.

Regards,
Amitkumar


Re: [PATCH 06/10] rsi: add module parameter rsi_reg

2018-03-15 Thread Amitkumar Karwar
On Tue, Mar 13, 2018 at 8:55 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> For few regulatory customizations, we are taking rsi_reg
>> as module parameter.
>
> Why?

We have a custom power table and country to region mapping, This
setting will be used only for a special mode called 'dlcar'
We want to have an option to enable this mode through a module parameter.
This patch introduces a module parameter. Next patch makes use of it.
Let me know if you have any suggestions here.

>> +static u16 rsi_reg = RSI_REG_DEF;
>> +module_param(rsi_reg, ushort, 0444)
>> +MODULE_PARM_DESC(rsi_reg, "0 - RSI_REG_DEF, 1 - RSI_REG_DLCAR");
>
> The documentation tells nothing.
>

Below are the details. I will add include this info if the approach
and patches(6/10 and 7/10) look ok to you.
0 - RSI_REG_DEF
 Keep default regulatory configuration
1 - RSI_REG_DLCAR
 Enable custom settings for 'dlcar' mode

Regards,
Amitkumar


Re: [PATCH 01/10] rsi: add support for hardware scan offload

2018-03-15 Thread Amitkumar Karwar
On Thu, Mar 15, 2018 at 2:30 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> On Tue, Mar 13, 2018 at 8:46 PM, Kalle Valo <kv...@codeaurora.org> wrote:
>>> Amitkumar Karwar <amitkar...@gmail.com> writes:
>>>
>>>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>>>
>>>> With the current approach of scanning, roaming delays
>>>> are observed. Firmware has support for back ground scanning.
>>>> To get this advantage, mac80211 hardware scan is implemented.
>>>> In this method, foreground scan is performed in driver and
>>>> back ground scan is configured to firmware.
>>>
>>> To me doesn't like a good idea to duplicate scan functionality in the
>>> driver.
>>
>> There is a limitation with our device. We need to configure background
>> scan parameters to firmware when device is connected.
>
> Yeah, I guessed that.
>
>> In non-connected state, we can directly dump probe requests received
>> from mac80211 as a part of software scan. Some synchronization issues
>> are with existing software scan when device is connected. This patch
>> implements hw_scan where these issues are no seen, as driver has more
>> control on scan state machine
>
> What I don't like here is that you are duplicating functionality already
> existing in mac80211 and I hope there is a better way to solve the
> problem. Just as a a crazy idea what if the driver returns -EOPNOTSUPP
> when hardware scan is not possible and mac80211 falls back to software
> scan? But of course this depends on what Johannes thinks.

Currently mac80211 offloads scan to driver if "ops->hw_scan" is
implemented. Otherwise falls back to software scan.
I can see below vendors have already implemented hw_scan with their
own scan state machine. This patch does the same thing.
Let me know if I missed anything here.

/ath/ath10k/mac.c:7684: .hw_scan = ath10k_hw_scan,
./ath/wcn36xx/main.c:1115: .hw_scan = wcn36xx_hw_scan,
./ath/ath9k/main.c:2626: ath9k_ops.hw_scan  = ath9k_hw_scan;
./st/cw1200/main.c:215: .hw_scan = cw1200_hw_scan,
./atmel/at76c50x-usb.c:2195: .hw_scan = at76_hw_scan,
./ti/wl1251/main.c:1376: .hw_scan = wl1251_op_hw_scan,
./ti/wlcore/main.c:5923: .hw_scan = wl1271_op_hw_scan,
./intel/iwlegacy/3945-mac.c:3485: .hw_scan = il_mac_hw_scan,
./intel/iwlegacy/3945-mac.c:3915: il3945_mac_ops.hw_scan = NULL;
./intel/iwlegacy/4965-mac.c:6352: .hw_scan = il_mac_hw_scan,
./intel/iwlwifi/mvm/mac80211.c:4343: .hw_scan = iwl_mvm_mac_hw_scan,
./intel/iwlwifi/dvm/mac80211.c:1627: .hw_scan = iwlagn_mac_hw_scan,
./mac80211_hwsim.c:2390: .hw_scan = mac80211_hwsim_hw_scan,

Regards,
Amitkumar


Re: [PATCH 05/10] rsi: roaming enhancements

2018-03-15 Thread Amitkumar Karwar
On Tue, Mar 13, 2018 at 8:54 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> To support roaming below changes are done:
>> * Station notify frame is send to firmware after sending assoc
>>   request. This will avoid dropping of first EAPOL frame due to
>>   delay in creation of station control block in firmware.
>> * Data queues are unblocked after sending station notify in open
>>   mode, after configuring key in WEP mode, and after receiving
>>   EAPOL4 confirm in WPA mode.
>> * Initial EAPOL frames priority is chaged to MGMT, rekey EAPOL
>>   frames priority changed to VO.
>> * Data frames with wrong BSSID are dropped.
>
> I don't know what Johannes thinks but IMHO the driver should not drop
> any data frames, it should just submit what mac80211 gives to it. All
> filtering should happen in mac80211 (or controlled by it).

This was just an extra check to ensure that when we roam from one AP
to another, we should drop frames for previous AP. We don't have any
evidence that such are received.
I will remove this change in next version.

Regards,
Amitkumar Karwar


Re: [PATCH 01/10] rsi: add support for hardware scan offload

2018-03-15 Thread Amitkumar Karwar
On Tue, Mar 13, 2018 at 8:48 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Kalle Valo <kv...@codeaurora.org> writes:
>
>> Amitkumar Karwar <amitkar...@gmail.com> writes:
>>
>>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>>
>>> With the current approach of scanning, roaming delays
>>> are observed. Firmware has support for back ground scanning.
>>> To get this advantage, mac80211 hardware scan is implemented.
>>> In this method, foreground scan is performed in driver and
>>> back ground scan is configured to firmware.
>>
>> To me doesn't like a good idea to duplicate scan functionality in the
>> driver.
>
> Also a pro tip: Don't place controversial patches as the first patch in
> a big patchset, instead put them last so that I can apply rest of
> patches anyway. Even better to submit them separately as RFC.

Got it. I will follow this.

Regards,
Amitkumar Karwar


Re: [PATCH 01/10] rsi: add support for hardware scan offload

2018-03-15 Thread Amitkumar Karwar
On Tue, Mar 13, 2018 at 8:46 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> With the current approach of scanning, roaming delays
>> are observed. Firmware has support for back ground scanning.
>> To get this advantage, mac80211 hardware scan is implemented.
>> In this method, foreground scan is performed in driver and
>> back ground scan is configured to firmware.
>
> To me doesn't like a good idea to duplicate scan functionality in the
> driver.

There is a limitation with our device. We need to configure background
scan parameters to firmware when device is connected. In non-connected
state, we can directly dump probe requests received from mac80211 as a
part of software scan.
Some synchronization issues are with existing software scan when
device is connected. This patch implements hw_scan where these issues
are no seen, as driver has more control on scan state machine

>
>> --- a/drivers/net/wireless/rsi/rsi_91x_main.c
>> +++ b/drivers/net/wireless/rsi/rsi_91x_main.c
>> @@ -324,6 +324,14 @@ struct rsi_hw *rsi_91x_init(u16 oper_mode)
>>   mutex_init(>rx_lock);
>>   mutex_init(>tx_bus_mutex);
>>
>> + rsi_init_event(>chan_set_event);
>> + rsi_init_event(>probe_cfm_event);
>> + rsi_init_event(>chan_change_event);
>> + rsi_init_event(>cancel_hw_scan_event);
>
> And I'm starting to dislike this rsi_init_event() even more (see my
> other mail). In upstream driver's custom abstractions are very much
> frowned upon, especially that it makes review harder.

Agreed. I will get rid of this in a separate cleanup patch series.

Regards,
Amitkumar Karwar


Re: Variable-length arrays considered bad

2018-03-08 Thread Amitkumar Karwar
On Thu, Mar 8, 2018 at 2:10 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Hi,
>
> in an lkml discussion[1] it was mentioned that variable-length arrays
> should not be used. Few warnings were found[2] from wireless:
>
> drivers/net/wireless/ath/ath9k/dfs.c:104:2: warning: ISO C90 forbids variable 
> length array 'max_bin' [-Wvla]
> drivers/net/wireless/rsi/rsi_91x_sdio.c:570:2: warning: ISO C90 forbids 
> variable length array 'temp_buf' [-Wvla]
>
> Patches welcome.
>
> [1] 
> https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qpxydaacu1rq...@mail.gmail.com
>
> [2] http://paste.ubuntu.com/p/srQxwPQS9s/
>

I will submit a cleanup patch for RSI warning

Regards,
Amitkumar Karwar


[PATCH 09/10] rsi: tx improvements

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

Changes done to improve TX path:
1. Max number of frames to aggregate is increased to 8
2. Bootup parameters updated.
3. registering 5g band is done only when device supports
4. Vif is properly taken to enable power save.
5. When coex mode exist, power save on by default is set

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_core.c |  4 +++-
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 36 +
 drivers/net/wireless/rsi/rsi_boot_params.h  |  3 ++-
 drivers/net/wireless/rsi/rsi_mgmt.h |  2 ++
 4 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index 3ca468b9..1f1b972 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -432,7 +432,9 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
}
} else {
if (ieee80211_is_data_qos(wh->frame_control)) {
-   tid = (skb->data[24] & IEEE80211_QOS_TID);
+   u8 *qos = ieee80211_get_qos_ctl(wh);
+
+   tid = *qos & IEEE80211_QOS_CTL_TID_MASK;
skb->priority = TID_TO_WME_AC(tid);
} else {
tid = IEEE80211_NONQOS_TID;
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c 
b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 63d43fc..70b2d61 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -240,6 +240,9 @@ static int rsi_mac80211_hw_scan_start(struct ieee80211_hw 
*hw,
 
rsi_dbg(INFO_ZONE, "* Hardware scan start *\n");
 
+   if (common->iface_down)
+   return -ENETDOWN;
+
if (common->fsm_state != FSM_MAC_INIT_DONE)
return -ENODEV;
 
@@ -697,7 +700,7 @@ static int rsi_mac80211_config(struct ieee80211_hw *hw,
 
/* Power save parameters */
if (changed & IEEE80211_CONF_CHANGE_PS) {
-   struct ieee80211_vif *vif;
+   struct ieee80211_vif *vif, *sta_vif = NULL;
unsigned long flags;
int i, set_ps = 1;
 
@@ -711,13 +714,20 @@ static int rsi_mac80211_config(struct ieee80211_hw *hw,
set_ps = 0;
break;
}
+   if (vif->type == NL80211_IFTYPE_STATION ||
+   vif->type == NL80211_IFTYPE_P2P_CLIENT) {
+   if (!sta_vif)
+   sta_vif = vif;
+   else if (vif->bss_conf.assoc)
+   sta_vif = vif;
+   }
}
-   if (set_ps) {
+   if (set_ps && sta_vif) {
spin_lock_irqsave(>ps_lock, flags);
if (conf->flags & IEEE80211_CONF_PS)
-   rsi_enable_ps(adapter, vif);
+   rsi_enable_ps(adapter, sta_vif);
else
-   rsi_disable_ps(adapter, vif);
+   rsi_disable_ps(adapter, sta_vif);
spin_unlock_irqrestore(>ps_lock, flags);
}
}
@@ -2051,9 +2061,16 @@ int rsi_mac80211_attach(struct rsi_common *common)
hw->uapsd_queues = RSI_IEEE80211_UAPSD_QUEUES;
hw->uapsd_max_sp_len = IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL;
 
-   hw->max_tx_aggregation_subframes = 6;
+   hw->max_tx_aggregation_subframes = RSI_MAX_TX_AGGR_FRMS;
+   hw->max_rx_aggregation_subframes = RSI_MAX_RX_AGGR_FRMS;
rsi_register_rates_channels(adapter, NL80211_BAND_2GHZ);
-   rsi_register_rates_channels(adapter, NL80211_BAND_5GHZ);
+   wiphy->bands[NL80211_BAND_2GHZ] =
+   >sbands[NL80211_BAND_2GHZ];
+   if (common->num_supp_bands > 1) {
+   rsi_register_rates_channels(adapter, NL80211_BAND_5GHZ);
+   wiphy->bands[NL80211_BAND_5GHZ] =
+   >sbands[NL80211_BAND_5GHZ];
+   }
hw->rate_control_algorithm = "AARF";
 
SET_IEEE80211_PERM_ADDR(hw, common->mac_addr);
@@ -2074,10 +2091,6 @@ int rsi_mac80211_attach(struct rsi_common *common)
 
wiphy->available_antennas_rx = 1;
wiphy->available_antennas_tx = 1;
-   wiphy->bands[NL80211_BAND_2GHZ] =
-   >sbands[NL80211_BAND_2GHZ];
-   wiphy->bands[NL80211_BAND_5GHZ] =
-   >sbands[NL80211_BAND_5GHZ];
 
/* AP Parameters */
wiphy->max_ap_assoc_sta = rsi_max_ap_stas[common->oper_mode - 1];
@@ -2106,6 +2119,9 @@ int rsi_mac80211_attach(struct rsi_common *common)
wiphy->iface_combinations = rsi_iface_combinations;

[PATCH 10/10] rsi: drop RX broadcast/multicast packets with invalid PN

2018-03-05 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

This patch adds a check to drop received broadcast/multicast frames if
PN is invalid (i.e. not greater than last PN). bc_mc_pn
variable added for each interface

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 166 ++--
 drivers/net/wireless/rsi/rsi_main.h |   3 +
 2 files changed, 160 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c 
b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 70b2d61..f73c0f0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -522,6 +522,9 @@ static int rsi_mac80211_add_interface(struct ieee80211_hw 
*hw,
mutex_unlock(>mutex);
return -EINVAL;
}
+   memset(vif_info->rx_bcmc_pn, 0, IEEE80211_CCMP_PN_LEN);
+   vif_info->rx_pn_valid = false;
+   vif_info->key = NULL;
 
if ((vif->type == NL80211_IFTYPE_AP) ||
(vif->type == NL80211_IFTYPE_P2P_GO)) {
@@ -1035,6 +1038,8 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
struct rsi_hw *adapter = hw->priv;
struct rsi_common *common = adapter->priv;
struct security_info *secinfo = >secinfo;
+   struct vif_priv *vif_info = (struct vif_priv *)vif->drv_priv;
+   struct ieee80211_key_seq seq;
int status;
 
mutex_lock(>mutex);
@@ -1047,10 +1052,41 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
return status;
}
 
-   if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
+   if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
secinfo->ptk_cipher = key->cipher;
-   else
+   } else {
secinfo->gtk_cipher = key->cipher;
+   ieee80211_get_key_rx_seq(key, 0, );
+   switch (key->cipher) {
+   case WLAN_CIPHER_SUITE_CCMP:
+   case WLAN_CIPHER_SUITE_CCMP_256:
+   memcpy(vif_info->rx_bcmc_pn, seq.ccmp.pn,
+  IEEE80211_CCMP_PN_LEN);
+   vif_info->rx_pn_valid = true;
+   vif_info->key = key;
+   break;
+   case WLAN_CIPHER_SUITE_TKIP:
+   vif_info->rx_bcmc_pn[0] = seq.tkip.iv16 & 0xff;
+   vif_info->rx_bcmc_pn[1] =
+   (seq.tkip.iv16 >> 8) & 0xff;
+   vif_info->rx_bcmc_pn[2] = seq.tkip.iv32 & 0xff;
+   vif_info->rx_bcmc_pn[3] =
+   (seq.tkip.iv32 >> 8) & 0xff;
+   vif_info->rx_bcmc_pn[4] =
+   (seq.tkip.iv32 >> 16) & 0xff;
+   vif_info->rx_bcmc_pn[5] =
+   (seq.tkip.iv32 >> 24) & 0xff;
+   vif_info->rx_pn_valid = true;
+   vif_info->key = key;
+   break;
+   case WLAN_CIPHER_SUITE_AES_CMAC:
+   memcpy(vif_info->rx_bcmc_pn,
+  seq.aes_cmac.pn, IEEE80211_CMAC_PN_LEN);
+   vif_info->rx_pn_valid = true;
+   vif_info->key = key;
+   break;
+   }
+   }
 
key->hw_key_idx = key->keyidx;
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
@@ -1063,6 +1099,9 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
secinfo->security_enable = false;
rsi_dbg(ERR_ZONE, "%s: RSI del key\n", __func__);
memset(key, 0, sizeof(struct ieee80211_key_conf));
+   memset(vif_info->rx_bcmc_pn, 0, IEEE80211_CCMP_PN_LEN);
+   vif_info->rx_pn_valid = false;
+   vif_info->key = NULL;
status = rsi_hal_key_config(hw, vif, key, sta);
break;
 
@@ -1277,6 +1316,103 @@ static void rsi_perform_cqm(struct rsi_common *common,
return;
 }
 
+struct dot11_ccmp_hdr {
+   u8 pn0;
+   u8 pn1;
+   u8 reserved;
+   u8 keyid_info;
+   u8 pn2;
+   u8 pn3;
+   u8 pn4;
+   u8 pn5;
+};
+
+struct dot11_tkip_hdr {
+   u8 tsc1;
+   u8 wep_seed;
+   u8 tsc0;
+   u8 keyid_info;
+   

[PATCH 05/10] rsi: roaming enhancements

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

To support roaming below changes are done:
* Station notify frame is send to firmware after sending assoc
  request. This will avoid dropping of first EAPOL frame due to
  delay in creation of station control block in firmware.
* Data queues are unblocked after sending station notify in open
  mode, after configuring key in WEP mode, and after receiving
  EAPOL4 confirm in WPA mode.
* Initial EAPOL frames priority is chaged to MGMT, rekey EAPOL
  frames priority changed to VO.
* Data frames with wrong BSSID are dropped.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_core.c | 16 +++
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 24 +++---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 29 --
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 32 +
 drivers/net/wireless/rsi/rsi_main.h |  1 +
 drivers/net/wireless/rsi/rsi_mgmt.h | 11 +-
 6 files changed, 85 insertions(+), 28 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index f5d1756..3ca468b9 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -411,6 +411,18 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
if ((ieee80211_is_mgmt(wh->frame_control)) ||
(ieee80211_is_ctl(wh->frame_control)) ||
(ieee80211_is_qos_nullfunc(wh->frame_control))) {
+   if (ieee80211_is_assoc_req(wh->frame_control) ||
+   ieee80211_is_reassoc_req(wh->frame_control)) {
+   struct ieee80211_bss_conf *bss = >bss_conf;
+
+   common->eapol4_confirm = false;
+   rsi_hal_send_sta_notify_frame(common,
+ RSI_IFTYPE_STATION,
+ STA_CONNECTED, bss->bssid,
+ bss->qos, bss->aid, 0,
+ vif);
+   }
+
q_num = MGMT_SOFT_Q;
skb->priority = q_num;
 
@@ -450,6 +462,10 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
  tid, 0);
}
}
+   if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+   q_num = MGMT_SOFT_Q;
+   skb->priority = q_num;
+   }
if (rsi_prepare_data_desc(common, skb)) {
rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
goto xmit_fail;
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 7e04daf..ac40507 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -235,6 +235,18 @@ int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
data_desc->misc_flags |= RSI_FETCH_RETRY_CNT_FRM_HST;
 #define EAPOL_RETRY_CNT 15
xtend_desc->retry_cnt = EAPOL_RETRY_CNT;
+
+   if (common->eapol4_confirm)
+   skb->priority = VO_Q;
+   else
+   rsi_set_len_qno(_desc->len_qno,
+   (skb->len - FRAME_DESC_SZ),
+   RSI_WIFI_MGMT_Q);
+   if ((skb->len - header_size) == EAPOL4_PACKET_LEN) {
+   data_desc->misc_flags |=
+   RSI_DESC_REQUIRE_CFM_TO_HOST;
+   xtend_desc->confirm_frame_type = EAPOL4_CONFIRM;
+   }
}
 
data_desc->mac_flags = cpu_to_le16(seq_num & 0xfff);
@@ -274,8 +286,11 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
struct rsi_hw *adapter = common->priv;
struct ieee80211_vif *vif;
struct ieee80211_tx_info *info;
+   struct skb_info *tx_params;
struct ieee80211_bss_conf *bss;
+   struct ieee80211_hdr *wh;
int status = -EINVAL;
+   u8 header_size;
 
if (!skb)
return 0;
@@ -287,10 +302,13 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
goto err;
vif = info->control.vif;
bss = >bss_conf;
+   tx_params = (struct skb_info *)info->driver_data;
+   header_size = tx_params->internal_hdr_size;
+   wh = (struct ieee80211_hdr *)>data[header_size];
 
-   if (((vif->type == NL80211_IFTYPE_STATION) ||
-(vif->type == NL80211_IFTYPE_P2P_CLIENT)) &&
-   (!bss->assoc))
+   if ((vif->type == NL80211_IFTYPE_STATION ||
+vif->type == NL80211_IFTYPE_P2P_CLIENT) &&
+   

[PATCH 06/10] rsi: add module parameter rsi_reg

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

For few regulatory customizations, we are taking rsi_reg
as module parameter.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_main.c | 4 
 drivers/net/wireless/rsi/rsi_common.h   | 3 +++
 2 files changed, 7 insertions(+)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index bf05242..e290779 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -24,6 +24,10 @@
 #include "rsi_coex.h"
 #include "rsi_hal.h"
 
+static u16 rsi_reg = RSI_REG_DEF;
+module_param(rsi_reg, ushort, 0444);
+MODULE_PARM_DESC(rsi_reg, "0 - RSI_REG_DEF, 1 - RSI_REG_DLCAR");
+
 u32 rsi_zone_enabled = /* INFO_ZONE |
INIT_ZONE |
MGMT_TX_ZONE |
diff --git a/drivers/net/wireless/rsi/rsi_common.h 
b/drivers/net/wireless/rsi/rsi_common.h
index d9ff3b8..df40556 100644
--- a/drivers/net/wireless/rsi/rsi_common.h
+++ b/drivers/net/wireless/rsi/rsi_common.h
@@ -24,6 +24,9 @@
 #define QUEUE_NOT_FULL  1
 #define QUEUE_FULL  0
 
+#define RSI_REG_DEF0
+#define RSI_REG_DLCAR  1
+
 static inline int rsi_init_event(struct rsi_event *pevent)
 {
atomic_set(>event_condition, 1);
-- 
2.7.4



[PATCH 03/10] rsi: move descriptor preparation to core

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

To avoid synchronization issues in sending TX frames,
descriptors preparation is moved to core, instead of HAL.
This will avoid races during foreground scan because of mgmt
configurations.
Also xtended descriptor is moved from rsi_main.h to rsi_mgmt.h
as all descriptor information is in rsi_mgmt.h

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_core.c | 11 +
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 43 +
 drivers/net/wireless/rsi/rsi_hal.h  |  2 ++
 3 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index 5dafd2e..f5d1756 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -413,6 +413,11 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
(ieee80211_is_qos_nullfunc(wh->frame_control))) {
q_num = MGMT_SOFT_Q;
skb->priority = q_num;
+
+   if (rsi_prepare_mgmt_desc(common, skb)) {
+   rsi_dbg(ERR_ZONE, "Failed to prepare desc\n");
+   goto xmit_fail;
+   }
} else {
if (ieee80211_is_data_qos(wh->frame_control)) {
tid = (skb->data[24] & IEEE80211_QOS_TID);
@@ -433,6 +438,8 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
if (!rsta)
goto xmit_fail;
tx_params->sta_id = rsta->sta_id;
+   } else {
+   tx_params->sta_id = 0;
}
 
if (rsta) {
@@ -443,6 +450,10 @@ void rsi_core_xmit(struct rsi_common *common, struct 
sk_buff *skb)
  tid, 0);
}
}
+   if (rsi_prepare_data_desc(common, skb)) {
+   rsi_dbg(ERR_ZONE, "Failed to prepare data desc\n");
+   goto xmit_fail;
+   }
}
 
if ((q_num < MGMT_SOFT_Q) &&
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 718f793..7e04daf 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -45,7 +45,7 @@ int rsi_send_pkt_to_bus(struct rsi_common *common, struct 
sk_buff *skb)
return status;
 }
 
-static int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff 
*skb)
+int rsi_prepare_mgmt_desc(struct rsi_common *common, struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
struct ieee80211_hdr *wh = NULL;
@@ -116,17 +116,6 @@ static int rsi_prepare_mgmt_desc(struct rsi_common 
*common, struct sk_buff *skb)
if (conf_is_ht40(conf))
mgmt_desc->bbp_info = cpu_to_le16(FULL40M_ENABLE);
 
-   if (ieee80211_is_probe_req(wh->frame_control)) {
-   if (!bss->assoc) {
-   rsi_dbg(INFO_ZONE,
-   "%s: blocking mgmt queue\n", __func__);
-   mgmt_desc->misc_flags = RSI_DESC_REQUIRE_CFM_TO_HOST;
-   xtend_desc->confirm_frame_type = PROBEREQ_CONFIRM;
-   common->mgmt_q_block = true;
-   rsi_dbg(INFO_ZONE, "Mgmt queue blocked\n");
-   }
-   }
-
if (ieee80211_is_probe_resp(wh->frame_control)) {
mgmt_desc->misc_flags |= (RSI_ADD_DELTA_TSF_VAP_ID |
  RSI_FETCH_RETRY_CNT_FRM_HST);
@@ -152,7 +141,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
 }
 
 /* This function prepares descriptor for given data packet */
-static int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff 
*skb)
+int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
struct ieee80211_vif *vif;
@@ -304,10 +293,6 @@ int rsi_send_data_pkt(struct rsi_common *common, struct 
sk_buff *skb)
(!bss->assoc))
goto err;
 
-   status = rsi_prepare_data_desc(common, skb);
-   if (status)
-   goto err;
-
status = rsi_send_pkt_to_bus(common, skb);
if (status)
rsi_dbg(ERR_ZONE, "%s: Failed to write pkt\n", __func__);
@@ -330,12 +315,18 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
  struct sk_buff *skb)
 {
struct rsi_hw *adapter = common->priv;
+   struct ieee80211_bss_conf *bss;
+   struct ieee80211_hdr *wh;
struct ieee80211_tx_info *info;
struct skb_info *tx_params;
+   struct rsi_mgmt_desc *mgmt_desc;
+   struct rsi_xtended_desc *xtend_desc;
int status = -E2BIG;
+   u8 header_size;
 

[PATCH 02/10] rsi: move xtend_desc structure from rsi_main.h to rsi_mgmt.h

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

All descriptor structures are in rsi_mgmt.h except this
extended descriptor structure. Hence moving it to rsi_mgmt.h
and also renaming to rsi_xtend_desc.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_hal.c | 12 ++--
 drivers/net/wireless/rsi/rsi_main.h|  6 --
 drivers/net/wireless/rsi/rsi_mgmt.h|  6 ++
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 20c2f6b..718f793 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -55,7 +55,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
struct rsi_mgmt_desc *mgmt_desc;
struct skb_info *tx_params;
struct ieee80211_bss_conf *bss = NULL;
-   struct xtended_desc *xtend_desc = NULL;
+   struct rsi_xtended_desc *xtend_desc = NULL;
u8 header_size;
u32 dword_align_bytes = 0;
 
@@ -69,7 +69,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
vif = tx_params->vif;
 
/* Update header size */
-   header_size = FRAME_DESC_SZ + sizeof(struct xtended_desc);
+   header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
if (header_size > skb_headroom(skb)) {
rsi_dbg(ERR_ZONE,
"%s: Failed to add extended descriptor\n",
@@ -92,7 +92,7 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
wh = (struct ieee80211_hdr *)>data[header_size];
 
mgmt_desc = (struct rsi_mgmt_desc *)skb->data;
-   xtend_desc = (struct xtended_desc *)>data[FRAME_DESC_SZ];
+   xtend_desc = (struct rsi_xtended_desc *)>data[FRAME_DESC_SZ];
 
rsi_set_len_qno(_desc->len_qno, (skb->len - FRAME_DESC_SZ),
RSI_WIFI_MGMT_Q);
@@ -161,7 +161,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
struct skb_info *tx_params;
struct ieee80211_bss_conf *bss;
struct rsi_data_desc *data_desc;
-   struct xtended_desc *xtend_desc;
+   struct rsi_xtended_desc *xtend_desc;
u8 ieee80211_size = MIN_802_11_HDR_LEN;
u8 header_size;
u8 vap_id = 0;
@@ -173,7 +173,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
bss = >bss_conf;
tx_params = (struct skb_info *)info->driver_data;
 
-   header_size = FRAME_DESC_SZ + sizeof(struct xtended_desc);
+   header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
if (header_size > skb_headroom(skb)) {
rsi_dbg(ERR_ZONE, "%s: Unable to send pkt\n", __func__);
return -ENOSPC;
@@ -191,7 +191,7 @@ static int rsi_prepare_data_desc(struct rsi_common *common, 
struct sk_buff *skb)
data_desc = (struct rsi_data_desc *)skb->data;
memset(data_desc, 0, header_size);
 
-   xtend_desc = (struct xtended_desc *)>data[FRAME_DESC_SZ];
+   xtend_desc = (struct rsi_xtended_desc *)>data[FRAME_DESC_SZ];
wh = (struct ieee80211_hdr *)>data[header_size];
seq_num = IEEE80211_SEQ_TO_SN(le16_to_cpu(wh->seq_ctrl));
 
diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index 3dd08f5..abc4f29 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -212,12 +212,6 @@ struct cqm_info {
u32 rssi_hyst;
 };
 
-struct xtended_desc {
-   u8 confirm_frame_type;
-   u8 retry_cnt;
-   u16 reserved;
-};
-
 enum rsi_dfs_regions {
RSI_REGION_FCC = 0,
RSI_REGION_ETSI,
diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h 
b/drivers/net/wireless/rsi/rsi_mgmt.h
index b7f63c9..2513fb8 100644
--- a/drivers/net/wireless/rsi/rsi_mgmt.h
+++ b/drivers/net/wireless/rsi/rsi_mgmt.h
@@ -307,6 +307,12 @@ struct rsi_mac_frame {
 #define ENCAP_MGMT_PKT BIT(7)
 #define DESC_IMMEDIATE_WAKEUP  BIT(15)
 
+struct rsi_xtended_desc {
+   u8 confirm_frame_type;
+   u8 retry_cnt;
+   u16 reserved;
+};
+
 struct rsi_cmd_desc_dword0 {
__le16 len_qno;
u8 frame_type;
-- 
2.7.4



[PATCH 07/10] rsi: regulatory modifications for 'dlcar' mode

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

Changes in this patch are for applying custom regulatory
rules for 'dlcar' regulatory mode. Max channel power values
are updated for 12, 13, and 14. Dlcar only has 2.4GHz band.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c |  30 +-
 drivers/net/wireless/rsi/rsi_91x_main.c |   2 +
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 140 
 drivers/net/wireless/rsi/rsi_main.h |   3 +-
 drivers/net/wireless/rsi/rsi_mgmt.h |   4 +
 5 files changed, 173 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c 
b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index ef7cabf..a7e1f7d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -1666,7 +1666,8 @@ static int rsi_mac80211_get_antenna(struct ieee80211_hw 
*hw,
return 0;   
 }
 
-static int rsi_map_region_code(enum nl80211_dfs_regions region_code)
+static enum rsi_dfs_regions rsi_map_region_code
+   (enum nl80211_dfs_regions region_code)
 {
switch (region_code) {
case NL80211_DFS_FCC:
@@ -1681,6 +1682,22 @@ static int rsi_map_region_code(enum nl80211_dfs_regions 
region_code)
return RSI_REGION_WORLD;
 }
 
+static char *dfsreg_str(enum rsi_dfs_regions reg)
+{
+   switch (reg) {
+   case RSI_REGION_FCC:
+   return "FCC";
+   case RSI_REGION_ETSI:
+   return "ETSI";
+   case RSI_REGION_TELEC:
+   return "TELEC";
+   case RSI_REGION_WORLD:
+   return "WORLD";
+   default:
+   return "INVALID";
+   }
+}
+
 static void rsi_reg_notify(struct wiphy *wiphy,
   struct regulatory_request *request)
 {
@@ -1693,7 +1710,8 @@ static void rsi_reg_notify(struct wiphy *wiphy,

mutex_lock(>mutex);
 
-   rsi_dbg(INFO_ZONE, "country = %s dfs_region = %d\n",
+   rsi_dbg(INFO_ZONE,
+   "Regulatory notifcation: country: %s region:%d\n",
request->alpha2, request->dfs_region);
 
if (common->num_supp_bands > 1) {
@@ -1708,11 +1726,13 @@ static void rsi_reg_notify(struct wiphy *wiphy,
ch->flags |= IEEE80211_CHAN_NO_IR;
}
}
-   adapter->dfs_region = rsi_map_region_code(request->dfs_region);
-   rsi_dbg(INFO_ZONE, "RSI region code = %d\n", adapter->dfs_region);
-   
adapter->country[0] = request->alpha2[0];
adapter->country[1] = request->alpha2[1];
+   adapter->dfs_region = rsi_map_region_code(request->dfs_region);
+   if (adapter->reg_mode == RSI_REG_DLCAR)
+   rsi_apply_dlcar_reg_rules(adapter);
+
+   rsi_dbg(INFO_ZONE, "DFS region: %s", dfsreg_str(adapter->dfs_region));
 
mutex_unlock(>mutex);
 }
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index e290779..7790314 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -352,6 +352,8 @@ struct rsi_hw *rsi_91x_init(u16 oper_mode)
common->init_done = true;
adapter->device_model = RSI_DEV_9113;
common->oper_mode = oper_mode;
+   adapter->reg_mode = rsi_reg;
+   rsi_dbg(INFO_ZONE, "Reg mode = %d\n", adapter->reg_mode);
 
/* Determine coex mode */
switch (common->oper_mode) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c 
b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 0444025..4ba5966 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -211,6 +211,28 @@ static struct bootup_params boot_params_40 = {
 
 static u16 mcs[] = {13, 26, 39, 52, 78, 104, 117, 130};
 
+struct reg_map {
+   char country_code[2];
+   u8 region_code;
+};
+
+#define MAX_REG_COUNTRIES  30
+static struct reg_map rsi_dlcar_reg_map[MAX_REG_COUNTRIES] = {
+   {"AU", RSI_REGION_ETSI}, {"AT", RSI_REGION_ETSI},
+   {"BE", RSI_REGION_ETSI}, {"BR", RSI_REGION_WORLD},
+   {"CA", RSI_REGION_FCC}, {"CL", RSI_REGION_WORLD},
+   {"CN", RSI_REGION_WORLD}, {"CO", RSI_REGION_FCC},
+   {"CZ", RSI_REGION_ETSI}, {"DK", RSI_REGION_ETSI},
+   {"FI", RSI_REGION_ETSI}, {"FR", RSI_REGION_ETSI},
+   {"DE", RSI_REGION_ETSI}, {"HK", RSI_REGION_WORLD},
+   {"IN", RSI_REGION_WORLD}, {"ID", RSI_REGION_WORLD},
+   {"IE", RSI_REGION_ETSI}, {"IL", RSI_REGION_ETSI},
+   {"IT", RSI_REGION_ETSI}, {"JP", RSI_REGION_TELEC},
+   {"KR", RSI_REGION_WORLD}, {"LU", RSI_REGION_ETSI},
+   {"MY", RSI_REGION_WORLD}, {"MX", RSI_REGION_FCC},
+   {"MA", RSI_REGION_WORLD}, {"NL", RSI_REGION_ETSI},
+};
+
 /**
  * rsi_set_default_parameters() - This function sets default parameters.
  * @common: Pointer to the driver private structure.
@@ -986,6 +1008,120 @@ int 

[PATCH 08/10] rsi: device disconnect changes

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

Below changes are done:
1. When HCI detach is called, making bt_adapter null and checking
for this variable where ever required.
2. In USB case, one extra register write is added to disable
firmware watchdog.
3. When interface down is called as part of disconnect, don't
send RX filter frame.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_mac80211.c |  8 ++--
 drivers/net/wireless/rsi/rsi_91x_main.c |  2 ++
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 10 ++
 drivers/net/wireless/rsi/rsi_hal.h  |  1 +
 drivers/net/wireless/rsi/rsi_main.h |  1 +
 5 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c 
b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index a7e1f7d..63d43fc 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -428,14 +428,18 @@ static void rsi_mac80211_stop(struct ieee80211_hw *hw)
 {
struct rsi_hw *adapter = hw->priv;
struct rsi_common *common = adapter->priv;
+   u16 rx_filter_word = 0x;
 
rsi_dbg(ERR_ZONE, "===> Interface DOWN <===\n");
mutex_lock(>mutex);
common->iface_down = true;
wiphy_rfkill_stop_polling(hw->wiphy);
 
-   /* Block all rx frames */
-   rsi_send_rx_filter_frame(common, 0x);
+   if (!common->disc_in_prog) {
+   /* Block all rx frames */
+   rx_filter_word |= ~DISALLOW_BEACONS;
+   rsi_send_rx_filter_frame(common, rx_filter_word);
+   }
 
mutex_unlock(>mutex);
 }
diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 7790314..96b36aa 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -350,6 +350,8 @@ struct rsi_hw *rsi_91x_init(u16 oper_mode)
timer_setup(>roc_timer, rsi_roc_timeout, 0);
init_completion(>wlan_init_completion);
common->init_done = true;
+   common->disc_in_prog = false;
+   common->bt_adapter = NULL;
adapter->device_model = RSI_DEV_9113;
common->oper_mode = oper_mode;
adapter->reg_mode = rsi_reg;
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index be8236f..f92909c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -676,11 +676,13 @@ static int usb_ulp_read_write(struct rsi_hw *adapter, u16 
addr, u32 data,
return 0;
 }
 
+#define FW_WDT_DISABLE_REQ  0x69
 static int rsi_reset_card(struct rsi_hw *adapter)
 {
int ret;
 
rsi_dbg(INFO_ZONE, "Resetting Card...\n");
+
rsi_usb_master_reg_write(adapter, RSI_TA_HOLD_REG, 0xE, 4);
 
/* This msleep will ensure Thread-Arch processor to go to hold
@@ -688,6 +690,13 @@ static int rsi_reset_card(struct rsi_hw *adapter)
 */
msleep(100);
 
+   if (rsi_usb_master_reg_write(adapter, SWBL_REGOUT,
+FW_WDT_DISABLE_REQ,
+RSI_COMMON_REG_SIZE) < 0) {
+   rsi_dbg(ERR_ZONE, "%s: FW WDT Disable failed...\n", __func__);
+   goto fail;
+   }
+
ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_1,
 RSI_ULP_WRITE_2, 32);
if (ret < 0)
@@ -804,6 +813,7 @@ static void rsi_disconnect(struct usb_interface *pfunction)
 
if (!adapter)
return;
+   adapter->priv->disc_in_prog = true;
 
rsi_mac80211_detach(adapter);
rsi_reset_card(adapter);
diff --git a/drivers/net/wireless/rsi/rsi_hal.h 
b/drivers/net/wireless/rsi/rsi_hal.h
index d6c2baa..327638c 100644
--- a/drivers/net/wireless/rsi/rsi_hal.h
+++ b/drivers/net/wireless/rsi/rsi_hal.h
@@ -115,6 +115,7 @@
 #define FW_FLASH_OFFSET0x820
 #define LMAC_VER_OFFSET(FW_FLASH_OFFSET + 0x200)
 #define MAX_DWORD_ALIGN_BYTES  64
+#define RSI_COMMON_REG_SIZE2
 
 struct bl_header {
__le32 flags;
diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index 4521c43..9e09dd5 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -325,6 +325,7 @@ struct rsi_common {
bool bgscan_en;
bool cancel_hwscan;
bool eapol4_confirm;
+   bool disc_in_prog;
 };
 
 struct eepromrw_info {
-- 
2.7.4



[PATCH 01/10] rsi: add support for hardware scan offload

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

With the current approach of scanning, roaming delays
are observed. Firmware has support for back ground scanning.
To get this advantage, mac80211 hardware scan is implemented.
In this method, foreground scan is performed in driver and
back ground scan is configured to firmware.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_hal.c  |   3 +
 drivers/net/wireless/rsi/rsi_91x_mac80211.c |  84 +
 drivers/net/wireless/rsi/rsi_91x_main.c |  12 ++
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 273 +++-
 drivers/net/wireless/rsi/rsi_main.h |  36 
 drivers/net/wireless/rsi/rsi_mgmt.h |  44 +
 6 files changed, 451 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index de608ae..20c2f6b 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -99,6 +99,9 @@ static int rsi_prepare_mgmt_desc(struct rsi_common *common, 
struct sk_buff *skb)
mgmt_desc->frame_type = TX_DOT11_MGMT;
mgmt_desc->header_len = MIN_802_11_HDR_LEN;
mgmt_desc->xtend_desc_size = header_size - FRAME_DESC_SZ;
+
+   if (ieee80211_is_probe_req(wh->frame_control) && common->fgscan_in_prog)
+   mgmt_desc->frame_info = cpu_to_le16(RSI_INSERT_SEQ_IN_FW);
mgmt_desc->frame_info |= cpu_to_le16(RATE_INFO_ENABLE);
if (is_broadcast_ether_addr(wh->addr1))
mgmt_desc->frame_info |= cpu_to_le16(RSI_BROADCAST_PKT);
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c 
b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 32f5cb4..4957690 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -229,6 +229,79 @@ static void rsi_register_rates_channels(struct rsi_hw 
*adapter, int band)
/* sbands->ht_cap.mcs.rx_highest = 0x82; */
 }
 
+static int rsi_mac80211_hw_scan_start(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_scan_request *hw_req)
+{
+   struct cfg80211_scan_request *scan_req = _req->req;
+   struct rsi_hw *adapter = hw->priv;
+   struct rsi_common *common = adapter->priv;
+   struct ieee80211_bss_conf *bss = >bss_conf;
+
+   rsi_dbg(INFO_ZONE, "* Hardware scan start *\n");
+
+   if (common->fsm_state != FSM_MAC_INIT_DONE)
+   return -ENODEV;
+
+   if ((common->wow_flags & RSI_WOW_ENABLED) ||
+   scan_req->n_channels == 0)
+   return -EINVAL;
+
+   /* Scan already in progress. So return */
+   if (common->bgscan_en || common->fgscan_in_prog)
+   return -EBUSY;
+
+   mutex_lock(>mutex);
+
+   common->hwscan = scan_req;
+   common->scan_vif = vif;
+   if (!bss->assoc) {
+   common->cancel_hwscan = false;
+   queue_work(common->scan_workqueue, >scan_work);
+   } else {
+   if (!rsi_send_bgscan_params(common, RSI_START_BGSCAN)) {
+   if (!rsi_send_bgscan_probe_req(common)) {
+   rsi_dbg(INFO_ZONE,
+   "Background scan started...\n");
+   common->bgscan_en = true;
+   }
+   }
+   }
+
+   mutex_unlock(>mutex);
+
+   return 0;
+}
+
+static void rsi_mac80211_cancel_hw_scan(struct ieee80211_hw *hw,
+   struct ieee80211_vif *vif)
+{
+   struct rsi_hw *adapter = hw->priv;
+   struct rsi_common *common = adapter->priv;
+   struct cfg80211_scan_info info;
+
+   rsi_dbg(INFO_ZONE, "* Hardware scan stop *\n");
+
+   mutex_lock(>mutex);
+
+   if (common->fgscan_in_prog) {
+   common->cancel_hwscan = true;
+   rsi_wait_event(>cancel_hw_scan_event,
+  EVENT_WAIT_FOREVER);
+   rsi_reset_event(>cancel_hw_scan_event);
+   }
+   if (common->bgscan_en) {
+   if (!rsi_send_bgscan_params(common, RSI_STOP_BGSCAN))
+   common->bgscan_en = 0;
+   info.aborted = false;
+   ieee80211_scan_completed(adapter->hw, );
+   rsi_dbg(INFO_ZONE, "Back ground scan cancelled\b");
+   }
+   common->hwscan = NULL;
+   common->scan_vif = NULL;
+   mutex_unlock(>mutex);
+}
+
 /**
  * rsi_mac80211_detach() - This function is used to de-initialize the
  *Mac80211 stack.
@@ -239,12 +312,18 @@ static void rsi_register_rates_channels(struct rsi_hw 
*adapter, int band)
 void rsi_mac80211_detach(struct rsi_hw *adapter)
 {
struct ieee80211_hw *hw = adapter->hw;
+   struct rsi_common *common = adapter->priv;
enum nl80211_band band;
 

[PATCH 04/10] rsi: enable 80MHz clock by default

2018-03-05 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

80MHz clock for device should be enabled by default in
TX command frame radio capabilities.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c 
b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 0bcf841..6f995d5a 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -338,8 +338,8 @@ static int rsi_load_radio_caps(struct rsi_common *common)
radio_caps->channel_num = common->channel;
radio_caps->rf_model = RSI_RF_TYPE;
 
+   radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
if (common->channel_width == BW_40MHZ) {
-   radio_caps->radio_cfg_info = RSI_LMAC_CLOCK_80MHZ;
radio_caps->radio_cfg_info |= RSI_ENABLE_40MHZ;
 
if (common->fsm_state == FSM_MAC_INIT_DONE) {
-- 
2.7.4



[PATCH 00/10] rsi driver enhancements

2018-03-05 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series brings in improvements in scan, Tx path, roaming and
regulatory handling.

Prameela Rani Garnepudi (9):
  rsi: add support for hardware scan offload
  rsi: move xtend_desc structure from rsi_main.h to rsi_mgmt.h
  rsi: move descriptor preparation to core
  rsi: enable 80MHz clock by default
  rsi: roaming enhancements
  rsi: add module parameter rsi_reg
  rsi: regulatory modifications for 'dlcar' mode
  rsi: device disconnect changes
  rsi: tx improvements

Siva Rebbagondla (1):
  rsi: drop RX broadcast/multicast packets with invalid PN

 drivers/net/wireless/rsi/rsi_91x_core.c |  31 +-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  82 +++--
 drivers/net/wireless/rsi/rsi_91x_mac80211.c | 353 +++---
 drivers/net/wireless/rsi/rsi_91x_main.c |  20 ++
 drivers/net/wireless/rsi/rsi_91x_mgmt.c | 447 +++-
 drivers/net/wireless/rsi/rsi_91x_usb.c  |  10 +
 drivers/net/wireless/rsi/rsi_boot_params.h  |   3 +-
 drivers/net/wireless/rsi/rsi_common.h   |   3 +
 drivers/net/wireless/rsi/rsi_hal.h  |   3 +
 drivers/net/wireless/rsi/rsi_main.h |  50 +++-
 drivers/net/wireless/rsi/rsi_mgmt.h |  67 -
 11 files changed, 977 insertions(+), 92 deletions(-)

-- 
2.7.4



Re: [v7 3/8] rsi: add header file rsi_91x

2018-03-05 Thread Amitkumar Karwar
Hi Dave and Johannes,

On Tue, Feb 20, 2018 at 6:44 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Hi Dave and Johannes,
>
> a question to both of you below:
>
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> The common parameters used by wlan and bt modules are add
>> to a new header file "rsi_91x.h" defined in 'include/net'
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>> ---
>> v7: Same as v6
>> v6: Renamed rsi_header.h to rsi_91x.h and moved to include/net
>> from include/linux(Kalle)
>> v5: Same as earlier versions
>
> [...]
>
>> --- /dev/null
>> +++ b/include/net/rsi_91x.h
>> @@ -0,0 +1,34 @@
>> +/**
>> + * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
>> +#define __RSI_HEADER_H__
>> +
>> +/* HAL queue information */
>> +#define RSI_COEX_Q   0x0
>> +#define RSI_BT_Q 0x2
>> +#define RSI_WLAN_Q  0x3
>> +#define RSI_WIFI_MGMT_Q 0x4
>> +#define RSI_WIFI_DATA_Q 0x5
>> +#define RSI_BT_MGMT_Q0x6
>> +#define RSI_BT_DATA_Q        0x7
>> +
>> +enum rsi_host_intf {
>> + RSI_HOST_INTF_SDIO = 0,
>> + RSI_HOST_INTF_USB
>> +};
>> +
>> +#endif
>
> Are you guys ok to have this header file shared by rsi wireless and
> bluetooth driver in include/net?
>

Gentle reminder.

Please share your feedback. So that I can correct this if required.

Regards,
Amitkumar Karwar


[PATCH 2/3] rsi: use dynamic RX control blocks instead of MAX_RX_URB

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Currently 2 RX control blocks are allocated by default.
If wifi alone mode is used rx control block 2 is unusable.
So, changes are done accordingly in all places to use
RX control blocks dynamically based on coex mode check.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 34 ++
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c |  5 +++--
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 0a50cff..64781a3 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -497,15 +497,15 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
  */
 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
 {
-   u8 idx;
-
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
 
rsi_kill_thread(>rx_thread);
 
-   for (idx = 0; idx < MAX_RX_URBS; idx++) {
-   usb_free_urb(dev->rx_cb[idx].rx_urb);
-   kfree(dev->rx_cb[idx].rx_buffer);
+   usb_free_urb(dev->rx_cb[0].rx_urb);
+   kfree(dev->rx_cb[0].rx_buffer);
+   if (adapter->priv->coex_mode > 1) {
+   usb_free_urb(dev->rx_cb[1].rx_urb);
+   kfree(dev->rx_cb[1].rx_buffer);
}
 
kfree(adapter->priv->rx_data_pkt);
@@ -516,9 +516,11 @@ static int rsi_usb_init_rx(struct rsi_hw *adapter)
 {
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
struct rx_usb_ctrl_block *rx_cb;
-   u8 idx;
+   u8 idx, num_rx_cb;
+
+   num_rx_cb = (adapter->priv->coex_mode > 1 ? 2 : 1);
 
-   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   for (idx = 0; idx < num_rx_cb; idx++) {
rx_cb = >rx_cb[idx];
 
rx_cb->rx_buffer = kzalloc(RSI_USB_BUF_SIZE * 2,
@@ -538,9 +540,11 @@ static int rsi_usb_init_rx(struct rsi_hw *adapter)
return 0;
 
 err:
-   for (idx = 0; idx < MAX_RX_URBS; idx++) {
-   kfree(dev->rx_cb[idx].rx_buffer);
-   kfree(dev->rx_cb[idx].rx_urb);
+   kfree(dev->rx_cb[0].rx_buffer);
+   usb_free_urb(dev->rx_cb[0].rx_urb);
+   if (adapter->priv->coex_mode > 1) {
+   kfree(dev->rx_cb[1].rx_buffer);
+   usb_free_urb(dev->rx_cb[1].rx_urb);
}
return -1;
 }
@@ -557,7 +561,7 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
 {
struct rsi_91x_usbdev *rsi_dev;
struct rsi_common *common = adapter->priv;
-   int status, i;
+   int status;
 
rsi_dev = kzalloc(sizeof(*rsi_dev), GFP_KERNEL);
if (!rsi_dev)
@@ -617,9 +621,11 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
return 0;
 
 fail_thread:
-   for (i = 0; i < MAX_RX_URBS; i++) {
-   kfree(rsi_dev->rx_cb[i].rx_buffer);
-   kfree(rsi_dev->rx_cb[i].rx_urb);
+   kfree(rsi_dev->rx_cb[0].rx_buffer);
+   usb_free_urb(rsi_dev->rx_cb[0].rx_urb);
+   if (common->coex_mode > 1) {
+   kfree(rsi_dev->rx_cb[1].rx_buffer);
+   usb_free_urb(rsi_dev->rx_cb[1].rx_urb);
}
 fail_tx:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
index d0650ea..fc25b1b 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb_ops.c
@@ -30,15 +30,16 @@ void rsi_usb_rx_thread(struct rsi_common *common)
struct rsi_hw *adapter = common->priv;
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
struct rx_usb_ctrl_block *rx_cb;
-   int status, idx;
+   int status, idx, num_rx_cb;
 
+   num_rx_cb = (adapter->priv->coex_mode > 1 ? 2 : 1);
do {
rsi_wait_event(>rx_thread.event, EVENT_WAIT_FOREVER);
 
if (atomic_read(>rx_thread.thread_done))
goto out;
 
-   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   for (idx = 0; idx < num_rx_cb; idx++) {
rx_cb = >rx_cb[idx];
if (!rx_cb->pend)
continue;
-- 
2.7.4



[PATCH 1/3] rsi: improve RX handling in SDIO interface

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Currently, RX packets are handled in interrupt context in SDIO
interface. To improve the efficiency of processing RX packets,
RX thread and RX skb queues are introduced.
When the packet is read from device, driver prepares skb, add to
RX queue and trigger RX thread event. RX thread processes the
packets from RX queue.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 45 +++-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 64 +++--
 drivers/net/wireless/rsi/rsi_main.h |  1 +
 drivers/net/wireless/rsi/rsi_sdio.h |  8 
 4 files changed, 94 insertions(+), 24 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index beb18d0..98c7d1d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -933,6 +933,8 @@ static int rsi_probe(struct sdio_func *pfunction,
 const struct sdio_device_id *id)
 {
struct rsi_hw *adapter;
+   struct rsi_91x_sdiodev *sdev;
+   int status;
 
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
 
@@ -940,7 +942,7 @@ static int rsi_probe(struct sdio_func *pfunction,
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
-   return 1;
+   return -EINVAL;
}
adapter->rsi_host_intf = RSI_HOST_INTF_SDIO;
adapter->host_intf_ops = _host_intf_ops;
@@ -948,39 +950,58 @@ static int rsi_probe(struct sdio_func *pfunction,
if (rsi_init_sdio_interface(adapter, pfunction)) {
rsi_dbg(ERR_ZONE, "%s: Failed to init sdio interface\n",
__func__);
-   goto fail;
+   status = -EIO;
+   goto fail_free_adapter;
+   }
+   sdev = (struct rsi_91x_sdiodev *)adapter->rsi_dev;
+   rsi_init_event(>rx_thread.event);
+   status = rsi_create_kthread(adapter->priv, >rx_thread,
+   rsi_sdio_rx_thread, "SDIO-RX-Thread");
+   if (status) {
+   rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__);
+   goto fail_free_adapter;
}
+   skb_queue_head_init(>rx_q.head);
+   sdev->rx_q.num_rx_pkts = 0;
+
sdio_claim_host(pfunction);
if (sdio_claim_irq(pfunction, rsi_handle_interrupt)) {
rsi_dbg(ERR_ZONE, "%s: Failed to request IRQ\n", __func__);
sdio_release_host(pfunction);
-   goto fail;
+   status = -EIO;
+   goto fail_kill_thread;
}
sdio_release_host(pfunction);
rsi_dbg(INIT_ZONE, "%s: Registered Interrupt handler\n", __func__);
 
if (rsi_hal_device_init(adapter)) {
rsi_dbg(ERR_ZONE, "%s: Failed in device init\n", __func__);
-   sdio_claim_host(pfunction);
-   sdio_release_irq(pfunction);
-   sdio_disable_func(pfunction);
-   sdio_release_host(pfunction);
-   goto fail;
+   status = -EINVAL;
+   goto fail_kill_thread;
}
rsi_dbg(INFO_ZONE, "===> RSI Device Init Done <===\n");
 
if (rsi_sdio_master_access_msword(adapter, MISC_CFG_BASE_ADDR)) {
rsi_dbg(ERR_ZONE, "%s: Unable to set ms word reg\n", __func__);
-   return -EIO;
+   status = -EIO;
+   goto fail_dev_init;
}
 
adapter->priv->hibernate_resume = false;
adapter->priv->reinit_hw = false;
return 0;
-fail:
+
+fail_dev_init:
+   sdio_claim_host(pfunction);
+   sdio_release_irq(pfunction);
+   sdio_disable_func(pfunction);
+   sdio_release_host(pfunction);
+fail_kill_thread:
+   rsi_kill_thread(>rx_thread);
+fail_free_adapter:
rsi_91x_deinit(adapter);
rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
-   return 1;
+   return status;
 }
 
 static void ulp_read_write(struct rsi_hw *adapter, u16 addr, u32 data,
@@ -1076,6 +1097,8 @@ static void rsi_disconnect(struct sdio_func *pfunction)
return;
 
dev = (struct rsi_91x_sdiodev *)adapter->rsi_dev;
+
+   rsi_kill_thread(>rx_thread);
sdio_claim_host(pfunction);
sdio_release_irq(pfunction);
sdio_release_host(pfunction);
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 6e74261..612c211 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_s

[PATCH 3/3] rsi: improve RX packet handling in USB interface

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi 

Curretly, RX packet processing is done sequencially. To improve
the efficiency, RX skb queue is introduced.
Here, while preparing RX URB skb is allocated and used
for RX buffer. When rx done handler is called, enqueue the skb
to rx_q and set the thread event.
RX thread is modified to dequeue packets from skb queue and
process further.

Signed-off-by: Prameela Rani Garnepudi 
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 110 -
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c |  35 -
 drivers/net/wireless/rsi/rsi_hal.h |   1 +
 drivers/net/wireless/rsi/rsi_main.h|   1 -
 drivers/net/wireless/rsi/rsi_usb.h |   5 +-
 5 files changed, 78 insertions(+), 74 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 64781a3..be8236f 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -29,6 +29,8 @@ MODULE_PARM_DESC(dev_oper_mode,
 "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
 "6[AP + BT classic], 14[AP + BT classic + BT LE]");
 
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num);
+
 /**
  * rsi_usb_card_write() - This function writes to the USB Card.
  * @adapter: Pointer to the adapter structure.
@@ -260,12 +262,31 @@ static void rsi_rx_done_handler(struct urb *urb)
 {
struct rx_usb_ctrl_block *rx_cb = urb->context;
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
+   int status = -EINVAL;
 
if (urb->status)
-   return;
+   goto out;
+
+   if (urb->actual_length <= 0) {
+   rsi_dbg(INFO_ZONE, "%s: Zero length packet\n", __func__);
+   goto out;
+   }
+   if (skb_queue_len(>rx_q) >= RSI_MAX_RX_PKTS) {
+   rsi_dbg(INFO_ZONE, "Max RX packets reached\n");
+   goto out;
+   }
+   skb_put(rx_cb->rx_skb, urb->actual_length);
+   skb_queue_tail(>rx_q, rx_cb->rx_skb);
 
-   rx_cb->pend = 1;
rsi_set_event(>rx_thread.event);
+   status = 0;
+
+out:
+   if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num))
+   rsi_dbg(ERR_ZONE, "%s: Failed in urb submission", __func__);
+
+   if (status)
+   dev_kfree_skb(rx_cb->rx_skb);
 }
 
 /**
@@ -280,13 +301,26 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 
ep_num)
struct rx_usb_ctrl_block *rx_cb = >rx_cb[ep_num - 1];
struct urb *urb = rx_cb->rx_urb;
int status;
+   struct sk_buff *skb;
+   u8 dword_align_bytes = 0;
+
+#define RSI_MAX_RX_USB_PKT_SIZE3000
+   skb = dev_alloc_skb(RSI_MAX_RX_USB_PKT_SIZE);
+   if (!skb)
+   return -ENOMEM;
+   skb_reserve(skb, MAX_DWORD_ALIGN_BYTES);
+   dword_align_bytes = (unsigned long)skb->data & 0x3f;
+   if (dword_align_bytes > 0)
+   skb_push(skb, dword_align_bytes);
+   urb->transfer_buffer = skb->data;
+   rx_cb->rx_skb = skb;
 
usb_fill_bulk_urb(urb,
  dev->usbdev,
  usb_rcvbulkpipe(dev->usbdev,
  dev->bulkin_endpoint_addr[ep_num - 1]),
  urb->transfer_buffer,
- 3000,
+ RSI_MAX_RX_USB_PKT_SIZE,
  rsi_rx_done_handler,
  rx_cb);
 
@@ -502,13 +536,9 @@ static void rsi_deinit_usb_interface(struct rsi_hw 
*adapter)
rsi_kill_thread(>rx_thread);
 
usb_free_urb(dev->rx_cb[0].rx_urb);
-   kfree(dev->rx_cb[0].rx_buffer);
-   if (adapter->priv->coex_mode > 1) {
+   if (adapter->priv->coex_mode > 1)
usb_free_urb(dev->rx_cb[1].rx_urb);
-   kfree(dev->rx_cb[1].rx_buffer);
-   }
 
-   kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
 }
 
@@ -523,29 +553,29 @@ static int rsi_usb_init_rx(struct rsi_hw *adapter)
for (idx = 0; idx < num_rx_cb; idx++) {
rx_cb = >rx_cb[idx];
 
-   rx_cb->rx_buffer = kzalloc(RSI_USB_BUF_SIZE * 2,
-  GFP_KERNEL);
-   if (!rx_cb->rx_buffer)
-   goto err;
-
rx_cb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
if (!rx_cb->rx_urb) {
rsi_dbg(ERR_ZONE, "Failed alloc rx urb[%d]\n", idx);
goto err;
}
-   rx_cb->rx_urb->transfer_buffer = rx_cb->rx_buffer;
rx_cb->ep_num = idx + 1;
rx_cb->data = (void *)dev;
}
+   skb_queue_head_init(>rx_q);
+   rsi_init_event(>rx_thread.event);
+   if (rsi_create_kthread(adapter->priv, >rx_thread,
+  rsi_usb_rx_thread, "RX-Thread")) {
+   

[PATCH 0/3] rsi: RX path improvements

2018-02-27 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds a thread for Rx handling and other related
enhancements for better throughput.

Prameela Rani Garnepudi (3):
  rsi: improve RX handling in SDIO interface
  rsi: use dynamic RX control blocks instead of MAX_RX_URB
  rsi: improve RX packet handling in USB interface

 drivers/net/wireless/rsi/rsi_91x_sdio.c |  45 +++---
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  64 ---
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 122 
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  34 +++-
 drivers/net/wireless/rsi/rsi_hal.h  |   1 +
 drivers/net/wireless/rsi/rsi_main.h |   2 +-
 drivers/net/wireless/rsi/rsi_sdio.h |   8 ++
 drivers/net/wireless/rsi/rsi_usb.h  |   5 +-
 8 files changed, 181 insertions(+), 100 deletions(-)

-- 
2.7.4



[v9 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Redpine bluetooth driver is a thin driver which depends on
'rsi_91x' driver for transmitting and receiving packets
to/from device. It creates hci interface when attach() is
called from 'rsi_91x' module.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Acked-by: Marcel Holtmann <mar...@holtmann.org>
Reviewed-by: Marcel Holtmann <mar...@holtmann.org>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Resolve 'kbuild test robot' reported error. Used asm/unaligned.h
header file instead of linux/unaligned/le_byteshift.h 
v7: Same as v6
v6: Renamed CONFIG_BT_RSI to CONFIG_BT_HCIRSI (Marcel)
v5: Addressed review comments from Marcel.
Removed reduntant switch case code from rsi_hci_recv_pkt()
Changed bt_cb(skb)->pkt_type to hci_skb_pkt_type(skb)
Removed reduntant '\n' from BT_ERR and redundant BT_INFO messages
Changed u8 *pkt to const u8 *pkt in rsi_hci_recv_pkt()
v4: Removed rsi_hci.h file. Made the functions static(Marcel)
v3: Made BT_RSI module by default off(Marcel)
Removed redundant exported function rsi_get_hci_ops()(Marcel)
v2: Addressed review comments from Marcel
Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
Removed redundant BT_INFO messages
h_adapter initialization and declaration in a single line.
Removed unnecessary error checks for HCI_RUNNING and fsm_state
Allocated new skb with skb_realloc_headroom() API if headroom is not 
sufficient
Used get_unaligned_le16 helpers
Moved a structure and union from header file to btrsi.c file
---
 drivers/bluetooth/Kconfig  |  12 +++
 drivers/bluetooth/Makefile |   2 +
 drivers/bluetooth/btrsi.c  | 188 +
 include/net/rsi_91x.h  |   4 +-
 4 files changed, 205 insertions(+), 1 deletion(-)
 create mode 100644 drivers/bluetooth/btrsi.c

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 07e55cd..d8bbd66 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -392,4 +392,16 @@ config BT_QCOMSMD
  Say Y here to compile support for HCI over Qualcomm SMD into the
  kernel or say M to compile as a module.
 
+config BT_HCIRSI
+   tristate "Redpine HCI support"
+   default n
+   select RSI_COEX
+   help
+ Redpine BT driver.
+ This driver handles BT traffic from upper layers and pass
+ to the RSI_91x coex module for further scheduling to device
+
+ Say Y here to compile support for HCI over Redpine into the
+ kernel or say M to compile as a module.
+
 endmenu
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index 4e4e44d..03cfc1b 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)  += btqca.o
 
 obj-$(CONFIG_BT_HCIUART_NOKIA) += hci_nokia.o
 
+obj-$(CONFIG_BT_HCIRSI)+= btrsi.o
+
 btmrvl-y   := btmrvl_main.o
 btmrvl-$(CONFIG_DEBUG_FS)  += btmrvl_debugfs.o
 
diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
new file mode 100644
index 000..5034325
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RSI_HEADROOM_FOR_BT_HAL16
+#define RSI_FRAME_DESC_SIZE16
+
+struct rsi_hci_adapter {
+   void *priv;
+   struct rsi_proto_ops *proto_ops;
+   struct hci_dev *hdev;
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+   struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
+   struct sk_buff *new_skb = NULL;
+
+   switch (hci_skb_pkt_type(skb)) {
+   case HCI_COMMAND_PKT:
+   hdev-

[v9 8/8] rsi: sdio changes to support BT

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 169c981..6e74261 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



[v9 4/8] rsi: add coex support

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

With BT support, driver has to handle two streams of data
(i.e. wlan and BT). Actual coex implementation is in firmware.
Coex module just schedule the packets to firmware by taking them
from the corresponding paths.

Structures for module and protocol operations are introduced for
this purpose. Protocol operations structure is global structure
which can be shared among different modules. Move initialization
of coex and operating mode values to rsi_91x_init().

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8 and v9: Resolved error reported by 'kbuild test robot' by guarding
   code with CONFIG_RSI_COEX flag
v7: Use mutex instead of semaphore (Kalle)
v6: Rename semaphore tx_bus_lock to tx_bus_sema. Modified coex
scheduling loop to avoid while(1) (Kalle)
v5: Same as earlier versions

---
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 177 
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  17 +--
 drivers/net/wireless/rsi/rsi_91x_main.c |  38 ++-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |   1 +
 drivers/net/wireless/rsi/rsi_91x_usb.c  |   2 +
 drivers/net/wireless/rsi/rsi_coex.h |  37 +++
 drivers/net/wireless/rsi/rsi_main.h |   6 ++
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 include/net/rsi_91x.h   |  20 
 12 files changed, 303 insertions(+), 10 deletions(-)
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h

diff --git a/drivers/net/wireless/rsi/Kconfig b/drivers/net/wireless/rsi/Kconfig
index 7c5e4ca..e6135ee 100644
--- a/drivers/net/wireless/rsi/Kconfig
+++ b/drivers/net/wireless/rsi/Kconfig
@@ -42,4 +42,13 @@ config RSI_USB
  This option enables the USB bus support in rsi drivers.
  Select M (recommended), if you have a RSI 1x1 wireless module.
 
+config RSI_COEX
+   bool "Redpine Signals WLAN BT Coexistence support"
+   depends on BT_HCIRSI && RSI_91X
+   default y
+   ---help---
+ This option enables the WLAN BT coex support in rsi drivers.
+ Select M (recommended), if you have want to use this feature
+ and you have RS9113 module.
+
 endif # WLAN_VENDOR_RSI
diff --git a/drivers/net/wireless/rsi/Makefile 
b/drivers/net/wireless/rsi/Makefile
index 47c4590..ff87121a 100644
--- a/drivers/net/wireless/rsi/Makefile
+++ b/drivers/net/wireless/rsi/Makefile
@@ -5,6 +5,7 @@ rsi_91x-y   += rsi_91x_mac80211.o
 rsi_91x-y  += rsi_91x_mgmt.o
 rsi_91x-y  += rsi_91x_hal.o
 rsi_91x-y  += rsi_91x_ps.o
+rsi_91x-$(CONFIG_RSI_COEX) += rsi_91x_coex.o
 rsi_91x-$(CONFIG_RSI_DEBUGFS)  += rsi_91x_debugfs.o
 
 rsi_usb-y  += rsi_91x_usb.o rsi_91x_usb_ops.o
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
new file mode 100644
index 000..c07e839
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2018 Redpine Signals 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.
+ */
+
+#include "rsi_main.h"
+#include "rsi_coex.h"
+#include "rsi_mgmt.h"
+#include "rsi_hal.h"
+
+static enum rsi_coex_queues rsi_coex_determine_coex_q
+   (struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues q_num = RSI_COEX_Q_INVALID;
+
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_COMMON]) > 0)
+   q_num = RSI_COEX_Q_COMMON;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_BT]) > 0)
+   q_num = RSI_COEX_Q_BT;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_WLAN]) > 0)
+   q_num = RSI_COEX_Q_WLAN;
+
+   return q_num;
+}
+
+static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum r

[v9 6/8] rsi: handle BT traffic in driver

2018-02-27 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

BT frames are passed through coex and hal modules to BUS.
After firmware is loaded, based on the operating mode CARD
READY frame comes for each protocol. When BT card ready is
received, BT attach is called.
Protocol operations are exchanged between the modules
at initialization time.
Build flag CONFIG_RSI_COEX is introduced to enable coex support
if CONFIG_BT_RSIHCI is enabled. Coex operations are valid if
coex mode is greater than 1 only.

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Same as v6, v7
v6: Removed CONFIG_BT_HCIRSI flag dependency on RSI_91x. Introduced
CONFIG_RSI_COEX for coex code. (Kalle)
v5: Same as v3, v4
v3: bt_ops need not be present structure g_proto_ops. It is removed.
v2: WLAN module depends on BT module. Updated in Kconfig
---
 drivers/net/wireless/rsi/rsi_91x_coex.c |  4 ++-
 drivers/net/wireless/rsi/rsi_91x_core.c | 20 +---
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 39 +++
 drivers/net/wireless/rsi/rsi_91x_main.c | 49 +++--
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  1 +
 drivers/net/wireless/rsi/rsi_common.h   |  1 +
 drivers/net/wireless/rsi/rsi_hal.h  | 10 ++
 drivers/net/wireless/rsi/rsi_main.h |  3 ++
 8 files changed, 118 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
index c07e839..d055099 100644
--- a/drivers/net/wireless/rsi/rsi_91x_coex.c
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -43,8 +43,10 @@ static void rsi_coex_sched_tx_pkts(struct 
rsi_coex_ctrl_block *coex_cb)
coex_q = rsi_coex_determine_coex_q(coex_cb);
rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
 
-   if (coex_q == RSI_COEX_Q_BT)
+   if (coex_q == RSI_COEX_Q_BT) {
skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+   rsi_send_bt_pkt(coex_cb->priv, skb);
+   }
} while (coex_q != RSI_COEX_Q_INVALID);
 }
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index d0d2201..5dafd2e 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -17,6 +17,7 @@
 #include "rsi_mgmt.h"
 #include "rsi_common.h"
 #include "rsi_hal.h"
+#include "rsi_coex.h"
 
 /**
  * rsi_determine_min_weight_queue() - This function determines the queue with
@@ -301,14 +302,23 @@ void rsi_core_qos_processor(struct rsi_common *common)
mutex_unlock(>tx_lock);
break;
}
-
-   if (q_num == MGMT_SOFT_Q) {
-   status = rsi_send_mgmt_pkt(common, skb);
-   } else if (q_num == MGMT_BEACON_Q) {
+   if (q_num == MGMT_BEACON_Q) {
status = rsi_send_pkt_to_bus(common, skb);
dev_kfree_skb(skb);
} else {
-   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   if (common->coex_mode > 1) {
+   status = rsi_coex_send_pkt(common, skb,
+  RSI_WLAN_Q);
+   } else {
+#endif
+   if (q_num == MGMT_SOFT_Q)
+   status = rsi_send_mgmt_pkt(common, skb);
+   else
+   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   }
+#endif
}
 
if (status) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 151d228..de608ae 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -15,6 +15,7 @@
  */
 
 #include 
+#include 
 #include "rsi_mgmt.h"
 #include "rsi_hal.h"
 #include "rsi_sdio.h"
@@ -24,6 +25,7 @@
 static struct ta_metadata metadata_flash_content[] = {
{"flash_content", 0x0001},
{"rsi/rs9113_wlan_qspi.rps", 0x0001},
+   {"rsi/rs9113_wlan_bt_dual_mode.rps", 0x0001},
 };
 
 int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
@@ -357,6 +359,43 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
return status;
 }
 
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb)
+{
+   int status = -EINVAL;
+   u8 header_size = 0;
+   struct rsi_bt_desc *bt_desc;
+   u8 queueno = ((skb->data[1] >> 4) & 0xf)

[v9 7/8] rsi: add module parameter operating mode

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Operating mode determines the support for other protocols.
This is made as module parameter for better usage.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_main.c | 48 ++---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 10 ++-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 10 ++-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_hal.h  | 11 
 5 files changed, 74 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index b3e7d75..1485a0c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -70,8 +70,24 @@ EXPORT_SYMBOL_GPL(rsi_dbg);
 static char *opmode_str(int oper_mode)
 {
switch (oper_mode) {
-   case RSI_DEV_OPMODE_WIFI_ALONE:
+   case DEV_OPMODE_WIFI_ALONE:
return "Wi-Fi alone";
+   case DEV_OPMODE_BT_ALONE:
+   return "BT EDR alone";
+   case DEV_OPMODE_BT_LE_ALONE:
+   return "BT LE alone";
+   case DEV_OPMODE_BT_DUAL:
+   return "BT Dual";
+   case DEV_OPMODE_STA_BT:
+   return "Wi-Fi STA + BT EDR";
+   case DEV_OPMODE_STA_BT_LE:
+   return "Wi-Fi STA + BT LE";
+   case DEV_OPMODE_STA_BT_DUAL:
+   return "Wi-Fi STA + BT DUAL";
+   case DEV_OPMODE_AP_BT:
+   return "Wi-Fi AP + BT EDR";
+   case DEV_OPMODE_AP_BT_DUAL:
+   return "Wi-Fi AP + BT DUAL";
}
 
return "Unknown";
@@ -278,7 +294,7 @@ void rsi_set_bt_context(void *priv, void *bt_context)
  *
  * Return: Pointer to the adapter structure on success, NULL on failure .
  */
-struct rsi_hw *rsi_91x_init(void)
+struct rsi_hw *rsi_91x_init(u16 oper_mode)
 {
struct rsi_hw *adapter = NULL;
struct rsi_common *common = NULL;
@@ -321,9 +337,33 @@ struct rsi_hw *rsi_91x_init(void)
timer_setup(>roc_timer, rsi_roc_timeout, 0);
init_completion(>wlan_init_completion);
common->init_done = true;
+   adapter->device_model = RSI_DEV_9113;
+   common->oper_mode = oper_mode;
+
+   /* Determine coex mode */
+   switch (common->oper_mode) {
+   case DEV_OPMODE_STA_BT_DUAL:
+   case DEV_OPMODE_STA_BT:
+   case DEV_OPMODE_STA_BT_LE:
+   case DEV_OPMODE_BT_ALONE:
+   case DEV_OPMODE_BT_LE_ALONE:
+   case DEV_OPMODE_BT_DUAL:
+   common->coex_mode = 2;
+   break;
+   case DEV_OPMODE_AP_BT_DUAL:
+   case DEV_OPMODE_AP_BT:
+   common->coex_mode = 4;
+   break;
+   case DEV_OPMODE_WIFI_ALONE:
+   common->coex_mode = 1;
+   break;
+   default:
+   common->oper_mode = 1;
+   common->coex_mode = 1;
+   }
+   rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
+   __func__, common->oper_mode, common->coex_mode);
 
-   common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
-   common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
adapter->device_model = RSI_DEV_9113;
 #ifdef CONFIG_RSI_COEX
if (common->coex_mode > 1) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index ba38c6d..5722736 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -21,6 +21,14 @@
 #include "rsi_coex.h"
 #include "rsi_hal.h"
 
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+"1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+"9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+"6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
 /**
  * rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg.
  * @rw: Read/write
@@ -926,7 +934,7 @@ static int rsi_probe(struct sdio_func *pfunction,
 
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
 
-   adapter = rsi_91x_init();
+   adapter = rsi_91x_init(dev_oper_mode);
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index b33a05f..0a50cff 100644
--- a/drivers/net/wireless/rsi/r

[v9 3/8] rsi: add header file rsi_91x

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

The common parameters used by wlan and bt modules are add
to a new header file "rsi_91x.h" defined in 'include/net'

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v9: No change since v6
v6: Renamed rsi_header.h to rsi_91x.h and moved to include/net
from include/linux(Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/rsi_main.h | 12 ++--
 include/net/rsi_91x.h   | 34 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
 create mode 100644 include/net/rsi_91x.h

diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..b0f4e2c 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char 
*fmt, ...);
 #define MGMT_HW_Q  10
 #define BEACON_HW_Q11
 
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
 #define IEEE80211_MGMT_FRAME0x00
 #define IEEE80211_CTL_FRAME 0x04
 
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
 };
 
-enum host_intf {
-   RSI_HOST_INTF_SDIO = 0,
-   RSI_HOST_INTF_USB
-};
-
 struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
 
-   enum host_intf rsi_host_intf;
+   enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
diff --git a/include/net/rsi_91x.h b/include/net/rsi_91x.h
new file mode 100644
index 000..16a447b
--- /dev/null
+++ b/include/net/rsi_91x.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q   0x2
+#define RSI_WLAN_Q  0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q  0x6
+#define RSI_BT_DATA_Q  0x7
+
+enum rsi_host_intf {
+   RSI_HOST_INTF_SDIO = 0,
+   RSI_HOST_INTF_USB
+};
+
+#endif
-- 
2.7.4



[v9 2/8] rsi: add bluetooth rx endpoint

2018-02-27 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

USB endpoint 1 is used for WLAN which is presently in use.
USB endpoint 2 is introduced for BT Rx traffic. Enumeration
of Rx BT endpoint and submitting Rx BT URB are added.

>From /sys/kernel/debug/usb/devices,
Ad=81(I) is for WLAN EP IN and Ad=01(O) is for Wlan EP OUT.
Ad=82(I) is for BT EP IN and Ad=02(O) is for BT EP OUT.

T:  Bus=01 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1618 ProdID=9113 Rev= 0.02
S:  Manufacturer=Redpine Signals, Inc.
S:  Product=Wireless USB Network Module
S:  SerialNumber=0001
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
I:* If#= 0 Alt= 0 #EPs= 6 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v9: No change since v2
v2: Included '/sys/kernel/debug/usb/devices' info in patch description(Marcel)
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 37 --
 drivers/net/wireless/rsi/rsi_usb.h |  6 +++---
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index bbce809..9ab86fb 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -103,41 +103,42 @@ static int rsi_find_bulk_in_and_out_endpoints(struct 
usb_interface *interface,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
__le16 buffer_size;
-   int ii, bep_found = 0;
+   int ii, bin_found = 0, bout_found = 0;
 
iface_desc = &(interface->altsetting[0]);
 
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
endpoint = &(iface_desc->endpoint[ii].desc);
 
-   if ((!(dev->bulkin_endpoint_addr)) &&
+   if (!dev->bulkin_endpoint_addr[bin_found] &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
-   ((endpoint->bmAttributes &
-   USB_ENDPOINT_XFERTYPE_MASK) ==
+   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_BULK)) {
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkin_size = buffer_size;
-   dev->bulkin_endpoint_addr =
+   dev->bulkin_size[bin_found] = buffer_size;
+   dev->bulkin_endpoint_addr[bin_found] =
endpoint->bEndpointAddress;
+   bin_found++;
}
 
-   if (!dev->bulkout_endpoint_addr[bep_found] &&
+   if (!dev->bulkout_endpoint_addr[bout_found] &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
-   dev->bulkout_endpoint_addr[bep_found] =
+   USB_ENDPOINT_XFER_BULK)) {
+   buffer_size = endpoint->wMaxPacketSize;
+   dev->bulkout_endpoint_addr[bout_found] =
endpoint->bEndpointAddress;
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkout_size[bep_found] = buffer_size;
-   bep_found++;
+   dev->bulkout_size[bout_found] = buffer_size;
+   bout_found++;
}
 
-   if (bep_found >= MAX_BULK_EP)
+   if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
break;
}
 
-   if (!(dev->bulkin_endpoint_addr) &&
-   (dev->bulkout_endpoint_addr[0]))
+   if (!(dev->bulkin_endpoint_addr[0]) &&
+   dev->bulkout_endpoint_addr[0])
return -EINVAL;
 
return 0;
@@ -273,7 +274,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 
ep_num)
usb_fill_bulk_urb(urb,
  dev->usbdev,
  usb_rcvbulkpipe(dev->usbdev,
-   dev->bulkin_endpoint_addr),
+ dev->bulkin_endpoint_addr[ep_num - 1]),
  urb->transfer_buffer,

[v9 1/8] rsi: add rx control block to handle rx packets in USB

2018-02-27 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Rx bluetooth endpoint shall be added in further patches. Rx control
block is introduced here to handle Rx packets properly. Separate
function is written to initialize the RX control blocks.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v9: No change since v6
v6: Removed unnecessary GFP_DMA flag for kzalloc(Kalle)
v5: Same as earlier version
---
 drivers/net/wireless/rsi/rsi_91x_main.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  2 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 75 +++--
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  | 35 +-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_main.h |  2 +-
 drivers/net/wireless/rsi/rsi_usb.h  | 10 +++-
 7 files changed, 96 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0cb8e68..0413af8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common 
*common,
  *
  * Return: 0 on success, -1 on failure.
  */
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
 {
u8 *frame_desc = NULL, extended_desc = 0;
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
 
index = 0;
do {
-   frame_desc = >rx_data_pkt[index];
+   frame_desc = _pkt[index];
actual_length = *(u16 *)_desc[0];
offset = *(u16 *)_desc[2];
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 8e2a95c..9fbc0ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
goto fail;
}
 
-   status = rsi_read_pkt(common, rcv_pkt_len);
+   status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
 
 fail:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 8f84438..bbce809 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
  */
 static void rsi_rx_done_handler(struct urb *urb)
 {
-   struct rsi_hw *adapter = urb->context;
-   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb = urb->context;
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
 
if (urb->status)
return;
 
+   rx_cb->pend = 1;
rsi_set_event(>rx_thread.event);
 }
 
@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
  *
  * Return: 0 on success, a negative error code on failure.
  */
-static int rsi_rx_urb_submit(struct rsi_hw *adapter)
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
 {
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
-   struct urb *urb = dev->rx_usb_urb[0];
+   struct rx_usb_ctrl_block *rx_cb = >rx_cb[ep_num - 1];
+   struct urb *urb = rx_cb->rx_urb;
int status;
 
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  urb->transfer_buffer,
  3000,
  rsi_rx_done_handler,
- adapter);
+ rx_cb);
 
status = usb_submit_urb(urb, GFP_KERNEL);
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
  */
 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
 {
+   u8 idx;
+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
 
rsi_kill_thread(>rx_thread);
-   usb_free_urb(dev->rx_usb_urb[0]);
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   usb_free_urb(dev->rx_cb[idx].rx_urb);
+   kfree(dev->rx_cb[idx].rx_buffer);
+   }
+
kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
 }
 
+static int rsi_usb_init_rx(struct rsi_hw *adapter)
+{
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb;
+   u8 idx;
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {

[v9 0/8] rsi: add bluetooth and coex support

2018-02-27 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.

Change in v9: "#ifdef CONFIG_RSI_COEX" check moved from 6/8 to 4/6
  to resolve kbuild test robot reported error
Change in v8: 4/8, 5/8 are modified
Change in v7: 4/8 is modified
Changes in v6: 1/8, 3/8, 4/8, 5/8, 6/8 are modified
Changes in v5: 5/8 is modified
Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

Prameela Rani Garnepudi (6):
  rsi: add rx control block to handle rx packets in USB
  rsi: add header file rsi_91x
  rsi: add coex support
  Bluetooth: btrsi: add new rsi bluetooth driver
  rsi: add module parameter operating mode
  rsi: sdio changes to support BT

Siva Rebbagondla (2):
  rsi: add bluetooth rx endpoint
  rsi: handle BT traffic in driver

 drivers/bluetooth/Kconfig   |  12 ++
 drivers/bluetooth/Makefile  |   2 +
 drivers/bluetooth/btrsi.c   | 188 
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 179 ++
 drivers/net/wireless/rsi/rsi_91x_core.c |  20 ++-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  56 +++--
 drivers/net/wireless/rsi/rsi_91x_main.c | 129 ++-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |  13 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |   5 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 124 +-
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  35 --
 drivers/net/wireless/rsi/rsi_coex.h |  37 ++
 drivers/net/wireless/rsi/rsi_common.h   |   5 +-
 drivers/net/wireless/rsi/rsi_hal.h  |  21 
 drivers/net/wireless/rsi/rsi_main.h |  21 ++--
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 drivers/net/wireless/rsi/rsi_usb.h  |  16 ++-
 include/net/rsi_91x.h   |  56 +
 21 files changed, 852 insertions(+), 82 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
 create mode 100644 include/net/rsi_91x.h

-- 
2.7.4



[v8 3/8] rsi: add header file rsi_91x

2018-02-23 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

The common parameters used by wlan and bt modules are add
to a new header file "rsi_91x.h" defined in 'include/net'

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Same as v6, v7
v6: Renamed rsi_header.h to rsi_91x.h and moved to include/net
from include/linux(Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/rsi_main.h | 12 ++--
 include/net/rsi_91x.h   | 34 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
 create mode 100644 include/net/rsi_91x.h

diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..b0f4e2c 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char 
*fmt, ...);
 #define MGMT_HW_Q  10
 #define BEACON_HW_Q11
 
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
 #define IEEE80211_MGMT_FRAME0x00
 #define IEEE80211_CTL_FRAME 0x04
 
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
 };
 
-enum host_intf {
-   RSI_HOST_INTF_SDIO = 0,
-   RSI_HOST_INTF_USB
-};
-
 struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
 
-   enum host_intf rsi_host_intf;
+   enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
diff --git a/include/net/rsi_91x.h b/include/net/rsi_91x.h
new file mode 100644
index 000..16a447b
--- /dev/null
+++ b/include/net/rsi_91x.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q   0x2
+#define RSI_WLAN_Q  0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q  0x6
+#define RSI_BT_DATA_Q  0x7
+
+enum rsi_host_intf {
+   RSI_HOST_INTF_SDIO = 0,
+   RSI_HOST_INTF_USB
+};
+
+#endif
-- 
2.7.4



[v8 8/8] rsi: sdio changes to support BT

2018-02-23 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 169c981..6e74261 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



[v8 6/8] rsi: handle BT traffic in driver

2018-02-23 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

BT frames are passed through coex and hal modules to BUS.
After firmware is loaded, based on the operating mode CARD
READY frame comes for each protocol. When BT card ready is
received, BT attach is called.
Protocol operations are exchanged between the modules
at initialization time.
Build flag CONFIG_RSI_COEX is introduced to enable coex support
if CONFIG_BT_RSIHCI is enabled. Coex operations are valid if
coex mode is greater than 1 only.

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Same as v6, v7
v6: Removed CONFIG_BT_HCIRSI flag dependency on RSI_91x. Introduced
CONFIG_RSI_COEX for coex code. (Kalle)
v5: Same as v3, v4
v3: bt_ops need not be present structure g_proto_ops. It is removed.
v2: WLAN module depends on BT module. Updated in Kconfig
---
 drivers/net/wireless/rsi/rsi_91x_coex.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_core.c | 20 +++---
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 39 
 drivers/net/wireless/rsi/rsi_91x_main.c | 57 +++--
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  1 +
 drivers/net/wireless/rsi/rsi_common.h   |  1 +
 drivers/net/wireless/rsi/rsi_hal.h  | 10 +
 drivers/net/wireless/rsi/rsi_main.h |  3 ++
 8 files changed, 126 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
index c07e839..d055099 100644
--- a/drivers/net/wireless/rsi/rsi_91x_coex.c
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -43,8 +43,10 @@ static void rsi_coex_sched_tx_pkts(struct 
rsi_coex_ctrl_block *coex_cb)
coex_q = rsi_coex_determine_coex_q(coex_cb);
rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
 
-   if (coex_q == RSI_COEX_Q_BT)
+   if (coex_q == RSI_COEX_Q_BT) {
skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+   rsi_send_bt_pkt(coex_cb->priv, skb);
+   }
} while (coex_q != RSI_COEX_Q_INVALID);
 }
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index d0d2201..5dafd2e 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -17,6 +17,7 @@
 #include "rsi_mgmt.h"
 #include "rsi_common.h"
 #include "rsi_hal.h"
+#include "rsi_coex.h"
 
 /**
  * rsi_determine_min_weight_queue() - This function determines the queue with
@@ -301,14 +302,23 @@ void rsi_core_qos_processor(struct rsi_common *common)
mutex_unlock(>tx_lock);
break;
}
-
-   if (q_num == MGMT_SOFT_Q) {
-   status = rsi_send_mgmt_pkt(common, skb);
-   } else if (q_num == MGMT_BEACON_Q) {
+   if (q_num == MGMT_BEACON_Q) {
status = rsi_send_pkt_to_bus(common, skb);
dev_kfree_skb(skb);
} else {
-   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   if (common->coex_mode > 1) {
+   status = rsi_coex_send_pkt(common, skb,
+  RSI_WLAN_Q);
+   } else {
+#endif
+   if (q_num == MGMT_SOFT_Q)
+   status = rsi_send_mgmt_pkt(common, skb);
+   else
+   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   }
+#endif
}
 
if (status) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 151d228..de608ae 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -15,6 +15,7 @@
  */
 
 #include 
+#include 
 #include "rsi_mgmt.h"
 #include "rsi_hal.h"
 #include "rsi_sdio.h"
@@ -24,6 +25,7 @@
 static struct ta_metadata metadata_flash_content[] = {
{"flash_content", 0x0001},
{"rsi/rs9113_wlan_qspi.rps", 0x0001},
+   {"rsi/rs9113_wlan_bt_dual_mode.rps", 0x0001},
 };
 
 int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
@@ -357,6 +359,43 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
return status;
 }
 
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb)
+{
+   int status = -EINVAL;
+   u8 header_size = 0;
+   struct rsi_bt_desc *bt_desc;
+   u8 queueno = ((skb->data[1] >> 4) & 0xf);
+
+

[v8 7/8] rsi: add module parameter operating mode

2018-02-23 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Operating mode determines the support for other protocols.
This is made as module parameter for better usage.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_main.c | 48 ++---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 10 ++-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 10 ++-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_hal.h  | 11 
 5 files changed, 74 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index b3e7d75..1485a0c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -70,8 +70,24 @@ EXPORT_SYMBOL_GPL(rsi_dbg);
 static char *opmode_str(int oper_mode)
 {
switch (oper_mode) {
-   case RSI_DEV_OPMODE_WIFI_ALONE:
+   case DEV_OPMODE_WIFI_ALONE:
return "Wi-Fi alone";
+   case DEV_OPMODE_BT_ALONE:
+   return "BT EDR alone";
+   case DEV_OPMODE_BT_LE_ALONE:
+   return "BT LE alone";
+   case DEV_OPMODE_BT_DUAL:
+   return "BT Dual";
+   case DEV_OPMODE_STA_BT:
+   return "Wi-Fi STA + BT EDR";
+   case DEV_OPMODE_STA_BT_LE:
+   return "Wi-Fi STA + BT LE";
+   case DEV_OPMODE_STA_BT_DUAL:
+   return "Wi-Fi STA + BT DUAL";
+   case DEV_OPMODE_AP_BT:
+   return "Wi-Fi AP + BT EDR";
+   case DEV_OPMODE_AP_BT_DUAL:
+   return "Wi-Fi AP + BT DUAL";
}
 
return "Unknown";
@@ -278,7 +294,7 @@ void rsi_set_bt_context(void *priv, void *bt_context)
  *
  * Return: Pointer to the adapter structure on success, NULL on failure .
  */
-struct rsi_hw *rsi_91x_init(void)
+struct rsi_hw *rsi_91x_init(u16 oper_mode)
 {
struct rsi_hw *adapter = NULL;
struct rsi_common *common = NULL;
@@ -321,9 +337,33 @@ struct rsi_hw *rsi_91x_init(void)
timer_setup(>roc_timer, rsi_roc_timeout, 0);
init_completion(>wlan_init_completion);
common->init_done = true;
+   adapter->device_model = RSI_DEV_9113;
+   common->oper_mode = oper_mode;
+
+   /* Determine coex mode */
+   switch (common->oper_mode) {
+   case DEV_OPMODE_STA_BT_DUAL:
+   case DEV_OPMODE_STA_BT:
+   case DEV_OPMODE_STA_BT_LE:
+   case DEV_OPMODE_BT_ALONE:
+   case DEV_OPMODE_BT_LE_ALONE:
+   case DEV_OPMODE_BT_DUAL:
+   common->coex_mode = 2;
+   break;
+   case DEV_OPMODE_AP_BT_DUAL:
+   case DEV_OPMODE_AP_BT:
+   common->coex_mode = 4;
+   break;
+   case DEV_OPMODE_WIFI_ALONE:
+   common->coex_mode = 1;
+   break;
+   default:
+   common->oper_mode = 1;
+   common->coex_mode = 1;
+   }
+   rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
+   __func__, common->oper_mode, common->coex_mode);
 
-   common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
-   common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
adapter->device_model = RSI_DEV_9113;
 #ifdef CONFIG_RSI_COEX
if (common->coex_mode > 1) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index ba38c6d..5722736 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -21,6 +21,14 @@
 #include "rsi_coex.h"
 #include "rsi_hal.h"
 
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+"1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+"9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+"6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
 /**
  * rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg.
  * @rw: Read/write
@@ -926,7 +934,7 @@ static int rsi_probe(struct sdio_func *pfunction,
 
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
 
-   adapter = rsi_91x_init();
+   adapter = rsi_91x_init(dev_oper_mode);
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index b33a05f..0a50cff 100644
--- a/drivers/net/wireless/rsi/r

[v8 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2018-02-23 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Redpine bluetooth driver is a thin driver which depends on
'rsi_91x' driver for transmitting and receiving packets
to/from device. It creates hci interface when attach() is
called from 'rsi_91x' module.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Acked-by: Marcel Holtmann <mar...@holtmann.org>
Reviewed-by: Marcel Holtmann <mar...@holtmann.org>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Resolve 'kbuild test robot' reported error. Used asm/unaligned.h
header file instead of linux/unaligned/le_byteshift.h 
v7: Same as v6
v6: Renamed CONFIG_BT_RSI to CONFIG_BT_HCIRSI (Marcel)
v5: Addressed review comments from Marcel.
Removed reduntant switch case code from rsi_hci_recv_pkt()
Changed bt_cb(skb)->pkt_type to hci_skb_pkt_type(skb)
Removed reduntant '\n' from BT_ERR and redundant BT_INFO messages
Changed u8 *pkt to const u8 *pkt in rsi_hci_recv_pkt()
v4: Removed rsi_hci.h file. Made the functions static(Marcel)
v3: Made BT_RSI module by default off(Marcel)
Removed redundant exported function rsi_get_hci_ops()(Marcel)
v2: Addressed review comments from Marcel
Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
Removed redundant BT_INFO messages
h_adapter initialization and declaration in a single line.
Removed unnecessary error checks for HCI_RUNNING and fsm_state
Allocated new skb with skb_realloc_headroom() API if headroom is not 
sufficient
Used get_unaligned_le16 helpers
Moved a structure and union from header file to btrsi.c file
---
 drivers/bluetooth/Kconfig  |  12 +++
 drivers/bluetooth/Makefile |   2 +
 drivers/bluetooth/btrsi.c  | 188 +
 include/net/rsi_91x.h  |   4 +-
 4 files changed, 205 insertions(+), 1 deletion(-)
 create mode 100644 drivers/bluetooth/btrsi.c

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 07e55cd..d8bbd66 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -392,4 +392,16 @@ config BT_QCOMSMD
  Say Y here to compile support for HCI over Qualcomm SMD into the
  kernel or say M to compile as a module.
 
+config BT_HCIRSI
+   tristate "Redpine HCI support"
+   default n
+   select RSI_COEX
+   help
+ Redpine BT driver.
+ This driver handles BT traffic from upper layers and pass
+ to the RSI_91x coex module for further scheduling to device
+
+ Say Y here to compile support for HCI over Redpine into the
+ kernel or say M to compile as a module.
+
 endmenu
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index 4e4e44d..03cfc1b 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)  += btqca.o
 
 obj-$(CONFIG_BT_HCIUART_NOKIA) += hci_nokia.o
 
+obj-$(CONFIG_BT_HCIRSI)+= btrsi.o
+
 btmrvl-y   := btmrvl_main.o
 btmrvl-$(CONFIG_DEBUG_FS)  += btmrvl_debugfs.o
 
diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
new file mode 100644
index 000..5034325
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RSI_HEADROOM_FOR_BT_HAL16
+#define RSI_FRAME_DESC_SIZE16
+
+struct rsi_hci_adapter {
+   void *priv;
+   struct rsi_proto_ops *proto_ops;
+   struct hci_dev *hdev;
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+   struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
+   struct sk_buff *new_skb = NULL;
+
+   switch (hci_skb_pkt_type(skb)) {
+   case HCI_COMMAND_PKT:
+   hdev-

[v8 2/8] rsi: add bluetooth rx endpoint

2018-02-23 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

USB endpoint 1 is used for WLAN which is presently in use.
USB endpoint 2 is introduced for BT Rx traffic. Enumeration
of Rx BT endpoint and submitting Rx BT URB are added.

>From /sys/kernel/debug/usb/devices,
Ad=81(I) is for WLAN EP IN and Ad=01(O) is for Wlan EP OUT.
Ad=82(I) is for BT EP IN and Ad=02(O) is for BT EP OUT.

T:  Bus=01 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1618 ProdID=9113 Rev= 0.02
S:  Manufacturer=Redpine Signals, Inc.
S:  Product=Wireless USB Network Module
S:  SerialNumber=0001
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
I:* If#= 0 Alt= 0 #EPs= 6 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Same as previos revisions
v2: Included '/sys/kernel/debug/usb/devices' info in patch description(Marcel)
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 37 --
 drivers/net/wireless/rsi/rsi_usb.h |  6 +++---
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index bbce809..9ab86fb 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -103,41 +103,42 @@ static int rsi_find_bulk_in_and_out_endpoints(struct 
usb_interface *interface,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
__le16 buffer_size;
-   int ii, bep_found = 0;
+   int ii, bin_found = 0, bout_found = 0;
 
iface_desc = &(interface->altsetting[0]);
 
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
endpoint = &(iface_desc->endpoint[ii].desc);
 
-   if ((!(dev->bulkin_endpoint_addr)) &&
+   if (!dev->bulkin_endpoint_addr[bin_found] &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
-   ((endpoint->bmAttributes &
-   USB_ENDPOINT_XFERTYPE_MASK) ==
+   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_BULK)) {
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkin_size = buffer_size;
-   dev->bulkin_endpoint_addr =
+   dev->bulkin_size[bin_found] = buffer_size;
+   dev->bulkin_endpoint_addr[bin_found] =
endpoint->bEndpointAddress;
+   bin_found++;
}
 
-   if (!dev->bulkout_endpoint_addr[bep_found] &&
+   if (!dev->bulkout_endpoint_addr[bout_found] &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
-   dev->bulkout_endpoint_addr[bep_found] =
+   USB_ENDPOINT_XFER_BULK)) {
+   buffer_size = endpoint->wMaxPacketSize;
+   dev->bulkout_endpoint_addr[bout_found] =
endpoint->bEndpointAddress;
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkout_size[bep_found] = buffer_size;
-   bep_found++;
+   dev->bulkout_size[bout_found] = buffer_size;
+   bout_found++;
}
 
-   if (bep_found >= MAX_BULK_EP)
+   if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
break;
}
 
-   if (!(dev->bulkin_endpoint_addr) &&
-   (dev->bulkout_endpoint_addr[0]))
+   if (!(dev->bulkin_endpoint_addr[0]) &&
+   dev->bulkout_endpoint_addr[0])
return -EINVAL;
 
return 0;
@@ -273,7 +274,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 
ep_num)
usb_fill_bulk_urb(urb,
  dev->usbdev,
  usb_rcvbulkpipe(dev->usbdev,
-   dev->bulkin_endpoint_addr),
+ dev->bulkin_endpoint_addr[ep_num - 1]),
  urb->transfer_buffer,

[v8 4/8] rsi: add coex support

2018-02-23 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

With BT support, driver has to handle two streams of data
(i.e. wlan and BT). Actual coex implementation is in firmware.
Coex module just schedule the packets to firmware by taking them
from the corresponding paths.

Structures for module and protocol operations are introduced for
this purpose. Protocol operations structure is global structure
which can be shared among different modules. Move initialization
of coex and operating mode values to rsi_91x_init().

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Resolve error reported by 'kbuild test robot' by moving header
file code under CONFIG_RSI_COEX flag
v7: Use mutex instead of semaphore (Kalle)
v6: Rename semaphore tx_bus_lock to tx_bus_sema. Modified coex
scheduling loop to avoid while(1) (Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 177 
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  17 +--
 drivers/net/wireless/rsi/rsi_91x_main.c |  30 +-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |   1 +
 drivers/net/wireless/rsi/rsi_91x_usb.c  |   2 +
 drivers/net/wireless/rsi/rsi_coex.h |  37 +++
 drivers/net/wireless/rsi/rsi_main.h |   6 ++
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 include/net/rsi_91x.h   |  20 
 12 files changed, 295 insertions(+), 10 deletions(-)
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h

diff --git a/drivers/net/wireless/rsi/Kconfig b/drivers/net/wireless/rsi/Kconfig
index 7c5e4ca..e6135ee 100644
--- a/drivers/net/wireless/rsi/Kconfig
+++ b/drivers/net/wireless/rsi/Kconfig
@@ -42,4 +42,13 @@ config RSI_USB
  This option enables the USB bus support in rsi drivers.
  Select M (recommended), if you have a RSI 1x1 wireless module.
 
+config RSI_COEX
+   bool "Redpine Signals WLAN BT Coexistence support"
+   depends on BT_HCIRSI && RSI_91X
+   default y
+   ---help---
+ This option enables the WLAN BT coex support in rsi drivers.
+ Select M (recommended), if you have want to use this feature
+ and you have RS9113 module.
+
 endif # WLAN_VENDOR_RSI
diff --git a/drivers/net/wireless/rsi/Makefile 
b/drivers/net/wireless/rsi/Makefile
index 47c4590..ff87121a 100644
--- a/drivers/net/wireless/rsi/Makefile
+++ b/drivers/net/wireless/rsi/Makefile
@@ -5,6 +5,7 @@ rsi_91x-y   += rsi_91x_mac80211.o
 rsi_91x-y  += rsi_91x_mgmt.o
 rsi_91x-y  += rsi_91x_hal.o
 rsi_91x-y  += rsi_91x_ps.o
+rsi_91x-$(CONFIG_RSI_COEX) += rsi_91x_coex.o
 rsi_91x-$(CONFIG_RSI_DEBUGFS)  += rsi_91x_debugfs.o
 
 rsi_usb-y  += rsi_91x_usb.o rsi_91x_usb_ops.o
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
new file mode 100644
index 000..c07e839
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2018 Redpine Signals 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.
+ */
+
+#include "rsi_main.h"
+#include "rsi_coex.h"
+#include "rsi_mgmt.h"
+#include "rsi_hal.h"
+
+static enum rsi_coex_queues rsi_coex_determine_coex_q
+   (struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues q_num = RSI_COEX_Q_INVALID;
+
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_COMMON]) > 0)
+   q_num = RSI_COEX_Q_COMMON;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_BT]) > 0)
+   q_num = RSI_COEX_Q_BT;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_WLAN]) > 0)
+   q_num = RSI_COEX_Q_WLAN;
+
+   return q_num;
+}
+
+static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum r

[v8 1/8] rsi: add rx control block to handle rx packets in USB

2018-02-23 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Rx bluetooth endpoint shall be added in further patches. Rx control
block is introduced here to handle Rx packets properly. Separate
function is written to initialize the RX control blocks.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v8: Same as v6, v7
v6: Removed unnecessary GFP_DMA flag for kzalloc(Kalle)
v5: Same as earlier version
---
 drivers/net/wireless/rsi/rsi_91x_main.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  2 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 75 +++--
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  | 35 +-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_main.h |  2 +-
 drivers/net/wireless/rsi/rsi_usb.h  | 10 +++-
 7 files changed, 96 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0cb8e68..0413af8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common 
*common,
  *
  * Return: 0 on success, -1 on failure.
  */
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
 {
u8 *frame_desc = NULL, extended_desc = 0;
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
 
index = 0;
do {
-   frame_desc = >rx_data_pkt[index];
+   frame_desc = _pkt[index];
actual_length = *(u16 *)_desc[0];
offset = *(u16 *)_desc[2];
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 8e2a95c..9fbc0ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
goto fail;
}
 
-   status = rsi_read_pkt(common, rcv_pkt_len);
+   status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
 
 fail:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 8f84438..bbce809 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
  */
 static void rsi_rx_done_handler(struct urb *urb)
 {
-   struct rsi_hw *adapter = urb->context;
-   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb = urb->context;
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
 
if (urb->status)
return;
 
+   rx_cb->pend = 1;
rsi_set_event(>rx_thread.event);
 }
 
@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
  *
  * Return: 0 on success, a negative error code on failure.
  */
-static int rsi_rx_urb_submit(struct rsi_hw *adapter)
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
 {
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
-   struct urb *urb = dev->rx_usb_urb[0];
+   struct rx_usb_ctrl_block *rx_cb = >rx_cb[ep_num - 1];
+   struct urb *urb = rx_cb->rx_urb;
int status;
 
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  urb->transfer_buffer,
  3000,
  rsi_rx_done_handler,
- adapter);
+ rx_cb);
 
status = usb_submit_urb(urb, GFP_KERNEL);
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
  */
 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
 {
+   u8 idx;
+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
 
rsi_kill_thread(>rx_thread);
-   usb_free_urb(dev->rx_usb_urb[0]);
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   usb_free_urb(dev->rx_cb[idx].rx_urb);
+   kfree(dev->rx_cb[idx].rx_buffer);
+   }
+
kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
 }
 
+static int rsi_usb_init_rx(struct rsi_hw *adapter)
+{
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb;
+   u8 idx;
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {

[v8 0/8] rsi: add bluetooth and coex support

2018-02-23 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.

Change in v8: 4/8, 5/8 are modified
Change in v7: 4/8 is modified
Changes in v6: 1/8, 3/8, 4/8, 5/8, 6/8 are modified
Changes in v5: 5/8 is modified
Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

Prameela Rani Garnepudi (6):
  rsi: add rx control block to handle rx packets in USB
  rsi: add header file rsi_91x
  rsi: add coex support
  Bluetooth: btrsi: add new rsi bluetooth driver
  rsi: add module parameter operating mode
  rsi: sdio changes to support BT

Siva Rebbagondla (2):
  rsi: add bluetooth rx endpoint
  rsi: handle BT traffic in driver

 drivers/bluetooth/Kconfig   |  12 ++
 drivers/bluetooth/Makefile  |   2 +
 drivers/bluetooth/btrsi.c   | 188 
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 179 ++
 drivers/net/wireless/rsi/rsi_91x_core.c |  20 ++-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  56 +++--
 drivers/net/wireless/rsi/rsi_91x_main.c | 129 ++-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |  13 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |   5 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 124 +-
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  35 --
 drivers/net/wireless/rsi/rsi_coex.h |  37 ++
 drivers/net/wireless/rsi/rsi_common.h   |   5 +-
 drivers/net/wireless/rsi/rsi_hal.h  |  21 
 drivers/net/wireless/rsi/rsi_main.h |  21 ++--
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 drivers/net/wireless/rsi/rsi_usb.h  |  16 ++-
 include/net/rsi_91x.h   |  56 +
 21 files changed, 852 insertions(+), 82 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
 create mode 100644 include/net/rsi_91x.h

-- 
2.7.4



[v7 3/8] rsi: add header file rsi_91x

2018-02-19 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

The common parameters used by wlan and bt modules are add
to a new header file "rsi_91x.h" defined in 'include/net'

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v7: Same as v6
v6: Renamed rsi_header.h to rsi_91x.h and moved to include/net
from include/linux(Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/rsi_main.h | 12 ++--
 include/net/rsi_91x.h   | 34 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
 create mode 100644 include/net/rsi_91x.h

diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..b0f4e2c 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char 
*fmt, ...);
 #define MGMT_HW_Q  10
 #define BEACON_HW_Q11
 
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
 #define IEEE80211_MGMT_FRAME0x00
 #define IEEE80211_CTL_FRAME 0x04
 
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
 };
 
-enum host_intf {
-   RSI_HOST_INTF_SDIO = 0,
-   RSI_HOST_INTF_USB
-};
-
 struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
 
-   enum host_intf rsi_host_intf;
+   enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
diff --git a/include/net/rsi_91x.h b/include/net/rsi_91x.h
new file mode 100644
index 000..16a447b
--- /dev/null
+++ b/include/net/rsi_91x.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q   0x2
+#define RSI_WLAN_Q  0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q  0x6
+#define RSI_BT_DATA_Q  0x7
+
+enum rsi_host_intf {
+   RSI_HOST_INTF_SDIO = 0,
+   RSI_HOST_INTF_USB
+};
+
+#endif
-- 
2.7.4



[v7 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2018-02-19 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Redpine bluetooth driver is a thin driver which depends on
'rsi_91x' driver for transmitting and receiving packets
to/from device. It creates hci interface when attach() is
called from 'rsi_91x' module.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Acked-by: Marcel Holtmann <mar...@holtmann.org>
Reviewed-by: Marcel Holtmann <mar...@holtmann.org>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v7: Same as v6
v6: Renamed CONFIG_BT_RSI to CONFIG_BT_HCIRSI (Marcel)
v5: Addressed review comments from Marcel.
Removed reduntant switch case code from rsi_hci_recv_pkt()
Changed bt_cb(skb)->pkt_type to hci_skb_pkt_type(skb)
Removed reduntant '\n' from BT_ERR and redundant BT_INFO messages
Changed u8 *pkt to const u8 *pkt in rsi_hci_recv_pkt()
v4: Removed rsi_hci.h file. Made the functions static(Marcel)
v3: Made BT_RSI module by default off(Marcel)
Removed redundant exported function rsi_get_hci_ops()(Marcel)
v2: Addressed review comments from Marcel
Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
Removed redundant BT_INFO messages
h_adapter initialization and declaration in a single line.
Removed unnecessary error checks for HCI_RUNNING and fsm_state
Allocated new skb with skb_realloc_headroom() API if headroom is not 
sufficient
Used get_unaligned_le16 helpers
Moved a structure and union from header file to btrsi.c file
---
 drivers/bluetooth/Kconfig  |  12 +++
 drivers/bluetooth/Makefile |   2 +
 drivers/bluetooth/btrsi.c  | 188 +
 include/net/rsi_91x.h  |   4 +-
 4 files changed, 205 insertions(+), 1 deletion(-)
 create mode 100644 drivers/bluetooth/btrsi.c

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 07e55cd..d8bbd66 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -392,4 +392,16 @@ config BT_QCOMSMD
  Say Y here to compile support for HCI over Qualcomm SMD into the
  kernel or say M to compile as a module.
 
+config BT_HCIRSI
+   tristate "Redpine HCI support"
+   default n
+   select RSI_COEX
+   help
+ Redpine BT driver.
+ This driver handles BT traffic from upper layers and pass
+ to the RSI_91x coex module for further scheduling to device
+
+ Say Y here to compile support for HCI over Redpine into the
+ kernel or say M to compile as a module.
+
 endmenu
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index 4e4e44d..03cfc1b 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)  += btqca.o
 
 obj-$(CONFIG_BT_HCIUART_NOKIA) += hci_nokia.o
 
+obj-$(CONFIG_BT_HCIRSI)+= btrsi.o
+
 btmrvl-y   := btmrvl_main.o
 btmrvl-$(CONFIG_DEBUG_FS)  += btmrvl_debugfs.o
 
diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
new file mode 100644
index 000..803e045
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RSI_HEADROOM_FOR_BT_HAL16
+#define RSI_FRAME_DESC_SIZE16
+
+struct rsi_hci_adapter {
+   void *priv;
+   struct rsi_proto_ops *proto_ops;
+   struct hci_dev *hdev;
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+   struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
+   struct sk_buff *new_skb = NULL;
+
+   switch (hci_skb_pkt_type(skb)) {
+   case HCI_COMMAND_PKT:
+   hdev->stat.cmd_tx++;
+   break;
+   case HCI_ACLDATA_PKT:
+   hdev->stat.acl_tx++;
+

[v7 0/8] rsi: add bluetooth and coex support

2018-02-19 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.

Change in v7: 4/8 is modified
Changes in v6: 1/8, 3/8, 4/8, 5/8, 6/8 are modified
Changes in v5: 5/8 is modified
Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

Prameela Rani Garnepudi (6):
  rsi: add rx control block to handle rx packets in USB
  rsi: add header file rsi_91x
  rsi: add coex support
  Bluetooth: btrsi: add new rsi bluetooth driver
  rsi: add module parameter operating mode
  rsi: sdio changes to support BT

Siva Rebbagondla (2):
  rsi: add bluetooth rx endpoint
  rsi: handle BT traffic in driver

 drivers/bluetooth/Kconfig   |  12 ++
 drivers/bluetooth/Makefile  |   2 +
 drivers/bluetooth/btrsi.c   | 188 
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 179 ++
 drivers/net/wireless/rsi/rsi_91x_core.c |  20 ++-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  56 +++--
 drivers/net/wireless/rsi/rsi_91x_main.c | 129 ++-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |  13 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |   5 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 124 +-
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  35 --
 drivers/net/wireless/rsi/rsi_coex.h |  38 ++
 drivers/net/wireless/rsi/rsi_common.h   |   5 +-
 drivers/net/wireless/rsi/rsi_hal.h  |  21 
 drivers/net/wireless/rsi/rsi_main.h |  21 ++--
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 drivers/net/wireless/rsi/rsi_usb.h  |  16 ++-
 include/net/rsi_91x.h   |  56 +
 21 files changed, 853 insertions(+), 82 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
 create mode 100644 include/net/rsi_91x.h

-- 
2.7.4



[v7 8/8] rsi: sdio changes to support BT

2018-02-19 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 169c981..6e74261 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



[v7 2/8] rsi: add bluetooth rx endpoint

2018-02-19 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

USB endpoint 1 is used for WLAN which is presently in use.
USB endpoint 2 is introduced for BT Rx traffic. Enumeration
of Rx BT endpoint and submitting Rx BT URB are added.

>From /sys/kernel/debug/usb/devices,
Ad=81(I) is for WLAN EP IN and Ad=01(O) is for Wlan EP OUT.
Ad=82(I) is for BT EP IN and Ad=02(O) is for BT EP OUT.

T:  Bus=01 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1618 ProdID=9113 Rev= 0.02
S:  Manufacturer=Redpine Signals, Inc.
S:  Product=Wireless USB Network Module
S:  SerialNumber=0001
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
I:* If#= 0 Alt= 0 #EPs= 6 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v7: Same as v2, v3, v4, v5, v6
v2: Included '/sys/kernel/debug/usb/devices' info in patch description(Marcel)
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 37 --
 drivers/net/wireless/rsi/rsi_usb.h |  6 +++---
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index bbce809..9ab86fb 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -103,41 +103,42 @@ static int rsi_find_bulk_in_and_out_endpoints(struct 
usb_interface *interface,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
__le16 buffer_size;
-   int ii, bep_found = 0;
+   int ii, bin_found = 0, bout_found = 0;
 
iface_desc = &(interface->altsetting[0]);
 
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
endpoint = &(iface_desc->endpoint[ii].desc);
 
-   if ((!(dev->bulkin_endpoint_addr)) &&
+   if (!dev->bulkin_endpoint_addr[bin_found] &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
-   ((endpoint->bmAttributes &
-   USB_ENDPOINT_XFERTYPE_MASK) ==
+   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_BULK)) {
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkin_size = buffer_size;
-   dev->bulkin_endpoint_addr =
+   dev->bulkin_size[bin_found] = buffer_size;
+   dev->bulkin_endpoint_addr[bin_found] =
endpoint->bEndpointAddress;
+   bin_found++;
}
 
-   if (!dev->bulkout_endpoint_addr[bep_found] &&
+   if (!dev->bulkout_endpoint_addr[bout_found] &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
-   dev->bulkout_endpoint_addr[bep_found] =
+   USB_ENDPOINT_XFER_BULK)) {
+   buffer_size = endpoint->wMaxPacketSize;
+   dev->bulkout_endpoint_addr[bout_found] =
endpoint->bEndpointAddress;
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkout_size[bep_found] = buffer_size;
-   bep_found++;
+   dev->bulkout_size[bout_found] = buffer_size;
+   bout_found++;
}
 
-   if (bep_found >= MAX_BULK_EP)
+   if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
break;
}
 
-   if (!(dev->bulkin_endpoint_addr) &&
-   (dev->bulkout_endpoint_addr[0]))
+   if (!(dev->bulkin_endpoint_addr[0]) &&
+   dev->bulkout_endpoint_addr[0])
return -EINVAL;
 
return 0;
@@ -273,7 +274,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 
ep_num)
usb_fill_bulk_urb(urb,
  dev->usbdev,
  usb_rcvbulkpipe(dev->usbdev,
-   dev->bulkin_endpoint_addr),
+ dev->bulkin_endpoint_addr[ep_num - 1]),
  urb->transfer_buffer,

[v7 6/8] rsi: handle BT traffic in driver

2018-02-19 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

BT frames are passed through coex and hal modules to BUS.
After firmware is loaded, based on the operating mode CARD
READY frame comes for each protocol. When BT card ready is
received, BT attach is called.
Protocol operations are exchanged between the modules
at initialization time.
Build flag CONFIG_RSI_COEX is introduced to enable coex support
if CONFIG_BT_RSIHCI is enabled. Coex operations are valid if
coex mode is greater than 1 only.

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v7: Same as v6
v6: Removed CONFIG_BT_HCIRSI flag dependency on RSI_91x. Introduced
CONFIG_RSI_COEX for coex code. (Kalle)
v5: Same as v3, v4
v3: bt_ops need not be present structure g_proto_ops. It is removed.
v2: WLAN module depends on BT module. Updated in Kconfig
---
 drivers/net/wireless/rsi/rsi_91x_coex.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_core.c | 20 +++---
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 39 
 drivers/net/wireless/rsi/rsi_91x_main.c | 57 +++--
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  1 +
 drivers/net/wireless/rsi/rsi_common.h   |  1 +
 drivers/net/wireless/rsi/rsi_hal.h  | 10 +
 drivers/net/wireless/rsi/rsi_main.h |  3 ++
 8 files changed, 126 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
index c07e839..d055099 100644
--- a/drivers/net/wireless/rsi/rsi_91x_coex.c
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -43,8 +43,10 @@ static void rsi_coex_sched_tx_pkts(struct 
rsi_coex_ctrl_block *coex_cb)
coex_q = rsi_coex_determine_coex_q(coex_cb);
rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
 
-   if (coex_q == RSI_COEX_Q_BT)
+   if (coex_q == RSI_COEX_Q_BT) {
skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+   rsi_send_bt_pkt(coex_cb->priv, skb);
+   }
} while (coex_q != RSI_COEX_Q_INVALID);
 }
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index d0d2201..5dafd2e 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -17,6 +17,7 @@
 #include "rsi_mgmt.h"
 #include "rsi_common.h"
 #include "rsi_hal.h"
+#include "rsi_coex.h"
 
 /**
  * rsi_determine_min_weight_queue() - This function determines the queue with
@@ -301,14 +302,23 @@ void rsi_core_qos_processor(struct rsi_common *common)
mutex_unlock(>tx_lock);
break;
}
-
-   if (q_num == MGMT_SOFT_Q) {
-   status = rsi_send_mgmt_pkt(common, skb);
-   } else if (q_num == MGMT_BEACON_Q) {
+   if (q_num == MGMT_BEACON_Q) {
status = rsi_send_pkt_to_bus(common, skb);
dev_kfree_skb(skb);
} else {
-   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   if (common->coex_mode > 1) {
+   status = rsi_coex_send_pkt(common, skb,
+  RSI_WLAN_Q);
+   } else {
+#endif
+   if (q_num == MGMT_SOFT_Q)
+   status = rsi_send_mgmt_pkt(common, skb);
+   else
+   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   }
+#endif
}
 
if (status) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 151d228..de608ae 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -15,6 +15,7 @@
  */
 
 #include 
+#include 
 #include "rsi_mgmt.h"
 #include "rsi_hal.h"
 #include "rsi_sdio.h"
@@ -24,6 +25,7 @@
 static struct ta_metadata metadata_flash_content[] = {
{"flash_content", 0x0001},
{"rsi/rs9113_wlan_qspi.rps", 0x0001},
+   {"rsi/rs9113_wlan_bt_dual_mode.rps", 0x0001},
 };
 
 int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
@@ -357,6 +359,43 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
return status;
 }
 
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb)
+{
+   int status = -EINVAL;
+   u8 header_size = 0;
+   struct rsi_bt_desc *bt_desc;
+   u8 queueno = ((skb->data[1] >> 4) & 0xf);
+
+   if

[v7 7/8] rsi: add module parameter operating mode

2018-02-19 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Operating mode determines the support for other protocols.
This is made as module parameter for better usage.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_main.c | 48 ++---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 10 ++-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 10 ++-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_hal.h  | 11 
 5 files changed, 74 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index b3e7d75..1485a0c 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -70,8 +70,24 @@ EXPORT_SYMBOL_GPL(rsi_dbg);
 static char *opmode_str(int oper_mode)
 {
switch (oper_mode) {
-   case RSI_DEV_OPMODE_WIFI_ALONE:
+   case DEV_OPMODE_WIFI_ALONE:
return "Wi-Fi alone";
+   case DEV_OPMODE_BT_ALONE:
+   return "BT EDR alone";
+   case DEV_OPMODE_BT_LE_ALONE:
+   return "BT LE alone";
+   case DEV_OPMODE_BT_DUAL:
+   return "BT Dual";
+   case DEV_OPMODE_STA_BT:
+   return "Wi-Fi STA + BT EDR";
+   case DEV_OPMODE_STA_BT_LE:
+   return "Wi-Fi STA + BT LE";
+   case DEV_OPMODE_STA_BT_DUAL:
+   return "Wi-Fi STA + BT DUAL";
+   case DEV_OPMODE_AP_BT:
+   return "Wi-Fi AP + BT EDR";
+   case DEV_OPMODE_AP_BT_DUAL:
+   return "Wi-Fi AP + BT DUAL";
}
 
return "Unknown";
@@ -278,7 +294,7 @@ void rsi_set_bt_context(void *priv, void *bt_context)
  *
  * Return: Pointer to the adapter structure on success, NULL on failure .
  */
-struct rsi_hw *rsi_91x_init(void)
+struct rsi_hw *rsi_91x_init(u16 oper_mode)
 {
struct rsi_hw *adapter = NULL;
struct rsi_common *common = NULL;
@@ -321,9 +337,33 @@ struct rsi_hw *rsi_91x_init(void)
timer_setup(>roc_timer, rsi_roc_timeout, 0);
init_completion(>wlan_init_completion);
common->init_done = true;
+   adapter->device_model = RSI_DEV_9113;
+   common->oper_mode = oper_mode;
+
+   /* Determine coex mode */
+   switch (common->oper_mode) {
+   case DEV_OPMODE_STA_BT_DUAL:
+   case DEV_OPMODE_STA_BT:
+   case DEV_OPMODE_STA_BT_LE:
+   case DEV_OPMODE_BT_ALONE:
+   case DEV_OPMODE_BT_LE_ALONE:
+   case DEV_OPMODE_BT_DUAL:
+   common->coex_mode = 2;
+   break;
+   case DEV_OPMODE_AP_BT_DUAL:
+   case DEV_OPMODE_AP_BT:
+   common->coex_mode = 4;
+   break;
+   case DEV_OPMODE_WIFI_ALONE:
+   common->coex_mode = 1;
+   break;
+   default:
+   common->oper_mode = 1;
+   common->coex_mode = 1;
+   }
+   rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
+   __func__, common->oper_mode, common->coex_mode);
 
-   common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
-   common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
adapter->device_model = RSI_DEV_9113;
 #ifdef CONFIG_RSI_COEX
if (common->coex_mode > 1) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index ba38c6d..5722736 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -21,6 +21,14 @@
 #include "rsi_coex.h"
 #include "rsi_hal.h"
 
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+"1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+"9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+"6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
 /**
  * rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg.
  * @rw: Read/write
@@ -926,7 +934,7 @@ static int rsi_probe(struct sdio_func *pfunction,
 
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
 
-   adapter = rsi_91x_init();
+   adapter = rsi_91x_init(dev_oper_mode);
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index b33a05f..0a50cff 100644
--- a/drivers/net/wireless/rsi/r

[v7 4/8] rsi: add coex support

2018-02-19 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

With BT support, driver has to handle two streams of data
(i.e. wlan and BT). Actual coex implementation is in firmware.
Coex module just schedule the packets to firmware by taking them
from the corresponding paths.

Structures for module and protocol operations are introduced for
this purpose. Protocol operations structure is global structure
which can be shared among different modules. Move initialization
of coex and operating mode values to rsi_91x_init().

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v7: Use mutex instead of semaphore (Kalle)
v6: Rename semaphore tx_bus_lock to tx_bus_sema. Modified coex
scheduling loop to avoid while(1) (Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 177 
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  17 +--
 drivers/net/wireless/rsi/rsi_91x_main.c |  30 +-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |   1 +
 drivers/net/wireless/rsi/rsi_91x_usb.c  |   2 +
 drivers/net/wireless/rsi/rsi_coex.h |  38 +++
 drivers/net/wireless/rsi/rsi_main.h |   6 ++
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 include/net/rsi_91x.h   |  20 
 12 files changed, 296 insertions(+), 10 deletions(-)
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h

diff --git a/drivers/net/wireless/rsi/Kconfig b/drivers/net/wireless/rsi/Kconfig
index 7c5e4ca..e6135ee 100644
--- a/drivers/net/wireless/rsi/Kconfig
+++ b/drivers/net/wireless/rsi/Kconfig
@@ -42,4 +42,13 @@ config RSI_USB
  This option enables the USB bus support in rsi drivers.
  Select M (recommended), if you have a RSI 1x1 wireless module.
 
+config RSI_COEX
+   bool "Redpine Signals WLAN BT Coexistence support"
+   depends on BT_HCIRSI && RSI_91X
+   default y
+   ---help---
+ This option enables the WLAN BT coex support in rsi drivers.
+ Select M (recommended), if you have want to use this feature
+ and you have RS9113 module.
+
 endif # WLAN_VENDOR_RSI
diff --git a/drivers/net/wireless/rsi/Makefile 
b/drivers/net/wireless/rsi/Makefile
index 47c4590..ff87121a 100644
--- a/drivers/net/wireless/rsi/Makefile
+++ b/drivers/net/wireless/rsi/Makefile
@@ -5,6 +5,7 @@ rsi_91x-y   += rsi_91x_mac80211.o
 rsi_91x-y  += rsi_91x_mgmt.o
 rsi_91x-y  += rsi_91x_hal.o
 rsi_91x-y  += rsi_91x_ps.o
+rsi_91x-$(CONFIG_RSI_COEX) += rsi_91x_coex.o
 rsi_91x-$(CONFIG_RSI_DEBUGFS)  += rsi_91x_debugfs.o
 
 rsi_usb-y  += rsi_91x_usb.o rsi_91x_usb_ops.o
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
new file mode 100644
index 000..c07e839
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2018 Redpine Signals 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.
+ */
+
+#include "rsi_main.h"
+#include "rsi_coex.h"
+#include "rsi_mgmt.h"
+#include "rsi_hal.h"
+
+static enum rsi_coex_queues rsi_coex_determine_coex_q
+   (struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues q_num = RSI_COEX_Q_INVALID;
+
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_COMMON]) > 0)
+   q_num = RSI_COEX_Q_COMMON;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_BT]) > 0)
+   q_num = RSI_COEX_Q_BT;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_WLAN]) > 0)
+   q_num = RSI_COEX_Q_WLAN;
+
+   return q_num;
+}
+
+static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues coex_q = RSI_COEX_Q_INVALID;
+   struct sk_buff *skb;
+
+   do {
+   coex_q = rsi_coex_deter

[v7 1/8] rsi: add rx control block to handle rx packets in USB

2018-02-19 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Rx bluetooth endpoint shall be added in further patches. Rx control
block is introduced here to handle Rx packets properly. Separate
function is written to initialize the RX control blocks.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v7: Same as v6
v6: Removed unnecessary GFP_DMA flag for kzalloc(Kalle)
v5: Same as earlier version
---
 drivers/net/wireless/rsi/rsi_91x_main.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  2 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 75 +++--
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  | 35 +-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_main.h |  2 +-
 drivers/net/wireless/rsi/rsi_usb.h  | 10 +++-
 7 files changed, 96 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0cb8e68..0413af8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common 
*common,
  *
  * Return: 0 on success, -1 on failure.
  */
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
 {
u8 *frame_desc = NULL, extended_desc = 0;
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
 
index = 0;
do {
-   frame_desc = >rx_data_pkt[index];
+   frame_desc = _pkt[index];
actual_length = *(u16 *)_desc[0];
offset = *(u16 *)_desc[2];
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 8e2a95c..9fbc0ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
goto fail;
}
 
-   status = rsi_read_pkt(common, rcv_pkt_len);
+   status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
 
 fail:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 8f84438..bbce809 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
  */
 static void rsi_rx_done_handler(struct urb *urb)
 {
-   struct rsi_hw *adapter = urb->context;
-   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb = urb->context;
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
 
if (urb->status)
return;
 
+   rx_cb->pend = 1;
rsi_set_event(>rx_thread.event);
 }
 
@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
  *
  * Return: 0 on success, a negative error code on failure.
  */
-static int rsi_rx_urb_submit(struct rsi_hw *adapter)
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
 {
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
-   struct urb *urb = dev->rx_usb_urb[0];
+   struct rx_usb_ctrl_block *rx_cb = >rx_cb[ep_num - 1];
+   struct urb *urb = rx_cb->rx_urb;
int status;
 
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  urb->transfer_buffer,
  3000,
  rsi_rx_done_handler,
- adapter);
+ rx_cb);
 
status = usb_submit_urb(urb, GFP_KERNEL);
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
  */
 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
 {
+   u8 idx;
+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
 
rsi_kill_thread(>rx_thread);
-   usb_free_urb(dev->rx_usb_urb[0]);
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   usb_free_urb(dev->rx_cb[idx].rx_urb);
+   kfree(dev->rx_cb[idx].rx_buffer);
+   }
+
kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
 }
 
+static int rsi_usb_init_rx(struct rsi_hw *adapter)
+{
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb;
+   u8 idx;
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {

Re: [v5 4/8] rsi: add coex support

2018-02-16 Thread Amitkumar Karwar
On Tue, Feb 13, 2018 at 9:07 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> On Thu, Feb 1, 2018 at 12:26 PM, Kalle Valo <kv...@codeaurora.org> wrote:
>>> Amitkumar Karwar <amitkar...@gmail.com> writes:
>>>
>>>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>>>
>>>> With BT support, driver has to handle two streams of data
>>>> (i.e. wlan and BT). Actual coex implementation is in firmware.
>>>> Coex module just schedule the packets to firmware by taking them
>>>> from the corresponding paths.
>>>>
>>>> Structures for module and protocol operations are introduced for
>>>> this purpose. Protocol operations structure is global structure
>>>> which can be shared among different modules. Initialization of
>>>> coex and operating mode values is moved to rsi_91x_init().
>>>>
>>>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>>>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>>>
>>> [...]
>>>
>>>> @@ -270,6 +271,7 @@ struct rsi_common {
>>>>   u8 obm_ant_sel_val;
>>>>   int tx_power;
>>>>   u8 ant_in_use;
>>>> + struct semaphore tx_bus_lock;
>>>
>>> Do you really need to use semaphore? I think nowadays the preference is
>>> to use something other than semaphores.
>>
>> We used semaphore here, as USB/SDIO bus write operations could be
>> blocking/waiting. I will check if spinlock suits here in follow up
>> patch. It will need some testing.
>
> I was more thinking about using a mutex.

Right. mutex would be better option. I will submit updated version
with this change

Regards,
Amitkumar Karwar


[v6 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2018-02-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Redpine bluetooth driver is a thin driver which depends on
'rsi_91x' driver for transmitting and receiving packets
to/from device. It creates hci interface when attach() is
called from 'rsi_91x' module.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Acked-by: Marcel Holtmann <mar...@holtmann.org>
Reviewed-by: Marcel Holtmann <mar...@holtmann.org>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v6: Renamed CONFIG_BT_RSI to CONFIG_BT_HCIRSI (Marcel)
v5: Addressed review comments from Marcel.
Removed reduntant switch case code from rsi_hci_recv_pkt()
Changed bt_cb(skb)->pkt_type to hci_skb_pkt_type(skb)
Removed reduntant '\n' from BT_ERR and redundant BT_INFO messages
Changed u8 *pkt to const u8 *pkt in rsi_hci_recv_pkt()
v4: Removed rsi_hci.h file. Made the functions static(Marcel)
v3: Made BT_RSI module by default off(Marcel)
Removed redundant exported function rsi_get_hci_ops()(Marcel)
v2: Addressed review comments from Marcel
Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
Removed redundant BT_INFO messages
h_adapter initialization and declaration in a single line.
Removed unnecessary error checks for HCI_RUNNING and fsm_state
Allocated new skb with skb_realloc_headroom() API if headroom is not 
sufficient
Used get_unaligned_le16 helpers
Moved a structure and union from header file to btrsi.c file
---
 drivers/bluetooth/Kconfig  |  12 +++
 drivers/bluetooth/Makefile |   2 +
 drivers/bluetooth/btrsi.c  | 188 +
 include/net/rsi_91x.h  |   4 +-
 4 files changed, 205 insertions(+), 1 deletion(-)
 create mode 100644 drivers/bluetooth/btrsi.c

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 07e55cd..d8bbd66 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -392,4 +392,16 @@ config BT_QCOMSMD
  Say Y here to compile support for HCI over Qualcomm SMD into the
  kernel or say M to compile as a module.
 
+config BT_HCIRSI
+   tristate "Redpine HCI support"
+   default n
+   select RSI_COEX
+   help
+ Redpine BT driver.
+ This driver handles BT traffic from upper layers and pass
+ to the RSI_91x coex module for further scheduling to device
+
+ Say Y here to compile support for HCI over Redpine into the
+ kernel or say M to compile as a module.
+
 endmenu
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index 4e4e44d..03cfc1b 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)  += btqca.o
 
 obj-$(CONFIG_BT_HCIUART_NOKIA) += hci_nokia.o
 
+obj-$(CONFIG_BT_HCIRSI)+= btrsi.o
+
 btmrvl-y   := btmrvl_main.o
 btmrvl-$(CONFIG_DEBUG_FS)  += btmrvl_debugfs.o
 
diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
new file mode 100644
index 000..803e045
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define RSI_HEADROOM_FOR_BT_HAL16
+#define RSI_FRAME_DESC_SIZE16
+
+struct rsi_hci_adapter {
+   void *priv;
+   struct rsi_proto_ops *proto_ops;
+   struct hci_dev *hdev;
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+   struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
+   struct sk_buff *new_skb = NULL;
+
+   switch (hci_skb_pkt_type(skb)) {
+   case HCI_COMMAND_PKT:
+   hdev->stat.cmd_tx++;
+   break;
+   case HCI_ACLDATA_PKT:
+   hdev->stat.acl_tx++;
+   break;
+   case HC

[v6 8/8] rsi: sdio changes to support BT

2018-02-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 169c981..6e74261 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



[v6 6/8] rsi: handle BT traffic in driver

2018-02-13 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

BT frames are passed through coex and hal modules to BUS.
After firmware is loaded, based on the operating mode CARD
READY frame comes for each protocol. When BT card ready is
received, BT attach is called.
Protocol operations are exchanged between the modules
at initialization time.
Build flag CONFIG_RSI_COEX is introduced to enable coex support
if CONFIG_BT_RSIHCI is enabled. Coex operations are valid if
coex mode is greater than 1 only.

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v6: Removed CONFIG_BT_HCIRSI flag dependency on RSI_91x. Introduced
CONFIG_RSI_COEX for coex code. (Kalle)
v5: Same as v3, v4
v3: bt_ops need not be present structure g_proto_ops. It is removed.
v2: WLAN module depends on BT module. Updated in Kconfig
---
 drivers/net/wireless/rsi/rsi_91x_coex.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_core.c | 20 +++---
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 39 
 drivers/net/wireless/rsi/rsi_91x_main.c | 57 +++--
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  1 +
 drivers/net/wireless/rsi/rsi_common.h   |  1 +
 drivers/net/wireless/rsi/rsi_hal.h  | 10 +
 drivers/net/wireless/rsi/rsi_main.h |  3 ++
 8 files changed, 126 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
index c07e839..d055099 100644
--- a/drivers/net/wireless/rsi/rsi_91x_coex.c
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -43,8 +43,10 @@ static void rsi_coex_sched_tx_pkts(struct 
rsi_coex_ctrl_block *coex_cb)
coex_q = rsi_coex_determine_coex_q(coex_cb);
rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
 
-   if (coex_q == RSI_COEX_Q_BT)
+   if (coex_q == RSI_COEX_Q_BT) {
skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+   rsi_send_bt_pkt(coex_cb->priv, skb);
+   }
} while (coex_q != RSI_COEX_Q_INVALID);
 }
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index d0d2201..5dafd2e 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -17,6 +17,7 @@
 #include "rsi_mgmt.h"
 #include "rsi_common.h"
 #include "rsi_hal.h"
+#include "rsi_coex.h"
 
 /**
  * rsi_determine_min_weight_queue() - This function determines the queue with
@@ -301,14 +302,23 @@ void rsi_core_qos_processor(struct rsi_common *common)
mutex_unlock(>tx_lock);
break;
}
-
-   if (q_num == MGMT_SOFT_Q) {
-   status = rsi_send_mgmt_pkt(common, skb);
-   } else if (q_num == MGMT_BEACON_Q) {
+   if (q_num == MGMT_BEACON_Q) {
status = rsi_send_pkt_to_bus(common, skb);
dev_kfree_skb(skb);
} else {
-   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   if (common->coex_mode > 1) {
+   status = rsi_coex_send_pkt(common, skb,
+  RSI_WLAN_Q);
+   } else {
+#endif
+   if (q_num == MGMT_SOFT_Q)
+   status = rsi_send_mgmt_pkt(common, skb);
+   else
+   status = rsi_send_data_pkt(common, skb);
+#ifdef CONFIG_RSI_COEX
+   }
+#endif
}
 
if (status) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index f73d19b..2e624dde 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -15,6 +15,7 @@
  */
 
 #include 
+#include 
 #include "rsi_mgmt.h"
 #include "rsi_hal.h"
 #include "rsi_sdio.h"
@@ -24,6 +25,7 @@
 static struct ta_metadata metadata_flash_content[] = {
{"flash_content", 0x0001},
{"rsi/rs9113_wlan_qspi.rps", 0x0001},
+   {"rsi/rs9113_wlan_bt_dual_mode.rps", 0x0001},
 };
 
 int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
@@ -357,6 +359,43 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
return status;
 }
 
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb)
+{
+   int status = -EINVAL;
+   u8 header_size = 0;
+   struct rsi_bt_desc *bt_desc;
+   u8 queueno = ((skb->data[1] >> 4) & 0xf);
+
+   if (queueno == RSI_

[v6 7/8] rsi: add module parameter operating mode

2018-02-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Operating mode determines the support for other protocols.
This is made as module parameter for better usage.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_main.c | 48 ++---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 10 ++-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 10 ++-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_hal.h  | 11 
 5 files changed, 74 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index e5bb7e7..05556b0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -70,8 +70,24 @@ EXPORT_SYMBOL_GPL(rsi_dbg);
 static char *opmode_str(int oper_mode)
 {
switch (oper_mode) {
-   case RSI_DEV_OPMODE_WIFI_ALONE:
+   case DEV_OPMODE_WIFI_ALONE:
return "Wi-Fi alone";
+   case DEV_OPMODE_BT_ALONE:
+   return "BT EDR alone";
+   case DEV_OPMODE_BT_LE_ALONE:
+   return "BT LE alone";
+   case DEV_OPMODE_BT_DUAL:
+   return "BT Dual";
+   case DEV_OPMODE_STA_BT:
+   return "Wi-Fi STA + BT EDR";
+   case DEV_OPMODE_STA_BT_LE:
+   return "Wi-Fi STA + BT LE";
+   case DEV_OPMODE_STA_BT_DUAL:
+   return "Wi-Fi STA + BT DUAL";
+   case DEV_OPMODE_AP_BT:
+   return "Wi-Fi AP + BT EDR";
+   case DEV_OPMODE_AP_BT_DUAL:
+   return "Wi-Fi AP + BT DUAL";
}
 
return "Unknown";
@@ -278,7 +294,7 @@ void rsi_set_bt_context(void *priv, void *bt_context)
  *
  * Return: Pointer to the adapter structure on success, NULL on failure .
  */
-struct rsi_hw *rsi_91x_init(void)
+struct rsi_hw *rsi_91x_init(u16 oper_mode)
 {
struct rsi_hw *adapter = NULL;
struct rsi_common *common = NULL;
@@ -321,9 +337,33 @@ struct rsi_hw *rsi_91x_init(void)
timer_setup(>roc_timer, rsi_roc_timeout, 0);
init_completion(>wlan_init_completion);
common->init_done = true;
+   adapter->device_model = RSI_DEV_9113;
+   common->oper_mode = oper_mode;
+
+   /* Determine coex mode */
+   switch (common->oper_mode) {
+   case DEV_OPMODE_STA_BT_DUAL:
+   case DEV_OPMODE_STA_BT:
+   case DEV_OPMODE_STA_BT_LE:
+   case DEV_OPMODE_BT_ALONE:
+   case DEV_OPMODE_BT_LE_ALONE:
+   case DEV_OPMODE_BT_DUAL:
+   common->coex_mode = 2;
+   break;
+   case DEV_OPMODE_AP_BT_DUAL:
+   case DEV_OPMODE_AP_BT:
+   common->coex_mode = 4;
+   break;
+   case DEV_OPMODE_WIFI_ALONE:
+   common->coex_mode = 1;
+   break;
+   default:
+   common->oper_mode = 1;
+   common->coex_mode = 1;
+   }
+   rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
+   __func__, common->oper_mode, common->coex_mode);
 
-   common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
-   common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
adapter->device_model = RSI_DEV_9113;
 #ifdef CONFIG_RSI_COEX
if (common->coex_mode > 1) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index ba38c6d..5722736 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -21,6 +21,14 @@
 #include "rsi_coex.h"
 #include "rsi_hal.h"
 
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+"1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+"9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+"6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
 /**
  * rsi_sdio_set_cmd52_arg() - This function prepares cmd 52 read/write arg.
  * @rw: Read/write
@@ -926,7 +934,7 @@ static int rsi_probe(struct sdio_func *pfunction,
 
rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
 
-   adapter = rsi_91x_init();
+   adapter = rsi_91x_init(dev_oper_mode);
if (!adapter) {
rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
__func__);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index b33a05f..0a50cff 100644
--- a/drivers/net/wireless/rsi/r

[v6 4/8] rsi: add coex support

2018-02-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

With BT support, driver has to handle two streams of data
(i.e. wlan and BT). Actual coex implementation is in firmware.
Coex module just schedule the packets to firmware by taking them
from the corresponding paths.

Structures for module and protocol operations are introduced for
this purpose. Protocol operations structure is global structure
which can be shared among different modules. Move initialization
of coex and operating mode values to rsi_91x_init().

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v6: Rename semaphore tx_bus_lock to tx_bus_sema. Modified coex
scheduling loop to avoid while(1) (Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 177 
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  17 +--
 drivers/net/wireless/rsi/rsi_91x_main.c |  30 +-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |   1 +
 drivers/net/wireless/rsi/rsi_91x_usb.c  |   2 +
 drivers/net/wireless/rsi/rsi_coex.h |  38 +++
 drivers/net/wireless/rsi/rsi_main.h |   5 +
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 include/net/rsi_91x.h   |  20 
 12 files changed, 295 insertions(+), 10 deletions(-)
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h

diff --git a/drivers/net/wireless/rsi/Kconfig b/drivers/net/wireless/rsi/Kconfig
index 7c5e4ca..e6135ee 100644
--- a/drivers/net/wireless/rsi/Kconfig
+++ b/drivers/net/wireless/rsi/Kconfig
@@ -42,4 +42,13 @@ config RSI_USB
  This option enables the USB bus support in rsi drivers.
  Select M (recommended), if you have a RSI 1x1 wireless module.
 
+config RSI_COEX
+   bool "Redpine Signals WLAN BT Coexistence support"
+   depends on BT_HCIRSI && RSI_91X
+   default y
+   ---help---
+ This option enables the WLAN BT coex support in rsi drivers.
+ Select M (recommended), if you have want to use this feature
+ and you have RS9113 module.
+
 endif # WLAN_VENDOR_RSI
diff --git a/drivers/net/wireless/rsi/Makefile 
b/drivers/net/wireless/rsi/Makefile
index 47c4590..ff87121a 100644
--- a/drivers/net/wireless/rsi/Makefile
+++ b/drivers/net/wireless/rsi/Makefile
@@ -5,6 +5,7 @@ rsi_91x-y   += rsi_91x_mac80211.o
 rsi_91x-y  += rsi_91x_mgmt.o
 rsi_91x-y  += rsi_91x_hal.o
 rsi_91x-y  += rsi_91x_ps.o
+rsi_91x-$(CONFIG_RSI_COEX) += rsi_91x_coex.o
 rsi_91x-$(CONFIG_RSI_DEBUGFS)  += rsi_91x_debugfs.o
 
 rsi_usb-y  += rsi_91x_usb.o rsi_91x_usb_ops.o
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
new file mode 100644
index 000..c07e839
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2018 Redpine Signals 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.
+ */
+
+#include "rsi_main.h"
+#include "rsi_coex.h"
+#include "rsi_mgmt.h"
+#include "rsi_hal.h"
+
+static enum rsi_coex_queues rsi_coex_determine_coex_q
+   (struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues q_num = RSI_COEX_Q_INVALID;
+
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_COMMON]) > 0)
+   q_num = RSI_COEX_Q_COMMON;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_BT]) > 0)
+   q_num = RSI_COEX_Q_BT;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_WLAN]) > 0)
+   q_num = RSI_COEX_Q_WLAN;
+
+   return q_num;
+}
+
+static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues coex_q = RSI_COEX_Q_INVALID;
+   struct sk_buff *skb;
+
+   do {
+   coex_q = rsi_coex_determine_coex_q(coex_cb);
+   rsi_dbg(

[v6 2/8] rsi: add bluetooth rx endpoint

2018-02-13 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

USB endpoint 1 is used for WLAN which is presently in use.
USB endpoint 2 is introduced for BT Rx traffic. Enumeration
of Rx BT endpoint and submitting Rx BT URB are added.

>From /sys/kernel/debug/usb/devices,
Ad=81(I) is for WLAN EP IN and Ad=01(O) is for Wlan EP OUT.
Ad=82(I) is for BT EP IN and Ad=02(O) is for BT EP OUT.

T:  Bus=01 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1618 ProdID=9113 Rev= 0.02
S:  Manufacturer=Redpine Signals, Inc.
S:  Product=Wireless USB Network Module
S:  SerialNumber=0001
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
I:* If#= 0 Alt= 0 #EPs= 6 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v6: Same as v2, v3, v4, v5
v2: Included '/sys/kernel/debug/usb/devices' info in patch description(Marcel)
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 37 --
 drivers/net/wireless/rsi/rsi_usb.h |  6 +++---
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index bbce809..9ab86fb 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -103,41 +103,42 @@ static int rsi_find_bulk_in_and_out_endpoints(struct 
usb_interface *interface,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
__le16 buffer_size;
-   int ii, bep_found = 0;
+   int ii, bin_found = 0, bout_found = 0;
 
iface_desc = &(interface->altsetting[0]);
 
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
endpoint = &(iface_desc->endpoint[ii].desc);
 
-   if ((!(dev->bulkin_endpoint_addr)) &&
+   if (!dev->bulkin_endpoint_addr[bin_found] &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
-   ((endpoint->bmAttributes &
-   USB_ENDPOINT_XFERTYPE_MASK) ==
+   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_BULK)) {
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkin_size = buffer_size;
-   dev->bulkin_endpoint_addr =
+   dev->bulkin_size[bin_found] = buffer_size;
+   dev->bulkin_endpoint_addr[bin_found] =
endpoint->bEndpointAddress;
+   bin_found++;
}
 
-   if (!dev->bulkout_endpoint_addr[bep_found] &&
+   if (!dev->bulkout_endpoint_addr[bout_found] &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
-   dev->bulkout_endpoint_addr[bep_found] =
+   USB_ENDPOINT_XFER_BULK)) {
+   buffer_size = endpoint->wMaxPacketSize;
+   dev->bulkout_endpoint_addr[bout_found] =
endpoint->bEndpointAddress;
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkout_size[bep_found] = buffer_size;
-   bep_found++;
+   dev->bulkout_size[bout_found] = buffer_size;
+   bout_found++;
}
 
-   if (bep_found >= MAX_BULK_EP)
+   if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
break;
}
 
-   if (!(dev->bulkin_endpoint_addr) &&
-   (dev->bulkout_endpoint_addr[0]))
+   if (!(dev->bulkin_endpoint_addr[0]) &&
+   dev->bulkout_endpoint_addr[0])
return -EINVAL;
 
return 0;
@@ -273,7 +274,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 
ep_num)
usb_fill_bulk_urb(urb,
  dev->usbdev,
  usb_rcvbulkpipe(dev->usbdev,
-   dev->bulkin_endpoint_addr),
+ dev->bulkin_endpoint_addr[ep_num - 1]),
  urb->transfer_buffer,

[v6 0/8] rsi: add bluetooth and coex support

2018-02-13 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.

Changes in v6: 1/8, 3/8, 4/8, 5/8, 6/8 are modified
Changes in v5: 5/8 is modified
Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

Prameela Rani Garnepudi (6):
  rsi: add rx control block to handle rx packets in USB
  rsi: add header file rsi_91x
  rsi: add coex support
  Bluetooth: btrsi: add new rsi bluetooth driver
  rsi: add module parameter operating mode
  rsi: sdio changes to support BT

Siva Rebbagondla (2):
  rsi: add bluetooth rx endpoint
  rsi: handle BT traffic in driver

 drivers/bluetooth/Kconfig   |  12 ++
 drivers/bluetooth/Makefile  |   2 +
 drivers/bluetooth/btrsi.c   | 188 
 drivers/net/wireless/rsi/Kconfig|   9 ++
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 179 ++
 drivers/net/wireless/rsi/rsi_91x_core.c |  20 ++-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  56 +++--
 drivers/net/wireless/rsi/rsi_91x_main.c | 129 ++-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |  13 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |   5 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 124 +-
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  35 --
 drivers/net/wireless/rsi/rsi_coex.h |  38 ++
 drivers/net/wireless/rsi/rsi_common.h   |   5 +-
 drivers/net/wireless/rsi/rsi_hal.h  |  21 
 drivers/net/wireless/rsi/rsi_main.h |  20 +--
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 drivers/net/wireless/rsi/rsi_usb.h  |  16 ++-
 include/net/rsi_91x.h   |  56 +
 21 files changed, 852 insertions(+), 82 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
 create mode 100644 include/net/rsi_91x.h

-- 
2.7.4



[v6 3/8] rsi: add header file rsi_91x

2018-02-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

The common parameters used by wlan and bt modules are add
to a new header file "rsi_91x.h" defined in 'include/net'

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v6: Renamed rsi_header.h to rsi_91x.h and moved to include/net
from include/linux(Kalle)
v5: Same as earlier versions
---
 drivers/net/wireless/rsi/rsi_main.h | 12 ++--
 include/net/rsi_91x.h   | 34 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
 create mode 100644 include/net/rsi_91x.h

diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..b0f4e2c 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char 
*fmt, ...);
 #define MGMT_HW_Q  10
 #define BEACON_HW_Q11
 
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
 #define IEEE80211_MGMT_FRAME0x00
 #define IEEE80211_CTL_FRAME 0x04
 
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
 };
 
-enum host_intf {
-   RSI_HOST_INTF_SDIO = 0,
-   RSI_HOST_INTF_USB
-};
-
 struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
 
-   enum host_intf rsi_host_intf;
+   enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
diff --git a/include/net/rsi_91x.h b/include/net/rsi_91x.h
new file mode 100644
index 000..16a447b
--- /dev/null
+++ b/include/net/rsi_91x.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q   0x2
+#define RSI_WLAN_Q  0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q  0x6
+#define RSI_BT_DATA_Q  0x7
+
+enum rsi_host_intf {
+   RSI_HOST_INTF_SDIO = 0,
+   RSI_HOST_INTF_USB
+};
+
+#endif
-- 
2.7.4



[v6 1/8] rsi: add rx control block to handle rx packets in USB

2018-02-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Rx bluetooth endpoint shall be added in further patches. Rx control
block is introduced here to handle Rx packets properly. Separate
function is written to initialize the RX control blocks.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v6: Removed unnecessary GFP_DMA flag for kzalloc(Kalle)
v5: Same as earlier version
---
 drivers/net/wireless/rsi/rsi_91x_main.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  2 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 75 +++--
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  | 35 +-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_main.h |  2 +-
 drivers/net/wireless/rsi/rsi_usb.h  | 10 +++-
 7 files changed, 96 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0cb8e68..0413af8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common 
*common,
  *
  * Return: 0 on success, -1 on failure.
  */
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
 {
u8 *frame_desc = NULL, extended_desc = 0;
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
 
index = 0;
do {
-   frame_desc = >rx_data_pkt[index];
+   frame_desc = _pkt[index];
actual_length = *(u16 *)_desc[0];
offset = *(u16 *)_desc[2];
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 8e2a95c..9fbc0ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
goto fail;
}
 
-   status = rsi_read_pkt(common, rcv_pkt_len);
+   status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
 
 fail:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 8f84438..bbce809 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
  */
 static void rsi_rx_done_handler(struct urb *urb)
 {
-   struct rsi_hw *adapter = urb->context;
-   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb = urb->context;
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
 
if (urb->status)
return;
 
+   rx_cb->pend = 1;
rsi_set_event(>rx_thread.event);
 }
 
@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
  *
  * Return: 0 on success, a negative error code on failure.
  */
-static int rsi_rx_urb_submit(struct rsi_hw *adapter)
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
 {
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
-   struct urb *urb = dev->rx_usb_urb[0];
+   struct rx_usb_ctrl_block *rx_cb = >rx_cb[ep_num - 1];
+   struct urb *urb = rx_cb->rx_urb;
int status;
 
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  urb->transfer_buffer,
  3000,
  rsi_rx_done_handler,
- adapter);
+ rx_cb);
 
status = usb_submit_urb(urb, GFP_KERNEL);
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
  */
 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
 {
+   u8 idx;
+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
 
rsi_kill_thread(>rx_thread);
-   usb_free_urb(dev->rx_usb_urb[0]);
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   usb_free_urb(dev->rx_cb[idx].rx_urb);
+   kfree(dev->rx_cb[idx].rx_buffer);
+   }
+
kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
 }
 
+static int rsi_usb_init_rx(struct rsi_hw *adapter)
+{
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb;
+   u8 idx;
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {

Re: [v5 4/8] rsi: add coex support

2018-02-13 Thread Amitkumar Karwar
On Thu, Feb 1, 2018 at 12:38 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> With BT support, driver has to handle two streams of data
>> (i.e. wlan and BT). Actual coex implementation is in firmware.
>> Coex module just schedule the packets to firmware by taking them
>> from the corresponding paths.
>>
>> Structures for module and protocol operations are introduced for
>> this purpose. Protocol operations structure is global structure
>> which can be shared among different modules. Initialization of
>> coex and operating mode values is moved to rsi_91x_init().
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>
> [...]
>
>> +static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
>> +{
>> + enum rsi_coex_queues coex_q;
>> + struct sk_buff *skb;
>> +
>> + while (1) {
>> + coex_q = rsi_coex_determine_coex_q(coex_cb);
>> + rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
>> +
>> + if (coex_q == RSI_COEX_Q_INVALID) {
>> + rsi_dbg(DATA_TX_ZONE, "No more pkt\n");
>> + break;
>> + }
>> +
>> + if (coex_q == RSI_COEX_Q_BT)
>> + skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
>> + }
>> +}
>
> Neverending loops are dangerous in kernel. Can you put a limit so that
> if there's a bug the loop will not run forever?

I will get rid of while(1) in v6 patch series.

Regards,
Amitkumar


Re: [v5 4/8] rsi: add coex support

2018-02-13 Thread Amitkumar Karwar
On Thu, Feb 1, 2018 at 12:26 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> With BT support, driver has to handle two streams of data
>> (i.e. wlan and BT). Actual coex implementation is in firmware.
>> Coex module just schedule the packets to firmware by taking them
>> from the corresponding paths.
>>
>> Structures for module and protocol operations are introduced for
>> this purpose. Protocol operations structure is global structure
>> which can be shared among different modules. Initialization of
>> coex and operating mode values is moved to rsi_91x_init().
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>
> [...]
>
>> @@ -270,6 +271,7 @@ struct rsi_common {
>>   u8 obm_ant_sel_val;
>>   int tx_power;
>>   u8 ant_in_use;
>> + struct semaphore tx_bus_lock;
>
> Do you really need to use semaphore? I think nowadays the preference is
> to use something other than semaphores.

We used semaphore here, as USB/SDIO bus write operations could be
blocking/waiting. I will check if spinlock suits here in follow up
patch. It will need some testing.

> Also calling it tx_bus_lock is IMHO misleading, tx_bus_sema would be
> nicer.

Sure. I will rename the variable

Regards,
Amitkumar


Re: [v5 3/8] rsi: add header file rsi_header

2018-02-13 Thread Amitkumar Karwar
On Thu, Feb 1, 2018 at 12:09 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> The common parameters used by wlan and bt modules are added
>> to a new header file "rsi_header.h" defined in '/include/linux'
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>
> [...]
>
>> diff --git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
>> new file mode 100644
>> index 000..16a447b
>> --- /dev/null
>> +++ b/include/linux/rsi_header.h
>> @@ -0,0 +1,34 @@
>> +/**
>> + * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
>> +#define __RSI_HEADER_H__
>> +
>> +/* HAL queue information */
>> +#define RSI_COEX_Q   0x0
>> +#define RSI_BT_Q 0x2
>> +#define RSI_WLAN_Q  0x3
>> +#define RSI_WIFI_MGMT_Q 0x4
>> +#define RSI_WIFI_DATA_Q 0x5
>> +#define RSI_BT_MGMT_Q0x6
>> +#define RSI_BT_DATA_Q0x7
>> +
>> +enum rsi_host_intf {
>> + RSI_HOST_INTF_SDIO = 0,
>> + RSI_HOST_INTF_USB
>> +};
>> +
>> +#endif
>
> The name of the header "rsi_header.h" looks odd. The ".h" prefix already
> tells that it's a header file, no need to repeat that in the filename.
> But also calling it "rsi.h" feels a bit weird, it's not really very
> specific. Would "rsi_91x.h" (from rsi_91x.ko) be any better?

Sure. Using rsi_91x.h makes sense.

>
> Also I'm not sure about the location (include/linux), is that really the
> correct place to have a header file shared by a wireless and bluetooth
> driver? Anyone know? Or would include/net be better?
>

include/net looks more appropriate. I will use it.

Regards,
Amitkumar


Re: [v5 1/8] rsi: add rx control block to handle rx packets in USB

2018-02-13 Thread Amitkumar Karwar
On Thu, Feb 1, 2018 at 12:00 PM, Kalle Valo <kv...@codeaurora.org> wrote:
> Amitkumar Karwar <amitkar...@gmail.com> writes:
>
>> From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>
>> Rx bluetooth endpoint shall be added in further patches. Rx control
>> block is introduced here to handle Rx packets properly. Separate
>> function is written to initialize the RX control blocks.
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>
> [...]
>
>> +static int rsi_usb_init_rx(struct rsi_hw *adapter)
>> +{
>> + struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
>> + struct rx_usb_ctrl_block *rx_cb;
>> + u8 idx;
>> +
>> + for (idx = 0; idx < MAX_RX_URBS; idx++) {
>> + rx_cb = >rx_cb[idx];
>> +
>> + rx_cb->rx_buffer = kzalloc(RSI_USB_BUF_SIZE * 2,
>> +GFP_KERNEL | GFP_DMA);
>
> Do you really need GFP_DMA? From the documentation:
>
>  "GFP_DMA exists for historical reasons and should be avoided where
>   possible."

Thanks for review. I will get rid of this flag,

Regards,
Amitkumar


Re: [v5 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2018-01-18 Thread Amitkumar Karwar
Hi Kalle,

On Thu, Dec 14, 2017 at 7:52 PM, Amitkumar Karwar <amitkar...@gmail.com> wrote:
> On Wed, Dec 13, 2017 at 7:16 PM, Marcel Holtmann <mar...@holtmann.org> wrote:
>> Hi Amitkumar,
>>
>>> Redpine bluetooth driver is a thin driver which depends on
>>> 'rsi_91x' driver for transmitting and receiving packets
>>> to/from device. It creates hci interface when attach() is
>>> called from 'rsi_91x' module.
>>>
>>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>>> ---
>>> v5: Addressed review comments from Marcel.
>>>Removed reduntant switch case code from rsi_hci_recv_pkt()
>>>Changed bt_cb(skb)->pkt_type to hci_skb_pkt_type(skb)
>>>Removed reduntant '\n' from BT_ERR and redundant BT_INFO messages
>>>Changed u8 *pkt to const u8 *pkt in rsi_hci_recv_pkt()
>>> v4: Removed rsi_hci.h file. Made the functions static(Marcel)
>>> v3: Made BT_RSI module by default off(Marcel)
>>>Removed redundant exported function rsi_get_hci_ops()(Marcel)
>>> v2: Addressed review comments from Marcel
>>>Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
>>>Removed redundant BT_INFO messages
>>>h_adapter initialization and declaration in a single line.
>>>Removed unnecessary error checks for HCI_RUNNING and fsm_state
>>>Allocated new skb with skb_realloc_headroom() API if headroom is not 
>>> sufficient
>>>Used get_unaligned_le16 helpers
>>>Moved a structure and union from header file to btrsi.c file
>>> ---
>>> drivers/bluetooth/Kconfig  |  11 +++
>>> drivers/bluetooth/Makefile |   2 +
>>> drivers/bluetooth/btrsi.c  | 188 
>>> +
>>> include/linux/rsi_header.h |   4 +-
>>> 4 files changed, 204 insertions(+), 1 deletion(-)
>>> create mode 100644 drivers/bluetooth/btrsi.c
>>>
>>> diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
>>> index 60e1c7d..33d7514 100644
>>> --- a/drivers/bluetooth/Kconfig
>>> +++ b/drivers/bluetooth/Kconfig
>>> @@ -378,4 +378,15 @@ config BT_QCOMSMD
>>> Say Y here to compile support for HCI over Qualcomm SMD into the
>>> kernel or say M to compile as a module.
>>>
>>> +config BT_RSI
>>> + tristate "Redpine HCI support"
>>> + default n
>>> + help
>>> +   Redpine BT driver.
>>> +   This driver handles BT traffic from upper layers and pass
>>> +   to the RSI_91x coex module for further scheduling to device
>>> +
>>> +   Say Y here to compile support for HCI over Redpine into the
>>> +   kernel or say M to compile as a module.
>>> +
>>> endmenu
>>> diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
>>> index 4e4e44d..712af83a 100644
>>> --- a/drivers/bluetooth/Makefile
>>> +++ b/drivers/bluetooth/Makefile
>>> @@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)+= btqca.o
>>>
>>> obj-$(CONFIG_BT_HCIUART_NOKIA)+= hci_nokia.o
>>>
>>> +obj-$(CONFIG_BT_RSI) += btrsi.o
>>> +
>>
>> actually I never caught this before. Since this driver is doing the HCI 
>> portion, for consistency CONFIG_BT_HCIRSI would be better.
>>
>>> btmrvl-y  := btmrvl_main.o
>>> btmrvl-$(CONFIG_DEBUG_FS) += btmrvl_debugfs.o
>>>
>>> diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
>>> new file mode 100644
>>> index 000..c9e92cc
>>> --- /dev/null
>>> +++ b/drivers/bluetooth/btrsi.c
>>> @@ -0,0 +1,188 @@
>>> +/**
>>> + * Copyright (c) 2017 Redpine Signals 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 CONSE

Re: [v5 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2017-12-14 Thread Amitkumar Karwar
On Wed, Dec 13, 2017 at 7:16 PM, Marcel Holtmann <mar...@holtmann.org> wrote:
> Hi Amitkumar,
>
>> Redpine bluetooth driver is a thin driver which depends on
>> 'rsi_91x' driver for transmitting and receiving packets
>> to/from device. It creates hci interface when attach() is
>> called from 'rsi_91x' module.
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>> ---
>> v5: Addressed review comments from Marcel.
>>Removed reduntant switch case code from rsi_hci_recv_pkt()
>>Changed bt_cb(skb)->pkt_type to hci_skb_pkt_type(skb)
>>Removed reduntant '\n' from BT_ERR and redundant BT_INFO messages
>>Changed u8 *pkt to const u8 *pkt in rsi_hci_recv_pkt()
>> v4: Removed rsi_hci.h file. Made the functions static(Marcel)
>> v3: Made BT_RSI module by default off(Marcel)
>>Removed redundant exported function rsi_get_hci_ops()(Marcel)
>> v2: Addressed review comments from Marcel
>>Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
>>Removed redundant BT_INFO messages
>>h_adapter initialization and declaration in a single line.
>>Removed unnecessary error checks for HCI_RUNNING and fsm_state
>>Allocated new skb with skb_realloc_headroom() API if headroom is not 
>> sufficient
>>Used get_unaligned_le16 helpers
>>Moved a structure and union from header file to btrsi.c file
>> ---
>> drivers/bluetooth/Kconfig  |  11 +++
>> drivers/bluetooth/Makefile |   2 +
>> drivers/bluetooth/btrsi.c  | 188 
>> +
>> include/linux/rsi_header.h |   4 +-
>> 4 files changed, 204 insertions(+), 1 deletion(-)
>> create mode 100644 drivers/bluetooth/btrsi.c
>>
>> diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
>> index 60e1c7d..33d7514 100644
>> --- a/drivers/bluetooth/Kconfig
>> +++ b/drivers/bluetooth/Kconfig
>> @@ -378,4 +378,15 @@ config BT_QCOMSMD
>> Say Y here to compile support for HCI over Qualcomm SMD into the
>> kernel or say M to compile as a module.
>>
>> +config BT_RSI
>> + tristate "Redpine HCI support"
>> + default n
>> + help
>> +   Redpine BT driver.
>> +   This driver handles BT traffic from upper layers and pass
>> +   to the RSI_91x coex module for further scheduling to device
>> +
>> +   Say Y here to compile support for HCI over Redpine into the
>> +   kernel or say M to compile as a module.
>> +
>> endmenu
>> diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
>> index 4e4e44d..712af83a 100644
>> --- a/drivers/bluetooth/Makefile
>> +++ b/drivers/bluetooth/Makefile
>> @@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)+= btqca.o
>>
>> obj-$(CONFIG_BT_HCIUART_NOKIA)+= hci_nokia.o
>>
>> +obj-$(CONFIG_BT_RSI) += btrsi.o
>> +
>
> actually I never caught this before. Since this driver is doing the HCI 
> portion, for consistency CONFIG_BT_HCIRSI would be better.
>
>> btmrvl-y  := btmrvl_main.o
>> btmrvl-$(CONFIG_DEBUG_FS) += btmrvl_debugfs.o
>>
>> diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
>> new file mode 100644
>> index 000..c9e92cc
>> --- /dev/null
>> +++ b/drivers/bluetooth/btrsi.c
>> @@ -0,0 +1,188 @@
>> +/**
>> + * Copyright (c) 2017 Redpine Signals 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.
>> + */
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +
>> +#def

Re: [v4 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2017-12-13 Thread Amitkumar Karwar
On Thu, Dec 7, 2017 at 2:39 PM, Marcel Holtmann <mar...@holtmann.org> wrote:
> Hi Amitkumar,
>
>> Redpine bluetooth driver is a thin driver which depends on
>> 'rsi_91x' driver for transmitting and receiving packets
>> to/from device. It creates hci interface when attach() is
>> called from 'rsi_91x' module.
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>> ---
>> v4: Removed rsi_hci.h file. Made the functions static(Marcel)
>> v3: Made BT_RSI module by default off(Marcel)
>>Removed redundant exported function rsi_get_hci_ops()(Marcel)
>> v2: Addressed review comments from Marcel
>>Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
>>Removed redundant BT_INFO messages
>>h_adapter initialization and declaration in a single line.
>>Removed unnecessary error checks for HCI_RUNNING and fsm_state
>>Allocated new skb with skb_realloc_headroom() API if headroom is not 
>> sufficient
>>Used get_unaligned_le16 helpers
>>Moved a structure and union from header file to btrsi.c file
>> ---
>> drivers/bluetooth/Kconfig  |  11 +++
>> drivers/bluetooth/Makefile |   2 +
>> drivers/bluetooth/btrsi.c  | 224 
>> +
>> include/linux/rsi_header.h |   2 +
>> 4 files changed, 239 insertions(+)
>> create mode 100644 drivers/bluetooth/btrsi.c
>>
>> diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
>> index 60e1c7d..33d7514 100644
>> --- a/drivers/bluetooth/Kconfig
>> +++ b/drivers/bluetooth/Kconfig
>> @@ -378,4 +378,15 @@ config BT_QCOMSMD
>> Say Y here to compile support for HCI over Qualcomm SMD into the
>> kernel or say M to compile as a module.
>>
>> +config BT_RSI
>> + tristate "Redpine HCI support"
>> + default n
>> + help
>> +   Redpine BT driver.
>> +   This driver handles BT traffic from upper layers and pass
>> +   to the RSI_91x coex module for further scheduling to device
>> +
>> +   Say Y here to compile support for HCI over Redpine into the
>> +   kernel or say M to compile as a module.
>> +
>> endmenu
>> diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
>> index 4e4e44d..712af83a 100644
>> --- a/drivers/bluetooth/Makefile
>> +++ b/drivers/bluetooth/Makefile
>> @@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)+= btqca.o
>>
>> obj-$(CONFIG_BT_HCIUART_NOKIA)+= hci_nokia.o
>>
>> +obj-$(CONFIG_BT_RSI) += btrsi.o
>> +
>> btmrvl-y  := btmrvl_main.o
>> btmrvl-$(CONFIG_DEBUG_FS) += btmrvl_debugfs.o
>>
>> diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
>> new file mode 100644
>> index 000..f76ae4d
>> --- /dev/null
>> +++ b/drivers/bluetooth/btrsi.c
>> @@ -0,0 +1,224 @@
>> +/**
>> + * Copyright (c) 2017 Redpine Signals 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.
>> + */
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>> +
>> +/* RX frame types */
>> +#define RSI_RESULT_CONFIRM   0x80
>> +#define RSI_BT_PER   0x10
>> +#define RSI_BT_BER   0x11
>> +#define RSI_BT_CW0x12
>> +
>> +#define RSI_HEADROOM_FOR_BT_HAL  16
>> +#define RSI_FRAME_DESC_SIZE  16
>> +
>> +static struct rsi_hci_adapter {
>> + void *priv;
>> + struct rsi_proto_ops *proto_ops;
>> +

[v5 3/8] rsi: add header file rsi_header

2017-12-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

The common parameters used by wlan and bt modules are added
to a new header file "rsi_header.h" defined in '/include/linux'

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_main.h | 12 ++--
 include/linux/rsi_header.h  | 34 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
 create mode 100644 include/linux/rsi_header.h

diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..ca02a4b 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char 
*fmt, ...);
 #define MGMT_HW_Q  10
 #define BEACON_HW_Q11
 
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
 #define IEEE80211_MGMT_FRAME0x00
 #define IEEE80211_CTL_FRAME 0x04
 
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
 };
 
-enum host_intf {
-   RSI_HOST_INTF_SDIO = 0,
-   RSI_HOST_INTF_USB
-};
-
 struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
 
-   enum host_intf rsi_host_intf;
+   enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
diff --git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
new file mode 100644
index 000..16a447b
--- /dev/null
+++ b/include/linux/rsi_header.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q   0x2
+#define RSI_WLAN_Q  0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q  0x6
+#define RSI_BT_DATA_Q  0x7
+
+enum rsi_host_intf {
+   RSI_HOST_INTF_SDIO = 0,
+   RSI_HOST_INTF_USB
+};
+
+#endif
-- 
2.7.4



[v5 8/8] rsi: sdio changes to support BT

2017-12-13 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 26abe51..83652bd 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



[v5 0/8] rsi: add bluetooth and coex support

2017-12-13 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.

Changes in v5: 5/8 is modified
Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

Prameela Rani Garnepudi (6):
  rsi: add rx control block to handle rx packets in USB
  rsi: add header file rsi_header
  rsi: add coex support
  Bluetooth: btrsi: add new rsi bluetooth driver
  rsi: add module parameter operating mode
  rsi: sdio changes to support BT

Siva Rebbagondla (2):
  rsi: add bluetooth rx endpoint
  rsi: handle BT traffic in driver

 drivers/bluetooth/Kconfig   |  11 ++
 drivers/bluetooth/Makefile  |   2 +
 drivers/bluetooth/btrsi.c   | 188 
 drivers/net/wireless/rsi/Kconfig|   2 +-
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 184 +++
 drivers/net/wireless/rsi/rsi_91x_core.c |  16 ++-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  56 +++--
 drivers/net/wireless/rsi/rsi_91x_main.c | 110 +++-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |  13 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |   5 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 124 +-
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  35 --
 drivers/net/wireless/rsi/rsi_coex.h |  38 ++
 drivers/net/wireless/rsi/rsi_common.h   |   5 +-
 drivers/net/wireless/rsi/rsi_hal.h  |  21 
 drivers/net/wireless/rsi/rsi_main.h |  20 +--
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 drivers/net/wireless/rsi/rsi_usb.h  |  16 ++-
 include/linux/rsi_header.h  |  56 +
 21 files changed, 825 insertions(+), 83 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
 create mode 100644 include/linux/rsi_header.h

-- 
2.7.4



[v4 8/8] rsi: sdio changes to support BT

2017-12-06 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 26abe51..83652bd 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



[v4 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2017-12-06 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Redpine bluetooth driver is a thin driver which depends on
'rsi_91x' driver for transmitting and receiving packets
to/from device. It creates hci interface when attach() is
called from 'rsi_91x' module.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v4: Removed rsi_hci.h file. Made the functions static(Marcel)
v3: Made BT_RSI module by default off(Marcel)
Removed redundant exported function rsi_get_hci_ops()(Marcel)
v2: Addressed review comments from Marcel
Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
Removed redundant BT_INFO messages
h_adapter initialization and declaration in a single line.
Removed unnecessary error checks for HCI_RUNNING and fsm_state
Allocated new skb with skb_realloc_headroom() API if headroom is not 
sufficient
Used get_unaligned_le16 helpers
Moved a structure and union from header file to btrsi.c file
---
 drivers/bluetooth/Kconfig  |  11 +++
 drivers/bluetooth/Makefile |   2 +
 drivers/bluetooth/btrsi.c  | 224 +
 include/linux/rsi_header.h |   2 +
 4 files changed, 239 insertions(+)
 create mode 100644 drivers/bluetooth/btrsi.c

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 60e1c7d..33d7514 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -378,4 +378,15 @@ config BT_QCOMSMD
  Say Y here to compile support for HCI over Qualcomm SMD into the
  kernel or say M to compile as a module.
 
+config BT_RSI
+   tristate "Redpine HCI support"
+   default n
+   help
+ Redpine BT driver.
+ This driver handles BT traffic from upper layers and pass
+ to the RSI_91x coex module for further scheduling to device
+
+ Say Y here to compile support for HCI over Redpine into the
+ kernel or say M to compile as a module.
+
 endmenu
diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
index 4e4e44d..712af83a 100644
--- a/drivers/bluetooth/Makefile
+++ b/drivers/bluetooth/Makefile
@@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)  += btqca.o
 
 obj-$(CONFIG_BT_HCIUART_NOKIA) += hci_nokia.o
 
+obj-$(CONFIG_BT_RSI)   += btrsi.o
+
 btmrvl-y   := btmrvl_main.o
 btmrvl-$(CONFIG_DEBUG_FS)  += btmrvl_debugfs.o
 
diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
new file mode 100644
index 000..f76ae4d
--- /dev/null
+++ b/drivers/bluetooth/btrsi.c
@@ -0,0 +1,224 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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.
+ */
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/* RX frame types */
+#define RSI_RESULT_CONFIRM 0x80
+#define RSI_BT_PER 0x10
+#define RSI_BT_BER 0x11
+#define RSI_BT_CW  0x12
+
+#define RSI_HEADROOM_FOR_BT_HAL16
+#define RSI_FRAME_DESC_SIZE16
+
+static struct rsi_hci_adapter {
+   void *priv;
+   struct rsi_proto_ops *proto_ops;
+   struct hci_dev *hdev;
+};
+
+static int rsi_hci_open(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_close(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_flush(struct hci_dev *hdev)
+{
+   return 0;
+}
+
+static int rsi_hci_send_pkt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+   struct rsi_hci_adapter *h_adapter = hci_get_drvdata(hdev);
+   struct sk_buff *new_skb = NULL;
+
+   switch (bt_cb(skb)->pkt_type) {
+   case HCI_COMMAND_PKT:
+   hdev->stat.cmd_tx++;
+   break;
+
+   case HCI_ACLDATA_PKT:
+   hdev->stat.acl_tx++;
+   break;
+
+   case HCI_SCODATA_PKT:
+   hdev->stat.sco_tx++;
+   break;
+   }
+
+   if (skb_headroom(skb) < RSI_HEADROOM_FOR_BT_HAL) {
+   /* Insufficient skb headroom - allocate a new skb */
+   new_skb = skb_realloc_h

[v4 3/8] rsi: add header file rsi_header

2017-12-06 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

The common parameters used by wlan and bt modules are added
to a new header file "rsi_header.h" defined in '/include/linux'

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_main.h | 12 ++--
 include/linux/rsi_header.h  | 34 ++
 2 files changed, 36 insertions(+), 10 deletions(-)
 create mode 100644 include/linux/rsi_header.h

diff --git a/drivers/net/wireless/rsi/rsi_main.h 
b/drivers/net/wireless/rsi/rsi_main.h
index ee469dc..ca02a4b 100644
--- a/drivers/net/wireless/rsi/rsi_main.h
+++ b/drivers/net/wireless/rsi/rsi_main.h
@@ -20,6 +20,7 @@
 #include 
 #include 
 #include 
+#include 
 
 struct rsi_sta {
struct ieee80211_sta *sta;
@@ -85,10 +86,6 @@ extern __printf(2, 3) void rsi_dbg(u32 zone, const char 
*fmt, ...);
 #define MGMT_HW_Q  10
 #define BEACON_HW_Q11
 
-/* Queue information */
-#define RSI_COEX_Q 0x0
-#define RSI_WIFI_MGMT_Q 0x4
-#define RSI_WIFI_DATA_Q 0x5
 #define IEEE80211_MGMT_FRAME0x00
 #define IEEE80211_CTL_FRAME 0x04
 
@@ -293,11 +290,6 @@ struct rsi_common {
struct ieee80211_vif *roc_vif;
 };
 
-enum host_intf {
-   RSI_HOST_INTF_SDIO = 0,
-   RSI_HOST_INTF_USB
-};
-
 struct eepromrw_info {
u32 offset;
u32 length;
@@ -322,7 +314,7 @@ struct rsi_hw {
struct device *device;
u8 sc_nvifs;
 
-   enum host_intf rsi_host_intf;
+   enum rsi_host_intf rsi_host_intf;
u16 block_size;
enum ps_state ps_state;
struct rsi_ps_info ps_info;
diff --git a/include/linux/rsi_header.h b/include/linux/rsi_header.h
new file mode 100644
index 000..16a447b
--- /dev/null
+++ b/include/linux/rsi_header.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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 __RSI_HEADER_H__
+#define __RSI_HEADER_H__
+
+/* HAL queue information */
+#define RSI_COEX_Q 0x0
+#define RSI_BT_Q   0x2
+#define RSI_WLAN_Q  0x3
+#define RSI_WIFI_MGMT_Q 0x4
+#define RSI_WIFI_DATA_Q 0x5
+#define RSI_BT_MGMT_Q  0x6
+#define RSI_BT_DATA_Q  0x7
+
+enum rsi_host_intf {
+   RSI_HOST_INTF_SDIO = 0,
+   RSI_HOST_INTF_USB
+};
+
+#endif
-- 
2.7.4



[v4 7/8] rsi: add module parameter operating mode

2017-12-06 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Operating mode determines the support for other protocols.
This is made as module parameter for better usage.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_main.c | 57 -
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 10 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 10 +-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_hal.h  | 11 +++
 5 files changed, 79 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 375b725..4a0f5a18 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -68,8 +68,24 @@ EXPORT_SYMBOL_GPL(rsi_dbg);
 static char *opmode_str(int oper_mode)
 {
switch (oper_mode) {
-   case RSI_DEV_OPMODE_WIFI_ALONE:
+   case DEV_OPMODE_WIFI_ALONE:
return "Wi-Fi alone";
+   case DEV_OPMODE_BT_ALONE:
+   return "BT EDR alone";
+   case DEV_OPMODE_BT_LE_ALONE:
+   return "BT LE alone";
+   case DEV_OPMODE_BT_DUAL:
+   return "BT Dual";
+   case DEV_OPMODE_STA_BT:
+   return "Wi-Fi STA + BT EDR";
+   case DEV_OPMODE_STA_BT_LE:
+   return "Wi-Fi STA + BT LE";
+   case DEV_OPMODE_STA_BT_DUAL:
+   return "Wi-Fi STA + BT DUAL";
+   case DEV_OPMODE_AP_BT:
+   return "Wi-Fi AP + BT EDR";
+   case DEV_OPMODE_AP_BT_DUAL:
+   return "Wi-Fi AP + BT DUAL";
}
 
return "Unknown";
@@ -267,7 +283,7 @@ void rsi_set_bt_context(void *priv, void *bt_context)
  *
  * Return: Pointer to the adapter structure on success, NULL on failure .
  */
-struct rsi_hw *rsi_91x_init(void)
+struct rsi_hw *rsi_91x_init(u16 oper_mode)
 {
struct rsi_hw *adapter = NULL;
struct rsi_common *common = NULL;
@@ -309,11 +325,34 @@ struct rsi_hw *rsi_91x_init(void)
spin_lock_init(>ps_lock);
timer_setup(>roc_timer, rsi_roc_timeout, 0);
init_completion(>wlan_init_completion);
+   common->oper_mode = oper_mode;
common->init_done = true;
-
-   common->coex_mode = RSI_DEV_COEX_MODE_WIFI_ALONE;
-   common->oper_mode = RSI_DEV_OPMODE_WIFI_ALONE;
adapter->device_model = RSI_DEV_9113;
+
+   /* Determine coex mode */
+   switch (common->oper_mode) {
+   case DEV_OPMODE_STA_BT_DUAL:
+   case DEV_OPMODE_STA_BT:
+   case DEV_OPMODE_STA_BT_LE:
+   case DEV_OPMODE_BT_ALONE:
+   case DEV_OPMODE_BT_LE_ALONE:
+   case DEV_OPMODE_BT_DUAL:
+   common->coex_mode = 2;
+   break;
+   case DEV_OPMODE_AP_BT_DUAL:
+   case DEV_OPMODE_AP_BT:
+   common->coex_mode = 4;
+   break;
+   case DEV_OPMODE_WIFI_ALONE:
+   common->coex_mode = 1;
+   break;
+   default:
+   common->oper_mode = 1;
+   common->coex_mode = 1;
+   }
+   rsi_dbg(INFO_ZONE, "%s: oper_mode = %d, coex_mode = %d\n",
+   __func__, common->oper_mode, common->coex_mode);
+
if (common->coex_mode > 1) {
if (rsi_coex_attach(common)) {
rsi_dbg(ERR_ZONE, "Failed to init coex module\n");
@@ -348,10 +387,12 @@ void rsi_91x_deinit(struct rsi_hw *adapter)
for (ii = 0; ii < NUM_SOFT_QUEUES; ii++)
skb_queue_purge(>tx_queue[ii]);
 
-   common->init_done = false;
-
-   if (common->coex_mode > 1)
+   if (common->coex_mode > 1) {
rsi_coex_detach(common);
+   rsi_bt_ops.detach(common->bt_adapter);
+   }
+
+   common->init_done = false;
 
kfree(common);
kfree(adapter->rsi_dev);
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index ba38c6d..5722736 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -21,6 +21,14 @@
 #include "rsi_coex.h"
 #include "rsi_hal.h"
 
+/* Default operating mode is wlan STA + BT */
+static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
+module_param(dev_oper_mode, ushort, 0444);
+MODULE_PARM_DESC(dev_oper_mode,
+"1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
+"9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
+"6[AP + BT classic], 14[AP + BT classic + BT LE]");
+
 /**
  * rsi_sdio_set_cmd52_ar

[v4 0/8] rsi: add bluetooth and coex support

2017-12-06 Thread Amitkumar Karwar
From: Amitkumar Karwar <amit.kar...@redpinesignals.com>

This patch series adds new bluetooth driver and coex enhancments
in existing wlan driver for RSI chipsets.
As per our architecture, both wlan and bluetooth drivers talk
over same SDIO interface to device. Separate endpoint will be
used in case of USB interface.

Changes in v4: 5/8 is modified
Changes in v3: 4/8, 5/8 and 6/8 patches are modified
Changes in v2: 2/8, 5/8 and 6/8 patches are modified

Prameela Rani Garnepudi (6):
  rsi: add rx control block to handle rx packets in USB
  rsi: add header file rsi_header
  rsi: add coex support
  Bluetooth: btrsi: add new rsi bluetooth driver
  rsi: add module parameter operating mode
  rsi: sdio changes to support BT

Siva Rebbagondla (2):
  rsi: add bluetooth rx endpoint
  rsi: handle BT traffic in driver

 drivers/bluetooth/Kconfig   |  11 ++
 drivers/bluetooth/Makefile  |   2 +
 drivers/bluetooth/btrsi.c   | 224 
 drivers/net/wireless/rsi/Kconfig|   2 +-
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 184 +++
 drivers/net/wireless/rsi/rsi_91x_core.c |  16 +-
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  56 ++-
 drivers/net/wireless/rsi/rsi_91x_main.c | 110 +-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |  13 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |   5 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 124 +++
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  |  35 +++--
 drivers/net/wireless/rsi/rsi_coex.h |  38 +
 drivers/net/wireless/rsi/rsi_common.h   |   5 +-
 drivers/net/wireless/rsi/rsi_hal.h  |  21 +++
 drivers/net/wireless/rsi/rsi_main.h |  20 +--
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 drivers/net/wireless/rsi/rsi_usb.h  |  16 +-
 include/linux/rsi_header.h  |  56 +++
 21 files changed, 861 insertions(+), 83 deletions(-)
 create mode 100644 drivers/bluetooth/btrsi.c
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h
 create mode 100644 include/linux/rsi_header.h

-- 
2.7.4



[v4 6/8] rsi: handle BT traffic in driver

2017-12-06 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

BT frames are passed through coex and hal modules to BUS.
After firmware is loaded, based on the operating mode CARD
READY frame comes for each protocol. When BT card ready is
received, BT attach is called.
Protocol operations are exchanged between the modules
at initialization time.

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v3: bt_ops need not be present structure g_proto_ops. It is removed.
v2: WLAN module depends on BT module. Updated in Kconfig
---
 drivers/net/wireless/rsi/Kconfig|  2 +-
 drivers/net/wireless/rsi/rsi_91x_coex.c |  4 ++-
 drivers/net/wireless/rsi/rsi_91x_core.c | 16 
 drivers/net/wireless/rsi/rsi_91x_hal.c  | 39 +
 drivers/net/wireless/rsi/rsi_91x_main.c | 31 +++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  1 +
 drivers/net/wireless/rsi/rsi_common.h   |  1 +
 drivers/net/wireless/rsi/rsi_hal.h  | 10 
 drivers/net/wireless/rsi/rsi_main.h |  3 +++
 9 files changed, 100 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/rsi/Kconfig b/drivers/net/wireless/rsi/Kconfig
index 7c5e4ca..ad72c80 100644
--- a/drivers/net/wireless/rsi/Kconfig
+++ b/drivers/net/wireless/rsi/Kconfig
@@ -13,7 +13,7 @@ if WLAN_VENDOR_RSI
 
 config RSI_91X
tristate "Redpine Signals Inc 91x WLAN driver support"
-   depends on MAC80211
+   depends on MAC80211 && BT_RSI
---help---
  This option enabes support for RSI 1x1 devices.
  Select M (recommended), if you have a RSI 1x1 wireless module.
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
index 914a0c5..f502cf9 100644
--- a/drivers/net/wireless/rsi/rsi_91x_coex.c
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -48,8 +48,10 @@ static void rsi_coex_sched_tx_pkts(struct 
rsi_coex_ctrl_block *coex_cb)
break;
}
 
-   if (coex_q == RSI_COEX_Q_BT)
+   if (coex_q == RSI_COEX_Q_BT) {
skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+   rsi_send_bt_pkt(coex_cb->priv, skb);
+   }
}
 }
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c 
b/drivers/net/wireless/rsi/rsi_91x_core.c
index d0d2201..046ace8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -17,6 +17,7 @@
 #include "rsi_mgmt.h"
 #include "rsi_common.h"
 #include "rsi_hal.h"
+#include "rsi_coex.h"
 
 /**
  * rsi_determine_min_weight_queue() - This function determines the queue with
@@ -301,14 +302,19 @@ void rsi_core_qos_processor(struct rsi_common *common)
mutex_unlock(>tx_lock);
break;
}
-
-   if (q_num == MGMT_SOFT_Q) {
-   status = rsi_send_mgmt_pkt(common, skb);
-   } else if (q_num == MGMT_BEACON_Q) {
+   if (q_num == MGMT_BEACON_Q) {
status = rsi_send_pkt_to_bus(common, skb);
dev_kfree_skb(skb);
} else {
-   status = rsi_send_data_pkt(common, skb);
+   if (common->coex_mode > 1) {
+   status = rsi_coex_send_pkt(common, skb,
+  RSI_WLAN_Q);
+   } else {
+   if (q_num == MGMT_SOFT_Q)
+   status = rsi_send_mgmt_pkt(common, skb);
+   else
+   status = rsi_send_data_pkt(common, skb);
+   }
}
 
if (status) {
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 8b30448..883dba1 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -15,6 +15,7 @@
  */
 
 #include 
+#include 
 #include "rsi_mgmt.h"
 #include "rsi_hal.h"
 #include "rsi_sdio.h"
@@ -24,6 +25,7 @@
 static struct ta_metadata metadata_flash_content[] = {
{"flash_content", 0x0001},
{"rsi/rs9113_wlan_qspi.rps", 0x0001},
+   {"rsi/rs9113_wlan_bt_dual_mode.rps", 0x0001},
 };
 
 int rsi_send_pkt_to_bus(struct rsi_common *common, struct sk_buff *skb)
@@ -357,6 +359,43 @@ int rsi_send_mgmt_pkt(struct rsi_common *common,
return status;
 }
 
+int rsi_send_bt_pkt(struct rsi_common *common, struct sk_buff *skb)
+{
+   int status = -EINVAL;
+   u8 header_size

[v4 4/8] rsi: add coex support

2017-12-06 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

With BT support, driver has to handle two streams of data
(i.e. wlan and BT). Actual coex implementation is in firmware.
Coex module just schedule the packets to firmware by taking them
from the corresponding paths.

Structures for module and protocol operations are introduced for
this purpose. Protocol operations structure is global structure
which can be shared among different modules. Initialization of
coex and operating mode values is moved to rsi_91x_init().

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/Makefile   |   1 +
 drivers/net/wireless/rsi/rsi_91x_coex.c | 182 
 drivers/net/wireless/rsi/rsi_91x_hal.c  |  17 +--
 drivers/net/wireless/rsi/rsi_91x_main.c |  30 +-
 drivers/net/wireless/rsi/rsi_91x_mgmt.c |   2 +-
 drivers/net/wireless/rsi/rsi_91x_sdio.c |   1 +
 drivers/net/wireless/rsi/rsi_91x_usb.c  |   2 +
 drivers/net/wireless/rsi/rsi_coex.h |  38 +++
 drivers/net/wireless/rsi/rsi_main.h |   5 +
 drivers/net/wireless/rsi/rsi_mgmt.h |   3 +
 include/linux/rsi_header.h  |  20 
 11 files changed, 291 insertions(+), 10 deletions(-)
 create mode 100644 drivers/net/wireless/rsi/rsi_91x_coex.c
 create mode 100644 drivers/net/wireless/rsi/rsi_coex.h

diff --git a/drivers/net/wireless/rsi/Makefile 
b/drivers/net/wireless/rsi/Makefile
index 47c4590..fda827b 100644
--- a/drivers/net/wireless/rsi/Makefile
+++ b/drivers/net/wireless/rsi/Makefile
@@ -5,6 +5,7 @@ rsi_91x-y   += rsi_91x_mac80211.o
 rsi_91x-y  += rsi_91x_mgmt.o
 rsi_91x-y  += rsi_91x_hal.o
 rsi_91x-y  += rsi_91x_ps.o
+rsi_91x-y  += rsi_91x_coex.o
 rsi_91x-$(CONFIG_RSI_DEBUGFS)  += rsi_91x_debugfs.o
 
 rsi_usb-y  += rsi_91x_usb.o rsi_91x_usb_ops.o
diff --git a/drivers/net/wireless/rsi/rsi_91x_coex.c 
b/drivers/net/wireless/rsi/rsi_91x_coex.c
new file mode 100644
index 000..914a0c5
--- /dev/null
+++ b/drivers/net/wireless/rsi/rsi_91x_coex.c
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2017 Redpine Signals 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.
+ */
+
+#include "rsi_main.h"
+#include "rsi_coex.h"
+#include "rsi_mgmt.h"
+#include "rsi_hal.h"
+
+static enum rsi_coex_queues rsi_coex_determine_coex_q
+   (struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues q_num = RSI_COEX_Q_INVALID;
+
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_COMMON]) > 0)
+   q_num = RSI_COEX_Q_COMMON;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_BT]) > 0)
+   q_num = RSI_COEX_Q_BT;
+   if (skb_queue_len(_cb->coex_tx_qs[RSI_COEX_Q_WLAN]) > 0)
+   q_num = RSI_COEX_Q_WLAN;
+
+   return q_num;
+}
+
+static void rsi_coex_sched_tx_pkts(struct rsi_coex_ctrl_block *coex_cb)
+{
+   enum rsi_coex_queues coex_q;
+   struct sk_buff *skb;
+
+   while (1) {
+   coex_q = rsi_coex_determine_coex_q(coex_cb);
+   rsi_dbg(INFO_ZONE, "queue = %d\n", coex_q);
+
+   if (coex_q == RSI_COEX_Q_INVALID) {
+   rsi_dbg(DATA_TX_ZONE, "No more pkt\n");
+   break;
+   }
+
+   if (coex_q == RSI_COEX_Q_BT)
+   skb = skb_dequeue(_cb->coex_tx_qs[RSI_COEX_Q_BT]);
+   }
+}
+
+static void rsi_coex_scheduler_thread(struct rsi_common *common)
+{
+   struct rsi_coex_ctrl_block *coex_cb =
+   (struct rsi_coex_ctrl_block *)common->coex_cb;
+   u32 timeout = EVENT_WAIT_FOREVER;
+
+   do {
+   rsi_wait_event(_cb->coex_tx_thread.event, timeout);
+   rsi_reset_event(_cb->coex_tx_thread.event);
+
+   rsi_coex_sched_tx_pkts(coex_cb);
+   } while (atomic_read(_cb->coex_tx_thread.thread_done) == 0);
+
+   complete_and_exit(_cb->coex_tx_thread.completion, 0);
+}
+
+int rsi_coex_

[v4 2/8] rsi: add bluetooth rx endpoint

2017-12-06 Thread Amitkumar Karwar
From: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>

USB endpoint 1 is used for WLAN which is presently in use.
USB endpoint 2 is introduced for BT Rx traffic. Enumeration
of Rx BT endpoint and submitting Rx BT URB are added.

>From /sys/kernel/debug/usb/devices,
Ad=81(I) is for WLAN EP IN and Ad=01(O) is for Wlan EP OUT.
Ad=82(I) is for BT EP IN and Ad=02(O) is for BT EP OUT.

T:  Bus=01 Lev=01 Prnt=01 Port=09 Cnt=03 Dev#=  4 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1618 ProdID=9113 Rev= 0.02
S:  Manufacturer=Redpine Signals, Inc.
S:  Product=Wireless USB Network Module
S:  SerialNumber=0001
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=  2mA
I:* If#= 0 Alt= 0 #EPs= 6 Cls=00(>ifc ) Sub=00 Prot=00 Driver=(none)
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
v3: Same as v2
v2: Included '/sys/kernel/debug/usb/devices' info in patch description(Marcel)
---
 drivers/net/wireless/rsi/rsi_91x_usb.c | 37 --
 drivers/net/wireless/rsi/rsi_usb.h |  6 +++---
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 147fcee2..b212a15 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -103,41 +103,42 @@ static int rsi_find_bulk_in_and_out_endpoints(struct 
usb_interface *interface,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
__le16 buffer_size;
-   int ii, bep_found = 0;
+   int ii, bin_found = 0, bout_found = 0;
 
iface_desc = &(interface->altsetting[0]);
 
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
endpoint = &(iface_desc->endpoint[ii].desc);
 
-   if ((!(dev->bulkin_endpoint_addr)) &&
+   if (!dev->bulkin_endpoint_addr[bin_found] &&
(endpoint->bEndpointAddress & USB_DIR_IN) &&
-   ((endpoint->bmAttributes &
-   USB_ENDPOINT_XFERTYPE_MASK) ==
+   ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
USB_ENDPOINT_XFER_BULK)) {
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkin_size = buffer_size;
-   dev->bulkin_endpoint_addr =
+   dev->bulkin_size[bin_found] = buffer_size;
+   dev->bulkin_endpoint_addr[bin_found] =
endpoint->bEndpointAddress;
+   bin_found++;
}
 
-   if (!dev->bulkout_endpoint_addr[bep_found] &&
+   if (!dev->bulkout_endpoint_addr[bout_found] &&
!(endpoint->bEndpointAddress & USB_DIR_IN) &&
((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
-   dev->bulkout_endpoint_addr[bep_found] =
+   USB_ENDPOINT_XFER_BULK)) {
+   buffer_size = endpoint->wMaxPacketSize;
+   dev->bulkout_endpoint_addr[bout_found] =
endpoint->bEndpointAddress;
buffer_size = endpoint->wMaxPacketSize;
-   dev->bulkout_size[bep_found] = buffer_size;
-   bep_found++;
+   dev->bulkout_size[bout_found] = buffer_size;
+   bout_found++;
}
 
-   if (bep_found >= MAX_BULK_EP)
+   if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
break;
}
 
-   if (!(dev->bulkin_endpoint_addr) &&
-   (dev->bulkout_endpoint_addr[0]))
+   if (!(dev->bulkin_endpoint_addr[0]) &&
+   dev->bulkout_endpoint_addr[0])
return -EINVAL;
 
return 0;
@@ -273,7 +274,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 
ep_num)
usb_fill_bulk_urb(urb,
  dev->usbdev,
  usb_rcvbulkpipe(dev->usbdev,
-   dev->bulkin_endpoint_addr),
+ dev->bulkin_endpoint_addr[ep_num - 1]),
  urb->transfer_buffer,

[v4 1/8] rsi: add rx control block to handle rx packets in USB

2017-12-06 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Rx bluetooth endpoint shall be added in further patches. Rx control
block is introduced here to handle Rx packets properly. Separate
function is written to initialize the RX control blocks.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_main.c |  4 +-
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c |  2 +-
 drivers/net/wireless/rsi/rsi_91x_usb.c  | 75 +++--
 drivers/net/wireless/rsi/rsi_91x_usb_ops.c  | 35 +-
 drivers/net/wireless/rsi/rsi_common.h   |  2 +-
 drivers/net/wireless/rsi/rsi_main.h |  2 +-
 drivers/net/wireless/rsi/rsi_usb.h  | 10 +++-
 7 files changed, 96 insertions(+), 34 deletions(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_main.c 
b/drivers/net/wireless/rsi/rsi_91x_main.c
index 0cb8e68..0413af8 100644
--- a/drivers/net/wireless/rsi/rsi_91x_main.c
+++ b/drivers/net/wireless/rsi/rsi_91x_main.c
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common 
*common,
  *
  * Return: 0 on success, -1 on failure.
  */
-int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
+int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
 {
u8 *frame_desc = NULL, extended_desc = 0;
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
 
index = 0;
do {
-   frame_desc = >rx_data_pkt[index];
+   frame_desc = _pkt[index];
actual_length = *(u16 *)_desc[0];
offset = *(u16 *)_desc[2];
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 8e2a95c..9fbc0ef 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
goto fail;
}
 
-   status = rsi_read_pkt(common, rcv_pkt_len);
+   status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
 
 fail:
kfree(common->rx_data_pkt);
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
index 0873022..147fcee2 100644
--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
+++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
  */
 static void rsi_rx_done_handler(struct urb *urb)
 {
-   struct rsi_hw *adapter = urb->context;
-   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb = urb->context;
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
 
if (urb->status)
return;
 
+   rx_cb->pend = 1;
rsi_set_event(>rx_thread.event);
 }
 
@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
  *
  * Return: 0 on success, a negative error code on failure.
  */
-static int rsi_rx_urb_submit(struct rsi_hw *adapter)
+static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
 {
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
-   struct urb *urb = dev->rx_usb_urb[0];
+   struct rx_usb_ctrl_block *rx_cb = >rx_cb[ep_num - 1];
+   struct urb *urb = rx_cb->rx_urb;
int status;
 
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
  urb->transfer_buffer,
  3000,
  rsi_rx_done_handler,
- adapter);
+ rx_cb);
 
status = usb_submit_urb(urb, GFP_KERNEL);
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
  */
 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
 {
+   u8 idx;
+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
 
rsi_kill_thread(>rx_thread);
-   usb_free_urb(dev->rx_usb_urb[0]);
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   usb_free_urb(dev->rx_cb[idx].rx_urb);
+   kfree(dev->rx_cb[idx].rx_buffer);
+   }
+
kfree(adapter->priv->rx_data_pkt);
kfree(dev->tx_buffer);
 }
 
+static int rsi_usb_init_rx(struct rsi_hw *adapter)
+{
+   struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
+   struct rx_usb_ctrl_block *rx_cb;
+   u8 idx;
+
+   for (idx = 0; idx < MAX_RX_URBS; idx++) {
+   rx_cb = >rx_cb[idx];
+
+   rx_cb->rx_buffer = kzalloc(RSI_USB_BUF_SIZE * 2,
+

Re: [v3 5/8] Bluetooth: btrsi: add new rsi bluetooth driver

2017-12-06 Thread Amitkumar Karwar
On Fri, Dec 1, 2017 at 4:24 PM, Marcel Holtmann <mar...@holtmann.org> wrote:
> Hi Amitkumar,
>
>> Redpine bluetooth driver is a thin driver which depends on
>> 'rsi_91x' driver for transmitting and receiving packets
>> to/from device. It creates hci interface when attach() is
>> called from 'rsi_91x' module.
>>
>> Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
>> Signed-off-by: Siva Rebbagondla <siva.rebbagon...@redpinesignals.com>
>> Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
>> ---
>> v3: Made BT_RSI module by default off(Marcel)
>>Removed redundant exported function rsi_get_hci_ops()(Marcel)
>> v2: Addressed review comments from Marcel
>>Removed unnecessary 'depends on BT && BT_RFOMM' line in Kconfig
>>Removed redundant BT_INFO messages
>>h_adapter initialization and declaration in a single line.
>>Removed unnecessary error checks for HCI_RUNNING and fsm_state
>>Allocated new skb with skb_realloc_headroom() API if headroom is not 
>> sufficient
>>Used get_unaligned_le16 helpers
>>Moved a structure and union from header file to btrsi.c file
>> ---
>> drivers/bluetooth/Kconfig   |  11 +++
>> drivers/bluetooth/Makefile  |   2 +
>> drivers/bluetooth/btrsi.c   | 211 
>> 
>> drivers/bluetooth/rsi_hci.h |  40 +
>> include/linux/rsi_header.h  |   2 +
>> 5 files changed, 266 insertions(+)
>> create mode 100644 drivers/bluetooth/btrsi.c
>> create mode 100644 drivers/bluetooth/rsi_hci.h
>>
>> diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
>> index 60e1c7d..33d7514 100644
>> --- a/drivers/bluetooth/Kconfig
>> +++ b/drivers/bluetooth/Kconfig
>> @@ -378,4 +378,15 @@ config BT_QCOMSMD
>> Say Y here to compile support for HCI over Qualcomm SMD into the
>> kernel or say M to compile as a module.
>>
>> +config BT_RSI
>> + tristate "Redpine HCI support"
>> + default n
>> + help
>> +   Redpine BT driver.
>> +   This driver handles BT traffic from upper layers and pass
>> +   to the RSI_91x coex module for further scheduling to device
>> +
>> +   Say Y here to compile support for HCI over Redpine into the
>> +   kernel or say M to compile as a module.
>> +
>> endmenu
>> diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile
>> index 4e4e44d..712af83a 100644
>> --- a/drivers/bluetooth/Makefile
>> +++ b/drivers/bluetooth/Makefile
>> @@ -28,6 +28,8 @@ obj-$(CONFIG_BT_QCA)+= btqca.o
>>
>> obj-$(CONFIG_BT_HCIUART_NOKIA)+= hci_nokia.o
>>
>> +obj-$(CONFIG_BT_RSI) += btrsi.o
>> +
>> btmrvl-y  := btmrvl_main.o
>> btmrvl-$(CONFIG_DEBUG_FS) += btmrvl_debugfs.o
>>
>> diff --git a/drivers/bluetooth/btrsi.c b/drivers/bluetooth/btrsi.c
>> new file mode 100644
>> index 000..71f6f4e
>> --- /dev/null
>> +++ b/drivers/bluetooth/btrsi.c
>> @@ -0,0 +1,211 @@
>> +/**
>> + * Copyright (c) 2017 Redpine Signals 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
>> +e* 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.
>> + */
>> +#include 
>> +#include 
>> +#include 
>> +#include "rsi_hci.h"
>> +
>> +struct rsi_hci_adapter {
>> + void *priv;
>> + struct rsi_proto_ops *proto_ops;
>> + struct hci_dev *hdev;
>> +};
>> +
>> +const struct rsi_mod_ops rsi_bt_ops = {
>> + .attach = rsi_hci_attach,
>> + .detach = rsi_hci_detach,
>> + .recv_pkt = rsi_hci_recv_pkt,
>> +};
>> +EXPORT_SYMBOL(rsi_bt_ops);
>> +
>> +static int rsi_hci_open(struct hci_dev *hdev)
>> +{
>> + return 0;
>

Re: rsi_91x: Failed to read status register on failed authentication

2017-12-05 Thread Amitkumar Karwar
On Tue, Dec 5, 2017 at 9:41 PM, Alexey Brodkin
 wrote:
> Hi Amit,
>
> I'm seeing quite a strange behavior of RedPine module.
> It connects perfectly fine to one of access points but fails
> to connect to another.
>
> Moreover after that failure RSI driver starts to flood me with
> messages saying:
> ->8
> rsi_91x: rsi_sdio_check_buffer_status: Failed to read status register
> ->8
>
> Below you may find details of my 2 experiments.
> Note I use vanilla Linux kernel v4.14.4
>
> Any ideas what could be wrong?
>

Could you enable driver debug zones and share dmesg log for analysis?

echo 0x > /sys/kernel/debug/phy0/debug_zone

Regards,
Amitkumar


[v3 8/8] rsi: sdio changes to support BT

2017-11-30 Thread Amitkumar Karwar
From: Prameela Rani Garnepudi <prameela.j0...@gmail.com>

Queue number is correctly updated for BT traffic. Also, kzalloc
instead of kmalloc is used for Rx packet allocation.

Signed-off-by: Prameela Rani Garnepudi <prameela.j0...@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.kar...@redpinesignals.com>
---
 drivers/net/wireless/rsi/rsi_91x_sdio.c | 2 ++
 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio.c
index 5722736..beb18d0 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio.c
@@ -763,6 +763,8 @@ static int rsi_sdio_host_intf_write_pkt(struct rsi_hw 
*adapter,
int status;
 
queueno = ((pkt[1] >> 4) & 0xf);
+   if (queueno == RSI_BT_MGMT_Q || queueno == RSI_BT_DATA_Q)
+   queueno = RSI_BT_Q;
 
num_blocks = len / block_size;
 
diff --git a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c 
b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
index 26abe51..83652bd 100644
--- a/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
+++ b/drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
@@ -103,7 +103,7 @@ static int rsi_process_pkt(struct rsi_common *common)
 
rcv_pkt_len = (num_blks * 256);
 
-   common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
+   common->rx_data_pkt = kzalloc(rcv_pkt_len, GFP_KERNEL);
if (!common->rx_data_pkt) {
rsi_dbg(ERR_ZONE, "%s: Failed in memory allocation\n",
__func__);
-- 
2.7.4



  1   2   3   4   5   6   7   8   9   >