@@ -2543,6 +2543,43 @@ static int nix_af_mark_format_setup(struct rvu *rvu, struct nix_hw *nix_hw,
2543
2543
return 0 ;
2544
2544
}
2545
2545
2546
+ static void rvu_get_lbk_link_max_frs (struct rvu * rvu , u16 * max_mtu )
2547
+ {
2548
+ /* CN10K supports LBK FIFO size 72 KB */
2549
+ if (rvu -> hw -> lbk_bufsize == 0x12000 )
2550
+ * max_mtu = CN10K_LBK_LINK_MAX_FRS ;
2551
+ else
2552
+ * max_mtu = NIC_HW_MAX_FRS ;
2553
+ }
2554
+
2555
+ static void rvu_get_lmac_link_max_frs (struct rvu * rvu , u16 * max_mtu )
2556
+ {
2557
+ /* RPM supports FIFO len 128 KB */
2558
+ if (rvu_cgx_get_fifolen (rvu ) == 0x20000 )
2559
+ * max_mtu = CN10K_LMAC_LINK_MAX_FRS ;
2560
+ else
2561
+ * max_mtu = NIC_HW_MAX_FRS ;
2562
+ }
2563
+
2564
+ int rvu_mbox_handler_nix_get_hw_info (struct rvu * rvu , struct msg_req * req ,
2565
+ struct nix_hw_info * rsp )
2566
+ {
2567
+ u16 pcifunc = req -> hdr .pcifunc ;
2568
+ int blkaddr ;
2569
+
2570
+ blkaddr = rvu_get_blkaddr (rvu , BLKTYPE_NIX , pcifunc );
2571
+ if (blkaddr < 0 )
2572
+ return NIX_AF_ERR_AF_LF_INVALID ;
2573
+
2574
+ if (is_afvf (pcifunc ))
2575
+ rvu_get_lbk_link_max_frs (rvu , & rsp -> max_mtu );
2576
+ else
2577
+ rvu_get_lmac_link_max_frs (rvu , & rsp -> max_mtu );
2578
+
2579
+ rsp -> min_mtu = NIC_HW_MIN_FRS ;
2580
+ return 0 ;
2581
+ }
2582
+
2546
2583
int rvu_mbox_handler_nix_stats_rst (struct rvu * rvu , struct msg_req * req ,
2547
2584
struct msg_rsp * rsp )
2548
2585
{
@@ -3107,6 +3144,7 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
3107
3144
u64 cfg , lmac_fifo_len ;
3108
3145
struct nix_hw * nix_hw ;
3109
3146
u8 cgx = 0 , lmac = 0 ;
3147
+ u16 max_mtu ;
3110
3148
3111
3149
blkaddr = rvu_get_blkaddr (rvu , BLKTYPE_NIX , pcifunc );
3112
3150
if (blkaddr < 0 )
@@ -3116,7 +3154,12 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
3116
3154
if (!nix_hw )
3117
3155
return - EINVAL ;
3118
3156
3119
- if (!req -> sdp_link && req -> maxlen > NIC_HW_MAX_FRS )
3157
+ if (is_afvf (pcifunc ))
3158
+ rvu_get_lbk_link_max_frs (rvu , & max_mtu );
3159
+ else
3160
+ rvu_get_lmac_link_max_frs (rvu , & max_mtu );
3161
+
3162
+ if (!req -> sdp_link && req -> maxlen > max_mtu )
3120
3163
return NIX_AF_ERR_FRS_INVALID ;
3121
3164
3122
3165
if (req -> update_minlen && req -> minlen < NIC_HW_MIN_FRS )
@@ -3176,7 +3219,8 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
3176
3219
3177
3220
/* Update transmit credits for CGX links */
3178
3221
lmac_fifo_len =
3179
- CGX_FIFO_LEN / cgx_get_lmac_cnt (rvu_cgx_pdata (cgx , rvu ));
3222
+ rvu_cgx_get_fifolen (rvu ) /
3223
+ cgx_get_lmac_cnt (rvu_cgx_pdata (cgx , rvu ));
3180
3224
cfg = rvu_read64 (rvu , blkaddr , NIX_AF_TX_LINKX_NORM_CREDIT (link ));
3181
3225
cfg &= ~(0xFFFFFULL << 12 );
3182
3226
cfg |= ((lmac_fifo_len - req -> maxlen ) / 16 ) << 12 ;
@@ -3216,23 +3260,40 @@ int rvu_mbox_handler_nix_set_rx_cfg(struct rvu *rvu, struct nix_rx_cfg *req,
3216
3260
return 0 ;
3217
3261
}
3218
3262
3263
+ static u64 rvu_get_lbk_link_credits (struct rvu * rvu , u16 lbk_max_frs )
3264
+ {
3265
+ /* CN10k supports 72KB FIFO size and max packet size of 64k */
3266
+ if (rvu -> hw -> lbk_bufsize == 0x12000 )
3267
+ return (rvu -> hw -> lbk_bufsize - lbk_max_frs ) / 16 ;
3268
+
3269
+ return 1600 ; /* 16 * max LBK datarate = 16 * 100Gbps */
3270
+ }
3271
+
3219
3272
static void nix_link_config (struct rvu * rvu , int blkaddr )
3220
3273
{
3221
3274
struct rvu_hwinfo * hw = rvu -> hw ;
3222
3275
int cgx , lmac_cnt , slink , link ;
3276
+ u16 lbk_max_frs , lmac_max_frs ;
3223
3277
u64 tx_credits ;
3224
3278
3279
+ rvu_get_lbk_link_max_frs (rvu , & lbk_max_frs );
3280
+ rvu_get_lmac_link_max_frs (rvu , & lmac_max_frs );
3281
+
3225
3282
/* Set default min/max packet lengths allowed on NIX Rx links.
3226
3283
*
3227
3284
* With HW reset minlen value of 60byte, HW will treat ARP pkts
3228
3285
* as undersize and report them to SW as error pkts, hence
3229
3286
* setting it to 40 bytes.
3230
3287
*/
3231
- for (link = 0 ; link < ( hw -> cgx_links + hw -> lbk_links ) ; link ++ ) {
3288
+ for (link = 0 ; link < hw -> cgx_links ; link ++ ) {
3232
3289
rvu_write64 (rvu , blkaddr , NIX_AF_RX_LINKX_CFG (link ),
3233
- NIC_HW_MAX_FRS << 16 | NIC_HW_MIN_FRS );
3290
+ (( u64 ) lmac_max_frs << 16 ) | NIC_HW_MIN_FRS );
3234
3291
}
3235
3292
3293
+ for (link = hw -> cgx_links ; link < hw -> lbk_links ; link ++ ) {
3294
+ rvu_write64 (rvu , blkaddr , NIX_AF_RX_LINKX_CFG (link ),
3295
+ ((u64 )lbk_max_frs << 16 ) | NIC_HW_MIN_FRS );
3296
+ }
3236
3297
if (hw -> sdp_links ) {
3237
3298
link = hw -> cgx_links + hw -> lbk_links ;
3238
3299
rvu_write64 (rvu , blkaddr , NIX_AF_RX_LINKX_CFG (link ),
@@ -3244,7 +3305,8 @@ static void nix_link_config(struct rvu *rvu, int blkaddr)
3244
3305
*/
3245
3306
for (cgx = 0 ; cgx < hw -> cgx ; cgx ++ ) {
3246
3307
lmac_cnt = cgx_get_lmac_cnt (rvu_cgx_pdata (cgx , rvu ));
3247
- tx_credits = ((CGX_FIFO_LEN / lmac_cnt ) - NIC_HW_MAX_FRS ) / 16 ;
3308
+ tx_credits = ((rvu_cgx_get_fifolen (rvu ) / lmac_cnt ) -
3309
+ lmac_max_frs ) / 16 ;
3248
3310
/* Enable credits and set credit pkt count to max allowed */
3249
3311
tx_credits = (tx_credits << 12 ) | (0x1FF << 2 ) | BIT_ULL (1 );
3250
3312
slink = cgx * hw -> lmac_per_cgx ;
@@ -3258,7 +3320,7 @@ static void nix_link_config(struct rvu *rvu, int blkaddr)
3258
3320
/* Set Tx credits for LBK link */
3259
3321
slink = hw -> cgx_links ;
3260
3322
for (link = slink ; link < (slink + hw -> lbk_links ); link ++ ) {
3261
- tx_credits = 1000 ; /* 10 * max LBK datarate = 10 * 100Gbps */
3323
+ tx_credits = rvu_get_lbk_link_credits ( rvu , lbk_max_frs );
3262
3324
/* Enable credits and set credit pkt count to max allowed */
3263
3325
tx_credits = (tx_credits << 12 ) | (0x1FF << 2 ) | BIT_ULL (1 );
3264
3326
rvu_write64 (rvu , blkaddr ,
0 commit comments