mirror of https://gitee.com/openkylin/linux.git
Merge branches 'release', 'asus', 'bugzilla-8573', 'bugzilla-9995', 'bugzilla-10272', 'lockdep' and 'thermal' into release
This commit is contained in:
commit
d9ea1364d3
|
@ -225,8 +225,6 @@ kprobes.txt
|
||||||
- documents the kernel probes debugging feature.
|
- documents the kernel probes debugging feature.
|
||||||
kref.txt
|
kref.txt
|
||||||
- docs on adding reference counters (krefs) to kernel objects.
|
- docs on adding reference counters (krefs) to kernel objects.
|
||||||
laptop-mode.txt
|
|
||||||
- how to conserve battery power using laptop-mode.
|
|
||||||
laptops/
|
laptops/
|
||||||
- directory with laptop related info and laptop driver documentation.
|
- directory with laptop related info and laptop driver documentation.
|
||||||
ldm.txt
|
ldm.txt
|
||||||
|
@ -301,12 +299,8 @@ pcmcia/
|
||||||
- info on the Linux PCMCIA driver.
|
- info on the Linux PCMCIA driver.
|
||||||
pi-futex.txt
|
pi-futex.txt
|
||||||
- documentation on lightweight PI-futexes.
|
- documentation on lightweight PI-futexes.
|
||||||
pm.txt
|
|
||||||
- info on Linux power management support.
|
|
||||||
pnp.txt
|
pnp.txt
|
||||||
- Linux Plug and Play documentation.
|
- Linux Plug and Play documentation.
|
||||||
power_supply_class.txt
|
|
||||||
- Tells userspace about battery, UPS, AC or DC power supply properties
|
|
||||||
power/
|
power/
|
||||||
- directory with info on Linux PCI power management.
|
- directory with info on Linux PCI power management.
|
||||||
powerpc/
|
powerpc/
|
||||||
|
|
|
@ -1,15 +1,7 @@
|
||||||
Linux supports two methods of overriding the BIOS DSDT:
|
Linux supports a method of overriding the BIOS DSDT:
|
||||||
|
|
||||||
CONFIG_ACPI_CUSTOM_DSDT builds the image into the kernel.
|
CONFIG_ACPI_CUSTOM_DSDT builds the image into the kernel.
|
||||||
|
|
||||||
CONFIG_ACPI_CUSTOM_DSDT_INITRD adds the image to the initrd.
|
When to use this method is described in detail on the
|
||||||
|
|
||||||
When to use these methods is described in detail on the
|
|
||||||
Linux/ACPI home page:
|
Linux/ACPI home page:
|
||||||
http://www.lesswatts.org/projects/acpi/overridingDSDT.php
|
http://www.lesswatts.org/projects/acpi/overridingDSDT.php
|
||||||
|
|
||||||
Note that if both options are used, the DSDT supplied
|
|
||||||
by the INITRD method takes precedence.
|
|
||||||
|
|
||||||
Documentation/initramfs-add-dsdt.sh is provided for convenience
|
|
||||||
for use with the CONFIG_ACPI_CUSTOM_DSDT_INITRD method.
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Adds a DSDT file to the initrd (if it's an initramfs)
|
|
||||||
# first argument is the name of archive
|
|
||||||
# second argument is the name of the file to add
|
|
||||||
# The file will be copied as /DSDT.aml
|
|
||||||
|
|
||||||
# 20060126: fix "Premature end of file" with some old cpio (Roland Robic)
|
|
||||||
# 20060205: this time it should really work
|
|
||||||
|
|
||||||
# check the arguments
|
|
||||||
if [ $# -ne 2 ]; then
|
|
||||||
program_name=$(basename $0)
|
|
||||||
echo "\
|
|
||||||
$program_name: too few arguments
|
|
||||||
Usage: $program_name initrd-name.img DSDT-to-add.aml
|
|
||||||
Adds a DSDT file to an initrd (in initramfs format)
|
|
||||||
|
|
||||||
initrd-name.img: filename of the initrd in initramfs format
|
|
||||||
DSDT-to-add.aml: filename of the DSDT file to add
|
|
||||||
" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# we should check it's an initramfs
|
|
||||||
|
|
||||||
tempcpio=$(mktemp -d)
|
|
||||||
# cleanup on exit, hangup, interrupt, quit, termination
|
|
||||||
trap 'rm -rf $tempcpio' 0 1 2 3 15
|
|
||||||
|
|
||||||
# extract the archive
|
|
||||||
gunzip -c "$1" > "$tempcpio"/initramfs.cpio || exit 1
|
|
||||||
|
|
||||||
# copy the DSDT file at the root of the directory so that we can call it "/DSDT.aml"
|
|
||||||
cp -f "$2" "$tempcpio"/DSDT.aml
|
|
||||||
|
|
||||||
# add the file
|
|
||||||
cd "$tempcpio"
|
|
||||||
(echo DSDT.aml | cpio --quiet -H newc -o -A -O "$tempcpio"/initramfs.cpio) || exit 1
|
|
||||||
cd "$OLDPWD"
|
|
||||||
|
|
||||||
# re-compress the archive
|
|
||||||
gzip -c "$tempcpio"/initramfs.cpio > "$1"
|
|
||||||
|
|
|
@ -1506,13 +1506,13 @@ laptop_mode
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
laptop_mode is a knob that controls "laptop mode". All the things that are
|
laptop_mode is a knob that controls "laptop mode". All the things that are
|
||||||
controlled by this knob are discussed in Documentation/laptop-mode.txt.
|
controlled by this knob are discussed in Documentation/laptops/laptop-mode.txt.
|
||||||
|
|
||||||
block_dump
|
block_dump
|
||||||
----------
|
----------
|
||||||
|
|
||||||
block_dump enables block I/O debugging when set to a nonzero value. More
|
block_dump enables block I/O debugging when set to a nonzero value. More
|
||||||
information on block I/O debugging is in Documentation/laptop-mode.txt.
|
information on block I/O debugging is in Documentation/laptops/laptop-mode.txt.
|
||||||
|
|
||||||
swap_token_timeout
|
swap_token_timeout
|
||||||
------------------
|
------------------
|
||||||
|
|
|
@ -138,7 +138,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
strict -- Be less tolerant of platforms that are not
|
strict -- Be less tolerant of platforms that are not
|
||||||
strictly ACPI specification compliant.
|
strictly ACPI specification compliant.
|
||||||
|
|
||||||
See also Documentation/pm.txt, pci=noacpi
|
See also Documentation/power/pm.txt, pci=noacpi
|
||||||
|
|
||||||
acpi_apic_instance= [ACPI, IOAPIC]
|
acpi_apic_instance= [ACPI, IOAPIC]
|
||||||
Format: <int>
|
Format: <int>
|
||||||
|
@ -177,9 +177,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT
|
acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT
|
||||||
|
|
||||||
acpi_no_initrd_override [KNL,ACPI]
|
|
||||||
Disable loading custom ACPI tables from the initramfs
|
|
||||||
|
|
||||||
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
|
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
|
||||||
Format: To spoof as Windows 98: ="Microsoft Windows"
|
Format: To spoof as Windows 98: ="Microsoft Windows"
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
- This file
|
- This file
|
||||||
acer-wmi.txt
|
acer-wmi.txt
|
||||||
- information on the Acer Laptop WMI Extras driver.
|
- information on the Acer Laptop WMI Extras driver.
|
||||||
|
laptop-mode.txt
|
||||||
|
- how to conserve battery power using laptop-mode.
|
||||||
sony-laptop.txt
|
sony-laptop.txt
|
||||||
- Sony Notebook Control Driver (SNC) Readme.
|
- Sony Notebook Control Driver (SNC) Readme.
|
||||||
sonypi.txt
|
sonypi.txt
|
||||||
|
|
|
@ -48,7 +48,7 @@ DSDT.
|
||||||
|
|
||||||
To send me the DSDT, as root/sudo:
|
To send me the DSDT, as root/sudo:
|
||||||
|
|
||||||
cat /sys/firmware/acpi/DSDT > dsdt
|
cat /sys/firmware/acpi/tables/DSDT > dsdt
|
||||||
|
|
||||||
And send me the resulting 'dsdt' file.
|
And send me the resulting 'dsdt' file.
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ can be added to acer-wmi.
|
||||||
|
|
||||||
The LED is exposed through the LED subsystem, and can be found in:
|
The LED is exposed through the LED subsystem, and can be found in:
|
||||||
|
|
||||||
/sys/devices/platform/acer-wmi/leds/acer-mail:green/
|
/sys/devices/platform/acer-wmi/leds/acer-wmi::mail/
|
||||||
|
|
||||||
The mail LED is autodetected, so if you don't have one, the LED device won't
|
The mail LED is autodetected, so if you don't have one, the LED device won't
|
||||||
be registered.
|
be registered.
|
||||||
|
|
|
@ -14,6 +14,12 @@ notifiers.txt
|
||||||
- Registering suspend notifiers in device drivers
|
- Registering suspend notifiers in device drivers
|
||||||
pci.txt
|
pci.txt
|
||||||
- How the PCI Subsystem Does Power Management
|
- How the PCI Subsystem Does Power Management
|
||||||
|
pm.txt
|
||||||
|
- info on Linux power management support.
|
||||||
|
pm_qos_interface.txt
|
||||||
|
- info on Linux PM Quality of Service interface
|
||||||
|
power_supply_class.txt
|
||||||
|
- Tells userspace about battery, UPS, AC or DC power supply properties
|
||||||
s2ram.txt
|
s2ram.txt
|
||||||
- How to get suspend to ram working (and debug it when it isn't)
|
- How to get suspend to ram working (and debug it when it isn't)
|
||||||
states.txt
|
states.txt
|
||||||
|
|
|
@ -108,7 +108,7 @@ void pm_unregister_all(pm_callback cback);
|
||||||
* EINVAL if the request is not supported
|
* EINVAL if the request is not supported
|
||||||
* EBUSY if the device is now busy and cannot handle the request
|
* EBUSY if the device is now busy and cannot handle the request
|
||||||
* ENOMEM if the device was unable to handle the request due to memory
|
* ENOMEM if the device was unable to handle the request due to memory
|
||||||
*
|
*
|
||||||
* Details: The device request callback will be called before the
|
* Details: The device request callback will be called before the
|
||||||
* device/system enters a suspend state (ACPI D1-D3) or
|
* device/system enters a suspend state (ACPI D1-D3) or
|
||||||
* or after the device/system resumes from suspend (ACPI D0).
|
* or after the device/system resumes from suspend (ACPI D0).
|
|
@ -143,10 +143,10 @@ type Strings which represent the thermal zone type.
|
||||||
This is given by thermal zone driver as part of registration.
|
This is given by thermal zone driver as part of registration.
|
||||||
Eg: "ACPI thermal zone" indicates it's a ACPI thermal device
|
Eg: "ACPI thermal zone" indicates it's a ACPI thermal device
|
||||||
RO
|
RO
|
||||||
Optional
|
Required
|
||||||
|
|
||||||
temp Current temperature as reported by thermal zone (sensor)
|
temp Current temperature as reported by thermal zone (sensor)
|
||||||
Unit: degree Celsius
|
Unit: millidegree Celsius
|
||||||
RO
|
RO
|
||||||
Required
|
Required
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ mode One of the predefined values in [kernel, user]
|
||||||
charge of the thermal management.
|
charge of the thermal management.
|
||||||
|
|
||||||
trip_point_[0-*]_temp The temperature above which trip point will be fired
|
trip_point_[0-*]_temp The temperature above which trip point will be fired
|
||||||
Unit: degree Celsius
|
Unit: millidegree Celsius
|
||||||
RO
|
RO
|
||||||
Optional
|
Optional
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ type String which represents the type of device
|
||||||
eg. For memory controller device on intel_menlow platform:
|
eg. For memory controller device on intel_menlow platform:
|
||||||
this should be "Memory controller"
|
this should be "Memory controller"
|
||||||
RO
|
RO
|
||||||
Optional
|
Required
|
||||||
|
|
||||||
max_state The maximum permissible cooling state of this cooling device.
|
max_state The maximum permissible cooling state of this cooling device.
|
||||||
RO
|
RO
|
||||||
|
@ -219,16 +219,16 @@ the sys I/F structure will be built like this:
|
||||||
|
|
||||||
|thermal_zone1:
|
|thermal_zone1:
|
||||||
|-----type: ACPI thermal zone
|
|-----type: ACPI thermal zone
|
||||||
|-----temp: 37
|
|-----temp: 37000
|
||||||
|-----mode: kernel
|
|-----mode: kernel
|
||||||
|-----trip_point_0_temp: 100
|
|-----trip_point_0_temp: 100000
|
||||||
|-----trip_point_0_type: critical
|
|-----trip_point_0_type: critical
|
||||||
|-----trip_point_1_temp: 80
|
|-----trip_point_1_temp: 80000
|
||||||
|-----trip_point_1_type: passive
|
|-----trip_point_1_type: passive
|
||||||
|-----trip_point_2_temp: 70
|
|-----trip_point_2_temp: 70000
|
||||||
|-----trip_point_2_type: active[0]
|
|-----trip_point_2_type: active0
|
||||||
|-----trip_point_3_temp: 60
|
|-----trip_point_3_temp: 60000
|
||||||
|-----trip_point_3_type: active[1]
|
|-----trip_point_3_type: active1
|
||||||
|-----cdev0: --->/sys/class/thermal/cooling_device0
|
|-----cdev0: --->/sys/class/thermal/cooling_device0
|
||||||
|-----cdev0_trip_point: 1 /* cdev0 can be used for passive */
|
|-----cdev0_trip_point: 1 /* cdev0 can be used for passive */
|
||||||
|-----cdev1: --->/sys/class/thermal/cooling_device3
|
|-----cdev1: --->/sys/class/thermal/cooling_device3
|
||||||
|
|
|
@ -266,6 +266,15 @@ L: linux-acpi@vger.kernel.org
|
||||||
W: http://www.lesswatts.org/projects/acpi/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
AD1889 ALSA SOUND DRIVER
|
||||||
|
P: Kyle McMartin
|
||||||
|
M: kyle@parisc-linux.org
|
||||||
|
P: Thibaut Varene
|
||||||
|
M: T-Bone@parisc-linux.org
|
||||||
|
W: http://wiki.parisc-linux.org/AD1889
|
||||||
|
L: linux-parisc@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ADM1025 HARDWARE MONITOR DRIVER
|
ADM1025 HARDWARE MONITOR DRIVER
|
||||||
P: Jean Delvare
|
P: Jean Delvare
|
||||||
M: khali@linux-fr.org
|
M: khali@linux-fr.org
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 25
|
SUBLEVEL = 25
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Funky Weasel is Jiggy wit it
|
NAME = Funky Weasel is Jiggy wit it
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -330,6 +330,9 @@ config PCI_DOMAINS
|
||||||
config PCI_SYSCALL
|
config PCI_SYSCALL
|
||||||
def_bool PCI
|
def_bool PCI
|
||||||
|
|
||||||
|
config IOMMU_HELPER
|
||||||
|
def_bool PCI
|
||||||
|
|
||||||
config ALPHA_CORE_AGP
|
config ALPHA_CORE_AGP
|
||||||
bool
|
bool
|
||||||
depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL
|
depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <linux/scatterlist.h>
|
#include <linux/scatterlist.h>
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/iommu-helper.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/hwrpb.h>
|
#include <asm/hwrpb.h>
|
||||||
|
@ -125,14 +126,6 @@ iommu_arena_new(struct pci_controller *hose, dma_addr_t base,
|
||||||
return iommu_arena_new_node(0, hose, base, window_size, align);
|
return iommu_arena_new_node(0, hose, base, window_size, align);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int is_span_boundary(unsigned int index, unsigned int nr,
|
|
||||||
unsigned long shift,
|
|
||||||
unsigned long boundary_size)
|
|
||||||
{
|
|
||||||
shift = (shift + index) & (boundary_size - 1);
|
|
||||||
return shift + nr > boundary_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Must be called with the arena lock held */
|
/* Must be called with the arena lock held */
|
||||||
static long
|
static long
|
||||||
iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
|
iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
|
||||||
|
@ -147,7 +140,6 @@ iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
|
||||||
base = arena->dma_base >> PAGE_SHIFT;
|
base = arena->dma_base >> PAGE_SHIFT;
|
||||||
if (dev) {
|
if (dev) {
|
||||||
boundary_size = dma_get_seg_boundary(dev) + 1;
|
boundary_size = dma_get_seg_boundary(dev) + 1;
|
||||||
BUG_ON(!is_power_of_2(boundary_size));
|
|
||||||
boundary_size >>= PAGE_SHIFT;
|
boundary_size >>= PAGE_SHIFT;
|
||||||
} else {
|
} else {
|
||||||
boundary_size = 1UL << (32 - PAGE_SHIFT);
|
boundary_size = 1UL << (32 - PAGE_SHIFT);
|
||||||
|
@ -161,7 +153,7 @@ iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
|
||||||
|
|
||||||
again:
|
again:
|
||||||
while (i < n && p+i < nent) {
|
while (i < n && p+i < nent) {
|
||||||
if (!i && is_span_boundary(p, n, base, boundary_size)) {
|
if (!i && iommu_is_span_boundary(p, n, base, boundary_size)) {
|
||||||
p = ALIGN(p + 1, mask + 1);
|
p = ALIGN(p + 1, mask + 1);
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
# Modified for PA-RISC Linux by Paul Lahaie, Alex deVries,
|
# Modified for PA-RISC Linux by Paul Lahaie, Alex deVries,
|
||||||
# Mike Shaver, Helge Deller and Martin K. Petersen
|
# Mike Shaver, Helge Deller and Martin K. Petersen
|
||||||
#
|
#
|
||||||
|
|
||||||
|
KBUILD_DEFCONFIG := default_defconfig
|
||||||
|
|
||||||
NM = sh $(srctree)/arch/parisc/nm
|
NM = sh $(srctree)/arch/parisc/nm
|
||||||
CHECKFLAGS += -D__hppa__=1
|
CHECKFLAGS += -D__hppa__=1
|
||||||
|
|
||||||
|
|
|
@ -1080,6 +1080,9 @@ void pdc_io_reset_devices(void)
|
||||||
spin_unlock_irqrestore(&pdc_lock, flags);
|
spin_unlock_irqrestore(&pdc_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* locked by pdc_console_lock */
|
||||||
|
static int __attribute__((aligned(8))) iodc_retbuf[32];
|
||||||
|
static char __attribute__((aligned(64))) iodc_dbuf[4096];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pdc_iodc_print - Console print using IODC.
|
* pdc_iodc_print - Console print using IODC.
|
||||||
|
@ -1091,24 +1094,20 @@ void pdc_io_reset_devices(void)
|
||||||
* Since the HP console requires CR+LF to perform a 'newline', we translate
|
* Since the HP console requires CR+LF to perform a 'newline', we translate
|
||||||
* "\n" to "\r\n".
|
* "\n" to "\r\n".
|
||||||
*/
|
*/
|
||||||
int pdc_iodc_print(unsigned char *str, unsigned count)
|
int pdc_iodc_print(const unsigned char *str, unsigned count)
|
||||||
{
|
{
|
||||||
/* XXX Should we spinlock posx usage */
|
|
||||||
static int posx; /* for simple TAB-Simulation... */
|
static int posx; /* for simple TAB-Simulation... */
|
||||||
int __attribute__((aligned(8))) iodc_retbuf[32];
|
|
||||||
char __attribute__((aligned(64))) iodc_dbuf[4096];
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
memset(iodc_dbuf, 0, 4096);
|
for (i = 0; i < count && i < 79;) {
|
||||||
for (i = 0; i < count && i < 2048;) {
|
|
||||||
switch(str[i]) {
|
switch(str[i]) {
|
||||||
case '\n':
|
case '\n':
|
||||||
iodc_dbuf[i+0] = '\r';
|
iodc_dbuf[i+0] = '\r';
|
||||||
iodc_dbuf[i+1] = '\n';
|
iodc_dbuf[i+1] = '\n';
|
||||||
i += 2;
|
i += 2;
|
||||||
posx = 0;
|
posx = 0;
|
||||||
break;
|
goto print;
|
||||||
case '\t':
|
case '\t':
|
||||||
while (posx & 7) {
|
while (posx & 7) {
|
||||||
iodc_dbuf[i] = ' ';
|
iodc_dbuf[i] = ' ';
|
||||||
|
@ -1124,6 +1123,16 @@ int pdc_iodc_print(unsigned char *str, unsigned count)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if we're at the end of line, and not already inserting a newline,
|
||||||
|
* insert one anyway. iodc console doesn't claim to support >79 char
|
||||||
|
* lines. don't account for this in the return value.
|
||||||
|
*/
|
||||||
|
if (i == 79 && iodc_dbuf[i-1] != '\n') {
|
||||||
|
iodc_dbuf[i+0] = '\r';
|
||||||
|
iodc_dbuf[i+1] = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
print:
|
||||||
spin_lock_irqsave(&pdc_lock, flags);
|
spin_lock_irqsave(&pdc_lock, flags);
|
||||||
real32_call(PAGE0->mem_cons.iodc_io,
|
real32_call(PAGE0->mem_cons.iodc_io,
|
||||||
(unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
|
(unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
|
||||||
|
@ -1142,11 +1151,9 @@ int pdc_iodc_print(unsigned char *str, unsigned count)
|
||||||
*/
|
*/
|
||||||
int pdc_iodc_getc(void)
|
int pdc_iodc_getc(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
static int __attribute__((aligned(8))) iodc_retbuf[32];
|
|
||||||
static char __attribute__((aligned(64))) iodc_dbuf[4096];
|
|
||||||
int ch;
|
int ch;
|
||||||
int status;
|
int status;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
/* Bail if no console input device. */
|
/* Bail if no console input device. */
|
||||||
if (!PAGE0->mem_kbd.iodc_io)
|
if (!PAGE0->mem_kbd.iodc_io)
|
||||||
|
|
|
@ -274,7 +274,18 @@ static struct hp_hardware hp_hardware_list[] __devinitdata = {
|
||||||
{HPHW_NPROC,0x887,0x4,0x91,"Storm Peak Slow"},
|
{HPHW_NPROC,0x887,0x4,0x91,"Storm Peak Slow"},
|
||||||
{HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"},
|
{HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"},
|
||||||
{HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"},
|
{HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"},
|
||||||
{HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak"},
|
{HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak Slow"},
|
||||||
|
{HPHW_NPROC,0x88C,0x4,0x91,"Orca Mako+"},
|
||||||
|
{HPHW_NPROC,0x88D,0x4,0x91,"Rainier/Medel Mako+ Slow"},
|
||||||
|
{HPHW_NPROC,0x88E,0x4,0x91,"Rainier/Medel Mako+ Fast"},
|
||||||
|
{HPHW_NPROC,0x894,0x4,0x91,"Mt. Hamilton Fast Mako+"},
|
||||||
|
{HPHW_NPROC,0x895,0x4,0x91,"Storm Peak Slow Mako+"},
|
||||||
|
{HPHW_NPROC,0x896,0x4,0x91,"Storm Peak Fast Mako+"},
|
||||||
|
{HPHW_NPROC,0x897,0x4,0x91,"Storm Peak DC- Slow Mako+"},
|
||||||
|
{HPHW_NPROC,0x898,0x4,0x91,"Storm Peak DC- Fast Mako+"},
|
||||||
|
{HPHW_NPROC,0x899,0x4,0x91,"Mt. Hamilton Slow Mako+"},
|
||||||
|
{HPHW_NPROC,0x89B,0x4,0x91,"Crestone Peak Mako+ Slow"},
|
||||||
|
{HPHW_NPROC,0x89C,0x4,0x91,"Crestone Peak Mako+ Fast"},
|
||||||
{HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"},
|
{HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"},
|
||||||
{HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"},
|
{HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"},
|
||||||
{HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"},
|
{HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"},
|
||||||
|
|
|
@ -20,10 +20,11 @@
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
|
||||||
.level LEVEL
|
.level LEVEL
|
||||||
|
|
||||||
.data
|
__INITDATA
|
||||||
ENTRY(boot_args)
|
ENTRY(boot_args)
|
||||||
.word 0 /* arg0 */
|
.word 0 /* arg0 */
|
||||||
.word 0 /* arg1 */
|
.word 0 /* arg1 */
|
||||||
|
@ -31,7 +32,7 @@ ENTRY(boot_args)
|
||||||
.word 0 /* arg3 */
|
.word 0 /* arg3 */
|
||||||
END(boot_args)
|
END(boot_args)
|
||||||
|
|
||||||
.text
|
.section .text.head
|
||||||
.align 4
|
.align 4
|
||||||
.import init_thread_union,data
|
.import init_thread_union,data
|
||||||
.import fault_vector_20,code /* IVA parisc 2.0 32 bit */
|
.import fault_vector_20,code /* IVA parisc 2.0 32 bit */
|
||||||
|
@ -343,7 +344,7 @@ smp_slave_stext:
|
||||||
ENDPROC(stext)
|
ENDPROC(stext)
|
||||||
|
|
||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
.data
|
.section .data.read_mostly
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.export $global$,data
|
.export $global$,data
|
||||||
|
|
|
@ -52,28 +52,30 @@
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <asm/pdc.h> /* for iodc_call() proto and friends */
|
#include <asm/pdc.h> /* for iodc_call() proto and friends */
|
||||||
|
|
||||||
|
static spinlock_t pdc_console_lock = SPIN_LOCK_UNLOCKED;
|
||||||
|
|
||||||
static void pdc_console_write(struct console *co, const char *s, unsigned count)
|
static void pdc_console_write(struct console *co, const char *s, unsigned count)
|
||||||
{
|
{
|
||||||
pdc_iodc_print(s, count);
|
int i = 0;
|
||||||
}
|
unsigned long flags;
|
||||||
|
|
||||||
void pdc_printf(const char *fmt, ...)
|
spin_lock_irqsave(&pdc_console_lock, flags);
|
||||||
{
|
do {
|
||||||
va_list args;
|
i += pdc_iodc_print(s + i, count - i);
|
||||||
char buf[1024];
|
} while (i < count);
|
||||||
int i, len;
|
spin_unlock_irqrestore(&pdc_console_lock, flags);
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
len = vscnprintf(buf, sizeof(buf), fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
pdc_iodc_print(buf, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pdc_console_poll_key(struct console *co)
|
int pdc_console_poll_key(struct console *co)
|
||||||
{
|
{
|
||||||
return pdc_iodc_getc();
|
int c;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pdc_console_lock, flags);
|
||||||
|
c = pdc_iodc_getc();
|
||||||
|
spin_unlock_irqrestore(&pdc_console_lock, flags);
|
||||||
|
|
||||||
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pdc_console_setup(struct console *co, char *options)
|
static int pdc_console_setup(struct console *co, char *options)
|
||||||
|
|
|
@ -401,9 +401,12 @@
|
||||||
ENTRY_COMP(kexec_load) /* 300 */
|
ENTRY_COMP(kexec_load) /* 300 */
|
||||||
ENTRY_COMP(utimensat)
|
ENTRY_COMP(utimensat)
|
||||||
ENTRY_COMP(signalfd)
|
ENTRY_COMP(signalfd)
|
||||||
ENTRY_COMP(timerfd)
|
ENTRY_SAME(ni_syscall) /* was timerfd */
|
||||||
ENTRY_SAME(eventfd)
|
ENTRY_SAME(eventfd)
|
||||||
ENTRY_COMP(fallocate) /* 305 */
|
ENTRY_COMP(fallocate) /* 305 */
|
||||||
|
ENTRY_SAME(timerfd_create)
|
||||||
|
ENTRY_COMP(timerfd_settime)
|
||||||
|
ENTRY_COMP(timerfd_gettime)
|
||||||
|
|
||||||
/* Nothing yet */
|
/* Nothing yet */
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,9 @@
|
||||||
DEFINE_SPINLOCK(pa_dbit_lock);
|
DEFINE_SPINLOCK(pa_dbit_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void parisc_show_stack(struct task_struct *t, unsigned long *sp,
|
||||||
|
struct pt_regs *regs);
|
||||||
|
|
||||||
static int printbinary(char *buf, unsigned long x, int nbits)
|
static int printbinary(char *buf, unsigned long x, int nbits)
|
||||||
{
|
{
|
||||||
unsigned long mask = 1UL << (nbits - 1);
|
unsigned long mask = 1UL << (nbits - 1);
|
||||||
|
@ -148,6 +151,8 @@ void show_regs(struct pt_regs *regs)
|
||||||
print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]);
|
print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]);
|
||||||
printk(level);
|
printk(level);
|
||||||
print_symbol(" RP(r2): %s\n", regs->gr[2]);
|
print_symbol(" RP(r2): %s\n", regs->gr[2]);
|
||||||
|
|
||||||
|
parisc_show_stack(current, NULL, regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -181,11 +186,19 @@ static void do_show_stack(struct unwind_frame_info *info)
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_stack(struct task_struct *task, unsigned long *s)
|
void parisc_show_stack(struct task_struct *task, unsigned long *sp,
|
||||||
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct unwind_frame_info info;
|
struct unwind_frame_info info;
|
||||||
|
struct task_struct *t;
|
||||||
|
|
||||||
if (!task) {
|
t = task ? task : current;
|
||||||
|
if (regs) {
|
||||||
|
unwind_frame_init(&info, t, regs);
|
||||||
|
goto show_stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t == current) {
|
||||||
unsigned long sp;
|
unsigned long sp;
|
||||||
|
|
||||||
HERE:
|
HERE:
|
||||||
|
@ -201,12 +214,18 @@ void show_stack(struct task_struct *task, unsigned long *s)
|
||||||
unwind_frame_init(&info, current, &r);
|
unwind_frame_init(&info, current, &r);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
unwind_frame_init_from_blocked_task(&info, task);
|
unwind_frame_init_from_blocked_task(&info, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
show_stack:
|
||||||
do_show_stack(&info);
|
do_show_stack(&info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void show_stack(struct task_struct *t, unsigned long *sp)
|
||||||
|
{
|
||||||
|
return parisc_show_stack(t, sp, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
int is_valid_bugaddr(unsigned long iaoq)
|
int is_valid_bugaddr(unsigned long iaoq)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -1259,7 +1259,7 @@ menuconfig APM
|
||||||
machines with more than one CPU.
|
machines with more than one CPU.
|
||||||
|
|
||||||
In order to use APM, you will need supporting software. For location
|
In order to use APM, you will need supporting software. For location
|
||||||
and more information, read <file:Documentation/pm.txt> and the
|
and more information, read <file:Documentation/power/pm.txt> and the
|
||||||
Battery Powered Linux mini-HOWTO, available from
|
Battery Powered Linux mini-HOWTO, available from
|
||||||
<http://www.tldp.org/docs.html#howto>.
|
<http://www.tldp.org/docs.html#howto>.
|
||||||
|
|
||||||
|
|
|
@ -66,11 +66,11 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) {
|
if (tx) {
|
||||||
pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: (async) len: %zu\n", __func__, len);
|
||||||
async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
|
async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
|
||||||
} else {
|
} else {
|
||||||
void *dest_buf, *src_buf;
|
void *dest_buf, *src_buf;
|
||||||
pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: (sync) len: %zu\n", __func__, len);
|
||||||
|
|
||||||
/* wait for any prerequisite operations */
|
/* wait for any prerequisite operations */
|
||||||
if (depend_tx) {
|
if (depend_tx) {
|
||||||
|
@ -80,7 +80,7 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
|
||||||
BUG_ON(depend_tx->ack);
|
BUG_ON(depend_tx->ack);
|
||||||
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
||||||
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset;
|
dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset;
|
||||||
|
|
|
@ -63,11 +63,11 @@ async_memset(struct page *dest, int val, unsigned int offset,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx) {
|
if (tx) {
|
||||||
pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: (async) len: %zu\n", __func__, len);
|
||||||
async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
|
async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
|
||||||
} else { /* run the memset synchronously */
|
} else { /* run the memset synchronously */
|
||||||
void *dest_buf;
|
void *dest_buf;
|
||||||
pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: (sync) len: %zu\n", __func__, len);
|
||||||
|
|
||||||
dest_buf = (void *) (((char *) page_address(dest)) + offset);
|
dest_buf = (void *) (((char *) page_address(dest)) + offset);
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ async_memset(struct page *dest, int val, unsigned int offset,
|
||||||
BUG_ON(depend_tx->ack);
|
BUG_ON(depend_tx->ack);
|
||||||
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
||||||
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(dest_buf, val, len);
|
memset(dest_buf, val, len);
|
||||||
|
|
|
@ -472,11 +472,11 @@ async_trigger_callback(enum async_tx_flags flags,
|
||||||
tx = NULL;
|
tx = NULL;
|
||||||
|
|
||||||
if (tx) {
|
if (tx) {
|
||||||
pr_debug("%s: (async)\n", __FUNCTION__);
|
pr_debug("%s: (async)\n", __func__);
|
||||||
|
|
||||||
async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
|
async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
|
||||||
} else {
|
} else {
|
||||||
pr_debug("%s: (sync)\n", __FUNCTION__);
|
pr_debug("%s: (sync)\n", __func__);
|
||||||
|
|
||||||
/* wait for any prerequisite operations */
|
/* wait for any prerequisite operations */
|
||||||
if (depend_tx) {
|
if (depend_tx) {
|
||||||
|
@ -486,7 +486,7 @@ async_trigger_callback(enum async_tx_flags flags,
|
||||||
BUG_ON(depend_tx->ack);
|
BUG_ON(depend_tx->ack);
|
||||||
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
||||||
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param);
|
async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param);
|
||||||
|
|
|
@ -47,7 +47,7 @@ do_async_xor(struct dma_device *device,
|
||||||
int i;
|
int i;
|
||||||
unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
|
unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
|
||||||
|
|
||||||
pr_debug("%s: len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: len: %zu\n", __func__, len);
|
||||||
|
|
||||||
dma_dest = dma_map_page(device->dev, dest, offset, len,
|
dma_dest = dma_map_page(device->dev, dest, offset, len,
|
||||||
DMA_FROM_DEVICE);
|
DMA_FROM_DEVICE);
|
||||||
|
@ -86,7 +86,7 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset,
|
||||||
void *_dest;
|
void *_dest;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
pr_debug("%s: len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: len: %zu\n", __func__, len);
|
||||||
|
|
||||||
/* reuse the 'src_list' array to convert to buffer pointers */
|
/* reuse the 'src_list' array to convert to buffer pointers */
|
||||||
for (i = 0; i < src_cnt; i++)
|
for (i = 0; i < src_cnt; i++)
|
||||||
|
@ -196,7 +196,7 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset,
|
||||||
DMA_ERROR)
|
DMA_ERROR)
|
||||||
panic("%s: DMA_ERROR waiting for "
|
panic("%s: DMA_ERROR waiting for "
|
||||||
"depend_tx\n",
|
"depend_tx\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
do_sync_xor(dest, &src_list[src_off], offset,
|
do_sync_xor(dest, &src_list[src_off], offset,
|
||||||
|
@ -276,7 +276,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
|
||||||
unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
|
unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: (async) len: %zu\n", __func__, len);
|
||||||
|
|
||||||
for (i = 0; i < src_cnt; i++)
|
for (i = 0; i < src_cnt; i++)
|
||||||
dma_src[i] = dma_map_page(device->dev, src_list[i],
|
dma_src[i] = dma_map_page(device->dev, src_list[i],
|
||||||
|
@ -299,7 +299,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
|
||||||
} else {
|
} else {
|
||||||
unsigned long xor_flags = flags;
|
unsigned long xor_flags = flags;
|
||||||
|
|
||||||
pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len);
|
pr_debug("%s: (sync) len: %zu\n", __func__, len);
|
||||||
|
|
||||||
xor_flags |= ASYNC_TX_XOR_DROP_DST;
|
xor_flags |= ASYNC_TX_XOR_DROP_DST;
|
||||||
xor_flags &= ~ASYNC_TX_ACK;
|
xor_flags &= ~ASYNC_TX_ACK;
|
||||||
|
@ -310,7 +310,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
|
||||||
if (tx) {
|
if (tx) {
|
||||||
if (dma_wait_for_async_tx(tx) == DMA_ERROR)
|
if (dma_wait_for_async_tx(tx) == DMA_ERROR)
|
||||||
panic("%s: DMA_ERROR waiting for tx\n",
|
panic("%s: DMA_ERROR waiting for tx\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
async_tx_ack(tx);
|
async_tx_ack(tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -283,34 +283,22 @@ config ACPI_TOSHIBA
|
||||||
If you have a legacy free Toshiba laptop (such as the Libretto L1
|
If you have a legacy free Toshiba laptop (such as the Libretto L1
|
||||||
series), say Y.
|
series), say Y.
|
||||||
|
|
||||||
config ACPI_CUSTOM_DSDT
|
config ACPI_CUSTOM_DSDT_FILE
|
||||||
bool "Include Custom DSDT"
|
string "Custom DSDT Table file to include"
|
||||||
|
default ""
|
||||||
depends on !STANDALONE
|
depends on !STANDALONE
|
||||||
default n
|
|
||||||
help
|
help
|
||||||
This option supports a custom DSDT by linking it into the kernel.
|
This option supports a custom DSDT by linking it into the kernel.
|
||||||
See Documentation/acpi/dsdt-override.txt
|
See Documentation/acpi/dsdt-override.txt
|
||||||
|
|
||||||
If unsure, say N.
|
|
||||||
|
|
||||||
config ACPI_CUSTOM_DSDT_FILE
|
|
||||||
string "Custom DSDT Table file to include"
|
|
||||||
depends on ACPI_CUSTOM_DSDT
|
|
||||||
default ""
|
|
||||||
help
|
|
||||||
Enter the full path name to the file which includes the AmlCode
|
Enter the full path name to the file which includes the AmlCode
|
||||||
declaration.
|
declaration.
|
||||||
|
|
||||||
config ACPI_CUSTOM_DSDT_INITRD
|
If unsure, don't enter a file name.
|
||||||
bool "Read Custom DSDT from initramfs"
|
|
||||||
depends on BLK_DEV_INITRD
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
This option supports a custom DSDT by optionally loading it from initrd.
|
|
||||||
See Documentation/acpi/dsdt-override.txt
|
|
||||||
|
|
||||||
If you are not using this feature now, but may use it later,
|
config ACPI_CUSTOM_DSDT
|
||||||
it is safe to say Y here.
|
bool
|
||||||
|
default ACPI_CUSTOM_DSDT_FILE != ""
|
||||||
|
|
||||||
config ACPI_BLACKLIST_YEAR
|
config ACPI_BLACKLIST_YEAR
|
||||||
int "Disable ACPI for systems before Jan 1st this year" if X86_32
|
int "Disable ACPI for systems before Jan 1st this year" if X86_32
|
||||||
|
|
|
@ -293,13 +293,12 @@ static int extract_package(struct acpi_battery *battery,
|
||||||
strncpy(ptr, (u8 *)&element->integer.value,
|
strncpy(ptr, (u8 *)&element->integer.value,
|
||||||
sizeof(acpi_integer));
|
sizeof(acpi_integer));
|
||||||
ptr[sizeof(acpi_integer)] = 0;
|
ptr[sizeof(acpi_integer)] = 0;
|
||||||
} else return -EFAULT;
|
} else
|
||||||
|
*ptr = 0; /* don't have value */
|
||||||
} else {
|
} else {
|
||||||
if (element->type == ACPI_TYPE_INTEGER) {
|
int *x = (int *)((u8 *)battery + offsets[i].offset);
|
||||||
int *x = (int *)((u8 *)battery +
|
*x = (element->type == ACPI_TYPE_INTEGER) ?
|
||||||
offsets[i].offset);
|
element->integer.value : -1;
|
||||||
*x = element->integer.value;
|
|
||||||
} else return -EFAULT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -776,7 +776,7 @@ static int __init acpi_init(void)
|
||||||
|
|
||||||
acpi_kobj = kobject_create_and_add("acpi", firmware_kobj);
|
acpi_kobj = kobject_create_and_add("acpi", firmware_kobj);
|
||||||
if (!acpi_kobj) {
|
if (!acpi_kobj) {
|
||||||
printk(KERN_WARNING "%s: kset create error\n", __FUNCTION__);
|
printk(KERN_WARNING "%s: kset create error\n", __func__);
|
||||||
acpi_kobj = NULL;
|
acpi_kobj = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -449,6 +449,7 @@ static int acpi_button_add(struct acpi_device *device)
|
||||||
input->phys = button->phys;
|
input->phys = button->phys;
|
||||||
input->id.bustype = BUS_HOST;
|
input->id.bustype = BUS_HOST;
|
||||||
input->id.product = button->type;
|
input->id.product = button->type;
|
||||||
|
input->dev.parent = &device->dev;
|
||||||
|
|
||||||
switch (button->type) {
|
switch (button->type) {
|
||||||
case ACPI_BUTTON_TYPE_POWER:
|
case ACPI_BUTTON_TYPE_POWER:
|
||||||
|
|
|
@ -129,6 +129,7 @@ static struct acpi_ec {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
wait_queue_head_t wait;
|
wait_queue_head_t wait;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
atomic_t irq_count;
|
||||||
u8 handlers_installed;
|
u8 handlers_installed;
|
||||||
} *boot_ec, *first_ec;
|
} *boot_ec, *first_ec;
|
||||||
|
|
||||||
|
@ -181,6 +182,8 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
atomic_set(&ec->irq_count, 0);
|
||||||
|
|
||||||
if (unlikely(event == ACPI_EC_EVENT_OBF_1 &&
|
if (unlikely(event == ACPI_EC_EVENT_OBF_1 &&
|
||||||
test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags)))
|
test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags)))
|
||||||
force_poll = 1;
|
force_poll = 1;
|
||||||
|
@ -227,6 +230,7 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
|
||||||
while (time_before(jiffies, delay)) {
|
while (time_before(jiffies, delay)) {
|
||||||
if (acpi_ec_check_status(ec, event))
|
if (acpi_ec_check_status(ec, event))
|
||||||
goto end;
|
goto end;
|
||||||
|
msleep(5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pr_err(PREFIX "acpi_ec_wait timeout,"
|
pr_err(PREFIX "acpi_ec_wait timeout,"
|
||||||
|
@ -529,6 +533,13 @@ static u32 acpi_ec_gpe_handler(void *data)
|
||||||
struct acpi_ec *ec = data;
|
struct acpi_ec *ec = data;
|
||||||
|
|
||||||
pr_debug(PREFIX "~~~> interrupt\n");
|
pr_debug(PREFIX "~~~> interrupt\n");
|
||||||
|
atomic_inc(&ec->irq_count);
|
||||||
|
if (atomic_read(&ec->irq_count) > 5) {
|
||||||
|
pr_err(PREFIX "GPE storm detected, disabling EC GPE\n");
|
||||||
|
acpi_disable_gpe(NULL, ec->gpe, ACPI_ISR);
|
||||||
|
clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
|
||||||
|
return ACPI_INTERRUPT_HANDLED;
|
||||||
|
}
|
||||||
clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
|
clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
|
||||||
if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
|
if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
|
||||||
wake_up(&ec->wait);
|
wake_up(&ec->wait);
|
||||||
|
@ -943,11 +954,7 @@ int __init acpi_ec_ecdt_probe(void)
|
||||||
boot_ec->command_addr = ecdt_ptr->control.address;
|
boot_ec->command_addr = ecdt_ptr->control.address;
|
||||||
boot_ec->data_addr = ecdt_ptr->data.address;
|
boot_ec->data_addr = ecdt_ptr->data.address;
|
||||||
boot_ec->gpe = ecdt_ptr->gpe;
|
boot_ec->gpe = ecdt_ptr->gpe;
|
||||||
if (ACPI_FAILURE(acpi_get_handle(NULL, ecdt_ptr->id,
|
boot_ec->handle = ACPI_ROOT_OBJECT;
|
||||||
&boot_ec->handle))) {
|
|
||||||
pr_info("Failed to locate handle for boot EC\n");
|
|
||||||
boot_ec->handle = ACPI_ROOT_OBJECT;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* This workaround is needed only on some broken machines,
|
/* This workaround is needed only on some broken machines,
|
||||||
* which require early EC, but fail to provide ECDT */
|
* which require early EC, but fail to provide ECDT */
|
||||||
|
|
|
@ -91,10 +91,6 @@ static DEFINE_SPINLOCK(acpi_res_lock);
|
||||||
#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
|
#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
|
||||||
static char osi_additional_string[OSI_STRING_LENGTH_MAX];
|
static char osi_additional_string[OSI_STRING_LENGTH_MAX];
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
|
|
||||||
static int acpi_no_initrd_override;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Ode to _OSI(Linux)"
|
* "Ode to _OSI(Linux)"
|
||||||
*
|
*
|
||||||
|
@ -324,67 +320,6 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
|
|
||||||
static struct acpi_table_header *acpi_find_dsdt_initrd(void)
|
|
||||||
{
|
|
||||||
struct file *firmware_file;
|
|
||||||
mm_segment_t oldfs;
|
|
||||||
unsigned long len, len2;
|
|
||||||
struct acpi_table_header *dsdt_buffer, *ret = NULL;
|
|
||||||
struct kstat stat;
|
|
||||||
char *ramfs_dsdt_name = "/DSDT.aml";
|
|
||||||
|
|
||||||
printk(KERN_INFO PREFIX "Checking initramfs for custom DSDT\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Never do this at home, only the user-space is allowed to open a file.
|
|
||||||
* The clean way would be to use the firmware loader.
|
|
||||||
* But this code must be run before there is any userspace available.
|
|
||||||
* A static/init firmware infrastructure doesn't exist yet...
|
|
||||||
*/
|
|
||||||
if (vfs_stat(ramfs_dsdt_name, &stat) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
len = stat.size;
|
|
||||||
/* check especially against empty files */
|
|
||||||
if (len <= 4) {
|
|
||||||
printk(KERN_ERR PREFIX "Failed: DSDT only %lu bytes.\n", len);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
firmware_file = filp_open(ramfs_dsdt_name, O_RDONLY, 0);
|
|
||||||
if (IS_ERR(firmware_file)) {
|
|
||||||
printk(KERN_ERR PREFIX "Failed to open %s.\n", ramfs_dsdt_name);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
dsdt_buffer = kmalloc(len, GFP_ATOMIC);
|
|
||||||
if (!dsdt_buffer) {
|
|
||||||
printk(KERN_ERR PREFIX "Failed to allocate %lu bytes.\n", len);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
oldfs = get_fs();
|
|
||||||
set_fs(KERNEL_DS);
|
|
||||||
len2 = vfs_read(firmware_file, (char __user *)dsdt_buffer, len,
|
|
||||||
&firmware_file->f_pos);
|
|
||||||
set_fs(oldfs);
|
|
||||||
if (len2 < len) {
|
|
||||||
printk(KERN_ERR PREFIX "Failed to read %lu bytes from %s.\n",
|
|
||||||
len, ramfs_dsdt_name);
|
|
||||||
ACPI_FREE(dsdt_buffer);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
printk(KERN_INFO PREFIX "Found %lu byte DSDT in %s.\n",
|
|
||||||
len, ramfs_dsdt_name);
|
|
||||||
ret = dsdt_buffer;
|
|
||||||
err:
|
|
||||||
filp_close(firmware_file, NULL);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
acpi_status
|
acpi_status
|
||||||
acpi_os_table_override(struct acpi_table_header * existing_table,
|
acpi_os_table_override(struct acpi_table_header * existing_table,
|
||||||
struct acpi_table_header ** new_table)
|
struct acpi_table_header ** new_table)
|
||||||
|
@ -397,16 +332,6 @@ acpi_os_table_override(struct acpi_table_header * existing_table,
|
||||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
||||||
if (strncmp(existing_table->signature, "DSDT", 4) == 0)
|
if (strncmp(existing_table->signature, "DSDT", 4) == 0)
|
||||||
*new_table = (struct acpi_table_header *)AmlCode;
|
*new_table = (struct acpi_table_header *)AmlCode;
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
|
|
||||||
if ((strncmp(existing_table->signature, "DSDT", 4) == 0) &&
|
|
||||||
!acpi_no_initrd_override) {
|
|
||||||
struct acpi_table_header *initrd_table;
|
|
||||||
|
|
||||||
initrd_table = acpi_find_dsdt_initrd();
|
|
||||||
if (initrd_table)
|
|
||||||
*new_table = initrd_table;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
if (*new_table != NULL) {
|
if (*new_table != NULL) {
|
||||||
printk(KERN_WARNING PREFIX "Override [%4.4s-%8.8s], "
|
printk(KERN_WARNING PREFIX "Override [%4.4s-%8.8s], "
|
||||||
|
@ -418,15 +343,6 @@ acpi_os_table_override(struct acpi_table_header * existing_table,
|
||||||
return AE_OK;
|
return AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD
|
|
||||||
static int __init acpi_no_initrd_override_setup(char *s)
|
|
||||||
{
|
|
||||||
acpi_no_initrd_override = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
__setup("acpi_no_initrd_override", acpi_no_initrd_override_setup);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static irqreturn_t acpi_irq(int irq, void *dev_id)
|
static irqreturn_t acpi_irq(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
u32 handled;
|
u32 handled;
|
||||||
|
@ -1237,7 +1153,7 @@ int acpi_check_resource_conflict(struct resource *res)
|
||||||
|
|
||||||
if (clash) {
|
if (clash) {
|
||||||
if (acpi_enforce_resources != ENFORCE_RESOURCES_NO) {
|
if (acpi_enforce_resources != ENFORCE_RESOURCES_NO) {
|
||||||
printk(KERN_INFO "%sACPI: %s resource %s [0x%llx-0x%llx]"
|
printk("%sACPI: %s resource %s [0x%llx-0x%llx]"
|
||||||
" conflicts with ACPI region %s"
|
" conflicts with ACPI region %s"
|
||||||
" [0x%llx-0x%llx]\n",
|
" [0x%llx-0x%llx]\n",
|
||||||
acpi_enforce_resources == ENFORCE_RESOURCES_LAX
|
acpi_enforce_resources == ENFORCE_RESOURCES_LAX
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <linux/dmi.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
@ -76,6 +77,101 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(int segment,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* http://bugzilla.kernel.org/show_bug.cgi?id=4773 */
|
||||||
|
static struct dmi_system_id medion_md9580[] = {
|
||||||
|
{
|
||||||
|
.ident = "Medion MD9580-F laptop",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "A555"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* http://bugzilla.kernel.org/show_bug.cgi?id=5044 */
|
||||||
|
static struct dmi_system_id dell_optiplex[] = {
|
||||||
|
{
|
||||||
|
.ident = "Dell Optiplex GX1",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX1 600S+"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* http://bugzilla.kernel.org/show_bug.cgi?id=10138 */
|
||||||
|
static struct dmi_system_id hp_t5710[] = {
|
||||||
|
{
|
||||||
|
.ident = "HP t5710",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "hp t5000 series"),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "098Ch"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct prt_quirk {
|
||||||
|
struct dmi_system_id *system;
|
||||||
|
unsigned int segment;
|
||||||
|
unsigned int bus;
|
||||||
|
unsigned int device;
|
||||||
|
unsigned char pin;
|
||||||
|
char *source; /* according to BIOS */
|
||||||
|
char *actual_source;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These systems have incorrect _PRT entries. The BIOS claims the PCI
|
||||||
|
* interrupt at the listed segment/bus/device/pin is connected to the first
|
||||||
|
* link device, but it is actually connected to the second.
|
||||||
|
*/
|
||||||
|
static struct prt_quirk prt_quirks[] = {
|
||||||
|
{ medion_md9580, 0, 0, 9, 'A',
|
||||||
|
"\\_SB_.PCI0.ISA.LNKA",
|
||||||
|
"\\_SB_.PCI0.ISA.LNKB"},
|
||||||
|
{ dell_optiplex, 0, 0, 0xd, 'A',
|
||||||
|
"\\_SB_.LNKB",
|
||||||
|
"\\_SB_.LNKA"},
|
||||||
|
{ hp_t5710, 0, 0, 1, 'A',
|
||||||
|
"\\_SB_.PCI0.LNK1",
|
||||||
|
"\\_SB_.PCI0.LNK3"},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_prt_fixups(struct acpi_prt_entry *entry, struct acpi_pci_routing_table *prt)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct prt_quirk *quirk;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(prt_quirks); i++) {
|
||||||
|
quirk = &prt_quirks[i];
|
||||||
|
|
||||||
|
/* All current quirks involve link devices, not GSIs */
|
||||||
|
if (!prt->source)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (dmi_check_system(quirk->system) &&
|
||||||
|
entry->id.segment == quirk->segment &&
|
||||||
|
entry->id.bus == quirk->bus &&
|
||||||
|
entry->id.device == quirk->device &&
|
||||||
|
entry->pin + 'A' == quirk->pin &&
|
||||||
|
!strcmp(prt->source, quirk->source) &&
|
||||||
|
strlen(prt->source) >= strlen(quirk->actual_source)) {
|
||||||
|
printk(KERN_WARNING PREFIX "firmware reports "
|
||||||
|
"%04x:%02x:%02x[%c] connected to %s; "
|
||||||
|
"changing to %s\n",
|
||||||
|
entry->id.segment, entry->id.bus,
|
||||||
|
entry->id.device, 'A' + entry->pin,
|
||||||
|
prt->source, quirk->actual_source);
|
||||||
|
strcpy(prt->source, quirk->actual_source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
acpi_pci_irq_add_entry(acpi_handle handle,
|
acpi_pci_irq_add_entry(acpi_handle handle,
|
||||||
int segment, int bus, struct acpi_pci_routing_table *prt)
|
int segment, int bus, struct acpi_pci_routing_table *prt)
|
||||||
|
@ -96,6 +192,8 @@ acpi_pci_irq_add_entry(acpi_handle handle,
|
||||||
entry->id.function = prt->address & 0xFFFF;
|
entry->id.function = prt->address & 0xFFFF;
|
||||||
entry->pin = prt->pin;
|
entry->pin = prt->pin;
|
||||||
|
|
||||||
|
do_prt_fixups(entry, prt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Type 1: Dynamic
|
* Type 1: Dynamic
|
||||||
* ---------------
|
* ---------------
|
||||||
|
|
|
@ -184,7 +184,7 @@ static void acpi_pci_bridge_scan(struct acpi_device *device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_pci_root_add(struct acpi_device *device)
|
static int __devinit acpi_pci_root_add(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
struct acpi_pci_root *root = NULL;
|
struct acpi_pci_root *root = NULL;
|
||||||
|
|
|
@ -840,17 +840,19 @@ static int is_processor_present(acpi_handle handle)
|
||||||
|
|
||||||
|
|
||||||
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
|
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
|
||||||
/*
|
|
||||||
* if a processor object does not have an _STA object,
|
|
||||||
* OSPM assumes that the processor is present.
|
|
||||||
*/
|
|
||||||
if (status == AE_NOT_FOUND)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT))
|
if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
ACPI_EXCEPTION((AE_INFO, status, "Processor Device is not present"));
|
/*
|
||||||
|
* _STA is mandatory for a processor that supports hot plug
|
||||||
|
*/
|
||||||
|
if (status == AE_NOT_FOUND)
|
||||||
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
"Processor does not support hot plug\n"));
|
||||||
|
else
|
||||||
|
ACPI_EXCEPTION((AE_INFO, status,
|
||||||
|
"Processor Device is not present"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -886,8 +888,8 @@ int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void __ref acpi_processor_hotplug_notify(acpi_handle handle,
|
||||||
acpi_processor_hotplug_notify(acpi_handle handle, u32 event, void *data)
|
u32 event, void *data)
|
||||||
{
|
{
|
||||||
struct acpi_processor *pr;
|
struct acpi_processor *pr;
|
||||||
struct acpi_device *device = NULL;
|
struct acpi_device *device = NULL;
|
||||||
|
@ -897,9 +899,10 @@ acpi_processor_hotplug_notify(acpi_handle handle, u32 event, void *data)
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ACPI_NOTIFY_BUS_CHECK:
|
case ACPI_NOTIFY_BUS_CHECK:
|
||||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||||
printk("Processor driver received %s event\n",
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
"Processor driver received %s event\n",
|
||||||
(event == ACPI_NOTIFY_BUS_CHECK) ?
|
(event == ACPI_NOTIFY_BUS_CHECK) ?
|
||||||
"ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK");
|
"ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"));
|
||||||
|
|
||||||
if (!is_processor_present(handle))
|
if (!is_processor_present(handle))
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -216,8 +216,10 @@ static void acpi_safe_halt(void)
|
||||||
* test NEED_RESCHED:
|
* test NEED_RESCHED:
|
||||||
*/
|
*/
|
||||||
smp_mb();
|
smp_mb();
|
||||||
if (!need_resched())
|
if (!need_resched()) {
|
||||||
safe_halt();
|
safe_halt();
|
||||||
|
local_irq_disable();
|
||||||
|
}
|
||||||
current_thread_info()->status |= TS_POLLING;
|
current_thread_info()->status |= TS_POLLING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,7 +423,9 @@ static void acpi_processor_idle(void)
|
||||||
else
|
else
|
||||||
acpi_safe_halt();
|
acpi_safe_halt();
|
||||||
|
|
||||||
local_irq_enable();
|
if (irqs_disabled())
|
||||||
|
local_irq_enable();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,7 +534,9 @@ static void acpi_processor_idle(void)
|
||||||
* skew otherwise.
|
* skew otherwise.
|
||||||
*/
|
*/
|
||||||
sleep_ticks = 0xFFFFFFFF;
|
sleep_ticks = 0xFFFFFFFF;
|
||||||
local_irq_enable();
|
if (irqs_disabled())
|
||||||
|
local_irq_enable();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_STATE_C2:
|
case ACPI_STATE_C2:
|
||||||
|
|
|
@ -609,7 +609,8 @@ acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd)
|
||||||
status = acpi_evaluate_object(handle, "_EJD", NULL, &buffer);
|
status = acpi_evaluate_object(handle, "_EJD", NULL, &buffer);
|
||||||
if (ACPI_SUCCESS(status)) {
|
if (ACPI_SUCCESS(status)) {
|
||||||
obj = buffer.pointer;
|
obj = buffer.pointer;
|
||||||
status = acpi_get_handle(NULL, obj->string.pointer, ejd);
|
status = acpi_get_handle(ACPI_ROOT_OBJECT, obj->string.pointer,
|
||||||
|
ejd);
|
||||||
kfree(buffer.pointer);
|
kfree(buffer.pointer);
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
|
@ -966,7 +967,7 @@ static void acpi_device_set_id(struct acpi_device *device,
|
||||||
case ACPI_BUS_TYPE_DEVICE:
|
case ACPI_BUS_TYPE_DEVICE:
|
||||||
status = acpi_get_object_info(handle, &buffer);
|
status = acpi_get_object_info(handle, &buffer);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
printk(KERN_ERR PREFIX "%s: Error reading device info\n", __FUNCTION__);
|
printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -504,7 +504,7 @@ static void acpi_power_off_prepare(void)
|
||||||
static void acpi_power_off(void)
|
static void acpi_power_off(void)
|
||||||
{
|
{
|
||||||
/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
|
/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
|
||||||
printk("%s called\n", __FUNCTION__);
|
printk("%s called\n", __func__);
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
acpi_enable_wakeup_device(ACPI_STATE_S5);
|
acpi_enable_wakeup_device(ACPI_STATE_S5);
|
||||||
acpi_enter_sleep_state(ACPI_STATE_S5);
|
acpi_enter_sleep_state(ACPI_STATE_S5);
|
||||||
|
|
|
@ -319,7 +319,7 @@ void acpi_irq_stats_init(void)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
for (i = 0; i < num_counters; ++i) {
|
for (i = 0; i < num_counters; ++i) {
|
||||||
char buffer[10];
|
char buffer[12];
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
if (i < num_gpes)
|
if (i < num_gpes)
|
||||||
|
|
|
@ -879,6 +879,8 @@ static void acpi_thermal_check(void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sys I/F for generic thermal sysfs support */
|
/* sys I/F for generic thermal sysfs support */
|
||||||
|
#define KELVIN_TO_MILLICELSIUS(t) (t * 100 - 273200)
|
||||||
|
|
||||||
static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf)
|
static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf)
|
||||||
{
|
{
|
||||||
struct acpi_thermal *tz = thermal->devdata;
|
struct acpi_thermal *tz = thermal->devdata;
|
||||||
|
@ -886,7 +888,7 @@ static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf)
|
||||||
if (!tz)
|
if (!tz)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS(tz->temperature));
|
return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(tz->temperature));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char enabled[] = "kernel";
|
static const char enabled[] = "kernel";
|
||||||
|
@ -980,21 +982,21 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal,
|
||||||
|
|
||||||
if (tz->trips.critical.flags.valid) {
|
if (tz->trips.critical.flags.valid) {
|
||||||
if (!trip)
|
if (!trip)
|
||||||
return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS(
|
return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(
|
||||||
tz->trips.critical.temperature));
|
tz->trips.critical.temperature));
|
||||||
trip--;
|
trip--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tz->trips.hot.flags.valid) {
|
if (tz->trips.hot.flags.valid) {
|
||||||
if (!trip)
|
if (!trip)
|
||||||
return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS(
|
return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(
|
||||||
tz->trips.hot.temperature));
|
tz->trips.hot.temperature));
|
||||||
trip--;
|
trip--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tz->trips.passive.flags.valid) {
|
if (tz->trips.passive.flags.valid) {
|
||||||
if (!trip)
|
if (!trip)
|
||||||
return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS(
|
return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(
|
||||||
tz->trips.passive.temperature));
|
tz->trips.passive.temperature));
|
||||||
trip--;
|
trip--;
|
||||||
}
|
}
|
||||||
|
@ -1002,7 +1004,7 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal,
|
||||||
for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
|
for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE &&
|
||||||
tz->trips.active[i].flags.valid; i++) {
|
tz->trips.active[i].flags.valid; i++) {
|
||||||
if (!trip)
|
if (!trip)
|
||||||
return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS(
|
return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(
|
||||||
tz->trips.active[i].temperature));
|
tz->trips.active[i].temperature));
|
||||||
trip--;
|
trip--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,13 @@ MODULE_LICENSE("GPL");
|
||||||
#define HCI_VIDEO_OUT_CRT 0x2
|
#define HCI_VIDEO_OUT_CRT 0x2
|
||||||
#define HCI_VIDEO_OUT_TV 0x4
|
#define HCI_VIDEO_OUT_TV 0x4
|
||||||
|
|
||||||
|
static const struct acpi_device_id toshiba_device_ids[] = {
|
||||||
|
{"TOS6200", 0},
|
||||||
|
{"TOS1900", 0},
|
||||||
|
{"", 0},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, toshiba_device_ids);
|
||||||
|
|
||||||
/* utility
|
/* utility
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ void acpi_ut_track_stack_ptr(void)
|
||||||
* RETURN: Updated pointer to the function name
|
* RETURN: Updated pointer to the function name
|
||||||
*
|
*
|
||||||
* DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
|
* DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
|
||||||
* This allows compiler macros such as __FUNCTION__ to be used
|
* This allows compiler macros such as __func__ to be used
|
||||||
* with no change to the debug output.
|
* with no change to the debug output.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
|
@ -432,7 +432,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
|
||||||
* element -- which is legal)
|
* element -- which is legal)
|
||||||
*/
|
*/
|
||||||
if (!internal_object) {
|
if (!internal_object) {
|
||||||
*obj_length = 0;
|
*obj_length = sizeof(union acpi_object);
|
||||||
return_ACPI_STATUS(AE_OK);
|
return_ACPI_STATUS(AE_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -407,6 +407,12 @@ acpi_evaluate_reference(acpi_handle handle,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!element->reference.handle) {
|
||||||
|
printk(KERN_WARNING PREFIX "Invalid reference in"
|
||||||
|
" package %s\n", pathname);
|
||||||
|
status = AE_NULL_ENTRY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* Get the acpi_handle. */
|
/* Get the acpi_handle. */
|
||||||
|
|
||||||
list->handles[i] = element->reference.handle;
|
list->handles[i] = element->reference.handle;
|
||||||
|
|
|
@ -713,7 +713,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
|
||||||
|
|
||||||
kfree(obj);
|
kfree(obj);
|
||||||
|
|
||||||
if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){
|
if (device->cap._BCL && device->cap._BCM && max_level > 0) {
|
||||||
int result;
|
int result;
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -807,40 +807,11 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
|
||||||
static int acpi_video_bus_check(struct acpi_video_bus *video)
|
static int acpi_video_bus_check(struct acpi_video_bus *video)
|
||||||
{
|
{
|
||||||
acpi_status status = -ENOENT;
|
acpi_status status = -ENOENT;
|
||||||
long device_id;
|
|
||||||
struct device *dev;
|
|
||||||
struct acpi_device *device;
|
|
||||||
|
|
||||||
if (!video)
|
if (!video)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
device = video->device;
|
|
||||||
|
|
||||||
status =
|
|
||||||
acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
|
|
||||||
|
|
||||||
if (!ACPI_SUCCESS(status))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
/* We need to attempt to determine whether the _ADR refers to a
|
|
||||||
PCI device or not. There's no terribly good way to do this,
|
|
||||||
so the best we can hope for is to assume that there'll never
|
|
||||||
be a video device in the host bridge */
|
|
||||||
if (device_id >= 0x10000) {
|
|
||||||
/* It looks like a PCI device. Does it exist? */
|
|
||||||
dev = acpi_get_physical_device(device->handle);
|
|
||||||
} else {
|
|
||||||
/* It doesn't look like a PCI device. Does its parent
|
|
||||||
exist? */
|
|
||||||
acpi_handle phandle;
|
|
||||||
if (acpi_get_parent(device->handle, &phandle))
|
|
||||||
return -ENODEV;
|
|
||||||
dev = acpi_get_physical_device(phandle);
|
|
||||||
}
|
|
||||||
if (!dev)
|
|
||||||
return -ENODEV;
|
|
||||||
put_device(dev);
|
|
||||||
|
|
||||||
/* Since there is no HID, CID and so on for VGA driver, we have
|
/* Since there is no HID, CID and so on for VGA driver, we have
|
||||||
* to check well known required nodes.
|
* to check well known required nodes.
|
||||||
*/
|
*/
|
||||||
|
@ -1201,7 +1172,7 @@ static int acpi_video_bus_ROM_seq_show(struct seq_file *seq, void *offset)
|
||||||
if (!video)
|
if (!video)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
printk(KERN_INFO PREFIX "Please implement %s\n", __FUNCTION__);
|
printk(KERN_INFO PREFIX "Please implement %s\n", __func__);
|
||||||
seq_printf(seq, "<TODO>\n");
|
seq_printf(seq, "<TODO>\n");
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
@ -1366,37 +1337,8 @@ acpi_video_bus_write_DOS(struct file *file,
|
||||||
|
|
||||||
static int acpi_video_bus_add_fs(struct acpi_device *device)
|
static int acpi_video_bus_add_fs(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
long device_id;
|
|
||||||
int status;
|
|
||||||
struct proc_dir_entry *entry = NULL;
|
struct proc_dir_entry *entry = NULL;
|
||||||
struct acpi_video_bus *video;
|
struct acpi_video_bus *video;
|
||||||
struct device *dev;
|
|
||||||
|
|
||||||
status =
|
|
||||||
acpi_evaluate_integer(device->handle, "_ADR", NULL, &device_id);
|
|
||||||
|
|
||||||
if (!ACPI_SUCCESS(status))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
/* We need to attempt to determine whether the _ADR refers to a
|
|
||||||
PCI device or not. There's no terribly good way to do this,
|
|
||||||
so the best we can hope for is to assume that there'll never
|
|
||||||
be a video device in the host bridge */
|
|
||||||
if (device_id >= 0x10000) {
|
|
||||||
/* It looks like a PCI device. Does it exist? */
|
|
||||||
dev = acpi_get_physical_device(device->handle);
|
|
||||||
} else {
|
|
||||||
/* It doesn't look like a PCI device. Does its parent
|
|
||||||
exist? */
|
|
||||||
acpi_handle phandle;
|
|
||||||
if (acpi_get_parent(device->handle, &phandle))
|
|
||||||
return -ENODEV;
|
|
||||||
dev = acpi_get_physical_device(phandle);
|
|
||||||
}
|
|
||||||
if (!dev)
|
|
||||||
return -ENODEV;
|
|
||||||
put_device(dev);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
video = acpi_driver_data(device);
|
video = acpi_driver_data(device);
|
||||||
|
|
|
@ -293,7 +293,7 @@ struct acpi_buffer *out)
|
||||||
{
|
{
|
||||||
struct guid_block *block = NULL;
|
struct guid_block *block = NULL;
|
||||||
struct wmi_block *wblock = NULL;
|
struct wmi_block *wblock = NULL;
|
||||||
acpi_handle handle;
|
acpi_handle handle, wc_handle;
|
||||||
acpi_status status, wc_status = AE_ERROR;
|
acpi_status status, wc_status = AE_ERROR;
|
||||||
struct acpi_object_list input, wc_input;
|
struct acpi_object_list input, wc_input;
|
||||||
union acpi_object wc_params[1], wq_params[1];
|
union acpi_object wc_params[1], wq_params[1];
|
||||||
|
@ -338,8 +338,10 @@ struct acpi_buffer *out)
|
||||||
* expensive, but have no corresponding WCxx method. So we
|
* expensive, but have no corresponding WCxx method. So we
|
||||||
* should not fail if this happens.
|
* should not fail if this happens.
|
||||||
*/
|
*/
|
||||||
wc_status = acpi_evaluate_object(handle, wc_method,
|
wc_status = acpi_get_handle(handle, wc_method, &wc_handle);
|
||||||
&wc_input, NULL);
|
if (ACPI_SUCCESS(wc_status))
|
||||||
|
wc_status = acpi_evaluate_object(handle, wc_method,
|
||||||
|
&wc_input, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(method, "WQ");
|
strcpy(method, "WQ");
|
||||||
|
@ -351,7 +353,7 @@ struct acpi_buffer *out)
|
||||||
* If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
|
* If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if
|
||||||
* the WQxx method failed - we should disable collection anyway.
|
* the WQxx method failed - we should disable collection anyway.
|
||||||
*/
|
*/
|
||||||
if ((block->flags & ACPI_WMI_EXPENSIVE) && wc_status) {
|
if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) {
|
||||||
wc_params[0].integer.value = 0;
|
wc_params[0].integer.value = 0;
|
||||||
status = acpi_evaluate_object(handle,
|
status = acpi_evaluate_object(handle,
|
||||||
wc_method, &wc_input, NULL);
|
wc_method, &wc_input, NULL);
|
||||||
|
|
|
@ -30,6 +30,7 @@ config ATA_NONSTANDARD
|
||||||
config ATA_ACPI
|
config ATA_ACPI
|
||||||
bool
|
bool
|
||||||
depends on ACPI && PCI
|
depends on ACPI && PCI
|
||||||
|
select ACPI_DOCK
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
This option adds support for ATA-related ACPI objects.
|
This option adds support for ATA-related ACPI objects.
|
||||||
|
|
|
@ -49,6 +49,10 @@
|
||||||
#define DRV_NAME "ahci"
|
#define DRV_NAME "ahci"
|
||||||
#define DRV_VERSION "3.0"
|
#define DRV_VERSION "3.0"
|
||||||
|
|
||||||
|
static int ahci_skip_host_reset;
|
||||||
|
module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444);
|
||||||
|
MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)");
|
||||||
|
|
||||||
static int ahci_enable_alpm(struct ata_port *ap,
|
static int ahci_enable_alpm(struct ata_port *ap,
|
||||||
enum link_pm policy);
|
enum link_pm policy);
|
||||||
static void ahci_disable_alpm(struct ata_port *ap);
|
static void ahci_disable_alpm(struct ata_port *ap);
|
||||||
|
@ -587,6 +591,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||||
|
|
||||||
/* Marvell */
|
/* Marvell */
|
||||||
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
||||||
|
{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */
|
||||||
|
|
||||||
/* Generic, PCI class code for AHCI */
|
/* Generic, PCI class code for AHCI */
|
||||||
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||||
|
@ -661,6 +666,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
|
void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR];
|
||||||
u32 cap, port_map;
|
u32 cap, port_map;
|
||||||
int i;
|
int i;
|
||||||
|
int mv;
|
||||||
|
|
||||||
/* make sure AHCI mode is enabled before accessing CAP */
|
/* make sure AHCI mode is enabled before accessing CAP */
|
||||||
ahci_enable_ahci(mmio);
|
ahci_enable_ahci(mmio);
|
||||||
|
@ -696,12 +702,16 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
|
||||||
* presence register, as bit 4 (counting from 0)
|
* presence register, as bit 4 (counting from 0)
|
||||||
*/
|
*/
|
||||||
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
||||||
|
if (pdev->device == 0x6121)
|
||||||
|
mv = 0x3;
|
||||||
|
else
|
||||||
|
mv = 0xf;
|
||||||
dev_printk(KERN_ERR, &pdev->dev,
|
dev_printk(KERN_ERR, &pdev->dev,
|
||||||
"MV_AHCI HACK: port_map %x -> %x\n",
|
"MV_AHCI HACK: port_map %x -> %x\n",
|
||||||
hpriv->port_map,
|
port_map,
|
||||||
hpriv->port_map & 0xf);
|
port_map & mv);
|
||||||
|
|
||||||
port_map &= 0xf;
|
port_map &= mv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cross check port_map and cap.n_ports */
|
/* cross check port_map and cap.n_ports */
|
||||||
|
@ -1088,29 +1098,35 @@ static int ahci_reset_controller(struct ata_host *host)
|
||||||
ahci_enable_ahci(mmio);
|
ahci_enable_ahci(mmio);
|
||||||
|
|
||||||
/* global controller reset */
|
/* global controller reset */
|
||||||
tmp = readl(mmio + HOST_CTL);
|
if (!ahci_skip_host_reset) {
|
||||||
if ((tmp & HOST_RESET) == 0) {
|
tmp = readl(mmio + HOST_CTL);
|
||||||
writel(tmp | HOST_RESET, mmio + HOST_CTL);
|
if ((tmp & HOST_RESET) == 0) {
|
||||||
readl(mmio + HOST_CTL); /* flush */
|
writel(tmp | HOST_RESET, mmio + HOST_CTL);
|
||||||
}
|
readl(mmio + HOST_CTL); /* flush */
|
||||||
|
}
|
||||||
|
|
||||||
/* reset must complete within 1 second, or
|
/* reset must complete within 1 second, or
|
||||||
* the hardware should be considered fried.
|
* the hardware should be considered fried.
|
||||||
*/
|
*/
|
||||||
ssleep(1);
|
ssleep(1);
|
||||||
|
|
||||||
tmp = readl(mmio + HOST_CTL);
|
tmp = readl(mmio + HOST_CTL);
|
||||||
if (tmp & HOST_RESET) {
|
if (tmp & HOST_RESET) {
|
||||||
dev_printk(KERN_ERR, host->dev,
|
dev_printk(KERN_ERR, host->dev,
|
||||||
"controller reset failed (0x%x)\n", tmp);
|
"controller reset failed (0x%x)\n", tmp);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* turn on AHCI mode */
|
/* turn on AHCI mode */
|
||||||
ahci_enable_ahci(mmio);
|
ahci_enable_ahci(mmio);
|
||||||
|
|
||||||
/* some registers might be cleared on reset. restore initial values */
|
/* Some registers might be cleared on reset. Restore
|
||||||
ahci_restore_initial_config(host);
|
* initial values.
|
||||||
|
*/
|
||||||
|
ahci_restore_initial_config(host);
|
||||||
|
} else
|
||||||
|
dev_printk(KERN_INFO, host->dev,
|
||||||
|
"skipping global host reset\n");
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
|
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
|
||||||
u16 tmp16;
|
u16 tmp16;
|
||||||
|
@ -1162,9 +1178,14 @@ static void ahci_init_controller(struct ata_host *host)
|
||||||
int i;
|
int i;
|
||||||
void __iomem *port_mmio;
|
void __iomem *port_mmio;
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
int mv;
|
||||||
|
|
||||||
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
if (hpriv->flags & AHCI_HFLAG_MV_PATA) {
|
||||||
port_mmio = __ahci_port_base(host, 4);
|
if (pdev->device == 0x6121)
|
||||||
|
mv = 2;
|
||||||
|
else
|
||||||
|
mv = 4;
|
||||||
|
port_mmio = __ahci_port_base(host, mv);
|
||||||
|
|
||||||
writel(0, port_mmio + PORT_IRQ_MASK);
|
writel(0, port_mmio + PORT_IRQ_MASK);
|
||||||
|
|
||||||
|
@ -2241,7 +2262,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
rc = pcim_iomap_regions(pdev, 1 << AHCI_PCI_BAR, DRV_NAME);
|
/* AHCI controllers often implement SFF compatible interface.
|
||||||
|
* Grab all PCI BARs just in case.
|
||||||
|
*/
|
||||||
|
rc = pcim_iomap_regions_request_all(pdev, 1 << AHCI_PCI_BAR, DRV_NAME);
|
||||||
if (rc == -EBUSY)
|
if (rc == -EBUSY)
|
||||||
pcim_pin_device(pdev);
|
pcim_pin_device(pdev);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
|
@ -118,45 +118,77 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
|
||||||
ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
|
ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ata_acpi_handle_hotplug(struct ata_port *ap, struct kobject *kobj,
|
static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
|
||||||
u32 event)
|
u32 event)
|
||||||
{
|
{
|
||||||
char event_string[12];
|
char event_string[12];
|
||||||
char *envp[] = { event_string, NULL };
|
char *envp[] = { event_string, NULL };
|
||||||
struct ata_eh_info *ehi = &ap->link.eh_info;
|
struct ata_eh_info *ehi;
|
||||||
|
struct kobject *kobj = NULL;
|
||||||
|
int wait = 0;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (event == 0 || event == 1) {
|
if (!ap)
|
||||||
unsigned long flags;
|
ap = dev->link->ap;
|
||||||
spin_lock_irqsave(ap->lock, flags);
|
ehi = &ap->link.eh_info;
|
||||||
ata_ehi_clear_desc(ehi);
|
|
||||||
ata_ehi_push_desc(ehi, "ACPI event");
|
spin_lock_irqsave(ap->lock, flags);
|
||||||
ata_ehi_hotplugged(ehi);
|
|
||||||
ata_port_freeze(ap);
|
switch (event) {
|
||||||
spin_unlock_irqrestore(ap->lock, flags);
|
case ACPI_NOTIFY_BUS_CHECK:
|
||||||
|
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||||
|
ata_ehi_push_desc(ehi, "ACPI event");
|
||||||
|
ata_ehi_hotplugged(ehi);
|
||||||
|
ata_port_freeze(ap);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||||
|
ata_ehi_push_desc(ehi, "ACPI event");
|
||||||
|
if (dev)
|
||||||
|
dev->flags |= ATA_DFLAG_DETACH;
|
||||||
|
else {
|
||||||
|
struct ata_link *tlink;
|
||||||
|
struct ata_device *tdev;
|
||||||
|
|
||||||
|
ata_port_for_each_link(tlink, ap)
|
||||||
|
ata_link_for_each_dev(tdev, tlink)
|
||||||
|
tdev->flags |= ATA_DFLAG_DETACH;
|
||||||
|
}
|
||||||
|
|
||||||
|
ata_port_schedule_eh(ap);
|
||||||
|
wait = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev) {
|
||||||
|
if (dev->sdev)
|
||||||
|
kobj = &dev->sdev->sdev_gendev.kobj;
|
||||||
|
} else
|
||||||
|
kobj = &ap->dev->kobj;
|
||||||
|
|
||||||
if (kobj) {
|
if (kobj) {
|
||||||
sprintf(event_string, "BAY_EVENT=%d", event);
|
sprintf(event_string, "BAY_EVENT=%d", event);
|
||||||
kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
|
kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(ap->lock, flags);
|
||||||
|
|
||||||
|
if (wait)
|
||||||
|
ata_port_wait_eh(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data)
|
static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data)
|
||||||
{
|
{
|
||||||
struct ata_device *dev = data;
|
struct ata_device *dev = data;
|
||||||
struct kobject *kobj = NULL;
|
|
||||||
|
|
||||||
if (dev->sdev)
|
ata_acpi_handle_hotplug(NULL, dev, event);
|
||||||
kobj = &dev->sdev->sdev_gendev.kobj;
|
|
||||||
|
|
||||||
ata_acpi_handle_hotplug(dev->link->ap, kobj, event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data)
|
static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = data;
|
struct ata_port *ap = data;
|
||||||
|
|
||||||
ata_acpi_handle_hotplug(ap, &ap->dev->kobj, event);
|
ata_acpi_handle_hotplug(ap, NULL, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -191,20 +223,30 @@ void ata_acpi_associate(struct ata_host *host)
|
||||||
else
|
else
|
||||||
ata_acpi_associate_ide_port(ap);
|
ata_acpi_associate_ide_port(ap);
|
||||||
|
|
||||||
if (ap->acpi_handle)
|
if (ap->acpi_handle) {
|
||||||
acpi_install_notify_handler (ap->acpi_handle,
|
acpi_install_notify_handler(ap->acpi_handle,
|
||||||
ACPI_SYSTEM_NOTIFY,
|
ACPI_SYSTEM_NOTIFY,
|
||||||
ata_acpi_ap_notify,
|
ata_acpi_ap_notify, ap);
|
||||||
ap);
|
#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
|
||||||
|
/* we might be on a docking station */
|
||||||
|
register_hotplug_dock_device(ap->acpi_handle,
|
||||||
|
ata_acpi_ap_notify, ap);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
|
for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
|
||||||
struct ata_device *dev = &ap->link.device[j];
|
struct ata_device *dev = &ap->link.device[j];
|
||||||
|
|
||||||
if (dev->acpi_handle)
|
if (dev->acpi_handle) {
|
||||||
acpi_install_notify_handler (dev->acpi_handle,
|
acpi_install_notify_handler(dev->acpi_handle,
|
||||||
ACPI_SYSTEM_NOTIFY,
|
ACPI_SYSTEM_NOTIFY,
|
||||||
ata_acpi_dev_notify,
|
ata_acpi_dev_notify, dev);
|
||||||
dev);
|
#if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE)
|
||||||
|
/* we might be on a docking station */
|
||||||
|
register_hotplug_dock_device(dev->acpi_handle,
|
||||||
|
ata_acpi_dev_notify, dev);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -295,7 +295,7 @@ static void ali_lock_sectors(struct ata_device *adev)
|
||||||
static int ali_check_atapi_dma(struct ata_queued_cmd *qc)
|
static int ali_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
/* If its not a media command, its not worth it */
|
/* If its not a media command, its not worth it */
|
||||||
if (qc->nbytes < 2048)
|
if (atapi_cmd_type(qc->cdb[0]) == ATAPI_MISC)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,6 @@ static int use_virtual_dma;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(floppy_lock);
|
static DEFINE_SPINLOCK(floppy_lock);
|
||||||
static struct completion device_release;
|
|
||||||
|
|
||||||
static unsigned short virtual_dma_port = 0x3f0;
|
static unsigned short virtual_dma_port = 0x3f0;
|
||||||
irqreturn_t floppy_interrupt(int irq, void *dev_id);
|
irqreturn_t floppy_interrupt(int irq, void *dev_id);
|
||||||
|
@ -4144,7 +4143,6 @@ DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL);
|
||||||
|
|
||||||
static void floppy_device_release(struct device *dev)
|
static void floppy_device_release(struct device *dev)
|
||||||
{
|
{
|
||||||
complete(&device_release);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct platform_device floppy_device[N_DRIVE];
|
static struct platform_device floppy_device[N_DRIVE];
|
||||||
|
@ -4539,7 +4537,6 @@ void cleanup_module(void)
|
||||||
{
|
{
|
||||||
int drive;
|
int drive;
|
||||||
|
|
||||||
init_completion(&device_release);
|
|
||||||
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
|
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
|
||||||
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
||||||
|
|
||||||
|
@ -4564,8 +4561,6 @@ void cleanup_module(void)
|
||||||
|
|
||||||
/* eject disk, if any */
|
/* eject disk, if any */
|
||||||
fd_eject(0);
|
fd_eject(0);
|
||||||
|
|
||||||
wait_for_completion(&device_release);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_param(floppy, charp, 0);
|
module_param(floppy, charp, 0);
|
||||||
|
|
|
@ -238,6 +238,7 @@ static int virtblk_probe(struct virtio_device *vdev)
|
||||||
vblk->disk->first_minor = index_to_minor(index);
|
vblk->disk->first_minor = index_to_minor(index);
|
||||||
vblk->disk->private_data = vblk;
|
vblk->disk->private_data = vblk;
|
||||||
vblk->disk->fops = &virtblk_fops;
|
vblk->disk->fops = &virtblk_fops;
|
||||||
|
vblk->disk->driverfs_dev = &vdev->dev;
|
||||||
index++;
|
index++;
|
||||||
|
|
||||||
/* If barriers are supported, tell block layer that queue is ordered */
|
/* If barriers are supported, tell block layer that queue is ordered */
|
||||||
|
|
|
@ -1709,7 +1709,7 @@ static int __init riscom8_init_module (void)
|
||||||
|
|
||||||
if (iobase || iobase1 || iobase2 || iobase3) {
|
if (iobase || iobase1 || iobase2 || iobase3) {
|
||||||
for(i = 0; i < RC_NBOARD; i++)
|
for(i = 0; i < RC_NBOARD; i++)
|
||||||
rc_board[0].base = 0;
|
rc_board[i].base = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iobase)
|
if (iobase)
|
||||||
|
|
|
@ -357,7 +357,7 @@ int dma_async_device_register(struct dma_device *device)
|
||||||
!device->device_prep_dma_zero_sum);
|
!device->device_prep_dma_zero_sum);
|
||||||
BUG_ON(dma_has_cap(DMA_MEMSET, device->cap_mask) &&
|
BUG_ON(dma_has_cap(DMA_MEMSET, device->cap_mask) &&
|
||||||
!device->device_prep_dma_memset);
|
!device->device_prep_dma_memset);
|
||||||
BUG_ON(dma_has_cap(DMA_ZERO_SUM, device->cap_mask) &&
|
BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) &&
|
||||||
!device->device_prep_dma_interrupt);
|
!device->device_prep_dma_interrupt);
|
||||||
|
|
||||||
BUG_ON(!device->device_alloc_chan_resources);
|
BUG_ON(!device->device_alloc_chan_resources);
|
||||||
|
|
|
@ -57,12 +57,12 @@ static void dma_init(struct fsl_dma_chan *fsl_chan)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_sr(struct fsl_dma_chan *fsl_chan, dma_addr_t val)
|
static void set_sr(struct fsl_dma_chan *fsl_chan, u32 val)
|
||||||
{
|
{
|
||||||
DMA_OUT(fsl_chan, &fsl_chan->reg_base->sr, val, 32);
|
DMA_OUT(fsl_chan, &fsl_chan->reg_base->sr, val, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
static dma_addr_t get_sr(struct fsl_dma_chan *fsl_chan)
|
static u32 get_sr(struct fsl_dma_chan *fsl_chan)
|
||||||
{
|
{
|
||||||
return DMA_IN(fsl_chan, &fsl_chan->reg_base->sr, 32);
|
return DMA_IN(fsl_chan, &fsl_chan->reg_base->sr, 32);
|
||||||
}
|
}
|
||||||
|
@ -406,6 +406,32 @@ static void fsl_dma_free_chan_resources(struct dma_chan *chan)
|
||||||
dma_pool_destroy(fsl_chan->desc_pool);
|
dma_pool_destroy(fsl_chan->desc_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct dma_async_tx_descriptor *
|
||||||
|
fsl_dma_prep_interrupt(struct dma_chan *chan)
|
||||||
|
{
|
||||||
|
struct fsl_dma_chan *fsl_chan;
|
||||||
|
struct fsl_desc_sw *new;
|
||||||
|
|
||||||
|
if (!chan)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
fsl_chan = to_fsl_chan(chan);
|
||||||
|
|
||||||
|
new = fsl_dma_alloc_descriptor(fsl_chan);
|
||||||
|
if (!new) {
|
||||||
|
dev_err(fsl_chan->dev, "No free memory for link descriptor\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
new->async_tx.cookie = -EBUSY;
|
||||||
|
new->async_tx.ack = 0;
|
||||||
|
|
||||||
|
/* Set End-of-link to the last link descriptor of new list*/
|
||||||
|
set_ld_eol(fsl_chan, new);
|
||||||
|
|
||||||
|
return &new->async_tx;
|
||||||
|
}
|
||||||
|
|
||||||
static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy(
|
static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy(
|
||||||
struct dma_chan *chan, dma_addr_t dma_dest, dma_addr_t dma_src,
|
struct dma_chan *chan, dma_addr_t dma_dest, dma_addr_t dma_src,
|
||||||
size_t len, unsigned long flags)
|
size_t len, unsigned long flags)
|
||||||
|
@ -436,7 +462,7 @@ static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy(
|
||||||
dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new);
|
dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
copy = min(len, FSL_DMA_BCR_MAX_CNT);
|
copy = min(len, (size_t)FSL_DMA_BCR_MAX_CNT);
|
||||||
|
|
||||||
set_desc_cnt(fsl_chan, &new->hw, copy);
|
set_desc_cnt(fsl_chan, &new->hw, copy);
|
||||||
set_desc_src(fsl_chan, &new->hw, dma_src);
|
set_desc_src(fsl_chan, &new->hw, dma_src);
|
||||||
|
@ -513,7 +539,6 @@ static void fsl_chan_ld_cleanup(struct fsl_dma_chan *fsl_chan)
|
||||||
|
|
||||||
spin_lock_irqsave(&fsl_chan->desc_lock, flags);
|
spin_lock_irqsave(&fsl_chan->desc_lock, flags);
|
||||||
|
|
||||||
fsl_dma_update_completed_cookie(fsl_chan);
|
|
||||||
dev_dbg(fsl_chan->dev, "chan completed_cookie = %d\n",
|
dev_dbg(fsl_chan->dev, "chan completed_cookie = %d\n",
|
||||||
fsl_chan->completed_cookie);
|
fsl_chan->completed_cookie);
|
||||||
list_for_each_entry_safe(desc, _desc, &fsl_chan->ld_queue, node) {
|
list_for_each_entry_safe(desc, _desc, &fsl_chan->ld_queue, node) {
|
||||||
|
@ -581,8 +606,8 @@ static void fsl_chan_xfer_ld_queue(struct fsl_dma_chan *fsl_chan)
|
||||||
if (ld_node != &fsl_chan->ld_queue) {
|
if (ld_node != &fsl_chan->ld_queue) {
|
||||||
/* Get the ld start address from ld_queue */
|
/* Get the ld start address from ld_queue */
|
||||||
next_dest_addr = to_fsl_desc(ld_node)->async_tx.phys;
|
next_dest_addr = to_fsl_desc(ld_node)->async_tx.phys;
|
||||||
dev_dbg(fsl_chan->dev, "xfer LDs staring from 0x%016llx\n",
|
dev_dbg(fsl_chan->dev, "xfer LDs staring from %p\n",
|
||||||
(u64)next_dest_addr);
|
(void *)next_dest_addr);
|
||||||
set_cdar(fsl_chan, next_dest_addr);
|
set_cdar(fsl_chan, next_dest_addr);
|
||||||
dma_start(fsl_chan);
|
dma_start(fsl_chan);
|
||||||
} else {
|
} else {
|
||||||
|
@ -662,7 +687,7 @@ static enum dma_status fsl_dma_is_complete(struct dma_chan *chan,
|
||||||
static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data)
|
static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct fsl_dma_chan *fsl_chan = (struct fsl_dma_chan *)data;
|
struct fsl_dma_chan *fsl_chan = (struct fsl_dma_chan *)data;
|
||||||
dma_addr_t stat;
|
u32 stat;
|
||||||
|
|
||||||
stat = get_sr(fsl_chan);
|
stat = get_sr(fsl_chan);
|
||||||
dev_dbg(fsl_chan->dev, "event: channel %d, stat = 0x%x\n",
|
dev_dbg(fsl_chan->dev, "event: channel %d, stat = 0x%x\n",
|
||||||
|
@ -681,10 +706,10 @@ static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data)
|
||||||
*/
|
*/
|
||||||
if (stat & FSL_DMA_SR_EOSI) {
|
if (stat & FSL_DMA_SR_EOSI) {
|
||||||
dev_dbg(fsl_chan->dev, "event: End-of-segments INT\n");
|
dev_dbg(fsl_chan->dev, "event: End-of-segments INT\n");
|
||||||
dev_dbg(fsl_chan->dev, "event: clndar 0x%016llx, "
|
dev_dbg(fsl_chan->dev, "event: clndar %p, nlndar %p\n",
|
||||||
"nlndar 0x%016llx\n", (u64)get_cdar(fsl_chan),
|
(void *)get_cdar(fsl_chan), (void *)get_ndar(fsl_chan));
|
||||||
(u64)get_ndar(fsl_chan));
|
|
||||||
stat &= ~FSL_DMA_SR_EOSI;
|
stat &= ~FSL_DMA_SR_EOSI;
|
||||||
|
fsl_dma_update_completed_cookie(fsl_chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If it current transfer is the end-of-transfer,
|
/* If it current transfer is the end-of-transfer,
|
||||||
|
@ -726,12 +751,15 @@ static void dma_do_tasklet(unsigned long data)
|
||||||
fsl_chan_ld_cleanup(fsl_chan);
|
fsl_chan_ld_cleanup(fsl_chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FSL_DMA_CALLBACKTEST
|
||||||
static void fsl_dma_callback_test(struct fsl_dma_chan *fsl_chan)
|
static void fsl_dma_callback_test(struct fsl_dma_chan *fsl_chan)
|
||||||
{
|
{
|
||||||
if (fsl_chan)
|
if (fsl_chan)
|
||||||
dev_info(fsl_chan->dev, "selftest: callback is ok!\n");
|
dev_info(fsl_chan->dev, "selftest: callback is ok!\n");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_FSL_DMA_SELFTEST
|
||||||
static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
|
static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
|
||||||
{
|
{
|
||||||
struct dma_chan *chan;
|
struct dma_chan *chan;
|
||||||
|
@ -837,9 +865,9 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
|
||||||
if (err) {
|
if (err) {
|
||||||
for (i = 0; (*(src + i) == *(dest + i)) && (i < test_size);
|
for (i = 0; (*(src + i) == *(dest + i)) && (i < test_size);
|
||||||
i++);
|
i++);
|
||||||
dev_err(fsl_chan->dev, "selftest: Test failed, data %d/%d is "
|
dev_err(fsl_chan->dev, "selftest: Test failed, data %d/%ld is "
|
||||||
"error! src 0x%x, dest 0x%x\n",
|
"error! src 0x%x, dest 0x%x\n",
|
||||||
i, test_size, *(src + i), *(dest + i));
|
i, (long)test_size, *(src + i), *(dest + i));
|
||||||
}
|
}
|
||||||
|
|
||||||
free_resources:
|
free_resources:
|
||||||
|
@ -848,6 +876,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
|
||||||
kfree(src);
|
kfree(src);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
|
static int __devinit of_fsl_dma_chan_probe(struct of_device *dev,
|
||||||
const struct of_device_id *match)
|
const struct of_device_id *match)
|
||||||
|
@ -1008,8 +1037,8 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_info(&dev->dev, "Probe the Freescale DMA driver for %s "
|
dev_info(&dev->dev, "Probe the Freescale DMA driver for %s "
|
||||||
"controller at 0x%08x...\n",
|
"controller at %p...\n",
|
||||||
match->compatible, fdev->reg.start);
|
match->compatible, (void *)fdev->reg.start);
|
||||||
fdev->reg_base = ioremap(fdev->reg.start, fdev->reg.end
|
fdev->reg_base = ioremap(fdev->reg.start, fdev->reg.end
|
||||||
- fdev->reg.start + 1);
|
- fdev->reg.start + 1);
|
||||||
|
|
||||||
|
@ -1017,6 +1046,7 @@ static int __devinit of_fsl_dma_probe(struct of_device *dev,
|
||||||
dma_cap_set(DMA_INTERRUPT, fdev->common.cap_mask);
|
dma_cap_set(DMA_INTERRUPT, fdev->common.cap_mask);
|
||||||
fdev->common.device_alloc_chan_resources = fsl_dma_alloc_chan_resources;
|
fdev->common.device_alloc_chan_resources = fsl_dma_alloc_chan_resources;
|
||||||
fdev->common.device_free_chan_resources = fsl_dma_free_chan_resources;
|
fdev->common.device_free_chan_resources = fsl_dma_free_chan_resources;
|
||||||
|
fdev->common.device_prep_dma_interrupt = fsl_dma_prep_interrupt;
|
||||||
fdev->common.device_prep_dma_memcpy = fsl_dma_prep_memcpy;
|
fdev->common.device_prep_dma_memcpy = fsl_dma_prep_memcpy;
|
||||||
fdev->common.device_is_tx_complete = fsl_dma_is_complete;
|
fdev->common.device_is_tx_complete = fsl_dma_is_complete;
|
||||||
fdev->common.device_issue_pending = fsl_dma_memcpy_issue_pending;
|
fdev->common.device_issue_pending = fsl_dma_memcpy_issue_pending;
|
||||||
|
|
|
@ -140,7 +140,7 @@ static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan)
|
||||||
int busy = iop_chan_is_busy(iop_chan);
|
int busy = iop_chan_is_busy(iop_chan);
|
||||||
int seen_current = 0, slot_cnt = 0, slots_per_op = 0;
|
int seen_current = 0, slot_cnt = 0, slots_per_op = 0;
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
|
||||||
/* free completed slots from the chain starting with
|
/* free completed slots from the chain starting with
|
||||||
* the oldest descriptor
|
* the oldest descriptor
|
||||||
*/
|
*/
|
||||||
|
@ -438,7 +438,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
|
||||||
spin_unlock_bh(&iop_chan->lock);
|
spin_unlock_bh(&iop_chan->lock);
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s cookie: %d slot: %d\n",
|
dev_dbg(iop_chan->device->common.dev, "%s cookie: %d slot: %d\n",
|
||||||
__FUNCTION__, sw_desc->async_tx.cookie, sw_desc->idx);
|
__func__, sw_desc->async_tx.cookie, sw_desc->idx);
|
||||||
|
|
||||||
return cookie;
|
return cookie;
|
||||||
}
|
}
|
||||||
|
@ -520,7 +520,7 @@ iop_adma_prep_dma_interrupt(struct dma_chan *chan)
|
||||||
struct iop_adma_desc_slot *sw_desc, *grp_start;
|
struct iop_adma_desc_slot *sw_desc, *grp_start;
|
||||||
int slot_cnt, slots_per_op;
|
int slot_cnt, slots_per_op;
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_interrupt_slot_count(&slots_per_op, iop_chan);
|
slot_cnt = iop_chan_interrupt_slot_count(&slots_per_op, iop_chan);
|
||||||
|
@ -548,7 +548,7 @@ iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest,
|
||||||
BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT));
|
BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT));
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s len: %u\n",
|
dev_dbg(iop_chan->device->common.dev, "%s len: %u\n",
|
||||||
__FUNCTION__, len);
|
__func__, len);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_memcpy_slot_count(len, &slots_per_op);
|
slot_cnt = iop_chan_memcpy_slot_count(len, &slots_per_op);
|
||||||
|
@ -580,7 +580,7 @@ iop_adma_prep_dma_memset(struct dma_chan *chan, dma_addr_t dma_dest,
|
||||||
BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT));
|
BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT));
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s len: %u\n",
|
dev_dbg(iop_chan->device->common.dev, "%s len: %u\n",
|
||||||
__FUNCTION__, len);
|
__func__, len);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_memset_slot_count(len, &slots_per_op);
|
slot_cnt = iop_chan_memset_slot_count(len, &slots_per_op);
|
||||||
|
@ -614,7 +614,7 @@ iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest,
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev,
|
dev_dbg(iop_chan->device->common.dev,
|
||||||
"%s src_cnt: %d len: %u flags: %lx\n",
|
"%s src_cnt: %d len: %u flags: %lx\n",
|
||||||
__FUNCTION__, src_cnt, len, flags);
|
__func__, src_cnt, len, flags);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_xor_slot_count(len, src_cnt, &slots_per_op);
|
slot_cnt = iop_chan_xor_slot_count(len, src_cnt, &slots_per_op);
|
||||||
|
@ -648,7 +648,7 @@ iop_adma_prep_dma_zero_sum(struct dma_chan *chan, dma_addr_t *dma_src,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n",
|
dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n",
|
||||||
__FUNCTION__, src_cnt, len);
|
__func__, src_cnt, len);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_zero_sum_slot_count(len, src_cnt, &slots_per_op);
|
slot_cnt = iop_chan_zero_sum_slot_count(len, src_cnt, &slots_per_op);
|
||||||
|
@ -659,7 +659,7 @@ iop_adma_prep_dma_zero_sum(struct dma_chan *chan, dma_addr_t *dma_src,
|
||||||
iop_desc_set_zero_sum_byte_count(grp_start, len);
|
iop_desc_set_zero_sum_byte_count(grp_start, len);
|
||||||
grp_start->xor_check_result = result;
|
grp_start->xor_check_result = result;
|
||||||
pr_debug("\t%s: grp_start->xor_check_result: %p\n",
|
pr_debug("\t%s: grp_start->xor_check_result: %p\n",
|
||||||
__FUNCTION__, grp_start->xor_check_result);
|
__func__, grp_start->xor_check_result);
|
||||||
sw_desc->unmap_src_cnt = src_cnt;
|
sw_desc->unmap_src_cnt = src_cnt;
|
||||||
sw_desc->unmap_len = len;
|
sw_desc->unmap_len = len;
|
||||||
while (src_cnt--)
|
while (src_cnt--)
|
||||||
|
@ -700,7 +700,7 @@ static void iop_adma_free_chan_resources(struct dma_chan *chan)
|
||||||
iop_chan->last_used = NULL;
|
iop_chan->last_used = NULL;
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s slots_allocated %d\n",
|
dev_dbg(iop_chan->device->common.dev, "%s slots_allocated %d\n",
|
||||||
__FUNCTION__, iop_chan->slots_allocated);
|
__func__, iop_chan->slots_allocated);
|
||||||
spin_unlock_bh(&iop_chan->lock);
|
spin_unlock_bh(&iop_chan->lock);
|
||||||
|
|
||||||
/* one is ok since we left it on there on purpose */
|
/* one is ok since we left it on there on purpose */
|
||||||
|
@ -753,7 +753,7 @@ static irqreturn_t iop_adma_eot_handler(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct iop_adma_chan *chan = data;
|
struct iop_adma_chan *chan = data;
|
||||||
|
|
||||||
dev_dbg(chan->device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(chan->device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
tasklet_schedule(&chan->irq_tasklet);
|
tasklet_schedule(&chan->irq_tasklet);
|
||||||
|
|
||||||
|
@ -766,7 +766,7 @@ static irqreturn_t iop_adma_eoc_handler(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct iop_adma_chan *chan = data;
|
struct iop_adma_chan *chan = data;
|
||||||
|
|
||||||
dev_dbg(chan->device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(chan->device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
tasklet_schedule(&chan->irq_tasklet);
|
tasklet_schedule(&chan->irq_tasklet);
|
||||||
|
|
||||||
|
@ -823,7 +823,7 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct iop_adma_chan *iop_chan;
|
struct iop_adma_chan *iop_chan;
|
||||||
|
|
||||||
dev_dbg(device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
src = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL);
|
src = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL);
|
||||||
if (!src)
|
if (!src)
|
||||||
|
@ -906,7 +906,7 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device)
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct iop_adma_chan *iop_chan;
|
struct iop_adma_chan *iop_chan;
|
||||||
|
|
||||||
dev_dbg(device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
|
for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {
|
||||||
xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
|
xor_srcs[src_idx] = alloc_page(GFP_KERNEL);
|
||||||
|
@ -1159,7 +1159,7 @@ static int __devinit iop_adma_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(&pdev->dev, "%s: allocted descriptor pool virt %p phys %p\n",
|
dev_dbg(&pdev->dev, "%s: allocted descriptor pool virt %p phys %p\n",
|
||||||
__FUNCTION__, adev->dma_desc_pool_virt,
|
__func__, adev->dma_desc_pool_virt,
|
||||||
(void *) adev->dma_desc_pool);
|
(void *) adev->dma_desc_pool);
|
||||||
|
|
||||||
adev->id = plat_data->hw_id;
|
adev->id = plat_data->hw_id;
|
||||||
|
@ -1289,7 +1289,7 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan)
|
||||||
dma_cookie_t cookie;
|
dma_cookie_t cookie;
|
||||||
int slot_cnt, slots_per_op;
|
int slot_cnt, slots_per_op;
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_memcpy_slot_count(0, &slots_per_op);
|
slot_cnt = iop_chan_memcpy_slot_count(0, &slots_per_op);
|
||||||
|
@ -1346,7 +1346,7 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
|
||||||
dma_cookie_t cookie;
|
dma_cookie_t cookie;
|
||||||
int slot_cnt, slots_per_op;
|
int slot_cnt, slots_per_op;
|
||||||
|
|
||||||
dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__);
|
dev_dbg(iop_chan->device->common.dev, "%s\n", __func__);
|
||||||
|
|
||||||
spin_lock_bh(&iop_chan->lock);
|
spin_lock_bh(&iop_chan->lock);
|
||||||
slot_cnt = iop_chan_xor_slot_count(0, 2, &slots_per_op);
|
slot_cnt = iop_chan_xor_slot_count(0, 2, &slots_per_op);
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
# -*- shell-script -*-
|
|
||||||
|
|
||||||
comment "An alternative FireWire stack is available with EXPERIMENTAL=y"
|
comment "An alternative FireWire stack is available with EXPERIMENTAL=y"
|
||||||
depends on EXPERIMENTAL=n
|
depends on EXPERIMENTAL=n
|
||||||
|
|
||||||
|
@ -21,27 +19,7 @@ config FIREWIRE
|
||||||
NOTE:
|
NOTE:
|
||||||
|
|
||||||
You should only build ONE of the stacks, unless you REALLY know what
|
You should only build ONE of the stacks, unless you REALLY know what
|
||||||
you are doing. If you install both, you should configure them only as
|
you are doing.
|
||||||
modules rather than link them statically, and you should blacklist one
|
|
||||||
of the concurrent low-level drivers in /etc/modprobe.conf. Add either
|
|
||||||
|
|
||||||
blacklist firewire-ohci
|
|
||||||
or
|
|
||||||
blacklist ohci1394
|
|
||||||
|
|
||||||
there depending on which driver you DON'T want to have auto-loaded.
|
|
||||||
You can optionally do the same with the other IEEE 1394/ FireWire
|
|
||||||
drivers.
|
|
||||||
|
|
||||||
If you have an old modprobe which doesn't implement the blacklist
|
|
||||||
directive, use either
|
|
||||||
|
|
||||||
install firewire-ohci /bin/true
|
|
||||||
or
|
|
||||||
install ohci1394 /bin/true
|
|
||||||
|
|
||||||
and so on, depending on which modules you DON't want to have
|
|
||||||
auto-loaded.
|
|
||||||
|
|
||||||
config FIREWIRE_OHCI
|
config FIREWIRE_OHCI
|
||||||
tristate "Support for OHCI FireWire host controllers"
|
tristate "Support for OHCI FireWire host controllers"
|
||||||
|
@ -57,8 +35,24 @@ config FIREWIRE_OHCI
|
||||||
|
|
||||||
NOTE:
|
NOTE:
|
||||||
|
|
||||||
If you also build ohci1394 of the classic stack, blacklist either
|
You should only build ohci1394 or firewire-ohci, but not both.
|
||||||
ohci1394 or firewire-ohci to let hotplug load only the desired driver.
|
If you nevertheless want to install both, you should configure them
|
||||||
|
only as modules and blacklist the driver(s) which you don't want to
|
||||||
|
have auto-loaded. Add either
|
||||||
|
|
||||||
|
blacklist firewire-ohci
|
||||||
|
or
|
||||||
|
blacklist ohci1394
|
||||||
|
blacklist video1394
|
||||||
|
blacklist dv1394
|
||||||
|
|
||||||
|
to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf
|
||||||
|
depending on your distribution. The latter two modules should be
|
||||||
|
blacklisted together with ohci1394 because they depend on ohci1394.
|
||||||
|
|
||||||
|
If you have an old modprobe which doesn't implement the blacklist
|
||||||
|
directive, use "install modulename /bin/true" for the modules to be
|
||||||
|
blacklisted.
|
||||||
|
|
||||||
config FIREWIRE_SBP2
|
config FIREWIRE_SBP2
|
||||||
tristate "Support for storage devices (SBP-2 protocol driver)"
|
tristate "Support for storage devices (SBP-2 protocol driver)"
|
||||||
|
@ -75,9 +69,3 @@ config FIREWIRE_SBP2
|
||||||
|
|
||||||
You should also enable support for disks, CD-ROMs, etc. in the SCSI
|
You should also enable support for disks, CD-ROMs, etc. in the SCSI
|
||||||
configuration section.
|
configuration section.
|
||||||
|
|
||||||
NOTE:
|
|
||||||
|
|
||||||
If you also build sbp2 of the classic stack, blacklist either sbp2
|
|
||||||
or firewire-sbp2 to let hotplug load only the desired driver.
|
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,10 @@
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC_PMAC
|
||||||
|
#include <asm/pmac_feature.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "fw-ohci.h"
|
#include "fw-ohci.h"
|
||||||
#include "fw-transaction.h"
|
#include "fw-transaction.h"
|
||||||
|
|
||||||
|
@ -175,6 +179,7 @@ struct fw_ohci {
|
||||||
int generation;
|
int generation;
|
||||||
int request_generation;
|
int request_generation;
|
||||||
u32 bus_seconds;
|
u32 bus_seconds;
|
||||||
|
bool old_uninorth;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Spinlock for accessing fw_ohci data. Never call out of
|
* Spinlock for accessing fw_ohci data. Never call out of
|
||||||
|
@ -276,19 +281,13 @@ static int ar_context_add_page(struct ar_context *ctx)
|
||||||
{
|
{
|
||||||
struct device *dev = ctx->ohci->card.device;
|
struct device *dev = ctx->ohci->card.device;
|
||||||
struct ar_buffer *ab;
|
struct ar_buffer *ab;
|
||||||
dma_addr_t ab_bus;
|
dma_addr_t uninitialized_var(ab_bus);
|
||||||
size_t offset;
|
size_t offset;
|
||||||
|
|
||||||
ab = (struct ar_buffer *) __get_free_page(GFP_ATOMIC);
|
ab = dma_alloc_coherent(dev, PAGE_SIZE, &ab_bus, GFP_ATOMIC);
|
||||||
if (ab == NULL)
|
if (ab == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ab_bus = dma_map_single(dev, ab, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
|
||||||
if (dma_mapping_error(ab_bus)) {
|
|
||||||
free_page((unsigned long) ab);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ab->descriptor, 0, sizeof(ab->descriptor));
|
memset(&ab->descriptor, 0, sizeof(ab->descriptor));
|
||||||
ab->descriptor.control = cpu_to_le16(DESCRIPTOR_INPUT_MORE |
|
ab->descriptor.control = cpu_to_le16(DESCRIPTOR_INPUT_MORE |
|
||||||
DESCRIPTOR_STATUS |
|
DESCRIPTOR_STATUS |
|
||||||
|
@ -299,8 +298,6 @@ static int ar_context_add_page(struct ar_context *ctx)
|
||||||
ab->descriptor.res_count = cpu_to_le16(PAGE_SIZE - offset);
|
ab->descriptor.res_count = cpu_to_le16(PAGE_SIZE - offset);
|
||||||
ab->descriptor.branch_address = 0;
|
ab->descriptor.branch_address = 0;
|
||||||
|
|
||||||
dma_sync_single_for_device(dev, ab_bus, PAGE_SIZE, DMA_BIDIRECTIONAL);
|
|
||||||
|
|
||||||
ctx->last_buffer->descriptor.branch_address = cpu_to_le32(ab_bus | 1);
|
ctx->last_buffer->descriptor.branch_address = cpu_to_le32(ab_bus | 1);
|
||||||
ctx->last_buffer->next = ab;
|
ctx->last_buffer->next = ab;
|
||||||
ctx->last_buffer = ab;
|
ctx->last_buffer = ab;
|
||||||
|
@ -311,15 +308,22 @@ static int ar_context_add_page(struct ar_context *ctx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32)
|
||||||
|
#define cond_le32_to_cpu(v) \
|
||||||
|
(ohci->old_uninorth ? (__force __u32)(v) : le32_to_cpu(v))
|
||||||
|
#else
|
||||||
|
#define cond_le32_to_cpu(v) le32_to_cpu(v)
|
||||||
|
#endif
|
||||||
|
|
||||||
static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
||||||
{
|
{
|
||||||
struct fw_ohci *ohci = ctx->ohci;
|
struct fw_ohci *ohci = ctx->ohci;
|
||||||
struct fw_packet p;
|
struct fw_packet p;
|
||||||
u32 status, length, tcode;
|
u32 status, length, tcode;
|
||||||
|
|
||||||
p.header[0] = le32_to_cpu(buffer[0]);
|
p.header[0] = cond_le32_to_cpu(buffer[0]);
|
||||||
p.header[1] = le32_to_cpu(buffer[1]);
|
p.header[1] = cond_le32_to_cpu(buffer[1]);
|
||||||
p.header[2] = le32_to_cpu(buffer[2]);
|
p.header[2] = cond_le32_to_cpu(buffer[2]);
|
||||||
|
|
||||||
tcode = (p.header[0] >> 4) & 0x0f;
|
tcode = (p.header[0] >> 4) & 0x0f;
|
||||||
switch (tcode) {
|
switch (tcode) {
|
||||||
|
@ -331,7 +335,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TCODE_READ_BLOCK_REQUEST :
|
case TCODE_READ_BLOCK_REQUEST :
|
||||||
p.header[3] = le32_to_cpu(buffer[3]);
|
p.header[3] = cond_le32_to_cpu(buffer[3]);
|
||||||
p.header_length = 16;
|
p.header_length = 16;
|
||||||
p.payload_length = 0;
|
p.payload_length = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -340,7 +344,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
||||||
case TCODE_READ_BLOCK_RESPONSE:
|
case TCODE_READ_BLOCK_RESPONSE:
|
||||||
case TCODE_LOCK_REQUEST:
|
case TCODE_LOCK_REQUEST:
|
||||||
case TCODE_LOCK_RESPONSE:
|
case TCODE_LOCK_RESPONSE:
|
||||||
p.header[3] = le32_to_cpu(buffer[3]);
|
p.header[3] = cond_le32_to_cpu(buffer[3]);
|
||||||
p.header_length = 16;
|
p.header_length = 16;
|
||||||
p.payload_length = p.header[3] >> 16;
|
p.payload_length = p.header[3] >> 16;
|
||||||
break;
|
break;
|
||||||
|
@ -357,7 +361,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
||||||
|
|
||||||
/* FIXME: What to do about evt_* errors? */
|
/* FIXME: What to do about evt_* errors? */
|
||||||
length = (p.header_length + p.payload_length + 3) / 4;
|
length = (p.header_length + p.payload_length + 3) / 4;
|
||||||
status = le32_to_cpu(buffer[length]);
|
status = cond_le32_to_cpu(buffer[length]);
|
||||||
|
|
||||||
p.ack = ((status >> 16) & 0x1f) - 16;
|
p.ack = ((status >> 16) & 0x1f) - 16;
|
||||||
p.speed = (status >> 21) & 0x7;
|
p.speed = (status >> 21) & 0x7;
|
||||||
|
@ -375,7 +379,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (p.ack + 16 == 0x09)
|
if (p.ack + 16 == 0x09)
|
||||||
ohci->request_generation = (buffer[2] >> 16) & 0xff;
|
ohci->request_generation = (p.header[2] >> 16) & 0xff;
|
||||||
else if (ctx == &ohci->ar_request_ctx)
|
else if (ctx == &ohci->ar_request_ctx)
|
||||||
fw_core_handle_request(&ohci->card, &p);
|
fw_core_handle_request(&ohci->card, &p);
|
||||||
else
|
else
|
||||||
|
@ -397,6 +401,7 @@ static void ar_context_tasklet(unsigned long data)
|
||||||
|
|
||||||
if (d->res_count == 0) {
|
if (d->res_count == 0) {
|
||||||
size_t size, rest, offset;
|
size_t size, rest, offset;
|
||||||
|
dma_addr_t buffer_bus;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This descriptor is finished and we may have a
|
* This descriptor is finished and we may have a
|
||||||
|
@ -405,9 +410,7 @@ static void ar_context_tasklet(unsigned long data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
offset = offsetof(struct ar_buffer, data);
|
offset = offsetof(struct ar_buffer, data);
|
||||||
dma_unmap_single(ohci->card.device,
|
buffer_bus = le32_to_cpu(ab->descriptor.data_address) - offset;
|
||||||
le32_to_cpu(ab->descriptor.data_address) - offset,
|
|
||||||
PAGE_SIZE, DMA_BIDIRECTIONAL);
|
|
||||||
|
|
||||||
buffer = ab;
|
buffer = ab;
|
||||||
ab = ab->next;
|
ab = ab->next;
|
||||||
|
@ -423,7 +426,8 @@ static void ar_context_tasklet(unsigned long data)
|
||||||
while (buffer < end)
|
while (buffer < end)
|
||||||
buffer = handle_ar_packet(ctx, buffer);
|
buffer = handle_ar_packet(ctx, buffer);
|
||||||
|
|
||||||
free_page((unsigned long)buffer);
|
dma_free_coherent(ohci->card.device, PAGE_SIZE,
|
||||||
|
buffer, buffer_bus);
|
||||||
ar_context_add_page(ctx);
|
ar_context_add_page(ctx);
|
||||||
} else {
|
} else {
|
||||||
buffer = ctx->pointer;
|
buffer = ctx->pointer;
|
||||||
|
@ -532,7 +536,7 @@ static int
|
||||||
context_add_buffer(struct context *ctx)
|
context_add_buffer(struct context *ctx)
|
||||||
{
|
{
|
||||||
struct descriptor_buffer *desc;
|
struct descriptor_buffer *desc;
|
||||||
dma_addr_t bus_addr;
|
dma_addr_t uninitialized_var(bus_addr);
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1022,13 +1026,14 @@ static void bus_reset_tasklet(unsigned long data)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
self_id_count = (reg_read(ohci, OHCI1394_SelfIDCount) >> 3) & 0x3ff;
|
self_id_count = (reg_read(ohci, OHCI1394_SelfIDCount) >> 3) & 0x3ff;
|
||||||
generation = (le32_to_cpu(ohci->self_id_cpu[0]) >> 16) & 0xff;
|
generation = (cond_le32_to_cpu(ohci->self_id_cpu[0]) >> 16) & 0xff;
|
||||||
rmb();
|
rmb();
|
||||||
|
|
||||||
for (i = 1, j = 0; j < self_id_count; i += 2, j++) {
|
for (i = 1, j = 0; j < self_id_count; i += 2, j++) {
|
||||||
if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1])
|
if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1])
|
||||||
fw_error("inconsistent self IDs\n");
|
fw_error("inconsistent self IDs\n");
|
||||||
ohci->self_id_buffer[j] = le32_to_cpu(ohci->self_id_cpu[i]);
|
ohci->self_id_buffer[j] =
|
||||||
|
cond_le32_to_cpu(ohci->self_id_cpu[i]);
|
||||||
}
|
}
|
||||||
rmb();
|
rmb();
|
||||||
|
|
||||||
|
@ -1316,7 +1321,7 @@ ohci_set_config_rom(struct fw_card *card, u32 *config_rom, size_t length)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int retval = -EBUSY;
|
int retval = -EBUSY;
|
||||||
__be32 *next_config_rom;
|
__be32 *next_config_rom;
|
||||||
dma_addr_t next_config_rom_bus;
|
dma_addr_t uninitialized_var(next_config_rom_bus);
|
||||||
|
|
||||||
ohci = fw_ohci(card);
|
ohci = fw_ohci(card);
|
||||||
|
|
||||||
|
@ -1487,7 +1492,7 @@ static int handle_ir_dualbuffer_packet(struct context *context,
|
||||||
void *p, *end;
|
void *p, *end;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (db->first_res_count > 0 && db->second_res_count > 0) {
|
if (db->first_res_count != 0 && db->second_res_count != 0) {
|
||||||
if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) {
|
if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) {
|
||||||
/* This descriptor isn't done yet, stop iteration. */
|
/* This descriptor isn't done yet, stop iteration. */
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1513,7 +1518,7 @@ static int handle_ir_dualbuffer_packet(struct context *context,
|
||||||
memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4);
|
memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4);
|
||||||
i += ctx->base.header_size;
|
i += ctx->base.header_size;
|
||||||
ctx->excess_bytes +=
|
ctx->excess_bytes +=
|
||||||
(le32_to_cpu(*(u32 *)(p + 4)) >> 16) & 0xffff;
|
(le32_to_cpu(*(__le32 *)(p + 4)) >> 16) & 0xffff;
|
||||||
p += ctx->base.header_size + 4;
|
p += ctx->base.header_size + 4;
|
||||||
}
|
}
|
||||||
ctx->header_length = i;
|
ctx->header_length = i;
|
||||||
|
@ -2048,6 +2053,18 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
|
||||||
int err;
|
int err;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC_PMAC
|
||||||
|
/* Necessary on some machines if fw-ohci was loaded/ unloaded before */
|
||||||
|
if (machine_is(powermac)) {
|
||||||
|
struct device_node *ofn = pci_device_to_OF_node(dev);
|
||||||
|
|
||||||
|
if (ofn) {
|
||||||
|
pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 1);
|
||||||
|
pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_PPC_PMAC */
|
||||||
|
|
||||||
ohci = kzalloc(sizeof(*ohci), GFP_KERNEL);
|
ohci = kzalloc(sizeof(*ohci), GFP_KERNEL);
|
||||||
if (ohci == NULL) {
|
if (ohci == NULL) {
|
||||||
fw_error("Could not malloc fw_ohci data.\n");
|
fw_error("Could not malloc fw_ohci data.\n");
|
||||||
|
@ -2066,6 +2083,10 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
|
||||||
pci_write_config_dword(dev, OHCI1394_PCI_HCI_Control, 0);
|
pci_write_config_dword(dev, OHCI1394_PCI_HCI_Control, 0);
|
||||||
pci_set_drvdata(dev, ohci);
|
pci_set_drvdata(dev, ohci);
|
||||||
|
|
||||||
|
#if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32)
|
||||||
|
ohci->old_uninorth = dev->vendor == PCI_VENDOR_ID_APPLE &&
|
||||||
|
dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW;
|
||||||
|
#endif
|
||||||
spin_lock_init(&ohci->lock);
|
spin_lock_init(&ohci->lock);
|
||||||
|
|
||||||
tasklet_init(&ohci->bus_reset_tasklet,
|
tasklet_init(&ohci->bus_reset_tasklet,
|
||||||
|
@ -2182,6 +2203,19 @@ static void pci_remove(struct pci_dev *dev)
|
||||||
pci_disable_device(dev);
|
pci_disable_device(dev);
|
||||||
fw_card_put(&ohci->card);
|
fw_card_put(&ohci->card);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC_PMAC
|
||||||
|
/* On UniNorth, power down the cable and turn off the chip clock
|
||||||
|
* to save power on laptops */
|
||||||
|
if (machine_is(powermac)) {
|
||||||
|
struct device_node *ofn = pci_device_to_OF_node(dev);
|
||||||
|
|
||||||
|
if (ofn) {
|
||||||
|
pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0);
|
||||||
|
pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_PPC_PMAC */
|
||||||
|
|
||||||
fw_notify("Removed fw-ohci device.\n");
|
fw_notify("Removed fw-ohci device.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2202,6 +2236,16 @@ static int pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||||
if (err)
|
if (err)
|
||||||
fw_error("pci_set_power_state failed with %d\n", err);
|
fw_error("pci_set_power_state failed with %d\n", err);
|
||||||
|
|
||||||
|
/* PowerMac suspend code comes last */
|
||||||
|
#ifdef CONFIG_PPC_PMAC
|
||||||
|
if (machine_is(powermac)) {
|
||||||
|
struct device_node *ofn = pci_device_to_OF_node(pdev);
|
||||||
|
|
||||||
|
if (ofn)
|
||||||
|
pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_PPC_PMAC */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2210,6 +2254,16 @@ static int pci_resume(struct pci_dev *pdev)
|
||||||
struct fw_ohci *ohci = pci_get_drvdata(pdev);
|
struct fw_ohci *ohci = pci_get_drvdata(pdev);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
/* PowerMac resume code comes first */
|
||||||
|
#ifdef CONFIG_PPC_PMAC
|
||||||
|
if (machine_is(powermac)) {
|
||||||
|
struct device_node *ofn = pci_device_to_OF_node(pdev);
|
||||||
|
|
||||||
|
if (ofn)
|
||||||
|
pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_PPC_PMAC */
|
||||||
|
|
||||||
pci_set_power_state(pdev, PCI_D0);
|
pci_set_power_state(pdev, PCI_D0);
|
||||||
pci_restore_state(pdev);
|
pci_restore_state(pdev);
|
||||||
err = pci_enable_device(pdev);
|
err = pci_enable_device(pdev);
|
||||||
|
|
|
@ -173,6 +173,7 @@ struct sbp2_target {
|
||||||
#define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */
|
#define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */
|
||||||
#define SBP2_ORB_NULL 0x80000000
|
#define SBP2_ORB_NULL 0x80000000
|
||||||
#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
|
#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
|
||||||
|
#define SBP2_RETRY_LIMIT 0xf /* 15 retries */
|
||||||
|
|
||||||
#define SBP2_DIRECTION_TO_MEDIA 0x0
|
#define SBP2_DIRECTION_TO_MEDIA 0x0
|
||||||
#define SBP2_DIRECTION_FROM_MEDIA 0x1
|
#define SBP2_DIRECTION_FROM_MEDIA 0x1
|
||||||
|
@ -330,6 +331,11 @@ static const struct {
|
||||||
.model = ~0,
|
.model = ~0,
|
||||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||||
},
|
},
|
||||||
|
/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
|
||||||
|
.firmware_revision = 0x002600,
|
||||||
|
.model = ~0,
|
||||||
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||||
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are iPods (2nd gen, 3rd gen) with model_id == 0, but
|
* There are iPods (2nd gen, 3rd gen) with model_id == 0, but
|
||||||
|
@ -812,6 +818,30 @@ static void sbp2_target_put(struct sbp2_target *tgt)
|
||||||
kref_put(&tgt->kref, sbp2_release_target);
|
kref_put(&tgt->kref, sbp2_release_target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
complete_set_busy_timeout(struct fw_card *card, int rcode,
|
||||||
|
void *payload, size_t length, void *done)
|
||||||
|
{
|
||||||
|
complete(done);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu)
|
||||||
|
{
|
||||||
|
struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
|
||||||
|
DECLARE_COMPLETION_ONSTACK(done);
|
||||||
|
struct fw_transaction t;
|
||||||
|
static __be32 busy_timeout;
|
||||||
|
|
||||||
|
/* FIXME: we should try to set dual-phase cycle_limit too */
|
||||||
|
busy_timeout = cpu_to_be32(SBP2_RETRY_LIMIT);
|
||||||
|
|
||||||
|
fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST,
|
||||||
|
lu->tgt->node_id, lu->generation, device->max_speed,
|
||||||
|
CSR_REGISTER_BASE + CSR_BUSY_TIMEOUT, &busy_timeout,
|
||||||
|
sizeof(busy_timeout), complete_set_busy_timeout, &done);
|
||||||
|
wait_for_completion(&done);
|
||||||
|
}
|
||||||
|
|
||||||
static void sbp2_reconnect(struct work_struct *work);
|
static void sbp2_reconnect(struct work_struct *work);
|
||||||
|
|
||||||
static void sbp2_login(struct work_struct *work)
|
static void sbp2_login(struct work_struct *work)
|
||||||
|
@ -864,10 +894,8 @@ static void sbp2_login(struct work_struct *work)
|
||||||
fw_notify("%s: logged in to LUN %04x (%d retries)\n",
|
fw_notify("%s: logged in to LUN %04x (%d retries)\n",
|
||||||
tgt->bus_id, lu->lun, lu->retries);
|
tgt->bus_id, lu->lun, lu->retries);
|
||||||
|
|
||||||
#if 0
|
/* set appropriate retry limit(s) in BUSY_TIMEOUT register */
|
||||||
/* FIXME: The linux1394 sbp2 does this last step. */
|
sbp2_set_busy_timeout(lu);
|
||||||
sbp2_set_busy_timeout(scsi_id);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect);
|
PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect);
|
||||||
sbp2_agent_reset(lu);
|
sbp2_agent_reset(lu);
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
|
#include <asm/bug.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include "fw-transaction.h"
|
#include "fw-transaction.h"
|
||||||
#include "fw-topology.h"
|
#include "fw-topology.h"
|
||||||
|
@ -424,8 +425,8 @@ update_tree(struct fw_card *card, struct fw_node *root)
|
||||||
node1 = fw_node(list1.next);
|
node1 = fw_node(list1.next);
|
||||||
|
|
||||||
while (&node0->link != &list0) {
|
while (&node0->link != &list0) {
|
||||||
|
WARN_ON(node0->port_count != node1->port_count);
|
||||||
|
|
||||||
/* assert(node0->port_count == node1->port_count); */
|
|
||||||
if (node0->link_on && !node1->link_on)
|
if (node0->link_on && !node1->link_on)
|
||||||
event = FW_NODE_LINK_OFF;
|
event = FW_NODE_LINK_OFF;
|
||||||
else if (!node0->link_on && node1->link_on)
|
else if (!node0->link_on && node1->link_on)
|
||||||
|
|
|
@ -751,7 +751,7 @@ handle_topology_map(struct fw_card *card, struct fw_request *request,
|
||||||
void *payload, size_t length, void *callback_data)
|
void *payload, size_t length, void *callback_data)
|
||||||
{
|
{
|
||||||
int i, start, end;
|
int i, start, end;
|
||||||
u32 *map;
|
__be32 *map;
|
||||||
|
|
||||||
if (!TCODE_IS_READ_REQUEST(tcode)) {
|
if (!TCODE_IS_READ_REQUEST(tcode)) {
|
||||||
fw_send_response(card, request, RCODE_TYPE_ERROR);
|
fw_send_response(card, request, RCODE_TYPE_ERROR);
|
||||||
|
|
|
@ -86,12 +86,12 @@
|
||||||
static inline void
|
static inline void
|
||||||
fw_memcpy_from_be32(void *_dst, void *_src, size_t size)
|
fw_memcpy_from_be32(void *_dst, void *_src, size_t size)
|
||||||
{
|
{
|
||||||
u32 *dst = _dst;
|
u32 *dst = _dst;
|
||||||
u32 *src = _src;
|
__be32 *src = _src;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < size / 4; i++)
|
for (i = 0; i < size / 4; i++)
|
||||||
dst[i] = cpu_to_be32(src[i]);
|
dst[i] = be32_to_cpu(src[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
|
@ -376,6 +376,11 @@ static const struct {
|
||||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||||
},
|
},
|
||||||
|
/* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ {
|
||||||
|
.firmware_revision = 0x002600,
|
||||||
|
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||||
|
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||||
|
},
|
||||||
/* iPod 4th generation */ {
|
/* iPod 4th generation */ {
|
||||||
.firmware_revision = 0x0a2700,
|
.firmware_revision = 0x0a2700,
|
||||||
.model_id = 0x000021,
|
.model_id = 0x000021,
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
#define IPATH_IB_LINKDOWN 0
|
#define IPATH_IB_LINKDOWN 0
|
||||||
#define IPATH_IB_LINKARM 1
|
#define IPATH_IB_LINKARM 1
|
||||||
#define IPATH_IB_LINKACTIVE 2
|
#define IPATH_IB_LINKACTIVE 2
|
||||||
#define IPATH_IB_LINKINIT 3
|
#define IPATH_IB_LINKDOWN_ONLY 3
|
||||||
#define IPATH_IB_LINKDOWN_SLEEP 4
|
#define IPATH_IB_LINKDOWN_SLEEP 4
|
||||||
#define IPATH_IB_LINKDOWN_DISABLE 5
|
#define IPATH_IB_LINKDOWN_DISABLE 5
|
||||||
#define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */
|
#define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */
|
||||||
|
|
|
@ -851,8 +851,7 @@ void ipath_disarm_piobufs(struct ipath_devdata *dd, unsigned first,
|
||||||
* -ETIMEDOUT state can have multiple states set, for any of several
|
* -ETIMEDOUT state can have multiple states set, for any of several
|
||||||
* transitions.
|
* transitions.
|
||||||
*/
|
*/
|
||||||
static int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state,
|
int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state, int msecs)
|
||||||
int msecs)
|
|
||||||
{
|
{
|
||||||
dd->ipath_state_wanted = state;
|
dd->ipath_state_wanted = state;
|
||||||
wait_event_interruptible_timeout(ipath_state_wait,
|
wait_event_interruptible_timeout(ipath_state_wait,
|
||||||
|
@ -1656,8 +1655,8 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl)
|
||||||
static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
|
static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
|
||||||
{
|
{
|
||||||
static const char *what[4] = {
|
static const char *what[4] = {
|
||||||
[0] = "DOWN",
|
[0] = "NOP",
|
||||||
[INFINIPATH_IBCC_LINKCMD_INIT] = "INIT",
|
[INFINIPATH_IBCC_LINKCMD_DOWN] = "DOWN",
|
||||||
[INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED",
|
[INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED",
|
||||||
[INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE"
|
[INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE"
|
||||||
};
|
};
|
||||||
|
@ -1672,9 +1671,9 @@ static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which)
|
||||||
(dd, dd->ipath_kregs->kr_ibcstatus) >>
|
(dd, dd->ipath_kregs->kr_ibcstatus) >>
|
||||||
INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) &
|
INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) &
|
||||||
INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]);
|
INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]);
|
||||||
/* flush all queued sends when going to DOWN or INIT, to be sure that
|
/* flush all queued sends when going to DOWN to be sure that
|
||||||
* they don't block MAD packets */
|
* they don't block MAD packets */
|
||||||
if (!linkcmd || linkcmd == INFINIPATH_IBCC_LINKCMD_INIT)
|
if (linkcmd == INFINIPATH_IBCC_LINKCMD_DOWN)
|
||||||
ipath_cancel_sends(dd, 1);
|
ipath_cancel_sends(dd, 1);
|
||||||
|
|
||||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl,
|
ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl,
|
||||||
|
@ -1687,6 +1686,13 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
switch (newstate) {
|
switch (newstate) {
|
||||||
|
case IPATH_IB_LINKDOWN_ONLY:
|
||||||
|
ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_DOWN <<
|
||||||
|
INFINIPATH_IBCC_LINKCMD_SHIFT);
|
||||||
|
/* don't wait */
|
||||||
|
ret = 0;
|
||||||
|
goto bail;
|
||||||
|
|
||||||
case IPATH_IB_LINKDOWN:
|
case IPATH_IB_LINKDOWN:
|
||||||
ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL <<
|
ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL <<
|
||||||
INFINIPATH_IBCC_LINKINITCMD_SHIFT);
|
INFINIPATH_IBCC_LINKINITCMD_SHIFT);
|
||||||
|
@ -1709,16 +1715,6 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
||||||
case IPATH_IB_LINKINIT:
|
|
||||||
if (dd->ipath_flags & IPATH_LINKINIT) {
|
|
||||||
ret = 0;
|
|
||||||
goto bail;
|
|
||||||
}
|
|
||||||
ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_INIT <<
|
|
||||||
INFINIPATH_IBCC_LINKCMD_SHIFT);
|
|
||||||
lstate = IPATH_LINKINIT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IPATH_IB_LINKARM:
|
case IPATH_IB_LINKARM:
|
||||||
if (dd->ipath_flags & IPATH_LINKARMED) {
|
if (dd->ipath_flags & IPATH_LINKARMED) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
|
@ -767,6 +767,7 @@ void ipath_kreceive(struct ipath_portdata *);
|
||||||
int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned);
|
int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned);
|
||||||
int ipath_reset_device(int);
|
int ipath_reset_device(int);
|
||||||
void ipath_get_faststats(unsigned long);
|
void ipath_get_faststats(unsigned long);
|
||||||
|
int ipath_wait_linkstate(struct ipath_devdata *, u32, int);
|
||||||
int ipath_set_linkstate(struct ipath_devdata *, u8);
|
int ipath_set_linkstate(struct ipath_devdata *, u8);
|
||||||
int ipath_set_mtu(struct ipath_devdata *, u16);
|
int ipath_set_mtu(struct ipath_devdata *, u16);
|
||||||
int ipath_set_lid(struct ipath_devdata *, u32, u8);
|
int ipath_set_lid(struct ipath_devdata *, u32, u8);
|
||||||
|
|
|
@ -555,10 +555,7 @@ static int recv_subn_set_portinfo(struct ib_smp *smp,
|
||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case IB_PORT_DOWN:
|
case IB_PORT_DOWN:
|
||||||
if (lstate == 0)
|
if (lstate == 0)
|
||||||
if (get_linkdowndefaultstate(dd))
|
lstate = IPATH_IB_LINKDOWN_ONLY;
|
||||||
lstate = IPATH_IB_LINKDOWN_SLEEP;
|
|
||||||
else
|
|
||||||
lstate = IPATH_IB_LINKDOWN;
|
|
||||||
else if (lstate == 1)
|
else if (lstate == 1)
|
||||||
lstate = IPATH_IB_LINKDOWN_SLEEP;
|
lstate = IPATH_IB_LINKDOWN_SLEEP;
|
||||||
else if (lstate == 2)
|
else if (lstate == 2)
|
||||||
|
@ -568,6 +565,8 @@ static int recv_subn_set_portinfo(struct ib_smp *smp,
|
||||||
else
|
else
|
||||||
goto err;
|
goto err;
|
||||||
ipath_set_linkstate(dd, lstate);
|
ipath_set_linkstate(dd, lstate);
|
||||||
|
ipath_wait_linkstate(dd, IPATH_LINKINIT | IPATH_LINKARMED |
|
||||||
|
IPATH_LINKACTIVE, 1000);
|
||||||
break;
|
break;
|
||||||
case IB_PORT_ARMED:
|
case IB_PORT_ARMED:
|
||||||
ipath_set_linkstate(dd, IPATH_IB_LINKARM);
|
ipath_set_linkstate(dd, IPATH_IB_LINKARM);
|
||||||
|
|
|
@ -329,8 +329,9 @@ struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn)
|
||||||
/**
|
/**
|
||||||
* ipath_reset_qp - initialize the QP state to the reset state
|
* ipath_reset_qp - initialize the QP state to the reset state
|
||||||
* @qp: the QP to reset
|
* @qp: the QP to reset
|
||||||
|
* @type: the QP type
|
||||||
*/
|
*/
|
||||||
static void ipath_reset_qp(struct ipath_qp *qp)
|
static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type)
|
||||||
{
|
{
|
||||||
qp->remote_qpn = 0;
|
qp->remote_qpn = 0;
|
||||||
qp->qkey = 0;
|
qp->qkey = 0;
|
||||||
|
@ -342,7 +343,7 @@ static void ipath_reset_qp(struct ipath_qp *qp)
|
||||||
qp->s_psn = 0;
|
qp->s_psn = 0;
|
||||||
qp->r_psn = 0;
|
qp->r_psn = 0;
|
||||||
qp->r_msn = 0;
|
qp->r_msn = 0;
|
||||||
if (qp->ibqp.qp_type == IB_QPT_RC) {
|
if (type == IB_QPT_RC) {
|
||||||
qp->s_state = IB_OPCODE_RC_SEND_LAST;
|
qp->s_state = IB_OPCODE_RC_SEND_LAST;
|
||||||
qp->r_state = IB_OPCODE_RC_SEND_LAST;
|
qp->r_state = IB_OPCODE_RC_SEND_LAST;
|
||||||
} else {
|
} else {
|
||||||
|
@ -414,7 +415,7 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err)
|
||||||
wc.wr_id = qp->r_wr_id;
|
wc.wr_id = qp->r_wr_id;
|
||||||
wc.opcode = IB_WC_RECV;
|
wc.opcode = IB_WC_RECV;
|
||||||
wc.status = err;
|
wc.status = err;
|
||||||
ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1);
|
ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1);
|
||||||
}
|
}
|
||||||
wc.status = IB_WC_WR_FLUSH_ERR;
|
wc.status = IB_WC_WR_FLUSH_ERR;
|
||||||
|
|
||||||
|
@ -534,7 +535,7 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
|
|
||||||
switch (new_state) {
|
switch (new_state) {
|
||||||
case IB_QPS_RESET:
|
case IB_QPS_RESET:
|
||||||
ipath_reset_qp(qp);
|
ipath_reset_qp(qp, ibqp->qp_type);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IB_QPS_ERR:
|
case IB_QPS_ERR:
|
||||||
|
@ -647,7 +648,7 @@ int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||||
attr->port_num = 1;
|
attr->port_num = 1;
|
||||||
attr->timeout = qp->timeout;
|
attr->timeout = qp->timeout;
|
||||||
attr->retry_cnt = qp->s_retry_cnt;
|
attr->retry_cnt = qp->s_retry_cnt;
|
||||||
attr->rnr_retry = qp->s_rnr_retry;
|
attr->rnr_retry = qp->s_rnr_retry_cnt;
|
||||||
attr->alt_port_num = 0;
|
attr->alt_port_num = 0;
|
||||||
attr->alt_timeout = 0;
|
attr->alt_timeout = 0;
|
||||||
|
|
||||||
|
@ -839,7 +840,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
|
||||||
goto bail_qp;
|
goto bail_qp;
|
||||||
}
|
}
|
||||||
qp->ip = NULL;
|
qp->ip = NULL;
|
||||||
ipath_reset_qp(qp);
|
ipath_reset_qp(qp, init_attr->qp_type);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1196,6 +1196,10 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev,
|
||||||
list_move_tail(&qp->timerwait,
|
list_move_tail(&qp->timerwait,
|
||||||
&dev->pending[dev->pending_index]);
|
&dev->pending[dev->pending_index]);
|
||||||
spin_unlock(&dev->pending_lock);
|
spin_unlock(&dev->pending_lock);
|
||||||
|
|
||||||
|
if (opcode == OP(RDMA_READ_RESPONSE_MIDDLE))
|
||||||
|
qp->s_retry = qp->s_retry_cnt;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the RDMA receive state but do the copy w/o
|
* Update the RDMA receive state but do the copy w/o
|
||||||
* holding the locks and blocking interrupts.
|
* holding the locks and blocking interrupts.
|
||||||
|
|
|
@ -185,7 +185,7 @@
|
||||||
#define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3
|
#define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3
|
||||||
#define INFINIPATH_IBCC_LINKINITCMD_SHIFT 16
|
#define INFINIPATH_IBCC_LINKINITCMD_SHIFT 16
|
||||||
#define INFINIPATH_IBCC_LINKCMD_MASK 0x3ULL
|
#define INFINIPATH_IBCC_LINKCMD_MASK 0x3ULL
|
||||||
#define INFINIPATH_IBCC_LINKCMD_INIT 1 /* move to 0x11 */
|
#define INFINIPATH_IBCC_LINKCMD_DOWN 1 /* move to 0x11 */
|
||||||
#define INFINIPATH_IBCC_LINKCMD_ARMED 2 /* move to 0x21 */
|
#define INFINIPATH_IBCC_LINKCMD_ARMED 2 /* move to 0x21 */
|
||||||
#define INFINIPATH_IBCC_LINKCMD_ACTIVE 3 /* move to 0x31 */
|
#define INFINIPATH_IBCC_LINKCMD_ACTIVE 3 /* move to 0x31 */
|
||||||
#define INFINIPATH_IBCC_LINKCMD_SHIFT 18
|
#define INFINIPATH_IBCC_LINKCMD_SHIFT 18
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <net/icmp.h>
|
#include <net/icmp.h>
|
||||||
#include <linux/icmpv6.h>
|
#include <linux/icmpv6.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
#include "ipoib.h"
|
#include "ipoib.h"
|
||||||
|
|
||||||
|
@ -637,6 +638,7 @@ static inline int post_send(struct ipoib_dev_priv *priv,
|
||||||
priv->tx_sge[0].addr = addr;
|
priv->tx_sge[0].addr = addr;
|
||||||
priv->tx_sge[0].length = len;
|
priv->tx_sge[0].length = len;
|
||||||
|
|
||||||
|
priv->tx_wr.num_sge = 1;
|
||||||
priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM;
|
priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM;
|
||||||
|
|
||||||
return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr);
|
return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr);
|
||||||
|
@ -1030,13 +1032,13 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
|
||||||
struct ipoib_dev_priv *priv = netdev_priv(p->dev);
|
struct ipoib_dev_priv *priv = netdev_priv(p->dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
p->tx_ring = kzalloc(ipoib_sendq_size * sizeof *p->tx_ring,
|
p->tx_ring = vmalloc(ipoib_sendq_size * sizeof *p->tx_ring);
|
||||||
GFP_KERNEL);
|
|
||||||
if (!p->tx_ring) {
|
if (!p->tx_ring) {
|
||||||
ipoib_warn(priv, "failed to allocate tx ring\n");
|
ipoib_warn(priv, "failed to allocate tx ring\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_tx;
|
goto err_tx;
|
||||||
}
|
}
|
||||||
|
memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring);
|
||||||
|
|
||||||
p->qp = ipoib_cm_create_tx_qp(p->dev, p);
|
p->qp = ipoib_cm_create_tx_qp(p->dev, p);
|
||||||
if (IS_ERR(p->qp)) {
|
if (IS_ERR(p->qp)) {
|
||||||
|
@ -1077,6 +1079,7 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
|
||||||
ib_destroy_qp(p->qp);
|
ib_destroy_qp(p->qp);
|
||||||
err_qp:
|
err_qp:
|
||||||
p->qp = NULL;
|
p->qp = NULL;
|
||||||
|
vfree(p->tx_ring);
|
||||||
err_tx:
|
err_tx:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1127,7 +1130,7 @@ static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p)
|
||||||
if (p->qp)
|
if (p->qp)
|
||||||
ib_destroy_qp(p->qp);
|
ib_destroy_qp(p->qp);
|
||||||
|
|
||||||
kfree(p->tx_ring);
|
vfree(p->tx_ring);
|
||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
|
|
||||||
#include <linux/if_arp.h> /* For ARPHRD_xxx */
|
#include <linux/if_arp.h> /* For ARPHRD_xxx */
|
||||||
|
|
||||||
|
@ -887,13 +888,13 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->tx_ring = kzalloc(ipoib_sendq_size * sizeof *priv->tx_ring,
|
priv->tx_ring = vmalloc(ipoib_sendq_size * sizeof *priv->tx_ring);
|
||||||
GFP_KERNEL);
|
|
||||||
if (!priv->tx_ring) {
|
if (!priv->tx_ring) {
|
||||||
printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n",
|
printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n",
|
||||||
ca->name, ipoib_sendq_size);
|
ca->name, ipoib_sendq_size);
|
||||||
goto out_rx_ring_cleanup;
|
goto out_rx_ring_cleanup;
|
||||||
}
|
}
|
||||||
|
memset(priv->tx_ring, 0, ipoib_sendq_size * sizeof *priv->tx_ring);
|
||||||
|
|
||||||
/* priv->tx_head, tx_tail & tx_outstanding are already 0 */
|
/* priv->tx_head, tx_tail & tx_outstanding are already 0 */
|
||||||
|
|
||||||
|
@ -903,7 +904,7 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_tx_ring_cleanup:
|
out_tx_ring_cleanup:
|
||||||
kfree(priv->tx_ring);
|
vfree(priv->tx_ring);
|
||||||
|
|
||||||
out_rx_ring_cleanup:
|
out_rx_ring_cleanup:
|
||||||
kfree(priv->rx_ring);
|
kfree(priv->rx_ring);
|
||||||
|
@ -928,7 +929,7 @@ void ipoib_dev_cleanup(struct net_device *dev)
|
||||||
ipoib_ib_dev_cleanup(dev);
|
ipoib_ib_dev_cleanup(dev);
|
||||||
|
|
||||||
kfree(priv->rx_ring);
|
kfree(priv->rx_ring);
|
||||||
kfree(priv->tx_ring);
|
vfree(priv->tx_ring);
|
||||||
|
|
||||||
priv->rx_ring = NULL;
|
priv->rx_ring = NULL;
|
||||||
priv->tx_ring = NULL;
|
priv->tx_ring = NULL;
|
||||||
|
|
|
@ -650,7 +650,7 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb)
|
||||||
*/
|
*/
|
||||||
spin_lock(&priv->lock);
|
spin_lock(&priv->lock);
|
||||||
|
|
||||||
if (!test_bit(IPOIB_MCAST_STARTED, &priv->flags) ||
|
if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) ||
|
||||||
!priv->broadcast ||
|
!priv->broadcast ||
|
||||||
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
|
!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
|
||||||
++dev->stats.tx_dropped;
|
++dev->stats.tx_dropped;
|
||||||
|
|
|
@ -108,6 +108,7 @@ config ACER_WMI
|
||||||
depends on ACPI
|
depends on ACPI
|
||||||
depends on LEDS_CLASS
|
depends on LEDS_CLASS
|
||||||
depends on BACKLIGHT_CLASS_DEVICE
|
depends on BACKLIGHT_CLASS_DEVICE
|
||||||
|
depends on SERIO_I8042
|
||||||
select ACPI_WMI
|
select ACPI_WMI
|
||||||
---help---
|
---help---
|
||||||
This is a driver for newer Acer (and Wistron) laptops. It adds
|
This is a driver for newer Acer (and Wistron) laptops. It adds
|
||||||
|
|
|
@ -217,6 +217,15 @@ static struct dmi_system_id acer_quirks[] = {
|
||||||
},
|
},
|
||||||
.driver_data = &quirk_acer_travelmate_2490,
|
.driver_data = &quirk_acer_travelmate_2490,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.callback = dmi_matched,
|
||||||
|
.ident = "Acer Aspire 3610",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3610"),
|
||||||
|
},
|
||||||
|
.driver_data = &quirk_acer_travelmate_2490,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.callback = dmi_matched,
|
.callback = dmi_matched,
|
||||||
.ident = "Acer Aspire 5100",
|
.ident = "Acer Aspire 5100",
|
||||||
|
@ -226,6 +235,15 @@ static struct dmi_system_id acer_quirks[] = {
|
||||||
},
|
},
|
||||||
.driver_data = &quirk_acer_travelmate_2490,
|
.driver_data = &quirk_acer_travelmate_2490,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.callback = dmi_matched,
|
||||||
|
.ident = "Acer Aspire 5610",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
|
||||||
|
},
|
||||||
|
.driver_data = &quirk_acer_travelmate_2490,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.callback = dmi_matched,
|
.callback = dmi_matched,
|
||||||
.ident = "Acer Aspire 5630",
|
.ident = "Acer Aspire 5630",
|
||||||
|
@ -761,11 +779,11 @@ enum led_brightness value)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct led_classdev mail_led = {
|
static struct led_classdev mail_led = {
|
||||||
.name = "acer-mail:green",
|
.name = "acer-wmi::mail",
|
||||||
.brightness_set = mail_led_set,
|
.brightness_set = mail_led_set,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init acer_led_init(struct device *dev)
|
static int __devinit acer_led_init(struct device *dev)
|
||||||
{
|
{
|
||||||
return led_classdev_register(dev, &mail_led);
|
return led_classdev_register(dev, &mail_led);
|
||||||
}
|
}
|
||||||
|
@ -798,7 +816,7 @@ static struct backlight_ops acer_bl_ops = {
|
||||||
.update_status = update_bl_status,
|
.update_status = update_bl_status,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init acer_backlight_init(struct device *dev)
|
static int __devinit acer_backlight_init(struct device *dev)
|
||||||
{
|
{
|
||||||
struct backlight_device *bd;
|
struct backlight_device *bd;
|
||||||
|
|
||||||
|
@ -817,7 +835,7 @@ static int __init acer_backlight_init(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit acer_backlight_exit(void)
|
static void acer_backlight_exit(void)
|
||||||
{
|
{
|
||||||
backlight_device_unregister(acer_backlight_device);
|
backlight_device_unregister(acer_backlight_device);
|
||||||
}
|
}
|
||||||
|
@ -1052,11 +1070,12 @@ static int __init acer_wmi_init(void)
|
||||||
|
|
||||||
if (wmi_has_guid(WMID_GUID2) && interface) {
|
if (wmi_has_guid(WMID_GUID2) && interface) {
|
||||||
if (ACPI_FAILURE(WMID_set_capabilities())) {
|
if (ACPI_FAILURE(WMID_set_capabilities())) {
|
||||||
printk(ACER_ERR "Unable to detect available devices\n");
|
printk(ACER_ERR "Unable to detect available WMID "
|
||||||
|
"devices\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
} else if (!wmi_has_guid(WMID_GUID2) && interface) {
|
} else if (!wmi_has_guid(WMID_GUID2) && interface) {
|
||||||
printk(ACER_ERR "Unable to detect available devices\n");
|
printk(ACER_ERR "No WMID device detection method found\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,21 +1083,20 @@ static int __init acer_wmi_init(void)
|
||||||
interface = &AMW0_interface;
|
interface = &AMW0_interface;
|
||||||
|
|
||||||
if (ACPI_FAILURE(AMW0_set_capabilities())) {
|
if (ACPI_FAILURE(AMW0_set_capabilities())) {
|
||||||
printk(ACER_ERR "Unable to detect available devices\n");
|
printk(ACER_ERR "Unable to detect available AMW0 "
|
||||||
|
"devices\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wmi_has_guid(AMW0_GUID1)) {
|
if (wmi_has_guid(AMW0_GUID1))
|
||||||
if (ACPI_FAILURE(AMW0_find_mailled()))
|
AMW0_find_mailled();
|
||||||
printk(ACER_ERR "Unable to detect mail LED\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
find_quirks();
|
find_quirks();
|
||||||
|
|
||||||
if (!interface) {
|
if (!interface) {
|
||||||
printk(ACER_ERR "No or unsupported WMI interface, unable to ");
|
printk(ACER_ERR "No or unsupported WMI interface, unable to "
|
||||||
printk(KERN_CONT "load.\n");
|
"load\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -315,7 +315,7 @@ static void sony_laptop_report_input_event(u8 event)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (event > ARRAY_SIZE(sony_laptop_input_index)) {
|
if (event >= ARRAY_SIZE(sony_laptop_input_index)) {
|
||||||
dprintk("sony_laptop_report_input_event, event not known: %d\n", event);
|
dprintk("sony_laptop_report_input_event, event not known: %d\n", event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,7 @@ static void tifm_sd_transfer_data(struct tifm_sd *host)
|
||||||
host->sg_pos++;
|
host->sg_pos++;
|
||||||
if (host->sg_pos == host->sg_len) {
|
if (host->sg_pos == host->sg_len) {
|
||||||
if ((r_data->flags & MMC_DATA_WRITE)
|
if ((r_data->flags & MMC_DATA_WRITE)
|
||||||
&& DATA_CARRY)
|
&& (host->cmd_flags & DATA_CARRY))
|
||||||
writel(host->bounce_buf_data[0],
|
writel(host->bounce_buf_data[0],
|
||||||
host->dev->addr
|
host->dev->addr
|
||||||
+ SOCK_MMCSD_DATA);
|
+ SOCK_MMCSD_DATA);
|
||||||
|
|
|
@ -203,8 +203,11 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
|
||||||
if (received < budget) {
|
if (received < budget) {
|
||||||
netif_rx_complete(vi->dev, napi);
|
netif_rx_complete(vi->dev, napi);
|
||||||
if (unlikely(!vi->rvq->vq_ops->enable_cb(vi->rvq))
|
if (unlikely(!vi->rvq->vq_ops->enable_cb(vi->rvq))
|
||||||
&& netif_rx_reschedule(vi->dev, napi))
|
&& napi_schedule_prep(napi)) {
|
||||||
|
vi->rvq->vq_ops->disable_cb(vi->rvq);
|
||||||
|
__netif_rx_schedule(vi->dev, napi);
|
||||||
goto again;
|
goto again;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return received;
|
return received;
|
||||||
|
@ -278,10 +281,11 @@ static int start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
pr_debug("%s: virtio not prepared to send\n", dev->name);
|
pr_debug("%s: virtio not prepared to send\n", dev->name);
|
||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
|
|
||||||
/* Activate callback for using skbs: if this fails it
|
/* Activate callback for using skbs: if this returns false it
|
||||||
* means some were used in the meantime. */
|
* means some were used in the meantime. */
|
||||||
if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) {
|
if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) {
|
||||||
printk("Unlikely: restart svq failed\n");
|
printk("Unlikely: restart svq race\n");
|
||||||
|
vi->svq->vq_ops->disable_cb(vi->svq);
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
@ -294,6 +298,15 @@ static int start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
|
static void virtnet_netpoll(struct net_device *dev)
|
||||||
|
{
|
||||||
|
struct virtnet_info *vi = netdev_priv(dev);
|
||||||
|
|
||||||
|
napi_schedule(&vi->napi);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int virtnet_open(struct net_device *dev)
|
static int virtnet_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct virtnet_info *vi = netdev_priv(dev);
|
struct virtnet_info *vi = netdev_priv(dev);
|
||||||
|
@ -336,6 +349,9 @@ static int virtnet_probe(struct virtio_device *vdev)
|
||||||
dev->stop = virtnet_close;
|
dev->stop = virtnet_close;
|
||||||
dev->hard_start_xmit = start_xmit;
|
dev->hard_start_xmit = start_xmit;
|
||||||
dev->features = NETIF_F_HIGHDMA;
|
dev->features = NETIF_F_HIGHDMA;
|
||||||
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
|
dev->poll_controller = virtnet_netpoll;
|
||||||
|
#endif
|
||||||
SET_NETDEV_DEV(dev, &vdev->dev);
|
SET_NETDEV_DEV(dev, &vdev->dev);
|
||||||
|
|
||||||
/* Do we support "hardware" checksums? */
|
/* Do we support "hardware" checksums? */
|
||||||
|
|
|
@ -829,7 +829,7 @@ static ssize_t pdcs_autoboot_write(struct kobject *kobj,
|
||||||
struct kobj_attribute *attr,
|
struct kobj_attribute *attr,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
return pdcs_auto_write(kset, attr, buf, count, PF_AUTOBOOT);
|
return pdcs_auto_write(kobj, attr, buf, count, PF_AUTOBOOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -845,7 +845,7 @@ static ssize_t pdcs_autosearch_write(struct kobject *kobj,
|
||||||
struct kobj_attribute *attr,
|
struct kobj_attribute *attr,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
return pdcs_auto_write(kset, attr, buf, count, PF_AUTOSEARCH);
|
return pdcs_auto_write(kobj, attr, buf, count, PF_AUTOSEARCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1066,7 +1066,7 @@ pdc_stable_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't forget the root entries */
|
/* Don't forget the root entries */
|
||||||
error = sysfs_create_group(stable_kobj, pdcs_attr_group);
|
error = sysfs_create_group(stable_kobj, &pdcs_attr_group);
|
||||||
|
|
||||||
/* register the paths kset as a child of the stable kset */
|
/* register the paths kset as a child of the stable kset */
|
||||||
paths_kset = kset_create_and_add("paths", NULL, stable_kobj);
|
paths_kset = kset_create_and_add("paths", NULL, stable_kobj);
|
||||||
|
|
|
@ -314,8 +314,8 @@ sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents)
|
||||||
#define RESMAP_MASK(n) (~0UL << (BITS_PER_LONG - (n)))
|
#define RESMAP_MASK(n) (~0UL << (BITS_PER_LONG - (n)))
|
||||||
#define RESMAP_IDX_MASK (sizeof(unsigned long) - 1)
|
#define RESMAP_IDX_MASK (sizeof(unsigned long) - 1)
|
||||||
|
|
||||||
unsigned long ptr_to_pide(struct ioc *ioc, unsigned long *res_ptr,
|
static unsigned long ptr_to_pide(struct ioc *ioc, unsigned long *res_ptr,
|
||||||
unsigned int bitshiftcnt)
|
unsigned int bitshiftcnt)
|
||||||
{
|
{
|
||||||
return (((unsigned long)res_ptr - (unsigned long)ioc->res_map) << 3)
|
return (((unsigned long)res_ptr - (unsigned long)ioc->res_map) << 3)
|
||||||
+ bitshiftcnt;
|
+ bitshiftcnt;
|
||||||
|
|
|
@ -143,14 +143,18 @@ void pci_bus_add_devices(struct pci_bus *bus)
|
||||||
/* register the bus with sysfs as the parent is now
|
/* register the bus with sysfs as the parent is now
|
||||||
* properly registered. */
|
* properly registered. */
|
||||||
child_bus = dev->subordinate;
|
child_bus = dev->subordinate;
|
||||||
|
if (child_bus->is_added)
|
||||||
|
continue;
|
||||||
child_bus->dev.parent = child_bus->bridge;
|
child_bus->dev.parent = child_bus->bridge;
|
||||||
retval = device_register(&child_bus->dev);
|
retval = device_register(&child_bus->dev);
|
||||||
if (retval)
|
if (retval)
|
||||||
dev_err(&dev->dev, "Error registering pci_bus,"
|
dev_err(&dev->dev, "Error registering pci_bus,"
|
||||||
" continuing...\n");
|
" continuing...\n");
|
||||||
else
|
else {
|
||||||
|
child_bus->is_added = 1;
|
||||||
retval = device_create_file(&child_bus->dev,
|
retval = device_create_file(&child_bus->dev,
|
||||||
&dev_attr_cpuaffinity);
|
&dev_attr_cpuaffinity);
|
||||||
|
}
|
||||||
if (retval)
|
if (retval)
|
||||||
dev_err(&dev->dev, "Error creating cpuaffinity"
|
dev_err(&dev->dev, "Error creating cpuaffinity"
|
||||||
" file, continuing...\n");
|
" file, continuing...\n");
|
||||||
|
|
|
@ -272,21 +272,29 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||||
{
|
{
|
||||||
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev);
|
||||||
acpi_handle tmp;
|
acpi_handle tmp;
|
||||||
static int state_conv[] = {
|
static const u8 state_conv[] = {
|
||||||
[0] = 0,
|
[PCI_D0] = ACPI_STATE_D0,
|
||||||
[1] = 1,
|
[PCI_D1] = ACPI_STATE_D1,
|
||||||
[2] = 2,
|
[PCI_D2] = ACPI_STATE_D2,
|
||||||
[3] = 3,
|
[PCI_D3hot] = ACPI_STATE_D3,
|
||||||
[4] = 3
|
[PCI_D3cold] = ACPI_STATE_D3
|
||||||
};
|
};
|
||||||
int acpi_state = state_conv[(int __force) state];
|
|
||||||
|
|
||||||
if (!handle)
|
if (!handle)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
/* If the ACPI device has _EJ0, ignore the device */
|
/* If the ACPI device has _EJ0, ignore the device */
|
||||||
if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp)))
|
if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp)))
|
||||||
return 0;
|
return 0;
|
||||||
return acpi_bus_set_power(handle, acpi_state);
|
|
||||||
|
switch (state) {
|
||||||
|
case PCI_D0:
|
||||||
|
case PCI_D1:
|
||||||
|
case PCI_D2:
|
||||||
|
case PCI_D3hot:
|
||||||
|
case PCI_D3cold:
|
||||||
|
return acpi_bus_set_power(handle, state_conv[state]);
|
||||||
|
}
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ static dbdev_tab_t au1550_spi_mem_dbdev =
|
||||||
static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw);
|
static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* compute BRG and DIV bits to setup spi clock based on main input clock rate
|
* compute BRG and DIV bits to setup spi clock based on main input clock rate
|
||||||
* that was specified in platform data structure
|
* that was specified in platform data structure
|
||||||
* according to au1550 datasheet:
|
* according to au1550 datasheet:
|
||||||
|
@ -650,7 +650,7 @@ static int au1550_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
|
||||||
return hw->txrx_bufs(spi, t);
|
return hw->txrx_bufs(spi, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t au1550_spi_irq(int irq, void *dev, struct pt_regs *regs)
|
static irqreturn_t au1550_spi_irq(int irq, void *dev)
|
||||||
{
|
{
|
||||||
struct au1550_spi *hw = dev;
|
struct au1550_spi *hw = dev;
|
||||||
return hw->irq_callback(hw);
|
return hw->irq_callback(hw);
|
||||||
|
|
|
@ -344,12 +344,14 @@ static void bitbang_work(struct work_struct *work)
|
||||||
t->rx_dma = t->tx_dma = 0;
|
t->rx_dma = t->tx_dma = 0;
|
||||||
status = bitbang->txrx_bufs(spi, t);
|
status = bitbang->txrx_bufs(spi, t);
|
||||||
}
|
}
|
||||||
|
if (status > 0)
|
||||||
|
m->actual_length += status;
|
||||||
if (status != t->len) {
|
if (status != t->len) {
|
||||||
if (status > 0)
|
/* always report some kind of error */
|
||||||
status = -EMSGSIZE;
|
if (status >= 0)
|
||||||
|
status = -EREMOTEIO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m->actual_length += status;
|
|
||||||
status = 0;
|
status = 0;
|
||||||
|
|
||||||
/* protocol tweaks before next transfer */
|
/* protocol tweaks before next transfer */
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
menuconfig THERMAL
|
menuconfig THERMAL
|
||||||
bool "Generic Thermal sysfs driver"
|
bool "Generic Thermal sysfs driver"
|
||||||
default y
|
|
||||||
help
|
help
|
||||||
Generic Thermal Sysfs driver offers a generic mechanism for
|
Generic Thermal Sysfs driver offers a generic mechanism for
|
||||||
thermal management. Usually it's made up of one or more thermal
|
thermal management. Usually it's made up of one or more thermal
|
||||||
|
|
|
@ -152,7 +152,7 @@ static void virtballoon_changed(struct virtio_device *vdev)
|
||||||
wake_up(&vb->config_change);
|
wake_up(&vb->config_change);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int towards_target(struct virtio_balloon *vb)
|
static inline s64 towards_target(struct virtio_balloon *vb)
|
||||||
{
|
{
|
||||||
u32 v;
|
u32 v;
|
||||||
__virtio_config_val(vb->vdev,
|
__virtio_config_val(vb->vdev,
|
||||||
|
@ -176,7 +176,7 @@ static int balloon(void *_vballoon)
|
||||||
|
|
||||||
set_freezable();
|
set_freezable();
|
||||||
while (!kthread_should_stop()) {
|
while (!kthread_should_stop()) {
|
||||||
int diff;
|
s64 diff;
|
||||||
|
|
||||||
try_to_freeze();
|
try_to_freeze();
|
||||||
wait_event_interruptible(vb->config_change,
|
wait_event_interruptible(vb->config_change,
|
||||||
|
|
|
@ -177,6 +177,7 @@ static irqreturn_t vp_interrupt(int irq, void *opaque)
|
||||||
struct virtio_pci_device *vp_dev = opaque;
|
struct virtio_pci_device *vp_dev = opaque;
|
||||||
struct virtio_pci_vq_info *info;
|
struct virtio_pci_vq_info *info;
|
||||||
irqreturn_t ret = IRQ_NONE;
|
irqreturn_t ret = IRQ_NONE;
|
||||||
|
unsigned long flags;
|
||||||
u8 isr;
|
u8 isr;
|
||||||
|
|
||||||
/* reading the ISR has the effect of also clearing it so it's very
|
/* reading the ISR has the effect of also clearing it so it's very
|
||||||
|
@ -197,12 +198,12 @@ static irqreturn_t vp_interrupt(int irq, void *opaque)
|
||||||
drv->config_changed(&vp_dev->vdev);
|
drv->config_changed(&vp_dev->vdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(&vp_dev->lock);
|
spin_lock_irqsave(&vp_dev->lock, flags);
|
||||||
list_for_each_entry(info, &vp_dev->virtqueues, node) {
|
list_for_each_entry(info, &vp_dev->virtqueues, node) {
|
||||||
if (vring_interrupt(irq, info->vq) == IRQ_HANDLED)
|
if (vring_interrupt(irq, info->vq) == IRQ_HANDLED)
|
||||||
ret = IRQ_HANDLED;
|
ret = IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
spin_unlock(&vp_dev->lock);
|
spin_unlock_irqrestore(&vp_dev->lock, flags);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -214,6 +215,7 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index,
|
||||||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||||
struct virtio_pci_vq_info *info;
|
struct virtio_pci_vq_info *info;
|
||||||
struct virtqueue *vq;
|
struct virtqueue *vq;
|
||||||
|
unsigned long flags;
|
||||||
u16 num;
|
u16 num;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -255,9 +257,9 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index,
|
||||||
vq->priv = info;
|
vq->priv = info;
|
||||||
info->vq = vq;
|
info->vq = vq;
|
||||||
|
|
||||||
spin_lock(&vp_dev->lock);
|
spin_lock_irqsave(&vp_dev->lock, flags);
|
||||||
list_add(&info->node, &vp_dev->virtqueues);
|
list_add(&info->node, &vp_dev->virtqueues);
|
||||||
spin_unlock(&vp_dev->lock);
|
spin_unlock_irqrestore(&vp_dev->lock, flags);
|
||||||
|
|
||||||
return vq;
|
return vq;
|
||||||
|
|
||||||
|
@ -274,10 +276,11 @@ static void vp_del_vq(struct virtqueue *vq)
|
||||||
{
|
{
|
||||||
struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
|
struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
|
||||||
struct virtio_pci_vq_info *info = vq->priv;
|
struct virtio_pci_vq_info *info = vq->priv;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock(&vp_dev->lock);
|
spin_lock_irqsave(&vp_dev->lock, flags);
|
||||||
list_del(&info->node);
|
list_del(&info->node);
|
||||||
spin_unlock(&vp_dev->lock);
|
spin_unlock_irqrestore(&vp_dev->lock, flags);
|
||||||
|
|
||||||
vring_del_virtqueue(vq);
|
vring_del_virtqueue(vq);
|
||||||
|
|
||||||
|
|
|
@ -232,7 +232,6 @@ static bool vring_enable_cb(struct virtqueue *_vq)
|
||||||
vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT;
|
vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT;
|
||||||
mb();
|
mb();
|
||||||
if (unlikely(more_used(vq))) {
|
if (unlikely(more_used(vq))) {
|
||||||
vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
|
|
||||||
END_USE(vq);
|
END_USE(vq);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,7 +229,7 @@ int hfs_brec_remove(struct hfs_find_data *fd)
|
||||||
static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
|
static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
|
||||||
{
|
{
|
||||||
struct hfs_btree *tree;
|
struct hfs_btree *tree;
|
||||||
struct hfs_bnode *node, *new_node;
|
struct hfs_bnode *node, *new_node, *next_node;
|
||||||
struct hfs_bnode_desc node_desc;
|
struct hfs_bnode_desc node_desc;
|
||||||
int num_recs, new_rec_off, new_off, old_rec_off;
|
int num_recs, new_rec_off, new_off, old_rec_off;
|
||||||
int data_start, data_end, size;
|
int data_start, data_end, size;
|
||||||
|
@ -248,6 +248,17 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
|
||||||
new_node->type = node->type;
|
new_node->type = node->type;
|
||||||
new_node->height = node->height;
|
new_node->height = node->height;
|
||||||
|
|
||||||
|
if (node->next)
|
||||||
|
next_node = hfs_bnode_find(tree, node->next);
|
||||||
|
else
|
||||||
|
next_node = NULL;
|
||||||
|
|
||||||
|
if (IS_ERR(next_node)) {
|
||||||
|
hfs_bnode_put(node);
|
||||||
|
hfs_bnode_put(new_node);
|
||||||
|
return next_node;
|
||||||
|
}
|
||||||
|
|
||||||
size = tree->node_size / 2 - node->num_recs * 2 - 14;
|
size = tree->node_size / 2 - node->num_recs * 2 - 14;
|
||||||
old_rec_off = tree->node_size - 4;
|
old_rec_off = tree->node_size - 4;
|
||||||
num_recs = 1;
|
num_recs = 1;
|
||||||
|
@ -261,6 +272,8 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
|
||||||
/* panic? */
|
/* panic? */
|
||||||
hfs_bnode_put(node);
|
hfs_bnode_put(node);
|
||||||
hfs_bnode_put(new_node);
|
hfs_bnode_put(new_node);
|
||||||
|
if (next_node)
|
||||||
|
hfs_bnode_put(next_node);
|
||||||
return ERR_PTR(-ENOSPC);
|
return ERR_PTR(-ENOSPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,8 +328,7 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd)
|
||||||
hfs_bnode_write(node, &node_desc, 0, sizeof(node_desc));
|
hfs_bnode_write(node, &node_desc, 0, sizeof(node_desc));
|
||||||
|
|
||||||
/* update next bnode header */
|
/* update next bnode header */
|
||||||
if (new_node->next) {
|
if (next_node) {
|
||||||
struct hfs_bnode *next_node = hfs_bnode_find(tree, new_node->next);
|
|
||||||
next_node->prev = new_node->this;
|
next_node->prev = new_node->this;
|
||||||
hfs_bnode_read(next_node, &node_desc, 0, sizeof(node_desc));
|
hfs_bnode_read(next_node, &node_desc, 0, sizeof(node_desc));
|
||||||
node_desc.prev = cpu_to_be32(next_node->prev);
|
node_desc.prev = cpu_to_be32(next_node->prev);
|
||||||
|
|
|
@ -232,6 +232,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
|
||||||
fhp->fh_dentry = dentry;
|
fhp->fh_dentry = dentry;
|
||||||
fhp->fh_export = exp;
|
fhp->fh_export = exp;
|
||||||
nfsd_nr_verified++;
|
nfsd_nr_verified++;
|
||||||
|
cache_get(&exp->h);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* just rechecking permissions
|
* just rechecking permissions
|
||||||
|
@ -241,6 +242,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
|
||||||
dprintk("nfsd: fh_verify - just checking\n");
|
dprintk("nfsd: fh_verify - just checking\n");
|
||||||
dentry = fhp->fh_dentry;
|
dentry = fhp->fh_dentry;
|
||||||
exp = fhp->fh_export;
|
exp = fhp->fh_export;
|
||||||
|
cache_get(&exp->h);
|
||||||
/*
|
/*
|
||||||
* Set user creds for this exportpoint; necessary even
|
* Set user creds for this exportpoint; necessary even
|
||||||
* in the "just checking" case because this may be a
|
* in the "just checking" case because this may be a
|
||||||
|
@ -252,8 +254,6 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
cache_get(&exp->h);
|
|
||||||
|
|
||||||
|
|
||||||
error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type);
|
error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type);
|
||||||
if (error)
|
if (error)
|
||||||
|
|
|
@ -640,17 +640,17 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
|
||||||
|
|
||||||
ret = -EACCES;
|
ret = -EACCES;
|
||||||
if (!ptrace_may_attach(task))
|
if (!ptrace_may_attach(task))
|
||||||
goto out;
|
goto out_task;
|
||||||
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
/* file position must be aligned */
|
/* file position must be aligned */
|
||||||
if (*ppos % PM_ENTRY_BYTES)
|
if (*ppos % PM_ENTRY_BYTES)
|
||||||
goto out;
|
goto out_task;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
mm = get_task_mm(task);
|
mm = get_task_mm(task);
|
||||||
if (!mm)
|
if (!mm)
|
||||||
goto out;
|
goto out_task;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
uaddr = (unsigned long)buf & PAGE_MASK;
|
uaddr = (unsigned long)buf & PAGE_MASK;
|
||||||
|
@ -658,7 +658,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
|
||||||
pagecount = (PAGE_ALIGN(uend) - uaddr) / PAGE_SIZE;
|
pagecount = (PAGE_ALIGN(uend) - uaddr) / PAGE_SIZE;
|
||||||
pages = kmalloc(pagecount * sizeof(struct page *), GFP_KERNEL);
|
pages = kmalloc(pagecount * sizeof(struct page *), GFP_KERNEL);
|
||||||
if (!pages)
|
if (!pages)
|
||||||
goto out_task;
|
goto out_mm;
|
||||||
|
|
||||||
down_read(¤t->mm->mmap_sem);
|
down_read(¤t->mm->mmap_sem);
|
||||||
ret = get_user_pages(current, current->mm, uaddr, pagecount,
|
ret = get_user_pages(current, current->mm, uaddr, pagecount,
|
||||||
|
@ -668,6 +668,12 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
|
if (ret != pagecount) {
|
||||||
|
pagecount = ret;
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto out_pages;
|
||||||
|
}
|
||||||
|
|
||||||
pm.out = buf;
|
pm.out = buf;
|
||||||
pm.end = buf + count;
|
pm.end = buf + count;
|
||||||
|
|
||||||
|
@ -699,15 +705,17 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
|
||||||
ret = pm.out - buf;
|
ret = pm.out - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_pages:
|
||||||
for (; pagecount; pagecount--) {
|
for (; pagecount; pagecount--) {
|
||||||
page = pages[pagecount-1];
|
page = pages[pagecount-1];
|
||||||
if (!PageReserved(page))
|
if (!PageReserved(page))
|
||||||
SetPageDirty(page);
|
SetPageDirty(page);
|
||||||
page_cache_release(page);
|
page_cache_release(page);
|
||||||
}
|
}
|
||||||
mmput(mm);
|
|
||||||
out_free:
|
out_free:
|
||||||
kfree(pages);
|
kfree(pages);
|
||||||
|
out_mm:
|
||||||
|
mmput(mm);
|
||||||
out_task:
|
out_task:
|
||||||
put_task_struct(task);
|
put_task_struct(task);
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -91,22 +91,19 @@ extern int __put_user_bad(void);
|
||||||
#define get_user(x, ptr) \
|
#define get_user(x, ptr) \
|
||||||
({ \
|
({ \
|
||||||
int __gu_err = 0; \
|
int __gu_err = 0; \
|
||||||
uint32_t __gu_val = 0; \
|
typeof(*(ptr)) __gu_val = *ptr; \
|
||||||
switch (sizeof(*(ptr))) { \
|
switch (sizeof(*(ptr))) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
case 2: \
|
case 2: \
|
||||||
case 4: \
|
case 4: \
|
||||||
__gu_val = *(ptr); \
|
case 8: \
|
||||||
break; \
|
|
||||||
case 8: \
|
|
||||||
memcpy(&__gu_val, ptr, sizeof (*(ptr))); \
|
|
||||||
break; \
|
break; \
|
||||||
default: \
|
default: \
|
||||||
__gu_val = 0; \
|
|
||||||
__gu_err = __get_user_bad(); \
|
__gu_err = __get_user_bad(); \
|
||||||
|
__gu_val = 0; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
(x) = (typeof(*(ptr)))__gu_val; \
|
(x) = __gu_val; \
|
||||||
__gu_err; \
|
__gu_err; \
|
||||||
})
|
})
|
||||||
#define __get_user(x, ptr) get_user(x, ptr)
|
#define __get_user(x, ptr) get_user(x, ptr)
|
||||||
|
|
|
@ -204,7 +204,7 @@ typedef struct elf64_fdesc {
|
||||||
/*
|
/*
|
||||||
* The following definitions are those for 32-bit ELF binaries on a 32-bit
|
* The following definitions are those for 32-bit ELF binaries on a 32-bit
|
||||||
* kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries
|
* kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries
|
||||||
* on a 64-bit kernel, arch/parisc64/kernel/binfmt_elf32.c defines these
|
* on a 64-bit kernel, arch/parisc/kernel/binfmt_elf32.c defines these
|
||||||
* macros appropriately and then #includes binfmt_elf.c, which then includes
|
* macros appropriately and then #includes binfmt_elf.c, which then includes
|
||||||
* this file.
|
* this file.
|
||||||
*/
|
*/
|
||||||
|
@ -216,26 +216,25 @@ typedef struct elf64_fdesc {
|
||||||
* Note that this header file is used by default in fs/binfmt_elf.c. So
|
* Note that this header file is used by default in fs/binfmt_elf.c. So
|
||||||
* the following macros are for the default case. However, for the 64
|
* the following macros are for the default case. However, for the 64
|
||||||
* bit kernel we also support 32 bit parisc binaries. To do that
|
* bit kernel we also support 32 bit parisc binaries. To do that
|
||||||
* arch/parisc64/kernel/binfmt_elf32.c defines its own set of these
|
* arch/parisc/kernel/binfmt_elf32.c defines its own set of these
|
||||||
* macros, and then it includes fs/binfmt_elf.c to provide an alternate
|
* macros, and then it includes fs/binfmt_elf.c to provide an alternate
|
||||||
* elf binary handler for 32 bit binaries (on the 64 bit kernel).
|
* elf binary handler for 32 bit binaries (on the 64 bit kernel).
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
#define ELF_CLASS ELFCLASS64
|
#define ELF_CLASS ELFCLASS64
|
||||||
#else
|
#else
|
||||||
#define ELF_CLASS ELFCLASS32
|
#define ELF_CLASS ELFCLASS32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef unsigned long elf_greg_t;
|
typedef unsigned long elf_greg_t;
|
||||||
|
|
||||||
/* This yields a string that ld.so will use to load implementation
|
/*
|
||||||
specific libraries for optimization. This is more specific in
|
* This yields a string that ld.so will use to load implementation
|
||||||
intent than poking at uname or /proc/cpuinfo.
|
* specific libraries for optimization. This is more specific in
|
||||||
|
* intent than poking at uname or /proc/cpuinfo.
|
||||||
|
*/
|
||||||
|
|
||||||
For the moment, we have only optimizations for the Intel generations,
|
#define ELF_PLATFORM ("PARISC\0")
|
||||||
but that could change... */
|
|
||||||
|
|
||||||
#define ELF_PLATFORM ("PARISC\0" /*+((boot_cpu_data.x86-3)*5) */)
|
|
||||||
|
|
||||||
#define SET_PERSONALITY(ex, ibcs2) \
|
#define SET_PERSONALITY(ex, ibcs2) \
|
||||||
current->personality = PER_LINUX; \
|
current->personality = PER_LINUX; \
|
||||||
|
@ -310,7 +309,7 @@ struct pt_regs; /* forward declaration... */
|
||||||
#define ELF_OSABI ELFOSABI_LINUX
|
#define ELF_OSABI ELFOSABI_LINUX
|
||||||
|
|
||||||
/* %r23 is set by ld.so to a pointer to a function which might be
|
/* %r23 is set by ld.so to a pointer to a function which might be
|
||||||
registered using atexit. This provides a mean for the dynamic
|
registered using atexit. This provides a means for the dynamic
|
||||||
linker to call DT_FINI functions for shared libraries that have
|
linker to call DT_FINI functions for shared libraries that have
|
||||||
been loaded before the code runs.
|
been loaded before the code runs.
|
||||||
|
|
||||||
|
@ -339,6 +338,5 @@ struct pt_regs; /* forward declaration... */
|
||||||
but it's not easy, and we've already done it here. */
|
but it's not easy, and we've already done it here. */
|
||||||
|
|
||||||
#define ELF_HWCAP 0
|
#define ELF_HWCAP 0
|
||||||
/* (boot_cpu_data.x86_capability) */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,4 +20,11 @@
|
||||||
#define KERNEL_MAP_START (GATEWAY_PAGE_SIZE)
|
#define KERNEL_MAP_START (GATEWAY_PAGE_SIZE)
|
||||||
#define KERNEL_MAP_END (TMPALIAS_MAP_START)
|
#define KERNEL_MAP_END (TMPALIAS_MAP_START)
|
||||||
|
|
||||||
#endif
|
#ifndef __ASSEMBLY__
|
||||||
|
extern void *vmalloc_start;
|
||||||
|
#define PCXL_DMA_MAP_SIZE (8*1024*1024)
|
||||||
|
#define VMALLOC_START ((unsigned long)vmalloc_start)
|
||||||
|
#define VMALLOC_END (KERNEL_MAP_END)
|
||||||
|
#endif /*__ASSEMBLY__*/
|
||||||
|
|
||||||
|
#endif /*_ASM_FIXMAP_H*/
|
||||||
|
|
|
@ -56,6 +56,12 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int uval;
|
int uval;
|
||||||
|
|
||||||
|
/* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is
|
||||||
|
* our gateway page, and causes no end of trouble...
|
||||||
|
*/
|
||||||
|
if (segment_eq(KERNEL_DS, get_fs()) && !uaddr)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
@ -67,5 +73,5 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
|
||||||
return uval;
|
return uval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif /*__KERNEL__*/
|
||||||
#endif
|
#endif /*_ASM_PARISC_FUTEX_H*/
|
||||||
|
|
|
@ -645,8 +645,7 @@ int pdc_soft_power_button(int sw_control);
|
||||||
void pdc_io_reset(void);
|
void pdc_io_reset(void);
|
||||||
void pdc_io_reset_devices(void);
|
void pdc_io_reset_devices(void);
|
||||||
int pdc_iodc_getc(void);
|
int pdc_iodc_getc(void);
|
||||||
int pdc_iodc_print(unsigned char *str, unsigned count);
|
int pdc_iodc_print(const unsigned char *str, unsigned count);
|
||||||
void pdc_printf(const char *fmt, ...);
|
|
||||||
|
|
||||||
void pdc_emergency_unlock(void);
|
void pdc_emergency_unlock(void);
|
||||||
int pdc_sti_call(unsigned long func, unsigned long flags,
|
int pdc_sti_call(unsigned long func, unsigned long flags,
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue