struct ftgmac100_descs *descs;
        dma_addr_t descs_dma_addr;
 
+       struct page *rx_pages[RX_QUEUE_ENTRIES];
+
        unsigned int rx_pointer;
        unsigned int tx_clean_pointer;
        unsigned int tx_pointer;
        return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_IP_CHKSUM_ERR);
 }
 
+static inline struct page **ftgmac100_rxdes_page_slot(struct ftgmac100 *priv,
+                                                     struct ftgmac100_rxdes *rxdes)
+{
+       return &priv->rx_pages[rxdes - priv->descs->rxdes];
+}
+
 /*
  * rxdes2 is not used by hardware. We use it to keep track of page.
  * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
  */
-static void ftgmac100_rxdes_set_page(struct ftgmac100_rxdes *rxdes, struct page *page)
+static void ftgmac100_rxdes_set_page(struct ftgmac100 *priv,
+                                    struct ftgmac100_rxdes *rxdes,
+                                    struct page *page)
 {
-       rxdes->rxdes2 = (unsigned int)page;
+       *ftgmac100_rxdes_page_slot(priv, rxdes) = page;
 }
 
-static struct page *ftgmac100_rxdes_get_page(struct ftgmac100_rxdes *rxdes)
+static struct page *ftgmac100_rxdes_get_page(struct ftgmac100 *priv,
+                                            struct ftgmac100_rxdes *rxdes)
 {
-       return (struct page *)rxdes->rxdes2;
+       return *ftgmac100_rxdes_page_slot(priv, rxdes);
 }
 
 /******************************************************************************
 
        do {
                dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
-               struct page *page = ftgmac100_rxdes_get_page(rxdes);
+               struct page *page = ftgmac100_rxdes_get_page(priv, rxdes);
                unsigned int size;
 
                dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
                return -ENOMEM;
        }
 
-       ftgmac100_rxdes_set_page(rxdes, page);
+       ftgmac100_rxdes_set_page(priv, rxdes, page);
        ftgmac100_rxdes_set_dma_addr(rxdes, map);
        ftgmac100_rxdes_set_dma_own(rxdes);
        return 0;
 
        for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
                struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
-               struct page *page = ftgmac100_rxdes_get_page(rxdes);
+               struct page *page = ftgmac100_rxdes_get_page(priv, rxdes);
                dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
 
                if (!page)