408
408
if (!vdev->fw_info)
411
memset(vdev->fw_info, 0, sizeof(struct vnic_devcmd_fw_info));
411
413
a0 = vdev->fw_info_pa;
414
a1 = sizeof(struct vnic_devcmd_fw_info);
413
416
/* only get fw_info once and cache it */
414
417
err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO, &a0, &a1, wait);
418
if (err == ERR_ECMDUNKNOWN) {
419
err = vnic_dev_cmd(vdev, CMD_MCPU_FW_INFO_OLD,
417
424
*fw_info = vdev->fw_info;
422
int vnic_dev_hw_version(struct vnic_dev *vdev, enum vnic_dev_hw_version *hw_ver)
424
struct vnic_devcmd_fw_info *fw_info;
427
err = vnic_dev_fw_info(vdev, &fw_info);
431
if (strncmp(fw_info->hw_version, "A1", sizeof("A1")) == 0)
432
*hw_ver = VNIC_DEV_HW_VER_A1;
433
else if (strncmp(fw_info->hw_version, "A2", sizeof("A2")) == 0)
434
*hw_ver = VNIC_DEV_HW_VER_A2;
436
*hw_ver = VNIC_DEV_HW_VER_UNKNOWN;
441
429
int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, unsigned int size,
801
int vnic_dev_init_done(struct vnic_dev *vdev, int *done, int *err)
809
ret = vnic_dev_cmd(vdev, CMD_INIT_STATUS, &a0, &a1, wait);
815
*err = (a0 == 0) ? (int)a1:0;
820
int vnic_dev_init_prov(struct vnic_dev *vdev, u8 *buf, u32 len)
828
prov_buf = pci_alloc_consistent(vdev->pdev, len, &prov_pa);
832
memcpy(prov_buf, buf, len);
836
ret = vnic_dev_cmd(vdev, CMD_INIT_PROV_INFO, &a0, &a1, wait);
838
pci_free_consistent(vdev->pdev, len, prov_buf, prov_pa);
843
789
int vnic_dev_deinit(struct vnic_dev *vdev)
845
791
u64 a0 = 0, a1 = 0;
888
int vnic_dev_init_prov2(struct vnic_dev *vdev, u8 *buf, u32 len)
896
prov_buf = pci_alloc_consistent(vdev->pdev, len, &prov_pa);
900
memcpy(prov_buf, buf, len);
904
ret = vnic_dev_cmd(vdev, CMD_INIT_PROV_INFO2, &a0, &a1, wait);
906
pci_free_consistent(vdev->pdev, len, prov_buf, prov_pa);
911
int vnic_dev_enable2(struct vnic_dev *vdev, int active)
916
a0 = (active ? CMD_ENABLE2_ACTIVE : 0);
918
return vnic_dev_cmd(vdev, CMD_ENABLE2, &a0, &a1, wait);
921
static int vnic_dev_cmd_status(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
924
u64 a0 = cmd, a1 = 0;
928
ret = vnic_dev_cmd(vdev, CMD_STATUS, &a0, &a1, wait);
935
int vnic_dev_enable2_done(struct vnic_dev *vdev, int *status)
937
return vnic_dev_cmd_status(vdev, CMD_ENABLE2, status);
940
int vnic_dev_deinit_done(struct vnic_dev *vdev, int *status)
942
return vnic_dev_cmd_status(vdev, CMD_DEINIT, status);