uhci-hcd.c (9faa091a409851ac6b3812164d53644074bc89b1) uhci-hcd.c (d3219d1c4c9ab7cd959f8f294420faf5f936cf55)
1/*
2 * Universal Host Controller Interface driver for USB.
3 *
4 * Maintainer: Alan Stern <stern@rowland.harvard.edu>
5 *
6 * (C) Copyright 1999 Linus Torvalds
7 * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com
8 * (C) Copyright 1999 Randy Dunlap

--- 153 unchanged lines hidden (view full) ---

162 * can we be sure of its previous state.
163 */
164static void check_and_reset_hc(struct uhci_hcd *uhci)
165{
166 if (uhci->check_and_reset_hc(uhci))
167 finish_reset(uhci);
168}
169
1/*
2 * Universal Host Controller Interface driver for USB.
3 *
4 * Maintainer: Alan Stern <stern@rowland.harvard.edu>
5 *
6 * (C) Copyright 1999 Linus Torvalds
7 * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com
8 * (C) Copyright 1999 Randy Dunlap

--- 153 unchanged lines hidden (view full) ---

162 * can we be sure of its previous state.
163 */
164static void check_and_reset_hc(struct uhci_hcd *uhci)
165{
166 if (uhci->check_and_reset_hc(uhci))
167 finish_reset(uhci);
168}
169
170#if defined(CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC)
170/*
171/*
172 * The two functions below are generic reset functions that are used on systems
173 * that do not have keyboard and mouse legacy support. We assume that we are
174 * running on such a system if CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC is defined.
175 */
176
177/*
178 * Make sure the controller is completely inactive, unable to
179 * generate interrupts or do DMA.
180 */
181static void uhci_generic_reset_hc(struct uhci_hcd *uhci)
182{
183 /* Reset the HC - this will force us to get a
184 * new notification of any already connected
185 * ports due to the virtual disconnect that it
186 * implies.
187 */
188 uhci_writew(uhci, USBCMD_HCRESET, USBCMD);
189 mb();
190 udelay(5);
191 if (uhci_readw(uhci, USBCMD) & USBCMD_HCRESET)
192 dev_warn(uhci_dev(uhci), "HCRESET not completed yet!\n");
193
194 /* Just to be safe, disable interrupt requests and
195 * make sure the controller is stopped.
196 */
197 uhci_writew(uhci, 0, USBINTR);
198 uhci_writew(uhci, 0, USBCMD);
199}
200
201/*
202 * Initialize a controller that was newly discovered or has just been
203 * resumed. In either case we can't be sure of its previous state.
204 *
205 * Returns: 1 if the controller was reset, 0 otherwise.
206 */
207static int uhci_generic_check_and_reset_hc(struct uhci_hcd *uhci)
208{
209 unsigned int cmd, intr;
210
211 /*
212 * When restarting a suspended controller, we expect all the
213 * settings to be the same as we left them:
214 *
215 * Controller is stopped and configured with EGSM set;
216 * No interrupts enabled except possibly Resume Detect.
217 *
218 * If any of these conditions are violated we do a complete reset.
219 */
220
221 cmd = uhci_readw(uhci, USBCMD);
222 if ((cmd & USBCMD_RS) || !(cmd & USBCMD_CF) || !(cmd & USBCMD_EGSM)) {
223 dev_dbg(uhci_dev(uhci), "%s: cmd = 0x%04x\n",
224 __func__, cmd);
225 goto reset_needed;
226 }
227
228 intr = uhci_readw(uhci, USBINTR);
229 if (intr & (~USBINTR_RESUME)) {
230 dev_dbg(uhci_dev(uhci), "%s: intr = 0x%04x\n",
231 __func__, intr);
232 goto reset_needed;
233 }
234 return 0;
235
236reset_needed:
237 dev_dbg(uhci_dev(uhci), "Performing full reset\n");
238 uhci_generic_reset_hc(uhci);
239 return 1;
240}
241#endif /* CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC */
242
243/*
171 * Store the basic register settings needed by the controller.
172 */
173static void configure_hc(struct uhci_hcd *uhci)
174{
175 /* Set the frame length to the default: 1 ms exactly */
176 uhci_writeb(uhci, USBSOF_DEFAULT, USBSOF);
177
178 /* Store the frame list base address */

--- 645 unchanged lines hidden ---
244 * Store the basic register settings needed by the controller.
245 */
246static void configure_hc(struct uhci_hcd *uhci)
247{
248 /* Set the frame length to the default: 1 ms exactly */
249 uhci_writeb(uhci, USBSOF_DEFAULT, USBSOF);
250
251 /* Store the frame list base address */

--- 645 unchanged lines hidden ---