Re: [PATCH 06/13] wlcore: enable sleep during AP mode operation

2015-03-25 Thread Marc Kleine-Budde
On 12/29/2014 07:24 AM, Eliad Peller wrote:
 From: Kobi L kobi.lev...@gmail.com
 
 Enable ELP authorization in AP mode and enable the use
 of the wakeup bit in the ELP register.
 
 Introduce AP role sleep configuration which is disabled
 by default. When configured, it allows the AP to sleep
 when ELP is authorized for it.
 
 Signed-off-by: Kobi Leibovitch kobi.lev...@gmail.com
 Signed-off-by: Arik Nemtsov a...@wizery.com
 Signed-off-by: Eliad Peller el...@wizery.com

[...]

 diff --git a/drivers/net/wireless/ti/wl18xx/conf.h 
 b/drivers/net/wireless/ti/wl18xx/conf.h
 index e34302e..71f1ec4 100644
 --- a/drivers/net/wireless/ti/wl18xx/conf.h
 +++ b/drivers/net/wireless/ti/wl18xx/conf.h
 @@ -23,7 +23,7 @@
  #define __WL18XX_CONF_H__
  
  #define WL18XX_CONF_MAGIC0x10e100ca
 -#define WL18XX_CONF_VERSION  (WLCORE_CONF_VERSION | 0x0006)
 +#define WL18XX_CONF_VERSION  (WLCORE_CONF_VERSION | 0x0007)
  #define WL18XX_CONF_MASK 0x
  #define WL18XX_CONF_SIZE (WLCORE_CONF_SIZE + \
sizeof(struct wl18xx_priv_conf))
 @@ -110,12 +110,33 @@ struct wl18xx_ht_settings {
   u8 mode;
  } __packed;
  
 +struct conf_ap_sleep_settings {
 + /* Duty Cycle (20-80% of staying Awake) for IDLE AP
 +  * (0: disable)
 +  */
 + u8 idle_duty_cycle;
 + /* Duty Cycle (20-80% of staying Awake) for Connected AP
 +  * (0: disable)
 +  */
 + u8 connected_duty_cycle;
 + /* Maximum stations that are allowed to be connected to AP
 +  *  (255: no limit)
 +  */
 + u8 max_stations_thresh;
 + /* Timeout till enabling the Sleep Mechanism after data stops
 +  * [unit: 100 msec]
 +  */
 + u8 idle_conn_thresh;
 +} __packed;
 +
  struct wl18xx_priv_conf {
   /* Module params structures */
   struct wl18xx_ht_settings ht;
  
   /* this structure is copied wholesale to FW */
   struct wl18xx_mac_and_phy_params phy;
 +
 + struct conf_ap_sleep_settings ap_sleep;
  } __packed;

This patch requires a new firmware, loading of wl18xx-conf.bin from
[1] fails with:

 wlcore: ERROR configuration binary file size is wrong, expected 1226 got 1221

regards,
Marc

[1]
http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/ti-connectivity

-- 
Pengutronix e.K.  | Marc Kleine-Budde   |
Industrial Linux Solutions| Phone: +49-231-2826-924 |
Vertretung West/Dortmund  | Fax:   +49-5121-206917- |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |



signature.asc
Description: OpenPGP digital signature


Re: [PATCH 06/13] wlcore: enable sleep during AP mode operation

2015-03-25 Thread Marc Kleine-Budde
On 03/25/2015 01:58 PM, Eliad Peller wrote:
 hi Marc,
 
 On Wed, Mar 25, 2015 at 2:27 PM, Marc Kleine-Budde m...@pengutronix.de 
 wrote:
 On 12/29/2014 07:24 AM, Eliad Peller wrote:
 From: Kobi L kobi.lev...@gmail.com

 Enable ELP authorization in AP mode and enable the use
 of the wakeup bit in the ELP register.

 Introduce AP role sleep configuration which is disabled
 by default. When configured, it allows the AP to sleep
 when ELP is authorized for it.

 Signed-off-by: Kobi Leibovitch kobi.lev...@gmail.com
 Signed-off-by: Arik Nemtsov a...@wizery.com
 Signed-off-by: Eliad Peller el...@wizery.com

 [...]


 This patch requires a new firmware, loading of wl18xx-conf.bin from
 [1] fails with:

 wlcore: ERROR configuration binary file size is wrong, expected 1226 got 
 1221

 thanks. seems you're right.
 
 anyway, note that this file is not actual fw, but only the default
 configuration params.
 you can just delete it, and the driver will load just fine.
 you can then recreate it with something like:
 cat /sys/kernel/debug/ieee80211/phy0/wlcore/wl18xx/conf 
 /lib/firmware/ti-connectivity/wl18xx-conf.bin
 
 actually, i don't think it makes much sense to have this file in the
 linux-firmware git at all.
 i'll try handling it.

Thanks, there are more file with size of ~1k, are they optional, too?
What's the error message if these optional files are not present?

From working with $CUSTOMERS I gained the impression, messages like
error failed to load for optional file don't shine the best light
on Linux, a neutral using default values is far better.

Marc

-- 
Pengutronix e.K.  | Marc Kleine-Budde   |
Industrial Linux Solutions| Phone: +49-231-2826-924 |
Vertretung West/Dortmund  | Fax:   +49-5121-206917- |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |



signature.asc
Description: OpenPGP digital signature


[PATCH 06/13] wlcore: enable sleep during AP mode operation

2014-12-28 Thread Eliad Peller
From: Kobi L kobi.lev...@gmail.com

Enable ELP authorization in AP mode and enable the use
of the wakeup bit in the ELP register.

Introduce AP role sleep configuration which is disabled
by default. When configured, it allows the AP to sleep
when ELP is authorized for it.

Signed-off-by: Kobi Leibovitch kobi.lev...@gmail.com
Signed-off-by: Arik Nemtsov a...@wizery.com
Signed-off-by: Eliad Peller el...@wizery.com
---
 drivers/net/wireless/ti/wl12xx/main.c   |  1 +
 drivers/net/wireless/ti/wl18xx/acx.c| 32 
 drivers/net/wireless/ti/wl18xx/acx.h| 25 +++--
 drivers/net/wireless/ti/wl18xx/conf.h   | 23 ++-
 drivers/net/wireless/ti/wl18xx/main.c   |  7 +++
 drivers/net/wireless/ti/wlcore/hw_ops.h |  9 +
 drivers/net/wireless/ti/wlcore/init.c   |  8 ++--
 drivers/net/wireless/ti/wlcore/ps.c |  6 --
 drivers/net/wireless/ti/wlcore/wlcore.h |  1 +
 9 files changed, 101 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/ti/wl12xx/main.c 
b/drivers/net/wireless/ti/wl12xx/main.c
index b457069..42264e5 100644
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -1731,6 +1731,7 @@ static struct wlcore_ops wl12xx_ops = {
.lnk_low_prio   = wl12xx_lnk_low_prio,
.interrupt_notify   = NULL,
.rx_ba_filter   = NULL,
+   .ap_sleep   = NULL,
 };
 
 static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
diff --git a/drivers/net/wireless/ti/wl18xx/acx.c 
b/drivers/net/wireless/ti/wl18xx/acx.c
index 9d4b9aa..67f2a0e 100644
--- a/drivers/net/wireless/ti/wl18xx/acx.c
+++ b/drivers/net/wireless/ti/wl18xx/acx.c
@@ -24,6 +24,7 @@
 #include ../wlcore/acx.h
 
 #include acx.h
+#include wl18xx.h
 
 int wl18xx_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap,
  u32 sdio_blk_size, u32 extra_mem_blks,
@@ -250,3 +251,34 @@ out:
kfree(acx);
return ret;
 }
+
+int wl18xx_acx_ap_sleep(struct wl1271 *wl)
+{
+   struct wl18xx_priv *priv = wl-priv;
+   struct acx_ap_sleep_cfg *acx;
+   struct conf_ap_sleep_settings *conf = priv-conf.ap_sleep;
+   int ret;
+
+   wl1271_debug(DEBUG_ACX, acx config ap sleep);
+
+   acx = kzalloc(sizeof(*acx), GFP_KERNEL);
+   if (!acx) {
+   ret = -ENOMEM;
+   goto out;
+   }
+
+   acx-idle_duty_cycle = conf-idle_duty_cycle;
+   acx-connected_duty_cycle = conf-connected_duty_cycle;
+   acx-max_stations_thresh = conf-max_stations_thresh;
+   acx-idle_conn_thresh = conf-idle_conn_thresh;
+
+   ret = wl1271_cmd_configure(wl, ACX_AP_SLEEP_CFG, acx, sizeof(*acx));
+   if (ret  0) {
+   wl1271_warning(acx config ap-sleep failed: %d, ret);
+   goto out;
+   }
+
+out:
+   kfree(acx);
+   return ret;
+}
diff --git a/drivers/net/wireless/ti/wl18xx/acx.h 
b/drivers/net/wireless/ti/wl18xx/acx.h
index 1234bdc..4afccd4 100644
--- a/drivers/net/wireless/ti/wl18xx/acx.h
+++ b/drivers/net/wireless/ti/wl18xx/acx.h
@@ -34,8 +34,8 @@ enum {
ACX_AUTO_RX_STREAMING= 0x0055,
ACX_PEER_CAP = 0x0056,
ACX_INTERRUPT_NOTIFY = 0x0057,
-   ACX_RX_BA_FILTER = 0x0058
-
+   ACX_RX_BA_FILTER = 0x0058,
+   ACX_AP_SLEEP_CFG = 0x0059
 };
 
 /* numbers of bits the length field takes (add 1 for the actual number) */
@@ -347,6 +347,26 @@ struct wl18xx_acx_rx_ba_filter {
u32 enable;
 };
 
+struct acx_ap_sleep_cfg {
+   struct acx_header header;
+   /* Duty Cycle (20-80% of staying Awake) for IDLE AP
+* (0: disable)
+*/
+   u8 idle_duty_cycle;
+   /* Duty Cycle (20-80% of staying Awake) for Connected AP
+* (0: disable)
+*/
+   u8 connected_duty_cycle;
+   /* Maximum stations that are allowed to be connected to AP
+*  (255: no limit)
+*/
+   u8 max_stations_thresh;
+   /* Timeout till enabling the Sleep Mechanism after data stops
+* [unit: 100 msec]
+*/
+   u8 idle_conn_thresh;
+} __packed;
+
 int wl18xx_acx_host_if_cfg_bitmap(struct wl1271 *wl, u32 host_cfg_bitmap,
  u32 sdio_blk_size, u32 extra_mem_blks,
  u32 len_field_size);
@@ -359,5 +379,6 @@ int wl18xx_acx_set_peer_cap(struct wl1271 *wl,
u32 rate_set, u8 hlid);
 int wl18xx_acx_interrupt_notify_config(struct wl1271 *wl, bool action);
 int wl18xx_acx_rx_ba_filter(struct wl1271 *wl, bool action);
+int wl18xx_acx_ap_sleep(struct wl1271 *wl);
 
 #endif /* __WL18XX_ACX_H__ */
diff --git a/drivers/net/wireless/ti/wl18xx/conf.h 
b/drivers/net/wireless/ti/wl18xx/conf.h
index e34302e..71f1ec4 100644
--- a/drivers/net/wireless/ti/wl18xx/conf.h
+++ b/drivers/net/wireless/ti/wl18xx/conf.h
@@ -23,7 +23,7 @@