# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.431 -> 1.432
# drivers/usb/hcd/ehci-mem.c 1.1 -> 1.2
# drivers/usb/hcd/ehci-hcd.c 1.2 -> 1.3
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/18 [EMAIL PROTECTED] 1.432
# [PATCH] EHCI and Intel/VIA/Philips/...
#
# USB ehci driver
#
# This patch is a partial sync of the 2.4 EHCI with the 2.5 code,
# primarily to make sure that several non-NEC implementations
# will work without additional patches. It also includes a faster
# IRQ codepath, and various minor cleanups.
#
# Please merge to Marcelo's tree ... the VIA implemtation is
# already showing up in motherboard reviews, and Intel's is
# also scheduled to become more common while 2.4.19 is
# still the latest stable kernel (modulo brownbags :).
# --------------------------------------------
#
diff -Nru a/drivers/usb/hcd/ehci-hcd.c b/drivers/usb/hcd/ehci-hcd.c
--- a/drivers/usb/hcd/ehci-hcd.c Thu Apr 18 13:53:46 2002
+++ b/drivers/usb/hcd/ehci-hcd.c Thu Apr 18 13:53:46 2002
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000-2001 by David Brownell
+ * Copyright (c) 2000-2002 by David Brownell
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -31,10 +31,6 @@
#include <linux/list.h>
#include <linux/interrupt.h>
-#ifndef CONFIG_USB_DEBUG
- #define CONFIG_USB_DEBUG /* this is still experimental! */
-#endif
-
#ifdef CONFIG_USB_DEBUG
#define DEBUG
#else
@@ -44,6 +40,7 @@
#include <linux/usb.h>
#include "../hcd.h"
+#include <asm/byteorder.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>
@@ -72,13 +69,16 @@
* ...
*
* HISTORY:
+ *
* 2002-01-14 Minor cleanup; version synch.
* 2002-01-08 Fix roothub handoff of FS/LS to companion controllers.
* 2002-01-04 Control/Bulk queuing behaves.
+ *
* 2001-12-12 Initial patch version for Linux 2.5.1 kernel.
+ * 2001-June Works with usb-storage and NEC EHCI on 2.4
*/
-#define DRIVER_VERSION "$Revision: 1.1 $"
+#define DRIVER_VERSION "$Revision: 0.24+ $"
#define DRIVER_AUTHOR "David Brownell"
#define DRIVER_DESC "USB 2.0 'Enhanced' Host Controller (EHCI) Driver"
@@ -86,12 +86,6 @@
// #define EHCI_VERBOSE_DEBUG
// #define have_iso
-#ifdef CONFIG_DEBUG_SLAB
-# define EHCI_SLAB_FLAGS (SLAB_POISON)
-#else
-# define EHCI_SLAB_FLAGS 0
-#endif
-
/* magic numbers that can affect system performance */
#define EHCI_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
#define EHCI_TUNE_RL_HS 0 /* nak throttle; see 4.9 */
@@ -191,7 +185,7 @@
* periodic_size can shrink by USBCMD update if hcc_params allows.
*/
ehci->periodic_size = DEFAULT_I_TDPS;
- if ((retval = ehci_mem_init (ehci, EHCI_SLAB_FLAGS | SLAB_KERNEL)) < 0)
+ if ((retval = ehci_mem_init (ehci, SLAB_KERNEL)) < 0)
return retval;
hcc_params = readl (&ehci->caps->hcc_params);
@@ -215,16 +209,17 @@
/*
* hcc_params controls whether ehci->regs->segment must (!!!)
* be used; it constrains QH/ITD/SITD and QTD locations.
- * By default, pci_alloc_consistent() won't hand out addresses
- * above 4GB (via pdev->dma_mask) so we know this value.
- *
- * NOTE: that pdev->dma_mask setting means that all DMA mappings
- * for I/O buffers will have the same restriction, though it's
- * neither necessary nor desirable in that case.
+ * pci_pool consistent memory always uses segment zero.
*/
if (HCC_64BIT_ADDR (hcc_params)) {
writel (0, &ehci->regs->segment);
- info ("using segment 0 for 64bit DMA addresses ...");
+ /*
+ * FIXME Enlarge pci_set_dma_mask() when possible. The DMA
+ * mapping API spec now says that'll affect only single shot
+ * mappings, and the pci_pool data will stay safe in seg 0.
+ * That's what we want: no extra copies for USB transfers.
+ */
+ info ("restricting 64bit DMA mappings to segment 0 ...");
}
/* clear interrupt enables, set irq latency */
@@ -234,6 +229,9 @@
temp |= 1 << (16 + log2_irq_thresh);
// keeping default periodic framelist size
temp &= ~(CMD_IAAD | CMD_ASE | CMD_PSE),
+ // Philips, Intel, and maybe others need CMD_RUN before the
+ // root hub will detect new devices (why?); NEC doesn't
+ temp |= CMD_RUN;
writel (temp, &ehci->regs->command);
dbg_cmd (ehci, "init", temp);
@@ -260,7 +258,7 @@
readl (&ehci->regs->command); /* unblock posted write */
/* PCI Serial Bus Release Number is at 0x60 offset */
- pci_read_config_byte(hcd->pdev, 0x60, &tempbyte);
+ pci_read_config_byte (hcd->pdev, 0x60, &tempbyte);
temp = readw (&ehci->caps->hci_version);
info ("USB %x.%x support enabled, EHCI rev %x.%2x",
((tempbyte & 0xf0)>>4),
@@ -391,6 +389,8 @@
// restore pci FLADJ value
// khubd and drivers will set HC running, if needed;
hcd->state = USB_STATE_READY;
+ // FIXME Philips/Intel/... etc don't really have a "READY"
+ // state ... turn on CMD_RUN too
for (i = 0; i < ports; i++) {
int temp = readl (&ehci->regs->port_status [i]);
@@ -439,20 +439,20 @@
{
struct ehci_hcd *ehci = hcd_to_ehci (hcd);
u32 status = readl (&ehci->regs->status);
- int bh = 0;
+ int bh;
- /* clear (just) interrupts */
status &= INTR_MASK;
+ if (!status) /* irq sharing? */
+ return;
+
+ /* clear (just) interrupts */
writel (status, &ehci->regs->status);
readl (&ehci->regs->command); /* unblock posted write */
-
- if (unlikely (hcd->state == USB_STATE_HALT)) /* irq sharing? */
- return;
+ bh = 0;
#ifdef EHCI_VERBOSE_DEBUG
/* unrequested/ignored: Port Change Detect, Frame List Rollover */
- if (status & INTR_MASK)
- dbg_status (ehci, "irq", status);
+ dbg_status (ehci, "irq", status);
#endif
/* INT, ERR, and IAA interrupt rates can be throttled */
@@ -746,9 +746,9 @@
static int __init init (void)
{
dbg (DRIVER_INFO);
- dbg ("block sizes: qh %d qtd %d itd %d sitd %d",
- (int) sizeof (struct ehci_qh), (int) sizeof (struct ehci_qtd),
- (int) sizeof (struct ehci_itd), (int) sizeof (struct ehci_sitd));
+ dbg ("block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd",
+ sizeof (struct ehci_qh), sizeof (struct ehci_qtd),
+ sizeof (struct ehci_itd), sizeof (struct ehci_sitd));
return pci_module_init (&ehci_pci_driver);
}
diff -Nru a/drivers/usb/hcd/ehci-mem.c b/drivers/usb/hcd/ehci-mem.c
--- a/drivers/usb/hcd/ehci-mem.c Thu Apr 18 13:53:46 2002
+++ b/drivers/usb/hcd/ehci-mem.c Thu Apr 18 13:53:46 2002
@@ -224,8 +224,7 @@
ehci->periodic [i] = EHCI_LIST_END;
/* software shadow of hardware table */
- ehci->pshadow = kmalloc (ehci->periodic_size * sizeof (void *),
- flags & ~EHCI_SLAB_FLAGS);
+ ehci->pshadow = kmalloc (ehci->periodic_size * sizeof (void *), flags);
if (ehci->pshadow == 0) {
dbg ("no shadow periodic table");
ehci_mem_cleanup (ehci);
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel