kernel: bump 4.9 to 4.9.108
Refreshed all patches Compile-tested on: ar71xx Runtime-tested on: ar71xx Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
This commit is contained in:
		 Koen Vandeputte
					Koen Vandeputte
				
			
				
					committed by
					
						 John Crispin
						John Crispin
					
				
			
			
				
	
			
			
			 John Crispin
						John Crispin
					
				
			
						parent
						
							4fc005197a
						
					
				
				
					commit
					8c1f088521
				
			| @@ -4,13 +4,13 @@ LINUX_RELEASE?=1 | |||||||
|  |  | ||||||
| LINUX_VERSION-3.18 = .71 | LINUX_VERSION-3.18 = .71 | ||||||
| LINUX_VERSION-4.4 = .121 | LINUX_VERSION-4.4 = .121 | ||||||
| LINUX_VERSION-4.9 = .107 |  | ||||||
| LINUX_VERSION-4.14 = .48 | LINUX_VERSION-4.14 = .48 | ||||||
|  | LINUX_VERSION-4.9 = .108 | ||||||
|  |  | ||||||
| LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 | LINUX_KERNEL_HASH-3.18.71 = 5abc9778ad44ce02ed6c8ab52ece8a21c6d20d21f6ed8a19287b4a38a50c1240 | ||||||
| LINUX_KERNEL_HASH-4.4.121 = 44a88268b5088dc326b30c9b9133ac35a9a200b636b7268d08f32abeae6ca729 | LINUX_KERNEL_HASH-4.4.121 = 44a88268b5088dc326b30c9b9133ac35a9a200b636b7268d08f32abeae6ca729 | ||||||
| LINUX_KERNEL_HASH-4.9.107 = 3ce7f40ecee096cda1d51eb2cada105a39abe8da7b968ef85f52be961f22cad3 |  | ||||||
| LINUX_KERNEL_HASH-4.14.48 = 80a0608f611fe7a5c54556402cdc2880a21301e1c4e1b19d4c1db82ad2bf22b9 | LINUX_KERNEL_HASH-4.14.48 = 80a0608f611fe7a5c54556402cdc2880a21301e1c4e1b19d4c1db82ad2bf22b9 | ||||||
|  | LINUX_KERNEL_HASH-4.9.108 = 73fe2ba98a17962ccf249b12103b0ac3c39b298eec6696ede8d6fceee45e4041 | ||||||
|  |  | ||||||
| remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) | remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) | ||||||
| sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) | sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) | ||||||
|   | |||||||
| @@ -38,9 +38,9 @@ Signed-off-by: David S. Miller <davem@davemloft.net> | |||||||
|  { |  { | ||||||
| --- a/drivers/net/phy/bcm-phy-lib.h | --- a/drivers/net/phy/bcm-phy-lib.h | ||||||
| +++ b/drivers/net/phy/bcm-phy-lib.h | +++ b/drivers/net/phy/bcm-phy-lib.h | ||||||
| @@ -19,6 +19,9 @@ | @@ -26,6 +26,9 @@ static inline int bcm_phy_write_exp_sel( | ||||||
|  int bcm_phy_write_exp(struct phy_device *phydev, u16 reg, u16 val); |  	return bcm_phy_write_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER, val); | ||||||
|  int bcm_phy_read_exp(struct phy_device *phydev, u16 reg); |  } | ||||||
|   |   | ||||||
| +int bcm54xx_auxctl_write(struct phy_device *phydev, u16 regnum, u16 val); | +int bcm54xx_auxctl_write(struct phy_device *phydev, u16 regnum, u16 val); | ||||||
| +int bcm54xx_auxctl_read(struct phy_device *phydev, u16 regnum); | +int bcm54xx_auxctl_read(struct phy_device *phydev, u16 regnum); | ||||||
|   | |||||||
| @@ -78,7 +78,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> | |||||||
|  MODULE_LICENSE("GPL v2"); |  MODULE_LICENSE("GPL v2"); | ||||||
| --- a/drivers/net/phy/bcm-phy-lib.h | --- a/drivers/net/phy/bcm-phy-lib.h | ||||||
| +++ b/drivers/net/phy/bcm-phy-lib.h | +++ b/drivers/net/phy/bcm-phy-lib.h | ||||||
| @@ -36,5 +36,5 @@ int bcm_phy_config_intr(struct phy_devic | @@ -43,5 +43,5 @@ int bcm_phy_config_intr(struct phy_devic | ||||||
|   |   | ||||||
|  int bcm_phy_enable_apd(struct phy_device *phydev, bool dll_pwr_down); |  int bcm_phy_enable_apd(struct phy_device *phydev, bool dll_pwr_down); | ||||||
|   |   | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net> | |||||||
|  MODULE_AUTHOR("Broadcom Corporation"); |  MODULE_AUTHOR("Broadcom Corporation"); | ||||||
| --- a/drivers/net/phy/bcm-phy-lib.h | --- a/drivers/net/phy/bcm-phy-lib.h | ||||||
| +++ b/drivers/net/phy/bcm-phy-lib.h | +++ b/drivers/net/phy/bcm-phy-lib.h | ||||||
| @@ -37,4 +37,10 @@ int bcm_phy_config_intr(struct phy_devic | @@ -44,4 +44,10 @@ int bcm_phy_config_intr(struct phy_devic | ||||||
|  int bcm_phy_enable_apd(struct phy_device *phydev, bool dll_pwr_down); |  int bcm_phy_enable_apd(struct phy_device *phydev, bool dll_pwr_down); | ||||||
|   |   | ||||||
|  int bcm_phy_set_eee(struct phy_device *phydev, bool enable); |  int bcm_phy_set_eee(struct phy_device *phydev, bool enable); | ||||||
|   | |||||||
| @@ -90,7 +90,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	__used								\ |  	__used								\ | ||||||
| --- a/scripts/Makefile.build | --- a/scripts/Makefile.build | ||||||
| +++ b/scripts/Makefile.build | +++ b/scripts/Makefile.build | ||||||
| @@ -398,7 +398,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $( | @@ -401,7 +401,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $( | ||||||
|  # Linker scripts preprocessor (.lds.S -> .lds) |  # Linker scripts preprocessor (.lds.S -> .lds) | ||||||
|  # --------------------------------------------------------------------------- |  # --------------------------------------------------------------------------- | ||||||
|  quiet_cmd_cpp_lds_S = LDS     $@ |  quiet_cmd_cpp_lds_S = LDS     $@ | ||||||
|   | |||||||
| @@ -3095,7 +3095,7 @@ | |||||||
|   |   | ||||||
|  	if (priv->hw->mode->set_16kib_bfsize) |  	if (priv->hw->mode->set_16kib_bfsize) | ||||||
|  		bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu); |  		bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu); | ||||||
| @@ -1033,235 +1234,409 @@ static int init_dma_desc_rings(struct ne | @@ -1033,257 +1234,516 @@ static int init_dma_desc_rings(struct ne | ||||||
|   |   | ||||||
|  	priv->dma_buf_sz = bfsize; |  	priv->dma_buf_sz = bfsize; | ||||||
|   |   | ||||||
| @@ -3351,17 +3351,10 @@ | |||||||
| -						 priv->tx_skbuff_dma[i].buf, | -						 priv->tx_skbuff_dma[i].buf, | ||||||
| -						 priv->tx_skbuff_dma[i].len, | -						 priv->tx_skbuff_dma[i].len, | ||||||
| -						 DMA_TO_DEVICE); | -						 DMA_TO_DEVICE); | ||||||
| -		} |  | ||||||
| +	for (i = 0; i < DMA_TX_SIZE; i++) | +	for (i = 0; i < DMA_TX_SIZE; i++) | ||||||
| +		stmmac_free_tx_buffer(priv, queue, i); | +		stmmac_free_tx_buffer(priv, queue, i); | ||||||
| +} | +} | ||||||
|   | + | ||||||
| -		if (priv->tx_skbuff[i]) { |  | ||||||
| -			dev_kfree_skb_any(priv->tx_skbuff[i]); |  | ||||||
| -			priv->tx_skbuff[i] = NULL; |  | ||||||
| -			priv->tx_skbuff_dma[i].buf = 0; |  | ||||||
| -			priv->tx_skbuff_dma[i].map_as_page = false; |  | ||||||
| -		} |  | ||||||
| +/** | +/** | ||||||
| + * free_dma_rx_desc_resources - free RX dma desc resources | + * free_dma_rx_desc_resources - free RX dma desc resources | ||||||
| + * @priv: private structure | + * @priv: private structure | ||||||
| @@ -3390,11 +3383,10 @@ | |||||||
| + | + | ||||||
| +		kfree(rx_q->rx_skbuff_dma); | +		kfree(rx_q->rx_skbuff_dma); | ||||||
| +		kfree(rx_q->rx_skbuff); | +		kfree(rx_q->rx_skbuff); | ||||||
|  	} | +	} | ||||||
|  } | +} | ||||||
|   | + | ||||||
|  /** | +/** | ||||||
| - * alloc_dma_desc_resources - alloc TX/RX resources. |  | ||||||
| + * free_dma_tx_desc_resources - free TX dma desc resources | + * free_dma_tx_desc_resources - free TX dma desc resources | ||||||
| + * @priv: private structure | + * @priv: private structure | ||||||
| + */ | + */ | ||||||
| @@ -3427,90 +3419,36 @@ | |||||||
| + | + | ||||||
| +/** | +/** | ||||||
| + * alloc_dma_rx_desc_resources - alloc RX resources. | + * alloc_dma_rx_desc_resources - alloc RX resources. | ||||||
|   * @priv: private structure | + * @priv: private structure | ||||||
|   * Description: according to which descriptor can be used (extend or basic) | + * Description: according to which descriptor can be used (extend or basic) | ||||||
|   * this function allocates the resources for TX and RX paths. In case of | + * this function allocates the resources for TX and RX paths. In case of | ||||||
|   * reception, for example, it pre-allocated the RX socket buffer in order to | + * reception, for example, it pre-allocated the RX socket buffer in order to | ||||||
|   * allow zero-copy mechanism. | + * allow zero-copy mechanism. | ||||||
|   */ | + */ | ||||||
| -static int alloc_dma_desc_resources(struct stmmac_priv *priv) |  | ||||||
| +static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv) | +static int alloc_dma_rx_desc_resources(struct stmmac_priv *priv) | ||||||
|  { | +{ | ||||||
| +	u32 rx_count = priv->plat->rx_queues_to_use; | +	u32 rx_count = priv->plat->rx_queues_to_use; | ||||||
|  	int ret = -ENOMEM; | +	int ret = -ENOMEM; | ||||||
| +	u32 queue; | +	u32 queue; | ||||||
|   | + | ||||||
| -	priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t), |  | ||||||
| -					    GFP_KERNEL); |  | ||||||
| -	if (!priv->rx_skbuff_dma) |  | ||||||
| -		return -ENOMEM; |  | ||||||
| +	/* RX queues buffers and DMA */ | +	/* RX queues buffers and DMA */ | ||||||
| +	for (queue = 0; queue < rx_count; queue++) { | +	for (queue = 0; queue < rx_count; queue++) { | ||||||
| +		struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; | +		struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue]; | ||||||
|   | + | ||||||
| -	priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *), |  | ||||||
| -					GFP_KERNEL); |  | ||||||
| -	if (!priv->rx_skbuff) |  | ||||||
| -		goto err_rx_skbuff; |  | ||||||
| - |  | ||||||
| -	priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE, |  | ||||||
| -					    sizeof(*priv->tx_skbuff_dma), |  | ||||||
| -					    GFP_KERNEL); |  | ||||||
| -	if (!priv->tx_skbuff_dma) |  | ||||||
| -		goto err_tx_skbuff_dma; |  | ||||||
| - |  | ||||||
| -	priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *), |  | ||||||
| -					GFP_KERNEL); |  | ||||||
| -	if (!priv->tx_skbuff) |  | ||||||
| -		goto err_tx_skbuff; |  | ||||||
| - |  | ||||||
| -	if (priv->extend_desc) { |  | ||||||
| -		priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * |  | ||||||
| -						    sizeof(struct |  | ||||||
| -							   dma_extended_desc), |  | ||||||
| -						    &priv->dma_rx_phy, |  | ||||||
| -						    GFP_KERNEL); |  | ||||||
| -		if (!priv->dma_erx) |  | ||||||
| -			goto err_dma; |  | ||||||
| +		rx_q->queue_index = queue; | +		rx_q->queue_index = queue; | ||||||
| +		rx_q->priv_data = priv; | +		rx_q->priv_data = priv; | ||||||
|   | + | ||||||
| -		priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * |  | ||||||
| -						    sizeof(struct |  | ||||||
| -							   dma_extended_desc), |  | ||||||
| -						    &priv->dma_tx_phy, |  | ||||||
| +		rx_q->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, | +		rx_q->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, | ||||||
| +						    sizeof(dma_addr_t), | +						    sizeof(dma_addr_t), | ||||||
|  						    GFP_KERNEL); | +						    GFP_KERNEL); | ||||||
| -		if (!priv->dma_etx) { |  | ||||||
| -			dma_free_coherent(priv->device, DMA_RX_SIZE * |  | ||||||
| -					  sizeof(struct dma_extended_desc), |  | ||||||
| -					  priv->dma_erx, priv->dma_rx_phy); |  | ||||||
| -			goto err_dma; |  | ||||||
| -		} |  | ||||||
| -	} else { |  | ||||||
| -		priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * |  | ||||||
| -						   sizeof(struct dma_desc), |  | ||||||
| -						   &priv->dma_rx_phy, |  | ||||||
| -						   GFP_KERNEL); |  | ||||||
| -		if (!priv->dma_rx) |  | ||||||
| -			goto err_dma; |  | ||||||
| +		if (!rx_q->rx_skbuff_dma) | +		if (!rx_q->rx_skbuff_dma) | ||||||
| +			return -ENOMEM; | +			return -ENOMEM; | ||||||
|   | + | ||||||
| -		priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * |  | ||||||
| -						   sizeof(struct dma_desc), |  | ||||||
| -						   &priv->dma_tx_phy, |  | ||||||
| -						   GFP_KERNEL); |  | ||||||
| -		if (!priv->dma_tx) { |  | ||||||
| -			dma_free_coherent(priv->device, DMA_RX_SIZE * |  | ||||||
| -					  sizeof(struct dma_desc), |  | ||||||
| -					  priv->dma_rx, priv->dma_rx_phy); |  | ||||||
| +		rx_q->rx_skbuff = kmalloc_array(DMA_RX_SIZE, | +		rx_q->rx_skbuff = kmalloc_array(DMA_RX_SIZE, | ||||||
| +						sizeof(struct sk_buff *), | +						sizeof(struct sk_buff *), | ||||||
| +						GFP_KERNEL); | +						GFP_KERNEL); | ||||||
| +		if (!rx_q->rx_skbuff) | +		if (!rx_q->rx_skbuff) | ||||||
|  			goto err_dma; | +			goto err_dma; | ||||||
| + | + | ||||||
| +		if (priv->extend_desc) { | +		if (priv->extend_desc) { | ||||||
| +			rx_q->dma_erx = dma_zalloc_coherent(priv->device, | +			rx_q->dma_erx = dma_zalloc_coherent(priv->device, | ||||||
| @@ -3531,19 +3469,12 @@ | |||||||
| +							   GFP_KERNEL); | +							   GFP_KERNEL); | ||||||
| +			if (!rx_q->dma_rx) | +			if (!rx_q->dma_rx) | ||||||
| +				goto err_dma; | +				goto err_dma; | ||||||
|  		} | +		} | ||||||
|  	} | +	} | ||||||
|   | + | ||||||
|  	return 0; | +	return 0; | ||||||
|   | + | ||||||
|  err_dma: | +err_dma: | ||||||
| -	kfree(priv->tx_skbuff); |  | ||||||
| -err_tx_skbuff: |  | ||||||
| -	kfree(priv->tx_skbuff_dma); |  | ||||||
| -err_tx_skbuff_dma: |  | ||||||
| -	kfree(priv->rx_skbuff); |  | ||||||
| -err_rx_skbuff: |  | ||||||
| -	kfree(priv->rx_skbuff_dma); |  | ||||||
| +	free_dma_rx_desc_resources(priv); | +	free_dma_rx_desc_resources(priv); | ||||||
| + | + | ||||||
| +	return ret; | +	return ret; | ||||||
| @@ -3600,7 +3531,7 @@ | |||||||
| +							   GFP_KERNEL); | +							   GFP_KERNEL); | ||||||
| +			if (!tx_q->dma_tx) | +			if (!tx_q->dma_tx) | ||||||
| +				goto err_dma_buffers; | +				goto err_dma_buffers; | ||||||
| +		} |  		} | ||||||
| +	} | +	} | ||||||
| + | + | ||||||
| +	return 0; | +	return 0; | ||||||
| @@ -3629,14 +3560,183 @@ | |||||||
| + | + | ||||||
| +	ret = alloc_dma_tx_desc_resources(priv); | +	ret = alloc_dma_tx_desc_resources(priv); | ||||||
| + | + | ||||||
|  	return ret; | +	return ret; | ||||||
|  } | +} | ||||||
|   | + | ||||||
| +/** | +/** | ||||||
| + * free_dma_desc_resources - free dma desc resources | + * free_dma_desc_resources - free dma desc resources | ||||||
| + * @priv: private structure | + * @priv: private structure | ||||||
| + */ | + */ | ||||||
|  static void free_dma_desc_resources(struct stmmac_priv *priv) | +static void free_dma_desc_resources(struct stmmac_priv *priv) | ||||||
|  | +{ | ||||||
|  | +	/* Release the DMA RX socket buffers */ | ||||||
|  | +	free_dma_rx_desc_resources(priv); | ||||||
|  | + | ||||||
|  | +	/* Release the DMA TX socket buffers */ | ||||||
|  | +	free_dma_tx_desc_resources(priv); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +/** | ||||||
|  | + *  stmmac_mac_enable_rx_queues - Enable MAC rx queues | ||||||
|  | + *  @priv: driver private structure | ||||||
|  | + *  Description: It is used for enabling the rx queues in the MAC | ||||||
|  | + */ | ||||||
|  | +static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) | ||||||
|  | +{ | ||||||
|  | +	u32 rx_queues_count = priv->plat->rx_queues_to_use; | ||||||
|  | +	int queue; | ||||||
|  | +	u8 mode; | ||||||
|  |   | ||||||
|  | -		if (priv->tx_skbuff[i]) { | ||||||
|  | -			dev_kfree_skb_any(priv->tx_skbuff[i]); | ||||||
|  | -			priv->tx_skbuff[i] = NULL; | ||||||
|  | -			priv->tx_skbuff_dma[i].buf = 0; | ||||||
|  | -			priv->tx_skbuff_dma[i].map_as_page = false; | ||||||
|  | -		} | ||||||
|  | +	for (queue = 0; queue < rx_queues_count; queue++) { | ||||||
|  | +		mode = priv->plat->rx_queues_cfg[queue].mode_to_use; | ||||||
|  | +		priv->hw->mac->rx_queue_enable(priv->hw, mode, queue); | ||||||
|  |  	} | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /** | ||||||
|  | - * alloc_dma_desc_resources - alloc TX/RX resources. | ||||||
|  | - * @priv: private structure | ||||||
|  | - * Description: according to which descriptor can be used (extend or basic) | ||||||
|  | - * this function allocates the resources for TX and RX paths. In case of | ||||||
|  | - * reception, for example, it pre-allocated the RX socket buffer in order to | ||||||
|  | - * allow zero-copy mechanism. | ||||||
|  | + * stmmac_start_rx_dma - start RX DMA channel | ||||||
|  | + * @priv: driver private structure | ||||||
|  | + * @chan: RX channel index | ||||||
|  | + * Description: | ||||||
|  | + * This starts a RX DMA channel | ||||||
|  |   */ | ||||||
|  | -static int alloc_dma_desc_resources(struct stmmac_priv *priv) | ||||||
|  | +static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan) | ||||||
|  |  { | ||||||
|  | -	int ret = -ENOMEM; | ||||||
|  | - | ||||||
|  | -	priv->rx_skbuff_dma = kmalloc_array(DMA_RX_SIZE, sizeof(dma_addr_t), | ||||||
|  | -					    GFP_KERNEL); | ||||||
|  | -	if (!priv->rx_skbuff_dma) | ||||||
|  | -		return -ENOMEM; | ||||||
|  | - | ||||||
|  | -	priv->rx_skbuff = kmalloc_array(DMA_RX_SIZE, sizeof(struct sk_buff *), | ||||||
|  | -					GFP_KERNEL); | ||||||
|  | -	if (!priv->rx_skbuff) | ||||||
|  | -		goto err_rx_skbuff; | ||||||
|  | - | ||||||
|  | -	priv->tx_skbuff_dma = kmalloc_array(DMA_TX_SIZE, | ||||||
|  | -					    sizeof(*priv->tx_skbuff_dma), | ||||||
|  | -					    GFP_KERNEL); | ||||||
|  | -	if (!priv->tx_skbuff_dma) | ||||||
|  | -		goto err_tx_skbuff_dma; | ||||||
|  | - | ||||||
|  | -	priv->tx_skbuff = kmalloc_array(DMA_TX_SIZE, sizeof(struct sk_buff *), | ||||||
|  | -					GFP_KERNEL); | ||||||
|  | -	if (!priv->tx_skbuff) | ||||||
|  | -		goto err_tx_skbuff; | ||||||
|  | - | ||||||
|  | -	if (priv->extend_desc) { | ||||||
|  | -		priv->dma_erx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * | ||||||
|  | -						    sizeof(struct | ||||||
|  | -							   dma_extended_desc), | ||||||
|  | -						    &priv->dma_rx_phy, | ||||||
|  | -						    GFP_KERNEL); | ||||||
|  | -		if (!priv->dma_erx) | ||||||
|  | -			goto err_dma; | ||||||
|  | - | ||||||
|  | -		priv->dma_etx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * | ||||||
|  | -						    sizeof(struct | ||||||
|  | -							   dma_extended_desc), | ||||||
|  | -						    &priv->dma_tx_phy, | ||||||
|  | -						    GFP_KERNEL); | ||||||
|  | -		if (!priv->dma_etx) { | ||||||
|  | -			dma_free_coherent(priv->device, DMA_RX_SIZE * | ||||||
|  | -					  sizeof(struct dma_extended_desc), | ||||||
|  | -					  priv->dma_erx, priv->dma_rx_phy); | ||||||
|  | -			goto err_dma; | ||||||
|  | -		} | ||||||
|  | -	} else { | ||||||
|  | -		priv->dma_rx = dma_zalloc_coherent(priv->device, DMA_RX_SIZE * | ||||||
|  | -						   sizeof(struct dma_desc), | ||||||
|  | -						   &priv->dma_rx_phy, | ||||||
|  | -						   GFP_KERNEL); | ||||||
|  | -		if (!priv->dma_rx) | ||||||
|  | -			goto err_dma; | ||||||
|  | +	netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan); | ||||||
|  | +	priv->hw->dma->start_rx(priv->ioaddr, chan); | ||||||
|  | +} | ||||||
|  |   | ||||||
|  | -		priv->dma_tx = dma_zalloc_coherent(priv->device, DMA_TX_SIZE * | ||||||
|  | -						   sizeof(struct dma_desc), | ||||||
|  | -						   &priv->dma_tx_phy, | ||||||
|  | -						   GFP_KERNEL); | ||||||
|  | -		if (!priv->dma_tx) { | ||||||
|  | -			dma_free_coherent(priv->device, DMA_RX_SIZE * | ||||||
|  | -					  sizeof(struct dma_desc), | ||||||
|  | -					  priv->dma_rx, priv->dma_rx_phy); | ||||||
|  | -			goto err_dma; | ||||||
|  | -		} | ||||||
|  | -	} | ||||||
|  | +/** | ||||||
|  | + * stmmac_start_tx_dma - start TX DMA channel | ||||||
|  | + * @priv: driver private structure | ||||||
|  | + * @chan: TX channel index | ||||||
|  | + * Description: | ||||||
|  | + * This starts a TX DMA channel | ||||||
|  | + */ | ||||||
|  | +static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan) | ||||||
|  | +{ | ||||||
|  | +	netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan); | ||||||
|  | +	priv->hw->dma->start_tx(priv->ioaddr, chan); | ||||||
|  | +} | ||||||
|  |   | ||||||
|  | -	return 0; | ||||||
|  | +/** | ||||||
|  | + * stmmac_stop_rx_dma - stop RX DMA channel | ||||||
|  | + * @priv: driver private structure | ||||||
|  | + * @chan: RX channel index | ||||||
|  | + * Description: | ||||||
|  | + * This stops a RX DMA channel | ||||||
|  | + */ | ||||||
|  | +static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan) | ||||||
|  | +{ | ||||||
|  | +	netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan); | ||||||
|  | +	priv->hw->dma->stop_rx(priv->ioaddr, chan); | ||||||
|  | +} | ||||||
|  |   | ||||||
|  | -err_dma: | ||||||
|  | -	kfree(priv->tx_skbuff); | ||||||
|  | -err_tx_skbuff: | ||||||
|  | -	kfree(priv->tx_skbuff_dma); | ||||||
|  | -err_tx_skbuff_dma: | ||||||
|  | -	kfree(priv->rx_skbuff); | ||||||
|  | -err_rx_skbuff: | ||||||
|  | -	kfree(priv->rx_skbuff_dma); | ||||||
|  | -	return ret; | ||||||
|  | +/** | ||||||
|  | + * stmmac_stop_tx_dma - stop TX DMA channel | ||||||
|  | + * @priv: driver private structure | ||||||
|  | + * @chan: TX channel index | ||||||
|  | + * Description: | ||||||
|  | + * This stops a TX DMA channel | ||||||
|  | + */ | ||||||
|  | +static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan) | ||||||
|  | +{ | ||||||
|  | +	netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan); | ||||||
|  | +	priv->hw->dma->stop_tx(priv->ioaddr, chan); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static void free_dma_desc_resources(struct stmmac_priv *priv) | ||||||
|  | +/** | ||||||
|  | + * stmmac_start_all_dma - start all RX and TX DMA channels | ||||||
|  | + * @priv: driver private structure | ||||||
|  | + * Description: | ||||||
|  | + * This starts all the RX and TX DMA channels | ||||||
|  | + */ | ||||||
|  | +static void stmmac_start_all_dma(struct stmmac_priv *priv) | ||||||
|  { |  { | ||||||
| -	/* Release the DMA TX/RX socket buffers */ | -	/* Release the DMA TX/RX socket buffers */ | ||||||
| -	dma_free_rx_skbufs(priv); | -	dma_free_rx_skbufs(priv); | ||||||
| @@ -3662,99 +3762,6 @@ | |||||||
| -	kfree(priv->rx_skbuff); | -	kfree(priv->rx_skbuff); | ||||||
| -	kfree(priv->tx_skbuff_dma); | -	kfree(priv->tx_skbuff_dma); | ||||||
| -	kfree(priv->tx_skbuff); | -	kfree(priv->tx_skbuff); | ||||||
| +	/* Release the DMA RX socket buffers */ |  | ||||||
| +	free_dma_rx_desc_resources(priv); |  | ||||||
| + |  | ||||||
| +	/* Release the DMA TX socket buffers */ |  | ||||||
| +	free_dma_tx_desc_resources(priv); |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  /** |  | ||||||
| @@ -1271,19 +1646,104 @@ static void free_dma_desc_resources(stru |  | ||||||
|   */ |  | ||||||
|  static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) |  | ||||||
|  { |  | ||||||
| -	int rx_count = priv->dma_cap.number_rx_queues; |  | ||||||
| -	int queue = 0; |  | ||||||
| +	u32 rx_queues_count = priv->plat->rx_queues_to_use; |  | ||||||
| +	int queue; |  | ||||||
| +	u8 mode; |  | ||||||
|   |  | ||||||
| -	/* If GMAC does not have multiple queues, then this is not necessary*/ |  | ||||||
| -	if (rx_count == 1) |  | ||||||
| -		return; |  | ||||||
| +	for (queue = 0; queue < rx_queues_count; queue++) { |  | ||||||
| +		mode = priv->plat->rx_queues_cfg[queue].mode_to_use; |  | ||||||
| +		priv->hw->mac->rx_queue_enable(priv->hw, mode, queue); |  | ||||||
| +	} |  | ||||||
| +} |  | ||||||
|   |  | ||||||
| -	/** |  | ||||||
| -	 *  If the core is synthesized with multiple rx queues / multiple |  | ||||||
| -	 *  dma channels, then rx queues will be disabled by default. |  | ||||||
| -	 *  For now only rx queue 0 is enabled. |  | ||||||
| -	 */ |  | ||||||
| -	priv->hw->mac->rx_queue_enable(priv->hw, queue); |  | ||||||
| +/** |  | ||||||
| + * stmmac_start_rx_dma - start RX DMA channel |  | ||||||
| + * @priv: driver private structure |  | ||||||
| + * @chan: RX channel index |  | ||||||
| + * Description: |  | ||||||
| + * This starts a RX DMA channel |  | ||||||
| + */ |  | ||||||
| +static void stmmac_start_rx_dma(struct stmmac_priv *priv, u32 chan) |  | ||||||
| +{ |  | ||||||
| +	netdev_dbg(priv->dev, "DMA RX processes started in channel %d\n", chan); |  | ||||||
| +	priv->hw->dma->start_rx(priv->ioaddr, chan); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +/** |  | ||||||
| + * stmmac_start_tx_dma - start TX DMA channel |  | ||||||
| + * @priv: driver private structure |  | ||||||
| + * @chan: TX channel index |  | ||||||
| + * Description: |  | ||||||
| + * This starts a TX DMA channel |  | ||||||
| + */ |  | ||||||
| +static void stmmac_start_tx_dma(struct stmmac_priv *priv, u32 chan) |  | ||||||
| +{ |  | ||||||
| +	netdev_dbg(priv->dev, "DMA TX processes started in channel %d\n", chan); |  | ||||||
| +	priv->hw->dma->start_tx(priv->ioaddr, chan); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +/** |  | ||||||
| + * stmmac_stop_rx_dma - stop RX DMA channel |  | ||||||
| + * @priv: driver private structure |  | ||||||
| + * @chan: RX channel index |  | ||||||
| + * Description: |  | ||||||
| + * This stops a RX DMA channel |  | ||||||
| + */ |  | ||||||
| +static void stmmac_stop_rx_dma(struct stmmac_priv *priv, u32 chan) |  | ||||||
| +{ |  | ||||||
| +	netdev_dbg(priv->dev, "DMA RX processes stopped in channel %d\n", chan); |  | ||||||
| +	priv->hw->dma->stop_rx(priv->ioaddr, chan); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +/** |  | ||||||
| + * stmmac_stop_tx_dma - stop TX DMA channel |  | ||||||
| + * @priv: driver private structure |  | ||||||
| + * @chan: TX channel index |  | ||||||
| + * Description: |  | ||||||
| + * This stops a TX DMA channel |  | ||||||
| + */ |  | ||||||
| +static void stmmac_stop_tx_dma(struct stmmac_priv *priv, u32 chan) |  | ||||||
| +{ |  | ||||||
| +	netdev_dbg(priv->dev, "DMA TX processes stopped in channel %d\n", chan); |  | ||||||
| +	priv->hw->dma->stop_tx(priv->ioaddr, chan); |  | ||||||
| +} |  | ||||||
| + |  | ||||||
| +/** |  | ||||||
| + * stmmac_start_all_dma - start all RX and TX DMA channels |  | ||||||
| + * @priv: driver private structure |  | ||||||
| + * Description: |  | ||||||
| + * This starts all the RX and TX DMA channels |  | ||||||
| + */ |  | ||||||
| +static void stmmac_start_all_dma(struct stmmac_priv *priv) |  | ||||||
| +{ |  | ||||||
| +	u32 rx_channels_count = priv->plat->rx_queues_to_use; | +	u32 rx_channels_count = priv->plat->rx_queues_to_use; | ||||||
| +	u32 tx_channels_count = priv->plat->tx_queues_to_use; | +	u32 tx_channels_count = priv->plat->tx_queues_to_use; | ||||||
| +	u32 chan = 0; | +	u32 chan = 0; | ||||||
| @@ -3764,23 +3771,38 @@ | |||||||
| + | + | ||||||
| +	for (chan = 0; chan < tx_channels_count; chan++) | +	for (chan = 0; chan < tx_channels_count; chan++) | ||||||
| +		stmmac_start_tx_dma(priv, chan); | +		stmmac_start_tx_dma(priv, chan); | ||||||
| +} |  } | ||||||
| + |   | ||||||
| +/** |  /** | ||||||
|  | - *  stmmac_mac_enable_rx_queues - Enable MAC rx queues | ||||||
|  | - *  @priv: driver private structure | ||||||
|  | - *  Description: It is used for enabling the rx queues in the MAC | ||||||
| + * stmmac_stop_all_dma - stop all RX and TX DMA channels | + * stmmac_stop_all_dma - stop all RX and TX DMA channels | ||||||
| + * @priv: driver private structure | + * @priv: driver private structure | ||||||
| + * Description: | + * Description: | ||||||
| + * This stops the RX and TX DMA channels | + * This stops the RX and TX DMA channels | ||||||
| + */ |   */ | ||||||
|  | -static void stmmac_mac_enable_rx_queues(struct stmmac_priv *priv) | ||||||
| +static void stmmac_stop_all_dma(struct stmmac_priv *priv) | +static void stmmac_stop_all_dma(struct stmmac_priv *priv) | ||||||
| +{ |  { | ||||||
|  | -	int rx_count = priv->dma_cap.number_rx_queues; | ||||||
|  | -	int queue = 0; | ||||||
| +	u32 rx_channels_count = priv->plat->rx_queues_to_use; | +	u32 rx_channels_count = priv->plat->rx_queues_to_use; | ||||||
| +	u32 tx_channels_count = priv->plat->tx_queues_to_use; | +	u32 tx_channels_count = priv->plat->tx_queues_to_use; | ||||||
| +	u32 chan = 0; | +	u32 chan = 0; | ||||||
| + |   | ||||||
|  | -	/* If GMAC does not have multiple queues, then this is not necessary*/ | ||||||
|  | -	if (rx_count == 1) | ||||||
|  | -		return; | ||||||
| +	for (chan = 0; chan < rx_channels_count; chan++) | +	for (chan = 0; chan < rx_channels_count; chan++) | ||||||
| +		stmmac_stop_rx_dma(priv, chan); | +		stmmac_stop_rx_dma(priv, chan); | ||||||
| + |   | ||||||
|  | -	/** | ||||||
|  | -	 *  If the core is synthesized with multiple rx queues / multiple | ||||||
|  | -	 *  dma channels, then rx queues will be disabled by default. | ||||||
|  | -	 *  For now only rx queue 0 is enabled. | ||||||
|  | -	 */ | ||||||
|  | -	priv->hw->mac->rx_queue_enable(priv->hw, queue); | ||||||
| +	for (chan = 0; chan < tx_channels_count; chan++) | +	for (chan = 0; chan < tx_channels_count; chan++) | ||||||
| +		stmmac_stop_tx_dma(priv, chan); | +		stmmac_stop_tx_dma(priv, chan); | ||||||
|  } |  } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user