18
18
#include "q_struct.h"
19
19
#include "nicvf_queues.h"
20
20
21
- struct rbuf_info {
22
- struct page * page ;
23
- void * data ;
24
- u64 offset ;
25
- };
26
-
27
- #define GET_RBUF_INFO (x ) ((struct rbuf_info *)(x - NICVF_RCV_BUF_ALIGN_BYTES))
28
-
29
21
/* Poll a register for a specific value */
30
22
static int nicvf_poll_reg (struct nicvf * nic , int qidx ,
31
23
u64 reg , int bit_pos , int bits , int val )
@@ -86,8 +78,6 @@ static void nicvf_free_q_desc_mem(struct nicvf *nic, struct q_desc_mem *dmem)
86
78
static inline int nicvf_alloc_rcv_buffer (struct nicvf * nic , gfp_t gfp ,
87
79
u32 buf_len , u64 * * rbuf )
88
80
{
89
- u64 data ;
90
- struct rbuf_info * rinfo ;
91
81
int order = get_order (buf_len );
92
82
93
83
/* Check if request can be accomodated in previous allocated page */
@@ -113,46 +103,28 @@ static inline int nicvf_alloc_rcv_buffer(struct nicvf *nic, gfp_t gfp,
113
103
nic -> rb_page_offset = 0 ;
114
104
}
115
105
116
- data = (u64 )page_address (nic -> rb_page ) + nic -> rb_page_offset ;
117
-
118
- /* Align buffer addr to cache line i.e 128 bytes */
119
- rinfo = (struct rbuf_info * )(data + NICVF_RCV_BUF_ALIGN_LEN (data ));
120
- /* Save page address for reference updation */
121
- rinfo -> page = nic -> rb_page ;
122
- /* Store start address for later retrieval */
123
- rinfo -> data = (void * )data ;
124
- /* Store alignment offset */
125
- rinfo -> offset = NICVF_RCV_BUF_ALIGN_LEN (data );
106
+ * rbuf = (u64 * )((u64 )page_address (nic -> rb_page ) + nic -> rb_page_offset );
126
107
127
- data += rinfo -> offset ;
128
-
129
- /* Give next aligned address to hw for DMA */
130
- * rbuf = (u64 * )(data + NICVF_RCV_BUF_ALIGN_BYTES );
131
108
return 0 ;
132
109
}
133
110
134
- /* Retrieve actual buffer start address and build skb for received packet */
111
+ /* Build skb around receive buffer */
135
112
static struct sk_buff * nicvf_rb_ptr_to_skb (struct nicvf * nic ,
136
113
u64 rb_ptr , int len )
137
114
{
115
+ void * data ;
138
116
struct sk_buff * skb ;
139
- struct rbuf_info * rinfo ;
140
117
141
- rb_ptr = (u64 )phys_to_virt (rb_ptr );
142
- /* Get buffer start address and alignment offset */
143
- rinfo = GET_RBUF_INFO (rb_ptr );
118
+ data = phys_to_virt (rb_ptr );
144
119
145
120
/* Now build an skb to give to stack */
146
- skb = build_skb (rinfo -> data , RCV_FRAG_LEN );
121
+ skb = build_skb (data , RCV_FRAG_LEN );
147
122
if (!skb ) {
148
- put_page (rinfo -> page );
123
+ put_page (virt_to_page ( data ) );
149
124
return NULL ;
150
125
}
151
126
152
- /* Set correct skb->data */
153
- skb_reserve (skb , rinfo -> offset + NICVF_RCV_BUF_ALIGN_BYTES );
154
-
155
- prefetch ((void * )rb_ptr );
127
+ prefetch (skb -> data );
156
128
return skb ;
157
129
}
158
130
@@ -196,7 +168,6 @@ static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
196
168
int head , tail ;
197
169
u64 buf_addr ;
198
170
struct rbdr_entry_t * desc ;
199
- struct rbuf_info * rinfo ;
200
171
201
172
if (!rbdr )
202
173
return ;
@@ -212,16 +183,14 @@ static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
212
183
while (head != tail ) {
213
184
desc = GET_RBDR_DESC (rbdr , head );
214
185
buf_addr = desc -> buf_addr << NICVF_RCV_BUF_ALIGN ;
215
- rinfo = GET_RBUF_INFO ((u64 )phys_to_virt (buf_addr ));
216
- put_page (rinfo -> page );
186
+ put_page (virt_to_page (phys_to_virt (buf_addr )));
217
187
head ++ ;
218
188
head &= (rbdr -> dmem .q_len - 1 );
219
189
}
220
190
/* Free SKB of tail desc */
221
191
desc = GET_RBDR_DESC (rbdr , tail );
222
192
buf_addr = desc -> buf_addr << NICVF_RCV_BUF_ALIGN ;
223
- rinfo = GET_RBUF_INFO ((u64 )phys_to_virt (buf_addr ));
224
- put_page (rinfo -> page );
193
+ put_page (virt_to_page (phys_to_virt (buf_addr )));
225
194
226
195
/* Free RBDR ring */
227
196
nicvf_free_q_desc_mem (nic , & rbdr -> dmem );
0 commit comments