mwifiex: report wakeup reason to cfg80211
This patch adds code to report wakeup reason to cfg80211 when system is resumed. Signed-off-by: chunfan chen <jeffc@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
@@ -3316,6 +3316,64 @@ static int mwifiex_cfg80211_suspend(struct wiphy *wiphy,
|
|||||||
|
|
||||||
static int mwifiex_cfg80211_resume(struct wiphy *wiphy)
|
static int mwifiex_cfg80211_resume(struct wiphy *wiphy)
|
||||||
{
|
{
|
||||||
|
struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
|
||||||
|
struct mwifiex_private *priv =
|
||||||
|
mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA);
|
||||||
|
struct mwifiex_ds_wakeup_reason wakeup_reason;
|
||||||
|
struct cfg80211_wowlan_wakeup wakeup_report;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
mwifiex_get_wakeup_reason(priv, HostCmd_ACT_GEN_GET, MWIFIEX_SYNC_CMD,
|
||||||
|
&wakeup_reason);
|
||||||
|
memset(&wakeup_report, 0, sizeof(struct cfg80211_wowlan_wakeup));
|
||||||
|
|
||||||
|
wakeup_report.pattern_idx = -1;
|
||||||
|
|
||||||
|
switch (wakeup_reason.hs_wakeup_reason) {
|
||||||
|
case NO_HSWAKEUP_REASON:
|
||||||
|
break;
|
||||||
|
case BCAST_DATA_MATCHED:
|
||||||
|
break;
|
||||||
|
case MCAST_DATA_MATCHED:
|
||||||
|
break;
|
||||||
|
case UCAST_DATA_MATCHED:
|
||||||
|
break;
|
||||||
|
case MASKTABLE_EVENT_MATCHED:
|
||||||
|
break;
|
||||||
|
case NON_MASKABLE_EVENT_MATCHED:
|
||||||
|
if (wiphy->wowlan_config->disconnect)
|
||||||
|
wakeup_report.disconnect = true;
|
||||||
|
if (wiphy->wowlan_config->nd_config)
|
||||||
|
wakeup_report.net_detect = adapter->nd_info;
|
||||||
|
break;
|
||||||
|
case NON_MASKABLE_CONDITION_MATCHED:
|
||||||
|
break;
|
||||||
|
case MAGIC_PATTERN_MATCHED:
|
||||||
|
if (wiphy->wowlan_config->magic_pkt)
|
||||||
|
wakeup_report.magic_pkt = true;
|
||||||
|
if (wiphy->wowlan_config->n_patterns)
|
||||||
|
wakeup_report.pattern_idx = 1;
|
||||||
|
break;
|
||||||
|
case CONTROL_FRAME_MATCHED:
|
||||||
|
break;
|
||||||
|
case MANAGEMENT_FRAME_MATCHED:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((wakeup_reason.hs_wakeup_reason > 0) &&
|
||||||
|
(wakeup_reason.hs_wakeup_reason <= 7))
|
||||||
|
cfg80211_report_wowlan_wakeup(&priv->wdev, &wakeup_report,
|
||||||
|
GFP_KERNEL);
|
||||||
|
|
||||||
|
if (adapter->nd_info) {
|
||||||
|
for (i = 0 ; i < adapter->nd_info->n_matches ; i++)
|
||||||
|
kfree(adapter->nd_info->matches[i]);
|
||||||
|
kfree(adapter->nd_info);
|
||||||
|
adapter->nd_info = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1657,3 +1657,16 @@ int mwifiex_ret_get_hw_spec(struct mwifiex_private *priv,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function handles the command response of hs wakeup reason
|
||||||
|
* command.
|
||||||
|
*/
|
||||||
|
int mwifiex_ret_wakeup_reason(struct mwifiex_private *priv,
|
||||||
|
struct host_cmd_ds_command *resp,
|
||||||
|
struct host_cmd_ds_wakeup_reason *wakeup_reason)
|
||||||
|
{
|
||||||
|
wakeup_reason->wakeup_reason =
|
||||||
|
resp->params.hs_wakeup_reason.wakeup_reason;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -373,6 +373,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
|
|||||||
#define HostCmd_CMD_MGMT_FRAME_REG 0x010c
|
#define HostCmd_CMD_MGMT_FRAME_REG 0x010c
|
||||||
#define HostCmd_CMD_REMAIN_ON_CHAN 0x010d
|
#define HostCmd_CMD_REMAIN_ON_CHAN 0x010d
|
||||||
#define HostCmd_CMD_11AC_CFG 0x0112
|
#define HostCmd_CMD_11AC_CFG 0x0112
|
||||||
|
#define HostCmd_CMD_HS_WAKEUP_REASON 0x0116
|
||||||
#define HostCmd_CMD_TDLS_CONFIG 0x0100
|
#define HostCmd_CMD_TDLS_CONFIG 0x0100
|
||||||
#define HostCmd_CMD_MC_POLICY 0x0121
|
#define HostCmd_CMD_MC_POLICY 0x0121
|
||||||
#define HostCmd_CMD_TDLS_OPER 0x0122
|
#define HostCmd_CMD_TDLS_OPER 0x0122
|
||||||
@@ -607,6 +608,20 @@ struct mwifiex_ie_types_data {
|
|||||||
#define MWIFIEX_RXPD_FLAGS_TDLS_PACKET 0x01
|
#define MWIFIEX_RXPD_FLAGS_TDLS_PACKET 0x01
|
||||||
#define MWIFIEX_TXPD_FLAGS_REQ_TX_STATUS 0x20
|
#define MWIFIEX_TXPD_FLAGS_REQ_TX_STATUS 0x20
|
||||||
|
|
||||||
|
enum HS_WAKEUP_REASON {
|
||||||
|
NO_HSWAKEUP_REASON = 0,
|
||||||
|
BCAST_DATA_MATCHED,
|
||||||
|
MCAST_DATA_MATCHED,
|
||||||
|
UCAST_DATA_MATCHED,
|
||||||
|
MASKTABLE_EVENT_MATCHED,
|
||||||
|
NON_MASKABLE_EVENT_MATCHED,
|
||||||
|
NON_MASKABLE_CONDITION_MATCHED,
|
||||||
|
MAGIC_PATTERN_MATCHED,
|
||||||
|
CONTROL_FRAME_MATCHED,
|
||||||
|
MANAGEMENT_FRAME_MATCHED,
|
||||||
|
RESERVED
|
||||||
|
};
|
||||||
|
|
||||||
struct txpd {
|
struct txpd {
|
||||||
u8 bss_type;
|
u8 bss_type;
|
||||||
u8 bss_num;
|
u8 bss_num;
|
||||||
@@ -2159,6 +2174,10 @@ struct host_cmd_ds_robust_coex {
|
|||||||
__le16 reserved;
|
__le16 reserved;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct host_cmd_ds_wakeup_reason {
|
||||||
|
u16 wakeup_reason;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
struct host_cmd_ds_command {
|
struct host_cmd_ds_command {
|
||||||
__le16 command;
|
__le16 command;
|
||||||
__le16 size;
|
__le16 size;
|
||||||
@@ -2231,6 +2250,7 @@ struct host_cmd_ds_command {
|
|||||||
struct host_cmd_sdio_sp_rx_aggr_cfg sdio_rx_aggr_cfg;
|
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_multi_chan_policy mc_policy;
|
||||||
struct host_cmd_ds_robust_coex coex;
|
struct host_cmd_ds_robust_coex coex;
|
||||||
|
struct host_cmd_ds_wakeup_reason hs_wakeup_reason;
|
||||||
} params;
|
} params;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
@@ -271,6 +271,10 @@ struct mwifiex_ds_hs_cfg {
|
|||||||
u32 gap;
|
u32 gap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mwifiex_ds_wakeup_reason {
|
||||||
|
u16 hs_wakeup_reason;
|
||||||
|
};
|
||||||
|
|
||||||
#define DEEP_SLEEP_ON 1
|
#define DEEP_SLEEP_ON 1
|
||||||
#define DEEP_SLEEP_OFF 0
|
#define DEEP_SLEEP_OFF 0
|
||||||
#define DEEP_SLEEP_IDLE_TIME 100
|
#define DEEP_SLEEP_IDLE_TIME 100
|
||||||
|
@@ -1599,6 +1599,12 @@ void mwifiex_drv_info_dump(struct mwifiex_adapter *adapter);
|
|||||||
void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter);
|
void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter);
|
||||||
void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
|
void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
|
||||||
void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
|
void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
|
||||||
|
int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
|
||||||
|
int cmd_type,
|
||||||
|
struct mwifiex_ds_wakeup_reason *wakeup_reason);
|
||||||
|
int mwifiex_ret_wakeup_reason(struct mwifiex_private *priv,
|
||||||
|
struct host_cmd_ds_command *resp,
|
||||||
|
struct host_cmd_ds_wakeup_reason *wakeup_reason);
|
||||||
void mwifiex_coex_ampdu_rxwinsize(struct mwifiex_adapter *adapter);
|
void mwifiex_coex_ampdu_rxwinsize(struct mwifiex_adapter *adapter);
|
||||||
void mwifiex_11n_delba(struct mwifiex_private *priv, int tid);
|
void mwifiex_11n_delba(struct mwifiex_private *priv, int tid);
|
||||||
int mwifiex_send_domain_info_cmd_fw(struct wiphy *wiphy);
|
int mwifiex_send_domain_info_cmd_fw(struct wiphy *wiphy);
|
||||||
|
@@ -1813,6 +1813,22 @@ static int mwifiex_cmd_sdio_rx_aggr_cfg(struct host_cmd_ds_command *cmd,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function prepares command to get HS wakeup reason.
|
||||||
|
*
|
||||||
|
* Preparation includes -
|
||||||
|
* - Setting command ID, action and proper size
|
||||||
|
* - Ensuring correct endian-ness
|
||||||
|
*/
|
||||||
|
static int mwifiex_cmd_get_wakeup_reason(struct mwifiex_private *priv,
|
||||||
|
struct host_cmd_ds_command *cmd)
|
||||||
|
{
|
||||||
|
cmd->command = cpu_to_le16(HostCmd_CMD_HS_WAKEUP_REASON);
|
||||||
|
cmd->size = cpu_to_le16(sizeof(struct host_cmd_ds_wakeup_reason) +
|
||||||
|
S_DS_GEN);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function prepares the commands before sending them to the firmware.
|
* This function prepares the commands before sending them to the firmware.
|
||||||
*
|
*
|
||||||
@@ -2067,6 +2083,9 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
|
|||||||
ret = mwifiex_cmd_sdio_rx_aggr_cfg(cmd_ptr, cmd_action,
|
ret = mwifiex_cmd_sdio_rx_aggr_cfg(cmd_ptr, cmd_action,
|
||||||
data_buf);
|
data_buf);
|
||||||
break;
|
break;
|
||||||
|
case HostCmd_CMD_HS_WAKEUP_REASON:
|
||||||
|
ret = mwifiex_cmd_get_wakeup_reason(priv, cmd_ptr);
|
||||||
|
break;
|
||||||
case HostCmd_CMD_MC_POLICY:
|
case HostCmd_CMD_MC_POLICY:
|
||||||
ret = mwifiex_cmd_set_mc_policy(priv, cmd_ptr, cmd_action,
|
ret = mwifiex_cmd_set_mc_policy(priv, cmd_ptr, cmd_action,
|
||||||
data_buf);
|
data_buf);
|
||||||
|
@@ -1236,6 +1236,9 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv, u16 cmdresp_no,
|
|||||||
case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
|
case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
|
||||||
ret = mwifiex_ret_sdio_rx_aggr_cfg(priv, resp);
|
ret = mwifiex_ret_sdio_rx_aggr_cfg(priv, resp);
|
||||||
break;
|
break;
|
||||||
|
case HostCmd_CMD_HS_WAKEUP_REASON:
|
||||||
|
ret = mwifiex_ret_wakeup_reason(priv, resp, data_buf);
|
||||||
|
break;
|
||||||
case HostCmd_CMD_TDLS_CONFIG:
|
case HostCmd_CMD_TDLS_CONFIG:
|
||||||
break;
|
break;
|
||||||
case HostCmd_CMD_ROBUST_COEX:
|
case HostCmd_CMD_ROBUST_COEX:
|
||||||
|
@@ -1465,3 +1465,19 @@ mwifiex_set_gen_ie(struct mwifiex_private *priv, const u8 *ie, int ie_len)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function get Host Sleep wake up reason.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
|
||||||
|
int cmd_type,
|
||||||
|
struct mwifiex_ds_wakeup_reason *wakeup_reason)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
status = mwifiex_send_cmd(priv, HostCmd_CMD_HS_WAKEUP_REASON,
|
||||||
|
HostCmd_ACT_GEN_GET, 0, wakeup_reason,
|
||||||
|
cmd_type == MWIFIEX_SYNC_CMD);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user