DPDK patches and discussions
 help / color / mirror / Atom feed
From: Bernard Iremonger <bernard.iremonger@intel.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [RFC PATCH V3] e1000: igb and em1000 PCI Port Hotplug changes
Date: Wed,  3 Jun 2015 15:03:02 +0100	[thread overview]
Message-ID: <1433340182-20382-1-git-send-email-bernard.iremonger@intel.com> (raw)
In-Reply-To: <RFC PATCH>

This patch depends on the Port Hotplug Framework.
It implements the eth_dev_uninit functions for rte_em_pmd,
rte_igb_pmd and rte_igbvf_pmd.

Changes in V3:
Add igb_adapter_stopped and em_adapter_stopped booleans.
Release rx and tx queues

Changes in V2:
Call dev_close() from  dev_uninit() functions.
Remove input parameter checking from dev_uninit() functions.

Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
---
 drivers/net/e1000/e1000_ethdev.h |    4 +-
 drivers/net/e1000/em_ethdev.c    |   50 ++++++++++++++++++++++-
 drivers/net/e1000/igb_ethdev.c   |   85 +++++++++++++++++++++++++++++++++++++-
 drivers/net/e1000/igb_pf.c       |   22 ++++++++++
 4 files changed, 157 insertions(+), 4 deletions(-)

diff --git a/drivers/net/e1000/e1000_ethdev.h b/drivers/net/e1000/e1000_ethdev.h
index c451faa..3ce1a22 100644
--- a/drivers/net/e1000/e1000_ethdev.h
+++ b/drivers/net/e1000/e1000_ethdev.h
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -337,4 +337,6 @@ uint16_t eth_em_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 uint16_t eth_em_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
 		uint16_t nb_pkts);
 
+void igb_pf_host_uninit(struct rte_eth_dev *dev);
+
 #endif /* _E1000_ETHDEV_H_ */
diff --git a/drivers/net/e1000/em_ethdev.c b/drivers/net/e1000/em_ethdev.c
index d28030e..db9b465 100644
--- a/drivers/net/e1000/em_ethdev.c
+++ b/drivers/net/e1000/em_ethdev.c
@@ -121,6 +121,7 @@ static void eth_em_rar_clear(struct rte_eth_dev *dev, uint32_t index);
 #define EM_LINK_UPDATE_CHECK_INTERVAL 100 /* ms */
 
 static enum e1000_fc_mode em_fc_setting = e1000_fc_full;
+static bool em_adapter_stopped;
 
 /*
  * The set of PCI devices this driver supports
@@ -241,6 +242,7 @@ eth_em_dev_init(struct rte_eth_dev *eth_dev)
 
 	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
 	hw->device_id = pci_dev->id.device_id;
+	em_adapter_stopped = 0;
 
 	/* For ICH8 support we'll need to map the flash memory BAR */
 
@@ -280,13 +282,56 @@ eth_em_dev_init(struct rte_eth_dev *eth_dev)
 	return (0);
 }
 
+static int
+eth_em_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+	struct rte_pci_device *pci_dev;
+	unsigned i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return -EPERM;
+
+	pci_dev = eth_dev->pci_dev;
+
+	if (em_adapter_stopped == 0)
+		eth_em_close(eth_dev);
+
+	eth_dev->dev_ops = NULL;
+	eth_dev->rx_pkt_burst = NULL;
+	eth_dev->tx_pkt_burst = NULL;
+
+	rte_free(eth_dev->data->mac_addrs);
+	eth_dev->data->mac_addrs = NULL;
+
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
+		eth_em_rx_queue_release(eth_dev->data->rx_queues[i]);
+		eth_dev->data->rx_queues[i] = NULL;
+	}
+
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
+		eth_em_tx_queue_release(eth_dev->data->tx_queues[i]);
+		eth_dev->data->tx_queues[i] = NULL;
+	}
+
+	/* disable uio intr before callback unregister */
+	rte_intr_disable(&(pci_dev->intr_handle));
+	rte_intr_callback_unregister(&(pci_dev->intr_handle),
+		eth_em_interrupt_handler, (void *)eth_dev);
+
+	return 0;
+}
+
 static struct eth_driver rte_em_pmd = {
 	{
 		.name = "rte_em_pmd",
 		.id_table = pci_id_em_map,
-		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
+			RTE_PCI_DRV_DETACHABLE,
 	},
 	.eth_dev_init = eth_em_dev_init,
+	.eth_dev_uninit = eth_em_dev_uninit,
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
@@ -565,6 +610,8 @@ eth_em_start(struct rte_eth_dev *dev)
 		}
 	}
 
+	em_adapter_stopped = 0;
+
 	PMD_INIT_LOG(DEBUG, "<<");
 
 	return (0);
@@ -610,6 +657,7 @@ eth_em_close(struct rte_eth_dev *dev)
 	struct e1000_hw *hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
 	eth_em_stop(dev);
+	em_adapter_stopped = 1;
 	e1000_phy_hw_reset(hw);
 	em_release_manageability(hw);
 	em_hw_control_release(hw);
diff --git a/drivers/net/e1000/igb_ethdev.c b/drivers/net/e1000/igb_ethdev.c
index e4b370d..fb130c7 100644
--- a/drivers/net/e1000/igb_ethdev.c
+++ b/drivers/net/e1000/igb_ethdev.c
@@ -212,6 +212,7 @@ static int eth_igb_filter_ctrl(struct rte_eth_dev *dev,
 #define IGBVF_PMD_NAME "rte_igbvf_pmd"     /* PMD name */
 
 static enum e1000_fc_mode igb_fc_setting = e1000_fc_full;
+static bool igb_adapter_stopped;
 
 /*
  * The set of PCI devices this driver supports
@@ -564,6 +565,7 @@ eth_igb_dev_init(struct rte_eth_dev *eth_dev)
 		goto err_late;
 	}
 	hw->mac.get_link_status = 1;
+	igb_adapter_stopped = 0;
 
 	/* Indicate SOL/IDER usage */
 	if (e1000_check_reset_block(hw) < 0) {
@@ -608,6 +610,55 @@ err_late:
 	return (error);
 }
 
+static int
+eth_igb_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+	struct rte_pci_device *pci_dev;
+	struct e1000_hw *hw;
+	unsigned i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return -EPERM;
+
+	hw = E1000_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+	pci_dev = eth_dev->pci_dev;
+
+	if (igb_adapter_stopped == 0)
+		eth_igb_close(eth_dev);
+
+	eth_dev->dev_ops = NULL;
+	eth_dev->rx_pkt_burst = NULL;
+	eth_dev->tx_pkt_burst = NULL;
+
+	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
+		eth_igb_rx_queue_release(eth_dev->data->rx_queues[i]);
+		eth_dev->data->rx_queues[i] = NULL;
+	}
+
+	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
+		eth_igb_tx_queue_release(eth_dev->data->tx_queues[i]);
+		eth_dev->data->tx_queues[i] = NULL;
+	}
+
+	/* Reset any pending lock */
+	igb_reset_swfw_lock(hw);
+
+	rte_free(eth_dev->data->mac_addrs);
+	eth_dev->data->mac_addrs = NULL;
+
+	/* uninitialize PF if max_vfs not zero */
+	igb_pf_host_uninit(eth_dev);
+
+	/* disable uio intr before callback unregister */
+	rte_intr_disable(&(pci_dev->intr_handle));
+	rte_intr_callback_unregister(&(pci_dev->intr_handle),
+		eth_igb_interrupt_handler, (void *)eth_dev);
+
+	return 0;
+}
+
 /*
  * Virtual Function device init
  */
@@ -639,6 +690,7 @@ eth_igbvf_dev_init(struct rte_eth_dev *eth_dev)
 	hw->device_id = pci_dev->id.device_id;
 	hw->vendor_id = pci_dev->id.vendor_id;
 	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
+	igb_adapter_stopped = 0;
 
 	/* Initialize the shared code (base driver) */
 	diag = e1000_setup_init_funcs(hw, TRUE);
@@ -679,13 +731,36 @@ eth_igbvf_dev_init(struct rte_eth_dev *eth_dev)
 	return 0;
 }
 
+static int
+eth_igbvf_dev_uninit(struct rte_eth_dev *eth_dev)
+{
+	PMD_INIT_FUNC_TRACE();
+
+	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+		return -EPERM;
+
+	if (igb_adapter_stopped == 0)
+		igbvf_dev_close(eth_dev);
+
+	eth_dev->dev_ops = NULL;
+	eth_dev->rx_pkt_burst = NULL;
+	eth_dev->tx_pkt_burst = NULL;
+
+	rte_free(eth_dev->data->mac_addrs);
+	eth_dev->data->mac_addrs = NULL;
+
+	return 0;
+}
+
 static struct eth_driver rte_igb_pmd = {
 	{
 		.name = "rte_igb_pmd",
 		.id_table = pci_id_igb_map,
-		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,
+		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC |
+			RTE_PCI_DRV_DETACHABLE,
 	},
 	.eth_dev_init = eth_igb_dev_init,
+	.eth_dev_uninit = eth_igb_dev_uninit,
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
@@ -696,9 +771,10 @@ static struct eth_driver rte_igbvf_pmd = {
 	{
 		.name = "rte_igbvf_pmd",
 		.id_table = pci_id_igbvf_map,
-		.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
+		.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_DETACHABLE,
 	},
 	.eth_dev_init = eth_igbvf_dev_init,
+	.eth_dev_uninit = eth_igbvf_dev_uninit,
 	.dev_private_size = sizeof(struct e1000_adapter),
 };
 
@@ -780,6 +856,7 @@ eth_igb_start(struct rte_eth_dev *dev)
 		PMD_INIT_LOG(ERR, "Unable to initialize the hardware");
 		return (-EIO);
 	}
+	igb_adapter_stopped = 0;
 
 	E1000_WRITE_REG(hw, E1000_VET, ETHER_TYPE_VLAN << 16 | ETHER_TYPE_VLAN);
 
@@ -989,6 +1066,8 @@ eth_igb_close(struct rte_eth_dev *dev)
 	struct rte_eth_link link;
 
 	eth_igb_stop(dev);
+	igb_adapter_stopped = 1;
+
 	e1000_phy_hw_reset(hw);
 	igb_release_manageability(hw);
 	igb_hw_control_release(hw);
@@ -2227,6 +2306,7 @@ igbvf_dev_start(struct rte_eth_dev *dev)
 	PMD_INIT_FUNC_TRACE();
 
 	hw->mac.ops.reset_hw(hw);
+	igb_adapter_stopped = 0;
 
 	/* Set all vfta */
 	igbvf_set_vfta_all(dev,1);
@@ -2270,6 +2350,7 @@ igbvf_dev_close(struct rte_eth_dev *dev)
 	e1000_reset_hw(hw);
 
 	igbvf_dev_stop(dev);
+	igb_adapter_stopped = 1;
 }
 
 static int igbvf_set_vfta(struct e1000_hw *hw, uint16_t vid, bool on)
diff --git a/drivers/net/e1000/igb_pf.c b/drivers/net/e1000/igb_pf.c
index 6a4d210..26c2960 100644
--- a/drivers/net/e1000/igb_pf.c
+++ b/drivers/net/e1000/igb_pf.c
@@ -127,6 +127,28 @@ void igb_pf_host_init(struct rte_eth_dev *eth_dev)
 	return;
 }
 
+void igb_pf_host_uninit(struct rte_eth_dev *dev)
+{
+	struct e1000_vf_info **vfinfo;
+	uint16_t vf_num;
+
+	PMD_INIT_FUNC_TRACE();
+
+	vfinfo = E1000_DEV_PRIVATE_TO_P_VFDATA(dev->data->dev_private);
+
+	RTE_ETH_DEV_SRIOV(dev).active = 0;
+	RTE_ETH_DEV_SRIOV(dev).nb_q_per_pool = 0;
+	RTE_ETH_DEV_SRIOV(dev).def_vmdq_idx = 0;
+	RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx = 0;
+
+	vf_num = dev_num_vf(dev);
+	if (vf_num == 0)
+		return;
+
+	rte_free(*vfinfo);
+	*vfinfo = NULL;
+}
+
 #define E1000_RAH_POOLSEL_SHIFT    (18)
 int igb_pf_host_configure(struct rte_eth_dev *eth_dev)
 {
-- 
1.7.4.1

  parent reply	other threads:[~2015-06-03 14:03 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <RFC PATCH>
2015-04-08 10:02 ` [dpdk-dev] [RFC PATCH] librte_pmd_ixgbe: changes to support PCI Port Hotplug Bernard Iremonger
2015-04-22  3:14   ` Qiu, Michael
2015-04-08 14:11 ` [dpdk-dev] [RFC PATCH] librte_pmd_e1000: igb and em1000 PCI Port Hotplug changes Bernard Iremonger
2015-04-30 13:16 ` [dpdk-dev] [RFC PATCH 1/1] librte_pmd_ring: changes to support PCI Port Hotplug Bernard Iremonger
2015-04-30 15:40 ` [dpdk-dev] [RFC PATCH 1/4] librte_pmd_i40e: " Bernard Iremonger
2015-04-30 15:41 ` [dpdk-dev] [RFC PATCH 2/4] librte_pmd_i40e: release vmdq vsi's in dev_close Bernard Iremonger
2015-04-30 15:42 ` [dpdk-dev] [RFC PATCH 3/4] librte_pmd_i40e: increase ASQ_DELAY_MS to 100 in i40evf_wait_cmd_done() Bernard Iremonger
2015-04-30 15:42 ` [dpdk-dev] [RFC PATCH 4/4] librte_pmd_i40e: call _clear_cmd() when error occurs Bernard Iremonger
2015-05-01 14:36 ` [dpdk-dev] [RFC PATCH] librte_pmd_bond: add support for PCI Port Hotplug Bernard Iremonger
2015-05-01 15:17   ` Neil Horman
2015-05-01 15:28 ` [dpdk-dev] [RFC PATCH] librte_pmd_virtio: " Bernard Iremonger
2015-05-05 14:36 ` [dpdk-dev] [RFC PATCH V2] librte_pmd_ring: changes to support " Bernard Iremonger
2015-05-06 16:15   ` Bruce Richardson
2015-05-06 10:22 ` [dpdk-dev] [RFC PATCH V2] librte_pmd_ixgbe: " Bernard Iremonger
2015-05-06 11:20 ` [dpdk-dev] [RFC PATCH V2] librte_pmd_e1000: igb and em1000 PCI Port Hotplug changes Bernard Iremonger
2015-05-27 16:00 ` [dpdk-dev] [RFC PATCH V2 1/2] drivers/net/virtio: add support for PCI Port Hotplug Bernard Iremonger
2015-05-27 16:00 ` [dpdk-dev] [RFC PATCH V2 2/2] drivers/net/virtio: check vq parameter Bernard Iremonger
2015-06-16  1:08   ` Ouyang, Changchun
2015-05-28 12:28 ` [dpdk-dev] [RFC PATCH V2] drivers/net/bonding: add support for PCI Port Hotplug Bernard Iremonger
2015-05-29 13:46 ` [dpdk-dev] [RFC PATCH V3] drivers/net/ring: changes to support " Bernard Iremonger
2015-06-03 15:21   ` Bruce Richardson
2015-06-02 10:18 ` [dpdk-dev] [RFC PATCH V3] ixgbe: " Bernard Iremonger
2015-06-03 14:03 ` Bernard Iremonger [this message]
2015-06-04 16:24 ` [dpdk-dev] [RFC PATCH V2 1/4] i40e: " Bernard Iremonger
2015-06-24  8:03   ` Qiu, Michael
2015-06-04 16:25 ` [dpdk-dev] [RFC PATCH V2 2/4] i40e: release vmdq vsi's in dev_close Bernard Iremonger
2015-06-04 16:25 ` [dpdk-dev] [RFC PATCH V2 3/4] i40e: increase ASQ_DELAY_MS to 100 in i40evf_wait_cmd_done() Bernard Iremonger
2015-06-04 16:26 ` [dpdk-dev] [RFC PATCH V2 4/4] i40e: call _clear_cmd() when error occurs Bernard Iremonger
2015-06-08 15:47 ` [dpdk-dev] [RFC PATCH V4] ixgbe: changes to support PCI Port Hotplug Bernard Iremonger
2015-06-15 22:31   ` Ananyev, Konstantin
2015-06-17  6:11   ` Zhang, Helin
2015-06-24  7:45   ` Qiu, Michael
2015-06-24  7:46   ` Qiu, Michael
2015-06-10  8:27 ` [dpdk-dev] [RFC PATCH V3 0/5] PCI Port Hotplug changes Bernard Iremonger
2015-06-10  8:27   ` [dpdk-dev] [RFC PATCH V3 1/5] i40e: changes to support PCI Port Hotplug Bernard Iremonger
2015-06-10  8:27   ` [dpdk-dev] [RFC PATCH V3 2/5] i40e: release vmdq vsi's in dev_close Bernard Iremonger
2015-06-10  8:27   ` [dpdk-dev] [RFC PATCH V3 3/5] i40e: increase ASQ_DELAY_MS to 100 in i40evf_wait_cmd_done() Bernard Iremonger
2015-06-10  8:27   ` [dpdk-dev] [RFC PATCH V3 4/5] i40e: call _clear_cmd() when error occurs Bernard Iremonger
2015-06-10  8:27   ` [dpdk-dev] [RFC PATCH V3 5/5] i40e: clear queues in i40evf_dev_stop Bernard Iremonger
2015-06-10 12:09 ` [dpdk-dev] [RFC PATCH V4] e1000: igb and em1000 PCI Port Hotplug changes Bernard Iremonger
2015-08-27 15:40 ` [dpdk-dev] [RFC PATCH 0/6] remove pci driver from vdevs Bernard Iremonger
2015-08-27 15:40   ` [dpdk-dev] [RFC PATCH 1/6] librte_ether: add fields from rte_pci_driver to rte_eth_dev and rte_eth_dev_data Bernard Iremonger
2015-08-31 14:07     ` Thomas Monjalon
2015-09-01 11:38       ` Iremonger, Bernard
2015-09-01 12:03         ` Bruce Richardson
2015-09-01 12:37         ` Ananyev, Konstantin
2015-09-01 12:43           ` Richardson, Bruce
2015-08-27 15:40   ` [dpdk-dev] [RFC PATCH 2/6] librte_ether: handle RTE_ETH_DEV_INTR_LSC for vdevs Bernard Iremonger
2015-08-27 15:40   ` [dpdk-dev] [RFC PATCH 3/6] null: remove pci device driver Bernard Iremonger
2015-08-31 14:11     ` Thomas Monjalon
2015-08-31 16:05       ` Iremonger, Bernard
2015-08-27 15:40   ` [dpdk-dev] [RFC PATCH 4/6] ring: " Bernard Iremonger
2015-08-27 15:40   ` [dpdk-dev] [RFC PATCH 5/6] bonding: " Bernard Iremonger
2015-08-27 17:48     ` Stephen Hemminger
2015-08-28  8:32       ` Iremonger, Bernard
2015-08-28 15:57         ` Stephen Hemminger
2015-08-27 15:40   ` [dpdk-dev] [RFC PATCH 6/6] pcap: " Bernard Iremonger
2015-08-27 17:43   ` [dpdk-dev] [RFC PATCH 0/6] remove pci driver from vdevs John W. Linville
2015-08-28  8:15     ` Iremonger, Bernard
2015-08-28 10:32       ` Neil Horman
2015-08-28 19:48         ` Wiles, Keith
2015-08-31 11:21           ` Iremonger, Bernard
2015-08-31 12:41             ` Neil Horman
2015-08-28 17:51       ` John W. Linville
2015-08-31 10:23         ` Iremonger, Bernard
2015-08-31 12:59           ` Neil Horman
2015-08-31 14:22             ` Thomas Monjalon
2015-09-01 13:38               ` Iremonger, Bernard
2015-09-01 19:18                 ` Neil Horman
2015-09-03 14:02                   ` Iremonger, Bernard
2015-09-07  9:22                     ` Zende, Amruta S
2015-09-04 11:01 ` [dpdk-dev] [RFC PATCH 00/18] refactor eal driver registration code Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 01/18] librte_eal: remove type field from rte_driver structure Bernard Iremonger
2015-09-04 13:08     ` Thomas Monjalon
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 02/18] af_packet: " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 03/18] bnx2x: remove type field and initialise name field in " Bernard Iremonger
2015-09-04 11:26     ` Harish Patil
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 04/18] bonding: remove type field from " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 05/18] cxgbe: " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 06/18] e1000: remove type field and initialise name field in rte_driver structures Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 07/18] enic: remove type field and initialise name field in rte_driver structure Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 08/18] fm10k: " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 09/18] i40e: remove type field and initialise name field in rte_driver structures Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 10/18] ixgbe: remove type field and initialise name field in rte_driver structure Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 11/18] mlx4: remove type field from " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 12/18] mpipe: remove type field and update name in " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 13/18] null: remove type field from " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 14/18] pcap: " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 15/18] ring: " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 16/18] virtio_ethdev: remove type field and initialise name field in " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 17/18] vmxnet3: " Bernard Iremonger
2015-09-04 11:01   ` [dpdk-dev] [RFC PATCH 18/18] xenvirt: remove type field from " Bernard Iremonger
2015-09-04 11:18   ` [dpdk-dev] [RFC PATCH 00/18] refactor eal driver registration code Bruce Richardson
2015-09-04 12:46     ` Iremonger, Bernard
2015-09-04 12:53       ` Bruce Richardson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1433340182-20382-1-git-send-email-bernard.iremonger@intel.com \
    --to=bernard.iremonger@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).