u32 head;
f64 t0, suspend_time = AVF_SEND_TO_PF_SUSPEND_TIME;
+ /* adminq operations should be only done from process node after device
+ * is initialized */
+ ASSERT ((ad->flags & AVF_DEVICE_F_INITIALIZED) == 0 ||
+ vlib_get_current_process_node_index (vm) == avf_process_node.index);
+
/* suppress interrupt in the next adminq receive slot
as we are going to wait for response
we only need interrupts when event is received */
{
vlib_main_t *vm = vlib_get_main ();
avf_device_t *ad = avf_get_device (hw->dev_instance);
- clib_error_t *error;
u8 promisc_enabled;
switch (flags)
}
promisc_enabled = ((ad->flags & AVF_DEVICE_F_PROMISC) != 0);
- if ((error = avf_config_promisc_mode (vm, ad, promisc_enabled)))
- {
- avf_log_err (ad, "%s: %U", format_clib_error, error);
- clib_error_free (error);
- return ~0;
- }
+ vlib_process_signal_event (vm, avf_process_node.index,
+ promisc_enabled ?
+ AVF_PROCESS_EVENT_SET_PROMISC_ENABLE :
+ AVF_PROCESS_EVENT_SET_PROMISC_DISABLE,
+ hw->dev_instance);
return 0;
}
case AVF_PROCESS_EVENT_AQ_INT:
irq = 1;
break;
+ case AVF_PROCESS_EVENT_SET_PROMISC_ENABLE:
+ case AVF_PROCESS_EVENT_SET_PROMISC_DISABLE:
+ for (int i = 0; i < vec_len (event_data); i++)
+ {
+ avf_device_t *ad = avf_get_device (event_data[i]);
+ clib_error_t *err;
+ int is_enable = 0;
+
+ if (event_type == AVF_PROCESS_EVENT_SET_PROMISC_ENABLE)
+ is_enable = 1;
+
+ if ((err = avf_config_promisc_mode (vm, ad, is_enable)))
+ {
+ avf_log_err (ad, "error: %U", format_clib_error, err);
+ clib_error_free (err);
+ }
+ }
+ break;
+
default:
ASSERT (0);
}