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
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)
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;
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;
return ret;
}
+#endif
static void mxman_stop(struct mxman *mxman);
static void print_mailboxes(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;
}
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);
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);
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");
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);
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;
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)
{
#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
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);
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
} 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;
"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);
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 |
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
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;
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)
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;
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;
}
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;
}
}
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;
}
}
} 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");
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:
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;
#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