14d0e5007SSukumar Swaminathan /*
24d0e5007SSukumar Swaminathan  * CDDL HEADER START
34d0e5007SSukumar Swaminathan  *
44d0e5007SSukumar Swaminathan  * The contents of this file are subject to the terms of the
54d0e5007SSukumar Swaminathan  * Common Development and Distribution License (the "License").
64d0e5007SSukumar Swaminathan  * You may not use this file except in compliance with the License.
74d0e5007SSukumar Swaminathan  *
84d0e5007SSukumar Swaminathan  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
94d0e5007SSukumar Swaminathan  * or http://www.opensolaris.org/os/licensing.
104d0e5007SSukumar Swaminathan  * See the License for the specific language governing permissions
114d0e5007SSukumar Swaminathan  * and limitations under the License.
124d0e5007SSukumar Swaminathan  *
134d0e5007SSukumar Swaminathan  * When distributing Covered Code, include this CDDL HEADER in each
144d0e5007SSukumar Swaminathan  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
154d0e5007SSukumar Swaminathan  * If applicable, add the following below this CDDL HEADER, with the
164d0e5007SSukumar Swaminathan  * fields enclosed by brackets "[]" replaced with your own identifying
174d0e5007SSukumar Swaminathan  * information: Portions Copyright [yyyy] [name of copyright owner]
184d0e5007SSukumar Swaminathan  *
194d0e5007SSukumar Swaminathan  * CDDL HEADER END
204d0e5007SSukumar Swaminathan  */
214d0e5007SSukumar Swaminathan 
22*3abb112fSGarrett D'Amore /* Copyright © 2003-2011 Emulex. All rights reserved.  */
234d0e5007SSukumar Swaminathan 
244d0e5007SSukumar Swaminathan /*
254d0e5007SSukumar Swaminathan  * Header file defining the HW IO elements
264d0e5007SSukumar Swaminathan  */
274d0e5007SSukumar Swaminathan 
284d0e5007SSukumar Swaminathan #ifndef _OCE_IO_H_
294d0e5007SSukumar Swaminathan #define	_OCE_IO_H_
304d0e5007SSukumar Swaminathan 
314d0e5007SSukumar Swaminathan #ifdef __cplusplus
324d0e5007SSukumar Swaminathan extern "C" {
334d0e5007SSukumar Swaminathan #endif
344d0e5007SSukumar Swaminathan 
354d0e5007SSukumar Swaminathan #include <sys/types.h>
364d0e5007SSukumar Swaminathan #include <sys/dditypes.h>
374d0e5007SSukumar Swaminathan #include <sys/mutex.h>
384d0e5007SSukumar Swaminathan #include <sys/stream.h>
394d0e5007SSukumar Swaminathan #include <sys/debug.h>
404d0e5007SSukumar Swaminathan #include <sys/byteorder.h>
414d0e5007SSukumar Swaminathan #include <oce_hw.h>
424d0e5007SSukumar Swaminathan #include <oce_buf.h>
434d0e5007SSukumar Swaminathan 
444d0e5007SSukumar Swaminathan #define	DEFAULT_MQ_MBOX_TIMEOUT	(5 * 1000 * 1000) /* 5 sec (in usec) */
45*3abb112fSGarrett D'Amore #define	MBX_READY_TIMEOUT	(1 * 1000 * 1000) /* 1 sec (in usec) */
46*3abb112fSGarrett D'Amore #define	DEFAULT_DRAIN_TIME 	200	/* Default Drain Time */
474d0e5007SSukumar Swaminathan #define	MBX_TIMEOUT_SEC		5
484d0e5007SSukumar Swaminathan #define	STAT_TIMEOUT		2000000 /* update stats every 2 sec */
494d0e5007SSukumar Swaminathan 
504d0e5007SSukumar Swaminathan struct oce_dev;
514d0e5007SSukumar Swaminathan 
524d0e5007SSukumar Swaminathan enum eq_len {
534d0e5007SSukumar Swaminathan 	EQ_LEN_256 = 256,
544d0e5007SSukumar Swaminathan 	EQ_LEN_512 = 512,
554d0e5007SSukumar Swaminathan 	EQ_LEN_1024 = 1024,
564d0e5007SSukumar Swaminathan 	EQ_LEN_2048 = 2048,
574d0e5007SSukumar Swaminathan 	EQ_LEN_4096 = 4096
584d0e5007SSukumar Swaminathan };
594d0e5007SSukumar Swaminathan 
604d0e5007SSukumar Swaminathan enum eqe_size {
614d0e5007SSukumar Swaminathan 	EQE_SIZE_4 = 4,
624d0e5007SSukumar Swaminathan 	EQE_SIZE_16 = 16
634d0e5007SSukumar Swaminathan };
644d0e5007SSukumar Swaminathan 
658d738d7dSSukumar Swaminathan enum qtype {
668d738d7dSSukumar Swaminathan 	QTYPE_EQ,
678d738d7dSSukumar Swaminathan 	QTYPE_MQ,
688d738d7dSSukumar Swaminathan 	QTYPE_WQ,
698d738d7dSSukumar Swaminathan 	QTYPE_RQ,
708d738d7dSSukumar Swaminathan 	QTYPE_CQ,
718d738d7dSSukumar Swaminathan 	QTYPE_RSS
728d738d7dSSukumar Swaminathan };
738d738d7dSSukumar Swaminathan 
748d738d7dSSukumar Swaminathan typedef enum qstate_e {
758d738d7dSSukumar Swaminathan 	QDELETED = 0x0,
768d738d7dSSukumar Swaminathan 	QCREATED = 0x1
778d738d7dSSukumar Swaminathan }qstate_t;
788d738d7dSSukumar Swaminathan 
794d0e5007SSukumar Swaminathan struct eq_config {
804d0e5007SSukumar Swaminathan 	/* number of entries in the eq */
814d0e5007SSukumar Swaminathan 	enum eq_len q_len;
824d0e5007SSukumar Swaminathan 	/* size of each entry */
834d0e5007SSukumar Swaminathan 	enum eqe_size   item_size;
844d0e5007SSukumar Swaminathan 	/* vector associated with this eq */
854d0e5007SSukumar Swaminathan 	uint32_t    q_vector_num;
864d0e5007SSukumar Swaminathan 	/* minimum possible eq delay i usec */
874d0e5007SSukumar Swaminathan 	uint8_t		min_eqd;
884d0e5007SSukumar Swaminathan 	/* max eq delay in usec */
894d0e5007SSukumar Swaminathan 	uint8_t		max_eqd;
904d0e5007SSukumar Swaminathan 	/* currently configured eq delay in usec */
914d0e5007SSukumar Swaminathan 	uint8_t		cur_eqd;
924d0e5007SSukumar Swaminathan 	/* pad */
934d0e5007SSukumar Swaminathan 	uint8_t pad;
944d0e5007SSukumar Swaminathan };
954d0e5007SSukumar Swaminathan 
964d0e5007SSukumar Swaminathan struct oce_eq {
975b9d3151SSukumar Swaminathan 	/* Lock for this queue */
985b9d3151SSukumar Swaminathan 	kmutex_t lock;
994d0e5007SSukumar Swaminathan 	/* id assigned by the hw to this eq */
1004d0e5007SSukumar Swaminathan 	uint32_t eq_id;
1014d0e5007SSukumar Swaminathan 	/* handle to the creating parent dev */
1024d0e5007SSukumar Swaminathan 	void *parent;
1034d0e5007SSukumar Swaminathan 	/* callback context */
1044d0e5007SSukumar Swaminathan 	void *cb_context;
1054d0e5007SSukumar Swaminathan 	/* ring buffer for this eq */
1064d0e5007SSukumar Swaminathan 	oce_ring_buffer_t *ring;
1075b9d3151SSukumar Swaminathan 	/* reference count of this structure */
1085b9d3151SSukumar Swaminathan 	uint32_t ref_count;
1098d738d7dSSukumar Swaminathan 	/* Queue state */
1108d738d7dSSukumar Swaminathan 	qstate_t qstate;
1115b9d3151SSukumar Swaminathan 	/* configuration of this eq */
1125b9d3151SSukumar Swaminathan 	struct eq_config eq_cfg;
1134d0e5007SSukumar Swaminathan };
1144d0e5007SSukumar Swaminathan 
1154d0e5007SSukumar Swaminathan enum cq_len {
1164d0e5007SSukumar Swaminathan 	CQ_LEN_256 = 256,
1174d0e5007SSukumar Swaminathan 	CQ_LEN_512 = 512,
1184d0e5007SSukumar Swaminathan 	CQ_LEN_1024 = 1024
1194d0e5007SSukumar Swaminathan };
1204d0e5007SSukumar Swaminathan 
1214d0e5007SSukumar Swaminathan struct cq_config {
1224d0e5007SSukumar Swaminathan 	/* length of queue */
1234d0e5007SSukumar Swaminathan 	enum cq_len q_len;
1244d0e5007SSukumar Swaminathan 	/* size of each item */
1254d0e5007SSukumar Swaminathan 	uint32_t item_size;
1268d738d7dSSukumar Swaminathan 	/* is eventable */
1278d738d7dSSukumar Swaminathan 	boolean_t is_eventable;
1284d0e5007SSukumar Swaminathan 	/* solicited eventable? */
1298d738d7dSSukumar Swaminathan 	boolean_t sol_eventable;
1304d0e5007SSukumar Swaminathan 	/* no delay? */
1318d738d7dSSukumar Swaminathan 	boolean_t nodelay;
1324d0e5007SSukumar Swaminathan 	/* dma coalescing */
1334d0e5007SSukumar Swaminathan 	uint16_t dma_coalescing;
1344d0e5007SSukumar Swaminathan };
1354d0e5007SSukumar Swaminathan 
1364d0e5007SSukumar Swaminathan typedef uint16_t (*cq_handler_t)(void *arg1);
1374d0e5007SSukumar Swaminathan 
1384d0e5007SSukumar Swaminathan struct oce_cq {
1395b9d3151SSukumar Swaminathan 	/* lock */
1405b9d3151SSukumar Swaminathan 	kmutex_t lock;
1414d0e5007SSukumar Swaminathan 	/* id given by the hardware */
1424d0e5007SSukumar Swaminathan 	uint32_t    cq_id;
1434d0e5007SSukumar Swaminathan 	/* parent device to which this cq belongs */
1444d0e5007SSukumar Swaminathan 	void *parent;
1454d0e5007SSukumar Swaminathan 	/* event queue associated with this cq */
1464d0e5007SSukumar Swaminathan 	struct oce_eq *eq;
1474d0e5007SSukumar Swaminathan 	cq_handler_t cq_handler;
1484d0e5007SSukumar Swaminathan 	/* placeholder for callback context */
1494d0e5007SSukumar Swaminathan 	void *cb_arg;
1504d0e5007SSukumar Swaminathan 	/* ring buffer for this cq */
1514d0e5007SSukumar Swaminathan 	oce_ring_buffer_t *ring;
1528d738d7dSSukumar Swaminathan 	/* Queue state */
1538d738d7dSSukumar Swaminathan 	qstate_t qstate;
1545b9d3151SSukumar Swaminathan 	/* configuration of this cq */
1555b9d3151SSukumar Swaminathan 	struct cq_config cq_cfg;
1565b9d3151SSukumar Swaminathan 	/* reference count of this structure */
1575b9d3151SSukumar Swaminathan 	uint32_t ref_count;
1584d0e5007SSukumar Swaminathan };
1594d0e5007SSukumar Swaminathan 
1604d0e5007SSukumar Swaminathan struct mq_config {
1614d0e5007SSukumar Swaminathan 	uint32_t eqd;
1624d0e5007SSukumar Swaminathan 	uint8_t q_len;
1634d0e5007SSukumar Swaminathan 	uint8_t pad[3];
1644d0e5007SSukumar Swaminathan 
1654d0e5007SSukumar Swaminathan };
1664d0e5007SSukumar Swaminathan 
1674d0e5007SSukumar Swaminathan struct oce_mq {
1685b9d3151SSukumar Swaminathan 	/* lock for the mq */
1695b9d3151SSukumar Swaminathan 	kmutex_t lock;
1704d0e5007SSukumar Swaminathan 	/* handle to the parent device */
1714d0e5007SSukumar Swaminathan 	void *parent;
1724d0e5007SSukumar Swaminathan 	/* send queue */
1734d0e5007SSukumar Swaminathan 	oce_ring_buffer_t *ring;
1744d0e5007SSukumar Swaminathan 	/* idnetifier for the mq */
1754d0e5007SSukumar Swaminathan 	uint32_t mq_id;
1764d0e5007SSukumar Swaminathan 	struct oce_cq *cq;
1774d0e5007SSukumar Swaminathan 	struct oce_cq *async_cq;
1784d0e5007SSukumar Swaminathan 	/* free entries in Queue */
1794d0e5007SSukumar Swaminathan 	uint32_t mq_free;
1808d738d7dSSukumar Swaminathan 	/* Queue state */
1818d738d7dSSukumar Swaminathan 	qstate_t qstate;
1825b9d3151SSukumar Swaminathan 
1835b9d3151SSukumar Swaminathan 	/* configuration of this mq */
1845b9d3151SSukumar Swaminathan 	struct mq_config cfg;
1854d0e5007SSukumar Swaminathan };
1864d0e5007SSukumar Swaminathan 
1874d0e5007SSukumar Swaminathan 
1884d0e5007SSukumar Swaminathan /*
1894d0e5007SSukumar Swaminathan  * utility structure that handles context of mbx
1904d0e5007SSukumar Swaminathan  */
1914d0e5007SSukumar Swaminathan struct oce_mbx_ctx {
1924d0e5007SSukumar Swaminathan 	/* pointer to mbx */
1934d0e5007SSukumar Swaminathan 	struct oce_mbx *mbx;
1944d0e5007SSukumar Swaminathan 	/* call back functioin [optional] */
1954d0e5007SSukumar Swaminathan 	void (*cb)(void *ctx);
1964d0e5007SSukumar Swaminathan 	/* call back context [optional] */
1974d0e5007SSukumar Swaminathan 	void *cb_ctx;
1984d0e5007SSukumar Swaminathan };
1994d0e5007SSukumar Swaminathan 
2004d0e5007SSukumar Swaminathan struct wq_config {
2014d0e5007SSukumar Swaminathan 	/* qtype */
2024d0e5007SSukumar Swaminathan 	uint8_t wq_type;
2035b9d3151SSukumar Swaminathan 	uint16_t buf_size;
2045b9d3151SSukumar Swaminathan 	uint8_t pad[1];
2054d0e5007SSukumar Swaminathan 	uint32_t q_len; /* number of wqes */
2064d0e5007SSukumar Swaminathan 	uint16_t pd_id; /* protection domain id */
2074d0e5007SSukumar Swaminathan 	uint16_t pci_fn_num; /* pci function number */
2084d0e5007SSukumar Swaminathan 	uint32_t eqd;	/* interrupt delay */
2094d0e5007SSukumar Swaminathan 	uint32_t nbufs; /* copy buffers */
2104d0e5007SSukumar Swaminathan 	uint32_t nhdl; /* preallocated memory handles */
2114d0e5007SSukumar Swaminathan };
2124d0e5007SSukumar Swaminathan 
2134d0e5007SSukumar Swaminathan struct oce_wq {
2145b9d3151SSukumar Swaminathan 	kmutex_t tx_lock; /* lock for the WQ */
2155b9d3151SSukumar Swaminathan 	kmutex_t txc_lock; /* tx compl lock */
2164d0e5007SSukumar Swaminathan 	void *parent; /* parent of this wq */
2174d0e5007SSukumar Swaminathan 	oce_ring_buffer_t *ring; /* ring buffer managing the wqes */
218*3abb112fSGarrett D'Amore 	struct oce_cq *cq; 	/* cq associated with this wq */
219*3abb112fSGarrett D'Amore 	kmem_cache_t *wqed_cache; /* packet desc cache */
2205b9d3151SSukumar Swaminathan 	oce_wq_bdesc_t *wq_bdesc_array; /* buffer desc array */
2215b9d3151SSukumar Swaminathan 	OCE_LIST_T wq_buf_list; /* buffer list */
2225b9d3151SSukumar Swaminathan 	OCE_LIST_T wqe_desc_list; /* packet descriptor list */
223*3abb112fSGarrett D'Amore 	OCE_LIST_T wq_mdesc_list; /* free list of memory handles */
224*3abb112fSGarrett D'Amore 	oce_wq_mdesc_t *wq_mdesc_array; /* preallocated memory handles */
225*3abb112fSGarrett D'Amore 	uint32_t wqm_used; /* memory handles uses */
226*3abb112fSGarrett D'Amore 	boolean_t resched; /* used for mac_tx_update */
227*3abb112fSGarrett D'Amore 	uint32_t wq_free; /* Wqe free */
228*3abb112fSGarrett D'Amore 	uint32_t tx_deferd; /* Wqe free */
229*3abb112fSGarrett D'Amore 	uint32_t pkt_drops; /* drops */
2308d738d7dSSukumar Swaminathan 	/* Queue state */
2318d738d7dSSukumar Swaminathan 	qstate_t qstate;
2325b9d3151SSukumar Swaminathan 	uint16_t wq_id; /* wq ID */
2335b9d3151SSukumar Swaminathan     struct wq_config cfg; /* q config */
2344d0e5007SSukumar Swaminathan };
2354d0e5007SSukumar Swaminathan 
2364d0e5007SSukumar Swaminathan struct rq_config {
2374d0e5007SSukumar Swaminathan 	uint32_t q_len; /* q length */
2384d0e5007SSukumar Swaminathan 	uint32_t frag_size; /* fragment size. Send log2(size) in commmand */
2394d0e5007SSukumar Swaminathan 	uint32_t mtu; /* max frame size for this RQ */
2404d0e5007SSukumar Swaminathan 	uint32_t if_id; /* interface ID to associate this RQ with */
2414d0e5007SSukumar Swaminathan 	uint32_t is_rss_queue; /* is this RQ an RSS queue? */
2424d0e5007SSukumar Swaminathan 	uint32_t eqd;  /* interrupt delay */
2434d0e5007SSukumar Swaminathan 	uint32_t nbufs; /* Total data buffers */
2444d0e5007SSukumar Swaminathan };
2454d0e5007SSukumar Swaminathan 
2464d0e5007SSukumar Swaminathan struct rq_shadow_entry {
2474d0e5007SSukumar Swaminathan 	oce_rq_bdesc_t *rqbd;
2484d0e5007SSukumar Swaminathan };
2494d0e5007SSukumar Swaminathan 
2504d0e5007SSukumar Swaminathan struct oce_rq {
2514d0e5007SSukumar Swaminathan 	/* RQ config */
2524d0e5007SSukumar Swaminathan 	struct rq_config cfg;
2534d0e5007SSukumar Swaminathan 	/* RQ id */
2544d0e5007SSukumar Swaminathan 	uint32_t rq_id;
2554d0e5007SSukumar Swaminathan 	/* parent of this rq */
2564d0e5007SSukumar Swaminathan 	void *parent;
2574d0e5007SSukumar Swaminathan 	/* CPU ID assigend to this RQ if it is an RSS queue */
2584d0e5007SSukumar Swaminathan 	uint32_t rss_cpuid;
2594d0e5007SSukumar Swaminathan 	/* ring buffer managing the RQEs */
2604d0e5007SSukumar Swaminathan 	oce_ring_buffer_t *ring;
2614d0e5007SSukumar Swaminathan 	/* cq associated with this queue */
2624d0e5007SSukumar Swaminathan 	struct oce_cq *cq;
2634d0e5007SSukumar Swaminathan 	oce_rq_bdesc_t  *rq_bdesc_array;
2645b9d3151SSukumar Swaminathan 	/* shadow list of mblk for rq ring */
2655b9d3151SSukumar Swaminathan 	oce_rq_bdesc_t **shadow_ring;
2665b9d3151SSukumar Swaminathan 	oce_rq_bdesc_t  **rqb_freelist;
2675b9d3151SSukumar Swaminathan 	uint32_t rqb_free;
2685b9d3151SSukumar Swaminathan 	uint32_t rqb_next_free; /* next free slot */
2695b9d3151SSukumar Swaminathan 	uint32_t rqb_rc_head; /* recycling  head */
2704d0e5007SSukumar Swaminathan 	uint32_t buf_avail; /* buffer avaialable with hw */
2714d0e5007SSukumar Swaminathan 	uint32_t pending; /* Buffers sent up */
2728d738d7dSSukumar Swaminathan 	/* Queue state */
2738d738d7dSSukumar Swaminathan 	qstate_t qstate;
2744d0e5007SSukumar Swaminathan 	/* rq lock */
2758d738d7dSSukumar Swaminathan 	kmutex_t rx_lock;
2768d738d7dSSukumar Swaminathan 	kmutex_t rc_lock;
2774d0e5007SSukumar Swaminathan };
2784d0e5007SSukumar Swaminathan 
2794d0e5007SSukumar Swaminathan struct link_status {
2804d0e5007SSukumar Swaminathan 	/* dw 0 */
2814d0e5007SSukumar Swaminathan 	uint8_t physical_port;
2824d0e5007SSukumar Swaminathan 	uint8_t mac_duplex;
2834d0e5007SSukumar Swaminathan 	uint8_t mac_speed;
2844d0e5007SSukumar Swaminathan 	uint8_t mac_fault;
2854d0e5007SSukumar Swaminathan 	/* dw 1 */
2864d0e5007SSukumar Swaminathan 	uint8_t mgmt_mac_duplex;
2874d0e5007SSukumar Swaminathan 	uint8_t mgmt_mac_speed;
2885b9d3151SSukumar Swaminathan 	uint16_t qos_link_speed;
2895b9d3151SSukumar Swaminathan 	/* dw2 */
2905b9d3151SSukumar Swaminathan 	uint32_t logical_link_status;
2914d0e5007SSukumar Swaminathan };
2924d0e5007SSukumar Swaminathan 
2934d0e5007SSukumar Swaminathan oce_dma_buf_t *oce_alloc_dma_buffer(struct oce_dev *dev,
2945b9d3151SSukumar Swaminathan     uint32_t size, ddi_dma_attr_t *dma_attr, uint32_t flags);
2954d0e5007SSukumar Swaminathan void oce_free_dma_buffer(struct oce_dev *dev, oce_dma_buf_t *dbuf);
2964d0e5007SSukumar Swaminathan 
2974d0e5007SSukumar Swaminathan oce_ring_buffer_t *create_ring_buffer(struct oce_dev *dev,
2984d0e5007SSukumar Swaminathan     uint32_t num_items, uint32_t item_size,
2994d0e5007SSukumar Swaminathan     uint32_t flags);
3004d0e5007SSukumar Swaminathan void destroy_ring_buffer(struct oce_dev *dev, oce_ring_buffer_t *ring);
3014d0e5007SSukumar Swaminathan 
3024d0e5007SSukumar Swaminathan /* Queues */
3034d0e5007SSukumar Swaminathan int oce_set_eq_delay(struct oce_dev *dev, uint32_t *eq_arr,
3044d0e5007SSukumar Swaminathan     uint32_t eq_cnt, uint32_t eq_delay);
3054d0e5007SSukumar Swaminathan void oce_arm_eq(struct oce_dev *dev, int16_t qid, int npopped,
3064d0e5007SSukumar Swaminathan     boolean_t rearm, boolean_t clearint);
3074d0e5007SSukumar Swaminathan void oce_arm_cq(struct oce_dev *dev, int16_t qid, int npopped,
3084d0e5007SSukumar Swaminathan     boolean_t rearm);
3094d0e5007SSukumar Swaminathan void oce_drain_eq(struct oce_eq *eq);
310*3abb112fSGarrett D'Amore void oce_dev_rss_ready(struct oce_dev *dev);
3114d0e5007SSukumar Swaminathan 
3124d0e5007SSukumar Swaminathan /* Bootstrap */
3134d0e5007SSukumar Swaminathan int oce_mbox_init(struct oce_dev *dev);
3144d0e5007SSukumar Swaminathan int oce_mbox_fini(struct oce_dev *dev);
3154d0e5007SSukumar Swaminathan int oce_mbox_dispatch(struct  oce_dev *dev, uint32_t tmo_sec);
3164d0e5007SSukumar Swaminathan int oce_mbox_wait(struct  oce_dev *dev, uint32_t tmo_sec);
3174d0e5007SSukumar Swaminathan int oce_mbox_post(struct oce_dev *dev, struct oce_mbx *mbx,
3184d0e5007SSukumar Swaminathan     struct  oce_mbx_ctx *mbxctx);
3194d0e5007SSukumar Swaminathan 
3204d0e5007SSukumar Swaminathan /* Hardware */
3214d0e5007SSukumar Swaminathan boolean_t oce_is_reset_pci(struct oce_dev *dev);
3224d0e5007SSukumar Swaminathan int oce_pci_soft_reset(struct oce_dev *dev);
3234d0e5007SSukumar Swaminathan int oce_POST(struct oce_dev *dev);
3244d0e5007SSukumar Swaminathan int oce_pci_init(struct oce_dev *dev);
3254d0e5007SSukumar Swaminathan void oce_pci_fini(struct oce_dev *dev);
3268d738d7dSSukumar Swaminathan int oce_init_txrx(struct oce_dev *dev);
3278d738d7dSSukumar Swaminathan void oce_fini_txrx(struct oce_dev *dev);
3288d738d7dSSukumar Swaminathan int oce_create_queues(struct oce_dev *dev);
3298d738d7dSSukumar Swaminathan void oce_delete_queues(struct oce_dev *dev);
3308d738d7dSSukumar Swaminathan void oce_delete_nw_interface(struct oce_dev *dev);
3318d738d7dSSukumar Swaminathan int oce_create_nw_interface(struct oce_dev *dev);
3328d738d7dSSukumar Swaminathan int oce_reset_fun(struct oce_dev *dev);
3334d0e5007SSukumar Swaminathan 
3344d0e5007SSukumar Swaminathan /* Transmit */
3354d0e5007SSukumar Swaminathan struct oce_wq *oce_get_wq(struct oce_dev *dev, mblk_t *pkt);
3364d0e5007SSukumar Swaminathan uint16_t  oce_drain_wq_cq(void *arg);
3374d0e5007SSukumar Swaminathan mblk_t *oce_send_packet(struct oce_wq *wq, mblk_t *mp);
3384d0e5007SSukumar Swaminathan int oce_start_wq(struct oce_wq *wq);
3398d738d7dSSukumar Swaminathan void oce_clean_wq(struct oce_wq *wq);
3408d738d7dSSukumar Swaminathan 
3414d0e5007SSukumar Swaminathan 
3424d0e5007SSukumar Swaminathan /* Recieve */
3434d0e5007SSukumar Swaminathan uint16_t oce_drain_rq_cq(void *arg);
3444d0e5007SSukumar Swaminathan int oce_start_rq(struct oce_rq *rq);
3458d738d7dSSukumar Swaminathan void oce_clean_rq(struct oce_rq *rq);
3468d738d7dSSukumar Swaminathan void oce_rq_discharge(struct oce_rq *rq);
3475b9d3151SSukumar Swaminathan int oce_rx_pending(struct oce_dev *dev, struct oce_rq *rq, int32_t timeout);
3484d0e5007SSukumar Swaminathan 
3494d0e5007SSukumar Swaminathan /* event handling */
3504d0e5007SSukumar Swaminathan uint16_t oce_drain_mq_cq(void *arg);
3514d0e5007SSukumar Swaminathan int oce_mq_mbox_post(struct  oce_dev *dev, struct  oce_mbx *mbx,
3524d0e5007SSukumar Swaminathan     struct oce_mbx_ctx *mbxctx);
3534d0e5007SSukumar Swaminathan struct oce_mbx *oce_mq_get_mbx(struct oce_dev *dev);
3548d738d7dSSukumar Swaminathan void oce_clean_mq(struct oce_mq *mq);
3558d738d7dSSukumar Swaminathan int oce_start_mq(struct oce_mq *mq);
3568d738d7dSSukumar Swaminathan 
3574d0e5007SSukumar Swaminathan 
3584d0e5007SSukumar Swaminathan /* mbx functions */
3594d0e5007SSukumar Swaminathan void mbx_common_req_hdr_init(struct mbx_hdr *hdr, uint8_t dom,
3604d0e5007SSukumar Swaminathan     uint8_t port, uint8_t subsys, uint8_t opcode,
3614d0e5007SSukumar Swaminathan     uint32_t timeout, uint32_t pyld_len);
3624d0e5007SSukumar Swaminathan void mbx_nic_req_hdr_init(struct mbx_hdr *hdr, uint8_t dom, uint8_t port,
3634d0e5007SSukumar Swaminathan     uint8_t opcode, uint32_t timeout, uint32_t pyld_len);
3644d0e5007SSukumar Swaminathan int oce_get_fw_version(struct oce_dev *dev);
3658d738d7dSSukumar Swaminathan int oce_read_mac_addr(struct oce_dev *dev, uint32_t if_id, uint8_t perm,
3664d0e5007SSukumar Swaminathan     uint8_t type, struct mac_address_format *mac);
3674d0e5007SSukumar Swaminathan int oce_if_create(struct oce_dev *dev, uint32_t cap_flags, uint32_t en_flags,
3684d0e5007SSukumar Swaminathan     uint16_t vlan_tag, uint8_t *mac_addr, uint32_t *if_id);
3694d0e5007SSukumar Swaminathan int oce_if_del(struct oce_dev *dev, uint32_t if_id);
3704d0e5007SSukumar Swaminathan int oce_num_intr_vectors_set(struct oce_dev *dev, uint32_t num_vectors);
3714d0e5007SSukumar Swaminathan 
3724d0e5007SSukumar Swaminathan int oce_get_link_status(struct oce_dev *dev, struct link_status *link);
3734d0e5007SSukumar Swaminathan int oce_set_rx_filter(struct oce_dev *dev,
3744d0e5007SSukumar Swaminathan     struct mbx_set_common_ntwk_rx_filter *filter);
3758d738d7dSSukumar Swaminathan int oce_set_multicast_table(struct oce_dev *dev, uint32_t if_id,
3768d738d7dSSukumar Swaminathan 	struct ether_addr *mca_table, uint16_t mca_cnt, boolean_t promisc);
3774d0e5007SSukumar Swaminathan int oce_get_fw_config(struct oce_dev *dev);
3784d0e5007SSukumar Swaminathan int oce_get_hw_stats(struct oce_dev *dev);
3794d0e5007SSukumar Swaminathan int oce_set_flow_control(struct oce_dev *dev, uint32_t flow_control);
3804d0e5007SSukumar Swaminathan int oce_get_flow_control(struct oce_dev *dev, uint32_t *flow_control);
3814d0e5007SSukumar Swaminathan int oce_set_promiscuous(struct oce_dev *dev, boolean_t enable);
3828d738d7dSSukumar Swaminathan int oce_add_mac(struct oce_dev *dev, uint32_t if_id,
3838d738d7dSSukumar Swaminathan 			const uint8_t *mac, uint32_t *pmac_id);
3848d738d7dSSukumar Swaminathan int oce_del_mac(struct oce_dev *dev, uint32_t if_id, uint32_t *pmac_id);
3858d738d7dSSukumar Swaminathan int oce_config_vlan(struct oce_dev *dev, uint32_t if_id,
3864d0e5007SSukumar Swaminathan     struct normal_vlan *vtag_arr,
3874d0e5007SSukumar Swaminathan     uint8_t vtag_cnt,  boolean_t untagged,
3884d0e5007SSukumar Swaminathan     boolean_t enable_promisc);
3894d0e5007SSukumar Swaminathan int oce_config_link(struct oce_dev *dev, boolean_t enable);
3905b9d3151SSukumar Swaminathan int oce_config_rss(struct oce_dev *dev, uint16_t if_id, char *hkey, char *itbl,
3915b9d3151SSukumar Swaminathan     int  tbl_sz, uint16_t rss_type, uint8_t flush);
3924d0e5007SSukumar Swaminathan int oce_issue_mbox(struct oce_dev *dev, queue_t *wq, mblk_t *mp,
3934d0e5007SSukumar Swaminathan     uint32_t *payload_length);
3944d0e5007SSukumar Swaminathan #ifdef __cplusplus
3954d0e5007SSukumar Swaminathan }
3964d0e5007SSukumar Swaminathan #endif
3974d0e5007SSukumar Swaminathan 
3984d0e5007SSukumar Swaminathan #endif /* _OCE_IO_H_ */
399