[S390] cio: CHSC SIOSL Support

A Linux interface for the CHSC command
store-I/O-operation-status-and-initiate-logging (SIOSL).
Model-dependent logging within the channel subsystem can be invoked
via a helper function or a writable subchannel device attribute.

Signed-off-by: Michael Ernst <mernst@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
这个提交包含在:
Michael Ernst
2010-08-09 18:12:50 +02:00
提交者 Martin Schwidefsky
父节点 45d7f32c7a
当前提交 fd0457a6ae
修改 4 个文件,包含 89 行新增0 行删除

查看文件

@@ -29,6 +29,7 @@
#include "chsc.h"
static void *sei_page;
static DEFINE_SPINLOCK(siosl_lock);
static DEFINE_SPINLOCK(sda_lock);
/**
@@ -48,6 +49,7 @@ int chsc_error_from_response(int response)
case 0x0007:
case 0x0008:
case 0x000a:
case 0x0104:
return -EINVAL;
case 0x0004:
return -EOPNOTSUPP;
@@ -974,3 +976,49 @@ int chsc_sstpi(void *page, void *result, size_t size)
return (rr->response.code == 0x0001) ? 0 : -EIO;
}
static struct {
struct chsc_header request;
u32 word1;
struct subchannel_id sid;
u32 word3;
struct chsc_header response;
u32 word[11];
} __attribute__ ((packed)) siosl_area __attribute__ ((__aligned__(PAGE_SIZE)));
int chsc_siosl(struct subchannel_id schid)
{
unsigned long flags;
int ccode;
int rc;
spin_lock_irqsave(&siosl_lock, flags);
memset(&siosl_area, 0, sizeof(siosl_area));
siosl_area.request.length = 0x0010;
siosl_area.request.code = 0x0046;
siosl_area.word1 = 0x80000000;
siosl_area.sid = schid;
ccode = chsc(&siosl_area);
if (ccode > 0) {
if (ccode == 3)
rc = -ENODEV;
else
rc = -EBUSY;
CIO_MSG_EVENT(2, "chsc: chsc failed for 0.%x.%04x (ccode=%d)\n",
schid.ssid, schid.sch_no, ccode);
goto out;
}
rc = chsc_error_from_response(siosl_area.response.code);
if (rc)
CIO_MSG_EVENT(2, "chsc: siosl failed for 0.%x.%04x (rc=%04x)\n",
schid.ssid, schid.sch_no,
siosl_area.response.code);
else
CIO_MSG_EVENT(4, "chsc: siosl succeeded for 0.%x.%04x\n",
schid.ssid, schid.sch_no);
out:
spin_unlock_irqrestore(&siosl_lock, flags);
return rc;
}
EXPORT_SYMBOL_GPL(chsc_siosl);