1
/******************************************************************************
3
* This file is provided under a dual BSD/GPLv2 license. When using or
4
* redistributing this file, you may do so under either license.
8
* Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved.
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of version 2 of the GNU General Public License as
12
* published by the Free Software Foundation.
14
* This program is distributed in the hope that it will be useful, but
15
* WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
24
* The full GNU General Public License is included in this distribution
25
* in the file called COPYING.
27
* Contact Information:
28
* Intel Linux Wireless <ilw@linux.intel.com>
29
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
33
* Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved.
34
* All rights reserved.
36
* Redistribution and use in source and binary forms, with or without
37
* modification, are permitted provided that the following conditions
40
* * Redistributions of source code must retain the above copyright
41
* notice, this list of conditions and the following disclaimer.
42
* * Redistributions in binary form must reproduce the above copyright
43
* notice, this list of conditions and the following disclaimer in
45
* * Neither the name Intel Corporation nor the names of its
46
* contributors may be used to endorse or promote products derived
47
* from this software without specific prior written permission.
49
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
50
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
51
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
52
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
53
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
54
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
55
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
56
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
57
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
59
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61
*****************************************************************************/
62
#ifndef __iwl_notif_wait_h__
63
#define __iwl_notif_wait_h__
65
#include <linux/wait.h>
67
#include "iwl-trans.h"
69
struct iwl_notif_wait_data {
70
struct list_head notif_waits;
71
spinlock_t notif_wait_lock;
72
wait_queue_head_t notif_waitq;
75
#define MAX_NOTIF_CMDS 5
78
* struct iwl_notification_wait - notification wait entry
79
* @list: list head for global list
80
* @fn: Function called with the notification. If the function
81
* returns true, the wait is over, if it returns false then
82
* the waiter stays blocked. If no function is given, any
83
* of the listed commands will unblock the waiter.
85
* @n_cmds: number of command IDs
86
* @triggered: waiter should be woken up
87
* @aborted: wait was aborted
89
* This structure is not used directly, to wait for a
90
* notification declare it on the stack, and call
91
* iwlagn_init_notification_wait() with appropriate
92
* parameters. Then do whatever will cause the ucode
93
* to notify the driver, and to wait for that then
94
* call iwlagn_wait_notification().
96
* Each notification is one-shot. If at some point we
97
* need to support multi-shot notifications (which
98
* can't be allocated on the stack) we need to modify
101
struct iwl_notification_wait {
102
struct list_head list;
104
bool (*fn)(struct iwl_notif_wait_data *notif_data,
105
struct iwl_rx_packet *pkt, void *data);
108
u8 cmds[MAX_NOTIF_CMDS];
110
bool triggered, aborted;
114
/* caller functions */
115
void iwl_notification_wait_init(struct iwl_notif_wait_data *notif_data);
116
void iwl_notification_wait_notify(struct iwl_notif_wait_data *notif_data,
117
struct iwl_rx_packet *pkt);
118
void iwl_abort_notification_waits(struct iwl_notif_wait_data *notif_data);
121
void __acquires(wait_entry)
122
iwl_init_notification_wait(struct iwl_notif_wait_data *notif_data,
123
struct iwl_notification_wait *wait_entry,
124
const u8 *cmds, int n_cmds,
125
bool (*fn)(struct iwl_notif_wait_data *notif_data,
126
struct iwl_rx_packet *pkt, void *data),
129
int __must_check __releases(wait_entry)
130
iwl_wait_notification(struct iwl_notif_wait_data *notif_data,
131
struct iwl_notification_wait *wait_entry,
132
unsigned long timeout);
134
void __releases(wait_entry)
135
iwl_remove_notification(struct iwl_notif_wait_data *notif_data,
136
struct iwl_notification_wait *wait_entry);
138
#endif /* __iwl_notif_wait_h__ */