if (priv->plat->enh_desc)
bmax = BUF_SIZE_8KiB; else
bmax = BUF_SIZE_2KiB;
len = nopaged_len - bmax;
des2 = dma_map_single(priv->device, skb->data,
bmax, DMA_TO_DEVICE);
desc->des2 = cpu_to_le32(des2); if (dma_mapping_error(priv->device, des2)) return -1;
tx_q->tx_skbuff_dma[entry].buf = des2;
tx_q->tx_skbuff_dma[entry].len = bmax; /* do not close the descriptor and do not set own bit */
stmmac_prepare_tx_desc(priv, desc, 1, bmax, csum, STMMAC_CHAIN_MODE,
0, false, skb->len);
if (len > bmax) {
des2 = dma_map_single(priv->device,
(skb->data + bmax * i),
bmax, DMA_TO_DEVICE);
desc->des2 = cpu_to_le32(des2); if (dma_mapping_error(priv->device, des2)) return -1;
tx_q->tx_skbuff_dma[entry].buf = des2;
tx_q->tx_skbuff_dma[entry].len = bmax;
stmmac_prepare_tx_desc(priv, desc, 0, bmax, csum,
STMMAC_CHAIN_MODE, 1, false, skb->len);
len -= bmax;
i++;
} else {
des2 = dma_map_single(priv->device,
(skb->data + bmax * i), len,
DMA_TO_DEVICE);
desc->des2 = cpu_to_le32(des2); if (dma_mapping_error(priv->device, des2)) return -1;
tx_q->tx_skbuff_dma[entry].buf = des2;
tx_q->tx_skbuff_dma[entry].len = len; /* last descriptor can be set now */
stmmac_prepare_tx_desc(priv, desc, 0, len, csum,
STMMAC_CHAIN_MODE, 1, true, skb->len);
len = 0;
}
}
tx_q->cur_tx = entry;
return entry;
}
staticunsignedint is_jumbo_frm(int len, int enh_desc)
{ unsignedint ret = 0;
if ((enh_desc && (len > BUF_SIZE_8KiB)) ||
(!enh_desc && (len > BUF_SIZE_2KiB))) {
ret = 1;
}
return ret;
}
staticvoid init_dma_chain(void *des, dma_addr_t phy_addr, unsignedint size, unsignedint extend_desc)
{ /* * In chained mode the des3 points to the next element in the ring. * The latest element has to point to the head.
*/ int i;
dma_addr_t dma_phy = phy_addr;
if (extend_desc) { struct dma_extended_desc *p = (struct dma_extended_desc *)des; for (i = 0; i < (size - 1); i++) {
dma_phy += sizeof(struct dma_extended_desc);
p->basic.des3 = cpu_to_le32((unsignedint)dma_phy);
p++;
}
p->basic.des3 = cpu_to_le32((unsignedint)phy_addr);
if (priv->hwts_rx_en && !priv->extend_desc) /* NOTE: Device will overwrite des3 with timestamp value if * 1588-2002 time stamping is enabled, hence reinitialize it * to keep explicit chaining in the descriptor.
*/
p->des3 = cpu_to_le32((unsignedint)(rx_q->dma_rx_phy +
(((rx_q->dirty_rx) + 1) %
priv->dma_conf.dma_rx_size) * sizeof(struct dma_desc)));
}
if (tx_q->tx_skbuff_dma[entry].last_segment && !priv->extend_desc &&
priv->hwts_tx_en) /* NOTE: Device will overwrite des3 with timestamp value if * 1588-2002 time stamping is enabled, hence reinitialize it * to keep explicit chaining in the descriptor.
*/
p->des3 = cpu_to_le32((unsignedint)((tx_q->dma_tx_phy +
((tx_q->dirty_tx + 1) %
priv->dma_conf.dma_tx_size))
* sizeof(struct dma_desc)));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.