~ubuntu-branches/ubuntu/quantal/modemmanager/quantal

« back to all changes in this revision

Viewing changes to libqcdm/src/commands.c

  • Committer: Package Import Robot
  • Author(s): Mathieu Trudel-Lapierre
  • Date: 2012-10-08 11:03:19 UTC
  • mfrom: (1.1.20)
  • Revision ID: package-import@ubuntu.com-20121008110319-wxd1vokudgaw2sep
Tags: 0.6.0.0.really-0ubuntu1
Upload the right tarball for 0.6.0.0 from upstream, which I somehow
mishandled before. Thanks to Marius B. Kotsbak for pointing out the issue.

Show diffs side-by-side

added added

removed removed

Lines of Context:
507
507
    return cdma_state + 1;
508
508
}
509
509
 
 
510
static inline u_int8_t
 
511
digit_fixup (u_int8_t d)
 
512
{
 
513
    /* CDMA MCC/IMSI conversion adds 1 to each digit, and digits equal to
 
514
     * 10 are really zero.
 
515
     */
 
516
    if (d + 1 < 10)
 
517
        return d + 1;
 
518
    return 0;
 
519
}
 
520
 
510
521
QcdmResult *
511
522
qcdm_cmd_status_snapshot_result (const char *buf, size_t len, int *out_error)
512
523
{
513
524
    QcdmResult *result = NULL;
514
525
    DMCmdStatusSnapshotRsp *rsp = (DMCmdStatusSnapshotRsp *) buf;
 
526
    char *tmp;
 
527
    u_int8_t swapped[4];
 
528
    u_int8_t tmcc[3];
 
529
    u_int16_t mcc, hmcc;
515
530
 
516
531
    qcdm_return_val_if_fail (buf != NULL, NULL);
517
532
 
520
535
 
521
536
    result = qcdm_result_new ();
522
537
 
 
538
    /* Convert the ESN from binary to a hex string; it's LE so we have to
 
539
     * swap it to get the correct ordering.
 
540
     */
 
541
    swapped[0] = rsp->esn[3];
 
542
    swapped[1] = rsp->esn[2];
 
543
    swapped[2] = rsp->esn[1];
 
544
    swapped[3] = rsp->esn[0];
 
545
 
 
546
    tmp = bin2hexstr (&swapped[0], sizeof (swapped));
 
547
    qcdm_result_add_string (result, QCDM_CMD_STATUS_SNAPSHOT_ITEM_ESN, tmp);
 
548
    free (tmp);
 
549
 
 
550
    /* Cheap binary -> decimal conversion */
 
551
    hmcc = le16toh (rsp->mcc);
 
552
    tmcc[2] = hmcc / 100;
 
553
    tmcc[1] = (hmcc - (tmcc[2] * 100)) / 10;
 
554
    tmcc[0] = (hmcc - (tmcc[2] * 100) - (tmcc[1] * 10));
 
555
 
 
556
    mcc = (100 * digit_fixup (tmcc[2])) + (10 * digit_fixup (tmcc[1])) + digit_fixup (tmcc[0]);
 
557
    qcdm_result_add_u32 (result, QCDM_CMD_STATUS_SNAPSHOT_ITEM_HOME_MCC, mcc);
 
558
 
523
559
    qcdm_result_add_u8 (result, QCDM_CMD_STATUS_SNAPSHOT_ITEM_BAND_CLASS, cdma_band_class_to_qcdm (rsp->band_class));
524
560
    qcdm_result_add_u8 (result, QCDM_CMD_STATUS_SNAPSHOT_ITEM_BASE_STATION_PREV, cdma_prev_to_qcdm (rsp->prev));
525
561
    qcdm_result_add_u8 (result, QCDM_CMD_STATUS_SNAPSHOT_ITEM_MOBILE_PREV, cdma_prev_to_qcdm (rsp->mob_prev));
923
959
 
924
960
/**********************************************************************/
925
961
 
 
962
size_t
 
963
qcdm_cmd_nv_get_hybrid_pref_new (char *buf, size_t len)
 
964
{
 
965
    char cmdbuf[sizeof (DMCmdNVReadWrite) + 2];
 
966
    DMCmdNVReadWrite *cmd = (DMCmdNVReadWrite *) &cmdbuf[0];
 
967
 
 
968
    qcdm_return_val_if_fail (buf != NULL, 0);
 
969
    qcdm_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0);
 
970
 
 
971
    memset (cmd, 0, sizeof (*cmd));
 
972
    cmd->code = DIAG_CMD_NV_READ;
 
973
    cmd->nv_item = htole16 (DIAG_NV_HYBRID_PREF);
 
974
 
 
975
    return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len);
 
976
}
 
977
 
 
978
QcdmResult *
 
979
qcdm_cmd_nv_get_hybrid_pref_result (const char *buf, size_t len, int *out_error)
 
980
{
 
981
    QcdmResult *result = NULL;
 
982
    DMCmdNVReadWrite *rsp = (DMCmdNVReadWrite *) buf;
 
983
    DMNVItemHybridPref *hybrid;
 
984
 
 
985
    qcdm_return_val_if_fail (buf != NULL, NULL);
 
986
 
 
987
    if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), out_error))
 
988
        return NULL;
 
989
 
 
990
    if (!check_nv_cmd (rsp, DIAG_NV_HYBRID_PREF, out_error))
 
991
        return NULL;
 
992
 
 
993
    hybrid = (DMNVItemHybridPref *) &rsp->data[0];
 
994
 
 
995
    if (hybrid->hybrid_pref > 1)
 
996
        qcdm_warn (0, "Unknown hybrid preference 0x%X", hybrid->hybrid_pref);
 
997
 
 
998
    result = qcdm_result_new ();
 
999
    qcdm_result_add_u8 (result, QCDM_CMD_NV_GET_HYBRID_PREF_ITEM_HYBRID_PREF, hybrid->hybrid_pref);
 
1000
 
 
1001
    return result;
 
1002
}
 
1003
 
 
1004
size_t
 
1005
qcdm_cmd_nv_set_hybrid_pref_new (char *buf,
 
1006
                                 size_t len,
 
1007
                                 u_int8_t hybrid_pref)
 
1008
{
 
1009
    char cmdbuf[sizeof (DMCmdNVReadWrite) + 2];
 
1010
    DMCmdNVReadWrite *cmd = (DMCmdNVReadWrite *) &cmdbuf[0];
 
1011
    DMNVItemHybridPref *req;
 
1012
 
 
1013
    qcdm_return_val_if_fail (buf != NULL, 0);
 
1014
    qcdm_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0);
 
1015
 
 
1016
    if (hybrid_pref > QCDM_CMD_NV_HYBRID_PREF_ITEM_REV_HYBRID_ON) {
 
1017
        qcdm_err (0, "Invalid hybrid preference %d", hybrid_pref);
 
1018
        return 0;
 
1019
    }
 
1020
 
 
1021
    memset (cmd, 0, sizeof (*cmd));
 
1022
    cmd->code = DIAG_CMD_NV_WRITE;
 
1023
    cmd->nv_item = htole16 (DIAG_NV_HYBRID_PREF);
 
1024
 
 
1025
    req = (DMNVItemHybridPref *) &cmd->data[0];
 
1026
    if (hybrid_pref == QCDM_CMD_NV_HYBRID_PREF_ITEM_REV_HYBRID_OFF)
 
1027
        req->hybrid_pref = DIAG_NV_HYBRID_PREF_OFF;
 
1028
    else if (hybrid_pref == QCDM_CMD_NV_HYBRID_PREF_ITEM_REV_HYBRID_ON)
 
1029
        req->hybrid_pref = DIAG_NV_HYBRID_PREF_ON;
 
1030
 
 
1031
    return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len);
 
1032
}
 
1033
 
 
1034
QcdmResult *
 
1035
qcdm_cmd_nv_set_hybrid_pref_result (const char *buf, size_t len, int *out_error)
 
1036
{
 
1037
    qcdm_return_val_if_fail (buf != NULL, NULL);
 
1038
 
 
1039
    if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), out_error))
 
1040
        return NULL;
 
1041
 
 
1042
    if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_HYBRID_PREF, out_error))
 
1043
        return NULL;
 
1044
 
 
1045
    return qcdm_result_new ();
 
1046
}
 
1047
 
 
1048
/**********************************************************************/
 
1049
 
926
1050
static qcdmbool
927
1051
hdr_rev_pref_validate (u_int8_t dm)
928
1052
{