[NEUS7920-477] [9610] wlbt: Support for configuring Latency Mode
authorSrishti Piplani <srishti.p@samsung.com>
Sun, 16 Sep 2018 14:43:29 +0000 (20:13 +0530)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:46:24 +0000 (23:46 +0900)
Host changes to set the latency mode according to
the value supplied in the ioctl SET_LATENCY_MODE.

Change-Id: Ibc388c8513ae2a622efcc856270ab87082e8bd4e
SCSC-Bug-Id: SSB-52771
Signed-off-by: Srishti Piplani <srishti.p@samsung.com>
drivers/net/wireless/scsc/Kconfig
drivers/net/wireless/scsc/ioctl.c
drivers/net/wireless/scsc/mgt.c
drivers/net/wireless/scsc/mgt.h
drivers/net/wireless/scsc/mib.h

index ce055300ece4988e1e869ebc5c3fb829e8c3b6cb..1f8719951dbad5ba3a78fc6cfe6c679c6a90e737 100755 (executable)
@@ -228,3 +228,10 @@ config SCSC_WLAN_SET_NUM_ANTENNAS
         default n
         ---help---
           This option tells whether configuring of number of antennas is enabled or not.
+
+config SCSC_WLAN_LOW_LATENCY_MODE
+        bool "Support enabling/disabling roaming as per latency mode"
+        default n
+        ---help---
+          This option tells whether support is provided for enabling
+          or disabling roaming as per the latency mode.
index f1e2b0a89e8cd288f6611c01248521214fb291e7..f90c8dc204793373cd3ac93cef18c3c8a8eb5d48 100755 (executable)
@@ -73,6 +73,9 @@
 #define CMD_TDLSCHANNELSWITCH  "TDLS_CHANNEL_SWITCH"
 #define CMD_SETROAMOFFLOAD     "SETROAMOFFLOAD"
 #define CMD_SETROAMOFFLAPLIST  "SETROAMOFFLAPLIST"
+#ifdef CONFIG_SCSC_WLAN_LOW_LATENCY_MODE
+#define CMD_SET_LATENCY_MODE "SET_LATENCY_MODE"
+#endif
 
 #define CMD_SETBAND "SETBAND"
 #define CMD_GETBAND "GETBAND"
@@ -2246,6 +2249,21 @@ static int slsi_get_assoc_reject_info(struct net_device *dev, char *command, int
        return len;
 }
 
+#ifdef CONFIG_SCSC_WLAN_LOW_LATENCY_MODE
+int slsi_set_latency_mode(struct net_device *dev, char *cmd, int cmd_len)
+{
+       struct netdev_vif    *ndev_vif = netdev_priv(dev);
+       struct slsi_dev      *sdev = ndev_vif->sdev;
+       bool                 enable_roaming;
+
+       /* latency_mode =0 (Normal), latency_mode =1 (Low) */
+       enable_roaming = (cmd[0] == '0') ? true : false;
+       SLSI_DBG1(sdev, SLSI_CFG80211, "Setting latency mode %d\n", cmd[0] - '0');
+
+       return slsi_set_mib_soft_roaming_enabled(sdev, dev, enable_roaming);
+}
+#endif
+
 int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
 #define MAX_LEN_PRIV_COMMAND    4096 /*This value is the max reply size set in supplicant*/
@@ -2507,6 +2525,11 @@ int slsi_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                ret = slsi_get_sta_info(dev, command, priv_cmd.total_len);
        } else if (strncasecmp(command, CMD_GETASSOCREJECTINFO, strlen(CMD_GETASSOCREJECTINFO)) == 0) {
                ret = slsi_get_assoc_reject_info(dev, command, priv_cmd.total_len);
+#ifdef CONFIG_SCSC_WLAN_LOW_LATENCY_MODE
+       } else if (strncasecmp(command, CMD_SET_LATENCY_MODE, strlen(CMD_SET_LATENCY_MODE)) == 0) {
+               ret = slsi_set_latency_mode(dev, command + strlen(CMD_SET_LATENCY_MODE) + 1,
+                                           priv_cmd.total_len - (strlen(CMD_SET_LATENCY_MODE) + 1));
+#endif
        } else if ((strncasecmp(command, CMD_RXFILTERSTART, strlen(CMD_RXFILTERSTART)) == 0) ||
                        (strncasecmp(command, CMD_RXFILTERSTOP, strlen(CMD_RXFILTERSTOP)) == 0) ||
                        (strncasecmp(command, CMD_BTCOEXMODE, strlen(CMD_BTCOEXMODE)) == 0) ||
index 2b5394cddcf2c25e2d012a02b0f40e808015d8be..0134c6df57dc298935dd2d0fe62d4ab07fd62b40 100755 (executable)
@@ -4769,6 +4769,25 @@ int slsi_set_mib_rssi_boost(struct slsi_dev *sdev, struct net_device *dev, u16 p
        return error;
 }
 
+#ifdef CONFIG_SCSC_WLAN_LOW_LATENCY_MODE
+int slsi_set_mib_soft_roaming_enabled(struct slsi_dev *sdev, struct net_device *dev, bool enable)
+{
+       struct slsi_mib_data mib_data = { 0, NULL };
+       int error = SLSI_MIB_STATUS_FAILURE;
+
+       if (slsi_mib_encode_bool(&mib_data, SLSI_PSID_UNIFI_ROAM_SOFT_ROAMING_ENABLED,
+                                enable, 0) == SLSI_MIB_STATUS_SUCCESS)
+               if (mib_data.dataLength) {
+                       error = slsi_mlme_set(sdev, dev, mib_data.data, mib_data.dataLength);
+                       if (error)
+                               SLSI_ERR(sdev, "Err Setting MIB failed. error = %d\n", error);
+                       kfree(mib_data.data);
+               }
+
+       return error;
+}
+#endif
+
 void slsi_modify_ies_on_channel_switch(struct net_device *dev, struct cfg80211_ap_settings *settings,
                                       u8 *ds_params_ie, u8 *ht_operation_ie, struct ieee80211_mgmt  *mgmt,
                                       u16 beacon_ie_head_len)
index 7f43994996261359fb1ad2b8a95990c05fd27135..90f442465991bf497f5b5c6de161d3531713066c 100755 (executable)
@@ -476,6 +476,9 @@ int slsi_ap_prepare_add_info_ies(struct netdev_vif *ndev_vif, const u8 *ies, siz
 int slsi_set_mib_roam(struct slsi_dev *dev, struct net_device *ndev, u16 psid, int value);
 void slsi_reset_throughput_stats(struct net_device *dev);
 int slsi_set_mib_rssi_boost(struct slsi_dev *sdev, struct net_device *dev, u16 psid, int index, int boost);
+#ifdef CONFIG_SCSC_WLAN_LOW_LATENCY_MODE
+int slsi_set_mib_soft_roaming_enabled(struct slsi_dev *sdev, struct net_device *dev, bool enable);
+#endif
 void slsi_modify_ies_on_channel_switch(struct net_device *dev, struct cfg80211_ap_settings *settings,
                                       u8 *ds_params_ie, u8 *ht_operation_ie, struct ieee80211_mgmt  *mgmt,
                                       u16 beacon_ie_head_len);
index d869efe35cc068dcf8f683b2e9db4baf54e6776d..864da806cd8f91c8af746572332e162acb6a261c 100755 (executable)
@@ -7295,6 +7295,9 @@ void slsi_mib_buf_append(struct slsi_mib_data *dst, size_t bufferLength, u8 *buf
  *******************************************************************************/
 #define SLSI_PSID_UNIFI_READ_REG 0x1F73
 
+/*AUTOGEN TBD*/
+#define SLSI_PSID_UNIFI_ROAM_SOFT_ROAMING_ENABLED 0x0806
+
 #ifdef __cplusplus
 }
 #endif