static gboolean setup_samsung(struct modem_info *modem) { const char *control = NULL, *network = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->interface, "10/0/0") == 0) control = info->devnode; else if (g_strcmp0(info->interface, "255/0/0") == 0) network = info->devnode; } if (control == NULL && network == NULL) return FALSE; DBG("control=%s network=%s", control, network); ofono_modem_set_string(modem->modem, "ControlPort", control); ofono_modem_set_string(modem->modem, "NetworkInterface", network); return TRUE; }
static gboolean setup_isi_serial(struct modem_info* modem) { struct serial_device_info* info; const char *value; info = modem->serial; if (g_strcmp0(udev_device_get_subsystem(info->dev), "net") != 0) return FALSE; value = udev_device_get_sysattr_value(info->dev, "type"); if (g_strcmp0(value, "820") != 0) return FALSE; /* OK, we want this device to be a modem */ value = udev_device_get_sysname(info->dev); if (value) ofono_modem_set_string(modem->modem, "Interface", value); value = udev_device_get_property_value(info->dev, "OFONO_ISI_ADDRESS"); if (value) ofono_modem_set_integer(modem->modem, "Address", atoi(value)); ofono_modem_set_string(modem->modem, "Device", info->devnode); return TRUE; }
static gboolean setup_linktop(struct modem_info *modem) { const char *aux = NULL, *mdm = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->interface, "2/2/1") == 0) { if (g_strcmp0(info->number, "01") == 0) aux = info->devnode; else if (g_strcmp0(info->number, "03") == 0) mdm = info->devnode; } } if (aux == NULL || mdm == NULL) return FALSE; DBG("aux=%s modem=%s", aux, mdm); ofono_modem_set_string(modem->modem, "Aux", aux); ofono_modem_set_string(modem->modem, "Modem", mdm); return TRUE; }
static gboolean setup_ublox(struct modem_info *modem) { const char *aux = NULL, *mdm = NULL, *net = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->label, "aux") == 0) { aux = info->devnode; if (mdm != NULL) break; } else if (g_strcmp0(info->label, "modem") == 0) { mdm = info->devnode; if (aux != NULL) break; /* * "2/2/1" * - a common modem interface both for older models like LISA, * and for newer models like TOBY. * For TOBY-L2, NetworkInterface can be detected for each * profile: * - low-medium throughput profile : 2/6/0 * - fairly backward-compatible profile : 10/0/0 * - high throughput profile : 224/1/3 */ } else if (g_strcmp0(info->interface, "2/2/1") == 0) { if (g_strcmp0(info->number, "02") == 0) aux = info->devnode; else if (g_strcmp0(info->number, "00") == 0) mdm = info->devnode; } else if (g_strcmp0(info->interface, "2/6/0") == 0 || g_strcmp0(info->interface, "10/0/0") == 0 || g_strcmp0(info->interface, "224/1/3") == 0) { net = info->devnode; } } /* Abort only if both interfaces are NULL, as it's highly possible that * only one of 2 interfaces is available for U-blox modem. */ if (aux == NULL && mdm == NULL) return FALSE; DBG("aux=%s modem=%s net=%s", aux, mdm, net); ofono_modem_set_string(modem->modem, "Aux", aux); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "Model", modem->model); ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static struct ofono_modem *create_modem(GKeyFile *keyfile, const char *group) { const char *driver = "phonesim"; struct ofono_modem *modem; char *value; DBG("group %s", group); value = g_key_file_get_string(keyfile, group, "Modem", NULL); if (value && g_str_equal(value, "hfp")) driver = "localhfp"; g_free(value); modem = ofono_modem_create(group, driver); if (modem == NULL) return NULL; value = g_key_file_get_string(keyfile, group, "Address", NULL); if (value == NULL) goto error; ofono_modem_set_string(modem, "Address", value); g_free(value); value = g_key_file_get_string(keyfile, group, "Port", NULL); if (value == NULL) goto error; ofono_modem_set_integer(modem, "Port", atoi(value)); g_free(value); value = g_key_file_get_string(keyfile, group, "Modem", NULL); if (value) { ofono_modem_set_string(modem, "Modem", value); g_free(value); } value = g_key_file_get_string(keyfile, group, "Multiplexer", NULL); if (value) { ofono_modem_set_string(modem, "Multiplexer", value); g_free(value); } DBG("%p", modem); return modem; error: ofono_error("Missing address or port setting for %s", group); ofono_modem_remove(modem); return NULL; }
static gboolean setup_telit(struct modem_info *modem) { const char *mdm = NULL, *aux = NULL, *gps = NULL, *net = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->label, "aux") == 0) { aux = info->devnode; if (mdm != NULL) break; } else if (g_strcmp0(info->label, "modem") == 0) { mdm = info->devnode; if (aux != NULL) break; } else if (g_strcmp0(info->interface, "255/255/255") == 0) { if (g_strcmp0(info->number, "00") == 0) mdm = info->devnode; else if (g_strcmp0(info->number, "02") == 0) gps = info->devnode; else if (g_strcmp0(info->number, "03") == 0) aux = info->devnode; } else if (g_strcmp0(info->interface, "2/2/1") == 0) { if (g_strcmp0(info->number, "00") == 0) mdm = info->devnode; else if (g_strcmp0(info->number, "06") == 0) aux = info->devnode; else if (g_strcmp0(info->number, "0a") == 0) gps = info->devnode; } else if (info->sysattr && (g_str_has_suffix(info->sysattr, "CDC NCM") == TRUE)) { net = info->devnode; } } if (aux == NULL || mdm == NULL) return FALSE; DBG("modem=%s aux=%s gps=%s net=%s", mdm, aux, gps, net); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "Aux", aux); ofono_modem_set_string(modem->modem, "GPS", gps); if (net != NULL) ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static gboolean setup_huawei(struct modem_info *modem) { const char *qmi = NULL, *mdm = NULL, *net = NULL; const char *pcui = NULL, *diag = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->label, "modem") == 0 || g_strcmp0(info->interface, "255/1/1") == 0 || g_strcmp0(info->interface, "255/2/1") == 0) { mdm = info->devnode; } else if (g_strcmp0(info->label, "pcui") == 0 || g_strcmp0(info->interface, "255/1/2") == 0 || g_strcmp0(info->interface, "255/2/2") == 0) { pcui = info->devnode; } else if (g_strcmp0(info->label, "diag") == 0 || g_strcmp0(info->interface, "255/1/3") == 0 || g_strcmp0(info->interface, "255/2/3") == 0) { diag = info->devnode; } else if (g_strcmp0(info->interface, "255/1/8") == 0) { net = info->devnode; } else if (g_strcmp0(info->interface, "255/255/255") == 0) { if (g_strcmp0(info->number, "00") == 0) mdm = info->devnode; else if (g_strcmp0(info->number, "01") == 0) pcui = info->devnode; else if (g_strcmp0(info->number, "02") == 0) pcui = info->devnode; else if (g_strcmp0(info->number, "03") == 0) pcui = info->devnode; else if (g_strcmp0(info->number, "04") == 0) pcui = info->devnode; } } if (mdm == NULL || pcui == NULL) return FALSE; DBG("mdm=%s pcui=%s diag=%s qmi=%s net=%s", mdm, pcui, diag, qmi, net); ofono_modem_set_string(modem->modem, "Device", qmi); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "Pcui", pcui); ofono_modem_set_string(modem->modem, "Diag", diag); ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static gboolean setup_sierra(struct modem_info *modem) { const char *mdm = NULL, *app = NULL, *net = NULL, *diag = NULL, *qmi = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->subsystem); if (g_strcmp0(info->interface, "255/255/255") == 0) { if (g_strcmp0(info->number, "01") == 0) diag = info->devnode; if (g_strcmp0(info->number, "03") == 0) mdm = info->devnode; else if (g_strcmp0(info->number, "04") == 0) app = info->devnode; else if (g_strcmp0(info->number, "07") == 0) net = info->devnode; else if (g_strcmp0(info->number, "0a") == 0) { if (g_strcmp0(info->subsystem, "net") == 0) net = info->devnode; else if (g_strcmp0(info->subsystem, "usbmisc") == 0) qmi = info->devnode; } } } if (qmi != NULL && net != NULL) { ofono_modem_set_driver(modem->modem, "gobi"); goto done; } if (mdm == NULL || net == NULL) return FALSE; done: DBG("modem=%s app=%s net=%s diag=%s qmi=%s", mdm, app, net, diag, qmi); ofono_modem_set_string(modem->modem, "Device", qmi); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "App", app); ofono_modem_set_string(modem->modem, "Diag", diag); ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static gboolean setup_zte(struct modem_info *modem) { const char *aux = NULL, *mdm = NULL, *qcdm = NULL; const char *modem_intf; GSList *list; DBG("%s", modem->syspath); if (g_strcmp0(modem->model, "0016") == 0 || g_strcmp0(modem->model, "0017") == 0 || g_strcmp0(modem->model, "0117") == 0) modem_intf = "02"; else modem_intf = "03"; for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->label, "aux") == 0) { aux = info->devnode; if (mdm != NULL) break; } else if (g_strcmp0(info->label, "modem") == 0) { mdm = info->devnode; if (aux != NULL) break; } else if (g_strcmp0(info->interface, "255/255/255") == 0) { if (g_strcmp0(info->number, "00") == 0) qcdm = info->devnode; else if (g_strcmp0(info->number, "01") == 0) aux = info->devnode; else if (g_strcmp0(info->number, modem_intf) == 0) mdm = info->devnode; } } if (aux == NULL || mdm == NULL) return FALSE; DBG("aux=%s modem=%s qcdm=%s", aux, mdm, qcdm); ofono_modem_set_string(modem->modem, "Aux", aux); ofono_modem_set_string(modem->modem, "Modem", mdm); return TRUE; }
static int bluetooth_sap_probe(const char *device, const char *dev_addr, const char *adapter_addr, const char *alias) { struct ofono_modem *modem; char buf[256]; if (sap_hw_modem == NULL) return -ENODEV; /* We already have this device in our hash, ignore */ if (g_hash_table_lookup(modem_hash, device) != NULL) return -EALREADY; ofono_info("Using device: %s, devaddr: %s, adapter: %s", device, dev_addr, adapter_addr); strcpy(buf, "sap/"); bluetooth_create_path(dev_addr, adapter_addr, buf + 4, sizeof(buf) - 4); modem = ofono_modem_create(buf, "sap"); if (modem == NULL) return -ENOMEM; ofono_modem_set_string(modem, "ServerPath", device); ofono_modem_set_name(modem, alias); ofono_modem_register(modem); g_hash_table_insert(modem_hash, g_strdup(device), modem); return 0; }
static gboolean setup_isi(struct modem_info *modem) { const char *node = NULL; int addr = 0; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->sysattr); if (g_strcmp0(info->sysattr, "820") == 0) { if (g_strcmp0(info->interface, "2/254/0") == 0) addr = 16; node = info->devnode; } } if (node == NULL) return FALSE; DBG("interface=%s address=%d", node, addr); ofono_modem_set_string(modem->modem, "Interface", node); ofono_modem_set_integer(modem->modem, "Address", addr); return TRUE; }
static gboolean setup_wavecom(struct modem_info* modem) { struct serial_device_info* info; const char *value; info = modem->serial; value = udev_device_get_property_value(info->dev, "OFONO_WAVECOM_MODEL"); if (value) ofono_modem_set_string(modem->modem, "Model", value); ofono_modem_set_string(modem->modem, "Device", info->devnode); return TRUE; }
static gboolean setup_mbm(struct modem_info *modem) { const char *mdm = NULL, *app = NULL, *network = NULL, *gps = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->sysattr); if (g_str_has_suffix(info->sysattr, "Modem") == TRUE || g_str_has_suffix(info->sysattr, "Modem 2") == TRUE) { if (mdm == NULL) mdm = info->devnode; else app = info->devnode; } else if (g_str_has_suffix(info->sysattr, "GPS Port") == TRUE || g_str_has_suffix(info->sysattr, "Module NMEA") == TRUE) { gps = info->devnode; } else if (g_str_has_suffix(info->sysattr, "Network Adapter") == TRUE || g_str_has_suffix(info->sysattr, "gw") == TRUE || g_str_has_suffix(info->sysattr, "NetworkAdapter") == TRUE) { network = info->devnode; } } if (mdm == NULL || app == NULL) return FALSE; DBG("modem=%s data=%s network=%s gps=%s", mdm, app, network, gps); ofono_modem_set_string(modem->modem, "ModemDevice", mdm); ofono_modem_set_string(modem->modem, "DataDevice", app); ofono_modem_set_string(modem->modem, "GPSDevice", gps); ofono_modem_set_string(modem->modem, "NetworkInterface", network); return TRUE; }
static gboolean setup_simcom(struct modem_info *modem) { const char *mdm = NULL, *aux = NULL, *gps = NULL, *diag = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->label, "aux") == 0) { aux = info->devnode; if (mdm != NULL) break; } else if (g_strcmp0(info->label, "modem") == 0) { mdm = info->devnode; if (aux != NULL) break; } else if (g_strcmp0(info->interface, "255/255/255") == 0) { if (g_strcmp0(info->number, "00") == 0) diag = info->devnode; else if (g_strcmp0(info->number, "01") == 0) gps = info->devnode; else if (g_strcmp0(info->number, "02") == 0) aux = info->devnode; else if (g_strcmp0(info->number, "03") == 0) mdm = info->devnode; } } if (aux == NULL || mdm == NULL) return FALSE; DBG("modem=%s aux=%s gps=%s diag=%s", mdm, aux, gps, diag); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "Data", aux); ofono_modem_set_string(modem->modem, "GPS", gps); return TRUE; }
static gboolean setup_serial_modem(struct modem_info* modem) { struct serial_device_info* info; info = modem->serial; ofono_modem_set_string(modem->modem, "Device", info->devnode); return TRUE; }
static gboolean setup_gemalto(struct modem_info* modem) { const char *app = NULL, *gps = NULL, *mdm = NULL, *net = NULL, *qmi = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->subsystem); if (g_strcmp0(info->interface, "255/255/255") == 0) { if (g_strcmp0(info->number, "01") == 0) gps = info->devnode; else if (g_strcmp0(info->number, "02") == 0) app = info->devnode; else if (g_strcmp0(info->number, "03") == 0) mdm = info->devnode; else if (g_strcmp0(info->subsystem, "net") == 0) net = info->devnode; else if (g_strcmp0(info->subsystem, "usbmisc") == 0) qmi = info->devnode; } } DBG("application=%s gps=%s modem=%s network=%s qmi=%s", app, gps, mdm, net, qmi); if (app == NULL || mdm == NULL) return FALSE; ofono_modem_set_string(modem->modem, "Application", app); ofono_modem_set_string(modem->modem, "GPS", gps); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "Device", qmi); ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static gboolean setup_quectelqmi(struct modem_info *modem) { const char *qmi = NULL, *net = NULL, *gps = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = g_slist_next(list)) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->subsystem); if (g_strcmp0(info->interface, "255/255/255") == 0 && g_strcmp0(info->number, "04") == 0) { if (g_strcmp0(info->subsystem, "net") == 0) net = info->devnode; else if (g_strcmp0(info->subsystem, "usbmisc") == 0) qmi = info->devnode; } else if (g_strcmp0(info->interface, "255/0/0") == 0 && g_strcmp0(info->number, "02") == 0) { gps = info->devnode; } } DBG("qmi=%s net=%s", qmi, net); if (qmi == NULL || net == NULL) return FALSE; DBG("qmi=%s net=%s", qmi, net); ofono_modem_set_string(modem->modem, "Device", qmi); ofono_modem_set_string(modem->modem, "NetworkInterface", net); if (gps) ofono_modem_set_string(modem->modem, "GPS", gps); ofono_modem_set_driver(modem->modem, "gobi"); return TRUE; }
static gboolean setup_gobi(struct modem_info *modem) { const char *qmi = NULL, *mdm = NULL, *net = NULL; const char *gps = NULL, *diag = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s", info->devnode, info->interface, info->number, info->label); if (g_strcmp0(info->interface, "255/255/255") == 0) { if (info->number == NULL) qmi = info->devnode; else if (g_strcmp0(info->number, "00") == 0) net = info->devnode; else if (g_strcmp0(info->number, "01") == 0) diag = info->devnode; else if (g_strcmp0(info->number, "02") == 0) mdm = info->devnode; else if (g_strcmp0(info->number, "03") == 0) gps = info->devnode; } } if (qmi == NULL || mdm == NULL || net == NULL) return FALSE; DBG("qmi=%s net=%s mdm=%s gps=%s diag=%s", qmi, net, mdm, gps, diag); ofono_modem_set_string(modem->modem, "Device", qmi); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "Diag", diag); ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static struct ofono_modem *modem_register(const char *device, const char *device_address, const char *alias) { struct ofono_modem *modem; char *path; path = g_strconcat("hfp", device, NULL); modem = ofono_modem_create(path, "hfp"); g_free(path); if (modem == NULL) return NULL; ofono_modem_set_string(modem, "Remote", device_address); ofono_modem_set_string(modem, "DevicePath", device); ofono_modem_set_name(modem, alias); ofono_modem_register(modem); return modem; }
static gboolean setup_ifx(struct modem_info* modem) { struct serial_device_info* info; const char *value; info = modem->serial; value = udev_device_get_property_value(info->dev, "OFONO_IFX_LDISC"); if (value) ofono_modem_set_string(modem->modem, "LineDiscipline", value); value = udev_device_get_property_value(info->dev, "OFONO_IFX_AUDIO"); if (value) ofono_modem_set_string(modem->modem, "AudioSetting", value); value = udev_device_get_property_value(info->dev, "OFONO_IFX_LOOPBACK"); if (value) ofono_modem_set_string(modem->modem, "AudioLoopback", value); ofono_modem_set_string(modem->modem, "Device", info->devnode); return TRUE; }
static gboolean setup_hso(struct modem_info *modem) { const char *ctl = NULL, *app = NULL, *mdm = NULL, *net = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->sysattr); if (g_strcmp0(info->sysattr, "Control") == 0) ctl = info->devnode; else if (g_strcmp0(info->sysattr, "Application") == 0) app = info->devnode; else if (g_strcmp0(info->sysattr, "Modem") == 0) mdm = info->devnode; else if (info->sysattr == NULL && g_str_has_prefix(info->devnode, "hso") == TRUE) net = info->devnode; } if (ctl == NULL || app == NULL) return FALSE; DBG("control=%s application=%s modem=%s network=%s", ctl, app, mdm, net); ofono_modem_set_string(modem->modem, "Control", ctl); ofono_modem_set_string(modem->modem, "Application", app); ofono_modem_set_string(modem->modem, "Modem", mdm); ofono_modem_set_string(modem->modem, "NetworkInterface", net); return TRUE; }
static gboolean setup_telitqmi(struct modem_info *modem) { const char *qmi = NULL, *net = NULL; GSList *list; DBG("%s", modem->syspath); for (list = modem->devices; list; list = list->next) { struct device_info *info = list->data; DBG("%s %s %s %s %s", info->devnode, info->interface, info->number, info->label, info->subsystem); if (g_strcmp0(info->interface, "255/255/255") == 0 && g_strcmp0(info->number, "02") == 0) { if (g_strcmp0(info->subsystem, "net") == 0) net = info->devnode; else if (g_strcmp0(info->subsystem, "usbmisc") == 0) qmi = info->devnode; } } if (qmi == NULL || net == NULL) return FALSE; DBG("qmi=%s net=%s", qmi, net); ofono_modem_set_string(modem->modem, "Device", qmi); ofono_modem_set_string(modem->modem, "NetworkInterface", net); ofono_modem_set_boolean(modem->modem, "ForceSimLegacy", TRUE); ofono_modem_set_boolean(modem->modem, "AlwaysOnline", TRUE); ofono_modem_set_driver(modem->modem, "gobi"); return TRUE; }
static DBusMessage *control_add(DBusConnection *conn, DBusMessage *msg, void *data) { const char *driver = "phonesim"; struct ofono_modem *modem; DBusMessageIter iter; char *name; char *address; char *port; if (!dbus_message_iter_init(msg, &iter)) return __ofono_error_invalid_args(msg); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __ofono_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &name); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __ofono_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &address); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __ofono_error_invalid_args(msg); dbus_message_iter_get_basic(&iter, &port); modem = ofono_modem_create(name, driver); if (modem == NULL) return NULL; ofono_modem_set_string(modem, "Address", address); ofono_modem_set_integer(modem, "Port", atoi(port)); if (ofono_modem_register(modem) != 0) { ofono_modem_remove(modem); return __ofono_error_invalid_args(msg); } modem_list = g_slist_prepend(modem_list, modem); return dbus_message_new_method_return(msg); }
/* * Add or remove isimodems * when usbpn* phonet interfaces are added/removed */ static void usbpn_status_cb(GIsiModem *idx, GPhonetLinkState st, char const ifname[], void *data) { struct ofono_modem *modem; int error; DBG("Phonet link %s (%u) is %s", ifname, g_isi_modem_index(idx), st == PN_LINK_REMOVED ? "removed" : st == PN_LINK_DOWN ? "down" : "up"); /* Expect phonet interface name usbpn<idx> */ if (strncmp(ifname, "usbpn", 5) || ifname[5 + strspn(ifname + 5, "0123456789")]) return; if (st == PN_LINK_REMOVED) return; if (g_pn_netlink_by_modem(idx)) { DBG("Modem for interface %s already exists", ifname); return; } error = g_pn_netlink_set_address(idx, PN_DEV_PC); if (error && error != -EEXIST) { DBG("g_pn_netlink_set_address: %s\n", strerror(-error)); return; } modem = ofono_modem_create(NULL, "isimodem"); if (!modem) return; ofono_modem_set_string(modem, "Interface", ifname); if (ofono_modem_register(modem) == 0) DBG("Done regging modem %s", ofono_modem_get_path(modem)); else ofono_modem_remove(modem); }
static void state_change(struct ste_modem *stemodem, enum ste_operation op) { switch (stemodem->state) { case STE_STATE_OFF: /* * The STE Modem is in state OFF and we're waiting for * the Modem Init Daemon to signal that modem is ready * in order to create and register the modem. */ switch (op) { case STE_OP_READY: stemodem->modem = ofono_modem_create(stemodem->serial, "ste"); if (stemodem->modem == NULL) { ofono_error("Could not create modem %s, %s", stemodem->path, stemodem->serial); return; } DBG("register modem %s, %s", stemodem->path, stemodem->serial); if (stemodem->interface != NULL) ofono_modem_set_string(stemodem->modem, "Interface", stemodem->interface); ofono_modem_register(stemodem->modem); stemodem->state = STE_STATE_READY; break; case STE_OP_STARTING: case STE_OP_RESTART: case STE_OP_OFF: break; } break; case STE_STATE_READY: /* * The STE Modem is ready and the modem has been created * and registered in oFono. In this state two things can * happen: Modem restarts or is turned off. Turning off * the modem is an exceptional situation e.g. high-temperature, * low battery or upgrade. In this scenario we remove the * STE modem from oFono. */ switch (op) { case STE_OP_READY: break; case STE_OP_STARTING: case STE_OP_RESTART: DBG("reset ongoing %s", stemodem->path); /* Note: Consider to power off modem here? */ stemodem->state = STE_STATE_RESET; break; case STE_OP_OFF: DBG("STE modem unregistering %s", stemodem->path); ofono_modem_remove(stemodem->modem); stemodem->modem = NULL; stemodem->state = STE_STATE_OFF; break; } break; case STE_STATE_RESET: /* * The STE Modem is resetting.In this state two things can * happen: Modem restarts succeeds, or modem is turned off. */ switch (op) { case STE_OP_STARTING: case STE_OP_RESTART: break; case STE_OP_READY: DBG("STE modem reset complete %s", stemodem->path); if (ofono_modem_get_powered(stemodem->modem)) ofono_modem_reset(stemodem->modem); stemodem->state = STE_STATE_READY; break; case STE_OP_OFF: DBG("STE modem unregistering %s", stemodem->path); ofono_modem_remove(stemodem->modem); stemodem->modem = NULL; stemodem->state = STE_STATE_OFF; break; } break; } }