aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/cmd.c
diff options
context:
space:
mode:
authorEliad Peller <eliad@wizery.com>2011-08-14 06:17:25 -0400
committerLuciano Coelho <coelho@ti.com>2011-08-22 05:35:28 -0400
commit31cd3aed29ca7ebcdaa2570a891a3fab75fe35f6 (patch)
treea7fab9f428b62f705b95685bb08307aead781670 /drivers/net/wireless/wl12xx/cmd.c
parentb42f068baab96a899bb5488ad9f0e72b14743ec5 (diff)
wl12xx: add wl12xx_cmd_role_start_ibss()
Add wl12xx_cmd_role_start_ibss() implementation and defintion. This function is used in order to start the IBSS role. Stopping the IBSS is done by using the same api as stop STA, so there is no need for a separate function. Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx/cmd.c')
-rw-r--r--drivers/net/wireless/wl12xx/cmd.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c
index 261807b45ab5..d8c391681041 100644
--- a/drivers/net/wireless/wl12xx/cmd.c
+++ b/drivers/net/wireless/wl12xx/cmd.c
@@ -617,6 +617,7 @@ out:
617 return ret; 617 return ret;
618} 618}
619 619
620/* use this function to stop ibss as well */
620int wl12xx_cmd_role_stop_sta(struct wl1271 *wl) 621int wl12xx_cmd_role_stop_sta(struct wl1271 *wl)
621{ 622{
622 struct wl12xx_cmd_role_stop *cmd; 623 struct wl12xx_cmd_role_stop *cmd;
@@ -770,6 +771,67 @@ out:
770 return ret; 771 return ret;
771} 772}
772 773
774int wl12xx_cmd_role_start_ibss(struct wl1271 *wl)
775{
776 struct wl12xx_cmd_role_start *cmd;
777 struct ieee80211_bss_conf *bss_conf = &wl->vif->bss_conf;
778 int ret;
779
780 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
781 if (!cmd) {
782 ret = -ENOMEM;
783 goto out;
784 }
785
786 wl1271_debug(DEBUG_CMD, "cmd role start ibss %d", wl->role_id);
787
788 cmd->role_id = wl->role_id;
789 if (wl->band == IEEE80211_BAND_5GHZ)
790 cmd->band = WL12XX_BAND_5GHZ;
791 cmd->channel = wl->channel;
792 cmd->ibss.basic_rate_set = cpu_to_le32(wl->basic_rate_set);
793 cmd->ibss.beacon_interval = cpu_to_le16(wl->beacon_int);
794 cmd->ibss.dtim_interval = bss_conf->dtim_period;
795 cmd->ibss.ssid_type = WL12XX_SSID_TYPE_ANY;
796 cmd->ibss.ssid_len = wl->ssid_len;
797 memcpy(cmd->ibss.ssid, wl->ssid, wl->ssid_len);
798 memcpy(cmd->ibss.bssid, wl->bssid, ETH_ALEN);
799 cmd->sta.local_rates = cpu_to_le32(wl->rate_set);
800
801 if (wl->sta_hlid == WL12XX_INVALID_LINK_ID) {
802 ret = wl12xx_allocate_link(wl, &wl->sta_hlid);
803 if (ret)
804 goto out_free;
805 }
806 cmd->ibss.hlid = wl->sta_hlid;
807 cmd->ibss.remote_rates = cpu_to_le32(wl->rate_set);
808
809 wl1271_debug(DEBUG_CMD, "role start: roleid=%d, hlid=%d, session=%d "
810 "basic_rate_set: 0x%x, remote_rates: 0x%x",
811 wl->role_id, cmd->sta.hlid, cmd->sta.session,
812 wl->basic_rate_set, wl->rate_set);
813
814 wl1271_debug(DEBUG_CMD, "wl->bssid = %pM", wl->bssid);
815
816 ret = wl1271_cmd_send(wl, CMD_ROLE_START, cmd, sizeof(*cmd), 0);
817 if (ret < 0) {
818 wl1271_error("failed to initiate cmd role enable");
819 goto err_hlid;
820 }
821
822 goto out_free;
823
824err_hlid:
825 /* clear links on error. */
826 wl12xx_free_link(wl, &wl->sta_hlid);
827
828out_free:
829 kfree(cmd);
830
831out:
832 return ret;
833}
834
773 835
774/** 836/**
775 * send test command to firmware 837 * send test command to firmware