@@ -204,6 +204,10 @@ static void igbvf_write_config(PCIDevice *dev, uint32_t addr, uint32_t val,
204204{
205205 trace_igbvf_write_config (addr , val , len );
206206 pci_default_write_config (dev , addr , val , len );
207+ if (object_property_get_bool (OBJECT (pcie_sriov_get_pf (dev )),
208+ "x-pcie-flr-init" , & error_abort )) {
209+ pcie_cap_flr_write_config (dev , addr , val , len );
210+ }
207211}
208212
209213static uint64_t igbvf_mmio_read (void * opaque , hwaddr addr , unsigned size )
@@ -266,13 +270,25 @@ static void igbvf_pci_realize(PCIDevice *dev, Error **errp)
266270 hw_error ("Failed to initialize PCIe capability" );
267271 }
268272
273+ if (object_property_get_bool (OBJECT (pcie_sriov_get_pf (dev )),
274+ "x-pcie-flr-init" , & error_abort )) {
275+ pcie_cap_flr_init (dev );
276+ }
277+
269278 if (pcie_aer_init (dev , 1 , 0x100 , 0x40 , errp ) < 0 ) {
270279 hw_error ("Failed to initialize AER capability" );
271280 }
272281
273282 pcie_ari_init (dev , 0x150 );
274283}
275284
285+ static void igbvf_qdev_reset_hold (Object * obj )
286+ {
287+ PCIDevice * vf = PCI_DEVICE (obj );
288+
289+ igb_vf_reset (pcie_sriov_get_pf (vf ), pcie_sriov_vf_number (vf ));
290+ }
291+
276292static void igbvf_pci_uninit (PCIDevice * dev )
277293{
278294 IgbVfState * s = IGBVF (dev );
@@ -287,6 +303,7 @@ static void igbvf_class_init(ObjectClass *class, void *data)
287303{
288304 DeviceClass * dc = DEVICE_CLASS (class );
289305 PCIDeviceClass * c = PCI_DEVICE_CLASS (class );
306+ ResettableClass * rc = RESETTABLE_CLASS (class );
290307
291308 c -> realize = igbvf_pci_realize ;
292309 c -> exit = igbvf_pci_uninit ;
@@ -295,6 +312,8 @@ static void igbvf_class_init(ObjectClass *class, void *data)
295312 c -> revision = 1 ;
296313 c -> class_id = PCI_CLASS_NETWORK_ETHERNET ;
297314
315+ rc -> phases .hold = igbvf_qdev_reset_hold ;
316+
298317 dc -> desc = "Intel 82576 Virtual Function" ;
299318 dc -> user_creatable = false;
300319
0 commit comments