Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'hns-misc-fixes'

Salil Mehta says:

====================
net: hns: Misc. HNS Bug Fixes & Code Improvements

This patch set introduces various HNS bug fixes, optimizations and code
improvements.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+657 -564
+6 -1
drivers/net/ethernet/hisilicon/hns/hnae.c
··· 57 57 58 58 static void hnae_free_buffer(struct hnae_ring *ring, struct hnae_desc_cb *cb) 59 59 { 60 + if (unlikely(!cb->priv)) 61 + return; 62 + 60 63 if (cb->type == DESC_TYPE_SKB) 61 64 dev_kfree_skb_any((struct sk_buff *)cb->priv); 62 65 else if (unlikely(is_rx_ring(ring))) 63 66 put_page((struct page *)cb->priv); 64 - memset(cb, 0, sizeof(*cb)); 67 + 68 + cb->priv = NULL; 65 69 } 66 70 67 71 static int hnae_map_buffer(struct hnae_ring *ring, struct hnae_desc_cb *cb) ··· 201 197 202 198 ring->q = q; 203 199 ring->flags = flags; 200 + spin_lock_init(&ring->lock); 204 201 assert(!ring->desc && !ring->desc_cb && !ring->desc_dma_addr); 205 202 206 203 /* not matter for tx or rx ring, the ntc and ntc start from 0 */
+43 -4
drivers/net/ethernet/hisilicon/hns/hnae.h
··· 67 67 #define AE_IS_VER1(ver) ((ver) == AE_VERSION_1) 68 68 #define AE_NAME_SIZE 16 69 69 70 + #define BD_SIZE_2048_MAX_MTU 6000 71 + 70 72 /* some said the RX and TX RCB format should not be the same in the future. But 71 73 * it is the same now... 72 74 */ ··· 102 100 #define HNS_RX_FLAG_L4ID_UDP 0x0 103 101 #define HNS_RX_FLAG_L4ID_TCP 0x1 104 102 #define HNS_RX_FLAG_L4ID_SCTP 0x3 105 - 106 103 107 104 #define HNS_TXD_ASID_S 0 108 105 #define HNS_TXD_ASID_M (0xff << HNS_TXD_ASID_S) ··· 273 272 274 273 /* statistic */ 275 274 struct ring_stats stats; 275 + 276 + /* ring lock for poll one */ 277 + spinlock_t lock; 276 278 277 279 dma_addr_t desc_dma_addr; 278 280 u32 buf_size; /* size for hnae_desc->addr, preset by AE */ ··· 487 483 u32 auto_neg, u32 rx_en, u32 tx_en); 488 484 void (*get_coalesce_usecs)(struct hnae_handle *handle, 489 485 u32 *tx_usecs, u32 *rx_usecs); 490 - void (*get_rx_max_coalesced_frames)(struct hnae_handle *handle, 491 - u32 *tx_frames, u32 *rx_frames); 486 + void (*get_max_coalesced_frames)(struct hnae_handle *handle, 487 + u32 *tx_frames, u32 *rx_frames); 492 488 int (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout); 493 489 int (*set_coalesce_frames)(struct hnae_handle *handle, 494 - u32 coalesce_frames); 490 + u32 tx_frames, u32 rx_frames); 495 491 void (*get_coalesce_range)(struct hnae_handle *handle, 496 492 u32 *tx_frames_low, u32 *rx_frames_low, 497 493 u32 *tx_frames_high, u32 *rx_frames_high, ··· 648 644 ring->desc[i].addr = cpu_to_le64(ring->desc_cb[i].dma 649 645 + ring->desc_cb[i].page_offset); 650 646 ring->desc[i].rx.ipoff_bnum_pid_flag = 0; 647 + } 648 + 649 + /* when reinit buffer size, we should reinit buffer description */ 650 + static inline void hnae_reinit_all_ring_desc(struct hnae_handle *h) 651 + { 652 + int i, j; 653 + struct hnae_ring *ring; 654 + 655 + for (i = 0; i < h->q_num; i++) { 656 + ring = &h->qs[i]->rx_ring; 657 + for (j = 0; j < ring->desc_num; j++) 658 + ring->desc[j].addr = cpu_to_le64(ring->desc_cb[j].dma); 659 + } 660 + 661 + wmb(); /* commit all data before submit */ 662 + } 663 + 664 + /* when reinit buffer size, we should reinit page offset */ 665 + static inline void hnae_reinit_all_ring_page_off(struct hnae_handle *h) 666 + { 667 + int i, j; 668 + struct hnae_ring *ring; 669 + 670 + for (i = 0; i < h->q_num; i++) { 671 + ring = &h->qs[i]->rx_ring; 672 + for (j = 0; j < ring->desc_num; j++) { 673 + ring->desc_cb[j].page_offset = 0; 674 + if (ring->desc[j].addr != 675 + cpu_to_le64(ring->desc_cb[j].dma)) 676 + ring->desc[j].addr = 677 + cpu_to_le64(ring->desc_cb[j].dma); 678 + } 679 + } 680 + 681 + wmb(); /* commit all data before submit */ 651 682 } 652 683 653 684 #define hnae_set_field(origin, mask, shift, val) \
+94 -33
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
··· 267 267 static int hns_ae_set_mtu(struct hnae_handle *handle, int new_mtu) 268 268 { 269 269 struct hns_mac_cb *mac_cb = hns_get_mac_cb(handle); 270 + struct hnae_queue *q; 271 + u32 rx_buf_size; 272 + int i, ret; 270 273 271 - return hns_mac_set_mtu(mac_cb, new_mtu); 274 + /* when buf_size is 2048, max mtu is 6K for rx ring max bd num is 3. */ 275 + if (!AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver)) { 276 + if (new_mtu <= BD_SIZE_2048_MAX_MTU) 277 + rx_buf_size = 2048; 278 + else 279 + rx_buf_size = 4096; 280 + } else { 281 + rx_buf_size = mac_cb->dsaf_dev->buf_size; 282 + } 283 + 284 + ret = hns_mac_set_mtu(mac_cb, new_mtu, rx_buf_size); 285 + 286 + if (!ret) { 287 + /* reinit ring buf_size */ 288 + for (i = 0; i < handle->q_num; i++) { 289 + q = handle->qs[i]; 290 + q->rx_ring.buf_size = rx_buf_size; 291 + hns_rcb_set_rx_ring_bs(q, rx_buf_size); 292 + } 293 + } 294 + 295 + return ret; 272 296 } 273 297 274 298 static void hns_ae_set_tso_stats(struct hnae_handle *handle, int enable) ··· 487 463 ring_pair->port_id_in_comm); 488 464 } 489 465 490 - static void hns_ae_get_rx_max_coalesced_frames(struct hnae_handle *handle, 491 - u32 *tx_frames, u32 *rx_frames) 466 + static void hns_ae_get_max_coalesced_frames(struct hnae_handle *handle, 467 + u32 *tx_frames, u32 *rx_frames) 492 468 { 493 469 struct ring_pair_cb *ring_pair = 494 470 container_of(handle->qs[0], struct ring_pair_cb, q); 471 + struct dsaf_device *dsaf_dev = hns_ae_get_dsaf_dev(handle->dev); 495 472 496 - *tx_frames = hns_rcb_get_coalesced_frames(ring_pair->rcb_common, 497 - ring_pair->port_id_in_comm); 498 - *rx_frames = hns_rcb_get_coalesced_frames(ring_pair->rcb_common, 473 + if (AE_IS_VER1(dsaf_dev->dsaf_ver) || 474 + handle->port_type == HNAE_PORT_DEBUG) 475 + *tx_frames = hns_rcb_get_rx_coalesced_frames( 476 + ring_pair->rcb_common, ring_pair->port_id_in_comm); 477 + else 478 + *tx_frames = hns_rcb_get_tx_coalesced_frames( 479 + ring_pair->rcb_common, ring_pair->port_id_in_comm); 480 + *rx_frames = hns_rcb_get_rx_coalesced_frames(ring_pair->rcb_common, 499 481 ring_pair->port_id_in_comm); 500 482 } 501 483 ··· 515 485 ring_pair->rcb_common, ring_pair->port_id_in_comm, timeout); 516 486 } 517 487 518 - static int hns_ae_set_coalesce_frames(struct hnae_handle *handle, 519 - u32 coalesce_frames) 488 + static int hns_ae_set_coalesce_frames(struct hnae_handle *handle, 489 + u32 tx_frames, u32 rx_frames) 520 490 { 491 + int ret; 521 492 struct ring_pair_cb *ring_pair = 522 493 container_of(handle->qs[0], struct ring_pair_cb, q); 494 + struct dsaf_device *dsaf_dev = hns_ae_get_dsaf_dev(handle->dev); 523 495 524 - return hns_rcb_set_coalesced_frames( 525 - ring_pair->rcb_common, 526 - ring_pair->port_id_in_comm, coalesce_frames); 496 + if (AE_IS_VER1(dsaf_dev->dsaf_ver) || 497 + handle->port_type == HNAE_PORT_DEBUG) { 498 + if (tx_frames != rx_frames) 499 + return -EINVAL; 500 + return hns_rcb_set_rx_coalesced_frames( 501 + ring_pair->rcb_common, 502 + ring_pair->port_id_in_comm, rx_frames); 503 + } else { 504 + if (tx_frames != 1) 505 + return -EINVAL; 506 + ret = hns_rcb_set_tx_coalesced_frames( 507 + ring_pair->rcb_common, 508 + ring_pair->port_id_in_comm, tx_frames); 509 + if (ret) 510 + return ret; 511 + 512 + return hns_rcb_set_rx_coalesced_frames( 513 + ring_pair->rcb_common, 514 + ring_pair->port_id_in_comm, rx_frames); 515 + } 527 516 } 528 517 529 518 static void hns_ae_get_coalesce_range(struct hnae_handle *handle, ··· 553 504 { 554 505 struct dsaf_device *dsaf_dev; 555 506 507 + assert(handle); 508 + 556 509 dsaf_dev = hns_ae_get_dsaf_dev(handle->dev); 557 510 558 - *tx_frames_low = HNS_RCB_MIN_COALESCED_FRAMES; 559 - *rx_frames_low = HNS_RCB_MIN_COALESCED_FRAMES; 560 - *tx_frames_high = 561 - (dsaf_dev->desc_num - 1 > HNS_RCB_MAX_COALESCED_FRAMES) ? 562 - HNS_RCB_MAX_COALESCED_FRAMES : dsaf_dev->desc_num - 1; 563 - *rx_frames_high = 564 - (dsaf_dev->desc_num - 1 > HNS_RCB_MAX_COALESCED_FRAMES) ? 565 - HNS_RCB_MAX_COALESCED_FRAMES : dsaf_dev->desc_num - 1; 566 - *tx_usecs_low = 0; 567 - *rx_usecs_low = 0; 568 - *tx_usecs_high = HNS_RCB_MAX_COALESCED_USECS; 569 - *rx_usecs_high = HNS_RCB_MAX_COALESCED_USECS; 511 + *tx_frames_low = HNS_RCB_TX_FRAMES_LOW; 512 + *rx_frames_low = HNS_RCB_RX_FRAMES_LOW; 513 + 514 + if (AE_IS_VER1(dsaf_dev->dsaf_ver) || 515 + handle->port_type == HNAE_PORT_DEBUG) 516 + *tx_frames_high = 517 + (dsaf_dev->desc_num - 1 > HNS_RCB_TX_FRAMES_HIGH) ? 518 + HNS_RCB_TX_FRAMES_HIGH : dsaf_dev->desc_num - 1; 519 + else 520 + *tx_frames_high = 1; 521 + 522 + *rx_frames_high = (dsaf_dev->desc_num - 1 > HNS_RCB_RX_FRAMES_HIGH) ? 523 + HNS_RCB_RX_FRAMES_HIGH : dsaf_dev->desc_num - 1; 524 + *tx_usecs_low = HNS_RCB_TX_USECS_LOW; 525 + *rx_usecs_low = HNS_RCB_RX_USECS_LOW; 526 + *tx_usecs_high = HNS_RCB_TX_USECS_HIGH; 527 + *rx_usecs_high = HNS_RCB_RX_USECS_HIGH; 570 528 } 571 529 572 530 void hns_ae_update_stats(struct hnae_handle *handle, ··· 858 802 memcpy(key, ppe_cb->rss_key, HNS_PPEV2_RSS_KEY_SIZE); 859 803 860 804 /* update the current hash->queue mappings from the shadow RSS table */ 861 - memcpy(indir, ppe_cb->rss_indir_table, 862 - HNS_PPEV2_RSS_IND_TBL_SIZE * sizeof(*indir)); 805 + if (indir) 806 + memcpy(indir, ppe_cb->rss_indir_table, 807 + HNS_PPEV2_RSS_IND_TBL_SIZE * sizeof(*indir)); 863 808 864 809 return 0; 865 810 } ··· 871 814 struct hns_ppe_cb *ppe_cb = hns_get_ppe_cb(handle); 872 815 873 816 /* set the RSS Hash Key if specififed by the user */ 874 - if (key) 875 - hns_ppe_set_rss_key(ppe_cb, (u32 *)key); 817 + if (key) { 818 + memcpy(ppe_cb->rss_key, key, HNS_PPEV2_RSS_KEY_SIZE); 819 + hns_ppe_set_rss_key(ppe_cb, ppe_cb->rss_key); 820 + } 876 821 877 - /* update the shadow RSS table with user specified qids */ 878 - memcpy(ppe_cb->rss_indir_table, indir, 879 - HNS_PPEV2_RSS_IND_TBL_SIZE * sizeof(*indir)); 822 + if (indir) { 823 + /* update the shadow RSS table with user specified qids */ 824 + memcpy(ppe_cb->rss_indir_table, indir, 825 + HNS_PPEV2_RSS_IND_TBL_SIZE * sizeof(*indir)); 880 826 881 - /* now update the hardware */ 882 - hns_ppe_set_indir_table(ppe_cb, ppe_cb->rss_indir_table); 827 + /* now update the hardware */ 828 + hns_ppe_set_indir_table(ppe_cb, ppe_cb->rss_indir_table); 829 + } 883 830 884 831 return 0; 885 832 } ··· 907 846 .get_autoneg = hns_ae_get_autoneg, 908 847 .set_pauseparam = hns_ae_set_pauseparam, 909 848 .get_coalesce_usecs = hns_ae_get_coalesce_usecs, 910 - .get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames, 849 + .get_max_coalesced_frames = hns_ae_get_max_coalesced_frames, 911 850 .set_coalesce_usecs = hns_ae_set_coalesce_usecs, 912 851 .set_coalesce_frames = hns_ae_set_coalesce_frames, 913 852 .get_coalesce_range = hns_ae_get_coalesce_range,
+27 -34
drivers/net/ethernet/hisilicon/hns/hns_dsaf_gmac.c
··· 86 86 dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 0); 87 87 } 88 88 89 - /** 90 - *hns_gmac_get_en - get port enable 91 - *@mac_drv:mac device 92 - *@rx:rx enable 93 - *@tx:tx enable 94 - */ 89 + /* hns_gmac_get_en - get port enable 90 + * @mac_drv:mac device 91 + * @rx:rx enable 92 + * @tx:tx enable 93 + */ 95 94 static void hns_gmac_get_en(void *mac_drv, u32 *rx, u32 *tx) 96 95 { 97 96 struct mac_driver *drv = (struct mac_driver *)mac_drv; ··· 145 146 146 147 dsaf_set_dev_field(drv, GAMC_RX_MAX_FRAME, GMAC_MAX_FRM_SIZE_M, 147 148 GMAC_MAX_FRM_SIZE_S, newval); 149 + } 150 + 151 + static void hns_gmac_config_pad_and_crc(void *mac_drv, u8 newval) 152 + { 153 + u32 tx_ctrl; 154 + struct mac_driver *drv = (struct mac_driver *)mac_drv; 155 + 156 + tx_ctrl = dsaf_read_dev(drv, GMAC_TRANSMIT_CONTROL_REG); 157 + dsaf_set_bit(tx_ctrl, GMAC_TX_PAD_EN_B, !!newval); 158 + dsaf_set_bit(tx_ctrl, GMAC_TX_CRC_ADD_B, !!newval); 159 + dsaf_write_dev(drv, GMAC_TRANSMIT_CONTROL_REG, tx_ctrl); 148 160 } 149 161 150 162 static void hns_gmac_config_an_mode(void *mac_drv, u8 newval) ··· 260 250 static int hns_gmac_adjust_link(void *mac_drv, enum mac_speed speed, 261 251 u32 full_duplex) 262 252 { 263 - u32 tx_ctrl; 264 253 struct mac_driver *drv = (struct mac_driver *)mac_drv; 265 254 266 255 dsaf_set_dev_bit(drv, GMAC_DUPLEX_TYPE_REG, ··· 287 278 speed, drv->mac_id); 288 279 return -EINVAL; 289 280 } 290 - 291 - tx_ctrl = dsaf_read_dev(drv, GMAC_TRANSMIT_CONTROL_REG); 292 - dsaf_set_bit(tx_ctrl, GMAC_TX_PAD_EN_B, 1); 293 - dsaf_set_bit(tx_ctrl, GMAC_TX_CRC_ADD_B, 1); 294 - dsaf_write_dev(drv, GMAC_TRANSMIT_CONTROL_REG, tx_ctrl); 295 - 296 - dsaf_set_dev_bit(drv, GMAC_MODE_CHANGE_EN_REG, 297 - GMAC_MODE_CHANGE_EB_B, 1); 298 281 299 282 return 0; 300 283 } ··· 326 325 hns_gmac_tx_loop_pkt_dis(mac_drv); 327 326 if (drv->mac_cb->mac_type == HNAE_PORT_DEBUG) 328 327 hns_gmac_set_uc_match(mac_drv, 0); 328 + 329 + hns_gmac_config_pad_and_crc(mac_drv, 1); 330 + 331 + dsaf_set_dev_bit(drv, GMAC_MODE_CHANGE_EN_REG, 332 + GMAC_MODE_CHANGE_EB_B, 1); 333 + 334 + /* reduce gmac tx water line to avoid gmac hang-up 335 + * in speed 100M and duplex half. 336 + */ 337 + dsaf_set_dev_field(drv, GMAC_TX_WATER_LINE_REG, GMAC_TX_WATER_LINE_MASK, 338 + GMAC_TX_WATER_LINE_SHIFT, 8); 329 339 } 330 340 331 341 void hns_gmac_update_stats(void *mac_drv) ··· 463 451 } 464 452 465 453 return 0; 466 - } 467 - 468 - static void hns_gmac_config_pad_and_crc(void *mac_drv, u8 newval) 469 - { 470 - u32 tx_ctrl; 471 - struct mac_driver *drv = (struct mac_driver *)mac_drv; 472 - 473 - tx_ctrl = dsaf_read_dev(drv, GMAC_TRANSMIT_CONTROL_REG); 474 - dsaf_set_bit(tx_ctrl, GMAC_TX_PAD_EN_B, !!newval); 475 - dsaf_set_bit(tx_ctrl, GMAC_TX_CRC_ADD_B, !!newval); 476 - dsaf_write_dev(drv, GMAC_TRANSMIT_CONTROL_REG, tx_ctrl); 477 - } 478 - 479 - static void hns_gmac_get_id(void *mac_drv, u8 *mac_id) 480 - { 481 - struct mac_driver *drv = (struct mac_driver *)mac_drv; 482 - 483 - *mac_id = drv->mac_id; 484 454 } 485 455 486 456 static void hns_gmac_get_info(void *mac_drv, struct mac_info *mac_info) ··· 706 712 mac_drv->config_pad_and_crc = hns_gmac_config_pad_and_crc; 707 713 mac_drv->config_half_duplex = hns_gmac_set_duplex_type; 708 714 mac_drv->set_rx_ignore_pause_frames = hns_gmac_set_rx_auto_pause_frames; 709 - mac_drv->mac_get_id = hns_gmac_get_id; 710 715 mac_drv->get_info = hns_gmac_get_info; 711 716 mac_drv->autoneg_stat = hns_gmac_autoneg_stat; 712 717 mac_drv->get_pause_enable = hns_gmac_get_pausefrm_cfg;
+1 -40
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
··· 332 332 return 0; 333 333 } 334 334 335 - /** 336 - *hns_mac_del_mac - delete mac address into dsaf table,can't delete the same 337 - * address twice 338 - *@net_dev: net device 339 - *@vfn : vf lan 340 - *@mac : mac address 341 - *return status 342 - */ 343 - int hns_mac_del_mac(struct hns_mac_cb *mac_cb, u32 vfn, char *mac) 344 - { 345 - struct mac_entry_idx *old_mac; 346 - struct dsaf_device *dsaf_dev; 347 - u32 ret; 348 - 349 - dsaf_dev = mac_cb->dsaf_dev; 350 - 351 - if (vfn < DSAF_MAX_VM_NUM) { 352 - old_mac = &mac_cb->addr_entry_idx[vfn]; 353 - } else { 354 - dev_err(mac_cb->dev, 355 - "vf queue is too large, %s mac%d queue = %#x!\n", 356 - mac_cb->dsaf_dev->ae_dev.name, mac_cb->mac_id, vfn); 357 - return -EINVAL; 358 - } 359 - 360 - if (dsaf_dev) { 361 - ret = hns_dsaf_del_mac_entry(dsaf_dev, old_mac->vlan_id, 362 - mac_cb->mac_id, old_mac->addr); 363 - if (ret) 364 - return ret; 365 - 366 - if (memcmp(old_mac->addr, mac, sizeof(old_mac->addr)) == 0) 367 - old_mac->valid = 0; 368 - } 369 - 370 - return 0; 371 - } 372 - 373 335 int hns_mac_clr_multicast(struct hns_mac_cb *mac_cb, int vfn) 374 336 { 375 337 struct dsaf_device *dsaf_dev = mac_cb->dsaf_dev; ··· 453 491 } 454 492 } 455 493 456 - int hns_mac_set_mtu(struct hns_mac_cb *mac_cb, u32 new_mtu) 494 + int hns_mac_set_mtu(struct hns_mac_cb *mac_cb, u32 new_mtu, u32 buf_size) 457 495 { 458 496 struct mac_driver *drv = hns_mac_get_drv(mac_cb); 459 - u32 buf_size = mac_cb->dsaf_dev->buf_size; 460 497 u32 new_frm = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN; 461 498 u32 max_frm = AE_IS_VER1(mac_cb->dsaf_dev->dsaf_ver) ? 462 499 MAC_MAX_MTU : MAC_MAX_MTU_V2;
+1 -4
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
··· 373 373 void (*set_rx_ignore_pause_frames)(void *mac_drv, u32 enable); 374 374 /* config rx mode for promiscuous*/ 375 375 void (*set_promiscuous)(void *mac_drv, u8 enable); 376 - /* get mac id */ 377 - void (*mac_get_id)(void *mac_drv, u8 *mac_id); 378 376 void (*mac_pausefrm_cfg)(void *mac_drv, u32 rx_en, u32 tx_en); 379 377 380 378 void (*autoneg_stat)(void *mac_drv, u32 *enable); ··· 434 436 int hns_mac_vm_config_bc_en(struct hns_mac_cb *mac_cb, u32 vm, bool enable); 435 437 void hns_mac_start(struct hns_mac_cb *mac_cb); 436 438 void hns_mac_stop(struct hns_mac_cb *mac_cb); 437 - int hns_mac_del_mac(struct hns_mac_cb *mac_cb, u32 vfn, char *mac); 438 439 void hns_mac_uninit(struct dsaf_device *dsaf_dev); 439 440 void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int speed, int duplex); 440 441 void hns_mac_reset(struct hns_mac_cb *mac_cb); ··· 441 444 void hns_mac_get_pauseparam(struct hns_mac_cb *mac_cb, u32 *rx_en, u32 *tx_en); 442 445 int hns_mac_set_autoneg(struct hns_mac_cb *mac_cb, u8 enable); 443 446 int hns_mac_set_pauseparam(struct hns_mac_cb *mac_cb, u32 rx_en, u32 tx_en); 444 - int hns_mac_set_mtu(struct hns_mac_cb *mac_cb, u32 new_mtu); 447 + int hns_mac_set_mtu(struct hns_mac_cb *mac_cb, u32 new_mtu, u32 buf_size); 445 448 int hns_mac_get_port_info(struct hns_mac_cb *mac_cb, 446 449 u8 *auto_neg, u16 *speed, u8 *duplex); 447 450 int hns_mac_config_mac_loopback(struct hns_mac_cb *mac_cb,
+4 -245
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
··· 510 510 o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg); 511 511 dsaf_set_field(o_sbm_bp_cfg, 512 512 DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_M, 513 - DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 48); 513 + DSAFV2_SBM_CFG3_SET_BUF_NUM_NO_PFC_S, 55); 514 514 dsaf_set_field(o_sbm_bp_cfg, 515 515 DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_M, 516 - DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 80); 516 + DSAFV2_SBM_CFG3_RESET_BUF_NUM_NO_PFC_S, 110); 517 517 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg); 518 518 519 519 /* for no enable pfc mode */ ··· 521 521 o_sbm_bp_cfg = dsaf_read_dev(dsaf_dev, reg); 522 522 dsaf_set_field(o_sbm_bp_cfg, 523 523 DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_M, 524 - DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_S, 192); 524 + DSAFV2_SBM_CFG4_SET_BUF_NUM_NO_PFC_S, 128); 525 525 dsaf_set_field(o_sbm_bp_cfg, 526 526 DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_M, 527 - DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S, 240); 527 + DSAFV2_SBM_CFG4_RESET_BUF_NUM_NO_PFC_S, 192); 528 528 dsaf_write_dev(dsaf_dev, reg, o_sbm_bp_cfg); 529 529 } 530 530 ··· 1647 1647 mac_entry->addr); 1648 1648 } 1649 1649 1650 - /** 1651 - * hns_dsaf_set_mac_mc_entry - set mac mc-entry 1652 - * @dsaf_dev: dsa fabric device struct pointer 1653 - * @mac_entry: mc-mac entry 1654 - */ 1655 - int hns_dsaf_set_mac_mc_entry( 1656 - struct dsaf_device *dsaf_dev, 1657 - struct dsaf_drv_mac_multi_dest_entry *mac_entry) 1658 - { 1659 - u16 entry_index = DSAF_INVALID_ENTRY_IDX; 1660 - struct dsaf_drv_tbl_tcam_key mac_key; 1661 - struct dsaf_tbl_tcam_mcast_cfg mac_data; 1662 - struct dsaf_drv_priv *priv = 1663 - (struct dsaf_drv_priv *)hns_dsaf_dev_priv(dsaf_dev); 1664 - struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl; 1665 - struct dsaf_drv_tbl_tcam_key tmp_mac_key; 1666 - struct dsaf_tbl_tcam_data tcam_data; 1667 - 1668 - /* mac addr check */ 1669 - if (MAC_IS_ALL_ZEROS(mac_entry->addr)) { 1670 - dev_err(dsaf_dev->dev, "set uc %s Mac %pM err!\n", 1671 - dsaf_dev->ae_dev.name, mac_entry->addr); 1672 - return -EINVAL; 1673 - } 1674 - 1675 - /*config key */ 1676 - hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 1677 - mac_entry->in_vlan_id, 1678 - mac_entry->in_port_num, mac_entry->addr); 1679 - 1680 - /* entry ie exist? */ 1681 - entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key); 1682 - if (entry_index == DSAF_INVALID_ENTRY_IDX) { 1683 - /*if hasnot, find enpty entry*/ 1684 - entry_index = hns_dsaf_find_empty_mac_entry(dsaf_dev); 1685 - if (entry_index == DSAF_INVALID_ENTRY_IDX) { 1686 - /*if hasnot empty, error*/ 1687 - dev_err(dsaf_dev->dev, 1688 - "set_uc_entry failed, %s Mac key(%#x:%#x)\n", 1689 - dsaf_dev->ae_dev.name, 1690 - mac_key.high.val, mac_key.low.val); 1691 - return -EINVAL; 1692 - } 1693 - 1694 - /* config hardware entry */ 1695 - memset(mac_data.tbl_mcast_port_msk, 1696 - 0, sizeof(mac_data.tbl_mcast_port_msk)); 1697 - } else { 1698 - /* config hardware entry */ 1699 - hns_dsaf_tcam_mc_get(dsaf_dev, entry_index, &tcam_data, 1700 - &mac_data); 1701 - 1702 - tmp_mac_key.high.val = 1703 - le32_to_cpu(tcam_data.tbl_tcam_data_high); 1704 - tmp_mac_key.low.val = le32_to_cpu(tcam_data.tbl_tcam_data_low); 1705 - } 1706 - mac_data.tbl_mcast_old_en = 0; 1707 - mac_data.tbl_mcast_item_vld = 1; 1708 - dsaf_set_field(mac_data.tbl_mcast_port_msk[0], 1709 - 0x3F, 0, mac_entry->port_mask[0]); 1710 - 1711 - dev_dbg(dsaf_dev->dev, 1712 - "set_uc_entry, %s key(%#x:%#x) entry_index%d\n", 1713 - dsaf_dev->ae_dev.name, mac_key.high.val, 1714 - mac_key.low.val, entry_index); 1715 - 1716 - tcam_data.tbl_tcam_data_high = cpu_to_le32(mac_key.high.val); 1717 - tcam_data.tbl_tcam_data_low = cpu_to_le32(mac_key.low.val); 1718 - 1719 - hns_dsaf_tcam_mc_cfg(dsaf_dev, entry_index, &tcam_data, NULL, 1720 - &mac_data); 1721 - 1722 - /* config software entry */ 1723 - soft_mac_entry += entry_index; 1724 - soft_mac_entry->index = entry_index; 1725 - soft_mac_entry->tcam_key.high.val = mac_key.high.val; 1726 - soft_mac_entry->tcam_key.low.val = mac_key.low.val; 1727 - 1728 - return 0; 1729 - } 1730 - 1731 1650 static void hns_dsaf_mc_mask_bit_clear(char *dst, const char *src) 1732 1651 { 1733 1652 u16 *a = (u16 *)dst; ··· 2006 2087 } 2007 2088 2008 2089 return ret; 2009 - } 2010 - 2011 - /** 2012 - * hns_dsaf_get_mac_uc_entry - get mac uc entry 2013 - * @dsaf_dev: dsa fabric device struct pointer 2014 - * @mac_entry: mac entry 2015 - */ 2016 - int hns_dsaf_get_mac_uc_entry(struct dsaf_device *dsaf_dev, 2017 - struct dsaf_drv_mac_single_dest_entry *mac_entry) 2018 - { 2019 - u16 entry_index = DSAF_INVALID_ENTRY_IDX; 2020 - struct dsaf_drv_tbl_tcam_key mac_key; 2021 - 2022 - struct dsaf_tbl_tcam_ucast_cfg mac_data; 2023 - struct dsaf_tbl_tcam_data tcam_data; 2024 - 2025 - /* check macaddr */ 2026 - if (MAC_IS_ALL_ZEROS(mac_entry->addr) || 2027 - MAC_IS_BROADCAST(mac_entry->addr)) { 2028 - dev_err(dsaf_dev->dev, "get_entry failed,addr %pM\n", 2029 - mac_entry->addr); 2030 - return -EINVAL; 2031 - } 2032 - 2033 - /*config key */ 2034 - hns_dsaf_set_mac_key(dsaf_dev, &mac_key, mac_entry->in_vlan_id, 2035 - mac_entry->in_port_num, mac_entry->addr); 2036 - 2037 - /*check exist? */ 2038 - entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key); 2039 - if (entry_index == DSAF_INVALID_ENTRY_IDX) { 2040 - /*find none, error */ 2041 - dev_err(dsaf_dev->dev, 2042 - "get_uc_entry failed, %s Mac key(%#x:%#x)\n", 2043 - dsaf_dev->ae_dev.name, 2044 - mac_key.high.val, mac_key.low.val); 2045 - return -EINVAL; 2046 - } 2047 - dev_dbg(dsaf_dev->dev, 2048 - "get_uc_entry, %s Mac key(%#x:%#x) entry_index%d\n", 2049 - dsaf_dev->ae_dev.name, mac_key.high.val, 2050 - mac_key.low.val, entry_index); 2051 - 2052 - /* read entry */ 2053 - hns_dsaf_tcam_uc_get(dsaf_dev, entry_index, &tcam_data, &mac_data); 2054 - 2055 - mac_key.high.val = le32_to_cpu(tcam_data.tbl_tcam_data_high); 2056 - mac_key.low.val = le32_to_cpu(tcam_data.tbl_tcam_data_low); 2057 - 2058 - mac_entry->port_num = mac_data.tbl_ucast_out_port; 2059 - 2060 - return 0; 2061 - } 2062 - 2063 - /** 2064 - * hns_dsaf_get_mac_mc_entry - get mac mc entry 2065 - * @dsaf_dev: dsa fabric device struct pointer 2066 - * @mac_entry: mac entry 2067 - */ 2068 - int hns_dsaf_get_mac_mc_entry(struct dsaf_device *dsaf_dev, 2069 - struct dsaf_drv_mac_multi_dest_entry *mac_entry) 2070 - { 2071 - u16 entry_index = DSAF_INVALID_ENTRY_IDX; 2072 - struct dsaf_drv_tbl_tcam_key mac_key; 2073 - 2074 - struct dsaf_tbl_tcam_mcast_cfg mac_data; 2075 - struct dsaf_tbl_tcam_data tcam_data; 2076 - 2077 - /*check mac addr */ 2078 - if (MAC_IS_ALL_ZEROS(mac_entry->addr) || 2079 - MAC_IS_BROADCAST(mac_entry->addr)) { 2080 - dev_err(dsaf_dev->dev, "get_entry failed,addr %pM\n", 2081 - mac_entry->addr); 2082 - return -EINVAL; 2083 - } 2084 - 2085 - /*config key */ 2086 - hns_dsaf_set_mac_key(dsaf_dev, &mac_key, mac_entry->in_vlan_id, 2087 - mac_entry->in_port_num, mac_entry->addr); 2088 - 2089 - /*check exist? */ 2090 - entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key); 2091 - if (entry_index == DSAF_INVALID_ENTRY_IDX) { 2092 - /* find none, error */ 2093 - dev_err(dsaf_dev->dev, 2094 - "get_mac_uc_entry failed, %s Mac key(%#x:%#x)\n", 2095 - dsaf_dev->ae_dev.name, mac_key.high.val, 2096 - mac_key.low.val); 2097 - return -EINVAL; 2098 - } 2099 - dev_dbg(dsaf_dev->dev, 2100 - "get_mac_uc_entry, %s Mac key(%#x:%#x) entry_index%d\n", 2101 - dsaf_dev->ae_dev.name, mac_key.high.val, 2102 - mac_key.low.val, entry_index); 2103 - 2104 - /*read entry */ 2105 - hns_dsaf_tcam_mc_get(dsaf_dev, entry_index, &tcam_data, &mac_data); 2106 - 2107 - mac_key.high.val = le32_to_cpu(tcam_data.tbl_tcam_data_high); 2108 - mac_key.low.val = le32_to_cpu(tcam_data.tbl_tcam_data_low); 2109 - 2110 - mac_entry->port_mask[0] = mac_data.tbl_mcast_port_msk[0] & 0x3F; 2111 - return 0; 2112 - } 2113 - 2114 - /** 2115 - * hns_dsaf_get_mac_entry_by_index - get mac entry by tab index 2116 - * @dsaf_dev: dsa fabric device struct pointer 2117 - * @entry_index: tab entry index 2118 - * @mac_entry: mac entry 2119 - */ 2120 - int hns_dsaf_get_mac_entry_by_index( 2121 - struct dsaf_device *dsaf_dev, 2122 - u16 entry_index, struct dsaf_drv_mac_multi_dest_entry *mac_entry) 2123 - { 2124 - struct dsaf_drv_tbl_tcam_key mac_key; 2125 - 2126 - struct dsaf_tbl_tcam_mcast_cfg mac_data; 2127 - struct dsaf_tbl_tcam_ucast_cfg mac_uc_data; 2128 - struct dsaf_tbl_tcam_data tcam_data; 2129 - char mac_addr[ETH_ALEN] = {0}; 2130 - 2131 - if (entry_index >= dsaf_dev->tcam_max_num) { 2132 - /* find none, del error */ 2133 - dev_err(dsaf_dev->dev, "get_uc_entry failed, %s\n", 2134 - dsaf_dev->ae_dev.name); 2135 - return -EINVAL; 2136 - } 2137 - 2138 - /* mc entry, do read opt */ 2139 - hns_dsaf_tcam_mc_get(dsaf_dev, entry_index, &tcam_data, &mac_data); 2140 - 2141 - mac_key.high.val = le32_to_cpu(tcam_data.tbl_tcam_data_high); 2142 - mac_key.low.val = le32_to_cpu(tcam_data.tbl_tcam_data_low); 2143 - 2144 - mac_entry->port_mask[0] = mac_data.tbl_mcast_port_msk[0] & 0x3F; 2145 - 2146 - /***get mac addr*/ 2147 - mac_addr[0] = mac_key.high.bits.mac_0; 2148 - mac_addr[1] = mac_key.high.bits.mac_1; 2149 - mac_addr[2] = mac_key.high.bits.mac_2; 2150 - mac_addr[3] = mac_key.high.bits.mac_3; 2151 - mac_addr[4] = mac_key.low.bits.mac_4; 2152 - mac_addr[5] = mac_key.low.bits.mac_5; 2153 - /**is mc or uc*/ 2154 - if (MAC_IS_MULTICAST((u8 *)mac_addr) || 2155 - MAC_IS_L3_MULTICAST((u8 *)mac_addr)) { 2156 - /**mc donot do*/ 2157 - } else { 2158 - /*is not mc, just uc... */ 2159 - hns_dsaf_tcam_uc_get(dsaf_dev, entry_index, &tcam_data, 2160 - &mac_uc_data); 2161 - 2162 - mac_key.high.val = le32_to_cpu(tcam_data.tbl_tcam_data_high); 2163 - mac_key.low.val = le32_to_cpu(tcam_data.tbl_tcam_data_low); 2164 - 2165 - mac_entry->port_mask[0] = (1 << mac_uc_data.tbl_ucast_out_port); 2166 - } 2167 - 2168 - return 0; 2169 2090 } 2170 2091 2171 2092 static struct dsaf_device *hns_dsaf_alloc_dev(struct device *dev,
+1 -13
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
··· 68 68 }; 69 69 70 70 #define DSAF_STATS_READ(p, offset) (*((u64 *)((u8 *)(p) + (offset)))) 71 - #define HNS_DSAF_IS_DEBUG(dev) (dev->dsaf_mode == DSAF_MODE_DISABLE_SP) 71 + #define HNS_DSAF_IS_DEBUG(dev) ((dev)->dsaf_mode == DSAF_MODE_DISABLE_SP) 72 72 73 73 enum hal_dsaf_mode { 74 74 HRD_DSAF_NO_DSAF_MODE = 0x0, ··· 429 429 430 430 int hns_dsaf_set_mac_uc_entry(struct dsaf_device *dsaf_dev, 431 431 struct dsaf_drv_mac_single_dest_entry *mac_entry); 432 - int hns_dsaf_set_mac_mc_entry(struct dsaf_device *dsaf_dev, 433 - struct dsaf_drv_mac_multi_dest_entry *mac_entry); 434 432 int hns_dsaf_add_mac_mc_port(struct dsaf_device *dsaf_dev, 435 433 struct dsaf_drv_mac_single_dest_entry *mac_entry); 436 434 int hns_dsaf_del_mac_entry(struct dsaf_device *dsaf_dev, u16 vlan_id, 437 435 u8 in_port_num, u8 *addr); 438 436 int hns_dsaf_del_mac_mc_port(struct dsaf_device *dsaf_dev, 439 437 struct dsaf_drv_mac_single_dest_entry *mac_entry); 440 - int hns_dsaf_get_mac_uc_entry(struct dsaf_device *dsaf_dev, 441 - struct dsaf_drv_mac_single_dest_entry *mac_entry); 442 - int hns_dsaf_get_mac_mc_entry(struct dsaf_device *dsaf_dev, 443 - struct dsaf_drv_mac_multi_dest_entry *mac_entry); 444 - int hns_dsaf_get_mac_entry_by_index( 445 - struct dsaf_device *dsaf_dev, 446 - u16 entry_index, 447 - struct dsaf_drv_mac_multi_dest_entry *mac_entry); 448 - 449 438 void hns_dsaf_fix_mac_mode(struct hns_mac_cb *mac_cb); 450 439 451 440 int hns_dsaf_ae_init(struct dsaf_device *dsaf_dev); ··· 463 474 464 475 int hns_dsaf_clr_mac_mc_port(struct dsaf_device *dsaf_dev, 465 476 u8 mac_id, u8 port_num); 466 - 467 477 468 478 #endif /* __HNS_DSAF_MAIN_H__ */
+8 -9
drivers/net/ethernet/hisilicon/hns/hns_dsaf_ppe.c
··· 496 496 */ 497 497 int hns_ppe_init(struct dsaf_device *dsaf_dev) 498 498 { 499 - int i, k; 500 499 int ret; 500 + int i; 501 501 502 502 for (i = 0; i < HNS_PPE_COM_NUM; i++) { 503 503 ret = hns_ppe_common_get_cfg(dsaf_dev, i); 504 504 if (ret) 505 - goto get_ppe_cfg_fail; 505 + goto get_cfg_fail; 506 506 507 507 ret = hns_rcb_common_get_cfg(dsaf_dev, i); 508 508 if (ret) 509 - goto get_rcb_cfg_fail; 509 + goto get_cfg_fail; 510 510 511 511 hns_ppe_get_cfg(dsaf_dev->ppe_common[i]); 512 512 ··· 518 518 519 519 return 0; 520 520 521 - get_rcb_cfg_fail: 522 - hns_ppe_common_free_cfg(dsaf_dev, i); 523 - get_ppe_cfg_fail: 524 - for (k = i - 1; k >= 0; k--) { 525 - hns_rcb_common_free_cfg(dsaf_dev, k); 526 - hns_ppe_common_free_cfg(dsaf_dev, k); 521 + get_cfg_fail: 522 + for (i = 0; i < HNS_PPE_COM_NUM; i++) { 523 + hns_rcb_common_free_cfg(dsaf_dev, i); 524 + hns_ppe_common_free_cfg(dsaf_dev, i); 527 525 } 526 + 528 527 return ret; 529 528 } 530 529
+109 -38
drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
··· 32 32 #define RCB_RESET_WAIT_TIMES 30 33 33 #define RCB_RESET_TRY_TIMES 10 34 34 35 + /* Because default mtu is 1500, rcb buffer size is set to 2048 enough */ 36 + #define RCB_DEFAULT_BUFFER_SIZE 2048 37 + 35 38 /** 36 39 *hns_rcb_wait_fbd_clean - clean fbd 37 40 *@qs: ring struct pointer array ··· 195 192 wmb(); /* Sync point after breakpoint */ 196 193 } 197 194 195 + /* hns_rcb_set_tx_ring_bs - init rcb ring buf size regester 196 + *@q: hnae_queue 197 + *@buf_size: buffer size set to hw 198 + */ 199 + void hns_rcb_set_tx_ring_bs(struct hnae_queue *q, u32 buf_size) 200 + { 201 + u32 bd_size_type = hns_rcb_buf_size2type(buf_size); 202 + 203 + dsaf_write_dev(q, RCB_RING_TX_RING_BD_LEN_REG, 204 + bd_size_type); 205 + } 206 + 207 + /* hns_rcb_set_rx_ring_bs - init rcb ring buf size regester 208 + *@q: hnae_queue 209 + *@buf_size: buffer size set to hw 210 + */ 211 + void hns_rcb_set_rx_ring_bs(struct hnae_queue *q, u32 buf_size) 212 + { 213 + u32 bd_size_type = hns_rcb_buf_size2type(buf_size); 214 + 215 + dsaf_write_dev(q, RCB_RING_RX_RING_BD_LEN_REG, 216 + bd_size_type); 217 + } 218 + 198 219 /** 199 220 *hns_rcb_ring_init - init rcb ring 200 221 *@ring_pair: ring pair control block ··· 227 200 static void hns_rcb_ring_init(struct ring_pair_cb *ring_pair, int ring_type) 228 201 { 229 202 struct hnae_queue *q = &ring_pair->q; 230 - struct rcb_common_cb *rcb_common = ring_pair->rcb_common; 231 - u32 bd_size_type = rcb_common->dsaf_dev->buf_size_type; 232 203 struct hnae_ring *ring = 233 204 (ring_type == RX_RING) ? &q->rx_ring : &q->tx_ring; 234 205 dma_addr_t dma = ring->desc_dma_addr; ··· 237 212 dsaf_write_dev(q, RCB_RING_RX_RING_BASEADDR_H_REG, 238 213 (u32)((dma >> 31) >> 1)); 239 214 240 - dsaf_write_dev(q, RCB_RING_RX_RING_BD_LEN_REG, 241 - bd_size_type); 215 + hns_rcb_set_rx_ring_bs(q, ring->buf_size); 216 + 242 217 dsaf_write_dev(q, RCB_RING_RX_RING_BD_NUM_REG, 243 218 ring_pair->port_id_in_comm); 244 219 dsaf_write_dev(q, RCB_RING_RX_RING_PKTLINE_REG, ··· 249 224 dsaf_write_dev(q, RCB_RING_TX_RING_BASEADDR_H_REG, 250 225 (u32)((dma >> 31) >> 1)); 251 226 252 - dsaf_write_dev(q, RCB_RING_TX_RING_BD_LEN_REG, 253 - bd_size_type); 227 + hns_rcb_set_tx_ring_bs(q, ring->buf_size); 228 + 254 229 dsaf_write_dev(q, RCB_RING_TX_RING_BD_NUM_REG, 255 230 ring_pair->port_id_in_comm); 256 231 dsaf_write_dev(q, RCB_RING_TX_RING_PKTLINE_REG, 257 - ring_pair->port_id_in_comm); 232 + ring_pair->port_id_in_comm + HNS_RCB_TX_PKTLINE_OFFSET); 258 233 } 259 234 } 260 235 ··· 284 259 static void hns_rcb_set_port_timeout( 285 260 struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout) 286 261 { 287 - if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) 262 + if (AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) { 288 263 dsaf_write_dev(rcb_common, RCB_CFG_OVERTIME_REG, 289 264 timeout * HNS_RCB_CLK_FREQ_MHZ); 290 - else 265 + } else if (!HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev)) { 266 + if (timeout > HNS_RCB_DEF_GAP_TIME_USECS) 267 + dsaf_write_dev(rcb_common, 268 + RCB_PORT_INT_GAPTIME_REG + port_idx * 4, 269 + HNS_RCB_DEF_GAP_TIME_USECS); 270 + else 271 + dsaf_write_dev(rcb_common, 272 + RCB_PORT_INT_GAPTIME_REG + port_idx * 4, 273 + timeout); 274 + 291 275 dsaf_write_dev(rcb_common, 292 276 RCB_PORT_CFG_OVERTIME_REG + port_idx * 4, 293 277 timeout); 278 + } else { 279 + dsaf_write_dev(rcb_common, 280 + RCB_PORT_CFG_OVERTIME_REG + port_idx * 4, 281 + timeout); 282 + } 294 283 } 295 284 296 285 static int hns_rcb_common_get_port_num(struct rcb_common_cb *rcb_common) ··· 366 327 367 328 for (i = 0; i < port_num; i++) { 368 329 hns_rcb_set_port_desc_cnt(rcb_common, i, rcb_common->desc_num); 369 - (void)hns_rcb_set_coalesced_frames( 370 - rcb_common, i, HNS_RCB_DEF_COALESCED_FRAMES); 330 + hns_rcb_set_rx_coalesced_frames( 331 + rcb_common, i, HNS_RCB_DEF_RX_COALESCED_FRAMES); 332 + if (!AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver) && 333 + !HNS_DSAF_IS_DEBUG(rcb_common->dsaf_dev)) 334 + hns_rcb_set_tx_coalesced_frames( 335 + rcb_common, i, HNS_RCB_DEF_TX_COALESCED_FRAMES); 371 336 hns_rcb_set_port_timeout( 372 337 rcb_common, i, HNS_RCB_DEF_COALESCED_USECS); 373 338 } ··· 423 380 struct hnae_ring *ring; 424 381 struct rcb_common_cb *rcb_common; 425 382 struct ring_pair_cb *ring_pair_cb; 426 - u32 buf_size; 427 383 u16 desc_num, mdnum_ppkt; 428 384 bool irq_idx, is_ver1; 429 385 ··· 443 401 } 444 402 445 403 rcb_common = ring_pair_cb->rcb_common; 446 - buf_size = rcb_common->dsaf_dev->buf_size; 447 404 desc_num = rcb_common->dsaf_dev->desc_num; 448 405 449 406 ring->desc = NULL; ··· 451 410 ring->irq = ring_pair_cb->virq[irq_idx]; 452 411 ring->desc_dma_addr = 0; 453 412 454 - ring->buf_size = buf_size; 413 + ring->buf_size = RCB_DEFAULT_BUFFER_SIZE; 455 414 ring->desc_num = desc_num; 456 415 ring->max_desc_num_per_pkt = mdnum_ppkt; 457 416 ring->max_raw_data_sz_per_desc = HNS_RCB_MAX_PKT_SIZE; ··· 471 430 static int hns_rcb_get_port_in_comm( 472 431 struct rcb_common_cb *rcb_common, int ring_idx) 473 432 { 474 - 475 433 return ring_idx / (rcb_common->max_q_per_vf * rcb_common->max_vfn); 476 434 } 477 435 ··· 524 484 } 525 485 526 486 /** 527 - *hns_rcb_get_coalesced_frames - get rcb port coalesced frames 487 + *hns_rcb_get_rx_coalesced_frames - get rcb port rx coalesced frames 528 488 *@rcb_common: rcb_common device 529 489 *@port_idx:port id in comm 530 490 * 531 491 *Returns: coalesced_frames 532 492 */ 533 - u32 hns_rcb_get_coalesced_frames( 493 + u32 hns_rcb_get_rx_coalesced_frames( 534 494 struct rcb_common_cb *rcb_common, u32 port_idx) 535 495 { 536 496 return dsaf_read_dev(rcb_common, RCB_CFG_PKTLINE_REG + port_idx * 4); 497 + } 498 + 499 + /** 500 + *hns_rcb_get_tx_coalesced_frames - get rcb port tx coalesced frames 501 + *@rcb_common: rcb_common device 502 + *@port_idx:port id in comm 503 + * 504 + *Returns: coalesced_frames 505 + */ 506 + u32 hns_rcb_get_tx_coalesced_frames( 507 + struct rcb_common_cb *rcb_common, u32 port_idx) 508 + { 509 + u64 reg; 510 + 511 + reg = RCB_CFG_PKTLINE_REG + (port_idx + HNS_RCB_TX_PKTLINE_OFFSET) * 4; 512 + return dsaf_read_dev(rcb_common, reg); 537 513 } 538 514 539 515 /** ··· 594 538 return -EINVAL; 595 539 } 596 540 } 597 - if (timeout > HNS_RCB_MAX_COALESCED_USECS) { 541 + if (timeout > HNS_RCB_MAX_COALESCED_USECS || timeout == 0) { 598 542 dev_err(rcb_common->dsaf_dev->dev, 599 - "error: coalesce_usecs setting supports 0~1023us\n"); 543 + "error: coalesce_usecs setting supports 1~1023us\n"); 600 544 return -EINVAL; 601 545 } 602 - 603 - if (!AE_IS_VER1(rcb_common->dsaf_dev->dsaf_ver)) { 604 - if (timeout == 0) 605 - /* set timeout to 0, Disable gap time */ 606 - dsaf_set_reg_field(rcb_common->io_base, 607 - RCB_INT_GAP_TIME_REG + port_idx * 4, 608 - PPE_INT_GAPTIME_M, PPE_INT_GAPTIME_B, 609 - 0); 610 - else 611 - /* set timeout non 0, restore gap time to 1 */ 612 - dsaf_set_reg_field(rcb_common->io_base, 613 - RCB_INT_GAP_TIME_REG + port_idx * 4, 614 - PPE_INT_GAPTIME_M, PPE_INT_GAPTIME_B, 615 - 1); 616 - } 617 - 618 546 hns_rcb_set_port_timeout(rcb_common, port_idx, timeout); 619 547 return 0; 620 548 } 621 549 622 550 /** 623 - *hns_rcb_set_coalesced_frames - set rcb coalesced frames 551 + *hns_rcb_set_tx_coalesced_frames - set rcb coalesced frames 624 552 *@rcb_common: rcb_common device 625 553 *@port_idx:port id in comm 626 554 *@coalesced_frames:tx/rx BD num for coalesced frames ··· 612 572 * Returns: 613 573 * Zero for success, or an error code in case of failure 614 574 */ 615 - int hns_rcb_set_coalesced_frames( 575 + int hns_rcb_set_tx_coalesced_frames( 616 576 struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames) 617 577 { 618 - u32 old_waterline = hns_rcb_get_coalesced_frames(rcb_common, port_idx); 578 + u32 old_waterline = 579 + hns_rcb_get_tx_coalesced_frames(rcb_common, port_idx); 580 + u64 reg; 581 + 582 + if (coalesced_frames == old_waterline) 583 + return 0; 584 + 585 + if (coalesced_frames != 1) { 586 + dev_err(rcb_common->dsaf_dev->dev, 587 + "error: not support tx coalesce_frames setting!\n"); 588 + return -EINVAL; 589 + } 590 + 591 + reg = RCB_CFG_PKTLINE_REG + (port_idx + HNS_RCB_TX_PKTLINE_OFFSET) * 4; 592 + dsaf_write_dev(rcb_common, reg, coalesced_frames); 593 + return 0; 594 + } 595 + 596 + /** 597 + *hns_rcb_set_rx_coalesced_frames - set rcb rx coalesced frames 598 + *@rcb_common: rcb_common device 599 + *@port_idx:port id in comm 600 + *@coalesced_frames:tx/rx BD num for coalesced frames 601 + * 602 + * Returns: 603 + * Zero for success, or an error code in case of failure 604 + */ 605 + int hns_rcb_set_rx_coalesced_frames( 606 + struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames) 607 + { 608 + u32 old_waterline = 609 + hns_rcb_get_rx_coalesced_frames(rcb_common, port_idx); 619 610 620 611 if (coalesced_frames == old_waterline) 621 612 return 0;
+22 -4
drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
··· 35 35 36 36 #define HNS_RCB_REG_OFFSET 0x10000 37 37 38 + #define HNS_RCB_TX_FRAMES_LOW 1 39 + #define HNS_RCB_RX_FRAMES_LOW 1 40 + #define HNS_RCB_TX_FRAMES_HIGH 1023 41 + #define HNS_RCB_RX_FRAMES_HIGH 1023 42 + #define HNS_RCB_TX_USECS_LOW 1 43 + #define HNS_RCB_RX_USECS_LOW 1 44 + #define HNS_RCB_TX_USECS_HIGH 1023 45 + #define HNS_RCB_RX_USECS_HIGH 1023 38 46 #define HNS_RCB_MAX_COALESCED_FRAMES 1023 39 47 #define HNS_RCB_MIN_COALESCED_FRAMES 1 40 - #define HNS_RCB_DEF_COALESCED_FRAMES 50 48 + #define HNS_RCB_DEF_RX_COALESCED_FRAMES 50 49 + #define HNS_RCB_DEF_TX_COALESCED_FRAMES 1 41 50 #define HNS_RCB_CLK_FREQ_MHZ 350 42 51 #define HNS_RCB_MAX_COALESCED_USECS 0x3ff 43 - #define HNS_RCB_DEF_COALESCED_USECS 50 52 + #define HNS_RCB_DEF_COALESCED_USECS 30 53 + #define HNS_RCB_DEF_GAP_TIME_USECS 20 54 + #define HNS_RCB_TX_PKTLINE_OFFSET 8 44 55 45 56 #define HNS_RCB_COMMON_ENDIAN 1 46 57 ··· 136 125 void hns_rcb_init_hw(struct ring_pair_cb *ring); 137 126 void hns_rcb_reset_ring_hw(struct hnae_queue *q); 138 127 void hns_rcb_wait_fbd_clean(struct hnae_queue **qs, int q_num, u32 flag); 139 - u32 hns_rcb_get_coalesced_frames( 128 + u32 hns_rcb_get_rx_coalesced_frames( 129 + struct rcb_common_cb *rcb_common, u32 port_idx); 130 + u32 hns_rcb_get_tx_coalesced_frames( 140 131 struct rcb_common_cb *rcb_common, u32 port_idx); 141 132 u32 hns_rcb_get_coalesce_usecs( 142 133 struct rcb_common_cb *rcb_common, u32 port_idx); 143 134 int hns_rcb_set_coalesce_usecs( 144 135 struct rcb_common_cb *rcb_common, u32 port_idx, u32 timeout); 145 - int hns_rcb_set_coalesced_frames( 136 + int hns_rcb_set_rx_coalesced_frames( 137 + struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames); 138 + int hns_rcb_set_tx_coalesced_frames( 146 139 struct rcb_common_cb *rcb_common, u32 port_idx, u32 coalesced_frames); 147 140 void hns_rcb_update_stats(struct hnae_queue *queue); 148 141 ··· 161 146 void hns_rcb_get_ring_regs(struct hnae_queue *queue, void *data); 162 147 163 148 void hns_rcb_get_strings(int stringset, u8 *data, int index); 149 + void hns_rcb_set_rx_ring_bs(struct hnae_queue *q, u32 buf_size); 150 + void hns_rcb_set_tx_ring_bs(struct hnae_queue *q, u32 buf_size); 151 + 164 152 #endif /* _HNS_DSAF_RCB_H */
+5 -1
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
··· 421 421 #define RCB_CFG_OVERTIME_REG 0x9300 422 422 #define RCB_CFG_PKTLINE_INT_NUM_REG 0x9304 423 423 #define RCB_CFG_OVERTIME_INT_NUM_REG 0x9308 424 - #define RCB_INT_GAP_TIME_REG 0x9400 424 + #define RCB_PORT_INT_GAPTIME_REG 0x9400 425 425 #define RCB_PORT_CFG_OVERTIME_REG 0x9430 426 426 427 427 #define RCB_RING_RX_RING_BASEADDR_L_REG 0x00000 ··· 466 466 467 467 #define GMAC_DUPLEX_TYPE_REG 0x0008UL 468 468 #define GMAC_FD_FC_TYPE_REG 0x000CUL 469 + #define GMAC_TX_WATER_LINE_REG 0x0010UL 469 470 #define GMAC_FC_TX_TIMER_REG 0x001CUL 470 471 #define GMAC_FD_FC_ADDR_LOW_REG 0x0020UL 471 472 #define GMAC_FD_FC_ADDR_HIGH_REG 0x0024UL ··· 912 911 #define RCB_COM_CFG_FA_B 0 913 912 914 913 #define GMAC_DUPLEX_TYPE_B 0 914 + 915 + #define GMAC_TX_WATER_LINE_MASK ((1UL << 8) - 1) 916 + #define GMAC_TX_WATER_LINE_SHIFT 0 915 917 916 918 #define GMAC_FC_TX_TIMER_S 0 917 919 #define GMAC_FC_TX_TIMER_M 0xffff
-13
drivers/net/ethernet/hisilicon/hns/hns_dsaf_xgmac.c
··· 300 300 } 301 301 302 302 /** 303 - *hns_xgmac_get_id - get xgmac port id 304 - *@mac_drv: mac driver 305 - *@newval:xgmac max frame length 306 - */ 307 - static void hns_xgmac_get_id(void *mac_drv, u8 *mac_id) 308 - { 309 - struct mac_driver *drv = (struct mac_driver *)mac_drv; 310 - 311 - *mac_id = drv->mac_id; 312 - } 313 - 314 - /** 315 303 *hns_xgmac_config_max_frame_length - set xgmac max frame length 316 304 *@mac_drv: mac driver 317 305 *@newval:xgmac max frame length ··· 821 833 mac_drv->config_half_duplex = NULL; 822 834 mac_drv->set_rx_ignore_pause_frames = 823 835 hns_xgmac_set_rx_ignore_pause_frames; 824 - mac_drv->mac_get_id = hns_xgmac_get_id; 825 836 mac_drv->mac_free = hns_xgmac_free; 826 837 mac_drv->adjust_link = NULL; 827 838 mac_drv->set_tx_auto_pause_frames = hns_xgmac_set_tx_auto_pause_frames;
+313 -91
drivers/net/ethernet/hisilicon/hns/hns_enet.c
··· 512 512 int last_offset; 513 513 bool twobufs; 514 514 515 - twobufs = ((PAGE_SIZE < 8192) && hnae_buf_size(ring) == HNS_BUFFER_SIZE_2048); 515 + twobufs = ((PAGE_SIZE < 8192) && 516 + hnae_buf_size(ring) == HNS_BUFFER_SIZE_2048); 516 517 517 518 desc = &ring->desc[ring->next_to_clean]; 518 519 size = le16_to_cpu(desc->rx.size); ··· 860 859 return recv_pkts; 861 860 } 862 861 863 - static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data) 862 + static bool hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data) 864 863 { 865 864 struct hnae_ring *ring = ring_data->ring; 866 865 int num = 0; ··· 874 873 ring_data->ring->q->handle->dev->ops->toggle_ring_irq( 875 874 ring_data->ring, 1); 876 875 877 - napi_schedule(&ring_data->napi); 876 + return false; 877 + } else { 878 + return true; 878 879 } 879 880 } 880 881 881 - static void hns_nic_rx_fini_pro_v2(struct hns_nic_ring_data *ring_data) 882 + static bool hns_nic_rx_fini_pro_v2(struct hns_nic_ring_data *ring_data) 882 883 { 883 884 struct hnae_ring *ring = ring_data->ring; 884 - int num = 0; 885 + int num; 885 886 886 887 num = readl_relaxed(ring->io_base + RCB_REG_FBDNUM); 887 888 888 - if (num == 0) 889 - ring_data->ring->q->handle->dev->ops->toggle_ring_irq( 890 - ring, 0); 889 + if (!num) 890 + return true; 891 891 else 892 - napi_schedule(&ring_data->napi); 892 + return false; 893 893 } 894 894 895 895 static inline void hns_nic_reclaim_one_desc(struct hnae_ring *ring, ··· 923 921 924 922 /* netif_tx_lock will turn down the performance, set only when necessary */ 925 923 #ifdef CONFIG_NET_POLL_CONTROLLER 926 - #define NETIF_TX_LOCK(ndev) netif_tx_lock(ndev) 927 - #define NETIF_TX_UNLOCK(ndev) netif_tx_unlock(ndev) 924 + #define NETIF_TX_LOCK(ring) spin_lock(&(ring)->lock) 925 + #define NETIF_TX_UNLOCK(ring) spin_unlock(&(ring)->lock) 928 926 #else 929 - #define NETIF_TX_LOCK(ndev) 930 - #define NETIF_TX_UNLOCK(ndev) 927 + #define NETIF_TX_LOCK(ring) 928 + #define NETIF_TX_UNLOCK(ring) 931 929 #endif 930 + 932 931 /* reclaim all desc in one budget 933 932 * return error or number of desc left 934 933 */ ··· 943 940 int head; 944 941 int bytes, pkts; 945 942 946 - NETIF_TX_LOCK(ndev); 943 + NETIF_TX_LOCK(ring); 947 944 948 945 head = readl_relaxed(ring->io_base + RCB_REG_HEAD); 949 946 rmb(); /* make sure head is ready before touch any data */ 950 947 951 948 if (is_ring_empty(ring) || head == ring->next_to_clean) { 952 - NETIF_TX_UNLOCK(ndev); 949 + NETIF_TX_UNLOCK(ring); 953 950 return 0; /* no data to poll */ 954 951 } 955 952 ··· 957 954 netdev_err(ndev, "wrong head (%d, %d-%d)\n", head, 958 955 ring->next_to_use, ring->next_to_clean); 959 956 ring->stats.io_err_cnt++; 960 - NETIF_TX_UNLOCK(ndev); 957 + NETIF_TX_UNLOCK(ring); 961 958 return -EIO; 962 959 } 963 960 ··· 969 966 prefetch(&ring->desc_cb[ring->next_to_clean]); 970 967 } 971 968 972 - NETIF_TX_UNLOCK(ndev); 969 + NETIF_TX_UNLOCK(ring); 973 970 974 971 dev_queue = netdev_get_tx_queue(ndev, ring_data->queue_index); 975 972 netdev_tx_completed_queue(dev_queue, pkts, bytes); ··· 992 989 return 0; 993 990 } 994 991 995 - static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data) 992 + static bool hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data) 996 993 { 997 994 struct hnae_ring *ring = ring_data->ring; 998 995 int head; ··· 1005 1002 ring_data->ring->q->handle->dev->ops->toggle_ring_irq( 1006 1003 ring_data->ring, 1); 1007 1004 1008 - napi_schedule(&ring_data->napi); 1005 + return false; 1006 + } else { 1007 + return true; 1009 1008 } 1010 1009 } 1011 1010 1012 - static void hns_nic_tx_fini_pro_v2(struct hns_nic_ring_data *ring_data) 1011 + static bool hns_nic_tx_fini_pro_v2(struct hns_nic_ring_data *ring_data) 1013 1012 { 1014 1013 struct hnae_ring *ring = ring_data->ring; 1015 1014 int head = readl_relaxed(ring->io_base + RCB_REG_HEAD); 1016 1015 1017 1016 if (head == ring->next_to_clean) 1018 - ring_data->ring->q->handle->dev->ops->toggle_ring_irq( 1019 - ring, 0); 1017 + return true; 1020 1018 else 1021 - napi_schedule(&ring_data->napi); 1019 + return false; 1022 1020 } 1023 1021 1024 1022 static void hns_nic_tx_clr_all_bufs(struct hns_nic_ring_data *ring_data) ··· 1030 1026 int head; 1031 1027 int bytes, pkts; 1032 1028 1033 - NETIF_TX_LOCK(ndev); 1029 + NETIF_TX_LOCK(ring); 1034 1030 1035 1031 head = ring->next_to_use; /* ntu :soft setted ring position*/ 1036 1032 bytes = 0; ··· 1038 1034 while (head != ring->next_to_clean) 1039 1035 hns_nic_reclaim_one_desc(ring, &bytes, &pkts); 1040 1036 1041 - NETIF_TX_UNLOCK(ndev); 1037 + NETIF_TX_UNLOCK(ring); 1042 1038 1043 1039 dev_queue = netdev_get_tx_queue(ndev, ring_data->queue_index); 1044 1040 netdev_tx_reset_queue(dev_queue); ··· 1046 1042 1047 1043 static int hns_nic_common_poll(struct napi_struct *napi, int budget) 1048 1044 { 1045 + int clean_complete = 0; 1049 1046 struct hns_nic_ring_data *ring_data = 1050 1047 container_of(napi, struct hns_nic_ring_data, napi); 1051 - int clean_complete = ring_data->poll_one( 1052 - ring_data, budget, ring_data->ex_process); 1048 + struct hnae_ring *ring = ring_data->ring; 1053 1049 1054 - if (clean_complete >= 0 && clean_complete < budget) { 1055 - napi_complete(napi); 1056 - ring_data->fini_process(ring_data); 1057 - return 0; 1050 + try_again: 1051 + clean_complete += ring_data->poll_one( 1052 + ring_data, budget - clean_complete, 1053 + ring_data->ex_process); 1054 + 1055 + if (clean_complete < budget) { 1056 + if (ring_data->fini_process(ring_data)) { 1057 + napi_complete(napi); 1058 + ring->q->handle->dev->ops->toggle_ring_irq(ring, 0); 1059 + } else { 1060 + goto try_again; 1061 + } 1058 1062 } 1059 1063 1060 1064 return clean_complete; ··· 1208 1196 napi_disable(&priv->ring_data[idx].napi); 1209 1197 } 1210 1198 1211 - static void hns_set_irq_affinity(struct hns_nic_priv *priv) 1199 + static int hns_nic_init_affinity_mask(int q_num, int ring_idx, 1200 + struct hnae_ring *ring, cpumask_t *mask) 1212 1201 { 1213 - struct hnae_handle *h = priv->ae_handle; 1214 - struct hns_nic_ring_data *rd; 1215 - int i; 1216 1202 int cpu; 1217 - cpumask_var_t mask; 1218 1203 1219 - if (!alloc_cpumask_var(&mask, GFP_KERNEL)) 1220 - return; 1221 - 1222 - /*diffrent irq banlance for 16core and 32core*/ 1223 - if (h->q_num == num_possible_cpus()) { 1224 - for (i = 0; i < h->q_num * 2; i++) { 1225 - rd = &priv->ring_data[i]; 1226 - if (cpu_online(rd->queue_index)) { 1227 - cpumask_clear(mask); 1228 - cpu = rd->queue_index; 1229 - cpumask_set_cpu(cpu, mask); 1230 - (void)irq_set_affinity_hint(rd->ring->irq, 1231 - mask); 1232 - } 1233 - } 1204 + /* Diffrent irq banlance between 16core and 32core. 1205 + * The cpu mask set by ring index according to the ring flag 1206 + * which indicate the ring is tx or rx. 1207 + */ 1208 + if (q_num == num_possible_cpus()) { 1209 + if (is_tx_ring(ring)) 1210 + cpu = ring_idx; 1211 + else 1212 + cpu = ring_idx - q_num; 1234 1213 } else { 1235 - for (i = 0; i < h->q_num; i++) { 1236 - rd = &priv->ring_data[i]; 1237 - if (cpu_online(rd->queue_index * 2)) { 1238 - cpumask_clear(mask); 1239 - cpu = rd->queue_index * 2; 1240 - cpumask_set_cpu(cpu, mask); 1241 - (void)irq_set_affinity_hint(rd->ring->irq, 1242 - mask); 1243 - } 1244 - } 1245 - 1246 - for (i = h->q_num; i < h->q_num * 2; i++) { 1247 - rd = &priv->ring_data[i]; 1248 - if (cpu_online(rd->queue_index * 2 + 1)) { 1249 - cpumask_clear(mask); 1250 - cpu = rd->queue_index * 2 + 1; 1251 - cpumask_set_cpu(cpu, mask); 1252 - (void)irq_set_affinity_hint(rd->ring->irq, 1253 - mask); 1254 - } 1255 - } 1214 + if (is_tx_ring(ring)) 1215 + cpu = ring_idx * 2; 1216 + else 1217 + cpu = (ring_idx - q_num) * 2 + 1; 1256 1218 } 1257 1219 1258 - free_cpumask_var(mask); 1220 + cpumask_clear(mask); 1221 + cpumask_set_cpu(cpu, mask); 1222 + 1223 + return cpu; 1259 1224 } 1260 1225 1261 1226 static int hns_nic_init_irq(struct hns_nic_priv *priv) ··· 1241 1252 struct hns_nic_ring_data *rd; 1242 1253 int i; 1243 1254 int ret; 1255 + int cpu; 1244 1256 1245 1257 for (i = 0; i < h->q_num * 2; i++) { 1246 1258 rd = &priv->ring_data[i]; ··· 1251 1261 1252 1262 snprintf(rd->ring->ring_name, RCB_RING_NAME_LEN, 1253 1263 "%s-%s%d", priv->netdev->name, 1254 - (i < h->q_num ? "tx" : "rx"), rd->queue_index); 1264 + (is_tx_ring(rd->ring) ? "tx" : "rx"), rd->queue_index); 1255 1265 1256 1266 rd->ring->ring_name[RCB_RING_NAME_LEN - 1] = '\0'; 1257 1267 ··· 1263 1273 return ret; 1264 1274 } 1265 1275 disable_irq(rd->ring->irq); 1276 + 1277 + cpu = hns_nic_init_affinity_mask(h->q_num, i, 1278 + rd->ring, &rd->mask); 1279 + 1280 + if (cpu_online(cpu)) 1281 + irq_set_affinity_hint(rd->ring->irq, 1282 + &rd->mask); 1283 + 1266 1284 rd->ring->irq_init_flag = RCB_IRQ_INITED; 1267 1285 } 1268 - 1269 - /*set cpu affinity*/ 1270 - hns_set_irq_affinity(priv); 1271 1286 1272 1287 return 0; 1273 1288 } ··· 1482 1487 return (netdev_tx_t)ret; 1483 1488 } 1484 1489 1490 + static void hns_nic_drop_rx_fetch(struct hns_nic_ring_data *ring_data, 1491 + struct sk_buff *skb) 1492 + { 1493 + dev_kfree_skb_any(skb); 1494 + } 1495 + 1496 + #define HNS_LB_TX_RING 0 1497 + static struct sk_buff *hns_assemble_skb(struct net_device *ndev) 1498 + { 1499 + struct sk_buff *skb; 1500 + struct ethhdr *ethhdr; 1501 + int frame_len; 1502 + 1503 + /* allocate test skb */ 1504 + skb = alloc_skb(64, GFP_KERNEL); 1505 + if (!skb) 1506 + return NULL; 1507 + 1508 + skb_put(skb, 64); 1509 + skb->dev = ndev; 1510 + memset(skb->data, 0xFF, skb->len); 1511 + 1512 + /* must be tcp/ip package */ 1513 + ethhdr = (struct ethhdr *)skb->data; 1514 + ethhdr->h_proto = htons(ETH_P_IP); 1515 + 1516 + frame_len = skb->len & (~1ul); 1517 + memset(&skb->data[frame_len / 2], 0xAA, 1518 + frame_len / 2 - 1); 1519 + 1520 + skb->queue_mapping = HNS_LB_TX_RING; 1521 + 1522 + return skb; 1523 + } 1524 + 1525 + static int hns_enable_serdes_lb(struct net_device *ndev) 1526 + { 1527 + struct hns_nic_priv *priv = netdev_priv(ndev); 1528 + struct hnae_handle *h = priv->ae_handle; 1529 + struct hnae_ae_ops *ops = h->dev->ops; 1530 + int speed, duplex; 1531 + int ret; 1532 + 1533 + ret = ops->set_loopback(h, MAC_INTERNALLOOP_SERDES, 1); 1534 + if (ret) 1535 + return ret; 1536 + 1537 + ret = ops->start ? ops->start(h) : 0; 1538 + if (ret) 1539 + return ret; 1540 + 1541 + /* link adjust duplex*/ 1542 + if (h->phy_if != PHY_INTERFACE_MODE_XGMII) 1543 + speed = 1000; 1544 + else 1545 + speed = 10000; 1546 + duplex = 1; 1547 + 1548 + ops->adjust_link(h, speed, duplex); 1549 + 1550 + /* wait h/w ready */ 1551 + mdelay(300); 1552 + 1553 + return 0; 1554 + } 1555 + 1556 + static void hns_disable_serdes_lb(struct net_device *ndev) 1557 + { 1558 + struct hns_nic_priv *priv = netdev_priv(ndev); 1559 + struct hnae_handle *h = priv->ae_handle; 1560 + struct hnae_ae_ops *ops = h->dev->ops; 1561 + 1562 + ops->stop(h); 1563 + ops->set_loopback(h, MAC_INTERNALLOOP_SERDES, 0); 1564 + } 1565 + 1566 + /** 1567 + *hns_nic_clear_all_rx_fetch - clear the chip fetched descriptions. The 1568 + *function as follows: 1569 + * 1. if one rx ring has found the page_offset is not equal 0 between head 1570 + * and tail, it means that the chip fetched the wrong descs for the ring 1571 + * which buffer size is 4096. 1572 + * 2. we set the chip serdes loopback and set rss indirection to the ring. 1573 + * 3. construct 64-bytes ip broadcast packages, wait the associated rx ring 1574 + * recieving all packages and it will fetch new descriptions. 1575 + * 4. recover to the original state. 1576 + * 1577 + *@ndev: net device 1578 + */ 1579 + static int hns_nic_clear_all_rx_fetch(struct net_device *ndev) 1580 + { 1581 + struct hns_nic_priv *priv = netdev_priv(ndev); 1582 + struct hnae_handle *h = priv->ae_handle; 1583 + struct hnae_ae_ops *ops = h->dev->ops; 1584 + struct hns_nic_ring_data *rd; 1585 + struct hnae_ring *ring; 1586 + struct sk_buff *skb; 1587 + u32 *org_indir; 1588 + u32 *cur_indir; 1589 + int indir_size; 1590 + int head, tail; 1591 + int fetch_num; 1592 + int i, j; 1593 + bool found; 1594 + int retry_times; 1595 + int ret = 0; 1596 + 1597 + /* alloc indir memory */ 1598 + indir_size = ops->get_rss_indir_size(h) * sizeof(*org_indir); 1599 + org_indir = kzalloc(indir_size, GFP_KERNEL); 1600 + if (!org_indir) 1601 + return -ENOMEM; 1602 + 1603 + /* store the orginal indirection */ 1604 + ops->get_rss(h, org_indir, NULL, NULL); 1605 + 1606 + cur_indir = kzalloc(indir_size, GFP_KERNEL); 1607 + if (!cur_indir) { 1608 + ret = -ENOMEM; 1609 + goto cur_indir_alloc_err; 1610 + } 1611 + 1612 + /* set loopback */ 1613 + if (hns_enable_serdes_lb(ndev)) { 1614 + ret = -EINVAL; 1615 + goto enable_serdes_lb_err; 1616 + } 1617 + 1618 + /* foreach every rx ring to clear fetch desc */ 1619 + for (i = 0; i < h->q_num; i++) { 1620 + ring = &h->qs[i]->rx_ring; 1621 + head = readl_relaxed(ring->io_base + RCB_REG_HEAD); 1622 + tail = readl_relaxed(ring->io_base + RCB_REG_TAIL); 1623 + found = false; 1624 + fetch_num = ring_dist(ring, head, tail); 1625 + 1626 + while (head != tail) { 1627 + if (ring->desc_cb[head].page_offset != 0) { 1628 + found = true; 1629 + break; 1630 + } 1631 + 1632 + head++; 1633 + if (head == ring->desc_num) 1634 + head = 0; 1635 + } 1636 + 1637 + if (found) { 1638 + for (j = 0; j < indir_size / sizeof(*org_indir); j++) 1639 + cur_indir[j] = i; 1640 + ops->set_rss(h, cur_indir, NULL, 0); 1641 + 1642 + for (j = 0; j < fetch_num; j++) { 1643 + /* alloc one skb and init */ 1644 + skb = hns_assemble_skb(ndev); 1645 + if (!skb) 1646 + goto out; 1647 + rd = &tx_ring_data(priv, skb->queue_mapping); 1648 + hns_nic_net_xmit_hw(ndev, skb, rd); 1649 + 1650 + retry_times = 0; 1651 + while (retry_times++ < 10) { 1652 + mdelay(10); 1653 + /* clean rx */ 1654 + rd = &rx_ring_data(priv, i); 1655 + if (rd->poll_one(rd, fetch_num, 1656 + hns_nic_drop_rx_fetch)) 1657 + break; 1658 + } 1659 + 1660 + retry_times = 0; 1661 + while (retry_times++ < 10) { 1662 + mdelay(10); 1663 + /* clean tx ring 0 send package */ 1664 + rd = &tx_ring_data(priv, 1665 + HNS_LB_TX_RING); 1666 + if (rd->poll_one(rd, fetch_num, NULL)) 1667 + break; 1668 + } 1669 + } 1670 + } 1671 + } 1672 + 1673 + out: 1674 + /* restore everything */ 1675 + ops->set_rss(h, org_indir, NULL, 0); 1676 + hns_disable_serdes_lb(ndev); 1677 + enable_serdes_lb_err: 1678 + kfree(cur_indir); 1679 + cur_indir_alloc_err: 1680 + kfree(org_indir); 1681 + 1682 + return ret; 1683 + } 1684 + 1485 1685 static int hns_nic_change_mtu(struct net_device *ndev, int new_mtu) 1486 1686 { 1487 1687 struct hns_nic_priv *priv = netdev_priv(ndev); 1488 1688 struct hnae_handle *h = priv->ae_handle; 1689 + bool if_running = netif_running(ndev); 1489 1690 int ret; 1691 + 1692 + /* MTU < 68 is an error and causes problems on some kernels */ 1693 + if (new_mtu < 68) 1694 + return -EINVAL; 1695 + 1696 + /* MTU no change */ 1697 + if (new_mtu == ndev->mtu) 1698 + return 0; 1490 1699 1491 1700 if (!h->dev->ops->set_mtu) 1492 1701 return -ENOTSUPP; 1493 1702 1494 - if (netif_running(ndev)) { 1703 + if (if_running) { 1495 1704 (void)hns_nic_net_stop(ndev); 1496 1705 msleep(100); 1497 - 1498 - ret = h->dev->ops->set_mtu(h, new_mtu); 1499 - if (ret) 1500 - netdev_err(ndev, "set mtu fail, return value %d\n", 1501 - ret); 1502 - 1503 - if (hns_nic_net_open(ndev)) 1504 - netdev_err(ndev, "hns net open fail\n"); 1505 - } else { 1506 - ret = h->dev->ops->set_mtu(h, new_mtu); 1507 1706 } 1508 1707 1509 - if (!ret) 1510 - ndev->mtu = new_mtu; 1708 + if (priv->enet_ver != AE_VERSION_1 && 1709 + ndev->mtu <= BD_SIZE_2048_MAX_MTU && 1710 + new_mtu > BD_SIZE_2048_MAX_MTU) { 1711 + /* update desc */ 1712 + hnae_reinit_all_ring_desc(h); 1713 + 1714 + /* clear the package which the chip has fetched */ 1715 + ret = hns_nic_clear_all_rx_fetch(ndev); 1716 + 1717 + /* the page offset must be consist with desc */ 1718 + hnae_reinit_all_ring_page_off(h); 1719 + 1720 + if (ret) { 1721 + netdev_err(ndev, "clear the fetched desc fail\n"); 1722 + goto out; 1723 + } 1724 + } 1725 + 1726 + ret = h->dev->ops->set_mtu(h, new_mtu); 1727 + if (ret) { 1728 + netdev_err(ndev, "set mtu fail, return value %d\n", 1729 + ret); 1730 + goto out; 1731 + } 1732 + 1733 + /* finally, set new mtu to netdevice */ 1734 + ndev->mtu = new_mtu; 1735 + 1736 + out: 1737 + if (if_running) { 1738 + if (hns_nic_net_open(ndev)) { 1739 + netdev_err(ndev, "hns net open fail\n"); 1740 + ret = -EINVAL; 1741 + } 1742 + } 1511 1743 1512 1744 return ret; 1513 1745 } ··· 2013 1791 static void hns_nic_service_event_complete(struct hns_nic_priv *priv) 2014 1792 { 2015 1793 WARN_ON(!test_bit(NIC_STATE_SERVICE_SCHED, &priv->state)); 2016 - 1794 + /* make sure to commit the things */ 2017 1795 smp_mb__before_atomic(); 2018 1796 clear_bit(NIC_STATE_SERVICE_SCHED, &priv->state); 2019 1797 }
+2 -1
drivers/net/ethernet/hisilicon/hns/hns_enet.h
··· 37 37 struct hns_nic_ring_data { 38 38 struct hnae_ring *ring; 39 39 struct napi_struct napi; 40 + cpumask_t mask; /* affinity mask */ 40 41 int queue_index; 41 42 int (*poll_one)(struct hns_nic_ring_data *, int, void *); 42 43 void (*ex_process)(struct hns_nic_ring_data *, struct sk_buff *); 43 - void (*fini_process)(struct hns_nic_ring_data *); 44 + bool (*fini_process)(struct hns_nic_ring_data *); 44 45 }; 45 46 46 47 /* compatible the difference between two versions */
+15 -19
drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
··· 146 146 147 147 /* When there is no phy, autoneg is off. */ 148 148 cmd->base.autoneg = false; 149 - cmd->base.cmd = speed; 149 + cmd->base.speed = speed; 150 150 cmd->base.duplex = duplex; 151 151 152 152 if (net_dev->phydev) ··· 764 764 ec->use_adaptive_tx_coalesce = 1; 765 765 766 766 if ((!ops->get_coalesce_usecs) || 767 - (!ops->get_rx_max_coalesced_frames)) 767 + (!ops->get_max_coalesced_frames)) 768 768 return -ESRCH; 769 769 770 770 ops->get_coalesce_usecs(priv->ae_handle, 771 771 &ec->tx_coalesce_usecs, 772 772 &ec->rx_coalesce_usecs); 773 773 774 - ops->get_rx_max_coalesced_frames( 774 + ops->get_max_coalesced_frames( 775 775 priv->ae_handle, 776 776 &ec->tx_max_coalesced_frames, 777 777 &ec->rx_max_coalesced_frames); ··· 801 801 { 802 802 struct hns_nic_priv *priv = netdev_priv(net_dev); 803 803 struct hnae_ae_ops *ops; 804 - int ret; 804 + int rc1, rc2; 805 805 806 806 ops = priv->ae_handle->dev->ops; 807 807 808 808 if (ec->tx_coalesce_usecs != ec->rx_coalesce_usecs) 809 809 return -EINVAL; 810 810 811 - if (ec->rx_max_coalesced_frames != ec->tx_max_coalesced_frames) 812 - return -EINVAL; 813 - 814 811 if ((!ops->set_coalesce_usecs) || 815 812 (!ops->set_coalesce_frames)) 816 813 return -ESRCH; 817 814 818 - ret = ops->set_coalesce_usecs(priv->ae_handle, 815 + rc1 = ops->set_coalesce_usecs(priv->ae_handle, 819 816 ec->rx_coalesce_usecs); 820 - if (ret) 821 - return ret; 822 817 823 - ret = ops->set_coalesce_frames( 824 - priv->ae_handle, 825 - ec->rx_max_coalesced_frames); 818 + rc2 = ops->set_coalesce_frames(priv->ae_handle, 819 + ec->tx_max_coalesced_frames, 820 + ec->rx_max_coalesced_frames); 826 821 827 - return ret; 822 + if (rc1 || rc2) 823 + return -EINVAL; 824 + 825 + return 0; 828 826 } 829 827 830 828 /** ··· 1251 1253 1252 1254 ops = priv->ae_handle->dev->ops; 1253 1255 1254 - /* currently hfunc can only be Toeplitz hash */ 1255 - if (key || 1256 - (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP)) 1256 + if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) { 1257 + netdev_err(netdev, "Invalid hfunc!\n"); 1257 1258 return -EOPNOTSUPP; 1258 - if (!indir) 1259 - return 0; 1259 + } 1260 1260 1261 1261 return ops->set_rss(priv->ae_handle, indir, key, hfunc); 1262 1262 }
+6 -14
drivers/net/ethernet/hisilicon/hns_mdio.c
··· 23 23 #include <linux/phy.h> 24 24 #include <linux/platform_device.h> 25 25 #include <linux/regmap.h> 26 - #include <linux/spinlock_types.h> 27 26 28 27 #define MDIO_DRV_NAME "Hi-HNS_MDIO" 29 28 #define MDIO_BUS_NAME "Hisilicon MII Bus" 30 - #define MDIO_DRV_VERSION "1.3.0" 31 - #define MDIO_COPYRIGHT "Copyright(c) 2015 Huawei Corporation." 32 - #define MDIO_DRV_STRING MDIO_BUS_NAME 33 - #define MDIO_DEFAULT_DEVICE_DESCR MDIO_BUS_NAME 34 - 35 - #define MDIO_CTL_DEV_ADDR(x) (x & 0x1f) 36 - #define MDIO_CTL_PORT_ADDR(x) ((x & 0x1f) << 5) 37 29 38 30 #define MDIO_TIMEOUT 1000000 39 31 ··· 56 64 #define MDIO_CMD_DEVAD_S 0 57 65 #define MDIO_CMD_PRTAD_M 0x1f 58 66 #define MDIO_CMD_PRTAD_S 5 59 - #define MDIO_CMD_OP_M 0x3 60 67 #define MDIO_CMD_OP_S 10 61 - #define MDIO_CMD_ST_M 0x3 62 68 #define MDIO_CMD_ST_S 12 63 69 #define MDIO_CMD_START_B 14 64 70 ··· 175 185 static int hns_mdio_wait_ready(struct mii_bus *bus) 176 186 { 177 187 struct hns_mdio_device *mdio_dev = bus->priv; 188 + u32 cmd_reg_value; 178 189 int i; 179 - u32 cmd_reg_value = 1; 180 190 181 191 /* waitting for MDIO_COMMAND_REG 's mdio_start==0 */ 182 192 /* after that can do read or write*/ 183 - for (i = 0; cmd_reg_value; i++) { 193 + for (i = 0; i < MDIO_TIMEOUT; i++) { 184 194 cmd_reg_value = MDIO_GET_REG_BIT(mdio_dev, 185 195 MDIO_COMMAND_REG, 186 196 MDIO_CMD_START_B); 187 - if (i == MDIO_TIMEOUT) 188 - return -ETIMEDOUT; 197 + if (!cmd_reg_value) 198 + break; 189 199 } 200 + if ((i == MDIO_TIMEOUT) && cmd_reg_value) 201 + return -ETIMEDOUT; 190 202 191 203 return 0; 192 204 }