ixgbe: remove some redundant code in setting FCoE FIP filter
[deliverable/linux.git] / drivers / net / ixgbe / ixgbe_main.c
index d1a1868df817950855cd9f72e959c8cf209d6250..a9e091cb54991b95c43c2632d527b763869540ff 100644 (file)
@@ -1160,6 +1160,7 @@ static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb,
 
 struct ixgbe_rsc_cb {
        dma_addr_t dma;
+       bool delay_unmap;
 };
 
 #define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb)
@@ -1200,9 +1201,10 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                        hdr_info = le16_to_cpu(ixgbe_get_hdr_info(rx_desc));
                        len = (hdr_info & IXGBE_RXDADV_HDRBUFLEN_MASK) >>
                               IXGBE_RXDADV_HDRBUFLEN_SHIFT;
-                       if (len > IXGBE_RX_HDR_SIZE)
-                               len = IXGBE_RX_HDR_SIZE;
                        upper_len = le16_to_cpu(rx_desc->wb.upper.length);
+                       if ((len > IXGBE_RX_HDR_SIZE) ||
+                           (upper_len && !(hdr_info & IXGBE_RXDADV_SPH)))
+                               len = IXGBE_RX_HDR_SIZE;
                } else {
                        len = le16_to_cpu(rx_desc->wb.upper.length);
                }
@@ -1215,7 +1217,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                if (rx_buffer_info->dma) {
                        if ((adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) &&
                            (!(staterr & IXGBE_RXD_STAT_EOP)) &&
-                                (!(skb->prev)))
+                                (!(skb->prev))) {
                                /*
                                 * When HWRSC is enabled, delay unmapping
                                 * of the first packet. It carries the
@@ -1223,12 +1225,14 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                                 * access the header after the writeback.
                                 * Only unmap it when EOP is reached
                                 */
+                               IXGBE_RSC_CB(skb)->delay_unmap = true;
                                IXGBE_RSC_CB(skb)->dma = rx_buffer_info->dma;
-                       else
+                       } else {
                                dma_unmap_single(&pdev->dev,
-                                                rx_buffer_info->dma,
+                                                rx_buffer_info->dma,
                                                 rx_ring->rx_buf_len,
-                                                DMA_FROM_DEVICE);
+                                                DMA_FROM_DEVICE);
+                       }
                        rx_buffer_info->dma = 0;
                        skb_put(skb, len);
                }
@@ -1276,12 +1280,13 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                        if (skb->prev)
                                skb = ixgbe_transform_rsc_queue(skb, &(rx_ring->rsc_count));
                        if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) {
-                               if (IXGBE_RSC_CB(skb)->dma) {
+                               if (IXGBE_RSC_CB(skb)->delay_unmap) {
                                        dma_unmap_single(&pdev->dev,
                                                         IXGBE_RSC_CB(skb)->dma,
                                                         rx_ring->rx_buf_len,
                                                         DMA_FROM_DEVICE);
                                        IXGBE_RSC_CB(skb)->dma = 0;
+                                       IXGBE_RSC_CB(skb)->delay_unmap = false;
                                }
                                if (rx_ring->flags & IXGBE_RING_RX_PS_ENABLED)
                                        rx_ring->rsc_count += skb_shinfo(skb)->nr_frags;
@@ -1611,8 +1616,6 @@ static void ixgbe_set_itr_msix(struct ixgbe_q_vector *q_vector)
 
                ixgbe_write_eitr(q_vector);
        }
-
-       return;
 }
 
 static void ixgbe_check_fan_failure(struct ixgbe_adapter *adapter, u32 eicr)
@@ -2176,8 +2179,6 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter)
 
                ixgbe_write_eitr(q_vector);
        }
-
-       return;
 }
 
 /**
@@ -2952,7 +2953,7 @@ void ixgbe_set_rx_mode(struct net_device *netdev)
        fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
 
        if (netdev->flags & IFF_PROMISC) {
-               hw->addr_ctrl.user_set_promisc = 1;
+               hw->addr_ctrl.user_set_promisc = true;
                fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
                /* don't hardware filter vlans in promisc mode */
                ixgbe_vlan_filter_disable(adapter);
@@ -2960,11 +2961,11 @@ void ixgbe_set_rx_mode(struct net_device *netdev)
                if (netdev->flags & IFF_ALLMULTI) {
                        fctrl |= IXGBE_FCTRL_MPE;
                        fctrl &= ~IXGBE_FCTRL_UPE;
-               } else {
+               } else if (!hw->addr_ctrl.uc_set_promisc) {
                        fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
                }
                ixgbe_vlan_filter_enable(adapter);
-               hw->addr_ctrl.user_set_promisc = 0;
+               hw->addr_ctrl.user_set_promisc = false;
        }
 
        IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
@@ -3505,12 +3506,13 @@ static void ixgbe_clean_rx_ring(struct ixgbe_adapter *adapter,
                        rx_buffer_info->skb = NULL;
                        do {
                                struct sk_buff *this = skb;
-                               if (IXGBE_RSC_CB(this)->dma) {
+                               if (IXGBE_RSC_CB(this)->delay_unmap) {
                                        dma_unmap_single(&pdev->dev,
                                                         IXGBE_RSC_CB(this)->dma,
                                                         rx_ring->rx_buf_len,
                                                         DMA_FROM_DEVICE);
                                        IXGBE_RSC_CB(this)->dma = 0;
+                                       IXGBE_RSC_CB(skb)->delay_unmap = false;
                                }
                                skb = skb->prev;
                                dev_kfree_skb(this);
@@ -4461,7 +4463,6 @@ static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter)
                adapter->flags &= ~IXGBE_FLAG_MSI_ENABLED;
                pci_disable_msi(adapter->pdev);
        }
-       return;
 }
 
 /**
This page took 0.028478 seconds and 5 git commands to generate.