1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
65
66#include <linux/module.h>
67#include <linux/pci.h>
68#include <linux/pci-aspm.h>
69
70#include "iwl-trans.h"
71#include "iwl-drv.h"
72#include "internal.h"
73
74#define IWL_PCI_DEVICE(dev, subdev, cfg) \
75 .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \
76 .subvendor = PCI_ANY_ID, .subdevice = (subdev), \
77 .driver_data = (kernel_ulong_t)&(cfg)
78
79
80static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
81#if IS_ENABLED(CONFIG_IWLDVM)
82 {IWL_PCI_DEVICE(0x4232, 0x1201, iwl5100_agn_cfg)},
83 {IWL_PCI_DEVICE(0x4232, 0x1301, iwl5100_agn_cfg)},
84 {IWL_PCI_DEVICE(0x4232, 0x1204, iwl5100_agn_cfg)},
85 {IWL_PCI_DEVICE(0x4232, 0x1304, iwl5100_agn_cfg)},
86 {IWL_PCI_DEVICE(0x4232, 0x1205, iwl5100_bgn_cfg)},
87 {IWL_PCI_DEVICE(0x4232, 0x1305, iwl5100_bgn_cfg)},
88 {IWL_PCI_DEVICE(0x4232, 0x1206, iwl5100_abg_cfg)},
89 {IWL_PCI_DEVICE(0x4232, 0x1306, iwl5100_abg_cfg)},
90 {IWL_PCI_DEVICE(0x4232, 0x1221, iwl5100_agn_cfg)},
91 {IWL_PCI_DEVICE(0x4232, 0x1321, iwl5100_agn_cfg)},
92 {IWL_PCI_DEVICE(0x4232, 0x1224, iwl5100_agn_cfg)},
93 {IWL_PCI_DEVICE(0x4232, 0x1324, iwl5100_agn_cfg)},
94 {IWL_PCI_DEVICE(0x4232, 0x1225, iwl5100_bgn_cfg)},
95 {IWL_PCI_DEVICE(0x4232, 0x1325, iwl5100_bgn_cfg)},
96 {IWL_PCI_DEVICE(0x4232, 0x1226, iwl5100_abg_cfg)},
97 {IWL_PCI_DEVICE(0x4232, 0x1326, iwl5100_abg_cfg)},
98 {IWL_PCI_DEVICE(0x4237, 0x1211, iwl5100_agn_cfg)},
99 {IWL_PCI_DEVICE(0x4237, 0x1311, iwl5100_agn_cfg)},
100 {IWL_PCI_DEVICE(0x4237, 0x1214, iwl5100_agn_cfg)},
101 {IWL_PCI_DEVICE(0x4237, 0x1314, iwl5100_agn_cfg)},
102 {IWL_PCI_DEVICE(0x4237, 0x1215, iwl5100_bgn_cfg)},
103 {IWL_PCI_DEVICE(0x4237, 0x1315, iwl5100_bgn_cfg)},
104 {IWL_PCI_DEVICE(0x4237, 0x1216, iwl5100_abg_cfg)},
105 {IWL_PCI_DEVICE(0x4237, 0x1316, iwl5100_abg_cfg)},
106
107
108 {IWL_PCI_DEVICE(0x4235, 0x1021, iwl5300_agn_cfg)},
109 {IWL_PCI_DEVICE(0x4235, 0x1121, iwl5300_agn_cfg)},
110 {IWL_PCI_DEVICE(0x4235, 0x1024, iwl5300_agn_cfg)},
111 {IWL_PCI_DEVICE(0x4235, 0x1124, iwl5300_agn_cfg)},
112 {IWL_PCI_DEVICE(0x4235, 0x1001, iwl5300_agn_cfg)},
113 {IWL_PCI_DEVICE(0x4235, 0x1101, iwl5300_agn_cfg)},
114 {IWL_PCI_DEVICE(0x4235, 0x1004, iwl5300_agn_cfg)},
115 {IWL_PCI_DEVICE(0x4235, 0x1104, iwl5300_agn_cfg)},
116 {IWL_PCI_DEVICE(0x4236, 0x1011, iwl5300_agn_cfg)},
117 {IWL_PCI_DEVICE(0x4236, 0x1111, iwl5300_agn_cfg)},
118 {IWL_PCI_DEVICE(0x4236, 0x1014, iwl5300_agn_cfg)},
119 {IWL_PCI_DEVICE(0x4236, 0x1114, iwl5300_agn_cfg)},
120
121
122 {IWL_PCI_DEVICE(0x423A, 0x1001, iwl5350_agn_cfg)},
123 {IWL_PCI_DEVICE(0x423A, 0x1021, iwl5350_agn_cfg)},
124 {IWL_PCI_DEVICE(0x423B, 0x1011, iwl5350_agn_cfg)},
125
126
127 {IWL_PCI_DEVICE(0x423C, 0x1201, iwl5150_agn_cfg)},
128 {IWL_PCI_DEVICE(0x423C, 0x1301, iwl5150_agn_cfg)},
129 {IWL_PCI_DEVICE(0x423C, 0x1206, iwl5150_abg_cfg)},
130 {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)},
131 {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)},
132 {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)},
133 {IWL_PCI_DEVICE(0x423C, 0x1326, iwl5150_abg_cfg)},
134
135 {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)},
136 {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)},
137 {IWL_PCI_DEVICE(0x423D, 0x1216, iwl5150_abg_cfg)},
138 {IWL_PCI_DEVICE(0x423D, 0x1316, iwl5150_abg_cfg)},
139
140
141 {IWL_PCI_DEVICE(0x422B, 0x1101, iwl6000_3agn_cfg)},
142 {IWL_PCI_DEVICE(0x422B, 0x1121, iwl6000_3agn_cfg)},
143 {IWL_PCI_DEVICE(0x422C, 0x1301, iwl6000i_2agn_cfg)},
144 {IWL_PCI_DEVICE(0x422C, 0x1306, iwl6000i_2abg_cfg)},
145 {IWL_PCI_DEVICE(0x422C, 0x1307, iwl6000i_2bg_cfg)},
146 {IWL_PCI_DEVICE(0x422C, 0x1321, iwl6000i_2agn_cfg)},
147 {IWL_PCI_DEVICE(0x422C, 0x1326, iwl6000i_2abg_cfg)},
148 {IWL_PCI_DEVICE(0x4238, 0x1111, iwl6000_3agn_cfg)},
149 {IWL_PCI_DEVICE(0x4239, 0x1311, iwl6000i_2agn_cfg)},
150 {IWL_PCI_DEVICE(0x4239, 0x1316, iwl6000i_2abg_cfg)},
151
152
153 {IWL_PCI_DEVICE(0x0082, 0x1301, iwl6005_2agn_cfg)},
154 {IWL_PCI_DEVICE(0x0082, 0x1306, iwl6005_2abg_cfg)},
155 {IWL_PCI_DEVICE(0x0082, 0x1307, iwl6005_2bg_cfg)},
156 {IWL_PCI_DEVICE(0x0082, 0x1321, iwl6005_2agn_cfg)},
157 {IWL_PCI_DEVICE(0x0082, 0x1326, iwl6005_2abg_cfg)},
158 {IWL_PCI_DEVICE(0x0085, 0x1311, iwl6005_2agn_cfg)},
159 {IWL_PCI_DEVICE(0x0085, 0x1316, iwl6005_2abg_cfg)},
160 {IWL_PCI_DEVICE(0x0082, 0xC020, iwl6005_2agn_sff_cfg)},
161 {IWL_PCI_DEVICE(0x0085, 0xC220, iwl6005_2agn_sff_cfg)},
162 {IWL_PCI_DEVICE(0x0082, 0x4820, iwl6005_2agn_d_cfg)},
163 {IWL_PCI_DEVICE(0x0082, 0x1304, iwl6005_2agn_mow1_cfg)},
164 {IWL_PCI_DEVICE(0x0082, 0x1305, iwl6005_2agn_mow2_cfg)},
165
166
167 {IWL_PCI_DEVICE(0x008A, 0x5305, iwl1030_bgn_cfg)},
168 {IWL_PCI_DEVICE(0x008A, 0x5307, iwl1030_bg_cfg)},
169 {IWL_PCI_DEVICE(0x008A, 0x5325, iwl1030_bgn_cfg)},
170 {IWL_PCI_DEVICE(0x008A, 0x5327, iwl1030_bg_cfg)},
171 {IWL_PCI_DEVICE(0x008B, 0x5315, iwl1030_bgn_cfg)},
172 {IWL_PCI_DEVICE(0x008B, 0x5317, iwl1030_bg_cfg)},
173 {IWL_PCI_DEVICE(0x0090, 0x5211, iwl6030_2agn_cfg)},
174 {IWL_PCI_DEVICE(0x0090, 0x5215, iwl6030_2bgn_cfg)},
175 {IWL_PCI_DEVICE(0x0090, 0x5216, iwl6030_2abg_cfg)},
176 {IWL_PCI_DEVICE(0x0091, 0x5201, iwl6030_2agn_cfg)},
177 {IWL_PCI_DEVICE(0x0091, 0x5205, iwl6030_2bgn_cfg)},
178 {IWL_PCI_DEVICE(0x0091, 0x5206, iwl6030_2abg_cfg)},
179 {IWL_PCI_DEVICE(0x0091, 0x5207, iwl6030_2bg_cfg)},
180 {IWL_PCI_DEVICE(0x0091, 0x5221, iwl6030_2agn_cfg)},
181 {IWL_PCI_DEVICE(0x0091, 0x5225, iwl6030_2bgn_cfg)},
182 {IWL_PCI_DEVICE(0x0091, 0x5226, iwl6030_2abg_cfg)},
183
184
185 {IWL_PCI_DEVICE(0x0087, 0x1301, iwl6050_2agn_cfg)},
186 {IWL_PCI_DEVICE(0x0087, 0x1306, iwl6050_2abg_cfg)},
187 {IWL_PCI_DEVICE(0x0087, 0x1321, iwl6050_2agn_cfg)},
188 {IWL_PCI_DEVICE(0x0087, 0x1326, iwl6050_2abg_cfg)},
189 {IWL_PCI_DEVICE(0x0089, 0x1311, iwl6050_2agn_cfg)},
190 {IWL_PCI_DEVICE(0x0089, 0x1316, iwl6050_2abg_cfg)},
191
192
193 {IWL_PCI_DEVICE(0x0885, 0x1305, iwl6150_bgn_cfg)},
194 {IWL_PCI_DEVICE(0x0885, 0x1307, iwl6150_bg_cfg)},
195 {IWL_PCI_DEVICE(0x0885, 0x1325, iwl6150_bgn_cfg)},
196 {IWL_PCI_DEVICE(0x0885, 0x1327, iwl6150_bg_cfg)},
197 {IWL_PCI_DEVICE(0x0886, 0x1315, iwl6150_bgn_cfg)},
198 {IWL_PCI_DEVICE(0x0886, 0x1317, iwl6150_bg_cfg)},
199
200
201 {IWL_PCI_DEVICE(0x0083, 0x1205, iwl1000_bgn_cfg)},
202 {IWL_PCI_DEVICE(0x0083, 0x1305, iwl1000_bgn_cfg)},
203 {IWL_PCI_DEVICE(0x0083, 0x1225, iwl1000_bgn_cfg)},
204 {IWL_PCI_DEVICE(0x0083, 0x1325, iwl1000_bgn_cfg)},
205 {IWL_PCI_DEVICE(0x0084, 0x1215, iwl1000_bgn_cfg)},
206 {IWL_PCI_DEVICE(0x0084, 0x1315, iwl1000_bgn_cfg)},
207 {IWL_PCI_DEVICE(0x0083, 0x1206, iwl1000_bg_cfg)},
208 {IWL_PCI_DEVICE(0x0083, 0x1306, iwl1000_bg_cfg)},
209 {IWL_PCI_DEVICE(0x0083, 0x1226, iwl1000_bg_cfg)},
210 {IWL_PCI_DEVICE(0x0083, 0x1326, iwl1000_bg_cfg)},
211 {IWL_PCI_DEVICE(0x0084, 0x1216, iwl1000_bg_cfg)},
212 {IWL_PCI_DEVICE(0x0084, 0x1316, iwl1000_bg_cfg)},
213
214
215 {IWL_PCI_DEVICE(0x08AE, 0x1005, iwl100_bgn_cfg)},
216 {IWL_PCI_DEVICE(0x08AE, 0x1007, iwl100_bg_cfg)},
217 {IWL_PCI_DEVICE(0x08AF, 0x1015, iwl100_bgn_cfg)},
218 {IWL_PCI_DEVICE(0x08AF, 0x1017, iwl100_bg_cfg)},
219 {IWL_PCI_DEVICE(0x08AE, 0x1025, iwl100_bgn_cfg)},
220 {IWL_PCI_DEVICE(0x08AE, 0x1027, iwl100_bg_cfg)},
221
222
223 {IWL_PCI_DEVICE(0x0896, 0x5005, iwl130_bgn_cfg)},
224 {IWL_PCI_DEVICE(0x0896, 0x5007, iwl130_bg_cfg)},
225 {IWL_PCI_DEVICE(0x0897, 0x5015, iwl130_bgn_cfg)},
226 {IWL_PCI_DEVICE(0x0897, 0x5017, iwl130_bg_cfg)},
227 {IWL_PCI_DEVICE(0x0896, 0x5025, iwl130_bgn_cfg)},
228 {IWL_PCI_DEVICE(0x0896, 0x5027, iwl130_bg_cfg)},
229
230
231 {IWL_PCI_DEVICE(0x0890, 0x4022, iwl2000_2bgn_cfg)},
232 {IWL_PCI_DEVICE(0x0891, 0x4222, iwl2000_2bgn_cfg)},
233 {IWL_PCI_DEVICE(0x0890, 0x4422, iwl2000_2bgn_cfg)},
234 {IWL_PCI_DEVICE(0x0890, 0x4822, iwl2000_2bgn_d_cfg)},
235
236
237 {IWL_PCI_DEVICE(0x0887, 0x4062, iwl2030_2bgn_cfg)},
238 {IWL_PCI_DEVICE(0x0888, 0x4262, iwl2030_2bgn_cfg)},
239 {IWL_PCI_DEVICE(0x0887, 0x4462, iwl2030_2bgn_cfg)},
240
241
242 {IWL_PCI_DEVICE(0x088E, 0x4060, iwl6035_2agn_cfg)},
243 {IWL_PCI_DEVICE(0x088F, 0x4260, iwl6035_2agn_cfg)},
244 {IWL_PCI_DEVICE(0x088E, 0x4460, iwl6035_2agn_cfg)},
245 {IWL_PCI_DEVICE(0x088E, 0x4860, iwl6035_2agn_cfg)},
246 {IWL_PCI_DEVICE(0x088F, 0x5260, iwl6035_2agn_cfg)},
247
248
249 {IWL_PCI_DEVICE(0x0894, 0x0022, iwl105_bgn_cfg)},
250 {IWL_PCI_DEVICE(0x0895, 0x0222, iwl105_bgn_cfg)},
251 {IWL_PCI_DEVICE(0x0894, 0x0422, iwl105_bgn_cfg)},
252 {IWL_PCI_DEVICE(0x0894, 0x0822, iwl105_bgn_d_cfg)},
253
254
255 {IWL_PCI_DEVICE(0x0892, 0x0062, iwl135_bgn_cfg)},
256 {IWL_PCI_DEVICE(0x0893, 0x0262, iwl135_bgn_cfg)},
257 {IWL_PCI_DEVICE(0x0892, 0x0462, iwl135_bgn_cfg)},
258#endif
259
260#if IS_ENABLED(CONFIG_IWLMVM)
261
262 {IWL_PCI_DEVICE(0x08B1, 0x4070, iwl7260_2ac_cfg)},
263 {IWL_PCI_DEVICE(0x08B1, 0x4170, iwl7260_2ac_cfg)},
264 {IWL_PCI_DEVICE(0x08B1, 0x4060, iwl7260_2n_cfg)},
265 {IWL_PCI_DEVICE(0x08B1, 0x4160, iwl7260_2n_cfg)},
266 {IWL_PCI_DEVICE(0x08B1, 0x4062, iwl7260_n_cfg)},
267 {IWL_PCI_DEVICE(0x08B1, 0x4162, iwl7260_n_cfg)},
268 {IWL_PCI_DEVICE(0x08B2, 0x4270, iwl7260_2ac_cfg)},
269 {IWL_PCI_DEVICE(0x08B2, 0x4260, iwl7260_2n_cfg)},
270 {IWL_PCI_DEVICE(0x08B2, 0x4262, iwl7260_n_cfg)},
271 {IWL_PCI_DEVICE(0x08B1, 0x4470, iwl7260_2ac_cfg)},
272 {IWL_PCI_DEVICE(0x08B1, 0x4460, iwl7260_2n_cfg)},
273 {IWL_PCI_DEVICE(0x08B1, 0x4462, iwl7260_n_cfg)},
274 {IWL_PCI_DEVICE(0x08B1, 0x4870, iwl7260_2ac_cfg)},
275 {IWL_PCI_DEVICE(0x08B1, 0x486E, iwl7260_2ac_cfg)},
276 {IWL_PCI_DEVICE(0x08B1, 0x4A70, iwl7260_2ac_cfg)},
277 {IWL_PCI_DEVICE(0x08B1, 0x4A6E, iwl7260_2ac_cfg)},
278 {IWL_PCI_DEVICE(0x08B1, 0x4A6C, iwl7260_2ac_cfg)},
279 {IWL_PCI_DEVICE(0x08B1, 0x4020, iwl7260_2n_cfg)},
280 {IWL_PCI_DEVICE(0x08B2, 0x4220, iwl7260_2n_cfg)},
281 {IWL_PCI_DEVICE(0x08B1, 0x4420, iwl7260_2n_cfg)},
282 {IWL_PCI_DEVICE(0x08B1, 0xC070, iwl7260_2ac_cfg)},
283 {IWL_PCI_DEVICE(0x08B1, 0xC170, iwl7260_2ac_cfg)},
284 {IWL_PCI_DEVICE(0x08B1, 0xC060, iwl7260_2n_cfg)},
285 {IWL_PCI_DEVICE(0x08B1, 0xC160, iwl7260_2n_cfg)},
286 {IWL_PCI_DEVICE(0x08B1, 0xC062, iwl7260_n_cfg)},
287 {IWL_PCI_DEVICE(0x08B1, 0xC162, iwl7260_n_cfg)},
288 {IWL_PCI_DEVICE(0x08B2, 0xC270, iwl7260_2ac_cfg)},
289 {IWL_PCI_DEVICE(0x08B2, 0xC260, iwl7260_2n_cfg)},
290 {IWL_PCI_DEVICE(0x08B2, 0xC262, iwl7260_n_cfg)},
291 {IWL_PCI_DEVICE(0x08B1, 0xC470, iwl7260_2ac_cfg)},
292 {IWL_PCI_DEVICE(0x08B1, 0xC460, iwl7260_2n_cfg)},
293 {IWL_PCI_DEVICE(0x08B1, 0xC462, iwl7260_n_cfg)},
294 {IWL_PCI_DEVICE(0x08B1, 0xC020, iwl7260_2n_cfg)},
295 {IWL_PCI_DEVICE(0x08B2, 0xC220, iwl7260_2n_cfg)},
296 {IWL_PCI_DEVICE(0x08B1, 0xC420, iwl7260_2n_cfg)},
297
298
299 {IWL_PCI_DEVICE(0x08B3, 0x0070, iwl3160_2ac_cfg)},
300 {IWL_PCI_DEVICE(0x08B3, 0x0170, iwl3160_2ac_cfg)},
301 {IWL_PCI_DEVICE(0x08B3, 0x0060, iwl3160_2n_cfg)},
302 {IWL_PCI_DEVICE(0x08B3, 0x0062, iwl3160_n_cfg)},
303 {IWL_PCI_DEVICE(0x08B4, 0x0270, iwl3160_2ac_cfg)},
304 {IWL_PCI_DEVICE(0x08B3, 0x0470, iwl3160_2ac_cfg)},
305 {IWL_PCI_DEVICE(0x08B3, 0x8070, iwl3160_2ac_cfg)},
306 {IWL_PCI_DEVICE(0x08B3, 0x8170, iwl3160_2ac_cfg)},
307 {IWL_PCI_DEVICE(0x08B3, 0x8060, iwl3160_2n_cfg)},
308 {IWL_PCI_DEVICE(0x08B3, 0x8062, iwl3160_n_cfg)},
309 {IWL_PCI_DEVICE(0x08B4, 0x8270, iwl3160_2ac_cfg)},
310 {IWL_PCI_DEVICE(0x08B3, 0x8470, iwl3160_2ac_cfg)},
311#endif
312
313 {0}
314};
315MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
316
317
318#define PCI_CFG_RETRY_TIMEOUT 0x041
319
320static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
321{
322 const struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
323 struct iwl_trans *iwl_trans;
324 struct iwl_trans_pcie *trans_pcie;
325 int ret;
326
327 iwl_trans = iwl_trans_pcie_alloc(pdev, ent, cfg);
328 if (iwl_trans == NULL)
329 return -ENOMEM;
330
331 pci_set_drvdata(pdev, iwl_trans);
332
333 trans_pcie = IWL_TRANS_GET_PCIE_TRANS(iwl_trans);
334 trans_pcie->drv = iwl_drv_start(iwl_trans, cfg);
335
336 if (IS_ERR_OR_NULL(trans_pcie->drv)) {
337 ret = PTR_ERR(trans_pcie->drv);
338 goto out_free_trans;
339 }
340
341
342 ret = iwl_trans_dbgfs_register(iwl_trans, iwl_trans->dbgfs_dir);
343 if (ret)
344 goto out_free_drv;
345
346 return 0;
347
348out_free_drv:
349 iwl_drv_stop(trans_pcie->drv);
350out_free_trans:
351 iwl_trans_pcie_free(iwl_trans);
352 pci_set_drvdata(pdev, NULL);
353 return ret;
354}
355
356static void iwl_pci_remove(struct pci_dev *pdev)
357{
358 struct iwl_trans *trans = pci_get_drvdata(pdev);
359 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
360
361 iwl_drv_stop(trans_pcie->drv);
362 iwl_trans_pcie_free(trans);
363
364 pci_set_drvdata(pdev, NULL);
365}
366
367#ifdef CONFIG_PM_SLEEP
368
369static int iwl_pci_suspend(struct device *device)
370{
371 struct pci_dev *pdev = to_pci_dev(device);
372 struct iwl_trans *iwl_trans = pci_get_drvdata(pdev);
373
374
375
376
377
378
379 return iwl_trans_suspend(iwl_trans);
380}
381
382static int iwl_pci_resume(struct device *device)
383{
384 struct pci_dev *pdev = to_pci_dev(device);
385 struct iwl_trans *iwl_trans = pci_get_drvdata(pdev);
386
387
388
389
390
391
392
393
394
395
396 pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
397
398 return iwl_trans_resume(iwl_trans);
399}
400
401static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume);
402
403#define IWL_PM_OPS (&iwl_dev_pm_ops)
404
405#else
406
407#define IWL_PM_OPS NULL
408
409#endif
410
411static struct pci_driver iwl_pci_driver = {
412 .name = DRV_NAME,
413 .id_table = iwl_hw_card_ids,
414 .probe = iwl_pci_probe,
415 .remove = iwl_pci_remove,
416 .driver.pm = IWL_PM_OPS,
417};
418
419int __must_check iwl_pci_register_driver(void)
420{
421 int ret;
422 ret = pci_register_driver(&iwl_pci_driver);
423 if (ret)
424 pr_err("Unable to initialize PCI module\n");
425
426 return ret;
427}
428
429void iwl_pci_unregister_driver(void)
430{
431 pci_unregister_driver(&iwl_pci_driver);
432}
433