Example #1
0
/**
 ** Handler for USB suspend state. Switch to poewr save mode.
 ** XXX interrupt handler for INT0
 **/
void d12_suspend_handler(void) {
  cli();
  if (!(d12_flags & D12_FLAG_SUSPEND))
    goto end;
  
  if (!d12_is_suspend())
    goto end;
  sei();
  _delay_ms(1);
  if (!d12_is_suspend())
    goto end;

  set_power_save();
  sleep_cpu();

  cli();

 end:
  sei();
  return;
}
Example #2
0
static int __handle_cmd(struct nl80211_state *state, const char *iface, int get)
{
    struct nl_cb *cb;
    struct nl_msg *msg;
    int devidx = 0;
    int err;

    devidx = if_nametoindex(iface);
    if (devidx == 0)
        devidx = -1;
    if (devidx < 0)
        return -errno;

    msg = nlmsg_alloc();
    if (!msg) {
        fprintf(stderr, "failed to allocate netlink message\n");
        return 2;
    }

    cb = nl_cb_alloc(NL_CB_DEFAULT);
    if (!cb) {
        fprintf(stderr, "failed to allocate netlink callbacks\n");
        err = 2;
        goto out_free_msg;
    }

    if (get)
        genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
                    0, NL80211_CMD_GET_POWER_SAVE, 0);
    else
        genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
                    0, NL80211_CMD_SET_POWER_SAVE, 0);


    NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx);

    if (get)
        err = get_power_save(state, cb, msg);
    else
        err = set_power_save(state, cb, msg);

    if (err)
        goto out;

    err = nl_send_auto_complete(state->nl_sock, msg);
    if (err < 0)
        goto out;

    err = 1;

    nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
    nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
    nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);

    while (err > 0)
        nl_recvmsgs(state->nl_sock, cb);
out:
    nl_cb_put(cb);
out_free_msg:
    nlmsg_free(msg);
    return err;
nla_put_failure:
    fprintf(stderr, "building message failed\n");
    return 2;
}