Merge ../linux-2.6
This commit is contained in:
commit
3c06da5ae5
9
CREDITS
9
CREDITS
|
@ -3241,14 +3241,9 @@ S: 12725 SW Millikan Way, Suite 400
|
|||
S: Beaverton, Oregon 97005
|
||||
S: USA
|
||||
|
||||
N: Marcelo W. Tosatti
|
||||
E: marcelo.tosatti@cyclades.com
|
||||
D: Miscellaneous kernel hacker
|
||||
N: Marcelo Tosatti
|
||||
E: marcelo@kvack.org
|
||||
D: v2.4 kernel maintainer
|
||||
D: Current pc300/cyclades maintainer
|
||||
S: Cyclades Corporation
|
||||
S: Av Cristovao Colombo, 462. Floresta.
|
||||
S: Porto Alegre
|
||||
S: Brazil
|
||||
|
||||
N: Stefan Traby
|
||||
|
|
|
@ -1721,11 +1721,6 @@ Your cooperation is appreciated.
|
|||
These devices support the same API as the generic SCSI
|
||||
devices.
|
||||
|
||||
97 block Packet writing for CD/DVD devices
|
||||
0 = /dev/pktcdvd0 First packet-writing module
|
||||
1 = /dev/pktcdvd1 Second packet-writing module
|
||||
...
|
||||
|
||||
98 char Control and Measurement Device (comedi)
|
||||
0 = /dev/comedi0 First comedi device
|
||||
1 = /dev/comedi1 Second comedi device
|
||||
|
|
|
@ -57,6 +57,15 @@ Who: Jody McIntyre <scjody@steamballoon.com>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: sbp2: module parameter "force_inquiry_hack"
|
||||
When: July 2006
|
||||
Why: Superceded by parameter "workarounds". Both parameters are meant to be
|
||||
used ad-hoc and for single devices only, i.e. not in modprobe.conf,
|
||||
therefore the impact of this feature replacement should be low.
|
||||
Who: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: Video4Linux API 1 ioctls and video_decoder.h from Video devices.
|
||||
When: July 2006
|
||||
Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
|
||||
|
|
|
@ -1031,7 +1031,7 @@ conflict on any particular lock.
|
|||
LOCKS VS MEMORY ACCESSES
|
||||
------------------------
|
||||
|
||||
Consider the following: the system has a pair of spinlocks (N) and (Q), and
|
||||
Consider the following: the system has a pair of spinlocks (M) and (Q), and
|
||||
three CPUs; then should the following sequence of events occur:
|
||||
|
||||
CPU 1 CPU 2
|
||||
|
@ -1678,7 +1678,7 @@ CPU's caches by some other cache event:
|
|||
smp_wmb();
|
||||
<A:modify v=2> <C:busy>
|
||||
<C:queue v=2>
|
||||
p = &b; q = p;
|
||||
p = &v; q = p;
|
||||
<D:request p>
|
||||
<B:modify p=&v> <D:commit p=&v>
|
||||
<D:read p>
|
||||
|
|
|
@ -0,0 +1,161 @@
|
|||
|
||||
1. Introduction
|
||||
|
||||
Linux distinguishes between administrative and operational state of an
|
||||
interface. Admininstrative state is the result of "ip link set dev
|
||||
<dev> up or down" and reflects whether the administrator wants to use
|
||||
the device for traffic.
|
||||
|
||||
However, an interface is not usable just because the admin enabled it
|
||||
- ethernet requires to be plugged into the switch and, depending on
|
||||
a site's networking policy and configuration, an 802.1X authentication
|
||||
to be performed before user data can be transferred. Operational state
|
||||
shows the ability of an interface to transmit this user data.
|
||||
|
||||
Thanks to 802.1X, userspace must be granted the possibility to
|
||||
influence operational state. To accommodate this, operational state is
|
||||
split into two parts: Two flags that can be set by the driver only, and
|
||||
a RFC2863 compatible state that is derived from these flags, a policy,
|
||||
and changeable from userspace under certain rules.
|
||||
|
||||
|
||||
2. Querying from userspace
|
||||
|
||||
Both admin and operational state can be queried via the netlink
|
||||
operation RTM_GETLINK. It is also possible to subscribe to RTMGRP_LINK
|
||||
to be notified of updates. This is important for setting from userspace.
|
||||
|
||||
These values contain interface state:
|
||||
|
||||
ifinfomsg::if_flags & IFF_UP:
|
||||
Interface is admin up
|
||||
ifinfomsg::if_flags & IFF_RUNNING:
|
||||
Interface is in RFC2863 operational state UP or UNKNOWN. This is for
|
||||
backward compatibility, routing daemons, dhcp clients can use this
|
||||
flag to determine whether they should use the interface.
|
||||
ifinfomsg::if_flags & IFF_LOWER_UP:
|
||||
Driver has signaled netif_carrier_on()
|
||||
ifinfomsg::if_flags & IFF_DORMANT:
|
||||
Driver has signaled netif_dormant_on()
|
||||
|
||||
These interface flags can also be queried without netlink using the
|
||||
SIOCGIFFLAGS ioctl.
|
||||
|
||||
TLV IFLA_OPERSTATE
|
||||
|
||||
contains RFC2863 state of the interface in numeric representation:
|
||||
|
||||
IF_OPER_UNKNOWN (0):
|
||||
Interface is in unknown state, neither driver nor userspace has set
|
||||
operational state. Interface must be considered for user data as
|
||||
setting operational state has not been implemented in every driver.
|
||||
IF_OPER_NOTPRESENT (1):
|
||||
Unused in current kernel (notpresent interfaces normally disappear),
|
||||
just a numerical placeholder.
|
||||
IF_OPER_DOWN (2):
|
||||
Interface is unable to transfer data on L1, f.e. ethernet is not
|
||||
plugged or interface is ADMIN down.
|
||||
IF_OPER_LOWERLAYERDOWN (3):
|
||||
Interfaces stacked on an interface that is IF_OPER_DOWN show this
|
||||
state (f.e. VLAN).
|
||||
IF_OPER_TESTING (4):
|
||||
Unused in current kernel.
|
||||
IF_OPER_DORMANT (5):
|
||||
Interface is L1 up, but waiting for an external event, f.e. for a
|
||||
protocol to establish. (802.1X)
|
||||
IF_OPER_UP (6):
|
||||
Interface is operational up and can be used.
|
||||
|
||||
This TLV can also be queried via sysfs.
|
||||
|
||||
TLV IFLA_LINKMODE
|
||||
|
||||
contains link policy. This is needed for userspace interaction
|
||||
described below.
|
||||
|
||||
This TLV can also be queried via sysfs.
|
||||
|
||||
|
||||
3. Kernel driver API
|
||||
|
||||
Kernel drivers have access to two flags that map to IFF_LOWER_UP and
|
||||
IFF_DORMANT. These flags can be set from everywhere, even from
|
||||
interrupts. It is guaranteed that only the driver has write access,
|
||||
however, if different layers of the driver manipulate the same flag,
|
||||
the driver has to provide the synchronisation needed.
|
||||
|
||||
__LINK_STATE_NOCARRIER, maps to !IFF_LOWER_UP:
|
||||
|
||||
The driver uses netif_carrier_on() to clear and netif_carrier_off() to
|
||||
set this flag. On netif_carrier_off(), the scheduler stops sending
|
||||
packets. The name 'carrier' and the inversion are historical, think of
|
||||
it as lower layer.
|
||||
|
||||
netif_carrier_ok() can be used to query that bit.
|
||||
|
||||
__LINK_STATE_DORMANT, maps to IFF_DORMANT:
|
||||
|
||||
Set by the driver to express that the device cannot yet be used
|
||||
because some driver controlled protocol establishment has to
|
||||
complete. Corresponding functions are netif_dormant_on() to set the
|
||||
flag, netif_dormant_off() to clear it and netif_dormant() to query.
|
||||
|
||||
On device allocation, networking core sets the flags equivalent to
|
||||
netif_carrier_ok() and !netif_dormant().
|
||||
|
||||
|
||||
Whenever the driver CHANGES one of these flags, a workqueue event is
|
||||
scheduled to translate the flag combination to IFLA_OPERSTATE as
|
||||
follows:
|
||||
|
||||
!netif_carrier_ok():
|
||||
IF_OPER_LOWERLAYERDOWN if the interface is stacked, IF_OPER_DOWN
|
||||
otherwise. Kernel can recognise stacked interfaces because their
|
||||
ifindex != iflink.
|
||||
|
||||
netif_carrier_ok() && netif_dormant():
|
||||
IF_OPER_DORMANT
|
||||
|
||||
netif_carrier_ok() && !netif_dormant():
|
||||
IF_OPER_UP if userspace interaction is disabled. Otherwise
|
||||
IF_OPER_DORMANT with the possibility for userspace to initiate the
|
||||
IF_OPER_UP transition afterwards.
|
||||
|
||||
|
||||
4. Setting from userspace
|
||||
|
||||
Applications have to use the netlink interface to influence the
|
||||
RFC2863 operational state of an interface. Setting IFLA_LINKMODE to 1
|
||||
via RTM_SETLINK instructs the kernel that an interface should go to
|
||||
IF_OPER_DORMANT instead of IF_OPER_UP when the combination
|
||||
netif_carrier_ok() && !netif_dormant() is set by the
|
||||
driver. Afterwards, the userspace application can set IFLA_OPERSTATE
|
||||
to IF_OPER_DORMANT or IF_OPER_UP as long as the driver does not set
|
||||
netif_carrier_off() or netif_dormant_on(). Changes made by userspace
|
||||
are multicasted on the netlink group RTMGRP_LINK.
|
||||
|
||||
So basically a 802.1X supplicant interacts with the kernel like this:
|
||||
|
||||
-subscribe to RTMGRP_LINK
|
||||
-set IFLA_LINKMODE to 1 via RTM_SETLINK
|
||||
-query RTM_GETLINK once to get initial state
|
||||
-if initial flags are not (IFF_LOWER_UP && !IFF_DORMANT), wait until
|
||||
netlink multicast signals this state
|
||||
-do 802.1X, eventually abort if flags go down again
|
||||
-send RTM_SETLINK to set operstate to IF_OPER_UP if authentication
|
||||
succeeds, IF_OPER_DORMANT otherwise
|
||||
-see how operstate and IFF_RUNNING is echoed via netlink multicast
|
||||
-set interface back to IF_OPER_DORMANT if 802.1X reauthentication
|
||||
fails
|
||||
-restart if kernel changes IFF_LOWER_UP or IFF_DORMANT flag
|
||||
|
||||
if supplicant goes down, bring back IFLA_LINKMODE to 0 and
|
||||
IFLA_OPERSTATE to a sane value.
|
||||
|
||||
A routing daemon or dhcp client just needs to care for IFF_RUNNING or
|
||||
waiting for operstate to go IF_OPER_UP/IF_OPER_UNKNOWN before
|
||||
considering the interface / querying a DHCP address.
|
||||
|
||||
|
||||
For technical questions and/or comments please e-mail to Stefan Rompf
|
||||
(stefan at loplof.de).
|
|
@ -1,3 +1,28 @@
|
|||
Release Date : Mon Apr 11 12:27:22 EST 2006 - Seokmann Ju <sju@lsil.com>
|
||||
Current Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
|
||||
Older Version : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module)
|
||||
|
||||
1. Fixed a bug in megaraid_reset_handler().
|
||||
Customer reported "Unable to handle kernel NULL pointer dereference
|
||||
at virtual address 00000000" when system goes to reset condition
|
||||
for some reason. It happened randomly.
|
||||
Root Cause: in the megaraid_reset_handler(), there is possibility not
|
||||
returning pending packets in the pend_list if there are multiple
|
||||
pending packets.
|
||||
Fix: Made the change in the driver so that it will return all packets
|
||||
in the pend_list.
|
||||
|
||||
2. Added change request.
|
||||
As found in the following URL, rmb() only didn't help the
|
||||
problem. I had to increase the loop counter to 0xFFFFFF. (6 F's)
|
||||
http://marc.theaimsgroup.com/?l=linux-scsi&m=110971060502497&w=2
|
||||
|
||||
I attached a patch for your reference, too.
|
||||
Could you check and get this fix in your driver?
|
||||
|
||||
Best Regards,
|
||||
Jun'ichi Nomura
|
||||
|
||||
Release Date : Fri Nov 11 12:27:22 EST 2005 - Seokmann Ju <sju@lsil.com>
|
||||
Current Version : 2.20.4.7 (scsi module), 2.20.2.6 (cmm module)
|
||||
Older Version : 2.20.4.6 (scsi module), 2.20.2.6 (cmm module)
|
||||
|
|
|
@ -0,0 +1,234 @@
|
|||
PXA2xx SPI on SSP driver HOWTO
|
||||
===================================================
|
||||
This a mini howto on the pxa2xx_spi driver. The driver turns a PXA2xx
|
||||
synchronous serial port into a SPI master controller
|
||||
(see Documentation/spi/spi_summary). The driver has the following features
|
||||
|
||||
- Support for any PXA2xx SSP
|
||||
- SSP PIO and SSP DMA data transfers.
|
||||
- External and Internal (SSPFRM) chip selects.
|
||||
- Per slave device (chip) configuration.
|
||||
- Full suspend, freeze, resume support.
|
||||
|
||||
The driver is built around a "spi_message" fifo serviced by workqueue and a
|
||||
tasklet. The workqueue, "pump_messages", drives message fifo and the tasklet
|
||||
(pump_transfer) is responsible for queuing SPI transactions and setting up and
|
||||
launching the dma/interrupt driven transfers.
|
||||
|
||||
Declaring PXA2xx Master Controllers
|
||||
-----------------------------------
|
||||
Typically a SPI master is defined in the arch/.../mach-*/board-*.c as a
|
||||
"platform device". The master configuration is passed to the driver via a table
|
||||
found in include/asm-arm/arch-pxa/pxa2xx_spi.h:
|
||||
|
||||
struct pxa2xx_spi_master {
|
||||
enum pxa_ssp_type ssp_type;
|
||||
u32 clock_enable;
|
||||
u16 num_chipselect;
|
||||
u8 enable_dma;
|
||||
};
|
||||
|
||||
The "pxa2xx_spi_master.ssp_type" field must have a value between 1 and 3 and
|
||||
informs the driver which features a particular SSP supports.
|
||||
|
||||
The "pxa2xx_spi_master.clock_enable" field is used to enable/disable the
|
||||
corresponding SSP peripheral block in the "Clock Enable Register (CKEN"). See
|
||||
the "PXA2xx Developer Manual" section "Clocks and Power Management".
|
||||
|
||||
The "pxa2xx_spi_master.num_chipselect" field is used to determine the number of
|
||||
slave device (chips) attached to this SPI master.
|
||||
|
||||
The "pxa2xx_spi_master.enable_dma" field informs the driver that SSP DMA should
|
||||
be used. This caused the driver to acquire two DMA channels: rx_channel and
|
||||
tx_channel. The rx_channel has a higher DMA service priority the tx_channel.
|
||||
See the "PXA2xx Developer Manual" section "DMA Controller".
|
||||
|
||||
NSSP MASTER SAMPLE
|
||||
------------------
|
||||
Below is a sample configuration using the PXA255 NSSP.
|
||||
|
||||
static struct resource pxa_spi_nssp_resources[] = {
|
||||
[0] = {
|
||||
.start = __PREG(SSCR0_P(2)), /* Start address of NSSP */
|
||||
.end = __PREG(SSCR0_P(2)) + 0x2c, /* Range of registers */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = IRQ_NSSP, /* NSSP IRQ */
|
||||
.end = IRQ_NSSP,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_nssp_master_info = {
|
||||
.ssp_type = PXA25x_NSSP, /* Type of SSP */
|
||||
.clock_enable = CKEN9_NSSP, /* NSSP Peripheral clock */
|
||||
.num_chipselect = 1, /* Matches the number of chips attached to NSSP */
|
||||
.enable_dma = 1, /* Enables NSSP DMA */
|
||||
};
|
||||
|
||||
static struct platform_device pxa_spi_nssp = {
|
||||
.name = "pxa2xx-spi", /* MUST BE THIS VALUE, so device match driver */
|
||||
.id = 2, /* Bus number, MUST MATCH SSP number 1..n */
|
||||
.resource = pxa_spi_nssp_resources,
|
||||
.num_resources = ARRAY_SIZE(pxa_spi_nssp_resources),
|
||||
.dev = {
|
||||
.platform_data = &pxa_nssp_master_info, /* Passed to driver */
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&pxa_spi_nssp,
|
||||
};
|
||||
|
||||
static void __init board_init(void)
|
||||
{
|
||||
(void)platform_add_device(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
Declaring Slave Devices
|
||||
-----------------------
|
||||
Typically each SPI slave (chip) is defined in the arch/.../mach-*/board-*.c
|
||||
using the "spi_board_info" structure found in "linux/spi/spi.h". See
|
||||
"Documentation/spi/spi_summary" for additional information.
|
||||
|
||||
Each slave device attached to the PXA must provide slave specific configuration
|
||||
information via the structure "pxa2xx_spi_chip" found in
|
||||
"include/asm-arm/arch-pxa/pxa2xx_spi.h". The pxa2xx_spi master controller driver
|
||||
will uses the configuration whenever the driver communicates with the slave
|
||||
device.
|
||||
|
||||
struct pxa2xx_spi_chip {
|
||||
u8 tx_threshold;
|
||||
u8 rx_threshold;
|
||||
u8 dma_burst_size;
|
||||
u32 timeout_microsecs;
|
||||
u8 enable_loopback;
|
||||
void (*cs_control)(u32 command);
|
||||
};
|
||||
|
||||
The "pxa2xx_spi_chip.tx_threshold" and "pxa2xx_spi_chip.rx_threshold" fields are
|
||||
used to configure the SSP hardware fifo. These fields are critical to the
|
||||
performance of pxa2xx_spi driver and misconfiguration will result in rx
|
||||
fifo overruns (especially in PIO mode transfers). Good default values are
|
||||
|
||||
.tx_threshold = 12,
|
||||
.rx_threshold = 4,
|
||||
|
||||
The "pxa2xx_spi_chip.dma_burst_size" field is used to configure PXA2xx DMA
|
||||
engine and is related the "spi_device.bits_per_word" field. Read and understand
|
||||
the PXA2xx "Developer Manual" sections on the DMA controller and SSP Controllers
|
||||
to determine the correct value. An SSP configured for byte-wide transfers would
|
||||
use a value of 8.
|
||||
|
||||
The "pxa2xx_spi_chip.timeout_microsecs" fields is used to efficiently handle
|
||||
trailing bytes in the SSP receiver fifo. The correct value for this field is
|
||||
dependent on the SPI bus speed ("spi_board_info.max_speed_hz") and the specific
|
||||
slave device. Please note the the PXA2xx SSP 1 does not support trailing byte
|
||||
timeouts and must busy-wait any trailing bytes.
|
||||
|
||||
The "pxa2xx_spi_chip.enable_loopback" field is used to place the SSP porting
|
||||
into internal loopback mode. In this mode the SSP controller internally
|
||||
connects the SSPTX pin the the SSPRX pin. This is useful for initial setup
|
||||
testing.
|
||||
|
||||
The "pxa2xx_spi_chip.cs_control" field is used to point to a board specific
|
||||
function for asserting/deasserting a slave device chip select. If the field is
|
||||
NULL, the pxa2xx_spi master controller driver assumes that the SSP port is
|
||||
configured to use SSPFRM instead.
|
||||
|
||||
NSSP SALVE SAMPLE
|
||||
-----------------
|
||||
The pxa2xx_spi_chip structure is passed to the pxa2xx_spi driver in the
|
||||
"spi_board_info.controller_data" field. Below is a sample configuration using
|
||||
the PXA255 NSSP.
|
||||
|
||||
/* Chip Select control for the CS8415A SPI slave device */
|
||||
static void cs8415a_cs_control(u32 command)
|
||||
{
|
||||
if (command & PXA2XX_CS_ASSERT)
|
||||
GPCR(2) = GPIO_bit(2);
|
||||
else
|
||||
GPSR(2) = GPIO_bit(2);
|
||||
}
|
||||
|
||||
/* Chip Select control for the CS8405A SPI slave device */
|
||||
static void cs8405a_cs_control(u32 command)
|
||||
{
|
||||
if (command & PXA2XX_CS_ASSERT)
|
||||
GPCR(3) = GPIO_bit(3);
|
||||
else
|
||||
GPSR(3) = GPIO_bit(3);
|
||||
}
|
||||
|
||||
static struct pxa2xx_spi_chip cs8415a_chip_info = {
|
||||
.tx_threshold = 12, /* SSP hardward FIFO threshold */
|
||||
.rx_threshold = 4, /* SSP hardward FIFO threshold */
|
||||
.dma_burst_size = 8, /* Byte wide transfers used so 8 byte bursts */
|
||||
.timeout_microsecs = 64, /* Wait at least 64usec to handle trailing */
|
||||
.cs_control = cs8415a_cs_control, /* Use external chip select */
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_chip cs8405a_chip_info = {
|
||||
.tx_threshold = 12, /* SSP hardward FIFO threshold */
|
||||
.rx_threshold = 4, /* SSP hardward FIFO threshold */
|
||||
.dma_burst_size = 8, /* Byte wide transfers used so 8 byte bursts */
|
||||
.timeout_microsecs = 64, /* Wait at least 64usec to handle trailing */
|
||||
.cs_control = cs8405a_cs_control, /* Use external chip select */
|
||||
};
|
||||
|
||||
static struct spi_board_info streetracer_spi_board_info[] __initdata = {
|
||||
{
|
||||
.modalias = "cs8415a", /* Name of spi_driver for this device */
|
||||
.max_speed_hz = 3686400, /* Run SSP as fast a possbile */
|
||||
.bus_num = 2, /* Framework bus number */
|
||||
.chip_select = 0, /* Framework chip select */
|
||||
.platform_data = NULL; /* No spi_driver specific config */
|
||||
.controller_data = &cs8415a_chip_info, /* Master chip config */
|
||||
.irq = STREETRACER_APCI_IRQ, /* Slave device interrupt */
|
||||
},
|
||||
{
|
||||
.modalias = "cs8405a", /* Name of spi_driver for this device */
|
||||
.max_speed_hz = 3686400, /* Run SSP as fast a possbile */
|
||||
.bus_num = 2, /* Framework bus number */
|
||||
.chip_select = 1, /* Framework chip select */
|
||||
.controller_data = &cs8405a_chip_info, /* Master chip config */
|
||||
.irq = STREETRACER_APCI_IRQ, /* Slave device interrupt */
|
||||
},
|
||||
};
|
||||
|
||||
static void __init streetracer_init(void)
|
||||
{
|
||||
spi_register_board_info(streetracer_spi_board_info,
|
||||
ARRAY_SIZE(streetracer_spi_board_info));
|
||||
}
|
||||
|
||||
|
||||
DMA and PIO I/O Support
|
||||
-----------------------
|
||||
The pxa2xx_spi driver support both DMA and interrupt driven PIO message
|
||||
transfers. The driver defaults to PIO mode and DMA transfers must enabled by
|
||||
setting the "enable_dma" flag in the "pxa2xx_spi_master" structure and and
|
||||
ensuring that the "pxa2xx_spi_chip.dma_burst_size" field is non-zero. The DMA
|
||||
mode support both coherent and stream based DMA mappings.
|
||||
|
||||
The following logic is used to determine the type of I/O to be used on
|
||||
a per "spi_transfer" basis:
|
||||
|
||||
if !enable_dma or dma_burst_size == 0 then
|
||||
always use PIO transfers
|
||||
|
||||
if spi_message.is_dma_mapped and rx_dma_buf != 0 and tx_dma_buf != 0 then
|
||||
use coherent DMA mode
|
||||
|
||||
if rx_buf and tx_buf are aligned on 8 byte boundary then
|
||||
use streaming DMA mode
|
||||
|
||||
otherwise
|
||||
use PIO transfer
|
||||
|
||||
THANKS TO
|
||||
---------
|
||||
|
||||
David Brownell and others for mentoring the development of this driver.
|
||||
|
|
@ -414,7 +414,33 @@ to get the driver-private data allocated for that device.
|
|||
The driver will initialize the fields of that spi_master, including the
|
||||
bus number (maybe the same as the platform device ID) and three methods
|
||||
used to interact with the SPI core and SPI protocol drivers. It will
|
||||
also initialize its own internal state.
|
||||
also initialize its own internal state. (See below about bus numbering
|
||||
and those methods.)
|
||||
|
||||
After you initialize the spi_master, then use spi_register_master() to
|
||||
publish it to the rest of the system. At that time, device nodes for
|
||||
the controller and any predeclared spi devices will be made available,
|
||||
and the driver model core will take care of binding them to drivers.
|
||||
|
||||
If you need to remove your SPI controller driver, spi_unregister_master()
|
||||
will reverse the effect of spi_register_master().
|
||||
|
||||
|
||||
BUS NUMBERING
|
||||
|
||||
Bus numbering is important, since that's how Linux identifies a given
|
||||
SPI bus (shared SCK, MOSI, MISO). Valid bus numbers start at zero. On
|
||||
SOC systems, the bus numbers should match the numbers defined by the chip
|
||||
manufacturer. For example, hardware controller SPI2 would be bus number 2,
|
||||
and spi_board_info for devices connected to it would use that number.
|
||||
|
||||
If you don't have such hardware-assigned bus number, and for some reason
|
||||
you can't just assign them, then provide a negative bus number. That will
|
||||
then be replaced by a dynamically assigned number. You'd then need to treat
|
||||
this as a non-static configuration (see above).
|
||||
|
||||
|
||||
SPI MASTER METHODS
|
||||
|
||||
master->setup(struct spi_device *spi)
|
||||
This sets up the device clock rate, SPI mode, and word sizes.
|
||||
|
@ -431,6 +457,9 @@ also initialize its own internal state.
|
|||
state it dynamically associates with that device. If you do that,
|
||||
be sure to provide the cleanup() method to free that state.
|
||||
|
||||
|
||||
SPI MESSAGE QUEUE
|
||||
|
||||
The bulk of the driver will be managing the I/O queue fed by transfer().
|
||||
|
||||
That queue could be purely conceptual. For example, a driver used only
|
||||
|
@ -440,6 +469,9 @@ But the queue will probably be very real, using message->queue, PIO,
|
|||
often DMA (especially if the root filesystem is in SPI flash), and
|
||||
execution contexts like IRQ handlers, tasklets, or workqueues (such
|
||||
as keventd). Your driver can be as fancy, or as simple, as you need.
|
||||
Such a transfer() method would normally just add the message to a
|
||||
queue, and then start some asynchronous transfer engine (unless it's
|
||||
already running).
|
||||
|
||||
|
||||
THANKS TO
|
||||
|
|
18
MAINTAINERS
18
MAINTAINERS
|
@ -1480,10 +1480,11 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
|
||||
IRDA SUBSYSTEM
|
||||
P: Jean Tourrilhes
|
||||
P: Samuel Ortiz
|
||||
M: samuel@sortiz.org
|
||||
L: irda-users@lists.sourceforge.net (subscribers-only)
|
||||
W: http://irda.sourceforge.net/
|
||||
S: Odd Fixes
|
||||
S: Maintained
|
||||
|
||||
ISAPNP
|
||||
P: Jaroslav Kysela
|
||||
|
@ -1602,6 +1603,11 @@ M: James.Bottomley@HansenPartnership.com
|
|||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
LED SUBSYSTEM
|
||||
P: Richard Purdie
|
||||
M: rpurdie@rpsys.net
|
||||
S: Maintained
|
||||
|
||||
LEGO USB Tower driver
|
||||
P: Juergen Stuber
|
||||
M: starblue@users.sourceforge.net
|
||||
|
@ -1661,7 +1667,7 @@ S: Maintained
|
|||
|
||||
LINUX FOR POWERPC EMBEDDED PPC8XX
|
||||
P: Marcelo Tosatti
|
||||
M: marcelo.tosatti@cyclades.com
|
||||
M: marcelo@kvack.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-embedded@ozlabs.org
|
||||
S: Maintained
|
||||
|
@ -2512,6 +2518,12 @@ M: perex@suse.cz
|
|||
L: alsa-devel@alsa-project.org
|
||||
S: Maintained
|
||||
|
||||
SPI SUBSYSTEM
|
||||
P: David Brownell
|
||||
M: dbrownell@users.sourceforge.net
|
||||
L: spi-devel-general@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
TPM DEVICE DRIVER
|
||||
P: Kylene Hall
|
||||
M: kjhall@us.ibm.com
|
||||
|
|
22
Makefile
22
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 17
|
||||
EXTRAVERSION =-rc3
|
||||
EXTRAVERSION =-rc4
|
||||
NAME=Sliding Snow Leopard
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -344,16 +344,14 @@ scripts_basic:
|
|||
scripts/basic/%: scripts_basic ;
|
||||
|
||||
PHONY += outputmakefile
|
||||
# outputmakefile generate a Makefile to be placed in output directory, if
|
||||
# using a seperate output directory. This allows convinient use
|
||||
# of make in output directory
|
||||
# outputmakefile generates a Makefile in the output directory, if using a
|
||||
# separate output directory. This allows convenient use of make in the
|
||||
# output directory.
|
||||
outputmakefile:
|
||||
$(Q)if test ! $(srctree) -ef $(objtree); then \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
||||
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) \
|
||||
> $(objtree)/Makefile; \
|
||||
echo ' GEN $(objtree)/Makefile'; \
|
||||
fi
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
|
||||
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
|
||||
endif
|
||||
|
||||
# To make sure we do not include .config for any of the *config targets
|
||||
# catch them early, and hand them over to scripts/kconfig/Makefile
|
||||
|
@ -796,8 +794,8 @@ prepare2: prepare3 outputmakefile
|
|||
prepare1: prepare2 include/linux/version.h include/asm \
|
||||
include/config/MARKER
|
||||
ifneq ($(KBUILD_MODULES),)
|
||||
$(Q)rm -rf $(MODVERDIR)
|
||||
$(Q)mkdir -p $(MODVERDIR)
|
||||
$(Q)rm -f $(MODVERDIR)/*
|
||||
endif
|
||||
|
||||
archprepare: prepare1 scripts_basic
|
||||
|
@ -1086,8 +1084,8 @@ else # KBUILD_EXTMOD
|
|||
KBUILD_MODULES := 1
|
||||
PHONY += crmodverdir
|
||||
crmodverdir:
|
||||
$(Q)rm -rf $(MODVERDIR)
|
||||
$(Q)mkdir -p $(MODVERDIR)
|
||||
$(Q)rm -f $(MODVERDIR)/*
|
||||
|
||||
PHONY += $(objtree)/Module.symvers
|
||||
$(objtree)/Module.symvers:
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc3
|
||||
# Sun Oct 9 16:55:14 2005
|
||||
# Linux kernel version: 2.6.17-rc1
|
||||
# Fri Apr 14 19:09:52 2006
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_ARCH_MTD_XIP=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
|
@ -23,45 +23,58 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_ELF_CORE=y
|
||||
# CONFIG_BASE_FULL is not set
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
# CONFIG_EPOLL is not set
|
||||
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 is not set
|
||||
CONFIG_DOUBLEFAULT=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
CONFIG_BASE_SMALL=1
|
||||
CONFIG_SLOB=y
|
||||
CONFIG_OBSOLETE_INTERMODULE=y
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
# CONFIG_MODULES is not set
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
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"
|
||||
|
||||
#
|
||||
# System Type
|
||||
|
@ -70,11 +83,13 @@ CONFIG_KMOD=y
|
|||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_EP93XX is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_IXP23XX is not set
|
||||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
|
@ -84,9 +99,11 @@ CONFIG_ARCH_SA1100=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
# CONFIG_ARCH_AT91RM9200 is not set
|
||||
|
||||
#
|
||||
# SA11x0 Implementations
|
||||
|
@ -128,20 +145,32 @@ CONFIG_SHARP_SCOOP=y
|
|||
# Bus support
|
||||
#
|
||||
CONFIG_ISA=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
CONFIG_PCCARD=y
|
||||
CONFIG_PCMCIA_DEBUG=y
|
||||
CONFIG_PCMCIA=y
|
||||
CONFIG_PCMCIA_LOAD_CIS=y
|
||||
CONFIG_PCMCIA_IOCTL=y
|
||||
|
||||
#
|
||||
# PC-card bridges
|
||||
#
|
||||
# CONFIG_I82365 is not set
|
||||
# CONFIG_TCIC is not set
|
||||
CONFIG_PCMCIA_SA1100=y
|
||||
|
||||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
CONFIG_HZ=100
|
||||
# CONFIG_AEABI is not set
|
||||
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||
CONFIG_NODES_SHIFT=2
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM_MANUAL=y
|
||||
|
@ -150,6 +179,7 @@ CONFIG_DISCONTIGMEM=y
|
|||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_NEED_MULTIPLE_NODES=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_LEDS is not set
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
|
@ -158,7 +188,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 debug"
|
||||
CONFIG_CMDLINE="noinitrd root=/dev/mtdblock2 rootfstype=jffs2 fbcon=rotate:1"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
|
@ -181,14 +211,16 @@ CONFIG_FPE_NWFPE=y
|
|||
# Userspace binary formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_AOUT=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
# CONFIG_BINFMT_AOUT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
# CONFIG_ARTHUR is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_LEGACY=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
CONFIG_APM=y
|
||||
|
||||
#
|
||||
|
@ -199,6 +231,7 @@ CONFIG_NET=y
|
|||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
|
@ -211,16 +244,19 @@ CONFIG_IP_FIB_HASH=y
|
|||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# 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_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
|
||||
|
||||
#
|
||||
|
@ -232,6 +268,11 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# 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
|
||||
|
@ -244,8 +285,11 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
|
@ -265,9 +309,14 @@ CONFIG_TCP_CONG_BIC=y
|
|||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=m
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
|
@ -287,32 +336,49 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
# CONFIG_MTD_CFI is not set
|
||||
# CONFIG_MTD_JEDECPROBE is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_JEDECPROBE=y
|
||||
CONFIG_MTD_GEN_PROBE=y
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_NOSWAP=y
|
||||
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
|
||||
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
|
||||
CONFIG_MTD_CFI_GEOMETRY=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I1 is not set
|
||||
# CONFIG_MTD_CFI_I2 is not set
|
||||
CONFIG_MTD_CFI_I4=y
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_OTP is not set
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
# CONFIG_MTD_CFI_AMDSTD is not set
|
||||
# CONFIG_MTD_CFI_STAA is not set
|
||||
CONFIG_MTD_CFI_UTIL=y
|
||||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
CONFIG_MTD_OBSOLETE_CHIPS=y
|
||||
CONFIG_MTD_SHARP=y
|
||||
# CONFIG_MTD_XIP is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_SA1100=y
|
||||
# CONFIG_MTD_IMPA7 is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
|
@ -321,7 +387,6 @@ CONFIG_MTD_SHARP=y
|
|||
# CONFIG_MTD_SLRAM is not set
|
||||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLKMTD is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
|
||||
#
|
||||
|
@ -336,6 +401,11 @@ CONFIG_MTD_SHARP=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -349,7 +419,6 @@ CONFIG_MTD_SHARP=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_XD is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
|
@ -359,20 +428,35 @@ CONFIG_BLK_DEV_RAM_COUNT=16
|
|||
CONFIG_BLK_DEV_RAM_SIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD 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=m
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=y
|
||||
CONFIG_IDEDISK_MULTI_MODE=y
|
||||
CONFIG_BLK_DEV_IDECS=y
|
||||
# CONFIG_BLK_DEV_IDECD is not set
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
|
||||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
CONFIG_IDE_GENERIC=y
|
||||
# CONFIG_IDE_ARM is not set
|
||||
# CONFIG_IDE_CHIPSETS is not set
|
||||
# CONFIG_BLK_DEV_IDEDMA is not set
|
||||
# CONFIG_IDEDMA_AUTO is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
|
@ -402,6 +486,39 @@ CONFIG_ATA_OVER_ETH=m
|
|||
# Network device support
|
||||
#
|
||||
# CONFIG_NETDEVICES is not set
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
CONFIG_PPP=y
|
||||
# CONFIG_PPP_MULTILINK is not set
|
||||
# CONFIG_PPP_FILTER is not set
|
||||
CONFIG_PPP_ASYNC=y
|
||||
# CONFIG_PPP_SYNC_TTY is not set
|
||||
# CONFIG_PPP_DEFLATE is not set
|
||||
# CONFIG_PPP_BSDCOMP is not set
|
||||
# CONFIG_PPP_MPPE is not set
|
||||
# CONFIG_PPPOE is not set
|
||||
# CONFIG_SLIP 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
|
||||
|
||||
|
@ -424,7 +541,7 @@ CONFIG_INPUT_TSDEV=y
|
|||
CONFIG_INPUT_TSDEV_SCREEN_X=240
|
||||
CONFIG_INPUT_TSDEV_SCREEN_Y=320
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_INPUT_EVBUG=y
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
|
@ -438,7 +555,11 @@ CONFIG_KEYBOARD_LOCOMO=y
|
|||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
# CONFIG_TOUCHSCREEN_GUNZE is not set
|
||||
# CONFIG_TOUCHSCREEN_ELO is not set
|
||||
# CONFIG_TOUCHSCREEN_MTOUCH is not set
|
||||
# CONFIG_TOUCHSCREEN_MK712 is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
|
@ -461,7 +582,16 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
# CONFIG_SERIAL_8250_CONSOLE is not set
|
||||
CONFIG_SERIAL_8250_CS=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
# CONFIG_SERIAL_8250_MANY_PORTS is not set
|
||||
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
# CONFIG_SERIAL_8250_RSA is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
|
@ -483,94 +613,48 @@ CONFIG_UNIX98_PTYS=y
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
|
||||
#
|
||||
# PCMCIA character devices
|
||||
#
|
||||
# CONFIG_SYNCLINK_CS is not set
|
||||
# CONFIG_CARDMAN_4000 is not set
|
||||
# CONFIG_CARDMAN_4040 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=m
|
||||
# CONFIG_I2C_CHARDEV is not set
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
# SPI support
|
||||
#
|
||||
CONFIG_I2C_ALGOBIT=m
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_I2C_ELEKTOR is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM75 is not set
|
||||
# CONFIG_SENSORS_LM77 is not set
|
||||
# CONFIG_SENSORS_LM78 is not set
|
||||
# CONFIG_SENSORS_LM80 is not set
|
||||
# CONFIG_SENSORS_LM83 is not set
|
||||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -579,42 +663,33 @@ CONFIG_HWMON=y
|
|||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
# CONFIG_MCP_SA11X0 is not set
|
||||
CONFIG_MCP=y
|
||||
CONFIG_MCP_SA11X0=y
|
||||
CONFIG_MCP_UCB1200=y
|
||||
CONFIG_MCP_UCB1200_TS=y
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
CONFIG_LEDS_LOCOMO=y
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_IDE_DISK=y
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
CONFIG_VIDEO_DEV=m
|
||||
|
||||
#
|
||||
# Video For Linux
|
||||
#
|
||||
|
||||
#
|
||||
# Video Adapters
|
||||
#
|
||||
# CONFIG_VIDEO_PMS is not set
|
||||
# CONFIG_VIDEO_CPIA is not set
|
||||
# CONFIG_VIDEO_SAA5246A is not set
|
||||
# CONFIG_VIDEO_SAA5249 is not set
|
||||
# CONFIG_TUNER_3036 is not set
|
||||
# CONFIG_VIDEO_OVCAMCHIP is not set
|
||||
|
||||
#
|
||||
# Radio Adapters
|
||||
#
|
||||
# CONFIG_RADIO_CADET is not set
|
||||
# CONFIG_RADIO_RTRACK is not set
|
||||
# CONFIG_RADIO_RTRACK2 is not set
|
||||
# CONFIG_RADIO_AZTECH is not set
|
||||
# CONFIG_RADIO_GEMTEK is not set
|
||||
# CONFIG_RADIO_MAESTRO is not set
|
||||
# CONFIG_RADIO_SF16FMI is not set
|
||||
# CONFIG_RADIO_SF16FMR2 is not set
|
||||
# CONFIG_RADIO_TERRATEC is not set
|
||||
# CONFIG_RADIO_TRUST is not set
|
||||
# CONFIG_RADIO_TYPHOON is not set
|
||||
# CONFIG_RADIO_ZOLTRIX is not set
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
|
@ -628,8 +703,8 @@ CONFIG_FB=y
|
|||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_FIRMWARE_EDID is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
CONFIG_FB_SA1100=y
|
||||
|
@ -643,14 +718,15 @@ CONFIG_FB_SA1100=y
|
|||
# CONFIG_MDA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||
CONFIG_FONTS=y
|
||||
CONFIG_FONT_8x8=y
|
||||
# CONFIG_FONT_8x8 is not set
|
||||
# CONFIG_FONT_8x16 is not set
|
||||
# CONFIG_FONT_6x11 is not set
|
||||
# CONFIG_FONT_7x14 is not set
|
||||
# CONFIG_FONT_PEARL_8x8 is not set
|
||||
# CONFIG_FONT_ACORN_8x8 is not set
|
||||
# CONFIG_FONT_MINI_4x6 is not set
|
||||
CONFIG_FONT_MINI_4x6=y
|
||||
# CONFIG_FONT_SUN8x16 is not set
|
||||
# CONFIG_FONT_SUN12x22 is not set
|
||||
# CONFIG_FONT_10x18 is not set
|
||||
|
@ -659,7 +735,11 @@ CONFIG_FONT_8x8=y
|
|||
# Logo configuration
|
||||
#
|
||||
# CONFIG_LOGO is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||
CONFIG_BACKLIGHT_DEVICE=y
|
||||
CONFIG_LCD_CLASS_DEVICE=y
|
||||
CONFIG_LCD_DEVICE=y
|
||||
|
||||
#
|
||||
# Sound
|
||||
|
@ -671,44 +751,42 @@ CONFIG_FONT_8x8=y
|
|||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
CONFIG_USB_GADGET=y
|
||||
# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
||||
# CONFIG_USB_GADGET_NET2280 is not set
|
||||
# CONFIG_USB_GADGET_PXA2XX is not set
|
||||
# CONFIG_USB_GADGET_GOKU is not set
|
||||
# CONFIG_USB_GADGET_LH7A40X is not set
|
||||
# CONFIG_USB_GADGET_OMAP is not set
|
||||
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
||||
# CONFIG_USB_GADGET_DUALSPEED is not set
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
CONFIG_EXT2_FS_SECURITY=y
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
# 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=y
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_INOTIFY is not set
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
|
@ -725,7 +803,7 @@ CONFIG_INOTIFY=y
|
|||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
|
@ -739,7 +817,7 @@ CONFIG_SYSFS=y
|
|||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -755,11 +833,12 @@ CONFIG_RAMFS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
# CONFIG_JFFS2_RUBIN is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
|
@ -789,7 +868,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="cp437"
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
|
@ -813,7 +892,7 @@ CONFIG_NLS_CODEPAGE_437=m
|
|||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
|
@ -826,7 +905,7 @@ CONFIG_NLS_ISO8859_1=m
|
|||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
CONFIG_NLS_UTF8=m
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
|
@ -837,20 +916,23 @@ CONFIG_NLS_UTF8=m
|
|||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# 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_DEBUG_USER is not set
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -874,7 +956,7 @@ CONFIG_DEBUG_ERRORS=y
|
|||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC_CCITT=y
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
|
|
|
@ -1,50 +1,55 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Mon Mar 28 00:20:50 2005
|
||||
# Linux kernel version: 2.6.17-rc3
|
||||
# Mon May 8 20:15:57 2006
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# 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 is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=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
|
||||
CONFIG_OBSOLETE_INTERMODULE=y
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
|
@ -52,11 +57,28 @@ 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
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_BLK_DEV_IO_TRACE 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"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
|
@ -64,11 +86,13 @@ CONFIG_KMOD=y
|
|||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_EP93XX is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_IXP23XX is not set
|
||||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
|
@ -78,14 +102,17 @@ CONFIG_KMOD=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
CONFIG_ARCH_VERSATILE=y
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
# CONFIG_ARCH_AT91RM9200 is not set
|
||||
|
||||
#
|
||||
# Versatile platform type
|
||||
#
|
||||
CONFIG_ARCH_VERSATILE_PB=y
|
||||
# CONFIG_MACH_VERSATILE_AB is not set
|
||||
CONFIG_MACH_VERSATILE_AB=y
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -106,12 +133,14 @@ CONFIG_ARM_THUMB=y
|
|||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||
CONFIG_ARM_VIC=y
|
||||
CONFIG_ICST307=y
|
||||
|
||||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ARM_AMBA=y
|
||||
# CONFIG_PCI is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -122,6 +151,18 @@ CONFIG_ARM_AMBA=y
|
|||
# Kernel Features
|
||||
#
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
CONFIG_HZ=100
|
||||
# CONFIG_AEABI is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
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=4096
|
||||
CONFIG_LEDS=y
|
||||
CONFIG_LEDS_TIMER=y
|
||||
CONFIG_LEDS_CPU=y
|
||||
|
@ -145,7 +186,7 @@ CONFIG_CMDLINE="root=1f03 mem=32M"
|
|||
CONFIG_FPE_NWFPE=y
|
||||
# CONFIG_FPE_NWFPE_XP is not set
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
# CONFIG_VFP is not set
|
||||
CONFIG_VFP=y
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
|
@ -159,8 +200,91 @@ CONFIG_BINFMT_ELF=y
|
|||
# Power management options
|
||||
#
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_LEGACY=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
# CONFIG_APM is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
# CONFIG_IP_PNP_DHCP is not set
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# 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_INET_DIAG is not set
|
||||
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
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# 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
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -173,6 +297,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
|
|||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
|
@ -192,6 +321,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -214,6 +344,7 @@ CONFIG_MTD_CFI_I1=y
|
|||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_OTP is not set
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
# CONFIG_MTD_CFI_AMDSTD is not set
|
||||
# CONFIG_MTD_CFI_STAA is not set
|
||||
|
@ -221,7 +352,7 @@ CONFIG_MTD_CFI_UTIL=y
|
|||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
# CONFIG_MTD_XIP is not set
|
||||
# CONFIG_MTD_OBSOLETE_CHIPS is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
|
@ -229,7 +360,7 @@ CONFIG_MTD_CFI_UTIL=y
|
|||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
CONFIG_MTD_ARM_INTEGRATOR=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
|
@ -237,7 +368,6 @@ CONFIG_MTD_ARM_INTEGRATOR=y
|
|||
# CONFIG_MTD_SLRAM is not set
|
||||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLKMTD is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
|
||||
#
|
||||
|
@ -252,6 +382,11 @@ CONFIG_MTD_ARM_INTEGRATOR=y
|
|||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
|
@ -264,7 +399,6 @@ CONFIG_MTD_ARM_INTEGRATOR=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
|
@ -272,21 +406,13 @@ CONFIG_BLK_DEV_RAM=y
|
|||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD 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
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
|
@ -297,6 +423,7 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -307,83 +434,26 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
# CONFIG_IP_PNP_DHCP is not set
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# 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_NETPOLL 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_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_SMC91X=y
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
|
@ -410,6 +480,8 @@ CONFIG_SMC91X=y
|
|||
# CONFIG_SLIP 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
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -459,7 +531,6 @@ CONFIG_SERIO_AMBAKMI=y
|
|||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -474,17 +545,16 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
CONFIG_SERIAL_8250=m
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
CONFIG_SERIAL_8250_MULTIPORT=y
|
||||
CONFIG_SERIAL_8250_RSA=y
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
|
@ -503,20 +573,19 @@ CONFIG_LEGACY_PTY_COUNT=16
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -534,59 +603,59 @@ CONFIG_I2C_ALGOBIT=y
|
|||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
#
|
||||
CONFIG_I2C_SENSOR=m
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM75 is not set
|
||||
# CONFIG_SENSORS_LM77 is not set
|
||||
# CONFIG_SENSORS_LM78 is not set
|
||||
# CONFIG_SENSORS_LM80 is not set
|
||||
# CONFIG_SENSORS_LM83 is not set
|
||||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=m
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -604,27 +673,31 @@ CONFIG_FB=y
|
|||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
CONFIG_FB_ARMCLCD=y
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_FONTS=y
|
||||
# CONFIG_FONT_8x8 is not set
|
||||
# CONFIG_FONT_8x16 is not set
|
||||
# CONFIG_FONT_6x11 is not set
|
||||
# CONFIG_FONT_7x14 is not set
|
||||
# CONFIG_FONT_PEARL_8x8 is not set
|
||||
CONFIG_FONT_ACORN_8x8=y
|
||||
# CONFIG_FONT_MINI_4x6 is not set
|
||||
# CONFIG_FONT_SUN8x16 is not set
|
||||
# CONFIG_FONT_SUN12x22 is not set
|
||||
# CONFIG_FONT_10x18 is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
|
@ -647,12 +720,18 @@ CONFIG_SND_PCM=m
|
|||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
CONFIG_SND_SUPPORT_OLD_API=y
|
||||
CONFIG_SND_VERBOSE_PROCFS=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
|
||||
#
|
||||
# Generic devices
|
||||
#
|
||||
CONFIG_SND_AC97_CODEC=m
|
||||
CONFIG_SND_AC97_BUS=m
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
|
@ -661,6 +740,7 @@ CONFIG_SND_PCM_OSS=m
|
|||
#
|
||||
# ALSA ARM devices
|
||||
#
|
||||
CONFIG_SND_ARMAACI=m
|
||||
|
||||
#
|
||||
# Open Sound System
|
||||
|
@ -672,8 +752,13 @@ CONFIG_SND_PCM_OSS=m
|
|||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -687,26 +772,32 @@ CONFIG_MMC=y
|
|||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_ARMMMCI=m
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS 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=y
|
||||
CONFIG_ROMFS_FS=y
|
||||
# CONFIG_INOTIFY is not set
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
|
@ -729,11 +820,10 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
# CONFIG_TMPFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
|
@ -748,8 +838,8 @@ CONFIG_RAMFS=y
|
|||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_NAND is not set
|
||||
# CONFIG_JFFS2_FS_NOR_ECC is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
|
@ -766,16 +856,19 @@ CONFIG_CRAMFS=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
# CONFIG_NFSD_V3_ACL is not set
|
||||
# CONFIG_NFSD_V4 is not set
|
||||
# CONFIG_NFSD_TCP is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -784,6 +877,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -803,6 +897,7 @@ CONFIG_MSDOS_PARTITION=y
|
|||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
|
||||
#
|
||||
|
@ -858,18 +953,24 @@ CONFIG_NLS_ISO8859_1=m
|
|||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB 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_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# 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_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -895,6 +996,7 @@ CONFIG_DEBUG_LL=y
|
|||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
|
|
|
@ -95,5 +95,13 @@ int main(void)
|
|||
DEFINE(SYS_ERROR0, 0x9f0000);
|
||||
BLANK();
|
||||
DEFINE(SIZEOF_MACHINE_DESC, sizeof(struct machine_desc));
|
||||
DEFINE(MACHINFO_TYPE, offsetof(struct machine_desc, nr));
|
||||
DEFINE(MACHINFO_NAME, offsetof(struct machine_desc, name));
|
||||
DEFINE(MACHINFO_PHYSIO, offsetof(struct machine_desc, phys_io));
|
||||
DEFINE(MACHINFO_PGOFFIO, offsetof(struct machine_desc, io_pg_offst));
|
||||
BLANK();
|
||||
DEFINE(PROC_INFO_SZ, sizeof(struct proc_info_list));
|
||||
DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush));
|
||||
DEFINE(PROCINFO_MMUFLAGS, offsetof(struct proc_info_list, __cpu_mmu_flags));
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -143,12 +143,23 @@ static struct dma_ops isa_dma_ops = {
|
|||
.residue = isa_get_dma_residue,
|
||||
};
|
||||
|
||||
static struct resource dma_resources[] = {
|
||||
{ "dma1", 0x0000, 0x000f },
|
||||
{ "dma low page", 0x0080, 0x008f },
|
||||
{ "dma2", 0x00c0, 0x00df },
|
||||
{ "dma high page", 0x0480, 0x048f }
|
||||
};
|
||||
static struct resource dma_resources[] = { {
|
||||
.name = "dma1",
|
||||
.start = 0x0000,
|
||||
.end = 0x000f
|
||||
}, {
|
||||
.name = "dma low page",
|
||||
.start = 0x0080,
|
||||
.end = 0x008f
|
||||
}, {
|
||||
.name = "dma2",
|
||||
.start = 0x00c0,
|
||||
.end = 0x00df
|
||||
}, {
|
||||
.name = "dma high page",
|
||||
.start = 0x0480,
|
||||
.end = 0x048f
|
||||
} };
|
||||
|
||||
void __init isa_init_dma(dma_t *dma)
|
||||
{
|
||||
|
|
|
@ -20,12 +20,10 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <asm/procinfo.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define PROCINFO_INITFUNC 12
|
||||
#define MACHINFO_TYPE 0
|
||||
|
||||
/*
|
||||
* Kernel startup entry point.
|
||||
* ---------------------------
|
||||
|
|
|
@ -24,14 +24,6 @@
|
|||
#include <asm/thread_info.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define PROCINFO_MMUFLAGS 8
|
||||
#define PROCINFO_INITFUNC 12
|
||||
|
||||
#define MACHINFO_TYPE 0
|
||||
#define MACHINFO_PHYSIO 4
|
||||
#define MACHINFO_PGOFFIO 8
|
||||
#define MACHINFO_NAME 12
|
||||
|
||||
#define KERNEL_RAM_ADDR (PAGE_OFFSET + TEXT_OFFSET)
|
||||
|
||||
/*
|
||||
|
|
|
@ -264,8 +264,12 @@ void show_fpregs(struct user_fp *regs)
|
|||
/*
|
||||
* Task structure and kernel stack allocation.
|
||||
*/
|
||||
static unsigned long *thread_info_head;
|
||||
static unsigned int nr_thread_info;
|
||||
struct thread_info_list {
|
||||
unsigned long *head;
|
||||
unsigned int nr;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct thread_info_list, thread_info_list) = { NULL, 0 };
|
||||
|
||||
#define EXTRA_TASK_STRUCT 4
|
||||
|
||||
|
@ -274,12 +278,15 @@ struct thread_info *alloc_thread_info(struct task_struct *task)
|
|||
struct thread_info *thread = NULL;
|
||||
|
||||
if (EXTRA_TASK_STRUCT) {
|
||||
unsigned long *p = thread_info_head;
|
||||
struct thread_info_list *th = &get_cpu_var(thread_info_list);
|
||||
unsigned long *p = th->head;
|
||||
|
||||
if (p) {
|
||||
thread_info_head = (unsigned long *)p[0];
|
||||
nr_thread_info -= 1;
|
||||
th->head = (unsigned long *)p[0];
|
||||
th->nr -= 1;
|
||||
}
|
||||
put_cpu_var(thread_info_list);
|
||||
|
||||
thread = (struct thread_info *)p;
|
||||
}
|
||||
|
||||
|
@ -300,13 +307,19 @@ struct thread_info *alloc_thread_info(struct task_struct *task)
|
|||
|
||||
void free_thread_info(struct thread_info *thread)
|
||||
{
|
||||
if (EXTRA_TASK_STRUCT && nr_thread_info < EXTRA_TASK_STRUCT) {
|
||||
unsigned long *p = (unsigned long *)thread;
|
||||
p[0] = (unsigned long)thread_info_head;
|
||||
thread_info_head = p;
|
||||
nr_thread_info += 1;
|
||||
} else
|
||||
free_pages((unsigned long)thread, THREAD_SIZE_ORDER);
|
||||
if (EXTRA_TASK_STRUCT) {
|
||||
struct thread_info_list *th = &get_cpu_var(thread_info_list);
|
||||
if (th->nr < EXTRA_TASK_STRUCT) {
|
||||
unsigned long *p = (unsigned long *)thread;
|
||||
p[0] = (unsigned long)th->head;
|
||||
th->head = p;
|
||||
th->nr += 1;
|
||||
put_cpu_var(thread_info_list);
|
||||
return;
|
||||
}
|
||||
put_cpu_var(thread_info_list);
|
||||
}
|
||||
free_pages((unsigned long)thread, THREAD_SIZE_ORDER);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -122,7 +122,7 @@ ENTRY(c_backtrace)
|
|||
#define reg r5
|
||||
#define stack r6
|
||||
|
||||
.Ldumpstm: stmfd sp!, {instr, reg, stack, r7, lr}
|
||||
.Ldumpstm: stmfd sp!, {instr, reg, stack, r7, r8, lr}
|
||||
mov stack, r0
|
||||
mov instr, r1
|
||||
mov reg, #9
|
||||
|
@ -145,7 +145,7 @@ ENTRY(c_backtrace)
|
|||
adrne r0, .Lcr
|
||||
blne printk
|
||||
mov r0, stack
|
||||
LOADREGS(fd, sp!, {instr, reg, stack, r7, pc})
|
||||
LOADREGS(fd, sp!, {instr, reg, stack, r7, r8, pc})
|
||||
|
||||
.Lfp: .asciz " r%d = %08X%c"
|
||||
.Lcr: .asciz "\n"
|
||||
|
|
|
@ -189,12 +189,12 @@ ENTRY(__do_div64)
|
|||
moveq pc, lr
|
||||
|
||||
@ Division by 0:
|
||||
str lr, [sp, #-4]!
|
||||
str lr, [sp, #-8]!
|
||||
bl __div0
|
||||
|
||||
@ as wrong as it could be...
|
||||
mov yl, #0
|
||||
mov yh, #0
|
||||
mov xh, #0
|
||||
ldr pc, [sp], #4
|
||||
ldr pc, [sp], #8
|
||||
|
||||
|
|
|
@ -79,7 +79,12 @@ static void __init aaed2000_init(void)
|
|||
}
|
||||
|
||||
static struct map_desc aaed2000_io_desc[] __initdata = {
|
||||
{ EXT_GPIO_VBASE, EXT_GPIO_PBASE, EXT_GPIO_LENGTH, MT_DEVICE }, /* Ext GPIO */
|
||||
{
|
||||
.virtual = EXT_GPIO_VBASE,
|
||||
.pfn = __phys_to_pfn(EXT_GPIO_PBASE),
|
||||
.length = EXT_GPIO_LENGTH,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
};
|
||||
|
||||
static void __init aaed2000_map_io(void)
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/amba/bus.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -50,12 +49,12 @@
|
|||
static struct map_desc standard_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = VIO_APB_BASE,
|
||||
.physical = __phys_to_pfn(PIO_APB_BASE),
|
||||
.pfn = __phys_to_pfn(PIO_APB_BASE),
|
||||
.length = IO_APB_LENGTH,
|
||||
.type = MT_DEVICE
|
||||
}, {
|
||||
.virtual = VIO_AHB_BASE,
|
||||
.physical = __phys_to_pfn(PIO_AHB_BASE),
|
||||
.pfn = __phys_to_pfn(PIO_AHB_BASE),
|
||||
.length = IO_AHB_LENGTH,
|
||||
.type = MT_DEVICE
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/amba/clcd.h>
|
||||
|
||||
struct sys_timer;
|
||||
|
|
|
@ -161,7 +161,7 @@ mx1ads_map_io(void)
|
|||
MACHINE_START(MX1ADS, "Motorola MX1ADS")
|
||||
/* Maintainer: Sascha Hauer, Pengutronix */
|
||||
.phys_io = 0x00200000,
|
||||
.io_pg_offst = ((0xe0200000) >> 18) & 0xfffc,
|
||||
.io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0x08000100,
|
||||
.map_io = mx1ads_map_io,
|
||||
.init_irq = imx_init_irq,
|
||||
|
|
|
@ -45,23 +45,16 @@ int pxa_request_dma (char *name, pxa_dma_prio prio,
|
|||
|
||||
local_irq_save(flags);
|
||||
|
||||
/* try grabbing a DMA channel with the requested priority */
|
||||
for (i = prio; i < prio + PXA_DMA_NBCH(prio); i++) {
|
||||
if (!dma_channels[i].name) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
/* requested prio group is full, try hier priorities */
|
||||
for (i = prio-1; i >= 0; i--) {
|
||||
do {
|
||||
/* try grabbing a DMA channel with the requested priority */
|
||||
pxa_for_each_dma_prio (i, prio) {
|
||||
if (!dma_channels[i].name) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* if requested prio group is full, try a hier priority */
|
||||
} while (!found && prio--);
|
||||
|
||||
if (found) {
|
||||
DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR;
|
||||
|
|
|
@ -137,8 +137,11 @@ static struct amba_device *amba_devs[] __initdata = {
|
|||
static void __init gic_init_irq(void)
|
||||
{
|
||||
#ifdef CONFIG_REALVIEW_MPCORE
|
||||
unsigned int pldctrl;
|
||||
writel(0x0000a05f, __io_address(REALVIEW_SYS_LOCK));
|
||||
writel(0x008003c0, __io_address(REALVIEW_SYS_BASE) + 0xd8);
|
||||
pldctrl = readl(__io_address(REALVIEW_SYS_BASE) + 0xd8);
|
||||
pldctrl |= 0x00800000; /* New irq mode */
|
||||
writel(pldctrl, __io_address(REALVIEW_SYS_BASE) + 0xd8);
|
||||
writel(0x00000000, __io_address(REALVIEW_SYS_LOCK));
|
||||
#endif
|
||||
gic_dist_init(__io_address(REALVIEW_GIC_DIST_BASE));
|
||||
|
|
|
@ -199,10 +199,26 @@ static void sa1100_unmask_irq(unsigned int irq)
|
|||
ICMR |= (1 << irq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Apart form GPIOs, only the RTC alarm can be a wakeup event.
|
||||
*/
|
||||
static int sa1100_set_wake(unsigned int irq, unsigned int on)
|
||||
{
|
||||
if (irq == IRQ_RTCAlrm) {
|
||||
if (on)
|
||||
PWER |= PWER_RTC;
|
||||
else
|
||||
PWER &= ~PWER_RTC;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct irqchip sa1100_normal_chip = {
|
||||
.ack = sa1100_mask_irq,
|
||||
.mask = sa1100_mask_irq,
|
||||
.unmask = sa1100_unmask_irq,
|
||||
.set_wake = sa1100_set_wake,
|
||||
};
|
||||
|
||||
static struct resource irq_resource = {
|
||||
|
|
|
@ -141,7 +141,7 @@ __ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
|
|||
return NULL;
|
||||
addr = (unsigned long)area->addr;
|
||||
if (remap_area_pages(addr, pfn, size, flags)) {
|
||||
vfree((void *)addr);
|
||||
vunmap((void *)addr);
|
||||
return NULL;
|
||||
}
|
||||
return (void __iomem *) (offset + (char *)addr);
|
||||
|
@ -173,7 +173,7 @@ EXPORT_SYMBOL(__ioremap);
|
|||
|
||||
void __iounmap(void __iomem *addr)
|
||||
{
|
||||
vfree((void *) (PAGE_MASK & (unsigned long) addr));
|
||||
vunmap((void *)(PAGE_MASK & (unsigned long)addr));
|
||||
}
|
||||
EXPORT_SYMBOL(__iounmap);
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||
#
|
||||
# Last update: Mon Feb 20 10:18:02 2006
|
||||
# Last update: Mon May 8 20:11:05 2006
|
||||
#
|
||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||
#
|
||||
|
@ -566,8 +566,8 @@ switchgrass MACH_SWITCHGRASS SWITCHGRASS 549
|
|||
ens_cmu MACH_ENS_CMU ENS_CMU 550
|
||||
mm6_sdb MACH_MM6_SDB MM6_SDB 551
|
||||
saturn MACH_SATURN SATURN 552
|
||||
argonplusevb MACH_ARGONPLUSEVB ARGONPLUSEVB 553
|
||||
scma11evb MACH_SCMA11EVB SCMA11EVB 554
|
||||
i30030evb MACH_ARGONPLUSEVB ARGONPLUSEVB 553
|
||||
mxc27530evb MACH_SCMA11EVB SCMA11EVB 554
|
||||
smdk2800 MACH_SMDK2800 SMDK2800 555
|
||||
mtwilson MACH_MTWILSON MTWILSON 556
|
||||
ziti MACH_ZITI ZITI 557
|
||||
|
@ -647,7 +647,7 @@ sendt MACH_SENDT SENDT 630
|
|||
mx2jazz MACH_MX2JAZZ MX2JAZZ 631
|
||||
multiio MACH_MULTIIO MULTIIO 632
|
||||
hrdisplay MACH_HRDISPLAY HRDISPLAY 633
|
||||
scma11bb MACH_SCMA11BB SCMA11BB 634
|
||||
mxc27530ads MACH_SCMA11BB SCMA11BB 634
|
||||
trizeps3 MACH_TRIZEPS3 TRIZEPS3 635
|
||||
zefeerdza MACH_ZEFEERDZA ZEFEERDZA 636
|
||||
zefeerdzb MACH_ZEFEERDZB ZEFEERDZB 637
|
||||
|
@ -721,7 +721,7 @@ gp32 MACH_GP32 GP32 706
|
|||
gem MACH_GEM GEM 707
|
||||
i858 MACH_I858 I858 708
|
||||
hx2750 MACH_HX2750 HX2750 709
|
||||
zeusevb MACH_ZEUSEVB ZEUSEVB 710
|
||||
mxc91131evb MACH_ZEUSEVB ZEUSEVB 710
|
||||
p700 MACH_P700 P700 711
|
||||
cpe MACH_CPE CPE 712
|
||||
spitz MACH_SPITZ SPITZ 713
|
||||
|
@ -802,7 +802,7 @@ cpuat91 MACH_CPUAT91 CPUAT91 787
|
|||
rea9200 MACH_REA9200 REA9200 788
|
||||
acts_pune_sa1110 MACH_ACTS_PUNE_SA1110 ACTS_PUNE_SA1110 789
|
||||
ixp425 MACH_IXP425 IXP425 790
|
||||
argonplusodyssey MACH_ARGONPLUSODYSSEY ARGONPLUSODYSSEY 791
|
||||
i30030ads MACH_ARGONPLUSODYSSEY ARGONPLUSODYSSEY 791
|
||||
perch MACH_PERCH PERCH 792
|
||||
eis05r1 MACH_EIS05R1 EIS05R1 793
|
||||
pepperpad MACH_PEPPERPAD PEPPERPAD 794
|
||||
|
@ -827,7 +827,7 @@ micro9l MACH_MICRO9L MICRO9L 812
|
|||
uc5471dsp MACH_UC5471DSP UC5471DSP 813
|
||||
sj5471eng MACH_SJ5471ENG SJ5471ENG 814
|
||||
none MACH_CMPXA26X CMPXA26X 815
|
||||
nc MACH_NC NC 816
|
||||
nc1 MACH_NC NC 816
|
||||
omap_palmte MACH_OMAP_PALMTE OMAP_PALMTE 817
|
||||
ajax52x MACH_AJAX52X AJAX52X 818
|
||||
siriustar MACH_SIRIUSTAR SIRIUSTAR 819
|
||||
|
@ -930,7 +930,7 @@ netclient MACH_NETCLIENT NETCLIENT 916
|
|||
xscale_palmtt5 MACH_XSCALE_PALMTT5 XSCALE_PALMTT5 917
|
||||
xscale_palmtc MACH_OMAP_PALMTC OMAP_PALMTC 918
|
||||
omap_apollon MACH_OMAP_APOLLON OMAP_APOLLON 919
|
||||
argonlvevb MACH_ARGONLVEVB ARGONLVEVB 920
|
||||
mxc30030evb MACH_ARGONLVEVB ARGONLVEVB 920
|
||||
rea_2d MACH_REA_2D REA_2D 921
|
||||
eti3e524 MACH_TI3E524 TI3E524 922
|
||||
ateb9200 MACH_ATEB9200 ATEB9200 923
|
||||
|
@ -965,7 +965,78 @@ sisteron MACH_SISTERON SISTERON 951
|
|||
rx1950 MACH_RX1950 RX1950 952
|
||||
tsc_venus MACH_TSC_VENUS TSC_VENUS 953
|
||||
ds101j MACH_DS101J DS101J 954
|
||||
mxc300_30ads MACH_MXC30030ADS MXC30030ADS 955
|
||||
mxc30030ads MACH_MXC30030ADS MXC30030ADS 955
|
||||
fujitsu_wimaxsoc MACH_FUJITSU_WIMAXSOC FUJITSU_WIMAXSOC 956
|
||||
dualpcmodem MACH_DUALPCMODEM DUALPCMODEM 957
|
||||
gesbc9312 MACH_GESBC9312 GESBC9312 958
|
||||
htcapache MACH_HTCAPACHE HTCAPACHE 959
|
||||
ixdp435 MACH_IXDP435 IXDP435 960
|
||||
catprovt100 MACH_CATPROVT100 CATPROVT100 961
|
||||
picotux1xx MACH_PICOTUX1XX PICOTUX1XX 962
|
||||
picotux2xx MACH_PICOTUX2XX PICOTUX2XX 963
|
||||
dsmg600 MACH_DSMG600 DSMG600 964
|
||||
empc2 MACH_EMPC2 EMPC2 965
|
||||
ventura MACH_VENTURA VENTURA 966
|
||||
phidget_sbc MACH_PHIDGET_SBC PHIDGET_SBC 967
|
||||
ij3k MACH_IJ3K IJ3K 968
|
||||
pisgah MACH_PISGAH PISGAH 969
|
||||
omap_fsample MACH_OMAP_FSAMPLE OMAP_FSAMPLE 970
|
||||
sg720 MACH_SG720 SG720 971
|
||||
redfox MACH_REDFOX REDFOX 972
|
||||
mysh_ep9315_1 MACH_MYSH_EP9315_1 MYSH_EP9315_1 973
|
||||
tpf106 MACH_TPF106 TPF106 974
|
||||
at91rm9200kg MACH_AT91RM9200KG AT91RM9200KG 975
|
||||
racemt2 MACH_SLEDB SLEDB 976
|
||||
ontrack MACH_ONTRACK ONTRACK 977
|
||||
pm1200 MACH_PM1200 PM1200 978
|
||||
ess24562 MACH_ESS24XXX ESS24XXX 979
|
||||
coremp7 MACH_COREMP7 COREMP7 980
|
||||
nexcoder_6446 MACH_NEXCODER_6446 NEXCODER_6446 981
|
||||
stvc8380 MACH_STVC8380 STVC8380 982
|
||||
teklynx MACH_TEKLYNX TEKLYNX 983
|
||||
carbonado MACH_CARBONADO CARBONADO 984
|
||||
sysmos_mp730 MACH_SYSMOS_MP730 SYSMOS_MP730 985
|
||||
snapper_cl15 MACH_SNAPPER_CL15 SNAPPER_CL15 986
|
||||
pgigim MACH_PGIGIM PGIGIM 987
|
||||
ptx9160p2 MACH_PTX9160P2 PTX9160P2 988
|
||||
dcore1 MACH_DCORE1 DCORE1 989
|
||||
victorpxa MACH_VICTORPXA VICTORPXA 990
|
||||
mx2dtb MACH_MX2DTB MX2DTB 991
|
||||
pxa_irex_er0100 MACH_PXA_IREX_ER0100 PXA_IREX_ER0100 992
|
||||
omap_palmz71 MACH_OMAP_PALMZ71 OMAP_PALMZ71 993
|
||||
bartec_deg MACH_BARTEC_DEG BARTEC_DEG 994
|
||||
hw50251 MACH_HW50251 HW50251 995
|
||||
ibox MACH_IBOX IBOX 996
|
||||
atlaslh7a404 MACH_ATLASLH7A404 ATLASLH7A404 997
|
||||
pt2026 MACH_PT2026 PT2026 998
|
||||
htcalpine MACH_HTCALPINE HTCALPINE 999
|
||||
bartec_vtu MACH_BARTEC_VTU BARTEC_VTU 1000
|
||||
vcoreii MACH_VCOREII VCOREII 1001
|
||||
pdnb3 MACH_PDNB3 PDNB3 1002
|
||||
htcbeetles MACH_HTCBEETLES HTCBEETLES 1003
|
||||
s3c6400 MACH_S3C6400 S3C6400 1004
|
||||
s3c2443 MACH_S3C2443 S3C2443 1005
|
||||
omap_ldk MACH_OMAP_LDK OMAP_LDK 1006
|
||||
smdk2460 MACH_SMDK2460 SMDK2460 1007
|
||||
smdk2440 MACH_SMDK2440 SMDK2440 1008
|
||||
smdk2412 MACH_SMDK2412 SMDK2412 1009
|
||||
webbox MACH_WEBBOX WEBBOX 1010
|
||||
cwwndp MACH_CWWNDP CWWNDP 1011
|
||||
dragon MACH_DRAGON DRAGON 1012
|
||||
opendo_cpu_board MACH_OPENDO_CPU_BOARD OPENDO_CPU_BOARD 1013
|
||||
ccm2200 MACH_CCM2200 CCM2200 1014
|
||||
etwarm MACH_ETWARM ETWARM 1015
|
||||
m93030 MACH_M93030 M93030 1016
|
||||
cc7u MACH_CC7U CC7U 1017
|
||||
mtt_ranger MACH_MTT_RANGER MTT_RANGER 1018
|
||||
nexus MACH_NEXUS NEXUS 1019
|
||||
desman MACH_DESMAN DESMAN 1020
|
||||
bkde303 MACH_BKDE303 BKDE303 1021
|
||||
smdk2413 MACH_SMDK2413 SMDK2413 1022
|
||||
aml_m7200 MACH_AML_M7200 AML_M7200 1023
|
||||
aml_m5900 MACH_AML_M5900 AML_M5900 1024
|
||||
sg640 MACH_SG640 SG640 1025
|
||||
edg79524 MACH_EDG79524 EDG79524 1026
|
||||
ai2410 MACH_AI2410 AI2410 1027
|
||||
ixp465 MACH_IXP465 IXP465 1028
|
||||
balloon3 MACH_BALLOON3 BALLOON3 1029
|
||||
|
|
|
@ -245,7 +245,7 @@ void VFP9_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs)
|
|||
*/
|
||||
barrier();
|
||||
trigger = fmrx(FPINST2);
|
||||
fpscr = fmrx(FPSCR);
|
||||
orig_fpscr = fpscr = fmrx(FPSCR);
|
||||
|
||||
emulate:
|
||||
exceptions = vfp_emulate_instruction(trigger, fpscr, regs);
|
||||
|
|
|
@ -758,10 +758,10 @@ config HOTPLUG_CPU
|
|||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||
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.
|
||||
Say Y here to experiment with turning CPUs off and on, and to
|
||||
enable suspend on SMP systems. CPUs can be controlled through
|
||||
/sys/devices/system/cpu.
|
||||
|
||||
Say N.
|
||||
|
||||
endmenu
|
||||
|
||||
|
|
|
@ -1066,6 +1066,14 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = disable_acpi_pci,
|
||||
.ident = "HP xw9300",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP xw9300 Workstation"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -2238,6 +2238,8 @@ static inline void unlock_ExtINT_logic(void)
|
|||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
int timer_uses_ioapic_pin_0;
|
||||
|
||||
/*
|
||||
* This code may look a bit paranoid, but it's supposed to cooperate with
|
||||
* a wide range of boards and BIOS bugs. Fortunately only the timer IRQ
|
||||
|
@ -2274,6 +2276,9 @@ static inline void check_timer(void)
|
|||
pin2 = ioapic_i8259.pin;
|
||||
apic2 = ioapic_i8259.apic;
|
||||
|
||||
if (pin1 == 0)
|
||||
timer_uses_ioapic_pin_0 = 1;
|
||||
|
||||
printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
|
||||
vector, apic1, pin1, apic2, pin2);
|
||||
|
||||
|
|
|
@ -1130,7 +1130,17 @@ int mp_register_gsi (u32 gsi, int triggering, int polarity)
|
|||
*/
|
||||
int irq = gsi;
|
||||
if (gsi < MAX_GSI_NUM) {
|
||||
if (gsi > 15)
|
||||
/*
|
||||
* Retain the VIA chipset work-around (gsi > 15), but
|
||||
* avoid a problem where the 8254 timer (IRQ0) is setup
|
||||
* via an override (so it's not on pin 0 of the ioapic),
|
||||
* and at the same time, the pin 0 interrupt is a PCI
|
||||
* type. The gsi > 15 test could cause these two pins
|
||||
* to be shared as IRQ0, and they are not shareable.
|
||||
* So test for this condition, and if necessary, avoid
|
||||
* the pin collision.
|
||||
*/
|
||||
if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
|
||||
gsi = pci_irq++;
|
||||
/*
|
||||
* Don't assign IRQ used by ACPI SCI
|
||||
|
|
|
@ -1320,6 +1320,8 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat
|
|||
probe_roms();
|
||||
for (i = 0; i < e820.nr_map; i++) {
|
||||
struct resource *res;
|
||||
if (e820.map[i].addr + e820.map[i].size > 0x100000000ULL)
|
||||
continue;
|
||||
res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
|
||||
switch (e820.map[i].type) {
|
||||
case E820_RAM: res->name = "System RAM"; break;
|
||||
|
|
|
@ -332,10 +332,11 @@ static int __init ppro_init(char ** cpu_type)
|
|||
{
|
||||
__u8 cpu_model = boot_cpu_data.x86_model;
|
||||
|
||||
if (cpu_model > 0xd)
|
||||
if (cpu_model == 14)
|
||||
*cpu_type = "i386/core";
|
||||
else if (cpu_model > 0xd)
|
||||
return 0;
|
||||
|
||||
if (cpu_model == 9) {
|
||||
else if (cpu_model == 9) {
|
||||
*cpu_type = "i386/p6_mobile";
|
||||
} else if (cpu_model > 5) {
|
||||
*cpu_type = "i386/piii";
|
||||
|
|
|
@ -134,7 +134,7 @@ CONFIG_ARCH_FLATMEM_ENABLE=y
|
|||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_NODES_SHIFT=8
|
||||
CONFIG_NODES_SHIFT=10
|
||||
CONFIG_VIRTUAL_MEM_MAP=y
|
||||
CONFIG_HOLES_IN_ZONE=y
|
||||
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
|
||||
|
@ -1159,7 +1159,7 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
|||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# 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
|
||||
|
|
|
@ -416,7 +416,7 @@ iosapic_end_level_irq (unsigned int irq)
|
|||
ia64_vector vec = irq_to_vector(irq);
|
||||
struct iosapic_rte_info *rte;
|
||||
|
||||
move_irq(irq);
|
||||
move_native_irq(irq);
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
|
||||
iosapic_eoi(rte->addr, vec);
|
||||
}
|
||||
|
@ -458,7 +458,7 @@ iosapic_ack_edge_irq (unsigned int irq)
|
|||
{
|
||||
irq_desc_t *idesc = irq_descp(irq);
|
||||
|
||||
move_irq(irq);
|
||||
move_native_irq(irq);
|
||||
/*
|
||||
* Once we have recorded IRQ_PENDING already, we can mask the
|
||||
* interrupt for real. This prevents IRQ storms from unhandled
|
||||
|
|
|
@ -101,7 +101,6 @@ void set_irq_affinity_info (unsigned int irq, int hwid, int redir)
|
|||
|
||||
if (irq < NR_IRQS) {
|
||||
irq_affinity[irq] = mask;
|
||||
set_irq_info(irq, mask);
|
||||
irq_redir[irq] = (char) (redir & 0xff);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,9 @@
|
|||
* in1: source address
|
||||
* in2: number of bytes to copy
|
||||
* Output:
|
||||
* 0 if success, or number of byte NOT copied if error occurred.
|
||||
* for memcpy: return dest
|
||||
* for copy_user: return 0 if success,
|
||||
* or number of byte NOT copied if error occurred.
|
||||
*
|
||||
* Copyright (C) 2002 Intel Corp.
|
||||
* Copyright (C) 2002 Ken Chen <kenneth.w.chen@intel.com>
|
||||
|
@ -73,6 +75,7 @@ GLOBAL_ENTRY(memcpy)
|
|||
and r28=0x7,in0
|
||||
and r29=0x7,in1
|
||||
mov f6=f0
|
||||
mov retval=in0
|
||||
br.cond.sptk .common_code
|
||||
;;
|
||||
END(memcpy)
|
||||
|
@ -84,7 +87,7 @@ GLOBAL_ENTRY(__copy_user)
|
|||
mov f6=f1
|
||||
mov saved_in0=in0 // save dest pointer
|
||||
mov saved_in1=in1 // save src pointer
|
||||
mov saved_in2=in2 // save len
|
||||
mov retval=r0 // initialize return value
|
||||
;;
|
||||
.common_code:
|
||||
cmp.gt p15,p0=8,in2 // check for small size
|
||||
|
@ -92,7 +95,7 @@ GLOBAL_ENTRY(__copy_user)
|
|||
cmp.ne p14,p0=0,r29 // check src alignment
|
||||
add src0=0,in1
|
||||
sub r30=8,r28 // for .align_dest
|
||||
mov retval=r0 // initialize return value
|
||||
mov saved_in2=in2 // save len
|
||||
;;
|
||||
add dst0=0,in0
|
||||
add dst1=1,in0 // dest odd index
|
||||
|
|
|
@ -1555,7 +1555,7 @@ static int __init prom_find_machine_type(void)
|
|||
compat, sizeof(compat)-1);
|
||||
if (len <= 0)
|
||||
return PLATFORM_GENERIC;
|
||||
if (strncmp(compat, RELOC("chrp"), 4))
|
||||
if (strcmp(compat, RELOC("chrp")))
|
||||
return PLATFORM_GENERIC;
|
||||
|
||||
/* Default to pSeries. We need to know if we are running LPAR */
|
||||
|
|
|
@ -255,7 +255,7 @@ static int __init pSeries_init_panel(void)
|
|||
{
|
||||
/* Manually leave the kernel version on the panel. */
|
||||
ppc_md.progress("Linux ppc64\n", 0);
|
||||
ppc_md.progress(system_utsname.version, 0);
|
||||
ppc_md.progress(system_utsname.release, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -355,9 +355,7 @@ InstructionTLBMiss:
|
|||
|
||||
. = 0x1200
|
||||
DataStoreTLBMiss:
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
stw r3, 8(r0)
|
||||
#endif
|
||||
DO_8xx_CPU6(0x3f80, r3)
|
||||
mtspr SPRN_M_TW, r10 /* Save a couple of working registers */
|
||||
mfcr r10
|
||||
|
@ -417,9 +415,7 @@ DataStoreTLBMiss:
|
|||
lwz r11, 0(r0)
|
||||
mtcr r11
|
||||
lwz r11, 4(r0)
|
||||
#ifdef CONFIG_8xx_CPU6
|
||||
lwz r3, 8(r0)
|
||||
#endif
|
||||
rfi
|
||||
|
||||
/* This is an instruction TLB error on the MPC8xx. This could be due
|
||||
|
|
|
@ -1650,3 +1650,11 @@ sys_tee_wrapper:
|
|||
llgfr %r4,%r4 # size_t
|
||||
llgfr %r5,%r5 # unsigned int
|
||||
jg sys_tee
|
||||
|
||||
.globl compat_sys_vmsplice_wrapper
|
||||
compat_sys_vmsplice_wrapper:
|
||||
lgfr %r2,%r2 # int
|
||||
llgtr %r3,%r3 # compat_iovec *
|
||||
llgfr %r4,%r4 # unsigned int
|
||||
llgfr %r5,%r5 # unsigned int
|
||||
jg compat_sys_vmsplice
|
||||
|
|
|
@ -317,3 +317,4 @@ SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list_wrapp
|
|||
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)
|
||||
SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
|
||||
|
|
|
@ -249,18 +249,19 @@ static inline void stop_hz_timer(void)
|
|||
unsigned long flags;
|
||||
unsigned long seq, next;
|
||||
__u64 timer, todval;
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
if (sysctl_hz_timer != 0)
|
||||
return;
|
||||
|
||||
cpu_set(smp_processor_id(), nohz_cpu_mask);
|
||||
cpu_set(cpu, nohz_cpu_mask);
|
||||
|
||||
/*
|
||||
* Leave the clock comparator set up for the next timer
|
||||
* tick if either rcu or a softirq is pending.
|
||||
*/
|
||||
if (rcu_pending(smp_processor_id()) || local_softirq_pending()) {
|
||||
cpu_clear(smp_processor_id(), nohz_cpu_mask);
|
||||
if (rcu_needs_cpu(cpu) || local_softirq_pending()) {
|
||||
cpu_clear(cpu, nohz_cpu_mask);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -274,6 +274,11 @@ void *sbus_alloc_consistent(struct sbus_dev *sdev, long len, u32 *dma_addrp)
|
|||
if (mmu_map_dma_area(dma_addrp, va, res->start, len_total) != 0)
|
||||
goto err_noiommu;
|
||||
|
||||
/* Set the resource name, if known. */
|
||||
if (sdev) {
|
||||
res->name = sdev->prom_name;
|
||||
}
|
||||
|
||||
return (void *)res->start;
|
||||
|
||||
err_noiommu:
|
||||
|
|
|
@ -113,6 +113,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
|
|||
|
||||
switch (ELF32_R_TYPE(rel[i].r_info)) {
|
||||
case R_SPARC_32:
|
||||
case R_SPARC_UA32:
|
||||
location[0] = v >> 24;
|
||||
location[1] = v >> 16;
|
||||
location[2] = v >> 8;
|
||||
|
|
|
@ -251,19 +251,9 @@ EXPORT_SYMBOL(__prom_getchild);
|
|||
EXPORT_SYMBOL(__prom_getsibling);
|
||||
|
||||
/* sparc library symbols */
|
||||
EXPORT_SYMBOL(memchr);
|
||||
EXPORT_SYMBOL(memscan);
|
||||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strnlen);
|
||||
EXPORT_SYMBOL(strcpy);
|
||||
EXPORT_SYMBOL(strncpy);
|
||||
EXPORT_SYMBOL(strcat);
|
||||
EXPORT_SYMBOL(strncat);
|
||||
EXPORT_SYMBOL(strcmp);
|
||||
EXPORT_SYMBOL(strncmp);
|
||||
EXPORT_SYMBOL(strchr);
|
||||
EXPORT_SYMBOL(strrchr);
|
||||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(page_kernel);
|
||||
|
||||
/* Special internal versions of library functions. */
|
||||
|
@ -317,6 +307,3 @@ EXPORT_SYMBOL(do_BUG);
|
|||
|
||||
/* Sun Power Management Idle Handler */
|
||||
EXPORT_SYMBOL(pm_idle);
|
||||
|
||||
/* Binfmt_misc needs this */
|
||||
EXPORT_SYMBOL(sys_close);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16
|
||||
# Sun Apr 2 19:31:04 2006
|
||||
# Linux kernel version: 2.6.17-rc3
|
||||
# Fri May 12 12:43:49 2006
|
||||
#
|
||||
CONFIG_SPARC=y
|
||||
CONFIG_SPARC64=y
|
||||
|
@ -114,6 +114,7 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|||
CONFIG_HUGETLB_PAGE_SIZE_4MB=y
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_512K is not set
|
||||
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_LARGE_ALLOCS=y
|
||||
|
@ -430,7 +431,6 @@ CONFIG_ISCSI_TCP=m
|
|||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
# CONFIG_SCSI_QLOGICPTI is not set
|
||||
# CONFIG_SCSI_QLA_FC is not set
|
||||
|
@ -1042,9 +1042,7 @@ CONFIG_USB_HIDDEV=y
|
|||
# CONFIG_USB_ACECAD is not set
|
||||
# CONFIG_USB_KBTAB is not set
|
||||
# CONFIG_USB_POWERMATE is not set
|
||||
# CONFIG_USB_MTOUCH is not set
|
||||
# CONFIG_USB_ITMTOUCH is not set
|
||||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_TOUCHSCREEN is not set
|
||||
# CONFIG_USB_YEALINK is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
|
@ -1114,6 +1112,14 @@ CONFIG_USB_HIDDEV=y
|
|||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
|
@ -1303,6 +1309,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
|||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
|
|
|
@ -143,6 +143,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
|||
location[3] = v >> 0;
|
||||
break;
|
||||
|
||||
case R_SPARC_DISP32:
|
||||
v -= (Elf64_Addr) location;
|
||||
*loc32 = v;
|
||||
break;
|
||||
|
||||
case R_SPARC_WDISP30:
|
||||
v -= (Elf64_Addr) location;
|
||||
*loc32 = (*loc32 & ~0x3fffffff) |
|
||||
|
|
|
@ -76,6 +76,12 @@ static inline int bad_addr(unsigned long *addrp, unsigned long size)
|
|||
*addrp = __pa_symbol(&_end);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (last >= ebda_addr && addr < ebda_addr + ebda_size) {
|
||||
*addrp = ebda_addr + ebda_size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* XXX ramdisk image here? */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1777,6 +1777,8 @@ static inline void unlock_ExtINT_logic(void)
|
|||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
int timer_uses_ioapic_pin_0;
|
||||
|
||||
/*
|
||||
* This code may look a bit paranoid, but it's supposed to cooperate with
|
||||
* a wide range of boards and BIOS bugs. Fortunately only the timer IRQ
|
||||
|
@ -1814,6 +1816,9 @@ static inline void check_timer(void)
|
|||
pin2 = ioapic_i8259.pin;
|
||||
apic2 = ioapic_i8259.apic;
|
||||
|
||||
if (pin1 == 0)
|
||||
timer_uses_ioapic_pin_0 = 1;
|
||||
|
||||
apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
|
||||
vector, apic1, pin1, apic2, pin2);
|
||||
|
||||
|
|
|
@ -968,7 +968,17 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity)
|
|||
*/
|
||||
int irq = gsi;
|
||||
if (gsi < MAX_GSI_NUM) {
|
||||
if (gsi > 15)
|
||||
/*
|
||||
* Retain the VIA chipset work-around (gsi > 15), but
|
||||
* avoid a problem where the 8254 timer (IRQ0) is setup
|
||||
* via an override (so it's not on pin 0 of the ioapic),
|
||||
* and at the same time, the pin 0 interrupt is a PCI
|
||||
* type. The gsi > 15 test could cause these two pins
|
||||
* to be shared as IRQ0, and they are not shareable.
|
||||
* So test for this condition, and if necessary, avoid
|
||||
* the pin collision.
|
||||
*/
|
||||
if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
|
||||
gsi = pci_irq++;
|
||||
/*
|
||||
* Don't assign IRQ used by ACPI SCI
|
||||
|
|
|
@ -639,6 +639,14 @@ static int __init pci_iommu_init(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
for_all_nb(dev)
|
||||
i++;
|
||||
if (i > MAX_NB) {
|
||||
printk(KERN_ERR "PCI-GART: Too many northbridges (%ld). Disabled\n", i);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "PCI-DMA: using GART IOMMU.\n");
|
||||
aper_size = info.aper_size * 1024 * 1024;
|
||||
iommu_size = check_iommu_size(info.aper_base, aper_size);
|
||||
|
|
|
@ -12,9 +12,10 @@ static int
|
|||
check_addr(char *name, struct device *hwdev, dma_addr_t bus, size_t size)
|
||||
{
|
||||
if (hwdev && bus + size > *hwdev->dma_mask) {
|
||||
printk(KERN_ERR
|
||||
"nommu_%s: overflow %Lx+%lu of device mask %Lx\n",
|
||||
name, (long long)bus, size, (long long)*hwdev->dma_mask);
|
||||
if (*hwdev->dma_mask >= 0xffffffffULL)
|
||||
printk(KERN_ERR
|
||||
"nommu_%s: overflow %Lx+%lu of device mask %Lx\n",
|
||||
name, (long long)bus, size, (long long)*hwdev->dma_mask);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
|
|
@ -571,17 +571,28 @@ static inline void copy_edd(void)
|
|||
#endif
|
||||
|
||||
#define EBDA_ADDR_POINTER 0x40E
|
||||
static void __init reserve_ebda_region(void)
|
||||
|
||||
unsigned __initdata ebda_addr;
|
||||
unsigned __initdata ebda_size;
|
||||
|
||||
static void discover_ebda(void)
|
||||
{
|
||||
unsigned int addr;
|
||||
/**
|
||||
/*
|
||||
* there is a real-mode segmented pointer pointing to the
|
||||
* 4K EBDA area at 0x40E
|
||||
*/
|
||||
addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER);
|
||||
addr <<= 4;
|
||||
if (addr)
|
||||
reserve_bootmem_generic(addr, PAGE_SIZE);
|
||||
ebda_addr = *(unsigned short *)EBDA_ADDR_POINTER;
|
||||
ebda_addr <<= 4;
|
||||
|
||||
ebda_size = *(unsigned short *)(unsigned long)ebda_addr;
|
||||
|
||||
/* Round EBDA up to pages */
|
||||
if (ebda_size == 0)
|
||||
ebda_size = 1;
|
||||
ebda_size <<= 10;
|
||||
ebda_size = round_up(ebda_size + (ebda_addr & ~PAGE_MASK), PAGE_SIZE);
|
||||
if (ebda_size > 64*1024)
|
||||
ebda_size = 64*1024;
|
||||
}
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
|
@ -627,6 +638,8 @@ void __init setup_arch(char **cmdline_p)
|
|||
|
||||
check_efer();
|
||||
|
||||
discover_ebda();
|
||||
|
||||
init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
|
||||
|
||||
dmi_scan_machine();
|
||||
|
@ -669,7 +682,8 @@ void __init setup_arch(char **cmdline_p)
|
|||
reserve_bootmem_generic(0, PAGE_SIZE);
|
||||
|
||||
/* reserve ebda region */
|
||||
reserve_ebda_region();
|
||||
if (ebda_addr)
|
||||
reserve_bootmem_generic(ebda_addr, ebda_size);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
|
|
|
@ -102,6 +102,8 @@ static inline void preempt_conditional_cli(struct pt_regs *regs)
|
|||
{
|
||||
if (regs->eflags & X86_EFLAGS_IF)
|
||||
local_irq_disable();
|
||||
/* Make sure to not schedule here because we could be running
|
||||
on an exception stack. */
|
||||
preempt_enable_no_resched();
|
||||
}
|
||||
|
||||
|
@ -385,6 +387,7 @@ void out_of_line_bug(void)
|
|||
|
||||
static DEFINE_SPINLOCK(die_lock);
|
||||
static int die_owner = -1;
|
||||
static unsigned int die_nest_count;
|
||||
|
||||
unsigned __kprobes long oops_begin(void)
|
||||
{
|
||||
|
@ -399,6 +402,7 @@ unsigned __kprobes long oops_begin(void)
|
|||
else
|
||||
spin_lock(&die_lock);
|
||||
}
|
||||
die_nest_count++;
|
||||
die_owner = cpu;
|
||||
console_verbose();
|
||||
bust_spinlocks(1);
|
||||
|
@ -409,7 +413,13 @@ void __kprobes oops_end(unsigned long flags)
|
|||
{
|
||||
die_owner = -1;
|
||||
bust_spinlocks(0);
|
||||
spin_unlock_irqrestore(&die_lock, flags);
|
||||
die_nest_count--;
|
||||
if (die_nest_count)
|
||||
/* We still own the lock */
|
||||
local_irq_restore(flags);
|
||||
else
|
||||
/* Nest count reaches zero, release the lock. */
|
||||
spin_unlock_irqrestore(&die_lock, flags);
|
||||
if (panic_on_oops)
|
||||
panic("Oops");
|
||||
}
|
||||
|
@ -464,6 +474,8 @@ void __kprobes die_nmi(char *str, struct pt_regs *regs)
|
|||
panic("nmi watchdog");
|
||||
printk("console shuts up ...\n");
|
||||
oops_end(flags);
|
||||
nmi_exit();
|
||||
local_irq_enable();
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
||||
|
@ -473,8 +485,6 @@ static void __kprobes do_trap(int trapnr, int signr, char *str,
|
|||
{
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
conditional_sti(regs);
|
||||
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = trapnr;
|
||||
|
||||
|
@ -511,6 +521,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
|
|||
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
||||
== NOTIFY_STOP) \
|
||||
return; \
|
||||
conditional_sti(regs); \
|
||||
do_trap(trapnr, signr, str, regs, error_code, NULL); \
|
||||
}
|
||||
|
||||
|
@ -525,6 +536,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
|
|||
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
||||
== NOTIFY_STOP) \
|
||||
return; \
|
||||
conditional_sti(regs); \
|
||||
do_trap(trapnr, signr, str, regs, error_code, &info); \
|
||||
}
|
||||
|
||||
|
@ -538,7 +550,17 @@ DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
|
|||
DO_ERROR(11, SIGBUS, "segment not present", segment_not_present)
|
||||
DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
|
||||
DO_ERROR(18, SIGSEGV, "reserved", reserved)
|
||||
DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
|
||||
|
||||
/* Runs on IST stack */
|
||||
asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code)
|
||||
{
|
||||
if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
|
||||
12, SIGBUS) == NOTIFY_STOP)
|
||||
return;
|
||||
preempt_conditional_sti(regs);
|
||||
do_trap(12, SIGBUS, "stack segment", regs, error_code, NULL);
|
||||
preempt_conditional_cli(regs);
|
||||
}
|
||||
|
||||
asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
|
||||
{
|
||||
|
@ -672,8 +694,9 @@ asmlinkage void __kprobes do_int3(struct pt_regs * regs, long error_code)
|
|||
if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) {
|
||||
return;
|
||||
}
|
||||
preempt_conditional_sti(regs);
|
||||
do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
|
||||
return;
|
||||
preempt_conditional_cli(regs);
|
||||
}
|
||||
|
||||
/* Help handler running on IST stack to switch back to user stack
|
||||
|
|
|
@ -34,7 +34,10 @@ static nodemask_t nodes_found __initdata;
|
|||
static struct bootnode nodes[MAX_NUMNODES] __initdata;
|
||||
static struct bootnode nodes_add[MAX_NUMNODES] __initdata;
|
||||
static int found_add_area __initdata;
|
||||
int hotadd_percent __initdata = 10;
|
||||
int hotadd_percent __initdata = 0;
|
||||
#ifndef RESERVE_HOTADD
|
||||
#define hotadd_percent 0 /* Ignore all settings */
|
||||
#endif
|
||||
static u8 pxm2node[256] = { [0 ... 255] = 0xff };
|
||||
|
||||
/* Too small nodes confuse the VM badly. Usually they result
|
||||
|
@ -103,6 +106,7 @@ static __init void bad_srat(void)
|
|||
int i;
|
||||
printk(KERN_ERR "SRAT: SRAT not used.\n");
|
||||
acpi_numa = -1;
|
||||
found_add_area = 0;
|
||||
for (i = 0; i < MAX_LOCAL_APIC; i++)
|
||||
apicid_to_node[i] = NUMA_NO_NODE;
|
||||
for (i = 0; i < MAX_NUMNODES; i++)
|
||||
|
@ -154,7 +158,8 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
|
|||
int pxm, node;
|
||||
if (srat_disabled())
|
||||
return;
|
||||
if (pa->header.length != sizeof(struct acpi_table_processor_affinity)) { bad_srat();
|
||||
if (pa->header.length != sizeof(struct acpi_table_processor_affinity)) {
|
||||
bad_srat();
|
||||
return;
|
||||
}
|
||||
if (pa->flags.enabled == 0)
|
||||
|
@ -191,15 +196,17 @@ static int hotadd_enough_memory(struct bootnode *nd)
|
|||
allowed = (end_pfn - e820_hole_size(0, end_pfn)) * PAGE_SIZE;
|
||||
allowed = (allowed / 100) * hotadd_percent;
|
||||
if (allocated + mem > allowed) {
|
||||
unsigned long range;
|
||||
/* Give them at least part of their hotadd memory upto hotadd_percent
|
||||
It would be better to spread the limit out
|
||||
over multiple hotplug areas, but that is too complicated
|
||||
right now */
|
||||
if (allocated >= allowed)
|
||||
return 0;
|
||||
pages = (allowed - allocated + mem) / sizeof(struct page);
|
||||
range = allowed - allocated;
|
||||
pages = (range / PAGE_SIZE);
|
||||
mem = pages * sizeof(struct page);
|
||||
nd->end = nd->start + pages*PAGE_SIZE;
|
||||
nd->end = nd->start + range;
|
||||
}
|
||||
/* Not completely fool proof, but a good sanity check */
|
||||
addr = find_e820_area(last_area_end, end_pfn<<PAGE_SHIFT, mem);
|
||||
|
|
|
@ -333,6 +333,7 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
|||
{
|
||||
struct list_head *pos;
|
||||
unsigned ordseq;
|
||||
int unplug_it = 1;
|
||||
|
||||
blk_add_trace_rq(q, rq, BLK_TA_INSERT);
|
||||
|
||||
|
@ -399,6 +400,11 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
|||
}
|
||||
|
||||
list_add_tail(&rq->queuelist, pos);
|
||||
/*
|
||||
* most requeues happen because of a busy condition, don't
|
||||
* force unplug of the queue for that case.
|
||||
*/
|
||||
unplug_it = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -407,7 +413,7 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
|
|||
BUG();
|
||||
}
|
||||
|
||||
if (blk_queue_plugged(q)) {
|
||||
if (unplug_it && blk_queue_plugged(q)) {
|
||||
int nrq = q->rq.count[READ] + q->rq.count[WRITE]
|
||||
- q->in_flight;
|
||||
|
||||
|
|
|
@ -1732,8 +1732,21 @@ void blk_run_queue(struct request_queue *q)
|
|||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
blk_remove_plug(q);
|
||||
if (!elv_queue_empty(q))
|
||||
q->request_fn(q);
|
||||
|
||||
/*
|
||||
* Only recurse once to avoid overrunning the stack, let the unplug
|
||||
* handling reinvoke the handler shortly if we already got there.
|
||||
*/
|
||||
if (!elv_queue_empty(q)) {
|
||||
if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
|
||||
q->request_fn(q);
|
||||
clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
|
||||
} else {
|
||||
blk_plug_device(q);
|
||||
kblockd_schedule_work(&q->unplug_work);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(blk_run_queue);
|
||||
|
|
|
@ -456,6 +456,35 @@ static void class_device_remove_attrs(struct class_device * cd)
|
|||
}
|
||||
}
|
||||
|
||||
static int class_device_add_groups(struct class_device * cd)
|
||||
{
|
||||
int i;
|
||||
int error = 0;
|
||||
|
||||
if (cd->groups) {
|
||||
for (i = 0; cd->groups[i]; i++) {
|
||||
error = sysfs_create_group(&cd->kobj, cd->groups[i]);
|
||||
if (error) {
|
||||
while (--i >= 0)
|
||||
sysfs_remove_group(&cd->kobj, cd->groups[i]);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
static void class_device_remove_groups(struct class_device * cd)
|
||||
{
|
||||
int i;
|
||||
if (cd->groups) {
|
||||
for (i = 0; cd->groups[i]; i++) {
|
||||
sysfs_remove_group(&cd->kobj, cd->groups[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t show_dev(struct class_device *class_dev, char *buf)
|
||||
{
|
||||
return print_dev_t(buf, class_dev->devt);
|
||||
|
@ -559,6 +588,8 @@ int class_device_add(struct class_device *class_dev)
|
|||
class_name);
|
||||
}
|
||||
|
||||
class_device_add_groups(class_dev);
|
||||
|
||||
kobject_uevent(&class_dev->kobj, KOBJ_ADD);
|
||||
|
||||
/* notify any interfaces this device is now here */
|
||||
|
@ -672,6 +703,7 @@ void class_device_del(struct class_device *class_dev)
|
|||
if (class_dev->devt_attr)
|
||||
class_device_remove_file(class_dev, class_dev->devt_attr);
|
||||
class_device_remove_attrs(class_dev);
|
||||
class_device_remove_groups(class_dev);
|
||||
|
||||
kobject_uevent(&class_dev->kobj, KOBJ_REMOVE);
|
||||
kobject_del(&class_dev->kobj);
|
||||
|
|
|
@ -536,6 +536,9 @@ static void ub_cleanup(struct ub_dev *sc)
|
|||
kfree(lun);
|
||||
}
|
||||
|
||||
usb_set_intfdata(sc->intf, NULL);
|
||||
usb_put_intf(sc->intf);
|
||||
usb_put_dev(sc->dev);
|
||||
kfree(sc);
|
||||
}
|
||||
|
||||
|
@ -2221,7 +2224,12 @@ static int ub_probe(struct usb_interface *intf,
|
|||
// sc->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
usb_set_intfdata(intf, sc);
|
||||
usb_get_dev(sc->dev);
|
||||
// usb_get_intf(sc->intf); /* Do we need this? */
|
||||
/*
|
||||
* Since we give the interface struct to the block level through
|
||||
* disk->driverfs_dev, we have to pin it. Otherwise, block_uevent
|
||||
* oopses on close after a disconnect (kernels 2.6.16 and up).
|
||||
*/
|
||||
usb_get_intf(sc->intf);
|
||||
|
||||
snprintf(sc->name, 12, DRV_NAME "(%d.%d)",
|
||||
sc->dev->bus->busnum, sc->dev->devnum);
|
||||
|
@ -2286,7 +2294,7 @@ static int ub_probe(struct usb_interface *intf,
|
|||
|
||||
err_dev_desc:
|
||||
usb_set_intfdata(intf, NULL);
|
||||
// usb_put_intf(sc->intf);
|
||||
usb_put_intf(sc->intf);
|
||||
usb_put_dev(sc->dev);
|
||||
kfree(sc);
|
||||
err_core:
|
||||
|
@ -2461,12 +2469,6 @@ static void ub_disconnect(struct usb_interface *intf)
|
|||
* and no URBs left in transit.
|
||||
*/
|
||||
|
||||
usb_set_intfdata(intf, NULL);
|
||||
// usb_put_intf(sc->intf);
|
||||
sc->intf = NULL;
|
||||
usb_put_dev(sc->dev);
|
||||
sc->dev = NULL;
|
||||
|
||||
ub_put(sc);
|
||||
}
|
||||
|
||||
|
|
|
@ -291,7 +291,7 @@ config SX
|
|||
|
||||
config RIO
|
||||
tristate "Specialix RIO system support"
|
||||
depends on SERIAL_NONSTANDARD && !64BIT
|
||||
depends on SERIAL_NONSTANDARD
|
||||
help
|
||||
This is a driver for the Specialix RIO, a smart serial card which
|
||||
drives an outboard box that can support up to 128 ports. Product
|
||||
|
|
|
@ -1981,10 +1981,6 @@ static int __init cmm_init(void)
|
|||
if (!cmm_class)
|
||||
return -1;
|
||||
|
||||
rc = pcmcia_register_driver(&cm4000_driver);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
|
||||
if (major < 0) {
|
||||
printk(KERN_WARNING MODULE_NAME
|
||||
|
@ -1992,6 +1988,12 @@ static int __init cmm_init(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
rc = pcmcia_register_driver(&cm4000_driver);
|
||||
if (rc < 0) {
|
||||
unregister_chrdev(major, DEVICE_NAME);
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -724,16 +724,19 @@ static int __init cm4040_init(void)
|
|||
if (!cmx_class)
|
||||
return -1;
|
||||
|
||||
rc = pcmcia_register_driver(&reader_driver);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
major = register_chrdev(0, DEVICE_NAME, &reader_fops);
|
||||
if (major < 0) {
|
||||
printk(KERN_WARNING MODULE_NAME
|
||||
": could not get major number\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = pcmcia_register_driver(&reader_driver);
|
||||
if (rc < 0) {
|
||||
unregister_chrdev(major, DEVICE_NAME);
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,12 +33,6 @@
|
|||
#ifndef __rio_host_h__
|
||||
#define __rio_host_h__
|
||||
|
||||
#ifdef SCCS_LABELS
|
||||
#ifndef lint
|
||||
static char *_host_h_sccs_ = "@(#)host.h 1.2";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
** the host structure - one per host card in the system.
|
||||
*/
|
||||
|
@ -77,9 +71,6 @@ struct Host {
|
|||
#define RC_STARTUP 1
|
||||
#define RC_RUNNING 2
|
||||
#define RC_STUFFED 3
|
||||
#define RC_SOMETHING 4
|
||||
#define RC_SOMETHING_NEW 5
|
||||
#define RC_SOMETHING_ELSE 6
|
||||
#define RC_READY 7
|
||||
#define RUN_STATE 7
|
||||
/*
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <linux/generic_serial.h>
|
||||
#include <linux/errno.h>
|
||||
|
|
|
@ -1394,14 +1394,17 @@ int RIOPreemptiveCmd(struct rio_info *p, struct Port *PortP, u8 Cmd)
|
|||
return RIO_FAIL;
|
||||
}
|
||||
|
||||
if (((int) ((char) PortP->InUse) == -1) || !(CmdBlkP = RIOGetCmdBlk())) {
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Cannot allocate command block for command %d on port %d\n", Cmd, PortP->PortNum);
|
||||
if ((PortP->InUse == (typeof(PortP->InUse))-1) ||
|
||||
!(CmdBlkP = RIOGetCmdBlk())) {
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Cannot allocate command block "
|
||||
"for command %d on port %d\n", Cmd, PortP->PortNum);
|
||||
return RIO_FAIL;
|
||||
}
|
||||
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Command blk %p - InUse now %d\n", CmdBlkP, PortP->InUse);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Command blk %p - InUse now %d\n",
|
||||
CmdBlkP, PortP->InUse);
|
||||
|
||||
PktCmdP = (struct PktCmd_M *) &CmdBlkP->Packet.data[0];
|
||||
PktCmdP = (struct PktCmd_M *)&CmdBlkP->Packet.data[0];
|
||||
|
||||
CmdBlkP->Packet.src_unit = 0;
|
||||
if (PortP->SecondBlock)
|
||||
|
@ -1425,38 +1428,46 @@ int RIOPreemptiveCmd(struct rio_info *p, struct Port *PortP, u8 Cmd)
|
|||
|
||||
switch (Cmd) {
|
||||
case MEMDUMP:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue MEMDUMP command blk %p (addr 0x%x)\n", CmdBlkP, (int) SubCmd.Addr);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue MEMDUMP command blk %p "
|
||||
"(addr 0x%x)\n", CmdBlkP, (int) SubCmd.Addr);
|
||||
PktCmdP->SubCommand = MEMDUMP;
|
||||
PktCmdP->SubAddr = SubCmd.Addr;
|
||||
break;
|
||||
case FCLOSE:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue FCLOSE command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue FCLOSE command blk %p\n",
|
||||
CmdBlkP);
|
||||
break;
|
||||
case READ_REGISTER:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue READ_REGISTER (0x%x) command blk %p\n", (int) SubCmd.Addr, CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue READ_REGISTER (0x%x) "
|
||||
"command blk %p\n", (int) SubCmd.Addr, CmdBlkP);
|
||||
PktCmdP->SubCommand = READ_REGISTER;
|
||||
PktCmdP->SubAddr = SubCmd.Addr;
|
||||
break;
|
||||
case RESUME:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue RESUME command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue RESUME command blk %p\n",
|
||||
CmdBlkP);
|
||||
break;
|
||||
case RFLUSH:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue RFLUSH command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue RFLUSH command blk %p\n",
|
||||
CmdBlkP);
|
||||
CmdBlkP->PostFuncP = RIORFlushEnable;
|
||||
break;
|
||||
case SUSPEND:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue SUSPEND command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue SUSPEND command blk %p\n",
|
||||
CmdBlkP);
|
||||
break;
|
||||
|
||||
case MGET:
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue MGET command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue MGET command blk %p\n",
|
||||
CmdBlkP);
|
||||
break;
|
||||
|
||||
case MSET:
|
||||
case MBIC:
|
||||
case MBIS:
|
||||
CmdBlkP->Packet.data[4] = (char) PortP->ModemLines;
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue MSET/MBIC/MBIS command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue MSET/MBIC/MBIS command "
|
||||
"blk %p\n", CmdBlkP);
|
||||
break;
|
||||
|
||||
case WFLUSH:
|
||||
|
@ -1465,12 +1476,14 @@ int RIOPreemptiveCmd(struct rio_info *p, struct Port *PortP, u8 Cmd)
|
|||
** allowed then we should not bother sending any more to the
|
||||
** RTA.
|
||||
*/
|
||||
if ((int) ((char) PortP->WflushFlag) == (int) -1) {
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Trashed WFLUSH, WflushFlag about to wrap!");
|
||||
if (PortP->WflushFlag == (typeof(PortP->WflushFlag))-1) {
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Trashed WFLUSH, "
|
||||
"WflushFlag about to wrap!");
|
||||
RIOFreeCmdBlk(CmdBlkP);
|
||||
return (RIO_FAIL);
|
||||
} else {
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue WFLUSH command blk %p\n", CmdBlkP);
|
||||
rio_dprintk(RIO_DEBUG_CTRL, "Queue WFLUSH command "
|
||||
"blk %p\n", CmdBlkP);
|
||||
CmdBlkP->PostFuncP = RIOWFlushMark;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -33,10 +33,6 @@
|
|||
#ifndef __rioioctl_h__
|
||||
#define __rioioctl_h__
|
||||
|
||||
#ifdef SCCS_LABELS
|
||||
static char *_rioioctl_h_sccs_ = "@(#)rioioctl.h 1.2";
|
||||
#endif
|
||||
|
||||
/*
|
||||
** RIO device driver - user ioctls and associated structures.
|
||||
*/
|
||||
|
@ -44,55 +40,13 @@ static char *_rioioctl_h_sccs_ = "@(#)rioioctl.h 1.2";
|
|||
struct portStats {
|
||||
int port;
|
||||
int gather;
|
||||
ulong txchars;
|
||||
ulong rxchars;
|
||||
ulong opens;
|
||||
ulong closes;
|
||||
ulong ioctls;
|
||||
unsigned long txchars;
|
||||
unsigned long rxchars;
|
||||
unsigned long opens;
|
||||
unsigned long closes;
|
||||
unsigned long ioctls;
|
||||
};
|
||||
|
||||
|
||||
#define rIOC ('r'<<8)
|
||||
#define TCRIOSTATE (rIOC | 1)
|
||||
#define TCRIOXPON (rIOC | 2)
|
||||
#define TCRIOXPOFF (rIOC | 3)
|
||||
#define TCRIOXPCPS (rIOC | 4)
|
||||
#define TCRIOXPRINT (rIOC | 5)
|
||||
#define TCRIOIXANYON (rIOC | 6)
|
||||
#define TCRIOIXANYOFF (rIOC | 7)
|
||||
#define TCRIOIXONON (rIOC | 8)
|
||||
#define TCRIOIXONOFF (rIOC | 9)
|
||||
#define TCRIOMBIS (rIOC | 10)
|
||||
#define TCRIOMBIC (rIOC | 11)
|
||||
#define TCRIOTRIAD (rIOC | 12)
|
||||
#define TCRIOTSTATE (rIOC | 13)
|
||||
|
||||
/*
|
||||
** 15.10.1998 ARG - ESIL 0761 part fix
|
||||
** Add RIO ioctls for manipulating RTS and CTS flow control, (as LynxOS
|
||||
** appears to not support hardware flow control).
|
||||
*/
|
||||
#define TCRIOCTSFLOWEN (rIOC | 14) /* enable CTS flow control */
|
||||
#define TCRIOCTSFLOWDIS (rIOC | 15) /* disable CTS flow control */
|
||||
#define TCRIORTSFLOWEN (rIOC | 16) /* enable RTS flow control */
|
||||
#define TCRIORTSFLOWDIS (rIOC | 17) /* disable RTS flow control */
|
||||
|
||||
/*
|
||||
** 09.12.1998 ARG - ESIL 0776 part fix
|
||||
** Definition for 'RIOC' also appears in daemon.h, so we'd better do a
|
||||
** #ifndef here first.
|
||||
** 'RIO_QUICK_CHECK' also #define'd here as this ioctl is now
|
||||
** allowed to be used by customers.
|
||||
**
|
||||
** 05.02.1999 ARG -
|
||||
** This is what I've decied to do with ioctls etc., which are intended to be
|
||||
** invoked from users applications :
|
||||
** Anything that needs to be defined here will be removed from daemon.h, that
|
||||
** way it won't end up having to be defined/maintained in two places. The only
|
||||
** consequence of this is that this file should now be #include'd by daemon.h
|
||||
**
|
||||
** 'stats' ioctls now #define'd here as they are to be used by customers.
|
||||
*/
|
||||
#define RIOC ('R'<<8)|('i'<<16)|('o'<<24)
|
||||
|
||||
#define RIO_QUICK_CHECK (RIOC | 105)
|
||||
|
|
|
@ -22,7 +22,7 @@ config TCG_TPM
|
|||
|
||||
config TCG_TIS
|
||||
tristate "TPM Interface Specification 1.2 Interface"
|
||||
depends on TCG_TPM
|
||||
depends on TCG_TPM && PNPACPI
|
||||
---help---
|
||||
If you have a TPM security chip that is compliant with the
|
||||
TCG TIS 1.2 TPM specification say Yes and it will be accessible
|
||||
|
|
|
@ -140,7 +140,7 @@ extern int tpm_pm_resume(struct device *);
|
|||
extern struct dentry ** tpm_bios_log_setup(char *);
|
||||
extern void tpm_bios_log_teardown(struct dentry **);
|
||||
#else
|
||||
static inline struct dentry* tpm_bios_log_setup(char *name)
|
||||
static inline struct dentry ** tpm_bios_log_setup(char *name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ enum tis_int_flags {
|
|||
};
|
||||
|
||||
enum tis_defaults {
|
||||
TIS_MEM_BASE = 0xFED4000,
|
||||
TIS_MEM_BASE = 0xFED40000,
|
||||
TIS_MEM_LEN = 0x5000,
|
||||
TIS_SHORT_TIMEOUT = 750, /* ms */
|
||||
TIS_LONG_TIMEOUT = 2000, /* 2 sec */
|
||||
|
|
|
@ -74,6 +74,8 @@ static unsigned int dbs_enable; /* number of CPUs using this policy */
|
|||
static DEFINE_MUTEX (dbs_mutex);
|
||||
static DECLARE_WORK (dbs_work, do_dbs_timer, NULL);
|
||||
|
||||
static struct workqueue_struct *dbs_workq;
|
||||
|
||||
struct dbs_tuners {
|
||||
unsigned int sampling_rate;
|
||||
unsigned int sampling_down_factor;
|
||||
|
@ -364,23 +366,29 @@ static void do_dbs_timer(void *data)
|
|||
mutex_lock(&dbs_mutex);
|
||||
for_each_online_cpu(i)
|
||||
dbs_check_cpu(i);
|
||||
schedule_delayed_work(&dbs_work,
|
||||
usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
|
||||
queue_delayed_work(dbs_workq, &dbs_work,
|
||||
usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
|
||||
mutex_unlock(&dbs_mutex);
|
||||
}
|
||||
|
||||
static inline void dbs_timer_init(void)
|
||||
{
|
||||
INIT_WORK(&dbs_work, do_dbs_timer, NULL);
|
||||
schedule_delayed_work(&dbs_work,
|
||||
usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
|
||||
if (!dbs_workq)
|
||||
dbs_workq = create_singlethread_workqueue("ondemand");
|
||||
if (!dbs_workq) {
|
||||
printk(KERN_ERR "ondemand: Cannot initialize kernel thread\n");
|
||||
return;
|
||||
}
|
||||
queue_delayed_work(dbs_workq, &dbs_work,
|
||||
usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void dbs_timer_exit(void)
|
||||
{
|
||||
cancel_delayed_work(&dbs_work);
|
||||
return;
|
||||
if (dbs_workq)
|
||||
cancel_rearming_delayed_workqueue(dbs_workq, &dbs_work);
|
||||
}
|
||||
|
||||
static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
||||
|
@ -489,8 +497,12 @@ static int __init cpufreq_gov_dbs_init(void)
|
|||
|
||||
static void __exit cpufreq_gov_dbs_exit(void)
|
||||
{
|
||||
/* Make sure that the scheduled work is indeed not running */
|
||||
flush_scheduled_work();
|
||||
/* Make sure that the scheduled work is indeed not running.
|
||||
Assumes the timer has been cancelled first. */
|
||||
if (dbs_workq) {
|
||||
flush_workqueue(dbs_workq);
|
||||
destroy_workqueue(dbs_workq);
|
||||
}
|
||||
|
||||
cpufreq_unregister_governor(&cpufreq_gov_dbs);
|
||||
}
|
||||
|
|
|
@ -133,6 +133,9 @@ static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status)
|
|||
|
||||
outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
|
||||
outb(ACBST_STASTR | ACBST_NEGACK, ACBST);
|
||||
|
||||
/* Reset the status register */
|
||||
outb(0, ACBST);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -228,6 +231,10 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface)
|
|||
timeout = jiffies + POLL_TIMEOUT;
|
||||
while (time_before(jiffies, timeout)) {
|
||||
status = inb(ACBST);
|
||||
|
||||
/* Reset the status register to avoid the hang */
|
||||
outb(0, ACBST);
|
||||
|
||||
if ((status & (ACBST_SDAST|ACBST_BER|ACBST_NEGACK)) != 0) {
|
||||
scx200_acb_machine(iface, status);
|
||||
return;
|
||||
|
@ -415,7 +422,6 @@ static int __init scx200_acb_create(const char *text, int base, int index)
|
|||
struct scx200_acb_iface *iface;
|
||||
struct i2c_adapter *adapter;
|
||||
int rc;
|
||||
char description[64];
|
||||
|
||||
iface = kzalloc(sizeof(*iface), GFP_KERNEL);
|
||||
if (!iface) {
|
||||
|
@ -434,10 +440,7 @@ static int __init scx200_acb_create(const char *text, int base, int index)
|
|||
|
||||
mutex_init(&iface->mutex);
|
||||
|
||||
snprintf(description, sizeof(description), "%s ACCESS.bus [%s]",
|
||||
text, adapter->name);
|
||||
|
||||
if (request_region(base, 8, description) == 0) {
|
||||
if (!request_region(base, 8, adapter->name)) {
|
||||
printk(KERN_ERR NAME ": can't allocate io 0x%x-0x%x\n",
|
||||
base, base + 8-1);
|
||||
rc = -EBUSY;
|
||||
|
@ -524,6 +527,9 @@ static int __init scx200_acb_init(void)
|
|||
} else if (pci_dev_present(divil_pci))
|
||||
rc = scx200_add_cs553x();
|
||||
|
||||
/* If at least one bus was created, init must succeed */
|
||||
if (scx200_acb_list)
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
@ -392,6 +392,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
|||
PCMCIA_DEVICE_PROD_ID12("FREECOM", "PCCARD-IDE", 0x5714cbf7, 0x48e0ab8e),
|
||||
PCMCIA_DEVICE_PROD_ID12("HITACHI", "FLASH", 0xf4f43949, 0x9eb86aae),
|
||||
PCMCIA_DEVICE_PROD_ID12("HITACHI", "microdrive", 0xf4f43949, 0xa6d76178),
|
||||
PCMCIA_DEVICE_PROD_ID12("IBM", "microdrive", 0xb569a6e5, 0xa6d76178),
|
||||
PCMCIA_DEVICE_PROD_ID12("IBM", "IBM17JSSFP20", 0xb569a6e5, 0xf2508753),
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "CBIDE2 ", 0x547e66dc, 0x8671043b),
|
||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
|
||||
|
|
|
@ -553,7 +553,7 @@ static void ohci_initialize(struct ti_ohci *ohci)
|
|||
* register content.
|
||||
* To actually enable physical responses is the job of our interrupt
|
||||
* handler which programs the physical request filter. */
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, 0xffff0000);
|
||||
reg_write(ohci, OHCI1394_PhyUpperBound, 0x01000000);
|
||||
|
||||
DBGMSG("physUpperBoundOffset=%08x",
|
||||
reg_read(ohci, OHCI1394_PhyUpperBound));
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/fs.h>
|
||||
|
@ -117,7 +118,8 @@ MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers (default
|
|||
*/
|
||||
static int max_sectors = SBP2_MAX_SECTORS;
|
||||
module_param(max_sectors, int, 0444);
|
||||
MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = 255)");
|
||||
MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = "
|
||||
__stringify(SBP2_MAX_SECTORS) ")");
|
||||
|
||||
/*
|
||||
* Exclusive login to sbp2 device? In most cases, the sbp2 driver should
|
||||
|
@ -135,18 +137,45 @@ module_param(exclusive_login, int, 0644);
|
|||
MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device (default = 1)");
|
||||
|
||||
/*
|
||||
* SCSI inquiry hack for really badly behaved sbp2 devices. Turn this on
|
||||
* if your sbp2 device is not properly handling the SCSI inquiry command.
|
||||
* This hack makes the inquiry look more like a typical MS Windows inquiry
|
||||
* by enforcing 36 byte inquiry and avoiding access to mode_sense page 8.
|
||||
* If any of the following workarounds is required for your device to work,
|
||||
* please submit the kernel messages logged by sbp2 to the linux1394-devel
|
||||
* mailing list.
|
||||
*
|
||||
* If force_inquiry_hack=1 is required for your device to work,
|
||||
* please submit the logged sbp2_firmware_revision value of this device to
|
||||
* the linux1394-devel mailing list.
|
||||
* - 128kB max transfer
|
||||
* Limit transfer size. Necessary for some old bridges.
|
||||
*
|
||||
* - 36 byte inquiry
|
||||
* When scsi_mod probes the device, let the inquiry command look like that
|
||||
* from MS Windows.
|
||||
*
|
||||
* - skip mode page 8
|
||||
* Suppress sending of mode_sense for mode page 8 if the device pretends to
|
||||
* support the SCSI Primary Block commands instead of Reduced Block Commands.
|
||||
*
|
||||
* - fix capacity
|
||||
* Tell sd_mod to correct the last sector number reported by read_capacity.
|
||||
* Avoids access beyond actual disk limits on devices with an off-by-one bug.
|
||||
* Don't use this with devices which don't have this bug.
|
||||
*
|
||||
* - override internal blacklist
|
||||
* Instead of adding to the built-in blacklist, use only the workarounds
|
||||
* specified in the module load parameter.
|
||||
* Useful if a blacklist entry interfered with a non-broken device.
|
||||
*/
|
||||
static int sbp2_default_workarounds;
|
||||
module_param_named(workarounds, sbp2_default_workarounds, int, 0644);
|
||||
MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
|
||||
", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS)
|
||||
", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36)
|
||||
", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
|
||||
", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
|
||||
", or a combination)");
|
||||
|
||||
/* legacy parameter */
|
||||
static int force_inquiry_hack;
|
||||
module_param(force_inquiry_hack, int, 0644);
|
||||
MODULE_PARM_DESC(force_inquiry_hack, "Force SCSI inquiry hack (default = 0)");
|
||||
MODULE_PARM_DESC(force_inquiry_hack, "Deprecated, use 'workarounds'");
|
||||
|
||||
/*
|
||||
* Export information about protocols/devices supported by this driver.
|
||||
|
@ -266,14 +295,55 @@ static struct hpsb_protocol_driver sbp2_driver = {
|
|||
};
|
||||
|
||||
/*
|
||||
* List of device firmwares that require the inquiry hack.
|
||||
* Yields a few false positives but did not break other devices so far.
|
||||
* List of devices with known bugs.
|
||||
*
|
||||
* The firmware_revision field, masked with 0xffff00, is the best indicator
|
||||
* for the type of bridge chip of a device. It yields a few false positives
|
||||
* but this did not break correctly behaving devices so far.
|
||||
*/
|
||||
static u32 sbp2_broken_inquiry_list[] = {
|
||||
0x00002800, /* Stefan Richter <stefanr@s5r6.in-berlin.de> */
|
||||
/* DViCO Momobay CX-1 */
|
||||
0x00000200 /* Andreas Plesch <plesch@fas.harvard.edu> */
|
||||
/* QPS Fire DVDBurner */
|
||||
static const struct {
|
||||
u32 firmware_revision;
|
||||
u32 model_id;
|
||||
unsigned workarounds;
|
||||
} sbp2_workarounds_table[] = {
|
||||
/* TSB42AA9 */ {
|
||||
.firmware_revision = 0x002800,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36 |
|
||||
SBP2_WORKAROUND_MODE_SENSE_8,
|
||||
},
|
||||
/* Initio bridges, actually only needed for some older ones */ {
|
||||
.firmware_revision = 0x000200,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
||||
},
|
||||
/* Symbios bridge */ {
|
||||
.firmware_revision = 0xa0b800,
|
||||
.workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
|
||||
},
|
||||
/*
|
||||
* Note about the following Apple iPod blacklist entries:
|
||||
*
|
||||
* There are iPods (2nd gen, 3rd gen) with model_id==0. Since our
|
||||
* matching logic treats 0 as a wildcard, we cannot match this ID
|
||||
* without rewriting the matching routine. Fortunately these iPods
|
||||
* do not feature the read_capacity bug according to one report.
|
||||
* Read_capacity behaviour as well as model_id could change due to
|
||||
* Apple-supplied firmware updates though.
|
||||
*/
|
||||
/* iPod 4th generation */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000021,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod mini */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x000023,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
},
|
||||
/* iPod Photo */ {
|
||||
.firmware_revision = 0x0a2700,
|
||||
.model_id = 0x00007e,
|
||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||
}
|
||||
};
|
||||
|
||||
/**************************************
|
||||
|
@ -765,11 +835,16 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud
|
|||
|
||||
/* Register the status FIFO address range. We could use the same FIFO
|
||||
* for targets at different nodes. However we need different FIFOs per
|
||||
* target in order to support multi-unit devices. */
|
||||
* target in order to support multi-unit devices.
|
||||
* The FIFO is located out of the local host controller's physical range
|
||||
* but, if possible, within the posted write area. Status writes will
|
||||
* then be performed as unified transactions. This slightly reduces
|
||||
* bandwidth usage, and some Prolific based devices seem to require it.
|
||||
*/
|
||||
scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace(
|
||||
&sbp2_highlevel, ud->ne->host, &sbp2_ops,
|
||||
sizeof(struct sbp2_status_block), sizeof(quadlet_t),
|
||||
~0ULL, ~0ULL);
|
||||
0x010000000000ULL, CSR1212_ALL_SPACE_END);
|
||||
if (!scsi_id->status_fifo_addr) {
|
||||
SBP2_ERR("failed to allocate status FIFO address range");
|
||||
goto failed_alloc;
|
||||
|
@ -1450,7 +1525,8 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
|
|||
struct csr1212_dentry *dentry;
|
||||
u64 management_agent_addr;
|
||||
u32 command_set_spec_id, command_set, unit_characteristics,
|
||||
firmware_revision, workarounds;
|
||||
firmware_revision;
|
||||
unsigned workarounds;
|
||||
int i;
|
||||
|
||||
SBP2_DEBUG_ENTER();
|
||||
|
@ -1506,12 +1582,8 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
|
|||
case SBP2_FIRMWARE_REVISION_KEY:
|
||||
/* Firmware revision */
|
||||
firmware_revision = kv->value.immediate;
|
||||
if (force_inquiry_hack)
|
||||
SBP2_INFO("sbp2_firmware_revision = %x",
|
||||
(unsigned int)firmware_revision);
|
||||
else
|
||||
SBP2_DEBUG("sbp2_firmware_revision = %x",
|
||||
(unsigned int)firmware_revision);
|
||||
SBP2_DEBUG("sbp2_firmware_revision = %x",
|
||||
(unsigned int)firmware_revision);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1519,41 +1591,44 @@ static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
|
|||
}
|
||||
}
|
||||
|
||||
/* This is the start of our broken device checking. We try to hack
|
||||
* around oddities and known defects. */
|
||||
workarounds = 0x0;
|
||||
|
||||
/* If the vendor id is 0xa0b8 (Symbios vendor id), then we have a
|
||||
* bridge with 128KB max transfer size limitation. For sanity, we
|
||||
* only voice this when the current max_sectors setting
|
||||
* exceeds the 128k limit. By default, that is not the case.
|
||||
*
|
||||
* It would be really nice if we could detect this before the scsi
|
||||
* host gets initialized. That way we can down-force the
|
||||
* max_sectors to account for it. That is not currently
|
||||
* possible. */
|
||||
if ((firmware_revision & 0xffff00) ==
|
||||
SBP2_128KB_BROKEN_FIRMWARE &&
|
||||
(max_sectors * 512) > (128*1024)) {
|
||||
SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB max transfer size.",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid));
|
||||
SBP2_WARN("WARNING: Current max_sectors setting is larger than 128KB (%d sectors)!",
|
||||
max_sectors);
|
||||
workarounds |= SBP2_BREAKAGE_128K_MAX_TRANSFER;
|
||||
workarounds = sbp2_default_workarounds;
|
||||
if (force_inquiry_hack) {
|
||||
SBP2_WARN("force_inquiry_hack is deprecated. "
|
||||
"Use parameter 'workarounds' instead.");
|
||||
workarounds |= SBP2_WORKAROUND_INQUIRY_36;
|
||||
}
|
||||
|
||||
/* Check for a blacklisted set of devices that require us to force
|
||||
* a 36 byte host inquiry. This can be overriden as a module param
|
||||
* (to force all hosts). */
|
||||
for (i = 0; i < ARRAY_SIZE(sbp2_broken_inquiry_list); i++) {
|
||||
if ((firmware_revision & 0xffff00) ==
|
||||
sbp2_broken_inquiry_list[i]) {
|
||||
SBP2_WARN("Node " NODE_BUS_FMT ": Using 36byte inquiry workaround",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid));
|
||||
workarounds |= SBP2_BREAKAGE_INQUIRY_HACK;
|
||||
break; /* No need to continue. */
|
||||
if (!(workarounds & SBP2_WORKAROUND_OVERRIDE))
|
||||
for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) {
|
||||
if (sbp2_workarounds_table[i].firmware_revision &&
|
||||
sbp2_workarounds_table[i].firmware_revision !=
|
||||
(firmware_revision & 0xffff00))
|
||||
continue;
|
||||
if (sbp2_workarounds_table[i].model_id &&
|
||||
sbp2_workarounds_table[i].model_id != ud->model_id)
|
||||
continue;
|
||||
workarounds |= sbp2_workarounds_table[i].workarounds;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (workarounds)
|
||||
SBP2_INFO("Workarounds for node " NODE_BUS_FMT ": 0x%x "
|
||||
"(firmware_revision 0x%06x, vendor_id 0x%06x,"
|
||||
" model_id 0x%06x)",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
|
||||
workarounds, firmware_revision,
|
||||
ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id,
|
||||
ud->model_id);
|
||||
|
||||
/* We would need one SCSI host template for each target to adjust
|
||||
* max_sectors on the fly, therefore warn only. */
|
||||
if (workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
|
||||
(max_sectors * 512) > (128 * 1024))
|
||||
SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB "
|
||||
"max transfer size. WARNING: Current max_sectors "
|
||||
"setting is larger than 128KB (%d sectors)",
|
||||
NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
|
||||
max_sectors);
|
||||
|
||||
/* If this is a logical unit directory entry, process the parent
|
||||
* to get the values. */
|
||||
|
@ -2447,19 +2522,25 @@ static int sbp2scsi_slave_alloc(struct scsi_device *sdev)
|
|||
|
||||
scsi_id->sdev = sdev;
|
||||
|
||||
if (force_inquiry_hack ||
|
||||
scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK) {
|
||||
if (scsi_id->workarounds & SBP2_WORKAROUND_INQUIRY_36)
|
||||
sdev->inquiry_len = 36;
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sbp2scsi_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct scsi_id_instance_data *scsi_id =
|
||||
(struct scsi_id_instance_data *)sdev->host->hostdata[0];
|
||||
|
||||
blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
|
||||
sdev->use_10_for_rw = 1;
|
||||
sdev->use_10_for_ms = 1;
|
||||
|
||||
if (sdev->type == TYPE_DISK &&
|
||||
scsi_id->workarounds & SBP2_WORKAROUND_MODE_SENSE_8)
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
sdev->fix_capacity = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2603,7 +2684,9 @@ static int sbp2_module_init(void)
|
|||
scsi_driver_template.cmd_per_lun = 1;
|
||||
}
|
||||
|
||||
/* Set max sectors (module load option). Default is 255 sectors. */
|
||||
if (sbp2_default_workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
|
||||
(max_sectors * 512) > (128 * 1024))
|
||||
max_sectors = 128 * 1024 / 512;
|
||||
scsi_driver_template.max_sectors = max_sectors;
|
||||
|
||||
/* Register our high level driver with 1394 stack */
|
||||
|
|
|
@ -226,11 +226,6 @@ struct sbp2_status_block {
|
|||
#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
|
||||
#define SBP2_SW_VERSION_ENTRY 0x00010483
|
||||
|
||||
/*
|
||||
* Other misc defines
|
||||
*/
|
||||
#define SBP2_128KB_BROKEN_FIRMWARE 0xa0b800
|
||||
|
||||
/*
|
||||
* SCSI specific stuff
|
||||
*/
|
||||
|
@ -239,6 +234,13 @@ struct sbp2_status_block {
|
|||
#define SBP2_MAX_SECTORS 255 /* Max sectors supported */
|
||||
#define SBP2_MAX_CMDS 8 /* This should be safe */
|
||||
|
||||
/* Flags for detected oddities and brokeness */
|
||||
#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1
|
||||
#define SBP2_WORKAROUND_INQUIRY_36 0x2
|
||||
#define SBP2_WORKAROUND_MODE_SENSE_8 0x4
|
||||
#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
|
||||
#define SBP2_WORKAROUND_OVERRIDE 0x100
|
||||
|
||||
/* This is the two dma types we use for cmd_dma below */
|
||||
enum cmd_dma_types {
|
||||
CMD_DMA_NONE,
|
||||
|
@ -268,10 +270,6 @@ struct sbp2_command_info {
|
|||
|
||||
};
|
||||
|
||||
/* A list of flags for detected oddities and brokeness. */
|
||||
#define SBP2_BREAKAGE_128K_MAX_TRANSFER 0x1
|
||||
#define SBP2_BREAKAGE_INQUIRY_HACK 0x2
|
||||
|
||||
struct sbp2scsi_host_info;
|
||||
|
||||
/*
|
||||
|
@ -345,7 +343,7 @@ struct scsi_id_instance_data {
|
|||
struct Scsi_Host *scsi_host;
|
||||
|
||||
/* Device specific workarounds/brokeness */
|
||||
u32 workarounds;
|
||||
unsigned workarounds;
|
||||
};
|
||||
|
||||
/* Sbp2 host data structure (one per IEEE1394 host) */
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
*
|
||||
* $Id: cm.c 2821 2005-07-08 17:07:28Z sean.hefty $
|
||||
*/
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/idr.h>
|
||||
|
@ -122,7 +124,7 @@ struct cm_id_private {
|
|||
struct rb_node service_node;
|
||||
struct rb_node sidr_id_node;
|
||||
spinlock_t lock; /* Do not acquire inside cm.lock */
|
||||
wait_queue_head_t wait;
|
||||
struct completion comp;
|
||||
atomic_t refcount;
|
||||
|
||||
struct ib_mad_send_buf *msg;
|
||||
|
@ -159,7 +161,7 @@ static void cm_work_handler(void *data);
|
|||
static inline void cm_deref_id(struct cm_id_private *cm_id_priv)
|
||||
{
|
||||
if (atomic_dec_and_test(&cm_id_priv->refcount))
|
||||
wake_up(&cm_id_priv->wait);
|
||||
complete(&cm_id_priv->comp);
|
||||
}
|
||||
|
||||
static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
|
||||
|
@ -559,7 +561,7 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
|
|||
goto error;
|
||||
|
||||
spin_lock_init(&cm_id_priv->lock);
|
||||
init_waitqueue_head(&cm_id_priv->wait);
|
||||
init_completion(&cm_id_priv->comp);
|
||||
INIT_LIST_HEAD(&cm_id_priv->work_list);
|
||||
atomic_set(&cm_id_priv->work_count, -1);
|
||||
atomic_set(&cm_id_priv->refcount, 1);
|
||||
|
@ -724,8 +726,8 @@ retest:
|
|||
}
|
||||
|
||||
cm_free_id(cm_id->local_id);
|
||||
atomic_dec(&cm_id_priv->refcount);
|
||||
wait_event(cm_id_priv->wait, !atomic_read(&cm_id_priv->refcount));
|
||||
cm_deref_id(cm_id_priv);
|
||||
wait_for_completion(&cm_id_priv->comp);
|
||||
while ((work = cm_dequeue_work(cm_id_priv)) != NULL)
|
||||
cm_free_work(work);
|
||||
if (cm_id_priv->private_data && cm_id_priv->private_data_len)
|
||||
|
|
|
@ -352,7 +352,7 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
|||
INIT_WORK(&mad_agent_priv->local_work, local_completions,
|
||||
mad_agent_priv);
|
||||
atomic_set(&mad_agent_priv->refcount, 1);
|
||||
init_waitqueue_head(&mad_agent_priv->wait);
|
||||
init_completion(&mad_agent_priv->comp);
|
||||
|
||||
return &mad_agent_priv->agent;
|
||||
|
||||
|
@ -467,7 +467,7 @@ struct ib_mad_agent *ib_register_mad_snoop(struct ib_device *device,
|
|||
mad_snoop_priv->agent.qp = port_priv->qp_info[qpn].qp;
|
||||
mad_snoop_priv->agent.port_num = port_num;
|
||||
mad_snoop_priv->mad_snoop_flags = mad_snoop_flags;
|
||||
init_waitqueue_head(&mad_snoop_priv->wait);
|
||||
init_completion(&mad_snoop_priv->comp);
|
||||
mad_snoop_priv->snoop_index = register_snoop_agent(
|
||||
&port_priv->qp_info[qpn],
|
||||
mad_snoop_priv);
|
||||
|
@ -486,6 +486,18 @@ error1:
|
|||
}
|
||||
EXPORT_SYMBOL(ib_register_mad_snoop);
|
||||
|
||||
static inline void deref_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
|
||||
{
|
||||
if (atomic_dec_and_test(&mad_agent_priv->refcount))
|
||||
complete(&mad_agent_priv->comp);
|
||||
}
|
||||
|
||||
static inline void deref_snoop_agent(struct ib_mad_snoop_private *mad_snoop_priv)
|
||||
{
|
||||
if (atomic_dec_and_test(&mad_snoop_priv->refcount))
|
||||
complete(&mad_snoop_priv->comp);
|
||||
}
|
||||
|
||||
static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
|
||||
{
|
||||
struct ib_mad_port_private *port_priv;
|
||||
|
@ -509,9 +521,8 @@ static void unregister_mad_agent(struct ib_mad_agent_private *mad_agent_priv)
|
|||
flush_workqueue(port_priv->wq);
|
||||
ib_cancel_rmpp_recvs(mad_agent_priv);
|
||||
|
||||
atomic_dec(&mad_agent_priv->refcount);
|
||||
wait_event(mad_agent_priv->wait,
|
||||
!atomic_read(&mad_agent_priv->refcount));
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
wait_for_completion(&mad_agent_priv->comp);
|
||||
|
||||
kfree(mad_agent_priv->reg_req);
|
||||
ib_dereg_mr(mad_agent_priv->agent.mr);
|
||||
|
@ -529,9 +540,8 @@ static void unregister_mad_snoop(struct ib_mad_snoop_private *mad_snoop_priv)
|
|||
atomic_dec(&qp_info->snoop_count);
|
||||
spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
|
||||
|
||||
atomic_dec(&mad_snoop_priv->refcount);
|
||||
wait_event(mad_snoop_priv->wait,
|
||||
!atomic_read(&mad_snoop_priv->refcount));
|
||||
deref_snoop_agent(mad_snoop_priv);
|
||||
wait_for_completion(&mad_snoop_priv->comp);
|
||||
|
||||
kfree(mad_snoop_priv);
|
||||
}
|
||||
|
@ -600,8 +610,7 @@ static void snoop_send(struct ib_mad_qp_info *qp_info,
|
|||
spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
|
||||
mad_snoop_priv->agent.snoop_handler(&mad_snoop_priv->agent,
|
||||
send_buf, mad_send_wc);
|
||||
if (atomic_dec_and_test(&mad_snoop_priv->refcount))
|
||||
wake_up(&mad_snoop_priv->wait);
|
||||
deref_snoop_agent(mad_snoop_priv);
|
||||
spin_lock_irqsave(&qp_info->snoop_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
|
||||
|
@ -626,8 +635,7 @@ static void snoop_recv(struct ib_mad_qp_info *qp_info,
|
|||
spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
|
||||
mad_snoop_priv->agent.recv_handler(&mad_snoop_priv->agent,
|
||||
mad_recv_wc);
|
||||
if (atomic_dec_and_test(&mad_snoop_priv->refcount))
|
||||
wake_up(&mad_snoop_priv->wait);
|
||||
deref_snoop_agent(mad_snoop_priv);
|
||||
spin_lock_irqsave(&qp_info->snoop_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&qp_info->snoop_lock, flags);
|
||||
|
@ -968,8 +976,7 @@ void ib_free_send_mad(struct ib_mad_send_buf *send_buf)
|
|||
|
||||
free_send_rmpp_list(mad_send_wr);
|
||||
kfree(send_buf->mad);
|
||||
if (atomic_dec_and_test(&mad_agent_priv->refcount))
|
||||
wake_up(&mad_agent_priv->wait);
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
}
|
||||
EXPORT_SYMBOL(ib_free_send_mad);
|
||||
|
||||
|
@ -1757,8 +1764,7 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
|
|||
mad_recv_wc = ib_process_rmpp_recv_wc(mad_agent_priv,
|
||||
mad_recv_wc);
|
||||
if (!mad_recv_wc) {
|
||||
if (atomic_dec_and_test(&mad_agent_priv->refcount))
|
||||
wake_up(&mad_agent_priv->wait);
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1770,8 +1776,7 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
|
|||
if (!mad_send_wr) {
|
||||
spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
|
||||
ib_free_recv_mad(mad_recv_wc);
|
||||
if (atomic_dec_and_test(&mad_agent_priv->refcount))
|
||||
wake_up(&mad_agent_priv->wait);
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
return;
|
||||
}
|
||||
ib_mark_mad_done(mad_send_wr);
|
||||
|
@ -1790,8 +1795,7 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
|
|||
} else {
|
||||
mad_agent_priv->agent.recv_handler(&mad_agent_priv->agent,
|
||||
mad_recv_wc);
|
||||
if (atomic_dec_and_test(&mad_agent_priv->refcount))
|
||||
wake_up(&mad_agent_priv->wait);
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2021,8 +2025,7 @@ void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,
|
|||
mad_send_wc);
|
||||
|
||||
/* Release reference on agent taken when sending */
|
||||
if (atomic_dec_and_test(&mad_agent_priv->refcount))
|
||||
wake_up(&mad_agent_priv->wait);
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
return;
|
||||
done:
|
||||
spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#ifndef __IB_MAD_PRIV_H__
|
||||
#define __IB_MAD_PRIV_H__
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
@ -108,7 +109,7 @@ struct ib_mad_agent_private {
|
|||
struct list_head rmpp_list;
|
||||
|
||||
atomic_t refcount;
|
||||
wait_queue_head_t wait;
|
||||
struct completion comp;
|
||||
};
|
||||
|
||||
struct ib_mad_snoop_private {
|
||||
|
@ -117,7 +118,7 @@ struct ib_mad_snoop_private {
|
|||
int snoop_index;
|
||||
int mad_snoop_flags;
|
||||
atomic_t refcount;
|
||||
wait_queue_head_t wait;
|
||||
struct completion comp;
|
||||
};
|
||||
|
||||
struct ib_mad_send_wr_private {
|
||||
|
|
|
@ -49,7 +49,7 @@ struct mad_rmpp_recv {
|
|||
struct list_head list;
|
||||
struct work_struct timeout_work;
|
||||
struct work_struct cleanup_work;
|
||||
wait_queue_head_t wait;
|
||||
struct completion comp;
|
||||
enum rmpp_state state;
|
||||
spinlock_t lock;
|
||||
atomic_t refcount;
|
||||
|
@ -69,10 +69,16 @@ struct mad_rmpp_recv {
|
|||
u8 method;
|
||||
};
|
||||
|
||||
static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
|
||||
{
|
||||
if (atomic_dec_and_test(&rmpp_recv->refcount))
|
||||
complete(&rmpp_recv->comp);
|
||||
}
|
||||
|
||||
static void destroy_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
|
||||
{
|
||||
atomic_dec(&rmpp_recv->refcount);
|
||||
wait_event(rmpp_recv->wait, !atomic_read(&rmpp_recv->refcount));
|
||||
deref_rmpp_recv(rmpp_recv);
|
||||
wait_for_completion(&rmpp_recv->comp);
|
||||
ib_destroy_ah(rmpp_recv->ah);
|
||||
kfree(rmpp_recv);
|
||||
}
|
||||
|
@ -253,7 +259,7 @@ create_rmpp_recv(struct ib_mad_agent_private *agent,
|
|||
goto error;
|
||||
|
||||
rmpp_recv->agent = agent;
|
||||
init_waitqueue_head(&rmpp_recv->wait);
|
||||
init_completion(&rmpp_recv->comp);
|
||||
INIT_WORK(&rmpp_recv->timeout_work, recv_timeout_handler, rmpp_recv);
|
||||
INIT_WORK(&rmpp_recv->cleanup_work, recv_cleanup_handler, rmpp_recv);
|
||||
spin_lock_init(&rmpp_recv->lock);
|
||||
|
@ -279,12 +285,6 @@ error: kfree(rmpp_recv);
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv)
|
||||
{
|
||||
if (atomic_dec_and_test(&rmpp_recv->refcount))
|
||||
wake_up(&rmpp_recv->wait);
|
||||
}
|
||||
|
||||
static struct mad_rmpp_recv *
|
||||
find_rmpp_recv(struct ib_mad_agent_private *agent,
|
||||
struct ib_mad_recv_wc *mad_recv_wc)
|
||||
|
|
|
@ -336,7 +336,7 @@ static ssize_t show_pma_counter(struct ib_port *p, struct port_attribute *attr,
|
|||
switch (width) {
|
||||
case 4:
|
||||
ret = sprintf(buf, "%u\n", (out_mad->data[40 + offset / 8] >>
|
||||
(offset % 4)) & 0xf);
|
||||
(4 - (offset % 8))) & 0xf);
|
||||
break;
|
||||
case 8:
|
||||
ret = sprintf(buf, "%u\n", out_mad->data[40 + offset / 8]);
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
*
|
||||
* $Id: ucm.c 2594 2005-06-13 19:46:02Z libor $
|
||||
*/
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -72,7 +74,7 @@ struct ib_ucm_file {
|
|||
|
||||
struct ib_ucm_context {
|
||||
int id;
|
||||
wait_queue_head_t wait;
|
||||
struct completion comp;
|
||||
atomic_t ref;
|
||||
int events_reported;
|
||||
|
||||
|
@ -138,7 +140,7 @@ static struct ib_ucm_context *ib_ucm_ctx_get(struct ib_ucm_file *file, int id)
|
|||
static void ib_ucm_ctx_put(struct ib_ucm_context *ctx)
|
||||
{
|
||||
if (atomic_dec_and_test(&ctx->ref))
|
||||
wake_up(&ctx->wait);
|
||||
complete(&ctx->comp);
|
||||
}
|
||||
|
||||
static inline int ib_ucm_new_cm_id(int event)
|
||||
|
@ -178,7 +180,7 @@ static struct ib_ucm_context *ib_ucm_ctx_alloc(struct ib_ucm_file *file)
|
|||
return NULL;
|
||||
|
||||
atomic_set(&ctx->ref, 1);
|
||||
init_waitqueue_head(&ctx->wait);
|
||||
init_completion(&ctx->comp);
|
||||
ctx->file = file;
|
||||
INIT_LIST_HEAD(&ctx->events);
|
||||
|
||||
|
@ -586,8 +588,8 @@ static ssize_t ib_ucm_destroy_id(struct ib_ucm_file *file,
|
|||
if (IS_ERR(ctx))
|
||||
return PTR_ERR(ctx);
|
||||
|
||||
atomic_dec(&ctx->ref);
|
||||
wait_event(ctx->wait, !atomic_read(&ctx->ref));
|
||||
ib_ucm_ctx_put(ctx);
|
||||
wait_for_completion(&ctx->comp);
|
||||
|
||||
/* No new events will be generated after destroying the cm_id. */
|
||||
ib_destroy_cm_id(ctx->cm_id);
|
||||
|
|
|
@ -116,10 +116,9 @@ static int __devinit ipath_init_one(struct pci_dev *,
|
|||
#define PCI_DEVICE_ID_INFINIPATH_PE800 0x10
|
||||
|
||||
static const struct pci_device_id ipath_pci_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE,
|
||||
PCI_DEVICE_ID_INFINIPATH_HT)},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE,
|
||||
PCI_DEVICE_ID_INFINIPATH_PE800)},
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE, PCI_DEVICE_ID_INFINIPATH_HT) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_PATHSCALE, PCI_DEVICE_ID_INFINIPATH_PE800) },
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, ipath_pci_tbl);
|
||||
|
|
|
@ -238,9 +238,9 @@ void mthca_cq_event(struct mthca_dev *dev, u32 cqn,
|
|||
spin_lock(&dev->cq_table.lock);
|
||||
|
||||
cq = mthca_array_get(&dev->cq_table.cq, cqn & (dev->limits.num_cqs - 1));
|
||||
|
||||
if (cq)
|
||||
atomic_inc(&cq->refcount);
|
||||
++cq->refcount;
|
||||
|
||||
spin_unlock(&dev->cq_table.lock);
|
||||
|
||||
if (!cq) {
|
||||
|
@ -254,8 +254,10 @@ void mthca_cq_event(struct mthca_dev *dev, u32 cqn,
|
|||
if (cq->ibcq.event_handler)
|
||||
cq->ibcq.event_handler(&event, cq->ibcq.cq_context);
|
||||
|
||||
if (atomic_dec_and_test(&cq->refcount))
|
||||
spin_lock(&dev->cq_table.lock);
|
||||
if (!--cq->refcount)
|
||||
wake_up(&cq->wait);
|
||||
spin_unlock(&dev->cq_table.lock);
|
||||
}
|
||||
|
||||
static inline int is_recv_cqe(struct mthca_cqe *cqe)
|
||||
|
@ -267,23 +269,13 @@ static inline int is_recv_cqe(struct mthca_cqe *cqe)
|
|||
return !(cqe->is_send & 0x80);
|
||||
}
|
||||
|
||||
void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn,
|
||||
void mthca_cq_clean(struct mthca_dev *dev, struct mthca_cq *cq, u32 qpn,
|
||||
struct mthca_srq *srq)
|
||||
{
|
||||
struct mthca_cq *cq;
|
||||
struct mthca_cqe *cqe;
|
||||
u32 prod_index;
|
||||
int nfreed = 0;
|
||||
|
||||
spin_lock_irq(&dev->cq_table.lock);
|
||||
cq = mthca_array_get(&dev->cq_table.cq, cqn & (dev->limits.num_cqs - 1));
|
||||
if (cq)
|
||||
atomic_inc(&cq->refcount);
|
||||
spin_unlock_irq(&dev->cq_table.lock);
|
||||
|
||||
if (!cq)
|
||||
return;
|
||||
|
||||
spin_lock_irq(&cq->lock);
|
||||
|
||||
/*
|
||||
|
@ -301,7 +293,7 @@ void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn,
|
|||
|
||||
if (0)
|
||||
mthca_dbg(dev, "Cleaning QPN %06x from CQN %06x; ci %d, pi %d\n",
|
||||
qpn, cqn, cq->cons_index, prod_index);
|
||||
qpn, cq->cqn, cq->cons_index, prod_index);
|
||||
|
||||
/*
|
||||
* Now sweep backwards through the CQ, removing CQ entries
|
||||
|
@ -325,8 +317,6 @@ void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn,
|
|||
}
|
||||
|
||||
spin_unlock_irq(&cq->lock);
|
||||
if (atomic_dec_and_test(&cq->refcount))
|
||||
wake_up(&cq->wait);
|
||||
}
|
||||
|
||||
void mthca_cq_resize_copy_cqes(struct mthca_cq *cq)
|
||||
|
@ -821,7 +811,7 @@ int mthca_init_cq(struct mthca_dev *dev, int nent,
|
|||
}
|
||||
|
||||
spin_lock_init(&cq->lock);
|
||||
atomic_set(&cq->refcount, 1);
|
||||
cq->refcount = 1;
|
||||
init_waitqueue_head(&cq->wait);
|
||||
|
||||
memset(cq_context, 0, sizeof *cq_context);
|
||||
|
@ -896,6 +886,17 @@ err_out:
|
|||
return err;
|
||||
}
|
||||
|
||||
static inline int get_cq_refcount(struct mthca_dev *dev, struct mthca_cq *cq)
|
||||
{
|
||||
int c;
|
||||
|
||||
spin_lock_irq(&dev->cq_table.lock);
|
||||
c = cq->refcount;
|
||||
spin_unlock_irq(&dev->cq_table.lock);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
void mthca_free_cq(struct mthca_dev *dev,
|
||||
struct mthca_cq *cq)
|
||||
{
|
||||
|
@ -929,6 +930,7 @@ void mthca_free_cq(struct mthca_dev *dev,
|
|||
spin_lock_irq(&dev->cq_table.lock);
|
||||
mthca_array_clear(&dev->cq_table.cq,
|
||||
cq->cqn & (dev->limits.num_cqs - 1));
|
||||
--cq->refcount;
|
||||
spin_unlock_irq(&dev->cq_table.lock);
|
||||
|
||||
if (dev->mthca_flags & MTHCA_FLAG_MSI_X)
|
||||
|
@ -936,8 +938,7 @@ void mthca_free_cq(struct mthca_dev *dev,
|
|||
else
|
||||
synchronize_irq(dev->pdev->irq);
|
||||
|
||||
atomic_dec(&cq->refcount);
|
||||
wait_event(cq->wait, !atomic_read(&cq->refcount));
|
||||
wait_event(cq->wait, !get_cq_refcount(dev, cq));
|
||||
|
||||
if (cq->is_kernel) {
|
||||
mthca_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe);
|
||||
|
|
|
@ -496,7 +496,7 @@ void mthca_free_cq(struct mthca_dev *dev,
|
|||
void mthca_cq_completion(struct mthca_dev *dev, u32 cqn);
|
||||
void mthca_cq_event(struct mthca_dev *dev, u32 cqn,
|
||||
enum ib_event_type event_type);
|
||||
void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn,
|
||||
void mthca_cq_clean(struct mthca_dev *dev, struct mthca_cq *cq, u32 qpn,
|
||||
struct mthca_srq *srq);
|
||||
void mthca_cq_resize_copy_cqes(struct mthca_cq *cq);
|
||||
int mthca_alloc_cq_buf(struct mthca_dev *dev, struct mthca_cq_buf *buf, int nent);
|
||||
|
|
|
@ -761,6 +761,7 @@ void mthca_arbel_fmr_unmap(struct mthca_dev *dev, struct mthca_fmr *fmr)
|
|||
|
||||
int __devinit mthca_init_mr_table(struct mthca_dev *dev)
|
||||
{
|
||||
unsigned long addr;
|
||||
int err, i;
|
||||
|
||||
err = mthca_alloc_init(&dev->mr_table.mpt_alloc,
|
||||
|
@ -796,9 +797,12 @@ int __devinit mthca_init_mr_table(struct mthca_dev *dev)
|
|||
goto err_fmr_mpt;
|
||||
}
|
||||
|
||||
addr = pci_resource_start(dev->pdev, 4) +
|
||||
((pci_resource_len(dev->pdev, 4) - 1) &
|
||||
dev->mr_table.mpt_base);
|
||||
|
||||
dev->mr_table.tavor_fmr.mpt_base =
|
||||
ioremap(dev->mr_table.mpt_base,
|
||||
(1 << i) * sizeof (struct mthca_mpt_entry));
|
||||
ioremap(addr, (1 << i) * sizeof(struct mthca_mpt_entry));
|
||||
|
||||
if (!dev->mr_table.tavor_fmr.mpt_base) {
|
||||
mthca_warn(dev, "MPT ioremap for FMR failed.\n");
|
||||
|
@ -806,9 +810,12 @@ int __devinit mthca_init_mr_table(struct mthca_dev *dev)
|
|||
goto err_fmr_mpt;
|
||||
}
|
||||
|
||||
addr = pci_resource_start(dev->pdev, 4) +
|
||||
((pci_resource_len(dev->pdev, 4) - 1) &
|
||||
dev->mr_table.mtt_base);
|
||||
|
||||
dev->mr_table.tavor_fmr.mtt_base =
|
||||
ioremap(dev->mr_table.mtt_base,
|
||||
(1 << i) * MTHCA_MTT_SEG_SIZE);
|
||||
ioremap(addr, (1 << i) * MTHCA_MTT_SEG_SIZE);
|
||||
if (!dev->mr_table.tavor_fmr.mtt_base) {
|
||||
mthca_warn(dev, "MTT ioremap for FMR failed.\n");
|
||||
err = -ENOMEM;
|
||||
|
|
|
@ -139,11 +139,12 @@ struct mthca_ah {
|
|||
* a qp may be locked, with the send cq locked first. No other
|
||||
* nesting should be done.
|
||||
*
|
||||
* Each struct mthca_cq/qp also has an atomic_t ref count. The
|
||||
* pointer from the cq/qp_table to the struct counts as one reference.
|
||||
* This reference also is good for access through the consumer API, so
|
||||
* modifying the CQ/QP etc doesn't need to take another reference.
|
||||
* Access because of a completion being polled does need a reference.
|
||||
* Each struct mthca_cq/qp also has an ref count, protected by the
|
||||
* corresponding table lock. The pointer from the cq/qp_table to the
|
||||
* struct counts as one reference. This reference also is good for
|
||||
* access through the consumer API, so modifying the CQ/QP etc doesn't
|
||||
* need to take another reference. Access to a QP because of a
|
||||
* completion being polled does not need a reference either.
|
||||
*
|
||||
* Finally, each struct mthca_cq/qp has a wait_queue_head_t for the
|
||||
* destroy function to sleep on.
|
||||
|
@ -159,8 +160,9 @@ struct mthca_ah {
|
|||
* - decrement ref count; if zero, wake up waiters
|
||||
*
|
||||
* To destroy a CQ/QP, we can do the following:
|
||||
* - lock cq/qp_table, remove pointer, unlock cq/qp_table lock
|
||||
* - decrement ref count
|
||||
* - lock cq/qp_table
|
||||
* - remove pointer and decrement ref count
|
||||
* - unlock cq/qp_table lock
|
||||
* - wait_event until ref count is zero
|
||||
*
|
||||
* It is the consumer's responsibilty to make sure that no QP
|
||||
|
@ -197,7 +199,7 @@ struct mthca_cq_resize {
|
|||
struct mthca_cq {
|
||||
struct ib_cq ibcq;
|
||||
spinlock_t lock;
|
||||
atomic_t refcount;
|
||||
int refcount;
|
||||
int cqn;
|
||||
u32 cons_index;
|
||||
struct mthca_cq_buf buf;
|
||||
|
@ -217,7 +219,7 @@ struct mthca_cq {
|
|||
struct mthca_srq {
|
||||
struct ib_srq ibsrq;
|
||||
spinlock_t lock;
|
||||
atomic_t refcount;
|
||||
int refcount;
|
||||
int srqn;
|
||||
int max;
|
||||
int max_gs;
|
||||
|
@ -254,7 +256,7 @@ struct mthca_wq {
|
|||
|
||||
struct mthca_qp {
|
||||
struct ib_qp ibqp;
|
||||
atomic_t refcount;
|
||||
int refcount;
|
||||
u32 qpn;
|
||||
int is_direct;
|
||||
u8 port; /* for SQP and memfree use only */
|
||||
|
|
|
@ -240,7 +240,7 @@ void mthca_qp_event(struct mthca_dev *dev, u32 qpn,
|
|||
spin_lock(&dev->qp_table.lock);
|
||||
qp = mthca_array_get(&dev->qp_table.qp, qpn & (dev->limits.num_qps - 1));
|
||||
if (qp)
|
||||
atomic_inc(&qp->refcount);
|
||||
++qp->refcount;
|
||||
spin_unlock(&dev->qp_table.lock);
|
||||
|
||||
if (!qp) {
|
||||
|
@ -257,8 +257,10 @@ void mthca_qp_event(struct mthca_dev *dev, u32 qpn,
|
|||
if (qp->ibqp.event_handler)
|
||||
qp->ibqp.event_handler(&event, qp->ibqp.qp_context);
|
||||
|
||||
if (atomic_dec_and_test(&qp->refcount))
|
||||
spin_lock(&dev->qp_table.lock);
|
||||
if (!--qp->refcount)
|
||||
wake_up(&qp->wait);
|
||||
spin_unlock(&dev->qp_table.lock);
|
||||
}
|
||||
|
||||
static int to_mthca_state(enum ib_qp_state ib_state)
|
||||
|
@ -833,10 +835,10 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask)
|
|||
* entries and reinitialize the QP.
|
||||
*/
|
||||
if (new_state == IB_QPS_RESET && !qp->ibqp.uobject) {
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.send_cq)->cqn, qp->qpn,
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.send_cq), qp->qpn,
|
||||
qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
|
||||
if (qp->ibqp.send_cq != qp->ibqp.recv_cq)
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq)->cqn, qp->qpn,
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq), qp->qpn,
|
||||
qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
|
||||
|
||||
mthca_wq_init(&qp->sq);
|
||||
|
@ -1096,7 +1098,7 @@ static int mthca_alloc_qp_common(struct mthca_dev *dev,
|
|||
int ret;
|
||||
int i;
|
||||
|
||||
atomic_set(&qp->refcount, 1);
|
||||
qp->refcount = 1;
|
||||
init_waitqueue_head(&qp->wait);
|
||||
qp->state = IB_QPS_RESET;
|
||||
qp->atomic_rd_en = 0;
|
||||
|
@ -1318,6 +1320,17 @@ int mthca_alloc_sqp(struct mthca_dev *dev,
|
|||
return err;
|
||||
}
|
||||
|
||||
static inline int get_qp_refcount(struct mthca_dev *dev, struct mthca_qp *qp)
|
||||
{
|
||||
int c;
|
||||
|
||||
spin_lock_irq(&dev->qp_table.lock);
|
||||
c = qp->refcount;
|
||||
spin_unlock_irq(&dev->qp_table.lock);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
void mthca_free_qp(struct mthca_dev *dev,
|
||||
struct mthca_qp *qp)
|
||||
{
|
||||
|
@ -1339,14 +1352,14 @@ void mthca_free_qp(struct mthca_dev *dev,
|
|||
spin_lock(&dev->qp_table.lock);
|
||||
mthca_array_clear(&dev->qp_table.qp,
|
||||
qp->qpn & (dev->limits.num_qps - 1));
|
||||
--qp->refcount;
|
||||
spin_unlock(&dev->qp_table.lock);
|
||||
|
||||
if (send_cq != recv_cq)
|
||||
spin_unlock(&recv_cq->lock);
|
||||
spin_unlock_irq(&send_cq->lock);
|
||||
|
||||
atomic_dec(&qp->refcount);
|
||||
wait_event(qp->wait, !atomic_read(&qp->refcount));
|
||||
wait_event(qp->wait, !get_qp_refcount(dev, qp));
|
||||
|
||||
if (qp->state != IB_QPS_RESET)
|
||||
mthca_MODIFY_QP(dev, qp->state, IB_QPS_RESET, qp->qpn, 0,
|
||||
|
@ -1358,10 +1371,10 @@ void mthca_free_qp(struct mthca_dev *dev,
|
|||
* unref the mem-free tables and free the QPN in our table.
|
||||
*/
|
||||
if (!qp->ibqp.uobject) {
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.send_cq)->cqn, qp->qpn,
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.send_cq), qp->qpn,
|
||||
qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
|
||||
if (qp->ibqp.send_cq != qp->ibqp.recv_cq)
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq)->cqn, qp->qpn,
|
||||
mthca_cq_clean(dev, to_mcq(qp->ibqp.recv_cq), qp->qpn,
|
||||
qp->ibqp.srq ? to_msrq(qp->ibqp.srq) : NULL);
|
||||
|
||||
mthca_free_memfree(dev, qp);
|
||||
|
|
|
@ -241,7 +241,7 @@ int mthca_alloc_srq(struct mthca_dev *dev, struct mthca_pd *pd,
|
|||
goto err_out_mailbox;
|
||||
|
||||
spin_lock_init(&srq->lock);
|
||||
atomic_set(&srq->refcount, 1);
|
||||
srq->refcount = 1;
|
||||
init_waitqueue_head(&srq->wait);
|
||||
|
||||
if (mthca_is_memfree(dev))
|
||||
|
@ -308,6 +308,17 @@ err_out:
|
|||
return err;
|
||||
}
|
||||
|
||||
static inline int get_srq_refcount(struct mthca_dev *dev, struct mthca_srq *srq)
|
||||
{
|
||||
int c;
|
||||
|
||||
spin_lock_irq(&dev->srq_table.lock);
|
||||
c = srq->refcount;
|
||||
spin_unlock_irq(&dev->srq_table.lock);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
void mthca_free_srq(struct mthca_dev *dev, struct mthca_srq *srq)
|
||||
{
|
||||
struct mthca_mailbox *mailbox;
|
||||
|
@ -329,10 +340,10 @@ void mthca_free_srq(struct mthca_dev *dev, struct mthca_srq *srq)
|
|||
spin_lock_irq(&dev->srq_table.lock);
|
||||
mthca_array_clear(&dev->srq_table.srq,
|
||||
srq->srqn & (dev->limits.num_srqs - 1));
|
||||
--srq->refcount;
|
||||
spin_unlock_irq(&dev->srq_table.lock);
|
||||
|
||||
atomic_dec(&srq->refcount);
|
||||
wait_event(srq->wait, !atomic_read(&srq->refcount));
|
||||
wait_event(srq->wait, !get_srq_refcount(dev, srq));
|
||||
|
||||
if (!srq->ibsrq.uobject) {
|
||||
mthca_free_srq_buf(dev, srq);
|
||||
|
@ -414,7 +425,7 @@ void mthca_srq_event(struct mthca_dev *dev, u32 srqn,
|
|||
spin_lock(&dev->srq_table.lock);
|
||||
srq = mthca_array_get(&dev->srq_table.srq, srqn & (dev->limits.num_srqs - 1));
|
||||
if (srq)
|
||||
atomic_inc(&srq->refcount);
|
||||
++srq->refcount;
|
||||
spin_unlock(&dev->srq_table.lock);
|
||||
|
||||
if (!srq) {
|
||||
|
@ -431,8 +442,10 @@ void mthca_srq_event(struct mthca_dev *dev, u32 srqn,
|
|||
srq->ibsrq.event_handler(&event, srq->ibsrq.srq_context);
|
||||
|
||||
out:
|
||||
if (atomic_dec_and_test(&srq->refcount))
|
||||
spin_lock(&dev->srq_table.lock);
|
||||
if (!--srq->refcount)
|
||||
wake_up(&srq->wait);
|
||||
spin_unlock(&dev->srq_table.lock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -158,10 +158,8 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey)
|
|||
if (priv->pkey == pkey) {
|
||||
unregister_netdev(priv->dev);
|
||||
ipoib_dev_cleanup(priv->dev);
|
||||
|
||||
list_del(&priv->list);
|
||||
|
||||
kfree(priv);
|
||||
free_netdev(priv->dev);
|
||||
|
||||
ret = 0;
|
||||
break;
|
||||
|
|
|
@ -409,6 +409,34 @@ static int srp_connect_target(struct srp_target_port *target)
|
|||
}
|
||||
}
|
||||
|
||||
static void srp_unmap_data(struct scsi_cmnd *scmnd,
|
||||
struct srp_target_port *target,
|
||||
struct srp_request *req)
|
||||
{
|
||||
struct scatterlist *scat;
|
||||
int nents;
|
||||
|
||||
if (!scmnd->request_buffer ||
|
||||
(scmnd->sc_data_direction != DMA_TO_DEVICE &&
|
||||
scmnd->sc_data_direction != DMA_FROM_DEVICE))
|
||||
return;
|
||||
|
||||
/*
|
||||
* This handling of non-SG commands can be killed when the
|
||||
* SCSI midlayer no longer generates non-SG commands.
|
||||
*/
|
||||
if (likely(scmnd->use_sg)) {
|
||||
nents = scmnd->use_sg;
|
||||
scat = scmnd->request_buffer;
|
||||
} else {
|
||||
nents = 1;
|
||||
scat = &req->fake_sg;
|
||||
}
|
||||
|
||||
dma_unmap_sg(target->srp_host->dev->dma_device, scat, nents,
|
||||
scmnd->sc_data_direction);
|
||||
}
|
||||
|
||||
static int srp_reconnect_target(struct srp_target_port *target)
|
||||
{
|
||||
struct ib_cm_id *new_cm_id;
|
||||
|
@ -455,16 +483,16 @@ static int srp_reconnect_target(struct srp_target_port *target)
|
|||
list_for_each_entry(req, &target->req_queue, list) {
|
||||
req->scmnd->result = DID_RESET << 16;
|
||||
req->scmnd->scsi_done(req->scmnd);
|
||||
srp_unmap_data(req->scmnd, target, req);
|
||||
}
|
||||
|
||||
target->rx_head = 0;
|
||||
target->tx_head = 0;
|
||||
target->tx_tail = 0;
|
||||
target->req_head = 0;
|
||||
for (i = 0; i < SRP_SQ_SIZE - 1; ++i)
|
||||
target->req_ring[i].next = i + 1;
|
||||
target->req_ring[SRP_SQ_SIZE - 1].next = -1;
|
||||
INIT_LIST_HEAD(&target->free_reqs);
|
||||
INIT_LIST_HEAD(&target->req_queue);
|
||||
for (i = 0; i < SRP_SQ_SIZE; ++i)
|
||||
list_add_tail(&target->req_ring[i].list, &target->free_reqs);
|
||||
|
||||
ret = srp_connect_target(target);
|
||||
if (ret)
|
||||
|
@ -589,40 +617,10 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target,
|
|||
return len;
|
||||
}
|
||||
|
||||
static void srp_unmap_data(struct scsi_cmnd *scmnd,
|
||||
struct srp_target_port *target,
|
||||
struct srp_request *req)
|
||||
static void srp_remove_req(struct srp_target_port *target, struct srp_request *req)
|
||||
{
|
||||
struct scatterlist *scat;
|
||||
int nents;
|
||||
|
||||
if (!scmnd->request_buffer ||
|
||||
(scmnd->sc_data_direction != DMA_TO_DEVICE &&
|
||||
scmnd->sc_data_direction != DMA_FROM_DEVICE))
|
||||
return;
|
||||
|
||||
/*
|
||||
* This handling of non-SG commands can be killed when the
|
||||
* SCSI midlayer no longer generates non-SG commands.
|
||||
*/
|
||||
if (likely(scmnd->use_sg)) {
|
||||
nents = scmnd->use_sg;
|
||||
scat = scmnd->request_buffer;
|
||||
} else {
|
||||
nents = 1;
|
||||
scat = &req->fake_sg;
|
||||
}
|
||||
|
||||
dma_unmap_sg(target->srp_host->dev->dma_device, scat, nents,
|
||||
scmnd->sc_data_direction);
|
||||
}
|
||||
|
||||
static void srp_remove_req(struct srp_target_port *target, struct srp_request *req,
|
||||
int index)
|
||||
{
|
||||
list_del(&req->list);
|
||||
req->next = target->req_head;
|
||||
target->req_head = index;
|
||||
srp_unmap_data(req->scmnd, target, req);
|
||||
list_move_tail(&req->list, &target->free_reqs);
|
||||
}
|
||||
|
||||
static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
|
||||
|
@ -647,7 +645,7 @@ static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
|
|||
req->tsk_status = rsp->data[3];
|
||||
complete(&req->done);
|
||||
} else {
|
||||
scmnd = req->scmnd;
|
||||
scmnd = req->scmnd;
|
||||
if (!scmnd)
|
||||
printk(KERN_ERR "Null scmnd for RSP w/tag %016llx\n",
|
||||
(unsigned long long) rsp->tag);
|
||||
|
@ -665,14 +663,11 @@ static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
|
|||
else if (rsp->flags & (SRP_RSP_FLAG_DIOVER | SRP_RSP_FLAG_DIUNDER))
|
||||
scmnd->resid = be32_to_cpu(rsp->data_in_res_cnt);
|
||||
|
||||
srp_unmap_data(scmnd, target, req);
|
||||
|
||||
if (!req->tsk_mgmt) {
|
||||
req->scmnd = NULL;
|
||||
scmnd->host_scribble = (void *) -1L;
|
||||
scmnd->scsi_done(scmnd);
|
||||
|
||||
srp_remove_req(target, req, rsp->tag & ~SRP_TAG_TSK_MGMT);
|
||||
srp_remove_req(target, req);
|
||||
} else
|
||||
req->cmd_done = 1;
|
||||
}
|
||||
|
@ -859,7 +854,6 @@ static int srp_queuecommand(struct scsi_cmnd *scmnd,
|
|||
struct srp_request *req;
|
||||
struct srp_iu *iu;
|
||||
struct srp_cmd *cmd;
|
||||
long req_index;
|
||||
int len;
|
||||
|
||||
if (target->state == SRP_TARGET_CONNECTING)
|
||||
|
@ -879,22 +873,20 @@ static int srp_queuecommand(struct scsi_cmnd *scmnd,
|
|||
dma_sync_single_for_cpu(target->srp_host->dev->dma_device, iu->dma,
|
||||
SRP_MAX_IU_LEN, DMA_TO_DEVICE);
|
||||
|
||||
req_index = target->req_head;
|
||||
req = list_entry(target->free_reqs.next, struct srp_request, list);
|
||||
|
||||
scmnd->scsi_done = done;
|
||||
scmnd->result = 0;
|
||||
scmnd->host_scribble = (void *) req_index;
|
||||
scmnd->host_scribble = (void *) (long) req->index;
|
||||
|
||||
cmd = iu->buf;
|
||||
memset(cmd, 0, sizeof *cmd);
|
||||
|
||||
cmd->opcode = SRP_CMD;
|
||||
cmd->lun = cpu_to_be64((u64) scmnd->device->lun << 48);
|
||||
cmd->tag = req_index;
|
||||
cmd->tag = req->index;
|
||||
memcpy(cmd->cdb, scmnd->cmnd, scmnd->cmd_len);
|
||||
|
||||
req = &target->req_ring[req_index];
|
||||
|
||||
req->scmnd = scmnd;
|
||||
req->cmd = iu;
|
||||
req->cmd_done = 0;
|
||||
|
@ -919,8 +911,7 @@ static int srp_queuecommand(struct scsi_cmnd *scmnd,
|
|||
goto err_unmap;
|
||||
}
|
||||
|
||||
target->req_head = req->next;
|
||||
list_add_tail(&req->list, &target->req_queue);
|
||||
list_move_tail(&req->list, &target->req_queue);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1143,30 +1134,20 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int srp_send_tsk_mgmt(struct scsi_cmnd *scmnd, u8 func)
|
||||
static int srp_send_tsk_mgmt(struct srp_target_port *target,
|
||||
struct srp_request *req, u8 func)
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(scmnd->device->host);
|
||||
struct srp_request *req;
|
||||
struct srp_iu *iu;
|
||||
struct srp_tsk_mgmt *tsk_mgmt;
|
||||
int req_index;
|
||||
int ret = FAILED;
|
||||
|
||||
spin_lock_irq(target->scsi_host->host_lock);
|
||||
|
||||
if (target->state == SRP_TARGET_DEAD ||
|
||||
target->state == SRP_TARGET_REMOVED) {
|
||||
scmnd->result = DID_BAD_TARGET << 16;
|
||||
req->scmnd->result = DID_BAD_TARGET << 16;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (scmnd->host_scribble == (void *) -1L)
|
||||
goto out;
|
||||
|
||||
req_index = (long) scmnd->host_scribble;
|
||||
printk(KERN_ERR "Abort for req_index %d\n", req_index);
|
||||
|
||||
req = &target->req_ring[req_index];
|
||||
init_completion(&req->done);
|
||||
|
||||
iu = __srp_get_tx_iu(target);
|
||||
|
@ -1177,10 +1158,10 @@ static int srp_send_tsk_mgmt(struct scsi_cmnd *scmnd, u8 func)
|
|||
memset(tsk_mgmt, 0, sizeof *tsk_mgmt);
|
||||
|
||||
tsk_mgmt->opcode = SRP_TSK_MGMT;
|
||||
tsk_mgmt->lun = cpu_to_be64((u64) scmnd->device->lun << 48);
|
||||
tsk_mgmt->tag = req_index | SRP_TAG_TSK_MGMT;
|
||||
tsk_mgmt->lun = cpu_to_be64((u64) req->scmnd->device->lun << 48);
|
||||
tsk_mgmt->tag = req->index | SRP_TAG_TSK_MGMT;
|
||||
tsk_mgmt->tsk_mgmt_func = func;
|
||||
tsk_mgmt->task_tag = req_index;
|
||||
tsk_mgmt->task_tag = req->index;
|
||||
|
||||
if (__srp_post_send(target, iu, sizeof *tsk_mgmt))
|
||||
goto out;
|
||||
|
@ -1188,37 +1169,85 @@ static int srp_send_tsk_mgmt(struct scsi_cmnd *scmnd, u8 func)
|
|||
req->tsk_mgmt = iu;
|
||||
|
||||
spin_unlock_irq(target->scsi_host->host_lock);
|
||||
|
||||
if (!wait_for_completion_timeout(&req->done,
|
||||
msecs_to_jiffies(SRP_ABORT_TIMEOUT_MS)))
|
||||
return FAILED;
|
||||
spin_lock_irq(target->scsi_host->host_lock);
|
||||
return -1;
|
||||
|
||||
if (req->cmd_done) {
|
||||
srp_remove_req(target, req, req_index);
|
||||
scmnd->scsi_done(scmnd);
|
||||
} else if (!req->tsk_status) {
|
||||
srp_remove_req(target, req, req_index);
|
||||
scmnd->result = DID_ABORT << 16;
|
||||
ret = SUCCESS;
|
||||
}
|
||||
return 0;
|
||||
|
||||
out:
|
||||
spin_unlock_irq(target->scsi_host->host_lock);
|
||||
return ret;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int srp_find_req(struct srp_target_port *target,
|
||||
struct scsi_cmnd *scmnd,
|
||||
struct srp_request **req)
|
||||
{
|
||||
if (scmnd->host_scribble == (void *) -1L)
|
||||
return -1;
|
||||
|
||||
*req = &target->req_ring[(long) scmnd->host_scribble];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int srp_abort(struct scsi_cmnd *scmnd)
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(scmnd->device->host);
|
||||
struct srp_request *req;
|
||||
int ret = SUCCESS;
|
||||
|
||||
printk(KERN_ERR "SRP abort called\n");
|
||||
|
||||
return srp_send_tsk_mgmt(scmnd, SRP_TSK_ABORT_TASK);
|
||||
if (srp_find_req(target, scmnd, &req))
|
||||
return FAILED;
|
||||
if (srp_send_tsk_mgmt(target, req, SRP_TSK_ABORT_TASK))
|
||||
return FAILED;
|
||||
|
||||
spin_lock_irq(target->scsi_host->host_lock);
|
||||
|
||||
if (req->cmd_done) {
|
||||
srp_remove_req(target, req);
|
||||
scmnd->scsi_done(scmnd);
|
||||
} else if (!req->tsk_status) {
|
||||
srp_remove_req(target, req);
|
||||
scmnd->result = DID_ABORT << 16;
|
||||
} else
|
||||
ret = FAILED;
|
||||
|
||||
spin_unlock_irq(target->scsi_host->host_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int srp_reset_device(struct scsi_cmnd *scmnd)
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(scmnd->device->host);
|
||||
struct srp_request *req, *tmp;
|
||||
|
||||
printk(KERN_ERR "SRP reset_device called\n");
|
||||
|
||||
return srp_send_tsk_mgmt(scmnd, SRP_TSK_LUN_RESET);
|
||||
if (srp_find_req(target, scmnd, &req))
|
||||
return FAILED;
|
||||
if (srp_send_tsk_mgmt(target, req, SRP_TSK_LUN_RESET))
|
||||
return FAILED;
|
||||
if (req->tsk_status)
|
||||
return FAILED;
|
||||
|
||||
spin_lock_irq(target->scsi_host->host_lock);
|
||||
|
||||
list_for_each_entry_safe(req, tmp, &target->req_queue, list)
|
||||
if (req->scmnd->device == scmnd->device) {
|
||||
req->scmnd->result = DID_RESET << 16;
|
||||
scmnd->scsi_done(scmnd);
|
||||
srp_remove_req(target, req);
|
||||
}
|
||||
|
||||
spin_unlock_irq(target->scsi_host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int srp_reset_host(struct scsi_cmnd *scmnd)
|
||||
|
@ -1518,10 +1547,12 @@ static ssize_t srp_create_target(struct class_device *class_dev,
|
|||
|
||||
INIT_WORK(&target->work, srp_reconnect_work, target);
|
||||
|
||||
for (i = 0; i < SRP_SQ_SIZE - 1; ++i)
|
||||
target->req_ring[i].next = i + 1;
|
||||
target->req_ring[SRP_SQ_SIZE - 1].next = -1;
|
||||
INIT_LIST_HEAD(&target->free_reqs);
|
||||
INIT_LIST_HEAD(&target->req_queue);
|
||||
for (i = 0; i < SRP_SQ_SIZE; ++i) {
|
||||
target->req_ring[i].index = i;
|
||||
list_add_tail(&target->req_ring[i].list, &target->free_reqs);
|
||||
}
|
||||
|
||||
ret = srp_parse_options(buf, target);
|
||||
if (ret)
|
||||
|
|
|
@ -101,7 +101,7 @@ struct srp_request {
|
|||
*/
|
||||
struct scatterlist fake_sg;
|
||||
struct completion done;
|
||||
short next;
|
||||
short index;
|
||||
u8 cmd_done;
|
||||
u8 tsk_status;
|
||||
};
|
||||
|
@ -133,7 +133,7 @@ struct srp_target_port {
|
|||
unsigned tx_tail;
|
||||
struct srp_iu *tx_ring[SRP_SQ_SIZE + 1];
|
||||
|
||||
int req_head;
|
||||
struct list_head free_reqs;
|
||||
struct list_head req_queue;
|
||||
struct srp_request req_ring[SRP_SQ_SIZE];
|
||||
|
||||
|
|
|
@ -1499,7 +1499,6 @@ static int __init capi_init(void)
|
|||
printk(KERN_ERR "capi20: unable to get major %d\n", capi_major);
|
||||
return major_ret;
|
||||
}
|
||||
capi_major = major_ret;
|
||||
capi_class = class_create(THIS_MODULE, "capi");
|
||||
if (IS_ERR(capi_class)) {
|
||||
unregister_chrdev(capi_major, "capi20");
|
||||
|
|
|
@ -710,8 +710,8 @@ static int gigaset_probe(struct usb_interface *interface,
|
|||
retval = -ENODEV; //FIXME
|
||||
|
||||
/* See if the device offered us matches what we can accept */
|
||||
if ((le16_to_cpu(udev->descriptor.idVendor != USB_M105_VENDOR_ID)) ||
|
||||
(le16_to_cpu(udev->descriptor.idProduct != USB_M105_PRODUCT_ID)))
|
||||
if ((le16_to_cpu(udev->descriptor.idVendor) != USB_M105_VENDOR_ID) ||
|
||||
(le16_to_cpu(udev->descriptor.idProduct) != USB_M105_PRODUCT_ID))
|
||||
return -ENODEV;
|
||||
|
||||
/* this starts to become ascii art... */
|
||||
|
|
|
@ -4,8 +4,11 @@ menu "LED devices"
|
|||
config NEW_LEDS
|
||||
bool "LED Support"
|
||||
help
|
||||
Say Y to enable Linux LED support. This is not related to standard
|
||||
keyboard LEDs which are controlled via the input system.
|
||||
Say Y to enable Linux LED support. This allows control of supported
|
||||
LEDs from both userspace and optionally, by kernel events (triggers).
|
||||
|
||||
This is not related to standard keyboard LEDs which are controlled
|
||||
via the input system.
|
||||
|
||||
config LEDS_CLASS
|
||||
tristate "LED Class Support"
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/sysdev.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/leds.h>
|
||||
#include "leds.h"
|
||||
|
||||
|
@ -43,9 +44,13 @@ static ssize_t led_brightness_store(struct class_device *dev,
|
|||
ssize_t ret = -EINVAL;
|
||||
char *after;
|
||||
unsigned long state = simple_strtoul(buf, &after, 10);
|
||||
size_t count = after - buf;
|
||||
|
||||
if (after - buf > 0) {
|
||||
ret = after - buf;
|
||||
if (*after && isspace(*after))
|
||||
count++;
|
||||
|
||||
if (count == size) {
|
||||
ret = count;
|
||||
led_set_brightness(led_cdev, state);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/leds.h>
|
||||
#include "leds.h"
|
||||
|
||||
|
@ -69,11 +70,15 @@ static ssize_t led_delay_on_store(struct class_device *dev, const char *buf,
|
|||
int ret = -EINVAL;
|
||||
char *after;
|
||||
unsigned long state = simple_strtoul(buf, &after, 10);
|
||||
size_t count = after - buf;
|
||||
|
||||
if (after - buf > 0) {
|
||||
if (*after && isspace(*after))
|
||||
count++;
|
||||
|
||||
if (count == size) {
|
||||
timer_data->delay_on = state;
|
||||
mod_timer(&timer_data->timer, jiffies + 1);
|
||||
ret = after - buf;
|
||||
ret = count;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -97,11 +102,15 @@ static ssize_t led_delay_off_store(struct class_device *dev, const char *buf,
|
|||
int ret = -EINVAL;
|
||||
char *after;
|
||||
unsigned long state = simple_strtoul(buf, &after, 10);
|
||||
size_t count = after - buf;
|
||||
|
||||
if (after - buf > 0) {
|
||||
if (*after && isspace(*after))
|
||||
count++;
|
||||
|
||||
if (count == size) {
|
||||
timer_data->delay_off = state;
|
||||
mod_timer(&timer_data->timer, jiffies + 1);
|
||||
ret = after - buf;
|
||||
ret = count;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -1189,7 +1189,6 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
ioc->diagPending = 0;
|
||||
spin_lock_init(&ioc->diagLock);
|
||||
spin_lock_init(&ioc->fc_rescan_work_lock);
|
||||
spin_lock_init(&ioc->fc_rport_lock);
|
||||
spin_lock_init(&ioc->initializing_hba_lock);
|
||||
|
||||
/* Initialize the event logging.
|
||||
|
@ -5736,11 +5735,13 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
return rc;
|
||||
}
|
||||
|
||||
# define EVENT_DESCR_STR_SZ 100
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
static void
|
||||
EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
||||
{
|
||||
char *ds;
|
||||
char *ds = NULL;
|
||||
|
||||
switch(event) {
|
||||
case MPI_EVENT_NONE:
|
||||
|
@ -5777,9 +5778,9 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
|||
if (evData0 == MPI_EVENT_LOOP_STATE_CHANGE_LIP)
|
||||
ds = "Loop State(LIP) Change";
|
||||
else if (evData0 == MPI_EVENT_LOOP_STATE_CHANGE_LPE)
|
||||
ds = "Loop State(LPE) Change"; /* ??? */
|
||||
ds = "Loop State(LPE) Change"; /* ??? */
|
||||
else
|
||||
ds = "Loop State(LPB) Change"; /* ??? */
|
||||
ds = "Loop State(LPB) Change"; /* ??? */
|
||||
break;
|
||||
case MPI_EVENT_LOGOUT:
|
||||
ds = "Logout";
|
||||
|
@ -5841,27 +5842,32 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
|||
break;
|
||||
case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
|
||||
{
|
||||
char buf[50];
|
||||
u8 id = (u8)(evData0);
|
||||
u8 ReasonCode = (u8)(evData0 >> 16);
|
||||
switch (ReasonCode) {
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
|
||||
sprintf(buf,"SAS Device Status Change: Added: id=%d", id);
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Added: id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
|
||||
sprintf(buf,"SAS Device Status Change: Deleted: id=%d", id);
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Deleted: id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
|
||||
sprintf(buf,"SAS Device Status Change: SMART Data: id=%d", id);
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: SMART Data: id=%d",
|
||||
id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
|
||||
sprintf(buf,"SAS Device Status Change: No Persistancy Added: id=%d", id);
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: No Persistancy "
|
||||
"Added: id=%d", id);
|
||||
break;
|
||||
default:
|
||||
sprintf(buf,"SAS Device Status Change: Unknown: id=%d", id);
|
||||
break;
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Unknown: id=%d", id);
|
||||
break;
|
||||
}
|
||||
ds = buf;
|
||||
break;
|
||||
}
|
||||
case MPI_EVENT_ON_BUS_TIMER_EXPIRED:
|
||||
|
@ -5878,41 +5884,46 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
|||
break;
|
||||
case MPI_EVENT_SAS_PHY_LINK_STATUS:
|
||||
{
|
||||
char buf[50];
|
||||
u8 LinkRates = (u8)(evData0 >> 8);
|
||||
u8 PhyNumber = (u8)(evData0);
|
||||
LinkRates = (LinkRates & MPI_EVENT_SAS_PLS_LR_CURRENT_MASK) >>
|
||||
MPI_EVENT_SAS_PLS_LR_CURRENT_SHIFT;
|
||||
switch (LinkRates) {
|
||||
case MPI_EVENT_SAS_PLS_LR_RATE_UNKNOWN:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d:"
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d:"
|
||||
" Rate Unknown",PhyNumber);
|
||||
break;
|
||||
case MPI_EVENT_SAS_PLS_LR_RATE_PHY_DISABLED:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d:"
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d:"
|
||||
" Phy Disabled",PhyNumber);
|
||||
break;
|
||||
case MPI_EVENT_SAS_PLS_LR_RATE_FAILED_SPEED_NEGOTIATION:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d:"
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d:"
|
||||
" Failed Speed Nego",PhyNumber);
|
||||
break;
|
||||
case MPI_EVENT_SAS_PLS_LR_RATE_SATA_OOB_COMPLETE:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d:"
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d:"
|
||||
" Sata OOB Completed",PhyNumber);
|
||||
break;
|
||||
case MPI_EVENT_SAS_PLS_LR_RATE_1_5:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d:"
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d:"
|
||||
" Rate 1.5 Gbps",PhyNumber);
|
||||
break;
|
||||
case MPI_EVENT_SAS_PLS_LR_RATE_3_0:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d:"
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d:"
|
||||
" Rate 3.0 Gpbs",PhyNumber);
|
||||
break;
|
||||
default:
|
||||
sprintf(buf,"SAS PHY Link Status: Phy=%d", PhyNumber);
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS PHY Link Status: Phy=%d", PhyNumber);
|
||||
break;
|
||||
}
|
||||
ds = buf;
|
||||
break;
|
||||
}
|
||||
case MPI_EVENT_SAS_DISCOVERY_ERROR:
|
||||
|
@ -5921,9 +5932,8 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
|||
case MPI_EVENT_IR_RESYNC_UPDATE:
|
||||
{
|
||||
u8 resync_complete = (u8)(evData0 >> 16);
|
||||
char buf[40];
|
||||
sprintf(buf,"IR Resync Update: Complete = %d:",resync_complete);
|
||||
ds = buf;
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"IR Resync Update: Complete = %d:",resync_complete);
|
||||
break;
|
||||
}
|
||||
case MPI_EVENT_IR2:
|
||||
|
@ -5976,7 +5986,8 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
|||
ds = "Unknown";
|
||||
break;
|
||||
}
|
||||
strcpy(evStr,ds);
|
||||
if (ds)
|
||||
strncpy(evStr, ds, EVENT_DESCR_STR_SZ);
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
@ -5998,7 +6009,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
|
|||
int ii;
|
||||
int r = 0;
|
||||
int handlers = 0;
|
||||
char evStr[100];
|
||||
char evStr[EVENT_DESCR_STR_SZ];
|
||||
u8 event;
|
||||
|
||||
/*
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue