1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2008 Cisco Systems, Inc. All rights reserved. 3*4882a593Smuzhiyun * Copyright 2007 Nuova Systems, Inc. All rights reserved. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you may redistribute it and/or modify 6*4882a593Smuzhiyun * it under the terms of the GNU General Public License as published by 7*4882a593Smuzhiyun * the Free Software Foundation; version 2 of the License. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 10*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 11*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 12*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 13*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 14*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 15*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 16*4882a593Smuzhiyun * SOFTWARE. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun #ifndef _VNIC_DEVCMD_H_ 19*4882a593Smuzhiyun #define _VNIC_DEVCMD_H_ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define _CMD_NBITS 14 22*4882a593Smuzhiyun #define _CMD_VTYPEBITS 10 23*4882a593Smuzhiyun #define _CMD_FLAGSBITS 6 24*4882a593Smuzhiyun #define _CMD_DIRBITS 2 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define _CMD_NMASK ((1 << _CMD_NBITS)-1) 27*4882a593Smuzhiyun #define _CMD_VTYPEMASK ((1 << _CMD_VTYPEBITS)-1) 28*4882a593Smuzhiyun #define _CMD_FLAGSMASK ((1 << _CMD_FLAGSBITS)-1) 29*4882a593Smuzhiyun #define _CMD_DIRMASK ((1 << _CMD_DIRBITS)-1) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define _CMD_NSHIFT 0 32*4882a593Smuzhiyun #define _CMD_VTYPESHIFT (_CMD_NSHIFT+_CMD_NBITS) 33*4882a593Smuzhiyun #define _CMD_FLAGSSHIFT (_CMD_VTYPESHIFT+_CMD_VTYPEBITS) 34*4882a593Smuzhiyun #define _CMD_DIRSHIFT (_CMD_FLAGSSHIFT+_CMD_FLAGSBITS) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* 37*4882a593Smuzhiyun * Direction bits (from host perspective). 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun #define _CMD_DIR_NONE 0U 40*4882a593Smuzhiyun #define _CMD_DIR_WRITE 1U 41*4882a593Smuzhiyun #define _CMD_DIR_READ 2U 42*4882a593Smuzhiyun #define _CMD_DIR_RW (_CMD_DIR_WRITE | _CMD_DIR_READ) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * Flag bits. 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun #define _CMD_FLAGS_NONE 0U 48*4882a593Smuzhiyun #define _CMD_FLAGS_NOWAIT 1U 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* 51*4882a593Smuzhiyun * vNIC type bits. 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun #define _CMD_VTYPE_NONE 0U 54*4882a593Smuzhiyun #define _CMD_VTYPE_ENET 1U 55*4882a593Smuzhiyun #define _CMD_VTYPE_FC 2U 56*4882a593Smuzhiyun #define _CMD_VTYPE_SCSI 4U 57*4882a593Smuzhiyun #define _CMD_VTYPE_ALL (_CMD_VTYPE_ENET | _CMD_VTYPE_FC | _CMD_VTYPE_SCSI) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* 60*4882a593Smuzhiyun * Used to create cmds.. 61*4882a593Smuzhiyun */ 62*4882a593Smuzhiyun #define _CMDCF(dir, flags, vtype, nr) \ 63*4882a593Smuzhiyun (((dir) << _CMD_DIRSHIFT) | \ 64*4882a593Smuzhiyun ((flags) << _CMD_FLAGSSHIFT) | \ 65*4882a593Smuzhiyun ((vtype) << _CMD_VTYPESHIFT) | \ 66*4882a593Smuzhiyun ((nr) << _CMD_NSHIFT)) 67*4882a593Smuzhiyun #define _CMDC(dir, vtype, nr) _CMDCF(dir, 0, vtype, nr) 68*4882a593Smuzhiyun #define _CMDCNW(dir, vtype, nr) _CMDCF(dir, _CMD_FLAGS_NOWAIT, vtype, nr) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* 71*4882a593Smuzhiyun * Used to decode cmds.. 72*4882a593Smuzhiyun */ 73*4882a593Smuzhiyun #define _CMD_DIR(cmd) (((cmd) >> _CMD_DIRSHIFT) & _CMD_DIRMASK) 74*4882a593Smuzhiyun #define _CMD_FLAGS(cmd) (((cmd) >> _CMD_FLAGSSHIFT) & _CMD_FLAGSMASK) 75*4882a593Smuzhiyun #define _CMD_VTYPE(cmd) (((cmd) >> _CMD_VTYPESHIFT) & _CMD_VTYPEMASK) 76*4882a593Smuzhiyun #define _CMD_N(cmd) (((cmd) >> _CMD_NSHIFT) & _CMD_NMASK) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun enum vnic_devcmd_cmd { 79*4882a593Smuzhiyun CMD_NONE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_NONE, 0), 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* mcpu fw info in mem: (u64)a0=paddr to struct vnic_devcmd_fw_info */ 82*4882a593Smuzhiyun CMD_MCPU_FW_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 1), 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* dev-specific block member: 85*4882a593Smuzhiyun * in: (u16)a0=offset,(u8)a1=size 86*4882a593Smuzhiyun * out: a0=value */ 87*4882a593Smuzhiyun CMD_DEV_SPEC = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 2), 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* stats clear */ 90*4882a593Smuzhiyun CMD_STATS_CLEAR = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 3), 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* stats dump in mem: (u64)a0=paddr to stats area, 93*4882a593Smuzhiyun * (u16)a1=sizeof stats area */ 94*4882a593Smuzhiyun CMD_STATS_DUMP = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 4), 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* set Rx packet filter: (u32)a0=filters (see CMD_PFILTER_*) */ 97*4882a593Smuzhiyun CMD_PACKET_FILTER = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 7), 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* hang detection notification */ 100*4882a593Smuzhiyun CMD_HANG_NOTIFY = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 8), 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* MAC address in (u48)a0 */ 103*4882a593Smuzhiyun CMD_MAC_ADDR = _CMDC(_CMD_DIR_READ, 104*4882a593Smuzhiyun _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 9), 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* disable/enable promisc mode: (u8)a0=0/1 */ 107*4882a593Smuzhiyun /***** XXX DEPRECATED *****/ 108*4882a593Smuzhiyun CMD_PROMISC_MODE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 10), 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* disable/enable all-multi mode: (u8)a0=0/1 */ 111*4882a593Smuzhiyun /***** XXX DEPRECATED *****/ 112*4882a593Smuzhiyun CMD_ALLMULTI_MODE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 11), 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* add addr from (u48)a0 */ 115*4882a593Smuzhiyun CMD_ADDR_ADD = _CMDCNW(_CMD_DIR_WRITE, 116*4882a593Smuzhiyun _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 12), 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* del addr from (u48)a0 */ 119*4882a593Smuzhiyun CMD_ADDR_DEL = _CMDCNW(_CMD_DIR_WRITE, 120*4882a593Smuzhiyun _CMD_VTYPE_ENET | _CMD_VTYPE_FC, 13), 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* add VLAN id in (u16)a0 */ 123*4882a593Smuzhiyun CMD_VLAN_ADD = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 14), 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* del VLAN id in (u16)a0 */ 126*4882a593Smuzhiyun CMD_VLAN_DEL = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 15), 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* nic_cfg in (u32)a0 */ 129*4882a593Smuzhiyun CMD_NIC_CFG = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 16), 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* union vnic_rss_key in mem: (u64)a0=paddr, (u16)a1=len */ 132*4882a593Smuzhiyun CMD_RSS_KEY = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 17), 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /* union vnic_rss_cpu in mem: (u64)a0=paddr, (u16)a1=len */ 135*4882a593Smuzhiyun CMD_RSS_CPU = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 18), 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* initiate softreset */ 138*4882a593Smuzhiyun CMD_SOFT_RESET = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 19), 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* softreset status: 141*4882a593Smuzhiyun * out: a0=0 reset complete, a0=1 reset in progress */ 142*4882a593Smuzhiyun CMD_SOFT_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 20), 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* set struct vnic_devcmd_notify buffer in mem: 145*4882a593Smuzhiyun * in: 146*4882a593Smuzhiyun * (u64)a0=paddr to notify (set paddr=0 to unset) 147*4882a593Smuzhiyun * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify) 148*4882a593Smuzhiyun * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr) 149*4882a593Smuzhiyun * out: 150*4882a593Smuzhiyun * (u32)a1 = effective size 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun CMD_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 21), 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* UNDI API: (u64)a0=paddr to s_PXENV_UNDI_ struct, 155*4882a593Smuzhiyun * (u8)a1=PXENV_UNDI_xxx */ 156*4882a593Smuzhiyun CMD_UNDI = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 22), 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* initiate open sequence (u32)a0=flags (see CMD_OPENF_*) */ 159*4882a593Smuzhiyun CMD_OPEN = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 23), 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* open status: 162*4882a593Smuzhiyun * out: a0=0 open complete, a0=1 open in progress */ 163*4882a593Smuzhiyun CMD_OPEN_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 24), 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* close vnic */ 166*4882a593Smuzhiyun CMD_CLOSE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 25), 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* initialize virtual link: (u32)a0=flags (see CMD_INITF_*) */ 169*4882a593Smuzhiyun CMD_INIT = _CMDCNW(_CMD_DIR_READ, _CMD_VTYPE_ALL, 26), 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* variant of CMD_INIT, with provisioning info 172*4882a593Smuzhiyun * (u64)a0=paddr of vnic_devcmd_provinfo 173*4882a593Smuzhiyun * (u32)a1=sizeof provision info 174*4882a593Smuzhiyun */ 175*4882a593Smuzhiyun CMD_INIT_PROV_INFO = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 27), 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* enable virtual link */ 178*4882a593Smuzhiyun CMD_ENABLE = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 28), 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun /* disable virtual link */ 181*4882a593Smuzhiyun CMD_DISABLE = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 29), 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* stats dump all vnics on uplink in mem: (u64)a0=paddr (u32)a1=uif */ 184*4882a593Smuzhiyun CMD_STATS_DUMP_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 30), 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* init status: 187*4882a593Smuzhiyun * out: a0=0 init complete, a0=1 init in progress 188*4882a593Smuzhiyun * if a0=0, a1=errno */ 189*4882a593Smuzhiyun CMD_INIT_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 31), 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* INT13 API: (u64)a0=paddr to vnic_int13_params struct 192*4882a593Smuzhiyun * (u8)a1=INT13_CMD_xxx */ 193*4882a593Smuzhiyun CMD_INT13 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_FC, 32), 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /* logical uplink enable/disable: (u64)a0: 0/1=disable/enable */ 196*4882a593Smuzhiyun CMD_LOGICAL_UPLINK = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 33), 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* undo initialize of virtual link */ 199*4882a593Smuzhiyun CMD_DEINIT = _CMDCNW(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 34), 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* check fw capability of a cmd: 202*4882a593Smuzhiyun * in: (u32)a0=cmd 203*4882a593Smuzhiyun * out: (u32)a0=errno, 0:valid cmd, a1=supported VNIC_STF_* bits */ 204*4882a593Smuzhiyun CMD_CAPABILITY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 36), 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* persistent binding info 207*4882a593Smuzhiyun * in: (u64)a0=paddr of arg 208*4882a593Smuzhiyun * (u32)a1=CMD_PERBI_XXX */ 209*4882a593Smuzhiyun CMD_PERBI = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_FC, 37), 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* Interrupt Assert Register functionality 212*4882a593Smuzhiyun * in: (u16)a0=interrupt number to assert 213*4882a593Smuzhiyun */ 214*4882a593Smuzhiyun CMD_IAR = _CMDCNW(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 38), 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* initiate hangreset, like softreset after hang detected */ 217*4882a593Smuzhiyun CMD_HANG_RESET = _CMDC(_CMD_DIR_NONE, _CMD_VTYPE_ALL, 39), 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* hangreset status: 220*4882a593Smuzhiyun * out: a0=0 reset complete, a0=1 reset in progress */ 221*4882a593Smuzhiyun CMD_HANG_RESET_STATUS = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 40), 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /* 224*4882a593Smuzhiyun * Set hw ingress packet vlan rewrite mode: 225*4882a593Smuzhiyun * in: (u32)a0=new vlan rewrite mode 226*4882a593Smuzhiyun * out: (u32)a0=old vlan rewrite mode */ 227*4882a593Smuzhiyun CMD_IG_VLAN_REWRITE_MODE = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ENET, 41), 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun /* 230*4882a593Smuzhiyun * in: (u16)a0=bdf of target vnic 231*4882a593Smuzhiyun * (u32)a1=cmd to proxy 232*4882a593Smuzhiyun * a2-a15=args to cmd in a1 233*4882a593Smuzhiyun * out: (u32)a0=status of proxied cmd 234*4882a593Smuzhiyun * a1-a15=out args of proxied cmd */ 235*4882a593Smuzhiyun CMD_PROXY_BY_BDF = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 42), 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun /* 238*4882a593Smuzhiyun * As for BY_BDF except a0 is index of hvnlink subordinate vnic 239*4882a593Smuzhiyun * or SR-IOV virtual vnic 240*4882a593Smuzhiyun */ 241*4882a593Smuzhiyun CMD_PROXY_BY_INDEX = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 43), 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* 244*4882a593Smuzhiyun * For HPP toggle: 245*4882a593Smuzhiyun * adapter-info-get 246*4882a593Smuzhiyun * in: (u64)a0=phsical address of buffer passed in from caller. 247*4882a593Smuzhiyun * (u16)a1=size of buffer specified in a0. 248*4882a593Smuzhiyun * out: (u64)a0=phsical address of buffer passed in from caller. 249*4882a593Smuzhiyun * (u16)a1=actual bytes from VIF-CONFIG-INFO TLV, or 250*4882a593Smuzhiyun * 0 if no VIF-CONFIG-INFO TLV was ever received. */ 251*4882a593Smuzhiyun CMD_CONFIG_INFO_GET = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 44), 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* 254*4882a593Smuzhiyun * INT13 API: (u64)a0=paddr to vnic_int13_params struct 255*4882a593Smuzhiyun * (u32)a1=INT13_CMD_xxx 256*4882a593Smuzhiyun */ 257*4882a593Smuzhiyun CMD_INT13_ALL = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 45), 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* 260*4882a593Smuzhiyun * Set default vlan: 261*4882a593Smuzhiyun * in: (u16)a0=new default vlan 262*4882a593Smuzhiyun * (u16)a1=zero for overriding vlan with param a0, 263*4882a593Smuzhiyun * non-zero for resetting vlan to the default 264*4882a593Smuzhiyun * out: (u16)a0=old default vlan 265*4882a593Smuzhiyun */ 266*4882a593Smuzhiyun CMD_SET_DEFAULT_VLAN = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 46), 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /* init_prov_info2: 269*4882a593Smuzhiyun * Variant of CMD_INIT_PROV_INFO, where it will not try to enable 270*4882a593Smuzhiyun * the vnic until CMD_ENABLE2 is issued. 271*4882a593Smuzhiyun * (u64)a0=paddr of vnic_devcmd_provinfo 272*4882a593Smuzhiyun * (u32)a1=sizeof provision info 273*4882a593Smuzhiyun */ 274*4882a593Smuzhiyun CMD_INIT_PROV_INFO2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 47), 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun /* enable2: 277*4882a593Smuzhiyun * (u32)a0=0 ==> standby 278*4882a593Smuzhiyun * =CMD_ENABLE2_ACTIVE ==> active 279*4882a593Smuzhiyun */ 280*4882a593Smuzhiyun CMD_ENABLE2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 48), 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun /* 283*4882a593Smuzhiyun * cmd_status: 284*4882a593Smuzhiyun * Returns the status of the specified command 285*4882a593Smuzhiyun * Input: 286*4882a593Smuzhiyun * a0 = command for which status is being queried. 287*4882a593Smuzhiyun * Possible values are: 288*4882a593Smuzhiyun * CMD_SOFT_RESET 289*4882a593Smuzhiyun * CMD_HANG_RESET 290*4882a593Smuzhiyun * CMD_OPEN 291*4882a593Smuzhiyun * CMD_INIT 292*4882a593Smuzhiyun * CMD_INIT_PROV_INFO 293*4882a593Smuzhiyun * CMD_DEINIT 294*4882a593Smuzhiyun * CMD_INIT_PROV_INFO2 295*4882a593Smuzhiyun * CMD_ENABLE2 296*4882a593Smuzhiyun * Output: 297*4882a593Smuzhiyun * if status == STAT_ERROR 298*4882a593Smuzhiyun * a0 = ERR_ENOTSUPPORTED - status for command in a0 is 299*4882a593Smuzhiyun * not supported 300*4882a593Smuzhiyun * if status == STAT_NONE 301*4882a593Smuzhiyun * a0 = status of the devcmd specified in a0 as follows. 302*4882a593Smuzhiyun * ERR_SUCCESS - command in a0 completed successfully 303*4882a593Smuzhiyun * ERR_EINPROGRESS - command in a0 is still in progress 304*4882a593Smuzhiyun */ 305*4882a593Smuzhiyun CMD_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 49), 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* 308*4882a593Smuzhiyun * Returns interrupt coalescing timer conversion factors. 309*4882a593Smuzhiyun * After calling this devcmd, ENIC driver can convert 310*4882a593Smuzhiyun * interrupt coalescing timer in usec into CPU cycles as follows: 311*4882a593Smuzhiyun * 312*4882a593Smuzhiyun * intr_timer_cycles = intr_timer_usec * multiplier / divisor 313*4882a593Smuzhiyun * 314*4882a593Smuzhiyun * Interrupt coalescing timer in usecs can be be converted/obtained 315*4882a593Smuzhiyun * from CPU cycles as follows: 316*4882a593Smuzhiyun * 317*4882a593Smuzhiyun * intr_timer_usec = intr_timer_cycles * divisor / multiplier 318*4882a593Smuzhiyun * 319*4882a593Smuzhiyun * in: none 320*4882a593Smuzhiyun * out: (u32)a0 = multiplier 321*4882a593Smuzhiyun * (u32)a1 = divisor 322*4882a593Smuzhiyun * (u32)a2 = maximum timer value in usec 323*4882a593Smuzhiyun */ 324*4882a593Smuzhiyun CMD_INTR_COAL_CONVERT = _CMDC(_CMD_DIR_READ, _CMD_VTYPE_ALL, 50), 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun /* 327*4882a593Smuzhiyun * ISCSI DUMP API: 328*4882a593Smuzhiyun * in: (u64)a0=paddr of the param or param itself 329*4882a593Smuzhiyun * (u32)a1=ISCSI_CMD_xxx 330*4882a593Smuzhiyun */ 331*4882a593Smuzhiyun CMD_ISCSI_DUMP_REQ = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 51), 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* 334*4882a593Smuzhiyun * ISCSI DUMP STATUS API: 335*4882a593Smuzhiyun * in: (u32)a0=cmd tag 336*4882a593Smuzhiyun * in: (u32)a1=ISCSI_CMD_xxx 337*4882a593Smuzhiyun * out: (u32)a0=cmd status 338*4882a593Smuzhiyun */ 339*4882a593Smuzhiyun CMD_ISCSI_DUMP_STATUS = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 52), 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /* 342*4882a593Smuzhiyun * Subvnic migration from MQ <--> VF. 343*4882a593Smuzhiyun * Enable the LIF migration from MQ to VF and vice versa. MQ and VF 344*4882a593Smuzhiyun * indexes are statically bound at the time of initialization. 345*4882a593Smuzhiyun * Based on the 346*4882a593Smuzhiyun * direction of migration, the resources of either MQ or the VF shall 347*4882a593Smuzhiyun * be attached to the LIF. 348*4882a593Smuzhiyun * in: (u32)a0=Direction of Migration 349*4882a593Smuzhiyun * 0=> Migrate to VF 350*4882a593Smuzhiyun * 1=> Migrate to MQ 351*4882a593Smuzhiyun * (u32)a1=VF index (MQ index) 352*4882a593Smuzhiyun */ 353*4882a593Smuzhiyun CMD_MIGRATE_SUBVNIC = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 53), 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun /* 356*4882a593Smuzhiyun * Register / Deregister the notification block for MQ subvnics 357*4882a593Smuzhiyun * in: 358*4882a593Smuzhiyun * (u64)a0=paddr to notify (set paddr=0 to unset) 359*4882a593Smuzhiyun * (u32)a1 & 0x00000000ffffffff=sizeof(struct vnic_devcmd_notify) 360*4882a593Smuzhiyun * (u16)a1 & 0x0000ffff00000000=intr num (-1 for no intr) 361*4882a593Smuzhiyun * out: 362*4882a593Smuzhiyun * (u32)a1 = effective size 363*4882a593Smuzhiyun */ 364*4882a593Smuzhiyun CMD_SUBVNIC_NOTIFY = _CMDC(_CMD_DIR_RW, _CMD_VTYPE_ALL, 54), 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun /* 367*4882a593Smuzhiyun * Set the predefined mac address as default 368*4882a593Smuzhiyun * in: 369*4882a593Smuzhiyun * (u48)a0=mac addr 370*4882a593Smuzhiyun */ 371*4882a593Smuzhiyun CMD_SET_MAC_ADDR = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 55), 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun /* Update the provisioning info of the given VIF 374*4882a593Smuzhiyun * (u64)a0=paddr of vnic_devcmd_provinfo 375*4882a593Smuzhiyun * (u32)a1=sizeof provision info 376*4882a593Smuzhiyun */ 377*4882a593Smuzhiyun CMD_PROV_INFO_UPDATE = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ENET, 56), 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun /* 380*4882a593Smuzhiyun * Initialization for the devcmd2 interface. 381*4882a593Smuzhiyun * in: (u64) a0=host result buffer physical address 382*4882a593Smuzhiyun * in: (u16) a1=number of entries in result buffer 383*4882a593Smuzhiyun */ 384*4882a593Smuzhiyun CMD_INITIALIZE_DEVCMD2 = _CMDC(_CMD_DIR_WRITE, _CMD_VTYPE_ALL, 57) 385*4882a593Smuzhiyun }; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun /* flags for CMD_OPEN */ 388*4882a593Smuzhiyun #define CMD_OPENF_OPROM 0x1 /* open coming from option rom */ 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun #define CMD_OPENF_RQ_ENABLE_THEN_POST 0x2 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun /* flags for CMD_INIT */ 393*4882a593Smuzhiyun #define CMD_INITF_DEFAULT_MAC 0x1 /* init with default mac addr */ 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* flags for CMD_PACKET_FILTER */ 396*4882a593Smuzhiyun #define CMD_PFILTER_DIRECTED 0x01 397*4882a593Smuzhiyun #define CMD_PFILTER_MULTICAST 0x02 398*4882a593Smuzhiyun #define CMD_PFILTER_BROADCAST 0x04 399*4882a593Smuzhiyun #define CMD_PFILTER_PROMISCUOUS 0x08 400*4882a593Smuzhiyun #define CMD_PFILTER_ALL_MULTICAST 0x10 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun enum vnic_devcmd_status { 403*4882a593Smuzhiyun STAT_NONE = 0, 404*4882a593Smuzhiyun STAT_BUSY = 1 << 0, /* cmd in progress */ 405*4882a593Smuzhiyun STAT_ERROR = 1 << 1, /* last cmd caused error (code in a0) */ 406*4882a593Smuzhiyun }; 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun enum vnic_devcmd_error { 409*4882a593Smuzhiyun ERR_SUCCESS = 0, 410*4882a593Smuzhiyun ERR_EINVAL = 1, 411*4882a593Smuzhiyun ERR_EFAULT = 2, 412*4882a593Smuzhiyun ERR_EPERM = 3, 413*4882a593Smuzhiyun ERR_EBUSY = 4, 414*4882a593Smuzhiyun ERR_ECMDUNKNOWN = 5, 415*4882a593Smuzhiyun ERR_EBADSTATE = 6, 416*4882a593Smuzhiyun ERR_ENOMEM = 7, 417*4882a593Smuzhiyun ERR_ETIMEDOUT = 8, 418*4882a593Smuzhiyun ERR_ELINKDOWN = 9, 419*4882a593Smuzhiyun }; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun struct vnic_devcmd_fw_info { 422*4882a593Smuzhiyun char fw_version[32]; 423*4882a593Smuzhiyun char fw_build[32]; 424*4882a593Smuzhiyun char hw_version[32]; 425*4882a593Smuzhiyun char hw_serial_number[32]; 426*4882a593Smuzhiyun }; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun struct vnic_devcmd_notify { 429*4882a593Smuzhiyun u32 csum; /* checksum over following words */ 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun u32 link_state; /* link up == 1 */ 432*4882a593Smuzhiyun u32 port_speed; /* effective port speed (rate limit) */ 433*4882a593Smuzhiyun u32 mtu; /* MTU */ 434*4882a593Smuzhiyun u32 msglvl; /* requested driver msg lvl */ 435*4882a593Smuzhiyun u32 uif; /* uplink interface */ 436*4882a593Smuzhiyun u32 status; /* status bits (see VNIC_STF_*) */ 437*4882a593Smuzhiyun u32 error; /* error code (see ERR_*) for first ERR */ 438*4882a593Smuzhiyun u32 link_down_cnt; /* running count of link down transitions */ 439*4882a593Smuzhiyun }; 440*4882a593Smuzhiyun #define VNIC_STF_FATAL_ERR 0x0001 /* fatal fw error */ 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun struct vnic_devcmd_provinfo { 443*4882a593Smuzhiyun u8 oui[3]; 444*4882a593Smuzhiyun u8 type; 445*4882a593Smuzhiyun u8 data[]; 446*4882a593Smuzhiyun }; 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun /* 449*4882a593Smuzhiyun * Writing cmd register causes STAT_BUSY to get set in status register. 450*4882a593Smuzhiyun * When cmd completes, STAT_BUSY will be cleared. 451*4882a593Smuzhiyun * 452*4882a593Smuzhiyun * If cmd completed successfully STAT_ERROR will be clear 453*4882a593Smuzhiyun * and args registers contain cmd-specific results. 454*4882a593Smuzhiyun * 455*4882a593Smuzhiyun * If cmd error, STAT_ERROR will be set and args[0] contains error code. 456*4882a593Smuzhiyun * 457*4882a593Smuzhiyun * status register is read-only. While STAT_BUSY is set, 458*4882a593Smuzhiyun * all other register contents are read-only. 459*4882a593Smuzhiyun */ 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun /* Make sizeof(vnic_devcmd) a power-of-2 for I/O BAR. */ 462*4882a593Smuzhiyun #define VNIC_DEVCMD_NARGS 15 463*4882a593Smuzhiyun struct vnic_devcmd { 464*4882a593Smuzhiyun u32 status; /* RO */ 465*4882a593Smuzhiyun u32 cmd; /* RW */ 466*4882a593Smuzhiyun u64 args[VNIC_DEVCMD_NARGS]; /* RW cmd args (little-endian) */ 467*4882a593Smuzhiyun }; 468*4882a593Smuzhiyun 469*4882a593Smuzhiyun /* 470*4882a593Smuzhiyun * Version 2 of the interface. 471*4882a593Smuzhiyun * 472*4882a593Smuzhiyun * Some things are carried over, notably the vnic_devcmd_cmd enum. 473*4882a593Smuzhiyun */ 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun /* 476*4882a593Smuzhiyun * Flags for vnic_devcmd2.flags 477*4882a593Smuzhiyun */ 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun #define DEVCMD2_FNORESULT 0x1 /* Don't copy result to host */ 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun #define VNIC_DEVCMD2_NARGS VNIC_DEVCMD_NARGS 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun struct vnic_devcmd2 { 484*4882a593Smuzhiyun u16 pad; 485*4882a593Smuzhiyun u16 flags; 486*4882a593Smuzhiyun u32 cmd; /* same command #defines as original */ 487*4882a593Smuzhiyun u64 args[VNIC_DEVCMD2_NARGS]; 488*4882a593Smuzhiyun }; 489*4882a593Smuzhiyun 490*4882a593Smuzhiyun #define VNIC_DEVCMD2_NRESULTS VNIC_DEVCMD_NARGS 491*4882a593Smuzhiyun struct devcmd2_result { 492*4882a593Smuzhiyun u64 results[VNIC_DEVCMD2_NRESULTS]; 493*4882a593Smuzhiyun u32 pad; 494*4882a593Smuzhiyun u16 completed_index; /* into copy WQ */ 495*4882a593Smuzhiyun u8 error; /* same error codes as original */ 496*4882a593Smuzhiyun u8 color; /* 0 or 1 as with completion queues */ 497*4882a593Smuzhiyun }; 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun #define DEVCMD2_RING_SIZE 32 500*4882a593Smuzhiyun #define DEVCMD2_DESC_SIZE 128 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun #define DEVCMD2_RESULTS_SIZE_MAX ((1 << 16) - 1) 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun #endif /* _VNIC_DEVCMD_H_ */ 505