From 5cd8b9689287b5b4cd2dbe2402072f306f9752a1 Mon Sep 17 00:00:00 2001 From: Matt Carlson Date: Wed, 24 Nov 2010 08:31:48 +0000 Subject: [PATCH] --- yaml --- r: 224479 b: refs/heads/master c: cf79003d598b1f82a4caa0564107283b4f560e14 h: refs/heads/master i: 224477: a3104ca527bdf1e9cbaa21a6680b5c32b728f71e 224475: 38d90ac27d218cdfa20e2ea90672da9e44840195 224471: dfeb548ec14b45a3d2dce1fc7b92f87dcfd0b52d 224463: f9415629e7d5a0f8205a179dace8717bfbb25ba0 224447: b026b34d03327b8d76bcea00c0c305d93124fdaa v: v3 --- [refs] | 2 +- trunk/drivers/net/tg3.c | 44 ++++++++++++++++++++++++++++++++++++++--- trunk/drivers/net/tg3.h | 1 + 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 9123d7aa6686..e29a0de6fdc3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d2394e6bb1aa636f3bd142cb6f7845a4332514b5 +refs/heads/master: cf79003d598b1f82a4caa0564107283b4f560e14 diff --git a/trunk/drivers/net/tg3.c b/trunk/drivers/net/tg3.c index 2624d714d16e..226e60dfaeaf 100644 --- a/trunk/drivers/net/tg3.c +++ b/trunk/drivers/net/tg3.c @@ -6985,7 +6985,7 @@ static void tg3_restore_pci_state(struct tg3 *tp) if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785) { if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) - pcie_set_readrq(tp->pdev, 4096); + pcie_set_readrq(tp->pdev, tp->pcie_readrq); else { pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE, tp->pci_cacheline_sz); @@ -7179,7 +7179,7 @@ static int tg3_chip_reset(struct tg3 *tp) tp->pcie_cap + PCI_EXP_DEVCTL, val16); - pcie_set_readrq(tp->pdev, 4096); + pcie_set_readrq(tp->pdev, tp->pcie_readrq); /* Clear error status */ pci_write_config_word(tp->pdev, @@ -13366,7 +13366,45 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; - pcie_set_readrq(tp->pdev, 4096); + tp->pcie_readrq = 4096; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) { + u16 word; + + pci_read_config_word(tp->pdev, + tp->pcie_cap + PCI_EXP_LNKSTA, + &word); + switch (word & PCI_EXP_LNKSTA_CLS) { + case PCI_EXP_LNKSTA_CLS_2_5GB: + word &= PCI_EXP_LNKSTA_NLW; + word >>= PCI_EXP_LNKSTA_NLW_SHIFT; + switch (word) { + case 2: + tp->pcie_readrq = 2048; + break; + case 4: + tp->pcie_readrq = 1024; + break; + } + break; + + case PCI_EXP_LNKSTA_CLS_5_0GB: + word &= PCI_EXP_LNKSTA_NLW; + word >>= PCI_EXP_LNKSTA_NLW_SHIFT; + switch (word) { + case 1: + tp->pcie_readrq = 2048; + break; + case 2: + tp->pcie_readrq = 1024; + break; + case 4: + tp->pcie_readrq = 512; + break; + } + } + } + + pcie_set_readrq(tp->pdev, tp->pcie_readrq); pci_read_config_word(tp->pdev, tp->pcie_cap + PCI_EXP_LNKCTL, diff --git a/trunk/drivers/net/tg3.h b/trunk/drivers/net/tg3.h index 06a4e7e8fff3..410703684e39 100644 --- a/trunk/drivers/net/tg3.h +++ b/trunk/drivers/net/tg3.h @@ -2948,6 +2948,7 @@ struct tg3 { int pcix_cap; int pcie_cap; }; + int pcie_readrq; struct mii_bus *mdio_bus; int mdio_irq[PHY_MAX_ADDR];