2015-05-29 01:04:01 -07:00
/*
* Copyright 2014 Cisco Systems , Inc . All rights reserved .
*
* This program is free software ; you may redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; version 2 of the License .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN
* ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
*/
# ifndef _VNIC_DEVCMD_H_
# define _VNIC_DEVCMD_H_
# define _CMD_NBITS 14
# define _CMD_VTYPEBITS 10
# define _CMD_FLAGSBITS 6
# define _CMD_DIRBITS 2
# define _CMD_NMASK ((1 << _CMD_NBITS)-1)
# define _CMD_VTYPEMASK ((1 << _CMD_VTYPEBITS)-1)
# define _CMD_FLAGSMASK ((1 << _CMD_FLAGSBITS)-1)
# define _CMD_DIRMASK ((1 << _CMD_DIRBITS)-1)
# define _CMD_NSHIFT 0
# define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS)
# define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS)
# define _CMD_DIRSHIFT (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS)
/*
* Direction bits ( from host perspective ) .
*/
# define _CMD_DIR_NONE 0U
# define _CMD_DIR_WRITE 1U
# define _CMD_DIR_READ 2U
# define _CMD_DIR_RW (_CMD_DIR_WRITE | _CMD_DIR_READ)
/*
* Flag bits .
*/
# define _CMD_FLAGS_NONE 0U
# define _CMD_FLAGS_NOWAIT 1U
/*
* vNIC type bits .
*/
# define _CMD_VTYPE_NONE 0U
# define _CMD_VTYPE_ENET 1U
# define _CMD_VTYPE_FC 2U
# define _CMD_VTYPE_SCSI 4U
# define _CMD_VTYPE_ALL (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI)
/*
* Used to create cmds . .
*/
# define _CMDCF(dir, flags, vtype, nr) \
( ( ( dir ) < < _CMD_DIRSHIFT ) | \
( ( flags ) < < _CMD_FLAGSSHIFT ) | \
( ( vtype ) < < _CMD_VTYPESHIFT ) | \
( ( nr ) < < _CMD_NSHIFT ) )
# define _CMDC(dir, vtype, nr) _CMDCF(dir, 0, vtype, nr)
# define _CMDCNW(dir, vtype, nr) _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr)
/*
* Used to decode cmds . .
*/
# define _CMD_DIR(cmd) (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK)
# define _CMD_FLAGS(cmd) (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK)
# define _CMD_VTYPE(cmd) (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK)
# define _CMD_N(cmd) (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK)
enum vnic_devcmd_cmd {
CMD_NONE = _CMDC ( _CMD_DIR_NONE , _CMD_VTYPE_NONE , 0 ) ,
/* mcpu fw info in mem: (u64)a0=paddr to struct vnic_devcmd_fw_info */
CMD_MCPU_FW_INFO = _CMDC ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 1 ) ,
/* dev-specific block member:
* in : ( u16 ) a0 = offset , ( u8 ) a1 = size
* out : a0 = value */
CMD_DEV_SPEC = _CMDC ( _CMD_DIR_RW , _CMD_VTYPE_ALL , 2 ) ,
/* stats clear */
CMD_STATS_CLEAR = _CMDCNW ( _CMD_DIR_NONE , _CMD_VTYPE_ALL , 3 ) ,
/* stats dump in mem: (u64)a0=paddr to stats area,
* ( u16 ) a1 = sizeof stats area */
CMD_STATS_DUMP = _CMDC ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 4 ) ,
/* nic_cfg in (u32)a0 */
CMD_NIC_CFG = _CMDCNW ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 16 ) ,
/* set struct vnic_devcmd_notify buffer in mem:
* in :
* ( u64 ) a0 = paddr to notify ( set paddr = 0 to unset )
* ( u32 ) a1 & 0x00000000ffffffff = sizeof ( struct vnic_devcmd_notify )
* ( u16 ) a1 & 0x0000ffff00000000 = intr num ( - 1 for no intr )
* out :
* ( u32 ) a1 = effective size
*/
CMD_NOTIFY = _CMDC ( _CMD_DIR_RW , _CMD_VTYPE_ALL , 21 ) ,
/* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */
CMD_OPEN = _CMDCNW ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 23 ) ,
/* open status:
* out : a0 = 0 open complete , a0 = 1 open in progress */
CMD_OPEN_STATUS = _CMDC ( _CMD_DIR_READ , _CMD_VTYPE_ALL , 24 ) ,
/* close vnic */
CMD_CLOSE = _CMDC ( _CMD_DIR_NONE , _CMD_VTYPE_ALL , 25 ) ,
/* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */
CMD_INIT = _CMDCNW ( _CMD_DIR_READ , _CMD_VTYPE_ALL , 26 ) ,
/* enable virtual link */
CMD_ENABLE = _CMDCNW ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 28 ) ,
/* enable virtual link, waiting variant. */
CMD_ENABLE_WAIT = _CMDC ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 28 ) ,
/* disable virtual link */
CMD_DISABLE = _CMDC ( _CMD_DIR_NONE , _CMD_VTYPE_ALL , 29 ) ,
/* stats dump all vnics on uplink in mem: (u64)a0=paddr (u32)a1=uif */
CMD_STATS_DUMP_ALL = _CMDC ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 30 ) ,
/* init status:
* out : a0 = 0 init complete , a0 = 1 init in progress
* if a0 = 0 , a1 = errno */
CMD_INIT_STATUS = _CMDC ( _CMD_DIR_READ , _CMD_VTYPE_ALL , 31 ) ,
/* undo initialize of virtual link */
CMD_DEINIT = _CMDCNW ( _CMD_DIR_NONE , _CMD_VTYPE_ALL , 34 ) ,
/* check fw capability of a cmd:
* in : ( u32 ) a0 = cmd
* out : ( u32 ) a0 = errno , 0 : valid cmd , a1 = supported VNIC_STF_ * bits */
CMD_CAPABILITY = _CMDC ( _CMD_DIR_RW , _CMD_VTYPE_ALL , 36 ) ,
/*
* Initialization for the devcmd2 interface .
* in : ( u64 ) a0 = host result buffer physical address
* in : ( u16 ) a1 = number of entries in result buffer
*/
CMD_INITIALIZE_DEVCMD2 = _CMDC ( _CMD_DIR_WRITE , _CMD_VTYPE_ALL , 57 )
} ;
/* flags for CMD_OPEN */
# define CMD_OPENF_OPROM 0x1 /* open coming from option rom */
/* flags for CMD_INIT */
# define CMD_INITF_DEFAULT_MAC 0x1 /* init with default mac addr */
/* flags for CMD_PACKET_FILTER */
# define CMD_PFILTER_DIRECTED 0x01
# define CMD_PFILTER_MULTICAST 0x02
# define CMD_PFILTER_BROADCAST 0x04
# define CMD_PFILTER_PROMISCUOUS 0x08
# define CMD_PFILTER_ALL_MULTICAST 0x10
enum vnic_devcmd_status {
STAT_NONE = 0 ,
STAT_BUSY = 1 < < 0 , /* cmd in progress */
STAT_ERROR = 1 < < 1 , /* last cmd caused error (code in a0) */
} ;
enum vnic_devcmd_error {
ERR_SUCCESS = 0 ,
ERR_EINVAL = 1 ,
ERR_EFAULT = 2 ,
ERR_EPERM = 3 ,
ERR_EBUSY = 4 ,
ERR_ECMDUNKNOWN = 5 ,
ERR_EBADSTATE = 6 ,
ERR_ENOMEM = 7 ,
ERR_ETIMEDOUT = 8 ,
ERR_ELINKDOWN = 9 ,
} ;
struct vnic_devcmd_fw_info {
char fw_version [ 32 ] ;
char fw_build [ 32 ] ;
char hw_version [ 32 ] ;
char hw_serial_number [ 32 ] ;
} ;
struct vnic_devcmd_notify {
u32 csum ; /* checksum over following words */
u32 link_state ; /* link up == 1 */
u32 port_speed ; /* effective port speed (rate limit) */
u32 mtu ; /* MTU */
u32 msglvl ; /* requested driver msg lvl */
u32 uif ; /* uplink interface */
u32 status ; /* status bits (see VNIC_STF_*) */
u32 error ; /* error code (see ERR_*) for first ERR */
u32 link_down_cnt ; /* running count of link down transitions */
} ;
# define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */
struct vnic_devcmd_provinfo {
u8 oui [ 3 ] ;
u8 type ;
2020-02-24 10:14:06 -06:00
u8 data [ ] ;
2015-05-29 01:04:01 -07:00
} ;
/*
* Writing cmd register causes STAT_BUSY to get set in status register .
* When cmd completes , STAT_BUSY will be cleared .
*
* If cmd completed successfully STAT_ERROR will be clear
* and args registers contain cmd - specific results .
*
* If cmd error , STAT_ERROR will be set and args [ 0 ] contains error code .
*
* status register is read - only . While STAT_BUSY is set ,
* all other register contents are read - only .
*/
/* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */
# define VNIC_DEVCMD_NARGS 15
struct vnic_devcmd {
u32 status ; /* RO */
u32 cmd ; /* RW */
u64 args [ VNIC_DEVCMD_NARGS ] ; /* RW cmd args (little-endian) */
} ;
/*
* Version 2 of the interface .
*
* Some things are carried over , notably the vnic_devcmd_cmd enum .
*/
/*
* Flags for vnic_devcmd2 . flags
*/
# define DEVCMD2_FNORESULT 0x1 /* Don't copy result to host */
# define VNIC_DEVCMD2_NARGS VNIC_DEVCMD_NARGS
struct vnic_devcmd2 {
u16 pad ;
u16 flags ;
u32 cmd ; /* same command #defines as original */
u64 args [ VNIC_DEVCMD2_NARGS ] ;
} ;
# define VNIC_DEVCMD2_NRESULTS VNIC_DEVCMD_NARGS
struct devcmd2_result {
u64 results [ VNIC_DEVCMD2_NRESULTS ] ;
u32 pad ;
u16 completed_index ; /* into copy WQ */
u8 error ; /* same error codes as original */
u8 color ; /* 0 or 1 as with completion queues */
} ;
# define DEVCMD2_RING_SIZE 32
# define DEVCMD2_DESC_SIZE 128
# define DEVCMD2_RESULTS_SIZE_MAX ((1 << 16) - 1)
# endif /* _VNIC_DEVCMD_H_ */