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 void reset_pkt_input_ring(struct nitrox_device *ndev, int ring) { union nps_pkt_in_instr_ctl pkt_in_ctl; union nps_pkt_in_instr_baoff_dbell pkt_in_dbell; union nps_pkt_in_done_cnts pkt_in_cnts; u64 offset; offset = NPS_PKT_IN_INSTR_CTLX(ring); /* disable the ring */ pkt_in_ctl.value = nitrox_read_csr(ndev, offset); pkt_in_ctl.s.enb = 0; nitrox_write_csr(ndev, offset, pkt_in_ctl.value); usleep_range(100, 150); /* wait to clear [ENB] */ do { pkt_in_ctl.value = nitrox_read_csr(ndev, offset); } while (pkt_in_ctl.s.enb); /* clear off door bell counts */ offset = NPS_PKT_IN_INSTR_BAOFF_DBELLX(ring); pkt_in_dbell.value = 0; pkt_in_dbell.s.dbell = 0xffffffff; nitrox_write_csr(ndev, offset, pkt_in_dbell.value); /* clear done counts */ offset = NPS_PKT_IN_DONE_CNTSX(ring); pkt_in_cnts.value = nitrox_read_csr(ndev, offset); nitrox_write_csr(ndev, offset, pkt_in_cnts.value); usleep_range(50, 100); }