@@ -669,27 +669,37 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
669
669
return - EIO ;
670
670
}
671
671
672
+ static void ionic_tx_desc_unmap_bufs (struct ionic_queue * q ,
673
+ struct ionic_desc_info * desc_info )
674
+ {
675
+ struct ionic_buf_info * buf_info = desc_info -> bufs ;
676
+ struct device * dev = q -> dev ;
677
+ unsigned int i ;
678
+
679
+ if (!desc_info -> nbufs )
680
+ return ;
681
+
682
+ dma_unmap_single (dev , (dma_addr_t )buf_info -> dma_addr ,
683
+ buf_info -> len , DMA_TO_DEVICE );
684
+ buf_info ++ ;
685
+ for (i = 1 ; i < desc_info -> nbufs ; i ++ , buf_info ++ )
686
+ dma_unmap_page (dev , (dma_addr_t )buf_info -> dma_addr ,
687
+ buf_info -> len , DMA_TO_DEVICE );
688
+
689
+ desc_info -> nbufs = 0 ;
690
+ }
691
+
672
692
static void ionic_tx_clean (struct ionic_queue * q ,
673
693
struct ionic_desc_info * desc_info ,
674
694
struct ionic_cq_info * cq_info ,
675
695
void * cb_arg )
676
696
{
677
- struct ionic_buf_info * buf_info = desc_info -> bufs ;
678
697
struct ionic_tx_stats * stats = q_to_tx_stats (q );
679
698
struct ionic_qcq * qcq = q_to_qcq (q );
680
699
struct sk_buff * skb = cb_arg ;
681
- struct device * dev = q -> dev ;
682
- unsigned int i ;
683
700
u16 qi ;
684
701
685
- if (desc_info -> nbufs ) {
686
- dma_unmap_single (dev , (dma_addr_t )buf_info -> dma_addr ,
687
- buf_info -> len , DMA_TO_DEVICE );
688
- buf_info ++ ;
689
- for (i = 1 ; i < desc_info -> nbufs ; i ++ , buf_info ++ )
690
- dma_unmap_page (dev , (dma_addr_t )buf_info -> dma_addr ,
691
- buf_info -> len , DMA_TO_DEVICE );
692
- }
702
+ ionic_tx_desc_unmap_bufs (q , desc_info );
693
703
694
704
if (!skb )
695
705
return ;
@@ -931,8 +941,11 @@ static int ionic_tx_tso(struct ionic_queue *q, struct sk_buff *skb)
931
941
err = ionic_tx_tcp_inner_pseudo_csum (skb );
932
942
else
933
943
err = ionic_tx_tcp_pseudo_csum (skb );
934
- if (err )
944
+ if (err ) {
945
+ /* clean up mapping from ionic_tx_map_skb */
946
+ ionic_tx_desc_unmap_bufs (q , desc_info );
935
947
return err ;
948
+ }
936
949
937
950
if (encap )
938
951
hdrlen = skb_inner_transport_header (skb ) - skb -> data +
@@ -1003,8 +1016,8 @@ static int ionic_tx_tso(struct ionic_queue *q, struct sk_buff *skb)
1003
1016
return 0 ;
1004
1017
}
1005
1018
1006
- static int ionic_tx_calc_csum (struct ionic_queue * q , struct sk_buff * skb ,
1007
- struct ionic_desc_info * desc_info )
1019
+ static void ionic_tx_calc_csum (struct ionic_queue * q , struct sk_buff * skb ,
1020
+ struct ionic_desc_info * desc_info )
1008
1021
{
1009
1022
struct ionic_txq_desc * desc = desc_info -> txq_desc ;
1010
1023
struct ionic_buf_info * buf_info = desc_info -> bufs ;
@@ -1038,12 +1051,10 @@ static int ionic_tx_calc_csum(struct ionic_queue *q, struct sk_buff *skb,
1038
1051
stats -> crc32_csum ++ ;
1039
1052
else
1040
1053
stats -> csum ++ ;
1041
-
1042
- return 0 ;
1043
1054
}
1044
1055
1045
- static int ionic_tx_calc_no_csum (struct ionic_queue * q , struct sk_buff * skb ,
1046
- struct ionic_desc_info * desc_info )
1056
+ static void ionic_tx_calc_no_csum (struct ionic_queue * q , struct sk_buff * skb ,
1057
+ struct ionic_desc_info * desc_info )
1047
1058
{
1048
1059
struct ionic_txq_desc * desc = desc_info -> txq_desc ;
1049
1060
struct ionic_buf_info * buf_info = desc_info -> bufs ;
@@ -1074,12 +1085,10 @@ static int ionic_tx_calc_no_csum(struct ionic_queue *q, struct sk_buff *skb,
1074
1085
desc -> csum_offset = 0 ;
1075
1086
1076
1087
stats -> csum_none ++ ;
1077
-
1078
- return 0 ;
1079
1088
}
1080
1089
1081
- static int ionic_tx_skb_frags (struct ionic_queue * q , struct sk_buff * skb ,
1082
- struct ionic_desc_info * desc_info )
1090
+ static void ionic_tx_skb_frags (struct ionic_queue * q , struct sk_buff * skb ,
1091
+ struct ionic_desc_info * desc_info )
1083
1092
{
1084
1093
struct ionic_txq_sg_desc * sg_desc = desc_info -> txq_sg_desc ;
1085
1094
struct ionic_buf_info * buf_info = & desc_info -> bufs [1 ];
@@ -1093,31 +1102,24 @@ static int ionic_tx_skb_frags(struct ionic_queue *q, struct sk_buff *skb,
1093
1102
}
1094
1103
1095
1104
stats -> frags += skb_shinfo (skb )-> nr_frags ;
1096
-
1097
- return 0 ;
1098
1105
}
1099
1106
1100
1107
static int ionic_tx (struct ionic_queue * q , struct sk_buff * skb )
1101
1108
{
1102
1109
struct ionic_desc_info * desc_info = & q -> info [q -> head_idx ];
1103
1110
struct ionic_tx_stats * stats = q_to_tx_stats (q );
1104
- int err ;
1105
1111
1106
1112
if (unlikely (ionic_tx_map_skb (q , skb , desc_info )))
1107
1113
return - EIO ;
1108
1114
1109
1115
/* set up the initial descriptor */
1110
1116
if (skb -> ip_summed == CHECKSUM_PARTIAL )
1111
- err = ionic_tx_calc_csum (q , skb , desc_info );
1117
+ ionic_tx_calc_csum (q , skb , desc_info );
1112
1118
else
1113
- err = ionic_tx_calc_no_csum (q , skb , desc_info );
1114
- if (err )
1115
- return err ;
1119
+ ionic_tx_calc_no_csum (q , skb , desc_info );
1116
1120
1117
1121
/* add frags */
1118
- err = ionic_tx_skb_frags (q , skb , desc_info );
1119
- if (err )
1120
- return err ;
1122
+ ionic_tx_skb_frags (q , skb , desc_info );
1121
1123
1122
1124
skb_tx_timestamp (skb );
1123
1125
stats -> pkts ++ ;
0 commit comments