]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - drivers/staging/rt2860/pci_main_dev.c
Merge branch 'linux-next' of git://git.infradead.org/ubifs-2.6
[mirror_ubuntu-kernels.git] / drivers / staging / rt2860 / pci_main_dev.c
1 /*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
26
27 Module Name:
28 pci_main_dev.c
29
30 Abstract:
31 Create and register network interface for PCI based chipsets in Linux platform.
32
33 Revision History:
34 Who When What
35 Justin P. Mattock 11/07/2010 Fix typos in some comments
36 -------- ---------- ----------------------------------------------
37 */
38
39 #include "rt_config.h"
40 #include <linux/pci.h>
41 #include <linux/slab.h>
42
43 /* Following information will be show when you run 'modinfo' */
44 /* If you have a solution for a bug in current version of driver, please e-mail me. */
45 /* Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. */
46 MODULE_AUTHOR("Jett Chen <jett_chen@ralinktech.com>");
47 MODULE_DESCRIPTION("RT2860/RT3090 Wireless Lan Linux Driver");
48 MODULE_LICENSE("GPL");
49 MODULE_ALIAS("rt3090sta");
50
51 /* */
52 /* Function declarations */
53 /* */
54 static void __devexit rt2860_remove_one(struct pci_dev *pci_dev);
55 static int __devinit rt2860_probe(struct pci_dev *pci_dev,
56 const struct pci_device_id *ent);
57 static void __exit rt2860_cleanup_module(void);
58 static int __init rt2860_init_module(void);
59
60 static void RTMPInitPCIeDevice(IN struct pci_dev *pci_dev,
61 struct rt_rtmp_adapter *pAd);
62
63 #ifdef CONFIG_PM
64 static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state);
65 static int rt2860_resume(struct pci_dev *pci_dev);
66 #endif /* CONFIG_PM // */
67
68 /* */
69 /* Ralink PCI device table, include all supported chipsets */
70 /* */
71 static struct pci_device_id rt2860_pci_tbl[] __devinitdata = {
72 #ifdef RT2860
73 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, /*RT28602.4G */
74 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)},
75 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)},
76 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)},
77 {PCI_DEVICE(VEN_AWT_PCI_VENDOR_ID, VEN_AWT_PCIe_DEVICE_ID)},
78 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7708)},
79 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7728)},
80 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7758)},
81 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7727)},
82 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7738)},
83 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7748)},
84 {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7768)},
85 #endif
86 #ifdef RT3090
87 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3090_PCIe_DEVICE_ID)},
88 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3091_PCIe_DEVICE_ID)},
89 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3092_PCIe_DEVICE_ID)},
90 #endif /* RT3090 // */
91 #ifdef RT3390
92 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3390_PCIe_DEVICE_ID)},
93 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3391_PCIe_DEVICE_ID)},
94 {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3392_PCIe_DEVICE_ID)},
95 #endif /* RT3390 // */
96 {0,} /* terminate list */
97 };
98
99 MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl);
100 #ifdef MODULE_VERSION
101 MODULE_VERSION(STA_DRIVER_VERSION);
102 #endif
103
104 /* */
105 /* Our PCI driver structure */
106 /* */
107 static struct pci_driver rt2860_driver = {
108 name: "rt2860",
109 id_table : rt2860_pci_tbl,
110 probe : rt2860_probe,
111 remove : __devexit_p(rt2860_remove_one),
112 #ifdef CONFIG_PM
113 suspend : rt2860_suspend,
114 resume : rt2860_resume,
115 #endif
116 };
117
118 /***************************************************************************
119 *
120 * PCI device initialization related procedures.
121 *
122 ***************************************************************************/
123 #ifdef CONFIG_PM
124
125 void RT2860RejectPendingPackets(struct rt_rtmp_adapter *pAd)
126 {
127 /* clear PS packets */
128 /* clear TxSw packets */
129 }
130
131 static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state)
132 {
133 struct net_device *net_dev = pci_get_drvdata(pci_dev);
134 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)NULL;
135 int retval = 0;
136
137 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n"));
138
139 if (net_dev == NULL) {
140 DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
141 } else {
142 GET_PAD_FROM_NET_DEV(pAd, net_dev);
143
144 /* we can not use IFF_UP because ra0 down but ra1 up */
145 /* and 1 suspend/resume function for 1 module, not for each interface */
146 /* so Linux will call suspend/resume function once */
147 if (VIRTUAL_IF_NUM(pAd) > 0) {
148 /* avoid users do suspend after interface is down */
149
150 /* stop interface */
151 netif_carrier_off(net_dev);
152 netif_stop_queue(net_dev);
153
154 /* mark device as removed from system and therefore no longer available */
155 netif_device_detach(net_dev);
156
157 /* mark halt flag */
158 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
159 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
160
161 /* take down the device */
162 rt28xx_close((struct net_device *)net_dev);
163
164 RT_MOD_DEC_USE_COUNT();
165 }
166 }
167
168 /* reference to http://vovo2000.com/type-lab/linux/kernel-api/linux-kernel-api.html */
169 /* enable device to generate PME# when suspended */
170 /* pci_choose_state(): Choose the power state of a PCI device to be suspended */
171 retval = pci_enable_wake(pci_dev, pci_choose_state(pci_dev, state), 1);
172 /* save the PCI configuration space of a device before suspending */
173 pci_save_state(pci_dev);
174 /* disable PCI device after use */
175 pci_disable_device(pci_dev);
176
177 retval = pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
178
179 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_suspend()\n"));
180 return retval;
181 }
182
183 static int rt2860_resume(struct pci_dev *pci_dev)
184 {
185 struct net_device *net_dev = pci_get_drvdata(pci_dev);
186 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)NULL;
187 int retval;
188
189 /* set the power state of a PCI device */
190 /* PCI has 4 power states, DO (normal) ~ D3(less power) */
191 /* in include/linux/pci.h, you can find that */
192 /* #define PCI_D0 ((pci_power_t __force) 0) */
193 /* #define PCI_D1 ((pci_power_t __force) 1) */
194 /* #define PCI_D2 ((pci_power_t __force) 2) */
195 /* #define PCI_D3hot ((pci_power_t __force) 3) */
196 /* #define PCI_D3cold ((pci_power_t __force) 4) */
197 /* #define PCI_UNKNOWN ((pci_power_t __force) 5) */
198 /* #define PCI_POWER_ERROR ((pci_power_t __force) -1) */
199 retval = pci_set_power_state(pci_dev, PCI_D0);
200
201 /* restore the saved state of a PCI device */
202 pci_restore_state(pci_dev);
203
204 /* initialize device before it's used by a driver */
205 if (pci_enable_device(pci_dev)) {
206 printk(KERN_ERR "rt2860: pci enable fail!\n");
207 return 0;
208 }
209
210 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n"));
211
212 if (net_dev == NULL)
213 DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
214 else
215 GET_PAD_FROM_NET_DEV(pAd, net_dev);
216
217 if (pAd != NULL) {
218 /* we can not use IFF_UP because ra0 down but ra1 up */
219 /* and 1 suspend/resume function for 1 module, not for each interface */
220 /* so Linux will call suspend/resume function once */
221 if (VIRTUAL_IF_NUM(pAd) > 0) {
222 /* mark device as attached from system and restart if needed */
223 netif_device_attach(net_dev);
224
225 if (rt28xx_open((struct net_device *)net_dev) != 0) {
226 /* open fail */
227 DBGPRINT(RT_DEBUG_TRACE,
228 ("<=== rt2860_resume()\n"));
229 return 0;
230 }
231 /* increase MODULE use count */
232 RT_MOD_INC_USE_COUNT();
233
234 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
235 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
236
237 netif_start_queue(net_dev);
238 netif_carrier_on(net_dev);
239 netif_wake_queue(net_dev);
240 }
241 }
242
243 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n"));
244 return 0;
245 }
246 #endif /* CONFIG_PM // */
247
248 static int __init rt2860_init_module(void)
249 {
250 return pci_register_driver(&rt2860_driver);
251 }
252
253 /* */
254 /* Driver module unload function */
255 /* */
256 static void __exit rt2860_cleanup_module(void)
257 {
258 pci_unregister_driver(&rt2860_driver);
259 }
260
261 module_init(rt2860_init_module);
262 module_exit(rt2860_cleanup_module);
263
264 /* */
265 /* PCI device probe & initialization function */
266 /* */
267 static int __devinit rt2860_probe(IN struct pci_dev *pci_dev,
268 IN const struct pci_device_id *pci_id)
269 {
270 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)NULL;
271 struct net_device *net_dev;
272 void *handle;
273 char *print_name;
274 unsigned long csr_addr;
275 int rv = 0;
276 struct rt_rtmp_os_netdev_op_hook netDevHook;
277
278 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_probe\n"));
279
280 /*PCIDevInit============================================== */
281 /* wake up and enable device */
282 rv = pci_enable_device(pci_dev);
283
284 if (rv != 0) {
285 DBGPRINT(RT_DEBUG_ERROR,
286 ("Enable PCI device failed, errno=%d!\n", rv));
287 return rv;
288 }
289
290 print_name = (char *)pci_name(pci_dev);
291
292 rv = pci_request_regions(pci_dev, print_name);
293
294 if (rv != 0) {
295 DBGPRINT(RT_DEBUG_ERROR,
296 ("Request PCI resource failed, errno=%d!\n", rv));
297 goto err_out;
298 }
299 /* map physical address to virtual address for accessing register */
300 csr_addr =
301 (unsigned long)ioremap(pci_resource_start(pci_dev, 0),
302 pci_resource_len(pci_dev, 0));
303 if (!csr_addr) {
304 DBGPRINT(RT_DEBUG_ERROR,
305 ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n",
306 print_name, (unsigned long)pci_resource_len(pci_dev, 0),
307 (unsigned long)pci_resource_start(pci_dev, 0)));
308 goto err_out_free_res;
309 } else {
310 DBGPRINT(RT_DEBUG_TRACE,
311 ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name,
312 (unsigned long)pci_resource_start(pci_dev, 0),
313 (unsigned long)csr_addr, pci_dev->irq));
314 }
315
316 /* Set DMA master */
317 pci_set_master(pci_dev);
318
319 /*RtmpDevInit============================================== */
320 /* Allocate struct rt_rtmp_adapter adapter structure */
321 handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
322 if (handle == NULL) {
323 DBGPRINT(RT_DEBUG_ERROR,
324 ("%s(): Allocate memory for os handle failed!\n",
325 __func__));
326 goto err_out_iounmap;
327 }
328
329 ((struct os_cookie *)handle)->pci_dev = pci_dev;
330
331 rv = RTMPAllocAdapterBlock(handle, &pAd); /*shiang: we may need the pci_dev for allocate structure of "struct rt_rtmp_adapter" */
332 if (rv != NDIS_STATUS_SUCCESS)
333 goto err_out_iounmap;
334 /* Here are the struct rt_rtmp_adapter structure with pci-bus specific parameters. */
335 pAd->CSRBaseAddress = (u8 *)csr_addr;
336 DBGPRINT(RT_DEBUG_ERROR,
337 ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n",
338 (unsigned long)pAd->CSRBaseAddress, csr_addr));
339 RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI);
340
341 /*NetDevInit============================================== */
342 net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);
343 if (net_dev == NULL)
344 goto err_out_free_radev;
345
346 /* Here are the net_device structure with pci-bus specific parameters. */
347 net_dev->irq = pci_dev->irq; /* Interrupt IRQ number */
348 net_dev->base_addr = csr_addr; /* Save CSR virtual address and irq to device structure */
349 pci_set_drvdata(pci_dev, net_dev); /* Set driver data */
350
351 /* for supporting Network Manager */
352 /* Set the sysfs physical device reference for the network logical device
353 * if set prior to registration will cause a symlink during initialization.
354 */
355 SET_NETDEV_DEV(net_dev, &(pci_dev->dev));
356
357 /*All done, it's time to register the net device to linux kernel. */
358 /* Register this device */
359 rv = RtmpOSNetDevAttach(net_dev, &netDevHook);
360 if (rv)
361 goto err_out_free_netdev;
362
363 pAd->StaCfg.OriDevType = net_dev->type;
364 RTMPInitPCIeDevice(pci_dev, pAd);
365
366 DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_probe\n"));
367
368 return 0; /* probe ok */
369
370 /* --------------------------- ERROR HANDLE --------------------------- */
371 err_out_free_netdev:
372 RtmpOSNetDevFree(net_dev);
373
374 err_out_free_radev:
375 /* free struct rt_rtmp_adapter strcuture and os_cookie */
376 RTMPFreeAdapter(pAd);
377
378 err_out_iounmap:
379 iounmap((void *)(csr_addr));
380 release_mem_region(pci_resource_start(pci_dev, 0),
381 pci_resource_len(pci_dev, 0));
382
383 err_out_free_res:
384 pci_release_regions(pci_dev);
385
386 err_out:
387 pci_disable_device(pci_dev);
388
389 DBGPRINT(RT_DEBUG_ERROR,
390 ("<=== rt2860_probe failed with rv = %d!\n", rv));
391
392 return -ENODEV; /* probe fail */
393 }
394
395 static void __devexit rt2860_remove_one(IN struct pci_dev *pci_dev)
396 {
397 struct net_device *net_dev = pci_get_drvdata(pci_dev);
398 struct rt_rtmp_adapter *pAd = NULL;
399 unsigned long csr_addr = net_dev->base_addr; /* pAd->CSRBaseAddress; */
400
401 GET_PAD_FROM_NET_DEV(pAd, net_dev);
402
403 DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n"));
404
405 if (pAd != NULL) {
406 /* Unregister/Free all allocated net_device. */
407 RtmpPhyNetDevExit(pAd, net_dev);
408
409 /* Unmap CSR base address */
410 iounmap((char *)(csr_addr));
411
412 /* release memory region */
413 release_mem_region(pci_resource_start(pci_dev, 0),
414 pci_resource_len(pci_dev, 0));
415
416 /* Free struct rt_rtmp_adapter related structures. */
417 RtmpRaDevCtrlExit(pAd);
418
419 } else {
420 /* Unregister network device */
421 RtmpOSNetDevDetach(net_dev);
422
423 /* Unmap CSR base address */
424 iounmap((char *)(net_dev->base_addr));
425
426 /* release memory region */
427 release_mem_region(pci_resource_start(pci_dev, 0),
428 pci_resource_len(pci_dev, 0));
429 }
430
431 /* Free the root net_device */
432 RtmpOSNetDevFree(net_dev);
433
434 }
435
436 /*
437 ========================================================================
438 Routine Description:
439 Check the chipset vendor/product ID.
440
441 Arguments:
442 _dev_p Point to the PCI or USB device
443
444 Return Value:
445 TRUE Check ok
446 FALSE Check fail
447
448 Note:
449 ========================================================================
450 */
451 BOOLEAN RT28XXChipsetCheck(IN void *_dev_p)
452 {
453 /* always TRUE */
454 return TRUE;
455 }
456
457 /***************************************************************************
458 *
459 * PCIe device initialization related procedures.
460 *
461 ***************************************************************************/
462 static void RTMPInitPCIeDevice(struct pci_dev *pci_dev, struct rt_rtmp_adapter *pAd)
463 {
464 u16 device_id;
465 struct os_cookie *pObj;
466
467 pObj = (struct os_cookie *)pAd->OS_Cookie;
468 pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id);
469 device_id = le2cpu16(device_id);
470 pObj->DeviceID = device_id;
471 if (
472 #ifdef RT2860
473 (device_id == NIC2860_PCIe_DEVICE_ID) ||
474 (device_id == NIC2790_PCIe_DEVICE_ID) ||
475 (device_id == VEN_AWT_PCIe_DEVICE_ID) ||
476 #endif
477 #ifdef RT3090
478 (device_id == NIC3090_PCIe_DEVICE_ID) ||
479 (device_id == NIC3091_PCIe_DEVICE_ID) ||
480 (device_id == NIC3092_PCIe_DEVICE_ID) ||
481 #endif /* RT3090 // */
482 0) {
483 u32 MacCsr0 = 0, Index = 0;
484 do {
485 RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
486
487 if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
488 break;
489
490 RTMPusecDelay(10);
491 } while (Index++ < 100);
492
493 /* Support advanced power save after 2892/2790. */
494 /* MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). */
495 if ((MacCsr0 & 0xffff0000) != 0x28600000)
496 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PCIE_DEVICE);
497 }
498 }
499
500 void RTMPInitPCIeLinkCtrlValue(struct rt_rtmp_adapter *pAd)
501 {
502 int pos;
503 u16 reg16, data2, PCIePowerSaveLevel, Configuration;
504 u32 MacValue;
505 BOOLEAN bFindIntel = FALSE;
506 struct os_cookie *pObj;
507
508 pObj = (struct os_cookie *)pAd->OS_Cookie;
509
510 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
511 return;
512
513 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
514 /* Init EEPROM, and save settings */
515 if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) {
516 RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
517 pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff;
518
519 pAd->LnkCtrlBitMask = 0;
520 if ((PCIePowerSaveLevel & 0xff) == 0xff) {
521 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PCIE_DEVICE);
522 DBGPRINT(RT_DEBUG_TRACE,
523 ("====> PCIePowerSaveLevel = 0x%x.\n",
524 PCIePowerSaveLevel));
525 return;
526 } else {
527 PCIePowerSaveLevel &= 0x3;
528 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
529
530 if (!
531 (((data2 & 0xff00) == 0x9200)
532 && ((data2 & 0x80) != 0))) {
533 if (PCIePowerSaveLevel > 1)
534 PCIePowerSaveLevel = 1;
535 }
536
537 DBGPRINT(RT_DEBUG_TRACE,
538 ("====> Write 0x83 = 0x%x.\n",
539 PCIePowerSaveLevel));
540 AsicSendCommandToMcu(pAd, 0x83, 0xff,
541 (u8)PCIePowerSaveLevel, 0x00);
542 RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
543 PCIePowerSaveLevel &= 0xff;
544 PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
545 switch (PCIePowerSaveLevel) {
546 case 0: /* Only support L0 */
547 pAd->LnkCtrlBitMask = 0;
548 break;
549 case 1: /* Only enable L0s */
550 pAd->LnkCtrlBitMask = 1;
551 break;
552 case 2: /* enable L1, L0s */
553 pAd->LnkCtrlBitMask = 3;
554 break;
555 case 3: /* sync with host clk and enable L1, L0s */
556 pAd->LnkCtrlBitMask = 0x103;
557 break;
558 }
559 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
560 if ((PCIePowerSaveLevel & 0xff) != 0xff) {
561 PCIePowerSaveLevel &= 0x3;
562
563 if (!
564 (((data2 & 0xff00) == 0x9200)
565 && ((data2 & 0x80) != 0))) {
566 if (PCIePowerSaveLevel > 1)
567 PCIePowerSaveLevel = 1;
568 }
569
570 DBGPRINT(RT_DEBUG_TRACE,
571 ("====> rt28xx Write 0x83 Command = 0x%x.\n",
572 PCIePowerSaveLevel));
573
574 AsicSendCommandToMcu(pAd, 0x83, 0xff,
575 (u8)PCIePowerSaveLevel,
576 0x00);
577 }
578 DBGPRINT(RT_DEBUG_TRACE,
579 ("====> LnkCtrlBitMask = 0x%x.\n",
580 pAd->LnkCtrlBitMask));
581 }
582 } else if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
583 u8 LinkCtrlSetting = 0;
584
585 /* Check 3090E special setting chip. */
586 RT28xx_EEPROM_READ16(pAd, 0x24, data2);
587 if ((data2 == 0x9280) && ((pAd->MACVersion & 0xffff) == 0x0211)) {
588 pAd->b3090ESpecialChip = TRUE;
589 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Special 3090E chip \n"));
590 }
591
592 RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue);
593 /*enable WAKE_PCIE function, which forces to enable PCIE clock when mpu interrupt asserting. */
594 /*Force PCIE 125MHz CLK to toggle */
595 MacValue |= 0x402;
596 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue);
597 DBGPRINT_RAW(RT_DEBUG_ERROR,
598 (" AUX_CTRL = 0x%32x\n", MacValue));
599
600 /* for RT30xx F and after, PCIe interface, and for power solution 3 */
601 if ((IS_VERSION_AFTER_F(pAd))
602 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode >= 2)
603 && (pAd->StaCfg.PSControl.field.rt30xxPowerMode <= 3)) {
604 RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue);
605 DBGPRINT_RAW(RT_DEBUG_ERROR,
606 (" Read AUX_CTRL = 0x%x\n", MacValue));
607 /* turn on bit 12. */
608 /*enable 32KHz clock mode for power saving */
609 MacValue |= 0x1000;
610 if (MacValue != 0xffffffff) {
611 RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue);
612 DBGPRINT_RAW(RT_DEBUG_ERROR,
613 (" Write AUX_CTRL = 0x%x\n",
614 MacValue));
615 /* 1. if use PCIePowerSetting is 2 or 3, need to program OSC_CTRL to 0x3ff11. */
616 MacValue = 0x3ff11;
617 RTMP_IO_WRITE32(pAd, OSC_CTRL, MacValue);
618 DBGPRINT_RAW(RT_DEBUG_ERROR,
619 (" OSC_CTRL = 0x%x\n", MacValue));
620 /* 2. Write PCI register Clk ref bit */
621 RTMPrt3xSetPCIePowerLinkCtrl(pAd);
622 } else {
623 /* Error read Aux_Ctrl value. Force to use solution 1 */
624 DBGPRINT(RT_DEBUG_ERROR,
625 (" Error Value in AUX_CTRL = 0x%x\n",
626 MacValue));
627 pAd->StaCfg.PSControl.field.rt30xxPowerMode = 1;
628 DBGPRINT(RT_DEBUG_ERROR,
629 (" Force to use power solution1 \n"));
630 }
631 }
632 /* 1. read setting from inf file. */
633
634 PCIePowerSaveLevel =
635 (u16)pAd->StaCfg.PSControl.field.rt30xxPowerMode;
636 DBGPRINT(RT_DEBUG_ERROR,
637 ("====> rt30xx Read PowerLevelMode = 0x%x.\n",
638 PCIePowerSaveLevel));
639 /* 2. Check EnableNewPS. */
640 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
641 PCIePowerSaveLevel = 1;
642
643 if (IS_VERSION_BEFORE_F(pAd)
644 && (pAd->b3090ESpecialChip == FALSE)) {
645 /* Chip Version E only allow 1, So force set 1. */
646 PCIePowerSaveLevel &= 0x1;
647 pAd->PCIePowerSaveLevel = (u16)PCIePowerSaveLevel;
648 DBGPRINT(RT_DEBUG_TRACE,
649 ("====> rt30xx E Write 0x83 Command = 0x%x.\n",
650 PCIePowerSaveLevel));
651
652 AsicSendCommandToMcu(pAd, 0x83, 0xff,
653 (u8)PCIePowerSaveLevel, 0x00);
654 } else {
655 /* Chip Version F and after only allow 1 or 2 or 3. This might be modified after new chip version come out. */
656 if (!
657 ((PCIePowerSaveLevel == 1)
658 || (PCIePowerSaveLevel == 3)))
659 PCIePowerSaveLevel = 1;
660 DBGPRINT(RT_DEBUG_ERROR,
661 ("====> rt30xx F Write 0x83 Command = 0x%x.\n",
662 PCIePowerSaveLevel));
663 pAd->PCIePowerSaveLevel = (u16)PCIePowerSaveLevel;
664 /* for 3090F , we need to add high-byte arg for 0x83 command to indicate the link control setting in */
665 /* PCI Configuration Space. Because firmware can't read PCI Configuration Space */
666 if ((pAd->Rt3xxRalinkLinkCtrl & 0x2)
667 && (pAd->Rt3xxHostLinkCtrl & 0x2)) {
668 LinkCtrlSetting = 1;
669 }
670 DBGPRINT(RT_DEBUG_TRACE,
671 ("====> rt30xxF LinkCtrlSetting = 0x%x.\n",
672 LinkCtrlSetting));
673 AsicSendCommandToMcu(pAd, 0x83, 0xff,
674 (u8)PCIePowerSaveLevel,
675 LinkCtrlSetting);
676 }
677 }
678 /* Find Ralink PCIe Device's Express Capability Offset */
679 pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
680
681 if (pos != 0) {
682 /* Ralink PCIe Device's Link Control Register Offset */
683 pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
684 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
685 &reg16);
686 Configuration = le2cpu16(reg16);
687 DBGPRINT(RT_DEBUG_TRACE,
688 ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
689 pAd->RLnkCtrlOffset, Configuration));
690 pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
691 Configuration &= 0xfefc;
692 Configuration |= (0x0);
693 #ifdef RT2860
694 if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
695 || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)) {
696 reg16 = cpu2le16(Configuration);
697 pci_write_config_word(pObj->pci_dev,
698 pAd->RLnkCtrlOffset, reg16);
699 DBGPRINT(RT_DEBUG_TRACE,
700 ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
701 pos + PCI_EXP_LNKCTL, Configuration));
702 }
703 #endif /* RT2860 // */
704
705 RTMPFindHostPCIDev(pAd);
706 if (pObj->parent_pci_dev) {
707 u16 vendor_id;
708
709 pci_read_config_word(pObj->parent_pci_dev,
710 PCI_VENDOR_ID, &vendor_id);
711 vendor_id = le2cpu16(vendor_id);
712 if (vendor_id == PCIBUS_INTEL_VENDOR) {
713 bFindIntel = TRUE;
714 RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1);
715 }
716 /* Find PCI-to-PCI Bridge Express Capability Offset */
717 pos =
718 pci_find_capability(pObj->parent_pci_dev,
719 PCI_CAP_ID_EXP);
720
721 if (pos != 0) {
722 BOOLEAN bChange = FALSE;
723 /* PCI-to-PCI Bridge Link Control Register Offset */
724 pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
725 pci_read_config_word(pObj->parent_pci_dev,
726 pAd->HostLnkCtrlOffset,
727 &reg16);
728 Configuration = le2cpu16(reg16);
729 DBGPRINT(RT_DEBUG_TRACE,
730 ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
731 pAd->HostLnkCtrlOffset,
732 Configuration));
733 pAd->HostLnkCtrlConfiguration =
734 (Configuration & 0x103);
735 Configuration &= 0xfefc;
736 Configuration |= (0x0);
737
738 switch (pObj->DeviceID) {
739 #ifdef RT2860
740 case NIC2860_PCIe_DEVICE_ID:
741 case NIC2790_PCIe_DEVICE_ID:
742 bChange = TRUE;
743 break;
744 #endif /* RT2860 // */
745 #ifdef RT3090
746 case NIC3090_PCIe_DEVICE_ID:
747 case NIC3091_PCIe_DEVICE_ID:
748 case NIC3092_PCIe_DEVICE_ID:
749 if (bFindIntel == FALSE)
750 bChange = TRUE;
751 break;
752 #endif /* RT3090 // */
753 default:
754 break;
755 }
756
757 if (bChange) {
758 reg16 = cpu2le16(Configuration);
759 pci_write_config_word(pObj->
760 parent_pci_dev,
761 pAd->
762 HostLnkCtrlOffset,
763 reg16);
764 DBGPRINT(RT_DEBUG_TRACE,
765 ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
766 pAd->HostLnkCtrlOffset,
767 Configuration));
768 }
769 } else {
770 pAd->HostLnkCtrlOffset = 0;
771 DBGPRINT(RT_DEBUG_ERROR,
772 ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n",
773 __func__));
774 }
775 }
776 } else {
777 pAd->RLnkCtrlOffset = 0;
778 pAd->HostLnkCtrlOffset = 0;
779 DBGPRINT(RT_DEBUG_ERROR,
780 ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n",
781 __func__));
782 }
783
784 if (bFindIntel == FALSE) {
785 DBGPRINT(RT_DEBUG_TRACE,
786 ("Doesn't find Intel PCI host controller. \n"));
787 /* Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff */
788 pAd->PCIePowerSaveLevel = 0xff;
789 if ((pAd->RLnkCtrlOffset != 0)
790 #ifdef RT3090
791 && ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
792 || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
793 || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
794 #endif /* RT3090 // */
795 ) {
796 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
797 &reg16);
798 Configuration = le2cpu16(reg16);
799 DBGPRINT(RT_DEBUG_TRACE,
800 ("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n",
801 pAd->RLnkCtrlOffset, Configuration));
802 pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
803 Configuration &= 0xfefc;
804 Configuration |= (0x0);
805 reg16 = cpu2le16(Configuration);
806 pci_write_config_word(pObj->pci_dev,
807 pAd->RLnkCtrlOffset, reg16);
808 DBGPRINT(RT_DEBUG_TRACE,
809 ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
810 pos + PCI_EXP_LNKCTL, Configuration));
811 }
812 }
813 }
814
815 void RTMPFindHostPCIDev(struct rt_rtmp_adapter *pAd)
816 {
817 u16 reg16;
818 u8 reg8;
819 u32 DevFn;
820 struct pci_dev *pPci_dev;
821 struct os_cookie *pObj;
822
823 pObj = (struct os_cookie *)pAd->OS_Cookie;
824
825 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
826 return;
827
828 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
829
830 pObj->parent_pci_dev = NULL;
831 if (pObj->pci_dev->bus->parent) {
832 for (DevFn = 0; DevFn < 255; DevFn++) {
833 pPci_dev =
834 pci_get_slot(pObj->pci_dev->bus->parent, DevFn);
835 if (pPci_dev) {
836 pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE,
837 &reg16);
838 reg16 = le2cpu16(reg16);
839 pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS,
840 &reg8);
841 if ((reg16 == PCI_CLASS_BRIDGE_PCI)
842 && (reg8 == pObj->pci_dev->bus->number)) {
843 pObj->parent_pci_dev = pPci_dev;
844 }
845 }
846 }
847 }
848 }
849
850 /*
851 ========================================================================
852
853 Routine Description:
854
855 Arguments:
856 Level = RESTORE_HALT : Restore PCI host and Ralink PCIe Link Control field to its default value.
857 Level = Other Value : Restore from dot11 power save or radio off status. And force PCI host Link Control fields to 0x1
858
859 ========================================================================
860 */
861 void RTMPPCIeLinkCtrlValueRestore(struct rt_rtmp_adapter *pAd, u8 Level)
862 {
863 u16 PCIePowerSaveLevel, reg16;
864 u16 Configuration;
865 struct os_cookie *pObj;
866
867 pObj = (struct os_cookie *)pAd->OS_Cookie;
868
869 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
870 return;
871
872 #ifdef RT2860
873 if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
874 || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
875 return;
876 #endif /* RT2860 // */
877 /* Check PSControl Configuration */
878 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
879 return;
880
881 /*3090 will not execute the following codes. */
882 /* Check interface : If not PCIe interface, return. */
883
884 #ifdef RT3090
885 if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
886 || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
887 || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
888 return;
889 #endif /* RT3090 // */
890
891 DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
892 PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
893 if ((PCIePowerSaveLevel & 0xff) == 0xff) {
894 DBGPRINT(RT_DEBUG_TRACE, ("return \n"));
895 return;
896 }
897
898 if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) {
899 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
900 Configuration);
901 if ((Configuration != 0) && (Configuration != 0xFFFF)) {
902 Configuration &= 0xfefc;
903 /* If call from interface down, restore to original setting. */
904 if (Level == RESTORE_CLOSE)
905 Configuration |= pAd->HostLnkCtrlConfiguration;
906 else
907 Configuration |= 0x0;
908 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev,
909 pAd->HostLnkCtrlOffset,
910 Configuration);
911 DBGPRINT(RT_DEBUG_TRACE,
912 ("Restore PCI host : offset 0x%x = 0x%x\n",
913 pAd->HostLnkCtrlOffset, Configuration));
914 } else
915 DBGPRINT(RT_DEBUG_ERROR,
916 ("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n",
917 Configuration));
918 }
919
920 if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) {
921 PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
922 Configuration);
923 if ((Configuration != 0) && (Configuration != 0xFFFF)) {
924 Configuration &= 0xfefc;
925 /* If call from interface down, restore to original setting. */
926 if (Level == RESTORE_CLOSE)
927 Configuration |= pAd->RLnkCtrlConfiguration;
928 else
929 Configuration |= 0x0;
930 PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
931 Configuration);
932 DBGPRINT(RT_DEBUG_TRACE,
933 ("Restore Ralink : offset 0x%x = 0x%x\n",
934 pAd->RLnkCtrlOffset, Configuration));
935 } else
936 DBGPRINT(RT_DEBUG_ERROR,
937 ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n",
938 Configuration));
939 }
940
941 DBGPRINT(RT_DEBUG_TRACE, ("%s <===\n", __func__));
942 }
943
944 /*
945 ========================================================================
946
947 Routine Description:
948
949 Arguments:
950 Max : limit Host PCI and Ralink PCIe device's LINK CONTROL field's value.
951 Because now frequently set our device to mode 1 or mode 3 will cause problem.
952
953 ========================================================================
954 */
955 void RTMPPCIeLinkCtrlSetting(struct rt_rtmp_adapter *pAd, u16 Max)
956 {
957 u16 PCIePowerSaveLevel, reg16;
958 u16 Configuration;
959 struct os_cookie *pObj;
960
961 pObj = (struct os_cookie *)pAd->OS_Cookie;
962
963 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
964 return;
965
966 #ifdef RT2860
967 if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
968 || (pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
969 return;
970 #endif /* RT2860 // */
971 /* Check PSControl Configuration */
972 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
973 return;
974
975 /* Check interface : If not PCIe interface, return. */
976 /*Block 3090 to enter the following function */
977
978 #ifdef RT3090
979 if ((pObj->DeviceID == NIC3090_PCIe_DEVICE_ID)
980 || (pObj->DeviceID == NIC3091_PCIe_DEVICE_ID)
981 || (pObj->DeviceID == NIC3092_PCIe_DEVICE_ID))
982 return;
983 #endif /* RT3090 // */
984 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)) {
985 DBGPRINT(RT_DEBUG_INFO,
986 ("RTMPPCIePowerLinkCtrl return on fRTMP_PS_CAN_GO_SLEEP flag\n"));
987 return;
988 }
989
990 DBGPRINT(RT_DEBUG_TRACE, ("%s===>\n", __func__));
991 PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
992 if ((PCIePowerSaveLevel & 0xff) == 0xff) {
993 DBGPRINT(RT_DEBUG_TRACE, ("return \n"));
994 return;
995 }
996 PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
997
998 /* Skip non-exist deice right away */
999 if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) {
1000 PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
1001 Configuration);
1002 switch (PCIePowerSaveLevel) {
1003 case 0:
1004 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 */
1005 Configuration &= 0xfefc;
1006 break;
1007 case 1:
1008 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 */
1009 Configuration &= 0xfefc;
1010 Configuration |= 0x1;
1011 break;
1012 case 2:
1013 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 */
1014 Configuration &= 0xfefc;
1015 Configuration |= 0x3;
1016 break;
1017 case 3:
1018 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1 */
1019 Configuration &= 0xfefc;
1020 Configuration |= 0x103;
1021 break;
1022 }
1023 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset,
1024 Configuration);
1025 DBGPRINT(RT_DEBUG_TRACE,
1026 ("Write PCI host offset 0x%x = 0x%x\n",
1027 pAd->HostLnkCtrlOffset, Configuration));
1028 }
1029
1030 if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) {
1031 /* first 2892 chip not allow to frequently set mode 3. will cause hang problem. */
1032 if (PCIePowerSaveLevel > Max)
1033 PCIePowerSaveLevel = Max;
1034
1035 PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
1036 Configuration);
1037 switch (PCIePowerSaveLevel) {
1038 case 0:
1039 /* No PCI power safe */
1040 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 . */
1041 Configuration &= 0xfefc;
1042 break;
1043 case 1:
1044 /* L0 */
1045 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 . */
1046 Configuration &= 0xfefc;
1047 Configuration |= 0x1;
1048 break;
1049 case 2:
1050 /* L0 and L1 */
1051 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 */
1052 Configuration &= 0xfefc;
1053 Configuration |= 0x3;
1054 break;
1055 case 3:
1056 /* L0 , L1 and clock management. */
1057 /* Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1 */
1058 Configuration &= 0xfefc;
1059 Configuration |= 0x103;
1060 pAd->bPCIclkOff = TRUE;
1061 break;
1062 }
1063 PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset,
1064 Configuration);
1065 DBGPRINT(RT_DEBUG_TRACE,
1066 ("Write Ralink device : offset 0x%x = 0x%x\n",
1067 pAd->RLnkCtrlOffset, Configuration));
1068 }
1069
1070 DBGPRINT(RT_DEBUG_TRACE, ("RTMPPCIePowerLinkCtrl <==============\n"));
1071 }
1072
1073 /*
1074 ========================================================================
1075
1076 Routine Description:
1077 1. Write a PCI register for rt30xx power solution 3
1078
1079 ========================================================================
1080 */
1081 void RTMPrt3xSetPCIePowerLinkCtrl(struct rt_rtmp_adapter *pAd)
1082 {
1083
1084 unsigned long HostConfiguration = 0;
1085 unsigned long Configuration;
1086 struct os_cookie *pObj;
1087 int pos;
1088 u16 reg16;
1089
1090 pObj = (struct os_cookie *)pAd->OS_Cookie;
1091
1092 DBGPRINT(RT_DEBUG_INFO,
1093 ("RTMPrt3xSetPCIePowerLinkCtrl.===> %lx\n",
1094 pAd->StaCfg.PSControl.word));
1095
1096 /* Check PSControl Configuration */
1097 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
1098 return;
1099 RTMPFindHostPCIDev(pAd);
1100 if (pObj->parent_pci_dev) {
1101 /* Find PCI-to-PCI Bridge Express Capability Offset */
1102 pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP);
1103
1104 if (pos != 0)
1105 pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
1106
1107 /* If configured to turn on L1. */
1108 HostConfiguration = 0;
1109 if (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1) {
1110 DBGPRINT(RT_DEBUG_TRACE, ("Enter,PSM : Force ASPM\n"));
1111
1112 /* Skip non-exist device right away */
1113 if ((pAd->HostLnkCtrlOffset != 0)) {
1114 PCI_REG_READ_WORD(pObj->parent_pci_dev,
1115 pAd->HostLnkCtrlOffset,
1116 HostConfiguration);
1117 /* Prepare Configuration to write to Host */
1118 HostConfiguration |= 0x3;
1119 PCI_REG_WIRTE_WORD(pObj->parent_pci_dev,
1120 pAd->HostLnkCtrlOffset,
1121 HostConfiguration);
1122 pAd->Rt3xxHostLinkCtrl = HostConfiguration;
1123 /* Because in rt30xxForceASPMTest Mode, Force turn on L0s, L1. */
1124 /* Fix HostConfiguration bit0:1 = 0x3 for later use. */
1125 HostConfiguration = 0x3;
1126 DBGPRINT(RT_DEBUG_TRACE,
1127 ("PSM : Force ASPM : "
1128 "Host device L1/L0s Value = 0x%lx\n",
1129 HostConfiguration));
1130 }
1131 } else if (pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM ==
1132 1) {
1133
1134 /* Skip non-exist deice right away */
1135 if ((pAd->HostLnkCtrlOffset != 0)) {
1136 PCI_REG_READ_WORD(pObj->parent_pci_dev,
1137 pAd->HostLnkCtrlOffset,
1138 HostConfiguration);
1139 pAd->Rt3xxHostLinkCtrl = HostConfiguration;
1140 HostConfiguration &= 0x3;
1141 DBGPRINT(RT_DEBUG_TRACE,
1142 ("PSM : Follow Host ASPM : "
1143 "Host device L1/L0s Value = 0x%lx\n",
1144 HostConfiguration));
1145 }
1146 }
1147 }
1148 /* Prepare to write Ralink setting. */
1149 /* Find Ralink PCIe Device's Express Capability Offset */
1150 pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
1151
1152 if (pos != 0) {
1153 /* Ralink PCIe Device's Link Control Register Offset */
1154 pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
1155 pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
1156 &reg16);
1157 Configuration = le2cpu16(reg16);
1158 DBGPRINT(RT_DEBUG_TRACE,
1159 ("Read (Ralink PCIe Link Control Register) "
1160 "offset 0x%x = 0x%lx\n",
1161 pAd->RLnkCtrlOffset, Configuration));
1162 Configuration |= 0x100;
1163 if ((pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1)
1164 || (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1)) {
1165 switch (HostConfiguration) {
1166 case 0:
1167 Configuration &= 0xffffffc;
1168 break;
1169 case 1:
1170 Configuration &= 0xffffffc;
1171 Configuration |= 0x1;
1172 break;
1173 case 2:
1174 Configuration &= 0xffffffc;
1175 Configuration |= 0x2;
1176 break;
1177 case 3:
1178 Configuration |= 0x3;
1179 break;
1180 }
1181 }
1182 reg16 = cpu2le16(Configuration);
1183 pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset,
1184 reg16);
1185 pAd->Rt3xxRalinkLinkCtrl = Configuration;
1186 DBGPRINT(RT_DEBUG_TRACE,
1187 ("PSM :Write Ralink device L1/L0s Value = 0x%lx\n",
1188 Configuration));
1189 }
1190 DBGPRINT(RT_DEBUG_INFO,
1191 ("PSM :RTMPrt3xSetPCIePowerLinkCtrl <==============\n"));
1192 }