diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/rtc.c | 7 | ||||
-rw-r--r-- | drivers/pci/pci.c | 59 | ||||
-rw-r--r-- | drivers/pci/setup-res.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 15 | ||||
-rw-r--r-- | drivers/usb/host/ehci-dbg.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ehci-q.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ehci-sched.c | 13 | ||||
-rw-r--r-- | drivers/usb/host/ehci.h | 5 | ||||
-rw-r--r-- | drivers/usb/host/isp116x-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/mon/Kconfig | 9 | ||||
-rw-r--r-- | drivers/usb/mon/Makefile | 1 |
11 files changed, 91 insertions, 31 deletions
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index d8f9e94ae475..cd4fe8b1709f 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
@@ -1209,6 +1209,7 @@ static int rtc_proc_open(struct inode *inode, struct file *file) | |||
1209 | 1209 | ||
1210 | void rtc_get_rtc_time(struct rtc_time *rtc_tm) | 1210 | void rtc_get_rtc_time(struct rtc_time *rtc_tm) |
1211 | { | 1211 | { |
1212 | unsigned long uip_watchdog = jiffies; | ||
1212 | unsigned char ctrl; | 1213 | unsigned char ctrl; |
1213 | #ifdef CONFIG_MACH_DECSTATION | 1214 | #ifdef CONFIG_MACH_DECSTATION |
1214 | unsigned int real_year; | 1215 | unsigned int real_year; |
@@ -1224,8 +1225,10 @@ void rtc_get_rtc_time(struct rtc_time *rtc_tm) | |||
1224 | * Once the read clears, read the RTC time (again via ioctl). Easy. | 1225 | * Once the read clears, read the RTC time (again via ioctl). Easy. |
1225 | */ | 1226 | */ |
1226 | 1227 | ||
1227 | if (rtc_is_updating() != 0) | 1228 | while (rtc_is_updating() != 0 && jiffies - uip_watchdog < 2*HZ/100) { |
1228 | msleep(20); | 1229 | barrier(); |
1230 | cpu_relax(); | ||
1231 | } | ||
1229 | 1232 | ||
1230 | /* | 1233 | /* |
1231 | * Only the values that we read from the RTC are set. We leave | 1234 | * Only the values that we read from the RTC are set. We leave |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 1b34fc56067e..65ea7d25f691 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -222,6 +222,37 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) | |||
222 | } | 222 | } |
223 | 223 | ||
224 | /** | 224 | /** |
225 | * pci_restore_bars - restore a devices BAR values (e.g. after wake-up) | ||
226 | * @dev: PCI device to have its BARs restored | ||
227 | * | ||
228 | * Restore the BAR values for a given device, so as to make it | ||
229 | * accessible by its driver. | ||
230 | */ | ||
231 | void | ||
232 | pci_restore_bars(struct pci_dev *dev) | ||
233 | { | ||
234 | int i, numres; | ||
235 | |||
236 | switch (dev->hdr_type) { | ||
237 | case PCI_HEADER_TYPE_NORMAL: | ||
238 | numres = 6; | ||
239 | break; | ||
240 | case PCI_HEADER_TYPE_BRIDGE: | ||
241 | numres = 2; | ||
242 | break; | ||
243 | case PCI_HEADER_TYPE_CARDBUS: | ||
244 | numres = 1; | ||
245 | break; | ||
246 | default: | ||
247 | /* Should never get here, but just in case... */ | ||
248 | return; | ||
249 | } | ||
250 | |||
251 | for (i = 0; i < numres; i ++) | ||
252 | pci_update_resource(dev, &dev->resource[i], i); | ||
253 | } | ||
254 | |||
255 | /** | ||
225 | * pci_set_power_state - Set the power state of a PCI device | 256 | * pci_set_power_state - Set the power state of a PCI device |
226 | * @dev: PCI device to be suspended | 257 | * @dev: PCI device to be suspended |
227 | * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering | 258 | * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering |
@@ -239,7 +270,7 @@ int (*platform_pci_set_power_state)(struct pci_dev *dev, pci_power_t t); | |||
239 | int | 270 | int |
240 | pci_set_power_state(struct pci_dev *dev, pci_power_t state) | 271 | pci_set_power_state(struct pci_dev *dev, pci_power_t state) |
241 | { | 272 | { |
242 | int pm; | 273 | int pm, need_restore = 0; |
243 | u16 pmcsr, pmc; | 274 | u16 pmcsr, pmc; |
244 | 275 | ||
245 | /* bound the state we're entering */ | 276 | /* bound the state we're entering */ |
@@ -278,14 +309,17 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
278 | return -EIO; | 309 | return -EIO; |
279 | } | 310 | } |
280 | 311 | ||
312 | pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); | ||
313 | |||
281 | /* If we're in D3, force entire word to 0. | 314 | /* If we're in D3, force entire word to 0. |
282 | * This doesn't affect PME_Status, disables PME_En, and | 315 | * This doesn't affect PME_Status, disables PME_En, and |
283 | * sets PowerState to 0. | 316 | * sets PowerState to 0. |
284 | */ | 317 | */ |
285 | if (dev->current_state >= PCI_D3hot) | 318 | if (dev->current_state >= PCI_D3hot) { |
319 | if (!(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET)) | ||
320 | need_restore = 1; | ||
286 | pmcsr = 0; | 321 | pmcsr = 0; |
287 | else { | 322 | } else { |
288 | pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); | ||
289 | pmcsr &= ~PCI_PM_CTRL_STATE_MASK; | 323 | pmcsr &= ~PCI_PM_CTRL_STATE_MASK; |
290 | pmcsr |= state; | 324 | pmcsr |= state; |
291 | } | 325 | } |
@@ -308,6 +342,22 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
308 | platform_pci_set_power_state(dev, state); | 342 | platform_pci_set_power_state(dev, state); |
309 | 343 | ||
310 | dev->current_state = state; | 344 | dev->current_state = state; |
345 | |||
346 | /* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT | ||
347 | * INTERFACE SPECIFICATION, REV. 1.2", a device transitioning | ||
348 | * from D3hot to D0 _may_ perform an internal reset, thereby | ||
349 | * going to "D0 Uninitialized" rather than "D0 Initialized". | ||
350 | * For example, at least some versions of the 3c905B and the | ||
351 | * 3c556B exhibit this behaviour. | ||
352 | * | ||
353 | * At least some laptop BIOSen (e.g. the Thinkpad T21) leave | ||
354 | * devices in a D3hot state at boot. Consequently, we need to | ||
355 | * restore at least the BARs so that the device will be | ||
356 | * accessible to its driver. | ||
357 | */ | ||
358 | if (need_restore) | ||
359 | pci_restore_bars(dev); | ||
360 | |||
311 | return 0; | 361 | return 0; |
312 | } | 362 | } |
313 | 363 | ||
@@ -805,6 +855,7 @@ struct pci_dev *isa_bridge; | |||
805 | EXPORT_SYMBOL(isa_bridge); | 855 | EXPORT_SYMBOL(isa_bridge); |
806 | #endif | 856 | #endif |
807 | 857 | ||
858 | EXPORT_SYMBOL_GPL(pci_restore_bars); | ||
808 | EXPORT_SYMBOL(pci_enable_device_bars); | 859 | EXPORT_SYMBOL(pci_enable_device_bars); |
809 | EXPORT_SYMBOL(pci_enable_device); | 860 | EXPORT_SYMBOL(pci_enable_device); |
810 | EXPORT_SYMBOL(pci_disable_device); | 861 | EXPORT_SYMBOL(pci_disable_device); |
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 1ca21d2ba11c..878fd0a65c02 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include "pci.h" | 26 | #include "pci.h" |
27 | 27 | ||
28 | 28 | ||
29 | static void | 29 | void |
30 | pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) | 30 | pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) |
31 | { | 31 | { |
32 | struct pci_bus_region region; | 32 | struct pci_bus_region region; |
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index 91e7457d5b04..62fd705203fb 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -605,9 +605,8 @@ static int yenta_search_res(struct yenta_socket *socket, struct resource *res, | |||
605 | 605 | ||
606 | static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type, int addr_start, int addr_end) | 606 | static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned type, int addr_start, int addr_end) |
607 | { | 607 | { |
608 | struct pci_bus *bus; | ||
609 | struct resource *root, *res; | 608 | struct resource *root, *res; |
610 | u32 start, end; | 609 | struct pci_bus_region region; |
611 | unsigned mask; | 610 | unsigned mask; |
612 | 611 | ||
613 | res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; | 612 | res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; |
@@ -620,15 +619,13 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ | |||
620 | if (type & IORESOURCE_IO) | 619 | if (type & IORESOURCE_IO) |
621 | mask = ~3; | 620 | mask = ~3; |
622 | 621 | ||
623 | bus = socket->dev->subordinate; | 622 | res->name = socket->dev->subordinate->name; |
624 | res->name = bus->name; | ||
625 | res->flags = type; | 623 | res->flags = type; |
626 | 624 | ||
627 | start = config_readl(socket, addr_start) & mask; | 625 | region.start = config_readl(socket, addr_start) & mask; |
628 | end = config_readl(socket, addr_end) | ~mask; | 626 | region.end = config_readl(socket, addr_end) | ~mask; |
629 | if (start && end > start && !override_bios) { | 627 | if (region.start && region.end > region.start && !override_bios) { |
630 | res->start = start; | 628 | pcibios_bus_to_resource(socket->dev, res, ®ion); |
631 | res->end = end; | ||
632 | root = pci_find_parent_resource(socket->dev, res); | 629 | root = pci_find_parent_resource(socket->dev, res); |
633 | if (root && (request_resource(root, res) == 0)) | 630 | if (root && (request_resource(root, res) == 0)) |
634 | return; | 631 | return; |
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 50cb01831075..b01efb6b36f6 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -527,7 +527,7 @@ show_periodic (struct class_device *class_dev, char *buf) | |||
527 | p.qh->period, | 527 | p.qh->period, |
528 | le32_to_cpup (&p.qh->hw_info2) | 528 | le32_to_cpup (&p.qh->hw_info2) |
529 | /* uframe masks */ | 529 | /* uframe masks */ |
530 | & 0xffff, | 530 | & (QH_CMASK | QH_SMASK), |
531 | p.qh); | 531 | p.qh); |
532 | size -= temp; | 532 | size -= temp; |
533 | next += temp; | 533 | next += temp; |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 4f97a4ad1ed3..20df01a79b2e 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -222,7 +222,7 @@ __acquires(ehci->lock) | |||
222 | struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; | 222 | struct ehci_qh *qh = (struct ehci_qh *) urb->hcpriv; |
223 | 223 | ||
224 | /* S-mask in a QH means it's an interrupt urb */ | 224 | /* S-mask in a QH means it's an interrupt urb */ |
225 | if ((qh->hw_info2 & __constant_cpu_to_le32 (0x00ff)) != 0) { | 225 | if ((qh->hw_info2 & __constant_cpu_to_le32 (QH_SMASK)) != 0) { |
226 | 226 | ||
227 | /* ... update hc-wide periodic stats (for usbfs) */ | 227 | /* ... update hc-wide periodic stats (for usbfs) */ |
228 | ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; | 228 | ehci_to_hcd(ehci)->self.bandwidth_int_reqs--; |
@@ -428,7 +428,8 @@ halt: | |||
428 | /* should be rare for periodic transfers, | 428 | /* should be rare for periodic transfers, |
429 | * except maybe high bandwidth ... | 429 | * except maybe high bandwidth ... |
430 | */ | 430 | */ |
431 | if (qh->period) { | 431 | if ((__constant_cpu_to_le32 (QH_SMASK) |
432 | & qh->hw_info2) != 0) { | ||
432 | intr_deschedule (ehci, qh); | 433 | intr_deschedule (ehci, qh); |
433 | (void) qh_schedule (ehci, qh); | 434 | (void) qh_schedule (ehci, qh); |
434 | } else | 435 | } else |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 9af4f64532a9..b56f25864ed6 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -301,7 +301,7 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
301 | 301 | ||
302 | dev_dbg (&qh->dev->dev, | 302 | dev_dbg (&qh->dev->dev, |
303 | "link qh%d-%04x/%p start %d [%d/%d us]\n", | 303 | "link qh%d-%04x/%p start %d [%d/%d us]\n", |
304 | period, le32_to_cpup (&qh->hw_info2) & 0xffff, | 304 | period, le32_to_cpup (&qh->hw_info2) & (QH_CMASK | QH_SMASK), |
305 | qh, qh->start, qh->usecs, qh->c_usecs); | 305 | qh, qh->start, qh->usecs, qh->c_usecs); |
306 | 306 | ||
307 | /* high bandwidth, or otherwise every microframe */ | 307 | /* high bandwidth, or otherwise every microframe */ |
@@ -385,7 +385,8 @@ static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
385 | 385 | ||
386 | dev_dbg (&qh->dev->dev, | 386 | dev_dbg (&qh->dev->dev, |
387 | "unlink qh%d-%04x/%p start %d [%d/%d us]\n", | 387 | "unlink qh%d-%04x/%p start %d [%d/%d us]\n", |
388 | qh->period, le32_to_cpup (&qh->hw_info2) & 0xffff, | 388 | qh->period, |
389 | le32_to_cpup (&qh->hw_info2) & (QH_CMASK | QH_SMASK), | ||
389 | qh, qh->start, qh->usecs, qh->c_usecs); | 390 | qh, qh->start, qh->usecs, qh->c_usecs); |
390 | 391 | ||
391 | /* qh->qh_next still "live" to HC */ | 392 | /* qh->qh_next still "live" to HC */ |
@@ -411,7 +412,7 @@ static void intr_deschedule (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
411 | * active high speed queues may need bigger delays... | 412 | * active high speed queues may need bigger delays... |
412 | */ | 413 | */ |
413 | if (list_empty (&qh->qtd_list) | 414 | if (list_empty (&qh->qtd_list) |
414 | || (__constant_cpu_to_le32 (0x0ff << 8) | 415 | || (__constant_cpu_to_le32 (QH_CMASK) |
415 | & qh->hw_info2) != 0) | 416 | & qh->hw_info2) != 0) |
416 | wait = 2; | 417 | wait = 2; |
417 | else | 418 | else |
@@ -533,7 +534,7 @@ static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
533 | 534 | ||
534 | /* reuse the previous schedule slots, if we can */ | 535 | /* reuse the previous schedule slots, if we can */ |
535 | if (frame < qh->period) { | 536 | if (frame < qh->period) { |
536 | uframe = ffs (le32_to_cpup (&qh->hw_info2) & 0x00ff); | 537 | uframe = ffs (le32_to_cpup (&qh->hw_info2) & QH_SMASK); |
537 | status = check_intr_schedule (ehci, frame, --uframe, | 538 | status = check_intr_schedule (ehci, frame, --uframe, |
538 | qh, &c_mask); | 539 | qh, &c_mask); |
539 | } else { | 540 | } else { |
@@ -569,10 +570,10 @@ static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
569 | qh->start = frame; | 570 | qh->start = frame; |
570 | 571 | ||
571 | /* reset S-frame and (maybe) C-frame masks */ | 572 | /* reset S-frame and (maybe) C-frame masks */ |
572 | qh->hw_info2 &= __constant_cpu_to_le32 (~0xffff); | 573 | qh->hw_info2 &= __constant_cpu_to_le32(~(QH_CMASK | QH_SMASK)); |
573 | qh->hw_info2 |= qh->period | 574 | qh->hw_info2 |= qh->period |
574 | ? cpu_to_le32 (1 << uframe) | 575 | ? cpu_to_le32 (1 << uframe) |
575 | : __constant_cpu_to_le32 (0xff); | 576 | : __constant_cpu_to_le32 (QH_SMASK); |
576 | qh->hw_info2 |= c_mask; | 577 | qh->hw_info2 |= c_mask; |
577 | } else | 578 | } else |
578 | ehci_dbg (ehci, "reused qh %p schedule\n", qh); | 579 | ehci_dbg (ehci, "reused qh %p schedule\n", qh); |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 4df498231752..a7542157534c 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -385,6 +385,11 @@ struct ehci_qh { | |||
385 | __le32 hw_info1; /* see EHCI 3.6.2 */ | 385 | __le32 hw_info1; /* see EHCI 3.6.2 */ |
386 | #define QH_HEAD 0x00008000 | 386 | #define QH_HEAD 0x00008000 |
387 | __le32 hw_info2; /* see EHCI 3.6.2 */ | 387 | __le32 hw_info2; /* see EHCI 3.6.2 */ |
388 | #define QH_SMASK 0x000000ff | ||
389 | #define QH_CMASK 0x0000ff00 | ||
390 | #define QH_HUBADDR 0x007f0000 | ||
391 | #define QH_HUBPORT 0x3f800000 | ||
392 | #define QH_MULT 0xc0000000 | ||
388 | __le32 hw_current; /* qtd list - see EHCI 3.6.4 */ | 393 | __le32 hw_current; /* qtd list - see EHCI 3.6.4 */ |
389 | 394 | ||
390 | /* qtd overlay (hardware parts of a struct ehci_qtd) */ | 395 | /* qtd overlay (hardware parts of a struct ehci_qtd) */ |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 50b1970fe6b6..76cb496c5836 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -229,9 +229,11 @@ static void preproc_atl_queue(struct isp116x *isp116x) | |||
229 | struct isp116x_ep *ep; | 229 | struct isp116x_ep *ep; |
230 | struct urb *urb; | 230 | struct urb *urb; |
231 | struct ptd *ptd; | 231 | struct ptd *ptd; |
232 | u16 toggle = 0, dir = PTD_DIR_SETUP, len; | 232 | u16 len; |
233 | 233 | ||
234 | for (ep = isp116x->atl_active; ep; ep = ep->active) { | 234 | for (ep = isp116x->atl_active; ep; ep = ep->active) { |
235 | u16 toggle = 0, dir = PTD_DIR_SETUP; | ||
236 | |||
235 | BUG_ON(list_empty(&ep->hep->urb_list)); | 237 | BUG_ON(list_empty(&ep->hep->urb_list)); |
236 | urb = container_of(ep->hep->urb_list.next, | 238 | urb = container_of(ep->hep->urb_list.next, |
237 | struct urb, urb_list); | 239 | struct urb, urb_list); |
diff --git a/drivers/usb/mon/Kconfig b/drivers/usb/mon/Kconfig index 777642e26b9a..deb9ddffa402 100644 --- a/drivers/usb/mon/Kconfig +++ b/drivers/usb/mon/Kconfig | |||
@@ -9,9 +9,8 @@ config USB_MON | |||
9 | help | 9 | help |
10 | If you say Y here, a component which captures the USB traffic | 10 | If you say Y here, a component which captures the USB traffic |
11 | between peripheral-specific drivers and HC drivers will be built. | 11 | between peripheral-specific drivers and HC drivers will be built. |
12 | The USB_MON is similar in spirit and may be compatible with Dave | 12 | For more information, see <file:Documentation/usb/usbmon.txt>. |
13 | Harding's USBMon. | ||
14 | 13 | ||
15 | This is somewhat experimental at this time, but it should be safe, | 14 | This is somewhat experimental at this time, but it should be safe. |
16 | as long as you aren't using modular USB and try to remove this | 15 | |
17 | module. | 16 | If unsure, say Y. |
diff --git a/drivers/usb/mon/Makefile b/drivers/usb/mon/Makefile index f18d10ce91f9..b0015b8a1d1f 100644 --- a/drivers/usb/mon/Makefile +++ b/drivers/usb/mon/Makefile | |||
@@ -4,4 +4,5 @@ | |||
4 | 4 | ||
5 | usbmon-objs := mon_main.o mon_stat.o mon_text.o | 5 | usbmon-objs := mon_main.o mon_stat.o mon_text.o |
6 | 6 | ||
7 | # This does not use CONFIG_USB_MON because we want this to use a tristate. | ||
7 | obj-$(CONFIG_USB) += usbmon.o | 8 | obj-$(CONFIG_USB) += usbmon.o |