Re: [PATCH V3 net-next 02/21] net-next/hinic: Initialize hw device components

2017-08-03 Thread David Miller
From: Aviad Krawczyk 
Date: Thu, 3 Aug 2017 17:54:08 +0800

> +static int get_capability(struct hinic_hwdev *hwdev,
> +   struct hinic_dev_cap *dev_cap)
> +{
> + struct hinic_hwif *hwif = hwdev->hwif;
> + struct hinic_cap *nic_cap = >nic_cap;
> + int num_aeqs, num_ceqs, num_irqs, num_qps;

Please order local variable declarations from longest to shortest
line (aka: reverse christmas tree order).

Move the initialization down into the code if that is necessary
to achiever this.

> +static int get_dev_cap(struct hinic_hwdev *hwdev)
> +{
> + struct hinic_pfhwdev *pfhwdev;
> + struct hinic_hwif *hwif = hwdev->hwif;
> + struct pci_dev *pdev = hwif->pdev;
> + int err;

Likewise.


[PATCH V3 net-next 02/21] net-next/hinic: Initialize hw device components

2017-08-03 Thread Aviad Krawczyk
Initialize hw device by calling the initialization functions of aeqs and
management channel.

Signed-off-by: Aviad Krawczyk 
Signed-off-by: Zhao Chen 
---
 drivers/net/ethernet/huawei/hinic/Makefile|   3 +-
 drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c  | 176 --
 drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h  |  14 +-
 drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c  | 149 ++
 drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.h  | 107 +
 drivers/net/ethernet/huawei/hinic/hinic_hw_if.h   |   8 +
 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c |  92 +++
 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.h |  45 ++
 8 files changed, 579 insertions(+), 15 deletions(-)
 create mode 100644 drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.c
 create mode 100644 drivers/net/ethernet/huawei/hinic/hinic_hw_eqs.h
 create mode 100644 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c
 create mode 100644 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.h

diff --git a/drivers/net/ethernet/huawei/hinic/Makefile 
b/drivers/net/ethernet/huawei/hinic/Makefile
index 353cee0..717ad71 100644
--- a/drivers/net/ethernet/huawei/hinic/Makefile
+++ b/drivers/net/ethernet/huawei/hinic/Makefile
@@ -1,3 +1,4 @@
 obj-$(CONFIG_HINIC) += hinic.o
 
-hinic-y := hinic_main.o hinic_hw_dev.o hinic_hw_if.o
+hinic-y := hinic_main.o hinic_hw_dev.o hinic_hw_mgmt.o hinic_hw_eqs.o \
+  hinic_hw_if.o
diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c 
b/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c
index a4db49e..935476a 100644
--- a/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c
+++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c
@@ -23,11 +23,135 @@
 #include 
 
 #include "hinic_hw_if.h"
+#include "hinic_hw_eqs.h"
+#include "hinic_hw_mgmt.h"
 #include "hinic_hw_dev.h"
 
 #define MAX_IRQS(max_qps, num_aeqs, num_ceqs)   \
 (2 * (max_qps) + (num_aeqs) + (num_ceqs))
 
+enum intr_type {
+   INTR_MSIX_TYPE,
+};
+
+/* HW struct */
+struct hinic_dev_cap {
+   u8  status;
+   u8  version;
+   u8  rsvd0[6];
+
+   u8  rsvd1[5];
+   u8  intr_type;
+   u8  rsvd2[66];
+   u16 max_sqs;
+   u16 max_rqs;
+   u8  rsvd3[208];
+};
+
+/**
+ * get_capability - convert device capabilities to NIC capabilities
+ * @hwdev: the HW device to set and convert device capabilities for
+ * @dev_cap: device capabilities from FW
+ *
+ * Return 0 - Success, negative - Failure
+ **/
+static int get_capability(struct hinic_hwdev *hwdev,
+ struct hinic_dev_cap *dev_cap)
+{
+   struct hinic_hwif *hwif = hwdev->hwif;
+   struct hinic_cap *nic_cap = >nic_cap;
+   int num_aeqs, num_ceqs, num_irqs, num_qps;
+
+   if (!HINIC_IS_PF(hwif) && !HINIC_IS_PPF(hwif))
+   return -EINVAL;
+
+   if (dev_cap->intr_type != INTR_MSIX_TYPE)
+   return -EFAULT;
+
+   num_aeqs = HINIC_HWIF_NUM_AEQS(hwif);
+   num_ceqs = HINIC_HWIF_NUM_CEQS(hwif);
+   num_irqs = HINIC_HWIF_NUM_IRQS(hwif);
+
+   /* Each QP has its own (SQ + RQ) interrupts */
+   num_qps = (num_irqs - (num_aeqs + num_ceqs)) / 2;
+
+   /* num_qps must be power of 2 */
+   num_qps = BIT(fls(num_qps) - 1);
+
+   nic_cap->max_qps = dev_cap->max_sqs + 1;
+   if (nic_cap->max_qps != (dev_cap->max_rqs + 1))
+   return -EFAULT;
+
+   if (num_qps < nic_cap->max_qps)
+   nic_cap->num_qps = num_qps;
+   else
+   nic_cap->num_qps = nic_cap->max_qps;
+
+   return 0;
+}
+
+/**
+ * get_cap_from_fw - get device capabilities from FW
+ * @pfhwdev: the PF HW device to get capabilities for
+ *
+ * Return 0 - Success, negative - Failure
+ **/
+static int get_cap_from_fw(struct hinic_pfhwdev *pfhwdev)
+{
+   struct hinic_hwdev *hwdev = >hwdev;
+   struct hinic_hwif *hwif = hwdev->hwif;
+   struct pci_dev *pdev = hwif->pdev;
+   struct hinic_dev_cap dev_cap;
+   u16 in_len, out_len;
+   int err;
+
+   in_len = 0;
+   out_len = sizeof(dev_cap);
+
+   err = hinic_msg_to_mgmt(>pf_to_mgmt, HINIC_MOD_CFGM,
+   HINIC_CFG_NIC_CAP, _cap, in_len, _cap,
+   _len, HINIC_MGMT_MSG_SYNC);
+   if (err) {
+   dev_err(>dev, "Failed to get capability from FW\n");
+   return err;
+   }
+
+   return get_capability(hwdev, _cap);
+}
+
+/**
+ * get_dev_cap - get device capabilities
+ * @hwdev: the NIC HW device to get capabilities for
+ *
+ * Return 0 - Success, negative - Failure
+ **/
+static int get_dev_cap(struct hinic_hwdev *hwdev)
+{
+   struct hinic_pfhwdev *pfhwdev;
+   struct hinic_hwif *hwif = hwdev->hwif;
+   struct pci_dev *pdev = hwif->pdev;
+   int err;
+
+   switch (HINIC_FUNC_TYPE(hwif)) {
+   case HINIC_PPF:
+   case HINIC_PF:
+