]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
UBUNTU: SAUCE: mwifiex: Switch WiFi LED state according to the device status
authorWen-chien Jesse Sung <jesse.sung@canonical.com>
Wed, 17 Oct 2018 11:41:41 +0000 (19:41 +0800)
committerAndrea Righi <andrea.righi@canonical.com>
Mon, 25 Nov 2019 13:56:35 +0000 (14:56 +0100)
BugLink: https://launchpad.net/bugs/1798330
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@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/net/wireless/marvell/mwifiex/fw.h
drivers/net/wireless/marvell/mwifiex/main.c
drivers/net/wireless/marvell/mwifiex/main.h
drivers/net/wireless/marvell/mwifiex/pcie.c
drivers/net/wireless/marvell/mwifiex/sta_cmd.c
drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
drivers/net/wireless/marvell/mwifiex/sta_ioctl.c

index 1fb76d2f5d3fdfe680886148e93e53b4e208d207..d6f342e107a057d14a97f650ae5ffc99f8f299c1 100644 (file)
@@ -217,6 +217,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 TLV_TYPE_RANDOM_MAC         (PROPRIETARY_TLV_BASE_ID + 236)
 #define TLV_TYPE_CHAN_ATTR_CFG      (PROPRIETARY_TLV_BASE_ID + 237)
@@ -363,6 +364,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_CONFIG             0x006b
@@ -1193,6 +1195,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;
@@ -1316,6 +1328,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,
@@ -2370,6 +2387,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;
                struct host_cmd_ds_wakeup_reason hs_wakeup_reason;
                struct host_cmd_ds_gtk_rekey_params rekey;
                struct host_cmd_ds_chan_region_cfg reg_cfg;
index a9657ae6d7829b9fba74d7840914fba2231e1d63..156216e3d64bb84abb5e23bf13ff8206b2415664 100644 (file)
@@ -727,8 +727,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;
 }
 
@@ -759,6 +761,7 @@ mwifiex_close(struct net_device *dev)
                cfg80211_sched_scan_stopped(priv->wdev.wiphy, 0);
        }
 
+       mwifiex_set_led(priv->adapter, MWIFIEX_LED_OFF);
        return 0;
 }
 
index 095837fba300536c719285183061156f17082028..4eade401bd734fc15b454af052e67cd6199775b6 100644 (file)
@@ -132,6 +132,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
@@ -700,6 +704,7 @@ struct mwifiex_private {
        struct mwifiex_user_scan_chan hidden_chan[MWIFIEX_USER_SCAN_CHAN_MAX];
        u8 assoc_resp_ht_param;
        bool ht_param_present;
+       bool is_edge_gateway;
 };
 
 
@@ -1506,6 +1511,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);
index eff06d59e9dfc8cb633bb67919363a7165f28771..e926a642d657db18f1693ec7f01f471e1da70ac2 100644 (file)
@@ -229,6 +229,8 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
                                        const struct pci_device_id *ent)
 {
        struct pcie_service_card *card;
+       struct mwifiex_private *priv;
+       struct pci_dev *pdev_host;
        int ret;
 
        pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
@@ -267,6 +269,14 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
                return -1;
        }
 
+       priv = mwifiex_get_priv(card->adapter, MWIFIEX_BSS_ROLE_STA);
+       pdev_host = pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, 0x1028, 0x0720, NULL);
+       if (!pdev_host)
+               pdev_host = pci_get_subsys(PCI_ANY_ID, PCI_ANY_ID, 0x1028, 0x0733, NULL);
+       if (pdev_host) {
+               priv->is_edge_gateway = true;
+               pci_dev_put(pdev_host);
+       }
        return 0;
 }
 
index 4ed10cf82f9a4c7459e6429087eca637470afd40..289af544d94131ece0043fe6fd24a0b54d5b8417 100644 (file)
@@ -424,6 +424,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.
  *
@@ -1999,6 +2024,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;
index 20c206da063157c252bd8e74758d004031218b35..b602078ae2abcc35e22ac7c7dfd23bff8db94dae 100644 (file)
@@ -1400,6 +1400,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;
        case HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG:
                break;
        case HostCmd_CMD_CHAN_REGION_CFG:
index 74e50566db1f2711d3c35a3bc31c0f9bdb767b2c..72b5dfdda668d937041937bd471441f080e0d588 100644 (file)
@@ -560,6 +560,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.
  *