Loading drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,9 @@ const char *ipa_event_name[] = { __stringify(ECM_DISCONNECT), __stringify(IPA_TETHERING_STATS_UPDATE_STATS), __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS), __stringify(IPA_QUOTA_REACH), __stringify(IPA_SSR_BEFORE_SHUTDOWN), __stringify(IPA_SSR_AFTER_POWERUP), }; const char *ipa_hdr_l2_type_name[] = { Loading drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h +3 −0 Original line number Diff line number Diff line Loading @@ -177,6 +177,9 @@ int rmnet_ipa_set_tether_client_pipe(struct wan_ioctl_set_tether_client_pipe int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data, bool reset); int rmnet_ipa_query_tethering_stats_all( struct wan_ioctl_query_tether_stats_all *data); int rmnet_ipa_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data); int ipa_qmi_get_data_stats(struct ipa_get_data_stats_req_msg_v01 *req, Loading drivers/platform/msm/ipa/ipa_v2/ipa_utils.c +1 −1 Original line number Diff line number Diff line Loading @@ -946,7 +946,7 @@ int ipa2_get_ep_mapping(enum ipa_client_type client) void ipa2_set_client(int index, enum ipacm_client_enum client, bool uplink) { if (client >= IPACM_CLIENT_MAX || client < IPACM_CLIENT_USB) { if (client > IPACM_CLIENT_MAX || client < IPACM_CLIENT_USB) { IPAERR("Bad client number! client =%d\n", client); } else if (index >= IPA_MAX_NUM_PIPES || index < 0) { IPAERR("Bad pipe index! index =%d\n", index); Loading drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +96 −7 Original line number Diff line number Diff line Loading @@ -2334,6 +2334,29 @@ static struct platform_driver rmnet_ipa_driver = { .remove = ipa_wwan_remove, }; /** * rmnet_ipa_send_ssr_notification(bool ssr_done) - send SSR notification * * This function sends the SSR notification before modem shutdown and * after_powerup from SSR framework, to user-space module */ static void rmnet_ipa_send_ssr_notification(bool ssr_done) { struct ipa_msg_meta msg_meta; int rc; memset(&msg_meta, 0, sizeof(struct ipa_msg_meta)); if (ssr_done) msg_meta.msg_type = IPA_SSR_AFTER_POWERUP; else msg_meta.msg_type = IPA_SSR_BEFORE_SHUTDOWN; rc = ipa_send_msg(&msg_meta, NULL, NULL); if (rc) { IPAWANERR("ipa_send_msg failed: %d\n", rc); return; } } static int ssr_notifier_cb(struct notifier_block *this, unsigned long code, void *data) Loading @@ -2341,6 +2364,8 @@ static int ssr_notifier_cb(struct notifier_block *this, if (ipa_rmnet_ctx.ipa_rmnet_ssr) { if (SUBSYS_BEFORE_SHUTDOWN == code) { pr_info("IPA received MPSS BEFORE_SHUTDOWN\n"); /* send SSR before-shutdown notification to IPACM */ rmnet_ipa_send_ssr_notification(false); atomic_set(&is_ssr, 1); ipa_q6_pre_shutdown_cleanup(); if (ipa_netdevs[0]) Loading Loading @@ -2516,6 +2541,26 @@ static void rmnet_ipa_get_network_stats_and_update(void) } } /** * rmnet_ipa_send_quota_reach_ind() - send quota_reach notification from * IPA Modem * This function sends the quota_reach indication from the IPA Modem driver * via QMI, to user-space module */ static void rmnet_ipa_send_quota_reach_ind(void) { struct ipa_msg_meta msg_meta; int rc; memset(&msg_meta, 0, sizeof(struct ipa_msg_meta)); msg_meta.msg_type = IPA_QUOTA_REACH; rc = ipa_send_msg(&msg_meta, NULL, NULL); if (rc) { IPAWANERR("ipa_send_msg failed: %d\n", rc); return; } } /** * rmnet_ipa_poll_tethering_stats() - Tethering stats polling IOCTL handler * @data - IOCTL data Loading Loading @@ -2796,7 +2841,7 @@ int rmnet_ipa_query_tethering_stats_modem( IPAWANERR("reset the pipe stats\n"); } else { /* print tethered-client enum */ IPAWANDBG_LOW("Tethered-client enum(%d)\n", data->ipa_client); IPAWANDBG("Tethered-client enum(%d)\n", data->ipa_client); } rc = ipa_qmi_get_data_stats(req, resp); Loading @@ -2805,10 +2850,6 @@ int rmnet_ipa_query_tethering_stats_modem( kfree(req); kfree(resp); return rc; } else if (reset) { kfree(req); kfree(resp); return 0; } if (resp->dl_dst_pipe_stats_list_valid) { Loading Loading @@ -2854,7 +2895,7 @@ int rmnet_ipa_query_tethering_stats_modem( } } } IPAWANDBG_LOW("v4_rx_p(%lu) v6_rx_p(%lu) v4_rx_b(%lu) v6_rx_b(%lu)\n", IPAWANDBG("v4_rx_p(%lu) v6_rx_p(%lu) v4_rx_b(%lu) v6_rx_b(%lu)\n", (unsigned long int) data->ipv4_rx_packets, (unsigned long int) data->ipv6_rx_packets, (unsigned long int) data->ipv4_rx_bytes, Loading Loading @@ -2904,7 +2945,7 @@ int rmnet_ipa_query_tethering_stats_modem( } } } IPAWANDBG_LOW("tx_p_v4(%lu)v6(%lu)tx_b_v4(%lu) v6(%lu)\n", IPAWANDBG("tx_p_v4(%lu)v6(%lu)tx_b_v4(%lu) v6(%lu)\n", (unsigned long int) data->ipv4_tx_packets, (unsigned long int) data->ipv6_tx_packets, (unsigned long int) data->ipv4_tx_bytes, Loading Loading @@ -2946,6 +2987,49 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data, return rc; } int rmnet_ipa_query_tethering_stats_all( struct wan_ioctl_query_tether_stats_all *data) { struct wan_ioctl_query_tether_stats tether_stats; enum ipa_upstream_type upstream_type; int rc = 0; memset(&tether_stats, 0, sizeof(struct wan_ioctl_query_tether_stats)); /* get IPA backhaul type */ upstream_type = find_upstream_type(data->upstreamIface); if (upstream_type == IPA_UPSTEAM_MAX) { IPAWANERR(" Wrong upstreamIface name %s\n", data->upstreamIface); } else if (upstream_type == IPA_UPSTEAM_WLAN) { IPAWANDBG_LOW(" query wifi-backhaul stats\n"); rc = rmnet_ipa_query_tethering_stats_wifi( &tether_stats, data->reset_stats); if (rc) { IPAWANERR("wlan WAN_IOC_QUERY_TETHER_STATS failed\n"); return rc; } data->tx_bytes = tether_stats.ipv4_tx_bytes + tether_stats.ipv6_tx_bytes; data->rx_bytes = tether_stats.ipv4_rx_bytes + tether_stats.ipv6_rx_bytes; } else { IPAWANDBG_LOW(" query modem-backhaul stats\n"); tether_stats.ipa_client = data->ipa_client; rc = rmnet_ipa_query_tethering_stats_modem( &tether_stats, data->reset_stats); if (rc) { IPAWANERR("modem WAN_IOC_QUERY_TETHER_STATS failed\n"); return rc; } data->tx_bytes = tether_stats.ipv4_tx_bytes + tether_stats.ipv6_tx_bytes; data->rx_bytes = tether_stats.ipv4_rx_bytes + tether_stats.ipv6_rx_bytes; } return rc; } int rmnet_ipa_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data) { enum ipa_upstream_type upstream_type; Loading Loading @@ -3047,6 +3131,8 @@ void ipa_broadcast_quota_reach_ind(u32 mux_id, IPAWANERR("putting nlmsg: <%s> <%s> <%s>\n", alert_msg, iface_name_l, iface_name_m); kobject_uevent_env(&(ipa_netdevs[0]->dev.kobj), KOBJ_CHANGE, envp); rmnet_ipa_send_quota_reach_ind(); } /** Loading @@ -3071,6 +3157,9 @@ void ipa_q6_handshake_complete(bool ssr_bootup) */ ipa2_proxy_clk_unvote(); /* send SSR power-up notification to IPACM */ rmnet_ipa_send_ssr_notification(true); /* * It is required to recover the network stats after * SSR recovery Loading drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c +30 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ #define WAN_IOC_QUERY_DL_FILTER_STATS32 _IOWR(WAN_IOC_MAGIC, \ WAN_IOCTL_QUERY_DL_FILTER_STATS, \ compat_uptr_t) #define WAN_IOC_QUERY_TETHER_STATS_ALL32 _IOWR(WAN_IOC_MAGIC, \ WAN_IOCTL_QUERY_TETHER_STATS_ALL, \ compat_uptr_t) #endif static unsigned int dev_num = 1; Loading Loading @@ -238,6 +242,32 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; case WAN_IOC_QUERY_TETHER_STATS_ALL: IPAWANDBG_LOW("got WAN_IOC_QUERY_TETHER_STATS_ALL :>>>\n"); pyld_sz = sizeof(struct wan_ioctl_query_tether_stats_all); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (rmnet_ipa_query_tethering_stats_all( (struct wan_ioctl_query_tether_stats_all *)param)) { IPAWANERR("WAN_IOC_QUERY_TETHER_STATS failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_RESET_TETHER_STATS: IPAWANDBG_LOW("got WAN_IOC_RESET_TETHER_STATS :>>>\n"); pyld_sz = sizeof(struct wan_ioctl_reset_tether_stats); Loading Loading
drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,9 @@ const char *ipa_event_name[] = { __stringify(ECM_DISCONNECT), __stringify(IPA_TETHERING_STATS_UPDATE_STATS), __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS), __stringify(IPA_QUOTA_REACH), __stringify(IPA_SSR_BEFORE_SHUTDOWN), __stringify(IPA_SSR_AFTER_POWERUP), }; const char *ipa_hdr_l2_type_name[] = { Loading
drivers/platform/msm/ipa/ipa_v2/ipa_qmi_service.h +3 −0 Original line number Diff line number Diff line Loading @@ -177,6 +177,9 @@ int rmnet_ipa_set_tether_client_pipe(struct wan_ioctl_set_tether_client_pipe int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data, bool reset); int rmnet_ipa_query_tethering_stats_all( struct wan_ioctl_query_tether_stats_all *data); int rmnet_ipa_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data); int ipa_qmi_get_data_stats(struct ipa_get_data_stats_req_msg_v01 *req, Loading
drivers/platform/msm/ipa/ipa_v2/ipa_utils.c +1 −1 Original line number Diff line number Diff line Loading @@ -946,7 +946,7 @@ int ipa2_get_ep_mapping(enum ipa_client_type client) void ipa2_set_client(int index, enum ipacm_client_enum client, bool uplink) { if (client >= IPACM_CLIENT_MAX || client < IPACM_CLIENT_USB) { if (client > IPACM_CLIENT_MAX || client < IPACM_CLIENT_USB) { IPAERR("Bad client number! client =%d\n", client); } else if (index >= IPA_MAX_NUM_PIPES || index < 0) { IPAERR("Bad pipe index! index =%d\n", index); Loading
drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +96 −7 Original line number Diff line number Diff line Loading @@ -2334,6 +2334,29 @@ static struct platform_driver rmnet_ipa_driver = { .remove = ipa_wwan_remove, }; /** * rmnet_ipa_send_ssr_notification(bool ssr_done) - send SSR notification * * This function sends the SSR notification before modem shutdown and * after_powerup from SSR framework, to user-space module */ static void rmnet_ipa_send_ssr_notification(bool ssr_done) { struct ipa_msg_meta msg_meta; int rc; memset(&msg_meta, 0, sizeof(struct ipa_msg_meta)); if (ssr_done) msg_meta.msg_type = IPA_SSR_AFTER_POWERUP; else msg_meta.msg_type = IPA_SSR_BEFORE_SHUTDOWN; rc = ipa_send_msg(&msg_meta, NULL, NULL); if (rc) { IPAWANERR("ipa_send_msg failed: %d\n", rc); return; } } static int ssr_notifier_cb(struct notifier_block *this, unsigned long code, void *data) Loading @@ -2341,6 +2364,8 @@ static int ssr_notifier_cb(struct notifier_block *this, if (ipa_rmnet_ctx.ipa_rmnet_ssr) { if (SUBSYS_BEFORE_SHUTDOWN == code) { pr_info("IPA received MPSS BEFORE_SHUTDOWN\n"); /* send SSR before-shutdown notification to IPACM */ rmnet_ipa_send_ssr_notification(false); atomic_set(&is_ssr, 1); ipa_q6_pre_shutdown_cleanup(); if (ipa_netdevs[0]) Loading Loading @@ -2516,6 +2541,26 @@ static void rmnet_ipa_get_network_stats_and_update(void) } } /** * rmnet_ipa_send_quota_reach_ind() - send quota_reach notification from * IPA Modem * This function sends the quota_reach indication from the IPA Modem driver * via QMI, to user-space module */ static void rmnet_ipa_send_quota_reach_ind(void) { struct ipa_msg_meta msg_meta; int rc; memset(&msg_meta, 0, sizeof(struct ipa_msg_meta)); msg_meta.msg_type = IPA_QUOTA_REACH; rc = ipa_send_msg(&msg_meta, NULL, NULL); if (rc) { IPAWANERR("ipa_send_msg failed: %d\n", rc); return; } } /** * rmnet_ipa_poll_tethering_stats() - Tethering stats polling IOCTL handler * @data - IOCTL data Loading Loading @@ -2796,7 +2841,7 @@ int rmnet_ipa_query_tethering_stats_modem( IPAWANERR("reset the pipe stats\n"); } else { /* print tethered-client enum */ IPAWANDBG_LOW("Tethered-client enum(%d)\n", data->ipa_client); IPAWANDBG("Tethered-client enum(%d)\n", data->ipa_client); } rc = ipa_qmi_get_data_stats(req, resp); Loading @@ -2805,10 +2850,6 @@ int rmnet_ipa_query_tethering_stats_modem( kfree(req); kfree(resp); return rc; } else if (reset) { kfree(req); kfree(resp); return 0; } if (resp->dl_dst_pipe_stats_list_valid) { Loading Loading @@ -2854,7 +2895,7 @@ int rmnet_ipa_query_tethering_stats_modem( } } } IPAWANDBG_LOW("v4_rx_p(%lu) v6_rx_p(%lu) v4_rx_b(%lu) v6_rx_b(%lu)\n", IPAWANDBG("v4_rx_p(%lu) v6_rx_p(%lu) v4_rx_b(%lu) v6_rx_b(%lu)\n", (unsigned long int) data->ipv4_rx_packets, (unsigned long int) data->ipv6_rx_packets, (unsigned long int) data->ipv4_rx_bytes, Loading Loading @@ -2904,7 +2945,7 @@ int rmnet_ipa_query_tethering_stats_modem( } } } IPAWANDBG_LOW("tx_p_v4(%lu)v6(%lu)tx_b_v4(%lu) v6(%lu)\n", IPAWANDBG("tx_p_v4(%lu)v6(%lu)tx_b_v4(%lu) v6(%lu)\n", (unsigned long int) data->ipv4_tx_packets, (unsigned long int) data->ipv6_tx_packets, (unsigned long int) data->ipv4_tx_bytes, Loading Loading @@ -2946,6 +2987,49 @@ int rmnet_ipa_query_tethering_stats(struct wan_ioctl_query_tether_stats *data, return rc; } int rmnet_ipa_query_tethering_stats_all( struct wan_ioctl_query_tether_stats_all *data) { struct wan_ioctl_query_tether_stats tether_stats; enum ipa_upstream_type upstream_type; int rc = 0; memset(&tether_stats, 0, sizeof(struct wan_ioctl_query_tether_stats)); /* get IPA backhaul type */ upstream_type = find_upstream_type(data->upstreamIface); if (upstream_type == IPA_UPSTEAM_MAX) { IPAWANERR(" Wrong upstreamIface name %s\n", data->upstreamIface); } else if (upstream_type == IPA_UPSTEAM_WLAN) { IPAWANDBG_LOW(" query wifi-backhaul stats\n"); rc = rmnet_ipa_query_tethering_stats_wifi( &tether_stats, data->reset_stats); if (rc) { IPAWANERR("wlan WAN_IOC_QUERY_TETHER_STATS failed\n"); return rc; } data->tx_bytes = tether_stats.ipv4_tx_bytes + tether_stats.ipv6_tx_bytes; data->rx_bytes = tether_stats.ipv4_rx_bytes + tether_stats.ipv6_rx_bytes; } else { IPAWANDBG_LOW(" query modem-backhaul stats\n"); tether_stats.ipa_client = data->ipa_client; rc = rmnet_ipa_query_tethering_stats_modem( &tether_stats, data->reset_stats); if (rc) { IPAWANERR("modem WAN_IOC_QUERY_TETHER_STATS failed\n"); return rc; } data->tx_bytes = tether_stats.ipv4_tx_bytes + tether_stats.ipv6_tx_bytes; data->rx_bytes = tether_stats.ipv4_rx_bytes + tether_stats.ipv6_rx_bytes; } return rc; } int rmnet_ipa_reset_tethering_stats(struct wan_ioctl_reset_tether_stats *data) { enum ipa_upstream_type upstream_type; Loading Loading @@ -3047,6 +3131,8 @@ void ipa_broadcast_quota_reach_ind(u32 mux_id, IPAWANERR("putting nlmsg: <%s> <%s> <%s>\n", alert_msg, iface_name_l, iface_name_m); kobject_uevent_env(&(ipa_netdevs[0]->dev.kobj), KOBJ_CHANGE, envp); rmnet_ipa_send_quota_reach_ind(); } /** Loading @@ -3071,6 +3157,9 @@ void ipa_q6_handshake_complete(bool ssr_bootup) */ ipa2_proxy_clk_unvote(); /* send SSR power-up notification to IPACM */ rmnet_ipa_send_ssr_notification(true); /* * It is required to recover the network stats after * SSR recovery Loading
drivers/platform/msm/ipa/ipa_v2/rmnet_ipa_fd_ioctl.c +30 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,10 @@ #define WAN_IOC_QUERY_DL_FILTER_STATS32 _IOWR(WAN_IOC_MAGIC, \ WAN_IOCTL_QUERY_DL_FILTER_STATS, \ compat_uptr_t) #define WAN_IOC_QUERY_TETHER_STATS_ALL32 _IOWR(WAN_IOC_MAGIC, \ WAN_IOCTL_QUERY_TETHER_STATS_ALL, \ compat_uptr_t) #endif static unsigned int dev_num = 1; Loading Loading @@ -238,6 +242,32 @@ static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; case WAN_IOC_QUERY_TETHER_STATS_ALL: IPAWANDBG_LOW("got WAN_IOC_QUERY_TETHER_STATS_ALL :>>>\n"); pyld_sz = sizeof(struct wan_ioctl_query_tether_stats_all); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (rmnet_ipa_query_tethering_stats_all( (struct wan_ioctl_query_tether_stats_all *)param)) { IPAWANERR("WAN_IOC_QUERY_TETHER_STATS failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_RESET_TETHER_STATS: IPAWANDBG_LOW("got WAN_IOC_RESET_TETHER_STATS :>>>\n"); pyld_sz = sizeof(struct wan_ioctl_reset_tether_stats); Loading