11991Sheppo /* 21991Sheppo * CDDL HEADER START 31991Sheppo * 41991Sheppo * The contents of this file are subject to the terms of the 51991Sheppo * Common Development and Distribution License (the "License"). 61991Sheppo * You may not use this file except in compliance with the License. 71991Sheppo * 81991Sheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 91991Sheppo * or http://www.opensolaris.org/os/licensing. 101991Sheppo * See the License for the specific language governing permissions 111991Sheppo * and limitations under the License. 121991Sheppo * 131991Sheppo * When distributing Covered Code, include this CDDL HEADER in each 141991Sheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 151991Sheppo * If applicable, add the following below this CDDL HEADER, with the 161991Sheppo * fields enclosed by brackets "[]" replaced with your own identifying 171991Sheppo * information: Portions Copyright [yyyy] [name of copyright owner] 181991Sheppo * 191991Sheppo * CDDL HEADER END 201991Sheppo */ 211991Sheppo 221991Sheppo /* 23*13098SWentao.Yang@Sun.COM * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 241991Sheppo */ 251991Sheppo 261991Sheppo #ifndef _VNET_GEN_H 271991Sheppo #define _VNET_GEN_H 281991Sheppo 291991Sheppo #ifdef __cplusplus 301991Sheppo extern "C" { 311991Sheppo #endif 321991Sheppo 335373Sraghuram #include <sys/vgen_stats.h> 345373Sraghuram 351991Sheppo #define VGEN_SUCCESS (0) /* successful return */ 361991Sheppo #define VGEN_FAILURE (-1) /* unsuccessful return */ 371991Sheppo 381991Sheppo #define VGEN_NUM_VER 1 /* max # of vgen versions */ 391991Sheppo 401991Sheppo #define VGEN_LOCAL 1 /* local ldc end-point */ 411991Sheppo #define VGEN_PEER 2 /* peer ldc end-point */ 421991Sheppo 431991Sheppo /* vgen_t flags */ 441991Sheppo #define VGEN_STOPPED 0x0 451991Sheppo #define VGEN_STARTED 0x1 461991Sheppo 471991Sheppo #define KMEM_FREE(_p) kmem_free((_p), sizeof (*(_p))) 481991Sheppo 491991Sheppo #define VGEN_INIT_MCTAB_SIZE 16 /* initial size of multicast table */ 501991Sheppo 511991Sheppo #define READ_ENTER(x) rw_enter(x, RW_READER) 521991Sheppo #define WRITE_ENTER(x) rw_enter(x, RW_WRITER) 531991Sheppo #define RW_EXIT(x) rw_exit(x) 541991Sheppo 551991Sheppo /* channel flags */ 561991Sheppo #define CHANNEL_ATTACHED 0x1 571991Sheppo #define CHANNEL_STARTED 0x2 581991Sheppo 591991Sheppo /* transmit return values */ 601991Sheppo #define VGEN_TX_SUCCESS 0 /* transmit success */ 611991Sheppo #define VGEN_TX_FAILURE 1 /* transmit failure */ 621991Sheppo #define VGEN_TX_NORESOURCES 2 /* out of tbufs/txds */ 631991Sheppo 641991Sheppo /* private descriptor flags */ 651991Sheppo #define VGEN_PRIV_DESC_FREE 0x0 /* desc is available */ 661991Sheppo #define VGEN_PRIV_DESC_BUSY 0x1 /* desc in use */ 671991Sheppo 681991Sheppo #define LDC_TO_VNET(ldcp) ((ldcp)->portp->vgenp->vnetp) 691991Sheppo #define LDC_TO_VGEN(ldcp) ((ldcp)->portp->vgenp) 701991Sheppo 714647Sraghuram /* receive thread flags */ 7212011SSriharsha.Basavapatna@Sun.COM #define VGEN_WTHR_DATARCVD 0x01 /* data received */ 7312011SSriharsha.Basavapatna@Sun.COM #define VGEN_WTHR_STOP 0x02 /* stop worker thr request */ 7412011SSriharsha.Basavapatna@Sun.COM #define VGEN_WTHR_PROCESSING 0x04 /* worker thr awake & processing */ 754647Sraghuram 7612011SSriharsha.Basavapatna@Sun.COM #define VGEN_LDC_MTU 64 /* ldc pkt transfer mtu */ 772109Slm66018 #define VGEN_LDC_UP_DELAY 100 /* usec delay between ldc_up retries */ 788623SSriharsha.Basavapatna@Sun.COM #define VGEN_LDC_CLOSE_DELAY 100 /* usec delay between ldc_cl retries */ 7912011SSriharsha.Basavapatna@Sun.COM #define VGEN_LDC_UNINIT_DELAY 100 /* usec delay between uninit retries */ 8012011SSriharsha.Basavapatna@Sun.COM #define VGEN_TXWD_INTERVAL 1000 /* tx watchdog freq in msec */ 8112011SSriharsha.Basavapatna@Sun.COM #define VGEN_TXWD_TIMEOUT 1000 /* tx watchdog timeout in msec */ 822109Slm66018 834647Sraghuram #define VGEN_NUM_VMPOOLS 3 /* number of vio mblk pools */ 844647Sraghuram 854647Sraghuram #define VGEN_DBLK_SZ_128 128 /* data buffer size 128 bytes */ 864647Sraghuram #define VGEN_DBLK_SZ_256 256 /* data buffer size 256 bytes */ 874647Sraghuram #define VGEN_DBLK_SZ_2048 2048 /* data buffer size 2K bytes */ 884647Sraghuram #define VGEN_NRBUFS 512 /* number of receive bufs */ 894647Sraghuram 904647Sraghuram #define VGEN_TXDBLK_SZ 2048 /* Tx data buffer size */ 914647Sraghuram 9212011SSriharsha.Basavapatna@Sun.COM #define VGEN_NUM_DESCRIPTORS_MIN 128 /* min # of descriptors */ 9312011SSriharsha.Basavapatna@Sun.COM 94*13098SWentao.Yang@Sun.COM /* 95*13098SWentao.Yang@Sun.COM * Number of rcv buffers in RxDringData mode 96*13098SWentao.Yang@Sun.COM */ 97*13098SWentao.Yang@Sun.COM #define VGEN_RXDRING_NRBUFS (vnet_num_descriptors * vgen_nrbufs_factor) 98*13098SWentao.Yang@Sun.COM 9912011SSriharsha.Basavapatna@Sun.COM static struct ether_addr etherbroadcastaddr = { 10012011SSriharsha.Basavapatna@Sun.COM 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 10112011SSriharsha.Basavapatna@Sun.COM }; 10212011SSriharsha.Basavapatna@Sun.COM /* 10312011SSriharsha.Basavapatna@Sun.COM * MIB II broadcast/multicast packets 10412011SSriharsha.Basavapatna@Sun.COM */ 10512011SSriharsha.Basavapatna@Sun.COM #define IS_BROADCAST(ehp) \ 10612011SSriharsha.Basavapatna@Sun.COM (ether_cmp(&ehp->ether_dhost, ðerbroadcastaddr) == 0) 10712011SSriharsha.Basavapatna@Sun.COM #define IS_MULTICAST(ehp) \ 10812011SSriharsha.Basavapatna@Sun.COM ((ehp->ether_dhost.ether_addr_octet[0] & 01) == 1) 10912011SSriharsha.Basavapatna@Sun.COM 11012011SSriharsha.Basavapatna@Sun.COM /* 11112011SSriharsha.Basavapatna@Sun.COM * The handshake process consists of 5 phases defined below, with VH_PHASE0 11212011SSriharsha.Basavapatna@Sun.COM * being the pre-handshake phase and VH_DONE is the phase to indicate 11312011SSriharsha.Basavapatna@Sun.COM * successful completion of all phases. Each phase may have one to several 11412011SSriharsha.Basavapatna@Sun.COM * handshake states which are required to complete successfully to move to the 11512011SSriharsha.Basavapatna@Sun.COM * next phase. See functions vgen_handshake() and vgen_handshake_done() for 11612011SSriharsha.Basavapatna@Sun.COM * more details. 11712011SSriharsha.Basavapatna@Sun.COM */ 11812011SSriharsha.Basavapatna@Sun.COM /* Handshake phases */ 11912011SSriharsha.Basavapatna@Sun.COM enum { VH_PHASE0, VH_PHASE1, VH_PHASE2, VH_PHASE3, VH_PHASE4, VH_DONE = 0x80 }; 12012011SSriharsha.Basavapatna@Sun.COM 12112011SSriharsha.Basavapatna@Sun.COM /* Handshake states */ 12212011SSriharsha.Basavapatna@Sun.COM enum { 12312011SSriharsha.Basavapatna@Sun.COM 12412011SSriharsha.Basavapatna@Sun.COM VER_INFO_SENT = 0x1, 12512011SSriharsha.Basavapatna@Sun.COM VER_ACK_RCVD = 0x2, 12612011SSriharsha.Basavapatna@Sun.COM VER_INFO_RCVD = 0x4, 12712011SSriharsha.Basavapatna@Sun.COM VER_ACK_SENT = 0x8, 12812011SSriharsha.Basavapatna@Sun.COM VER_NEGOTIATED = (VER_ACK_RCVD | VER_ACK_SENT), 12912011SSriharsha.Basavapatna@Sun.COM 13012011SSriharsha.Basavapatna@Sun.COM ATTR_INFO_SENT = 0x10, 13112011SSriharsha.Basavapatna@Sun.COM ATTR_ACK_RCVD = 0x20, 13212011SSriharsha.Basavapatna@Sun.COM ATTR_INFO_RCVD = 0x40, 13312011SSriharsha.Basavapatna@Sun.COM ATTR_ACK_SENT = 0x80, 13412011SSriharsha.Basavapatna@Sun.COM ATTR_INFO_EXCHANGED = (ATTR_ACK_RCVD | ATTR_ACK_SENT), 13512011SSriharsha.Basavapatna@Sun.COM 13612011SSriharsha.Basavapatna@Sun.COM DRING_INFO_SENT = 0x100, 13712011SSriharsha.Basavapatna@Sun.COM DRING_ACK_RCVD = 0x200, 13812011SSriharsha.Basavapatna@Sun.COM DRING_INFO_RCVD = 0x400, 13912011SSriharsha.Basavapatna@Sun.COM DRING_ACK_SENT = 0x800, 14012011SSriharsha.Basavapatna@Sun.COM DRING_INFO_EXCHANGED = (DRING_ACK_RCVD | DRING_ACK_SENT), 14112011SSriharsha.Basavapatna@Sun.COM 14212011SSriharsha.Basavapatna@Sun.COM RDX_INFO_SENT = 0x1000, 14312011SSriharsha.Basavapatna@Sun.COM RDX_ACK_RCVD = 0x2000, 14412011SSriharsha.Basavapatna@Sun.COM RDX_INFO_RCVD = 0x4000, 14512011SSriharsha.Basavapatna@Sun.COM RDX_ACK_SENT = 0x8000, 14612011SSriharsha.Basavapatna@Sun.COM RDX_EXCHANGED = (RDX_ACK_RCVD | RDX_ACK_SENT) 14712011SSriharsha.Basavapatna@Sun.COM 14812011SSriharsha.Basavapatna@Sun.COM }; 14912011SSriharsha.Basavapatna@Sun.COM 15012011SSriharsha.Basavapatna@Sun.COM /* reset flags */ 15112011SSriharsha.Basavapatna@Sun.COM typedef enum { 15212011SSriharsha.Basavapatna@Sun.COM VGEN_FLAG_EVT_RESET = 0x1, /* channel reset event */ 15312011SSriharsha.Basavapatna@Sun.COM VGEN_FLAG_NEED_LDCRESET = 0x2, /* need channel reset */ 15412011SSriharsha.Basavapatna@Sun.COM VGEN_FLAG_UNINIT = 0x4 /* channel tear down */ 15512011SSriharsha.Basavapatna@Sun.COM } vgen_reset_flags_t; 15612011SSriharsha.Basavapatna@Sun.COM 15712011SSriharsha.Basavapatna@Sun.COM /* caller information needed in some code paths */ 15812011SSriharsha.Basavapatna@Sun.COM typedef enum { 15912011SSriharsha.Basavapatna@Sun.COM VGEN_LDC_CB = 0x1, /* ldc callback handler */ 16012011SSriharsha.Basavapatna@Sun.COM VGEN_MSG_THR = 0x2, /* vio message worker thread */ 16112011SSriharsha.Basavapatna@Sun.COM VGEN_OTHER = 0x4 /* other threads - tx etc */ 16212011SSriharsha.Basavapatna@Sun.COM } vgen_caller_t; 16312011SSriharsha.Basavapatna@Sun.COM 1641991Sheppo /* get the address of next tbuf */ 1651991Sheppo #define NEXTTBUF(ldcp, tbufp) (((tbufp) + 1) == (ldcp)->tbufendp \ 1661991Sheppo ? (ldcp)->tbufp : ((tbufp) + 1)) 1671991Sheppo 1681991Sheppo /* increment recv index */ 1691991Sheppo #define INCR_RXI(i, ldcp) \ 1701991Sheppo ((i) = (((i) + 1) & ((ldcp)->num_rxds - 1))) 1711991Sheppo 1721991Sheppo /* decrement recv index */ 1731991Sheppo #define DECR_RXI(i, ldcp) \ 1741991Sheppo ((i) = (((i) - 1) & ((ldcp)->num_rxds - 1))) 1751991Sheppo 1761991Sheppo /* increment tx index */ 1771991Sheppo #define INCR_TXI(i, ldcp) \ 1781991Sheppo ((i) = (((i) + 1) & ((ldcp)->num_txds - 1))) 1791991Sheppo 1801991Sheppo /* decrement tx index */ 1811991Sheppo #define DECR_TXI(i, ldcp) \ 1821991Sheppo ((i) = (((i) - 1) & ((ldcp)->num_txds - 1))) 1831991Sheppo 1841991Sheppo /* bounds check rx index */ 1851991Sheppo #define CHECK_RXI(i, ldcp) \ 1861991Sheppo (((i) >= 0) && ((i) < (ldcp)->num_rxds)) 1871991Sheppo 1881991Sheppo /* bounds check tx index */ 1891991Sheppo #define CHECK_TXI(i, ldcp) \ 1901991Sheppo (((i) >= 0) && ((i) < (ldcp)->num_txds)) 1911991Sheppo 19212011SSriharsha.Basavapatna@Sun.COM #ifdef DEBUG 19312011SSriharsha.Basavapatna@Sun.COM 19412011SSriharsha.Basavapatna@Sun.COM /* Error injection codes */ 19512011SSriharsha.Basavapatna@Sun.COM #define VGEN_ERR_HVER 0x1 /* handshake version */ 19612011SSriharsha.Basavapatna@Sun.COM #define VGEN_ERR_HTIMEOUT 0x2 /* handshake timeout */ 19712011SSriharsha.Basavapatna@Sun.COM #define VGEN_ERR_HSID 0x4 /* handshake session id */ 19812011SSriharsha.Basavapatna@Sun.COM #define VGEN_ERR_HSTATE 0x8 /* handshake state */ 19912011SSriharsha.Basavapatna@Sun.COM #define VGEN_ERR_TXTIMEOUT 0x10 /* tx timeout */ 20012011SSriharsha.Basavapatna@Sun.COM #define VGEN_ERR_RXLOST 0x20 /* rx lost pkts */ 20112011SSriharsha.Basavapatna@Sun.COM 20212011SSriharsha.Basavapatna@Sun.COM #endif 2031991Sheppo /* private descriptor */ 2041991Sheppo typedef struct vgen_priv_desc { 2051991Sheppo uint64_t flags; /* flag bits */ 2061991Sheppo vnet_public_desc_t *descp; /* associated public desc */ 2071991Sheppo ldc_mem_handle_t memhandle; /* mem handle for data */ 2082109Slm66018 caddr_t datap; /* prealloc'd tx data buffer */ 2091991Sheppo uint64_t datalen; /* total actual datalen */ 2101991Sheppo uint64_t ncookies; /* num ldc_mem_cookies */ 2111991Sheppo ldc_mem_cookie_t memcookie[MAX_COOKIES]; /* data cookies */ 2121991Sheppo } vgen_private_desc_t; 2131991Sheppo 2141991Sheppo /* 2151991Sheppo * Handshake parameters (per vio_mailbox.h) of each ldc end point, used 2161991Sheppo * during handshake negotiation. 2171991Sheppo */ 2181991Sheppo typedef struct vgen_handshake_params { 2191991Sheppo /* version specific params */ 2205462Swentaoy uint16_t ver_major; /* major version number */ 2215462Swentaoy uint16_t ver_minor; /* minor version number */ 2221991Sheppo uint8_t dev_class; /* device class */ 2231991Sheppo 2241991Sheppo /* attributes specific params */ 2251991Sheppo uint64_t mtu; /* max transfer unit size */ 2261991Sheppo uint64_t addr; /* address of the device */ 2271991Sheppo uint8_t addr_type; /* type of address */ 2281991Sheppo uint8_t xfer_mode; /* SHM or PKT */ 2291991Sheppo uint16_t ack_freq; /* dring data ack freq */ 2309336SSriharsha.Basavapatna@Sun.COM uint32_t physlink_update; /* physlink updates */ 23112011SSriharsha.Basavapatna@Sun.COM uint8_t dring_mode; /* Descriptor ring mode */ 2321991Sheppo 2331991Sheppo /* descriptor ring params */ 2341991Sheppo uint32_t num_desc; /* # of descriptors in ring */ 2351991Sheppo uint32_t desc_size; /* size of descriptor */ 2361991Sheppo ldc_mem_cookie_t dring_cookie; /* desc ring cookie */ 23712011SSriharsha.Basavapatna@Sun.COM uint32_t dring_ncookies; /* # of dring cookies */ 2381991Sheppo uint64_t dring_ident; /* ident=0 for INFO msg */ 2395462Swentaoy boolean_t dring_ready; /* dring ready flag */ 2401991Sheppo } vgen_hparams_t; 2411991Sheppo 2421991Sheppo /* version info */ 2431991Sheppo typedef struct vgen_ver { 2445462Swentaoy uint16_t ver_major; /* major version number */ 2455462Swentaoy uint16_t ver_minor; /* minor version number */ 2461991Sheppo } vgen_ver_t; 2471991Sheppo 2485935Ssb155480 /* 2495935Ssb155480 * vnet-protocol-version dependent function prototypes. 2505935Ssb155480 */ 2515935Ssb155480 typedef int (*vgen_ldctx_t) (void *, mblk_t *); 2525935Ssb155480 typedef void (*vgen_ldcrx_pktdata_t) (void *, void *, uint32_t); 25312011SSriharsha.Basavapatna@Sun.COM typedef int (*vgen_ldcrx_dringdata_t) (void *, void *); 2545935Ssb155480 25512011SSriharsha.Basavapatna@Sun.COM /* 25612011SSriharsha.Basavapatna@Sun.COM * LDC end point abstraction in vnet. This structure holds all the information 25712011SSriharsha.Basavapatna@Sun.COM * that is required to configure and use the Channel for data transfers with 25812011SSriharsha.Basavapatna@Sun.COM * the peer LDC end point (vnet or vswitch), using VIO Protocol. 25912011SSriharsha.Basavapatna@Sun.COM */ 2601991Sheppo typedef struct vgen_ldc { 2611991Sheppo 2621991Sheppo struct vgen_port *portp; /* associated port */ 2631991Sheppo 2641991Sheppo /* 2651991Sheppo * Locks: 2661991Sheppo * locking hierarchy when more than one lock is held concurrently: 2674647Sraghuram * cblock > rxlock > txlock > tclock. 2681991Sheppo */ 2691991Sheppo kmutex_t cblock; /* sync callback processing */ 2704647Sraghuram kmutex_t txlock; /* protect txd alloc */ 2711991Sheppo kmutex_t tclock; /* tx reclaim lock */ 2724647Sraghuram kmutex_t wrlock; /* sync transmits */ 2734647Sraghuram kmutex_t rxlock; /* sync reception */ 27410309SSriharsha.Basavapatna@Sun.COM kmutex_t pollq_lock; /* sync polling and rxworker */ 2751991Sheppo 27612011SSriharsha.Basavapatna@Sun.COM /* 27712011SSriharsha.Basavapatna@Sun.COM * Channel and Handshake Info 27812011SSriharsha.Basavapatna@Sun.COM */ 2791991Sheppo uint64_t ldc_id; /* channel number */ 2801991Sheppo uint64_t ldc_handle; /* channel handle */ 2811991Sheppo ldc_status_t ldc_status; /* channel status */ 2821991Sheppo vgen_ver_t vgen_versions[VGEN_NUM_VER]; /* versions */ 2831991Sheppo int hphase; /* handshake phase */ 2841991Sheppo int hstate; /* handshake state bits */ 2859336SSriharsha.Basavapatna@Sun.COM link_state_t link_state; /* channel link state */ 2869336SSriharsha.Basavapatna@Sun.COM #ifdef VNET_IOC_DEBUG 2879336SSriharsha.Basavapatna@Sun.COM boolean_t link_down_forced; /* forced link down */ 2889336SSriharsha.Basavapatna@Sun.COM #endif 2891991Sheppo uint32_t local_sid; /* local session id */ 2901991Sheppo uint32_t peer_sid; /* session id of peer */ 2911991Sheppo vgen_hparams_t local_hparams; /* local handshake params */ 2921991Sheppo vgen_hparams_t peer_hparams; /* peer's handshake params */ 2931991Sheppo timeout_id_t htid; /* handshake wd timeout id */ 2943653Snarayan timeout_id_t cancel_htid; /* cancel handshake watchdog */ 2956845Sha137994 uint8_t dring_mtype; /* dring mem map type */ 2965935Ssb155480 uint64_t *ldcmsg; /* msg buffer for ldc_read() */ 2975935Ssb155480 uint64_t msglen; /* size of ldcmsg */ 2981991Sheppo uint32_t flags; /* flags */ 29912011SSriharsha.Basavapatna@Sun.COM uint_t reset_in_progress; /* channel being reset */ 3001991Sheppo uint32_t hretries; /* handshake retry count */ 30112011SSriharsha.Basavapatna@Sun.COM uint32_t ldc_reset_count; /* # of channel resets */ 3024647Sraghuram 30312011SSriharsha.Basavapatna@Sun.COM /* 30412011SSriharsha.Basavapatna@Sun.COM * Transmit Specific Fields 30512011SSriharsha.Basavapatna@Sun.COM */ 30612011SSriharsha.Basavapatna@Sun.COM /* TX-Common (Used in both TxDring and RxDringData modes) */ 30712011SSriharsha.Basavapatna@Sun.COM uint32_t num_txds; /* # of descriptors */ 30812011SSriharsha.Basavapatna@Sun.COM uint32_t tx_dring_ncookies; /* # of dring cookies */ 30912011SSriharsha.Basavapatna@Sun.COM ldc_dring_handle_t tx_dring_handle; /* dring handle */ 31012011SSriharsha.Basavapatna@Sun.COM ldc_mem_cookie_t tx_dring_cookie; /* dring cookie */ 31112011SSriharsha.Basavapatna@Sun.COM uint32_t next_txi; /* free descriptor index */ 31212011SSriharsha.Basavapatna@Sun.COM caddr_t tx_datap; /* tx data area */ 31312011SSriharsha.Basavapatna@Sun.COM size_t tx_data_sz; /* size of data area */ 31412011SSriharsha.Basavapatna@Sun.COM size_t tx_dblk_sz; /* size of data blk */ 31512011SSriharsha.Basavapatna@Sun.COM timeout_id_t wd_tid; /* watchdog timeout id */ 31612011SSriharsha.Basavapatna@Sun.COM boolean_t tx_blocked; /* flow controlled */ 31712011SSriharsha.Basavapatna@Sun.COM clock_t tx_blocked_lbolt; /* flow controlled time */ 31812011SSriharsha.Basavapatna@Sun.COM boolean_t resched_peer; /* restart peer needed */ 31912011SSriharsha.Basavapatna@Sun.COM uint32_t resched_peer_txi; /* index to resched peer */ 32012011SSriharsha.Basavapatna@Sun.COM vgen_ldctx_t tx; /* transmit function */ 32112011SSriharsha.Basavapatna@Sun.COM vgen_ldctx_t tx_dringdata; /* dring transmit function */ 32212011SSriharsha.Basavapatna@Sun.COM 32312011SSriharsha.Basavapatna@Sun.COM /* TX-TxDring mode */ 32412011SSriharsha.Basavapatna@Sun.COM vnet_public_desc_t *txdp; /* exported dring */ 32512011SSriharsha.Basavapatna@Sun.COM vgen_private_desc_t *tbufp; /* dring associated resources */ 32612011SSriharsha.Basavapatna@Sun.COM vgen_private_desc_t *tbufendp; /* tbuf ring end */ 32712011SSriharsha.Basavapatna@Sun.COM vgen_private_desc_t *next_tbufp; /* free tbuf */ 32812011SSriharsha.Basavapatna@Sun.COM vgen_private_desc_t *cur_tbufp; /* reclaim tbuf */ 32912011SSriharsha.Basavapatna@Sun.COM uint32_t cur_txi; /* reclaim descrptor index */ 33012011SSriharsha.Basavapatna@Sun.COM uint64_t next_txseq; /* msg seqnum */ 33112011SSriharsha.Basavapatna@Sun.COM clock_t reclaim_lbolt; /* time of last reclaim */ 3325935Ssb155480 33312011SSriharsha.Basavapatna@Sun.COM /* TX-RxDringData mode */ 33412011SSriharsha.Basavapatna@Sun.COM uint32_t tx_data_ncookies; /* # of data cookies */ 33512011SSriharsha.Basavapatna@Sun.COM ldc_mem_handle_t tx_data_handle; /* mapped data handle */ 33612011SSriharsha.Basavapatna@Sun.COM ldc_mem_cookie_t *tx_data_cookie; /* mapped data cookies */ 33712011SSriharsha.Basavapatna@Sun.COM vnet_rx_dringdata_desc_t *mtxdp; /* mapped dring */ 33812011SSriharsha.Basavapatna@Sun.COM uint32_t dringdata_msgid; /* msg id */ 33912011SSriharsha.Basavapatna@Sun.COM 34012011SSriharsha.Basavapatna@Sun.COM /* 34112011SSriharsha.Basavapatna@Sun.COM * Receive Specific Fields 34212011SSriharsha.Basavapatna@Sun.COM */ 34312011SSriharsha.Basavapatna@Sun.COM /* RX-Common (Used in both TxDring and RxDringData modes) */ 34412011SSriharsha.Basavapatna@Sun.COM uint32_t num_rxds; /* # of descriptors */ 34512011SSriharsha.Basavapatna@Sun.COM uint32_t rx_dring_ncookies; /* # of dring cookies */ 34612011SSriharsha.Basavapatna@Sun.COM ldc_dring_handle_t rx_dring_handle; /* dring handle */ 34712011SSriharsha.Basavapatna@Sun.COM ldc_mem_cookie_t rx_dring_cookie; /* dring cookie */ 34812011SSriharsha.Basavapatna@Sun.COM uint32_t next_rxi; /* free descriptor index */ 34912011SSriharsha.Basavapatna@Sun.COM vgen_ldcrx_dringdata_t rx_dringdata; /* dring rcv function */ 35012011SSriharsha.Basavapatna@Sun.COM vgen_ldcrx_pktdata_t rx_pktdata; /* raw data rcv function */ 35112011SSriharsha.Basavapatna@Sun.COM boolean_t polling_on; /* polling enabled ? */ 3521991Sheppo 35312011SSriharsha.Basavapatna@Sun.COM /* RX-TxDring mode */ 35412011SSriharsha.Basavapatna@Sun.COM vnet_public_desc_t *mrxdp; /* mapped dring */ 35512011SSriharsha.Basavapatna@Sun.COM uint64_t next_rxseq; /* msg seqnum */ 35612011SSriharsha.Basavapatna@Sun.COM vio_multi_pool_t vmp; /* mblk pools */ 35712011SSriharsha.Basavapatna@Sun.COM uint32_t max_rxpool_size; /* max size of rxpool in use */ 35812011SSriharsha.Basavapatna@Sun.COM mblk_t *pollq_headp; /* head of pkts in pollq */ 35912011SSriharsha.Basavapatna@Sun.COM mblk_t *pollq_tailp; /* tail of pkts in pollq */ 36012011SSriharsha.Basavapatna@Sun.COM kthread_t *msg_thread; /* message thread */ 36112011SSriharsha.Basavapatna@Sun.COM uint32_t msg_thr_flags; /* message thread flags */ 36212011SSriharsha.Basavapatna@Sun.COM kmutex_t msg_thr_lock; /* lock for message thread */ 36312011SSriharsha.Basavapatna@Sun.COM kcondvar_t msg_thr_cv; /* cond.var for msg thread */ 36410309SSriharsha.Basavapatna@Sun.COM 36512011SSriharsha.Basavapatna@Sun.COM /* RX-RxDringData mode */ 36612011SSriharsha.Basavapatna@Sun.COM uint32_t num_rbufs; /* # of data bufs */ 36712011SSriharsha.Basavapatna@Sun.COM uint32_t rx_data_ncookies; /* # of data cookies */ 36812011SSriharsha.Basavapatna@Sun.COM ldc_mem_handle_t rx_data_handle; /* exported data handle */ 36912011SSriharsha.Basavapatna@Sun.COM ldc_mem_cookie_t *rx_data_cookie; /* exported data cookies */ 37012011SSriharsha.Basavapatna@Sun.COM vnet_rx_dringdata_desc_t *rxdp; /* exported dring */ 37112011SSriharsha.Basavapatna@Sun.COM vio_mblk_pool_t *rx_vmp; /* mblk pool */ 37212011SSriharsha.Basavapatna@Sun.COM vio_mblk_t **rxdp_to_vmp; /* descr to buf map tbl */ 37312011SSriharsha.Basavapatna@Sun.COM caddr_t rx_datap; /* mapped rx data area */ 37412011SSriharsha.Basavapatna@Sun.COM size_t rx_data_sz; /* size of mapped rx data */ 37512011SSriharsha.Basavapatna@Sun.COM size_t rx_dblk_sz; /* size of each rx data blk */ 37612011SSriharsha.Basavapatna@Sun.COM mblk_t *rx_pri_head; /* priority pkts head */ 37712011SSriharsha.Basavapatna@Sun.COM mblk_t *rx_pri_tail; /* priority pkts tail */ 37812011SSriharsha.Basavapatna@Sun.COM 37912011SSriharsha.Basavapatna@Sun.COM /* Channel Statistics */ 3805373Sraghuram vgen_stats_t stats; /* channel statistics */ 3811991Sheppo kstat_t *ksp; /* channel kstats */ 3821991Sheppo } vgen_ldc_t; 3831991Sheppo 3841991Sheppo /* port information structure */ 3851991Sheppo typedef struct vgen_port { 3861991Sheppo struct vgen_port *nextp; /* next port in the list */ 3871991Sheppo struct vgen *vgenp; /* associated vgen_t */ 3881991Sheppo int port_num; /* port number */ 3899336SSriharsha.Basavapatna@Sun.COM boolean_t is_vsw_port; /* connected to vswitch ? */ 3906419Ssb155480 int num_ldcs; /* # of channels in this port */ 3916419Ssb155480 uint64_t *ldc_ids; /* channel ids */ 39212011SSriharsha.Basavapatna@Sun.COM vgen_ldc_t *ldcp; /* list of ldcs for this port */ 3936495Sspeer ether_addr_t macaddr; /* mac address of peer */ 3946419Ssb155480 uint16_t pvid; /* port vlan id (untagged) */ 3956419Ssb155480 uint16_t *vids; /* vlan ids (tagged) */ 3966419Ssb155480 uint16_t nvids; /* # of vids */ 3976419Ssb155480 mod_hash_t *vlan_hashp; /* vlan hash table */ 3986419Ssb155480 uint32_t vlan_nchains; /* # of vlan hash chains */ 3996495Sspeer uint32_t use_vsw_port; /* Use vsw_port or not */ 4006495Sspeer uint32_t flags; /* status of this port */ 4016495Sspeer vio_net_callbacks_t vcb; /* vnet callbacks */ 4026495Sspeer vio_net_handle_t vhp; /* handle from vnet */ 4036495Sspeer kmutex_t lock; /* synchornize ops */ 4041991Sheppo } vgen_port_t; 4051991Sheppo 4061991Sheppo /* port list structure */ 4071991Sheppo typedef struct vgen_portlist { 4081991Sheppo vgen_port_t *headp; /* head of ports */ 4091991Sheppo vgen_port_t *tailp; /* tail */ 4101991Sheppo krwlock_t rwlock; /* sync access to the port list */ 4111991Sheppo } vgen_portlist_t; 4121991Sheppo 4131991Sheppo /* vgen instance information */ 4141991Sheppo typedef struct vgen { 4156419Ssb155480 vnet_t *vnetp; /* associated vnet instance */ 4166495Sspeer int instance; /* vnet instance */ 4171991Sheppo dev_info_t *vnetdip; /* dip of vnet */ 4185935Ssb155480 uint64_t regprop; /* "reg" property */ 4196495Sspeer ether_addr_t macaddr; /* mac addr of vnet */ 4201991Sheppo kmutex_t lock; /* synchornize ops */ 4211991Sheppo int flags; /* flags */ 4221991Sheppo vgen_portlist_t vgenports; /* Port List */ 4231991Sheppo mdeg_node_spec_t *mdeg_parentp; 4246419Ssb155480 mdeg_handle_t mdeg_dev_hdl; /* mdeg cb handle for device */ 4256419Ssb155480 mdeg_handle_t mdeg_port_hdl; /* mdeg cb handle for port */ 4261991Sheppo vgen_port_t *vsw_portp; /* port connected to vsw */ 4271991Sheppo struct ether_addr *mctab; /* multicast addr table */ 4281991Sheppo uint32_t mcsize; /* allocated size of mctab */ 4291991Sheppo uint32_t mccount; /* # of valid addrs in mctab */ 43012011SSriharsha.Basavapatna@Sun.COM ddi_taskq_t *rxp_taskq; /* VIO rx pool taskq */ 4315935Ssb155480 uint32_t pri_num_types; /* # of priority eth types */ 4325935Ssb155480 uint16_t *pri_types; /* priority eth types */ 4335935Ssb155480 vio_mblk_pool_t *pri_tx_vmp; /* tx priority mblk pool */ 4346419Ssb155480 uint32_t max_frame_size; /* max frame size supported */ 4356495Sspeer 4366495Sspeer uint32_t vsw_port_refcnt; /* refcnt for vsw_port */ 4379336SSriharsha.Basavapatna@Sun.COM boolean_t pls_negotiated; /* phys link state update ? */ 4389336SSriharsha.Basavapatna@Sun.COM link_state_t phys_link_state; /* physical link state */ 4391991Sheppo } vgen_t; 4401991Sheppo 4411991Sheppo #ifdef __cplusplus 4421991Sheppo } 4431991Sheppo #endif 4441991Sheppo 4451991Sheppo #endif /* _VNET_GEN_H */ 446