From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 18EFCC33A for ; Tue, 2 Jun 2015 11:36:30 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP; 02 Jun 2015 02:36:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,538,1427785200"; d="scan'208";a="501433905" Received: from kmsmsx151.gar.corp.intel.com ([172.21.73.86]) by FMSMGA003.fm.intel.com with ESMTP; 02 Jun 2015 02:36:28 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by KMSMSX151.gar.corp.intel.com (172.21.73.86) with Microsoft SMTP Server (TLS) id 14.3.224.2; Tue, 2 Jun 2015 17:36:27 +0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.120]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.23]) with mapi id 14.03.0224.002; Tue, 2 Jun 2015 17:36:26 +0800 From: "Qiu, Michael" To: "Iremonger, Bernard" , "dev@dpdk.org" Thread-Topic: [RFC PATCH] librte_pmd_fm10k: Add hotplug support for fm10k Thread-Index: AQHQm69NxTsy2b7RuEyA1DyNhbGU+A== Date: Tue, 2 Jun 2015 09:36:25 +0000 Message-ID: <533710CFB86FA344BFBF2D6802E60286046854D1@SHSMSX101.ccr.corp.intel.com> References: <1433083021-16701-1-git-send-email-michael.qiu@intel.com> <8CEF83825BEC744B83065625E567D7C204A2C707@IRSMSX108.ger.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: "He, Shaopeng" Subject: Re: [dpdk-dev] [RFC PATCH] librte_pmd_fm10k: Add hotplug support for fm10k X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Jun 2015 09:36:31 -0000 On 6/2/2015 4:26 PM, Iremonger, Bernard wrote:=0A= >=0A= > -----Original Message-----=0A= > From: Qiu, Michael =0A= > Sent: Sunday, May 31, 2015 3:37 PM=0A= > To: dev@dpdk.org=0A= > Cc: Chen, Jing D; Iremonger, Bernard; He, Shaopeng; Qiu, Michael=0A= > Subject: [RFC PATCH] librte_pmd_fm10k: Add hotplug support for fm10k=0A= >=0A= > Add hotplug support for fm10k=0A= >=0A= > Signed-off-by: Michael Qiu =0A= > ---=0A= > lib/librte_pmd_fm10k/fm10k_ethdev.c | 134 ++++++++++++++++++++++++++++++= ++++--=0A= > 1 file changed, 129 insertions(+), 5 deletions(-)=0A= >=0A= > Hi Michael,=0A= >=0A= > The location of the fm10k pmd has changed to drivers/net/fm10k.=0A= > lib/librte_pmd_fm10k no longer exists.=0A= > You will need to rebase to use the new directory structure.=0A= =0A= OK, got it, I will rebase it,=0A= =0A= Thanks,=0A= Michael=0A= > Regards,=0A= >=0A= > Bernard.=0A= > =0A= >=0A= > diff --git a/lib/librte_pmd_fm10k/fm10k_ethdev.c b/lib/librte_pmd_fm10k/f= m10k_ethdev.c=0A= > index 7f5f513..3d72607 100644=0A= > --- a/lib/librte_pmd_fm10k/fm10k_ethdev.c=0A= > +++ b/lib/librte_pmd_fm10k/fm10k_ethdev.c=0A= > @@ -55,6 +55,10 @@=0A= > =0A= > static void fm10k_close_mbx_service(struct fm10k_hw *hw);=0A= > =0A= > +static void fm10k_tx_queue_release(void *queue);=0A= > +=0A= > +static void fm10k_rx_queue_release(void *queue);=0A= > +=0A= > static void=0A= > fm10k_mbx_initlock(struct fm10k_hw *hw) { @@ -688,11 +692,35 @@ fm10k_d= ev_stop(struct rte_eth_dev *dev)=0A= > =0A= > PMD_INIT_FUNC_TRACE();=0A= > =0A= > - for (i =3D 0; i < dev->data->nb_tx_queues; i++)=0A= > - fm10k_dev_tx_queue_stop(dev, i);=0A= > + if (dev->data->tx_queues)=0A= > + for (i =3D 0; i < dev->data->nb_tx_queues; i++)=0A= > + fm10k_dev_tx_queue_stop(dev, i);=0A= > =0A= > - for (i =3D 0; i < dev->data->nb_rx_queues; i++)=0A= > - fm10k_dev_rx_queue_stop(dev, i);=0A= > + if (dev->data->rx_queues)=0A= > + for (i =3D 0; i < dev->data->nb_rx_queues; i++)=0A= > + fm10k_dev_rx_queue_stop(dev, i);=0A= > +}=0A= > +=0A= > +static void=0A= > +fm10k_dev_queue_release(__rte_unused struct rte_eth_dev *dev) {=0A= > + int i;=0A= > +=0A= > + PMD_INIT_FUNC_TRACE();=0A= > +=0A= > + if (dev->data->tx_queues) {=0A= > + for (i =3D 0; i < dev->data->nb_tx_queues; i++)=0A= > + fm10k_tx_queue_release(dev->data->tx_queues[i]);=0A= > + rte_free(dev->data->tx_queues);=0A= > + dev->data->tx_queues =3D NULL;=0A= > + }=0A= > +=0A= > + if (dev->data->rx_queues) {=0A= > + for (i =3D 0; i < dev->data->nb_rx_queues; i++)=0A= > + fm10k_rx_queue_release(dev->data->rx_queues[i]);=0A= > + rte_free(dev->data->rx_queues);=0A= > + dev->data->rx_queues =3D NULL;=0A= > + }=0A= > }=0A= > =0A= > static void=0A= > @@ -705,6 +733,7 @@ fm10k_dev_close(struct rte_eth_dev *dev)=0A= > /* Stop mailbox service first */=0A= > fm10k_close_mbx_service(hw);=0A= > fm10k_dev_stop(dev);=0A= > + fm10k_dev_queue_release(dev);=0A= > fm10k_stop_hw(hw);=0A= > }=0A= > =0A= > @@ -1406,6 +1435,36 @@ fm10k_dev_enable_intr_pf(struct rte_eth_dev *dev) = }=0A= > =0A= > static void=0A= > +fm10k_dev_disable_intr_pf(struct rte_eth_dev *dev) {=0A= > + struct fm10k_hw *hw =3D FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private)= ;=0A= > + uint32_t int_map =3D FM10K_INT_MAP_DISABLE;=0A= > +=0A= > + int_map |=3D 0;=0A= > +=0A= > + FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_Mailbox), int_map);=0A= > + FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_PCIeFault), int_map);=0A= > + FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchUpDown), int_map);=0A= > + FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchEvent), int_map);=0A= > + FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SRAM), int_map);=0A= > + FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_VFLR), int_map);=0A= > +=0A= > + /* Disable misc causes */=0A= > + FM10K_WRITE_REG(hw, FM10K_EIMR, FM10K_EIMR_DISABLE(PCA_FAULT) |=0A= > + FM10K_EIMR_DISABLE(THI_FAULT) |=0A= > + FM10K_EIMR_DISABLE(FUM_FAULT) |=0A= > + FM10K_EIMR_DISABLE(MAILBOX) |=0A= > + FM10K_EIMR_DISABLE(SWITCHREADY) |=0A= > + FM10K_EIMR_DISABLE(SWITCHNOTREADY) |=0A= > + FM10K_EIMR_DISABLE(SRAMERROR) |=0A= > + FM10K_EIMR_DISABLE(VFLR));=0A= > +=0A= > + /* Disable ITR 0 */=0A= > + FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_MASK_SET);=0A= > + FM10K_WRITE_FLUSH(hw);=0A= > +}=0A= > +=0A= > +static void=0A= > fm10k_dev_enable_intr_vf(struct rte_eth_dev *dev) {=0A= > struct fm10k_hw *hw =3D FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private)= ;=0A= > @@ -1423,6 +1482,22 @@ fm10k_dev_enable_intr_vf(struct rte_eth_dev *dev)= =0A= > FM10K_WRITE_FLUSH(hw);=0A= > }=0A= > =0A= > +static void=0A= > +fm10k_dev_disable_intr_vf(struct rte_eth_dev *dev) {=0A= > + struct fm10k_hw *hw =3D FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private)= ;=0A= > + uint32_t int_map =3D FM10K_INT_MAP_DISABLE;=0A= > +=0A= > + int_map |=3D 0;=0A= > +=0A= > + /* Only INT 0 available, other 15 are reserved. */=0A= > + FM10K_WRITE_REG(hw, FM10K_VFINT_MAP, int_map);=0A= > +=0A= > + /* Disable ITR 0 */=0A= > + FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_MASK_SET);=0A= > + FM10K_WRITE_FLUSH(hw);=0A= > +}=0A= > +=0A= > static int=0A= > fm10k_dev_handle_fault(struct fm10k_hw *hw, uint32_t eicr) { @@ -1868,6= +1943,54 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev)=0A= > return 0;=0A= > }=0A= > =0A= > +static int=0A= > +eth_fm10k_dev_uninit(struct rte_eth_dev *dev) {=0A= > + struct fm10k_hw *hw =3D FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private)= ;=0A= > +=0A= > + PMD_INIT_FUNC_TRACE();=0A= > +=0A= > + /* only uninitialize in the primary process */=0A= > + if (rte_eal_process_type() !=3D RTE_PROC_PRIMARY)=0A= > + return 0;=0A= > +=0A= > + /* safe to close dev here */=0A= > + fm10k_dev_close(dev);=0A= > +=0A= > + dev->dev_ops =3D NULL;=0A= > + dev->rx_pkt_burst =3D NULL;=0A= > + dev->tx_pkt_burst =3D NULL;=0A= > +=0A= > + /* disable uio/vfio intr */=0A= > + rte_intr_disable(&(dev->pci_dev->intr_handle));=0A= > +=0A= > + /*PF/VF has different interrupt handling mechanism */=0A= > + if (hw->mac.type =3D=3D fm10k_mac_pf) {=0A= > + /* disable interrupt */=0A= > + fm10k_dev_disable_intr_pf(dev);=0A= > +=0A= > + /* unregister callback func to eal lib */=0A= > + rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),=0A= > + fm10k_dev_interrupt_handler_pf, (void *)dev);=0A= > + } else {=0A= > + /* disable interrupt */=0A= > + fm10k_dev_disable_intr_vf(dev);=0A= > +=0A= > + rte_intr_callback_unregister(&(dev->pci_dev->intr_handle),=0A= > + fm10k_dev_interrupt_handler_vf, (void *)dev);=0A= > + }=0A= > +=0A= > + /* free mac memory */=0A= > + if (dev->data->mac_addrs) {=0A= > + rte_free(dev->data->mac_addrs);=0A= > + dev->data->mac_addrs =3D NULL;=0A= > + }=0A= > +=0A= > + memset(hw, 0, sizeof(*hw));=0A= > +=0A= > + return 0;=0A= > +}=0A= > +=0A= > /*=0A= > * The set of PCI devices this driver supports. This driver will enable = both PF=0A= > * and SRIOV-VF devices.=0A= > @@ -1883,9 +2006,10 @@ static struct eth_driver rte_pmd_fm10k =3D {=0A= > {=0A= > .name =3D "rte_pmd_fm10k",=0A= > .id_table =3D pci_id_fm10k_map,=0A= > - .drv_flags =3D RTE_PCI_DRV_NEED_MAPPING,=0A= > + .drv_flags =3D RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_DETACHABLE,=0A= > },=0A= > .eth_dev_init =3D eth_fm10k_dev_init,=0A= > + .eth_dev_uninit =3D eth_fm10k_dev_uninit,=0A= > .dev_private_size =3D sizeof(struct fm10k_adapter), };=0A= > =0A= > --=0A= > 1.9.3=0A= >=0A= >=0A= =0A=