Lines Matching refs:qset
30 struct whc_qset *qset; in qset_alloc() local
33 qset = dma_pool_alloc(whc->qset_pool, mem_flags, &dma); in qset_alloc()
34 if (qset == NULL) in qset_alloc()
36 memset(qset, 0, sizeof(struct whc_qset)); in qset_alloc()
38 qset->qset_dma = dma; in qset_alloc()
39 qset->whc = whc; in qset_alloc()
41 INIT_LIST_HEAD(&qset->list_node); in qset_alloc()
42 INIT_LIST_HEAD(&qset->stds); in qset_alloc()
44 return qset; in qset_alloc()
53 static void qset_fill_qh(struct whc *whc, struct whc_qset *qset, struct urb *urb) in qset_fill_qh() argument
63 qset->max_packet = le16_to_cpu(urb->ep->desc.wMaxPacketSize); in qset_fill_qh()
65 epcd = (struct usb_wireless_ep_comp_descriptor *)qset->ep->extra; in qset_fill_qh()
67 qset->max_seq = epcd->bMaxSequence; in qset_fill_qh()
68 qset->max_burst = epcd->bMaxBurst; in qset_fill_qh()
70 qset->max_seq = 2; in qset_fill_qh()
71 qset->max_burst = 1; in qset_fill_qh()
90 qset->qh.info1 = cpu_to_le32( in qset_fill_qh()
95 | QH_INFO1_MAX_PKT_LEN(qset->max_packet) in qset_fill_qh()
97 qset->qh.info2 = cpu_to_le32( in qset_fill_qh()
98 QH_INFO2_BURST(qset->max_burst) in qset_fill_qh()
102 | QH_INFO2_MAX_SEQ(qset->max_seq - 1) in qset_fill_qh()
108 qset->qh.info3 = cpu_to_le32( in qset_fill_qh()
113 qset->qh.cur_window = cpu_to_le32((1 << qset->max_burst) - 1); in qset_fill_qh()
123 void qset_clear(struct whc *whc, struct whc_qset *qset) in qset_clear() argument
125 qset->td_start = qset->td_end = qset->ntds = 0; in qset_clear()
127 qset->qh.link = cpu_to_le64(QH_LINK_NTDS(8) | QH_LINK_T); in qset_clear()
128 qset->qh.status = qset->qh.status & QH_STATUS_SEQ_MASK; in qset_clear()
129 qset->qh.err_count = 0; in qset_clear()
130 qset->qh.scratch[0] = 0; in qset_clear()
131 qset->qh.scratch[1] = 0; in qset_clear()
132 qset->qh.scratch[2] = 0; in qset_clear()
134 memset(&qset->qh.overlay, 0, sizeof(qset->qh.overlay)); in qset_clear()
136 init_completion(&qset->remove_complete); in qset_clear()
145 void qset_reset(struct whc *whc, struct whc_qset *qset) in qset_reset() argument
147 qset->reset = 0; in qset_reset()
149 qset->qh.status &= ~QH_STATUS_SEQ_MASK; in qset_reset()
150 qset->qh.cur_window = cpu_to_le32((1 << qset->max_burst) - 1); in qset_reset()
161 struct whc_qset *qset; in get_qset() local
163 qset = urb->ep->hcpriv; in get_qset()
164 if (qset == NULL) { in get_qset()
165 qset = qset_alloc(whc, mem_flags); in get_qset()
166 if (qset == NULL) in get_qset()
169 qset->ep = urb->ep; in get_qset()
170 urb->ep->hcpriv = qset; in get_qset()
171 qset_fill_qh(whc, qset, urb); in get_qset()
173 return qset; in get_qset()
176 void qset_remove_complete(struct whc *whc, struct whc_qset *qset) in qset_remove_complete() argument
178 qset->remove = 0; in qset_remove_complete()
179 list_del_init(&qset->list_node); in qset_remove_complete()
180 complete(&qset->remove_complete); in qset_remove_complete()
189 enum whc_update qset_add_qtds(struct whc *whc, struct whc_qset *qset) in qset_add_qtds() argument
194 list_for_each_entry(std, &qset->stds, list_node) { in qset_add_qtds()
198 if (qset->ntds >= WHCI_QSET_TD_MAX in qset_add_qtds()
199 || (qset->pause_after_urb && std->urb != qset->pause_after_urb)) in qset_add_qtds()
205 qtd = std->qtd = &qset->qtd[qset->td_end]; in qset_add_qtds()
225 ialt = (qset->td_end + std->ntds_remaining) % WHCI_QSET_TD_MAX; in qset_add_qtds()
228 qset->pause_after_urb = std->urb; in qset_add_qtds()
238 if (QH_STATUS_TO_ICUR(qset->qh.status) == qset->td_end) in qset_add_qtds()
241 if (++qset->td_end >= WHCI_QSET_TD_MAX) in qset_add_qtds()
242 qset->td_end = 0; in qset_add_qtds()
243 qset->ntds++; in qset_add_qtds()
255 static void qset_remove_qtd(struct whc *whc, struct whc_qset *qset) in qset_remove_qtd() argument
257 qset->qtd[qset->td_start].status = 0; in qset_remove_qtd()
259 if (++qset->td_start >= WHCI_QSET_TD_MAX) in qset_remove_qtd()
260 qset->td_start = 0; in qset_remove_qtd()
261 qset->ntds--; in qset_remove_qtd()
331 static void qset_remove_qtds(struct whc *whc, struct whc_qset *qset, in qset_remove_qtds() argument
336 list_for_each_entry_safe(std, t, &qset->stds, list_node) { in qset_remove_qtds()
340 qset_remove_qtd(whc, qset); in qset_remove_qtds()
348 static void qset_free_stds(struct whc_qset *qset, struct urb *urb) in qset_free_stds() argument
352 list_for_each_entry_safe(std, t, &qset->stds, list_node) { in qset_free_stds()
354 qset_free_std(qset->whc, std); in qset_free_stds()
395 struct whc_qset *qset = wurb->qset; in urb_dequeue_work() local
396 struct whc *whc = qset->whc; in urb_dequeue_work()
409 qset_remove_urb(whc, qset, wurb->urb, wurb->status); in urb_dequeue_work()
413 static struct whc_std *qset_new_std(struct whc *whc, struct whc_qset *qset, in qset_new_std() argument
426 list_add_tail(&std->list_node, &qset->stds); in qset_new_std()
431 static int qset_add_urb_sg(struct whc *whc, struct whc_qset *qset, struct urb *urb, in qset_add_urb_sg() argument
478 if (std && std->len % qset->max_packet != 0) in qset_add_urb_sg()
480 std = qset_new_std(whc, qset, urb, mem_flags); in qset_add_urb_sg()
497 dma_len = (QTD_MAX_XFER_SIZE / qset->max_packet) in qset_add_urb_sg()
498 * qset->max_packet - std->len; in qset_add_urb_sg()
532 list_for_each_entry(std, &qset->stds, list_node) { in qset_add_urb_sg()
550 static int qset_add_urb_sg_linearize(struct whc *whc, struct whc_qset *qset, in qset_add_urb_sg_linearize() argument
563 max_std_len = qset->max_burst * qset->max_packet; in qset_add_urb_sg_linearize()
581 std = qset_new_std(whc, qset, urb, mem_flags); in qset_add_urb_sg_linearize()
612 list_for_each_entry(std, &qset->stds, list_node) { in qset_add_urb_sg_linearize()
635 int qset_add_urb(struct whc *whc, struct whc_qset *qset, struct urb *urb, in qset_add_urb() argument
648 wurb->qset = qset; in qset_add_urb()
653 ret = qset_add_urb_sg(whc, qset, urb, mem_flags); in qset_add_urb()
655 qset_free_stds(qset, urb); in qset_add_urb()
656 ret = qset_add_urb_sg_linearize(whc, qset, urb, mem_flags); in qset_add_urb()
675 std = qset_new_std(whc, qset, urb, mem_flags); in qset_add_urb()
694 qset_free_stds(qset, urb); in qset_add_urb()
703 void qset_remove_urb(struct whc *whc, struct whc_qset *qset, in qset_remove_urb() argument
749 void process_inactive_qtd(struct whc *whc, struct whc_qset *qset, in process_inactive_qtd() argument
752 struct whc_std *std = list_first_entry(&qset->stds, struct whc_std, list_node); in process_inactive_qtd()
766 qset_remove_qtd(whc, qset); in process_inactive_qtd()
774 qset_remove_qtds(whc, qset, urb); in process_inactive_qtd()
775 qset_remove_urb(whc, qset, urb, get_urb_status_from_qtd(urb, status)); in process_inactive_qtd()
783 qset->td_start = qset->td_end in process_inactive_qtd()
784 = QH_STATUS_TO_ICUR(le16_to_cpu(qset->qh.status)); in process_inactive_qtd()
785 qset->pause_after_urb = NULL; in process_inactive_qtd()
801 void process_halted_qtd(struct whc *whc, struct whc_qset *qset, in process_halted_qtd() argument
804 struct whc_std *std = list_first_entry(&qset->stds, struct whc_std, list_node); in process_halted_qtd()
810 qset_remove_qtds(whc, qset, urb); in process_halted_qtd()
811 qset_remove_urb(whc, qset, urb, urb_status); in process_halted_qtd()
813 list_for_each_entry(std, &qset->stds, list_node) { in process_halted_qtd()
814 if (qset->ntds == 0) in process_halted_qtd()
816 qset_remove_qtd(whc, qset); in process_halted_qtd()
820 qset->remove = 1; in process_halted_qtd()
823 void qset_free(struct whc *whc, struct whc_qset *qset) in qset_free() argument
825 dma_pool_free(whc->qset_pool, qset, qset->qset_dma); in qset_free()
831 void qset_delete(struct whc *whc, struct whc_qset *qset) in qset_delete() argument
833 wait_for_completion(&qset->remove_complete); in qset_delete()
834 qset_free(whc, qset); in qset_delete()