X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Focteontx2%2Fotx2_ethdev_ops.c;h=fc0fbd9f2489fc94f70995ac34392b54e9954300;hb=14d7ea259aebaacfa9326e54e881ab0e550f6a6e;hp=024c295aa6730171fbf15374a47125d461efcc6b;hpb=bdad90d12ec8eea8c9552880d715f10b0af93cc6;p=dpdk.git diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c index 024c295aa6..fc0fbd9f24 100644 --- a/drivers/net/octeontx2/otx2_ethdev_ops.c +++ b/drivers/net/octeontx2/otx2_ethdev_ops.c @@ -129,18 +129,22 @@ otx2_nix_promisc_config(struct rte_eth_dev *eth_dev, int en) otx2_nix_vlan_update_promisc(eth_dev, en); } -void +int otx2_nix_promisc_enable(struct rte_eth_dev *eth_dev) { otx2_nix_promisc_config(eth_dev, 1); nix_cgx_promisc_config(eth_dev, 1); + + return 0; } -void +int otx2_nix_promisc_disable(struct rte_eth_dev *eth_dev) { otx2_nix_promisc_config(eth_dev, 0); nix_cgx_promisc_config(eth_dev, 0); + + return 0; } static void @@ -163,16 +167,20 @@ nix_allmulticast_config(struct rte_eth_dev *eth_dev, int en) otx2_mbox_process(mbox); } -void +int otx2_nix_allmulticast_enable(struct rte_eth_dev *eth_dev) { nix_allmulticast_config(eth_dev, 1); + + return 0; } -void +int otx2_nix_allmulticast_disable(struct rte_eth_dev *eth_dev) { nix_allmulticast_config(eth_dev, 0); + + return 0; } void @@ -274,7 +282,7 @@ otx2_nix_rx_descriptor_status(void *rx_queue, uint16_t offset) struct otx2_eth_rxq *rxq = rx_queue; uint32_t head, tail; - if (rxq->qlen >= offset) + if (rxq->qlen <= offset) return -EINVAL; nix_rx_head_tail_get(otx2_eth_pmd_priv(rxq->eth_dev), @@ -286,6 +294,42 @@ otx2_nix_rx_descriptor_status(void *rx_queue, uint16_t offset) return RTE_ETH_RX_DESC_AVAIL; } +static void +nix_tx_head_tail_get(struct otx2_eth_dev *dev, + uint32_t *head, uint32_t *tail, uint16_t queue_idx) +{ + uint64_t reg, val; + + if (head == NULL || tail == NULL) + return; + + reg = (((uint64_t)queue_idx) << 32); + val = otx2_atomic64_add_nosync(reg, (int64_t *) + (dev->base + NIX_LF_SQ_OP_STATUS)); + if (val & OP_ERR) + val = 0; + + *tail = (uint32_t)((val >> 28) & 0x3F); + *head = (uint32_t)((val >> 20) & 0x3F); +} + +int +otx2_nix_tx_descriptor_status(void *tx_queue, uint16_t offset) +{ + struct otx2_eth_txq *txq = tx_queue; + uint32_t head, tail; + + if (txq->qconf.nb_desc <= offset) + return -EINVAL; + + nix_tx_head_tail_get(txq->dev, &head, &tail, txq->sq); + + if (nix_offset_has_packet(head, tail, offset)) + return RTE_ETH_TX_DESC_DONE; + else + return RTE_ETH_TX_DESC_FULL; +} + /* It is a NOP for octeontx2 as HW frees the buffer on xmit */ int otx2_nix_tx_done_cleanup(void *txq, uint32_t free_cnt)