rmnet_ctl: remove dependencies

Removes hard dependendencies between rmnet_core and rmnet_ctl.

Change-Id: I9931380fc6406eec5842a824181a0bacbb6ce73a
Acked-by: Weiyi Chen <weiyic@qti.qualcomm.com>
Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
This commit is contained in:
Subash Abhinov Kasiviswanathan 2020-04-11 15:33:27 -07:00
commit e87877cb0c
4 changed files with 59 additions and 48 deletions

View file

@ -4,6 +4,7 @@
*/
#include <net/pkt_sched.h>
#include <linux/module.h>
#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");
}

View file

@ -10,8 +10,6 @@
#include <linux/skbuff.h>
#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_ */

View file

@ -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);

View file

@ -9,6 +9,19 @@
#define _RMNET_CTL_CLIENT_H_
#include <linux/skbuff.h>
#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;