2016-06-13 17:45:26 +03:00
/*
* NVMe over Fabrics common host code .
* Copyright ( c ) 2015 - 2016 HGST , a Western Digital Company .
*
* 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 .
*/
# ifndef _NVME_FABRICS_H
# define _NVME_FABRICS_H 1
# include <linux/in.h>
# include <linux/inet.h>
# define NVMF_MIN_QUEUE_SIZE 16
# define NVMF_MAX_QUEUE_SIZE 1024
# define NVMF_DEF_QUEUE_SIZE 128
# define NVMF_DEF_RECONNECT_DELAY 10
/*
* Define a host as seen by the target . We allocate one at boot , but also
* allow the override it when creating controllers . This is both to provide
* persistence of the Host NQN over multiple boots , and to allow using
* multiple ones , for example in a container scenario . Because we must not
* use different Host NQNs with the same Host ID we generate a Host ID and
* use this structure to keep track of the relation between the two .
*/
struct nvmf_host {
struct kref ref ;
struct list_head list ;
char nqn [ NVMF_NQN_SIZE ] ;
uuid_le id ;
} ;
/**
* enum nvmf_parsing_opts - used to define the sysfs parsing options used .
*/
enum {
NVMF_OPT_ERR = 0 ,
NVMF_OPT_TRANSPORT = 1 < < 0 ,
NVMF_OPT_NQN = 1 < < 1 ,
NVMF_OPT_TRADDR = 1 < < 2 ,
NVMF_OPT_TRSVCID = 1 < < 3 ,
NVMF_OPT_QUEUE_SIZE = 1 < < 4 ,
NVMF_OPT_NR_IO_QUEUES = 1 < < 5 ,
NVMF_OPT_TL_RETRY_COUNT = 1 < < 6 ,
2016-06-13 17:45:28 +03:00
NVMF_OPT_KATO = 1 < < 7 ,
2016-06-13 17:45:26 +03:00
NVMF_OPT_HOSTNQN = 1 < < 8 ,
NVMF_OPT_RECONNECT_DELAY = 1 < < 9 ,
} ;
/**
* struct nvmf_ctrl_options - Used to hold the options specified
* with the parsing opts enum .
* @ mask : Used by the fabrics library to parse through sysfs options
* on adding a NVMe controller .
* @ transport : Holds the fabric transport " technology name " ( for a lack of
* better description ) that will be used by an NVMe controller
* being added .
* @ subsysnqn : Hold the fully qualified NQN subystem name ( format defined
* in the NVMe specification , " NVMe Qualified Names " ) .
* @ traddr : network address that will be used by the host to communicate
* to the added NVMe controller .
* @ trsvcid : network port used for host - controller communication .
* @ queue_size : Number of IO queue elements .
* @ nr_io_queues : Number of controller IO queues that will be established .
* @ reconnect_delay : Time between two consecutive reconnect attempts .
* @ discovery_nqn : indicates if the subsysnqn is the well - known discovery NQN .
2016-06-13 17:45:28 +03:00
* @ kato : Keep - alive timeout .
2016-06-13 17:45:26 +03:00
* @ host : Virtual NVMe host , contains the NQN and Host ID .
*/
struct nvmf_ctrl_options {
unsigned mask ;
char * transport ;
char * subsysnqn ;
char * traddr ;
char * trsvcid ;
size_t queue_size ;
unsigned int nr_io_queues ;
unsigned int reconnect_delay ;
bool discovery_nqn ;
2016-06-13 17:45:28 +03:00
unsigned int kato ;
2016-06-13 17:45:26 +03:00
struct nvmf_host * host ;
} ;
/*
* struct nvmf_transport_ops - used to register a specific
* fabric implementation of NVMe fabrics .
* @ entry : Used by the fabrics library to add the new
* registration entry to its linked - list internal tree .
* @ name : Name of the NVMe fabric driver implementation .
* @ required_opts : sysfs command - line options that must be specified
* when adding a new NVMe controller .
* @ allowed_opts : sysfs command - line options that can be specified
* when adding a new NVMe controller .
* @ create_ctrl ( ) : function pointer that points to a non - NVMe
* implementation - specific fabric technology
* that would go into starting up that fabric
* for the purpose of conneciton to an NVMe controller
* using that fabric technology .
*
* Notes :
* 1. At minimum , ' required_opts ' and ' allowed_opts ' should
* be set to the same enum parsing options defined earlier .
* 2. create_ctrl ( ) must be defined ( even if it does nothing )
*/
struct nvmf_transport_ops {
struct list_head entry ;
const char * name ;
int required_opts ;
int allowed_opts ;
struct nvme_ctrl * ( * create_ctrl ) ( struct device * dev ,
struct nvmf_ctrl_options * opts ) ;
} ;
int nvmf_reg_read32 ( struct nvme_ctrl * ctrl , u32 off , u32 * val ) ;
int nvmf_reg_read64 ( struct nvme_ctrl * ctrl , u32 off , u64 * val ) ;
int nvmf_reg_write32 ( struct nvme_ctrl * ctrl , u32 off , u32 val ) ;
int nvmf_connect_admin_queue ( struct nvme_ctrl * ctrl ) ;
int nvmf_connect_io_queue ( struct nvme_ctrl * ctrl , u16 qid ) ;
void nvmf_register_transport ( struct nvmf_transport_ops * ops ) ;
void nvmf_unregister_transport ( struct nvmf_transport_ops * ops ) ;
void nvmf_free_options ( struct nvmf_ctrl_options * opts ) ;
const char * nvmf_get_subsysnqn ( struct nvme_ctrl * ctrl ) ;
int nvmf_get_address ( struct nvme_ctrl * ctrl , char * buf , int size ) ;
# endif /* _NVME_FABRICS_H */