Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +7 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +1 −0 Original line number Diff line number Diff line Loading @@ -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) Loading drivers/soc/qcom/qmi_rmnet.c +62 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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: Loading Loading @@ -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, Loading include/soc/qcom/qmi_rmnet.h +37 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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*/ include/soc/qcom/rmnet_qmi.h +6 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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*/ Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +7 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +1 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
drivers/soc/qcom/qmi_rmnet.c +62 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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: Loading Loading @@ -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, Loading
include/soc/qcom/qmi_rmnet.h +37 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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*/
include/soc/qcom/rmnet_qmi.h +6 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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*/