Merge ../linux-2.6
This commit is contained in:
Коммит
f18fc729cd
10
CREDITS
10
CREDITS
|
@ -1194,15 +1194,9 @@ S: Brecksville, OH 44141-1334
|
|||
S: USA
|
||||
|
||||
N: Tristan Greaves
|
||||
E: Tristan.Greaves@icl.com
|
||||
E: tmg296@ecs.soton.ac.uk
|
||||
W: http://www.ecs.soton.ac.uk/~tmg296
|
||||
E: tristan@extricate.org
|
||||
W: http://www.extricate.org/
|
||||
D: Miscellaneous ipv4 sysctl patches
|
||||
S: 15 Little Mead
|
||||
S: Denmead
|
||||
S: Hampshire
|
||||
S: PO7 6HS
|
||||
S: United Kingdom
|
||||
|
||||
N: Michael A. Griffith
|
||||
E: grif@cs.ucr.edu
|
||||
|
|
|
@ -140,7 +140,7 @@ IBM TP T41p s3_bios (2), switch to X after resume
|
|||
IBM TP T42 s3_bios (2)
|
||||
IBM ThinkPad T42p (2373-GTG) s3_bios (2)
|
||||
IBM TP X20 ??? (*)
|
||||
IBM TP X30 s3_bios (2)
|
||||
IBM TP X30 s3_bios, s3_mode (4)
|
||||
IBM TP X31 / Type 2672-XXH none (1), use radeontool (http://fdd.com/software/radeon/) to turn off backlight.
|
||||
IBM TP X32 none (1), but backlight is on and video is trashed after long suspend. s3_bios,s3_mode (4) works too. Perhaps that gets better results?
|
||||
IBM Thinkpad X40 Type 2371-7JG s3_bios,s3_mode (4)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Guide to using M-Audio Audiophile USB with ALSA and Jack v1.2
|
||||
Guide to using M-Audio Audiophile USB with ALSA and Jack v1.3
|
||||
========================================================
|
||||
|
||||
Thibault Le Meur <Thibault.LeMeur@supelec.fr>
|
||||
|
@ -22,16 +22,16 @@ The device has 4 audio interfaces, and 2 MIDI ports:
|
|||
* Midi In (Mi)
|
||||
* Midi Out (Mo)
|
||||
|
||||
The internal DAC/ADC has the following caracteristics:
|
||||
The internal DAC/ADC has the following characteristics:
|
||||
* sample depth of 16 or 24 bits
|
||||
* sample rate from 8kHz to 96kHz
|
||||
* Two ports can't use different sample depths at the same time.Moreover, the
|
||||
* Two ports can't use different sample depths at the same time. Moreover, the
|
||||
Audiophile USB documentation gives the following Warning: "Please exit any
|
||||
audio application running before switching between bit depths"
|
||||
|
||||
Due to the USB 1.1 bandwidth limitation, a limited number of interfaces can be
|
||||
activated at the same time depending on the audio mode selected:
|
||||
* 16-bit/48kHz ==> 4 channels in/ 4 channels out
|
||||
* 16-bit/48kHz ==> 4 channels in/4 channels out
|
||||
- Ai+Ao+Di+Do
|
||||
* 24-bit/48kHz ==> 4 channels in/2 channels out,
|
||||
or 2 channels in/4 channels out
|
||||
|
@ -41,8 +41,8 @@ activated at the same time depending on the audio mode selected:
|
|||
|
||||
Important facts about the Digital interface:
|
||||
--------------------------------------------
|
||||
* The Do port additionnaly supports surround-encoded AC-3 and DTS passthrough,
|
||||
though I haven't tested it under linux
|
||||
* The Do port additionally supports surround-encoded AC-3 and DTS passthrough,
|
||||
though I haven't tested it under Linux
|
||||
- Note that in this setup only the Do interface can be enabled
|
||||
* Apart from recording an audio digital stream, enabling the Di port is a way
|
||||
to synchronize the device to an external sample clock
|
||||
|
@ -60,24 +60,23 @@ synchronization error (for instance sound played at an odd sample rate)
|
|||
The Audiophile USB MIDI ports will be automatically supported once the
|
||||
following modules have been loaded:
|
||||
* snd-usb-audio
|
||||
* snd-seq
|
||||
* snd-seq-midi
|
||||
|
||||
No additionnal setting is required.
|
||||
No additional setting is required.
|
||||
|
||||
2.2 - Audio ports
|
||||
-----------------
|
||||
|
||||
Audio functions of the Audiophile USB device are handled by the snd-usb-audio
|
||||
module. This module can work in a default mode (without any device-specific
|
||||
parameter), or in an advanced mode with the device-specific parameter called
|
||||
parameter), or in an "advanced" mode with the device-specific parameter called
|
||||
"device_setup".
|
||||
|
||||
2.2.1 - Default Alsa driver mode
|
||||
|
||||
The default behaviour of the snd-usb-audio driver is to parse the device
|
||||
The default behavior of the snd-usb-audio driver is to parse the device
|
||||
capabilities at startup and enable all functions inside the device (including
|
||||
all ports at any sample rates and any sample depths supported). This approach
|
||||
all ports at any supported sample rates and sample depths). This approach
|
||||
has the advantage to let the driver easily switch from sample rates/depths
|
||||
automatically according to the need of the application claiming the device.
|
||||
|
||||
|
@ -114,9 +113,9 @@ gain).
|
|||
For people having this problem, the snd-usb-audio module has a new module
|
||||
parameter called "device_setup".
|
||||
|
||||
2.2.2.1 - Initializing the working mode of the Audiohile USB
|
||||
2.2.2.1 - Initializing the working mode of the Audiophile USB
|
||||
|
||||
As far as the Audiohile USB device is concerned, this value let the user
|
||||
As far as the Audiophile USB device is concerned, this value let the user
|
||||
specify:
|
||||
* the sample depth
|
||||
* the sample rate
|
||||
|
@ -174,20 +173,20 @@ The parameter can be given:
|
|||
|
||||
IMPORTANT NOTE WHEN SWITCHING CONFIGURATION:
|
||||
-------------------------------------------
|
||||
* You may need to _first_ intialize the module with the correct device_setup
|
||||
* You may need to _first_ initialize the module with the correct device_setup
|
||||
parameter and _only_after_ turn on the Audiophile USB device
|
||||
* This is especially true when switching the sample depth:
|
||||
- first trun off the device
|
||||
- de-register the snd-usb-audio module
|
||||
- change the device_setup parameter (by either manually reprobing the module
|
||||
or changing modprobe.conf)
|
||||
- first turn off the device
|
||||
- de-register the snd-usb-audio module (modprobe -r)
|
||||
- change the device_setup parameter by changing the device_setup
|
||||
option in /etc/modprobe.conf
|
||||
- turn on the device
|
||||
|
||||
2.2.2.3 - Audiophile USB's device_setup structure
|
||||
|
||||
If you want to understand the device_setup magic numbers for the Audiophile
|
||||
USB, you need some very basic understanding of binary computation. However,
|
||||
this is not required to use the parameter and you may skip thi section.
|
||||
this is not required to use the parameter and you may skip this section.
|
||||
|
||||
The device_setup is one byte long and its structure is the following:
|
||||
|
||||
|
@ -231,11 +230,11 @@ Caution:
|
|||
|
||||
2.2.3 - USB implementation details for this device
|
||||
|
||||
You may safely skip this section if you're not interrested in driver
|
||||
You may safely skip this section if you're not interested in driver
|
||||
development.
|
||||
|
||||
This section describes some internals aspect of the device and summarize the
|
||||
data I got by usb-snooping the windows and linux drivers.
|
||||
This section describes some internal aspects of the device and summarize the
|
||||
data I got by usb-snooping the windows and Linux drivers.
|
||||
|
||||
The M-Audio Audiophile USB has 7 USB Interfaces:
|
||||
a "USB interface":
|
||||
|
@ -277,9 +276,9 @@ Here is a short description of the AltSettings capabilities:
|
|||
- 16-bit depth, 8-48kHz sample mode
|
||||
- Synch playback (Do), audio format type III IEC1937_AC-3
|
||||
|
||||
In order to ensure a correct intialization of the device, the driver
|
||||
In order to ensure a correct initialization of the device, the driver
|
||||
_must_know_ how the device will be used:
|
||||
* if DTS is choosen, only Interface 2 with AltSet nb.6 must be
|
||||
* if DTS is chosen, only Interface 2 with AltSet nb.6 must be
|
||||
registered
|
||||
* if 96KHz only AltSets nb.1 of each interface must be selected
|
||||
* if samples are using 24bits/48KHz then AltSet 2 must me used if
|
||||
|
@ -290,7 +289,7 @@ _must_know_ how the device will be used:
|
|||
is not connected
|
||||
|
||||
When device_setup is given as a parameter to the snd-usb-audio module, the
|
||||
parse_audio_enpoint function uses a quirk called
|
||||
parse_audio_endpoints function uses a quirk called
|
||||
"audiophile_skip_setting_quirk" in order to prevent AltSettings not
|
||||
corresponding to device_setup from being registered in the driver.
|
||||
|
||||
|
@ -317,9 +316,8 @@ However you may see the following warning message:
|
|||
using the "default" ALSA device. This is less efficient than it could be.
|
||||
Consider using a hardware device instead rather than using the plug layer."
|
||||
|
||||
|
||||
3.2 - Patching alsa to use direct pcm device
|
||||
-------------------------------------------
|
||||
--------------------------------------------
|
||||
A patch for Jack by Andreas Steinmetz adds support for Big Endian devices.
|
||||
However it has not been included in the CVS tree.
|
||||
|
||||
|
@ -331,3 +329,32 @@ After having applied the patch you can run jackd with the following command
|
|||
line:
|
||||
% jackd -R -dalsa -Phw:1,0 -r48000 -p128 -n2 -D -Chw:1,1
|
||||
|
||||
3.2 - Getting 2 input and/or output interfaces in Jack
|
||||
------------------------------------------------------
|
||||
|
||||
As you can see, starting the Jack server this way will only enable 1 stereo
|
||||
input (Di or Ai) and 1 stereo output (Ao or Do).
|
||||
|
||||
This is due to the following restrictions:
|
||||
* Jack can only open one capture device and one playback device at a time
|
||||
* The Audiophile USB is seen as 2 (or three) Alsa devices: hw:1,0, hw:1,1
|
||||
(and optionally hw:1,2)
|
||||
If you want to get Ai+Di and/or Ao+Do support with Jack, you would need to
|
||||
combine the Alsa devices into one logical "complex" device.
|
||||
|
||||
If you want to give it a try, I recommend reading the information from
|
||||
this page: http://www.sound-man.co.uk/linuxaudio/ice1712multi.html
|
||||
It is related to another device (ice1712) but can be adapted to suit
|
||||
the Audiophile USB.
|
||||
|
||||
Enabling multiple Audiophile USB interfaces for Jackd will certainly require:
|
||||
* patching Jack with the previously mentioned "Big Endian" patch
|
||||
* patching Jackd with the MMAP_COMPLEX patch (see the ice1712 page)
|
||||
* patching the alsa-lib/src/pcm/pcm_multi.c file (see the ice1712 page)
|
||||
* define a multi device (combination of hw:1,0 and hw:1,1) in your .asoundrc
|
||||
file
|
||||
* start jackd with this device
|
||||
|
||||
I had no success in testing this for now, but this may be due to my OS
|
||||
configuration. If you have any success with this kind of setup, please
|
||||
drop me an email.
|
||||
|
|
|
@ -1172,7 +1172,7 @@
|
|||
}
|
||||
|
||||
/* PCI IDs */
|
||||
static struct pci_device_id snd_mychip_ids[] = {
|
||||
static struct pci_device_id snd_mychip_ids[] __devinitdata = {
|
||||
{ PCI_VENDOR_ID_FOO, PCI_DEVICE_ID_BAR,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
....
|
||||
|
@ -1565,7 +1565,7 @@
|
|||
<informalexample>
|
||||
<programlisting>
|
||||
<![CDATA[
|
||||
static struct pci_device_id snd_mychip_ids[] = {
|
||||
static struct pci_device_id snd_mychip_ids[] __devinitdata = {
|
||||
{ PCI_VENDOR_ID_FOO, PCI_DEVICE_ID_BAR,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
....
|
||||
|
|
|
@ -150,8 +150,6 @@ config ARCH_IOP3XX
|
|||
|
||||
config ARCH_IXP4XX
|
||||
bool "IXP4xx-based"
|
||||
select DMABOUNCE
|
||||
select PCI
|
||||
help
|
||||
Support for Intel's IXP4XX (XScale) family of processors.
|
||||
|
||||
|
|
|
@ -38,10 +38,10 @@ static void icedcc_putc(int ch)
|
|||
if (--i < 0)
|
||||
return;
|
||||
|
||||
asm("mrc p14, 0, %0, c0, c0, 0" : "=r" (status));
|
||||
asm volatile ("mrc p14, 0, %0, c0, c0, 0" : "=r" (status));
|
||||
} while (status & 2);
|
||||
|
||||
asm("mcr p15, 0, %0, c1, c0, 0" : : "r" (ch));
|
||||
asm("mcr p14, 0, %0, c1, c0, 0" : : "r" (ch));
|
||||
}
|
||||
|
||||
#define putc(ch) icedcc_putc(ch)
|
||||
|
|
|
@ -195,56 +195,6 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
|
|||
}
|
||||
EXPORT_SYMBOL(imx_set_mmc_info);
|
||||
|
||||
static struct resource imx_uart1_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x00206000,
|
||||
.end = 0x002060FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = (UART1_MINT_RX),
|
||||
.end = (UART1_MINT_RX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = (UART1_MINT_TX),
|
||||
.end = (UART1_MINT_TX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device imx_uart1_device = {
|
||||
.name = "imx-uart",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(imx_uart1_resources),
|
||||
.resource = imx_uart1_resources,
|
||||
};
|
||||
|
||||
static struct resource imx_uart2_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x00207000,
|
||||
.end = 0x002070FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = (UART2_MINT_RX),
|
||||
.end = (UART2_MINT_RX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = (UART2_MINT_TX),
|
||||
.end = (UART2_MINT_TX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device imx_uart2_device = {
|
||||
.name = "imx-uart",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(imx_uart2_resources),
|
||||
.resource = imx_uart2_resources,
|
||||
};
|
||||
|
||||
static struct imxfb_mach_info imx_fb_info;
|
||||
|
||||
void __init set_imx_fb_info(struct imxfb_mach_info *hard_imx_fb_info)
|
||||
|
@ -283,8 +233,6 @@ static struct platform_device imxfb_device = {
|
|||
static struct platform_device *devices[] __initdata = {
|
||||
&imx_mmc_device,
|
||||
&imxfb_device,
|
||||
&imx_uart1_device,
|
||||
&imx_uart2_device,
|
||||
};
|
||||
|
||||
static struct map_desc imx_io_desc[] __initdata = {
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/arch/mmc.h>
|
||||
#include <asm/arch/imx-uart.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include "generic.h"
|
||||
|
||||
|
@ -48,8 +49,70 @@ static struct platform_device cs89x0_device = {
|
|||
.resource = cs89x0_resources,
|
||||
};
|
||||
|
||||
static struct imxuart_platform_data uart_pdata = {
|
||||
.flags = IMXUART_HAVE_RTSCTS,
|
||||
};
|
||||
|
||||
static struct resource imx_uart1_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x00206000,
|
||||
.end = 0x002060FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = (UART1_MINT_RX),
|
||||
.end = (UART1_MINT_RX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = (UART1_MINT_TX),
|
||||
.end = (UART1_MINT_TX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device imx_uart1_device = {
|
||||
.name = "imx-uart",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(imx_uart1_resources),
|
||||
.resource = imx_uart1_resources,
|
||||
.dev = {
|
||||
.platform_data = &uart_pdata,
|
||||
}
|
||||
};
|
||||
|
||||
static struct resource imx_uart2_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x00207000,
|
||||
.end = 0x002070FF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = (UART2_MINT_RX),
|
||||
.end = (UART2_MINT_RX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
[2] = {
|
||||
.start = (UART2_MINT_TX),
|
||||
.end = (UART2_MINT_TX),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device imx_uart2_device = {
|
||||
.name = "imx-uart",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(imx_uart2_resources),
|
||||
.resource = imx_uart2_resources,
|
||||
.dev = {
|
||||
.platform_data = &uart_pdata,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&cs89x0_device,
|
||||
&imx_uart1_device,
|
||||
&imx_uart2_device,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MMC_IMX
|
||||
|
@ -75,6 +138,17 @@ mx1ads_init(void)
|
|||
imx_gpio_mode(GPIO_PORTB | GPIO_GIUS | GPIO_IN | 20);
|
||||
imx_set_mmc_info(&mx1ads_mmc_info);
|
||||
#endif
|
||||
|
||||
imx_gpio_mode(PC9_PF_UART1_CTS);
|
||||
imx_gpio_mode(PC10_PF_UART1_RTS);
|
||||
imx_gpio_mode(PC11_PF_UART1_TXD);
|
||||
imx_gpio_mode(PC12_PF_UART1_RXD);
|
||||
|
||||
imx_gpio_mode(PB28_PF_UART2_CTS);
|
||||
imx_gpio_mode(PB29_PF_UART2_RTS);
|
||||
imx_gpio_mode(PB30_PF_UART2_TXD);
|
||||
imx_gpio_mode(PB31_PF_UART2_RXD);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ comment "IXP4xx Platforms"
|
|||
config MACH_NSLU2
|
||||
bool
|
||||
prompt "Linksys NSLU2"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support Linksys's
|
||||
NSLU2 NAS device. For more information on this platform,
|
||||
|
@ -18,6 +19,7 @@ config MACH_NSLU2
|
|||
|
||||
config ARCH_AVILA
|
||||
bool "Avila"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the Gateworks
|
||||
Avila Network Platform. For more information on this platform,
|
||||
|
@ -25,6 +27,7 @@ config ARCH_AVILA
|
|||
|
||||
config ARCH_ADI_COYOTE
|
||||
bool "Coyote"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the ADI
|
||||
Engineering Coyote Gateway Reference Platform. For more
|
||||
|
@ -32,6 +35,7 @@ config ARCH_ADI_COYOTE
|
|||
|
||||
config ARCH_IXDP425
|
||||
bool "IXDP425"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support Intel's
|
||||
IXDP425 Development Platform (Also known as Richfield).
|
||||
|
@ -39,6 +43,7 @@ config ARCH_IXDP425
|
|||
|
||||
config MACH_IXDPG425
|
||||
bool "IXDPG425"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support Intel's
|
||||
IXDPG425 Development Platform (Also known as Montajade).
|
||||
|
@ -46,6 +51,7 @@ config MACH_IXDPG425
|
|||
|
||||
config MACH_IXDP465
|
||||
bool "IXDP465"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support Intel's
|
||||
IXDP465 Development Platform (Also known as BMP).
|
||||
|
@ -72,6 +78,7 @@ config ARCH_PRPMC1100
|
|||
config MACH_NAS100D
|
||||
bool
|
||||
prompt "NAS100D"
|
||||
select PCI
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support Iomega's
|
||||
NAS 100d device. For more information on this platform,
|
||||
|
@ -96,6 +103,7 @@ config CPU_IXP46X
|
|||
config MACH_GTWX5715
|
||||
bool "Gemtek WX5715 (Linksys WRV54G)"
|
||||
depends on ARCH_IXP4XX
|
||||
select PCI
|
||||
help
|
||||
This board is currently inside the Linksys WRV54G Gateways.
|
||||
|
||||
|
@ -110,11 +118,16 @@ config MACH_GTWX5715
|
|||
"High Speed" UART is n/c (as far as I can tell)
|
||||
20 Pin ARM/Xscale JTAG interface on J2
|
||||
|
||||
|
||||
comment "IXP4xx Options"
|
||||
|
||||
config DMABOUNCE
|
||||
bool
|
||||
default y
|
||||
depends on PCI
|
||||
|
||||
config IXP4XX_INDIRECT_PCI
|
||||
bool "Use indirect PCI memory access"
|
||||
depends on PCI
|
||||
help
|
||||
IXP4xx provides two methods of accessing PCI memory space:
|
||||
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
# Makefile for the linux kernel.
|
||||
#
|
||||
|
||||
obj-y += common.o common-pci.o
|
||||
obj-y += common.o
|
||||
|
||||
obj-$(CONFIG_PCI) += common-pci.o
|
||||
obj-$(CONFIG_ARCH_IXDP4XX) += ixdp425-pci.o ixdp425-setup.o
|
||||
obj-$(CONFIG_MACH_IXDPG425) += ixdpg425-pci.o coyote-setup.o
|
||||
obj-$(CONFIG_ARCH_ADI_COYOTE) += coyote-pci.o coyote-setup.o
|
||||
|
|
|
@ -467,7 +467,7 @@ endchoice
|
|||
|
||||
choice
|
||||
depends on EXPERIMENTAL && !X86_PAE
|
||||
prompt "Memory split"
|
||||
prompt "Memory split" if EMBEDDED
|
||||
default VMSPLIT_3G
|
||||
help
|
||||
Select the desired split between kernel and user memory.
|
||||
|
@ -756,7 +756,7 @@ config PHYSICAL_START
|
|||
|
||||
config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||
depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER && !X86_PC
|
||||
depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER
|
||||
---help---
|
||||
Say Y here to experiment with turning CPUs off and on. CPUs
|
||||
can be controlled through /sys/devices/system/cpu.
|
||||
|
|
|
@ -215,7 +215,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
|
|||
{
|
||||
struct acpi_table_madt *madt = NULL;
|
||||
|
||||
if (!phys_addr || !size || !cpu_has_apic)
|
||||
if (!phys_addr || !size)
|
||||
return -EINVAL;
|
||||
|
||||
madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size);
|
||||
|
@ -1102,9 +1102,6 @@ int __init acpi_boot_table_init(void)
|
|||
dmi_check_system(acpi_dmi_table);
|
||||
#endif
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* If acpi_disabled, bail out
|
||||
* One exception: acpi=ht continues far enough to enumerate LAPICs
|
||||
|
|
|
@ -757,10 +757,6 @@ static int __init apic_set_verbosity(char *str)
|
|||
apic_verbosity = APIC_DEBUG;
|
||||
else if (strcmp("verbose", str) == 0)
|
||||
apic_verbosity = APIC_VERBOSE;
|
||||
else
|
||||
printk(KERN_WARNING "APIC Verbosity level %s not recognised"
|
||||
" use apic=verbose or apic=debug\n", str);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -242,10 +242,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|||
kcb->kprobe_status = KPROBE_REENTER;
|
||||
return 1;
|
||||
} else {
|
||||
if (regs->eflags & VM_MASK) {
|
||||
/* We are in virtual-8086 mode. Return 0 */
|
||||
goto no_kprobe;
|
||||
}
|
||||
if (*addr != BREAKPOINT_INSTRUCTION) {
|
||||
/* The breakpoint instruction was removed by
|
||||
* another cpu right after we hit, no further
|
||||
|
@ -265,11 +261,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
|||
|
||||
p = get_kprobe(addr);
|
||||
if (!p) {
|
||||
if (regs->eflags & VM_MASK) {
|
||||
/* We are in virtual-8086 mode. Return 0 */
|
||||
goto no_kprobe;
|
||||
}
|
||||
|
||||
if (*addr != BREAKPOINT_INSTRUCTION) {
|
||||
/*
|
||||
* The breakpoint instruction was removed right
|
||||
|
@ -452,10 +443,11 @@ static void __kprobes resume_execution(struct kprobe *p,
|
|||
*tos &= ~(TF_MASK | IF_MASK);
|
||||
*tos |= kcb->kprobe_old_eflags;
|
||||
break;
|
||||
case 0xc3: /* ret/lret */
|
||||
case 0xcb:
|
||||
case 0xc2:
|
||||
case 0xc2: /* iret/ret/lret */
|
||||
case 0xc3:
|
||||
case 0xca:
|
||||
case 0xcb:
|
||||
case 0xcf:
|
||||
case 0xea: /* jmp absolute -- eip is correct */
|
||||
/* eip is already adjusted, no more changes required */
|
||||
p->ainsn.boostable = 1;
|
||||
|
@ -463,10 +455,13 @@ static void __kprobes resume_execution(struct kprobe *p,
|
|||
case 0xe8: /* call relative - Fix return addr */
|
||||
*tos = orig_eip + (*tos - copy_eip);
|
||||
break;
|
||||
case 0x9a: /* call absolute -- same as call absolute, indirect */
|
||||
*tos = orig_eip + (*tos - copy_eip);
|
||||
goto no_change;
|
||||
case 0xff:
|
||||
if ((p->ainsn.insn[1] & 0x30) == 0x10) {
|
||||
/* call absolute, indirect */
|
||||
/*
|
||||
* call absolute, indirect
|
||||
* Fix return addr; eip is correct.
|
||||
* But this is not boostable
|
||||
*/
|
||||
|
|
|
@ -671,7 +671,7 @@ int do_syscall_trace(struct pt_regs *regs, int entryexit)
|
|||
|
||||
if (unlikely(current->audit_context)) {
|
||||
if (entryexit)
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(regs->eax),
|
||||
audit_syscall_exit(AUDITSC_RESULT(regs->eax),
|
||||
regs->eax);
|
||||
/* Debug traps, when using PTRACE_SINGLESTEP, must be sent only
|
||||
* on the syscall exit path. Normally, when TIF_SYSCALL_AUDIT is
|
||||
|
@ -720,14 +720,13 @@ int do_syscall_trace(struct pt_regs *regs, int entryexit)
|
|||
ret = is_sysemu;
|
||||
out:
|
||||
if (unlikely(current->audit_context) && !entryexit)
|
||||
audit_syscall_entry(current, AUDIT_ARCH_I386, regs->orig_eax,
|
||||
audit_syscall_entry(AUDIT_ARCH_I386, regs->orig_eax,
|
||||
regs->ebx, regs->ecx, regs->edx, regs->esi);
|
||||
if (ret == 0)
|
||||
return 0;
|
||||
|
||||
regs->orig_eax = -1; /* force skip of syscall restarting */
|
||||
if (unlikely(current->audit_context))
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(regs->eax),
|
||||
regs->eax);
|
||||
audit_syscall_exit(AUDITSC_RESULT(regs->eax), regs->eax);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -970,8 +970,10 @@ efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
|
|||
* not-overlapping, which is the case
|
||||
*/
|
||||
int __init
|
||||
e820_all_mapped(unsigned long start, unsigned long end, unsigned type)
|
||||
e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
|
||||
{
|
||||
u64 start = s;
|
||||
u64 end = e;
|
||||
int i;
|
||||
for (i = 0; i < e820.nr_map; i++) {
|
||||
struct e820entry *ei = &e820.map[i];
|
||||
|
|
|
@ -313,7 +313,9 @@ static void __init synchronize_tsc_bp (void)
|
|||
if (tsc_values[i] < avg)
|
||||
realdelta = -realdelta;
|
||||
|
||||
printk(KERN_INFO "CPU#%d had %ld usecs TSC skew, fixed it up.\n", i, realdelta);
|
||||
if (realdelta > 0)
|
||||
printk(KERN_INFO "CPU#%d had %ld usecs TSC "
|
||||
"skew, fixed it up.\n", i, realdelta);
|
||||
}
|
||||
|
||||
sum += delta;
|
||||
|
|
|
@ -279,7 +279,7 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
|||
{
|
||||
struct cpufreq_freqs *freq = data;
|
||||
|
||||
if (val != CPUFREQ_RESUMECHANGE)
|
||||
if (val != CPUFREQ_RESUMECHANGE && val != CPUFREQ_SUSPENDCHANGE)
|
||||
write_seqlock_irq(&xtime_lock);
|
||||
if (!ref_freq) {
|
||||
if (!freq->old){
|
||||
|
@ -312,7 +312,7 @@ time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
|||
}
|
||||
|
||||
end:
|
||||
if (val != CPUFREQ_RESUMECHANGE)
|
||||
if (val != CPUFREQ_RESUMECHANGE && val != CPUFREQ_SUSPENDCHANGE)
|
||||
write_sequnlock_irq(&xtime_lock);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -312,7 +312,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk
|
|||
|
||||
/*call audit_syscall_exit since we do not exit via the normal paths */
|
||||
if (unlikely(current->audit_context))
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(eax), eax);
|
||||
audit_syscall_exit(AUDITSC_RESULT(eax), eax);
|
||||
|
||||
__asm__ __volatile__(
|
||||
"movl %0,%%esp\n\t"
|
||||
|
|
|
@ -1644,7 +1644,7 @@ syscall_trace_enter (long arg0, long arg1, long arg2, long arg3,
|
|||
arch = AUDIT_ARCH_IA64;
|
||||
}
|
||||
|
||||
audit_syscall_entry(current, arch, syscall, arg0, arg1, arg2, arg3);
|
||||
audit_syscall_entry(arch, syscall, arg0, arg1, arg2, arg3);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1662,7 +1662,7 @@ syscall_trace_leave (long arg0, long arg1, long arg2, long arg3,
|
|||
|
||||
if (success != AUDITSC_SUCCESS)
|
||||
result = -result;
|
||||
audit_syscall_exit(current, success, result);
|
||||
audit_syscall_exit(success, result);
|
||||
}
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE)
|
||||
|
|
|
@ -483,7 +483,7 @@ static inline int audit_arch(void)
|
|||
asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
|
||||
{
|
||||
if (unlikely(current->audit_context) && entryexit)
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(regs->regs[2]),
|
||||
audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]),
|
||||
regs->regs[2]);
|
||||
|
||||
if (!(current->ptrace & PT_PTRACED))
|
||||
|
@ -507,7 +507,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
|
|||
}
|
||||
out:
|
||||
if (unlikely(current->audit_context) && !entryexit)
|
||||
audit_syscall_entry(current, audit_arch(), regs->regs[2],
|
||||
audit_syscall_entry(audit_arch(), regs->regs[2],
|
||||
regs->regs[4], regs->regs[5],
|
||||
regs->regs[6], regs->regs[7]);
|
||||
}
|
||||
|
|
|
@ -90,15 +90,15 @@ void __kprobes arch_remove_kprobe(struct kprobe *p)
|
|||
|
||||
static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
kprobe_opcode_t insn = *p->ainsn.insn;
|
||||
|
||||
regs->msr |= MSR_SE;
|
||||
|
||||
/* single step inline if it is a trap variant */
|
||||
if (is_trap(insn))
|
||||
regs->nip = (unsigned long)p->addr;
|
||||
else
|
||||
regs->nip = (unsigned long)p->ainsn.insn;
|
||||
/*
|
||||
* On powerpc we should single step on the original
|
||||
* instruction even if the probed insn is a trap
|
||||
* variant as values in regs could play a part in
|
||||
* if the trap is taken or not
|
||||
*/
|
||||
regs->nip = (unsigned long)p->ainsn.insn;
|
||||
}
|
||||
|
||||
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||
|
|
|
@ -885,6 +885,74 @@ void __init unflatten_device_tree(void)
|
|||
DBG(" <- unflatten_device_tree()\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* ibm,pa-features is a per-cpu property that contains a string of
|
||||
* attribute descriptors, each of which has a 2 byte header plus up
|
||||
* to 254 bytes worth of processor attribute bits. First header
|
||||
* byte specifies the number of bytes following the header.
|
||||
* Second header byte is an "attribute-specifier" type, of which
|
||||
* zero is the only currently-defined value.
|
||||
* Implementation: Pass in the byte and bit offset for the feature
|
||||
* that we are interested in. The function will return -1 if the
|
||||
* pa-features property is missing, or a 1/0 to indicate if the feature
|
||||
* is supported/not supported. Note that the bit numbers are
|
||||
* big-endian to match the definition in PAPR.
|
||||
*/
|
||||
static struct ibm_pa_feature {
|
||||
unsigned long cpu_features; /* CPU_FTR_xxx bit */
|
||||
unsigned int cpu_user_ftrs; /* PPC_FEATURE_xxx bit */
|
||||
unsigned char pabyte; /* byte number in ibm,pa-features */
|
||||
unsigned char pabit; /* bit number (big-endian) */
|
||||
unsigned char invert; /* if 1, pa bit set => clear feature */
|
||||
} ibm_pa_features[] __initdata = {
|
||||
{0, PPC_FEATURE_HAS_MMU, 0, 0, 0},
|
||||
{0, PPC_FEATURE_HAS_FPU, 0, 1, 0},
|
||||
{CPU_FTR_SLB, 0, 0, 2, 0},
|
||||
{CPU_FTR_CTRL, 0, 0, 3, 0},
|
||||
{CPU_FTR_NOEXECUTE, 0, 0, 6, 0},
|
||||
{CPU_FTR_NODSISRALIGN, 0, 1, 1, 1},
|
||||
{CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0},
|
||||
};
|
||||
|
||||
static void __init check_cpu_pa_features(unsigned long node)
|
||||
{
|
||||
unsigned char *pa_ftrs;
|
||||
unsigned long len, tablelen, i, bit;
|
||||
|
||||
pa_ftrs = of_get_flat_dt_prop(node, "ibm,pa-features", &tablelen);
|
||||
if (pa_ftrs == NULL)
|
||||
return;
|
||||
|
||||
/* find descriptor with type == 0 */
|
||||
for (;;) {
|
||||
if (tablelen < 3)
|
||||
return;
|
||||
len = 2 + pa_ftrs[0];
|
||||
if (tablelen < len)
|
||||
return; /* descriptor 0 not found */
|
||||
if (pa_ftrs[1] == 0)
|
||||
break;
|
||||
tablelen -= len;
|
||||
pa_ftrs += len;
|
||||
}
|
||||
|
||||
/* loop over bits we know about */
|
||||
for (i = 0; i < ARRAY_SIZE(ibm_pa_features); ++i) {
|
||||
struct ibm_pa_feature *fp = &ibm_pa_features[i];
|
||||
|
||||
if (fp->pabyte >= pa_ftrs[0])
|
||||
continue;
|
||||
bit = (pa_ftrs[2 + fp->pabyte] >> (7 - fp->pabit)) & 1;
|
||||
if (bit ^ fp->invert) {
|
||||
cur_cpu_spec->cpu_features |= fp->cpu_features;
|
||||
cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
|
||||
} else {
|
||||
cur_cpu_spec->cpu_features &= ~fp->cpu_features;
|
||||
cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int __init early_init_dt_scan_cpus(unsigned long node,
|
||||
const char *uname, int depth,
|
||||
void *data)
|
||||
|
@ -969,6 +1037,8 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
|
|||
}
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
|
||||
check_cpu_pa_features(node);
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
if (nthreads > 1)
|
||||
cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
|
||||
|
|
|
@ -538,7 +538,7 @@ void do_syscall_trace_enter(struct pt_regs *regs)
|
|||
do_syscall_trace();
|
||||
|
||||
if (unlikely(current->audit_context))
|
||||
audit_syscall_entry(current,
|
||||
audit_syscall_entry(
|
||||
#ifdef CONFIG_PPC32
|
||||
AUDIT_ARCH_PPC,
|
||||
#else
|
||||
|
@ -556,8 +556,7 @@ void do_syscall_trace_leave(struct pt_regs *regs)
|
|||
#endif
|
||||
|
||||
if (unlikely(current->audit_context))
|
||||
audit_syscall_exit(current,
|
||||
(regs->ccr&0x1000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
|
||||
audit_syscall_exit((regs->ccr&0x1000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
|
||||
regs->result);
|
||||
|
||||
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|
||||
|
|
|
@ -322,13 +322,31 @@ static void register_nodes(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
int sysfs_add_device_to_node(struct sys_device *dev, int nid)
|
||||
{
|
||||
struct node *node = &node_devices[nid];
|
||||
return sysfs_create_link(&node->sysdev.kobj, &dev->kobj,
|
||||
kobject_name(&dev->kobj));
|
||||
}
|
||||
|
||||
void sysfs_remove_device_from_node(struct sys_device *dev, int nid)
|
||||
{
|
||||
struct node *node = &node_devices[nid];
|
||||
sysfs_remove_link(&node->sysdev.kobj, kobject_name(&dev->kobj));
|
||||
}
|
||||
|
||||
#else
|
||||
static void register_nodes(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL_GPL(sysfs_add_device_to_node);
|
||||
EXPORT_SYMBOL_GPL(sysfs_remove_device_from_node);
|
||||
|
||||
/* Only valid if CPU is present. */
|
||||
static ssize_t show_physical_id(struct sys_device *dev, char *buf)
|
||||
{
|
||||
|
|
|
@ -194,7 +194,7 @@ static int *of_get_associativity(struct device_node *dev)
|
|||
/* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
|
||||
* info is found.
|
||||
*/
|
||||
static int of_node_to_nid(struct device_node *device)
|
||||
static int of_node_to_nid_single(struct device_node *device)
|
||||
{
|
||||
int nid = -1;
|
||||
unsigned int *tmp;
|
||||
|
@ -216,6 +216,28 @@ out:
|
|||
return nid;
|
||||
}
|
||||
|
||||
/* Walk the device tree upwards, looking for an associativity id */
|
||||
int of_node_to_nid(struct device_node *device)
|
||||
{
|
||||
struct device_node *tmp;
|
||||
int nid = -1;
|
||||
|
||||
of_node_get(device);
|
||||
while (device) {
|
||||
nid = of_node_to_nid_single(device);
|
||||
if (nid != -1)
|
||||
break;
|
||||
|
||||
tmp = device;
|
||||
device = of_get_parent(tmp);
|
||||
of_node_put(tmp);
|
||||
}
|
||||
of_node_put(device);
|
||||
|
||||
return nid;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_node_to_nid);
|
||||
|
||||
/*
|
||||
* In theory, the "ibm,associativity" property may contain multiple
|
||||
* associativity lists because a resource may be multiply connected
|
||||
|
@ -300,7 +322,7 @@ static int __cpuinit numa_setup_cpu(unsigned long lcpu)
|
|||
goto out;
|
||||
}
|
||||
|
||||
nid = of_node_to_nid(cpu);
|
||||
nid = of_node_to_nid_single(cpu);
|
||||
|
||||
if (nid < 0 || !node_online(nid))
|
||||
nid = any_online_node(NODE_MASK_ALL);
|
||||
|
@ -393,7 +415,7 @@ static int __init parse_numa_properties(void)
|
|||
|
||||
cpu = find_cpu_node(i);
|
||||
BUG_ON(!cpu);
|
||||
nid = of_node_to_nid(cpu);
|
||||
nid = of_node_to_nid_single(cpu);
|
||||
of_node_put(cpu);
|
||||
|
||||
/*
|
||||
|
@ -437,7 +459,7 @@ new_range:
|
|||
* have associativity properties. If none, then
|
||||
* everything goes to default_nid.
|
||||
*/
|
||||
nid = of_node_to_nid(memory);
|
||||
nid = of_node_to_nid_single(memory);
|
||||
if (nid < 0)
|
||||
nid = default_nid;
|
||||
node_set_online(nid);
|
||||
|
@ -776,7 +798,7 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
|
|||
ha_new_range:
|
||||
start = read_n_cells(n_mem_addr_cells, &memcell_buf);
|
||||
size = read_n_cells(n_mem_size_cells, &memcell_buf);
|
||||
nid = of_node_to_nid(memory);
|
||||
nid = of_node_to_nid_single(memory);
|
||||
|
||||
/* Domains not present at boot default to 0 */
|
||||
if (nid < 0 || !node_online(nid))
|
||||
|
|
|
@ -12,7 +12,8 @@ config SPU_FS
|
|||
|
||||
config SPUFS_MMAP
|
||||
bool
|
||||
depends on SPU_FS && SPARSEMEM && !PPC_64K_PAGES
|
||||
depends on SPU_FS && SPARSEMEM
|
||||
select MEMORY_HOTPLUG
|
||||
default y
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include <linux/root_dev.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/memory_hotplug.h>
|
||||
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/processor.h>
|
||||
|
@ -46,6 +48,7 @@
|
|||
#include <asm/cputable.h>
|
||||
#include <asm/ppc-pci.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/spu.h>
|
||||
|
||||
#include "interrupt.h"
|
||||
#include "iommu.h"
|
||||
|
@ -69,77 +72,6 @@ static void cell_show_cpuinfo(struct seq_file *m)
|
|||
of_node_put(root);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
static int __init find_spu_node_id(struct device_node *spe)
|
||||
{
|
||||
unsigned int *id;
|
||||
#ifdef CONFIG_NUMA
|
||||
struct device_node *cpu;
|
||||
cpu = spe->parent->parent;
|
||||
id = (unsigned int *)get_property(cpu, "node-id", NULL);
|
||||
#else
|
||||
id = NULL;
|
||||
#endif
|
||||
return id ? *id : 0;
|
||||
}
|
||||
|
||||
static void __init cell_spuprop_present(struct device_node *spe,
|
||||
const char *prop, int early)
|
||||
{
|
||||
struct address_prop {
|
||||
unsigned long address;
|
||||
unsigned int len;
|
||||
} __attribute__((packed)) *p;
|
||||
int proplen;
|
||||
|
||||
unsigned long start_pfn, end_pfn, pfn;
|
||||
int node_id;
|
||||
|
||||
p = (void*)get_property(spe, prop, &proplen);
|
||||
WARN_ON(proplen != sizeof (*p));
|
||||
|
||||
node_id = find_spu_node_id(spe);
|
||||
|
||||
start_pfn = p->address >> PAGE_SHIFT;
|
||||
end_pfn = (p->address + p->len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
|
||||
/* We need to call memory_present *before* the call to sparse_init,
|
||||
but we can initialize the page structs only *after* that call.
|
||||
Thus, we're being called twice. */
|
||||
if (early)
|
||||
memory_present(node_id, start_pfn, end_pfn);
|
||||
else {
|
||||
/* As the pages backing SPU LS and I/O are outside the range
|
||||
of regular memory, their page structs were not initialized
|
||||
by free_area_init. Do it here instead. */
|
||||
for (pfn = start_pfn; pfn < end_pfn; pfn++) {
|
||||
struct page *page = pfn_to_page(pfn);
|
||||
set_page_links(page, ZONE_DMA, node_id, pfn);
|
||||
init_page_count(page);
|
||||
reset_page_mapcount(page);
|
||||
SetPageReserved(page);
|
||||
INIT_LIST_HEAD(&page->lru);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __init cell_spumem_init(int early)
|
||||
{
|
||||
struct device_node *node;
|
||||
for (node = of_find_node_by_type(NULL, "spe");
|
||||
node; node = of_find_node_by_type(node, "spe")) {
|
||||
cell_spuprop_present(node, "local-store", early);
|
||||
cell_spuprop_present(node, "problem", early);
|
||||
cell_spuprop_present(node, "priv1", early);
|
||||
cell_spuprop_present(node, "priv2", early);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void __init cell_spumem_init(int early)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void cell_progress(char *s, unsigned short hex)
|
||||
{
|
||||
printk("*** %04x : %s\n", hex, s ? s : "");
|
||||
|
@ -172,8 +104,6 @@ static void __init cell_setup_arch(void)
|
|||
#endif
|
||||
|
||||
mmio_nvram_init();
|
||||
|
||||
cell_spumem_init(0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -189,8 +119,6 @@ static void __init cell_init_early(void)
|
|||
|
||||
ppc64_interrupt_controller = IC_CELL_PIC;
|
||||
|
||||
cell_spumem_init(1);
|
||||
|
||||
DBG(" <- cell_init_early()\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -520,8 +520,50 @@ void spu_irq_setaffinity(struct spu *spu, int cpu)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(spu_irq_setaffinity);
|
||||
|
||||
static void __iomem * __init map_spe_prop(struct device_node *n,
|
||||
const char *name)
|
||||
static int __init find_spu_node_id(struct device_node *spe)
|
||||
{
|
||||
unsigned int *id;
|
||||
struct device_node *cpu;
|
||||
cpu = spe->parent->parent;
|
||||
id = (unsigned int *)get_property(cpu, "node-id", NULL);
|
||||
return id ? *id : 0;
|
||||
}
|
||||
|
||||
static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
|
||||
const char *prop)
|
||||
{
|
||||
static DEFINE_MUTEX(add_spumem_mutex);
|
||||
|
||||
struct address_prop {
|
||||
unsigned long address;
|
||||
unsigned int len;
|
||||
} __attribute__((packed)) *p;
|
||||
int proplen;
|
||||
|
||||
unsigned long start_pfn, nr_pages;
|
||||
struct pglist_data *pgdata;
|
||||
struct zone *zone;
|
||||
int ret;
|
||||
|
||||
p = (void*)get_property(spe, prop, &proplen);
|
||||
WARN_ON(proplen != sizeof (*p));
|
||||
|
||||
start_pfn = p->address >> PAGE_SHIFT;
|
||||
nr_pages = ((unsigned long)p->len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
|
||||
pgdata = NODE_DATA(spu->nid);
|
||||
zone = pgdata->node_zones;
|
||||
|
||||
/* XXX rethink locking here */
|
||||
mutex_lock(&add_spumem_mutex);
|
||||
ret = __add_pages(zone, start_pfn, nr_pages);
|
||||
mutex_unlock(&add_spumem_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __iomem * __init map_spe_prop(struct spu *spu,
|
||||
struct device_node *n, const char *name)
|
||||
{
|
||||
struct address_prop {
|
||||
unsigned long address;
|
||||
|
@ -530,6 +572,8 @@ static void __iomem * __init map_spe_prop(struct device_node *n,
|
|||
|
||||
void *p;
|
||||
int proplen;
|
||||
void* ret = NULL;
|
||||
int err = 0;
|
||||
|
||||
p = get_property(n, name, &proplen);
|
||||
if (proplen != sizeof (struct address_prop))
|
||||
|
@ -537,7 +581,14 @@ static void __iomem * __init map_spe_prop(struct device_node *n,
|
|||
|
||||
prop = p;
|
||||
|
||||
return ioremap(prop->address, prop->len);
|
||||
err = cell_spuprop_present(spu, n, name);
|
||||
if (err && (err != -EEXIST))
|
||||
goto out;
|
||||
|
||||
ret = ioremap(prop->address, prop->len);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void spu_unmap(struct spu *spu)
|
||||
|
@ -548,44 +599,45 @@ static void spu_unmap(struct spu *spu)
|
|||
iounmap((u8 __iomem *)spu->local_store);
|
||||
}
|
||||
|
||||
static int __init spu_map_device(struct spu *spu, struct device_node *spe)
|
||||
static int __init spu_map_device(struct spu *spu, struct device_node *node)
|
||||
{
|
||||
char *prop;
|
||||
int ret;
|
||||
|
||||
ret = -ENODEV;
|
||||
prop = get_property(spe, "isrc", NULL);
|
||||
prop = get_property(node, "isrc", NULL);
|
||||
if (!prop)
|
||||
goto out;
|
||||
spu->isrc = *(unsigned int *)prop;
|
||||
|
||||
spu->name = get_property(spe, "name", NULL);
|
||||
spu->name = get_property(node, "name", NULL);
|
||||
if (!spu->name)
|
||||
goto out;
|
||||
|
||||
prop = get_property(spe, "local-store", NULL);
|
||||
prop = get_property(node, "local-store", NULL);
|
||||
if (!prop)
|
||||
goto out;
|
||||
spu->local_store_phys = *(unsigned long *)prop;
|
||||
|
||||
/* we use local store as ram, not io memory */
|
||||
spu->local_store = (void __force *)map_spe_prop(spe, "local-store");
|
||||
spu->local_store = (void __force *)
|
||||
map_spe_prop(spu, node, "local-store");
|
||||
if (!spu->local_store)
|
||||
goto out;
|
||||
|
||||
prop = get_property(spe, "problem", NULL);
|
||||
prop = get_property(node, "problem", NULL);
|
||||
if (!prop)
|
||||
goto out_unmap;
|
||||
spu->problem_phys = *(unsigned long *)prop;
|
||||
|
||||
spu->problem= map_spe_prop(spe, "problem");
|
||||
spu->problem= map_spe_prop(spu, node, "problem");
|
||||
if (!spu->problem)
|
||||
goto out_unmap;
|
||||
|
||||
spu->priv1= map_spe_prop(spe, "priv1");
|
||||
spu->priv1= map_spe_prop(spu, node, "priv1");
|
||||
/* priv1 is not available on a hypervisor */
|
||||
|
||||
spu->priv2= map_spe_prop(spe, "priv2");
|
||||
spu->priv2= map_spe_prop(spu, node, "priv2");
|
||||
if (!spu->priv2)
|
||||
goto out_unmap;
|
||||
ret = 0;
|
||||
|
@ -597,17 +649,6 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int __init find_spu_node_id(struct device_node *spe)
|
||||
{
|
||||
unsigned int *id;
|
||||
struct device_node *cpu;
|
||||
|
||||
cpu = spe->parent->parent;
|
||||
id = (unsigned int *)get_property(cpu, "node-id", NULL);
|
||||
|
||||
return id ? *id : 0;
|
||||
}
|
||||
|
||||
static int __init create_spu(struct device_node *spe)
|
||||
{
|
||||
struct spu *spu;
|
||||
|
@ -624,6 +665,10 @@ static int __init create_spu(struct device_node *spe)
|
|||
goto out_free;
|
||||
|
||||
spu->node = find_spu_node_id(spe);
|
||||
spu->nid = of_node_to_nid(spe);
|
||||
if (spu->nid == -1)
|
||||
spu->nid = 0;
|
||||
|
||||
spu->stop_code = 0;
|
||||
spu->slb_replace = 0;
|
||||
spu->mm = NULL;
|
||||
|
|
|
@ -124,7 +124,15 @@ int eeh_send_failure_event (struct device_node *dn,
|
|||
{
|
||||
unsigned long flags;
|
||||
struct eeh_event *event;
|
||||
char *location;
|
||||
|
||||
if (!mem_init_done) {
|
||||
printk(KERN_ERR "EEH: event during early boot not handled\n");
|
||||
location = (char *) get_property(dn, "ibm,loc-code", NULL);
|
||||
printk(KERN_ERR "EEH: device node = %s\n", dn->full_name);
|
||||
printk(KERN_ERR "EEH: PCI location = %s\n", location);
|
||||
return 1;
|
||||
}
|
||||
event = kmalloc(sizeof(*event), GFP_ATOMIC);
|
||||
if (event == NULL) {
|
||||
printk (KERN_ERR "EEH: out of memory, event not handled\n");
|
||||
|
|
|
@ -378,7 +378,7 @@ int __init mpc866ads_init(void)
|
|||
ppc_sys_device_setfunc(MPC8xx_CPM_SMC1, PPC_SYS_FUNC_UART);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SERIAL_CPM_SMCer
|
||||
#ifdef CONFIG_SERIAL_CPM_SMC
|
||||
ppc_sys_device_enable(MPC8xx_CPM_SMC2);
|
||||
ppc_sys_device_setfunc(MPC8xx_CPM_SMC2, PPC_SYS_FUNC_UART);
|
||||
#endif
|
||||
|
|
|
@ -430,7 +430,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
|
|||
|
||||
/* This is the X/Open sanctioned signal stack switching. */
|
||||
if (ka->sa.sa_flags & SA_ONSTACK) {
|
||||
if (! on_sig_stack(sp))
|
||||
if (! sas_ss_flags(sp))
|
||||
sp = current->sas_ss_sp + current->sas_ss_size;
|
||||
}
|
||||
|
||||
|
|
|
@ -1608,3 +1608,45 @@ compat_sys_ppoll_wrapper:
|
|||
sys_unshare_wrapper:
|
||||
llgfr %r2,%r2 # unsigned long
|
||||
jg sys_unshare
|
||||
|
||||
.globl compat_sys_set_robust_list_wrapper
|
||||
compat_sys_set_robust_list_wrapper:
|
||||
llgtr %r2,%r2 # struct compat_robust_list_head *
|
||||
llgfr %r3,%r3 # size_t
|
||||
jg compat_sys_set_robust_list
|
||||
|
||||
.globl compat_sys_get_robust_list_wrapper
|
||||
compat_sys_get_robust_list_wrapper:
|
||||
lgfr %r2,%r2 # int
|
||||
llgtr %r3,%r3 # compat_uptr_t_t *
|
||||
llgtr %r4,%r4 # compat_size_t *
|
||||
jg compat_sys_get_robust_list
|
||||
|
||||
.globl sys_splice_wrapper
|
||||
sys_splice_wrapper:
|
||||
lgfr %r2,%r2 # int
|
||||
llgtr %r3,%r3 # loff_t *
|
||||
lgfr %r4,%r4 # int
|
||||
llgtr %r5,%r5 # loff_t *
|
||||
llgfr %r6,%r6 # size_t
|
||||
llgf %r0,164(%r15) # unsigned int
|
||||
stg %r0,160(%r15)
|
||||
jg sys_splice
|
||||
|
||||
.globl sys_sync_file_range_wrapper
|
||||
sys_sync_file_range_wrapper:
|
||||
lgfr %r2,%r2 # int
|
||||
sllg %r3,%r3,32 # get high word of 64bit loff_t
|
||||
or %r3,%r4 # get low word of 64bit loff_t
|
||||
sllg %r4,%r5,32 # get high word of 64bit loff_t
|
||||
or %r4,%r6 # get low word of 64bit loff_t
|
||||
llgf %r5,164(%r15) # unsigned int
|
||||
jg sys_sync_file_range
|
||||
|
||||
.globl sys_tee_wrapper
|
||||
sys_tee_wrapper:
|
||||
lgfr %r2,%r2 # int
|
||||
lgfr %r3,%r3 # int
|
||||
llgfr %r4,%r4 # size_t
|
||||
llgfr %r5,%r5 # unsigned int
|
||||
jg sys_tee
|
||||
|
|
|
@ -734,7 +734,7 @@ asmlinkage void
|
|||
syscall_trace(struct pt_regs *regs, int entryexit)
|
||||
{
|
||||
if (unlikely(current->audit_context) && entryexit)
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(regs->gprs[2]), regs->gprs[2]);
|
||||
audit_syscall_exit(AUDITSC_RESULT(regs->gprs[2]), regs->gprs[2]);
|
||||
|
||||
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
||||
goto out;
|
||||
|
@ -761,8 +761,7 @@ syscall_trace(struct pt_regs *regs, int entryexit)
|
|||
}
|
||||
out:
|
||||
if (unlikely(current->audit_context) && !entryexit)
|
||||
audit_syscall_entry(current,
|
||||
test_thread_flag(TIF_31BIT)?AUDIT_ARCH_S390:AUDIT_ARCH_S390X,
|
||||
audit_syscall_entry(test_thread_flag(TIF_31BIT)?AUDIT_ARCH_S390:AUDIT_ARCH_S390X,
|
||||
regs->gprs[2], regs->orig_gpr2, regs->gprs[3],
|
||||
regs->gprs[4], regs->gprs[5]);
|
||||
}
|
||||
|
|
|
@ -358,8 +358,9 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
} else {
|
||||
regs->gprs[14] = (unsigned long)
|
||||
frame->retcode | PSW_ADDR_AMODE;
|
||||
err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
|
||||
(u16 __user *)(frame->retcode));
|
||||
if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
|
||||
(u16 __user *)(frame->retcode)))
|
||||
goto give_sigsegv;
|
||||
}
|
||||
|
||||
/* Set up backchain. */
|
||||
|
|
|
@ -312,3 +312,8 @@ SYSCALL(sys_faccessat,sys_faccessat,sys_faccessat_wrapper) /* 300 */
|
|||
SYSCALL(sys_pselect6,sys_pselect6,compat_sys_pselect6_wrapper)
|
||||
SYSCALL(sys_ppoll,sys_ppoll,compat_sys_ppoll_wrapper)
|
||||
SYSCALL(sys_unshare,sys_unshare,sys_unshare_wrapper)
|
||||
SYSCALL(sys_set_robust_list,sys_set_robust_list,compat_sys_set_robust_list_wrapper)
|
||||
SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list_wrapper)
|
||||
SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)
|
||||
SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)
|
||||
SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
|
||||
|
|
|
@ -58,9 +58,11 @@ SECTIONS
|
|||
. = ALIGN(4096);
|
||||
.data.page_aligned : { *(.data.idt) }
|
||||
|
||||
. = ALIGN(32);
|
||||
. = ALIGN(256);
|
||||
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
|
||||
|
||||
. = ALIGN(256);
|
||||
.data.read_mostly : { *(.data.read_mostly) }
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
. = ALIGN(8192); /* init_task */
|
||||
|
|
|
@ -192,6 +192,7 @@ query_segment_type (struct dcss_segment *seg)
|
|||
diag_cc = dcss_diag (DCSS_SEGEXT, qin, &dummy, &vmrc);
|
||||
|
||||
if (diag_cc > 1) {
|
||||
PRINT_WARN ("segment_type: diag returned error %ld\n", vmrc);
|
||||
rc = dcss_diag_translate_rc (vmrc);
|
||||
goto out_free;
|
||||
}
|
||||
|
@ -553,7 +554,7 @@ segment_save(char *name)
|
|||
int endpfn = 0;
|
||||
char cmd1[160];
|
||||
char cmd2[80];
|
||||
int i;
|
||||
int i, response;
|
||||
|
||||
if (!MACHINE_IS_VM)
|
||||
return;
|
||||
|
@ -576,8 +577,20 @@ segment_save(char *name)
|
|||
segtype_string[seg->range[i].start & 0xff]);
|
||||
}
|
||||
sprintf(cmd2, "SAVESEG %s", name);
|
||||
cpcmd(cmd1, NULL, 0, NULL);
|
||||
cpcmd(cmd2, NULL, 0, NULL);
|
||||
response = 0;
|
||||
cpcmd(cmd1, NULL, 0, &response);
|
||||
if (response) {
|
||||
PRINT_ERR("segment_save: DEFSEG failed with response code %i\n",
|
||||
response);
|
||||
goto out;
|
||||
}
|
||||
cpcmd(cmd2, NULL, 0, &response);
|
||||
if (response) {
|
||||
PRINT_ERR("segment_save: SAVESEG failed with response code %i\n",
|
||||
response);
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
spin_unlock(&dcss_lock);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ sys_call_table:
|
|||
/*10*/ .long sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
|
||||
/*15*/ .long sys_chmod, sys_lchown16, sparc_brk, sys_nis_syscall, sys_lseek
|
||||
/*20*/ .long sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
|
||||
/*25*/ .long sys_time, sys_ptrace, sys_alarm, sys_sigaltstack, sys_pause
|
||||
/*25*/ .long sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_pause
|
||||
/*30*/ .long sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
|
||||
/*35*/ .long sys_chown, sys_sync, sys_kill, sys_newstat, sys_sendfile
|
||||
/*40*/ .long sys_newlstat, sys_dup, sys_pipe, sys_times, sys_getuid
|
||||
|
|
|
@ -653,7 +653,7 @@ asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p)
|
|||
if (unlikely(tstate & (TSTATE_XCARRY | TSTATE_ICARRY)))
|
||||
result = AUDITSC_FAILURE;
|
||||
|
||||
audit_syscall_exit(current, result, regs->u_regs[UREG_I0]);
|
||||
audit_syscall_exit(result, regs->u_regs[UREG_I0]);
|
||||
}
|
||||
|
||||
if (!(current->ptrace & PT_PTRACED))
|
||||
|
@ -677,8 +677,7 @@ asmlinkage void syscall_trace(struct pt_regs *regs, int syscall_exit_p)
|
|||
|
||||
out:
|
||||
if (unlikely(current->audit_context) && !syscall_exit_p)
|
||||
audit_syscall_entry(current,
|
||||
(test_thread_flag(TIF_32BIT) ?
|
||||
audit_syscall_entry((test_thread_flag(TIF_32BIT) ?
|
||||
AUDIT_ARCH_SPARC :
|
||||
AUDIT_ARCH_SPARC64),
|
||||
regs->u_regs[UREG_G1],
|
||||
|
|
|
@ -139,6 +139,7 @@ SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2)
|
|||
SIGN2(sys32_splice, sys_splice, %o0, %o1)
|
||||
SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
|
||||
SIGN2(sys32_tee, sys_tee, %o0, %o1)
|
||||
SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
|
||||
|
||||
.globl sys32_mmap2
|
||||
sys32_mmap2:
|
||||
|
|
|
@ -25,7 +25,7 @@ sys_call_table32:
|
|||
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys32_chown16, sys32_mknod
|
||||
/*15*/ .word sys_chmod, sys32_lchown16, sparc_brk, sys32_perfctr, sys32_lseek
|
||||
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys32_setuid16, sys32_getuid16
|
||||
/*25*/ .word compat_sys_time, sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause
|
||||
/*25*/ .word sys32_vmsplice, sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause
|
||||
/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice
|
||||
.word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile
|
||||
/*40*/ .word compat_sys_newlstat, sys_dup, sys_pipe, compat_sys_times, sys_getuid
|
||||
|
@ -94,7 +94,7 @@ sys_call_table:
|
|||
/*10*/ .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod
|
||||
/*15*/ .word sys_chmod, sys_lchown, sparc_brk, sys_perfctr, sys_lseek
|
||||
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid
|
||||
/*25*/ .word sys_nis_syscall, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall
|
||||
/*25*/ .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall
|
||||
/*30*/ .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
|
||||
.word sys_nis_syscall, sys_sync, sys_kill, sys_newstat, sys_sendfile64
|
||||
/*40*/ .word sys_newlstat, sys_dup, sys_pipe, sys_times, sys_nis_syscall
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <linux/percpu.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/preempt.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
|
@ -24,6 +25,8 @@ void flush_tlb_pending(void)
|
|||
{
|
||||
struct mmu_gather *mp = &__get_cpu_var(mmu_gathers);
|
||||
|
||||
preempt_disable();
|
||||
|
||||
if (mp->tlb_nr) {
|
||||
flush_tsb_user(mp);
|
||||
|
||||
|
@ -38,6 +41,8 @@ void flush_tlb_pending(void)
|
|||
}
|
||||
mp->tlb_nr = 0;
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t orig)
|
||||
|
|
|
@ -57,20 +57,6 @@ config STATIC_LINK
|
|||
chroot, and you disable CONFIG_MODE_TT, you probably want to say Y
|
||||
here.
|
||||
|
||||
config HOST_2G_2G
|
||||
bool "2G/2G host address space split"
|
||||
default n
|
||||
depends on MODE_TT
|
||||
help
|
||||
This is needed when the host on which you run has a 2G/2G memory
|
||||
split, instead of the customary 3G/1G.
|
||||
|
||||
Note that to enable such a host
|
||||
configuration, which makes sense only in some cases, you need special
|
||||
host patches.
|
||||
|
||||
So, if you do not know what to do here, say 'N'.
|
||||
|
||||
config KERNEL_HALF_GIGS
|
||||
int "Kernel address space size (in .5G units)"
|
||||
default "1"
|
||||
|
|
|
@ -16,6 +16,19 @@ config SEMAPHORE_SLEEPERS
|
|||
bool
|
||||
default y
|
||||
|
||||
config HOST_2G_2G
|
||||
bool "2G/2G host address space split"
|
||||
default n
|
||||
help
|
||||
This is needed when the host on which you run has a 2G/2G memory
|
||||
split, instead of the customary 3G/1G.
|
||||
|
||||
Note that to enable such a host
|
||||
configuration, which makes sense only in some cases, you need special
|
||||
host patches.
|
||||
|
||||
So, if you do not know what to do here, say 'N'.
|
||||
|
||||
config TOP_ADDR
|
||||
hex
|
||||
default 0xc0000000 if !HOST_2G_2G
|
||||
|
@ -35,11 +48,13 @@ config 3_LEVEL_PGTABLES
|
|||
|
||||
config STUB_CODE
|
||||
hex
|
||||
default 0xbfffe000
|
||||
default 0xbfffe000 if !HOST_2G_2G
|
||||
default 0x7fffe000 if HOST_2G_2G
|
||||
|
||||
config STUB_DATA
|
||||
hex
|
||||
default 0xbffff000
|
||||
default 0xbffff000 if !HOST_2G_2G
|
||||
default 0x7ffff000 if HOST_2G_2G
|
||||
|
||||
config STUB_START
|
||||
hex
|
||||
|
|
|
@ -96,7 +96,8 @@ PHONY += linux
|
|||
all: linux
|
||||
|
||||
linux: vmlinux
|
||||
ln -f $< $@
|
||||
@echo ' LINK $@'
|
||||
$(Q)ln -f $< $@
|
||||
|
||||
define archhelp
|
||||
echo '* linux - Binary kernel image (./linux) - for backward'
|
||||
|
@ -117,6 +118,10 @@ prepare: $(ARCH_DIR)/include/kern_constants.h
|
|||
LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static
|
||||
LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib
|
||||
|
||||
CFLAGS_NO_HARDENING := $(call cc-option, -fno-PIC,) $(call cc-option, -fno-pic,) \
|
||||
$(call cc-option, -fno-stack-protector,) \
|
||||
$(call cc-option, -fno-stack-protector-all,)
|
||||
|
||||
CPP_MODE-$(CONFIG_MODE_TT) := -DMODE_TT
|
||||
CONFIG_KERNEL_STACK_ORDER ?= 2
|
||||
STACK_SIZE := $(shell echo $$[ 4096 * (1 << $(CONFIG_KERNEL_STACK_ORDER)) ] )
|
||||
|
@ -203,8 +208,8 @@ endef
|
|||
$(ARCH_DIR)/include/uml-config.h : include/linux/autoconf.h
|
||||
$(call filechk,umlconfig)
|
||||
|
||||
$(ARCH_DIR)/user-offsets.s: $(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.c
|
||||
$(CC) $(USER_CFLAGS) -S -o $@ $<
|
||||
$(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.s: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(ARCH_DIR)/sys-$(SUBARCH) $@
|
||||
|
||||
define filechk_gen-asm-offsets
|
||||
(set -e; \
|
||||
|
@ -219,13 +224,11 @@ define filechk_gen-asm-offsets
|
|||
echo ""; )
|
||||
endef
|
||||
|
||||
$(ARCH_DIR)/include/user_constants.h: $(ARCH_DIR)/user-offsets.s
|
||||
$(ARCH_DIR)/include/user_constants.h: $(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.s
|
||||
$(call filechk,gen-asm-offsets)
|
||||
|
||||
CLEAN_FILES += $(ARCH_DIR)/user-offsets.s
|
||||
|
||||
$(ARCH_DIR)/include/kern_constants.h: $(objtree)/$(ARCH_DIR)/include
|
||||
@echo ' SYMLINK $@'
|
||||
$(Q) ln -sf ../../../include/asm-um/asm-offsets.h $@
|
||||
$(Q)ln -sf ../../../include/asm-um/asm-offsets.h $@
|
||||
|
||||
export SUBARCH USER_CFLAGS OS
|
||||
export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc6-mm1
|
||||
# Tue Jun 14 18:22:21 2005
|
||||
# Linux kernel version: 2.6.17-rc3
|
||||
# Fri Apr 28 09:31:20 2006
|
||||
#
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_UML=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_IRQ_RELEASE_METHOD=y
|
||||
|
||||
#
|
||||
# UML-specific options
|
||||
|
@ -16,8 +15,50 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|||
# CONFIG_MODE_TT is not set
|
||||
# CONFIG_STATIC_LINK is not set
|
||||
CONFIG_MODE_SKAS=y
|
||||
|
||||
#
|
||||
# Host processor type and features
|
||||
#
|
||||
# CONFIG_M386 is not set
|
||||
# CONFIG_M486 is not set
|
||||
# CONFIG_M586 is not set
|
||||
# CONFIG_M586TSC is not set
|
||||
# CONFIG_M586MMX is not set
|
||||
CONFIG_M686=y
|
||||
# CONFIG_MPENTIUMII is not set
|
||||
# CONFIG_MPENTIUMIII is not set
|
||||
# CONFIG_MPENTIUMM is not set
|
||||
# CONFIG_MPENTIUM4 is not set
|
||||
# CONFIG_MK6 is not set
|
||||
# CONFIG_MK7 is not set
|
||||
# CONFIG_MK8 is not set
|
||||
# CONFIG_MCRUSOE is not set
|
||||
# CONFIG_MEFFICEON is not set
|
||||
# CONFIG_MWINCHIPC6 is not set
|
||||
# CONFIG_MWINCHIP2 is not set
|
||||
# CONFIG_MWINCHIP3D is not set
|
||||
# CONFIG_MGEODEGX1 is not set
|
||||
# CONFIG_MGEODE_LX is not set
|
||||
# CONFIG_MCYRIXIII is not set
|
||||
# CONFIG_MVIAC3_2 is not set
|
||||
# CONFIG_X86_GENERIC is not set
|
||||
CONFIG_X86_CMPXCHG=y
|
||||
CONFIG_X86_XADD=y
|
||||
CONFIG_X86_L1_CACHE_SHIFT=5
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_X86_PPRO_FENCE=y
|
||||
CONFIG_X86_WP_WORKS_OK=y
|
||||
CONFIG_X86_INVLPG=y
|
||||
CONFIG_X86_BSWAP=y
|
||||
CONFIG_X86_POPAD_OK=y
|
||||
CONFIG_X86_CMPXCHG64=y
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
CONFIG_X86_USE_PPRO_CHECKSUM=y
|
||||
CONFIG_X86_TSC=y
|
||||
CONFIG_UML_X86=y
|
||||
# CONFIG_64BIT is not set
|
||||
CONFIG_SEMAPHORE_SLEEPERS=y
|
||||
# CONFIG_HOST_2G_2G is not set
|
||||
CONFIG_TOP_ADDR=0xc0000000
|
||||
# CONFIG_3_LEVEL_PGTABLES is not set
|
||||
CONFIG_STUB_CODE=0xbfffe000
|
||||
|
@ -25,22 +66,24 @@ CONFIG_STUB_DATA=0xbffff000
|
|||
CONFIG_STUB_START=0xbfffe000
|
||||
CONFIG_ARCH_HAS_SC_SIGNALS=y
|
||||
CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_LD_SCRIPT_DYN=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
# CONFIG_HOSTFS is not set
|
||||
# CONFIG_HPPFS is not set
|
||||
CONFIG_MCONSOLE=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_HOST_2G_2G is not set
|
||||
CONFIG_NEST_LEVEL=0
|
||||
CONFIG_KERNEL_HALF_GIGS=1
|
||||
# CONFIG_HIGHMEM is not set
|
||||
CONFIG_KERNEL_STACK_ORDER=2
|
||||
CONFIG_UML_REAL_TIME_CLOCK=y
|
||||
|
@ -49,7 +92,6 @@ CONFIG_UML_REAL_TIME_CLOCK=y
|
|||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
|
@ -57,6 +99,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
|
@ -64,26 +107,28 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
CONFIG_KALLSYMS_EXTRA_PASS=y
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
|
@ -91,18 +136,43 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
CONFIG_BLK_DEV_UBD=y
|
||||
# CONFIG_BLK_DEV_UBD_SYNC is not set
|
||||
CONFIG_BLK_DEV_COW_COMMON=y
|
||||
# CONFIG_MMAPPER is not set
|
||||
CONFIG_BLK_DEV_LOOP=m
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# Character Devices
|
||||
|
@ -127,50 +197,23 @@ CONFIG_UML_SOUND=m
|
|||
CONFIG_SOUND=m
|
||||
CONFIG_HOSTAUDIO=m
|
||||
CONFIG_UML_RANDOM=y
|
||||
# CONFIG_MMAPPER is not set
|
||||
|
||||
#
|
||||
# Block devices
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_BLK_DEV_UBD=y
|
||||
CONFIG_BLK_DEV_UBD_SYNC=y
|
||||
CONFIG_BLK_DEV_COW_COMMON=y
|
||||
CONFIG_BLK_DEV_LOOP=m
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_LBD is not set
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
|
||||
#
|
||||
# UML Network Devices
|
||||
#
|
||||
CONFIG_UML_NET=y
|
||||
CONFIG_UML_NET_ETHERTAP=y
|
||||
CONFIG_UML_NET_TUNTAP=y
|
||||
CONFIG_UML_NET_SLIP=y
|
||||
CONFIG_UML_NET_DAEMON=y
|
||||
CONFIG_UML_NET_MCAST=y
|
||||
CONFIG_UML_NET_SLIRP=y
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Networking
|
||||
#
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
|
@ -178,6 +221,7 @@ CONFIG_UNIX=y
|
|||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
|
@ -186,27 +230,31 @@ CONFIG_INET=y
|
|||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=y
|
||||
CONFIG_TCP_CONG_HTCP=y
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
|
@ -224,26 +272,46 @@ CONFIG_TCP_CONG_HTCP=y
|
|||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_KGDBOE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# UML Network Devices
|
||||
#
|
||||
CONFIG_UML_NET=y
|
||||
CONFIG_UML_NET_ETHERTAP=y
|
||||
CONFIG_UML_NET_TUNTAP=y
|
||||
CONFIG_UML_NET_SLIP=y
|
||||
CONFIG_UML_NET_DAEMON=y
|
||||
CONFIG_UML_NET_MCAST=y
|
||||
# CONFIG_UML_NET_PCAP is not set
|
||||
CONFIG_UML_NET_SLIRP=y
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=m
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
CONFIG_TUN=m
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
|
@ -263,6 +331,13 @@ CONFIG_SLIP=m
|
|||
# CONFIG_SLIP_MODE_SLIP6 is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
|
@ -274,17 +349,14 @@ CONFIG_EXT3_FS=y
|
|||
# CONFIG_EXT3_FS_XATTR is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
# CONFIG_REISER4_FS is not set
|
||||
CONFIG_REISERFS_FS=y
|
||||
# CONFIG_REISERFS_CHECK is not set
|
||||
# CONFIG_REISERFS_PROC_INFO is not set
|
||||
# CONFIG_REISERFS_FS_XATTR is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
|
@ -295,11 +367,6 @@ CONFIG_QUOTACTL=y
|
|||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_AUTOFS4_FS=m
|
||||
|
||||
#
|
||||
# Caches
|
||||
#
|
||||
# CONFIG_FSCACHE is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
|
@ -323,14 +390,10 @@ CONFIG_JOLIET=y
|
|||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -430,6 +493,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=m
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
|
||||
|
@ -448,12 +512,18 @@ CONFIG_LOG_BUF_SHIFT=14
|
|||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
CONFIG_DEBUG_SLAB=y
|
||||
# CONFIG_DEBUG_SLAB_LEAK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_GPROF is not set
|
||||
# CONFIG_GCOV is not set
|
||||
# CONFIG_SYSCALL_DEBUG is not set
|
||||
|
|
|
@ -100,7 +100,7 @@ struct cow_header_v3_broken {
|
|||
__u32 alignment;
|
||||
__u32 cow_format;
|
||||
char backing_file[PATH_LEN_V3];
|
||||
} __attribute__((packed));
|
||||
};
|
||||
|
||||
/* COW format definitions - for now, we have only the usual COW bitmap */
|
||||
#define COW_BITMAP 0
|
||||
|
|
|
@ -89,16 +89,18 @@ void sigio_handler(int sig, union uml_pt_regs *regs)
|
|||
struct irq_fd *irq_fd;
|
||||
int n;
|
||||
|
||||
if(smp_sigio_handler()) return;
|
||||
while(1){
|
||||
if (smp_sigio_handler())
|
||||
return;
|
||||
|
||||
while (1) {
|
||||
n = os_waiting_for_events(active_fds);
|
||||
if (n <= 0) {
|
||||
if(n == -EINTR) continue;
|
||||
else break;
|
||||
}
|
||||
|
||||
for(irq_fd = active_fds; irq_fd != NULL; irq_fd = irq_fd->next){
|
||||
if(irq_fd->current_events != 0){
|
||||
for (irq_fd = active_fds; irq_fd != NULL; irq_fd = irq_fd->next) {
|
||||
if (irq_fd->current_events != 0) {
|
||||
irq_fd->current_events = 0;
|
||||
do_IRQ(irq_fd->irq, regs);
|
||||
}
|
||||
|
@ -110,19 +112,17 @@ void sigio_handler(int sig, union uml_pt_regs *regs)
|
|||
|
||||
static void maybe_sigio_broken(int fd, int type)
|
||||
{
|
||||
if(os_isatty(fd)){
|
||||
if((type == IRQ_WRITE) && !pty_output_sigio){
|
||||
if (os_isatty(fd)) {
|
||||
if ((type == IRQ_WRITE) && !pty_output_sigio) {
|
||||
write_sigio_workaround();
|
||||
add_sigio_fd(fd, 0);
|
||||
}
|
||||
else if((type == IRQ_READ) && !pty_close_sigio){
|
||||
} else if ((type == IRQ_READ) && !pty_close_sigio) {
|
||||
write_sigio_workaround();
|
||||
add_sigio_fd(fd, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int activate_fd(int irq, int fd, int type, void *dev_id)
|
||||
{
|
||||
struct pollfd *tmp_pfd;
|
||||
|
@ -132,16 +132,18 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
|
|||
|
||||
pid = os_getpid();
|
||||
err = os_set_fd_async(fd, pid);
|
||||
if(err < 0)
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
new_fd = um_kmalloc(sizeof(*new_fd));
|
||||
err = -ENOMEM;
|
||||
if(new_fd == NULL)
|
||||
if (new_fd == NULL)
|
||||
goto out;
|
||||
|
||||
if(type == IRQ_READ) events = UM_POLLIN | UM_POLLPRI;
|
||||
else events = UM_POLLOUT;
|
||||
if (type == IRQ_READ)
|
||||
events = UM_POLLIN | UM_POLLPRI;
|
||||
else
|
||||
events = UM_POLLOUT;
|
||||
*new_fd = ((struct irq_fd) { .next = NULL,
|
||||
.id = dev_id,
|
||||
.fd = fd,
|
||||
|
@ -165,8 +167,8 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
|
|||
* a semaphore.
|
||||
*/
|
||||
flags = irq_lock();
|
||||
for(irq_fd = active_fds; irq_fd != NULL; irq_fd = irq_fd->next){
|
||||
if((irq_fd->fd == fd) && (irq_fd->type == type)){
|
||||
for (irq_fd = active_fds; irq_fd != NULL; irq_fd = irq_fd->next) {
|
||||
if ((irq_fd->fd == fd) && (irq_fd->type == type)) {
|
||||
printk("Registering fd %d twice\n", fd);
|
||||
printk("Irqs : %d, %d\n", irq_fd->irq, irq);
|
||||
printk("Ids : 0x%p, 0x%p\n", irq_fd->id, dev_id);
|
||||
|
@ -175,13 +177,13 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
|
|||
}
|
||||
|
||||
/*-------------*/
|
||||
if(type == IRQ_WRITE)
|
||||
if (type == IRQ_WRITE)
|
||||
fd = -1;
|
||||
|
||||
tmp_pfd = NULL;
|
||||
n = 0;
|
||||
|
||||
while(1){
|
||||
while (1) {
|
||||
n = os_create_pollfd(fd, events, tmp_pfd, n);
|
||||
if (n == 0)
|
||||
break;
|
||||
|
@ -198,10 +200,8 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
|
|||
* then we free the buffer tmp_fds and try again.
|
||||
*/
|
||||
irq_unlock(flags);
|
||||
if (tmp_pfd != NULL) {
|
||||
kfree(tmp_pfd);
|
||||
tmp_pfd = NULL;
|
||||
}
|
||||
kfree(tmp_pfd);
|
||||
tmp_pfd = NULL;
|
||||
|
||||
tmp_pfd = um_kmalloc(n);
|
||||
if (tmp_pfd == NULL)
|
||||
|
@ -249,7 +249,7 @@ static int same_irq_and_dev(struct irq_fd *irq, void *d)
|
|||
{
|
||||
struct irq_and_dev *data = d;
|
||||
|
||||
return((irq->irq == data->irq) && (irq->id == data->dev));
|
||||
return ((irq->irq == data->irq) && (irq->id == data->dev));
|
||||
}
|
||||
|
||||
void free_irq_by_irq_and_dev(unsigned int irq, void *dev)
|
||||
|
@ -262,7 +262,7 @@ void free_irq_by_irq_and_dev(unsigned int irq, void *dev)
|
|||
|
||||
static int same_fd(struct irq_fd *irq, void *fd)
|
||||
{
|
||||
return(irq->fd == *((int *) fd));
|
||||
return (irq->fd == *((int *)fd));
|
||||
}
|
||||
|
||||
void free_irq_by_fd(int fd)
|
||||
|
@ -276,16 +276,17 @@ static struct irq_fd *find_irq_by_fd(int fd, int irqnum, int *index_out)
|
|||
int i = 0;
|
||||
int fdi;
|
||||
|
||||
for(irq=active_fds; irq != NULL; irq = irq->next){
|
||||
if((irq->fd == fd) && (irq->irq == irqnum)) break;
|
||||
for (irq = active_fds; irq != NULL; irq = irq->next) {
|
||||
if ((irq->fd == fd) && (irq->irq == irqnum))
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if(irq == NULL){
|
||||
if (irq == NULL) {
|
||||
printk("find_irq_by_fd doesn't have descriptor %d\n", fd);
|
||||
goto out;
|
||||
}
|
||||
fdi = os_get_pollfd(i);
|
||||
if((fdi != -1) && (fdi != fd)){
|
||||
if ((fdi != -1) && (fdi != fd)) {
|
||||
printk("find_irq_by_fd - mismatch between active_fds and "
|
||||
"pollfds, fd %d vs %d, need %d\n", irq->fd,
|
||||
fdi, fd);
|
||||
|
@ -294,7 +295,7 @@ static struct irq_fd *find_irq_by_fd(int fd, int irqnum, int *index_out)
|
|||
}
|
||||
*index_out = i;
|
||||
out:
|
||||
return(irq);
|
||||
return irq;
|
||||
}
|
||||
|
||||
void reactivate_fd(int fd, int irqnum)
|
||||
|
@ -305,7 +306,7 @@ void reactivate_fd(int fd, int irqnum)
|
|||
|
||||
flags = irq_lock();
|
||||
irq = find_irq_by_fd(fd, irqnum, &i);
|
||||
if(irq == NULL){
|
||||
if (irq == NULL) {
|
||||
irq_unlock(flags);
|
||||
return;
|
||||
}
|
||||
|
@ -326,7 +327,7 @@ void deactivate_fd(int fd, int irqnum)
|
|||
|
||||
flags = irq_lock();
|
||||
irq = find_irq_by_fd(fd, irqnum, &i);
|
||||
if(irq == NULL)
|
||||
if (irq == NULL)
|
||||
goto out;
|
||||
os_set_pollfd(i, -1);
|
||||
out:
|
||||
|
@ -338,15 +339,15 @@ int deactivate_all_fds(void)
|
|||
struct irq_fd *irq;
|
||||
int err;
|
||||
|
||||
for(irq=active_fds;irq != NULL;irq = irq->next){
|
||||
for (irq = active_fds; irq != NULL; irq = irq->next) {
|
||||
err = os_clear_fd_async(irq->fd);
|
||||
if(err)
|
||||
return(err);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
/* If there is a signal already queued, after unblocking ignore it */
|
||||
os_set_ioignore();
|
||||
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void forward_interrupts(int pid)
|
||||
|
@ -356,9 +357,9 @@ void forward_interrupts(int pid)
|
|||
int err;
|
||||
|
||||
flags = irq_lock();
|
||||
for(irq=active_fds;irq != NULL;irq = irq->next){
|
||||
for (irq = active_fds; irq != NULL; irq = irq->next) {
|
||||
err = os_set_owner(irq->fd, pid);
|
||||
if(err < 0){
|
||||
if (err < 0) {
|
||||
/* XXX Just remove the irq rather than
|
||||
* print out an infinite stream of these
|
||||
*/
|
||||
|
@ -379,7 +380,7 @@ void forward_interrupts(int pid)
|
|||
unsigned int do_IRQ(int irq, union uml_pt_regs *regs)
|
||||
{
|
||||
irq_enter();
|
||||
__do_IRQ(irq, (struct pt_regs *) regs);
|
||||
__do_IRQ(irq, (struct pt_regs *)regs);
|
||||
irq_exit();
|
||||
return 1;
|
||||
}
|
||||
|
@ -392,12 +393,12 @@ int um_request_irq(unsigned int irq, int fd, int type,
|
|||
int err;
|
||||
|
||||
err = request_irq(irq, handler, irqflags, devname, dev_id);
|
||||
if(err)
|
||||
return(err);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if(fd != -1)
|
||||
if (fd != -1)
|
||||
err = activate_fd(irq, fd, type, dev_id);
|
||||
return(err);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(um_request_irq);
|
||||
EXPORT_SYMBOL(reactivate_fd);
|
||||
|
@ -409,7 +410,7 @@ unsigned long irq_lock(void)
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&irq_spinlock, flags);
|
||||
return(flags);
|
||||
return flags;
|
||||
}
|
||||
|
||||
void irq_unlock(unsigned long flags)
|
||||
|
@ -452,7 +453,7 @@ void __init init_IRQ(void)
|
|||
irq_desc[TIMER_IRQ].depth = 1;
|
||||
irq_desc[TIMER_IRQ].handler = &SIGVTALRM_irq_type;
|
||||
enable_irq(TIMER_IRQ);
|
||||
for(i=1;i<NR_IRQS;i++){
|
||||
for (i = 1; i < NR_IRQS; i++) {
|
||||
irq_desc[i].status = IRQ_DISABLED;
|
||||
irq_desc[i].action = NULL;
|
||||
irq_desc[i].depth = 1;
|
||||
|
@ -467,7 +468,7 @@ int init_aio_irq(int irq, char *name, irqreturn_t (*handler)(int, void *,
|
|||
int fds[2], err;
|
||||
|
||||
err = os_pipe(fds, 1, 1);
|
||||
if(err){
|
||||
if (err) {
|
||||
printk("init_aio_irq - os_pipe failed, err = %d\n", -err);
|
||||
goto out;
|
||||
}
|
||||
|
@ -475,7 +476,7 @@ int init_aio_irq(int irq, char *name, irqreturn_t (*handler)(int, void *,
|
|||
err = um_request_irq(irq, fds[0], IRQ_READ, handler,
|
||||
SA_INTERRUPT | SA_SAMPLE_RANDOM, name,
|
||||
(void *) (long) fds[0]);
|
||||
if(err){
|
||||
if (err) {
|
||||
printk("init_aio_irq - : um_request_irq failed, err = %d\n",
|
||||
err);
|
||||
goto out_close;
|
||||
|
@ -488,5 +489,5 @@ int init_aio_irq(int irq, char *name, irqreturn_t (*handler)(int, void *,
|
|||
os_close_file(fds[0]);
|
||||
os_close_file(fds[1]);
|
||||
out:
|
||||
return(err);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -407,6 +407,8 @@ unsigned long find_iomem(char *driver, unsigned long *len_out)
|
|||
*len_out = region->size;
|
||||
return(region->virt);
|
||||
}
|
||||
|
||||
region = region->next;
|
||||
}
|
||||
|
||||
return(0);
|
||||
|
|
|
@ -275,15 +275,13 @@ void syscall_trace(union uml_pt_regs *regs, int entryexit)
|
|||
|
||||
if (unlikely(current->audit_context)) {
|
||||
if (!entryexit)
|
||||
audit_syscall_entry(current,
|
||||
HOST_AUDIT_ARCH,
|
||||
audit_syscall_entry(HOST_AUDIT_ARCH,
|
||||
UPT_SYSCALL_NR(regs),
|
||||
UPT_SYSCALL_ARG1(regs),
|
||||
UPT_SYSCALL_ARG2(regs),
|
||||
UPT_SYSCALL_ARG3(regs),
|
||||
UPT_SYSCALL_ARG4(regs));
|
||||
else audit_syscall_exit(current,
|
||||
AUDITSC_RESULT(UPT_SYSCALL_RET(regs)),
|
||||
else audit_syscall_exit(AUDITSC_RESULT(UPT_SYSCALL_RET(regs)),
|
||||
UPT_SYSCALL_RET(regs));
|
||||
}
|
||||
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
obj-y := clone.o exec_kern.o mem.o mmu.o process_kern.o \
|
||||
syscall.o tlb.o uaccess.o
|
||||
|
||||
USER_OBJS := clone.o
|
||||
# clone.o is in the stub, so it can't be built with profiling
|
||||
# GCC hardened also auto-enables -fpic, but we need %ebx so it can't work ->
|
||||
# disable it
|
||||
|
||||
CFLAGS_clone.o := $(CFLAGS_NO_HARDENING)
|
||||
UNPROFILE_OBJS := clone.o
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
|
||||
# clone.o is in the stub, so it can't be built with profiling
|
||||
$(obj)/clone.o : c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS))
|
||||
|
|
|
@ -209,4 +209,4 @@ int __init timer_init(void)
|
|||
return(0);
|
||||
}
|
||||
|
||||
__initcall(timer_init);
|
||||
arch_initcall(timer_init);
|
||||
|
|
|
@ -171,7 +171,7 @@ int os_sigio_async(int master, int slave)
|
|||
|
||||
flags = fcntl(master, F_GETFL);
|
||||
if(flags < 0)
|
||||
return errno;
|
||||
return -errno;
|
||||
|
||||
if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
|
||||
(fcntl(master, F_SETOWN, os_getpid()) < 0))
|
||||
|
|
|
@ -29,21 +29,21 @@ int os_waiting_for_events(struct irq_fd *active_fds)
|
|||
int i, n, err;
|
||||
|
||||
n = poll(pollfds, pollfds_num, 0);
|
||||
if(n < 0){
|
||||
if (n < 0) {
|
||||
err = -errno;
|
||||
if(errno != EINTR)
|
||||
if (errno != EINTR)
|
||||
printk("sigio_handler: os_waiting_for_events:"
|
||||
" poll returned %d, errno = %d\n", n, errno);
|
||||
return err;
|
||||
}
|
||||
|
||||
if(n == 0)
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
irq_fd = active_fds;
|
||||
|
||||
for(i = 0; i < pollfds_num; i++){
|
||||
if(pollfds[i].revents != 0){
|
||||
for (i = 0; i < pollfds_num; i++) {
|
||||
if (pollfds[i].revents != 0) {
|
||||
irq_fd->current_events = pollfds[i].revents;
|
||||
pollfds[i].fd = -1;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ int os_waiting_for_events(struct irq_fd *active_fds)
|
|||
|
||||
int os_isatty(int fd)
|
||||
{
|
||||
return(isatty(fd));
|
||||
return isatty(fd);
|
||||
}
|
||||
|
||||
int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds)
|
||||
|
@ -65,7 +65,7 @@ int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds)
|
|||
return((pollfds_size + 1) * sizeof(pollfds[0]));
|
||||
}
|
||||
|
||||
if(pollfds != NULL){
|
||||
if (pollfds != NULL) {
|
||||
memcpy(tmp_pfd, pollfds,
|
||||
sizeof(pollfds[0]) * pollfds_size);
|
||||
/* remove old pollfds */
|
||||
|
@ -73,18 +73,15 @@ int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds)
|
|||
}
|
||||
pollfds = tmp_pfd;
|
||||
pollfds_size++;
|
||||
} else {
|
||||
/* remove not used tmp_pfd */
|
||||
if (tmp_pfd != NULL)
|
||||
kfree(tmp_pfd);
|
||||
}
|
||||
} else
|
||||
kfree(tmp_pfd); /* remove not used tmp_pfd */
|
||||
|
||||
pollfds[pollfds_num] = ((struct pollfd) { .fd = fd,
|
||||
.events = events,
|
||||
.revents = 0 });
|
||||
pollfds[pollfds_num] = ((struct pollfd) { .fd = fd,
|
||||
.events = events,
|
||||
.revents = 0 });
|
||||
pollfds_num++;
|
||||
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg,
|
||||
|
@ -94,11 +91,11 @@ void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg,
|
|||
int i = 0;
|
||||
|
||||
prev = &active_fds;
|
||||
while(*prev != NULL){
|
||||
if((*test)(*prev, arg)){
|
||||
while (*prev != NULL) {
|
||||
if ((*test)(*prev, arg)) {
|
||||
struct irq_fd *old_fd = *prev;
|
||||
if((pollfds[i].fd != -1) &&
|
||||
(pollfds[i].fd != (*prev)->fd)){
|
||||
if ((pollfds[i].fd != -1) &&
|
||||
(pollfds[i].fd != (*prev)->fd)) {
|
||||
printk("os_free_irq_by_cb - mismatch between "
|
||||
"active_fds and pollfds, fd %d vs %d\n",
|
||||
(*prev)->fd, pollfds[i].fd);
|
||||
|
@ -110,7 +107,6 @@ void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg,
|
|||
/* This moves the *whole* array after pollfds[i]
|
||||
* (though it doesn't spot as such)!
|
||||
*/
|
||||
|
||||
memmove(&pollfds[i], &pollfds[i + 1],
|
||||
(pollfds_num - i) * sizeof(pollfds[0]));
|
||||
if(*last_irq_ptr2 == &old_fd->next)
|
||||
|
@ -129,10 +125,9 @@ void os_free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg,
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
int os_get_pollfd(int i)
|
||||
{
|
||||
return(pollfds[i].fd);
|
||||
return pollfds[i].fd;
|
||||
}
|
||||
|
||||
void os_set_pollfd(int i, int fd)
|
||||
|
@ -151,8 +146,10 @@ void init_irq_signals(int on_sigstack)
|
|||
int flags;
|
||||
|
||||
flags = on_sigstack ? SA_ONSTACK : 0;
|
||||
if(timer_irq_inited) h = (__sighandler_t) alarm_handler;
|
||||
else h = boot_timer_handler;
|
||||
if (timer_irq_inited)
|
||||
h = (__sighandler_t)alarm_handler;
|
||||
else
|
||||
h = boot_timer_handler;
|
||||
|
||||
set_handler(SIGVTALRM, h, flags | SA_RESTART,
|
||||
SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1);
|
||||
|
|
|
@ -74,6 +74,34 @@ static void last_ditch_exit(int sig)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
#define UML_LIB_PATH ":/usr/lib/uml"
|
||||
|
||||
static void setup_env_path(void)
|
||||
{
|
||||
char *new_path = NULL;
|
||||
char *old_path = NULL;
|
||||
int path_len = 0;
|
||||
|
||||
old_path = getenv("PATH");
|
||||
/* if no PATH variable is set or it has an empty value
|
||||
* just use the default + /usr/lib/uml
|
||||
*/
|
||||
if (!old_path || (path_len = strlen(old_path)) == 0) {
|
||||
putenv("PATH=:/bin:/usr/bin/" UML_LIB_PATH);
|
||||
return;
|
||||
}
|
||||
|
||||
/* append /usr/lib/uml to the existing path */
|
||||
path_len += strlen("PATH=" UML_LIB_PATH) + 1;
|
||||
new_path = malloc(path_len);
|
||||
if (!new_path) {
|
||||
perror("coudn't malloc to set a new PATH");
|
||||
return;
|
||||
}
|
||||
snprintf(new_path, path_len, "PATH=%s" UML_LIB_PATH, old_path);
|
||||
putenv(new_path);
|
||||
}
|
||||
|
||||
extern int uml_exitcode;
|
||||
|
||||
extern void scan_elf_aux( char **envp);
|
||||
|
@ -114,6 +142,8 @@ int main(int argc, char **argv, char **envp)
|
|||
|
||||
set_stklim();
|
||||
|
||||
setup_env_path();
|
||||
|
||||
new_argv = malloc((argc + 1) * sizeof(char *));
|
||||
if(new_argv == NULL){
|
||||
perror("Mallocing argv");
|
||||
|
|
|
@ -206,29 +206,36 @@ int os_drop_memory(void *addr, int length)
|
|||
int can_drop_memory(void)
|
||||
{
|
||||
void *addr;
|
||||
int fd;
|
||||
int fd, ok = 0;
|
||||
|
||||
printk("Checking host MADV_REMOVE support...");
|
||||
fd = create_mem_file(UM_KERN_PAGE_SIZE);
|
||||
if(fd < 0){
|
||||
printk("Creating test memory file failed, err = %d\n", -fd);
|
||||
return 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED, fd, 0);
|
||||
if(addr == MAP_FAILED){
|
||||
printk("Mapping test memory file failed, err = %d\n", -errno);
|
||||
return 0;
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
if(madvise(addr, UM_KERN_PAGE_SIZE, MADV_REMOVE) != 0){
|
||||
printk("MADV_REMOVE failed, err = %d\n", -errno);
|
||||
return 0;
|
||||
goto out_unmap;
|
||||
}
|
||||
|
||||
printk("OK\n");
|
||||
return 1;
|
||||
ok = 1;
|
||||
|
||||
out_unmap:
|
||||
munmap(addr, UM_KERN_PAGE_SIZE);
|
||||
out_close:
|
||||
close(fd);
|
||||
out:
|
||||
return ok;
|
||||
}
|
||||
|
||||
void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int))
|
||||
|
|
|
@ -344,12 +344,12 @@ int copy_context_skas0(unsigned long new_stack, int pid)
|
|||
err = ptrace_setregs(pid, regs);
|
||||
if(err < 0)
|
||||
panic("copy_context_skas0 : PTRACE_SETREGS failed, "
|
||||
"pid = %d, errno = %d\n", pid, errno);
|
||||
"pid = %d, errno = %d\n", pid, -err);
|
||||
|
||||
err = ptrace_setfpregs(pid, fp_regs);
|
||||
if(err < 0)
|
||||
panic("copy_context_skas0 : PTRACE_SETFPREGS failed, "
|
||||
"pid = %d, errno = %d\n", pid, errno);
|
||||
"pid = %d, errno = %d\n", pid, -err);
|
||||
|
||||
/* set a well known return code for detection of child write failure */
|
||||
child_data->err = 12345678;
|
||||
|
@ -362,7 +362,7 @@ int copy_context_skas0(unsigned long new_stack, int pid)
|
|||
pid = data->err;
|
||||
if(pid < 0)
|
||||
panic("copy_context_skas0 - stub-parent reports error %d\n",
|
||||
pid);
|
||||
-pid);
|
||||
|
||||
/* Wait, until child has finished too: read child's result from
|
||||
* child's stack and check it.
|
||||
|
|
|
@ -104,7 +104,7 @@ void init_registers(int pid)
|
|||
err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
|
||||
if(err)
|
||||
panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
|
||||
err);
|
||||
errno);
|
||||
|
||||
errno = 0;
|
||||
err = ptrace(PTRACE_GETFPXREGS, pid, 0, exec_fpx_regs);
|
||||
|
@ -119,7 +119,7 @@ void init_registers(int pid)
|
|||
err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs);
|
||||
if(err)
|
||||
panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d",
|
||||
err);
|
||||
errno);
|
||||
}
|
||||
|
||||
void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
|
||||
|
|
|
@ -62,12 +62,12 @@ void init_registers(int pid)
|
|||
err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
|
||||
if(err)
|
||||
panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
|
||||
err);
|
||||
errno);
|
||||
|
||||
err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs);
|
||||
if(err)
|
||||
panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d",
|
||||
err);
|
||||
errno);
|
||||
}
|
||||
|
||||
void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
|
||||
|
|
|
@ -178,14 +178,14 @@ static void __init create_pid_file(void)
|
|||
fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644);
|
||||
if(fd < 0){
|
||||
printk("Open of machine pid file \"%s\" failed: %s\n",
|
||||
file, strerror(-fd));
|
||||
file, strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
snprintf(pid, sizeof(pid), "%d\n", getpid());
|
||||
n = write(fd, pid, strlen(pid));
|
||||
if(n != strlen(pid))
|
||||
printk("Write of pid file failed - err = %d\n", -n);
|
||||
printk("Write of pid file failed - err = %d\n", errno);
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
|
|
@ -96,6 +96,13 @@ EXPORT_SYMBOL_PROTO(getuid);
|
|||
EXPORT_SYMBOL_PROTO(fsync);
|
||||
EXPORT_SYMBOL_PROTO(fdatasync);
|
||||
|
||||
/* Export symbols used by GCC for the stack protector. */
|
||||
extern void __stack_smash_handler(void *) __attribute__((weak));
|
||||
EXPORT_SYMBOL(__stack_smash_handler);
|
||||
|
||||
extern long __guard __attribute__((weak));
|
||||
EXPORT_SYMBOL(__guard);
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* Emacs will notice this stuff at the end of the file and automatically
|
||||
|
|
|
@ -7,11 +7,19 @@ USER_SINGLE_OBJS := \
|
|||
USER_OBJS += $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS))
|
||||
USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
|
||||
|
||||
$(USER_OBJS) $(USER_OBJS:.o=.i) $(USER_OBJS:.o=.s) $(USER_OBJS:.o=.lst): \
|
||||
c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(notdir $@))
|
||||
$(USER_OBJS:.o=.%): \
|
||||
c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) $(CFLAGS_$(*F).o)
|
||||
$(USER_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \
|
||||
-Dunix -D__unix__ -D__$(SUBARCH)__
|
||||
|
||||
# These are like USER_OBJS but filter USER_CFLAGS through unprofile instead of
|
||||
# using it directly.
|
||||
UNPROFILE_OBJS := $(foreach file,$(UNPROFILE_OBJS),$(obj)/$(file))
|
||||
|
||||
$(UNPROFILE_OBJS:.o=.%): \
|
||||
c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) $(CFLAGS_$(*F).o)
|
||||
$(UNPROFILE_OBJS) : CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ \
|
||||
-Dunix -D__unix__ -D__$(SUBARCH)__
|
||||
|
||||
# The stubs and unmap.o can't try to call mcount or update basic block data
|
||||
define unprofile
|
||||
|
|
|
@ -8,11 +8,16 @@ subarch-obj-y = lib/bitops.o kernel/semaphore.o
|
|||
subarch-obj-$(CONFIG_HIGHMEM) += mm/highmem.o
|
||||
subarch-obj-$(CONFIG_MODULES) += kernel/module.o
|
||||
|
||||
USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o stub_segv.o
|
||||
USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
USER_OBJS += user-offsets.s
|
||||
extra-y += user-offsets.s
|
||||
|
||||
extra-$(CONFIG_MODE_TT) += unmap.o
|
||||
|
||||
$(obj)/stub_segv.o $(obj)/unmap.o: \
|
||||
_c_flags = $(call unprofile,$(CFLAGS))
|
||||
UNPROFILE_OBJS := stub_segv.o
|
||||
CFLAGS_stub_segv.o := $(CFLAGS_NO_HARDENING)
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
|
||||
$(obj)/unmap.%: _c_flags = $(call unprofile,$(CFLAGS))
|
||||
|
|
|
@ -16,11 +16,16 @@ subarch-obj-$(CONFIG_MODULES) += kernel/module.o
|
|||
|
||||
ldt-y = ../sys-i386/ldt.o
|
||||
|
||||
USER_OBJS := ptrace_user.o sigcontext.o stub_segv.o
|
||||
USER_OBJS := ptrace_user.o sigcontext.o
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
USER_OBJS += user-offsets.s
|
||||
extra-y += user-offsets.s
|
||||
|
||||
extra-$(CONFIG_MODE_TT) += unmap.o
|
||||
|
||||
$(obj)/stub_segv.o $(obj)/unmap.o: \
|
||||
_c_flags = $(call unprofile,$(CFLAGS))
|
||||
UNPROFILE_OBJS := stub_segv.o
|
||||
CFLAGS_stub_segv.o := $(CFLAGS_NO_HARDENING)
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
||||
|
||||
$(obj)/unmap.%: _c_flags = $(call unprofile,$(CFLAGS))
|
||||
|
|
|
@ -695,4 +695,5 @@ ia32_sys_call_table:
|
|||
.quad sys_splice
|
||||
.quad sys_sync_file_range
|
||||
.quad sys_tee
|
||||
.quad compat_sys_vmsplice
|
||||
ia32_syscall_end:
|
||||
|
|
|
@ -600,12 +600,12 @@ asmlinkage void syscall_trace_enter(struct pt_regs *regs)
|
|||
|
||||
if (unlikely(current->audit_context)) {
|
||||
if (test_thread_flag(TIF_IA32)) {
|
||||
audit_syscall_entry(current, AUDIT_ARCH_I386,
|
||||
audit_syscall_entry(AUDIT_ARCH_I386,
|
||||
regs->orig_rax,
|
||||
regs->rbx, regs->rcx,
|
||||
regs->rdx, regs->rsi);
|
||||
} else {
|
||||
audit_syscall_entry(current, AUDIT_ARCH_X86_64,
|
||||
audit_syscall_entry(AUDIT_ARCH_X86_64,
|
||||
regs->orig_rax,
|
||||
regs->rdi, regs->rsi,
|
||||
regs->rdx, regs->r10);
|
||||
|
@ -616,7 +616,7 @@ asmlinkage void syscall_trace_enter(struct pt_regs *regs)
|
|||
asmlinkage void syscall_trace_leave(struct pt_regs *regs)
|
||||
{
|
||||
if (unlikely(current->audit_context))
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(regs->rax), regs->rax);
|
||||
audit_syscall_exit(AUDITSC_RESULT(regs->rax), regs->rax);
|
||||
|
||||
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|
||||
|| test_thread_flag(TIF_SINGLESTEP))
|
||||
|
|
|
@ -1426,3 +1426,22 @@ struct seq_operations cpuinfo_op = {
|
|||
.show = show_cpuinfo,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_INPUT_PCSPKR
|
||||
#include <linux/platform_device.h>
|
||||
static __init int add_pcspkr(void)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
int ret;
|
||||
|
||||
pd = platform_device_alloc("pcspkr", -1);
|
||||
if (!pd)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add(pd);
|
||||
if (ret)
|
||||
platform_device_put(pd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
device_initcall(add_pcspkr);
|
||||
#endif
|
||||
|
|
|
@ -200,13 +200,13 @@ static ssize_t gen_rtc_read(struct file *file, char __user *buf,
|
|||
/* first test allows optimizer to nuke this case for 32-bit machines */
|
||||
if (sizeof (int) != sizeof (long) && count == sizeof (unsigned int)) {
|
||||
unsigned int uidata = data;
|
||||
retval = put_user(uidata, (unsigned long __user *)buf);
|
||||
retval = put_user(uidata, (unsigned int __user *)buf) ?:
|
||||
sizeof(unsigned int);
|
||||
}
|
||||
else {
|
||||
retval = put_user(data, (unsigned long __user *)buf);
|
||||
retval = put_user(data, (unsigned long __user *)buf) ?:
|
||||
sizeof(unsigned long);
|
||||
}
|
||||
if (!retval)
|
||||
retval = sizeof(unsigned long);
|
||||
out:
|
||||
current->state = TASK_RUNNING;
|
||||
remove_wait_queue(&gen_rtc_wait, &wait);
|
||||
|
|
|
@ -860,9 +860,32 @@ static void k_slock(struct vc_data *vc, unsigned char value, char up_flag, struc
|
|||
}
|
||||
|
||||
/* by default, 300ms interval for combination release */
|
||||
static long brl_timeout = 300;
|
||||
MODULE_PARM_DESC(brl_timeout, "Braille keys release delay in ms (0 for combination on first release, < 0 for dead characters)");
|
||||
module_param(brl_timeout, long, 0644);
|
||||
static unsigned brl_timeout = 300;
|
||||
MODULE_PARM_DESC(brl_timeout, "Braille keys release delay in ms (0 for commit on first key release)");
|
||||
module_param(brl_timeout, uint, 0644);
|
||||
|
||||
static unsigned brl_nbchords = 1;
|
||||
MODULE_PARM_DESC(brl_nbchords, "Number of chords that produce a braille pattern (0 for dead chords)");
|
||||
module_param(brl_nbchords, uint, 0644);
|
||||
|
||||
static void k_brlcommit(struct vc_data *vc, unsigned int pattern, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
static unsigned long chords;
|
||||
static unsigned committed;
|
||||
|
||||
if (!brl_nbchords)
|
||||
k_deadunicode(vc, BRL_UC_ROW | pattern, up_flag, regs);
|
||||
else {
|
||||
committed |= pattern;
|
||||
chords++;
|
||||
if (chords == brl_nbchords) {
|
||||
k_unicode(vc, BRL_UC_ROW | committed, up_flag, regs);
|
||||
chords = 0;
|
||||
committed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void k_brl(struct vc_data *vc, unsigned char value, char up_flag, struct pt_regs *regs)
|
||||
{
|
||||
static unsigned pressed,committing;
|
||||
|
@ -882,11 +905,6 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag, struct
|
|||
if (value > 8)
|
||||
return;
|
||||
|
||||
if (brl_timeout < 0) {
|
||||
k_deadunicode(vc, BRL_UC_ROW | (1 << (value - 1)), up_flag, regs);
|
||||
return;
|
||||
}
|
||||
|
||||
if (up_flag) {
|
||||
if (brl_timeout) {
|
||||
if (!committing ||
|
||||
|
@ -897,13 +915,13 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag, struct
|
|||
pressed &= ~(1 << (value - 1));
|
||||
if (!pressed) {
|
||||
if (committing) {
|
||||
k_unicode(vc, BRL_UC_ROW | committing, 0, regs);
|
||||
k_brlcommit(vc, committing, 0, regs);
|
||||
committing = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (committing) {
|
||||
k_unicode(vc, BRL_UC_ROW | committing, 0, regs);
|
||||
k_brlcommit(vc, committing, 0, regs);
|
||||
committing = 0;
|
||||
}
|
||||
pressed &= ~(1 << (value - 1));
|
||||
|
|
|
@ -271,7 +271,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|||
ipcnum,
|
||||
pDrvData->IPCs[ipcnum].usIntCount);
|
||||
|
||||
if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
|
||||
if (ipcnum >= ARRAY_SIZE(pDrvData->IPCs)) {
|
||||
PRINTK_ERROR(KERN_ERR_MWAVE
|
||||
"mwavedd::mwave_ioctl:"
|
||||
" IOCTL_MW_REGISTER_IPC:"
|
||||
|
|
|
@ -515,7 +515,7 @@ tipar_init_module(void)
|
|||
err = PTR_ERR(tipar_class);
|
||||
goto out_chrdev;
|
||||
}
|
||||
if (parport_register_driver(&tipar_driver) || tp_count == 0) {
|
||||
if (parport_register_driver(&tipar_driver)) {
|
||||
printk(KERN_ERR "tipar: unable to register with parport\n");
|
||||
err = -EIO;
|
||||
goto out_class;
|
||||
|
|
|
@ -25,6 +25,8 @@
|
|||
#include <linux/slab.h>
|
||||
#include "edac_mc.h"
|
||||
|
||||
static int force_function_unhide;
|
||||
|
||||
#define e752x_printk(level, fmt, arg...) \
|
||||
edac_printk(level, "e752x", fmt, ##arg)
|
||||
|
||||
|
@ -782,8 +784,16 @@ static int e752x_probe1(struct pci_dev *pdev, int dev_idx)
|
|||
debugf0("%s(): mci\n", __func__);
|
||||
debugf0("Starting Probe1\n");
|
||||
|
||||
/* enable device 0 function 1 */
|
||||
/* check to see if device 0 function 1 is enabled; if it isn't, we
|
||||
* assume the BIOS has reserved it for a reason and is expecting
|
||||
* exclusive access, we take care not to violate that assumption and
|
||||
* fail the probe. */
|
||||
pci_read_config_byte(pdev, E752X_DEVPRES1, &stat8);
|
||||
if (!force_function_unhide && !(stat8 & (1 << 5))) {
|
||||
printk(KERN_INFO "Contact your BIOS vendor to see if the "
|
||||
"E752x error registers can be safely un-hidden\n");
|
||||
goto fail;
|
||||
}
|
||||
stat8 |= (1 << 5);
|
||||
pci_write_config_byte(pdev, E752X_DEVPRES1, stat8);
|
||||
|
||||
|
@ -1063,3 +1073,8 @@ module_exit(e752x_exit);
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Linux Networx (http://lnxi.com) Tom Zimmerman\n");
|
||||
MODULE_DESCRIPTION("MC support for Intel e752x memory controllers");
|
||||
|
||||
module_param(force_function_unhide, int, 0444);
|
||||
MODULE_PARM_DESC(force_function_unhide, "if BIOS sets Dev0:Fun1 up as hidden:"
|
||||
" 1=force unhide and hope BIOS doesn't fight driver for Dev0:Fun1 access");
|
||||
|
||||
|
|
|
@ -60,11 +60,11 @@
|
|||
#define __IPATH_KERNEL_SEND 0x2000 /* use kernel mode send */
|
||||
#define __IPATH_EPKTDBG 0x4000 /* print ethernet packet data */
|
||||
#define __IPATH_SMADBG 0x8000 /* sma packet debug */
|
||||
#define __IPATH_IPATHDBG 0x10000 /* Ethernet (IPATH) general debug on */
|
||||
#define __IPATH_IPATHWARN 0x20000 /* Ethernet (IPATH) warnings on */
|
||||
#define __IPATH_IPATHERR 0x40000 /* Ethernet (IPATH) errors on */
|
||||
#define __IPATH_IPATHPD 0x80000 /* Ethernet (IPATH) packet dump on */
|
||||
#define __IPATH_IPATHTABLE 0x100000 /* Ethernet (IPATH) table dump on */
|
||||
#define __IPATH_IPATHDBG 0x10000 /* Ethernet (IPATH) gen debug */
|
||||
#define __IPATH_IPATHWARN 0x20000 /* Ethernet (IPATH) warnings */
|
||||
#define __IPATH_IPATHERR 0x40000 /* Ethernet (IPATH) errors */
|
||||
#define __IPATH_IPATHPD 0x80000 /* Ethernet (IPATH) packet dump */
|
||||
#define __IPATH_IPATHTABLE 0x100000 /* Ethernet (IPATH) table dump */
|
||||
|
||||
#else /* _IPATH_DEBUGGING */
|
||||
|
||||
|
@ -79,11 +79,12 @@
|
|||
#define __IPATH_TRSAMPLE 0x0 /* generate trace buffer sample entries */
|
||||
#define __IPATH_VERBDBG 0x0 /* very verbose debug */
|
||||
#define __IPATH_PKTDBG 0x0 /* print packet data */
|
||||
#define __IPATH_PROCDBG 0x0 /* print process startup (init)/exit messages */
|
||||
#define __IPATH_PROCDBG 0x0 /* process startup (init)/exit messages */
|
||||
/* print mmap/nopage stuff, not using VDBG any more */
|
||||
#define __IPATH_MMDBG 0x0
|
||||
#define __IPATH_EPKTDBG 0x0 /* print ethernet packet data */
|
||||
#define __IPATH_SMADBG 0x0 /* print process startup (init)/exit messages */#define __IPATH_IPATHDBG 0x0 /* Ethernet (IPATH) table dump on */
|
||||
#define __IPATH_SMADBG 0x0 /* process startup (init)/exit messages */
|
||||
#define __IPATH_IPATHDBG 0x0 /* Ethernet (IPATH) table dump on */
|
||||
#define __IPATH_IPATHWARN 0x0 /* Ethernet (IPATH) warnings on */
|
||||
#define __IPATH_IPATHERR 0x0 /* Ethernet (IPATH) errors on */
|
||||
#define __IPATH_IPATHPD 0x0 /* Ethernet (IPATH) packet dump on */
|
||||
|
|
|
@ -277,13 +277,14 @@ static int ipath_diag_open(struct inode *in, struct file *fp)
|
|||
|
||||
bail:
|
||||
spin_unlock_irqrestore(&ipath_devs_lock, flags);
|
||||
mutex_unlock(&ipath_mutex);
|
||||
|
||||
/* Only expose a way to reset the device if we
|
||||
make it into diag mode. */
|
||||
if (ret == 0)
|
||||
ipath_expose_reset(&dd->pcidev->dev);
|
||||
|
||||
mutex_unlock(&ipath_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -418,9 +418,19 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
|
|||
|
||||
ret = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
|
||||
if (ret) {
|
||||
dev_info(&pdev->dev, "pci_set_dma_mask unit %u "
|
||||
"fails: %d\n", dd->ipath_unit, ret);
|
||||
goto bail_regions;
|
||||
/*
|
||||
* if the 64 bit setup fails, try 32 bit. Some systems
|
||||
* do not setup 64 bit maps on systems with 2GB or less
|
||||
* memory installed.
|
||||
*/
|
||||
ret = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
|
||||
if (ret) {
|
||||
dev_info(&pdev->dev, "pci_set_dma_mask unit %u "
|
||||
"fails: %d\n", dd->ipath_unit, ret);
|
||||
goto bail_regions;
|
||||
}
|
||||
else
|
||||
ipath_dbg("No 64bit DMA mask, used 32 bit mask\n");
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
@ -1949,7 +1959,7 @@ int ipath_reset_device(int unit)
|
|||
}
|
||||
|
||||
if (dd->ipath_pd)
|
||||
for (i = 1; i < dd->ipath_portcnt; i++) {
|
||||
for (i = 1; i < dd->ipath_cfgports; i++) {
|
||||
if (dd->ipath_pd[i] && dd->ipath_pd[i]->port_cnt) {
|
||||
ipath_dbg("unit %u port %d is in use "
|
||||
"(PID %u cmd %s), can't reset\n",
|
||||
|
|
|
@ -53,13 +53,19 @@ MODULE_PARM_DESC(cfgports, "Set max number of ports to use");
|
|||
|
||||
/*
|
||||
* Number of buffers reserved for driver (layered drivers and SMA
|
||||
* send). Reserved at end of buffer list.
|
||||
* send). Reserved at end of buffer list. Initialized based on
|
||||
* number of PIO buffers if not set via module interface.
|
||||
* The problem with this is that it's global, but we'll use different
|
||||
* numbers for different chip types. So the default value is not
|
||||
* very useful. I've redefined it for the 1.3 release so that it's
|
||||
* zero unless set by the user to something else, in which case we
|
||||
* try to respect it.
|
||||
*/
|
||||
static ushort ipath_kpiobufs = 32;
|
||||
static ushort ipath_kpiobufs;
|
||||
|
||||
static int ipath_set_kpiobufs(const char *val, struct kernel_param *kp);
|
||||
|
||||
module_param_call(kpiobufs, ipath_set_kpiobufs, param_get_uint,
|
||||
module_param_call(kpiobufs, ipath_set_kpiobufs, param_get_ushort,
|
||||
&ipath_kpiobufs, S_IWUSR | S_IRUGO);
|
||||
MODULE_PARM_DESC(kpiobufs, "Set number of PIO buffers for driver");
|
||||
|
||||
|
@ -531,8 +537,11 @@ static int init_housekeeping(struct ipath_devdata *dd,
|
|||
* Don't clear ipath_flags as 8bit mode was set before
|
||||
* entering this func. However, we do set the linkstate to
|
||||
* unknown, so we can watch for a transition.
|
||||
* PRESENT is set because we want register reads to work,
|
||||
* and the kernel infrastructure saw it in config space;
|
||||
* We clear it if we have failures.
|
||||
*/
|
||||
dd->ipath_flags |= IPATH_LINKUNK;
|
||||
dd->ipath_flags |= IPATH_LINKUNK | IPATH_PRESENT;
|
||||
dd->ipath_flags &= ~(IPATH_LINKACTIVE | IPATH_LINKARMED |
|
||||
IPATH_LINKDOWN | IPATH_LINKINIT);
|
||||
|
||||
|
@ -560,6 +569,7 @@ static int init_housekeeping(struct ipath_devdata *dd,
|
|||
|| (dd->ipath_uregbase & 0xffffffff) == 0xffffffff) {
|
||||
ipath_dev_err(dd, "Register read failures from chip, "
|
||||
"giving up initialization\n");
|
||||
dd->ipath_flags &= ~IPATH_PRESENT;
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
@ -682,16 +692,14 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
|
|||
*/
|
||||
dd->ipath_pioavregs = ALIGN(val, sizeof(u64) * BITS_PER_BYTE / 2)
|
||||
/ (sizeof(u64) * BITS_PER_BYTE / 2);
|
||||
if (!ipath_kpiobufs) /* have to have at least 1, for SMA */
|
||||
kpiobufs = ipath_kpiobufs = 1;
|
||||
else if ((dd->ipath_piobcnt2k + dd->ipath_piobcnt4k) <
|
||||
(dd->ipath_cfgports * IPATH_MIN_USER_PORT_BUFCNT)) {
|
||||
dev_info(&dd->pcidev->dev, "Too few PIO buffers (%u) "
|
||||
"for %u ports to have %u each!\n",
|
||||
dd->ipath_piobcnt2k + dd->ipath_piobcnt4k,
|
||||
dd->ipath_cfgports, IPATH_MIN_USER_PORT_BUFCNT);
|
||||
kpiobufs = 1; /* reserve just the minimum for SMA/ether */
|
||||
} else
|
||||
if (ipath_kpiobufs == 0) {
|
||||
/* not set by user, or set explictly to default */
|
||||
if ((dd->ipath_piobcnt2k + dd->ipath_piobcnt4k) > 128)
|
||||
kpiobufs = 32;
|
||||
else
|
||||
kpiobufs = 16;
|
||||
}
|
||||
else
|
||||
kpiobufs = ipath_kpiobufs;
|
||||
|
||||
if (kpiobufs >
|
||||
|
|
|
@ -665,14 +665,14 @@ static void handle_layer_pioavail(struct ipath_devdata *dd)
|
|||
|
||||
ret = __ipath_layer_intr(dd, IPATH_LAYER_INT_SEND_CONTINUE);
|
||||
if (ret > 0)
|
||||
goto clear;
|
||||
goto set;
|
||||
|
||||
ret = __ipath_verbs_piobufavail(dd);
|
||||
if (ret > 0)
|
||||
goto clear;
|
||||
goto set;
|
||||
|
||||
return;
|
||||
clear:
|
||||
set:
|
||||
set_bit(IPATH_S_PIOINTBUFAVAIL, &dd->ipath_sendctrl);
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
dd->ipath_sendctrl);
|
||||
|
@ -719,11 +719,24 @@ static void handle_rcv(struct ipath_devdata *dd, u32 istat)
|
|||
irqreturn_t ipath_intr(int irq, void *data, struct pt_regs *regs)
|
||||
{
|
||||
struct ipath_devdata *dd = data;
|
||||
u32 istat = ipath_read_kreg32(dd, dd->ipath_kregs->kr_intstatus);
|
||||
u32 istat;
|
||||
ipath_err_t estat = 0;
|
||||
static unsigned unexpected = 0;
|
||||
irqreturn_t ret;
|
||||
|
||||
if(!(dd->ipath_flags & IPATH_PRESENT)) {
|
||||
/* this is mostly so we don't try to touch the chip while
|
||||
* it is being reset */
|
||||
/*
|
||||
* This return value is perhaps odd, but we do not want the
|
||||
* interrupt core code to remove our interrupt handler
|
||||
* because we don't appear to be handling an interrupt
|
||||
* during a chip reset.
|
||||
*/
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
istat = ipath_read_kreg32(dd, dd->ipath_kregs->kr_intstatus);
|
||||
if (unlikely(!istat)) {
|
||||
ipath_stats.sps_nullintr++;
|
||||
ret = IRQ_NONE; /* not our interrupt, or already handled */
|
||||
|
|
|
@ -731,7 +731,7 @@ u64 ipath_read_kreg64_port(const struct ipath_devdata *, ipath_kreg,
|
|||
static inline u32 ipath_read_ureg32(const struct ipath_devdata *dd,
|
||||
ipath_ureg regno, int port)
|
||||
{
|
||||
if (!dd->ipath_kregbase)
|
||||
if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT))
|
||||
return 0;
|
||||
|
||||
return readl(regno + (u64 __iomem *)
|
||||
|
@ -762,7 +762,7 @@ static inline void ipath_write_ureg(const struct ipath_devdata *dd,
|
|||
static inline u32 ipath_read_kreg32(const struct ipath_devdata *dd,
|
||||
ipath_kreg regno)
|
||||
{
|
||||
if (!dd->ipath_kregbase)
|
||||
if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT))
|
||||
return -1;
|
||||
return readl((u32 __iomem *) & dd->ipath_kregbase[regno]);
|
||||
}
|
||||
|
@ -770,7 +770,7 @@ static inline u32 ipath_read_kreg32(const struct ipath_devdata *dd,
|
|||
static inline u64 ipath_read_kreg64(const struct ipath_devdata *dd,
|
||||
ipath_kreg regno)
|
||||
{
|
||||
if (!dd->ipath_kregbase)
|
||||
if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT))
|
||||
return -1;
|
||||
|
||||
return readq(&dd->ipath_kregbase[regno]);
|
||||
|
@ -786,7 +786,7 @@ static inline void ipath_write_kreg(const struct ipath_devdata *dd,
|
|||
static inline u64 ipath_read_creg(const struct ipath_devdata *dd,
|
||||
ipath_sreg regno)
|
||||
{
|
||||
if (!dd->ipath_kregbase)
|
||||
if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT))
|
||||
return 0;
|
||||
|
||||
return readq(regno + (u64 __iomem *)
|
||||
|
@ -797,7 +797,7 @@ static inline u64 ipath_read_creg(const struct ipath_devdata *dd,
|
|||
static inline u32 ipath_read_creg32(const struct ipath_devdata *dd,
|
||||
ipath_sreg regno)
|
||||
{
|
||||
if (!dd->ipath_kregbase)
|
||||
if (!dd->ipath_kregbase || !(dd->ipath_flags & IPATH_PRESENT))
|
||||
return 0;
|
||||
return readl(regno + (u64 __iomem *)
|
||||
(dd->ipath_cregbase +
|
||||
|
|
|
@ -46,13 +46,15 @@
|
|||
/* Acquire before ipath_devs_lock. */
|
||||
static DEFINE_MUTEX(ipath_layer_mutex);
|
||||
|
||||
static int ipath_verbs_registered;
|
||||
|
||||
u16 ipath_layer_rcv_opcode;
|
||||
|
||||
static int (*layer_intr)(void *, u32);
|
||||
static int (*layer_rcv)(void *, void *, struct sk_buff *);
|
||||
static int (*layer_rcv_lid)(void *, void *);
|
||||
static int (*verbs_piobufavail)(void *);
|
||||
static void (*verbs_rcv)(void *, void *, void *, u32);
|
||||
static int ipath_verbs_registered;
|
||||
|
||||
static void *(*layer_add_one)(int, struct ipath_devdata *);
|
||||
static void (*layer_remove_one)(void *);
|
||||
|
@ -586,6 +588,8 @@ void ipath_verbs_unregister(void)
|
|||
verbs_rcv = NULL;
|
||||
verbs_timer_cb = NULL;
|
||||
|
||||
ipath_verbs_registered = 0;
|
||||
|
||||
mutex_unlock(&ipath_layer_mutex);
|
||||
}
|
||||
|
||||
|
|
|
@ -972,6 +972,8 @@ static int ipath_setup_pe_reset(struct ipath_devdata *dd)
|
|||
/* Use ERROR so it shows up in logs, etc. */
|
||||
ipath_dev_err(dd, "Resetting PE-800 unit %u\n",
|
||||
dd->ipath_unit);
|
||||
/* keep chip from being accessed in a few places */
|
||||
dd->ipath_flags &= ~(IPATH_INITTED|IPATH_PRESENT);
|
||||
val = dd->ipath_control | INFINIPATH_C_RESET;
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_control, val);
|
||||
mb();
|
||||
|
@ -997,6 +999,8 @@ static int ipath_setup_pe_reset(struct ipath_devdata *dd)
|
|||
if ((r = pci_enable_device(dd->pcidev)))
|
||||
ipath_dev_err(dd, "pci_enable_device failed after "
|
||||
"reset: %d\n", r);
|
||||
/* whether it worked or not, mark as present, again */
|
||||
dd->ipath_flags |= IPATH_PRESENT;
|
||||
val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_revision);
|
||||
if (val == dd->ipath_revision) {
|
||||
ipath_cdbg(VERBOSE, "Got matching revision "
|
||||
|
|
|
@ -34,8 +34,9 @@
|
|||
#define _IPATH_REGISTERS_H
|
||||
|
||||
/*
|
||||
* This file should only be included by kernel source, and by the diags.
|
||||
* It defines the registers, and their contents, for the InfiniPath HT-400 chip
|
||||
* This file should only be included by kernel source, and by the diags. It
|
||||
* defines the registers, and their contents, for the InfiniPath HT-400
|
||||
* chip.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -156,8 +157,10 @@
|
|||
#define INFINIPATH_IBCC_FLOWCTRLWATERMARK_SHIFT 8
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_MASK 0x3ULL
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_DISABLE 1
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_POLL 2 /* cycle through TS1/TS2 till OK */
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3 /* wait for TS1, then go on */
|
||||
/* cycle through TS1/TS2 till OK */
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_POLL 2
|
||||
/* wait for TS1, then go on */
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3
|
||||
#define INFINIPATH_IBCC_LINKINITCMD_SHIFT 16
|
||||
#define INFINIPATH_IBCC_LINKCMD_MASK 0x3ULL
|
||||
#define INFINIPATH_IBCC_LINKCMD_INIT 1 /* move to 0x11 */
|
||||
|
@ -182,7 +185,8 @@
|
|||
#define INFINIPATH_IBCS_LINKSTATE_SHIFT 4
|
||||
#define INFINIPATH_IBCS_TXREADY 0x40000000
|
||||
#define INFINIPATH_IBCS_TXCREDITOK 0x80000000
|
||||
/* link training states (shift by INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) */
|
||||
/* link training states (shift by
|
||||
INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) */
|
||||
#define INFINIPATH_IBCS_LT_STATE_DISABLED 0x00
|
||||
#define INFINIPATH_IBCS_LT_STATE_LINKUP 0x01
|
||||
#define INFINIPATH_IBCS_LT_STATE_POLLACTIVE 0x02
|
||||
|
@ -267,10 +271,12 @@
|
|||
/* kr_serdesconfig0 bits */
|
||||
#define INFINIPATH_SERDC0_RESET_MASK 0xfULL /* overal reset bits */
|
||||
#define INFINIPATH_SERDC0_RESET_PLL 0x10000000ULL /* pll reset */
|
||||
#define INFINIPATH_SERDC0_TXIDLE 0xF000ULL /* tx idle enables (per lane) */
|
||||
#define INFINIPATH_SERDC0_RXDETECT_EN 0xF0000ULL /* rx detect enables (per lane) */
|
||||
#define INFINIPATH_SERDC0_L1PWR_DN 0xF0ULL /* L1 Power down; use with RXDETECT,
|
||||
Otherwise not used on IB side */
|
||||
/* tx idle enables (per lane) */
|
||||
#define INFINIPATH_SERDC0_TXIDLE 0xF000ULL
|
||||
/* rx detect enables (per lane) */
|
||||
#define INFINIPATH_SERDC0_RXDETECT_EN 0xF0000ULL
|
||||
/* L1 Power down; use with RXDETECT, Otherwise not used on IB side */
|
||||
#define INFINIPATH_SERDC0_L1PWR_DN 0xF0ULL
|
||||
|
||||
/* kr_xgxsconfig bits */
|
||||
#define INFINIPATH_XGXS_RESET 0x7ULL
|
||||
|
@ -390,12 +396,13 @@ struct ipath_kregs {
|
|||
ipath_kreg kr_txintmemsize;
|
||||
ipath_kreg kr_xgxsconfig;
|
||||
ipath_kreg kr_ibpllcfg;
|
||||
/* use these two (and the following N ports) only with ipath_k*_kreg64_port();
|
||||
* not *kreg64() */
|
||||
/* use these two (and the following N ports) only with
|
||||
* ipath_k*_kreg64_port(); not *kreg64() */
|
||||
ipath_kreg kr_rcvhdraddr;
|
||||
ipath_kreg kr_rcvhdrtailaddr;
|
||||
|
||||
/* remaining registers are not present on all types of infinipath chips */
|
||||
/* remaining registers are not present on all types of infinipath
|
||||
chips */
|
||||
ipath_kreg kr_rcvpktledcnt;
|
||||
ipath_kreg kr_pcierbuftestreg0;
|
||||
ipath_kreg kr_pcierbuftestreg1;
|
||||
|
|
|
@ -531,19 +531,12 @@ int ipath_post_rc_send(struct ipath_qp *qp, struct ib_send_wr *wr)
|
|||
}
|
||||
wqe->wr.num_sge = j;
|
||||
qp->s_head = next;
|
||||
/*
|
||||
* Wake up the send tasklet if the QP is not waiting
|
||||
* for an RNR timeout.
|
||||
*/
|
||||
next = qp->s_rnr_timeout;
|
||||
spin_unlock_irqrestore(&qp->s_lock, flags);
|
||||
|
||||
if (next == 0) {
|
||||
if (qp->ibqp.qp_type == IB_QPT_UC)
|
||||
ipath_do_uc_send((unsigned long) qp);
|
||||
else
|
||||
ipath_do_rc_send((unsigned long) qp);
|
||||
}
|
||||
if (qp->ibqp.qp_type == IB_QPT_UC)
|
||||
ipath_do_uc_send((unsigned long) qp);
|
||||
else
|
||||
ipath_do_rc_send((unsigned long) qp);
|
||||
|
||||
ret = 0;
|
||||
|
||||
|
|
|
@ -711,10 +711,22 @@ static struct attribute_group dev_attr_group = {
|
|||
* enters diag mode. A device reset is quite likely to crash the
|
||||
* machine entirely, so we don't want to normally make it
|
||||
* available.
|
||||
*
|
||||
* Called with ipath_mutex held.
|
||||
*/
|
||||
int ipath_expose_reset(struct device *dev)
|
||||
{
|
||||
return device_create_file(dev, &dev_attr_reset);
|
||||
static int exposed;
|
||||
int ret;
|
||||
|
||||
if (!exposed) {
|
||||
ret = device_create_file(dev, &dev_attr_reset);
|
||||
exposed = 1;
|
||||
}
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ipath_driver_create_group(struct device_driver *drv)
|
||||
|
|
|
@ -46,8 +46,10 @@
|
|||
* This is called from ipath_post_ud_send() to forward a WQE addressed
|
||||
* to the same HCA.
|
||||
*/
|
||||
static void ipath_ud_loopback(struct ipath_qp *sqp, struct ipath_sge_state *ss,
|
||||
u32 length, struct ib_send_wr *wr, struct ib_wc *wc)
|
||||
static void ipath_ud_loopback(struct ipath_qp *sqp,
|
||||
struct ipath_sge_state *ss,
|
||||
u32 length, struct ib_send_wr *wr,
|
||||
struct ib_wc *wc)
|
||||
{
|
||||
struct ipath_ibdev *dev = to_idev(sqp->ibqp.device);
|
||||
struct ipath_qp *qp;
|
||||
|
|
|
@ -449,7 +449,6 @@ static void ipath_ib_timer(void *arg)
|
|||
{
|
||||
struct ipath_ibdev *dev = (struct ipath_ibdev *) arg;
|
||||
struct ipath_qp *resend = NULL;
|
||||
struct ipath_qp *rnr = NULL;
|
||||
struct list_head *last;
|
||||
struct ipath_qp *qp;
|
||||
unsigned long flags;
|
||||
|
@ -465,32 +464,18 @@ static void ipath_ib_timer(void *arg)
|
|||
last = &dev->pending[dev->pending_index];
|
||||
while (!list_empty(last)) {
|
||||
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
||||
if (last->next == LIST_POISON1 ||
|
||||
last->next != &qp->timerwait ||
|
||||
qp->timerwait.prev != last) {
|
||||
INIT_LIST_HEAD(last);
|
||||
} else {
|
||||
list_del(&qp->timerwait);
|
||||
qp->timerwait.prev = (struct list_head *) resend;
|
||||
resend = qp;
|
||||
atomic_inc(&qp->refcount);
|
||||
}
|
||||
list_del(&qp->timerwait);
|
||||
qp->timer_next = resend;
|
||||
resend = qp;
|
||||
atomic_inc(&qp->refcount);
|
||||
}
|
||||
last = &dev->rnrwait;
|
||||
if (!list_empty(last)) {
|
||||
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
||||
if (--qp->s_rnr_timeout == 0) {
|
||||
do {
|
||||
if (last->next == LIST_POISON1 ||
|
||||
last->next != &qp->timerwait ||
|
||||
qp->timerwait.prev != last) {
|
||||
INIT_LIST_HEAD(last);
|
||||
break;
|
||||
}
|
||||
list_del(&qp->timerwait);
|
||||
qp->timerwait.prev =
|
||||
(struct list_head *) rnr;
|
||||
rnr = qp;
|
||||
tasklet_hi_schedule(&qp->s_task);
|
||||
if (list_empty(last))
|
||||
break;
|
||||
qp = list_entry(last->next, struct ipath_qp,
|
||||
|
@ -530,8 +515,7 @@ static void ipath_ib_timer(void *arg)
|
|||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||
|
||||
/* XXX What if timer fires again while this is running? */
|
||||
for (qp = resend; qp != NULL;
|
||||
qp = (struct ipath_qp *) qp->timerwait.prev) {
|
||||
for (qp = resend; qp != NULL; qp = qp->timer_next) {
|
||||
struct ib_wc wc;
|
||||
|
||||
spin_lock_irqsave(&qp->s_lock, flags);
|
||||
|
@ -545,9 +529,6 @@ static void ipath_ib_timer(void *arg)
|
|||
if (atomic_dec_and_test(&qp->refcount))
|
||||
wake_up(&qp->wait);
|
||||
}
|
||||
for (qp = rnr; qp != NULL;
|
||||
qp = (struct ipath_qp *) qp->timerwait.prev)
|
||||
tasklet_hi_schedule(&qp->s_task);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -556,9 +537,9 @@ static void ipath_ib_timer(void *arg)
|
|||
*
|
||||
* This is called from ipath_intr() at interrupt level when a PIO buffer is
|
||||
* available after ipath_verbs_send() returned an error that no buffers were
|
||||
* available. Return 0 if we consumed all the PIO buffers and we still have
|
||||
* available. Return 1 if we consumed all the PIO buffers and we still have
|
||||
* QPs waiting for buffers (for now, just do a tasklet_hi_schedule and
|
||||
* return one).
|
||||
* return zero).
|
||||
*/
|
||||
static int ipath_ib_piobufavail(void *arg)
|
||||
{
|
||||
|
@ -579,7 +560,7 @@ static int ipath_ib_piobufavail(void *arg)
|
|||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||
|
||||
bail:
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ipath_query_device(struct ib_device *ibdev,
|
||||
|
@ -1159,7 +1140,7 @@ static ssize_t show_stats(struct class_device *cdev, char *buf)
|
|||
|
||||
len = sprintf(buf,
|
||||
"RC resends %d\n"
|
||||
"RC QACKs %d\n"
|
||||
"RC no QACK %d\n"
|
||||
"RC ACKs %d\n"
|
||||
"RC SEQ NAKs %d\n"
|
||||
"RC RDMA seq %d\n"
|
||||
|
|
|
@ -282,7 +282,8 @@ struct ipath_srq {
|
|||
*/
|
||||
struct ipath_qp {
|
||||
struct ib_qp ibqp;
|
||||
struct ipath_qp *next; /* link list for QPN hash table */
|
||||
struct ipath_qp *next; /* link list for QPN hash table */
|
||||
struct ipath_qp *timer_next; /* link list for ipath_ib_timer() */
|
||||
struct list_head piowait; /* link for wait PIO buf */
|
||||
struct list_head timerwait; /* link for waiting for timeouts */
|
||||
struct ib_ah_attr remote_ah_attr;
|
||||
|
|
|
@ -95,7 +95,7 @@ struct ether_header {
|
|||
__u8 seq_num;
|
||||
__le32 len;
|
||||
/* MUST be of word size due to PIO write requirements */
|
||||
__u32 csum;
|
||||
__le32 csum;
|
||||
__le16 csum_offset;
|
||||
__le16 flags;
|
||||
__u16 first_2_bytes;
|
||||
|
|
|
@ -306,7 +306,7 @@ static int mthca_query_gid(struct ib_device *ibdev, u8 port,
|
|||
goto out;
|
||||
}
|
||||
|
||||
memcpy(gid->raw + 8, out_mad->data + (index % 8) * 16, 8);
|
||||
memcpy(gid->raw + 8, out_mad->data + (index % 8) * 8, 8);
|
||||
|
||||
out:
|
||||
kfree(in_mad);
|
||||
|
|
|
@ -403,6 +403,27 @@ static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
|
|||
case EVIOCGID:
|
||||
if (copy_to_user(p, &dev->id, sizeof(struct input_id)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
|
||||
case EVIOCGREP:
|
||||
if (!test_bit(EV_REP, dev->evbit))
|
||||
return -ENOSYS;
|
||||
if (put_user(dev->rep[REP_DELAY], ip))
|
||||
return -EFAULT;
|
||||
if (put_user(dev->rep[REP_PERIOD], ip + 1))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
|
||||
case EVIOCSREP:
|
||||
if (!test_bit(EV_REP, dev->evbit))
|
||||
return -ENOSYS;
|
||||
if (get_user(u, ip))
|
||||
return -EFAULT;
|
||||
if (get_user(v, ip + 1))
|
||||
return -EFAULT;
|
||||
|
||||
input_event(dev, EV_REP, REP_DELAY, u);
|
||||
input_event(dev, EV_REP, REP_PERIOD, v);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -155,6 +155,9 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
|
|||
if (code > SND_MAX || !test_bit(code, dev->sndbit))
|
||||
return;
|
||||
|
||||
if (!!test_bit(code, dev->snd) != !!value)
|
||||
change_bit(code, dev->snd);
|
||||
|
||||
if (dev->event) dev->event(dev, type, code, value);
|
||||
|
||||
break;
|
||||
|
@ -286,19 +289,19 @@ static struct input_device_id *input_match_device(struct input_device_id *id, st
|
|||
for (; id->flags || id->driver_info; id++) {
|
||||
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_BUS)
|
||||
if (id->id.bustype != dev->id.bustype)
|
||||
if (id->bustype != dev->id.bustype)
|
||||
continue;
|
||||
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_VENDOR)
|
||||
if (id->id.vendor != dev->id.vendor)
|
||||
if (id->vendor != dev->id.vendor)
|
||||
continue;
|
||||
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_PRODUCT)
|
||||
if (id->id.product != dev->id.product)
|
||||
if (id->product != dev->id.product)
|
||||
continue;
|
||||
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_VERSION)
|
||||
if (id->id.version != dev->id.version)
|
||||
if (id->version != dev->id.version)
|
||||
continue;
|
||||
|
||||
MATCH_BIT(evbit, EV_MAX);
|
||||
|
|
|
@ -53,8 +53,8 @@ static unsigned char spitzkbd_keycode[NR_SCANCODES] = {
|
|||
KEY_LEFTCTRL, KEY_1, KEY_3, KEY_5, KEY_6, KEY_7, KEY_9, KEY_0, KEY_BACKSPACE, SPITZ_KEY_EXOK, SPITZ_KEY_EXCANCEL, 0, 0, 0, 0, 0, /* 1-16 */
|
||||
0, KEY_2, KEY_4, KEY_R, KEY_Y, KEY_8, KEY_I, KEY_O, KEY_P, SPITZ_KEY_EXJOGDOWN, SPITZ_KEY_EXJOGUP, 0, 0, 0, 0, 0, /* 17-32 */
|
||||
KEY_TAB, KEY_Q, KEY_E, KEY_T, KEY_G, KEY_U, KEY_J, KEY_K, 0, 0, 0, 0, 0, 0, 0, 0, /* 33-48 */
|
||||
SPITZ_KEY_CALENDER, KEY_W, KEY_S, KEY_F, KEY_V, KEY_H, KEY_M, KEY_L, 0, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, 0, /* 49-64 */
|
||||
SPITZ_KEY_ADDRESS, KEY_A, KEY_D, KEY_C, KEY_B, KEY_N, KEY_DOT, 0, KEY_ENTER, KEY_LEFTSHIFT, 0, 0, 0, 0, 0, 0, /* 65-80 */
|
||||
SPITZ_KEY_ADDRESS, KEY_W, KEY_S, KEY_F, KEY_V, KEY_H, KEY_M, KEY_L, 0, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, 0, /* 49-64 */
|
||||
SPITZ_KEY_CALENDER, KEY_A, KEY_D, KEY_C, KEY_B, KEY_N, KEY_DOT, 0, KEY_ENTER, KEY_LEFTSHIFT, 0, 0, 0, 0, 0, 0, /* 65-80 */
|
||||
SPITZ_KEY_MAIL, KEY_Z, KEY_X, KEY_MINUS, KEY_SPACE, KEY_COMMA, 0, KEY_UP, 0, 0, SPITZ_KEY_FN, 0, 0, 0, 0, 0, /* 81-96 */
|
||||
KEY_SYSRQ, SPITZ_KEY_JAP1, SPITZ_KEY_JAP2, SPITZ_KEY_CANCEL, SPITZ_KEY_OK, SPITZ_KEY_MENU, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, 0, 0, 0 /* 97-112 */
|
||||
};
|
||||
|
|
|
@ -273,6 +273,18 @@ static struct key_entry keymap_fs_amilo_pro_v2000[] = {
|
|||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_fujitsu_n3510[] = {
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
{ KE_KEY, 0x36, KEY_WWW },
|
||||
{ KE_KEY, 0x31, KEY_MAIL },
|
||||
{ KE_KEY, 0x71, KEY_STOPCD },
|
||||
{ KE_KEY, 0x72, KEY_PLAYPAUSE },
|
||||
{ KE_KEY, 0x74, KEY_REWIND },
|
||||
{ KE_KEY, 0x78, KEY_FORWARD },
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_wistron_ms2141[] = {
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
|
@ -321,6 +333,24 @@ static struct dmi_system_id dmi_ids[] = {
|
|||
},
|
||||
.driver_data = keymap_fs_amilo_pro_v2000
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "Fujitsu-Siemens Amilo M7400",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "),
|
||||
},
|
||||
.driver_data = keymap_fs_amilo_pro_v2000
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "Fujitsu N3510",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "N3510"),
|
||||
},
|
||||
.driver_data = keymap_fujitsu_n3510
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "Acer Aspire 1500",
|
||||
|
|
|
@ -302,8 +302,10 @@ static irqreturn_t psmouse_interrupt(struct serio *serio,
|
|||
* Check if this is a new device announcement (0xAA 0x00)
|
||||
*/
|
||||
if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) {
|
||||
if (psmouse->pktcnt == 1)
|
||||
if (psmouse->pktcnt == 1) {
|
||||
psmouse->last = jiffies;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (psmouse->packet[1] == PSMOUSE_RET_ID) {
|
||||
__psmouse_set_state(psmouse, PSMOUSE_IGNORE);
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
* ADS7846 based touchscreen and sensor driver
|
||||
*
|
||||
* Copyright (c) 2005 David Brownell
|
||||
* Copyright (c) 2006 Nokia Corporation
|
||||
* Various changes: Imre Deak <imre.deak@nokia.com>
|
||||
*
|
||||
* Using code from:
|
||||
* - corgi_ts.c
|
||||
|
@ -34,17 +36,25 @@
|
|||
|
||||
|
||||
/*
|
||||
* This code has been lightly tested on an ads7846.
|
||||
* This code has been tested on an ads7846 / N770 device.
|
||||
* Support for ads7843 and ads7845 has only been stubbed in.
|
||||
*
|
||||
* Not yet done: investigate the values reported. Are x/y/pressure
|
||||
* event values sane enough for X11? How accurate are the temperature
|
||||
* and voltage readings? (System-specific calibration should support
|
||||
* Not yet done: How accurate are the temperature and voltage
|
||||
* readings? (System-specific calibration should support
|
||||
* accuracy of 0.3 degrees C; otherwise it's 2.0 degrees.)
|
||||
*
|
||||
* IRQ handling needs a workaround because of a shortcoming in handling
|
||||
* edge triggered IRQs on some platforms like the OMAP1/2. These
|
||||
* platforms don't handle the ARM lazy IRQ disabling properly, thus we
|
||||
* have to maintain our own SW IRQ disabled status. This should be
|
||||
* removed as soon as the affected platform's IRQ handling is fixed.
|
||||
*
|
||||
* app note sbaa036 talks in more detail about accurate sampling...
|
||||
* that ought to help in situations like LCDs inducing noise (which
|
||||
* can also be helped by using synch signals) and more generally.
|
||||
* This driver tries to utilize the measures described in the app
|
||||
* note. The strength of filtering can be set in the board-* specific
|
||||
* files.
|
||||
*/
|
||||
|
||||
#define TS_POLL_PERIOD msecs_to_jiffies(10)
|
||||
|
@ -61,6 +71,7 @@ struct ts_event {
|
|||
__be16 x;
|
||||
__be16 y;
|
||||
__be16 z1, z2;
|
||||
int ignore;
|
||||
};
|
||||
|
||||
struct ads7846 {
|
||||
|
@ -71,12 +82,23 @@ struct ads7846 {
|
|||
u16 model;
|
||||
u16 vref_delay_usecs;
|
||||
u16 x_plate_ohms;
|
||||
u16 pressure_max;
|
||||
|
||||
u8 read_x, read_y, read_z1, read_z2;
|
||||
u8 read_x, read_y, read_z1, read_z2, pwrdown;
|
||||
u16 dummy; /* for the pwrdown read */
|
||||
struct ts_event tc;
|
||||
|
||||
struct spi_transfer xfer[8];
|
||||
struct spi_message msg;
|
||||
struct spi_transfer xfer[10];
|
||||
struct spi_message msg[5];
|
||||
struct spi_message *last_msg;
|
||||
int msg_idx;
|
||||
int read_cnt;
|
||||
int read_rep;
|
||||
int last_read;
|
||||
|
||||
u16 debounce_max;
|
||||
u16 debounce_tol;
|
||||
u16 debounce_rep;
|
||||
|
||||
spinlock_t lock;
|
||||
struct timer_list timer; /* P: lock */
|
||||
|
@ -84,6 +106,9 @@ struct ads7846 {
|
|||
unsigned pending:1; /* P: lock */
|
||||
// FIXME remove "irq_disabled"
|
||||
unsigned irq_disabled:1; /* P: lock */
|
||||
unsigned disabled:1;
|
||||
|
||||
int (*get_pendown_state)(void);
|
||||
};
|
||||
|
||||
/* leave chip selected when we're done, for quicker re-select? */
|
||||
|
@ -125,7 +150,9 @@ struct ads7846 {
|
|||
#define READ_Y (READ_12BIT_DFR(y) | ADS_PD10_ADC_ON)
|
||||
#define READ_Z1 (READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON)
|
||||
#define READ_Z2 (READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON)
|
||||
#define READ_X (READ_12BIT_DFR(x) | ADS_PD10_PDOWN) /* LAST */
|
||||
|
||||
#define READ_X (READ_12BIT_DFR(x) | ADS_PD10_ADC_ON)
|
||||
#define PWRDOWN (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) /* LAST */
|
||||
|
||||
/* single-ended samples need to first power up reference voltage;
|
||||
* we leave both ADC and VREF powered
|
||||
|
@ -152,6 +179,15 @@ struct ser_req {
|
|||
struct spi_transfer xfer[6];
|
||||
};
|
||||
|
||||
static void ads7846_enable(struct ads7846 *ts);
|
||||
static void ads7846_disable(struct ads7846 *ts);
|
||||
|
||||
static int device_suspended(struct device *dev)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(dev);
|
||||
return dev->power.power_state.event != PM_EVENT_ON || ts->disabled;
|
||||
}
|
||||
|
||||
static int ads7846_read12_ser(struct device *dev, unsigned command)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
|
@ -164,7 +200,7 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
|
|||
if (!req)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&req->msg.transfers);
|
||||
spi_message_init(&req->msg);
|
||||
|
||||
/* activate reference, so it has time to settle; */
|
||||
req->ref_on = REF_ON;
|
||||
|
@ -204,8 +240,10 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
|
|||
for (i = 0; i < 6; i++)
|
||||
spi_message_add_tail(&req->xfer[i], &req->msg);
|
||||
|
||||
ts->irq_disabled = 1;
|
||||
disable_irq(spi->irq);
|
||||
status = spi_sync(spi, &req->msg);
|
||||
ts->irq_disabled = 0;
|
||||
enable_irq(spi->irq);
|
||||
|
||||
if (req->msg.status)
|
||||
|
@ -233,6 +271,52 @@ SHOW(temp1)
|
|||
SHOW(vaux)
|
||||
SHOW(vbatt)
|
||||
|
||||
static int is_pen_down(struct device *dev)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(dev);
|
||||
|
||||
return ts->pendown;
|
||||
}
|
||||
|
||||
static ssize_t ads7846_pen_down_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", is_pen_down(dev));
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pen_down, S_IRUGO, ads7846_pen_down_show, NULL);
|
||||
|
||||
static ssize_t ads7846_disable_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%u\n", ts->disabled);
|
||||
}
|
||||
|
||||
static ssize_t ads7846_disable_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(dev);
|
||||
char *endp;
|
||||
int i;
|
||||
|
||||
i = simple_strtoul(buf, &endp, 10);
|
||||
spin_lock_irq(&ts->lock);
|
||||
|
||||
if (i)
|
||||
ads7846_disable(ts);
|
||||
else
|
||||
ads7846_enable(ts);
|
||||
|
||||
spin_unlock_irq(&ts->lock);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store);
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
|
@ -264,7 +348,7 @@ static void ads7846_rx(void *ads)
|
|||
if (x == MAX_12BIT)
|
||||
x = 0;
|
||||
|
||||
if (x && z1 && ts->spi->dev.power.power_state.event == PM_EVENT_ON) {
|
||||
if (likely(x && z1 && !device_suspended(&ts->spi->dev))) {
|
||||
/* compute touch pressure resistance using equation #2 */
|
||||
Rt = z2;
|
||||
Rt -= z1;
|
||||
|
@ -275,6 +359,14 @@ static void ads7846_rx(void *ads)
|
|||
} else
|
||||
Rt = 0;
|
||||
|
||||
/* Sample found inconsistent by debouncing or pressure is beyond
|
||||
* the maximum. Don't report it to user space, repeat at least
|
||||
* once more the measurement */
|
||||
if (ts->tc.ignore || Rt > ts->pressure_max) {
|
||||
mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
|
||||
return;
|
||||
}
|
||||
|
||||
/* NOTE: "pendown" is inferred from pressure; we don't rely on
|
||||
* being able to check nPENIRQ status, or "friendly" trigger modes
|
||||
* (both-edges is much better than just-falling or low-level).
|
||||
|
@ -296,11 +388,13 @@ static void ads7846_rx(void *ads)
|
|||
if (Rt) {
|
||||
input_report_abs(input_dev, ABS_X, x);
|
||||
input_report_abs(input_dev, ABS_Y, y);
|
||||
input_report_abs(input_dev, ABS_PRESSURE, Rt);
|
||||
sync = 1;
|
||||
}
|
||||
if (sync)
|
||||
|
||||
if (sync) {
|
||||
input_report_abs(input_dev, ABS_PRESSURE, Rt);
|
||||
input_sync(input_dev);
|
||||
}
|
||||
|
||||
#ifdef VERBOSE
|
||||
if (Rt || ts->pendown)
|
||||
|
@ -308,80 +402,138 @@ static void ads7846_rx(void *ads)
|
|||
x, y, Rt, Rt ? "" : " UP");
|
||||
#endif
|
||||
|
||||
/* don't retrigger while we're suspended */
|
||||
spin_lock_irqsave(&ts->lock, flags);
|
||||
|
||||
ts->pendown = (Rt != 0);
|
||||
ts->pending = 0;
|
||||
|
||||
if (ts->spi->dev.power.power_state.event == PM_EVENT_ON) {
|
||||
if (ts->pendown)
|
||||
mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
|
||||
else if (ts->irq_disabled) {
|
||||
ts->irq_disabled = 0;
|
||||
enable_irq(ts->spi->irq);
|
||||
}
|
||||
}
|
||||
mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
|
||||
|
||||
spin_unlock_irqrestore(&ts->lock, flags);
|
||||
}
|
||||
|
||||
static void ads7846_debounce(void *ads)
|
||||
{
|
||||
struct ads7846 *ts = ads;
|
||||
struct spi_message *m;
|
||||
struct spi_transfer *t;
|
||||
int val;
|
||||
int status;
|
||||
|
||||
m = &ts->msg[ts->msg_idx];
|
||||
t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
|
||||
val = (*(u16 *)t->rx_buf) >> 3;
|
||||
if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) {
|
||||
/* Repeat it, if this was the first read or the read
|
||||
* wasn't consistent enough. */
|
||||
if (ts->read_cnt < ts->debounce_max) {
|
||||
ts->last_read = val;
|
||||
ts->read_cnt++;
|
||||
} else {
|
||||
/* Maximum number of debouncing reached and still
|
||||
* not enough number of consistent readings. Abort
|
||||
* the whole sample, repeat it in the next sampling
|
||||
* period.
|
||||
*/
|
||||
ts->tc.ignore = 1;
|
||||
ts->read_cnt = 0;
|
||||
/* Last message will contain ads7846_rx() as the
|
||||
* completion function.
|
||||
*/
|
||||
m = ts->last_msg;
|
||||
}
|
||||
/* Start over collecting consistent readings. */
|
||||
ts->read_rep = 0;
|
||||
} else {
|
||||
if (++ts->read_rep > ts->debounce_rep) {
|
||||
/* Got a good reading for this coordinate,
|
||||
* go for the next one. */
|
||||
ts->tc.ignore = 0;
|
||||
ts->msg_idx++;
|
||||
ts->read_cnt = 0;
|
||||
ts->read_rep = 0;
|
||||
m++;
|
||||
} else
|
||||
/* Read more values that are consistent. */
|
||||
ts->read_cnt++;
|
||||
}
|
||||
status = spi_async(ts->spi, m);
|
||||
if (status)
|
||||
dev_err(&ts->spi->dev, "spi_async --> %d\n",
|
||||
status);
|
||||
}
|
||||
|
||||
static void ads7846_timer(unsigned long handle)
|
||||
{
|
||||
struct ads7846 *ts = (void *)handle;
|
||||
int status = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ts->lock, flags);
|
||||
if (!ts->pending) {
|
||||
ts->pending = 1;
|
||||
if (!ts->irq_disabled) {
|
||||
ts->irq_disabled = 1;
|
||||
disable_irq(ts->spi->irq);
|
||||
spin_lock_irq(&ts->lock);
|
||||
|
||||
if (unlikely(ts->msg_idx && !ts->pendown)) {
|
||||
/* measurment cycle ended */
|
||||
if (!device_suspended(&ts->spi->dev)) {
|
||||
ts->irq_disabled = 0;
|
||||
enable_irq(ts->spi->irq);
|
||||
}
|
||||
status = spi_async(ts->spi, &ts->msg);
|
||||
ts->pending = 0;
|
||||
ts->msg_idx = 0;
|
||||
} else {
|
||||
/* pen is still down, continue with the measurement */
|
||||
ts->msg_idx = 0;
|
||||
status = spi_async(ts->spi, &ts->msg[0]);
|
||||
if (status)
|
||||
dev_err(&ts->spi->dev, "spi_async --> %d\n",
|
||||
status);
|
||||
dev_err(&ts->spi->dev, "spi_async --> %d\n", status);
|
||||
}
|
||||
spin_unlock_irqrestore(&ts->lock, flags);
|
||||
|
||||
spin_unlock_irq(&ts->lock);
|
||||
}
|
||||
|
||||
static irqreturn_t ads7846_irq(int irq, void *handle, struct pt_regs *regs)
|
||||
{
|
||||
ads7846_timer((unsigned long) handle);
|
||||
struct ads7846 *ts = handle;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ts->lock, flags);
|
||||
if (likely(ts->get_pendown_state())) {
|
||||
if (!ts->irq_disabled) {
|
||||
/* REVISIT irq logic for many ARM chips has cloned a
|
||||
* bug wherein disabling an irq in its handler won't
|
||||
* work;(it's disabled lazily, and too late to work.
|
||||
* until all their irq logic is fixed, we must shadow
|
||||
* that state here.
|
||||
*/
|
||||
ts->irq_disabled = 1;
|
||||
disable_irq(ts->spi->irq);
|
||||
ts->pending = 1;
|
||||
mod_timer(&ts->timer, jiffies);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ts->lock, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
static int
|
||||
ads7846_suspend(struct spi_device *spi, pm_message_t message)
|
||||
/* Must be called with ts->lock held */
|
||||
static void ads7846_disable(struct ads7846 *ts)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(&spi->dev);
|
||||
unsigned long flags;
|
||||
if (ts->disabled)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&ts->lock, flags);
|
||||
|
||||
spi->dev.power.power_state = message;
|
||||
ts->disabled = 1;
|
||||
|
||||
/* are we waiting for IRQ, or polling? */
|
||||
if (!ts->pendown) {
|
||||
if (!ts->irq_disabled) {
|
||||
ts->irq_disabled = 1;
|
||||
disable_irq(ts->spi->irq);
|
||||
}
|
||||
if (!ts->pending) {
|
||||
ts->irq_disabled = 1;
|
||||
disable_irq(ts->spi->irq);
|
||||
} else {
|
||||
/* polling; force a final SPI completion;
|
||||
* that will clean things up neatly
|
||||
/* the timer will run at least once more, and
|
||||
* leave everything in a clean state, IRQ disabled
|
||||
*/
|
||||
if (!ts->pending)
|
||||
mod_timer(&ts->timer, jiffies);
|
||||
|
||||
while (ts->pendown || ts->pending) {
|
||||
spin_unlock_irqrestore(&ts->lock, flags);
|
||||
udelay(10);
|
||||
spin_lock_irqsave(&ts->lock, flags);
|
||||
while (ts->pending) {
|
||||
spin_unlock_irq(&ts->lock);
|
||||
msleep(1);
|
||||
spin_lock_irq(&ts->lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -389,17 +541,45 @@ ads7846_suspend(struct spi_device *spi, pm_message_t message)
|
|||
* leave it that way after every request
|
||||
*/
|
||||
|
||||
spin_unlock_irqrestore(&ts->lock, flags);
|
||||
}
|
||||
|
||||
/* Must be called with ts->lock held */
|
||||
static void ads7846_enable(struct ads7846 *ts)
|
||||
{
|
||||
if (!ts->disabled)
|
||||
return;
|
||||
|
||||
ts->disabled = 0;
|
||||
ts->irq_disabled = 0;
|
||||
enable_irq(ts->spi->irq);
|
||||
}
|
||||
|
||||
static int ads7846_suspend(struct spi_device *spi, pm_message_t message)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(&spi->dev);
|
||||
|
||||
spin_lock_irq(&ts->lock);
|
||||
|
||||
spi->dev.power.power_state = message;
|
||||
ads7846_disable(ts);
|
||||
|
||||
spin_unlock_irq(&ts->lock);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ads7846_resume(struct spi_device *spi)
|
||||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(&spi->dev);
|
||||
|
||||
ts->irq_disabled = 0;
|
||||
enable_irq(ts->spi->irq);
|
||||
spin_lock_irq(&ts->lock);
|
||||
|
||||
spi->dev.power.power_state = PMSG_ON;
|
||||
ads7846_enable(ts);
|
||||
|
||||
spin_unlock_irq(&ts->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -408,6 +588,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
struct ads7846 *ts;
|
||||
struct input_dev *input_dev;
|
||||
struct ads7846_platform_data *pdata = spi->dev.platform_data;
|
||||
struct spi_message *m;
|
||||
struct spi_transfer *x;
|
||||
int err;
|
||||
|
||||
|
@ -428,6 +609,11 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (pdata->get_pendown_state == NULL) {
|
||||
dev_dbg(&spi->dev, "no get_pendown_state function?\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* We'd set the wordsize to 12 bits ... except that some controllers
|
||||
* will then treat the 8 bit command words as 12 bits (and drop the
|
||||
* four MSBs of the 12 bit result). Result: inputs must be shifted
|
||||
|
@ -451,9 +637,21 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
ts->timer.data = (unsigned long) ts;
|
||||
ts->timer.function = ads7846_timer;
|
||||
|
||||
spin_lock_init(&ts->lock);
|
||||
|
||||
ts->model = pdata->model ? : 7846;
|
||||
ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;
|
||||
ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
|
||||
ts->pressure_max = pdata->pressure_max ? : ~0;
|
||||
if (pdata->debounce_max) {
|
||||
ts->debounce_max = pdata->debounce_max;
|
||||
ts->debounce_tol = pdata->debounce_tol;
|
||||
ts->debounce_rep = pdata->debounce_rep;
|
||||
if (ts->debounce_rep > ts->debounce_max + 1)
|
||||
ts->debounce_rep = ts->debounce_max - 1;
|
||||
} else
|
||||
ts->debounce_tol = ~0;
|
||||
ts->get_pendown_state = pdata->get_pendown_state;
|
||||
|
||||
snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id);
|
||||
|
||||
|
@ -477,60 +675,100 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
/* set up the transfers to read touchscreen state; this assumes we
|
||||
* use formula #2 for pressure, not #3.
|
||||
*/
|
||||
INIT_LIST_HEAD(&ts->msg.transfers);
|
||||
m = &ts->msg[0];
|
||||
x = ts->xfer;
|
||||
|
||||
spi_message_init(m);
|
||||
|
||||
/* y- still on; turn on only y+ (and ADC) */
|
||||
ts->read_y = READ_Y;
|
||||
x->tx_buf = &ts->read_y;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->tc.y;
|
||||
x->len = 2;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
/* turn y+ off, x- on; we'll use formula #2 */
|
||||
if (ts->model == 7846) {
|
||||
x++;
|
||||
ts->read_z1 = READ_Z1;
|
||||
x->tx_buf = &ts->read_z1;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
m->complete = ads7846_debounce;
|
||||
m->context = ts;
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->tc.z1;
|
||||
x->len = 2;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
|
||||
x++;
|
||||
ts->read_z2 = READ_Z2;
|
||||
x->tx_buf = &ts->read_z2;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->tc.z2;
|
||||
x->len = 2;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
}
|
||||
m++;
|
||||
spi_message_init(m);
|
||||
|
||||
/* turn y- off, x+ on, then leave in lowpower */
|
||||
x++;
|
||||
ts->read_x = READ_X;
|
||||
x->tx_buf = &ts->read_x;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->tc.x;
|
||||
x->len = 2;
|
||||
CS_CHANGE(*x);
|
||||
spi_message_add_tail(x, &ts->msg);
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
ts->msg.complete = ads7846_rx;
|
||||
ts->msg.context = ts;
|
||||
m->complete = ads7846_debounce;
|
||||
m->context = ts;
|
||||
|
||||
/* turn y+ off, x- on; we'll use formula #2 */
|
||||
if (ts->model == 7846) {
|
||||
m++;
|
||||
spi_message_init(m);
|
||||
|
||||
x++;
|
||||
ts->read_z1 = READ_Z1;
|
||||
x->tx_buf = &ts->read_z1;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->tc.z1;
|
||||
x->len = 2;
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
m->complete = ads7846_debounce;
|
||||
m->context = ts;
|
||||
|
||||
m++;
|
||||
spi_message_init(m);
|
||||
|
||||
x++;
|
||||
ts->read_z2 = READ_Z2;
|
||||
x->tx_buf = &ts->read_z2;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->tc.z2;
|
||||
x->len = 2;
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
m->complete = ads7846_debounce;
|
||||
m->context = ts;
|
||||
}
|
||||
|
||||
/* power down */
|
||||
m++;
|
||||
spi_message_init(m);
|
||||
|
||||
x++;
|
||||
ts->pwrdown = PWRDOWN;
|
||||
x->tx_buf = &ts->pwrdown;
|
||||
x->len = 1;
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
x++;
|
||||
x->rx_buf = &ts->dummy;
|
||||
x->len = 2;
|
||||
CS_CHANGE(*x);
|
||||
spi_message_add_tail(x, m);
|
||||
|
||||
m->complete = ads7846_rx;
|
||||
m->context = ts;
|
||||
|
||||
ts->last_msg = m;
|
||||
|
||||
if (request_irq(spi->irq, ads7846_irq,
|
||||
SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING,
|
||||
|
@ -559,13 +797,27 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
device_create_file(&spi->dev, &dev_attr_vbatt);
|
||||
device_create_file(&spi->dev, &dev_attr_vaux);
|
||||
|
||||
device_create_file(&spi->dev, &dev_attr_pen_down);
|
||||
|
||||
device_create_file(&spi->dev, &dev_attr_disable);
|
||||
|
||||
err = input_register_device(input_dev);
|
||||
if (err)
|
||||
goto err_free_irq;
|
||||
goto err_remove_attr;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
err_remove_attr:
|
||||
device_remove_file(&spi->dev, &dev_attr_disable);
|
||||
device_remove_file(&spi->dev, &dev_attr_pen_down);
|
||||
if (ts->model == 7846) {
|
||||
device_remove_file(&spi->dev, &dev_attr_temp1);
|
||||
device_remove_file(&spi->dev, &dev_attr_temp0);
|
||||
}
|
||||
if (ts->model != 7845)
|
||||
device_remove_file(&spi->dev, &dev_attr_vbatt);
|
||||
device_remove_file(&spi->dev, &dev_attr_vaux);
|
||||
|
||||
free_irq(spi->irq, ts);
|
||||
err_free_mem:
|
||||
input_free_device(input_dev);
|
||||
|
@ -577,20 +829,24 @@ static int __devexit ads7846_remove(struct spi_device *spi)
|
|||
{
|
||||
struct ads7846 *ts = dev_get_drvdata(&spi->dev);
|
||||
|
||||
ads7846_suspend(spi, PMSG_SUSPEND);
|
||||
free_irq(ts->spi->irq, ts);
|
||||
if (ts->irq_disabled)
|
||||
enable_irq(ts->spi->irq);
|
||||
input_unregister_device(ts->input);
|
||||
|
||||
ads7846_suspend(spi, PMSG_SUSPEND);
|
||||
|
||||
device_remove_file(&spi->dev, &dev_attr_disable);
|
||||
device_remove_file(&spi->dev, &dev_attr_pen_down);
|
||||
if (ts->model == 7846) {
|
||||
device_remove_file(&spi->dev, &dev_attr_temp0);
|
||||
device_remove_file(&spi->dev, &dev_attr_temp1);
|
||||
device_remove_file(&spi->dev, &dev_attr_temp0);
|
||||
}
|
||||
if (ts->model != 7845)
|
||||
device_remove_file(&spi->dev, &dev_attr_vbatt);
|
||||
device_remove_file(&spi->dev, &dev_attr_vaux);
|
||||
|
||||
input_unregister_device(ts->input);
|
||||
free_irq(ts->spi->irq, ts);
|
||||
/* suspend left the IRQ disabled */
|
||||
enable_irq(ts->spi->irq);
|
||||
|
||||
kfree(ts);
|
||||
|
||||
dev_dbg(&spi->dev, "unregistered touchscreen\n");
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/irq.h>
|
||||
//#include <asm/irq.h>
|
||||
|
||||
#include <asm/arch/sharpsl.h>
|
||||
#include <asm/arch/hardware.h>
|
||||
|
|
|
@ -315,10 +315,11 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
|
|||
if (r1_bio->bios[mirror] == bio)
|
||||
break;
|
||||
|
||||
if (error == -ENOTSUPP && test_bit(R1BIO_Barrier, &r1_bio->state)) {
|
||||
if (error == -EOPNOTSUPP && test_bit(R1BIO_Barrier, &r1_bio->state)) {
|
||||
set_bit(BarriersNotsupp, &conf->mirrors[mirror].rdev->flags);
|
||||
set_bit(R1BIO_BarrierRetry, &r1_bio->state);
|
||||
r1_bio->mddev->barriers_work = 0;
|
||||
/* Don't rdev_dec_pending in this branch - keep it for the retry */
|
||||
} else {
|
||||
/*
|
||||
* this branch is our 'one mirror IO has finished' event handler:
|
||||
|
@ -365,6 +366,7 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
|
|||
}
|
||||
}
|
||||
}
|
||||
rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
|
||||
}
|
||||
/*
|
||||
*
|
||||
|
@ -374,11 +376,9 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
|
|||
if (atomic_dec_and_test(&r1_bio->remaining)) {
|
||||
if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) {
|
||||
reschedule_retry(r1_bio);
|
||||
/* Don't dec_pending yet, we want to hold
|
||||
* the reference over the retry
|
||||
*/
|
||||
goto out;
|
||||
}
|
||||
/* it really is the end of this request */
|
||||
if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
|
||||
/* free extra copy of the data pages */
|
||||
int i = bio->bi_vcnt;
|
||||
|
@ -393,8 +393,6 @@ static int raid1_end_write_request(struct bio *bio, unsigned int bytes_done, int
|
|||
md_write_end(r1_bio->mddev);
|
||||
raid_end_bio_io(r1_bio);
|
||||
}
|
||||
|
||||
rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
|
||||
out:
|
||||
if (to_put)
|
||||
bio_put(to_put);
|
||||
|
@ -753,18 +751,24 @@ static int make_request(request_queue_t *q, struct bio * bio)
|
|||
const int rw = bio_data_dir(bio);
|
||||
int do_barriers;
|
||||
|
||||
if (unlikely(!mddev->barriers_work && bio_barrier(bio))) {
|
||||
bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Register the new request and wait if the reconstruction
|
||||
* thread has put up a bar for new requests.
|
||||
* Continue immediately if no resync is active currently.
|
||||
* We test barriers_work *after* md_write_start as md_write_start
|
||||
* may cause the first superblock write, and that will check out
|
||||
* if barriers work.
|
||||
*/
|
||||
|
||||
md_write_start(mddev, bio); /* wait on superblock update early */
|
||||
|
||||
if (unlikely(!mddev->barriers_work && bio_barrier(bio))) {
|
||||
if (rw == WRITE)
|
||||
md_write_end(mddev);
|
||||
bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
|
||||
return 0;
|
||||
}
|
||||
|
||||
wait_barrier(conf);
|
||||
|
||||
disk_stat_inc(mddev->gendisk, ios[rw]);
|
||||
|
@ -1404,10 +1408,11 @@ static void raid1d(mddev_t *mddev)
|
|||
unplug = 1;
|
||||
} else if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) {
|
||||
/* some requests in the r1bio were BIO_RW_BARRIER
|
||||
* requests which failed with -ENOTSUPP. Hohumm..
|
||||
* requests which failed with -EOPNOTSUPP. Hohumm..
|
||||
* Better resubmit without the barrier.
|
||||
* We know which devices to resubmit for, because
|
||||
* all others have had their bios[] entry cleared.
|
||||
* We already have a nr_pending reference on these rdevs.
|
||||
*/
|
||||
int i;
|
||||
clear_bit(R1BIO_BarrierRetry, &r1_bio->state);
|
||||
|
|
|
@ -1407,43 +1407,54 @@ static void raid10d(mddev_t *mddev)
|
|||
if (s > (PAGE_SIZE>>9))
|
||||
s = PAGE_SIZE >> 9;
|
||||
|
||||
rcu_read_lock();
|
||||
do {
|
||||
int d = r10_bio->devs[sl].devnum;
|
||||
rdev = conf->mirrors[d].rdev;
|
||||
rdev = rcu_dereference(conf->mirrors[d].rdev);
|
||||
if (rdev &&
|
||||
test_bit(In_sync, &rdev->flags) &&
|
||||
sync_page_io(rdev->bdev,
|
||||
r10_bio->devs[sl].addr +
|
||||
sect + rdev->data_offset,
|
||||
s<<9,
|
||||
conf->tmppage, READ))
|
||||
success = 1;
|
||||
else {
|
||||
sl++;
|
||||
if (sl == conf->copies)
|
||||
sl = 0;
|
||||
test_bit(In_sync, &rdev->flags)) {
|
||||
atomic_inc(&rdev->nr_pending);
|
||||
rcu_read_unlock();
|
||||
success = sync_page_io(rdev->bdev,
|
||||
r10_bio->devs[sl].addr +
|
||||
sect + rdev->data_offset,
|
||||
s<<9,
|
||||
conf->tmppage, READ);
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
rcu_read_lock();
|
||||
if (success)
|
||||
break;
|
||||
}
|
||||
sl++;
|
||||
if (sl == conf->copies)
|
||||
sl = 0;
|
||||
} while (!success && sl != r10_bio->read_slot);
|
||||
rcu_read_unlock();
|
||||
|
||||
if (success) {
|
||||
int start = sl;
|
||||
/* write it back and re-read */
|
||||
rcu_read_lock();
|
||||
while (sl != r10_bio->read_slot) {
|
||||
int d;
|
||||
if (sl==0)
|
||||
sl = conf->copies;
|
||||
sl--;
|
||||
d = r10_bio->devs[sl].devnum;
|
||||
rdev = conf->mirrors[d].rdev;
|
||||
atomic_add(s, &rdev->corrected_errors);
|
||||
rdev = rcu_dereference(conf->mirrors[d].rdev);
|
||||
if (rdev &&
|
||||
test_bit(In_sync, &rdev->flags)) {
|
||||
atomic_inc(&rdev->nr_pending);
|
||||
rcu_read_unlock();
|
||||
atomic_add(s, &rdev->corrected_errors);
|
||||
if (sync_page_io(rdev->bdev,
|
||||
r10_bio->devs[sl].addr +
|
||||
sect + rdev->data_offset,
|
||||
s<<9, conf->tmppage, WRITE) == 0)
|
||||
/* Well, this device is dead */
|
||||
md_error(mddev, rdev);
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
rcu_read_lock();
|
||||
}
|
||||
}
|
||||
sl = start;
|
||||
|
@ -1453,17 +1464,22 @@ static void raid10d(mddev_t *mddev)
|
|||
sl = conf->copies;
|
||||
sl--;
|
||||
d = r10_bio->devs[sl].devnum;
|
||||
rdev = conf->mirrors[d].rdev;
|
||||
rdev = rcu_dereference(conf->mirrors[d].rdev);
|
||||
if (rdev &&
|
||||
test_bit(In_sync, &rdev->flags)) {
|
||||
atomic_inc(&rdev->nr_pending);
|
||||
rcu_read_unlock();
|
||||
if (sync_page_io(rdev->bdev,
|
||||
r10_bio->devs[sl].addr +
|
||||
sect + rdev->data_offset,
|
||||
s<<9, conf->tmppage, READ) == 0)
|
||||
/* Well, this device is dead */
|
||||
md_error(mddev, rdev);
|
||||
rdev_dec_pending(rdev, mddev);
|
||||
rcu_read_lock();
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
} else {
|
||||
/* Cannot read from anywhere -- bye bye array */
|
||||
md_error(mddev, conf->mirrors[r10_bio->devs[r10_bio->read_slot].devnum].rdev);
|
||||
|
|
|
@ -616,7 +616,7 @@ static struct snd_kcontrol_new snd_cx88_capture_volume = {
|
|||
* Only boards with eeprom and byte 1 at eeprom=1 have it
|
||||
*/
|
||||
|
||||
static struct pci_device_id cx88_audio_pci_tbl[] = {
|
||||
static struct pci_device_id cx88_audio_pci_tbl[] __devinitdata = {
|
||||
{0x14f1,0x8801,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
|
||||
{0x14f1,0x8811,PCI_ANY_ID,PCI_ANY_ID,0,0,0},
|
||||
{0, }
|
||||
|
|
|
@ -621,9 +621,6 @@ static void at91_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||
struct at91mci_host *host = mmc_priv(mmc);
|
||||
unsigned long at91_master_clock = clk_get_rate(mci_clk);
|
||||
|
||||
DBG("Clock %uHz, busmode %u, powermode %u, Vdd %u\n",
|
||||
ios->clock, ios->bus_mode, ios->power_mode, ios->vdd);
|
||||
|
||||
if (host)
|
||||
host->bus_mode = ios->bus_mode;
|
||||
else
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче