qmimodem: Implement data capability bearer notify

This implements data capability bearer notify to qmi modem.
Since this is included in the serving system response this
just adds a new data extraction for dc.
This commit is contained in:
Marius Gripsgard 2020-06-10 15:44:18 +02:00 committed by Denis Kenzior
parent a88d1120a4
commit 4e61dc355e
3 changed files with 86 additions and 0 deletions

View File

@ -68,6 +68,28 @@ static bool extract_ss_info(struct qmi_result *result, int *status, int *tech)
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)
{
struct ofono_gprs *gprs = user_data;
@ -188,6 +210,7 @@ static int handle_ss_info(struct qmi_result *result, struct ofono_gprs *gprs)
struct gprs_data *data = ofono_gprs_get_data(gprs);
int status;
int tech;
int bearer_tech;
DBG("");
@ -209,6 +232,10 @@ static int handle_ss_info(struct qmi_result *result, struct ofono_gprs *gprs)
data->last_auto_context_id = 0;
}
/* 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;
}

View File

@ -36,3 +36,39 @@ int qmi_nas_rat_to_tech(uint8_t rat)
return -1;
}
int qmi_nas_cap_to_bearer_tech(int cap_tech)
{
switch (cap_tech) {
case QMI_NAS_DATA_CAPABILITY_GSM:
case QMI_NAS_DATA_CAPABILITY_NONE:
return PACKET_BEARER_NONE;
case QMI_NAS_DATA_CAPABILITY_GPRS:
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:
/*
* HSPAP is HSPA+; which ofono doesn't define;
* so, if differentiating HSPA and HSPA+ is
* important, then ofono needs to be patched,
* and we probably also need to introduce a
* new indicator icon.
*/
return PACKET_BEARER_HSUPA_HSDPA;
case QMI_NAS_DATA_CAPABILITY_LTE:
return PACKET_BEARER_EPS;
default:
return PACKET_BEARER_NONE;
}
}

View File

@ -135,6 +135,28 @@ struct qmi_nas_serving_system {
uint8_t radio_if[0];
} __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;
@ -188,3 +210,4 @@ struct qmi_nas_home_network {
#define QMI_NAS_RESULT_SYSTEM_SELECTION_PREF_MODE 0x11
int qmi_nas_rat_to_tech(uint8_t rat);
int qmi_nas_cap_to_bearer_tech(int cap_tech);