[PATCH] update signal quality correctly when out of coverage

Dan Williams dcbw at redhat.com
Tue Oct 22 14:23:05 PDT 2013


On Tue, 2013-10-22 at 12:17 -0700, Prathmesh Prabhu wrote:
> When querying signal quality using AT+CSQ, a response of '+CSQ:99,99' indicates no
> network. This should lead to the signal quality being set to 0. Before this
> patch, the last most recent signal quality would be left untouched.

Instead, how about we just want to ditch the NO_NETWORK bits in
mm-broadband-mode.c::signal_quality_csq_ready() and just report 0 signal
when CSQ returns 99?  There was no good reason NO_NETWORK was used,
except that in MM 0.6 and earlier it was returned directly to callers.
But now in MM 1.0, the error is only consumed by MM itself, internally,
so there's no point to it.  So maybe just:

        if (sscanf (result_str, "%d, %d", &quality, &ber)) {
            if (quality == 99) {
                /* 99 means unknown */
                quality = 0;
            } else {
                /* Normalize it */
                quality = CLAMP (quality, 0, 31) * 100 / 31;
            }
            g_simple_async_result_set_op_res_gpointer (ctx->result,
                                                       GUINT_TO_POINTER (quality),
                                                       NULL);

or something like that.  What do you think?

Dan

> ---
>  src/mm-iface-modem.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
> index 433dbac..ea433ed 100644
> --- a/src/mm-iface-modem.c
> +++ b/src/mm-iface-modem.c
> @@ -1169,7 +1169,16 @@ signal_quality_check_ready (MMIfaceModem *self,
>                                                                                        res,
>                                                                                        &error);
>      if (error) {
> -        mm_dbg ("Couldn't refresh signal quality: '%s'", error->message);
> +        /* If we failed to update signal quality because there was no network,
> +         * we should set the signal quality to zero to reflect no network
> +         * coverage.
> +         */
> +        if (error->code == MM_MOBILE_EQUIPMENT_ERROR_NO_NETWORK) {
> +            mm_dbg ("Out of coverage area. Setting signal quality to '0'");
> +            update_signal_quality (self, 0, TRUE);
> +        } else {
> +            mm_dbg ("Couldn't refresh signal quality: '%s'", error->message);
> +        }
>          g_error_free (error);
>      } else
>          update_signal_quality (self, signal_quality, TRUE);




More information about the ModemManager-devel mailing list