aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLisheng <lisheng011@huawei.com>2016-03-28 06:40:56 -0400
committerDavid S. Miller <davem@davemloft.net>2016-03-28 11:39:16 -0400
commit43adc067c5a070a5ef97d0c25e33df19c4481484 (patch)
tree3a0dcf290af9e6ac14335de368cf6bf68241a679
parentac71b46efd2838c02ec193987c8f61c3ba33b495 (diff)
net: hns: fixed the setting and getting overtime bug
The overtime setting and getting REGs in HNS V2 is defferent from HNS V1. It needs to be distinguished between them if getting or setting the REGs. Signed-off-by: Lisheng <lisheng011@huawei.com> Signed-off-by: Yisen Zhuang <Yisen.Zhuang@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c60
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c196
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h23
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h1
4 files changed, 126 insertions, 154 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index 285c893ab135..1dd1d6974d47 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -159,11 +159,6 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
159 ae_handle->qs[i]->tx_ring.q = ae_handle->qs[i]; 159 ae_handle->qs[i]->tx_ring.q = ae_handle->qs[i];
160 160
161 ring_pair_cb->used_by_vf = 1; 161 ring_pair_cb->used_by_vf = 1;
162 if (port_idx < DSAF_SERVICE_PORT_NUM_PER_DSAF)
163 ring_pair_cb->port_id_in_dsa = port_idx;
164 else
165 ring_pair_cb->port_id_in_dsa = 0;
166
167 ring_pair_cb++; 162 ring_pair_cb++;
168 } 163 }
169 164
@@ -453,59 +448,46 @@ static int hns_ae_set_pauseparam(struct hnae_handle *handle,
453static void hns_ae_get_coalesce_usecs(struct hnae_handle *handle, 448static void hns_ae_get_coalesce_usecs(struct hnae_handle *handle,
454 u32 *tx_usecs, u32 *rx_usecs) 449 u32 *tx_usecs, u32 *rx_usecs)
455{ 450{
456 int port; 451 struct ring_pair_cb *ring_pair =
457 452 container_of(handle->qs[0], struct ring_pair_cb, q);
458 port = hns_ae_map_eport_to_dport(handle->eport_id);
459 453
460 *tx_usecs = hns_rcb_get_coalesce_usecs( 454 *tx_usecs = hns_rcb_get_coalesce_usecs(ring_pair->rcb_common,
461 hns_ae_get_dsaf_dev(handle->dev), 455 ring_pair->port_id_in_comm);
462 hns_dsaf_get_comm_idx_by_port(port)); 456 *rx_usecs = hns_rcb_get_coalesce_usecs(ring_pair->rcb_common,
463 *rx_usecs = hns_rcb_get_coalesce_usecs( 457 ring_pair->port_id_in_comm);
464 hns_ae_get_dsaf_dev(handle->dev),
465 hns_dsaf_get_comm_idx_by_port(port));
466} 458}
467 459
468static void hns_ae_get_rx_max_coalesced_frames(struct hnae_handle *handle, 460static void hns_ae_get_rx_max_coalesced_frames(struct hnae_handle *handle,
469 u32 *tx_frames, u32 *rx_frames) 461 u32 *tx_frames, u32 *rx_frames)
470{ 462{
471 int port; 463 struct ring_pair_cb *ring_pair =
464 container_of(handle->qs[0], struct ring_pair_cb, q);
472 465
473 assert(handle); 466 *tx_frames = hns_rcb_get_coalesced_frames(ring_pair->rcb_common,
474 467 ring_pair->port_id_in_comm);
475 port = hns_ae_map_eport_to_dport(handle->eport_id); 468 *rx_frames = hns_rcb_get_coalesced_frames(ring_pair->rcb_common,
476 469 ring_pair->port_id_in_comm);
477 *tx_frames = hns_rcb_get_coalesced_frames(
478 hns_ae_get_dsaf_dev(handle->dev), port);
479 *rx_frames = hns_rcb_get_coalesced_frames(
480 hns_ae_get_dsaf_dev(handle->dev), port);
481} 470}
482 471
483static void hns_ae_set_coalesce_usecs(struct hnae_handle *handle, 472static void hns_ae_set_coalesce_usecs(struct hnae_handle *handle,
484 u32 timeout) 473 u32 timeout)
485{ 474{
486 int port; 475 struct ring_pair_cb *ring_pair =
476 container_of(handle->qs[0], struct ring_pair_cb, q);
487 477
488 assert(handle); 478 (void)hns_rcb_set_coalesce_usecs(
489 479 ring_pair->rcb_common, ring_pair->port_id_in_comm, timeout);
490 port = hns_ae_map_eport_to_dport(handle->eport_id);
491
492 hns_rcb_set_coalesce_usecs(hns_ae_get_dsaf_dev(handle->dev),
493 port, timeout);
494} 480}
495 481
496static int hns_ae_set_coalesce_frames(struct hnae_handle *handle, 482static int hns_ae_set_coalesce_frames(struct hnae_handle *handle,
497 u32 coalesce_frames) 483 u32 coalesce_frames)
498{ 484{
499 int port; 485 struct ring_pair_cb *ring_pair =
500 int ret; 486 container_of(handle->qs[0], struct ring_pair_cb, q);
501 487
502 assert(handle); 488 return hns_rcb_set_coalesced_frames(
503 489 ring_pair->rcb_common,
504 port = hns_ae_map_eport_to_dport(handle->eport_id); 490 ring_pair->port_id_in_comm, coalesce_frames);
505
506 ret = hns_rcb_set_coalesced_frames(hns_ae_get_dsaf_dev(handle->dev),
507 port, coalesce_frames);
508 return ret;
509} 491}
510 492
511void hns_ae_update_stats(struct hnae_handle *handle, 493void hns_ae_update_stats(struct hnae_handle *handle,
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
index 12188807468c..28ee26e5c478 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
@@ -215,9 +215,9 @@ static void hns_rcb_ring_init(struct ring_pair_cb *ring_pair, int ring_type)
215 dsaf_write_dev(q, RCB_RING_RX_RING_BD_LEN_REG, 215 dsaf_write_dev(q, RCB_RING_RX_RING_BD_LEN_REG,
216 bd_size_type); 216 bd_size_type);
217 dsaf_write_dev(q, RCB_RING_RX_RING_BD_NUM_REG, 217 dsaf_write_dev(q, RCB_RING_RX_RING_BD_NUM_REG,
218 ring_pair->port_id_in_dsa); 218 ring_pair->port_id_in_comm);
219 dsaf_write_dev(q, RCB_RING_RX_RING_PKTLINE_REG, 219 dsaf_write_dev(q, RCB_RING_RX_RING_PKTLINE_REG,
220 ring_pair->port_id_in_dsa); 220 ring_pair->port_id_in_comm);
221 } else { 221 } else {
222 dsaf_write_dev(q, RCB_RING_TX_RING_BASEADDR_L_REG, 222 dsaf_write_dev(q, RCB_RING_TX_RING_BASEADDR_L_REG,
223 (u32)dma); 223 (u32)dma);
@@ -227,9 +227,9 @@ static void hns_rcb_ring_init(struct ring_pair_cb *ring_pair, int ring_type)
227 dsaf_write_dev(q, RCB_RING_TX_RING_BD_LEN_REG, 227 dsaf_write_dev(q, RCB_RING_TX_RING_BD_LEN_REG,
228 bd_size_type); 228 bd_size_type);
229 dsaf_write_dev(q, RCB_RING_TX_RING_BD_NUM_REG, 229 dsaf_write_dev(q, RCB_RING_TX_RING_BD_NUM_REG,
230 ring_pair->port_id_in_dsa); 230 ring_pair->port_id_in_comm);
231 dsaf_write_dev(q, RCB_RING_TX_RING_PKTLINE_REG, 231 dsaf_write_dev(q, RCB_RING_TX_RING_PKTLINE_REG,
232 ring_pair->port_id_in_dsa); 232 ring_pair->port_id_in_comm);
233 } 233 }
234} 234}
235 235
@@ -256,50 +256,16 @@ static void hns_rcb_set_port_desc_cnt(struct rcb_common_cb *rcb_common,
256 desc_cnt); 256 desc_cnt);
257} 257}
258 258
259/** 259static void hns_rcb_set_port_timeout(
260 *hns_rcb_set_port_coalesced_frames - set rcb port coalesced frames 260 struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout)
261 *@rcb_common: rcb_common device
262 *@port_idx:port index
263 *@coalesced_frames:BD num for coalesced frames
264 */
265static int hns_rcb_set_port_coalesced_frames(struct rcb_common_cb *rcb_common,
266 u32 port_idx,
267 u32 coalesced_frames)
268{
269 if (coalesced_frames >= rcb_common->desc_num ||
270 coalesced_frames > HNS_RCB_MAX_COALESCED_FRAMES)
271 return -EINVAL;
272
273 dsaf_write_dev(rcb_common, RCB_CFG_PKTLINE_REG + port_idx * 4,
274 coalesced_frames);
275 return 0;
276}
277
278/**
279 *hns_rcb_get_port_coalesced_frames - set rcb port coalesced frames
280 *@rcb_common: rcb_common device
281 *@port_idx:port index
282 * return coaleseced frames value
283 */
284static u32 hns_rcb_get_port_coalesced_frames(struct rcb_common_cb *rcb_common,
285 u32 port_idx)
286{ 261{
287 if (port_idx >= HNS_RCB_SERVICE_NW_ENGINE_NUM) 262 if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver))
288 port_idx = 0; 263 dsaf_write_dev(rcb_common, RCB_CFG_OVERTIME_REG,
289 264 timeout * HNS_RCB_CLK_FREQ_MHZ);
290 return dsaf_read_dev(rcb_common, 265 else
291 RCB_CFG_PKTLINE_REG + port_idx * 4); 266 dsaf_write_dev(rcb_common,
292} 267 RCB_PORT_CFG_OVERTIME_REG + port_idx * 4,
293 268 timeout);
294/**
295 *hns_rcb_set_timeout - set rcb port coalesced time_out
296 *@rcb_common: rcb_common device
297 *@time_out:time for coalesced time_out
298 */
299static void hns_rcb_set_timeout(struct rcb_common_cb *rcb_common,
300 u32 timeout)
301{
302 dsaf_write_dev(rcb_common, RCB_CFG_OVERTIME_REG, timeout);
303} 269}
304 270
305static int hns_rcb_common_get_port_num(struct rcb_common_cb *rcb_common) 271static int hns_rcb_common_get_port_num(struct rcb_common_cb *rcb_common)
@@ -361,10 +327,11 @@ int hns_rcb_common_init_hw(struct rcb_common_cb *rcb_common)
361 327
362 for (i = 0; i < port_num; i++) { 328 for (i = 0; i < port_num; i++) {
363 hns_rcb_set_port_desc_cnt(rcb_common, i, rcb_common->desc_num); 329 hns_rcb_set_port_desc_cnt(rcb_common, i, rcb_common->desc_num);
364 (void)hns_rcb_set_port_coalesced_frames( 330 (void)hns_rcb_set_coalesced_frames(
365 rcb_common, i, rcb_common->coalesced_frames); 331 rcb_common, i, HNS_RCB_DEF_COALESCED_FRAMES);
332 hns_rcb_set_port_timeout(
333 rcb_common, i, HNS_RCB_DEF_COALESCED_USECS);
366 } 334 }
367 hns_rcb_set_timeout(rcb_common, rcb_common->timeout);
368 335
369 dsaf_write_dev(rcb_common, RCB_COM_CFG_ENDIAN_REG, 336 dsaf_write_dev(rcb_common, RCB_COM_CFG_ENDIAN_REG,
370 HNS_RCB_COMMON_ENDIAN); 337 HNS_RCB_COMMON_ENDIAN);
@@ -460,7 +427,8 @@ static void hns_rcb_ring_pair_get_cfg(struct ring_pair_cb *ring_pair_cb)
460 hns_rcb_ring_get_cfg(&ring_pair_cb->q, TX_RING); 427 hns_rcb_ring_get_cfg(&ring_pair_cb->q, TX_RING);
461} 428}
462 429
463static int hns_rcb_get_port(struct rcb_common_cb *rcb_common, int ring_idx) 430static int hns_rcb_get_port_in_comm(
431 struct rcb_common_cb *rcb_common, int ring_idx)
464{ 432{
465 int comm_index = rcb_common->comm_index; 433 int comm_index = rcb_common->comm_index;
466 int port; 434 int port;
@@ -470,7 +438,7 @@ static int hns_rcb_get_port(struct rcb_common_cb *rcb_common, int ring_idx)
470 q_num = (int)rcb_common->max_q_per_vf * rcb_common->max_vfn; 438 q_num = (int)rcb_common->max_q_per_vf * rcb_common->max_vfn;
471 port = ring_idx / q_num; 439 port = ring_idx / q_num;
472 } else { 440 } else {
473 port = HNS_RCB_SERVICE_NW_ENGINE_NUM + comm_index - 1; 441 port = 0; /* config debug-ports port_id_in_comm to 0*/
474 } 442 }
475 443
476 return port; 444 return port;
@@ -518,7 +486,8 @@ void hns_rcb_get_cfg(struct rcb_common_cb *rcb_common)
518 ring_pair_cb->index = i; 486 ring_pair_cb->index = i;
519 ring_pair_cb->q.io_base = 487 ring_pair_cb->q.io_base =
520 RCB_COMM_BASE_TO_RING_BASE(rcb_common->io_base, i); 488 RCB_COMM_BASE_TO_RING_BASE(rcb_common->io_base, i);
521 ring_pair_cb->port_id_in_dsa = hns_rcb_get_port(rcb_common, i); 489 ring_pair_cb->port_id_in_comm =
490 hns_rcb_get_port_in_comm(rcb_common, i);
522 ring_pair_cb->virq[HNS_RCB_IRQ_IDX_TX] = 491 ring_pair_cb->virq[HNS_RCB_IRQ_IDX_TX] =
523 is_ver1 ? irq_of_parse_and_map(np, base_irq_idx + i * 2) : 492 is_ver1 ? irq_of_parse_and_map(np, base_irq_idx + i * 2) :
524 platform_get_irq(pdev, base_irq_idx + i * 3 + 1); 493 platform_get_irq(pdev, base_irq_idx + i * 3 + 1);
@@ -534,82 +503,95 @@ void hns_rcb_get_cfg(struct rcb_common_cb *rcb_common)
534/** 503/**
535 *hns_rcb_get_coalesced_frames - get rcb port coalesced frames 504 *hns_rcb_get_coalesced_frames - get rcb port coalesced frames
536 *@rcb_common: rcb_common device 505 *@rcb_common: rcb_common device
537 *@comm_index:port index 506 *@port_idx:port id in comm
538 *return coalesced_frames 507 *
508 *Returns: coalesced_frames
539 */ 509 */
540u32 hns_rcb_get_coalesced_frames(struct dsaf_device *dsaf_dev, int port) 510u32 hns_rcb_get_coalesced_frames(
511 struct rcb_common_cb *rcb_common, u32 port_idx)
541{ 512{
542 int comm_index = hns_dsaf_get_comm_idx_by_port(port); 513 return dsaf_read_dev(rcb_common, RCB_CFG_PKTLINE_REG + port_idx * 4);
543 struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[comm_index];
544
545 return hns_rcb_get_port_coalesced_frames(rcb_comm, port);
546} 514}
547 515
548/** 516/**
549 *hns_rcb_get_coalesce_usecs - get rcb port coalesced time_out 517 *hns_rcb_get_coalesce_usecs - get rcb port coalesced time_out
550 *@rcb_common: rcb_common device 518 *@rcb_common: rcb_common device
551 *@comm_index:port index 519 *@port_idx:port id in comm
552 *return time_out 520 *
521 *Returns: time_out
553 */ 522 */
554u32 hns_rcb_get_coalesce_usecs(struct dsaf_device *dsaf_dev, int comm_index) 523u32 hns_rcb_get_coalesce_usecs(
524 struct rcb_common_cb *rcb_common, u32 port_idx)
555{ 525{
556 struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[comm_index]; 526 if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver))
557 527 return dsaf_read_dev(rcb_common, RCB_CFG_OVERTIME_REG) /
558 return rcb_comm->timeout; 528 HNS_RCB_CLK_FREQ_MHZ;
529 else
530 return dsaf_read_dev(rcb_common,
531 RCB_PORT_CFG_OVERTIME_REG + port_idx * 4);
559} 532}
560 533
561/** 534/**
562 *hns_rcb_set_coalesce_usecs - set rcb port coalesced time_out 535 *hns_rcb_set_coalesce_usecs - set rcb port coalesced time_out
563 *@rcb_common: rcb_common device 536 *@rcb_common: rcb_common device
564 *@comm_index: comm :index 537 *@port_idx:port id in comm
565 *@etx_usecs:tx time for coalesced time_out 538 *@timeout:tx/rx time for coalesced time_out
566 *@rx_usecs:rx time for coalesced time_out 539 *
540 * Returns:
541 * Zero for success, or an error code in case of failure
567 */ 542 */
568void hns_rcb_set_coalesce_usecs(struct dsaf_device *dsaf_dev, 543int hns_rcb_set_coalesce_usecs(
569 int port, u32 timeout) 544 struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout)
570{ 545{
571 int comm_index = hns_dsaf_get_comm_idx_by_port(port); 546 u32 old_timeout = hns_rcb_get_coalesce_usecs(rcb_common, port_idx);
572 struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[comm_index];
573 547
574 if (rcb_comm->timeout == timeout) 548 if (timeout == old_timeout)
575 return; 549 return 0;
576 550
577 if (comm_index == HNS_DSAF_COMM_SERVICE_NW_IDX) { 551 if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) {
578 dev_err(dsaf_dev->dev, 552 if (rcb_common->comm_index == HNS_DSAF_COMM_SERVICE_NW_IDX) {
579 "error: not support coalesce_usecs setting!\n"); 553 dev_err(rcb_common->dsaf_dev->dev,
580 return; 554 "error: not support coalesce_usecs setting!\n");
555 return -EINVAL;
556 }
581 } 557 }
582 rcb_comm->timeout = timeout; 558 if (timeout > HNS_RCB_MAX_COALESCED_USECS) {
583 hns_rcb_set_timeout(rcb_comm, rcb_comm->timeout); 559 dev_err(rcb_common->dsaf_dev->dev,
560 "error: not support coalesce %dus!\n", timeout);
561 return -EINVAL;
562 }
563 hns_rcb_set_port_timeout(rcb_common, port_idx, timeout);
564 return 0;
584} 565}
585 566
586/** 567/**
587 *hns_rcb_set_coalesced_frames - set rcb coalesced frames 568 *hns_rcb_set_coalesced_frames - set rcb coalesced frames
588 *@rcb_common: rcb_common device 569 *@rcb_common: rcb_common device
589 *@tx_frames:tx BD num for coalesced frames 570 *@port_idx:port id in comm
590 *@rx_frames:rx BD num for coalesced frames 571 *@coalesced_frames:tx/rx BD num for coalesced frames
591 *Return 0 on success, negative on failure 572 *
573 * Returns:
574 * Zero for success, or an error code in case of failure
592 */ 575 */
593int hns_rcb_set_coalesced_frames(struct dsaf_device *dsaf_dev, 576int hns_rcb_set_coalesced_frames(
594 int port, u32 coalesced_frames) 577 struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames)
595{ 578{
596 int comm_index = hns_dsaf_get_comm_idx_by_port(port); 579 u32 old_waterline = hns_rcb_get_coalesced_frames(rcb_common, port_idx);
597 struct rcb_common_cb *rcb_comm = dsaf_dev->rcb_common[comm_index];
598 u32 coalesced_reg_val;
599 int ret;
600 580
601 coalesced_reg_val = hns_rcb_get_port_coalesced_frames(rcb_comm, port); 581 if (coalesced_frames == old_waterline)
602
603 if (coalesced_reg_val == coalesced_frames)
604 return 0; 582 return 0;
605 583
606 if (coalesced_frames >= HNS_RCB_MIN_COALESCED_FRAMES) { 584 if (coalesced_frames >= rcb_common->desc_num ||
607 ret = hns_rcb_set_port_coalesced_frames(rcb_comm, port, 585 coalesced_frames > HNS_RCB_MAX_COALESCED_FRAMES ||
608 coalesced_frames); 586 coalesced_frames < HNS_RCB_MIN_COALESCED_FRAMES) {
609 return ret; 587 dev_err(rcb_common->dsaf_dev->dev,
610 } else { 588 "error: not support coalesce_frames setting!\n");
611 return -EINVAL; 589 return -EINVAL;
612 } 590 }
591
592 dsaf_write_dev(rcb_common, RCB_CFG_PKTLINE_REG + port_idx * 4,
593 coalesced_frames);
594 return 0;
613} 595}
614 596
615/** 597/**
@@ -749,8 +731,6 @@ int hns_rcb_common_get_cfg(struct dsaf_device *dsaf_dev,
749 rcb_common->dsaf_dev = dsaf_dev; 731 rcb_common->dsaf_dev = dsaf_dev;
750 732
751 rcb_common->desc_num = dsaf_dev->desc_num; 733 rcb_common->desc_num = dsaf_dev->desc_num;
752 rcb_common->coalesced_frames = HNS_RCB_DEF_COALESCED_FRAMES;
753 rcb_common->timeout = HNS_RCB_MAX_TIME_OUT;
754 734
755 hns_rcb_get_queue_mode(dsaf_mode, comm_index, &max_vfn, &max_q_per_vf); 735 hns_rcb_get_queue_mode(dsaf_mode, comm_index, &max_vfn, &max_q_per_vf);
756 rcb_common->max_vfn = max_vfn; 736 rcb_common->max_vfn = max_vfn;
@@ -951,6 +931,10 @@ void hns_rcb_get_strings(int stringset, u8 *data, int index)
951void hns_rcb_get_common_regs(struct rcb_common_cb *rcb_com, void *data) 931void hns_rcb_get_common_regs(struct rcb_common_cb *rcb_com, void *data)
952{ 932{
953 u32 *regs = data; 933 u32 *regs = data;
934 bool is_ver1 = AE_IS_VER1(rcb_com->dsaf_dev->dsaf_ver);
935 bool is_dbg = (rcb_com->comm_index != HNS_DSAF_COMM_SERVICE_NW_IDX);
936 u32 reg_tmp;
937 u32 reg_num_tmp;
954 u32 i = 0; 938 u32 i = 0;
955 939
956 /*rcb common registers */ 940 /*rcb common registers */
@@ -1004,12 +988,16 @@ void hns_rcb_get_common_regs(struct rcb_common_cb *rcb_com, void *data)
1004 = dsaf_read_dev(rcb_com, RCB_CFG_PKTLINE_REG + 4 * i); 988 = dsaf_read_dev(rcb_com, RCB_CFG_PKTLINE_REG + 4 * i);
1005 } 989 }
1006 990
1007 regs[70] = dsaf_read_dev(rcb_com, RCB_CFG_OVERTIME_REG); 991 reg_tmp = is_ver1 ? RCB_CFG_OVERTIME_REG : RCB_PORT_CFG_OVERTIME_REG;
1008 regs[71] = dsaf_read_dev(rcb_com, RCB_CFG_PKTLINE_INT_NUM_REG); 992 reg_num_tmp = (is_ver1 || is_dbg) ? 1 : 6;
1009 regs[72] = dsaf_read_dev(rcb_com, RCB_CFG_OVERTIME_INT_NUM_REG); 993 for (i = 0; i < reg_num_tmp; i++)
994 regs[70 + i] = dsaf_read_dev(rcb_com, reg_tmp);
995
996 regs[76] = dsaf_read_dev(rcb_com, RCB_CFG_PKTLINE_INT_NUM_REG);
997 regs[77] = dsaf_read_dev(rcb_com, RCB_CFG_OVERTIME_INT_NUM_REG);
1010 998
1011 /* mark end of rcb common regs */ 999 /* mark end of rcb common regs */
1012 for (i = 73; i < 80; i++) 1000 for (i = 78; i < 80; i++)
1013 regs[i] = 0xcccccccc; 1001 regs[i] = 0xcccccccc;
1014} 1002}
1015 1003
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
index 81fe9f849973..eb61014ad615 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
@@ -38,7 +38,9 @@ struct rcb_common_cb;
38#define HNS_RCB_MAX_COALESCED_FRAMES 1023 38#define HNS_RCB_MAX_COALESCED_FRAMES 1023
39#define HNS_RCB_MIN_COALESCED_FRAMES 1 39#define HNS_RCB_MIN_COALESCED_FRAMES 1
40#define HNS_RCB_DEF_COALESCED_FRAMES 50 40#define HNS_RCB_DEF_COALESCED_FRAMES 50
41#define HNS_RCB_MAX_TIME_OUT 0x500 41#define HNS_RCB_CLK_FREQ_MHZ 350
42#define HNS_RCB_MAX_COALESCED_USECS 0x3ff
43#define HNS_RCB_DEF_COALESCED_USECS 3
42 44
43#define HNS_RCB_COMMON_ENDIAN 1 45#define HNS_RCB_COMMON_ENDIAN 1
44 46
@@ -82,7 +84,7 @@ struct ring_pair_cb {
82 84
83 int virq[HNS_RCB_IRQ_NUM_PER_QUEUE]; 85 int virq[HNS_RCB_IRQ_NUM_PER_QUEUE];
84 86
85 u8 port_id_in_dsa; 87 u8 port_id_in_comm;
86 u8 used_by_vf; 88 u8 used_by_vf;
87 89
88 struct hns_ring_hw_stats hw_stats; 90 struct hns_ring_hw_stats hw_stats;
@@ -97,8 +99,6 @@ struct rcb_common_cb {
97 99
98 u8 comm_index; 100 u8 comm_index;
99 u32 ring_num; 101 u32 ring_num;
100 u32 coalesced_frames; /* frames threshold of rx interrupt */
101 u32 timeout; /* time threshold of rx interrupt */
102 u32 desc_num; /* desc num per queue*/ 102 u32 desc_num; /* desc num per queue*/
103 103
104 struct ring_pair_cb ring_pair_cb[0]; 104 struct ring_pair_cb ring_pair_cb[0];
@@ -125,13 +125,14 @@ void hns_rcbv2_int_clr_hw(struct hnae_queue *q, u32 flag);
125void hns_rcb_init_hw(struct ring_pair_cb *ring); 125void hns_rcb_init_hw(struct ring_pair_cb *ring);
126void hns_rcb_reset_ring_hw(struct hnae_queue *q); 126void hns_rcb_reset_ring_hw(struct hnae_queue *q);
127void hns_rcb_wait_fbd_clean(struct hnae_queue **qs, int q_num, u32 flag); 127void hns_rcb_wait_fbd_clean(struct hnae_queue **qs, int q_num, u32 flag);
128 128u32 hns_rcb_get_coalesced_frames(
129u32 hns_rcb_get_coalesced_frames(struct dsaf_device *dsaf_dev, int comm_index); 129 struct rcb_common_cb *rcb_common, u32 port_idx);
130u32 hns_rcb_get_coalesce_usecs(struct dsaf_device *dsaf_dev, int comm_index); 130u32 hns_rcb_get_coalesce_usecs(
131void hns_rcb_set_coalesce_usecs(struct dsaf_device *dsaf_dev, 131 struct rcb_common_cb *rcb_common, u32 port_idx);
132 int comm_index, u32 timeout); 132int hns_rcb_set_coalesce_usecs(
133int hns_rcb_set_coalesced_frames(struct dsaf_device *dsaf_dev, 133 struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout);
134 int comm_index, u32 coalesce_frames); 134int hns_rcb_set_coalesced_frames(
135 struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames);
135void hns_rcb_update_stats(struct hnae_queue *queue); 136void hns_rcb_update_stats(struct hnae_queue *queue);
136 137
137void hns_rcb_get_stats(struct hnae_queue *queue, u64 *data); 138void hns_rcb_get_stats(struct hnae_queue *queue, u64 *data);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
index e2206f938a9c..7d7204f45e78 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
@@ -406,6 +406,7 @@
406#define RCB_CFG_OVERTIME_REG 0x9300 406#define RCB_CFG_OVERTIME_REG 0x9300
407#define RCB_CFG_PKTLINE_INT_NUM_REG 0x9304 407#define RCB_CFG_PKTLINE_INT_NUM_REG 0x9304
408#define RCB_CFG_OVERTIME_INT_NUM_REG 0x9308 408#define RCB_CFG_OVERTIME_INT_NUM_REG 0x9308
409#define RCB_PORT_CFG_OVERTIME_REG 0x9430
409 410
410#define RCB_RING_RX_RING_BASEADDR_L_REG 0x00000 411#define RCB_RING_RX_RING_BASEADDR_L_REG 0x00000
411#define RCB_RING_RX_RING_BASEADDR_H_REG 0x00004 412#define RCB_RING_RX_RING_BASEADDR_H_REG 0x00004