u8 *frame;
        u16 len, pad = 0;
        u32 swheader;
-       struct sk_buff *new;
        int i;
 
        brcmf_dbg(TRACE, "Enter\n");
                        brcmf_dbg(INFO, "insufficient headroom %d for %d pad\n",
                                  skb_headroom(pkt), pad);
                        bus->sdiodev->bus_if->tx_realloc++;
-                       new = brcmu_pkt_buf_get_skb(pkt->len + BRCMF_SDALIGN);
-                       if (!new) {
-                               brcmf_err("couldn't allocate new %d-byte packet\n",
-                                         pkt->len + BRCMF_SDALIGN);
-                               ret = -ENOMEM;
+                       ret = skb_cow(pkt, BRCMF_SDALIGN);
+                       if (ret)
                                goto done;
-                       }
-
-                       pkt_align(new, pkt->len, BRCMF_SDALIGN);
-                       memcpy(new->data, pkt->data, pkt->len);
-                       brcmu_pkt_buf_free_skb(pkt);
-                       pkt = new;
-                       frame = (u8 *) (pkt->data);
-                       /* precondition: (frame % BRCMF_SDALIGN) == 0) */
-                       pad = 0;
-               } else {
-                       skb_push(pkt, pad);
-                       frame = (u8 *) (pkt->data);
-                       memset(frame + SDPCM_HDRLEN, 0, pad);
+                       pad = ((unsigned long)frame % BRCMF_SDALIGN);
                }
+               skb_push(pkt, pad);
+               frame = (u8 *) (pkt->data);
+               memset(frame, 0, pad + SDPCM_HDRLEN);
        }
        /* precondition: pad < BRCMF_SDALIGN */