net/atlantic: fix negative error codes
[dpdk.git] / drivers / net / atlantic / atl_rxtx.c
index 1d4c809..aea58c0 100644 (file)
@@ -21,6 +21,8 @@
 
 #define ATL_TX_OFFLOAD_MASK (                           \
        PKT_TX_VLAN |                                    \
+       PKT_TX_IPV6 |                                    \
+       PKT_TX_IPV4 |                                    \
        PKT_TX_IP_CKSUM |                                \
        PKT_TX_L4_MASK |                                 \
        PKT_TX_TCP_SEG)
@@ -336,6 +338,7 @@ int
 atl_rx_init(struct rte_eth_dev *eth_dev)
 {
        struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+       struct aq_rss_parameters *rss_params = &hw->aq_nic_cfg->aq_rss;
        struct atl_rx_queue *rxq;
        uint64_t base_addr = 0;
        int i = 0;
@@ -379,6 +382,10 @@ atl_rx_init(struct rte_eth_dev *eth_dev)
                }
        }
 
+       for (i = rss_params->indirection_table_size; i--;)
+               rss_params->indirection_table[i] = i &
+                       (eth_dev->data->nb_rx_queues - 1);
+       hw_atl_b0_hw_rss_set(hw, rss_params);
        return err;
 }
 
@@ -651,6 +658,145 @@ atl_stop_queues(struct rte_eth_dev *dev)
        return 0;
 }
 
+void
+atl_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+                struct rte_eth_rxq_info *qinfo)
+{
+       struct atl_rx_queue *rxq;
+
+       PMD_INIT_FUNC_TRACE();
+
+       rxq = dev->data->rx_queues[queue_id];
+
+       qinfo->mp = rxq->mb_pool;
+       qinfo->scattered_rx = dev->data->scattered_rx;
+       qinfo->nb_desc = rxq->nb_rx_desc;
+}
+
+void
+atl_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
+                struct rte_eth_txq_info *qinfo)
+{
+       struct atl_tx_queue *txq;
+
+       PMD_INIT_FUNC_TRACE();
+
+       txq = dev->data->tx_queues[queue_id];
+
+       qinfo->nb_desc = txq->nb_tx_desc;
+}
+
+/* Return Rx queue avail count */
+
+uint32_t
+atl_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
+{
+       struct atl_rx_queue *rxq;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (rx_queue_id >= dev->data->nb_rx_queues) {
+               PMD_DRV_LOG(ERR, "Invalid RX queue id=%d", rx_queue_id);
+               return 0;
+       }
+
+       rxq = dev->data->rx_queues[rx_queue_id];
+
+       if (rxq == NULL)
+               return 0;
+
+       return rxq->nb_rx_desc - rxq->nb_rx_hold;
+}
+
+int
+atl_dev_rx_descriptor_status(void *rx_queue, uint16_t offset)
+{
+       struct atl_rx_queue *rxq = rx_queue;
+       struct hw_atl_rxd_wb_s *rxd;
+       uint32_t idx;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (unlikely(offset >= rxq->nb_rx_desc))
+               return -EINVAL;
+
+       if (offset >= rxq->nb_rx_desc - rxq->nb_rx_hold)
+               return RTE_ETH_RX_DESC_UNAVAIL;
+
+       idx = rxq->rx_tail + offset;
+
+       if (idx >= rxq->nb_rx_desc)
+               idx -= rxq->nb_rx_desc;
+
+       rxd = (struct hw_atl_rxd_wb_s *)&rxq->hw_ring[idx];
+
+       if (rxd->dd)
+               return RTE_ETH_RX_DESC_DONE;
+
+       return RTE_ETH_RX_DESC_AVAIL;
+}
+
+int
+atl_dev_tx_descriptor_status(void *tx_queue, uint16_t offset)
+{
+       struct atl_tx_queue *txq = tx_queue;
+       struct hw_atl_txd_s *txd;
+       uint32_t idx;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (unlikely(offset >= txq->nb_tx_desc))
+               return -EINVAL;
+
+       idx = txq->tx_tail + offset;
+
+       if (idx >= txq->nb_tx_desc)
+               idx -= txq->nb_tx_desc;
+
+       txd = &txq->hw_ring[idx];
+
+       if (txd->dd)
+               return RTE_ETH_TX_DESC_DONE;
+
+       return RTE_ETH_TX_DESC_FULL;
+}
+
+static int
+atl_rx_enable_intr(struct rte_eth_dev *dev, uint16_t queue_id, bool enable)
+{
+       struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct atl_rx_queue *rxq;
+
+       PMD_INIT_FUNC_TRACE();
+
+       if (queue_id >= dev->data->nb_rx_queues) {
+               PMD_DRV_LOG(ERR, "Invalid RX queue id=%d", queue_id);
+               return -EINVAL;
+       }
+
+       rxq = dev->data->rx_queues[queue_id];
+
+       if (rxq == NULL)
+               return 0;
+
+       /* Mapping interrupt vector */
+       hw_atl_itr_irq_map_en_rx_set(hw, enable, queue_id);
+
+       return 0;
+}
+
+int
+atl_dev_rx_queue_intr_enable(struct rte_eth_dev *eth_dev, uint16_t queue_id)
+{
+       return atl_rx_enable_intr(eth_dev, queue_id, true);
+}
+
+int
+atl_dev_rx_queue_intr_disable(struct rte_eth_dev *eth_dev, uint16_t queue_id)
+{
+       return atl_rx_enable_intr(eth_dev, queue_id, false);
+}
+
 uint16_t
 atl_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
              uint16_t nb_pkts)
@@ -666,12 +812,12 @@ atl_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts,
                ol_flags = m->ol_flags;
 
                if (m->nb_segs > AQ_HW_MAX_SEGS_SIZE) {
-                       rte_errno = -EINVAL;
+                       rte_errno = EINVAL;
                        return i;
                }
 
                if (ol_flags & ATL_TX_OFFLOAD_NOTSUP_MASK) {
-                       rte_errno = -ENOTSUP;
+                       rte_errno = ENOTSUP;
                        return i;
                }
 
@@ -775,6 +921,8 @@ atl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        struct atl_adapter *adapter =
                ATL_DEV_TO_ADAPTER(&rte_eth_devices[rxq->port_id]);
        struct aq_hw_s *hw = ATL_DEV_PRIVATE_TO_HW(adapter);
+       struct aq_hw_cfg_s *cfg =
+               ATL_DEV_PRIVATE_TO_CFG(dev->data->dev_private);
        struct atl_rx_entry *sw_ring = rxq->sw_ring;
 
        struct rte_mbuf *new_mbuf;
@@ -838,7 +986,8 @@ atl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                                   "queue_id=%u", (unsigned int)rxq->port_id,
                                   (unsigned int)rxq->queue_id);
                                dev->data->rx_mbuf_alloc_failed++;
-                                               goto err_stop;
+                               adapter->sw_stats.rx_nombuf++;
+                               goto err_stop;
                        }
 
                        nb_hold++;
@@ -891,8 +1040,18 @@ atl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 
                        rx_mbuf->ol_flags =
                                atl_desc_to_offload_flags(rxq, &rxd_wb);
+
                        rx_mbuf->packet_type = atl_desc_to_pkt_type(&rxd_wb);
 
+                       if (rx_mbuf->packet_type & RTE_PTYPE_L2_ETHER_VLAN) {
+                               rx_mbuf->ol_flags |= PKT_RX_VLAN;
+                               rx_mbuf->vlan_tci = rxd_wb.vlan;
+
+                               if (cfg->vlan_strip)
+                                       rx_mbuf->ol_flags |=
+                                               PKT_RX_VLAN_STRIPPED;
+                       }
+
                        if (!rx_mbuf_first)
                                rx_mbuf_first = rx_mbuf;
                        rx_mbuf_first->nb_segs++;
@@ -921,6 +1080,9 @@ atl_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                 * of returned packets.
                 */
                rx_pkts[nb_rx++] = rx_mbuf_first;
+               adapter->sw_stats.q_ipackets[rxq->queue_id]++;
+               adapter->sw_stats.q_ibytes[rxq->queue_id] +=
+                       rx_mbuf_first->pkt_len;
 
                PMD_RX_LOG(ERR, "add mbuf segs=%d pkt_len=%d",
                        rx_mbuf_first->nb_segs,
@@ -1066,6 +1228,8 @@ static inline void
 atl_xmit_pkt(struct aq_hw_s *hw, struct atl_tx_queue *txq,
             struct rte_mbuf *tx_pkt)
 {
+       struct atl_adapter *adapter =
+               ATL_DEV_TO_ADAPTER(&rte_eth_devices[txq->port_id]);
        uint32_t pay_len = 0;
        int tail = 0;
        struct atl_tx_entry *tx_entry;
@@ -1146,6 +1310,9 @@ atl_xmit_pkt(struct aq_hw_s *hw, struct atl_tx_queue *txq,
        txq->tx_tail = tail;
 
        txq->tx_free -= desc_count;
+
+       adapter->sw_stats.q_opackets[txq->queue_id]++;
+       adapter->sw_stats.q_obytes[txq->queue_id] += pay_len;
 }
 
 uint16_t