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
31unsigned 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;
39 unsigned int i = 1, len;
40
41 if (priv->plat->enh_desc)
42 bmax = BUF_SIZE_8KiB;
43 else
44 bmax = BUF_SIZE_2KiB;
45
46 len = nopaged_len - bmax;
47
48 desc->des2 = dma_map_single(priv->device, skb->data,
49 bmax, DMA_TO_DEVICE);
50 priv->hw->desc->prepare_tx_desc(desc, 1, bmax, csum);
51
52 while (len != 0) {
53 entry = (++priv->cur_tx) % txsize;
54 desc = priv->dma_tx + entry;
55
56 if (len > bmax) {
57 desc->des2 = dma_map_single(priv->device,
58 (skb->data + bmax * i),
59 bmax, DMA_TO_DEVICE);
60 priv->hw->desc->prepare_tx_desc(desc, 0, bmax,
61 csum);
62 priv->hw->desc->set_tx_owner(desc);
63 priv->tx_skbuff[entry] = NULL;
64 len -= bmax;
65 i++;
66 } else {
67 desc->des2 = dma_map_single(priv->device,
68 (skb->data + bmax * i), len,
69 DMA_TO_DEVICE);
70 priv->hw->desc->prepare_tx_desc(desc, 0, len,
71 csum);
72 priv->hw->desc->set_tx_owner(desc);
73 priv->tx_skbuff[entry] = NULL;
74 len = 0;
75 }
76 }
77 return entry;
78}
79
80static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)
81{
82 unsigned int ret = 0;
83
84 if ((enh_desc && (len > BUF_SIZE_8KiB)) ||
85 (!enh_desc && (len > BUF_SIZE_2KiB))) {
86 ret = 1;
87 }
88
89 return ret;
90}
91
92static void stmmac_refill_desc3(int bfsize, struct dma_desc *p)
93{
94}
95
96static void stmmac_init_desc3(int des3_as_data_buf, struct dma_desc *p)
97{
98}
99
100static void stmmac_clean_desc3(struct dma_desc *p)
101{
102}
103
104static void stmmac_init_dma_chain(struct dma_desc *des, dma_addr_t phy_addr,
105 unsigned int size)
106{
107
108
109
110
111 int i;
112 struct dma_desc *p = des;
113 dma_addr_t dma_phy = phy_addr;
114
115 for (i = 0; i < (size - 1); i++) {
116 dma_phy += sizeof(struct dma_desc);
117 p->des3 = (unsigned int)dma_phy;
118 p++;
119 }
120 p->des3 = (unsigned int)phy_addr;
121}
122
123static int stmmac_set_16kib_bfsize(int mtu)
124{
125
126 return 0;
127}
128
129const struct stmmac_ring_mode_ops ring_mode_ops = {
130 .is_jumbo_frm = stmmac_is_jumbo_frm,
131 .jumbo_frm = stmmac_jumbo_frm,
132 .refill_desc3 = stmmac_refill_desc3,
133 .init_desc3 = stmmac_init_desc3,
134 .init_dma_chain = stmmac_init_dma_chain,
135 .clean_desc3 = stmmac_clean_desc3,
136 .set_16kib_bfsize = stmmac_set_16kib_bfsize,
137};
138