aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2011-06-14 03:13:24 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-07-01 10:57:34 -0400
commitc85eb6196958ae54eba3ff0660d2b5af3d58521a (patch)
tree9b4e0e85127ff1481f0ebd0614edf48a90816a4c /drivers/net/wireless
parent300d0834ebd3f3c57b0063c2fd6bc26d8405626c (diff)
iwlagn: introduce transport layer and implement rx_init
The transport layer is responsible for all the queues, DMA rings etc... This is the beginning of the separation of all the code that is tighly related to HW design to the aforementioned transport layer. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/iwlwifi/Makefile1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c41
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h16
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-pci.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rx.c40
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.c155
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h64
10 files changed, 241 insertions, 83 deletions
diff --git a/drivers/net/wireless/iwlwifi/Makefile b/drivers/net/wireless/iwlwifi/Makefile
index 9a56ce546715..19150398a248 100644
--- a/drivers/net/wireless/iwlwifi/Makefile
+++ b/drivers/net/wireless/iwlwifi/Makefile
@@ -14,6 +14,7 @@ iwlagn-objs += iwl-6000.o
14iwlagn-objs += iwl-1000.o 14iwlagn-objs += iwl-1000.o
15iwlagn-objs += iwl-2000.o 15iwlagn-objs += iwl-2000.o
16iwlagn-objs += iwl-pci.o 16iwlagn-objs += iwl-pci.o
17iwlagn-objs += iwl-trans.o
17 18
18iwlagn-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-debugfs.o 19iwlagn-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-debugfs.o
19iwlagn-$(CONFIG_IWLWIFI_DEVICE_TRACING) += iwl-devtrace.o 20iwlagn-$(CONFIG_IWLWIFI_DEVICE_TRACING) += iwl-devtrace.o
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index efdab6506ae7..3d971142786e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -628,38 +628,6 @@ struct iwl_mod_params iwlagn_mod_params = {
628 /* the rest are 0 by default */ 628 /* the rest are 0 by default */
629}; 629};
630 630
631void iwlagn_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
632{
633 unsigned long flags;
634 int i;
635 spin_lock_irqsave(&rxq->lock, flags);
636 INIT_LIST_HEAD(&rxq->rx_free);
637 INIT_LIST_HEAD(&rxq->rx_used);
638 /* Fill the rx_used queue with _all_ of the Rx buffers */
639 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) {
640 /* In the reset function, these buffers may have been allocated
641 * to an SKB, so we need to unmap and free potential storage */
642 if (rxq->pool[i].page != NULL) {
643 dma_unmap_page(priv->bus.dev, rxq->pool[i].page_dma,
644 PAGE_SIZE << priv->hw_params.rx_page_order,
645 DMA_FROM_DEVICE);
646 __iwl_free_pages(priv, rxq->pool[i].page);
647 rxq->pool[i].page = NULL;
648 }
649 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
650 }
651
652 for (i = 0; i < RX_QUEUE_SIZE; i++)
653 rxq->queue[i] = NULL;
654
655 /* Set us so that we have processed and used all buffers, but have
656 * not restocked the Rx queue with fresh buffers */
657 rxq->read = rxq->write = 0;
658 rxq->write_actual = 0;
659 rxq->free_count = 0;
660 spin_unlock_irqrestore(&rxq->lock, flags);
661}
662
663int iwlagn_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq) 631int iwlagn_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
664{ 632{
665 u32 rb_size; 633 u32 rb_size;
@@ -747,14 +715,7 @@ int iwlagn_hw_nic_init(struct iwl_priv *priv)
747 priv->cfg->ops->lib->apm_ops.config(priv); 715 priv->cfg->ops->lib->apm_ops.config(priv);
748 716
749 /* Allocate the RX queue, or reset if it is already allocated */ 717 /* Allocate the RX queue, or reset if it is already allocated */
750 if (!rxq->bd) { 718 priv->trans.ops->rx_init(priv);
751 ret = iwl_rx_queue_alloc(priv);
752 if (ret) {
753 IWL_ERR(priv, "Unable to initialize Rx queue\n");
754 return -ENOMEM;
755 }
756 } else
757 iwlagn_rx_queue_reset(priv, rxq);
758 719
759 iwlagn_rx_replenish(priv); 720 iwlagn_rx_replenish(priv);
760 721
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 58789e876d7a..b06571871580 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -56,7 +56,7 @@
56#include "iwl-agn-calib.h" 56#include "iwl-agn-calib.h"
57#include "iwl-agn.h" 57#include "iwl-agn.h"
58#include "iwl-pci.h" 58#include "iwl-pci.h"
59 59#include "iwl-trans.h"
60 60
61/****************************************************************************** 61/******************************************************************************
62 * 62 *
@@ -3517,6 +3517,8 @@ int iwl_probe(void *bus_specific, struct iwl_bus_ops *bus_ops,
3517 priv->bus.ops->set_drv_data(&priv->bus, priv); 3517 priv->bus.ops->set_drv_data(&priv->bus, priv);
3518 priv->bus.dev = priv->bus.ops->get_dev(&priv->bus); 3518 priv->bus.dev = priv->bus.ops->get_dev(&priv->bus);
3519 3519
3520 iwl_trans_register(&priv->trans);
3521
3520 /* At this point both hw and priv are allocated. */ 3522 /* At this point both hw and priv are allocated. */
3521 3523
3522 SET_IEEE80211_DEV(hw, priv->bus.dev); 3524 SET_IEEE80211_DEV(hw, priv->bus.dev);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
index dcdf2259520f..7273297a6f40 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
@@ -182,7 +182,6 @@ void iwlagn_temperature(struct iwl_priv *priv);
182u16 iwlagn_eeprom_calib_version(struct iwl_priv *priv); 182u16 iwlagn_eeprom_calib_version(struct iwl_priv *priv);
183const u8 *iwlagn_eeprom_query_addr(const struct iwl_priv *priv, 183const u8 *iwlagn_eeprom_query_addr(const struct iwl_priv *priv,
184 size_t offset); 184 size_t offset);
185void iwlagn_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq);
186int iwlagn_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq); 185int iwlagn_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq);
187int iwlagn_hw_nic_init(struct iwl_priv *priv); 186int iwlagn_hw_nic_init(struct iwl_priv *priv);
188int iwlagn_wait_tx_queue_empty(struct iwl_priv *priv); 187int iwlagn_wait_tx_queue_empty(struct iwl_priv *priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index a311cf836ef1..13d819b94ea5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -383,7 +383,6 @@ static inline void iwl_update_stats(struct iwl_priv *priv, bool is_tx,
383******************************************************/ 383******************************************************/
384void iwl_cmd_queue_free(struct iwl_priv *priv); 384void iwl_cmd_queue_free(struct iwl_priv *priv);
385void iwl_cmd_queue_unmap(struct iwl_priv *priv); 385void iwl_cmd_queue_unmap(struct iwl_priv *priv);
386int iwl_rx_queue_alloc(struct iwl_priv *priv);
387void iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, 386void iwl_rx_queue_update_write_ptr(struct iwl_priv *priv,
388 struct iwl_rx_queue *q); 387 struct iwl_rx_queue *q);
389int iwl_rx_queue_space(const struct iwl_rx_queue *q); 388int iwl_rx_queue_space(const struct iwl_rx_queue *q);
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index ae2ecc24b91e..7d3e55d0bc62 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1227,6 +1227,21 @@ struct iwl_bus {
1227 unsigned int irq; 1227 unsigned int irq;
1228}; 1228};
1229 1229
1230struct iwl_trans;
1231
1232/**
1233 * struct iwl_trans_ops - transport specific operations
1234
1235 * @rx_init: inits the rx memory, allocate it if needed
1236 */
1237struct iwl_trans_ops {
1238 int (*rx_init)(struct iwl_priv *priv);
1239};
1240
1241struct iwl_trans {
1242 const struct iwl_trans_ops *ops;
1243};
1244
1230struct iwl_priv { 1245struct iwl_priv {
1231 1246
1232 /* ieee device used by generic ieee processing code */ 1247 /* ieee device used by generic ieee processing code */
@@ -1295,6 +1310,7 @@ struct iwl_priv {
1295 struct mutex mutex; 1310 struct mutex mutex;
1296 1311
1297 struct iwl_bus bus; /* bus specific data */ 1312 struct iwl_bus bus; /* bus specific data */
1313 struct iwl_trans trans;
1298 1314
1299 /* microcode/device supports multiple contexts */ 1315 /* microcode/device supports multiple contexts */
1300 u8 valid_contexts; 1316 u8 valid_contexts;
diff --git a/drivers/net/wireless/iwlwifi/iwl-pci.c b/drivers/net/wireless/iwlwifi/iwl-pci.c
index 3b5844b60e7c..2c26b42bd158 100644
--- a/drivers/net/wireless/iwlwifi/iwl-pci.c
+++ b/drivers/net/wireless/iwlwifi/iwl-pci.c
@@ -67,6 +67,7 @@
67#include "iwl-agn.h" 67#include "iwl-agn.h"
68#include "iwl-core.h" 68#include "iwl-core.h"
69#include "iwl-io.h" 69#include "iwl-io.h"
70#include "iwl-trans.h"
70 71
71/* PCI registers */ 72/* PCI registers */
72#define PCI_CFG_RETRY_TIMEOUT 0x041 73#define PCI_CFG_RETRY_TIMEOUT 0x041
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
index 3efa7066e987..065d2c02655f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
@@ -179,46 +179,6 @@ void iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, struct iwl_rx_queue *q
179 spin_unlock_irqrestore(&q->lock, flags); 179 spin_unlock_irqrestore(&q->lock, flags);
180} 180}
181 181
182int iwl_rx_queue_alloc(struct iwl_priv *priv)
183{
184 struct iwl_rx_queue *rxq = &priv->rxq;
185 struct device *dev = priv->bus.dev;
186 int i;
187
188 spin_lock_init(&rxq->lock);
189 INIT_LIST_HEAD(&rxq->rx_free);
190 INIT_LIST_HEAD(&rxq->rx_used);
191
192 /* Alloc the circular buffer of Read Buffer Descriptors (RBDs) */
193 rxq->bd = dma_alloc_coherent(dev, 4 * RX_QUEUE_SIZE, &rxq->bd_dma,
194 GFP_KERNEL);
195 if (!rxq->bd)
196 goto err_bd;
197
198 rxq->rb_stts = dma_alloc_coherent(dev, sizeof(struct iwl_rb_status),
199 &rxq->rb_stts_dma, GFP_KERNEL);
200 if (!rxq->rb_stts)
201 goto err_rb;
202
203 /* Fill the rx_used queue with _all_ of the Rx buffers */
204 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++)
205 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
206
207 /* Set us so that we have processed and used all buffers, but have
208 * not restocked the Rx queue with fresh buffers */
209 rxq->read = rxq->write = 0;
210 rxq->write_actual = 0;
211 rxq->free_count = 0;
212 rxq->need_update = 0;
213 return 0;
214
215err_rb:
216 dma_free_coherent(dev, 4 * RX_QUEUE_SIZE, rxq->bd,
217 rxq->bd_dma);
218err_bd:
219 return -ENOMEM;
220}
221
222/****************************************************************************** 182/******************************************************************************
223 * 183 *
224 * Generic RX handler implementations 184 * Generic RX handler implementations
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.c b/drivers/net/wireless/iwlwifi/iwl-trans.c
new file mode 100644
index 000000000000..ccf73ff63956
--- /dev/null
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.c
@@ -0,0 +1,155 @@
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 - 2011 Intel Corporation. All rights reserved.
9 *
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.
13 *
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.
18 *
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,
22 * USA
23 *
24 * The full GNU General Public License is included in this distribution
25 * in the file called LICENSE.GPL.
26 *
27 * Contact Information:
28 * Intel Linux Wireless <ilw@linux.intel.com>
29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30 *
31 * BSD LICENSE
32 *
33 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
34 * All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 *
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
44 * the documentation and/or other materials provided with the
45 * distribution.
46 * * Neither the name Intel Corporation nor the names of its
47 * contributors may be used to endorse or promote products derived
48 * from this software without specific prior written permission.
49 *
50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 *
62 *****************************************************************************/
63 #include "iwl-dev.h"
64#include "iwl-trans.h"
65
66static int iwl_trans_rx_alloc(struct iwl_priv *priv)
67{
68 struct iwl_rx_queue *rxq = &priv->rxq;
69 struct device *dev = priv->bus.dev;
70
71 memset(&priv->rxq, 0, sizeof(priv->rxq));
72
73 spin_lock_init(&rxq->lock);
74 INIT_LIST_HEAD(&rxq->rx_free);
75 INIT_LIST_HEAD(&rxq->rx_used);
76
77 if (WARN_ON(rxq->bd || rxq->rb_stts))
78 return -EINVAL;
79
80 /* Allocate the circular buffer of Read Buffer Descriptors (RBDs) */
81 /*Every descriptor is an __le32, hence its */
82 rxq->bd = dma_alloc_coherent(dev, 4 * RX_QUEUE_SIZE, &rxq->bd_dma,
83 GFP_KERNEL);
84 if (!rxq->bd)
85 goto err_bd;
86 memset(rxq->bd, 0, 4 * RX_QUEUE_SIZE);
87
88 /*Allocate the driver's pointer to receive buffer status */
89 rxq->rb_stts = dma_alloc_coherent(dev, sizeof(*rxq->rb_stts),
90 &rxq->rb_stts_dma, GFP_KERNEL);
91 if (!rxq->rb_stts)
92 goto err_rb_stts;
93 memset(rxq->rb_stts, 0, sizeof(*rxq->rb_stts));
94
95 return 0;
96
97err_rb_stts:
98 dma_free_coherent(dev, 4 * RX_QUEUE_SIZE, rxq->bd, rxq->bd_dma);
99 memset(&rxq->bd_dma, 0, sizeof(rxq->bd_dma));
100 rxq->bd = NULL;
101err_bd:
102 return -ENOMEM;
103}
104
105static int iwl_trans_rx_init(struct iwl_priv *priv)
106{
107 struct iwl_rx_queue *rxq = &priv->rxq;
108 int i, err;
109 unsigned long flags;
110
111 if (!rxq->bd) {
112 err = iwl_trans_rx_alloc(priv);
113 if (err)
114 return err;
115 }
116
117 spin_lock_irqsave(&rxq->lock, flags);
118 INIT_LIST_HEAD(&rxq->rx_free);
119 INIT_LIST_HEAD(&rxq->rx_used);
120
121 /* Fill the rx_used queue with _all_ of the Rx buffers */
122 for (i = 0; i < RX_FREE_BUFFERS + RX_QUEUE_SIZE; i++) {
123 /* In the reset function, these buffers may have been allocated
124 * to an SKB, so we need to unmap and free potential storage */
125 if (rxq->pool[i].page != NULL) {
126 dma_unmap_page(priv->bus.dev, rxq->pool[i].page_dma,
127 PAGE_SIZE << priv->hw_params.rx_page_order,
128 DMA_FROM_DEVICE);
129 __iwl_free_pages(priv, rxq->pool[i].page);
130 rxq->pool[i].page = NULL;
131 }
132 list_add_tail(&rxq->pool[i].list, &rxq->rx_used);
133 }
134
135 for (i = 0; i < RX_QUEUE_SIZE; i++)
136 rxq->queue[i] = NULL;
137
138 /* Set us so that we have processed and used all buffers, but have
139 * not restocked the Rx queue with fresh buffers */
140 rxq->read = rxq->write = 0;
141 rxq->write_actual = 0;
142 rxq->free_count = 0;
143 spin_unlock_irqrestore(&rxq->lock, flags);
144
145 return 0;
146}
147
148static const struct iwl_trans_ops trans_ops = {
149 .rx_init = iwl_trans_rx_init,
150};
151
152void iwl_trans_register(struct iwl_trans *trans)
153{
154 trans->ops = &trans_ops;
155}
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
new file mode 100644
index 000000000000..bec494c5a979
--- /dev/null
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -0,0 +1,64 @@
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 - 2011 Intel Corporation. All rights reserved.
9 *
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.
13 *
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.
18 *
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,
22 * USA
23 *
24 * The full GNU General Public License is included in this distribution
25 * in the file called LICENSE.GPL.
26 *
27 * Contact Information:
28 * Intel Linux Wireless <ilw@linux.intel.com>
29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
30 *
31 * BSD LICENSE
32 *
33 * Copyright(c) 2005 - 2011 Intel Corporation. All rights reserved.
34 * All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 *
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
44 * the documentation and/or other materials provided with the
45 * distribution.
46 * * Neither the name Intel Corporation nor the names of its
47 * contributors may be used to endorse or promote products derived
48 * from this software without specific prior written permission.
49 *
50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 *
62 *****************************************************************************/
63
64void iwl_trans_register(struct iwl_trans *trans);