H A D | fotg210-hcd.c | 90 #include "fotg210.h" 92 #define fotg210_dbg(fotg210, fmt, args...) \ 93 dev_dbg(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) 94 #define fotg210_err(fotg210, fmt, args...) \ 95 dev_err(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) 96 #define fotg210_info(fotg210, fmt, args...) \ 97 dev_info(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) 98 #define fotg210_warn(fotg210, fmt, args...) \ 99 dev_warn(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) 104 static void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label) dbg_hcs_params() argument 106 u32 params = fotg210_readl(fotg210, &fotg210->caps->hcs_params); dbg_hcs_params() 108 fotg210_dbg(fotg210, "%s hcs_params 0x%x ports=%d\n", label, params, dbg_hcs_params() 115 static void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label) dbg_hcc_params() argument 117 u32 params = fotg210_readl(fotg210, &fotg210->caps->hcc_params); dbg_hcc_params() 119 fotg210_dbg(fotg210, "%s hcc_params %04x uframes %s%s\n", label, dbg_hcc_params() 126 dbg_qtd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd) dbg_qtd() argument 128 fotg210_dbg(fotg210, "%s td %p n%08x %08x t%08x p0=%08x\n", label, qtd, dbg_qtd() 129 hc32_to_cpup(fotg210, &qtd->hw_next), dbg_qtd() 130 hc32_to_cpup(fotg210, &qtd->hw_alt_next), dbg_qtd() 131 hc32_to_cpup(fotg210, &qtd->hw_token), dbg_qtd() 132 hc32_to_cpup(fotg210, &qtd->hw_buf[0])); dbg_qtd() 134 fotg210_dbg(fotg210, " p1=%08x p2=%08x p3=%08x p4=%08x\n", dbg_qtd() 135 hc32_to_cpup(fotg210, &qtd->hw_buf[1]), dbg_qtd() 136 hc32_to_cpup(fotg210, &qtd->hw_buf[2]), dbg_qtd() 137 hc32_to_cpup(fotg210, &qtd->hw_buf[3]), dbg_qtd() 138 hc32_to_cpup(fotg210, &qtd->hw_buf[4])); dbg_qtd() 142 dbg_qh(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh) dbg_qh() argument 146 fotg210_dbg(fotg210, "%s qh %p n%08x info %x %x qtd %x\n", label, qh, dbg_qh() 150 dbg_qtd("overlay", fotg210, (struct fotg210_qtd *) &hw->hw_qtd_next); dbg_qh() 154 dbg_itd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_itd *itd) dbg_itd() argument 156 fotg210_dbg(fotg210, "%s[%d] itd %p, next %08x, urb %p\n", label, dbg_itd() 157 itd->frame, itd, hc32_to_cpu(fotg210, itd->hw_next), dbg_itd() 160 fotg210_dbg(fotg210, dbg_itd() 162 hc32_to_cpu(fotg210, itd->hw_transaction[0]), dbg_itd() 163 hc32_to_cpu(fotg210, itd->hw_transaction[1]), dbg_itd() 164 hc32_to_cpu(fotg210, itd->hw_transaction[2]), dbg_itd() 165 hc32_to_cpu(fotg210, itd->hw_transaction[3]), dbg_itd() 166 hc32_to_cpu(fotg210, itd->hw_transaction[4]), dbg_itd() 167 hc32_to_cpu(fotg210, itd->hw_transaction[5]), dbg_itd() 168 hc32_to_cpu(fotg210, itd->hw_transaction[6]), dbg_itd() 169 hc32_to_cpu(fotg210, itd->hw_transaction[7])); dbg_itd() 171 fotg210_dbg(fotg210, dbg_itd() 173 hc32_to_cpu(fotg210, itd->hw_bufp[0]), dbg_itd() 174 hc32_to_cpu(fotg210, itd->hw_bufp[1]), dbg_itd() 175 hc32_to_cpu(fotg210, itd->hw_bufp[2]), dbg_itd() 176 hc32_to_cpu(fotg210, itd->hw_bufp[3]), dbg_itd() 177 hc32_to_cpu(fotg210, itd->hw_bufp[4]), dbg_itd() 178 hc32_to_cpu(fotg210, itd->hw_bufp[5]), dbg_itd() 179 hc32_to_cpu(fotg210, itd->hw_bufp[6])); dbg_itd() 181 fotg210_dbg(fotg210, " index: %d %d %d %d %d %d %d %d\n", dbg_itd() 273 #define dbg_status(fotg210, label, status) { \ 276 fotg210_dbg(fotg210, "%s\n", _buf); \ 279 #define dbg_cmd(fotg210, label, command) { \ 282 fotg210_dbg(fotg210, "%s\n", _buf); \ 285 #define dbg_port(fotg210, label, port, status) { \ 287 fotg210_dbg(fotg210, "%s\n", \ 350 static inline char token_mark(struct fotg210_hcd *fotg210, __hc32 token) token_mark() argument 352 __u32 v = hc32_to_cpu(fotg210, token); token_mark() 364 static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, qh_lines() argument 374 __le32 list_end = FOTG210_LIST_END(fotg210); qh_lines() 380 mark = token_mark(fotg210, hw->hw_token); qh_lines() 382 if ((hw->hw_alt_next & QTD_MASK(fotg210)) == qh_lines() 383 fotg210->async->hw->hw_alt_next) qh_lines() 389 scratch = hc32_to_cpup(fotg210, &hw->hw_info1); qh_lines() 390 hw_curr = (mark == '*') ? hc32_to_cpup(fotg210, &hw->hw_current) : 0; qh_lines() 396 scratch, hc32_to_cpup(fotg210, &hw->hw_info2), qh_lines() 397 hc32_to_cpup(fotg210, &hw->hw_token), mark, qh_lines() 398 (cpu_to_hc32(fotg210, QTD_TOGGLE) & hw->hw_token) qh_lines() 400 (hc32_to_cpup(fotg210, &hw->hw_alt_next) >> 1) & 0x0f); qh_lines() 406 scratch = hc32_to_cpup(fotg210, &td->hw_token); qh_lines() 410 else if (hw->hw_qtd_next == cpu_to_hc32(fotg210, td->qtd_dma)) qh_lines() 413 if (td->hw_alt_next == fotg210->async->hw->hw_alt_next) qh_lines() 461 struct fotg210_hcd *fotg210; fill_async_buffer() local 468 fotg210 = hcd_to_fotg210(hcd); fill_async_buffer() 478 spin_lock_irqsave(&fotg210->lock, flags); fill_async_buffer() 479 for (qh = fotg210->async->qh_next.qh; size > 0 && qh; fill_async_buffer() 481 qh_lines(fotg210, qh, &next, &size); fill_async_buffer() 482 if (fotg210->async_unlink && size > 0) { fill_async_buffer() 487 for (qh = fotg210->async_unlink; size > 0 && qh; fill_async_buffer() 489 qh_lines(fotg210, qh, &next, &size); fill_async_buffer() 491 spin_unlock_irqrestore(&fotg210->lock, flags); fill_async_buffer() 497 static unsigned output_buf_tds_dir(char *buf, struct fotg210_hcd *fotg210, output_buf_tds_dir() argument 500 u32 scratch = hc32_to_cpup(fotg210, &hw->hw_info1); output_buf_tds_dir() 508 switch ((hc32_to_cpu(fotg210, qtd->hw_token) >> 8) & 0x03) { output_buf_tds_dir() 528 struct fotg210_hcd *fotg210; fill_periodic_buffer() local 543 fotg210 = hcd_to_fotg210(hcd); fill_periodic_buffer() 547 temp = scnprintf(next, size, "size = %d\n", fotg210->periodic_size); fill_periodic_buffer() 554 spin_lock_irqsave(&fotg210->lock, flags); fill_periodic_buffer() 555 for (i = 0; i < fotg210->periodic_size; i++) { fill_periodic_buffer() 556 p = fotg210->pshadow[i]; fill_periodic_buffer() 560 tag = Q_NEXT_TYPE(fotg210, fotg210->periodic[i]); fill_periodic_buffer() 569 switch (hc32_to_cpu(fotg210, tag)) { fill_periodic_buffer() 574 hc32_to_cpup(fotg210, fill_periodic_buffer() 596 fotg210, hw, fill_periodic_buffer() 603 tag = Q_NEXT_TYPE(fotg210, hw->hw_next); fill_periodic_buffer() 610 tag = Q_NEXT_TYPE(fotg210, p.fstn->hw_next); fill_periodic_buffer() 616 tag = Q_NEXT_TYPE(fotg210, p.itd->hw_next); fill_periodic_buffer() 628 spin_unlock_irqrestore(&fotg210->lock, flags); fill_periodic_buffer() 635 static const char *rh_state_string(struct fotg210_hcd *fotg210) rh_state_string() argument 637 switch (fotg210->rh_state) { rh_state_string() 653 struct fotg210_hcd *fotg210; fill_registers_buffer() local 661 fotg210 = hcd_to_fotg210(hcd); fill_registers_buffer() 665 spin_lock_irqsave(&fotg210->lock, flags); fill_registers_buffer() 679 i = HC_VERSION(fotg210, fotg210_readl(fotg210, fill_registers_buffer() 680 &fotg210->caps->hc_capbase)); fill_registers_buffer() 688 i >> 8, i & 0x0ff, rh_state_string(fotg210)); fill_registers_buffer() 693 i = fotg210_readl(fotg210, &fotg210->caps->hcs_params); fill_registers_buffer() 698 i = fotg210_readl(fotg210, &fotg210->caps->hcc_params); fill_registers_buffer() 705 fotg210_readl(fotg210, &fotg210->regs->status)); fill_registers_buffer() 711 fotg210_readl(fotg210, &fotg210->regs->command)); fill_registers_buffer() 717 fotg210_readl(fotg210, &fotg210->regs->intr_enable)); fill_registers_buffer() 723 fotg210_read_frame_index(fotg210)); fill_registers_buffer() 727 if (fotg210->async_unlink) { fill_registers_buffer() 729 fotg210->async_unlink); fill_registers_buffer() 737 fotg210->stats.normal, fotg210->stats.error, fill_registers_buffer() 738 fotg210->stats.iaa, fotg210->stats.lost_iaa); fill_registers_buffer() 743 fotg210->stats.complete, fotg210->stats.unlink); fill_registers_buffer() 749 spin_unlock_irqrestore(&fotg210->lock, flags); fill_registers_buffer() 857 static inline void create_debug_files(struct fotg210_hcd *fotg210) create_debug_files() argument 859 struct usb_bus *bus = &fotg210_to_hcd(fotg210)->self; create_debug_files() 861 fotg210->debug_dir = debugfs_create_dir(bus->bus_name, create_debug_files() 863 if (!fotg210->debug_dir) create_debug_files() 866 if (!debugfs_create_file("async", S_IRUGO, fotg210->debug_dir, bus, create_debug_files() 870 if (!debugfs_create_file("periodic", S_IRUGO, fotg210->debug_dir, bus, create_debug_files() 874 if (!debugfs_create_file("registers", S_IRUGO, fotg210->debug_dir, bus, create_debug_files() 881 debugfs_remove_recursive(fotg210->debug_dir); create_debug_files() 884 static inline void remove_debug_files(struct fotg210_hcd *fotg210) remove_debug_files() argument 886 debugfs_remove_recursive(fotg210->debug_dir); remove_debug_files() 905 static int handshake(struct fotg210_hcd *fotg210, void __iomem *ptr, handshake() argument 911 result = fotg210_readl(fotg210, ptr); handshake() 926 static int fotg210_halt(struct fotg210_hcd *fotg210) fotg210_halt() argument 930 spin_lock_irq(&fotg210->lock); fotg210_halt() 933 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable); fotg210_halt() 936 * This routine gets called during probe before fotg210->command fotg210_halt() 939 fotg210->command &= ~CMD_RUN; fotg210_halt() 940 temp = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_halt() 942 fotg210_writel(fotg210, temp, &fotg210->regs->command); fotg210_halt() 944 spin_unlock_irq(&fotg210->lock); fotg210_halt() 945 synchronize_irq(fotg210_to_hcd(fotg210)->irq); fotg210_halt() 947 return handshake(fotg210, &fotg210->regs->status, fotg210_halt() 954 static int fotg210_reset(struct fotg210_hcd *fotg210) fotg210_reset() argument 957 u32 command = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_reset() 962 if (fotg210->debug && !dbgp_reset_prep(fotg210_to_hcd(fotg210))) fotg210_reset() 963 fotg210->debug = NULL; fotg210_reset() 966 dbg_cmd(fotg210, "reset", command); fotg210_reset() 967 fotg210_writel(fotg210, command, &fotg210->regs->command); fotg210_reset() 968 fotg210->rh_state = FOTG210_RH_HALTED; fotg210_reset() 969 fotg210->next_statechange = jiffies; fotg210_reset() 970 retval = handshake(fotg210, &fotg210->regs->command, fotg210_reset() 976 if (fotg210->debug) fotg210_reset() 977 dbgp_external_startup(fotg210_to_hcd(fotg210)); fotg210_reset() 979 fotg210->port_c_suspend = fotg210->suspended_ports = fotg210_reset() 980 fotg210->resuming_ports = 0; fotg210_reset() 987 static void fotg210_quiesce(struct fotg210_hcd *fotg210) fotg210_quiesce() argument 991 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_quiesce() 995 temp = (fotg210->command << 10) & (STS_ASS | STS_PSS); fotg210_quiesce() 996 handshake(fotg210, &fotg210->regs->status, STS_ASS | STS_PSS, temp, fotg210_quiesce() 1000 spin_lock_irq(&fotg210->lock); fotg210_quiesce() 1001 fotg210->command &= ~(CMD_ASE | CMD_PSE); fotg210_quiesce() 1002 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_quiesce() 1003 spin_unlock_irq(&fotg210->lock); fotg210_quiesce() 1006 handshake(fotg210, &fotg210->regs->status, STS_ASS | STS_PSS, 0, fotg210_quiesce() 1010 static void end_unlink_async(struct fotg210_hcd *fotg210); 1011 static void unlink_empty_async(struct fotg210_hcd *fotg210); 1012 static void fotg210_work(struct fotg210_hcd *fotg210); 1013 static void start_unlink_intr(struct fotg210_hcd *fotg210, 1015 static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh); 1018 static void fotg210_set_command_bit(struct fotg210_hcd *fotg210, u32 bit) fotg210_set_command_bit() argument 1020 fotg210->command |= bit; fotg210_set_command_bit() 1021 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_set_command_bit() 1024 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_set_command_bit() 1028 static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit) fotg210_clear_command_bit() argument 1030 fotg210->command &= ~bit; fotg210_clear_command_bit() 1031 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_clear_command_bit() 1034 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_clear_command_bit() 1039 * Lots of different events are triggered from fotg210->hrtimer. Whenever 1043 * fotg210->enabled_hrtimer_events, and they are numbered in order of 1048 * fotg210->next_hrtimer_event. Whenever fotg210->hrtimer gets restarted, its 1061 * the event types indexed by enum fotg210_hrtimer_event in fotg210.h. 1077 static void fotg210_enable_event(struct fotg210_hcd *fotg210, unsigned event, fotg210_enable_event() argument 1080 ktime_t *timeout = &fotg210->hr_timeouts[event]; fotg210_enable_event() 1085 fotg210->enabled_hrtimer_events |= (1 << event); fotg210_enable_event() 1088 if (event < fotg210->next_hrtimer_event) { fotg210_enable_event() 1089 fotg210->next_hrtimer_event = event; fotg210_enable_event() 1090 hrtimer_start_range_ns(&fotg210->hrtimer, *timeout, fotg210_enable_event() 1097 static void fotg210_poll_ASS(struct fotg210_hcd *fotg210) fotg210_poll_ASS() argument 1102 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_poll_ASS() 1105 want = (fotg210->command & CMD_ASE) ? STS_ASS : 0; fotg210_poll_ASS() 1106 actual = fotg210_readl(fotg210, &fotg210->regs->status) & STS_ASS; fotg210_poll_ASS() 1111 if (fotg210->ASS_poll_count++ < 20) { fotg210_poll_ASS() 1112 fotg210_enable_event(fotg210, FOTG210_HRTIMER_POLL_ASS, fotg210_poll_ASS() 1116 fotg210_dbg(fotg210, "Waited too long for the async schedule status (%x/%x), giving up\n", fotg210_poll_ASS() 1119 fotg210->ASS_poll_count = 0; fotg210_poll_ASS() 1123 if (fotg210->async_count > 0) fotg210_poll_ASS() 1124 fotg210_set_command_bit(fotg210, CMD_ASE); fotg210_poll_ASS() 1127 if (fotg210->async_count == 0) { fotg210_poll_ASS() 1130 fotg210_enable_event(fotg210, fotg210_poll_ASS() 1138 static void fotg210_disable_ASE(struct fotg210_hcd *fotg210) fotg210_disable_ASE() argument 1140 fotg210_clear_command_bit(fotg210, CMD_ASE); fotg210_disable_ASE() 1145 static void fotg210_poll_PSS(struct fotg210_hcd *fotg210) fotg210_poll_PSS() argument 1150 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_poll_PSS() 1153 want = (fotg210->command & CMD_PSE) ? STS_PSS : 0; fotg210_poll_PSS() 1154 actual = fotg210_readl(fotg210, &fotg210->regs->status) & STS_PSS; fotg210_poll_PSS() 1159 if (fotg210->PSS_poll_count++ < 20) { fotg210_poll_PSS() 1160 fotg210_enable_event(fotg210, FOTG210_HRTIMER_POLL_PSS, fotg210_poll_PSS() 1164 fotg210_dbg(fotg210, "Waited too long for the periodic schedule status (%x/%x), giving up\n", fotg210_poll_PSS() 1167 fotg210->PSS_poll_count = 0; fotg210_poll_PSS() 1171 if (fotg210->periodic_count > 0) fotg210_poll_PSS() 1172 fotg210_set_command_bit(fotg210, CMD_PSE); fotg210_poll_PSS() 1175 if (fotg210->periodic_count == 0) { fotg210_poll_PSS() 1178 fotg210_enable_event(fotg210, fotg210_poll_PSS() 1186 static void fotg210_disable_PSE(struct fotg210_hcd *fotg210) fotg210_disable_PSE() argument 1188 fotg210_clear_command_bit(fotg210, CMD_PSE); fotg210_disable_PSE() 1193 static void fotg210_handle_controller_death(struct fotg210_hcd *fotg210) fotg210_handle_controller_death() argument 1195 if (!(fotg210_readl(fotg210, &fotg210->regs->status) & STS_HALT)) { fotg210_handle_controller_death() 1198 if (fotg210->died_poll_count++ < 5) { fotg210_handle_controller_death() 1200 fotg210_enable_event(fotg210, fotg210_handle_controller_death() 1204 fotg210_warn(fotg210, "Waited too long for the controller to stop, giving up\n"); fotg210_handle_controller_death() 1208 fotg210->rh_state = FOTG210_RH_HALTED; fotg210_handle_controller_death() 1209 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable); fotg210_handle_controller_death() 1210 fotg210_work(fotg210); fotg210_handle_controller_death() 1211 end_unlink_async(fotg210); fotg210_handle_controller_death() 1218 static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210) fotg210_handle_intr_unlinks() argument 1220 bool stopped = (fotg210->rh_state < FOTG210_RH_RUNNING); fotg210_handle_intr_unlinks() 1229 fotg210->intr_unlinking = true; fotg210_handle_intr_unlinks() 1230 while (fotg210->intr_unlink) { fotg210_handle_intr_unlinks() 1231 struct fotg210_qh *qh = fotg210->intr_unlink; fotg210_handle_intr_unlinks() 1233 if (!stopped && qh->unlink_cycle == fotg210->intr_unlink_cycle) fotg210_handle_intr_unlinks() 1235 fotg210->intr_unlink = qh->unlink_next; fotg210_handle_intr_unlinks() 1237 end_unlink_intr(fotg210, qh); fotg210_handle_intr_unlinks() 1241 if (fotg210->intr_unlink) { fotg210_handle_intr_unlinks() 1242 fotg210_enable_event(fotg210, FOTG210_HRTIMER_UNLINK_INTR, fotg210_handle_intr_unlinks() 1244 ++fotg210->intr_unlink_cycle; fotg210_handle_intr_unlinks() 1246 fotg210->intr_unlinking = false; fotg210_handle_intr_unlinks() 1251 static void start_free_itds(struct fotg210_hcd *fotg210) start_free_itds() argument 1253 if (!(fotg210->enabled_hrtimer_events & start_free_itds() 1255 fotg210->last_itd_to_free = list_entry( start_free_itds() 1256 fotg210->cached_itd_list.prev, start_free_itds() 1258 fotg210_enable_event(fotg210, FOTG210_HRTIMER_FREE_ITDS, true); start_free_itds() 1263 static void end_free_itds(struct fotg210_hcd *fotg210) end_free_itds() argument 1267 if (fotg210->rh_state < FOTG210_RH_RUNNING) end_free_itds() 1268 fotg210->last_itd_to_free = NULL; end_free_itds() 1270 list_for_each_entry_safe(itd, n, &fotg210->cached_itd_list, itd_list) { end_free_itds() 1272 dma_pool_free(fotg210->itd_pool, itd, itd->itd_dma); end_free_itds() 1273 if (itd == fotg210->last_itd_to_free) end_free_itds() 1277 if (!list_empty(&fotg210->cached_itd_list)) end_free_itds() 1278 start_free_itds(fotg210); end_free_itds() 1283 static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210) fotg210_iaa_watchdog() argument 1285 if (fotg210->rh_state != FOTG210_RH_RUNNING) fotg210_iaa_watchdog() 1294 if (fotg210->async_iaa) { fotg210_iaa_watchdog() 1303 cmd = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_iaa_watchdog() 1312 status = fotg210_readl(fotg210, &fotg210->regs->status); fotg210_iaa_watchdog() 1314 COUNT(fotg210->stats.lost_iaa); fotg210_iaa_watchdog() 1315 fotg210_writel(fotg210, STS_IAA, fotg210_iaa_watchdog() 1316 &fotg210->regs->status); fotg210_iaa_watchdog() 1319 fotg210_dbg(fotg210, "IAA watchdog: status %x cmd %x\n", fotg210_iaa_watchdog() 1321 end_unlink_async(fotg210); fotg210_iaa_watchdog() 1327 static void turn_on_io_watchdog(struct fotg210_hcd *fotg210) turn_on_io_watchdog() argument 1330 if (fotg210->rh_state != FOTG210_RH_RUNNING || turn_on_io_watchdog() 1331 (fotg210->enabled_hrtimer_events & turn_on_io_watchdog() 1339 if (fotg210->isoc_count > 0 || (fotg210->need_io_watchdog && turn_on_io_watchdog() 1340 fotg210->async_count + fotg210->intr_count > 0)) turn_on_io_watchdog() 1341 fotg210_enable_event(fotg210, FOTG210_HRTIMER_IO_WATCHDOG, turn_on_io_watchdog() 1348 * enum fotg210_hrtimer_event in fotg210.h. 1365 struct fotg210_hcd *fotg210 = fotg210_hrtimer_func() local 1372 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hrtimer_func() 1374 events = fotg210->enabled_hrtimer_events; fotg210_hrtimer_func() 1375 fotg210->enabled_hrtimer_events = 0; fotg210_hrtimer_func() 1376 fotg210->next_hrtimer_event = FOTG210_HRTIMER_NO_EVENT; fotg210_hrtimer_func() 1384 if (now.tv64 >= fotg210->hr_timeouts[e].tv64) fotg210_hrtimer_func() 1385 event_handlers[e](fotg210); fotg210_hrtimer_func() 1387 fotg210_enable_event(fotg210, e, false); fotg210_hrtimer_func() 1390 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hrtimer_func() 1397 static int check_reset_complete(struct fotg210_hcd *fotg210, int index, check_reset_complete() argument 1406 fotg210_dbg(fotg210, "Failed to enable port %d on root hub TT\n", check_reset_complete() 1409 fotg210_dbg(fotg210, "port %d reset complete, port enabled\n", check_reset_complete() 1420 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_hub_status_data() local 1432 status = fotg210->resuming_ports; fotg210_hub_status_data() 1440 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_status_data() 1442 temp = fotg210_readl(fotg210, &fotg210->regs->port_status); fotg210_hub_status_data() 1451 if ((temp & mask) != 0 || test_bit(0, &fotg210->port_c_suspend) || fotg210_hub_status_data() 1452 (fotg210->reset_done[0] && fotg210_hub_status_data() 1453 time_after_eq(jiffies, fotg210->reset_done[0]))) { fotg210_hub_status_data() 1458 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_status_data() 1462 static void fotg210_hub_descriptor(struct fotg210_hcd *fotg210, fotg210_hub_descriptor() argument 1465 int ports = HCS_N_PORTS(fotg210->hcs_params); fotg210_hub_descriptor() 1469 desc->bPwrOn2PwrGood = 10; /* fotg210 1.0, 2.3.9 says 20ms max */ fotg210_hub_descriptor() 1488 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_hub_control() local 1489 int ports = HCS_N_PORTS(fotg210->hcs_params); fotg210_hub_control() 1490 u32 __iomem *status_reg = &fotg210->regs->port_status; fotg210_hub_control() 1503 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_control() 1519 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control() 1531 fotg210_writel(fotg210, temp & ~PORT_PE, status_reg); fotg210_hub_control() 1534 fotg210_writel(fotg210, temp | PORT_PEC, status_reg); fotg210_hub_control() 1545 fotg210_writel(fotg210, temp | PORT_RESUME, status_reg); fotg210_hub_control() 1546 fotg210->reset_done[wIndex] = jiffies fotg210_hub_control() 1550 clear_bit(wIndex, &fotg210->port_c_suspend); fotg210_hub_control() 1553 fotg210_writel(fotg210, temp | PORT_CSC, status_reg); fotg210_hub_control() 1556 fotg210_writel(fotg210, temp | OTGISR_OVC, fotg210_hub_control() 1557 &fotg210->regs->otgisr); fotg210_hub_control() 1565 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_hub_control() 1568 fotg210_hub_descriptor(fotg210, (struct usb_hub_descriptor *) fotg210_hub_control() 1581 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control() 1589 temp1 = fotg210_readl(fotg210, &fotg210->regs->otgisr); fotg210_hub_control() 1597 if (!fotg210->reset_done[wIndex]) { fotg210_hub_control() 1599 fotg210->reset_done[wIndex] = jiffies fotg210_hub_control() 1602 mod_timer(&fotg210_to_hcd(fotg210)->rh_timer, fotg210_hub_control() 1603 fotg210->reset_done[wIndex]); fotg210_hub_control() 1608 fotg210->reset_done[wIndex])) { fotg210_hub_control() 1609 clear_bit(wIndex, &fotg210->suspended_ports); fotg210_hub_control() 1610 set_bit(wIndex, &fotg210->port_c_suspend); fotg210_hub_control() 1611 fotg210->reset_done[wIndex] = 0; fotg210_hub_control() 1614 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control() 1615 fotg210_writel(fotg210, temp & fotg210_hub_control() 1618 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control() 1619 retval = handshake(fotg210, status_reg, fotg210_hub_control() 1622 fotg210_err(fotg210, fotg210_hub_control() 1633 fotg210->reset_done[wIndex])) { fotg210_hub_control() 1635 fotg210->reset_done[wIndex] = 0; fotg210_hub_control() 1636 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control() 1639 fotg210_writel(fotg210, fotg210_hub_control() 1645 retval = handshake(fotg210, status_reg, fotg210_hub_control() 1648 fotg210_err(fotg210, "port %d reset error %d\n", fotg210_hub_control() 1654 temp = check_reset_complete(fotg210, wIndex, status_reg, fotg210_hub_control() 1655 fotg210_readl(fotg210, status_reg)); fotg210_hub_control() 1659 fotg210->reset_done[wIndex] = 0; fotg210_hub_control() 1660 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control() 1665 test_bit(wIndex, &fotg210->companion_ports)) { fotg210_hub_control() 1667 fotg210_writel(fotg210, temp, status_reg); fotg210_hub_control() 1668 fotg210_dbg(fotg210, "port %d --> companion\n", fotg210_hub_control() 1670 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control() 1681 status |= fotg210_port_speed(fotg210, temp); fotg210_hub_control() 1689 } else if (test_bit(wIndex, &fotg210->suspended_ports)) { fotg210_hub_control() 1690 clear_bit(wIndex, &fotg210->suspended_ports); fotg210_hub_control() 1691 clear_bit(wIndex, &fotg210->resuming_ports); fotg210_hub_control() 1692 fotg210->reset_done[wIndex] = 0; fotg210_hub_control() 1694 set_bit(wIndex, &fotg210->port_c_suspend); fotg210_hub_control() 1697 temp1 = fotg210_readl(fotg210, &fotg210->regs->otgisr); fotg210_hub_control() 1702 if (test_bit(wIndex, &fotg210->port_c_suspend)) fotg210_hub_control() 1706 dbg_port(fotg210, "GetStatus", wIndex + 1, temp); fotg210_hub_control() 1726 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control() 1738 fotg210_writel(fotg210, temp | PORT_SUSPEND, fotg210_hub_control() 1740 set_bit(wIndex, &fotg210->suspended_ports); fotg210_hub_control() 1749 fotg210_dbg(fotg210, "port %d reset\n", wIndex + 1); fotg210_hub_control() 1757 fotg210->reset_done[wIndex] = jiffies fotg210_hub_control() 1759 fotg210_writel(fotg210, temp, status_reg); fotg210_hub_control() 1771 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_control() 1772 fotg210_quiesce(fotg210); fotg210_hub_control() 1773 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_control() 1776 temp = fotg210_readl(fotg210, status_reg) & fotg210_hub_control() 1779 fotg210_writel(fotg210, temp | PORT_SUSPEND, fotg210_hub_control() 1782 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_control() 1783 fotg210_halt(fotg210); fotg210_hub_control() 1784 spin_lock_irqsave(&fotg210->lock, flags); fotg210_hub_control() 1786 temp = fotg210_readl(fotg210, status_reg); fotg210_hub_control() 1788 fotg210_writel(fotg210, temp, status_reg); fotg210_hub_control() 1794 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_hub_control() 1802 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_hub_control() 1829 static inline void fotg210_qtd_init(struct fotg210_hcd *fotg210, fotg210_qtd_init() argument 1834 qtd->hw_token = cpu_to_hc32(fotg210, QTD_STS_HALT); fotg210_qtd_init() 1835 qtd->hw_next = FOTG210_LIST_END(fotg210); fotg210_qtd_init() 1836 qtd->hw_alt_next = FOTG210_LIST_END(fotg210); fotg210_qtd_init() 1840 static struct fotg210_qtd *fotg210_qtd_alloc(struct fotg210_hcd *fotg210, fotg210_qtd_alloc() argument 1846 qtd = dma_pool_alloc(fotg210->qtd_pool, flags, &dma); fotg210_qtd_alloc() 1848 fotg210_qtd_init(fotg210, qtd, dma); fotg210_qtd_alloc() 1853 static inline void fotg210_qtd_free(struct fotg210_hcd *fotg210, fotg210_qtd_free() argument 1856 dma_pool_free(fotg210->qtd_pool, qtd, qtd->qtd_dma); fotg210_qtd_free() 1860 static void qh_destroy(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_destroy() argument 1864 fotg210_dbg(fotg210, "unused qh not empty!\n"); qh_destroy() 1868 fotg210_qtd_free(fotg210, qh->dummy); qh_destroy() 1869 dma_pool_free(fotg210->qh_pool, qh->hw, qh->qh_dma); qh_destroy() 1873 static struct fotg210_qh *fotg210_qh_alloc(struct fotg210_hcd *fotg210, fotg210_qh_alloc() argument 1883 dma_pool_alloc(fotg210->qh_pool, flags, &dma); fotg210_qh_alloc() 1891 qh->dummy = fotg210_qtd_alloc(fotg210, flags); fotg210_qh_alloc() 1893 fotg210_dbg(fotg210, "no dummy td\n"); fotg210_qh_alloc() 1899 dma_pool_free(fotg210->qh_pool, qh->hw, qh->qh_dma); fotg210_qh_alloc() 1910 static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210) fotg210_mem_cleanup() argument 1912 if (fotg210->async) fotg210_mem_cleanup() 1913 qh_destroy(fotg210, fotg210->async); fotg210_mem_cleanup() 1914 fotg210->async = NULL; fotg210_mem_cleanup() 1916 if (fotg210->dummy) fotg210_mem_cleanup() 1917 qh_destroy(fotg210, fotg210->dummy); fotg210_mem_cleanup() 1918 fotg210->dummy = NULL; fotg210_mem_cleanup() 1921 dma_pool_destroy(fotg210->qtd_pool); fotg210_mem_cleanup() 1922 fotg210->qtd_pool = NULL; fotg210_mem_cleanup() 1924 dma_pool_destroy(fotg210->qh_pool); fotg210_mem_cleanup() 1925 fotg210->qh_pool = NULL; fotg210_mem_cleanup() 1927 dma_pool_destroy(fotg210->itd_pool); fotg210_mem_cleanup() 1928 fotg210->itd_pool = NULL; fotg210_mem_cleanup() 1930 if (fotg210->periodic) fotg210_mem_cleanup() 1931 dma_free_coherent(fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_cleanup() 1932 fotg210->periodic_size * sizeof(u32), fotg210_mem_cleanup() 1933 fotg210->periodic, fotg210->periodic_dma); fotg210_mem_cleanup() 1934 fotg210->periodic = NULL; fotg210_mem_cleanup() 1937 kfree(fotg210->pshadow); fotg210_mem_cleanup() 1938 fotg210->pshadow = NULL; fotg210_mem_cleanup() 1942 static int fotg210_mem_init(struct fotg210_hcd *fotg210, gfp_t flags) fotg210_mem_init() argument 1947 fotg210->qtd_pool = dma_pool_create("fotg210_qtd", fotg210_mem_init() 1948 fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init() 1952 if (!fotg210->qtd_pool) fotg210_mem_init() 1956 fotg210->qh_pool = dma_pool_create("fotg210_qh", fotg210_mem_init() 1957 fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init() 1961 if (!fotg210->qh_pool) fotg210_mem_init() 1964 fotg210->async = fotg210_qh_alloc(fotg210, flags); fotg210_mem_init() 1965 if (!fotg210->async) fotg210_mem_init() 1969 fotg210->itd_pool = dma_pool_create("fotg210_itd", fotg210_mem_init() 1970 fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init() 1974 if (!fotg210->itd_pool) fotg210_mem_init() 1978 fotg210->periodic = (__le32 *) fotg210_mem_init() 1979 dma_alloc_coherent(fotg210_to_hcd(fotg210)->self.controller, fotg210_mem_init() 1980 fotg210->periodic_size * sizeof(__le32), fotg210_mem_init() 1981 &fotg210->periodic_dma, 0); fotg210_mem_init() 1982 if (fotg210->periodic == NULL) fotg210_mem_init() 1985 for (i = 0; i < fotg210->periodic_size; i++) fotg210_mem_init() 1986 fotg210->periodic[i] = FOTG210_LIST_END(fotg210); fotg210_mem_init() 1989 fotg210->pshadow = kcalloc(fotg210->periodic_size, sizeof(void *), fotg210_mem_init() 1991 if (fotg210->pshadow != NULL) fotg210_mem_init() 1995 fotg210_dbg(fotg210, "couldn't init memory\n"); fotg210_mem_init() 1996 fotg210_mem_cleanup(fotg210); fotg210_mem_init() 2017 static int qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd, qtd_fill() argument 2024 qtd->hw_buf[0] = cpu_to_hc32(fotg210, (u32)addr); qtd_fill() 2025 qtd->hw_buf_hi[0] = cpu_to_hc32(fotg210, (u32)(addr >> 32)); qtd_fill() 2036 qtd->hw_buf[i] = cpu_to_hc32(fotg210, (u32)addr); qtd_fill() 2037 qtd->hw_buf_hi[i] = cpu_to_hc32(fotg210, qtd_fill() 2050 qtd->hw_token = cpu_to_hc32(fotg210, (count << 16) | token); qtd_fill() 2056 static inline void qh_update(struct fotg210_hcd *fotg210, qh_update() argument 2064 hw->hw_qtd_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_update() 2065 hw->hw_alt_next = FOTG210_LIST_END(fotg210); qh_update() 2072 if (!(hw->hw_info1 & cpu_to_hc32(fotg210, QH_TOGGLE_CTL))) { qh_update() 2076 epnum = (hc32_to_cpup(fotg210, &hw->hw_info1) >> 8) & 0x0f; qh_update() 2078 hw->hw_token &= ~cpu_to_hc32(fotg210, QTD_TOGGLE); qh_update() 2083 hw->hw_token &= cpu_to_hc32(fotg210, QTD_TOGGLE | QTD_STS_PING); qh_update() 2090 static void qh_refresh(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_refresh() argument 2106 if (cpu_to_hc32(fotg210, qtd->qtd_dma) == qh->hw->hw_current) { qh_refresh() 2113 qh_update(fotg210, qh, qtd); qh_refresh() 2116 static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh); 2121 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_clear_tt_buffer_complete() local 2125 spin_lock_irqsave(&fotg210->lock, flags); fotg210_clear_tt_buffer_complete() 2128 && fotg210->rh_state == FOTG210_RH_RUNNING) fotg210_clear_tt_buffer_complete() 2129 qh_link_async(fotg210, qh); fotg210_clear_tt_buffer_complete() 2130 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_clear_tt_buffer_complete() 2133 static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210, fotg210_clear_tt_buffer() argument 2152 fotg210_to_hcd(fotg210)->self.root_hub) { fotg210_clear_tt_buffer() 2159 static int qtd_copy_status(struct fotg210_hcd *fotg210, struct urb *urb, qtd_copy_status() argument 2198 fotg210_dbg(fotg210, "devpath %s ep%d%s 3strikes\n", qtd_copy_status() 2207 fotg210_dbg(fotg210, qtd_copy_status() 2218 static void fotg210_urb_done(struct fotg210_hcd *fotg210, struct urb *urb, 2220 __releases(fotg210->lock) 2221 __acquires(fotg210->lock) 2227 if ((qh->hw->hw_info2 & cpu_to_hc32(fotg210, QH_SMASK)) != 0) { 2230 fotg210_to_hcd(fotg210)->self.bandwidth_int_reqs--; 2235 COUNT(fotg210->stats.unlink); 2240 COUNT(fotg210->stats.complete); 2244 fotg210_dbg(fotg210, 2254 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); 2255 spin_unlock(&fotg210->lock); 2256 usb_hcd_giveback_urb(fotg210_to_hcd(fotg210), urb, status); 2257 spin_lock(&fotg210->lock); 2260 static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh); 2266 static unsigned qh_completions(struct fotg210_hcd *fotg210, qh_completions() argument 2315 fotg210_urb_done(fotg210, last->urb, qh_completions() 2320 fotg210_qtd_free(fotg210, last); qh_completions() 2330 token = hc32_to_cpu(fotg210, qtd->hw_token); qh_completions() 2338 fotg210_dbg(fotg210, qh_completions() 2357 fotg210_dbg(fotg210, qh_completions() 2371 qtd->hw_token = cpu_to_hc32(fotg210, qh_completions() 2374 hw->hw_token = cpu_to_hc32(fotg210, qh_completions() 2391 FOTG210_LIST_END(fotg210))) { qh_completions() 2397 && fotg210->rh_state >= FOTG210_RH_RUNNING)) { qh_completions() 2405 if (fotg210->rh_state < FOTG210_RH_RUNNING) qh_completions() 2416 cpu_to_hc32(fotg210, qtd->qtd_dma) qh_completions() 2418 token = hc32_to_cpu(fotg210, hw->hw_token); qh_completions() 2424 fotg210_clear_tt_buffer(fotg210, qh, urb, qh_completions() 2437 last_status = qtd_copy_status(fotg210, urb, qh_completions() 2441 FOTG210_LIST_END(fotg210))) qh_completions() 2459 fotg210_clear_tt_buffer(fotg210, qh, qh_completions() 2483 fotg210_urb_done(fotg210, last->urb, last_status); qh_completions() 2485 fotg210_qtd_free(fotg210, last); qh_completions() 2510 if (stopped != 0 || hw->hw_qtd_next == FOTG210_LIST_END(fotg210)) { qh_completions() 2513 qh_refresh(fotg210, qh); qh_completions() 2546 static void qtd_list_free(struct fotg210_hcd *fotg210, struct urb *urb, qtd_list_free() argument 2556 fotg210_qtd_free(fotg210, qtd); list_for_each_safe() 2562 static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210, qh_urb_transaction() argument 2576 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction() 2590 qtd_fill(fotg210, qtd, urb->setup_dma, qh_urb_transaction() 2597 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction() 2601 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_urb_transaction() 2641 this_qtd_len = qtd_fill(fotg210, qtd, buf, this_sg_len, token, qh_urb_transaction() 2653 qtd->hw_alt_next = fotg210->async->hw->hw_alt_next; qh_urb_transaction() 2668 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction() 2672 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_urb_transaction() 2683 qtd->hw_alt_next = FOTG210_LIST_END(fotg210); qh_urb_transaction() 2704 qtd = fotg210_qtd_alloc(fotg210, flags); qh_urb_transaction() 2708 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma); qh_urb_transaction() 2712 qtd_fill(fotg210, qtd, 0, 0, token, 0); qh_urb_transaction() 2718 qtd->hw_token |= cpu_to_hc32(fotg210, QTD_IOC); qh_urb_transaction() 2722 qtd_list_free(fotg210, urb, head); qh_urb_transaction() 2741 static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb, qh_make() argument 2744 struct fotg210_qh *qh = fotg210_qh_alloc(fotg210, flags); qh_make() 2768 fotg210_dbg(fotg210, "bogus qh maxpacket %d\n", qh_make() 2798 } else if (qh->period > fotg210->periodic_size) { qh_make() 2799 qh->period = fotg210->periodic_size; qh_make() 2823 if (qh->period > fotg210->periodic_size) { qh_make() 2824 qh->period = fotg210->periodic_size; qh_make() 2854 if (fotg210_has_fsl_portno_bug(fotg210)) qh_make() 2862 if (tt && tt->hub != fotg210_to_hcd(fotg210)->self.root_hub) qh_make() 2892 fotg210_dbg(fotg210, "bogus dev %p speed %d\n", urb->dev, qh_make() 2895 qh_destroy(fotg210, qh); qh_make() 2904 hw->hw_info1 = cpu_to_hc32(fotg210, info1); qh_make() 2905 hw->hw_info2 = cpu_to_hc32(fotg210, info2); qh_make() 2908 qh_refresh(fotg210, qh); qh_make() 2912 static void enable_async(struct fotg210_hcd *fotg210) enable_async() argument 2914 if (fotg210->async_count++) enable_async() 2918 fotg210->enabled_hrtimer_events &= ~BIT(FOTG210_HRTIMER_DISABLE_ASYNC); enable_async() 2921 fotg210_poll_ASS(fotg210); enable_async() 2922 turn_on_io_watchdog(fotg210); enable_async() 2925 static void disable_async(struct fotg210_hcd *fotg210) disable_async() argument 2927 if (--fotg210->async_count) disable_async() 2931 WARN_ON(fotg210->async->qh_next.qh || fotg210->async_unlink); disable_async() 2934 fotg210_poll_ASS(fotg210); disable_async() 2939 static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_link_async() argument 2941 __hc32 dma = QH_NEXT(fotg210, qh->qh_dma); qh_link_async() 2951 qh_refresh(fotg210, qh); qh_link_async() 2954 head = fotg210->async; qh_link_async() 2966 enable_async(fotg210); qh_link_async() 2974 static struct fotg210_qh *qh_append_tds(struct fotg210_hcd *fotg210, qh_append_tds() argument 2979 __hc32 qh_addr_mask = cpu_to_hc32(fotg210, 0x7f); qh_append_tds() 2983 /* can't sleep here, we have fotg210->lock... */ qh_append_tds() 2984 qh = qh_make(fotg210, urb, GFP_ATOMIC); qh_append_tds() 3017 qtd->hw_token = HALT_BIT(fotg210); qh_append_tds() 3029 fotg210_qtd_init(fotg210, qtd, qtd->qtd_dma); qh_append_tds() 3036 qtd->hw_next = QTD_NEXT(fotg210, dma); qh_append_tds() 3048 static int submit_async(struct fotg210_hcd *fotg210, struct urb *urb, submit_async() argument 3063 fotg210_dbg(fotg210, submit_async() 3073 spin_lock_irqsave(&fotg210->lock, flags); submit_async() 3074 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) { submit_async() 3078 rc = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb); submit_async() 3082 qh = qh_append_tds(fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv); submit_async() 3084 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); submit_async() 3093 qh_link_async(fotg210, qh); submit_async() 3095 spin_unlock_irqrestore(&fotg210->lock, flags); submit_async() 3097 qtd_list_free(fotg210, urb, qtd_list); submit_async() 3101 static void single_unlink_async(struct fotg210_hcd *fotg210, single_unlink_async() argument 3108 if (fotg210->async_unlink) single_unlink_async() 3109 fotg210->async_unlink_last->unlink_next = qh; single_unlink_async() 3111 fotg210->async_unlink = qh; single_unlink_async() 3112 fotg210->async_unlink_last = qh; single_unlink_async() 3115 prev = fotg210->async; single_unlink_async() 3121 if (fotg210->qh_scan_next == qh) single_unlink_async() 3122 fotg210->qh_scan_next = qh->qh_next.qh; single_unlink_async() 3125 static void start_iaa_cycle(struct fotg210_hcd *fotg210, bool nested) start_iaa_cycle() argument 3131 if (fotg210->async_iaa || fotg210->async_unlinking) start_iaa_cycle() 3135 fotg210->async_iaa = fotg210->async_unlink; start_iaa_cycle() 3136 fotg210->async_unlink = NULL; start_iaa_cycle() 3139 if (unlikely(fotg210->rh_state < FOTG210_RH_RUNNING)) { start_iaa_cycle() 3141 end_unlink_async(fotg210); start_iaa_cycle() 3144 } else if (likely(fotg210->rh_state == FOTG210_RH_RUNNING)) { start_iaa_cycle() 3148 fotg210_writel(fotg210, fotg210->command | CMD_IAAD, start_iaa_cycle() 3149 &fotg210->regs->command); start_iaa_cycle() 3150 fotg210_readl(fotg210, &fotg210->regs->command); start_iaa_cycle() 3151 fotg210_enable_event(fotg210, FOTG210_HRTIMER_IAA_WATCHDOG, start_iaa_cycle() 3158 static void end_unlink_async(struct fotg210_hcd *fotg210) end_unlink_async() argument 3164 fotg210->async_unlinking = true; end_unlink_async() 3165 while (fotg210->async_iaa) { end_unlink_async() 3166 qh = fotg210->async_iaa; end_unlink_async() 3167 fotg210->async_iaa = qh->unlink_next; end_unlink_async() 3173 qh_completions(fotg210, qh); end_unlink_async() 3175 fotg210->rh_state == FOTG210_RH_RUNNING) end_unlink_async() 3176 qh_link_async(fotg210, qh); end_unlink_async() 3177 disable_async(fotg210); end_unlink_async() 3179 fotg210->async_unlinking = false; end_unlink_async() 3182 if (fotg210->async_unlink) { end_unlink_async() 3183 start_iaa_cycle(fotg210, true); end_unlink_async() 3184 if (unlikely(fotg210->rh_state < FOTG210_RH_RUNNING)) end_unlink_async() 3189 static void unlink_empty_async(struct fotg210_hcd *fotg210) unlink_empty_async() argument 3192 bool stopped = (fotg210->rh_state < FOTG210_RH_RUNNING); unlink_empty_async() 3196 next = fotg210->async->qh_next.qh; unlink_empty_async() 3204 fotg210->async_unlink_cycle) unlink_empty_async() 3207 single_unlink_async(fotg210, qh); unlink_empty_async() 3212 if (fotg210->async_unlink) unlink_empty_async() 3213 start_iaa_cycle(fotg210, false); unlink_empty_async() 3217 fotg210_enable_event(fotg210, FOTG210_HRTIMER_ASYNC_UNLINKS, unlink_empty_async() 3219 ++fotg210->async_unlink_cycle; unlink_empty_async() 3224 /* caller must own fotg210->lock */ 3226 static void start_unlink_async(struct fotg210_hcd *fotg210, start_unlink_async() argument 3240 single_unlink_async(fotg210, qh); start_unlink_async() 3241 start_iaa_cycle(fotg210, false); start_unlink_async() 3244 static void scan_async(struct fotg210_hcd *fotg210) scan_async() argument 3249 fotg210->qh_scan_next = fotg210->async->qh_next.qh; scan_async() 3250 while (fotg210->qh_scan_next) { scan_async() 3251 qh = fotg210->qh_scan_next; scan_async() 3252 fotg210->qh_scan_next = qh->qh_next.qh; scan_async() 3260 * drops the lock. That's why fotg210->qh_scan_next scan_async() 3262 * gets unlinked then fotg210->qh_scan_next is adjusted scan_async() 3265 temp = qh_completions(fotg210, qh); scan_async() 3267 start_unlink_async(fotg210, qh); scan_async() 3270 qh->unlink_cycle = fotg210->async_unlink_cycle; scan_async() 3283 if (check_unlinks_later && fotg210->rh_state == FOTG210_RH_RUNNING && scan_async() 3284 !(fotg210->enabled_hrtimer_events & scan_async() 3286 fotg210_enable_event(fotg210, scan_async() 3288 ++fotg210->async_unlink_cycle; scan_async() 3308 static union fotg210_shadow *periodic_next_shadow(struct fotg210_hcd *fotg210, periodic_next_shadow() argument 3311 switch (hc32_to_cpu(fotg210, tag)) { periodic_next_shadow() 3321 static __hc32 *shadow_next_periodic(struct fotg210_hcd *fotg210, shadow_next_periodic() argument 3324 switch (hc32_to_cpu(fotg210, tag)) { shadow_next_periodic() 3334 /* caller must hold fotg210->lock */ periodic_unlink() 3335 static void periodic_unlink(struct fotg210_hcd *fotg210, unsigned frame, periodic_unlink() argument 3338 union fotg210_shadow *prev_p = &fotg210->pshadow[frame]; periodic_unlink() 3339 __hc32 *hw_p = &fotg210->periodic[frame]; periodic_unlink() 3344 prev_p = periodic_next_shadow(fotg210, prev_p, periodic_unlink() 3345 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink() 3346 hw_p = shadow_next_periodic(fotg210, &here, periodic_unlink() 3347 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink() 3357 *prev_p = *periodic_next_shadow(fotg210, &here, periodic_unlink() 3358 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink() 3360 *hw_p = *shadow_next_periodic(fotg210, &here, periodic_unlink() 3361 Q_NEXT_TYPE(fotg210, *hw_p)); periodic_unlink() 3365 static unsigned short periodic_usecs(struct fotg210_hcd *fotg210, periodic_usecs() argument 3368 __hc32 *hw_p = &fotg210->periodic[frame]; periodic_usecs() 3369 union fotg210_shadow *q = &fotg210->pshadow[frame]; periodic_usecs() 3374 switch (hc32_to_cpu(fotg210, Q_NEXT_TYPE(fotg210, *hw_p))) { periodic_usecs() 3378 if (hw->hw_info2 & cpu_to_hc32(fotg210, 1 << uframe)) periodic_usecs() 3381 if (hw->hw_info2 & cpu_to_hc32(fotg210, periodic_usecs() 3392 if (q->fstn->hw_prev != FOTG210_LIST_END(fotg210)) periodic_usecs() 3393 fotg210_dbg(fotg210, "ignoring FSTN cost ...\n"); periodic_usecs() 3406 if (usecs > fotg210->uframe_periodic_max) periodic_usecs() 3407 fotg210_err(fotg210, "uframe %d sched overrun: %d usecs\n", periodic_usecs() 3428 static int tt_no_collision(struct fotg210_hcd *fotg210, unsigned period, tt_no_collision() argument 3438 for (; frame < fotg210->periodic_size; frame += period) { tt_no_collision() 3443 here = fotg210->pshadow[frame]; tt_no_collision() 3444 type = Q_NEXT_TYPE(fotg210, fotg210->periodic[frame]); tt_no_collision() 3446 switch (hc32_to_cpu(fotg210, type)) { tt_no_collision() 3448 type = Q_NEXT_TYPE(fotg210, here.itd->hw_next); tt_no_collision() 3456 mask = hc32_to_cpu(fotg210, tt_no_collision() 3463 type = Q_NEXT_TYPE(fotg210, hw->hw_next); tt_no_collision() 3468 fotg210_dbg(fotg210, tt_no_collision() 3482 static void enable_periodic(struct fotg210_hcd *fotg210) enable_periodic() argument 3484 if (fotg210->periodic_count++) enable_periodic() 3488 fotg210->enabled_hrtimer_events &= enable_periodic() 3492 fotg210_poll_PSS(fotg210); enable_periodic() 3493 turn_on_io_watchdog(fotg210); enable_periodic() 3496 static void disable_periodic(struct fotg210_hcd *fotg210) disable_periodic() argument 3498 if (--fotg210->periodic_count) disable_periodic() 3502 fotg210_poll_PSS(fotg210); disable_periodic() 3509 * no FSTN support (yet; fotg210 0.96+) 3511 static void qh_link_periodic(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_link_periodic() argument 3518 hc32_to_cpup(fotg210, &qh->hw->hw_info2) & qh_link_periodic() 3526 for (i = qh->start; i < fotg210->periodic_size; i += period) { qh_link_periodic() 3527 union fotg210_shadow *prev = &fotg210->pshadow[i]; qh_link_periodic() 3528 __hc32 *hw_p = &fotg210->periodic[i]; qh_link_periodic() 3534 type = Q_NEXT_TYPE(fotg210, *hw_p); qh_link_periodic() 3535 if (type == cpu_to_hc32(fotg210, Q_TYPE_QH)) qh_link_periodic() 3537 prev = periodic_next_shadow(fotg210, prev, type); qh_link_periodic() 3538 hw_p = shadow_next_periodic(fotg210, &here, type); qh_link_periodic() 3559 *hw_p = QH_NEXT(fotg210, qh->qh_dma); qh_link_periodic() 3566 fotg210_to_hcd(fotg210)->self.bandwidth_allocated += qh->period qh_link_periodic() 3570 list_add(&qh->intr_node, &fotg210->intr_qh_list); qh_link_periodic() 3573 ++fotg210->intr_count; qh_link_periodic() 3574 enable_periodic(fotg210); qh_link_periodic() 3577 static void qh_unlink_periodic(struct fotg210_hcd *fotg210, qh_unlink_periodic() argument 3603 for (i = qh->start; i < fotg210->periodic_size; i += period) qh_unlink_periodic() 3604 periodic_unlink(fotg210, i, qh); qh_unlink_periodic() 3607 fotg210_to_hcd(fotg210)->self.bandwidth_allocated -= qh->period qh_unlink_periodic() 3613 qh->period, hc32_to_cpup(fotg210, &qh->hw->hw_info2) & qh_unlink_periodic() 3621 if (fotg210->qh_scan_next == qh) qh_unlink_periodic() 3622 fotg210->qh_scan_next = list_entry(qh->intr_node.next, qh_unlink_periodic() 3627 static void start_unlink_intr(struct fotg210_hcd *fotg210, start_unlink_intr() argument 3640 qh_unlink_periodic(fotg210, qh); start_unlink_intr() 3650 qh->unlink_cycle = fotg210->intr_unlink_cycle; start_unlink_intr() 3653 if (fotg210->intr_unlink) start_unlink_intr() 3654 fotg210->intr_unlink_last->unlink_next = qh; start_unlink_intr() 3656 fotg210->intr_unlink = qh; start_unlink_intr() 3657 fotg210->intr_unlink_last = qh; start_unlink_intr() 3659 if (fotg210->intr_unlinking) start_unlink_intr() 3661 else if (fotg210->rh_state < FOTG210_RH_RUNNING) start_unlink_intr() 3662 fotg210_handle_intr_unlinks(fotg210); start_unlink_intr() 3663 else if (fotg210->intr_unlink == qh) { start_unlink_intr() 3664 fotg210_enable_event(fotg210, FOTG210_HRTIMER_UNLINK_INTR, start_unlink_intr() 3666 ++fotg210->intr_unlink_cycle; start_unlink_intr() 3670 static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) end_unlink_intr() argument 3676 hw->hw_next = FOTG210_LIST_END(fotg210); end_unlink_intr() 3678 qh_completions(fotg210, qh); end_unlink_intr() 3682 fotg210->rh_state == FOTG210_RH_RUNNING) { end_unlink_intr() 3683 rc = qh_schedule(fotg210, qh); end_unlink_intr() 3692 fotg210_err(fotg210, "can't reschedule qh %p, err %d\n", end_unlink_intr() 3697 --fotg210->intr_count; end_unlink_intr() 3698 disable_periodic(fotg210); end_unlink_intr() 3701 static int check_period(struct fotg210_hcd *fotg210, unsigned frame, check_period() argument 3713 usecs = fotg210->uframe_periodic_max - usecs; check_period() 3721 claimed = periodic_usecs(fotg210, frame, check_period() 3726 } while ((frame += 1) < fotg210->periodic_size); check_period() 3731 claimed = periodic_usecs(fotg210, frame, uframe); check_period() 3734 } while ((frame += period) < fotg210->periodic_size); check_period() 3741 static int check_intr_schedule(struct fotg210_hcd *fotg210, unsigned frame, check_intr_schedule() argument 3750 if (!check_period(fotg210, frame, uframe, qh->period, qh->usecs)) check_intr_schedule() 3766 *c_maskp = cpu_to_hc32(fotg210, mask << 8); check_intr_schedule() 3769 if (tt_no_collision(fotg210, qh->period, qh->dev, frame, mask)) { check_intr_schedule() 3770 if (!check_period(fotg210, frame, uframe + qh->gap_uf + 1, check_intr_schedule() 3773 if (!check_period(fotg210, frame, uframe + qh->gap_uf, check_intr_schedule() 3785 static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh_schedule() argument 3793 qh_refresh(fotg210, qh); qh_schedule() 3794 hw->hw_next = FOTG210_LIST_END(fotg210); qh_schedule() 3799 uframe = ffs(hc32_to_cpup(fotg210, &hw->hw_info2) & QH_SMASK); qh_schedule() 3800 status = check_intr_schedule(fotg210, frame, --uframe, qh_schedule() 3817 frame = ++fotg210->random_frame % qh->period; qh_schedule() 3819 status = check_intr_schedule(fotg210, qh_schedule() 3830 status = check_intr_schedule(fotg210, 0, 0, qh, qh_schedule() 3838 hw->hw_info2 &= cpu_to_hc32(fotg210, ~(QH_CMASK | QH_SMASK)); qh_schedule() 3840 ? cpu_to_hc32(fotg210, 1 << uframe) qh_schedule() 3841 : cpu_to_hc32(fotg210, QH_SMASK); qh_schedule() 3844 fotg210_dbg(fotg210, "reused qh %p schedule\n", qh); qh_schedule() 3847 qh_link_periodic(fotg210, qh); qh_schedule() 3852 static int intr_submit(struct fotg210_hcd *fotg210, struct urb *urb, intr_submit() argument 3864 spin_lock_irqsave(&fotg210->lock, flags); intr_submit() 3866 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) { intr_submit() 3870 status = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb); intr_submit() 3876 qh = qh_append_tds(fotg210, urb, &empty, epnum, &urb->ep->hcpriv); intr_submit() 3882 status = qh_schedule(fotg210, qh); intr_submit() 3888 qh = qh_append_tds(fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv); intr_submit() 3892 fotg210_to_hcd(fotg210)->self.bandwidth_int_reqs++; intr_submit() 3896 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); intr_submit() 3898 spin_unlock_irqrestore(&fotg210->lock, flags); intr_submit() 3900 qtd_list_free(fotg210, urb, qtd_list); intr_submit() 3905 static void scan_intr(struct fotg210_hcd *fotg210) scan_intr() argument 3909 list_for_each_entry_safe(qh, fotg210->qh_scan_next, scan_intr() 3910 &fotg210->intr_qh_list, intr_node) { scan_intr() 3918 * drops the lock. That's why fotg210->qh_scan_next scan_intr() 3920 * gets unlinked then fotg210->qh_scan_next is adjusted scan_intr() 3923 temp = qh_completions(fotg210, qh); scan_intr() 3927 start_unlink_intr(fotg210, qh); scan_intr() 3949 static void iso_stream_init(struct fotg210_hcd *fotg210, iso_stream_init() argument 3976 stream->buf0 = cpu_to_hc32(fotg210, (epnum << 8) | dev->devnum); iso_stream_init() 3977 stream->buf1 = cpu_to_hc32(fotg210, buf1); iso_stream_init() 3978 stream->buf2 = cpu_to_hc32(fotg210, multi); iso_stream_init() 4002 static struct fotg210_iso_stream *iso_stream_find(struct fotg210_hcd *fotg210, iso_stream_find() argument 4016 spin_lock_irqsave(&fotg210->lock, flags); iso_stream_find() 4024 iso_stream_init(fotg210, stream, urb->dev, urb->pipe, iso_stream_find() 4030 fotg210_dbg(fotg210, "dev %s ep%d%s, not iso??\n", iso_stream_find() 4036 spin_unlock_irqrestore(&fotg210->lock, flags); iso_stream_find() 4056 static inline void itd_sched_init(struct fotg210_hcd *fotg210, itd_sched_init() argument 4084 uframe->transaction = cpu_to_hc32(fotg210, trans); itd_sched_init() 4099 /* caller must hold fotg210->lock!*/ iso_sched_free() 4105 struct fotg210_hcd *fotg210, struct urb *urb, gfp_t mem_flags) itd_urb_transaction() 4118 itd_sched_init(fotg210, sched, stream, urb); itd_urb_transaction() 4126 spin_lock_irqsave(&fotg210->lock, flags); itd_urb_transaction() 4136 if (itd->frame == fotg210->now_frame) itd_urb_transaction() 4142 spin_unlock_irqrestore(&fotg210->lock, flags); itd_urb_transaction() 4143 itd = dma_pool_alloc(fotg210->itd_pool, mem_flags, itd_urb_transaction() 4145 spin_lock_irqsave(&fotg210->lock, flags); itd_urb_transaction() 4148 spin_unlock_irqrestore(&fotg210->lock, flags); itd_urb_transaction() 4157 spin_unlock_irqrestore(&fotg210->lock, flags); itd_urb_transaction() 4165 static inline int itd_slot_ok(struct fotg210_hcd *fotg210, u32 mod, u32 uframe, itd_slot_ok() argument 4171 if (periodic_usecs(fotg210, uframe >> 3, uframe & 0x7) itd_slot_ok() 4172 > (fotg210->uframe_periodic_max - usecs)) itd_slot_ok() 4185 * Also avoid queue depths of less than fotg210's worst irq latency (affected 4193 static int iso_stream_schedule(struct fotg210_hcd *fotg210, struct urb *urb, iso_stream_schedule() argument 4198 unsigned mod = fotg210->periodic_size << 3; iso_stream_schedule() 4205 fotg210_dbg(fotg210, "iso request %p too long\n", urb); iso_stream_schedule() 4210 now = fotg210_read_frame_index(fotg210) & (mod - 1); iso_stream_schedule() 4225 if (!stream->highspeed && fotg210->fs_i_thresh) iso_stream_schedule() 4226 next = now + fotg210->i_thresh; iso_stream_schedule() 4241 fotg210_dbg(fotg210, "request %p would overflow (%d+%d >= %d)\n", iso_stream_schedule() 4250 * this is bigger than fotg210->i_thresh allows; scheduling itself iso_stream_schedule() 4272 if (itd_slot_ok(fotg210, mod, start, iso_stream_schedule() 4279 fotg210_dbg(fotg210, "iso resched full %p (now %d max %d)\n", iso_stream_schedule() 4289 fotg210_dbg(fotg210, "request %p would overflow (%d+%d >= %d)\n", iso_stream_schedule() 4304 if (fotg210->isoc_count == 0) iso_stream_schedule() 4305 fotg210->next_frame = now >> 3; iso_stream_schedule() 4314 static inline void itd_init(struct fotg210_hcd *fotg210, itd_init() argument 4320 itd->hw_next = FOTG210_LIST_END(fotg210); itd_init() 4331 static inline void itd_patch(struct fotg210_hcd *fotg210, itd_patch() argument 4342 itd->hw_transaction[uframe] |= cpu_to_hc32(fotg210, pg << 12); itd_patch() 4343 itd->hw_bufp[pg] |= cpu_to_hc32(fotg210, uf->bufp & ~(u32)0); itd_patch() 4344 itd->hw_bufp_hi[pg] |= cpu_to_hc32(fotg210, (u32)(uf->bufp >> 32)); itd_patch() 4351 itd->hw_bufp[pg] |= cpu_to_hc32(fotg210, bufp & ~(u32)0); itd_patch() 4352 itd->hw_bufp_hi[pg] |= cpu_to_hc32(fotg210, (u32)(bufp >> 32)); itd_patch() 4356 static inline void itd_link(struct fotg210_hcd *fotg210, unsigned frame, itd_link() argument 4359 union fotg210_shadow *prev = &fotg210->pshadow[frame]; itd_link() 4360 __hc32 *hw_p = &fotg210->periodic[frame]; itd_link() 4366 type = Q_NEXT_TYPE(fotg210, *hw_p); itd_link() 4367 if (type == cpu_to_hc32(fotg210, Q_TYPE_QH)) itd_link() 4369 prev = periodic_next_shadow(fotg210, prev, type); itd_link() 4370 hw_p = shadow_next_periodic(fotg210, &here, type); itd_link() 4379 *hw_p = cpu_to_hc32(fotg210, itd->itd_dma | Q_TYPE_ITD); itd_link() 4383 static void itd_link_urb(struct fotg210_hcd *fotg210, struct urb *urb, itd_link_urb() argument 4394 fotg210_to_hcd(fotg210)->self.bandwidth_allocated itd_link_urb() 4396 fotg210_dbg(fotg210, itd_link_urb() 4416 itd_init(fotg210, stream, itd); itd_link_urb() 4422 itd_patch(fotg210, itd, iso_sched, packet, uframe); itd_link_urb() 4431 itd_link(fotg210, frame & (fotg210->periodic_size - 1), itd_link_urb() 4442 ++fotg210->isoc_count; itd_link_urb() 4443 enable_periodic(fotg210); itd_link_urb() 4459 static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd) itd_complete() argument 4477 t = hc32_to_cpup(fotg210, &itd->hw_transaction[uframe]); itd_complete() 4519 fotg210_urb_done(fotg210, urb, 0); itd_complete() 4523 --fotg210->isoc_count; itd_complete() 4524 disable_periodic(fotg210); itd_complete() 4527 fotg210_to_hcd(fotg210)->self.bandwidth_allocated itd_complete() 4529 fotg210_dbg(fotg210, itd_complete() 4544 &fotg210->cached_itd_list); itd_complete() 4545 start_free_itds(fotg210); itd_complete() 4551 static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb, itd_submit() argument 4559 stream = iso_stream_find(fotg210, urb); itd_submit() 4561 fotg210_dbg(fotg210, "can't get iso stream\n"); itd_submit() 4565 fotg210_port_speed(fotg210, 0) == itd_submit() 4567 fotg210_dbg(fotg210, "can't change iso interval %d --> %d\n", itd_submit() 4573 fotg210_dbg(fotg210, itd_submit() 4584 status = itd_urb_transaction(stream, fotg210, urb, mem_flags); itd_submit() 4586 fotg210_dbg(fotg210, "can't init itds\n"); itd_submit() 4591 spin_lock_irqsave(&fotg210->lock, flags); itd_submit() 4592 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) { itd_submit() 4596 status = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb); itd_submit() 4599 status = iso_stream_schedule(fotg210, urb, stream); itd_submit() 4601 itd_link_urb(fotg210, urb, fotg210->periodic_size << 3, stream); itd_submit() 4603 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb); itd_submit() 4605 spin_unlock_irqrestore(&fotg210->lock, flags); itd_submit() 4610 static inline int scan_frame_queue(struct fotg210_hcd *fotg210, unsigned frame, scan_frame_queue() argument 4619 q_p = &fotg210->pshadow[frame]; scan_frame_queue() 4620 hw_p = &fotg210->periodic[frame]; scan_frame_queue() 4622 type = Q_NEXT_TYPE(fotg210, *hw_p); scan_frame_queue() 4626 switch (hc32_to_cpu(fotg210, type)) { scan_frame_queue() 4637 ITD_ACTIVE(fotg210)) scan_frame_queue() 4643 type = Q_NEXT_TYPE(fotg210, scan_frame_queue() 4657 type = Q_NEXT_TYPE(fotg210, q.itd->hw_next); scan_frame_queue() 4659 modified = itd_complete(fotg210, q.itd); scan_frame_queue() 4663 fotg210_dbg(fotg210, "corrupt type %d frame %d shadow %p\n", scan_frame_queue() 4674 if (unlikely(modified && fotg210->isoc_count > 0)) scan_frame_queue() 4680 static void scan_isoc(struct fotg210_hcd *fotg210) scan_isoc() argument 4683 unsigned fmask = fotg210->periodic_size - 1; scan_isoc() 4691 if (fotg210->rh_state >= FOTG210_RH_RUNNING) { scan_isoc() 4692 uf = fotg210_read_frame_index(fotg210); scan_isoc() 4696 now_frame = (fotg210->next_frame - 1) & fmask; scan_isoc() 4699 fotg210->now_frame = now_frame; scan_isoc() 4701 frame = fotg210->next_frame; scan_isoc() 4705 ret = scan_frame_queue(fotg210, frame, scan_isoc() 4713 fotg210->next_frame = now_frame; scan_isoc() 4721 struct fotg210_hcd *fotg210; show_uframe_periodic_max() local 4724 fotg210 = hcd_to_fotg210(bus_to_hcd(dev_get_drvdata(dev))); show_uframe_periodic_max() 4725 n = scnprintf(buf, PAGE_SIZE, "%d\n", fotg210->uframe_periodic_max); show_uframe_periodic_max() 4733 struct fotg210_hcd *fotg210; store_uframe_periodic_max() local 4740 fotg210 = hcd_to_fotg210(bus_to_hcd(dev_get_drvdata(dev))); store_uframe_periodic_max() 4745 fotg210_info(fotg210, "rejecting invalid request for uframe_periodic_max=%u\n", store_uframe_periodic_max() 4756 spin_lock_irqsave(&fotg210->lock, flags); store_uframe_periodic_max() 4763 if (uframe_periodic_max < fotg210->uframe_periodic_max) { store_uframe_periodic_max() 4766 for (frame = 0; frame < fotg210->periodic_size; ++frame) store_uframe_periodic_max() 4769 periodic_usecs(fotg210, frame, store_uframe_periodic_max() 4773 fotg210_info(fotg210, store_uframe_periodic_max() 4782 fotg210_info(fotg210, store_uframe_periodic_max() 4787 fotg210_warn(fotg210, "max periodic bandwidth set is non-standard\n"); store_uframe_periodic_max() 4789 fotg210->uframe_periodic_max = uframe_periodic_max; store_uframe_periodic_max() 4793 spin_unlock_irqrestore(&fotg210->lock, flags); store_uframe_periodic_max() 4800 static inline int create_sysfs_files(struct fotg210_hcd *fotg210) create_sysfs_files() argument 4802 struct device *controller = fotg210_to_hcd(fotg210)->self.controller; create_sysfs_files() 4813 static inline void remove_sysfs_files(struct fotg210_hcd *fotg210) remove_sysfs_files() argument 4815 struct device *controller = fotg210_to_hcd(fotg210)->self.controller; remove_sysfs_files() 4823 static void fotg210_turn_off_all_ports(struct fotg210_hcd *fotg210) fotg210_turn_off_all_ports() argument 4825 u32 __iomem *status_reg = &fotg210->regs->port_status; fotg210_turn_off_all_ports() 4827 fotg210_writel(fotg210, PORT_RWC_BITS, status_reg); fotg210_turn_off_all_ports() 4833 static void fotg210_silence_controller(struct fotg210_hcd *fotg210) fotg210_silence_controller() argument 4835 fotg210_halt(fotg210); fotg210_silence_controller() 4837 spin_lock_irq(&fotg210->lock); fotg210_silence_controller() 4838 fotg210->rh_state = FOTG210_RH_HALTED; fotg210_silence_controller() 4839 fotg210_turn_off_all_ports(fotg210); fotg210_silence_controller() 4840 spin_unlock_irq(&fotg210->lock); fotg210_silence_controller() 4849 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_shutdown() local 4851 spin_lock_irq(&fotg210->lock); fotg210_shutdown() 4852 fotg210->shutdown = true; fotg210_shutdown() 4853 fotg210->rh_state = FOTG210_RH_STOPPING; fotg210_shutdown() 4854 fotg210->enabled_hrtimer_events = 0; fotg210_shutdown() 4855 spin_unlock_irq(&fotg210->lock); fotg210_shutdown() 4857 fotg210_silence_controller(fotg210); fotg210_shutdown() 4859 hrtimer_cancel(&fotg210->hrtimer); fotg210_shutdown() 4863 * it calls driver completion functions, after dropping fotg210->lock. 4865 static void fotg210_work(struct fotg210_hcd *fotg210) fotg210_work() argument 4867 /* another CPU may drop fotg210->lock during a schedule scan while fotg210_work() 4871 if (fotg210->scanning) { fotg210_work() 4872 fotg210->need_rescan = true; fotg210_work() 4875 fotg210->scanning = true; fotg210_work() 4878 fotg210->need_rescan = false; fotg210_work() 4879 if (fotg210->async_count) fotg210_work() 4880 scan_async(fotg210); fotg210_work() 4881 if (fotg210->intr_count > 0) fotg210_work() 4882 scan_intr(fotg210); fotg210_work() 4883 if (fotg210->isoc_count > 0) fotg210_work() 4884 scan_isoc(fotg210); fotg210_work() 4885 if (fotg210->need_rescan) fotg210_work() 4887 fotg210->scanning = false; fotg210_work() 4893 turn_on_io_watchdog(fotg210); fotg210_work() 4900 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_stop() local 4902 fotg210_dbg(fotg210, "stop\n"); fotg210_stop() 4906 spin_lock_irq(&fotg210->lock); fotg210_stop() 4907 fotg210->enabled_hrtimer_events = 0; fotg210_stop() 4908 spin_unlock_irq(&fotg210->lock); fotg210_stop() 4910 fotg210_quiesce(fotg210); fotg210_stop() 4911 fotg210_silence_controller(fotg210); fotg210_stop() 4912 fotg210_reset(fotg210); fotg210_stop() 4914 hrtimer_cancel(&fotg210->hrtimer); fotg210_stop() 4915 remove_sysfs_files(fotg210); fotg210_stop() 4916 remove_debug_files(fotg210); fotg210_stop() 4919 spin_lock_irq(&fotg210->lock); fotg210_stop() 4920 end_free_itds(fotg210); fotg210_stop() 4921 spin_unlock_irq(&fotg210->lock); fotg210_stop() 4922 fotg210_mem_cleanup(fotg210); fotg210_stop() 4925 fotg210_dbg(fotg210, "irq normal %ld err %ld iaa %ld (lost %ld)\n", fotg210_stop() 4926 fotg210->stats.normal, fotg210->stats.error, fotg210_stop() 4927 fotg210->stats.iaa, fotg210->stats.lost_iaa); fotg210_stop() 4928 fotg210_dbg(fotg210, "complete %ld unlink %ld\n", fotg210_stop() 4929 fotg210->stats.complete, fotg210->stats.unlink); fotg210_stop() 4932 dbg_status(fotg210, "fotg210_stop completed", fotg210_stop() 4933 fotg210_readl(fotg210, &fotg210->regs->status)); fotg210_stop() 4939 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); hcd_fotg210_init() local 4945 spin_lock_init(&fotg210->lock); hcd_fotg210_init() 4950 fotg210->need_io_watchdog = 1; hcd_fotg210_init() 4952 hrtimer_init(&fotg210->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); hcd_fotg210_init() 4953 fotg210->hrtimer.function = fotg210_hrtimer_func; hcd_fotg210_init() 4954 fotg210->next_hrtimer_event = FOTG210_HRTIMER_NO_EVENT; hcd_fotg210_init() 4956 hcc_params = fotg210_readl(fotg210, &fotg210->caps->hcc_params); hcd_fotg210_init() 4962 fotg210->uframe_periodic_max = 100; hcd_fotg210_init() 4968 fotg210->periodic_size = DEFAULT_I_TDPS; hcd_fotg210_init() 4969 INIT_LIST_HEAD(&fotg210->intr_qh_list); hcd_fotg210_init() 4970 INIT_LIST_HEAD(&fotg210->cached_itd_list); hcd_fotg210_init() 4976 fotg210->periodic_size = 1024; hcd_fotg210_init() 4979 fotg210->periodic_size = 512; hcd_fotg210_init() 4982 fotg210->periodic_size = 256; hcd_fotg210_init() 4988 retval = fotg210_mem_init(fotg210, GFP_KERNEL); hcd_fotg210_init() 4993 fotg210->i_thresh = 2; hcd_fotg210_init() 5002 fotg210->async->qh_next.qh = NULL; hcd_fotg210_init() 5003 hw = fotg210->async->hw; hcd_fotg210_init() 5004 hw->hw_next = QH_NEXT(fotg210, fotg210->async->qh_dma); hcd_fotg210_init() 5005 hw->hw_info1 = cpu_to_hc32(fotg210, QH_HEAD); hcd_fotg210_init() 5006 hw->hw_token = cpu_to_hc32(fotg210, QTD_STS_HALT); hcd_fotg210_init() 5007 hw->hw_qtd_next = FOTG210_LIST_END(fotg210); hcd_fotg210_init() 5008 fotg210->async->qh_state = QH_STATE_LINKED; hcd_fotg210_init() 5009 hw->hw_alt_next = QTD_NEXT(fotg210, fotg210->async->dummy->qtd_dma); hcd_fotg210_init() 5028 fotg210_dbg(fotg210, "park %d\n", park); hcd_fotg210_init() 5035 fotg210->command = temp; hcd_fotg210_init() 5046 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_run() local 5054 fotg210_writel(fotg210, fotg210->periodic_dma, fotg210_run() 5055 &fotg210->regs->frame_list); fotg210_run() 5056 fotg210_writel(fotg210, (u32)fotg210->async->qh_dma, fotg210_run() 5057 &fotg210->regs->async_next); fotg210_run() 5060 * hcc_params controls whether fotg210->regs->segment must (!!!) fotg210_run() 5071 hcc_params = fotg210_readl(fotg210, &fotg210->caps->hcc_params); fotg210_run() 5077 fotg210->command &= ~(CMD_IAAD|CMD_PSE|CMD_ASE|CMD_RESET); fotg210_run() 5078 fotg210->command |= CMD_RUN; fotg210_run() 5079 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command); fotg210_run() 5080 dbg_cmd(fotg210, "init", fotg210->command); fotg210_run() 5097 fotg210->rh_state = FOTG210_RH_RUNNING; fotg210_run() 5099 fotg210_readl(fotg210, &fotg210->regs->command); fotg210_run() 5102 fotg210->last_periodic_enable = ktime_get_real(); fotg210_run() 5104 temp = HC_VERSION(fotg210, fotg210_run() 5105 fotg210_readl(fotg210, &fotg210->caps->hc_capbase)); fotg210_run() 5106 fotg210_info(fotg210, fotg210_run() 5108 ((fotg210->sbrn & 0xf0) >> 4), (fotg210->sbrn & 0x0f), fotg210_run() 5111 fotg210_writel(fotg210, INTR_MASK, fotg210_run() 5112 &fotg210->regs->intr_enable); /* Turn On Interrupts */ fotg210_run() 5118 create_debug_files(fotg210); fotg210_run() 5119 create_sysfs_files(fotg210); fotg210_run() 5126 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_setup() local 5129 fotg210->regs = (void __iomem *)fotg210->caps + fotg210_setup() 5130 HC_LENGTH(fotg210, fotg210_setup() 5131 fotg210_readl(fotg210, &fotg210->caps->hc_capbase)); fotg210_setup() 5132 dbg_hcs_params(fotg210, "reset"); fotg210_setup() 5133 dbg_hcc_params(fotg210, "reset"); fotg210_setup() 5136 fotg210->hcs_params = fotg210_readl(fotg210, fotg210_setup() 5137 &fotg210->caps->hcs_params); fotg210_setup() 5139 fotg210->sbrn = HCD_USB2; fotg210_setup() 5146 retval = fotg210_halt(fotg210); fotg210_setup() 5150 fotg210_reset(fotg210); fotg210_setup() 5157 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_irq() local 5161 spin_lock(&fotg210->lock); fotg210_irq() 5163 status = fotg210_readl(fotg210, &fotg210->regs->status); fotg210_irq() 5167 fotg210_dbg(fotg210, "device removed\n"); fotg210_irq() 5179 unlikely(fotg210->rh_state == FOTG210_RH_HALTED)) { fotg210_irq() 5180 spin_unlock(&fotg210->lock); fotg210_irq() 5185 fotg210_writel(fotg210, masked_status, &fotg210->regs->status); fotg210_irq() 5186 cmd = fotg210_readl(fotg210, &fotg210->regs->command); fotg210_irq() 5190 dbg_status(fotg210, "irq", status); fotg210_irq() 5197 COUNT(fotg210->stats.normal); fotg210_irq() 5199 COUNT(fotg210->stats.error); fotg210_irq() 5207 fotg210->enabled_hrtimer_events &= fotg210_irq() 5217 if (fotg210->next_hrtimer_event == FOTG210_HRTIMER_IAA_WATCHDOG) fotg210_irq() 5218 ++fotg210->next_hrtimer_event; fotg210_irq() 5222 fotg210_dbg(fotg210, "IAA with IAAD still set?\n"); fotg210_irq() 5223 if (fotg210->async_iaa) { fotg210_irq() 5224 COUNT(fotg210->stats.iaa); fotg210_irq() 5225 end_unlink_async(fotg210); fotg210_irq() 5227 fotg210_dbg(fotg210, "IAA with nothing unlinked?\n"); fotg210_irq() 5233 u32 __iomem *status_reg = &fotg210->regs->port_status; fotg210_irq() 5239 if (fotg210->rh_state == FOTG210_RH_SUSPENDED) fotg210_irq() 5242 pstatus = fotg210_readl(fotg210, status_reg); fotg210_irq() 5244 if (test_bit(0, &fotg210->suspended_ports) && fotg210_irq() 5248 fotg210->reset_done[0] == 0) { fotg210_irq() 5255 fotg210->reset_done[0] = jiffies + msecs_to_jiffies(25); fotg210_irq() 5256 set_bit(0, &fotg210->resuming_ports); fotg210_irq() 5257 fotg210_dbg(fotg210, "port 1 remote wakeup\n"); fotg210_irq() 5258 mod_timer(&hcd->rh_timer, fotg210->reset_done[0]); fotg210_irq() 5264 fotg210_err(fotg210, "fatal error\n"); fotg210_irq() 5265 dbg_cmd(fotg210, "fatal", cmd); fotg210_irq() 5266 dbg_status(fotg210, "fatal", status); fotg210_irq() 5271 fotg210->shutdown = true; fotg210_irq() 5272 fotg210->rh_state = FOTG210_RH_STOPPING; fotg210_irq() 5273 fotg210->command &= ~(CMD_RUN | CMD_ASE | CMD_PSE); fotg210_irq() 5274 fotg210_writel(fotg210, fotg210->command, fotg210_irq() 5275 &fotg210->regs->command); fotg210_irq() 5276 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable); fotg210_irq() 5277 fotg210_handle_controller_death(fotg210); fotg210_irq() 5284 fotg210_work(fotg210); fotg210_irq() 5285 spin_unlock(&fotg210->lock); fotg210_irq() 5305 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_urb_enqueue() local 5320 if (!qh_urb_transaction(fotg210, urb, &qtd_list, mem_flags)) fotg210_urb_enqueue() 5322 return submit_async(fotg210, urb, &qtd_list, mem_flags); fotg210_urb_enqueue() 5325 if (!qh_urb_transaction(fotg210, urb, &qtd_list, mem_flags)) fotg210_urb_enqueue() 5327 return intr_submit(fotg210, urb, &qtd_list, mem_flags); fotg210_urb_enqueue() 5330 return itd_submit(fotg210, urb, mem_flags); fotg210_urb_enqueue() 5340 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_urb_dequeue() local 5345 spin_lock_irqsave(&fotg210->lock, flags); fotg210_urb_dequeue() 5360 start_unlink_async(fotg210, qh); fotg210_urb_dequeue() 5368 qh_completions(fotg210, qh); fotg210_urb_dequeue() 5380 start_unlink_intr(fotg210, qh); fotg210_urb_dequeue() 5383 qh_completions(fotg210, qh); fotg210_urb_dequeue() 5386 fotg210_dbg(fotg210, "bogus qh %p state %d\n", fotg210_urb_dequeue() 5400 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_urb_dequeue() 5409 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_endpoint_disable() local 5417 spin_lock_irqsave(&fotg210->lock, flags); fotg210_endpoint_disable() 5436 if (fotg210->rh_state < FOTG210_RH_RUNNING) fotg210_endpoint_disable() 5441 for (tmp = fotg210->async->qh_next.qh; fotg210_endpoint_disable() 5449 start_unlink_async(fotg210, qh); fotg210_endpoint_disable() 5454 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_endpoint_disable() 5461 qh_destroy(fotg210, qh); fotg210_endpoint_disable() 5469 fotg210_err(fotg210, "qh %p (#%02x) state %d%s\n", fotg210_endpoint_disable() 5476 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_endpoint_disable() 5482 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_endpoint_reset() local 5492 spin_lock_irqsave(&fotg210->lock, flags); fotg210_endpoint_reset() 5512 start_unlink_async(fotg210, qh); fotg210_endpoint_reset() 5514 start_unlink_intr(fotg210, qh); fotg210_endpoint_reset() 5517 spin_unlock_irqrestore(&fotg210->lock, flags); fotg210_endpoint_reset() 5522 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd); fotg210_get_frame() local 5524 return (fotg210_read_frame_index(fotg210) >> 3) % fotg210_get_frame() 5525 fotg210->periodic_size; fotg210_get_frame() 5531 * give the fotg210 driver exclusive access to those. 5583 static void fotg210_init(struct fotg210_hcd *fotg210) fotg210_init() argument 5588 &fotg210->regs->gmir); fotg210_init() 5590 value = ioread32(&fotg210->regs->otgcsr); fotg210_init() 5593 iowrite32(value, &fotg210->regs->otgcsr); fotg210_init() 5610 struct fotg210_hcd *fotg210; fotg210_hcd_probe() local 5646 fotg210 = hcd_to_fotg210(hcd); fotg210_hcd_probe() 5648 fotg210->caps = hcd->regs; fotg210_hcd_probe() 5654 fotg210_init(fotg210); fotg210_hcd_probe() 5693 .name = "fotg210-hcd", 5717 fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root); fotg210_hcd_init() 4104 itd_urb_transaction(struct fotg210_iso_stream *stream, struct fotg210_hcd *fotg210, struct urb *urb, gfp_t mem_flags) itd_urb_transaction() argument
|