diff options
-rw-r--r-- | plugins/qcom-soc/mm-broadband-modem-qmi-qcom-soc.c | 23 | ||||
-rw-r--r-- | src/mm-bearer-qmi.c | 28 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 26 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.h | 8 | ||||
-rw-r--r-- | src/mm-port-qmi.c | 8 | ||||
-rw-r--r-- | src/mm-port-qmi.h | 8 |
6 files changed, 61 insertions, 40 deletions
diff --git a/plugins/qcom-soc/mm-broadband-modem-qmi-qcom-soc.c b/plugins/qcom-soc/mm-broadband-modem-qmi-qcom-soc.c index a1fa4290..21d62c12 100644 --- a/plugins/qcom-soc/mm-broadband-modem-qmi-qcom-soc.c +++ b/plugins/qcom-soc/mm-broadband-modem-qmi-qcom-soc.c @@ -44,7 +44,7 @@ static const QmiSioPort sio_port_per_port_number[] = { static MMPortQmi * peek_port_qmi_for_data_bam_dmux (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { MMPortQmi *found = NULL; @@ -73,8 +73,13 @@ peek_port_qmi_for_data_bam_dmux (MMBroadbandModemQmi *self, MM_CORE_ERROR_NOT_FOUND, "Couldn't find any QMI port for 'net/%s'", mm_port_get_device (data)); - else if (out_sio_port) - *out_sio_port = sio_port_per_port_number[net_port_number]; + else if (out_endpoint) { + /* WDS Bind (Mux) Data Port must be called with the correct endpoint + * interface number/SIO port to make multiplexing work with BAM-DMUX */ + out_endpoint->type = QMI_DATA_ENDPOINT_TYPE_BAM_DMUX; + out_endpoint->interface_number = net_port_number; + out_endpoint->sio_port = sio_port_per_port_number[net_port_number]; + } return found; } @@ -82,7 +87,7 @@ peek_port_qmi_for_data_bam_dmux (MMBroadbandModemQmi *self, static MMPortQmi * peek_port_qmi_for_data_ipa (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { MMPortQmi *found = NULL; @@ -99,8 +104,8 @@ peek_port_qmi_for_data_ipa (MMBroadbandModemQmi *self, MM_CORE_ERROR_NOT_FOUND, "Couldn't find any QMI port for 'net/%s'", mm_port_get_device (data)); - else if (out_sio_port) - *out_sio_port = QMI_SIO_PORT_NONE; + else if (out_endpoint) + mm_port_qmi_get_endpoint_info (found, out_endpoint); return found; } @@ -108,7 +113,7 @@ peek_port_qmi_for_data_ipa (MMBroadbandModemQmi *self, static MMPortQmi * peek_port_qmi_for_data (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { MMKernelDevice *net_port; @@ -121,10 +126,10 @@ peek_port_qmi_for_data (MMBroadbandModemQmi *self, net_port_driver = mm_kernel_device_get_driver (net_port); if (g_strcmp0 (net_port_driver, "ipa") == 0) - return peek_port_qmi_for_data_ipa (self, data, out_sio_port, error); + return peek_port_qmi_for_data_ipa (self, data, out_endpoint, error); if (g_strcmp0 (net_port_driver, "bam-dmux") == 0) - return peek_port_qmi_for_data_bam_dmux (self, data, out_sio_port, error); + return peek_port_qmi_for_data_bam_dmux (self, data, out_endpoint, error); g_set_error (error, MM_CORE_ERROR, diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index 79433def..a71d6593 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -492,8 +492,9 @@ typedef struct { ConnectStep step; MMPort *data; MMPortQmi *qmi; - QmiSioPort sio_port; - gboolean sio_port_failed; + + MMQmiDataEndpoint endpoint; + gboolean sio_port_failed; gint profile_id; MMBearerIpMethod ip_method; @@ -1820,12 +1821,12 @@ connect_context_step (GTask *task) case CONNECT_STEP_BIND_DATA_PORT_IPV4: /* If SIO port given, bind client to it */ - if (!ctx->sio_port_failed && ctx->sio_port != QMI_SIO_PORT_NONE) { + if (!ctx->sio_port_failed && ctx->endpoint.sio_port != QMI_SIO_PORT_NONE) { g_autoptr(QmiMessageWdsBindDataPortInput) input = NULL; - mm_obj_dbg (self, "binding to data port: %s", qmi_sio_port_get_string (ctx->sio_port)); + mm_obj_dbg (self, "binding to data port: %s", qmi_sio_port_get_string (ctx->endpoint.sio_port)); input = qmi_message_wds_bind_data_port_input_new (); - qmi_message_wds_bind_data_port_input_set_data_port (input, ctx->sio_port, NULL); + qmi_message_wds_bind_data_port_input_set_data_port (input, ctx->endpoint.sio_port, NULL); qmi_client_wds_bind_data_port (ctx->client_ipv4, input, 10, @@ -1843,8 +1844,8 @@ connect_context_step (GTask *task) input = qmi_message_wds_bind_mux_data_port_input_new (); qmi_message_wds_bind_mux_data_port_input_set_endpoint_info ( input, - mm_port_qmi_get_endpoint_type (ctx->qmi), - mm_port_qmi_get_endpoint_interface_number (ctx->qmi), + ctx->endpoint.type, + ctx->endpoint.interface_number, NULL); qmi_message_wds_bind_mux_data_port_input_set_mux_id (input, ctx->mux_id, NULL); @@ -1956,12 +1957,12 @@ connect_context_step (GTask *task) case CONNECT_STEP_BIND_DATA_PORT_IPV6: /* If SIO port given, bind client to it */ - if (!ctx->sio_port_failed && ctx->sio_port != QMI_SIO_PORT_NONE) { + if (!ctx->sio_port_failed && ctx->endpoint.sio_port != QMI_SIO_PORT_NONE) { g_autoptr(QmiMessageWdsBindDataPortInput) input = NULL; - mm_obj_dbg (self, "binding to data port: %s", qmi_sio_port_get_string (ctx->sio_port)); + mm_obj_dbg (self, "binding to data port: %s", qmi_sio_port_get_string (ctx->endpoint.sio_port)); input = qmi_message_wds_bind_data_port_input_new (); - qmi_message_wds_bind_data_port_input_set_data_port (input, ctx->sio_port, NULL); + qmi_message_wds_bind_data_port_input_set_data_port (input, ctx->endpoint.sio_port, NULL); qmi_client_wds_bind_data_port (ctx->client_ipv6, input, 10, @@ -1979,8 +1980,8 @@ connect_context_step (GTask *task) input = qmi_message_wds_bind_mux_data_port_input_new (); qmi_message_wds_bind_mux_data_port_input_set_endpoint_info ( input, - mm_port_qmi_get_endpoint_type (ctx->qmi), - mm_port_qmi_get_endpoint_interface_number (ctx->qmi), + ctx->endpoint.type, + ctx->endpoint.interface_number, NULL); qmi_message_wds_bind_mux_data_port_input_set_mux_id (input, ctx->mux_id, NULL); @@ -2257,7 +2258,6 @@ _connect (MMBaseBearer *_self, ctx->self = g_object_ref (self); ctx->modem = g_object_ref (modem); ctx->mux_id = QMI_DEVICE_MUX_ID_UNBOUND; - ctx->sio_port = QMI_SIO_PORT_NONE; ctx->step = CONNECT_STEP_FIRST; ctx->ip_method = MM_BEARER_IP_METHOD_UNKNOWN; g_task_set_task_data (task, ctx, (GDestroyNotify)connect_context_free); @@ -2272,7 +2272,7 @@ _connect (MMBaseBearer *_self, } /* Each data port has a single QMI port associated */ - ctx->qmi = mm_broadband_modem_qmi_get_port_qmi_for_data (MM_BROADBAND_MODEM_QMI (modem), ctx->data, &ctx->sio_port, &error); + ctx->qmi = mm_broadband_modem_qmi_get_port_qmi_for_data (MM_BROADBAND_MODEM_QMI (modem), ctx->data, &ctx->endpoint, &error); if (!ctx->qmi) { g_task_return_error (task, error); g_object_unref (task); diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 9619acb6..89edd3bc 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -248,14 +248,14 @@ mm_broadband_modem_qmi_peek_port_qmi (MMBroadbandModemQmi *self) MMPortQmi * mm_broadband_modem_qmi_get_port_qmi_for_data (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { MMPortQmi *qmi_port; g_assert (MM_IS_BROADBAND_MODEM_QMI (self)); - qmi_port = mm_broadband_modem_qmi_peek_port_qmi_for_data (self, data, out_sio_port, error); + qmi_port = mm_broadband_modem_qmi_peek_port_qmi_for_data (self, data, out_endpoint, error); return (qmi_port ? MM_PORT_QMI (g_object_ref (qmi_port)) : NULL); @@ -264,7 +264,7 @@ mm_broadband_modem_qmi_get_port_qmi_for_data (MMBroadbandModemQmi *self, static MMPortQmi * peek_port_qmi_for_data_mhi (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { MMPortQmi *found = NULL; @@ -277,8 +277,8 @@ peek_port_qmi_for_data_mhi (MMBroadbandModemQmi *self, MM_CORE_ERROR_NOT_FOUND, "Couldn't find associated QMI port for 'net/%s'", mm_port_get_device (data)); - else if (out_sio_port) - *out_sio_port = QMI_SIO_PORT_NONE; + else if (out_endpoint) + mm_port_qmi_get_endpoint_info (found, out_endpoint); return found; } @@ -286,7 +286,7 @@ peek_port_qmi_for_data_mhi (MMBroadbandModemQmi *self, static MMPortQmi * peek_port_qmi_for_data_usb (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { GList *cdc_wdm_qmi_ports; @@ -325,8 +325,8 @@ peek_port_qmi_for_data_usb (MMBroadbandModemQmi *self, MM_CORE_ERROR_NOT_FOUND, "Couldn't find associated QMI port for 'net/%s'", mm_port_get_device (data)); - else if (out_sio_port) - *out_sio_port = QMI_SIO_PORT_NONE; + else if (out_endpoint) + mm_port_qmi_get_endpoint_info (found, out_endpoint); return found; } @@ -335,7 +335,7 @@ peek_port_qmi_for_data_usb (MMBroadbandModemQmi *self, static MMPortQmi * peek_port_qmi_for_data (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { const gchar *net_port_driver; @@ -346,10 +346,10 @@ peek_port_qmi_for_data (MMBroadbandModemQmi *self, net_port_driver = mm_kernel_device_get_driver (mm_port_peek_kernel_device (data)); if (!g_strcmp0 (net_port_driver, "qmi_wwan")) - return peek_port_qmi_for_data_usb (self, data, out_sio_port, error); + return peek_port_qmi_for_data_usb (self, data, out_endpoint, error); if (!g_strcmp0 (net_port_driver, "mhi_net")) - return peek_port_qmi_for_data_mhi (self, data, out_sio_port, error); + return peek_port_qmi_for_data_mhi (self, data, out_endpoint, error); g_set_error (error, MM_CORE_ERROR, @@ -363,12 +363,12 @@ peek_port_qmi_for_data (MMBroadbandModemQmi *self, MMPortQmi * mm_broadband_modem_qmi_peek_port_qmi_for_data (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error) { g_assert (MM_BROADBAND_MODEM_QMI_GET_CLASS (self)->peek_port_qmi_for_data); - return MM_BROADBAND_MODEM_QMI_GET_CLASS (self)->peek_port_qmi_for_data (self, data, out_sio_port, error); + return MM_BROADBAND_MODEM_QMI_GET_CLASS (self)->peek_port_qmi_for_data (self, data, out_endpoint, error); } /*****************************************************************************/ diff --git a/src/mm-broadband-modem-qmi.h b/src/mm-broadband-modem-qmi.h index 9b712109..e324d793 100644 --- a/src/mm-broadband-modem-qmi.h +++ b/src/mm-broadband-modem-qmi.h @@ -34,12 +34,12 @@ struct _MMBroadbandModemQmi { MMBroadbandModemQmiPrivate *priv; }; -struct _MMBroadbandModemQmiClass{ +struct _MMBroadbandModemQmiClass { MMBroadbandModemClass parent; MMPortQmi * (* peek_port_qmi_for_data) (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error); }; @@ -55,12 +55,12 @@ MMBroadbandModemQmi *mm_broadband_modem_qmi_new (const gchar *device, MMPortQmi *mm_broadband_modem_qmi_peek_port_qmi (MMBroadbandModemQmi *self); MMPortQmi *mm_broadband_modem_qmi_peek_port_qmi_for_data (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error); MMPortQmi *mm_broadband_modem_qmi_get_port_qmi (MMBroadbandModemQmi *self); MMPortQmi *mm_broadband_modem_qmi_get_port_qmi_for_data (MMBroadbandModemQmi *self, MMPort *data, - QmiSioPort *out_sio_port, + MMQmiDataEndpoint *out_endpoint, GError **error); #endif /* MM_BROADBAND_MODEM_QMI_H */ diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c index 267c8991..b4001c9a 100644 --- a/src/mm-port-qmi.c +++ b/src/mm-port-qmi.c @@ -185,6 +185,14 @@ mm_port_qmi_get_endpoint_interface_number (MMPortQmi *self) return self->priv->endpoint_interface_number; } +void +mm_port_qmi_get_endpoint_info (MMPortQmi *self, MMQmiDataEndpoint *out_endpoint) +{ + out_endpoint->type = self->priv->endpoint_type; + out_endpoint->interface_number = self->priv->endpoint_interface_number; + out_endpoint->sio_port = QMI_SIO_PORT_NONE; +} + /*****************************************************************************/ static void diff --git a/src/mm-port-qmi.h b/src/mm-port-qmi.h index 2e1afc8c..c177925c 100644 --- a/src/mm-port-qmi.h +++ b/src/mm-port-qmi.h @@ -128,8 +128,16 @@ QmiClient *mm_port_qmi_get_client (MMPortQmi *self, QmiDevice *mm_port_qmi_peek_device (MMPortQmi *self); +typedef struct { + QmiDataEndpointType type; + guint interface_number; + QmiSioPort sio_port; +} MMQmiDataEndpoint; + QmiDataEndpointType mm_port_qmi_get_endpoint_type (MMPortQmi *self); guint mm_port_qmi_get_endpoint_interface_number (MMPortQmi *self); +void mm_port_qmi_get_endpoint_info (MMPortQmi *self, + MMQmiDataEndpoint *out_endpoint); MMPortQmiKernelDataMode mm_port_qmi_get_kernel_data_modes (MMPortQmi *self); QmiWdaLinkLayerProtocol mm_port_qmi_get_link_layer_protocol (MMPortQmi *self); |