diff options
Diffstat (limited to 'drivers/net/ethernet/microchip/lan743x_main.c')
| -rw-r--r-- | drivers/net/ethernet/microchip/lan743x_main.c | 39 | 
1 files changed, 33 insertions, 6 deletions
| diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 9e8561cdc32a..4fc97823bc84 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -816,7 +816,7 @@ static int lan743x_mac_init(struct lan743x_adapter *adapter)  			eth_random_addr(adapter->mac_address);  	}  	lan743x_mac_set_address(adapter, adapter->mac_address); -	ether_addr_copy(netdev->dev_addr, adapter->mac_address); +	eth_hw_addr_set(netdev, adapter->mac_address);  	return 0;  } @@ -1743,6 +1743,16 @@ static int lan743x_tx_ring_init(struct lan743x_tx *tx)  		ret = -EINVAL;  		goto cleanup;  	} +	if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev, +				      DMA_BIT_MASK(64))) { +		if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev, +					      DMA_BIT_MASK(32))) { +			dev_warn(&tx->adapter->pdev->dev, +				 "lan743x_: No suitable DMA available\n"); +			ret = -ENOMEM; +			goto cleanup; +		} +	}  	ring_allocation_size = ALIGN(tx->ring_size *  				     sizeof(struct lan743x_tx_descriptor),  				     PAGE_SIZE); @@ -1934,7 +1944,8 @@ static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index)  				  index);  } -static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index) +static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, +					gfp_t gfp)  {  	struct net_device *netdev = rx->adapter->netdev;  	struct device *dev = &rx->adapter->pdev->dev; @@ -1948,7 +1959,7 @@ static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index)  	descriptor = &rx->ring_cpu_ptr[index];  	buffer_info = &rx->buffer_info[index]; -	skb = __netdev_alloc_skb(netdev, buffer_length, GFP_ATOMIC | GFP_DMA); +	skb = __netdev_alloc_skb(netdev, buffer_length, gfp);  	if (!skb)  		return -ENOMEM;  	dma_ptr = dma_map_single(dev, skb->data, buffer_length, DMA_FROM_DEVICE); @@ -2110,7 +2121,8 @@ static int lan743x_rx_process_buffer(struct lan743x_rx *rx)  	/* save existing skb, allocate new skb and map to dma */  	skb = buffer_info->skb; -	if (lan743x_rx_init_ring_element(rx, rx->last_head)) { +	if (lan743x_rx_init_ring_element(rx, rx->last_head, +					 GFP_ATOMIC | GFP_DMA)) {  		/* failed to allocate next skb.  		 * Memory is very low.  		 * Drop this packet and reuse buffer. @@ -2276,6 +2288,16 @@ static int lan743x_rx_ring_init(struct lan743x_rx *rx)  		ret = -EINVAL;  		goto cleanup;  	} +	if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, +				      DMA_BIT_MASK(64))) { +		if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, +					      DMA_BIT_MASK(32))) { +			dev_warn(&rx->adapter->pdev->dev, +				 "lan743x_: No suitable DMA available\n"); +			ret = -ENOMEM; +			goto cleanup; +		} +	}  	ring_allocation_size = ALIGN(rx->ring_size *  				     sizeof(struct lan743x_rx_descriptor),  				     PAGE_SIZE); @@ -2315,13 +2337,16 @@ static int lan743x_rx_ring_init(struct lan743x_rx *rx)  	rx->last_head = 0;  	for (index = 0; index < rx->ring_size; index++) { -		ret = lan743x_rx_init_ring_element(rx, index); +		ret = lan743x_rx_init_ring_element(rx, index, GFP_KERNEL);  		if (ret)  			goto cleanup;  	}  	return 0;  cleanup: +	netif_warn(rx->adapter, ifup, rx->adapter->netdev, +		   "Error allocating memory for LAN743x\n"); +  	lan743x_rx_ring_cleanup(rx);  	return ret;  } @@ -2645,7 +2670,7 @@ static int lan743x_netdev_set_mac_address(struct net_device *netdev,  	ret = eth_prepare_mac_addr_change(netdev, sock_addr);  	if (ret)  		return ret; -	ether_addr_copy(netdev->dev_addr, sock_addr->sa_data); +	eth_hw_addr_set(netdev, sock_addr->sa_data);  	lan743x_mac_set_address(adapter, sock_addr->sa_data);  	lan743x_rfe_update_mac_address(adapter);  	return 0; @@ -3019,6 +3044,8 @@ static int lan743x_pm_resume(struct device *dev)  	if (ret) {  		netif_err(adapter, probe, adapter->netdev,  			  "lan743x_hardware_init returned %d\n", ret); +		lan743x_pci_cleanup(adapter); +		return ret;  	}  	/* open netdev when netdev is at running state while resume. |