net: hns3: fix a -Wformat-nonliteral compile warning
[linux-2.6-microblaze.git] / drivers / net / ethernet / hisilicon / hns3 / hns3pf / hclge_main.c
index 6e97837..b2faebd 100644 (file)
@@ -30,6 +30,9 @@
 #define HCLGE_BUF_SIZE_UNIT    256U
 #define HCLGE_BUF_MUL_BY       2
 #define HCLGE_BUF_DIV_BY       2
+#define NEED_RESERVE_TC_NUM    2
+#define BUF_MAX_PERCENT                100
+#define BUF_RESERVE_PERCENT    90
 
 #define HCLGE_RESET_MAX_FAIL_CNT       5
 
@@ -561,8 +564,7 @@ static u8 *hclge_comm_get_strings(u32 stringset,
                return buff;
 
        for (i = 0; i < size; i++) {
-               snprintf(buff, ETH_GSTRING_LEN,
-                        strs[i].desc);
+               snprintf(buff, ETH_GSTRING_LEN, "%s", strs[i].desc);
                buff = buff + ETH_GSTRING_LEN;
        }
 
@@ -1694,10 +1696,14 @@ static bool  hclge_is_rx_buf_ok(struct hclge_dev *hdev,
        }
 
        if (hnae3_dev_dcb_supported(hdev)) {
+               hi_thrd = shared_buf - hdev->dv_buf_size;
+
+               if (tc_num <= NEED_RESERVE_TC_NUM)
+                       hi_thrd = hi_thrd * BUF_RESERVE_PERCENT
+                                       / BUF_MAX_PERCENT;
+
                if (tc_num)
-                       hi_thrd = (shared_buf - hdev->dv_buf_size) / tc_num;
-               else
-                       hi_thrd = shared_buf - hdev->dv_buf_size;
+                       hi_thrd = hi_thrd / tc_num;
 
                hi_thrd = max_t(u32, hi_thrd, HCLGE_BUF_MUL_BY * aligned_mps);
                hi_thrd = rounddown(hi_thrd, HCLGE_BUF_SIZE_UNIT);
@@ -1837,6 +1843,55 @@ static bool hclge_drop_pfc_buf_till_fit(struct hclge_dev *hdev,
        return hclge_is_rx_buf_ok(hdev, buf_alloc, rx_all);
 }
 
+static int hclge_only_alloc_priv_buff(struct hclge_dev *hdev,
+                                     struct hclge_pkt_buf_alloc *buf_alloc)
+{
+#define COMPENSATE_BUFFER      0x3C00
+#define COMPENSATE_HALF_MPS_NUM        5
+#define PRIV_WL_GAP            0x1800
+
+       u32 rx_priv = hdev->pkt_buf_size - hclge_get_tx_buff_alloced(buf_alloc);
+       u32 tc_num = hclge_get_tc_num(hdev);
+       u32 half_mps = hdev->mps >> 1;
+       u32 min_rx_priv;
+       unsigned int i;
+
+       if (tc_num)
+               rx_priv = rx_priv / tc_num;
+
+       if (tc_num <= NEED_RESERVE_TC_NUM)
+               rx_priv = rx_priv * BUF_RESERVE_PERCENT / BUF_MAX_PERCENT;
+
+       min_rx_priv = hdev->dv_buf_size + COMPENSATE_BUFFER +
+                       COMPENSATE_HALF_MPS_NUM * half_mps;
+       min_rx_priv = round_up(min_rx_priv, HCLGE_BUF_SIZE_UNIT);
+       rx_priv = round_down(rx_priv, HCLGE_BUF_SIZE_UNIT);
+
+       if (rx_priv < min_rx_priv)
+               return false;
+
+       for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
+               struct hclge_priv_buf *priv = &buf_alloc->priv_buf[i];
+
+               priv->enable = 0;
+               priv->wl.low = 0;
+               priv->wl.high = 0;
+               priv->buf_size = 0;
+
+               if (!(hdev->hw_tc_map & BIT(i)))
+                       continue;
+
+               priv->enable = 1;
+               priv->buf_size = rx_priv;
+               priv->wl.high = rx_priv - hdev->dv_buf_size;
+               priv->wl.low = priv->wl.high - PRIV_WL_GAP;
+       }
+
+       buf_alloc->s_buf.buf_size = 0;
+
+       return true;
+}
+
 /* hclge_rx_buffer_calc: calculate the rx private buffer size for all TCs
  * @hdev: pointer to struct hclge_dev
  * @buf_alloc: pointer to buffer calculation data
@@ -1856,6 +1911,9 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
                return 0;
        }
 
+       if (hclge_only_alloc_priv_buff(hdev, buf_alloc))
+               return 0;
+
        if (hclge_rx_buf_calc_all(hdev, true, buf_alloc))
                return 0;
 
@@ -2400,6 +2458,15 @@ static int hclge_mac_init(struct hclge_dev *hdev)
                return ret;
        }
 
+       if (hdev->hw.mac.support_autoneg) {
+               ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg);
+               if (ret) {
+                       dev_err(&hdev->pdev->dev,
+                               "Config mac autoneg fail ret=%d\n", ret);
+                       return ret;
+               }
+       }
+
        mac->link = 0;
 
        if (mac->user_fec_mode & BIT(HNAE3_FEC_USER_DEF)) {
@@ -8273,25 +8340,44 @@ static int hclge_init_nic_client_instance(struct hnae3_ae_dev *ae_dev,
 {
        struct hnae3_client *client = vport->nic.client;
        struct hclge_dev *hdev = ae_dev->priv;
+       int rst_cnt;
        int ret;
 
+       rst_cnt = hdev->rst_stats.reset_cnt;
        ret = client->ops->init_instance(&vport->nic);
        if (ret)
                return ret;
 
        set_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
-       hnae3_set_client_init_flag(client, ae_dev, 1);
+       if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
+           rst_cnt != hdev->rst_stats.reset_cnt) {
+               ret = -EBUSY;
+               goto init_nic_err;
+       }
 
        /* Enable nic hw error interrupts */
        ret = hclge_config_nic_hw_error(hdev, true);
-       if (ret)
+       if (ret) {
                dev_err(&ae_dev->pdev->dev,
                        "fail(%d) to enable hw error interrupts\n", ret);
+               goto init_nic_err;
+       }
+
+       hnae3_set_client_init_flag(client, ae_dev, 1);
 
        if (netif_msg_drv(&hdev->vport->nic))
                hclge_info_show(hdev);
 
        return ret;
+
+init_nic_err:
+       clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
+       while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
+               msleep(HCLGE_WAIT_RESET_DONE);
+
+       client->ops->uninit_instance(&vport->nic, 0);
+
+       return ret;
 }
 
 static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev,
@@ -8299,6 +8385,7 @@ static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev,
 {
        struct hnae3_client *client = vport->roce.client;
        struct hclge_dev *hdev = ae_dev->priv;
+       int rst_cnt;
        int ret;
 
        if (!hnae3_dev_roce_supported(hdev) || !hdev->roce_client ||
@@ -8310,14 +8397,38 @@ static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev,
        if (ret)
                return ret;
 
+       rst_cnt = hdev->rst_stats.reset_cnt;
        ret = client->ops->init_instance(&vport->roce);
        if (ret)
                return ret;
 
        set_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
+       if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
+           rst_cnt != hdev->rst_stats.reset_cnt) {
+               ret = -EBUSY;
+               goto init_roce_err;
+       }
+
+       /* Enable roce ras interrupts */
+       ret = hclge_config_rocee_ras_interrupt(hdev, true);
+       if (ret) {
+               dev_err(&ae_dev->pdev->dev,
+                       "fail(%d) to enable roce ras interrupts\n", ret);
+               goto init_roce_err;
+       }
+
        hnae3_set_client_init_flag(client, ae_dev, 1);
 
        return 0;
+
+init_roce_err:
+       clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
+       while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
+               msleep(HCLGE_WAIT_RESET_DONE);
+
+       hdev->roce_client->ops->uninit_instance(&vport->roce, 0);
+
+       return ret;
 }
 
 static int hclge_init_client_instance(struct hnae3_client *client,
@@ -8360,12 +8471,6 @@ static int hclge_init_client_instance(struct hnae3_client *client,
                }
        }
 
-       /* Enable roce ras interrupts */
-       ret = hclge_config_rocee_ras_interrupt(hdev, true);
-       if (ret)
-               dev_err(&ae_dev->pdev->dev,
-                       "fail(%d) to enable roce ras interrupts\n", ret);
-
        return ret;
 
 clear_nic:
@@ -8389,6 +8494,9 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
                vport = &hdev->vport[i];
                if (hdev->roce_client) {
                        clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
+                       while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
+                               msleep(HCLGE_WAIT_RESET_DONE);
+
                        hdev->roce_client->ops->uninit_instance(&vport->roce,
                                                                0);
                        hdev->roce_client = NULL;
@@ -8398,6 +8506,9 @@ static void hclge_uninit_client_instance(struct hnae3_client *client,
                        return;
                if (hdev->nic_client && client->ops->uninit_instance) {
                        clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
+                       while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state))
+                               msleep(HCLGE_WAIT_RESET_DONE);
+
                        client->ops->uninit_instance(&vport->nic, 0);
                        hdev->nic_client = NULL;
                        vport->nic.client = NULL;