laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-e1d/+/29618 )

Change subject: usb: Add support for new GPSDO status field "Accumulated error"
......................................................................

usb: Add support for new GPSDO status field "Accumulated error"

Because we want to handle older firmwares too, we need to excepect
we might get a smaller structure !

(We can't get a larger one since the wLength we send is limited to
the structure we know)

Signed-off-by: Sylvain Munaut <[email protected]>
Change-Id: I4222bf22267f8343abf1e97546111ceb1c299846
---
M src/e1d.h
M src/ice1usb_proto.h
M src/intf_line.c
M src/usb.c
4 files changed, 23 insertions(+), 4 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved



diff --git a/src/e1d.h b/src/e1d.h
index 42be1b4..ff34800 100644
--- a/src/e1d.h
+++ b/src/e1d.h
@@ -67,6 +67,7 @@
        LINE_GPSDO_TUNE_COARSE,
        LINE_GPSDO_TUNE_FINE,
        LINE_GPSDO_FREQ_EST,
+       LINE_GPSDO_ERR_ACC,
 };

 enum e1_ts_mode {
diff --git a/src/ice1usb_proto.h b/src/ice1usb_proto.h
index 3170d55..54b91ab 100644
--- a/src/ice1usb_proto.h
+++ b/src/ice1usb_proto.h
@@ -65,6 +65,7 @@
        uint8_t mode;                   /*!< Current configured operating mode 
*/
        struct e1usb_gpsdo_tune tune;   /*!< Current VCXO tuning values */
        uint32_t freq_est;              /*!< Latest frequency estimate 
measurement */
+       int16_t  err_acc;               /*!< Accumulated error (since fw 
icE1usb-fw-0.3 commit cfb8b0b7) */
 } __attribute__((packed));


diff --git a/src/intf_line.c b/src/intf_line.c
index a645cd3..811b8fe 100644
--- a/src/intf_line.c
+++ b/src/intf_line.c
@@ -75,6 +75,7 @@
        [LINE_GPSDO_TUNE_COARSE]= { "gpsdo:tune:coarse", "GSPDO Coarse Tuning" 
},
        [LINE_GPSDO_TUNE_FINE]  = { "gpsdo:tune:fine", "GSPDO Fine Tuning" },
        [LINE_GPSDO_FREQ_EST]   = { "gpsdo:freq_est", "GSPDO Frequency 
Estimate" },
+       [LINE_GPSDO_ERR_ACC]    = { "gpsdo:err_acc", "GPSDO Accumulated Error" 
},
 };

 static const struct osmo_stat_item_group_desc line_stats_desc = {
diff --git a/src/usb.c b/src/usb.c
index fa6ddee..a60ea99 100644
--- a/src/usb.c
+++ b/src/usb.c
@@ -706,14 +706,29 @@
 {
        struct e1_usb_intf_data *id = intf->drv_data;
        struct e1usb_gpsdo_status *last_st = &id->gpsdo.last_status;
-       const struct e1usb_gpsdo_status *st;
+       struct e1usb_gpsdo_status _st, *st = &_st;
        struct e1_line *line;

        if (len < sizeof(*st)) {
-               LOGPIF(intf, DE1D, LOGL_ERROR, "GPSDO status %zu < %zu!\n", 
len, sizeof(*st));
-               return;
+               /*
+                * Because some fields can be added to the structure by newer
+                * firmware revisions, this means we can potentially get a 
shorter
+                * struct than what we asked for. We simply set those fields to
+                * zero.
+                *
+                * The opposite case (newer firmware than e1d) means the 
structure
+                * could be larger, but because we limit the wLength to the 
struct
+                * we know, we can't receive a larger one and the new fields are
+                * just ignored by this e1d version
+                */
+               LOGPIF(intf, DE1D, LOGL_DEBUG,
+                       "GPSDO status %zu < %zu ! Firmware probably outdated. "
+                       "Some values will be zeroed\n",
+                       len, sizeof(*st));
        }
-       st = (const struct e1usb_gpsdo_status *) data;
+
+       memset(st, 0x00, sizeof(*st));
+       memcpy(st, data, len);

        if (st->state != last_st->state) {
                LOGPIF(intf, DE1D, LOGL_NOTICE, "GPSDO state change: %s -> 
%s\n",
@@ -750,6 +765,7 @@
                line_stat_set(line, LINE_GPSDO_TUNE_COARSE, 
libusb_le16_to_cpu(st->tune.coarse));
                line_stat_set(line, LINE_GPSDO_TUNE_FINE, 
libusb_le16_to_cpu(st->tune.fine));
                line_stat_set(line, LINE_GPSDO_FREQ_EST, 
osmo_load32le(&st->freq_est));
+               line_stat_set(line, LINE_GPSDO_ERR_ACC, 
(int16_t)libusb_le16_to_cpu(st->err_acc));
        }

        /* update our state */

--
To view, visit https://gerrit.osmocom.org/c/osmo-e1d/+/29618
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-e1d
Gerrit-Branch: master
Gerrit-Change-Id: I4222bf22267f8343abf1e97546111ceb1c299846
Gerrit-Change-Number: 29618
Gerrit-PatchSet: 6
Gerrit-Owner: tnt <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-MessageType: merged

Reply via email to