avf: wrong argument passed to avf_log_err
[vpp.git] / src / plugins / avf / device.c
index b0cf486..0481e61 100644 (file)
@@ -399,6 +399,11 @@ avf_send_to_pf (vlib_main_t * vm, avf_device_t * ad, virtchnl_ops_t op,
   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 */
@@ -1158,7 +1163,6 @@ avf_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hw, u32 flags)
 {
   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)
@@ -1174,13 +1178,12 @@ avf_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hw, u32 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;
 }
 
@@ -1225,6 +1228,25 @@ avf_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
        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);
        }