--- /dev/null
+diff -Nurb linux-2.6.32-27.planetlab.i686/drivers/net/tg3.c ../kernel-2.6/linux-2.6.32-27.planetlab.i686/drivers/net/tg3.c
+--- linux-2.6.32-27.planetlab.i686/drivers/net/tg3.c 2011-05-10 14:38:09.000000000 -0400
++++ ../kernel-2.6/linux-2.6.32-27.planetlab.i686/drivers/net/tg3.c 2012-05-01 10:09:30.502846530 -0400
+@@ -103,14 +103,12 @@
+ * them in the NIC onboard memory.
+ */
+ #define TG3_RX_STD_RING_SIZE(tp) \
+- ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 || \
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) ? \
+- RX_STD_MAX_SIZE_5717 : 512)
++ ((tp->tg3_flags3 & TG3_FLG3_LRG_PROD_RING_CAP) ? \
++ TG3_RX_STD_MAX_SIZE_5717 : TG3_RX_STD_MAX_SIZE_5700)
+ #define TG3_DEF_RX_RING_PENDING 200
+ #define TG3_RX_JMB_RING_SIZE(tp) \
+- ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 || \
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) ? \
+- 1024 : 256)
++ ((tp->tg3_flags3 & TG3_FLG3_LRG_PROD_RING_CAP) ? \
++ TG3_RX_JMB_MAX_SIZE_5717 : TG3_RX_JMB_MAX_SIZE_5700)
+ #define TG3_DEF_RX_JUMBO_RING_PENDING 100
+ #define TG3_RSS_INDIR_TBL_SIZE 128
+
+@@ -276,6 +274,7 @@
+ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57791)},
+ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57795)},
+ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)},
++ {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)},
+ {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)},
+ {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)},
+ {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)},
+@@ -1090,8 +1089,7 @@
+ u32 reg;
+ struct phy_device *phydev;
+
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
++ if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
+ u32 is_serdes;
+
+ tp->phy_addr = PCI_FUNC(tp->pdev->devfn) + 1;
+@@ -1669,8 +1667,7 @@
+ u32 reg;
+
+ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
+- ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) &&
++ ((tp->tg3_flags3 & TG3_FLG3_5717_PLUS) &&
+ (tp->phy_flags & TG3_PHYFLG_MII_SERDES)))
+ return;
+
+@@ -2080,8 +2077,7 @@
+ }
+ }
+
+- if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) &&
++ if ((tp->tg3_flags3 & TG3_FLG3_5717_PLUS) &&
+ (tp->phy_flags & TG3_PHYFLG_MII_SERDES))
+ return 0;
+
+@@ -2167,7 +2163,8 @@
+
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) {
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717) ||
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720))
+ struct net_device *dev_peer;
+
+ dev_peer = pci_get_drvdata(tp->pdev_peer);
+@@ -4431,6 +4428,7 @@
+
+ static int tg3_setup_phy(struct tg3 *tp, int force_reset)
+ {
++ u32 val;
+ int err;
+
+ if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
+@@ -4441,7 +4439,7 @@
+ err = tg3_setup_copper_phy(tp, force_reset);
+
+ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX) {
+- u32 val, scale;
++ u32 scale;
+
+ val = tr32(TG3_CPMU_CLCK_STAT) & CPMU_CLCK_STAT_MAC_CLCK_MASK;
+ if (val == CPMU_CLCK_STAT_MAC_CLCK_62_5)
+@@ -4456,17 +4454,20 @@
+ tw32(GRC_MISC_CFG, val);
+ }
+
++ val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
++ (6 << TX_LENGTHS_IPG_SHIFT);
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
++ val |= tr32(MAC_TX_LENGTHS) &
++ (TX_LENGTHS_JMB_FRM_LEN_MSK |
++ TX_LENGTHS_CNT_DWN_VAL_MSK);
++
+ if (tp->link_config.active_speed == SPEED_1000 &&
+ tp->link_config.active_duplex == DUPLEX_HALF)
+- tw32(MAC_TX_LENGTHS,
+- ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
+- (6 << TX_LENGTHS_IPG_SHIFT) |
+- (0xff << TX_LENGTHS_SLOT_TIME_SHIFT)));
++ tw32(MAC_TX_LENGTHS, val |
++ (0xff << TX_LENGTHS_SLOT_TIME_SHIFT));
+ else
+- tw32(MAC_TX_LENGTHS,
+- ((2 << TX_LENGTHS_IPG_CRS_SHIFT) |
+- (6 << TX_LENGTHS_IPG_SHIFT) |
+- (32 << TX_LENGTHS_SLOT_TIME_SHIFT)));
++ tw32(MAC_TX_LENGTHS, val |
++ (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
+
+ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) {
+ if (netif_carrier_ok(tp->dev)) {
+@@ -4478,7 +4479,7 @@
+ }
+
+ if (tp->tg3_flags & TG3_FLAG_ASPM_WORKAROUND) {
+- u32 val = tr32(PCIE_PWR_MGMT_THRESH);
++ val = tr32(PCIE_PWR_MGMT_THRESH);
+ if (!netif_carrier_ok(tp->dev))
+ val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK) |
+ tp->pwrmgmt_thresh;
+@@ -7085,7 +7086,7 @@
+ if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
+ /* Force PCIe 1.0a mode */
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785 &&
+- !(tp->tg3_flags3 & TG3_FLG3_5717_PLUS) &&
++ !(tp->tg3_flags3 & TG3_FLG3_57765_PLUS) &&
+ tr32(TG3_PCIE_PHY_TSTCTL) ==
+ (TG3_PCIE_PHY_TSTCTL_PCIE10 | TG3_PCIE_PHY_TSTCTL_PSCRAM))
+ tw32(TG3_PCIE_PHY_TSTCTL, TG3_PCIE_PHY_TSTCTL_PSCRAM);
+@@ -7236,12 +7237,17 @@
+ if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
+ tp->pci_chip_rev_id != CHIPREV_ID_5750_A0 &&
+ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785 &&
+- !(tp->tg3_flags3 & TG3_FLG3_5717_PLUS)) {
++ !(tp->tg3_flags3 & TG3_FLG3_57765_PLUS)) {
+ val = tr32(0x7c00);
+
+ tw32(0x7c00, val | (1 << 25));
+ }
+
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) {
++ val = tr32(TG3_CPMU_CLCK_ORIDE);
++ tw32(TG3_CPMU_CLCK_ORIDE, val & ~CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
++ }
++
+ /* Reprobe ASF enable state. */
+ tp->tg3_flags &= ~TG3_FLAG_ENABLE_ASF;
+ tp->tg3_flags2 &= ~TG3_FLG2_ASF_NEW_HANDSHAKE;
+@@ -7659,6 +7665,8 @@
+ /* Disable all transmit rings but the first. */
+ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
+ limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 16;
++ else if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)
++ limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 4;
+ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765)
+ limit = NIC_SRAM_SEND_RCB + TG3_BDINFO_SIZE * 2;
+ else
+@@ -7671,8 +7679,7 @@
+
+
+ /* Disable all receive return rings but the first. */
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
++ if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)
+ limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 17;
+ else if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
+ limit = NIC_SRAM_RCV_RET_RCB + TG3_BDINFO_SIZE * 16;
+@@ -7943,7 +7950,7 @@
+ if (err)
+ return err;
+
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS) {
+ val = tr32(TG3PCI_DMA_RW_CTRL) &
+ ~DMA_RWCTRL_DIS_CACHE_ALIGNMENT;
+ if (tp->pci_chip_rev_id == CHIPREV_ID_57765_A0)
+@@ -8074,8 +8081,7 @@
+ ((u64) tpr->rx_std_mapping >> 32));
+ tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
+ ((u64) tpr->rx_std_mapping & 0xffffffff));
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5717 &&
+- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5719)
++ if (!(tp->tg3_flags3 & TG3_FLG3_5717_PLUS))
+ tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
+ NIC_SRAM_RX_BUFFER_DESC);
+
+@@ -8097,9 +8103,10 @@
+ ((u64) tpr->rx_jmb_mapping >> 32));
+ tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
+ ((u64) tpr->rx_jmb_mapping & 0xffffffff));
++ val = TG3_RX_JMB_RING_SIZE(tp) <<
++ BDINFO_FLAGS_MAXLEN_SHIFT;
+ tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
+- (RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT) |
+- BDINFO_FLAGS_USE_EXT_RECV);
++ val | BDINFO_FLAGS_USE_EXT_RECV);
+ if (!(tp->tg3_flags3 & TG3_FLG3_USE_JUMBO_BDFLAG) ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765)
+ tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
+@@ -8109,17 +8116,17 @@
+ BDINFO_FLAGS_DISABLED);
+ }
+
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS) {
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765)
+- val = RX_STD_MAX_SIZE_5705;
++ val = TG3_RX_STD_MAX_SIZE_5700;
+ else
+- val = RX_STD_MAX_SIZE_5717;
++ val = TG3_RX_STD_MAX_SIZE_5717;
+ val <<= BDINFO_FLAGS_MAXLEN_SHIFT;
+ val |= (TG3_RX_STD_DMA_SZ << 2);
+ } else
+ val = TG3_RX_STD_DMA_SZ << BDINFO_FLAGS_MAXLEN_SHIFT;
+ } else
+- val = RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT;
++ val = TG3_RX_STD_MAX_SIZE_5700 << BDINFO_FLAGS_MAXLEN_SHIFT;
+
+ tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, val);
+
+@@ -8130,7 +8137,7 @@
+ tp->rx_jumbo_pending : 0;
+ tw32_rx_mbox(TG3_RX_JMB_PROD_IDX_REG, tpr->rx_jmb_prod_idx);
+
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS) {
+ tw32(STD_REPLENISH_LWM, 32);
+ tw32(JMB_REPLENISH_LWM, 16);
+ }
+@@ -8147,10 +8154,16 @@
+ /* The slot time is changed by tg3_setup_phy if we
+ * run at gigabit with half duplex.
+ */
+- tw32(MAC_TX_LENGTHS,
+- (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
++ val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
+ (6 << TX_LENGTHS_IPG_SHIFT) |
+- (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
++ (32 << TX_LENGTHS_SLOT_TIME_SHIFT);
++
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
++ val |= tr32(MAC_TX_LENGTHS) &
++ (TX_LENGTHS_JMB_FRM_LEN_MSK |
++ TX_LENGTHS_CNT_DWN_VAL_MSK);
++
++ tw32(MAC_TX_LENGTHS, val);
+
+ /* Receive rules. */
+ tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS);
+@@ -8199,13 +8212,17 @@
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780)
+ rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN;
+
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
++ rdmac_mode |= tr32(RDMAC_MODE) & RDMAC_MODE_H2BNC_VLAN_DET;
++
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
+- (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)) {
++ (tp->tg3_flags3 & TG3_FLG3_57765_PLUS)) {
+ val = tr32(TG3_RDMA_RSRVCTRL_REG);
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) {
+ val &= ~TG3_RDMA_RSRVCTRL_TXMRGN_MASK;
+ val |= TG3_RDMA_RSRVCTRL_TXMRGN_320B;
+ }
+@@ -8213,7 +8230,8 @@
+ val | TG3_RDMA_RSRVCTRL_FIFO_OFLW_FIX);
+ }
+
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) {
+ val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL);
+ tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val |
+ TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K |
+@@ -8403,8 +8421,7 @@
+ tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE);
+ tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB);
+ val = RCVDBDI_MODE_ENABLE | RCVDBDI_MODE_INV_RING_SZ;
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
++ if (tp->tg3_flags3 & TG3_FLG3_LRG_PROD_RING_CAP)
+ val |= RCVDBDI_MODE_LRG_RING_SZ;
+ tw32(RCVDBDI_MODE, val);
+ tw32(SNDDATAI_MODE, SNDDATAI_MODE_ENABLE);
+@@ -8429,9 +8446,17 @@
+ }
+
+ tp->tx_mode = TX_MODE_ENABLE;
++
+ if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
+ tp->tx_mode |= TX_MODE_MBUF_LOCKUP_FIX;
++
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) {
++ val = TX_MODE_JMB_FRM_LEN | TX_MODE_CNT_DN_MODE;
++ tp->tx_mode &= ~val;
++ tp->tx_mode |= tr32(MAC_TX_MODE) & val;
++ }
++
+ tw32_f(MAC_TX_MODE, tp->tx_mode);
+ udelay(100);
+
+@@ -8850,7 +8875,7 @@
+ * Turn off MSI one shot mode. Otherwise this test has no
+ * observable way to know whether the interrupt was delivered.
+ */
+- if ((tp->tg3_flags3 & TG3_FLG3_5717_PLUS) &&
++ if ((tp->tg3_flags3 & TG3_FLG3_57765_PLUS) &&
+ (tp->tg3_flags2 & TG3_FLG2_USING_MSI)) {
+ val = tr32(MSGINT_MODE) | MSGINT_MODE_ONE_SHOT_DISABLE;
+ tw32(MSGINT_MODE, val);
+@@ -8893,7 +8918,7 @@
+
+ if (intr_ok) {
+ /* Reenable MSI one shot mode. */
+- if ((tp->tg3_flags3 & TG3_FLG3_5717_PLUS) &&
++ if ((tp->tg3_flags3 & TG3_FLG3_57765_PLUS) &&
+ (tp->tg3_flags2 & TG3_FLG2_USING_MSI)) {
+ val = tr32(MSGINT_MODE) & ~MSGINT_MODE_ONE_SHOT_DISABLE;
+ tw32(MSGINT_MODE, val);
+@@ -9034,7 +9059,9 @@
+ tp->dev->real_num_tx_queues = 1;
+ if (tp->irq_cnt > 1) {
+ tp->tg3_flags3 |= TG3_FLG3_ENABLE_RSS;
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
++
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) {
+ tp->tg3_flags3 |= TG3_FLG3_ENABLE_TSS;
+ netif_set_real_num_tx_queues(tp->dev, tp->irq_cnt - 1);
+ }
+@@ -9186,7 +9213,7 @@
+ goto err_out2;
+ }
+
+- if (!(tp->tg3_flags3 & TG3_FLG3_5717_PLUS) &&
++ if (!(tp->tg3_flags3 & TG3_FLG3_57765_PLUS) &&
+ (tp->tg3_flags2 & TG3_FLG2_USING_MSI)) {
+ u32 val = tr32(PCIE_TRANSACTION_CFG);
+
+@@ -10796,8 +10823,7 @@
+ int err = 0;
+ int i;
+
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
++ if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)
+ mem_tbl = mem_tbl_5717;
+ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765)
+ mem_tbl = mem_tbl_57765;
+@@ -11788,6 +11814,8 @@
+
+ switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
+ case FLASH_5717VENDOR_ATMEL_MDB021D:
++ /* Detect size with tg3_nvram_get_size() */
++ break;
+ case FLASH_5717VENDOR_ATMEL_ADB021B:
+ case FLASH_5717VENDOR_ATMEL_ADB021D:
+ tp->nvram_size = TG3_NVRAM_SIZE_256KB;
+@@ -11813,8 +11841,10 @@
+
+ switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
+ case FLASH_5717VENDOR_ST_M_M25PE20:
+- case FLASH_5717VENDOR_ST_A_M25PE20:
+ case FLASH_5717VENDOR_ST_M_M45PE20:
++ /* Detect size with tg3_nvram_get_size() */
++ break;
++ case FLASH_5717VENDOR_ST_A_M25PE20:
+ case FLASH_5717VENDOR_ST_A_M45PE20:
+ tp->nvram_size = TG3_NVRAM_SIZE_256KB;
+ break;
+@@ -11833,6 +11863,118 @@
+ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS;
+ }
+
++static void __devinit tg3_get_5720_nvram_info(struct tg3 *tp)
++{
++ u32 nvcfg1, nvmpinstrp;
++
++ nvcfg1 = tr32(NVRAM_CFG1);
++ nvmpinstrp = nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK;
++
++ switch (nvmpinstrp) {
++ case FLASH_5720_EEPROM_HD:
++ case FLASH_5720_EEPROM_LD:
++ tp->nvram_jedecnum = JEDEC_ATMEL;
++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
++
++ nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
++ tw32(NVRAM_CFG1, nvcfg1);
++ if (nvmpinstrp == FLASH_5720_EEPROM_HD)
++ tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
++ else
++ tp->nvram_pagesize = ATMEL_AT24C02_CHIP_SIZE;
++ return;
++ case FLASH_5720VENDOR_M_ATMEL_DB011D:
++ case FLASH_5720VENDOR_A_ATMEL_DB011B:
++ case FLASH_5720VENDOR_A_ATMEL_DB011D:
++ case FLASH_5720VENDOR_M_ATMEL_DB021D:
++ case FLASH_5720VENDOR_A_ATMEL_DB021B:
++ case FLASH_5720VENDOR_A_ATMEL_DB021D:
++ case FLASH_5720VENDOR_M_ATMEL_DB041D:
++ case FLASH_5720VENDOR_A_ATMEL_DB041B:
++ case FLASH_5720VENDOR_A_ATMEL_DB041D:
++ case FLASH_5720VENDOR_M_ATMEL_DB081D:
++ case FLASH_5720VENDOR_A_ATMEL_DB081D:
++ case FLASH_5720VENDOR_ATMEL_45USPT:
++ tp->nvram_jedecnum = JEDEC_ATMEL;
++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
++ tp->tg3_flags2 |= TG3_FLG2_FLASH;
++
++ switch (nvmpinstrp) {
++ case FLASH_5720VENDOR_M_ATMEL_DB021D:
++ case FLASH_5720VENDOR_A_ATMEL_DB021B:
++ case FLASH_5720VENDOR_A_ATMEL_DB021D:
++ tp->nvram_size = TG3_NVRAM_SIZE_256KB;
++ break;
++ case FLASH_5720VENDOR_M_ATMEL_DB041D:
++ case FLASH_5720VENDOR_A_ATMEL_DB041B:
++ case FLASH_5720VENDOR_A_ATMEL_DB041D:
++ tp->nvram_size = TG3_NVRAM_SIZE_512KB;
++ break;
++ case FLASH_5720VENDOR_M_ATMEL_DB081D:
++ case FLASH_5720VENDOR_A_ATMEL_DB081D:
++ tp->nvram_size = TG3_NVRAM_SIZE_1MB;
++ break;
++ default:
++ tp->nvram_size = TG3_NVRAM_SIZE_128KB;
++ break;
++ }
++ break;
++ case FLASH_5720VENDOR_M_ST_M25PE10:
++ case FLASH_5720VENDOR_M_ST_M45PE10:
++ case FLASH_5720VENDOR_A_ST_M25PE10:
++ case FLASH_5720VENDOR_A_ST_M45PE10:
++ case FLASH_5720VENDOR_M_ST_M25PE20:
++ case FLASH_5720VENDOR_M_ST_M45PE20:
++ case FLASH_5720VENDOR_A_ST_M25PE20:
++ case FLASH_5720VENDOR_A_ST_M45PE20:
++ case FLASH_5720VENDOR_M_ST_M25PE40:
++ case FLASH_5720VENDOR_M_ST_M45PE40:
++ case FLASH_5720VENDOR_A_ST_M25PE40:
++ case FLASH_5720VENDOR_A_ST_M45PE40:
++ case FLASH_5720VENDOR_M_ST_M25PE80:
++ case FLASH_5720VENDOR_M_ST_M45PE80:
++ case FLASH_5720VENDOR_A_ST_M25PE80:
++ case FLASH_5720VENDOR_A_ST_M45PE80:
++ case FLASH_5720VENDOR_ST_25USPT:
++ case FLASH_5720VENDOR_ST_45USPT:
++ tp->nvram_jedecnum = JEDEC_ST;
++ tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
++ tp->tg3_flags2 |= TG3_FLG2_FLASH;
++
++ switch (nvmpinstrp) {
++ case FLASH_5720VENDOR_M_ST_M25PE20:
++ case FLASH_5720VENDOR_M_ST_M45PE20:
++ case FLASH_5720VENDOR_A_ST_M25PE20:
++ case FLASH_5720VENDOR_A_ST_M45PE20:
++ tp->nvram_size = TG3_NVRAM_SIZE_256KB;
++ break;
++ case FLASH_5720VENDOR_M_ST_M25PE40:
++ case FLASH_5720VENDOR_M_ST_M45PE40:
++ case FLASH_5720VENDOR_A_ST_M25PE40:
++ case FLASH_5720VENDOR_A_ST_M45PE40:
++ tp->nvram_size = TG3_NVRAM_SIZE_512KB;
++ break;
++ case FLASH_5720VENDOR_M_ST_M25PE80:
++ case FLASH_5720VENDOR_M_ST_M45PE80:
++ case FLASH_5720VENDOR_A_ST_M25PE80:
++ case FLASH_5720VENDOR_A_ST_M45PE80:
++ tp->nvram_size = TG3_NVRAM_SIZE_1MB;
++ break;
++ default:
++ tp->nvram_size = TG3_NVRAM_SIZE_128KB;
++ break;
++ }
++ break;
++ default:
++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM;
++ return;
++ }
++
++ tg3_nvram_get_pagesize(tp, nvcfg1);
++ if (tp->nvram_pagesize != 264 && tp->nvram_pagesize != 528)
++ tp->tg3_flags3 |= TG3_FLG3_NO_NVRAM_ADDR_TRANS;
++}
++
+ /* Chips other than 5700/5701 use the NVRAM for fetching info. */
+ static void __devinit tg3_nvram_init(struct tg3 *tp)
+ {
+@@ -11880,6 +12022,8 @@
+ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
+ tg3_get_5717_nvram_info(tp);
++ else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
++ tg3_get_5720_nvram_info(tp);
+ else
+ tg3_get_nvram_info(tp);
+
+@@ -12417,7 +12561,7 @@
+ if (cfg2 & (1 << 18))
+ tp->phy_flags |= TG3_PHYFLG_SERDES_PREEMPHASIS;
+
+- if (((tp->tg3_flags3 & TG3_FLG3_5717_PLUS) ||
++ if (((tp->tg3_flags3 & TG3_FLG3_57765_PLUS) ||
+ ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
+ GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX))) &&
+ (cfg2 & NIC_SRAM_DATA_CFG_2_APD_EN))
+@@ -12425,7 +12569,7 @@
+
+ if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
+ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785 &&
+- !(tp->tg3_flags3 & TG3_FLG3_5717_PLUS)) {
++ !(tp->tg3_flags3 & TG3_FLG3_57765_PLUS)) {
+ u32 cfg3;
+
+ tg3_read_mem(tp, NIC_SRAM_DATA_CFG_3, &cfg3);
+@@ -13029,14 +13173,13 @@
+
+ static inline u32 tg3_rx_ret_ring_size(struct tg3 *tp)
+ {
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719)
+- return 4096;
++ if (tp->tg3_flags3 & TG3_FLG3_LRG_PROD_RING_CAP)
++ return TG3_RX_RET_MAX_SIZE_5717;
+ else if ((tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) &&
+ !(tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
+- return 1024;
++ return TG3_RX_RET_MAX_SIZE_5700;
+ else
+- return 512;
++ return TG3_RX_RET_MAX_SIZE_5705;
+ }
+
+ static int __devinit tg3_get_invariants(struct tg3 *tp)
+@@ -13084,6 +13227,7 @@
+ if (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 ||
+ tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||
+ tp->pdev->device == TG3PCI_DEVICE_TIGON3_5724 ||
++ tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||
+ tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719)
+ pci_read_config_dword(tp->pdev,
+ TG3PCI_GEN2_PRODID_ASICREV,
+@@ -13239,14 +13383,19 @@
+
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717)
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
+ tp->pdev_peer = tg3_find_peer(tp);
+
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765)
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
+ tp->tg3_flags3 |= TG3_FLG3_5717_PLUS;
+
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765 ||
++ (tp->tg3_flags3 & TG3_FLG3_5717_PLUS))
++ tp->tg3_flags3 |= TG3_FLG3_57765_PLUS;
++
+ /* Intentionally exclude ASIC_REV_5906 */
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
+@@ -13254,7 +13403,7 @@
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
+- (tp->tg3_flags3 & TG3_FLG3_5717_PLUS))
++ (tp->tg3_flags3 & TG3_FLG3_57765_PLUS))
+ tp->tg3_flags3 |= TG3_FLG3_5755_PLUS;
+
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
+@@ -13284,7 +13433,7 @@
+ }
+
+ /* Determine TSO capabilities */
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS)
+ tp->tg3_flags2 |= TG3_FLG2_HW_TSO_3;
+ else if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
+@@ -13320,7 +13469,7 @@
+ tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI;
+ }
+
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS) {
+ tp->tg3_flags |= TG3_FLAG_SUPPORT_MSIX;
+ tp->irq_max = TG3_IRQ_MAX_VECS;
+ }
+@@ -13336,6 +13485,9 @@
+ }
+
+ if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)
++ tp->tg3_flags3 |= TG3_FLG3_LRG_PROD_RING_CAP;
++
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS)
+ tp->tg3_flags3 |= TG3_FLG3_USE_JUMBO_BDFLAG;
+
+ if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ||
+@@ -13353,7 +13505,8 @@
+ tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS;
+
+ tp->pcie_readrq = 4096;
+- if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
++ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) {
+ u16 word;
+
+ pci_read_config_word(tp->pdev,
+@@ -13574,7 +13727,7 @@
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
+- (tp->tg3_flags3 & TG3_FLG3_5717_PLUS))
++ (tp->tg3_flags3 & TG3_FLG3_57765_PLUS))
+ tp->tg3_flags |= TG3_FLAG_CPMU_PRESENT;
+
+ /* Set up tp->grc_local_ctrl before calling tg3_set_power_state().
+@@ -13653,7 +13806,7 @@
+ !(tp->phy_flags & TG3_PHYFLG_IS_FET) &&
+ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5785 &&
+ GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_57780 &&
+- !(tp->tg3_flags3 & TG3_FLG3_5717_PLUS)) {
++ !(tp->tg3_flags3 & TG3_FLG3_57765_PLUS)) {
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
+@@ -13694,7 +13847,15 @@
+
+ /* Initialize data/descriptor byte/word swapping. */
+ val = tr32(GRC_MODE);
++ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
++ val &= (GRC_MODE_BYTE_SWAP_B2HRX_DATA |
++ GRC_MODE_WORD_SWAP_B2HRX_DATA |
++ GRC_MODE_B2HRX_ENABLE |
++ GRC_MODE_HTX2B_ENABLE |
++ GRC_MODE_HOST_STACKUP);
++ else
+ val &= GRC_MODE_HOST_STACKUP;
++
+ tw32(GRC_MODE, val | tp->grc_mode);
+
+ tg3_switch_clocks(tp);
+@@ -13900,8 +14061,7 @@
+ tw32_f(NVRAM_CMD, NVRAM_CMD_RESET);
+ else
+ tg3_nvram_unlock(tp);
+- } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
+- GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
++ } else if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
+ if (PCI_FUNC(tp->pdev->devfn) & 1)
+ mac_offset = 0xcc;
+ if (PCI_FUNC(tp->pdev->devfn) > 1)
+@@ -13990,7 +14150,7 @@
+ #endif
+ #endif
+
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS) {
+ val = goal ? 0 : DMA_RWCTRL_DIS_CACHE_ALIGNMENT;
+ goto out;
+ }
+@@ -14201,7 +14361,7 @@
+
+ tp->dma_rwctrl = tg3_calc_dma_bndry(tp, tp->dma_rwctrl);
+
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS)
+ goto out;
+
+ if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) {
+@@ -14398,7 +14558,7 @@
+
+ static void __devinit tg3_init_bufmgr_config(struct tg3 *tp)
+ {
+- if (tp->tg3_flags3 & TG3_FLG3_5717_PLUS) {
++ if (tp->tg3_flags3 & TG3_FLG3_57765_PLUS) {
+ tp->bufmgr_config.mbuf_read_dma_low_water =
+ DEFAULT_MB_RDMA_LOW_WATER_5705;
+ tp->bufmgr_config.mbuf_mac_rx_low_water =
+@@ -14476,6 +14636,7 @@
+ case TG3_PHY_ID_BCM5718S: return "5718S";
+ case TG3_PHY_ID_BCM57765: return "57765";
+ case TG3_PHY_ID_BCM5719C: return "5719C";
++ case TG3_PHY_ID_BCM5720C: return "5720C";
+ case TG3_PHY_ID_BCM8002: return "8002/serdes";
+ case 0: return "serdes";
+ default: return "unknown";
+@@ -14724,8 +14885,7 @@
+ }
+
+ if ((tp->tg3_flags3 & TG3_FLG3_5755_PLUS) &&
+- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5717 &&
+- GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5719)
++ !(tp->tg3_flags3 & TG3_FLG3_5717_PLUS))
+ dev->netdev_ops = &tg3_netdev_ops;
+ else
+ dev->netdev_ops = &tg3_netdev_ops_dma_bug;
+diff -Nurb linux-2.6.32-27.planetlab.i686/drivers/net/tg3.h ../kernel-2.6/linux-2.6.32-27.planetlab.i686/drivers/net/tg3.h
+--- linux-2.6.32-27.planetlab.i686/drivers/net/tg3.h 2011-05-10 14:38:09.000000000 -0400
++++ ../kernel-2.6/linux-2.6.32-27.planetlab.i686/drivers/net/tg3.h 2012-05-01 09:39:43.237312425 -0400
+@@ -25,9 +25,13 @@
+
+ #define TG3_RX_INTERNAL_RING_SZ_5906 32
+
+-#define RX_STD_MAX_SIZE_5705 512
+-#define RX_STD_MAX_SIZE_5717 2048
+-#define RX_JUMBO_MAX_SIZE 0xdeadbeef /* XXX */
++#define TG3_RX_STD_MAX_SIZE_5700 512
++#define TG3_RX_STD_MAX_SIZE_5717 2048
++#define TG3_RX_JMB_MAX_SIZE_5700 256
++#define TG3_RX_JMB_MAX_SIZE_5717 1024
++#define TG3_RX_RET_MAX_SIZE_5700 1024
++#define TG3_RX_RET_MAX_SIZE_5705 512
++#define TG3_RX_RET_MAX_SIZE_5717 4096
+
+ /* First 256 bytes are a mirror of PCI config space. */
+ #define TG3PCI_VENDOR 0x00000000
+@@ -55,6 +59,7 @@
+ #define TG3PCI_DEVICE_TIGON3_57791 0x16b2
+ #define TG3PCI_DEVICE_TIGON3_57795 0x16b6
+ #define TG3PCI_DEVICE_TIGON3_5719 0x1657
++#define TG3PCI_DEVICE_TIGON3_5720 0x165f
+ /* 0x04 --> 0x2c unused */
+ #define TG3PCI_SUBVENDOR_ID_BROADCOM PCI_VENDOR_ID_BROADCOM
+ #define TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6 0x1644
+@@ -163,6 +168,7 @@
+ #define ASIC_REV_5717 0x5717
+ #define ASIC_REV_57765 0x57785
+ #define ASIC_REV_5719 0x5719
++#define ASIC_REV_5720 0x5720
+ #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8)
+ #define CHIPREV_5700_AX 0x70
+ #define CHIPREV_5700_BX 0x71
+@@ -473,6 +479,8 @@
+ #define TX_MODE_BIG_BCKOFF_ENABLE 0x00000020
+ #define TX_MODE_LONG_PAUSE_ENABLE 0x00000040
+ #define TX_MODE_MBUF_LOCKUP_FIX 0x00000100
++#define TX_MODE_JMB_FRM_LEN 0x00400000
++#define TX_MODE_CNT_DN_MODE 0x00800000
+ #define MAC_TX_STATUS 0x00000460
+ #define TX_STATUS_XOFFED 0x00000001
+ #define TX_STATUS_SENT_XOFF 0x00000002
+@@ -487,6 +495,8 @@
+ #define TX_LENGTHS_IPG_SHIFT 8
+ #define TX_LENGTHS_IPG_CRS_MASK 0x00003000
+ #define TX_LENGTHS_IPG_CRS_SHIFT 12
++#define TX_LENGTHS_JMB_FRM_LEN_MSK 0x00ff0000
++#define TX_LENGTHS_CNT_DWN_VAL_MSK 0xff000000
+ #define MAC_RX_MODE 0x00000468
+ #define RX_MODE_RESET 0x00000001
+ #define RX_MODE_ENABLE 0x00000002
+@@ -1079,6 +1089,9 @@
+ #define CPMU_HST_ACC_MACCLK_6_25 0x00130000
+ /* 0x3620 --> 0x3630 unused */
+
++#define TG3_CPMU_CLCK_ORIDE 0x00003624
++#define CPMU_CLCK_ORIDE_MAC_ORIDE_EN 0x80000000
++
+ #define TG3_CPMU_CLCK_STAT 0x00003630
+ #define CPMU_CLCK_STAT_MAC_CLCK_MASK 0x001f0000
+ #define CPMU_CLCK_STAT_MAC_CLCK_62_5 0x00000000
+@@ -1321,6 +1334,7 @@
+ #define RDMAC_MODE_MULT_DMA_RD_DIS 0x01000000
+ #define RDMAC_MODE_IPV4_LSO_EN 0x08000000
+ #define RDMAC_MODE_IPV6_LSO_EN 0x10000000
++#define RDMAC_MODE_H2BNC_VLAN_DET 0x20000000
+ #define RDMAC_STATUS 0x00004804
+ #define RDMAC_STATUS_TGTABORT 0x00000004
+ #define RDMAC_STATUS_MSTABORT 0x00000008
+@@ -1609,6 +1623,8 @@
+ #define GRC_MODE_WSWAP_NONFRM_DATA 0x00000004
+ #define GRC_MODE_BSWAP_DATA 0x00000010
+ #define GRC_MODE_WSWAP_DATA 0x00000020
++#define GRC_MODE_BYTE_SWAP_B2HRX_DATA 0x00000040
++#define GRC_MODE_WORD_SWAP_B2HRX_DATA 0x00000080
+ #define GRC_MODE_SPLITHDR 0x00000100
+ #define GRC_MODE_NOFRM_CRACKING 0x00000200
+ #define GRC_MODE_INCL_CRC 0x00000400
+@@ -1616,8 +1632,10 @@
+ #define GRC_MODE_NOIRQ_ON_SENDS 0x00002000
+ #define GRC_MODE_NOIRQ_ON_RCV 0x00004000
+ #define GRC_MODE_FORCE_PCI32BIT 0x00008000
++#define GRC_MODE_B2HRX_ENABLE 0x00008000
+ #define GRC_MODE_HOST_STACKUP 0x00010000
+ #define GRC_MODE_HOST_SENDBDS 0x00020000
++#define GRC_MODE_HTX2B_ENABLE 0x00040000
+ #define GRC_MODE_NO_TX_PHDR_CSUM 0x00100000
+ #define GRC_MODE_NVRAM_WR_ENABLE 0x00200000
+ #define GRC_MODE_PCIE_TL_SEL 0x00000000
+@@ -1814,6 +1832,38 @@
+ #define FLASH_5717VENDOR_ATMEL_45USPT 0x03400000
+ #define FLASH_5717VENDOR_ST_25USPT 0x03400002
+ #define FLASH_5717VENDOR_ST_45USPT 0x03400001
++#define FLASH_5720_EEPROM_HD 0x00000001
++#define FLASH_5720_EEPROM_LD 0x00000003
++#define FLASH_5720VENDOR_M_ATMEL_DB011D 0x01000000
++#define FLASH_5720VENDOR_M_ATMEL_DB021D 0x01000002
++#define FLASH_5720VENDOR_M_ATMEL_DB041D 0x01000001
++#define FLASH_5720VENDOR_M_ATMEL_DB081D 0x01000003
++#define FLASH_5720VENDOR_M_ST_M25PE10 0x02000000
++#define FLASH_5720VENDOR_M_ST_M25PE20 0x02000002
++#define FLASH_5720VENDOR_M_ST_M25PE40 0x02000001
++#define FLASH_5720VENDOR_M_ST_M25PE80 0x02000003
++#define FLASH_5720VENDOR_M_ST_M45PE10 0x03000000
++#define FLASH_5720VENDOR_M_ST_M45PE20 0x03000002
++#define FLASH_5720VENDOR_M_ST_M45PE40 0x03000001
++#define FLASH_5720VENDOR_M_ST_M45PE80 0x03000003
++#define FLASH_5720VENDOR_A_ATMEL_DB011B 0x01800000
++#define FLASH_5720VENDOR_A_ATMEL_DB021B 0x01800002
++#define FLASH_5720VENDOR_A_ATMEL_DB041B 0x01800001
++#define FLASH_5720VENDOR_A_ATMEL_DB011D 0x01c00000
++#define FLASH_5720VENDOR_A_ATMEL_DB021D 0x01c00002
++#define FLASH_5720VENDOR_A_ATMEL_DB041D 0x01c00001
++#define FLASH_5720VENDOR_A_ATMEL_DB081D 0x01c00003
++#define FLASH_5720VENDOR_A_ST_M25PE10 0x02800000
++#define FLASH_5720VENDOR_A_ST_M25PE20 0x02800002
++#define FLASH_5720VENDOR_A_ST_M25PE40 0x02800001
++#define FLASH_5720VENDOR_A_ST_M25PE80 0x02800003
++#define FLASH_5720VENDOR_A_ST_M45PE10 0x02c00000
++#define FLASH_5720VENDOR_A_ST_M45PE20 0x02c00002
++#define FLASH_5720VENDOR_A_ST_M45PE40 0x02c00001
++#define FLASH_5720VENDOR_A_ST_M45PE80 0x02c00003
++#define FLASH_5720VENDOR_ATMEL_45USPT 0x03c00000
++#define FLASH_5720VENDOR_ST_25USPT 0x03c00002
++#define FLASH_5720VENDOR_ST_45USPT 0x03c00001
+ #define NVRAM_CFG1_5752PAGE_SIZE_MASK 0x70000000
+ #define FLASH_5752PAGE_SIZE_256 0x00000000
+ #define FLASH_5752PAGE_SIZE_512 0x10000000
+@@ -2889,6 +2939,7 @@
+ #define TG3_FLG3_5701_DMA_BUG 0x00000008
+ #define TG3_FLG3_USE_PHYLIB 0x00000010
+ #define TG3_FLG3_MDIOBUS_INITED 0x00000020
++#define TG3_FLG3_LRG_PROD_RING_CAP 0x00000080
+ #define TG3_FLG3_RGMII_INBAND_DISABLE 0x00000100
+ #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200
+ #define TG3_FLG3_RGMII_EXT_IBND_TX_EN 0x00000400
+@@ -2902,7 +2953,8 @@
+ #define TG3_FLG3_SHORT_DMA_BUG 0x00200000
+ #define TG3_FLG3_USE_JUMBO_BDFLAG 0x00400000
+ #define TG3_FLG3_L1PLLPD_EN 0x00800000
+-#define TG3_FLG3_5717_PLUS 0x01000000
++#define TG3_FLG3_57765_PLUS 0x01000000
++#define TG3_FLG3_5717_PLUS 0x04000000
+
+ struct timer_list timer;
+ u16 timer_counter;
+@@ -2974,6 +3026,7 @@
+ #define TG3_PHY_ID_BCM5718S 0xbc050ff0
+ #define TG3_PHY_ID_BCM57765 0x5c0d8a40
+ #define TG3_PHY_ID_BCM5719C 0x5c0d8a20
++#define TG3_PHY_ID_BCM5720C 0x5c0d8b60
+ #define TG3_PHY_ID_BCM5906 0xdc00ac40
+ #define TG3_PHY_ID_BCM8002 0x60010140
+ #define TG3_PHY_ID_INVALID 0xffffffff
+@@ -3040,6 +3093,7 @@
+
+ int nvram_lock_cnt;
+ u32 nvram_size;
++#define TG3_NVRAM_SIZE_2KB 0x00000800
+ #define TG3_NVRAM_SIZE_64KB 0x00010000
+ #define TG3_NVRAM_SIZE_128KB 0x00020000
+ #define TG3_NVRAM_SIZE_256KB 0x00040000
+@@ -3055,6 +3109,9 @@
+ #define JEDEC_SAIFUN 0x4f
+ #define JEDEC_SST 0xbf
+
++#define ATMEL_AT24C02_CHIP_SIZE TG3_NVRAM_SIZE_2KB
++#define ATMEL_AT24C02_PAGE_SIZE (8)
++
+ #define ATMEL_AT24C64_CHIP_SIZE TG3_NVRAM_SIZE_64KB
+ #define ATMEL_AT24C64_PAGE_SIZE (32)
+