amd-xgbe: Separate Tx/Rx ring data fields into new structs
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / amd / xgbe / xgbe-drv.c
index 0544931329d16143f8b14d8620616762504aaad2..46ea423f9a08f673e356822ac02fdda233124b69 100644 (file)
@@ -1747,14 +1747,14 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata,
        u8 *packet;
        unsigned int copy_len;
 
-       skb = netdev_alloc_skb_ip_align(netdev, rdata->rx_hdr.dma_len);
+       skb = netdev_alloc_skb_ip_align(netdev, rdata->rx.hdr.dma_len);
        if (!skb)
                return NULL;
 
-       packet = page_address(rdata->rx_hdr.pa.pages) +
-                rdata->rx_hdr.pa.pages_offset;
-       copy_len = (rdata->hdr_len) ? rdata->hdr_len : *len;
-       copy_len = min(rdata->rx_hdr.dma_len, copy_len);
+       packet = page_address(rdata->rx.hdr.pa.pages) +
+                rdata->rx.hdr.pa.pages_offset;
+       copy_len = (rdata->rx.hdr_len) ? rdata->rx.hdr_len : *len;
+       copy_len = min(rdata->rx.hdr.dma_len, copy_len);
        skb_copy_to_linear_data(skb, packet, copy_len);
        skb_put(skb, copy_len);
 
@@ -1791,6 +1791,10 @@ static int xgbe_tx_poll(struct xgbe_channel *channel)
                if (!hw_if->tx_complete(rdesc))
                        break;
 
+               /* Make sure descriptor fields are read after reading the OWN
+                * bit */
+               rmb();
+
 #ifdef XGMAC_ENABLE_TX_DESC_DUMP
                xgbe_dump_tx_desc(ring, ring->dirty, 1, 0);
 #endif
@@ -1896,13 +1900,13 @@ read_again:
                }
 
                if (!context) {
-                       put_len = rdata->len - len;
+                       put_len = rdata->rx.len - len;
                        len += put_len;
 
                        if (!skb) {
                                dma_sync_single_for_cpu(pdata->dev,
-                                                       rdata->rx_hdr.dma,
-                                                       rdata->rx_hdr.dma_len,
+                                                       rdata->rx.hdr.dma,
+                                                       rdata->rx.hdr.dma_len,
                                                        DMA_FROM_DEVICE);
 
                                skb = xgbe_create_skb(pdata, rdata, &put_len);
@@ -1914,15 +1918,15 @@ read_again:
 
                        if (put_len) {
                                dma_sync_single_for_cpu(pdata->dev,
-                                                       rdata->rx_buf.dma,
-                                                       rdata->rx_buf.dma_len,
+                                                       rdata->rx.buf.dma,
+                                                       rdata->rx.buf.dma_len,
                                                        DMA_FROM_DEVICE);
 
                                skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
-                                               rdata->rx_buf.pa.pages,
-                                               rdata->rx_buf.pa.pages_offset,
-                                               put_len, rdata->rx_buf.dma_len);
-                               rdata->rx_buf.pa.pages = NULL;
+                                               rdata->rx.buf.pa.pages,
+                                               rdata->rx.buf.pa.pages_offset,
+                                               put_len, rdata->rx.buf.dma_len);
+                               rdata->rx.buf.pa.pages = NULL;
                        }
                }