Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4117ab03 authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: wda: Power Save cb support



Added Power save mode indication registration.
Modules should be able to be notified when rmnet is
going into ps mode.

CRs-Fixed: 2316002
Change-Id: I0b11e4aa6595d51b7421e3cc0acbab4bf13dd18a
Acked-by: default avatarRaul Martinez <mraul@qti.qualcomm.com>
Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
parent 24811cd3
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -605,6 +605,13 @@ void rmnet_enable_all_flows(void *port)
}
EXPORT_SYMBOL(rmnet_enable_all_flows);

int rmnet_get_powersave_notif(void *port)
{
	if (!port)
		return 0;
	return ((struct rmnet_port *)port)->data_format & RMNET_FORMAT_PS_NOTIF;
}
EXPORT_SYMBOL(rmnet_get_powersave_notif);
#endif

/* Startup/Shutdown */
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

/* Power save feature*/
#define RMNET_INGRESS_FORMAT_PS                 BIT(27)
#define RMNET_FORMAT_PS_NOTIF                   BIT(26)

/* Replace skb->dev to a virtual rmnet device and pass up the stack */
#define RMNET_EPMODE_VND (1)
+62 −1
Original line number Diff line number Diff line
@@ -658,6 +658,7 @@ EXPORT_SYMBOL(qmi_rmnet_qos_exit);
#ifdef CONFIG_QCOM_QMI_POWER_COLLAPSE
static struct workqueue_struct  *rmnet_ps_wq;
static struct rmnet_powersave_work *rmnet_work;
static struct list_head ps_list;

struct rmnet_powersave_work {
	struct delayed_work work;
@@ -666,6 +667,58 @@ struct rmnet_powersave_work {
	u64 old_tx_pkts;
};

void qmi_rmnet_ps_on_notify(void *port)
{
	struct qmi_rmnet_ps_ind *tmp;

	list_for_each_entry(tmp, &ps_list, list)
		tmp->ps_on_handler(port);
}
EXPORT_SYMBOL(qmi_rmnet_ps_on_notify);

void qmi_rmnet_ps_off_notify(void *port)
{
	struct qmi_rmnet_ps_ind *tmp;

	list_for_each_entry(tmp, &ps_list, list)
		tmp->ps_off_handler(port);
}
EXPORT_SYMBOL(qmi_rmnet_ps_off_notify);

int qmi_rmnet_ps_ind_register(void *port,
			      struct qmi_rmnet_ps_ind *ps_ind)
{

	if (!port || !ps_ind || !ps_ind->ps_on_handler ||
	    !ps_ind->ps_off_handler)
		return -EINVAL;

	list_add_rcu(&ps_ind->list, &ps_list);

	return 0;
}
EXPORT_SYMBOL(qmi_rmnet_ps_ind_register);

int qmi_rmnet_ps_ind_deregister(void *port,
				struct qmi_rmnet_ps_ind *ps_ind)
{
	struct qmi_rmnet_ps_ind *tmp;

	if (!port || !ps_ind)
		return -EINVAL;

	list_for_each_entry(tmp, &ps_list, list) {
		if (tmp == ps_ind) {
			list_del_rcu(&ps_ind->list);
			goto done;
		}
	}

done:
	return 0;
}
EXPORT_SYMBOL(qmi_rmnet_ps_ind_deregister);

int qmi_rmnet_set_powersave_mode(void *port, uint8_t enable)
{
	int rc = -EINVAL;
@@ -727,6 +780,11 @@ static void qmi_rmnet_check_stats(struct work_struct *work)

		}
		qmi->ps_enabled = 0;

		if (rmnet_get_powersave_notif(real_work->port))
			qmi_rmnet_ps_off_notify(real_work->port);


		goto end;
	}

@@ -745,6 +803,9 @@ static void qmi_rmnet_check_stats(struct work_struct *work)
		qmi->ps_enabled = 1;
		clear_bit(PS_WORK_ACTIVE_BIT, &qmi->ps_work_active);

		if (rmnet_get_powersave_notif(real_work->port))
			qmi_rmnet_ps_on_notify(real_work->port);

		return;
	}
end:
@@ -779,7 +840,7 @@ void qmi_rmnet_work_init(void *port)
		rmnet_ps_wq = NULL;
		return;
	}

	INIT_LIST_HEAD(&ps_list);
	INIT_DEFERRABLE_WORK(&rmnet_work->work, qmi_rmnet_check_stats);
	rmnet_work->port = port;
	rmnet_get_packets(rmnet_work->port, &rmnet_work->old_rx_pkts,
+37 −0
Original line number Diff line number Diff line
@@ -17,6 +17,13 @@
#include <linux/netdevice.h>
#include <linux/skbuff.h>

struct qmi_rmnet_ps_ind {
	void (*ps_on_handler)(void *);
	void (*ps_off_handler)(void *);
	struct list_head list;
};


#ifdef CONFIG_QCOM_QMI_RMNET
void qmi_rmnet_qmi_exit(void *qmi_pt, void *port);
void qmi_rmnet_change_link(struct net_device *dev, void *port, void *tcm_pt);
@@ -72,6 +79,15 @@ int qmi_rmnet_set_powersave_mode(void *port, uint8_t enable);
void qmi_rmnet_work_init(void *port);
void qmi_rmnet_work_exit(void *port);
void qmi_rmnet_work_maybe_restart(void *port);
void qmi_rmnet_work_restart(void *port);

int qmi_rmnet_ps_ind_register(void *port,
			      struct qmi_rmnet_ps_ind *ps_ind);
int qmi_rmnet_ps_ind_deregister(void *port,
				struct qmi_rmnet_ps_ind *ps_ind);
void qmi_rmnet_ps_off_notify(void *port);
void qmi_rmnet_ps_on_notify(void *port);

#else
static inline int qmi_rmnet_set_powersave_mode(void *port, uint8_t enable)
{
@@ -91,6 +107,27 @@ static inline void qmi_rmnet_work_exit(void *port)
static inline void qmi_rmnet_work_maybe_restart(void *port)
{

}

static inline int qmi_rmnet_ps_ind_register(struct rmnet_port *port,
				     struct qmi_rmnet_ps_ind *ps_ind)
{
	return 0;
}
static inline int qmi_rmnet_ps_ind_deregister(struct rmnet_port *port,
				       struct qmi_rmnet_ps_ind *ps_ind)
{
	return 0;
}

static inline void qmi_rmnet_ps_off_notify(struct rmnet_port *port)
{

}

static inline void qmi_rmnet_ps_on_notify(struct rmnet_port *port)
{

}
#endif
#endif /*_QMI_RMNET_H*/
+6 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ void rmnet_enable_all_flows(void *port);
void rmnet_set_powersave_format(void *port);
void rmnet_clear_powersave_format(void *port);
void rmnet_get_packets(void *port, u64 *rx, u64 *tx);
int rmnet_get_powersave_notif(void *port);
#else
static inline void *rmnet_get_qmi_pt(void *port)
{
@@ -72,5 +73,10 @@ static inline void rmnet_get_packets(void *port, u64 *rx, u64 *tx)
{
}

static inline int rmnet_get_powersave_notif(void *port)
{
	return 0;
}

#endif /* CONFIG_QCOM_QMI_RMNET */
#endif /*_RMNET_QMI_H*/