Commit 66df604d authored by Wen-chien Jesse Sung's avatar Wen-chien Jesse Sung Committed by Kamal Mostafa

UBUNTU: SAUCE: mwifiex: Switch WiFi LED state according to the device status

BugLink: https://launchpad.net/bugs/1512997

For Edge Gateway 5000/5100 only.

Add code for controlling WiFi LED via firmware, and turns the LED on
and off when the interface is up and down accordingly.
Signed-off-by: default avatarWen-chien Jesse Sung <jesse.sung@canonical.com>
Reviewed-By: default avatarAceLan Kao <acelan.kao@canonical.com>
Acked-by: default avatarTim Gardner <tim.gardner@canonical.com>
Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
parent 7e7375a7
......@@ -185,6 +185,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
#define TLV_TYPE_CHANNEL_STATS (PROPRIETARY_TLV_BASE_ID + 198)
#define TLV_BTCOEX_WL_AGGR_WINSIZE (PROPRIETARY_TLV_BASE_ID + 202)
#define TLV_BTCOEX_WL_SCANTIME (PROPRIETARY_TLV_BASE_ID + 203)
#define TLV_TYPE_LED_CONTROL (PROPRIETARY_TLV_BASE_ID + 205)
#define TLV_TYPE_BSS_MODE (PROPRIETARY_TLV_BASE_ID + 206)
#define MWIFIEX_TX_DATA_BUF_SIZE_2K 2048
......@@ -329,6 +330,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
#define HostCmd_CMD_802_11_AD_HOC_JOIN 0x002c
#define HostCmd_CMD_802_11_AD_HOC_STOP 0x0040
#define HostCmd_CMD_802_11_MAC_ADDRESS 0x004D
#define HostCmd_CMD_802_11_LED_CONTROL 0X004E
#define HostCmd_CMD_802_11D_DOMAIN_INFO 0x005b
#define HostCmd_CMD_802_11_KEY_MATERIAL 0x005e
#define HostCmd_CMD_802_11_BG_SCAN_QUERY 0x006c
......@@ -1080,6 +1082,16 @@ struct ieee_types_oper_mode_ntf {
u8 oper_mode;
} __packed;
struct mwifiex_led_param {
__le16 mode;
__le16 on;
} __packed;
struct mwifiex_ie_types_led_param {
struct mwifiex_ie_types_header header;
struct mwifiex_led_param led_cfg;
} __packed;
struct host_cmd_ds_802_11_ad_hoc_start {
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 bss_mode;
......@@ -1203,6 +1215,11 @@ struct host_cmd_ds_802_11_hs_cfg_enh {
} params;
} __packed;
struct host_cmd_ds_802_11_led_control {
__le16 action;
__le16 num_led;
} __packed;
enum SNMP_MIB_INDEX {
OP_RATE_SET_I = 1,
DTIM_PERIOD_I = 3,
......@@ -2171,6 +2188,7 @@ struct host_cmd_ds_command {
struct host_cmd_sdio_sp_rx_aggr_cfg sdio_rx_aggr_cfg;
struct host_cmd_ds_multi_chan_policy mc_policy;
struct host_cmd_ds_robust_coex coex;
struct host_cmd_ds_802_11_led_control led_cfg;
} params;
} __packed;
......
......@@ -674,8 +674,10 @@ static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter)
static int
mwifiex_open(struct net_device *dev)
{
netif_carrier_off(dev);
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
netif_carrier_off(dev);
mwifiex_set_led(priv->adapter, MWIFIEX_LED_ON);
return 0;
}
......@@ -695,6 +697,7 @@ mwifiex_close(struct net_device *dev)
priv->scan_aborting = true;
}
mwifiex_set_led(priv->adapter, MWIFIEX_LED_OFF);
return 0;
}
......
......@@ -115,6 +115,10 @@ enum {
#define PKT_TYPE_MGMT 0xE5
#define MWIFIEX_LED_ON 1
#define MWIFIEX_LED_OFF 0
#define MWIFIEX_LED_MAX 3
/*
* Do not check for data_received for USB, as data_received
* is handled in mwifiex_usb_recv for USB
......@@ -667,6 +671,7 @@ struct mwifiex_private {
struct mwifiex_ds_mem_rw mem_rw;
struct sk_buff_head bypass_txq;
struct mwifiex_user_scan_chan hidden_chan[MWIFIEX_USER_SCAN_CHAN_MAX];
bool is_edge_gateway;
};
......@@ -1377,6 +1382,7 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter,
struct cmd_ctrl_node *cmd_queued);
int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
struct cfg80211_ssid *req_ssid);
int mwifiex_set_led(struct mwifiex_adapter *adapter, int on);
int mwifiex_cancel_hs(struct mwifiex_private *priv, int cmd_type);
int mwifiex_enable_hs(struct mwifiex_adapter *adapter);
int mwifiex_disable_auto_ds(struct mwifiex_private *priv);
......
......@@ -17,6 +17,7 @@
* this warranty disclaimer.
*/
#include <linux/dmi.h>
#include <linux/firmware.h>
#include "decl.h"
......@@ -189,6 +190,7 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
struct pcie_service_card *card;
struct mwifiex_private *priv;
pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
pdev->vendor, pdev->device, pdev->revision);
......@@ -216,6 +218,10 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
return -1;
}
priv = mwifiex_get_priv(card->adapter, MWIFIEX_BSS_ROLE_STA);
if (dmi_match(DMI_PRODUCT_NAME, "Edge Gateway 5000") ||
dmi_match(DMI_PRODUCT_NAME, "Edge Gateway 5100"))
priv->is_edge_gateway = true;
return 0;
}
......
......@@ -393,6 +393,31 @@ mwifiex_cmd_802_11_hs_cfg(struct mwifiex_private *priv,
return 0;
}
static int mwifiex_cmd_802_11_led_cfg(struct mwifiex_private *priv,
struct host_cmd_ds_command *cmd,
u16 cmd_action,
struct mwifiex_led_param *ledcfg_param)
{
struct host_cmd_ds_802_11_led_control *led_cfg = &cmd->params.led_cfg;
struct mwifiex_ie_types_led_param *led_tlv;
u8 *pos;
cmd->command = cpu_to_le16(HostCmd_CMD_802_11_LED_CONTROL);
cmd->size = cpu_to_le16(S_DS_GEN);
le16_add_cpu(&cmd->size, sizeof(struct host_cmd_ds_802_11_led_control));
led_cfg->action = cpu_to_le16(cmd_action);
led_cfg->num_led = cpu_to_le16(MWIFIEX_LED_MAX);
pos = (u8 *)led_cfg + sizeof(struct host_cmd_ds_802_11_led_control);
led_tlv = (void *)pos;
led_tlv->header.type = cpu_to_le16(TLV_TYPE_LED_CONTROL);
led_tlv->header.len = cpu_to_le16(sizeof(struct mwifiex_led_param));
memcpy(&led_tlv->led_cfg, ledcfg_param, sizeof(struct mwifiex_led_param));
le16_add_cpu(&cmd->size, sizeof(struct mwifiex_ie_types_led_param));
return 0;
}
/*
* This function prepares command to set/get MAC address.
*
......@@ -1879,6 +1904,10 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
ret = mwifiex_cmd_802_11_hs_cfg(priv, cmd_ptr, cmd_action,
(struct mwifiex_hs_config_param *) data_buf);
break;
case HostCmd_CMD_802_11_LED_CONTROL:
ret = mwifiex_cmd_802_11_led_cfg(priv, cmd_ptr, cmd_action,
data_buf);
break;
case HostCmd_CMD_802_11_SCAN:
ret = mwifiex_cmd_802_11_scan(cmd_ptr, data_buf);
break;
......
......@@ -1238,6 +1238,8 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv, u16 cmdresp_no,
case HostCmd_CMD_ROBUST_COEX:
ret = mwifiex_ret_robust_coex(priv, resp, data_buf);
break;
case HostCmd_CMD_802_11_LED_CONTROL:
break;
default:
mwifiex_dbg(adapter, ERROR,
"CMD_RESP: unknown cmd response %#x\n",
......
......@@ -17,6 +17,8 @@
* this warranty disclaimer.
*/
#include <linux/dmi.h>
#include "decl.h"
#include "ioctl.h"
#include "util.h"
......@@ -540,6 +542,24 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter)
}
EXPORT_SYMBOL_GPL(mwifiex_enable_hs);
int mwifiex_set_led(struct mwifiex_adapter *adapter, int on)
{
struct mwifiex_private *priv;
struct mwifiex_led_param ledcfg;
priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA);
if (!priv->is_edge_gateway)
return -ENODEV;
memset(&ledcfg, 0, sizeof(struct mwifiex_led_param));
ledcfg.on = cpu_to_le16(on);
return mwifiex_send_cmd(priv,
HostCmd_CMD_802_11_LED_CONTROL,
HostCmd_ACT_GEN_SET, 0,
&ledcfg, true);
}
/*
* IOCTL request handler to get BSS information.
*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment