root/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. iwl_op_mode_stop
  2. iwl_op_mode_rx
  3. iwl_op_mode_rx_rss
  4. iwl_op_mode_async_cb
  5. iwl_op_mode_queue_full
  6. iwl_op_mode_queue_not_full
  7. iwl_op_mode_hw_rf_kill
  8. iwl_op_mode_free_skb
  9. iwl_op_mode_nic_error
  10. iwl_op_mode_cmd_queue_full
  11. iwl_op_mode_nic_config
  12. iwl_op_mode_wimax_active

   1 /******************************************************************************
   2  *
   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.
   5  *
   6  * GPL LICENSE SUMMARY
   7  *
   8  * Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
   9  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  10  * Copyright(c) 2015        Intel Deutschland GmbH
  11  * Copyright(c) 2018 - 2019 Intel Corporation
  12  *
  13  * This program is free software; you can redistribute it and/or modify
  14  * it under the terms of version 2 of the GNU General Public License as
  15  * published by the Free Software Foundation.
  16  *
  17  * This program is distributed in the hope that it will be useful, but
  18  * WITHOUT ANY WARRANTY; without even the implied warranty of
  19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20  * General Public License for more details.
  21  *
  22  * The full GNU General Public License is included in this distribution
  23  * in the file called COPYING.
  24  *
  25  * Contact Information:
  26  *  Intel Linux Wireless <linuxwifi@intel.com>
  27  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  28  *
  29  * BSD LICENSE
  30  *
  31  * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
  32  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
  33  * Copyright(c) 2015        Intel Deutschland GmbH
  34  * Copyright(c) 2018 - 2019 Intel Corporation
  35  * All rights reserved.
  36  *
  37  * Redistribution and use in source and binary forms, with or without
  38  * modification, are permitted provided that the following conditions
  39  * are met:
  40  *
  41  *  * Redistributions of source code must retain the above copyright
  42  *    notice, this list of conditions and the following disclaimer.
  43  *  * Redistributions in binary form must reproduce the above copyright
  44  *    notice, this list of conditions and the following disclaimer in
  45  *    the documentation and/or other materials provided with the
  46  *    distribution.
  47  *  * Neither the name Intel Corporation nor the names of its
  48  *    contributors may be used to endorse or promote products derived
  49  *    from this software without specific prior written permission.
  50  *
  51  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  52  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  53  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  54  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  55  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  56  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  57  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  58  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  59  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  60  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  61  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  62  *
  63  *****************************************************************************/
  64 #ifndef __iwl_op_mode_h__
  65 #define __iwl_op_mode_h__
  66 
  67 #include <linux/netdevice.h>
  68 #include <linux/debugfs.h>
  69 
  70 struct iwl_op_mode;
  71 struct iwl_trans;
  72 struct sk_buff;
  73 struct iwl_device_cmd;
  74 struct iwl_rx_cmd_buffer;
  75 struct iwl_fw;
  76 struct iwl_cfg;
  77 
  78 /**
  79  * DOC: Operational mode - what is it ?
  80  *
  81  * The operational mode (a.k.a. op_mode) is the layer that implements
  82  * mac80211's handlers. It knows two APIs: mac80211's and the fw's. It uses
  83  * the transport API to access the HW. The op_mode doesn't need to know how the
  84  * underlying HW works, since the transport layer takes care of that.
  85  *
  86  * There can be several op_mode: i.e. different fw APIs will require two
  87  * different op_modes. This is why the op_mode is virtualized.
  88  */
  89 
  90 /**
  91  * DOC: Life cycle of the Operational mode
  92  *
  93  * The operational mode has a very simple life cycle.
  94  *
  95  *      1) The driver layer (iwl-drv.c) chooses the op_mode based on the
  96  *         capabilities advertised by the fw file (in TLV format).
  97  *      2) The driver layer starts the op_mode (ops->start)
  98  *      3) The op_mode registers mac80211
  99  *      4) The op_mode is governed by mac80211
 100  *      5) The driver layer stops the op_mode
 101  */
 102 
 103 /**
 104  * struct iwl_op_mode_ops - op_mode specific operations
 105  *
 106  * The op_mode exports its ops so that external components can start it and
 107  * interact with it. The driver layer typically calls the start and stop
 108  * handlers, the transport layer calls the others.
 109  *
 110  * All the handlers MUST be implemented, except @rx_rss which can be left
 111  * out *iff* the opmode will never run on hardware with multi-queue capability.
 112  *
 113  * @start: start the op_mode. The transport layer is already allocated.
 114  *      May sleep
 115  * @stop: stop the op_mode. Must free all the memory allocated.
 116  *      May sleep
 117  * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
 118  *      HCMD this Rx responds to. Can't sleep.
 119  * @rx_rss: data queue RX notification to the op_mode, for (data) notifications
 120  *      received on the RSS queue(s). The queue parameter indicates which of the
 121  *      RSS queues received this frame; it will always be non-zero.
 122  *      This method must not sleep.
 123  * @async_cb: called when an ASYNC command with CMD_WANT_ASYNC_CALLBACK set
 124  *      completes. Must be atomic.
 125  * @queue_full: notifies that a HW queue is full.
 126  *      Must be atomic and called with BH disabled.
 127  * @queue_not_full: notifies that a HW queue is not full any more.
 128  *      Must be atomic and called with BH disabled.
 129  * @hw_rf_kill:notifies of a change in the HW rf kill switch. True means that
 130  *      the radio is killed. Return %true if the device should be stopped by
 131  *      the transport immediately after the call. May sleep.
 132  * @free_skb: allows the transport layer to free skbs that haven't been
 133  *      reclaimed by the op_mode. This can happen when the driver is freed and
 134  *      there are Tx packets pending in the transport layer.
 135  *      Must be atomic
 136  * @nic_error: error notification. Must be atomic and must be called with BH
 137  *      disabled.
 138  * @cmd_queue_full: Called when the command queue gets full. Must be atomic and
 139  *      called with BH disabled.
 140  * @nic_config: configure NIC, called before firmware is started.
 141  *      May sleep
 142  * @wimax_active: invoked when WiMax becomes active. May sleep
 143  */
 144 struct iwl_op_mode_ops {
 145         struct iwl_op_mode *(*start)(struct iwl_trans *trans,
 146                                      const struct iwl_cfg *cfg,
 147                                      const struct iwl_fw *fw,
 148                                      struct dentry *dbgfs_dir);
 149         void (*stop)(struct iwl_op_mode *op_mode);
 150         void (*rx)(struct iwl_op_mode *op_mode, struct napi_struct *napi,
 151                    struct iwl_rx_cmd_buffer *rxb);
 152         void (*rx_rss)(struct iwl_op_mode *op_mode, struct napi_struct *napi,
 153                        struct iwl_rx_cmd_buffer *rxb, unsigned int queue);
 154         void (*async_cb)(struct iwl_op_mode *op_mode,
 155                          const struct iwl_device_cmd *cmd);
 156         void (*queue_full)(struct iwl_op_mode *op_mode, int queue);
 157         void (*queue_not_full)(struct iwl_op_mode *op_mode, int queue);
 158         bool (*hw_rf_kill)(struct iwl_op_mode *op_mode, bool state);
 159         void (*free_skb)(struct iwl_op_mode *op_mode, struct sk_buff *skb);
 160         void (*nic_error)(struct iwl_op_mode *op_mode);
 161         void (*cmd_queue_full)(struct iwl_op_mode *op_mode);
 162         void (*nic_config)(struct iwl_op_mode *op_mode);
 163         void (*wimax_active)(struct iwl_op_mode *op_mode);
 164 };
 165 
 166 int iwl_opmode_register(const char *name, const struct iwl_op_mode_ops *ops);
 167 void iwl_opmode_deregister(const char *name);
 168 
 169 /**
 170  * struct iwl_op_mode - operational mode
 171  * @ops: pointer to its own ops
 172  *
 173  * This holds an implementation of the mac80211 / fw API.
 174  */
 175 struct iwl_op_mode {
 176         const struct iwl_op_mode_ops *ops;
 177 
 178         char op_mode_specific[0] __aligned(sizeof(void *));
 179 };
 180 
 181 static inline void iwl_op_mode_stop(struct iwl_op_mode *op_mode)
 182 {
 183         might_sleep();
 184         op_mode->ops->stop(op_mode);
 185 }
 186 
 187 static inline void iwl_op_mode_rx(struct iwl_op_mode *op_mode,
 188                                   struct napi_struct *napi,
 189                                   struct iwl_rx_cmd_buffer *rxb)
 190 {
 191         return op_mode->ops->rx(op_mode, napi, rxb);
 192 }
 193 
 194 static inline void iwl_op_mode_rx_rss(struct iwl_op_mode *op_mode,
 195                                       struct napi_struct *napi,
 196                                       struct iwl_rx_cmd_buffer *rxb,
 197                                       unsigned int queue)
 198 {
 199         op_mode->ops->rx_rss(op_mode, napi, rxb, queue);
 200 }
 201 
 202 static inline void iwl_op_mode_async_cb(struct iwl_op_mode *op_mode,
 203                                         const struct iwl_device_cmd *cmd)
 204 {
 205         if (op_mode->ops->async_cb)
 206                 op_mode->ops->async_cb(op_mode, cmd);
 207 }
 208 
 209 static inline void iwl_op_mode_queue_full(struct iwl_op_mode *op_mode,
 210                                           int queue)
 211 {
 212         op_mode->ops->queue_full(op_mode, queue);
 213 }
 214 
 215 static inline void iwl_op_mode_queue_not_full(struct iwl_op_mode *op_mode,
 216                                               int queue)
 217 {
 218         op_mode->ops->queue_not_full(op_mode, queue);
 219 }
 220 
 221 static inline bool __must_check
 222 iwl_op_mode_hw_rf_kill(struct iwl_op_mode *op_mode, bool state)
 223 {
 224         might_sleep();
 225         return op_mode->ops->hw_rf_kill(op_mode, state);
 226 }
 227 
 228 static inline void iwl_op_mode_free_skb(struct iwl_op_mode *op_mode,
 229                                         struct sk_buff *skb)
 230 {
 231         op_mode->ops->free_skb(op_mode, skb);
 232 }
 233 
 234 static inline void iwl_op_mode_nic_error(struct iwl_op_mode *op_mode)
 235 {
 236         op_mode->ops->nic_error(op_mode);
 237 }
 238 
 239 static inline void iwl_op_mode_cmd_queue_full(struct iwl_op_mode *op_mode)
 240 {
 241         op_mode->ops->cmd_queue_full(op_mode);
 242 }
 243 
 244 static inline void iwl_op_mode_nic_config(struct iwl_op_mode *op_mode)
 245 {
 246         might_sleep();
 247         op_mode->ops->nic_config(op_mode);
 248 }
 249 
 250 static inline void iwl_op_mode_wimax_active(struct iwl_op_mode *op_mode)
 251 {
 252         might_sleep();
 253         op_mode->ops->wimax_active(op_mode);
 254 }
 255 
 256 #endif /* __iwl_op_mode_h__ */

/* [<][>][^][v][top][bottom][index][help] */