net: mana: Configure hwc timeout from hardware
[linux-2.6-microblaze.git] / drivers / net / ethernet / microsoft / mana / gdma_main.c
index 3765d33..6367de0 100644 (file)
@@ -106,6 +106,25 @@ static int mana_gd_query_max_resources(struct pci_dev *pdev)
        return 0;
 }
 
+static int mana_gd_query_hwc_timeout(struct pci_dev *pdev, u32 *timeout_val)
+{
+       struct gdma_context *gc = pci_get_drvdata(pdev);
+       struct gdma_query_hwc_timeout_resp resp = {};
+       struct gdma_query_hwc_timeout_req req = {};
+       int err;
+
+       mana_gd_init_req_hdr(&req.hdr, GDMA_QUERY_HWC_TIMEOUT,
+                            sizeof(req), sizeof(resp));
+       req.timeout_ms = *timeout_val;
+       err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
+       if (err || resp.hdr.status)
+               return err ? err : -EPROTO;
+
+       *timeout_val = resp.timeout_ms;
+
+       return 0;
+}
+
 static int mana_gd_detect_devices(struct pci_dev *pdev)
 {
        struct gdma_context *gc = pci_get_drvdata(pdev);
@@ -882,8 +901,10 @@ int mana_gd_verify_vf_version(struct pci_dev *pdev)
        struct gdma_context *gc = pci_get_drvdata(pdev);
        struct gdma_verify_ver_resp resp = {};
        struct gdma_verify_ver_req req = {};
+       struct hw_channel_context *hwc;
        int err;
 
+       hwc = gc->hwc.driver_data;
        mana_gd_init_req_hdr(&req.hdr, GDMA_VERIFY_VF_DRIVER_VERSION,
                             sizeof(req), sizeof(resp));
 
@@ -910,7 +931,14 @@ int mana_gd_verify_vf_version(struct pci_dev *pdev)
                        err, resp.hdr.status);
                return err ? err : -EPROTO;
        }
-
+       if (resp.pf_cap_flags1 & GDMA_DRV_CAP_FLAG_1_HWC_TIMEOUT_RECONFIG) {
+               err = mana_gd_query_hwc_timeout(pdev, &hwc->hwc_timeout);
+               if (err) {
+                       dev_err(gc->dev, "Failed to set the hwc timeout %d\n", err);
+                       return err;
+               }
+               dev_dbg(gc->dev, "set the hwc timeout to %u\n", hwc->hwc_timeout);
+       }
        return 0;
 }