MQ RX needs per-queue state for NAPI, queue handles/IRQs, RX rings,
buffer-list DMA mappings, and buffer pools. The current driver stores
most of this as single instances tied to queue 0.

Convert those fields to queue-indexed layouts sized by
IBMVETH_MAX_RX_QUEUES:

  rx_queue[]
  napi[]
  queue_handle[] / queue_irq[]
  buffer_list_addr[] / buffer_list_dma[]
  rx_buff_pool[queue][pool]

and add num_rx_queues to track how many RX queues are active.

This patch keeps behavior unchanged by mechanically switching existing
references to index 0 — e.g. rx_queue[0], rx_buff_pool[0][pool], and
napi[0]. open/poll/close still drive a single RX queue only.

The goal is to make later helper and datapath patches queue-aware
without mixing structural churn and behavior changes in one commit.

Signed-off-by: Mingming Cao <[email protected]>
Reviewed-by: Dave Marquardt <[email protected]>
---
 drivers/net/ethernet/ibm/ibmveth.c | 195 +++++++++++++++--------------
 drivers/net/ethernet/ibm/ibmveth.h |  16 ++-
 2 files changed, 112 insertions(+), 99 deletions(-)

diff --git a/drivers/net/ethernet/ibm/ibmveth.c 
b/drivers/net/ethernet/ibm/ibmveth.c
index af287eeafc0c..4f9dbee7477d 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c
@@ -101,7 +101,7 @@ static struct ibmveth_stat ibmveth_stats[] = {
 /* simple methods of getting data from the current rxq entry */
 static inline u32 ibmveth_rxq_flags(struct ibmveth_adapter *adapter)
 {
-       return 
be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].flags_off);
+       return 
be32_to_cpu(adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].flags_off);
 }
 
 static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter)
@@ -112,7 +112,7 @@ static inline int ibmveth_rxq_toggle(struct ibmveth_adapter 
*adapter)
 
 static inline int ibmveth_rxq_pending_buffer(struct ibmveth_adapter *adapter)
 {
-       return ibmveth_rxq_toggle(adapter) == adapter->rx_queue.toggle;
+       return ibmveth_rxq_toggle(adapter) == adapter->rx_queue[0].toggle;
 }
 
 static inline int ibmveth_rxq_buffer_valid(struct ibmveth_adapter *adapter)
@@ -132,7 +132,7 @@ static inline int ibmveth_rxq_large_packet(struct 
ibmveth_adapter *adapter)
 
 static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter)
 {
-       return 
be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].length);
+       return 
be32_to_cpu(adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].length);
 }
 
 static inline int ibmveth_rxq_csum_good(struct ibmveth_adapter *adapter)
@@ -386,7 +386,7 @@ static void ibmveth_replenish_buffer_pool(struct 
ibmveth_adapter *adapter,
  */
 static void ibmveth_update_rx_no_buffer(struct ibmveth_adapter *adapter)
 {
-       __be64 *p = adapter->buffer_list_addr + 4096 - 8;
+       __be64 *p = adapter->buffer_list_addr[0] + 4096 - 8;
 
        adapter->rx_no_buffer = be64_to_cpup(p);
 }
@@ -399,7 +399,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter 
*adapter)
        adapter->replenish_task_cycles++;
 
        for (i = (IBMVETH_NUM_BUFF_POOLS - 1); i >= 0; i--) {
-               struct ibmveth_buff_pool *pool = &adapter->rx_buff_pool[i];
+               struct ibmveth_buff_pool *pool = &adapter->rx_buff_pool[0][i];
 
                if (pool->active &&
                    (atomic_read(&pool->available) < pool->threshold))
@@ -463,12 +463,12 @@ static int ibmveth_remove_buffer_from_pool(struct 
ibmveth_adapter *adapter,
        struct sk_buff *skb;
 
        if (WARN_ON(pool >= IBMVETH_NUM_BUFF_POOLS) ||
-           WARN_ON(index >= adapter->rx_buff_pool[pool].size)) {
+           WARN_ON(index >= adapter->rx_buff_pool[0][pool].size)) {
                schedule_work(&adapter->work);
                return -EINVAL;
        }
 
-       skb = adapter->rx_buff_pool[pool].skbuff[index];
+       skb = adapter->rx_buff_pool[0][pool].skbuff[index];
        if (WARN_ON(!skb)) {
                schedule_work(&adapter->work);
                return -EFAULT;
@@ -482,24 +482,24 @@ static int ibmveth_remove_buffer_from_pool(struct 
ibmveth_adapter *adapter,
                /* remove the skb pointer to mark free. actual freeing is done
                 * by upper level networking after gro_receive
                 */
-               adapter->rx_buff_pool[pool].skbuff[index] = NULL;
+               adapter->rx_buff_pool[0][pool].skbuff[index] = NULL;
 
                dma_unmap_single(&adapter->vdev->dev,
-                                adapter->rx_buff_pool[pool].dma_addr[index],
-                                adapter->rx_buff_pool[pool].buff_size,
+                                adapter->rx_buff_pool[0][pool].dma_addr[index],
+                                adapter->rx_buff_pool[0][pool].buff_size,
                                 DMA_FROM_DEVICE);
        }
 
-       free_index = adapter->rx_buff_pool[pool].producer_index;
-       adapter->rx_buff_pool[pool].producer_index++;
-       if (adapter->rx_buff_pool[pool].producer_index >=
-           adapter->rx_buff_pool[pool].size)
-               adapter->rx_buff_pool[pool].producer_index = 0;
-       adapter->rx_buff_pool[pool].free_map[free_index] = index;
+       free_index = adapter->rx_buff_pool[0][pool].producer_index;
+       adapter->rx_buff_pool[0][pool].producer_index++;
+       if (adapter->rx_buff_pool[0][pool].producer_index >=
+           adapter->rx_buff_pool[0][pool].size)
+               adapter->rx_buff_pool[0][pool].producer_index = 0;
+       adapter->rx_buff_pool[0][pool].free_map[free_index] = index;
 
        mb();
 
-       atomic_dec(&(adapter->rx_buff_pool[pool].available));
+       atomic_dec(&adapter->rx_buff_pool[0][pool].available);
 
        return 0;
 }
@@ -507,17 +507,17 @@ static int ibmveth_remove_buffer_from_pool(struct 
ibmveth_adapter *adapter,
 /* get the current buffer on the rx queue */
 static inline struct sk_buff *ibmveth_rxq_get_buffer(struct ibmveth_adapter 
*adapter)
 {
-       u64 correlator = 
adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator;
+       u64 correlator = 
adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].correlator;
        unsigned int pool = correlator >> 32;
        unsigned int index = correlator & 0xffffffffUL;
 
        if (WARN_ON(pool >= IBMVETH_NUM_BUFF_POOLS) ||
-           WARN_ON(index >= adapter->rx_buff_pool[pool].size)) {
+           WARN_ON(index >= adapter->rx_buff_pool[0][pool].size)) {
                schedule_work(&adapter->work);
                return NULL;
        }
 
-       return adapter->rx_buff_pool[pool].skbuff[index];
+       return adapter->rx_buff_pool[0][pool].skbuff[index];
 }
 
 /**
@@ -538,14 +538,14 @@ static int ibmveth_rxq_harvest_buffer(struct 
ibmveth_adapter *adapter,
        u64 cor;
        int rc;
 
-       cor = adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator;
+       cor = 
adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].correlator;
        rc = ibmveth_remove_buffer_from_pool(adapter, cor, reuse);
        if (unlikely(rc))
                return rc;
 
-       if (++adapter->rx_queue.index == adapter->rx_queue.num_slots) {
-               adapter->rx_queue.index = 0;
-               adapter->rx_queue.toggle = !adapter->rx_queue.toggle;
+       if (++adapter->rx_queue[0].index == adapter->rx_queue[0].num_slots) {
+               adapter->rx_queue[0].index = 0;
+               adapter->rx_queue[0].toggle = !adapter->rx_queue[0].toggle;
        }
 
        return 0;
@@ -596,7 +596,7 @@ static int ibmveth_register_logical_lan(struct 
ibmveth_adapter *adapter,
         */
 retry:
        rc = h_register_logical_lan(adapter->vdev->unit_address,
-                                   adapter->buffer_list_dma, rxq_desc.desc,
+                                   adapter->buffer_list_dma[0], rxq_desc.desc,
                                    adapter->filter_list_dma, mac_address);
 
        if (rc != H_SUCCESS && try_again) {
@@ -624,14 +624,14 @@ static int ibmveth_open(struct net_device *netdev)
 
        netdev_dbg(netdev, "open starting\n");
 
-       napi_enable(&adapter->napi);
+       napi_enable(&adapter->napi[0]);
 
        for(i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
-               rxq_entries += adapter->rx_buff_pool[i].size;
+               rxq_entries += adapter->rx_buff_pool[0][i].size;
 
        rc = -ENOMEM;
-       adapter->buffer_list_addr = (void*) get_zeroed_page(GFP_KERNEL);
-       if (!adapter->buffer_list_addr) {
+       adapter->buffer_list_addr[0] = (void *)get_zeroed_page(GFP_KERNEL);
+       if (!adapter->buffer_list_addr[0]) {
                netdev_err(netdev, "unable to allocate list pages\n");
                goto out;
        }
@@ -644,17 +644,18 @@ static int ibmveth_open(struct net_device *netdev)
 
        dev = &adapter->vdev->dev;
 
-       adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) *
+       adapter->rx_queue[0].queue_len = sizeof(struct ibmveth_rx_q_entry) *
                                                rxq_entries;
-       adapter->rx_queue.queue_addr =
-               dma_alloc_coherent(dev, adapter->rx_queue.queue_len,
-                                  &adapter->rx_queue.queue_dma, GFP_KERNEL);
-       if (!adapter->rx_queue.queue_addr)
+       adapter->rx_queue[0].queue_addr =
+               dma_alloc_coherent(dev, adapter->rx_queue[0].queue_len,
+                                  &adapter->rx_queue[0].queue_dma, GFP_KERNEL);
+       if (!adapter->rx_queue[0].queue_addr)
                goto out_free_filter_list;
 
-       adapter->buffer_list_dma = dma_map_single(dev,
-                       adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL);
-       if (dma_mapping_error(dev, adapter->buffer_list_dma)) {
+       adapter->buffer_list_dma[0] = dma_map_single(dev,
+                                                    
adapter->buffer_list_addr[0],
+                                                    4096, DMA_BIDIRECTIONAL);
+       if (dma_mapping_error(dev, adapter->buffer_list_dma[0])) {
                netdev_err(netdev, "unable to map buffer list pages\n");
                goto out_free_queue_mem;
        }
@@ -671,19 +672,19 @@ static int ibmveth_open(struct net_device *netdev)
                        goto out_free_tx_ltb;
        }
 
-       adapter->rx_queue.index = 0;
-       adapter->rx_queue.num_slots = rxq_entries;
-       adapter->rx_queue.toggle = 1;
+       adapter->rx_queue[0].index = 0;
+       adapter->rx_queue[0].num_slots = rxq_entries;
+       adapter->rx_queue[0].toggle = 1;
 
        mac_address = ether_addr_to_u64(netdev->dev_addr);
 
        rxq_desc.fields.flags_len = IBMVETH_BUF_VALID |
-                                       adapter->rx_queue.queue_len;
-       rxq_desc.fields.address = adapter->rx_queue.queue_dma;
+                                       adapter->rx_queue[0].queue_len;
+       rxq_desc.fields.address = adapter->rx_queue[0].queue_dma;
 
-       netdev_dbg(netdev, "buffer list @ 0x%p\n", adapter->buffer_list_addr);
+       netdev_dbg(netdev, "buffer list @ 0x%p\n", 
adapter->buffer_list_addr[0]);
        netdev_dbg(netdev, "filter list @ 0x%p\n", adapter->filter_list_addr);
-       netdev_dbg(netdev, "receive q   @ 0x%p\n", 
adapter->rx_queue.queue_addr);
+       netdev_dbg(netdev, "receive q   @ 0x%p\n", 
adapter->rx_queue[0].queue_addr);
 
        h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE);
 
@@ -694,7 +695,7 @@ static int ibmveth_open(struct net_device *netdev)
                           lpar_rc);
                netdev_err(netdev, "buffer TCE:0x%llx filter TCE:0x%llx rxq "
                           "desc:0x%llx MAC:0x%llx\n",
-                                    adapter->buffer_list_dma,
+                                    adapter->buffer_list_dma[0],
                                     adapter->filter_list_dma,
                                     rxq_desc.desc,
                                     mac_address);
@@ -703,11 +704,11 @@ static int ibmveth_open(struct net_device *netdev)
        }
 
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
-               if (!adapter->rx_buff_pool[i].active)
+               if (!adapter->rx_buff_pool[0][i].active)
                        continue;
-               if (ibmveth_alloc_buffer_pool(&adapter->rx_buff_pool[i])) {
+               if (ibmveth_alloc_buffer_pool(&adapter->rx_buff_pool[0][i])) {
                        netdev_err(netdev, "unable to alloc pool\n");
-                       adapter->rx_buff_pool[i].active = 0;
+                       adapter->rx_buff_pool[0][i].active = 0;
                        rc = -ENOMEM;
                        goto out_free_buffer_pools;
                }
@@ -739,9 +740,9 @@ static int ibmveth_open(struct net_device *netdev)
 
 out_free_buffer_pools:
        while (--i >= 0) {
-               if (adapter->rx_buff_pool[i].active)
+               if (adapter->rx_buff_pool[0][i].active)
                        ibmveth_free_buffer_pool(adapter,
-                                                &adapter->rx_buff_pool[i]);
+                                                &adapter->rx_buff_pool[0][i]);
        }
 out_unmap_filter_list:
        dma_unmap_single(dev, adapter->filter_list_dma, 4096,
@@ -753,18 +754,18 @@ static int ibmveth_open(struct net_device *netdev)
        }
 
 out_unmap_buffer_list:
-       dma_unmap_single(dev, adapter->buffer_list_dma, 4096,
+       dma_unmap_single(dev, adapter->buffer_list_dma[0], 4096,
                         DMA_BIDIRECTIONAL);
 out_free_queue_mem:
-       dma_free_coherent(dev, adapter->rx_queue.queue_len,
-                         adapter->rx_queue.queue_addr,
-                         adapter->rx_queue.queue_dma);
+       dma_free_coherent(dev, adapter->rx_queue[0].queue_len,
+                         adapter->rx_queue[0].queue_addr,
+                         adapter->rx_queue[0].queue_dma);
 out_free_filter_list:
        free_page((unsigned long)adapter->filter_list_addr);
 out_free_buffer_list:
-       free_page((unsigned long)adapter->buffer_list_addr);
+       free_page((unsigned long)adapter->buffer_list_addr[0]);
 out:
-       napi_disable(&adapter->napi);
+       napi_disable(&adapter->napi[0]);
        return rc;
 }
 
@@ -777,7 +778,7 @@ static int ibmveth_close(struct net_device *netdev)
 
        netdev_dbg(netdev, "close starting\n");
 
-       napi_disable(&adapter->napi);
+       napi_disable(&adapter->napi[0]);
 
        netif_tx_stop_all_queues(netdev);
 
@@ -796,22 +797,22 @@ static int ibmveth_close(struct net_device *netdev)
 
        ibmveth_update_rx_no_buffer(adapter);
 
-       dma_unmap_single(dev, adapter->buffer_list_dma, 4096,
+       dma_unmap_single(dev, adapter->buffer_list_dma[0], 4096,
                         DMA_BIDIRECTIONAL);
-       free_page((unsigned long)adapter->buffer_list_addr);
+       free_page((unsigned long)adapter->buffer_list_addr[0]);
 
        dma_unmap_single(dev, adapter->filter_list_dma, 4096,
                         DMA_BIDIRECTIONAL);
        free_page((unsigned long)adapter->filter_list_addr);
 
-       dma_free_coherent(dev, adapter->rx_queue.queue_len,
-                         adapter->rx_queue.queue_addr,
-                         adapter->rx_queue.queue_dma);
+       dma_free_coherent(dev, adapter->rx_queue[0].queue_len,
+                         adapter->rx_queue[0].queue_addr,
+                         adapter->rx_queue[0].queue_dma);
 
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
-               if (adapter->rx_buff_pool[i].active)
+               if (adapter->rx_buff_pool[0][i].active)
                        ibmveth_free_buffer_pool(adapter,
-                                                &adapter->rx_buff_pool[i]);
+                                                &adapter->rx_buff_pool[0][i]);
 
        for (i = 0; i < netdev->real_num_tx_queues; i++)
                ibmveth_free_tx_ltb(adapter, i);
@@ -1449,7 +1450,7 @@ static void ibmveth_rx_csum_helper(struct sk_buff *skb,
 static int ibmveth_poll(struct napi_struct *napi, int budget)
 {
        struct ibmveth_adapter *adapter =
-                       container_of(napi, struct ibmveth_adapter, napi);
+                       container_of(napi, struct ibmveth_adapter, napi[0]);
        struct net_device *netdev = adapter->netdev;
        int frames_processed = 0;
        unsigned long lpar_rc;
@@ -1574,11 +1575,11 @@ static irqreturn_t ibmveth_interrupt(int irq, void 
*dev_instance)
        struct ibmveth_adapter *adapter = netdev_priv(netdev);
        unsigned long lpar_rc;
 
-       if (napi_schedule_prep(&adapter->napi)) {
+       if (napi_schedule_prep(&adapter->napi[0])) {
                lpar_rc = h_vio_signal(adapter->vdev->unit_address,
                                       VIO_IRQ_DISABLE);
                WARN_ON(lpar_rc != H_SUCCESS);
-               __napi_schedule(&adapter->napi);
+               __napi_schedule(&adapter->napi[0]);
        }
        return IRQ_HANDLED;
 }
@@ -1646,7 +1647,7 @@ static int ibmveth_change_mtu(struct net_device *dev, int 
new_mtu)
        int need_restart = 0;
 
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
-               if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size)
+               if (new_mtu_oh <= adapter->rx_buff_pool[0][i].buff_size)
                        break;
 
        if (i == IBMVETH_NUM_BUFF_POOLS)
@@ -1661,9 +1662,9 @@ static int ibmveth_change_mtu(struct net_device *dev, int 
new_mtu)
 
        /* Look for an active buffer pool that can hold the new MTU */
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
-               adapter->rx_buff_pool[i].active = 1;
+               adapter->rx_buff_pool[0][i].active = 1;
 
-               if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size) {
+               if (new_mtu_oh <= adapter->rx_buff_pool[0][i].buff_size) {
                        WRITE_ONCE(dev->mtu, new_mtu);
                        vio_cmo_set_dev_desired(viodev,
                                                ibmveth_get_desired_dma
@@ -1721,12 +1722,12 @@ static unsigned long ibmveth_get_desired_dma(struct 
vio_dev *vdev)
 
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
                /* add the size of the active receive buffers */
-               if (adapter->rx_buff_pool[i].active)
+               if (adapter->rx_buff_pool[0][i].active)
                        ret +=
-                           adapter->rx_buff_pool[i].size *
-                           IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[i].
+                           adapter->rx_buff_pool[0][i].size *
+                           IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[0][i].
                                             buff_size, tbl);
-               rxqentries += adapter->rx_buff_pool[i].size;
+               rxqentries += adapter->rx_buff_pool[0][i].size;
        }
        /* add the size of the receive queue entries */
        ret += IOMMU_PAGE_ALIGN(
@@ -1845,7 +1846,7 @@ static int ibmveth_probe(struct vio_dev *dev, const 
struct vio_device_id *id)
        adapter->mcastFilterSize = be32_to_cpu(*mcastFilterSize_p);
        ibmveth_init_link_settings(netdev);
 
-       netif_napi_add_weight(netdev, &adapter->napi, ibmveth_poll, 16);
+       netif_napi_add_weight(netdev, &adapter->napi[0], ibmveth_poll, 16);
 
        netdev->irq = dev->irq;
        netdev->netdev_ops = &ibmveth_netdev_ops;
@@ -1877,6 +1878,10 @@ static int ibmveth_probe(struct vio_dev *dev, const 
struct vio_device_id *id)
                netdev->features |= NETIF_F_FRAGLIST;
        }
 
+       /* Initialize queue count - always 1 for now */
+       adapter->multi_queue = 0;
+       adapter->num_rx_queues = 1;
+
        if (ret == H_SUCCESS &&
            (ret_attr & IBMVETH_ILLAN_RX_MULTI_BUFF_SUPPORT)) {
                adapter->rx_buffers_per_hcall = IBMVETH_MAX_RX_PER_HCALL;
@@ -1899,10 +1904,10 @@ static int ibmveth_probe(struct vio_dev *dev, const 
struct vio_device_id *id)
                memcpy(pool_count, pool_count_cmo, sizeof(pool_count));
 
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
-               struct kobject *kobj = &adapter->rx_buff_pool[i].kobj;
+               struct kobject *kobj = &adapter->rx_buff_pool[0][i].kobj;
                int error;
 
-               ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i,
+               ibmveth_init_buffer_pool(&adapter->rx_buff_pool[0][i], i,
                                         pool_count[i], pool_size[i],
                                         pool_active[i]);
                error = kobject_init_and_add(kobj, &ktype_veth_pool,
@@ -1950,7 +1955,7 @@ static void ibmveth_remove(struct vio_dev *dev)
        cancel_work_sync(&adapter->work);
 
        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
-               kobject_put(&adapter->rx_buff_pool[i].kobj);
+               kobject_put(&adapter->rx_buff_pool[0][i].kobj);
 
        unregister_netdev(netdev);
 
@@ -2036,11 +2041,11 @@ static ssize_t veth_pool_store(struct kobject *kobj, 
struct attribute *attr,
                        /* Make sure there is a buffer pool with buffers that
                           can hold a packet of the size of the MTU */
                        for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
-                               if (pool == &adapter->rx_buff_pool[i])
+                               if (pool == &adapter->rx_buff_pool[0][i])
                                        continue;
-                               if (!adapter->rx_buff_pool[i].active)
+                               if (!adapter->rx_buff_pool[0][i].active)
                                        continue;
-                               if (mtu <= adapter->rx_buff_pool[i].buff_size)
+                               if (mtu <= 
adapter->rx_buff_pool[0][i].buff_size)
                                        break;
                        }
 
@@ -2214,11 +2219,11 @@ static void ibmveth_remove_buffer_from_pool_test(struct 
kunit *test)
 
        /* Set sane values for buffer pools */
        for (int i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
-               ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i,
+               ibmveth_init_buffer_pool(&adapter->rx_buff_pool[0][i], i,
                                         pool_count[i], pool_size[i],
                                         pool_active[i]);
 
-       pool = &adapter->rx_buff_pool[0];
+       pool = &adapter->rx_buff_pool[0][0];
        pool->skbuff = kunit_kcalloc(test, pool->size, sizeof(void *), 
GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pool->skbuff);
 
@@ -2226,7 +2231,7 @@ static void ibmveth_remove_buffer_from_pool_test(struct 
kunit *test)
        KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, 
correlator, false));
        KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, 
correlator, true));
 
-       correlator = ((u64)0 << 32) | adapter->rx_buff_pool[0].size;
+       correlator = ((u64)0 << 32) | adapter->rx_buff_pool[0][0].size;
        KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, 
correlator, false));
        KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, 
correlator, true));
 
@@ -2259,30 +2264,32 @@ static void ibmveth_rxq_get_buffer_test(struct kunit 
*test)
 
        INIT_WORK(&adapter->work, ibmveth_reset_kunit);
 
-       adapter->rx_queue.queue_len = 1;
-       adapter->rx_queue.index = 0;
-       adapter->rx_queue.queue_addr = kunit_kzalloc(test, sizeof(struct 
ibmveth_rx_q_entry),
-                                                    GFP_KERNEL);
-       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adapter->rx_queue.queue_addr);
+       adapter->rx_queue[0].queue_len = 1;
+       adapter->rx_queue[0].index = 0;
+       adapter->rx_queue[0].queue_addr =
+               kunit_kzalloc(test, sizeof(struct ibmveth_rx_q_entry),
+                             GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adapter->rx_queue[0].queue_addr);
 
        /* Set sane values for buffer pools */
        for (int i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++)
-               ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i,
+               ibmveth_init_buffer_pool(&adapter->rx_buff_pool[0][i], i,
                                         pool_count[i], pool_size[i],
                                         pool_active[i]);
 
-       pool = &adapter->rx_buff_pool[0];
+       pool = &adapter->rx_buff_pool[0][0];
        pool->skbuff = kunit_kcalloc(test, pool->size, sizeof(void *), 
GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pool->skbuff);
 
-       adapter->rx_queue.queue_addr[0].correlator = 
(u64)IBMVETH_NUM_BUFF_POOLS << 32 | 0;
+       adapter->rx_queue[0].queue_addr[0].correlator = 
(u64)IBMVETH_NUM_BUFF_POOLS << 32 | 0;
        KUNIT_EXPECT_PTR_EQ(test, NULL, ibmveth_rxq_get_buffer(adapter));
 
-       adapter->rx_queue.queue_addr[0].correlator = (u64)0 << 32 | 
adapter->rx_buff_pool[0].size;
+       adapter->rx_queue[0].queue_addr[0].correlator =
+               (u64)0 << 32 | adapter->rx_buff_pool[0][0].size;
        KUNIT_EXPECT_PTR_EQ(test, NULL, ibmveth_rxq_get_buffer(adapter));
 
        pool->skbuff[0] = skb;
-       adapter->rx_queue.queue_addr[0].correlator = (u64)0 << 32 | 0;
+       adapter->rx_queue[0].queue_addr[0].correlator = (u64)0 << 32 | 0;
        KUNIT_EXPECT_PTR_EQ(test, skb, ibmveth_rxq_get_buffer(adapter));
 
        flush_work(&adapter->work);
diff --git a/drivers/net/ethernet/ibm/ibmveth.h 
b/drivers/net/ethernet/ibm/ibmveth.h
index 45cfb0d054e3..b17894695c2e 100644
--- a/drivers/net/ethernet/ibm/ibmveth.h
+++ b/drivers/net/ethernet/ibm/ibmveth.h
@@ -279,6 +279,8 @@ static inline long h_illan_attributes(unsigned long 
unit_address,
 #define IBMVETH_MAX_TX_BUF_SIZE (1024 * 64)
 #define IBMVETH_MAX_QUEUES 16U
 #define IBMVETH_DEFAULT_QUEUES 8U
+#define IBMVETH_MAX_RX_QUEUES 1U
+#define IBMVETH_DEFAULT_RX_QUEUES 1U
 #define IBMVETH_MAX_RX_PER_HCALL 8U
 
 static int pool_size[] = { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 64 };
@@ -315,18 +317,22 @@ struct ibmveth_rx_q {
 struct ibmveth_adapter {
        struct vio_dev *vdev;
        struct net_device *netdev;
-       struct napi_struct napi;
+       struct napi_struct napi[IBMVETH_MAX_RX_QUEUES];
        struct work_struct work;
        unsigned int mcastFilterSize;
-       void *buffer_list_addr;
+       void *buffer_list_addr[IBMVETH_MAX_RX_QUEUES];
        void *filter_list_addr;
        void *tx_ltb_ptr[IBMVETH_MAX_QUEUES];
        unsigned int tx_ltb_size;
        dma_addr_t tx_ltb_dma[IBMVETH_MAX_QUEUES];
-       dma_addr_t buffer_list_dma;
+       dma_addr_t buffer_list_dma[IBMVETH_MAX_RX_QUEUES];
        dma_addr_t filter_list_dma;
-       struct ibmveth_buff_pool rx_buff_pool[IBMVETH_NUM_BUFF_POOLS];
-       struct ibmveth_rx_q rx_queue;
+       struct ibmveth_buff_pool 
rx_buff_pool[IBMVETH_MAX_RX_QUEUES][IBMVETH_NUM_BUFF_POOLS];
+       struct ibmveth_rx_q rx_queue[IBMVETH_MAX_RX_QUEUES];
+       u64 queue_handle[IBMVETH_MAX_RX_QUEUES];
+       unsigned int queue_irq[IBMVETH_MAX_RX_QUEUES];
+       int multi_queue;
+       unsigned int num_rx_queues;
        int rx_csum;
        int large_send;
        bool is_active_trunk;
-- 
2.39.3 (Apple Git-146)


Reply via email to