Disable mesh autostart: mesh will be controlled by the host via iwpriv mesh_start and mesh_stop commands. Bump driver version number (for Marvell QA use).
Signed-off-by: Javier Cardona <[EMAIL PROTECTED]> --- drivers/net/wireless/libertas/assoc.c | 16 ++++++ drivers/net/wireless/libertas/cmd.c | 32 ++++++++++++ drivers/net/wireless/libertas/cmdresp.c | 38 +++++++++++--- drivers/net/wireless/libertas/dev.h | 2 + drivers/net/wireless/libertas/host.h | 3 + drivers/net/wireless/libertas/hostcmd.h | 10 ++++ drivers/net/wireless/libertas/if_usb.c | 26 ---------- drivers/net/wireless/libertas/ioctl.c | 83 +++++++++++++++++++++++++++++- drivers/net/wireless/libertas/join.c | 38 +++++++++++--- drivers/net/wireless/libertas/main.c | 68 ++------------------------ drivers/net/wireless/libertas/wext.c | 3 + drivers/net/wireless/libertas/wext.h | 3 + 12 files changed, 213 insertions(+), 109 deletions(-) diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index ffeec2f..01913e9 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c @@ -13,6 +13,8 @@ static const u8 bssid_any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; static const u8 bssid_off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +extern int libertas_mesh_config(wlan_private * priv, int action, int channel, + char *str); static void print_assoc_req(const char * extra, struct assoc_request * assoc_req) { @@ -211,9 +213,16 @@ static int assoc_helper_channel(wlan_private *priv, { wlan_adapter *adapter = priv->adapter; int ret = 0; + int restart_mesh = 0; lbs_deb_enter(LBS_DEB_ASSOC); + if (adapter->mesh_connect_status == LIBERTAS_CONNECTED) { + libertas_mesh_config(priv, 0, adapter->curbssparams.channel, + NULL); + restart_mesh = 1; + } + ret = update_channel(priv); if (ret < 0) { lbs_deb_assoc("ASSOC: channel: error getting channel."); @@ -225,11 +234,13 @@ static int assoc_helper_channel(wlan_private *priv, lbs_deb_assoc("ASSOC: channel: %d -> %d\n", adapter->curbssparams.channel, assoc_req->channel); + ret = libertas_prepare_and_send_command(priv, CMD_802_11_RF_CHANNEL, CMD_OPT_802_11_RF_CHANNEL_SET, CMD_OPTION_WAITFORRSP, 0, &assoc_req->channel); if (ret < 0) { lbs_deb_assoc("ASSOC: channel: error setting channel."); + lbs_pr_alert("Warning: error setting channel."); } ret = update_channel(priv); @@ -256,6 +267,11 @@ static int assoc_helper_channel(wlan_private *priv, set_bit(ASSOC_FLAG_SSID, &assoc_req->flags); done: + if (restart_mesh == 1) { + libertas_mesh_config(priv, 1, adapter->curbssparams.channel, + adapter->meshid); + } + lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret); return ret; } diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 50747fa..5c9260c 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c @@ -901,6 +901,34 @@ static int wlan_cmd_mesh_access(wlan_private * priv, return 0; } +static int wlan_cmd_mesh_config(wlan_private * priv, + struct cmd_ds_command *cmd, + u16 cmd_action, void *pdata_buf) +{ + struct cmd_ds_mesh_config *pmconf = &cmd->params.mesh_config; + struct cmd_ds_mesh_config *pmesh_config; + lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action); + pmesh_config = pdata_buf; + pmconf->action = cpu_to_le16(pmesh_config->action); + pmconf->channel = cpu_to_le16(pmesh_config->channel); + pmconf->type = cpu_to_le16(pmesh_config->type); + pmconf->length = cpu_to_le16(pmesh_config->length); + + /* Set fixed field variables in scan command */ + memcpy(&pmconf->data[0], &pmesh_config->data[0], pmconf->length); + cmd->command = cpu_to_le16(CMD_MESH_CONFIG); + + /* size is equal to the sizeof(fixed portions) + the TLV len + header */ + cmd->size = cpu_to_le16(sizeof(pmconf->action) + sizeof(pmconf->channel) + + sizeof(pmconf->type) + sizeof(pmconf->length) + + pmconf->length + S_DS_GEN); + + lbs_deb_leave(LBS_DEB_CMD); + return 0; + +} + + static int wlan_cmd_set_boot2_ver(wlan_private * priv, struct cmd_ds_command *cmd, u16 cmd_action, void *pdata_buf) @@ -1467,6 +1495,10 @@ struct cmd_ctrl_node *libertas_prepare_command(wlan_private * priv, ret = wlan_cmd_mesh_access(priv, cmdptr, cmd_action, pdata_buf); break; + case CMD_MESH_CONFIG: + ret = wlan_cmd_mesh_config(priv, cmdptr, cmd_action, pdata_buf); + break; + case CMD_SET_BOOT2_VER: ret = wlan_cmd_set_boot2_ver(priv, cmdptr, cmd_action, pdata_buf); break; diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c index dd1e188..ae6b0f1 100644 --- a/drivers/net/wireless/libertas/cmdresp.c +++ b/drivers/net/wireless/libertas/cmdresp.c @@ -426,8 +426,15 @@ static int wlan_ret_802_11_rf_channel(wlan_private * priv, u16 action = le16_to_cpu(rfchannel->action); u16 newchannel = le16_to_cpu(rfchannel->currentchannel); + u16 result = le16_to_cpu(resp->result); + lbs_deb_enter(LBS_DEB_CMD); + if (result) { + lbs_pr_alert("Warning: channel change failed!\n"); + return 0; + } + if (action == CMD_OPT_802_11_RF_CHANNEL_GET && adapter->curbssparams.channel != newchannel) { lbs_deb_cmd("channel switch from %d to %d\n", @@ -553,7 +560,7 @@ static inline int handle_cmd_response(u16 respcmd, struct cmd_ds_command *resp, wlan_private *priv) { - int ret = 0; + int ret = 0, l = 0; unsigned long flags; wlan_adapter *adapter = priv->adapter; @@ -717,6 +724,28 @@ static inline int handle_cmd_response(u16 respcmd, memcpy(adapter->cur_cmd->pdata_buf, &resp->params.mesh, sizeof(resp->params.mesh)); break; + case CMD_RET(CMD_MESH_CONFIG): + if (resp->params.mesh_config.action == 1) { + priv->adapter->mesh_connect_status = LIBERTAS_CONNECTED; + netif_carrier_on(priv->mesh_dev); + netif_wake_queue(priv->mesh_dev); + lbs_pr_alert("mesh_start: mesh started on channel %d\n", + resp->params.mesh_config.channel); + adapter->curbssparams.channel = + le16_to_cpu(resp->params.mesh_config.channel); + for (l = 0; l < resp->params.mesh_config.length; ++l) + adapter->meshid[l] = + resp->params.mesh_config.data[l]; + adapter->meshid[resp->params.mesh_config.length] = '\0'; + adapter->meshid_length = strlen(adapter->meshid); + } else if (resp->params.mesh_config.action == 0) { + priv->adapter->mesh_connect_status = + LIBERTAS_DISCONNECTED; + netif_stop_queue(priv->mesh_dev); + netif_carrier_off(priv->mesh_dev); + } + break; + case CMD_RET(CMD_802_11_BEACON_CTRL): ret = wlan_ret_802_11_bcn_ctrl(priv, resp); break; @@ -987,12 +1016,7 @@ int libertas_process_event(wlan_private * priv) lbs_pr_alert("EVENT: Wireless firmware ready\n"); break; case MACREG_INT_CODE_MESH_AUTO_STARTED: - /* Ignore spurious autostart events if autostart is disabled */ - if (!priv->mesh_autostart_enabled) { - lbs_pr_info("EVENT: MESH_AUTO_STARTED (ignoring)\n"); - break; - } - lbs_pr_info("EVENT: MESH_AUTO_STARTED\n"); + lbs_pr_info("EVENT: Mesh Started\n"); adapter->mesh_connect_status = LIBERTAS_CONNECTED; if (priv->mesh_open == 1) { netif_wake_queue(priv->mesh_dev); diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h index 404ca50..7d9633c 100644 --- a/drivers/net/wireless/libertas/dev.h +++ b/drivers/net/wireless/libertas/dev.h @@ -374,6 +374,8 @@ struct _wlan_adapter { u8 fw_ready; u8 last_scanned_channel; + u16 meshid_length; + u8 meshid[IW_ESSID_MAX_SIZE + 1]; }; #endif /* _WLAN_DEV_H_ */ diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h index 2150ea0..c976198 100644 --- a/drivers/net/wireless/libertas/host.h +++ b/drivers/net/wireless/libertas/host.h @@ -117,6 +117,8 @@ #define CMD_MESH_ACCESS 0x009b +#define CMD_MESH_CONFIG 0x00a3 + #define CMD_SET_BOOT2_VER 0x00a5 #define CMD_802_11_BEACON_CTRL 0x00b0 @@ -266,6 +268,7 @@ enum cmd_mesh_access_opts { CMD_ACT_MESH_GET_ROUTE_EXP, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, CMD_ACT_MESH_GET_AUTOSTART_ENABLED, + CMD_ACT_MESH_START, }; /** Card Event definition */ diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h index 7865746..3fadb44 100644 --- a/drivers/net/wireless/libertas/hostcmd.h +++ b/drivers/net/wireless/libertas/hostcmd.h @@ -616,6 +616,15 @@ struct cmd_ds_mesh_access { __le32 data[32]; /* last position reserved */ } __attribute__ ((packed)); +struct cmd_ds_mesh_config { + u16 action; + u16 channel; + u16 type; + u16 length; + u8 data[128]; /* last position reserved */ +} __attribute__ ((packed)); + + /* Number of stats counters returned by the firmware */ #define MESH_STATS_NUM 8 @@ -678,6 +687,7 @@ struct cmd_ds_command { struct cmd_ds_bt_access bt; struct cmd_ds_fwt_access fwt; struct cmd_ds_mesh_access mesh; + struct cmd_ds_mesh_config mesh_config; struct cmd_ds_set_boot2_ver boot2_ver; struct cmd_ds_get_tsf gettsf; struct cmd_ds_802_11_subscribe_event subscribe_event; diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c index 740065b..09c8537 100644 --- a/drivers/net/wireless/libertas/if_usb.c +++ b/drivers/net/wireless/libertas/if_usb.c @@ -1055,19 +1055,6 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message) /* Unlink TX URB */ usb_kill_urb(cardp->tx_urb); - if (priv->mesh_dev && !priv->mesh_autostart_enabled) { - /* Mesh autostart must be activated while sleeping - * On resume it will go back to the current state - */ - struct cmd_ds_mesh_access mesh_access; - memset(&mesh_access, 0, sizeof(mesh_access)); - mesh_access.data[0] = cpu_to_le32(1); - libertas_download_command(priv, - CMD_MESH_ACCESS, - CMD_ACT_MESH_SET_AUTOSTART_ENABLED, - (void *)&mesh_access); - } - ret = libertas_download_command(priv, CMD_802_11_HOST_SLEEP_CFG, CMD_ACT_SET, (void *)&config); @@ -1110,19 +1097,6 @@ static int if_usb_resume(struct usb_interface *intf) if_usb_submit_rx_urb(cardp->priv); - if (priv->mesh_dev && !priv->mesh_autostart_enabled) { - /* Mesh autostart was activated while sleeping - * Disable it if appropriate - */ - struct cmd_ds_mesh_access mesh_access; - memset(&mesh_access, 0, sizeof(mesh_access)); - mesh_access.data[0] = cpu_to_le32(0); - libertas_download_command(priv, - CMD_MESH_ACCESS, - CMD_ACT_MESH_SET_AUTOSTART_ENABLED, - (void *)&mesh_access); - } - netif_device_attach(cardp->eth_dev); netif_device_attach(priv->mesh_dev); diff --git a/drivers/net/wireless/libertas/ioctl.c b/drivers/net/wireless/libertas/ioctl.c index 3ededab..dcc296b 100644 --- a/drivers/net/wireless/libertas/ioctl.c +++ b/drivers/net/wireless/libertas/ioctl.c @@ -27,6 +27,9 @@ #define WAIT_FOR_SCAN_RRESULT_MAX_TIME (10 * HZ) +int libertas_mesh_config(wlan_private * priv, int action, int channel, + char *str); + static int libertas_set_region(wlan_private * priv, u16 region_code) { int i; @@ -816,7 +819,6 @@ static int libertas_fwt_time_ioctl(wlan_private * priv, struct ifreq *req) return 0; } - /** * @brief Manages all mesh related ioctls * @param priv A pointer to wlan_private structure @@ -832,14 +834,39 @@ static int libertas_mesh_ioctl(wlan_private * priv, struct iwreq * wrq, { struct cmd_ds_mesh_access mesh_access; int parameter; - char str[128]; + char str[128], chan[3]; char *ptr = str; - int ret, i; + int ret, i, channel, count = 0; lbs_deb_enter(LBS_DEB_IOCTL); memset(&mesh_access, 0, sizeof(mesh_access)); + if (subcmd == CMD_ACT_MESH_START) { + if (priv->adapter->mesh_connect_status == LIBERTAS_CONNECTED) { + lbs_pr_alert("mesh_start: Mesh is already running!\n"); + return 0; + } + if (wrq->u.data.length <= 1) { + channel = priv->adapter->curbssparams.channel; + ret = libertas_mesh_config(priv, 1, channel, + "olpc_mesh"); + + } else { + if (copy_from_user(str, wrq->u.data.pointer, + wrq->u.data.length)) + return -EFAULT; + while (*ptr++ != ' ') { + if (*ptr == '\0') break; + chan[count] = str[count]; + count++; + } + chan[count] = '\0'; + channel = simple_strtol(chan, (char **)NULL, 10); + ret = libertas_mesh_config (priv, 1, channel, ptr); + } + return ret; + } if (cmd == LIBERTAS_SETONEINT_GETNONE) { parameter = SUBCMD_DATA(wrq); @@ -1101,6 +1128,7 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) wlan_private *priv = dev->priv; wlan_adapter *adapter = priv->adapter; struct iwreq *wrq = (struct iwreq *)req; + char str[32]; lbs_deb_enter(LBS_DEB_IOCTL); @@ -1114,6 +1142,25 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) case LIBERTAS_SUBCMD_FWT_RESET: libertas_fwt_reset_ioctl(priv); break; + case LIBERTAS_SUBCMD_MESH_STOP: + if (priv->adapter->mesh_connect_status == + LIBERTAS_DISCONNECTED) { + lbs_pr_alert("mesh_stop: Mesh already off!\n"); + } else + libertas_mesh_config(priv, 0, + adapter->curbssparams.channel, NULL); + break; + case LIBERTAS_SUBCMD_GET_MESH_STATUS: + if (priv->adapter->mesh_connect_status == + LIBERTAS_CONNECTED) { + strcpy(str, adapter->meshid); + lbs_pr_alert("mesh_status: mesh ON channel = %d" + " Mesh ID = %s \n", + adapter->curbssparams.channel, + str); + } else + lbs_pr_alert("mesh_status: mesh OFF\n"); + break; } break; @@ -1147,6 +1194,7 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) } break; + case LIBERTAS_SET128CHAR_GET128CHAR: switch ((int)wrq->u.data.flags) { case LIBERTAS_SUBCMD_BT_ADD: @@ -1184,6 +1232,10 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) ret = libertas_mesh_ioctl(priv, wrq, cmd, CMD_ACT_MESH_GET_LINK_COSTS); break; + case LIBERTAS_SUBCMD_MESH_START: + ret = libertas_mesh_ioctl(priv, wrq, cmd, + CMD_ACT_MESH_START); + break; } break; @@ -1246,4 +1298,29 @@ int libertas_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) return ret; } +int libertas_mesh_config(wlan_private * priv, int action, int channel, + char *str) +{ + struct cmd_ds_mesh_config mesh_config; + int ret; + memset(&mesh_config, 0, sizeof(mesh_config)); + mesh_config.action = cpu_to_le16(action); + mesh_config.channel = cpu_to_le16(channel); + mesh_config.type = cpu_to_le16(0x100 + 37) ; + + if (str != NULL) { + mesh_config.length = cpu_to_le16(strlen(str)); + memcpy(&mesh_config.data[0], str, strlen(str)); + } else + mesh_config.length = 0; + + ret = libertas_prepare_and_send_command(priv, CMD_MESH_CONFIG, 0, + CMD_OPTION_WAITFORRSP, 0, + (void *)&mesh_config); + + return ret; +} + + + diff --git a/drivers/net/wireless/libertas/join.c b/drivers/net/wireless/libertas/join.c index 5447407..6949eda 100644 --- a/drivers/net/wireless/libertas/join.c +++ b/drivers/net/wireless/libertas/join.c @@ -426,9 +426,6 @@ int libertas_cmd_80211_associate(wlan_private * priv, rates->header.len = cpu_to_le16(tmplen); lbs_deb_join("ASSOC_CMD: num rates = %u\n", tmplen); - /* Copy the infra. association rates into Current BSS state structure */ - memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates)); - memcpy(&adapter->curbssparams.rates, &rates->rates, tmplen); /* Set MSB on basic rates as the firmware requires, but _after_ * copying to current bss rates. @@ -447,8 +444,6 @@ int libertas_cmd_80211_associate(wlan_private * priv, pos += sizeof(rsn->header) + tmplen; } - /* update curbssparams */ - adapter->curbssparams.channel = bss->phyparamset.dsparamset.currentchan; if (libertas_parse_dnld_countryinfo_11d(priv, bss)) { ret = -1; @@ -635,7 +630,6 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv, /* probedelay */ join_cmd->probedelay = cpu_to_le16(CMD_SCAN_PROBE_DELAY_TIME); - adapter->curbssparams.channel = bss->channel; /* Copy Data rates from the rates recorded in scan response */ memset(join_cmd->bss.rates, 0, sizeof(join_cmd->bss.rates)); @@ -647,9 +641,7 @@ int libertas_cmd_80211_ad_hoc_join(wlan_private * priv, goto done; } - /* Copy the ad-hoc creating rates into Current BSS state structure */ - memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates)); - memcpy(&adapter->curbssparams.rates, join_cmd->bss.rates, ratesize); + /* Set MSB on basic rates as the firmware requires, but _after_ * copying to current bss rates. @@ -719,6 +711,7 @@ int libertas_ret_80211_associate(wlan_private * priv, lbs_deb_join("ASSOC_RESP: Association failed, status code = %d\n", le16_to_cpu(passocrsp->statuscode)); + lbs_pr_alert("Warning: INFRA Join Failed\n"); ret = -1; goto done; @@ -738,6 +731,14 @@ int libertas_ret_80211_associate(wlan_private * priv, adapter->curbssparams.ssid_len = bss->ssid_len; memcpy(adapter->curbssparams.bssid, bss->bssid, ETH_ALEN); + /* update curbssparams */ + adapter->curbssparams.channel = bss->phyparamset.dsparamset.currentchan; + + /* Copy the infra. association rates into Current BSS state structure */ + memset(&adapter->curbssparams.rates, 0, + sizeof(adapter->curbssparams.rates)); + memcpy(&adapter->curbssparams.rates, &bss->rates, sizeof(bss->rates)); + lbs_deb_join("ASSOC_RESP: currentpacketfilter is %x\n", adapter->currentpacketfilter); @@ -820,6 +821,16 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv, lbs_deb_join("ADHOC_RESP: associated to '%s'\n", escape_essid(bss->ssid, bss->ssid_len)); + if (padhocresult->pad[0] == 8) { + if (command == CMD_RET(CMD_802_11_AD_HOC_START)) { + lbs_pr_alert("Warning: ADHOC Started on channel " + "%d\n", adapter->curbssparams.channel); + } else { + lbs_pr_alert("Warning: ADHOC Join Failed\n"); + goto done; + } + } + /* Send a Media Connected event, according to the Spec */ adapter->connect_status = LIBERTAS_CONNECTED; @@ -835,6 +846,15 @@ int libertas_ret_80211_ad_hoc_start(wlan_private * priv, memcpy(&adapter->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE); adapter->curbssparams.ssid_len = bss->ssid_len; + if (bss->channel != 0) + adapter->curbssparams.channel = bss->channel; + + /* Copy the ad-hoc creating rates into Current BSS state structure */ + memset(&adapter->curbssparams.rates, 0, + sizeof(adapter->curbssparams.rates)); + memcpy(&adapter->curbssparams.rates, bss->rates, + sizeof(adapter->curbssparams.rates)); + netif_carrier_on(priv->dev); netif_wake_queue(priv->dev); diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 2b104d2..dd4ae32 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c @@ -26,11 +26,11 @@ #include "join.h" #define DRIVER_RELEASE_VERSION "322.p1" -const char libertas_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION +const char libertas_driver_version[] = "MRVL-USB8388-" DRIVER_RELEASE_VERSION #ifdef DEBUG - "-dbg" + "" #endif - ""; + "-1"; /* Module parameters */ @@ -315,48 +315,8 @@ static DEVICE_ATTR(libertas_rtap, 0644, libertas_rtap_get, */ static DEVICE_ATTR(anycast_mask, 0644, libertas_anycast_get, libertas_anycast_set); -static ssize_t libertas_autostart_enabled_get(struct device * dev, - struct device_attribute *attr, char * buf) -{ - struct cmd_ds_mesh_access mesh_access; - - memset(&mesh_access, 0, sizeof(mesh_access)); - libertas_prepare_and_send_command(to_net_dev(dev)->priv, - CMD_MESH_ACCESS, - CMD_ACT_MESH_GET_AUTOSTART_ENABLED, - CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access); - - return sprintf(buf, "%d\n", le32_to_cpu(mesh_access.data[0])); -} - -static ssize_t libertas_autostart_enabled_set(struct device * dev, - struct device_attribute *attr, const char * buf, size_t count) -{ - struct cmd_ds_mesh_access mesh_access; - uint32_t datum; - wlan_private * priv = (to_net_dev(dev))->priv; - int ret; - - memset(&mesh_access, 0, sizeof(mesh_access)); - sscanf(buf, "%d", &datum); - mesh_access.data[0] = cpu_to_le32(datum); - - ret = libertas_prepare_and_send_command(priv, - CMD_MESH_ACCESS, - CMD_ACT_MESH_SET_AUTOSTART_ENABLED, - CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access); - if (ret == 0) - priv->mesh_autostart_enabled = datum ? 1 : 0; - - return strlen(buf); -} - -static DEVICE_ATTR(autostart_enabled, 0644, - libertas_autostart_enabled_get, libertas_autostart_enabled_set); - static struct attribute *libertas_mesh_sysfs_entries[] = { &dev_attr_anycast_mask.attr, - &dev_attr_autostart_enabled.attr, NULL, }; @@ -438,12 +398,7 @@ static int libertas_mesh_open(struct net_device *dev) if (pre_open_check(dev) == -1) return -1; priv->mesh_open = 1 ; - netif_wake_queue(priv->mesh_dev); - priv->adapter->mesh_connect_status = LIBERTAS_CONNECTED; - - netif_carrier_on(priv->mesh_dev); - netif_wake_queue(priv->mesh_dev); if (priv->infra_open == 0) return libertas_dev_open(priv->dev) ; return 0; @@ -948,7 +903,6 @@ static int wlan_setup_station_hw(wlan_private * priv) { int ret = -1; wlan_adapter *adapter = priv->adapter; - struct cmd_ds_mesh_access mesh_access; lbs_deb_enter(LBS_DEB_FW); @@ -985,21 +939,6 @@ static int wlan_setup_station_hw(wlan_private * priv) goto done; } - /* Disable mesh autostart */ - if (priv->mesh_dev) { - memset(&mesh_access, 0, sizeof(mesh_access)); - mesh_access.data[0] = cpu_to_le32(0); - ret = libertas_prepare_and_send_command(priv, - CMD_MESH_ACCESS, - CMD_ACT_MESH_SET_AUTOSTART_ENABLED, - CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access); - if (ret) { - ret = -1; - goto done; - } - priv->mesh_autostart_enabled = 0; - } - /* Set the boot2 version in firmware */ ret = libertas_prepare_and_send_command(priv, CMD_SET_BOOT2_VER, 0, CMD_OPTION_WAITFORRSP, 0, NULL); @@ -1115,6 +1054,7 @@ static void wlan_init_adapter(wlan_private * priv) adapter->connect_status = LIBERTAS_DISCONNECTED; adapter->mesh_connect_status = LIBERTAS_DISCONNECTED; + adapter->meshid_length = 0; memset(adapter->current_addr, 0xff, ETH_ALEN); /* 802.11 specific */ diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c index 11f9389..77ebeaf 100644 --- a/drivers/net/wireless/libertas/wext.c +++ b/drivers/net/wireless/libertas/wext.c @@ -831,6 +831,8 @@ static const struct iw_priv_args wlan_private_args[] = { { LIBERTAS_SETNONE_GETNONE, 0, 0, "" }, { LIBERTAS_SUBCMD_FWT_RESET, 0, 0, "fwt_reset"}, { LIBERTAS_SUBCMD_BT_RESET, 0, 0, "bt_reset"}, + { LIBERTAS_SUBCMD_MESH_STOP, 0, 0, "mesh_stop"}, + { LIBERTAS_SUBCMD_GET_MESH_STATUS, 0, 0, "mesh_status"}, { LIBERTAS_SETNONE_GETONEINT, 0, INT_PARAM, ""}, { LIBERTAS_SUBCMD_GET_REGION, 0, INT_PARAM, "getregioncode"}, { LIBERTAS_SUBCMD_FWT_CLEANUP, 0, INT_PARAM, "fwt_cleanup"}, @@ -859,6 +861,7 @@ static const struct iw_priv_args wlan_private_args[] = { { LIBERTAS_SUBCMD_FWT_LIST_ROUTE, CHAR128_PARAM, CHAR128_PARAM, "fwt_list_route"}, { LIBERTAS_SUBCMD_MESH_SET_LINK_COSTS, CHAR128_PARAM, CHAR128_PARAM, "set_link_costs"}, { LIBERTAS_SUBCMD_MESH_GET_LINK_COSTS, CHAR128_PARAM, CHAR128_PARAM, "get_link_costs"}, + { LIBERTAS_SUBCMD_MESH_START, CHAR128_PARAM, CHAR128_PARAM, "mesh_start"}, { LIBERTAS_SET_GET_SIXTEEN_INT, INT16_PARAM, INT16_PARAM, ""}, { LIBERTAS_LED_GPIO_CTRL, INT16_PARAM, INT16_PARAM, "ledgpio"}, { LIBERTAS_BCN_CTRL, INT16_PARAM, INT16_PARAM, "bcn_control"}, diff --git a/drivers/net/wireless/libertas/wext.h b/drivers/net/wireless/libertas/wext.h index e93853b..4a2c28e 100644 --- a/drivers/net/wireless/libertas/wext.h +++ b/drivers/net/wireless/libertas/wext.h @@ -14,6 +14,9 @@ #define LIBERTAS_SETNONE_GETNONE (SIOCIWFIRSTPRIV + 8) #define LIBERTAS_SUBCMD_BT_RESET 13 #define LIBERTAS_SUBCMD_FWT_RESET 14 +#define LIBERTAS_SUBCMD_MESH_START 15 +#define LIBERTAS_SUBCMD_MESH_STOP 16 +#define LIBERTAS_SUBCMD_GET_MESH_STATUS 17 #define LIBERTAS_SETNONE_GETONEINT (SIOCIWFIRSTPRIV + 15) #define LIBERTAS_SUBCMD_GET_REGION 1 -- 1.5.2.5 _______________________________________________ Devel mailing list Devel@lists.laptop.org http://lists.laptop.org/listinfo/devel