Commit 354ce4a4 authored by Wey-Yi Guy's avatar Wey-Yi Guy Committed by John W. Linville

iwlwifi: add checking for the condition to reduce tx power

When bluetooth coex is active and certain condition matched,
driver need to decide should the tx power been reduce or not.
Adding the logic to manage it.
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
parent 9a00be04
...@@ -541,9 +541,10 @@ static void iwlagn_print_uartmsg(struct iwl_priv *priv, ...@@ -541,9 +541,10 @@ static void iwlagn_print_uartmsg(struct iwl_priv *priv,
BT_UART_MSG_FRAME7CONNECTABLE_POS); BT_UART_MSG_FRAME7CONNECTABLE_POS);
} }
static void iwlagn_set_kill_msk(struct iwl_priv *priv, static bool iwlagn_set_kill_msk(struct iwl_priv *priv,
struct iwl_bt_uart_msg *uart_msg) struct iwl_bt_uart_msg *uart_msg)
{ {
bool need_update = false;
u8 kill_msk; u8 kill_msk;
static const __le32 bt_kill_ack_msg[2] = { static const __le32 bt_kill_ack_msg[2] = {
IWLAGN_BT_KILL_ACK_MASK_DEFAULT, IWLAGN_BT_KILL_ACK_MASK_DEFAULT,
...@@ -560,10 +561,39 @@ static void iwlagn_set_kill_msk(struct iwl_priv *priv, ...@@ -560,10 +561,39 @@ static void iwlagn_set_kill_msk(struct iwl_priv *priv,
priv->kill_ack_mask = bt_kill_ack_msg[kill_msk]; priv->kill_ack_mask = bt_kill_ack_msg[kill_msk];
priv->bt_valid |= IWLAGN_BT_VALID_KILL_CTS_MASK; priv->bt_valid |= IWLAGN_BT_VALID_KILL_CTS_MASK;
priv->kill_cts_mask = bt_kill_cts_msg[kill_msk]; priv->kill_cts_mask = bt_kill_cts_msg[kill_msk];
need_update = true;
}
return need_update;
}
/* schedule to send runtime bt_config */ static bool iwlagn_fill_txpower_mode(struct iwl_priv *priv,
queue_work(priv->workqueue, &priv->bt_runtime_config); struct iwl_bt_uart_msg *uart_msg)
{
bool need_update = false;
if (!priv->reduced_txpower &&
!iwl_is_associated(priv, IWL_RXON_CTX_PAN) &&
(uart_msg->frame3 & (BT_UART_MSG_FRAME3ACL_MSK |
BT_UART_MSG_FRAME3OBEX_MSK)) &&
!(uart_msg->frame3 & (BT_UART_MSG_FRAME3SCOESCO_MSK |
BT_UART_MSG_FRAME3SNIFF_MSK | BT_UART_MSG_FRAME3A2DP_MSK))) {
/* enabling reduced tx power */
priv->reduced_txpower = true;
priv->bt_valid |= IWLAGN_BT_VALID_REDUCED_TX_PWR;
need_update = true;
} else if (priv->reduced_txpower &&
(iwl_is_associated(priv, IWL_RXON_CTX_PAN) ||
(uart_msg->frame3 & (BT_UART_MSG_FRAME3SCOESCO_MSK |
BT_UART_MSG_FRAME3SNIFF_MSK | BT_UART_MSG_FRAME3A2DP_MSK)) ||
!(uart_msg->frame3 & (BT_UART_MSG_FRAME3ACL_MSK |
BT_UART_MSG_FRAME3OBEX_MSK)))) {
/* disable reduced tx power */
priv->reduced_txpower = false;
priv->bt_valid &= ~IWLAGN_BT_VALID_REDUCED_TX_PWR;
need_update = true;
} }
return need_update;
} }
int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv, int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv,
...@@ -611,7 +641,11 @@ int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv, ...@@ -611,7 +641,11 @@ int iwlagn_bt_coex_profile_notif(struct iwl_priv *priv,
} }
} }
iwlagn_set_kill_msk(priv, uart_msg); /* schedule to send runtime bt_config */
if (iwlagn_set_kill_msk(priv, uart_msg) ||
iwlagn_fill_txpower_mode(priv, uart_msg))
queue_work(priv->workqueue, &priv->bt_runtime_config);
/* FIXME: based on notification, adjust the prio_boost */ /* FIXME: based on notification, adjust the prio_boost */
......
...@@ -921,6 +921,7 @@ struct iwl_priv { ...@@ -921,6 +921,7 @@ struct iwl_priv {
__le32 kill_ack_mask; __le32 kill_ack_mask;
__le32 kill_cts_mask; __le32 kill_cts_mask;
__le16 bt_valid; __le16 bt_valid;
bool reduced_txpower;
u16 bt_on_thresh; u16 bt_on_thresh;
u16 bt_duration; u16 bt_duration;
u16 dynamic_frag_thresh; u16 dynamic_frag_thresh;
......
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