PCI, USB and hwmon patches for 2.6.15-rc2-git
Subsystems (11)
cover PCI, USB and hwmon patches for 2.6.15-rc2-git
Here are a few PCI, USB, hwmon, and documentation patches against your latest git tree, they have all been in the past few -mm releases just fine.
The big changes in here are some ehci and ohci fixes to handle suspend better (there is still one more pending patch to get it all working completely, but that needs more testing before I send it to you.)
thanks,
greg k-h
MAINTAINERS | 26 + arch/i386/pci/common.c | 6 arch/i386/pci/direct.c | 4 arch/i386/pci/i386.c | 9 drivers/base/bus.c | 21 - drivers/base/dd.c | 10 drivers/hwmon/hdaps.c | 4 drivers/hwmon/it87.c | 9 drivers/hwmon/lm78.c | 4 drivers/hwmon/w83627hf.c | 10 drivers/pci/hotplug/pciehp.h | 1 drivers/pci/hotplug/pciehp_ctrl.c | 15 - drivers/pci/hotplug/pciehp_hpc.c | 12 drivers/pci/pci-acpi.c | 3 drivers/usb/core/hcd-pci.c | 38 ++ drivers/usb/core/hub.c | 3 drivers/usb/host/ehci-hcd.c | 158 +++++------ drivers/usb/host/ehci-hub.c | 7 drivers/usb/host/ehci-pci.c | 515 +++++++++++++++++-------------------- drivers/usb/host/ohci-pci.c | 53 +-- drivers/usb/media/sn9c102_core.c | 4 drivers/usb/serial/ftdi_sio.c | 2 drivers/usb/serial/ftdi_sio.h | 9 drivers/usb/serial/ipw.c | 2 drivers/usb/storage/unusual_devs.h | 11 include/linux/usb.h | 3 26 files changed, 494 insertions(+), 445 deletions(-)
PATCH 1/22 Small fixes to driver core
From: Alan Stern <[email protected]>
This patch (as603) makes a few small fixes to the driver core:
Change spin_lock_irq for a klist lock to spin_lock;
Fix reference count leaks;
Minor spelling and formatting changes.
Acked-by Patrick Mochel <[email protected]>
--- drivers/base/bus.c | 21 +++++++++------------ drivers/base/dd.c | 8 +++----- 2 files changed, 12 insertions(+), 17 deletions(-)
drivers/base/bus.c +9 -12
@@ -133,7 +133,7 @@ static struct kobj_type ktype_bus = {decl_subsys (bus, &ktype_bus,NULL ); -/* Manually detach a device from it's associated driver. */ +/* Manually detach a device from its associated driver. */ static int driver_helper (struct device *dev,void *data) {const char *name = data;
@@ -151,14 +151,13 @@ static ssize_t driver_unbind(struct deviint err = -ENODEV ; dev =bus_find_device (bus,NULL , (void *)buf, driver_helper); -if ((dev) && - (dev->driver == drv)) { +if (dev && dev->driver == drv) {device_release_driver (dev); err = count; } -if (err) -return err; -return count; +put_device (dev); +put_bus (bus); +return err; } static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
@@ -175,16 +174,14 @@ static ssize_t driver_bind(struct deviceint err = -ENODEV ; dev =bus_find_device (bus,NULL , (void *)buf, driver_helper); -if ((dev) && - (dev->driver ==NULL )) { +if (dev && dev->driver ==NULL ) {down (&dev->sem); err =driver_probe_device (drv, dev);up (&dev->sem); -put_device (dev); } -if (err) -return err; -return count; +put_device (dev); +put_bus (bus); +return err; } static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
drivers/base/dd.c +3 -5
@@ -62,7 +62,6 @@ void device_bind_driver(struct device ** because we don't know the format of the ID structures, nor what * is to be considered a match and what is not. * -* * This function returns 1 if a match is found, an error if one * occurs (that is not -ENODEV or -ENXIO), and 0 otherwise. *
@@ -158,7 +157,6 @@ static int __driver_attach(struct devicedriver_probe_device (drv, dev);up (&dev->sem); -return 0 ; }
@@ -225,15 +223,15 @@ void driver_detach(struct device_driverstruct device * dev;for (;;) { -spin_lock_irq (&drv->klist_devices.k_lock); +spin_lock (&drv->klist_devices.k_lock);if (list_empty (&drv->klist_devices.k_list)) { -spin_unlock_irq (&drv->klist_devices.k_lock); +spin_unlock (&drv->klist_devices.k_lock);break ; } dev =list_entry (drv->klist_devices.k_list.prev, struct device, knode_driver.n_node);get_device (dev); -spin_unlock_irq (&drv->klist_devices.k_lock); +spin_unlock (&drv->klist_devices.k_lock);down (&dev->sem);if (dev->driver == drv)
--
PATCH 2/22 MTD git tree location added to MAINTAINERS
In reply to Greg Kroah-HartmanFrom: Josh Boyer <[email protected]>
Here's the MTD one. More later as I find them.
MAINTAINERS +0 -0
--- MAINTAINERS | 1 + 1 file changed, 1 insertion(+)
MAINTAINERS +1 -0
@@ -1695,6 +1695,7 @@ P: David Woodhouse M: [email protected] W: http://www.linux-mtd.infradead.org/ L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/git/tglx/mtd-2.6.git S: Maintained MICROTEK X6 SCANNER
--
PATCH 3/22 Clarify T: field in MAINTAINERS
In reply to Greg Kroah-HartmanFrom: Jody McIntyre <[email protected]>
Pavel Machek points out that for git repos, what we include is not actually a URL. It is undesirable to use a URL since git repos can be accessed in many different ways.
--- MAINTAINERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
MAINTAINERS +1 -1
@@ -58,7 +58,7 @@ P: Person M: Mail patches to L: Mailing list that is relevant to this area W: Web-page with status/info -T: SCM tree type and URL. Type is one of: git, hg, quilt. +T: SCM tree type and location. Type is one of: git, hg, quilt. S: Status, one of the following: Supported: Someone is actually paid to look after this.
--
PATCH 4/22 Add more SCM trees to MAINTAINERS
In reply to Greg Kroah-HartmanFrom: Josh Boyer <[email protected]>
Greg requested a patch to update MAINTAINERS with more SCM entries. The patch below is what I've found so far.
--- MAINTAINERS | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
MAINTAINERS +17 -0
@@ -227,6 +227,7 @@ AGPGART DRIVER P: Dave Jones M: [email protected] W: http://www.codemonkey.org.uk/projects/agp/ +T: git kernel.org:/pub/scm/linux/kernel/git/davej/agpgart.git S: Maintained AHA152X SCSI DRIVER
@@ -384,6 +385,7 @@ P: David Woodhouse M: [email protected] L: [email protected] W: http://people.redhat.com/sgrubb/audit/ +T: git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git S: Maintained AX.25 NETWORK LAYER
@@ -432,6 +434,7 @@ L: [email protected] W: http://bluez.sf.net W: http://www.bluez.org W: http://www.holtmann.org/linux/bluetooth/ +T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git S: Maintained BLUETOOTH RFCOMM LAYER
@@ -547,6 +550,7 @@ P: Steve French M: [email protected] L: [email protected] W: http://us1.samba.org/samba/Linux_CIFS_client.html +T: git kernel.org:/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git S: Supported CIRRUS LOGIC GENERIC FBDEV DRIVER
@@ -608,6 +612,7 @@ P: Dave Jones M: [email protected] L: [email protected] W: http://www.codemonkey.org.uk/projects/cpufreq/ +T: git kernel.org/pub/scm/linux/kernel/davej/cpufreq.git S: Maintained CPUID/MSR DRIVER
@@ -641,6 +646,7 @@ M: [email protected] P: David S. Miller M: [email protected] L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/git/herbert/crypto-2.6.git S: Maintained CYBERPRO FB DRIVER
@@ -1185,6 +1191,7 @@ P: Bartlomiej Zolnierkiewicz M: [email protected] L: [email protected] L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git S: Maintained IDE/ATAPI CDROM DRIVER
@@ -1279,6 +1286,7 @@ P: Vojtech Pavlik M: [email protected] L: [email protected] L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/git/dtor/input.git S: Maintained INOTIFY
@@ -1392,6 +1400,7 @@ P: Kai Germaschewski M: [email protected] L: [email protected] W: http://www.isdn4linux.de +T: git kernel.org:/pub/scm/linux/kernel/kkeil/isdn-2.6.git S: Maintained ISDN SUBSYSTEM (Eicon active card driver)
@@ -1420,6 +1429,7 @@ P: Dave Kleikamp M: [email protected] L: [email protected] W: http://jfs.sourceforge.net/ +T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git S: Supported KCONFIG
@@ -1534,6 +1544,7 @@ P: Paul Mackerras M: [email protected] W: http://www.penguinppc.org/ L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git S: Supported LINUX FOR POWER MACINTOSH
@@ -1601,6 +1612,7 @@ P: Chris Wright M: [email protected] L: [email protected] W: http://lsm.immunix.org +T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git S: Supported LM83 HARDWARE MONITOR DRIVER
@@ -1816,6 +1828,7 @@ M: [email protected] P: Patrick McHardy M: [email protected] L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/davem/net-2.6.git S: Maintained IPVS
@@ -1867,6 +1880,7 @@ M: [email protected] L: [email protected] L: [email protected] W: http://linux-ntfs.sf.net/ +T: git kernel.org:/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git S: Maintained NVIDIA (RIVA) FRAMEBUFFER DRIVER
@@ -2390,6 +2404,7 @@ P: Anton Blanchard M: [email protected] L: [email protected] L: [email protected] +T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git S: Maintained SHARP LH SUPPORT (LH7952X & LH7A40X)
@@ -2528,6 +2543,7 @@ P: Adrian Bunk M: [email protected] L: [email protected] W: http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/ +T: git kernel.org:/pub/scm/linux/kernel/git/bunk/trivial.git S: Maintained TMS380 TOKEN-RING NETWORK DRIVER
@@ -2861,6 +2877,7 @@ P: Latchesar Ionkov M: [email protected] L: [email protected] W: http://v9fs.sf.net +T: git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs-devel.git S: Maintained VIDEO FOR LINUX
--
PATCH 5/22 hwmon: Fix missing boundary check when setting W83627THF in0 limits
In reply to Greg Kroah-HartmanFrom: Yuan Mu <[email protected]>
Add SENSORS_LIMIT in store VCore limit functions. This fixes a potential u8 overflow on out-of-range user input.
--- drivers/hwmon/w83627hf.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/hwmon/w83627hf.c +6 -2
@@ -456,7 +456,9 @@ static ssize_t store_regs_in_min0(struct (w83627thf == data->type || w83637hf == data->type))/* use VRM9 calculation */ - data->in_min[0 ] = (u8)(((val *100 ) -70000 +244 ) /488 ); + data->in_min[0 ] = +SENSORS_LIMIT (((val *100 ) -70000 +244 ) /488 ,0 , +255 ); else/* use VRM8 (standard) calculation */ data->in_min[0] = IN_TO_REG(val);
@@ -481,7 +483,9 @@ static ssize_t store_regs_in_max0(struct (w83627thf == data->type || w83637hf == data->type))/* use VRM9 calculation */ - data->in_max[0 ] = (u8)(((val *100 ) -70000 +244 ) /488 ); + data->in_max[0 ] = +SENSORS_LIMIT (((val *100 ) -70000 +244 ) /488 ,0 , +255 ); else/* use VRM8 (standard) calculation */ data->in_max[0] = IN_TO_REG(val);
--
PATCH 6/22 hwmon: Fix lm78 VID conversion
In reply to Greg Kroah-HartmanFrom: Jean Delvare <[email protected]>
Fix the lm78 VID reading, which I accidentally broke while making this driver use the common vid_from_reg function rather than reimplementing its own in 2.6.14-rc1.
I'm not proud of it, trust me.
--- drivers/hwmon/lm78.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/lm78.c +1 -1
@@ -451,7 +451,7 @@ static DEVICE_ATTR(fan3_div, S_IRUGO, shstatic ssize_t show_vid (struct device *dev,struct device_attribute *attr,char *buf) {struct lm78_data *data =lm78_update_device (dev); -return sprintf (buf,"%d\n" ,vid_from_reg (82 , data->vid)); +return sprintf (buf,"%d\n" ,vid_from_reg (data->vid,82 )); } static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL);
--
PATCH 7/22 hwmon: Fix missing it87 fan div init
In reply to Greg Kroah-HartmanFrom: Jean Delvare <[email protected]>
Fix a bug where setting the low fan speed limits will not work if no data was ever read through the sysfs interface and the fan clock dividers have not been explicitely set yet either. The reason is that data->fan_div[nr] may currently be used before it is initialized from the chip register values. The fix is to explicitely initialize data->fan_div[nr] before using it.
Bug reported, and fix tested, by Nicolas Mailhot.
--- drivers/hwmon/it87.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/hwmon/it87.c +7 -0
@@ -522,8 +522,15 @@ static ssize_t set_fan_min(struct devicestruct i2c_client *client =to_i2c_client (dev);struct it87_data *data =i2c_get_clientdata (client);int val =simple_strtol (buf,NULL ,10 ); +u8 reg =it87_read_value (client,IT87_REG_FAN_DIV );down (&data->update_lock); +switch (nr) { +case 0 : data->fan_div[nr] = reg &0x07 ;break ; +case 1 : data->fan_div[nr] = (reg >>3 ) &0x07 ;break ; +case 2 : data->fan_div[nr] = (reg &0x40 ) ?3 :1 ;break ; + } + data->fan_min[nr] =FAN_TO_REG (val,DIV_FROM_REG (data->fan_div[nr]));it87_write_value (client,IT87_REG_FAN_MIN (nr), data->fan_min[nr]);up (&data->update_lock);
--
PATCH 8/22 hwmon: hdaps missing an axis
In reply to Greg Kroah-HartmanFrom: Eugeniy Meshcheryakov <[email protected]>
Trivial patch to report both hdaps axises to the joystick device, not just the X axis.
--- drivers/hwmon/hdaps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/hdaps.c +1 -1
@@ -570,7 +570,7 @@ static int __init hdaps_init(void) hdaps_idev->evbit[0 ] =BIT (EV_ABS );input_set_abs_params (hdaps_idev,ABS_X ,-256 ,256 ,HDAPS_INPUT_FUZZ ,HDAPS_INPUT_FLAT ); -input_set_abs_params (hdaps_idev,ABS_X , +input_set_abs_params (hdaps_idev,ABS_Y ,-256 ,256 ,HDAPS_INPUT_FUZZ ,HDAPS_INPUT_FLAT );input_register_device (hdaps_idev);
--
PATCH 9/22 PCI: trivial printk updates in common.c
In reply to Greg Kroah-HartmanFrom: Daniel Marjam�kia <[email protected]>
Modified common.c so it's using the appropriate KERN_* in printk() calls.
--- arch/i386/pci/common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/i386/pci/common.c +2 -2
@@ -132,7 +132,7 @@ struct pci_bus * __devinit pcibios_scan_ } } -printk ("PCI: Probing PCI hardware (bus %02x)\n" , busnum); +printk (KERN_DEBUG "PCI: Probing PCI hardware (bus %02x)\n" , busnum);return pci_scan_bus_parented (NULL , busnum, &pci_root_ops,NULL ); }
@@ -144,7 +144,7 @@ static int __init pcibios_init(void)struct cpuinfo_x86 *c = &boot_cpu_data;if (!raw_pci_ops) { -printk ("PCI: System does not support PCI\n" ); +printk (KERN_WARNING "PCI: System does not support PCI\n" );return 0 ; }
--
PATCH 10/22 PCI Express Hotplug: clear sticky power-fault bit
In reply to Greg Kroah-HartmanFrom: Rajesh Shah <[email protected]>
Per the PCI Express spec, the power-fault-detected bit in the slot status register can be set anytime hardware detects a power fault, regardless of whether the slot has a device populated in it or not. This bit is sticky and must be explicitly cleared. This patch is needed to allow hot-add after such a power fault has been detected.
--- drivers/pci/hotplug/pciehp.h | 1 - drivers/pci/hotplug/pciehp_ctrl.c | 15 ++------------- drivers/pci/hotplug/pciehp_hpc.c | 10 +++++++++- 3 files changed, 11 insertions(+), 15 deletions(-)
drivers/pci/hotplug/pciehp.h +0 -1
@@ -59,7 +59,6 @@ struct slot {struct slot *next;u8 bus;u8 device; -u16 status;u32 number;u8 state;struct timer_list task_event;
drivers/pci/hotplug/pciehp_ctrl.c +2 -13
@@ -207,7 +207,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot,* power fault Cleared */ info ("Power fault cleared on Slot(%d)\n" , ctrl->first_slot + hp_slot); - p_slot->status =0x00 ; taskInfo->event_type =INT_POWER_FAULT_CLEAR ; }else {/*
@@ -215,8 +214,6 @@ u8 pciehp_handle_power_fault(u8 hp_slot,*/ info ("Power fault on Slot(%d)\n" , ctrl->first_slot + hp_slot); taskInfo->event_type =INT_POWER_FAULT ; -/* set power fault status for this board */ - p_slot->status =0xFF ;info ("power fault bit %x set\n" , hp_slot); }if (rc)
@@ -317,13 +314,10 @@ static int board_added(struct slot *p_slreturn rc; } -dbg ("%s: slot status = %x\n" , __FUNCTION__, p_slot->status); -/* Check for a power fault */ -if (p_slot->status ==0xFF ) { -/* power fault occurred, but it was benign */ +if (p_slot->hpc_ops->query_power_fault (p_slot)) { +dbg ("%s: power fault detected\n" , __FUNCTION__); rc =POWER_FAILURE ; - p_slot->status =0 ; goto err_exit; }
@@ -334,8 +328,6 @@ static int board_added(struct slot *p_sl goto err_exit; } - p_slot->status =0 ; -/* * Some PCI Express root ports require fixup after hot-plug operation. */
@@ -382,9 +374,6 @@ static int remove_board(struct slot *p_sdbg ("In %s, hp_slot = %d\n" , __FUNCTION__, hp_slot); -/* Change status to shutdown */ - p_slot->status =0x01 ; -/* Wait for exclusive access to hardware */ down (&ctrl->crit_sect);
drivers/pci/hotplug/pciehp_hpc.c +9 -1
@@ -750,7 +750,7 @@ static int hpc_power_on_slot(struct slot {struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle;u16 slot_cmd; -u16 slot_ctrl; +u16 slot_ctrl, slot_status;int retval =0 ;
@@ -767,6 +767,14 @@ static int hpc_power_on_slot(struct slotreturn -1 ; } +/* Clear sticky power-fault bit from previous power failures */ +hp_register_read_word (php_ctlr->pci_dev, +SLOT_STATUS (slot->ctrl->cap_base), slot_status); + slot_status &=PWR_FAULT_DETECTED ; +if (slot_status) +hp_register_write_word (php_ctlr->pci_dev, +SLOT_STATUS (slot->ctrl->cap_base), slot_status); + retval =hp_register_read_word (php_ctlr->pci_dev,SLOT_CTRL (slot->ctrl->cap_base), slot_ctrl);if (retval) {
--
PATCH 11/22 PCI: remove bogus resource collision error
In reply to Greg Kroah-HartmanFrom: Rajesh Shah <[email protected]>
When attempting to hotadd a PCI card with a bridge on it, I saw the kernel reporting resource collision errors even when there were really no collisions. The problem is that the code doesn't skip over "invalid" resources with their resource type flag not set. Others have reported similar problems at boot time and for non-bridge PCI card hotplug too, where the code flags a resource collision for disabled ROMs. This patch fixes both problems.
--- arch/i386/pci/i386.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/i386/pci/i386.c +5 -2
@@ -221,6 +221,11 @@ int pcibios_enable_resources(struct pci_continue ; r = &dev->resource[idx]; +if (!(r->flags & (IORESOURCE_IO |IORESOURCE_MEM ))) +continue ; +if ((idx ==PCI_ROM_RESOURCE ) && + (!(r->flags &IORESOURCE_ROM_ENABLE ))) +continue ;if (!r->start && r->end) {printk (KERN_ERR "PCI: Device %s not available because of resource collisions\n" ,pci_name (dev));return -EINVAL ;
@@ -230,8 +235,6 @@ int pcibios_enable_resources(struct pci_if (r->flags &IORESOURCE_MEM ) cmd |=PCI_COMMAND_MEMORY ; } -if (dev->resource[PCI_ROM_RESOURCE ].start) - cmd |=PCI_COMMAND_MEMORY ;if (cmd != old_cmd) {printk ("PCI: Enabling device %s (%04x -> %04x)\n" ,pci_name (dev), old_cmd, cmd);pci_write_config_word (dev,PCI_COMMAND , cmd);
--
PATCH 12/22 PCI: kernel-doc fix for pci-acpi.c
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
Fix kernel-doc warning in pci/pci-acpi.c.
--- drivers/pci/pci-acpi.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/pci-acpi.c +1 -0
@@ -178,6 +178,7 @@ EXPORT_SYMBOL(pci_osc_support_set);/** * pci_osc_control_set - commit requested control to Firmware +* @handle: acpi_handle for the target ACPI object * @flags: driver's requested control bits * * Attempt to take control from Firmware on requested control bits.
--
PATCH 13/22 PCI: direct.c: DBG
In reply to Greg Kroah-HartmanFrom: Daniel Marjam�ki <[email protected]>
The DBG() call where updated with the appropriate KERN_* symbol.
--- arch/i386/pci/direct.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/i386/pci/direct.c +1 -1
@@ -201,7 +201,7 @@ static int __init pci_sanity_check(strucreturn 1 ; } -DBG ("PCI: Sanity check failed\n" ); +DBG (KERN_WARNING "PCI: Sanity check failed\n" );return 0 ; }
--
PATCH 14/22 USB: SN9C10x driver - bad page state fix
In reply to Greg Kroah-HartmanFrom: Damian Wrobel <[email protected]>
This patch solves the following problem I've already discovered on the latest 2.6.15-rc1-git1 kernel:
Nov 13 07:37:28 wrobel kernel: Bad page state at free_hot_cold_page (in process 'motion', page c164e020) Nov 13 07:37:28 wrobel kernel: flags:0x40000400 mapping:00000000 mapcount:0 count:0 Nov 13 07:37:28 wrobel kernel: Backtrace: Nov 13 07:37:28 wrobel kernel: [<c0146d86>] bad_page+0x85/0xbe Nov 13 07:37:28 wrobel kernel: [<c0147629>] free_hot_cold_page+0x54/0x129 Nov 13 07:37:28 wrobel kernel: [<c01598c6>] __vunmap+0xa9/0xfe Nov 13 07:37:28 wrobel kernel: [<c0154114>] vmalloc_to_page+0x34/0x55 Nov 13 07:37:28 wrobel kernel: [<c0159942>] vfree+0x27/0x35 Nov 13 07:37:28 wrobel kernel: [<f8a20292>] sn9c102_release_buffers+0x30/0x3f [sn9c102] Nov 13 07:37:28 wrobel kernel: [<f8a231c2>] sn9c102_release+0x37/0xeb [sn9c102] Nov 13 07:37:28 wrobel kernel: [<c0163e74>] __fput+0xa9/0x1aa Nov 13 07:37:28 wrobel kernel: [<c01624f7>] filp_close+0x49/0x6d Nov 13 07:37:30 wrobel kernel: [<c016258f>] sys_close+0x74/0x95 Nov 13 07:37:30 wrobel kernel: [<c0102ef9>] syscall_call+0x7/0xb Nov 13 07:37:31 wrobel kernel: Trying to fix it up, but a reboot is needed
--- drivers/usb/media/sn9c102_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/media/sn9c102_core.c +1 -1
@@ -199,7 +199,7 @@ static void sn9c102_release_buffers(stru {if (cam->nbuffers) {rvfree (cam->frame[0 ].bufmem, - cam->nbuffers * cam->frame[0 ].buf.length); + cam->nbuffers *PAGE_ALIGN (cam->frame[0 ].buf.length)); cam->nbuffers =0 ; } }
--
PATCH 15/22 USB: ftdi_sio: new IDs for KOBIL devices
In reply to Greg Kroah-HartmanFrom: Ian Abbott <[email protected]>
This patch adds two new devices to the ftdi_sio driver's device ID table. The device IDs were supplied by Stefan Nies of KOBIL Systems for two of their devices using the FTDI chip.
--- drivers/usb/serial/ftdi_sio.c | 2 ++ drivers/usb/serial/ftdi_sio.h | 7 +++++++ 2 files changed, 9 insertions(+)
drivers/usb/serial/ftdi_sio.c +2 -0
@@ -475,6 +475,8 @@ static struct usb_device_id id_table_com { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) }, { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16HR_PID) }, + { USB_DEVICE(KOBIL_VID, KOBIL_CONV_B1_PID) }, + { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) }, { }, /* Optional parameter entry */ { } /* Terminating entry */ };
drivers/usb/serial/ftdi_sio.h +7 -0
@@ -128,6 +128,13 @@#define SEALEVEL_2803_8_PID 0X2883/* SeaLINK+8 (2803) Port 8 */ /* +* The following are the values for two KOBIL chipcard terminals. +*/ +#define KOBIL_VID 0x0d46/* KOBIL Vendor ID */ +#define KOBIL_CONV_B1_PID 0x2020/* KOBIL Konverter for B1 */ +#define KOBIL_CONV_KAAN_PID 0x2021/* KOBIL_Konverter for KAAN */ + +/* * DSS-20 Sync Station for Sony Ericsson P800 */
--
PATCH 16/22 USB: EHCI updates
In reply to Greg Kroah-HartmanFrom: David Brownell <[email protected]>
This fixes some bugs in EHCI suspend/resume that joined us over the past few releases (as usbcore, PCI, pmcore, and other components evolved):
- Removes suspend and resume recursion from the EHCI driver, getting rid of the USB_SUSPEND special casing.
- Updates the wakeup mechanism to work again; there's a newish usbcore call it needs to use.
- Provide simpler tests for "do we need to restart from scratch", to address another case where PCI Vaux was lost. (In this case it was restoring a swsusp snapshot, but there could be others.)
Un-exports a symbol that was temporarily exported.
A notable change from previous version is that this doesn't move the spinlock init, so there's still a resume/reinit path bug.
--- drivers/usb/core/hub.c | 1 drivers/usb/host/ehci-hcd.c | 3 - drivers/usb/host/ehci-hub.c | 7 ++++ drivers/usb/host/ehci-pci.c | 77 +++++++++++++++++++++----------------------- 4 files changed, 46 insertions(+), 42 deletions(-)
drivers/usb/host/ehci-hcd.c +1 -2
@@ -636,9 +636,8 @@ static irqreturn_t ehci_irq (struct usb_* stop that signaling. */ ehci->reset_done [i] = jiffies +msecs_to_jiffies (20 ); -mod_timer (&hcd->rh_timer, - ehci->reset_done [i] +1 );ehci_dbg (ehci,"port %d remote wakeup\n" , i +1 ); +usb_hcd_resume_root_hub (hcd); } }
drivers/usb/host/ehci-pci.c +38 -39
120 lines not on this page · raw message
drivers/usb/host/ehci-hub.c +7 -0
@@ -94,6 +94,13 @@ static int ehci_bus_resume (struct usb_hmsleep (5 );spin_lock_irq (&ehci->lock); +/* Ideally and we've got a real resume here, and no port's power +* was lost. (For PCI, that means Vaux was maintained.) But we +* could instead be restoring a swsusp snapshot -- so that BIOS was +* the last user of the controller, not reset/pm hardware keeping +* state we gave to it. +*/ +/* re-init operational registers in case we lost power */ if (readl (&ehci->regs->intr_enable) ==0 ) {/* at least some APM implementations will try to deliver
drivers/usb/core/hub.c +0 -1
@@ -1669,7 +1669,6 @@ int usb_suspend_device(struct usb_devicereturn 0 ;#endif } -EXPORT_SYMBOL_GPL (usb_suspend_device);/* * If the USB "suspend" state is in use (rather than "global suspend"),
--
PATCH 17/22 USB: EHCI updates mostly whitespace cleanups
In reply to Greg Kroah-HartmanFrom: David Brownell <[email protected]>
This cleans up the recent updates to EHCI PCI support:
- Gets rid of checks for "is this a PCI device", they're no longer needed since this is now all PCI-only code.
- Reduce log spamming: MWI is only interesting in the atypical case that it can actually be used.
- Whitespace cleanup, as appropriate for a new file with no other pending patches.
So other than that minor logging change, no functional updates.
--- drivers/usb/host/ehci-pci.c | 268 +++++++++++++++++++++----------------------- 1 file changed, 129 insertions(+), 139 deletions(-)
drivers/usb/host/ehci-pci.c +129 -139
@@ -27,7 +27,7 @@/* EHCI 0.96 (and later) section 5.1 says how to kick BIOS/SMM/... * off the controller (maybe it can boot from highspeed USB disks). */ -static int bios_handoff (struct ehci_hcd *ehci,int where,u32 cap) +static int bios_handoff (struct ehci_hcd *ehci,int where,u32 cap) {struct pci_dev *pdev =to_pci_dev (ehci_to_hcd (ehci)->self.controller);
@@ -48,7 +48,7 @@ static int bios_handoff (struct ehci_hcd where, cap);// some BIOS versions seem buggy... // return 1; -ehci_warn (ehci,"continuing after BIOS bug...\n" ); +ehci_warn (ehci,"continuing after BIOS bug...\n" );/* disable all SMIs, and clear "BIOS owns" flag */ pci_write_config_dword (pdev, where +4 ,0 );pci_write_config_byte (pdev, where +2 ,0 );
@@ -59,95 +59,93 @@ static int bios_handoff (struct ehci_hcd }/* called by khubd or root hub init threads */ -static int ehci_pci_reset (struct usb_hcd *hcd) +static int ehci_pci_reset (struct usb_hcd *hcd) { -struct ehci_hcd *ehci =hcd_to_ehci (hcd); +struct ehci_hcd *ehci =hcd_to_ehci (hcd); +struct pci_dev *pdev =to_pci_dev (hcd->self.controller);u32 temp;unsigned count =256 /4 ;spin_lock_init (&ehci->lock); ehci->caps = hcd->regs; - ehci->regs = hcd->regs +HC_LENGTH (readl (&ehci->caps->hc_capbase)); -dbg_hcs_params (ehci,"reset" ); -dbg_hcc_params (ehci,"reset" ); + ehci->regs = hcd->regs +HC_LENGTH (readl (&ehci->caps->hc_capbase)); +dbg_hcs_params (ehci,"reset" ); +dbg_hcc_params (ehci,"reset" );/* cache this readonly data; minimize chip reads */ - ehci->hcs_params =readl (&ehci->caps->hcs_params); + ehci->hcs_params =readl (&ehci->caps->hcs_params); -if (hcd->self.controller->bus == &pci_bus_type) { -struct pci_dev *pdev =to_pci_dev (hcd->self.controller); +/* NOTE: only the parts below this line are PCI-specific */ -switch (pdev->vendor) { -case PCI_VENDOR_ID_TDI : -if (pdev->device ==PCI_DEVICE_ID_TDI_EHCI ) { - ehci->is_tdi_rh_tt =1 ; -tdi_reset (ehci); - } -break ; -case PCI_VENDOR_ID_AMD : -/* AMD8111 EHCI doesn't work, according to AMD errata */ -if (pdev->device ==0x7463 ) { -ehci_info (ehci,"ignoring AMD8111 (errata)\n" ); -return -EIO ; - } -break ; -case PCI_VENDOR_ID_NVIDIA : -/* NVidia reports that certain chips don't handle -* QH, ITD, or SITD addresses above 2GB. (But TD, -* data buffer, and periodic schedule are normal.) -*/ -switch (pdev->device) { -case 0x003c :/* MCP04 */ -case 0x005b :/* CK804 */ -case 0x00d8 :/* CK8 */ -case 0x00e8 :/* CK8S */ -if (pci_set_consistent_dma_mask (pdev, -DMA_31BIT_MASK ) <0 ) -ehci_warn (ehci,"can't enable NVidia " -"workaround for >2GB RAM\n" ); -break ; - } +switch (pdev->vendor) { +case PCI_VENDOR_ID_TDI : +if (pdev->device ==PCI_DEVICE_ID_TDI_EHCI ) { + ehci->is_tdi_rh_tt =1 ; +tdi_reset (ehci); + } +break ; +case PCI_VENDOR_ID_AMD : +/* AMD8111 EHCI doesn't work, according to AMD errata */ +if (pdev->device ==0x7463 ) { +ehci_info (ehci,"ignoring AMD8111 (errata)\n" ); +return -EIO ; + } +break ; +case PCI_VENDOR_ID_NVIDIA : +/* NVidia reports that certain chips don't handle +* QH, ITD, or SITD addresses above 2GB. (But TD, +* data buffer, and periodic schedule are normal.) +*/ +switch (pdev->device) { +case 0x003c :/* MCP04 */ +case 0x005b :/* CK804 */ +case 0x00d8 :/* CK8 */ +case 0x00e8 :/* CK8S */ +if (pci_set_consistent_dma_mask (pdev, +DMA_31BIT_MASK ) <0 ) +ehci_warn (ehci,"can't enable NVidia " +"workaround for >2GB RAM\n" );break ; } +break ; + } -/* optional debug port, normally in the first BAR */ - temp =pci_find_capability (pdev,0x0a ); -if (temp) { -pci_read_config_dword (pdev, temp, &temp); - temp >>=16 ; -if ((temp & (3 <<13 )) == (1 <<13 )) { - temp &=0x1fff ; - ehci->debug = hcd->regs + temp; - temp =readl (&ehci->debug->control); -ehci_info (ehci,"debug port %d%s\n" , -HCS_DEBUG_PORT (ehci->hcs_params), - (temp &DBGP_ENABLED ) - ?" IN USE" - :"" ); -if (!(temp &DBGP_ENABLED )) - ehci->debug =NULL ; - } +/* optional debug port, normally in the first BAR */ + temp =pci_find_capability (pdev,0x0a ); +if (temp) { +pci_read_config_dword (pdev, temp, &temp); + temp >>=16 ; +if ((temp & (3 <<13 )) == (1 <<13 )) { + temp &=0x1fff ; + ehci->debug = hcd->regs + temp; + temp =readl (&ehci->debug->control); +ehci_info (ehci,"debug port %d%s\n" , +HCS_DEBUG_PORT (ehci->hcs_params), + (temp &DBGP_ENABLED ) + ?" IN USE" + :"" ); +if (!(temp &DBGP_ENABLED )) + ehci->debug =NULL ; } + } - temp =HCC_EXT_CAPS (readl (&ehci->caps->hcc_params)); - }else - temp =0 ; + temp =HCC_EXT_CAPS (readl (&ehci->caps->hcc_params));/* EHCI 0.96 and later may have "extended capabilities" */ while (temp && count--) {u32 cap; -pci_read_config_dword (to_pci_dev (hcd->self.controller), +pci_read_config_dword (to_pci_dev (hcd->self.controller), temp, &cap); -ehci_dbg (ehci,"capability %04x at %02x\n" , cap, temp); +ehci_dbg (ehci,"capability %04x at %02x\n" , cap, temp);switch (cap &0xff ) {case 1 :/* BIOS/SMM/... handoff */ -if (bios_handoff (ehci, temp, cap) !=0 ) +if (bios_handoff (ehci, temp, cap) !=0 )return -EOPNOTSUPP ;break ;case 0 :/* illegal reserved capability */ -ehci_warn (ehci,"illegal capability!\n" ); +ehci_warn (ehci,"illegal capability!\n" ); cap =0 ;/* FALLTHROUGH */ default :/* unknown */
@@ -156,77 +154,69 @@ static int ehci_pci_reset (struct usb_hc temp = (cap >>8 ) &0xff ; }if (!count) { -ehci_err (ehci,"bogus capabilities ... PCI problems!\n" ); +ehci_err (ehci,"bogus capabilities ... PCI problems!\n" );return -EIO ; }if (ehci_is_TDI (ehci)) -ehci_reset (ehci); +ehci_reset (ehci); -ehci_port_power (ehci,0 ); +ehci_port_power (ehci,0 );/* at least the Genesys GL880S needs fixup here */ temp =HCS_N_CC (ehci->hcs_params) *HCS_N_PCC (ehci->hcs_params); temp &=0x0f ;if (temp &&HCS_N_PORTS (ehci->hcs_params) > temp) { -ehci_dbg (ehci,"bogus port configuration: " +ehci_dbg (ehci,"bogus port configuration: " "cc=%d x pcc=%d < ports=%d\n" ,HCS_N_CC (ehci->hcs_params),HCS_N_PCC (ehci->hcs_params),HCS_N_PORTS (ehci->hcs_params)); -if (hcd->self.controller->bus == &pci_bus_type) { -struct pci_dev *pdev; - - pdev =to_pci_dev (hcd->self.controller); -switch (pdev->vendor) { -case 0x17a0 :/* GENESYS */ -/* GL880S: should be PORTS=2 */ - temp |= (ehci->hcs_params & ~0xf ); - ehci->hcs_params = temp; -break ; -case PCI_VENDOR_ID_NVIDIA : -/* NF4: should be PCC=10 */ -break ; - } +switch (pdev->vendor) { +case 0x17a0 :/* GENESYS */ +/* GL880S: should be PORTS=2 */ + temp |= (ehci->hcs_params & ~0xf ); + ehci->hcs_params = temp; +break ; +case PCI_VENDOR_ID_NVIDIA : +/* NF4: should be PCC=10 */ +break ; } }/* force HC to halt state */ -return ehci_halt (ehci); +return ehci_halt (ehci); } -static int ehci_pci_start (struct usb_hcd *hcd) +static int ehci_pci_start (struct usb_hcd *hcd) { -struct ehci_hcd *ehci =hcd_to_ehci (hcd); -int result =0 ; - -if (hcd->self.controller->bus == &pci_bus_type) { -struct pci_dev *pdev; -u16 port_wake; - - pdev =to_pci_dev (hcd->self.controller); - -/* Serial Bus Release Number is at PCI 0x60 offset */ -pci_read_config_byte (pdev,0x60 , &ehci->sbrn); - -/* port wake capability, reported by boot firmware */ -pci_read_config_word (pdev,0x62 , &port_wake); - hcd->can_wakeup = (port_wake &1 ) !=0 ; - -/* help hc dma work well with cachelines */ - result =pci_set_mwi (pdev); -if (result) -ehci_dbg (ehci,"unable to enable MWI - not fatal.\n" ); - } +struct ehci_hcd *ehci =hcd_to_ehci (hcd); +int result =0 ; +struct pci_dev *pdev; +u16 port_wake; + + pdev =to_pci_dev (hcd->self.controller); + +/* Serial Bus Release Number is at PCI 0x60 offset */ +pci_read_config_byte (pdev,0x60 , &ehci->sbrn); + +/* port wake capability, reported by boot firmware */ +pci_read_config_word (pdev,0x62 , &port_wake); + hcd->can_wakeup = (port_wake &1 ) !=0 ; + +/* PCI Memory-Write-Invalidate cycle support is optional (uncommon) */ + result =pci_set_mwi (pdev); +if (!result) +ehci_dbg (ehci,"MWI active\n" ); -return ehci_run (hcd); +return ehci_run (hcd); }/* always called by thread; normally rmmod */ -static void ehci_pci_stop (struct usb_hcd *hcd) +static void ehci_pci_stop (struct usb_hcd *hcd) { -ehci_stop (hcd); +ehci_stop (hcd); }/*-------------------------------------------------------------------------*/
@@ -242,12 +232,12 @@ static void ehci_pci_stop (struct usb_hc* Also they depend on separate root hub suspend/resume. */ -static int ehci_pci_suspend (struct usb_hcd *hcd,pm_message_t message) +static int ehci_pci_suspend (struct usb_hcd *hcd,pm_message_t message) { -struct ehci_hcd *ehci =hcd_to_ehci (hcd); +struct ehci_hcd *ehci =hcd_to_ehci (hcd); -if (time_before (jiffies, ehci->next_statechange)) -msleep (10 ); +if (time_before (jiffies, ehci->next_statechange)) +msleep (10 );// could save FLADJ in case of Vaux power loss // ... we'd only use it to handle clock skew
@@ -255,30 +245,30 @@ static int ehci_pci_suspend (struct usb_return 0 ; } -static int ehci_pci_resume (struct usb_hcd *hcd) +static int ehci_pci_resume (struct usb_hcd *hcd) { -struct ehci_hcd *ehci =hcd_to_ehci (hcd); +struct ehci_hcd *ehci =hcd_to_ehci (hcd);unsigned port;struct usb_device *root = hcd->self.root_hub;int retval = -EINVAL ;// maybe restore FLADJ -if (time_before (jiffies, ehci->next_statechange)) -msleep (100 ); +if (time_before (jiffies, ehci->next_statechange)) +msleep (100 );/* If CF is clear, we lost PCI Vaux power and need to restart. */ -if (readl (&ehci->regs->configured_flag) !=cpu_to_le32 (FLAG_CF )) +if (readl (&ehci->regs->configured_flag) !=cpu_to_le32 (FLAG_CF )) goto restart;/* If any port is suspended (or owned by the companion), * we know we can/must resume the HC (and mustn't reset it). * We just defer that to the root hub code. */ -for (port =HCS_N_PORTS (ehci->hcs_params); port >0 ; ) { +for (port =HCS_N_PORTS (ehci->hcs_params); port >0 ; ) {u32 status; port--; - status =readl (&ehci->regs->port_status [port]); + status =readl (&ehci->regs->port_status [port]);if (!(status &PORT_POWER ))continue ;if (status & (PORT_SUSPEND |PORT_RESUME |PORT_OWNER )) {
@@ -289,35 +279,35 @@ static int ehci_pci_resume (struct usb_h restart:ehci_dbg (ehci,"lost power, restarting\n" ); -for (port =HCS_N_PORTS (ehci->hcs_params); port >0 ; ) { +for (port =HCS_N_PORTS (ehci->hcs_params); port >0 ; ) { port--;if (!root->children [port])continue ; -usb_set_device_state (root->children[port], +usb_set_device_state (root->children[port],USB_STATE_NOTATTACHED ); }/* Else reset, to cope with power loss or flush-to-storage * style "resume" having let BIOS kick in during reboot. */ - (void )ehci_halt (ehci); - (void )ehci_reset (ehci); - (void )ehci_pci_reset (hcd); + (void )ehci_halt (ehci); + (void )ehci_reset (ehci); + (void )ehci_pci_reset (hcd);/* emptying the schedule aborts any urbs */ -spin_lock_irq (&ehci->lock); +spin_lock_irq (&ehci->lock);if (ehci->reclaim) ehci->reclaim_ready =1 ; -ehci_work (ehci,NULL ); -spin_unlock_irq (&ehci->lock); +ehci_work (ehci,NULL ); +spin_unlock_irq (&ehci->lock);/* restart; khubd will disconnect devices */ - retval =ehci_run (hcd); + retval =ehci_run (hcd);/* here we "know" root ports should always stay powered; * but some controllers may lose all power. */ -ehci_port_power (ehci,1 ); +ehci_port_power (ehci,1 );return retval; }
@@ -376,7 +366,7 @@ static const struct pci_device_id pci_id }, {/* end: all zeroes */ } }; -MODULE_DEVICE_TABLE (pci, pci_ids); +MODULE_DEVICE_TABLE (pci, pci_ids);/* pci driver glue; this is a "new style" PCI driver module */ static struct pci_driver ehci_pci_driver = {
@@ -392,22 +382,22 @@ static struct pci_driver ehci_pci_driver#endif }; -static int __init ehci_hcd_pci_init (void ) +static int __init ehci_hcd_pci_init (void ) {if (usb_disabled ())return -ENODEV ; -pr_debug ("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n" , +pr_debug ("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n" , hcd_name, -sizeof (struct ehci_qh ),sizeof (struct ehci_qtd ), -sizeof (struct ehci_itd ),sizeof (struct ehci_sitd )); +sizeof (struct ehci_qh ),sizeof (struct ehci_qtd ), +sizeof (struct ehci_itd ),sizeof (struct ehci_sitd )); -return pci_register_driver (&ehci_pci_driver); +return pci_register_driver (&ehci_pci_driver); } -module_init (ehci_hcd_pci_init); +module_init (ehci_hcd_pci_init); -static void __exit ehci_hcd_pci_cleanup (void) +static void __exit ehci_hcd_pci_cleanup(void) { -pci_unregister_driver (&ehci_pci_driver); +pci_unregister_driver (&ehci_pci_driver); } -module_exit (ehci_hcd_pci_cleanup); +module_exit (ehci_hcd_pci_cleanup);
--
PATCH 18/22 USB: EHCI updates split init/reinit logic for resume
In reply to Greg Kroah-HartmanFrom: David Brownell <[email protected]>
Moving the PCI-specific parts of the EHCI driver into their own file created a few issues ... notably on resume paths which (like swsusp) require re-initializing the controller. This patch:
- Splits the EHCI startup code into run-once HCD setup code and separate "init the hardware" reinit code. (That reinit code is a superset of the "early usb handoff" code.)
- Then it makes the PCI init code run both, and the resume code only run the reinit code.
- It also removes needless pci wrappers around EHCI start/stop methods.
- Removes a byteswap issue that would be seen on big-endian hardware.
The HCD glue still doesn't actually provide a good way to do all this run-one init stuff in one place though.
--- drivers/usb/host/ehci-hcd.c | 155 +++++++++++++++++++++-------------------- drivers/usb/host/ehci-pci.c | 166 ++++++++++++++++++++------------------------ 2 files changed, 161 insertions(+), 160 deletions(-)
drivers/usb/host/ehci-hcd.c +82 -73
@@ -411,50 +411,39 @@ static void ehci_stop (struct usb_hcd *hdbg_status (ehci,"ehci_stop completed" ,readl (&ehci->regs->status)); } -static int ehci_run (struct usb_hcd *hcd) +/* one-time init, only for memory state */ +static int ehci_init (struct usb_hcd *hcd) { -struct ehci_hcd *ehci =hcd_to_ehci (hcd); +struct ehci_hcd *ehci =hcd_to_ehci (hcd);u32 temp;int retval;u32 hcc_params; -int first; -/* skip some things on restart paths */ - first = (ehci->watchdog.data ==0 ); -if (first) { -init_timer (&ehci->watchdog); - ehci->watchdog.function = ehci_watchdog; - ehci->watchdog.data = (unsigned long ) ehci; - } +spin_lock_init (&ehci->lock); + +init_timer (&ehci->watchdog); + ehci->watchdog.function = ehci_watchdog; + ehci->watchdog.data = (unsigned long ) ehci;/* * hw default: 1K periodic list heads, one per frame. * periodic_size can shrink by USBCMD update if hcc_params allows. */ ehci->periodic_size =DEFAULT_I_TDPS ; -if (first && (retval =ehci_mem_init (ehci,GFP_KERNEL )) <0 ) +if ((retval =ehci_mem_init (ehci,GFP_KERNEL )) <0 )return retval;/* controllers may cache some of the periodic schedule ... */ - hcc_params =readl (&ehci->caps->hcc_params); -if (HCC_ISOC_CACHE (hcc_params))// full frame cache + hcc_params =readl (&ehci->caps->hcc_params); +if (HCC_ISOC_CACHE (hcc_params))// full frame cache ehci->i_thresh =8 ;else // N microframes cached - ehci->i_thresh =2 +HCC_ISOC_THRES (hcc_params); + ehci->i_thresh =2 +HCC_ISOC_THRES (hcc_params); ehci->reclaim =NULL ; ehci->reclaim_ready =0 ; ehci->next_uframe =-1 ; -/* controller state: unknown --> reset */ - -/* EHCI spec section 4.1 */ -if ((retval =ehci_reset (ehci)) !=0 ) { -ehci_mem_cleanup (ehci); -return retval; - } -writel (ehci->periodic_dma, &ehci->regs->frame_list); -/* * dedicate a qh for the async ring head, since we couldn't unlink * a 'real' qh without stopping the async schedule [4.8]. use it
@@ -462,37 +451,13 @@ static int ehci_run (struct usb_hcd *hcd* its dummy is used in hw_alt_next of many tds, to prevent the qh * from automatically advancing to the next td after short reads. */ -if (first) { - ehci->async->qh_next.qh =NULL ; - ehci->async->hw_next =QH_NEXT (ehci->async->qh_dma); - ehci->async->hw_info1 =cpu_to_le32 (QH_HEAD ); - ehci->async->hw_token =cpu_to_le32 (QTD_STS_HALT ); - ehci->async->hw_qtd_next =EHCI_LIST_END ; - ehci->async->qh_state =QH_STATE_LINKED ; - ehci->async->hw_alt_next =QTD_NEXT (ehci->async->dummy->qtd_dma); - } -writel ((u32 )ehci->async->qh_dma, &ehci->regs->async_next); - -/* -* hcc_params controls whether ehci->regs->segment must (!!!) -* be used; it constrains QH/ITD/SITD and QTD locations. -* pci_pool consistent memory always uses segment zero. -* streaming mappings for I/O buffers, like pci_map_single(), -* can return segments above 4GB, if the device allows. -* -* NOTE: the dma mask is visible through dma_supported(), so -* drivers can pass this info along ... like NETIF_F_HIGHDMA, -* Scsi_Host.highmem_io, and so forth. It's readonly to all -* host side drivers though. -*/ -if (HCC_64BIT_ADDR (hcc_params)) { -writel (0 , &ehci->regs->segment); -#if 0 -// this is deeply broken on almost all architectures -if (!dma_set_mask (hcd->self.controller,DMA_64BIT_MASK )) -ehci_info (ehci,"enabled 64bit DMA\n" ); -#endif - } + ehci->async->qh_next.qh =NULL ; + ehci->async->hw_next =QH_NEXT (ehci->async->qh_dma); + ehci->async->hw_info1 =cpu_to_le32 (QH_HEAD ); + ehci->async->hw_token =cpu_to_le32 (QTD_STS_HALT ); + ehci->async->hw_qtd_next =EHCI_LIST_END ; + ehci->async->qh_state =QH_STATE_LINKED ; + ehci->async->hw_alt_next =QTD_NEXT (ehci->async->dummy->qtd_dma);/* clear interrupt enables, set irq latency */ if (log2_irq_thresh <0 || log2_irq_thresh >6 )
@@ -507,13 +472,13 @@ static int ehci_run (struct usb_hcd *hcd* make problems: throughput reduction (!), data errors... */ if (park) { - park =min (park, (unsigned )3 ); + park =min (park, (unsigned )3 ); temp |=CMD_PARK ; temp |= park <<8 ; } -ehci_info (ehci,"park %d\n" , park); +ehci_dbg (ehci,"park %d\n" , park); } -if (HCC_PGM_FRAMELISTLEN (hcc_params)) { +if (HCC_PGM_FRAMELISTLEN (hcc_params)) {/* periodic schedule size can be smaller than default */ temp &= ~(3 <<2 ); temp |= (EHCI_TUNE_FLS <<2 );
@@ -521,16 +486,63 @@ static int ehci_run (struct usb_hcd *hcdcase 0 : ehci->periodic_size =1024 ;break ;case 1 : ehci->periodic_size =512 ;break ;case 2 : ehci->periodic_size =256 ;break ; -default :BUG (); +default :BUG (); } } + ehci->command = temp; + + ehci->reboot_notifier.notifier_call = ehci_reboot; +register_reboot_notifier (&ehci->reboot_notifier); + +return 0 ; +} + +/* start HC running; it's halted, ehci_init() has been run (once) */ +static int ehci_run (struct usb_hcd *hcd) +{ +struct ehci_hcd *ehci =hcd_to_ehci (hcd); +int retval; +u32 temp; +u32 hcc_params; + +/* EHCI spec section 4.1 */ +if ((retval =ehci_reset (ehci)) !=0 ) { +unregister_reboot_notifier (&ehci->reboot_notifier); +ehci_mem_cleanup (ehci); +return retval; + } +writel (ehci->periodic_dma, &ehci->regs->frame_list); +writel ((u32 )ehci->async->qh_dma, &ehci->regs->async_next); + +/* +* hcc_params controls whether ehci->regs->segment must (!!!) +* be used; it constrains QH/ITD/SITD and QTD locations. +* pci_pool consistent memory always uses segment zero. +* streaming mappings for I/O buffers, like pci_map_single(), +* can return segments above 4GB, if the device allows. +* +* NOTE: the dma mask is visible through dma_supported(), so +* drivers can pass this info along ... like NETIF_F_HIGHDMA, +* Scsi_Host.highmem_io, and so forth. It's readonly to all +* host side drivers though. +*/ + hcc_params =readl (&ehci->caps->hcc_params); +if (HCC_64BIT_ADDR (hcc_params)) { +writel (0 , &ehci->regs->segment); +#if 0 +// this is deeply broken on almost all architectures +if (!dma_set_mask (hcd->self.controller,DMA_64BIT_MASK )) +ehci_info (ehci,"enabled 64bit DMA\n" ); +#endif + } + +// 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); - -/* set async sleep time = 10 us ... ? */ + ehci->command &= ~(CMD_LRESET |CMD_IAAD |CMD_PSE |CMD_ASE |CMD_RESET ); + ehci->command |=CMD_RUN ; +writel (ehci->command, &ehci->regs->command); +dbg_cmd (ehci,"init" , ehci->command);/* * Start, enabling full USB 2.0 functionality ... usb 1.1 devices
@@ -538,26 +550,23 @@ static int ehci_run (struct usb_hcd *hcd* involved with the root hub. (Except where one is integrated, * and there's no companion controller unless maybe for USB OTG.) */ -if (first) { - ehci->reboot_notifier.notifier_call = ehci_reboot; -register_reboot_notifier (&ehci->reboot_notifier); - } - hcd->state =HC_STATE_RUNNING ;writel (FLAG_CF , &ehci->regs->configured_flag); -readl (&ehci->regs->command);/* unblock posted write */ +readl (&ehci->regs->command);/* unblock posted writes */ temp =HC_VERSION (readl (&ehci->caps->hc_capbase));ehci_info (ehci, -"USB %x.%x %s, EHCI %x.%02x, driver %s\n" , +"USB %x.%x started, EHCI %x.%02x, driver %s\n" , ((ehci->sbrn &0xf0 )>>4 ), (ehci->sbrn &0x0f ), - first ?"initialized" :"restarted" , temp >>8 , temp &0xff ,DRIVER_VERSION );writel (INTR_MASK , &ehci->regs->intr_enable);/* Turn On Interrupts */ -if (first) -create_debug_files (ehci); +/* GRR this is run-once init(), being done every time the HC starts. +* So long as they're part of class devices, we can't do it init() +* since the class device isn't created that early. +*/ +create_debug_files (ehci);return 0 ; }
drivers/usb/host/ehci-pci.c +79 -87
237 lines not on this page · raw message
--
PATCH 19/22 USB: ohci, move ppc asic tweaks nearer pci
In reply to Greg Kroah-HartmanFrom: David Brownell <[email protected]>
This should fix a suspend/resume issues that appear with OHCI on some PPC hardware. The PCI layer should doesn't have the hooks needed for such ASIC-specific hooks (in this case, software clock gating), so this moves the code to do that into hcd-pci.c ... where it can be done after the relevant PCI PM state transition (to/from D3).
--- drivers/usb/core/hcd-pci.c | 38 ++++++++++++++++++++++++++++++++++++-- drivers/usb/host/ohci-pci.c | 36 ------------------------------------ 2 files changed, 36 insertions(+), 38 deletions(-)
drivers/usb/core/hcd-pci.c +36 -2
@@ -20,9 +20,17 @@#include <linux/kernel.h> #include <linux/module.h> #include <linux/pci.h> +#include <linux/usb.h> +#include <asm/io.h> #include <asm/irq.h> -#include <linux/usb.h> + +#ifdef CONFIG_PPC_PMAC +#include <asm/machdep.h> +#include <asm/pmac_feature.h> +#include <asm/pci-bridge.h> +#include <asm/prom.h> +#endif #include "usb.h" #include "hcd.h"
@@ -277,8 +285,22 @@ int usb_hcd_pci_suspend (struct pci_dev } done: -if (retval ==0 ) +if (retval ==0 ) { dev->dev.power.power_state =PMSG_SUSPEND ; + +#ifdef CONFIG_PPC_PMAC +/* Disable ASIC clocks for USB */ +if (_machine == _MACH_Pmac) { +struct device_node *of_node; + + of_node =pci_device_to_OF_node (dev); +if (of_node) +pmac_call_feature (PMAC_FTR_USB_ENABLE , + of_node,0 ,0 ); + } +#endif + } +return retval; }EXPORT_SYMBOL (usb_hcd_pci_suspend);
@@ -301,6 +323,18 @@ int usb_hcd_pci_resume (struct pci_dev *return 0 ; } +#ifdef CONFIG_PPC_PMAC +/* Reenable ASIC clocks for USB */ +if (_machine == _MACH_Pmac) { +struct device_node *of_node; + + of_node =pci_device_to_OF_node (dev); +if (of_node) +pmac_call_feature (PMAC_FTR_USB_ENABLE , + of_node,0 ,1 ); + } +#endif +/* NOTE: chip docs cover clean "real suspend" cases (what Linux * calls "standby", "suspend to RAM", and so on). There are also * dirty cases when swsusp fakes a suspend in "shutdown" mode.
drivers/usb/host/ohci-pci.c +0 -36
@@ -14,15 +14,6 @@* This file is licenced under the GPL. */ -#include <linux/jiffies.h> - -#ifdef CONFIG_PPC_PMAC -#include <asm/machdep.h> -#include <asm/pmac_feature.h> -#include <asm/pci-bridge.h> -#include <asm/prom.h> -#endif -#ifndef CONFIG_PCI #error "This file is PCI bus glue. CONFIG_PCI must be defined."#endif
@@ -115,39 +106,12 @@ ohci_pci_start (struct usb_hcd *hcd)static int ohci_pci_suspend (struct usb_hcd *hcd,pm_message_t message) {/* root hub was already suspended */ - -/* FIXME these PMAC things get called in the wrong places. ASIC -* clocks should be turned off AFTER entering D3, and on BEFORE -* trying to enter D0. Evidently the PCI layer doesn't currently -* provide the right sort of platform hooks for this ... -*/ -#ifdef CONFIG_PPC_PMAC -if (_machine == _MACH_Pmac) { -struct device_node *of_node; - -/* Disable USB PAD & cell clock */ - of_node =pci_device_to_OF_node (to_pci_dev (hcd->self.controller)); -if (of_node) -pmac_call_feature (PMAC_FTR_USB_ENABLE , of_node,0 ,0 ); - } -#endif /* CONFIG_PPC_PMAC */ return 0 ; }static int ohci_pci_resume (struct usb_hcd *hcd) { -#ifdef CONFIG_PPC_PMAC -if (_machine == _MACH_Pmac) { -struct device_node *of_node; - -/* Re-enable USB PAD & cell clock */ - of_node =pci_device_to_OF_node (to_pci_dev (hcd->self.controller)); -if (of_node) -pmac_call_feature (PMAC_FTR_USB_ENABLE , of_node,0 ,1 ); - } -#endif /* CONFIG_PPC_PMAC */ -usb_hcd_resume_root_hub (hcd);return 0 ; }
--
PATCH 20/22 USB: fix USB key generates ioctl_internal_command errors issue
In reply to Greg Kroah-HartmanFrom: David H�rdeman <[email protected]>
Quoted 13 lines · Pete Zaitcev
Quoted 11 lines · David H�rdeman
usb-storage: waiting for device to settle before scanning
Vendor: I0MEGA Model: UMni1GB*IOM2K4 Rev: 1.01
Type: Direct-Access ANSI SCSI revision: 02
SCSI device sda: 2048000 512-byte hdwr sectors (1049 MB)
sda: Write Protect is off
sda: Mode Sense: 00 00 00 00
sda: assuming drive cache: write throughioctl_internal_command: <8 0 0 0> return code = 8000002
: Current: sense key=0x0ASC=0x0 ASCQ=0x0SCSI device sda: 2048000 512-byte hdwr sectors (1049 MB)
Quoted 2 lines
I think it's harmless. I saw things like that, and initially I plugged them with workarounds like this:
Thanks for the pointer, and yes, it is harmless, but it floods the console with the messages which hides other (potentially important) messages...following your example I've made a patch which fixes the problem.
--- drivers/usb/storage/unusual_devs.h | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/storage/unusual_devs.h +9 -0
@@ -1118,6 +1118,15 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_GO_SLOW ), +/* +* David H�rdeman <[email protected]> +* The key makes the SCSI stack print confusing (but harmless) messages +*/ +UNUSUAL_DEV( 0x4146, 0xba01, 0x0100, 0x0100, + "Iomega", + "Micro Mini 1GB", + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ), +#ifdef CONFIG_USB_STORAGE_SDDR55 UNUSUAL_DEV( 0x55aa, 0xa103, 0x0000, 0x9999, "Sandisk",
--
PATCH 21/22 USB: kernel-doc for linux/usb.h
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
Fix kernel-doc warning in linux/usb.h.
--- include/linux/usb.h | 1 + 1 file changed, 1 insertion(+)
include/linux/usb.h +1 -0
@@ -47,6 +47,7 @@ struct usb_driver;* @urb_list: urbs queued to this endpoint; maintained by usbcore * @hcpriv: for use by HCD; typically holds hardware dma queue head (QH) * with one or more transfer descriptors (TDs) per urb +* @kobj: kobject for sysfs info * @extra: descriptors following this endpoint in the configuration * @extralen: how many bytes of "extra" are valid *
--
PATCH 22/22 usb serial: remove redundant include
In reply to Greg Kroah-HartmanFrom: Nicolas Kaiser <[email protected]>
remove redundant include
--- drivers/usb/serial/ipw.c | 1 - 1 file changed, 1 deletion(-)
drivers/usb/serial/ipw.c +0 -1
@@ -46,7 +46,6 @@#include <linux/module.h> #include <linux/spinlock.h> #include <linux/usb.h> -#include <linux/usb.h> #include <asm/uaccess.h> #include "usb-serial.h"
--
Quoted 4 lines · Greg Kroah-Hartman
Here are a few PCI, USB, hwmon, and documentation patches against your latest git tree, they have all been in the past few -mm releases just fine.
Is there any reason you don't use git to sync up?
Linus
Quoted 9 lines · Linus Torvalds
Quoted 4 lines · Greg Kroah-Hartman
Here are a few PCI, USB, hwmon, and documentation patches against your latest git tree, they have all been in the past few -mm releases just fine.
Is there any reason you don't use git to sync up?
I did use git to make sure these patches all applied cleanly to your latest tree.
I wasn't using git to send stuff to you after -rc1, as it makes me make extra sure the stuff is really needed. Just a hold-over from when I thought we weren't supposed to use git to send stuff to you after -rc1.
If it's easier for you, I can use git to send you these, and future patches.
thanks,
greg k-h