static int nitrox_init_pkt_cmdqs(struct nitrox_device *ndev) { int i, err, size; size = ndev->nr_queues * sizeof(struct nitrox_cmdq); ndev->pkt_cmdqs = kzalloc(size, GFP_KERNEL); if (!ndev->pkt_cmdqs) return -ENOMEM; for (i = 0; i < ndev->nr_queues; i++) { struct nitrox_cmdq *cmdq; u64 offset; cmdq = &ndev->pkt_cmdqs[i]; cmdq->ndev = ndev; cmdq->qno = i; cmdq->instr_size = sizeof(struct nps_pkt_instr); offset = NPS_PKT_IN_INSTR_BAOFF_DBELLX(i); /* SE ring doorbell address for this queue */ cmdq->dbell_csr_addr = NITROX_CSR_ADDR(ndev, offset); err = cmdq_common_init(cmdq); if (err) goto pkt_cmdq_fail; } return 0; pkt_cmdq_fail: nitrox_cleanup_pkt_cmdqs(ndev); return err; }
static int nitrox_setup_pkt_slc_bh(struct nitrox_device *ndev) { u32 size; int i; size = ndev->nr_queues * sizeof(struct bh_data); ndev->bh.slc = kzalloc(size, GFP_KERNEL); if (!ndev->bh.slc) return -ENOMEM; for (i = 0; i < ndev->nr_queues; i++) { struct bh_data *bh = &ndev->bh.slc[i]; u64 offset; offset = NPS_PKT_SLC_CNTSX(i); /* pre calculate completion count address */ bh->completion_cnt_csr_addr = NITROX_CSR_ADDR(ndev, offset); bh->cmdq = &ndev->pkt_cmdqs[i]; tasklet_init(&bh->resp_handler, pkt_slc_resp_handler, (unsigned long)bh); } return 0; }