@@ -147,10 +147,11 @@ void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len)
147147
148148 phy_fw_ver [0 ] = '\0' ;
149149 bnx2x_get_ext_phy_fw_version (& bp -> link_params ,
150- phy_fw_ver , PHY_FW_VER_LEN );
151- strscpy (buf , bp -> fw_ver , buf_len );
152- snprintf (buf + strlen (bp -> fw_ver ), 32 - strlen (bp -> fw_ver ),
153- "bc %d.%d.%d%s%s" ,
150+ phy_fw_ver , sizeof (phy_fw_ver ));
151+ /* This may become truncated. */
152+ scnprintf (buf , buf_len ,
153+ "%sbc %d.%d.%d%s%s" ,
154+ bp -> fw_ver ,
154155 (bp -> common .bc_ver & 0xff0000 ) >> 16 ,
155156 (bp -> common .bc_ver & 0xff00 ) >> 8 ,
156157 (bp -> common .bc_ver & 0xff ),
@@ -672,6 +673,18 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
672673 return 0 ;
673674}
674675
676+ static struct sk_buff *
677+ bnx2x_build_skb (const struct bnx2x_fastpath * fp , void * data )
678+ {
679+ struct sk_buff * skb ;
680+
681+ if (fp -> rx_frag_size )
682+ skb = build_skb (data , fp -> rx_frag_size );
683+ else
684+ skb = slab_build_skb (data );
685+ return skb ;
686+ }
687+
675688static void bnx2x_frag_free (const struct bnx2x_fastpath * fp , void * data )
676689{
677690 if (fp -> rx_frag_size )
@@ -779,14 +792,15 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
779792 dma_unmap_single (& bp -> pdev -> dev , dma_unmap_addr (rx_buf , mapping ),
780793 fp -> rx_buf_size , DMA_FROM_DEVICE );
781794 if (likely (new_data ))
782- skb = build_skb ( data , fp -> rx_frag_size );
795+ skb = bnx2x_build_skb ( fp , data );
783796
784797 if (likely (skb )) {
785798#ifdef BNX2X_STOP_ON_ERROR
786799 if (pad + len > fp -> rx_buf_size ) {
787800 BNX2X_ERR ("skb_put is about to fail... pad %d len %d rx_buf_size %d\n" ,
788801 pad , len , fp -> rx_buf_size );
789802 bnx2x_panic ();
803+ bnx2x_frag_free (fp , new_data );
790804 return ;
791805 }
792806#endif
@@ -1045,7 +1059,7 @@ static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
10451059 dma_unmap_addr (rx_buf , mapping ),
10461060 fp -> rx_buf_size ,
10471061 DMA_FROM_DEVICE );
1048- skb = build_skb ( data , fp -> rx_frag_size );
1062+ skb = bnx2x_build_skb ( fp , data );
10491063 if (unlikely (!skb )) {
10501064 bnx2x_frag_free (fp , data );
10511065 bnx2x_fp_qstats (bp , fp )->
@@ -2702,6 +2716,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
27022716 bnx2x_add_all_napi (bp );
27032717 DP (NETIF_MSG_IFUP , "napi added\n" );
27042718 bnx2x_napi_enable (bp );
2719+ bp -> nic_stopped = false;
27052720
27062721 if (IS_PF (bp )) {
27072722 /* set pf load just before approaching the MCP */
@@ -2947,6 +2962,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
29472962load_error1 :
29482963 bnx2x_napi_disable (bp );
29492964 bnx2x_del_all_napi (bp );
2965+ bp -> nic_stopped = true;
29502966
29512967 /* clear pf_load status, as it was already set */
29522968 if (IS_PF (bp ))
@@ -3082,14 +3098,17 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
30823098 if (!CHIP_IS_E1x (bp ))
30833099 bnx2x_pf_disable (bp );
30843100
3085- /* Disable HW interrupts, NAPI */
3086- bnx2x_netif_stop (bp , 1 );
3087- /* Delete all NAPI objects */
3088- bnx2x_del_all_napi (bp );
3089- if (CNIC_LOADED (bp ))
3090- bnx2x_del_all_napi_cnic (bp );
3091- /* Release IRQs */
3092- bnx2x_free_irq (bp );
3101+ if (!bp -> nic_stopped ) {
3102+ /* Disable HW interrupts, NAPI */
3103+ bnx2x_netif_stop (bp , 1 );
3104+ /* Delete all NAPI objects */
3105+ bnx2x_del_all_napi (bp );
3106+ if (CNIC_LOADED (bp ))
3107+ bnx2x_del_all_napi_cnic (bp );
3108+ /* Release IRQs */
3109+ bnx2x_free_irq (bp );
3110+ bp -> nic_stopped = true;
3111+ }
30933112
30943113 /* Report UNLOAD_DONE to MCP */
30953114 bnx2x_send_unload_done (bp , false);
0 commit comments