@@ -1131,9 +1131,9 @@ static int mtk_init_fq_dma(struct mtk_eth *eth)
1131
1131
{
1132
1132
const struct mtk_soc_data * soc = eth -> soc ;
1133
1133
dma_addr_t phy_ring_tail ;
1134
- int cnt = MTK_QDMA_RING_SIZE ;
1134
+ int cnt = soc -> tx . fq_dma_size ;
1135
1135
dma_addr_t dma_addr ;
1136
- int i ;
1136
+ int i , j , len ;
1137
1137
1138
1138
if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_SRAM ))
1139
1139
eth -> scratch_ring = eth -> sram_base ;
@@ -1142,40 +1142,46 @@ static int mtk_init_fq_dma(struct mtk_eth *eth)
1142
1142
cnt * soc -> tx .desc_size ,
1143
1143
& eth -> phy_scratch_ring ,
1144
1144
GFP_KERNEL );
1145
+
1145
1146
if (unlikely (!eth -> scratch_ring ))
1146
1147
return - ENOMEM ;
1147
1148
1148
- eth -> scratch_head = kcalloc (cnt , MTK_QDMA_PAGE_SIZE , GFP_KERNEL );
1149
- if (unlikely (!eth -> scratch_head ))
1150
- return - ENOMEM ;
1149
+ phy_ring_tail = eth -> phy_scratch_ring + soc -> tx .desc_size * (cnt - 1 );
1151
1150
1152
- dma_addr = dma_map_single (eth -> dma_dev ,
1153
- eth -> scratch_head , cnt * MTK_QDMA_PAGE_SIZE ,
1154
- DMA_FROM_DEVICE );
1155
- if (unlikely (dma_mapping_error (eth -> dma_dev , dma_addr )))
1156
- return - ENOMEM ;
1151
+ for (j = 0 ; j < DIV_ROUND_UP (soc -> tx .fq_dma_size , MTK_FQ_DMA_LENGTH ); j ++ ) {
1152
+ len = min_t (int , cnt - j * MTK_FQ_DMA_LENGTH , MTK_FQ_DMA_LENGTH );
1153
+ eth -> scratch_head [j ] = kcalloc (len , MTK_QDMA_PAGE_SIZE , GFP_KERNEL );
1157
1154
1158
- phy_ring_tail = eth -> phy_scratch_ring + soc -> tx .desc_size * (cnt - 1 );
1155
+ if (unlikely (!eth -> scratch_head [j ]))
1156
+ return - ENOMEM ;
1159
1157
1160
- for ( i = 0 ; i < cnt ; i ++ ) {
1161
- dma_addr_t addr = dma_addr + i * MTK_QDMA_PAGE_SIZE ;
1162
- struct mtk_tx_dma_v2 * txd ;
1158
+ dma_addr = dma_map_single ( eth -> dma_dev ,
1159
+ eth -> scratch_head [ j ], len * MTK_QDMA_PAGE_SIZE ,
1160
+ DMA_FROM_DEVICE ) ;
1163
1161
1164
- txd = eth -> scratch_ring + i * soc -> tx .desc_size ;
1165
- txd -> txd1 = addr ;
1166
- if (i < cnt - 1 )
1167
- txd -> txd2 = eth -> phy_scratch_ring +
1168
- (i + 1 ) * soc -> tx .desc_size ;
1162
+ if (unlikely (dma_mapping_error (eth -> dma_dev , dma_addr )))
1163
+ return - ENOMEM ;
1169
1164
1170
- txd -> txd3 = TX_DMA_PLEN0 (MTK_QDMA_PAGE_SIZE );
1171
- if (MTK_HAS_CAPS (soc -> caps , MTK_36BIT_DMA ))
1172
- txd -> txd3 |= TX_DMA_PREP_ADDR64 (addr );
1173
- txd -> txd4 = 0 ;
1174
- if (mtk_is_netsys_v2_or_greater (eth )) {
1175
- txd -> txd5 = 0 ;
1176
- txd -> txd6 = 0 ;
1177
- txd -> txd7 = 0 ;
1178
- txd -> txd8 = 0 ;
1165
+ for (i = 0 ; i < cnt ; i ++ ) {
1166
+ struct mtk_tx_dma_v2 * txd ;
1167
+
1168
+ txd = eth -> scratch_ring + (j * MTK_FQ_DMA_LENGTH + i ) * soc -> tx .desc_size ;
1169
+ txd -> txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE ;
1170
+ if (j * MTK_FQ_DMA_LENGTH + i < cnt )
1171
+ txd -> txd2 = eth -> phy_scratch_ring +
1172
+ (j * MTK_FQ_DMA_LENGTH + i + 1 ) * soc -> tx .desc_size ;
1173
+
1174
+ txd -> txd3 = TX_DMA_PLEN0 (MTK_QDMA_PAGE_SIZE );
1175
+ if (MTK_HAS_CAPS (soc -> caps , MTK_36BIT_DMA ))
1176
+ txd -> txd3 |= TX_DMA_PREP_ADDR64 (dma_addr + i * MTK_QDMA_PAGE_SIZE );
1177
+
1178
+ txd -> txd4 = 0 ;
1179
+ if (mtk_is_netsys_v2_or_greater (eth )) {
1180
+ txd -> txd5 = 0 ;
1181
+ txd -> txd6 = 0 ;
1182
+ txd -> txd7 = 0 ;
1183
+ txd -> txd8 = 0 ;
1184
+ }
1179
1185
}
1180
1186
}
1181
1187
@@ -2457,16 +2463,16 @@ static int mtk_tx_alloc(struct mtk_eth *eth)
2457
2463
if (MTK_HAS_CAPS (soc -> caps , MTK_QDMA ))
2458
2464
ring_size = MTK_QDMA_RING_SIZE ;
2459
2465
else
2460
- ring_size = MTK_DMA_SIZE ;
2466
+ ring_size = soc -> tx . dma_size ;
2461
2467
2462
2468
ring -> buf = kcalloc (ring_size , sizeof (* ring -> buf ),
2463
2469
GFP_KERNEL );
2464
2470
if (!ring -> buf )
2465
2471
goto no_tx_mem ;
2466
2472
2467
2473
if (MTK_HAS_CAPS (soc -> caps , MTK_SRAM )) {
2468
- ring -> dma = eth -> sram_base + ring_size * sz ;
2469
- ring -> phys = eth -> phy_scratch_ring + ring_size * (dma_addr_t )sz ;
2474
+ ring -> dma = eth -> sram_base + soc -> tx . fq_dma_size * sz ;
2475
+ ring -> phys = eth -> phy_scratch_ring + soc -> tx . fq_dma_size * (dma_addr_t )sz ;
2470
2476
} else {
2471
2477
ring -> dma = dma_alloc_coherent (eth -> dma_dev , ring_size * sz ,
2472
2478
& ring -> phys , GFP_KERNEL );
@@ -2588,14 +2594,15 @@ static void mtk_tx_clean(struct mtk_eth *eth)
2588
2594
static int mtk_rx_alloc (struct mtk_eth * eth , int ring_no , int rx_flag )
2589
2595
{
2590
2596
const struct mtk_reg_map * reg_map = eth -> soc -> reg_map ;
2597
+ const struct mtk_soc_data * soc = eth -> soc ;
2591
2598
struct mtk_rx_ring * ring ;
2592
2599
int rx_data_len , rx_dma_size , tx_ring_size ;
2593
2600
int i ;
2594
2601
2595
2602
if (MTK_HAS_CAPS (eth -> soc -> caps , MTK_QDMA ))
2596
2603
tx_ring_size = MTK_QDMA_RING_SIZE ;
2597
2604
else
2598
- tx_ring_size = MTK_DMA_SIZE ;
2605
+ tx_ring_size = soc -> tx . dma_size ;
2599
2606
2600
2607
if (rx_flag == MTK_RX_FLAGS_QDMA ) {
2601
2608
if (ring_no )
@@ -2610,7 +2617,7 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag)
2610
2617
rx_dma_size = MTK_HW_LRO_DMA_SIZE ;
2611
2618
} else {
2612
2619
rx_data_len = ETH_DATA_LEN ;
2613
- rx_dma_size = MTK_DMA_SIZE ;
2620
+ rx_dma_size = soc -> rx . dma_size ;
2614
2621
}
2615
2622
2616
2623
ring -> frag_size = mtk_max_frag_size (rx_data_len );
@@ -3139,7 +3146,10 @@ static void mtk_dma_free(struct mtk_eth *eth)
3139
3146
mtk_rx_clean (eth , & eth -> rx_ring [i ], false);
3140
3147
}
3141
3148
3142
- kfree (eth -> scratch_head );
3149
+ for (i = 0 ; i < DIV_ROUND_UP (soc -> tx .fq_dma_size , MTK_FQ_DMA_LENGTH ); i ++ ) {
3150
+ kfree (eth -> scratch_head [i ]);
3151
+ eth -> scratch_head [i ] = NULL ;
3152
+ }
3143
3153
}
3144
3154
3145
3155
static bool mtk_hw_reset_check (struct mtk_eth * eth )
@@ -5052,11 +5062,14 @@ static const struct mtk_soc_data mt2701_data = {
5052
5062
.desc_size = sizeof (struct mtk_tx_dma ),
5053
5063
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5054
5064
.dma_len_offset = 16 ,
5065
+ .dma_size = MTK_DMA_SIZE (2 K ),
5066
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5055
5067
},
5056
5068
.rx = {
5057
5069
.desc_size = sizeof (struct mtk_rx_dma ),
5058
5070
.irq_done_mask = MTK_RX_DONE_INT ,
5059
5071
.dma_l4_valid = RX_DMA_L4_VALID ,
5072
+ .dma_size = MTK_DMA_SIZE (2 K ),
5060
5073
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5061
5074
.dma_len_offset = 16 ,
5062
5075
},
@@ -5076,11 +5089,14 @@ static const struct mtk_soc_data mt7621_data = {
5076
5089
.desc_size = sizeof (struct mtk_tx_dma ),
5077
5090
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5078
5091
.dma_len_offset = 16 ,
5092
+ .dma_size = MTK_DMA_SIZE (2 K ),
5093
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5079
5094
},
5080
5095
.rx = {
5081
5096
.desc_size = sizeof (struct mtk_rx_dma ),
5082
5097
.irq_done_mask = MTK_RX_DONE_INT ,
5083
5098
.dma_l4_valid = RX_DMA_L4_VALID ,
5099
+ .dma_size = MTK_DMA_SIZE (2 K ),
5084
5100
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5085
5101
.dma_len_offset = 16 ,
5086
5102
},
@@ -5102,11 +5118,14 @@ static const struct mtk_soc_data mt7622_data = {
5102
5118
.desc_size = sizeof (struct mtk_tx_dma ),
5103
5119
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5104
5120
.dma_len_offset = 16 ,
5121
+ .dma_size = MTK_DMA_SIZE (2 K ),
5122
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5105
5123
},
5106
5124
.rx = {
5107
5125
.desc_size = sizeof (struct mtk_rx_dma ),
5108
5126
.irq_done_mask = MTK_RX_DONE_INT ,
5109
5127
.dma_l4_valid = RX_DMA_L4_VALID ,
5128
+ .dma_size = MTK_DMA_SIZE (2 K ),
5110
5129
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5111
5130
.dma_len_offset = 16 ,
5112
5131
},
@@ -5127,11 +5146,14 @@ static const struct mtk_soc_data mt7623_data = {
5127
5146
.desc_size = sizeof (struct mtk_tx_dma ),
5128
5147
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5129
5148
.dma_len_offset = 16 ,
5149
+ .dma_size = MTK_DMA_SIZE (2 K ),
5150
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5130
5151
},
5131
5152
.rx = {
5132
5153
.desc_size = sizeof (struct mtk_rx_dma ),
5133
5154
.irq_done_mask = MTK_RX_DONE_INT ,
5134
5155
.dma_l4_valid = RX_DMA_L4_VALID ,
5156
+ .dma_size = MTK_DMA_SIZE (2 K ),
5135
5157
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5136
5158
.dma_len_offset = 16 ,
5137
5159
},
@@ -5150,11 +5172,14 @@ static const struct mtk_soc_data mt7629_data = {
5150
5172
.desc_size = sizeof (struct mtk_tx_dma ),
5151
5173
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5152
5174
.dma_len_offset = 16 ,
5175
+ .dma_size = MTK_DMA_SIZE (2 K ),
5176
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5153
5177
},
5154
5178
.rx = {
5155
5179
.desc_size = sizeof (struct mtk_rx_dma ),
5156
5180
.irq_done_mask = MTK_RX_DONE_INT ,
5157
5181
.dma_l4_valid = RX_DMA_L4_VALID ,
5182
+ .dma_size = MTK_DMA_SIZE (2 K ),
5158
5183
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5159
5184
.dma_len_offset = 16 ,
5160
5185
},
@@ -5176,13 +5201,16 @@ static const struct mtk_soc_data mt7981_data = {
5176
5201
.desc_size = sizeof (struct mtk_tx_dma_v2 ),
5177
5202
.dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
5178
5203
.dma_len_offset = 8 ,
5204
+ .dma_size = MTK_DMA_SIZE (2 K ),
5205
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5179
5206
},
5180
5207
.rx = {
5181
5208
.desc_size = sizeof (struct mtk_rx_dma ),
5182
5209
.irq_done_mask = MTK_RX_DONE_INT ,
5183
5210
.dma_l4_valid = RX_DMA_L4_VALID_V2 ,
5184
5211
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5185
5212
.dma_len_offset = 16 ,
5213
+ .dma_size = MTK_DMA_SIZE (2 K ),
5186
5214
},
5187
5215
};
5188
5216
@@ -5202,13 +5230,16 @@ static const struct mtk_soc_data mt7986_data = {
5202
5230
.desc_size = sizeof (struct mtk_tx_dma_v2 ),
5203
5231
.dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
5204
5232
.dma_len_offset = 8 ,
5233
+ .dma_size = MTK_DMA_SIZE (2 K ),
5234
+ .fq_dma_size = MTK_DMA_SIZE (2 K ),
5205
5235
},
5206
5236
.rx = {
5207
5237
.desc_size = sizeof (struct mtk_rx_dma ),
5208
5238
.irq_done_mask = MTK_RX_DONE_INT ,
5209
5239
.dma_l4_valid = RX_DMA_L4_VALID_V2 ,
5210
5240
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5211
5241
.dma_len_offset = 16 ,
5242
+ .dma_size = MTK_DMA_SIZE (2 K ),
5212
5243
},
5213
5244
};
5214
5245
@@ -5228,13 +5259,16 @@ static const struct mtk_soc_data mt7988_data = {
5228
5259
.desc_size = sizeof (struct mtk_tx_dma_v2 ),
5229
5260
.dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
5230
5261
.dma_len_offset = 8 ,
5262
+ .dma_size = MTK_DMA_SIZE (2 K ),
5263
+ .fq_dma_size = MTK_DMA_SIZE (4 K ),
5231
5264
},
5232
5265
.rx = {
5233
5266
.desc_size = sizeof (struct mtk_rx_dma_v2 ),
5234
5267
.irq_done_mask = MTK_RX_DONE_INT_V2 ,
5235
5268
.dma_l4_valid = RX_DMA_L4_VALID_V2 ,
5236
5269
.dma_max_len = MTK_TX_DMA_BUF_LEN_V2 ,
5237
5270
.dma_len_offset = 8 ,
5271
+ .dma_size = MTK_DMA_SIZE (2 K ),
5238
5272
},
5239
5273
};
5240
5274
@@ -5249,13 +5283,15 @@ static const struct mtk_soc_data rt5350_data = {
5249
5283
.desc_size = sizeof (struct mtk_tx_dma ),
5250
5284
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5251
5285
.dma_len_offset = 16 ,
5286
+ .dma_size = MTK_DMA_SIZE (2 K ),
5252
5287
},
5253
5288
.rx = {
5254
5289
.desc_size = sizeof (struct mtk_rx_dma ),
5255
5290
.irq_done_mask = MTK_RX_DONE_INT ,
5256
5291
.dma_l4_valid = RX_DMA_L4_VALID_PDMA ,
5257
5292
.dma_max_len = MTK_TX_DMA_BUF_LEN ,
5258
5293
.dma_len_offset = 16 ,
5294
+ .dma_size = MTK_DMA_SIZE (2 K ),
5259
5295
},
5260
5296
};
5261
5297
0 commit comments