1874dfb65SJose Abreu // SPDX-License-Identifier: (GPL-2.0 OR MIT)
2874dfb65SJose Abreu /*
3874dfb65SJose Abreu * Copyright (c) 2018 Synopsys, Inc. and/or its affiliates.
4874dfb65SJose Abreu * stmmac XGMAC support.
5874dfb65SJose Abreu */
6874dfb65SJose Abreu
7874dfb65SJose Abreu #include <linux/stmmac.h>
8874dfb65SJose Abreu #include "common.h"
9874dfb65SJose Abreu #include "dwxgmac2.h"
10874dfb65SJose Abreu
dwxgmac2_get_tx_status(struct stmmac_extra_stats * x,struct dma_desc * p,void __iomem * ioaddr)11*133466c3SJisheng Zhang static int dwxgmac2_get_tx_status(struct stmmac_extra_stats *x,
12874dfb65SJose Abreu struct dma_desc *p, void __iomem *ioaddr)
13874dfb65SJose Abreu {
14874dfb65SJose Abreu unsigned int tdes3 = le32_to_cpu(p->des3);
15874dfb65SJose Abreu int ret = tx_done;
16874dfb65SJose Abreu
17874dfb65SJose Abreu if (unlikely(tdes3 & XGMAC_TDES3_OWN))
18874dfb65SJose Abreu return tx_dma_own;
19874dfb65SJose Abreu if (likely(!(tdes3 & XGMAC_TDES3_LD)))
20874dfb65SJose Abreu return tx_not_ls;
21874dfb65SJose Abreu
22874dfb65SJose Abreu return ret;
23874dfb65SJose Abreu }
24874dfb65SJose Abreu
dwxgmac2_get_rx_status(struct stmmac_extra_stats * x,struct dma_desc * p)25*133466c3SJisheng Zhang static int dwxgmac2_get_rx_status(struct stmmac_extra_stats *x,
26874dfb65SJose Abreu struct dma_desc *p)
27874dfb65SJose Abreu {
28874dfb65SJose Abreu unsigned int rdes3 = le32_to_cpu(p->des3);
29874dfb65SJose Abreu
30874dfb65SJose Abreu if (unlikely(rdes3 & XGMAC_RDES3_OWN))
31874dfb65SJose Abreu return dma_own;
3267afd6d1SJose Abreu if (unlikely(rdes3 & XGMAC_RDES3_CTXT))
3367afd6d1SJose Abreu return discard_frame;
34874dfb65SJose Abreu if (likely(!(rdes3 & XGMAC_RDES3_LD)))
35c887e02aSJose Abreu return rx_not_ls;
36c887e02aSJose Abreu if (unlikely((rdes3 & XGMAC_RDES3_ES) && (rdes3 & XGMAC_RDES3_LD)))
37874dfb65SJose Abreu return discard_frame;
38874dfb65SJose Abreu
39c887e02aSJose Abreu return good_frame;
40874dfb65SJose Abreu }
41874dfb65SJose Abreu
dwxgmac2_get_tx_len(struct dma_desc * p)42874dfb65SJose Abreu static int dwxgmac2_get_tx_len(struct dma_desc *p)
43874dfb65SJose Abreu {
44874dfb65SJose Abreu return (le32_to_cpu(p->des2) & XGMAC_TDES2_B1L);
45874dfb65SJose Abreu }
46874dfb65SJose Abreu
dwxgmac2_get_tx_owner(struct dma_desc * p)47874dfb65SJose Abreu static int dwxgmac2_get_tx_owner(struct dma_desc *p)
48874dfb65SJose Abreu {
49874dfb65SJose Abreu return (le32_to_cpu(p->des3) & XGMAC_TDES3_OWN) > 0;
50874dfb65SJose Abreu }
51874dfb65SJose Abreu
dwxgmac2_set_tx_owner(struct dma_desc * p)52874dfb65SJose Abreu static void dwxgmac2_set_tx_owner(struct dma_desc *p)
53874dfb65SJose Abreu {
54874dfb65SJose Abreu p->des3 |= cpu_to_le32(XGMAC_TDES3_OWN);
55874dfb65SJose Abreu }
56874dfb65SJose Abreu
dwxgmac2_set_rx_owner(struct dma_desc * p,int disable_rx_ic)57874dfb65SJose Abreu static void dwxgmac2_set_rx_owner(struct dma_desc *p, int disable_rx_ic)
58874dfb65SJose Abreu {
5967afd6d1SJose Abreu p->des3 |= cpu_to_le32(XGMAC_RDES3_OWN);
60874dfb65SJose Abreu
61874dfb65SJose Abreu if (!disable_rx_ic)
62874dfb65SJose Abreu p->des3 |= cpu_to_le32(XGMAC_RDES3_IOC);
63874dfb65SJose Abreu }
64874dfb65SJose Abreu
dwxgmac2_get_tx_ls(struct dma_desc * p)65874dfb65SJose Abreu static int dwxgmac2_get_tx_ls(struct dma_desc *p)
66874dfb65SJose Abreu {
67874dfb65SJose Abreu return (le32_to_cpu(p->des3) & XGMAC_RDES3_LD) > 0;
68874dfb65SJose Abreu }
69874dfb65SJose Abreu
dwxgmac2_get_rx_frame_len(struct dma_desc * p,int rx_coe)70874dfb65SJose Abreu static int dwxgmac2_get_rx_frame_len(struct dma_desc *p, int rx_coe)
71874dfb65SJose Abreu {
72874dfb65SJose Abreu return (le32_to_cpu(p->des3) & XGMAC_RDES3_PL);
73874dfb65SJose Abreu }
74874dfb65SJose Abreu
dwxgmac2_enable_tx_timestamp(struct dma_desc * p)75874dfb65SJose Abreu static void dwxgmac2_enable_tx_timestamp(struct dma_desc *p)
76874dfb65SJose Abreu {
77874dfb65SJose Abreu p->des2 |= cpu_to_le32(XGMAC_TDES2_TTSE);
78874dfb65SJose Abreu }
79874dfb65SJose Abreu
dwxgmac2_get_tx_timestamp_status(struct dma_desc * p)80874dfb65SJose Abreu static int dwxgmac2_get_tx_timestamp_status(struct dma_desc *p)
81874dfb65SJose Abreu {
82874dfb65SJose Abreu return 0; /* Not supported */
83874dfb65SJose Abreu }
84874dfb65SJose Abreu
dwxgmac2_get_timestamp(void * desc,u32 ats,u64 * ts)85874dfb65SJose Abreu static inline void dwxgmac2_get_timestamp(void *desc, u32 ats, u64 *ts)
86874dfb65SJose Abreu {
87874dfb65SJose Abreu struct dma_desc *p = (struct dma_desc *)desc;
88874dfb65SJose Abreu u64 ns = 0;
89874dfb65SJose Abreu
90874dfb65SJose Abreu ns += le32_to_cpu(p->des1) * 1000000000ULL;
91874dfb65SJose Abreu ns += le32_to_cpu(p->des0);
92874dfb65SJose Abreu
93874dfb65SJose Abreu *ts = ns;
94874dfb65SJose Abreu }
95874dfb65SJose Abreu
dwxgmac2_rx_check_timestamp(void * desc)96874dfb65SJose Abreu static int dwxgmac2_rx_check_timestamp(void *desc)
97874dfb65SJose Abreu {
98874dfb65SJose Abreu struct dma_desc *p = (struct dma_desc *)desc;
99874dfb65SJose Abreu unsigned int rdes3 = le32_to_cpu(p->des3);
100874dfb65SJose Abreu bool desc_valid, ts_valid;
101874dfb65SJose Abreu
10225e80cd0SJose Abreu dma_rmb();
10325e80cd0SJose Abreu
104874dfb65SJose Abreu desc_valid = !(rdes3 & XGMAC_RDES3_OWN) && (rdes3 & XGMAC_RDES3_CTXT);
105874dfb65SJose Abreu ts_valid = !(rdes3 & XGMAC_RDES3_TSD) && (rdes3 & XGMAC_RDES3_TSA);
106874dfb65SJose Abreu
10725e80cd0SJose Abreu if (likely(desc_valid && ts_valid)) {
10825e80cd0SJose Abreu if ((p->des0 == 0xffffffff) && (p->des1 == 0xffffffff))
10925e80cd0SJose Abreu return -EINVAL;
110874dfb65SJose Abreu return 0;
11125e80cd0SJose Abreu }
11225e80cd0SJose Abreu
113874dfb65SJose Abreu return -EINVAL;
114874dfb65SJose Abreu }
115874dfb65SJose Abreu
dwxgmac2_get_rx_timestamp_status(void * desc,void * next_desc,u32 ats)116874dfb65SJose Abreu static int dwxgmac2_get_rx_timestamp_status(void *desc, void *next_desc,
117874dfb65SJose Abreu u32 ats)
118874dfb65SJose Abreu {
119874dfb65SJose Abreu struct dma_desc *p = (struct dma_desc *)desc;
120874dfb65SJose Abreu unsigned int rdes3 = le32_to_cpu(p->des3);
121874dfb65SJose Abreu int ret = -EBUSY;
122874dfb65SJose Abreu
12325e80cd0SJose Abreu if (likely(rdes3 & XGMAC_RDES3_CDA))
124874dfb65SJose Abreu ret = dwxgmac2_rx_check_timestamp(next_desc);
125874dfb65SJose Abreu
12625e80cd0SJose Abreu return !ret;
127874dfb65SJose Abreu }
128874dfb65SJose Abreu
dwxgmac2_init_rx_desc(struct dma_desc * p,int disable_rx_ic,int mode,int end,int bfsize)129874dfb65SJose Abreu static void dwxgmac2_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
130583e6361SAaro Koskinen int mode, int end, int bfsize)
131874dfb65SJose Abreu {
132874dfb65SJose Abreu dwxgmac2_set_rx_owner(p, disable_rx_ic);
133874dfb65SJose Abreu }
134874dfb65SJose Abreu
dwxgmac2_init_tx_desc(struct dma_desc * p,int mode,int end)135874dfb65SJose Abreu static void dwxgmac2_init_tx_desc(struct dma_desc *p, int mode, int end)
136874dfb65SJose Abreu {
137874dfb65SJose Abreu p->des0 = 0;
138874dfb65SJose Abreu p->des1 = 0;
139874dfb65SJose Abreu p->des2 = 0;
140874dfb65SJose Abreu p->des3 = 0;
141874dfb65SJose Abreu }
142874dfb65SJose Abreu
dwxgmac2_prepare_tx_desc(struct dma_desc * p,int is_fs,int len,bool csum_flag,int mode,bool tx_own,bool ls,unsigned int tot_pkt_len)143874dfb65SJose Abreu static void dwxgmac2_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
144874dfb65SJose Abreu bool csum_flag, int mode, bool tx_own,
145874dfb65SJose Abreu bool ls, unsigned int tot_pkt_len)
146874dfb65SJose Abreu {
147874dfb65SJose Abreu unsigned int tdes3 = le32_to_cpu(p->des3);
148874dfb65SJose Abreu
149874dfb65SJose Abreu p->des2 |= cpu_to_le32(len & XGMAC_TDES2_B1L);
150874dfb65SJose Abreu
1518000ddc0SJose Abreu tdes3 |= tot_pkt_len & XGMAC_TDES3_FL;
152874dfb65SJose Abreu if (is_fs)
153874dfb65SJose Abreu tdes3 |= XGMAC_TDES3_FD;
154874dfb65SJose Abreu else
155874dfb65SJose Abreu tdes3 &= ~XGMAC_TDES3_FD;
156874dfb65SJose Abreu
157874dfb65SJose Abreu if (csum_flag)
158874dfb65SJose Abreu tdes3 |= 0x3 << XGMAC_TDES3_CIC_SHIFT;
159874dfb65SJose Abreu else
160874dfb65SJose Abreu tdes3 &= ~XGMAC_TDES3_CIC;
161874dfb65SJose Abreu
162874dfb65SJose Abreu if (ls)
163874dfb65SJose Abreu tdes3 |= XGMAC_TDES3_LD;
164874dfb65SJose Abreu else
165874dfb65SJose Abreu tdes3 &= ~XGMAC_TDES3_LD;
166874dfb65SJose Abreu
167874dfb65SJose Abreu /* Finally set the OWN bit. Later the DMA will start! */
168874dfb65SJose Abreu if (tx_own)
169874dfb65SJose Abreu tdes3 |= XGMAC_TDES3_OWN;
170874dfb65SJose Abreu
171874dfb65SJose Abreu if (is_fs && tx_own)
172874dfb65SJose Abreu /* When the own bit, for the first frame, has to be set, all
173874dfb65SJose Abreu * descriptors for the same frame has to be set before, to
174874dfb65SJose Abreu * avoid race condition.
175874dfb65SJose Abreu */
176874dfb65SJose Abreu dma_wmb();
177874dfb65SJose Abreu
178874dfb65SJose Abreu p->des3 = cpu_to_le32(tdes3);
179874dfb65SJose Abreu }
180874dfb65SJose Abreu
dwxgmac2_prepare_tso_tx_desc(struct dma_desc * p,int is_fs,int len1,int len2,bool tx_own,bool ls,unsigned int tcphdrlen,unsigned int tcppayloadlen)181874dfb65SJose Abreu static void dwxgmac2_prepare_tso_tx_desc(struct dma_desc *p, int is_fs,
182874dfb65SJose Abreu int len1, int len2, bool tx_own,
183874dfb65SJose Abreu bool ls, unsigned int tcphdrlen,
184874dfb65SJose Abreu unsigned int tcppayloadlen)
185874dfb65SJose Abreu {
186874dfb65SJose Abreu unsigned int tdes3 = le32_to_cpu(p->des3);
187874dfb65SJose Abreu
188874dfb65SJose Abreu if (len1)
189874dfb65SJose Abreu p->des2 |= cpu_to_le32(len1 & XGMAC_TDES2_B1L);
190874dfb65SJose Abreu if (len2)
191874dfb65SJose Abreu p->des2 |= cpu_to_le32((len2 << XGMAC_TDES2_B2L_SHIFT) &
192874dfb65SJose Abreu XGMAC_TDES2_B2L);
193874dfb65SJose Abreu if (is_fs) {
194874dfb65SJose Abreu tdes3 |= XGMAC_TDES3_FD | XGMAC_TDES3_TSE;
195874dfb65SJose Abreu tdes3 |= (tcphdrlen << XGMAC_TDES3_THL_SHIFT) &
196874dfb65SJose Abreu XGMAC_TDES3_THL;
197874dfb65SJose Abreu tdes3 |= tcppayloadlen & XGMAC_TDES3_TPL;
198874dfb65SJose Abreu } else {
199874dfb65SJose Abreu tdes3 &= ~XGMAC_TDES3_FD;
200874dfb65SJose Abreu }
201874dfb65SJose Abreu
202874dfb65SJose Abreu if (ls)
203874dfb65SJose Abreu tdes3 |= XGMAC_TDES3_LD;
204874dfb65SJose Abreu else
205874dfb65SJose Abreu tdes3 &= ~XGMAC_TDES3_LD;
206874dfb65SJose Abreu
207874dfb65SJose Abreu /* Finally set the OWN bit. Later the DMA will start! */
208874dfb65SJose Abreu if (tx_own)
209874dfb65SJose Abreu tdes3 |= XGMAC_TDES3_OWN;
210874dfb65SJose Abreu
211874dfb65SJose Abreu if (is_fs && tx_own)
212874dfb65SJose Abreu /* When the own bit, for the first frame, has to be set, all
213874dfb65SJose Abreu * descriptors for the same frame has to be set before, to
214874dfb65SJose Abreu * avoid race condition.
215874dfb65SJose Abreu */
216874dfb65SJose Abreu dma_wmb();
217874dfb65SJose Abreu
218874dfb65SJose Abreu p->des3 = cpu_to_le32(tdes3);
219874dfb65SJose Abreu }
220874dfb65SJose Abreu
dwxgmac2_release_tx_desc(struct dma_desc * p,int mode)221874dfb65SJose Abreu static void dwxgmac2_release_tx_desc(struct dma_desc *p, int mode)
222874dfb65SJose Abreu {
223874dfb65SJose Abreu p->des0 = 0;
224874dfb65SJose Abreu p->des1 = 0;
225874dfb65SJose Abreu p->des2 = 0;
226874dfb65SJose Abreu p->des3 = 0;
227874dfb65SJose Abreu }
228874dfb65SJose Abreu
dwxgmac2_set_tx_ic(struct dma_desc * p)229874dfb65SJose Abreu static void dwxgmac2_set_tx_ic(struct dma_desc *p)
230874dfb65SJose Abreu {
231874dfb65SJose Abreu p->des2 |= cpu_to_le32(XGMAC_TDES2_IOC);
232874dfb65SJose Abreu }
233874dfb65SJose Abreu
dwxgmac2_set_mss(struct dma_desc * p,unsigned int mss)234874dfb65SJose Abreu static void dwxgmac2_set_mss(struct dma_desc *p, unsigned int mss)
235874dfb65SJose Abreu {
236874dfb65SJose Abreu p->des0 = 0;
237874dfb65SJose Abreu p->des1 = 0;
238874dfb65SJose Abreu p->des2 = cpu_to_le32(mss);
239874dfb65SJose Abreu p->des3 = cpu_to_le32(XGMAC_TDES3_CTXT | XGMAC_TDES3_TCMSSV);
240874dfb65SJose Abreu }
241874dfb65SJose Abreu
dwxgmac2_set_addr(struct dma_desc * p,dma_addr_t addr)242874dfb65SJose Abreu static void dwxgmac2_set_addr(struct dma_desc *p, dma_addr_t addr)
243874dfb65SJose Abreu {
244a993db88SJose Abreu p->des0 = cpu_to_le32(lower_32_bits(addr));
245a993db88SJose Abreu p->des1 = cpu_to_le32(upper_32_bits(addr));
246874dfb65SJose Abreu }
247874dfb65SJose Abreu
dwxgmac2_clear(struct dma_desc * p)248874dfb65SJose Abreu static void dwxgmac2_clear(struct dma_desc *p)
249874dfb65SJose Abreu {
250874dfb65SJose Abreu p->des0 = 0;
251874dfb65SJose Abreu p->des1 = 0;
252874dfb65SJose Abreu p->des2 = 0;
253874dfb65SJose Abreu p->des3 = 0;
254874dfb65SJose Abreu }
255874dfb65SJose Abreu
dwxgmac2_get_rx_hash(struct dma_desc * p,u32 * hash,enum pkt_hash_types * type)25676067459SJose Abreu static int dwxgmac2_get_rx_hash(struct dma_desc *p, u32 *hash,
25776067459SJose Abreu enum pkt_hash_types *type)
25876067459SJose Abreu {
25976067459SJose Abreu unsigned int rdes3 = le32_to_cpu(p->des3);
26076067459SJose Abreu u32 ptype;
26176067459SJose Abreu
26276067459SJose Abreu if (rdes3 & XGMAC_RDES3_RSV) {
26376067459SJose Abreu ptype = (rdes3 & XGMAC_RDES3_L34T) >> XGMAC_RDES3_L34T_SHIFT;
26476067459SJose Abreu
26576067459SJose Abreu switch (ptype) {
26676067459SJose Abreu case XGMAC_L34T_IP4TCP:
26776067459SJose Abreu case XGMAC_L34T_IP4UDP:
26876067459SJose Abreu case XGMAC_L34T_IP6TCP:
26976067459SJose Abreu case XGMAC_L34T_IP6UDP:
27076067459SJose Abreu *type = PKT_HASH_TYPE_L4;
27176067459SJose Abreu break;
27276067459SJose Abreu default:
27376067459SJose Abreu *type = PKT_HASH_TYPE_L3;
27476067459SJose Abreu break;
27576067459SJose Abreu }
27676067459SJose Abreu
27776067459SJose Abreu *hash = le32_to_cpu(p->des1);
27876067459SJose Abreu return 0;
27976067459SJose Abreu }
28076067459SJose Abreu
28176067459SJose Abreu return -EINVAL;
28276067459SJose Abreu }
28376067459SJose Abreu
dwxgmac2_get_rx_header_len(struct dma_desc * p,unsigned int * len)28431f2760eSLuo Jiaxing static void dwxgmac2_get_rx_header_len(struct dma_desc *p, unsigned int *len)
28567afd6d1SJose Abreu {
28696147375SJose Abreu if (le32_to_cpu(p->des3) & XGMAC_RDES3_L34T)
28767afd6d1SJose Abreu *len = le32_to_cpu(p->des2) & XGMAC_RDES2_HL;
28867afd6d1SJose Abreu }
28967afd6d1SJose Abreu
dwxgmac2_set_sec_addr(struct dma_desc * p,dma_addr_t addr,bool is_valid)290396e13e1SJoakim Zhang static void dwxgmac2_set_sec_addr(struct dma_desc *p, dma_addr_t addr, bool is_valid)
29167afd6d1SJose Abreu {
29267afd6d1SJose Abreu p->des2 = cpu_to_le32(lower_32_bits(addr));
29367afd6d1SJose Abreu p->des3 = cpu_to_le32(upper_32_bits(addr));
29467afd6d1SJose Abreu }
29567afd6d1SJose Abreu
dwxgmac2_set_sarc(struct dma_desc * p,u32 sarc_type)2968000ddc0SJose Abreu static void dwxgmac2_set_sarc(struct dma_desc *p, u32 sarc_type)
2978000ddc0SJose Abreu {
2988000ddc0SJose Abreu sarc_type <<= XGMAC_TDES3_SAIC_SHIFT;
2998000ddc0SJose Abreu
3008000ddc0SJose Abreu p->des3 |= cpu_to_le32(sarc_type & XGMAC_TDES3_SAIC);
3018000ddc0SJose Abreu }
3028000ddc0SJose Abreu
dwxgmac2_set_vlan_tag(struct dma_desc * p,u16 tag,u16 inner_tag,u32 inner_type)30330d93227SJose Abreu static void dwxgmac2_set_vlan_tag(struct dma_desc *p, u16 tag, u16 inner_tag,
30430d93227SJose Abreu u32 inner_type)
30530d93227SJose Abreu {
30630d93227SJose Abreu p->des0 = 0;
30730d93227SJose Abreu p->des1 = 0;
30830d93227SJose Abreu p->des2 = 0;
30930d93227SJose Abreu p->des3 = 0;
31030d93227SJose Abreu
31130d93227SJose Abreu /* Inner VLAN */
31230d93227SJose Abreu if (inner_type) {
31330d93227SJose Abreu u32 des = inner_tag << XGMAC_TDES2_IVT_SHIFT;
31430d93227SJose Abreu
31530d93227SJose Abreu des &= XGMAC_TDES2_IVT;
31630d93227SJose Abreu p->des2 = cpu_to_le32(des);
31730d93227SJose Abreu
31830d93227SJose Abreu des = inner_type << XGMAC_TDES3_IVTIR_SHIFT;
31930d93227SJose Abreu des &= XGMAC_TDES3_IVTIR;
32030d93227SJose Abreu p->des3 = cpu_to_le32(des | XGMAC_TDES3_IVLTV);
32130d93227SJose Abreu }
32230d93227SJose Abreu
32330d93227SJose Abreu /* Outer VLAN */
32430d93227SJose Abreu p->des3 |= cpu_to_le32(tag & XGMAC_TDES3_VT);
32530d93227SJose Abreu p->des3 |= cpu_to_le32(XGMAC_TDES3_VLTV);
32630d93227SJose Abreu
32730d93227SJose Abreu p->des3 |= cpu_to_le32(XGMAC_TDES3_CTXT);
32830d93227SJose Abreu }
32930d93227SJose Abreu
dwxgmac2_set_vlan(struct dma_desc * p,u32 type)33030d93227SJose Abreu static void dwxgmac2_set_vlan(struct dma_desc *p, u32 type)
33130d93227SJose Abreu {
33230d93227SJose Abreu type <<= XGMAC_TDES2_VTIR_SHIFT;
33330d93227SJose Abreu p->des2 |= cpu_to_le32(type & XGMAC_TDES2_VTIR);
33430d93227SJose Abreu }
33530d93227SJose Abreu
dwxgmac2_set_tbs(struct dma_edesc * p,u32 sec,u32 nsec)3366a549b9fSJose Abreu static void dwxgmac2_set_tbs(struct dma_edesc *p, u32 sec, u32 nsec)
3376a549b9fSJose Abreu {
3386a549b9fSJose Abreu p->des4 = cpu_to_le32((sec & XGMAC_TDES0_LT) | XGMAC_TDES0_LTV);
3396a549b9fSJose Abreu p->des5 = cpu_to_le32(nsec & XGMAC_TDES1_LT);
3406a549b9fSJose Abreu p->des6 = 0;
3416a549b9fSJose Abreu p->des7 = 0;
3426a549b9fSJose Abreu }
3436a549b9fSJose Abreu
344874dfb65SJose Abreu const struct stmmac_desc_ops dwxgmac210_desc_ops = {
345874dfb65SJose Abreu .tx_status = dwxgmac2_get_tx_status,
346874dfb65SJose Abreu .rx_status = dwxgmac2_get_rx_status,
347874dfb65SJose Abreu .get_tx_len = dwxgmac2_get_tx_len,
348874dfb65SJose Abreu .get_tx_owner = dwxgmac2_get_tx_owner,
349874dfb65SJose Abreu .set_tx_owner = dwxgmac2_set_tx_owner,
350874dfb65SJose Abreu .set_rx_owner = dwxgmac2_set_rx_owner,
351874dfb65SJose Abreu .get_tx_ls = dwxgmac2_get_tx_ls,
352874dfb65SJose Abreu .get_rx_frame_len = dwxgmac2_get_rx_frame_len,
353874dfb65SJose Abreu .enable_tx_timestamp = dwxgmac2_enable_tx_timestamp,
354874dfb65SJose Abreu .get_tx_timestamp_status = dwxgmac2_get_tx_timestamp_status,
355874dfb65SJose Abreu .get_rx_timestamp_status = dwxgmac2_get_rx_timestamp_status,
356874dfb65SJose Abreu .get_timestamp = dwxgmac2_get_timestamp,
357874dfb65SJose Abreu .set_tx_ic = dwxgmac2_set_tx_ic,
358874dfb65SJose Abreu .prepare_tx_desc = dwxgmac2_prepare_tx_desc,
359874dfb65SJose Abreu .prepare_tso_tx_desc = dwxgmac2_prepare_tso_tx_desc,
360874dfb65SJose Abreu .release_tx_desc = dwxgmac2_release_tx_desc,
361874dfb65SJose Abreu .init_rx_desc = dwxgmac2_init_rx_desc,
362874dfb65SJose Abreu .init_tx_desc = dwxgmac2_init_tx_desc,
363874dfb65SJose Abreu .set_mss = dwxgmac2_set_mss,
364874dfb65SJose Abreu .set_addr = dwxgmac2_set_addr,
365874dfb65SJose Abreu .clear = dwxgmac2_clear,
36676067459SJose Abreu .get_rx_hash = dwxgmac2_get_rx_hash,
36767afd6d1SJose Abreu .get_rx_header_len = dwxgmac2_get_rx_header_len,
36867afd6d1SJose Abreu .set_sec_addr = dwxgmac2_set_sec_addr,
3698000ddc0SJose Abreu .set_sarc = dwxgmac2_set_sarc,
37030d93227SJose Abreu .set_vlan_tag = dwxgmac2_set_vlan_tag,
37130d93227SJose Abreu .set_vlan = dwxgmac2_set_vlan,
3726a549b9fSJose Abreu .set_tbs = dwxgmac2_set_tbs,
373874dfb65SJose Abreu };
374