Skip to content

Commit

Permalink
net: use skb_for_each_frag() helper where possible
Browse files Browse the repository at this point in the history
use the new helper macro skb_for_each_frag() which allows to iterate
through all the SKB fragments.

The patch was created with Coccinelle, this was the semantic patch:

@@
struct sk_buff *skb;
identifier i;
statement S;
iterator name skb_for_each_frag;
@@
-for (i = 0; i < skb_shinfo(skb)->nr_frags; \(++i\|i++\))
+skb_for_each_frag(skb, i)
 S
@@
struct skb_shared_info *sinfo;
struct sk_buff *skb;
identifier i;
statement S;
iterator name skb_for_each_frag;
@@
 sinfo = skb_shinfo(skb);
 ...
-for (i = 0; i < sinfo->nr_frags; \(++i\|i++\))
+skb_for_each_frag(skb, i)
 S
@@
struct sk_buff *skb;
identifier i, num_frags;
statement S;
iterator name skb_for_each_frag;
@@
 num_frags = skb_shinfo(skb)->nr_frags;
 ...
-for (i = 0; i < num_frags; \(++i\|i++\))
+skb_for_each_frag(skb, i)
 S

Tested with an allmodconfig build.

Signed-off-by: Matteo Croce <mcroce@microsoft.com>
  • Loading branch information
teknoraver authored and intel-lab-lkp committed Apr 9, 2021
1 parent 2548ba6 commit 9a46b32
Show file tree
Hide file tree
Showing 94 changed files with 135 additions and 137 deletions.
4 changes: 2 additions & 2 deletions arch/um/drivers/vector_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ static int prep_msg(struct vector_private *vp,
} else
iov[iov_index].iov_len = skb->len;
iov_index++;
for (frag = 0; frag < nr_frags; frag++) {
skb_for_each_frag(skb, frag) {
skb_frag = &skb_shinfo(skb)->frags[frag];
iov[iov_index].iov_base = skb_frag_address_safe(skb_frag);
iov[iov_index].iov_len = skb_frag_size(skb_frag);
Expand Down Expand Up @@ -657,7 +657,7 @@ static struct sk_buff *prep_skb(
iov_index++;

nr_frags = skb_shinfo(result)->nr_frags;
for (frag = 0; frag < nr_frags; frag++) {
skb_for_each_frag(result, frag) {
skb_frag = &skb_shinfo(result)->frags[frag];
iov[iov_index].iov_base = skb_frag_address_safe(skb_frag);
if (iov[iov_index].iov_base != NULL)
Expand Down
2 changes: 1 addition & 1 deletion drivers/atm/he.c
Original file line number Diff line number Diff line change
Expand Up @@ -2556,7 +2556,7 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb)
tpd->iovec[slot].len = skb_headlen(skb);
++slot;

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

if (slot == TPD_MAXIOV) { /* queue tpd; start new tpd */
Expand Down
2 changes: 1 addition & 1 deletion drivers/hsi/clients/ssi_protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ static void ssip_skb_to_msg(struct sk_buff *skb, struct hsi_msg *msg)

sg = msg->sgt.sgl;
sg_set_buf(sg, skb->data, skb_headlen(skb));
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
sg = sg_next(sg);
BUG_ON(!sg);
frag = &skb_shinfo(skb)->frags[i];
Expand Down
2 changes: 1 addition & 1 deletion drivers/infiniband/hw/hfi1/ipoib_tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ static int hfi1_ipoib_build_ulp_payload(struct ipoib_txreq *tx,
return ret;
}

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

ret = sdma_txadd_page(dd,
Expand Down
2 changes: 1 addition & 1 deletion drivers/infiniband/hw/hfi1/vnic_sdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ static noinline int build_vnic_ulp_payload(struct sdma_engine *sde,
if (unlikely(ret))
goto bail_txadd;

for (i = 0; i < skb_shinfo(tx->skb)->nr_frags; i++) {
skb_for_each_frag(tx->skb, i) {
skb_frag_t *frag = &skb_shinfo(tx->skb)->frags[i];

/* combine physically continuous fragments later? */
Expand Down
2 changes: 1 addition & 1 deletion drivers/infiniband/ulp/ipoib/ipoib_cm.c
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,7 @@ static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
length -= size;

num_frags = skb_shinfo(skb)->nr_frags;
for (i = 0; i < num_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

if (length == 0) {
Expand Down
4 changes: 2 additions & 2 deletions drivers/infiniband/ulp/ipoib/ipoib_ib.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ int ipoib_dma_map_tx(struct ib_device *ca, struct ipoib_tx_buf *tx_req)
} else
off = 0;

for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
mapping[i + off] = ib_dma_map_page(ca,
skb_frag_page(frag),
Expand Down Expand Up @@ -329,7 +329,7 @@ void ipoib_dma_unmap_tx(struct ipoib_dev_priv *priv,
} else
off = 0;

for (i = 0; i < skb_shinfo(skb)->nr_frags; ++i) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

ib_dma_unmap_page(priv->ca, mapping[i + off],
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/3com/3c59x.c
Original file line number Diff line number Diff line change
Expand Up @@ -2168,7 +2168,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
vp->tx_ring[entry].frag[0].addr = cpu_to_le32(dma_addr);
vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb_headlen(skb));

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

dma_addr = skb_frag_dma_map(vp->gendev, frag,
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/3com/typhoon.c
Original file line number Diff line number Diff line change
Expand Up @@ -808,7 +808,7 @@ typhoon_start_tx(struct sk_buff *skb, struct net_device *dev)
txd->frag.addrHi = 0;
first_txd->numDesc++;

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
void *frag_addr;

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/adaptec/starfire.c
Original file line number Diff line number Diff line change
Expand Up @@ -1368,7 +1368,7 @@ static irqreturn_t intr_handler(int irq, void *dev_instance)
entry = (entry + np->tx_info[entry].used_slots) % TX_RING_SIZE;
{
int i;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
dma_unmap_single(&np->pci_dev->dev,
np->tx_info[entry].mapping,
skb_frag_size(&skb_shinfo(skb)->frags[i]),
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/ethernet/aeroflex/greth.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ static void greth_print_tx_packet(struct sk_buff *skb)
print_hex_dump(KERN_DEBUG, "TX: ", DUMP_PREFIX_OFFSET, 16, 1,
skb->data, length, true);

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {

print_hex_dump(KERN_DEBUG, "TX: ", DUMP_PREFIX_OFFSET, 16, 1,
skb_frag_address(&skb_shinfo(skb)->frags[i]),
Expand Down Expand Up @@ -514,7 +514,7 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)
curr_tx = NEXT_TX(greth->tx_next);

/* Frags */
for (i = 0; i < nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
greth->tx_skbuff[curr_tx] = NULL;
bdp = greth->tx_bd_base + curr_tx;
Expand Down Expand Up @@ -710,7 +710,7 @@ static void greth_clean_tx_gbit(struct net_device *dev)
skb_headlen(skb),
DMA_TO_DEVICE);

for (i = 0; i < nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
bdp = greth->tx_bd_base + tx_last;

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/alteon/acenic.c
Original file line number Diff line number Diff line change
Expand Up @@ -2453,7 +2453,7 @@ static netdev_tx_t ace_start_xmit(struct sk_buff *skb,

idx = (idx + 1) % ACE_TX_RING_ENTRIES(ap);

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
struct tx_ring_info *info;

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/amazon/ena/ena_netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2965,7 +2965,7 @@ static int ena_tx_map_skb(struct ena_ring *tx_ring,

last_frag = skb_shinfo(skb)->nr_frags;

for (i = 0; i < last_frag; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

frag_len = skb_frag_size(frag);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/amd/xgbe/xgbe-desc.c
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@ static int xgbe_map_tx_skb(struct xgbe_channel *channel, struct sk_buff *skb)
rdata = XGBE_GET_DESC_DATA(ring, cur_index);
}

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
netif_dbg(pdata, tx_queued, pdata->netdev,
"mapping frag %u\n", i);

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/amd/xgbe/xgbe-drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1806,7 +1806,7 @@ static void xgbe_packet_info(struct xgbe_prv_data *pdata,
len -= min_t(unsigned int, len, XGBE_TX_MAX_BUF_SIZE);
}

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
frag = &skb_shinfo(skb)->frags[i];
for (len = skb_frag_size(frag); len; ) {
packet->rdesc_count++;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/apm/xgene/xgene_enet_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ static int xgene_enet_tx_completion(struct xgene_enet_desc_ring *cp_ring,
skb_headlen(skb),
DMA_TO_DEVICE);

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
frag = &skb_shinfo(skb)->frags[i];
dma_unmap_page(dev, frag_dma_addr[i], skb_frag_size(frag),
DMA_TO_DEVICE);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/atheros/alx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1465,7 +1465,7 @@ static int alx_map_tx_skb(struct alx_tx_queue *txq, struct sk_buff *skb)
tpd->adrl.addr = cpu_to_le64(dma);
tpd->len = cpu_to_le16(maplen);

for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) {
skb_for_each_frag(skb, f) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[f];

if (++txq->write_idx == txq->count)
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/atheros/atl1c/atl1c_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2151,7 +2151,7 @@ static int atl1c_tx_map(struct atl1c_adapter *adapter,
use_tpd->buffer_len = cpu_to_le16(buffer_info->length);
}

for (f = 0; f < nr_frags; f++) {
skb_for_each_frag(skb, f) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[f];

use_tpd = atl1c_get_tpd(adapter, type);
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/atheros/atl1e/atl1e_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1601,7 +1601,7 @@ static u16 atl1e_cal_tdp_req(const struct sk_buff *skb)
u16 fg_size = 0;
u16 proto_hdr_len = 0;

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
fg_size = skb_frag_size(&skb_shinfo(skb)->frags[i]);
tpd_req += ((fg_size + MAX_TX_BUF_LEN - 1) >> MAX_TX_BUF_SHIFT);
}
Expand Down Expand Up @@ -1777,7 +1777,7 @@ static int atl1e_tx_map(struct atl1e_adapter *adapter,
TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT);
}

for (f = 0; f < nr_frags; f++) {
skb_for_each_frag(skb, f) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[f];
u16 i;
u16 seg_num;
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/atheros/atlx/atl1.c
Original file line number Diff line number Diff line change
Expand Up @@ -2255,7 +2255,7 @@ static void atl1_tx_map(struct atl1_adapter *adapter, struct sk_buff *skb,
next_to_use = 0;
}

for (f = 0; f < nr_frags; f++) {
skb_for_each_frag(skb, f) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[f];
u16 i, nseg;

Expand Down Expand Up @@ -2358,7 +2358,7 @@ static netdev_tx_t atl1_xmit_frame(struct sk_buff *skb,
}

nr_frags = skb_shinfo(skb)->nr_frags;
for (f = 0; f < nr_frags; f++) {
skb_for_each_frag(skb, f) {
unsigned int f_size = skb_frag_size(&skb_shinfo(skb)->frags[f]);
count += (f_size + ATL1_MAX_TX_BUF_LEN - 1) /
ATL1_MAX_TX_BUF_LEN;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bgmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac,
bgmac_dma_tx_add_buf(bgmac, ring, index, skb_headlen(skb), flags);
flags = 0;

for (i = 0; i < nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
int len = skb_frag_size(frag);

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -6681,7 +6681,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
tx_buf->nr_frags = last_frag;
tx_buf->is_gso = skb_is_gso(skb);

for (i = 0; i < last_frag; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

prod = BNX2_NEXT_TX_BD(prod);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
Original file line number Diff line number Diff line change
Expand Up @@ -4071,7 +4071,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
tx_data_bd = (struct eth_tx_bd *)tx_start_bd;

/* Handle fragmented skb */
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

mapping = skb_frag_dma_map(&bp->pdev->dev, frag, 0,
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/ethernet/broadcom/bnxt/bnxt.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)

skb_copy_from_linear_data(skb, pdata, len);
pdata += len;
for (j = 0; j < last_frag; j++) {
skb_for_each_frag(skb, j) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[j];
void *fptr;

Expand Down Expand Up @@ -537,7 +537,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
txbd1->tx_bd_cfa_meta = cpu_to_le32(vlan_tag_flags);
txbd1->tx_bd_cfa_action =
cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT);
for (i = 0; i < last_frag; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

prod = NEXT_TX(prod);
Expand Down Expand Up @@ -606,7 +606,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
prod = NEXT_TX(prod);

/* unmap remaining mapped pages */
for (i = 0; i < last_frag; i++) {
skb_for_each_frag(skb, i) {
prod = NEXT_TX(prod);
tx_buf = &txr->tx_buf_ring[prod];
dma_unmap_page(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/tg3.c
Original file line number Diff line number Diff line change
Expand Up @@ -6579,7 +6579,7 @@ static void tg3_tx(struct tg3_napi *tnapi)

sw_idx = NEXT_TX(sw_idx);

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
ri = &tnapi->tx_buffers[sw_idx];
if (unlikely(ri->skb != NULL || sw_idx == hw_idx))
tx_bug = 1;
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/cadence/macb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2058,7 +2058,7 @@ static netdev_features_t macb_features_check(struct sk_buff *skb,
nr_frags = skb_shinfo(skb)->nr_frags;
/* No need to check last fragment */
nr_frags--;
for (f = 0; f < nr_frags; f++) {
skb_for_each_frag(skb, f) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[f];

if (!IS_ALIGNED(skb_frag_size(frag), MACB_TX_LEN_ALIGN))
Expand Down Expand Up @@ -2200,7 +2200,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
else
desc_cnt = DIV_ROUND_UP(skb_headlen(skb), bp->max_tx_length);
nr_frags = skb_shinfo(skb)->nr_frags;
for (f = 0; f < nr_frags; f++) {
skb_for_each_frag(skb, f) {
frag_size = skb_frag_size(&skb_shinfo(skb)->frags[f]);
desc_cnt += DIV_ROUND_UP(frag_size, bp->max_tx_length);
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/cavium/thunder/nicvf_queues.c
Original file line number Diff line number Diff line change
Expand Up @@ -1587,7 +1587,7 @@ int nicvf_sq_append_skb(struct nicvf *nic, struct snd_queue *sq,
if (!skb_is_nonlinear(skb))
goto doorbell;

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

qentry = nicvf_get_nxt_sqentry(sq, qentry);
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/chelsio/cxgb3/sge.c
Original file line number Diff line number Diff line change
Expand Up @@ -1021,7 +1021,7 @@ static inline unsigned int write_sgl(const struct sk_buff *skb,
}

nfrags = skb_shinfo(skb)->nr_frags;
for (i = 0; i < nfrags; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

sgp->len[j] = cpu_to_be32(skb_frag_size(frag));
Expand Down Expand Up @@ -1595,7 +1595,7 @@ static void deferred_unmap_destructor(struct sk_buff *skb)
skb_transport_header(skb), PCI_DMA_TODEVICE);

si = skb_shinfo(skb);
for (i = 0; i < si->nr_frags; i++)
skb_for_each_frag(skb, i)
pci_unmap_page(dui->pdev, *p++, skb_frag_size(&si->frags[i]),
PCI_DMA_TODEVICE);
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/emulex/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1012,7 +1012,7 @@ static u32 be_xmit_enqueue(struct be_adapter *adapter, struct be_tx_obj *txo,
copied += len;
}

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
len = skb_frag_size(frag);

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/faraday/ftgmac100.c
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,
pointer = ftgmac100_next_tx_pointer(priv, pointer);

/* Add the fragments */
for (i = 0; i < nfrags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

len = skb_frag_size(frag);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -2119,7 +2119,7 @@ static int dpaa_a050385_wa_skb(struct net_device *net_dev, struct sk_buff **s)
if (!IS_ALIGNED(skb_headlen(skb), DPAA_A050385_ALIGN))
goto workaround;

for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
skb_for_each_frag(skb, i) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];

/* all fragments need to have aligned start addresses */
Expand Down
5 changes: 2 additions & 3 deletions drivers/net/ethernet/freescale/gianfar.c
Original file line number Diff line number Diff line change
Expand Up @@ -1102,8 +1102,7 @@ static void free_skb_tx_queue(struct gfar_priv_tx_q *tx_queue)
dma_unmap_single(priv->dev, be32_to_cpu(txbdp->bufPtr),
be16_to_cpu(txbdp->length), DMA_TO_DEVICE);
txbdp->lstatus = 0;
for (j = 0; j < skb_shinfo(tx_queue->tx_skbuff[i])->nr_frags;
j++) {
skb_for_each_frag(tx_queue->tx_skbuff[i], j) {
txbdp++;
dma_unmap_page(priv->dev, be32_to_cpu(txbdp->bufPtr),
be16_to_cpu(txbdp->length),
Expand Down Expand Up @@ -2250,7 +2249,7 @@ static void gfar_clean_tx_ring(struct gfar_priv_tx_q *tx_queue)
gfar_clear_txbd_status(bdp);
bdp = next_txbd(bdp, base, tx_ring_size);

for (i = 0; i < frags; i++) {
skb_for_each_frag(skb, i) {
dma_unmap_page(priv->dev, be32_to_cpu(bdp->bufPtr),
be16_to_cpu(bdp->length),
DMA_TO_DEVICE);
Expand Down
Loading

0 comments on commit 9a46b32

Please sign in to comment.