Hi, Lipeng On 2017/11/1 22:47, Lipeng wrote: > From: qumingguang <quminggu...@huawei.com> > > There is no necessary to reallocate the descriptor and remap the descriptor > memory in reset process, But there is still some other action exit in both
exit -> exist > reset process and initialization process. > > To reuse the common interface of reset process and initialization process, of -> in > This patch moved out the descriptor allocate and memory maping from This -> this, moved -> moves > interface cmdq_init. > > Signed-off-by: qumingguang <quminggu...@huawei.com> > Signed-off-by: Lipeng <lipeng...@huawei.com> > --- > .../net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c | 39 > +++++++++++++--------- > .../net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 1 + > .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 9 ++++- > 3 files changed, 33 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c > b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c > index 60960e5..ff13d18 100644 > --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c > +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c > @@ -62,7 +62,7 @@ static void hclge_free_cmd_desc(struct hclge_cmq_ring *ring) > ring->desc = NULL; > } > > -static int hclge_init_cmd_queue(struct hclge_dev *hdev, int ring_type) > +static int hclge_alloc_cmd_queue(struct hclge_dev *hdev, int ring_type) > { > struct hclge_hw *hw = &hdev->hw; > struct hclge_cmq_ring *ring = > @@ -79,9 +79,6 @@ static int hclge_init_cmd_queue(struct hclge_dev *hdev, int > ring_type) > return ret; > } > > - ring->next_to_clean = 0; > - ring->next_to_use = 0; > - > return 0; > } > > @@ -302,37 +299,52 @@ static enum hclge_cmd_status > hclge_cmd_query_firmware_version( > return ret; > } > > -int hclge_cmd_init(struct hclge_dev *hdev) > +int hclge_cmd_queue_init(struct hclge_dev *hdev) > { > - u32 version; > int ret; > > /* Setup the queue entries for use cmd queue */ > hdev->hw.cmq.csq.desc_num = HCLGE_NIC_CMQ_DESC_NUM; > hdev->hw.cmq.crq.desc_num = HCLGE_NIC_CMQ_DESC_NUM; > > - /* Setup the lock for command queue */ > - spin_lock_init(&hdev->hw.cmq.csq.lock); > - spin_lock_init(&hdev->hw.cmq.crq.lock); > - > /* Setup Tx write back timeout */ > hdev->hw.cmq.tx_timeout = HCLGE_CMDQ_TX_TIMEOUT; > > /* Setup queue rings */ > - ret = hclge_init_cmd_queue(hdev, HCLGE_TYPE_CSQ); > + ret = hclge_alloc_cmd_queue(hdev, HCLGE_TYPE_CSQ); > if (ret) { > dev_err(&hdev->pdev->dev, > "CSQ ring setup error %d\n", ret); > return ret; > } > > - ret = hclge_init_cmd_queue(hdev, HCLGE_TYPE_CRQ); > + ret = hclge_alloc_cmd_queue(hdev, HCLGE_TYPE_CRQ); > if (ret) { > dev_err(&hdev->pdev->dev, > "CRQ ring setup error %d\n", ret); > goto err_csq; > } > > + return 0; > +err_csq: > + hclge_free_cmd_desc(&hdev->hw.cmq.csq); > + return ret; > +} > + > +int hclge_cmd_init(struct hclge_dev *hdev) > +{ > + u32 version; > + int ret; > + > + hdev->hw.cmq.csq.next_to_clean = 0; > + hdev->hw.cmq.csq.next_to_use = 0; > + hdev->hw.cmq.crq.next_to_clean = 0; > + hdev->hw.cmq.crq.next_to_use = 0; > + > + /* Setup the lock for command queue */ > + spin_lock_init(&hdev->hw.cmq.csq.lock); > + spin_lock_init(&hdev->hw.cmq.crq.lock); > + > hclge_cmd_init_regs(&hdev->hw); > > ret = hclge_cmd_query_firmware_version(&hdev->hw, &version); > @@ -346,9 +358,6 @@ int hclge_cmd_init(struct hclge_dev *hdev) > dev_info(&hdev->pdev->dev, "The firmware version is %08x\n", version); > > return 0; > -err_csq: > - hclge_free_cmd_desc(&hdev->hw.cmq.csq); > - return ret; > } > > static void hclge_destroy_queue(struct hclge_cmq_ring *ring) > diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h > b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h > index b437334..6bdc216 100644 > --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h > +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h > @@ -750,4 +750,5 @@ enum hclge_cmd_status hclge_cmd_mdio_read(struct hclge_hw > *hw, > struct hclge_desc *desc); > > void hclge_destroy_cmd_queue(struct hclge_hw *hw); > +int hclge_cmd_queue_init(struct hclge_dev *hdev); > #endif > diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c > b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c > index 4ef4592..a7686fe 100644 > --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c > +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c > @@ -4446,7 +4446,14 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev > *ae_dev) > goto err_pci_init; > } > > - /* Command queue initialize */ > + /* Firmware command queue initialize */ > + ret = hclge_cmd_queue_init(hdev); > + if (ret) { > + dev_err(&pdev->dev, "Cmd queue init failed\n"); > + return ret; > + } > + > + /* Firmware command initialize */ > ret = hclge_cmd_init(hdev); > if (ret) > goto err_cmd_init; >