Lines Matching refs:td
96 #define td_udev(td) ((td)->ep_data->dev) argument
129 #define td_residue(td) ((__s8)(td->residue)) argument
130 #define td_ly_base_addr(td) (__le16_to_cpu((td)->ly_base_addr)) argument
131 #define td_port_length(td) (__le16_to_cpu((td)->port_length)) argument
132 #define td_next_td_addr(td) (__le16_to_cpu((td)->next_td_addr)) argument
134 #define td_active(td) ((td)->retry_cnt & TD_RETRYCNTMASK_ACT_FLG) argument
135 #define td_length(td) (td_port_length(td) & TD_PORTLENMASK_DL) argument
137 #define td_sequence_ok(td) (!td->status || \ argument
138 (!(td->status & TD_STATUSMASK_SEQ) == \
139 !(td->ctrl_reg & SEQ_SEL)))
141 #define td_acked(td) (!td->status || \ argument
142 (td->status & TD_STATUSMASK_ACK))
143 #define td_actual_bytes(td) (td_length(td) - td_residue(td)) argument
150 static void dbg_td(struct c67x00_hcd *c67x00, struct c67x00_td *td, char *msg) in dbg_td() argument
154 dev_dbg(dev, "### %s at 0x%04x\n", msg, td->td_addr); in dbg_td()
155 dev_dbg(dev, "urb: 0x%p\n", td->urb); in dbg_td()
156 dev_dbg(dev, "endpoint: %4d\n", usb_pipeendpoint(td->pipe)); in dbg_td()
157 dev_dbg(dev, "pipeout: %4d\n", usb_pipeout(td->pipe)); in dbg_td()
158 dev_dbg(dev, "ly_base_addr: 0x%04x\n", td_ly_base_addr(td)); in dbg_td()
159 dev_dbg(dev, "port_length: 0x%04x\n", td_port_length(td)); in dbg_td()
160 dev_dbg(dev, "pid_ep: 0x%02x\n", td->pid_ep); in dbg_td()
161 dev_dbg(dev, "dev_addr: 0x%02x\n", td->dev_addr); in dbg_td()
162 dev_dbg(dev, "ctrl_reg: 0x%02x\n", td->ctrl_reg); in dbg_td()
163 dev_dbg(dev, "status: 0x%02x\n", td->status); in dbg_td()
164 dev_dbg(dev, "retry_cnt: 0x%02x\n", td->retry_cnt); in dbg_td()
165 dev_dbg(dev, "residue: 0x%02x\n", td->residue); in dbg_td()
166 dev_dbg(dev, "next_td_addr: 0x%04x\n", td_next_td_addr(td)); in dbg_td()
167 dev_dbg(dev, "data: %*ph\n", td_length(td), td->data); in dbg_td()
214 struct c67x00_td *td; in c67x00_release_urb() local
232 list_for_each_entry(td, &c67x00->td_list, td_list) in c67x00_release_urb()
233 if (urb == td->urb) in c67x00_release_urb()
234 td->urb = NULL; in c67x00_release_urb()
581 struct c67x00_td *td; in c67x00_create_td() local
591 td = kzalloc(sizeof(*td), GFP_ATOMIC); in c67x00_create_td()
592 if (!td) in c67x00_create_td()
595 td->pipe = urb->pipe; in c67x00_create_td()
596 td->ep_data = urbp->ep_data; in c67x00_create_td()
598 if ((td_udev(td)->speed == USB_SPEED_LOW) && in c67x00_create_td()
602 switch (usb_pipetype(td->pipe)) { in c67x00_create_td()
624 td->td_addr = c67x00->next_td_addr; in c67x00_create_td()
628 td->ly_base_addr = __cpu_to_le16(c67x00->next_buf_addr); in c67x00_create_td()
629 td->port_length = __cpu_to_le16((c67x00->sie->sie_num << 15) | in c67x00_create_td()
631 td->pid_ep = ((pid & 0xF) << TD_PIDEP_OFFSET) | in c67x00_create_td()
632 (usb_pipeendpoint(td->pipe) & 0xF); in c67x00_create_td()
633 td->dev_addr = usb_pipedevice(td->pipe) & 0x7F; in c67x00_create_td()
634 td->ctrl_reg = cmd; in c67x00_create_td()
635 td->status = 0; in c67x00_create_td()
636 td->retry_cnt = (tt << TT_OFFSET) | (active_flag << 4) | retry_cnt; in c67x00_create_td()
637 td->residue = 0; in c67x00_create_td()
638 td->next_td_addr = __cpu_to_le16(c67x00->next_td_addr); in c67x00_create_td()
641 td->data = data; in c67x00_create_td()
642 td->urb = urb; in c67x00_create_td()
643 td->privdata = privdata; in c67x00_create_td()
647 list_add_tail(&td->td_list, &c67x00->td_list); in c67x00_create_td()
651 static inline void c67x00_release_td(struct c67x00_td *td) in c67x00_release_td() argument
653 list_del_init(&td->td_list); in c67x00_release_td()
654 kfree(td); in c67x00_release_td()
811 struct c67x00_td *td, *ttd; in c67x00_fill_frame() local
817 list_for_each_entry_safe(td, ttd, &c67x00->td_list, td_list) { in c67x00_fill_frame()
818 dbg_td(c67x00, td, "Unprocessed td"); in c67x00_fill_frame()
819 c67x00_release_td(td); in c67x00_fill_frame()
843 c67x00_parse_td(struct c67x00_hcd *c67x00, struct c67x00_td *td) in c67x00_parse_td() argument
846 td->td_addr, td, CY_TD_SIZE); in c67x00_parse_td()
848 if (usb_pipein(td->pipe) && td_actual_bytes(td)) in c67x00_parse_td()
849 c67x00_ll_read_mem_le16(c67x00->sie->dev, td_ly_base_addr(td), in c67x00_parse_td()
850 td->data, td_actual_bytes(td)); in c67x00_parse_td()
853 static int c67x00_td_to_error(struct c67x00_hcd *c67x00, struct c67x00_td *td) in c67x00_td_to_error() argument
855 if (td->status & TD_STATUSMASK_ERR) { in c67x00_td_to_error()
856 dbg_td(c67x00, td, "ERROR_FLAG"); in c67x00_td_to_error()
859 if (td->status & TD_STATUSMASK_STALL) { in c67x00_td_to_error()
863 if (td->status & TD_STATUSMASK_TMOUT) { in c67x00_td_to_error()
864 dbg_td(c67x00, td, "TIMEOUT"); in c67x00_td_to_error()
871 static inline int c67x00_end_of_data(struct c67x00_td *td) in c67x00_end_of_data() argument
874 struct urb *urb = td->urb; in c67x00_end_of_data()
877 act_bytes = td_actual_bytes(td); in c67x00_end_of_data()
882 maxps = usb_maxpacket(td_udev(td), td->pipe, usb_pipeout(td->pipe)); in c67x00_end_of_data()
905 struct c67x00_td *td, *tmp; in c67x00_clear_pipe() local
906 td = last_td; in c67x00_clear_pipe()
908 while (td->td_list.next != &c67x00->td_list) { in c67x00_clear_pipe()
909 td = list_entry(td->td_list.next, struct c67x00_td, td_list); in c67x00_clear_pipe()
910 if (td->pipe == last_td->pipe) { in c67x00_clear_pipe()
911 c67x00_release_td(td); in c67x00_clear_pipe()
912 td = tmp; in c67x00_clear_pipe()
914 tmp = td; in c67x00_clear_pipe()
921 struct c67x00_td *td) in c67x00_handle_successful_td() argument
923 struct urb *urb = td->urb; in c67x00_handle_successful_td()
928 urb->actual_length += td_actual_bytes(td); in c67x00_handle_successful_td()
930 switch (usb_pipetype(td->pipe)) { in c67x00_handle_successful_td()
933 switch (td->privdata) { in c67x00_handle_successful_td()
943 if (c67x00_end_of_data(td)) { in c67x00_handle_successful_td()
945 c67x00_clear_pipe(c67x00, td); in c67x00_handle_successful_td()
958 if (unlikely(c67x00_end_of_data(td))) { in c67x00_handle_successful_td()
959 c67x00_clear_pipe(c67x00, td); in c67x00_handle_successful_td()
966 static void c67x00_handle_isoc(struct c67x00_hcd *c67x00, struct c67x00_td *td) in c67x00_handle_isoc() argument
968 struct urb *urb = td->urb; in c67x00_handle_isoc()
976 cnt = td->privdata; in c67x00_handle_isoc()
978 if (td->status & TD_ERROR_MASK) in c67x00_handle_isoc()
981 urb->iso_frame_desc[cnt].actual_length = td_actual_bytes(td); in c67x00_handle_isoc()
982 urb->iso_frame_desc[cnt].status = c67x00_td_to_error(c67x00, td); in c67x00_handle_isoc()
995 struct c67x00_td *td, *tmp; in c67x00_check_td_list() local
1000 list_for_each_entry_safe(td, tmp, &c67x00->td_list, td_list) { in c67x00_check_td_list()
1002 c67x00_parse_td(c67x00, td); in c67x00_check_td_list()
1003 urb = td->urb; /* urb can be NULL! */ in c67x00_check_td_list()
1008 if (usb_pipeisoc(td->pipe)) { in c67x00_check_td_list()
1010 c67x00_handle_isoc(c67x00, td); in c67x00_check_td_list()
1017 if (td->status & TD_ERROR_MASK) { in c67x00_check_td_list()
1019 c67x00_td_to_error(c67x00, td)); in c67x00_check_td_list()
1023 if ((td->status & TD_STATUSMASK_NAK) || !td_sequence_ok(td) || in c67x00_check_td_list()
1024 !td_acked(td)) in c67x00_check_td_list()
1030 if (unlikely(td->status & TD_STATUSMASK_OVF)) { in c67x00_check_td_list()
1031 if (td_residue(td) & TD_RESIDUE_OVERFLOW) { in c67x00_check_td_list()
1039 c67x00_handle_successful_td(c67x00, td); in c67x00_check_td_list()
1043 c67x00_clear_pipe(c67x00, td); in c67x00_check_td_list()
1045 usb_settoggle(td_udev(td), usb_pipeendpoint(td->pipe), in c67x00_check_td_list()
1046 usb_pipeout(td->pipe), in c67x00_check_td_list()
1047 !(td->ctrl_reg & SEQ_SEL)); in c67x00_check_td_list()
1049 tmp = list_entry(td->td_list.next, typeof(*td), td_list); in c67x00_check_td_list()
1050 c67x00_release_td(td); in c67x00_check_td_list()
1067 static void c67x00_send_td(struct c67x00_hcd *c67x00, struct c67x00_td *td) in c67x00_send_td() argument
1069 int len = td_length(td); in c67x00_send_td()
1071 if (len && ((td->pid_ep & TD_PIDEPMASK_PID) != TD_PID_IN)) in c67x00_send_td()
1072 c67x00_ll_write_mem_le16(c67x00->sie->dev, td_ly_base_addr(td), in c67x00_send_td()
1073 td->data, len); in c67x00_send_td()
1076 td->td_addr, td, CY_TD_SIZE); in c67x00_send_td()
1081 struct c67x00_td *td; in c67x00_send_frame() local
1088 list_for_each_entry(td, &c67x00->td_list, td_list) { in c67x00_send_frame()
1089 if (td->td_list.next == &c67x00->td_list) in c67x00_send_frame()
1090 td->next_td_addr = 0; /* Last td in list */ in c67x00_send_frame()
1092 c67x00_send_td(c67x00, td); in c67x00_send_frame()