forked from mirrors/linux
		
	 1bd33bf0fe
			
		
	
	
		1bd33bf0fe
		
	
	
	
	
		
			
			With .ndo_set_rx_mode/temac_set_multicast_list() being called in atomic context (holding addr_list_lock), and temac_set_multicast_list() needing to access temac indirect registers, the mutex used to synchronize indirect register is a no-no. Replace it with a spinlock, and avoid sleeping in temac_indirect_busywait(). To avoid excessive holding of the lock, which is now a spinlock, the temac_device_reset() function is changed to only hold the lock for short periods. With timeouts, it could be holding the spinlock for more than 2 seconds. Signed-off-by: Esben Haabendal <esben@geanix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			33 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef __LINUX_XILINX_LL_TEMAC_H
 | |
| #define __LINUX_XILINX_LL_TEMAC_H
 | |
| 
 | |
| #include <linux/if_ether.h>
 | |
| #include <linux/phy.h>
 | |
| #include <linux/spinlock.h>
 | |
| 
 | |
| struct ll_temac_platform_data {
 | |
| 	bool txcsum;		/* Enable/disable TX checksum */
 | |
| 	bool rxcsum;		/* Enable/disable RX checksum */
 | |
| 	u8 mac_addr[ETH_ALEN];	/* MAC address (6 bytes) */
 | |
| 	/* Clock frequency for input to MDIO clock generator */
 | |
| 	u32 mdio_clk_freq;
 | |
| 	unsigned long long mdio_bus_id; /* Unique id for MDIO bus */
 | |
| 	int phy_addr;		/* Address of the PHY to connect to */
 | |
| 	phy_interface_t phy_interface; /* PHY interface mode */
 | |
| 	bool reg_little_endian;	/* Little endian TEMAC register access  */
 | |
| 	bool dma_little_endian;	/* Little endian DMA register access  */
 | |
| 	/* Pre-initialized mutex to use for synchronizing indirect
 | |
| 	 * register access.  When using both interfaces of a single
 | |
| 	 * TEMAC IP block, the same mutex should be passed here, as
 | |
| 	 * they share the same DCR bus bridge.
 | |
| 	 */
 | |
| 	spinlock_t *indirect_lock;
 | |
| 	/* DMA channel control setup */
 | |
| 	u8 tx_irq_timeout;	/* TX Interrupt Delay Time-out */
 | |
| 	u8 tx_irq_count;	/* TX Interrupt Coalescing Threshold Count */
 | |
| 	u8 rx_irq_timeout;	/* RX Interrupt Delay Time-out */
 | |
| 	u8 rx_irq_count;	/* RX Interrupt Coalescing Threshold Count */
 | |
| };
 | |
| 
 | |
| #endif /* __LINUX_XILINX_LL_TEMAC_H */
 |