From 12804fa5ff9f88a535c92ff3893a6366610fc1ea Mon Sep 17 00:00:00 2001 From: SPRESENSE <41312067+SPRESENSE@users.noreply.github.com> Date: Tue, 27 Dec 2022 15:18:41 +0900 Subject: [PATCH] drivers:alt1250: Fix bug that callbacks were called at unexpected timing Fix bug that callbacks were called even though there was no change in local time or SIM status. --- drivers/modem/alt1250/altcom_hdlr_net.c | 69 ++++++++++++++----------- include/nuttx/wireless/lte/lte_ioctl.h | 1 + 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/drivers/modem/alt1250/altcom_hdlr_net.c b/drivers/modem/alt1250/altcom_hdlr_net.c index 9a066119cbcff..5d47db3c7058b 100644 --- a/drivers/modem/alt1250/altcom_hdlr_net.c +++ b/drivers/modem/alt1250/altcom_hdlr_net.c @@ -35,6 +35,7 @@ #include #include "altcom_cmd.h" +#include "alt1250.h" /**************************************************************************** * Pre-processor Definitions @@ -1040,10 +1041,8 @@ int32_t altcom_repevt_pkt_parse(FAR struct alt1250_dev_s *dev, uint8_t altver, FAR void **arg, size_t arglen, FAR uint64_t *bitmap) { - int32_t ret = 0; - FAR uint8_t *flag = (FAR uint8_t *)arg[0]; - FAR uint32_t *simstat = (FAR uint32_t *)arg[1]; - FAR lte_localtime_t *ltime = (FAR lte_localtime_t *)arg[2]; + int32_t ret = -ENOTSUP; + alt_evtbuf_inst_t *inst; if (altver == ALTCOM_VER1) { @@ -1054,27 +1053,32 @@ int32_t altcom_repevt_pkt_parse(FAR struct alt1250_dev_s *dev, { case APICMD_REPORT_EVT_TYPE_LTIME: { - parse_ltime(&in->u.ltime, ltime); - *flag |= ALTCOM_REPEVT_FLAG_LTIME; - } - break; - - case APICMD_REPORT_EVT_TYPE_SIMD: - { - ret = parse_simd(&in->u.simd, simstat); - if (ret == 0) + *bitmap = get_event_lapibuffer(dev, LTE_CMDID_REPLTIME, &inst); + if (*bitmap != 0ULL) { - *flag |= ALTCOM_REPEVT_FLAG_SIMSTAT; + FAR lte_localtime_t *ltime = inst->outparam[0]; + parse_ltime(&in->u.ltime, ltime); + ret = 0; } } break; + case APICMD_REPORT_EVT_TYPE_SIMD: case APICMD_REPORT_EVT_TYPE_SIMSTATE: { - ret = parse_simstate(&in->u.simstate, simstat); - if (ret == 0) + *bitmap = get_event_lapibuffer(dev, LTE_CMDID_REPSIMSTAT, + &inst); + if (*bitmap != 0ULL) { - *flag |= ALTCOM_REPEVT_FLAG_SIMSTAT; + FAR uint32_t *simstat = inst->outparam[0]; + if (in->type == APICMD_REPORT_EVT_TYPE_SIMD) + { + ret = parse_simd(&in->u.simd, simstat); + } + else + { + ret = parse_simstate(&in->u.simstate, simstat); + } } } break; @@ -1096,27 +1100,32 @@ int32_t altcom_repevt_pkt_parse(FAR struct alt1250_dev_s *dev, { case APICMD_REPORT_EVT_TYPE_LTIME: { - parse_ltime(&in->u.ltime, ltime); - *flag |= ALTCOM_REPEVT_FLAG_LTIME; - } - break; - - case APICMD_REPORT_EVT_TYPE_SIMD: - { - ret = parse_simd(&in->u.simd, simstat); - if (ret == 0) + *bitmap = get_event_lapibuffer(dev, LTE_CMDID_REPLTIME, &inst); + if (*bitmap != 0ULL) { - *flag |= ALTCOM_REPEVT_FLAG_SIMSTAT; + FAR lte_localtime_t *ltime = inst->outparam[0]; + parse_ltime(&in->u.ltime, ltime); + ret = 0; } } break; + case APICMD_REPORT_EVT_TYPE_SIMD: case APICMD_REPORT_EVT_TYPE_SIMSTATE: { - ret = parse_simstate(&in->u.simstate, simstat); - if (ret == 0) + *bitmap = get_event_lapibuffer(dev, LTE_CMDID_REPSIMSTAT, + &inst); + if (*bitmap != 0ULL) { - *flag |= ALTCOM_REPEVT_FLAG_SIMSTAT; + FAR uint32_t *simstat = inst->outparam[0]; + if (ntohs(in->type) == APICMD_REPORT_EVT_TYPE_SIMD) + { + ret = parse_simd(&in->u.simd, simstat); + } + else + { + ret = parse_simstate(&in->u.simstate, simstat); + } } } break; diff --git a/include/nuttx/wireless/lte/lte_ioctl.h b/include/nuttx/wireless/lte/lte_ioctl.h index 415fd6bbcc9e4..8b41f0231acf3 100644 --- a/include/nuttx/wireless/lte/lte_ioctl.h +++ b/include/nuttx/wireless/lte/lte_ioctl.h @@ -158,6 +158,7 @@ #define LTE_CMDID_GET_POWER_STAT _CMDGRP_POWER(0x3f) #define LTE_CMDID_SETCTXCB _CMDGRP_NOMDM(0x40) #define LTE_CMDID_COUNTWLOCK _CMDGRP_POWER(0x41) +#define LTE_CMDID_REPEVT_DUMMY _CMDGRP_EVENT(0x42) #define LTE_CMDID_ACCEPT _CMDGRP_NORMAL(0x50) #define LTE_CMDID_BIND _CMDGRP_NORMAL(0x51)