interface: tx queue infra
[vpp.git] / src / plugins / avf / device.c
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2018 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17
18 #include <vlib/vlib.h>
19 #include <vppinfra/ring.h>
20 #include <vlib/unix/unix.h>
21 #include <vlib/pci/pci.h>
22 #include <vnet/ethernet/ethernet.h>
23 #include <vnet/interface/rx_queue_funcs.h>
24 #include <vnet/interface/tx_queue_funcs.h>
25
26 #include <avf/avf.h>
27
28 #define AVF_MBOX_LEN 64
29 #define AVF_MBOX_BUF_SZ 4096
30 #define AVF_RXQ_SZ 512
31 #define AVF_TXQ_SZ 512
32 #define AVF_ITR_INT 250
33
34 #define PCI_VENDOR_ID_INTEL                     0x8086
35 #define PCI_DEVICE_ID_INTEL_AVF                 0x1889
36 #define PCI_DEVICE_ID_INTEL_X710_VF             0x154c
37 #define PCI_DEVICE_ID_INTEL_X722_VF             0x37cd
38
39 /* *INDENT-OFF* */
40 VLIB_REGISTER_LOG_CLASS (avf_log) = {
41   .class_name = "avf",
42 };
43 /* *INDENT-ON* */
44
45 avf_main_t avf_main;
46 void avf_delete_if (vlib_main_t * vm, avf_device_t * ad, int with_barrier);
47
48 static pci_device_id_t avf_pci_device_ids[] = {
49   {.vendor_id = PCI_VENDOR_ID_INTEL,.device_id = PCI_DEVICE_ID_INTEL_AVF},
50   {.vendor_id = PCI_VENDOR_ID_INTEL,.device_id = PCI_DEVICE_ID_INTEL_X710_VF},
51   {.vendor_id = PCI_VENDOR_ID_INTEL,.device_id = PCI_DEVICE_ID_INTEL_X722_VF},
52   {0},
53 };
54
55 const static char *virtchnl_event_names[] = {
56 #define _(v, n) [v] = #n,
57   foreach_virtchnl_event_code
58 #undef _
59 };
60
61 typedef enum
62 {
63   AVF_IRQ_STATE_DISABLED,
64   AVF_IRQ_STATE_ENABLED,
65   AVF_IRQ_STATE_WB_ON_ITR,
66 } avf_irq_state_t;
67
68 static inline void
69 avf_irq_0_set_state (avf_device_t * ad, avf_irq_state_t state)
70 {
71   u32 dyn_ctl0 = 0, icr0_ena = 0;
72
73   dyn_ctl0 |= (3 << 3);         /* 11b = No ITR update */
74
75   avf_reg_write (ad, AVFINT_ICR0_ENA1, icr0_ena);
76   avf_reg_write (ad, AVFINT_DYN_CTL0, dyn_ctl0);
77   avf_reg_flush (ad);
78
79   if (state == AVF_IRQ_STATE_DISABLED)
80     return;
81
82   dyn_ctl0 = 0;
83   icr0_ena = 0;
84
85   icr0_ena |= (1 << 30);        /* [30] Admin Queue Enable */
86
87   dyn_ctl0 |= (1 << 0);         /* [0] Interrupt Enable */
88   dyn_ctl0 |= (1 << 1);         /* [1] Clear PBA */
89   dyn_ctl0 |= (2 << 3);         /* [4:3] ITR Index, 11b = No ITR update */
90   dyn_ctl0 |= ((AVF_ITR_INT / 2) << 5); /* [16:5] ITR Interval in 2us steps */
91
92   avf_reg_write (ad, AVFINT_ICR0_ENA1, icr0_ena);
93   avf_reg_write (ad, AVFINT_DYN_CTL0, dyn_ctl0);
94   avf_reg_flush (ad);
95 }
96
97 static inline void
98 avf_irq_n_set_state (avf_device_t * ad, u8 line, avf_irq_state_t state)
99 {
100   u32 dyn_ctln = 0;
101
102   /* disable */
103   avf_reg_write (ad, AVFINT_DYN_CTLN (line), dyn_ctln);
104   avf_reg_flush (ad);
105
106   if (state == AVF_IRQ_STATE_DISABLED)
107     return;
108
109   dyn_ctln |= (1 << 1);         /* [1] Clear PBA */
110   if (state == AVF_IRQ_STATE_WB_ON_ITR)
111     {
112       /* minimal ITR interval, use ITR1 */
113       dyn_ctln |= (1 << 3);     /* [4:3] ITR Index */
114       dyn_ctln |= ((32 / 2) << 5);      /* [16:5] ITR Interval in 2us steps */
115       dyn_ctln |= (1 << 30);    /* [30] Writeback on ITR */
116     }
117   else
118     {
119       /* configured ITR interval, use ITR0 */
120       dyn_ctln |= (1 << 0);     /* [0] Interrupt Enable */
121       dyn_ctln |= ((AVF_ITR_INT / 2) << 5);     /* [16:5] ITR Interval in 2us steps */
122     }
123
124   avf_reg_write (ad, AVFINT_DYN_CTLN (line), dyn_ctln);
125   avf_reg_flush (ad);
126 }
127
128
129 clib_error_t *
130 avf_aq_desc_enq (vlib_main_t * vm, avf_device_t * ad, avf_aq_desc_t * dt,
131                  void *data, int len)
132 {
133   clib_error_t *err = 0;
134   avf_aq_desc_t *d, dc;
135   f64 t0, suspend_time = AVF_AQ_ENQ_SUSPEND_TIME;
136
137   d = &ad->atq[ad->atq_next_slot];
138   clib_memcpy_fast (d, dt, sizeof (avf_aq_desc_t));
139   d->flags |= AVF_AQ_F_RD | AVF_AQ_F_SI;
140   if (len)
141     d->datalen = len;
142   if (len)
143     {
144       u64 pa;
145       pa = ad->atq_bufs_pa + ad->atq_next_slot * AVF_MBOX_BUF_SZ;
146       d->addr_hi = (u32) (pa >> 32);
147       d->addr_lo = (u32) pa;
148       clib_memcpy_fast (ad->atq_bufs + ad->atq_next_slot * AVF_MBOX_BUF_SZ,
149                         data, len);
150       d->flags |= AVF_AQ_F_BUF;
151     }
152
153   if (ad->flags & AVF_DEVICE_F_ELOG)
154     clib_memcpy_fast (&dc, d, sizeof (avf_aq_desc_t));
155
156   CLIB_MEMORY_BARRIER ();
157   ad->atq_next_slot = (ad->atq_next_slot + 1) % AVF_MBOX_LEN;
158   avf_reg_write (ad, AVF_ATQT, ad->atq_next_slot);
159   avf_reg_flush (ad);
160
161   t0 = vlib_time_now (vm);
162 retry:
163   vlib_process_suspend (vm, suspend_time);
164
165   if (((d->flags & AVF_AQ_F_DD) == 0) || ((d->flags & AVF_AQ_F_CMP) == 0))
166     {
167       f64 t = vlib_time_now (vm) - t0;
168       if (t > AVF_AQ_ENQ_MAX_WAIT_TIME)
169         {
170           avf_log_err (ad, "aq_desc_enq failed (timeout %.3fs)", t);
171           err = clib_error_return (0, "adminq enqueue timeout [opcode 0x%x]",
172                                    d->opcode);
173           goto done;
174         }
175       suspend_time *= 2;
176       goto retry;
177     }
178
179   clib_memcpy_fast (dt, d, sizeof (avf_aq_desc_t));
180   if (d->flags & AVF_AQ_F_ERR)
181     return clib_error_return (0, "adminq enqueue error [opcode 0x%x, retval "
182                               "%d]", d->opcode, d->retval);
183
184 done:
185   if (ad->flags & AVF_DEVICE_F_ELOG)
186     {
187       ELOG_TYPE_DECLARE (el) =
188         {
189           .format = "avf[%d] aq enq: s_flags 0x%x r_flags 0x%x opcode 0x%x "
190             "datalen %d retval %d",
191           .format_args = "i4i2i2i2i2i2",
192         };
193       struct
194         {
195           u32 dev_instance;
196           u16 s_flags;
197           u16 r_flags;
198           u16 opcode;
199           u16 datalen;
200           u16 retval;
201         } *ed;
202         ed = ELOG_DATA (&vlib_global_main.elog_main, el);
203         ed->dev_instance = ad->dev_instance;
204         ed->s_flags = dc.flags;
205         ed->r_flags = d->flags;
206         ed->opcode = dc.opcode;
207         ed->datalen = dc.datalen;
208         ed->retval = d->retval;
209     }
210
211   return err;
212 }
213
214 clib_error_t *
215 avf_cmd_rx_ctl_reg_write (vlib_main_t * vm, avf_device_t * ad, u32 reg,
216                           u32 val)
217 {
218   clib_error_t *err;
219   avf_aq_desc_t d = {.opcode = 0x207,.param1 = reg,.param3 = val };
220   err = avf_aq_desc_enq (vm, ad, &d, 0, 0);
221
222   if (ad->flags & AVF_DEVICE_F_ELOG)
223     {
224       ELOG_TYPE_DECLARE (el) =
225         {
226           .format = "avf[%d] rx ctl reg write: reg 0x%x val 0x%x ",
227           .format_args = "i4i4i4",
228         };
229       struct
230         {
231           u32 dev_instance;
232           u32 reg;
233           u32 val;
234         } *ed;
235         ed = ELOG_DATA (&vlib_global_main.elog_main, el);
236         ed->dev_instance = ad->dev_instance;
237         ed->reg = reg;
238         ed->val = val;
239     }
240   return err;
241 }
242
243 clib_error_t *
244 avf_rxq_init (vlib_main_t * vm, avf_device_t * ad, u16 qid, u16 rxq_size)
245 {
246   clib_error_t *err;
247   avf_rxq_t *rxq;
248   u32 n_alloc, i;
249
250   vec_validate_aligned (ad->rxqs, qid, CLIB_CACHE_LINE_BYTES);
251   rxq = vec_elt_at_index (ad->rxqs, qid);
252   rxq->size = rxq_size;
253   rxq->next = 0;
254   rxq->descs = vlib_physmem_alloc_aligned_on_numa (vm, rxq->size *
255                                                    sizeof (avf_rx_desc_t),
256                                                    2 * CLIB_CACHE_LINE_BYTES,
257                                                    ad->numa_node);
258
259   rxq->buffer_pool_index =
260     vlib_buffer_pool_get_default_for_numa (vm, ad->numa_node);
261
262   if (rxq->descs == 0)
263     return vlib_physmem_last_error (vm);
264
265   if ((err = vlib_pci_map_dma (vm, ad->pci_dev_handle, (void *) rxq->descs)))
266     return err;
267
268   clib_memset ((void *) rxq->descs, 0, rxq->size * sizeof (avf_rx_desc_t));
269   vec_validate_aligned (rxq->bufs, rxq->size, CLIB_CACHE_LINE_BYTES);
270   rxq->qrx_tail = ad->bar0 + AVF_QRX_TAIL (qid);
271
272   n_alloc = vlib_buffer_alloc_from_pool (vm, rxq->bufs, rxq->size - 8,
273                                          rxq->buffer_pool_index);
274
275   if (n_alloc == 0)
276     return clib_error_return (0, "buffer allocation error");
277
278   rxq->n_enqueued = n_alloc;
279   avf_rx_desc_t *d = rxq->descs;
280   for (i = 0; i < n_alloc; i++)
281     {
282       vlib_buffer_t *b = vlib_get_buffer (vm, rxq->bufs[i]);
283       if (ad->flags & AVF_DEVICE_F_VA_DMA)
284         d->qword[0] = vlib_buffer_get_va (b);
285       else
286         d->qword[0] = vlib_buffer_get_pa (vm, b);
287       d++;
288     }
289
290   ad->n_rx_queues = clib_min (ad->num_queue_pairs, qid + 1);
291   return 0;
292 }
293
294 clib_error_t *
295 avf_txq_init (vlib_main_t * vm, avf_device_t * ad, u16 qid, u16 txq_size)
296 {
297   clib_error_t *err;
298   avf_txq_t *txq;
299   u16 n;
300   u8 bpi = vlib_buffer_pool_get_default_for_numa (vm,
301                                                   ad->numa_node);
302
303   if (qid >= ad->num_queue_pairs)
304     {
305       qid = qid % ad->num_queue_pairs;
306       txq = vec_elt_at_index (ad->txqs, qid);
307       clib_spinlock_init (&txq->lock);
308       ad->flags |= AVF_DEVICE_F_SHARED_TXQ_LOCK;
309       return 0;
310     }
311
312   vec_validate_aligned (ad->txqs, qid, CLIB_CACHE_LINE_BYTES);
313   txq = vec_elt_at_index (ad->txqs, qid);
314   txq->size = txq_size;
315   txq->next = 0;
316
317   /* Prepare a placeholder buffer(s) to maintain a 1-1 relationship between
318    * bufs and descs when a context descriptor is added in descs. Worst case
319    * every second descriptor is context descriptor and due to b->ref_count
320    * being u8 we need one for each block of 510 descriptors */
321
322   n = (txq->size / 510) + 1;
323   vec_validate_aligned (txq->ph_bufs, n, CLIB_CACHE_LINE_BYTES);
324
325   if (!vlib_buffer_alloc_from_pool (vm, txq->ph_bufs, n, bpi))
326     return clib_error_return (0, "buffer allocation error");
327
328   txq->descs = vlib_physmem_alloc_aligned_on_numa (vm, txq->size *
329                                                    sizeof (avf_tx_desc_t),
330                                                    2 * CLIB_CACHE_LINE_BYTES,
331                                                    ad->numa_node);
332   if (txq->descs == 0)
333     return vlib_physmem_last_error (vm);
334
335   if ((err = vlib_pci_map_dma (vm, ad->pci_dev_handle, (void *) txq->descs)))
336     return err;
337
338   vec_validate_aligned (txq->bufs, txq->size, CLIB_CACHE_LINE_BYTES);
339   txq->qtx_tail = ad->bar0 + AVF_QTX_TAIL (qid);
340
341   /* initialize ring of pending RS slots */
342   clib_ring_new_aligned (txq->rs_slots, 32, CLIB_CACHE_LINE_BYTES);
343
344   vec_validate_aligned (txq->tmp_descs, txq->size, CLIB_CACHE_LINE_BYTES);
345   vec_validate_aligned (txq->tmp_bufs, txq->size, CLIB_CACHE_LINE_BYTES);
346
347   ad->n_tx_queues = clib_min (ad->num_queue_pairs, qid + 1);
348   return 0;
349 }
350
351 typedef struct
352 {
353   u16 vsi_id;
354   u16 flags;
355 } virtchnl_promisc_info_t;
356
357 void
358 avf_arq_slot_init (avf_device_t * ad, u16 slot)
359 {
360   avf_aq_desc_t *d;
361   u64 pa = ad->arq_bufs_pa + slot * AVF_MBOX_BUF_SZ;
362   d = &ad->arq[slot];
363   clib_memset (d, 0, sizeof (avf_aq_desc_t));
364   d->flags = AVF_AQ_F_BUF;
365   d->datalen = AVF_MBOX_BUF_SZ;
366   d->addr_hi = (u32) (pa >> 32);
367   d->addr_lo = (u32) pa;
368 }
369
370 static inline uword
371 avf_dma_addr (vlib_main_t * vm, avf_device_t * ad, void *p)
372 {
373   return (ad->flags & AVF_DEVICE_F_VA_DMA) ?
374     pointer_to_uword (p) : vlib_physmem_get_pa (vm, p);
375 }
376
377 static void
378 avf_adminq_init (vlib_main_t * vm, avf_device_t * ad)
379 {
380   u64 pa;
381   int i;
382
383   /* VF MailBox Transmit */
384   clib_memset (ad->atq, 0, sizeof (avf_aq_desc_t) * AVF_MBOX_LEN);
385   ad->atq_bufs_pa = avf_dma_addr (vm, ad, ad->atq_bufs);
386
387   pa = avf_dma_addr (vm, ad, ad->atq);
388   avf_reg_write (ad, AVF_ATQT, 0);      /* Tail */
389   avf_reg_write (ad, AVF_ATQH, 0);      /* Head */
390   avf_reg_write (ad, AVF_ATQLEN, AVF_MBOX_LEN | (1ULL << 31));  /* len & ena */
391   avf_reg_write (ad, AVF_ATQBAL, (u32) pa);     /* Base Address Low */
392   avf_reg_write (ad, AVF_ATQBAH, (u32) (pa >> 32));     /* Base Address High */
393
394   /* VF MailBox Receive */
395   clib_memset (ad->arq, 0, sizeof (avf_aq_desc_t) * AVF_MBOX_LEN);
396   ad->arq_bufs_pa = avf_dma_addr (vm, ad, ad->arq_bufs);
397
398   for (i = 0; i < AVF_MBOX_LEN; i++)
399     avf_arq_slot_init (ad, i);
400
401   pa = avf_dma_addr (vm, ad, ad->arq);
402
403   avf_reg_write (ad, AVF_ARQH, 0);      /* Head */
404   avf_reg_write (ad, AVF_ARQT, 0);      /* Head */
405   avf_reg_write (ad, AVF_ARQLEN, AVF_MBOX_LEN | (1ULL << 31));  /* len & ena */
406   avf_reg_write (ad, AVF_ARQBAL, (u32) pa);     /* Base Address Low */
407   avf_reg_write (ad, AVF_ARQBAH, (u32) (pa >> 32));     /* Base Address High */
408   avf_reg_write (ad, AVF_ARQT, AVF_MBOX_LEN - 1);       /* Tail */
409
410   ad->atq_next_slot = 0;
411   ad->arq_next_slot = 0;
412 }
413
414 clib_error_t *
415 avf_send_to_pf (vlib_main_t * vm, avf_device_t * ad, virtchnl_ops_t op,
416                 void *in, int in_len, void *out, int out_len)
417 {
418   clib_error_t *err;
419   avf_aq_desc_t *d, dt = {.opcode = 0x801,.v_opcode = op };
420   u32 head;
421   f64 t0, suspend_time = AVF_SEND_TO_PF_SUSPEND_TIME;
422
423   /* adminq operations should be only done from process node after device
424    * is initialized */
425   ASSERT ((ad->flags & AVF_DEVICE_F_INITIALIZED) == 0 ||
426           vlib_get_current_process_node_index (vm) == avf_process_node.index);
427
428   /* suppress interrupt in the next adminq receive slot
429      as we are going to wait for response
430      we only need interrupts when event is received */
431   d = &ad->arq[ad->arq_next_slot];
432   d->flags |= AVF_AQ_F_SI;
433
434   if ((err = avf_aq_desc_enq (vm, ad, &dt, in, in_len)))
435     return err;
436
437   t0 = vlib_time_now (vm);
438 retry:
439   head = avf_get_u32 (ad->bar0, AVF_ARQH);
440
441   if (ad->arq_next_slot == head)
442     {
443       f64 t = vlib_time_now (vm) - t0;
444       if (t > AVF_SEND_TO_PF_MAX_WAIT_TIME)
445         {
446           avf_log_err (ad, "send_to_pf failed (timeout %.3fs)", t);
447           return clib_error_return (0, "timeout");
448         }
449       vlib_process_suspend (vm, suspend_time);
450       suspend_time *= 2;
451       goto retry;
452     }
453
454   d = &ad->arq[ad->arq_next_slot];
455
456   if (d->v_opcode == VIRTCHNL_OP_EVENT)
457     {
458       void *buf = ad->arq_bufs + ad->arq_next_slot * AVF_MBOX_BUF_SZ;
459       virtchnl_pf_event_t *e;
460
461       if ((d->datalen != sizeof (virtchnl_pf_event_t)) ||
462           ((d->flags & AVF_AQ_F_BUF) == 0))
463         return clib_error_return (0, "event message error");
464
465       vec_add2 (ad->events, e, 1);
466       clib_memcpy_fast (e, buf, sizeof (virtchnl_pf_event_t));
467       avf_arq_slot_init (ad, ad->arq_next_slot);
468       ad->arq_next_slot++;
469       /* reset timer */
470       t0 = vlib_time_now (vm);
471       suspend_time = AVF_SEND_TO_PF_SUSPEND_TIME;
472       goto retry;
473     }
474
475   if (d->v_opcode != op)
476     {
477       err = clib_error_return (0,
478                                "unexpected message received [v_opcode = %u, "
479                                "expected %u, v_retval %d]",
480                                d->v_opcode, op, d->v_retval);
481       goto done;
482     }
483
484   if (d->v_retval)
485     {
486       err = clib_error_return (0, "error [v_opcode = %u, v_retval %d]",
487                                d->v_opcode, d->v_retval);
488       goto done;
489     }
490
491   if (out_len && d->flags & AVF_AQ_F_BUF)
492     {
493       void *buf = ad->arq_bufs + ad->arq_next_slot * AVF_MBOX_BUF_SZ;
494       clib_memcpy_fast (out, buf, out_len);
495     }
496
497   avf_arq_slot_init (ad, ad->arq_next_slot);
498   avf_reg_write (ad, AVF_ARQT, ad->arq_next_slot);
499   avf_reg_flush (ad);
500   ad->arq_next_slot = (ad->arq_next_slot + 1) % AVF_MBOX_LEN;
501
502 done:
503
504   if (ad->flags & AVF_DEVICE_F_ELOG)
505     {
506       ELOG_TYPE_DECLARE (el) =
507         {
508           .format = "avf[%d] send to pf: v_opcode %s (%d) v_retval 0x%x",
509           .format_args = "i4t4i4i4",
510           .n_enum_strings = VIRTCHNL_N_OPS,
511           .enum_strings = {
512 #define _(v, n) [v] = #n,
513               foreach_virtchnl_op
514 #undef _
515           },
516         };
517       struct
518         {
519           u32 dev_instance;
520           u32 v_opcode;
521           u32 v_opcode_val;
522           u32 v_retval;
523         } *ed;
524         ed = ELOG_DATA (&vlib_global_main.elog_main, el);
525         ed->dev_instance = ad->dev_instance;
526         ed->v_opcode = op;
527         ed->v_opcode_val = op;
528         ed->v_retval = d->v_retval;
529     }
530   return err;
531 }
532
533 clib_error_t *
534 avf_op_version (vlib_main_t * vm, avf_device_t * ad,
535                 virtchnl_version_info_t * ver)
536 {
537   clib_error_t *err = 0;
538   virtchnl_version_info_t myver = {
539     .major = VIRTCHNL_VERSION_MAJOR,
540     .minor = VIRTCHNL_VERSION_MINOR,
541   };
542
543   avf_log_debug (ad, "version: major %u minor %u", myver.major, myver.minor);
544
545   err = avf_send_to_pf (vm, ad, VIRTCHNL_OP_VERSION, &myver,
546                         sizeof (virtchnl_version_info_t), ver,
547                         sizeof (virtchnl_version_info_t));
548
549   if (err)
550     return err;
551
552   return err;
553 }
554
555 clib_error_t *
556 avf_op_get_vf_resources (vlib_main_t * vm, avf_device_t * ad,
557                          virtchnl_vf_resource_t * res)
558 {
559   clib_error_t *err = 0;
560   u32 bitmap = (VIRTCHNL_VF_OFFLOAD_L2 | VIRTCHNL_VF_OFFLOAD_RSS_PF |
561                 VIRTCHNL_VF_OFFLOAD_WB_ON_ITR | VIRTCHNL_VF_OFFLOAD_VLAN |
562                 VIRTCHNL_VF_OFFLOAD_RX_POLLING |
563                 VIRTCHNL_VF_CAP_ADV_LINK_SPEED | VIRTCHNL_VF_OFFLOAD_FDIR_PF |
564                 VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF | VIRTCHNL_VF_OFFLOAD_VLAN_V2);
565
566   avf_log_debug (ad, "get_vf_resources: bitmap 0x%x (%U)", bitmap,
567                  format_avf_vf_cap_flags, bitmap);
568   err = avf_send_to_pf (vm, ad, VIRTCHNL_OP_GET_VF_RESOURCES, &bitmap,
569                         sizeof (u32), res, sizeof (virtchnl_vf_resource_t));
570
571   if (err == 0)
572     {
573       int i;
574       avf_log_debug (ad,
575                      "get_vf_resources: num_vsis %u num_queue_pairs %u "
576                      "max_vectors %u max_mtu %u vf_cap_flags 0x%x (%U) "
577                      "rss_key_size %u rss_lut_size %u",
578                      res->num_vsis, res->num_queue_pairs, res->max_vectors,
579                      res->max_mtu, res->vf_cap_flags, format_avf_vf_cap_flags,
580                      res->vf_cap_flags, res->rss_key_size, res->rss_lut_size);
581       for (i = 0; i < res->num_vsis; i++)
582         avf_log_debug (
583           ad,
584           "get_vf_resources_vsi[%u]: vsi_id %u num_queue_pairs %u vsi_type %u "
585           "qset_handle %u default_mac_addr %U",
586           i, res->vsi_res[i].vsi_id, res->vsi_res[i].num_queue_pairs,
587           res->vsi_res[i].vsi_type, res->vsi_res[i].qset_handle,
588           format_ethernet_address, res->vsi_res[i].default_mac_addr);
589     }
590
591   return err;
592 }
593
594 clib_error_t *
595 avf_op_config_rss_lut (vlib_main_t * vm, avf_device_t * ad)
596 {
597   int msg_len = sizeof (virtchnl_rss_lut_t) + ad->rss_lut_size - 1;
598   int i;
599   u8 msg[msg_len];
600   virtchnl_rss_lut_t *rl;
601
602   clib_memset (msg, 0, msg_len);
603   rl = (virtchnl_rss_lut_t *) msg;
604   rl->vsi_id = ad->vsi_id;
605   rl->lut_entries = ad->rss_lut_size;
606   for (i = 0; i < ad->rss_lut_size; i++)
607     rl->lut[i] = i % ad->n_rx_queues;
608
609   avf_log_debug (ad, "config_rss_lut: vsi_id %u rss_lut_size %u lut 0x%U",
610                  rl->vsi_id, rl->lut_entries, format_hex_bytes_no_wrap,
611                  rl->lut, rl->lut_entries);
612
613   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_RSS_LUT, msg, msg_len, 0,
614                          0);
615 }
616
617 clib_error_t *
618 avf_op_config_rss_key (vlib_main_t * vm, avf_device_t * ad)
619 {
620   int msg_len = sizeof (virtchnl_rss_key_t) + ad->rss_key_size - 1;
621   int i;
622   u8 msg[msg_len];
623   virtchnl_rss_key_t *rk;
624
625   clib_memset (msg, 0, msg_len);
626   rk = (virtchnl_rss_key_t *) msg;
627   rk->vsi_id = ad->vsi_id;
628   rk->key_len = ad->rss_key_size;
629   u32 seed = random_default_seed ();
630   for (i = 0; i < ad->rss_key_size; i++)
631     rk->key[i] = (u8) random_u32 (&seed);
632
633   avf_log_debug (ad, "config_rss_key: vsi_id %u rss_key_size %u key 0x%U",
634                  rk->vsi_id, rk->key_len, format_hex_bytes_no_wrap, rk->key,
635                  rk->key_len);
636
637   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_RSS_KEY, msg, msg_len, 0,
638                          0);
639 }
640
641 clib_error_t *
642 avf_op_disable_vlan_stripping (vlib_main_t * vm, avf_device_t * ad)
643 {
644   avf_log_debug (ad, "disable_vlan_stripping");
645
646   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING, 0, 0, 0,
647                          0);
648 }
649
650 clib_error_t *
651 avf_op_config_promisc_mode (vlib_main_t * vm, avf_device_t * ad,
652                             int is_enable)
653 {
654   virtchnl_promisc_info_t pi = { 0 };
655
656   pi.vsi_id = ad->vsi_id;
657
658   if (is_enable)
659     pi.flags = FLAG_VF_UNICAST_PROMISC | FLAG_VF_MULTICAST_PROMISC;
660
661   avf_log_debug (ad, "config_promisc_mode: unicast %s multicast %s",
662                  pi.flags & FLAG_VF_UNICAST_PROMISC ? "on" : "off",
663                  pi.flags & FLAG_VF_MULTICAST_PROMISC ? "on" : "off");
664
665   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, &pi,
666                          sizeof (virtchnl_promisc_info_t), 0, 0);
667 }
668
669
670 clib_error_t *
671 avf_op_config_vsi_queues (vlib_main_t * vm, avf_device_t * ad)
672 {
673   int i;
674   int n_qp = clib_max (vec_len (ad->rxqs), vec_len (ad->txqs));
675   int msg_len = sizeof (virtchnl_vsi_queue_config_info_t) + n_qp *
676     sizeof (virtchnl_queue_pair_info_t);
677   u8 msg[msg_len];
678   virtchnl_vsi_queue_config_info_t *ci;
679
680   clib_memset (msg, 0, msg_len);
681   ci = (virtchnl_vsi_queue_config_info_t *) msg;
682   ci->vsi_id = ad->vsi_id;
683   ci->num_queue_pairs = n_qp;
684
685   avf_log_debug (ad, "config_vsi_queues: vsi_id %u num_queue_pairs %u",
686                  ad->vsi_id, ci->num_queue_pairs);
687
688   for (i = 0; i < n_qp; i++)
689     {
690       virtchnl_txq_info_t *txq = &ci->qpair[i].txq;
691       virtchnl_rxq_info_t *rxq = &ci->qpair[i].rxq;
692
693       rxq->vsi_id = ad->vsi_id;
694       rxq->queue_id = i;
695       rxq->max_pkt_size = ETHERNET_MAX_PACKET_BYTES;
696       if (i < vec_len (ad->rxqs))
697         {
698           avf_rxq_t *q = vec_elt_at_index (ad->rxqs, i);
699           rxq->ring_len = q->size;
700           rxq->databuffer_size = vlib_buffer_get_default_data_size (vm);
701           rxq->dma_ring_addr = avf_dma_addr (vm, ad, (void *) q->descs);
702           avf_reg_write (ad, AVF_QRX_TAIL (i), q->size - 1);
703         }
704       avf_log_debug (ad, "config_vsi_queues_rx[%u]: max_pkt_size %u "
705                      "ring_len %u databuffer_size %u dma_ring_addr 0x%llx",
706                      i, rxq->max_pkt_size, rxq->ring_len,
707                      rxq->databuffer_size, rxq->dma_ring_addr);
708
709       txq->vsi_id = ad->vsi_id;
710       txq->queue_id = i;
711       if (i < vec_len (ad->txqs))
712         {
713           avf_txq_t *q = vec_elt_at_index (ad->txqs, i);
714           txq->ring_len = q->size;
715           txq->dma_ring_addr = avf_dma_addr (vm, ad, (void *) q->descs);
716         }
717       avf_log_debug (ad, "config_vsi_queues_tx[%u]: ring_len %u "
718                      "dma_ring_addr 0x%llx", i, txq->ring_len,
719                      txq->dma_ring_addr);
720     }
721
722   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_VSI_QUEUES, msg, msg_len,
723                          0, 0);
724 }
725
726 clib_error_t *
727 avf_op_config_irq_map (vlib_main_t * vm, avf_device_t * ad)
728 {
729   int msg_len = sizeof (virtchnl_irq_map_info_t) +
730     (ad->n_rx_irqs) * sizeof (virtchnl_vector_map_t);
731   u8 msg[msg_len];
732   virtchnl_irq_map_info_t *imi;
733
734   clib_memset (msg, 0, msg_len);
735   imi = (virtchnl_irq_map_info_t *) msg;
736   imi->num_vectors = ad->n_rx_irqs;
737
738   for (int i = 0; i < ad->n_rx_irqs; i++)
739     {
740       imi->vecmap[i].vector_id = i + 1;
741       imi->vecmap[i].vsi_id = ad->vsi_id;
742       if (ad->n_rx_irqs == ad->n_rx_queues)
743         imi->vecmap[i].rxq_map = 1 << i;
744       else
745         imi->vecmap[i].rxq_map = pow2_mask (ad->n_rx_queues);;
746
747       avf_log_debug (ad, "config_irq_map[%u/%u]: vsi_id %u vector_id %u "
748                      "rxq_map %u", i, ad->n_rx_irqs - 1, ad->vsi_id,
749                      imi->vecmap[i].vector_id, imi->vecmap[i].rxq_map);
750     }
751
752
753   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_IRQ_MAP, msg, msg_len, 0,
754                          0);
755 }
756
757 clib_error_t *
758 avf_op_add_del_eth_addr (vlib_main_t * vm, avf_device_t * ad, u8 count,
759                          u8 * macs, int is_add)
760 {
761   int msg_len =
762     sizeof (virtchnl_ether_addr_list_t) +
763     count * sizeof (virtchnl_ether_addr_t);
764   u8 msg[msg_len];
765   virtchnl_ether_addr_list_t *al;
766   int i;
767
768   clib_memset (msg, 0, msg_len);
769   al = (virtchnl_ether_addr_list_t *) msg;
770   al->vsi_id = ad->vsi_id;
771   al->num_elements = count;
772
773   avf_log_debug (ad, "add_del_eth_addr: vsi_id %u num_elements %u is_add %u",
774                  ad->vsi_id, al->num_elements, is_add);
775
776   for (i = 0; i < count; i++)
777     {
778       clib_memcpy_fast (&al->list[i].addr, macs + i * 6, 6);
779       avf_log_debug (ad, "add_del_eth_addr[%u]: %U", i,
780                      format_ethernet_address, &al->list[i].addr);
781     }
782   return avf_send_to_pf (vm, ad, is_add ? VIRTCHNL_OP_ADD_ETH_ADDR :
783                          VIRTCHNL_OP_DEL_ETH_ADDR, msg, msg_len, 0, 0);
784 }
785
786 clib_error_t *
787 avf_op_enable_queues (vlib_main_t * vm, avf_device_t * ad, u32 rx, u32 tx)
788 {
789   virtchnl_queue_select_t qs = { 0 };
790   int i = 0;
791   qs.vsi_id = ad->vsi_id;
792   qs.rx_queues = rx;
793   qs.tx_queues = tx;
794
795   avf_log_debug (ad, "enable_queues: vsi_id %u rx_queues %u tx_queues %u",
796                  ad->vsi_id, qs.rx_queues, qs.tx_queues);
797
798   while (rx)
799     {
800       if (rx & (1 << i))
801         {
802           avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, i);
803           avf_reg_write (ad, AVF_QRX_TAIL (i), rxq->n_enqueued);
804           rx &= ~(1 << i);
805         }
806       i++;
807     }
808   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_ENABLE_QUEUES, &qs,
809                          sizeof (virtchnl_queue_select_t), 0, 0);
810 }
811
812 clib_error_t *
813 avf_op_get_stats (vlib_main_t * vm, avf_device_t * ad,
814                   virtchnl_eth_stats_t * es)
815 {
816   virtchnl_queue_select_t qs = { 0 };
817   qs.vsi_id = ad->vsi_id;
818
819   avf_log_debug (ad, "get_stats: vsi_id %u", ad->vsi_id);
820
821   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_GET_STATS,
822                          &qs, sizeof (virtchnl_queue_select_t),
823                          es, sizeof (virtchnl_eth_stats_t));
824 }
825
826 clib_error_t *
827 avf_op_get_offload_vlan_v2_caps (vlib_main_t *vm, avf_device_t *ad,
828                                  virtchnl_vlan_caps_t *vc)
829 {
830   clib_error_t *err;
831
832   err = avf_send_to_pf (vm, ad, VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS, 0, 0, vc,
833                         sizeof (virtchnl_vlan_caps_t));
834
835   avf_log_debug (ad, "get_offload_vlan_v2_caps:\n%U%U", format_white_space, 16,
836                  format_avf_vlan_caps, vc);
837
838   return err;
839 }
840
841 clib_error_t *
842 avf_op_disable_vlan_stripping_v2 (vlib_main_t *vm, avf_device_t *ad, u32 outer,
843                                   u32 inner)
844 {
845   virtchnl_vlan_setting_t vs = {
846     .outer_ethertype_setting = outer,
847     .inner_ethertype_setting = inner,
848     .vport_id = ad->vsi_id,
849   };
850
851   avf_log_debug (ad, "disable_vlan_stripping_v2: outer: %U, inner %U",
852                  format_avf_vlan_support, outer, format_avf_vlan_support,
853                  inner);
854
855   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2, &vs,
856                          sizeof (virtchnl_vlan_setting_t), 0, 0);
857 }
858
859 clib_error_t *
860 avf_device_reset (vlib_main_t * vm, avf_device_t * ad)
861 {
862   avf_aq_desc_t d = { 0 };
863   clib_error_t *error;
864   u32 rstat;
865   f64 t0, t = 0, suspend_time = AVF_RESET_SUSPEND_TIME;
866
867   avf_log_debug (ad, "reset");
868
869   d.opcode = 0x801;
870   d.v_opcode = VIRTCHNL_OP_RESET_VF;
871   if ((error = avf_aq_desc_enq (vm, ad, &d, 0, 0)))
872     return error;
873
874   t0 = vlib_time_now (vm);
875 retry:
876   vlib_process_suspend (vm, suspend_time);
877
878   rstat = avf_get_u32 (ad->bar0, AVFGEN_RSTAT);
879
880   if (rstat == 2 || rstat == 3)
881     {
882       avf_log_debug (ad, "reset completed in %.3fs", t);
883       return 0;
884     }
885
886   t = vlib_time_now (vm) - t0;
887   if (t > AVF_RESET_MAX_WAIT_TIME)
888     {
889       avf_log_err (ad, "reset failed (timeout %.3fs)", t);
890       return clib_error_return (0, "reset failed (timeout)");
891     }
892
893   suspend_time *= 2;
894   goto retry;
895 }
896
897 clib_error_t *
898 avf_request_queues (vlib_main_t * vm, avf_device_t * ad, u16 num_queue_pairs)
899 {
900   virtchnl_vf_res_request_t res_req = { 0 };
901   clib_error_t *error;
902   u32 rstat;
903   f64 t0, t, suspend_time = AVF_RESET_SUSPEND_TIME;
904
905   res_req.num_queue_pairs = num_queue_pairs;
906
907   avf_log_debug (ad, "request_queues: num_queue_pairs %u", num_queue_pairs);
908
909   error = avf_send_to_pf (vm, ad, VIRTCHNL_OP_REQUEST_QUEUES, &res_req,
910                           sizeof (virtchnl_vf_res_request_t), &res_req,
911                           sizeof (virtchnl_vf_res_request_t));
912
913   /*
914    * if PF responds, the request failed
915    * else PF initializes restart and avf_send_to_pf returns an error
916    */
917   if (!error)
918     {
919       return clib_error_return (0, "requested more than %u queue pairs",
920                                 res_req.num_queue_pairs);
921     }
922
923   t0 = vlib_time_now (vm);
924 retry:
925   vlib_process_suspend (vm, suspend_time);
926   t = vlib_time_now (vm) - t0;
927
928   rstat = avf_get_u32 (ad->bar0, AVFGEN_RSTAT);
929
930   if ((rstat == VIRTCHNL_VFR_COMPLETED) || (rstat == VIRTCHNL_VFR_VFACTIVE))
931     goto done;
932
933   if (t > AVF_RESET_MAX_WAIT_TIME)
934     {
935       avf_log_err (ad, "request queues failed (timeout %.3f seconds)", t);
936       return clib_error_return (0, "request queues failed (timeout)");
937     }
938
939   suspend_time *= 2;
940   goto retry;
941
942 done:
943   return NULL;
944 }
945
946 clib_error_t *
947 avf_device_init (vlib_main_t * vm, avf_main_t * am, avf_device_t * ad,
948                  avf_create_if_args_t * args)
949 {
950   virtchnl_version_info_t ver = { 0 };
951   virtchnl_vf_resource_t res = { 0 };
952   clib_error_t *error;
953   vlib_thread_main_t *tm = vlib_get_thread_main ();
954   int i, wb_on_itr;
955
956   avf_adminq_init (vm, ad);
957
958   if ((error = avf_request_queues (vm, ad, clib_max (tm->n_vlib_mains,
959                                                      args->rxq_num))))
960     {
961       /* we failed to get more queues, but still we want to proceed */
962       clib_error_free (error);
963
964       if ((error = avf_device_reset (vm, ad)))
965         return error;
966     }
967
968   avf_adminq_init (vm, ad);
969
970   /*
971    * OP_VERSION
972    */
973   if ((error = avf_op_version (vm, ad, &ver)))
974     return error;
975
976   if (ver.major != VIRTCHNL_VERSION_MAJOR ||
977       ver.minor != VIRTCHNL_VERSION_MINOR)
978     return clib_error_return (0, "incompatible protocol version "
979                               "(remote %d.%d)", ver.major, ver.minor);
980
981   /*
982    * OP_GET_VF_RESOURCES
983    */
984   if ((error = avf_op_get_vf_resources (vm, ad, &res)))
985     return error;
986
987   if (res.num_vsis != 1 || res.vsi_res[0].vsi_type != VIRTCHNL_VSI_SRIOV)
988     return clib_error_return (0, "unexpected GET_VF_RESOURCE reply received");
989
990   ad->vsi_id = res.vsi_res[0].vsi_id;
991   ad->cap_flags = res.vf_cap_flags;
992   ad->num_queue_pairs = res.num_queue_pairs;
993   ad->max_vectors = res.max_vectors;
994   ad->max_mtu = res.max_mtu;
995   ad->rss_key_size = res.rss_key_size;
996   ad->rss_lut_size = res.rss_lut_size;
997   wb_on_itr = (ad->cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) != 0;
998
999   clib_memcpy_fast (ad->hwaddr, res.vsi_res[0].default_mac_addr, 6);
1000
1001   /*
1002    * Disable VLAN stripping
1003    */
1004   if (ad->cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2)
1005     {
1006       virtchnl_vlan_caps_t vc = {};
1007       u32 outer = VIRTCHNL_VLAN_UNSUPPORTED, inner = VIRTCHNL_VLAN_UNSUPPORTED;
1008       u32 mask = VIRTCHNL_VLAN_ETHERTYPE_8100;
1009
1010       if ((error = avf_op_get_offload_vlan_v2_caps (vm, ad, &vc)))
1011         return error;
1012
1013       outer = vc.offloads.stripping_support.outer & mask;
1014       inner = vc.offloads.stripping_support.inner & mask;
1015
1016       if ((outer || inner) &&
1017           (error = avf_op_disable_vlan_stripping_v2 (vm, ad, outer, inner)))
1018         return error;
1019     }
1020   else if ((error = avf_op_disable_vlan_stripping (vm, ad)))
1021     return error;
1022
1023   /*
1024    * Init Queues
1025    */
1026   if (args->rxq_num == 0)
1027     {
1028       args->rxq_num = 1;
1029     }
1030   else if (args->rxq_num > ad->num_queue_pairs)
1031     {
1032       args->rxq_num = ad->num_queue_pairs;
1033       avf_log_warn (ad, "Requested more rx queues than queue pairs available."
1034                     "Using %u rx queues.", args->rxq_num);
1035     }
1036
1037   for (i = 0; i < args->rxq_num; i++)
1038     if ((error = avf_rxq_init (vm, ad, i, args->rxq_size)))
1039       return error;
1040
1041   for (i = 0; i < tm->n_vlib_mains; i++)
1042     if ((error = avf_txq_init (vm, ad, i, args->txq_size)))
1043       return error;
1044
1045   if (ad->max_vectors > ad->n_rx_queues)
1046     {
1047       ad->flags |= AVF_DEVICE_F_RX_INT;
1048       ad->n_rx_irqs = args->rxq_num;
1049     }
1050   else
1051     ad->n_rx_irqs = 1;
1052
1053   if ((ad->cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
1054       (error = avf_op_config_rss_lut (vm, ad)))
1055     return error;
1056
1057   if ((ad->cap_flags & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
1058       (error = avf_op_config_rss_key (vm, ad)))
1059     return error;
1060
1061   if ((error = avf_op_config_vsi_queues (vm, ad)))
1062     return error;
1063
1064   if ((error = avf_op_config_irq_map (vm, ad)))
1065     return error;
1066
1067   avf_irq_0_set_state (ad, AVF_IRQ_STATE_ENABLED);
1068
1069   for (i = 0; i < ad->n_rx_irqs; i++)
1070     avf_irq_n_set_state (ad, i, wb_on_itr ? AVF_IRQ_STATE_WB_ON_ITR :
1071                          AVF_IRQ_STATE_ENABLED);
1072
1073   if ((error = avf_op_add_del_eth_addr (vm, ad, 1, ad->hwaddr, 1 /* add */ )))
1074     return error;
1075
1076   if ((error = avf_op_enable_queues (vm, ad, pow2_mask (ad->n_rx_queues),
1077                                      pow2_mask (ad->n_tx_queues))))
1078     return error;
1079
1080   ad->flags |= AVF_DEVICE_F_INITIALIZED;
1081   return error;
1082 }
1083
1084 void
1085 avf_process_one_device (vlib_main_t * vm, avf_device_t * ad, int is_irq)
1086 {
1087   vnet_main_t *vnm = vnet_get_main ();
1088   virtchnl_pf_event_t *e;
1089   u32 r;
1090
1091   if (ad->flags & AVF_DEVICE_F_ERROR)
1092     return;
1093
1094   if ((ad->flags & AVF_DEVICE_F_INITIALIZED) == 0)
1095     return;
1096
1097   ASSERT (ad->error == 0);
1098
1099   /* do not process device in reset state */
1100   r = avf_get_u32 (ad->bar0, AVFGEN_RSTAT);
1101   if (r != VIRTCHNL_VFR_VFACTIVE)
1102     return;
1103
1104   r = avf_get_u32 (ad->bar0, AVF_ARQLEN);
1105   if ((r & 0xf0000000) != (1ULL << 31))
1106     {
1107       ad->error = clib_error_return (0, "arq not enabled, arqlen = 0x%x", r);
1108       avf_log_err (ad, "error: %U", format_clib_error, ad->error);
1109       goto error;
1110     }
1111
1112   r = avf_get_u32 (ad->bar0, AVF_ATQLEN);
1113   if ((r & 0xf0000000) != (1ULL << 31))
1114     {
1115       ad->error = clib_error_return (0, "atq not enabled, atqlen = 0x%x", r);
1116       avf_log_err (ad, "error: %U", format_clib_error, ad->error);
1117       goto error;
1118     }
1119
1120   if (is_irq == 0)
1121     avf_op_get_stats (vm, ad, &ad->eth_stats);
1122
1123   /* *INDENT-OFF* */
1124   vec_foreach (e, ad->events)
1125     {
1126       avf_log_debug (ad, "event: %s (%u) sev %d",
1127                      virtchnl_event_names[e->event], e->event, e->severity);
1128       if (e->event == VIRTCHNL_EVENT_LINK_CHANGE)
1129         {
1130           int link_up;
1131           virtchnl_link_speed_t speed = e->event_data.link_event.link_speed;
1132           u32 flags = 0;
1133           u32 mbps = 0;
1134
1135           if (ad->cap_flags & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
1136             link_up = e->event_data.link_event_adv.link_status;
1137           else
1138             link_up = e->event_data.link_event.link_status;
1139
1140           if (ad->cap_flags & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
1141             mbps = e->event_data.link_event_adv.link_speed;
1142           if (speed == VIRTCHNL_LINK_SPEED_40GB)
1143             mbps = 40000;
1144           else if (speed == VIRTCHNL_LINK_SPEED_25GB)
1145             mbps = 25000;
1146           else if (speed == VIRTCHNL_LINK_SPEED_10GB)
1147             mbps = 10000;
1148           else if (speed == VIRTCHNL_LINK_SPEED_5GB)
1149             mbps = 5000;
1150           else if (speed == VIRTCHNL_LINK_SPEED_2_5GB)
1151             mbps = 2500;
1152           else if (speed == VIRTCHNL_LINK_SPEED_1GB)
1153             mbps = 1000;
1154           else if (speed == VIRTCHNL_LINK_SPEED_100MB)
1155             mbps = 100;
1156
1157           avf_log_debug (ad, "event_link_change: status %d speed %u mbps",
1158                          link_up, mbps);
1159
1160           if (link_up && (ad->flags & AVF_DEVICE_F_LINK_UP) == 0)
1161             {
1162               ad->flags |= AVF_DEVICE_F_LINK_UP;
1163               flags |= (VNET_HW_INTERFACE_FLAG_FULL_DUPLEX |
1164                         VNET_HW_INTERFACE_FLAG_LINK_UP);
1165               vnet_hw_interface_set_flags (vnm, ad->hw_if_index, flags);
1166               vnet_hw_interface_set_link_speed (vnm, ad->hw_if_index,
1167                                                 mbps * 1000);
1168               ad->link_speed = mbps;
1169             }
1170           else if (!link_up && (ad->flags & AVF_DEVICE_F_LINK_UP) != 0)
1171             {
1172               ad->flags &= ~AVF_DEVICE_F_LINK_UP;
1173               ad->link_speed = 0;
1174             }
1175
1176           if (ad->flags & AVF_DEVICE_F_ELOG)
1177             {
1178               ELOG_TYPE_DECLARE (el) =
1179                 {
1180                   .format = "avf[%d] link change: link_status %d "
1181                     "link_speed %d mbps",
1182                   .format_args = "i4i1i4",
1183                 };
1184               struct
1185                 {
1186                   u32 dev_instance;
1187                   u8 link_status;
1188                   u32 link_speed;
1189                 } *ed;
1190                 ed = ELOG_DATA (&vlib_global_main.elog_main, el);
1191                 ed->dev_instance = ad->dev_instance;
1192                 ed->link_status = link_up;
1193                 ed->link_speed = mbps;
1194             }
1195         }
1196       else
1197         {
1198           if (ad->flags & AVF_DEVICE_F_ELOG)
1199             {
1200               ELOG_TYPE_DECLARE (el) =
1201                 {
1202                   .format = "avf[%d] unknown event: event %d severity %d",
1203                   .format_args = "i4i4i1i1",
1204                 };
1205               struct
1206                 {
1207                   u32 dev_instance;
1208                   u32 event;
1209                   u32 severity;
1210                 } *ed;
1211                 ed = ELOG_DATA (&vlib_global_main.elog_main, el);
1212                 ed->dev_instance = ad->dev_instance;
1213                 ed->event = e->event;
1214                 ed->severity = e->severity;
1215             }
1216         }
1217     }
1218   /* *INDENT-ON* */
1219   vec_reset_length (ad->events);
1220
1221   return;
1222
1223 error:
1224   ad->flags |= AVF_DEVICE_F_ERROR;
1225   ASSERT (ad->error != 0);
1226   vlib_log_err (avf_log.class, "%U", format_clib_error, ad->error);
1227 }
1228
1229 clib_error_t *
1230 avf_op_program_flow (vlib_main_t *vm, avf_device_t *ad, int is_create,
1231                      u8 *rule, u32 rule_len, u8 *program_status,
1232                      u32 status_len)
1233 {
1234   avf_log_debug (ad, "avf_op_program_flow: vsi_id %u is_create %u", ad->vsi_id,
1235                  is_create);
1236
1237   return avf_send_to_pf (vm, ad,
1238                          is_create ? VIRTCHNL_OP_ADD_FDIR_FILTER :
1239                                      VIRTCHNL_OP_DEL_FDIR_FILTER,
1240                          rule, rule_len, program_status, status_len);
1241 }
1242
1243 static void
1244 avf_process_handle_request (vlib_main_t * vm, avf_process_req_t * req)
1245 {
1246   avf_device_t *ad = avf_get_device (req->dev_instance);
1247
1248   if (req->type == AVF_PROCESS_REQ_ADD_DEL_ETH_ADDR)
1249     req->error = avf_op_add_del_eth_addr (vm, ad, 1, req->eth_addr,
1250                                           req->is_add);
1251   else if (req->type == AVF_PROCESS_REQ_CONFIG_PROMISC_MDDE)
1252     req->error = avf_op_config_promisc_mode (vm, ad, req->is_enable);
1253   else if (req->type == AVF_PROCESS_REQ_PROGRAM_FLOW)
1254     req->error =
1255       avf_op_program_flow (vm, ad, req->is_add, req->rule, req->rule_len,
1256                            req->program_status, req->status_len);
1257   else
1258     clib_panic ("BUG: unknown avf proceess request type");
1259
1260   if (req->calling_process_index != avf_process_node.index)
1261     vlib_process_signal_event (vm, req->calling_process_index, 0, 0);
1262 }
1263
1264 static clib_error_t *
1265 avf_process_request (vlib_main_t * vm, avf_process_req_t * req)
1266 {
1267   uword *event_data = 0;
1268   req->calling_process_index = vlib_get_current_process_node_index (vm);
1269
1270   if (req->calling_process_index != avf_process_node.index)
1271     {
1272       vlib_process_signal_event_pointer (vm, avf_process_node.index,
1273                                          AVF_PROCESS_EVENT_REQ, req);
1274
1275       vlib_process_wait_for_event_or_clock (vm, 5.0);
1276
1277       if (vlib_process_get_events (vm, &event_data) != 0)
1278         clib_panic ("avf process node failed to reply in 5 seconds");
1279       vec_free (event_data);
1280     }
1281   else
1282     avf_process_handle_request (vm, req);
1283
1284   return req->error;
1285 }
1286
1287 static u32
1288 avf_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hw, u32 flags)
1289 {
1290   avf_process_req_t req;
1291   vlib_main_t *vm = vlib_get_main ();
1292   avf_device_t *ad = avf_get_device (hw->dev_instance);
1293   clib_error_t *err;
1294
1295   switch (flags)
1296     {
1297     case ETHERNET_INTERFACE_FLAG_DEFAULT_L3:
1298       ad->flags &= ~AVF_DEVICE_F_PROMISC;
1299       break;
1300     case ETHERNET_INTERFACE_FLAG_ACCEPT_ALL:
1301       ad->flags |= AVF_DEVICE_F_PROMISC;
1302       break;
1303     default:
1304       return ~0;
1305     }
1306
1307   req.is_enable = ((ad->flags & AVF_DEVICE_F_PROMISC) != 0);
1308   req.type = AVF_PROCESS_REQ_CONFIG_PROMISC_MDDE;
1309   req.dev_instance = hw->dev_instance;
1310
1311   if ((err = avf_process_request (vm, &req)))
1312     {
1313       avf_log_err (ad, "error: %U", format_clib_error, err);
1314       clib_error_free (err);
1315       return ~0;
1316     }
1317   return 0;
1318 }
1319
1320 static uword
1321 avf_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
1322 {
1323   avf_main_t *am = &avf_main;
1324   uword *event_data = 0, event_type;
1325   int enabled = 0, irq;
1326   f64 last_run_duration = 0;
1327   f64 last_periodic_time = 0;
1328   avf_device_t **dev_pointers = 0;
1329   u32 i;
1330
1331   while (1)
1332     {
1333       if (enabled)
1334         vlib_process_wait_for_event_or_clock (vm, 5.0 - last_run_duration);
1335       else
1336         vlib_process_wait_for_event (vm);
1337
1338       event_type = vlib_process_get_events (vm, &event_data);
1339       irq = 0;
1340
1341       switch (event_type)
1342         {
1343         case ~0:
1344           last_periodic_time = vlib_time_now (vm);
1345           break;
1346         case AVF_PROCESS_EVENT_START:
1347           enabled = 1;
1348           break;
1349         case AVF_PROCESS_EVENT_DELETE_IF:
1350           for (int i = 0; i < vec_len (event_data); i++)
1351             {
1352               avf_device_t *ad = avf_get_device (event_data[i]);
1353               avf_delete_if (vm, ad, /* with_barrier */ 1);
1354             }
1355           if (pool_elts (am->devices) < 1)
1356             enabled = 0;
1357           break;
1358         case AVF_PROCESS_EVENT_AQ_INT:
1359           irq = 1;
1360           break;
1361         case AVF_PROCESS_EVENT_REQ:
1362           for (int i = 0; i < vec_len (event_data); i++)
1363             avf_process_handle_request (vm, (void *) event_data[i]);
1364           break;
1365
1366         default:
1367           ASSERT (0);
1368         }
1369
1370       vec_reset_length (event_data);
1371
1372       if (enabled == 0)
1373         continue;
1374
1375       /* create local list of device pointers as device pool may grow
1376        * during suspend */
1377       vec_reset_length (dev_pointers);
1378       /* *INDENT-OFF* */
1379       pool_foreach_index (i, am->devices)
1380         {
1381           vec_add1 (dev_pointers, avf_get_device (i));
1382         }
1383
1384       vec_foreach_index (i, dev_pointers)
1385         {
1386           avf_process_one_device (vm, dev_pointers[i], irq);
1387         };
1388       /* *INDENT-ON* */
1389       last_run_duration = vlib_time_now (vm) - last_periodic_time;
1390     }
1391   return 0;
1392 }
1393
1394 /* *INDENT-OFF* */
1395 VLIB_REGISTER_NODE (avf_process_node)  = {
1396   .function = avf_process,
1397   .type = VLIB_NODE_TYPE_PROCESS,
1398   .name = "avf-process",
1399 };
1400 /* *INDENT-ON* */
1401
1402 static void
1403 avf_irq_0_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line)
1404 {
1405   uword pd = vlib_pci_get_private_data (vm, h);
1406   avf_device_t *ad = avf_get_device (pd);
1407   u32 icr0;
1408
1409   icr0 = avf_reg_read (ad, AVFINT_ICR0);
1410
1411   if (ad->flags & AVF_DEVICE_F_ELOG)
1412     {
1413       /* *INDENT-OFF* */
1414       ELOG_TYPE_DECLARE (el) =
1415         {
1416           .format = "avf[%d] irq 0: icr0 0x%x",
1417           .format_args = "i4i4",
1418         };
1419       /* *INDENT-ON* */
1420       struct
1421       {
1422         u32 dev_instance;
1423         u32 icr0;
1424       } *ed;
1425
1426       ed = ELOG_DATA (&vlib_global_main.elog_main, el);
1427       ed->dev_instance = ad->dev_instance;
1428       ed->icr0 = icr0;
1429     }
1430
1431   avf_irq_0_set_state (ad, AVF_IRQ_STATE_ENABLED);
1432
1433   /* bit 30 - Send/Receive Admin queue interrupt indication */
1434   if (icr0 & (1 << 30))
1435     vlib_process_signal_event (vm, avf_process_node.index,
1436                                AVF_PROCESS_EVENT_AQ_INT, 0);
1437 }
1438
1439 static void
1440 avf_irq_n_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line)
1441 {
1442   vnet_main_t *vnm = vnet_get_main ();
1443   uword pd = vlib_pci_get_private_data (vm, h);
1444   avf_device_t *ad = avf_get_device (pd);
1445   avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, line - 1);
1446
1447   if (ad->flags & AVF_DEVICE_F_ELOG)
1448     {
1449       /* *INDENT-OFF* */
1450       ELOG_TYPE_DECLARE (el) =
1451         {
1452           .format = "avf[%d] irq %d: received",
1453           .format_args = "i4i2",
1454         };
1455       /* *INDENT-ON* */
1456       struct
1457       {
1458         u32 dev_instance;
1459         u16 line;
1460       } *ed;
1461
1462       ed = ELOG_DATA (&vlib_global_main.elog_main, el);
1463       ed->dev_instance = ad->dev_instance;
1464       ed->line = line;
1465     }
1466
1467   line--;
1468
1469   if (ad->flags & AVF_DEVICE_F_RX_INT && rxq->int_mode)
1470     vnet_hw_if_rx_queue_set_int_pending (vnm, rxq->queue_index);
1471   avf_irq_n_set_state (ad, line, AVF_IRQ_STATE_ENABLED);
1472 }
1473
1474 void
1475 avf_delete_if (vlib_main_t * vm, avf_device_t * ad, int with_barrier)
1476 {
1477   vnet_main_t *vnm = vnet_get_main ();
1478   avf_main_t *am = &avf_main;
1479   int i;
1480   u32 dev_instance;
1481
1482   ad->flags &= ~AVF_DEVICE_F_ADMIN_UP;
1483
1484   if (ad->hw_if_index)
1485     {
1486       if (with_barrier)
1487         vlib_worker_thread_barrier_sync (vm);
1488       vnet_hw_interface_set_flags (vnm, ad->hw_if_index, 0);
1489       ethernet_delete_interface (vnm, ad->hw_if_index);
1490       if (with_barrier)
1491         vlib_worker_thread_barrier_release (vm);
1492     }
1493
1494   vlib_pci_device_close (vm, ad->pci_dev_handle);
1495
1496   vlib_physmem_free (vm, ad->atq);
1497   vlib_physmem_free (vm, ad->arq);
1498   vlib_physmem_free (vm, ad->atq_bufs);
1499   vlib_physmem_free (vm, ad->arq_bufs);
1500
1501   /* *INDENT-OFF* */
1502   vec_foreach_index (i, ad->rxqs)
1503     {
1504       avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, i);
1505       vlib_physmem_free (vm, (void *) rxq->descs);
1506       if (rxq->n_enqueued)
1507         vlib_buffer_free_from_ring (vm, rxq->bufs, rxq->next, rxq->size,
1508                                     rxq->n_enqueued);
1509       vec_free (rxq->bufs);
1510     }
1511   /* *INDENT-ON* */
1512   vec_free (ad->rxqs);
1513
1514   /* *INDENT-OFF* */
1515   vec_foreach_index (i, ad->txqs)
1516     {
1517       avf_txq_t *txq = vec_elt_at_index (ad->txqs, i);
1518       vlib_physmem_free (vm, (void *) txq->descs);
1519       if (txq->n_enqueued)
1520         {
1521           u16 first = (txq->next - txq->n_enqueued) & (txq->size -1);
1522           vlib_buffer_free_from_ring (vm, txq->bufs, first, txq->size,
1523                                       txq->n_enqueued);
1524         }
1525       /* Free the placeholder buffer */
1526       vlib_buffer_free (vm, txq->ph_bufs, vec_len (txq->ph_bufs));
1527       vec_free (txq->ph_bufs);
1528       vec_free (txq->bufs);
1529       clib_ring_free (txq->rs_slots);
1530       vec_free (txq->tmp_bufs);
1531       vec_free (txq->tmp_descs);
1532     }
1533   /* *INDENT-ON* */
1534   vec_free (ad->txqs);
1535   vec_free (ad->name);
1536
1537   clib_error_free (ad->error);
1538   dev_instance = ad->dev_instance;
1539   clib_memset (ad, 0, sizeof (*ad));
1540   pool_put_index (am->devices, dev_instance);
1541   clib_mem_free (ad);
1542 }
1543
1544 static u8
1545 avf_validate_queue_size (avf_create_if_args_t * args)
1546 {
1547   clib_error_t *error = 0;
1548
1549   args->rxq_size = (args->rxq_size == 0) ? AVF_RXQ_SZ : args->rxq_size;
1550   args->txq_size = (args->txq_size == 0) ? AVF_TXQ_SZ : args->txq_size;
1551
1552   if ((args->rxq_size > AVF_QUEUE_SZ_MAX)
1553       || (args->txq_size > AVF_QUEUE_SZ_MAX))
1554     {
1555       args->rv = VNET_API_ERROR_INVALID_VALUE;
1556       args->error =
1557         clib_error_return (error, "queue size must not be greater than %u",
1558                            AVF_QUEUE_SZ_MAX);
1559       return 1;
1560     }
1561   if ((args->rxq_size < AVF_QUEUE_SZ_MIN)
1562       || (args->txq_size < AVF_QUEUE_SZ_MIN))
1563     {
1564       args->rv = VNET_API_ERROR_INVALID_VALUE;
1565       args->error =
1566         clib_error_return (error, "queue size must not be smaller than %u",
1567                            AVF_QUEUE_SZ_MIN);
1568       return 1;
1569     }
1570   if ((args->rxq_size & (args->rxq_size - 1)) ||
1571       (args->txq_size & (args->txq_size - 1)))
1572     {
1573       args->rv = VNET_API_ERROR_INVALID_VALUE;
1574       args->error =
1575         clib_error_return (error, "queue size must be a power of two");
1576       return 1;
1577     }
1578   return 0;
1579 }
1580
1581 void
1582 avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
1583 {
1584   vnet_main_t *vnm = vnet_get_main ();
1585   avf_main_t *am = &avf_main;
1586   avf_device_t *ad, **adp;
1587   vlib_pci_dev_handle_t h;
1588   clib_error_t *error = 0;
1589   int i;
1590
1591   /* check input args */
1592   if (avf_validate_queue_size (args) != 0)
1593     return;
1594
1595   /* *INDENT-OFF* */
1596   pool_foreach (adp, am->devices)  {
1597         if ((*adp)->pci_addr.as_u32 == args->addr.as_u32)
1598       {
1599         args->rv = VNET_API_ERROR_ADDRESS_IN_USE;
1600         args->error =
1601           clib_error_return (error, "%U: %s", format_vlib_pci_addr,
1602                              &args->addr, "pci address in use");
1603         return;
1604       }
1605   }
1606   /* *INDENT-ON* */
1607
1608   pool_get (am->devices, adp);
1609   adp[0] = ad = clib_mem_alloc_aligned (sizeof (avf_device_t),
1610                                         CLIB_CACHE_LINE_BYTES);
1611   clib_memset (ad, 0, sizeof (avf_device_t));
1612   ad->dev_instance = adp - am->devices;
1613   ad->per_interface_next_index = ~0;
1614   ad->name = vec_dup (args->name);
1615
1616   if (args->enable_elog)
1617     ad->flags |= AVF_DEVICE_F_ELOG;
1618
1619   if ((error = vlib_pci_device_open (vm, &args->addr, avf_pci_device_ids,
1620                                      &h)))
1621     {
1622       pool_put (am->devices, adp);
1623       clib_mem_free (ad);
1624       args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1625       args->error =
1626         clib_error_return (error, "pci-addr %U", format_vlib_pci_addr,
1627                            &args->addr);
1628       return;
1629     }
1630   ad->pci_dev_handle = h;
1631   ad->pci_addr = args->addr;
1632   ad->numa_node = vlib_pci_get_numa_node (vm, h);
1633
1634   vlib_pci_set_private_data (vm, h, ad->dev_instance);
1635
1636   if ((error = vlib_pci_bus_master_enable (vm, h)))
1637     goto error;
1638
1639   if ((error = vlib_pci_map_region (vm, h, 0, &ad->bar0)))
1640     goto error;
1641
1642   ad->atq = vlib_physmem_alloc_aligned_on_numa (vm, sizeof (avf_aq_desc_t) *
1643                                                 AVF_MBOX_LEN,
1644                                                 CLIB_CACHE_LINE_BYTES,
1645                                                 ad->numa_node);
1646   if (ad->atq == 0)
1647     {
1648       error = vlib_physmem_last_error (vm);
1649       goto error;
1650     }
1651
1652   if ((error = vlib_pci_map_dma (vm, h, ad->atq)))
1653     goto error;
1654
1655   ad->arq = vlib_physmem_alloc_aligned_on_numa (vm, sizeof (avf_aq_desc_t) *
1656                                                 AVF_MBOX_LEN,
1657                                                 CLIB_CACHE_LINE_BYTES,
1658                                                 ad->numa_node);
1659   if (ad->arq == 0)
1660     {
1661       error = vlib_physmem_last_error (vm);
1662       goto error;
1663     }
1664
1665   if ((error = vlib_pci_map_dma (vm, h, ad->arq)))
1666     goto error;
1667
1668   ad->atq_bufs = vlib_physmem_alloc_aligned_on_numa (vm, AVF_MBOX_BUF_SZ *
1669                                                      AVF_MBOX_LEN,
1670                                                      CLIB_CACHE_LINE_BYTES,
1671                                                      ad->numa_node);
1672   if (ad->atq_bufs == 0)
1673     {
1674       error = vlib_physmem_last_error (vm);
1675       goto error;
1676     }
1677
1678   if ((error = vlib_pci_map_dma (vm, h, ad->atq_bufs)))
1679     goto error;
1680
1681   ad->arq_bufs = vlib_physmem_alloc_aligned_on_numa (vm, AVF_MBOX_BUF_SZ *
1682                                                      AVF_MBOX_LEN,
1683                                                      CLIB_CACHE_LINE_BYTES,
1684                                                      ad->numa_node);
1685   if (ad->arq_bufs == 0)
1686     {
1687       error = vlib_physmem_last_error (vm);
1688       goto error;
1689     }
1690
1691   if ((error = vlib_pci_map_dma (vm, h, ad->arq_bufs)))
1692     goto error;
1693
1694   if (vlib_pci_supports_virtual_addr_dma (vm, h))
1695     ad->flags |= AVF_DEVICE_F_VA_DMA;
1696
1697   if ((error = avf_device_init (vm, am, ad, args)))
1698     goto error;
1699
1700   if ((error = vlib_pci_register_msix_handler (vm, h, 0, 1,
1701                                                &avf_irq_0_handler)))
1702     goto error;
1703
1704   if ((error = vlib_pci_register_msix_handler (vm, h, 1, ad->n_rx_irqs,
1705                                                &avf_irq_n_handler)))
1706     goto error;
1707
1708   if ((error = vlib_pci_enable_msix_irq (vm, h, 0, ad->n_rx_irqs + 1)))
1709     goto error;
1710
1711   if ((error = vlib_pci_intr_enable (vm, h)))
1712     goto error;
1713
1714   /* create interface */
1715   error = ethernet_register_interface (vnm, avf_device_class.index,
1716                                        ad->dev_instance, ad->hwaddr,
1717                                        &ad->hw_if_index, avf_flag_change);
1718
1719   if (error)
1720     goto error;
1721
1722   /* Indicate ability to support L3 DMAC filtering and
1723    * initialize interface to L3 non-promisc mode */
1724   vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, ad->hw_if_index);
1725   hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER |
1726               VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM |
1727               VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO;
1728   ethernet_set_flags (vnm, ad->hw_if_index,
1729                       ETHERNET_INTERFACE_FLAG_DEFAULT_L3);
1730
1731   vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, ad->hw_if_index);
1732   args->sw_if_index = ad->sw_if_index = sw->sw_if_index;
1733
1734   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, ad->hw_if_index);
1735   hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE;
1736   vnet_hw_if_set_input_node (vnm, ad->hw_if_index, avf_input_node.index);
1737
1738   for (i = 0; i < ad->n_rx_queues; i++)
1739     {
1740       u32 qi, fi;
1741       qi = vnet_hw_if_register_rx_queue (vnm, ad->hw_if_index, i,
1742                                          VNET_HW_IF_RXQ_THREAD_ANY);
1743
1744       if (ad->flags & AVF_DEVICE_F_RX_INT)
1745         {
1746           fi = vlib_pci_get_msix_file_index (vm, ad->pci_dev_handle, i + 1);
1747           vnet_hw_if_set_rx_queue_file_index (vnm, qi, fi);
1748         }
1749       ad->rxqs[i].queue_index = qi;
1750     }
1751
1752   for (i = 0; i < ad->n_tx_queues; i++)
1753     {
1754       u32 qi = vnet_hw_if_register_tx_queue (vnm, ad->hw_if_index, i);
1755       vnet_hw_if_tx_queue_assign_thread (vnm, qi, i);
1756       ad->txqs[i].queue_index = qi;
1757     }
1758
1759   vnet_hw_if_update_runtime_data (vnm, ad->hw_if_index);
1760
1761   if (pool_elts (am->devices) == 1)
1762     vlib_process_signal_event (vm, avf_process_node.index,
1763                                AVF_PROCESS_EVENT_START, 0);
1764
1765   return;
1766
1767 error:
1768   avf_delete_if (vm, ad, /* with_barrier */ 0);
1769   args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1770   args->error = clib_error_return (error, "pci-addr %U",
1771                                    format_vlib_pci_addr, &args->addr);
1772   avf_log_err (ad, "error: %U", format_clib_error, args->error);
1773 }
1774
1775 static clib_error_t *
1776 avf_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
1777 {
1778   vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
1779   avf_device_t *ad = avf_get_device (hi->dev_instance);
1780   uword is_up = (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) != 0;
1781
1782   if (ad->flags & AVF_DEVICE_F_ERROR)
1783     return clib_error_return (0, "device is in error state");
1784
1785   if (is_up)
1786     {
1787       vnet_hw_interface_set_flags (vnm, ad->hw_if_index,
1788                                    VNET_HW_INTERFACE_FLAG_LINK_UP);
1789       ad->flags |= AVF_DEVICE_F_ADMIN_UP;
1790     }
1791   else
1792     {
1793       vnet_hw_interface_set_flags (vnm, ad->hw_if_index, 0);
1794       ad->flags &= ~AVF_DEVICE_F_ADMIN_UP;
1795     }
1796   return 0;
1797 }
1798
1799 static clib_error_t *
1800 avf_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index, u32 qid,
1801                               vnet_hw_if_rx_mode mode)
1802 {
1803   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
1804   avf_device_t *ad = avf_get_device (hw->dev_instance);
1805   avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, qid);
1806
1807   if (mode == VNET_HW_IF_RX_MODE_POLLING)
1808     {
1809       if (rxq->int_mode == 0)
1810         return 0;
1811       if (ad->cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR)
1812         avf_irq_n_set_state (ad, qid, AVF_IRQ_STATE_WB_ON_ITR);
1813       else
1814         avf_irq_n_set_state (ad, qid, AVF_IRQ_STATE_ENABLED);
1815       rxq->int_mode = 0;
1816     }
1817   else
1818     {
1819       if (rxq->int_mode == 1)
1820         return 0;
1821       if (ad->n_rx_irqs != ad->n_rx_queues)
1822         return clib_error_return (0, "not enough interrupt lines");
1823       rxq->int_mode = 1;
1824       avf_irq_n_set_state (ad, qid, AVF_IRQ_STATE_ENABLED);
1825     }
1826
1827   return 0;
1828 }
1829
1830 static void
1831 avf_set_interface_next_node (vnet_main_t * vnm, u32 hw_if_index,
1832                              u32 node_index)
1833 {
1834   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
1835   avf_device_t *ad = avf_get_device (hw->dev_instance);
1836
1837   /* Shut off redirection */
1838   if (node_index == ~0)
1839     {
1840       ad->per_interface_next_index = node_index;
1841       return;
1842     }
1843
1844   ad->per_interface_next_index =
1845     vlib_node_add_next (vlib_get_main (), avf_input_node.index, node_index);
1846 }
1847
1848 static clib_error_t *
1849 avf_add_del_mac_address (vnet_hw_interface_t * hw,
1850                          const u8 * address, u8 is_add)
1851 {
1852   vlib_main_t *vm = vlib_get_main ();
1853   avf_process_req_t req;
1854
1855   req.dev_instance = hw->dev_instance;
1856   req.type = AVF_PROCESS_REQ_ADD_DEL_ETH_ADDR;
1857   req.is_add = is_add;
1858   clib_memcpy (req.eth_addr, address, 6);
1859
1860   return avf_process_request (vm, &req);
1861 }
1862
1863 static char *avf_tx_func_error_strings[] = {
1864 #define _(n,s) s,
1865   foreach_avf_tx_func_error
1866 #undef _
1867 };
1868
1869 static void
1870 avf_clear_hw_interface_counters (u32 instance)
1871 {
1872   avf_device_t *ad = avf_get_device (instance);
1873   clib_memcpy_fast (&ad->last_cleared_eth_stats,
1874                     &ad->eth_stats, sizeof (ad->eth_stats));
1875 }
1876
1877 clib_error_t *
1878 avf_program_flow (u32 dev_instance, int is_add, u8 *rule, u32 rule_len,
1879                   u8 *program_status, u32 status_len)
1880 {
1881   vlib_main_t *vm = vlib_get_main ();
1882   avf_process_req_t req;
1883
1884   req.dev_instance = dev_instance;
1885   req.type = AVF_PROCESS_REQ_PROGRAM_FLOW;
1886   req.is_add = is_add;
1887   req.rule = rule;
1888   req.rule_len = rule_len;
1889   req.program_status = program_status;
1890   req.status_len = status_len;
1891
1892   return avf_process_request (vm, &req);
1893 }
1894
1895 /* *INDENT-OFF* */
1896 VNET_DEVICE_CLASS (avf_device_class, ) = {
1897   .name = "Adaptive Virtual Function (AVF) interface",
1898   .clear_counters = avf_clear_hw_interface_counters,
1899   .format_device = format_avf_device,
1900   .format_device_name = format_avf_device_name,
1901   .admin_up_down_function = avf_interface_admin_up_down,
1902   .rx_mode_change_function = avf_interface_rx_mode_change,
1903   .rx_redirect_to_node = avf_set_interface_next_node,
1904   .mac_addr_add_del_function = avf_add_del_mac_address,
1905   .tx_function_n_errors = AVF_TX_N_ERROR,
1906   .tx_function_error_strings = avf_tx_func_error_strings,
1907   .flow_ops_function = avf_flow_ops_fn,
1908 };
1909 /* *INDENT-ON* */
1910
1911 clib_error_t *
1912 avf_init (vlib_main_t * vm)
1913 {
1914   avf_main_t *am = &avf_main;
1915   vlib_thread_main_t *tm = vlib_get_thread_main ();
1916
1917   vec_validate_aligned (am->per_thread_data, tm->n_vlib_mains - 1,
1918                         CLIB_CACHE_LINE_BYTES);
1919
1920   return 0;
1921 }
1922
1923 /* *INDENT-OFF* */
1924 VLIB_INIT_FUNCTION (avf_init) =
1925 {
1926   .runs_after = VLIB_INITS ("pci_bus_init"),
1927 };
1928 /* *INDENT-OFF* */
1929
1930 /*
1931  * fd.io coding-style-patch-verification: ON
1932  *
1933  * Local Variables:
1934  * eval: (c-set-style "gnu")
1935  * End:
1936  */