diff --git a/src/netdev.c b/src/netdev.c index e31a5161..f23ca59e 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -5935,6 +5935,44 @@ static void netdev_dellink_notify(const struct ifinfomsg *ifi, int bytes) netdev_free(netdev); } +static void netdev_disable_ps_cb(struct l_genl_msg *msg, void *user_data) +{ + struct netdev *netdev = user_data; + int err = l_genl_msg_get_error(msg); + + netdev->power_save_cmd_id = 0; + + /* Can't do anything about it but inform the user */ + if (err < 0) + l_error("Failed to disable power save for ifindex %u (%s: %d)", + netdev->index, strerror(-err), err); + else + l_debug("Disabled power save for ifindex %u", netdev->index); + + WATCHLIST_NOTIFY(&netdev_watches, netdev_watch_func_t, + netdev, NETDEV_WATCH_EVENT_NEW); + netdev->events_ready = true; +} + +static bool netdev_disable_power_save(struct netdev *netdev) +{ + struct l_genl_msg *msg = l_genl_msg_new(NL80211_CMD_SET_POWER_SAVE); + uint32_t disabled = NL80211_PS_DISABLED; + + l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &netdev->index); + l_genl_msg_append_attr(msg, NL80211_ATTR_PS_STATE, 4, &disabled); + + netdev->power_save_cmd_id = l_genl_family_send(nl80211, msg, + netdev_disable_ps_cb, + netdev, NULL); + if (!netdev->power_save_cmd_id) { + l_error("Failed to send SET_POWER_SAVE (-EIO)"); + return false; + } + + return true; +} + static void netdev_initial_up_cb(int error, uint16_t type, const void *data, uint32_t len, void *user_data) { @@ -5967,6 +6005,12 @@ static void netdev_initial_up_cb(int error, uint16_t type, const void *data, scan_wdev_add(netdev->wdev_id); + if (wiphy_power_save_disabled(netdev->wiphy)) { + /* Wait to issue EVENT_NEW until power save is disabled */ + if (netdev_disable_power_save(netdev)) + return; + } + WATCHLIST_NOTIFY(&netdev_watches, netdev_watch_func_t, netdev, NETDEV_WATCH_EVENT_NEW); netdev->events_ready = true; @@ -6130,42 +6174,6 @@ static void netdev_get_link(struct netdev *netdev) l_free(rtmmsg); } -static void netdev_disable_ps_cb(struct l_genl_msg *msg, void *user_data) -{ - struct netdev *netdev = user_data; - int err = l_genl_msg_get_error(msg); - - netdev->power_save_cmd_id = 0; - - /* Can't do anything about it but inform the user */ - if (err < 0) - l_error("Failed to disable power save for ifindex %u (%s: %d)", - netdev->index, strerror(-err), err); - else - l_debug("Disabled power save for ifindex %u", netdev->index); - - netdev_get_link(netdev); -} - -static bool netdev_disable_power_save(struct netdev *netdev) -{ - struct l_genl_msg *msg = l_genl_msg_new(NL80211_CMD_SET_POWER_SAVE); - uint32_t disabled = NL80211_PS_DISABLED; - - l_genl_msg_append_attr(msg, NL80211_ATTR_IFINDEX, 4, &netdev->index); - l_genl_msg_append_attr(msg, NL80211_ATTR_PS_STATE, 4, &disabled); - - netdev->power_save_cmd_id = l_genl_family_send(nl80211, msg, - netdev_disable_ps_cb, - netdev, NULL); - if (!netdev->power_save_cmd_id) { - l_error("Failed to send SET_POWER_SAVE (-EIO)"); - return false; - } - - return true; -} - struct netdev *netdev_create_from_genl(struct l_genl_msg *msg, const uint8_t *set_mac) { @@ -6237,12 +6245,6 @@ struct netdev *netdev_create_from_genl(struct l_genl_msg *msg, netdev_setup_interface(netdev); - if (wiphy_power_save_disabled(wiphy)) { - /* Wait to issue GET_LINK until PS is disabled */ - if (netdev_disable_power_save(netdev)) - return netdev; - } - netdev_get_link(netdev); return netdev;