forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_descs.c
....@@ -26,16 +26,17 @@
2626 struct dma_desc *p)
2727 {
2828 unsigned int rdes3 = le32_to_cpu(p->des3);
29
- int ret = good_frame;
3029
3130 if (unlikely(rdes3 & XGMAC_RDES3_OWN))
3231 return dma_own;
33
- if (likely(!(rdes3 & XGMAC_RDES3_LD)))
32
+ if (unlikely(rdes3 & XGMAC_RDES3_CTXT))
3433 return discard_frame;
35
- if (unlikely(rdes3 & XGMAC_RDES3_ES))
36
- ret = discard_frame;
34
+ if (likely(!(rdes3 & XGMAC_RDES3_LD)))
35
+ return rx_not_ls;
36
+ if (unlikely((rdes3 & XGMAC_RDES3_ES) && (rdes3 & XGMAC_RDES3_LD)))
37
+ return discard_frame;
3738
38
- return ret;
39
+ return good_frame;
3940 }
4041
4142 static int dwxgmac2_get_tx_len(struct dma_desc *p)
....@@ -55,7 +56,7 @@
5556
5657 static void dwxgmac2_set_rx_owner(struct dma_desc *p, int disable_rx_ic)
5758 {
58
- p->des3 = cpu_to_le32(XGMAC_RDES3_OWN);
59
+ p->des3 |= cpu_to_le32(XGMAC_RDES3_OWN);
5960
6061 if (!disable_rx_ic)
6162 p->des3 |= cpu_to_le32(XGMAC_RDES3_IOC);
....@@ -98,11 +99,17 @@
9899 unsigned int rdes3 = le32_to_cpu(p->des3);
99100 bool desc_valid, ts_valid;
100101
102
+ dma_rmb();
103
+
101104 desc_valid = !(rdes3 & XGMAC_RDES3_OWN) && (rdes3 & XGMAC_RDES3_CTXT);
102105 ts_valid = !(rdes3 & XGMAC_RDES3_TSD) && (rdes3 & XGMAC_RDES3_TSA);
103106
104
- if (likely(desc_valid && ts_valid))
107
+ if (likely(desc_valid && ts_valid)) {
108
+ if ((p->des0 == 0xffffffff) && (p->des1 == 0xffffffff))
109
+ return -EINVAL;
105110 return 0;
111
+ }
112
+
106113 return -EINVAL;
107114 }
108115
....@@ -113,13 +120,10 @@
113120 unsigned int rdes3 = le32_to_cpu(p->des3);
114121 int ret = -EBUSY;
115122
116
- if (likely(rdes3 & XGMAC_RDES3_CDA)) {
123
+ if (likely(rdes3 & XGMAC_RDES3_CDA))
117124 ret = dwxgmac2_rx_check_timestamp(next_desc);
118
- if (ret)
119
- return ret;
120
- }
121125
122
- return ret;
126
+ return !ret;
123127 }
124128
125129 static void dwxgmac2_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
....@@ -144,7 +148,7 @@
144148
145149 p->des2 |= cpu_to_le32(len & XGMAC_TDES2_B1L);
146150
147
- tdes3 = tot_pkt_len & XGMAC_TDES3_FL;
151
+ tdes3 |= tot_pkt_len & XGMAC_TDES3_FL;
148152 if (is_fs)
149153 tdes3 |= XGMAC_TDES3_FD;
150154 else
....@@ -242,8 +246,8 @@
242246
243247 static void dwxgmac2_set_addr(struct dma_desc *p, dma_addr_t addr)
244248 {
245
- p->des0 = cpu_to_le32(addr);
246
- p->des1 = 0;
249
+ p->des0 = cpu_to_le32(lower_32_bits(addr));
250
+ p->des1 = cpu_to_le32(upper_32_bits(addr));
247251 }
248252
249253 static void dwxgmac2_clear(struct dma_desc *p)
....@@ -252,6 +256,94 @@
252256 p->des1 = 0;
253257 p->des2 = 0;
254258 p->des3 = 0;
259
+}
260
+
261
+static int dwxgmac2_get_rx_hash(struct dma_desc *p, u32 *hash,
262
+ enum pkt_hash_types *type)
263
+{
264
+ unsigned int rdes3 = le32_to_cpu(p->des3);
265
+ u32 ptype;
266
+
267
+ if (rdes3 & XGMAC_RDES3_RSV) {
268
+ ptype = (rdes3 & XGMAC_RDES3_L34T) >> XGMAC_RDES3_L34T_SHIFT;
269
+
270
+ switch (ptype) {
271
+ case XGMAC_L34T_IP4TCP:
272
+ case XGMAC_L34T_IP4UDP:
273
+ case XGMAC_L34T_IP6TCP:
274
+ case XGMAC_L34T_IP6UDP:
275
+ *type = PKT_HASH_TYPE_L4;
276
+ break;
277
+ default:
278
+ *type = PKT_HASH_TYPE_L3;
279
+ break;
280
+ }
281
+
282
+ *hash = le32_to_cpu(p->des1);
283
+ return 0;
284
+ }
285
+
286
+ return -EINVAL;
287
+}
288
+
289
+static void dwxgmac2_get_rx_header_len(struct dma_desc *p, unsigned int *len)
290
+{
291
+ if (le32_to_cpu(p->des3) & XGMAC_RDES3_L34T)
292
+ *len = le32_to_cpu(p->des2) & XGMAC_RDES2_HL;
293
+}
294
+
295
+static void dwxgmac2_set_sec_addr(struct dma_desc *p, dma_addr_t addr, bool is_valid)
296
+{
297
+ p->des2 = cpu_to_le32(lower_32_bits(addr));
298
+ p->des3 = cpu_to_le32(upper_32_bits(addr));
299
+}
300
+
301
+static void dwxgmac2_set_sarc(struct dma_desc *p, u32 sarc_type)
302
+{
303
+ sarc_type <<= XGMAC_TDES3_SAIC_SHIFT;
304
+
305
+ p->des3 |= cpu_to_le32(sarc_type & XGMAC_TDES3_SAIC);
306
+}
307
+
308
+static void dwxgmac2_set_vlan_tag(struct dma_desc *p, u16 tag, u16 inner_tag,
309
+ u32 inner_type)
310
+{
311
+ p->des0 = 0;
312
+ p->des1 = 0;
313
+ p->des2 = 0;
314
+ p->des3 = 0;
315
+
316
+ /* Inner VLAN */
317
+ if (inner_type) {
318
+ u32 des = inner_tag << XGMAC_TDES2_IVT_SHIFT;
319
+
320
+ des &= XGMAC_TDES2_IVT;
321
+ p->des2 = cpu_to_le32(des);
322
+
323
+ des = inner_type << XGMAC_TDES3_IVTIR_SHIFT;
324
+ des &= XGMAC_TDES3_IVTIR;
325
+ p->des3 = cpu_to_le32(des | XGMAC_TDES3_IVLTV);
326
+ }
327
+
328
+ /* Outer VLAN */
329
+ p->des3 |= cpu_to_le32(tag & XGMAC_TDES3_VT);
330
+ p->des3 |= cpu_to_le32(XGMAC_TDES3_VLTV);
331
+
332
+ p->des3 |= cpu_to_le32(XGMAC_TDES3_CTXT);
333
+}
334
+
335
+static void dwxgmac2_set_vlan(struct dma_desc *p, u32 type)
336
+{
337
+ type <<= XGMAC_TDES2_VTIR_SHIFT;
338
+ p->des2 |= cpu_to_le32(type & XGMAC_TDES2_VTIR);
339
+}
340
+
341
+static void dwxgmac2_set_tbs(struct dma_edesc *p, u32 sec, u32 nsec)
342
+{
343
+ p->des4 = cpu_to_le32((sec & XGMAC_TDES0_LT) | XGMAC_TDES0_LTV);
344
+ p->des5 = cpu_to_le32(nsec & XGMAC_TDES1_LT);
345
+ p->des6 = 0;
346
+ p->des7 = 0;
255347 }
256348
257349 const struct stmmac_desc_ops dwxgmac210_desc_ops = {
....@@ -277,4 +369,11 @@
277369 .get_addr = dwxgmac2_get_addr,
278370 .set_addr = dwxgmac2_set_addr,
279371 .clear = dwxgmac2_clear,
372
+ .get_rx_hash = dwxgmac2_get_rx_hash,
373
+ .get_rx_header_len = dwxgmac2_get_rx_header_len,
374
+ .set_sec_addr = dwxgmac2_set_sec_addr,
375
+ .set_sarc = dwxgmac2_set_sarc,
376
+ .set_vlan_tag = dwxgmac2_set_vlan_tag,
377
+ .set_vlan = dwxgmac2_set_vlan,
378
+ .set_tbs = dwxgmac2_set_tbs,
280379 };