Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +13 −1 Original line number Diff line number Diff line Loading @@ -264,6 +264,8 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head) unregister_netdevice(dev); qmi_rmnet_qos_exit_post(); rmnet_unregister_real_device(real_dev, port); } Loading @@ -275,6 +277,7 @@ static void rmnet_force_unassociate_device(struct net_device *dev) struct rmnet_port *port; unsigned long bkt_ep; LIST_HEAD(list); HLIST_HEAD(cleanup_list); if (!rmnet_is_real_dev_registered(real_dev)) return; Loading @@ -291,14 +294,23 @@ static void rmnet_force_unassociate_device(struct net_device *dev) rmnet_vnd_dellink(ep->mux_id, port, ep); hlist_del_init_rcu(&ep->hlnode); hlist_add_head(&ep->hlnode, &cleanup_list); } synchronize_rcu(); hlist_for_each_entry_safe(ep, tmp_ep, &cleanup_list, hlnode) { hlist_del(&ep->hlnode); kfree(ep); } /* Unregistering devices in context before freeing port. * If this API becomes non-context their order should switch. */ unregister_netdevice_many(&list); qmi_rmnet_qos_exit_post(); rmnet_unregister_real_device(real_dev, port); } Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +1 −2 Original line number Diff line number Diff line Loading @@ -128,8 +128,7 @@ static void rmnet_vnd_uninit(struct net_device *dev) qos = priv->qos_info; RCU_INIT_POINTER(priv->qos_info, NULL); synchronize_rcu(); qmi_rmnet_qos_exit(dev, qos); qmi_rmnet_qos_exit_pre(qos); } static void rmnet_get_stats64(struct net_device *dev, Loading drivers/soc/qcom/qmi_rmnet.c +19 −15 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ MODULE_PARM_DESC(rmnet_wq_frequency, "Frequency of PS check in ms"); #ifdef CONFIG_QCOM_QMI_DFC static unsigned int qmi_rmnet_scale_factor = 5; static LIST_HEAD(qos_cleanup_list); #endif static int Loading Loading @@ -139,8 +140,7 @@ qmi_rmnet_has_pending(struct qmi_info *qmi) #ifdef CONFIG_QCOM_QMI_DFC static void qmi_rmnet_clean_flow_list(struct qmi_info *qmi, struct net_device *dev, struct qos_info *qos) qmi_rmnet_clean_flow_list(struct qos_info *qos) { struct rmnet_bearer_map *bearer, *br_tmp; struct rmnet_flow_map *itm, *fl_tmp; Loading Loading @@ -510,10 +510,6 @@ struct rmnet_bearer_map *qmi_rmnet_get_bearer_noref(struct qos_info *qos_info, } #else static inline void qmi_rmnet_clean_flow_list(struct qos_info *qos) { } static inline void qmi_rmnet_update_flow_map(struct rmnet_flow_map *itm, struct rmnet_flow_map *new_map) Loading Loading @@ -923,19 +919,27 @@ void *qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id) } EXPORT_SYMBOL(qmi_rmnet_qos_init); void qmi_rmnet_qos_exit(struct net_device *dev, void *qos) void qmi_rmnet_qos_exit_pre(void *qos) { void *port = rmnet_get_rmnet_port(dev); struct qmi_info *qmi = rmnet_get_qmi_pt(port); struct qos_info *qos_info = (struct qos_info *)qos; if (!qmi || !qos) if (!qos) return; qmi_rmnet_clean_flow_list(qmi, dev, qos_info); list_add(&((struct qos_info *)qos)->list, &qos_cleanup_list); } EXPORT_SYMBOL(qmi_rmnet_qos_exit_pre); void qmi_rmnet_qos_exit_post(void) { struct qos_info *qos, *tmp; synchronize_rcu(); list_for_each_entry_safe(qos, tmp, &qos_cleanup_list, list) { list_del(&qos->list); qmi_rmnet_clean_flow_list(qos); kfree(qos); } EXPORT_SYMBOL(qmi_rmnet_qos_exit); } EXPORT_SYMBOL(qmi_rmnet_qos_exit_post); #endif #ifdef CONFIG_QCOM_QMI_POWER_COLLAPSE Loading drivers/soc/qcom/qmi_rmnet_i.h +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ struct mq_map { }; struct qos_info { struct list_head list; u8 mux_id; struct net_device *real_dev; struct list_head flow_head; Loading include/soc/qcom/qmi_rmnet.h +7 −2 Original line number Diff line number Diff line Loading @@ -53,7 +53,8 @@ qmi_rmnet_all_flows_enabled(struct net_device *dev) #ifdef CONFIG_QCOM_QMI_DFC void *qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id); void qmi_rmnet_qos_exit(struct net_device *dev, void *qos); void qmi_rmnet_qos_exit_pre(void *qos); void qmi_rmnet_qos_exit_post(void); void qmi_rmnet_burst_fc_check(struct net_device *dev, int ip_type, u32 mark, unsigned int len); int qmi_rmnet_get_queue(struct net_device *dev, struct sk_buff *skb); Loading @@ -64,7 +65,11 @@ qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id) return NULL; } static inline void qmi_rmnet_qos_exit(struct net_device *dev, void *qos) static inline void qmi_rmnet_qos_exit_pre(void *qos) { } static inline void qmi_rmnet_qos_exit_post(void) { } Loading Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +13 −1 Original line number Diff line number Diff line Loading @@ -264,6 +264,8 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head) unregister_netdevice(dev); qmi_rmnet_qos_exit_post(); rmnet_unregister_real_device(real_dev, port); } Loading @@ -275,6 +277,7 @@ static void rmnet_force_unassociate_device(struct net_device *dev) struct rmnet_port *port; unsigned long bkt_ep; LIST_HEAD(list); HLIST_HEAD(cleanup_list); if (!rmnet_is_real_dev_registered(real_dev)) return; Loading @@ -291,14 +294,23 @@ static void rmnet_force_unassociate_device(struct net_device *dev) rmnet_vnd_dellink(ep->mux_id, port, ep); hlist_del_init_rcu(&ep->hlnode); hlist_add_head(&ep->hlnode, &cleanup_list); } synchronize_rcu(); hlist_for_each_entry_safe(ep, tmp_ep, &cleanup_list, hlnode) { hlist_del(&ep->hlnode); kfree(ep); } /* Unregistering devices in context before freeing port. * If this API becomes non-context their order should switch. */ unregister_netdevice_many(&list); qmi_rmnet_qos_exit_post(); rmnet_unregister_real_device(real_dev, port); } Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +1 −2 Original line number Diff line number Diff line Loading @@ -128,8 +128,7 @@ static void rmnet_vnd_uninit(struct net_device *dev) qos = priv->qos_info; RCU_INIT_POINTER(priv->qos_info, NULL); synchronize_rcu(); qmi_rmnet_qos_exit(dev, qos); qmi_rmnet_qos_exit_pre(qos); } static void rmnet_get_stats64(struct net_device *dev, Loading
drivers/soc/qcom/qmi_rmnet.c +19 −15 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ MODULE_PARM_DESC(rmnet_wq_frequency, "Frequency of PS check in ms"); #ifdef CONFIG_QCOM_QMI_DFC static unsigned int qmi_rmnet_scale_factor = 5; static LIST_HEAD(qos_cleanup_list); #endif static int Loading Loading @@ -139,8 +140,7 @@ qmi_rmnet_has_pending(struct qmi_info *qmi) #ifdef CONFIG_QCOM_QMI_DFC static void qmi_rmnet_clean_flow_list(struct qmi_info *qmi, struct net_device *dev, struct qos_info *qos) qmi_rmnet_clean_flow_list(struct qos_info *qos) { struct rmnet_bearer_map *bearer, *br_tmp; struct rmnet_flow_map *itm, *fl_tmp; Loading Loading @@ -510,10 +510,6 @@ struct rmnet_bearer_map *qmi_rmnet_get_bearer_noref(struct qos_info *qos_info, } #else static inline void qmi_rmnet_clean_flow_list(struct qos_info *qos) { } static inline void qmi_rmnet_update_flow_map(struct rmnet_flow_map *itm, struct rmnet_flow_map *new_map) Loading Loading @@ -923,19 +919,27 @@ void *qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id) } EXPORT_SYMBOL(qmi_rmnet_qos_init); void qmi_rmnet_qos_exit(struct net_device *dev, void *qos) void qmi_rmnet_qos_exit_pre(void *qos) { void *port = rmnet_get_rmnet_port(dev); struct qmi_info *qmi = rmnet_get_qmi_pt(port); struct qos_info *qos_info = (struct qos_info *)qos; if (!qmi || !qos) if (!qos) return; qmi_rmnet_clean_flow_list(qmi, dev, qos_info); list_add(&((struct qos_info *)qos)->list, &qos_cleanup_list); } EXPORT_SYMBOL(qmi_rmnet_qos_exit_pre); void qmi_rmnet_qos_exit_post(void) { struct qos_info *qos, *tmp; synchronize_rcu(); list_for_each_entry_safe(qos, tmp, &qos_cleanup_list, list) { list_del(&qos->list); qmi_rmnet_clean_flow_list(qos); kfree(qos); } EXPORT_SYMBOL(qmi_rmnet_qos_exit); } EXPORT_SYMBOL(qmi_rmnet_qos_exit_post); #endif #ifdef CONFIG_QCOM_QMI_POWER_COLLAPSE Loading
drivers/soc/qcom/qmi_rmnet_i.h +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ struct mq_map { }; struct qos_info { struct list_head list; u8 mux_id; struct net_device *real_dev; struct list_head flow_head; Loading
include/soc/qcom/qmi_rmnet.h +7 −2 Original line number Diff line number Diff line Loading @@ -53,7 +53,8 @@ qmi_rmnet_all_flows_enabled(struct net_device *dev) #ifdef CONFIG_QCOM_QMI_DFC void *qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id); void qmi_rmnet_qos_exit(struct net_device *dev, void *qos); void qmi_rmnet_qos_exit_pre(void *qos); void qmi_rmnet_qos_exit_post(void); void qmi_rmnet_burst_fc_check(struct net_device *dev, int ip_type, u32 mark, unsigned int len); int qmi_rmnet_get_queue(struct net_device *dev, struct sk_buff *skb); Loading @@ -64,7 +65,11 @@ qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id) return NULL; } static inline void qmi_rmnet_qos_exit(struct net_device *dev, void *qos) static inline void qmi_rmnet_qos_exit_pre(void *qos) { } static inline void qmi_rmnet_qos_exit_post(void) { } Loading