| .. | .. |
|---|
| 524 | 524 | netif_dbg(pdata, drv, pdata->netdev, "VXLAN acceleration disabled\n"); |
|---|
| 525 | 525 | } |
|---|
| 526 | 526 | |
|---|
| 527 | +static unsigned int xgbe_get_fc_queue_count(struct xgbe_prv_data *pdata) |
|---|
| 528 | +{ |
|---|
| 529 | + unsigned int max_q_count = XGMAC_MAX_FLOW_CONTROL_QUEUES; |
|---|
| 530 | + |
|---|
| 531 | + /* From MAC ver 30H the TFCR is per priority, instead of per queue */ |
|---|
| 532 | + if (XGMAC_GET_BITS(pdata->hw_feat.version, MAC_VR, SNPSVER) >= 0x30) |
|---|
| 533 | + return max_q_count; |
|---|
| 534 | + else |
|---|
| 535 | + return min_t(unsigned int, pdata->tx_q_count, max_q_count); |
|---|
| 536 | +} |
|---|
| 537 | + |
|---|
| 527 | 538 | static int xgbe_disable_tx_flow_control(struct xgbe_prv_data *pdata) |
|---|
| 528 | 539 | { |
|---|
| 529 | | - unsigned int max_q_count, q_count; |
|---|
| 530 | 540 | unsigned int reg, reg_val; |
|---|
| 531 | | - unsigned int i; |
|---|
| 541 | + unsigned int i, q_count; |
|---|
| 532 | 542 | |
|---|
| 533 | 543 | /* Clear MTL flow control */ |
|---|
| 534 | 544 | for (i = 0; i < pdata->rx_q_count; i++) |
|---|
| 535 | 545 | XGMAC_MTL_IOWRITE_BITS(pdata, i, MTL_Q_RQOMR, EHFC, 0); |
|---|
| 536 | 546 | |
|---|
| 537 | 547 | /* Clear MAC flow control */ |
|---|
| 538 | | - max_q_count = XGMAC_MAX_FLOW_CONTROL_QUEUES; |
|---|
| 539 | | - q_count = min_t(unsigned int, pdata->tx_q_count, max_q_count); |
|---|
| 548 | + q_count = xgbe_get_fc_queue_count(pdata); |
|---|
| 540 | 549 | reg = MAC_Q0TFCR; |
|---|
| 541 | 550 | for (i = 0; i < q_count; i++) { |
|---|
| 542 | 551 | reg_val = XGMAC_IOREAD(pdata, reg); |
|---|
| .. | .. |
|---|
| 553 | 562 | { |
|---|
| 554 | 563 | struct ieee_pfc *pfc = pdata->pfc; |
|---|
| 555 | 564 | struct ieee_ets *ets = pdata->ets; |
|---|
| 556 | | - unsigned int max_q_count, q_count; |
|---|
| 557 | 565 | unsigned int reg, reg_val; |
|---|
| 558 | | - unsigned int i; |
|---|
| 566 | + unsigned int i, q_count; |
|---|
| 559 | 567 | |
|---|
| 560 | 568 | /* Set MTL flow control */ |
|---|
| 561 | 569 | for (i = 0; i < pdata->rx_q_count; i++) { |
|---|
| .. | .. |
|---|
| 579 | 587 | } |
|---|
| 580 | 588 | |
|---|
| 581 | 589 | /* Set MAC flow control */ |
|---|
| 582 | | - max_q_count = XGMAC_MAX_FLOW_CONTROL_QUEUES; |
|---|
| 583 | | - q_count = min_t(unsigned int, pdata->tx_q_count, max_q_count); |
|---|
| 590 | + q_count = xgbe_get_fc_queue_count(pdata); |
|---|
| 584 | 591 | reg = MAC_Q0TFCR; |
|---|
| 585 | 592 | for (i = 0; i < q_count; i++) { |
|---|
| 586 | 593 | reg_val = XGMAC_IOREAD(pdata, reg); |
|---|