Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +17 −4 Original line number Original line Diff line number Diff line Loading @@ -39,6 +39,9 @@ /* Local Definitions and Declarations */ /* Local Definitions and Declarations */ #define RMNET_SCHED_BOOST_THRESH (500000000) bool rmnet_sched_boost; enum { enum { IFLA_RMNET_DFC_QOS = __IFLA_RMNET_MAX, IFLA_RMNET_DFC_QOS = __IFLA_RMNET_MAX, IFLA_RMNET_UL_AGG_PARAMS, IFLA_RMNET_UL_AGG_PARAMS, Loading Loading @@ -606,7 +609,7 @@ void rmnet_init_qmi_pt(void *port, void *qmi) } } EXPORT_SYMBOL(rmnet_init_qmi_pt); EXPORT_SYMBOL(rmnet_init_qmi_pt); void rmnet_get_packets(void *port, u64 *rx, u64 *tx) void rmnet_get_stats(void *port, u64 *rx, u64 *tx) { { struct rmnet_priv *priv; struct rmnet_priv *priv; struct rmnet_pcpu_stats *ps; struct rmnet_pcpu_stats *ps; Loading @@ -627,14 +630,14 @@ void rmnet_get_packets(void *port, u64 *rx, u64 *tx) ps = per_cpu_ptr(priv->pcpu_stats, cpu); ps = per_cpu_ptr(priv->pcpu_stats, cpu); do { do { start = u64_stats_fetch_begin_irq(&ps->syncp); start = u64_stats_fetch_begin_irq(&ps->syncp); *tx += ps->stats.tx_pkts; *tx += ps->stats.tx_bytes; *rx += ps->stats.rx_pkts; *rx += ps->stats.rx_bytes; } while (u64_stats_fetch_retry_irq(&ps->syncp, start)); } while (u64_stats_fetch_retry_irq(&ps->syncp, start)); } } } } rcu_read_unlock(); rcu_read_unlock(); } } EXPORT_SYMBOL(rmnet_get_packets); EXPORT_SYMBOL(rmnet_get_stats); void rmnet_set_powersave_format(void *port) void rmnet_set_powersave_format(void *port) { { Loading Loading @@ -702,6 +705,16 @@ int rmnet_get_powersave_notif(void *port) EXPORT_SYMBOL(rmnet_get_powersave_notif); EXPORT_SYMBOL(rmnet_get_powersave_notif); #endif #endif /* Set data rates (in bits/s) */ void rmnet_set_data_rates(void *port, u64 rx_rate, u64 tx_rate) { if (((struct rmnet_port *)port)->data_format & RMNET_FORMAT_TASK_BOOST) WRITE_ONCE(rmnet_sched_boost, (tx_rate >= RMNET_SCHED_BOOST_THRESH) ? true : false); } EXPORT_SYMBOL(rmnet_set_data_rates); /* Startup/Shutdown */ /* Startup/Shutdown */ static int __init rmnet_init(void) static int __init rmnet_init(void) Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,8 @@ #define RMNET_MAX_LOGICAL_EP 255 #define RMNET_MAX_LOGICAL_EP 255 #define RMNET_MAX_VEID 4 #define RMNET_MAX_VEID 4 extern bool rmnet_sched_boost; struct rmnet_endpoint { struct rmnet_endpoint { u8 mux_id; u8 mux_id; struct net_device *egress_dev; struct net_device *egress_dev; Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,9 @@ RMNET_INGRESS_FORMAT_DL_MARKER_V2) #define RMNET_INGRESS_FORMAT_PS BIT(27) #define RMNET_INGRESS_FORMAT_PS BIT(27) #define RMNET_FORMAT_PS_NOTIF BIT(26) #define RMNET_FORMAT_PS_NOTIF BIT(26) /* Task boost */ #define RMNET_FORMAT_TASK_BOOST BIT(25) /* Replace skb->dev to a virtual rmnet device and pass up the stack */ /* Replace skb->dev to a virtual rmnet device and pass up the stack */ #define RMNET_EPMODE_VND (1) #define RMNET_EPMODE_VND (1) /* Pass the frame directly to another device with dev_queue_xmit() */ /* Pass the frame directly to another device with dev_queue_xmit() */ Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +7 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,7 @@ #include <linux/etherdevice.h> #include <linux/etherdevice.h> #include <linux/if_arp.h> #include <linux/if_arp.h> #include <linux/ip.h> #include <linux/ip.h> #include <linux/sched.h> #include <net/pkt_sched.h> #include <net/pkt_sched.h> #include "rmnet_config.h" #include "rmnet_config.h" #include "rmnet_handlers.h" #include "rmnet_handlers.h" Loading @@ -19,6 +20,9 @@ #include <soc/qcom/qmi_rmnet.h> #include <soc/qcom/qmi_rmnet.h> #include <soc/qcom/rmnet_qmi.h> #include <soc/qcom/rmnet_qmi.h> /* Task boost time in ms */ #define RMNET_TASK_BOOST_PERIOD 10000 /* RX/TX Fixup */ /* RX/TX Fixup */ void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len) void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len) Loading Loading @@ -161,6 +165,9 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev, struct rmnet_priv *priv = netdev_priv(dev); struct rmnet_priv *priv = netdev_priv(dev); int txq = 0; int txq = 0; if (READ_ONCE(rmnet_sched_boost)) set_task_boost(1, RMNET_TASK_BOOST_PERIOD); if (priv->real_dev) if (priv->real_dev) txq = qmi_rmnet_get_queue(dev, skb); txq = qmi_rmnet_get_queue(dev, skb); Loading drivers/soc/qcom/qmi_rmnet.c +18 −10 Original line number Original line Diff line number Diff line Loading @@ -787,8 +787,8 @@ static LIST_HEAD(ps_list); struct rmnet_powersave_work { struct rmnet_powersave_work { struct delayed_work work; struct delayed_work work; void *port; void *port; u64 old_rx_pkts; u64 old_rx_bytes; u64 old_tx_pkts; u64 old_tx_bytes; }; }; void qmi_rmnet_ps_on_notify(void *port) void qmi_rmnet_ps_on_notify(void *port) Loading Loading @@ -874,8 +874,9 @@ static void qmi_rmnet_check_stats(struct work_struct *work) { { struct rmnet_powersave_work *real_work; struct rmnet_powersave_work *real_work; struct qmi_info *qmi; struct qmi_info *qmi; u64 rxd, txd; s64 rxd, txd; u64 rx, tx; u64 rx, tx; u64 rx_rate, tx_rate; bool dl_msg_active; bool dl_msg_active; real_work = container_of(to_delayed_work(work), real_work = container_of(to_delayed_work(work), Loading Loading @@ -908,11 +909,18 @@ static void qmi_rmnet_check_stats(struct work_struct *work) goto end; goto end; } } rmnet_get_packets(real_work->port, &rx, &tx); rmnet_get_stats(real_work->port, &rx, &tx); rxd = rx - real_work->old_rx_pkts; rxd = rx - real_work->old_rx_bytes; txd = tx - real_work->old_tx_pkts; txd = tx - real_work->old_tx_bytes; real_work->old_rx_pkts = rx; real_work->old_rx_bytes = rx; real_work->old_tx_pkts = tx; real_work->old_tx_bytes = tx; if (rxd >= 0 && txd >= 0) { /* data rates in bits/s */ rx_rate = (rxd * HZ / PS_INTERVAL) << 3; tx_rate = (txd * HZ / PS_INTERVAL) << 3; rmnet_set_data_rates(real_work->port, rx_rate, tx_rate); } dl_msg_active = qmi->dl_msg_active; dl_msg_active = qmi->dl_msg_active; qmi->dl_msg_active = false; qmi->dl_msg_active = false; Loading Loading @@ -982,8 +990,8 @@ void qmi_rmnet_work_init(void *port) } } INIT_DEFERRABLE_WORK(&rmnet_work->work, qmi_rmnet_check_stats); INIT_DEFERRABLE_WORK(&rmnet_work->work, qmi_rmnet_check_stats); rmnet_work->port = port; rmnet_work->port = port; rmnet_get_packets(rmnet_work->port, &rmnet_work->old_rx_pkts, rmnet_get_stats(rmnet_work->port, &rmnet_work->old_rx_bytes, &rmnet_work->old_tx_pkts); &rmnet_work->old_tx_bytes); rmnet_work_quit = false; rmnet_work_quit = false; qmi_rmnet_work_set_active(rmnet_work->port, 1); qmi_rmnet_work_set_active(rmnet_work->port, 1); Loading Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +17 −4 Original line number Original line Diff line number Diff line Loading @@ -39,6 +39,9 @@ /* Local Definitions and Declarations */ /* Local Definitions and Declarations */ #define RMNET_SCHED_BOOST_THRESH (500000000) bool rmnet_sched_boost; enum { enum { IFLA_RMNET_DFC_QOS = __IFLA_RMNET_MAX, IFLA_RMNET_DFC_QOS = __IFLA_RMNET_MAX, IFLA_RMNET_UL_AGG_PARAMS, IFLA_RMNET_UL_AGG_PARAMS, Loading Loading @@ -606,7 +609,7 @@ void rmnet_init_qmi_pt(void *port, void *qmi) } } EXPORT_SYMBOL(rmnet_init_qmi_pt); EXPORT_SYMBOL(rmnet_init_qmi_pt); void rmnet_get_packets(void *port, u64 *rx, u64 *tx) void rmnet_get_stats(void *port, u64 *rx, u64 *tx) { { struct rmnet_priv *priv; struct rmnet_priv *priv; struct rmnet_pcpu_stats *ps; struct rmnet_pcpu_stats *ps; Loading @@ -627,14 +630,14 @@ void rmnet_get_packets(void *port, u64 *rx, u64 *tx) ps = per_cpu_ptr(priv->pcpu_stats, cpu); ps = per_cpu_ptr(priv->pcpu_stats, cpu); do { do { start = u64_stats_fetch_begin_irq(&ps->syncp); start = u64_stats_fetch_begin_irq(&ps->syncp); *tx += ps->stats.tx_pkts; *tx += ps->stats.tx_bytes; *rx += ps->stats.rx_pkts; *rx += ps->stats.rx_bytes; } while (u64_stats_fetch_retry_irq(&ps->syncp, start)); } while (u64_stats_fetch_retry_irq(&ps->syncp, start)); } } } } rcu_read_unlock(); rcu_read_unlock(); } } EXPORT_SYMBOL(rmnet_get_packets); EXPORT_SYMBOL(rmnet_get_stats); void rmnet_set_powersave_format(void *port) void rmnet_set_powersave_format(void *port) { { Loading Loading @@ -702,6 +705,16 @@ int rmnet_get_powersave_notif(void *port) EXPORT_SYMBOL(rmnet_get_powersave_notif); EXPORT_SYMBOL(rmnet_get_powersave_notif); #endif #endif /* Set data rates (in bits/s) */ void rmnet_set_data_rates(void *port, u64 rx_rate, u64 tx_rate) { if (((struct rmnet_port *)port)->data_format & RMNET_FORMAT_TASK_BOOST) WRITE_ONCE(rmnet_sched_boost, (tx_rate >= RMNET_SCHED_BOOST_THRESH) ? true : false); } EXPORT_SYMBOL(rmnet_set_data_rates); /* Startup/Shutdown */ /* Startup/Shutdown */ static int __init rmnet_init(void) static int __init rmnet_init(void) Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,8 @@ #define RMNET_MAX_LOGICAL_EP 255 #define RMNET_MAX_LOGICAL_EP 255 #define RMNET_MAX_VEID 4 #define RMNET_MAX_VEID 4 extern bool rmnet_sched_boost; struct rmnet_endpoint { struct rmnet_endpoint { u8 mux_id; u8 mux_id; struct net_device *egress_dev; struct net_device *egress_dev; Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_private.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -22,6 +22,9 @@ RMNET_INGRESS_FORMAT_DL_MARKER_V2) #define RMNET_INGRESS_FORMAT_PS BIT(27) #define RMNET_INGRESS_FORMAT_PS BIT(27) #define RMNET_FORMAT_PS_NOTIF BIT(26) #define RMNET_FORMAT_PS_NOTIF BIT(26) /* Task boost */ #define RMNET_FORMAT_TASK_BOOST BIT(25) /* Replace skb->dev to a virtual rmnet device and pass up the stack */ /* Replace skb->dev to a virtual rmnet device and pass up the stack */ #define RMNET_EPMODE_VND (1) #define RMNET_EPMODE_VND (1) /* Pass the frame directly to another device with dev_queue_xmit() */ /* Pass the frame directly to another device with dev_queue_xmit() */ Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +7 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,7 @@ #include <linux/etherdevice.h> #include <linux/etherdevice.h> #include <linux/if_arp.h> #include <linux/if_arp.h> #include <linux/ip.h> #include <linux/ip.h> #include <linux/sched.h> #include <net/pkt_sched.h> #include <net/pkt_sched.h> #include "rmnet_config.h" #include "rmnet_config.h" #include "rmnet_handlers.h" #include "rmnet_handlers.h" Loading @@ -19,6 +20,9 @@ #include <soc/qcom/qmi_rmnet.h> #include <soc/qcom/qmi_rmnet.h> #include <soc/qcom/rmnet_qmi.h> #include <soc/qcom/rmnet_qmi.h> /* Task boost time in ms */ #define RMNET_TASK_BOOST_PERIOD 10000 /* RX/TX Fixup */ /* RX/TX Fixup */ void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len) void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len) Loading Loading @@ -161,6 +165,9 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev, struct rmnet_priv *priv = netdev_priv(dev); struct rmnet_priv *priv = netdev_priv(dev); int txq = 0; int txq = 0; if (READ_ONCE(rmnet_sched_boost)) set_task_boost(1, RMNET_TASK_BOOST_PERIOD); if (priv->real_dev) if (priv->real_dev) txq = qmi_rmnet_get_queue(dev, skb); txq = qmi_rmnet_get_queue(dev, skb); Loading
drivers/soc/qcom/qmi_rmnet.c +18 −10 Original line number Original line Diff line number Diff line Loading @@ -787,8 +787,8 @@ static LIST_HEAD(ps_list); struct rmnet_powersave_work { struct rmnet_powersave_work { struct delayed_work work; struct delayed_work work; void *port; void *port; u64 old_rx_pkts; u64 old_rx_bytes; u64 old_tx_pkts; u64 old_tx_bytes; }; }; void qmi_rmnet_ps_on_notify(void *port) void qmi_rmnet_ps_on_notify(void *port) Loading Loading @@ -874,8 +874,9 @@ static void qmi_rmnet_check_stats(struct work_struct *work) { { struct rmnet_powersave_work *real_work; struct rmnet_powersave_work *real_work; struct qmi_info *qmi; struct qmi_info *qmi; u64 rxd, txd; s64 rxd, txd; u64 rx, tx; u64 rx, tx; u64 rx_rate, tx_rate; bool dl_msg_active; bool dl_msg_active; real_work = container_of(to_delayed_work(work), real_work = container_of(to_delayed_work(work), Loading Loading @@ -908,11 +909,18 @@ static void qmi_rmnet_check_stats(struct work_struct *work) goto end; goto end; } } rmnet_get_packets(real_work->port, &rx, &tx); rmnet_get_stats(real_work->port, &rx, &tx); rxd = rx - real_work->old_rx_pkts; rxd = rx - real_work->old_rx_bytes; txd = tx - real_work->old_tx_pkts; txd = tx - real_work->old_tx_bytes; real_work->old_rx_pkts = rx; real_work->old_rx_bytes = rx; real_work->old_tx_pkts = tx; real_work->old_tx_bytes = tx; if (rxd >= 0 && txd >= 0) { /* data rates in bits/s */ rx_rate = (rxd * HZ / PS_INTERVAL) << 3; tx_rate = (txd * HZ / PS_INTERVAL) << 3; rmnet_set_data_rates(real_work->port, rx_rate, tx_rate); } dl_msg_active = qmi->dl_msg_active; dl_msg_active = qmi->dl_msg_active; qmi->dl_msg_active = false; qmi->dl_msg_active = false; Loading Loading @@ -982,8 +990,8 @@ void qmi_rmnet_work_init(void *port) } } INIT_DEFERRABLE_WORK(&rmnet_work->work, qmi_rmnet_check_stats); INIT_DEFERRABLE_WORK(&rmnet_work->work, qmi_rmnet_check_stats); rmnet_work->port = port; rmnet_work->port = port; rmnet_get_packets(rmnet_work->port, &rmnet_work->old_rx_pkts, rmnet_get_stats(rmnet_work->port, &rmnet_work->old_rx_bytes, &rmnet_work->old_tx_pkts); &rmnet_work->old_tx_bytes); rmnet_work_quit = false; rmnet_work_quit = false; qmi_rmnet_work_set_active(rmnet_work->port, 1); qmi_rmnet_work_set_active(rmnet_work->port, 1); Loading