bphy_rawdev_selftest(uint16_t dev_id)
{
unsigned int i, queues, descs;
+ uint16_t pf_func;
uint64_t max_irq;
int ret;
goto err_desc;
}
+ ret = rte_pmd_bphy_npa_pf_func_get(dev_id, &pf_func);
+ if (ret || pf_func == 0)
+ plt_warn("NPA pf_func is invalid");
+
+ ret = rte_pmd_bphy_sso_pf_func_get(dev_id, &pf_func);
+ if (ret || pf_func == 0)
+ plt_warn("SSO pf_func is invalid");
+
ret = rte_pmd_bphy_intr_init(dev_id);
if (ret) {
plt_err("intr init failed");
static void
bphy_rawdev_get_name(char *name, struct rte_pci_device *pci_dev)
{
- snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "BPHY:%x:%02x.%x",
+ snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "BPHY:%02x:%02x.%x",
pci_dev->addr.bus, pci_dev->addr.devid,
pci_dev->addr.function);
}
{
struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
struct cnxk_bphy_irq_msg *msg = buffers[0]->buf_addr;
+ struct bphy_irq_queue *qp = &bphy_dev->queues[0];
unsigned int queue = (size_t)context;
struct cnxk_bphy_irq_info *info;
- int ret = 0;
+ struct cnxk_bphy_mem *mem;
+ uint16_t *pf_func;
+ void *rsp = NULL;
+ int ret;
if (queue >= RTE_DIM(bphy_dev->queues))
return -EINVAL;
switch (msg->type) {
case CNXK_BPHY_IRQ_MSG_TYPE_INIT:
ret = cnxk_bphy_intr_init(dev->dev_id);
+ if (ret)
+ return ret;
break;
case CNXK_BPHY_IRQ_MSG_TYPE_FINI:
cnxk_bphy_intr_fini(dev->dev_id);
ret = cnxk_bphy_intr_register(dev->dev_id, info->irq_num,
info->handler, info->data,
info->cpu);
+ if (ret)
+ return ret;
break;
case CNXK_BPHY_IRQ_MSG_TYPE_UNREGISTER:
info = (struct cnxk_bphy_irq_info *)msg->data;
cnxk_bphy_intr_unregister(dev->dev_id, info->irq_num);
break;
case CNXK_BPHY_IRQ_MSG_TYPE_MEM_GET:
- bphy_dev->queues[queue].rsp = &bphy_dev->mem;
+ mem = rte_zmalloc(NULL, sizeof(*mem), 0);
+ if (!mem)
+ return -ENOMEM;
+
+ *mem = bphy_dev->mem;
+ rsp = mem;
+ break;
+ case CNXK_BPHY_MSG_TYPE_NPA_PF_FUNC:
+ pf_func = rte_malloc(NULL, sizeof(*pf_func), 0);
+ if (!pf_func)
+ return -ENOMEM;
+
+ *pf_func = roc_bphy_npa_pf_func_get();
+ rsp = pf_func;
+ break;
+ case CNXK_BPHY_MSG_TYPE_SSO_PF_FUNC:
+ pf_func = rte_malloc(NULL, sizeof(*pf_func), 0);
+ if (!pf_func)
+ return -ENOMEM;
+
+ *pf_func = roc_bphy_sso_pf_func_get();
+ rsp = pf_func;
break;
default:
- ret = -EINVAL;
+ return -EINVAL;
}
- return ret;
+ /* get rid of last response if any */
+ if (qp->rsp) {
+ RTE_LOG(WARNING, PMD, "Previous response got overwritten\n");
+ rte_free(qp->rsp);
+ }
+ qp->rsp = rsp;
+
+ return 1;
}
static int
{
struct bphy_device *bphy_dev = (struct bphy_device *)dev->dev_private;
unsigned int queue = (size_t)context;
+ struct bphy_irq_queue *qp;
if (queue >= RTE_DIM(bphy_dev->queues))
return -EINVAL;
if (count == 0)
return 0;
- buffers[0]->buf_addr = bphy_dev->queues[queue].rsp;
+ qp = &bphy_dev->queues[queue];
+ if (qp->rsp) {
+ buffers[0]->buf_addr = qp->rsp;
+ qp->rsp = NULL;
+
+ return 1;
+ }
return 0;
}
bphy_dev = (struct bphy_device *)bphy_rawdev->dev_private;
bphy_dev->mem.res0 = pci_dev->mem_resource[0];
bphy_dev->mem.res2 = pci_dev->mem_resource[2];
+ bphy_dev->bphy.pci_dev = pci_dev;
+
+ ret = roc_bphy_dev_init(&bphy_dev->bphy);
+ if (ret) {
+ rte_rawdev_pmd_release(bphy_rawdev);
+ return ret;
+ }
return 0;
}
bphy_rawdev_remove(struct rte_pci_device *pci_dev)
{
char name[RTE_RAWDEV_NAME_MAX_LEN];
+ struct bphy_device *bphy_dev;
struct rte_rawdev *rawdev;
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return -EINVAL;
}
+ bphy_rawdev_get_name(name, pci_dev);
rawdev = rte_rawdev_pmd_get_named_dev(name);
if (rawdev == NULL) {
plt_err("invalid device name (%s)", name);
return -EINVAL;
}
- bphy_rawdev_get_name(name, pci_dev);
+ bphy_dev = (struct bphy_device *)rawdev->dev_private;
+ roc_bphy_dev_fini(&bphy_dev->bphy);
return rte_rawdev_pmd_release(rawdev);
}