@@ -2772,7 +2772,7 @@ static int stmmac_release(struct net_device *dev)
2772
2772
* This function fills descriptor and request new descriptors according to
2773
2773
* buffer length to fill
2774
2774
*/
2775
- static void stmmac_tso_allocator (struct stmmac_priv * priv , unsigned int des ,
2775
+ static void stmmac_tso_allocator (struct stmmac_priv * priv , dma_addr_t des ,
2776
2776
int total_len , bool last_segment , u32 queue )
2777
2777
{
2778
2778
struct stmmac_tx_queue * tx_q = & priv -> tx_queue [queue ];
@@ -2783,11 +2783,18 @@ static void stmmac_tso_allocator(struct stmmac_priv *priv, unsigned int des,
2783
2783
tmp_len = total_len ;
2784
2784
2785
2785
while (tmp_len > 0 ) {
2786
+ dma_addr_t curr_addr ;
2787
+
2786
2788
tx_q -> cur_tx = STMMAC_GET_ENTRY (tx_q -> cur_tx , DMA_TX_SIZE );
2787
2789
WARN_ON (tx_q -> tx_skbuff [tx_q -> cur_tx ]);
2788
2790
desc = tx_q -> dma_tx + tx_q -> cur_tx ;
2789
2791
2790
- desc -> des0 = cpu_to_le32 (des + (total_len - tmp_len ));
2792
+ curr_addr = des + (total_len - tmp_len );
2793
+ if (priv -> dma_cap .addr64 <= 32 )
2794
+ desc -> des0 = cpu_to_le32 (curr_addr );
2795
+ else
2796
+ stmmac_set_desc_addr (priv , desc , curr_addr );
2797
+
2791
2798
buff_size = tmp_len >= TSO_MAX_BUFF_SIZE ?
2792
2799
TSO_MAX_BUFF_SIZE : tmp_len ;
2793
2800
@@ -2833,11 +2840,12 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
2833
2840
struct stmmac_priv * priv = netdev_priv (dev );
2834
2841
int nfrags = skb_shinfo (skb )-> nr_frags ;
2835
2842
u32 queue = skb_get_queue_mapping (skb );
2836
- unsigned int first_entry , des ;
2843
+ unsigned int first_entry ;
2837
2844
struct stmmac_tx_queue * tx_q ;
2838
2845
int tmp_pay_len = 0 ;
2839
2846
u32 pay_len , mss ;
2840
2847
u8 proto_hdr_len ;
2848
+ dma_addr_t des ;
2841
2849
int i ;
2842
2850
2843
2851
tx_q = & priv -> tx_queue [queue ];
@@ -2894,14 +2902,19 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
2894
2902
tx_q -> tx_skbuff_dma [first_entry ].buf = des ;
2895
2903
tx_q -> tx_skbuff_dma [first_entry ].len = skb_headlen (skb );
2896
2904
2897
- first -> des0 = cpu_to_le32 (des );
2905
+ if (priv -> dma_cap .addr64 <= 32 ) {
2906
+ first -> des0 = cpu_to_le32 (des );
2898
2907
2899
- /* Fill start of payload in buff2 of first descriptor */
2900
- if (pay_len )
2901
- first -> des1 = cpu_to_le32 (des + proto_hdr_len );
2908
+ /* Fill start of payload in buff2 of first descriptor */
2909
+ if (pay_len )
2910
+ first -> des1 = cpu_to_le32 (des + proto_hdr_len );
2902
2911
2903
- /* If needed take extra descriptors to fill the remaining payload */
2904
- tmp_pay_len = pay_len - TSO_MAX_BUFF_SIZE ;
2912
+ /* If needed take extra descriptors to fill the remaining payload */
2913
+ tmp_pay_len = pay_len - TSO_MAX_BUFF_SIZE ;
2914
+ } else {
2915
+ stmmac_set_desc_addr (priv , first , des );
2916
+ tmp_pay_len = pay_len ;
2917
+ }
2905
2918
2906
2919
stmmac_tso_allocator (priv , des , tmp_pay_len , (nfrags == 0 ), queue );
2907
2920
@@ -3031,12 +3044,12 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
3031
3044
int i , csum_insertion = 0 , is_jumbo = 0 ;
3032
3045
u32 queue = skb_get_queue_mapping (skb );
3033
3046
int nfrags = skb_shinfo (skb )-> nr_frags ;
3034
- int entry ;
3035
- unsigned int first_entry ;
3036
3047
struct dma_desc * desc , * first ;
3037
3048
struct stmmac_tx_queue * tx_q ;
3049
+ unsigned int first_entry ;
3038
3050
unsigned int enh_desc ;
3039
- unsigned int des ;
3051
+ dma_addr_t des ;
3052
+ int entry ;
3040
3053
3041
3054
tx_q = & priv -> tx_queue [queue ];
3042
3055
@@ -4316,6 +4329,24 @@ int stmmac_dvr_probe(struct device *device,
4316
4329
priv -> tso = true;
4317
4330
dev_info (priv -> device , "TSO feature enabled\n" );
4318
4331
}
4332
+
4333
+ if (priv -> dma_cap .addr64 ) {
4334
+ ret = dma_set_mask_and_coherent (device ,
4335
+ DMA_BIT_MASK (priv -> dma_cap .addr64 ));
4336
+ if (!ret ) {
4337
+ dev_info (priv -> device , "Using %d bits DMA width\n" ,
4338
+ priv -> dma_cap .addr64 );
4339
+ } else {
4340
+ ret = dma_set_mask_and_coherent (device , DMA_BIT_MASK (32 ));
4341
+ if (ret ) {
4342
+ dev_err (priv -> device , "Failed to set DMA Mask\n" );
4343
+ goto error_hw_init ;
4344
+ }
4345
+
4346
+ priv -> dma_cap .addr64 = 32 ;
4347
+ }
4348
+ }
4349
+
4319
4350
ndev -> features |= ndev -> hw_features | NETIF_F_HIGHDMA ;
4320
4351
ndev -> watchdog_timeo = msecs_to_jiffies (watchdog );
4321
4352
#ifdef STMMAC_VLAN_TAG_USED
0 commit comments