Lines Matching refs:td

18  * in both urb->interval and td->privdata.
66 * an urb can be dequeued while a td is in progress
67 * after checking the td, the toggle bit might need to
82 #define td_udev(td) ((td)->ep_data->dev)
115 #define td_residue(td) ((__s8)(td->residue))
116 #define td_ly_base_addr(td) (__le16_to_cpu((td)->ly_base_addr))
117 #define td_port_length(td) (__le16_to_cpu((td)->port_length))
118 #define td_next_td_addr(td) (__le16_to_cpu((td)->next_td_addr))
120 #define td_active(td) ((td)->retry_cnt & TD_RETRYCNTMASK_ACT_FLG)
121 #define td_length(td) (td_port_length(td) & TD_PORTLENMASK_DL)
123 #define td_sequence_ok(td) (!td->status || \
124 (!(td->status & TD_STATUSMASK_SEQ) == \
125 !(td->ctrl_reg & SEQ_SEL)))
127 #define td_acked(td) (!td->status || \
128 (td->status & TD_STATUSMASK_ACK))
129 #define td_actual_bytes(td) (td_length(td) - td_residue(td))
136 static void dbg_td(struct c67x00_hcd *c67x00, struct c67x00_td *td, char *msg)
140 dev_dbg(dev, "### %s at 0x%04x\n", msg, td->td_addr);
141 dev_dbg(dev, "urb: 0x%p\n", td->urb);
142 dev_dbg(dev, "endpoint: %4d\n", usb_pipeendpoint(td->pipe));
143 dev_dbg(dev, "pipeout: %4d\n", usb_pipeout(td->pipe));
144 dev_dbg(dev, "ly_base_addr: 0x%04x\n", td_ly_base_addr(td));
145 dev_dbg(dev, "port_length: 0x%04x\n", td_port_length(td));
146 dev_dbg(dev, "pid_ep: 0x%02x\n", td->pid_ep);
147 dev_dbg(dev, "dev_addr: 0x%02x\n", td->dev_addr);
148 dev_dbg(dev, "ctrl_reg: 0x%02x\n", td->ctrl_reg);
149 dev_dbg(dev, "status: 0x%02x\n", td->status);
150 dev_dbg(dev, "retry_cnt: 0x%02x\n", td->retry_cnt);
151 dev_dbg(dev, "residue: 0x%02x\n", td->residue);
152 dev_dbg(dev, "next_td_addr: 0x%04x\n", td_next_td_addr(td));
153 dev_dbg(dev, "data: %*ph\n", td_length(td), td->data);
200 struct c67x00_td *td;
218 list_for_each_entry(td, &c67x00->td_list, td_list)
219 if (urb == td->urb)
220 td->urb = NULL;
567 struct c67x00_td *td;
577 td = kzalloc(sizeof(*td), GFP_ATOMIC);
578 if (!td)
581 td->pipe = urb->pipe;
582 td->ep_data = urbp->ep_data;
584 if ((td_udev(td)->speed == USB_SPEED_LOW) &&
588 switch (usb_pipetype(td->pipe)) {
610 td->td_addr = c67x00->next_td_addr;
614 td->ly_base_addr = __cpu_to_le16(c67x00->next_buf_addr);
615 td->port_length = __cpu_to_le16((c67x00->sie->sie_num << 15) |
617 td->pid_ep = ((pid & 0xF) << TD_PIDEP_OFFSET) |
618 (usb_pipeendpoint(td->pipe) & 0xF);
619 td->dev_addr = usb_pipedevice(td->pipe) & 0x7F;
620 td->ctrl_reg = cmd;
621 td->status = 0;
622 td->retry_cnt = (tt << TT_OFFSET) | (active_flag << 4) | retry_cnt;
623 td->residue = 0;
624 td->next_td_addr = __cpu_to_le16(c67x00->next_td_addr);
627 td->data = data;
628 td->urb = urb;
629 td->privdata = privdata;
633 list_add_tail(&td->td_list, &c67x00->td_list);
637 static inline void c67x00_release_td(struct c67x00_td *td)
639 list_del_init(&td->td_list);
640 kfree(td);
677 return ret; /* td wasn't created */
798 struct c67x00_td *td, *ttd;
804 list_for_each_entry_safe(td, ttd, &c67x00->td_list, td_list) {
805 dbg_td(c67x00, td, "Unprocessed td");
806 c67x00_release_td(td);
830 c67x00_parse_td(struct c67x00_hcd *c67x00, struct c67x00_td *td)
833 td->td_addr, td, CY_TD_SIZE);
835 if (usb_pipein(td->pipe) && td_actual_bytes(td))
836 c67x00_ll_read_mem_le16(c67x00->sie->dev, td_ly_base_addr(td),
837 td->data, td_actual_bytes(td));
840 static int c67x00_td_to_error(struct c67x00_hcd *c67x00, struct c67x00_td *td)
842 if (td->status & TD_STATUSMASK_ERR) {
843 dbg_td(c67x00, td, "ERROR_FLAG");
846 if (td->status & TD_STATUSMASK_STALL) {
847 /* dbg_td(c67x00, td, "STALL"); */
850 if (td->status & TD_STATUSMASK_TMOUT) {
851 dbg_td(c67x00, td, "TIMEOUT");
858 static inline int c67x00_end_of_data(struct c67x00_td *td)
861 struct urb *urb = td->urb;
864 act_bytes = td_actual_bytes(td);
869 maxps = usb_maxpacket(td_udev(td), td->pipe);
886 /* Remove all td's from the list which come
892 struct c67x00_td *td, *tmp;
893 td = last_td;
895 while (td->td_list.next != &c67x00->td_list) {
896 td = list_entry(td->td_list.next, struct c67x00_td, td_list);
897 if (td->pipe == last_td->pipe) {
898 c67x00_release_td(td);
899 td = tmp;
901 tmp = td;
908 struct c67x00_td *td)
910 struct urb *urb = td->urb;
915 urb->actual_length += td_actual_bytes(td);
917 switch (usb_pipetype(td->pipe)) {
920 switch (td->privdata) {
930 if (c67x00_end_of_data(td)) {
932 c67x00_clear_pipe(c67x00, td);
945 if (unlikely(c67x00_end_of_data(td))) {
946 c67x00_clear_pipe(c67x00, td);
953 static void c67x00_handle_isoc(struct c67x00_hcd *c67x00, struct c67x00_td *td)
955 struct urb *urb = td->urb;
961 cnt = td->privdata;
963 if (td->status & TD_ERROR_MASK)
966 urb->iso_frame_desc[cnt].actual_length = td_actual_bytes(td);
967 urb->iso_frame_desc[cnt].status = c67x00_td_to_error(c67x00, td);
980 struct c67x00_td *td, *tmp;
985 list_for_each_entry_safe(td, tmp, &c67x00->td_list, td_list) {
987 c67x00_parse_td(c67x00, td);
988 urb = td->urb; /* urb can be NULL! */
993 if (usb_pipeisoc(td->pipe)) {
995 c67x00_handle_isoc(c67x00, td);
999 /* When an error occurs, all td's for that pipe go into an
1002 if (td->status & TD_ERROR_MASK) {
1004 c67x00_td_to_error(c67x00, td));
1008 if ((td->status & TD_STATUSMASK_NAK) || !td_sequence_ok(td) ||
1009 !td_acked(td))
1015 if (unlikely(td->status & TD_STATUSMASK_OVF)) {
1016 if (td_residue(td) & TD_RESIDUE_OVERFLOW) {
1024 c67x00_handle_successful_td(c67x00, td);
1028 c67x00_clear_pipe(c67x00, td);
1030 usb_settoggle(td_udev(td), usb_pipeendpoint(td->pipe),
1031 usb_pipeout(td->pipe),
1032 !(td->ctrl_reg & SEQ_SEL));
1034 tmp = list_entry(td->td_list.next, typeof(*td), td_list);
1035 c67x00_release_td(td);
1050 * Send td to C67X00
1052 static void c67x00_send_td(struct c67x00_hcd *c67x00, struct c67x00_td *td)
1054 int len = td_length(td);
1056 if (len && ((td->pid_ep & TD_PIDEPMASK_PID) != TD_PID_IN))
1057 c67x00_ll_write_mem_le16(c67x00->sie->dev, td_ly_base_addr(td),
1058 td->data, len);
1061 td->td_addr, td, CY_TD_SIZE);
1066 struct c67x00_td *td;
1070 "%s: td list should not be empty here!\n",
1073 list_for_each_entry(td, &c67x00->td_list, td_list) {
1074 if (td->td_list.next == &c67x00->td_list)
1075 td->next_td_addr = 0; /* Last td in list */
1077 c67x00_send_td(c67x00, td);
1097 /* no td's are being processed (current == 0)