@@ -266,4 +266,7 @@ static inline int __pcibus_to_node(const struct pci_bus *bus)
#endif /* CONFIG_NUMA */
+int zdev_query_pci_fngrp(struct zpci_dev *zdev,
+ struct clp_req_rsp_query_pci_grp *rrb);
+int zdev_query_pci_fn(struct zpci_dev *zdev, struct clp_req_rsp_query_pci *rrb);
#endif
@@ -113,32 +113,18 @@ static void clp_store_query_pci_fngrp(struct zpci_dev *zdev,
}
}
-static int clp_query_pci_fngrp(struct zpci_dev *zdev, u8 pfgid)
+int zdev_query_pci_fngrp(struct zpci_dev *zdev,
+ struct clp_req_rsp_query_pci_grp *rrb)
{
- struct clp_req_rsp_query_pci_grp *rrb;
- int rc;
-
- rrb = clp_alloc_block(GFP_KERNEL);
- if (!rrb)
- return -ENOMEM;
-
memset(rrb, 0, sizeof(*rrb));
rrb->request.hdr.len = sizeof(rrb->request);
rrb->request.hdr.cmd = CLP_QUERY_PCI_FNGRP;
rrb->response.hdr.len = sizeof(rrb->response);
- rrb->request.pfgid = pfgid;
+ rrb->request.pfgid = zdev->pfgid;
- rc = clp_req(rrb, CLP_LPS_PCI);
- if (!rc && rrb->response.hdr.rsp == CLP_RC_OK)
- clp_store_query_pci_fngrp(zdev, &rrb->response);
- else {
- zpci_err("Q PCI FGRP:\n");
- zpci_err_clp(rrb->response.hdr.rsp, rc);
- rc = -EIO;
- }
- clp_free_block(rrb);
- return rc;
+ return clp_req(rrb, CLP_LPS_PCI);
}
+EXPORT_SYMBOL(zdev_query_pci_fngrp);
static int clp_store_query_pci_fn(struct zpci_dev *zdev,
struct clp_rsp_query_pci *response)
@@ -174,32 +160,49 @@ static int clp_store_query_pci_fn(struct zpci_dev *zdev,
return 0;
}
-static int clp_query_pci_fn(struct zpci_dev *zdev, u32 fh)
+int zdev_query_pci_fn(struct zpci_dev *zdev, struct clp_req_rsp_query_pci *rrb)
+{
+
+ memset(rrb, 0, sizeof(*rrb));
+ rrb->request.hdr.len = sizeof(rrb->request);
+ rrb->request.hdr.cmd = CLP_QUERY_PCI_FN;
+ rrb->response.hdr.len = sizeof(rrb->response);
+ rrb->request.fh = zdev->fh;
+
+ return clp_req(rrb, CLP_LPS_PCI);
+}
+
+static int clp_query_pci(struct zpci_dev *zdev)
{
struct clp_req_rsp_query_pci *rrb;
+ struct clp_req_rsp_query_pci_grp *grrb;
int rc;
rrb = clp_alloc_block(GFP_KERNEL);
if (!rrb)
return -ENOMEM;
- memset(rrb, 0, sizeof(*rrb));
- rrb->request.hdr.len = sizeof(rrb->request);
- rrb->request.hdr.cmd = CLP_QUERY_PCI_FN;
- rrb->response.hdr.len = sizeof(rrb->response);
- rrb->request.fh = fh;
-
- rc = clp_req(rrb, CLP_LPS_PCI);
- if (!rc && rrb->response.hdr.rsp == CLP_RC_OK) {
- rc = clp_store_query_pci_fn(zdev, &rrb->response);
- if (rc)
- goto out;
- rc = clp_query_pci_fngrp(zdev, rrb->response.pfgid);
- } else {
+ rc = zdev_query_pci_fn(zdev, rrb);
+ if (rc || rrb->response.hdr.rsp != CLP_RC_OK) {
zpci_err("Q PCI FN:\n");
zpci_err_clp(rrb->response.hdr.rsp, rc);
rc = -EIO;
+ goto out;
}
+ rc = clp_store_query_pci_fn(zdev, &rrb->response);
+ if (rc)
+ goto out;
+
+ grrb = (struct clp_req_rsp_query_pci_grp *)rrb;
+ rc = zdev_query_pci_fngrp(zdev, grrb);
+ if (rc || grrb->response.hdr.rsp != CLP_RC_OK) {
+ zpci_err("Q PCI FGRP:\n");
+ zpci_err_clp(grrb->response.hdr.rsp, rc);
+ rc = -EIO;
+ goto out;
+ }
+ clp_store_query_pci_fngrp(zdev, &grrb->response);
+
out:
clp_free_block(rrb);
return rc;
@@ -219,7 +222,7 @@ int clp_add_pci_device(u32 fid, u32 fh, int configured)
zdev->fid = fid;
/* Query function properties and update zdev */
- rc = clp_query_pci_fn(zdev, fh);
+ rc = clp_query_pci(zdev);
if (rc)
goto error;