|
|
@@ -2022,14 +2022,15 @@ static void netvsc_vf_setup(struct work_struct *w)
|
|
|
rtnl_unlock();
|
|
|
}
|
|
|
|
|
|
-/* Find netvsc by VMBus serial number.
|
|
|
- * The PCI hyperv controller records the serial number as the slot.
|
|
|
+/* Find netvsc by VF serial number.
|
|
|
+ * The PCI hyperv controller records the serial number as the slot kobj name.
|
|
|
*/
|
|
|
static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev)
|
|
|
{
|
|
|
struct device *parent = vf_netdev->dev.parent;
|
|
|
struct net_device_context *ndev_ctx;
|
|
|
struct pci_dev *pdev;
|
|
|
+ u32 serial;
|
|
|
|
|
|
if (!parent || !dev_is_pci(parent))
|
|
|
return NULL; /* not a PCI device */
|
|
|
@@ -2040,16 +2041,22 @@ static struct net_device *get_netvsc_byslot(const struct net_device *vf_netdev)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+ if (kstrtou32(pci_slot_name(pdev->slot), 10, &serial)) {
|
|
|
+ netdev_notice(vf_netdev, "Invalid vf serial:%s\n",
|
|
|
+ pci_slot_name(pdev->slot));
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
list_for_each_entry(ndev_ctx, &netvsc_dev_list, list) {
|
|
|
if (!ndev_ctx->vf_alloc)
|
|
|
continue;
|
|
|
|
|
|
- if (ndev_ctx->vf_serial == pdev->slot->number)
|
|
|
+ if (ndev_ctx->vf_serial == serial)
|
|
|
return hv_get_drvdata(ndev_ctx->device_ctx);
|
|
|
}
|
|
|
|
|
|
netdev_notice(vf_netdev,
|
|
|
- "no netdev found for slot %u\n", pdev->slot->number);
|
|
|
+ "no netdev found for vf serial:%u\n", serial);
|
|
|
return NULL;
|
|
|
}
|
|
|
|