linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / net / tg3.c
index fa620ae..6d63836 100644 (file)
@@ -15,6 +15,7 @@
  *     notice is accompanying it.
  */
 
+#include <linux/config.h>
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -68,8 +69,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.65"
-#define DRV_MODULE_RELDATE     "August 07, 2006"
+#define DRV_MODULE_VERSION     "3.49"
+#define DRV_MODULE_RELDATE     "Feb 2, 2006"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
                                   TG3_RX_RCB_RING_SIZE(tp))
 #define TG3_TX_RING_BYTES      (sizeof(struct tg3_tx_buffer_desc) * \
                                 TG3_TX_RING_SIZE)
+#define TX_BUFFS_AVAIL(TP)                                             \
+       ((TP)->tx_pending -                                             \
+        (((TP)->tx_prod - (TP)->tx_cons) & (TG3_TX_RING_SIZE - 1)))
 #define NEXT_TX(N)             (((N) + 1) & (TG3_TX_RING_SIZE - 1))
 
 #define RX_PKT_BUF_SZ          (1536 + tp->rx_offset + 64)
@@ -217,28 +221,10 @@ static struct pci_device_id tg3_pci_tbl[] = {
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5754M,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5755M,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5786,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5787M,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5714S,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
-       { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5715S,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S,
@@ -495,40 +481,33 @@ static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val)
        unsigned long flags;
 
        spin_lock_irqsave(&tp->indirect_lock, flags);
-       if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
-               pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
-               pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
-
-               /* Always leave this as zero. */
-               pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
-       } else {
-               tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
-               tw32_f(TG3PCI_MEM_WIN_DATA, val);
+       pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
+       pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
 
-               /* Always leave this as zero. */
-               tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
-       }
+       /* Always leave this as zero. */
+       pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
        spin_unlock_irqrestore(&tp->indirect_lock, flags);
 }
 
+static void tg3_write_mem_fast(struct tg3 *tp, u32 off, u32 val)
+{
+       /* If no workaround is needed, write to mem space directly */
+       if (tp->write32 != tg3_write_indirect_reg32)
+               tw32(NIC_SRAM_WIN_BASE + off, val);
+       else
+               tg3_write_mem(tp, off, val);
+}
+
 static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val)
 {
        unsigned long flags;
 
        spin_lock_irqsave(&tp->indirect_lock, flags);
-       if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) {
-               pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
-               pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
-
-               /* Always leave this as zero. */
-               pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
-       } else {
-               tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off);
-               *val = tr32(TG3PCI_MEM_WIN_DATA);
+       pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off);
+       pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val);
 
-               /* Always leave this as zero. */
-               tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0);
-       }
+       /* Always leave this as zero. */
+       pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0);
        spin_unlock_irqrestore(&tp->indirect_lock, flags);
 }
 
@@ -555,9 +534,6 @@ static void tg3_enable_ints(struct tg3 *tp)
             (tp->misc_host_ctrl & ~MISC_HOST_CTRL_MASK_PCI_INT));
        tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
                       (tp->last_tag << 24));
-       if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI)
-               tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW,
-                              (tp->last_tag << 24));
        tg3_cond_int(tp);
 }
 
@@ -972,8 +948,6 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
        return err;
 }
 
-static void tg3_link_report(struct tg3 *);
-
 /* This will reset the tigon3 PHY if there is no valid
  * link unless the FORCE argument is non-zero.
  */
@@ -987,11 +961,6 @@ static int tg3_phy_reset(struct tg3 *tp)
        if (err != 0)
                return -EBUSY;
 
-       if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) {
-               netif_carrier_off(tp->dev);
-               tg3_link_report(tp);
-       }
-
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
@@ -1028,12 +997,6 @@ out:
                tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2);
                tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
        }
-       else if (tp->tg3_flags2 & TG3_FLG2_PHY_JITTER_BUG) {
-               tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
-               tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
-               tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
-               tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
-       }
        /* Set Extended packet length bit (bit 14) on all chips that */
        /* support jumbo frames */
        if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
@@ -1075,11 +1038,9 @@ static void tg3_frob_aux_power(struct tg3 *tp)
                struct net_device *dev_peer;
 
                dev_peer = pci_get_drvdata(tp->pdev_peer);
-               /* remove_one() may have been run on the peer. */
                if (!dev_peer)
-                       tp_peer = tp;
-               else
-                       tp_peer = netdev_priv(dev_peer);
+                       BUG();
+               tp_peer = netdev_priv(dev_peer);
        }
 
        if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
@@ -1170,20 +1131,7 @@ static int tg3_halt_cpu(struct tg3 *, u32);
 static int tg3_nvram_lock(struct tg3 *);
 static void tg3_nvram_unlock(struct tg3 *);
 
-static void tg3_power_down_phy(struct tg3 *tp)
-{
-       /* The PHY should not be powered down on some chips because
-        * of bugs.
-        */
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
-           (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 &&
-            (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)))
-               return;
-       tg3_writephy(tp, MII_BMCR, BMCR_PDOWN);
-}
-
-static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
+static int tg3_set_power_state(struct tg3 *tp, int state)
 {
        u32 misc_host_ctrl;
        u16 power_control, power_caps;
@@ -1202,7 +1150,7 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
        power_control |= PCI_PM_CTRL_PME_STATUS;
        power_control &= ~(PCI_PM_CTRL_STATE_MASK);
        switch (state) {
-       case PCI_D0:
+       case 0:
                power_control |= 0;
                pci_write_config_word(tp->pdev,
                                      pm + PCI_PM_CTRL,
@@ -1215,15 +1163,15 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
 
                return 0;
 
-       case PCI_D1:
+       case 1:
                power_control |= 1;
                break;
 
-       case PCI_D2:
+       case 2:
                power_control |= 2;
                break;
 
-       case PCI_D3hot:
+       case 3:
                power_control |= 3;
                break;
 
@@ -1362,7 +1310,8 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
                        tg3_writephy(tp, MII_TG3_EXT_CTRL,
                                     MII_TG3_EXT_CTRL_FORCE_LED_OFF);
                        tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
-                       tg3_power_down_phy(tp);
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700)
+                               tg3_writephy(tp, MII_BMCR, BMCR_PDOWN);
                }
        }
 
@@ -1385,12 +1334,12 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
                }
        }
 
-       tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
-
        /* Finally, set the new power state. */
        pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control);
        udelay(100);    /* Delay after power state change */
 
+       tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN);
+
        return 0;
 }
 
@@ -2731,12 +2680,6 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
 
        err |= tg3_readphy(tp, MII_BMSR, &bmsr);
        err |= tg3_readphy(tp, MII_BMSR, &bmsr);
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) {
-               if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
-                       bmsr |= BMSR_LSTATUS;
-               else
-                       bmsr &= ~BMSR_LSTATUS;
-       }
 
        err |= tg3_readphy(tp, MII_BMCR, &bmcr);
 
@@ -2805,13 +2748,6 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset)
                        bmcr = new_bmcr;
                        err |= tg3_readphy(tp, MII_BMSR, &bmsr);
                        err |= tg3_readphy(tp, MII_BMSR, &bmsr);
-                       if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
-                           ASIC_REV_5714) {
-                               if (tr32(MAC_TX_STATUS) & TX_STATUS_LINK_UP)
-                                       bmsr |= BMSR_LSTATUS;
-                               else
-                                       bmsr &= ~BMSR_LSTATUS;
-                       }
                        tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT;
                }
        }
@@ -2963,34 +2899,6 @@ static int tg3_setup_phy(struct tg3 *tp, int force_reset)
        return err;
 }
 
-/* This is called whenever we suspect that the system chipset is re-
- * ordering the sequence of MMIO to the tx send mailbox. The symptom
- * is bogus tx completions. We try to recover by setting the
- * TG3_FLAG_MBOX_WRITE_REORDER flag and resetting the chip later
- * in the workqueue.
- */
-static void tg3_tx_recover(struct tg3 *tp)
-{
-       BUG_ON((tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) ||
-              tp->write32_tx_mbox == tg3_write_indirect_mbox);
-
-       printk(KERN_WARNING PFX "%s: The system may be re-ordering memory-"
-              "mapped I/O cycles to the network device, attempting to "
-              "recover. Please report the problem to the driver maintainer "
-              "and include system chipset information.\n", tp->dev->name);
-
-       spin_lock(&tp->lock);
-       tp->tg3_flags |= TG3_FLAG_TX_RECOVERY_PENDING;
-       spin_unlock(&tp->lock);
-}
-
-static inline u32 tg3_tx_avail(struct tg3 *tp)
-{
-       smp_mb();
-       return (tp->tx_pending -
-               ((tp->tx_prod - tp->tx_cons) & (TG3_TX_RING_SIZE - 1)));
-}
-
 /* Tigon3 never reports partial packet sends.  So we do not
  * need special logic to handle SKBs that have not had all
  * of their frags sent yet, like SunGEM does.
@@ -3003,12 +2911,10 @@ static void tg3_tx(struct tg3 *tp)
        while (sw_idx != hw_idx) {
                struct tx_ring_info *ri = &tp->tx_buffers[sw_idx];
                struct sk_buff *skb = ri->skb;
-               int i, tx_bug = 0;
+               int i;
 
-               if (unlikely(skb == NULL)) {
-                       tg3_tx_recover(tp);
-                       return;
-               }
+               if (unlikely(skb == NULL))
+                       BUG();
 
                pci_unmap_single(tp->pdev,
                                 pci_unmap_addr(ri, mapping),
@@ -3020,9 +2926,12 @@ static void tg3_tx(struct tg3 *tp)
                sw_idx = NEXT_TX(sw_idx);
 
                for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+                       if (unlikely(sw_idx == hw_idx))
+                               BUG();
+
                        ri = &tp->tx_buffers[sw_idx];
-                       if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
-                               tx_bug = 1;
+                       if (unlikely(ri->skb != NULL))
+                               BUG();
 
                        pci_unmap_page(tp->pdev,
                                       pci_unmap_addr(ri, mapping),
@@ -3033,29 +2942,16 @@ static void tg3_tx(struct tg3 *tp)
                }
 
                dev_kfree_skb(skb);
-
-               if (unlikely(tx_bug)) {
-                       tg3_tx_recover(tp);
-                       return;
-               }
        }
 
        tp->tx_cons = sw_idx;
 
-       /* Need to make the tx_cons update visible to tg3_start_xmit()
-        * before checking for netif_queue_stopped().  Without the
-        * memory barrier, there is a small possibility that tg3_start_xmit()
-        * will miss it and cause the queue to be stopped forever.
-        */
-       smp_mb();
-
-       if (unlikely(netif_queue_stopped(tp->dev) &&
-                    (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH))) {
-               netif_tx_lock(tp->dev);
+       if (unlikely(netif_queue_stopped(tp->dev))) {
+               spin_lock(&tp->tx_lock);
                if (netif_queue_stopped(tp->dev) &&
-                   (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH))
+                   (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH))
                        netif_wake_queue(tp->dev);
-               netif_tx_unlock(tp->dev);
+               spin_unlock(&tp->tx_lock);
        }
 }
 
@@ -3109,10 +3005,11 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key,
         * Callers depend upon this behavior and assume that
         * we leave everything unchanged if we fail.
         */
-       skb = netdev_alloc_skb(tp->dev, skb_size);
+       skb = dev_alloc_skb(skb_size);
        if (skb == NULL)
                return -ENOMEM;
 
+       skb->dev = tp->dev;
        skb_reserve(skb, tp->rx_offset);
 
        mapping = pci_map_single(tp->pdev, skb->data,
@@ -3205,7 +3102,7 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
  */
 static int tg3_rx(struct tg3 *tp, int budget)
 {
-       u32 work_mask, rx_std_posted = 0;
+       u32 work_mask;
        u32 sw_idx = tp->rx_rcb_ptr;
        u16 hw_idx;
        int received;
@@ -3232,7 +3129,6 @@ static int tg3_rx(struct tg3 *tp, int budget)
                                                  mapping);
                        skb = tp->rx_std_buffers[desc_idx].skb;
                        post_ptr = &tp->rx_std_ptr;
-                       rx_std_posted++;
                } else if (opaque_key == RXD_OPAQUE_RING_JUMBO) {
                        dma_addr = pci_unmap_addr(&tp->rx_jumbo_buffers[desc_idx],
                                                  mapping);
@@ -3281,10 +3177,11 @@ static int tg3_rx(struct tg3 *tp, int budget)
                        tg3_recycle_rx(tp, opaque_key,
                                       desc_idx, *post_ptr);
 
-                       copy_skb = netdev_alloc_skb(tp->dev, len + 2);
+                       copy_skb = dev_alloc_skb(len + 2);
                        if (copy_skb == NULL)
                                goto drop_it_no_recycle;
 
+                       copy_skb->dev = tp->dev;
                        skb_reserve(copy_skb, 2);
                        skb_put(copy_skb, len);
                        pci_dma_sync_single_for_cpu(tp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
@@ -3319,15 +3216,6 @@ static int tg3_rx(struct tg3 *tp, int budget)
 
 next_pkt:
                (*post_ptr)++;
-
-               if (unlikely(rx_std_posted >= tp->rx_std_max_post)) {
-                       u32 idx = *post_ptr % TG3_RX_RING_SIZE;
-
-                       tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX +
-                                    TG3_64BIT_REG_LOW, idx);
-                       work_mask &= ~RXD_OPAQUE_RING_STD;
-                       rx_std_posted = 0;
-               }
 next_pkt_nopost:
                sw_idx++;
                sw_idx %= TG3_RX_RCB_RING_SIZE(tp);
@@ -3381,11 +3269,6 @@ static int tg3_poll(struct net_device *netdev, int *budget)
        /* run TX completion thread */
        if (sblk->idx[0].tx_consumer != tp->tx_cons) {
                tg3_tx(tp);
-               if (unlikely(tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING)) {
-                       netif_rx_complete(netdev);
-                       schedule_work(&tp->reset_task);
-                       return 0;
-               }
        }
 
        /* run RX thread, within the bounds set by NAPI.
@@ -3446,30 +3329,15 @@ static inline void tg3_full_lock(struct tg3 *tp, int irq_sync)
        if (irq_sync)
                tg3_irq_quiesce(tp);
        spin_lock_bh(&tp->lock);
+       spin_lock(&tp->tx_lock);
 }
 
 static inline void tg3_full_unlock(struct tg3 *tp)
 {
+       spin_unlock(&tp->tx_lock);
        spin_unlock_bh(&tp->lock);
 }
 
-/* One-shot MSI handler - Chip automatically disables interrupt
- * after sending MSI so driver doesn't have to do it.
- */
-static irqreturn_t tg3_msi_1shot(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct net_device *dev = dev_id;
-       struct tg3 *tp = netdev_priv(dev);
-
-       prefetch(tp->hw_status);
-       prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]);
-
-       if (likely(!tg3_irq_sync(tp)))
-               netif_rx_schedule(dev);         /* schedule NAPI poll */
-
-       return IRQ_HANDLED;
-}
-
 /* MSI ISR - No need to check for interrupt sharing and no need to
  * flush status block and interrupt mailbox. PCI ordering rules
  * guarantee that MSI will arrive after the status block.
@@ -3597,31 +3465,9 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id,
        return IRQ_RETVAL(0);
 }
 
-static int tg3_init_hw(struct tg3 *, int);
+static int tg3_init_hw(struct tg3 *);
 static int tg3_halt(struct tg3 *, int, int);
 
-/* Restart hardware after configuration changes, self-test, etc.
- * Invoked with tp->lock held.
- */
-static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
-{
-       int err;
-
-       err = tg3_init_hw(tp, reset_phy);
-       if (err) {
-               printk(KERN_ERR PFX "%s: Failed to re-initialize device, "
-                      "aborting.\n", tp->dev->name);
-               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               tg3_full_unlock(tp);
-               del_timer_sync(&tp->timer);
-               tp->irq_sync = 0;
-               netif_poll_enable(tp->dev);
-               dev_close(tp->dev);
-               tg3_full_lock(tp, 0);
-       }
-       return err;
-}
-
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void tg3_poll_controller(struct net_device *dev)
 {
@@ -3654,23 +3500,14 @@ static void tg3_reset_task(void *_data)
        restart_timer = tp->tg3_flags2 & TG3_FLG2_RESTART_TIMER;
        tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
 
-       if (tp->tg3_flags & TG3_FLAG_TX_RECOVERY_PENDING) {
-               tp->write32_tx_mbox = tg3_write32_tx_mbox;
-               tp->write32_rx_mbox = tg3_write_flush_reg32;
-               tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER;
-               tp->tg3_flags &= ~TG3_FLAG_TX_RECOVERY_PENDING;
-       }
-
        tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
-       if (tg3_init_hw(tp, 1))
-               goto out;
+       tg3_init_hw(tp);
 
        tg3_netif_start(tp);
 
        if (restart_timer)
                mod_timer(&tp->timer, jiffies + 1);
 
-out:
        tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK;
 
        tg3_full_unlock(tp);
@@ -3700,7 +3537,7 @@ static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping,
                                          int len)
 {
 #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64)
-       if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG)
+       if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)
                return (((u64) mapping + len) > DMA_40BIT_MASK);
        return 0;
 #else
@@ -3791,170 +3628,7 @@ static void tg3_set_txd(struct tg3 *tp, int entry,
        txd->vlan_tag = vlan_tag << TXD_VLAN_TAG_SHIFT;
 }
 
-/* hard_start_xmit for devices that don't have any bugs and
- * support TG3_FLG2_HW_TSO_2 only.
- */
 static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct tg3 *tp = netdev_priv(dev);
-       dma_addr_t mapping;
-       u32 len, entry, base_flags, mss;
-
-       len = skb_headlen(skb);
-
-       /* We are running in BH disabled context with netif_tx_lock
-        * and TX reclaim runs via tp->poll inside of a software
-        * interrupt.  Furthermore, IRQ processing runs lockless so we have
-        * no IRQ context deadlocks to worry about either.  Rejoice!
-        */
-       if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
-               if (!netif_queue_stopped(dev)) {
-                       netif_stop_queue(dev);
-
-                       /* This is a hard error, log it. */
-                       printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
-                              "queue awake!\n", dev->name);
-               }
-               return NETDEV_TX_BUSY;
-       }
-
-       entry = tp->tx_prod;
-       base_flags = 0;
-#if TG3_TSO_SUPPORT != 0
-       mss = 0;
-       if (skb->len > (tp->dev->mtu + ETH_HLEN) &&
-           (mss = skb_shinfo(skb)->gso_size) != 0) {
-               int tcp_opt_len, ip_tcp_len;
-
-               if (skb_header_cloned(skb) &&
-                   pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
-                       dev_kfree_skb(skb);
-                       goto out_unlock;
-               }
-
-               if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
-                       mss |= (skb_headlen(skb) - ETH_HLEN) << 9;
-               else {
-                       tcp_opt_len = ((skb->h.th->doff - 5) * 4);
-                       ip_tcp_len = (skb->nh.iph->ihl * 4) +
-                                    sizeof(struct tcphdr);
-
-                       skb->nh.iph->check = 0;
-                       skb->nh.iph->tot_len = htons(mss + ip_tcp_len +
-                                                    tcp_opt_len);
-                       mss |= (ip_tcp_len + tcp_opt_len) << 9;
-               }
-
-               base_flags |= (TXD_FLAG_CPU_PRE_DMA |
-                              TXD_FLAG_CPU_POST_DMA);
-
-               skb->h.th->check = 0;
-
-       }
-       else if (skb->ip_summed == CHECKSUM_HW)
-               base_flags |= TXD_FLAG_TCPUDP_CSUM;
-#else
-       mss = 0;
-       if (skb->ip_summed == CHECKSUM_HW)
-               base_flags |= TXD_FLAG_TCPUDP_CSUM;
-#endif
-#if TG3_VLAN_TAG_USED
-       if (tp->vlgrp != NULL && vlan_tx_tag_present(skb))
-               base_flags |= (TXD_FLAG_VLAN |
-                              (vlan_tx_tag_get(skb) << 16));
-#endif
-
-       /* Queue skb data, a.k.a. the main skb fragment. */
-       mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE);
-
-       tp->tx_buffers[entry].skb = skb;
-       pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
-
-       tg3_set_txd(tp, entry, mapping, len, base_flags,
-                   (skb_shinfo(skb)->nr_frags == 0) | (mss << 1));
-
-       entry = NEXT_TX(entry);
-
-       /* Now loop through additional data fragments, and queue them. */
-       if (skb_shinfo(skb)->nr_frags > 0) {
-               unsigned int i, last;
-
-               last = skb_shinfo(skb)->nr_frags - 1;
-               for (i = 0; i <= last; i++) {
-                       skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-
-                       len = frag->size;
-                       mapping = pci_map_page(tp->pdev,
-                                              frag->page,
-                                              frag->page_offset,
-                                              len, PCI_DMA_TODEVICE);
-
-                       tp->tx_buffers[entry].skb = NULL;
-                       pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping);
-
-                       tg3_set_txd(tp, entry, mapping, len,
-                                   base_flags, (i == last) | (mss << 1));
-
-                       entry = NEXT_TX(entry);
-               }
-       }
-
-       /* Packets are ready, update Tx producer idx local and on card. */
-       tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
-
-       tp->tx_prod = entry;
-       if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) {
-               netif_stop_queue(dev);
-               if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)
-                       netif_wake_queue(tp->dev);
-       }
-
-out_unlock:
-       mmiowb();
-
-       dev->trans_start = jiffies;
-
-       return NETDEV_TX_OK;
-}
-
-#if TG3_TSO_SUPPORT != 0
-static int tg3_start_xmit_dma_bug(struct sk_buff *, struct net_device *);
-
-/* Use GSO to workaround a rare TSO bug that may be triggered when the
- * TSO header is greater than 80 bytes.
- */
-static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
-{
-       struct sk_buff *segs, *nskb;
-
-       /* Estimate the number of fragments in the worst case */
-       if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->gso_segs * 3))) {
-               netif_stop_queue(tp->dev);
-               return NETDEV_TX_BUSY;
-       }
-
-       segs = skb_gso_segment(skb, tp->dev->features & ~NETIF_F_TSO);
-       if (unlikely(IS_ERR(segs)))
-               goto tg3_tso_bug_end;
-
-       do {
-               nskb = segs;
-               segs = segs->next;
-               nskb->next = NULL;
-               tg3_start_xmit_dma_bug(nskb, tp->dev);
-       } while (segs);
-
-tg3_tso_bug_end:
-       dev_kfree_skb(skb);
-
-       return NETDEV_TX_OK;
-}
-#endif
-
-/* hard_start_xmit for devices that have the 4G bug and/or 40-bit bug and
- * support TG3_FLG2_HW_TSO_1 or firmware TSO only.
- */
-static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
 {
        struct tg3 *tp = netdev_priv(dev);
        dma_addr_t mapping;
@@ -3963,12 +3637,15 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
 
        len = skb_headlen(skb);
 
-       /* We are running in BH disabled context with netif_tx_lock
-        * and TX reclaim runs via tp->poll inside of a software
+       /* No BH disabling for tx_lock here.  We are running in BH disabled
+        * context and TX reclaim runs via tp->poll inside of a software
         * interrupt.  Furthermore, IRQ processing runs lockless so we have
         * no IRQ context deadlocks to worry about either.  Rejoice!
         */
-       if (unlikely(tg3_tx_avail(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
+       if (!spin_trylock(&tp->tx_lock))
+               return NETDEV_TX_LOCKED; 
+
+       if (unlikely(TX_BUFFS_AVAIL(tp) <= (skb_shinfo(skb)->nr_frags + 1))) {
                if (!netif_queue_stopped(dev)) {
                        netif_stop_queue(dev);
 
@@ -3976,6 +3653,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
                        printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
                               "queue awake!\n", dev->name);
                }
+               spin_unlock(&tp->tx_lock);
                return NETDEV_TX_BUSY;
        }
 
@@ -3986,8 +3664,8 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
 #if TG3_TSO_SUPPORT != 0
        mss = 0;
        if (skb->len > (tp->dev->mtu + ETH_HLEN) &&
-           (mss = skb_shinfo(skb)->gso_size) != 0) {
-               int tcp_opt_len, ip_tcp_len, hdr_len;
+           (mss = skb_shinfo(skb)->tso_size) != 0) {
+               int tcp_opt_len, ip_tcp_len;
 
                if (skb_header_cloned(skb) &&
                    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
@@ -3998,16 +3676,11 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
                tcp_opt_len = ((skb->h.th->doff - 5) * 4);
                ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr);
 
-               hdr_len = ip_tcp_len + tcp_opt_len;
-               if (unlikely((ETH_HLEN + hdr_len) > 80) &&
-                            (tp->tg3_flags2 & TG3_FLG2_HW_TSO_1_BUG))
-                       return (tg3_tso_bug(tp, skb));
-
                base_flags |= (TXD_FLAG_CPU_PRE_DMA |
                               TXD_FLAG_CPU_POST_DMA);
 
                skb->nh.iph->check = 0;
-               skb->nh.iph->tot_len = htons(mss + hdr_len);
+               skb->nh.iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
                if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
                        skb->h.th->check = 0;
                        base_flags &= ~TXD_FLAG_TCPUDP_CSUM;
@@ -4118,14 +3791,15 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
        tw32_tx_mbox((MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW), entry);
 
        tp->tx_prod = entry;
-       if (unlikely(tg3_tx_avail(tp) <= (MAX_SKB_FRAGS + 1))) {
+       if (TX_BUFFS_AVAIL(tp) <= (MAX_SKB_FRAGS + 1)) {
                netif_stop_queue(dev);
-               if (tg3_tx_avail(tp) > TG3_TX_WAKEUP_THRESH)
+               if (TX_BUFFS_AVAIL(tp) > TG3_TX_WAKEUP_THRESH)
                        netif_wake_queue(tp->dev);
        }
 
 out_unlock:
        mmiowb();
+       spin_unlock(&tp->tx_lock);
 
        dev->trans_start = jiffies;
 
@@ -4154,7 +3828,6 @@ static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
 static int tg3_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct tg3 *tp = netdev_priv(dev);
-       int err;
 
        if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
                return -EINVAL;
@@ -4175,14 +3848,13 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
 
        tg3_set_mtu(dev, tp, new_mtu);
 
-       err = tg3_restart_hw(tp, 0);
+       tg3_init_hw(tp);
 
-       if (!err)
-               tg3_netif_start(tp);
+       tg3_netif_start(tp);
 
        tg3_full_unlock(tp);
 
-       return err;
+       return 0;
 }
 
 /* Free up pending packets in all rx/tx rings.
@@ -4264,7 +3936,7 @@ static void tg3_free_rings(struct tg3 *tp)
  * end up in the driver.  tp->{tx,}lock are held and thus
  * we may not sleep.
  */
-static int tg3_init_rings(struct tg3 *tp)
+static void tg3_init_rings(struct tg3 *tp)
 {
        u32 i;
 
@@ -4313,38 +3985,18 @@ static int tg3_init_rings(struct tg3 *tp)
 
        /* Now allocate fresh SKBs for each rx ring. */
        for (i = 0; i < tp->rx_pending; i++) {
-               if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) {
-                       printk(KERN_WARNING PFX
-                              "%s: Using a smaller RX standard ring, "
-                              "only %d out of %d buffers were allocated "
-                              "successfully.\n",
-                              tp->dev->name, i, tp->rx_pending);
-                       if (i == 0)
-                               return -ENOMEM;
-                       tp->rx_pending = i;
+               if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD,
+                                    -1, i) < 0)
                        break;
-               }
        }
 
        if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
                for (i = 0; i < tp->rx_jumbo_pending; i++) {
                        if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO,
-                                            -1, i) < 0) {
-                               printk(KERN_WARNING PFX
-                                      "%s: Using a smaller RX jumbo ring, "
-                                      "only %d out of %d buffers were "
-                                      "allocated successfully.\n",
-                                      tp->dev->name, i, tp->rx_jumbo_pending);
-                               if (i == 0) {
-                                       tg3_free_rings(tp);
-                                       return -ENOMEM;
-                               }
-                               tp->rx_jumbo_pending = i;
+                                            -1, i) < 0)
                                break;
-                       }
                }
        }
-       return 0;
 }
 
 /*
@@ -4626,8 +4278,9 @@ static void tg3_disable_nvram_access(struct tg3 *tp)
 /* tp->lock is held. */
 static void tg3_write_sig_pre_reset(struct tg3 *tp, int kind)
 {
-       tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
-                     NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
+       if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X))
+               tg3_write_mem(tp, NIC_SRAM_FIRMWARE_MBOX,
+                             NIC_SRAM_FIRMWARE_MBOX_MAGIC1);
 
        if (tp->tg3_flags2 & TG3_FLG2_ASF_NEW_HANDSHAKE) {
                switch (kind) {
@@ -4708,17 +4361,13 @@ static int tg3_chip_reset(struct tg3 *tp)
        void (*write_op)(struct tg3 *, u32, u32);
        int i;
 
-       tg3_nvram_lock(tp);
-
-       /* No matching tg3_nvram_unlock() after this because
-        * chip reset below will undo the nvram lock.
-        */
-       tp->nvram_lock_cnt = 0;
-
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-               tw32(GRC_FASTBOOT_PC, 0);
+       if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) {
+               tg3_nvram_lock(tp);
+               /* No matching tg3_nvram_unlock() after this because
+                * chip reset below will undo the nvram lock.
+                */
+               tp->nvram_lock_cnt = 0;
+       }
 
        /*
         * We must avoid the readl() that normally takes place.
@@ -4866,25 +4515,20 @@ static int tg3_chip_reset(struct tg3 *tp)
                tw32_f(MAC_MODE, 0);
        udelay(40);
 
-       /* Wait for firmware initialization to complete. */
-       for (i = 0; i < 100000; i++) {
-               tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
-               if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
-                       break;
-               udelay(10);
-       }
-
-       /* Chip might not be fitted with firmare.  Some Sun onboard
-        * parts are configured like that.  So don't signal the timeout
-        * of the above loop as an error, but do report the lack of
-        * running firmware once.
-        */
-       if (i >= 100000 &&
-           !(tp->tg3_flags2 & TG3_FLG2_NO_FWARE_REPORTED)) {
-               tp->tg3_flags2 |= TG3_FLG2_NO_FWARE_REPORTED;
-
-               printk(KERN_INFO PFX "%s: No firmware running.\n",
-                      tp->dev->name);
+       if (!(tp->tg3_flags2 & TG3_FLG2_SUN_570X)) {
+               /* Wait for firmware initialization to complete. */
+               for (i = 0; i < 100000; i++) {
+                       tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val);
+                       if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1)
+                               break;
+                       udelay(10);
+               }
+               if (i >= 100000) {
+                       printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, "
+                              "firmware will not restart magic=%08x\n",
+                              tp->dev->name, val);
+                       return -ENODEV;
+               }
        }
 
        if ((tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) &&
@@ -5088,8 +4732,9 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
 {
        int i;
 
-       BUG_ON(offset == TX_CPU_BASE &&
-           (tp->tg3_flags2 & TG3_FLG2_5705_PLUS));
+       if (offset == TX_CPU_BASE &&
+           (tp->tg3_flags2 & TG3_FLG2_5705_PLUS))
+               BUG();
 
        if (offset == RX_CPU_BASE) {
                for (i = 0; i < 10000; i++) {
@@ -5867,35 +5512,17 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
 {
        struct tg3 *tp = netdev_priv(dev);
        struct sockaddr *addr = p;
-       int err = 0;
 
        if (!is_valid_ether_addr(addr->sa_data))
                return -EINVAL;
 
        memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 
-       if (!netif_running(dev))
-               return 0;
-
-       if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
-               /* Reset chip so that ASF can re-init any MAC addresses it
-                * needs.
-                */
-               tg3_netif_stop(tp);
-               tg3_full_lock(tp, 1);
-
-               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               err = tg3_restart_hw(tp, 0);
-               if (!err)
-                       tg3_netif_start(tp);
-               tg3_full_unlock(tp);
-       } else {
-               spin_lock_bh(&tp->lock);
-               __tg3_set_mac_addr(tp);
-               spin_unlock_bh(&tp->lock);
-       }
+       spin_lock_bh(&tp->lock);
+       __tg3_set_mac_addr(tp);
+       spin_unlock_bh(&tp->lock);
 
-       return err;
+       return 0;
 }
 
 /* tp->lock is held. */
@@ -5943,7 +5570,7 @@ static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
 }
 
 /* tp->lock is held. */
-static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
+static int tg3_reset_hw(struct tg3 *tp)
 {
        u32 val, rdmac_mode;
        int i, err, limit;
@@ -5958,9 +5585,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                tg3_abort_hw(tp, 1);
        }
 
-       if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy)
-               tg3_phy_reset(tp);
-
        err = tg3_chip_reset(tp);
        if (err)
                return err;
@@ -5995,9 +5619,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
         * can only do this after the hardware has been
         * successfully reset.
         */
-       err = tg3_init_rings(tp);
-       if (err)
-               return err;
+       tg3_init_rings(tp);
 
        /* This value is determined during the probe time DMA
         * engine test, tg3_test_dma.
@@ -6009,14 +5631,10 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                          GRC_MODE_NO_TX_PHDR_CSUM |
                          GRC_MODE_NO_RX_PHDR_CSUM);
        tp->grc_mode |= GRC_MODE_HOST_SENDBDS;
-
-       /* Pseudo-header checksum is done by hardware logic and not
-        * the offload processers, so make the chip do the pseudo-
-        * header checksums on receive.  For transmit it is more
-        * convenient to do the pseudo-header checksum in software
-        * as Linux does that on transmit for us in all cases.
-        */
-       tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
+       if (tp->tg3_flags & TG3_FLAG_NO_TX_PSEUDO_CSUM)
+               tp->grc_mode |= GRC_MODE_NO_TX_PHDR_CSUM;
+       if (tp->tg3_flags & TG3_FLAG_NO_RX_PSEUDO_CSUM)
+               tp->grc_mode |= GRC_MODE_NO_RX_PHDR_CSUM;
 
        tw32(GRC_MODE,
             tp->grc_mode |
@@ -6090,13 +5708,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
        }
 
        /* Setup replenish threshold. */
-       val = tp->rx_pending / 8;
-       if (val == 0)
-               val = 1;
-       else if (val > tp->rx_std_max_post)
-               val = tp->rx_std_max_post;
-
-       tw32(RCVBDI_STD_THRESH, val);
+       tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8);
 
        /* Initialize TG3_BDINFO's at:
         *  RCVDBDI_STD_BD:     standard eth size rx ring
@@ -6256,12 +5868,8 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
 #endif
 
        /* Receive/send statistics. */
-       if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
-               val = tr32(RCVLPC_STATS_ENABLE);
-               val &= ~RCVLPC_STATSENAB_DACK_FIX;
-               tw32(RCVLPC_STATS_ENABLE, val);
-       } else if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) &&
-                  (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
+       if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) &&
+           (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) {
                val = tr32(RCVLPC_STATS_ENABLE);
                val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX;
                tw32(RCVLPC_STATS_ENABLE, val);
@@ -6347,9 +5955,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                        gpio_mask |= GRC_LCLCTRL_GPIO_OE3 |
                                     GRC_LCLCTRL_GPIO_OUTPUT3;
 
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
-                       gpio_mask |= GRC_LCLCTRL_GPIO_UART_SEL;
-
                tp->grc_local_ctrl |= tr32(GRC_LOCAL_CTRL) & gpio_mask;
 
                /* GPIO1 must be driven high for eeprom write protect */
@@ -6388,11 +5993,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                }
        }
 
-       /* Enable host coalescing bug fix */
-       if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755) ||
-           (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787))
-               val |= (1 << 29);
-
        tw32_f(WDMAC_MODE, val);
        udelay(40);
 
@@ -6448,9 +6048,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
        udelay(100);
 
        tp->rx_mode = RX_MODE_ENABLE;
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
-               tp->rx_mode |= RX_MODE_IPV6_CSUM_ENABLE;
-
        tw32_f(MAC_RX_MODE, tp->rx_mode);
        udelay(10);
 
@@ -6500,18 +6097,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                tp->tg3_flags2 |= TG3_FLG2_HW_AUTONEG;
        }
 
-       if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) &&
-           (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) {
-               u32 tmp;
-
-               tmp = tr32(SERDES_RX_CTRL);
-               tw32(SERDES_RX_CTRL, tmp | SERDES_RX_SIG_DETECT);
-               tp->grc_local_ctrl &= ~GRC_LCLCTRL_USE_EXT_SIG_DETECT;
-               tp->grc_local_ctrl |= GRC_LCLCTRL_USE_SIG_DETECT;
-               tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
-       }
-
-       err = tg3_setup_phy(tp, reset_phy);
+       err = tg3_setup_phy(tp, 1);
        if (err)
                return err;
 
@@ -6584,12 +6170,12 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
 /* Called at device open time to get the chip ready for
  * packet processing.  Invoked with tp->lock held.
  */
-static int tg3_init_hw(struct tg3 *tp, int reset_phy)
+static int tg3_init_hw(struct tg3 *tp)
 {
        int err;
 
        /* Force the chip into D0. */
-       err = tg3_set_power_state(tp, PCI_D0);
+       err = tg3_set_power_state(tp, 0);
        if (err)
                goto out;
 
@@ -6597,7 +6183,7 @@ static int tg3_init_hw(struct tg3 *tp, int reset_phy)
 
        tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
 
-       err = tg3_reset_hw(tp, reset_phy);
+       err = tg3_reset_hw(tp);
 
 out:
        return err;
@@ -6645,19 +6231,12 @@ static void tg3_periodic_fetch_stats(struct tg3 *tp)
        TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG);
        TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS);
        TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE);
-
-       TG3_STAT_ADD32(&sp->rxbds_empty, RCVLPC_NO_RCV_BD_CNT);
-       TG3_STAT_ADD32(&sp->rx_discards, RCVLPC_IN_DISCARDS_CNT);
-       TG3_STAT_ADD32(&sp->rx_errors, RCVLPC_IN_ERRORS_CNT);
 }
 
 static void tg3_timer(unsigned long __opaque)
 {
        struct tg3 *tp = (struct tg3 *) __opaque;
 
-       if (tp->irq_sync)
-               goto restart_timer;
-
        spin_lock(&tp->lock);
 
        if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) {
@@ -6734,11 +6313,11 @@ static void tg3_timer(unsigned long __opaque)
                if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
                        u32 val;
 
-                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX,
-                                     FWCMD_NICDRV_ALIVE2);
-                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
+                       tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_MBOX,
+                                          FWCMD_NICDRV_ALIVE2);
+                       tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4);
                        /* 5 seconds timeout */
-                       tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5);
+                       tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5);
                        val = tr32(GRC_RX_CPU_EVENT);
                        val |= (1 << 14);
                        tw32(GRC_RX_CPU_EVENT, val);
@@ -6748,31 +6327,10 @@ static void tg3_timer(unsigned long __opaque)
 
        spin_unlock(&tp->lock);
 
-restart_timer:
        tp->timer.expires = jiffies + tp->timer_offset;
        add_timer(&tp->timer);
 }
 
-static int tg3_request_irq(struct tg3 *tp)
-{
-       irqreturn_t (*fn)(int, void *, struct pt_regs *);
-       unsigned long flags;
-       struct net_device *dev = tp->dev;
-
-       if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
-               fn = tg3_msi;
-               if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI)
-                       fn = tg3_msi_1shot;
-               flags = IRQF_SAMPLE_RANDOM;
-       } else {
-               fn = tg3_interrupt;
-               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
-                       fn = tg3_interrupt_tagged;
-               flags = IRQF_SHARED | IRQF_SAMPLE_RANDOM;
-       }
-       return (request_irq(tp->pdev->irq, fn, flags, dev->name, dev));
-}
-
 static int tg3_test_interrupt(struct tg3 *tp)
 {
        struct net_device *dev = tp->dev;
@@ -6787,7 +6345,7 @@ static int tg3_test_interrupt(struct tg3 *tp)
        free_irq(tp->pdev->irq, dev);
 
        err = request_irq(tp->pdev->irq, tg3_test_isr,
-                         IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev);
+                         SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
        if (err)
                return err;
 
@@ -6809,7 +6367,16 @@ static int tg3_test_interrupt(struct tg3 *tp)
 
        free_irq(tp->pdev->irq, dev);
        
-       err = tg3_request_irq(tp);
+       if (tp->tg3_flags2 & TG3_FLG2_USING_MSI)
+               err = request_irq(tp->pdev->irq, tg3_msi,
+                                 SA_SAMPLE_RANDOM, dev->name, dev);
+       else {
+               irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt;
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       fn = tg3_interrupt_tagged;
+               err = request_irq(tp->pdev->irq, fn,
+                                 SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       }
 
        if (err)
                return err;
@@ -6861,7 +6428,14 @@ static int tg3_test_msi(struct tg3 *tp)
 
        tp->tg3_flags2 &= ~TG3_FLG2_USING_MSI;
 
-       err = tg3_request_irq(tp);
+       {
+               irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt;
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       fn = tg3_interrupt_tagged;
+
+               err = request_irq(tp->pdev->irq, fn,
+                                 SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       }
        if (err)
                return err;
 
@@ -6871,7 +6445,7 @@ static int tg3_test_msi(struct tg3 *tp)
        tg3_full_lock(tp, 1);
 
        tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-       err = tg3_init_hw(tp, 1);
+       err = tg3_init_hw(tp);
 
        tg3_full_unlock(tp);
 
@@ -6888,12 +6462,6 @@ static int tg3_open(struct net_device *dev)
 
        tg3_full_lock(tp, 0);
 
-       err = tg3_set_power_state(tp, PCI_D0);
-       if (err) {
-               tg3_full_unlock(tp);
-               return err;
-       }
-
        tg3_disable_ints(tp);
        tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
 
@@ -6908,9 +6476,7 @@ static int tg3_open(struct net_device *dev)
 
        if ((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
            (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_AX) &&
-           (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX) &&
-           !((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714) &&
-             (tp->pdev_peer == tp->pdev))) {
+           (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5750_BX)) {
                /* All MSI supporting chips should support tagged
                 * status.  Assert that this is the case.
                 */
@@ -6925,7 +6491,17 @@ static int tg3_open(struct net_device *dev)
                        tp->tg3_flags2 |= TG3_FLG2_USING_MSI;
                }
        }
-       err = tg3_request_irq(tp);
+       if (tp->tg3_flags2 & TG3_FLG2_USING_MSI)
+               err = request_irq(tp->pdev->irq, tg3_msi,
+                                 SA_SAMPLE_RANDOM, dev->name, dev);
+       else {
+               irqreturn_t (*fn)(int, void *, struct pt_regs *)=tg3_interrupt;
+               if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+                       fn = tg3_interrupt_tagged;
+
+               err = request_irq(tp->pdev->irq, fn,
+                                 SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
+       }
 
        if (err) {
                if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
@@ -6938,7 +6514,7 @@ static int tg3_open(struct net_device *dev)
 
        tg3_full_lock(tp, 0);
 
-       err = tg3_init_hw(tp, 1);
+       err = tg3_init_hw(tp);
        if (err) {
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                tg3_free_rings(tp);
@@ -6990,14 +6566,6 @@ static int tg3_open(struct net_device *dev)
 
                        return err;
                }
-
-               if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) {
-                       if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) {
-                               u32 val = tr32(0x7c04);
-
-                               tw32(0x7c04, val | (1 << 29));
-                       }
-               }
        }
 
        tg3_full_lock(tp, 0);
@@ -7271,6 +6839,7 @@ static int tg3_close(struct net_device *dev)
        tp->tg3_flags &=
                ~(TG3_FLAG_INIT_COMPLETE |
                  TG3_FLAG_GOT_SERDES_FLOWCTL);
+       netif_carrier_off(tp->dev);
 
        tg3_full_unlock(tp);
 
@@ -7287,10 +6856,6 @@ static int tg3_close(struct net_device *dev)
 
        tg3_free_consistent(tp);
 
-       tg3_set_power_state(tp, PCI_D3hot);
-
-       netif_carrier_off(tp->dev);
-
        return 0;
 }
 
@@ -7585,9 +7150,6 @@ static void tg3_set_rx_mode(struct net_device *dev)
 {
        struct tg3 *tp = netdev_priv(dev);
 
-       if (!netif_running(dev))
-               return;
-
        tg3_full_lock(tp, 0);
        __tg3_set_rx_mode(dev);
        tg3_full_unlock(tp);
@@ -7612,9 +7174,6 @@ static void tg3_get_regs(struct net_device *dev,
 
        memset(p, 0, TG3_REGDUMP_LEN);
 
-       if (tp->link_config.phy_is_low_power)
-               return;
-
        tg3_full_lock(tp, 0);
 
 #define __GET_REG32(reg)       (*(p)++ = tr32(reg))
@@ -7681,7 +7240,6 @@ static int tg3_get_eeprom_len(struct net_device *dev)
 }
 
 static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val);
-static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val);
 
 static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
 {
@@ -7690,9 +7248,6 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
        u8  *pd;
        u32 i, offset, len, val, b_offset, b_count;
 
-       if (tp->link_config.phy_is_low_power)
-               return -EAGAIN;
-
        offset = eeprom->offset;
        len = eeprom->len;
        eeprom->len = 0;
@@ -7754,9 +7309,6 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
        u32 offset, len, b_offset, odd_len, start, end;
        u8 *buf;
 
-       if (tp->link_config.phy_is_low_power)
-               return -EAGAIN;
-
        if (eeprom->magic != TG3_EEPROM_MAGIC)
                return -EINVAL;
 
@@ -7892,7 +7444,6 @@ static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info
   
        strcpy(info->driver, DRV_MODULE_NAME);
        strcpy(info->version, DRV_MODULE_VERSION);
-       strcpy(info->fw_version, tp->fw_ver);
        strcpy(info->bus_info, pci_name(tp->pdev));
 }
   
@@ -7950,12 +7501,6 @@ static int tg3_set_tso(struct net_device *dev, u32 value)
                        return -EINVAL;
                return 0;
        }
-       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) {
-               if (value)
-                       dev->features |= NETIF_F_TSO6;
-               else
-                       dev->features &= ~NETIF_F_TSO6;
-       }
        return ethtool_op_set_tso(dev, value);
 }
 #endif
@@ -7993,27 +7538,18 @@ static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *
   
        ering->rx_max_pending = TG3_RX_RING_SIZE - 1;
        ering->rx_mini_max_pending = 0;
-       if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE)
-               ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1;
-       else
-               ering->rx_jumbo_max_pending = 0;
-
-       ering->tx_max_pending = TG3_TX_RING_SIZE - 1;
+       ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1;
 
        ering->rx_pending = tp->rx_pending;
        ering->rx_mini_pending = 0;
-       if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE)
-               ering->rx_jumbo_pending = tp->rx_jumbo_pending;
-       else
-               ering->rx_jumbo_pending = 0;
-
+       ering->rx_jumbo_pending = tp->rx_jumbo_pending;
        ering->tx_pending = tp->tx_pending;
 }
   
 static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
 {
        struct tg3 *tp = netdev_priv(dev);
-       int irq_sync = 0, err = 0;
+       int irq_sync = 0;
   
        if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) ||
            (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) ||
@@ -8037,14 +7573,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
 
        if (netif_running(dev)) {
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               err = tg3_restart_hw(tp, 1);
-               if (!err)
-                       tg3_netif_start(tp);
+               tg3_init_hw(tp);
+               tg3_netif_start(tp);
        }
 
        tg3_full_unlock(tp);
   
-       return err;
+       return 0;
 }
   
 static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
@@ -8059,7 +7594,7 @@ static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam
 static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
 {
        struct tg3 *tp = netdev_priv(dev);
-       int irq_sync = 0, err = 0;
+       int irq_sync = 0;
   
        if (netif_running(dev)) {
                tg3_netif_stop(tp);
@@ -8083,14 +7618,13 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
 
        if (netif_running(dev)) {
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               err = tg3_restart_hw(tp, 1);
-               if (!err)
-                       tg3_netif_start(tp);
+               tg3_init_hw(tp);
+               tg3_netif_start(tp);
        }
 
        tg3_full_unlock(tp);
   
-       return err;
+       return 0;
 }
   
 static u32 tg3_get_rx_csum(struct net_device *dev)
@@ -8129,11 +7663,10 @@ static int tg3_set_tx_csum(struct net_device *dev, u32 data)
                return 0;
        }
   
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-               ethtool_op_set_tx_hw_csum(dev, data);
+       if (data)
+               dev->features |= NETIF_F_IP_CSUM;
        else
-               ethtool_op_set_tx_csum(dev, data);
+               dev->features &= ~NETIF_F_IP_CSUM;
 
        return 0;
 }
@@ -8203,56 +7736,29 @@ static void tg3_get_ethtool_stats (struct net_device *dev,
 }
 
 #define NVRAM_TEST_SIZE 0x100
-#define NVRAM_SELFBOOT_FORMAT1_SIZE 0x14
 
 static int tg3_test_nvram(struct tg3 *tp)
 {
-       u32 *buf, csum, magic;
-       int i, j, err = 0, size;
-
-       if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
-               return -EIO;
+       u32 *buf, csum;
+       int i, j, err = 0;
 
-       if (magic == TG3_EEPROM_MAGIC)
-               size = NVRAM_TEST_SIZE;
-       else if ((magic & 0xff000000) == 0xa5000000) {
-               if ((magic & 0xe00000) == 0x200000)
-                       size = NVRAM_SELFBOOT_FORMAT1_SIZE;
-               else
-                       return 0;
-       } else
-               return -EIO;
-
-       buf = kmalloc(size, GFP_KERNEL);
+       buf = kmalloc(NVRAM_TEST_SIZE, GFP_KERNEL);
        if (buf == NULL)
                return -ENOMEM;
 
-       err = -EIO;
-       for (i = 0, j = 0; i < size; i += 4, j++) {
+       for (i = 0, j = 0; i < NVRAM_TEST_SIZE; i += 4, j++) {
                u32 val;
 
                if ((err = tg3_nvram_read(tp, i, &val)) != 0)
                        break;
                buf[j] = cpu_to_le32(val);
        }
-       if (i < size)
+       if (i < NVRAM_TEST_SIZE)
                goto out;
 
-       /* Selfboot format */
-       if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC) {
-               u8 *buf8 = (u8 *) buf, csum8 = 0;
-
-               for (i = 0; i < size; i++)
-                       csum8 += buf8[i];
-
-               if (csum8 == 0) {
-                       err = 0;
-                       goto out;
-               }
-
-               err = -EIO;
+       err = -EIO;
+       if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC)
                goto out;
-       }
 
        /* Bootstrap checksum at offset 0x10 */
        csum = calc_crc((unsigned char *) buf, 0x10);
@@ -8512,7 +8018,7 @@ out:
 
 static int tg3_do_mem_test(struct tg3 *tp, u32 offset, u32 len)
 {
-       static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a };
+       static u32 test_pattern[] = { 0x00000000, 0xffffffff, 0xaa55a55a };
        int i;
        u32 j;
 
@@ -8546,25 +8052,14 @@ static int tg3_test_memory(struct tg3 *tp)
                { 0x00008000, 0x02000},
                { 0x00010000, 0x0e000},
                { 0xffffffff, 0x00000}
-       }, mem_tbl_5755[] = {
-               { 0x00000200, 0x00008},
-               { 0x00004000, 0x00800},
-               { 0x00006000, 0x00800},
-               { 0x00008000, 0x02000},
-               { 0x00010000, 0x0c000},
-               { 0xffffffff, 0x00000}
        };
        struct mem_entry *mem_tbl;
        int err = 0;
        int i;
 
-       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-                   GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-                       mem_tbl = mem_tbl_5755;
-               else
-                       mem_tbl = mem_tbl_5705;
-       } else
+       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
+               mem_tbl = mem_tbl_5705;
+       else
                mem_tbl = mem_tbl_570x;
 
        for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) {
@@ -8613,11 +8108,8 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
                }
                mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) |
                           MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII;
-               if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
+               if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)
                        mac_mode &= ~MAC_MODE_LINK_POLARITY;
-                       tg3_writephy(tp, MII_TG3_EXT_CTRL,
-                                    MII_TG3_EXT_CTRL_LNK3_LED_MODE);
-               }
                tw32(MAC_MODE, mac_mode);
        }
        else
@@ -8626,10 +8118,7 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
        err = -EIO;
 
        tx_len = 1514;
-       skb = netdev_alloc_skb(tp->dev, tx_len);
-       if (!skb)
-               return -ENOMEM;
-
+       skb = dev_alloc_skb(tx_len);
        tx_data = skb_put(skb, tx_len);
        memcpy(tx_data, tp->dev->dev_addr, 6);
        memset(tx_data + 6, 0x0, 8);
@@ -8725,9 +8214,7 @@ static int tg3_test_loopback(struct tg3 *tp)
        if (!netif_running(tp->dev))
                return TG3_LOOPBACK_FAILED;
 
-       err = tg3_reset_hw(tp, 1);
-       if (err)
-               return TG3_LOOPBACK_FAILED;
+       tg3_reset_hw(tp);
 
        if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
                err |= TG3_MAC_LOOPBACK_FAILED;
@@ -8744,9 +8231,6 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
 {
        struct tg3 *tp = netdev_priv(dev);
 
-       if (tp->link_config.phy_is_low_power)
-               tg3_set_power_state(tp, PCI_D0);
-
        memset(data, 0, sizeof(u64) * TG3_NUM_TEST);
 
        if (tg3_test_nvram(tp) != 0) {
@@ -8775,9 +8259,6 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
                if (!err)
                        tg3_nvram_unlock(tp);
 
-               if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
-                       tg3_phy_reset(tp);
-
                if (tg3_test_registers(tp) != 0) {
                        etest->flags |= ETH_TEST_FL_FAILED;
                        data[2] = 1;
@@ -8801,15 +8282,12 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                if (netif_running(dev)) {
                        tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
-                       if (!tg3_restart_hw(tp, 1))
-                               tg3_netif_start(tp);
+                       tg3_init_hw(tp);
+                       tg3_netif_start(tp);
                }
 
                tg3_full_unlock(tp);
        }
-       if (tp->link_config.phy_is_low_power)
-               tg3_set_power_state(tp, PCI_D3hot);
-
 }
 
 static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
@@ -8829,9 +8307,6 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
                        break;                  /* We have no PHY */
 
-               if (tp->link_config.phy_is_low_power)
-                       return -EAGAIN;
-
                spin_lock_bh(&tp->lock);
                err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval);
                spin_unlock_bh(&tp->lock);
@@ -8848,9 +8323,6 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                if (!capable(CAP_NET_ADMIN))
                        return -EPERM;
 
-               if (tp->link_config.phy_is_low_power)
-                       return -EAGAIN;
-
                spin_lock_bh(&tp->lock);
                err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in);
                spin_unlock_bh(&tp->lock);
@@ -8869,9 +8341,6 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 {
        struct tg3 *tp = netdev_priv(dev);
 
-       if (netif_running(dev))
-               tg3_netif_stop(tp);
-
        tg3_full_lock(tp, 0);
 
        tp->vlgrp = grp;
@@ -8880,25 +8349,16 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
        __tg3_set_rx_mode(dev);
 
        tg3_full_unlock(tp);
-
-       if (netif_running(dev))
-               tg3_netif_start(tp);
 }
 
 static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
 {
        struct tg3 *tp = netdev_priv(dev);
 
-       if (netif_running(dev))
-               tg3_netif_stop(tp);
-
        tg3_full_lock(tp, 0);
        if (tp->vlgrp)
                tp->vlgrp->vlan_devices[vid] = NULL;
        tg3_full_unlock(tp);
-
-       if (netif_running(dev))
-               tg3_netif_start(tp);
 }
 #endif
 
@@ -9006,14 +8466,14 @@ static struct ethtool_ops tg3_ethtool_ops = {
 
 static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
 {
-       u32 cursize, val, magic;
+       u32 cursize, val;
 
        tp->nvram_size = EEPROM_CHIP_SIZE;
 
-       if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
+       if (tg3_nvram_read(tp, 0, &val) != 0)
                return;
 
-       if ((magic != TG3_EEPROM_MAGIC) && ((magic & 0xff000000) != 0xa5000000))
+       if (swab32(val) != TG3_EEPROM_MAGIC)
                return;
 
        /*
@@ -9021,13 +8481,13 @@ static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
         * When we encounter our validation signature, we know the addressing
         * has wrapped around, and thus have our chip size.
         */
-       cursize = 0x10;
+       cursize = 0x800;
 
        while (cursize < tp->nvram_size) {
-               if (tg3_nvram_read_swab(tp, cursize, &val) != 0)
+               if (tg3_nvram_read(tp, cursize, &val) != 0)
                        return;
 
-               if (val == magic)
+               if (swab32(val) == TG3_EEPROM_MAGIC)
                        break;
 
                cursize <<= 1;
@@ -9040,15 +8500,6 @@ static void __devinit tg3_get_nvram_size(struct tg3 *tp)
 {
        u32 val;
 
-       if (tg3_nvram_read_swab(tp, 0, &val) != 0)
-               return;
-
-       /* Selfboot format */
-       if (val != TG3_EEPROM_MAGIC) {
-               tg3_get_eeprom_size(tp);
-               return;
-       }
-
        if (tg3_nvram_read(tp, 0xf0, &val) == 0) {
                if (val != 0) {
                        tp->nvram_size = (val >> 16) * 1024;
@@ -9172,90 +8623,14 @@ static void __devinit tg3_get_5752_nvram_info(struct tg3 *tp)
        }
 }
 
-static void __devinit tg3_get_5755_nvram_info(struct tg3 *tp)
-{
-       u32 nvcfg1;
-
-       nvcfg1 = tr32(NVRAM_CFG1);
-
-       /* NVRAM protection for TPM */
-       if (nvcfg1 & (1 << 27))
-               tp->tg3_flags2 |= TG3_FLG2_PROTECTED_NVRAM;
-
-       switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
-               case FLASH_5755VENDOR_ATMEL_EEPROM_64KHZ:
-               case FLASH_5755VENDOR_ATMEL_EEPROM_376KHZ:
-                       tp->nvram_jedecnum = JEDEC_ATMEL;
-                       tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-                       tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
-
-                       nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
-                       tw32(NVRAM_CFG1, nvcfg1);
-                       break;
-               case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
-               case FLASH_5755VENDOR_ATMEL_FLASH_1:
-               case FLASH_5755VENDOR_ATMEL_FLASH_2:
-               case FLASH_5755VENDOR_ATMEL_FLASH_3:
-               case FLASH_5755VENDOR_ATMEL_FLASH_4:
-                       tp->nvram_jedecnum = JEDEC_ATMEL;
-                       tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-                       tp->tg3_flags2 |= TG3_FLG2_FLASH;
-                       tp->nvram_pagesize = 264;
-                       break;
-               case FLASH_5752VENDOR_ST_M45PE10:
-               case FLASH_5752VENDOR_ST_M45PE20:
-               case FLASH_5752VENDOR_ST_M45PE40:
-                       tp->nvram_jedecnum = JEDEC_ST;
-                       tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-                       tp->tg3_flags2 |= TG3_FLG2_FLASH;
-                       tp->nvram_pagesize = 256;
-                       break;
-       }
-}
-
-static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp)
-{
-       u32 nvcfg1;
-
-       nvcfg1 = tr32(NVRAM_CFG1);
-
-       switch (nvcfg1 & NVRAM_CFG1_5752VENDOR_MASK) {
-               case FLASH_5787VENDOR_ATMEL_EEPROM_64KHZ:
-               case FLASH_5787VENDOR_ATMEL_EEPROM_376KHZ:
-               case FLASH_5787VENDOR_MICRO_EEPROM_64KHZ:
-               case FLASH_5787VENDOR_MICRO_EEPROM_376KHZ:
-                       tp->nvram_jedecnum = JEDEC_ATMEL;
-                       tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-                       tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE;
-
-                       nvcfg1 &= ~NVRAM_CFG1_COMPAT_BYPASS;
-                       tw32(NVRAM_CFG1, nvcfg1);
-                       break;
-               case FLASH_5752VENDOR_ATMEL_FLASH_BUFFERED:
-               case FLASH_5755VENDOR_ATMEL_FLASH_1:
-               case FLASH_5755VENDOR_ATMEL_FLASH_2:
-               case FLASH_5755VENDOR_ATMEL_FLASH_3:
-                       tp->nvram_jedecnum = JEDEC_ATMEL;
-                       tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-                       tp->tg3_flags2 |= TG3_FLG2_FLASH;
-                       tp->nvram_pagesize = 264;
-                       break;
-               case FLASH_5752VENDOR_ST_M45PE10:
-               case FLASH_5752VENDOR_ST_M45PE20:
-               case FLASH_5752VENDOR_ST_M45PE40:
-                       tp->nvram_jedecnum = JEDEC_ST;
-                       tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED;
-                       tp->tg3_flags2 |= TG3_FLG2_FLASH;
-                       tp->nvram_pagesize = 256;
-                       break;
-       }
-}
-
 /* Chips other than 5700/5701 use the NVRAM for fetching info. */
 static void __devinit tg3_nvram_init(struct tg3 *tp)
 {
        int j;
 
+       if (tp->tg3_flags2 & TG3_FLG2_SUN_570X)
+               return;
+
        tw32_f(GRC_EEPROM_ADDR,
             (EEPROM_ADDR_FSM_RESET |
              (EEPROM_DEFAULT_CLOCK_PERIOD <<
@@ -9283,10 +8658,6 @@ static void __devinit tg3_nvram_init(struct tg3 *tp)
 
                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
                        tg3_get_5752_nvram_info(tp);
-               else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
-                       tg3_get_5755_nvram_info(tp);
-               else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-                       tg3_get_5787_nvram_info(tp);
                else
                        tg3_get_nvram_info(tp);
 
@@ -9356,42 +8727,26 @@ static int tg3_nvram_exec_cmd(struct tg3 *tp, u32 nvram_cmd)
        return 0;
 }
 
-static u32 tg3_nvram_phys_addr(struct tg3 *tp, u32 addr)
-{
-       if ((tp->tg3_flags & TG3_FLAG_NVRAM) &&
-           (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
-           (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
-           (tp->nvram_jedecnum == JEDEC_ATMEL))
-
-               addr = ((addr / tp->nvram_pagesize) <<
-                       ATMEL_AT45DB0X1B_PAGE_POS) +
-                      (addr % tp->nvram_pagesize);
-
-       return addr;
-}
-
-static u32 tg3_nvram_logical_addr(struct tg3 *tp, u32 addr)
-{
-       if ((tp->tg3_flags & TG3_FLAG_NVRAM) &&
-           (tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
-           (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
-           (tp->nvram_jedecnum == JEDEC_ATMEL))
-
-               addr = ((addr >> ATMEL_AT45DB0X1B_PAGE_POS) *
-                       tp->nvram_pagesize) +
-                      (addr & ((1 << ATMEL_AT45DB0X1B_PAGE_POS) - 1));
-
-       return addr;
-}
-
 static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
 {
        int ret;
 
+       if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
+               printk(KERN_ERR PFX "Attempt to do nvram_read on Sun 570X\n");
+               return -EINVAL;
+       }
+
        if (!(tp->tg3_flags & TG3_FLAG_NVRAM))
                return tg3_nvram_read_using_eeprom(tp, offset, val);
 
-       offset = tg3_nvram_phys_addr(tp, offset);
+       if ((tp->tg3_flags & TG3_FLAG_NVRAM_BUFFERED) &&
+               (tp->tg3_flags2 & TG3_FLG2_FLASH) &&
+               (tp->nvram_jedecnum == JEDEC_ATMEL)) {
+
+               offset = ((offset / tp->nvram_pagesize) <<
+                         ATMEL_AT45DB0X1B_PAGE_POS) +
+                       (offset % tp->nvram_pagesize);
+       }
 
        if (offset > NVRAM_ADDR_MSK)
                return -EINVAL;
@@ -9416,16 +8771,6 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
        return ret;
 }
 
-static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val)
-{
-       int err;
-       u32 tmp;
-
-       err = tg3_nvram_read(tp, offset, &tmp);
-       *val = swab32(tmp);
-       return err;
-}
-
 static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
                                    u32 offset, u32 len, u8 *buf)
 {
@@ -9578,7 +8923,15 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
 
                page_off = offset % tp->nvram_pagesize;
 
-               phy_addr = tg3_nvram_phys_addr(tp, offset);
+               if ((tp->tg3_flags2 & TG3_FLG2_FLASH) &&
+                       (tp->nvram_jedecnum == JEDEC_ATMEL)) {
+
+                       phy_addr = ((offset / tp->nvram_pagesize) <<
+                                   ATMEL_AT45DB0X1B_PAGE_POS) + page_off;
+               }
+               else {
+                       phy_addr = offset;
+               }
 
                tw32(NVRAM_ADDR, phy_addr);
 
@@ -9586,15 +8939,13 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
 
                if ((page_off == 0) || (i == 0))
                        nvram_cmd |= NVRAM_CMD_FIRST;
-               if (page_off == (tp->nvram_pagesize - 4))
+               else if (page_off == (tp->nvram_pagesize - 4))
                        nvram_cmd |= NVRAM_CMD_LAST;
 
                if (i == (len - 4))
                        nvram_cmd |= NVRAM_CMD_LAST;
 
                if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) &&
-                   (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
-                   (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) &&
                    (tp->nvram_jedecnum == JEDEC_ST) &&
                    (nvram_cmd & NVRAM_CMD_FIRST)) {
 
@@ -9620,6 +8971,11 @@ static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
 {
        int ret;
 
+       if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
+               printk(KERN_ERR PFX "Attempt to do nvram_write on Sun 570X\n");
+               return -EINVAL;
+       }
+
        if (tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) {
                tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl &
                       ~GRC_LCLCTRL_GPIO_OUTPUT1);
@@ -9727,18 +9083,12 @@ static inline struct subsys_tbl_ent *lookup_by_subsys(struct tg3 *tp)
        return NULL;
 }
 
+/* Since this function may be called in D3-hot power state during
+ * tg3_init_one(), only config cycles are allowed.
+ */
 static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
 {
        u32 val;
-       u16 pmcsr;
-
-       /* On some early chips the SRAM cannot be accessed in D3hot state,
-        * so need make sure we're in D0.
-        */
-       pci_read_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, &pmcsr);
-       pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
-       pci_write_config_word(tp->pdev, tp->pm_cap + PCI_PM_CTRL, pmcsr);
-       msleep(1);
 
        /* Make sure register accesses (indirect or otherwise)
         * will function correctly.
@@ -9746,20 +9096,9 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
        pci_write_config_dword(tp->pdev, TG3PCI_MISC_HOST_CTRL,
                               tp->misc_host_ctrl);
 
-       /* The memory arbiter has to be enabled in order for SRAM accesses
-        * to succeed.  Normally on powerup the tg3 chip firmware will make
-        * sure it is enabled, but other entities such as system netboot
-        * code might disable it.
-        */
-       val = tr32(MEMARB_MODE);
-       tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE);
-
        tp->phy_id = PHY_ID_INVALID;
        tp->led_ctrl = LED_CTRL_MODE_PHY_1;
 
-       /* Assume an onboard device by default.  */
-       tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
-
        tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val);
        if (val == NIC_SRAM_DATA_SIG_MAGIC) {
                u32 nic_cfg, led_cfg;
@@ -9856,10 +9195,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp)
                    tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL)
                        tp->led_ctrl = LED_CTRL_MODE_PHY_2;
 
-               if (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP)
+               if ((GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) &&
+                   (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) &&
+                   (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP))
                        tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT;
-               else
-                       tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT;
 
                if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) {
                        tp->tg3_flags |= TG3_FLAG_ENABLE_ASF;
@@ -10005,55 +9344,32 @@ skip_phy_reset:
 static void __devinit tg3_read_partno(struct tg3 *tp)
 {
        unsigned char vpd_data[256];
-       int i;
-       u32 magic;
-
-       if (tg3_nvram_read_swab(tp, 0x0, &magic))
-               goto out_not_found;
+       unsigned int i;
 
-       if (magic == TG3_EEPROM_MAGIC) {
-               for (i = 0; i < 256; i += 4) {
-                       u32 tmp;
+       if (tp->tg3_flags2 & TG3_FLG2_SUN_570X) {
+               /* Sun decided not to put the necessary bits in the
+                * NVRAM of their onboard tg3 parts :(
+                */
+               strcpy(tp->board_part_number, "Sun 570X");
+               return;
+       }
 
-                       if (tg3_nvram_read(tp, 0x100 + i, &tmp))
-                               goto out_not_found;
+       for (i = 0; i < 256; i += 4) {
+               u32 tmp;
 
-                       vpd_data[i + 0] = ((tmp >>  0) & 0xff);
-                       vpd_data[i + 1] = ((tmp >>  8) & 0xff);
-                       vpd_data[i + 2] = ((tmp >> 16) & 0xff);
-                       vpd_data[i + 3] = ((tmp >> 24) & 0xff);
-               }
-       } else {
-               int vpd_cap;
-
-               vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD);
-               for (i = 0; i < 256; i += 4) {
-                       u32 tmp, j = 0;
-                       u16 tmp16;
-
-                       pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR,
-                                             i);
-                       while (j++ < 100) {
-                               pci_read_config_word(tp->pdev, vpd_cap +
-                                                    PCI_VPD_ADDR, &tmp16);
-                               if (tmp16 & 0x8000)
-                                       break;
-                               msleep(1);
-                       }
-                       if (!(tmp16 & 0x8000))
-                               goto out_not_found;
+               if (tg3_nvram_read(tp, 0x100 + i, &tmp))
+                       goto out_not_found;
 
-                       pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA,
-                                             &tmp);
-                       tmp = cpu_to_le32(tmp);
-                       memcpy(&vpd_data[i], &tmp, 4);
-               }
+               vpd_data[i + 0] = ((tmp >>  0) & 0xff);
+               vpd_data[i + 1] = ((tmp >>  8) & 0xff);
+               vpd_data[i + 2] = ((tmp >> 16) & 0xff);
+               vpd_data[i + 3] = ((tmp >> 24) & 0xff);
        }
 
        /* Now parse and find the part number. */
-       for (i = 0; i < 256; ) {
+       for (i = 0; i < 254; ) {
                unsigned char val = vpd_data[i];
-               int block_end;
+               unsigned int block_end;
 
                if (val == 0x82 || val == 0x91) {
                        i = (i + 3 +
@@ -10069,21 +9385,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
                             (vpd_data[i + 1] +
                              (vpd_data[i + 2] << 8)));
                i += 3;
-               while (i < block_end) {
+
+               if (block_end > 256)
+                       goto out_not_found;
+
+               while (i < (block_end - 2)) {
                        if (vpd_data[i + 0] == 'P' &&
                            vpd_data[i + 1] == 'N') {
                                int partno_len = vpd_data[i + 2];
 
-                               if (partno_len > 24)
+                               i += 3;
+                               if (partno_len > 24 || (partno_len + i) > 256)
                                        goto out_not_found;
 
                                memcpy(tp->board_part_number,
-                                      &vpd_data[i + 3],
-                                      partno_len);
+                                      &vpd_data[i], partno_len);
 
                                /* Success. */
                                return;
                        }
+                       i += 3 + vpd_data[i + 2];
                }
 
                /* Part number not found. */
@@ -10094,53 +9415,42 @@ out_not_found:
        strcpy(tp->board_part_number, "none");
 }
 
-static void __devinit tg3_read_fw_ver(struct tg3 *tp)
+#ifdef CONFIG_SPARC64
+static int __devinit tg3_is_sun_570X(struct tg3 *tp)
 {
-       u32 val, offset, start;
-
-       if (tg3_nvram_read_swab(tp, 0, &val))
-               return;
-
-       if (val != TG3_EEPROM_MAGIC)
-               return;
-
-       if (tg3_nvram_read_swab(tp, 0xc, &offset) ||
-           tg3_nvram_read_swab(tp, 0x4, &start))
-               return;
-
-       offset = tg3_nvram_logical_addr(tp, offset);
-       if (tg3_nvram_read_swab(tp, offset, &val))
-               return;
-
-       if ((val & 0xfc000000) == 0x0c000000) {
-               u32 ver_offset, addr;
-               int i;
-
-               if (tg3_nvram_read_swab(tp, offset + 4, &val) ||
-                   tg3_nvram_read_swab(tp, offset + 8, &ver_offset))
-                       return;
-
-               if (val != 0)
-                       return;
+       struct pci_dev *pdev = tp->pdev;
+       struct pcidev_cookie *pcp = pdev->sysdata;
 
-               addr = offset + ver_offset - start;
-               for (i = 0; i < 16; i += 4) {
-                       if (tg3_nvram_read(tp, addr + i, &val))
-                               return;
+       if (pcp != NULL) {
+               int node = pcp->prom_node;
+               u32 venid;
+               int err;
 
-                       val = cpu_to_le32(val);
-                       memcpy(tp->fw_ver + i, &val, 4);
-               }
+               err = prom_getproperty(node, "subsystem-vendor-id",
+                                      (char *) &venid, sizeof(venid));
+               if (err == 0 || err == -1)
+                       return 0;
+               if (venid == PCI_VENDOR_ID_SUN)
+                       return 1;
+
+               /* TG3 chips onboard the SunBlade-2500 don't have the
+                * subsystem-vendor-id set to PCI_VENDOR_ID_SUN but they
+                * are distinguishable from non-Sun variants by being
+                * named "network" by the firmware.  Non-Sun cards will
+                * show up as being named "ethernet".
+                */
+               if (!strcmp(pcp->prom_name, "network"))
+                       return 1;
        }
+       return 0;
 }
+#endif
 
 static int __devinit tg3_get_invariants(struct tg3 *tp)
 {
        static struct pci_device_id write_reorder_chipsets[] = {
                { PCI_DEVICE(PCI_VENDOR_ID_AMD,
                             PCI_DEVICE_ID_AMD_FE_GATE_700C) },
-               { PCI_DEVICE(PCI_VENDOR_ID_AMD,
-                            PCI_DEVICE_ID_AMD_8131_BRIDGE) },
                { PCI_DEVICE(PCI_VENDOR_ID_VIA,
                             PCI_DEVICE_ID_VIA_8385_0) },
                { },
@@ -10152,6 +9462,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        u16 pci_cmd;
        int err;
 
+#ifdef CONFIG_SPARC64
+       if (tg3_is_sun_570X(tp))
+               tp->tg3_flags2 |= TG3_FLG2_SUN_570X;
+#endif
+
        /* Force memory write invalidate off.  If we leave it on,
         * then on 5700_BX chips we have to enable a workaround.
         * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary
@@ -10291,8 +9606,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 ||
            (tp->tg3_flags2 & TG3_FLG2_5780_CLASS))
                tp->tg3_flags2 |= TG3_FLG2_5750_PLUS;
 
@@ -10300,26 +9613,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
            (tp->tg3_flags2 & TG3_FLG2_5750_PLUS))
                tp->tg3_flags2 |= TG3_FLG2_5705_PLUS;
 
-       if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-                   GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
-                       tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2;
-                       tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI;
-               } else {
-                       tp->tg3_flags2 |= TG3_FLG2_HW_TSO_1 |
-                                         TG3_FLG2_HW_TSO_1_BUG;
-                       if (GET_ASIC_REV(tp->pci_chip_rev_id) ==
-                               ASIC_REV_5750 &&
-                           tp->pci_chip_rev_id >= CHIPREV_ID_5750_C2)
-                               tp->tg3_flags2 &= ~TG3_FLG2_HW_TSO_1_BUG;
-               }
-       }
+       if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS)
+               tp->tg3_flags2 |= TG3_FLG2_HW_TSO;
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
            GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 &&
-           GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 &&
-           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_5752)
                tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE;
 
        if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0)
@@ -10450,12 +9749,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
                pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd);
        }
 
-       if (tp->write32 == tg3_write_indirect_reg32 ||
-           ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) &&
-            (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
-             GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)))
-               tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG;
-
        /* Get eeprom hw config before calling tg3_set_power_state().
         * In particular, the TG3_FLAG_EEPROM_WRITE_PROT flag must be
         * determined before calling tg3_set_power_state() so that
@@ -10481,11 +9774,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752)
                tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3;
 
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
-               tp->grc_local_ctrl |= GRC_LCLCTRL_GPIO_UART_SEL;
-
        /* Force the chip into D0. */
-       err = tg3_set_power_state(tp, PCI_D0);
+       err = tg3_set_power_state(tp, 0);
        if (err) {
                printk(KERN_ERR PFX "(%s) transition to D0 failed\n",
                       pci_name(tp->pdev));
@@ -10498,6 +9788,15 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        if (tp->pci_chip_rev_id == CHIPREV_ID_5700_B0)
                tp->tg3_flags |= TG3_FLAG_BROKEN_CHECKSUMS;
 
+       /* Pseudo-header checksum is done by hardware logic and not
+        * the offload processers, so make the chip do the pseudo-
+        * header checksums on receive.  For transmit it is more
+        * convenient to do the pseudo-header checksum in software
+        * as Linux does that on transmit for us in all cases.
+        */
+       tp->tg3_flags |= TG3_FLAG_NO_TX_PSEUDO_CSUM;
+       tp->tg3_flags &= ~TG3_FLAG_NO_RX_PSEUDO_CSUM;
+
        /* Derive initial jumbo mode from MTU assigned in
         * ether_setup() via the alloc_etherdev() call
         */
@@ -10529,13 +9828,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0)
                tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
 
-       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-                   GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-                       tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
-               else
-                       tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
-       }
+       if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)
+               tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
 
        tp->coalesce_mode = 0;
        if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
@@ -10634,7 +9928,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        }
 
        tg3_read_partno(tp);
-       tg3_read_fw_ver(tp);
 
        if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
                tp->tg3_flags &= ~TG3_FLAG_USE_MI_INTERRUPT;
@@ -10670,30 +9963,16 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        else
                tp->tg3_flags &= ~TG3_FLAG_POLL_SERDES;
 
-       /* All chips before 5787 can get confused if TX buffers
+       /* It seems all chips can get confused if TX buffers
         * straddle the 4GB address boundary in some cases.
         */
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-               tp->dev->hard_start_xmit = tg3_start_xmit;
-       else
-               tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug;
+       tp->dev->hard_start_xmit = tg3_start_xmit;
 
        tp->rx_offset = 2;
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
            (tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0)
                tp->rx_offset = 0;
 
-       tp->rx_std_max_post = TG3_RX_RING_SIZE;
-
-       /* Increment the rx prod index on the rx std ring by at most
-        * 8 for these chips to workaround hw errata.
-        */
-       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 ||
-           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755)
-               tp->rx_std_max_post = 8;
-
        /* By default, disable wake-on-lan.  User can change this
         * using ETHTOOL_SWOL.
         */
@@ -10710,13 +9989,11 @@ static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp)
        struct pcidev_cookie *pcp = pdev->sysdata;
 
        if (pcp != NULL) {
-               unsigned char *addr;
-               int len;
+               int node = pcp->prom_node;
 
-               addr = of_get_property(pcp->prom_node, "local-mac-address",
-                                       &len);
-               if (addr && len == 6) {
-                       memcpy(dev->dev_addr, addr, 6);
+               if (prom_getproplen(node, "local-mac-address") == 6) {
+                       prom_getproperty(node, "local-mac-address",
+                                        dev->dev_addr, 6);
                        memcpy(dev->perm_addr, dev->dev_addr, 6);
                        return 0;
                }
@@ -10738,7 +10015,6 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
 {
        struct net_device *dev = tp->dev;
        u32 hi, lo, mac_offset;
-       int addr_ok = 0;
 
 #ifdef CONFIG_SPARC64
        if (!tg3_get_macaddr_sparc(tp))
@@ -10746,7 +10022,8 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
 #endif
 
        mac_offset = 0x7c;
-       if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) ||
+       if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 &&
+            !(tp->tg3_flags & TG3_FLG2_SUN_570X)) ||
            (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) {
                if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID)
                        mac_offset = 0xcc;
@@ -10767,33 +10044,29 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
                dev->dev_addr[3] = (lo >> 16) & 0xff;
                dev->dev_addr[4] = (lo >>  8) & 0xff;
                dev->dev_addr[5] = (lo >>  0) & 0xff;
+       }
+       /* Next, try NVRAM. */
+       else if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) &&
+                !tg3_nvram_read(tp, mac_offset + 0, &hi) &&
+                !tg3_nvram_read(tp, mac_offset + 4, &lo)) {
+               dev->dev_addr[0] = ((hi >> 16) & 0xff);
+               dev->dev_addr[1] = ((hi >> 24) & 0xff);
+               dev->dev_addr[2] = ((lo >>  0) & 0xff);
+               dev->dev_addr[3] = ((lo >>  8) & 0xff);
+               dev->dev_addr[4] = ((lo >> 16) & 0xff);
+               dev->dev_addr[5] = ((lo >> 24) & 0xff);
+       }
+       /* Finally just fetch it out of the MAC control regs. */
+       else {
+               hi = tr32(MAC_ADDR_0_HIGH);
+               lo = tr32(MAC_ADDR_0_LOW);
 
-               /* Some old bootcode may report a 0 MAC address in SRAM */
-               addr_ok = is_valid_ether_addr(&dev->dev_addr[0]);
-       }
-       if (!addr_ok) {
-               /* Next, try NVRAM. */
-               if (!tg3_nvram_read(tp, mac_offset + 0, &hi) &&
-                   !tg3_nvram_read(tp, mac_offset + 4, &lo)) {
-                       dev->dev_addr[0] = ((hi >> 16) & 0xff);
-                       dev->dev_addr[1] = ((hi >> 24) & 0xff);
-                       dev->dev_addr[2] = ((lo >>  0) & 0xff);
-                       dev->dev_addr[3] = ((lo >>  8) & 0xff);
-                       dev->dev_addr[4] = ((lo >> 16) & 0xff);
-                       dev->dev_addr[5] = ((lo >> 24) & 0xff);
-               }
-               /* Finally just fetch it out of the MAC control regs. */
-               else {
-                       hi = tr32(MAC_ADDR_0_HIGH);
-                       lo = tr32(MAC_ADDR_0_LOW);
-
-                       dev->dev_addr[5] = lo & 0xff;
-                       dev->dev_addr[4] = (lo >> 8) & 0xff;
-                       dev->dev_addr[3] = (lo >> 16) & 0xff;
-                       dev->dev_addr[2] = (lo >> 24) & 0xff;
-                       dev->dev_addr[1] = hi & 0xff;
-                       dev->dev_addr[0] = (hi >> 8) & 0xff;
-               }
+               dev->dev_addr[5] = lo & 0xff;
+               dev->dev_addr[4] = (lo >> 8) & 0xff;
+               dev->dev_addr[3] = (lo >> 16) & 0xff;
+               dev->dev_addr[2] = (lo >> 24) & 0xff;
+               dev->dev_addr[1] = hi & 0xff;
+               dev->dev_addr[0] = (hi >> 8) & 0xff;
        }
 
        if (!is_valid_ether_addr(&dev->dev_addr[0])) {
@@ -11221,6 +10494,7 @@ static void __devinit tg3_init_link_config(struct tg3 *tp)
        tp->link_config.speed = SPEED_INVALID;
        tp->link_config.duplex = DUPLEX_INVALID;
        tp->link_config.autoneg = AUTONEG_ENABLE;
+       netif_carrier_off(tp->dev);
        tp->link_config.active_speed = SPEED_INVALID;
        tp->link_config.active_duplex = DUPLEX_INVALID;
        tp->link_config.phy_is_low_power = 0;
@@ -11279,8 +10553,6 @@ static char * __devinit tg3_phy_string(struct tg3 *tp)
        case PHY_ID_BCM5752:    return "5752";
        case PHY_ID_BCM5714:    return "5714";
        case PHY_ID_BCM5780:    return "5780";
-       case PHY_ID_BCM5755:    return "5755";
-       case PHY_ID_BCM5787:    return "5787";
        case PHY_ID_BCM8002:    return "8002/serdes";
        case 0:                 return "serdes";
        default:                return "unknown";
@@ -11441,6 +10713,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
        SET_MODULE_OWNER(dev);
        SET_NETDEV_DEV(dev, &pdev->dev);
 
+       dev->features |= NETIF_F_LLTX;
 #if TG3_VLAN_TAG_USED
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = tg3_vlan_rx_register;
@@ -11482,6 +10755,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
        tp->grc_mode |= GRC_MODE_BSWAP_NONFRM_DATA;
 #endif
        spin_lock_init(&tp->lock);
+       spin_lock_init(&tp->tx_lock);
        spin_lock_init(&tp->indirect_lock);
        INIT_WORK(&tp->reset_task, tg3_reset_task, tp);
 
@@ -11577,15 +10851,11 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE;
        }
 
-       /* TSO is on by default on chips that support hardware TSO.
-        * Firmware TSO on older chips gives lower performance, so it
-        * is off by default, but can be enabled using ethtool.
-        */
-       if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) {
+       /* TSO is off by default, user can enable using ethtool.  */
+#if 0
+       if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)
                dev->features |= NETIF_F_TSO;
-               if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2)
-                       dev->features |= NETIF_F_TSO6;
-       }
+#endif
 
 #endif
 
@@ -11629,12 +10899,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
         * checksumming.
         */
        if ((tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) == 0) {
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
-                   GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
-                       dev->features |= NETIF_F_HW_CSUM;
-               else
-                       dev->features |= NETIF_F_IP_CSUM;
-               dev->features |= NETIF_F_SG;
+               dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
                tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS;
        } else
                tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS;
@@ -11687,8 +10952,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
               (pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
                (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
 
-       netif_carrier_off(tp->dev);
-
        return 0;
 
 err_out_iounmap:
@@ -11759,8 +11022,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
                tg3_full_lock(tp, 0);
 
                tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
-               if (tg3_restart_hw(tp, 1))
-                       goto out;
+               tg3_init_hw(tp);
 
                tp->timer.expires = jiffies + tp->timer_offset;
                add_timer(&tp->timer);
@@ -11768,7 +11030,6 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
                netif_device_attach(dev);
                tg3_netif_start(tp);
 
-out:
                tg3_full_unlock(tp);
        }
 
@@ -11786,7 +11047,7 @@ static int tg3_resume(struct pci_dev *pdev)
 
        pci_restore_state(tp->pdev);
 
-       err = tg3_set_power_state(tp, PCI_D0);
+       err = tg3_set_power_state(tp, 0);
        if (err)
                return err;
 
@@ -11795,19 +11056,16 @@ static int tg3_resume(struct pci_dev *pdev)
        tg3_full_lock(tp, 0);
 
        tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
-       err = tg3_restart_hw(tp, 1);
-       if (err)
-               goto out;
+       tg3_init_hw(tp);
 
        tp->timer.expires = jiffies + tp->timer_offset;
        add_timer(&tp->timer);
 
        tg3_netif_start(tp);
 
-out:
        tg3_full_unlock(tp);
 
-       return err;
+       return 0;
 }
 
 static struct pci_driver tg3_driver = {