X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhinic%2Fhinic_pmd_rx.c;h=842399cc4cd8ccf9e05626047e877b01d59d2bd5;hb=ed9726ce83eb7562b3dcfaf0ee10647ed816ae4a;hp=f1b873afb782029b81a1c7395f3d146131e49b72;hpb=1b7b9f170fcebbbd0708fab554dcb5a7badef8cf;p=dpdk.git diff --git a/drivers/net/hinic/hinic_pmd_rx.c b/drivers/net/hinic/hinic_pmd_rx.c index f1b873afb7..842399cc4c 100644 --- a/drivers/net/hinic/hinic_pmd_rx.c +++ b/drivers/net/hinic/hinic_pmd_rx.c @@ -4,7 +4,7 @@ #include #include -#ifdef __ARM64_NEON__ +#ifdef RTE_ARCH_ARM64 #include #endif @@ -413,7 +413,8 @@ void hinic_free_all_rx_resources(struct rte_eth_dev *eth_dev) HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(eth_dev); for (q_id = 0; q_id < nic_dev->num_rq; q_id++) { - eth_dev->data->rx_queues[q_id] = NULL; + if (eth_dev->data->rx_queues != NULL) + eth_dev->data->rx_queues[q_id] = NULL; if (nic_dev->rxqs[q_id] == NULL) continue; @@ -531,7 +532,7 @@ static void hinic_fillout_indir_tbl(struct hinic_nic_dev *nic_dev, u32 *indir) } static int hinic_rss_init(struct hinic_nic_dev *nic_dev, - __attribute__((unused)) u8 *rq2iq_map, + __rte_unused u8 *rq2iq_map, struct rte_eth_rss_conf *rss_conf) { u32 indir_tbl[HINIC_RSS_INDIR_SIZE] = {0}; @@ -656,6 +657,10 @@ int hinic_rx_configure(struct rte_eth_dev *dev) struct rte_eth_rss_conf rss_conf = dev->data->dev_conf.rx_adv_conf.rss_conf; int err; + bool lro_en; + int max_lro_size; + int lro_wqe_num; + int buf_size; if (nic_dev->flags & ETH_MQ_RX_RSS_FLAG) { if (rss_conf.rss_hf == 0) { @@ -681,15 +686,42 @@ int hinic_rx_configure(struct rte_eth_dev *dev) if (err) goto rx_csum_ofl_err; + /* config lro */ + lro_en = dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO ? + true : false; + max_lro_size = dev->data->dev_conf.rxmode.max_lro_pkt_size; + buf_size = nic_dev->hwdev->nic_io->rq_buf_size; + lro_wqe_num = max_lro_size / buf_size ? (max_lro_size / buf_size) : 1; + + err = hinic_set_rx_lro(nic_dev->hwdev, lro_en, lro_en, lro_wqe_num); + if (err) { + PMD_DRV_LOG(ERR, "%s %s lro failed, err: %d, max_lro_size: %d", + dev->data->name, lro_en ? "Enable" : "Disable", + err, max_lro_size); + goto set_rx_lro_err; + } + return 0; +set_rx_lro_err: rx_csum_ofl_err: rss_config_err: + hinic_destroy_num_qps(nic_dev); return HINIC_ERROR; } +static void hinic_rx_remove_lro(struct hinic_nic_dev *nic_dev) +{ + int err; + + err = hinic_set_rx_lro(nic_dev->hwdev, false, false, 0); + if (err) + PMD_DRV_LOG(ERR, "%s disable LRO failed", + nic_dev->proc_dev_name); +} + void hinic_rx_remove_configure(struct rte_eth_dev *dev) { struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); @@ -698,6 +730,8 @@ void hinic_rx_remove_configure(struct rte_eth_dev *dev) hinic_rss_deinit(nic_dev); hinic_destroy_num_qps(nic_dev); } + + hinic_rx_remove_lro(nic_dev); } void hinic_free_all_rx_mbufs(struct hinic_rxq *rxq) @@ -728,7 +762,7 @@ void hinic_free_all_rx_mbufs(struct hinic_rxq *rxq) static inline void hinic_rq_cqe_be_to_cpu32(void *dst_le32, volatile void *src_be32) { -#if defined(__X86_64_SSE__) +#if defined(RTE_ARCH_X86_64) volatile __m128i *wqe_be = (volatile __m128i *)src_be32; __m128i *wqe_le = (__m128i *)dst_le32; __m128i shuf_mask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, @@ -736,7 +770,7 @@ static inline void hinic_rq_cqe_be_to_cpu32(void *dst_le32, /* l2nic just use first 128 bits */ wqe_le[0] = _mm_shuffle_epi8(wqe_be[0], shuf_mask); -#elif defined(__ARM64_NEON__) +#elif defined(RTE_ARCH_ARM64) volatile uint8x16_t *wqe_be = (volatile uint8x16_t *)src_be32; uint8x16_t *wqe_le = (uint8x16_t *)dst_le32; const uint8x16_t shuf_mask = {3, 2, 1, 0, 7, 6, 5, 4, 11, 10, @@ -956,7 +990,7 @@ u16 hinic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, u16 nb_pkts) volatile struct hinic_rq_cqe *rx_cqe; u16 rx_buf_len, pkts = 0; u16 sw_ci, ci_mask, wqebb_cnt = 0; - u32 pkt_len, status, vlan_len; + u32 pkt_len, status, vlan_len, lro_num; u64 rx_bytes = 0; struct hinic_rq_cqe cqe; u32 offload_type, rss_hash; @@ -1024,6 +1058,13 @@ u16 hinic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, u16 nb_pkts) rxm->ol_flags |= hinic_rx_rss_hash(offload_type, rss_hash, &rxm->hash.rss); + /* lro offload */ + lro_num = HINIC_GET_RX_NUM_LRO(cqe.status); + if (unlikely(lro_num != 0)) { + rxm->ol_flags |= PKT_RX_LRO; + rxm->tso_segsz = pkt_len / lro_num; + } + /* 6. clear done bit */ rx_cqe->status = 0;