[PATCH] Implement disconnect functionality

Eugene Krasnikov k.eugene.e at gmail.com
Tue May 14 12:58:19 EDT 2013


To disconnect driver must tell hardware delete_sta,
delete_bss and then set link to idle.

Signed-off-by: Eugene Krasnikov <k.eugene.e at gmail.com>
---
 hal.h    | 16 ++++++++--------
 main.c   | 10 ++++++++--
 smd.c    | 30 ++++++++++++++++++++++++++++--
 smd.h    |  2 ++
 start.sh |  9 +++++++--
 5 files changed, 53 insertions(+), 14 deletions(-)
 mode change 100644 => 100755 start.sh

diff --git a/hal.h b/hal.h
index 241caa9..27a79b4 100644
--- a/hal.h
+++ b/hal.h
@@ -1392,16 +1392,16 @@ struct wcn36xx_hal_config_sta_rsp_msg {
 } __packed;
 
 /* Delete STA Request message */
-struct delete_sta_req_msg {
+struct wcn36xx_hal_delete_sta_req_msg {
 	struct wcn36xx_hal_msg_header header;
 
 	/* Index of STA to delete */
 	u8 sta_index;
 
-};
+} __packed;
 
 /* Delete STA Response message */
-struct delete_sta_rsp_msg {
+struct wcn36xx_hal_delete_sta_rsp_msg {
 	struct wcn36xx_hal_msg_header header;
 
 	/* success or failure */
@@ -1409,7 +1409,7 @@ struct delete_sta_rsp_msg {
 
 	/* Index of STA deleted */
 	u8 sta_id;
-};
+} __packed;
 
 /* 12 Bytes long because this structure can be used to represent rate and
  * extended rate set IEs. The parser assume this to be at least 12 */
@@ -1823,15 +1823,15 @@ struct wcn36xx_hal_config_bss_rsp_msg {
 	struct wcn36xx_hal_config_bss_rsp_params bss_rsp_params;
 } __packed;
 
-struct delete_bss_req_msg {
+struct wcn36xx_hal_delete_bss_req_msg {
 	struct wcn36xx_hal_msg_header header;
 
 	/* BSS index to be deleted */
 	u8 bss_index;
 
-};
+} __packed;
 
-struct delete_bss_rsp_msg {
+struct wcn36xx_hal_delete_bss_rsp_msg {
 	struct wcn36xx_hal_msg_header header;
 
 	/* Success or Failure */
@@ -1840,7 +1840,7 @@ struct delete_bss_rsp_msg {
 	/* BSS index that has been deleted */
 	u8 bss_index;
 
-};
+} __packed;
 
 struct wcn36xx_hal_join_req_msg {
 	struct wcn36xx_hal_msg_header header;
diff --git a/main.c b/main.c
index 6fcd8b9..c324836 100644
--- a/main.c
+++ b/main.c
@@ -197,8 +197,10 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
 
 	if(changed & BSS_CHANGED_BSSID) {
 		wcn36xx_info("wcn36xx_bss_info_changed BSS_CHANGED_BSSID=%pM", bss_conf->bssid);
-		wcn36xx_smd_join(wcn, (u8*)bss_conf->bssid, vif->addr, wcn->ch);
-		wcn36xx_smd_config_bss(wcn, true, (u8*)bss_conf->bssid, 0);
+		if(!is_zero_ether_addr(bss_conf->bssid)) {
+			wcn36xx_smd_join(wcn, (u8*)bss_conf->bssid, vif->addr, wcn->ch);
+			wcn36xx_smd_config_bss(wcn, true, (u8*)bss_conf->bssid, 0);
+		}
 	} else if (changed & BSS_CHANGED_BEACON_ENABLED){
 		if(!wcn->beacon_enable) {
 			wcn->beacon_enable = true;
@@ -305,7 +307,11 @@ static int wcn36xx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 static int wcn36xx_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 			  struct ieee80211_sta *sta)
 {
+	struct wcn36xx *wcn = hw->priv;
 	ENTER();
+	wcn36xx_smd_delete_sta(wcn);
+	wcn36xx_smd_delete_bss(wcn);
+	wcn36xx_smd_set_link_st(wcn, sta->addr, vif->addr, WCN36XX_HAL_LINK_IDLE_STATE);
 	return 0;
 }
 
diff --git a/smd.c b/smd.c
index db9a898..98b7f08 100644
--- a/smd.c
+++ b/smd.c
@@ -238,7 +238,19 @@ int wcn36xx_smd_add_sta_self(struct wcn36xx *wcn, struct mac_address addr, u32 s
 
 	return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
 }
+int wcn36xx_smd_delete_sta(struct wcn36xx *wcn)
+{
+	struct wcn36xx_hal_delete_sta_req_msg msg_body;
+
+	INIT_HAL_MSG(msg_body, WCN36XX_HAL_DELETE_STA_REQ)
+	printk("wcn36xx_smd_delete_sta %d, %d", msg_body.header.len, sizeof(msg_body));
+	msg_body.sta_index = 1;
+
+	PREPARE_HAL_BUF(wcn->smd_buf, msg_body)
 
+	return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
+
+}
 int wcn36xx_smd_join(struct wcn36xx *wcn, u8 *bssid, u8 *vif, u8 ch)
 {
 	struct wcn36xx_hal_join_req_msg msg_body;
@@ -384,6 +396,18 @@ int wcn36xx_smd_config_bss(struct wcn36xx *wcn, bool sta_mode, u8 *bssid, u8 upd
 
 	return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
 }
+int wcn36xx_smd_delete_bss(struct wcn36xx *wcn)
+{
+	struct wcn36xx_hal_delete_bss_req_msg  msg_body;
+
+	INIT_HAL_MSG(msg_body, WCN36XX_HAL_DELETE_BSS_REQ)
+
+	msg_body.bss_index = 0;
+
+	PREPARE_HAL_BUF(wcn->smd_buf, msg_body)
+
+	return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
+}
 int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct sk_buff *skb_beacon, u16 tim_off, u16 p2p_off){
 	struct wcn36xx_hal_send_beacon_req_msg msg_body;
 	INIT_HAL_MSG(msg_body, WCN36XX_HAL_SEND_BEACON_REQ)
@@ -441,15 +465,17 @@ static void wcn36xx_smd_rsp_process (void *buf, size_t len)
 		wcn36xx_smd_start_rsp(buf, len);
 		break;
 	case WCN36XX_HAL_ADD_STA_SELF_RSP:
+	case WCN36XX_HAL_DELETE_STA_RSP:
 	case WCN36XX_HAL_INIT_SCAN_RSP:
 	case WCN36XX_HAL_START_SCAN_RSP:
 	case WCN36XX_HAL_END_SCAN_RSP:
 	case WCN36XX_HAL_FINISH_SCAN_RSP:
 	case WCN36XX_HAL_DOWNLOAD_NV_RSP:
 	case WCN36XX_HAL_CONFIG_BSS_RSP:
+	case WCN36XX_HAL_DELETE_BSS_RSP:
 	case WCN36XX_HAL_CONFIG_STA_RSP:
-	case WCN36XX_HAL_SEND_BEACON_REQ:
-
+	case WCN36XX_HAL_SEND_BEACON_RSP:
+	case WCN36XX_HAL_SET_LINK_ST_RSP:
 		if(wcn36xx_smd_rsp_status_check(buf, len)) {
 			wcn36xx_error("response failed");
 		}
diff --git a/smd.h b/smd.h
index 7635cfe..ca2cbad 100644
--- a/smd.h
+++ b/smd.h
@@ -55,9 +55,11 @@ int wcn36xx_smd_end_scan(struct wcn36xx *wcn, u8 ch);
 int wcn36xx_smd_finish_scan(struct wcn36xx *wcn);
 int wcn36xx_smd_update_scan_params(struct wcn36xx *wcn);
 int wcn36xx_smd_add_sta_self(struct wcn36xx *wcn, struct mac_address addr, u32 status);
+int wcn36xx_smd_delete_sta(struct wcn36xx *wcn);
 int wcn36xx_smd_join(struct wcn36xx *wcn, u8 *bssid, u8 *vif, u8 ch);
 int wcn36xx_smd_set_link_st(struct wcn36xx *wcn, u8 *bssid, u8 *sta_mac, enum wcn36xx_hal_link_state state);
 int wcn36xx_smd_config_bss(struct wcn36xx *wcn, bool sta_mode, u8 *bssid, u8 update);
+int wcn36xx_smd_delete_bss(struct wcn36xx *wcn);
 int wcn36xx_smd_config_sta(struct wcn36xx *wcn, u8 *bssid, u16 ass_id, u8 *sta_mac);
 int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct sk_buff *skb_beacon, u16 tim_off, u16 p2p_off);
 
diff --git a/start.sh b/start.sh
old mode 100644
new mode 100755
index cbf2286..e7938be
--- a/start.sh
+++ b/start.sh
@@ -1,4 +1,5 @@
-adb shell "insmod /system/lib/modules/cfg80211.ko"
+adb shell "insmod /data/compat.ko"
+adb shell "insmod /data/cfg80211.ko"
 adb shell "insmod /data/mac80211.ko"
 adb shell "insmod /data/wcn36xx.ko"
 
@@ -19,4 +20,8 @@ adb shell "netcfg wlan0 up"
 #adb shell "iw dev wlan0 scan freq 2412"
 #adb shell "iw dev wlan0 scan"
 #adb shell "iw dev wlan0 connect kosmoskatten 2437 00:18:e7:8a:7d:9c"
-adb shell "iw dev wlan0 connect ost3 2412 00:25:9c:42:0a:bf"
+adb shell "iw dev wlan0 connect ASUS_24GHz4 2452 54:04:a6:8f:e9:ce"
+adb shell "iw dev wlan0 disconnect"
+sleep 15
+adb shell "iw dev wlan0 connect ASUS_24GHz4 2452 54:04:a6:8f:e9:ce"
+adb shell "dhcpcd wlan0"
-- 
1.7.11.3




More information about the wcn36xx mailing list