[RAMEN9610-12398] [common][9610] wlbt: host 6.63.1 release
authorYoungsoo <youngss.kim@samsung.com>
Thu, 21 Feb 2019 02:42:56 +0000 (11:42 +0900)
committerhskang <hs1218.kang@samsung.com>
Thu, 21 Feb 2019 06:11:19 +0000 (15:11 +0900)
1. wlbt: Enabling GSCAN in SLSI Wifi Driver.
2. wlbt: Dwell time handling for WPS
3. wlbt: Add some missing compilation gates
4. wlbt: Send DNS request on VO AC
5. wlbt: MHS doesn't start in 5GHz for IN
6. wlbt: kstrtoint fixup

Change-Id: I2258bf9708669d83276a28c11d5bc95814ea9be5

drivers/misc/samsung/scsc/mxman.c
drivers/misc/samsung/scsc/mxman.h
drivers/net/wireless/scsc/dev.c
drivers/net/wireless/scsc/hip4.c
drivers/net/wireless/scsc/mgt.c
drivers/net/wireless/scsc/mgt.h
drivers/net/wireless/scsc/netif.c
drivers/net/wireless/scsc/nl80211_vendor.c
drivers/net/wireless/scsc/rx.c
drivers/net/wireless/scsc/tx.c
include/scsc/scsc_release.h

index 38d44c8085c16ac168da3b332118a0459841e44b..f056e7bfbfcdddf69e3227cc96f505a9ffd65736 100755 (executable)
@@ -215,7 +215,7 @@ static ssize_t sysfs_store_memdump(struct kobject *kobj,
 
        SCSC_TAG_INFO(MXMAN, "memdump: %d\n", memdump);
 
-       return (r > 0) ? count : 0;
+       return (r == 0) ? count : 0;
 }
 
 struct kobject *mxman_wifi_kobject_ref_get(void)
@@ -356,15 +356,6 @@ struct ma_msg_packet {
        uint32_t arg;   /* Optional arg set by f/w in some to-host messages */
 } __packed;
 
-/**
- * Special case Maxwell management, carrying FM radio configuration structure
- */
-struct ma_msg_packet_fm_radio_config {
-
-       uint8_t ma_msg;                         /* Message from ma_msg enum */
-       struct wlbt_fm_params fm_params;        /* FM Radio parameters */
-} __packed;
-
 static bool send_fw_config_to_active_mxman(uint32_t fw_runtime_flags)
 {
        bool ret = false;
@@ -401,6 +392,16 @@ static bool send_fw_config_to_active_mxman(uint32_t fw_runtime_flags)
        return ret;
 }
 
+/**
+ * Special case Maxwell management, carrying FM radio configuration structure
+ */
+#ifdef CONFIG_SCSC_FM
+struct ma_msg_packet_fm_radio_config {
+
+       uint8_t ma_msg;                         /* Message from ma_msg enum */
+       struct wlbt_fm_params fm_params;        /* FM Radio parameters */
+} __packed;
+
 static bool send_fm_params_to_active_mxman(struct wlbt_fm_params *params)
 {
        bool ret = false;
@@ -437,6 +438,7 @@ static bool send_fm_params_to_active_mxman(struct wlbt_fm_params *params)
 
        return ret;
 }
+#endif
 
 static void mxman_stop(struct mxman *mxman);
 static void print_mailboxes(struct mxman *mxman);
@@ -1790,11 +1792,13 @@ int mxman_open(struct mxman *mxman)
                        break; /* Running or given up */
        }
 
+#ifdef CONFIG_SCSC_FM
        /* If we have stored FM radio parameters, deliver them to FW now */
        if (r == 0 && mxman->fm_params_pending) {
                SCSC_TAG_INFO(MXMAN, "Send pending FM params\n");
                mxman_fm_set_params(mxman, &mxman->fm_params);
        }
+#endif
 
        return r;
 }
@@ -2318,10 +2322,12 @@ bool mxman_recovery_disabled(void)
        if (disable_recovery_until_reboot)
                return true;
 
+#ifdef CONFIG_SCSC_WLBTD
        if (disable_recovery_handling == MEMDUMP_FILE_FOR_RECOVERY)
                return disable_recovery_from_memdump_file;
-       else
-               return disable_recovery_handling ? true : false;
+#endif
+
+       return disable_recovery_handling ? true : false;
 }
 EXPORT_SYMBOL(mxman_recovery_disabled);
 
index f5bcda69f34dfbde9ed48c563d6c425f63ef4d62..d671389e0367938ffd6a5e4e1773ca378ff64773 100755 (executable)
@@ -77,12 +77,11 @@ struct mxman {
        u32                     last_panic_rec_r[PANIC_RECORD_SIZE]; /* Must be at least SCSC_R4_V2_MINOR_53 */
        u16                     last_panic_rec_sz;
 #ifdef CONFIG_SCSC_FM
-       u32                     on_halt_ldos_on;
+       u32                   on_halt_ldos_on;
+       struct wlbt_fm_params fm_params;                 /* FM freq info */
+       int                   fm_params_pending; /* FM freq info waiting to be delivered to FW */
 #endif
        char                    failure_reason[SCSC_FAILURE_REASON_LEN]; /* previous failure reason */
-       struct wlbt_fm_params   fm_params;              /* FM freq info */
-       int                     fm_params_pending;      /* FM freq info waiting to be delivered to FW */
-
 };
 
 void mxman_register_gdb_channel(struct scsc_mx *mx, mxmgmt_channel_handler handler, void *data);
index 4701f88e8fd345933609219f9deb85c4f99e6295..361bffca2c3b5926e05e0ff99b31673dd58754d5 100644 (file)
@@ -57,7 +57,7 @@ static bool lls_disabled;
 module_param(lls_disabled, bool, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(lls_disabled, "Disable LLS: to disable LLS set 1");
 
-static bool gscan_disabled = 1;
+static bool gscan_disabled = 0;
 module_param(gscan_disabled, bool, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(gscan_disabled, "Disable gscan: to disable gscan set 1");
 
index 45258139aa8957d1ccf82d9eb2ade26957283532..32df89dcf1d86992c328cbfd301a539076ecb2b5 100755 (executable)
@@ -565,6 +565,9 @@ static void hip4_dump_dbg(struct slsi_hip4 *hip, struct mbulk *m, struct sk_buff
                SLSI_ERR_NODEV("m: %p 0x%x\n", m, ref);
                print_hex_dump(KERN_ERR, SCSC_PREFIX "mbulk ", DUMP_PREFIX_NONE, 16, 1, m, sizeof(struct mbulk), 0);
        }
+       if (m && mbulk_has_signal(m))
+               print_hex_dump(KERN_ERR, SCSC_PREFIX "sig   ", DUMP_PREFIX_NONE, 16, 1, mbulk_get_signal(m),
+                              MBULK_SEG_SIG_BUFSIZE(m), 0);
        if (skb)
                print_hex_dump(KERN_ERR, SCSC_PREFIX "skb   ", DUMP_PREFIX_NONE, 16, 1, skb->data, skb->len > 0xff ? 0xff : skb->len, 0);
 
index 7357cb0d8ae784422e063e7ab0f4df00e6c83dbc..ba196db097ac794deed3d3458755d34978851a91 100755 (executable)
@@ -3989,6 +3989,24 @@ int slsi_is_dhcp_packet(u8 *data)
        return ret;
 }
 
+int slsi_is_dns_packet(u8 *data)
+{
+       u8 *p;
+
+       p = data + SLSI_IP_TYPE_OFFSET;
+
+       if (*p == SLSI_IP_TYPE_UDP) {
+               u16 dest_port;
+
+               p = data + SLSI_IP_DEST_PORT_OFFSET;
+               dest_port = p[0] << 8 | p[1];
+               if (dest_port == SLSI_DNS_DEST_PORT) /* 0x0035 */
+                       return 1;
+       }
+
+       return 0;
+}
+
 int slsi_ap_prepare_add_info_ies(struct netdev_vif *ndev_vif, const u8 *ies, size_t ies_len)
 {
        const u8 *wps_p2p_ies = NULL;
@@ -4251,6 +4269,43 @@ int slsi_roaming_scan_configure_channels(struct slsi_dev *sdev, struct net_devic
        return cached_channels_count;
 }
 
+int slsi_send_acs_event(struct slsi_dev *sdev, struct slsi_acs_selected_channels acs_selected_channels)
+{
+       struct sk_buff                         *skb = NULL;
+       u8 err = 0;
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
+       skb = cfg80211_vendor_event_alloc(sdev->wiphy, NULL, NLMSG_DEFAULT_SIZE,
+                                         SLSI_NL80211_VENDOR_ACS_EVENT, GFP_KERNEL);
+#else
+       skb = cfg80211_vendor_event_alloc(sdev->wiphy, NLMSG_DEFAULT_SIZE,
+                                         SLSI_NL80211_VENDOR_ACS_EVENT, GFP_KERNEL);
+#endif
+       if (!skb) {
+               SLSI_ERR_NODEV("Failed to allocate skb for VENDOR ACS event\n");
+               return -ENOMEM;
+       }
+       err |= nla_put_u8(skb, SLSI_ACS_ATTR_PRIMARY_CHANNEL, acs_selected_channels.pri_channel);
+       err |= nla_put_u8(skb, SLSI_ACS_ATTR_SECONDARY_CHANNEL, acs_selected_channels.sec_channel);
+       err |= nla_put_u8(skb, SLSI_ACS_ATTR_VHT_SEG0_CENTER_CHANNEL, acs_selected_channels.vht_seg0_center_ch);
+       err |= nla_put_u8(skb, SLSI_ACS_ATTR_VHT_SEG1_CENTER_CHANNEL, acs_selected_channels.vht_seg1_center_ch);
+       err |= nla_put_u16(skb, SLSI_ACS_ATTR_CHWIDTH, acs_selected_channels.ch_width);
+       err |= nla_put_u8(skb, SLSI_ACS_ATTR_HW_MODE, acs_selected_channels.hw_mode);
+       SLSI_DBG3(sdev, SLSI_MLME, "pri_channel=%d,sec_channel=%d,vht_seg0_center_ch=%d,"
+                               "vht_seg1_center_ch=%d, ch_width=%d, hw_mode=%d\n",
+                               acs_selected_channels.pri_channel, acs_selected_channels.sec_channel,
+                               acs_selected_channels.vht_seg0_center_ch, acs_selected_channels.vht_seg1_center_ch,
+                               acs_selected_channels.ch_width, acs_selected_channels.hw_mode);
+       if (err) {
+               SLSI_ERR_NODEV("Failed nla_put err=%d\n", err);
+               slsi_kfree_skb(skb);
+               return -EINVAL;
+       }
+       SLSI_INFO(sdev, "Event: SLSI_NL80211_VENDOR_ACS_EVENT(%d)\n", SLSI_NL80211_VENDOR_ACS_EVENT);
+       cfg80211_vendor_event(skb, GFP_KERNEL);
+       return 0;
+}
+
 #ifdef CONFIG_SCSC_WLAN_WES_NCHO
 int slsi_is_wes_action_frame(const struct ieee80211_mgmt *mgmt)
 {
index 631a975d4bc40551e1c64a47f552874fcb6fa513..3ae64360cd0b97aa27a684e208110ea75058ca84 100755 (executable)
 #define SLSI_EAP_PACKET_RESPONSE   (2)
 #define SLSI_EAP_PACKET_SUCCESS     (3)
 #define SLSI_EAP_PACKET_FAILURE      (4)
+#define SLSI_EAP_TYPE_POS                  (8)
+#define SLSI_EAP_TYPE_EXPANDED       (254)
+#define SLSI_EAP_OPCODE_POS                      (16)
+#define SLSI_EAP_OPCODE_WSC_MSG          (4)
+#define SLSI_EAP_OPCODE_WSC_START          (1)
+#define SLSI_EAP_MSGTYPE_POS                    (27)
+#define SLSI_EAP_MSGTYPE_M8                    (12)
+#define SLSI_EAP_WPS_DWELL_TIME           (100000)       /*100 ms */
 
 #define SLSI_80211_AC_VO 0
 #define SLSI_80211_AC_VI 1
 #define SLSI_IP_DEST_PORT_OFFSET 36
 #define SLSI_DHCP_SERVER_PORT 67
 #define SLSI_DHCP_CLIENT_PORT 68
+#define SLSI_DNS_DEST_PORT 53
 
 #define SLSI_DHCP_MSG_MAGIC_OFFSET 278
 #define SLSI_DHCP_OPTION 53
@@ -450,6 +459,7 @@ u8 slsi_p2p_get_exp_peer_frame_subtype(u8 subtype);
 int slsi_send_txq_params(struct slsi_dev *sdev, struct net_device *ndev);
 void slsi_abort_sta_scan(struct slsi_dev *sdev);
 int slsi_is_dhcp_packet(u8 *data);
+int slsi_is_dns_packet(u8 *data);
 void slsi_set_packet_filters(struct slsi_dev *sdev, struct net_device *dev);
 int  slsi_update_packet_filters(struct slsi_dev *sdev, struct net_device *dev);
 int  slsi_clear_packet_filters(struct slsi_dev *sdev, struct net_device *dev);
@@ -485,6 +495,7 @@ int slsi_read_unifi_countrylist(struct slsi_dev *sdev, u16 psid);
 int slsi_read_default_country(struct slsi_dev *sdev, u8 *alpha2, u16 index);
 int slsi_read_disconnect_ind_timeout(struct slsi_dev *sdev, u16 psid);
 int slsi_read_regulatory_rules(struct slsi_dev *sdev, struct slsi_802_11d_reg_domain *domain_info, const char *alpha2);
+int slsi_send_acs_event(struct slsi_dev *sdev, struct slsi_acs_selected_channels acs_selected_channels);
 #ifdef CONFIG_SCSC_WLAN_ENABLE_MAC_RANDOMISATION
 int slsi_set_mac_randomisation_mask(struct slsi_dev *sdev, u8 *mac_address_mask);
 #endif
index b723e17e8df66b2d34bf7e9893224c1649305792..e138d5a09ffd072b45e299c72fa2bd1e12d60ca6 100755 (executable)
@@ -549,11 +549,15 @@ static u16 slsi_net_select_queue(struct net_device *dev, struct sk_buff *skb)
                } else
 #endif
                {
+                       if (proto == ETH_P_IP && slsi_is_dns_packet(skb->data)) {
+                               skb->priority = FAPI_PRIORITY_QOS_UP7;
+                       } else {
 #ifdef CONFIG_SCSC_USE_WMM_TOS
-                       skb->priority = slsi_get_priority_from_tos(skb->data + ETH_HLEN, proto);
+                               skb->priority = slsi_get_priority_from_tos(skb->data + ETH_HLEN, proto);
 #else
-                       skb->priority = slsi_get_priority_from_tos_dscp(skb->data + ETH_HLEN, proto);
+                               skb->priority = slsi_get_priority_from_tos_dscp(skb->data + ETH_HLEN, proto);
 #endif
+                       }
                }
        } else{
                skb->priority = FAPI_PRIORITY_QOS_UP0;
index 869c98832967103886c0a757f4fff8cae7a0fa9b..207e5321702a7347b2f54b1d2c03b7f8599a2961 100755 (executable)
@@ -5442,8 +5442,6 @@ void slsi_rx_event_log_indication(struct slsi_dev *sdev, struct net_device *dev,
                          "Roam Reason: %s\n", roam_rssi_val, deauth_reason, chan_utilisation,
                          slsi_get_roam_reason_str(roam_reason));
                break;
-       default:
-               SLSI_INFO(sdev, "Unknown Event_ID:%d\n", event_id);
        }
 
        slsi_kfree_skb(skb);
@@ -6385,6 +6383,7 @@ static int slsi_acs_init(struct wiphy *wiphy,
        if (r == 0 && freq_list_len) {
                struct ieee80211_channel *channels[freq_list_len];
                struct slsi_acs_chan_info ch_info[MAX_CHAN_VALUE_ACS];
+               struct slsi_acs_selected_channels acs_selected_channels;
                int i = 0, num_channels = 0;
                int idx;
                u32 chan_flags = (IEEE80211_CHAN_INDOOR_ONLY | IEEE80211_CHAN_RADAR |
@@ -6410,8 +6409,20 @@ static int slsi_acs_init(struct wiphy *wiphy,
                                num_channels++;
                        }
                }
-               for (i = 0; i < 25; i++)
-                       SLSI_INFO(sdev, "Channel value:%d\n", ch_info[i].chan);      /*will remove after testing */
+
+               if (num_channels == 1) {
+                       memset(&acs_selected_channels, 0, sizeof(acs_selected_channels));
+                       acs_selected_channels.ch_width = 20;
+                       acs_selected_channels.hw_mode = request->hw_mode;
+                       acs_selected_channels.pri_channel = channels[0]->hw_value;
+                       r = slsi_send_acs_event(sdev, acs_selected_channels);
+                       sdev->acs_channel_switched = true;
+                       kfree(freq_list);
+                       kfree(request);
+                       SLSI_MUTEX_UNLOCK(ndev_vif->scan_mutex);
+                       return r;
+               }
+
                if (request->hw_mode == SLSI_ACS_MODE_IEEE80211A)
                        request->ch_list_len = 25;
                else
@@ -6437,7 +6448,6 @@ static int slsi_acs_init(struct wiphy *wiphy,
                r = -EINVAL;
                kfree(request);
        }
-       SLSI_INFO(sdev, "SUBCMD_ACS_INIT Received 7 return value:%d\n", r);   /*will remove after testing */
        kfree(freq_list);
        SLSI_MUTEX_UNLOCK(ndev_vif->scan_mutex);
        return r;
index 0d6599c9d2ffd788a02c94bb3ec2c7b8d35221f1..b43ec94e3a37194115f7673b17e59a1ea37e60da 100755 (executable)
@@ -534,43 +534,6 @@ void slsi_scan_complete(struct slsi_dev *sdev, struct net_device *dev, u16 scan_
        SLSI_MUTEX_UNLOCK(ndev_vif->scan_result_mutex);
 }
 
-int slsi_send_acs_event(struct slsi_dev *sdev, struct slsi_acs_selected_channels acs_selected_channels)
-{
-       struct sk_buff                         *skb = NULL;
-       u8 err = 0;
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
-       skb = cfg80211_vendor_event_alloc(sdev->wiphy, NULL, NLMSG_DEFAULT_SIZE,
-                                         SLSI_NL80211_VENDOR_ACS_EVENT, GFP_KERNEL);
-#else
-       skb = cfg80211_vendor_event_alloc(sdev->wiphy, NLMSG_DEFAULT_SIZE,
-                                         SLSI_NL80211_VENDOR_ACS_EVENT, GFP_KERNEL);
-#endif
-       if (!skb) {
-               SLSI_ERR_NODEV("Failed to allocate skb for VENDOR ACS event\n");
-               return -ENOMEM;
-       }
-       err |= nla_put_u8(skb, SLSI_ACS_ATTR_PRIMARY_CHANNEL, acs_selected_channels.pri_channel);
-       err |= nla_put_u8(skb, SLSI_ACS_ATTR_SECONDARY_CHANNEL, acs_selected_channels.sec_channel);
-       err |= nla_put_u8(skb, SLSI_ACS_ATTR_VHT_SEG0_CENTER_CHANNEL, acs_selected_channels.vht_seg0_center_ch);
-       err |= nla_put_u8(skb, SLSI_ACS_ATTR_VHT_SEG1_CENTER_CHANNEL, acs_selected_channels.vht_seg1_center_ch);
-       err |= nla_put_u16(skb, SLSI_ACS_ATTR_CHWIDTH, acs_selected_channels.ch_width);
-       err |= nla_put_u8(skb, SLSI_ACS_ATTR_HW_MODE, acs_selected_channels.hw_mode);
-       SLSI_DBG3(sdev, SLSI_MLME, "pri_channel=%d,sec_channel=%d,vht_seg0_center_ch=%d,"
-                               "vht_seg1_center_ch=%d, ch_width=%d, hw_mode=%d\n",
-                               acs_selected_channels.pri_channel, acs_selected_channels.sec_channel,
-                               acs_selected_channels.vht_seg0_center_ch, acs_selected_channels.vht_seg1_center_ch,
-                               acs_selected_channels.ch_width, acs_selected_channels.hw_mode);
-       if (err) {
-               SLSI_ERR_NODEV("Failed nla_put err=%d\n", err);
-               slsi_kfree_skb(skb);
-               return -EINVAL;
-       }
-       SLSI_INFO(sdev, "Event: SLSI_NL80211_VENDOR_ACS_EVENT(%d)\n", SLSI_NL80211_VENDOR_ACS_EVENT);
-       cfg80211_vendor_event(skb, GFP_KERNEL);
-       return 0;
-}
-
 int slsi_set_2g_auto_channel(struct slsi_dev *sdev, struct netdev_vif  *ndev_vif,
                             struct slsi_acs_selected_channels *acs_selected_channels,
                             struct slsi_acs_chan_info *ch_info)
@@ -625,12 +588,7 @@ int slsi_set_2g_auto_channel(struct slsi_dev *sdev, struct netdev_vif  *ndev_vif
                          ch_info[i].num_bss_load_ap);
        }
 
-       if (acs_selected_channels->ch_width == 20) {
-               if (all_bss_load)
-                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_load_20].chan;
-               else
-                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_rssi_20].chan;
-       } else if (acs_selected_channels->ch_width == 40) {
+       if (acs_selected_channels->ch_width == 40) {
                for (i = 0; i < ch_list_len; i++) {
                        if (i + 4 >= ch_list_len || !ch_info[i + 4].chan || !ch_info[i].chan)
                                continue;
@@ -662,6 +620,16 @@ int slsi_set_2g_auto_channel(struct slsi_dev *sdev, struct netdev_vif  *ndev_vif
                        acs_selected_channels->pri_channel = ch_info[ch_idx_min_rssi].chan;
                        acs_selected_channels->sec_channel = ch_info[ch_idx_min_rssi].chan + 4;
                }
+
+               if (!acs_selected_channels->pri_channel)
+                       acs_selected_channels->ch_width = 20;
+       }
+
+       if (acs_selected_channels->ch_width == 20) {
+               if (all_bss_load)
+                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_load_20].chan;
+               else
+                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_rssi_20].chan;
        }
        return ret;
 }
@@ -739,77 +707,81 @@ int slsi_set_5g_auto_channel(struct slsi_dev *sdev, struct netdev_vif  *ndev_vif
                          ch_info[i].avg_chan_utilization, ch_info[i].num_bss_load_ap);
        }
 
-       if (acs_selected_channels->ch_width == 20) {
-               if (all_bss_load || min_avg_chan_utilization_20 < 128)
-                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_load_20].chan;
-               else if (none_bss_load || min_avg_chan_utilization_20 >= 128)
-                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_ap_20].chan;
-       } else if (acs_selected_channels->ch_width == 40) {
+       if (acs_selected_channels->ch_width == 80) {
                for (i = 0; i < ch_list_len; i++) {
-                       if (!ch_info[i].chan || i + 1 >= ch_list_len || !ch_info[i + 1].chan)
+                       if (i + 3 >= ch_list_len)
                                continue;
-                       if (slsi_is_40mhz_5gchan(ch_info[i].chan, ch_info[i + 1].chan)) {
-                               avg_load = ch_info[i].avg_chan_utilization + ch_info[i + 1].avg_chan_utilization;
-                               total_num_ap = ch_info[i].num_ap + ch_info[i + 1].num_ap;
+                       if (!ch_info[i].chan || !ch_info[i + 1].chan || !ch_info[i + 2].chan || !ch_info[i + 3].chan)
+                               continue;
+                       if (slsi_is_80mhz_5gchan(ch_info[i].chan, ch_info[i + 3].chan)) {
+                               avg_load = ch_info[i].avg_chan_utilization + ch_info[i + 1].avg_chan_utilization +
+                                          ch_info[i + 2].avg_chan_utilization + ch_info[i + 3].avg_chan_utilization;
+                               total_num_ap = ch_info[i].num_ap + ch_info[i + 1].num_ap + ch_info[i + 2].num_ap +
+                                                  ch_info[i + 3].num_ap;
                                if (avg_load < min_avg_chan_utilization) {
                                        min_avg_chan_utilization = avg_load;
                                        ch_idx_min_load = i;
                                } else if (avg_load == min_avg_chan_utilization && total_num_ap <
-                                          ch_info[ch_idx_min_load].num_ap + ch_info[ch_idx_min_load + 1].num_ap) {
+                                          (ch_info[ch_idx_min_load].num_ap + ch_info[ch_idx_min_load + 1].num_ap +
+                                               ch_info[ch_idx_min_load + 2].num_ap +
+                                               ch_info[ch_idx_min_load + 3].num_ap)) {
                                        ch_idx_min_load = i;
                                }
                                if (total_num_ap < min_num_ap) {
                                        min_num_ap = total_num_ap;
                                        ch_idx_min_ap = i;
                                }
-                       } else {
-                               SLSI_DBG3(sdev, SLSI_MLME, "Invalid channels: %d, %d\n", ch_info[i].chan,
-                                         ch_info[i + 1].chan); /*will remove after testing */
                        }
                }
-               if (all_bss_load || min_avg_chan_utilization <= 256) {
+               if (all_bss_load || min_avg_chan_utilization <= 512) {
                        acs_selected_channels->pri_channel = ch_info[ch_idx_min_load].chan;
-                       acs_selected_channels->sec_channel = ch_info[ch_idx_min_load + 1].chan;
-               } else if (none_bss_load || min_avg_chan_utilization > 256) {
+                       acs_selected_channels->vht_seg0_center_ch = ch_info[ch_idx_min_load].chan + 6;
+               } else if (none_bss_load || min_avg_chan_utilization > 512) {
                        acs_selected_channels->pri_channel = ch_info[ch_idx_min_ap].chan;
-                       acs_selected_channels->sec_channel = ch_info[ch_idx_min_ap + 1].chan;
+                       acs_selected_channels->vht_seg0_center_ch = ch_info[ch_idx_min_ap].chan + 6;
                }
-       } else if (acs_selected_channels->ch_width == 80) {
+
+               if (!acs_selected_channels->pri_channel)
+                       acs_selected_channels->ch_width = 40;
+       }
+
+       if (acs_selected_channels->ch_width == 40) {
                for (i = 0; i < ch_list_len; i++) {
-                       if (i + 3 >= ch_list_len)
-                               continue;
-                       if (!ch_info[i].chan || !ch_info[i + 1].chan || !ch_info[i + 2].chan || !ch_info[i + 3].chan)
+                       if (!ch_info[i].chan || i + 1 >= ch_list_len || !ch_info[i + 1].chan)
                                continue;
-                       if (slsi_is_80mhz_5gchan(ch_info[i].chan, ch_info[i + 3].chan)) {
-                               avg_load = ch_info[i].avg_chan_utilization + ch_info[i + 1].avg_chan_utilization +
-                                          ch_info[i + 2].avg_chan_utilization + ch_info[i + 3].avg_chan_utilization;
-                               total_num_ap = ch_info[i].num_ap + ch_info[i + 1].num_ap + ch_info[i + 2].num_ap +
-                                              ch_info[i + 3].num_ap;
+                       if (slsi_is_40mhz_5gchan(ch_info[i].chan, ch_info[i + 1].chan)) {
+                               avg_load = ch_info[i].avg_chan_utilization + ch_info[i + 1].avg_chan_utilization;
+                               total_num_ap = ch_info[i].num_ap + ch_info[i + 1].num_ap;
                                if (avg_load < min_avg_chan_utilization) {
                                        min_avg_chan_utilization = avg_load;
                                        ch_idx_min_load = i;
                                } else if (avg_load == min_avg_chan_utilization && total_num_ap <
-                                          (ch_info[ch_idx_min_load].num_ap + ch_info[ch_idx_min_load + 1].num_ap +
-                                           ch_info[ch_idx_min_load + 2].num_ap +
-                                           ch_info[ch_idx_min_load + 3].num_ap)) {
+                                          ch_info[ch_idx_min_load].num_ap + ch_info[ch_idx_min_load + 1].num_ap) {
                                        ch_idx_min_load = i;
                                }
                                if (total_num_ap < min_num_ap) {
                                        min_num_ap = total_num_ap;
                                        ch_idx_min_ap = i;
                                }
-                       } else {
-                               SLSI_DBG3(sdev, SLSI_MLME, "Invalid channels: %d, %d\n", ch_info[i].chan,
-                                         ch_info[i + 3].chan);      /*will remove after testing */
                        }
                }
-               if (all_bss_load || min_avg_chan_utilization <= 512) {
+               if (all_bss_load || min_avg_chan_utilization <= 256) {
                        acs_selected_channels->pri_channel = ch_info[ch_idx_min_load].chan;
-                       acs_selected_channels->vht_seg0_center_ch = ch_info[ch_idx_min_load].chan + 6;
-               } else if (none_bss_load || min_avg_chan_utilization > 512) {
+                       acs_selected_channels->sec_channel = ch_info[ch_idx_min_load + 1].chan;
+               } else if (none_bss_load || min_avg_chan_utilization > 256) {
                        acs_selected_channels->pri_channel = ch_info[ch_idx_min_ap].chan;
-                       acs_selected_channels->vht_seg0_center_ch = ch_info[ch_idx_min_ap].chan + 6;
+                       acs_selected_channels->sec_channel = ch_info[ch_idx_min_ap + 1].chan;
                }
+
+               if (!acs_selected_channels->pri_channel)
+                       acs_selected_channels->ch_width = 20;
+       }
+
+       if (acs_selected_channels->ch_width == 20) {
+               if (all_bss_load || min_avg_chan_utilization_20 < 128)
+                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_load_20].chan;
+               else if (none_bss_load || min_avg_chan_utilization_20 >= 128)
+                       acs_selected_channels->pri_channel = ch_info[ch_idx_min_ap_20].chan;
        }
        return ret;
 }
@@ -903,7 +875,6 @@ next_scan:
        }
        SLSI_MUTEX_UNLOCK(ndev_vif->scan_result_mutex);
        slsi_skb_queue_purge(&unique_scan_results);
-       SLSI_DBG3(sdev, SLSI_MLME, "slsi_acs_scan_results Received end point\n");      /*will remove after testing */
        return ch_info;
 }
 
index 24a0b8b0d0710d55a4eaf2ed2b182f37ea2eac97..a8a7a5f1902af9842ab5e63876e750f9cd5a8348 100755 (executable)
@@ -82,8 +82,10 @@ static int slsi_tx_eapol(struct slsi_dev *sdev, struct net_device *dev, struct s
                        }
                } else {
                        msg_type = FAPI_MESSAGETYPE_EAP_MESSAGE;
-                       if ((skb->len + sizeof(struct ethhdr)) >= 5)
+                       if ((skb->len - sizeof(struct ethhdr)) >= 5)
                                eapol = skb->data + sizeof(struct ethhdr);
+
+                       dwell_time = 0;
                        if (eapol && eapol[SLSI_EAPOL_IEEE8021X_TYPE_POS] == SLSI_IEEE8021X_TYPE_EAP_PACKET) {
                                if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_REQUEST)
                                        SLSI_INFO(sdev, "Send EAP-Request\n");
@@ -93,8 +95,16 @@ static int slsi_tx_eapol(struct slsi_dev *sdev, struct net_device *dev, struct s
                                        SLSI_INFO(sdev, "Send EAP-Success\n");
                                else if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_FAILURE)
                                        SLSI_INFO(sdev, "Send EAP-Failure\n");
+
+                               /*Identify WPS_START & M1-M7 and set dwell time to 100ms */
+                               if (eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_REQUEST ||
+                                   eapol[SLSI_EAP_CODE_POS] == SLSI_EAP_PACKET_RESPONSE)
+                                       if (eapol[SLSI_EAP_TYPE_POS] == SLSI_EAP_TYPE_EXPANDED &&
+                                           ((eapol[SLSI_EAP_OPCODE_POS] == SLSI_EAP_OPCODE_WSC_MSG &&
+                                           eapol[SLSI_EAP_MSGTYPE_POS] != SLSI_EAP_MSGTYPE_M8) ||
+                                           eapol[SLSI_EAP_OPCODE_POS] == SLSI_EAP_OPCODE_WSC_START))
+                                               dwell_time = SLSI_EAP_WPS_DWELL_TIME;
                        }
-                       dwell_time = 0;
                }
        break;
        case ETH_P_WAI:
@@ -576,10 +586,12 @@ int slsi_tx_control(struct slsi_dev *sdev, struct net_device *dev, struct sk_buf
 
                SLSI_NET_ERR(dev, "%s (signal %d)\n", res == -ENOSPC ? "Queue is full. Flow control" : "Failed to transmit", fapi_get_sigid(skb));
 
-               snprintf(reason, sizeof(reason), "Failed to transmit signal 0x%04X (err:%d)", fapi_get_sigid(skb), res);
-               slsi_sm_service_failed(sdev, reason);
+               if (!in_interrupt()) {
+                       snprintf(reason, sizeof(reason), "Failed to transmit signal 0x%04X (err:%d)", fapi_get_sigid(skb), res);
+                       slsi_sm_service_failed(sdev, reason);
 
-               res = -EIO;
+                       res = -EIO;
+               }
        }
 exit:
        return res;
index a27e635bca33feb08b7e560e58bc5e562ff5825e..9574cd19432aba3472128b0f2cbc60cba958d86b 100644 (file)
@@ -10,7 +10,7 @@
 #define SCSC_RELEASE_SOLUTION "mx250"
 
 #define SCSC_RELEASE_PRODUCT 6
-#define SCSC_RELEASE_ITERATION 62
+#define SCSC_RELEASE_ITERATION 63
 #define SCSC_RELEASE_CANDIDATE 1
 
 #define SCSC_RELEASE_POINT 0