Home | History | Annotate | Download | only in pci

Lines Matching defs:qp

361  * The 16 TD rings form 8 queue pairs (QP). For example, QP
514 struct queue_pair qp[XMM_QP_COUNT];
567 struct queue_pair *qp;
821 struct queue_pair *qp = &xmm->qp[num];
823 qp->xmm = xmm;
824 qp->num = num;
825 qp->open = 0;
826 qp->depth = depth;
827 qp->page_size = page_size;
829 mutex_init(&qp->lock);
830 init_waitqueue_head(&qp->wq);
831 return qp;
834 static void xmm7360_qp_arm(struct xmm_dev *xmm, struct queue_pair *qp)
836 while (!xmm7360_td_ring_full(xmm, qp->num*2+1))
837 xmm7360_td_ring_read(xmm, qp->num*2+1);
841 static int xmm7360_qp_start(struct queue_pair *qp)
843 struct xmm_dev *xmm = qp->xmm;
846 mutex_lock(&qp->lock);
847 if (qp->open) {
851 qp->open = 1;
853 mutex_unlock(&qp->lock);
856 xmm7360_td_ring_create(xmm, qp->num*2, qp->depth, qp->page_size);
857 xmm7360_td_ring_create(xmm, qp->num*2+1, qp->depth, qp->page_size);
858 xmm7360_qp_arm(xmm, qp);
864 static void xmm7360_qp_resume(struct queue_pair *qp)
866 struct xmm_dev *xmm = qp->xmm;
868 BUG_ON(!qp->open);
869 xmm7360_td_ring_activate(xmm, qp->num*2);
870 xmm7360_td_ring_activate(xmm, qp->num*2+1);
871 xmm7360_qp_arm(xmm, qp);
874 static int xmm7360_qp_stop(struct queue_pair *qp)
876 struct xmm_dev *xmm = qp->xmm;
879 mutex_lock(&qp->lock);
880 if (!qp->open) {
884 /* still holding qp->open to prevent concurrent access */
886 mutex_unlock(&qp->lock);
889 xmm7360_td_ring_destroy(xmm, qp->num*2);
890 xmm7360_td_ring_destroy(xmm, qp->num*2+1);
892 mutex_lock(&qp->lock);
893 qp->open = 0;
894 mutex_unlock(&qp->lock);
900 static void xmm7360_qp_suspend(struct queue_pair *qp)
902 struct xmm_dev *xmm = qp->xmm;
904 BUG_ON(!qp->open);
905 xmm7360_td_ring_deactivate(xmm, qp->num*2);
908 static int xmm7360_qp_can_write(struct queue_pair *qp)
910 struct xmm_dev *xmm = qp->xmm;
911 return !xmm7360_td_ring_full(xmm, qp->num*2);
914 static ssize_t xmm7360_qp_write(struct queue_pair *qp, const char *buf, size_t size)
916 struct xmm_dev *xmm = qp->xmm;
917 int page_size = qp->xmm->td_ring[qp->num*2].page_size;
920 if (!xmm7360_qp_can_write(qp))
924 xmm7360_td_ring_write(xmm, qp->num*2, buf, size);
929 static ssize_t xmm7360_qp_write_user(struct queue_pair *qp, const char __user *buf, size_t size)
931 int page_size = qp->xmm->td_ring[qp->num*2].page_size;
937 ret = copy_from_user(qp->user_buf, buf, size);
941 return xmm7360_qp_write(qp, qp->user_buf, size);
944 static int xmm7360_qp_has_data(struct queue_pair *qp)
946 struct xmm_dev *xmm = qp->xmm;
947 struct td_ring *ring = &xmm->td_ring[qp->num*2+1];
949 return (xmm->cp->s_rptr[qp->num*2+1] != ring->last_handled);
952 static ssize_t xmm7360_qp_read_user(struct queue_pair *qp, char __user *buf, size_t size)
954 struct xmm_dev *xmm = qp->xmm;
955 struct td_ring *ring = &xmm->td_ring[qp->num*2+1];
958 ret = wait_event_interruptible(qp->wq, xmm7360_qp_has_data(qp) || xmm->error);
974 xmm7360_td_ring_read(xmm, qp->num*2+1);
981 static void xmm7360_tty_poll_qp(struct queue_pair *qp)
983 struct xmm_dev *xmm = qp->xmm;
984 struct td_ring *ring = &xmm->td_ring[qp->num*2+1];
986 while (xmm7360_qp_has_data(qp)) {
989 xmm7360_os_handle_tty_idata(qp, ring->pages[idx], nread);
991 xmm7360_td_ring_read(xmm, qp->num*2+1);
999 static void xmm7360_os_handle_tty_idata(struct queue_pair *qp, const u8 *data, size_t nread)
1001 tty_insert_flip_string(&qp->port, data, nread);
1002 tty_flip_buffer_push(&qp->port);
1007 struct queue_pair *qp = container_of(inode->i_cdev, struct queue_pair, cdev);
1008 file->private_data = qp;
1009 return xmm7360_qp_start(qp);
1014 struct queue_pair *qp = file->private_data;
1015 return xmm7360_qp_stop(qp);
1020 struct queue_pair *qp = file->private_data;
1023 ret = xmm7360_qp_write_user(qp, buf, size);
1033 struct queue_pair *qp = file->private_data;
1036 ret = xmm7360_qp_read_user(qp, buf, size);
1046 struct queue_pair *qp = file->private_data;
1049 poll_wait(file, &qp->wq, wait);
1051 if (qp->xmm->error)
1054 if (xmm7360_qp_has_data(qp))
1057 if (xmm7360_qp_can_write(qp))
1065 struct queue_pair *qp = file->private_data;
1071 val = qp->xmm->td_ring[qp->num*2].page_size;
1183 ret = xmm7360_qp_write(xmm->net->qp, frame->data, frame->n_bytes);
1218 BUG_ON(!xmm7360_qp_can_write(xn->qp));
1312 struct queue_pair *qp;
1320 qp = xn->qp;
1321 ring = &xmm->td_ring[qp->num*2+1];
1325 if (xmm7360_qp_can_write(qp))
1328 while (xmm7360_qp_has_data(qp)) {
1333 xmm7360_td_ring_read(xmm, qp->num*2+1);
1380 if (!skb_queue_empty(&xn->queue) && xmm7360_qp_can_write(xn->qp))
1399 if (xmm7360_qp_can_write(xn->qp)) {
1468 BUG_ON(!xmm7360_qp_can_write(xn->qp));
1526 xn->qp = xmm7360_init_qp(xmm, num, 128, TD_MAX_PAGE_SIZE);
1529 ret = xmm7360_qp_start(xn->qp);
1534 xmm7360_qp_stop(xn->qp);
1543 xmm7360_qp_stop(xmm->net->qp);
1555 struct queue_pair *qp;
1565 qp = &xmm->qp[id];
1568 if (qp->open)
1569 wake_up(&qp->wq);
1572 if (qp->open && qp->port.ops) {
1573 xmm7360_tty_poll_qp(qp);
1574 if (qp->tty_needs_wake && xmm7360_qp_can_write(qp) && qp->port.tty) {
1575 struct tty_ldisc *ldisc = tty_ldisc_ref(qp->port.tty);
1578 ldisc->ops->write_wakeup(qp->port.tty);
1581 qp->tty_needs_wake = 0;
1604 if (xmm->qp[i].xmm) {
1605 if (xmm->qp[i].cdev.owner) {
1606 cdev_del(&xmm->qp[i].cdev);
1607 device_unregister(&xmm->qp[i].dev);
1609 if (xmm->qp[i].port.ops) {
1610 tty_unregister_device(xmm7360_tty_driver, xmm->qp[i].tty_index);
1611 tty_port_destroy(&xmm->qp[i].port);
1614 memset(&xmm->qp[i], 0, sizeof(struct queue_pair));
1641 struct queue_pair *qp = tty->driver_data;
1642 return tty_port_open(&qp->port, tty, filp);
1647 struct queue_pair *qp = tty->driver_data;
1648 if (qp)
1649 tty_port_close(&qp->port, tty, filp);
1655 struct queue_pair *qp = tty->driver_data;
1657 written = xmm7360_qp_write(qp, buffer, count);
1659 qp->tty_needs_wake = 1;
1665 struct queue_pair *qp = tty->driver_data;
1666 if (!xmm7360_qp_can_write(qp))
1669 return qp->xmm->td_ring[qp->num*2].page_size;
1674 struct queue_pair *qp;
1682 qp = container_of(tty->port, struct queue_pair, port);
1683 tty->driver_data = qp;
1690 struct queue_pair *qp = tty->driver_data;
1691 return xmm7360_qp_start(qp);
1696 struct queue_pair *qp = tport->tty->driver_data;
1697 xmm7360_qp_stop(qp);
1717 struct queue_pair *qp = xmm7360_init_qp(xmm, num, 8, 4096);
1719 tty_port_init(&qp->port);
1720 qp->port.low_latency = 1;
1721 qp->port.ops = &xmm7360_tty_port_ops;
1722 qp->tty_index = xmm->num_ttys++;
1723 tty_dev = tty_port_register_device(&qp->port, xmm7360_tty_driver, qp->tty_index, xmm->dev);
1726 qp->port.ops = NULL; // prevent calling unregister
1729 tty_port_destroy(&qp->port);
1738 struct queue_pair *qp = xmm7360_init_qp(xmm, num, 16, TD_MAX_PAGE_SIZE);
1741 cdev_init(&qp->cdev, &xmm7360_fops);
1742 qp->cdev.owner = THIS_MODULE;
1743 device_initialize(&qp->dev);
1744 qp->dev.devt = MKDEV(MAJOR(xmm_base), num); // XXX multiple cards
1745 qp->dev.parent = &xmm->pci_dev->dev;
1746 qp->dev.release = xmm7360_cdev_dev_release;
1747 dev_set_name(&qp->dev, name, cardnum);
1748 dev_set_drvdata(&qp->dev, qp);
1749 ret = cdev_device_add(&qp->cdev, &qp->dev);
2069 wwanc_io_wakeup(struct queue_pair *qp, int flag)
2072 selnotify(&qp->selr, POLLIN|POLLRDNORM, NOTE_SUBMIT);
2073 wakeup(qp->wq);
2076 selnotify(&qp->selw, POLLOUT|POLLWRNORM, NOTE_SUBMIT);
2077 wakeup(qp->wq);
2086 struct queue_pair *qp;
2091 if (xmm->net && xmm->net->qp->open && xmm7360_qp_has_data(xmm->net->qp))
2095 qp = &xmm->qp[func];
2096 if (!qp->open)
2100 if (xmm7360_qp_has_data(qp)) {
2103 xmm7360_tty_poll_qp(qp);
2106 wwanc_io_wakeup(qp, FREAD);
2110 if (xmm7360_qp_can_write(qp))
2111 wwanc_io_wakeup(qp, FWRITE);
2295 struct queue_pair *qp;
2301 qp = &xmm->qp[i];
2302 if (qp->open)
2303 xmm7360_qp_suspend(qp);
2315 struct queue_pair *qp;
2322 qp = &xmm->qp[i];
2323 if (qp->open)
2324 xmm7360_qp_resume(qp);
2427 static void xmm7360_os_handle_tty_idata(struct queue_pair *qp, const u8 *data, size_t nread)
2429 struct xmm_dev *xmm = qp->xmm;
2431 int func = qp->num;
2487 /* Initialize ring if qp not open yet */
2488 xmm7360_qp_start(&sc->sc_xmm.qp[func]);
2506 struct queue_pair *qp = &sc->sc_xmm.qp[func];
2520 ret = xmm7360_qp_read_user(qp, buf, size);
2559 struct queue_pair *qp = &sc->sc_xmm.qp[func];
2573 ret = xmm7360_qp_write_user(qp, buf, size);
2633 xmm7360_qp_stop(&sc->sc_xmm.qp[func]);
2675 struct queue_pair *qp = &sc->sc_xmm.qp[func];
2682 if (ISSET(tp->t_state, TS_BUSY) || !xmm7360_qp_can_write(qp))
2693 KASSERT(sizeof(qp->user_buf) >= qp->page_size);
2695 n = q_to_b(&tp->t_outq, qp->user_buf, qp->page_size);
2697 KASSERT(n <= qp->page_size);
2698 written = xmm7360_qp_write(qp, qp->user_buf, n);
2713 struct queue_pair *qp = &sc->sc_xmm.qp[func];
2729 if (qp->xmm->error) {
2734 if (xmm7360_qp_has_data(qp))
2737 if (xmm7360_qp_can_write(qp))
2754 struct queue_pair *qp = (struct queue_pair *)kn->kn_hook;
2755 struct xmm_dev *xmm = qp->xmm;
2756 int func = qp - xmm->qp;
2761 selremove_knote(&qp->selr, kn);
2768 struct queue_pair *qp = (struct queue_pair *)kn->kn_hook;
2772 if (!qp->open) {
2776 kn->kn_data = xmm7360_qp_has_data(qp) ? 1 : 0;
2785 struct queue_pair *qp = (struct queue_pair *)kn->kn_hook;
2786 struct xmm_dev *xmm = qp->xmm;
2787 int func = qp - xmm->qp;
2792 selremove_knote(&qp->selw, kn);
2799 struct queue_pair *qp = (struct queue_pair *)kn->kn_hook;
2803 if (qp->open) {
2804 if (xmm7360_qp_can_write(qp))
2805 kn->kn_data = qp->page_size;
2830 struct queue_pair *qp = &sc->sc_xmm.qp[func];
2841 si = &qp->selr;
2845 si = &qp->selw;
2852 kn->kn_hook = (void *)qp;
3009 KASSERT(xmm7360_qp_can_write(xn->qp));
3205 if (!xmm7360_qp_can_write(sc->sc_xmm_net.qp)) {
3235 /* QP already initialized in parent, just set pointers and start */
3236 xn->qp = &xmm->qp[0];
3237 xmm7360_qp_start(xn->qp);
3248 IFQ_SET_MAXLEN(&ifp->if_snd, xn->qp->depth);
3296 xmm7360_qp_stop(sc_if->sc_xmm_net.qp);