int enic_del_vlan(struct enic *enic, u16 vlanid) { u64 a0 = vlanid, a1 = 0; int wait = 1000; int err; err = vnic_dev_cmd(enic->vdev, CMD_VLAN_DEL, &a0, &a1, wait); if (err) dev_err(enic_get_dev(enic), "Can't delete vlan id, %d\n", err); return err; }
int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev, u8 ig_vlan_rewrite_mode) { u64 a0 = ig_vlan_rewrite_mode, a1 = 0; int wait = 1000; if (vnic_dev_capable(vdev, CMD_IG_VLAN_REWRITE_MODE)) return vnic_dev_cmd(vdev, CMD_IG_VLAN_REWRITE_MODE, &a0, &a1, wait); else return 0; }
void vnic_dev_notify_unset(struct vnic_dev *vdev) { u64 a0, a1; int wait = 1000; a0 = 0; a1 = 0x0000ffff00000000ULL; a1 += sizeof(struct vnic_devcmd_notify); vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); vdev->notify_sz = 0; }
int vnic_dev_overlay_offload_cfg(struct vnic_dev *vdev, u8 overlay, u16 vxlan_udp_port_number) { u64 a0, a1; int wait = 1000; int ret = -EINVAL; a0 = overlay; a1 = vxlan_udp_port_number; ret = vnic_dev_cmd(vdev, CMD_OVERLAY_OFFLOAD_CFG, &a0, &a1, wait); return ret; }
int vnic_dev_raise_intr(struct vnic_dev *vdev, u16 intr) { u64 a0 = intr, a1 = 0; int wait = 1000; int err; err = vnic_dev_cmd(vdev, CMD_IAR, &a0, &a1, wait); if (err) pr_err("Failed to raise INTR[%d], err %d\n", intr, err); return err; }
void vnic_dev_notify_unset(struct vnic_dev *vdev) { u64 a0, a1; int wait = 1000; a0 = 0; /* paddr = 0 to unset notify buffer */ a1 = 0x0000ffff00000000ULL; /* intr num = -1 to unreg for intr */ a1 += sizeof(struct vnic_devcmd_notify); vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); vdev->notify_sz = 0; }
int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev, u8 ig_vlan_rewrite_mode) { u64 a0 = ig_vlan_rewrite_mode, a1 = 0; int wait = 1000; int err; err = vnic_dev_cmd(vdev, CMD_IG_VLAN_REWRITE_MODE, &a0, &a1, wait); if (err == ERR_ECMDUNKNOWN) return 0; return err; }
int vnic_dev_overlay_offload_ctrl(struct vnic_dev *vdev, u8 overlay, u8 config) { u64 a0, a1; int wait = 1000; int ret = -EINVAL; a0 = overlay; a1 = config; ret = vnic_dev_cmd(vdev, CMD_OVERLAY_OFFLOAD_CTRL, &a0, &a1, wait); return ret; }
static int vnic_dev_cmd_status(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, int *status) { u64 a0 = cmd, a1 = 0; int wait = 1000; int ret; ret = vnic_dev_cmd(vdev, CMD_STATUS, &a0, &a1, wait); if (!ret) *status = (int)a0; return ret; }
void vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; int i; for (i = 0; i < ETH_ALEN; i++) ((u8 *)&a0)[i] = addr[i]; err = vnic_dev_cmd(vdev, CMD_ADDR_ADD, &a0, &a1, wait); if (err) printk(KERN_ERR "Can't add addr [%pM], %d\n", addr, err); }
void vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; int i; for (i = 0; i < ETH_ALEN; i++) ((u8 *)&a0)[i] = addr[i]; err = vnic_dev_cmd(vdev, CMD_ADDR_DEL, &a0, &a1, wait); if (err) pr_err("Can't del addr [%pM], %d\n", addr, err); }
int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg) { u64 a0 = (u32)arg, a1 = 0; int wait = 1000; int err; if (vnic_dev_capable(vdev, CMD_HANG_RESET)) { return vnic_dev_cmd(vdev, CMD_HANG_RESET, &a0, &a1, wait); } else { err = vnic_dev_soft_reset(vdev, arg); if (err) return err; return vnic_dev_init(vdev, 0); } }
int vnic_dev_open_done(struct vnic_dev *vdev, int *done) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; *done = 0; err = vnic_dev_cmd(vdev, CMD_OPEN_STATUS, &a0, &a1, wait); if (err) return err; *done = (a0 == 0); return 0; }
int vnic_dev_add_addr(struct vnic_dev *vdev, const u8 *addr) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; int i; for (i = 0; i < ETH_ALEN; i++) ((u8 *)&a0)[i] = addr[i]; err = vnic_dev_cmd(vdev, CMD_ADDR_ADD, &a0, &a1, wait); if (err) pr_err("Can't add addr [%pM], %d\n", addr, err); return err; }
int vnic_dev_soft_reset_done(struct vnic_dev *vdev, int *done) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; *done = 0; err = vnic_dev_cmd(vdev, CMD_SOFT_RESET_STATUS, &a0, &a1, wait); if (err) return err; *done = (a0 == 0); return 0; }
int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg) { u64 a0 = (u32)arg, a1 = 0; int wait = 1000; int err; err = vnic_dev_cmd(vdev, CMD_HANG_RESET, &a0, &a1, wait); if (err == ERR_ECMDUNKNOWN) { err = vnic_dev_soft_reset(vdev, arg); if (err) return err; return vnic_dev_init(vdev, 0); } return err; }
static int vnic_dev_notify_unsetcmd(struct vnic_dev *vdev) { u64 a0, a1; int wait = 1000; int err; a0 = 0; a1 = 0x0000ffff00000000ULL; a1 += sizeof(struct vnic_devcmd_notify); err = vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); vdev->notify = NULL; vdev->notify_pa = 0; vdev->notify_sz = 0; return err; }
int enic_set_nic_cfg(struct enic *enic, u8 rss_default_cpu, u8 rss_hash_type, u8 rss_hash_bits, u8 rss_base_cpu, u8 rss_enable, u8 tso_ipid_split_en, u8 ig_vlan_strip_en) { u64 a0, a1; u32 nic_cfg; int wait = 1000; vnic_set_nic_cfg(&nic_cfg, rss_default_cpu, rss_hash_type, rss_hash_bits, rss_base_cpu, rss_enable, tso_ipid_split_en, ig_vlan_strip_en); a0 = nic_cfg; a1 = 0; return vnic_dev_cmd(enic->vdev, CMD_NIC_CFG, &a0, &a1, wait); }
void vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast, int broadcast, int promisc, int allmulti) { u64 a0, a1 = 0; int wait = 1000; int err; a0 = (directed ? CMD_PFILTER_DIRECTED : 0) | (multicast ? CMD_PFILTER_MULTICAST : 0) | (broadcast ? CMD_PFILTER_BROADCAST : 0) | (promisc ? CMD_PFILTER_PROMISCUOUS : 0) | (allmulti ? CMD_PFILTER_ALL_MULTICAST : 0); err = vnic_dev_cmd(vdev, CMD_PACKET_FILTER, &a0, &a1, wait); if (err) printk(KERN_ERR "Can't set packet filter\n"); }
void vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; int i; for (i = 0; i < ETH_ALEN; i++) ((u8 *)&a0)[i] = addr[i]; err = vnic_dev_cmd(vdev, CMD_ADDR_DEL, &a0, &a1, wait); if (err) printk(KERN_ERR "Can't del addr [%02x:%02x:%02x:%02x:%02x:%02x], %d\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], err); }
static int vnic_dev_notify_unsetcmd(struct vnic_dev *vdev) { u64 a0, a1; int wait = 1000; int err; a0 = 0; /* paddr = 0 to unset notify buffer */ a1 = 0x0000ffff00000000ULL; /* intr num = -1 to unreg for intr */ a1 += sizeof(struct vnic_devcmd_notify); err = vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); vdev->notify = NULL; vdev->notify_pa = 0; vdev->notify_sz = 0; return err; }
/* * Issue HANG_NOTIFY to the VNIC */ int usd_vnic_hang_notify( struct usd_qp *uqp) { struct usd_qp_impl *qp; u64 a0; int ret; qp = to_qpi(uqp); ret = vnic_dev_cmd(qp->uq_vf->vf_vdev, CMD_HANG_NOTIFY, &a0, &a0, 1000); if (ret != 0) { fprintf(stderr, "hang_notify ret = %d\n", ret); return ret; } return 0; }
int vnic_dev_mac_addr(struct vnic_dev *vdev, u8 *mac_addr) { u64 a0, a1; int wait = 1000; int err, i; for (i = 0; i < ETH_ALEN; i++) mac_addr[i] = 0; err = vnic_dev_cmd(vdev, CMD_MAC_ADDR, &a0, &a1, wait); if (err) return err; for (i = 0; i < ETH_ALEN; i++) mac_addr[i] = ((u8 *)&a0)[i]; return 0; }
int vnic_dev_init_done(struct vnic_dev *vdev, int *done, int *err) { u64 a0 = 0, a1 = 0; int wait = 1000; int ret; *done = 0; ret = vnic_dev_cmd(vdev, CMD_INIT_STATUS, &a0, &a1, wait); if (ret) return ret; *done = (a0 == 0); *err = (a0 == 0) ? a1 : 0; return 0; }
int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats) { u64 a0, a1; int wait = 1000; if (!vdev->stats) { vdev->stats = dma_alloc_coherent(&vdev->pdev->dev, sizeof(struct vnic_stats), &vdev->stats_pa, GFP_KERNEL); if (!vdev->stats) return -ENOMEM; } *stats = vdev->stats; a0 = vdev->stats_pa; a1 = sizeof(struct vnic_stats); return vnic_dev_cmd(vdev, CMD_STATS_DUMP, &a0, &a1, wait); }
int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr) { u64 a0, a1; int wait = 1000; if (!vdev->notify) { vdev->notify = dma_alloc_coherent(&vdev->pdev->dev, sizeof(struct vnic_devcmd_notify), &vdev->notify_pa, GFP_KERNEL); if (!vdev->notify) return -ENOMEM; } a0 = vdev->notify_pa; a1 = ((u64)intr << 32) & 0x0000ffff00000000ULL; a1 += sizeof(struct vnic_devcmd_notify); return vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); }
int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; *done = 0; err = vnic_dev_cmd(vdev, CMD_HANG_RESET_STATUS, &a0, &a1, wait); if (err) { if (err == ERR_ECMDUNKNOWN) return vnic_dev_soft_reset_done(vdev, done); return err; } *done = (a0 == 0); return 0; }
int enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf, enum vnic_devcmd_cmd cmd, u64 *a0, u64 *a1, int wait) { int err; struct enic *enic = netdev_priv(netdev); struct vnic_dev *vdev = enic->vdev; spin_lock(&enic->enic_api_lock); spin_lock(&enic->devcmd_lock); vnic_dev_cmd_proxy_by_index_start(vdev, vf); err = vnic_dev_cmd(vdev, cmd, a0, a1, wait); vnic_dev_cmd_proxy_end(vdev); spin_unlock(&enic->devcmd_lock); spin_unlock(&enic->enic_api_lock); return err; }
static int vnic_dev_notify_setcmd(struct vnic_dev *vdev, void *notify_addr, dma_addr_t notify_pa, u16 intr) { u64 a0, a1; int wait = 1000; int r; memset(notify_addr, 0, sizeof(struct vnic_devcmd_notify)); vdev->notify = notify_addr; vdev->notify_pa = notify_pa; a0 = (u64)notify_pa; a1 = ((u64)intr << 32) & 0x0000ffff00000000ULL; a1 += sizeof(struct vnic_devcmd_notify); r = vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait); vdev->notify_sz = (r == 0) ? (u32)a1 : 0; return r; }
int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done) { u64 a0 = 0, a1 = 0; int wait = 1000; int err; *done = 0; if (vnic_dev_capable(vdev, CMD_HANG_RESET_STATUS)) { err = vnic_dev_cmd(vdev, CMD_HANG_RESET_STATUS, &a0, &a1, wait); if (err) return err; } else { return vnic_dev_soft_reset_done(vdev, done); } *done = (a0 == 0); return 0; }