s390/qdio: cleanup chsc SSQD usage
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Wed, 5 Jun 2013 16:58:35 +0000 (18:58 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 26 Jun 2013 19:10:14 +0000 (21:10 +0200)
Cleanup the function qdio_setup_get_ssqd. Fix some possible
memleaks and an unchecked allocation and create a wrapper
for SSQD in chsc.c .

Reviewed-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/chsc.c
drivers/s390/cio/chsc.h
drivers/s390/cio/qdio.h
drivers/s390/cio/qdio_setup.c

index 8ea7d9b..d119d0d 100644 (file)
@@ -144,6 +144,29 @@ out:
        return ret;
 }
 
+/**
+ * chsc_ssqd() - store subchannel QDIO data (SSQD)
+ * @schid: id of the subchannel on which SSQD is performed
+ * @ssqd: request and response block for SSQD
+ *
+ * Returns 0 on success.
+ */
+int chsc_ssqd(struct subchannel_id schid, struct chsc_ssqd_area *ssqd)
+{
+       memset(ssqd, 0, sizeof(*ssqd));
+       ssqd->request.length = 0x0010;
+       ssqd->request.code = 0x0024;
+       ssqd->first_sch = schid.sch_no;
+       ssqd->last_sch = schid.sch_no;
+       ssqd->ssid = schid.ssid;
+
+       if (chsc(ssqd))
+               return -EIO;
+
+       return chsc_error_from_response(ssqd->response.code);
+}
+EXPORT_SYMBOL_GPL(chsc_ssqd);
+
 static int s390_subchannel_remove_chpid(struct subchannel *sch, void *data)
 {
        spin_lock_irq(sch->lock);
Simple merge
Simple merge
Simple merge