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 );
@@ -1234,153 +1203,93 @@ struct sk_buff *nicvf_get_rcv_skb(struct nicvf *nic, struct cqe_rx_t *cqe_rx)
1234
1203
return skb ;
1235
1204
}
1236
1205
1237
- /* Enable interrupt */
1238
- void nicvf_enable_intr (struct nicvf * nic , int int_type , int q_idx )
1206
+ static u64 nicvf_int_type_to_mask (int int_type , int q_idx )
1239
1207
{
1240
1208
u64 reg_val ;
1241
1209
1242
- reg_val = nicvf_reg_read (nic , NIC_VF_ENA_W1S );
1243
-
1244
1210
switch (int_type ) {
1245
1211
case NICVF_INTR_CQ :
1246
- reg_val | = ((1ULL << q_idx ) << NICVF_INTR_CQ_SHIFT );
1212
+ reg_val = ((1ULL << q_idx ) << NICVF_INTR_CQ_SHIFT );
1247
1213
break ;
1248
1214
case NICVF_INTR_SQ :
1249
- reg_val | = ((1ULL << q_idx ) << NICVF_INTR_SQ_SHIFT );
1215
+ reg_val = ((1ULL << q_idx ) << NICVF_INTR_SQ_SHIFT );
1250
1216
break ;
1251
1217
case NICVF_INTR_RBDR :
1252
- reg_val | = ((1ULL << q_idx ) << NICVF_INTR_RBDR_SHIFT );
1218
+ reg_val = ((1ULL << q_idx ) << NICVF_INTR_RBDR_SHIFT );
1253
1219
break ;
1254
1220
case NICVF_INTR_PKT_DROP :
1255
- reg_val | = (1ULL << NICVF_INTR_PKT_DROP_SHIFT );
1221
+ reg_val = (1ULL << NICVF_INTR_PKT_DROP_SHIFT );
1256
1222
break ;
1257
1223
case NICVF_INTR_TCP_TIMER :
1258
- reg_val | = (1ULL << NICVF_INTR_TCP_TIMER_SHIFT );
1224
+ reg_val = (1ULL << NICVF_INTR_TCP_TIMER_SHIFT );
1259
1225
break ;
1260
1226
case NICVF_INTR_MBOX :
1261
- reg_val | = (1ULL << NICVF_INTR_MBOX_SHIFT );
1227
+ reg_val = (1ULL << NICVF_INTR_MBOX_SHIFT );
1262
1228
break ;
1263
1229
case NICVF_INTR_QS_ERR :
1264
- reg_val | = (1ULL << NICVF_INTR_QS_ERR_SHIFT );
1230
+ reg_val = (1ULL << NICVF_INTR_QS_ERR_SHIFT );
1265
1231
break ;
1266
1232
default :
1267
- netdev_err (nic -> netdev ,
1268
- "Failed to enable interrupt: unknown type\n" );
1269
- break ;
1233
+ reg_val = 0 ;
1270
1234
}
1271
1235
1272
- nicvf_reg_write (nic , NIC_VF_ENA_W1S , reg_val );
1236
+ return reg_val ;
1237
+ }
1238
+
1239
+ /* Enable interrupt */
1240
+ void nicvf_enable_intr (struct nicvf * nic , int int_type , int q_idx )
1241
+ {
1242
+ u64 mask = nicvf_int_type_to_mask (int_type , q_idx );
1243
+
1244
+ if (!mask ) {
1245
+ netdev_dbg (nic -> netdev ,
1246
+ "Failed to enable interrupt: unknown type\n" );
1247
+ return ;
1248
+ }
1249
+ nicvf_reg_write (nic , NIC_VF_ENA_W1S ,
1250
+ nicvf_reg_read (nic , NIC_VF_ENA_W1S ) | mask );
1273
1251
}
1274
1252
1275
1253
/* Disable interrupt */
1276
1254
void nicvf_disable_intr (struct nicvf * nic , int int_type , int q_idx )
1277
1255
{
1278
- u64 reg_val = 0 ;
1256
+ u64 mask = nicvf_int_type_to_mask ( int_type , q_idx ) ;
1279
1257
1280
- switch (int_type ) {
1281
- case NICVF_INTR_CQ :
1282
- reg_val |= ((1ULL << q_idx ) << NICVF_INTR_CQ_SHIFT );
1283
- break ;
1284
- case NICVF_INTR_SQ :
1285
- reg_val |= ((1ULL << q_idx ) << NICVF_INTR_SQ_SHIFT );
1286
- break ;
1287
- case NICVF_INTR_RBDR :
1288
- reg_val |= ((1ULL << q_idx ) << NICVF_INTR_RBDR_SHIFT );
1289
- break ;
1290
- case NICVF_INTR_PKT_DROP :
1291
- reg_val |= (1ULL << NICVF_INTR_PKT_DROP_SHIFT );
1292
- break ;
1293
- case NICVF_INTR_TCP_TIMER :
1294
- reg_val |= (1ULL << NICVF_INTR_TCP_TIMER_SHIFT );
1295
- break ;
1296
- case NICVF_INTR_MBOX :
1297
- reg_val |= (1ULL << NICVF_INTR_MBOX_SHIFT );
1298
- break ;
1299
- case NICVF_INTR_QS_ERR :
1300
- reg_val |= (1ULL << NICVF_INTR_QS_ERR_SHIFT );
1301
- break ;
1302
- default :
1303
- netdev_err (nic -> netdev ,
1258
+ if (!mask ) {
1259
+ netdev_dbg (nic -> netdev ,
1304
1260
"Failed to disable interrupt: unknown type\n" );
1305
- break ;
1261
+ return ;
1306
1262
}
1307
1263
1308
- nicvf_reg_write (nic , NIC_VF_ENA_W1C , reg_val );
1264
+ nicvf_reg_write (nic , NIC_VF_ENA_W1C , mask );
1309
1265
}
1310
1266
1311
1267
/* Clear interrupt */
1312
1268
void nicvf_clear_intr (struct nicvf * nic , int int_type , int q_idx )
1313
1269
{
1314
- u64 reg_val = 0 ;
1270
+ u64 mask = nicvf_int_type_to_mask ( int_type , q_idx ) ;
1315
1271
1316
- switch (int_type ) {
1317
- case NICVF_INTR_CQ :
1318
- reg_val = ((1ULL << q_idx ) << NICVF_INTR_CQ_SHIFT );
1319
- break ;
1320
- case NICVF_INTR_SQ :
1321
- reg_val = ((1ULL << q_idx ) << NICVF_INTR_SQ_SHIFT );
1322
- break ;
1323
- case NICVF_INTR_RBDR :
1324
- reg_val = ((1ULL << q_idx ) << NICVF_INTR_RBDR_SHIFT );
1325
- break ;
1326
- case NICVF_INTR_PKT_DROP :
1327
- reg_val = (1ULL << NICVF_INTR_PKT_DROP_SHIFT );
1328
- break ;
1329
- case NICVF_INTR_TCP_TIMER :
1330
- reg_val = (1ULL << NICVF_INTR_TCP_TIMER_SHIFT );
1331
- break ;
1332
- case NICVF_INTR_MBOX :
1333
- reg_val = (1ULL << NICVF_INTR_MBOX_SHIFT );
1334
- break ;
1335
- case NICVF_INTR_QS_ERR :
1336
- reg_val |= (1ULL << NICVF_INTR_QS_ERR_SHIFT );
1337
- break ;
1338
- default :
1339
- netdev_err (nic -> netdev ,
1272
+ if (!mask ) {
1273
+ netdev_dbg (nic -> netdev ,
1340
1274
"Failed to clear interrupt: unknown type\n" );
1341
- break ;
1275
+ return ;
1342
1276
}
1343
1277
1344
- nicvf_reg_write (nic , NIC_VF_INT , reg_val );
1278
+ nicvf_reg_write (nic , NIC_VF_INT , mask );
1345
1279
}
1346
1280
1347
1281
/* Check if interrupt is enabled */
1348
1282
int nicvf_is_intr_enabled (struct nicvf * nic , int int_type , int q_idx )
1349
1283
{
1350
- u64 reg_val ;
1351
- u64 mask = 0xff ;
1352
-
1353
- reg_val = nicvf_reg_read (nic , NIC_VF_ENA_W1S );
1354
-
1355
- switch (int_type ) {
1356
- case NICVF_INTR_CQ :
1357
- mask = ((1ULL << q_idx ) << NICVF_INTR_CQ_SHIFT );
1358
- break ;
1359
- case NICVF_INTR_SQ :
1360
- mask = ((1ULL << q_idx ) << NICVF_INTR_SQ_SHIFT );
1361
- break ;
1362
- case NICVF_INTR_RBDR :
1363
- mask = ((1ULL << q_idx ) << NICVF_INTR_RBDR_SHIFT );
1364
- break ;
1365
- case NICVF_INTR_PKT_DROP :
1366
- mask = NICVF_INTR_PKT_DROP_MASK ;
1367
- break ;
1368
- case NICVF_INTR_TCP_TIMER :
1369
- mask = NICVF_INTR_TCP_TIMER_MASK ;
1370
- break ;
1371
- case NICVF_INTR_MBOX :
1372
- mask = NICVF_INTR_MBOX_MASK ;
1373
- break ;
1374
- case NICVF_INTR_QS_ERR :
1375
- mask = NICVF_INTR_QS_ERR_MASK ;
1376
- break ;
1377
- default :
1378
- netdev_err (nic -> netdev ,
1284
+ u64 mask = nicvf_int_type_to_mask (int_type , q_idx );
1285
+ /* If interrupt type is unknown, we treat it disabled. */
1286
+ if (!mask ) {
1287
+ netdev_dbg (nic -> netdev ,
1379
1288
"Failed to check interrupt enable: unknown type\n" );
1380
- break ;
1289
+ return 0 ;
1381
1290
}
1382
1291
1383
- return ( reg_val & mask );
1292
+ return mask & nicvf_reg_read ( nic , NIC_VF_ENA_W1S );
1384
1293
}
1385
1294
1386
1295
void nicvf_update_rq_stats (struct nicvf * nic , int rq_idx )
0 commit comments