/*
 *
 * Copyright (c) 2009, Microsoft Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope 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., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307 USA.
 *
 * Authors:
 *   Haiyang Zhang <haiyangz@microsoft.com>
 *   Hank Janssen  <hjanssen@microsoft.com>
 *
 */


#ifndef _STORVSC_API_H_
#define _STORVSC_API_H_

#include "VmbusApi.h"


/* Defines */


#define STORVSC_RING_BUFFER_SIZE			10*PAGE_SIZE
#define BLKVSC_RING_BUFFER_SIZE				20*PAGE_SIZE

#define STORVSC_MAX_IO_REQUESTS				64

/*
 * In Hyper-V, each port/path/target maps to 1 scsi host adapter.  In
 * reality, the path/target is not used (ie always set to 0) so our
 * scsi host adapter essentially has 1 bus with 1 target that contains
 * up to 256 luns.
 */

#define STORVSC_MAX_LUNS_PER_TARGET			64
#define STORVSC_MAX_TARGETS					1
#define STORVSC_MAX_CHANNELS				1


/* Fwd decl */

/* struct VMBUS_CHANNEL; */
struct hv_storvsc_request;


/* Data types */

typedef int (*PFN_ON_IO_REQUEST)(struct hv_device *Device, struct hv_storvsc_request *Request);
typedef void (*PFN_ON_IO_REQUEST_COMPLTN)(struct hv_storvsc_request *Request);

typedef int (*PFN_ON_HOST_RESET)(struct hv_device *Device);
typedef void (*PFN_ON_HOST_RESCAN)(struct hv_device *Device);


/* Matches Windows-end */
typedef enum _STORVSC_REQUEST_TYPE{
	WRITE_TYPE,
	READ_TYPE,
	UNKNOWN_TYPE,
} STORVSC_REQUEST_TYPE;


struct hv_storvsc_request {
	STORVSC_REQUEST_TYPE		Type;
	u32					Host;
	u32					Bus;
	u32					TargetId;
	u32					LunId;
	u8 *					Cdb;
	u32					CdbLen;
	u32					Status;
	u32					BytesXfer;

	unsigned char*					SenseBuffer;
	u32					SenseBufferSize;

	void *					Context;

	PFN_ON_IO_REQUEST_COMPLTN	OnIOCompletion;

	/* This points to the memory after DataBuffer */
	void *					Extension;

	MULTIPAGE_BUFFER		DataBuffer;
};


/* Represents the block vsc driver */
typedef struct _STORVSC_DRIVER_OBJECT {
	struct hv_driver Base; /* Must be the first field */

	/* Set by caller (in bytes) */
	u32					RingBufferSize;

	/* Allocate this much private extension for each I/O request */
	u32					RequestExtSize;

	/* Maximum # of requests in flight per channel/device */
	u32					MaxOutstandingRequestsPerChannel;

	/* Set by the caller to allow us to re-enumerate the bus on the host */
	PFN_ON_HOST_RESCAN		OnHostRescan;

	/* Specific to this driver */
	PFN_ON_IO_REQUEST		OnIORequest;
	PFN_ON_HOST_RESET		OnHostReset;

} STORVSC_DRIVER_OBJECT;

typedef struct _STORVSC_DEVICE_INFO {
	unsigned int	PortNumber;
    unsigned char	PathId;
    unsigned char	TargetId;
} STORVSC_DEVICE_INFO;


/* Interface */

int
StorVscInitialize(
	struct hv_driver *Driver
	);

int
BlkVscInitialize(
	struct hv_driver *Driver
	);
#endif /* _STORVSC_API_H_ */
