1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include "stmmac.h"
30
31static unsigned int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
32{
33 struct stmmac_priv *priv = (struct stmmac_priv *) p;
34 unsigned int txsize = priv->dma_tx_size;
35 unsigned int entry = priv->cur_tx % txsize;
36 struct dma_desc *desc = priv->dma_tx + entry;
37 unsigned int nopaged_len = skb_headlen(skb);
38 unsigned int bmax, len;
39
40 if (priv->plat->enh_desc)
41 bmax = BUF_SIZE_8KiB;
42 else
43 bmax = BUF_SIZE_2KiB;
44
45 len = nopaged_len - bmax;
46
47 if (nopaged_len > BUF_SIZE_8KiB) {
48
49 desc->des2 = dma_map_single(priv->device, skb->data,
50 bmax, DMA_TO_DEVICE);
51 desc->des3 = desc->des2 + BUF_SIZE_4KiB;
52 priv->hw->desc->prepare_tx_desc(desc, 1, bmax,
53 csum);
54 wmb();
55 entry = (++priv->cur_tx) % txsize;
56 desc = priv->dma_tx + entry;
57
58 desc->des2 = dma_map_single(priv->device, skb->data + bmax,
59 len, DMA_TO_DEVICE);
60 desc->des3 = desc->des2 + BUF_SIZE_4KiB;
61 priv->hw->desc->prepare_tx_desc(desc, 0, len, csum);
62 wmb();
63 priv->hw->desc->set_tx_owner(desc);
64 priv->tx_skbuff[entry] = NULL;
65 } else {
66 desc->des2 = dma_map_single(priv->device, skb->data,
67 nopaged_len, DMA_TO_DEVICE);
68 desc->des3 = desc->des2 + BUF_SIZE_4KiB;
69 priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, csum);
70 }
71
72 return entry;
73}
74
75static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)
76{
77 unsigned int ret = 0;
78
79 if (len >= BUF_SIZE_4KiB)
80 ret = 1;
81
82 return ret;
83}
84
85static void stmmac_refill_desc3(int bfsize, struct dma_desc *p)
86{
87
88 if (bfsize >= BUF_SIZE_8KiB)
89 p->des3 = p->des2 + BUF_SIZE_8KiB;
90}
91
92
93
94static void stmmac_init_desc3(int des3_as_data_buf, struct dma_desc *p)
95{
96 if (unlikely(des3_as_data_buf))
97 p->des3 = p->des2 + BUF_SIZE_8KiB;
98}
99
100static void stmmac_init_dma_chain(struct dma_desc *des, dma_addr_t phy_addr,
101 unsigned int size)
102{
103}
104
105static void stmmac_clean_desc3(struct dma_desc *p)
106{
107 if (unlikely(p->des3))
108 p->des3 = 0;
109}
110
111static int stmmac_set_16kib_bfsize(int mtu)
112{
113 int ret = 0;
114 if (unlikely(mtu >= BUF_SIZE_8KiB))
115 ret = BUF_SIZE_16KiB;
116 return ret;
117}
118
119const struct stmmac_ring_mode_ops ring_mode_ops = {
120 .is_jumbo_frm = stmmac_is_jumbo_frm,
121 .jumbo_frm = stmmac_jumbo_frm,
122 .refill_desc3 = stmmac_refill_desc3,
123 .init_desc3 = stmmac_init_desc3,
124 .init_dma_chain = stmmac_init_dma_chain,
125 .clean_desc3 = stmmac_clean_desc3,
126 .set_16kib_bfsize = stmmac_set_16kib_bfsize,
127};
128