diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 22 | 
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index c729665107f5..2708297e7795 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -48,6 +48,7 @@  #include <linux/io.h>  #include <linux/irq.h>  #include <linux/clk.h> +#include <linux/crc32.h>  #include <linux/platform_device.h>  #include <linux/mdio.h>  #include <linux/phy.h> @@ -2949,13 +2950,12 @@ fec_enet_close(struct net_device *ndev)   */  #define FEC_HASH_BITS	6		/* #bits in hash */ -#define CRC32_POLY	0xEDB88320  static void set_multicast_list(struct net_device *ndev)  {  	struct fec_enet_private *fep = netdev_priv(ndev);  	struct netdev_hw_addr *ha; -	unsigned int i, bit, data, crc, tmp; +	unsigned int crc, tmp;  	unsigned char hash;  	unsigned int hash_high = 0, hash_low = 0; @@ -2983,15 +2983,7 @@ static void set_multicast_list(struct net_device *ndev)  	/* Add the addresses in hash register */  	netdev_for_each_mc_addr(ha, ndev) {  		/* calculate crc32 value of mac address */ -		crc = 0xffffffff; - -		for (i = 0; i < ndev->addr_len; i++) { -			data = ha->addr[i]; -			for (bit = 0; bit < 8; bit++, data >>= 1) { -				crc = (crc >> 1) ^ -				(((crc ^ data) & 1) ? CRC32_POLY : 0); -			} -		} +		crc = ether_crc_le(ndev->addr_len, ha->addr);  		/* only upper 6 bits (FEC_HASH_BITS) are used  		 * which point to specific bit in the hash registers @@ -3136,6 +3128,7 @@ static int fec_enet_init(struct net_device *ndev)  	unsigned dsize = fep->bufdesc_ex ? sizeof(struct bufdesc_ex) :  			sizeof(struct bufdesc);  	unsigned dsize_log2 = __fls(dsize); +	int ret;  	WARN_ON(dsize != (1 << dsize_log2));  #if defined(CONFIG_ARM) || defined(CONFIG_ARM64) @@ -3146,6 +3139,13 @@ static int fec_enet_init(struct net_device *ndev)  	fep->tx_align = 0x3;  #endif +	/* Check mask of the streaming and coherent API */ +	ret = dma_set_mask_and_coherent(&fep->pdev->dev, DMA_BIT_MASK(32)); +	if (ret < 0) { +		dev_warn(&fep->pdev->dev, "No suitable DMA available\n"); +		return ret; +	} +  	fec_enet_alloc_queue(ndev);  	bd_size = (fep->total_tx_ring_size + fep->total_rx_ring_size) * dsize;  |