|
@@ -1,7 +1,7 @@
|
|
|
/*
|
|
|
- * Sclp "store data in absolut storage"
|
|
|
+ * SCLP "store data in absolute storage"
|
|
|
*
|
|
|
- * Copyright IBM Corp. 2003, 2007
|
|
|
+ * Copyright IBM Corp. 2003, 2013
|
|
|
* Author(s): Michael Holzheu
|
|
|
*/
|
|
|
|
|
@@ -14,6 +14,7 @@
|
|
|
#include <asm/debug.h>
|
|
|
#include <asm/ipl.h>
|
|
|
|
|
|
+#include "sclp_sdias.h"
|
|
|
#include "sclp.h"
|
|
|
#include "sclp_rw.h"
|
|
|
|
|
@@ -22,46 +23,12 @@
|
|
|
#define SDIAS_RETRIES 300
|
|
|
#define SDIAS_SLEEP_TICKS 50
|
|
|
|
|
|
-#define EQ_STORE_DATA 0x0
|
|
|
-#define EQ_SIZE 0x1
|
|
|
-#define DI_FCP_DUMP 0x0
|
|
|
-#define ASA_SIZE_32 0x0
|
|
|
-#define ASA_SIZE_64 0x1
|
|
|
-#define EVSTATE_ALL_STORED 0x0
|
|
|
-#define EVSTATE_NO_DATA 0x3
|
|
|
-#define EVSTATE_PART_STORED 0x10
|
|
|
-
|
|
|
static struct debug_info *sdias_dbf;
|
|
|
|
|
|
static struct sclp_register sclp_sdias_register = {
|
|
|
.send_mask = EVTYP_SDIAS_MASK,
|
|
|
};
|
|
|
|
|
|
-struct sdias_evbuf {
|
|
|
- struct evbuf_header hdr;
|
|
|
- u8 event_qual;
|
|
|
- u8 data_id;
|
|
|
- u64 reserved2;
|
|
|
- u32 event_id;
|
|
|
- u16 reserved3;
|
|
|
- u8 asa_size;
|
|
|
- u8 event_status;
|
|
|
- u32 reserved4;
|
|
|
- u32 blk_cnt;
|
|
|
- u64 asa;
|
|
|
- u32 reserved5;
|
|
|
- u32 fbn;
|
|
|
- u32 reserved6;
|
|
|
- u32 lbn;
|
|
|
- u16 reserved7;
|
|
|
- u16 dbs;
|
|
|
-} __attribute__((packed));
|
|
|
-
|
|
|
-struct sdias_sccb {
|
|
|
- struct sccb_header hdr;
|
|
|
- struct sdias_evbuf evbuf;
|
|
|
-} __attribute__((packed));
|
|
|
-
|
|
|
static struct sdias_sccb sccb __attribute__((aligned(4096)));
|
|
|
static struct sdias_evbuf sdias_evbuf;
|
|
|
|
|
@@ -148,8 +115,8 @@ int sclp_sdias_blk_count(void)
|
|
|
sccb.hdr.length = sizeof(sccb);
|
|
|
sccb.evbuf.hdr.length = sizeof(struct sdias_evbuf);
|
|
|
sccb.evbuf.hdr.type = EVTYP_SDIAS;
|
|
|
- sccb.evbuf.event_qual = EQ_SIZE;
|
|
|
- sccb.evbuf.data_id = DI_FCP_DUMP;
|
|
|
+ sccb.evbuf.event_qual = SDIAS_EQ_SIZE;
|
|
|
+ sccb.evbuf.data_id = SDIAS_DI_FCP_DUMP;
|
|
|
sccb.evbuf.event_id = 4712;
|
|
|
sccb.evbuf.dbs = 1;
|
|
|
|
|
@@ -208,13 +175,13 @@ int sclp_sdias_copy(void *dest, int start_blk, int nr_blks)
|
|
|
sccb.evbuf.hdr.length = sizeof(struct sdias_evbuf);
|
|
|
sccb.evbuf.hdr.type = EVTYP_SDIAS;
|
|
|
sccb.evbuf.hdr.flags = 0;
|
|
|
- sccb.evbuf.event_qual = EQ_STORE_DATA;
|
|
|
- sccb.evbuf.data_id = DI_FCP_DUMP;
|
|
|
+ sccb.evbuf.event_qual = SDIAS_EQ_STORE_DATA;
|
|
|
+ sccb.evbuf.data_id = SDIAS_DI_FCP_DUMP;
|
|
|
sccb.evbuf.event_id = 4712;
|
|
|
#ifdef CONFIG_64BIT
|
|
|
- sccb.evbuf.asa_size = ASA_SIZE_64;
|
|
|
+ sccb.evbuf.asa_size = SDIAS_ASA_SIZE_64;
|
|
|
#else
|
|
|
- sccb.evbuf.asa_size = ASA_SIZE_32;
|
|
|
+ sccb.evbuf.asa_size = SDIAS_ASA_SIZE_32;
|
|
|
#endif
|
|
|
sccb.evbuf.event_status = 0;
|
|
|
sccb.evbuf.blk_cnt = nr_blks;
|
|
@@ -240,20 +207,19 @@ int sclp_sdias_copy(void *dest, int start_blk, int nr_blks)
|
|
|
}
|
|
|
|
|
|
switch (sdias_evbuf.event_status) {
|
|
|
- case EVSTATE_ALL_STORED:
|
|
|
- TRACE("all stored\n");
|
|
|
- break;
|
|
|
- case EVSTATE_PART_STORED:
|
|
|
- TRACE("part stored: %i\n", sdias_evbuf.blk_cnt);
|
|
|
- break;
|
|
|
- case EVSTATE_NO_DATA:
|
|
|
- TRACE("no data\n");
|
|
|
- /* fall through */
|
|
|
- default:
|
|
|
- pr_err("Error from SCLP while copying hsa. "
|
|
|
- "Event status = %x\n",
|
|
|
- sdias_evbuf.event_status);
|
|
|
- rc = -EIO;
|
|
|
+ case SDIAS_EVSTATE_ALL_STORED:
|
|
|
+ TRACE("all stored\n");
|
|
|
+ break;
|
|
|
+ case SDIAS_EVSTATE_PART_STORED:
|
|
|
+ TRACE("part stored: %i\n", sdias_evbuf.blk_cnt);
|
|
|
+ break;
|
|
|
+ case SDIAS_EVSTATE_NO_DATA:
|
|
|
+ TRACE("no data\n");
|
|
|
+ /* fall through */
|
|
|
+ default:
|
|
|
+ pr_err("Error from SCLP while copying hsa. Event status = %x\n",
|
|
|
+ sdias_evbuf.event_status);
|
|
|
+ rc = -EIO;
|
|
|
}
|
|
|
out:
|
|
|
mutex_unlock(&sdias_mutex);
|