• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/infiniband/hw/qib/

Lines Matching refs:rcd

90 	struct qib_ctxtdata *rcd = ctxt_fp(fp);
93 struct qib_devdata *dd = rcd->dd;
94 struct qib_pportdata *ppd = rcd->ppd;
99 subctxt_cnt = rcd->subctxt_cnt;
124 ret = dd->f_get_base_info(rcd, kinfo);
130 kinfo->spi_tidegrcnt = rcd->rcvegrcnt;
136 rcd->rcvegrbuf_chunks * rcd->rcvegrbuf_size;
137 kinfo->spi_rcv_egrperchunk = rcd->rcvegrbufs_perchunk;
139 rcd->rcvegrbuf_chunks;
173 kinfo->spi_rcvhdr_base = (u64) rcd->rcvhdrq_phys;
174 kinfo->spi_rcvhdr_tailaddr = (u64) rcd->rcvhdrqtailaddr_phys;
176 kinfo->spi_rcv_egrbufs = (u64) rcd->rcvegr_phys;
182 kinfo->spi_uregbase = (u64) dd->uregbase + dd->ureg_align * rcd->ctxt;
184 kinfo->spi_piocnt = rcd->piocnt;
185 kinfo->spi_piobufbase = (u64) rcd->piobufs;
186 kinfo->spi_sendbuf_status = cvt_kvaddr(rcd->user_event_mask);
188 kinfo->spi_piocnt = (rcd->piocnt / subctxt_cnt) +
189 (rcd->piocnt % subctxt_cnt);
191 kinfo->spi_piobufbase = (u64) rcd->piobufs +
193 (rcd->piocnt - kinfo->spi_piocnt);
197 kinfo->spi_piocnt = rcd->piocnt / subctxt_cnt;
198 kinfo->spi_piobufbase = (u64) rcd->piobufs +
204 cvt_kvaddr(&rcd->user_event_mask[subctxt_fp(fp)]);
206 kinfo->spi_subctxt_uregbase = cvt_kvaddr(rcd->subctxt_uregbase);
209 cvt_kvaddr(rcd->subctxt_rcvegrbuf);
211 cvt_kvaddr(rcd->subctxt_rcvhdr_base);
231 kinfo->spi_ctxt = rcd->ctxt;
250 * @rcd: the context
273 static int qib_tid_update(struct qib_ctxtdata *rcd, struct file *fp,
279 struct qib_devdata *dd = rcd->dd;
297 ctxttid = rcd->ctxt * dd->rcvtidcnt;
298 if (!rcd->subctxt_cnt) {
300 tid = rcd->tidcursor;
303 tidcnt = (dd->rcvtidcnt / rcd->subctxt_cnt) +
304 (dd->rcvtidcnt % rcd->subctxt_cnt);
309 tidcnt = dd->rcvtidcnt / rcd->subctxt_cnt;
320 pagep = (struct page **) rcd->tid_pg_list;
440 if (!rcd->subctxt_cnt)
441 rcd->tidcursor = tid;
452 * @rcd: the context
466 static int qib_tid_free(struct qib_ctxtdata *rcd, unsigned subctxt,
471 struct qib_devdata *dd = rcd->dd;
486 ctxttid = rcd->ctxt * dd->rcvtidcnt;
487 if (!rcd->subctxt_cnt)
490 tidcnt = (dd->rcvtidcnt / rcd->subctxt_cnt) +
491 (dd->rcvtidcnt % rcd->subctxt_cnt);
494 tidcnt = dd->rcvtidcnt / rcd->subctxt_cnt;
541 * @rcd: the context
555 static int qib_set_part_key(struct qib_ctxtdata *rcd, u16 key)
557 struct qib_pportdata *ppd = rcd->ppd;
581 for (i = 0; i < ARRAY_SIZE(rcd->pkeys); i++) {
582 if (!rcd->pkeys[i] && pidx == -1)
584 if (rcd->pkeys[i] == key) {
602 rcd->pkeys[pidx] = key;
630 rcd->pkeys[pidx] = key;
645 * @rcd: the context
653 static int qib_manage_rcvq(struct qib_ctxtdata *rcd, unsigned subctxt,
656 struct qib_devdata *dd = rcd->dd;
671 if (rcd->rcvhdrtail_kvaddr)
672 qib_clear_rcvhdrtail(rcd);
676 dd->f_rcvctrl(rcd->ppd, rcvctrl_op, rcd->ctxt);
682 static void qib_clean_part_key(struct qib_ctxtdata *rcd,
687 struct qib_pportdata *ppd = rcd->ppd;
695 for (i = 0; i < ARRAY_SIZE(rcd->pkeys); i++) {
696 if (!rcd->pkeys[i])
701 (rcd->pkeys[i] & 0x7fff))
709 rcd->pkeys[i] = 0;
716 static int qib_mmap_mem(struct vm_area_struct *vma, struct qib_ctxtdata *rcd,
719 struct qib_devdata *dd = rcd->dd;
752 "bytes failed: %d\n", what, rcd->ctxt,
790 struct qib_ctxtdata *rcd,
837 struct qib_ctxtdata *rcd)
839 struct qib_devdata *dd = rcd->dd;
845 size = rcd->rcvegrbuf_size;
846 total_size = rcd->rcvegrbuf_chunks * size;
867 for (i = 0; i < rcd->rcvegrbuf_chunks; i++, start += size) {
868 pfn = virt_to_phys(rcd->rcvegrbuf[i]) >> PAGE_SHIFT;
902 struct qib_ctxtdata *rcd, unsigned subctxt)
904 struct qib_devdata *dd = rcd->dd;
911 subctxt_cnt = rcd->subctxt_cnt;
912 size = rcd->rcvegrbuf_chunks * rcd->rcvegrbuf_size;
919 if (pgaddr == cvt_kvaddr(rcd->subctxt_uregbase)) {
920 addr = rcd->subctxt_uregbase;
922 } else if (pgaddr == cvt_kvaddr(rcd->subctxt_rcvhdr_base)) {
923 addr = rcd->subctxt_rcvhdr_base;
924 size = rcd->rcvhdrq_size * subctxt_cnt;
925 } else if (pgaddr == cvt_kvaddr(rcd->subctxt_rcvegrbuf)) {
926 addr = rcd->subctxt_rcvegrbuf;
928 } else if (pgaddr == cvt_kvaddr(rcd->subctxt_uregbase +
930 addr = rcd->subctxt_uregbase + PAGE_SIZE * subctxt;
932 } else if (pgaddr == cvt_kvaddr(rcd->subctxt_rcvhdr_base +
933 rcd->rcvhdrq_size * subctxt)) {
934 addr = rcd->subctxt_rcvhdr_base +
935 rcd->rcvhdrq_size * subctxt;
936 size = rcd->rcvhdrq_size;
937 } else if (pgaddr == cvt_kvaddr(&rcd->user_event_mask[subctxt])) {
938 addr = rcd->user_event_mask;
940 } else if (pgaddr == cvt_kvaddr(rcd->subctxt_rcvegrbuf +
942 addr = rcd->subctxt_rcvegrbuf + size * subctxt;
985 struct qib_ctxtdata *rcd;
991 rcd = ctxt_fp(fp);
992 if (!rcd || !(vma->vm_flags & VM_SHARED)) {
996 dd = rcd->dd;
1023 ret = mmap_kvaddr(vma, pgaddr, rcd, subctxt_fp(fp));
1030 ureg = dd->uregbase + dd->ureg_align * rcd->ctxt;
1031 if (!rcd->subctxt_cnt) {
1033 piocnt = rcd->piocnt;
1034 piobufs = rcd->piobufs;
1037 piocnt = (rcd->piocnt / rcd->subctxt_cnt) +
1038 (rcd->piocnt % rcd->subctxt_cnt);
1039 piobufs = rcd->piobufs +
1040 dd->palign * (rcd->piocnt - piocnt);
1045 piocnt = rcd->piocnt / rcd->subctxt_cnt;
1046 piobufs = rcd->piobufs + dd->palign * piocnt * slave;
1052 ret = mmap_piobufs(vma, dd, rcd, piobufs, piocnt);
1055 ret = qib_mmap_mem(vma, rcd, PAGE_SIZE,
1058 else if (pgaddr == rcd->rcvegr_phys)
1059 ret = mmap_rcvegrbufs(vma, rcd);
1060 else if (pgaddr == (u64) rcd->rcvhdrq_phys)
1066 ret = qib_mmap_mem(vma, rcd, rcd->rcvhdrq_size,
1067 rcd->rcvhdrq, 1, "rcvhdrq");
1068 else if (pgaddr == (u64) rcd->rcvhdrqtailaddr_phys)
1070 ret = qib_mmap_mem(vma, rcd, PAGE_SIZE,
1071 rcd->rcvhdrtail_kvaddr, 0,
1089 static unsigned int qib_poll_urgent(struct qib_ctxtdata *rcd,
1093 struct qib_devdata *dd = rcd->dd;
1096 poll_wait(fp, &rcd->wait, pt);
1099 if (rcd->urgent != rcd->urgent_poll) {
1101 rcd->urgent_poll = rcd->urgent;
1104 set_bit(QIB_CTXT_WAITING_URG, &rcd->flag);
1111 static unsigned int qib_poll_next(struct qib_ctxtdata *rcd,
1115 struct qib_devdata *dd = rcd->dd;
1118 poll_wait(fp, &rcd->wait, pt);
1121 if (dd->f_hdrqempty(rcd)) {
1122 set_bit(QIB_CTXT_WAITING_RCV, &rcd->flag);
1123 dd->f_rcvctrl(rcd->ppd, QIB_RCVCTRL_INTRAVAIL_ENB, rcd->ctxt);
1134 struct qib_ctxtdata *rcd;
1137 rcd = ctxt_fp(fp);
1138 if (!rcd)
1140 else if (rcd->poll_type == QIB_POLL_TYPE_URGENT)
1141 pollflag = qib_poll_urgent(rcd, fp, pt);
1142 else if (rcd->poll_type == QIB_POLL_TYPE_ANYRCV)
1143 pollflag = qib_poll_next(rcd, fp, pt);
1180 struct qib_ctxtdata *rcd,
1213 rcd->subctxt_uregbase = vmalloc_user(PAGE_SIZE * num_subctxts);
1214 if (!rcd->subctxt_uregbase) {
1218 /* Note: rcd->rcvhdrq_size isn't initialized yet. */
1221 rcd->subctxt_rcvhdr_base = vmalloc_user(size);
1222 if (!rcd->subctxt_rcvhdr_base) {
1227 rcd->subctxt_rcvegrbuf = vmalloc_user(rcd->rcvegrbuf_chunks *
1228 rcd->rcvegrbuf_size *
1230 if (!rcd->subctxt_rcvegrbuf) {
1235 rcd->subctxt_cnt = uinfo->spu_subctxt_cnt;
1236 rcd->subctxt_id = uinfo->spu_subctxt_id;
1237 rcd->active_slaves = 1;
1238 rcd->redirect_seq_cnt = 1;
1239 set_bit(QIB_CTXT_MASTER_UNINIT, &rcd->flag);
1243 vfree(rcd->subctxt_rcvhdr_base);
1245 vfree(rcd->subctxt_uregbase);
1246 rcd->subctxt_uregbase = NULL;
1255 struct qib_ctxtdata *rcd;
1259 rcd = qib_create_ctxtdata(ppd, ctxt);
1265 if (rcd)
1270 if (!rcd || !ptmp) {
1276 rcd->userversion = uinfo->spu_userversion;
1277 ret = init_subctxts(dd, rcd, uinfo);
1280 rcd->tid_pg_list = ptmp;
1281 rcd->pid = current->pid;
1282 init_waitqueue_head(&dd->rcd[ctxt]->wait);
1283 strlcpy(rcd->comm, current->comm, sizeof(rcd->comm));
1284 ctxt_fp(fp) = rcd;
1290 dd->rcd[ctxt] = NULL;
1291 kfree(rcd);
1322 for (ctxt = dd->first_user_ctxt; ctxt < dd->cfgctxts && dd->rcd[ctxt];
1395 if (dd->rcd[ctxt])
1441 struct qib_ctxtdata *rcd = dd->rcd[i];
1444 if (!rcd || !rcd->cnt)
1447 if (rcd->subctxt_id != uinfo->spu_subctxt_id)
1450 if (rcd->subctxt_cnt != uinfo->spu_subctxt_cnt ||
1451 rcd->userversion != uinfo->spu_userversion ||
1452 rcd->cnt >= rcd->subctxt_cnt) {
1456 ctxt_fp(fp) = rcd;
1457 subctxt_fp(fp) = rcd->cnt++;
1458 rcd->subpid[subctxt_fp(fp)] = current->pid;
1460 rcd->active_slaves |= 1 << subctxt_fp(fp);
1527 const struct qib_ctxtdata *rcd = fd->rcd;
1528 const struct qib_devdata *dd = rcd->dd;
1533 rcd->ctxt,
1576 struct qib_ctxtdata *rcd = ctxt_fp(fp);
1582 ret = wait_event_interruptible(rcd->wait,
1583 !test_bit(QIB_CTXT_MASTER_UNINIT, &rcd->flag));
1587 dd = rcd->dd;
1590 uctxt = rcd->ctxt - dd->first_user_ctxt;
1592 rcd->piocnt = dd->pbufsctxt + 1;
1593 rcd->pio_base = rcd->piocnt * uctxt;
1595 rcd->piocnt = dd->pbufsctxt;
1596 rcd->pio_base = rcd->piocnt * uctxt +
1606 if ((rcd->pio_base + rcd->piocnt) > dd->piobcnt2k) {
1607 if (rcd->pio_base >= dd->piobcnt2k) {
1610 dd->unit, rcd->ctxt);
1614 rcd->piocnt = dd->piobcnt2k - rcd->pio_base;
1616 rcd->ctxt, rcd->piocnt);
1619 rcd->piobufs = dd->pio2k_bufbase + rcd->pio_base * dd->palign;
1620 qib_chg_pioavailkernel(dd, rcd->pio_base, rcd->piocnt,
1621 TXCHK_CHG_TYPE_USER, rcd);
1636 * array for time being. If rcd->ctxt > chip-supported,
1640 ret = qib_create_rcvhdrq(dd, rcd);
1642 ret = qib_setup_eagerbufs(rcd);
1646 rcd->tidcursor = 0; /* start at beginning after open */
1649 rcd->urgent = 0;
1650 rcd->urgent_poll = 0;
1663 if (rcd->rcvhdrtail_kvaddr)
1664 qib_clear_rcvhdrtail(rcd);
1666 dd->f_rcvctrl(rcd->ppd, QIB_RCVCTRL_CTXT_ENB | QIB_RCVCTRL_TIDFLOW_ENB,
1667 rcd->ctxt);
1670 if (rcd->subctxt_cnt) {
1671 clear_bit(QIB_CTXT_MASTER_UNINIT, &rcd->flag);
1672 wake_up(&rcd->wait);
1677 qib_chg_pioavailkernel(dd, rcd->pio_base, rcd->piocnt,
1678 TXCHK_CHG_TYPE_KERN, rcd);
1685 * @rcd: ctxt
1690 static void unlock_expected_tids(struct qib_ctxtdata *rcd)
1692 struct qib_devdata *dd = rcd->dd;
1693 int ctxt_tidbase = rcd->ctxt * dd->rcvtidcnt;
1717 struct qib_ctxtdata *rcd;
1727 rcd = fd->rcd;
1728 if (!rcd) {
1733 dd = rcd->dd;
1740 qib_user_sdma_queue_drain(rcd->ppd, fd->pq);
1747 if (--rcd->cnt) {
1748 rcd->active_slaves &= ~(1 << fd->subctxt);
1749 rcd->subpid[fd->subctxt] = 0;
1756 ctxt = rcd->ctxt;
1757 dd->rcd[ctxt] = NULL;
1758 pid = rcd->pid;
1759 rcd->pid = 0;
1762 if (rcd->rcvwait_to || rcd->piowait_to ||
1763 rcd->rcvnowait || rcd->pionowait) {
1764 rcd->rcvwait_to = 0;
1765 rcd->piowait_to = 0;
1766 rcd->rcvnowait = 0;
1767 rcd->pionowait = 0;
1769 if (rcd->flag)
1770 rcd->flag = 0;
1774 dd->f_rcvctrl(rcd->ppd, QIB_RCVCTRL_CTXT_DIS |
1778 qib_clean_part_key(rcd, dd);
1779 qib_disarm_piobufs(dd, rcd->pio_base, rcd->piocnt);
1780 qib_chg_pioavailkernel(dd, rcd->pio_base,
1781 rcd->piocnt, TXCHK_CHG_TYPE_KERN, NULL);
1783 dd->f_clear_tids(dd, rcd);
1786 unlock_expected_tids(rcd);
1791 qib_free_ctxtdata(dd, rcd); /* after releasing the mutex */
1803 struct qib_ctxtdata *rcd = ctxt_fp(fp);
1809 info.unit = rcd->dd->unit;
1810 info.port = rcd->ppd->port;
1811 info.ctxt = rcd->ctxt;
1814 info.num_ctxts = rcd->dd->cfgctxts - rcd->dd->first_user_ctxt;
1815 info.num_subctxts = rcd->subctxt_cnt;
1861 static int disarm_req_delay(struct qib_ctxtdata *rcd)
1865 if (!usable(rcd->ppd)) {
1873 if (rcd->user_event_mask) {
1879 &rcd->user_event_mask[0]);
1880 for (i = 1; i < rcd->subctxt_cnt; i++)
1882 &rcd->user_event_mask[i]);
1884 for (i = 0; !usable(rcd->ppd) && i < 300; i++)
1898 struct qib_ctxtdata *rcd;
1905 rcd = ppd->dd->rcd[ctxt];
1906 if (!rcd)
1908 if (rcd->user_event_mask) {
1914 set_bit(evtbit, &rcd->user_event_mask[0]);
1915 for (i = 1; i < rcd->subctxt_cnt; i++)
1916 set_bit(evtbit, &rcd->user_event_mask[i]);
1935 static int qib_user_event_ack(struct qib_ctxtdata *rcd, int subctxt,
1944 (void)qib_disarm_piobufs_ifneeded(rcd);
1945 ret = disarm_req_delay(rcd);
1947 clear_bit(i, &rcd->user_event_mask[subctxt]);
1956 struct qib_ctxtdata *rcd;
2064 rcd = ctxt_fp(fp);
2065 if (!rcd && cmd.type != QIB_CMD_ASSIGN_CTXT) {
2087 ret = qib_manage_rcvq(rcd, subctxt_fp(fp), cmd.cmd.recv_ctrl);
2096 ret = qib_tid_update(rcd, fp, &cmd.cmd.tid_info);
2100 ret = qib_tid_free(rcd, subctxt_fp(fp), &cmd.cmd.tid_info);
2104 ret = qib_set_part_key(rcd, cmd.cmd.part_key);
2108 (void)qib_disarm_piobufs_ifneeded(rcd);
2109 ret = disarm_req_delay(rcd);
2113 qib_force_pio_avail_update(rcd->dd);
2117 rcd->poll_type = cmd.cmd.poll_type;
2121 rcd->dd->f_set_armlaunch(rcd->dd, cmd.cmd.armlaunch_ctrl);
2131 ret = qib_sdma_get_complete(rcd->ppd,
2138 ret = qib_user_event_ack(rcd, subctxt_fp(fp),
2154 struct qib_ctxtdata *rcd = ctxt_fp(iocb->ki_filp);
2160 return qib_user_sdma_writev(rcd, pq, iov, dim);