1*fe56b9e6SYuval Mintz /* QLogic qed NIC Driver 2*fe56b9e6SYuval Mintz * 3*fe56b9e6SYuval Mintz * Copyright (c) 2015 QLogic Corporation 4*fe56b9e6SYuval Mintz * 5*fe56b9e6SYuval Mintz * This software is available under the terms of the GNU General Public License 6*fe56b9e6SYuval Mintz * (GPL) Version 2, available from the file COPYING in the main directory of 7*fe56b9e6SYuval Mintz * this source tree. 8*fe56b9e6SYuval Mintz */ 9*fe56b9e6SYuval Mintz 10*fe56b9e6SYuval Mintz #ifndef _QED_IF_H 11*fe56b9e6SYuval Mintz #define _QED_IF_H 12*fe56b9e6SYuval Mintz 13*fe56b9e6SYuval Mintz #include <linux/types.h> 14*fe56b9e6SYuval Mintz #include <linux/interrupt.h> 15*fe56b9e6SYuval Mintz #include <linux/netdevice.h> 16*fe56b9e6SYuval Mintz #include <linux/pci.h> 17*fe56b9e6SYuval Mintz #include <linux/skbuff.h> 18*fe56b9e6SYuval Mintz #include <linux/types.h> 19*fe56b9e6SYuval Mintz #include <asm/byteorder.h> 20*fe56b9e6SYuval Mintz #include <linux/io.h> 21*fe56b9e6SYuval Mintz #include <linux/compiler.h> 22*fe56b9e6SYuval Mintz #include <linux/kernel.h> 23*fe56b9e6SYuval Mintz #include <linux/list.h> 24*fe56b9e6SYuval Mintz #include <linux/slab.h> 25*fe56b9e6SYuval Mintz #include <linux/qed/common_hsi.h> 26*fe56b9e6SYuval Mintz #include <linux/qed/qed_chain.h> 27*fe56b9e6SYuval Mintz 28*fe56b9e6SYuval Mintz #define DIRECT_REG_WR(reg_addr, val) writel((u32)val, \ 29*fe56b9e6SYuval Mintz (void __iomem *)(reg_addr)) 30*fe56b9e6SYuval Mintz 31*fe56b9e6SYuval Mintz #define DIRECT_REG_RD(reg_addr) readl((void __iomem *)(reg_addr)) 32*fe56b9e6SYuval Mintz 33*fe56b9e6SYuval Mintz #define QED_COALESCE_MAX 0xFF 34*fe56b9e6SYuval Mintz 35*fe56b9e6SYuval Mintz /* forward */ 36*fe56b9e6SYuval Mintz struct qed_dev; 37*fe56b9e6SYuval Mintz 38*fe56b9e6SYuval Mintz struct qed_eth_pf_params { 39*fe56b9e6SYuval Mintz /* The following parameters are used during HW-init 40*fe56b9e6SYuval Mintz * and these parameters need to be passed as arguments 41*fe56b9e6SYuval Mintz * to update_pf_params routine invoked before slowpath start 42*fe56b9e6SYuval Mintz */ 43*fe56b9e6SYuval Mintz u16 num_cons; 44*fe56b9e6SYuval Mintz }; 45*fe56b9e6SYuval Mintz 46*fe56b9e6SYuval Mintz struct qed_pf_params { 47*fe56b9e6SYuval Mintz struct qed_eth_pf_params eth_pf_params; 48*fe56b9e6SYuval Mintz }; 49*fe56b9e6SYuval Mintz 50*fe56b9e6SYuval Mintz enum qed_int_mode { 51*fe56b9e6SYuval Mintz QED_INT_MODE_INTA, 52*fe56b9e6SYuval Mintz QED_INT_MODE_MSIX, 53*fe56b9e6SYuval Mintz QED_INT_MODE_MSI, 54*fe56b9e6SYuval Mintz QED_INT_MODE_POLL, 55*fe56b9e6SYuval Mintz }; 56*fe56b9e6SYuval Mintz 57*fe56b9e6SYuval Mintz struct qed_sb_info { 58*fe56b9e6SYuval Mintz struct status_block *sb_virt; 59*fe56b9e6SYuval Mintz dma_addr_t sb_phys; 60*fe56b9e6SYuval Mintz u32 sb_ack; /* Last given ack */ 61*fe56b9e6SYuval Mintz u16 igu_sb_id; 62*fe56b9e6SYuval Mintz void __iomem *igu_addr; 63*fe56b9e6SYuval Mintz u8 flags; 64*fe56b9e6SYuval Mintz #define QED_SB_INFO_INIT 0x1 65*fe56b9e6SYuval Mintz #define QED_SB_INFO_SETUP 0x2 66*fe56b9e6SYuval Mintz 67*fe56b9e6SYuval Mintz struct qed_dev *cdev; 68*fe56b9e6SYuval Mintz }; 69*fe56b9e6SYuval Mintz 70*fe56b9e6SYuval Mintz struct qed_dev_info { 71*fe56b9e6SYuval Mintz unsigned long pci_mem_start; 72*fe56b9e6SYuval Mintz unsigned long pci_mem_end; 73*fe56b9e6SYuval Mintz unsigned int pci_irq; 74*fe56b9e6SYuval Mintz u8 num_hwfns; 75*fe56b9e6SYuval Mintz 76*fe56b9e6SYuval Mintz u8 hw_mac[ETH_ALEN]; 77*fe56b9e6SYuval Mintz bool is_mf; 78*fe56b9e6SYuval Mintz 79*fe56b9e6SYuval Mintz /* FW version */ 80*fe56b9e6SYuval Mintz u16 fw_major; 81*fe56b9e6SYuval Mintz u16 fw_minor; 82*fe56b9e6SYuval Mintz u16 fw_rev; 83*fe56b9e6SYuval Mintz u16 fw_eng; 84*fe56b9e6SYuval Mintz 85*fe56b9e6SYuval Mintz /* MFW version */ 86*fe56b9e6SYuval Mintz u32 mfw_rev; 87*fe56b9e6SYuval Mintz 88*fe56b9e6SYuval Mintz u32 flash_size; 89*fe56b9e6SYuval Mintz u8 mf_mode; 90*fe56b9e6SYuval Mintz }; 91*fe56b9e6SYuval Mintz 92*fe56b9e6SYuval Mintz enum qed_sb_type { 93*fe56b9e6SYuval Mintz QED_SB_TYPE_L2_QUEUE, 94*fe56b9e6SYuval Mintz }; 95*fe56b9e6SYuval Mintz 96*fe56b9e6SYuval Mintz enum qed_protocol { 97*fe56b9e6SYuval Mintz QED_PROTOCOL_ETH, 98*fe56b9e6SYuval Mintz }; 99*fe56b9e6SYuval Mintz 100*fe56b9e6SYuval Mintz struct qed_link_params { 101*fe56b9e6SYuval Mintz bool link_up; 102*fe56b9e6SYuval Mintz 103*fe56b9e6SYuval Mintz #define QED_LINK_OVERRIDE_SPEED_AUTONEG BIT(0) 104*fe56b9e6SYuval Mintz #define QED_LINK_OVERRIDE_SPEED_ADV_SPEEDS BIT(1) 105*fe56b9e6SYuval Mintz #define QED_LINK_OVERRIDE_SPEED_FORCED_SPEED BIT(2) 106*fe56b9e6SYuval Mintz #define QED_LINK_OVERRIDE_PAUSE_CONFIG BIT(3) 107*fe56b9e6SYuval Mintz u32 override_flags; 108*fe56b9e6SYuval Mintz bool autoneg; 109*fe56b9e6SYuval Mintz u32 adv_speeds; 110*fe56b9e6SYuval Mintz u32 forced_speed; 111*fe56b9e6SYuval Mintz #define QED_LINK_PAUSE_AUTONEG_ENABLE BIT(0) 112*fe56b9e6SYuval Mintz #define QED_LINK_PAUSE_RX_ENABLE BIT(1) 113*fe56b9e6SYuval Mintz #define QED_LINK_PAUSE_TX_ENABLE BIT(2) 114*fe56b9e6SYuval Mintz u32 pause_config; 115*fe56b9e6SYuval Mintz }; 116*fe56b9e6SYuval Mintz 117*fe56b9e6SYuval Mintz struct qed_link_output { 118*fe56b9e6SYuval Mintz bool link_up; 119*fe56b9e6SYuval Mintz 120*fe56b9e6SYuval Mintz u32 supported_caps; /* In SUPPORTED defs */ 121*fe56b9e6SYuval Mintz u32 advertised_caps; /* In ADVERTISED defs */ 122*fe56b9e6SYuval Mintz u32 lp_caps; /* In ADVERTISED defs */ 123*fe56b9e6SYuval Mintz u32 speed; /* In Mb/s */ 124*fe56b9e6SYuval Mintz u8 duplex; /* In DUPLEX defs */ 125*fe56b9e6SYuval Mintz u8 port; /* In PORT defs */ 126*fe56b9e6SYuval Mintz bool autoneg; 127*fe56b9e6SYuval Mintz u32 pause_config; 128*fe56b9e6SYuval Mintz }; 129*fe56b9e6SYuval Mintz 130*fe56b9e6SYuval Mintz #define QED_DRV_VER_STR_SIZE 12 131*fe56b9e6SYuval Mintz struct qed_slowpath_params { 132*fe56b9e6SYuval Mintz u32 int_mode; 133*fe56b9e6SYuval Mintz u8 drv_major; 134*fe56b9e6SYuval Mintz u8 drv_minor; 135*fe56b9e6SYuval Mintz u8 drv_rev; 136*fe56b9e6SYuval Mintz u8 drv_eng; 137*fe56b9e6SYuval Mintz u8 name[QED_DRV_VER_STR_SIZE]; 138*fe56b9e6SYuval Mintz }; 139*fe56b9e6SYuval Mintz 140*fe56b9e6SYuval Mintz #define ILT_PAGE_SIZE_TCFC 0x8000 /* 32KB */ 141*fe56b9e6SYuval Mintz 142*fe56b9e6SYuval Mintz struct qed_int_info { 143*fe56b9e6SYuval Mintz struct msix_entry *msix; 144*fe56b9e6SYuval Mintz u8 msix_cnt; 145*fe56b9e6SYuval Mintz 146*fe56b9e6SYuval Mintz /* This should be updated by the protocol driver */ 147*fe56b9e6SYuval Mintz u8 used_cnt; 148*fe56b9e6SYuval Mintz }; 149*fe56b9e6SYuval Mintz 150*fe56b9e6SYuval Mintz struct qed_common_cb_ops { 151*fe56b9e6SYuval Mintz void (*link_update)(void *dev, 152*fe56b9e6SYuval Mintz struct qed_link_output *link); 153*fe56b9e6SYuval Mintz }; 154*fe56b9e6SYuval Mintz 155*fe56b9e6SYuval Mintz struct qed_common_ops { 156*fe56b9e6SYuval Mintz struct qed_dev* (*probe)(struct pci_dev *dev, 157*fe56b9e6SYuval Mintz enum qed_protocol protocol, 158*fe56b9e6SYuval Mintz u32 dp_module, u8 dp_level); 159*fe56b9e6SYuval Mintz 160*fe56b9e6SYuval Mintz void (*remove)(struct qed_dev *cdev); 161*fe56b9e6SYuval Mintz 162*fe56b9e6SYuval Mintz int (*set_power_state)(struct qed_dev *cdev, 163*fe56b9e6SYuval Mintz pci_power_t state); 164*fe56b9e6SYuval Mintz 165*fe56b9e6SYuval Mintz void (*set_id)(struct qed_dev *cdev, 166*fe56b9e6SYuval Mintz char name[], 167*fe56b9e6SYuval Mintz char ver_str[]); 168*fe56b9e6SYuval Mintz 169*fe56b9e6SYuval Mintz /* Client drivers need to make this call before slowpath_start. 170*fe56b9e6SYuval Mintz * PF params required for the call before slowpath_start is 171*fe56b9e6SYuval Mintz * documented within the qed_pf_params structure definition. 172*fe56b9e6SYuval Mintz */ 173*fe56b9e6SYuval Mintz void (*update_pf_params)(struct qed_dev *cdev, 174*fe56b9e6SYuval Mintz struct qed_pf_params *params); 175*fe56b9e6SYuval Mintz int (*slowpath_start)(struct qed_dev *cdev, 176*fe56b9e6SYuval Mintz struct qed_slowpath_params *params); 177*fe56b9e6SYuval Mintz 178*fe56b9e6SYuval Mintz int (*slowpath_stop)(struct qed_dev *cdev); 179*fe56b9e6SYuval Mintz 180*fe56b9e6SYuval Mintz /* Requests to use `cnt' interrupts for fastpath. 181*fe56b9e6SYuval Mintz * upon success, returns number of interrupts allocated for fastpath. 182*fe56b9e6SYuval Mintz */ 183*fe56b9e6SYuval Mintz int (*set_fp_int)(struct qed_dev *cdev, 184*fe56b9e6SYuval Mintz u16 cnt); 185*fe56b9e6SYuval Mintz 186*fe56b9e6SYuval Mintz /* Fills `info' with pointers required for utilizing interrupts */ 187*fe56b9e6SYuval Mintz int (*get_fp_int)(struct qed_dev *cdev, 188*fe56b9e6SYuval Mintz struct qed_int_info *info); 189*fe56b9e6SYuval Mintz 190*fe56b9e6SYuval Mintz u32 (*sb_init)(struct qed_dev *cdev, 191*fe56b9e6SYuval Mintz struct qed_sb_info *sb_info, 192*fe56b9e6SYuval Mintz void *sb_virt_addr, 193*fe56b9e6SYuval Mintz dma_addr_t sb_phy_addr, 194*fe56b9e6SYuval Mintz u16 sb_id, 195*fe56b9e6SYuval Mintz enum qed_sb_type type); 196*fe56b9e6SYuval Mintz 197*fe56b9e6SYuval Mintz u32 (*sb_release)(struct qed_dev *cdev, 198*fe56b9e6SYuval Mintz struct qed_sb_info *sb_info, 199*fe56b9e6SYuval Mintz u16 sb_id); 200*fe56b9e6SYuval Mintz 201*fe56b9e6SYuval Mintz void (*simd_handler_config)(struct qed_dev *cdev, 202*fe56b9e6SYuval Mintz void *token, 203*fe56b9e6SYuval Mintz int index, 204*fe56b9e6SYuval Mintz void (*handler)(void *)); 205*fe56b9e6SYuval Mintz 206*fe56b9e6SYuval Mintz void (*simd_handler_clean)(struct qed_dev *cdev, 207*fe56b9e6SYuval Mintz int index); 208*fe56b9e6SYuval Mintz /** 209*fe56b9e6SYuval Mintz * @brief set_link - set links according to params 210*fe56b9e6SYuval Mintz * 211*fe56b9e6SYuval Mintz * @param cdev 212*fe56b9e6SYuval Mintz * @param params - values used to override the default link configuration 213*fe56b9e6SYuval Mintz * 214*fe56b9e6SYuval Mintz * @return 0 on success, error otherwise. 215*fe56b9e6SYuval Mintz */ 216*fe56b9e6SYuval Mintz int (*set_link)(struct qed_dev *cdev, 217*fe56b9e6SYuval Mintz struct qed_link_params *params); 218*fe56b9e6SYuval Mintz 219*fe56b9e6SYuval Mintz /** 220*fe56b9e6SYuval Mintz * @brief get_link - returns the current link state. 221*fe56b9e6SYuval Mintz * 222*fe56b9e6SYuval Mintz * @param cdev 223*fe56b9e6SYuval Mintz * @param if_link - structure to be filled with current link configuration. 224*fe56b9e6SYuval Mintz */ 225*fe56b9e6SYuval Mintz void (*get_link)(struct qed_dev *cdev, 226*fe56b9e6SYuval Mintz struct qed_link_output *if_link); 227*fe56b9e6SYuval Mintz 228*fe56b9e6SYuval Mintz /** 229*fe56b9e6SYuval Mintz * @brief - drains chip in case Tx completions fail to arrive due to pause. 230*fe56b9e6SYuval Mintz * 231*fe56b9e6SYuval Mintz * @param cdev 232*fe56b9e6SYuval Mintz */ 233*fe56b9e6SYuval Mintz int (*drain)(struct qed_dev *cdev); 234*fe56b9e6SYuval Mintz 235*fe56b9e6SYuval Mintz /** 236*fe56b9e6SYuval Mintz * @brief update_msglvl - update module debug level 237*fe56b9e6SYuval Mintz * 238*fe56b9e6SYuval Mintz * @param cdev 239*fe56b9e6SYuval Mintz * @param dp_module 240*fe56b9e6SYuval Mintz * @param dp_level 241*fe56b9e6SYuval Mintz */ 242*fe56b9e6SYuval Mintz void (*update_msglvl)(struct qed_dev *cdev, 243*fe56b9e6SYuval Mintz u32 dp_module, 244*fe56b9e6SYuval Mintz u8 dp_level); 245*fe56b9e6SYuval Mintz 246*fe56b9e6SYuval Mintz int (*chain_alloc)(struct qed_dev *cdev, 247*fe56b9e6SYuval Mintz enum qed_chain_use_mode intended_use, 248*fe56b9e6SYuval Mintz enum qed_chain_mode mode, 249*fe56b9e6SYuval Mintz u16 num_elems, 250*fe56b9e6SYuval Mintz size_t elem_size, 251*fe56b9e6SYuval Mintz struct qed_chain *p_chain); 252*fe56b9e6SYuval Mintz 253*fe56b9e6SYuval Mintz void (*chain_free)(struct qed_dev *cdev, 254*fe56b9e6SYuval Mintz struct qed_chain *p_chain); 255*fe56b9e6SYuval Mintz }; 256*fe56b9e6SYuval Mintz 257*fe56b9e6SYuval Mintz /** 258*fe56b9e6SYuval Mintz * @brief qed_get_protocol_version 259*fe56b9e6SYuval Mintz * 260*fe56b9e6SYuval Mintz * @param protocol 261*fe56b9e6SYuval Mintz * 262*fe56b9e6SYuval Mintz * @return version supported by qed for given protocol driver 263*fe56b9e6SYuval Mintz */ 264*fe56b9e6SYuval Mintz u32 qed_get_protocol_version(enum qed_protocol protocol); 265*fe56b9e6SYuval Mintz 266*fe56b9e6SYuval Mintz #define MASK_FIELD(_name, _value) \ 267*fe56b9e6SYuval Mintz ((_value) &= (_name ## _MASK)) 268*fe56b9e6SYuval Mintz 269*fe56b9e6SYuval Mintz #define FIELD_VALUE(_name, _value) \ 270*fe56b9e6SYuval Mintz ((_value & _name ## _MASK) << _name ## _SHIFT) 271*fe56b9e6SYuval Mintz 272*fe56b9e6SYuval Mintz #define SET_FIELD(value, name, flag) \ 273*fe56b9e6SYuval Mintz do { \ 274*fe56b9e6SYuval Mintz (value) &= ~(name ## _MASK << name ## _SHIFT); \ 275*fe56b9e6SYuval Mintz (value) |= (((u64)flag) << (name ## _SHIFT)); \ 276*fe56b9e6SYuval Mintz } while (0) 277*fe56b9e6SYuval Mintz 278*fe56b9e6SYuval Mintz #define GET_FIELD(value, name) \ 279*fe56b9e6SYuval Mintz (((value) >> (name ## _SHIFT)) & name ## _MASK) 280*fe56b9e6SYuval Mintz 281*fe56b9e6SYuval Mintz /* Debug print definitions */ 282*fe56b9e6SYuval Mintz #define DP_ERR(cdev, fmt, ...) \ 283*fe56b9e6SYuval Mintz pr_err("[%s:%d(%s)]" fmt, \ 284*fe56b9e6SYuval Mintz __func__, __LINE__, \ 285*fe56b9e6SYuval Mintz DP_NAME(cdev) ? DP_NAME(cdev) : "", \ 286*fe56b9e6SYuval Mintz ## __VA_ARGS__) \ 287*fe56b9e6SYuval Mintz 288*fe56b9e6SYuval Mintz #define DP_NOTICE(cdev, fmt, ...) \ 289*fe56b9e6SYuval Mintz do { \ 290*fe56b9e6SYuval Mintz if (unlikely((cdev)->dp_level <= QED_LEVEL_NOTICE)) { \ 291*fe56b9e6SYuval Mintz pr_notice("[%s:%d(%s)]" fmt, \ 292*fe56b9e6SYuval Mintz __func__, __LINE__, \ 293*fe56b9e6SYuval Mintz DP_NAME(cdev) ? DP_NAME(cdev) : "", \ 294*fe56b9e6SYuval Mintz ## __VA_ARGS__); \ 295*fe56b9e6SYuval Mintz \ 296*fe56b9e6SYuval Mintz } \ 297*fe56b9e6SYuval Mintz } while (0) 298*fe56b9e6SYuval Mintz 299*fe56b9e6SYuval Mintz #define DP_INFO(cdev, fmt, ...) \ 300*fe56b9e6SYuval Mintz do { \ 301*fe56b9e6SYuval Mintz if (unlikely((cdev)->dp_level <= QED_LEVEL_INFO)) { \ 302*fe56b9e6SYuval Mintz pr_notice("[%s:%d(%s)]" fmt, \ 303*fe56b9e6SYuval Mintz __func__, __LINE__, \ 304*fe56b9e6SYuval Mintz DP_NAME(cdev) ? DP_NAME(cdev) : "", \ 305*fe56b9e6SYuval Mintz ## __VA_ARGS__); \ 306*fe56b9e6SYuval Mintz } \ 307*fe56b9e6SYuval Mintz } while (0) 308*fe56b9e6SYuval Mintz 309*fe56b9e6SYuval Mintz #define DP_VERBOSE(cdev, module, fmt, ...) \ 310*fe56b9e6SYuval Mintz do { \ 311*fe56b9e6SYuval Mintz if (unlikely(((cdev)->dp_level <= QED_LEVEL_VERBOSE) && \ 312*fe56b9e6SYuval Mintz ((cdev)->dp_module & module))) { \ 313*fe56b9e6SYuval Mintz pr_notice("[%s:%d(%s)]" fmt, \ 314*fe56b9e6SYuval Mintz __func__, __LINE__, \ 315*fe56b9e6SYuval Mintz DP_NAME(cdev) ? DP_NAME(cdev) : "", \ 316*fe56b9e6SYuval Mintz ## __VA_ARGS__); \ 317*fe56b9e6SYuval Mintz } \ 318*fe56b9e6SYuval Mintz } while (0) 319*fe56b9e6SYuval Mintz 320*fe56b9e6SYuval Mintz enum DP_LEVEL { 321*fe56b9e6SYuval Mintz QED_LEVEL_VERBOSE = 0x0, 322*fe56b9e6SYuval Mintz QED_LEVEL_INFO = 0x1, 323*fe56b9e6SYuval Mintz QED_LEVEL_NOTICE = 0x2, 324*fe56b9e6SYuval Mintz QED_LEVEL_ERR = 0x3, 325*fe56b9e6SYuval Mintz }; 326*fe56b9e6SYuval Mintz 327*fe56b9e6SYuval Mintz #define QED_LOG_LEVEL_SHIFT (30) 328*fe56b9e6SYuval Mintz #define QED_LOG_VERBOSE_MASK (0x3fffffff) 329*fe56b9e6SYuval Mintz #define QED_LOG_INFO_MASK (0x40000000) 330*fe56b9e6SYuval Mintz #define QED_LOG_NOTICE_MASK (0x80000000) 331*fe56b9e6SYuval Mintz 332*fe56b9e6SYuval Mintz enum DP_MODULE { 333*fe56b9e6SYuval Mintz QED_MSG_SPQ = 0x10000, 334*fe56b9e6SYuval Mintz QED_MSG_STATS = 0x20000, 335*fe56b9e6SYuval Mintz QED_MSG_DCB = 0x40000, 336*fe56b9e6SYuval Mintz QED_MSG_IOV = 0x80000, 337*fe56b9e6SYuval Mintz QED_MSG_SP = 0x100000, 338*fe56b9e6SYuval Mintz QED_MSG_STORAGE = 0x200000, 339*fe56b9e6SYuval Mintz QED_MSG_CXT = 0x800000, 340*fe56b9e6SYuval Mintz QED_MSG_ILT = 0x2000000, 341*fe56b9e6SYuval Mintz QED_MSG_ROCE = 0x4000000, 342*fe56b9e6SYuval Mintz QED_MSG_DEBUG = 0x8000000, 343*fe56b9e6SYuval Mintz /* to be added...up to 0x8000000 */ 344*fe56b9e6SYuval Mintz }; 345*fe56b9e6SYuval Mintz 346*fe56b9e6SYuval Mintz struct qed_eth_stats { 347*fe56b9e6SYuval Mintz u64 no_buff_discards; 348*fe56b9e6SYuval Mintz u64 packet_too_big_discard; 349*fe56b9e6SYuval Mintz u64 ttl0_discard; 350*fe56b9e6SYuval Mintz u64 rx_ucast_bytes; 351*fe56b9e6SYuval Mintz u64 rx_mcast_bytes; 352*fe56b9e6SYuval Mintz u64 rx_bcast_bytes; 353*fe56b9e6SYuval Mintz u64 rx_ucast_pkts; 354*fe56b9e6SYuval Mintz u64 rx_mcast_pkts; 355*fe56b9e6SYuval Mintz u64 rx_bcast_pkts; 356*fe56b9e6SYuval Mintz u64 mftag_filter_discards; 357*fe56b9e6SYuval Mintz u64 mac_filter_discards; 358*fe56b9e6SYuval Mintz u64 tx_ucast_bytes; 359*fe56b9e6SYuval Mintz u64 tx_mcast_bytes; 360*fe56b9e6SYuval Mintz u64 tx_bcast_bytes; 361*fe56b9e6SYuval Mintz u64 tx_ucast_pkts; 362*fe56b9e6SYuval Mintz u64 tx_mcast_pkts; 363*fe56b9e6SYuval Mintz u64 tx_bcast_pkts; 364*fe56b9e6SYuval Mintz u64 tx_err_drop_pkts; 365*fe56b9e6SYuval Mintz u64 tpa_coalesced_pkts; 366*fe56b9e6SYuval Mintz u64 tpa_coalesced_events; 367*fe56b9e6SYuval Mintz u64 tpa_aborts_num; 368*fe56b9e6SYuval Mintz u64 tpa_not_coalesced_pkts; 369*fe56b9e6SYuval Mintz u64 tpa_coalesced_bytes; 370*fe56b9e6SYuval Mintz 371*fe56b9e6SYuval Mintz /* port */ 372*fe56b9e6SYuval Mintz u64 rx_64_byte_packets; 373*fe56b9e6SYuval Mintz u64 rx_127_byte_packets; 374*fe56b9e6SYuval Mintz u64 rx_255_byte_packets; 375*fe56b9e6SYuval Mintz u64 rx_511_byte_packets; 376*fe56b9e6SYuval Mintz u64 rx_1023_byte_packets; 377*fe56b9e6SYuval Mintz u64 rx_1518_byte_packets; 378*fe56b9e6SYuval Mintz u64 rx_1522_byte_packets; 379*fe56b9e6SYuval Mintz u64 rx_2047_byte_packets; 380*fe56b9e6SYuval Mintz u64 rx_4095_byte_packets; 381*fe56b9e6SYuval Mintz u64 rx_9216_byte_packets; 382*fe56b9e6SYuval Mintz u64 rx_16383_byte_packets; 383*fe56b9e6SYuval Mintz u64 rx_crc_errors; 384*fe56b9e6SYuval Mintz u64 rx_mac_crtl_frames; 385*fe56b9e6SYuval Mintz u64 rx_pause_frames; 386*fe56b9e6SYuval Mintz u64 rx_pfc_frames; 387*fe56b9e6SYuval Mintz u64 rx_align_errors; 388*fe56b9e6SYuval Mintz u64 rx_carrier_errors; 389*fe56b9e6SYuval Mintz u64 rx_oversize_packets; 390*fe56b9e6SYuval Mintz u64 rx_jabbers; 391*fe56b9e6SYuval Mintz u64 rx_undersize_packets; 392*fe56b9e6SYuval Mintz u64 rx_fragments; 393*fe56b9e6SYuval Mintz u64 tx_64_byte_packets; 394*fe56b9e6SYuval Mintz u64 tx_65_to_127_byte_packets; 395*fe56b9e6SYuval Mintz u64 tx_128_to_255_byte_packets; 396*fe56b9e6SYuval Mintz u64 tx_256_to_511_byte_packets; 397*fe56b9e6SYuval Mintz u64 tx_512_to_1023_byte_packets; 398*fe56b9e6SYuval Mintz u64 tx_1024_to_1518_byte_packets; 399*fe56b9e6SYuval Mintz u64 tx_1519_to_2047_byte_packets; 400*fe56b9e6SYuval Mintz u64 tx_2048_to_4095_byte_packets; 401*fe56b9e6SYuval Mintz u64 tx_4096_to_9216_byte_packets; 402*fe56b9e6SYuval Mintz u64 tx_9217_to_16383_byte_packets; 403*fe56b9e6SYuval Mintz u64 tx_pause_frames; 404*fe56b9e6SYuval Mintz u64 tx_pfc_frames; 405*fe56b9e6SYuval Mintz u64 tx_lpi_entry_count; 406*fe56b9e6SYuval Mintz u64 tx_total_collisions; 407*fe56b9e6SYuval Mintz u64 brb_truncates; 408*fe56b9e6SYuval Mintz u64 brb_discards; 409*fe56b9e6SYuval Mintz u64 rx_mac_bytes; 410*fe56b9e6SYuval Mintz u64 rx_mac_uc_packets; 411*fe56b9e6SYuval Mintz u64 rx_mac_mc_packets; 412*fe56b9e6SYuval Mintz u64 rx_mac_bc_packets; 413*fe56b9e6SYuval Mintz u64 rx_mac_frames_ok; 414*fe56b9e6SYuval Mintz u64 tx_mac_bytes; 415*fe56b9e6SYuval Mintz u64 tx_mac_uc_packets; 416*fe56b9e6SYuval Mintz u64 tx_mac_mc_packets; 417*fe56b9e6SYuval Mintz u64 tx_mac_bc_packets; 418*fe56b9e6SYuval Mintz u64 tx_mac_ctrl_frames; 419*fe56b9e6SYuval Mintz }; 420*fe56b9e6SYuval Mintz 421*fe56b9e6SYuval Mintz #define QED_SB_IDX 0x0002 422*fe56b9e6SYuval Mintz 423*fe56b9e6SYuval Mintz #define RX_PI 0 424*fe56b9e6SYuval Mintz #define TX_PI(tc) (RX_PI + 1 + tc) 425*fe56b9e6SYuval Mintz 426*fe56b9e6SYuval Mintz static inline u16 qed_sb_update_sb_idx(struct qed_sb_info *sb_info) 427*fe56b9e6SYuval Mintz { 428*fe56b9e6SYuval Mintz u32 prod = 0; 429*fe56b9e6SYuval Mintz u16 rc = 0; 430*fe56b9e6SYuval Mintz 431*fe56b9e6SYuval Mintz prod = le32_to_cpu(sb_info->sb_virt->prod_index) & 432*fe56b9e6SYuval Mintz STATUS_BLOCK_PROD_INDEX_MASK; 433*fe56b9e6SYuval Mintz if (sb_info->sb_ack != prod) { 434*fe56b9e6SYuval Mintz sb_info->sb_ack = prod; 435*fe56b9e6SYuval Mintz rc |= QED_SB_IDX; 436*fe56b9e6SYuval Mintz } 437*fe56b9e6SYuval Mintz 438*fe56b9e6SYuval Mintz /* Let SB update */ 439*fe56b9e6SYuval Mintz mmiowb(); 440*fe56b9e6SYuval Mintz return rc; 441*fe56b9e6SYuval Mintz } 442*fe56b9e6SYuval Mintz 443*fe56b9e6SYuval Mintz /** 444*fe56b9e6SYuval Mintz * 445*fe56b9e6SYuval Mintz * @brief This function creates an update command for interrupts that is 446*fe56b9e6SYuval Mintz * written to the IGU. 447*fe56b9e6SYuval Mintz * 448*fe56b9e6SYuval Mintz * @param sb_info - This is the structure allocated and 449*fe56b9e6SYuval Mintz * initialized per status block. Assumption is 450*fe56b9e6SYuval Mintz * that it was initialized using qed_sb_init 451*fe56b9e6SYuval Mintz * @param int_cmd - Enable/Disable/Nop 452*fe56b9e6SYuval Mintz * @param upd_flg - whether igu consumer should be 453*fe56b9e6SYuval Mintz * updated. 454*fe56b9e6SYuval Mintz * 455*fe56b9e6SYuval Mintz * @return inline void 456*fe56b9e6SYuval Mintz */ 457*fe56b9e6SYuval Mintz static inline void qed_sb_ack(struct qed_sb_info *sb_info, 458*fe56b9e6SYuval Mintz enum igu_int_cmd int_cmd, 459*fe56b9e6SYuval Mintz u8 upd_flg) 460*fe56b9e6SYuval Mintz { 461*fe56b9e6SYuval Mintz struct igu_prod_cons_update igu_ack = { 0 }; 462*fe56b9e6SYuval Mintz 463*fe56b9e6SYuval Mintz igu_ack.sb_id_and_flags = 464*fe56b9e6SYuval Mintz ((sb_info->sb_ack << IGU_PROD_CONS_UPDATE_SB_INDEX_SHIFT) | 465*fe56b9e6SYuval Mintz (upd_flg << IGU_PROD_CONS_UPDATE_UPDATE_FLAG_SHIFT) | 466*fe56b9e6SYuval Mintz (int_cmd << IGU_PROD_CONS_UPDATE_ENABLE_INT_SHIFT) | 467*fe56b9e6SYuval Mintz (IGU_SEG_ACCESS_REG << 468*fe56b9e6SYuval Mintz IGU_PROD_CONS_UPDATE_SEGMENT_ACCESS_SHIFT)); 469*fe56b9e6SYuval Mintz 470*fe56b9e6SYuval Mintz DIRECT_REG_WR(sb_info->igu_addr, igu_ack.sb_id_and_flags); 471*fe56b9e6SYuval Mintz 472*fe56b9e6SYuval Mintz /* Both segments (interrupts & acks) are written to same place address; 473*fe56b9e6SYuval Mintz * Need to guarantee all commands will be received (in-order) by HW. 474*fe56b9e6SYuval Mintz */ 475*fe56b9e6SYuval Mintz mmiowb(); 476*fe56b9e6SYuval Mintz barrier(); 477*fe56b9e6SYuval Mintz } 478*fe56b9e6SYuval Mintz 479*fe56b9e6SYuval Mintz static inline void __internal_ram_wr(void *p_hwfn, 480*fe56b9e6SYuval Mintz void __iomem *addr, 481*fe56b9e6SYuval Mintz int size, 482*fe56b9e6SYuval Mintz u32 *data) 483*fe56b9e6SYuval Mintz 484*fe56b9e6SYuval Mintz { 485*fe56b9e6SYuval Mintz unsigned int i; 486*fe56b9e6SYuval Mintz 487*fe56b9e6SYuval Mintz for (i = 0; i < size / sizeof(*data); i++) 488*fe56b9e6SYuval Mintz DIRECT_REG_WR(&((u32 __iomem *)addr)[i], data[i]); 489*fe56b9e6SYuval Mintz } 490*fe56b9e6SYuval Mintz 491*fe56b9e6SYuval Mintz static inline void internal_ram_wr(void __iomem *addr, 492*fe56b9e6SYuval Mintz int size, 493*fe56b9e6SYuval Mintz u32 *data) 494*fe56b9e6SYuval Mintz { 495*fe56b9e6SYuval Mintz __internal_ram_wr(NULL, addr, size, data); 496*fe56b9e6SYuval Mintz } 497*fe56b9e6SYuval Mintz 498*fe56b9e6SYuval Mintz #endif 499