s390/qdio: bridgeport support - CHSC part
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / s390 / cio / chsc.c
index eee70cb..f6b9188 100644 (file)
@@ -55,6 +55,7 @@ int chsc_error_from_response(int response)
        case 0x0004:
                return -EOPNOTSUPP;
        case 0x000b:
+       case 0x0107:            /* "Channel busy" for the op 0x003d */
                return -EBUSY;
        case 0x0100:
        case 0x0102:
@@ -1202,3 +1203,35 @@ out:
        return ret;
 }
 EXPORT_SYMBOL_GPL(chsc_scm_info);
+
+/**
+ * chsc_pnso_brinfo() - Perform Network-Subchannel Operation, Bridge Info.
+ * @schid:             id of the subchannel on which PNSO is performed
+ * @brinfo_area:       request and response block for the operation
+ * @resume_token:      resume token for multiblock response
+ * @cnc:               Boolean change-notification control
+ *
+ * brinfo_area must be allocated by the caller with get_zeroed_page(GFP_KERNEL)
+ *
+ * Returns 0 on success.
+ */
+int chsc_pnso_brinfo(struct subchannel_id schid,
+               struct chsc_pnso_area *brinfo_area,
+               struct chsc_brinfo_resume_token resume_token,
+               int cnc)
+{
+       memset(brinfo_area, 0, sizeof(*brinfo_area));
+       brinfo_area->request.length = 0x0030;
+       brinfo_area->request.code = 0x003d; /* network-subchannel operation */
+       brinfo_area->m     = schid.m;
+       brinfo_area->ssid  = schid.ssid;
+       brinfo_area->sch   = schid.sch_no;
+       brinfo_area->cssid = schid.cssid;
+       brinfo_area->oc    = 0; /* Store-network-bridging-information list */
+       brinfo_area->resume_token = resume_token;
+       brinfo_area->n     = (cnc != 0);
+       if (chsc(brinfo_area))
+               return -EIO;
+       return chsc_error_from_response(brinfo_area->response.code);
+}
+EXPORT_SYMBOL_GPL(chsc_pnso_brinfo);