Print this page
NEX-1890 update oce from source provided by Emulex

*** 17,28 **** * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ ! /* Copyright © 2003-2011 Emulex. All rights reserved. */ /* * Driver specific data structures and function prototypes */ #ifndef _OCE_IMPL_H_ --- 17,33 ---- * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ ! /* ! * Copyright (c) 2009-2012 Emulex. All rights reserved. ! * Use is subject to license terms. ! */ + + /* * Driver specific data structures and function prototypes */ #ifndef _OCE_IMPL_H_
*** 32,45 **** --- 37,52 ---- extern "C" { #endif #include <sys/types.h> #include <sys/dditypes.h> + #include <sys/sysmacros.h> #include <sys/kstat.h> #include <sys/ddi_intr.h> #include <sys/cmn_err.h> #include <sys/byteorder.h> + #include <netinet/ip6.h> #include <sys/mac_provider.h> #include <sys/mac_ether.h> #include <sys/gld.h> #include <sys/bitmap.h> #include <sys/ddidmareq.h>
*** 65,74 **** --- 72,82 ---- #include <oce_hw.h> #include <oce_hw_eth.h> #include <oce_io.h> #include <oce_buf.h> #include <oce_utils.h> + #include <oce_ring.h> #include <oce_version.h> #define SIZE_128 128 #define SIZE_256 256 #define SIZE_512 512
*** 77,148 **** #define SIZE_4K (4 * 1024) #define SIZE_8K (8 * 1024) #define END 0xdeadface - #define MAX_DEVS 32 - #define MAX_RSS_PER_ADAPTER 2 - - #define OCE_MAX_ETH_FRAME_SIZE 1500 #define OCE_MAX_JUMBO_FRAME_SIZE 9018 - #define OCE_MIN_ETH_FRAME_SIZE 64 - #define OCE_LLC_SNAP_HDR_LEN 8 #define OCE_MIN_MTU 1500 #define OCE_MAX_MTU 9000 #define OCE_MAX_MCA 32 - #define OCE_RQ_MAX_FRAME_SZ 9018 ! #define OCE_MAX_EQ 8 #define OCE_MAX_CQ 1024 - #define OCE_MAX_WQ 8 - #define OCE_MAX_RQ 5 - #define OCE_MIN_RQ 1 #define OCE_WQ_NUM_BUFFERS 2048 #define OCE_WQ_BUF_SIZE 2048 #define OCE_LSO_MAX_SIZE (64 * 1024) #define OCE_DEFAULT_TX_BCOPY_LIMIT 512 #define OCE_DEFAULT_RX_BCOPY_LIMIT 128 #define OCE_DEFAULT_WQ_EQD 16 ! #define OCE_DEFAULT_TX_RING_SIZE 2048 ! #define OCE_DEFAULT_RX_RING_SIZE 1024 #define OCE_DEFAULT_WQS 1 - #if defined(__sparc) - #define OCE_DEFAULT_RQS OCE_MAX_RQ - #else - #define OCE_DEFAULT_RQS OCE_MIN_RQ - #endif ! #define OCE_DEFAULT_RX_PKT_PER_INTR (OCE_DEFAULT_RX_RING_SIZE / 2) ! #define OCE_DEFAULT_TX_RECLAIM_THRESHOLD 1024 #define OCE_MAX_RQ_POSTS 255 #define OCE_RQ_NUM_BUFFERS 2048 ! #define OCE_RQ_BUF_SIZE 8192 ! #define OCE_DEFAULT_RECHARGE_THRESHOLD OCE_MAX_RQ_POSTS ! #define OCE_NUM_USED_VECTORS 2 #define OCE_ITBL_SIZE 64 #define OCE_HKEY_SIZE 40 ! #define OCE_DMA_ALIGNMENT 0x1000ull ! #define OCE_MIN_VECTORS 1 ! #define OCE_CAPAB_FLAGS (MBX_RX_IFACE_FLAGS_BROADCAST | \ ! MBX_RX_IFACE_FLAGS_PROMISCUOUS | \ ! MBX_RX_IFACE_FLAGS_UNTAGGED | \ ! MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS | \ ! MBX_RX_IFACE_FLAGS_PASS_L3L4) - #define OCE_CAPAB_ENABLE (MBX_RX_IFACE_FLAGS_BROADCAST | \ - MBX_RX_IFACE_FLAGS_UNTAGGED | \ - MBX_RX_IFACE_FLAGS_PASS_L3L4) - #define OCE_FM_CAPABILITY (DDI_FM_EREPORT_CAPABLE | \ DDI_FM_ACCCHK_CAPABLE | \ DDI_FM_DMACHK_CAPABLE) - #define OCE_DEFAULT_RSS_TYPE (RSS_ENABLE_IPV4|RSS_ENABLE_TCP_IPV4) /* flow control definitions */ #define OCE_FC_NONE 0x00000000 #define OCE_FC_TX 0x00000001 --- 85,143 ---- #define SIZE_4K (4 * 1024) #define SIZE_8K (8 * 1024) #define END 0xdeadface #define OCE_MAX_JUMBO_FRAME_SIZE 9018 #define OCE_MIN_MTU 1500 #define OCE_MAX_MTU 9000 #define OCE_MAX_MCA 32 ! #define OCE_MAX_EQ 16 #define OCE_MAX_CQ 1024 #define OCE_WQ_NUM_BUFFERS 2048 #define OCE_WQ_BUF_SIZE 2048 #define OCE_LSO_MAX_SIZE (64 * 1024) #define OCE_DEFAULT_TX_BCOPY_LIMIT 512 #define OCE_DEFAULT_RX_BCOPY_LIMIT 128 #define OCE_DEFAULT_WQ_EQD 16 ! #define OCE_DEFAULT_RX_PKTS_PER_INTR 64 ! #define OCE_DEFAULT_TX_RECLAIM_THRESHOLD 1024 ! ! #define OCE_MAX_RSS_RINGS 16 ! #define OCE_MAX_RING_GROUPS 4 ! #define OCE_MAX_RING_PER_GROUP (OCE_MAX_RSS_RINGS+1) ! #define OCE_MIN_RING_PER_GROUP 1 ! #define OCE_MAX_RQ (OCE_MAX_EQ+1) ! #define OCE_MAX_WQ OCE_MAX_EQ ! #define OCE_MIN_RQ 1 ! #define OCE_MIN_WQ 1 ! #define OCE_DEF_RING_PER_GROUP OCE_MAX_RING_PER_GROUP ! #define OCE_DEFAULT_RQS 5 #define OCE_DEFAULT_WQS 1 ! #define OCE_MAX_SMAC_PER_DEV 128 ! #define OCE_MAX_PMAC_PER_GRP OCE_MAX_SMAC_PER_DEV ! #define OCE_MAX_RQ_POSTS 255 #define OCE_RQ_NUM_BUFFERS 2048 ! #define OCE_RQ_BUF_SIZE 2048 ! #define OCE_DEFAULT_RECHARGE_THRESHOLD 32 #define OCE_ITBL_SIZE 64 #define OCE_HKEY_SIZE 40 ! #define OCE_DMA_ALIGNMENT 0x0000000000001000ull #define OCE_MIN_VECTORS 1 ! #define OCE_DEFAULT_TX_RING_SIZE 2048 ! #define OCE_DEFAULT_RX_RING_SIZE 1024 #define OCE_FM_CAPABILITY (DDI_FM_EREPORT_CAPABLE | \ DDI_FM_ACCCHK_CAPABLE | \ DDI_FM_DMACHK_CAPABLE) #define OCE_DEFAULT_RSS_TYPE (RSS_ENABLE_IPV4|RSS_ENABLE_TCP_IPV4) /* flow control definitions */ #define OCE_FC_NONE 0x00000000 #define OCE_FC_TX 0x00000001
*** 151,160 **** --- 146,157 ---- /* PCI Information */ #define OCE_DEV_CFG_BAR 0x01 #define OCE_PCI_CSR_BAR 0x02 #define OCE_PCI_DB_BAR 0x03 + /* Lancer DB Bar */ + #define OCE_PCI_LANCER_DB_BAR 0x01 /* macros for device IO */ #define OCE_READ_REG32(handle, addr) ddi_get32(handle, addr) #define OCE_WRITE_REG32(handle, addr, value) ddi_put32(handle, addr, value)
*** 185,232 **** #define OCE_PCI_FUNC(dev) \ ((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \ >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK) #define DEV_LOCK(dev) mutex_enter(&dev->dev_lock) - #define DEV_UNLOCK(dev) mutex_exit(&dev->dev_lock) enum oce_ring_size { RING_SIZE_256 = 256, RING_SIZE_512 = 512, RING_SIZE_1024 = 1024, RING_SIZE_2048 = 2048 }; ! enum oce_driver_state { ! STATE_INIT = 0x2, STATE_MAC_STARTED = 0x4, ! STATE_QUIESCE = 0x8, ! STATE_MAC_STOPPING = 0x10 }; struct oce_dev { kmutex_t bmbx_lock; /* Bootstrap Lock */ kmutex_t dev_lock; /* lock for device */ /* Queues relarted */ ! struct oce_wq *wq[OCE_MAX_WQ]; /* TXQ Array */ ! struct oce_rq *rq[OCE_MAX_RQ]; /* RXQ Array */ ! struct oce_cq *cq[OCE_MAX_CQ]; /* Completion Queues */ ! struct oce_eq *eq[OCE_MAX_EQ]; /* Event Queues */ struct oce_mq *mq; /* MQ ring */ /* driver state machine */ ! enum oce_driver_state state; /* state */ boolean_t suspended; /* CPR */ uint32_t attach_state; /* attach progress */ ! oce_dma_buf_t *bmbx; /* Bootstrap MailBox */ uint32_t tx_bcopy_limit; /* TX BCOPY Limit */ uint32_t rx_bcopy_limit; /* RX BCOPY Limit */ uint32_t tx_reclaim_threshold; /* Tx reclaim */ uint32_t rx_pkt_per_intr; /* Rx pkts processed per intr */ /* BARS */ int num_bars; ddi_acc_handle_t pci_cfg_handle; /* Config space handle */ --- 182,289 ---- #define OCE_PCI_FUNC(dev) \ ((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \ >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK) #define DEV_LOCK(dev) mutex_enter(&dev->dev_lock) #define DEV_UNLOCK(dev) mutex_exit(&dev->dev_lock) enum oce_ring_size { RING_SIZE_256 = 256, RING_SIZE_512 = 512, RING_SIZE_1024 = 1024, RING_SIZE_2048 = 2048 }; ! enum oce_device_state { STATE_MAC_STARTED = 0x4, ! STATE_INTR_ENABLED = 0x8, ! STATE_MAC_STOPPING = 0x10, ! STATE_INTR_ADJUST = 0x20 }; + enum oce_group_state { + GROUP_INIT = 0x01, + GROUP_MAC_STARTED = 0x02, + GROUP_SUSPEND = 0x04 + }; + + #define ATTACH_DEV_INIT 0x1 + #define ATTACH_FM_INIT 0x2 + #define ATTACH_PCI_CFG 0x4 + #define ATTACH_LOCK_INIT 0x8 + #define ATTACH_PCI_INIT 0x10 + #define ATTACH_HW_INIT 0x20 + #define ATTACH_SETUP_INTR 0x100 + #define ATTACH_STAT_INIT 0x200 + #define ATTACH_MAC_REG 0x400 + #define ATTACH_CB_REG 0x1000 + #define ATTACH_ALLOC_QUEUES 0x2000 + #define ATTACH_REG_INTR_HANDLE 0x4000 + + typedef union oce_ring_s { + struct oce_rq *rx; + struct oce_wq *tx; + } oce_ring_t; + + + typedef struct oce_group_s + { + kmutex_t grp_lock; /* lock for group data */ + mac_ring_type_t grp_type; /* tx or rx ring group */ + uint32_t grp_num; /* index into the group array */ + mac_group_handle_t handle; /* ring handle used by framework */ + boolean_t rss_enable; /* if rx, whether rss or not */ + uint32_t if_id; /* unique to a group */ + uint32_t num_pmac; /* number of pmacs in this group */ + uint32_t pmac_ids[OCE_MAX_PMAC_PER_GRP]; /* pmac ids of added pmacs */ + struct ether_addr mac_addr[OCE_MAX_PMAC_PER_GRP]; /* MAC Addresses */ + uint32_t num_rings; + uint32_t eq_idx; + oce_ring_t ring[OCE_MAX_RING_PER_GROUP]; + void *parent; + enum oce_group_state state; + + uint16_t num_mca; /* MCA supported */ + struct ether_addr multi_cast[OCE_MAX_MCA]; /* MC TABLE */ + }oce_group_t; + struct oce_dev { kmutex_t bmbx_lock; /* Bootstrap Lock */ kmutex_t dev_lock; /* lock for device */ + uint16_t QnQ_tag; + uint8_t QnQ_valid; + uint8_t QnQ_queried; + + uint32_t rx_rings_per_group; + uint32_t num_rx_groups; + uint32_t num_tx_groups; + oce_group_t rx_group[OCE_MAX_RING_GROUPS]; + /* ungrouped TX rings */ + oce_ring_t default_tx_rings[OCE_MAX_WQ]; + uint32_t rx_rings; /* total */ + uint32_t tx_rings; /* total */ + uint32_t rss_cnt; + /* Queues relarted */ ! struct oce_wq *wq; /* TXQ Array */ ! struct oce_rq *rq; /* RXQ Array */ ! struct oce_cq **cq; /* Completion Queues */ ! struct oce_eq *eq; /* Event Queues */ struct oce_mq *mq; /* MQ ring */ /* driver state machine */ ! enum oce_device_state state; /* state */ boolean_t suspended; /* CPR */ uint32_t attach_state; /* attach progress */ ! oce_dma_buf_t bmbx; /* Bootstrap MailBox */ uint32_t tx_bcopy_limit; /* TX BCOPY Limit */ uint32_t rx_bcopy_limit; /* RX BCOPY Limit */ uint32_t tx_reclaim_threshold; /* Tx reclaim */ + uint32_t tx_reclaim; /* Tx reclaim */ uint32_t rx_pkt_per_intr; /* Rx pkts processed per intr */ /* BARS */ int num_bars; ddi_acc_handle_t pci_cfg_handle; /* Config space handle */
*** 239,258 **** ddi_acc_handle_t dev_cfg_handle; /* MMIO CONFIG SPACE */ mac_handle_t mac_handle; /* MAC HANDLE */ /* device stats */ kstat_t *oce_kstats; /* NIC STATS */ ! oce_dma_buf_t *stats_dbuf; /* STATS BUFFER */ ! struct mbx_get_nic_stats *hw_stats; /* dev stats */ uint32_t tx_errors; uint32_t tx_noxmtbuf; /* link status */ link_state_t link_status; int32_t link_speed; /* Link speed in Mbps */ /* OS */ uint32_t dev_id; /* device ID or instance number */ dev_info_t *dip; /* device info structure for device tree node */ /* Interrupt related */ --- 296,325 ---- ddi_acc_handle_t dev_cfg_handle; /* MMIO CONFIG SPACE */ mac_handle_t mac_handle; /* MAC HANDLE */ /* device stats */ kstat_t *oce_kstats; /* NIC STATS */ ! oce_dma_buf_t stats_dbuf; /* STATS BUFFER */ ! kmutex_t stat_lock; ! /* dev stats */ uint32_t tx_errors; uint32_t tx_noxmtbuf; /* link status */ link_state_t link_status; int32_t link_speed; /* Link speed in Mbps */ + int32_t link_duplex; + uint16_t pvid; + uint16_t reco_priority; /* Recommended priority */ + uint32_t vlan_prio_bmap; /* Available Vlan priorities bitmap */ + /* watch dog timer related */ + kmutex_t wd_lock; + boolean_t wd_enable; + timeout_id_t wd_id; + /* OS */ uint32_t dev_id; /* device ID or instance number */ dev_info_t *dip; /* device info structure for device tree node */ /* Interrupt related */
*** 260,290 **** int num_vectors; /* number of vectors used */ uint_t intr_pri; /* interrupt priority */ int intr_cap; ddi_intr_handle_t *htable; /* intr handler table */ int32_t hsize; /* device configuration */ uint32_t rq_max_bufs; /* maximum prealloced buffers */ uint32_t rq_frag_size; /* Rxq fragment size */ enum oce_ring_size tx_ring_size; enum oce_ring_size rx_ring_size; uint32_t neqs; /* No of event queues */ uint32_t nwqs; /* No of Work Queues */ uint32_t nrqs; /* No of Receive Queues */ ! uint32_t nifs; /* No of interfaces created */ ! uint32_t tx_rings; ! uint32_t rx_rings; uint32_t pmac_id; /* used to add or remove mac */ uint8_t unicast_addr[ETHERADDRL]; uint32_t num_smac; uint32_t mtu; int32_t fm_caps; - boolean_t rss_enable; /* RSS support */ boolean_t lso_capable; /* LSO */ boolean_t promisc; /* PROMISC MODE */ - uint32_t if_cap_flags; /* IF CAPAB */ uint32_t flow_control; /* flow control settings */ uint8_t mac_addr[ETHERADDRL]; /* hardware mac address */ uint16_t num_mca; /* MCA supported */ struct ether_addr multi_cast[OCE_MAX_MCA]; /* MC TABLE */ uint32_t cookie; /* used during fw download */ --- 327,355 ---- int num_vectors; /* number of vectors used */ uint_t intr_pri; /* interrupt priority */ int intr_cap; ddi_intr_handle_t *htable; /* intr handler table */ int32_t hsize; + ddi_cb_handle_t cb_handle; /* IRM: callback handle */ + int max_vectors; /* IRM: max number of vectors */ /* device configuration */ uint32_t rq_max_bufs; /* maximum prealloced buffers */ uint32_t rq_frag_size; /* Rxq fragment size */ enum oce_ring_size tx_ring_size; enum oce_ring_size rx_ring_size; uint32_t neqs; /* No of event queues */ uint32_t nwqs; /* No of Work Queues */ uint32_t nrqs; /* No of Receive Queues */ ! uint32_t num_pmac; /* Total pmacs on this port */ uint32_t pmac_id; /* used to add or remove mac */ uint8_t unicast_addr[ETHERADDRL]; uint32_t num_smac; uint32_t mtu; int32_t fm_caps; boolean_t lso_capable; /* LSO */ boolean_t promisc; /* PROMISC MODE */ uint32_t flow_control; /* flow control settings */ uint8_t mac_addr[ETHERADDRL]; /* hardware mac address */ uint16_t num_mca; /* MCA supported */ struct ether_addr multi_cast[OCE_MAX_MCA]; /* MC TABLE */ uint32_t cookie; /* used during fw download */
*** 293,302 **** --- 358,368 ---- uint32_t config_number; uint32_t asic_revision; uint32_t port_id; uint32_t function_mode; uint32_t function_caps; + uint32_t drvfn_caps; uint32_t chip_rev; /* Chip revision */ uint32_t max_tx_rings; /* Max Rx rings available */ uint32_t max_rx_rings; /* Max rx rings available */ int32_t if_id; /* IF ID */ uint8_t fn; /* function number */
*** 305,322 **** /* PCI related */ uint16_t vendor_id; uint16_t device_id; uint16_t subsys_id; uint16_t subvendor_id; - uint8_t pci_bus; - uint8_t pci_device; - uint8_t pci_function; - uint8_t dev_list_index; /* Logging related */ uint16_t mod_mask; /* Log Mask */ int16_t severity; /* Log level */ }; /* GLD handler functions */ int oce_m_start(void *arg); void oce_m_stop(void *arg); --- 371,389 ---- /* PCI related */ uint16_t vendor_id; uint16_t device_id; uint16_t subsys_id; uint16_t subvendor_id; /* Logging related */ uint16_t mod_mask; /* Log Mask */ int16_t severity; /* Log level */ + + /* ue status */ + uint32_t ue_mask_lo; + uint32_t ue_mask_hi; + uint32_t sli_family; }; /* GLD handler functions */ int oce_m_start(void *arg); void oce_m_stop(void *arg);
*** 337,347 **** /* Hardware start/stop functions */ int oce_start(struct oce_dev *dev); void oce_stop(struct oce_dev *dev); int oce_identify_hw(struct oce_dev *dev); - int oce_get_bdf(struct oce_dev *dev); /* FMA support Functions */ void oce_fm_init(struct oce_dev *dev); void oce_fm_fini(struct oce_dev *dev); void oce_set_dma_fma_flags(int fm_caps); --- 404,413 ----
*** 356,376 **** /* Interrupt handling */ int oce_setup_intr(struct oce_dev *dev); int oce_teardown_intr(struct oce_dev *dev); int oce_setup_handlers(struct oce_dev *dev); void oce_remove_handler(struct oce_dev *dev); ! void oce_ei(struct oce_dev *dev); ! void oce_di(struct oce_dev *dev); void oce_chip_ei(struct oce_dev *dev); void oce_chip_di(struct oce_dev *dev); /* HW initialisation */ int oce_hw_init(struct oce_dev *dev); void oce_hw_fini(struct oce_dev *dev); ! int oce_setup_adapter(struct oce_dev *dev); ! void oce_unsetup_adapter(struct oce_dev *dev); #ifdef __cplusplus } #endif #endif /* _OCE_IMPL_H_ */ --- 422,462 ---- /* Interrupt handling */ int oce_setup_intr(struct oce_dev *dev); int oce_teardown_intr(struct oce_dev *dev); int oce_setup_handlers(struct oce_dev *dev); void oce_remove_handler(struct oce_dev *dev); ! int oce_ei(struct oce_dev *dev); ! int oce_di(struct oce_dev *dev); void oce_chip_ei(struct oce_dev *dev); void oce_chip_di(struct oce_dev *dev); /* HW initialisation */ int oce_hw_init(struct oce_dev *dev); void oce_hw_fini(struct oce_dev *dev); ! int oce_create_group(struct oce_dev *dev, oce_group_t *grp, uint32_t mode); ! void oce_delete_group(struct oce_dev *dev, oce_group_t *grp); ! void oce_delete_nw_interface(struct oce_dev *dev, oce_group_t *grp, ! uint32_t mode); ! int oce_create_nw_interface(struct oce_dev *dev, oce_group_t *grp, ! uint32_t mode); ! int oce_rq_init(struct oce_dev *dev, struct oce_rq *, uint32_t q_len, ! uint32_t frag_size, uint32_t mtu); ! void oce_rq_fini(struct oce_dev *dev, struct oce_rq *rq); + /* Timer related */ + void oce_enable_wd_timer(struct oce_dev *dev); + void oce_disable_wd_timer(struct oce_dev *dev); + boolean_t oce_check_ue(struct oce_dev *dev); + boolean_t oce_tx_stall_check(struct oce_dev *dev); + + /* Helper functions for crossbow ring groups */ + int oce_start_group(oce_group_t *, boolean_t); + void oce_stop_group(oce_group_t *, boolean_t); + int oce_resume_group_rings(oce_group_t *); + void oce_suspend_group_rings(oce_group_t *); + void oce_group_create_itbl(oce_group_t *, char *); + #ifdef __cplusplus } #endif #endif /* _OCE_IMPL_H_ */