Commit 0cd2c13b authored by Allen Hubbe's avatar Allen Hubbe Committed by Michael S. Tsirkin
Browse files

pds_vdpa: reset to vdpa specified mac



When the vdpa device is reset, also reinitialize it with the mac address
that was assigned when the device was added.

Fixes: 151cc834 ("pds_vdpa: add support for vdpa and vdpamgmt interfaces")
Signed-off-by: default avatarAllen Hubbe <allen.hubbe@amd.com>
Signed-off-by: default avatarShannon Nelson <shannon.nelson@amd.com>
Message-Id: <20230711042437.69381-2-shannon.nelson@amd.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
parent 2c507ce9
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -409,6 +409,8 @@ static void pds_vdpa_set_status(struct vdpa_device *vdpa_dev, u8 status)
			pdsv->vqs[i].avail_idx = 0;
			pdsv->vqs[i].used_idx = 0;
		}

		pds_vdpa_cmd_set_mac(pdsv, pdsv->mac);
	}

	if (status & ~old_status & VIRTIO_CONFIG_S_FEATURES_OK) {
@@ -532,7 +534,6 @@ static int pds_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
	struct device *dma_dev;
	struct pci_dev *pdev;
	struct device *dev;
	u8 mac[ETH_ALEN];
	int err;
	int i;

@@ -617,19 +618,18 @@ static int pds_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
	 * or set a random mac if default is 00:..:00
	 */
	if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MACADDR)) {
		ether_addr_copy(mac, add_config->net.mac);
		pds_vdpa_cmd_set_mac(pdsv, mac);
		ether_addr_copy(pdsv->mac, add_config->net.mac);
	} else {
		struct virtio_net_config __iomem *vc;

		vc = pdsv->vdpa_aux->vd_mdev.device;
		memcpy_fromio(mac, vc->mac, sizeof(mac));
		if (is_zero_ether_addr(mac)) {
			eth_random_addr(mac);
			dev_info(dev, "setting random mac %pM\n", mac);
			pds_vdpa_cmd_set_mac(pdsv, mac);
		memcpy_fromio(pdsv->mac, vc->mac, sizeof(pdsv->mac));
		if (is_zero_ether_addr(pdsv->mac)) {
			eth_random_addr(pdsv->mac);
			dev_info(dev, "setting random mac %pM\n", pdsv->mac);
		}
	}
	pds_vdpa_cmd_set_mac(pdsv, pdsv->mac);

	for (i = 0; i < pdsv->num_vqs; i++) {
		pdsv->vqs[i].qid = i;
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ struct pds_vdpa_device {
	u64 req_features;		/* features requested by vdpa */
	u8 vdpa_index;			/* rsvd for future subdevice use */
	u8 num_vqs;			/* num vqs in use */
	u8 mac[ETH_ALEN];		/* mac selected when the device was added */
	struct vdpa_callback config_cb;
	struct notifier_block nb;
};