}
     // cast needed as there is no %? for pointer differences
     PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li",
-           skb, skb->head, (long) (skb_end_pointer(skb) - skb->head));
+           skb, skb->head, (long) skb_end_offset(skb));
     rx.handle = virt_to_bus (skb);
     rx.host_address = cpu_to_be32 (virt_to_bus (skb->data));
     if (rx_give (dev, &rx, pool))
 
        tail = readl(SAR_REG_RAWCT);
 
        pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue),
-                                   skb_end_pointer(queue) - queue->head - 16,
+                                   skb_end_offset(queue) - 16,
                                    PCI_DMA_FROMDEVICE);
 
        while (head != tail) {
 
                d_printf(1, dev, "RX: size changed to %d, received %d, "
                         "copied %d, capacity %ld\n",
                         rx_size, read_size, rx_skb->len,
-                        (long) (skb_end_pointer(new_skb) - new_skb->head));
+                        (long) skb_end_offset(new_skb));
                goto retry;
        }
                /* In most cases, it happens due to the hardware scheduling a
 
        }
        if (unlikely
            (skb->truesize !=
-            sizeof(*skb) + skb_end_pointer(skb) - skb->head)) {
+            sizeof(*skb) + skb_end_offset(skb))) {
                /*
                   printk("TX buffer truesize has been changed\n");
                 */
 
 {
        return skb->head + skb->end;
 }
+
+static inline unsigned int skb_end_offset(const struct sk_buff *skb)
+{
+       return skb->end;
+}
 #else
 static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
 {
        return skb->end;
 }
+
+static inline unsigned int skb_end_offset(const struct sk_buff *skb)
+{
+       return skb->end - skb->head;
+}
 #endif
 
 /* Internal */
                return false;
 
        skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
-       if (skb_end_pointer(skb) - skb->head < skb_size)
+       if (skb_end_offset(skb) < skb_size)
                return false;
 
        if (skb_shared(skb) || skb_cloned(skb))
 
 struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
 {
        int headerlen = skb_headroom(skb);
-       unsigned int size = (skb_end_pointer(skb) - skb->head) + skb->data_len;
+       unsigned int size = skb_end_offset(skb) + skb->data_len;
        struct sk_buff *n = alloc_skb(size, gfp_mask);
 
        if (!n)
 {
        int i;
        u8 *data;
-       int size = nhead + (skb_end_pointer(skb) - skb->head) + ntail;
+       int size = nhead + skb_end_offset(skb) + ntail;
        long off;
 
        BUG_ON(nhead < 0);
                        if (unlikely(!nskb))
                                goto err;
 
-                       hsize = skb_end_pointer(nskb) - nskb->head;
+                       hsize = skb_end_offset(nskb);
                        if (skb_cow_head(nskb, doffset + headroom)) {
                                kfree_skb(nskb);
                                goto err;
                        }
 
-                       nskb->truesize += skb_end_pointer(nskb) - nskb->head -
-                                         hsize;
+                       nskb->truesize += skb_end_offset(nskb) - hsize;
                        skb_release_head_state(nskb);
                        __skb_push(nskb, doffset);
                } else {
                skb_frag_size_sub(frag, offset);
 
                /* all fragments truesize : remove (head size + sk_buff) */
-               delta_truesize = skb->truesize - SKB_TRUESIZE(skb_end_pointer(skb) - skb->head);
+               delta_truesize = skb->truesize -
+                                SKB_TRUESIZE(skb_end_offset(skb));
 
                skb->truesize -= skb->data_len;
                skb->len -= skb->data_len;