@@ -2543,6 +2543,43 @@ static int nix_af_mark_format_setup(struct rvu *rvu, struct nix_hw *nix_hw,
25432543 return 0 ;
25442544}
25452545
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+
25462583int rvu_mbox_handler_nix_stats_rst (struct rvu * rvu , struct msg_req * req ,
25472584 struct msg_rsp * rsp )
25482585{
@@ -3107,6 +3144,7 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
31073144 u64 cfg , lmac_fifo_len ;
31083145 struct nix_hw * nix_hw ;
31093146 u8 cgx = 0 , lmac = 0 ;
3147+ u16 max_mtu ;
31103148
31113149 blkaddr = rvu_get_blkaddr (rvu , BLKTYPE_NIX , pcifunc );
31123150 if (blkaddr < 0 )
@@ -3116,7 +3154,12 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
31163154 if (!nix_hw )
31173155 return - EINVAL ;
31183156
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 )
31203163 return NIX_AF_ERR_FRS_INVALID ;
31213164
31223165 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,
31763219
31773220 /* Update transmit credits for CGX links */
31783221 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 ));
31803224 cfg = rvu_read64 (rvu , blkaddr , NIX_AF_TX_LINKX_NORM_CREDIT (link ));
31813225 cfg &= ~(0xFFFFFULL << 12 );
31823226 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,
32163260 return 0 ;
32173261}
32183262
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+
32193272static void nix_link_config (struct rvu * rvu , int blkaddr )
32203273{
32213274 struct rvu_hwinfo * hw = rvu -> hw ;
32223275 int cgx , lmac_cnt , slink , link ;
3276+ u16 lbk_max_frs , lmac_max_frs ;
32233277 u64 tx_credits ;
32243278
3279+ rvu_get_lbk_link_max_frs (rvu , & lbk_max_frs );
3280+ rvu_get_lmac_link_max_frs (rvu , & lmac_max_frs );
3281+
32253282 /* Set default min/max packet lengths allowed on NIX Rx links.
32263283 *
32273284 * With HW reset minlen value of 60byte, HW will treat ARP pkts
32283285 * as undersize and report them to SW as error pkts, hence
32293286 * setting it to 40 bytes.
32303287 */
3231- for (link = 0 ; link < ( hw -> cgx_links + hw -> lbk_links ) ; link ++ ) {
3288+ for (link = 0 ; link < hw -> cgx_links ; link ++ ) {
32323289 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 );
32343291 }
32353292
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+ }
32363297 if (hw -> sdp_links ) {
32373298 link = hw -> cgx_links + hw -> lbk_links ;
32383299 rvu_write64 (rvu , blkaddr , NIX_AF_RX_LINKX_CFG (link ),
@@ -3244,7 +3305,8 @@ static void nix_link_config(struct rvu *rvu, int blkaddr)
32443305 */
32453306 for (cgx = 0 ; cgx < hw -> cgx ; cgx ++ ) {
32463307 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 ;
32483310 /* Enable credits and set credit pkt count to max allowed */
32493311 tx_credits = (tx_credits << 12 ) | (0x1FF << 2 ) | BIT_ULL (1 );
32503312 slink = cgx * hw -> lmac_per_cgx ;
@@ -3258,7 +3320,7 @@ static void nix_link_config(struct rvu *rvu, int blkaddr)
32583320 /* Set Tx credits for LBK link */
32593321 slink = hw -> cgx_links ;
32603322 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 );
32623324 /* Enable credits and set credit pkt count to max allowed */
32633325 tx_credits = (tx_credits << 12 ) | (0x1FF << 2 ) | BIT_ULL (1 );
32643326 rvu_write64 (rvu , blkaddr ,
0 commit comments