/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2015 - 2022 Beijing WangXun Technology Co., Ltd. */ #ifndef _WX_TYPE_H_ #define _WX_TYPE_H_ /* Vendor ID */ #ifndef PCI_VENDOR_ID_WANGXUN #define PCI_VENDOR_ID_WANGXUN 0x8088 #endif #define WX_NCSI_SUP 0x8000 #define WX_NCSI_MASK 0x8000 #define WX_WOL_SUP 0x4000 #define WX_WOL_MASK 0x4000 /* MSI-X capability fields masks */ #define WX_PCIE_MSIX_TBL_SZ_MASK 0x7FF #define WX_PCI_LINK_STATUS 0xB2 /**************** Global Registers ****************************/ /* chip control Registers */ #define WX_MIS_PWR 0x10000 #define WX_MIS_RST 0x1000C #define WX_MIS_RST_LAN_RST(_i) BIT((_i) + 1) #define WX_MIS_RST_SW_RST BIT(0) #define WX_MIS_ST 0x10028 #define WX_MIS_ST_MNG_INIT_DN BIT(0) #define WX_MIS_SWSM 0x1002C #define WX_MIS_SWSM_SMBI BIT(0) #define WX_MIS_RST_ST 0x10030 #define WX_MIS_RST_ST_RST_INI_SHIFT 8 #define WX_MIS_RST_ST_RST_INIT (0xFF << WX_MIS_RST_ST_RST_INI_SHIFT) /* FMGR Registers */ #define WX_SPI_CMD 0x10104 #define WX_SPI_CMD_READ_DWORD 0x1 #define WX_SPI_CLK_DIV 0x3 #define WX_SPI_CMD_CMD(_v) (((_v) & 0x7) << 28) #define WX_SPI_CMD_CLK(_v) (((_v) & 0x7) << 25) #define WX_SPI_CMD_ADDR(_v) (((_v) & 0xFFFFFF)) #define WX_SPI_DATA 0x10108 #define WX_SPI_DATA_BYPASS BIT(31) #define WX_SPI_DATA_STATUS(_v) (((_v) & 0xFF) << 16) #define WX_SPI_DATA_OP_DONE BIT(0) #define WX_SPI_STATUS 0x1010C #define WX_SPI_STATUS_OPDONE BIT(0) #define WX_SPI_STATUS_FLASH_BYPASS BIT(31) #define WX_SPI_ILDR_STATUS 0x10120 /* Sensors for PVT(Process Voltage Temperature) */ #define WX_TS_EN 0x10304 #define WX_TS_EN_ENA BIT(0) #define WX_TS_ALARM_THRE 0x1030C #define WX_TS_DALARM_THRE 0x10310 #define WX_TS_INT_EN 0x10314 #define WX_TS_INT_EN_DALARM_INT_EN BIT(1) #define WX_TS_INT_EN_ALARM_INT_EN BIT(0) #define WX_TS_ALARM_ST 0x10318 #define WX_TS_ALARM_ST_DALARM BIT(1) #define WX_TS_ALARM_ST_ALARM BIT(0) /************************* Port Registers ************************************/ /* port cfg Registers */ #define WX_CFG_PORT_CTL 0x14400 #define WX_CFG_PORT_CTL_DRV_LOAD BIT(3) /*********************** Transmit DMA registers **************************/ /* transmit global control */ #define WX_TDM_CTL 0x18000 /* TDM CTL BIT */ #define WX_TDM_CTL_TE BIT(0) /* Transmit Enable */ /***************************** RDB registers *********************************/ /* receive packet buffer */ #define WX_RDB_PB_CTL 0x19000 #define WX_RDB_PB_CTL_RXEN BIT(31) /* Enable Receiver */ #define WX_RDB_PB_CTL_DISABLED BIT(0) /* statistic */ #define WX_RDB_PFCMACDAL 0x19210 #define WX_RDB_PFCMACDAH 0x19214 /******************************* PSR Registers *******************************/ /* psr control */ #define WX_PSR_CTL 0x15000 /* Header split receive */ #define WX_PSR_CTL_SW_EN BIT(18) #define WX_PSR_CTL_RSC_ACK BIT(17) #define WX_PSR_CTL_RSC_DIS BIT(16) #define WX_PSR_CTL_PCSD BIT(13) #define WX_PSR_CTL_IPPCSE BIT(12) #define WX_PSR_CTL_BAM BIT(10) #define WX_PSR_CTL_UPE BIT(9) #define WX_PSR_CTL_MPE BIT(8) #define WX_PSR_CTL_MFE BIT(7) #define WX_PSR_CTL_MO_SHIFT 5 #define WX_PSR_CTL_MO (0x3 << WX_PSR_CTL_MO_SHIFT) #define WX_PSR_CTL_TPE BIT(4) /* mcasst/ucast overflow tbl */ #define WX_PSR_MC_TBL(_i) (0x15200 + ((_i) * 4)) #define WX_PSR_UC_TBL(_i) (0x15400 + ((_i) * 4)) /* Management */ #define WX_PSR_MNG_FLEX_SEL 0x1582C #define WX_PSR_MNG_FLEX_DW_L(_i) (0x15A00 + ((_i) * 16)) #define WX_PSR_MNG_FLEX_DW_H(_i) (0x15A04 + ((_i) * 16)) #define WX_PSR_MNG_FLEX_MSK(_i) (0x15A08 + ((_i) * 16)) #define WX_PSR_LAN_FLEX_SEL 0x15B8C #define WX_PSR_LAN_FLEX_DW_L(_i) (0x15C00 + ((_i) * 16)) #define WX_PSR_LAN_FLEX_DW_H(_i) (0x15C04 + ((_i) * 16)) #define WX_PSR_LAN_FLEX_MSK(_i) (0x15C08 + ((_i) * 16)) /* mac switcher */ #define WX_PSR_MAC_SWC_AD_L 0x16200 #define WX_PSR_MAC_SWC_AD_H 0x16204 #define WX_PSR_MAC_SWC_AD_H_AD(v) (((v) & 0xFFFF)) #define WX_PSR_MAC_SWC_AD_H_ADTYPE(v) (((v) & 0x1) << 30) #define WX_PSR_MAC_SWC_AD_H_AV BIT(31) #define WX_PSR_MAC_SWC_VM_L 0x16208 #define WX_PSR_MAC_SWC_VM_H 0x1620C #define WX_PSR_MAC_SWC_IDX 0x16210 #define WX_CLEAR_VMDQ_ALL 0xFFFFFFFFU /************************************** MNG ********************************/ #define WX_MNG_SWFW_SYNC 0x1E008 #define WX_MNG_SWFW_SYNC_SW_MB BIT(2) #define WX_MNG_SWFW_SYNC_SW_FLASH BIT(3) #define WX_MNG_MBOX 0x1E100 #define WX_MNG_MBOX_CTL 0x1E044 #define WX_MNG_MBOX_CTL_SWRDY BIT(0) #define WX_MNG_MBOX_CTL_FWRDY BIT(2) /************************************* ETH MAC *****************************/ #define WX_MAC_TX_CFG 0x11000 #define WX_MAC_TX_CFG_TE BIT(0) #define WX_MAC_RX_CFG 0x11004 #define WX_MAC_RX_CFG_RE BIT(0) #define WX_MAC_RX_CFG_JE BIT(8) #define WX_MAC_PKT_FLT 0x11008 #define WX_MAC_PKT_FLT_PR BIT(0) /* promiscuous mode */ #define WX_MAC_RX_FLOW_CTRL 0x11090 #define WX_MAC_RX_FLOW_CTRL_RFE BIT(0) /* receive fc enable */ #define WX_MMC_CONTROL 0x11800 #define WX_MMC_CONTROL_RSTONRD BIT(2) /* reset on read */ /********************************* BAR registers ***************************/ /* Interrupt Registers */ #define WX_BME_CTL 0x12020 #define WX_PX_MISC_IC 0x100 #define WX_PX_IMS(_i) (0x140 + (_i) * 4) #define WX_PX_TRANSACTION_PENDING 0x168 /* transmit DMA Registers */ #define WX_PX_TR_CFG(_i) (0x03010 + ((_i) * 0x40)) /* Transmit Config masks */ #define WX_PX_TR_CFG_ENABLE BIT(0) /* Ena specific Tx Queue */ #define WX_PX_TR_CFG_TR_SIZE_SHIFT 1 /* tx desc number per ring */ #define WX_PX_TR_CFG_SWFLSH BIT(26) /* Tx Desc. wr-bk flushing */ #define WX_PX_TR_CFG_WTHRESH_SHIFT 16 /* shift to WTHRESH bits */ #define WX_PX_TR_CFG_THRE_SHIFT 8 /* Receive DMA Registers */ #define WX_PX_RR_CFG(_i) (0x01010 + ((_i) * 0x40)) /* PX_RR_CFG bit definitions */ #define WX_PX_RR_CFG_RR_EN BIT(0) /* Number of 80 microseconds we wait for PCI Express master disable */ #define WX_PCI_MASTER_DISABLE_TIMEOUT 80000 /****************** Manageablility Host Interface defines ********************/ #define WX_HI_MAX_BLOCK_BYTE_LENGTH 256 /* Num of bytes in range */ #define WX_HI_COMMAND_TIMEOUT 1000 /* Process HI command limit */ #define FW_READ_SHADOW_RAM_CMD 0x31 #define FW_READ_SHADOW_RAM_LEN 0x6 #define FW_DEFAULT_CHECKSUM 0xFF /* checksum always 0xFF */ #define FW_NVM_DATA_OFFSET 3 #define FW_MAX_READ_BUFFER_SIZE 244 #define FW_RESET_CMD 0xDF #define FW_RESET_LEN 0x2 #define FW_CEM_HDR_LEN 0x4 #define FW_CEM_CMD_RESERVED 0X0 #define FW_CEM_MAX_RETRIES 3 #define FW_CEM_RESP_STATUS_SUCCESS 0x1 #define WX_SW_REGION_PTR 0x1C /* Host Interface Command Structures */ struct wx_hic_hdr { u8 cmd; u8 buf_len; union { u8 cmd_resv; u8 ret_status; } cmd_or_resp; u8 checksum; }; struct wx_hic_hdr2_req { u8 cmd; u8 buf_lenh; u8 buf_lenl; u8 checksum; }; struct wx_hic_hdr2_rsp { u8 cmd; u8 buf_lenl; u8 buf_lenh_status; /* 7-5: high bits of buf_len, 4-0: status */ u8 checksum; }; union wx_hic_hdr2 { struct wx_hic_hdr2_req req; struct wx_hic_hdr2_rsp rsp; }; /* These need to be dword aligned */ struct wx_hic_read_shadow_ram { union wx_hic_hdr2 hdr; u32 address; u16 length; u16 pad2; u16 data; u16 pad3; }; struct wx_hic_reset { struct wx_hic_hdr hdr; u16 lan_id; u16 reset_type; }; /* Bus parameters */ struct wx_bus_info { u8 func; u16 device; }; struct wx_thermal_sensor_data { s16 temp; s16 alarm_thresh; s16 dalarm_thresh; }; enum wx_mac_type { wx_mac_unknown = 0, wx_mac_sp, wx_mac_em }; struct wx_mac_info { enum wx_mac_type type; bool set_lben; u8 addr[ETH_ALEN]; u8 perm_addr[ETH_ALEN]; s32 mc_filter_type; u32 mcft_size; u32 num_rar_entries; u32 max_tx_queues; u32 max_rx_queues; u16 max_msix_vectors; struct wx_thermal_sensor_data sensor; }; enum wx_eeprom_type { wx_eeprom_uninitialized = 0, wx_eeprom_spi, wx_flash, wx_eeprom_none /* No NVM support */ }; struct wx_eeprom_info { enum wx_eeprom_type type; u32 semaphore_delay; u16 word_size; u16 sw_region_offset; }; struct wx_addr_filter_info { u32 num_mc_addrs; u32 mta_in_use; bool user_set_promisc; }; enum wx_reset_type { WX_LAN_RESET = 0, WX_SW_RESET, WX_GLOBAL_RESET }; struct wx_hw { u8 __iomem *hw_addr; struct pci_dev *pdev; struct wx_bus_info bus; struct wx_mac_info mac; struct wx_eeprom_info eeprom; struct wx_addr_filter_info addr_ctrl; u16 device_id; u16 vendor_id; u16 subsystem_device_id; u16 subsystem_vendor_id; u8 revision_id; u16 oem_ssid; u16 oem_svid; bool adapter_stopped; enum wx_reset_type reset_type; }; #define WX_INTR_ALL (~0ULL) /* register operations */ #define wr32(a, reg, value) writel((value), ((a)->hw_addr + (reg))) #define rd32(a, reg) readl((a)->hw_addr + (reg)) #define rd32a(a, reg, offset) ( \ rd32((a), (reg) + ((offset) << 2))) #define wr32a(a, reg, off, val) \ wr32((a), (reg) + ((off) << 2), (val)) static inline u32 rd32m(struct wx_hw *wxhw, u32 reg, u32 mask) { u32 val; val = rd32(wxhw, reg); return val & mask; } static inline void wr32m(struct wx_hw *wxhw, u32 reg, u32 mask, u32 field) { u32 val; val = rd32(wxhw, reg); val = ((val & ~mask) | (field & mask)); wr32(wxhw, reg, val); } /* On some domestic CPU platforms, sometimes IO is not synchronized with * flushing memory, here use readl() to flush PCI read and write. */ #define WX_WRITE_FLUSH(H) rd32(H, WX_MIS_PWR) #define wx_err(wxhw, fmt, arg...) \ dev_err(&(wxhw)->pdev->dev, fmt, ##arg) #define wx_dbg(wxhw, fmt, arg...) \ dev_dbg(&(wxhw)->pdev->dev, fmt, ##arg) #endif /* _WX_TYPE_H_ */