P2P: Set p2p_scan_running based on driver scan request result
With the radio work interface, the actual request to start p2p_scan operation is scheduled from a radio work and hence the initial return value cannot provide the real result of the driver operation to trigger a scan. Introduce a new notification API to indicate the scan trigger status based on which the p2p_scan_running instance can be set using the real return value from the driver operation. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
43d8592718
commit
b951a97454
3 changed files with 28 additions and 15 deletions
|
@ -978,14 +978,8 @@ static void p2p_search(struct p2p_data *p2p)
|
|||
p2p->num_req_dev_types, p2p->req_dev_types,
|
||||
p2p->find_dev_id, pw_id);
|
||||
if (res < 0) {
|
||||
p2p_dbg(p2p, "Scan request failed");
|
||||
p2p_dbg(p2p, "Scan request schedule failed");
|
||||
p2p_continue_find(p2p);
|
||||
} else {
|
||||
p2p_dbg(p2p, "Running p2p_scan");
|
||||
p2p->p2p_scan_running = 1;
|
||||
eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
|
||||
eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
|
||||
p2p, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -998,6 +992,22 @@ static void p2p_find_timeout(void *eloop_ctx, void *timeout_ctx)
|
|||
}
|
||||
|
||||
|
||||
void p2p_notify_scan_trigger_status(struct p2p_data *p2p, int status)
|
||||
{
|
||||
if (status != 0) {
|
||||
p2p_dbg(p2p, "Scan request failed");
|
||||
/* Do continue find even for the first p2p_find_scan */
|
||||
p2p_continue_find(p2p);
|
||||
} else {
|
||||
p2p_dbg(p2p, "Running p2p_scan");
|
||||
p2p->p2p_scan_running = 1;
|
||||
eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
|
||||
eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
|
||||
p2p, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int p2p_run_after_scan(struct p2p_data *p2p)
|
||||
{
|
||||
struct p2p_device *dev;
|
||||
|
@ -1128,17 +1138,11 @@ int p2p_find(struct p2p_data *p2p, unsigned int timeout,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (res == 0) {
|
||||
p2p_dbg(p2p, "Running p2p_scan");
|
||||
p2p->p2p_scan_running = 1;
|
||||
eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
|
||||
eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
|
||||
p2p, NULL);
|
||||
} else if (p2p->p2p_scan_running) {
|
||||
if (res != 0 && p2p->p2p_scan_running) {
|
||||
p2p_dbg(p2p, "Failed to start p2p_scan - another p2p_scan was already running");
|
||||
/* wait for the previous p2p_scan to complete */
|
||||
res = 0; /* do not report failure */
|
||||
} else {
|
||||
} else if (res != 0) {
|
||||
p2p_dbg(p2p, "Failed to start p2p_scan");
|
||||
p2p_set_state(p2p, P2P_IDLE);
|
||||
eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
|
||||
|
|
|
@ -948,6 +948,13 @@ int p2p_find(struct p2p_data *p2p, unsigned int timeout,
|
|||
unsigned int num_req_dev_types, const u8 *req_dev_types,
|
||||
const u8 *dev_id, unsigned int search_delay);
|
||||
|
||||
/**
|
||||
* p2p_notify_scan_trigger_status - Indicate scan trigger status
|
||||
* @p2p: P2P module context from p2p_init()
|
||||
* @status: 0 on success, -1 on failure
|
||||
*/
|
||||
void p2p_notify_scan_trigger_status(struct p2p_data *p2p, int status);
|
||||
|
||||
/**
|
||||
* p2p_stop_find - Stop P2P Find (Device Discovery)
|
||||
* @p2p: P2P module context from p2p_init()
|
||||
|
|
|
@ -269,9 +269,11 @@ static void wpas_p2p_trigger_scan_cb(struct wpa_radio_work *work, int deinit)
|
|||
work->ctx = NULL;
|
||||
if (ret) {
|
||||
radio_work_done(work);
|
||||
p2p_notify_scan_trigger_status(wpa_s->global->p2p, ret);
|
||||
return;
|
||||
}
|
||||
|
||||
p2p_notify_scan_trigger_status(wpa_s->global->p2p, ret);
|
||||
os_get_reltime(&wpa_s->scan_trigger_time);
|
||||
wpa_s->scan_res_handler = wpas_p2p_scan_res_handler;
|
||||
wpa_s->own_scan_requested = 1;
|
||||
|
|
Loading…
Reference in a new issue