fix typos using codespell utility
[dpdk.git] / drivers / net / enic / enic_main.c
index e3e58fb..2192c7f 100644 (file)
@@ -137,6 +137,7 @@ static void enic_clear_soft_stats(struct enic *enic)
        struct enic_soft_stats *soft_stats = &enic->soft_stats;
        rte_atomic64_clear(&soft_stats->rx_nombuf);
        rte_atomic64_clear(&soft_stats->rx_packet_errors);
+       rte_atomic64_clear(&soft_stats->tx_oversized);
 }
 
 static void enic_init_soft_stats(struct enic *enic)
@@ -144,6 +145,7 @@ static void enic_init_soft_stats(struct enic *enic)
        struct enic_soft_stats *soft_stats = &enic->soft_stats;
        rte_atomic64_init(&soft_stats->rx_nombuf);
        rte_atomic64_init(&soft_stats->rx_packet_errors);
+       rte_atomic64_init(&soft_stats->tx_oversized);
        enic_clear_soft_stats(enic);
 }
 
@@ -174,8 +176,7 @@ void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
         * which can make ibytes be slightly higher than it should be.
         */
        rx_packet_errors = rte_atomic64_read(&soft_stats->rx_packet_errors);
-       rx_truncated = rx_packet_errors - stats->rx.rx_errors -
-               stats->rx.rx_no_bufs;
+       rx_truncated = rx_packet_errors - stats->rx.rx_errors;
 
        r_stats->ipackets = stats->rx.rx_frames_ok - rx_truncated;
        r_stats->opackets = stats->tx.tx_frames_ok;
@@ -184,42 +185,36 @@ void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
        r_stats->obytes = stats->tx.tx_bytes_ok;
 
        r_stats->ierrors = stats->rx.rx_errors + stats->rx.rx_drop;
-       r_stats->oerrors = stats->tx.tx_errors;
+       r_stats->oerrors = stats->tx.tx_errors
+                          + rte_atomic64_read(&soft_stats->tx_oversized);
 
        r_stats->imissed = stats->rx.rx_no_bufs + rx_truncated;
 
        r_stats->rx_nombuf = rte_atomic64_read(&soft_stats->rx_nombuf);
 }
 
-void enic_del_mac_address(struct enic *enic)
+void enic_del_mac_address(struct enic *enic, int mac_index)
 {
-       if (vnic_dev_del_addr(enic->vdev, enic->mac_addr))
+       struct rte_eth_dev *eth_dev = enic->rte_dev;
+       uint8_t *mac_addr = eth_dev->data->mac_addrs[mac_index].addr_bytes;
+
+       if (vnic_dev_del_addr(enic->vdev, mac_addr))
                dev_err(enic, "del mac addr failed\n");
 }
 
-void enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)
+int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)
 {
        int err;
 
        if (!is_eth_addr_valid(mac_addr)) {
                dev_err(enic, "invalid mac address\n");
-               return;
-       }
-
-       err = vnic_dev_del_addr(enic->vdev, enic->mac_addr);
-       if (err) {
-               dev_err(enic, "del mac addr failed\n");
-               return;
+               return -EINVAL;
        }
 
-       ether_addr_copy((struct ether_addr *)mac_addr,
-               (struct ether_addr *)enic->mac_addr);
-
        err = vnic_dev_add_addr(enic->vdev, mac_addr);
-       if (err) {
+       if (err)
                dev_err(enic, "add mac addr failed\n");
-               return;
-       }
+       return err;
 }
 
 static void
@@ -241,14 +236,14 @@ void enic_init_vnic_resources(struct enic *enic)
        struct vnic_rq *data_rq;
 
        for (index = 0; index < enic->rq_count; index++) {
-               cq_idx = enic_cq_rq(enic, enic_sop_rq(index));
+               cq_idx = enic_cq_rq(enic, enic_rte_rq_idx_to_sop_idx(index));
 
-               vnic_rq_init(&enic->rq[enic_sop_rq(index)],
+               vnic_rq_init(&enic->rq[enic_rte_rq_idx_to_sop_idx(index)],
                        cq_idx,
                        error_interrupt_enable,
                        error_interrupt_offset);
 
-               data_rq = &enic->rq[enic_data_rq(index)];
+               data_rq = &enic->rq[enic_rte_rq_idx_to_data_idx(index)];
                if (data_rq->in_use)
                        vnic_rq_init(data_rq,
                                     cq_idx,
@@ -427,8 +422,7 @@ int enic_link_update(struct enic *enic)
 }
 
 static void
-enic_intr_handler(__rte_unused struct rte_intr_handle *handle,
-       void *arg)
+enic_intr_handler(void *arg)
 {
        struct rte_eth_dev *dev = (struct rte_eth_dev *)arg;
        struct enic *enic = pmd_priv(dev);
@@ -436,7 +430,7 @@ enic_intr_handler(__rte_unused struct rte_intr_handle *handle,
        vnic_intr_return_all_credits(&enic->intr);
 
        enic_link_update(enic);
-       _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC);
+       _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
        enic_log_q_error(enic);
 }
 
@@ -462,17 +456,17 @@ int enic_enable(struct enic *enic)
 
        for (index = 0; index < enic->rq_count; index++) {
                err = enic_alloc_rx_queue_mbufs(enic,
-                       &enic->rq[enic_sop_rq(index)]);
+                       &enic->rq[enic_rte_rq_idx_to_sop_idx(index)]);
                if (err) {
                        dev_err(enic, "Failed to alloc sop RX queue mbufs\n");
                        return err;
                }
                err = enic_alloc_rx_queue_mbufs(enic,
-                       &enic->rq[enic_data_rq(index)]);
+                       &enic->rq[enic_rte_rq_idx_to_data_idx(index)]);
                if (err) {
                        /* release the allocated mbufs for the sop rq*/
                        enic_rxmbuf_queue_release(enic,
-                               &enic->rq[enic_sop_rq(index)]);
+                               &enic->rq[enic_rte_rq_idx_to_sop_idx(index)]);
 
                        dev_err(enic, "Failed to alloc data RX queue mbufs\n");
                        return err;
@@ -541,7 +535,7 @@ void enic_free_rq(void *rxq)
        if (rq_data->in_use)
                vnic_rq_free(rq_data);
 
-       vnic_cq_free(&enic->cq[rq_sop->index]);
+       vnic_cq_free(&enic->cq[enic_sop_rq_idx_to_cq_idx(rq_sop->index)]);
 
        rq_sop->in_use = 0;
        rq_data->in_use = 0;
@@ -569,8 +563,10 @@ int enic_stop_wq(struct enic *enic, uint16_t queue_idx)
 
 void enic_start_rq(struct enic *enic, uint16_t queue_idx)
 {
-       struct vnic_rq *rq_sop = &enic->rq[enic_sop_rq(queue_idx)];
-       struct vnic_rq *rq_data = &enic->rq[rq_sop->data_queue_idx];
+       struct vnic_rq *rq_sop;
+       struct vnic_rq *rq_data;
+       rq_sop = &enic->rq[enic_rte_rq_idx_to_sop_idx(queue_idx)];
+       rq_data = &enic->rq[rq_sop->data_queue_idx];
        struct rte_eth_dev *eth_dev = enic->rte_dev;
 
        if (rq_data->in_use)
@@ -584,8 +580,10 @@ int enic_stop_rq(struct enic *enic, uint16_t queue_idx)
 {
        int ret1 = 0, ret2 = 0;
        struct rte_eth_dev *eth_dev = enic->rte_dev;
-       struct vnic_rq *rq_sop = &enic->rq[enic_sop_rq(queue_idx)];
-       struct vnic_rq *rq_data = &enic->rq[rq_sop->data_queue_idx];
+       struct vnic_rq *rq_sop;
+       struct vnic_rq *rq_data;
+       rq_sop = &enic->rq[enic_rte_rq_idx_to_sop_idx(queue_idx)];
+       rq_data = &enic->rq[rq_sop->data_queue_idx];
 
        ret2 = vnic_rq_disable(rq_sop);
        rte_mb();
@@ -603,11 +601,11 @@ int enic_stop_rq(struct enic *enic, uint16_t queue_idx)
 
 int enic_alloc_rq(struct enic *enic, uint16_t queue_idx,
        unsigned int socket_id, struct rte_mempool *mp,
-       uint16_t nb_desc)
+       uint16_t nb_desc, uint16_t free_thresh)
 {
        int rc;
-       uint16_t sop_queue_idx = enic_sop_rq(queue_idx);
-       uint16_t data_queue_idx = enic_data_rq(queue_idx);
+       uint16_t sop_queue_idx = enic_rte_rq_idx_to_sop_idx(queue_idx);
+       uint16_t data_queue_idx = enic_rte_rq_idx_to_data_idx(queue_idx);
        struct vnic_rq *rq_sop = &enic->rq[sop_queue_idx];
        struct vnic_rq *rq_data = &enic->rq[data_queue_idx];
        unsigned int mbuf_size, mbufs_per_pkt;
@@ -624,6 +622,10 @@ int enic_alloc_rq(struct enic *enic, uint16_t queue_idx,
        rq_data->socket_id = socket_id;
        rq_data->mp = mp;
        rq_sop->in_use = 1;
+       rq_sop->rx_free_thresh = free_thresh;
+       rq_data->rx_free_thresh = free_thresh;
+       dev_debug(enic, "Set queue_id:%u free thresh:%u\n", queue_idx,
+                 free_thresh);
 
        mbuf_size = (uint16_t)(rte_pktmbuf_data_room_size(mp) -
                               RTE_PKTMBUF_HEADROOM);
@@ -640,10 +642,12 @@ int enic_alloc_rq(struct enic *enic, uint16_t queue_idx,
 
        if (mbufs_per_pkt > 1) {
                dev_info(enic, "Rq %u Scatter rx mode in use\n", queue_idx);
+               rq_sop->data_queue_enable = 1;
                rq_data->in_use = 1;
        } else {
                dev_info(enic, "Rq %u Scatter rx mode not being used\n",
                         queue_idx);
+               rq_sop->data_queue_enable = 0;
                rq_data->in_use = 0;
        }
 
@@ -963,7 +967,7 @@ static int enic_set_rsscpu(struct enic *enic, u8 rss_hash_bits)
 
        for (i = 0; i < (1 << rss_hash_bits); i++)
                (*rss_cpu_buf_va).cpu[i / 4].b[i % 4] =
-                       enic_sop_rq(i % enic->rq_count);
+                       enic_rte_rq_idx_to_sop_idx(i % enic->rq_count);
 
        err = enic_set_rss_cpu(enic,
                rss_cpu_buf_pa,
@@ -1115,8 +1119,8 @@ enic_reinit_rq(struct enic *enic, unsigned int rq_idx)
        unsigned int cq_idx = enic_cq_rq(enic, rq_idx);
        int rc = 0;
 
-       sop_rq = &enic->rq[enic_sop_rq(rq_idx)];
-       data_rq = &enic->rq[enic_data_rq(rq_idx)];
+       sop_rq = &enic->rq[enic_rte_rq_idx_to_sop_idx(rq_idx)];
+       data_rq = &enic->rq[enic_rte_rq_idx_to_data_idx(rq_idx)];
 
        vnic_cq_clean(&enic->cq[cq_idx]);
        vnic_cq_init(&enic->cq[cq_idx],
@@ -1132,12 +1136,14 @@ enic_reinit_rq(struct enic *enic, unsigned int rq_idx)
                     0 /* cq_message_addr */);
 
 
-       vnic_rq_init_start(sop_rq, enic_cq_rq(enic, enic_sop_rq(rq_idx)),
-                          0, sop_rq->ring.desc_count - 1, 1, 0);
+       vnic_rq_init_start(sop_rq, enic_cq_rq(enic,
+                          enic_rte_rq_idx_to_sop_idx(rq_idx)), 0,
+                          sop_rq->ring.desc_count - 1, 1, 0);
        if (data_rq->in_use) {
                vnic_rq_init_start(data_rq,
-                                  enic_cq_rq(enic, enic_data_rq(rq_idx)),
-                                  0, data_rq->ring.desc_count - 1, 1, 0);
+                                  enic_cq_rq(enic,
+                                  enic_rte_rq_idx_to_data_idx(rq_idx)), 0,
+                                  data_rq->ring.desc_count - 1, 1, 0);
        }
 
        rc = enic_alloc_rx_queue_mbufs(enic, sop_rq);
@@ -1210,7 +1216,8 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu)
        for (rq_idx = 0; rq_idx < enic->rq_count * 2; rq_idx++) {
                rq = &enic->rq[rq_idx];
                if (rq->is_sop && rq->in_use) {
-                       rc = enic_stop_rq(enic, enic_rq_sop(rq_idx));
+                       rc = enic_stop_rq(enic,
+                                         enic_sop_rq_idx_to_rte_idx(rq_idx));
                        if (rc) {
                                dev_err(enic, "Failed to stop Rq %u\n", rq_idx);
                                goto set_mtu_done;
@@ -1218,7 +1225,7 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu)
                }
        }
 
-       /* replace Rx funciton with a no-op to avoid getting stale pkts */
+       /* replace Rx function with a no-op to avoid getting stale pkts */
        eth_dev->rx_pkt_burst = enic_dummy_recv_pkts;
        rte_mb();
 
@@ -1232,11 +1239,11 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu)
 
        /* free and reallocate RQs with the new MTU */
        for (rq_idx = 0; rq_idx < enic->rq_count; rq_idx++) {
-               rq = &enic->rq[enic_sop_rq(rq_idx)];
+               rq = &enic->rq[enic_rte_rq_idx_to_sop_idx(rq_idx)];
 
                enic_free_rq(rq);
                rc = enic_alloc_rq(enic, rq_idx, rq->socket_id, rq->mp,
-                                  rq->tot_nb_desc);
+                                  rq->tot_nb_desc, rq->rx_free_thresh);
                if (rc) {
                        dev_err(enic,
                                "Fatal MTU alloc error- No traffic will pass\n");
@@ -1258,7 +1265,7 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu)
 
        /* restart Rx traffic */
        for (rq_idx = 0; rq_idx < enic->rq_count; rq_idx++) {
-               rq = &enic->rq[enic_sop_rq(rq_idx)];
+               rq = &enic->rq[enic_rte_rq_idx_to_sop_idx(rq_idx)];
                if (rq->is_sop && rq->in_use)
                        enic_start_rq(enic, rq_idx);
        }
@@ -1293,16 +1300,23 @@ static int enic_dev_init(struct enic *enic)
                return -EINVAL;
        }
 
-       eth_dev->data->mac_addrs = rte_zmalloc("enic_mac_addr", ETH_ALEN, 0);
+       /* Get the supported filters */
+       enic_fdir_info(enic);
+
+       eth_dev->data->mac_addrs = rte_zmalloc("enic_mac_addr", ETH_ALEN
+                                               * ENIC_MAX_MAC_ADDR, 0);
        if (!eth_dev->data->mac_addrs) {
                dev_err(enic, "mac addr storage alloc failed, aborting.\n");
                return -1;
        }
        ether_addr_copy((struct ether_addr *) enic->mac_addr,
-               &eth_dev->data->mac_addrs[0]);
+                       eth_dev->data->mac_addrs);
 
        vnic_dev_set_reset_flag(enic->vdev, 0);
 
+       LIST_INIT(&enic->flows);
+       rte_spinlock_init(&enic->flows_lock);
+
        /* set up link status checking */
        vnic_dev_notify_set(enic->vdev, -1); /* No Intr for notify */