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