diff --git a/core/dfc_qmap.c b/core/dfc_qmap.c index fb883df98b96..f371a0f6e7bf 100644 --- a/core/dfc_qmap.c +++ b/core/dfc_qmap.c @@ -127,9 +127,11 @@ static struct dfc_tx_link_status_ind_msg_v01 qmap_tx_ind; static struct dfc_qmi_data __rcu *qmap_dfc_data; static atomic_t qmap_txid; static void *rmnet_ctl_handle; +static bool dfc_config_acked; static struct rmnet_ctl_client_if *rmnet_ctl; +static void dfc_qmap_send_config(struct dfc_qmi_data *data); static void dfc_qmap_send_end_marker_cnf(struct qos_info *qos, u8 bearer_id, u16 seq, u32 tx_id); @@ -319,6 +321,9 @@ static void dfc_qmap_cmd_handler(struct sk_buff *skb) if (cmd->cmd_type != QMAP_CMD_ACK) goto free_skb; } else if (cmd->cmd_type != QMAP_CMD_REQUEST) { + if (cmd->cmd_type == QMAP_CMD_ACK && + cmd->cmd_name == QMAP_DFC_CONFIG) + dfc_config_acked = true; goto free_skb; } @@ -330,6 +335,12 @@ static void dfc_qmap_cmd_handler(struct sk_buff *skb) goto free_skb; } + /* Re-send DFC config once if needed */ + if (unlikely(!dfc_config_acked)) { + dfc_qmap_send_config(dfc); + dfc_config_acked = true; + } + switch (cmd->cmd_name) { case QMAP_DFC_IND: rc = dfc_qmap_handle_ind(dfc, skb); @@ -520,6 +531,7 @@ int dfc_qmap_client_init(void *port, int index, struct svc_info *psvc, pr_info("DFC QMAP init\n"); + dfc_config_acked = false; dfc_qmap_send_config(data); out: