xref: /dpdk/drivers/net/pfe/pfe_hal.c (revision 7be78d027918dbc846e502780faf94d5acdf5f75)
15253fe37SGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause
2f513f620SSachin Saxena  * Copyright 2018-2019 NXP
35253fe37SGagandeep Singh  */
45253fe37SGagandeep Singh 
5bd063651SFerruh Yigit #include <arpa/inet.h>
6bd063651SFerruh Yigit 
75253fe37SGagandeep Singh #include "pfe_logs.h"
85253fe37SGagandeep Singh #include "pfe_mod.h"
95253fe37SGagandeep Singh 
105253fe37SGagandeep Singh #define PFE_MTU_RESET_MASK	0xC000FFFF
115253fe37SGagandeep Singh 
125253fe37SGagandeep Singh void *cbus_base_addr;
135253fe37SGagandeep Singh void *ddr_base_addr;
145253fe37SGagandeep Singh unsigned long ddr_phys_base_addr;
155253fe37SGagandeep Singh unsigned int ddr_size;
165253fe37SGagandeep Singh static struct pe_info pe[MAX_PE];
175253fe37SGagandeep Singh 
185253fe37SGagandeep Singh /* Initializes the PFE library.
195253fe37SGagandeep Singh  * Must be called before using any of the library functions.
205253fe37SGagandeep Singh  *
215253fe37SGagandeep Singh  * @param[in] cbus_base		CBUS virtual base address (as mapped in
225253fe37SGagandeep Singh  * the host CPU address space)
235253fe37SGagandeep Singh  * @param[in] ddr_base		PFE DDR range virtual base address (as
245253fe37SGagandeep Singh  * mapped in the host CPU address space)
255253fe37SGagandeep Singh  * @param[in] ddr_phys_base	PFE DDR range physical base address (as
265253fe37SGagandeep Singh  * mapped in platform)
275253fe37SGagandeep Singh  * @param[in] size		PFE DDR range size (as defined by the host
285253fe37SGagandeep Singh  * software)
295253fe37SGagandeep Singh  */
305253fe37SGagandeep Singh void
pfe_lib_init(void * cbus_base,void * ddr_base,unsigned long ddr_phys_base,unsigned int size)315253fe37SGagandeep Singh pfe_lib_init(void *cbus_base, void *ddr_base, unsigned long ddr_phys_base,
325253fe37SGagandeep Singh 		  unsigned int size)
335253fe37SGagandeep Singh {
345253fe37SGagandeep Singh 	cbus_base_addr = cbus_base;
355253fe37SGagandeep Singh 	ddr_base_addr = ddr_base;
365253fe37SGagandeep Singh 	ddr_phys_base_addr = ddr_phys_base;
375253fe37SGagandeep Singh 	ddr_size = size;
385253fe37SGagandeep Singh 
395253fe37SGagandeep Singh 	pe[CLASS0_ID].dmem_base_addr = CLASS_DMEM_BASE_ADDR(0);
405253fe37SGagandeep Singh 	pe[CLASS0_ID].pmem_base_addr = CLASS_IMEM_BASE_ADDR(0);
415253fe37SGagandeep Singh 	pe[CLASS0_ID].pmem_size = CLASS_IMEM_SIZE;
425253fe37SGagandeep Singh 	pe[CLASS0_ID].mem_access_wdata = CLASS_MEM_ACCESS_WDATA;
435253fe37SGagandeep Singh 	pe[CLASS0_ID].mem_access_addr = CLASS_MEM_ACCESS_ADDR;
445253fe37SGagandeep Singh 	pe[CLASS0_ID].mem_access_rdata = CLASS_MEM_ACCESS_RDATA;
455253fe37SGagandeep Singh 
465253fe37SGagandeep Singh 	pe[CLASS1_ID].dmem_base_addr = CLASS_DMEM_BASE_ADDR(1);
475253fe37SGagandeep Singh 	pe[CLASS1_ID].pmem_base_addr = CLASS_IMEM_BASE_ADDR(1);
485253fe37SGagandeep Singh 	pe[CLASS1_ID].pmem_size = CLASS_IMEM_SIZE;
495253fe37SGagandeep Singh 	pe[CLASS1_ID].mem_access_wdata = CLASS_MEM_ACCESS_WDATA;
505253fe37SGagandeep Singh 	pe[CLASS1_ID].mem_access_addr = CLASS_MEM_ACCESS_ADDR;
515253fe37SGagandeep Singh 	pe[CLASS1_ID].mem_access_rdata = CLASS_MEM_ACCESS_RDATA;
525253fe37SGagandeep Singh 
535253fe37SGagandeep Singh 	pe[CLASS2_ID].dmem_base_addr = CLASS_DMEM_BASE_ADDR(2);
545253fe37SGagandeep Singh 	pe[CLASS2_ID].pmem_base_addr = CLASS_IMEM_BASE_ADDR(2);
555253fe37SGagandeep Singh 	pe[CLASS2_ID].pmem_size = CLASS_IMEM_SIZE;
565253fe37SGagandeep Singh 	pe[CLASS2_ID].mem_access_wdata = CLASS_MEM_ACCESS_WDATA;
575253fe37SGagandeep Singh 	pe[CLASS2_ID].mem_access_addr = CLASS_MEM_ACCESS_ADDR;
585253fe37SGagandeep Singh 	pe[CLASS2_ID].mem_access_rdata = CLASS_MEM_ACCESS_RDATA;
595253fe37SGagandeep Singh 
605253fe37SGagandeep Singh 	pe[CLASS3_ID].dmem_base_addr = CLASS_DMEM_BASE_ADDR(3);
615253fe37SGagandeep Singh 	pe[CLASS3_ID].pmem_base_addr = CLASS_IMEM_BASE_ADDR(3);
625253fe37SGagandeep Singh 	pe[CLASS3_ID].pmem_size = CLASS_IMEM_SIZE;
635253fe37SGagandeep Singh 	pe[CLASS3_ID].mem_access_wdata = CLASS_MEM_ACCESS_WDATA;
645253fe37SGagandeep Singh 	pe[CLASS3_ID].mem_access_addr = CLASS_MEM_ACCESS_ADDR;
655253fe37SGagandeep Singh 	pe[CLASS3_ID].mem_access_rdata = CLASS_MEM_ACCESS_RDATA;
665253fe37SGagandeep Singh 
675253fe37SGagandeep Singh 	pe[CLASS4_ID].dmem_base_addr = CLASS_DMEM_BASE_ADDR(4);
685253fe37SGagandeep Singh 	pe[CLASS4_ID].pmem_base_addr = CLASS_IMEM_BASE_ADDR(4);
695253fe37SGagandeep Singh 	pe[CLASS4_ID].pmem_size = CLASS_IMEM_SIZE;
705253fe37SGagandeep Singh 	pe[CLASS4_ID].mem_access_wdata = CLASS_MEM_ACCESS_WDATA;
715253fe37SGagandeep Singh 	pe[CLASS4_ID].mem_access_addr = CLASS_MEM_ACCESS_ADDR;
725253fe37SGagandeep Singh 	pe[CLASS4_ID].mem_access_rdata = CLASS_MEM_ACCESS_RDATA;
735253fe37SGagandeep Singh 
745253fe37SGagandeep Singh 	pe[CLASS5_ID].dmem_base_addr = CLASS_DMEM_BASE_ADDR(5);
755253fe37SGagandeep Singh 	pe[CLASS5_ID].pmem_base_addr = CLASS_IMEM_BASE_ADDR(5);
765253fe37SGagandeep Singh 	pe[CLASS5_ID].pmem_size = CLASS_IMEM_SIZE;
775253fe37SGagandeep Singh 	pe[CLASS5_ID].mem_access_wdata = CLASS_MEM_ACCESS_WDATA;
785253fe37SGagandeep Singh 	pe[CLASS5_ID].mem_access_addr = CLASS_MEM_ACCESS_ADDR;
795253fe37SGagandeep Singh 	pe[CLASS5_ID].mem_access_rdata = CLASS_MEM_ACCESS_RDATA;
805253fe37SGagandeep Singh 
815253fe37SGagandeep Singh 	pe[TMU0_ID].dmem_base_addr = TMU_DMEM_BASE_ADDR(0);
825253fe37SGagandeep Singh 	pe[TMU0_ID].pmem_base_addr = TMU_IMEM_BASE_ADDR(0);
835253fe37SGagandeep Singh 	pe[TMU0_ID].pmem_size = TMU_IMEM_SIZE;
845253fe37SGagandeep Singh 	pe[TMU0_ID].mem_access_wdata = TMU_MEM_ACCESS_WDATA;
855253fe37SGagandeep Singh 	pe[TMU0_ID].mem_access_addr = TMU_MEM_ACCESS_ADDR;
865253fe37SGagandeep Singh 	pe[TMU0_ID].mem_access_rdata = TMU_MEM_ACCESS_RDATA;
875253fe37SGagandeep Singh 
885253fe37SGagandeep Singh 	pe[TMU1_ID].dmem_base_addr = TMU_DMEM_BASE_ADDR(1);
895253fe37SGagandeep Singh 	pe[TMU1_ID].pmem_base_addr = TMU_IMEM_BASE_ADDR(1);
905253fe37SGagandeep Singh 	pe[TMU1_ID].pmem_size = TMU_IMEM_SIZE;
915253fe37SGagandeep Singh 	pe[TMU1_ID].mem_access_wdata = TMU_MEM_ACCESS_WDATA;
925253fe37SGagandeep Singh 	pe[TMU1_ID].mem_access_addr = TMU_MEM_ACCESS_ADDR;
935253fe37SGagandeep Singh 	pe[TMU1_ID].mem_access_rdata = TMU_MEM_ACCESS_RDATA;
945253fe37SGagandeep Singh 
955253fe37SGagandeep Singh 	pe[TMU3_ID].dmem_base_addr = TMU_DMEM_BASE_ADDR(3);
965253fe37SGagandeep Singh 	pe[TMU3_ID].pmem_base_addr = TMU_IMEM_BASE_ADDR(3);
975253fe37SGagandeep Singh 	pe[TMU3_ID].pmem_size = TMU_IMEM_SIZE;
985253fe37SGagandeep Singh 	pe[TMU3_ID].mem_access_wdata = TMU_MEM_ACCESS_WDATA;
995253fe37SGagandeep Singh 	pe[TMU3_ID].mem_access_addr = TMU_MEM_ACCESS_ADDR;
1005253fe37SGagandeep Singh 	pe[TMU3_ID].mem_access_rdata = TMU_MEM_ACCESS_RDATA;
1015253fe37SGagandeep Singh 
1025253fe37SGagandeep Singh #if !defined(CONFIG_FSL_PFE_UTIL_DISABLED)
1035253fe37SGagandeep Singh 	pe[UTIL_ID].dmem_base_addr = UTIL_DMEM_BASE_ADDR;
1045253fe37SGagandeep Singh 	pe[UTIL_ID].mem_access_wdata = UTIL_MEM_ACCESS_WDATA;
1055253fe37SGagandeep Singh 	pe[UTIL_ID].mem_access_addr = UTIL_MEM_ACCESS_ADDR;
1065253fe37SGagandeep Singh 	pe[UTIL_ID].mem_access_rdata = UTIL_MEM_ACCESS_RDATA;
1075253fe37SGagandeep Singh #endif
1085253fe37SGagandeep Singh }
1095253fe37SGagandeep Singh 
1105253fe37SGagandeep Singh /**************************** MTIP GEMAC ***************************/
1115253fe37SGagandeep Singh 
1125253fe37SGagandeep Singh /* Enable Rx Checksum Engine. With this enabled, Frame with bad IP,
1135253fe37SGagandeep Singh  *   TCP or UDP checksums are discarded
1145253fe37SGagandeep Singh  *
1155253fe37SGagandeep Singh  * @param[in] base	GEMAC base address.
1165253fe37SGagandeep Singh  */
1175253fe37SGagandeep Singh void
gemac_enable_rx_checksum_offload(__rte_unused void * base)1185253fe37SGagandeep Singh gemac_enable_rx_checksum_offload(__rte_unused void *base)
1195253fe37SGagandeep Singh {
1205253fe37SGagandeep Singh 	/*Do not find configuration to do this */
1215253fe37SGagandeep Singh }
1225253fe37SGagandeep Singh 
1235253fe37SGagandeep Singh /* Disable Rx Checksum Engine.
1245253fe37SGagandeep Singh  *
1255253fe37SGagandeep Singh  * @param[in] base	GEMAC base address.
1265253fe37SGagandeep Singh  */
1275253fe37SGagandeep Singh void
gemac_disable_rx_checksum_offload(__rte_unused void * base)1285253fe37SGagandeep Singh gemac_disable_rx_checksum_offload(__rte_unused void *base)
1295253fe37SGagandeep Singh {
1305253fe37SGagandeep Singh 	/*Do not find configuration to do this */
1315253fe37SGagandeep Singh }
1325253fe37SGagandeep Singh 
1335253fe37SGagandeep Singh /* GEMAC set speed.
1345253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
1355253fe37SGagandeep Singh  * @param[in] speed	GEMAC speed (10, 100 or 1000 Mbps)
1365253fe37SGagandeep Singh  */
1375253fe37SGagandeep Singh void
gemac_set_speed(void * base,enum mac_speed gem_speed)1385253fe37SGagandeep Singh gemac_set_speed(void *base, enum mac_speed gem_speed)
1395253fe37SGagandeep Singh {
1405253fe37SGagandeep Singh 	u32 ecr = readl(base + EMAC_ECNTRL_REG) & ~EMAC_ECNTRL_SPEED;
1415253fe37SGagandeep Singh 	u32 rcr = readl(base + EMAC_RCNTRL_REG) & ~EMAC_RCNTRL_RMII_10T;
1425253fe37SGagandeep Singh 
1435253fe37SGagandeep Singh 	switch (gem_speed) {
1445253fe37SGagandeep Singh 	case SPEED_10M:
1455253fe37SGagandeep Singh 			rcr |= EMAC_RCNTRL_RMII_10T;
1465253fe37SGagandeep Singh 			break;
1475253fe37SGagandeep Singh 
1485253fe37SGagandeep Singh 	case SPEED_1000M:
1495253fe37SGagandeep Singh 			ecr |= EMAC_ECNTRL_SPEED;
1505253fe37SGagandeep Singh 			break;
1515253fe37SGagandeep Singh 
1525253fe37SGagandeep Singh 	case SPEED_100M:
1535253fe37SGagandeep Singh 	default:
1545253fe37SGagandeep Singh 			/*It is in 100M mode */
1555253fe37SGagandeep Singh 			break;
1565253fe37SGagandeep Singh 	}
1575253fe37SGagandeep Singh 	writel(ecr, (base + EMAC_ECNTRL_REG));
1585253fe37SGagandeep Singh 	writel(rcr, (base + EMAC_RCNTRL_REG));
1595253fe37SGagandeep Singh }
1605253fe37SGagandeep Singh 
1615253fe37SGagandeep Singh /* GEMAC set duplex.
1625253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
1635253fe37SGagandeep Singh  * @param[in] duplex	GEMAC duplex mode (Full, Half)
1645253fe37SGagandeep Singh  */
1655253fe37SGagandeep Singh void
gemac_set_duplex(void * base,int duplex)1665253fe37SGagandeep Singh gemac_set_duplex(void *base, int duplex)
1675253fe37SGagandeep Singh {
1685253fe37SGagandeep Singh 	if (duplex == DUPLEX_HALF) {
1695253fe37SGagandeep Singh 		writel(readl(base + EMAC_TCNTRL_REG) & ~EMAC_TCNTRL_FDEN, base
1705253fe37SGagandeep Singh 			+ EMAC_TCNTRL_REG);
1715253fe37SGagandeep Singh 		writel(readl(base + EMAC_RCNTRL_REG) | EMAC_RCNTRL_DRT, (base
1725253fe37SGagandeep Singh 			+ EMAC_RCNTRL_REG));
1735253fe37SGagandeep Singh 	} else {
1745253fe37SGagandeep Singh 		writel(readl(base + EMAC_TCNTRL_REG) | EMAC_TCNTRL_FDEN, base
1755253fe37SGagandeep Singh 			+ EMAC_TCNTRL_REG);
1765253fe37SGagandeep Singh 		writel(readl(base + EMAC_RCNTRL_REG) & ~EMAC_RCNTRL_DRT, (base
1775253fe37SGagandeep Singh 			+ EMAC_RCNTRL_REG));
1785253fe37SGagandeep Singh 	}
1795253fe37SGagandeep Singh }
1805253fe37SGagandeep Singh 
1815253fe37SGagandeep Singh /* GEMAC set mode.
1825253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
1835253fe37SGagandeep Singh  * @param[in] mode	GEMAC operation mode (MII, RMII, RGMII, SGMII)
1845253fe37SGagandeep Singh  */
1855253fe37SGagandeep Singh void
gemac_set_mode(void * base,__rte_unused int mode)1865253fe37SGagandeep Singh gemac_set_mode(void *base, __rte_unused int mode)
1875253fe37SGagandeep Singh {
1885253fe37SGagandeep Singh 	u32 val = readl(base + EMAC_RCNTRL_REG);
1895253fe37SGagandeep Singh 
190*7be78d02SJosh Soref 	/* Remove loopback */
1915253fe37SGagandeep Singh 	val &= ~EMAC_RCNTRL_LOOP;
1925253fe37SGagandeep Singh 
1935253fe37SGagandeep Singh 	/*Enable flow control and MII mode*/
1945253fe37SGagandeep Singh 	val |= (EMAC_RCNTRL_FCE | EMAC_RCNTRL_MII_MODE | EMAC_RCNTRL_CRC_FWD);
1955253fe37SGagandeep Singh 
1965253fe37SGagandeep Singh 	writel(val, base + EMAC_RCNTRL_REG);
1975253fe37SGagandeep Singh }
1985253fe37SGagandeep Singh 
1995253fe37SGagandeep Singh /* GEMAC enable function.
2005253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
2015253fe37SGagandeep Singh  */
2025253fe37SGagandeep Singh void
gemac_enable(void * base)2035253fe37SGagandeep Singh gemac_enable(void *base)
2045253fe37SGagandeep Singh {
2055253fe37SGagandeep Singh 	writel(readl(base + EMAC_ECNTRL_REG) | EMAC_ECNTRL_ETHER_EN, base +
2065253fe37SGagandeep Singh 		EMAC_ECNTRL_REG);
2075253fe37SGagandeep Singh }
2085253fe37SGagandeep Singh 
2095253fe37SGagandeep Singh /* GEMAC disable function.
2105253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
2115253fe37SGagandeep Singh  */
2125253fe37SGagandeep Singh void
gemac_disable(void * base)2135253fe37SGagandeep Singh gemac_disable(void *base)
2145253fe37SGagandeep Singh {
2155253fe37SGagandeep Singh 	writel(readl(base + EMAC_ECNTRL_REG) & ~EMAC_ECNTRL_ETHER_EN, base +
2165253fe37SGagandeep Singh 		EMAC_ECNTRL_REG);
2175253fe37SGagandeep Singh }
2185253fe37SGagandeep Singh 
2195253fe37SGagandeep Singh /* GEMAC TX disable function.
2205253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
2215253fe37SGagandeep Singh  */
2225253fe37SGagandeep Singh void
gemac_tx_disable(void * base)2235253fe37SGagandeep Singh gemac_tx_disable(void *base)
2245253fe37SGagandeep Singh {
2255253fe37SGagandeep Singh 	writel(readl(base + EMAC_TCNTRL_REG) | EMAC_TCNTRL_GTS, base +
2265253fe37SGagandeep Singh 		EMAC_TCNTRL_REG);
2275253fe37SGagandeep Singh }
2285253fe37SGagandeep Singh 
2295253fe37SGagandeep Singh void
gemac_tx_enable(void * base)2305253fe37SGagandeep Singh gemac_tx_enable(void *base)
2315253fe37SGagandeep Singh {
2325253fe37SGagandeep Singh 	writel(readl(base + EMAC_TCNTRL_REG) & ~EMAC_TCNTRL_GTS, base +
2335253fe37SGagandeep Singh 			EMAC_TCNTRL_REG);
2345253fe37SGagandeep Singh }
2355253fe37SGagandeep Singh 
2365253fe37SGagandeep Singh /* Sets the hash register of the MAC.
2375253fe37SGagandeep Singh  * This register is used for matching unicast and multicast frames.
2385253fe37SGagandeep Singh  *
2395253fe37SGagandeep Singh  * @param[in] base	GEMAC base address.
2405253fe37SGagandeep Singh  * @param[in] hash	64-bit hash to be configured.
2415253fe37SGagandeep Singh  */
2425253fe37SGagandeep Singh void
gemac_set_hash(void * base,struct pfe_mac_addr * hash)2435253fe37SGagandeep Singh gemac_set_hash(void *base, struct pfe_mac_addr *hash)
2445253fe37SGagandeep Singh {
2455253fe37SGagandeep Singh 	writel(hash->bottom,  base + EMAC_GALR);
2465253fe37SGagandeep Singh 	writel(hash->top, base + EMAC_GAUR);
2475253fe37SGagandeep Singh }
2485253fe37SGagandeep Singh 
2495253fe37SGagandeep Singh void
gemac_set_laddrN(void * base,struct pfe_mac_addr * address,unsigned int entry_index)2505253fe37SGagandeep Singh gemac_set_laddrN(void *base, struct pfe_mac_addr *address,
2515253fe37SGagandeep Singh 		      unsigned int entry_index)
2525253fe37SGagandeep Singh {
2535253fe37SGagandeep Singh 	if (entry_index < 1 || entry_index > EMAC_SPEC_ADDR_MAX)
2545253fe37SGagandeep Singh 		return;
2555253fe37SGagandeep Singh 
2565253fe37SGagandeep Singh 	entry_index = entry_index - 1;
2575253fe37SGagandeep Singh 	if (entry_index < 1) {
2585253fe37SGagandeep Singh 		writel(htonl(address->bottom),  base + EMAC_PHY_ADDR_LOW);
2595253fe37SGagandeep Singh 		writel((htonl(address->top) | 0x8808), base +
2605253fe37SGagandeep Singh 			EMAC_PHY_ADDR_HIGH);
2615253fe37SGagandeep Singh 	} else {
2625253fe37SGagandeep Singh 		writel(htonl(address->bottom),  base + ((entry_index - 1) * 8)
2635253fe37SGagandeep Singh 			+ EMAC_SMAC_0_0);
2645253fe37SGagandeep Singh 		writel((htonl(address->top) | 0x8808), base + ((entry_index -
2655253fe37SGagandeep Singh 			1) * 8) + EMAC_SMAC_0_1);
2665253fe37SGagandeep Singh 	}
2675253fe37SGagandeep Singh }
2685253fe37SGagandeep Singh 
2695253fe37SGagandeep Singh void
gemac_clear_laddrN(void * base,unsigned int entry_index)2705253fe37SGagandeep Singh gemac_clear_laddrN(void *base, unsigned int entry_index)
2715253fe37SGagandeep Singh {
2725253fe37SGagandeep Singh 	if (entry_index < 1 || entry_index > EMAC_SPEC_ADDR_MAX)
2735253fe37SGagandeep Singh 		return;
2745253fe37SGagandeep Singh 
2755253fe37SGagandeep Singh 	entry_index = entry_index - 1;
2765253fe37SGagandeep Singh 	if (entry_index < 1) {
2775253fe37SGagandeep Singh 		writel(0, base + EMAC_PHY_ADDR_LOW);
2785253fe37SGagandeep Singh 		writel(0, base + EMAC_PHY_ADDR_HIGH);
2795253fe37SGagandeep Singh 	} else {
2805253fe37SGagandeep Singh 		writel(0,  base + ((entry_index - 1) * 8) + EMAC_SMAC_0_0);
2815253fe37SGagandeep Singh 		writel(0, base + ((entry_index - 1) * 8) + EMAC_SMAC_0_1);
2825253fe37SGagandeep Singh 	}
2835253fe37SGagandeep Singh }
2845253fe37SGagandeep Singh 
2855253fe37SGagandeep Singh /* Set the loopback mode of the MAC.  This can be either no loopback for
2865253fe37SGagandeep Singh  * normal operation, local loopback through MAC internal loopback module or PHY
2875253fe37SGagandeep Singh  *   loopback for external loopback through a PHY.  This asserts the external
2885253fe37SGagandeep Singh  * loop pin.
2895253fe37SGagandeep Singh  *
2905253fe37SGagandeep Singh  * @param[in] base	GEMAC base address.
2915253fe37SGagandeep Singh  * @param[in] gem_loop	Loopback mode to be enabled. LB_LOCAL - MAC
2925253fe37SGagandeep Singh  * Loopback,
2935253fe37SGagandeep Singh  *			LB_EXT - PHY Loopback.
2945253fe37SGagandeep Singh  */
2955253fe37SGagandeep Singh void
gemac_set_loop(void * base,__rte_unused enum mac_loop gem_loop)2965253fe37SGagandeep Singh gemac_set_loop(void *base, __rte_unused enum mac_loop gem_loop)
2975253fe37SGagandeep Singh {
2985253fe37SGagandeep Singh 	pr_info("%s()\n", __func__);
2995253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) | EMAC_RCNTRL_LOOP, (base +
3005253fe37SGagandeep Singh 		EMAC_RCNTRL_REG));
3015253fe37SGagandeep Singh }
3025253fe37SGagandeep Singh 
3035253fe37SGagandeep Singh /* GEMAC allow frames
3045253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
3055253fe37SGagandeep Singh  */
3065253fe37SGagandeep Singh void
gemac_enable_copy_all(void * base)3075253fe37SGagandeep Singh gemac_enable_copy_all(void *base)
3085253fe37SGagandeep Singh {
3095253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) | EMAC_RCNTRL_PROM, (base +
3105253fe37SGagandeep Singh 		EMAC_RCNTRL_REG));
3115253fe37SGagandeep Singh }
3125253fe37SGagandeep Singh 
3135253fe37SGagandeep Singh /* GEMAC do not allow frames
3145253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
3155253fe37SGagandeep Singh  */
3165253fe37SGagandeep Singh void
gemac_disable_copy_all(void * base)3175253fe37SGagandeep Singh gemac_disable_copy_all(void *base)
3185253fe37SGagandeep Singh {
3195253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) & ~EMAC_RCNTRL_PROM, (base +
3205253fe37SGagandeep Singh 		EMAC_RCNTRL_REG));
3215253fe37SGagandeep Singh }
3225253fe37SGagandeep Singh 
3235253fe37SGagandeep Singh /* GEMAC allow broadcast function.
3245253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
3255253fe37SGagandeep Singh  */
3265253fe37SGagandeep Singh void
gemac_allow_broadcast(void * base)3275253fe37SGagandeep Singh gemac_allow_broadcast(void *base)
3285253fe37SGagandeep Singh {
3295253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) & ~EMAC_RCNTRL_BC_REJ, base +
3305253fe37SGagandeep Singh 		EMAC_RCNTRL_REG);
3315253fe37SGagandeep Singh }
3325253fe37SGagandeep Singh 
3335253fe37SGagandeep Singh /* GEMAC no broadcast function.
3345253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
3355253fe37SGagandeep Singh  */
3365253fe37SGagandeep Singh void
gemac_no_broadcast(void * base)3375253fe37SGagandeep Singh gemac_no_broadcast(void *base)
3385253fe37SGagandeep Singh {
3395253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) | EMAC_RCNTRL_BC_REJ, base +
3405253fe37SGagandeep Singh 		EMAC_RCNTRL_REG);
3415253fe37SGagandeep Singh }
3425253fe37SGagandeep Singh 
3435253fe37SGagandeep Singh /* GEMAC enable 1536 rx function.
3445253fe37SGagandeep Singh  * @param[in]	base	GEMAC base address
3455253fe37SGagandeep Singh  */
3465253fe37SGagandeep Singh void
gemac_enable_1536_rx(void * base)3475253fe37SGagandeep Singh gemac_enable_1536_rx(void *base)
3485253fe37SGagandeep Singh {
3495253fe37SGagandeep Singh 	/* Set 1536 as Maximum frame length */
3505253fe37SGagandeep Singh 	writel((readl(base + EMAC_RCNTRL_REG) & PFE_MTU_RESET_MASK)
3515253fe37SGagandeep Singh 			| (1536 << 16),
3525253fe37SGagandeep Singh 			base + EMAC_RCNTRL_REG);
3535253fe37SGagandeep Singh }
3545253fe37SGagandeep Singh 
3555253fe37SGagandeep Singh /* GEMAC set Max rx function.
3565253fe37SGagandeep Singh  * @param[in]	base	GEMAC base address
3575253fe37SGagandeep Singh  */
3585253fe37SGagandeep Singh int
gemac_set_rx(void * base,int mtu)3595253fe37SGagandeep Singh gemac_set_rx(void *base, int mtu)
3605253fe37SGagandeep Singh {
3615253fe37SGagandeep Singh 	if (mtu < HIF_RX_PKT_MIN_SIZE || mtu > JUMBO_FRAME_SIZE) {
3625253fe37SGagandeep Singh 		PFE_PMD_ERR("Invalid or not support MTU size");
3635253fe37SGagandeep Singh 		return -1;
3645253fe37SGagandeep Singh 	}
3655253fe37SGagandeep Singh 
3665253fe37SGagandeep Singh 	if (pfe_svr == SVR_LS1012A_REV1 &&
3675253fe37SGagandeep Singh 	    mtu > (MAX_MTU_ON_REV1 + PFE_ETH_OVERHEAD)) {
3685253fe37SGagandeep Singh 		PFE_PMD_ERR("Max supported MTU on Rev1 is %d", MAX_MTU_ON_REV1);
3695253fe37SGagandeep Singh 		return -1;
3705253fe37SGagandeep Singh 	}
3715253fe37SGagandeep Singh 
3725253fe37SGagandeep Singh 	writel((readl(base + EMAC_RCNTRL_REG) & PFE_MTU_RESET_MASK)
3735253fe37SGagandeep Singh 			| (mtu << 16),
3745253fe37SGagandeep Singh 			base + EMAC_RCNTRL_REG);
3755253fe37SGagandeep Singh 	return 0;
3765253fe37SGagandeep Singh }
3775253fe37SGagandeep Singh 
3785253fe37SGagandeep Singh /* GEMAC enable jumbo function.
3795253fe37SGagandeep Singh  * @param[in]	base	GEMAC base address
3805253fe37SGagandeep Singh  */
3815253fe37SGagandeep Singh void
gemac_enable_rx_jmb(void * base)3825253fe37SGagandeep Singh gemac_enable_rx_jmb(void *base)
3835253fe37SGagandeep Singh {
3845253fe37SGagandeep Singh 	if (pfe_svr == SVR_LS1012A_REV1) {
3855253fe37SGagandeep Singh 		PFE_PMD_ERR("Jumbo not supported on Rev1");
3865253fe37SGagandeep Singh 		return;
3875253fe37SGagandeep Singh 	}
3885253fe37SGagandeep Singh 
3895253fe37SGagandeep Singh 	writel((readl(base + EMAC_RCNTRL_REG) & PFE_MTU_RESET_MASK) |
3905253fe37SGagandeep Singh 			(JUMBO_FRAME_SIZE << 16), base + EMAC_RCNTRL_REG);
3915253fe37SGagandeep Singh }
3925253fe37SGagandeep Singh 
3935253fe37SGagandeep Singh /* GEMAC enable stacked vlan function.
3945253fe37SGagandeep Singh  * @param[in]	base	GEMAC base address
3955253fe37SGagandeep Singh  */
3965253fe37SGagandeep Singh void
gemac_enable_stacked_vlan(__rte_unused void * base)3975253fe37SGagandeep Singh gemac_enable_stacked_vlan(__rte_unused void *base)
3985253fe37SGagandeep Singh {
3995253fe37SGagandeep Singh 	/* MTIP doesn't support stacked vlan */
4005253fe37SGagandeep Singh }
4015253fe37SGagandeep Singh 
4025253fe37SGagandeep Singh /* GEMAC enable pause rx function.
4035253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
4045253fe37SGagandeep Singh  */
4055253fe37SGagandeep Singh void
gemac_enable_pause_rx(void * base)4065253fe37SGagandeep Singh gemac_enable_pause_rx(void *base)
4075253fe37SGagandeep Singh {
4085253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) | EMAC_RCNTRL_FCE,
4095253fe37SGagandeep Singh 	       base + EMAC_RCNTRL_REG);
4105253fe37SGagandeep Singh }
4115253fe37SGagandeep Singh 
4125253fe37SGagandeep Singh /* GEMAC disable pause rx function.
4135253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
4145253fe37SGagandeep Singh  */
4155253fe37SGagandeep Singh void
gemac_disable_pause_rx(void * base)4165253fe37SGagandeep Singh gemac_disable_pause_rx(void *base)
4175253fe37SGagandeep Singh {
4185253fe37SGagandeep Singh 	writel(readl(base + EMAC_RCNTRL_REG) & ~EMAC_RCNTRL_FCE,
4195253fe37SGagandeep Singh 	       base + EMAC_RCNTRL_REG);
4205253fe37SGagandeep Singh }
4215253fe37SGagandeep Singh 
4225253fe37SGagandeep Singh /* GEMAC enable pause tx function.
4235253fe37SGagandeep Singh  * @param[in] base GEMAC base address
4245253fe37SGagandeep Singh  */
4255253fe37SGagandeep Singh void
gemac_enable_pause_tx(void * base)4265253fe37SGagandeep Singh gemac_enable_pause_tx(void *base)
4275253fe37SGagandeep Singh {
4285253fe37SGagandeep Singh 	writel(EMAC_RX_SECTION_EMPTY_V, base + EMAC_RX_SECTION_EMPTY);
4295253fe37SGagandeep Singh }
4305253fe37SGagandeep Singh 
4315253fe37SGagandeep Singh /* GEMAC disable pause tx function.
4325253fe37SGagandeep Singh  * @param[in] base GEMAC base address
4335253fe37SGagandeep Singh  */
4345253fe37SGagandeep Singh void
gemac_disable_pause_tx(void * base)4355253fe37SGagandeep Singh gemac_disable_pause_tx(void *base)
4365253fe37SGagandeep Singh {
4375253fe37SGagandeep Singh 	writel(0x0, base + EMAC_RX_SECTION_EMPTY);
4385253fe37SGagandeep Singh }
4395253fe37SGagandeep Singh 
4405253fe37SGagandeep Singh /* GEMAC wol configuration
4415253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
4425253fe37SGagandeep Singh  * @param[in] wol_conf	WoL register configuration
4435253fe37SGagandeep Singh  */
4445253fe37SGagandeep Singh void
gemac_set_wol(void * base,u32 wol_conf)4455253fe37SGagandeep Singh gemac_set_wol(void *base, u32 wol_conf)
4465253fe37SGagandeep Singh {
4475253fe37SGagandeep Singh 	u32  val = readl(base + EMAC_ECNTRL_REG);
4485253fe37SGagandeep Singh 
4495253fe37SGagandeep Singh 	if (wol_conf)
4505253fe37SGagandeep Singh 		val |= (EMAC_ECNTRL_MAGIC_ENA | EMAC_ECNTRL_SLEEP);
4515253fe37SGagandeep Singh 	else
4525253fe37SGagandeep Singh 		val &= ~(EMAC_ECNTRL_MAGIC_ENA | EMAC_ECNTRL_SLEEP);
4535253fe37SGagandeep Singh 	writel(val, base + EMAC_ECNTRL_REG);
4545253fe37SGagandeep Singh }
4555253fe37SGagandeep Singh 
4565253fe37SGagandeep Singh /* Sets Gemac bus width to 64bit
4575253fe37SGagandeep Singh  * @param[in] base       GEMAC base address
4585253fe37SGagandeep Singh  * @param[in] width     gemac bus width to be set possible values are 32/64/128
4595253fe37SGagandeep Singh  */
4605253fe37SGagandeep Singh void
gemac_set_bus_width(__rte_unused void * base,__rte_unused int width)4615253fe37SGagandeep Singh gemac_set_bus_width(__rte_unused void *base, __rte_unused int width)
4625253fe37SGagandeep Singh {
4635253fe37SGagandeep Singh }
4645253fe37SGagandeep Singh 
4655253fe37SGagandeep Singh /* Sets Gemac configuration.
4665253fe37SGagandeep Singh  * @param[in] base	GEMAC base address
4675253fe37SGagandeep Singh  * @param[in] cfg	GEMAC configuration
4685253fe37SGagandeep Singh  */
4695253fe37SGagandeep Singh void
gemac_set_config(void * base,struct gemac_cfg * cfg)4705253fe37SGagandeep Singh gemac_set_config(void *base, struct gemac_cfg *cfg)
4715253fe37SGagandeep Singh {
4725253fe37SGagandeep Singh 	/*GEMAC config taken from VLSI */
4735253fe37SGagandeep Singh 	writel(0x00000004, base + EMAC_TFWR_STR_FWD);
4745253fe37SGagandeep Singh 	writel(0x00000005, base + EMAC_RX_SECTION_FULL);
4755253fe37SGagandeep Singh 
4765253fe37SGagandeep Singh 	if (pfe_svr == SVR_LS1012A_REV1)
4775253fe37SGagandeep Singh 		writel(0x00000768, base + EMAC_TRUNC_FL);
4785253fe37SGagandeep Singh 	else
4795253fe37SGagandeep Singh 		writel(0x00003fff, base + EMAC_TRUNC_FL);
4805253fe37SGagandeep Singh 
4815253fe37SGagandeep Singh 	writel(0x00000030, base + EMAC_TX_SECTION_EMPTY);
4825253fe37SGagandeep Singh 	writel(0x00000000, base + EMAC_MIB_CTRL_STS_REG);
4835253fe37SGagandeep Singh 
4845253fe37SGagandeep Singh 	gemac_set_mode(base, cfg->mode);
4855253fe37SGagandeep Singh 
4865253fe37SGagandeep Singh 	gemac_set_speed(base, cfg->speed);
4875253fe37SGagandeep Singh 
4885253fe37SGagandeep Singh 	gemac_set_duplex(base, cfg->duplex);
4895253fe37SGagandeep Singh }
4905253fe37SGagandeep Singh 
4915253fe37SGagandeep Singh /**************************** GPI ***************************/
4925253fe37SGagandeep Singh 
4935253fe37SGagandeep Singh /* Initializes a GPI block.
4945253fe37SGagandeep Singh  * @param[in] base	GPI base address
4955253fe37SGagandeep Singh  * @param[in] cfg	GPI configuration
4965253fe37SGagandeep Singh  */
4975253fe37SGagandeep Singh void
gpi_init(void * base,struct gpi_cfg * cfg)4985253fe37SGagandeep Singh gpi_init(void *base, struct gpi_cfg *cfg)
4995253fe37SGagandeep Singh {
5005253fe37SGagandeep Singh 	gpi_reset(base);
5015253fe37SGagandeep Singh 
5025253fe37SGagandeep Singh 	gpi_disable(base);
5035253fe37SGagandeep Singh 
5045253fe37SGagandeep Singh 	gpi_set_config(base, cfg);
5055253fe37SGagandeep Singh }
5065253fe37SGagandeep Singh 
5075253fe37SGagandeep Singh /* Resets a GPI block.
5085253fe37SGagandeep Singh  * @param[in] base	GPI base address
5095253fe37SGagandeep Singh  */
5105253fe37SGagandeep Singh void
gpi_reset(void * base)5115253fe37SGagandeep Singh gpi_reset(void *base)
5125253fe37SGagandeep Singh {
5135253fe37SGagandeep Singh 	writel(CORE_SW_RESET, base + GPI_CTRL);
5145253fe37SGagandeep Singh }
5155253fe37SGagandeep Singh 
5165253fe37SGagandeep Singh /* Enables a GPI block.
5175253fe37SGagandeep Singh  * @param[in] base	GPI base address
5185253fe37SGagandeep Singh  */
5195253fe37SGagandeep Singh void
gpi_enable(void * base)5205253fe37SGagandeep Singh gpi_enable(void *base)
5215253fe37SGagandeep Singh {
5225253fe37SGagandeep Singh 	writel(CORE_ENABLE, base + GPI_CTRL);
5235253fe37SGagandeep Singh }
5245253fe37SGagandeep Singh 
5255253fe37SGagandeep Singh /* Disables a GPI block.
5265253fe37SGagandeep Singh  * @param[in] base	GPI base address
5275253fe37SGagandeep Singh  */
5285253fe37SGagandeep Singh void
gpi_disable(void * base)5295253fe37SGagandeep Singh gpi_disable(void *base)
5305253fe37SGagandeep Singh {
5315253fe37SGagandeep Singh 	writel(CORE_DISABLE, base + GPI_CTRL);
5325253fe37SGagandeep Singh }
5335253fe37SGagandeep Singh 
5345253fe37SGagandeep Singh /* Sets the configuration of a GPI block.
5355253fe37SGagandeep Singh  * @param[in] base	GPI base address
5365253fe37SGagandeep Singh  * @param[in] cfg	GPI configuration
5375253fe37SGagandeep Singh  */
5385253fe37SGagandeep Singh void
gpi_set_config(void * base,struct gpi_cfg * cfg)5395253fe37SGagandeep Singh gpi_set_config(void *base, struct gpi_cfg *cfg)
5405253fe37SGagandeep Singh {
5415253fe37SGagandeep Singh 	writel(CBUS_VIRT_TO_PFE(BMU1_BASE_ADDR + BMU_ALLOC_CTRL),	base
5425253fe37SGagandeep Singh 		+ GPI_LMEM_ALLOC_ADDR);
5435253fe37SGagandeep Singh 	writel(CBUS_VIRT_TO_PFE(BMU1_BASE_ADDR + BMU_FREE_CTRL),	base
5445253fe37SGagandeep Singh 		+ GPI_LMEM_FREE_ADDR);
5455253fe37SGagandeep Singh 	writel(CBUS_VIRT_TO_PFE(BMU2_BASE_ADDR + BMU_ALLOC_CTRL),	base
5465253fe37SGagandeep Singh 		+ GPI_DDR_ALLOC_ADDR);
5475253fe37SGagandeep Singh 	writel(CBUS_VIRT_TO_PFE(BMU2_BASE_ADDR + BMU_FREE_CTRL),	base
5485253fe37SGagandeep Singh 		+ GPI_DDR_FREE_ADDR);
5495253fe37SGagandeep Singh 	writel(CBUS_VIRT_TO_PFE(CLASS_INQ_PKTPTR), base + GPI_CLASS_ADDR);
5505253fe37SGagandeep Singh 	writel(DDR_HDR_SIZE, base + GPI_DDR_DATA_OFFSET);
5515253fe37SGagandeep Singh 	writel(LMEM_HDR_SIZE, base + GPI_LMEM_DATA_OFFSET);
5525253fe37SGagandeep Singh 	writel(0, base + GPI_LMEM_SEC_BUF_DATA_OFFSET);
5535253fe37SGagandeep Singh 	writel(0, base + GPI_DDR_SEC_BUF_DATA_OFFSET);
5545253fe37SGagandeep Singh 	writel((DDR_HDR_SIZE << 16) |	LMEM_HDR_SIZE,	base + GPI_HDR_SIZE);
5555253fe37SGagandeep Singh 	writel((DDR_BUF_SIZE << 16) |	LMEM_BUF_SIZE,	base + GPI_BUF_SIZE);
5565253fe37SGagandeep Singh 
5575253fe37SGagandeep Singh 	writel(((cfg->lmem_rtry_cnt << 16) | (GPI_DDR_BUF_EN << 1) |
5585253fe37SGagandeep Singh 		GPI_LMEM_BUF_EN), base + GPI_RX_CONFIG);
5595253fe37SGagandeep Singh 	writel(cfg->tmlf_txthres, base + GPI_TMLF_TX);
5605253fe37SGagandeep Singh 	writel(cfg->aseq_len,	base + GPI_DTX_ASEQ);
5615253fe37SGagandeep Singh 	writel(1, base + GPI_TOE_CHKSUM_EN);
5625253fe37SGagandeep Singh 
5635253fe37SGagandeep Singh 	if (cfg->mtip_pause_reg) {
5645253fe37SGagandeep Singh 		writel(cfg->mtip_pause_reg, base + GPI_CSR_MTIP_PAUSE_REG);
5655253fe37SGagandeep Singh 		writel(EGPI_PAUSE_TIME, base + GPI_TX_PAUSE_TIME);
5665253fe37SGagandeep Singh 	}
5675253fe37SGagandeep Singh }
5685253fe37SGagandeep Singh 
5695253fe37SGagandeep Singh /**************************** HIF ***************************/
5705253fe37SGagandeep Singh /* Initializes HIF copy block.
5715253fe37SGagandeep Singh  *
5725253fe37SGagandeep Singh  */
5735253fe37SGagandeep Singh void
hif_init(void)5745253fe37SGagandeep Singh hif_init(void)
5755253fe37SGagandeep Singh {
5765253fe37SGagandeep Singh 	/*Initialize HIF registers*/
5775253fe37SGagandeep Singh 	writel((HIF_RX_POLL_CTRL_CYCLE << 16) | HIF_TX_POLL_CTRL_CYCLE,
5785253fe37SGagandeep Singh 	       HIF_POLL_CTRL);
5795253fe37SGagandeep Singh }
5805253fe37SGagandeep Singh 
5815253fe37SGagandeep Singh /* Enable hif tx DMA and interrupt
5825253fe37SGagandeep Singh  *
5835253fe37SGagandeep Singh  */
5845253fe37SGagandeep Singh void
hif_tx_enable(void)5855253fe37SGagandeep Singh hif_tx_enable(void)
5865253fe37SGagandeep Singh {
5875253fe37SGagandeep Singh 	writel(HIF_CTRL_DMA_EN, HIF_TX_CTRL);
5885253fe37SGagandeep Singh 	writel((readl(HIF_INT_ENABLE) | HIF_INT_EN | HIF_TXPKT_INT_EN),
5895253fe37SGagandeep Singh 	       HIF_INT_ENABLE);
5905253fe37SGagandeep Singh }
5915253fe37SGagandeep Singh 
5925253fe37SGagandeep Singh /* Disable hif tx DMA and interrupt
5935253fe37SGagandeep Singh  *
5945253fe37SGagandeep Singh  */
5955253fe37SGagandeep Singh void
hif_tx_disable(void)5965253fe37SGagandeep Singh hif_tx_disable(void)
5975253fe37SGagandeep Singh {
5985253fe37SGagandeep Singh 	u32	hif_int;
5995253fe37SGagandeep Singh 
6005253fe37SGagandeep Singh 	writel(0, HIF_TX_CTRL);
6015253fe37SGagandeep Singh 
6025253fe37SGagandeep Singh 	hif_int = readl(HIF_INT_ENABLE);
6035253fe37SGagandeep Singh 	hif_int &= HIF_TXPKT_INT_EN;
6045253fe37SGagandeep Singh 	writel(hif_int, HIF_INT_ENABLE);
6055253fe37SGagandeep Singh }
6065253fe37SGagandeep Singh 
6075253fe37SGagandeep Singh /* Enable hif rx DMA and interrupt
6085253fe37SGagandeep Singh  *
6095253fe37SGagandeep Singh  */
6105253fe37SGagandeep Singh void
hif_rx_enable(void)6115253fe37SGagandeep Singh hif_rx_enable(void)
6125253fe37SGagandeep Singh {
6135253fe37SGagandeep Singh 	hif_rx_dma_start();
6145253fe37SGagandeep Singh 	writel((readl(HIF_INT_ENABLE) | HIF_INT_EN | HIF_RXPKT_INT_EN),
6155253fe37SGagandeep Singh 	       HIF_INT_ENABLE);
6165253fe37SGagandeep Singh }
6175253fe37SGagandeep Singh 
6185253fe37SGagandeep Singh /* Disable hif rx DMA and interrupt
6195253fe37SGagandeep Singh  *
6205253fe37SGagandeep Singh  */
6215253fe37SGagandeep Singh void
hif_rx_disable(void)6225253fe37SGagandeep Singh hif_rx_disable(void)
6235253fe37SGagandeep Singh {
6245253fe37SGagandeep Singh 	u32	hif_int;
6255253fe37SGagandeep Singh 
6265253fe37SGagandeep Singh 	writel(0, HIF_RX_CTRL);
6275253fe37SGagandeep Singh 
6285253fe37SGagandeep Singh 	hif_int = readl(HIF_INT_ENABLE);
6295253fe37SGagandeep Singh 	hif_int &= HIF_RXPKT_INT_EN;
6305253fe37SGagandeep Singh 	writel(hif_int, HIF_INT_ENABLE);
6315253fe37SGagandeep Singh }
632