97f78759ea
The user-space daemon and tgt kernel module need bi-directional kernel/user high-performance interface, however, mainline provides no standard interface like that. This patch adds shared memory interface between kernel and user spaces like some other drivers do by using own character device. The user-space daemon and tgt kernel module creates shared memory via mmap and use it like ring buffer. poll (kernel to user) and write (user to kernel) system calls are used for notification. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
91 lines
2.2 KiB
C
91 lines
2.2 KiB
C
/*
|
|
* SCSI target kernel/user interface
|
|
*
|
|
* Copyright (C) 2005 FUJITA Tomonori <tomof@acm.org>
|
|
* Copyright (C) 2005 Mike Christie <michaelc@cs.wisc.edu>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*/
|
|
#ifndef __SCSI_TARGET_IF_H
|
|
#define __SCSI_TARGET_IF_H
|
|
|
|
/* user -> kernel */
|
|
#define TGT_UEVENT_CMD_RSP 0x0001
|
|
#define TGT_UEVENT_TSK_MGMT_RSP 0x0002
|
|
|
|
/* kernel -> user */
|
|
#define TGT_KEVENT_CMD_REQ 0x1001
|
|
#define TGT_KEVENT_CMD_DONE 0x1002
|
|
#define TGT_KEVENT_TSK_MGMT_REQ 0x1003
|
|
|
|
struct tgt_event_hdr {
|
|
uint16_t version;
|
|
uint16_t status;
|
|
uint16_t type;
|
|
uint16_t len;
|
|
} __attribute__ ((aligned (sizeof(uint64_t))));
|
|
|
|
struct tgt_event {
|
|
struct tgt_event_hdr hdr;
|
|
|
|
union {
|
|
/* user-> kernel */
|
|
struct {
|
|
int host_no;
|
|
uint32_t len;
|
|
int result;
|
|
aligned_u64 uaddr;
|
|
uint8_t rw;
|
|
aligned_u64 tag;
|
|
} cmd_rsp;
|
|
struct {
|
|
int host_no;
|
|
aligned_u64 mid;
|
|
int result;
|
|
} tsk_mgmt_rsp;
|
|
|
|
|
|
/* kernel -> user */
|
|
struct {
|
|
int host_no;
|
|
uint32_t data_len;
|
|
uint8_t scb[16];
|
|
uint8_t lun[8];
|
|
int attribute;
|
|
aligned_u64 tag;
|
|
} cmd_req;
|
|
struct {
|
|
int host_no;
|
|
aligned_u64 tag;
|
|
int result;
|
|
} cmd_done;
|
|
struct {
|
|
int host_no;
|
|
int function;
|
|
aligned_u64 tag;
|
|
uint8_t lun[8];
|
|
aligned_u64 mid;
|
|
} tsk_mgmt_req;
|
|
} p;
|
|
} __attribute__ ((aligned (sizeof(uint64_t))));
|
|
|
|
#define TGT_RING_SIZE (1UL << 16)
|
|
#define TGT_RING_PAGES (TGT_RING_SIZE >> PAGE_SHIFT)
|
|
#define TGT_EVENT_PER_PAGE (PAGE_SIZE / sizeof(struct tgt_event))
|
|
#define TGT_MAX_EVENTS (TGT_EVENT_PER_PAGE * TGT_RING_PAGES)
|
|
|
|
#endif
|