#define KMSG_COMPONENT "ism"
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/device.h>
MODULE_DESCRIPTION("ISM driver for s390");
#define PCI_DEVICE_ID_IBM_ISM 0x04ED
static const struct pci_device_id ism_device_table[] = {
{ PCI_VDEVICE(IBM, PCI_DEVICE_ID_IBM_ISM), 0 },
MODULE_DEVICE_TABLE(pci, ism_device_table);
static debug_info_t *ism_debug_info;
static int ism_cmd(struct ism_dev *ism, void *cmd)
struct ism_req_hdr *req = cmd;
struct ism_resp_hdr *resp = cmd;
memcpy_toio(ism->ctl + sizeof(*req), req + 1, req->len - sizeof(*req));
memcpy_toio(ism->ctl, req, sizeof(*req));
WRITE_ONCE(resp->ret, ISM_ERROR);
memcpy_fromio(resp, ism->ctl, sizeof(*resp));
debug_text_event(ism_debug_info, 0, "cmd failure");
debug_event(ism_debug_info, 0, resp, sizeof(*resp));
memcpy_fromio(resp + 1, ism->ctl + sizeof(*resp),
resp->len - sizeof(*resp));
static int ism_cmd_simple(struct ism_dev *ism, u32 cmd_code)
union ism_cmd_simple cmd;
memset(&cmd, 0, sizeof(cmd));
cmd.request.hdr.cmd = cmd_code;