s390/qdio: cleanup chsc SADC usage
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Wed, 5 Jun 2013 16:59:22 +0000 (18:59 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 26 Jun 2013 19:10:15 +0000 (21:10 +0200)
Move the code to issue the set adapter device controls command to
chsc.c and make it accessible for the qdio code via the wrapper
chsc_sadc.

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_thinint.c

index d119d0d..13299f9 100644 (file)
@@ -20,6 +20,7 @@
 #include <asm/chpid.h>
 #include <asm/chsc.h>
 #include <asm/crw.h>
+#include <asm/isc.h>
 
 #include "css.h"
 #include "cio.h"
@@ -167,6 +168,42 @@ int chsc_ssqd(struct subchannel_id schid, struct chsc_ssqd_area *ssqd)
 }
 EXPORT_SYMBOL_GPL(chsc_ssqd);
 
+/**
+ * chsc_sadc() - set adapter device controls (SADC)
+ * @schid: id of the subchannel on which SADC is performed
+ * @scssc: request and response block for SADC
+ * @summary_indicator_addr: summary indicator address
+ * @subchannel_indicator_addr: subchannel indicator address
+ *
+ * Returns 0 on success.
+ */
+int chsc_sadc(struct subchannel_id schid, struct chsc_scssc_area *scssc,
+             u64 summary_indicator_addr, u64 subchannel_indicator_addr)
+{
+       memset(scssc, 0, sizeof(*scssc));
+       scssc->request.length = 0x0fe0;
+       scssc->request.code = 0x0021;
+       scssc->operation_code = 0;
+
+       scssc->summary_indicator_addr = summary_indicator_addr;
+       scssc->subchannel_indicator_addr = subchannel_indicator_addr;
+
+       scssc->ks = PAGE_DEFAULT_KEY >> 4;
+       scssc->kc = PAGE_DEFAULT_KEY >> 4;
+       scssc->isc = QDIO_AIRQ_ISC;
+       scssc->schid = schid;
+
+       /* enable the time delay disablement facility */
+       if (css_general_characteristics.aif_tdd)
+               scssc->word_with_d_bit = 0x10000000;
+
+       if (chsc(scssc))
+               return -EIO;
+
+       return chsc_error_from_response(scssc->response.code);
+}
+EXPORT_SYMBOL_GPL(chsc_sadc);
+
 static int s390_subchannel_remove_chpid(struct subchannel *sch, void *data)
 {
        spin_lock_irq(sch->lock);
Simple merge
Simple merge
Simple merge