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

Commit c6c59a43 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "rmnet_shs: power save indication and ssr fix"

parents 90c519b6 69fbfed1
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,9 @@
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h>
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_trace.h>

#include <../include/soc/qcom/qmi_rmnet.h>


#ifndef _RMNET_SHS_H_
#define _RMNET_SHS_H_

@@ -54,6 +57,7 @@ struct rmnet_shs_cfg_s {
	struct	hrtimer hrtimer_shs;
	struct rps_map *map;
	struct rmnet_map_dl_ind dl_mrk_ind_cb;
	struct qmi_rmnet_ps_ind rmnet_idl_ind_cb;
	struct rmnet_port *port;
	long int num_bytes_parked;
	long int num_pkts_parked;
@@ -230,4 +234,7 @@ void rmnet_shs_flush_table(u8 is_force_flush);
void rmnet_shs_cpu_node_remove(struct rmnet_shs_skbn_s *node);
void rmnet_shs_init(struct net_device *dev);
void rmnet_shs_exit(void);
void rmnet_shs_ps_on_hdlr(void *port);
void rmnet_shs_ps_off_hdlr(void *port);

#endif /* _RMNET_SHS_H_ */
+11 −1
Original line number Diff line number Diff line
@@ -109,7 +109,8 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
			/* Need separate if check to avoid
			 * NULL dereferencing
			 */
			if (rmnet_shs_skb_entry != NULL && phy_dev) {

			if (phy_dev) {
				rmnet_shs_init(phy_dev);
				rmnet_shs_wq_init(phy_dev);
				rmnet_shs_aggregate_init();
@@ -122,8 +123,17 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
						     RMNET_SHS_MODULE_INIT_WQ,
						     0xDEF, 0xDEF, 0xDEF,
						     0xDEF, NULL, NULL);
				rmnet_shs_cfg.rmnet_idl_ind_cb.ps_on_handler =
						&rmnet_shs_ps_on_hdlr;
				rmnet_shs_cfg.rmnet_idl_ind_cb.ps_off_handler =
						&rmnet_shs_ps_off_hdlr;
				RCU_INIT_POINTER(rmnet_shs_skb_entry,
						 rmnet_shs_assign);


			}
			rmnet_shs_wq_set_ep_active(dev);

		}

		break;
+19 −2
Original line number Diff line number Diff line
@@ -686,9 +686,20 @@ void rmnet_shs_aggregate_init(void)
	rmnet_shs_cfg.hrtimer_shs.function = rmnet_shs_map_flush_queue;
}

void rmnet_shs_dl_hdr_handler(struct rmnet_map_dl_ind_hdr *dlhdr)
void rmnet_shs_ps_on_hdlr(void *port)
{
	rmnet_shs_flush_table(1);
	rmnet_shs_wq_pause();
}

void rmnet_shs_ps_off_hdlr(void *port)
{
	rmnet_shs_wq_restart();

}

void rmnet_shs_dl_hdr_handler(struct rmnet_map_dl_ind_hdr *dlhdr)
{
	trace_rmnet_shs_low(RMNET_SHS_DL_MRK, RMNET_SHS_DL_MRK_HDR_HDLR_START,
			    dlhdr->le.seq, dlhdr->le.pkts,
			    0xDEF, 0xDEF, NULL, NULL);
@@ -727,7 +738,6 @@ void rmnet_shs_init(struct net_device *dev)
		INIT_LIST_HEAD(&rmnet_shs_cpu_node_tbl[num_cpu].node_list_id);

	rmnet_shs_init_complete = 1;

}

/* Invoked during SHS module exit to gracefully consume all
@@ -760,6 +770,7 @@ void rmnet_shs_cancel_table(void)
	rmnet_shs_cfg.num_pkts_parked = 0;
	rmnet_shs_cfg.is_pkt_parked = 0;
	rmnet_shs_cfg.force_flush_state = RMNET_SHS_FLUSH_DONE;

	spin_unlock_irqrestore(&rmnet_shs_ht_splock, ht_flags);

}
@@ -911,6 +922,9 @@ void rmnet_shs_assign(struct sk_buff *skb, struct rmnet_port *port)

	if (!rmnet_shs_cfg.is_reg_dl_mrk_ind) {
		rmnet_map_dl_ind_register(port, &rmnet_shs_cfg.dl_mrk_ind_cb);
		qmi_rmnet_ps_ind_register(port,
					  &rmnet_shs_cfg.rmnet_idl_ind_cb);

		rmnet_shs_cfg.is_reg_dl_mrk_ind = 1;
		INIT_WORK(&shs_delayed_work.work, rmnet_flush_buffered);
		shs_delayed_work.port = port;
@@ -983,6 +997,8 @@ void rmnet_shs_assign(struct sk_buff *skb, struct rmnet_port *port)
 */
void rmnet_shs_exit(void)
{
	qmi_rmnet_ps_ind_deregister(rmnet_shs_cfg.port,
				    &rmnet_shs_cfg.rmnet_idl_ind_cb);

	rmnet_shs_cfg.dl_mrk_ind_cb.dl_hdr_handler = NULL;
	rmnet_shs_cfg.dl_mrk_ind_cb.dl_trl_handler = NULL;
@@ -993,5 +1009,6 @@ void rmnet_shs_exit(void)
		hrtimer_cancel(&rmnet_shs_cfg.hrtimer_shs);

	memset(&rmnet_shs_cfg, 0, sizeof(rmnet_shs_cfg));
	rmnet_shs_init_complete = 0;

}
+15 −1
Original line number Diff line number Diff line
@@ -1091,8 +1091,10 @@ int rmnet_shs_wq_get_perf_cpu_new_flow(struct net_device *dev)
		if (!ep->is_ep_active)
			continue;

		if (ep->ep->egress_dev == dev)
		if (ep->ep->egress_dev == dev) {
			is_match_found = 1;
			break;
		}
	}

	if (!is_match_found) {
@@ -1354,6 +1356,18 @@ void rmnet_shs_wq_init_cpu_rx_flow_tbl(void)

}

void rmnet_shs_wq_pause(void)
{
	if (rmnet_shs_wq && rmnet_shs_delayed_wq)
		cancel_delayed_work_sync(&rmnet_shs_delayed_wq->wq);
}

void rmnet_shs_wq_restart(void)
{
	if (rmnet_shs_wq && rmnet_shs_delayed_wq)
		queue_delayed_work(rmnet_shs_wq, &rmnet_shs_delayed_wq->wq, 0);
}

void rmnet_shs_wq_init(struct net_device *dev)
{
	/*If the workqueue is already initialized we should not be
+3 −0
Original line number Diff line number Diff line
@@ -195,6 +195,9 @@ enum rmnet_shs_wq_trace_evt {
};
void rmnet_shs_wq_init(struct net_device *dev);
void rmnet_shs_wq_exit(void);
void rmnet_shs_wq_restart(void);
void rmnet_shs_wq_pause(void);

u64 rmnet_shs_wq_get_max_pps_among_cores(u32 core_msk);
void rmnet_shs_wq_create_new_flow(struct rmnet_shs_skbn_s *node_p);
int rmnet_shs_wq_get_least_utilized_core(u16 core_msk);