[Vivid][PATCH] UBUNTU: SAUCE: mwifiex: Switch WiFi LED state according to the device status

Jesse Sung jesse.sung at canonical.com
Wed Nov 4 12:45:31 UTC 2015


+ Ricardo

2015-11-04 20:27 GMT+08:00 Wen-chien Jesse Sung <jesse.sung at canonical.com>:
> 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: Wen-chien Jesse Sung <jesse.sung at canonical.com>
> Tested-by: Gavin Lin <gavin.lin at canonical.com>
> Reviewed-by: Keng-Yu Lin <kengyu at canonical.com>
> ---
>  drivers/net/wireless/mwifiex/fw.h          | 18 ++++++++++++++++++
>  drivers/net/wireless/mwifiex/main.c        |  4 ++++
>  drivers/net/wireless/mwifiex/main.h        |  6 ++++++
>  drivers/net/wireless/mwifiex/pcie.c        |  6 ++++++
>  drivers/net/wireless/mwifiex/sta_cmd.c     | 29 +++++++++++++++++++++++++++++
>  drivers/net/wireless/mwifiex/sta_cmdresp.c |  2 ++
>  drivers/net/wireless/mwifiex/sta_ioctl.c   | 20 ++++++++++++++++++++
>  7 files changed, 85 insertions(+)
>
> diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h
> index fb5936e..2bc6b93 100644
> --- a/drivers/net/wireless/mwifiex/fw.h
> +++ b/drivers/net/wireless/mwifiex/fw.h
> @@ -173,6 +173,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
>  #define TLV_TYPE_SCAN_CHANNEL_GAP   (PROPRIETARY_TLV_BASE_ID + 197)
>  #define TLV_TYPE_API_REV            (PROPRIETARY_TLV_BASE_ID + 199)
>  #define TLV_TYPE_CHANNEL_STATS      (PROPRIETARY_TLV_BASE_ID + 198)
> +#define TLV_TYPE_LED_CONTROL        (PROPRIETARY_TLV_BASE_ID + 205)
>
>  #define MWIFIEX_TX_DATA_BUF_SIZE_2K        2048
>
> @@ -313,6 +314,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
> @@ -1018,6 +1020,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;
> @@ -1126,6 +1138,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,
> @@ -1901,6 +1918,7 @@ struct host_cmd_ds_command {
>                 struct host_cmd_11ac_vht_cfg vht_cfg;
>                 struct host_cmd_ds_coalesce_cfg coalesce_cfg;
>                 struct host_cmd_ds_tdls_oper tdls_oper;
> +               struct host_cmd_ds_802_11_led_control led_cfg;
>         } params;
>  } __packed;
>
> diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
> index d4d2223..ea379f7 100644
> --- a/drivers/net/wireless/mwifiex/main.c
> +++ b/drivers/net/wireless/mwifiex/main.c
> @@ -562,7 +562,10 @@ static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter)
>  static int
>  mwifiex_open(struct net_device *dev)
>  {
> +       struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
> +
>         netif_tx_start_all_queues(dev);
> +       mwifiex_set_led(priv->adapter, MWIFIEX_LED_ON);
>         return 0;
>  }
>
> @@ -581,6 +584,7 @@ mwifiex_close(struct net_device *dev)
>                 priv->scan_aborting = true;
>         }
>
> +       mwifiex_set_led(priv->adapter, MWIFIEX_LED_OFF);
>         return 0;
>  }
>
> diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
> index e66993c..fc3a128 100644
> --- a/drivers/net/wireless/mwifiex/main.h
> +++ b/drivers/net/wireless/mwifiex/main.h
> @@ -106,6 +106,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
> @@ -582,6 +586,7 @@ struct mwifiex_private {
>         struct idr ack_status_frames;
>         /* spin lock for ack status */
>         spinlock_t ack_status_lock;
> +       bool is_edge_gateway;
>  };
>
>  enum mwifiex_ba_status {
> @@ -1208,6 +1213,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);
> diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
> index c3a20f9..50c503f 100644
> --- a/drivers/net/wireless/mwifiex/pcie.c
> +++ b/drivers/net/wireless/mwifiex/pcie.c
> @@ -17,6 +17,7 @@
>   * this warranty disclaimer.
>   */
>
> +#include <linux/dmi.h>
>  #include <linux/firmware.h>
>
>  #include "decl.h"
> @@ -187,6 +188,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);
> @@ -213,6 +215,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;
>  }
>
> diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
> index 1c2ca29..dc1aed6 100644
> --- a/drivers/net/wireless/mwifiex/sta_cmd.c
> +++ b/drivers/net/wireless/mwifiex/sta_cmd.c
> @@ -384,6 +384,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.
>   *
> @@ -1717,6 +1742,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;
> diff --git a/drivers/net/wireless/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c
> index b65e101..06583cf 100644
> --- a/drivers/net/wireless/mwifiex/sta_cmdresp.c
> +++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c
> @@ -1117,6 +1117,8 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv, u16 cmdresp_no,
>         case HostCmd_CMD_TDLS_OPER:
>                 ret = mwifiex_ret_tdls_oper(priv, resp);
>                 break;
> +       case HostCmd_CMD_802_11_LED_CONTROL:
> +               break;
>         default:
>                 dev_err(adapter->dev, "CMD_RESP: unknown cmd response %#x\n",
>                         resp->command);
> diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c
> index 1626868..01041af 100644
> --- a/drivers/net/wireless/mwifiex/sta_ioctl.c
> +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c
> @@ -17,6 +17,8 @@
>   * this warranty disclaimer.
>   */
>
> +#include <linux/dmi.h>
> +
>  #include "decl.h"
>  #include "ioctl.h"
>  #include "util.h"
> @@ -525,6 +527,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.
>   *
> --
> 2.5.0
>




More information about the kernel-team mailing list