port-qmi: initialize net port driver information early
The MMPortQmi may need to know very early what kind of net ports are going to be used later on during connection, e.g. to decide what kind of multiplexing capabilities are available and such. So, once we have organized ports in the modem, we'll take the driver of the first network port in the list of data ports, and pass it down to all QMI ports setup in the modem object.
This commit is contained in:
@@ -1440,6 +1440,16 @@ mm_base_modem_organize_ports (MMBaseModem *self,
|
|||||||
|
|
||||||
#if defined WITH_QMI
|
#if defined WITH_QMI
|
||||||
if (qmi) {
|
if (qmi) {
|
||||||
|
/* The first item in the data list must be a net port, because
|
||||||
|
* QMI modems only expect net ports */
|
||||||
|
g_assert (MM_IS_PORT_NET (self->priv->data->data));
|
||||||
|
/* let the MMPortQmi know which net driver is being used, taken
|
||||||
|
* from the first item in the net port list */
|
||||||
|
g_list_foreach (qmi,
|
||||||
|
(GFunc)mm_port_qmi_set_net_driver,
|
||||||
|
(gpointer) mm_kernel_device_get_driver (
|
||||||
|
mm_port_peek_kernel_device (
|
||||||
|
MM_PORT (self->priv->data->data))));
|
||||||
g_list_foreach (qmi, (GFunc)g_object_ref, NULL);
|
g_list_foreach (qmi, (GFunc)g_object_ref, NULL);
|
||||||
self->priv->qmi = qmi;
|
self->priv->qmi = qmi;
|
||||||
}
|
}
|
||||||
|
@@ -40,6 +40,7 @@ struct _MMPortQmiPrivate {
|
|||||||
gboolean in_progress;
|
gboolean in_progress;
|
||||||
QmiDevice *qmi_device;
|
QmiDevice *qmi_device;
|
||||||
GList *services;
|
GList *services;
|
||||||
|
gchar *net_driver;
|
||||||
/* endpoint info */
|
/* endpoint info */
|
||||||
gulong endpoint_info_signal_id;
|
gulong endpoint_info_signal_id;
|
||||||
QmiDataEndpointType endpoint_type;
|
QmiDataEndpointType endpoint_type;
|
||||||
@@ -2279,6 +2280,17 @@ mm_port_qmi_is_open (MMPortQmi *self)
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
mm_port_qmi_set_net_driver (MMPortQmi *self,
|
||||||
|
const gchar *net_driver)
|
||||||
|
{
|
||||||
|
g_assert (MM_IS_PORT_QMI (self));
|
||||||
|
g_assert (!self->priv->net_driver);
|
||||||
|
self->priv->net_driver = g_strdup (net_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
QmiDevice *qmi_device;
|
QmiDevice *qmi_device;
|
||||||
} PortQmiCloseContext;
|
} PortQmiCloseContext;
|
||||||
@@ -2440,6 +2452,8 @@ dispose (GObject *object)
|
|||||||
/* Clear device object */
|
/* Clear device object */
|
||||||
g_clear_object (&self->priv->qmi_device);
|
g_clear_object (&self->priv->qmi_device);
|
||||||
|
|
||||||
|
g_clear_pointer (&self->priv->net_driver, g_free);
|
||||||
|
|
||||||
G_OBJECT_CLASS (mm_port_qmi_parent_class)->dispose (object);
|
G_OBJECT_CLASS (mm_port_qmi_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -65,6 +65,9 @@ gboolean mm_port_qmi_close_finish (MMPortQmi *self,
|
|||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
void mm_port_qmi_set_net_driver (MMPortQmi *self,
|
||||||
|
const gchar *net_driver);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
MM_PORT_QMI_FLAG_DEFAULT = 0,
|
MM_PORT_QMI_FLAG_DEFAULT = 0,
|
||||||
MM_PORT_QMI_FLAG_WDS_IPV4 = 100,
|
MM_PORT_QMI_FLAG_WDS_IPV4 = 100,
|
||||||
|
Reference in New Issue
Block a user