mirror of
https://github.com/torvalds/linux.git
synced 2024-12-15 15:41:58 +00:00
2a842acab1
Currently we use nornal Linux errno values in the block layer, and while we accept any error a few have overloaded magic meanings. This patch instead introduces a new blk_status_t value that holds block layer specific status codes and explicitly explains their meaning. Helpers to convert from and to the previous special meanings are provided for now, but I suspect we want to get rid of them in the long run - those drivers that have a errno input (e.g. networking) usually get errnos that don't know about the special block layer overloads, and similarly returning them to userspace will usually return somethings that strictly speaking isn't correct for file system operations, but that's left as an exercise for later. For now the set of errors is a very limited set that closely corresponds to the previous overloaded errno values, but there is some low hanging fruite to improve it. blk_status_t (ab)uses the sparse __bitwise annotations to allow for sparse typechecking, so that we can easily catch places passing the wrong values. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@fb.com>
120 lines
2.0 KiB
C
120 lines
2.0 KiB
C
#ifndef _ASM_S390_EADM_H
|
|
#define _ASM_S390_EADM_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/device.h>
|
|
#include <linux/blkdev.h>
|
|
|
|
struct arqb {
|
|
u64 data;
|
|
u16 fmt:4;
|
|
u16:12;
|
|
u16 cmd_code;
|
|
u16:16;
|
|
u16 msb_count;
|
|
u32 reserved[12];
|
|
} __packed;
|
|
|
|
#define ARQB_CMD_MOVE 1
|
|
|
|
struct arsb {
|
|
u16 fmt:4;
|
|
u32:28;
|
|
u8 ef;
|
|
u8:8;
|
|
u8 ecbi;
|
|
u8:8;
|
|
u8 fvf;
|
|
u16:16;
|
|
u8 eqc;
|
|
u32:32;
|
|
u64 fail_msb;
|
|
u64 fail_aidaw;
|
|
u64 fail_ms;
|
|
u64 fail_scm;
|
|
u32 reserved[4];
|
|
} __packed;
|
|
|
|
#define EQC_WR_PROHIBIT 22
|
|
|
|
struct msb {
|
|
u8 fmt:4;
|
|
u8 oc:4;
|
|
u8 flags;
|
|
u16:12;
|
|
u16 bs:4;
|
|
u32 blk_count;
|
|
u64 data_addr;
|
|
u64 scm_addr;
|
|
u64:64;
|
|
} __packed;
|
|
|
|
struct aidaw {
|
|
u8 flags;
|
|
u32 :24;
|
|
u32 :32;
|
|
u64 data_addr;
|
|
} __packed;
|
|
|
|
#define MSB_OC_CLEAR 0
|
|
#define MSB_OC_READ 1
|
|
#define MSB_OC_WRITE 2
|
|
#define MSB_OC_RELEASE 3
|
|
|
|
#define MSB_FLAG_BNM 0x80
|
|
#define MSB_FLAG_IDA 0x40
|
|
|
|
#define MSB_BS_4K 0
|
|
#define MSB_BS_1M 1
|
|
|
|
#define AOB_NR_MSB 124
|
|
|
|
struct aob {
|
|
struct arqb request;
|
|
struct arsb response;
|
|
struct msb msb[AOB_NR_MSB];
|
|
} __packed __aligned(PAGE_SIZE);
|
|
|
|
struct aob_rq_header {
|
|
struct scm_device *scmdev;
|
|
char data[0];
|
|
};
|
|
|
|
struct scm_device {
|
|
u64 address;
|
|
u64 size;
|
|
unsigned int nr_max_block;
|
|
struct device dev;
|
|
struct {
|
|
unsigned int persistence:4;
|
|
unsigned int oper_state:4;
|
|
unsigned int data_state:4;
|
|
unsigned int rank:4;
|
|
unsigned int release:1;
|
|
unsigned int res_id:8;
|
|
} __packed attrs;
|
|
};
|
|
|
|
#define OP_STATE_GOOD 1
|
|
#define OP_STATE_TEMP_ERR 2
|
|
#define OP_STATE_PERM_ERR 3
|
|
|
|
enum scm_event {SCM_CHANGE, SCM_AVAIL};
|
|
|
|
struct scm_driver {
|
|
struct device_driver drv;
|
|
int (*probe) (struct scm_device *scmdev);
|
|
int (*remove) (struct scm_device *scmdev);
|
|
void (*notify) (struct scm_device *scmdev, enum scm_event event);
|
|
void (*handler) (struct scm_device *scmdev, void *data,
|
|
blk_status_t error);
|
|
};
|
|
|
|
int scm_driver_register(struct scm_driver *scmdrv);
|
|
void scm_driver_unregister(struct scm_driver *scmdrv);
|
|
|
|
int eadm_start_aob(struct aob *aob);
|
|
void scm_irq_handler(struct aob *aob, blk_status_t error);
|
|
|
|
#endif /* _ASM_S390_EADM_H */
|