@@ -2459,6 +2459,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24592459 skb -> data ,
24602460 skb_headlen (skb ),
24612461 DMA_TO_DEVICE );
2462+ if (dma_mapping_error (& adapter -> pdev -> dev ,
2463+ dma_addr ))
2464+ return - ENOMEM ;
2465+
24622466 desc [frag ].addr_lo = lower_32_bits (dma_addr );
24632467 desc [frag ].addr_hi = upper_32_bits (dma_addr );
24642468 frag ++ ;
@@ -2468,6 +2472,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24682472 skb -> data ,
24692473 skb_headlen (skb ) / 2 ,
24702474 DMA_TO_DEVICE );
2475+ if (dma_mapping_error (& adapter -> pdev -> dev ,
2476+ dma_addr ))
2477+ return - ENOMEM ;
2478+
24712479 desc [frag ].addr_lo = lower_32_bits (dma_addr );
24722480 desc [frag ].addr_hi = upper_32_bits (dma_addr );
24732481 frag ++ ;
@@ -2478,6 +2486,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24782486 skb_headlen (skb ) / 2 ,
24792487 skb_headlen (skb ) / 2 ,
24802488 DMA_TO_DEVICE );
2489+ if (dma_mapping_error (& adapter -> pdev -> dev ,
2490+ dma_addr ))
2491+ goto unmap_first_out ;
2492+
24812493 desc [frag ].addr_lo = lower_32_bits (dma_addr );
24822494 desc [frag ].addr_hi = upper_32_bits (dma_addr );
24832495 frag ++ ;
@@ -2489,6 +2501,9 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
24892501 0 ,
24902502 desc [frag ].len_vlan ,
24912503 DMA_TO_DEVICE );
2504+ if (dma_mapping_error (& adapter -> pdev -> dev , dma_addr ))
2505+ goto unmap_out ;
2506+
24922507 desc [frag ].addr_lo = lower_32_bits (dma_addr );
24932508 desc [frag ].addr_hi = upper_32_bits (dma_addr );
24942509 frag ++ ;
@@ -2578,6 +2593,27 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
25782593 & adapter -> regs -> global .watchdog_timer );
25792594 }
25802595 return 0 ;
2596+
2597+ unmap_out :
2598+ // Unmap the body of the packet with map_page
2599+ while (-- i ) {
2600+ frag -- ;
2601+ dma_addr = desc [frag ].addr_lo ;
2602+ dma_addr |= (u64 )desc [frag ].addr_hi << 32 ;
2603+ dma_unmap_page (& adapter -> pdev -> dev , dma_addr ,
2604+ desc [frag ].len_vlan , DMA_TO_DEVICE );
2605+ }
2606+
2607+ unmap_first_out :
2608+ // Unmap the header with map_single
2609+ while (frag -- ) {
2610+ dma_addr = desc [frag ].addr_lo ;
2611+ dma_addr |= (u64 )desc [frag ].addr_hi << 32 ;
2612+ dma_unmap_single (& adapter -> pdev -> dev , dma_addr ,
2613+ desc [frag ].len_vlan , DMA_TO_DEVICE );
2614+ }
2615+
2616+ return - ENOMEM ;
25812617}
25822618
25832619static int send_packet (struct sk_buff * skb , struct et131x_adapter * adapter )
0 commit comments