Skip to content

Commit c460b74

Browse files
Bharat Bhushandavem330
authored andcommitted
octeontx2-pf: Move skb fragment map/unmap to common code
Move skb fragment map/unmap function to common file so as to reuse same for outbound IPsec crypto offload Signed-off-by: Bharat Bhushan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 195c3d4 commit c460b74

File tree

3 files changed

+50
-46
lines changed

3 files changed

+50
-46
lines changed

drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <net/page_pool/helpers.h>
1111
#include <net/tso.h>
1212
#include <linux/bitfield.h>
13+
#include <net/xfrm.h>
1314

1415
#include "otx2_reg.h"
1516
#include "otx2_common.h"
@@ -1947,3 +1948,48 @@ EXPORT_SYMBOL(otx2_mbox_up_handler_ ## _fn_name);
19471948
MBOX_UP_CGX_MESSAGES
19481949
MBOX_UP_MCS_MESSAGES
19491950
#undef M
1951+
1952+
dma_addr_t otx2_dma_map_skb_frag(struct otx2_nic *pfvf,
1953+
struct sk_buff *skb, int seg, int *len)
1954+
{
1955+
enum dma_data_direction dir = DMA_TO_DEVICE;
1956+
const skb_frag_t *frag;
1957+
struct page *page;
1958+
int offset;
1959+
1960+
/* Crypto hardware need write permission for ipsec crypto offload */
1961+
if (unlikely(xfrm_offload(skb))) {
1962+
dir = DMA_BIDIRECTIONAL;
1963+
skb = skb_unshare(skb, GFP_ATOMIC);
1964+
}
1965+
1966+
/* First segment is always skb->data */
1967+
if (!seg) {
1968+
page = virt_to_page(skb->data);
1969+
offset = offset_in_page(skb->data);
1970+
*len = skb_headlen(skb);
1971+
} else {
1972+
frag = &skb_shinfo(skb)->frags[seg - 1];
1973+
page = skb_frag_page(frag);
1974+
offset = skb_frag_off(frag);
1975+
*len = skb_frag_size(frag);
1976+
}
1977+
return otx2_dma_map_page(pfvf, page, offset, *len, dir);
1978+
}
1979+
1980+
void otx2_dma_unmap_skb_frags(struct otx2_nic *pfvf, struct sg_list *sg)
1981+
{
1982+
enum dma_data_direction dir = DMA_TO_DEVICE;
1983+
struct sk_buff *skb = NULL;
1984+
int seg;
1985+
1986+
skb = (struct sk_buff *)sg->skb;
1987+
if (unlikely(xfrm_offload(skb)))
1988+
dir = DMA_BIDIRECTIONAL;
1989+
1990+
for (seg = 0; seg < sg->num_segs; seg++) {
1991+
otx2_dma_unmap_page(pfvf, sg->dma_addr[seg],
1992+
sg->size[seg], dir);
1993+
}
1994+
sg->num_segs = 0;
1995+
}

drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,4 +1149,8 @@ static inline int mcam_entry_cmp(const void *a, const void *b)
11491149
{
11501150
return *(u16 *)a - *(u16 *)b;
11511151
}
1152+
1153+
dma_addr_t otx2_dma_map_skb_frag(struct otx2_nic *pfvf,
1154+
struct sk_buff *skb, int seg, int *len);
1155+
void otx2_dma_unmap_skb_frags(struct otx2_nic *pfvf, struct sg_list *sg);
11521156
#endif /* OTX2_COMMON_H */

drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include <linux/bpf.h>
1212
#include <linux/bpf_trace.h>
1313
#include <net/ip6_checksum.h>
14-
#include <net/xfrm.h>
1514

1615
#include "otx2_reg.h"
1716
#include "otx2_common.h"
@@ -81,51 +80,6 @@ static unsigned int frag_num(unsigned int i)
8180
#endif
8281
}
8382

84-
static dma_addr_t otx2_dma_map_skb_frag(struct otx2_nic *pfvf,
85-
struct sk_buff *skb, int seg, int *len)
86-
{
87-
enum dma_data_direction dir = DMA_TO_DEVICE;
88-
const skb_frag_t *frag;
89-
struct page *page;
90-
int offset;
91-
92-
/* Crypto hardware need write permission for ipsec crypto offload */
93-
if (unlikely(xfrm_offload(skb))) {
94-
dir = DMA_BIDIRECTIONAL;
95-
skb = skb_unshare(skb, GFP_ATOMIC);
96-
}
97-
98-
/* First segment is always skb->data */
99-
if (!seg) {
100-
page = virt_to_page(skb->data);
101-
offset = offset_in_page(skb->data);
102-
*len = skb_headlen(skb);
103-
} else {
104-
frag = &skb_shinfo(skb)->frags[seg - 1];
105-
page = skb_frag_page(frag);
106-
offset = skb_frag_off(frag);
107-
*len = skb_frag_size(frag);
108-
}
109-
return otx2_dma_map_page(pfvf, page, offset, *len, dir);
110-
}
111-
112-
static void otx2_dma_unmap_skb_frags(struct otx2_nic *pfvf, struct sg_list *sg)
113-
{
114-
enum dma_data_direction dir = DMA_TO_DEVICE;
115-
struct sk_buff *skb = NULL;
116-
int seg;
117-
118-
skb = (struct sk_buff *)sg->skb;
119-
if (unlikely(xfrm_offload(skb)))
120-
dir = DMA_BIDIRECTIONAL;
121-
122-
for (seg = 0; seg < sg->num_segs; seg++) {
123-
otx2_dma_unmap_page(pfvf, sg->dma_addr[seg],
124-
sg->size[seg], dir);
125-
}
126-
sg->num_segs = 0;
127-
}
128-
12983
static void otx2_xdp_snd_pkt_handler(struct otx2_nic *pfvf,
13084
struct otx2_snd_queue *sq,
13185
struct nix_cqe_tx_s *cqe)

0 commit comments

Comments
 (0)