1
2
3
4#include "ice_dcb_lib.h"
5#include "ice_dcb_nl.h"
6
7
8
9
10
11static u8 ice_dcb_get_ena_tc(struct ice_dcbx_cfg *dcbcfg)
12{
13 u8 i, num_tc, ena_tc = 1;
14
15 num_tc = ice_dcb_get_num_tc(dcbcfg);
16
17 for (i = 0; i < num_tc; i++)
18 ena_tc |= BIT(i);
19
20 return ena_tc;
21}
22
23
24
25
26
27
28
29
30bool ice_is_pfc_causing_hung_q(struct ice_pf *pf, unsigned int txqueue)
31{
32 u8 num_tcs = 0, i, tc, up_mapped_tc, up_in_tc = 0;
33 u64 ref_prio_xoff[ICE_MAX_UP];
34 struct ice_vsi *vsi;
35 u32 up2tc;
36
37 vsi = ice_get_main_vsi(pf);
38 if (!vsi)
39 return false;
40
41 ice_for_each_traffic_class(i)
42 if (vsi->tc_cfg.ena_tc & BIT(i))
43 num_tcs++;
44
45
46 for (tc = 0; tc < num_tcs - 1; tc++)
47 if (ice_find_q_in_range(vsi->tc_cfg.tc_info[tc].qoffset,
48 vsi->tc_cfg.tc_info[tc + 1].qoffset,
49 txqueue))
50 break;
51
52
53
54
55 up2tc = rd32(&pf->hw, PRTDCB_TUP2TC);
56 for (i = 0; i < ICE_MAX_UP; i++) {
57 up_mapped_tc = (up2tc >> (i * 3)) & 0x7;
58 if (up_mapped_tc == tc)
59 up_in_tc |= BIT(i);
60 }
61
62
63
64
65
66
67 for (i = 0; i < ICE_MAX_UP; i++)
68 if (up_in_tc & BIT(i))
69 ref_prio_xoff[i] = pf->stats.priority_xoff_rx[i];
70
71 ice_update_dcb_stats(pf);
72
73 for (i = 0; i < ICE_MAX_UP; i++)
74 if (up_in_tc & BIT(i))
75 if (pf->stats.priority_xoff_rx[i] > ref_prio_xoff[i])
76 return true;
77
78 return false;
79}
80
81
82
83
84
85
86static u8 ice_dcb_get_mode(struct ice_port_info *port_info, bool host)
87{
88 u8 mode;
89
90 if (host)
91 mode = DCB_CAP_DCBX_HOST;
92 else
93 mode = DCB_CAP_DCBX_LLD_MANAGED;
94
95 if (port_info->qos_cfg.local_dcbx_cfg.dcbx_mode & ICE_DCBX_MODE_CEE)
96 return mode | DCB_CAP_DCBX_VER_CEE;
97 else
98 return mode | DCB_CAP_DCBX_VER_IEEE;
99}
100
101
102
103
104
105u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg)
106{
107 bool tc_unused = false;
108 u8 num_tc = 0;
109 u8 ret = 0;
110 int i;
111
112
113
114
115 for (i = 0; i < CEE_DCBX_MAX_PRIO; i++)
116 num_tc |= BIT(dcbcfg->etscfg.prio_table[i]);
117
118
119 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
120 if (num_tc & BIT(i)) {
121 if (!tc_unused) {
122 ret++;
123 } else {
124 pr_err("Non-contiguous TCs - Disabling DCB\n");
125 return 1;
126 }
127 } else {
128 tc_unused = true;
129 }
130 }
131
132
133 if (!ret)
134 ret = 1;
135
136 return ret;
137}
138
139
140
141
142
143
144
145
146
147
148static u8 ice_get_first_droptc(struct ice_vsi *vsi)
149{
150 struct ice_dcbx_cfg *cfg = &vsi->port_info->qos_cfg.local_dcbx_cfg;
151 struct device *dev = ice_pf_to_dev(vsi->back);
152 u8 num_tc, ena_tc_map, pfc_ena_map;
153 u8 i;
154
155 num_tc = ice_dcb_get_num_tc(cfg);
156
157
158 ena_tc_map = ice_dcb_get_ena_tc(cfg);
159
160
161 pfc_ena_map = cfg->pfc.pfcena;
162
163
164 for (i = 0; i < num_tc; i++) {
165 if ((ena_tc_map & BIT(i)) && (!(pfc_ena_map & BIT(i)))) {
166 dev_dbg(dev, "first drop tc = %d\n", i);
167 return i;
168 }
169 }
170
171 dev_dbg(dev, "first drop tc = 0\n");
172 return 0;
173}
174
175
176
177
178
179void ice_vsi_set_dcb_tc_cfg(struct ice_vsi *vsi)
180{
181 struct ice_dcbx_cfg *cfg = &vsi->port_info->qos_cfg.local_dcbx_cfg;
182
183 switch (vsi->type) {
184 case ICE_VSI_PF:
185 vsi->tc_cfg.ena_tc = ice_dcb_get_ena_tc(cfg);
186 vsi->tc_cfg.numtc = ice_dcb_get_num_tc(cfg);
187 break;
188 case ICE_VSI_CHNL:
189 vsi->tc_cfg.ena_tc = BIT(ice_get_first_droptc(vsi));
190 vsi->tc_cfg.numtc = 1;
191 break;
192 case ICE_VSI_CTRL:
193 case ICE_VSI_LB:
194 default:
195 vsi->tc_cfg.ena_tc = ICE_DFLT_TRAFFIC_CLASS;
196 vsi->tc_cfg.numtc = 1;
197 }
198}
199
200
201
202
203
204
205u8 ice_dcb_get_tc(struct ice_vsi *vsi, int queue_index)
206{
207 return vsi->tx_rings[queue_index]->dcb_tc;
208}
209
210
211
212
213
214void ice_vsi_cfg_dcb_rings(struct ice_vsi *vsi)
215{
216 struct ice_tx_ring *tx_ring;
217 struct ice_rx_ring *rx_ring;
218 u16 qoffset, qcount;
219 int i, n;
220
221 if (!test_bit(ICE_FLAG_DCB_ENA, vsi->back->flags)) {
222
223 ice_for_each_txq(vsi, i) {
224 tx_ring = vsi->tx_rings[i];
225 tx_ring->dcb_tc = 0;
226 }
227 ice_for_each_rxq(vsi, i) {
228 rx_ring = vsi->rx_rings[i];
229 rx_ring->dcb_tc = 0;
230 }
231 return;
232 }
233
234 ice_for_each_traffic_class(n) {
235 if (!(vsi->tc_cfg.ena_tc & BIT(n)))
236 break;
237
238 qoffset = vsi->tc_cfg.tc_info[n].qoffset;
239 qcount = vsi->tc_cfg.tc_info[n].qcount_tx;
240 for (i = qoffset; i < (qoffset + qcount); i++)
241 vsi->tx_rings[i]->dcb_tc = n;
242
243 qcount = vsi->tc_cfg.tc_info[n].qcount_rx;
244 for (i = qoffset; i < (qoffset + qcount); i++)
245 vsi->rx_rings[i]->dcb_tc = n;
246 }
247
248
249
250 if (vsi->all_enatc) {
251 u8 first_droptc = ice_get_first_droptc(vsi);
252
253
254
255
256 ice_for_each_chnl_tc(n) {
257 if (!(vsi->all_enatc & BIT(n)))
258 break;
259
260 qoffset = vsi->mqprio_qopt.qopt.offset[n];
261 qcount = vsi->mqprio_qopt.qopt.count[n];
262 for (i = qoffset; i < (qoffset + qcount); i++) {
263 vsi->tx_rings[i]->dcb_tc = first_droptc;
264 vsi->rx_rings[i]->dcb_tc = first_droptc;
265 }
266 }
267 }
268}
269
270
271
272
273
274
275
276
277
278
279
280
281static void ice_dcb_ena_dis_vsi(struct ice_pf *pf, bool ena, bool locked)
282{
283 int i;
284
285 ice_for_each_vsi(pf, i) {
286 struct ice_vsi *vsi = pf->vsi[i];
287
288 if (!vsi)
289 continue;
290
291 switch (vsi->type) {
292 case ICE_VSI_CHNL:
293 case ICE_VSI_SWITCHDEV_CTRL:
294 case ICE_VSI_PF:
295 if (ena)
296 ice_ena_vsi(vsi, locked);
297 else
298 ice_dis_vsi(vsi, locked);
299 break;
300 default:
301 continue;
302 }
303 }
304}
305
306
307
308
309
310
311int ice_dcb_bwchk(struct ice_pf *pf, struct ice_dcbx_cfg *dcbcfg)
312{
313 struct ice_dcb_ets_cfg *etscfg = &dcbcfg->etscfg;
314 u8 num_tc, total_bw = 0;
315 int i;
316
317
318
319
320 num_tc = ice_dcb_get_num_tc(dcbcfg);
321
322
323
324
325 if (num_tc == 1) {
326 etscfg->tcbwtable[0] = ICE_TC_MAX_BW;
327 return 0;
328 }
329
330 for (i = 0; i < num_tc; i++)
331 total_bw += etscfg->tcbwtable[i];
332
333 if (!total_bw) {
334 etscfg->tcbwtable[0] = ICE_TC_MAX_BW;
335 } else if (total_bw != ICE_TC_MAX_BW) {
336 dev_err(ice_pf_to_dev(pf), "Invalid config, total bandwidth must equal 100\n");
337 return -EINVAL;
338 }
339
340 return 0;
341}
342
343
344
345
346
347
348
349int ice_pf_dcb_cfg(struct ice_pf *pf, struct ice_dcbx_cfg *new_cfg, bool locked)
350{
351 struct ice_aqc_port_ets_elem buf = { 0 };
352 struct ice_dcbx_cfg *old_cfg, *curr_cfg;
353 struct device *dev = ice_pf_to_dev(pf);
354 int ret = ICE_DCB_NO_HW_CHG;
355 struct iidc_event *event;
356 struct ice_vsi *pf_vsi;
357
358 curr_cfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg;
359
360
361 if (!pf->hw.port_info->qos_cfg.is_sw_lldp)
362 ret = ICE_DCB_HW_CHG_RST;
363
364
365 if (ice_dcb_get_num_tc(new_cfg) > 1) {
366 dev_dbg(dev, "DCB tagging enabled (num TC > 1)\n");
367 set_bit(ICE_FLAG_DCB_ENA, pf->flags);
368 } else {
369 dev_dbg(dev, "DCB tagging disabled (num TC = 1)\n");
370 clear_bit(ICE_FLAG_DCB_ENA, pf->flags);
371 }
372
373 if (!memcmp(new_cfg, curr_cfg, sizeof(*new_cfg))) {
374 dev_dbg(dev, "No change in DCB config required\n");
375 return ret;
376 }
377
378 if (ice_dcb_bwchk(pf, new_cfg))
379 return -EINVAL;
380
381
382 old_cfg = kmemdup(curr_cfg, sizeof(*old_cfg), GFP_KERNEL);
383 if (!old_cfg)
384 return -ENOMEM;
385
386 dev_info(dev, "Commit DCB Configuration to the hardware\n");
387 pf_vsi = ice_get_main_vsi(pf);
388 if (!pf_vsi) {
389 dev_dbg(dev, "PF VSI doesn't exist\n");
390 ret = -EINVAL;
391 goto free_cfg;
392 }
393
394
395 event = kzalloc(sizeof(*event), GFP_KERNEL);
396 if (!event) {
397 ret = -ENOMEM;
398 goto free_cfg;
399 }
400
401 set_bit(IIDC_EVENT_BEFORE_TC_CHANGE, event->type);
402 ice_send_event_to_aux(pf, event);
403 kfree(event);
404
405
406
407
408 if (!locked)
409 rtnl_lock();
410
411
412 ice_dcb_ena_dis_vsi(pf, false, true);
413
414 memcpy(curr_cfg, new_cfg, sizeof(*curr_cfg));
415 memcpy(&curr_cfg->etsrec, &curr_cfg->etscfg, sizeof(curr_cfg->etsrec));
416 memcpy(&new_cfg->etsrec, &curr_cfg->etscfg, sizeof(curr_cfg->etsrec));
417
418
419
420
421 if (pf->hw.port_info->qos_cfg.is_sw_lldp) {
422 ret = ice_set_dcb_cfg(pf->hw.port_info);
423 if (ret) {
424 dev_err(dev, "Set DCB Config failed\n");
425
426 memcpy(curr_cfg, old_cfg, sizeof(*curr_cfg));
427 goto out;
428 }
429 }
430
431 ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
432 if (ret) {
433 dev_err(dev, "Query Port ETS failed\n");
434 goto out;
435 }
436
437 ice_pf_dcb_recfg(pf);
438
439out:
440
441 ice_dcb_ena_dis_vsi(pf, true, true);
442 if (!locked)
443 rtnl_unlock();
444free_cfg:
445 kfree(old_cfg);
446 return ret;
447}
448
449
450
451
452
453static void ice_cfg_etsrec_defaults(struct ice_port_info *pi)
454{
455 struct ice_dcbx_cfg *dcbcfg = &pi->qos_cfg.local_dcbx_cfg;
456 u8 i;
457
458
459 if (dcbcfg->etsrec.maxtcs)
460 return;
461
462
463 dcbcfg->etsrec.maxtcs = 1;
464 for (i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) {
465 dcbcfg->etsrec.tcbwtable[i] = i ? 0 : 100;
466 dcbcfg->etsrec.tsatable[i] = i ? ICE_IEEE_TSA_STRICT :
467 ICE_IEEE_TSA_ETS;
468 }
469}
470
471
472
473
474
475
476
477static bool
478ice_dcb_need_recfg(struct ice_pf *pf, struct ice_dcbx_cfg *old_cfg,
479 struct ice_dcbx_cfg *new_cfg)
480{
481 struct device *dev = ice_pf_to_dev(pf);
482 bool need_reconfig = false;
483
484
485 if (memcmp(&new_cfg->etscfg, &old_cfg->etscfg,
486 sizeof(new_cfg->etscfg))) {
487
488 if (memcmp(&new_cfg->etscfg.prio_table,
489 &old_cfg->etscfg.prio_table,
490 sizeof(new_cfg->etscfg.prio_table))) {
491 need_reconfig = true;
492 dev_dbg(dev, "ETS UP2TC changed.\n");
493 }
494
495 if (memcmp(&new_cfg->etscfg.tcbwtable,
496 &old_cfg->etscfg.tcbwtable,
497 sizeof(new_cfg->etscfg.tcbwtable)))
498 dev_dbg(dev, "ETS TC BW Table changed.\n");
499
500 if (memcmp(&new_cfg->etscfg.tsatable,
501 &old_cfg->etscfg.tsatable,
502 sizeof(new_cfg->etscfg.tsatable)))
503 dev_dbg(dev, "ETS TSA Table changed.\n");
504 }
505
506
507 if (memcmp(&new_cfg->pfc, &old_cfg->pfc, sizeof(new_cfg->pfc))) {
508 need_reconfig = true;
509 dev_dbg(dev, "PFC config change detected.\n");
510 }
511
512
513 if (memcmp(&new_cfg->app, &old_cfg->app, sizeof(new_cfg->app))) {
514 need_reconfig = true;
515 dev_dbg(dev, "APP Table change detected.\n");
516 }
517
518 dev_dbg(dev, "dcb need_reconfig=%d\n", need_reconfig);
519 return need_reconfig;
520}
521
522
523
524
525
526void ice_dcb_rebuild(struct ice_pf *pf)
527{
528 struct ice_aqc_port_ets_elem buf = { 0 };
529 struct device *dev = ice_pf_to_dev(pf);
530 struct ice_dcbx_cfg *err_cfg;
531 int ret;
532
533 ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
534 if (ret) {
535 dev_err(dev, "Query Port ETS failed\n");
536 goto dcb_error;
537 }
538
539 mutex_lock(&pf->tc_mutex);
540
541 if (!pf->hw.port_info->qos_cfg.is_sw_lldp)
542 ice_cfg_etsrec_defaults(pf->hw.port_info);
543
544 ret = ice_set_dcb_cfg(pf->hw.port_info);
545 if (ret) {
546 dev_err(dev, "Failed to set DCB config in rebuild\n");
547 goto dcb_error;
548 }
549
550 if (!pf->hw.port_info->qos_cfg.is_sw_lldp) {
551 ret = ice_cfg_lldp_mib_change(&pf->hw, true);
552 if (ret && !pf->hw.port_info->qos_cfg.is_sw_lldp) {
553 dev_err(dev, "Failed to register for MIB changes\n");
554 goto dcb_error;
555 }
556 }
557
558 dev_info(dev, "DCB info restored\n");
559 ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
560 if (ret) {
561 dev_err(dev, "Query Port ETS failed\n");
562 goto dcb_error;
563 }
564
565 mutex_unlock(&pf->tc_mutex);
566
567 return;
568
569dcb_error:
570 dev_err(dev, "Disabling DCB until new settings occur\n");
571 err_cfg = kzalloc(sizeof(*err_cfg), GFP_KERNEL);
572 if (!err_cfg) {
573 mutex_unlock(&pf->tc_mutex);
574 return;
575 }
576
577 err_cfg->etscfg.willing = true;
578 err_cfg->etscfg.tcbwtable[0] = ICE_TC_MAX_BW;
579 err_cfg->etscfg.tsatable[0] = ICE_IEEE_TSA_ETS;
580 memcpy(&err_cfg->etsrec, &err_cfg->etscfg, sizeof(err_cfg->etsrec));
581
582
583
584
585
586
587 ice_pf_dcb_cfg(pf, err_cfg, false);
588 kfree(err_cfg);
589
590 mutex_unlock(&pf->tc_mutex);
591}
592
593
594
595
596
597
598static int ice_dcb_init_cfg(struct ice_pf *pf, bool locked)
599{
600 struct ice_dcbx_cfg *newcfg;
601 struct ice_port_info *pi;
602 int ret = 0;
603
604 pi = pf->hw.port_info;
605 newcfg = kmemdup(&pi->qos_cfg.local_dcbx_cfg, sizeof(*newcfg),
606 GFP_KERNEL);
607 if (!newcfg)
608 return -ENOMEM;
609
610 memset(&pi->qos_cfg.local_dcbx_cfg, 0, sizeof(*newcfg));
611
612 dev_info(ice_pf_to_dev(pf), "Configuring initial DCB values\n");
613 if (ice_pf_dcb_cfg(pf, newcfg, locked))
614 ret = -EINVAL;
615
616 kfree(newcfg);
617
618 return ret;
619}
620
621
622
623
624
625
626
627int ice_dcb_sw_dflt_cfg(struct ice_pf *pf, bool ets_willing, bool locked)
628{
629 struct ice_aqc_port_ets_elem buf = { 0 };
630 struct ice_dcbx_cfg *dcbcfg;
631 struct ice_port_info *pi;
632 struct ice_hw *hw;
633 int ret;
634
635 hw = &pf->hw;
636 pi = hw->port_info;
637 dcbcfg = kzalloc(sizeof(*dcbcfg), GFP_KERNEL);
638 if (!dcbcfg)
639 return -ENOMEM;
640
641 memset(&pi->qos_cfg.local_dcbx_cfg, 0, sizeof(*dcbcfg));
642
643 dcbcfg->etscfg.willing = ets_willing ? 1 : 0;
644 dcbcfg->etscfg.maxtcs = hw->func_caps.common_cap.maxtc;
645 dcbcfg->etscfg.tcbwtable[0] = 100;
646 dcbcfg->etscfg.tsatable[0] = ICE_IEEE_TSA_ETS;
647
648 memcpy(&dcbcfg->etsrec, &dcbcfg->etscfg,
649 sizeof(dcbcfg->etsrec));
650 dcbcfg->etsrec.willing = 0;
651
652 dcbcfg->pfc.willing = 1;
653 dcbcfg->pfc.pfccap = hw->func_caps.common_cap.maxtc;
654
655 dcbcfg->numapps = 1;
656 dcbcfg->app[0].selector = ICE_APP_SEL_ETHTYPE;
657 dcbcfg->app[0].priority = 3;
658 dcbcfg->app[0].prot_id = ETH_P_FCOE;
659
660 ret = ice_pf_dcb_cfg(pf, dcbcfg, locked);
661 kfree(dcbcfg);
662 if (ret)
663 return ret;
664
665 return ice_query_port_ets(pi, &buf, sizeof(buf), NULL);
666}
667
668
669
670
671
672
673
674static bool ice_dcb_tc_contig(u8 *prio_table)
675{
676 bool found_empty = false;
677 u8 used_tc = 0;
678 int i;
679
680
681 for (i = 0; i < CEE_DCBX_MAX_PRIO; i++)
682 used_tc |= BIT(prio_table[i]);
683
684 for (i = 0; i < CEE_DCBX_MAX_PRIO; i++) {
685 if (used_tc & BIT(i)) {
686 if (found_empty)
687 return false;
688 } else {
689 found_empty = true;
690 }
691 }
692
693 return true;
694}
695
696
697
698
699
700
701
702static int ice_dcb_noncontig_cfg(struct ice_pf *pf)
703{
704 struct ice_dcbx_cfg *dcbcfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg;
705 struct device *dev = ice_pf_to_dev(pf);
706 int ret;
707
708
709 ret = ice_dcb_sw_dflt_cfg(pf, false, true);
710 if (ret) {
711 dev_err(dev, "Failed to set local DCB config %d\n", ret);
712 return ret;
713 }
714
715
716 dcbcfg->etscfg.willing = 1;
717 ret = ice_set_dcb_cfg(pf->hw.port_info);
718 if (ret)
719 dev_err(dev, "Failed to set DCB to unwilling\n");
720
721 return ret;
722}
723
724
725
726
727
728
729
730
731
732void ice_pf_dcb_recfg(struct ice_pf *pf)
733{
734 struct ice_dcbx_cfg *dcbcfg = &pf->hw.port_info->qos_cfg.local_dcbx_cfg;
735 struct iidc_event *event;
736 u8 tc_map = 0;
737 int v, ret;
738
739
740 ice_for_each_vsi(pf, v) {
741 struct ice_vsi *vsi = pf->vsi[v];
742
743 if (!vsi)
744 continue;
745
746 if (vsi->type == ICE_VSI_PF) {
747 tc_map = ice_dcb_get_ena_tc(dcbcfg);
748
749
750
751
752 if (!ice_dcb_tc_contig(dcbcfg->etscfg.prio_table)) {
753 tc_map = ICE_DFLT_TRAFFIC_CLASS;
754 ice_dcb_noncontig_cfg(pf);
755 }
756 } else if (vsi->type == ICE_VSI_CHNL) {
757 tc_map = BIT(ice_get_first_droptc(vsi));
758 } else {
759 tc_map = ICE_DFLT_TRAFFIC_CLASS;
760 }
761
762 ret = ice_vsi_cfg_tc(vsi, tc_map);
763 if (ret) {
764 dev_err(ice_pf_to_dev(pf), "Failed to config TC for VSI index: %d\n",
765 vsi->idx);
766 continue;
767 }
768
769
770
771 if (vsi->type == ICE_VSI_CHNL ||
772 vsi->type == ICE_VSI_SWITCHDEV_CTRL)
773 continue;
774
775 ice_vsi_map_rings_to_vectors(vsi);
776 if (vsi->type == ICE_VSI_PF)
777 ice_dcbnl_set_all(vsi);
778 }
779
780 event = kzalloc(sizeof(*event), GFP_KERNEL);
781 if (!event)
782 return;
783
784 set_bit(IIDC_EVENT_AFTER_TC_CHANGE, event->type);
785 ice_send_event_to_aux(pf, event);
786 kfree(event);
787}
788
789
790
791
792
793
794int ice_init_pf_dcb(struct ice_pf *pf, bool locked)
795{
796 struct device *dev = ice_pf_to_dev(pf);
797 struct ice_port_info *port_info;
798 struct ice_hw *hw = &pf->hw;
799 int err;
800
801 port_info = hw->port_info;
802
803 err = ice_init_dcb(hw, false);
804 if (err && !port_info->qos_cfg.is_sw_lldp) {
805 dev_err(dev, "Error initializing DCB %d\n", err);
806 goto dcb_init_err;
807 }
808
809 dev_info(dev, "DCB is enabled in the hardware, max number of TCs supported on this port are %d\n",
810 pf->hw.func_caps.common_cap.maxtc);
811 if (err) {
812 struct ice_vsi *pf_vsi;
813
814
815 dev_info(dev, "FW LLDP is disabled, DCBx/LLDP in SW mode.\n");
816 clear_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags);
817 err = ice_aq_set_pfc_mode(&pf->hw, ICE_AQC_PFC_VLAN_BASED_PFC,
818 NULL);
819 if (err)
820 dev_info(dev, "Failed to set VLAN PFC mode\n");
821
822 err = ice_dcb_sw_dflt_cfg(pf, true, locked);
823 if (err) {
824 dev_err(dev, "Failed to set local DCB config %d\n",
825 err);
826 err = -EIO;
827 goto dcb_init_err;
828 }
829
830
831
832
833 pf_vsi = ice_get_main_vsi(pf);
834 if (!pf_vsi) {
835 dev_err(dev, "Failed to set local DCB config\n");
836 err = -EIO;
837 goto dcb_init_err;
838 }
839
840 ice_cfg_sw_lldp(pf_vsi, false, true);
841
842 pf->dcbx_cap = ice_dcb_get_mode(port_info, true);
843 return 0;
844 }
845
846 set_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags);
847
848
849 pf->dcbx_cap = ice_dcb_get_mode(port_info, false);
850
851 err = ice_dcb_init_cfg(pf, locked);
852 if (err)
853 goto dcb_init_err;
854
855 return err;
856
857dcb_init_err:
858 dev_err(dev, "DCB init failed\n");
859 return err;
860}
861
862
863
864
865
866void ice_update_dcb_stats(struct ice_pf *pf)
867{
868 struct ice_hw_port_stats *prev_ps, *cur_ps;
869 struct ice_hw *hw = &pf->hw;
870 u8 port;
871 int i;
872
873 port = hw->port_info->lport;
874 prev_ps = &pf->stats_prev;
875 cur_ps = &pf->stats;
876
877 for (i = 0; i < 8; i++) {
878 ice_stat_update32(hw, GLPRT_PXOFFRXC(port, i),
879 pf->stat_prev_loaded,
880 &prev_ps->priority_xoff_rx[i],
881 &cur_ps->priority_xoff_rx[i]);
882 ice_stat_update32(hw, GLPRT_PXONRXC(port, i),
883 pf->stat_prev_loaded,
884 &prev_ps->priority_xon_rx[i],
885 &cur_ps->priority_xon_rx[i]);
886 ice_stat_update32(hw, GLPRT_PXONTXC(port, i),
887 pf->stat_prev_loaded,
888 &prev_ps->priority_xon_tx[i],
889 &cur_ps->priority_xon_tx[i]);
890 ice_stat_update32(hw, GLPRT_PXOFFTXC(port, i),
891 pf->stat_prev_loaded,
892 &prev_ps->priority_xoff_tx[i],
893 &cur_ps->priority_xoff_tx[i]);
894 ice_stat_update32(hw, GLPRT_RXON2OFFCNT(port, i),
895 pf->stat_prev_loaded,
896 &prev_ps->priority_xon_2_xoff[i],
897 &cur_ps->priority_xon_2_xoff[i]);
898 }
899}
900
901
902
903
904
905
906
907
908
909void
910ice_tx_prepare_vlan_flags_dcb(struct ice_tx_ring *tx_ring,
911 struct ice_tx_buf *first)
912{
913 struct sk_buff *skb = first->skb;
914
915 if (!test_bit(ICE_FLAG_DCB_ENA, tx_ring->vsi->back->flags))
916 return;
917
918
919 if ((first->tx_flags & ICE_TX_FLAGS_HW_VLAN ||
920 first->tx_flags & ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN) ||
921 skb->priority != TC_PRIO_CONTROL) {
922 first->tx_flags &= ~ICE_TX_FLAGS_VLAN_PR_M;
923
924 first->tx_flags |= (skb->priority & 0x7) <<
925 ICE_TX_FLAGS_VLAN_PR_S;
926
927
928
929 if (tx_ring->flags & ICE_TX_FLAGS_RING_VLAN_L2TAG2)
930 first->tx_flags |= ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN;
931 else
932 first->tx_flags |= ICE_TX_FLAGS_HW_VLAN;
933 }
934}
935
936
937
938
939
940
941void
942ice_dcb_process_lldp_set_mib_change(struct ice_pf *pf,
943 struct ice_rq_event_info *event)
944{
945 struct ice_aqc_port_ets_elem buf = { 0 };
946 struct device *dev = ice_pf_to_dev(pf);
947 struct ice_aqc_lldp_get_mib *mib;
948 struct ice_dcbx_cfg tmp_dcbx_cfg;
949 bool need_reconfig = false;
950 struct ice_port_info *pi;
951 u8 mib_type;
952 int ret;
953
954
955 if (!(test_bit(ICE_FLAG_DCB_CAPABLE, pf->flags)))
956 return;
957
958 if (pf->dcbx_cap & DCB_CAP_DCBX_HOST) {
959 dev_dbg(dev, "MIB Change Event in HOST mode\n");
960 return;
961 }
962
963 pi = pf->hw.port_info;
964 mib = (struct ice_aqc_lldp_get_mib *)&event->desc.params.raw;
965
966 mib_type = ((mib->type >> ICE_AQ_LLDP_BRID_TYPE_S) &
967 ICE_AQ_LLDP_BRID_TYPE_M);
968 dev_dbg(dev, "LLDP event MIB bridge type 0x%x\n", mib_type);
969 if (mib_type != ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID)
970 return;
971
972
973 mib_type = mib->type & ICE_AQ_LLDP_MIB_TYPE_M;
974 dev_dbg(dev, "LLDP event mib type %s\n", mib_type ? "remote" : "local");
975 if (mib_type == ICE_AQ_LLDP_MIB_REMOTE) {
976
977 ret = ice_aq_get_dcb_cfg(pi->hw, ICE_AQ_LLDP_MIB_REMOTE,
978 ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID,
979 &pi->qos_cfg.remote_dcbx_cfg);
980 if (ret) {
981 dev_err(dev, "Failed to get remote DCB config\n");
982 return;
983 }
984 }
985
986 mutex_lock(&pf->tc_mutex);
987
988
989 tmp_dcbx_cfg = pf->hw.port_info->qos_cfg.local_dcbx_cfg;
990
991
992 memset(&pi->qos_cfg.local_dcbx_cfg, 0,
993 sizeof(pi->qos_cfg.local_dcbx_cfg));
994
995
996 ret = ice_get_dcb_cfg(pf->hw.port_info);
997 if (ret) {
998 dev_err(dev, "Failed to get DCB config\n");
999 goto out;
1000 }
1001
1002
1003 if (!memcmp(&tmp_dcbx_cfg, &pi->qos_cfg.local_dcbx_cfg,
1004 sizeof(tmp_dcbx_cfg))) {
1005 dev_dbg(dev, "No change detected in DCBX configuration.\n");
1006 goto out;
1007 }
1008
1009 pf->dcbx_cap = ice_dcb_get_mode(pi, false);
1010
1011 need_reconfig = ice_dcb_need_recfg(pf, &tmp_dcbx_cfg,
1012 &pi->qos_cfg.local_dcbx_cfg);
1013 ice_dcbnl_flush_apps(pf, &tmp_dcbx_cfg, &pi->qos_cfg.local_dcbx_cfg);
1014 if (!need_reconfig)
1015 goto out;
1016
1017
1018 if (ice_dcb_get_num_tc(&pi->qos_cfg.local_dcbx_cfg) > 1) {
1019 dev_dbg(dev, "DCB tagging enabled (num TC > 1)\n");
1020 set_bit(ICE_FLAG_DCB_ENA, pf->flags);
1021 } else {
1022 dev_dbg(dev, "DCB tagging disabled (num TC = 1)\n");
1023 clear_bit(ICE_FLAG_DCB_ENA, pf->flags);
1024 }
1025
1026 rtnl_lock();
1027
1028 ice_dcb_ena_dis_vsi(pf, false, true);
1029
1030 ret = ice_query_port_ets(pf->hw.port_info, &buf, sizeof(buf), NULL);
1031 if (ret) {
1032 dev_err(dev, "Query Port ETS failed\n");
1033 goto unlock_rtnl;
1034 }
1035
1036
1037 ice_pf_dcb_recfg(pf);
1038
1039
1040 ice_dcb_ena_dis_vsi(pf, true, true);
1041unlock_rtnl:
1042 rtnl_unlock();
1043out:
1044 mutex_unlock(&pf->tc_mutex);
1045}
1046