aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2024-08-26 12:51:29 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2024-08-29 10:07:43 +0000
commit096455947a698fa99b4f7a44d365abea2387062e (patch)
tree13dd114a6a79079c70afe090e4f010ab92243f96 /src
parent2b3f4f22c28317c134f8fbe244398c7b1ed7e4f2 (diff)
mtk: never reload TX/RX stats in FM350
The device always reports empty TX/RX values so there is no point in periodically asking. The logic to poll for stats is kept in place only if the device requires the IP packet filters removal hack.
Diffstat (limited to 'src')
-rw-r--r--src/plugins/mtk/mm-bearer-mbim-mtk-fibocom.c95
1 files changed, 26 insertions, 69 deletions
diff --git a/src/plugins/mtk/mm-bearer-mbim-mtk-fibocom.c b/src/plugins/mtk/mm-bearer-mbim-mtk-fibocom.c
index 71957a07..33398bd7 100644
--- a/src/plugins/mtk/mm-bearer-mbim-mtk-fibocom.c
+++ b/src/plugins/mtk/mm-bearer-mbim-mtk-fibocom.c
@@ -27,7 +27,6 @@ G_DEFINE_TYPE (MMBearerMbimMtkFibocom, mm_bearer_mbim_mtk_fibocom, MM_TYPE_BEARE
struct _MMBearerMbimMtkFibocomPrivate {
/* Whether IP packet filters need to be removed */
gboolean remove_ip_packet_filters;
- gboolean reload_stats_unsupported;
};
/*****************************************************************************/
@@ -45,80 +44,26 @@ reload_stats_finish (MMBaseBearer *_self,
GAsyncResult *res,
GError **error)
{
- MMBearerMbimMtkFibocom *self = MM_BEARER_MBIM_MTK_FIBOCOM (_self);
- g_autofree ReloadStatsResult *stats = NULL;
- g_autoptr(GError) inner_error = NULL;
-
- stats = g_task_propagate_pointer (G_TASK (res), &inner_error);
- if (!stats) {
- /* If filters need to be removed on every stats query, we must never
- * return an error, otherwise the upper layers will stop the stats reloading
- * logic. Only return an error when filters are not being removed. */
- if (!self->priv->remove_ip_packet_filters) {
- g_propagate_error (error, inner_error);
- return FALSE;
- }
- /* Flag as stats reloading being unsupported, we will avoid querying. */
- self->priv->reload_stats_unsupported = TRUE;
- }
+ if (!g_task_propagate_boolean (G_TASK (res), error))
+ return FALSE;
+ /* Fake TX/RX values just to ensure the stats polling keeps going on */
if (rx_bytes)
- *rx_bytes = stats ? stats->rx_bytes : 0;
+ *rx_bytes = 0;
if (tx_bytes)
- *tx_bytes = stats ? stats->tx_bytes : 0;
+ *tx_bytes = 0;
return TRUE;
}
static void
-parent_reload_stats_ready (MMBaseBearer *self,
- GAsyncResult *res,
- GTask *task)
-{
- g_autofree ReloadStatsResult *stats = NULL;
- GError *error = NULL;
-
- stats = g_new0 (ReloadStatsResult, 1);
-
- if (!MM_BASE_BEARER_CLASS (mm_bearer_mbim_mtk_fibocom_parent_class)->reload_stats_finish (
- self,
- &stats->rx_bytes,
- &stats->tx_bytes,
- res,
- &error))
- g_task_return_error (task, g_steal_pointer (&error));
- else
- g_task_return_pointer (task, g_steal_pointer (&stats), g_free);
- g_object_unref (task);
-}
-
-static void
-packet_statistics_query (GTask *task)
-{
- MMBearerMbimMtkFibocom *self;
-
- self = g_task_get_source_object (task);
- if (self->priv->reload_stats_unsupported) {
- g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
- "Skipping stats reloading");
- g_object_unref (task);
- return;
- }
-
- /* Chain up parent's stats query */
- MM_BASE_BEARER_CLASS (mm_bearer_mbim_mtk_fibocom_parent_class)->reload_stats (
- MM_BASE_BEARER (self),
- (GAsyncReadyCallback) parent_reload_stats_ready,
- task);
-}
-
-static void
packet_filters_set_ready (MbimDevice *device,
GAsyncResult *res,
GTask *task)
{
- MMBearerMbim *self;
- g_autoptr(GError) error = NULL;
- g_autoptr(MbimMessage) response = NULL;
+ MMBearerMbim *self;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(MbimMessage) response = NULL;
+ g_autofree ReloadStatsResult *stats = NULL;
self = g_task_get_source_object (task);
@@ -126,7 +71,10 @@ packet_filters_set_ready (MbimDevice *device,
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error))
mm_obj_dbg (self, "Couldn't reset IP packet filters: %s", error->message);
- packet_statistics_query (task);
+ /* The IP packet filter reset should keep on happening periodically, so we
+ * must not return an error in the packet stats query. */
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
}
static void
@@ -152,7 +100,6 @@ ensure_removed_filters (GTask *task)
}
mm_obj_dbg (self, "Resetting IP packet filters...");
-
session_id = mm_bearer_mbim_get_session_id (MM_BEARER_MBIM (self));
message = mbim_message_ip_packet_filters_set_new (session_id, 0, NULL, NULL);
mbim_device_command (mm_port_mbim_peek_device (port),
@@ -173,10 +120,20 @@ reload_stats (MMBaseBearer *_self,
task = g_task_new (self, NULL, callback, user_data);
- if (self->priv->remove_ip_packet_filters)
+ /* The periodic stats reloading logic is abused here to remove the IP packet
+ * filters wrongly configured in the device. */
+ if (self->priv->remove_ip_packet_filters) {
ensure_removed_filters (task);
- else
- packet_statistics_query (task);
+ return;
+ }
+
+ /* If there is no need to remove IP packet filters (i.e. if the underlying
+ * issue is already fixed in the firmware) then we will fully avoid
+ * periodically polling for TX/RX stats, as they are not supported in the
+ * FM350. */
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "TX/RX stats loading unsupported in FM350");
+ g_object_unref (task);
}
/*****************************************************************************/