}
 
 
-static int fr_hard_header(struct sk_buff **skb_p, u16 dlci)
+static int fr_hard_header(struct sk_buff *skb, u16 dlci)
 {
-       struct sk_buff *skb = *skb_p;
-
        if (!skb->dev) { /* Control packets */
                switch (dlci) {
                case LMI_CCITT_ANSI_DLCI:
                }
 
        } else if (skb->dev->type == ARPHRD_ETHER) {
-               if (skb_headroom(skb) < 10) {
-                       struct sk_buff *skb2 = skb_realloc_headroom(skb, 10);
-                       if (!skb2)
-                               return -ENOBUFS;
-                       dev_kfree_skb(skb);
-                       skb = *skb_p = skb2;
-               }
                skb_push(skb, 10);
                skb->data[3] = FR_PAD;
                skb->data[4] = NLPID_SNAP;
                }
        }
 
+       /* We already requested the header space with dev->needed_headroom.
+        * So this is just a protection in case the upper layer didn't take
+        * dev->needed_headroom into consideration.
+        */
+       if (skb_headroom(skb) < 10) {
+               struct sk_buff *skb2 = skb_realloc_headroom(skb, 10);
+
+               if (!skb2)
+                       goto drop;
+               dev_kfree_skb(skb);
+               skb = skb2;
+       }
+
        skb->dev = dev;
-       if (fr_hard_header(&skb, pvc->dlci))
+       if (fr_hard_header(skb, pvc->dlci))
                goto drop;
 
        dev->stats.tx_bytes += skb->len;
        memset(skb->data, 0, len);
        skb_reserve(skb, 4);
        if (lmi == LMI_CISCO) {
-               fr_hard_header(&skb, LMI_CISCO_DLCI);
+               fr_hard_header(skb, LMI_CISCO_DLCI);
        } else {
-               fr_hard_header(&skb, LMI_CCITT_ANSI_DLCI);
+               fr_hard_header(skb, LMI_CCITT_ANSI_DLCI);
        }
        data = skb_tail_pointer(skb);
        data[i++] = LMI_CALLREF;