194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/******************************************************************************
294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Based on the r8180 driver, which is:
594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * This program is free software; you can redistribute it and/or modify it
794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * under the terms of version 2 of the GNU General Public License as
894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * published by the Free Software Foundation.
994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
1094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
1194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * more details.
1494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
1594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * You should have received a copy of the GNU General Public License along with
1694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * this program; if not, write to the Free Software Foundation, Inc.,
1794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
1894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
1994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * The full GNU General Public License is included in this distribution in the
2094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * file called LICENSE.
2194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
2294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Contact Information:
2394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * wlanfae <wlanfae@realtek.com>
2494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *****************************************************************************/
2594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_pci.h"
2694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_core.h"
2794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
2862f27cc4ae4183e9ee4e562eae60101966014f58Larry Fingerstatic void rtl8192_parse_pci_configuration(struct pci_dev *pdev,
2962f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger					    struct net_device *dev)
3094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
3194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
3294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
3394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 tmp;
3494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	int pos;
3594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 LinkCtrlReg;
3694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
3794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pos = pci_find_capability(priv->pdev, PCI_CAP_ID_EXP);
3894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pci_read_config_byte(priv->pdev, pos + PCI_EXP_LNKCTL, &LinkCtrlReg);
3994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->NdisAdapter.LinkCtrlReg = LinkCtrlReg;
4094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
4162f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger	RT_TRACE(COMP_INIT, "Link Control Register =%x\n",
4262f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger		 priv->NdisAdapter.LinkCtrlReg);
4394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
4494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pci_read_config_byte(pdev, 0x98, &tmp);
4562f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger	tmp |= BIT4;
4694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pci_write_config_byte(pdev, 0x98, tmp);
4794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
4894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	tmp = 0x17;
4994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pci_write_config_byte(pdev, 0x70f, tmp);
5094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
5194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
5294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool rtl8192_pci_findadapter(struct pci_dev *pdev, struct net_device *dev)
5394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
5494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
5594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u16 VenderID;
5694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u16 DeviceID;
5794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8  RevisionID;
5894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u16 IrqLine;
5994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
6094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	VenderID = pdev->vendor;
6194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	DeviceID = pdev->device;
6294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RevisionID = pdev->revision;
6394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pci_read_config_word(pdev, 0x3C, &IrqLine);
6494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
6594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->card_8192 = priv->ops->nic_type;
6694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
6794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (DeviceID == 0x8172) {
6894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch (RevisionID) {
6994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HAL_HW_PCI_REVISION_ID_8192PCIE:
7062f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger			printk(KERN_INFO "Adapter(8192 PCI-E) is found - "
7162f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger			       "DeviceID=%x\n", DeviceID);
7294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->card_8192 = NIC_8192E;
7394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
7494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HAL_HW_PCI_REVISION_ID_8192SE:
7562f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger			printk(KERN_INFO "Adapter(8192SE) is found - "
7662f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger			       "DeviceID=%x\n", DeviceID);
7794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->card_8192 = NIC_8192SE;
7894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
7994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
8062f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger			printk(KERN_INFO "UNKNOWN nic type(%4x:%4x)\n",
8162f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger			       pdev->vendor, pdev->device);
8294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->card_8192 = NIC_UNKNOWN;
8394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
8494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
8594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
8694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
8794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->ops->nic_type != priv->card_8192) {
8862f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger		printk(KERN_INFO "Detect info(%x) and hardware info(%x) not match!\n",
8994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->ops->nic_type, priv->card_8192);
9062f27cc4ae4183e9ee4e562eae60101966014f58Larry Finger		printk(KERN_INFO "Please select proper driver before install!!!!\n");
9194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
9294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
9394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
9494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_parse_pci_configuration(pdev, dev);
9594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
9694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return true;
9794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
98