Commit 53476fe1 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Wey-Yi Guy

iwlwifi: document the operational mode

Also add a might_sleep to enforce the context requirements.
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
parent 4d660ce5
...@@ -69,17 +69,47 @@ struct sk_buff; ...@@ -69,17 +69,47 @@ struct sk_buff;
struct iwl_device_cmd; struct iwl_device_cmd;
struct iwl_rx_mem_buffer; struct iwl_rx_mem_buffer;
/**
* DOC: Operational mode - what is it ?
*
* The operational mode (a.k.a. op_mode) is the layer that implements
* mac80211's handlers. It knows two APIs: mac80211's and the fw's. It uses
* the transport API to access the HW. The op_mode doesn't need to know how the
* underlying HW works, since the transport layer takes care of that.
*
* There can be several op_mode: i.e. different fw APIs will require two
* different op_modes. This is why the op_mode is virtualized.
*/
/**
* DOC: Life cycle of the Operational mode
*
* The operational mode has a very simple life cycle.
*
* 1) The driver layer (iwl-drv.c) chooses the op_mode based on the
* capabilities advertized by the fw file (in TLV format).
* 2) The driver layer starts the op_mode (ops->start)
* 3) The op_mode registers registers mac80211
* 4) The op_mode is governed by mac80211
* 5) The driver layer stops the op_mode
*/
/** /**
* struct iwl_op_mode_ops - op_mode specific operations * struct iwl_op_mode_ops - op_mode specific operations
* *
* The op_mode exports its ops so that external components can start it and
* interact with it. The driver layer typically calls the start and stop
* handlers, the transport layer calls the others.
*
* All the handlers MUST be implemented * All the handlers MUST be implemented
* *
* @start: start the op_mode * @start: start the op_mode. The transport layer is already allocated.
* May sleep * May sleep
* @stop: stop the op_mode * @stop: stop the op_mode. Must free all the memory allocated.
* May sleep * May sleep
* @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
* HCMD the this Rx responds to. * HCMD the this Rx responds to.
* Must be atomic.
* @queue_full: notifies that a HW queue is full. Ac is the ac of the queue * @queue_full: notifies that a HW queue is full. Ac is the ac of the queue
* Must be atomic * Must be atomic
* @queue_not_full: notifies that a HW queue is not full any more. * @queue_not_full: notifies that a HW queue is not full any more.
...@@ -120,6 +150,8 @@ struct iwl_op_mode { ...@@ -120,6 +150,8 @@ struct iwl_op_mode {
static inline void iwl_op_mode_stop(struct iwl_op_mode *op_mode) static inline void iwl_op_mode_stop(struct iwl_op_mode *op_mode)
{ {
might_sleep();
op_mode->ops->stop(op_mode); op_mode->ops->stop(op_mode);
} }
......
...@@ -106,12 +106,6 @@ ...@@ -106,12 +106,6 @@
* 6) Eventually, the free function will be called. * 6) Eventually, the free function will be called.
*/ */
/**
* DOC: API needed by the transport layer from the op_mode
*
* TODO
*/
struct iwl_priv; struct iwl_priv;
struct iwl_shared; struct iwl_shared;
struct iwl_op_mode; struct iwl_op_mode;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment