- if (rs.rs_more) {
- /*
- * rs_more indicates chained descriptors which can be
- * used to link buffers together for a sort of
- * scatter-gather operation.
- */
- if (sc->rx.frag) {
- /* too many fragments - cannot handle frame */
- dev_kfree_skb_any(sc->rx.frag);
- dev_kfree_skb_any(skb);
- skb = NULL;
- }
- sc->rx.frag = skb;
- goto requeue;
- }
-
- if (sc->rx.frag) {
- int space = skb->len - skb_tailroom(hdr_skb);
-
- sc->rx.frag = NULL;
-
- if (pskb_expand_head(hdr_skb, 0, space, GFP_ATOMIC) < 0) {
- dev_kfree_skb(skb);
- goto requeue_drop_frag;
- }
-
- skb_copy_from_linear_data(skb, skb_put(hdr_skb, skb->len),
- skb->len);
- dev_kfree_skb_any(skb);
- skb = hdr_skb;
- }
-