REVERT-ME: power: Send upstart events for modem WDS status
This is a temporary hack for Modem SSR on trogdor and will be
removed once qc-netmgr is merged into the driver.
As per QC WDS is a better indicator of the health of modem.
During a modem crash, the node can still be up, but WDS service
will be offline. Here we make sure WDS and the Node are up before
sending a qrtr-service-added message. Similarly
qrtr-service-removed messages are sent when WDS service goes offline.
These messages are used to start/stop qc-netmgr.
BUG=b:159860147, b:172173518
TEST=cros deploy ${DUT} power_manager && reboot && diag-route && send_data 75
37 03 00 00
Change-Id: I7cd99cb5f8b6738bca10e9a1962bcb200d10be4d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2582515
Tested-by: Madhav . <madhavadas@google.com>
Commit-Queue: Madhav . <madhavadas@google.com>
Reviewed-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Madhav . <madhavadas@google.com>
(cherry picked from commit c5195993feea7953b391f363b99c807679fa3708)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2634244
Reviewed-by: Pavan Holla <pholla@google.com>
Reviewed-by: Andrew Lassalle <andrewlassalle@chromium.org>
diff --git a/power_manager/BUILD.gn b/power_manager/BUILD.gn
index 7c7816c..be7264b 100644
--- a/power_manager/BUILD.gn
+++ b/power_manager/BUILD.gn
@@ -51,7 +51,18 @@
]
}
if (use.trogdor_sar_hack) {
- deps += [ ":set_cellular_transmit_power_trogdor" ]
+ deps += [
+ ":set_cellular_transmit_power_trogdor",
+ ":upstart_proxies",
+ ]
+ }
+}
+
+if (use.trogdor_sar_hack) {
+ generate_dbus_proxies("upstart_proxies") {
+ upstart_in_dir = "${sysroot}/usr/share/dbus-1/interfaces/"
+ proxy_output_file = "include/upstart/dbus-proxies.h"
+ sources = [ "${upstart_in_dir}/com.ubuntu.Upstart.xml" ]
}
}
@@ -210,6 +221,8 @@
]
if (use.trogdor_sar_hack) {
sources += [ "powerd/policy/cellular_controller_trogdor.cc" ]
+
+ deps = [ ":upstart_proxies" ]
}
libs = [ "m" ]
}
diff --git a/power_manager/dbus/org.chromium.PowerManager.conf b/power_manager/dbus/org.chromium.PowerManager.conf
index d7ab603..29e4701 100644
--- a/power_manager/dbus/org.chromium.PowerManager.conf
+++ b/power_manager/dbus/org.chromium.PowerManager.conf
@@ -8,6 +8,9 @@
<policy user="power">
<allow own="org.chromium.PowerManager" />
+ <allow send_destination="com.ubuntu.Upstart"
+ send_interface="com.ubuntu.Upstart0_6"
+ send_type="method_call" send_member="EmitEvent" />
</policy>
<limit name="max_replies_per_connection">512</limit>
diff --git a/power_manager/powerd/policy/cellular_controller_trogdor.cc b/power_manager/powerd/policy/cellular_controller_trogdor.cc
index de8323f..044c445 100644
--- a/power_manager/powerd/policy/cellular_controller_trogdor.cc
+++ b/power_manager/powerd/policy/cellular_controller_trogdor.cc
@@ -16,6 +16,11 @@
#define TROGDOR_MODEM_NODE_ID (0x0)
#define TROGDOR_WDS_SERVICE_ID (0x1)
+namespace {
+const char kUpstartServiceName[] = "com.ubuntu.Upstart";
+const char kNodeAddedEvent[] = "qrtr-service-added";
+const char kNodeRemovedEvent[] = "qrtr-service-removed";
+} // namespace
namespace power_manager {
namespace policy {
@@ -50,6 +55,14 @@
CHECK(InitQrtrSocket());
}
+void CellularControllerTrogdor::EmitEvent(const char* event) {
+ brillo::ErrorPtr error;
+ LOG(INFO) << "In EmitEvent sending = " << event;
+ if (!upstart_proxy_->EmitEvent(event, {}, false /* wait */, &error)) {
+ LOG(ERROR) << "Could not emit upstart event: " << error->GetMessage();
+ }
+}
+
void CellularControllerTrogdor::ProximitySensorDetected(UserProximity value) {
if (set_transmit_power_for_proximity_) {
if (set_transmit_power_for_tablet_mode_) {
@@ -179,6 +192,7 @@
<< " port = " << pkt.port << " service = " << pkt.service;
if (pkt.node == TROGDOR_MODEM_NODE_ID &&
pkt.service == TROGDOR_WDS_SERVICE_ID) {
+ EmitEvent(kNodeAddedEvent);
HandleModemStateChange(ModemState::ONLINE);
}
break;
@@ -187,6 +201,7 @@
<< " port = " << pkt.port << " service = " << pkt.service;
if (pkt.node == TROGDOR_MODEM_NODE_ID &&
pkt.service == TROGDOR_WDS_SERVICE_ID) {
+ EmitEvent(kNodeRemovedEvent);
HandleModemStateChange(ModemState::OFFLINE);
}
break;
@@ -242,6 +257,13 @@
bool CellularControllerTrogdor::InitQrtrSocket() {
uint8_t kQrtrPort = 0;
+ dbus::Bus::Options options;
+ options.bus_type = dbus::Bus::SYSTEM;
+ scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
+ CHECK(bus->Connect());
+ upstart_proxy_ =
+ std::make_unique<com::ubuntu::Upstart0_6Proxy>(bus, kUpstartServiceName);
+
socket_.reset(qrtr_open(kQrtrPort));
if (!socket_.is_valid()) {
LOG(ERROR) << "Failed to open QRTR socket with port " << kQrtrPort;
diff --git a/power_manager/powerd/policy/cellular_controller_trogdor.h b/power_manager/powerd/policy/cellular_controller_trogdor.h
index cfef9ce..d34ffe5 100644
--- a/power_manager/powerd/policy/cellular_controller_trogdor.h
+++ b/power_manager/powerd/policy/cellular_controller_trogdor.h
@@ -12,6 +12,8 @@
#include <base/macros.h>
#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/scoped_file.h>
+#include <brillo/daemons/dbus_daemon.h>
+#include <upstart/dbus-proxies.h>
#include "power_manager/common/power_constants.h"
#include "power_manager/powerd/policy/user_proximity_handler.h"
@@ -54,6 +56,7 @@
// Called when the tablet mode changes.
void HandleTabletModeChange(TabletMode mode);
void HandleModemStateChange(ModemState state);
+ void EmitEvent(const char* event);
// UserProximityHandler::Delegate overrides:
void ProximitySensorDetected(UserProximity proximity) override;
void HandleProximityChange(UserProximity proximity) override;
@@ -92,6 +95,7 @@
base::ScopedFD socket_;
std::unique_ptr<base::FileDescriptorWatcher::Controller> watcher_;
std::vector<uint8_t> buffer_;
+ std::unique_ptr<com::ubuntu::Upstart0_6Proxy> upstart_proxy_;
DISALLOW_COPY_AND_ASSIGN(CellularControllerTrogdor);
};