[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/ChangeLog
^
|
@@ -1,3 +1,9 @@
+ver 2.7:
+ Fix issue with handling SIM7100 modem enable operation.
+ Fix issue with handling QMI NAS indications earlier.
+ Add support for handling QMI default bearer.
+ Add support for handling QMI DTMF tones.
+
ver 2.6:
Fix issue with handling ATD*99 for non-muxed ports.
Fix issue with handling QRTR discover timeout.
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/Makefile.am
^
|
@@ -532,6 +532,9 @@
builtin_sources += drivers/atmodem/atutil.h \
drivers/quectelmodem/radio-settings.c
+builtin_sources += drivers/atmodem/atutil.h \
+ drivers/simcommodem/radio-settings.c
+
if PHONESIM
builtin_modules += phonesim
builtin_sources += plugins/phonesim.c
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/configure.ac
^
|
@@ -1,5 +1,5 @@
AC_PREREQ([2.69])
-AC_INIT([ofono], [2.6])
+AC_INIT([ofono], [2.7])
AC_CONFIG_HEADERS(config.h)
AC_CONFIG_AUX_DIR(build-aux)
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/atmodem/gprs.c
^
|
@@ -675,7 +675,7 @@
g_at_chat_send(gd->chat, "AT#PSNT=1", none_prefix,
NULL, NULL, NULL);
break;
- case OFONO_VENDOR_SIMCOM:
+ case OFONO_VENDOR_SIMCOM_A76XX:
g_at_chat_register(gd->chat, "+CNSMOD:", simcom_mode_notify,
FALSE, gprs, NULL);
g_at_chat_send(gd->chat, "AT+CNSMOD=1", none_prefix,
@@ -805,7 +805,7 @@
g_at_chat_send(gd->chat, cmd, none_prefix, NULL, NULL, NULL);
- if (gd->vendor != OFONO_VENDOR_SIMCOM)
+ if (gd->vendor != OFONO_VENDOR_SIMCOM_A76XX)
g_at_chat_send(gd->chat, "AT+CGAUTO=0", none_prefix,
NULL, NULL, NULL);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/atmodem/network-registration.c
^
|
@@ -1936,6 +1936,7 @@
switch (nd->vendor) {
case OFONO_VENDOR_SIMCOM:
+ case OFONO_VENDOR_SIMCOM_A76XX:
/* Register for CSQ changes */
g_at_chat_send(nd->chat, "AT+AUTOCSQ=1,1", none_prefix,
NULL, NULL, NULL);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/atmodem/sim.c
^
|
@@ -107,6 +107,7 @@
int str;
unsigned char access[3];
unsigned char file_status;
+ gboolean result_found = FALSE;
decode_at_error(&error, g_at_result_final_response(result));
@@ -117,11 +118,18 @@
g_at_result_iter_init(&iter, result);
- if (!g_at_result_iter_next(&iter, prefix))
- goto error;
+ /* some Telit modems sometimes return incomplete result lines */
+ /* get first result line with mandatory parameters */
+ while (g_at_result_iter_next(&iter, prefix)) {
+ if (!g_at_result_iter_next_number(&iter, &sw1))
+ continue;
+ if (!g_at_result_iter_next_number(&iter, &sw2))
+ continue;
+ result_found = TRUE;
+ }
- g_at_result_iter_next_number(&iter, &sw1);
- g_at_result_iter_next_number(&iter, &sw2);
+ if (!result_found)
+ goto error;
if (!g_at_result_iter_next_hexstring(&iter, &response, &len) ||
(sw1 != 0x90 && sw1 != 0x91 && sw1 != 0x92) ||
@@ -1199,6 +1207,7 @@
return;
break;
case OFONO_VENDOR_SIMCOM:
+ case OFONO_VENDOR_SIMCOM_A76XX:
if (g_at_chat_send(sd->chat, "AT+SPIC", simcom_spic_prefix,
simcom_spic_cb, cbd, g_free) > 0)
return;
@@ -1355,6 +1364,7 @@
case OFONO_VENDOR_ALCATEL:
case OFONO_VENDOR_HUAWEI:
case OFONO_VENDOR_SIMCOM:
+ case OFONO_VENDOR_SIMCOM_A76XX:
case OFONO_VENDOR_SIERRA:
/*
* On ZTE modems, after pin is entered, SIM state is checked
@@ -1647,7 +1657,7 @@
* command with SIM cards of some operators
*/
if (sd->vendor == OFONO_VENDOR_QUECTEL_EC2X
- || sd->vendor == OFONO_VENDOR_SIMCOM)
+ || sd->vendor == OFONO_VENDOR_SIMCOM_A76XX)
goto error;
cbd = cb_data_new(cb, data);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/atmodem/sms.c
^
|
@@ -846,6 +846,7 @@
case OFONO_VENDOR_HUAWEI:
case OFONO_VENDOR_ZTE:
case OFONO_VENDOR_SIMCOM:
+ case OFONO_VENDOR_SIMCOM_A76XX:
case OFONO_VENDOR_QUECTEL:
case OFONO_VENDOR_QUECTEL_EC2X:
case OFONO_VENDOR_DROID:
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/atmodem/vendor.h
^
|
@@ -41,6 +41,7 @@
OFONO_VENDOR_SAMSUNG,
OFONO_VENDOR_SIMCOM,
OFONO_VENDOR_SIMCOM_SIM900,
+ OFONO_VENDOR_SIMCOM_A76XX,
OFONO_VENDOR_ICERA,
OFONO_VENDOR_WAVECOM_Q2XXX,
OFONO_VENDOR_ALCATEL,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/gprs-context.c
^
|
@@ -78,44 +78,77 @@
}
}
-static void get_settings_cb(struct qmi_result *result, void *user_data)
+static void get_settings_ipv6(struct ofono_gprs_context *gc,
+ struct qmi_result *result)
+{
+ static const uint8_t RESULT_IP_ADDRESS = 0x25;
+ static const uint8_t RESULT_GATEWAY = 0x26;
+ static const uint8_t RESULT_PRIMARY_DNS = 0x27;
+ static const uint8_t RESULT_SECONDARY_DNS = 0x28;
+ static const uint8_t RESULT_MTU = 0x29;
+ const char *dns[3] = { NULL, NULL, NULL };
+ char dns1str[INET6_ADDRSTRLEN];
+ char dns2str[INET6_ADDRSTRLEN];
+ char ipv6str[INET6_ADDRSTRLEN];
+ const void *tlv;
+ uint16_t len;
+ uint32_t mtu;
+
+ tlv = qmi_result_get(result, RESULT_IP_ADDRESS, &len);
+ if (tlv && len == sizeof(struct in6_addr) + 1) {
+ const struct in6_addr *ip = tlv;
+ uint8_t prefix_len = l_get_u8(ip + 1);
+
+ inet_ntop(AF_INET6, ip, ipv6str, sizeof(ipv6str));
+ ofono_gprs_context_set_ipv6_address(gc, ipv6str);
+ ofono_gprs_context_set_ipv6_prefix_length(gc, prefix_len);
+ }
+
+ tlv = qmi_result_get(result, RESULT_GATEWAY, &len);
+ if (tlv && len == sizeof(struct in6_addr) + 1) {
+ const struct in6_addr *gw = tlv;
+
+ inet_ntop(AF_INET6, gw, ipv6str, sizeof(ipv6str));
+ ofono_gprs_context_set_ipv6_gateway(gc, ipv6str);
+ }
+
+ tlv = qmi_result_get(result, RESULT_PRIMARY_DNS, &len);
+ if (tlv && len == sizeof(struct in6_addr)) {
+ const struct in6_addr *dns1 = tlv;
+
+ inet_ntop(AF_INET6, dns1, dns1str, sizeof(dns1str));
+ dns[0] = dns1str;
+ }
+
+ tlv = qmi_result_get(result, RESULT_SECONDARY_DNS, &len);
+ if (tlv && len == sizeof(struct in6_addr)) {
+ const struct in6_addr *dns2 = tlv;
+
+ inet_ntop(AF_INET6, dns2, dns2str, sizeof(dns2str));
+ dns[1] = dns2str;
+ }
+
+ if (dns[0])
+ ofono_gprs_context_set_ipv6_dns_servers(gc, dns);
+
+ if (qmi_result_get_uint32(result, RESULT_MTU, &mtu))
+ DBG("MTU: %u", mtu);
+}
+
+static void get_settings_ipv4(struct ofono_gprs_context *gc,
+ struct qmi_result *result)
{
- static const uint8_t RESULT_PDP_TYPE = 0x11; /* uint8 */
- static const uint8_t RESULT_APN = 0x14; /* string */
static const uint8_t RESULT_PRIMARY_DNS = 0x15;
static const uint8_t RESULT_SECONDARY_DNS = 0x16;
static const uint8_t RESULT_IP_ADDRESS = 0x1e;
static const uint8_t RESULT_GATEWAY = 0x20;
static const uint8_t RESULT_GATEWAY_NETMASK = 0x21;
- static const uint8_t RESULT_IP_FAMILY = 0x2b; /* uint8 */
- struct cb_data *cbd = user_data;
- ofono_gprs_context_cb_t cb = cbd->cb;
- struct ofono_gprs_context *gc = cbd->user;
- uint8_t pdp_type, ip_family;
uint32_t ip_addr;
struct in_addr addr;
char* straddr;
- char* apn;
const char *dns[3] = { NULL, NULL, NULL };
char dns_buf[2][INET_ADDRSTRLEN];
- DBG("");
-
- if (qmi_result_set_error(result, NULL))
- goto done;
-
- apn = qmi_result_get_string(result, RESULT_APN);
- if (apn) {
- DBG("APN: %s", apn);
- l_free(apn);
- }
-
- if (qmi_result_get_uint8(result, RESULT_PDP_TYPE, &pdp_type))
- DBG("PDP type %d", pdp_type);
-
- if (qmi_result_get_uint8(result, RESULT_IP_FAMILY, &ip_family))
- DBG("IP family %d", ip_family);
-
if (qmi_result_get_uint32(result, RESULT_IP_ADDRESS, &ip_addr)) {
addr.s_addr = htonl(ip_addr);
straddr = inet_ntoa(addr);
@@ -151,6 +184,48 @@
if (dns[0])
ofono_gprs_context_set_ipv4_dns_servers(gc, dns);
+}
+
+static void get_settings_cb(struct qmi_result *result, void *user_data)
+{
+ static const uint8_t RESULT_PDP_TYPE = 0x11; /* uint8 */
+ static const uint8_t RESULT_APN = 0x14; /* string */
+ static const uint8_t RESULT_IP_FAMILY = 0x2b; /* uint8 */
+ struct cb_data *cbd = user_data;
+ ofono_gprs_context_cb_t cb = cbd->cb;
+ struct ofono_gprs_context *gc = cbd->user;
+ uint8_t pdp_type, ip_family;
+ char *apn;
+
+ DBG("");
+
+ if (qmi_result_set_error(result, NULL))
+ goto done;
+
+ apn = qmi_result_get_string(result, RESULT_APN);
+ if (apn) {
+ DBG("APN: %s", apn);
+ l_free(apn);
+ }
+
+ if (qmi_result_get_uint8(result, RESULT_PDP_TYPE, &pdp_type))
+ DBG("PDP type %d", pdp_type);
+
+ if (!qmi_result_get_uint8(result, RESULT_IP_FAMILY, &ip_family)) {
+ ofono_error("No IP family in results");
+ goto done;
+ }
+
+ switch (ip_family) {
+ case QMI_WDS_IP_FAMILY_IPV4:
+ get_settings_ipv4(gc, result);
+ break;
+ case QMI_WDS_IP_FAMILY_IPV6:
+ get_settings_ipv6(gc, result);
+ break;
+ default:
+ break;
+ }
done:
CALLBACK_WITH_SUCCESS(cb, cbd->data);
@@ -207,6 +282,55 @@
CALLBACK_WITH_FAILURE(cb, cbd->data);
}
+static void get_lte_attach_param_cb(struct qmi_result *result, void *user_data)
+{
+ static const uint8_t RESULT_IP_SUPPORT_TYPE = 0x11;
+ struct cb_data *cbd = user_data;
+ ofono_gprs_context_cb_t cb = cbd->cb;
+ struct ofono_gprs_context *gc = cbd->user;
+ struct gprs_context_data *data = ofono_gprs_context_get_data(gc);
+ uint16_t error;
+ uint8_t iptype;
+ struct qmi_param *param;
+ uint8_t ip_family;
+
+ DBG("");
+
+ if (qmi_result_set_error(result, &error))
+ goto error;
+
+ if (!qmi_result_get_uint8(result, RESULT_IP_SUPPORT_TYPE, &iptype))
+ goto error;
+
+ switch (iptype) {
+ case QMI_WDS_IP_SUPPORT_IPV4:
+ ip_family = QMI_WDS_IP_FAMILY_IPV4;
+ break;
+ case QMI_WDS_IP_SUPPORT_IPV6:
+ ip_family = QMI_WDS_IP_FAMILY_IPV6;
+ break;
+ case QMI_WDS_IP_SUPPORT_IPV4V6:
+ ip_family = QMI_WDS_IP_FAMILY_IPV4;
+ break;
+ default:
+ goto error;
+ }
+
+ param = qmi_param_new_uint8(QMI_WDS_PARAM_IP_FAMILY, ip_family);
+
+ if (qmi_service_send(data->wds, QMI_WDS_START_NETWORK, param,
+ start_net_cb, cbd, cb_data_unref) > 0) {
+ cb_data_ref(cbd);
+ return;
+ }
+
+ qmi_param_free(param);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/gprs.c
^
|
@@ -39,7 +39,6 @@
struct qmi_service *nas;
struct qmi_service *wds;
unsigned int default_profile;
- uint16_t serving_system_indication_id;
};
static bool extract_ss_info(struct qmi_result *result, int *status, int *tech)
@@ -69,53 +68,28 @@
return true;
}
-static bool extract_dc_info(struct qmi_result *result, int *bearer_tech)
-{
- const struct qmi_nas_data_capability *dc;
- uint16_t len;
- int i;
-
- DBG("");
-
- dc = qmi_result_get(result, QMI_NAS_RESULT_DATA_CAPABILITY_STATUS, &len);
- if (!dc)
- return false;
-
- *bearer_tech = -1;
- for (i = 0; i < dc->cap_count; i++) {
- DBG("radio tech in use %d", dc->cap[i]);
-
- *bearer_tech = qmi_nas_cap_to_bearer_tech(dc->cap[i]);
- }
-
- return true;
-}
-
static void get_lte_attach_param_cb(struct qmi_result *result, void *user_data)
{
+ static const uint8_t PARAM_APN = 0x10;
struct ofono_gprs *gprs = user_data;
struct gprs_data *data = ofono_gprs_get_data(gprs);
char *apn = NULL;
uint16_t error;
- uint8_t iptype;
DBG("");
if (qmi_result_set_error(result, &error)) {
- ofono_error("Failed to query LTE attach params: %hd", error);
+ ofono_error("get_lte_attach_param_cb: %hd", error);
goto noapn;
}
/* APN */
- apn = qmi_result_get_string(result, 0x10);
+ apn = qmi_result_get_string(result, PARAM_APN);
if (!apn) {
DBG("Default profile has no APN setting");
goto noapn;
}
- if (qmi_result_get_uint8(result, 0x11, &iptype))
- ofono_info("LTE attach IP type: %hhd", iptype);
-
ofono_gprs_cid_activated(gprs, data->default_profile, apn);
l_free(apn);
@@ -145,30 +119,12 @@
{
int status;
int tech;
- int bearer_tech;
DBG("");
if (!extract_ss_info(result, &status, &tech))
return -1;
- if (status == NETWORK_REGISTRATION_STATUS_REGISTERED) {
- if (tech == ACCESS_TECHNOLOGY_EUTRAN) {
- /* On LTE we are effectively always attached; and
- * the default bearer is established as soon as the
- * network is joined. We just need to query the
- * parameters in effect on the default bearer and
- * let the ofono core know about the activated
- * context.
- */
- get_lte_attach_params(gprs);
- }
- }
-
- /* DC is optional so only notify on successful extraction */
- if (extract_dc_info(result, &bearer_tech))
- ofono_gprs_bearer_notify(gprs, bearer_tech);
-
return status;
}
@@ -185,6 +141,59 @@
ofono_gprs_status_notify(gprs, status);
}
+static void event_report_notify(struct qmi_result *result, void *user_data)
+{
+ static const uint8_t RESULT_DATA_SYSTEM_STATUS = 0x24;
+ static const uint8_t RESULT_EXTENDED_DATA_BEARER_TECHNOLOGY = 0x2a;
+ struct ofono_gprs *gprs = user_data;
+ const void *tlv;
+ uint16_t len;
+
+ DBG("");
+
+ /*
+ * On LTE we are effectively always attached; and the default bearer is
+ * established as soon as the network is joined. We just need to query
+ * the parameters in effect on the default bearer and let the ofono core
+ * know about the activated context.
+ */
+ tlv = qmi_result_get(result, RESULT_DATA_SYSTEM_STATUS, &len);
+ if (tlv) {
+ int r = qmi_wds_parse_data_system_status(tlv, len);
+ static const uint32_t lte_5g = QMI_WDS_RAT_3GPP_LTE |
+ QMI_WDS_RAT_3GPP_5GNR;
+
+ if (r >= 0 && (r & lte_5g))
+ get_lte_attach_params(gprs);
+
+ return;
+ }
+
+ tlv = qmi_result_get(result,
+ RESULT_EXTENDED_DATA_BEARER_TECHNOLOGY, &len);
+ if (tlv) {
+ int r = qmi_wds_parse_extended_data_bearer_technology(tlv, len);
+
+ if (r < 0) {
+ ofono_warn("extended_data_bearer_technology: %s(%d)",
+ strerror(-r), r);
+ return;
+ }
+
+ ofono_gprs_bearer_notify(gprs, r);
+ return;
+ }
+
+ qmi_result_print_tlvs(result);
+}
+
+static void profile_changed_notify(struct qmi_result *result, void *user_data)
+{
+ DBG("");
+
+ qmi_result_print_tlvs(result);
+}
+
static void attach_detach_cb(struct qmi_result *result, void *user_data)
{
struct cb_data *cbd = user_data;
@@ -276,7 +285,111 @@
l_free(cbd);
}
-static void get_default_profile_cb(struct qmi_result *result, void *user_data)
+static void indication_register_cb(struct qmi_result *result, void *user_data)
+{
+ struct ofono_gprs *gprs = user_data;
+ struct gprs_data *data = ofono_gprs_get_data(gprs);
+ uint16_t error;
+
+ DBG("");
+
+ if (qmi_result_set_error(result, &error)) {
+ ofono_error("indication_register_cb: %hd", error);
+ goto error;
+ }
+
+ /*
+ * First get the SS info - the modem may already be connected,
+ * and the state-change notification may never arrive
+ */
+ qmi_service_send(data->nas, QMI_NAS_GET_SERVING_SYSTEM, NULL,
+ ss_info_notify, gprs, NULL);
+
+ ofono_gprs_register(gprs);
+ return;
+error:
+ ofono_gprs_remove(gprs);
+}
+
+static int indication_register_request(struct ofono_gprs *gprs)
+{
+ static const uint8_t PARAM_PROFILE_CHANGES = 0x19;
+
+ struct gprs_data *data = ofono_gprs_get_data(gprs);
+ struct qmi_param *param = qmi_param_new();
+
+ qmi_param_append_uint8(param, PARAM_PROFILE_CHANGES, 1);
+
+ if (qmi_service_send(data->wds, QMI_WDS_INDICATION_REGISTER,
+ param, indication_register_cb, gprs, NULL) > 0)
+ return 0;
+
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/nas.c
^
|
@@ -19,6 +19,8 @@
*
*/
+#include <ell/ell.h>
+
#include "nas.h"
#include "src/common.h"
@@ -37,6 +39,70 @@
return -1;
}
+static const char *qmi_nas_data_capability_to_string(
+ enum qmi_nas_data_capability cap)
+{
+ switch (cap) {
+ case QMI_NAS_DATA_CAPABILITY_NONE:
+ return "none";
+ case QMI_NAS_DATA_CAPABILITY_GPRS:
+ return "gprs";
+ case QMI_NAS_DATA_CAPABILITY_EDGE:
+ return "edge";
+ case QMI_NAS_DATA_CAPABILITY_HSDPA:
+ return "hsdpa";
+ case QMI_NAS_DATA_CAPABILITY_HSUPA:
+ return "hsupa";
+ case QMI_NAS_DATA_CAPABILITY_WCDMA:
+ return "wcdma";
+ case QMI_NAS_DATA_CAPABILITY_GSM:
+ return "gsm";
+ case QMI_NAS_DATA_CAPABILITY_LTE:
+ return "lte";
+ case QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS:
+ return "hsdpa-plus";
+ case QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS:
+ return "dc-hsdpa-plus";
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+char **qmi_nas_data_capability_status_to_string_list(const void *tlv,
+ uint16_t len)
+{
+ uint8_t num;
+ uint8_t cap;
+ uint8_t i;
+ char **ret;
+
+ if (len < 1)
+ return NULL;
+
+ num = l_get_u8(tlv);
+ if (len != num + 1)
+ return NULL;
+
+ ret = l_new(char *, num + 1);
+ tlv += 1;
+
+ for (i = 0; i < num; i++) {
+ const char *v;
+
+ cap = l_get_u8(tlv + i);
+ v = qmi_nas_data_capability_to_string(cap);
+
+ if (v)
+ ret[i] = l_strdup(v);
+ else
+ ret[i] = l_strdup_printf("0x%02x", cap);
+ }
+
+ return ret;
+}
+
int qmi_nas_cap_to_bearer_tech(int cap_tech)
{
@@ -48,16 +114,12 @@
return PACKET_BEARER_GPRS;
case QMI_NAS_DATA_CAPABILITY_EDGE:
return PACKET_BEARER_EGPRS;
- case QMI_NAS_DATA_CAPABILITY_EVDO_REV_0:
- case QMI_NAS_DATA_CAPABILITY_EVDO_REV_A:
- case QMI_NAS_DATA_CAPABILITY_EVDO_REV_B:
- return PACKET_BEARER_UMTS;
case QMI_NAS_DATA_CAPABILITY_HSDPA:
return PACKET_BEARER_HSDPA;
case QMI_NAS_DATA_CAPABILITY_HSUPA:
return PACKET_BEARER_HSUPA;
- case QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS:
- case QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS:
+ case QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS:
+ case QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS:
/*
* HSPAP is HSPA+; which ofono doesn't define;
* so, if differentiating HSPA and HSPA+ is
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/nas.h
^
|
@@ -107,27 +107,6 @@
} __attribute__((__packed__));
#define QMI_NAS_RESULT_ROAMING_STATUS 0x10 /* uint8 */
-#define QMI_NAS_RESULT_DATA_CAPABILITY_STATUS 0x11 /* uint8 */
-struct qmi_nas_data_capability {
- uint8_t cap_count;
- uint8_t cap[0];
-} __attribute__((__packed__));
-
-#define QMI_NAS_DATA_CAPABILITY_NONE 0x00
-#define QMI_NAS_DATA_CAPABILITY_GPRS 0x01
-#define QMI_NAS_DATA_CAPABILITY_EDGE 0x02
-#define QMI_NAS_DATA_CAPABILITY_HSDPA 0x03
-#define QMI_NAS_DATA_CAPABILITY_HSUPA 0x04
-#define QMI_NAS_DATA_CAPABILITY_WCDMA 0x05
-#define QMI_NAS_DATA_CAPABILITY_CDMA 0x06
-#define QMI_NAS_DATA_CAPABILITY_EVDO_REV_0 0x07
-#define QMI_NAS_DATA_CAPABILITY_EVDO_REV_A 0x08
-#define QMI_NAS_DATA_CAPABILITY_GSM 0x09
-#define QMI_NAS_DATA_CAPABILITY_EVDO_REV_B 0x0A
-#define QMI_NAS_DATA_CAPABILITY_LTE 0x0B
-#define QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS 0x0C
-#define QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS 0x0D
-
#define QMI_NAS_RESULT_CURRENT_PLMN 0x12
struct qmi_nas_current_plmn {
uint16_t mcc;
@@ -180,6 +159,19 @@
#define QMI_NAS_RESULT_SYSTEM_SELECTION_PREF_MODE 0x11
+enum qmi_nas_data_capability {
+ QMI_NAS_DATA_CAPABILITY_NONE = 0x00,
+ QMI_NAS_DATA_CAPABILITY_GPRS = 0x01,
+ QMI_NAS_DATA_CAPABILITY_EDGE = 0x02,
+ QMI_NAS_DATA_CAPABILITY_HSDPA = 0x03,
+ QMI_NAS_DATA_CAPABILITY_HSUPA = 0x04,
+ QMI_NAS_DATA_CAPABILITY_WCDMA = 0x05,
+ QMI_NAS_DATA_CAPABILITY_GSM = 0x09,
+ QMI_NAS_DATA_CAPABILITY_LTE = 0x0B,
+ QMI_NAS_DATA_CAPABILITY_HSDPA_PLUS = 0x0C,
+ QMI_NAS_DATA_CAPABILITY_DC_HSDPA_PLUS = 0x0D,
+};
+
enum qmi_nas_command {
/* Reset NAS service state variables */
QMI_NAS_RESET = 0x00,
@@ -231,4 +223,7 @@
};
int qmi_nas_rat_to_tech(uint8_t rat);
+
+char **qmi_nas_data_capability_status_to_string_list(const void *tlv,
+ uint16_t len);
int qmi_nas_cap_to_bearer_tech(int cap_tech);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/network-registration.c
^
|
@@ -94,11 +94,13 @@
enum roaming_status *roaming,
struct ofono_network_operator *operator)
{
+ static const uint8_t RESULT_DATA_CAPABILITY_STATUS = 0x11;
const struct qmi_nas_serving_system *ss;
const struct qmi_nas_current_plmn *plmn;
uint8_t i, roaming_status;
uint16_t value16, len, opname_len;
uint32_t value32;
+ const void *dcs;
DBG("");
@@ -163,6 +165,19 @@
DBG("%s (%s:%s)", operator->name, operator->mcc, operator->mnc);
}
+ dcs = qmi_result_get(result, RESULT_DATA_CAPABILITY_STATUS, &len);
+ if (dcs) {
+ _auto_(l_strv_free) char **techs =
+ qmi_nas_data_capability_status_to_string_list(dcs, len);
+
+ if (techs) {
+ _auto_(l_free) char *joined =
+ l_strjoinv(techs, ',');
+
+ DBG("radio techs in use: %s", joined);
+ }
+ }
+
if (qmi_result_get_uint16(result, QMI_NAS_RESULT_LOCATION_AREA_CODE,
&value16))
*lac = value16;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/qmi.c
^
|
@@ -120,6 +120,7 @@
unsigned int release_users;
uint8_t next_control_tid;
struct l_queue *control_queue;
+ struct l_queue *pending_families;
};
struct service_family {
@@ -354,10 +355,6 @@
struct service_family *family = value;
struct service_find_by_type_data *data = user_data;
- /* ignore those that are in process of creation */
- if (L_PTR_TO_UINT(key) & 0x80000000)
- return;
-
if (family->info.service_type == data->type)
data->found_family = family;
}
@@ -785,10 +782,6 @@
struct service_family *family = value;
struct qmi_result *result = user_data;
- /* ignore those that are in process of creation */
- if (L_PTR_TO_UINT(key) & 0x80000000)
- return;
-
l_queue_foreach(family->notify_list, service_notify_if_message_matches,
result);
}
@@ -1080,7 +1073,7 @@
void *user_data, qmi_destroy_func_t destroy)
{
if (!device)
- return false;
+ return -EINVAL;
if (!device->ops->discover)
return -ENOTSUP;
@@ -1092,7 +1085,7 @@
void *user_data, qmi_destroy_func_t destroy)
{
if (!device)
- return false;
+ return -EINVAL;
if (!device->ops->shutdown)
return -ENOTSUP;
@@ -1448,6 +1441,7 @@
struct service_create_shared_data {
struct discovery super;
+ uint16_t service_type;
struct service_family *family;
struct qmi_device *device;
qmi_create_func_t func;
@@ -1519,35 +1513,61 @@
return service;
}
-static void service_create_shared_reply(struct l_idle *idle, void *user_data)
+static void service_create_shared_idle_cb(struct l_idle *idle, void *user_data)
{
struct service_create_shared_data *data = user_data;
- struct qmi_service *service;
+ struct qmi_service *service = service_create(data->family);
- l_idle_remove(data->idle);
- data->idle = NULL;
+ DISCOVERY_DONE(data, service, data->user_data);
+}
+
+static void service_create_shared_reply(struct service_create_shared_data *data,
+ struct service_family *family)
+{
+ struct qmi_service *service = NULL;
+
+ if (family)
+ service = service_create(family);
- service = service_create(data->family);
DISCOVERY_DONE(data, service, data->user_data);
}
-static void service_create_shared_pending_reply(struct qmi_device *device,
- unsigned int type,
- struct service_family *family)
+static bool pending_family_match(const void *data, const void *user_data)
{
- void *key = L_UINT_TO_PTR(type | 0x80000000);
- struct l_queue *shared = l_hashmap_remove(device->family_list, key);
- const struct l_queue_entry *entry;
+ const struct service_create_shared_data *shared_data = data;
+ uint16_t service_type = L_PTR_TO_UINT(user_data);
+
+ return shared_data->service_type == service_type;
+}
+
+struct pending_family_reply_if_match_info {
+ uint16_t service_type;
+ struct service_family *family;
+};
- for (entry = l_queue_get_entries(shared); entry; entry = entry->next) {
- struct service_create_shared_data *shared_data = entry->data;
+static bool pending_family_reply_if_match(void *data, void *user_data)
+{
+ struct service_create_shared_data *shared_data = data;
+ const struct pending_family_reply_if_match_info *info = user_data;
- shared_data->family = service_family_ref(family);
- shared_data->idle = l_idle_create(service_create_shared_reply,
- shared_data, NULL);
+ if (pending_family_match(data, L_UINT_TO_PTR(info->service_type))) {
+ service_create_shared_reply(shared_data, info->family);
+ return true;
}
- l_queue_destroy(shared, NULL);
+ return false;
+}
+
+static void service_create_shared_pending_reply(struct qmi_device_qmux *qmux,
+ uint16_t service_type,
+ struct service_family *family)
+{ struct pending_family_reply_if_match_info info = {
+ .service_type = service_type,
+ .family = family,
+ };
+
+ l_queue_foreach_remove(qmux->pending_families,
+ pending_family_reply_if_match, &info);
}
static void service_create_shared_data_free(void *user_data)
@@ -1557,7 +1577,8 @@
if (data->idle)
l_idle_remove(data->idle);
- service_family_unref(data->family);
+ if (data->family)
+ service_family_unref(data->family);
if (data->destroy)
data->destroy(data->user_data);
@@ -1746,8 +1767,6 @@
uint16_t major;
uint16_t minor;
qmi_create_func_t func;
- void *user_data;
- qmi_destroy_func_t destroy;
struct l_timeout *timeout;
uint16_t tid;
};
@@ -1759,9 +1778,6 @@
if (data->timeout)
l_timeout_remove(data->timeout);
- if (data->destroy)
- data->destroy(data->user_data);
-
l_free(data);
}
@@ -1775,7 +1791,7 @@
DBG("");
- service_create_shared_pending_reply(device, data->type, NULL);
+ service_create_shared_pending_reply(qmux, data->type, NULL);
/* remove request from queues */
req = find_control_request(qmux, data->tid);
@@ -1783,7 +1799,7 @@
l_timeout_remove(data->timeout);
data->timeout = NULL;
- DISCOVERY_DONE(data, NULL, data->user_data);
+ DISCOVERY_DONE(data, NULL, NULL);
if (req)
__request_free(req);
@@ -1794,9 +1810,10 @@
{
struct qmux_client_create_data *data = user_data;
struct qmi_device *device = data->device;
+ struct qmi_device_qmux *qmux =
+ l_container_of(device, struct qmi_device_qmux, super);
struct service_family *family = NULL;
struct service_family *old_family = NULL;
- struct qmi_service *service = NULL;
struct qmi_service_info info;
const struct qmi_result_code *result_code;
const struct qmi_client_id *client_id;
@@ -1835,12 +1852,13 @@
if (old_family)
family_destroy(old_family);
- service = service_create(family);
-
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/wds.c
^
|
@@ -5,6 +5,11 @@
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
+#include <stdint.h>
+#include <stddef.h>
+
+#include <ell/ell.h>
+
#include "src/common.h"
#include "wds.h"
@@ -37,3 +42,91 @@
return -ENOENT;
}
+
+int qmi_wds_parse_data_system_status(const void *dss, uint16_t len)
+{
+ const size_t network_info_size = sizeof(uint8_t) + 2 * sizeof(uint32_t);
+ uint8_t num_networks;
+ uint8_t network;
+ uint32_t rat_mask;
+
+ if (len < 2 * sizeof(uint8_t))
+ return -EBADMSG;
+
+ /* uint8_t preferred network type followed by number of network infos */
+ num_networks = l_get_u8(dss + 1);
+
+ len -= 2 * sizeof(uint8_t);
+ dss += 2 * sizeof(uint8_t);
+
+ if (len != num_networks * network_info_size)
+ return -EBADMSG;
+
+ while (len >= network_info_size) {
+ network = l_get_u8(dss);
+ rat_mask = l_get_le32(dss + 1);
+
+ if (network == QMI_WDS_PROFILE_TYPE_3GPP)
+ return rat_mask;
+
+ len -= network_info_size;
+ dss += network_info_size;
+ }
+
+ return -ENOENT;
+}
+
+int qmi_wds_parse_extended_data_bearer_technology(const void *edbt, uint16_t len)
+{
+ uint32_t technology;
+ uint32_t rat;
+ uint32_t so;
+ int bearer;
+
+ if (len != sizeof(uint32_t) * 2 + sizeof(uint64_t))
+ return -EBADMSG;
+
+ technology = l_get_le32(edbt);
+ rat = l_get_le32(edbt + sizeof(uint32_t));
+ so = l_get_le64(edbt + sizeof(uint32_t) * 2);
+
+ if (technology != QMI_WDS_PROFILE_TYPE_3GPP)
+ return -EINVAL;
+
+ switch (rat) {
+ case QMI_WDS_RAT_WCDMA:
+ bearer = PACKET_BEARER_UMTS;
+ break;
+ case QMI_WDS_RAT_LTE:
+ bearer = PACKET_BEARER_EPS;
+ break;
+ default:
+ return -ENOENT;
+ }
+
+ if (so & (QMI_WDS_SO_LTE_LIMITED | QMI_WDS_SO_LTE_FDD |
+ QMI_WDS_SO_LTE_TDD))
+ return PACKET_BEARER_EPS;
+
+ if (so & (QMI_WDS_SO_HSDPAPLUS | QMI_WDS_SO_DC_HSDPAPLUS |
+ QMI_WDS_SO_64_QAM | QMI_WDS_SO_HSPA))
+ return PACKET_BEARER_HSUPA_HSDPA;
+
+ if (so & (QMI_WDS_SO_HSUPA | QMI_WDS_SO_DC_HSUPA))
+ return PACKET_BEARER_HSUPA;
+
+ if (so & QMI_WDS_SO_HSDPA)
+ return PACKET_BEARER_HSDPA;
+
+ if (so & QMI_WDS_SO_WCDMA)
+ return PACKET_BEARER_UMTS;
+
+ if (so & QMI_WDS_SO_EDGE)
+ return PACKET_BEARER_EGPRS;
+
+ if (so & QMI_WDS_SO_GPRS)
+ return PACKET_BEARER_GPRS;
+
+ /* Fall back to rat */
+ return bearer;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/drivers/qmimodem/wds.h
^
|
@@ -46,6 +46,12 @@
QMI_WDS_PDP_TYPE_IPV4V6 = 0x03,
};
+enum qmi_wds_ip_support {
+ QMI_WDS_IP_SUPPORT_IPV4 = 0x00,
+ QMI_WDS_IP_SUPPORT_IPV6 = 0x01,
+ QMI_WDS_IP_SUPPORT_IPV4V6 = 0x02,
+};
+
enum qmi_wds_ip_family {
QMI_WDS_IP_FAMILY_UNKNOWN = 0,
QMI_WDS_IP_FAMILY_IPV4 = 4,
@@ -68,6 +74,58 @@
QMI_WDS_PROFILE_FAMILY_TETHERED = 0x01,
};
+enum qmi_wds_rat_3gpp {
+ QMI_WDS_RAT_3GPP_WCDMA = 0x01,
+ QMI_WDS_RAT_3GPP_GPRS = 0x02,
+ QMI_WDS_RAT_3GPP_HSDPA = 0x04,
+ QMI_WDS_RAT_3GPP_HSUPA = 0x08,
+ QMI_WDS_RAT_3GPP_EDGE = 0x10,
+ QMI_WDS_RAT_3GPP_LTE = 0x20,
+ QMI_WDS_RAT_3GPP_HSDPAPLUS = 0x40,
+ QMI_WDS_RAT_3GPP_DCHSDPAPLUS = 0x80,
+ QMI_WDS_RAT_3GPP_64QAM = 0x100,
+ QMI_WDS_RAT_3GPP_TDSCDMA = 0x200,
+ QMI_WDS_RAT_3GPP_5GNR = 0x400,
+ QMI_WDS_RAT_3GPP_NULL_BEARER = 0x8000,
+};
+
+enum qmi_wds_rat {
+ QMI_WDS_RAT_WCDMA = 0x01,
+ QMI_WDS_RAT_GERAN = 0x02,
+ QMI_WDS_RAT_LTE = 0x03,
+ QMI_WDS_RAT_TDSCDMA = 0x04,
+ QMI_WDS_RAT_WLAN = 0x05,
+};
+
+enum qmi_wds_service_option {
+ QMI_WDS_SO_WCDMA = 0x01ULL,
+ QMI_WDS_SO_HSDPA = 0x02ULL,
+ QMI_WDS_SO_HSUPA = 0x04ULL,
+ QMI_WDS_SO_HSDPAPLUS = 0x08ULL,
+ QMI_WDS_SO_DC_HSDPAPLUS = 0x10ULL,
+ QMI_WDS_SO_64_QAM = 0x20ULL,
+ QMI_WDS_SO_HSPA = 0x40ULL,
+ QMI_WDS_SO_GPRS = 0x80ULL,
+ QMI_WDS_SO_EDGE = 0x100ULL,
+ QMI_WDS_SO_GSM = 0x200ULL,
+ QMI_WDS_SO_S2B = 0x400ULL,
+ QMI_WDS_SO_LTE_LIMITED = 0x800ULL,
+ QMI_WDS_SO_LTE_FDD = 0x1000ULL,
+ QMI_WDS_SO_LTE_TDD = 0x2000ULL,
+ QMI_WDS_SO_TDSCDMA = 0x4000ULL,
+ QMI_WDS_SO_DC_HSUPA = 0x8000ULL,
+ QMI_WDS_SO_LTE_CA_DL = 0x10000ULL,
+ QMI_WDS_SO_LTE_CA_UL = 0x20000ULL,
+ QMI_WDS_SO_S2B_LIMITED = 0x40000ULL,
+ QMI_WDS_SO_FOUR_POINT_FIVE_G = 0x80000ULL,
+ QMI_WDS_SO_FOUR_POINT_FIVE_G_PLUS = 0x100000ULL,
+ QMI_WDS_SO_5G_TDD = 0x10000000000ULL,
+ QMI_WDS_SO_5G_SUB6 = 0x20000000000ULL,
+ QMI_WDS_SO_5G_MMWAVE = 0x40000000000ULL,
+ QMI_WDS_SO_5G_NSA = 0x80000000000ULL,
+ QMI_WDS_SO_5G_SA = 0x100000000000ULL,
+};
+
enum qmi_wds_command {
QMI_WDS_RESET = 0x00,
QMI_WDS_EVENT_REPORT = 0x01,
@@ -111,3 +169,7 @@
int qmi_wds_auth_from_ofono(enum ofono_gprs_auth_method method);
int qmi_wds_pdp_type_from_ofono(enum ofono_gprs_proto proto);
+
+int qmi_wds_parse_data_system_status(const void *dss, uint16_t len);
+int qmi_wds_parse_extended_data_bearer_technology(const void *edbt,
+ uint16_t len);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/plugins/gobi.c
^
|
@@ -226,7 +226,7 @@
switch (data->oper_mode) {
case QMI_DMS_OPER_MODE_ONLINE:
param = qmi_param_new_uint8(QMI_DMS_PARAM_OPER_MODE,
- QMI_DMS_OPER_MODE_PERSIST_LOW_POWER);
+ QMI_DMS_OPER_MODE_LOW_POWER);
if (!param) {
shutdown_device(modem);
return;
@@ -480,7 +480,7 @@
goto out;
param = qmi_param_new_uint8(QMI_DMS_PARAM_OPER_MODE,
- QMI_DMS_OPER_MODE_PERSIST_LOW_POWER);
+ QMI_DMS_OPER_MODE_LOW_POWER);
if (!param)
return -ENOMEM;
@@ -488,6 +488,7 @@
power_disable_cb, modem, NULL) > 0)
return -EINPROGRESS;
+ qmi_param_free(param);
out:
shutdown_device(modem);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/plugins/sim7100.c
^
|
@@ -49,6 +49,7 @@
#include <ofono/message-waiting.h>
#include <ofono/netreg.h>
#include <ofono/phonebook.h>
+#include <ofono/radio-settings.h>
#include <ofono/sim.h>
#include <ofono/sms.h>
#include <ofono/ussd.h>
@@ -57,17 +58,26 @@
#include <ofono/gprs-context.h>
#include <drivers/atmodem/vendor.h>
+#include <drivers/atmodem/atutil.h>
+
+static const char *cfun_prefix[] = { "+CFUN:", NULL };
+
+enum sim7x00_model {
+ SIMCOM_UNKNOWN = 0,
+ SIMCOM_A76XX,
+};
struct sim7100_data {
GAtChat *at;
GAtChat *ppp;
+ enum sim7x00_model model;
};
static void sim7100_debug(const char *str, void *user_data)
{
const char *prefix = user_data;
- ofono_info("%s%s", prefix, str);
+ ofono_info("%s: %s", prefix, str);
}
/* Detect hardware, and initialize if found */
@@ -115,36 +125,57 @@
ofono_modem_set_powered(modem, TRUE);
}
-static int open_device(struct ofono_modem *modem, const char *devkey,
- GAtChat **chatp)
+static void cgmm_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
- GIOChannel *channel;
- GAtSyntax *syntax;
- GAtChat *chat;
- const char *device;
+ struct ofono_modem *modem = user_data;
+ struct sim7100_data *data = ofono_modem_get_data(modem);
+ GAtResultIter iter;
+ const char *model;
- DBG("devkey=%s", devkey);
+ if (!ok) {
+ ofono_error("%s: failed to query model",
+ ofono_modem_get_path(modem));
+ ofono_modem_set_powered(modem, FALSE);
+ return;
+ }
- device = ofono_modem_get_string(modem, devkey);
- if (device == NULL)
- return -EINVAL;
+ g_at_result_iter_init(&iter, result);
- channel = g_at_tty_open(device, NULL);
- if (channel == NULL)
- return -EIO;
+ while (g_at_result_iter_next(&iter, NULL)) {
+ if (!g_at_result_iter_next_unquoted_string(&iter, &model))
+ continue;
+
+ DBG("modem model: %s", model);
+
+ if (g_str_has_prefix(model, "A7672"))
+ data->model = SIMCOM_A76XX;
+
+ break;
+ }
+
+ switch (data->model) {
+ case SIMCOM_A76XX:
+ /* ignore NO CARRIER on the AT channel when disconnecting PPP */
+ g_at_chat_blacklist_terminator(data->at,
+ G_AT_CHAT_TERMINATOR_NO_CARRIER);
+ break;
+ default:
+ break;
+ }
- syntax = g_at_syntax_new_gsm_permissive();
- chat = g_at_chat_new(channel, syntax);
- g_at_syntax_unref(syntax);
- g_io_channel_unref(channel);
+ /* power up modem */
+ g_at_chat_send(data->at, "AT+CFUN=4", NULL, cfun_set_on_cb, modem,
+ NULL);
+}
- if (chat == NULL)
- return -EIO;
+static int open_device(struct ofono_modem *modem, char *devkey, GAtChat **chat)
+{
+ DBG("devkey=%s", devkey);
- if (getenv("OFONO_AT_DEBUG"))
- g_at_chat_set_debug(chat, sim7100_debug, "");
+ *chat = at_util_open_device(modem, devkey, sim7100_debug, devkey, NULL);
+ if (*chat == NULL)
+ return -EIO;
- *chatp = chat;
return 0;
}
@@ -166,11 +197,10 @@
/* ensure modem is in a known state; verbose on, echo/quiet off */
g_at_chat_send(data->at, "ATE0Q0V1", NULL, NULL, NULL, NULL);
- /* power up modem */
- g_at_chat_send(data->at, "AT+CFUN=1", NULL, cfun_set_on_cb,
- modem, NULL);
+ /* query modem model string */
+ g_at_chat_send(data->at, "AT+CGMM", NULL, cgmm_cb, modem, NULL);
- return 0;
+ return -EINPROGRESS;
}
static void cfun_set_off_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -213,8 +243,19 @@
DBG("");
ofono_devinfo_create(modem, 0, "atmodem", data->at);
- sim = ofono_sim_create(modem, 0, "atmodem", data->at);
- ofono_voicecall_create(modem, OFONO_VENDOR_SIMCOM, "atmodem", data->at);
+
+ switch (data->model) {
+ case SIMCOM_A76XX:
+ sim = ofono_sim_create(modem, OFONO_VENDOR_SIMCOM_A76XX,
+ "atmodem", data->at);
+ ofono_voicecall_create(modem, 0, "atmodem", data->at);
+ break;
+ default:
+ sim = ofono_sim_create(modem, 0, "atmodem", data->at);
+ ofono_voicecall_create(modem, OFONO_VENDOR_SIMCOM,
+ "atmodem", data->at);
+ break;
+ }
if (sim)
ofono_sim_inserted_notify(sim, TRUE);
@@ -232,13 +273,28 @@
ofono_ussd_create(modem, 0, "atmodem", data->at);
ofono_call_forwarding_create(modem, 0, "atmodem", data->at);
ofono_call_settings_create(modem, 0, "atmodem", data->at);
- ofono_netreg_create(modem, 0, "atmodem", data->at);
ofono_call_meter_create(modem, 0, "atmodem", data->at);
ofono_call_barring_create(modem, 0, "atmodem", data->at);
- ofono_sms_create(modem, OFONO_VENDOR_SIMCOM, "atmodem", data->at);
ofono_phonebook_create(modem, 0, "atmodem", data->at);
- gprs = ofono_gprs_create(modem, 0, "atmodem", data->at);
+ switch (data->model) {
+ case SIMCOM_A76XX:
+ ofono_netreg_create(modem, OFONO_VENDOR_SIMCOM_A76XX,
+ "atmodem", data->at);
+ ofono_sms_create(modem, OFONO_VENDOR_SIMCOM_A76XX,
+ "atmodem", data->at);
+ ofono_radio_settings_create(modem, 0, "simcommodem", data->at);
+ gprs = ofono_gprs_create(modem, OFONO_VENDOR_SIMCOM_A76XX,
+ "atmodem", data->at);
+ break;
+ default:
+ ofono_netreg_create(modem, 0, "atmodem", data->at);
+ ofono_sms_create(modem, OFONO_VENDOR_SIMCOM, "atmodem",
+ data->at);
+ gprs = ofono_gprs_create(modem, 0, "atmodem", data->at);
+ break;
+ }
+
gc = ofono_gprs_context_create(modem, 0, "atmodem", data->ppp);
if (gprs && gc)
@@ -249,11 +305,42 @@
ofono_message_waiting_register(mw);
}
+static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_modem_online_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ DBG("ok: %i", ok);
+
+ decode_at_error(&error, g_at_result_final_response(result));
+ cb(&error, cbd->data);
+}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-2.7+git1.tar.bz2/upstream/plugins/udevng.c
^
|
@@ -834,7 +834,8 @@
DBG("%s %s %s %s %s", info->devnode, info->interface,
info->number, info->label, subsystem);
- if (g_strcmp0(info->interface, "255/255/255") == 0 &&
+ if ((!g_strcmp0(info->interface, "255/255/255") ||
+ !g_strcmp0(info->interface, "255/255/80")) &&
g_strcmp0(info->number, "02") == 0) {
if (g_strcmp0(subsystem, "net") == 0)
net = info;
@@ -849,8 +850,8 @@
if (setup_qmi(modem, qmi, net) < 0)
return FALSE;
- ofono_modem_set_boolean(modem->modem, "ForceSimLegacy", TRUE);
- ofono_modem_set_boolean(modem->modem, "AlwaysOnline", TRUE);
+ if (g_strcmp0(modem->model, "1070"))
+ ofono_modem_set_boolean(modem->modem, "ForceSimLegacy", TRUE);
return TRUE;
}
@@ -1630,6 +1631,57 @@
return TRUE;
}
+static gboolean setup_sim76xx(struct modem_info *modem)
+{
+ const char *diag = NULL;
+ const char *mdm = NULL;
+ const char *ppp = NULL;
+ const char *gps = NULL;
+ GSList *list;
+
+ DBG("%s", modem->syspath);
+
+ for (list = modem->devices; list; list = list->next) {
+ const struct device_info *info = list->data;
+ const char *subsystem;
+
+ subsystem = udev_device_get_subsystem(info->udev_device);
+ if (!g_str_equal(subsystem, "tty"))
+ continue;
+
+ DBG("%s %s %s", info->devnode, info->interface, info->number);
+
+ /*
+ * SIM76xx USB numbering:
+ * 0: RNDIS (ep_87)
+ * 1: RNDIS (ep_0c and ep_83)
+ * 2: QCDM/DIAG (ttyUSB0)
+ * 3: NMEA (ttyUSB3)
+ * 4: AT (ttyUSB1)
+ * 5: AT/PPP (ttyUSB2)
+ */
+ if (g_str_equal(info->number, "02"))
+ diag = info->devnode;
+ else if (g_str_equal(info->number, "03"))
+ gps = info->devnode;
+ else if (g_str_equal(info->number, "04"))
+ mdm = info->devnode;
+ else if (g_str_equal(info->number, "05"))
+ ppp = info->devnode;
+ }
+
+ if (mdm == NULL)
+ return FALSE;
+
+ DBG("at=%s ppp=%s gps=%s diag=%s", mdm, ppp, gps, diag);
+
+ ofono_modem_set_driver(modem->modem, "sim7100");
+ ofono_modem_set_string(modem->modem, "AT", mdm);
+ ofono_modem_set_string(modem->modem, "PPP", ppp);
+
+ return TRUE;
+}
+
static struct {
const char *name;
gboolean (*setup)(struct modem_info *modem);
@@ -1650,6 +1702,7 @@
{ "telitqmi", setup_telitqmi },
{ "simcom", setup_simcom },
{ "sim7x00", setup_sim7x00 },
+ { "sim76xx", setup_sim76xx },
{ "zte", setup_zte },
{ "icera", setup_icera },
{ "samsung", setup_samsung },
@@ -2033,11 +2086,14 @@
{ "simcom", "option", "05c6", "9000" },
{ "sim7x00", "option", "1e0e", "9001" },
{ "sim7x00", "qmi_wwan", "1e0e", "9001" },
+ { "sim76xx", "option", "1e0e", "9011" },
{ "telit", "usbserial", "1bc7" },
{ "telit", "option", "1bc7" },
{ "telit", "cdc_acm", "1bc7", "0021" },
{ "telitqmi", "qmi_wwan", "1bc7", "1201" },
{ "telitqmi", "option", "1bc7", "1201" },
+ { "telitqmi", "qmi_wwan", "1bc7", "1070" },
+ { "telitqmi", "option", "1bc7", "1070" },
{ "droid", "qmi_wwan", "22b8", "2a70" },
{ "droid", "option", "22b8", "2a70" },
{ "nokia", "option", "0421", "060e" },
|