]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/tg3.c
tg3: Don't send APE events for NCSI firmware
[net-next-2.6.git] / drivers / net / tg3.c
index bc3af78a869ff52881077b89cf6e5e544b6e8a91..fc9706c8e3c6eee1745d68089f9a5c6cdf3df2cc 100644 (file)
@@ -4719,7 +4719,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
                      >> RXD_TCPCSUM_SHIFT) == 0xffff))
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                else
-                       skb->ip_summed = CHECKSUM_NONE;
+                       skb_checksum_none_assert(skb);
 
                skb->protocol = eth_type_trans(skb, tp->dev);
 
@@ -6596,6 +6596,10 @@ static void tg3_ape_send_event(struct tg3 *tp, u32 event)
        int i;
        u32 apedata;
 
+       /* NCSI does not support APE events */
+       if (tp->tg3_flags3 & TG3_FLG3_APE_HAS_NCSI)
+               return;
+
        apedata = tg3_ape_read32(tp, TG3_APE_SEG_SIG);
        if (apedata != APE_SEG_SIG_MAGIC)
                return;
@@ -6647,6 +6651,8 @@ static void tg3_ape_driver_state_change(struct tg3 *tp, int kind)
                        APE_HOST_DRIVER_ID_MAGIC(TG3_MAJ_NUM, TG3_MIN_NUM));
                tg3_ape_write32(tp, TG3_APE_HOST_BEHAVIOR,
                                APE_HOST_BEHAV_NO_PHYLOCK);
+               tg3_ape_write32(tp, TG3_APE_HOST_DRVR_STATE,
+                                   TG3_APE_HOST_DRVR_STATE_START);
 
                event = APE_EVENT_STATUS_STATE_START;
                break;
@@ -6658,6 +6664,16 @@ static void tg3_ape_driver_state_change(struct tg3 *tp, int kind)
                 */
                tg3_ape_write32(tp, TG3_APE_HOST_SEG_SIG, 0x0);
 
+               if (device_may_wakeup(&tp->pdev->dev) &&
+                   (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) {
+                       tg3_ape_write32(tp, TG3_APE_HOST_WOL_SPEED,
+                                           TG3_APE_HOST_WOL_SPEED_AUTO);
+                       apedata = TG3_APE_HOST_DRVR_STATE_WOL;
+               } else
+                       apedata = TG3_APE_HOST_DRVR_STATE_UNLOAD;
+
+               tg3_ape_write32(tp, TG3_APE_HOST_DRVR_STATE, apedata);
+
                event = APE_EVENT_STATUS_STATE_UNLOAD;
                break;
        case RESET_KIND_SUSPEND:
@@ -8015,6 +8031,16 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
            GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780)
                rdmac_mode |= RDMAC_MODE_IPV6_LSO_EN;
 
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5761 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785 ||
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 ||
+           (tp->tg3_flags3 & TG3_FLG3_5717_PLUS)) {
+               val = tr32(TG3_RDMA_RSRVCTRL_REG);
+               tw32(TG3_RDMA_RSRVCTRL_REG,
+                    val | TG3_RDMA_RSRVCTRL_FIFO_OFLW_FIX);
+       }
+
        /* Receive/send statistics. */
        if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) {
                val = tr32(RCVLPC_STATS_ENABLE);
@@ -8817,16 +8843,9 @@ static bool tg3_enable_msix(struct tg3 *tp)
                tp->napi[i].irq_vec = msix_ent[i].vector;
 
        tp->dev->real_num_tx_queues = 1;
-       if (tp->irq_cnt > 1) {
+       if (tp->irq_cnt > 1)
                tp->tg3_flags3 |= TG3_FLG3_ENABLE_RSS;
 
-               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 ||
-                   GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719) {
-                       tp->tg3_flags3 |= TG3_FLG3_ENABLE_TSS;
-                       tp->dev->real_num_tx_queues = tp->irq_cnt - 1;
-               }
-       }
-
        return true;
 }
 
@@ -12736,10 +12755,12 @@ static void __devinit tg3_read_dash_ver(struct tg3 *tp)
 
        apedata = tg3_ape_read32(tp, TG3_APE_FW_VERSION);
 
-       if (tg3_ape_read32(tp, TG3_APE_FW_FEATURES) & TG3_APE_FW_FEATURE_NCSI)
+       if (tg3_ape_read32(tp, TG3_APE_FW_FEATURES) & TG3_APE_FW_FEATURE_NCSI) {
+               tp->tg3_flags3 |= TG3_FLG3_APE_HAS_NCSI;
                fwtype = "NCSI";
-       else
+       } else {
                fwtype = "DASH";
+       }
 
        vlen = strlen(tp->fw_ver);