]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ixgbe: Simplify logic for ethtool loopback frame creation and testing
authorAlexander Duyck <alexander.h.duyck@intel.com>
Wed, 8 Feb 2012 07:50:09 +0000 (07:50 +0000)
committerJoe Jin <joe.jin@oracle.com>
Thu, 17 May 2012 15:05:00 +0000 (23:05 +0800)
This change makes it a bit easier to do the loopback frame creating and
testing.  Previously we were doing an and to drop the last bit, and then
dividing the frame_size by 2 in order to get locations for frame bytes and
testing.  Instead we can simplify it by just shifting the register one bit
to the right and using that for the frame offsets.

This change also replaces all instances of rx_buffer_info with just
rx_buffer since that is closer to the name of the actual structure being
used and can save a few extra characters.

In addition I have updated the logic for cleaning up a test frame so that
we pass an rx_buffer instead of the sk_buff.  The main motivation behind
this is changes that will replace the sk_buff with just a page in the
future.

(cherry picked from commit 3832b26e49ad9e585239b32f763c31679f9e41fe)
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Stephen Ko <stephen.s.ko@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/net/ixgbe/ixgbe_ethtool.c

index b9273cee855a9b2dbbc9c70d2af8fc32ffc3c489..26ef860336fba2850e74dee0b514618879edd476 100644 (file)
@@ -1704,63 +1704,65 @@ static void ixgbe_loopback_cleanup(struct ixgbe_adapter *adapter)
 }
 
 static void ixgbe_create_lbtest_frame(struct sk_buff *skb,
-                                      unsigned int frame_size)
+                                     unsigned int frame_size)
 {
        memset(skb->data, 0xFF, frame_size);
-       frame_size &= ~1;
-       memset(&skb->data[frame_size / 2], 0xAA, frame_size / 2 - 1);
-       memset(&skb->data[frame_size / 2 + 10], 0xBE, 1);
-       memset(&skb->data[frame_size / 2 + 12], 0xAF, 1);
+       frame_size >>= 1;
+       memset(&skb->data[frame_size], 0xAA, frame_size / 2 - 1);
+       memset(&skb->data[frame_size + 10], 0xBE, 1);
+       memset(&skb->data[frame_size + 12], 0xAF, 1);
 }
 
-static int ixgbe_check_lbtest_frame(struct sk_buff *skb,
-                                    unsigned int frame_size)
+static bool ixgbe_check_lbtest_frame(struct ixgbe_rx_buffer *rx_buffer,
+                                    unsigned int frame_size)
 {
-       frame_size &= ~1;
-       if (*(skb->data + 3) == 0xFF) {
-               if ((*(skb->data + frame_size / 2 + 10) == 0xBE) &&
-                   (*(skb->data + frame_size / 2 + 12) == 0xAF)) {
-                       return 0;
-               }
-       }
-       return 13;
+       unsigned char *data;
+       bool match = true;
+
+       frame_size >>= 1;
+
+       data = rx_buffer->skb->data;
+
+       if (data[3] != 0xFF ||
+           data[frame_size + 10] != 0xBE ||
+           data[frame_size + 12] != 0xAF)
+               match = false;
+
+       return match;
 }
 
 static u16 ixgbe_clean_test_rings(struct ixgbe_ring *rx_ring,
-                                  struct ixgbe_ring *tx_ring,
-                                  unsigned int size)
+                                 struct ixgbe_ring *tx_ring,
+                                 unsigned int size)
 {
        union ixgbe_adv_rx_desc *rx_desc;
-       struct ixgbe_rx_buffer *rx_buffer_info;
-       struct ixgbe_tx_buffer *tx_buffer_info;
-       const int bufsz = rx_ring->rx_buf_len;
-       u32 staterr;
+       struct ixgbe_rx_buffer *rx_buffer;
+       struct ixgbe_tx_buffer *tx_buffer;
        u16 rx_ntc, tx_ntc, count = 0;
 
        /* initialize next to clean and descriptor values */
        rx_ntc = rx_ring->next_to_clean;
        tx_ntc = tx_ring->next_to_clean;
        rx_desc = IXGBE_RX_DESC(rx_ring, rx_ntc);
-       staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
 
-       while (staterr & IXGBE_RXD_STAT_DD) {
+       while (ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_DD)) {
                /* check Rx buffer */
-               rx_buffer_info = &rx_ring->rx_buffer_info[rx_ntc];
+               rx_buffer = &rx_ring->rx_buffer_info[rx_ntc];
 
                /* unmap Rx buffer, will be remapped by alloc_rx_buffers */
                dma_unmap_single(rx_ring->dev,
-                                rx_buffer_info->dma,
-                                bufsz,
+                                rx_buffer->dma,
+                                rx_ring->rx_buf_len,
                                 DMA_FROM_DEVICE);
-               rx_buffer_info->dma = 0;
+               rx_buffer->dma = 0;
 
                /* verify contents of skb */
-               if (!ixgbe_check_lbtest_frame(rx_buffer_info->skb, size))
+               if (ixgbe_check_lbtest_frame(rx_buffer, size))
                        count++;
 
                /* unmap buffer on Tx side */
-               tx_buffer_info = &tx_ring->tx_buffer_info[tx_ntc];
-               ixgbe_unmap_and_free_tx_resource(tx_ring, tx_buffer_info);
+               tx_buffer = &tx_ring->tx_buffer_info[tx_ntc];
+               ixgbe_unmap_and_free_tx_resource(tx_ring, tx_buffer);
 
                /* increment Rx/Tx next to clean counters */
                rx_ntc++;
@@ -1772,7 +1774,6 @@ static u16 ixgbe_clean_test_rings(struct ixgbe_ring *rx_ring,
 
                /* fetch next descriptor */
                rx_desc = IXGBE_RX_DESC(rx_ring, rx_ntc);
-               staterr = le32_to_cpu(rx_desc->wb.upper.status_error);
        }
 
        /* re-map buffers to ring, store next to clean values */