18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * sysevent.c : Solaris sysevents
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean sysevent_iochannel_data(GIOChannel *, GIOCondition, gpointer);
d2ec54f7875f7e05edd56195adbeb593c947763fphitranstatic void sysevent_pwrctl(gchar *, gchar *, gchar *, gchar *, gchar *,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * pipe used to serialize sysevents through the main loop
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_iochannel = g_io_channel_unix_new (sysevent_pipe_fds[0]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_io_channel_set_flags (sysevent_iochannel, G_IO_FLAG_NONBLOCK, &err);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_iochannel, G_IO_IN, sysevent_iochannel_data, NULL);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (sysevent_subscribe_event(shp, EC_DEV_ADD, subcl, 3) != 0) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (sysevent_subscribe_event(shp, EC_DEV_REMOVE, subcl, 3) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_remove) failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (sysevent_subscribe_event(shp, EC_DEV_BRANCH, subcl, 1) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_branch) failed %d", errno));
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (sysevent_subscribe_event(shp, EC_PWRCTL, subcl, 6) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (sysevent_subscribe_event(shp, EC_DEVFS, subcl, 1) != 0) {
a9da3307db733eb1739ba859952610bba3d894abnp if (sysevent_subscribe_event(shp, EC_DR, subcl, 1) != 0) {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("subscribe(dynamic reconfiguration) failed %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char s[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((subclass = sysevent_get_subclass_name(ev)) == NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (nvlist_lookup_string(attr_list, DEVFS_PATHNAME, &phys_path) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_string(attr_list, PWRCTL_DEV_PHYS_PATH,
7b840e52d558c34b70cbcde044d8d79852d169d2phitran } else if (nvlist_lookup_string(attr_list, DEV_PHYS_PATH, &phys_path)
a9da3307db733eb1739ba859952610bba3d894abnp * In case of EC_DR, use dev_name to store DR_HINT val
a9da3307db733eb1739ba859952610bba3d894abnp if (nvlist_lookup_string(attr_list, DR_HINT, &dev_name) != 0) {
a9da3307db733eb1739ba859952610bba3d894abnp } else if (nvlist_lookup_string(attr_list, DEV_NAME, &dev_name) != 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_string(attr_list, PWRCTL_DEV_HID, &dev_hid) != 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_string(attr_list, PWRCTL_DEV_UID, &dev_uid) != 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_uint32(attr_list, PWRCTL_DEV_INDEX, &dev_index)
7b840e52d558c34b70cbcde044d8d79852d169d2phitran class, subclass, phys_path, dev_name, dev_hid, dev_uid, dev_index);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (g_io_channel_read_line (sysevent_iochannel, &s, &len, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len == 0) {
7b840e52d558c34b70cbcde044d8d79852d169d2phitran class[0] = subclass[0] = phys_path[0] = dev_name[0] =
7b840e52d558c34b70cbcde044d8d79852d169d2phitran matches = sscanf(s, "%s %s %s %s %s %s %d", class, subclass,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent: class=%s, sub=%s", class, subclass));
a9da3307db733eb1739ba859952610bba3d894abnp * Note: AP_ID is stored in phys_path and HINT is
a9da3307db733eb1739ba859952610bba3d894abnp * stored in dev_name, to avoid creating seperate
a9da3307db733eb1739ba859952610bba3d894abnp * variables and multiple conditions checking
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent = hal_util_find_closest_ancestor (devfs_path, &parent_devfs_path, &hotplug_devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("device not found in GDL %s", devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_udi = hal_device_property_get_string (d, "info.parent");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((parent_udi == NULL) || (strlen(parent_udi) == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("parent not found in GDL %s", parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((parent = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("parent not found in GDL %s", parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("device not found in devinfo %s", devfs_path));
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("device %s parent %s", hal_device_get_udi (d), parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_lofi_add_major (parent, node, devfs_path, NULL, TRUE, d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_lofi_remove(gchar *parent_devfs_path, gchar *name)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (p == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz *p = '\0';
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Look up the parent node in the gdl. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent = hal_device_store_match_key_value_string (hald_get_gdl (),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Look up the parent node in the tdl. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent = hal_device_store_match_key_value_string (hald_get_tdl (),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * Handle the USB bus devices hot plugging events.
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic void
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("device not found in devinfo %s", devfs_path));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* The disk and printer devices are handled by EC_DEV_ADD class. */
d2ec54f7875f7e05edd56195adbeb593c947763fphitransysevent_pwrctl(gchar *class, gchar *subclass, gchar *phys_path,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran gchar *dev_name, gchar *dev_hid, gchar *dev_uid, uint_t dev_index)
d2ec54f7875f7e05edd56195adbeb593c947763fphitran const gchar prefix[] = "/org/freedesktop/Hal/devices/pseudo/acpi_drv_0";
d2ec54f7875f7e05edd56195adbeb593c947763fphitran snprintf(udi, sizeof(udi), "%s_battery%d_0", prefix, dev_index);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran snprintf(udi, sizeof (udi), "%s_ac%d_0", prefix, dev_index);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if (strcmp(subclass, ESC_PWRCTL_POWER_BUTTON) == 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if ((strcmp(subclass, ESC_PWRCTL_BRIGHTNESS_UP) == 0) ||
d2ec54f7875f7e05edd56195adbeb593c947763fphitran (strcmp(subclass, ESC_PWRCTL_BRIGHTNESS_DOWN) == 0)) {
a9da3307db733eb1739ba859952610bba3d894abnpstatic void
a9da3307db733eb1739ba859952610bba3d894abnp * Find the CPU's that are DR removed. For each "processor" device in
a9da3307db733eb1739ba859952610bba3d894abnp * HAL device tree, check if it has its corresponding kstat_info. If
a9da3307db733eb1739ba859952610bba3d894abnp * not, then, that cpu has been removed and can remove the entry from
a9da3307db733eb1739ba859952610bba3d894abnp * HAL entry
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("Error in removing HAL cpu entry during DR. Could"
a9da3307db733eb1739ba859952610bba3d894abnp " not open kstat to get cpu info: %s", strerror (errno)));
a9da3307db733eb1739ba859952610bba3d894abnp * Iterate through the HAL device list to get the processor devices
a9da3307db733eb1739ba859952610bba3d894abnp cpu_id = hal_device_property_get_int (d, "processor.number");
a9da3307db733eb1739ba859952610bba3d894abnp * Check if the above cpu_id has its info in kstat
a9da3307db733eb1739ba859952610bba3d894abnp * kstat info not found. Delete the device entry
a9da3307db733eb1739ba859952610bba3d894abnp "solaris.devfs_path");
a9da3307db733eb1739ba859952610bba3d894abnp * Remove the cpu device
a9da3307db733eb1739ba859952610bba3d894abnp (void) di_prop_lookup_strings (DDI_DEV_T_ANY, node, "device_type",
a9da3307db733eb1739ba859952610bba3d894abnp * Remove/Add the DR event device
a9da3307db733eb1739ba859952610bba3d894abnp * Note: Currently it supports only CPU DR events
a9da3307db733eb1739ba859952610bba3d894abnpstatic void
a9da3307db733eb1739ba859952610bba3d894abnp cfgerr = config_list_ext (1, (char *const *)&ap_id, &cfg_stat, &nlist,
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("DR sysevent process %d config_list_ext error: %s",
a9da3307db733eb1739ba859952610bba3d894abnp * Check if the device type is CPU
a9da3307db733eb1739ba859952610bba3d894abnp HAL_DEBUG ((" Ap-Type: %s, State: %d", cfg_stat->ap_type,
a9da3307db733eb1739ba859952610bba3d894abnp * Go through the device list and add the new cpu
a9da3307db733eb1739ba859952610bba3d894abnp * entries into HAL
a9da3307db733eb1739ba859952610bba3d894abnp "Cannot insert CPU"));