These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / iwlwifi / iwl-op-mode.h
index ce1cdd7..2a58d68 100644 (file)
@@ -7,6 +7,7 @@
  *
  * Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
+ * Copyright(c) 2015        Intel Deutschland GmbH
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -33,6 +34,7 @@
  *
  * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
+ * Copyright(c) 2015        Intel Deutschland GmbH
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -108,7 +110,8 @@ struct iwl_cfg;
  * 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, except @rx_rss which can be left
+ * out *iff* the opmode will never run on hardware with multi-queue capability.
  *
  * @start: start the op_mode. The transport layer is already allocated.
  *     May sleep
@@ -116,10 +119,10 @@ struct iwl_cfg;
  *     May sleep
  * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
  *     HCMD this Rx responds to. Can't sleep.
- * @napi_add: NAPI initialization. The transport is fully responsible for NAPI,
- *     but the higher layers need to know about it (in particular mac80211 to
- *     to able to call the right NAPI RX functions); this function is needed
- *     to eventually call netif_napi_add() with higher layer involvement.
+ * @rx_rss: data queue RX notification to the op_mode, for (data) notifications
+ *     received on the RSS queue(s). The queue parameter indicates which of the
+ *     RSS queues received this frame; it will always be non-zero.
+ *     This method must not sleep.
  * @queue_full: notifies that a HW queue is full.
  *     Must be atomic and called with BH disabled.
  * @queue_not_full: notifies that a HW queue is not full any more.
@@ -148,13 +151,10 @@ struct iwl_op_mode_ops {
                                     const struct iwl_fw *fw,
                                     struct dentry *dbgfs_dir);
        void (*stop)(struct iwl_op_mode *op_mode);
-       int (*rx)(struct iwl_op_mode *op_mode, struct iwl_rx_cmd_buffer *rxb,
-                 struct iwl_device_cmd *cmd);
-       void (*napi_add)(struct iwl_op_mode *op_mode,
-                        struct napi_struct *napi,
-                        struct net_device *napi_dev,
-                        int (*poll)(struct napi_struct *, int),
-                        int weight);
+       void (*rx)(struct iwl_op_mode *op_mode, struct napi_struct *napi,
+                  struct iwl_rx_cmd_buffer *rxb);
+       void (*rx_rss)(struct iwl_op_mode *op_mode, struct napi_struct *napi,
+                      struct iwl_rx_cmd_buffer *rxb, unsigned int queue);
        void (*queue_full)(struct iwl_op_mode *op_mode, int queue);
        void (*queue_not_full)(struct iwl_op_mode *op_mode, int queue);
        bool (*hw_rf_kill)(struct iwl_op_mode *op_mode, bool state);
@@ -188,11 +188,19 @@ static inline void iwl_op_mode_stop(struct iwl_op_mode *op_mode)
        op_mode->ops->stop(op_mode);
 }
 
-static inline int iwl_op_mode_rx(struct iwl_op_mode *op_mode,
-                                 struct iwl_rx_cmd_buffer *rxb,
-                                 struct iwl_device_cmd *cmd)
+static inline void iwl_op_mode_rx(struct iwl_op_mode *op_mode,
+                                 struct napi_struct *napi,
+                                 struct iwl_rx_cmd_buffer *rxb)
 {
-       return op_mode->ops->rx(op_mode, rxb, cmd);
+       return op_mode->ops->rx(op_mode, napi, rxb);
+}
+
+static inline void iwl_op_mode_rx_rss(struct iwl_op_mode *op_mode,
+                                     struct napi_struct *napi,
+                                     struct iwl_rx_cmd_buffer *rxb,
+                                     unsigned int queue)
+{
+       op_mode->ops->rx_rss(op_mode, napi, rxb, queue);
 }
 
 static inline void iwl_op_mode_queue_full(struct iwl_op_mode *op_mode,
@@ -260,15 +268,4 @@ static inline int iwl_op_mode_exit_d0i3(struct iwl_op_mode *op_mode)
        return op_mode->ops->exit_d0i3(op_mode);
 }
 
-static inline void iwl_op_mode_napi_add(struct iwl_op_mode *op_mode,
-                                       struct napi_struct *napi,
-                                       struct net_device *napi_dev,
-                                       int (*poll)(struct napi_struct *, int),
-                                       int weight)
-{
-       if (!op_mode->ops->napi_add)
-               return;
-       op_mode->ops->napi_add(op_mode, napi, napi_dev, poll, weight);
-}
-
 #endif /* __iwl_op_mode_h__ */