diff --git a/core/dfc_qmap.c b/core/dfc_qmap.c index 06b49e794c58..69dc6e7a0241 100644 --- a/core/dfc_qmap.c +++ b/core/dfc_qmap.c @@ -4,6 +4,7 @@ */ #include +#include #include "rmnet_ctl.h" #include "dfc_defs.h" #include "rmnet_qmi.h" @@ -127,6 +128,9 @@ static struct dfc_qmi_data __rcu *qmap_dfc_data; static atomic_t qmap_txid; static void *rmnet_ctl_handle; +extern struct rmnet_ctl_client_if rmnet_ctl_if; +static struct rmnet_ctl_client_if *rmnet_ctl; + static void dfc_qmap_send_end_marker_cnf(struct qos_info *qos, u8 bearer_id, u16 seq, u32 tx_id); @@ -134,7 +138,8 @@ static void dfc_qmap_send_cmd(struct sk_buff *skb) { trace_dfc_qmap(skb->data, skb->len, false); - if (rmnet_ctl_send_client(rmnet_ctl_handle, skb)) { + if (unlikely(!rmnet_ctl || !rmnet_ctl->send) || + rmnet_ctl->send(rmnet_ctl_handle, skb)) { pr_err("Failed to send to rmnet ctl\n"); kfree_skb(skb); } @@ -150,7 +155,9 @@ static void dfc_qmap_send_inband_ack(struct dfc_qmi_data *dfc, skb->protocol = htons(ETH_P_MAP); skb->dev = rmnet_get_real_dev(dfc->rmnet_port); - rmnet_ctl_log_debug("TXI", skb->data, skb->len); + if (likely(rmnet_ctl && rmnet_ctl->log)) + rmnet_ctl->log(RMNET_CTL_LOG_DEBUG, "TXI", 0, + skb->data, skb->len); trace_dfc_qmap(skb->data, skb->len, false); dev_queue_xmit(skb); } @@ -446,7 +453,9 @@ static void dfc_qmap_send_end_marker_cnf(struct qos_info *qos, skb->dev = qos->real_dev; /* This cmd needs to be sent in-band */ - rmnet_ctl_log_info("TXI", skb->data, skb->len); + if (likely(rmnet_ctl && rmnet_ctl->log)) + rmnet_ctl->log(RMNET_CTL_LOG_INFO, "TXI", 0, + skb->data, skb->len); trace_dfc_qmap(skb->data, skb->len, false); rmnet_map_tx_qmap_cmd(skb); } @@ -490,7 +499,16 @@ int dfc_qmap_client_init(void *port, int index, struct svc_info *psvc, atomic_set(&qmap_txid, 0); - rmnet_ctl_handle = rmnet_ctl_register_client(&cb); + if (!rmnet_ctl) + rmnet_ctl = symbol_get(rmnet_ctl_if); + if (!rmnet_ctl) { + pr_err("rmnet_ctl module not loaded\n"); + goto out; + } + + if (rmnet_ctl->reg) + rmnet_ctl_handle = rmnet_ctl->reg(&cb); + if (!rmnet_ctl_handle) pr_err("Failed to register with rmnet ctl\n"); @@ -501,6 +519,7 @@ int dfc_qmap_client_init(void *port, int index, struct svc_info *psvc, dfc_qmap_send_config(data); +out: return 0; } @@ -515,7 +534,9 @@ void dfc_qmap_client_exit(void *dfc_data) trace_dfc_client_state_down(data->index, 0); - rmnet_ctl_unregister_client(rmnet_ctl_handle); + if (rmnet_ctl && rmnet_ctl->dereg) + rmnet_ctl->dereg(rmnet_ctl_handle); + rmnet_ctl_handle = NULL; WRITE_ONCE(data->restart_state, 1); RCU_INIT_POINTER(qmap_dfc_data, NULL); @@ -523,5 +544,10 @@ void dfc_qmap_client_exit(void *dfc_data) kfree(data); + if (rmnet_ctl) { + symbol_put(rmnet_ctl_if); + rmnet_ctl = NULL; + } + pr_info("DFC QMAP exit\n"); } diff --git a/core/rmnet_ctl.h b/core/rmnet_ctl.h index 54d2385c4eb9..cb3ca722057a 100644 --- a/core/rmnet_ctl.h +++ b/core/rmnet_ctl.h @@ -10,8 +10,6 @@ #include -#define CONFIG_RMNET_CTL 1 - enum rmnet_ctl_log_lvl { RMNET_CTL_LOG_CRIT, RMNET_CTL_LOG_ERR, @@ -19,50 +17,16 @@ enum rmnet_ctl_log_lvl { RMNET_CTL_LOG_DEBUG, }; -#define rmnet_ctl_log_err(msg, rc, data, len) \ - rmnet_ctl_log(RMNET_CTL_LOG_ERR, msg, rc, data, len) - -#define rmnet_ctl_log_info(msg, data, len) \ - rmnet_ctl_log(RMNET_CTL_LOG_INFO, msg, 0, data, len) - -#define rmnet_ctl_log_debug(msg, data, len) \ - rmnet_ctl_log(RMNET_CTL_LOG_DEBUG, msg, 0, data, len) - struct rmnet_ctl_client_hooks { void (*ctl_dl_client_hook)(struct sk_buff *skb); }; -#ifdef CONFIG_RMNET_CTL - -void *rmnet_ctl_register_client(struct rmnet_ctl_client_hooks *hook); -int rmnet_ctl_unregister_client(void *handle); -int rmnet_ctl_send_client(void *handle, struct sk_buff *skb); -void rmnet_ctl_log(enum rmnet_ctl_log_lvl lvl, const char *msg, - int rc, const void *data, unsigned int len); - -#else - -static inline void *rmnet_ctl_register_client( - struct rmnet_ctl_client_hooks *hook) -{ - return NULL; -} - -static inline int rmnet_ctl_unregister_client(void *handle) -{ - return -EINVAL; -} - -static inline int rmnet_ctl_send_client(void *handle, struct sk_buff *skb) -{ - return -EINVAL; -} - -static inline void rmnet_ctl_log(enum rmnet_ctl_log_lvl lvl, const char *msg, - int rc, const void *data, unsigned int len) -{ -} - -#endif /* CONFIG_RMNET_CTL */ +struct rmnet_ctl_client_if { + void * (*reg)(struct rmnet_ctl_client_hooks *hook); + int (*dereg)(void *handle); + int (*send)(void *handle, struct sk_buff *skb); + void (*log)(enum rmnet_ctl_log_lvl lvl, const char *msg, int rc, + const void *data, unsigned int len); +}; #endif /* _RMNET_CTL_H_ */ diff --git a/core/rmnet_ctl_client.c b/core/rmnet_ctl_client.c index 1fe348b1387d..e24b7bea9463 100644 --- a/core/rmnet_ctl_client.c +++ b/core/rmnet_ctl_client.c @@ -200,3 +200,11 @@ void rmnet_ctl_log(enum rmnet_ctl_log_lvl lvl, const char *msg, } } EXPORT_SYMBOL(rmnet_ctl_log); + +struct rmnet_ctl_client_if rmnet_ctl_if = { + .reg = rmnet_ctl_register_client, + .dereg = rmnet_ctl_unregister_client, + .send = rmnet_ctl_send_client, + .log = rmnet_ctl_log, +}; +EXPORT_SYMBOL(rmnet_ctl_if); diff --git a/core/rmnet_ctl_client.h b/core/rmnet_ctl_client.h index f7b1b6a69e61..f044aa29e6d6 100644 --- a/core/rmnet_ctl_client.h +++ b/core/rmnet_ctl_client.h @@ -9,6 +9,19 @@ #define _RMNET_CTL_CLIENT_H_ #include +#include "rmnet_ctl.h" + +void rmnet_ctl_log(enum rmnet_ctl_log_lvl lvl, const char *msg, + int rc, const void *data, unsigned int len); + +#define rmnet_ctl_log_err(msg, rc, data, len) \ + rmnet_ctl_log(RMNET_CTL_LOG_ERR, msg, rc, data, len) + +#define rmnet_ctl_log_info(msg, data, len) \ + rmnet_ctl_log(RMNET_CTL_LOG_INFO, msg, 0, data, len) + +#define rmnet_ctl_log_debug(msg, data, len) \ + rmnet_ctl_log(RMNET_CTL_LOG_DEBUG, msg, 0, data, len) struct rmnet_ctl_stats { u64 rx_pkts;