ethdev: add device type
[dpdk.git] / lib / librte_pmd_ring / rte_eth_ring.c
index 11a1196..83ecfa8 100644 (file)
@@ -1,13 +1,13 @@
 /*-
  *   BSD LICENSE
- * 
+ *
  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
  *   All rights reserved.
- * 
+ *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
  *   are met:
- * 
+ *
  *     * Redistributions of source code must retain the above copyright
  *       notice, this list of conditions and the following disclaimer.
  *     * Redistributions in binary form must reproduce the above copyright
@@ -17,7 +17,7 @@
  *     * Neither the name of Intel Corporation nor the names of its
  *       contributors may be used to endorse or promote products derived
  *       from this software without specific prior written permission.
- * 
+ *
  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -44,6 +44,8 @@
 #define ETH_RING_ACTION_CREATE         "CREATE"
 #define ETH_RING_ACTION_ATTACH         "ATTACH"
 
+static const char *ring_ethdev_driver_name = "Ring PMD";
+
 static const char *valid_arguments[] = {
        ETH_RING_NUMA_NODE_ACTION_ARG,
        NULL
@@ -62,10 +64,11 @@ struct pmd_internals {
 
        struct ring_queue rx_ring_queues[RTE_PMD_RING_MAX_RX_RINGS];
        struct ring_queue tx_ring_queues[RTE_PMD_RING_MAX_TX_RINGS];
+
+       struct ether_addr address;
 };
 
 
-static struct ether_addr eth_addr = { .addr_bytes = {0} };
 static const char *drivername = "Rings PMD";
 static struct rte_eth_link pmd_link = {
                .link_speed = 10000,
@@ -78,7 +81,7 @@ eth_ring_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
 {
        void **ptrs = (void *)&bufs[0];
        struct ring_queue *r = q;
-       const uint16_t nb_rx = (uint16_t)rte_ring_dequeue_burst(r->rng, 
+       const uint16_t nb_rx = (uint16_t)rte_ring_dequeue_burst(r->rng,
                        ptrs, nb_bufs);
        if (r->rng->flags & RING_F_SC_DEQ)
                r->rx_pkts.cnt += nb_rx;
@@ -92,7 +95,7 @@ eth_ring_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
 {
        void **ptrs = (void *)&bufs[0];
        struct ring_queue *r = q;
-       const uint16_t nb_tx = (uint16_t)rte_ring_enqueue_burst(r->rng, 
+       const uint16_t nb_tx = (uint16_t)rte_ring_enqueue_burst(r->rng,
                        ptrs, nb_bufs);
        if (r->rng->flags & RING_F_SP_ENQ) {
                r->tx_pkts.cnt += nb_tx;
@@ -120,6 +123,20 @@ eth_dev_stop(struct rte_eth_dev *dev)
        dev->data->dev_link.link_status = 0;
 }
 
+static int
+eth_dev_set_link_down(struct rte_eth_dev *dev)
+{
+       dev->data->dev_link.link_status = 0;
+       return 0;
+}
+
+static int
+eth_dev_set_link_up(struct rte_eth_dev *dev)
+{
+       dev->data->dev_link.link_status = 1;
+       return 0;
+}
+
 static int
 eth_rx_queue_setup(struct rte_eth_dev *dev,uint16_t rx_queue_id,
                                    uint16_t nb_rx_desc __rte_unused,
@@ -165,7 +182,6 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats)
        unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0;
        const struct pmd_internals *internal = dev->data->dev_private;
 
-       memset(igb_stats, 0, sizeof(*igb_stats));
        for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&
                        i < internal->nb_rx_queues; i++) {
                igb_stats->q_ipackets[i] = internal->rx_ring_queues[i].rx_pkts.cnt;
@@ -198,6 +214,20 @@ eth_stats_reset(struct rte_eth_dev *dev)
        }
 }
 
+static void
+eth_mac_addr_remove(struct rte_eth_dev *dev __rte_unused,
+       uint32_t index __rte_unused)
+{
+}
+
+static void
+eth_mac_addr_add(struct rte_eth_dev *dev __rte_unused,
+       struct ether_addr *mac_addr __rte_unused,
+       uint32_t index __rte_unused,
+       uint32_t vmdq __rte_unused)
+{
+}
+
 static void
 eth_queue_release(void *q __rte_unused) { ; }
 static int
@@ -207,6 +237,8 @@ eth_link_update(struct rte_eth_dev *dev __rte_unused,
 static struct eth_dev_ops ops = {
                .dev_start = eth_dev_start,
                .dev_stop = eth_dev_stop,
+               .dev_set_link_up = eth_dev_set_link_up,
+               .dev_set_link_down = eth_dev_set_link_down,
                .dev_configure = eth_dev_configure,
                .dev_infos_get = eth_dev_info,
                .rx_queue_setup = eth_rx_queue_setup,
@@ -216,10 +248,12 @@ static struct eth_dev_ops ops = {
                .link_update = eth_link_update,
                .stats_get = eth_stats_get,
                .stats_reset = eth_stats_reset,
+               .mac_addr_remove = eth_mac_addr_remove,
+               .mac_addr_add = eth_mac_addr_add,
 };
 
 int
-rte_eth_from_rings(struct rte_ring *const rx_queues[],
+rte_eth_from_rings(const char *name, struct rte_ring *const rx_queues[],
                const unsigned nb_rx_queues,
                struct rte_ring *const tx_queues[],
                const unsigned nb_tx_queues,
@@ -229,6 +263,9 @@ rte_eth_from_rings(struct rte_ring *const rx_queues[],
        struct rte_pci_device *pci_dev = NULL;
        struct pmd_internals *internals = NULL;
        struct rte_eth_dev *eth_dev = NULL;
+       struct eth_driver *eth_drv = NULL;
+       struct rte_pci_id *id_table = NULL;
+
        unsigned i;
 
        /* do some parameter checking */
@@ -243,23 +280,31 @@ rte_eth_from_rings(struct rte_ring *const rx_queues[],
        /* now do all data allocation - for eth_dev structure, dummy pci driver
         * and internal (private) data
         */
-       data = rte_zmalloc_socket(NULL, sizeof(*data), 0, numa_node);
+       data = rte_zmalloc_socket(name, sizeof(*data), 0, numa_node);
        if (data == NULL)
                goto error;
 
-       pci_dev = rte_zmalloc_socket(NULL, sizeof(*pci_dev), 0, numa_node);
+       pci_dev = rte_zmalloc_socket(name, sizeof(*pci_dev), 0, numa_node);
        if (pci_dev == NULL)
                goto error;
 
-       internals = rte_zmalloc_socket(NULL, sizeof(*internals), 0, numa_node);
+       id_table = rte_zmalloc_socket(name, sizeof(*id_table), 0, numa_node);
+       if (id_table == NULL)
+               goto error;
+
+       internals = rte_zmalloc_socket(name, sizeof(*internals), 0, numa_node);
        if (internals == NULL)
                goto error;
 
        /* reserve an ethdev entry */
-       eth_dev = rte_eth_dev_allocate();
+       eth_dev = rte_eth_dev_allocate(name, RTE_ETH_DEV_VIRTUAL);
        if (eth_dev == NULL)
                goto error;
 
+       eth_drv = rte_zmalloc_socket(name, sizeof(*eth_drv), 0, numa_node);
+       if (eth_drv == NULL)
+               goto error;
+
        /* now put it all together
         * - store queue data in internals,
         * - store numa_node info in pci_driver
@@ -278,18 +323,24 @@ rte_eth_from_rings(struct rte_ring *const rx_queues[],
                internals->tx_ring_queues[i].rng = tx_queues[i];
        }
 
+       eth_drv->pci_drv.name = ring_ethdev_driver_name;
+       eth_drv->pci_drv.id_table = id_table;
+
        pci_dev->numa_node = numa_node;
+       pci_dev->driver = &eth_drv->pci_drv;
 
        data->dev_private = internals;
        data->port_id = eth_dev->data->port_id;
        data->nb_rx_queues = (uint16_t)nb_rx_queues;
        data->nb_tx_queues = (uint16_t)nb_tx_queues;
        data->dev_link = pmd_link;
-       data->mac_addrs = &eth_addr;
+       data->mac_addrs = &internals->address;
 
-       eth_dev ->data = data;
-       eth_dev ->dev_ops = &ops;
-       eth_dev ->pci_dev = pci_dev;
+       eth_dev->data = data;
+       eth_dev->driver = eth_drv;
+       eth_dev->dev_ops = &ops;
+       eth_dev->pci_dev = pci_dev;
+       TAILQ_INIT(&(eth_dev->link_intr_cbs));
 
        /* finally assign rx and tx ops */
        eth_dev->rx_pkt_burst = eth_ring_rx;
@@ -326,7 +377,7 @@ eth_dev_ring_create(const char *name, const unsigned numa_node,
                        RTE_PMD_RING_MAX_TX_RINGS);
 
        for (i = 0; i < num_rings; i++) {
-               rte_snprintf(rng_name, sizeof(rng_name), "ETH_RXTX%u_%s", i, name);
+               snprintf(rng_name, sizeof(rng_name), "ETH_RXTX%u_%s", i, name);
                rxtx[i] = (action == DEV_CREATE) ?
                                rte_ring_create(rng_name, 1024, numa_node,
                                                RING_F_SP_ENQ|RING_F_SC_DEQ) :
@@ -335,7 +386,7 @@ eth_dev_ring_create(const char *name, const unsigned numa_node,
                        return -1;
        }
 
-       if (rte_eth_from_rings(rxtx, num_rings, rxtx, num_rings, numa_node))
+       if (rte_eth_from_rings(name, rxtx, num_rings, rxtx, num_rings, numa_node))
                return -1;
 
        return 0;
@@ -352,29 +403,31 @@ eth_dev_ring_pair_create(const char *name, const unsigned numa_node,
        struct rte_ring *rx[RTE_PMD_RING_MAX_RX_RINGS];
        struct rte_ring *tx[RTE_PMD_RING_MAX_TX_RINGS];
        unsigned i;
-       char rng_name[RTE_RING_NAMESIZE];
+       char rx_rng_name[RTE_RING_NAMESIZE];
+       char tx_rng_name[RTE_RING_NAMESIZE];
        unsigned num_rings = RTE_MIN(RTE_PMD_RING_MAX_RX_RINGS,
                        RTE_PMD_RING_MAX_TX_RINGS);
 
        for (i = 0; i < num_rings; i++) {
-               rte_snprintf(rng_name, sizeof(rng_name), "ETH_RX%u_%s", i, name);
+               snprintf(rx_rng_name, sizeof(rx_rng_name), "ETH_RX%u_%s", i, name);
                rx[i] = (action == DEV_CREATE) ?
-                               rte_ring_create(rng_name, 1024, numa_node,
+                               rte_ring_create(rx_rng_name, 1024, numa_node,
                                                RING_F_SP_ENQ|RING_F_SC_DEQ) :
-                               rte_ring_lookup(rng_name);
+                               rte_ring_lookup(rx_rng_name);
                if (rx[i] == NULL)
                        return -1;
-               rte_snprintf(rng_name, sizeof(rng_name), "ETH_TX%u_%s", i, name);
+               snprintf(tx_rng_name, sizeof(tx_rng_name), "ETH_TX%u_%s", i, name);
                tx[i] = (action == DEV_CREATE) ?
-                               rte_ring_create(rng_name, 1024, numa_node,
+                               rte_ring_create(tx_rng_name, 1024, numa_node,
                                                RING_F_SP_ENQ|RING_F_SC_DEQ):
-                               rte_ring_lookup(rng_name);
+                               rte_ring_lookup(tx_rng_name);
                if (tx[i] == NULL)
                        return -1;
        }
 
-       if (rte_eth_from_rings(rx, num_rings, tx, num_rings, numa_node) ||
-                       rte_eth_from_rings(tx, num_rings, rx, num_rings, numa_node) )
+       if (rte_eth_from_rings(rx_rng_name, rx, num_rings, tx, num_rings,
+                       numa_node) || rte_eth_from_rings(tx_rng_name, tx, num_rings, rx,
+                                       num_rings, numa_node))
                return -1;
 
        return 0;
@@ -461,7 +514,7 @@ static int parse_kvlist (const char *key __rte_unused, const char *value, void *
                goto out;
        }
 
-       rte_snprintf(info->list[info->count].name, sizeof(info->list[info->count].name), "%s", name);
+       snprintf(info->list[info->count].name, sizeof(info->list[info->count].name), "%s", name);
 
        info->count++;
 
@@ -471,7 +524,7 @@ out:
        return ret;
 }
 
-int
+static int
 rte_pmd_ring_devinit(const char *name, const char *params)
 {
        struct rte_kvargs *kvlist;
@@ -491,7 +544,6 @@ rte_pmd_ring_devinit(const char *name, const char *params)
                        eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
                        return 0;
                } else {
-                       eth_dev_ring_create(name, rte_socket_id(), DEV_CREATE);
                        ret = rte_kvargs_count(kvlist, ETH_RING_NUMA_NODE_ACTION_ARG);
                        info = rte_zmalloc("struct node_action_list", sizeof(struct node_action_list) +
                                           (sizeof(struct node_action_pair) * ret), 0);
@@ -508,7 +560,7 @@ rte_pmd_ring_devinit(const char *name, const char *params)
                                goto out_free;
 
                        for (info->count = 0; info->count < info->total; info->count++) {
-                               eth_dev_ring_pair_create(name, info->list[info->count].node,
+                               eth_dev_ring_create(name, info->list[info->count].node,
                                                    info->list[info->count].action);
                        }
                }