Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[platform/kernel/linux-starfive.git] / drivers / net / ethernet / hisilicon / hns3 / hns3pf / hclge_mbx.c
index f890022..e16a730 100644 (file)
@@ -79,15 +79,26 @@ static int hclge_send_mbx_msg(struct hclge_vport *vport, u8 *msg, u16 msg_len,
        return status;
 }
 
-static int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport)
+int hclge_inform_reset_assert_to_vf(struct hclge_vport *vport)
 {
+       struct hclge_dev *hdev = vport->back;
+       enum hnae3_reset_type reset_type;
        u8 msg_data[2];
        u8 dest_vfid;
 
        dest_vfid = (u8)vport->vport_id;
 
+       if (hdev->reset_type == HNAE3_FUNC_RESET)
+               reset_type = HNAE3_VF_PF_FUNC_RESET;
+       else if (hdev->reset_type == HNAE3_FLR_RESET)
+               reset_type = HNAE3_VF_FULL_RESET;
+       else
+               return -EINVAL;
+
+       memcpy(&msg_data[0], &reset_type, sizeof(u16));
+
        /* send this requested info to VF */
-       return hclge_send_mbx_msg(vport, msg_data, sizeof(u8),
+       return hclge_send_mbx_msg(vport, msg_data, sizeof(msg_data),
                                  HCLGE_MBX_ASSERTING_RESET, dest_vfid);
 }
 
@@ -290,6 +301,21 @@ static int hclge_set_vf_vlan_cfg(struct hclge_vport *vport,
        return status;
 }
 
+static int hclge_set_vf_alive(struct hclge_vport *vport,
+                             struct hclge_mbx_vf_to_pf_cmd *mbx_req,
+                             bool gen_resp)
+{
+       bool alive = !!mbx_req->msg[2];
+       int ret = 0;
+
+       if (alive)
+               ret = hclge_vport_start(vport);
+       else
+               hclge_vport_stop(vport);
+
+       return ret;
+}
+
 static int hclge_get_vf_tcinfo(struct hclge_vport *vport,
                               struct hclge_mbx_vf_to_pf_cmd *mbx_req,
                               bool gen_resp)
@@ -363,24 +389,28 @@ static void hclge_reset_vf(struct hclge_vport *vport,
        int ret;
 
        dev_warn(&hdev->pdev->dev, "PF received VF reset request from VF %d!",
-                mbx_req->mbx_src_vfid);
-
-       /* Acknowledge VF that PF is now about to assert the reset for the VF.
-        * On receiving this message VF will get into pending state and will
-        * start polling for the hardware reset completion status.
-        */
-       ret = hclge_inform_reset_assert_to_vf(vport);
-       if (ret) {
-               dev_err(&hdev->pdev->dev,
-                       "PF fail(%d) to inform VF(%d)of reset, reset failed!\n",
-                       ret, vport->vport_id);
-               return;
-       }
+                vport->vport_id);
 
-       dev_warn(&hdev->pdev->dev, "PF is now resetting VF %d.\n",
-                mbx_req->mbx_src_vfid);
-       /* reset this virtual function */
-       hclge_func_reset_cmd(hdev, mbx_req->mbx_src_vfid);
+       ret = hclge_func_reset_cmd(hdev, vport->vport_id);
+       hclge_gen_resp_to_vf(vport, mbx_req, ret, NULL, 0);
+}
+
+static void hclge_vf_keep_alive(struct hclge_vport *vport,
+                               struct hclge_mbx_vf_to_pf_cmd *mbx_req)
+{
+       vport->last_active_jiffies = jiffies;
+}
+
+static int hclge_set_vf_mtu(struct hclge_vport *vport,
+                           struct hclge_mbx_vf_to_pf_cmd *mbx_req)
+{
+       int ret;
+       u32 mtu;
+
+       memcpy(&mtu, &mbx_req->msg[2], sizeof(mtu));
+       ret = hclge_set_vport_mtu(vport, mtu);
+
+       return hclge_gen_resp_to_vf(vport, mbx_req, ret, NULL, 0);
 }
 
 static bool hclge_cmd_crq_empty(struct hclge_hw *hw)
@@ -460,6 +490,13 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
                                        "PF failed(%d) to config VF's VLAN\n",
                                        ret);
                        break;
+               case HCLGE_MBX_SET_ALIVE:
+                       ret = hclge_set_vf_alive(vport, req, false);
+                       if (ret)
+                               dev_err(&hdev->pdev->dev,
+                                       "PF failed(%d) to set VF's ALIVE\n",
+                                       ret);
+                       break;
                case HCLGE_MBX_GET_QINFO:
                        ret = hclge_get_vf_queue_info(vport, req, true);
                        if (ret)
@@ -487,6 +524,15 @@ void hclge_mbx_handler(struct hclge_dev *hdev)
                case HCLGE_MBX_RESET:
                        hclge_reset_vf(vport, req);
                        break;
+               case HCLGE_MBX_KEEP_ALIVE:
+                       hclge_vf_keep_alive(vport, req);
+                       break;
+               case HCLGE_MBX_SET_MTU:
+                       ret = hclge_set_vf_mtu(vport, req);
+                       if (ret)
+                               dev_err(&hdev->pdev->dev,
+                                       "VF fail(%d) to set mtu\n", ret);
+                       break;
                default:
                        dev_err(&hdev->pdev->dev,
                                "un-supported mailbox message, code = %d\n",